# HG changeset patch # User Sebastien Jodogne # Date 1594131662 -7200 # Node ID 244ad1e4e76afc22d9fe9c13e0160edf80180974 # Parent 9dfeee74c1e6b552e4eb38caf9cf5d93330b393f reorganization of folders diff -r 9dfeee74c1e6 -r 244ad1e4e76a Docs/stone-object-model-reference.md --- a/Docs/stone-object-model-reference.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,429 +0,0 @@ -## Scene2D and viewport-related object reference - -### `Scene2D` - -Represents a collection of layers that display 2D data. - -These layers must implement `ISceneLayer` - -The layers must be created externally and set to a specific Z-order index -with the `SetLayer` method. - -The `Scene2D` object merely acts as a layer container. It has no rendering -or layer creation facility on its own. - -The `Scene2D` contains an `AffineTransform2D` structure that defines how -the various layer item coordinates are transformed before being displayed -on the viewport (aka canvas) - -It is up to each layer type-specific renderer to choose how this transformation -is used. See the various kinds of layer below for more details. - -Examining the `Scene2D` contents can be done either by implementing the -`Scene2D::IVisitor` interface and calling `Apply(IVisitor& visitor)` or by -iterating between `GetMinDepth()` and `GetMaxDepth()` and calling the -`ISceneLayer& GetLayer(int depth)` getter. - -### `ISceneLayer` - -Interface that must be implemented by `Scene2D` layers. This is a closed list -that, as of 2020-03, contains: - -``` - Type_InfoPanel, - Type_ColorTexture, - Type_Polyline, - Type_Text, - Type_FloatTexture, - Type_LookupTableTexture -``` - -Please note that this interface mandates the implementation of a `GetRevision` -method returning an `uint64_t`. - -The idea is that when a model gets converted to a set of `ISceneLayer` -instances, changes in the model that result in changes to the layers must -increase the revision number of these layers. - -That allows the rendering process to safely assume that a given layers whose -revision does not change hasn't been modified (this helps with caching). - -Every mutable method in `ISceneLayer` instances that possibly change the visual -representation of an `ISceneLayer` must increase this revision number. - -### Implementation: `FloatTextureSceneLayer` - -Layer that renders an `Orthanc::ImageAccessor` object that must be convertible -to `Float32` image. - -The constructor only uses the image accessor to perform a copy. It can safely -be deleted afterwards. - -The input values are mapped to the output values by taking into account various -properties that can be modified with: - -- `SetWindowing`: uses windowing presets like "bone" or "lung" -- `SetCustomWindowing`: with manual window center and width -- `SetInverted`: toggles black <-> white inversion after windowing -- `SetApplyLog`: uses a non-linear response curve described in - https://theailearner.com/2019/01/01/log-transformation/ that expands contrast - in dark areas while compressing contrast in bright ones. This is **not** - implemented in the OpenGL renderer! - -The corresponding renderers are `OpenGLFloatTextureRenderer` and -`CairoFloatTextureRenderer`. The scene transformation is applied during -rendering. - -### Implementation: `ColorTextureSceneLayer` - -Layer that renders an `Orthanc::ImageAccessor` object an RGBA image (alpha must -be premultiplied). - -The constructor only uses the image accessor to perform a copy. It can safely -be deleted afterwards. - -The corresponding renderers are `OpenGLColorTextureRenderer` and -`CairoColorTextureRenderer`. The scene transformation is applied during -rendering. - -### Implementation: `LookupTableTextureSceneLayer` - -Layer that renders an `Orthanc::ImageAccessor` object that must be convertible -to `Float32` image. - -The constructor only uses the image accessor to perform a copy. It can safely -be deleted afterwards. - -The final on-screen color of each pixel is determined by passing the input -`Float32` value through a 256-entry look-up table (LUT) that can be passed as -an array of either 256 x 3 bytes (for opaque RGB colors) or 256 x 4 bytes (for -RGBA pixels). The LUT is not specified at construction time, but with -calls to `SetLookupTable` or `SetLookupTableGrayscale` (that fills the LUT -with a gradient from black to white, fully opaque) - -The range of input values that is mapped to the entirety of the LUT is, by -default, the full image range, but can be customized with `SetRange`. - -The corresponding renderers are `OpenGLLookupTableTextureRenderer` and -`CairoLookupTableTextureRenderer`. The scene transformation is applied during -rendering. - -### Implementation: `PolylineSceneLayer` - -Layer that renders vector-based polygonal lines. - -Polylines can be added with the `AddChain` method, that accepts a `Chain`, that -is a typedef to `std::vector`, a flag to specify whether the -chain must be automatically close (last point of the vector connected to the -first one) and the chain color (a `Color` structure). - -Please note that the line thickness is, contrary to the color, specified -per-chain but rather per-layer. - -If you need multiple line thicknesses, multiple `PolylineSceneLayer` must be -created. - -The corresponding renderers are `OpenGLAdvancedPolylineRenderer` and -`CairoPolylineRenderer`. The scene transformation is applied during -rendering. - -### Implementation: `TextSceneLayer` - -This layers renders a paragraph of text. - -The inputs to the layer can be changed after creation and are: -- The text iself, supplied as an UTF-8 encoded string in `SetText` -- The font used for rendering, set by `SetFontIndex`. -- The text anchoring, through `SetAnchor`: the text can be anchored to - various positions, such as top lef, center, bottom center,... These - various anchors are part of the `BitmapAnchor` enumeration. -- The text position, relative to its anchor, through `SetPosition`. - -The font is supplied as an index. This is an index in the set of fonts -that has been registered in the viewport compositor. The following code -shows how to set such a font: - -``` -std::unique_ptr lock(viewport_.Lock()); -lock->GetCompositor().SetFont(0, - Orthanc::EmbeddedResources::UBUNTU_FONT, - 32, Orthanc::Encoding_Latin1); -// where 32 is the font size in pixels -``` - -This call uses the embedded `UBUNTU_FONT` resource that has been defined in -the `CMakeLists.txt` file with: - -``` -EmbedResources( - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf -) -``` - -Please note that you must supply a font: there is no default font provided by -the OpenGL or Cairo compositors. - -The corresponding renderers are `OpenGLTextRenderer` and -`CairoTextRenderer`. The scene transformation is not applied during rendering, -because the text anchoring, position and scaling are computed relative to the -viewport/canvas. - -### Implementation: `InfoPanelSceneLayer` - -This layer is designed to display an image, supplied through an -`Orthanc::ImageAccessor` reference (only used at construction time). - -The image is not transformed according to the normal layer transformation but -is rather positioned relative to the canvas, with the same mechanism as the -`TextSceneLayer` described above. - -The image position is specified with the sole means of the `SetAnchor` method. - -The corresponding renderers are `OpenGLInfoPanelRenderer` and -`CairoInfoPanelRenderer`. - -### `IViewport` - -https://bitbucket.org/sjodogne/orthanc-stone/src/broker/Framework/Viewport/IViewport.h - -(**not** the one in `Deprecated`) -- Implemented by classes that: - - manage the on-screen display of a `Scene2D` trough a compositor. - - Own the `ICompositor` object that performs the rendering. - - Own the `Scene2D` (TODO: currently through `ViewportController` --> `Scene2D`) - - Provide a `Lock` method that returns a RAII, that must be kept alive when - modifying the underlying objects (controller, compositor, scene), but not - longer. - -#### Implementation: `SdlOpenGLViewport` -- Implementation of a viewport rendered on a SDL window, that uses OpenGL for - rendering. -- Instantiating this object creates an SDL window. Automatic scaling for hiDPI - displays can be toggled on or off. - -#### Implementation: `WebGLViewport` -- Implementation of a viewport rendered on a DOM canvas, that uses OpenGL for - rendering. -- Contrary to the SDL OpenGL viewport, the canvas must already be existing - when the ctor is called. - -### `ICompositor` -The interface providing a rendering service for `Scene2D` objects. - -**Subclasses:** `CairoCompositor`, `OpenGLCompositor` - -You do not need to create compositor instances. They are created for you when -instantiating a viewport. - -### `ViewportController` -This concrete class is instantiated by its `IViewport` owner. - -**TODO:** its functionality is not well defined and should be moved into the -viewport base class. Support for measuring tools should be moved to a special -interactor. - -- contains: - - array of `MeasureTool` - - ref to `IViewport` - - `activeTracker_` - - owns a `Scene2D` - - weak ref to `UndoStack` - - cached `canvasToSceneFactor_` - -- contains logic to: - - pass commands to undostack (trivial) - - logic to locate `MeasureTool` in the HitTest - - OTOH, the meat of the measuring tool logic (highlighting etc..) is - done in app-specific code (`VolumeSlicerWidget`) - - accept new Scene transform and notify listeners - - **the code that uses the interactor** (`HandleMousePress`) is only - called by the new `WebAssemblyViewport` !!! **TODO** clean this mess - -### `IViewportInteractor` -- must provide logic to respond to `CreateTracker` - -### `DefaultViewportInteractor` -- provides Pan+Rotate+Zoom trackers - -### `WebGLViewportsRegistry` - -This class is a singleton (accessible through `GetWebGLViewportsRegistry()` -that deals with context losses in the WebGL contexts. - -You use it by creating a WebGLViewport in the following fashion: - -``` -boost::shared_ptr viewport( - OrthancStone::GetWebGLViewportsRegistry().Add(canvasId)); -``` - -## Source data related - -### `IVolumeSlicer` - -A very simple interface with a single method: -`IVolumeSlicer::IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane)` - -### `IVolumeSlicer::IExtractedSlice` - -On a slice has been extracted from a volume by an `IVolumeSlicer`, it can -report its *revision number*. - -If another call to `ExtractSlice` with the same cutting plane is made, but -the returned slice revision is different, it means that the volume has -changed and the scene layer must be refreshed. - -Please see `VolumeSceneLayerSource::Update` to check how this logic is -implemented. - - -### `OrthancSeriesVolumeProgressiveLoader` - -This class implements `IVolumeSlicer` (and `IObservable`) and can be used to -load a volume stored in a Dicom series on an Orthanc server. - -Over the course of the series loading, various notifications are sent: - -The first one is `OrthancStone::DicomVolumeImage::GeometryReadyMessage` that -is sent when the volume extent and geometric properties are known. - -Then, as slices get loaded and the volume is filled, -`OrthancStone::DicomVolumeImage::ContentUpdatedMessage` are sent. - -Once all the highest-quality slices have been loaded, the -`OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality` -notification is sent. - -Please note that calling `ExtractSlice` *before* the geometry is loaded will -yield an instance of `InvalidSlice` that cannot be used to create a layer. - -On the other hand, - -### `VolumeSceneLayerSource` - -This class makes the bridge between a volume (supplied by an `IVolumeSlicer` -interface) and a `Scene2D`. - -Please note that the bulk of the work is done the objects implementing -`IVolumeSlicer` and this object merely connects things together. - -For instance, deciding whether an image (texture) or vector (polyline) layer -is done by the `IVolumeSlicer` implementation. - -- contains: - - reference to Scene2D - - `layerIndex_` (fixed at ctor) that is the index, in the Scene2D layer - stack, of the layer that will be created/updated - - `IVolumeSlicer` - -- contains logic to: - - extract a slice from the slicer and set/refresh the Scene2D layer at - the supplied `layerIndex_` - - refresh this based on the slice revision or configuration revision - - accept a configuration that will be applied to the layer - - the `Update()` method will - -## Updates and the configurators - -`ISceneLayer` does not expose mutable methods. - -The way to change a layer once it has been created is through configurator -objets. - -If you plan to set (even only once) or modify some layer properties after -layer creation, you need to create a matching configurator objet. - -For instance, in the `VolumeSceneLayerSource`, the `SetConfigurator` method -will store a `ILayerStyleConfigurator* configurator_`. - -In the `OrthancView` ctor, you can see how it is used: - -``` -std::unique_ptr style( - new GrayscaleStyleConfigurator); - -style->SetLinearInterpolation(true); - -...... - -std::unique_ptr config( - new LookupTableStyleConfigurator); - -config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); - -``` - -The configurator type are created according to the type of layer.ΒΈ - -Later, in `VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane)`, -if the cutting plane has **not** changed and if the layer revision has **not** -changed, we test `configurator_->GetRevision() != lastConfiguratorRevision_` -and, if different, we call `configurator_->ApplyStyle(scene_.GetLayer(layerDepth_));` - -This allows to change layer properties that do not depend on the layer model -contents. - -On the other hand, if the layer revision has changed, when compared to the -last time it has been rendered (stored in `lastRevision_`), then we need to -ask the slice to create a brand new layer. - -Another way to see it is that layer rendering depend on model data and view -data. The model data is not mutable in the layer and, if the model changes, the -layer must be recreated. - -If only the view properties change (the configurator), we call ApplyStyle -(that **will** mutate some of the layer internals) - -Please note that the renderer does **not** know about the configurator : the -renderer uses properies in the layer and does not care whether those have -been set once at construction time or at every frame (configuration time). - - -## Cookbook - -### Simple application - -#### Building - -In order to create a Stone application, you need to: - -- CMake-based application: - ``` - include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneConfiguration.cmake) - ``` - with this library target that you have to define: - ``` - add_library(OrthancStone STATIC ${ORTHANC_STONE_SOURCES}) - ``` - then link with this library: - ``` - target_link_libraries(MyStoneApplication OrthancStone) - ``` - -Building is supported with emscripten, Visual C++ (>= 9.0), gcc... - -emscripten recommended version >= 1.38.41 - -These are very rough guidelines. See the `Samples` folder for actual examples. - -#### Structure - -The code requires a loader (object that ) - -Initialize: - -``` -Orthanc::Logging::Initialize(); -Orthanc::Logging::EnableInfoLevel(true); -``` -Call, in WASM: -``` -DISPATCH_JAVASCRIPT_EVENT("StoneInitialized"); -``` - -# Notes - -- It is NOT possible to abandon the existing loaders : they contain too much loader-specific getters - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/GuiAdapter.cpp --- a/Framework/Deprecated/GuiAdapter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1139 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "GuiAdapter.h" - -#if ORTHANC_ENABLE_OPENGL == 1 -# include "../OpenGL/OpenGLIncludes.h" -#endif - -#if ORTHANC_ENABLE_SDL == 1 -# include -# include -# include -#endif - -#include - -namespace OrthancStone -{ - std::ostream& operator<<( - std::ostream& os, const GuiAdapterKeyboardEvent& event) - { - os << "sym: " << event.sym << " (" << (int)(event.sym[0]) << ") ctrl: " << event.ctrlKey << ", " << - "shift: " << event.shiftKey << ", " << - "alt: " << event.altKey; - return os; - } - - std::ostream& operator<<( - std::ostream& os, const GuiAdapterMouseEvent& event) - { - os << "targetX: " << event.targetX << " targetY: " << event.targetY << " button: " << event.button - << "ctrlKey: " << event.ctrlKey << "shiftKey: " << event.shiftKey << "altKey: " << event.altKey; - - return os; - } - - int GuiAdapter::s_instanceCount = 0; - -#if ORTHANC_ENABLE_WASM == 1 - void GuiAdapter::Run(GuiAdapterRunFunc /*func*/, void* /*cookie*/) - { - } - - void ConvertFromPlatform( - GuiAdapterUiEvent& dest, - int eventType, - const EmscriptenUiEvent& src) - { - // no data for now - } - - void ConvertFromPlatform( - GuiAdapterMouseEvent& dest, - int eventType, - const EmscriptenMouseEvent& src) - { - memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); - switch (eventType) - { - case EMSCRIPTEN_EVENT_CLICK: - LOG(ERROR) << "Emscripten EMSCRIPTEN_EVENT_CLICK is not supported"; - ORTHANC_ASSERT(false, "Not supported"); - break; - case EMSCRIPTEN_EVENT_MOUSEDOWN: - dest.type = GUIADAPTER_EVENT_MOUSEDOWN; - break; - case EMSCRIPTEN_EVENT_DBLCLICK: - dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; - break; - case EMSCRIPTEN_EVENT_MOUSEMOVE: - dest.type = GUIADAPTER_EVENT_MOUSEMOVE; - break; - case EMSCRIPTEN_EVENT_MOUSEUP: - dest.type = GUIADAPTER_EVENT_MOUSEUP; - break; - case EMSCRIPTEN_EVENT_WHEEL: - dest.type = GUIADAPTER_EVENT_WHEEL; - break; - - default: - LOG(ERROR) << "Emscripten event: " << eventType << " is not supported"; - ORTHANC_ASSERT(false, "Not supported"); - } - //dest.timestamp = src.timestamp; - //dest.screenX = src.screenX; - //dest.screenY = src.screenY; - //dest.clientX = src.clientX; - //dest.clientY = src.clientY; - dest.ctrlKey = src.ctrlKey; - dest.shiftKey = src.shiftKey; - dest.altKey = src.altKey; - //dest.metaKey = src.metaKey; - dest.button = src.button; - //dest.buttons = src.buttons; - //dest.movementX = src.movementX; - //dest.movementY = src.movementY; - dest.targetX = src.targetX; - dest.targetY = src.targetY; - //dest.canvasX = src.canvasX; - //dest.canvasY = src.canvasY; - //dest.padding = src.padding; - } - - void ConvertFromPlatform( GuiAdapterWheelEvent& dest, int eventType, const EmscriptenWheelEvent& src) - { - ConvertFromPlatform(dest.mouse, eventType, src.mouse); - dest.deltaX = src.deltaX; - dest.deltaY = src.deltaY; - switch (src.deltaMode) - { - case DOM_DELTA_PIXEL: - dest.deltaMode = GUIADAPTER_DELTA_PIXEL; - break; - case DOM_DELTA_LINE: - dest.deltaMode = GUIADAPTER_DELTA_LINE; - break; - case DOM_DELTA_PAGE: - dest.deltaMode = GUIADAPTER_DELTA_PAGE; - break; - default: - ORTHANC_ASSERT(false, "Unknown deltaMode: " << src.deltaMode << - " in wheel event..."); - } - dest.deltaMode = src.deltaMode; - } - - void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const EmscriptenKeyboardEvent& src) - { - dest.sym[0] = src.key[0]; - dest.sym[1] = 0; - dest.ctrlKey = src.ctrlKey; - dest.shiftKey = src.shiftKey; - dest.altKey = src.altKey; - } - - template - struct FuncAdapterPayload - { - std::string canvasCssSelector; - void* userData; - GenericFunc callback; - }; - - template - EM_BOOL OnEventAdapterFunc( - int eventType, const EmscriptenEvent* emEvent, void* userData) - { - // userData is OnMouseWheelFuncAdapterPayload - FuncAdapterPayload* payload = - reinterpret_cast*>(userData); - // LOG(INFO) << "OnEventAdapterFunc"; - // LOG(INFO) << "------------------"; - // LOG(INFO) << "eventType: " << eventType << " wheelEvent: " << - // (int)wheelEvent << " userData: " << userData << - // " payload->userData: " << payload->userData; - - GuiAdapterEvent guiEvent; - ConvertFromPlatform(guiEvent, eventType, *emEvent); - bool ret = (*(payload->callback))(payload->canvasCssSelector, &guiEvent, payload->userData); - return static_cast(ret); - } - - template - EM_BOOL OnEventAdapterFunc2( - int /*eventType*/, const EmscriptenEvent* wheelEvent, void* userData) - { - // userData is OnMouseWheelFuncAdapterPayload - FuncAdapterPayload* payload = - reinterpret_cast*>(userData); - - GuiAdapterEvent guiEvent; - ConvertFromPlatform(guiEvent, *wheelEvent); - bool ret = (*(payload->callback))(payload->canvasCssSelector, &guiEvent, payload->userData); - return static_cast(ret); - } - - template - EM_BOOL OnEventAdapterFunc3( - double time, void* userData) - { - // userData is OnMouseWheelFuncAdapterPayload - FuncAdapterPayload* payload = - reinterpret_cast*>(userData); - //std::unique_ptr< FuncAdapterPayload > deleter(payload); - bool ret = (*(payload->callback))(time, payload->userData); - return static_cast(ret); - } - - /* - - Explanation - =========== - - - in "older" Emscripten, where DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR doesn't exist or is set to 0, - the following strings need to be used to register events: - - for canvas, the canvas DOM id. In case of ", the string needs - to be "mycanvas" - - for the window (for key events), the string needs to be "#window" - - in newer Emscripten where DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR==1 (or maybe is not there anymore, in the - future as of 2020-04-20) - - for canvas, the canvas DOM id. In case of ", the string needs - to be "#mycanvas" (notice the "number sign", aka "hash", NOT AKA "sharp", as can be read on https://en.wikipedia.org/wiki/Number_sign) - - for the window (for key events), the string needs to be EMSCRIPTEN_EVENT_TARGET_WINDOW. I do not mean - "EMSCRIPTEN_EVENT_TARGET_WINDOW", but the #define EMSCRIPTEN_EVENT_TARGET_WINDOW ((const char*)2) that - can be found in emscripten/html5.h - - The code below converts the input canvasId (as in the old emscripten) to the emscripten-compliant one, with the - following compile condition : #if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 - - If the DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR build parameter disappears, you might want to refactor this code - or continue to pass the DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR compile macro (which is different from the CMake - variable) - - What we are doing below: - - in older Emscripten, the registration functions will receive "mycanvas" and "#window" and the callbacks will receive - the same std::string in their payload ("mycanvas" and "#window") - - - in newer Emscripten, the registration functions will receive "#mycanvas" and EMSCRIPTEN_EVENT_TARGET_WINDOW, but - the callbacks will receive "#mycanvas" and "#window" (since it is not possible to store the EMSCRIPTEN_EVENT_TARGET_WINDOW - magic value in an std::string, while we still want the callback to be able to change its behavior according to the - target element. - - */ - - void convertElementTarget(const char*& outCanvasCssSelectorSz, std::string& outCanvasCssSelector, const std::string& canvasId) - { - // only "#window" can start with a # - if (canvasId[0] == '#') - { - ORTHANC_ASSERT(canvasId == "#window"); - } -#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 - if (canvasId == "#window") - { - // we store this in the payload so that the callback can - outCanvasCssSelector = "#window"; - outCanvasCssSelectorSz = EMSCRIPTEN_EVENT_TARGET_WINDOW; - } - else - { - outCanvasCssSelector = "#" + canvasId; - outCanvasCssSelectorSz = outCanvasCssSelector.c_str(); - } -#else - if (canvasId == "#window") - { - // we store this in the payload so that the callback can - outCanvasCssSelector = "#window"; - outCanvasCssSelectorSz = outCanvasCssSelector.c_str();; - } - else - { - outCanvasCssSelector = canvasId; - outCanvasCssSelectorSz = outCanvasCssSelector.c_str();; - } -#endif - } - - // resize: (const char* target, void* userData, EM_BOOL useCapture, em_ui_callback_func callback) - template< - typename GenericFunc, - typename GuiAdapterEvent, - typename EmscriptenEvent, - typename EmscriptenSetCallbackFunc> - static void SetCallback( - EmscriptenSetCallbackFunc emFunc, - std::string canvasId, void* userData, bool capture, GenericFunc func) - { - std::string canvasCssSelector; - const char* canvasCssSelectorSz = NULL; - convertElementTarget(canvasCssSelectorSz, canvasCssSelector, canvasId); - - // TODO: write RemoveCallback with an int id that gets returned from here - - // create userdata payload - std::unique_ptr > payload(new FuncAdapterPayload()); - payload->canvasCssSelector = canvasCssSelector; - payload->callback = func; - payload->userData = userData; - void* userDataRaw = reinterpret_cast(payload.release()); - - // call the registration function - (*emFunc)( - canvasCssSelectorSz, - userDataRaw, - static_cast(capture), - &OnEventAdapterFunc, - EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); - } - - template< - typename GenericFunc, - typename GuiAdapterEvent, - typename EmscriptenEvent, - typename EmscriptenSetCallbackFunc> - static void SetCallback2( - EmscriptenSetCallbackFunc emFunc, - std::string canvasId, void* userData, bool capture, GenericFunc func) - { - std::string canvasCssSelector; - const char* canvasCssSelectorSz = NULL; - convertElementTarget(canvasCssSelectorSz, canvasCssSelector, canvasId); - - // TODO: write RemoveCallback with an int id that gets returned from here - - // create userdata payload - std::unique_ptr > payload(new FuncAdapterPayload()); - payload->canvasCssSelector = canvasCssSelector; - payload->callback = func; - payload->userData = userData; - void* userDataRaw = reinterpret_cast(payload.release()); - - // call the registration function - (*emFunc)( - canvasCssSelectorSz, - userDataRaw, - static_cast(capture), - &OnEventAdapterFunc2, - EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); - } - - template< - typename GenericFunc, - typename EmscriptenSetCallbackFunc> - static void SetAnimationFrameCallback( - EmscriptenSetCallbackFunc emFunc, - void* userData, GenericFunc func) - { - std::unique_ptr > payload( - new FuncAdapterPayload() - ); - payload->canvasCssSelector = "UNDEFINED"; - payload->callback = func; - payload->userData = userData; - void* userDataRaw = reinterpret_cast(payload.release()); - (*emFunc)( - &OnEventAdapterFunc3, - userDataRaw); - } - - void GuiAdapter::SetWheelCallback( - std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func) - { - SetCallback( - &emscripten_set_wheel_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - - void GuiAdapter::SetMouseDblClickCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - SetCallback( - &emscripten_set_dblclick_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - - void GuiAdapter::SetMouseDownCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - SetCallback( - &emscripten_set_mousedown_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - void GuiAdapter::SetMouseMoveCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - // LOG(INFO) << "SetMouseMoveCallback -- " << "supplied userData: " << - // userData; - - SetCallback( - &emscripten_set_mousemove_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - void GuiAdapter::SetMouseUpCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - SetCallback( - &emscripten_set_mouseup_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - void GuiAdapter::SetKeyDownCallback( - std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) - { - SetCallback2( - &emscripten_set_keydown_callback_on_thread, - canvasId, - userData, - capture, - func); - } - - void GuiAdapter::SetKeyUpCallback( - std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) - { - SetCallback2( - &emscripten_set_keyup_callback_on_thread, - canvasId, - userData, - capture, - func); - } - -#if 0 - // useless under Wasm where canvas resize is handled automatically - void GuiAdapter::SetResizeCallback( - std::string canvasId, void* userData, bool capture, OnWindowResizeFunc func) - { - SetCallback( - &emscripten_set_resize_callback_on_thread, - canvasId, - userData, - capture, - func); - } -#endif - - void GuiAdapter::RequestAnimationFrame( - OnAnimationFrameFunc func, void* userData) - { - SetAnimationFrameCallback( - &emscripten_request_animation_frame_loop, - userData, - func); - } - -#if 0 - void GuiAdapter::SetKeyDownCallback( - std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) - { - emscripten_set_keydown_callback(canvasId.c_str(), userData, static_cast(capture), func); - } - void GuiAdapter::SetKeyUpCallback( - std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) - { - emscripten_set_keyup_callback(canvasId.c_str(), userData, static_cast(capture), func); - } - - // handled from within WebAssemblyViewport - //void GuiAdapter::SetResizeCallback(std::string canvasId, void* userData, bool capture, OnWindowResizeFunc func) - //{ - // emscripten_set_resize_callback(canvasId.c_str(), userData, static_cast(capture), func); - //} - - void GuiAdapter::RequestAnimationFrame(OnAnimationFrameFunc func, void* userData) - { - emscripten_request_animation_frame_loop(func, userData); - } -#endif - - -#else - - // SDL ONLY - void ConvertFromPlatform(GuiAdapterMouseEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source) - { - memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); - switch (source.type) - { - case SDL_MOUSEBUTTONDOWN: - if (source.button.clicks == 1) { - dest.type = GUIADAPTER_EVENT_MOUSEDOWN; - } else if (source.button.clicks == 2) { - dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; - } else { - dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; - LOG(WARNING) << "Multiple-click ignored."; - } - break; - case SDL_MOUSEMOTION: - dest.type = GUIADAPTER_EVENT_MOUSEMOVE; - break; - case SDL_MOUSEBUTTONUP: - dest.type = GUIADAPTER_EVENT_MOUSEUP; - break; - case SDL_MOUSEWHEEL: - dest.type = GUIADAPTER_EVENT_WHEEL; - break; - default: - LOG(ERROR) << "SDL event: " << source.type << " is not supported"; - ORTHANC_ASSERT(false, "Not supported"); - } - //dest.timestamp = src.timestamp; - //dest.screenX = src.screenX; - //dest.screenY = src.screenY; - //dest.clientX = src.clientX; - //dest.clientY = src.clientY; - dest.ctrlKey = ctrlPressed; - dest.shiftKey = shiftPressed; - dest.altKey = altPressed; - //dest.metaKey = src.metaKey; - switch (source.button.button) - { - case SDL_BUTTON_MIDDLE: - dest.button =GUIADAPTER_MOUSEBUTTON_MIDDLE; - break; - - case SDL_BUTTON_RIGHT: - dest.button = GUIADAPTER_MOUSEBUTTON_RIGHT; - break; - - case SDL_BUTTON_LEFT: - dest.button = GUIADAPTER_MOUSEBUTTON_LEFT; - break; - - default: - break; - } - //dest.buttons = src.buttons; - //dest.movementX = src.movementX; - //dest.movementY = src.movementY; - dest.targetX = source.button.x; - dest.targetY = source.button.y; - //dest.canvasX = src.canvasX; - //dest.canvasY = src.canvasY; - //dest.padding = src.padding; - } - - void ConvertFromPlatform( - GuiAdapterWheelEvent& dest, - bool ctrlPressed, bool shiftPressed, bool altPressed, - const SDL_Event& source) - { - ConvertFromPlatform(dest.mouse, ctrlPressed, shiftPressed, altPressed, source); - dest.deltaX = source.wheel.x; - dest.deltaY = source.wheel.y; - } - - void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const SDL_Event& src) - { - memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); - switch (src.type) - { - case SDL_KEYDOWN: - dest.type = GUIADAPTER_EVENT_KEYDOWN; - break; - case SDL_KEYUP: - dest.type = GUIADAPTER_EVENT_KEYUP; - break; - default: - LOG(ERROR) << "SDL event: " << src.type << " is not supported"; - ORTHANC_ASSERT(false, "Not supported"); - } - dest.sym[0] = src.key.keysym.sym; - dest.sym[1] = 0; - - if (src.key.keysym.mod & KMOD_CTRL) - dest.ctrlKey = true; - else - dest.ctrlKey = false; - - if (src.key.keysym.mod & KMOD_SHIFT) - dest.shiftKey = true; - else - dest.shiftKey = false; - - if (src.key.keysym.mod & KMOD_ALT) - dest.altKey = true; - else - dest.altKey = false; - } - - // SDL ONLY - void GuiAdapter::SetSdlResizeCallback( - std::string canvasId, void* userData, bool capture, OnSdlWindowResizeFunc func) - { - resizeHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetMouseDownCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - mouseDownHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetMouseDblClickCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - mouseDblCickHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetMouseMoveCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - mouseMoveHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetMouseUpCallback( - std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) - { - mouseUpHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetWheelCallback( - std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func) - { - mouseWheelHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetKeyDownCallback( - std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) - { - keyDownHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetKeyUpCallback( - std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) - { - keyUpHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::SetGenericSdlEventCallback( - std::string canvasId, void* userData, bool capture, OnSdlEventCallback func) - { - sdlEventHandlers_.push_back(EventHandlerData(canvasId, func, userData)); - } - - // SDL ONLY - void GuiAdapter::OnAnimationFrame() - { - std::vector disabledAnimationHandlers; - for (size_t i = 0; i < animationFrameHandlers_.size(); i++) - { - // TODO: fix time - bool goOn = (*(animationFrameHandlers_[i].first))(0, animationFrameHandlers_[i].second); - - // If the function returns false, we need to emulate what happens in Web - // and remove the function from the handlers... - if (!goOn) - disabledAnimationHandlers.push_back(i); - } - for (size_t i = 0; i < disabledAnimationHandlers.size(); i++) - { - ORTHANC_ASSERT(animationFrameHandlers_.begin() + disabledAnimationHandlers[i] < animationFrameHandlers_.end()); - animationFrameHandlers_.erase(animationFrameHandlers_.begin() + disabledAnimationHandlers[i]); - } - } - - // SDL ONLY - void GuiAdapter::OnResize(unsigned int width, unsigned int height) - { - for (size_t i = 0; i < resizeHandlers_.size(); i++) - { - (*(resizeHandlers_[i].func))( - resizeHandlers_[i].canvasName, NULL, width, height, resizeHandlers_[i].userData); - } - } - - - - void GuiAdapter::OnSdlGenericEvent(const SDL_Event& sdlEvent) - { - // Events related to a window are only sent to the related canvas - // User events are sent to everyone (we can't filter them here) - - /* - SDL_WindowEvent SDL_WINDOWEVENT - SDL_KeyboardEvent SDL_KEYDOWN - SDL_KEYUP - SDL_TextEditingEvent SDL_TEXTEDITING - SDL_TextInputEvent SDL_TEXTINPUT - SDL_MouseMotionEvent SDL_MOUSEMOTION - SDL_MouseButtonEvent SDL_MOUSEBUTTONDOWN - SDL_MOUSEBUTTONUP - SDL_MouseWheelEvent SDL_MOUSEWHEEL - SDL_UserEvent SDL_USEREVENT through ::SDL_LASTEVENT-1 - */ - - // if this string is left empty, it means the message will be sent to - // all widgets. - // otherwise, it contains the originating message window title - - std::string windowTitle; - uint32_t windowId = 0; - - if (sdlEvent.type == SDL_WINDOWEVENT) - windowId = sdlEvent.window.windowID; - else if (sdlEvent.type == SDL_KEYDOWN || sdlEvent.type == SDL_KEYUP) - windowId = sdlEvent.key.windowID; - else if (sdlEvent.type == SDL_TEXTEDITING) - windowId = sdlEvent.edit.windowID; - else if (sdlEvent.type == SDL_TEXTINPUT) - windowId = sdlEvent.text.windowID; - else if (sdlEvent.type == SDL_MOUSEMOTION) - windowId = sdlEvent.motion.windowID; - else if (sdlEvent.type == SDL_MOUSEBUTTONDOWN || sdlEvent.type == SDL_MOUSEBUTTONUP) - windowId = sdlEvent.button.windowID; - else if (sdlEvent.type == SDL_MOUSEWHEEL) - windowId = sdlEvent.wheel.windowID; - else if (sdlEvent.type >= SDL_USEREVENT && sdlEvent.type <= (SDL_LASTEVENT-1)) - windowId = sdlEvent.user.windowID; - - if (windowId != 0) - { - SDL_Window* sdlWindow = SDL_GetWindowFromID(windowId); - ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowId << "\" is not a valid SDL window ID!"); - const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); - ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowId << "\" has a NULL window title!"); - windowTitle = windowTitleSz; - ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowId << "\" has an empty window title!"); - } - - for (size_t i = 0; i < sdlEventHandlers_.size(); i++) - { - // normally, the handlers return a bool indicating whether they - // have handled the event or not, but we don't really care about this - std::string& canvasName = sdlEventHandlers_[i].canvasName; - - bool sendEvent = true; - - if (windowTitle != "" && (canvasName != windowTitle)) - sendEvent = false; - - if (sendEvent) - { - OnSdlEventCallback func = sdlEventHandlers_[i].func; - (*func)(canvasName, sdlEvent, sdlEventHandlers_[i].userData); - } - } - } - - // SDL ONLY - void GuiAdapter::OnMouseWheelEvent(uint32_t windowID, const GuiAdapterWheelEvent& event) - { - // the SDL window name IS the canvas name ("canvas" is used because this lib - // is designed for Wasm - SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); - ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); - - const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); - ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); - - std::string windowTitle(windowTitleSz); - ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); - - switch (event.mouse.type) - { - case GUIADAPTER_EVENT_WHEEL: - for (size_t i = 0; i < mouseWheelHandlers_.size(); i++) - { - if (mouseWheelHandlers_[i].canvasName == windowTitle) - (*(mouseWheelHandlers_[i].func))(windowTitle, &event, mouseWheelHandlers_[i].userData); - } - break; - default: - ORTHANC_ASSERT(false, "Wrong event.type: " << event.mouse.type << " in GuiAdapter::OnMouseWheelEvent(...)"); - break; - } - } - - - void GuiAdapter::OnKeyboardEvent(uint32_t windowID, const GuiAdapterKeyboardEvent& event) - { - // only one-letter (ascii) keyboard events supported for now - ORTHANC_ASSERT(event.sym[0] != 0); - ORTHANC_ASSERT(event.sym[1] == 0); - - SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); - ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); - - const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); - ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); - - std::string windowTitle(windowTitleSz); - ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); - - switch (event.type) - { - case GUIADAPTER_EVENT_KEYDOWN: - for (size_t i = 0; i < keyDownHandlers_.size(); i++) - { - (*(keyDownHandlers_[i].func))(windowTitle, &event, keyDownHandlers_[i].userData); - } - break; - case GUIADAPTER_EVENT_KEYUP: - for (size_t i = 0; i < keyUpHandlers_.size(); i++) - { - (*(keyUpHandlers_[i].func))(windowTitle, &event, keyUpHandlers_[i].userData); - } - break; - default: - ORTHANC_ASSERT(false, "Wrong event.type: " << event.type << " in GuiAdapter::OnKeyboardEvent(...)"); - break; - } - } - - // SDL ONLY - void GuiAdapter::OnMouseEvent(uint32_t windowID, const GuiAdapterMouseEvent& event) - { - if (windowID == 0) - { - LOG(WARNING) << "GuiAdapter::OnMouseEvent -- windowID == 0 and event won't be routed!"; - } - else - { - // the SDL window name IS the canvas name ("canvas" is used because this lib - // is designed for Wasm - SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); - - ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); - - const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); - ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); - - std::string windowTitle(windowTitleSz); - ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); - - switch (event.type) - { - case GUIADAPTER_EVENT_MOUSEDOWN: - for (size_t i = 0; i < mouseDownHandlers_.size(); i++) - { - if (mouseDownHandlers_[i].canvasName == windowTitle) - (*(mouseDownHandlers_[i].func))(windowTitle, &event, mouseDownHandlers_[i].userData); - } - break; - case GUIADAPTER_EVENT_MOUSEDBLCLICK: - for (size_t i = 0; i < mouseDblCickHandlers_.size(); i++) - { - if (mouseDblCickHandlers_[i].canvasName == windowTitle) - (*(mouseDblCickHandlers_[i].func))(windowTitle, &event, mouseDblCickHandlers_[i].userData); - } - break; - case GUIADAPTER_EVENT_MOUSEMOVE: - for (size_t i = 0; i < mouseMoveHandlers_.size(); i++) - { - if (mouseMoveHandlers_[i].canvasName == windowTitle) - (*(mouseMoveHandlers_[i].func))(windowTitle, &event, mouseMoveHandlers_[i].userData); - } - break; - case GUIADAPTER_EVENT_MOUSEUP: - for (size_t i = 0; i < mouseUpHandlers_.size(); i++) - { - if (mouseUpHandlers_[i].canvasName == windowTitle) - (*(mouseUpHandlers_[i].func))(windowTitle, &event, mouseUpHandlers_[i].userData); - } - break; - default: - ORTHANC_ASSERT(false, "Wrong event.type: " << event.type << " in GuiAdapter::OnMouseEvent(...)"); - break; - } - } - } - - - // extern void Debug_SetContextToBeKilled(std::string title); - // extern void Debug_SetContextToBeRestored(std::string title); - - // SDL ONLY - void GuiAdapter::RequestAnimationFrame(OnAnimationFrameFunc func, void* userData) - { - animationFrameHandlers_.push_back(std::make_pair(func, userData)); - } - -# if ORTHANC_ENABLE_OPENGL == 1 && !defined(__APPLE__) /* OpenGL debug is not available on OS X */ - - // SDL ONLY - static void GLAPIENTRY - OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar * message, - const void* userParam) - { - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), - type, severity, message); - } - } -# endif - -#if 0 - // TODO: remove this when generic sdl event handlers are implemented in - // the DoseView - // SDL ONLY - bool GuiAdapter::IsSdlViewPortRefreshEvent(const SDL_Event& event) const - { - SDL_Window* sdlWindow = SDL_GetWindowFromID(event.window.windowID); - - ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << event.window.windowID << "\" is not a valid SDL window ID!"); - - const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); - - // now we need to find the DoseView from from the canvas name! - // (and retrieve the SdlViewport) - boost::shared_ptr foundWidget; - VisitWidgets([&foundWidget, windowTitleSz](auto widget) - { - if (widget->GetCanvasIdentifier() == std::string(windowTitleSz)) - foundWidget = widget; - }); - ORTHANC_ASSERT(foundWidget, "The window named: \"" << windowTitleSz << "\" was not found in the registered widgets!"); - return foundWidget->GetSdlViewport().IsRefreshEvent(event); - } -#endif - - // SDL ONLY - void GuiAdapter::Run(GuiAdapterRunFunc func, void* cookie) - { -#if 1 - // TODO: MAKE THIS DYNAMIC !!! See SdlOpenGLViewport vs Cairo in ViewportWrapper -# if ORTHANC_ENABLE_OPENGL == 1 && !defined(__APPLE__) - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); -# endif -#endif - - // Uint32 SDL_GetWindowID(SDL_Window* window) - // SDL_Window* SDL_GetWindowFromID(Uint32 id) // may return NULL - - bool stop = false; - while (!stop) - { - { - // TODO: lock all viewports here! (use a scoped object) - if(func != NULL) - (*func)(cookie); - OnAnimationFrame(); // in SDL we must call it - } - - while (!stop) - { - std::vector sdlEvents; - std::map userEventsMap; - - SDL_Event sdlEvent; - - // FIRST: collect all pending events - while (SDL_PollEvent(&sdlEvent) != 0) - { - if ( (sdlEvent.type >= SDL_USEREVENT) && - (sdlEvent.type < SDL_LASTEVENT) ) - { - // we don't want to have multiple events with the same event.type - userEventsMap[sdlEvent.type] = sdlEvent; - } - else - { - sdlEvents.push_back(sdlEvent); - } - } - - // SECOND: collect all user events - for (std::map::const_iterator it = userEventsMap.begin(); it != userEventsMap.end(); ++it) - sdlEvents.push_back(it->second); - - // now process the events - for (std::vector::const_iterator it = sdlEvents.begin(); it != sdlEvents.end(); ++it) - { - const SDL_Event& sdlEvent = *it; - // TODO: lock all viewports here! (use a scoped object) - - if (sdlEvent.type == SDL_QUIT) - { - // TODO: call exit callbacks here - stop = true; - break; - } - else if ((sdlEvent.type == SDL_MOUSEMOTION) || - (sdlEvent.type == SDL_MOUSEBUTTONDOWN) || - (sdlEvent.type == SDL_MOUSEBUTTONUP)) - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - bool ctrlPressed(false); - bool shiftPressed(false); - bool altPressed(false); - - if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) - altPressed = true; - - GuiAdapterMouseEvent dest; - ConvertFromPlatform(dest, ctrlPressed, shiftPressed, altPressed, sdlEvent); - OnMouseEvent(sdlEvent.window.windowID, dest); - #if 0 - // for reference, how to create trackers - if (tracker) - { - PointerEvent e; - e.AddPosition(compositor.GetPixelCenterCoordinates( - sdlEvent.button.x, sdlEvent.button.y)); - tracker->PointerMove(e); - } - #endif - } - else if (sdlEvent.type == SDL_MOUSEWHEEL) - { - - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - bool ctrlPressed(false); - bool shiftPressed(false); - bool altPressed(false); - - if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) - altPressed = true; - - GuiAdapterWheelEvent dest; - ConvertFromPlatform(dest, ctrlPressed, shiftPressed, altPressed, sdlEvent); - OnMouseWheelEvent(sdlEvent.window.windowID, dest); - - //KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); - - //int x, y; - //SDL_GetMouseState(&x, &y); - - //if (sdlEvent.wheel.y > 0) - //{ - // locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); - //} - //else if (sdlEvent.wheel.y < 0) - //{ - // locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); - //} - } - else if (sdlEvent.type == SDL_WINDOWEVENT && - (sdlEvent.window.event == SDL_WINDOWEVENT_RESIZED || - sdlEvent.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) - { - #if 0 - tracker.reset(); - #endif - OnResize(sdlEvent.window.data1, sdlEvent.window.data2); - } - else if (sdlEvent.type == SDL_KEYDOWN && sdlEvent.key.repeat == 0 /* Ignore key bounce */) - { - switch (sdlEvent.key.keysym.sym) - { - case SDLK_f: - // window.GetWindow().ToggleMaximize(); //TODO: move to particular handler - break; - - // This commented out code was used to debug the context - // loss/restoring code (2019-08-10) - // case SDLK_k: - // { - // SDL_Window* window = SDL_GetWindowFromID(sdlEvent.window.windowID); - // std::string windowTitle(SDL_GetWindowTitle(window)); - // Debug_SetContextToBeKilled(windowTitle); - // } - // break; - // case SDLK_l: - // { - // SDL_Window* window = SDL_GetWindowFromID(sdlEvent.window.windowID); - // std::string windowTitle(SDL_GetWindowTitle(window)); - // Debug_SetContextToBeRestored(windowTitle); - // } - // break; - - case SDLK_q: - stop = true; - break; - - default: - GuiAdapterKeyboardEvent dest; - ConvertFromPlatform(dest, sdlEvent); - OnKeyboardEvent(sdlEvent.window.windowID, dest); - break; - } - } - - OnSdlGenericEvent(sdlEvent); - } - SDL_Delay(1); - } - } - } -#endif -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/GuiAdapter.h --- a/Framework/Deprecated/GuiAdapter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,377 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include - -#if ORTHANC_ENABLE_WASM != 1 -# ifdef __EMSCRIPTEN__ -# error __EMSCRIPTEN__ is defined and ORTHANC_ENABLE_WASM != 1 -# endif -#endif - -#if ORTHANC_ENABLE_WASM == 1 -# ifndef __EMSCRIPTEN__ -# error __EMSCRIPTEN__ is not defined and ORTHANC_ENABLE_WASM == 1 -# endif -#endif - -#if ORTHANC_ENABLE_WASM == 1 -# include -#else -# if ORTHANC_ENABLE_SDL == 1 -# include -# endif -#endif - -#include "../StoneException.h" - -#include -#include -#include - -namespace OrthancStone -{ -#if ORTHANC_ENABLE_SDL == 1 - class SdlViewport; -#endif - -#if 0 - - /** - This interface is used to store the widgets that are controlled by the - GuiAdapter and receive event callbacks. - The callbacks may possibly be downcast (using dynamic_cast, for safety) \ - to the actual widget type - */ - class IGuiAdapterWidget - { - public: - virtual ~IGuiAdapterWidget() {} - -#if #if ORTHANC_ENABLE_SDL == 1 - /** - Returns the SdlViewport that this widget contains. If the underlying - viewport type is *not* SDL, then an error is returned. - */ - virtual SdlViewport& GetSdlViewport() = 0; -#endif - }; - -#endif - - enum GuiAdapterMouseButtonType - { - GUIADAPTER_MOUSEBUTTON_LEFT = 0, - GUIADAPTER_MOUSEBUTTON_MIDDLE = 1, - GUIADAPTER_MOUSEBUTTON_RIGHT = 2 - }; - - - enum GuiAdapterHidEventType - { - GUIADAPTER_EVENT_MOUSEDOWN = 1973, - GUIADAPTER_EVENT_MOUSEMOVE = 1974, - GUIADAPTER_EVENT_MOUSEDBLCLICK = 1975, - GUIADAPTER_EVENT_MOUSEUP = 1976, - GUIADAPTER_EVENT_WHEEL = 1977, - GUIADAPTER_EVENT_KEYDOWN = 1978, - GUIADAPTER_EVENT_KEYUP = 1979, - }; - - const unsigned int GUIADAPTER_DELTA_PIXEL = 2973; - const unsigned int GUIADAPTER_DELTA_LINE = 2974; - const unsigned int GUIADAPTER_DELTA_PAGE = 2975; - - struct GuiAdapterUiEvent; - struct GuiAdapterMouseEvent; - struct GuiAdapterWheelEvent; - struct GuiAdapterKeyboardEvent; - -#if 1 - typedef bool (*OnMouseEventFunc) (std::string canvasId, const GuiAdapterMouseEvent* mouseEvent, void* userData); - typedef bool (*OnMouseWheelFunc) (std::string canvasId, const GuiAdapterWheelEvent* wheelEvent, void* userData); - typedef bool (*OnKeyDownFunc) (std::string canvasId, const GuiAdapterKeyboardEvent* keyEvent, void* userData); - typedef bool (*OnKeyUpFunc) (std::string canvasId, const GuiAdapterKeyboardEvent* keyEvent, void* userData); - typedef bool (*OnAnimationFrameFunc)(double time, void* userData); - -#if ORTHANC_ENABLE_SDL == 1 - typedef bool (*OnSdlEventCallback) (std::string canvasId, const SDL_Event& sdlEvent, void* userData); - - typedef bool (*OnSdlWindowResizeFunc)(std::string canvasId, - const GuiAdapterUiEvent* uiEvent, - unsigned int width, - unsigned int height, - void* userData); - - -#endif - -#else - -#if ORTHANC_ENABLE_WASM == 1 - typedef EM_BOOL (*OnMouseEventFunc)(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); - typedef EM_BOOL (*OnMouseWheelFunc)(int eventType, const EmscriptenWheelEvent* wheelEvent, void* userData); - typedef EM_BOOL (*OnKeyDownFunc) (int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData); - typedef EM_BOOL (*OnKeyUpFunc) (int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData); - - typedef EM_BOOL (*OnAnimationFrameFunc)(double time, void* userData); - typedef EM_BOOL (*OnWindowResizeFunc)(int eventType, const EmscriptenUiEvent* uiEvent, void* userData); -#else - typedef bool (*OnMouseEventFunc)(int eventType, const SDL_Event* mouseEvent, void* userData); - typedef bool (*OnMouseWheelFunc)(int eventType, const SDL_Event* wheelEvent, void* userData); - typedef bool (*OnKeyDownFunc) (int eventType, const SDL_Event* keyEvent, void* userData); - typedef bool (*OnKeyUpFunc) (int eventType, const SDL_Event* keyEvent, void* userData); - - typedef bool (*OnAnimationFrameFunc)(double time, void* userData); - typedef bool (*OnWindowResizeFunc)(int eventType, const GuiAdapterUiEvent* uiEvent, void* userData); -#endif - -#endif - struct GuiAdapterMouseEvent - { - GuiAdapterHidEventType type; - //double timestamp; - //long screenX; - //long screenY; - //long clientX; - //long clientY; - bool ctrlKey; - bool shiftKey; - bool altKey; - //bool metaKey; - unsigned short button; - //unsigned short buttons; - //long movementX; - //long movementY; - long targetX; - long targetY; - // canvasX and canvasY are deprecated - there no longer exists a Module['canvas'] object, so canvasX/Y are no longer reported (register a listener on canvas directly to get canvas coordinates, or translate manually) - //long canvasX; - //long canvasY; - //long padding; - - public: - GuiAdapterMouseEvent() - : ctrlKey(false), - shiftKey(false), - altKey(false) - { - } - }; - - struct GuiAdapterWheelEvent { - GuiAdapterMouseEvent mouse; - double deltaX; - double deltaY; - unsigned long deltaMode; - }; - - // we don't use any data now - struct GuiAdapterUiEvent {}; - - // EmscriptenKeyboardEvent - struct GuiAdapterKeyboardEvent - { - GuiAdapterHidEventType type; - char sym[32]; - bool ctrlKey; - bool shiftKey; - bool altKey; - }; - - std::ostream& operator<<(std::ostream& os, const GuiAdapterKeyboardEvent& event); - std::ostream& operator<<(std::ostream& os, const GuiAdapterMouseEvent& event); - - /* - Mousedown event trigger when either the left or right (or middle) mouse is pressed - on the object; - - Mouseup event trigger when either the left or right (or middle) mouse is released - above the object after triggered mousedown event and held. - - Click event trigger when the only left mouse button is pressed and released on the - same object, requires the Mousedown and Mouseup event happened before Click event. - - The normal expect trigger order: onMousedown >> onMouseup >> onClick - - Testing in Chrome v58, the time between onMouseup and onClick events are around - 7ms to 15ms - - FROM: https://codingrepo.com/javascript/2017/05/19/javascript-difference-mousedown-mouseup-click-events/ - */ -#if ORTHANC_ENABLE_WASM == 1 - void ConvertFromPlatform(GuiAdapterUiEvent& dest, int eventType, const EmscriptenUiEvent& src); - - void ConvertFromPlatform(GuiAdapterMouseEvent& dest, int eventType, const EmscriptenMouseEvent& src); - - void ConvertFromPlatform(GuiAdapterWheelEvent& dest, int eventType, const EmscriptenWheelEvent& src); - - void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const EmscriptenKeyboardEvent& src); -#else - -# if ORTHANC_ENABLE_SDL == 1 - void ConvertFromPlatform(GuiAdapterMouseEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source); - - void ConvertFromPlatform(GuiAdapterWheelEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source); - - void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const SDL_Event& source); - -# endif - -#endif - - typedef void (*GuiAdapterRunFunc)(void*); - - class GuiAdapter - { - public: - GuiAdapter() - { - ORTHANC_ASSERT(s_instanceCount == 0); - s_instanceCount = 1; - } - - ~GuiAdapter() - { - s_instanceCount -= 1; - } - - /** - emscripten_set_resize_callback("EMSCRIPTEN_EVENT_TARGET_WINDOW", NULL, false, OnWindowResize); - - emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnXXXMouseWheel); - emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnXXXMouseWheel); - emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnXXXMouseWheel); - - emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); ---> NO! - emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); - - emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); - - SDL: - see https://wiki.libsdl.org/SDL_CaptureMouse - - */ - - void SetMouseDownCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); - void SetMouseDblClickCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); - void SetMouseMoveCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); - void SetMouseUpCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); - void SetWheelCallback (std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func); - void SetKeyDownCallback (std::string canvasId, void* userData, bool capture, OnKeyDownFunc func); - void SetKeyUpCallback (std::string canvasId, void* userData, bool capture, OnKeyUpFunc func); - -#if ORTHANC_ENABLE_SDL == 1 - - void SetGenericSdlEventCallback (std::string canvasId, void* userData, bool capture, OnSdlEventCallback func); - - typedef bool (*OnSdlEventCallback) (std::string canvasId, const SDL_Event& sdlEvent, void* userData); - - // if you pass "#window", then any Window resize will trigger the callback - // (this special string is converted to EMSCRIPTEN_EVENT_TARGET_WINDOW in DOM, when DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1) - void SetSdlResizeCallback(std::string canvasId, - void* userData, - bool capture, - OnSdlWindowResizeFunc func); -#endif - - void RequestAnimationFrame(OnAnimationFrameFunc func, void* userData); - - // TODO: implement and call to remove canvases [in SDL, although code should be generic] - void SetOnExitCallback(); - - /** - Under SDL, this function does NOT return until all windows have been closed. - Under wasm, it returns without doing anything, since the event loop is managed - by the browser. - */ - void Run(GuiAdapterRunFunc func = NULL, void* cookie = NULL); - - private: - -#if ORTHANC_ENABLE_SDL == 1 - /** - Gives observers a chance to react based on generic event handlers. This - is used, for instance, when the viewport lock interface is invalidated. - */ - void OnSdlGenericEvent(const SDL_Event& sdlEvent); -#endif - - /** - In SDL, this executes all the registered headers - */ - void OnAnimationFrame(); - - //void RequestAnimationFrame(OnAnimationFrameFunc func, void* userData); - std::vector > - animationFrameHandlers_; - - void OnResize(unsigned int width, unsigned int height); - -#if ORTHANC_ENABLE_SDL == 1 - template - struct EventHandlerData - { - EventHandlerData(std::string canvasName, Func func, void* userData) - : canvasName(canvasName) - , func(func) - , userData(userData) - { - } - - std::string canvasName; - Func func; - void* userData; - }; - std::vector > resizeHandlers_; - std::vector > mouseDownHandlers_; - std::vector > mouseDblCickHandlers_; - std::vector > mouseMoveHandlers_; - std::vector > mouseUpHandlers_; - std::vector > mouseWheelHandlers_; - std::vector > keyDownHandlers_; - std::vector > keyUpHandlers_; - std::vector > sdlEventHandlers_; - - /** - This executes all the registered headers if needed (in wasm, the browser - deals with this) - */ - void OnMouseEvent(uint32_t windowID, const GuiAdapterMouseEvent& event); - - void OnKeyboardEvent(uint32_t windowID, const GuiAdapterKeyboardEvent& event); - - /** - Same remark as OnMouseEvent - */ - void OnMouseWheelEvent(uint32_t windowID, const GuiAdapterWheelEvent& event); - -#endif - - /** - This executes all the registered headers if needed (in wasm, the browser - deals with this) - */ - void ViewportsUpdateSize(); - - static int s_instanceCount; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/CircleMeasureTracker.cpp --- a/Framework/Deprecated/Layers/CircleMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CircleMeasureTracker.h" - -#include -#include - -namespace Deprecated -{ - CircleMeasureTracker::CircleMeasureTracker(IStatusBar* statusBar, - const OrthancStone::CoordinateSystem3D& slice, - double x, - double y, - uint8_t red, - uint8_t green, - uint8_t blue, - const Orthanc::Font& font) : - statusBar_(statusBar), - slice_(slice), - x1_(x), - y1_(y), - x2_(x), - y2_(y), - font_(font) - { - color_[0] = red; - color_[1] = green; - color_[2] = blue; - } - - - void CircleMeasureTracker::Render(OrthancStone::CairoContext& context, - double zoom) - { - double x = (x1_ + x2_) / 2.0; - double y = (y1_ + y2_) / 2.0; - - OrthancStone::Vector tmp; - OrthancStone::LinearAlgebra::AssignVector(tmp, x2_ - x1_, y2_ - y1_); - double r = boost::numeric::ublas::norm_2(tmp) / 2.0; - - context.SetSourceColor(color_[0], color_[1], color_[2]); - - cairo_t* cr = context.GetObject(); - cairo_save(cr); - cairo_set_line_width(cr, 2.0 / zoom); - cairo_translate(cr, x, y); - cairo_arc(cr, 0, 0, r, 0, 2.0 * boost::math::constants::pi()); - cairo_stroke_preserve(cr); - cairo_stroke(cr); - cairo_restore(cr); - - context.DrawText(font_, FormatRadius(), x, y, OrthancStone::BitmapAnchor_Center); - } - - - double CircleMeasureTracker::GetRadius() const // In millimeters - { - OrthancStone::Vector a = slice_.MapSliceToWorldCoordinates(x1_, y1_); - OrthancStone::Vector b = slice_.MapSliceToWorldCoordinates(x2_, y2_); - return boost::numeric::ublas::norm_2(b - a) / 2.0; - } - - - std::string CircleMeasureTracker::FormatRadius() const - { - char buf[64]; - sprintf(buf, "%0.01f cm", GetRadius() / 10.0); - return buf; - } - - void CircleMeasureTracker::MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - x2_ = x; - y2_ = y; - - if (statusBar_ != NULL) - { - statusBar_->SetMessage("Circle radius: " + FormatRadius()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/CircleMeasureTracker.h --- a/Framework/Deprecated/Layers/CircleMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Widgets/IWorldSceneMouseTracker.h" -#include "../Viewport/IStatusBar.h" -#include "../../Toolbox/CoordinateSystem3D.h" - -#include - -namespace Deprecated -{ - class CircleMeasureTracker : public IWorldSceneMouseTracker - { - private: - IStatusBar* statusBar_; - OrthancStone::CoordinateSystem3D slice_; - double x1_; - double y1_; - double x2_; - double y2_; - uint8_t color_[3]; - const Orthanc::Font& font_; - - public: - CircleMeasureTracker(IStatusBar* statusBar, - const OrthancStone::CoordinateSystem3D& slice, - double x, - double y, - uint8_t red, - uint8_t green, - uint8_t blue, - const Orthanc::Font& font); - - virtual bool HasRender() const - { - return true; - } - - virtual void Render(OrthancStone::CairoContext& context, - double zoom); - - double GetRadius() const; // In millimeters - - std::string FormatRadius() const; - - virtual void MouseUp() - { - // Possibly create a new landmark "volume" with the circle in subclasses - } - - virtual void MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/ColorFrameRenderer.cpp --- a/Framework/Deprecated/Layers/ColorFrameRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ColorFrameRenderer.h" - -#include -#include -#include - -namespace Deprecated -{ - OrthancStone::CairoSurface* ColorFrameRenderer::GenerateDisplay(const RenderStyle& style) - { - std::unique_ptr display - (new OrthancStone::CairoSurface(frame_->GetWidth(), frame_->GetHeight(), false /* no alpha */)); - - Orthanc::ImageAccessor target; - display->GetWriteableAccessor(target); - - Orthanc::ImageProcessing::Convert(target, *frame_); - - return display.release(); - } - - - ColorFrameRenderer::ColorFrameRenderer(const Orthanc::ImageAccessor& frame, - const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality) : - FrameRenderer(framePlane, pixelSpacingX, pixelSpacingY, isFullQuality), - frame_(Orthanc::Image::Clone(frame)) - { - if (frame_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (frame_->GetFormat() != Orthanc::PixelFormat_RGB24) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/ColorFrameRenderer.h --- a/Framework/Deprecated/Layers/ColorFrameRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "FrameRenderer.h" - -namespace Deprecated -{ - class ColorFrameRenderer : public FrameRenderer - { - private: - std::unique_ptr frame_; // In RGB24 - - protected: - virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style); - - public: - ColorFrameRenderer(const Orthanc::ImageAccessor& frame, - const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.cpp --- a/Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomSeriesVolumeSlicer.h" - -#include "FrameRenderer.h" -#include "../Toolbox/DicomFrameConverter.h" - -#include -#include - -#include - -namespace Deprecated -{ - - void DicomSeriesVolumeSlicer::OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message) - { - if (message.GetOrigin().GetSlicesCount() > 0) - { - BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); - } - else - { - BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); - } - } - - void DicomSeriesVolumeSlicer::OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message) - { - BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); - } - - - class DicomSeriesVolumeSlicer::RendererFactory : public LayerReadyMessage::IRendererFactory - { - private: - const OrthancSlicesLoader::SliceImageReadyMessage& message_; - - public: - RendererFactory(const OrthancSlicesLoader::SliceImageReadyMessage& message) : - message_(message) - { - } - - virtual ILayerRenderer* CreateRenderer() const - { - bool isFull = (message_.GetEffectiveQuality() == SliceImageQuality_FullPng || - message_.GetEffectiveQuality() == SliceImageQuality_FullPam); - - return FrameRenderer::CreateRenderer(message_.GetImage(), message_.GetSlice(), isFull); - } - }; - - void DicomSeriesVolumeSlicer::OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message) - { - // first notify that the pixel data of the frame is ready (targeted to, i.e: an image cache) - BroadcastMessage(FrameReadyMessage(*this, message.GetImage(), - message.GetEffectiveQuality(), message.GetSlice())); - - // then notify that the layer is ready for rendering - RendererFactory factory(message); - BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, message.GetSlice().GetGeometry())); - } - - void DicomSeriesVolumeSlicer::OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message) - { - BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, message.GetSlice().GetGeometry())); - } - - - DicomSeriesVolumeSlicer::DicomSeriesVolumeSlicer() : - quality_(SliceImageQuality_FullPng) - { - } - - void DicomSeriesVolumeSlicer::Connect(boost::shared_ptr orthanc) - { - loader_.reset(new OrthancSlicesLoader(orthanc)); - Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceGeometryReady); - Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceGeometryError); - Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceImageReady); - Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceImageError); - } - - void DicomSeriesVolumeSlicer::LoadSeries(const std::string& seriesId) - { - if (loader_.get() == NULL) - { - // Should have called "Connect()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - loader_->ScheduleLoadSeries(seriesId); - } - - - void DicomSeriesVolumeSlicer::LoadInstance(const std::string& instanceId) - { - if (loader_.get() == NULL) - { - // Should have called "Connect()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - loader_->ScheduleLoadInstance(instanceId); - } - - - void DicomSeriesVolumeSlicer::LoadFrame(const std::string& instanceId, - unsigned int frame) - { - if (loader_.get() == NULL) - { - // Should have called "Connect()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - loader_->ScheduleLoadFrame(instanceId, frame); - } - - - bool DicomSeriesVolumeSlicer::GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice) - { - if (loader_.get() == NULL) - { - // Should have called "Connect()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - size_t index; - - if (loader_->IsGeometryReady() && - loader_->LookupSlice(index, viewportSlice)) - { - loader_->GetSlice(index).GetExtent(points); - return true; - } - else - { - return false; - } - } - - - void DicomSeriesVolumeSlicer::ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) - { - if (loader_.get() == NULL) - { - // Should have called "Connect()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - size_t index; - - if (loader_->IsGeometryReady() && - loader_->LookupSlice(index, viewportSlice)) - { - loader_->ScheduleLoadSliceImage(index, quality_); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.h --- a/Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IVolumeSlicer.h" -#include "../../Messages/ObserverBase.h" -#include "../Toolbox/IWebService.h" -#include "../Toolbox/OrthancSlicesLoader.h" -#include "../Toolbox/OrthancApiClient.h" - -namespace Deprecated -{ - // this class is in charge of loading a Frame. - // once it's been loaded (first the geometry and then the image), - // messages are sent to observers so they can use it - class DicomSeriesVolumeSlicer : - public IVolumeSlicer, - public OrthancStone::ObserverBase - //private OrthancSlicesLoader::ISliceLoaderObserver - { - public: - // TODO: Add "frame" and "instanceId" - class FrameReadyMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Orthanc::ImageAccessor& frame_; - SliceImageQuality imageQuality_; - const Slice& slice_; - - public: - FrameReadyMessage(DicomSeriesVolumeSlicer& origin, - const Orthanc::ImageAccessor& frame, - SliceImageQuality imageQuality, - const Slice& slice) : - OriginMessage(origin), - frame_(frame), - imageQuality_(imageQuality), - slice_(slice) - { - } - - const Orthanc::ImageAccessor& GetFrame() const - { - return frame_; - } - - SliceImageQuality GetImageQuality() const - { - return imageQuality_; - } - - const Slice& GetSlice() const - { - return slice_; - } - }; - - - private: - class RendererFactory; - - boost::shared_ptr loader_; - SliceImageQuality quality_; - - public: - DicomSeriesVolumeSlicer(); - - void Connect(boost::shared_ptr orthanc); - - void LoadSeries(const std::string& seriesId); - - void LoadInstance(const std::string& instanceId); - - void LoadFrame(const std::string& instanceId, - unsigned int frame); - - void SetImageQuality(SliceImageQuality quality) - { - quality_ = quality; - } - - SliceImageQuality GetImageQuality() const - { - return quality_; - } - - size_t GetSlicesCount() const - { - return loader_->GetSlicesCount(); - } - - const Slice& GetSlice(size_t slice) const - { - return loader_->GetSlice(slice); - } - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice); - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice); - -protected: - void OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message); - void OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message); - void OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message); - void OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/DicomStructureSetSlicer.cpp --- a/Framework/Deprecated/Layers/DicomStructureSetSlicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,183 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "DicomStructureSetSlicer.h" - -#include "../../Toolbox/DicomStructureSet.h" - -namespace Deprecated -{ - class DicomStructureSetSlicer::Renderer : public ILayerRenderer - { - private: - class Structure - { - private: - bool visible_; - uint8_t red_; - uint8_t green_; - uint8_t blue_; - std::string name_; - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - std::vector< std::vector > polygons_; -#else - std::vector< std::pair > segments_; -#endif - - public: - Structure(OrthancStone::DicomStructureSet& structureSet, - const OrthancStone::CoordinateSystem3D& plane, - size_t index) : - name_(structureSet.GetStructureName(index)) - { - structureSet.GetStructureColor(red_, green_, blue_, index); - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - visible_ = structureSet.ProjectStructure(polygons_, index, plane); -#else - visible_ = structureSet.ProjectStructure(segments_, index, plane); -#endif - } - - void Render(OrthancStone::CairoContext& context) - { - if (visible_) - { - cairo_t* cr = context.GetObject(); - - context.SetSourceColor(red_, green_, blue_); - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - for (size_t i = 0; i < polygons_.size(); i++) - { - cairo_move_to(cr, polygons_[i][0].x, polygons_[i][0].y); - for (size_t j = 0; j < polygons_[i].size(); j++) - { - cairo_line_to(cr, polygons_[i][j].x, polygons_[i][j].y); - } - cairo_line_to(cr, polygons_[i][0].x, polygons_[i][0].y); - cairo_stroke(cr); - } -#else - for (size_t i = 0; i < segments_.size(); i++) - { - cairo_move_to(cr, segments_[i].first.x, segments_[i].first.y); - cairo_line_to(cr, segments_[i].second.x, segments_[i].second.y); - cairo_stroke(cr); - } -#endif - } - } - }; - - typedef std::list Structures; - - OrthancStone::CoordinateSystem3D plane_; - Structures structures_; - - public: - Renderer(OrthancStone::DicomStructureSet& structureSet, - const OrthancStone::CoordinateSystem3D& plane) : - plane_(plane) - { - for (size_t k = 0; k < structureSet.GetStructuresCount(); k++) - { - structures_.push_back(new Structure(structureSet, plane, k)); - } - } - - virtual ~Renderer() - { - for (Structures::iterator it = structures_.begin(); - it != structures_.end(); ++it) - { - delete *it; - } - } - - virtual bool RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - cairo_set_line_width(context.GetObject(), 2.0f / view.GetZoom()); - - for (Structures::const_iterator it = structures_.begin(); - it != structures_.end(); ++it) - { - assert(*it != NULL); - (*it)->Render(context); - } - - return true; - } - - virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() - { - return plane_; - } - - virtual void SetLayerStyle(const RenderStyle& style) - { - } - - virtual bool IsFullQuality() - { - return true; - } - }; - - - class DicomStructureSetSlicer::RendererFactory : public LayerReadyMessage::IRendererFactory - { - private: - OrthancStone::DicomStructureSet& structureSet_; - const OrthancStone::CoordinateSystem3D& plane_; - - public: - RendererFactory(OrthancStone::DicomStructureSet& structureSet, - const OrthancStone::CoordinateSystem3D& plane) : - structureSet_(structureSet), - plane_(plane) - { - } - - virtual ILayerRenderer* CreateRenderer() const - { - return new Renderer(structureSet_, plane_); - } - }; - - - DicomStructureSetSlicer::DicomStructureSetSlicer(StructureSetLoader& loader) : - loader_(loader) - { - Register(loader_, &DicomStructureSetSlicer::OnStructureSetLoaded); - } - - - void DicomStructureSetSlicer::ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportPlane) - { - if (loader_.HasStructureSet()) - { - RendererFactory factory(loader_.GetStructureSet(), viewportPlane); - BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, viewportPlane)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/DicomStructureSetSlicer.h --- a/Framework/Deprecated/Layers/DicomStructureSetSlicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IVolumeSlicer.h" -#include "../Volumes/StructureSetLoader.h" - -namespace Deprecated -{ - class DicomStructureSetSlicer : - public IVolumeSlicer, - public OrthancStone::ObserverBase - { - private: - class Renderer; - class RendererFactory; - - StructureSetLoader& loader_; - - void OnStructureSetLoaded(const IVolumeLoader::ContentChangedMessage& message) - { - BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); - } - - public: - DicomStructureSetSlicer(StructureSetLoader& loader); - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportPlane) - { - return false; - } - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportPlane); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/FrameRenderer.cpp --- a/Framework/Deprecated/Layers/FrameRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "FrameRenderer.h" - -#include "GrayscaleFrameRenderer.h" -#include "ColorFrameRenderer.h" - -#include - -namespace Deprecated -{ - FrameRenderer::FrameRenderer(const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality) : - framePlane_(framePlane), - pixelSpacingX_(pixelSpacingX), - pixelSpacingY_(pixelSpacingY), - isFullQuality_(isFullQuality) - { - } - - - bool FrameRenderer::RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - if (!style_.visible_) - { - return true; - } - - if (display_.get() == NULL) - { - display_.reset(GenerateDisplay(style_)); - } - - assert(display_.get() != NULL); - - cairo_t *cr = context.GetObject(); - - cairo_save(cr); - - cairo_matrix_t transform; - cairo_matrix_init_identity(&transform); - cairo_matrix_scale(&transform, pixelSpacingX_, pixelSpacingY_); - cairo_matrix_translate(&transform, -0.5, -0.5); - cairo_transform(cr, &transform); - - //cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cr, display_->GetObject(), 0, 0); - - switch (style_.interpolation_) - { - case OrthancStone::ImageInterpolation_Nearest: - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); - break; - - case OrthancStone::ImageInterpolation_Bilinear: - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - cairo_paint_with_alpha(cr, style_.alpha_); - - if (style_.drawGrid_) - { - context.SetSourceColor(style_.drawColor_); - cairo_set_line_width(cr, 0.5 / view.GetZoom()); - - for (unsigned int x = 0; x <= display_->GetWidth(); x++) - { - cairo_move_to(cr, x, 0); - cairo_line_to(cr, x, display_->GetHeight()); - } - - for (unsigned int y = 0; y <= display_->GetHeight(); y++) - { - cairo_move_to(cr, 0, y); - cairo_line_to(cr, display_->GetWidth(), y); - } - - cairo_stroke(cr); - } - - cairo_restore(cr); - - return true; - } - - - void FrameRenderer::SetLayerStyle(const RenderStyle& style) - { - style_ = style; - display_.reset(NULL); - } - - - ILayerRenderer* FrameRenderer::CreateRenderer(const Orthanc::ImageAccessor& frame, - const Deprecated::Slice& framePlane, - bool isFullQuality) - { - if (frame.GetFormat() == Orthanc::PixelFormat_RGB24) - { - return new ColorFrameRenderer(frame, - framePlane.GetGeometry(), - framePlane.GetPixelSpacingX(), - framePlane.GetPixelSpacingY(), isFullQuality); - } - else - { - return new GrayscaleFrameRenderer(frame, - framePlane.GetConverter(), - framePlane.GetGeometry(), - framePlane.GetPixelSpacingX(), - framePlane.GetPixelSpacingY(), isFullQuality); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/FrameRenderer.h --- a/Framework/Deprecated/Layers/FrameRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRenderer.h" - -#include "../Toolbox/Slice.h" - -namespace Deprecated -{ - class FrameRenderer : public ILayerRenderer - { - private: - OrthancStone::CoordinateSystem3D framePlane_; - double pixelSpacingX_; - double pixelSpacingY_; - RenderStyle style_; - bool isFullQuality_; - std::unique_ptr display_; - - protected: - virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style) = 0; - - public: - FrameRenderer(const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality); - - virtual bool RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view); - - virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() - { - return framePlane_; - } - - virtual void SetLayerStyle(const RenderStyle& style); - - virtual bool IsFullQuality() - { - return isFullQuality_; - } - - // TODO: Avoid cloning the "frame" - static ILayerRenderer* CreateRenderer(const Orthanc::ImageAccessor& frame, - const Deprecated::Slice& framePlane, - bool isFullQuality); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/GrayscaleFrameRenderer.cpp --- a/Framework/Deprecated/Layers/GrayscaleFrameRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GrayscaleFrameRenderer.h" - -#include -#include - -namespace Deprecated -{ - OrthancStone::CairoSurface* GrayscaleFrameRenderer::GenerateDisplay(const RenderStyle& style) - { - assert(frame_->GetFormat() == Orthanc::PixelFormat_Float32); - - std::unique_ptr result; - - float windowCenter, windowWidth; - style.ComputeWindowing(windowCenter, windowWidth, - defaultWindowCenter_, defaultWindowWidth_); - - float x0 = windowCenter - windowWidth / 2.0f; - float x1 = windowCenter + windowWidth / 2.0f; - - //LOG(INFO) << "Window: " << x0 << " => " << x1; - - result.reset(new OrthancStone::CairoSurface(frame_->GetWidth(), frame_->GetHeight(), false /* no alpha */)); - - const uint8_t* lut = NULL; - if (style.applyLut_) - { - if (Orthanc::EmbeddedResources::GetFileResourceSize(style.lut_) != 3 * 256) - { - // Invalid colormap - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - lut = reinterpret_cast(Orthanc::EmbeddedResources::GetFileResourceBuffer(style.lut_)); - } - - Orthanc::ImageAccessor target; - result->GetWriteableAccessor(target); - - const unsigned int width = target.GetWidth(); - const unsigned int height = target.GetHeight(); - - for (unsigned int y = 0; y < height; y++) - { - const float* p = reinterpret_cast(frame_->GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < width; x++, p++, q += 4) - { - uint8_t v = 0; - if (windowWidth >= 0.001f) // Avoid division by zero - { - if (*p >= x1) - { - v = 255; - } - else if (*p <= x0) - { - v = 0; - } - else - { - // https://en.wikipedia.org/wiki/Linear_interpolation - v = static_cast(255.0f * (*p - x0) / (x1 - x0)); - } - - if (style.reverse_ ^ (photometric_ == Orthanc::PhotometricInterpretation_Monochrome1)) - { - v = 255 - v; - } - } - - if (style.applyLut_) - { - assert(lut != NULL); - q[3] = 255; - q[2] = lut[3 * v]; - q[1] = lut[3 * v + 1]; - q[0] = lut[3 * v + 2]; - } - else - { - q[3] = 255; - q[2] = v; - q[1] = v; - q[0] = v; - } - } - } - - return result.release(); - } - - - GrayscaleFrameRenderer::GrayscaleFrameRenderer(const Orthanc::ImageAccessor& frame, - const Deprecated::DicomFrameConverter& converter, - const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality) : - FrameRenderer(framePlane, pixelSpacingX, pixelSpacingY, isFullQuality), - frame_(Orthanc::Image::Clone(frame)), - defaultWindowCenter_(static_cast(converter.GetDefaultWindowCenter())), - defaultWindowWidth_(static_cast(converter.GetDefaultWindowWidth())), - photometric_(converter.GetPhotometricInterpretation()) - { - if (frame_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - converter.ConvertFrameInplace(frame_); - assert(frame_.get() != NULL); - - if (frame_->GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/GrayscaleFrameRenderer.h --- a/Framework/Deprecated/Layers/GrayscaleFrameRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "FrameRenderer.h" -#include "../Toolbox/DicomFrameConverter.h" - -namespace Deprecated -{ - class GrayscaleFrameRenderer : public FrameRenderer - { - private: - std::unique_ptr frame_; // In Float32 - float defaultWindowCenter_; - float defaultWindowWidth_; - Orthanc::PhotometricInterpretation photometric_; - - protected: - virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style); - - public: - GrayscaleFrameRenderer(const Orthanc::ImageAccessor& frame, - const Deprecated::DicomFrameConverter& converter, - const OrthancStone::CoordinateSystem3D& framePlane, - double pixelSpacingX, - double pixelSpacingY, - bool isFullQuality); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/ILayerRenderer.h --- a/Framework/Deprecated/Layers/ILayerRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoContext.h" -#include "../../Toolbox/CoordinateSystem3D.h" -#include "../Toolbox/ViewportGeometry.h" -#include "RenderStyle.h" - -namespace Deprecated -{ - class ILayerRenderer : public boost::noncopyable - { - public: - virtual ~ILayerRenderer() - { - } - - virtual bool RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view) = 0; - - virtual void SetLayerStyle(const RenderStyle& style) = 0; - - virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() = 0; - - virtual bool IsFullQuality() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/IVolumeSlicer.h --- a/Framework/Deprecated/Layers/IVolumeSlicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRenderer.h" -#include "../Toolbox/Slice.h" -#include "../../Messages/IObservable.h" -#include "../../Messages/IMessage.h" -#include "Images/Image.h" -#include - -namespace Deprecated -{ - class IVolumeSlicer : public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, IVolumeSlicer); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, IVolumeSlicer); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, IVolumeSlicer); - - class SliceContentChangedMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Deprecated::Slice& slice_; - - public: - SliceContentChangedMessage(IVolumeSlicer& origin, - const Deprecated::Slice& slice) : - OriginMessage(origin), - slice_(slice) - { - } - - const Deprecated::Slice& GetSlice() const - { - return slice_; - } - }; - - - class LayerReadyMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - public: - class IRendererFactory : public boost::noncopyable - { - public: - virtual ~IRendererFactory() - { - } - - virtual ILayerRenderer* CreateRenderer() const = 0; - }; - - private: - const IRendererFactory& factory_; - const OrthancStone::CoordinateSystem3D& slice_; - - public: - LayerReadyMessage(IVolumeSlicer& origin, - const IRendererFactory& rendererFactory, - const OrthancStone::CoordinateSystem3D& slice) : - OriginMessage(origin), - factory_(rendererFactory), - slice_(slice) - { - } - - ILayerRenderer* CreateRenderer() const - { - return factory_.CreateRenderer(); - } - - const OrthancStone::CoordinateSystem3D& GetSlice() const - { - return slice_; - } - }; - - - class LayerErrorMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const OrthancStone::CoordinateSystem3D& slice_; - - public: - LayerErrorMessage(IVolumeSlicer& origin, - const OrthancStone::CoordinateSystem3D& slice) : - OriginMessage(origin), - slice_(slice) - { - } - - const OrthancStone::CoordinateSystem3D& GetSlice() const - { - return slice_; - } - }; - - - virtual ~IVolumeSlicer() - { - } - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice) = 0; - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/LineLayerRenderer.cpp --- a/Framework/Deprecated/Layers/LineLayerRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LineLayerRenderer.h" - -namespace Deprecated -{ - LineLayerRenderer::LineLayerRenderer(double x1, - double y1, - double x2, - double y2, - const OrthancStone::CoordinateSystem3D& plane) : - x1_(x1), - y1_(y1), - x2_(x2), - y2_(y2), - plane_(plane) - { - RenderStyle style; - SetLayerStyle(style); - } - - - bool LineLayerRenderer::RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - if (visible_) - { - context.SetSourceColor(color_); - - cairo_t *cr = context.GetObject(); - cairo_set_line_width(cr, 1.0 / view.GetZoom()); - cairo_move_to(cr, x1_, y1_); - cairo_line_to(cr, x2_, y2_); - cairo_stroke(cr); - } - - return true; - } - - - void LineLayerRenderer::SetLayerStyle(const RenderStyle& style) - { - visible_ = style.visible_; - color_[0] = style.drawColor_[0]; - color_[1] = style.drawColor_[1]; - color_[2] = style.drawColor_[2]; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/LineLayerRenderer.h --- a/Framework/Deprecated/Layers/LineLayerRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRenderer.h" - -namespace Deprecated -{ - class LineLayerRenderer : public ILayerRenderer - { - private: - double x1_; - double y1_; - double x2_; - double y2_; - OrthancStone::CoordinateSystem3D plane_; - bool visible_; - uint8_t color_[3]; - - public: - LineLayerRenderer(double x1, - double y1, - double x2, - double y2, - const OrthancStone::CoordinateSystem3D& plane); - - virtual bool RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view); - - virtual void SetLayerStyle(const RenderStyle& style); - - virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() - { - return plane_; - } - - virtual bool IsFullQuality() - { - return true; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/LineMeasureTracker.cpp --- a/Framework/Deprecated/Layers/LineMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LineMeasureTracker.h" - -#include - -namespace Deprecated -{ - LineMeasureTracker::LineMeasureTracker(IStatusBar* statusBar, - const OrthancStone::CoordinateSystem3D& slice, - double x, - double y, - uint8_t red, - uint8_t green, - uint8_t blue, - const Orthanc::Font& font) : - statusBar_(statusBar), - slice_(slice), - x1_(x), - y1_(y), - x2_(x), - y2_(y), - font_(font) - { - color_[0] = red; - color_[1] = green; - color_[2] = blue; - } - - - void LineMeasureTracker::Render(OrthancStone::CairoContext& context, - double zoom) - { - context.SetSourceColor(color_[0], color_[1], color_[2]); - - cairo_t* cr = context.GetObject(); - cairo_set_line_width(cr, 2.0 / zoom); - cairo_move_to(cr, x1_, y1_); - cairo_line_to(cr, x2_, y2_); - cairo_stroke(cr); - - if (y2_ - y1_ < 0) - { - context.DrawText(font_, FormatLength(), x2_, y2_ - 5, OrthancStone::BitmapAnchor_BottomCenter); - } - else - { - context.DrawText(font_, FormatLength(), x2_, y2_ + 5, OrthancStone::BitmapAnchor_TopCenter); - } - } - - - double LineMeasureTracker::GetLength() const // In millimeters - { - OrthancStone::Vector a = slice_.MapSliceToWorldCoordinates(x1_, y1_); - OrthancStone::Vector b = slice_.MapSliceToWorldCoordinates(x2_, y2_); - return boost::numeric::ublas::norm_2(b - a); - } - - - std::string LineMeasureTracker::FormatLength() const - { - char buf[64]; - sprintf(buf, "%0.01f cm", GetLength() / 10.0); - return buf; - } - - void LineMeasureTracker::MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - x2_ = x; - y2_ = y; - - if (statusBar_ != NULL) - { - statusBar_->SetMessage("Line length: " + FormatLength()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/LineMeasureTracker.h --- a/Framework/Deprecated/Layers/LineMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Widgets/IWorldSceneMouseTracker.h" - -#include "../Viewport/IStatusBar.h" -#include "../../Toolbox/CoordinateSystem3D.h" - -namespace Deprecated -{ - class LineMeasureTracker : public IWorldSceneMouseTracker - { - private: - IStatusBar* statusBar_; - OrthancStone::CoordinateSystem3D slice_; - double x1_; - double y1_; - double x2_; - double y2_; - uint8_t color_[3]; - unsigned int fontSize_; - const Orthanc::Font& font_; - - public: - LineMeasureTracker(IStatusBar* statusBar, - const OrthancStone::CoordinateSystem3D& slice, - double x, - double y, - uint8_t red, - uint8_t green, - uint8_t blue, - const Orthanc::Font& font); - - virtual bool HasRender() const - { - return true; - } - - virtual void Render(OrthancStone::CairoContext& context, - double zoom); - - double GetLength() const; // In millimeters - - std::string FormatLength() const; - - virtual void MouseUp() - { - // Possibly create a new landmark "volume" with the line in subclasses - } - - virtual void MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/RenderStyle.cpp --- a/Framework/Deprecated/Layers/RenderStyle.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RenderStyle.h" - -#include "../../Volumes/ImageBuffer3D.h" -#include "../Toolbox/DicomFrameConverter.h" - -#include - -namespace Deprecated -{ - RenderStyle::RenderStyle() - { - visible_ = true; - reverse_ = false; - windowing_ = OrthancStone::ImageWindowing_Custom; - alpha_ = 1; - applyLut_ = false; - lut_ = Orthanc::EmbeddedResources::COLORMAP_HOT; - drawGrid_ = false; - drawColor_[0] = 255; - drawColor_[1] = 255; - drawColor_[2] = 255; - customWindowCenter_ = 128; - customWindowWidth_ = 256; - interpolation_ = OrthancStone::ImageInterpolation_Nearest; - fontSize_ = 14; - } - - - void RenderStyle::ComputeWindowing(float& targetCenter, - float& targetWidth, - float defaultCenter, - float defaultWidth) const - { - if (windowing_ == OrthancStone::ImageWindowing_Custom) - { - targetCenter = customWindowCenter_; - targetWidth = customWindowWidth_; - } - else - { - return ::OrthancStone::ComputeWindowing - (targetCenter, targetWidth, windowing_, defaultCenter, defaultWidth); - } - } - - - void RenderStyle::SetColor(uint8_t red, - uint8_t green, - uint8_t blue) - { - drawColor_[0] = red; - drawColor_[1] = green; - drawColor_[2] = blue; - } - - - bool RenderStyle::FitRange(const OrthancStone::ImageBuffer3D& image, - const DicomFrameConverter& converter) - { - float minValue, maxValue; - - windowing_ = OrthancStone::ImageWindowing_Custom; - - if (image.GetRange(minValue, maxValue)) - { - // casting the narrower type to wider before calling the + operator - // will prevent overflowing (this is why the cast to double is only - // done on the first operand) - customWindowCenter_ = static_cast( - converter.Apply((static_cast(minValue) + maxValue) / 2.0)); - - customWindowWidth_ = static_cast( - converter.Apply(static_cast(maxValue) - minValue)); - - if (customWindowWidth_ > 1) - { - return true; - } - } - - customWindowCenter_ = 128.0; - customWindowWidth_ = 256.0; - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/RenderStyle.h --- a/Framework/Deprecated/Layers/RenderStyle.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../StoneEnumerations.h" -#include "../../Volumes/ImageBuffer3D.h" -#include "../Toolbox/DicomFrameConverter.h" - -#include - -#include - -namespace Deprecated -{ - struct RenderStyle - { - bool visible_; - bool reverse_; - OrthancStone::ImageWindowing windowing_; - float alpha_; // In [0,1] - bool applyLut_; - Orthanc::EmbeddedResources::FileResourceId lut_; - bool drawGrid_; - uint8_t drawColor_[3]; - float customWindowCenter_; - float customWindowWidth_; - OrthancStone::ImageInterpolation interpolation_; - unsigned int fontSize_; - - RenderStyle(); - - void ComputeWindowing(float& targetCenter, - float& targetWidth, - float defaultCenter, - float defaultWidth) const; - - void SetColor(uint8_t red, - uint8_t green, - uint8_t blue); - - bool FitRange(const OrthancStone::ImageBuffer3D& image, - const DicomFrameConverter& converter); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SeriesFrameRendererFactory.cpp --- a/Framework/Deprecated/Layers/SeriesFrameRendererFactory.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SeriesFrameRendererFactory.h" - -#include "FrameRenderer.h" - -#include -#include -#include -#include -#include - - -namespace Deprecated -{ - void SeriesFrameRendererFactory::ReadCurrentFrameDataset(size_t frame) - { - if (currentDataset_.get() != NULL && - (fast_ || currentFrame_ == frame)) - { - // The frame has not changed since the previous call, no need to - // update the DICOM dataset - return; - } - - currentDataset_.reset(loader_->DownloadDicom(frame)); - currentFrame_ = frame; - - if (currentDataset_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - void SeriesFrameRendererFactory::GetCurrentPixelSpacing(double& spacingX, - double& spacingY) const - { - if (currentDataset_.get() == NULL) - { - // There was no previous call "ReadCurrentFrameDataset()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - GeometryToolbox::GetPixelSpacing(spacingX, spacingY, *currentDataset_); - } - - - double SeriesFrameRendererFactory::GetCurrentSliceThickness() const - { - if (currentDataset_.get() == NULL) - { - // There was no previous call "ReadCurrentFrameDataset()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - try - { - OrthancPlugins::DicomDatasetReader reader(*currentDataset_); - - double thickness; - if (reader.GetDoubleValue(thickness, OrthancPlugins::DICOM_TAG_SLICE_THICKNESS)) - { - return thickness; - } - } - catch (ORTHANC_PLUGINS_EXCEPTION_CLASS& e) - { - } - - // Some arbitrary large slice thickness - return std::numeric_limits::infinity(); - } - - - SeriesFrameRendererFactory::SeriesFrameRendererFactory(ISeriesLoader* loader, // Takes ownership - bool fast) : - loader_(loader), - currentFrame_(0), - fast_(fast) - { - if (loader == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - bool SeriesFrameRendererFactory::GetExtent(double& x1, - double& y1, - double& x2, - double& y2, - const SliceGeometry& viewportSlice) - { - if (currentDataset_.get() == NULL) - { - // There has been no previous call to - // "CreateLayerRenderer". Read some arbitrary DICOM frame, the - // one at the middle of the series. - unsigned int depth = loader_->GetGeometry().GetSliceCount(); - ReadCurrentFrameDataset(depth / 2); - } - - double spacingX, spacingY; - GetCurrentPixelSpacing(spacingX, spacingY); - - return FrameRenderer::ComputeFrameExtent(x1, y1, x2, y2, - viewportSlice, - loader_->GetGeometry().GetSlice(0), - loader_->GetWidth(), - loader_->GetHeight(), - spacingX, spacingY); - } - - - ILayerRenderer* SeriesFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) - { - size_t closest; - double distance; - - bool isOpposite; - if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, loader_->GetGeometry().GetNormal(), viewportSlice.GetNormal()) || - !loader_->GetGeometry().ComputeClosestSlice(closest, distance, viewportSlice.GetOrigin())) - { - // Unable to compute the slice in the series that is the - // closest to the slice displayed by the viewport - return NULL; - } - - ReadCurrentFrameDataset(closest); - assert(currentDataset_.get() != NULL); - - double spacingX, spacingY; - GetCurrentPixelSpacing(spacingX, spacingY); - - if (distance <= GetCurrentSliceThickness() / 2.0) - { - SliceGeometry frameSlice(*currentDataset_); - return FrameRenderer::CreateRenderer(loader_->DownloadFrame(closest), - frameSlice, - *currentDataset_, - spacingX, spacingY, - true); - } - else - { - // The closest slice of the series is too far away from the - // slice displayed by the viewport - return NULL; - } - } - - - ISliceableVolume& SeriesFrameRendererFactory::GetSourceVolume() const - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SeriesFrameRendererFactory.h --- a/Framework/Deprecated/Layers/SeriesFrameRendererFactory.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRendererFactory.h" - -#include "../Toolbox/ISeriesLoader.h" - -namespace Deprecated -{ - class SeriesFrameRendererFactory : public ILayerRendererFactory - { - private: - std::unique_ptr loader_; - size_t currentFrame_; - bool fast_; - - std::unique_ptr currentDataset_; - - void ReadCurrentFrameDataset(size_t frame); - - void GetCurrentPixelSpacing(double& spacingX, - double& spacingY) const; - - double GetCurrentSliceThickness() const; - - public: - SeriesFrameRendererFactory(ISeriesLoader* loader, // Takes ownership - bool fast); - - virtual bool GetExtent(double& x1, - double& y1, - double& x2, - double& y2, - const SliceGeometry& viewportSlice); - - virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); - - virtual bool HasSourceVolume() const - { - return false; - } - - virtual ISliceableVolume& GetSourceVolume() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SingleFrameRendererFactory.cpp --- a/Framework/Deprecated/Layers/SingleFrameRendererFactory.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SingleFrameRendererFactory.h" - -#include "FrameRenderer.h" -#include "../Toolbox/MessagingToolbox.h" -#include "../Toolbox/DicomFrameConverter.h" - -#include -#include -#include - -namespace Deprecated -{ - SingleFrameRendererFactory::SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId, - unsigned int frame) : - orthanc_(orthanc), - instance_(instanceId), - frame_(frame) - { - dicom_.reset(new OrthancPlugins::FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags")); - - DicomFrameConverter converter; - converter.ReadParameters(*dicom_); - format_ = converter.GetExpectedPixelFormat(); - } - - - bool SingleFrameRendererFactory::GetExtent(double& x1, - double& y1, - double& x2, - double& y2, - const SliceGeometry& viewportSlice) - { - // Assume that PixelSpacingX == PixelSpacingY == 1 - - OrthancPlugins::DicomDatasetReader reader(*dicom_); - - unsigned int width, height; - - if (!reader.GetUnsignedIntegerValue(width, OrthancPlugins::DICOM_TAG_COLUMNS) || - !reader.GetUnsignedIntegerValue(height, OrthancPlugins::DICOM_TAG_ROWS)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - x1 = 0; - y1 = 0; - x2 = static_cast(width); - y2 = static_cast(height); - - return true; - } - - - ILayerRenderer* SingleFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) - { - SliceGeometry frameSlice(*dicom_); - return FrameRenderer::CreateRenderer(MessagingToolbox::DecodeFrame(orthanc_, instance_, frame_, format_), - frameSlice, *dicom_, 1, 1, true); - } - - - ISliceableVolume& SingleFrameRendererFactory::GetSourceVolume() const - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SingleFrameRendererFactory.h --- a/Framework/Deprecated/Layers/SingleFrameRendererFactory.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRendererFactory.h" -#include - -namespace Deprecated -{ - class SingleFrameRendererFactory : public ILayerRendererFactory - { - private: - OrthancPlugins::IOrthancConnection& orthanc_; - std::unique_ptr dicom_; - - std::string instance_; - unsigned int frame_; - Orthanc::PixelFormat format_; - - public: - SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId, - unsigned int frame); - - const OrthancPlugins::IDicomDataset& GetDataset() const - { - return *dicom_; - } - - SliceGeometry GetSliceGeometry() - { - return SliceGeometry(*dicom_); - } - - virtual bool GetExtent(double& x1, - double& y1, - double& x2, - double& y2, - const SliceGeometry& viewportSlice); - - virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); - - virtual bool HasSourceVolume() const - { - return false; - } - - virtual ISliceableVolume& GetSourceVolume() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SliceOutlineRenderer.cpp --- a/Framework/Deprecated/Layers/SliceOutlineRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SliceOutlineRenderer.h" - -namespace Deprecated -{ - bool SliceOutlineRenderer::RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - if (style_.visible_) - { - cairo_t *cr = context.GetObject(); - cairo_save(cr); - - context.SetSourceColor(style_.drawColor_); - - double x1 = -0.5 * pixelSpacingX_; - double y1 = -0.5 * pixelSpacingY_; - - cairo_set_line_width(cr, 1.0 / view.GetZoom()); - cairo_rectangle(cr, x1, y1, - static_cast(width_) * pixelSpacingX_, - static_cast(height_) * pixelSpacingY_); - - double handleSize = 10.0f / view.GetZoom(); - cairo_move_to(cr, x1 + handleSize, y1); - cairo_line_to(cr, x1, y1 + handleSize); - - cairo_stroke(cr); - cairo_restore(cr); - } - - return true; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Layers/SliceOutlineRenderer.h --- a/Framework/Deprecated/Layers/SliceOutlineRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerRenderer.h" -#include "../Toolbox/Slice.h" - -namespace Deprecated -{ - class SliceOutlineRenderer : public ILayerRenderer - { - private: - OrthancStone::CoordinateSystem3D geometry_; - double pixelSpacingX_; - double pixelSpacingY_; - unsigned int width_; - unsigned int height_; - RenderStyle style_; - - public: - SliceOutlineRenderer(const Slice& slice) : - geometry_(slice.GetGeometry()), - pixelSpacingX_(slice.GetPixelSpacingX()), - pixelSpacingY_(slice.GetPixelSpacingY()), - width_(slice.GetWidth()), - height_(slice.GetHeight()) - { - } - - virtual bool RenderLayer(OrthancStone::CairoContext& context, - const ViewportGeometry& view); - - virtual void SetLayerStyle(const RenderStyle& style) - { - style_ = style; - } - - virtual const OrthancStone::CoordinateSystem3D& GetLayerSlice() - { - return geometry_; - } - - virtual bool IsFullQuality() - { - return true; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Loaders/DicomStructureSetLoader2.cpp --- a/Framework/Deprecated/Loaders/DicomStructureSetLoader2.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructureSetLoader2.h" - -#include "../Messages/IObservable.h" -#include "../Oracle/IOracle.h" -#include "../Oracle/OracleCommandExceptionMessage.h" - -namespace Deprecated -{ - - DicomStructureSetLoader2::DicomStructureSetLoader2( - DicomStructureSet2& structureSet - , IOracle& oracle - , IObservable& oracleObservable) - : IObserver(oracleObservable.GetBroker()) - , IObservable(oracleObservable.GetBroker()) - , structureSet_(structureSet) - , oracle_(oracle) - , oracleObservable_(oracleObservable) - , structuresReady_(false) - { - LOG(TRACE) << "DicomStructureSetLoader2(" << std::hex << this << std::dec << ")::DicomStructureSetLoader2()"; - - oracleObservable.RegisterObserverCallback( - new Callable - (*this, &DicomStructureSetLoader2::HandleSuccessMessage)); - - oracleObservable.RegisterObserverCallback( - new Callable - (*this, &DicomStructureSetLoader2::HandleExceptionMessage)); - } - - DicomStructureSetLoader2::~DicomStructureSetLoader2() - { - LOG(TRACE) << "DicomStructureSetLoader2(" << std::hex << this << std::dec << ")::~DicomStructureSetLoader2()"; - oracleObservable_.Unregister(this); - } - - void DicomStructureSetLoader2::LoadInstanceFromString(const std::string& body) - { - OrthancPlugins::FullOrthancDataset dicom(body); - //loader.content_.reset(new DicomStructureSet(dicom)); - structureSet_.Clear(); - structureSet_.SetContents(dicom); - SetStructuresReady(); - } - - void DicomStructureSetLoader2::HandleSuccessMessage(const OrthancRestApiCommand::SuccessMessage& message) - { - const std::string& body = message.GetAnswer(); - LoadInstanceFromString(body); - } - - void DicomStructureSetLoader2::HandleExceptionMessage(const OracleCommandExceptionMessage& message) - { - LOG(ERROR) << "DicomStructureSetLoader2::HandleExceptionMessage: error when trying to load data. " - << "Error: " << message.GetException().What() << " Details: " - << message.GetException().GetDetails(); - } - - void DicomStructureSetLoader2::LoadInstance(const std::string& instanceId) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - - std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; - - command->SetUri(uri); - oracle_.Schedule(*this, command.release()); - } - - void DicomStructureSetLoader2::SetStructuresReady() - { - structuresReady_ = true; - } - - bool DicomStructureSetLoader2::AreStructuresReady() const - { - return structuresReady_; - } - - /* - - void LoaderStateMachine::HandleExceptionMessage(const OracleCommandExceptionMessage& message) - { - LOG(ERROR) << "LoaderStateMachine::HandleExceptionMessage: error in the state machine, stopping all processing"; - LOG(ERROR) << "Error: " << message.GetException().What() << " Details: " << - message.GetException().GetDetails(); - Clear(); - } - - LoaderStateMachine::~LoaderStateMachine() - { - Clear(); - } - - - */ - -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Loaders/DicomStructureSetLoader2.h --- a/Framework/Deprecated/Loaders/DicomStructureSetLoader2.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "../Toolbox/DicomStructureSet2.h" -#include "../Messages/IMessage.h" -#include "../Messages/IObserver.h" -#include "../Messages/IObservable.h" -#include "../Oracle/OrthancRestApiCommand.h" - -#include - -namespace Deprecated -{ - class IOracle; - class IObservable; - class OrthancRestApiCommand; - class OracleCommandExceptionMessage; - - class DicomStructureSetLoader2 : public IObserver, public IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresReady, DicomStructureSetLoader2); - - /** - Warning: the structureSet, oracle and oracleObservable objects must live - at least as long as this object (TODO: shared_ptr?) - */ - DicomStructureSetLoader2(DicomStructureSet2& structureSet, IOracle& oracle, IObservable& oracleObservable); - - ~DicomStructureSetLoader2(); - - void LoadInstance(const std::string& instanceId); - - /** Internal use */ - void LoadInstanceFromString(const std::string& body); - - void SetStructuresReady(); - bool AreStructuresReady() const; - - private: - /** - Called back by the oracle when data is ready! - */ - void HandleSuccessMessage(const OrthancRestApiCommand::SuccessMessage& message); - - /** - Called back by the oracle when shit hits the fan - */ - void HandleExceptionMessage(const OracleCommandExceptionMessage& message); - - /** - The structure set that will be (cleared and) filled with data from the - loader - */ - DicomStructureSet2& structureSet_; - - IOracle& oracle_; - IObservable& oracleObservable_; - bool structuresReady_; - }; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Messages/LockingEmitter.cpp --- a/Framework/Deprecated/Messages/LockingEmitter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "LockingEmitter.h" - -#include - -namespace Deprecated -{ - void LockingEmitter::EmitMessage(boost::weak_ptr observer, - const OrthancStone::IMessage& message) - { - try - { - boost::unique_lock lock(mutex_); - oracleObservable_.EmitMessage(observer, message); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while emitting a message: " << e.What(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Messages/LockingEmitter.h --- a/Framework/Deprecated/Messages/LockingEmitter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include - -#include "../../Messages/IMessageEmitter.h" -#include "../../Messages/IObservable.h" - -#include - -namespace Deprecated -{ - /** - * This class is used when using the ThreadedOracle : since messages - * can be sent from multiple Oracle threads, this IMessageEmitter - * implementation serializes the callbacks. - * - * The internal mutex used in Oracle messaging can also be used to - * protect the application data. Thus, this class can be used as a single - * application-wide mutex. - */ - class LockingEmitter : public OrthancStone::IMessageEmitter - { - private: - boost::shared_mutex mutex_; - OrthancStone::IObservable oracleObservable_; - - public: - virtual void EmitMessage(boost::weak_ptr observer, - const OrthancStone::IMessage& message) ORTHANC_OVERRIDE; - - - class ReaderLock : public boost::noncopyable - { - private: - LockingEmitter& that_; - boost::shared_lock lock_; - - public: - ReaderLock(LockingEmitter& that) : - that_(that), - lock_(that.mutex_) - { - } - }; - - - class WriterLock : public boost::noncopyable - { - private: - LockingEmitter& that_; - boost::unique_lock lock_; - - public: - WriterLock(LockingEmitter& that) : - that_(that), - lock_(that.mutex_) - { - } - - OrthancStone::IObservable& GetOracleObservable() - { - return that_.oracleObservable_; - } - }; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyAlphaLayer.cpp --- a/Framework/Deprecated/Radiography/RadiographyAlphaLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyAlphaLayer.h" - -#include "RadiographyScene.h" -#include "../Toolbox/ImageGeometry.h" - -#include -#include -#include - - -namespace OrthancStone -{ - - void RadiographyAlphaLayer::SetAlpha(Orthanc::ImageAccessor* image) - { - std::unique_ptr raii(image); - - if (image == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - if (image->GetFormat() != Orthanc::PixelFormat_Grayscale8) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - SetSize(image->GetWidth(), image->GetHeight()); - -#if __cplusplus < 201103L - alpha_.reset(raii.release()); -#else - alpha_ = std::move(raii); -#endif - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyAlphaLayer::Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const - { - if (alpha_.get() == NULL) - { - return; - } - - if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - unsigned int cropX, cropY, cropWidth, cropHeight; - GetCrop(cropX, cropY, cropWidth, cropHeight); - - const AffineTransform2D t = AffineTransform2D::Combine( - viewTransform, GetTransform(), - AffineTransform2D::CreateOffset(cropX, cropY)); - - Orthanc::ImageAccessor cropped; - alpha_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); - - Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); - - unsigned int x1, y1, x2, y2; - - if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, - t.GetHomogeneousMatrix(), - cropped.GetWidth(), - cropped.GetHeight(), - buffer.GetWidth(), - buffer.GetHeight())) - { - return; // layer is outside the buffer - } - - t.Apply(tmp, cropped, interpolation, true /* clear */); - - float value = foreground_; - - if (!applyWindowing) // if applying the windowing, it means we are ie rendering the image for a realtime visualization -> the foreground_ value is the value we want to see on the screen -> don't change it - { - // if not applying the windowing, it means ie that we are saving a dicom image to file and the windowing will be applied by a viewer later on -> we want the "foreground" value to be correct once the windowing will be applied - value = windowCenter - windowWidth/2 + (foreground_ / 65535.0f) * windowWidth; - - if (value < 0.0f) - { - value = 0.0f; - } - if (value > 65535.0f) - { - value = 65535.0f; - } - } - - for (unsigned int y = y1; y <= y2; y++) - { - float *q = reinterpret_cast(buffer.GetRow(y)) + x1; - const uint8_t *p = reinterpret_cast(tmp.GetRow(y)) + x1; - - for (unsigned int x = x1; x <= x2; x++, p++, q++) - { - float a = static_cast(*p) / 255.0f; - - *q = (a * value + (1.0f - a) * (*q)); - } - } - } - - bool RadiographyAlphaLayer::GetRange(float& minValue, - float& maxValue) const - { - minValue = 0; - maxValue = 0; - - if (foreground_ < 0) - { - minValue = foreground_; - } - - if (foreground_ > 0) - { - maxValue = foreground_; - } - - return true; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyAlphaLayer.h --- a/Framework/Deprecated/Radiography/RadiographyAlphaLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyLayer.h" - -#include - -namespace OrthancStone -{ - class RadiographyScene; - - // creates a transparent layer whose alpha channel is provided as a UINT8 image to SetAlpha. - // The color of the "mask" is either defined by a ForegroundValue or by the center value of the - // windowing from the scene. - class RadiographyAlphaLayer : public RadiographyLayer - { - private: - std::unique_ptr alpha_; // Grayscale8 in the range [0, 255] 0 = transparent, 255 = opaque -> the foreground value will be displayed - float foreground_; // in the range [0.0, 65535.0] - - public: - RadiographyAlphaLayer(const RadiographyScene& scene) : - RadiographyLayer(scene), - foreground_(0) - { - } - - - void SetForegroundValue(float foreground) - { - foreground_ = foreground; - } - - float GetForegroundValue() const - { - return foreground_; - } - - void SetAlpha(Orthanc::ImageAccessor* image); - - virtual bool GetDefaultWindowing(float& center, - float& width) const - { - return false; - } - - - virtual void Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const; - - virtual bool GetRange(float& minValue, - float& maxValue) const; - - const Orthanc::ImageAccessor& GetAlpha() const - { - return *(alpha_.get()); - } - - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyDicomLayer.cpp --- a/Framework/Deprecated/Radiography/RadiographyDicomLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyDicomLayer.h" - -#include "RadiographyScene.h" -#include "../Deprecated/Toolbox/DicomFrameConverter.h" -#include "../Toolbox/ImageGeometry.h" - -#include -#include -#include -#include - -static OrthancPlugins::DicomTag ConvertTag(const Orthanc::DicomTag& tag) -{ - return OrthancPlugins::DicomTag(tag.GetGroup(), tag.GetElement()); -} - -namespace OrthancStone -{ - - void RadiographyDicomLayer::ApplyConverter() - { - if (source_.get() != NULL && - converter_.get() != NULL) - { - converted_.reset(converter_->ConvertFrame(*source_)); - } - } - - - RadiographyDicomLayer::RadiographyDicomLayer(const RadiographyScene& scene) : - RadiographyLayer(scene) - { - - } - - void RadiographyDicomLayer::SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset) - { - converter_.reset(new Deprecated::DicomFrameConverter); - converter_->ReadParameters(dataset); - ApplyConverter(); - - std::string tmp; - Vector pixelSpacing; - - if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PIXEL_SPACING)) && - LinearAlgebra::ParseVector(pixelSpacing, tmp) && - pixelSpacing.size() == 2) - { - SetPixelSpacing(pixelSpacing[0], pixelSpacing[1]); - } - - OrthancPlugins::DicomDatasetReader reader(dataset); - - unsigned int width, height; - if (!reader.GetUnsignedIntegerValue(width, ConvertTag(Orthanc::DICOM_TAG_COLUMNS)) || - !reader.GetUnsignedIntegerValue(height, ConvertTag(Orthanc::DICOM_TAG_ROWS))) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - SetSize(width, height); - } - - if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION))) - { - if (tmp == "MONOCHROME1") - { - SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode_Monochrome1); - } - else if (tmp == "MONOCHROME2") - { - SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode_Monochrome2); - } - } - } - - void RadiographyDicomLayer::SetSourceImage(Orthanc::ImageAccessor* image) // Takes ownership - { - std::unique_ptr raii(image); - - if (image == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - SetSize(image->GetWidth(), image->GetHeight()); - -#if __cplusplus < 201103L - source_.reset(raii.release()); -#else - source_ = std::move(raii); -#endif - - ApplyConverter(); - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyDicomLayer::SetSourceImage(Orthanc::ImageAccessor* image, double newPixelSpacingX, double newPixelSpacingY, bool emitLayerEditedEvent) // Takes ownership - { - std::unique_ptr raii(image); - - if (image == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - SetSize(image->GetWidth(), image->GetHeight(), false); - -#if __cplusplus < 201103L - source_.reset(raii.release()); -#else - source_ = std::move(raii); -#endif - - ApplyConverter(); - - SetPixelSpacing(newPixelSpacingX, newPixelSpacingY, false); - - if (emitLayerEditedEvent) - { - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - } - - - void RadiographyDicomLayer::SetDicomFrameConverter(Deprecated::DicomFrameConverter* converter) - { - converter_.reset(converter); - } - - void RadiographyDicomLayer::Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const - { - if (converted_.get() != NULL) - { - if (converted_->GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - unsigned int cropX, cropY, cropWidth, cropHeight; - GetCrop(cropX, cropY, cropWidth, cropHeight); - - AffineTransform2D t = AffineTransform2D::Combine( - viewTransform, GetTransform(), - AffineTransform2D::CreateOffset(cropX, cropY)); - - Orthanc::ImageAccessor cropped; - converted_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); - - unsigned int x1, y1, x2, y2; - if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, - t.GetHomogeneousMatrix(), - cropped.GetWidth(), - cropped.GetHeight(), - buffer.GetWidth(), - buffer.GetHeight())) - { - return; // layer is outside the buffer - } - - t.Apply(buffer, cropped, interpolation, false); - - if (applyWindowing) - { - // apply windowing but stay in the range [0.0, 65535.0] - float w0 = windowCenter - windowWidth / 2.0f; - float w1 = windowCenter + windowWidth / 2.0f; - - if (windowWidth >= 0.001f) // Avoid division by zero at (*) - { - float scaling = 1.0f / (w1 - w0) * 65535.0f; - for (unsigned int y = y1; y <= y2; y++) - { - float* p = reinterpret_cast(buffer.GetRow(y)) + x1; - - for (unsigned int x = x1; x <= x2; x++, p++) - { - if (*p >= w1) - { - *p = 65535.0; - } - else if (*p <= w0) - { - *p = 0; - } - else - { - // https://en.wikipedia.org/wiki/Linear_interpolation - *p = scaling * (*p - w0); // (*) - } - } - } - } - } - - } - } - - - bool RadiographyDicomLayer::GetDefaultWindowing(float& center, - float& width) const - { - if (converter_.get() != NULL && - converter_->HasDefaultWindow()) - { - center = static_cast(converter_->GetDefaultWindowCenter()); - width = static_cast(converter_->GetDefaultWindowWidth()); - return true; - } - else - { - return false; - } - } - - - bool RadiographyDicomLayer::GetRange(float& minValue, - float& maxValue) const - { - if (converted_.get() != NULL) - { - if (converted_->GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, *converted_); - return true; - } - else - { - return false; - } - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyDicomLayer.h --- a/Framework/Deprecated/Radiography/RadiographyDicomLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Deprecated/Toolbox/DicomFrameConverter.h" -#include "RadiographyLayer.h" - -#include - -namespace OrthancStone -{ - class RadiographyScene; - - class RadiographyDicomLayer : public RadiographyLayer - { - private: - std::unique_ptr source_; // Content of PixelData - std::unique_ptr converter_; - std::unique_ptr converted_; // Float32 - std::string instanceId_; - unsigned int frame_; - - void ApplyConverter(); - - public: - RadiographyDicomLayer(const RadiographyScene& scene); - - void SetInstance(const std::string& instanceId, unsigned int frame) - { - instanceId_ = instanceId; - frame_ = frame; - } - - std::string GetInstanceId() const - { - return instanceId_; - } - - unsigned int GetFrame() const - { - return frame_; - } - - virtual size_t GetApproximateMemoryUsage() const - { - size_t size = 0; - if (source_.get() != NULL) - { - size += source_->GetPitch() * source_->GetHeight(); - } - if (converted_.get() != NULL) - { - size += converted_->GetPitch() * converted_->GetHeight(); - } - - return size; - } - - - void SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset); - - void SetSourceImage(Orthanc::ImageAccessor* image); // Takes ownership - - void SetSourceImage(Orthanc::ImageAccessor* image, double newPixelSpacingX, double newPixelSpacingY, bool emitLayerEditedEvent = true); // Takes ownership - - const Orthanc::ImageAccessor* GetSourceImage() const {return source_.get();} // currently need this access to serialize scene in plain old data to send to a WASM worker - - const Deprecated::DicomFrameConverter& GetDicomFrameConverter() const {return *converter_;} // currently need this access to serialize scene in plain old data to send to a WASM worker - - // Takes ownership - void SetDicomFrameConverter(Deprecated::DicomFrameConverter* converter); - - virtual void Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const; - - virtual bool GetDefaultWindowing(float& center, - float& width) const; - - virtual bool GetRange(float& minValue, - float& maxValue) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayer.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,402 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayer.h" - -#include - - -namespace OrthancStone -{ - static double Square(double x) - { - return x * x; - } - - - RadiographyLayer::Geometry::Geometry() : - hasCrop_(false), - flipVertical_(false), - flipHorizontal_(false), - panX_(0), - panY_(0), - angle_(0), - resizeable_(false), - pixelSpacingX_(1), - pixelSpacingY_(1) - { - - } - - void RadiographyLayer::Geometry::GetCrop(unsigned int &x, unsigned int &y, unsigned int &width, unsigned int &height) const - { - if (!hasCrop_) - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); // you should probably use RadiographyLayer::GetCrop() or at least call HasCrop() before - - x = cropX_; - y = cropY_; - width = cropWidth_; - height = cropHeight_; - } - - void RadiographyLayer::UpdateTransform() - { - // important to update transform_ before getting the center to use the right scaling !!! - transform_ = AffineTransform2D::CreateScaling(geometry_.GetScalingX(), geometry_.GetScalingY()); - - double centerX, centerY; - GetCenter(centerX, centerY); - - transform_ = AffineTransform2D::Combine( - AffineTransform2D::CreateOffset(geometry_.GetPanX(), geometry_.GetPanY()), - AffineTransform2D::CreateRotation(geometry_.GetAngle(), centerX, centerY), - transform_); - - transformInverse_ = AffineTransform2D::Invert(transform_); - } - - - void RadiographyLayer::AddToExtent(Extent2D& extent, - double x, - double y) const - { - GetTransform().Apply(x, y); - extent.AddPoint(x, y); - } - - bool RadiographyLayer::Contains(double x, - double y) const - { - GetTransformInverse().Apply(x, y); - - unsigned int cropX, cropY, cropWidth, cropHeight; - GetCrop(cropX, cropY, cropWidth, cropHeight); - - return (x >= cropX && x <= cropX + cropWidth && - y >= cropY && y <= cropY + cropHeight); - } - - - void RadiographyLayer::DrawBorders(CairoContext& context, - double zoom) - { - if (GetControlPointCount() < 3 ) - return; - - cairo_t* cr = context.GetObject(); - cairo_set_line_width(cr, 2.0 / zoom); - - ControlPoint cp; - GetControlPoint(cp, 0); - cairo_move_to(cr, cp.x, cp.y); - - for (size_t i = 0; i < GetControlPointCount(); i++) - { - GetControlPoint(cp, i); - cairo_line_to(cr, cp.x, cp.y); - } - - cairo_close_path(cr); - cairo_stroke(cr); - } - - - RadiographyLayer::RadiographyLayer(const RadiographyScene& scene) : - index_(0), - hasSize_(false), - width_(0), - height_(0), - prefferedPhotometricDisplayMode_(RadiographyPhotometricDisplayMode_Default), - scene_(scene) - { - UpdateTransform(); - } - - void RadiographyLayer::ResetCrop() - { - geometry_.ResetCrop(); - UpdateTransform(); - } - - void RadiographyLayer::SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode) - { - prefferedPhotometricDisplayMode_ = prefferedPhotometricDisplayMode; - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyLayer::SetCrop(unsigned int x, - unsigned int y, - unsigned int width, - unsigned int height) - { - if (!hasSize_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - if (x + width > width_ || - y + height > height_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - geometry_.SetCrop(x, y, width, height); - UpdateTransform(); - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyLayer::SetGeometry(const Geometry& geometry) - { - geometry_ = geometry; - - if (hasSize_) - { - UpdateTransform(); - } - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - - void RadiographyLayer::GetCrop(unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height) const - { - if (GetGeometry().HasCrop()) - { - GetGeometry().GetCrop(x, y, width, height); - } - else - { - x = 0; - y = 0; - width = width_; - height = height_; - } - } - - - void RadiographyLayer::SetAngle(double angle) - { - geometry_.SetAngle(angle); - UpdateTransform(); - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyLayer::SetFlipVertical(bool flip) - { - geometry_.SetFlipVertical(flip); - UpdateTransform(); - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyLayer::SetFlipHorizontal(bool flip) - { - geometry_.SetFlipHorizontal(flip); - UpdateTransform(); - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyLayer::SetSize(unsigned int width, - unsigned int height, - bool emitLayerEditedEvent) - { - hasSize_ = true; - width_ = width; - height_ = height; - - UpdateTransform(); - - if (emitLayerEditedEvent) - { - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - } - - Extent2D RadiographyLayer::GetSceneExtent(bool /*minimal*/) const - { - Extent2D extent; - - unsigned int x, y, width, height; - GetCrop(x, y, width, height); - - double dx = static_cast(x); - double dy = static_cast(y); - double dwidth = static_cast(width); - double dheight = static_cast(height); - - // AddToExtent transforms the coordinates from image to scene - AddToExtent(extent, dx, dy); - AddToExtent(extent, dx + dwidth, dy); - AddToExtent(extent, dx, dy + dheight); - AddToExtent(extent, dx + dwidth, dy + dheight); - - return extent; - } - - - bool RadiographyLayer::GetPixel(unsigned int& imageX, - unsigned int& imageY, - double sceneX, - double sceneY) const - { - if (width_ == 0 || - height_ == 0) - { - return false; - } - else - { - GetTransformInverse().Apply(sceneX, sceneY); - - int x = static_cast(std::floor(sceneX)); - int y = static_cast(std::floor(sceneY)); - - if (x < 0) - { - imageX = 0; - } - else if (x >= static_cast(width_)) - { - imageX = width_; - } - else - { - imageX = static_cast(x); - } - - if (y < 0) - { - imageY = 0; - } - else if (y >= static_cast(height_)) - { - imageY = height_; - } - else - { - imageY = static_cast(y); - } - - return true; - } - } - - - void RadiographyLayer::SetPan(double x, - double y) - { - geometry_.SetPan(x, y); - UpdateTransform(); - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - - void RadiographyLayer::SetPixelSpacing(double x, - double y, - bool emitLayerEditedEvent) - { - geometry_.SetPixelSpacing(x, y); - UpdateTransform(); - if (emitLayerEditedEvent) - { - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - } - - - void RadiographyLayer::GetCenter(double& centerX, - double& centerY) const - { - centerX = static_cast(width_) / 2.0; - centerY = static_cast(height_) / 2.0; - GetTransform().Apply(centerX, centerY); - } - - - - size_t RadiographyLayer::GetControlPointCount() const {return 4;} - - void RadiographyLayer::GetControlPoint(ControlPoint& cpScene /* out in scene coordinates */, - size_t index) const - { - unsigned int cropX, cropY, cropWidth, cropHeight; - GetCrop(cropX, cropY, cropWidth, cropHeight); - - ControlPoint cp; - switch (index) - { - case RadiographyControlPointType_TopLeftCorner: - cp = ControlPoint(cropX, cropY, RadiographyControlPointType_TopLeftCorner); - break; - - case RadiographyControlPointType_TopRightCorner: - cp = ControlPoint(cropX + cropWidth, cropY, RadiographyControlPointType_TopRightCorner); - break; - - case RadiographyControlPointType_BottomLeftCorner: - cp = ControlPoint(cropX, cropY + cropHeight, RadiographyControlPointType_BottomLeftCorner); - break; - - case RadiographyControlPointType_BottomRightCorner: - cp = ControlPoint(cropX + cropWidth, cropY + cropHeight, RadiographyControlPointType_BottomRightCorner); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // transforms image coordinates into scene coordinates - GetTransform().Apply(cp.x, cp.y); - cpScene = cp; - } - - bool RadiographyLayer::LookupControlPoint(ControlPoint& cpScene /* out */, - double x, - double y, - double zoom, - double viewportDistance) const - { - double threshold = Square(viewportDistance / zoom); - - for (size_t i = 0; i < GetControlPointCount(); i++) - { - ControlPoint cp; - GetControlPoint(cp, i); - - double d = Square(cp.x - x) + Square(cp.y - y); - - if (d <= threshold) - { - cpScene = cp; - return true; - } - } - - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayer.h --- a/Framework/Deprecated/Radiography/RadiographyLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,395 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include "../Toolbox/AffineTransform2D.h" -#include "../Toolbox/Extent2D.h" -#include "../Wrappers/CairoContext.h" -#include "../Messages/IMessage.h" -#include "../Messages/IObservable.h" - -namespace OrthancStone -{ - class RadiographyScene; - - enum RadiographyControlPointType - { - RadiographyControlPointType_TopLeftCorner = 0, - RadiographyControlPointType_TopRightCorner = 1, - RadiographyControlPointType_BottomRightCorner = 2, - RadiographyControlPointType_BottomLeftCorner = 3 - }; - - enum RadiographyPhotometricDisplayMode - { - RadiographyPhotometricDisplayMode_Default, - - RadiographyPhotometricDisplayMode_Monochrome1, - RadiographyPhotometricDisplayMode_Monochrome2 - }; - - - struct ControlPoint - { - double x; - double y; - size_t index; - - ControlPoint(double x, double y, size_t index) - : x(x), - y(y), - index(index) - {} - - ControlPoint() - : x(0), - y(0), - index(std::numeric_limits::max()) - {} - }; - - class RadiographyLayer : public IObservable - { - friend class RadiographyScene; - - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, LayerEditedMessage, RadiographyLayer); - - class Geometry - { - bool hasCrop_; - unsigned int cropX_; - unsigned int cropY_; - unsigned int cropWidth_; - unsigned int cropHeight_; - bool flipVertical_; - bool flipHorizontal_; - double panX_; - double panY_; - double angle_; - bool resizeable_; - double pixelSpacingX_; - double pixelSpacingY_; - - public: - Geometry(); - - void ResetCrop() - { - hasCrop_ = false; - } - - void SetCrop(unsigned int x, - unsigned int y, - unsigned int width, - unsigned int height) - { - hasCrop_ = true; - cropX_ = x; - cropY_ = y; - cropWidth_ = width; - cropHeight_ = height; - } - - bool HasCrop() const - { - return hasCrop_; - } - - void GetCrop(unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height) const; - - void SetAngle(double angle) - { - angle_ = angle; - } - - double GetAngle() const - { - return angle_; - } - - void SetPan(double x, - double y) - { - panX_ = x; - panY_ = y; - } - - double GetPanX() const - { - return panX_; - } - - double GetPanY() const - { - return panY_; - } - - bool IsResizeable() const - { - return resizeable_; - } - - void SetResizeable(bool resizeable) - { - resizeable_ = resizeable; - } - - void SetPixelSpacing(double x, - double y) - { - pixelSpacingX_ = x; - pixelSpacingY_ = y; - } - - double GetPixelSpacingX() const - { - return pixelSpacingX_; - } - - double GetPixelSpacingY() const - { - return pixelSpacingY_; - } - - void SetFlipVertical(bool flip) // mirrors image around an horizontal axis (note: flip is applied before the rotation !) - { - flipVertical_ = flip; - } - - void SetFlipHorizontal(bool flip) // mirrors image around a vertical axis (note: flip is applied before the rotation !) - { - flipHorizontal_ = flip; - } - - bool GetFlipVertical() const - { - return flipVertical_; - } - - bool GetFlipHorizontal() const - { - return flipHorizontal_; - } - - double GetScalingX() const - { - return (flipHorizontal_ ? - pixelSpacingX_: pixelSpacingX_); - } - - double GetScalingY() const - { - return (flipVertical_ ? - pixelSpacingY_: pixelSpacingY_); - } - }; - - private: - size_t index_; - bool hasSize_; - unsigned int width_; - unsigned int height_; - AffineTransform2D transform_; - AffineTransform2D transformInverse_; - Geometry geometry_; - RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode_; - const RadiographyScene& scene_; - - protected: - void SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode); - - private: - void UpdateTransform(); - - void AddToExtent(Extent2D& extent, - double x, - double y) const; - - void SetIndex(size_t index) - { - index_ = index; - } - - bool Contains(double x, - double y) const; - - void DrawBorders(CairoContext& context, - double zoom); - - public: - RadiographyLayer(const RadiographyScene& scene); - - virtual ~RadiographyLayer() - { - } - - virtual const AffineTransform2D& GetTransform() const - { - return transform_; - } - - virtual const AffineTransform2D& GetTransformInverse() const - { - return transformInverse_; - } - - size_t GetIndex() const - { - return index_; - } - - const RadiographyScene& GetScene() const - { - return scene_; - } - - const Geometry& GetGeometry() const - { - return geometry_; - } - - void SetGeometry(const Geometry& geometry); - - void ResetCrop(); - - void SetCrop(unsigned int x, // those are pixel coordinates/size - unsigned int y, - unsigned int width, - unsigned int height); - - void SetCrop(const Extent2D& sceneExtent) - { - Extent2D imageCrop; - - { - double x = sceneExtent.GetX1(); - double y = sceneExtent.GetY1(); - GetTransformInverse().Apply(x, y); - imageCrop.AddPoint(x, y); - } - - { - double x = sceneExtent.GetX2(); - double y = sceneExtent.GetY2(); - GetTransformInverse().Apply(x, y); - imageCrop.AddPoint(x, y); - } - - SetCrop(static_cast(std::max(0.0, std::floor(imageCrop.GetX1()))), - static_cast(std::max(0.0, std::floor(imageCrop.GetY1()))), - std::min(width_, static_cast(std::ceil(imageCrop.GetWidth()))), - std::min(height_, static_cast(std::ceil(imageCrop.GetHeight()))) - ); - } - - - void GetCrop(unsigned int& x, - unsigned int& y, - unsigned int& width, - unsigned int& height) const; - - void SetAngle(double angle); - - void SetPan(double x, - double y); - - void SetFlipVertical(bool flip); // mirrors image around an horizontal axis (note: flip is applied before the rotation !) - - void SetFlipHorizontal(bool flip); // mirrors image around a vertical axis (note: flip is applied before the rotation !) - - void SetResizeable(bool resizeable) - { - geometry_.SetResizeable(resizeable); - } - - void SetSize(unsigned int width, - unsigned int height, - bool emitLayerEditedEvent = true); - - bool HasSize() const - { - return hasSize_; - } - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - virtual Extent2D GetSceneExtent(bool minimal) const; - - virtual bool GetPixel(unsigned int& imageX, - unsigned int& imageY, - double sceneX, - double sceneY) const; - - void SetPixelSpacing(double x, - double y, - bool emitLayerEditedEvent = true); - - void GetCenter(double& centerX, - double& centerY) const; - - virtual void GetControlPoint(ControlPoint& cpScene /* out in scene coordinates */, - size_t index) const; - - virtual size_t GetControlPointCount() const; - - bool LookupControlPoint(ControlPoint& cpScene /* out */, - double x, - double y, - double zoom, - double viewportDistance) const; - - virtual bool GetDefaultWindowing(float& center, - float& width) const = 0; - - RadiographyPhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const - { - return prefferedPhotometricDisplayMode_; - } - - virtual void Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const = 0; - - virtual bool GetRange(float& minValue, - float& maxValue) const = 0; - - virtual size_t GetApproximateMemoryUsage() const // this is used to limit the number of scenes loaded in RAM when resources are limited (we actually only count the size used by the images, not the C structs) - { - return 0; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerCropTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayerCropTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayerCropTracker.h" - -#include "RadiographySceneCommand.h" - -#include - -namespace OrthancStone -{ - class RadiographyLayerCropTracker::UndoRedoCommand : public RadiographySceneCommand - { - private: - unsigned int sourceCropX_; - unsigned int sourceCropY_; - unsigned int sourceCropWidth_; - unsigned int sourceCropHeight_; - unsigned int targetCropX_; - unsigned int targetCropY_; - unsigned int targetCropWidth_; - unsigned int targetCropHeight_; - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const - { - layer.SetCrop(sourceCropX_, sourceCropY_, sourceCropWidth_, sourceCropHeight_); - } - - virtual void RedoInternal(RadiographyLayer& layer) const - { - layer.SetCrop(targetCropX_, targetCropY_, targetCropWidth_, targetCropHeight_); - } - - public: - UndoRedoCommand(const RadiographyLayerCropTracker& tracker) : - RadiographySceneCommand(tracker.accessor_), - sourceCropX_(tracker.cropX_), - sourceCropY_(tracker.cropY_), - sourceCropWidth_(tracker.cropWidth_), - sourceCropHeight_(tracker.cropHeight_) - { - tracker.accessor_.GetLayer().GetCrop(targetCropX_, targetCropY_, - targetCropWidth_, targetCropHeight_); - } - }; - - - RadiographyLayerCropTracker::RadiographyLayerCropTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - const ControlPoint& startControlPoint) : - undoRedoStack_(undoRedoStack), - accessor_(scene, layer), - startControlPoint_(startControlPoint) - { - if (accessor_.IsValid()) - { - accessor_.GetLayer().GetCrop(cropX_, cropY_, cropWidth_, cropHeight_); - } - } - - - void RadiographyLayerCropTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyLayerCropTracker::MouseUp() - { - if (accessor_.IsValid()) - { - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - } - - - void RadiographyLayerCropTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - if (accessor_.IsValid()) - { - unsigned int x, y; - - RadiographyLayer& layer = accessor_.GetLayer(); - if (layer.GetPixel(x, y, sceneX, sceneY)) - { - unsigned int targetX, targetWidth; - - if (startControlPoint_.index == RadiographyControlPointType_TopLeftCorner || - startControlPoint_.index == RadiographyControlPointType_BottomLeftCorner) - { - targetX = std::min(x, cropX_ + cropWidth_); - targetWidth = cropX_ + cropWidth_ - targetX; - } - else - { - targetX = cropX_; - targetWidth = std::max(x, cropX_) - cropX_; - } - - unsigned int targetY, targetHeight; - - if (startControlPoint_.index == RadiographyControlPointType_TopLeftCorner || - startControlPoint_.index == RadiographyControlPointType_TopRightCorner) - { - targetY = std::min(y, cropY_ + cropHeight_); - targetHeight = cropY_ + cropHeight_ - targetY; - } - else - { - targetY = cropY_; - targetHeight = std::max(y, cropY_) - cropY_; - } - - layer.SetCrop(targetX, targetY, targetWidth, targetHeight); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerCropTracker.h --- a/Framework/Deprecated/Radiography/RadiographyLayerCropTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Toolbox/ViewportGeometry.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - class RadiographyLayerCropTracker : public Deprecated::IWorldSceneMouseTracker - { - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene::LayerAccessor accessor_; - ControlPoint startControlPoint_; - unsigned int cropX_; - unsigned int cropY_; - unsigned int cropWidth_; - unsigned int cropHeight_; - - public: - RadiographyLayerCropTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - const ControlPoint& startControlPoint); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerMaskTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayerMaskTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayerMaskTracker.h" -#include "RadiographyMaskLayer.h" - -#include "RadiographySceneCommand.h" - -#include - -namespace OrthancStone -{ - class RadiographyLayerMaskTracker::UndoRedoCommand : public RadiographySceneCommand - { - private: - ControlPoint sourceSceneCp_; - ControlPoint targetSceneCp_; - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const - { - RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); - if (maskLayer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - unsigned int ix, iy; // image coordinates - if (maskLayer->GetPixel(ix, iy, sourceSceneCp_.x, sourceSceneCp_.y)) - { - maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), sourceSceneCp_.index); - } - } - - virtual void RedoInternal(RadiographyLayer& layer) const - { - RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); - if (maskLayer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - unsigned int ix, iy; // image coordinates - if (maskLayer->GetPixel(ix, iy, targetSceneCp_.x, targetSceneCp_.y)) - { - maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), targetSceneCp_.index); - } - } - - public: - UndoRedoCommand(const RadiographyLayerMaskTracker& tracker) : - RadiographySceneCommand(tracker.accessor_), - sourceSceneCp_(tracker.startSceneCp_), - targetSceneCp_(tracker.endSceneCp_) - { - RadiographyMaskLayer* maskLayer = dynamic_cast(&(tracker.accessor_.GetLayer())); - if (maskLayer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - unsigned int ix, iy; // image coordinates - if (maskLayer->GetPixel(ix, iy, targetSceneCp_.x, targetSceneCp_.y)) - { - maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), targetSceneCp_.index); - } - } - }; - - - RadiographyLayerMaskTracker::RadiographyLayerMaskTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - const ControlPoint& startSceneControlPoint) : - undoRedoStack_(undoRedoStack), - accessor_(scene, layer), - startSceneCp_(startSceneControlPoint), - endSceneCp_(startSceneControlPoint) - { - } - - - void RadiographyLayerMaskTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyLayerMaskTracker::MouseUp() - { - if (accessor_.IsValid() && startSceneCp_.x != endSceneCp_.x && startSceneCp_.y != endSceneCp_.y) - { - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - } - - - void RadiographyLayerMaskTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - if (accessor_.IsValid()) - { - unsigned int ix, iy; // image coordinates - - RadiographyLayer& layer = accessor_.GetLayer(); - if (layer.GetPixel(ix, iy, sceneX, sceneY)) - { - endSceneCp_ = ControlPoint(sceneX, sceneY, startSceneCp_.index); - - RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); - if (maskLayer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), startSceneCp_.index); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerMaskTracker.h --- a/Framework/Deprecated/Radiography/RadiographyLayerMaskTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Toolbox/ViewportGeometry.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - class RadiographyLayerMaskTracker : public Deprecated::IWorldSceneMouseTracker - { - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene::LayerAccessor accessor_; - ControlPoint startSceneCp_; - ControlPoint endSceneCp_; - - public: - RadiographyLayerMaskTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - const ControlPoint& startSceneControlPoint); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerMoveTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayerMoveTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayerMoveTracker.h" - -#include "RadiographySceneCommand.h" - -#include - -namespace OrthancStone -{ - class RadiographyLayerMoveTracker::UndoRedoCommand : public RadiographySceneCommand - { - private: - double sourceX_; - double sourceY_; - double targetX_; - double targetY_; - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const - { - layer.SetPan(sourceX_, sourceY_); - } - - virtual void RedoInternal(RadiographyLayer& layer) const - { - layer.SetPan(targetX_, targetY_); - } - - public: - UndoRedoCommand(const RadiographyLayerMoveTracker& tracker) : - RadiographySceneCommand(tracker.accessor_), - sourceX_(tracker.panX_), - sourceY_(tracker.panY_), - targetX_(tracker.accessor_.GetLayer().GetGeometry().GetPanX()), - targetY_(tracker.accessor_.GetLayer().GetGeometry().GetPanY()) - { - } - }; - - - RadiographyLayerMoveTracker::RadiographyLayerMoveTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - size_t layer, - double x, - double y, - bool oneAxis) : - undoRedoStack_(undoRedoStack), - accessor_(scene, layer), - clickX_(x), - clickY_(y), - oneAxis_(oneAxis) - { - if (accessor_.IsValid()) - { - panX_ = accessor_.GetLayer().GetGeometry().GetPanX(); - panY_ = accessor_.GetLayer().GetGeometry().GetPanY(); - } - } - - - void RadiographyLayerMoveTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyLayerMoveTracker::MouseUp() - { - if (accessor_.IsValid()) - { - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - } - - - void RadiographyLayerMoveTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - if (accessor_.IsValid()) - { - double dx = sceneX - clickX_; - double dy = sceneY - clickY_; - - if (oneAxis_) - { - if (fabs(dx) > fabs(dy)) - { - accessor_.GetLayer().SetPan(dx + panX_, panY_); - } - else - { - accessor_.GetLayer().SetPan(panX_, dy + panY_); - } - } - else - { - accessor_.GetLayer().SetPan(dx + panX_, dy + panY_); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerMoveTracker.h --- a/Framework/Deprecated/Radiography/RadiographyLayerMoveTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - class RadiographyLayerMoveTracker : public Deprecated::IWorldSceneMouseTracker - { - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene::LayerAccessor accessor_; - double clickX_; - double clickY_; - double panX_; - double panY_; - bool oneAxis_; - - public: - RadiographyLayerMoveTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - size_t layer, - double x, - double y, - bool oneAxis); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerResizeTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayerResizeTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayerResizeTracker.h" - -#include "RadiographySceneCommand.h" - -#include - -#include - - -namespace OrthancStone -{ - static double ComputeDistance(double x1, - double y1, - double x2, - double y2) - { - double dx = x1 - x2; - double dy = y1 - y2; - return sqrt(dx * dx + dy * dy); - } - - - class RadiographyLayerResizeTracker::UndoRedoCommand : public RadiographySceneCommand - { - private: - double sourceSpacingX_; - double sourceSpacingY_; - double sourcePanX_; - double sourcePanY_; - double targetSpacingX_; - double targetSpacingY_; - double targetPanX_; - double targetPanY_; - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const - { - layer.SetPixelSpacing(sourceSpacingX_, sourceSpacingY_); - layer.SetPan(sourcePanX_, sourcePanY_); - } - - virtual void RedoInternal(RadiographyLayer& layer) const - { - layer.SetPixelSpacing(targetSpacingX_, targetSpacingY_); - layer.SetPan(targetPanX_, targetPanY_); - } - - public: - UndoRedoCommand(const RadiographyLayerResizeTracker& tracker) : - RadiographySceneCommand(tracker.accessor_), - sourceSpacingX_(tracker.originalSpacingX_), - sourceSpacingY_(tracker.originalSpacingY_), - sourcePanX_(tracker.originalPanX_), - sourcePanY_(tracker.originalPanY_), - targetSpacingX_(tracker.accessor_.GetLayer().GetGeometry().GetPixelSpacingX()), - targetSpacingY_(tracker.accessor_.GetLayer().GetGeometry().GetPixelSpacingY()), - targetPanX_(tracker.accessor_.GetLayer().GetGeometry().GetPanX()), - targetPanY_(tracker.accessor_.GetLayer().GetGeometry().GetPanY()) - { - } - }; - - - RadiographyLayerResizeTracker::RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - size_t layer, - const ControlPoint& startControlPoint, - bool roundScaling) : - undoRedoStack_(undoRedoStack), - accessor_(scene, layer), - roundScaling_(roundScaling) - { - if (accessor_.IsValid() && - accessor_.GetLayer().GetGeometry().IsResizeable()) - { - originalSpacingX_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingX(); - originalSpacingY_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingY(); - originalPanX_ = accessor_.GetLayer().GetGeometry().GetPanX(); - originalPanY_ = accessor_.GetLayer().GetGeometry().GetPanY(); - - size_t oppositeControlPointType; - switch (startControlPoint.index) - { - case RadiographyControlPointType_TopLeftCorner: - oppositeControlPointType = RadiographyControlPointType_BottomRightCorner; - break; - - case RadiographyControlPointType_TopRightCorner: - oppositeControlPointType = RadiographyControlPointType_BottomLeftCorner; - break; - - case RadiographyControlPointType_BottomLeftCorner: - oppositeControlPointType = RadiographyControlPointType_TopRightCorner; - break; - - case RadiographyControlPointType_BottomRightCorner: - oppositeControlPointType = RadiographyControlPointType_TopLeftCorner; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - accessor_.GetLayer().GetControlPoint(startOppositeControlPoint_, oppositeControlPointType); - - double d = ComputeDistance(startControlPoint.x, startControlPoint.y, startOppositeControlPoint_.x, startOppositeControlPoint_.y); - if (d >= std::numeric_limits::epsilon()) - { - baseScaling_ = 1.0 / d; - } - else - { - // Avoid division by zero in extreme cases - accessor_.Invalidate(); - } - } - } - - - void RadiographyLayerResizeTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyLayerResizeTracker::MouseUp() - { - if (accessor_.IsValid() && - accessor_.GetLayer().GetGeometry().IsResizeable()) - { - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - } - - - void RadiographyLayerResizeTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - static const double ROUND_SCALING = 0.1; - - if (accessor_.IsValid() && - accessor_.GetLayer().GetGeometry().IsResizeable()) - { - double scaling = ComputeDistance(startOppositeControlPoint_.x, startOppositeControlPoint_.y, sceneX, sceneY) * baseScaling_; - - if (roundScaling_) - { - scaling = boost::math::round((scaling / ROUND_SCALING) * ROUND_SCALING); - } - - RadiographyLayer& layer = accessor_.GetLayer(); - layer.SetPixelSpacing(scaling * originalSpacingX_, - scaling * originalSpacingY_); - - // Keep the opposite corner at a fixed location - ControlPoint currentOppositeCorner; - layer.GetControlPoint(currentOppositeCorner, startOppositeControlPoint_.index); - layer.SetPan(layer.GetGeometry().GetPanX() + startOppositeControlPoint_.x - currentOppositeCorner.x, - layer.GetGeometry().GetPanY() + startOppositeControlPoint_.y - currentOppositeCorner.y); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerResizeTracker.h --- a/Framework/Deprecated/Radiography/RadiographyLayerResizeTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - class RadiographyLayerResizeTracker : public Deprecated::IWorldSceneMouseTracker - { - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene::LayerAccessor accessor_; - bool roundScaling_; - double originalSpacingX_; - double originalSpacingY_; - double originalPanX_; - double originalPanY_; - ControlPoint startOppositeControlPoint_; - double baseScaling_; - - public: - RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - size_t layer, - const ControlPoint& startControlPoint, - bool roundScaling); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerRotateTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyLayerRotateTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyLayerRotateTracker.h" - -#include "RadiographySceneCommand.h" - -#include - -#include -#include - -namespace OrthancStone -{ - class RadiographyLayerRotateTracker::UndoRedoCommand : public RadiographySceneCommand - { - private: - double sourceAngle_; - double targetAngle_; - - static int ToDegrees(double angle) - { - return boost::math::iround(angle * 180.0 / boost::math::constants::pi()); - } - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const - { - LOG(INFO) << "Undo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; - layer.SetAngle(sourceAngle_); - } - - virtual void RedoInternal(RadiographyLayer& layer) const - { - LOG(INFO) << "Redo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; - layer.SetAngle(targetAngle_); - } - - public: - UndoRedoCommand(const RadiographyLayerRotateTracker& tracker) : - RadiographySceneCommand(tracker.accessor_), - sourceAngle_(tracker.originalAngle_), - targetAngle_(tracker.accessor_.GetLayer().GetGeometry().GetAngle()) - { - } - }; - - - bool RadiographyLayerRotateTracker::ComputeAngle(double& angle /* out */, - double sceneX, - double sceneY) const - { - Vector u; - LinearAlgebra::AssignVector(u, sceneX - centerX_, sceneY - centerY_); - - double nu = boost::numeric::ublas::norm_2(u); - - if (!LinearAlgebra::IsCloseToZero(nu)) - { - u /= nu; - angle = atan2(u[1], u[0]); - return true; - } - else - { - return false; - } - } - - - RadiographyLayerRotateTracker::RadiographyLayerRotateTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - double x, - double y, - bool roundAngles) : - undoRedoStack_(undoRedoStack), - accessor_(scene, layer), - roundAngles_(roundAngles) - { - if (accessor_.IsValid()) - { - accessor_.GetLayer().GetCenter(centerX_, centerY_); - originalAngle_ = accessor_.GetLayer().GetGeometry().GetAngle(); - - double sceneX, sceneY; - view.MapDisplayToScene(sceneX, sceneY, x, y); - - if (!ComputeAngle(clickAngle_, x, y)) - { - accessor_.Invalidate(); - } - } - } - - - void RadiographyLayerRotateTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyLayerRotateTracker::MouseUp() - { - if (accessor_.IsValid()) - { - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - } - - - void RadiographyLayerRotateTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - static const double ROUND_ANGLE = 15.0 / 180.0 * boost::math::constants::pi(); - - double angle; - - if (accessor_.IsValid() && - ComputeAngle(angle, sceneX, sceneY)) - { - angle = angle - clickAngle_ + originalAngle_; - - if (roundAngles_) - { - angle = boost::math::round((angle / ROUND_ANGLE) * ROUND_ANGLE); - } - - accessor_.GetLayer().SetAngle(angle); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyLayerRotateTracker.h --- a/Framework/Deprecated/Radiography/RadiographyLayerRotateTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Toolbox/ViewportGeometry.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - - -namespace OrthancStone -{ - class RadiographyLayerRotateTracker : public Deprecated::IWorldSceneMouseTracker - { - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene::LayerAccessor accessor_; - double centerX_; - double centerY_; - double originalAngle_; - double clickAngle_; - bool roundAngles_; - - bool ComputeAngle(double& angle /* out */, - double sceneX, - double sceneY) const; - - public: - RadiographyLayerRotateTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - const Deprecated::ViewportGeometry& view, - size_t layer, - double x, - double y, - bool roundAngles); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyMaskLayer.cpp --- a/Framework/Deprecated/Radiography/RadiographyMaskLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,200 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyMaskLayer.h" -#include "RadiographyDicomLayer.h" - -#include "RadiographyScene.h" -#include "../Toolbox/ImageGeometry.h" - -#include -#include -#include - -namespace OrthancStone -{ - const unsigned char IN_MASK_VALUE = 0x77; - const unsigned char OUT_MASK_VALUE = 0xFF; - - const AffineTransform2D& RadiographyMaskLayer::GetTransform() const - { - return dicomLayer_.GetTransform(); - } - - const AffineTransform2D& RadiographyMaskLayer::GetTransformInverse() const - { - return dicomLayer_.GetTransformInverse(); - } - - bool RadiographyMaskLayer::GetPixel(unsigned int& imageX, - unsigned int& imageY, - double sceneX, - double sceneY) const - { - return dicomLayer_.GetPixel(imageX, imageY, sceneX, sceneY); - } - - std::string RadiographyMaskLayer::GetInstanceId() const - { - return dicomLayer_.GetInstanceId(); - } - - void RadiographyMaskLayer::SetCorner(const Orthanc::ImageProcessing::ImagePoint& corner, size_t index) - { - if (index < corners_.size()) - corners_[index] = corner; - else - corners_.push_back(corner); - invalidated_ = true; - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - void RadiographyMaskLayer::SetCorners(const std::vector& corners) - { - corners_ = corners; - invalidated_ = true; - - BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); - } - - Extent2D RadiographyMaskLayer::GetSceneExtent(bool minimal) const - { - if (!minimal) - { - return RadiographyLayer::GetSceneExtent(minimal); - } - else - { // get the extent of the in-mask area - Extent2D sceneExtent; - - for (std::vector::const_iterator corner = corners_.begin(); corner != corners_.end(); ++corner) - { - double x = static_cast(corner->GetX()); - double y = static_cast(corner->GetY()); - - dicomLayer_.GetTransform().Apply(x, y); - sceneExtent.AddPoint(x, y); - } - return sceneExtent; - } - } - - - - void RadiographyMaskLayer::Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const - { - if (dicomLayer_.GetWidth() == 0 || dicomLayer_.GetSourceImage() == NULL) // nothing to do if the DICOM layer is not displayed (or not loaded) - return; - - if (invalidated_) - { - mask_.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, dicomLayer_.GetWidth(), dicomLayer_.GetHeight(), false)); - - DrawMask(); - - invalidated_ = false; - } - - {// rendering - if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - unsigned int cropX, cropY, cropWidth, cropHeight; - dicomLayer_.GetCrop(cropX, cropY, cropWidth, cropHeight); - - const AffineTransform2D t = AffineTransform2D::Combine( - viewTransform, dicomLayer_.GetTransform(), - AffineTransform2D::CreateOffset(cropX, cropY)); - - Orthanc::ImageAccessor cropped; - mask_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); - - Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); - - - unsigned int x1, y1, x2, y2; - if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, - t.GetHomogeneousMatrix(), - cropped.GetWidth(), - cropped.GetHeight(), - buffer.GetWidth(), - buffer.GetHeight())) - { - return; // layer is outside the buffer - } - - t.Apply(tmp, cropped, ImageInterpolation_Nearest, true /* clear */); - - // we have observed vertical lines at the image border (probably due to bilinear filtering of the DICOM image when it is not aligned with the buffer pixels) - // -> draw the mask one line further on each side - if (x1 >= 1) - { - x1 = x1 - 1; - } - if (x2 < buffer.GetWidth() - 2) - { - x2 = x2 + 1; - } - - // Blit - for (unsigned int y = y1; y <= y2; y++) - { - float *q = reinterpret_cast(buffer.GetRow(y)) + x1; - const uint8_t *p = reinterpret_cast(tmp.GetRow(y)) + x1; - - for (unsigned int x = x1; x <= x2; x++, p++, q++) - { - if (*p != IN_MASK_VALUE) - *q = foreground_; - // else keep the underlying pixel value - } - } - - } - } - - void RadiographyMaskLayer::DrawMask() const - { - // first fill the complete image - Orthanc::ImageProcessing::Set(*mask_, OUT_MASK_VALUE); - - // clip corners - std::vector clippedCorners; - for (size_t i = 0; i < corners_.size(); i++) - { - clippedCorners.push_back(corners_[i]); - clippedCorners[i].ClipTo(0, mask_->GetWidth() - 1, 0, mask_->GetHeight() - 1); - } - - // fill mask - Orthanc::ImageProcessing::FillPolygon(*mask_, clippedCorners, IN_MASK_VALUE); - - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyMaskLayer.h --- a/Framework/Deprecated/Radiography/RadiographyMaskLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyLayer.h" - -#include -#include -#include - -namespace OrthancStone -{ - class RadiographyScene; - class RadiographyDicomLayer; - - class RadiographyMaskLayer : public RadiographyLayer - { - private: - std::vector corners_; - const RadiographyDicomLayer& dicomLayer_; - mutable bool invalidated_; - float foreground_; - - mutable std::unique_ptr mask_; - public: - RadiographyMaskLayer(const RadiographyScene& scene, const RadiographyDicomLayer& dicomLayer, - float foreground) : - RadiographyLayer(scene), - dicomLayer_(dicomLayer), - invalidated_(true), - foreground_(foreground) - { - } - - virtual size_t GetApproximateMemoryUsage() const - { - size_t size = 0; - if (mask_.get() != NULL) - { - size += mask_->GetPitch() * mask_->GetHeight(); - } - - return size; - } - - - void SetCorners(const std::vector& corners); - void SetCorner(const Orthanc::ImageProcessing::ImagePoint& corner, size_t index); - - const std::vector& GetCorners() const - { - return corners_; - } - - float GetForeground() const - { - return foreground_; - } - - virtual void Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - float windowCenter, - float windowWidth, - bool applyWindowing) const; - - std::string GetInstanceId() const; - - virtual size_t GetControlPointCount() const - { - return corners_.size(); - } - - virtual void GetControlPoint(ControlPoint& cpScene, - size_t index) const - { - ControlPoint cp(corners_[index].GetX(), corners_[index].GetY(), index); - - // transforms image coordinates into scene coordinates - GetTransform().Apply(cp.x, cp.y); - cpScene = cp; - } - - virtual Extent2D GetSceneExtent(bool minimal) const; - - virtual bool GetDefaultWindowing(float& center, - float& width) const - { - return false; - } - - virtual bool GetRange(float& minValue, - float& maxValue) const - { - minValue = 0; - maxValue = 0; - - if (foreground_ < 0) - { - minValue = foreground_; - } - - if (foreground_ > 0) - { - maxValue = foreground_; - } - - return true; - - } - - virtual bool GetPixel(unsigned int& imageX, - unsigned int& imageY, - double sceneX, - double sceneY) const; - - protected: - virtual const AffineTransform2D& GetTransform() const; - - virtual const AffineTransform2D& GetTransformInverse() const; - - - private: - void DrawMask() const; - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyScene.cpp --- a/Framework/Deprecated/Radiography/RadiographyScene.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,968 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyScene.h" - -#include "RadiographyAlphaLayer.h" -#include "RadiographyDicomLayer.h" -#include "RadiographyTextLayer.h" -#include "RadiographyMaskLayer.h" -#include "../Deprecated/Toolbox/DicomFrameConverter.h" -#include "../Scene2D/CairoCompositor.h" -#include "../Scene2D/FloatTextureSceneLayer.h" -#include "../Scene2D/TextSceneLayer.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -namespace OrthancStone -{ - RadiographyScene::LayerAccessor::LayerAccessor(RadiographyScene& scene, - size_t index) : - scene_(scene), - index_(index) - { - Layers::iterator layer = scene.layers_.find(index); - if (layer == scene.layers_.end()) - { - layer_ = NULL; - } - else - { - assert(layer->second != NULL); - layer_ = layer->second; - } - } - - - RadiographyScene::LayerAccessor::LayerAccessor(RadiographyScene& scene, - double x, - double y) : - scene_(scene), - index_(0) // Dummy initialization - { - if (scene.LookupLayer(index_, x, y)) - { - Layers::iterator layer = scene.layers_.find(index_); - - if (layer == scene.layers_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - assert(layer->second != NULL); - layer_ = layer->second; - } - } - else - { - layer_ = NULL; - } - } - - - RadiographyScene& RadiographyScene::LayerAccessor::GetScene() const - { - if (IsValid()) - { - return scene_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - size_t RadiographyScene::LayerAccessor::GetIndex() const - { - if (IsValid()) - { - return index_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - RadiographyLayer& RadiographyScene::LayerAccessor::GetLayer() const - { - if (IsValid()) - { - return *layer_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - void RadiographyScene::_RegisterLayer(RadiographyLayer* layer) - { - std::unique_ptr raii(layer); - - // LOG(INFO) << "Registering layer: " << countLayers_; - - size_t index = nextLayerIndex_++; - raii->SetIndex(index); - layers_[index] = raii.release(); - } - - RadiographyLayer& RadiographyScene::RegisterLayer(RadiographyLayer* layer) - { - if (layer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - _RegisterLayer(layer); - - BroadcastMessage(GeometryChangedMessage(*this, *layer)); - BroadcastMessage(ContentChangedMessage(*this, *layer)); - Register(*layer, &RadiographyScene::OnLayerEdited); - - return *layer; - } - - size_t RadiographyScene::GetApproximateMemoryUsage() const - { - size_t size = 0; - for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) - { - size += it->second->GetApproximateMemoryUsage(); - } - return size; - } - - void RadiographyScene::OnLayerEdited(const RadiographyLayer::LayerEditedMessage& message) - { - BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, message.GetOrigin())); - } - - - RadiographyScene::RadiographyScene() : - nextLayerIndex_(0), - hasWindowing_(false), - windowingCenter_(0), // Dummy initialization - windowingWidth_(0) // Dummy initialization - { - } - - - RadiographyScene::~RadiographyScene() - { - for (Layers::iterator it = layers_.begin(); it != layers_.end(); it++) - { - assert(it->second != NULL); - delete it->second; - } - } - - RadiographyPhotometricDisplayMode RadiographyScene::GetPreferredPhotomotricDisplayMode() const - { - // return the mode of the first layer who "cares" about its display mode (normaly, the one and only layer that is a DicomLayer) - for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) - { - if (it->second->GetPreferredPhotomotricDisplayMode() != RadiographyPhotometricDisplayMode_Default) - { - return it->second->GetPreferredPhotomotricDisplayMode(); - } - } - - return RadiographyPhotometricDisplayMode_Default; - } - - - void RadiographyScene::GetLayersIndexes(std::vector& output) const - { - for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) - { - output.push_back(it->first); - } - } - - void RadiographyScene::RemoveLayer(size_t layerIndex) - { - LOG(INFO) << "Removing layer: " << layerIndex; - - Layers::iterator found = layers_.find(layerIndex); - - if (found == layers_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(found->second != NULL); - delete found->second; - - layers_.erase(found); - - LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; - - _OnLayerRemoved(); - - BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); - } - } - - const RadiographyLayer& RadiographyScene::GetLayer(size_t layerIndex) const - { - Layers::const_iterator found = layers_.find(layerIndex); - - if (found == layers_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(found->second != NULL); - return *found->second; - } - } - - RadiographyLayer& RadiographyScene::GetLayer(size_t layerIndex) - { - Layers::const_iterator found = layers_.find(layerIndex); - - if (found == layers_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(found->second != NULL); - return *found->second; - } - } - - bool RadiographyScene::GetWindowing(float& center, - float& width) const - { - if (hasWindowing_) - { - center = windowingCenter_; - width = windowingWidth_; - return true; - } - else - { - return false; - } - } - - - void RadiographyScene::GetWindowingWithDefault(float& center, - float& width) const - { - if (!GetWindowing(center, width)) - { - center = 128; - width = 256; - } - } - - - void RadiographyScene::SetWindowing(float center, - float width) - { - hasWindowing_ = true; - windowingCenter_ = center; - windowingWidth_ = width; - - BroadcastMessage(RadiographyScene::WindowingChangedMessage(*this)); - } - - - RadiographyLayer& RadiographyScene::UpdateText(size_t layerIndex, - const std::string& utf8, - const std::string& font, - unsigned int fontSize, - uint8_t foreground) - { - RadiographyTextLayer& textLayer = dynamic_cast(GetLayer(layerIndex)); - textLayer.SetText(utf8, font, fontSize, foreground); - - BroadcastMessage(RadiographyScene::ContentChangedMessage(*this, textLayer)); - BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, textLayer)); - return textLayer; - } - - - RadiographyLayer& RadiographyScene::LoadText(const std::string& utf8, - const std::string& font, - unsigned int fontSize, - uint8_t foreground, - RadiographyLayer::Geometry* centerGeometry, - bool isCenterGeometry) - { - std::unique_ptr alpha(new RadiographyTextLayer(*this)); - alpha->SetText(utf8, font, fontSize, foreground); - if (centerGeometry != NULL) - { - if (isCenterGeometry) - { - // modify geometry to reference the top left corner - double tlx = centerGeometry->GetPanX(); - double tly = centerGeometry->GetPanY(); - Extent2D textExtent = alpha->GetSceneExtent(false); - tlx = tlx - (textExtent.GetWidth() / 2) * centerGeometry->GetPixelSpacingX(); - tly = tly - (textExtent.GetHeight() / 2) * centerGeometry->GetPixelSpacingY(); - centerGeometry->SetPan(tlx, tly); - } - alpha->SetGeometry(*centerGeometry); - } - - RadiographyLayer& registeredLayer = RegisterLayer(alpha.release()); - - BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, registeredLayer)); - return registeredLayer; - } - - - RadiographyLayer& RadiographyScene::LoadTestBlock(unsigned int width, - unsigned int height, - RadiographyLayer::Geometry* geometry) - { - std::unique_ptr block(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, width, height, false)); - - for (unsigned int padding = 0; - (width > 2 * padding) && (height > 2 * padding); - padding++) - { - uint8_t color; - if (255 > 10 * padding) - { - color = 255 - 10 * padding; - } - else - { - color = 0; - } - - Orthanc::ImageAccessor region; - block->GetRegion(region, padding, padding, width - 2 * padding, height - 2 * padding); - Orthanc::ImageProcessing::Set(region, color); - } - - return LoadAlphaBitmap(block.release(), geometry); - } - - RadiographyLayer& RadiographyScene::LoadMask(const std::vector& corners, - const RadiographyDicomLayer& dicomLayer, - float foreground, - RadiographyLayer::Geometry* geometry) - { - std::unique_ptr mask(new RadiographyMaskLayer(*this, dicomLayer, foreground)); - mask->SetCorners(corners); - if (geometry != NULL) - { - mask->SetGeometry(*geometry); - } - - return RegisterLayer(mask.release()); - } - - - RadiographyLayer& RadiographyScene::LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, RadiographyLayer::Geometry *geometry) - { - std::unique_ptr alpha(new RadiographyAlphaLayer(*this)); - alpha->SetAlpha(bitmap); - if (geometry != NULL) - { - alpha->SetGeometry(*geometry); - } - - return RegisterLayer(alpha.release()); - } - - RadiographyLayer& RadiographyScene::LoadDicomImage(Orthanc::ImageAccessor* dicomImage, // takes ownership - const std::string& instance, - unsigned int frame, - Deprecated::DicomFrameConverter* converter, // takes ownership - RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode, - RadiographyLayer::Geometry* geometry) - { - RadiographyDicomLayer& layer = dynamic_cast(RegisterLayer(new RadiographyDicomLayer(*this))); - - layer.SetInstance(instance, frame); - - if (geometry != NULL) - { - layer.SetGeometry(*geometry); - } - - layer.SetDicomFrameConverter(converter); - layer.SetSourceImage(dicomImage); - layer.SetPreferredPhotomotricDisplayMode(preferredPhotometricDisplayMode); - - return layer; - } - - RadiographyLayer& RadiographyScene::LoadDicomFrame(Deprecated::OrthancApiClient& orthanc, - const std::string& instance, - unsigned int frame, - bool httpCompression, - RadiographyLayer::Geometry* geometry) - { - RadiographyDicomLayer& layer = dynamic_cast(RegisterLayer(new RadiographyDicomLayer( *this))); - layer.SetInstance(instance, frame); - - if (geometry != NULL) - { - layer.SetGeometry(*geometry); - } - - { - Deprecated::IWebService::HttpHeaders headers; - std::string uri = "/instances/" + instance + "/tags"; - - orthanc.GetBinaryAsync( - uri, headers, - new Deprecated::DeprecatedCallable - (GetSharedObserver(), &RadiographyScene::OnTagsReceived), NULL, - new Orthanc::SingleValueObject(layer.GetIndex())); - } - - { - Deprecated::IWebService::HttpHeaders headers; - headers["Accept"] = "image/x-portable-arbitrarymap"; - - if (httpCompression) - { - headers["Accept-Encoding"] = "gzip"; - } - - std::string uri = ("/instances/" + instance + "/frames/" + - boost::lexical_cast(frame) + "/image-uint16"); - - orthanc.GetBinaryAsync( - uri, headers, - new Deprecated::DeprecatedCallable - (GetSharedObserver(), &RadiographyScene::OnFrameReceived), NULL, - new Orthanc::SingleValueObject(layer.GetIndex())); - } - - return layer; - } - - - RadiographyLayer& RadiographyScene::LoadDicomWebFrame(Deprecated::IWebService& web) - { - RadiographyLayer& layer = RegisterLayer(new RadiographyDicomLayer(*this)); - - - return layer; - } - - - - void RadiographyScene::OnTagsReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message) - { - size_t index = dynamic_cast&> - (message.GetPayload()).GetValue(); - - VLOG(1) << "JSON received: " << message.GetUri().c_str() - << " (" << message.GetAnswerSize() << " bytes) for layer " << index; - - Layers::iterator layer = layers_.find(index); - if (layer != layers_.end()) - { - assert(layer->second != NULL); - - OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer(), message.GetAnswerSize()); - dynamic_cast(layer->second)->SetDicomTags(dicom); - - float c, w; - if (!hasWindowing_ && - layer->second->GetDefaultWindowing(c, w)) - { - hasWindowing_ = true; - windowingCenter_ = c; - windowingWidth_ = w; - } - - BroadcastMessage(GeometryChangedMessage(*this, *(layer->second))); - } - } - - - void RadiographyScene::OnFrameReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message) - { - size_t index = dynamic_cast&>(message.GetPayload()).GetValue(); - - VLOG(1) << "DICOM frame received: " << message.GetUri().c_str() - << " (" << message.GetAnswerSize() << " bytes) for layer " << index; - - Layers::iterator layer = layers_.find(index); - if (layer != layers_.end()) - { - assert(layer->second != NULL); - - std::string content; - if (message.GetAnswerSize() > 0) - { - content.assign(reinterpret_cast(message.GetAnswer()), message.GetAnswerSize()); - } - - std::unique_ptr reader(new Orthanc::PamReader); - reader->ReadFromMemory(content); - dynamic_cast(layer->second)->SetSourceImage(reader.release()); - - BroadcastMessage(ContentChangedMessage(*this, *(layer->second))); - } - } - - - Extent2D RadiographyScene::GetSceneExtent(bool minimal) const - { - Extent2D extent; - - for (Layers::const_iterator it = layers_.begin(); - it != layers_.end(); ++it) - { - assert(it->second != NULL); - extent.Union(it->second->GetSceneExtent(minimal)); - } - - return extent; - } - - - void RadiographyScene::Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - bool applyWindowing) const - { - // Render layers in the background-to-foreground order - for (size_t index = 0; index < nextLayerIndex_; index++) - { - try - { - Layers::const_iterator it = layers_.find(index); - if (it != layers_.end()) - { - assert(it->second != NULL); - it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); - } - } - catch (Orthanc::OrthancException& ex) - { - LOG(ERROR) << "RadiographyScene::Render: " << index << ", OrthancException: " << ex.GetDetails(); - throw ex; // rethrow because we want it to crash to see there's a problem ! - } - catch (...) - { - LOG(ERROR) << "RadiographyScene::Render: " << index << ", unkown exception: "; - throw; // rethrow because we want it to crash to see there's a problem ! - } - } - } - - - bool RadiographyScene::LookupLayer(size_t& index /* out */, - double x, - double y) const - { - // Render layers in the foreground-to-background order - for (size_t i = nextLayerIndex_; i > 0; i--) - { - index = i - 1; - Layers::const_iterator it = layers_.find(index); - if (it != layers_.end()) - { - assert(it->second != NULL); - if (it->second->Contains(x, y)) - { - return true; - } - } - } - - return false; - } - - - void RadiographyScene::DrawBorder(CairoContext& context, - unsigned int layer, - double zoom) - { - Layers::const_iterator found = layers_.find(layer); - - if (found != layers_.end()) - { - context.SetSourceColor(255, 0, 0); - found->second->DrawBorders(context, zoom); - } - } - - - void RadiographyScene::GetRange(float& minValue, - float& maxValue) const - { - bool first = true; - - for (Layers::const_iterator it = layers_.begin(); - it != layers_.end(); it++) - { - assert(it->second != NULL); - - float a, b; - if (it->second->GetRange(a, b)) - { - if (first) - { - minValue = a; - maxValue = b; - first = false; - } - else - { - minValue = std::min(a, minValue); - maxValue = std::max(b, maxValue); - } - } - } - - if (first) - { - minValue = 0; - maxValue = 0; - } - } - - void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, - const Orthanc::ImageAccessor& renderedScene, - size_t layerIndex, - bool isCropped, - ImageInterpolation interpolation) - { - Extent2D sceneExtent = GetSceneExtent(isCropped); - - double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth(); - double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight(); - - AffineTransform2D view = AffineTransform2D::Combine( - AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), - AffineTransform2D::CreateOffset(-sceneExtent.GetX1(), -sceneExtent.GetY1())); - - AffineTransform2D layerToSceneTransform = AffineTransform2D::Combine( - view, - GetLayer(layerIndex).GetTransform()); - - AffineTransform2D sceneToLayerTransform = AffineTransform2D::Invert(layerToSceneTransform); - sceneToLayerTransform.Apply(layer, renderedScene, interpolation, false); - } - - Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX, - double pixelSpacingY, - ImageInterpolation interpolation, - bool invert, - int64_t maxValue /* for inversion */, - bool autoCrop, - bool applyWindowing) - { - if (pixelSpacingX <= 0 || - pixelSpacingY <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - Extent2D extent = GetSceneExtent(autoCrop); - - int w = boost::math::iround(extent.GetWidth() / pixelSpacingX); - int h = boost::math::iround(extent.GetHeight() / pixelSpacingY); - - if (w < 0 || h < 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - Orthanc::Image layers(Orthanc::PixelFormat_Float32, - static_cast(w), - static_cast(h), false); - - AffineTransform2D view = AffineTransform2D::Combine( - AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), - AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1())); - - // wipe background before rendering - if (GetPreferredPhotomotricDisplayMode() == RadiographyPhotometricDisplayMode_Monochrome1) - { - Orthanc::ImageProcessing::Set(layers, 65535); - } - else - { - Orthanc::ImageProcessing::Set(layers, 0); - } - - Render(layers, view, interpolation, applyWindowing); - - std::unique_ptr rendered(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, - layers.GetWidth(), layers.GetHeight(), false)); - - Orthanc::ImageProcessing::Convert(*rendered, layers); - if (invert) - Orthanc::ImageProcessing::Invert(*rendered, maxValue); - - return rendered.release(); - } - - - Orthanc::Image* RadiographyScene::ExportToCreateDicomRequestAndImage(Json::Value& createDicomRequestContent, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation) - { - LOG(INFO) << "Exporting RadiographyScene to DICOM"; - - std::unique_ptr rendered(ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, autoCrop, false)); // note: we don't invert the image in the pixels data because we'll set the PhotometricDisplayMode correctly in the DICOM tags - - createDicomRequestContent["Tags"] = dicomTags; - - RadiographyPhotometricDisplayMode photometricMode = GetPreferredPhotomotricDisplayMode(); - if ((invert && photometricMode != RadiographyPhotometricDisplayMode_Monochrome2) || - (!invert && photometricMode == RadiographyPhotometricDisplayMode_Monochrome1)) - { - createDicomRequestContent["Tags"]["PhotometricInterpretation"] = "MONOCHROME1"; - } - else - { - createDicomRequestContent["Tags"]["PhotometricInterpretation"] = "MONOCHROME2"; - } - - // WARNING: The order of PixelSpacing is Y/X. We use "%0.8f" to - // avoid floating-point numbers to grow over 16 characters, - // which would be invalid according to DICOM standard - // ("dciodvfy" would complain). - char buf[32]; - sprintf(buf, "%0.8f\\%0.8f", pixelSpacingY, pixelSpacingX); - - createDicomRequestContent["Tags"]["PixelSpacing"] = buf; - - float center, width; - if (GetWindowing(center, width)) - { - createDicomRequestContent["Tags"]["WindowCenter"] = - boost::lexical_cast(boost::math::iround(center)); - - createDicomRequestContent["Tags"]["WindowWidth"] = - boost::lexical_cast(boost::math::iround(width)); - } - - if (!parentOrthancId.empty()) - { - createDicomRequestContent["Parent"] = parentOrthancId; - } - - return rendered.release(); - } - - - void RadiographyScene::ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam) - { - LOG(INFO) << "Exporting RadiographyScene to DICOM"; - VLOG(1) << "Exporting RadiographyScene to: export to image"; - - std::unique_ptr rendered(ExportToCreateDicomRequestAndImage(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation)); - - // convert the image into base64 for inclusing in the createDicomRequest - std::string base64; - - { - std::string content; - - if (usePam) - { - VLOG(1) << "Exporting RadiographyScene: convert to PAM"; - Orthanc::PamWriter writer; - writer.WriteToMemory(content, *rendered); - } - else - { - Orthanc::PngWriter writer; - writer.WriteToMemory(content, *rendered); - } - - VLOG(1) << "Exporting RadiographyScene: encoding to base64"; - Orthanc::Toolbox::EncodeBase64(base64, content); - } - - // This is Data URI scheme: https://en.wikipedia.org/wiki/Data_URI_scheme - createDicomRequestContent["Content"] = ("data:" + - std::string(usePam ? Orthanc::MIME_PAM : Orthanc::MIME_PNG) + - ";base64," + base64); - - VLOG(1) << "Exporting RadiographyScene: create-dicom request is ready"; - } - - - void RadiographyScene::ExportDicom(Deprecated::OrthancApiClient& orthanc, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam) - { - Json::Value createDicomRequestContent; - - ExportToCreateDicomRequest(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); - - orthanc.PostJsonAsyncExpectJson( - "/tools/create-dicom", createDicomRequestContent, - new Deprecated::DeprecatedCallable - (GetSharedObserver(), &RadiographyScene::OnDicomExported), - NULL, NULL); - - } - - - // Export using PAM is faster than using PNG, but requires Orthanc - // core >= 1.4.3 - void RadiographyScene::ExportDicom(Deprecated::OrthancApiClient& orthanc, - const Orthanc::DicomMap& dicom, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam) - { - std::set tags; - dicom.GetTags(tags); - - Json::Value jsonTags = Json::objectValue; - - for (std::set::const_iterator - tag = tags.begin(); tag != tags.end(); ++tag) - { - const Orthanc::DicomValue& value = dicom.GetValue(*tag); - if (!value.IsNull() && - !value.IsBinary()) - { - jsonTags[tag->Format()] = value.GetContent(); - } - } - - ExportDicom(orthanc, jsonTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); - } - - void RadiographyScene::OnDicomExported(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - LOG(INFO) << "DICOM export was successful: " - << message.GetJson().toStyledString(); - } - - - void RadiographyScene::OnDicomWebReceived(const Deprecated::IWebService::HttpRequestSuccessMessage& message) - { - LOG(INFO) << "DICOMweb WADO-RS received: " << message.GetAnswerSize() << " bytes"; - - const Deprecated::IWebService::HttpHeaders& h = message.GetAnswerHttpHeaders(); - for (Deprecated::IWebService::HttpHeaders::const_iterator - it = h.begin(); it != h.end(); ++it) - { - printf("[%s] = [%s]\n", it->first.c_str(), it->second.c_str()); - } - } - - void RadiographyScene::ExportToScene2D(Scene2D& output) const - { - int depth = 0; - for (Layers::const_iterator it = layers_.begin(); - it != layers_.end(); ++it) - { - assert(it->second != NULL); - - std::unique_ptr layer; - if (dynamic_cast(it->second)) - { - RadiographyDicomLayer* oldLayer = dynamic_cast(it->second); - - std::unique_ptr newLayer(new FloatTextureSceneLayer(*(oldLayer->GetSourceImage()))); - - newLayer->SetOrigin(oldLayer->GetGeometry().GetPanX(), - oldLayer->GetGeometry().GetPanY() - ); - newLayer->SetAngle(oldLayer->GetGeometry().GetAngle()); - - layer.reset(newLayer.release()); - - // TODO: windowing dynamic_cast - } - else if (dynamic_cast(it->second)) - { - RadiographyTextLayer* oldLayer = dynamic_cast(it->second); - - std::unique_ptr newLayer(new TextSceneLayer()); - - newLayer->SetText(oldLayer->GetText()); - newLayer->SetColor(oldLayer->GetForegroundGreyLevel(), - oldLayer->GetForegroundGreyLevel(), - oldLayer->GetForegroundGreyLevel() - ); - newLayer->SetPosition(oldLayer->GetGeometry().GetPanX(), - oldLayer->GetGeometry().GetPanY() - ); - newLayer->SetFontIndex(1); - newLayer->SetAnchor(BitmapAnchor_TopLeft); - //newLayer->SetAngle(oldLayer->GetGeometry().GetAngle()); - - layer.reset(newLayer.release()); - } - - output.SetLayer(depth++, layer.release()); - - } - - } - -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyScene.h --- a/Framework/Deprecated/Radiography/RadiographyScene.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,371 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyLayer.h" -#include "../Messages/ObserverBase.h" -#include "../Deprecated/Toolbox/DicomFrameConverter.h" -#include "../Deprecated/Toolbox/OrthancApiClient.h" -#include "../StoneEnumerations.h" -#include "../Scene2D/Scene2D.h" - -#include -#include - - -namespace OrthancStone -{ - class RadiographyDicomLayer; - - class RadiographyScene : - public ObserverBase, - public IObservable - { - friend class RadiographySceneGeometryReader; - public: - class GeometryChangedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - RadiographyLayer& layer_; - - public: - GeometryChangedMessage(const RadiographyScene& origin, - RadiographyLayer& layer) : - OriginMessage(origin), - layer_(layer) - { - } - - RadiographyLayer& GetLayer() const - { - return layer_; - } - }; - - class ContentChangedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - RadiographyLayer& layer_; - - public: - ContentChangedMessage(const RadiographyScene& origin, - RadiographyLayer& layer) : - OriginMessage(origin), - layer_(layer) - { - } - - RadiographyLayer& GetLayer() const - { - return layer_; - } - }; - - class LayerEditedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const RadiographyLayer& layer_; - - public: - LayerEditedMessage(const RadiographyScene& origin, - const RadiographyLayer& layer) : - OriginMessage(origin), - layer_(layer) - { - } - - const RadiographyLayer& GetLayer() const - { - return layer_; - } - }; - - class LayerRemovedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - size_t& layerIndex_; - - public: - LayerRemovedMessage(const RadiographyScene& origin, - size_t& layerIndex) : - OriginMessage(origin), - layerIndex_(layerIndex) - { - } - - size_t& GetLayerIndex() const - { - return layerIndex_; - } - }; - - - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, WindowingChangedMessage, RadiographyScene); - - - class LayerAccessor : public boost::noncopyable - { - private: - RadiographyScene& scene_; - size_t index_; - RadiographyLayer* layer_; - - public: - LayerAccessor(RadiographyScene& scene, - size_t index); - - LayerAccessor(RadiographyScene& scene, - double x, - double y); - - void Invalidate() - { - layer_ = NULL; - } - - bool IsValid() const - { - return layer_ != NULL; - } - - RadiographyScene& GetScene() const; - - size_t GetIndex() const; - - RadiographyLayer& GetLayer() const; - }; - - - protected: - typedef std::map Layers; - - size_t nextLayerIndex_; - bool hasWindowing_; - float windowingCenter_; - float windowingWidth_; - Layers layers_; - - public: - RadiographyLayer& RegisterLayer(RadiographyLayer* layer); - - protected: - virtual void _RegisterLayer(RadiographyLayer* layer); - virtual void _OnLayerRemoved() {} - - void SetLayerIndex(RadiographyLayer* layer, size_t index) - { - layer->SetIndex(index); - } - - virtual void OnTagsReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message); - - virtual void OnFrameReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message); - - void OnDicomExported(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); - - void OnDicomWebReceived(const Deprecated::IWebService::HttpRequestSuccessMessage& message); - - virtual void OnLayerEdited(const RadiographyLayer::LayerEditedMessage& message); - - public: - RadiographyScene(); - - virtual ~RadiographyScene(); - - virtual size_t GetApproximateMemoryUsage() const; - - bool GetWindowing(float& center, - float& width) const; - - void GetWindowingWithDefault(float& center, - float& width) const; - - virtual void SetWindowing(float center, - float width); - - RadiographyPhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const; - - RadiographyLayer& LoadText(const std::string& utf8, - const std::string& font, - unsigned int fontSize, - uint8_t foreground, - RadiographyLayer::Geometry* geometry, - bool isCenterGeometry); - - RadiographyLayer& UpdateText(size_t layerIndex, - const std::string& font, - const std::string& utf8, - unsigned int fontSize, - uint8_t foreground); - - RadiographyLayer& LoadTestBlock(unsigned int width, - unsigned int height, - RadiographyLayer::Geometry* geometry); - - RadiographyLayer& LoadMask(const std::vector& corners, - const RadiographyDicomLayer& dicomLayer, - float foreground, - RadiographyLayer::Geometry* geometry); - - RadiographyLayer& LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, // takes ownership - RadiographyLayer::Geometry* geometry); - - virtual RadiographyLayer& LoadDicomImage(Orthanc::ImageAccessor* dicomImage, // takes ownership - const std::string& instance, - unsigned int frame, - Deprecated::DicomFrameConverter* converter, // takes ownership - RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode, - RadiographyLayer::Geometry* geometry); - - virtual RadiographyLayer& LoadDicomFrame(Deprecated::OrthancApiClient& orthanc, - const std::string& instance, - unsigned int frame, - bool httpCompression, - RadiographyLayer::Geometry* geometry); // pass NULL if you want default geometry - - RadiographyLayer& LoadDicomWebFrame(Deprecated::IWebService& web); - - void RemoveLayer(size_t layerIndex); - - RadiographyLayer& GetLayer(size_t layerIndex); - - const RadiographyLayer& GetLayer(size_t layerIndex) const; - - template - TypeLayer* GetTypedLayer(size_t indexOfType = 0) - { - std::vector layerIndexes; - GetLayersIndexes(layerIndexes); - - size_t count = 0; - - for (size_t i = 0; i < layerIndexes.size(); ++i) - { - TypeLayer* typedLayer = dynamic_cast(layers_[layerIndexes[i]]); - if (typedLayer != NULL) - { - if (count == indexOfType) - { - return typedLayer; - } - count++; - } - } - - return NULL; - } - - void GetLayersIndexes(std::vector& output) const; - - virtual Extent2D GetSceneExtent(bool minimal) const; - - virtual void Render(Orthanc::ImageAccessor& buffer, - const AffineTransform2D& viewTransform, - ImageInterpolation interpolation, - bool applyWindowing) const; - - bool LookupLayer(size_t& index /* out */, - double x, - double y) const; - - void DrawBorder(CairoContext& context, - unsigned int layer, - double zoom); - - void GetRange(float& minValue, - float& maxValue) const; - - void ExportToScene2D(Scene2D& output) const; - - // Export using PAM is faster than using PNG, but requires Orthanc - // core >= 1.4.3 - void ExportDicom(Deprecated::OrthancApiClient& orthanc, - const Orthanc::DicomMap& dicom, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam); - - void ExportDicom(Deprecated::OrthancApiClient& orthanc, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam); - - void ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation, - bool usePam); - - Orthanc::Image* ExportToCreateDicomRequestAndImage(Json::Value& createDicomRequestContent, - const Json::Value& dicomTags, - const std::string& parentOrthancId, - double pixelSpacingX, - double pixelSpacingY, - bool invert, - bool autoCrop, - ImageInterpolation interpolation); - - Orthanc::Image* ExportToImage(double pixelSpacingX, - double pixelSpacingY, - ImageInterpolation interpolation, - bool autoCrop, - bool applyWindowing) - { - return ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false, 0, autoCrop, applyWindowing); - } - - Orthanc::Image* ExportToImage(double pixelSpacingX, - double pixelSpacingY, - ImageInterpolation interpolation, - bool invert, - int64_t maxValue /* for inversion */, - bool autoCrop, - bool applyWindowing); - - void ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, - const Orthanc::ImageAccessor& renderedScene, - size_t layerIndex, - bool isCropped, - ImageInterpolation interpolation); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneCommand.cpp --- a/Framework/Deprecated/Radiography/RadiographySceneCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographySceneCommand.h" - - -namespace OrthancStone -{ - RadiographySceneCommand::RadiographySceneCommand(RadiographyScene& scene, - size_t layer) : - scene_(scene), - layer_(layer) - { - } - - - RadiographySceneCommand::RadiographySceneCommand(const RadiographyScene::LayerAccessor& accessor) : - scene_(accessor.GetScene()), - layer_(accessor.GetIndex()) - { - } - - - void RadiographySceneCommand::Undo() const - { - RadiographyScene::LayerAccessor accessor(scene_, layer_); - - if (accessor.IsValid()) - { - UndoInternal(accessor.GetLayer()); - } - } - - - void RadiographySceneCommand::Redo() const - { - RadiographyScene::LayerAccessor accessor(scene_, layer_); - - if (accessor.IsValid()) - { - RedoInternal(accessor.GetLayer()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneCommand.h --- a/Framework/Deprecated/Radiography/RadiographySceneCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - class RadiographySceneCommand : public UndoRedoStack::ICommand - { - private: - RadiographyScene& scene_; - size_t layer_; - - protected: - virtual void UndoInternal(RadiographyLayer& layer) const = 0; - - virtual void RedoInternal(RadiographyLayer& layer) const = 0; - - public: - RadiographySceneCommand(RadiographyScene& scene, - size_t layer); - - RadiographySceneCommand(const RadiographyScene::LayerAccessor& accessor); - - virtual void Undo() const; - - virtual void Redo() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneReader.cpp --- a/Framework/Deprecated/Radiography/RadiographySceneReader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographySceneReader.h" - -#include "../Deprecated/Toolbox/DicomFrameConverter.h" - -#include -#include -#include -#include - -namespace OrthancStone -{ - - void RadiographySceneBuilder::Read(const Json::Value& input, Orthanc::ImageAccessor* dicomImage /* takes ownership */, - Deprecated::DicomFrameConverter* dicomFrameConverter /* takes ownership */, - RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode - ) - { - dicomImage_.reset(dicomImage); - dicomFrameConverter_.reset(dicomFrameConverter); - preferredPhotometricDisplayMode_ = preferredPhotometricDisplayMode; - Read(input); - } - - RadiographyDicomLayer* RadiographySceneBuilder::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) - { - return dynamic_cast(&(scene_.LoadDicomImage(dicomImage_.release(), instanceId, frame, dicomFrameConverter_.release(), preferredPhotometricDisplayMode_, geometry))); - } - - - RadiographyDicomLayer* RadiographySceneReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) - { - return dynamic_cast(&(scene_.LoadDicomFrame(orthancApiClient_, instanceId, frame, false, geometry))); - } - - RadiographyDicomLayer* RadiographySceneGeometryReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) - { - std::unique_ptr layer(new RadiographyPlaceholderLayer(scene_)); - layer->SetGeometry(*geometry); - layer->SetSize(dicomImageWidth_, dicomImageHeight_); - scene_.RegisterLayer(layer.get()); - - return layer.release(); - } - - void RadiographySceneBuilder::Read(const Json::Value& input) - { - unsigned int version = input["version"].asUInt(); - - if (version != 1) - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - - if (input.isMember("hasWindowing") && input["hasWindowing"].asBool()) - { - scene_.SetWindowing(input["windowCenter"].asFloat(), input["windowWidth"].asFloat()); - } - - RadiographyDicomLayer* dicomLayer = NULL; - for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) - { - const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; - RadiographyLayer::Geometry geometry; - - if (jsonLayer["type"].asString() == "dicom") - { - ReadLayerGeometry(geometry, jsonLayer); - dicomLayer = LoadDicom(jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), &geometry); - } - else if (jsonLayer["type"].asString() == "mask") - { - if (dicomLayer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // we always assumed the dicom layer was read before the mask - } - ReadLayerGeometry(geometry, jsonLayer); - - float foreground = jsonLayer["foreground"].asFloat(); - std::vector corners; - for (size_t i = 0; i < jsonLayer["corners"].size(); i++) - { - Orthanc::ImageProcessing::ImagePoint corner(jsonLayer["corners"][(int)i]["x"].asInt(), - jsonLayer["corners"][(int)i]["y"].asInt()); - corners.push_back(corner); - } - - scene_.LoadMask(corners, *dicomLayer, foreground, &geometry); - } - else if (jsonLayer["type"].asString() == "text") - { - ReadLayerGeometry(geometry, jsonLayer); - scene_.LoadText(jsonLayer["text"].asString(), jsonLayer["font"].asString(), jsonLayer["fontSize"].asUInt(), static_cast(jsonLayer["foreground"].asUInt()), &geometry, false); - } - else if (jsonLayer["type"].asString() == "alpha") - { - ReadLayerGeometry(geometry, jsonLayer); - - const std::string& pngContentBase64 = jsonLayer["content"].asString(); - std::string pngContent; - std::string mimeType; - Orthanc::Toolbox::DecodeDataUriScheme(mimeType, pngContent, pngContentBase64); - - std::unique_ptr image; - if (mimeType == "image/png") - { - image.reset(new Orthanc::PngReader()); - dynamic_cast(image.get())->ReadFromMemory(pngContent); - } - else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - - RadiographyAlphaLayer& layer = dynamic_cast(scene_.LoadAlphaBitmap(image.release(), &geometry)); - - if (!jsonLayer["isUsingWindowing"].asBool()) - { - layer.SetForegroundValue((float)(jsonLayer["foreground"].asDouble())); - } - } - else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - - - void RadiographySceneBuilder::ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input) - { - for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) - { - const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; - if (jsonLayer["type"].asString() == "dicom") - { - ReadLayerGeometry(geometry, jsonLayer); - return; - } - } - } - - void RadiographySceneBuilder::ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& jsonLayer) - { - {// crop - unsigned int x, y, width, height; - if (jsonLayer["crop"]["hasCrop"].asBool()) - { - x = jsonLayer["crop"]["x"].asUInt(); - y = jsonLayer["crop"]["y"].asUInt(); - width = jsonLayer["crop"]["width"].asUInt(); - height = jsonLayer["crop"]["height"].asUInt(); - geometry.SetCrop(x, y, width, height); - } - } - - geometry.SetAngle(jsonLayer["angle"].asDouble()); - geometry.SetResizeable(jsonLayer["isResizable"].asBool()); - geometry.SetPan(jsonLayer["pan"]["x"].asDouble(), jsonLayer["pan"]["y"].asDouble()); - geometry.SetPixelSpacing(jsonLayer["pixelSpacing"]["x"].asDouble(), jsonLayer["pixelSpacing"]["y"].asDouble()); - - // these fields were introduced later -> they might not exist - if (jsonLayer.isMember("flipVertical")) - { - geometry.SetFlipVertical(jsonLayer["flipVertical"].asBool()); - } - if (jsonLayer.isMember("flipHorizontal")) - { - geometry.SetFlipHorizontal(jsonLayer["flipHorizontal"].asBool()); - } - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneReader.h --- a/Framework/Deprecated/Radiography/RadiographySceneReader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyScene.h" -#include "RadiographyAlphaLayer.h" -#include "RadiographyDicomLayer.h" -#include "RadiographyMaskLayer.h" -#include "RadiographyTextLayer.h" -#include "../Deprecated/Toolbox/OrthancApiClient.h" - -#include -#include - -namespace OrthancStone -{ - // a layer containing only the geometry of a DICOM layer (bit hacky !) - class RadiographyPlaceholderLayer : public RadiographyDicomLayer - { - public: - RadiographyPlaceholderLayer(const RadiographyScene& scene) : - RadiographyDicomLayer(scene) - { - } - - }; - - - // HACK: I had to introduce this builder class in order to be able to recreate a RadiographyScene - // from a serialized scene that is passed to web-workers. - // It needs some architecturing... - class RadiographySceneBuilder : public boost::noncopyable - { - protected: - RadiographyScene& scene_; - std::unique_ptr dicomImage_; - std::unique_ptr dicomFrameConverter_; - RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode_; - - public: - RadiographySceneBuilder(RadiographyScene& scene) : - scene_(scene) - { - } - - void Read(const Json::Value& input); - void Read(const Json::Value& input, - Orthanc::ImageAccessor* dicomImage, // takes ownership - Deprecated::DicomFrameConverter* dicomFrameConverter, // takes ownership - RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode - ); - - static void ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input); - static void ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input); - - protected: - virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); - - }; - - - class RadiographySceneReader : public RadiographySceneBuilder - { - Deprecated::OrthancApiClient& orthancApiClient_; - - public: - RadiographySceneReader(RadiographyScene& scene, Deprecated::OrthancApiClient& orthancApiClient) : - RadiographySceneBuilder(scene), - orthancApiClient_(orthancApiClient) - { - } - - protected: - virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); - }; - - // reads the whole scene but the DICOM image such that we have the full geometry - class RadiographySceneGeometryReader : public RadiographySceneBuilder - { - unsigned int dicomImageWidth_; - unsigned int dicomImageHeight_; - - public: - RadiographySceneGeometryReader(RadiographyScene& scene, unsigned int dicomImageWidth, unsigned int dicomImageHeight) : - RadiographySceneBuilder(scene), - dicomImageWidth_(dicomImageWidth), - dicomImageHeight_(dicomImageHeight) - { - } - - protected: - virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneWriter.cpp --- a/Framework/Deprecated/Radiography/RadiographySceneWriter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographySceneWriter.h" - -#include -#include -#include - -namespace OrthancStone -{ - void RadiographySceneWriter::Write(Json::Value& output, const RadiographyScene& scene) - { - output["version"] = 1; - float windowCenter, windowWidth; - bool hasWindowing = scene.GetWindowing(windowCenter, windowWidth); - output["hasWindowing"] = hasWindowing; - if (hasWindowing) - { - output["windowCenter"] = windowCenter; - output["windowWidth"] = windowWidth; - } - output["layers"] = Json::arrayValue; - - std::vector layersIndexes; - scene.GetLayersIndexes(layersIndexes); - - for (std::vector::iterator itLayerIndex = layersIndexes.begin(); itLayerIndex < layersIndexes.end(); itLayerIndex++) - { - Json::Value layer; - WriteLayer(layer, scene.GetLayer(*itLayerIndex)); - output["layers"].append(layer); - } - } - - void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyDicomLayer& layer) - { - output["type"] = "dicom"; - output["instanceId"] = layer.GetInstanceId(); - output["frame"] = layer.GetFrame(); - } - - void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyTextLayer& layer) - { - output["type"] = "text"; - output["text"] = layer.GetText(); - output["font"] = layer.GetFont(); - output["fontSize"] = layer.GetFontSize(); - output["foreground"] = layer.GetForegroundGreyLevel(); - } - - void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyMaskLayer& layer) - { - output["type"] = "mask"; - output["instanceId"] = layer.GetInstanceId(); // the dicom layer it's being linked to - output["foreground"] = layer.GetForeground(); - output["corners"] = Json::arrayValue; - const std::vector& corners = layer.GetCorners(); - for (size_t i = 0; i < corners.size(); i++) - { - Json::Value corner; - corner["x"] = corners[i].GetX(); - corner["y"] = corners[i].GetY(); - output["corners"].append(corner); - } - } - - void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyAlphaLayer& layer) - { - output["type"] = "alpha"; - - //output["bitmap"] = - const Orthanc::ImageAccessor& alpha = layer.GetAlpha(); - - Orthanc::PngWriter pngWriter; - std::string pngContent; - std::string pngContentBase64; - pngWriter.WriteToMemory(pngContent, alpha); - - Orthanc::Toolbox::EncodeDataUriScheme(pngContentBase64, "image/png", pngContent); - output["content"] = pngContentBase64; - output["foreground"] = layer.GetForegroundValue(); - } - - void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyLayer& layer) - { - const RadiographyLayer::Geometry& geometry = layer.GetGeometry(); - - {// crop - Json::Value crop; - if (geometry.HasCrop()) - { - unsigned int x, y, width, height; - geometry.GetCrop(x, y, width, height); - crop["hasCrop"] = true; - crop["x"] = x; - crop["y"] = y; - crop["width"] = width; - crop["height"] = height; - } - else - { - crop["hasCrop"] = false; - } - - output["crop"] = crop; - } - - output["angle"] = geometry.GetAngle(); - output["isResizable"] = geometry.IsResizeable(); - - {// pan - Json::Value pan; - pan["x"] = geometry.GetPanX(); - pan["y"] = geometry.GetPanY(); - output["pan"] = pan; - } - - {// pixelSpacing - Json::Value pan; - pan["x"] = geometry.GetPixelSpacingX(); - pan["y"] = geometry.GetPixelSpacingY(); - output["pixelSpacing"] = pan; - } - - output["flipVertical"] = geometry.GetFlipVertical(); - output["flipHorizontal"] = geometry.GetFlipHorizontal(); - - if (dynamic_cast(&layer) != NULL) - { - WriteLayer(output, dynamic_cast(layer)); - } - else if (dynamic_cast(&layer) != NULL) - { - WriteLayer(output, dynamic_cast(layer)); - } - else if (dynamic_cast(&layer) != NULL) - { - WriteLayer(output, dynamic_cast(layer)); - } - else if (dynamic_cast(&layer) != NULL) - { - WriteLayer(output, dynamic_cast(layer)); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographySceneWriter.h --- a/Framework/Deprecated/Radiography/RadiographySceneWriter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyScene.h" -#include "RadiographyAlphaLayer.h" -#include "RadiographyDicomLayer.h" -#include "RadiographyTextLayer.h" -#include "RadiographyMaskLayer.h" -#include - -namespace OrthancStone -{ - class RadiographyScene; - - class RadiographySceneWriter : public boost::noncopyable - { - - public: - RadiographySceneWriter() - { - } - - void Write(Json::Value& output, const RadiographyScene& scene); - - private: - void WriteLayer(Json::Value& output, const RadiographyLayer& layer); - void WriteLayer(Json::Value& output, const RadiographyDicomLayer& layer); - void WriteLayer(Json::Value& output, const RadiographyTextLayer& layer); - void WriteLayer(Json::Value& output, const RadiographyAlphaLayer& layer); - void WriteLayer(Json::Value& output, const RadiographyMaskLayer& layer); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyTextLayer.cpp --- a/Framework/Deprecated/Radiography/RadiographyTextLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "RadiographyTextLayer.h" - -#include "RadiographyScene.h" -#include "../Toolbox/TextRenderer.h" - -#include - -namespace OrthancStone -{ - std::map RadiographyTextLayer::fonts_; - - void RadiographyTextLayer::SetText(const std::string& utf8, - const std::string& font, - unsigned int fontSize, - uint8_t foregroundGreyLevel) - { - if (fonts_.find(font) == fonts_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "The font has not been registered"); - } - - text_ = utf8; - font_ = font; - fontSize_ = fontSize; - foregroundGreyLevel_ = foregroundGreyLevel; - - SetAlpha(TextRenderer::Render(fonts_[font_], - fontSize_, - text_)); - - SetForegroundValue(foregroundGreyLevel * 256.0f); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyTextLayer.h --- a/Framework/Deprecated/Radiography/RadiographyTextLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "RadiographyAlphaLayer.h" - -namespace OrthancStone -{ - class RadiographyScene; - - class RadiographyTextLayer : public RadiographyAlphaLayer - { - private: - std::string text_; - std::string font_; - unsigned int fontSize_; - uint8_t foregroundGreyLevel_; - - static std::map fonts_; - public: - RadiographyTextLayer(const RadiographyScene& scene) : - RadiographyAlphaLayer(scene) - { - } - - void SetText(const std::string& utf8, const std::string& font, unsigned int fontSize, uint8_t foregroundGreyLevel); - - const std::string& GetText() const - { - return text_; - } - - const std::string& GetFont() const - { - return font_; - } - - unsigned int GetFontSize() const - { - return fontSize_; - } - - uint8_t GetForegroundGreyLevel() const - { - return foregroundGreyLevel_; - } - - static void RegisterFont(const std::string& name, Orthanc::EmbeddedResources::FileResourceId fontResourceId) - { - fonts_[name] = fontResourceId; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyWidget.cpp --- a/Framework/Deprecated/Radiography/RadiographyWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,284 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyWidget.h" - -#include -#include -#include - -#include "RadiographyMaskLayer.h" - -namespace OrthancStone -{ - - bool RadiographyWidget::IsInvertedInternal() const - { - // MONOCHROME1 images must be inverted and the user can invert the - // image, too -> XOR the two - return (scene_->GetPreferredPhotomotricDisplayMode() == - RadiographyPhotometricDisplayMode_Monochrome1) ^ invert_; - } - - void RadiographyWidget::RenderBackground( - Orthanc::ImageAccessor& image, float minValue, float maxValue) - { - // wipe background before rendering - float backgroundValue = minValue; - - switch (scene_->GetPreferredPhotomotricDisplayMode()) - { - case RadiographyPhotometricDisplayMode_Monochrome1: - case RadiographyPhotometricDisplayMode_Default: - if (IsInvertedInternal()) - backgroundValue = maxValue; - else - backgroundValue = minValue; - break; - case RadiographyPhotometricDisplayMode_Monochrome2: - if (IsInvertedInternal()) - backgroundValue = minValue; - else - backgroundValue = maxValue; - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - Orthanc::ImageProcessing::Set(image, static_cast(backgroundValue)); - } - - bool RadiographyWidget::RenderInternal(unsigned int width, - unsigned int height, - ImageInterpolation interpolation) - { - if (floatBuffer_.get() == NULL || - floatBuffer_->GetWidth() != width || - floatBuffer_->GetHeight() != height) - { - floatBuffer_.reset(new Orthanc::Image( - Orthanc::PixelFormat_Float32, width, height, false)); - - if (floatBuffer_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "RadiographyWidget::RenderInternal: unable to allocate float buffer"); - } - } - - if (cairoBuffer_.get() == NULL || - cairoBuffer_->GetWidth() != width || - cairoBuffer_->GetHeight() != height) - { - cairoBuffer_.reset(new CairoSurface(width, height, false /* no alpha */)); - - if (cairoBuffer_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "RadiographyWidget::RenderInternal: unable to allocate cairo buffer"); - } - } - - RenderBackground(*floatBuffer_, 0.0, 65535.0); - - scene_->Render(*floatBuffer_, GetView().GetMatrix(), interpolation, true); - - // Conversion from Float32 to BGRA32 (cairo). Very similar to - // GrayscaleFrameRenderer => TODO MERGE? - Orthanc::ImageAccessor target; - cairoBuffer_->GetWriteableAccessor(target); - - bool invert = IsInvertedInternal(); - - for (unsigned int y = 0; y < height; y++) - { - const float* p = reinterpret_cast(floatBuffer_->GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < width; x++, p++, q += 4) - { - uint8_t v = 0; - if (*p >= 65535.0) - { - v = 255; - } - else if (*p <= 0.0) - { - v = 0; - } - else - { - v = static_cast(*p / 256.0); - } - - if (invert) - { - v = 255 - v; - } - - q[0] = v; - q[1] = v; - q[2] = v; - q[3] = 255; - } - } - - return true; - } - - - bool RadiographyWidget::RenderScene(CairoContext& context, - const Deprecated::ViewportGeometry& view) - { - cairo_t* cr = context.GetObject(); - - if (RenderInternal(context.GetWidth(), context.GetHeight(), interpolation_)) - { - // https://www.cairographics.org/FAQ/#paint_from_a_surface - cairo_save(cr); - cairo_identity_matrix(cr); - cairo_set_source_surface(cr, cairoBuffer_->GetObject(), 0, 0); - cairo_paint(cr); - cairo_restore(cr); - } - else - { - // https://www.cairographics.org/FAQ/#clear_a_surface - context.SetSourceColor(0, 0, 0); - cairo_paint(cr); - } - - if (hasSelection_) - { - scene_->DrawBorder( - context, static_cast(selectedLayer_), view.GetZoom()); - } - - return true; - } - - - RadiographyWidget::RadiographyWidget(boost::shared_ptr scene, - const std::string& name) : - WorldSceneWidget(name), - invert_(false), - interpolation_(ImageInterpolation_Nearest), - hasSelection_(false), - selectedLayer_(0) // Dummy initialization - { - SetScene(scene); - } - - - void RadiographyWidget::Select(size_t layer) - { - hasSelection_ = true; - selectedLayer_ = layer; - - NotifyContentChanged(); - BroadcastMessage(SelectionChangedMessage(*this)); - } - - void RadiographyWidget::Unselect() - { - hasSelection_ = false; - - NotifyContentChanged(); - BroadcastMessage(SelectionChangedMessage(*this)); - } - - bool RadiographyWidget::LookupSelectedLayer(size_t& layer) const - { - if (hasSelection_) - { - layer = selectedLayer_; - return true; - } - else - { - return false; - } - } - - - void RadiographyWidget::OnGeometryChanged(const RadiographyScene::GeometryChangedMessage& message) - { -// LOG(INFO) << "Scene geometry has changed"; - FitContent(); - } - - - void RadiographyWidget::OnContentChanged(const RadiographyScene::ContentChangedMessage& message) - { -// LOG(INFO) << "Scene content has changed"; - NotifyContentChanged(); - } - - void RadiographyWidget::OnLayerRemoved(const RadiographyScene::LayerRemovedMessage& message) - { - size_t removedLayerIndex = message.GetLayerIndex(); - if (hasSelection_ && selectedLayer_ == removedLayerIndex) - { - Unselect(); - } - NotifyContentChanged(); - } - - void RadiographyWidget::SetInvert(bool invert) - { - if (invert_ != invert) - { - invert_ = invert; - NotifyContentChanged(); - } - } - - - void RadiographyWidget::SwitchInvert() - { - invert_ = !invert_; - NotifyContentChanged(); - } - - - void RadiographyWidget::SetInterpolation(ImageInterpolation interpolation) - { - if (interpolation_ != interpolation) - { - interpolation_ = interpolation; - NotifyContentChanged(); - } - } - - void RadiographyWidget::SetScene(boost::shared_ptr scene) - { - scene_ = scene; - - Register(*scene_, &RadiographyWidget::OnGeometryChanged); - Register(*scene_, &RadiographyWidget::OnContentChanged); - Register(*scene_, &RadiographyWidget::OnLayerRemoved); - - Unselect(); - - NotifyContentChanged(); - - // force redraw - FitContent(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyWidget.h --- a/Framework/Deprecated/Radiography/RadiographyWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Deprecated/Widgets/WorldSceneWidget.h" -#include "../Messages/ObserverBase.h" -#include "RadiographyScene.h" - - -namespace OrthancStone -{ - class RadiographyMaskLayer; - - class RadiographyWidget : - public Deprecated::WorldSceneWidget, - public ObserverBase, - public IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SelectionChangedMessage, RadiographyWidget); - - private: - boost::shared_ptr scene_; - std::unique_ptr floatBuffer_; - std::unique_ptr cairoBuffer_; - bool invert_; - ImageInterpolation interpolation_; - bool hasSelection_; - size_t selectedLayer_; - - bool RenderInternal(unsigned int width, - unsigned int height, - ImageInterpolation interpolation); - - protected: - virtual Extent2D GetSceneExtent() - { - return scene_->GetSceneExtent(false); - } - - virtual bool RenderScene(CairoContext& context, - const Deprecated::ViewportGeometry& view); - - virtual void RenderBackground(Orthanc::ImageAccessor& image, float minValue, float maxValue); - - bool IsInvertedInternal() const; - - public: - RadiographyWidget(boost::shared_ptr scene, // TODO: check how we can avoid boost::shared_ptr here since we don't want them in the public API (app is keeping a boost::shared_ptr to this right now) - const std::string& name); - - RadiographyScene& GetScene() const - { - return *scene_; - } - - void SetScene(boost::shared_ptr scene); - - void Select(size_t layer); - - void Unselect(); - - template bool SelectLayerByType(size_t index = 0); - - bool LookupSelectedLayer(size_t& layer) const; - - void OnGeometryChanged(const RadiographyScene::GeometryChangedMessage& message); - - void OnContentChanged(const RadiographyScene::ContentChangedMessage& message); - - void OnLayerRemoved(const RadiographyScene::LayerRemovedMessage& message); - - void SetInvert(bool invert); - - void SwitchInvert(); - - bool IsInverted() const - { - return invert_; - } - - void SetInterpolation(ImageInterpolation interpolation); - - ImageInterpolation GetInterpolation() const - { - return interpolation_; - } - }; - - template bool RadiographyWidget::SelectLayerByType(size_t index) - { - std::vector layerIndexes; - size_t count = 0; - scene_->GetLayersIndexes(layerIndexes); - - for (size_t i = 0; i < layerIndexes.size(); ++i) - { - const LayerType* typedLayer = dynamic_cast(&(scene_->GetLayer(layerIndexes[i]))); - if (typedLayer != NULL) - { - if (count == index) - { - Select(layerIndexes[i]); - return true; - } - count++; - } - } - - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyWindowingTracker.cpp --- a/Framework/Deprecated/Radiography/RadiographyWindowingTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "RadiographyWindowingTracker.h" -#include "RadiographyWidget.h" - -#include - - -namespace OrthancStone -{ - class RadiographyWindowingTracker::UndoRedoCommand : public UndoRedoStack::ICommand - { - private: - RadiographyScene& scene_; - float sourceCenter_; - float sourceWidth_; - float targetCenter_; - float targetWidth_; - - public: - UndoRedoCommand(const RadiographyWindowingTracker& tracker) : - scene_(tracker.scene_), - sourceCenter_(tracker.sourceCenter_), - sourceWidth_(tracker.sourceWidth_) - { - scene_.GetWindowingWithDefault(targetCenter_, targetWidth_); - } - - virtual void Undo() const - { - scene_.SetWindowing(sourceCenter_, sourceWidth_); - } - - virtual void Redo() const - { - scene_.SetWindowing(targetCenter_, targetWidth_); - } - }; - - - void RadiographyWindowingTracker::ComputeAxisEffect(int& deltaCenter, - int& deltaWidth, - int delta, - Action actionNegative, - Action actionPositive) - { - if (delta < 0) - { - switch (actionNegative) - { - case Action_IncreaseWidth: - deltaWidth = -delta; - break; - - case Action_DecreaseWidth: - deltaWidth = delta; - break; - - case Action_IncreaseCenter: - deltaCenter = -delta; - break; - - case Action_DecreaseCenter: - deltaCenter = delta; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - else if (delta > 0) - { - switch (actionPositive) - { - case Action_IncreaseWidth: - deltaWidth = delta; - break; - - case Action_DecreaseWidth: - deltaWidth = -delta; - break; - - case Action_IncreaseCenter: - deltaCenter = delta; - break; - - case Action_DecreaseCenter: - deltaCenter = -delta; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - - - RadiographyWindowingTracker::RadiographyWindowingTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - RadiographyWidget& widget, - ImageInterpolation interpolationDuringTracking, - int x, - int y, - Action leftAction, - Action rightAction, - Action upAction, - Action downAction) : - undoRedoStack_(undoRedoStack), - scene_(scene), - widget_(widget), - initialWidgetInterpolation_(widget.GetInterpolation()), - clickX_(x), - clickY_(y), - leftAction_(leftAction), - rightAction_(rightAction), - upAction_(upAction), - downAction_(downAction) - { - scene_.GetWindowingWithDefault(sourceCenter_, sourceWidth_); - widget_.SetInterpolation(interpolationDuringTracking); - - float minValue, maxValue; - scene.GetRange(minValue, maxValue); - - assert(minValue <= maxValue); - - float delta = (maxValue - minValue); - strength_ = delta / 1000.0f; // 1px move will change the ww/wc by 0.1% - - if (strength_ < 1) - { - strength_ = 1; - } - } - - - void RadiographyWindowingTracker::Render(CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void RadiographyWindowingTracker::MouseUp() - { - widget_.SetInterpolation(initialWidgetInterpolation_); - undoRedoStack_.Add(new UndoRedoCommand(*this)); - } - - - void RadiographyWindowingTracker::MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - // This follows the behavior of the Osimis Web viewer: - // https://bitbucket.org/osimis/osimis-webviewer-plugin/src/master/frontend/src/app/viewport/image-plugins/windowing-viewport-tool.class.js - - static const float SCALE = 1.0; - - int deltaCenter = 0; - int deltaWidth = 0; - - ComputeAxisEffect(deltaCenter, deltaWidth, displayX - clickX_, leftAction_, rightAction_); - ComputeAxisEffect(deltaCenter, deltaWidth, displayY - clickY_, upAction_, downAction_); - - float newCenter = sourceCenter_ + (deltaCenter / SCALE * strength_); - float newWidth = sourceWidth_ + (deltaWidth / SCALE * strength_); - scene_.SetWindowing(newCenter, newWidth); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Radiography/RadiographyWindowingTracker.h --- a/Framework/Deprecated/Radiography/RadiographyWindowingTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/UndoRedoStack.h" -#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" -#include "RadiographyScene.h" - -namespace OrthancStone -{ - - class RadiographyWidget; - - class RadiographyWindowingTracker : public Deprecated::IWorldSceneMouseTracker - { - public: - enum Action - { - Action_IncreaseWidth, - Action_DecreaseWidth, - Action_IncreaseCenter, - Action_DecreaseCenter - }; - - private: - class UndoRedoCommand; - - UndoRedoStack& undoRedoStack_; - RadiographyScene& scene_; - RadiographyWidget& widget_; - ImageInterpolation initialWidgetInterpolation_; - int clickX_; - int clickY_; - Action leftAction_; - Action rightAction_; - Action upAction_; - Action downAction_; - float strength_; - float sourceCenter_; - float sourceWidth_; - - static void ComputeAxisEffect(int& deltaCenter, - int& deltaWidth, - int delta, - Action actionNegative, - Action actionPositive); - - public: - RadiographyWindowingTracker(UndoRedoStack& undoRedoStack, - RadiographyScene& scene, - RadiographyWidget& widget, - ImageInterpolation interpolationDuringTracking, - int x, - int y, - Action leftAction, - Action rightAction, - Action upAction, - Action downAction); - - virtual bool HasRender() const - { - return false; - } - - virtual void Render(CairoContext& context, - double zoom); - - virtual void MouseUp(); - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/SmartLoader.cpp --- a/Framework/Deprecated/SmartLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,285 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SmartLoader.h" - -#include "../StoneException.h" -#include "Layers/DicomSeriesVolumeSlicer.h" -#include "Layers/FrameRenderer.h" -#include "Widgets/SliceViewerWidget.h" - -#include -#include - -namespace Deprecated -{ - enum CachedSliceStatus - { - CachedSliceStatus_ScheduledToLoad, - CachedSliceStatus_GeometryLoaded, - CachedSliceStatus_ImageLoaded - }; - - class SmartLoader::CachedSlice : public IVolumeSlicer - { - public: - class RendererFactory : public LayerReadyMessage::IRendererFactory - { - private: - const CachedSlice& that_; - - public: - RendererFactory(const CachedSlice& that) : - that_(that) - { - } - - virtual ILayerRenderer* CreateRenderer() const - { - bool isFull = (that_.effectiveQuality_ == SliceImageQuality_FullPng || - that_.effectiveQuality_ == SliceImageQuality_FullPam); - - return FrameRenderer::CreateRenderer(*that_.image_, *that_.slice_, isFull); - } - }; - - unsigned int sliceIndex_; - std::unique_ptr slice_; - boost::shared_ptr image_; - SliceImageQuality effectiveQuality_; - CachedSliceStatus status_; - - public: - virtual ~CachedSlice() - { - } - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice) - { - // TODO: viewportSlice is not used !!!! - slice_->GetExtent(points); - return true; - } - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) - { - // TODO: viewportSlice is not used !!!! - - // it has already been loaded -> trigger the "layer ready" message immediately otherwise, do nothing now. The LayerReady will be triggered - // once the VolumeSlicer is ready - if (status_ == CachedSliceStatus_ImageLoaded) - { - LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is loaded): " << slice_->GetOrthancInstanceId(); - - RendererFactory factory(*this); - BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, slice_->GetGeometry())); - } - else - { - LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is not loaded yet): " << slice_->GetOrthancInstanceId(); - } - } - - CachedSlice* Clone() const - { - CachedSlice* output = new CachedSlice; - output->sliceIndex_ = sliceIndex_; - output->slice_.reset(slice_->Clone()); - output->image_ = image_; - output->effectiveQuality_ = effectiveQuality_; - output->status_ = status_; - - return output; - } - - }; - - - SmartLoader::SmartLoader(boost::shared_ptr orthancApiClient) : - imageQuality_(SliceImageQuality_FullPam), - orthancApiClient_(orthancApiClient) - { - } - - void SmartLoader::SetFrameInWidget(SliceViewerWidget& sliceViewer, - size_t layerIndex, - const std::string& instanceId, - unsigned int frame) - { - // TODO: check if this frame has already been loaded or is already being loaded. - // - if already loaded: create a "clone" that will emit the GeometryReady/ImageReady messages "immediately" - // (it can not be immediate because Observers needs to register first and this is done after this method returns) - // - if currently loading, we need to return an object that will observe the existing VolumeSlicer and forward - // the messages to its observables - // in both cases, we must be carefull about objects lifecycle !!! - - boost::shared_ptr layerSource; - std::string sliceKeyId = instanceId + ":" + boost::lexical_cast(frame); - SmartLoader::CachedSlice* cachedSlice = NULL; - - if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded) - { - layerSource.reset(cachedSlices_[sliceKeyId]->Clone()); - cachedSlice = dynamic_cast(layerSource.get()); - } - else - { - layerSource.reset(new DicomSeriesVolumeSlicer); - dynamic_cast(layerSource.get())->Connect(orthancApiClient_); - dynamic_cast(layerSource.get())->SetImageQuality(imageQuality_); - Register(*layerSource, &SmartLoader::OnLayerGeometryReady); - Register(*layerSource, &SmartLoader::OnFrameReady); - Register(*layerSource, &SmartLoader::OnLayerReady); - dynamic_cast(layerSource.get())->LoadFrame(instanceId, frame); - } - - // make sure that the widget registers the events before we trigger them - if (sliceViewer.GetLayerCount() == layerIndex) - { - sliceViewer.AddLayer(layerSource); - } - else if (sliceViewer.GetLayerCount() > layerIndex) - { - sliceViewer.ReplaceLayer(layerIndex, layerSource); - } - else - { - throw OrthancStone::StoneException(OrthancStone::ErrorCode_CanOnlyAddOneLayerAtATime); - } - - if (cachedSlice != NULL) - { - BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*cachedSlice)); - } - - } - - void SmartLoader::PreloadSlice(const std::string instanceId, - unsigned int frame) - { - // TODO: reactivate -> need to be able to ScheduleLayerLoading in IVolumeSlicer without calling ScheduleLayerCreation - return; - // TODO: check if it is already in the cache - - - - // create the slice in the cache with "empty" data - boost::shared_ptr cachedSlice(new CachedSlice); - cachedSlice->slice_.reset(new Slice(instanceId, frame)); - cachedSlice->status_ = CachedSliceStatus_ScheduledToLoad; - std::string sliceKeyId = instanceId + ":" + boost::lexical_cast(frame); - - LOG(WARNING) << "Will preload: " << sliceKeyId; - - cachedSlices_[sliceKeyId] = boost::shared_ptr(cachedSlice); - - std::unique_ptr layerSource(new DicomSeriesVolumeSlicer); - dynamic_cast(layerSource.get())->Connect(orthancApiClient_); - dynamic_cast(layerSource.get())->SetImageQuality(imageQuality_); - Register(*layerSource, &SmartLoader::OnLayerGeometryReady); - Register(*layerSource, &SmartLoader::OnFrameReady); - Register(*layerSource, &SmartLoader::OnLayerReady); - dynamic_cast(layerSource.get())->LoadFrame(instanceId, frame); - - // keep a ref to the VolumeSlicer until the slice is fully loaded and saved to cache - preloadingInstances_[sliceKeyId] = boost::shared_ptr(layerSource.release()); - } - - -// void PreloadStudy(const std::string studyId) -// { -// /* TODO */ -// } - -// void PreloadSeries(const std::string seriesId) -// { -// /* TODO */ -// } - - - void SmartLoader::OnLayerGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) - { - const DicomSeriesVolumeSlicer& source = - dynamic_cast(message.GetOrigin()); - - // save/replace the slice in cache - const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() - std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + - boost::lexical_cast(slice.GetFrame())); - - LOG(WARNING) << "Geometry ready: " << sliceKeyId; - - boost::shared_ptr cachedSlice(new CachedSlice); - cachedSlice->slice_.reset(slice.Clone()); - cachedSlice->effectiveQuality_ = source.GetImageQuality(); - cachedSlice->status_ = CachedSliceStatus_GeometryLoaded; - - cachedSlices_[sliceKeyId] = boost::shared_ptr(cachedSlice); - - // re-emit original Layer message to observers - BroadcastMessage(message); - } - - - void SmartLoader::OnFrameReady(const DicomSeriesVolumeSlicer::FrameReadyMessage& message) - { - // save/replace the slice in cache - const Slice& slice = message.GetSlice(); - std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + - boost::lexical_cast(slice.GetFrame())); - - LOG(WARNING) << "Image ready: " << sliceKeyId; - - boost::shared_ptr cachedSlice(new CachedSlice); - cachedSlice->image_.reset(Orthanc::Image::Clone(message.GetFrame())); - cachedSlice->effectiveQuality_ = message.GetImageQuality(); - cachedSlice->slice_.reset(message.GetSlice().Clone()); - cachedSlice->status_ = CachedSliceStatus_ImageLoaded; - - cachedSlices_[sliceKeyId] = cachedSlice; - - // re-emit original Layer message to observers - BroadcastMessage(message); - } - - - void SmartLoader::OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message) - { - const DicomSeriesVolumeSlicer& source = - dynamic_cast(message.GetOrigin()); - - const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ? - std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + - boost::lexical_cast(slice.GetFrame())); - - LOG(WARNING) << "Layer ready: " << sliceKeyId; - - // remove the slice from the preloading slices now that it has been fully loaded and it is referenced in the cache - if (preloadingInstances_.find(sliceKeyId) != preloadingInstances_.end()) - { - preloadingInstances_.erase(sliceKeyId); - } - - // re-emit original Layer message to observers - BroadcastMessage(message); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/SmartLoader.h --- a/Framework/Deprecated/SmartLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once -#include - -#include "Layers/DicomSeriesVolumeSlicer.h" -#include "../Messages/IObservable.h" -#include "Toolbox/OrthancApiClient.h" - -namespace Deprecated -{ - class SliceViewerWidget; - - class SmartLoader : public OrthancStone::IObservable, public OrthancStone::ObserverBase - { - class CachedSlice; - - protected: - typedef std::map > CachedSlices; - CachedSlices cachedSlices_; - - typedef std::map > PreloadingInstances; - PreloadingInstances preloadingInstances_; - - SliceImageQuality imageQuality_; - boost::shared_ptr orthancApiClient_; - - public: - SmartLoader(boost::shared_ptr orthancApiClient); // TODO: add maxPreloadStorageSizeInBytes - -// void PreloadStudy(const std::string studyId); -// void PreloadSeries(const std::string seriesId); - void PreloadSlice(const std::string instanceId, unsigned int frame); - - void SetImageQuality(SliceImageQuality imageQuality) { imageQuality_ = imageQuality; } - - void SetFrameInWidget(SliceViewerWidget& sliceViewer, size_t layerIndex, const std::string& instanceId, unsigned int frame); - - void GetFirstInstanceIdForSeries(std::string& output, const std::string& seriesId); - - private: - void OnLayerGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message); - void OnFrameReady(const DicomSeriesVolumeSlicer::FrameReadyMessage& message); - void OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message); - - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/BaseWebService.cpp --- a/Framework/Deprecated/Toolbox/BaseWebService.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "BaseWebService.h" - -#include "../../Messages/IObservable.h" -#include "../../../Platforms/Generic/IOracleCommand.h" - -#include - -#include -#include -#include - -namespace Deprecated -{ - - - class BaseWebService::BaseWebServicePayload : public Orthanc::IDynamicObject - { - private: - std::unique_ptr< MessageHandler > userSuccessHandler_; - std::unique_ptr< MessageHandler > userFailureHandler_; - std::unique_ptr< Orthanc::IDynamicObject> userPayload_; - - public: - BaseWebServicePayload(MessageHandler* userSuccessHandler, - MessageHandler* userFailureHandler, - Orthanc::IDynamicObject* userPayload) : - userSuccessHandler_(userSuccessHandler), - userFailureHandler_(userFailureHandler), - userPayload_(userPayload) - { - } - - void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const - { - if (userSuccessHandler_.get() != NULL) - { - // recreate a success message with the user payload - IWebService::HttpRequestSuccessMessage successMessage(message.GetUri(), - message.GetAnswer(), - message.GetAnswerSize(), - message.GetAnswerHttpHeaders(), - userPayload_.get()); - userSuccessHandler_->Apply(successMessage); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const - { - if (userFailureHandler_.get() != NULL) - { - // recreate a failure message with the user payload - IWebService::HttpRequestErrorMessage failureMessage(message.GetUri(), - message.GetHttpStatus(), - userPayload_.get()); - - userFailureHandler_->Apply(failureMessage); - } - } - - }; - - - void BaseWebService::GetAsync(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback, - unsigned int timeoutInSeconds) - { - if (!cacheEnabled_ || cache_.find(uri) == cache_.end()) - { - GetAsyncInternal(uri, headers, - new BaseWebService::BaseWebServicePayload(successCallback, failureCallback, payload), // ownership is transfered - new DeprecatedCallable - (GetSharedObserver(), &BaseWebService::CacheAndNotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &BaseWebService::NotifyHttpError), - timeoutInSeconds); - } - else - { - // put the uri on top of the most recently accessed list - std::deque::iterator it = std::find(orderedCacheKeys_.begin(), orderedCacheKeys_.end(), uri); - if (it != orderedCacheKeys_.end()) - { - std::string uri = *it; - orderedCacheKeys_.erase(it); - orderedCacheKeys_.push_front(uri); - } - - // create a command and "post" it to the Oracle so it is executed and commited "later" - NotifyHttpSuccessLater(cache_[uri], payload, successCallback); - } - - } - - - - void BaseWebService::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) - { - if (message.HasPayload()) - { - dynamic_cast(message.GetPayload()).HandleSuccess(message); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - void BaseWebService::CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) - { - if (cacheEnabled_) - { - while (cacheCurrentSize_ + message.GetAnswerSize() > cacheMaxSize_ && orderedCacheKeys_.size() > 0) - { - VLOG(1) << "BaseWebService: clearing cache: " << cacheCurrentSize_ << "/" << cacheMaxSize_ << "(" << message.GetAnswerSize() << ")"; - const std::string& oldestUri = orderedCacheKeys_.back(); - HttpCache::iterator it = cache_.find(oldestUri); - if (it != cache_.end()) - { - cacheCurrentSize_ -= it->second->GetAnswerSize(); - cache_.erase(it); - } - orderedCacheKeys_.pop_back(); - - } - - boost::shared_ptr cachedMessage(new CachedHttpRequestSuccessMessage(message)); - cache_[message.GetUri()] = cachedMessage; - orderedCacheKeys_.push_front(message.GetUri()); - cacheCurrentSize_ += message.GetAnswerSize(); - } - - NotifyHttpSuccess(message); - } - - void BaseWebService::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) - { - if (message.HasPayload()) - { - dynamic_cast(message.GetPayload()).HandleFailure(message); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/BaseWebService.h --- a/Framework/Deprecated/Toolbox/BaseWebService.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IWebService.h" -#include "../../Messages/ObserverBase.h" - -#include -#include -#include - -namespace Deprecated -{ - // This is an intermediate of IWebService that implements some caching on - // the HTTP GET requests - class BaseWebService : public IWebService, public OrthancStone::ObserverBase - { - public: - class CachedHttpRequestSuccessMessage - { - protected: - std::string uri_; - void* answer_; - size_t answerSize_; - IWebService::HttpHeaders answerHeaders_; - - public: - CachedHttpRequestSuccessMessage(const IWebService::HttpRequestSuccessMessage& message) : - uri_(message.GetUri()), - answerSize_(message.GetAnswerSize()), - answerHeaders_(message.GetAnswerHttpHeaders()) - { - answer_ = malloc(answerSize_); - memcpy(answer_, message.GetAnswer(), answerSize_); - } - - ~CachedHttpRequestSuccessMessage() - { - free(answer_); - } - - const std::string& GetUri() const - { - return uri_; - } - - const void* GetAnswer() const - { - return answer_; - } - - size_t GetAnswerSize() const - { - return answerSize_; - } - - const IWebService::HttpHeaders& GetAnswerHttpHeaders() const - { - return answerHeaders_; - } - - }; - protected: - class BaseWebServicePayload; - - bool cacheEnabled_; - size_t cacheCurrentSize_; - size_t cacheMaxSize_; - - typedef std::map > HttpCache; - HttpCache cache_; - std::deque orderedCacheKeys_; - - public: - BaseWebService() : - cacheEnabled_(false), - cacheCurrentSize_(0), - cacheMaxSize_(100*1024*1024) - { - } - - virtual ~BaseWebService() - { - } - - virtual void EnableCache(bool enable) - { - cacheEnabled_ = enable; - } - - virtual void GetAsync(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60); - - protected: - virtual void GetAsyncInternal(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60) = 0; - - virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, - Orthanc::IDynamicObject* payload, // takes ownership - MessageHandler* successCallback) = 0; - - private: - void NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); - - void NotifyHttpError(const IWebService::HttpRequestErrorMessage& message); - - void CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/DicomFrameConverter.cpp --- a/Framework/Deprecated/Toolbox/DicomFrameConverter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,282 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomFrameConverter.h" - -#include "../../Toolbox/LinearAlgebra.h" - -#include -#include -#include -#include - -namespace Deprecated -{ - static const Orthanc::DicomTag IMAGE_TAGS[] = - { - Orthanc::DICOM_TAG_BITS_STORED, - Orthanc::DICOM_TAG_DOSE_GRID_SCALING, - Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, - Orthanc::DICOM_TAG_PIXEL_REPRESENTATION, - Orthanc::DICOM_TAG_RESCALE_INTERCEPT, - Orthanc::DICOM_TAG_RESCALE_SLOPE, - Orthanc::DICOM_TAG_WINDOW_CENTER, - Orthanc::DICOM_TAG_WINDOW_WIDTH - }; - - - void DicomFrameConverter::SetDefaultParameters() - { - isSigned_ = true; - isColor_ = false; - hasRescale_ = false; - rescaleIntercept_ = 0; - rescaleSlope_ = 1; - hasDefaultWindow_ = false; - defaultWindowCenter_ = 128; - defaultWindowWidth_ = 256; - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; - } - - - void DicomFrameConverter::ReadParameters(const Orthanc::DicomMap& dicom) - { - SetDefaultParameters(); - - OrthancStone::Vector c, w; - if (OrthancStone::LinearAlgebra::ParseVector(c, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && - OrthancStone::LinearAlgebra::ParseVector(w, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH) && - c.size() > 0 && - w.size() > 0) - { - hasDefaultWindow_ = true; - defaultWindowCenter_ = static_cast(c[0]); - defaultWindowWidth_ = static_cast(w[0]); - } - - int32_t tmp; - if (!dicom.ParseInteger32(tmp, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION)) - { - // Type 1 tag, must be present - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - isSigned_ = (tmp == 1); - - double doseGridScaling; - bool isRTDose = false; - - if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && - dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) - { - hasRescale_ = true; - } - else if (dicom.ParseDouble(doseGridScaling, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) - { - // This is for RT-DOSE - hasRescale_ = true; - isRTDose = true; - rescaleIntercept_ = 0; - rescaleSlope_ = doseGridScaling; - - if (!dicom.ParseInteger32(tmp, Orthanc::DICOM_TAG_BITS_STORED)) - { - // Type 1 tag, must be present - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - switch (tmp) - { - case 16: - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; - break; - - case 32: - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale32; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - std::string photometric; - if (dicom.LookupStringValue(photometric, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, false)) - { - photometric = Orthanc::Toolbox::StripSpaces(photometric); - } - else - { - // Type 1 tag, must be present - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - photometric_ = Orthanc::StringToPhotometricInterpretation(photometric.c_str()); - - isColor_ = (photometric != "MONOCHROME1" && - photometric != "MONOCHROME2"); - - // TODO Add more checks, e.g. on the number of bytes per value - // (cf. DicomImageInformation.h in Orthanc) - - if (!isRTDose) - { - if (isColor_) - { - expectedPixelFormat_ = Orthanc::PixelFormat_RGB24; - } - else if (isSigned_) - { - expectedPixelFormat_ = Orthanc::PixelFormat_SignedGrayscale16; - } - else - { - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; - } - } - } - - - void DicomFrameConverter::ReadParameters(const OrthancPlugins::IDicomDataset& dicom) - { - Orthanc::DicomMap converted; - - for (size_t i = 0; i < sizeof(IMAGE_TAGS) / sizeof(Orthanc::DicomTag); i++) - { - OrthancPlugins::DicomTag tag(IMAGE_TAGS[i].GetGroup(), IMAGE_TAGS[i].GetElement()); - - std::string value; - if (dicom.GetStringValue(value, tag)) - { - converted.SetValue(IMAGE_TAGS[i], value, false); - } - } - - ReadParameters(converted); - } - - - void DicomFrameConverter::ConvertFrameInplace(std::unique_ptr& source) const - { - assert(sizeof(float) == 4); - - if (source.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (source->GetFormat() == GetExpectedPixelFormat() && - source->GetFormat() == Orthanc::PixelFormat_RGB24) - { - // No conversion has to be done, check out (*) - return; - } - else - { - source.reset(ConvertFrame(*source)); - } - } - - - Orthanc::ImageAccessor* DicomFrameConverter::ConvertFrame(const Orthanc::ImageAccessor& source) const - { - assert(sizeof(float) == 4); - - Orthanc::PixelFormat sourceFormat = source.GetFormat(); - - if (sourceFormat != GetExpectedPixelFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (sourceFormat == Orthanc::PixelFormat_RGB24) - { - // This is the case of a color image. No conversion has to be done (*) - std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_RGB24, - source.GetWidth(), - source.GetHeight(), - false)); - Orthanc::ImageProcessing::Copy(*converted, source); - return converted.release(); - } - else - { - assert(sourceFormat == Orthanc::PixelFormat_Grayscale16 || - sourceFormat == Orthanc::PixelFormat_Grayscale32 || - sourceFormat == Orthanc::PixelFormat_SignedGrayscale16); - - // This is the case of a grayscale frame. Convert it to Float32. - std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, - source.GetWidth(), - source.GetHeight(), - false)); - Orthanc::ImageProcessing::Convert(*converted, source); - - // Correct rescale slope/intercept if need be - ApplyRescale(*converted, sourceFormat != Orthanc::PixelFormat_Grayscale32); - - return converted.release(); - } - } - - - void DicomFrameConverter::ApplyRescale(Orthanc::ImageAccessor& image, - bool useDouble) const - { - if (image.GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (hasRescale_) - { - for (unsigned int y = 0; y < image.GetHeight(); y++) - { - float* p = reinterpret_cast(image.GetRow(y)); - - if (useDouble) - { - // Slower, accurate implementation using double - for (unsigned int x = 0; x < image.GetWidth(); x++, p++) - { - double value = static_cast(*p); - *p = static_cast(value * rescaleSlope_ + rescaleIntercept_); - } - } - else - { - // Fast, approximate implementation using float - for (unsigned int x = 0; x < image.GetWidth(); x++, p++) - { - *p = (*p) * static_cast(rescaleSlope_) + static_cast(rescaleIntercept_); - } - } - } - } - } - - - double DicomFrameConverter::Apply(double x) const - { - return x * rescaleSlope_ + rescaleIntercept_; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/DicomFrameConverter.h --- a/Framework/Deprecated/Toolbox/DicomFrameConverter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include -#include -#include - -#include - -namespace Deprecated -{ - /** - * This class is responsible for converting the pixel format of a - * DICOM frame coming from Orthanc, into a pixel format that is - * suitable for Stone, given the relevant DICOM tags: - * - Color frames will stay in the RGB24 format. - * - Grayscale frames will be converted to the Float32 format. - **/ - class DicomFrameConverter - { - private: - bool isSigned_; - bool isColor_; - bool hasRescale_; - double rescaleIntercept_; - double rescaleSlope_; - bool hasDefaultWindow_; - double defaultWindowCenter_; - double defaultWindowWidth_; - - Orthanc::PhotometricInterpretation photometric_; - Orthanc::PixelFormat expectedPixelFormat_; - - void SetDefaultParameters(); - - public: - DicomFrameConverter() - { - SetDefaultParameters(); - } - - ~DicomFrameConverter() - { - // TODO: check whether this dtor is called or not - // An MSVC warning explains that declaring an - // std::unique_ptr with a forward-declared type - // prevents its dtor from being called. Does not - // seem an issue here (only POD types inside), but - // definitely something to keep an eye on. - (void)0; - } - - // AM: this is required to serialize/deserialize it - DicomFrameConverter( - bool isSigned, - bool isColor, - bool hasRescale, - double rescaleIntercept, - double rescaleSlope, - bool hasDefaultWindow, - double defaultWindowCenter, - double defaultWindowWidth, - Orthanc::PhotometricInterpretation photometric, - Orthanc::PixelFormat expectedPixelFormat - ): - isSigned_(isSigned), - isColor_(isColor), - hasRescale_(hasRescale), - rescaleIntercept_(rescaleIntercept), - rescaleSlope_(rescaleSlope), - hasDefaultWindow_(hasDefaultWindow), - defaultWindowCenter_(defaultWindowCenter), - defaultWindowWidth_(defaultWindowWidth), - photometric_(photometric), - expectedPixelFormat_(expectedPixelFormat) - {} - - void GetParameters(bool& isSigned, - bool& isColor, - bool& hasRescale, - double& rescaleIntercept, - double& rescaleSlope, - bool& hasDefaultWindow, - double& defaultWindowCenter, - double& defaultWindowWidth, - Orthanc::PhotometricInterpretation& photometric, - Orthanc::PixelFormat& expectedPixelFormat) const - { - isSigned = isSigned_; - isColor = isColor_; - hasRescale = hasRescale_; - rescaleIntercept = rescaleIntercept_; - rescaleSlope = rescaleSlope_; - hasDefaultWindow = hasDefaultWindow_; - defaultWindowCenter = defaultWindowCenter_; - defaultWindowWidth = defaultWindowWidth_; - photometric = photometric_; - expectedPixelFormat = expectedPixelFormat_; - } - - Orthanc::PixelFormat GetExpectedPixelFormat() const - { - return expectedPixelFormat_; - } - - Orthanc::PhotometricInterpretation GetPhotometricInterpretation() const - { - return photometric_; - } - - void ReadParameters(const Orthanc::DicomMap& dicom); - - void ReadParameters(const OrthancPlugins::IDicomDataset& dicom); - - bool HasDefaultWindow() const - { - return hasDefaultWindow_; - } - - double GetDefaultWindowCenter() const - { - return defaultWindowCenter_; - } - - double GetDefaultWindowWidth() const - { - return defaultWindowWidth_; - } - - double GetRescaleIntercept() const - { - return rescaleIntercept_; - } - - double GetRescaleSlope() const - { - return rescaleSlope_; - } - - void ConvertFrameInplace(std::unique_ptr& source) const; - - Orthanc::ImageAccessor* ConvertFrame(const Orthanc::ImageAccessor& source) const; - - void ApplyRescale(Orthanc::ImageAccessor& image, - bool useDouble) const; - - double Apply(double x) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/DownloadStack.cpp --- a/Framework/Deprecated/Toolbox/DownloadStack.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,196 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DownloadStack.h" - -#include - -#include - -namespace Deprecated -{ - bool DownloadStack::CheckInvariants() const - { - std::vector dequeued(nodes_.size(), true); - - int i = firstNode_; - while (i != NIL) - { - const Node& node = nodes_[i]; - - dequeued[i] = false; - - if (node.next_ != NIL && - nodes_[node.next_].prev_ != i) - { - return false; - } - - if (node.prev_ != NIL && - nodes_[node.prev_].next_ != i) - { - return false; - } - - i = nodes_[i].next_; - } - - for (size_t i = 0; i < nodes_.size(); i++) - { - if (nodes_[i].dequeued_ != dequeued[i]) - { - return false; - } - } - - return true; - } - - - DownloadStack::DownloadStack(unsigned int size) - { - nodes_.resize(size); - - if (size == 0) - { - firstNode_ = NIL; - } - else - { - for (size_t i = 0; i < size; i++) - { - nodes_[i].prev_ = static_cast(i - 1); - nodes_[i].next_ = static_cast(i + 1); - nodes_[i].dequeued_ = false; - } - - nodes_.front().prev_ = NIL; - nodes_.back().next_ = NIL; - firstNode_ = 0; - } - - assert(CheckInvariants()); - } - - - DownloadStack::~DownloadStack() - { - assert(CheckInvariants()); - } - - - bool DownloadStack::Pop(unsigned int& value) - { - assert(CheckInvariants()); - - if (firstNode_ == NIL) - { - for (size_t i = 0; i < nodes_.size(); i++) - { - assert(nodes_[i].dequeued_); - } - - return false; - } - else - { - assert(firstNode_ >= 0 && firstNode_ < static_cast(nodes_.size())); - value = firstNode_; - - Node& node = nodes_[firstNode_]; - assert(node.prev_ == NIL); - assert(!node.dequeued_); - - node.dequeued_ = true; - firstNode_ = node.next_; - - if (firstNode_ != NIL) - { - nodes_[firstNode_].prev_ = NIL; - } - - return true; - } - } - - - void DownloadStack::SetTopNodeInternal(unsigned int value) - { - assert(CheckInvariants()); - - Node& node = nodes_[value]; - - if (node.dequeued_) - { - // This node has already been processed by the download thread, nothing to do - return; - } - - // Remove the node from the list - if (node.prev_ == NIL) - { - assert(firstNode_ == static_cast(value)); - - // This is already the top node in the list, nothing to do - return; - } - - nodes_[node.prev_].next_ = node.next_; - - if (node.next_ != NIL) - { - nodes_[node.next_].prev_ = node.prev_; - } - - // Add back the node at the top of the list - assert(firstNode_ != NIL); - - Node& old = nodes_[firstNode_]; - assert(old.prev_ == NIL); - assert(!old.dequeued_); - node.prev_ = NIL; - node.next_ = firstNode_; - old.prev_ = value; - - firstNode_ = value; - } - - - void DownloadStack::SetTopNode(unsigned int value) - { - if (value >= nodes_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - SetTopNodeInternal(value); - } - - - void DownloadStack::SetTopNodePermissive(int value) - { - if (value >= 0 && - value < static_cast(nodes_.size())) - { - SetTopNodeInternal(value); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/DownloadStack.h --- a/Framework/Deprecated/Toolbox/DownloadStack.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace Deprecated -{ - class DownloadStack : public boost::noncopyable - { - private: - static const int NIL = -1; - - // This is a doubly-linked list - struct Node - { - int next_; - int prev_; - bool dequeued_; - }; - - std::vector nodes_; - int firstNode_; - - bool CheckInvariants() const; - - void SetTopNodeInternal(unsigned int value); - - public: - DownloadStack(unsigned int size); - - ~DownloadStack(); - - bool Pop(unsigned int& value); - - void SetTopNode(unsigned int value); - - void SetTopNodePermissive(int value); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/IDelayedCallExecutor.h --- a/Framework/Deprecated/Toolbox/IDelayedCallExecutor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IWebService.h" -#include "../../Messages/IObserver.h" -#include "../../Messages/ICallable.h" - -#include -#include - -#include -#include - -namespace Deprecated -{ - // The IDelayedCall executes a callback after a delay (equivalent to timeout() function in javascript). - class IDelayedCallExecutor : public boost::noncopyable - { - public: - ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(__FILE__, __LINE__, TimeoutMessage); - - virtual ~IDelayedCallExecutor() - { - } - - virtual void Schedule(MessageHandler* callback, - unsigned int timeoutInMs = 1000) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ISeriesLoader.h --- a/Framework/Deprecated/Toolbox/ISeriesLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ParallelSlices.h" - -#include -#include - -namespace Deprecated -{ - class ISeriesLoader : public boost::noncopyable - { - public: - virtual ~ISeriesLoader() - { - } - - virtual ParallelSlices& GetGeometry() = 0; - - virtual Orthanc::PixelFormat GetPixelFormat() = 0; - - virtual unsigned int GetWidth() = 0; - - virtual unsigned int GetHeight() = 0; - - virtual OrthancPlugins::IDicomDataset* DownloadDicom(size_t index) = 0; - - // This downloads the frame from Orthanc. The resulting pixel - // format must be Grayscale8, Grayscale16, SignedGrayscale16 or - // RGB24. Orthanc Stone assumes the conversion of the photometric - // interpretation is done by Orthanc. - virtual Orthanc::ImageAccessor* DownloadFrame(size_t index) = 0; - - virtual Orthanc::ImageAccessor* DownloadJpegFrame(size_t index, - unsigned int quality) = 0; - - virtual bool IsJpegAvailable() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/IWebService.cpp --- a/Framework/Deprecated/Toolbox/IWebService.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "IWebService.h" - -#include - - -namespace Deprecated -{ - const Orthanc::IDynamicObject& - IWebService::HttpRequestSuccessMessage::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Orthanc::IDynamicObject& - IWebService::HttpRequestErrorMessage::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/IWebService.h --- a/Framework/Deprecated/Toolbox/IWebService.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,213 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Messages/IObserver.h" -#include "../../Messages/ICallable.h" - -#include -#include -#include - -#include -#include - -namespace Deprecated -{ - template - class MessageHandler : public OrthancStone::ICallable - { - }; - - - template - class DeprecatedCallable : public MessageHandler - { - private: - typedef void (TObserver::* MemberMethod) (const TMessage&); - - boost::weak_ptr observer_; - MemberMethod function_; - - public: - DeprecatedCallable(boost::shared_ptr observer, - MemberMethod function) : - observer_(observer), - function_(function) - { - } - - virtual void Apply(const OrthancStone::IMessage& message) - { - boost::shared_ptr lock(observer_); - if (lock) - { - TObserver& observer = dynamic_cast(*lock); - const TMessage& typedMessage = dynamic_cast(message); - (observer.*function_) (typedMessage); - } - } - - virtual const OrthancStone::MessageIdentifier& GetMessageIdentifier() - { - return TMessage::GetStaticIdentifier(); - } - - virtual boost::weak_ptr GetObserver() const - { - return observer_; - } - }; - - - // The IWebService performs HTTP requests. - // Since applications can run in native or WASM environment and, since - // in a WASM environment, the WebService is asynchronous, the IWebservice - // also implements an asynchronous interface: you must schedule a request - // and you'll be notified when the response/error is ready. - class IWebService : public boost::noncopyable - { - public: - typedef std::map HttpHeaders; - - class HttpRequestSuccessMessage : public OrthancStone::IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& uri_; - const void* answer_; - size_t answerSize_; - const HttpHeaders& answerHeaders_; - const Orthanc::IDynamicObject* payload_; - - public: - HttpRequestSuccessMessage(const std::string& uri, - const void* answer, - size_t answerSize, - const HttpHeaders& answerHeaders, - const Orthanc::IDynamicObject* payload) : - uri_(uri), - answer_(answer), - answerSize_(answerSize), - answerHeaders_(answerHeaders), - payload_(payload) - { - } - - const std::string& GetUri() const - { - return uri_; - } - - const void* GetAnswer() const - { - return answer_; - } - - size_t GetAnswerSize() const - { - return answerSize_; - } - - const HttpHeaders& GetAnswerHttpHeaders() const - { - return answerHeaders_; - } - - bool HasPayload() const - { - return payload_ != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - }; - - - class HttpRequestErrorMessage : public OrthancStone::IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& uri_; - const Orthanc::IDynamicObject* payload_; - Orthanc::HttpStatus httpStatus_; - - public: - HttpRequestErrorMessage(const std::string& uri, - Orthanc::HttpStatus httpStatus, - const Orthanc::IDynamicObject* payload) : - uri_(uri), - payload_(payload), - httpStatus_(httpStatus) - { - } - - const std::string& GetUri() const - { - return uri_; - } - - Orthanc::HttpStatus GetHttpStatus() const - { - return httpStatus_; - } - - bool HasPayload() const - { - return payload_ != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - }; - - - virtual ~IWebService() - { - } - - virtual void EnableCache(bool enable) = 0; - - virtual void GetAsync(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60) = 0; - - virtual void PostAsync(const std::string& uri, - const HttpHeaders& headers, - const std::string& body, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60) = 0; - - virtual void DeleteAsync(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/MessagingToolbox.cpp --- a/Framework/Deprecated/Toolbox/MessagingToolbox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,462 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MessagingToolbox.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -#ifdef _MSC_VER -// 'Json::Reader': Use CharReader and CharReaderBuilder instead -#pragma warning(disable:4996) -#endif - -#include -#include - - -namespace Deprecated -{ - namespace MessagingToolbox - { - static bool ParseVersion(std::string& version, - unsigned int& major, - unsigned int& minor, - unsigned int& patch, - const Json::Value& info) - { - if (info.type() != Json::objectValue || - !info.isMember("Version") || - info["Version"].type() != Json::stringValue) - { - return false; - } - - version = info["Version"].asString(); - if (version == "mainline") - { - // Some arbitrary high values Orthanc versions will never reach ;) - major = 999; - minor = 999; - patch = 999; - return true; - } - - std::vector tokens; - Orthanc::Toolbox::TokenizeString(tokens, version, '.'); - - if (tokens.size() != 2 && - tokens.size() != 3) - { - return false; - } - - int a, b, c; - try - { - a = boost::lexical_cast(tokens[0]); - b = boost::lexical_cast(tokens[1]); - - if (tokens.size() == 3) - { - c = boost::lexical_cast(tokens[2]); - } - else - { - c = 0; - } - } - catch (boost::bad_lexical_cast&) - { - return false; - } - - if (a < 0 || - b < 0 || - c < 0) - { - return false; - } - else - { - major = static_cast(a); - minor = static_cast(b); - patch = static_cast(c); - return true; - } - } - - - bool ParseJson(Json::Value& target, - const void* content, - size_t size) - { - Json::Reader reader; - return reader.parse(reinterpret_cast(content), - reinterpret_cast(content) + size, - target); - } - - void JsonToString(std::string& target, - const Json::Value& source) - { - Json::FastWriter writer; - target = writer.write(source); - } - - static void ParseJsonException(Json::Value& target, - const std::string& source) - { - Json::Reader reader; - if (!reader.parse(source, target)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void RestApiGet(Json::Value& target, - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& uri) - { - std::string tmp; - orthanc.RestApiGet(tmp, uri); - ParseJsonException(target, tmp); - } - - - void RestApiPost(Json::Value& target, - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body) - { - std::string tmp; - orthanc.RestApiPost(tmp, uri, body); - ParseJsonException(target, tmp); - } - - - bool HasWebViewerInstalled(OrthancPlugins::IOrthancConnection& orthanc) - { - try - { - Json::Value json; - RestApiGet(json, orthanc, "/plugins/web-viewer"); - return json.type() == Json::objectValue; - } - catch (Orthanc::OrthancException&) - { - return false; - } - } - - - bool CheckOrthancVersion(OrthancPlugins::IOrthancConnection& orthanc) - { - Json::Value json; - std::string version; - unsigned int major, minor, patch; - - try - { - RestApiGet(json, orthanc, "/system"); - } - catch (Orthanc::OrthancException&) - { - LOG(ERROR) << "Cannot connect to your Orthanc server"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - if (!ParseVersion(version, major, minor, patch, json)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - LOG(WARNING) << "Version of the Orthanc core (must be above 1.3.1): " << version; - - // Stone is only compatible with Orthanc >= 1.3.1 - if (major < 1 || - (major == 1 && minor < 3) || - (major == 1 && minor == 3 && patch < 1)) - { - return false; - } - - try - { - RestApiGet(json, orthanc, "/plugins/web-viewer"); - } - catch (Orthanc::OrthancException&) - { - // The Web viewer is not installed, this is OK - LOG(WARNING) << "The Web viewer plugin is not installed, progressive download is disabled"; - return true; - } - - if (!ParseVersion(version, major, minor, patch, json)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - LOG(WARNING) << "Version of the Web viewer plugin (must be above 2.2): " << version; - - return (major >= 3 || - (major == 2 && minor >= 2)); - } - - - Orthanc::ImageAccessor* DecodeFrame(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instance, - unsigned int frame, - Orthanc::PixelFormat targetFormat) - { - std::string uri = ("instances/" + instance + "/frames/" + - boost::lexical_cast(frame)); - - std::string compressed; - - switch (targetFormat) - { - case Orthanc::PixelFormat_RGB24: - orthanc.RestApiGet(compressed, uri + "/preview"); - break; - - case Orthanc::PixelFormat_Grayscale16: - orthanc.RestApiGet(compressed, uri + "/image-uint16"); - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - orthanc.RestApiGet(compressed, uri + "/image-int16"); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::unique_ptr result(new Orthanc::PngReader); - result->ReadFromMemory(compressed); - - if (targetFormat == Orthanc::PixelFormat_SignedGrayscale16) - { - if (result->GetFormat() == Orthanc::PixelFormat_Grayscale16) - { - result->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - - return result.release(); - } - - - Orthanc::ImageAccessor* DecodeJpegFrame(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instance, - unsigned int frame, - unsigned int quality, - Orthanc::PixelFormat targetFormat) - { - if (quality <= 0 || - quality > 100) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // This requires the official Web viewer plugin to be installed! - std::string uri = ("web-viewer/instances/jpeg" + - boost::lexical_cast(quality) + - "-" + instance + "_" + - boost::lexical_cast(frame)); - - Json::Value encoded; - RestApiGet(encoded, orthanc, uri); - - if (encoded.type() != Json::objectValue || - !encoded.isMember("Orthanc") || - encoded["Orthanc"].type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - Json::Value& info = encoded["Orthanc"]; - if (!info.isMember("PixelData") || - !info.isMember("Stretched") || - !info.isMember("Compression") || - info["Compression"].type() != Json::stringValue || - info["PixelData"].type() != Json::stringValue || - info["Stretched"].type() != Json::booleanValue || - info["Compression"].asString() != "Jpeg") - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - bool isSigned = false; - bool isStretched = info["Stretched"].asBool(); - - if (info.isMember("IsSigned")) - { - if (info["IsSigned"].type() != Json::booleanValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - else - { - isSigned = info["IsSigned"].asBool(); - } - } - - std::string jpeg; - Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); - - std::unique_ptr reader(new Orthanc::JpegReader); - reader->ReadFromMemory(jpeg); - - if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image - { - if (targetFormat != Orthanc::PixelFormat_RGB24) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - if (isSigned || isStretched) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - else - { - return reader.release(); - } - } - - if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - if (!isStretched) - { - if (targetFormat != reader->GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - return reader.release(); - } - - int32_t stretchLow = 0; - int32_t stretchHigh = 0; - - if (!info.isMember("StretchLow") || - !info.isMember("StretchHigh") || - info["StretchLow"].type() != Json::intValue || - info["StretchHigh"].type() != Json::intValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - stretchLow = info["StretchLow"].asInt(); - stretchHigh = info["StretchHigh"].asInt(); - - if (stretchLow < -32768 || - stretchHigh > 65535 || - (stretchLow < 0 && stretchHigh > 32767)) - { - // This range cannot be represented with a uint16_t or an int16_t - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - // Decode a grayscale JPEG 8bpp image coming from the Web viewer - std::unique_ptr image - (new Orthanc::Image(targetFormat, reader->GetWidth(), reader->GetHeight(), false)); - - float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; - float offset = static_cast(stretchLow) / scaling; - - Orthanc::ImageProcessing::Convert(*image, *reader); - Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); - -#if 0 - /*info.removeMember("PixelData"); - std::cout << info.toStyledString();*/ - - int64_t a, b; - Orthanc::ImageProcessing::GetMinMaxValue(a, b, *image); - std::cout << stretchLow << "->" << stretchHigh << " = " << a << "->" << b << std::endl; -#endif - - return image.release(); - } - - - static void AddTag(Orthanc::DicomMap& target, - const OrthancPlugins::IDicomDataset& source, - const Orthanc::DicomTag& tag) - { - OrthancPlugins::DicomTag key(tag.GetGroup(), tag.GetElement()); - - std::string value; - if (source.GetStringValue(value, key)) - { - target.SetValue(tag, value, false); - } - } - - - void ConvertDataset(Orthanc::DicomMap& target, - const OrthancPlugins::IDicomDataset& source) - { - target.Clear(); - - AddTag(target, source, Orthanc::DICOM_TAG_BITS_ALLOCATED); - AddTag(target, source, Orthanc::DICOM_TAG_BITS_STORED); - AddTag(target, source, Orthanc::DICOM_TAG_COLUMNS); - AddTag(target, source, Orthanc::DICOM_TAG_DOSE_GRID_SCALING); - AddTag(target, source, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER); - AddTag(target, source, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR); - AddTag(target, source, Orthanc::DICOM_TAG_HIGH_BIT); - AddTag(target, source, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT); - AddTag(target, source, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT); - AddTag(target, source, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES); - AddTag(target, source, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION); - AddTag(target, source, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION); - AddTag(target, source, Orthanc::DICOM_TAG_PIXEL_SPACING); - AddTag(target, source, Orthanc::DICOM_TAG_PLANAR_CONFIGURATION); - AddTag(target, source, Orthanc::DICOM_TAG_RESCALE_INTERCEPT); - AddTag(target, source, Orthanc::DICOM_TAG_RESCALE_SLOPE); - AddTag(target, source, Orthanc::DICOM_TAG_ROWS); - AddTag(target, source, Orthanc::DICOM_TAG_SAMPLES_PER_PIXEL); - AddTag(target, source, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); - AddTag(target, source, Orthanc::DICOM_TAG_SLICE_THICKNESS); - AddTag(target, source, Orthanc::DICOM_TAG_SOP_CLASS_UID); - AddTag(target, source, Orthanc::DICOM_TAG_SOP_INSTANCE_UID); - AddTag(target, source, Orthanc::DICOM_TAG_WINDOW_CENTER); - AddTag(target, source, Orthanc::DICOM_TAG_WINDOW_WIDTH); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/MessagingToolbox.h --- a/Framework/Deprecated/Toolbox/MessagingToolbox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../StoneEnumerations.h" - -#include -#include -#include -#include - -#include - -namespace Deprecated -{ - namespace MessagingToolbox - { - bool ParseJson(Json::Value& target, - const void* content, - size_t size); - - void JsonToString(std::string& target, - const Json::Value& source); - - - void RestApiGet(Json::Value& target, - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& uri); - - void RestApiPost(Json::Value& target, - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body); - - bool HasWebViewerInstalled(OrthancPlugins::IOrthancConnection& orthanc); - - bool CheckOrthancVersion(OrthancPlugins::IOrthancConnection& orthanc); - - // This downloads the image from Orthanc and keeps its pixel - // format unchanged (will be either Grayscale8, Grayscale16, - // SignedGrayscale16, or RGB24) - Orthanc::ImageAccessor* DecodeFrame(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instance, - unsigned int frame, - Orthanc::PixelFormat targetFormat); - - Orthanc::ImageAccessor* DecodeJpegFrame(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instance, - unsigned int frame, - unsigned int quality, - Orthanc::PixelFormat targetFormat); - - void ConvertDataset(Orthanc::DicomMap& target, - const OrthancPlugins::IDicomDataset& source); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/OrthancApiClient.cpp --- a/Framework/Deprecated/Toolbox/OrthancApiClient.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,334 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "OrthancApiClient.h" - -#include "../Toolbox/MessagingToolbox.h" - -#include - -namespace Deprecated -{ - const Orthanc::IDynamicObject& OrthancApiClient::JsonResponseReadyMessage::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Orthanc::IDynamicObject& OrthancApiClient::BinaryResponseReadyMessage::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Orthanc::IDynamicObject& OrthancApiClient::EmptyResponseReadyMessage::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - class OrthancApiClient::WebServicePayload : public Orthanc::IDynamicObject - { - private: - std::unique_ptr< MessageHandler > emptyHandler_; - std::unique_ptr< MessageHandler > jsonHandler_; - std::unique_ptr< MessageHandler > binaryHandler_; - std::unique_ptr< MessageHandler > failureHandler_; - std::unique_ptr< Orthanc::IDynamicObject > userPayload_; - - void NotifyConversionError(const IWebService::HttpRequestSuccessMessage& message) const - { - if (failureHandler_.get() != NULL) - { - failureHandler_->Apply(IWebService::HttpRequestErrorMessage - (message.GetUri(), Orthanc::HttpStatus_None, userPayload_.get())); - } - } - - public: - WebServicePayload(MessageHandler* handler, - MessageHandler* failureHandler, - Orthanc::IDynamicObject* userPayload) : - emptyHandler_(handler), - failureHandler_(failureHandler), - userPayload_(userPayload) - - { - if (handler == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - WebServicePayload(MessageHandler* handler, - MessageHandler* failureHandler, - Orthanc::IDynamicObject* userPayload) : - binaryHandler_(handler), - failureHandler_(failureHandler), - userPayload_(userPayload) - { - if (handler == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - WebServicePayload(MessageHandler* handler, - MessageHandler* failureHandler, - Orthanc::IDynamicObject* userPayload) : - jsonHandler_(handler), - failureHandler_(failureHandler), - userPayload_(userPayload) - { - if (handler == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const - { - if (emptyHandler_.get() != NULL) - { - emptyHandler_->Apply(OrthancApiClient::EmptyResponseReadyMessage - (message.GetUri(), userPayload_.get())); - } - else if (binaryHandler_.get() != NULL) - { - binaryHandler_->Apply(OrthancApiClient::BinaryResponseReadyMessage - (message.GetUri(), message.GetAnswer(), - message.GetAnswerSize(), userPayload_.get())); - } - else if (jsonHandler_.get() != NULL) - { - Json::Value response; - if (MessagingToolbox::ParseJson(response, message.GetAnswer(), message.GetAnswerSize())) - { - jsonHandler_->Apply(OrthancApiClient::JsonResponseReadyMessage - (message.GetUri(), response, userPayload_.get())); - } - else - { - NotifyConversionError(message); - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const - { - if (failureHandler_.get() != NULL) - { - failureHandler_->Apply(IWebService::HttpRequestErrorMessage - (message.GetUri(), message.GetHttpStatus(), userPayload_.get())); - } - } - }; - - - OrthancApiClient::OrthancApiClient(IWebService& web, - const std::string& baseUrl) : - web_(web), - baseUrl_(baseUrl) - { - } - - - void OrthancApiClient::GetJsonAsync( - const std::string& uri, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - IWebService::HttpHeaders emptyHeaders; - web_.GetAsync(baseUrl_ + uri, - emptyHeaders, - new WebServicePayload(successCallback, failureCallback, payload), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); - } - - - void OrthancApiClient::GetBinaryAsync( - const std::string& uri, - const std::string& contentType, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - IWebService::HttpHeaders headers; - headers["Accept"] = contentType; - GetBinaryAsync(uri, headers, successCallback, failureCallback, payload); - } - - void OrthancApiClient::GetBinaryAsync( - const std::string& uri, - const IWebService::HttpHeaders& headers, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - // printf("GET [%s] [%s]\n", baseUrl_.c_str(), uri.c_str()); - - web_.GetAsync(baseUrl_ + uri, headers, - new WebServicePayload(successCallback, failureCallback, payload), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); - } - - - void OrthancApiClient::PostBinaryAsyncExpectJson( - const std::string& uri, - const std::string& body, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, - new WebServicePayload(successCallback, failureCallback, payload), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); - - } - - void OrthancApiClient::PostBinaryAsync( - const std::string& uri, - const std::string& body) - { - web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, NULL, NULL, NULL); - } - - void OrthancApiClient::PostBinaryAsync( - const std::string& uri, - const std::string& body, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload /* takes ownership */) - { - web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, - new WebServicePayload(successCallback, failureCallback, payload), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); - } - - void OrthancApiClient::PostJsonAsyncExpectJson( - const std::string& uri, - const Json::Value& data, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - std::string body; - MessagingToolbox::JsonToString(body, data); - return PostBinaryAsyncExpectJson(uri, body, successCallback, failureCallback, payload); - } - - void OrthancApiClient::PostJsonAsync( - const std::string& uri, - const Json::Value& data) - { - std::string body; - MessagingToolbox::JsonToString(body, data); - return PostBinaryAsync(uri, body); - } - - void OrthancApiClient::PostJsonAsync( - const std::string& uri, - const Json::Value& data, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload /* takes ownership */) - { - std::string body; - MessagingToolbox::JsonToString(body, data); - return PostBinaryAsync(uri, body, successCallback, failureCallback, payload); - } - - void OrthancApiClient::DeleteAsync( - const std::string& uri, - MessageHandler* successCallback, - MessageHandler* failureCallback, - Orthanc::IDynamicObject* payload) - { - web_.DeleteAsync(baseUrl_ + uri, IWebService::HttpHeaders(), - new WebServicePayload(successCallback, failureCallback, payload), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), - new DeprecatedCallable - (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); - } - - - void OrthancApiClient::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) - { - if (message.HasPayload()) - { - dynamic_cast(message.GetPayload()).HandleSuccess(message); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - void OrthancApiClient::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) - { - if (message.HasPayload()) - { - dynamic_cast(message.GetPayload()).HandleFailure(message); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/OrthancApiClient.h --- a/Framework/Deprecated/Toolbox/OrthancApiClient.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,252 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -#include "IWebService.h" -#include "../../Messages/ObserverBase.h" - -namespace Deprecated -{ - enum SliceImageQuality - { - SliceImageQuality_FullPng, // smaller to transmit but longer to generate on Orthanc side (better choice when on low bandwidth) - SliceImageQuality_FullPam, // bigger to transmit but faster to generate on Orthanc side (better choice when on localhost or LAN) - SliceImageQuality_Jpeg50, - SliceImageQuality_Jpeg90, - SliceImageQuality_Jpeg95, - - SliceImageQuality_InternalRaw // downloads the raw pixels data as they are stored in the DICOM file (internal use only) - }; - - class OrthancApiClient : - public OrthancStone::IObservable, - public OrthancStone::ObserverBase - { - public: - class JsonResponseReadyMessage : public OrthancStone::IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& uri_; - const Json::Value& json_; - const Orthanc::IDynamicObject* payload_; - - public: - JsonResponseReadyMessage(const std::string& uri, - const Json::Value& json, - const Orthanc::IDynamicObject* payload) : - uri_(uri), - json_(json), - payload_(payload) - { - } - - const std::string& GetUri() const - { - return uri_; - } - - const Json::Value& GetJson() const - { - return json_; - } - - bool HasPayload() const - { - return payload_ != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - }; - - - class BinaryResponseReadyMessage : public OrthancStone::IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& uri_; - const void* answer_; - size_t answerSize_; - const Orthanc::IDynamicObject* payload_; - - public: - BinaryResponseReadyMessage(const std::string& uri, - const void* answer, - size_t answerSize, - const Orthanc::IDynamicObject* payload) : - uri_(uri), - answer_(answer), - answerSize_(answerSize), - payload_(payload) - { - } - - const std::string& GetUri() const - { - return uri_; - } - - const void* GetAnswer() const - { - return answer_; - } - - size_t GetAnswerSize() const - { - return answerSize_; - } - - bool HasPayload() const - { - return payload_ != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - }; - - - class EmptyResponseReadyMessage : public OrthancStone::IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& uri_; - const Orthanc::IDynamicObject* payload_; - - public: - EmptyResponseReadyMessage(const std::string& uri, - const Orthanc::IDynamicObject* payload) : - uri_(uri), - payload_(payload) - { - } - - const std::string& GetUri() const - { - return uri_; - } - - bool HasPayload() const - { - return payload_ != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - }; - - - - private: - class WebServicePayload; - - protected: - IWebService& web_; - std::string baseUrl_; - - public: - OrthancApiClient(IWebService& web, - const std::string& baseUrl); - - virtual ~OrthancApiClient() - { - } - - const std::string& GetBaseUrl() const {return baseUrl_;} - - // schedule a GET request expecting a JSON response. - void GetJsonAsync(const std::string& uri, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a GET request expecting a binary response. - void GetBinaryAsync(const std::string& uri, - const std::string& contentType, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a GET request expecting a binary response. - void GetBinaryAsync(const std::string& uri, - const IWebService::HttpHeaders& headers, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a POST request expecting a JSON response. - void PostBinaryAsyncExpectJson(const std::string& uri, - const std::string& body, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a POST request expecting a JSON response. - void PostJsonAsyncExpectJson(const std::string& uri, - const Json::Value& data, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a POST request and don't mind the response. - void PostJsonAsync(const std::string& uri, - const Json::Value& data); - - // schedule a POST request and don't expect any response. - void PostJsonAsync(const std::string& uri, - const Json::Value& data, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - - // schedule a POST request and don't mind the response. - void PostBinaryAsync(const std::string& uri, - const std::string& body); - - // schedule a POST request and don't expect any response. - void PostBinaryAsync(const std::string& uri, - const std::string& body, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - // schedule a DELETE request expecting an empty response. - void DeleteAsync(const std::string& uri, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - Orthanc::IDynamicObject* payload = NULL /* takes ownership */); - - void NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); - - void NotifyHttpError(const IWebService::HttpRequestErrorMessage& message); - - private: - void HandleFromCache(const std::string& uri, - const IWebService::HttpHeaders& headers, - Orthanc::IDynamicObject* payload /* takes ownership */); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/OrthancSlicesLoader.cpp --- a/Framework/Deprecated/Toolbox/OrthancSlicesLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,901 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrthancSlicesLoader.h" - -#include "../Toolbox/MessagingToolbox.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - - -/** - * TODO This is a SLOW implementation of base64 decoding, because - * "Orthanc::Toolbox::DecodeBase64()" does not work properly with - * WASM. UNDERSTAND WHY. - * https://stackoverflow.com/a/34571089/881731 - **/ -static std::string base64_decode(const std::string &in) -{ - std::string out; - - std::vector T(256,-1); - for (int i=0; i<64; i++) T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; - - int val=0, valb=-8; - for (size_t i = 0; i < in.size(); i++) { - unsigned char c = in[i]; - if (T[c] == -1) break; - val = (val<<6) + T[c]; - valb += 6; - if (valb>=0) { - out.push_back(char((val>>valb)&0xFF)); - valb-=8; - } - } - return out; -} - - - -namespace Deprecated -{ - class OrthancSlicesLoader::Operation : public Orthanc::IDynamicObject - { - private: - Mode mode_; - unsigned int frame_; - unsigned int sliceIndex_; - const Slice* slice_; - std::string instanceId_; - SliceImageQuality quality_; - - Operation(Mode mode) : - mode_(mode) - { - } - - public: - Mode GetMode() const - { - return mode_; - } - - SliceImageQuality GetQuality() const - { - assert(mode_ == Mode_LoadImage || - mode_ == Mode_LoadRawImage); - return quality_; - } - - unsigned int GetSliceIndex() const - { - assert(mode_ == Mode_LoadImage || - mode_ == Mode_LoadRawImage); - return sliceIndex_; - } - - const Slice& GetSlice() const - { - assert(mode_ == Mode_LoadImage || - mode_ == Mode_LoadRawImage); - assert(slice_ != NULL); - return *slice_; - } - - unsigned int GetFrame() const - { - assert(mode_ == Mode_FrameGeometry); - return frame_; - } - - const std::string& GetInstanceId() const - { - assert(mode_ == Mode_FrameGeometry || - mode_ == Mode_InstanceGeometry); - return instanceId_; - } - - static Operation* DownloadInstanceGeometry(const std::string& instanceId) - { - std::unique_ptr operation(new Operation(Mode_InstanceGeometry)); - operation->instanceId_ = instanceId; - return operation.release(); - } - - static Operation* DownloadFrameGeometry(const std::string& instanceId, - unsigned int frame) - { - std::unique_ptr operation(new Operation(Mode_FrameGeometry)); - operation->instanceId_ = instanceId; - operation->frame_ = frame; - return operation.release(); - } - - static Operation* DownloadSliceImage(unsigned int sliceIndex, - const Slice& slice, - SliceImageQuality quality) - { - std::unique_ptr tmp(new Operation(Mode_LoadImage)); - tmp->sliceIndex_ = sliceIndex; - tmp->slice_ = &slice; - tmp->quality_ = quality; - return tmp.release(); - } - - static Operation* DownloadSliceRawImage(unsigned int sliceIndex, - const Slice& slice) - { - std::unique_ptr tmp(new Operation(Mode_LoadRawImage)); - tmp->sliceIndex_ = sliceIndex; - tmp->slice_ = &slice; - tmp->quality_ = SliceImageQuality_InternalRaw; - return tmp.release(); - } - - static Operation* DownloadDicomFile(const Slice& slice) - { - std::unique_ptr tmp(new Operation(Mode_LoadDicomFile)); - tmp->slice_ = &slice; - return tmp.release(); - } - - }; - - void OrthancSlicesLoader::NotifySliceImageSuccess(const Operation& operation, - const Orthanc::ImageAccessor& image) - { - OrthancSlicesLoader::SliceImageReadyMessage msg - (*this, operation.GetSliceIndex(), operation.GetSlice(), image, operation.GetQuality()); - BroadcastMessage(msg); - } - - - void OrthancSlicesLoader::NotifySliceImageError(const Operation& operation) - { - OrthancSlicesLoader::SliceImageErrorMessage msg - (*this, operation.GetSliceIndex(), operation.GetSlice(), operation.GetQuality()); - BroadcastMessage(msg); - } - - - void OrthancSlicesLoader::SortAndFinalizeSlices() - { - bool ok = slices_.Sort(); - - state_ = State_GeometryReady; - - if (ok) - { - LOG(INFO) << "Loaded a series with " << slices_.GetSlicesCount() << " slice(s)"; - BroadcastMessage(SliceGeometryReadyMessage(*this)); - } - else - { - LOG(ERROR) << "This series is empty"; - BroadcastMessage(SliceGeometryErrorMessage(*this)); - } - } - - void OrthancSlicesLoader::OnGeometryError(const IWebService::HttpRequestErrorMessage& message) - { - BroadcastMessage(SliceGeometryErrorMessage(*this)); - state_ = State_Error; - } - - void OrthancSlicesLoader::OnSliceImageError(const IWebService::HttpRequestErrorMessage& message) - { - NotifySliceImageError(dynamic_cast(message.GetPayload())); - state_ = State_Error; - } - - void OrthancSlicesLoader::ParseSeriesGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& series = message.GetJson(); - Json::Value::Members instances = series.getMemberNames(); - - slices_.Reserve(instances.size()); - - for (size_t i = 0; i < instances.size(); i++) - { - OrthancPlugins::FullOrthancDataset dataset(series[instances[i]]); - - Orthanc::DicomMap dicom; - MessagingToolbox::ConvertDataset(dicom, dataset); - - unsigned int frames; - if (!dicom.ParseUnsignedInteger32(frames, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) - { - frames = 1; - } - - for (unsigned int frame = 0; frame < frames; frame++) - { - std::unique_ptr slice(new Slice); - if (slice->ParseOrthancFrame(dicom, instances[i], frame)) - { - OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); - slices_.AddSlice(geometry, slice.release()); - } - else - { - LOG(WARNING) << "Skipping invalid frame " << frame << " within instance " << instances[i]; - } - } - } - - SortAndFinalizeSlices(); - } - - void OrthancSlicesLoader::ParseInstanceGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& tags = message.GetJson(); - const std::string& instanceId = dynamic_cast(message.GetPayload()).GetInstanceId(); - - OrthancPlugins::FullOrthancDataset dataset(tags); - - Orthanc::DicomMap dicom; - MessagingToolbox::ConvertDataset(dicom, dataset); - - unsigned int frames; - if (!dicom.ParseUnsignedInteger32(frames, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) - { - frames = 1; - } - - LOG(INFO) << "Instance " << instanceId << " contains " << frames << " frame(s)"; - - for (unsigned int frame = 0; frame < frames; frame++) - { - std::unique_ptr slice(new Slice); - if (slice->ParseOrthancFrame(dicom, instanceId, frame)) - { - OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); - slices_.AddSlice(geometry, slice.release()); - } - else - { - LOG(WARNING) << "Skipping invalid multi-frame instance " << instanceId; - BroadcastMessage(SliceGeometryErrorMessage(*this)); - return; - } - } - - SortAndFinalizeSlices(); - } - - - void OrthancSlicesLoader::ParseFrameGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& tags = message.GetJson(); - const std::string& instanceId = dynamic_cast(message.GetPayload()).GetInstanceId(); - unsigned int frame = dynamic_cast(message.GetPayload()).GetFrame(); - - OrthancPlugins::FullOrthancDataset dataset(tags); - - state_ = State_GeometryReady; - - Orthanc::DicomMap dicom; - MessagingToolbox::ConvertDataset(dicom, dataset); - - std::unique_ptr slice(new Slice); - if (slice->ParseOrthancFrame(dicom, instanceId, frame)) - { - LOG(INFO) << "Loaded instance geometry " << instanceId; - - OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); - slices_.AddSlice(geometry, slice.release()); - - BroadcastMessage(SliceGeometryReadyMessage(*this)); - } - else - { - LOG(WARNING) << "Skipping invalid instance " << instanceId; - BroadcastMessage(SliceGeometryErrorMessage(*this)); - } - } - - - void OrthancSlicesLoader::ParseSliceImagePng(const OrthancApiClient::BinaryResponseReadyMessage& message) - { - const Operation& operation = dynamic_cast(message.GetPayload()); - std::unique_ptr image; - - try - { - image.reset(new Orthanc::PngReader); - dynamic_cast(*image).ReadFromMemory(message.GetAnswer(), message.GetAnswerSize()); - } - catch (Orthanc::OrthancException&) - { - NotifySliceImageError(operation); - return; - } - - if (image->GetWidth() != operation.GetSlice().GetWidth() || - image->GetHeight() != operation.GetSlice().GetHeight()) - { - NotifySliceImageError(operation); - return; - } - - if (operation.GetSlice().GetConverter().GetExpectedPixelFormat() == - Orthanc::PixelFormat_SignedGrayscale16) - { - if (image->GetFormat() == Orthanc::PixelFormat_Grayscale16) - { - image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); - } - else - { - NotifySliceImageError(operation); - return; - } - } - - NotifySliceImageSuccess(operation, *image); - } - - void OrthancSlicesLoader::ParseSliceImagePam(const OrthancApiClient::BinaryResponseReadyMessage& message) - { - const Operation& operation = dynamic_cast(message.GetPayload()); - std::unique_ptr image; - - try - { - image.reset(new Orthanc::PamReader); - dynamic_cast(*image).ReadFromMemory(message.GetAnswer(), message.GetAnswerSize()); - } - catch (Orthanc::OrthancException&) - { - NotifySliceImageError(operation); - return; - } - - if (image->GetWidth() != operation.GetSlice().GetWidth() || - image->GetHeight() != operation.GetSlice().GetHeight()) - { - NotifySliceImageError(operation); - return; - } - - if (operation.GetSlice().GetConverter().GetExpectedPixelFormat() == - Orthanc::PixelFormat_SignedGrayscale16) - { - if (image->GetFormat() == Orthanc::PixelFormat_Grayscale16) - { - image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); - } - else - { - NotifySliceImageError(operation); - return; - } - } - - NotifySliceImageSuccess(operation, *image); - } - - - void OrthancSlicesLoader::ParseSliceImageJpeg(const OrthancApiClient::JsonResponseReadyMessage& message) - { - const Operation& operation = dynamic_cast(message.GetPayload()); - - const Json::Value& encoded = message.GetJson(); - if (encoded.type() != Json::objectValue || - !encoded.isMember("Orthanc") || - encoded["Orthanc"].type() != Json::objectValue) - { - NotifySliceImageError(operation); - return; - } - - const Json::Value& info = encoded["Orthanc"]; - if (!info.isMember("PixelData") || - !info.isMember("Stretched") || - !info.isMember("Compression") || - info["Compression"].type() != Json::stringValue || - info["PixelData"].type() != Json::stringValue || - info["Stretched"].type() != Json::booleanValue || - info["Compression"].asString() != "Jpeg") - { - NotifySliceImageError(operation); - return; - } - - bool isSigned = false; - bool isStretched = info["Stretched"].asBool(); - - if (info.isMember("IsSigned")) - { - if (info["IsSigned"].type() != Json::booleanValue) - { - NotifySliceImageError(operation); - return; - } - else - { - isSigned = info["IsSigned"].asBool(); - } - } - - std::unique_ptr reader; - - { - std::string jpeg; - //Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); - jpeg = base64_decode(info["PixelData"].asString()); - - try - { - reader.reset(new Orthanc::JpegReader); - dynamic_cast(*reader).ReadFromMemory(jpeg); - } - catch (Orthanc::OrthancException&) - { - NotifySliceImageError(operation); - return; - } - } - - Orthanc::PixelFormat expectedFormat = - operation.GetSlice().GetConverter().GetExpectedPixelFormat(); - - if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image - { - if (expectedFormat != Orthanc::PixelFormat_RGB24) - { - NotifySliceImageError(operation); - return; - } - - if (isSigned || isStretched) - { - NotifySliceImageError(operation); - return; - } - else - { - NotifySliceImageSuccess(operation, *reader); - return; - } - } - - if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) - { - NotifySliceImageError(operation); - return; - } - - if (!isStretched) - { - if (expectedFormat != reader->GetFormat()) - { - NotifySliceImageError(operation); - return; - } - else - { - NotifySliceImageSuccess(operation, *reader); - return; - } - } - - int32_t stretchLow = 0; - int32_t stretchHigh = 0; - - if (!info.isMember("StretchLow") || - !info.isMember("StretchHigh") || - info["StretchLow"].type() != Json::intValue || - info["StretchHigh"].type() != Json::intValue) - { - NotifySliceImageError(operation); - return; - } - - stretchLow = info["StretchLow"].asInt(); - stretchHigh = info["StretchHigh"].asInt(); - - if (stretchLow < -32768 || - stretchHigh > 65535 || - (stretchLow < 0 && stretchHigh > 32767)) - { - // This range cannot be represented with a uint16_t or an int16_t - NotifySliceImageError(operation); - return; - } - - // Decode a grayscale JPEG 8bpp image coming from the Web viewer - std::unique_ptr image - (new Orthanc::Image(expectedFormat, reader->GetWidth(), reader->GetHeight(), false)); - - Orthanc::ImageProcessing::Convert(*image, *reader); - reader.reset(); - - float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; - - if (!OrthancStone::LinearAlgebra::IsCloseToZero(scaling)) - { - float offset = static_cast(stretchLow) / scaling; - Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); - } - - NotifySliceImageSuccess(operation, *image); - } - - - class StringImage : public Orthanc::ImageAccessor - { - private: - std::string buffer_; - - public: - StringImage(Orthanc::PixelFormat format, - unsigned int width, - unsigned int height, - std::string& buffer) - { - if (buffer.size() != Orthanc::GetBytesPerPixel(format) * width * height) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - buffer_.swap(buffer); // The source buffer is now empty - - void* data = (buffer_.empty() ? NULL : &buffer_[0]); - - AssignWritable(format, width, height, - Orthanc::GetBytesPerPixel(format) * width, data); - } - }; - - void OrthancSlicesLoader::ParseSliceRawImage(const OrthancApiClient::BinaryResponseReadyMessage& message) - { - const Operation& operation = dynamic_cast(message.GetPayload()); - Orthanc::GzipCompressor compressor; - - std::string raw; - compressor.Uncompress(raw, message.GetAnswer(), message.GetAnswerSize()); - - const Orthanc::DicomImageInformation& info = operation.GetSlice().GetImageInformation(); - - if (info.GetBitsAllocated() == 32 && - info.GetBitsStored() == 32 && - info.GetHighBit() == 31 && - info.GetChannelCount() == 1 && - !info.IsSigned() && - info.GetPhotometricInterpretation() == Orthanc::PhotometricInterpretation_Monochrome2 && - raw.size() == info.GetWidth() * info.GetHeight() * 4) - { - // This is the case of RT-DOSE (uint32_t values) - - std::unique_ptr image - (new StringImage(Orthanc::PixelFormat_Grayscale32, info.GetWidth(), - info.GetHeight(), raw)); - - // TODO - Only for big endian - for (unsigned int y = 0; y < image->GetHeight(); y++) - { - uint32_t *p = reinterpret_cast(image->GetRow(y)); - for (unsigned int x = 0; x < image->GetWidth(); x++, p++) - { - *p = le32toh(*p); - } - } - - NotifySliceImageSuccess(operation, *image); - } - else if (info.GetBitsAllocated() == 16 && - info.GetBitsStored() == 16 && - info.GetHighBit() == 15 && - info.GetChannelCount() == 1 && - !info.IsSigned() && - info.GetPhotometricInterpretation() == Orthanc::PhotometricInterpretation_Monochrome2 && - raw.size() == info.GetWidth() * info.GetHeight() * 2) - { - std::unique_ptr image - (new StringImage(Orthanc::PixelFormat_Grayscale16, info.GetWidth(), - info.GetHeight(), raw)); - - // TODO - Big endian ? - - NotifySliceImageSuccess(operation, *image); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - } - - - OrthancSlicesLoader::OrthancSlicesLoader(boost::shared_ptr orthanc) : - orthanc_(orthanc), - state_(State_Initialization) - { - } - - - void OrthancSlicesLoader::ScheduleLoadSeries(const std::string& seriesId) - { - if (state_ != State_Initialization) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - state_ = State_LoadingGeometry; - orthanc_->GetJsonAsync("/series/" + seriesId + "/instances-tags", - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseSeriesGeometry), - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), - NULL); - } - } - - void OrthancSlicesLoader::ScheduleLoadInstance(const std::string& instanceId) - { - if (state_ != State_Initialization) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - state_ = State_LoadingGeometry; - - // Tag "3004-000c" is "Grid Frame Offset Vector", which is - // mandatory to read RT DOSE, but is too long to be returned by default - orthanc_->GetJsonAsync("/instances/" + instanceId + "/tags?ignore-length=3004-000c", - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseInstanceGeometry), - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), - Operation::DownloadInstanceGeometry(instanceId)); - } - } - - - void OrthancSlicesLoader::ScheduleLoadFrame(const std::string& instanceId, - unsigned int frame) - { - if (state_ != State_Initialization) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - state_ = State_LoadingGeometry; - - orthanc_->GetJsonAsync("/instances/" + instanceId + "/tags", - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseFrameGeometry), - new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), - Operation::DownloadFrameGeometry(instanceId, frame)); - } - } - - - bool OrthancSlicesLoader::IsGeometryReady() const - { - return state_ == State_GeometryReady; - } - - - size_t OrthancSlicesLoader::GetSlicesCount() const - { - if (state_ != State_GeometryReady) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return slices_.GetSlicesCount(); - } - - - const Slice& OrthancSlicesLoader::GetSlice(size_t index) const - { - if (state_ != State_GeometryReady) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return dynamic_cast(slices_.GetSlicePayload(index)); - } - - - bool OrthancSlicesLoader::LookupSlice(size_t& index, - const OrthancStone::CoordinateSystem3D& plane) const - { - if (state_ != State_GeometryReady) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - double distance; - return (slices_.LookupClosestSlice(index, distance, plane) && - distance <= GetSlice(index).GetThickness() / 2.0); - } - - - void OrthancSlicesLoader::ScheduleSliceImagePng(const Slice& slice, - size_t index) - { - std::string uri = ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + - boost::lexical_cast(slice.GetFrame())); - - switch (slice.GetConverter().GetExpectedPixelFormat()) - { - case Orthanc::PixelFormat_RGB24: - uri += "/preview"; - break; - - case Orthanc::PixelFormat_Grayscale16: - uri += "/image-uint16"; - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - uri += "/image-int16"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - orthanc_->GetBinaryAsync(uri, "image/png", - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImagePng), - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), - Operation::DownloadSliceImage( - static_cast(index), slice, SliceImageQuality_FullPng)); - } - - void OrthancSlicesLoader::ScheduleSliceImagePam(const Slice& slice, - size_t index) - { - std::string uri = - ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + - boost::lexical_cast(slice.GetFrame())); - - switch (slice.GetConverter().GetExpectedPixelFormat()) - { - case Orthanc::PixelFormat_RGB24: - uri += "/preview"; - break; - - case Orthanc::PixelFormat_Grayscale16: - uri += "/image-uint16"; - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - uri += "/image-int16"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - orthanc_->GetBinaryAsync(uri, "image/x-portable-arbitrarymap", - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImagePam), - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), - Operation::DownloadSliceImage(static_cast(index), - slice, SliceImageQuality_FullPam)); - } - - - - void OrthancSlicesLoader::ScheduleSliceImageJpeg(const Slice& slice, - size_t index, - SliceImageQuality quality) - { - unsigned int value; - - switch (quality) - { - case SliceImageQuality_Jpeg50: - value = 50; - break; - - case SliceImageQuality_Jpeg90: - value = 90; - break; - - case SliceImageQuality_Jpeg95: - value = 95; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // This requires the official Web viewer plugin to be installed! - std::string uri = ("/web-viewer/instances/jpeg" + - boost::lexical_cast(value) + - "-" + slice.GetOrthancInstanceId() + "_" + - boost::lexical_cast(slice.GetFrame())); - - orthanc_->GetJsonAsync(uri, - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImageJpeg), - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), - Operation::DownloadSliceImage( - static_cast(index), slice, quality)); - } - - - - void OrthancSlicesLoader::ScheduleLoadSliceImage(size_t index, - SliceImageQuality quality) - { - if (state_ != State_GeometryReady) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - const Slice& slice = GetSlice(index); - - if (slice.HasOrthancDecoding()) - { - switch (quality) - { - case SliceImageQuality_FullPng: - ScheduleSliceImagePng(slice, index); - break; - case SliceImageQuality_FullPam: - ScheduleSliceImagePam(slice, index); - break; - default: - ScheduleSliceImageJpeg(slice, index, quality); - } - } - else - { - std::string uri = ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + - boost::lexical_cast(slice.GetFrame()) + "/raw.gz"); - orthanc_->GetBinaryAsync(uri, IWebService::HttpHeaders(), - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceRawImage), - new DeprecatedCallable - (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), - Operation::DownloadSliceRawImage( - static_cast(index), slice)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/OrthancSlicesLoader.h --- a/Framework/Deprecated/Toolbox/OrthancSlicesLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,211 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Messages/IObservable.h" -#include "../../Messages/ObserverBase.h" -#include "../../StoneEnumerations.h" -#include "../../Toolbox/SlicesSorter.h" -#include "IWebService.h" -#include "OrthancApiClient.h" -#include "Slice.h" - -#include - - -namespace Deprecated -{ - class OrthancSlicesLoader : - public OrthancStone::IObservable, - public OrthancStone::ObserverBase - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SliceGeometryReadyMessage, OrthancSlicesLoader); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SliceGeometryErrorMessage, OrthancSlicesLoader); - - - class SliceImageReadyMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - unsigned int sliceIndex_; - const Slice& slice_; - const Orthanc::ImageAccessor& image_; - SliceImageQuality effectiveQuality_; - - public: - SliceImageReadyMessage(const OrthancSlicesLoader& origin, - unsigned int sliceIndex, - const Slice& slice, - const Orthanc::ImageAccessor& image, - SliceImageQuality effectiveQuality) : - OriginMessage(origin), - sliceIndex_(sliceIndex), - slice_(slice), - image_(image), - effectiveQuality_(effectiveQuality) - { - } - - unsigned int GetSliceIndex() const - { - return sliceIndex_; - } - - const Slice& GetSlice() const - { - return slice_; - } - - const Orthanc::ImageAccessor& GetImage() const - { - return image_; - } - - SliceImageQuality GetEffectiveQuality() const - { - return effectiveQuality_; - } - }; - - - class SliceImageErrorMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Slice& slice_; - unsigned int sliceIndex_; - SliceImageQuality effectiveQuality_; - - public: - SliceImageErrorMessage(const OrthancSlicesLoader& origin, - unsigned int sliceIndex, - const Slice& slice, - SliceImageQuality effectiveQuality) : - OriginMessage(origin), - slice_(slice), - sliceIndex_(sliceIndex), - effectiveQuality_(effectiveQuality) - { - } - unsigned int GetSliceIndex() const - { - return sliceIndex_; - } - - const Slice& GetSlice() const - { - return slice_; - } - - SliceImageQuality GetEffectiveQuality() const - { - return effectiveQuality_; - } - }; - - private: - enum State - { - State_Error, - State_Initialization, - State_LoadingGeometry, - State_GeometryReady - }; - - enum Mode - { - Mode_SeriesGeometry, - Mode_InstanceGeometry, - Mode_FrameGeometry, - Mode_LoadImage, - Mode_LoadRawImage, - Mode_LoadDicomFile - }; - - class Operation; - - boost::shared_ptr orthanc_; - State state_; - OrthancStone::SlicesSorter slices_; - - void NotifySliceImageSuccess(const Operation& operation, - const Orthanc::ImageAccessor& image); - - void NotifySliceImageError(const Operation& operation); - - void OnGeometryError(const IWebService::HttpRequestErrorMessage& message); - - void OnSliceImageError(const IWebService::HttpRequestErrorMessage& message); - - void ParseSeriesGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); - - void ParseInstanceGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); - - void ParseFrameGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); - - void ParseSliceImagePng(const OrthancApiClient::BinaryResponseReadyMessage& message); - - void ParseSliceImagePam(const OrthancApiClient::BinaryResponseReadyMessage& message); - - void ParseSliceImageJpeg(const OrthancApiClient::JsonResponseReadyMessage& message); - - void ParseSliceRawImage(const OrthancApiClient::BinaryResponseReadyMessage& message); - - void ScheduleSliceImagePng(const Slice& slice, - size_t index); - - void ScheduleSliceImagePam(const Slice& slice, - size_t index); - - void ScheduleSliceImageJpeg(const Slice& slice, - size_t index, - SliceImageQuality quality); - - void SortAndFinalizeSlices(); - - public: - OrthancSlicesLoader(//ISliceLoaderObserver& callback, - boost::shared_ptr orthancApi); - - void ScheduleLoadSeries(const std::string& seriesId); - - void ScheduleLoadInstance(const std::string& instanceId); - - void ScheduleLoadFrame(const std::string& instanceId, - unsigned int frame); - - bool IsGeometryReady() const; - - size_t GetSlicesCount() const; - - const Slice& GetSlice(size_t index) const; - - bool LookupSlice(size_t& index, - const OrthancStone::CoordinateSystem3D& plane) const; - - void ScheduleLoadSliceImage(size_t index, - SliceImageQuality requestedQuality); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ParallelSlices.cpp --- a/Framework/Deprecated/Toolbox/ParallelSlices.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParallelSlices.h" - -#include "../../Toolbox/GeometryToolbox.h" -#include "../../Volumes/ImageBuffer3D.h" - -#include -#include - -namespace Deprecated -{ - ParallelSlices::ParallelSlices() - { - Clear(); - } - - - ParallelSlices::ParallelSlices(const ParallelSlices& other) - { - normal_ = other.normal_; - - slices_.resize(other.slices_.size()); - - for (size_t i = 0; i < slices_.size(); i++) - { - assert(other.slices_[i] != NULL); - slices_[i] = new OrthancStone::CoordinateSystem3D(*other.slices_[i]); - } - } - - - void ParallelSlices::Clear() - { - for (size_t i = 0; i < slices_.size(); i++) - { - if (slices_[i] != NULL) - { - delete slices_[i]; - slices_[i] = NULL; - } - } - - slices_.clear(); - OrthancStone::LinearAlgebra::AssignVector(normal_, 0, 0, 1); - } - - - ParallelSlices::~ParallelSlices() - { - Clear(); - } - - - void ParallelSlices::AddSlice(const OrthancStone::CoordinateSystem3D& slice) - { - if (slices_.empty()) - { - normal_ = slice.GetNormal(); - slices_.push_back(new OrthancStone::CoordinateSystem3D(slice)); - } - else if (OrthancStone::GeometryToolbox::IsParallel(slice.GetNormal(), normal_)) - { - slices_.push_back(new OrthancStone::CoordinateSystem3D(slice)); - } - else - { - LOG(ERROR) << "Trying to add a slice that is not parallel to the previous ones"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void ParallelSlices::AddSlice(const OrthancStone::Vector& origin, - const OrthancStone::Vector& axisX, - const OrthancStone::Vector& axisY) - { - OrthancStone::CoordinateSystem3D slice(origin, axisX, axisY); - AddSlice(slice); - } - - - const OrthancStone::CoordinateSystem3D& ParallelSlices::GetSlice(size_t index) const - { - if (index >= slices_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - return *slices_[index]; - } - } - - - bool ParallelSlices::ComputeClosestSlice(size_t& closestSlice, - double& closestDistance, - const OrthancStone::Vector& origin) const - { - if (slices_.empty()) - { - return false; - } - - double reference = boost::numeric::ublas::inner_prod(origin, normal_); - - closestSlice = 0; - closestDistance = std::numeric_limits::infinity(); - - for (size_t i = 0; i < slices_.size(); i++) - { - double distance = fabs(boost::numeric::ublas::inner_prod(slices_[i]->GetOrigin(), normal_) - reference); - - if (distance < closestDistance) - { - closestSlice = i; - closestDistance = distance; - } - } - - return true; - } - - - ParallelSlices* ParallelSlices::Reverse() const - { - std::unique_ptr reversed(new ParallelSlices); - - for (size_t i = slices_.size(); i > 0; i--) - { - const OrthancStone::CoordinateSystem3D& slice = *slices_[i - 1]; - - reversed->AddSlice(slice.GetOrigin(), - -slice.GetAxisX(), - slice.GetAxisY()); - } - - return reversed.release(); - } - - - ParallelSlices* ParallelSlices::FromVolumeImage(const OrthancStone::VolumeImageGeometry& geometry, - OrthancStone::VolumeProjection projection) - { - const OrthancStone::Vector dimensions = geometry.GetVoxelDimensions(OrthancStone::VolumeProjection_Axial); - const OrthancStone::CoordinateSystem3D& axial = geometry.GetAxialGeometry(); - - std::unique_ptr result(new ParallelSlices); - - switch (projection) - { - case OrthancStone::VolumeProjection_Axial: - for (unsigned int z = 0; z < geometry.GetDepth(); z++) - { - OrthancStone::Vector origin = axial.GetOrigin(); - origin += static_cast(z) * dimensions[2] * axial.GetNormal(); - - result->AddSlice(origin, - axial.GetAxisX(), - axial.GetAxisY()); - } - break; - - case OrthancStone::VolumeProjection_Coronal: - for (unsigned int y = 0; y < geometry.GetHeight(); y++) - { - OrthancStone::Vector origin = axial.GetOrigin(); - origin += static_cast(y) * dimensions[1] * axial.GetAxisY(); - origin += static_cast(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); - - result->AddSlice(origin, - axial.GetAxisX(), - -axial.GetNormal()); - } - break; - - case OrthancStone::VolumeProjection_Sagittal: - for (unsigned int x = 0; x < geometry.GetWidth(); x++) - { - OrthancStone::Vector origin = axial.GetOrigin(); - origin += static_cast(x) * dimensions[0] * axial.GetAxisX(); - origin += static_cast(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); - - result->AddSlice(origin, - axial.GetAxisY(), - -axial.GetNormal()); - } - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - return result.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ParallelSlices.h --- a/Framework/Deprecated/Toolbox/ParallelSlices.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Toolbox/CoordinateSystem3D.h" -#include "../../Volumes/VolumeImageGeometry.h" - -namespace Deprecated -{ - class ParallelSlices : public boost::noncopyable - { - private: - OrthancStone::Vector normal_; - std::vector slices_; - - ParallelSlices& operator= (const ParallelSlices& other); // Forbidden - - void Clear(); - - public: - ParallelSlices(); - - ParallelSlices(const ParallelSlices& other); - - ~ParallelSlices(); - - const OrthancStone::Vector& GetNormal() const - { - return normal_; - } - - void AddSlice(const OrthancStone::CoordinateSystem3D& slice); - - void AddSlice(const OrthancStone::Vector& origin, - const OrthancStone::Vector& axisX, - const OrthancStone::Vector& axisY); - - size_t GetSliceCount() const - { - return slices_.size(); - } - - const OrthancStone::CoordinateSystem3D& GetSlice(size_t index) const; - - bool ComputeClosestSlice(size_t& closestSlice, - double& closestDistance, - const OrthancStone::Vector& origin) const; - - ParallelSlices* Reverse() const; - - static ParallelSlices* FromVolumeImage(const OrthancStone::VolumeImageGeometry& geometry, - OrthancStone::VolumeProjection projection); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ParallelSlicesCursor.cpp --- a/Framework/Deprecated/Toolbox/ParallelSlicesCursor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,221 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParallelSlicesCursor.h" - -#include - -namespace Deprecated -{ - size_t ParallelSlicesCursor::GetDefaultSlice() - { - if (slices_.get() == NULL) - { - return 0; - } - else - { - return slices_->GetSliceCount() / 2; - } - } - - - size_t ParallelSlicesCursor::GetSliceCount() - { - if (slices_.get() == NULL) - { - return 0; - } - else - { - return slices_->GetSliceCount(); - } - } - - - OrthancStone::CoordinateSystem3D ParallelSlicesCursor::GetSlice(size_t slice) - { - if (slices_.get() == NULL) - { - return OrthancStone::CoordinateSystem3D(); - } - else - { - return slices_->GetSlice(slice); - } - } - - - void ParallelSlicesCursor::SetGeometry(const ParallelSlices& slices) - { - slices_.reset(new ParallelSlices(slices)); - - currentSlice_ = GetDefaultSlice(); - } - - - OrthancStone::CoordinateSystem3D ParallelSlicesCursor::GetCurrentSlice() - { - if (slices_.get() != NULL && - currentSlice_ < slices_->GetSliceCount()) - { - return slices_->GetSlice(currentSlice_); - } - else - { - return OrthancStone::CoordinateSystem3D(); // No slice is available, return the canonical geometry - } - } - - - bool ParallelSlicesCursor::SetDefaultSlice() - { - size_t slice = GetDefaultSlice(); - - if (currentSlice_ != slice) - { - currentSlice_ = slice; - return true; - } - else - { - return false; - } - } - - - bool ParallelSlicesCursor::ApplyOffset(OrthancStone::SliceOffsetMode mode, - int offset) - { - if (slices_.get() == NULL) - { - return false; - } - - int count = static_cast(slices_->GetSliceCount()); - if (count == 0) - { - return false; - } - - int slice; - if (static_cast(currentSlice_) >= count) - { - slice = count - 1; - } - else - { - slice = static_cast(currentSlice_); - } - - switch (mode) - { - case OrthancStone::SliceOffsetMode_Absolute: - { - slice = offset; - break; - } - - case OrthancStone::SliceOffsetMode_Relative: - { - slice += offset; - break; - } - - case OrthancStone::SliceOffsetMode_Loop: - { - slice += offset; - while (slice < 0) - { - slice += count; - } - - while (slice >= count) - { - slice -= count; - } - - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (slice < 0) - { - slice = 0; - } - - if (slice >= count) - { - slice = count - 1; - } - - if (slice != static_cast(currentSlice_)) - { - currentSlice_ = static_cast(slice); - return true; - } - else - { - return false; - } - } - - - bool ParallelSlicesCursor::ApplyWheelEvent(OrthancStone::MouseWheelDirection direction, - OrthancStone::KeyboardModifiers modifiers) - { - int offset = (modifiers & OrthancStone::KeyboardModifiers_Control ? 10 : 1); - - switch (direction) - { - case OrthancStone::MouseWheelDirection_Down: - return ApplyOffset(OrthancStone::SliceOffsetMode_Relative, -offset); - - case OrthancStone::MouseWheelDirection_Up: - return ApplyOffset(OrthancStone::SliceOffsetMode_Relative, offset); - - default: - return false; - } - } - - - bool ParallelSlicesCursor::LookupSliceContainingPoint(const OrthancStone::Vector& p) - { - size_t slice; - double distance; - - if (slices_.get() != NULL && - slices_->ComputeClosestSlice(slice, distance, p)) - { - if (currentSlice_ != slice) - { - currentSlice_ = slice; - return true; - } - } - - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ParallelSlicesCursor.h --- a/Framework/Deprecated/Toolbox/ParallelSlicesCursor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ParallelSlices.h" -#include "../../StoneEnumerations.h" - -#include - -namespace Deprecated -{ - class ParallelSlicesCursor : public boost::noncopyable - { - private: - std::unique_ptr slices_; - size_t currentSlice_; - - size_t GetDefaultSlice(); - - public: - ParallelSlicesCursor() : - currentSlice_(0) - { - } - - void SetGeometry(const ParallelSlices& slices); - - size_t GetSliceCount(); - - OrthancStone::CoordinateSystem3D GetSlice(size_t slice); - - OrthancStone::CoordinateSystem3D GetCurrentSlice(); - - // Returns "true" iff. the slice has actually changed - bool SetDefaultSlice(); - - // Returns "true" iff. the slice has actually changed - bool ApplyOffset(OrthancStone::SliceOffsetMode mode, - int offset); - - // Returns "true" iff. the slice has actually changed - bool ApplyWheelEvent(OrthancStone::MouseWheelDirection direction, - OrthancStone::KeyboardModifiers modifiers); - - // Returns "true" iff. the slice has actually changed - bool LookupSliceContainingPoint(const OrthancStone::Vector& p); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/Slice.cpp --- a/Framework/Deprecated/Toolbox/Slice.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,367 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Slice.h" - -#include "../../StoneEnumerations.h" -#include "../../Toolbox/GeometryToolbox.h" - -#include -#include -#include - -#include - -namespace Deprecated -{ - static bool ParseDouble(double& target, - const std::string& source) - { - try - { - target = boost::lexical_cast(source); - return true; - } - catch (boost::bad_lexical_cast&) - { - return false; - } - } - - Slice* Slice::Clone() const - { - std::unique_ptr target(new Slice()); - - target->type_ = type_; - target->orthancInstanceId_ = orthancInstanceId_; - target->sopClassUid_ = sopClassUid_; - target->frame_ = frame_; - target->frameCount_ = frameCount_; - target->geometry_ = geometry_; - target->pixelSpacingX_ = pixelSpacingX_; - target->pixelSpacingY_ = pixelSpacingY_; - target->thickness_ = thickness_; - target->width_ = width_; - target->height_ = height_; - target->converter_ = converter_; - if (imageInformation_.get() != NULL) - target->imageInformation_.reset(imageInformation_->Clone()); - - return target.release(); - } - - bool Slice::ComputeRTDoseGeometry(const Orthanc::DicomMap& dataset, - unsigned int frame) - { - // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html - - { - std::string increment; - - if (dataset.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) - { - Orthanc::Toolbox::ToUpperCase(increment); - if (increment != "3004,000C") // This is the "Grid Frame Offset Vector" tag - { - LOG(ERROR) << "Bad value for the \"FrameIncrementPointer\" tag"; - return false; - } - } - } - - std::string offsetTag; - - if (!dataset.LookupStringValue(offsetTag, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, false) || - offsetTag.empty()) - { - LOG(ERROR) << "Cannot read the \"GridFrameOffsetVector\" tag, check you are using Orthanc >= 1.3.1"; - return false; - } - - std::vector offsets; - Orthanc::Toolbox::TokenizeString(offsets, offsetTag, '\\'); - - if (frameCount_ <= 1 || - offsets.size() < frameCount_ || - offsets.size() < 2 || - frame >= frameCount_) - { - LOG(ERROR) << "No information about the 3D location of some slice(s) in a RT DOSE"; - return false; - } - - double offset0, offset1, z; - - if (!ParseDouble(offset0, offsets[0]) || - !ParseDouble(offset1, offsets[1]) || - !ParseDouble(z, offsets[frame])) - { - LOG(ERROR) << "Invalid syntax"; - return false; - } - - if (!OrthancStone::LinearAlgebra::IsCloseToZero(offset0)) - { - LOG(ERROR) << "Invalid syntax"; - return false; - } - - geometry_ = OrthancStone::CoordinateSystem3D(geometry_.GetOrigin() + z * geometry_.GetNormal(), - //+ 650 * geometry_.GetAxisX(), - geometry_.GetAxisX(), - geometry_.GetAxisY()); - - thickness_ = offset1 - offset0; - if (thickness_ < 0) - { - thickness_ = -thickness_; - } - - return true; - } - - - bool Slice::ParseOrthancFrame(const Orthanc::DicomMap& dataset, - const std::string& instanceId, - unsigned int frame) - { - orthancInstanceId_ = instanceId; - frame_ = frame; - type_ = Type_OrthancDecodableFrame; - imageInformation_.reset(new Orthanc::DicomImageInformation(dataset)); - - if (!dataset.LookupStringValue(sopClassUid_, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) || - sopClassUid_.empty()) - { - LOG(ERROR) << "Instance without a SOP class UID"; - return false; - } - - if (!dataset.ParseUnsignedInteger32(frameCount_, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) - { - frameCount_ = 1; // Assume instance with one frame - } - - if (frame >= frameCount_) - { - return false; - } - - if (!dataset.ParseUnsignedInteger32(width_, Orthanc::DICOM_TAG_COLUMNS) || - !dataset.ParseUnsignedInteger32(height_, Orthanc::DICOM_TAG_ROWS)) - { - return false; - } - - thickness_ = 100.0 * std::numeric_limits::epsilon(); - - std::string tmp; - if (dataset.LookupStringValue(tmp, Orthanc::DICOM_TAG_SLICE_THICKNESS, false)) - { - if (!tmp.empty() && - !ParseDouble(thickness_, tmp)) - { - return false; // Syntax error - } - } - - converter_.ReadParameters(dataset); - - OrthancStone::GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dataset); - - std::string position, orientation; - if (dataset.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && - dataset.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) - { - geometry_ = OrthancStone::CoordinateSystem3D(position, orientation); - - bool ok = true; - - switch (OrthancStone::StringToSopClassUid(sopClassUid_)) - { - case OrthancStone::SopClassUid_RTDose: - type_ = Type_OrthancRawFrame; - ok = ComputeRTDoseGeometry(dataset, frame); - break; - - default: - break; - } - - if (!ok) - { - LOG(ERROR) << "Cannot deduce the 3D location of frame " << frame - << " in instance " << instanceId << ", whose SOP class UID is: " << sopClassUid_; - return false; - } - } - - return true; - } - - - const std::string Slice::GetOrthancInstanceId() const - { - if (type_ == Type_OrthancDecodableFrame || - type_ == Type_OrthancRawFrame) - { - return orthancInstanceId_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - unsigned int Slice::GetFrame() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return frame_; - } - - - const OrthancStone::CoordinateSystem3D& Slice::GetGeometry() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return geometry_; - } - - - double Slice::GetThickness() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return thickness_; - } - - - double Slice::GetPixelSpacingX() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return pixelSpacingX_; - } - - - double Slice::GetPixelSpacingY() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return pixelSpacingY_; - } - - - unsigned int Slice::GetWidth() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return width_; - } - - - unsigned int Slice::GetHeight() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return height_; - } - - - const DicomFrameConverter& Slice::GetConverter() const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return converter_; - } - - - bool Slice::ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const - { - if (type_ == Type_Invalid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - bool opposite; - return (OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, - GetGeometry().GetNormal(), - plane.GetNormal()) && - OrthancStone::LinearAlgebra::IsNear(GetGeometry().ProjectAlongNormal(GetGeometry().GetOrigin()), - GetGeometry().ProjectAlongNormal(plane.GetOrigin()), - thickness_ / 2.0)); - } - - - void Slice::GetExtent(std::vector& points) const - { - double sx = GetPixelSpacingX(); - double sy = GetPixelSpacingY(); - double w = static_cast(GetWidth()); - double h = static_cast(GetHeight()); - - points.clear(); - points.push_back(GetGeometry().MapSliceToWorldCoordinates(-0.5 * sx, -0.5 * sy)); - points.push_back(GetGeometry().MapSliceToWorldCoordinates((w - 0.5) * sx, -0.5 * sy)); - points.push_back(GetGeometry().MapSliceToWorldCoordinates(-0.5 * sx, (h - 0.5) * sy)); - points.push_back(GetGeometry().MapSliceToWorldCoordinates((w - 0.5) * sx, (h - 0.5) * sy)); - } - - - const Orthanc::DicomImageInformation& Slice::GetImageInformation() const - { - if (imageInformation_.get() == NULL) - { - // Only available if constructing the "Slice" object with a DICOM map - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *imageInformation_; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/Slice.h --- a/Framework/Deprecated/Toolbox/Slice.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Toolbox/CoordinateSystem3D.h" -#include "DicomFrameConverter.h" - -#include -#include - -namespace Deprecated -{ - // TODO - Remove this class - class Slice : - public Orthanc::IDynamicObject /* to be used as a payload of SlicesSorter */ - { - private: - enum Type - { - Type_Invalid, - Type_Standalone, - Type_OrthancDecodableFrame, - Type_OrthancRawFrame - // TODO A slice could come from some DICOM file (URL) - }; - - bool ComputeRTDoseGeometry(const Orthanc::DicomMap& dataset, - unsigned int frame); - - Type type_; - std::string orthancInstanceId_; - std::string sopClassUid_; - unsigned int frame_; - unsigned int frameCount_; // TODO : Redundant with "imageInformation_" - OrthancStone::CoordinateSystem3D geometry_; - double pixelSpacingX_; - double pixelSpacingY_; - double thickness_; - unsigned int width_; // TODO : Redundant with "imageInformation_" - unsigned int height_; // TODO : Redundant with "imageInformation_" - DicomFrameConverter converter_; // TODO : Partially redundant with "imageInformation_" - - std::unique_ptr imageInformation_; - - public: - Slice() : - type_(Type_Invalid) - { - } - - - // this constructor is used to reference, i.e, a slice that is being loaded - Slice(const std::string& orthancInstanceId, - unsigned int frame) : - type_(Type_Invalid), - orthancInstanceId_(orthancInstanceId), - frame_(frame) - { - } - - // TODO Is this constructor the best way to go to tackle missing - // layers within SliceViewerWidget? - Slice(const OrthancStone::CoordinateSystem3D& plane, - double thickness) : - type_(Type_Standalone), - frame_(0), - frameCount_(0), - geometry_(plane), - pixelSpacingX_(1), - pixelSpacingY_(1), - thickness_(thickness), - width_(0), - height_(0) - { - } - - Slice(const OrthancStone::CoordinateSystem3D& plane, - double pixelSpacingX, - double pixelSpacingY, - double thickness, - unsigned int width, - unsigned int height, - const DicomFrameConverter& converter) : - type_(Type_Standalone), - frameCount_(1), - geometry_(plane), - pixelSpacingX_(pixelSpacingX), - pixelSpacingY_(pixelSpacingY), - thickness_(thickness), - width_(width), - height_(height), - converter_(converter) - { - } - - bool IsValid() const - { - return type_ != Type_Invalid; - } - - bool ParseOrthancFrame(const Orthanc::DicomMap& dataset, - const std::string& instanceId, - unsigned int frame); - - bool HasOrthancDecoding() const - { - return type_ == Type_OrthancDecodableFrame; - } - - const std::string GetOrthancInstanceId() const; - - unsigned int GetFrame() const; - - const OrthancStone::CoordinateSystem3D& GetGeometry() const; - - double GetThickness() const; - - double GetPixelSpacingX() const; - - double GetPixelSpacingY() const; - - unsigned int GetWidth() const; - - unsigned int GetHeight() const; - - const DicomFrameConverter& GetConverter() const; - - bool ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const; - - void GetExtent(std::vector& points) const; - - const Orthanc::DicomImageInformation& GetImageInformation() const; - - Slice* Clone() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ViewportGeometry.cpp --- a/Framework/Deprecated/Toolbox/ViewportGeometry.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ViewportGeometry.h" - -#include -#include - -#include - -namespace Deprecated -{ - void ViewportGeometry::ComputeTransform() - { - // The following lines must be read in reverse order! - cairo_matrix_t tmp; - - // Bring the center of the scene to the center of the view - cairo_matrix_init_translate(&transform_, - panX_ + static_cast(width_) / 2.0, - panY_ + static_cast(height_) / 2.0); - - // Apply the zoom around (0,0) - cairo_matrix_init_scale(&tmp, zoom_, zoom_); - cairo_matrix_multiply(&transform_, &tmp, &transform_); - - // Bring the center of the scene to (0,0) - cairo_matrix_init_translate(&tmp, - -(sceneExtent_.GetX1() + sceneExtent_.GetX2()) / 2.0, - -(sceneExtent_.GetY1() + sceneExtent_.GetY2()) / 2.0); - cairo_matrix_multiply(&transform_, &tmp, &transform_); - } - - - ViewportGeometry::ViewportGeometry() - { - width_ = 0; - height_ = 0; - - zoom_ = 1; - panX_ = 0; - panY_ = 0; - - ComputeTransform(); - } - - - void ViewportGeometry::SetDisplaySize(unsigned int width, - unsigned int height) - { - if (width_ != width || - height_ != height) - { - LOG(INFO) << "New display size: " << width << "x" << height; - - width_ = width; - height_ = height; - - ComputeTransform(); - } - } - - - void ViewportGeometry::SetSceneExtent(const OrthancStone::Extent2D& extent) - { -// LOG(INFO) << "New scene extent: (" -// << extent.GetX1() << "," << extent.GetY1() << ") => (" -// << extent.GetX2() << "," << extent.GetY2() << ")"; - - sceneExtent_ = extent; - ComputeTransform(); - } - - - void ViewportGeometry::MapDisplayToScene(double& sceneX /* out */, - double& sceneY /* out */, - double x, - double y) const - { - cairo_matrix_t transform = transform_; - - if (cairo_matrix_invert(&transform) != CAIRO_STATUS_SUCCESS) - { - LOG(ERROR) << "Cannot invert singular matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - sceneX = x; - sceneY = y; - cairo_matrix_transform_point(&transform, &sceneX, &sceneY); - } - - - void ViewportGeometry::MapSceneToDisplay(int& displayX /* out */, - int& displayY /* out */, - double x, - double y) const - { - cairo_matrix_transform_point(&transform_, &x, &y); - - displayX = static_cast(boost::math::iround(x)); - displayY = static_cast(boost::math::iround(y)); - } - - - void ViewportGeometry::MapPixelCenterToScene(std::vector& sceneTouches /* out */, - const std::vector& displayTouches) const - { - double sceneX, sceneY; - sceneTouches.clear(); - for (size_t t = 0; t < displayTouches.size(); t++) - { - MapPixelCenterToScene( - sceneX, - sceneY, - static_cast(displayTouches[t].x), - static_cast(displayTouches[t].y)); - - sceneTouches.push_back(Touch((float)sceneX, (float)sceneY)); - } - } - - void ViewportGeometry::MapPixelCenterToScene(double& sceneX, - double& sceneY, - int x, - int y) const - { - // Take the center of the pixel - MapDisplayToScene(sceneX, sceneY, - static_cast(x) + 0.5, - static_cast(y) + 0.5); - } - - - void ViewportGeometry::FitContent() - { - if (width_ > 0 && - height_ > 0 && - !sceneExtent_.IsEmpty()) - { - double zoomX = static_cast(width_) / (sceneExtent_.GetX2() - sceneExtent_.GetX1()); - double zoomY = static_cast(height_) / (sceneExtent_.GetY2() - sceneExtent_.GetY1()); - zoom_ = zoomX < zoomY ? zoomX : zoomY; - - panX_ = 0; - panY_ = 0; - - ComputeTransform(); - } - } - - - void ViewportGeometry::ApplyTransform(OrthancStone::CairoContext& context) const - { - cairo_set_matrix(context.GetObject(), &transform_); - } - - - void ViewportGeometry::GetPan(double& x, - double& y) const - { - x = panX_; - y = panY_; - } - - - void ViewportGeometry::SetPan(double x, - double y) - { - panX_ = x; - panY_ = y; - ComputeTransform(); - } - - - void ViewportGeometry::SetZoom(double zoom) - { - zoom_ = zoom; - ComputeTransform(); - } - - - OrthancStone::Matrix ViewportGeometry::GetMatrix() const - { - OrthancStone::Matrix m(3, 3); - - m(0, 0) = transform_.xx; - m(0, 1) = transform_.xy; - m(0, 2) = transform_.x0; - m(1, 0) = transform_.yx; - m(1, 1) = transform_.yy; - m(1, 2) = transform_.y0; - m(2, 0) = 0; - m(2, 1) = 0; - m(2, 2) = 1; - - return m; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Toolbox/ViewportGeometry.h --- a/Framework/Deprecated/Toolbox/ViewportGeometry.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoContext.h" -#include "../../Toolbox/Extent2D.h" -#include "../../Toolbox/LinearAlgebra.h" -#include "../Viewport/IMouseTracker.h" // to include "Touch" definition - -namespace Deprecated -{ - class ViewportGeometry - { - private: - // Extent of the scene (in world units) - OrthancStone::Extent2D sceneExtent_; - - // Size of the display (in pixels) - unsigned int width_; - unsigned int height_; - - // Zoom/pan - double zoom_; - double panX_; // In pixels (display units) - double panY_; - - cairo_matrix_t transform_; // Scene-to-display transformation - - void ComputeTransform(); - - public: - ViewportGeometry(); - - void SetDisplaySize(unsigned int width, - unsigned int height); - - void SetSceneExtent(const OrthancStone::Extent2D& extent); - - const OrthancStone::Extent2D& GetSceneExtent() const - { - return sceneExtent_; - } - - void MapDisplayToScene(double& sceneX /* out */, - double& sceneY /* out */, - double x, - double y) const; - - void MapPixelCenterToScene(double& sceneX /* out */, - double& sceneY /* out */, - int x, - int y) const; - - void MapPixelCenterToScene(std::vector& sceneTouches /* out */, - const std::vector& displayTouches) const; - - void MapSceneToDisplay(int& displayX /* out */, - int& displayY /* out */, - double x, - double y) const; - - unsigned int GetDisplayWidth() const - { - return width_; - } - - unsigned int GetDisplayHeight() const - { - return height_; - } - - double GetZoom() const - { - return zoom_; - } - - void FitContent(); - - void ApplyTransform(OrthancStone::CairoContext& context) const; - - void GetPan(double& x, - double& y) const; - - void SetPan(double x, - double y); - - void SetZoom(double zoom); - - OrthancStone::Matrix GetMatrix() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/CairoFont.cpp --- a/Framework/Deprecated/Viewport/CairoFont.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoFont.h" - -#include -#include - -namespace Deprecated -{ - CairoFont::CairoFont(const char* family, - cairo_font_slant_t slant, - cairo_font_weight_t weight) - { - font_ = cairo_toy_font_face_create(family, slant, weight); - if (font_ == NULL) - { - LOG(ERROR) << "Unknown font: " << family; - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - } - - - CairoFont::~CairoFont() - { - if (font_ != NULL) - { - cairo_font_face_destroy(font_); - } - } - - - void CairoFont::Draw(OrthancStone::CairoContext& context, - const std::string& text, - double size) - { - if (size <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - cairo_t* cr = context.GetObject(); - cairo_set_font_face(cr, font_); - cairo_set_font_size(cr, size); - cairo_show_text(cr, text.c_str()); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/CairoFont.h --- a/Framework/Deprecated/Viewport/CairoFont.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if !defined(ORTHANC_SANDBOXED) -# error The macro ORTHANC_SANDBOXED must be defined -#endif - -#if ORTHANC_SANDBOXED == 1 -# error The class CairoFont cannot be used in sandboxed environments -#endif - -#include "../../Wrappers/CairoContext.h" - -namespace Deprecated -{ - class CairoFont : public boost::noncopyable - { - private: - cairo_font_face_t* font_; - - public: - CairoFont(const char* family, - cairo_font_slant_t slant, - cairo_font_weight_t weight); - - ~CairoFont(); - - void Draw(OrthancStone::CairoContext& context, - const std::string& text, - double size); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/IMouseTracker.h --- a/Framework/Deprecated/Viewport/IMouseTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoSurface.h" -#include - -namespace Deprecated -{ - struct Touch - { - float x; - float y; - - Touch(float x, float y) - : x(x), - y(y) - { - } - Touch() - : x(0.0f), - y(0.0f) - { - } - }; - - - // this is tracking a mouse in screen coordinates/pixels unlike - // the IWorldSceneMouseTracker that is tracking a mouse - // in scene coordinates/mm. - class IMouseTracker : public boost::noncopyable - { - public: - virtual ~IMouseTracker() - { - } - - virtual void Render(Orthanc::ImageAccessor& surface) = 0; - - virtual void MouseUp() = 0; - - // Returns "true" iff. the background scene must be repainted - virtual void MouseMove(int x, - int y, - const std::vector& displayTouches) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/IStatusBar.h --- a/Framework/Deprecated/Viewport/IStatusBar.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace Deprecated -{ - class IStatusBar : public boost::noncopyable - { - public: - virtual ~IStatusBar() - { - } - - virtual void ClearMessage() = 0; - - virtual void SetMessage(const std::string& message) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/IViewport.h --- a/Framework/Deprecated/Viewport/IViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IStatusBar.h" -#include "../../StoneEnumerations.h" -#include "../../Messages/IObservable.h" -#include "../Viewport/IMouseTracker.h" // only to get the "Touch" definition - -#include - - -namespace Deprecated -{ - class IWidget; // Forward declaration - - class IViewport : public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ViewportChangedMessage, IViewport); - - virtual void FitContent() = 0; - - virtual void SetStatusBar(IStatusBar& statusBar) = 0; - - virtual void SetSize(unsigned int width, - unsigned int height) = 0; - - // The function returns "true" iff. a new frame was rendered - virtual bool Render(Orthanc::ImageAccessor& surface) = 0; - - virtual void MouseDown(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) = 0; - - virtual void MouseUp() = 0; - - virtual void MouseMove(int x, - int y, - const std::vector& displayTouches) = 0; - - virtual void MouseEnter() = 0; - - virtual void MouseLeave() = 0; - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) = 0; - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) = 0; - - virtual bool HasAnimation() = 0; - - virtual void DoAnimation() = 0; - - // Should only be called from IWidget - // TODO Why should this be virtual? - virtual void NotifyContentChanged() - { - BroadcastMessage(ViewportChangedMessage(*this)); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/WidgetViewport.cpp --- a/Framework/Deprecated/Viewport/WidgetViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WidgetViewport.h" - -#include -#include - -namespace Deprecated -{ - WidgetViewport::WidgetViewport() : - statusBar_(NULL), - isMouseOver_(false), - lastMouseX_(0), - lastMouseY_(0), - backgroundChanged_(false) - { - } - - - void WidgetViewport::FitContent() - { - if (centralWidget_.get() != NULL) - { - centralWidget_->FitContent(); - } - } - - - void WidgetViewport::SetStatusBar(IStatusBar& statusBar) - { - statusBar_ = &statusBar; - - if (centralWidget_.get() != NULL) - { - centralWidget_->SetStatusBar(statusBar); - } - } - - - void WidgetViewport::SetCentralWidget(boost::shared_ptr widget) - { - if (widget == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - mouseTracker_.reset(NULL); - - centralWidget_ = widget; - centralWidget_->SetViewport(*this); - - if (statusBar_ != NULL) - { - centralWidget_->SetStatusBar(*statusBar_); - } - - NotifyBackgroundChanged(); - } - - - void WidgetViewport::NotifyBackgroundChanged() - { - backgroundChanged_ = true; - NotifyContentChanged(); - } - - - void WidgetViewport::SetSize(unsigned int width, - unsigned int height) - { - background_.SetSize(width, height, false /* no alpha */); - - if (centralWidget_.get() != NULL) - { - centralWidget_->SetSize(width, height); - } - - NotifyBackgroundChanged(); - } - - - bool WidgetViewport::Render(Orthanc::ImageAccessor& surface) - { - if (centralWidget_.get() == NULL) - { - return false; - } - - Orthanc::ImageAccessor background; - background_.GetWriteableAccessor(background); - - if (backgroundChanged_ && - !centralWidget_->Render(background)) - { - return false; - } - - if (background.GetWidth() != surface.GetWidth() || - background.GetHeight() != surface.GetHeight()) - { - return false; - } - - Orthanc::ImageProcessing::Convert(surface, background); - - if (mouseTracker_.get() != NULL) - { - mouseTracker_->Render(surface); - } - else if (isMouseOver_) - { - centralWidget_->RenderMouseOver(surface, lastMouseX_, lastMouseY_); - } - - return true; - } - - void WidgetViewport::TouchStart(const std::vector& displayTouches) - { - MouseDown(OrthancStone::MouseButton_Left, (int)displayTouches[0].x, (int)displayTouches[0].y, OrthancStone::KeyboardModifiers_None, displayTouches); // one touch is equivalent to a mouse tracker without left button -> set the mouse coordinates to the first touch coordinates - } - - void WidgetViewport::TouchMove(const std::vector& displayTouches) - { - MouseMove((int)displayTouches[0].x, (int)displayTouches[0].y, displayTouches); // one touch is equivalent to a mouse tracker without left button -> set the mouse coordinates to the first touch coordinates - } - - void WidgetViewport::TouchEnd(const std::vector& displayTouches) - { - // note: TouchEnd is not triggered when a single touch gesture ends (it is only triggered when - // going from 2 touches to 1 touch, ...) - MouseUp(); - } - - void WidgetViewport::MouseDown(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& displayTouches - ) - { - lastMouseX_ = x; - lastMouseY_ = y; - - if (centralWidget_.get() != NULL) - { - mouseTracker_.reset(centralWidget_->CreateMouseTracker(button, x, y, modifiers, displayTouches)); - } - else - { - mouseTracker_.reset(NULL); - } - - NotifyContentChanged(); - } - - - void WidgetViewport::MouseUp() - { - if (mouseTracker_.get() != NULL) - { - mouseTracker_->MouseUp(); - mouseTracker_.reset(NULL); - NotifyContentChanged(); - } - } - - - void WidgetViewport::MouseMove(int x, - int y, - const std::vector& displayTouches) - { - if (centralWidget_.get() == NULL) - { - return; - } - - lastMouseX_ = x; - lastMouseY_ = y; - - bool repaint = false; - - if (mouseTracker_.get() != NULL) - { - mouseTracker_->MouseMove(x, y, displayTouches); - repaint = true; - } - else - { - repaint = centralWidget_->HasRenderMouseOver(); - } - - if (repaint) - { - // The scene must be repainted, notify the observers - NotifyContentChanged(); - } - } - - - void WidgetViewport::MouseEnter() - { - isMouseOver_ = true; - NotifyContentChanged(); - } - - - void WidgetViewport::MouseLeave() - { - isMouseOver_ = false; - - if (mouseTracker_.get() != NULL) - { - mouseTracker_->MouseUp(); - mouseTracker_.reset(NULL); - } - - NotifyContentChanged(); - } - - - void WidgetViewport::MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - if (centralWidget_.get() != NULL && - mouseTracker_.get() == NULL) - { - centralWidget_->MouseWheel(direction, x, y, modifiers); - } - } - - - void WidgetViewport::KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) - { - if (centralWidget_.get() != NULL && - mouseTracker_.get() == NULL) - { - centralWidget_->KeyPressed(key, keyChar, modifiers); - } - } - - - bool WidgetViewport::HasAnimation() - { - if (centralWidget_.get() != NULL) - { - return centralWidget_->HasAnimation(); - } - else - { - return false; - } - } - - - void WidgetViewport::DoAnimation() - { - if (centralWidget_.get() != NULL) - { - centralWidget_->DoAnimation(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Viewport/WidgetViewport.h --- a/Framework/Deprecated/Viewport/WidgetViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IViewport.h" -#include "../Widgets/IWidget.h" - -#include - -#include - -namespace Deprecated -{ - class WidgetViewport : public IViewport - { - private: - boost::shared_ptr centralWidget_; - IStatusBar* statusBar_; - std::unique_ptr mouseTracker_; - bool isMouseOver_; - int lastMouseX_; - int lastMouseY_; - OrthancStone::CairoSurface background_; - bool backgroundChanged_; - - public: - WidgetViewport(); - - virtual void FitContent(); - - virtual void SetStatusBar(IStatusBar& statusBar); - - void SetCentralWidget(boost::shared_ptr widget); - - virtual void NotifyBackgroundChanged(); - - virtual void SetSize(unsigned int width, - unsigned int height); - - virtual bool Render(Orthanc::ImageAccessor& surface); - - virtual void MouseDown(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& displayTouches); - - virtual void MouseUp(); - - virtual void MouseMove(int x, - int y, - const std::vector& displayTouches); - - virtual void MouseEnter(); - - virtual void MouseLeave(); - - virtual void TouchStart(const std::vector& touches); - - virtual void TouchMove(const std::vector& touches); - - virtual void TouchEnd(const std::vector& touches); - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers); - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers); - - virtual bool HasAnimation(); - - virtual void DoAnimation(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Volumes/ISlicedVolume.h --- a/Framework/Deprecated/Volumes/ISlicedVolume.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Messages/IObservable.h" -#include "../Toolbox/Slice.h" - -namespace Deprecated -{ - class ISlicedVolume : public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, ISlicedVolume); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, ISlicedVolume); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, ISlicedVolume); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeReadyMessage, ISlicedVolume); - - - class SliceContentChangedMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - size_t sliceIndex_; - const Slice& slice_; - - public: - SliceContentChangedMessage(ISlicedVolume& origin, - size_t sliceIndex, - const Slice& slice) : - OriginMessage(origin), - sliceIndex_(sliceIndex), - slice_(slice) - { - } - - size_t GetSliceIndex() const - { - return sliceIndex_; - } - - const Slice& GetSlice() const - { - return slice_; - } - }; - - - virtual size_t GetSliceCount() const = 0; - - virtual const Slice& GetSlice(size_t slice) const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Volumes/IVolumeLoader.h --- a/Framework/Deprecated/Volumes/IVolumeLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Messages/IObservable.h" - -namespace Deprecated -{ - class IVolumeLoader : public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, IVolumeLoader); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, IVolumeLoader); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, IVolumeLoader); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Volumes/StructureSetLoader.cpp --- a/Framework/Deprecated/Volumes/StructureSetLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "StructureSetLoader.h" - -#include "../Toolbox/MessagingToolbox.h" - -#include - -namespace Deprecated -{ - StructureSetLoader::StructureSetLoader(OrthancApiClient& orthanc) : - orthanc_(orthanc) - { - } - - - void StructureSetLoader::OnReferencedSliceLoaded(const OrthancApiClient::JsonResponseReadyMessage& message) - { - OrthancPlugins::FullOrthancDataset dataset(message.GetJson()); - - Orthanc::DicomMap slice; - MessagingToolbox::ConvertDataset(slice, dataset); - structureSet_->AddReferencedSlice(slice); - - BroadcastMessage(ContentChangedMessage(*this)); - } - - - void StructureSetLoader::OnStructureSetLoaded(const OrthancApiClient::JsonResponseReadyMessage& message) - { - OrthancPlugins::FullOrthancDataset dataset(message.GetJson()); - structureSet_.reset(new OrthancStone::DicomStructureSet(dataset)); - - std::set instances; - structureSet_->GetReferencedInstances(instances); - - for (std::set::const_iterator it = instances.begin(); - it != instances.end(); ++it) - { - orthanc_.PostBinaryAsyncExpectJson("/tools/lookup", *it, - new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnLookupCompleted)); - } - - BroadcastMessage(GeometryReadyMessage(*this)); - } - - - void StructureSetLoader::OnLookupCompleted(const OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& lookup = message.GetJson(); - - if (lookup.type() != Json::arrayValue || - lookup.size() != 1 || - !lookup[0].isMember("Type") || - !lookup[0].isMember("Path") || - lookup[0]["Type"].type() != Json::stringValue || - lookup[0]["ID"].type() != Json::stringValue || - lookup[0]["Type"].asString() != "Instance") - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - const std::string& instance = lookup[0]["ID"].asString(); - orthanc_.GetJsonAsync("/instances/" + instance + "/tags", - new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnReferencedSliceLoaded)); - } - - - void StructureSetLoader::ScheduleLoadInstance(const std::string& instance) - { - if (structureSet_.get() != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - orthanc_.GetJsonAsync("/instances/" + instance + "/tags?ignore-length=3006-0050", - new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnStructureSetLoaded)); - } - } - - - OrthancStone::DicomStructureSet& StructureSetLoader::GetStructureSet() - { - if (structureSet_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *structureSet_; - } - } - - - OrthancStone::DicomStructureSet* StructureSetLoader::SynchronousLoad( - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId) - { - const std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; - OrthancPlugins::FullOrthancDataset dataset(orthanc, uri); - - std::unique_ptr result - (new OrthancStone::DicomStructureSet(dataset)); - - std::set instances; - result->GetReferencedInstances(instances); - - for (std::set::const_iterator it = instances.begin(); - it != instances.end(); ++it) - { - Json::Value lookup; - MessagingToolbox::RestApiPost(lookup, orthanc, "/tools/lookup", *it); - - if (lookup.type() != Json::arrayValue || - lookup.size() != 1 || - !lookup[0].isMember("Type") || - !lookup[0].isMember("Path") || - lookup[0]["Type"].type() != Json::stringValue || - lookup[0]["ID"].type() != Json::stringValue || - lookup[0]["Type"].asString() != "Instance") - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - - OrthancPlugins::FullOrthancDataset slice - (orthanc, "/instances/" + lookup[0]["ID"].asString() + "/tags"); - Orthanc::DicomMap m; - MessagingToolbox::ConvertDataset(m, slice); - result->AddReferencedSlice(m); - } - - result->CheckReferencedSlices(); - - return result.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Volumes/StructureSetLoader.h --- a/Framework/Deprecated/Volumes/StructureSetLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Messages/ObserverBase.h" -#include "../../Toolbox/DicomStructureSet.h" -#include "../Toolbox/OrthancApiClient.h" -#include "IVolumeLoader.h" - -#include - -namespace Deprecated -{ - class StructureSetLoader : - public IVolumeLoader, - public OrthancStone::ObserverBase - { - private: - OrthancApiClient& orthanc_; - std::unique_ptr structureSet_; - - void OnReferencedSliceLoaded(const OrthancApiClient::JsonResponseReadyMessage& message); - - void OnStructureSetLoaded(const OrthancApiClient::JsonResponseReadyMessage& message); - - void OnLookupCompleted(const OrthancApiClient::JsonResponseReadyMessage& message); - - public: - StructureSetLoader(OrthancApiClient& orthanc); - - void ScheduleLoadInstance(const std::string& instance); - - bool HasStructureSet() const - { - return structureSet_.get() != NULL; - } - - OrthancStone::DicomStructureSet& GetStructureSet(); - - static OrthancStone::DicomStructureSet* SynchronousLoad( - OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/CairoWidget.cpp --- a/Framework/Deprecated/Widgets/CairoWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoWidget.h" - -#include -#include - -namespace Deprecated -{ - static bool IsAligned(const Orthanc::ImageAccessor& target) - { - // TODO - return true; - } - - CairoWidget::CairoWidget(const std::string& name) : - WidgetBase(name) - { - } - - void CairoWidget::SetSize(unsigned int width, - unsigned int height) - { - surface_.SetSize(width, height, false /* no alpha */); - } - - - bool CairoWidget::Render(Orthanc::ImageAccessor& target) - { - // Don't call the base class here, as - // "ClearBackgroundCairo()" is a faster alternative - - if (IsAligned(target)) - { - OrthancStone::CairoSurface surface(target, false /* no alpha */); - OrthancStone::CairoContext context(surface); - ClearBackgroundCairo(context); - return RenderCairo(context); - } - else - { - OrthancStone::CairoContext context(surface_); - ClearBackgroundCairo(context); - - if (RenderCairo(context)) - { - Orthanc::ImageAccessor surface; - surface_.GetReadOnlyAccessor(surface); - Orthanc::ImageProcessing::Copy(target, surface); - return true; - } - else - { - return false; - } - } - } - - - void CairoWidget::RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y) - { - if (IsAligned(target)) - { - OrthancStone::CairoSurface surface(target, false /* no alpha */); - OrthancStone::CairoContext context(surface); - RenderMouseOverCairo(context, x, y); - } - else - { - Orthanc::ImageAccessor accessor; - surface_.GetWriteableAccessor(accessor); - Orthanc::ImageProcessing::Copy(accessor, target); - - OrthancStone::CairoContext context(surface_); - RenderMouseOverCairo(context, x, y); - - Orthanc::ImageProcessing::Copy(target, accessor); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/CairoWidget.h --- a/Framework/Deprecated/Widgets/CairoWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WidgetBase.h" - -namespace Deprecated -{ - class CairoWidget : public WidgetBase - { - private: - OrthancStone::CairoSurface surface_; - - protected: - virtual bool RenderCairo(OrthancStone::CairoContext& context) = 0; - - virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, - int x, - int y) = 0; - - public: - CairoWidget(const std::string& name); - - virtual void SetSize(unsigned int width, - unsigned int height); - - virtual bool Render(Orthanc::ImageAccessor& target); - - virtual void RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/EmptyWidget.cpp --- a/Framework/Deprecated/Widgets/EmptyWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "EmptyWidget.h" - -#include -#include - -namespace Deprecated -{ - bool EmptyWidget::Render(Orthanc::ImageAccessor& surface) - { - // Note: This call is slow - Orthanc::ImageProcessing::Set(surface, red_, green_, blue_, 255); - return true; - } - - - void EmptyWidget::DoAnimation() - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/EmptyWidget.h --- a/Framework/Deprecated/Widgets/EmptyWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IWidget.h" - -namespace Deprecated -{ - /** - * This is a test widget that simply fills its surface with an - * uniform color. - **/ - class EmptyWidget : public IWidget - { - private: - uint8_t red_; - uint8_t green_; - uint8_t blue_; - - public: - EmptyWidget(uint8_t red, - uint8_t green, - uint8_t blue) : - red_(red), - green_(green), - blue_(blue) - { - } - - virtual void FitContent() - { - } - - virtual void SetParent(IWidget& widget) - { - } - - virtual void SetViewport(WidgetViewport& viewport) - { - } - - virtual void NotifyContentChanged() - { - } - - virtual void SetStatusBar(IStatusBar& statusBar) - { - } - - virtual void SetSize(unsigned int width, - unsigned int height) - { - } - - virtual bool Render(Orthanc::ImageAccessor& surface); - - virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) - { - return NULL; - } - - virtual void RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y) - { - } - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - } - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) - { - } - - virtual bool HasAnimation() const - { - return false; - } - - virtual void DoAnimation(); - - virtual bool HasRenderMouseOver() - { - return false; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/IWidget.h --- a/Framework/Deprecated/Widgets/IWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../StoneEnumerations.h" -#include "../Viewport/IMouseTracker.h" -#include "../Viewport/IStatusBar.h" - -namespace Deprecated -{ - class WidgetViewport; // Forward declaration - - class IWidget : public boost::noncopyable - { - public: - virtual ~IWidget() - { - } - - virtual void FitContent() = 0; - - virtual void SetParent(IWidget& parent) = 0; - - virtual void SetViewport(WidgetViewport& viewport) = 0; - - virtual void SetStatusBar(IStatusBar& statusBar) = 0; - - virtual void SetSize(unsigned int width, - unsigned int height) = 0; - - virtual bool Render(Orthanc::ImageAccessor& surface) = 0; - - virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) = 0; - - virtual void RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y) = 0; - - virtual bool HasRenderMouseOver() = 0; - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) = 0; - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) = 0; - - virtual bool HasAnimation() const = 0; - - virtual void DoAnimation() = 0; - - // Subclasses can call this method to signal the display of the - // widget must be refreshed - virtual void NotifyContentChanged() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/IWorldSceneInteractor.h --- a/Framework/Deprecated/Widgets/IWorldSceneInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IWorldSceneMouseTracker.h" - -#include "../Toolbox/ViewportGeometry.h" -#include "../../StoneEnumerations.h" -#include "../Viewport/IStatusBar.h" - -namespace Deprecated -{ - class WorldSceneWidget; - - class IWorldSceneInteractor : public boost::noncopyable - { - public: - virtual ~IWorldSceneInteractor() - { - } - - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const ViewportGeometry& view, - OrthancStone::MouseButton button, - OrthancStone::KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - IStatusBar* statusBar, - const std::vector& touches) = 0; - - virtual void MouseOver(OrthancStone::CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) = 0; - - virtual void MouseWheel(WorldSceneWidget& widget, - OrthancStone::MouseWheelDirection direction, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) = 0; - - virtual void KeyPressed(WorldSceneWidget& widget, - OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/IWorldSceneMouseTracker.h --- a/Framework/Deprecated/Widgets/IWorldSceneMouseTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoContext.h" -#include "../Viewport/IMouseTracker.h" // only to get the "Touch" definition - -namespace Deprecated -{ - - // this is tracking a mouse in scene coordinates/mm unlike - // the IMouseTracker that is tracking a mouse - // in screen coordinates/pixels. - class IWorldSceneMouseTracker : public boost::noncopyable - { - public: - virtual ~IWorldSceneMouseTracker() - { - } - - virtual bool HasRender() const = 0; - - virtual void Render(OrthancStone::CairoContext& context, - double zoom) = 0; - - virtual void MouseUp() = 0; - - virtual void MouseMove(int displayX, - int displayY, - double sceneX, - double sceneY, - const std::vector& displayTouches, - const std::vector& sceneTouches) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/LayoutWidget.cpp --- a/Framework/Deprecated/Widgets/LayoutWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,501 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LayoutWidget.h" - -#include -#include - -#include - -namespace Deprecated -{ - class LayoutWidget::LayoutMouseTracker : public IMouseTracker - { - private: - std::unique_ptr tracker_; - int left_; - int top_; - unsigned int width_; - unsigned int height_; - - public: - LayoutMouseTracker(IMouseTracker* tracker, - int left, - int top, - unsigned int width, - unsigned int height) : - tracker_(tracker), - left_(left), - top_(top), - width_(width), - height_(height) - { - if (tracker == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - virtual void Render(Orthanc::ImageAccessor& surface) - { - Orthanc::ImageAccessor accessor; - surface.GetRegion(accessor, left_, top_, width_, height_); - tracker_->Render(accessor); - } - - virtual void MouseUp() - { - tracker_->MouseUp(); - } - - virtual void MouseMove(int x, - int y, - const std::vector& displayTouches) - { - std::vector relativeTouches; - for (size_t t = 0; t < displayTouches.size(); t++) - { - relativeTouches.push_back(Touch(displayTouches[t].x - left_, displayTouches[t].y - top_)); - } - - tracker_->MouseMove(x - left_, y - top_, relativeTouches); - } - }; - - - class LayoutWidget::ChildWidget : public boost::noncopyable - { - private: - boost::shared_ptr widget_; - int left_; - int top_; - unsigned int width_; - unsigned int height_; - - public: - ChildWidget(boost::shared_ptr widget) : - widget_(widget) - { - assert(widget != NULL); - SetEmpty(); - } - - void DoAnimation() - { - if (widget_->HasAnimation()) - { - widget_->DoAnimation(); - } - } - - IWidget& GetWidget() const - { - return *widget_; - } - - void SetRectangle(unsigned int left, - unsigned int top, - unsigned int width, - unsigned int height) - { - left_ = left; - top_ = top; - width_ = width; - height_ = height; - - widget_->SetSize(width, height); - } - - void SetEmpty() - { - SetRectangle(0, 0, 0, 0); - } - - bool Contains(int x, - int y) const - { - return (x >= left_ && - y >= top_ && - x < left_ + static_cast(width_) && - y < top_ + static_cast(height_)); - } - - bool Render(Orthanc::ImageAccessor& target) - { - if (width_ == 0 || - height_ == 0) - { - return true; - } - else - { - Orthanc::ImageAccessor accessor; - target.GetRegion(accessor, left_, top_, width_, height_); - return widget_->Render(accessor); - } - } - - IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) - { - if (Contains(x, y)) - { - IMouseTracker* tracker = widget_->CreateMouseTracker(button, - x - left_, - y - top_, - modifiers, - touches); - if (tracker) - { - return new LayoutMouseTracker(tracker, left_, top_, width_, height_); - } - } - - return NULL; - } - - void RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y) - { - if (Contains(x, y)) - { - Orthanc::ImageAccessor accessor; - target.GetRegion(accessor, left_, top_, width_, height_); - - widget_->RenderMouseOver(accessor, x - left_, y - top_); - } - } - - void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - if (Contains(x, y)) - { - widget_->MouseWheel(direction, x - left_, y - top_, modifiers); - } - } - - bool HasRenderMouseOver() - { - return widget_->HasRenderMouseOver(); - } - }; - - - void LayoutWidget::ComputeChildrenExtents() - { - if (children_.size() == 0) - { - return; - } - - float internal = static_cast(paddingInternal_); - - if (width_ <= paddingLeft_ + paddingRight_ || - height_ <= paddingTop_ + paddingBottom_) - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->SetEmpty(); - } - } - else if (isHorizontal_) - { - unsigned int padding = paddingLeft_ + paddingRight_ + (static_cast(children_.size()) - 1) * paddingInternal_; - float childWidth = ((static_cast(width_) - static_cast(padding)) / - static_cast(children_.size())); - - for (size_t i = 0; i < children_.size(); i++) - { - float left = static_cast(paddingLeft_) + static_cast(i) * (childWidth + internal); - float right = left + childWidth; - - if (left >= right) - { - children_[i]->SetEmpty(); - } - else - { - children_[i]->SetRectangle(static_cast(left), - paddingTop_, - boost::math::iround(right - left), - height_ - paddingTop_ - paddingBottom_); - } - } - } - else - { - unsigned int padding = paddingTop_ + paddingBottom_ + (static_cast(children_.size()) - 1) * paddingInternal_; - float childHeight = ((static_cast(height_) - static_cast(padding)) / - static_cast(children_.size())); - - for (size_t i = 0; i < children_.size(); i++) - { - float top = static_cast(paddingTop_) + static_cast(i) * (childHeight + internal); - float bottom = top + childHeight; - - if (top >= bottom) - { - children_[i]->SetEmpty(); - } - else - { - children_[i]->SetRectangle(paddingTop_, - static_cast(top), - width_ - paddingLeft_ - paddingRight_, - boost::math::iround(bottom - top)); - } - } - } - - NotifyContentChanged(*this); - } - - - LayoutWidget::LayoutWidget(const std::string& name) : - WidgetBase(name), - isHorizontal_(true), - width_(0), - height_(0), - paddingLeft_(0), - paddingTop_(0), - paddingRight_(0), - paddingBottom_(0), - paddingInternal_(0) - { - } - - - LayoutWidget::~LayoutWidget() - { - for (size_t i = 0; i < children_.size(); i++) - { - delete children_[i]; - } - } - - - void LayoutWidget::FitContent() - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->GetWidget().FitContent(); - } - } - - - void LayoutWidget::NotifyContentChanged(const IWidget& widget) - { - // One of the children has changed - WidgetBase::NotifyContentChanged(); - } - - - void LayoutWidget::SetHorizontal() - { - isHorizontal_ = true; - ComputeChildrenExtents(); - } - - - void LayoutWidget::SetVertical() - { - isHorizontal_ = false; - ComputeChildrenExtents(); - } - - - void LayoutWidget::SetPadding(unsigned int left, - unsigned int top, - unsigned int right, - unsigned int bottom, - unsigned int spacing) - { - paddingLeft_ = left; - paddingTop_ = top; - paddingRight_ = right; - paddingBottom_ = bottom; - paddingInternal_ = spacing; - } - - - void LayoutWidget::SetPadding(unsigned int padding) - { - paddingLeft_ = padding; - paddingTop_ = padding; - paddingRight_ = padding; - paddingBottom_ = padding; - paddingInternal_ = padding; - } - - - void LayoutWidget::AddWidget(boost::shared_ptr widget) // Takes ownership - { - if (widget == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (GetStatusBar() != NULL) - { - widget->SetStatusBar(*GetStatusBar()); - } - - children_.push_back(new ChildWidget(widget)); - widget->SetParent(*this); - - ComputeChildrenExtents(); - - if (widget->HasAnimation()) - { - hasAnimation_ = true; - } - } - - - void LayoutWidget::SetStatusBar(IStatusBar& statusBar) - { - WidgetBase::SetStatusBar(statusBar); - - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->GetWidget().SetStatusBar(statusBar); - } - } - - - void LayoutWidget::SetSize(unsigned int width, - unsigned int height) - { - width_ = width; - height_ = height; - ComputeChildrenExtents(); - } - - - bool LayoutWidget::Render(Orthanc::ImageAccessor& surface) - { - if (!WidgetBase::Render(surface)) - { - return false; - } - - for (size_t i = 0; i < children_.size(); i++) - { - if (!children_[i]->Render(surface)) - { - return false; - } - } - - return true; - } - - - IMouseTracker* LayoutWidget::CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) - { - for (size_t i = 0; i < children_.size(); i++) - { - IMouseTracker* tracker = children_[i]->CreateMouseTracker(button, x, y, modifiers, touches); - if (tracker != NULL) - { - return tracker; - } - } - - return NULL; - } - - - void LayoutWidget::RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y) - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->RenderMouseOver(target, x, y); - } - } - - - void LayoutWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->MouseWheel(direction, x, y, modifiers); - } - } - - - void LayoutWidget::KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->GetWidget().KeyPressed(key, keyChar, modifiers); - } - } - - - void LayoutWidget::DoAnimation() - { - if (hasAnimation_) - { - for (size_t i = 0; i < children_.size(); i++) - { - children_[i]->DoAnimation(); - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - bool LayoutWidget::HasRenderMouseOver() - { - for (size_t i = 0; i < children_.size(); i++) - { - if (children_[i]->HasRenderMouseOver()) - { - return true; - } - } - - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/LayoutWidget.h --- a/Framework/Deprecated/Widgets/LayoutWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WidgetBase.h" - -#include -#include - -namespace Deprecated -{ - class LayoutWidget : public WidgetBase - { - private: - class LayoutMouseTracker; - class ChildWidget; - - std::vector children_; - bool isHorizontal_; - unsigned int width_; - unsigned int height_; - std::unique_ptr mouseTracker_; - unsigned int paddingLeft_; - unsigned int paddingTop_; - unsigned int paddingRight_; - unsigned int paddingBottom_; - unsigned int paddingInternal_; - bool hasAnimation_; - - void ComputeChildrenExtents(); - - public: - LayoutWidget(const std::string& name); - - virtual ~LayoutWidget(); - - virtual void FitContent(); - - virtual void NotifyContentChanged(const IWidget& widget); - - void SetHorizontal(); - - void SetVertical(); - - void SetPadding(unsigned int left, - unsigned int top, - unsigned int right, - unsigned int bottom, - unsigned int spacing); - - void SetPadding(unsigned int padding); - - unsigned int GetPaddingLeft() const - { - return paddingLeft_; - } - - unsigned int GetPaddingTop() const - { - return paddingTop_; - } - - unsigned int GetPaddingRight() const - { - return paddingRight_; - } - - unsigned int GetPaddingBottom() const - { - return paddingBottom_; - } - - unsigned int GetPaddingInternal() const - { - return paddingInternal_; - } - - void AddWidget(boost::shared_ptr widget); - - virtual void SetStatusBar(IStatusBar& statusBar); - - virtual void SetSize(unsigned int width, - unsigned int height); - - virtual bool Render(Orthanc::ImageAccessor& surface); - - virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches); - - virtual void RenderMouseOver(Orthanc::ImageAccessor& target, - int x, - int y); - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers); - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers); - - virtual bool HasAnimation() const - { - return hasAnimation_; - } - - virtual void DoAnimation(); - - virtual bool HasRenderMouseOver(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/PanMouseTracker.cpp --- a/Framework/Deprecated/Widgets/PanMouseTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "PanMouseTracker.h" - -#include -#include - -namespace Deprecated -{ - PanMouseTracker::PanMouseTracker(WorldSceneWidget& that, - int x, - int y) : - that_(that) - { - that.GetView().GetPan(originalPanX_, originalPanY_); - that.GetView().MapPixelCenterToScene(downX_, downY_, x, y); - } - - - void PanMouseTracker::Render(OrthancStone::CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void PanMouseTracker::MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - ViewportGeometry view = that_.GetView(); - view.SetPan(originalPanX_ + (x - downX_) * view.GetZoom(), - originalPanY_ + (y - downY_) * view.GetZoom()); - that_.SetView(view); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/PanMouseTracker.h --- a/Framework/Deprecated/Widgets/PanMouseTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WorldSceneWidget.h" - -namespace Deprecated -{ - class PanMouseTracker : public IWorldSceneMouseTracker - { - private: - WorldSceneWidget& that_; - double originalPanX_; - double originalPanY_; - double downX_; - double downY_; - - public: - PanMouseTracker(WorldSceneWidget& that, - int x, - int y); - - virtual bool HasRender() const - { - return false; - } - - virtual void MouseUp() - { - } - - virtual void Render(OrthancStone::CairoContext& context, - double zoom); - - virtual void MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/PanZoomMouseTracker.cpp --- a/Framework/Deprecated/Widgets/PanZoomMouseTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "PanZoomMouseTracker.h" - -#include -#include -#include - -namespace Deprecated -{ - Touch GetCenter(const std::vector& touches) - { - return Touch((touches[0].x + touches[1].x) / 2.0f, (touches[0].y + touches[1].y) / 2.0f); - } - - double GetDistance(const std::vector& touches) - { - float dx = touches[0].x - touches[1].x; - float dy = touches[0].y - touches[1].y; - return sqrt((double)(dx * dx) + (double)(dy * dy)); - } - - - PanZoomMouseTracker::PanZoomMouseTracker(WorldSceneWidget& that, - const std::vector& startTouches) - : that_(that), - originalZoom_(that.GetView().GetZoom()) - { - that.GetView().GetPan(originalPanX_, originalPanY_); - that.GetView().MapPixelCenterToScene(originalSceneTouches_, startTouches); - - originalDisplayCenter_ = GetCenter(startTouches); - originalSceneCenter_ = GetCenter(originalSceneTouches_); - originalDisplayDistanceBetweenTouches_ = GetDistance(startTouches); - -// printf("original Pan %f %f\n", originalPanX_, originalPanY_); -// printf("original Zoom %f \n", originalZoom_); -// printf("original distance %f \n", (float)originalDisplayDistanceBetweenTouches_); -// printf("original display touches 0 %f %f\n", startTouches[0].x, startTouches[0].y); -// printf("original display touches 1 %f %f\n", startTouches[1].x, startTouches[1].y); -// printf("original Scene center %f %f\n", originalSceneCenter_.x, originalSceneCenter_.y); - - unsigned int height = that.GetView().GetDisplayHeight(); - - if (height <= 3) - { - idle_ = true; - LOG(WARNING) << "image is too small to zoom (current height = " << height << ")"; - } - else - { - idle_ = false; - normalization_ = 1.0 / static_cast(height - 1); - } - - } - - - void PanZoomMouseTracker::Render(OrthancStone::CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void PanZoomMouseTracker::MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - ViewportGeometry view = that_.GetView(); - -// printf("Display touches 0 %f %f\n", displayTouches[0].x, displayTouches[0].y); -// printf("Display touches 1 %f %f\n", displayTouches[1].x, displayTouches[1].y); -// printf("Scene touches 0 %f %f\n", sceneTouches[0].x, sceneTouches[0].y); -// printf("Scene touches 1 %f %f\n", sceneTouches[1].x, sceneTouches[1].y); - -// printf("zoom = %f\n", view.GetZoom()); - Touch currentSceneCenter = GetCenter(sceneTouches); - double panX = originalPanX_ + (currentSceneCenter.x - originalSceneCenter_.x) * view.GetZoom(); - double panY = originalPanY_ + (currentSceneCenter.y - originalSceneCenter_.y) * view.GetZoom(); - - view.SetPan(panX, panY); - - static const double MIN_ZOOM = -4; - static const double MAX_ZOOM = 4; - - if (!idle_) - { - double currentDistanceBetweenTouches = GetDistance(displayTouches); - - double dy = static_cast(currentDistanceBetweenTouches - originalDisplayDistanceBetweenTouches_) * normalization_; // In the range [-1,1] - double z; - - // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] - if (dy < -1.0) - { - z = MIN_ZOOM; - } - else if (dy > 1.0) - { - z = MAX_ZOOM; - } - else - { - z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; - } - - z = pow(2.0, z); - - view.SetZoom(z * originalZoom_); - } - - that_.SetView(view); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/PanZoomMouseTracker.h --- a/Framework/Deprecated/Widgets/PanZoomMouseTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WorldSceneWidget.h" - -namespace Deprecated -{ - class PanZoomMouseTracker : public IWorldSceneMouseTracker - { - private: - WorldSceneWidget& that_; - std::vector originalSceneTouches_; - Touch originalSceneCenter_; - Touch originalDisplayCenter_; - double originalPanX_; - double originalPanY_; - double originalZoom_; - double originalDisplayDistanceBetweenTouches_; - bool idle_; - double normalization_; - - public: - PanZoomMouseTracker(WorldSceneWidget& that, - const std::vector& startTouches); - - virtual bool HasRender() const - { - return false; - } - - virtual void MouseUp() - { - } - - virtual void Render(OrthancStone::CairoContext& context, - double zoom); - - virtual void MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/SliceViewerWidget.cpp --- a/Framework/Deprecated/Widgets/SliceViewerWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,616 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SliceViewerWidget.h" - -#include "../Layers/SliceOutlineRenderer.h" -#include "../../Toolbox/GeometryToolbox.h" -#include "../Layers/FrameRenderer.h" - -#include -#include - -#include - - -static const double THIN_SLICE_THICKNESS = 100.0 * std::numeric_limits::epsilon(); - -namespace Deprecated -{ - void SliceViewerWidget::Scene::DeleteLayer(size_t index) - { - if (index >= renderers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - assert(countMissing_ <= renderers_.size()); - - if (renderers_[index] != NULL) - { - assert(countMissing_ < renderers_.size()); - delete renderers_[index]; - renderers_[index] = NULL; - countMissing_++; - } - } - - - SliceViewerWidget::Scene::Scene(const OrthancStone::CoordinateSystem3D& plane, - double thickness, - size_t countLayers) : - plane_(plane), - thickness_(thickness), - countMissing_(countLayers), - renderers_(countLayers, NULL) - { - if (thickness <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - SliceViewerWidget::Scene::~Scene() - { - for (size_t i = 0; i < renderers_.size(); i++) - { - DeleteLayer(i); - } - } - - void SliceViewerWidget::Scene::SetLayer(size_t index, - ILayerRenderer* renderer) // Takes ownership - { - if (renderer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - DeleteLayer(index); - - renderers_[index] = renderer; - countMissing_--; - } - - - bool SliceViewerWidget::Scene::RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view, - const OrthancStone::CoordinateSystem3D& viewportPlane) - { - bool fullQuality = true; - cairo_t *cr = context.GetObject(); - - for (size_t i = 0; i < renderers_.size(); i++) - { - if (renderers_[i] != NULL) - { - const OrthancStone::CoordinateSystem3D& framePlane = renderers_[i]->GetLayerPlane(); - - double x0, y0, x1, y1, x2, y2; - viewportPlane.ProjectPoint(x0, y0, framePlane.GetOrigin()); - viewportPlane.ProjectPoint(x1, y1, framePlane.GetOrigin() + framePlane.GetAxisX()); - viewportPlane.ProjectPoint(x2, y2, framePlane.GetOrigin() + framePlane.GetAxisY()); - - /** - * Now we solve the system of linear equations Ax + b = x', given: - * A [0 ; 0] + b = [x0 ; y0] - * A [1 ; 0] + b = [x1 ; y1] - * A [0 ; 1] + b = [x2 ; y2] - * <=> - * b = [x0 ; y0] - * A [1 ; 0] = [x1 ; y1] - b = [x1 - x0 ; y1 - y0] - * A [0 ; 1] = [x2 ; y2] - b = [x2 - x0 ; y2 - y0] - * <=> - * b = [x0 ; y0] - * [a11 ; a21] = [x1 - x0 ; y1 - y0] - * [a12 ; a22] = [x2 - x0 ; y2 - y0] - **/ - - cairo_matrix_t transform; - cairo_matrix_init(&transform, x1 - x0, y1 - y0, x2 - x0, y2 - y0, x0, y0); - - cairo_save(cr); - cairo_transform(cr, &transform); - - if (!renderers_[i]->RenderLayer(context, view)) - { - cairo_restore(cr); - return false; - } - - cairo_restore(cr); - } - - if (renderers_[i] != NULL && - !renderers_[i]->IsFullQuality()) - { - fullQuality = false; - } - } - - if (!fullQuality) - { - double x, y; - view.MapDisplayToScene(x, y, static_cast(view.GetDisplayWidth()) / 2.0, 10); - - cairo_translate(cr, x, y); - -#if 1 - double s = 5.0 / view.GetZoom(); - cairo_rectangle(cr, -s, -s, 2.0 * s, 2.0 * s); -#else - // TODO Drawing filled circles makes WebAssembly crash! - cairo_arc(cr, 0, 0, 5.0 / view.GetZoom(), 0, 2.0 * boost::math::constants::pi()); -#endif - - cairo_set_line_width(cr, 2.0 / view.GetZoom()); - cairo_set_source_rgb(cr, 1, 1, 1); - cairo_stroke_preserve(cr); - cairo_set_source_rgb(cr, 1, 0, 0); - cairo_fill(cr); - } - - return true; - } - - void SliceViewerWidget::Scene::SetLayerStyle(size_t index, - const RenderStyle& style) - { - if (renderers_[index] != NULL) - { - renderers_[index]->SetLayerStyle(style); - } - } - - bool SliceViewerWidget::Scene::ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const - { - bool isOpposite; - if (!OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, - plane.GetNormal(), - plane_.GetNormal())) - { - return false; - } - else - { - double z = (plane_.ProjectAlongNormal(plane.GetOrigin()) - - plane_.ProjectAlongNormal(plane_.GetOrigin())); - - if (z < 0) - { - z = -z; - } - - return z <= thickness_; - } - } - - - bool SliceViewerWidget::LookupLayer(size_t& index /* out */, - const IVolumeSlicer& layer) const - { - LayersIndex::const_iterator found = layersIndex_.find(&layer); - - if (found == layersIndex_.end()) - { - return false; - } - else - { - index = found->second; - assert(index < layers_.size() && - layers_[index].get() == &layer); - return true; - } - } - - - void SliceViewerWidget::GetLayerExtent(OrthancStone::Extent2D& extent, - IVolumeSlicer& source) const - { - extent.Reset(); - - std::vector points; - if (source.GetExtent(points, plane_)) - { - for (size_t i = 0; i < points.size(); i++) - { - double x, y; - plane_.ProjectPoint(x, y, points[i]); - extent.AddPoint(x, y); - } - } - } - - - OrthancStone::Extent2D SliceViewerWidget::GetSceneExtent() - { - OrthancStone::Extent2D sceneExtent; - - for (size_t i = 0; i < layers_.size(); i++) - { - assert(layers_[i] != NULL); - OrthancStone::Extent2D layerExtent; - GetLayerExtent(layerExtent, *layers_[i]); - - sceneExtent.Union(layerExtent); - } - - return sceneExtent; - } - - - bool SliceViewerWidget::RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - if (currentScene_.get() != NULL) - { - return currentScene_->RenderScene(context, view, plane_); - } - else - { - return true; - } - } - - - void SliceViewerWidget::ResetPendingScene() - { - double thickness; - if (pendingScene_.get() == NULL) - { - thickness = 1.0; - } - else - { - thickness = pendingScene_->GetThickness(); - } - - pendingScene_.reset(new Scene(plane_, thickness, layers_.size())); - } - - - void SliceViewerWidget::UpdateLayer(size_t index, - ILayerRenderer* renderer, - const OrthancStone::CoordinateSystem3D& plane) - { - LOG(INFO) << "Updating layer " << index; - - std::unique_ptr tmp(renderer); - - if (renderer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - if (index >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - assert(layers_.size() == styles_.size()); - renderer->SetLayerStyle(styles_[index]); - - if (currentScene_.get() != NULL && - currentScene_->ContainsPlane(plane)) - { - currentScene_->SetLayer(index, tmp.release()); - NotifyContentChanged(); - } - else if (pendingScene_.get() != NULL && - pendingScene_->ContainsPlane(plane)) - { - pendingScene_->SetLayer(index, tmp.release()); - - if (currentScene_.get() == NULL || - !currentScene_->IsComplete() || - pendingScene_->IsComplete()) - { -#if __cplusplus < 201103L - currentScene_.reset(pendingScene_.release()); -#else - currentScene_ = std::move(pendingScene_); -#endif - - NotifyContentChanged(); - } - } - } - - - SliceViewerWidget::SliceViewerWidget(const std::string& name) : - WorldSceneWidget(name), - started_(false) - { - SetBackgroundCleared(true); - } - - - void SliceViewerWidget::ObserveLayer(IVolumeSlicer& layer) - { - // currently ignoring errors of type IVolumeSlicer::GeometryErrorMessage - - Register(layer, &SliceViewerWidget::OnGeometryReady); - Register(layer, &SliceViewerWidget::OnSliceChanged); - Register(layer, &SliceViewerWidget::OnContentChanged); - Register(layer, &SliceViewerWidget::OnLayerReady); - Register(layer, &SliceViewerWidget::OnLayerError); - } - - - size_t SliceViewerWidget::AddLayer(boost::shared_ptr layer) - { - if (layer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - size_t index = layers_.size(); - layers_.push_back(layer); - styles_.push_back(RenderStyle()); - layersIndex_[layer.get()] = index; - - ResetPendingScene(); - - ObserveLayer(*layer); - - ResetChangedLayers(); - - return index; - } - - - void SliceViewerWidget::ReplaceLayer(size_t index, - boost::shared_ptr layer) - { - if (layer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - if (index >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - layers_[index] = layer; - layersIndex_[layer.get()] = index; - - ResetPendingScene(); - - ObserveLayer(*layer); - - InvalidateLayer(index); - } - - - void SliceViewerWidget::RemoveLayer(size_t index) - { - if (index >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - IVolumeSlicer* previousLayer = layers_[index].get(); - layersIndex_.erase(layersIndex_.find(previousLayer)); - layers_.erase(layers_.begin() + index); - changedLayers_.erase(changedLayers_.begin() + index); - styles_.erase(styles_.begin() + index); - - layers_[index].reset(); - - currentScene_->DeleteLayer(index); - ResetPendingScene(); - - NotifyContentChanged(); - } - - - const RenderStyle& SliceViewerWidget::GetLayerStyle(size_t layer) const - { - if (layer >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - assert(layers_.size() == styles_.size()); - return styles_[layer]; - } - - - void SliceViewerWidget::SetLayerStyle(size_t layer, - const RenderStyle& style) - { - if (layer >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - assert(layers_.size() == styles_.size()); - styles_[layer] = style; - - if (currentScene_.get() != NULL) - { - currentScene_->SetLayerStyle(layer, style); - } - - if (pendingScene_.get() != NULL) - { - pendingScene_->SetLayerStyle(layer, style); - } - - NotifyContentChanged(); - } - - - void SliceViewerWidget::SetSlice(const OrthancStone::CoordinateSystem3D& plane) - { - LOG(INFO) << "Setting slice origin: (" << plane.GetOrigin()[0] - << "," << plane.GetOrigin()[1] - << "," << plane.GetOrigin()[2] << ")"; - - Deprecated::Slice displayedSlice(plane_, THIN_SLICE_THICKNESS); - - //if (!displayedSlice.ContainsPlane(slice)) - { - if (currentScene_.get() == NULL || - (pendingScene_.get() != NULL && - pendingScene_->IsComplete())) - { -#if __cplusplus < 201103L - currentScene_.reset(pendingScene_.release()); -#else - currentScene_ = std::move(pendingScene_); -#endif - } - - plane_ = plane; - ResetPendingScene(); - - InvalidateAllLayers(); // TODO Removing this line avoid loading twice the image in WASM - } - - BroadcastMessage(DisplayedSliceMessage(*this, displayedSlice)); - } - - - void SliceViewerWidget::OnGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) - { - size_t i; - if (LookupLayer(i, message.GetOrigin())) - { - LOG(INFO) << ": Geometry ready for layer " << i << " in " << GetName(); - - changedLayers_[i] = true; - //layers_[i]->ScheduleLayerCreation(plane_); - } - BroadcastMessage(GeometryChangedMessage(*this)); - } - - - void SliceViewerWidget::InvalidateAllLayers() - { - for (size_t i = 0; i < layers_.size(); i++) - { - assert(layers_[i] != NULL); - changedLayers_[i] = true; - - //layers_[i]->ScheduleLayerCreation(plane_); - } - } - - - void SliceViewerWidget::InvalidateLayer(size_t layer) - { - if (layer >= layers_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - assert(layers_[layer] != NULL); - changedLayers_[layer] = true; - - //layers_[layer]->ScheduleLayerCreation(plane_); - } - - - void SliceViewerWidget::OnContentChanged(const IVolumeSlicer::ContentChangedMessage& message) - { - size_t index; - if (LookupLayer(index, message.GetOrigin())) - { - InvalidateLayer(index); - } - - BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); - } - - - void SliceViewerWidget::OnSliceChanged(const IVolumeSlicer::SliceContentChangedMessage& message) - { - if (message.GetSlice().ContainsPlane(plane_)) - { - size_t index; - if (LookupLayer(index, message.GetOrigin())) - { - InvalidateLayer(index); - } - } - - BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); - } - - - void SliceViewerWidget::OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message) - { - size_t index; - if (LookupLayer(index, message.GetOrigin())) - { - LOG(INFO) << "Renderer ready for layer " << index; - UpdateLayer(index, message.CreateRenderer(), message.GetSlice()); - } - - BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); - } - - - void SliceViewerWidget::OnLayerError(const IVolumeSlicer::LayerErrorMessage& message) - { - size_t index; - if (LookupLayer(index, message.GetOrigin())) - { - LOG(ERROR) << "Using error renderer on layer " << index; - - // TODO - //UpdateLayer(index, new SliceOutlineRenderer(slice), slice); - - BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); - } - } - - - void SliceViewerWidget::ResetChangedLayers() - { - changedLayers_.resize(layers_.size()); - - for (size_t i = 0; i < changedLayers_.size(); i++) - { - changedLayers_[i] = false; - } - } - - - void SliceViewerWidget::DoAnimation() - { - assert(changedLayers_.size() <= layers_.size()); - - for (size_t i = 0; i < changedLayers_.size(); i++) - { - if (changedLayers_[i]) - { - layers_[i]->ScheduleLayerCreation(plane_); - } - } - - ResetChangedLayers(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/SliceViewerWidget.h --- a/Framework/Deprecated/Widgets/SliceViewerWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WorldSceneWidget.h" -#include "../Layers/IVolumeSlicer.h" -#include "../../Toolbox/Extent2D.h" -#include "../../Messages/ObserverBase.h" - -#include - -namespace Deprecated -{ - class SliceViewerWidget : - public WorldSceneWidget, - public OrthancStone::ObserverBase, - public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryChangedMessage, SliceViewerWidget); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, SliceViewerWidget); - - - // TODO - Use this message in ReferenceLineSource - class DisplayedSliceMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Deprecated::Slice& slice_; - - public: - DisplayedSliceMessage(SliceViewerWidget& origin, - const Deprecated::Slice& slice) : - OriginMessage(origin), - slice_(slice) - { - } - - const Deprecated::Slice& GetSlice() const - { - return slice_; - } - }; - - private: - SliceViewerWidget(const SliceViewerWidget&); - SliceViewerWidget& operator=(const SliceViewerWidget&); - - class Scene : public boost::noncopyable - { - private: - OrthancStone::CoordinateSystem3D plane_; - double thickness_; - size_t countMissing_; - std::vector renderers_; - - public: - void DeleteLayer(size_t index); - - Scene(const OrthancStone::CoordinateSystem3D& plane, - double thickness, - size_t countLayers); - - ~Scene(); - - void SetLayer(size_t index, - ILayerRenderer* renderer); // Takes ownership - - const OrthancStone::CoordinateSystem3D& GetPlane() const - { - return plane_; - } - - bool HasRenderer(size_t index) - { - return renderers_[index] != NULL; - } - - bool IsComplete() const - { - return countMissing_ == 0; - } - - unsigned int GetCountMissing() const - { - return static_cast(countMissing_); - } - - bool RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view, - const OrthancStone::CoordinateSystem3D& viewportPlane); - - void SetLayerStyle(size_t index, - const RenderStyle& style); - - bool ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const; - - double GetThickness() const - { - return thickness_; - } - }; - - - typedef std::map LayersIndex; - - bool started_; - LayersIndex layersIndex_; - std::vector > layers_; - std::vector styles_; - OrthancStone::CoordinateSystem3D plane_; - std::unique_ptr currentScene_; - std::unique_ptr pendingScene_; - std::vector changedLayers_; - - bool LookupLayer(size_t& index /* out */, - const IVolumeSlicer& layer) const; - - void GetLayerExtent(OrthancStone::Extent2D& extent, - IVolumeSlicer& source) const; - - void OnGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message); - - virtual void OnContentChanged(const IVolumeSlicer::ContentChangedMessage& message); - - virtual void OnSliceChanged(const IVolumeSlicer::SliceContentChangedMessage& message); - - virtual void OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message); - - virtual void OnLayerError(const IVolumeSlicer::LayerErrorMessage& message); - - void ObserveLayer(IVolumeSlicer& source); - - void ResetChangedLayers(); - - public: - SliceViewerWidget(const std::string& name); - - virtual OrthancStone::Extent2D GetSceneExtent(); - - protected: - virtual bool RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view); - - void ResetPendingScene(); - - void UpdateLayer(size_t index, - ILayerRenderer* renderer, - const OrthancStone::CoordinateSystem3D& plane); - - void InvalidateAllLayers(); - - void InvalidateLayer(size_t layer); - - public: - virtual ~SliceViewerWidget() - { - } - - size_t AddLayer(boost::shared_ptr layer); - - void ReplaceLayer(size_t layerIndex, boost::shared_ptr layer); // Takes ownership - - void RemoveLayer(size_t layerIndex); - - size_t GetLayerCount() const - { - return layers_.size(); - } - - const RenderStyle& GetLayerStyle(size_t layer) const; - - void SetLayerStyle(size_t layer, - const RenderStyle& style); - - void SetSlice(const OrthancStone::CoordinateSystem3D& plane); - - const OrthancStone::CoordinateSystem3D& GetSlice() const - { - return plane_; - } - - virtual bool HasAnimation() const - { - return true; - } - - virtual void DoAnimation(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/TestCairoWidget.cpp --- a/Framework/Deprecated/Widgets/TestCairoWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TestCairoWidget.h" - -#include - - -namespace Deprecated -{ - namespace Samples - { - void TestCairoWidget::DoAnimation() - { - value_ -= 0.01f; - if (value_ < 0) - { - value_ = 1; - } - - NotifyContentChanged(); - } - - - bool TestCairoWidget::RenderCairo(OrthancStone::CairoContext& context) - { - cairo_t* cr = context.GetObject(); - - cairo_set_source_rgb (cr, .3, 0, 0); - cairo_paint(cr); - - cairo_set_source_rgb(cr, 0, 1, 0); - cairo_rectangle(cr, width_ / 4, height_ / 4, width_ / 2, height_ / 2); - cairo_set_line_width(cr, 1.0); - cairo_fill(cr); - - cairo_set_source_rgb(cr, 0, 1, value_); - cairo_rectangle(cr, width_ / 2 - 50, height_ / 2 - 50, 100, 100); - cairo_fill(cr); - - return true; - } - - - void TestCairoWidget::RenderMouseOverCairo(OrthancStone::CairoContext& context, - int x, - int y) - { - cairo_t* cr = context.GetObject(); - - cairo_set_source_rgb (cr, 1, 0, 0); - cairo_rectangle(cr, x - 5, y - 5, 10, 10); - cairo_set_line_width(cr, 1.0); - cairo_stroke(cr); - - char buf[64]; - sprintf(buf, "(%d,%d)", x, y); - UpdateStatusBar(buf); - } - - - TestCairoWidget::TestCairoWidget(const std::string& name, bool animate) : - CairoWidget(name), - width_(0), - height_(0), - value_(1), - animate_(animate) - { - } - - - void TestCairoWidget::SetSize(unsigned int width, - unsigned int height) - { - CairoWidget::SetSize(width, height); - width_ = width; - height_ = height; - } - - - IMouseTracker* TestCairoWidget::CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) - { - UpdateStatusBar("Click"); - return NULL; - } - - - void TestCairoWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - UpdateStatusBar(direction == OrthancStone::MouseWheelDirection_Down ? "Wheel down" : "Wheel up"); - } - - - void TestCairoWidget::KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) - { - UpdateStatusBar("Key pressed: \"" + std::string(1, keyChar) + "\""); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/TestCairoWidget.h --- a/Framework/Deprecated/Widgets/TestCairoWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CairoWidget.h" - -namespace Deprecated -{ - namespace Samples - { - class TestCairoWidget : public CairoWidget - { - private: - unsigned int width_; - unsigned int height_; - float value_; - bool animate_; - - protected: - virtual bool RenderCairo(OrthancStone::CairoContext& context); - - virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, - int x, - int y); - - public: - TestCairoWidget(const std::string& name, bool animate); - - virtual void SetSize(unsigned int width, - unsigned int height); - - virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches); - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers); - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers); - - virtual bool HasAnimation() const - { - return animate_; - } - - virtual void DoAnimation(); - - virtual bool HasRenderMouseOver() - { - return true; - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/TestWorldSceneWidget.cpp --- a/Framework/Deprecated/Widgets/TestWorldSceneWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,149 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TestWorldSceneWidget.h" - -#include - -#include -#include - -namespace Deprecated -{ - namespace Samples - { - class TestWorldSceneWidget::Interactor : public IWorldSceneInteractor - { - public: - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const ViewportGeometry& view, - OrthancStone::MouseButton button, - OrthancStone::KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - IStatusBar* statusBar, - const std::vector& touches) - { - if (statusBar) - { - char buf[64]; - sprintf(buf, "X = %0.2f, Y = %0.2f", x, y); - statusBar->SetMessage(buf); - } - - return NULL; - } - - virtual void MouseOver(OrthancStone::CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) - { - double S = 0.5; - - if (fabs(x) <= S && - fabs(y) <= S) - { - cairo_t* cr = context.GetObject(); - cairo_set_source_rgb(cr, 1, 0, 0); - cairo_rectangle(cr, -S, -S , 2.0 * S, 2.0 * S); - cairo_set_line_width(cr, 1.0 / view.GetZoom()); - cairo_stroke(cr); - } - } - - virtual void MouseWheel(WorldSceneWidget& widget, - OrthancStone::MouseWheelDirection direction, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - if (statusBar) - { - statusBar->SetMessage(direction == OrthancStone::MouseWheelDirection_Down ? "Wheel down" : "Wheel up"); - } - } - - virtual void KeyPressed(WorldSceneWidget& widget, - OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - if (statusBar) - { - statusBar->SetMessage("Key pressed: \"" + std::string(1, keyChar) + "\""); - } - } - }; - - - bool TestWorldSceneWidget::RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view) - { - cairo_t* cr = context.GetObject(); - - // Clear background - cairo_set_source_rgb(cr, 0, 0, 0); - cairo_paint(cr); - - float color = static_cast(count_ % 16) / 15.0f; - cairo_set_source_rgb(cr, 0, 1.0f - color, color); - cairo_rectangle(cr, -10, -.5, 20, 1); - cairo_fill(cr); - - return true; - } - - - TestWorldSceneWidget::TestWorldSceneWidget(const std::string& name, bool animate) : - WorldSceneWidget(name), - interactor_(new Interactor), - animate_(animate), - count_(0) - { - SetInteractor(*interactor_); - } - - - OrthancStone::Extent2D TestWorldSceneWidget::GetSceneExtent() - { - return OrthancStone::Extent2D(-10, -.5, 10, .5); - } - - - void TestWorldSceneWidget::DoAnimation() - { - if (animate_) - { - count_++; - NotifyContentChanged(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/TestWorldSceneWidget.h --- a/Framework/Deprecated/Widgets/TestWorldSceneWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WorldSceneWidget.h" - -#include - -namespace Deprecated -{ - namespace Samples - { - class TestWorldSceneWidget : public WorldSceneWidget - { - private: - class Interactor; - - std::unique_ptr interactor_; - bool animate_; - unsigned int count_; - - protected: - virtual bool RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view); - - public: - TestWorldSceneWidget(const std::string& name, bool animate); - - virtual OrthancStone::Extent2D GetSceneExtent(); - - virtual bool HasAnimation() const - { - return animate_; - } - - virtual void DoAnimation(); - - virtual bool HasRenderMouseOver() - { - return true; - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/WidgetBase.cpp --- a/Framework/Deprecated/Widgets/WidgetBase.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WidgetBase.h" - -#include -#include -#include - -namespace Deprecated -{ - void WidgetBase::NotifyContentChanged() - { - if (parent_ != NULL) - { - parent_->NotifyContentChanged(); - } - - if (viewport_ != NULL) - { - viewport_->NotifyBackgroundChanged(); - } - } - - - void WidgetBase::SetParent(IWidget& parent) - { - if (parent_ != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - parent_ = &parent; - } - } - - - void WidgetBase::ClearBackgroundOrthanc(Orthanc::ImageAccessor& target) const - { - // Clear the background using Orthanc - - if (backgroundCleared_) - { - Orthanc::ImageProcessing::Set(target, - backgroundColor_[0], - backgroundColor_[1], - backgroundColor_[2], - 255 /* alpha */); - } - } - - - void WidgetBase::ClearBackgroundCairo(OrthancStone::CairoContext& context) const - { - // Clear the background using Cairo - - if (IsBackgroundCleared()) - { - uint8_t red, green, blue; - GetBackgroundColor(red, green, blue); - - context.SetSourceColor(red, green, blue); - cairo_paint(context.GetObject()); - } - } - - - void WidgetBase::ClearBackgroundCairo(Orthanc::ImageAccessor& target) const - { - OrthancStone::CairoSurface surface(target, false /* no alpha */); - OrthancStone::CairoContext context(surface); - ClearBackgroundCairo(context); - } - - - void WidgetBase::UpdateStatusBar(const std::string& message) - { - if (statusBar_ != NULL) - { - statusBar_->SetMessage(message); - } - } - - - WidgetBase::WidgetBase(const std::string& name) : - parent_(NULL), - viewport_(NULL), - statusBar_(NULL), - backgroundCleared_(false), - transmitMouseOver_(false), - name_(name) - { - backgroundColor_[0] = 0; - backgroundColor_[1] = 0; - backgroundColor_[2] = 0; - } - - - void WidgetBase::SetViewport(WidgetViewport& viewport) - { - if (viewport_ != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - viewport_ = &viewport; - } - } - - - void WidgetBase::SetBackgroundColor(uint8_t red, - uint8_t green, - uint8_t blue) - { - backgroundColor_[0] = red; - backgroundColor_[1] = green; - backgroundColor_[2] = blue; - } - - void WidgetBase::GetBackgroundColor(uint8_t& red, - uint8_t& green, - uint8_t& blue) const - { - red = backgroundColor_[0]; - green = backgroundColor_[1]; - blue = backgroundColor_[2]; - } - - - bool WidgetBase::Render(Orthanc::ImageAccessor& surface) - { -#if 0 - ClearBackgroundOrthanc(surface); -#else - ClearBackgroundCairo(surface); // Faster than Orthanc -#endif - - return true; - } - - - void WidgetBase::DoAnimation() - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/WidgetBase.h --- a/Framework/Deprecated/Widgets/WidgetBase.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IWidget.h" - -#include "../../Wrappers/CairoContext.h" -#include "../Viewport/WidgetViewport.h" - -namespace Deprecated -{ - class WidgetBase : public IWidget - { - private: - IWidget* parent_; - WidgetViewport* viewport_; - IStatusBar* statusBar_; - bool backgroundCleared_; - uint8_t backgroundColor_[3]; - bool transmitMouseOver_; - std::string name_; - - protected: - void ClearBackgroundOrthanc(Orthanc::ImageAccessor& target) const; - - void ClearBackgroundCairo(OrthancStone::CairoContext& context) const; - - void ClearBackgroundCairo(Orthanc::ImageAccessor& target) const; - - void UpdateStatusBar(const std::string& message); - - IStatusBar* GetStatusBar() const - { - return statusBar_; - } - - public: - WidgetBase(const std::string& name); - - virtual void FitContent() - { - } - - virtual void SetParent(IWidget& parent); - - virtual void SetViewport(WidgetViewport& viewport); - - void SetBackgroundCleared(bool clear) - { - backgroundCleared_ = clear; - } - - bool IsBackgroundCleared() const - { - return backgroundCleared_; - } - - void SetTransmitMouseOver(bool transmit) - { - transmitMouseOver_ = transmit; - } - - void SetBackgroundColor(uint8_t red, - uint8_t green, - uint8_t blue); - - void GetBackgroundColor(uint8_t& red, - uint8_t& green, - uint8_t& blue) const; - - virtual void SetStatusBar(IStatusBar& statusBar) - { - statusBar_ = &statusBar; - } - - virtual bool Render(Orthanc::ImageAccessor& surface); - - virtual bool HasAnimation() const - { - return false; - } - - virtual void DoAnimation(); - - virtual bool HasRenderMouseOver() - { - return transmitMouseOver_; - } - - virtual void NotifyContentChanged(); - - const std::string& GetName() const - { - return name_; - } - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/WorldSceneWidget.cpp --- a/Framework/Deprecated/Widgets/WorldSceneWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,229 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WorldSceneWidget.h" - -#include "PanMouseTracker.h" -#include "ZoomMouseTracker.h" -#include "PanZoomMouseTracker.h" - -#include -#include - -#include -#include -#include - -namespace Deprecated -{ - // this is an adapter between a IWorldSceneMouseTracker - // that is tracking a mouse in scene coordinates/mm and - // an IMouseTracker that is tracking a mouse - // in screen coordinates/pixels. - class WorldSceneWidget::SceneMouseTracker : public IMouseTracker - { - private: - ViewportGeometry view_; - std::unique_ptr tracker_; - - public: - SceneMouseTracker(const ViewportGeometry& view, - IWorldSceneMouseTracker* tracker) : - view_(view), - tracker_(tracker) - { - if (tracker == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - virtual void Render(Orthanc::ImageAccessor& target) - { - if (tracker_->HasRender()) - { - OrthancStone::CairoSurface surface(target, false /* no alpha */); - OrthancStone::CairoContext context(surface); - view_.ApplyTransform(context); - tracker_->Render(context, view_.GetZoom()); - } - } - - virtual void MouseUp() - { - tracker_->MouseUp(); - } - - virtual void MouseMove(int x, - int y, - const std::vector& displayTouches) - { - double sceneX, sceneY; - view_.MapPixelCenterToScene(sceneX, sceneY, x, y); - - std::vector sceneTouches; - for (size_t t = 0; t < displayTouches.size(); t++) - { - double sx, sy; - - view_.MapPixelCenterToScene( - sx, sy, (int)displayTouches[t].x, (int)displayTouches[t].y); - - sceneTouches.push_back( - Touch(static_cast(sx), static_cast(sy))); - } - tracker_->MouseMove(x, y, sceneX, sceneY, displayTouches, sceneTouches); - } - }; - - - bool WorldSceneWidget::RenderCairo(OrthancStone::CairoContext& context) - { - view_.ApplyTransform(context); - return RenderScene(context, view_); - } - - - void WorldSceneWidget::RenderMouseOverCairo(OrthancStone::CairoContext& context, - int x, - int y) - { - ViewportGeometry view = GetView(); - view.ApplyTransform(context); - - double sceneX, sceneY; - view.MapPixelCenterToScene(sceneX, sceneY, x, y); - - if (interactor_) - { - interactor_->MouseOver(context, *this, view, sceneX, sceneY, GetStatusBar()); - } - } - - - void WorldSceneWidget::SetSceneExtent(ViewportGeometry& view) - { - view.SetSceneExtent(GetSceneExtent()); - } - - - void WorldSceneWidget::SetSize(unsigned int width, - unsigned int height) - { - CairoWidget::SetSize(width, height); - view_.SetDisplaySize(width, height); - } - - - void WorldSceneWidget::SetInteractor(IWorldSceneInteractor& interactor) - { - interactor_ = &interactor; - } - - - void WorldSceneWidget::FitContent() - { - SetSceneExtent(view_); - view_.FitContent(); - - NotifyContentChanged(); - } - - - void WorldSceneWidget::SetView(const ViewportGeometry& view) - { - view_ = view; - - NotifyContentChanged(); - } - - - IMouseTracker* WorldSceneWidget::CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches) - { - double sceneX, sceneY; - view_.MapPixelCenterToScene(sceneX, sceneY, x, y); - - // asks the Widget Interactor to provide a mouse tracker - std::unique_ptr tracker; - - if (interactor_) - { - tracker.reset(interactor_->CreateMouseTracker(*this, view_, button, modifiers, x, y, sceneX, sceneY, GetStatusBar(), touches)); - } - - if (tracker.get() != NULL) - { - return new SceneMouseTracker(view_, tracker.release()); - } - else if (hasDefaultMouseEvents_) - { - if (touches.size() == 2) - { - return new SceneMouseTracker(view_, new PanZoomMouseTracker(*this, touches)); - } - else - { - switch (button) - { - case OrthancStone::MouseButton_Middle: - return new SceneMouseTracker(view_, new PanMouseTracker(*this, x, y)); - - case OrthancStone::MouseButton_Right: - return new SceneMouseTracker(view_, new ZoomMouseTracker(*this, x, y)); - - default: - return NULL; - } - } - } - else - { - return NULL; - } - } - - - void WorldSceneWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers) - { - if (interactor_) - { - interactor_->MouseWheel(*this, direction, modifiers, GetStatusBar()); - } - } - - - void WorldSceneWidget::KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers) - { - if (interactor_) - { - interactor_->KeyPressed(*this, key, keyChar, modifiers, GetStatusBar()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/WorldSceneWidget.h --- a/Framework/Deprecated/Widgets/WorldSceneWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CairoWidget.h" -#include "IWorldSceneInteractor.h" - -#include "../Toolbox/ViewportGeometry.h" - -namespace Deprecated -{ - class WorldSceneWidget : public CairoWidget - { - private: - class SceneMouseTracker; - - ViewportGeometry view_; - IWorldSceneInteractor* interactor_; - bool hasDefaultMouseEvents_; - - protected: - virtual OrthancStone::Extent2D GetSceneExtent() = 0; - - virtual bool RenderScene(OrthancStone::CairoContext& context, - const ViewportGeometry& view) = 0; - - // From CairoWidget - virtual bool RenderCairo(OrthancStone::CairoContext& context); - - // From CairoWidget - virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, - int x, - int y); - - void SetSceneExtent(ViewportGeometry& geometry); - - public: - WorldSceneWidget(const std::string& name) : - CairoWidget(name), - interactor_(NULL), - hasDefaultMouseEvents_(true) - { - } - - void SetDefaultMouseEvents(bool value) - { - hasDefaultMouseEvents_ = value; - } - - bool HasDefaultMouseEvents() const - { - return hasDefaultMouseEvents_; - } - - void SetInteractor(IWorldSceneInteractor& interactor); - - void SetView(const ViewportGeometry& view); - - const ViewportGeometry& GetView() const - { - return view_; - } - - virtual void SetSize(unsigned int width, - unsigned int height); - - virtual void FitContent(); - - virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers, - const std::vector& touches); - - virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, - int x, - int y, - OrthancStone::KeyboardModifiers modifiers); - - virtual void KeyPressed(OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/ZoomMouseTracker.cpp --- a/Framework/Deprecated/Widgets/ZoomMouseTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ZoomMouseTracker.h" - -#include -#include - -namespace Deprecated -{ - ZoomMouseTracker::ZoomMouseTracker(WorldSceneWidget& that, - int x, - int y) : - that_(that), - originalZoom_(that.GetView().GetZoom()), - downX_(x), - downY_(y) - { - that.GetView().MapPixelCenterToScene(centerX_, centerY_, x, y); - - unsigned int height = that.GetView().GetDisplayHeight(); - - if (height <= 3) - { - idle_ = true; - LOG(WARNING) << "image is too small to zoom (current height = " << height << ")"; - } - else - { - idle_ = false; - normalization_ = 1.0 / static_cast(height - 1); - } - } - - - void ZoomMouseTracker::Render(OrthancStone::CairoContext& context, - double zoom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void ZoomMouseTracker::MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches) - { - static const double MIN_ZOOM = -4; - static const double MAX_ZOOM = 4; - - - if (!idle_) - { - double dy = static_cast(displayY - downY_) * normalization_; // In the range [-1,1] - double z; - - // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] - if (dy < -1.0) - { - z = MIN_ZOOM; - } - else if (dy > 1.0) - { - z = MAX_ZOOM; - } - else - { - z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; - } - - z = pow(2.0, z); - - ViewportGeometry view = that_.GetView(); - - view.SetZoom(z * originalZoom_); - - // Correct the pan so that the original click point is kept at - // the same location on the display - double panX, panY; - view.GetPan(panX, panY); - - int tx, ty; - view.MapSceneToDisplay(tx, ty, centerX_, centerY_); - view.SetPan(panX + static_cast(downX_ - tx), - panY + static_cast(downY_ - ty)); - - that_.SetView(view); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/Widgets/ZoomMouseTracker.h --- a/Framework/Deprecated/Widgets/ZoomMouseTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WorldSceneWidget.h" - -namespace Deprecated -{ - class ZoomMouseTracker : public IWorldSceneMouseTracker - { - private: - WorldSceneWidget& that_; - double originalZoom_; - int downX_; - int downY_; - double centerX_; - double centerY_; - bool idle_; - double normalization_; - - public: - ZoomMouseTracker(WorldSceneWidget& that, - int x, - int y); - - virtual bool HasRender() const - { - return false; - } - - virtual void MouseUp() - { - } - - virtual void Render(OrthancStone::CairoContext& context, - double zoom); - - virtual void MouseMove(int displayX, - int displayY, - double x, - double y, - const std::vector& displayTouches, - const std::vector& sceneTouches); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Deprecated/dev.h --- a/Framework/Deprecated/dev.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,958 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "Layers/FrameRenderer.h" -#include "Layers/LineLayerRenderer.h" -#include "Layers/SliceOutlineRenderer.h" -#include "Toolbox/DownloadStack.h" -#include "Toolbox/GeometryToolbox.h" -#include "Toolbox/OrthancSlicesLoader.h" -#include "Volumes/ISlicedVolume.h" -#include "Volumes/ImageBuffer3D.h" -#include "Widgets/SliceViewerWidget.h" - -#include -#include -#include - -#include - - -namespace Deprecated -{ - // TODO: Handle errors while loading - class OrthancVolumeImage : - public ISlicedVolume, - public OrthancStone::IObserver - { - private: - OrthancSlicesLoader loader_; - std::unique_ptr image_; - std::unique_ptr downloadStack_; - bool computeRange_; - size_t pendingSlices_; - - void ScheduleSliceDownload() - { - assert(downloadStack_.get() != NULL); - - unsigned int slice; - if (downloadStack_->Pop(slice)) - { - loader_.ScheduleLoadSliceImage(slice, OrthancStone::SliceImageQuality_Jpeg90); - } - } - - - static bool IsCompatible(const Slice& a, - const Slice& b) - { - if (!OrthancStone::GeometryToolbox::IsParallel(a.GetGeometry().GetNormal(), - b.GetGeometry().GetNormal())) - { - LOG(ERROR) << "A slice in the volume image is not parallel to the others."; - return false; - } - - if (a.GetConverter().GetExpectedPixelFormat() != b.GetConverter().GetExpectedPixelFormat()) - { - LOG(ERROR) << "The pixel format changes across the slices of the volume image."; - return false; - } - - if (a.GetWidth() != b.GetWidth() || - a.GetHeight() != b.GetHeight()) - { - LOG(ERROR) << "The slices dimensions (width/height) are varying throughout the volume image"; - return false; - } - - if (!OrthancStone::LinearAlgebra::IsNear(a.GetPixelSpacingX(), b.GetPixelSpacingX()) || - !OrthancStone::LinearAlgebra::IsNear(a.GetPixelSpacingY(), b.GetPixelSpacingY())) - { - LOG(ERROR) << "The pixel spacing of the slices change across the volume image"; - return false; - } - - return true; - } - - - static double GetDistance(const Slice& a, - const Slice& b) - { - return fabs(a.GetGeometry().ProjectAlongNormal(a.GetGeometry().GetOrigin()) - - a.GetGeometry().ProjectAlongNormal(b.GetGeometry().GetOrigin())); - } - - - void OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message) - { - assert(&message.GetOrigin() == &loader_); - - if (loader_.GetSlicesCount() == 0) - { - LOG(ERROR) << "Empty volume image"; - BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); - return; - } - - for (size_t i = 1; i < loader_.GetSlicesCount(); i++) - { - if (!IsCompatible(loader_.GetSlice(0), loader_.GetSlice(i))) - { - BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); - return; - } - } - - double spacingZ; - - if (loader_.GetSlicesCount() > 1) - { - spacingZ = GetDistance(loader_.GetSlice(0), loader_.GetSlice(1)); - } - else - { - // This is a volume with one single slice: Choose a dummy - // z-dimension for voxels - spacingZ = 1; - } - - for (size_t i = 1; i < loader_.GetSlicesCount(); i++) - { - if (!OrthancStone::LinearAlgebra::IsNear(spacingZ, GetDistance(loader_.GetSlice(i - 1), loader_.GetSlice(i)), - 0.001 /* this is expressed in mm */)) - { - LOG(ERROR) << "The distance between successive slices is not constant in a volume image"; - BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); - return; - } - } - - unsigned int width = loader_.GetSlice(0).GetWidth(); - unsigned int height = loader_.GetSlice(0).GetHeight(); - Orthanc::PixelFormat format = loader_.GetSlice(0).GetConverter().GetExpectedPixelFormat(); - LOG(INFO) << "Creating a volume image of size " << width << "x" << height - << "x" << loader_.GetSlicesCount() << " in " << Orthanc::EnumerationToString(format); - - image_.reset(new OrthancStone::ImageBuffer3D(format, width, height, static_cast(loader_.GetSlicesCount()), computeRange_)); - image_->GetGeometry().SetAxialGeometry(loader_.GetSlice(0).GetGeometry()); - image_->GetGeometry().SetVoxelDimensions(loader_.GetSlice(0).GetPixelSpacingX(), - loader_.GetSlice(0).GetPixelSpacingY(), spacingZ); - image_->Clear(); - - downloadStack_.reset(new DownloadStack(static_cast(loader_.GetSlicesCount()))); - pendingSlices_ = loader_.GetSlicesCount(); - - for (unsigned int i = 0; i < 4; i++) // Limit to 4 simultaneous downloads - { - ScheduleSliceDownload(); - } - - // TODO Check the DicomFrameConverter are constant - - BroadcastMessage(ISlicedVolume::GeometryReadyMessage(*this)); - } - - - void OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message) - { - assert(&message.GetOrigin() == &loader_); - - LOG(ERROR) << "Unable to download a volume image"; - BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); - } - - - void OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message) - { - assert(&message.GetOrigin() == &loader_); - - { - OrthancStone::ImageBuffer3D::SliceWriter writer(*image_, OrthancStone::VolumeProjection_Axial, message.GetSliceIndex()); - Orthanc::ImageProcessing::Copy(writer.GetAccessor(), message.GetImage()); - } - - BroadcastMessage(ISlicedVolume::SliceContentChangedMessage - (*this, message.GetSliceIndex(), message.GetSlice())); - - if (pendingSlices_ == 1) - { - BroadcastMessage(ISlicedVolume::VolumeReadyMessage(*this)); - pendingSlices_ = 0; - } - else if (pendingSlices_ > 1) - { - pendingSlices_ -= 1; - } - - ScheduleSliceDownload(); - } - - - void OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message) - { - assert(&message.GetOrigin() == &loader_); - - LOG(ERROR) << "Cannot download slice " << message.GetSliceIndex() << " in a volume image"; - ScheduleSliceDownload(); - } - - - public: - OrthancVolumeImage(OrthancStone::MessageBroker& broker, - OrthancApiClient& orthanc, - bool computeRange) : - ISlicedVolume(broker), - IObserver(broker), - loader_(broker, orthanc), - computeRange_(computeRange), - pendingSlices_(0) - { - loader_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &OrthancVolumeImage::OnSliceGeometryReady)); - - loader_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &OrthancVolumeImage::OnSliceGeometryError)); - - loader_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &OrthancVolumeImage::OnSliceImageReady)); - - loader_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &OrthancVolumeImage::OnSliceImageError)); - } - - void ScheduleLoadSeries(const std::string& seriesId) - { - loader_.ScheduleLoadSeries(seriesId); - } - - void ScheduleLoadInstance(const std::string& instanceId) - { - loader_.ScheduleLoadInstance(instanceId); - } - - void ScheduleLoadFrame(const std::string& instanceId, - unsigned int frame) - { - loader_.ScheduleLoadFrame(instanceId, frame); - } - - virtual size_t GetSlicesCount() const - { - return loader_.GetSlicesCount(); - } - - virtual const Slice& GetSlice(size_t index) const - { - return loader_.GetSlice(index); - } - - OrthancStone::ImageBuffer3D& GetImage() const - { - if (image_.get() == NULL) - { - // The geometry is not ready yet - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *image_; - } - } - - bool FitWindowingToRange(RenderStyle& style, - const DicomFrameConverter& converter) const - { - if (image_.get() == NULL) - { - return false; - } - else - { - return image_->FitWindowingToRange(style, converter); - } - } - }; - - - class VolumeImageGeometry - { - private: - unsigned int width_; - unsigned int height_; - size_t depth_; - double pixelSpacingX_; - double pixelSpacingY_; - double sliceThickness_; - OrthancStone::CoordinateSystem3D reference_; - DicomFrameConverter converter_; - - double ComputeAxialThickness(const OrthancVolumeImage& volume) const - { - double thickness; - - size_t n = volume.GetSlicesCount(); - if (n > 1) - { - const Slice& a = volume.GetSlice(0); - const Slice& b = volume.GetSlice(n - 1); - thickness = ((reference_.ProjectAlongNormal(b.GetGeometry().GetOrigin()) - - reference_.ProjectAlongNormal(a.GetGeometry().GetOrigin())) / - (static_cast(n) - 1.0)); - } - else - { - thickness = volume.GetSlice(0).GetThickness(); - } - - if (thickness <= 0) - { - // The slices should have been sorted with increasing Z - // (along the normal) by the OrthancSlicesLoader - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - else - { - return thickness; - } - } - - void SetupAxial(const OrthancVolumeImage& volume) - { - const Slice& axial = volume.GetSlice(0); - - width_ = axial.GetWidth(); - height_ = axial.GetHeight(); - depth_ = volume.GetSlicesCount(); - - pixelSpacingX_ = axial.GetPixelSpacingX(); - pixelSpacingY_ = axial.GetPixelSpacingY(); - sliceThickness_ = ComputeAxialThickness(volume); - - reference_ = axial.GetGeometry(); - } - - void SetupCoronal(const OrthancVolumeImage& volume) - { - const Slice& axial = volume.GetSlice(0); - double axialThickness = ComputeAxialThickness(volume); - - width_ = axial.GetWidth(); - height_ = static_cast(volume.GetSlicesCount()); - depth_ = axial.GetHeight(); - - pixelSpacingX_ = axial.GetPixelSpacingX(); - pixelSpacingY_ = axialThickness; - sliceThickness_ = axial.GetPixelSpacingY(); - - OrthancStone::Vector origin = axial.GetGeometry().GetOrigin(); - origin += (static_cast(volume.GetSlicesCount() - 1) * - axialThickness * axial.GetGeometry().GetNormal()); - - reference_ = OrthancStone::CoordinateSystem3D(origin, - axial.GetGeometry().GetAxisX(), - - axial.GetGeometry().GetNormal()); - } - - void SetupSagittal(const OrthancVolumeImage& volume) - { - const Slice& axial = volume.GetSlice(0); - double axialThickness = ComputeAxialThickness(volume); - - width_ = axial.GetHeight(); - height_ = static_cast(volume.GetSlicesCount()); - depth_ = axial.GetWidth(); - - pixelSpacingX_ = axial.GetPixelSpacingY(); - pixelSpacingY_ = axialThickness; - sliceThickness_ = axial.GetPixelSpacingX(); - - OrthancStone::Vector origin = axial.GetGeometry().GetOrigin(); - origin += (static_cast(volume.GetSlicesCount() - 1) * - axialThickness * axial.GetGeometry().GetNormal()); - - reference_ = OrthancStone::CoordinateSystem3D(origin, - axial.GetGeometry().GetAxisY(), - axial.GetGeometry().GetNormal()); - } - - public: - VolumeImageGeometry(const OrthancVolumeImage& volume, - OrthancStone::VolumeProjection projection) - { - if (volume.GetSlicesCount() == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - converter_ = volume.GetSlice(0).GetConverter(); - - switch (projection) - { - case OrthancStone::VolumeProjection_Axial: - SetupAxial(volume); - break; - - case OrthancStone::VolumeProjection_Coronal: - SetupCoronal(volume); - break; - - case OrthancStone::VolumeProjection_Sagittal: - SetupSagittal(volume); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - size_t GetSlicesCount() const - { - return depth_; - } - - const OrthancStone::Vector& GetNormal() const - { - return reference_.GetNormal(); - } - - bool LookupSlice(size_t& index, - const OrthancStone::CoordinateSystem3D& slice) const - { - bool opposite; - if (!OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, - reference_.GetNormal(), - slice.GetNormal())) - { - return false; - } - - double z = (reference_.ProjectAlongNormal(slice.GetOrigin()) - - reference_.ProjectAlongNormal(reference_.GetOrigin())) / sliceThickness_; - - int s = static_cast(boost::math::iround(z)); - - if (s < 0 || - s >= static_cast(depth_)) - { - return false; - } - else - { - index = static_cast(s); - return true; - } - } - - Slice* GetSlice(size_t slice) const - { - if (slice >= depth_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - OrthancStone::CoordinateSystem3D origin(reference_.GetOrigin() + - static_cast(slice) * sliceThickness_ * reference_.GetNormal(), - reference_.GetAxisX(), - reference_.GetAxisY()); - - return new Slice(origin, pixelSpacingX_, pixelSpacingY_, sliceThickness_, - width_, height_, converter_); - } - } - }; - - - - class VolumeImageMPRSlicer : - public IVolumeSlicer, - public OrthancStone::IObserver - { - private: - class RendererFactory : public LayerReadyMessage::IRendererFactory - { - private: - const Orthanc::ImageAccessor& frame_; - const Slice& slice_; - bool isFullQuality_; - - public: - RendererFactory(const Orthanc::ImageAccessor& frame, - const Slice& slice, - bool isFullQuality) : - frame_(frame), - slice_(slice), - isFullQuality_(isFullQuality) - { - } - - virtual ILayerRenderer* CreateRenderer() const - { - return FrameRenderer::CreateRenderer(frame_, slice_, isFullQuality_); - } - }; - - - OrthancVolumeImage& volume_; - std::unique_ptr axialGeometry_; - std::unique_ptr coronalGeometry_; - std::unique_ptr sagittalGeometry_; - - - bool IsGeometryReady() const - { - return axialGeometry_.get() != NULL; - } - - void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message) - { - assert(&message.GetOrigin() == &volume_); - - // These 3 values are only used to speed up the IVolumeSlicer - axialGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Axial)); - coronalGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Coronal)); - sagittalGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Sagittal)); - - BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); - } - - void OnGeometryError(const ISlicedVolume::GeometryErrorMessage& message) - { - assert(&message.GetOrigin() == &volume_); - - BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); - } - - void OnContentChanged(const ISlicedVolume::ContentChangedMessage& message) - { - assert(&message.GetOrigin() == &volume_); - - BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); - } - - void OnSliceContentChanged(const ISlicedVolume::SliceContentChangedMessage& message) - { - assert(&message.GetOrigin() == &volume_); - - //IVolumeSlicer::OnSliceContentChange(slice); - - // TODO Improve this? - BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); - } - - const VolumeImageGeometry& GetProjectionGeometry(OrthancStone::VolumeProjection projection) - { - if (!IsGeometryReady()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - switch (projection) - { - case OrthancStone::VolumeProjection_Axial: - return *axialGeometry_; - - case OrthancStone::VolumeProjection_Sagittal: - return *sagittalGeometry_; - - case OrthancStone::VolumeProjection_Coronal: - return *coronalGeometry_; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - bool DetectProjection(OrthancStone::VolumeProjection& projection, - const OrthancStone::CoordinateSystem3D& viewportSlice) - { - bool isOpposite; // Ignored - - if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, - viewportSlice.GetNormal(), - axialGeometry_->GetNormal())) - { - projection = OrthancStone::VolumeProjection_Axial; - return true; - } - else if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, - viewportSlice.GetNormal(), - sagittalGeometry_->GetNormal())) - { - projection = OrthancStone::VolumeProjection_Sagittal; - return true; - } - else if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, - viewportSlice.GetNormal(), - coronalGeometry_->GetNormal())) - { - projection = OrthancStone::VolumeProjection_Coronal; - return true; - } - else - { - return false; - } - } - - - public: - VolumeImageMPRSlicer(OrthancStone::MessageBroker& broker, - OrthancVolumeImage& volume) : - IVolumeSlicer(broker), - IObserver(broker), - volume_(volume) - { - volume_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &VolumeImageMPRSlicer::OnGeometryReady)); - - volume_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &VolumeImageMPRSlicer::OnGeometryError)); - - volume_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &VolumeImageMPRSlicer::OnContentChanged)); - - volume_.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &VolumeImageMPRSlicer::OnSliceContentChanged)); - } - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice) ORTHANC_OVERRIDE - { - OrthancStone::VolumeProjection projection; - - if (!IsGeometryReady() || - !DetectProjection(projection, viewportSlice)) - { - return false; - } - else - { - // As the slices of the volumic image are arranged in a box, - // we only consider one single reference slice (the one with index 0). - std::unique_ptr slice(GetProjectionGeometry(projection).GetSlice(0)); - slice->GetExtent(points); - - return true; - } - } - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) ORTHANC_OVERRIDE - { - OrthancStone::VolumeProjection projection; - - if (IsGeometryReady() && - DetectProjection(projection, viewportSlice)) - { - const VolumeImageGeometry& geometry = GetProjectionGeometry(projection); - - size_t closest; - - if (geometry.LookupSlice(closest, viewportSlice)) - { - bool isFullQuality = true; // TODO - - std::unique_ptr frame; - - { - OrthancStone::ImageBuffer3D::SliceReader reader(volume_.GetImage(), projection, static_cast(closest)); - - // TODO Transfer ownership if non-axial, to avoid memcpy - frame.reset(Orthanc::Image::Clone(reader.GetAccessor())); - } - - std::unique_ptr slice(geometry.GetSlice(closest)); - - RendererFactory factory(*frame, *slice, isFullQuality); - - BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, slice->GetGeometry())); - return; - } - } - - // Error - OrthancStone::CoordinateSystem3D slice; - BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, slice)); - } - }; - - - class VolumeImageInteractor : - public IWorldSceneInteractor, - public OrthancStone::IObserver - { - private: - SliceViewerWidget& widget_; - OrthancStone::VolumeProjection projection_; - std::unique_ptr slices_; - size_t slice_; - - protected: - void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message) - { - if (slices_.get() == NULL) - { - const OrthancVolumeImage& image = - dynamic_cast(message.GetOrigin()); - - slices_.reset(new VolumeImageGeometry(image, projection_)); - SetSlice(slices_->GetSlicesCount() / 2); - - widget_.FitContent(); - } - } - - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const ViewportGeometry& view, - OrthancStone::MouseButton button, - OrthancStone::KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - IStatusBar* statusBar, - const std::vector& touches) ORTHANC_OVERRIDE - { - return NULL; - } - - virtual void MouseOver(OrthancStone::CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) ORTHANC_OVERRIDE - { - } - - virtual void MouseWheel(WorldSceneWidget& widget, - OrthancStone::MouseWheelDirection direction, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) ORTHANC_OVERRIDE - { - int scale = (modifiers & OrthancStone::KeyboardModifiers_Control ? 10 : 1); - - switch (direction) - { - case OrthancStone::MouseWheelDirection_Up: - OffsetSlice(-scale); - break; - - case OrthancStone::MouseWheelDirection_Down: - OffsetSlice(scale); - break; - - default: - break; - } - } - - virtual void KeyPressed(WorldSceneWidget& widget, - OrthancStone::KeyboardKeys key, - char keyChar, - OrthancStone::KeyboardModifiers modifiers, - IStatusBar* statusBar) ORTHANC_OVERRIDE - { - switch (keyChar) - { - case 's': - widget.FitContent(); - break; - - default: - break; - } - } - - public: - VolumeImageInteractor(OrthancStone::MessageBroker& broker, - OrthancVolumeImage& volume, - SliceViewerWidget& widget, - OrthancStone::VolumeProjection projection) : - IObserver(broker), - widget_(widget), - projection_(projection) - { - widget.SetInteractor(*this); - - volume.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &VolumeImageInteractor::OnGeometryReady)); - } - - bool IsGeometryReady() const - { - return slices_.get() != NULL; - } - - size_t GetSlicesCount() const - { - if (slices_.get() == NULL) - { - return 0; - } - else - { - return slices_->GetSlicesCount(); - } - } - - void OffsetSlice(int offset) - { - if (slices_.get() != NULL) - { - int slice = static_cast(slice_) + offset; - - if (slice < 0) - { - slice = 0; - } - - if (slice >= static_cast(slices_->GetSlicesCount())) - { - slice = static_cast(slices_->GetSlicesCount()) - 1; - } - - if (slice != static_cast(slice_)) - { - SetSlice(slice); - } - } - } - - void SetSlice(size_t slice) - { - if (slices_.get() != NULL) - { - slice_ = slice; - - std::unique_ptr tmp(slices_->GetSlice(slice_)); - widget_.SetSlice(tmp->GetGeometry()); - } - } - }; - - - - class ReferenceLineSource : public IVolumeSlicer - { - private: - class RendererFactory : public LayerReadyMessage::IRendererFactory - { - private: - double x1_; - double y1_; - double x2_; - double y2_; - const OrthancStone::CoordinateSystem3D& slice_; - - public: - RendererFactory(double x1, - double y1, - double x2, - double y2, - const OrthancStone::CoordinateSystem3D& slice) : - x1_(x1), - y1_(y1), - x2_(x2), - y2_(y2), - slice_(slice) - { - } - - virtual ILayerRenderer* CreateRenderer() const - { - return new LineLayerRenderer(x1_, y1_, x2_, y2_, slice_); - } - }; - - SliceViewerWidget& otherPlane_; - - public: - ReferenceLineSource(OrthancStone::MessageBroker& broker, - SliceViewerWidget& otherPlane) : - IVolumeSlicer(broker), - otherPlane_(otherPlane) - { - BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); - } - - virtual bool GetExtent(std::vector& points, - const OrthancStone::CoordinateSystem3D& viewportSlice) - { - return false; - } - - virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) - { - Slice reference(viewportSlice, 0.001); - - OrthancStone::Vector p, d; - - const OrthancStone::CoordinateSystem3D& slice = otherPlane_.GetSlice(); - - // Compute the line of intersection between the two slices - if (!OrthancStone::GeometryToolbox::IntersectTwoPlanes(p, d, - slice.GetOrigin(), slice.GetNormal(), - viewportSlice.GetOrigin(), viewportSlice.GetNormal())) - { - // The two slice are parallel, don't try and display the intersection - BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, reference.GetGeometry())); - } - else - { - double x1, y1, x2, y2; - viewportSlice.ProjectPoint(x1, y1, p); - viewportSlice.ProjectPoint(x2, y2, p + 1000.0 * d); - - const OrthancStone::Extent2D extent = otherPlane_.GetSceneExtent(); - - if (OrthancStone::GeometryToolbox::ClipLineToRectangle(x1, y1, x2, y2, - x1, y1, x2, y2, - extent.GetX1(), extent.GetY1(), - extent.GetX2(), extent.GetY2())) - { - RendererFactory factory(x1, y1, x2, y2, slice); - BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, reference.GetGeometry())); - } - else - { - // Error: Parallel slices - BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, reference.GetGeometry())); - } - } - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/FontRenderer.cpp --- a/Framework/Fonts/FontRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "FontRenderer.h" - -#include "../Toolbox/DynamicBitmap.h" - -#include - - -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H - - -// https://stackoverflow.com/questions/31161284/how-can-i-get-the-corresponding-error-string-from-an-ft-error-code -static std::string GetErrorMessage(FT_Error err) -{ -#undef __FTERRORS_H__ -#define FT_ERRORDEF( e, v, s ) case e: return s; -#define FT_ERROR_START_LIST switch (err) { -#define FT_ERROR_END_LIST } -#include FT_ERRORS_H - return "(Unknown error)"; -} - - -static void CheckError(FT_Error err) -{ - if (err != 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Error in FreeType: " + GetErrorMessage(err)); - } -} - - -namespace OrthancStone -{ - class FontRenderer::PImpl : public boost::noncopyable - { - private: - std::string fontContent_; - FT_Library library_; - FT_Face face_; - - void Clear() - { - if (face_ != NULL) - { - FT_Done_Face(face_); - face_ = NULL; - } - - fontContent_.clear(); - } - - public: - PImpl() : - library_(NULL), - face_(NULL) - { - CheckError(FT_Init_FreeType(&library_)); - } - - - ~PImpl() - { - Clear(); - FT_Done_FreeType(library_); - } - - - void LoadFont(const std::string& fontContent, - unsigned int fontSize) - { - Clear(); - - // It is necessary to make a private copy of the font, as - // Freetype makes the assumption that the buffer containing the - // font is never deleted - fontContent_.assign(fontContent); - - const FT_Byte* data = reinterpret_cast(fontContent_.c_str()); - - CheckError(FT_New_Memory_Face( - library_, data, static_cast(fontContent_.size()), 0, &face_)); - - CheckError(FT_Set_Char_Size(face_, // handle to face object - 0, // char_width in 1/64th of points - fontSize * 64, // char_height in 1/64th of points - 72, // horizontal device resolution - 72)); // vertical device resolution - - CheckError(FT_Select_Charmap(face_, FT_ENCODING_UNICODE)); - } - - - Glyph* Render(uint32_t unicode) - { - if (face_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "First call LoadFont()"); - } - else if (FT_Load_Char(face_, unicode, FT_LOAD_RENDER) != 0) - { - // This character is not available - return NULL; - } - else - { - if (face_->glyph->format != FT_GLYPH_FORMAT_BITMAP) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - //CheckError(FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1)); - } - - Orthanc::ImageAccessor bitmap; - bitmap.AssignReadOnly(Orthanc::PixelFormat_Grayscale8, - face_->glyph->bitmap.width, - face_->glyph->bitmap.rows, - face_->glyph->bitmap.pitch, - face_->glyph->bitmap.buffer); - - std::unique_ptr glyph( - new Glyph(bitmap.GetWidth(), - bitmap.GetHeight(), - face_->glyph->bitmap_left, - -face_->glyph->bitmap_top, // Positive for an upwards vertical distance - face_->glyph->advance.x >> 6, - face_->glyph->metrics.vertAdvance >> 6)); - - glyph->SetPayload(new DynamicBitmap(bitmap)); - - return glyph.release(); - } - } - }; - - - - FontRenderer::FontRenderer() : - pimpl_(new PImpl) - { - } - - - void FontRenderer::LoadFont(const std::string& fontContent, - unsigned int fontSize) - { - pimpl_->LoadFont(fontContent, fontSize); - } - - - Glyph* FontRenderer::Render(uint32_t unicode) - { - return pimpl_->Render(unicode); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/FontRenderer.h --- a/Framework/Fonts/FontRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "Glyph.h" - -#include -#include - - -namespace OrthancStone -{ - class FontRenderer : public boost::noncopyable - { - private: - class PImpl; - boost::shared_ptr pimpl_; - - public: - FontRenderer(); - - void LoadFont(const std::string& fontContent, - unsigned int fontSize); - - Glyph* Render(uint32_t unicode); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/Glyph.cpp --- a/Framework/Fonts/Glyph.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Glyph.h" - -#include - - -namespace OrthancStone -{ - Glyph::Glyph(const Glyph& other) : - width_(other.width_), - height_(other.height_), - offsetLeft_(other.offsetLeft_), - offsetTop_(other.offsetTop_), - advanceX_(other.advanceX_), - lineHeight_(other.lineHeight_) - { - } - - - Glyph::Glyph(unsigned int width, - unsigned int height, - int offsetLeft, - int offsetTop, - int advanceX, - unsigned int lineHeight) : - width_(width), - height_(height), - offsetLeft_(offsetLeft), - offsetTop_(offsetTop), - advanceX_(advanceX), - lineHeight_(lineHeight) - { - } - - - void Glyph::SetPayload(Orthanc::IDynamicObject* payload) // Takes ownership - { - if (payload == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - payload_.reset(payload); - } - } - - - const Orthanc::IDynamicObject& Glyph::GetPayload() const - { - if (payload_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *payload_; - } - } - - - Orthanc::IDynamicObject* Glyph::ReleasePayload() - { - if (payload_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return payload_.release(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/Glyph.h --- a/Framework/Fonts/Glyph.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -#include - - -namespace OrthancStone -{ - class Glyph : public boost::noncopyable - { - private: - unsigned int width_; - unsigned int height_; - int offsetLeft_; - int offsetTop_; - int advanceX_; - unsigned int lineHeight_; - - std::unique_ptr payload_; - - public: - // WARNING: This does not copy the payload - Glyph(const Glyph& other); - - Glyph(unsigned int width, - unsigned int height, - int offsetLeft, - int offsetTop, - int advanceX, - unsigned int lineHeight); - - void SetPayload(Orthanc::IDynamicObject* payload); - - int GetOffsetLeft() const - { - return offsetLeft_; - } - - int GetOffsetTop() const - { - return offsetTop_; - } - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - unsigned int GetAdvanceX() const - { - return advanceX_; - } - - unsigned int GetLineHeight() const - { - return lineHeight_; - } - - bool HasPayload() const - { - return payload_.get() != NULL; - } - - const Orthanc::IDynamicObject& GetPayload() const; - - Orthanc::IDynamicObject* ReleasePayload(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphAlphabet.cpp --- a/Framework/Fonts/GlyphAlphabet.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GlyphAlphabet.h" - -#include -#include - - -namespace OrthancStone -{ - void GlyphAlphabet::Clear() - { - for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - content_.clear(); - lineHeight_ = 0; - } - - - void GlyphAlphabet::Register(uint32_t unicode, - const Glyph& glyph, - Orthanc::IDynamicObject* payload) - { - std::unique_ptr protection(payload); - - // Don't add twice the same character - if (content_.find(unicode) == content_.end()) - { - std::unique_ptr raii(new Glyph(glyph)); - - if (payload != NULL) - { - raii->SetPayload(protection.release()); - } - - content_[unicode] = raii.release(); - - lineHeight_ = std::max(lineHeight_, glyph.GetLineHeight()); - } - } - - - void GlyphAlphabet::Register(FontRenderer& renderer, - uint32_t unicode) - { - std::unique_ptr glyph(renderer.Render(unicode)); - - if (glyph.get() != NULL) - { - Register(unicode, *glyph, glyph->ReleasePayload()); - } - } - - -#if ORTHANC_ENABLE_LOCALE == 1 - bool GlyphAlphabet::GetUnicodeFromCodepage(uint32_t& unicode, - unsigned int index, - Orthanc::Encoding encoding) - { - if (index > 255) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string character; - character.resize(1); - character[0] = static_cast(index); - - std::string utf8 = Orthanc::Toolbox::ConvertToUtf8(character, encoding, false /* no code extensions */); - - if (utf8.empty()) - { - // This character is not available in this codepage - return false; - } - else - { - size_t length; - Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, length, utf8, 0); - assert(length != 0); - return true; - } - } -#endif - - - void GlyphAlphabet::Apply(IGlyphVisitor& visitor) const - { - for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it) - { - assert(it->second != NULL); - visitor.Visit(it->first, *it->second); - } - } - - - void GlyphAlphabet::Apply(ITextVisitor& visitor, - const std::string& utf8) const - { - size_t pos = 0; - int x = 0; - int y = 0; - - while (pos < utf8.size()) - { - if (utf8[pos] == '\r') - { - // Ignore carriage return - pos++; - } - else if (utf8[pos] == '\n') - { - // This is a newline character - x = 0; - y += static_cast(lineHeight_); - - pos++; - } - else - { - uint32_t unicode; - size_t length; - Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, length, utf8, pos); - - Content::const_iterator glyph = content_.find(unicode); - - if (glyph != content_.end()) - { - assert(glyph->second != NULL); - const Orthanc::IDynamicObject* payload = - (glyph->second->HasPayload() ? &glyph->second->GetPayload() : NULL); - - visitor.Visit(unicode, - x + glyph->second->GetOffsetLeft(), - y + glyph->second->GetOffsetTop(), - glyph->second->GetWidth(), - glyph->second->GetHeight(), - payload); - x += glyph->second->GetAdvanceX(); - } - - assert(length != 0); - pos += length; - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphAlphabet.h --- a/Framework/Fonts/GlyphAlphabet.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "FontRenderer.h" - -#include - -#include - -namespace OrthancStone -{ - class GlyphAlphabet : public boost::noncopyable - { - public: - class ITextVisitor : public boost::noncopyable - { - public: - virtual ~ITextVisitor() - { - } - - virtual void Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload /* can be NULL */) = 0; - }; - - - class IGlyphVisitor : public boost::noncopyable - { - public: - virtual ~IGlyphVisitor() - { - } - - virtual void Visit(uint32_t unicode, - const Glyph& glyph) = 0; - }; - - - private: - typedef std::map Content; - - Content content_; - unsigned int lineHeight_; - - public: - GlyphAlphabet() : - lineHeight_(0) - { - } - - ~GlyphAlphabet() - { - Clear(); - } - - void Clear(); - - void Register(uint32_t unicode, - const Glyph& glyph, - Orthanc::IDynamicObject* payload); - - void Register(FontRenderer& renderer, - uint32_t unicode); - -#if ORTHANC_ENABLE_LOCALE == 1 - static bool GetUnicodeFromCodepage(uint32_t& unicode, - unsigned int index, - Orthanc::Encoding encoding); -#endif - - size_t GetSize() const - { - return content_.size(); - } - - void Apply(IGlyphVisitor& visitor) const; - - void Apply(ITextVisitor& visitor, - const std::string& utf8) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphBitmapAlphabet.cpp --- a/Framework/Fonts/GlyphBitmapAlphabet.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GlyphBitmapAlphabet.h" - -#include "TextBoundingBox.h" -#include "../Toolbox/DynamicBitmap.h" - -#include -#include - -namespace OrthancStone -{ - class GlyphBitmapAlphabet::RenderTextVisitor : public GlyphAlphabet::ITextVisitor - { - private: - Orthanc::ImageAccessor& target_; - const GlyphBitmapAlphabet& that_; - int offsetX_; - int offsetY_; - - public: - RenderTextVisitor(Orthanc::ImageAccessor& target, - const GlyphBitmapAlphabet& that, - int offsetX, - int offsetY) : - target_(target), - that_(that), - offsetX_(offsetX), - offsetY_(offsetY) - { - } - - virtual void Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload) - { - int left = x + offsetX_; - int top = y + offsetY_; - - assert(payload != NULL); - const DynamicBitmap& glyph = *dynamic_cast(payload); - - assert(left >= 0 && - top >= 0 && - static_cast(left) + width <= target_.GetWidth() && - static_cast(top) + height <= target_.GetHeight() && - width == glyph.GetBitmap().GetWidth() && - height == glyph.GetBitmap().GetHeight()); - - { - Orthanc::ImageAccessor region; - target_.GetRegion(region, left, top, width, height); - Orthanc::ImageProcessing::Copy(region, glyph.GetBitmap()); - } - } - }; - - -#if ORTHANC_ENABLE_LOCALE == 1 - void GlyphBitmapAlphabet::LoadCodepage(FontRenderer& renderer, - Orthanc::Encoding codepage) - { - for (unsigned int i = 0; i < 256; i++) - { - uint32_t unicode; - if (GlyphAlphabet::GetUnicodeFromCodepage(unicode, i, codepage)) - { - AddUnicodeCharacter(renderer, unicode); - } - } - } -#endif - - - Orthanc::ImageAccessor* GlyphBitmapAlphabet::RenderText(const std::string& utf8) const - { - TextBoundingBox box(alphabet_, utf8); - - std::unique_ptr bitmap( - new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, - box.GetWidth(), box.GetHeight(), - true /* force minimal pitch */)); - - Orthanc::ImageProcessing::Set(*bitmap, 0); - - RenderTextVisitor visitor(*bitmap, *this, -box.GetLeft(), -box.GetTop()); - alphabet_.Apply(visitor, utf8); - - return bitmap.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphBitmapAlphabet.h --- a/Framework/Fonts/GlyphBitmapAlphabet.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "GlyphAlphabet.h" - -#include - -namespace OrthancStone -{ - class GlyphBitmapAlphabet : public boost::noncopyable - { - private: - class RenderTextVisitor; - - GlyphAlphabet alphabet_; - - public: - const GlyphAlphabet& GetAlphabet() const - { - return alphabet_; - } - - void AddUnicodeCharacter(FontRenderer& renderer, - uint32_t unicode) - { - alphabet_.Register(renderer, unicode); - } - - -#if ORTHANC_ENABLE_LOCALE == 1 - void LoadCodepage(FontRenderer& renderer, - Orthanc::Encoding codepage); -#endif - - - Orthanc::ImageAccessor* RenderText(const std::string& utf8) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphTextureAlphabet.cpp --- a/Framework/Fonts/GlyphTextureAlphabet.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,304 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GlyphTextureAlphabet.h" - -#include "TextBoundingBox.h" -#include "../Toolbox/DynamicBitmap.h" - -#include -#include -#include - -#if defined(__EMSCRIPTEN__) -/* -Avoid this error: -.../boost/math/special_functions/round.hpp:86:12: warning: implicit conversion from 'std::__2::numeric_limits::type' (aka 'int') to 'float' changes value from 2147483647 to 2147483648 [-Wimplicit-int-float-conversion] -.../boost/math/special_functions/round.hpp:93:11: note: in instantiation of function template specialization 'boost::math::iround >' requested here -.../orthanc-stone/Framework/Fonts/GlyphTextureAlphabet.cpp:92:28: note: in instantiation of function template specialization 'boost::math::iround' requested here -*/ -#pragma GCC diagnostic ignored "-Wimplicit-int-float-conversion" -#endif - -#include - -namespace OrthancStone -{ - class GlyphTextureAlphabet::GlyphSizeVisitor : public GlyphAlphabet::IGlyphVisitor - { - private: - unsigned int maxWidth_; - unsigned int maxHeight_; - - public: - GlyphSizeVisitor() : - maxWidth_(0), - maxHeight_(0) - { - } - - virtual void Visit(uint32_t unicode, - const Glyph& glyph) - { - maxWidth_ = std::max(maxWidth_, glyph.GetWidth()); - maxHeight_ = std::max(maxHeight_, glyph.GetHeight()); - } - - unsigned int GetMaxWidth() const - { - return maxWidth_; - } - - unsigned int GetMaxHeight() const - { - return maxHeight_; - } - }; - - - class GlyphTextureAlphabet::TextureGenerator : public GlyphAlphabet::IGlyphVisitor - { - private: - std::unique_ptr texture_; - - unsigned int countColumns_; - unsigned int countRows_; - GlyphAlphabet& targetAlphabet_; - unsigned int glyphMaxWidth_; - unsigned int glyphMaxHeight_; - unsigned int column_; - unsigned int row_; - - public: - TextureGenerator(GlyphAlphabet& targetAlphabet, - unsigned int countGlyphs, - unsigned int glyphMaxWidth, - unsigned int glyphMaxHeight) : - targetAlphabet_(targetAlphabet), - glyphMaxWidth_(glyphMaxWidth), - glyphMaxHeight_(glyphMaxHeight), - column_(0), - row_(0) - { - int c = boost::math::iround(sqrt(static_cast(countGlyphs))); - - if (c <= 0) - { - countColumns_ = 1; - } - else - { - countColumns_ = static_cast(c); - } - - countRows_ = countGlyphs / countColumns_; - if (countGlyphs % countColumns_ != 0) - { - countRows_++; - } - - texture_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, - countColumns_ * glyphMaxWidth_, - countRows_ * glyphMaxHeight_, - true /* force minimal pitch */)); - - Orthanc::ImageProcessing::Set(*texture_, 0, 0, 0, 0); - } - - - virtual void Visit(uint32_t unicode, - const Glyph& glyph) - { - if (!glyph.HasPayload()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - if (column_ >= countColumns_ || - row_ >= countRows_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - unsigned int x = column_ * glyphMaxWidth_; - unsigned int y = row_ * glyphMaxHeight_; - - const Orthanc::ImageAccessor& source = dynamic_cast(glyph.GetPayload()).GetBitmap(); - - if (source.GetFormat() != Orthanc::PixelFormat_Grayscale8) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - targetAlphabet_.Register(unicode, glyph, new TextureLocation(x, y)); - - Orthanc::ImageAccessor target; - texture_->GetRegion(target, x, y, source.GetWidth(), source.GetHeight()); - - //Orthanc::ImageProcessing::Copy(target, bitmap->GetBitmap()); - - for (unsigned int y = 0; y < source.GetHeight(); y++) - { - const uint8_t* p = reinterpret_cast(source.GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < source.GetWidth(); x++) - { - // Premultiplied alpha - q[0] = 0; - q[1] = 0; - q[2] = 0; - q[3] = *p; - - p++; - q += 4; - } - } - - column_++; - if (column_ == countColumns_) - { - column_ = 0; - row_++; - } - } - - - Orthanc::ImageAccessor* ReleaseTexture() - { - return texture_.release(); - } - }; - - - class GlyphTextureAlphabet::RenderTextVisitor : public GlyphAlphabet::ITextVisitor - { - private: - Orthanc::ImageAccessor& target_; - const Orthanc::ImageAccessor& texture_; - int offsetX_; - int offsetY_; - - public: - RenderTextVisitor(Orthanc::ImageAccessor& target, - const GlyphTextureAlphabet& that, - int offsetX, - int offsetY) : - target_(target), - texture_(that.GetTexture()), - offsetX_(offsetX), - offsetY_(offsetY) - { - } - - virtual void Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload) - { - int left = x + offsetX_; - int top = y + offsetY_; - - assert(payload != NULL); - const TextureLocation& location = *dynamic_cast(payload); - - assert(left >= 0 && - top >= 0 && - static_cast(left) + width <= target_.GetWidth() && - static_cast(top) + height <= target_.GetHeight()); - - { - Orthanc::ImageAccessor to; - target_.GetRegion(to, left, top, width, height); - - Orthanc::ImageAccessor from; - texture_.GetRegion(from, location.GetX(), location.GetY(), width, height); - - Orthanc::ImageProcessing::Copy(to, from); - } - } - }; - - - GlyphTextureAlphabet::GlyphTextureAlphabet(const GlyphBitmapAlphabet& sourceAlphabet) : - textureWidth_(0), - textureHeight_(0) - { - GlyphSizeVisitor size; - sourceAlphabet.GetAlphabet().Apply(size); - - TextureGenerator generator(alphabet_, - static_cast(sourceAlphabet.GetAlphabet().GetSize()), - size.GetMaxWidth(), - size.GetMaxHeight()); - sourceAlphabet.GetAlphabet().Apply(generator); - - texture_.reset(generator.ReleaseTexture()); - textureWidth_ = texture_->GetWidth(); - textureHeight_ = texture_->GetHeight(); - } - - - const Orthanc::ImageAccessor& GlyphTextureAlphabet::GetTexture() const - { - if (texture_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *texture_; - } - } - - - Orthanc::ImageAccessor* GlyphTextureAlphabet::ReleaseTexture() - { - if (texture_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return texture_.release(); - } - } - - - Orthanc::ImageAccessor* GlyphTextureAlphabet::RenderText(const std::string& utf8) - { - TextBoundingBox box(alphabet_, utf8); - - std::unique_ptr bitmap( - new Orthanc::Image(Orthanc::PixelFormat_RGBA32, - box.GetWidth(), box.GetHeight(), - true /* force minimal pitch */)); - - Orthanc::ImageProcessing::Set(*bitmap, 0, 0, 0, 0); - - RenderTextVisitor visitor(*bitmap, *this, -box.GetLeft(), -box.GetTop()); - alphabet_.Apply(visitor, utf8); - - return bitmap.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/GlyphTextureAlphabet.h --- a/Framework/Fonts/GlyphTextureAlphabet.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "GlyphBitmapAlphabet.h" - -#include - -namespace OrthancStone -{ - class GlyphTextureAlphabet : public boost::noncopyable - { - public: - class TextureLocation : public Orthanc::IDynamicObject - { - private: - unsigned int x_; - unsigned int y_; - - public: - TextureLocation(unsigned int x, - unsigned int y) : - x_(x), - y_(y) - { - } - - unsigned int GetX() const - { - return x_; - } - - unsigned int GetY() const - { - return y_; - } - }; - - private: - class GlyphSizeVisitor; - class TextureGenerator; - class RenderTextVisitor; - - GlyphAlphabet alphabet_; - std::unique_ptr texture_; - unsigned int textureWidth_; - unsigned int textureHeight_; - - public: - GlyphTextureAlphabet(const GlyphBitmapAlphabet& sourceAlphabet); - - const Orthanc::ImageAccessor& GetTexture() const; - - Orthanc::ImageAccessor* ReleaseTexture(); - - Orthanc::ImageAccessor* RenderText(const std::string& utf8); - - const GlyphAlphabet& GetAlphabet() const - { - return alphabet_; - } - - unsigned int GetTextureWidth() const - { - return textureWidth_; - } - - unsigned int GetTextureHeight() const - { - return textureHeight_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/OpenGLTextCoordinates.cpp --- a/Framework/Fonts/OpenGLTextCoordinates.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLTextCoordinates.h" - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - void OpenGLTextCoordinates::Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload) - { - // Rendering coordinates - float rx1 = static_cast(x - box_.GetLeft()); - float ry1 = static_cast(y - box_.GetTop()); - float rx2 = rx1 + static_cast(width); - float ry2 = ry1 + static_cast(height); - - // Texture coordinates - assert(payload != NULL); - const GlyphTextureAlphabet::TextureLocation& location = - *dynamic_cast(payload); - - float tx1 = location.GetX() / textureWidth_; - float ty1 = location.GetY() / textureHeight_; - float tx2 = tx1 + (static_cast(width) / textureWidth_); - float ty2 = ty1 + (static_cast(height) / textureHeight_); - - const float rpos[6][2] = { - { rx1, ry1 }, - { rx1, ry2 }, - { rx2, ry1 }, - { rx2, ry1 }, - { rx1, ry2 }, - { rx2, ry2 } - }; - - const float tpos[6][2] = { - { tx1, ty1 }, - { tx1, ty2 }, - { tx2, ty1 }, - { tx2, ty1 }, - { tx1, ty2 }, - { tx2, ty2 } - }; - - for (unsigned int i = 0; i < 6; i++) - { - renderingCoords_.push_back(rpos[i][0]); - renderingCoords_.push_back(rpos[i][1]); - textureCoords_.push_back(tpos[i][0]); - textureCoords_.push_back(tpos[i][1]); - } - } - - - OpenGLTextCoordinates::OpenGLTextCoordinates(const GlyphTextureAlphabet& alphabet, - const std::string& utf8) : - box_(alphabet.GetAlphabet(), utf8), - textureWidth_(static_cast(alphabet.GetTextureWidth())), - textureHeight_(static_cast(alphabet.GetTextureHeight())) - { - if (textureWidth_ <= 0 || - textureHeight_ <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - width_ = static_cast(box_.GetWidth()); - height_ = static_cast(box_.GetHeight()); - - // Each character is made of two 2D triangles (= 2 * 3 * 2 = 12) - renderingCoords_.reserve(box_.GetCharactersCount() * 12); - textureCoords_.reserve(box_.GetCharactersCount() * 12); - - alphabet.GetAlphabet().Apply(*this, utf8); - } - - - const std::vector& OpenGLTextCoordinates::GetRenderingCoords() const - { - assert(renderingCoords_.size() == textureCoords_.size()); - return renderingCoords_; - } - - - const std::vector& OpenGLTextCoordinates::GetTextureCoords() const - { - assert(renderingCoords_.size() == textureCoords_.size()); - return textureCoords_; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/OpenGLTextCoordinates.h --- a/Framework/Fonts/OpenGLTextCoordinates.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "GlyphTextureAlphabet.h" -#include "TextBoundingBox.h" - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class OpenGLTextCoordinates : protected GlyphAlphabet::ITextVisitor - { - private: - TextBoundingBox box_; - float width_; - float height_; - std::vector renderingCoords_; - std::vector textureCoords_; - float textureWidth_; - float textureHeight_; - - protected: - virtual void Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload); - - public: - OpenGLTextCoordinates(const GlyphTextureAlphabet& alphabet, - const std::string& utf8); - - unsigned int GetTextWidth() const - { - return box_.GetWidth(); - } - - unsigned int GetTextHeight() const - { - return box_.GetHeight(); - } - - bool IsEmpty() const - { - return renderingCoords_.empty(); - } - - const std::vector& GetRenderingCoords() const; - - const std::vector& GetTextureCoords() const; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/TextBoundingBox.cpp --- a/Framework/Fonts/TextBoundingBox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TextBoundingBox.h" - -namespace OrthancStone -{ - void TextBoundingBox::AddPoint(int x, - int y) - { - left_ = std::min(left_, x); - right_ = std::max(right_, x); - top_ = std::min(top_, y); - bottom_ = std::max(bottom_, y); - } - - - void TextBoundingBox::Clear() - { - left_ = 0; - top_ = 0; - right_ = 0; - bottom_ = 0; - countCharacters_ = 0; - } - - - void TextBoundingBox::Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload /* ignored */) - { - AddPoint(x, y); - AddPoint(x + static_cast(width), - y + static_cast(height)); - countCharacters_++; - } - - - TextBoundingBox::TextBoundingBox(const GlyphAlphabet& alphabet, - const std::string& utf8) - { - Clear(); - alphabet.Apply(*this, utf8); - } - - - unsigned int TextBoundingBox::GetWidth() const - { - assert(left_ <= right_); - return static_cast(right_ - left_ + 1); - } - - - unsigned int TextBoundingBox::GetHeight() const - { - assert(top_ <= bottom_); - return static_cast(bottom_ - top_ + 1); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Fonts/TextBoundingBox.h --- a/Framework/Fonts/TextBoundingBox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "GlyphAlphabet.h" - -namespace OrthancStone -{ - class TextBoundingBox : protected GlyphAlphabet::ITextVisitor - { - private: - int left_; - int top_; - int right_; - int bottom_; - unsigned int countCharacters_; - - void AddPoint(int x, - int y); - - void Clear(); - - protected: - virtual void Visit(uint32_t unicode, - int x, - int y, - unsigned int width, - unsigned int height, - const Orthanc::IDynamicObject* payload /* ignored */); - - public: - TextBoundingBox(const GlyphAlphabet& alphabet, - const std::string& utf8); - - int GetLeft() const - { - return left_; - } - - int GetTop() const - { - return top_; - } - - unsigned int GetWidth() const; - - unsigned int GetHeight() const; - - unsigned int GetCharactersCount() const - { - return countCharacters_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/BasicFetchingItemsSorter.cpp --- a/Framework/Loaders/BasicFetchingItemsSorter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "BasicFetchingItemsSorter.h" - -#include - -namespace OrthancStone -{ - BasicFetchingItemsSorter::BasicFetchingItemsSorter(unsigned int itemsCount) : - itemsCount_(itemsCount) - { - if (itemsCount == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void BasicFetchingItemsSorter::Sort(std::vector& target, - unsigned int current) - { - if (current >= itemsCount_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - target.clear(); - target.reserve(itemsCount_); - target.push_back(current); - - const unsigned int countBelow = current; - const unsigned int countAbove = (itemsCount_ - 1) - current; - const unsigned int n = std::min(countBelow, countAbove); - - for (unsigned int i = 1; i <= n; i++) - { - assert(current + i < itemsCount_ && - current >= i); - target.push_back(current + i); - target.push_back(current - i); - } - - for (unsigned int i = current - n; i > 0; i--) - { - target.push_back(i - 1); - } - - for (unsigned int i = current + n + 1; i < itemsCount_; i++) - { - target.push_back(i); - } - - assert(target.size() == itemsCount_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/BasicFetchingItemsSorter.h --- a/Framework/Loaders/BasicFetchingItemsSorter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IFetchingItemsSorter.h" - -namespace OrthancStone -{ - class BasicFetchingItemsSorter : public IFetchingItemsSorter - { - private: - unsigned int itemsCount_; - - public: - class Factory : public IFactory - { - public: - virtual IFetchingItemsSorter* CreateSorter(unsigned int itemsCount) const - { - return new BasicFetchingItemsSorter(itemsCount); - } - }; - - BasicFetchingItemsSorter(unsigned int itemsCount); - - virtual unsigned int GetItemsCount() const - { - return itemsCount_; - } - - virtual void Sort(std::vector& target, - unsigned int current); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/BasicFetchingStrategy.cpp --- a/Framework/Loaders/BasicFetchingStrategy.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "BasicFetchingStrategy.h" - -#include - -namespace OrthancStone -{ - void BasicFetchingStrategy::Schedule(unsigned int item, - unsigned int quality) - { - assert(item < GetItemsCount() && - quality <= maxQuality_); - - if (nextQuality_[item] <= quality) - { - content_.push_back(ContentItem(item, quality)); - } - } - - - BasicFetchingStrategy::BasicFetchingStrategy(IFetchingItemsSorter* sorter, // Takes ownership - unsigned int maxQuality) : - sorter_(sorter), - maxQuality_(maxQuality), - position_(0), - blockSize_(2) - { - if (sorter == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - nextQuality_.resize(sorter_->GetItemsCount(), 0); // Does not change along calls to "SetCurrent()" - - SetCurrent(0); - } - - - void BasicFetchingStrategy::SetBlockSize(unsigned int size) - { - if (size <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - blockSize_ = size; - } - - - bool BasicFetchingStrategy::GetNext(unsigned int& item, - unsigned int& quality) - { - if (position_ >= content_.size()) - { - return false; - } - else - { - item = content_[position_].GetItem(); - quality = content_[position_].GetQuality(); - - assert(nextQuality_[item] <= quality); - nextQuality_[item] = quality + 1; - - position_ ++; - return true; - } - } - - - void BasicFetchingStrategy::SetCurrent(unsigned int item) - { - // TODO - This function is O(N) complexity where "N" is the - // number of items times the max quality. Could use a LRU index. - - position_ = 0; - - std::vector v; - sorter_->Sort(v, item); - - assert(v.size() == GetItemsCount()); - - if (v.size() == 0) - { - return; - } - - content_.clear(); - content_.reserve(v.size() * maxQuality_); - - Schedule(v.front(), maxQuality_); - - for (unsigned int q = 0; q <= maxQuality_; q++) - { - unsigned int start = 1 + q * blockSize_; - unsigned int end = start + blockSize_; - - if (q == maxQuality_ || - end > v.size()) - { - end = static_cast(v.size()); - } - - unsigned int a = 0; - if (maxQuality_ >= q + 1) - { - a = maxQuality_ - q - 1; - } - - for (unsigned int j = a; j <= maxQuality_; j++) - { - for (unsigned int i = start; i < end; i++) - { - Schedule(v[i], j); - } - } - } - } - - - void BasicFetchingStrategy::RecycleFurthest(unsigned int& item) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/BasicFetchingStrategy.h --- a/Framework/Loaders/BasicFetchingStrategy.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IFetchingItemsSorter.h" -#include "IFetchingStrategy.h" - -#include - -#include - -namespace OrthancStone -{ - class BasicFetchingStrategy : public IFetchingStrategy - { - private: - class ContentItem - { - private: - unsigned int item_; - unsigned int quality_; - - public: - ContentItem(unsigned int item, - unsigned int quality) : - item_(item), - quality_(quality) - { - } - - unsigned int GetItem() const - { - return item_; - } - - unsigned int GetQuality() const - { - return quality_; - } - }; - - std::unique_ptr sorter_; - std::vector nextQuality_; - unsigned int maxQuality_; - std::vector content_; - size_t position_; - unsigned int blockSize_; - - void Schedule(unsigned int item, - unsigned int quality); - - public: - BasicFetchingStrategy(IFetchingItemsSorter* sorter, // Takes ownership - unsigned int maxQuality); - - virtual unsigned int GetItemsCount() const - { - return sorter_->GetItemsCount(); - } - - virtual unsigned int GetMaxQuality() const - { - return maxQuality_; - } - - // WARNING - This parameters is only considered during the next - // call to SetCurrent(). - void SetBlockSize(unsigned int size); - - virtual bool GetNext(unsigned int& item, - unsigned int& quality); - - virtual void SetCurrent(unsigned int item); - - virtual void RecycleFurthest(unsigned int& item); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomResourcesLoader.cpp --- a/Framework/Loaders/DicomResourcesLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,910 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomResourcesLoader.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "../Oracle/ParseDicomFromFileCommand.h" -# include -# include -#endif - -#include - -namespace OrthancStone -{ - static std::string GetUri(Orthanc::ResourceType level) - { - switch (level) - { - case Orthanc::ResourceType_Patient: - return "patients"; - - case Orthanc::ResourceType_Study: - return "studies"; - - case Orthanc::ResourceType_Series: - return "series"; - - case Orthanc::ResourceType_Instance: - return "instances"; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - class DicomResourcesLoader::Handler : public Orthanc::IDynamicObject - { - private: - boost::shared_ptr loader_; - boost::shared_ptr target_; - int priority_; - DicomSource source_; - boost::shared_ptr userPayload_; - - public: - Handler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr userPayload) : - loader_(loader), - target_(target), - priority_(priority), - source_(source), - userPayload_(userPayload) - { - if (!loader || - !target) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - virtual ~Handler() - { - } - - void BroadcastSuccess() - { - SuccessMessage message(*loader_, target_, priority_, source_, userPayload_.get()); - loader_->BroadcastMessage(message); - } - - boost::shared_ptr GetLoader() - { - assert(loader_); - return loader_; - } - - boost::shared_ptr GetTarget() - { - assert(target_); - return target_; - } - - int GetPriority() const - { - return priority_; - } - - const DicomSource& GetSource() const - { - return source_; - } - - const boost::shared_ptr GetUserPayload() const - { - return userPayload_; - } - }; - - - class DicomResourcesLoader::StringHandler : public DicomResourcesLoader::Handler - { - public: - StringHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr userPayload) : - Handler(loader, target, priority, source, userPayload) - { - } - - virtual void HandleJson(const Json::Value& body) = 0; - - virtual void HandleString(const std::string& body) - { - Json::Reader reader; - Json::Value value; - if (reader.parse(body, value)) - { - HandleJson(value); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - }; - - - class DicomResourcesLoader::DicomWebHandler : public StringHandler - { - public: - DicomWebHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr userPayload) : - StringHandler(loader, target, priority, source, userPayload) - { - } - - virtual void HandleJson(const Json::Value& body) - { - GetTarget()->AddFromDicomWeb(body); - BroadcastSuccess(); - } - }; - - - class DicomResourcesLoader::OrthancHandler : public StringHandler - { - private: - boost::shared_ptr remainingCommands_; - - protected: - void CloseCommand() - { - assert(remainingCommands_); - - if (*remainingCommands_ == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - (*remainingCommands_) --; - - if (*remainingCommands_ == 0) - { - BroadcastSuccess(); - } - } - - public: - OrthancHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload) : - StringHandler(loader, target, priority, source, userPayload), - remainingCommands_(remainingCommands) - { - if (!remainingCommands) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - (*remainingCommands) ++; - } - - boost::shared_ptr GetRemainingCommands() - { - assert(remainingCommands_); - return remainingCommands_; - } - }; - - - class DicomResourcesLoader::OrthancInstanceTagsHandler : public OrthancHandler - { - public: - OrthancInstanceTagsHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload) : - OrthancHandler(loader, target, priority, source, remainingCommands, userPayload) - { - } - - virtual void HandleJson(const Json::Value& body) - { - GetTarget()->AddFromOrthanc(body); - CloseCommand(); - } - }; - - - class DicomResourcesLoader::OrthancOneChildInstanceHandler : public OrthancHandler - { - public: - OrthancOneChildInstanceHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload) : - OrthancHandler(loader, target, priority, source, remainingCommands, userPayload) - { - } - - virtual void HandleJson(const Json::Value& body) - { - static const char* const ID = "ID"; - - if (body.type() == Json::arrayValue) - { - if (body.size() > 0) - { - if (body[0].type() == Json::objectValue && - body[0].isMember(ID) && - body[0][ID].type() == Json::stringValue) - { - GetLoader()->ScheduleLoadOrthancInstanceTags - (GetTarget(), GetPriority(), GetSource(), body[0][ID].asString(), GetRemainingCommands(), GetUserPayload()); - CloseCommand(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - }; - - - class DicomResourcesLoader::OrthancAllChildrenInstancesHandler : public OrthancHandler - { - private: - Orthanc::ResourceType bottomLevel_; - - public: - OrthancAllChildrenInstancesHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr remainingCommands, - Orthanc::ResourceType bottomLevel, - boost::shared_ptr userPayload) : - OrthancHandler(loader, target, priority, source, remainingCommands, userPayload), - bottomLevel_(bottomLevel) - { - } - - virtual void HandleJson(const Json::Value& body) - { - static const char* const ID = "ID"; - static const char* const INSTANCES = "Instances"; - - if (body.type() == Json::arrayValue) - { - for (Json::Value::ArrayIndex i = 0; i < body.size(); i++) - { - switch (bottomLevel_) - { - case Orthanc::ResourceType_Patient: - case Orthanc::ResourceType_Study: - if (body[i].type() == Json::objectValue && - body[i].isMember(ID) && - body[i][ID].type() == Json::stringValue) - { - GetLoader()->ScheduleLoadOrthancOneChildInstance - (GetTarget(), GetPriority(), GetSource(), bottomLevel_, - body[i][ID].asString(), GetRemainingCommands(), GetUserPayload()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - break; - - case Orthanc::ResourceType_Series: - // At the series level, avoid a call to - // "/series/.../instances", as we already have this - // information in the JSON - if (body[i].type() == Json::objectValue && - body[i].isMember(INSTANCES) && - body[i][INSTANCES].type() == Json::arrayValue) - { - if (body[i][INSTANCES].size() > 0) - { - if (body[i][INSTANCES][0].type() == Json::stringValue) - { - GetLoader()->ScheduleLoadOrthancInstanceTags - (GetTarget(), GetPriority(), GetSource(), - body[i][INSTANCES][0].asString(), GetRemainingCommands(), GetUserPayload()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - } - - break; - - case Orthanc::ResourceType_Instance: - if (body[i].type() == Json::objectValue && - body[i].isMember(ID) && - body[i][ID].type() == Json::stringValue) - { - GetLoader()->ScheduleLoadOrthancInstanceTags - (GetTarget(), GetPriority(), GetSource(), - body[i][ID].asString(), GetRemainingCommands(), GetUserPayload()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - - CloseCommand(); - } - }; - - -#if ORTHANC_ENABLE_DCMTK == 1 - static void ExploreDicomDir(OrthancStone::LoadedDicomResources& instances, - const Orthanc::ParsedDicomDir& dicomDir, - Orthanc::ResourceType level, - size_t index, - const Orthanc::DicomMap& parent) - { - std::string expectedType; - - switch (level) - { - case Orthanc::ResourceType_Patient: - expectedType = "PATIENT"; - break; - - case Orthanc::ResourceType_Study: - expectedType = "STUDY"; - break; - - case Orthanc::ResourceType_Series: - expectedType = "SERIES"; - break; - - case Orthanc::ResourceType_Instance: - expectedType = "IMAGE"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - for (;;) - { - std::unique_ptr current(dicomDir.GetItem(index).Clone()); - current->RemoveBinaryTags(); - current->Merge(parent); - - std::string type; - if (!current->LookupStringValue(type, Orthanc::DICOM_TAG_DIRECTORY_RECORD_TYPE, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (type == expectedType) - { - if (level == Orthanc::ResourceType_Instance) - { - instances.AddResource(*current); - } - else - { - size_t lower; - if (dicomDir.LookupLower(lower, index)) - { - ExploreDicomDir(instances, dicomDir, Orthanc::GetChildResourceType(level), lower, *current); - } - } - } - - size_t next; - if (dicomDir.LookupNext(next, index)) - { - index = next; - } - else - { - return; - } - } - } -#endif - - -#if ORTHANC_ENABLE_DCMTK == 1 - void DicomResourcesLoader::GetDicomDirInstances(LoadedDicomResources& target, - const Orthanc::ParsedDicomDir& dicomDir) - { - Orthanc::DicomMap parent; - ExploreDicomDir(target, dicomDir, Orthanc::ResourceType_Patient, 0, parent); - } -#endif - - -#if ORTHANC_ENABLE_DCMTK == 1 - class DicomResourcesLoader::DicomDirHandler : public StringHandler - { - public: - DicomDirHandler(boost::shared_ptr loader, - boost::shared_ptr target, - int priority, - const DicomSource& source, - boost::shared_ptr userPayload) : - StringHandler(loader, target, priority, source, userPayload) - { - } - - virtual void HandleJson(const Json::Value& body) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - virtual void HandleString(const std::string& body) - { - Orthanc::ParsedDicomDir dicomDir(body); - GetDicomDirInstances(*GetTarget(), dicomDir); - BroadcastSuccess(); - } - }; -#endif - - - void DicomResourcesLoader::Handle(const HttpCommand::SuccessMessage& message) - { - if (message.GetOrigin().HasPayload()) - { - dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetAnswer()); - } - } - - - void DicomResourcesLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) - { - if (message.GetOrigin().HasPayload()) - { - dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetAnswer()); - } - } - - - void DicomResourcesLoader::Handle(const ReadFileCommand::SuccessMessage& message) - { - if (message.GetOrigin().HasPayload()) - { - dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetContent()); - } - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - void DicomResourcesLoader::Handle(const ParseDicomSuccessMessage& message) - { - if (message.GetOrigin().HasPayload()) - { - Handler& handler = dynamic_cast(message.GetOrigin().GetPayload()); - - std::set ignoreTagLength; - ignoreTagLength.insert(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR); // Needed for RT-DOSE - - Orthanc::DicomMap summary; - message.GetDicom().ExtractDicomSummary(summary, ignoreTagLength); - handler.GetTarget()->AddResource(summary); - - handler.BroadcastSuccess(); - } - } -#endif - - - void DicomResourcesLoader::Handle(const OracleCommandExceptionMessage& message) - { - // TODO - LOG(ERROR) << "Exception: " << message.GetException().What(); - } - - - void DicomResourcesLoader::ScheduleLoadOrthancInstanceTags(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& instanceId, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetUri("/instances/" + instanceId + "/tags"); - command->AcquirePayload(new OrthancInstanceTagsHandler(shared_from_this(), target, priority, - source, remainingCommands, userPayload)); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - - - void DicomResourcesLoader::ScheduleLoadOrthancOneChildInstance(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType level, - const std::string& id, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetUri("/" + GetUri(level) + "/" + id + "/instances"); - command->AcquirePayload(new OrthancOneChildInstanceHandler(shared_from_this(), target, priority, - source, remainingCommands, userPayload)); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - - - - const Orthanc::IDynamicObject& DicomResourcesLoader::SuccessMessage::GetUserPayload() const - { - if (userPayload_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *userPayload_; - } - } - - - boost::shared_ptr DicomResourcesLoader::Create(ILoadersContext::ILock& stone) - { - boost::shared_ptr result(new DicomResourcesLoader(stone.GetContext())); - result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); - result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); - result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); - result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); - -#if ORTHANC_ENABLE_DCMTK == 1 - result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); -#endif - - return result; - } - - - static void SetIncludeTags(std::map& arguments, - const std::set& includeTags) - { - if (!includeTags.empty()) - { - std::string s; - bool first = true; - - for (std::set::const_iterator - it = includeTags.begin(); it != includeTags.end(); ++it) - { - if (first) - { - first = false; - } - else - { - s += ","; - } - - char buf[16]; - sprintf(buf, "%04X%04X", it->GetGroup(), it->GetElement()); - s += std::string(buf); - } - - arguments["includefield"] = s; - } - } - - - void DicomResourcesLoader::ScheduleGetDicomWeb(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& uri, - const std::set& includeTags, - Orthanc::IDynamicObject* userPayload) - { - boost::shared_ptr protection(userPayload); - - if (!source.IsDicomWeb()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMweb source"); - } - - std::map arguments, headers; - SetIncludeTags(arguments, includeTags); - - std::unique_ptr command( - source.CreateDicomWebCommand(uri, arguments, headers, - new DicomWebHandler(shared_from_this(), target, priority, source, protection))); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - - - void DicomResourcesLoader::ScheduleQido(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType level, - const Orthanc::DicomMap& filter, - const std::set& includeTags, - Orthanc::IDynamicObject* userPayload) - { - boost::shared_ptr protection(userPayload); - - if (!source.IsDicomWeb()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMweb source"); - } - - std::string uri; - switch (level) - { - case Orthanc::ResourceType_Study: - uri = "/studies"; - break; - - case Orthanc::ResourceType_Series: - uri = "/series"; - break; - - case Orthanc::ResourceType_Instance: - uri = "/instances"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::set tags; - filter.GetTags(tags); - - std::map arguments, headers; - - for (std::set::const_iterator it = tags.begin(); it != tags.end(); ++it) - { - std::string s; - if (filter.LookupStringValue(s, *it, false /* no binary */)) - { - char buf[16]; - sprintf(buf, "%04X%04X", it->GetGroup(), it->GetElement()); - arguments[buf] = s; - } - } - - SetIncludeTags(arguments, includeTags); - - std::unique_ptr command( - source.CreateDicomWebCommand(uri, arguments, headers, - new DicomWebHandler(shared_from_this(), target, priority, source, protection))); - - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - - - void DicomResourcesLoader::ScheduleLoadOrthancResources(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType topLevel, - const std::string& topId, - Orthanc::ResourceType bottomLevel, - Orthanc::IDynamicObject* userPayload) - { - boost::shared_ptr protection(userPayload); - - if (!source.IsOrthanc()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not an Orthanc source"); - } - - bool ok = false; - - switch (topLevel) - { - case Orthanc::ResourceType_Patient: - ok = (bottomLevel == Orthanc::ResourceType_Patient || - bottomLevel == Orthanc::ResourceType_Study || - bottomLevel == Orthanc::ResourceType_Series || - bottomLevel == Orthanc::ResourceType_Instance); - break; - - case Orthanc::ResourceType_Study: - ok = (bottomLevel == Orthanc::ResourceType_Study || - bottomLevel == Orthanc::ResourceType_Series || - bottomLevel == Orthanc::ResourceType_Instance); - break; - - case Orthanc::ResourceType_Series: - ok = (bottomLevel == Orthanc::ResourceType_Series || - bottomLevel == Orthanc::ResourceType_Instance); - break; - - case Orthanc::ResourceType_Instance: - ok = (bottomLevel == Orthanc::ResourceType_Instance); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (!ok) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - boost::shared_ptr remainingCommands(new unsigned int(0)); - - if (topLevel == Orthanc::ResourceType_Instance) - { - ScheduleLoadOrthancInstanceTags(target, priority, source, topId, remainingCommands, protection); - } - else if (topLevel == bottomLevel) - { - ScheduleLoadOrthancOneChildInstance(target, priority, source, topLevel, topId, remainingCommands, protection); - } - else - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetUri("/" + GetUri(topLevel) + "/" + topId + "/" + GetUri(bottomLevel)); - command->AcquirePayload(new OrthancAllChildrenInstancesHandler - (shared_from_this(), target, priority, source, - remainingCommands, bottomLevel, protection)); - - { - std::unique_ptr lock(context_.Lock()); - - // GetSharedObserver() means "this" (for use as an IObserver), as a - // shared_ptr - // The oracle will thus call "this" - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - } - - - void DicomResourcesLoader::ScheduleLoadDicomDir(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& path, - Orthanc::IDynamicObject* userPayload) - { - boost::shared_ptr protection(userPayload); - - if (!source.IsDicomDir()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMDIR source"); - } - - if (target->GetIndexedTag() == Orthanc::DICOM_TAG_SOP_INSTANCE_UID) - { - LOG(WARNING) << "If loading DICOMDIR, it is advised to index tag " - << "ReferencedSopInstanceUidInFile (0004,1511)"; - } - -#if ORTHANC_ENABLE_DCMTK == 1 - std::unique_ptr command(new ReadFileCommand(path)); - command->AcquirePayload(new DicomDirHandler(shared_from_this(), target, priority, source, protection)); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "DCMTK is disabled, cannot load DICOMDIR"); -#endif - } - - - void DicomResourcesLoader::ScheduleLoadDicomFile(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& path, - bool includePixelData, - Orthanc::IDynamicObject* userPayload) - { - boost::shared_ptr protection(userPayload); - -#if ORTHANC_ENABLE_DCMTK == 1 - std::unique_ptr command(new ParseDicomFromFileCommand(source, path)); - command->SetPixelDataIncluded(includePixelData); - command->AcquirePayload(new Handler(shared_from_this(), target, priority, source, protection)); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "DCMTK is disabled, cannot load DICOM files"); -#endif - } - - - bool DicomResourcesLoader::ScheduleLoadDicomFile(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& dicomDirPath, - const Orthanc::DicomMap& dicomDirEntry, - bool includePixelData, - Orthanc::IDynamicObject* userPayload) - { - std::unique_ptr protection(userPayload); - -#if ORTHANC_ENABLE_DCMTK == 1 - std::string file; - if (dicomDirEntry.LookupStringValue(file, Orthanc::DICOM_TAG_REFERENCED_FILE_ID, false)) - { - ScheduleLoadDicomFile(target, priority, source, ParseDicomFromFileCommand::GetDicomDirPath(dicomDirPath, file), - includePixelData, protection.release()); - return true; - } - else - { - return false; - } -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "DCMTK is disabled, cannot load DICOM files"); -#endif - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomResourcesLoader.h --- a/Framework/Loaders/DicomResourcesLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,234 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#include "../Oracle/HttpCommand.h" -#include "../Oracle/OracleCommandExceptionMessage.h" -#include "../Oracle/OrthancRestApiCommand.h" -#include "../Oracle/ReadFileCommand.h" -#include "DicomSource.h" -#include "ILoaderFactory.h" -#include "LoadedDicomResources.h" -#include "OracleScheduler.h" - -namespace Orthanc -{ -#if ORTHANC_ENABLE_DCMTK == 1 - class ParsedDicomDir; -#endif -} - -namespace OrthancStone -{ -#if ORTHANC_ENABLE_DCMTK == 1 - class ParseDicomFromFileCommand; -#endif - - class DicomResourcesLoader : - public ObserverBase, - public IObservable - { - private: - class Handler; - class StringHandler; - class DicomWebHandler; - class OrthancHandler; - class OrthancInstanceTagsHandler; - class OrthancOneChildInstanceHandler; - class OrthancAllChildrenInstancesHandler; - -#if ORTHANC_ENABLE_DCMTK == 1 - class DicomDirHandler; -#endif - - void Handle(const HttpCommand::SuccessMessage& message); - - void Handle(const OrthancRestApiCommand::SuccessMessage& message); - - void Handle(const ReadFileCommand::SuccessMessage& message); - - void Handle(const OracleCommandExceptionMessage& message); - -#if ORTHANC_ENABLE_DCMTK == 1 - void Handle(const ParseDicomSuccessMessage& message); -#endif - - void ScheduleLoadOrthancInstanceTags(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& instanceId, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload); - - void ScheduleLoadOrthancOneChildInstance(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType level, - const std::string& id, - boost::shared_ptr remainingCommands, - boost::shared_ptr userPayload); - - DicomResourcesLoader(ILoadersContext& context) : - context_(context) - { - } - - ILoadersContext& context_; - - - public: - class SuccessMessage : public OrthancStone::OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - boost::shared_ptr resources_; - int priority_; - const DicomSource& source_; - const Orthanc::IDynamicObject* userPayload_; - - public: - SuccessMessage(const DicomResourcesLoader& origin, - boost::shared_ptr resources, - int priority, - const DicomSource& source, - const Orthanc::IDynamicObject* userPayload) : - OriginMessage(origin), - resources_(resources), - priority_(priority), - source_(source), - userPayload_(userPayload) - { - } - - int GetPriority() const - { - return priority_; - } - - const boost::shared_ptr GetResources() const - { - return resources_; - } - - const DicomSource& GetDicomSource() const - { - return source_; - } - - bool HasUserPayload() const - { - return userPayload_ != NULL; - } - - const Orthanc::IDynamicObject& GetUserPayload() const; - }; - - - class Factory : public ILoaderFactory - { - public: - virtual boost::shared_ptr Create(ILoadersContext::ILock& stone) - { - return DicomResourcesLoader::Create(stone); - } - }; - - - static boost::shared_ptr Create(ILoadersContext::ILock& stone); - - void ScheduleGetDicomWeb(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& uri, - const std::set& includeTags, - Orthanc::IDynamicObject* userPayload); - - void ScheduleGetDicomWeb(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& uri, - Orthanc::IDynamicObject* userPayload) - { - std::set includeTags; - ScheduleGetDicomWeb(target, priority, source, uri, includeTags, userPayload); - } - - void ScheduleQido(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType level, - const Orthanc::DicomMap& filter, - const std::set& includeTags, - Orthanc::IDynamicObject* userPayload); - - void ScheduleLoadOrthancResources(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType topLevel, - const std::string& topId, - Orthanc::ResourceType bottomLevel, - Orthanc::IDynamicObject* userPayload); - - void ScheduleLoadOrthancResource(boost::shared_ptr target, - int priority, - const DicomSource& source, - Orthanc::ResourceType level, - const std::string& id, - Orthanc::IDynamicObject* userPayload) - { - ScheduleLoadOrthancResources(target, priority, source, level, id, level, userPayload); - } - -#if ORTHANC_ENABLE_DCMTK == 1 - static void GetDicomDirInstances(LoadedDicomResources& target, - const Orthanc::ParsedDicomDir& dicomDir); -#endif - - void ScheduleLoadDicomDir(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& path, - Orthanc::IDynamicObject* userPayload); - - void ScheduleLoadDicomFile(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& path, - bool includePixelData, - Orthanc::IDynamicObject* userPayload); - - bool ScheduleLoadDicomFile(boost::shared_ptr target, - int priority, - const DicomSource& source, - const std::string& dicomDirPath, - const Orthanc::DicomMap& dicomDirEntry, - bool includePixelData, - Orthanc::IDynamicObject* userPayload); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomSource.cpp --- a/Framework/Loaders/DicomSource.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,356 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomSource.h" - -#include "../Oracle/HttpCommand.h" -#include "../Oracle/OrthancRestApiCommand.h" - -#include - -#include - -namespace OrthancStone -{ - static std::string EncodeGetArguments(const std::string& uri, - const std::map& arguments) - { - std::string s = uri; - bool first = true; - - for (std::map::const_iterator - it = arguments.begin(); it != arguments.end(); ++it) - { - if (first) - { - s += "?"; - first = false; - } - else - { - s += "&"; - } - - s += it->first + "=" + it->second; - } - - // TODO: Call Orthanc::Toolbox::UriEncode() ? - - return s; - } - - - void DicomSource::SetOrthancSource(const Orthanc::WebServiceParameters& parameters) - { - type_ = DicomSourceType_Orthanc; - webService_ = parameters; - hasOrthancWebViewer1_ = false; - hasOrthancAdvancedPreview_ = false; - } - - - void DicomSource::SetOrthancSource() - { - Orthanc::WebServiceParameters parameters; - parameters.SetUrl("http://localhost:8042/"); - SetOrthancSource(parameters); - } - - - const Orthanc::WebServiceParameters& DicomSource::GetOrthancParameters() const - { - if (type_ == DicomSourceType_Orthanc || - type_ == DicomSourceType_DicomWebThroughOrthanc) - { - return webService_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void DicomSource::SetDicomDirSource() - { - type_ = DicomSourceType_DicomDir; - } - - - void DicomSource::SetDicomWebSource(const std::string& baseUrl) - { - type_ = DicomSourceType_DicomWeb; - webService_.SetUrl(baseUrl); - webService_.ClearCredentials(); - } - - - void DicomSource::SetDicomWebSource(const std::string& baseUrl, - const std::string& username, - const std::string& password) - { - type_ = DicomSourceType_DicomWeb; - webService_.SetUrl(baseUrl); - webService_.SetCredentials(username, password); - } - - - void DicomSource::SetDicomWebThroughOrthancSource(const Orthanc::WebServiceParameters& orthancParameters, - const std::string& dicomWebRoot, - const std::string& serverName) - { - type_ = DicomSourceType_DicomWebThroughOrthanc; - webService_ = orthancParameters; - orthancDicomWebRoot_ = dicomWebRoot; - serverName_ = serverName; - } - - - void DicomSource::SetDicomWebThroughOrthancSource(const std::string& serverName) - { - Orthanc::WebServiceParameters orthanc; - orthanc.SetUrl("http://localhost:8042/"); - SetDicomWebThroughOrthancSource(orthanc, "/dicom-web/", serverName); - } - - - bool DicomSource::IsDicomWeb() const - { - return (type_ == DicomSourceType_DicomWeb || - type_ == DicomSourceType_DicomWebThroughOrthanc); - } - - - IOracleCommand* DicomSource::CreateDicomWebCommand(const std::string& uri, - const std::map& arguments, - const std::map& headers, - Orthanc::IDynamicObject* payload) const - { - std::unique_ptr protection(payload); - - switch (type_) - { - case DicomSourceType_DicomWeb: - { - std::unique_ptr command(new HttpCommand); - - command->SetMethod(Orthanc::HttpMethod_Get); - command->SetUrl(webService_.GetUrl() + EncodeGetArguments(uri, arguments)); - command->SetHttpHeaders(webService_.GetHttpHeaders()); - - for (std::map::const_iterator - it = headers.begin(); it != headers.end(); ++it) - { - command->SetHttpHeader(it->first, it->second); - } - - if (!webService_.GetUsername().empty()) - { - command->SetCredentials(webService_.GetUsername(), webService_.GetPassword()); - } - - if (protection.get()) - { - command->AcquirePayload(protection.release()); - } - - return command.release(); - } - - case DicomSourceType_DicomWebThroughOrthanc: - { - Json::Value args = Json::objectValue; - for (std::map::const_iterator - it = arguments.begin(); it != arguments.end(); ++it) - { - args[it->first] = it->second; - } - - Json::Value h = Json::objectValue; - for (std::map::const_iterator - it = headers.begin(); it != headers.end(); ++it) - { - h[it->first] = it->second; - } - - Json::Value body = Json::objectValue; - body["Uri"] = uri; - body["Arguments"] = args; - body["HttpHeaders"] = h; - - std::unique_ptr command(new OrthancRestApiCommand); - command->SetMethod(Orthanc::HttpMethod_Post); - command->SetUri(orthancDicomWebRoot_ + "/servers/" + serverName_ + "/get"); - command->SetBody(body); - - if (protection.get()) - { - command->AcquirePayload(protection.release()); - } - - return command.release(); - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void DicomSource::AutodetectOrthancFeatures(const std::string& system, - const std::string& plugins) - { - static const char* const REST_API_VERSION = "ApiVersion"; - - if (IsDicomWeb()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - Json::Value a, b; - Json::Reader reader; - if (reader.parse(system, a) && - reader.parse(plugins, b) && - a.type() == Json::objectValue && - b.type() == Json::arrayValue && - a.isMember(REST_API_VERSION) && - a[REST_API_VERSION].type() == Json::intValue) - { - SetOrthancAdvancedPreview(a[REST_API_VERSION].asInt() >= 5); - - hasOrthancWebViewer1_ = false; - - for (Json::Value::ArrayIndex i = 0; i < b.size(); i++) - { - if (b[i].type() != Json::stringValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (boost::iequals(b[i].asString(), "web-viewer")) - { - hasOrthancWebViewer1_ = true; - } - } - } - else - { - printf("[%s] [%s]\n", system.c_str(), plugins.c_str()); - - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void DicomSource::SetOrthancWebViewer1(bool hasPlugin) - { - if (IsOrthanc()) - { - hasOrthancWebViewer1_ = hasPlugin; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - bool DicomSource::HasOrthancWebViewer1() const - { - if (IsOrthanc()) - { - return hasOrthancWebViewer1_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - void DicomSource::SetOrthancAdvancedPreview(bool hasFeature) - { - if (IsOrthanc()) - { - hasOrthancAdvancedPreview_ = hasFeature; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - bool DicomSource::HasOrthancAdvancedPreview() const - { - if (IsOrthanc()) - { - return hasOrthancAdvancedPreview_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - void DicomSource::SetDicomWebRendered(bool hasFeature) - { - if (IsDicomWeb()) - { - hasDicomWebRendered_ = hasFeature; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - bool DicomSource::HasDicomWebRendered() const - { - if (IsDicomWeb()) - { - return hasDicomWebRendered_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - unsigned int DicomSource::GetQualityCount() const - { - if (IsDicomWeb()) - { - return (HasDicomWebRendered() ? 2 : 1); - } - else if (IsOrthanc()) - { - return (HasOrthancWebViewer1() || - HasOrthancAdvancedPreview() ? 2 : 1); - } - else if (IsDicomDir()) - { - return 1; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomSource.h --- a/Framework/Loaders/DicomSource.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Oracle/IOracleCommand.h" - -#include - -namespace OrthancStone -{ - enum DicomSourceType - { - DicomSourceType_Orthanc, - DicomSourceType_DicomWeb, - DicomSourceType_DicomWebThroughOrthanc, - DicomSourceType_DicomDir - }; - - - class DicomSource - { - private: - DicomSourceType type_; - Orthanc::WebServiceParameters webService_; - std::string orthancDicomWebRoot_; - std::string serverName_; - bool hasOrthancWebViewer1_; - bool hasOrthancAdvancedPreview_; - bool hasDicomWebRendered_; - - public: - DicomSource() : - hasOrthancWebViewer1_(false), - hasOrthancAdvancedPreview_(false), - hasDicomWebRendered_(false) - { - SetOrthancSource(); - } - - DicomSourceType GetType() const - { - return type_; - } - - void SetOrthancSource(); - - void SetOrthancSource(const Orthanc::WebServiceParameters& parameters); - - const Orthanc::WebServiceParameters& GetOrthancParameters() const; - - void SetDicomDirSource(); - - void SetDicomWebSource(const std::string& baseUrl); - - void SetDicomWebSource(const std::string& baseUrl, - const std::string& username, - const std::string& password); - - void SetDicomWebThroughOrthancSource(const Orthanc::WebServiceParameters& orthancParameters, - const std::string& dicomWebRoot, - const std::string& serverName); - - void SetDicomWebThroughOrthancSource(const std::string& serverName); - - bool IsDicomWeb() const; - - bool IsOrthanc() const - { - return type_ == DicomSourceType_Orthanc; - } - - bool IsDicomDir() const - { - return type_ == DicomSourceType_DicomDir; - } - - IOracleCommand* CreateDicomWebCommand(const std::string& uri, - const std::map& arguments, - const std::map& headers, - Orthanc::IDynamicObject* payload /* takes ownership */) const; - - IOracleCommand* CreateDicomWebCommand(const std::string& uri, - Orthanc::IDynamicObject* payload /* takes ownership */) const - { - std::map none; - return CreateDicomWebCommand(uri, none, none, payload); - } - - void AutodetectOrthancFeatures(const std::string& system, - const std::string& plugins); - - void SetOrthancWebViewer1(bool hasPlugin); - - bool HasOrthancWebViewer1() const; - - void SetOrthancAdvancedPreview(bool hasFeature); - - bool HasOrthancAdvancedPreview() const; - - void SetDicomWebRendered(bool hasFeature); - - bool HasDicomWebRendered() const; - - unsigned int GetQualityCount() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomStructureSetLoader.cpp --- a/Framework/Loaders/DicomStructureSetLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,495 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomStructureSetLoader.h" - -#include "../Scene2D/PolylineSceneLayer.h" -#include "../StoneException.h" -#include "../Toolbox/GeometryToolbox.h" - -#include - -#include - -namespace OrthancStone -{ - -#if 0 - void DumpDicomMap(std::ostream& o, const Orthanc::DicomMap& dicomMap) - { - using namespace std; - //ios_base::fmtflags state = o.flags(); - //o.flags(ios::right | ios::hex); - //o << "(" << setfill('0') << setw(4) << tag.GetGroup() - // << "," << setw(4) << tag.GetElement() << ")"; - //o.flags(state); - Json::Value val; - dicomMap.Serialize(val); - o << val; - //return o; - } -#endif - - // implementation of IInstanceLookupHandler that uses Orthanc REST API calls to retrive the - // geometry of referenced instances - class DicomStructureSetLoader::RestInstanceLookupHandler : public DicomStructureSetLoader::IInstanceLookupHandler, - public LoaderStateMachine - { - public: - static boost::shared_ptr Create(DicomStructureSetLoader& loader) - { - boost::shared_ptr obj(new RestInstanceLookupHandler(loader)); - obj->LoaderStateMachine::PostConstructor(); - return obj; - } - - protected: - RestInstanceLookupHandler(DicomStructureSetLoader& loader) - : LoaderStateMachine(loader.loadersContext_) - , loader_(loader) - { - } - - virtual void RetrieveReferencedSlices(const std::set& nonEmptyInstances) ORTHANC_OVERRIDE; - - private: - // these subclasses hold the loading state - class AddReferencedInstance; // 2nd state - class LookupInstance; // 1st state - - DicomStructureSetLoader& loader_; - }; - - class DicomStructureSetLoader::RestInstanceLookupHandler::AddReferencedInstance : public LoaderStateMachine::State - { - private: - std::string instanceId_; - - public: - AddReferencedInstance(DicomStructureSetLoader& that, - const std::string& instanceId) : - State(that), - instanceId_(instanceId) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - Json::Value tags; - message.ParseJsonBody(tags); - - Orthanc::DicomMap dicom; - dicom.FromDicomAsJson(tags); - - DicomStructureSetLoader& loader = GetLoader(); - - loader.AddReferencedSlice(dicom); - } - }; - - - // State that converts a "SOP Instance UID" to an Orthanc identifier - class DicomStructureSetLoader::RestInstanceLookupHandler::LookupInstance : public LoaderStateMachine::State - { - private: - std::string sopInstanceUid_; - - public: - LookupInstance(DicomStructureSetLoader& that, - const std::string& sopInstanceUid) : - State(that), - sopInstanceUid_(sopInstanceUid) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - DicomStructureSetLoader& loader = GetLoader(); - - Json::Value lookup; - message.ParseJsonBody(lookup); - - if (lookup.type() != Json::arrayValue || - lookup.size() != 1 || - !lookup[0].isMember("Type") || - !lookup[0].isMember("Path") || - lookup[0]["Type"].type() != Json::stringValue || - lookup[0]["ID"].type() != Json::stringValue || - lookup[0]["Type"].asString() != "Instance") - { - std::stringstream msg; - msg << "Unknown resource! message.GetAnswer() = " << message.GetAnswer() << " message.GetAnswerHeaders() = "; - for (OrthancStone::OrthancRestApiCommand::HttpHeaders::const_iterator it = message.GetAnswerHeaders().begin(); - it != message.GetAnswerHeaders().end(); ++it) - { - msg << "\nkey: \"" << it->first << "\" value: \"" << it->second << "\"\n"; - } - const std::string msgStr = msg.str(); - LOG(ERROR) << msgStr; - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - - const std::string instanceId = lookup[0]["ID"].asString(); - - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - std::string uri = "/instances/" + instanceId + "/tags"; - command->SetUri(uri); - command->AcquirePayload(new AddReferencedInstance(loader, instanceId)); - Schedule(command.release()); - } - } - }; - - void DicomStructureSetLoader::RestInstanceLookupHandler::RetrieveReferencedSlices( - const std::set& nonEmptyInstances) - { - for (std::set::const_iterator it = nonEmptyInstances.begin(); - it != nonEmptyInstances.end(); - ++it) - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetUri("/tools/lookup"); - command->SetMethod(Orthanc::HttpMethod_Post); - command->SetBody(*it); - command->AcquirePayload(new LookupInstance(loader_, *it)); - Schedule(command.release()); - } - } - - class DicomStructureSetLoader::LoadStructure : public LoaderStateMachine::State - { - public: - LoadStructure(DicomStructureSetLoader& that) : - State(that) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - DicomStructureSetLoader& loader = GetLoader(); - - // Set the actual structure set content - { - FullOrthancDataset dicom(message.GetAnswer()); - - loader.content_.reset(new OrthancStone::DicomStructureSet(dicom)); - } - - // initialize visibility flags - SetDefaultStructureVisibility(); - - // retrieve the (non-empty) referenced instances (the CT slices containing the corresponding structures) - // Some (admittedly invalid) Dicom files have empty values in the - // 0008,1155 tag. We try our best to cope with this. - // this is why we use `nonEmptyInstances` and not `instances` - std::set instances; - std::set nonEmptyInstances; - - // this traverses the polygon collection for all structures and retrieve the SOPInstanceUID of - // the referenced instances - loader.content_->GetReferencedInstances(instances); - - for (std::set::const_iterator - it = instances.begin(); it != instances.end(); ++it) - { - std::string instance = Orthanc::Toolbox::StripSpaces(*it); - if(instance != "") - nonEmptyInstances.insert(instance); - } - - loader.RetrieveReferencedSlices(nonEmptyInstances); - } - - void SetDefaultStructureVisibility() - { - DicomStructureSetLoader& loader = GetLoader(); - - size_t structureCount = loader.content_->GetStructuresCount(); - - loader.structureVisibility_.resize(structureCount); - bool everythingVisible = false; - if ((loader.initiallyVisibleStructures_.size() == 1) - && (loader.initiallyVisibleStructures_[0].size() == 1) - && (loader.initiallyVisibleStructures_[0][0] == '*')) - { - everythingVisible = true; - } - - for (size_t i = 0; i < structureCount; ++i) - { - // if a single "*" string is supplied, this means we want everything - // to be visible... - if (everythingVisible) - { - loader.structureVisibility_.at(i) = true; - } - else - { - // otherwise, we only enable visibility for those structures whose - // names are mentioned in the initiallyVisibleStructures_ array - const std::string& structureName = loader.content_->GetStructureName(i); - - std::vector::iterator foundIt = - std::find( - loader.initiallyVisibleStructures_.begin(), - loader.initiallyVisibleStructures_.end(), - structureName); - std::vector::iterator endIt = loader.initiallyVisibleStructures_.end(); - if (foundIt != endIt) - loader.structureVisibility_.at(i) = true; - else - loader.structureVisibility_.at(i) = false; - } - } - } - - private: - - - }; - - - class DicomStructureSetLoader::Slice : public IExtractedSlice - { - private: - const OrthancStone::DicomStructureSet& content_; - uint64_t revision_; - bool isValid_; - std::vector visibility_; - - public: - /** - The visibility vector must either: - - be empty - or - - contain the same number of items as the number of structures in the - structure set. - In the first case (empty vector), all the structures are displayed. - In the second case, the visibility of each structure is defined by the - content of the vector at the corresponding index. - */ - Slice(const OrthancStone::DicomStructureSet& content, - uint64_t revision, - const OrthancStone::CoordinateSystem3D& cuttingPlane, - std::vector visibility = std::vector()) - : content_(content) - , revision_(revision) - , visibility_(visibility) - { - ORTHANC_ASSERT((visibility_.size() == content_.GetStructuresCount()) - || (visibility_.size() == 0u)); - - bool opposite; - - const OrthancStone::Vector normal = content.GetNormal(); - isValid_ = ( - OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || - OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || - OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); - } - - virtual bool IsValid() - { - return isValid_; - } - - virtual uint64_t GetRevision() - { - return revision_; - } - - virtual OrthancStone::ISceneLayer* CreateSceneLayer( - const OrthancStone::ILayerStyleConfigurator* configurator, - const OrthancStone::CoordinateSystem3D& cuttingPlane) - { - assert(isValid_); - - std::unique_ptr layer(new OrthancStone::PolylineSceneLayer); - layer->SetThickness(2); - - for (size_t i = 0; i < content_.GetStructuresCount(); i++) - { - if ((visibility_.size() == 0) || visibility_.at(i)) - { - const OrthancStone::Color& color = content_.GetStructureColor(i); - -#ifdef USE_BOOST_UNION_FOR_POLYGONS - std::vector< std::vector > polygons; - - if (content_.ProjectStructure(polygons, i, cuttingPlane)) - { - for (size_t j = 0; j < polygons.size(); j++) - { - PolylineSceneLayer::Chain chain; - chain.resize(polygons[j].size()); - - for (size_t k = 0; k < polygons[j].size(); k++) - { - chain[k] = ScenePoint2D(polygons[j][k].x, polygons[j][k].y); - } - - layer->AddChain(chain, true /* closed */, color); - } - } -#else - std::vector< std::pair > segments; - - if (content_.ProjectStructure(segments, i, cuttingPlane)) - { - for (size_t j = 0; j < segments.size(); j++) - { - OrthancStone::PolylineSceneLayer::Chain chain; - chain.resize(2); - - chain[0] = OrthancStone::ScenePoint2D(segments[j].first.x, segments[j].first.y); - chain[1] = OrthancStone::ScenePoint2D(segments[j].second.x, segments[j].second.y); - - layer->AddChain(chain, false /* NOT closed */, color); - } - } -#endif - } - } - - return layer.release(); - } - }; - - - DicomStructureSetLoader::DicomStructureSetLoader( - OrthancStone::ILoadersContext& loadersContext) - : LoaderStateMachine(loadersContext) - , loadersContext_(loadersContext) - , revision_(0) - , countProcessedInstances_(0) - , countReferencedInstances_(0) - , structuresReady_(false) - { - // the default handler to retrieve slice geometry is RestInstanceLookupHandler - instanceLookupHandler_ = RestInstanceLookupHandler::Create(*this); - } - - boost::shared_ptr DicomStructureSetLoader::Create(OrthancStone::ILoadersContext& loadersContext) - { - boost::shared_ptr obj( - new DicomStructureSetLoader( - loadersContext)); - obj->LoaderStateMachine::PostConstructor(); - return obj; - } - - void DicomStructureSetLoader::AddReferencedSlice(const Orthanc::DicomMap& dicom) - { - content_->AddReferencedSlice(dicom); - countProcessedInstances_ ++; - assert(countProcessedInstances_ <= countReferencedInstances_); - - revision_++; - SetStructuresUpdated(); - - if (countProcessedInstances_ == countReferencedInstances_) - { - // All the referenced instances have been loaded, finalize the RT-STRUCT - content_->CheckReferencedSlices(); - revision_++; - SetStructuresReady(); - } - } - - void DicomStructureSetLoader::RetrieveReferencedSlices(const std::set& nonEmptyInstances) - { - // we set the number of referenced instances. This allows to know, in the method above, when we're done - countReferencedInstances_ = static_cast(nonEmptyInstances.size()); - instanceLookupHandler_->RetrieveReferencedSlices(nonEmptyInstances); - } - - void DicomStructureSetLoader::SetStructureDisplayState(size_t structureIndex, bool display) - { - structureVisibility_.at(structureIndex) = display; - revision_++; - } - - DicomStructureSetLoader::~DicomStructureSetLoader() - { - LOG(TRACE) << "DicomStructureSetLoader::~DicomStructureSetLoader()"; - } - - void DicomStructureSetLoader::LoadInstance( - const std::string& instanceId, - const std::vector& initiallyVisibleStructures) - { - Start(); - - instanceId_ = instanceId; - initiallyVisibleStructures_ = initiallyVisibleStructures; - - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - - std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; - - command->SetUri(uri); - command->AcquirePayload(new LoadStructure(*this)); - Schedule(command.release()); - } - } - - void DicomStructureSetLoader::LoadInstanceFullVisibility(const std::string& instanceId) - { - std::vector initiallyVisibleStructures; - initiallyVisibleStructures.push_back("*"); // wildcard to make all structure sets visible - LoadInstance(instanceId, initiallyVisibleStructures); - } - - OrthancStone::IVolumeSlicer::IExtractedSlice* DicomStructureSetLoader::ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) - { - if (content_.get() == NULL) - { - // Geometry is not available yet - return new OrthancStone::IVolumeSlicer::InvalidSlice; - } - else - { - return new Slice(*content_, revision_, cuttingPlane, structureVisibility_); - } - } - - void DicomStructureSetLoader::SetStructuresUpdated() - { - BroadcastMessage(DicomStructureSetLoader::StructuresUpdated(*this)); - } - - void DicomStructureSetLoader::SetStructuresReady() - { - ORTHANC_ASSERT(!structuresReady_); - structuresReady_ = true; - BroadcastMessage(DicomStructureSetLoader::StructuresReady(*this)); - } - - bool DicomStructureSetLoader::AreStructuresReady() const - { - return structuresReady_; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomStructureSetLoader.h --- a/Framework/Loaders/DicomStructureSetLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/DicomStructureSet.h" -#include "../Volumes/IVolumeSlicer.h" -#include "../Loaders/ILoadersContext.h" -#include "LoaderStateMachine.h" - -#include - -namespace OrthancStone -{ - class DicomStructureSetLoader : - public LoaderStateMachine, - public OrthancStone::IVolumeSlicer, - public OrthancStone::IObservable - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresReady, DicomStructureSetLoader); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresUpdated, DicomStructureSetLoader); - - /** - - Once the structure set has been loaded (the LoadStructure state), we need to fill it with geometry information - from the referenced slices (tag (0008,1155) described here: - https://dicom.innolitics.com/ciods/rt-structure-set/general-reference/00081140/00081155 - - This interface allows to customize how this information can be gathered. By default, the RestInstanceLookupHandler - will perform a REST call to the Orthanc API to retrieve this information. - - Injecting another implementation of this interface is useful when where this information can be supplied in - another (faster) way (for instance, if a separate loader for the CT series can be used to supply the slice geometry) - */ - class IInstanceLookupHandler - { - public: - virtual void RetrieveReferencedSlices(const std::set& instances) = 0; - }; - - // predeclaration of the default IInstanceLookupHandler implementation - class RestInstanceLookupHandler; - - static boost::shared_ptr Create( - OrthancStone::ILoadersContext& loadersContext); - - void SetInstanceLookupHandler(boost::shared_ptr instanceLookupHandler) - { - instanceLookupHandler_ = instanceLookupHandler; - } - - OrthancStone::DicomStructureSet* GetContent() - { - return content_.get(); - } - - void SetStructureDisplayState(size_t structureIndex, bool display); - - bool GetStructureDisplayState(size_t structureIndex) const - { - return structureVisibility_.at(structureIndex); - } - - ~DicomStructureSetLoader(); - - void LoadInstance(const std::string& instanceId, - const std::vector& initiallyVisibleStructures = std::vector()); - - void LoadInstanceFullVisibility(const std::string& instanceId); - - - virtual IExtractedSlice* ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; - - void SetStructuresReady(); - void SetStructuresUpdated(); - - bool AreStructuresReady() const; - - /** - Called by the IInstanceLookupHandler when slice referenced instance information is available. - When the last referenced slice is received, this method will perform a final check and will warn observers - */ - void AddReferencedSlice(const Orthanc::DicomMap& dicom); - - private: - class Slice; - - // Only state of LoaderStateMachine - class LoadStructure; // 1st state - - OrthancStone::ILoadersContext& loadersContext_; - std::unique_ptr content_; - uint64_t revision_; - std::string instanceId_; - unsigned int countProcessedInstances_; - unsigned int countReferencedInstances_; - - // will be set to true once the loading is finished - bool structuresReady_; - - /** - At load time, these strings are used to initialize the structureVisibility_ - vector. - - As a special case, if initiallyVisibleStructures_ contains a single string - that is '*', ALL structures will be made visible. - */ - std::vector initiallyVisibleStructures_; - - /** - Contains the "Should this structure be displayed?" flag for all structures. - Only filled when structures are loaded. - - Changing this value directly affects the rendering - */ - std::vector structureVisibility_; - - - boost::shared_ptr instanceLookupHandler_; - - private: - void RetrieveReferencedSlices(const std::set& nonEmptyInstances); - - protected: - DicomStructureSetLoader(OrthancStone::ILoadersContext& loadersContext); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomVolumeLoader.cpp --- a/Framework/Loaders/DicomVolumeLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomVolumeLoader.h" - -#include - -namespace OrthancStone -{ - DicomVolumeLoader::DicomVolumeLoader(boost::shared_ptr& framesLoader, - bool computeRange) : - framesLoader_(framesLoader), - isValid_(false), - started_(false), - remaining_(0) - { - volume_.reset(new OrthancStone::DicomVolumeImage); - - const SeriesOrderedFrames& frames = framesLoader_->GetOrderedFrames(); - - if (frames.IsRegular3DVolume() && - frames.GetFramesCount() > 0) - { - // TODO - Is "0" the good choice for the reference frame? - // Shouldn't we use "count - 1" depending on the direction - // of the normal? - const OrthancStone::DicomInstanceParameters& parameters = frames.GetInstanceParameters(0); - - OrthancStone::CoordinateSystem3D plane(frames.GetInstance(0)); - - OrthancStone::VolumeImageGeometry geometry; - geometry.SetSizeInVoxels(parameters.GetImageInformation().GetWidth(), - parameters.GetImageInformation().GetHeight(), - static_cast(frames.GetFramesCount())); - geometry.SetAxialGeometry(plane); - - double spacing; - if (parameters.GetSopClassUid() == SopClassUid_RTDose) - { - if (!parameters.ComputeRegularSpacing(spacing)) - { - LOG(WARNING) << "Unable to compute the spacing in a RT-DOSE instance"; - spacing = frames.GetSpacingBetweenSlices(); - } - } - else - { - spacing = frames.GetSpacingBetweenSlices(); - } - - geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), - parameters.GetPixelSpacingY(), spacing); - volume_->Initialize(geometry, parameters.GetExpectedPixelFormat(), computeRange); - volume_->GetPixelData().Clear(); - volume_->SetDicomParameters(parameters); - - remaining_ = frames.GetFramesCount(); - isValid_ = true; - } - else - { - LOG(WARNING) << "Not a regular 3D volume"; - } - } - - - void DicomVolumeLoader::Handle(const OrthancStone::SeriesFramesLoader::FrameLoadedMessage& message) - { - if (remaining_ == 0 || - !message.HasUserPayload()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (message.GetImage().GetWidth() != volume_->GetPixelData().GetWidth() || - message.GetImage().GetHeight() != volume_->GetPixelData().GetHeight()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); - } - - if (message.GetImage().GetFormat() != volume_->GetPixelData().GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (message.GetFrameIndex() >= volume_->GetPixelData().GetDepth()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - size_t frameIndex = dynamic_cast&> - (message.GetUserPayload()).GetValue(); - - { - ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), - VolumeProjection_Axial, - static_cast(frameIndex)); - - Orthanc::ImageProcessing::Copy(writer.GetAccessor(), message.GetImage()); - } - - volume_->IncrementRevision(); - - { - VolumeUpdatedMessage updated(*this, - static_cast(frameIndex)); - - BroadcastMessage(updated); - } - - remaining_--; - - if (remaining_ == 0) - { - VolumeReadyMessage ready(*this); - BroadcastMessage(ready); - } - } - - - DicomVolumeLoader::Factory::Factory(LoadedDicomResources& instances) : - framesFactory_(instances), - computeRange_(false) - { - } - - DicomVolumeLoader::Factory::Factory(const SeriesMetadataLoader::SuccessMessage& metadata) : - framesFactory_(metadata.GetInstances()), - computeRange_(false) - { - SetDicomDir(metadata.GetDicomDirPath(), metadata.GetDicomDir()); // Only useful for DICOMDIR sources - } - - - boost::shared_ptr DicomVolumeLoader::Factory::Create(ILoadersContext::ILock& context) - { - boost::shared_ptr frames = - boost::dynamic_pointer_cast(framesFactory_.Create(context)); - - boost::shared_ptr volume(new DicomVolumeLoader(frames, computeRange_)); - volume->Register(*frames, &DicomVolumeLoader::Handle); - - return volume; - } - - void DicomVolumeLoader::Start(int priority, - const DicomSource& source) - { - if (started_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - started_ = true; - - if (IsValid()) - { - for (size_t i = 0; i < GetOrderedFrames().GetFramesCount(); i++) - { - framesLoader_->ScheduleLoadFrame(priority, source, i, source.GetQualityCount() - 1, - new Orthanc::SingleValueObject(i)); - } - } - else - { - VolumeReadyMessage ready(*this); - BroadcastMessage(ready); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/DicomVolumeLoader.h --- a/Framework/Loaders/DicomVolumeLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Volumes/DicomVolumeImage.h" -#include "SeriesFramesLoader.h" -#include "SeriesMetadataLoader.h" - -namespace OrthancStone -{ - class DicomVolumeLoader : - public ObserverBase, - public IObservable - { - private: - boost::shared_ptr framesLoader_; - boost::shared_ptr volume_; - bool isValid_; - bool started_; - size_t remaining_; - - DicomVolumeLoader(boost::shared_ptr& framesLoader, - bool computeRange); - - void Handle(const OrthancStone::SeriesFramesLoader::FrameLoadedMessage& message); - - public: - class VolumeReadyMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - public: - VolumeReadyMessage(const DicomVolumeLoader& loader) : - OriginMessage(loader) - { - } - - const DicomVolumeImage& GetVolume() const - { - assert(GetOrigin().GetVolume()); - return *GetOrigin().GetVolume(); - } - }; - - - class VolumeUpdatedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - unsigned int axial_; - - public: - VolumeUpdatedMessage(const DicomVolumeLoader& loader, - unsigned int axial) : - OriginMessage(loader), - axial_(axial) - { - } - - unsigned int GetAxialIndex() const - { - return axial_; - } - - const DicomVolumeImage& GetVolume() const - { - assert(GetOrigin().GetVolume()); - return *GetOrigin().GetVolume(); - } - }; - - - class Factory : public ILoaderFactory - { - private: - SeriesFramesLoader::Factory framesFactory_; - bool computeRange_; - - public: - Factory(LoadedDicomResources& instances); - - Factory(const SeriesMetadataLoader::SuccessMessage& metadata); - - void SetComputeRange(bool computeRange) - { - computeRange_ = computeRange; - } - - void SetDicomDir(const std::string& dicomDirPath, - boost::shared_ptr dicomDir) - { - framesFactory_.SetDicomDir(dicomDirPath, dicomDir); - } - - virtual boost::shared_ptr Create(ILoadersContext::ILock& context) ORTHANC_OVERRIDE; - }; - - bool IsValid() const - { - return isValid_; - } - - bool IsFullyLoaded() const - { - return remaining_ == 0; - } - - boost::shared_ptr GetVolume() const - { - return volume_; - } - - const SeriesOrderedFrames& GetOrderedFrames() const - { - return framesLoader_->GetOrderedFrames(); - } - - void Start(int priority, - const DicomSource& source); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/GenericLoadersContext.cpp --- a/Framework/Loaders/GenericLoadersContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,183 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GenericLoadersContext.h" - -namespace OrthancStone -{ - class GenericLoadersContext::Locker : public ILoadersContext::ILock - { - private: - GenericLoadersContext& that_; - boost::recursive_mutex::scoped_lock lock_; - - public: - Locker(GenericLoadersContext& that) : - that_(that), - lock_(that.mutex_) - { - if (!that_.scheduler_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - virtual ILoadersContext& GetContext() const ORTHANC_OVERRIDE - { - return that_; - }; - - virtual void AddLoader(boost::shared_ptr loader) ORTHANC_OVERRIDE - { - that_.loaders_.push_back(loader); - } - - virtual IObservable& GetOracleObservable() const ORTHANC_OVERRIDE - { - return that_.oracleObservable_; - } - - virtual void Schedule(boost::shared_ptr receiver, - int priority, - IOracleCommand* command /* Takes ownership */) ORTHANC_OVERRIDE - { - that_.scheduler_->Schedule(receiver, priority, command); - }; - - virtual void CancelRequests(boost::shared_ptr receiver) ORTHANC_OVERRIDE - { - that_.scheduler_->CancelRequests(receiver); - } - - virtual void CancelAllRequests() ORTHANC_OVERRIDE - { - that_.scheduler_->CancelAllRequests(); - } - - virtual void GetStatistics(uint64_t& scheduledCommands, - uint64_t& processedCommands) ORTHANC_OVERRIDE - { - scheduledCommands = that_.scheduler_->GetTotalScheduled(); - processedCommands = that_.scheduler_->GetTotalProcessed(); - } - }; - - - void GenericLoadersContext::EmitMessage(boost::weak_ptr observer, - const IMessage& message) - { - boost::recursive_mutex::scoped_lock lock(mutex_); - //LOG(INFO) << " inside emit lock: " << message.GetIdentifier().AsString(); - oracleObservable_.EmitMessage(observer, message); - //LOG(INFO) << " outside emit lock"; - } - - - GenericLoadersContext::GenericLoadersContext(unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority) - { - oracle_.reset(new ThreadedOracle(*this)); - scheduler_ = OracleScheduler::Create(*oracle_, oracleObservable_, *this, - maxHighPriority, maxStandardPriority, maxLowPriority); - - if (!scheduler_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - GenericLoadersContext::~GenericLoadersContext() - { - LOG(INFO) << "scheduled commands: " << scheduler_->GetTotalScheduled() - << ", processed commands: " << scheduler_->GetTotalProcessed(); - scheduler_.reset(); - //LOG(INFO) << "counter: " << scheduler_.use_count(); - } - - - void GenericLoadersContext::SetOrthancParameters(const Orthanc::WebServiceParameters& parameters) - { - boost::recursive_mutex::scoped_lock lock(mutex_); - oracle_->SetOrthancParameters(parameters); - } - - - void GenericLoadersContext::SetRootDirectory(const std::string& root) - { - boost::recursive_mutex::scoped_lock lock(mutex_); - oracle_->SetRootDirectory(root); - } - - - void GenericLoadersContext::SetDicomCacheSize(size_t size) - { - boost::recursive_mutex::scoped_lock lock(mutex_); - oracle_->SetDicomCacheSize(size); - } - - - void GenericLoadersContext::StartOracle() - { - boost::recursive_mutex::scoped_lock lock(mutex_); - oracle_->Start(); - //LOG(INFO) << "STARTED ORACLE"; - } - - - void GenericLoadersContext::StopOracle() - { - /** - * DON'T lock "mutex_" here, otherwise Stone won't be able to - * stop if one command being executed by the oracle has to emit - * a message (method "EmitMessage()" would have to lock the - * mutex too). - **/ - - //LOG(INFO) << "STOPPING ORACLE"; - oracle_->Stop(); - //LOG(INFO) << "STOPPED ORACLE"; - } - - - void GenericLoadersContext::WaitUntilComplete() - { - for (;;) - { - { - boost::recursive_mutex::scoped_lock lock(mutex_); - if (scheduler_ && - scheduler_->GetTotalScheduled() == scheduler_->GetTotalProcessed()) - { - return; - } - } - - boost::this_thread::sleep(boost::posix_time::milliseconds(100)); - } - } - - ILoadersContext::ILock* GenericLoadersContext::Lock() - { - return new Locker(*this); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/GenericLoadersContext.h --- a/Framework/Loaders/GenericLoadersContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../Messages/IMessageEmitter.h" -#include "../Oracle/ThreadedOracle.h" -#include "ILoadersContext.h" -#include "DicomSource.h" -#include "OracleScheduler.h" - -#include - -namespace OrthancStone -{ - class GenericLoadersContext : - public ILoadersContext, - private IMessageEmitter - { - private: - class Locker; - - // "Recursive mutex" is necessary, to be able to run - // "ILoaderFactory" from a message handler triggered by - // "EmitMessage()" - boost::recursive_mutex mutex_; - - IObservable oracleObservable_; - std::unique_ptr oracle_; - boost::shared_ptr scheduler_; - - // Necessary to keep the loaders persistent (including global - // function promises), after the function that created them is - // left. This avoids creating one global variable for each loader. - std::list< boost::shared_ptr > loaders_; - - virtual void EmitMessage(boost::weak_ptr observer, - const IMessage& message) ORTHANC_OVERRIDE; - - public: - GenericLoadersContext(unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority); - - virtual ~GenericLoadersContext(); - - virtual ILock* Lock() ORTHANC_OVERRIDE; - - void SetOrthancParameters(const Orthanc::WebServiceParameters& parameters); - - void SetRootDirectory(const std::string& root); - - void SetDicomCacheSize(size_t size); - - void StartOracle(); - - void StopOracle(); - - void WaitUntilComplete(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/IFetchingItemsSorter.h --- a/Framework/Loaders/IFetchingItemsSorter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace OrthancStone -{ - class IFetchingItemsSorter : public boost::noncopyable - { - public: - class IFactory : public boost::noncopyable - { - public: - virtual ~IFactory() - { - } - - virtual IFetchingItemsSorter* CreateSorter(unsigned int itemsCount) const = 0; - }; - - virtual ~IFetchingItemsSorter() - { - } - - virtual unsigned int GetItemsCount() const = 0; - - // Sort a set of items given the current item - virtual void Sort(std::vector& target, - unsigned int current) = 0; - }; -}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/IFetchingStrategy.h --- a/Framework/Loaders/IFetchingStrategy.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - class IFetchingStrategy : public boost::noncopyable - { - public: - virtual ~IFetchingStrategy() - { - } - - virtual unsigned int GetItemsCount() const = 0; - - virtual unsigned int GetMaxQuality() const = 0; - - virtual bool GetNext(unsigned int& item, - unsigned int& quality) = 0; - - virtual void SetCurrent(unsigned int item) = 0; - - // Ask the strategy to re-schedule the item with the lowest - // priority in the fetching order. This allows to know which item - // should be dropped from a cache. - virtual void RecycleFurthest(unsigned int& item) = 0; - }; -}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/ILoaderFactory.h --- a/Framework/Loaders/ILoaderFactory.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILoadersContext.h" - -namespace OrthancStone -{ - class ILoaderFactory : public boost::noncopyable - { - public: - virtual ~ILoaderFactory() - { - } - - /** - * Factory function that creates a new loader, to be used by the - * Stone loaders context. - **/ - virtual boost::shared_ptr Create(ILoadersContext::ILock& context) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/ILoadersContext.h --- a/Framework/Loaders/ILoadersContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IObserver.h" -#include "../Messages/IObservable.h" -#include "../Oracle/IOracleCommand.h" - -#include - -namespace OrthancStone -{ - class ILoadersContext : public boost::noncopyable - { - public: - class ILock : public boost::noncopyable - { - public: - virtual ~ILock() - { - } - - /** - * This method is useful for loaders that must be able to - * re-lock the Stone loaders context in the future (for instance - * to schedule new commands once some command is processed). - **/ - virtual ILoadersContext& GetContext() const = 0; - - /** - * Get a reference to the observable against which a loader must - * listen to be informed of messages issued by the oracle once - * some command is processed. - **/ - virtual IObservable& GetOracleObservable() const = 0; - - /** - * Schedule a new command for further processing by the - * oracle. The "receiver" argument indicates to which object the - * notification messages are sent by the oracle upon completion - * of the command. The command is possibly not directly sent to - * the oracle: Instead, an internal "OracleScheduler" object is - * often used as a priority queue to rule the order in which - * commands are actually sent to the oracle. Hence the - * "priority" argument (commands with lower value are executed - * first). - **/ - virtual void Schedule(boost::shared_ptr receiver, - int priority, - IOracleCommand* command /* Takes ownership */) = 0; - - /** - * Cancel all the commands that are waiting in the - * "OracleScheduler" queue and that are linked to the given - * receiver (i.e. the observer that was specified at the time - * method "Schedule()" was called). This is useful for real-time - * processing, as it allows to replace commands that were - * scheduled in the past by more urgent commands. - * - * Note that this call does not affect commands that would have - * already be sent to the oracle. As a consequence, the receiver - * might still receive messages that were sent to the oracle - * before the cancellation (be prepared to handle such - * messages). - **/ - virtual void CancelRequests(boost::shared_ptr receiver) = 0; - - /** - * Same as "CancelRequests()", but targets all the receivers. - **/ - virtual void CancelAllRequests() = 0; - - /** - * Add a reference to the given observer in the Stone loaders - * context. This can be used to match the lifetime of a loader - * with the lifetime of the Stone context: This is useful if - * your Stone application does not keep a reference to the - * loader by itself (typically in global promises), which would - * make the loader disappear as soon as the scope of the - * variable is left. - **/ - virtual void AddLoader(boost::shared_ptr loader) = 0; - - /** - * Returns the number of commands that were scheduled and - * processed using the "Schedule()" method. By "processed" - * commands, we refer to the number of commands that were either - * executed by the oracle, or canceled by the user. So the - * counting sequences are monotonically increasing over time. - **/ - virtual void GetStatistics(uint64_t& scheduledCommands, - uint64_t& processedCommands) = 0; - }; - - virtual ~ILoadersContext() - { - } - - /** - * Locks the Stone loaders context, to give access to its - * underlying features. This is important for Stone applications - * running in a multi-threaded environment, for which a global - * mutex is locked. - **/ - virtual ILock* Lock() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoadedDicomResources.cpp --- a/Framework/Loaders/LoadedDicomResources.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,233 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LoadedDicomResources.h" - -#include - -#include - - -namespace OrthancStone -{ - void LoadedDicomResources::Flatten() - { - // Lazy generation of a "std::vector" from the "std::map" - if (flattened_.empty()) - { - flattened_.resize(resources_.size()); - - size_t pos = 0; - for (Resources::const_iterator it = resources_.begin(); it != resources_.end(); ++it) - { - assert(it->second != NULL); - flattened_[pos++] = it->second; - } - } - else - { - // No need to flatten - assert(flattened_.size() == resources_.size()); - } - } - - - void LoadedDicomResources::AddFromDicomWebInternal(const Json::Value& dicomweb) - { - assert(dicomweb.type() == Json::objectValue); - Orthanc::DicomMap dicom; - dicom.FromDicomWeb(dicomweb); - AddResource(dicom); - } - - - LoadedDicomResources::LoadedDicomResources(const LoadedDicomResources& other, - const Orthanc::DicomTag& indexedTag) : - indexedTag_(indexedTag) - { - for (Resources::const_iterator it = other.resources_.begin(); - it != other.resources_.end(); ++it) - { - assert(it->second != NULL); - AddResource(*it->second); - } - } - - void LoadedDicomResources::Clear() - { - for (Resources::iterator it = resources_.begin(); it != resources_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - - resources_.clear(); - flattened_.clear(); - } - - - Orthanc::DicomMap& LoadedDicomResources::GetResource(size_t index) - { - Flatten(); - - if (index >= flattened_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(flattened_[index] != NULL); - return *flattened_[index]; - } - } - - - void LoadedDicomResources::MergeResource(Orthanc::DicomMap& target, - const std::string& id) const - { - Resources::const_iterator it = resources_.find(id); - - if (it == resources_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem); - } - else - { - assert(it->second != NULL); - target.Merge(*it->second); - } - } - - - bool LoadedDicomResources::LookupStringValue(std::string& target, - const std::string& id, - const Orthanc::DicomTag& tag) const - { - Resources::const_iterator found = resources_.find(id); - - if (found == resources_.end()) - { - return false; - } - else - { - assert(found->second != NULL); - return found->second->LookupStringValue(target, tag, false); - } - } - - - void LoadedDicomResources::AddResource(const Orthanc::DicomMap& dicom) - { - std::string id; - - if (dicom.LookupStringValue(id, indexedTag_, false /* no binary value */) && - resources_.find(id) == resources_.end() /* Don't index twice the same resource */) - { - resources_[id] = dicom.Clone(); - flattened_.clear(); // Invalidate the flattened version - } - } - - - void LoadedDicomResources::AddFromOrthanc(const Json::Value& tags) - { - Orthanc::DicomMap dicom; - dicom.FromDicomAsJson(tags); - AddResource(dicom); - } - - - void LoadedDicomResources::AddFromDicomWeb(const Json::Value& dicomweb) - { - if (dicomweb.type() == Json::objectValue) - { - AddFromDicomWebInternal(dicomweb); - } - else if (dicomweb.type() == Json::arrayValue) - { - for (Json::Value::ArrayIndex i = 0; i < dicomweb.size(); i++) - { - if (dicomweb[i].type() == Json::objectValue) - { - AddFromDicomWebInternal(dicomweb[i]); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - - - bool LoadedDicomResources::LookupTagValueConsensus(std::string& target, - const Orthanc::DicomTag& tag) const - { - typedef std::map Counter; - - Counter counter; - - for (Resources::const_iterator it = resources_.begin(); it != resources_.end(); ++it) - { - assert(it->second != NULL); - - std::string value; - if (it->second->LookupStringValue(value, tag, false)) - { - Counter::iterator found = counter.find(value); - if (found == counter.end()) - { - counter[value] = 1; - } - else - { - found->second ++; - } - } - } - - Counter::const_iterator best = counter.end(); - - for (Counter::const_iterator it = counter.begin(); it != counter.end(); ++it) - { - if (best == counter.end() || - best->second < it->second) - { - best = it; - } - } - - if (best == counter.end()) - { - return false; - } - else - { - target = best->first; - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoadedDicomResources.h --- a/Framework/Loaders/LoadedDicomResources.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - - -namespace OrthancStone -{ - /** - Stores an indexed collection of DicomMap objects. The index is a - user-specified DicomTag. - */ - class LoadedDicomResources : public boost::noncopyable - { - private: - typedef std::map Resources; - - Orthanc::DicomTag indexedTag_; - Resources resources_; - std::vector flattened_; - - void Flatten(); - - void AddFromDicomWebInternal(const Json::Value& dicomweb); - - public: - LoadedDicomResources(const Orthanc::DicomTag& indexedTag) : - indexedTag_(indexedTag) - { - } - - // Re-index another set of resources using another tag - LoadedDicomResources(const LoadedDicomResources& other, - const Orthanc::DicomTag& indexedTag); - - ~LoadedDicomResources() - { - Clear(); - } - - const Orthanc::DicomTag& GetIndexedTag() const - { - return indexedTag_; - } - - void Clear(); - - size_t GetSize() const - { - return resources_.size(); - } - - Orthanc::DicomMap& GetResource(size_t index); - - bool HasResource(const std::string& id) const - { - return resources_.find(id) != resources_.end(); - } - - void MergeResource(Orthanc::DicomMap& target, - const std::string& id) const; - - bool LookupStringValue(std::string& target, - const std::string& id, - const Orthanc::DicomTag& tag) const; - - void AddResource(const Orthanc::DicomMap& dicom); - - void AddFromOrthanc(const Json::Value& tags); - - void AddFromDicomWeb(const Json::Value& dicomweb); - - bool LookupTagValueConsensus(std::string& target, - const Orthanc::DicomTag& tag) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoaderCache.cpp --- a/Framework/Loaders/LoaderCache.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,270 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "LoaderCache.h" - -#include "../StoneException.h" -#include "OrthancSeriesVolumeProgressiveLoader.h" -#include "OrthancMultiframeVolumeLoader.h" -#include "DicomStructureSetLoader.h" - -#include "../Loaders/ILoadersContext.h" - -#if ORTHANC_ENABLE_WASM == 1 -# include -# include "../Oracle/WebAssemblyOracle.h" -#else -# include "../Oracle/ThreadedOracle.h" -#endif - -#include "../Volumes/DicomVolumeImage.h" -#include "../Volumes/DicomVolumeImageMPRSlicer.h" - -#include -#include - -namespace OrthancStone -{ - LoaderCache::LoaderCache(OrthancStone::ILoadersContext& loadersContext, bool useCtProgressiveQuality) - : loadersContext_(loadersContext) - , useCtProgressiveQuality_(useCtProgressiveQuality) - - { - - } - - boost::shared_ptr - LoaderCache::GetSeriesVolumeProgressiveLoader(std::string seriesUuid) - { - try - { - // normalize keys a little - NormalizeUuid(seriesUuid); - - // find in cache - if (seriesVolumeProgressiveLoaders_.find(seriesUuid) == seriesVolumeProgressiveLoaders_.end()) - { - std::unique_ptr lock(loadersContext_.Lock()); - - boost::shared_ptr volumeImage(new OrthancStone::DicomVolumeImage); - boost::shared_ptr loader; - - // true means "use progressive quality" - // false means "load high quality slices only" - loader = OrthancSeriesVolumeProgressiveLoader::Create(loadersContext_, volumeImage, useCtProgressiveQuality_); - loader->LoadSeries(seriesUuid); - seriesVolumeProgressiveLoaders_[seriesUuid] = loader; - } - else - { -// LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : returning cached loader for seriesUUid = " << seriesUuid; - } - return seriesVolumeProgressiveLoaders_[seriesUuid]; - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); - } - throw; - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); - throw; - } - catch (...) - { - LOG(ERROR) << "Unknown exception in LoaderCache"; - throw; - } - } - - boost::shared_ptr LoaderCache::GetMultiframeVolumeLoader(std::string instanceUuid) - { - // normalize keys a little - NormalizeUuid(instanceUuid); - - // if the loader is not available, let's trigger its creation - if(multiframeVolumeLoaders_.find(instanceUuid) == multiframeVolumeLoaders_.end()) - { - GetMultiframeDicomVolumeImageMPRSlicer(instanceUuid); - } - ORTHANC_ASSERT(multiframeVolumeLoaders_.find(instanceUuid) != multiframeVolumeLoaders_.end()); - - return multiframeVolumeLoaders_[instanceUuid]; - } - - boost::shared_ptr LoaderCache::GetMultiframeDicomVolumeImageMPRSlicer(std::string instanceUuid) - { - try - { - // normalize keys a little - NormalizeUuid(instanceUuid); - - // find in cache - if (dicomVolumeImageMPRSlicers_.find(instanceUuid) == dicomVolumeImageMPRSlicers_.end()) - { - std::unique_ptr lock(loadersContext_.Lock()); - boost::shared_ptr volumeImage(new OrthancStone::DicomVolumeImage); - boost::shared_ptr loader; - { - loader = OrthancMultiframeVolumeLoader::Create(loadersContext_, volumeImage); - loader->LoadInstance(instanceUuid); - } - multiframeVolumeLoaders_[instanceUuid] = loader; - boost::shared_ptr mprSlicer(new OrthancStone::DicomVolumeImageMPRSlicer(volumeImage)); - dicomVolumeImageMPRSlicers_[instanceUuid] = mprSlicer; - } - return dicomVolumeImageMPRSlicers_[instanceUuid]; - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); - } - throw; - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); - throw; - } - catch (...) - { - LOG(ERROR) << "Unknown exception in LoaderCache"; - throw; - } - } - - std::string LoaderCache::BuildDicomStructureSetLoaderKey( - const std::string& instanceUuid, - const std::string& uniqueKey) - { - return instanceUuid + "_" + uniqueKey; - } - - boost::shared_ptr LoaderCache::GetDicomStructureSetLoader( - std::string inInstanceUuid, - const std::vector& initiallyVisibleStructures, - const std::string& uniqueKey) - { - try - { - // normalize keys a little - NormalizeUuid(inInstanceUuid); - - std::string entryKey = BuildDicomStructureSetLoaderKey(inInstanceUuid, uniqueKey); - - // find in cache - if (dicomStructureSetLoaders_.find(entryKey) == dicomStructureSetLoaders_.end()) - { - std::unique_ptr lock(loadersContext_.Lock()); - - boost::shared_ptr loader; - { - loader = DicomStructureSetLoader::Create(loadersContext_); - loader->LoadInstance(inInstanceUuid, initiallyVisibleStructures); - } - dicomStructureSetLoaders_[entryKey] = loader; - } - return dicomStructureSetLoaders_[entryKey]; - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); - } - throw; - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); - throw; - } - catch (...) - { - LOG(ERROR) << "Unknown exception in LoaderCache"; - throw; - } - } - - void LoaderCache::ClearCache() - { - std::unique_ptr lock(loadersContext_.Lock()); - -#ifndef NDEBUG - // ISO way of checking for debug builds - DebugDisplayObjRefCounts(); -#endif - seriesVolumeProgressiveLoaders_.clear(); - multiframeVolumeLoaders_.clear(); - dicomVolumeImageMPRSlicers_.clear(); - dicomStructureSetLoaders_.clear(); - - } - - template void DebugDisplayObjRefCountsInMap( - const std::string& name, const std::map >& myMap) - { - LOG(TRACE) << "Map \"" << name << "\" ref counts:"; - size_t i = 0; - for (typename std::map >::const_iterator - it = myMap.begin(); it != myMap.end(); ++it) - { - LOG(TRACE) << " element #" << i << ": ref count = " << it->second.use_count(); - i++; - } - } - - void LoaderCache::DebugDisplayObjRefCounts() - { - DebugDisplayObjRefCountsInMap("seriesVolumeProgressiveLoaders_", seriesVolumeProgressiveLoaders_); - DebugDisplayObjRefCountsInMap("multiframeVolumeLoaders_", multiframeVolumeLoaders_); - DebugDisplayObjRefCountsInMap("dicomVolumeImageMPRSlicers_", dicomVolumeImageMPRSlicers_); - DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders_", dicomStructureSetLoaders_); - } - - /** - This method could have been called StripSpacesAndChangeToLower but we might want to - add some UUID validation to the argument - */ - void LoaderCache::NormalizeUuid(std::string& uuid) - { - std::string temp = Orthanc::Toolbox::StripSpaces(uuid); - Orthanc::Toolbox::ToLowerCase(temp); - uuid.swap(temp); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoaderCache.h --- a/Framework/Loaders/LoaderCache.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../Volumes/DicomVolumeImageMPRSlicer.h" -#include "OrthancSeriesVolumeProgressiveLoader.h" -#include "OrthancMultiframeVolumeLoader.h" -#include "DicomStructureSetLoader.h" - -#include - -#include -#include -#include - -namespace OrthancStone -{ - class ILoadersContext; -} - -namespace OrthancStone -{ - class LoaderCache - { - public: - - virtual ~LoaderCache() {} - - /** - By default, the CT loader in loader cache will only download the highest quality slices. - If you pass true for useCtProgressiveQuality, jpeg (50/100 quality), then jpeg (90/100 quality) - then eventually uncompressed 16-bit images will be loaded. - */ - LoaderCache(OrthancStone::ILoadersContext& loadersContext, bool useCtProgressiveQuality = false); - - boost::shared_ptr - GetSeriesVolumeProgressiveLoader (std::string seriesUuid); - - boost::shared_ptr - GetMultiframeDicomVolumeImageMPRSlicer(std::string instanceUuid); - - boost::shared_ptr - GetMultiframeVolumeLoader(std::string instanceUuid); - - /** - The DicomStructureSetLoader instances are stored in a map and indexed - by a key built from instanceUuid and uniqueKey. - - If instanceUuid and uniqueKey correspond to an already existing loader, it is returned. - - Please note that initiallyVisibleStructures is only used if the call results in the creation - of a new loader. In that case, the value is passed to the constructor. - */ - boost::shared_ptr - GetDicomStructureSetLoader( - std::string instanceUuid, - const std::vector& initiallyVisibleStructures, - const std::string& uniqueKey = ""); - - std::string BuildDicomStructureSetLoaderKey( - const std::string& instanceUuid, - const std::string& uniqueKey = ""); - - void ClearCache(); - - /** - Service method static and exposed for unit tests. - */ - static void NormalizeUuid(std::string& uuid); - - protected: - - void DebugDisplayObjRefCounts(); - - OrthancStone::ILoadersContext& loadersContext_; - bool useCtProgressiveQuality_; - - std::map > - seriesVolumeProgressiveLoaders_; - std::map > - multiframeVolumeLoaders_; - std::map > - dicomVolumeImageMPRSlicers_; - std::map > - dicomStructureSetLoaders_; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoaderStateMachine.cpp --- a/Framework/Loaders/LoaderStateMachine.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,219 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LoaderStateMachine.h" - -#include "../Loaders/ILoadersContext.h" - -#include - -namespace OrthancStone -{ - void LoaderStateMachine::State::Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - - void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - - void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - - void LoaderStateMachine::Schedule(OrthancStone::OracleCommandBase* command) - { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Schedule()"; - - std::unique_ptr protection(command); - - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - if (!command->HasPayload()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, - "The payload must contain the next state"); - } - pendingCommands_.push_back(protection.release()); - - Step(); - } - - - void LoaderStateMachine::Start() - { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Start()"; - - if (active_) - { - LOG(TRACE) << "LoaderStateMachine::Start() called while active_ is true"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - active_ = true; - - for (size_t i = 0; i < simultaneousDownloads_; i++) - { - Step(); - } - } - - - void LoaderStateMachine::Step() - { - if (!pendingCommands_.empty() && - activeCommands_ < simultaneousDownloads_) - { - - OrthancStone::IOracleCommand* nextCommand = pendingCommands_.front(); - - LOG(TRACE) << " LoaderStateMachine(" << std::hex << this << std::dec << - ")::Step(): activeCommands_ (" << activeCommands_ << - ") < simultaneousDownloads_ (" << simultaneousDownloads_ << - ") --> will Schedule command addr " << std::hex << nextCommand << std::dec; - - { - std::unique_ptr lock(loadersContext_.Lock()); - boost::shared_ptr observer(GetSharedObserver()); - lock->Schedule(observer, 0, nextCommand); // TODO: priority! - } - pendingCommands_.pop_front(); - - activeCommands_++; - } - else - { - LOG(TRACE) << " LoaderStateMachine(" << std::hex << this << std::dec << - ")::Step(): activeCommands_ (" << activeCommands_ << - ") >= simultaneousDownloads_ (" << simultaneousDownloads_ << - ") --> will NOT Schedule command"; - } - } - - - void LoaderStateMachine::Clear() - { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Clear()"; - for (PendingCommands::iterator it = pendingCommands_.begin(); - it != pendingCommands_.end(); ++it) - { - delete *it; - } - - pendingCommands_.clear(); - } - - - void LoaderStateMachine::HandleExceptionMessage(const OrthancStone::OracleCommandExceptionMessage& message) - { - LOG(ERROR) << "LoaderStateMachine::HandleExceptionMessage: error in the state machine, stopping all processing"; - LOG(ERROR) << "Error: " << message.GetException().What() << " Details: " << - message.GetException().GetDetails(); - Clear(); - } - - template - void LoaderStateMachine::HandleSuccessMessage(const T& message) - { - if (activeCommands_ <= 0) { - LOG(ERROR) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::HandleSuccessMessage : activeCommands_ should be > 0 but is: " << activeCommands_; - } - else { - activeCommands_--; - try - { - dynamic_cast(message.GetOrigin().GetPayload()).Handle(message); - Step(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Error in the state machine, stopping all processing: " << - e.What() << " Details: " << e.GetDetails(); - Clear(); - } - } - } - - - LoaderStateMachine::LoaderStateMachine( - OrthancStone::ILoadersContext& loadersContext) - : loadersContext_(loadersContext) - , active_(false) - , simultaneousDownloads_(4) - , activeCommands_(0) - { - using OrthancStone::ILoadersContext; - - LOG(TRACE) - << "LoaderStateMachine(" << std::hex << this - << std::dec << ")::LoaderStateMachine()"; - } - - void LoaderStateMachine::PostConstructor() - { - std::unique_ptr - lock(loadersContext_.Lock()); - - OrthancStone::IObservable& observable = lock->GetOracleObservable(); - - // TODO => Move this out of constructor - Register( - observable, &LoaderStateMachine::HandleSuccessMessage); - Register( - observable, &LoaderStateMachine::HandleSuccessMessage); - Register( - observable, &LoaderStateMachine::HandleSuccessMessage); - Register( - observable, &LoaderStateMachine::HandleExceptionMessage); - } - - LoaderStateMachine::~LoaderStateMachine() - { - LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::~LoaderStateMachine()"; - Clear(); - } - - void LoaderStateMachine::SetSimultaneousDownloads(unsigned int count) - { - if (active_) - { - LOG(ERROR) << "LoaderStateMachine::SetSimultaneousDownloads called while active_ is true"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else if (count == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - simultaneousDownloads_ = count; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/LoaderStateMachine.h --- a/Framework/Loaders/LoaderStateMachine.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IObservable.h" -#include "../Messages/ObserverBase.h" -#include "../Oracle/GetOrthancImageCommand.h" -#include "../Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../Oracle/IOracle.h" -#include "../Oracle/OracleCommandExceptionMessage.h" -#include "../Oracle/OrthancRestApiCommand.h" - -#include - -#include - -namespace OrthancStone -{ - class ILoadersContext; - - /** - This class is supplied with Oracle commands and will schedule up to - simultaneousDownloads_ of them at the same time, then will schedule the - rest once slots become available. It is used, a.o., by the - OrtancMultiframeVolumeLoader class. - - To use it, you need to create commands that derive from State. - - You need to initialize them with the object that must be called when - an answer is received. - */ - - class LoaderStateMachine : public OrthancStone::ObserverBase - { - public: - class State : public Orthanc::IDynamicObject - { - private: - LoaderStateMachine& that_; - - public: - State(LoaderStateMachine& that) : - that_(that) - { - } - - State(const State& currentState) : - that_(currentState.that_) - { - } - - void Schedule(OrthancStone::OracleCommandBase* command) const - { - that_.Schedule(command); - } - - template - T& GetLoader() const - { - return dynamic_cast(that_); - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message); - - virtual void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message); - - virtual void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message); - }; - - void Schedule(OrthancStone::OracleCommandBase* command); - - void Start(); - - private: - void Step(); - - void Clear(); - - void HandleExceptionMessage(const OrthancStone::OracleCommandExceptionMessage& message); - - template - void HandleSuccessMessage(const T& message); - - typedef std::list PendingCommands; - - OrthancStone::ILoadersContext& loadersContext_; - bool active_; - unsigned int simultaneousDownloads_; - PendingCommands pendingCommands_; - unsigned int activeCommands_; - - - public: - LoaderStateMachine(OrthancStone::ILoadersContext& loadersContext); - - void PostConstructor(); - - virtual ~LoaderStateMachine(); - - bool IsActive() const - { - return active_; - } - - void SetSimultaneousDownloads(unsigned int count); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OracleScheduler.cpp --- a/Framework/Loaders/OracleScheduler.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,557 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OracleScheduler.h" - -#include "../Oracle/ParseDicomFromFileCommand.h" - -namespace OrthancStone -{ - class OracleScheduler::ReceiverPayload : public Orthanc::IDynamicObject - { - private: - Priority priority_; - boost::weak_ptr receiver_; - std::unique_ptr command_; - - public: - ReceiverPayload(Priority priority, - boost::weak_ptr receiver, - IOracleCommand* command) : - priority_(priority), - receiver_(receiver), - command_(command) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - Priority GetActivePriority() const - { - return priority_; - } - - boost::weak_ptr GetOriginalReceiver() const - { - return receiver_; - } - - const IOracleCommand& GetOriginalCommand() const - { - assert(command_.get() != NULL); - return *command_; - } - }; - - - class OracleScheduler::ScheduledCommand : public boost::noncopyable - { - private: - boost::weak_ptr receiver_; - std::unique_ptr command_; - - public: - ScheduledCommand(boost::shared_ptr receiver, - IOracleCommand* command) : - receiver_(receiver), - command_(command) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - boost::weak_ptr GetReceiver() - { - return receiver_; - } - - bool IsSameReceiver(boost::shared_ptr receiver) const - { - boost::shared_ptr lock(receiver_.lock()); - - return (lock && - lock.get() == receiver.get()); - } - - IOracleCommand* WrapCommand(Priority priority) - { - if (command_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - std::unique_ptr wrapped(command_->Clone()); - dynamic_cast(*wrapped).AcquirePayload(new ReceiverPayload(priority, receiver_, command_.release())); - return wrapped.release(); - } - } - }; - - - - void OracleScheduler::ClearQueue(Queue& queue) - { - for (Queue::iterator it = queue.begin(); it != queue.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - - totalProcessed_ ++; - } - - queue.clear(); - } - - - void OracleScheduler::RemoveReceiverFromQueue(Queue& queue, - boost::shared_ptr receiver) - { - if (!receiver) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - Queue tmp; - - for (Queue::iterator it = queue.begin(); it != queue.end(); ++it) - { - assert(it->second != NULL); - - if (!(it->second->IsSameReceiver(receiver))) - { - // This promise is still active - tmp.insert(std::make_pair(it->first, it->second)); - } - else - { - delete it->second; - - totalProcessed_ ++; - } - } - - queue = tmp; - } - - - void OracleScheduler::CheckInvariants() const - { -#ifndef NDEBUG - /*char buf[1024]; - sprintf(buf, "active: %d %d %d ; pending: %lu %lu %lu", - activeHighPriorityCommands_, activeStandardPriorityCommands_, activeLowPriorityCommands_, - highPriorityQueue_.size(), standardPriorityQueue_.size(), lowPriorityQueue_.size()); - LOG(INFO) << buf;*/ - - assert(activeHighPriorityCommands_ <= maxHighPriorityCommands_); - assert(activeStandardPriorityCommands_ <= maxStandardPriorityCommands_); - assert(activeLowPriorityCommands_ <= maxLowPriorityCommands_); - assert(totalProcessed_ <= totalScheduled_); - - for (Queue::const_iterator it = standardPriorityQueue_.begin(); it != standardPriorityQueue_.end(); ++it) - { - assert(it->first > PRIORITY_HIGH && - it->first < PRIORITY_LOW); - } - - for (Queue::const_iterator it = highPriorityQueue_.begin(); it != highPriorityQueue_.end(); ++it) - { - assert(it->first <= PRIORITY_HIGH); - } - - for (Queue::const_iterator it = lowPriorityQueue_.begin(); it != lowPriorityQueue_.end(); ++it) - { - assert(it->first >= PRIORITY_LOW); - } -#endif - } - - - void OracleScheduler::SpawnFromQueue(Queue& queue, - Priority priority) - { - CheckInvariants(); - - Queue::iterator item = queue.begin(); - assert(item != queue.end()); - - std::unique_ptr command(dynamic_cast(item->second)); - queue.erase(item); - - if (command.get() != NULL) - { - /** - * Only schedule the command for execution in the oracle, if its - * receiver has not been destroyed yet. - **/ - boost::shared_ptr observer(command->GetReceiver().lock()); - if (observer) - { - if (oracle_.Schedule(GetSharedObserver(), command->WrapCommand(priority))) - { - /** - * Executing this code if "Schedule()" returned "false" - * above, will result in a memory leak within - * "OracleScheduler", as the scheduler believes that some - * command is still active (i.e. pending to be executed by - * the oracle), hereby stalling the scheduler during its - * destruction, and not freeing the - * "shared_ptr" of the Stone context (check - * out "sjo-playground/WebViewer/Backend/Leak") - **/ - - switch (priority) - { - case Priority_High: - activeHighPriorityCommands_ ++; - break; - - case Priority_Standard: - activeStandardPriorityCommands_ ++; - break; - - case Priority_Low: - activeLowPriorityCommands_ ++; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - else - { - totalProcessed_ ++; - } - } - } - else - { - LOG(ERROR) << "NULL command, should never happen"; - } - - CheckInvariants(); - } - - - void OracleScheduler::SpawnCommands() - { - // Send as many commands as possible to the oracle - while (!highPriorityQueue_.empty()) - { - if (activeHighPriorityCommands_ < maxHighPriorityCommands_) - { - // First fill the high-priority lane - SpawnFromQueue(highPriorityQueue_, Priority_High); - } - else if (activeStandardPriorityCommands_ < maxStandardPriorityCommands_) - { - // There remain too many high-priority commands for the - // high-priority lane, schedule them to the standard-priority lanes - SpawnFromQueue(highPriorityQueue_, Priority_Standard); - } - else if (activeLowPriorityCommands_ < maxLowPriorityCommands_) - { - SpawnFromQueue(highPriorityQueue_, Priority_Low); - } - else - { - return; // No slot available - } - } - - while (!standardPriorityQueue_.empty()) - { - if (activeStandardPriorityCommands_ < maxStandardPriorityCommands_) - { - SpawnFromQueue(standardPriorityQueue_, Priority_Standard); - } - else if (activeLowPriorityCommands_ < maxLowPriorityCommands_) - { - SpawnFromQueue(standardPriorityQueue_, Priority_Low); - } - else - { - return; - } - } - - while (!lowPriorityQueue_.empty()) - { - if (activeLowPriorityCommands_ < maxLowPriorityCommands_) - { - SpawnFromQueue(lowPriorityQueue_, Priority_Low); - } - else - { - return; - } - } - } - - - void OracleScheduler::RemoveActiveCommand(const ReceiverPayload& payload) - { - CheckInvariants(); - - totalProcessed_ ++; - - switch (payload.GetActivePriority()) - { - case Priority_High: - assert(activeHighPriorityCommands_ > 0); - activeHighPriorityCommands_ --; - break; - - case Priority_Standard: - assert(activeStandardPriorityCommands_ > 0); - activeStandardPriorityCommands_ --; - break; - - case Priority_Low: - assert(activeLowPriorityCommands_ > 0); - activeLowPriorityCommands_ --; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - SpawnCommands(); - - CheckInvariants(); - } - - - void OracleScheduler::Handle(const GetOrthancImageCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - GetOrthancImageCommand::SuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetImage(), message.GetMimeType()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - - void OracleScheduler::Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - GetOrthancWebViewerJpegCommand::SuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetImage()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - - void OracleScheduler::Handle(const HttpCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - HttpCommand::SuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetAnswerHeaders(), message.GetAnswer()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - - void OracleScheduler::Handle(const OrthancRestApiCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - OrthancRestApiCommand::SuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetAnswerHeaders(), message.GetAnswer()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - void OracleScheduler::Handle(const ParseDicomSuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - ParseDicomSuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetSource(), message.GetDicom(), message.GetFileSize(), message.HasPixelData()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } -#endif - - - void OracleScheduler::Handle(const ReadFileCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - - RemoveActiveCommand(payload); - - ReadFileCommand::SuccessMessage bis( - dynamic_cast(payload.GetOriginalCommand()), - message.GetContent()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - - void OracleScheduler::Handle(const OracleCommandExceptionMessage& message) - { - const OracleCommandBase& command = dynamic_cast(message.GetOrigin()); - - assert(command.HasPayload()); - const ReceiverPayload& payload = dynamic_cast(command.GetPayload()); - - RemoveActiveCommand(payload); - - OracleCommandExceptionMessage bis(payload.GetOriginalCommand(), message.GetException()); - emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); - } - - - OracleScheduler::OracleScheduler(IOracle& oracle, - IMessageEmitter& emitter, - unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority) : - oracle_(oracle), - emitter_(emitter), - maxHighPriorityCommands_(maxHighPriority), - maxStandardPriorityCommands_(maxStandardPriority), - maxLowPriorityCommands_(maxLowPriority), - activeHighPriorityCommands_(0), - activeStandardPriorityCommands_(0), - activeLowPriorityCommands_(0), - totalScheduled_(0), - totalProcessed_(0) - { - assert(PRIORITY_HIGH < 0 && - PRIORITY_LOW > 0); - - if (maxLowPriority <= 0) - { - // There must be at least 1 lane available to deal with low-priority commands - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - boost::shared_ptr OracleScheduler::Create(IOracle& oracle, - IObservable& oracleObservable, - IMessageEmitter& emitter, - unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority) - { - boost::shared_ptr scheduler - (new OracleScheduler(oracle, emitter, maxHighPriority, maxStandardPriority, maxLowPriority)); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - scheduler->Register(oracleObservable, &OracleScheduler::Handle); - -#if ORTHANC_ENABLE_DCMTK == 1 - scheduler->Register(oracleObservable, &OracleScheduler::Handle); -#endif - - return scheduler; - } - - - OracleScheduler::~OracleScheduler() - { - CancelAllRequests(); - } - - - void OracleScheduler::CancelRequests(boost::shared_ptr receiver) - { - RemoveReceiverFromQueue(standardPriorityQueue_, receiver); - RemoveReceiverFromQueue(highPriorityQueue_, receiver); - RemoveReceiverFromQueue(lowPriorityQueue_, receiver); - } - - - void OracleScheduler::CancelAllRequests() - { - ClearQueue(standardPriorityQueue_); - ClearQueue(highPriorityQueue_); - ClearQueue(lowPriorityQueue_); - } - - - void OracleScheduler::Schedule(boost::shared_ptr receiver, - int priority, - IOracleCommand* command /* Takes ownership */) - { - std::unique_ptr pending(new ScheduledCommand(receiver, dynamic_cast(command))); - - /** - * Safeguard to remember that a new "Handle()" method and a call - * to "scheduler->Register()" must be implemented for each - * possible oracle command. - **/ - assert(command->GetType() == IOracleCommand::Type_GetOrthancImage || - command->GetType() == IOracleCommand::Type_GetOrthancWebViewerJpeg || - command->GetType() == IOracleCommand::Type_Http || - command->GetType() == IOracleCommand::Type_OrthancRestApi || - command->GetType() == IOracleCommand::Type_ParseDicomFromFile || - command->GetType() == IOracleCommand::Type_ParseDicomFromWado || - command->GetType() == IOracleCommand::Type_ReadFile); - - if (priority <= PRIORITY_HIGH) - { - highPriorityQueue_.insert(std::make_pair(priority, pending.release())); - } - else if (priority >= PRIORITY_LOW) - { - lowPriorityQueue_.insert(std::make_pair(priority, pending.release())); - } - else - { - standardPriorityQueue_.insert(std::make_pair(priority, pending.release())); - } - - totalScheduled_ ++; - - SpawnCommands(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OracleScheduler.h --- a/Framework/Loaders/OracleScheduler.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#include "../Messages/IMessageEmitter.h" -#include "../Messages/ObserverBase.h" -#include "../Oracle/GetOrthancImageCommand.h" -#include "../Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../Oracle/HttpCommand.h" -#include "../Oracle/IOracle.h" -#include "../Oracle/OracleCommandExceptionMessage.h" -#include "../Oracle/OrthancRestApiCommand.h" -#include "../Oracle/ReadFileCommand.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "../Oracle/ParseDicomSuccessMessage.h" -#endif - -namespace OrthancStone -{ - class OracleScheduler : public ObserverBase - { - public: - static const int PRIORITY_HIGH = -1; - static const int PRIORITY_LOW = 100; - - private: - enum Priority - { - Priority_Low, - Priority_Standard, - Priority_High - }; - - class ReceiverPayload; - class ScheduledCommand; - - typedef std::multimap Queue; - - IOracle& oracle_; - IMessageEmitter& emitter_; - Queue standardPriorityQueue_; - Queue highPriorityQueue_; - Queue lowPriorityQueue_; - unsigned int maxHighPriorityCommands_; // Used if priority <= PRIORITY_HIGH - unsigned int maxStandardPriorityCommands_; - unsigned int maxLowPriorityCommands_; // Used if priority >= PRIORITY_LOW - unsigned int activeHighPriorityCommands_; - unsigned int activeStandardPriorityCommands_; - unsigned int activeLowPriorityCommands_; - uint64_t totalScheduled_; - uint64_t totalProcessed_; - - void ClearQueue(Queue& queue); - - void RemoveReceiverFromQueue(Queue& queue, - boost::shared_ptr receiver); - - void CheckInvariants() const; - - void SpawnFromQueue(Queue& queue, - Priority priority); - - void SpawnCommands(); - - void RemoveActiveCommand(const ReceiverPayload& payload); - - void Handle(const GetOrthancImageCommand::SuccessMessage& message); - - void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message); - - void Handle(const HttpCommand::SuccessMessage& message); - - void Handle(const OrthancRestApiCommand::SuccessMessage& message); - -#if ORTHANC_ENABLE_DCMTK == 1 - void Handle(const ParseDicomSuccessMessage& message); -#endif - - void Handle(const ReadFileCommand::SuccessMessage& message); - - void Handle(const OracleCommandExceptionMessage& message); - - OracleScheduler(IOracle& oracle, - IMessageEmitter& emitter, - unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority); - - public: - static boost::shared_ptr Create(IOracle& oracle, - IObservable& oracleObservable, - IMessageEmitter& emitter) - { - return Create(oracle, oracleObservable, emitter, 1, 4, 1); - } - - static boost::shared_ptr Create(IOracle& oracle, - IObservable& oracleObservable, - IMessageEmitter& emitter, - unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority); - - ~OracleScheduler(); - - unsigned int GetMaxHighPriorityCommands() const - { - return maxHighPriorityCommands_; - } - - unsigned int GetMaxStandardPriorityCommands() const - { - return maxStandardPriorityCommands_; - } - - unsigned int GetMaxLowPriorityCommands() const - { - return maxLowPriorityCommands_; - } - - uint64_t GetTotalScheduled() const - { - return totalScheduled_; - } - - uint64_t GetTotalProcessed() const - { - return totalProcessed_; - } - - // Cancel the HTTP requests that are still pending in the queues, - // and that are associated with the given receiver. Note that the - // receiver might still receive answers to HTTP requests that were - // already submitted to the oracle. - void CancelRequests(boost::shared_ptr receiver); - - void CancelAllRequests(); - - void Schedule(boost::shared_ptr receiver, - int priority, - IOracleCommand* command /* Takes ownership */); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OrthancMultiframeVolumeLoader.cpp --- a/Framework/Loaders/OrthancMultiframeVolumeLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,615 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrthancMultiframeVolumeLoader.h" - -#include -#include - -namespace OrthancStone -{ - class OrthancMultiframeVolumeLoader::LoadRTDoseGeometry : public LoaderStateMachine::State - { - private: - std::unique_ptr dicom_; - - public: - LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, - Orthanc::DicomMap* dicom) : - State(that), - dicom_(dicom) - { - if (dicom == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - // Complete the DICOM tags with just-received "Grid Frame Offset Vector" - std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); - dicom_->SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, s, false); - - GetLoader().SetGeometry(*dicom_); - } - }; - - - static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) - { - std::string s; - if (!dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "DICOM file without SOP class UID"); - } - else - { - return s; - } - } - - - class OrthancMultiframeVolumeLoader::LoadGeometry : public State - { - public: - LoadGeometry(OrthancMultiframeVolumeLoader& that) : - State(that) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - OrthancMultiframeVolumeLoader& loader = GetLoader(); - - Json::Value body; - message.ParseJsonBody(body); - - if (body.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - std::unique_ptr dicom(new Orthanc::DicomMap); - dicom->FromDicomAsJson(body); - - if (OrthancStone::StringToSopClassUid(GetSopClassUid(*dicom)) == OrthancStone::SopClassUid_RTDose) - { - // Download the "Grid Frame Offset Vector" DICOM tag, that is - // mandatory for RT-DOSE, but is too long to be returned by default - - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" + - Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); - command->AcquirePayload(new LoadRTDoseGeometry(loader, dicom.release())); - - Schedule(command.release()); - } - else - { - loader.SetGeometry(*dicom); - } - } - }; - - class OrthancMultiframeVolumeLoader::LoadTransferSyntax : public State - { - public: - LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : - State(that) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - GetLoader().SetTransferSyntax(message.GetAnswer()); - } - }; - - class OrthancMultiframeVolumeLoader::LoadUncompressedPixelData : public State - { - public: - LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : - State(that) - { - } - - virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - GetLoader().SetUncompressedPixelData(message.GetAnswer()); - } - }; - - const std::string& OrthancMultiframeVolumeLoader::GetInstanceId() const - { - if (IsActive()) - { - return instanceId_; - } - else - { - LOG(ERROR) << "OrthancMultiframeVolumeLoader::GetInstanceId(): (!IsActive())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - void OrthancMultiframeVolumeLoader::ScheduleFrameDownloads() - { - if (transferSyntaxUid_.empty() || - !volume_->HasGeometry()) - { - return; - } - /* - 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM - 1.2.840.10008.1.2.1 Explicit VR Little Endian - 1.2.840.10008.1.2.2 Explicit VR Big Endian - - See https://www.dicomlibrary.com/dicom/transfer-syntax/ - */ - if (transferSyntaxUid_ == "1.2.840.10008.1.2" || - transferSyntaxUid_ == "1.2.840.10008.1.2.1" || - transferSyntaxUid_ == "1.2.840.10008.1.2.2") - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - command->SetUri("/instances/" + instanceId_ + "/content/" + - Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); - command->AcquirePayload(new LoadUncompressedPixelData(*this)); - Schedule(command.release()); - } - else - { - throw Orthanc::OrthancException( - Orthanc::ErrorCode_NotImplemented, - "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); - } - } - - void OrthancMultiframeVolumeLoader::SetTransferSyntax(const std::string& transferSyntax) - { - transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); - ScheduleFrameDownloads(); - } - - void OrthancMultiframeVolumeLoader::SetGeometry(const Orthanc::DicomMap& dicom) - { - OrthancStone::DicomInstanceParameters parameters(dicom); - volume_->SetDicomParameters(parameters); - - Orthanc::PixelFormat format; - if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - double spacingZ; - switch (parameters.GetSopClassUid()) - { - case OrthancStone::SopClassUid_RTDose: - spacingZ = parameters.GetThickness(); - break; - - default: - throw Orthanc::OrthancException( - Orthanc::ErrorCode_NotImplemented, - "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); - } - - const unsigned int width = parameters.GetImageInformation().GetWidth(); - const unsigned int height = parameters.GetImageInformation().GetHeight(); - const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); - - { - OrthancStone::VolumeImageGeometry geometry; - geometry.SetSizeInVoxels(width, height, depth); - geometry.SetAxialGeometry(parameters.GetGeometry()); - geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), - parameters.GetPixelSpacingY(), spacingZ); - volume_->Initialize(geometry, format, true /* Do compute range */); - } - - volume_->GetPixelData().Clear(); - - ScheduleFrameDownloads(); - - - - BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); - } - - - ORTHANC_FORCE_INLINE - static void CopyPixel(uint32_t& target, const void* source) - { - // TODO - check alignement? - target = le32toh(*reinterpret_cast(source)); - } - - ORTHANC_FORCE_INLINE - static void CopyPixel(uint16_t& target, const void* source) - { - // TODO - check alignement? - target = le16toh(*reinterpret_cast(source)); - } - - ORTHANC_FORCE_INLINE - static void CopyPixel(int16_t& target, const void* source) - { - // byte swapping is the same for unsigned and signed integers - // (the sign bit is always stored with the MSByte) - uint16_t* targetUp = reinterpret_cast(&target); - CopyPixel(*targetUp, source); - } - - template - void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeDistribution( - const std::string& pixelData, std::map& distribution) - { - OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); - - const unsigned int bpp = target.GetBytesPerPixel(); - const unsigned int width = target.GetWidth(); - const unsigned int height = target.GetHeight(); - const unsigned int depth = target.GetDepth(); - - if (pixelData.size() != bpp * width * height * depth) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "The pixel data has not the proper size"); - } - - if (pixelData.empty()) - { - return; - } - - // first pass to initialize map - { - const uint8_t* source = reinterpret_cast(pixelData.c_str()); - - for (unsigned int z = 0; z < depth; z++) - { - for (unsigned int y = 0; y < height; y++) - { - for (unsigned int x = 0; x < width; x++) - { - T value; - CopyPixel(value, source); - distribution[value] = 0; - source += bpp; - } - } - } - } - - { - const uint8_t* source = reinterpret_cast(pixelData.c_str()); - - for (unsigned int z = 0; z < depth; z++) - { - OrthancStone::ImageBuffer3D::SliceWriter writer(target, OrthancStone::VolumeProjection_Axial, z); - - assert(writer.GetAccessor().GetWidth() == width && - writer.GetAccessor().GetHeight() == height); -#if 0 - for (unsigned int y = 0; y < height; y++) - { - assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); - - T* target = reinterpret_cast(writer.GetAccessor().GetRow(y)); - - for (unsigned int x = 0; x < width; x++) - { - CopyPixel(*target, source); - - distribution[*target] += 1; - - target++; - source += bpp; - } - } -#else - // optimized version (fixed) as of 2020-04-15 - unsigned int pitch = writer.GetAccessor().GetPitch(); - T* targetAddrLine = reinterpret_cast(writer.GetAccessor().GetRow(0)); - assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); - - for (unsigned int y = 0; y < height; y++) - { - T* targetAddrPix = targetAddrLine; - for (unsigned int x = 0; x < width; x++) - { - CopyPixel(*targetAddrPix, source); - - distribution[*targetAddrPix] += 1; - - targetAddrPix++; - source += bpp; - } - uint8_t* targetAddrLineBytes = reinterpret_cast(targetAddrLine) + pitch; - targetAddrLine = reinterpret_cast(targetAddrLineBytes); - } -#endif - } - } - } - - template - void OrthancMultiframeVolumeLoader::ComputeMinMaxWithOutlierRejection( - const std::map& distribution) - { - if (distribution.size() == 0) - { - LOG(ERROR) << "ComputeMinMaxWithOutlierRejection -- Volume image empty."; - } - else - { - OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); - - const uint64_t width = target.GetWidth(); - const uint64_t height = target.GetHeight(); - const uint64_t depth = target.GetDepth(); - const uint64_t voxelCount = width * height * depth; - - // now that we have distribution[pixelValue] == numberOfPixelsWithValue - // compute number of values and check (assertion) that it is equal to - // width * height * depth - { - typename std::map::const_iterator it = distribution.begin(); - uint64_t totalCount = 0; - distributionRawMin_ = static_cast(it->first); - - while (it != distribution.end()) - { - T pixelValue = it->first; - uint64_t count = it->second; - totalCount += count; - it++; - if (it == distribution.end()) - distributionRawMax_ = static_cast(pixelValue); - } - LOG(INFO) << "Volume image. First distribution value = " - << static_cast(distributionRawMin_) - << " | Last distribution value = " - << static_cast(distributionRawMax_); - - if (totalCount != voxelCount) - { - LOG(ERROR) << "Internal error in dose distribution computation. TC (" - << totalCount << ") != VoxC (" << voxelCount; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - // compute the number of voxels to reject at each end of the distribution - uint64_t endRejectionCount = static_cast( - outliersHalfRejectionRate_ * voxelCount); - - if (endRejectionCount > voxelCount) - { - LOG(ERROR) << "Internal error in dose distribution computation." - << " endRejectionCount = " << endRejectionCount - << " | voxelCount = " << voxelCount; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // this will contain the actual distribution minimum after outlier - // rejection - T resultMin = 0; - - // then start from start and remove pixel values up to - // endRejectionCount voxels rejected - { - typename std::map::const_iterator it = distribution.begin(); - - uint64_t currentCount = 0; - - while (it != distribution.end()) - { - T pixelValue = it->first; - uint64_t count = it->second; - - // if this pixelValue crosses the rejection threshold, let's set it - // and exit the loop - if ((currentCount <= endRejectionCount) && - (currentCount + count > endRejectionCount)) - { - resultMin = pixelValue; - break; - } - else - { - currentCount += count; - } - // and continue walking along the distribution - it++; - } - } - - // this will contain the actual distribution maximum after outlier - // rejection - T resultMax = 0; - // now start from END and remove pixel values up to - // endRejectionCount voxels rejected - { - typename std::map::const_reverse_iterator it = distribution.rbegin(); - - uint64_t currentCount = 0; - - while (it != distribution.rend()) - { - T pixelValue = it->first; - uint64_t count = it->second; - - if ((currentCount <= endRejectionCount) && - (currentCount + count > endRejectionCount)) - { - resultMax = pixelValue; - break; - } - else - { - currentCount += count; - } - // and continue walking along the distribution - it++; - } - } - if (resultMin > resultMax) - { - LOG(ERROR) << "Internal error in dose distribution computation! " << - "resultMin (" << resultMin << ") > resultMax (" << resultMax << ")"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - computedDistributionMin_ = static_cast(resultMin); - computedDistributionMax_ = static_cast(resultMax); - } - } - - template - void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeMinMax( - const std::string& pixelData) - { - std::map distribution; - CopyPixelDataAndComputeDistribution(pixelData, distribution); - ComputeMinMaxWithOutlierRejection(distribution); - } - - void OrthancMultiframeVolumeLoader::SetUncompressedPixelData(const std::string& pixelData) - { - switch (volume_->GetPixelData().GetFormat()) - { - case Orthanc::PixelFormat_Grayscale32: - CopyPixelDataAndComputeMinMax(pixelData); - break; - case Orthanc::PixelFormat_Grayscale16: - CopyPixelDataAndComputeMinMax(pixelData); - break; - case Orthanc::PixelFormat_SignedGrayscale16: - CopyPixelDataAndComputeMinMax(pixelData); - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - volume_->IncrementRevision(); - - pixelDataLoaded_ = true; - BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); - } - - bool OrthancMultiframeVolumeLoader::HasGeometry() const - { - return volume_->HasGeometry(); - } - - const OrthancStone::VolumeImageGeometry& OrthancMultiframeVolumeLoader::GetImageGeometry() const - { - return volume_->GetGeometry(); - } - - OrthancMultiframeVolumeLoader::OrthancMultiframeVolumeLoader( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - float outliersHalfRejectionRate) - : LoaderStateMachine(loadersContext) - , volume_(volume) - , pixelDataLoaded_(false) - , outliersHalfRejectionRate_(outliersHalfRejectionRate) - , distributionRawMin_(0) - , distributionRawMax_(0) - , computedDistributionMin_(0) - , computedDistributionMax_(0) - { - if (volume.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - - boost::shared_ptr - OrthancMultiframeVolumeLoader::Create( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - float outliersHalfRejectionRate /*= 0.0005*/) - { - boost::shared_ptr obj( - new OrthancMultiframeVolumeLoader( - loadersContext, - volume, - outliersHalfRejectionRate)); - obj->LoaderStateMachine::PostConstructor(); - return obj; - } - - OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader() - { - LOG(TRACE) << "OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader()"; - } - - void OrthancMultiframeVolumeLoader::GetDistributionMinMax - (float& minValue, float& maxValue) const - { - if (distributionRawMin_ == 0 && distributionRawMax_ == 0) - { - LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; - } - minValue = distributionRawMin_; - maxValue = distributionRawMax_; - } - - void OrthancMultiframeVolumeLoader::GetDistributionMinMaxWithOutliersRejection - (float& minValue, float& maxValue) const - { - if (computedDistributionMin_ == 0 && computedDistributionMax_ == 0) - { - LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; - } - minValue = computedDistributionMin_; - maxValue = computedDistributionMax_; - } - - void OrthancMultiframeVolumeLoader::LoadInstance(const std::string& instanceId) - { - Start(); - - instanceId_ = instanceId; - - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - command->SetUri("/instances/" + instanceId + "/tags"); - command->AcquirePayload(new LoadGeometry(*this)); - Schedule(command.release()); - } - - { - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); - command->AcquirePayload(new LoadTransferSyntax(*this)); - Schedule(command.release()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OrthancMultiframeVolumeLoader.h --- a/Framework/Loaders/OrthancMultiframeVolumeLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "LoaderStateMachine.h" -#include "../Volumes/DicomVolumeImage.h" -#include "../Volumes/IGeometryProvider.h" - -#include - -namespace OrthancStone -{ - class OrthancMultiframeVolumeLoader : - public LoaderStateMachine, - public OrthancStone::IObservable, - public IGeometryProvider - { - private: - class LoadRTDoseGeometry; - class LoadGeometry; - class LoadTransferSyntax; - class LoadUncompressedPixelData; - - boost::shared_ptr volume_; - std::string instanceId_; - std::string transferSyntaxUid_; - bool pixelDataLoaded_; - float outliersHalfRejectionRate_; - float distributionRawMin_; - float distributionRawMax_; - float computedDistributionMin_; - float computedDistributionMax_; - - const std::string& GetInstanceId() const; - - void ScheduleFrameDownloads(); - - void SetTransferSyntax(const std::string& transferSyntax); - - void SetGeometry(const Orthanc::DicomMap& dicom); - - - /** - This method will : - - - copy the pixel values from the response to the volume image - - compute the maximum and minimum value while discarding the - outliersHalfRejectionRate_ fraction of the outliers from both the start - and the end of the distribution. - - In English, this means that, if the volume dataset contains a few extreme - values very different from the rest (outliers) that we want to get rid of, - this method allows to do so. - - If you supply 0.005, for instance, it means 1% of the extreme values will - be rejected (0.5% on each side of the distribution) - */ - template - void CopyPixelDataAndComputeMinMax(const std::string& pixelData); - - /** Service method for CopyPixelDataAndComputeMinMax*/ - template - void CopyPixelDataAndComputeDistribution( - const std::string& pixelData, - std::map& distribution); - - /** Service method for CopyPixelDataAndComputeMinMax*/ - template - void ComputeMinMaxWithOutlierRejection( - const std::map& distribution); - - void SetUncompressedPixelData(const std::string& pixelData); - - protected: - OrthancMultiframeVolumeLoader( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - float outliersHalfRejectionRate); - public: - - static boost::shared_ptr Create( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - float outliersHalfRejectionRate = 0.0005); - - virtual ~OrthancMultiframeVolumeLoader(); - - bool HasGeometry() const; - const OrthancStone::VolumeImageGeometry& GetImageGeometry() const; - - bool IsPixelDataLoaded() const - { - return pixelDataLoaded_; - } - - void GetDistributionMinMax - (float& minValue, float& maxValue) const; - - void GetDistributionMinMaxWithOutliersRejection - (float& minValue, float& maxValue) const; - - void LoadInstance(const std::string& instanceId); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp --- a/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,611 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrthancSeriesVolumeProgressiveLoader.h" - -#include "../StoneException.h" -#include "../Loaders/ILoadersContext.h" -#include "../Loaders/BasicFetchingItemsSorter.h" -#include "../Loaders/BasicFetchingStrategy.h" -#include "../Toolbox/GeometryToolbox.h" -#include "../Volumes/DicomVolumeImageMPRSlicer.h" - -#include -#include -#include - - -namespace OrthancStone -{ - using OrthancStone::ILoadersContext; - - class OrthancSeriesVolumeProgressiveLoader::ExtractedSlice : public OrthancStone::DicomVolumeImageMPRSlicer::Slice - { - private: - const OrthancSeriesVolumeProgressiveLoader& that_; - - public: - ExtractedSlice(const OrthancSeriesVolumeProgressiveLoader& that, - const OrthancStone::CoordinateSystem3D& plane) : - OrthancStone::DicomVolumeImageMPRSlicer::Slice(*that.volume_, plane), - that_(that) - { - if (IsValid()) - { - if (GetProjection() == OrthancStone::VolumeProjection_Axial) - { - // For coronal and sagittal projections, we take the global - // revision of the volume because even if a single slice changes, - // this means the projection will yield a different result --> - // we must increase the revision as soon as any slice changes - SetRevision(that_.seriesGeometry_.GetSliceRevision(GetSliceIndex())); - } - - if (that_.strategy_.get() != NULL && - GetProjection() == OrthancStone::VolumeProjection_Axial) - { - that_.strategy_->SetCurrent(GetSliceIndex()); - } - } - } - }; - - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSlice( - size_t index, const OrthancStone::DicomInstanceParameters& reference) const - { - const OrthancStone::DicomInstanceParameters& slice = *slices_[index]; - - if (!OrthancStone::GeometryToolbox::IsParallel( - reference.GetGeometry().GetNormal(), - slice.GetGeometry().GetNormal())) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, - "A slice in the volume image is not parallel to the others"); - } - - if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, - "The pixel format changes across the slices of the volume image"); - } - - if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || - reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, - "The width/height of slices are not constant in the volume image"); - } - - if (!OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || - !OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, - "The pixel spacing of the slices change across the volume image"); - } - } - - - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckVolume() const - { - for (size_t i = 0; i < slices_.size(); i++) - { - assert(slices_[i] != NULL); - if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, - "This class does not support multi-frame images"); - } - } - - if (slices_.size() != 0) - { - const OrthancStone::DicomInstanceParameters& reference = *slices_[0]; - - for (size_t i = 1; i < slices_.size(); i++) - { - CheckSlice(i, reference); - } - } - } - - - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::Clear() - { - for (size_t i = 0; i < slices_.size(); i++) - { - assert(slices_[i] != NULL); - delete slices_[i]; - } - - slices_.clear(); - slicesRevision_.clear(); - } - - - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index) const - { - if (!HasGeometry()) - { - LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index): (!HasGeometry())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else if (index >= slices_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(slices_.size() == GetImageGeometry().GetDepth() && - slices_.size() == slicesRevision_.size()); - } - } - - - // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" - // (called with the slices created in LoadGeometry) - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::ComputeGeometry(OrthancStone::SlicesSorter& slices) - { - Clear(); - - if (!slices.Sort()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, - "Cannot sort the 3D slices of a DICOM series"); - } - - if (slices.GetSlicesCount() == 0) - { - geometry_.reset(new OrthancStone::VolumeImageGeometry); - } - else - { - slices_.reserve(slices.GetSlicesCount()); - slicesRevision_.resize(slices.GetSlicesCount(), 0); - - for (size_t i = 0; i < slices.GetSlicesCount(); i++) - { - const OrthancStone::DicomInstanceParameters& slice = - dynamic_cast(slices.GetSlicePayload(i)); - slices_.push_back(new OrthancStone::DicomInstanceParameters(slice)); - } - - CheckVolume(); - - double spacingZ; - - if (slices.ComputeSpacingBetweenSlices(spacingZ)) - { - LOG(TRACE) << "Computed spacing between slices: " << spacingZ << "mm"; - - const OrthancStone::DicomInstanceParameters& parameters = *slices_[0]; - - geometry_.reset(new OrthancStone::VolumeImageGeometry); - geometry_->SetSizeInVoxels(parameters.GetImageInformation().GetWidth(), - parameters.GetImageInformation().GetHeight(), - static_cast(slices.GetSlicesCount())); - geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); - geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), - parameters.GetPixelSpacingY(), spacingZ); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, - "The origins of the slices of a volume image are not regularly spaced"); - } - } - } - - - const OrthancStone::VolumeImageGeometry& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry() const - { - if (!HasGeometry()) - { - LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry(): (!HasGeometry())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - assert(slices_.size() == geometry_->GetDepth()); - return *geometry_; - } - } - - - const OrthancStone::DicomInstanceParameters& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceParameters(size_t index) const - { - CheckSliceIndex(index); - return *slices_[index]; - } - - - uint64_t OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceRevision(size_t index) const - { - CheckSliceIndex(index); - return slicesRevision_[index]; - } - - - void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::IncrementSliceRevision(size_t index) - { - CheckSliceIndex(index); - slicesRevision_[index] ++; - } - - - static unsigned int GetSliceIndexPayload(const OrthancStone::OracleCommandBase& command) - { - assert(command.HasPayload()); - return dynamic_cast< const Orthanc::SingleValueObject& >(command.GetPayload()).GetValue(); - } - - - void OrthancSeriesVolumeProgressiveLoader::ScheduleNextSliceDownload() - { - assert(strategy_.get() != NULL); - - unsigned int sliceIndex = 0, quality = 0; - - if (strategy_->GetNext(sliceIndex, quality)) - { - if (!progressiveQuality_) - { - ORTHANC_ASSERT(quality == QUALITY_00, "INTERNAL ERROR. quality != QUALITY_00 in " - << "OrthancSeriesVolumeProgressiveLoader::ScheduleNextSliceDownload"); - } - - const OrthancStone::DicomInstanceParameters& slice = seriesGeometry_.GetSliceParameters(sliceIndex); - - const std::string& instance = slice.GetOrthancInstanceIdentifier(); - if (instance.empty()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - std::unique_ptr command; - - if (!progressiveQuality_ || quality == QUALITY_02) - { - std::unique_ptr tmp(new OrthancStone::GetOrthancImageCommand); - // TODO: review the following comment. - // - Commented out by bgo on 2019-07-19 | reason: Alain has seen cases - // where gzipping the uint16 image took 11 sec to produce 5mb. - // The unzipped request was much much faster. - // - Re-enabled on 2019-07-30. Reason: in Web Assembly, the browser - // does not use the Accept-Encoding header and always requests - // compression. Furthermore, NOT - tmp->SetHttpHeader("Accept-Encoding", "gzip"); - tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); - tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); - tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); - //LOG(INFO) - // << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" - // << " sliceIndex = " << sliceIndex << " slice quality = " << quality - // << " URI = " << tmp->GetUri(); - command.reset(tmp.release()); - } - else // progressive mode is true AND quality is not final (different from QUALITY_02 - { - std::unique_ptr tmp( - new OrthancStone::GetOrthancWebViewerJpegCommand); - - // TODO: review the following comment. Commented out by bgo on 2019-07-19 - // (gzip for jpeg seems overkill) - //tmp->SetHttpHeader("Accept-Encoding", "gzip"); - tmp->SetInstance(instance); - tmp->SetQuality((quality == 0 ? 50 : 90)); // QUALITY_00 is Jpeg50 while QUALITY_01 is Jpeg90 - tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); - LOG(TRACE) - << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" - << " sliceIndex = " << sliceIndex << " slice quality = " << quality; - command.reset(tmp.release()); - } - - command->AcquirePayload(new Orthanc::SingleValueObject(sliceIndex)); - - { - std::unique_ptr lock(loadersContext_.Lock()); - boost::shared_ptr observer(GetSharedObserver()); - lock->Schedule(observer, sliceSchedulingPriority_, command.release()); - } - } - else - { - // loading is finished! - volumeImageReadyInHighQuality_ = true; - BroadcastMessage(OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality(*this)); - } - } - -/** - This is called in response to GET "/series/XXXXXXXXXXXXX/instances-tags" -*/ - void OrthancSeriesVolumeProgressiveLoader::LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - Json::Value body; - message.ParseJsonBody(body); - - if (body.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - { - Json::Value::Members instances = body.getMemberNames(); - - OrthancStone::SlicesSorter slices; - - for (size_t i = 0; i < instances.size(); i++) - { - Orthanc::DicomMap dicom; - dicom.FromDicomAsJson(body[instances[i]]); - - std::unique_ptr instance(new OrthancStone::DicomInstanceParameters(dicom)); - instance->SetOrthancInstanceIdentifier(instances[i]); - - // the 3D plane corresponding to the slice - OrthancStone::CoordinateSystem3D geometry = instance->GetGeometry(); - slices.AddSlice(geometry, instance.release()); - - if (slicePostProcessor_) - slicePostProcessor_->ProcessCTDicomSlice(dicom); - } - - seriesGeometry_.ComputeGeometry(slices); - } - - size_t slicesCount = seriesGeometry_.GetImageGeometry().GetDepth(); - - if (slicesCount == 0) - { - volume_->Initialize(seriesGeometry_.GetImageGeometry(), Orthanc::PixelFormat_Grayscale8); - } - else - { - const OrthancStone::DicomInstanceParameters& parameters = seriesGeometry_.GetSliceParameters(0); - - volume_->Initialize(seriesGeometry_.GetImageGeometry(), parameters.GetExpectedPixelFormat()); - volume_->SetDicomParameters(parameters); - volume_->GetPixelData().Clear(); - - // If we are in progressive mode, the Fetching strategy will first request QUALITY_00, then QUALITY_01, then - // QUALITY_02... Otherwise, it's only QUALITY_00 - unsigned int maxQuality = QUALITY_00; - if (progressiveQuality_) - maxQuality = QUALITY_02; - - strategy_.reset(new OrthancStone::BasicFetchingStrategy( - sorter_->CreateSorter(static_cast(slicesCount)), - maxQuality)); - - assert(simultaneousDownloads_ != 0); - for (unsigned int i = 0; i < simultaneousDownloads_; i++) - { - ScheduleNextSliceDownload(); - } - } - - slicesQuality_.resize(slicesCount, 0); - - BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); - } - - - void OrthancSeriesVolumeProgressiveLoader::SetSliceContent(unsigned int sliceIndex, - const Orthanc::ImageAccessor& image, - unsigned int quality) - { - ORTHANC_ASSERT(sliceIndex < slicesQuality_.size() && - slicesQuality_.size() == volume_->GetPixelData().GetDepth()); - - if (!progressiveQuality_) - { - ORTHANC_ASSERT(quality == QUALITY_00); - ORTHANC_ASSERT(slicesQuality_[sliceIndex] == QUALITY_00); - } - - if (quality >= slicesQuality_[sliceIndex]) - { - { - OrthancStone::ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), - OrthancStone::VolumeProjection_Axial, - sliceIndex); - - Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); - } - - volume_->IncrementRevision(); - seriesGeometry_.IncrementSliceRevision(sliceIndex); - slicesQuality_[sliceIndex] = quality; - - BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); - } - LOG(TRACE) << "SetSliceContent sliceIndex = " << sliceIndex << " -- will " - << " now call ScheduleNextSliceDownload()"; - ScheduleNextSliceDownload(); - } - - void OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent( - const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) - { - unsigned int quality = QUALITY_00; - if (progressiveQuality_) - quality = QUALITY_02; - - SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), - message.GetImage(), - quality); - } - - void OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent( - const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) - { - ORTHANC_ASSERT(progressiveQuality_, "INTERNAL ERROR: OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent" - << " called while progressiveQuality_ is false!"); - - LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent"; - unsigned int quality; - - switch (dynamic_cast(message.GetOrigin()).GetQuality()) - { - case 50: - quality = QUALITY_00; - break; - - case 90: - quality = QUALITY_01; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); - } - - - void OrthancSeriesVolumeProgressiveLoader::SetMetadataSchedulingPriority(int p) - { - medadataSchedulingPriority_ = p; - } - - int OrthancSeriesVolumeProgressiveLoader::GetMetadataSchedulingPriority() const - { - return medadataSchedulingPriority_; - } - - void OrthancSeriesVolumeProgressiveLoader::SetSliceSchedulingPriority(int p) - { - sliceSchedulingPriority_ = p; - } - - int OrthancSeriesVolumeProgressiveLoader::GetSliceSchedulingPriority() const - { - return sliceSchedulingPriority_; - } - - void OrthancSeriesVolumeProgressiveLoader::SetSchedulingPriority(int p) - { - medadataSchedulingPriority_ = p; - sliceSchedulingPriority_ = p; - } - - OrthancSeriesVolumeProgressiveLoader::OrthancSeriesVolumeProgressiveLoader( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - bool progressiveQuality) - : loadersContext_(loadersContext) - , active_(false) - , progressiveQuality_(progressiveQuality) - , simultaneousDownloads_(4) - , volume_(volume) - , sorter_(new OrthancStone::BasicFetchingItemsSorter::Factory) - , volumeImageReadyInHighQuality_(false) - , medadataSchedulingPriority_(0) - , sliceSchedulingPriority_(0) - { - } - - boost::shared_ptr - OrthancSeriesVolumeProgressiveLoader::Create( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - bool progressiveQuality) - { - std::unique_ptr lock(loadersContext.Lock()); - - boost::shared_ptr obj( - new OrthancSeriesVolumeProgressiveLoader( - loadersContext, volume, progressiveQuality)); - - obj->Register( - lock->GetOracleObservable(), - &OrthancSeriesVolumeProgressiveLoader::LoadGeometry); - - obj->Register( - lock->GetOracleObservable(), - &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent); - - obj->Register( - lock->GetOracleObservable(), - &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent); - - return obj; - } - - - OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader() - { - LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader()"; - } - - void OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(unsigned int count) - { - if (active_) - { - LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(): (active_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else if (count == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - simultaneousDownloads_ = count; - } - } - - - void OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId) - { - if (active_) - { - LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId): (active_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - active_ = true; - - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetUri("/series/" + seriesId + "/instances-tags"); - { - std::unique_ptr lock(loadersContext_.Lock()); - boost::shared_ptr observer(GetSharedObserver()); - lock->Schedule(observer, medadataSchedulingPriority_, command.release()); - } - } - } - - - OrthancStone::IVolumeSlicer::IExtractedSlice* - OrthancSeriesVolumeProgressiveLoader::ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) - { - if (volume_->HasGeometry()) - { - return new ExtractedSlice(*this, cuttingPlane); - } - else - { - return new IVolumeSlicer::InvalidSlice; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h --- a/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,227 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Loaders/IFetchingItemsSorter.h" -#include "../Loaders/IFetchingStrategy.h" -#include "../Messages/IObservable.h" -#include "../Messages/ObserverBase.h" -#include "../Oracle/GetOrthancImageCommand.h" -#include "../Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../Oracle/IOracle.h" -#include "../Oracle/OrthancRestApiCommand.h" -#include "../Toolbox/SlicesSorter.h" -#include "../Volumes/DicomVolumeImage.h" -#include "../Volumes/IVolumeSlicer.h" - -#include "../Volumes/IGeometryProvider.h" - - -#include - -namespace OrthancStone -{ - class ILoadersContext; - /** - This class is used to manage the progressive loading of a volume that - is stored in a Dicom series. - */ - class OrthancSeriesVolumeProgressiveLoader : - public OrthancStone::ObserverBase, - public OrthancStone::IObservable, - public OrthancStone::IVolumeSlicer, - public IGeometryProvider - { - public: - class ISlicePostProcessor - { - public: - virtual void ProcessCTDicomSlice(const Orthanc::DicomMap& dicom) = 0; - }; - - private: - static const unsigned int QUALITY_00 = 0; - static const unsigned int QUALITY_01 = 1; - static const unsigned int QUALITY_02 = 2; - - class ExtractedSlice; - - - /** Helper class internal to OrthancSeriesVolumeProgressiveLoader */ - class SeriesGeometry : public boost::noncopyable - { - private: - void CheckSlice(size_t index, - const OrthancStone::DicomInstanceParameters& reference) const; - - void CheckVolume() const; - - void Clear(); - - void CheckSliceIndex(size_t index) const; - - std::unique_ptr geometry_; - std::vector slices_; - std::vector slicesRevision_; - - public: - ~SeriesGeometry() - { - Clear(); - } - - void ComputeGeometry(OrthancStone::SlicesSorter& slices); - - virtual bool HasGeometry() const - { - return geometry_.get() != NULL; - } - - virtual const OrthancStone::VolumeImageGeometry& GetImageGeometry() const; - - const OrthancStone::DicomInstanceParameters& GetSliceParameters(size_t index) const; - - uint64_t GetSliceRevision(size_t index) const; - - void IncrementSliceRevision(size_t index); - }; - - void ScheduleNextSliceDownload(); - - void LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message); - - void SetSliceContent(unsigned int sliceIndex, - const Orthanc::ImageAccessor& image, - unsigned int quality); - - void LoadBestQualitySliceContent(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message); - - void LoadJpegSliceContent(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message); - - OrthancStone::ILoadersContext& loadersContext_; - bool active_; - bool progressiveQuality_; - unsigned int simultaneousDownloads_; - SeriesGeometry seriesGeometry_; - boost::shared_ptr volume_; - std::unique_ptr sorter_; - std::unique_ptr strategy_; - - std::vector slicesQuality_; - bool volumeImageReadyInHighQuality_; - - boost::shared_ptr slicePostProcessor_; - - /** See priority setters/getters below */ - int medadataSchedulingPriority_; - - /** See priority setters/getters below */ - int sliceSchedulingPriority_; - - OrthancSeriesVolumeProgressiveLoader( - OrthancStone::ILoadersContext& loadersContext, - boost::shared_ptr volume, - bool progressiveQuality); - - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeImageReadyInHighQuality, OrthancSeriesVolumeProgressiveLoader); - - /** - See doc for the progressiveQuality_ field - */ - static boost::shared_ptr Create( - OrthancStone::ILoadersContext& context, - boost::shared_ptr volume, - bool progressiveQuality = false); - - virtual ~OrthancSeriesVolumeProgressiveLoader(); - - void SetSimultaneousDownloads(unsigned int count); - - /** - Sets the relative priority of the requests for metadata. - - if p < PRIORITY_HIGH (-1) , the requests will be high priority - - if PRIORITY_LOW (100) > p > PRIORITY_HIGH , the requests will be medium priority - - if p > PRIORITY_LOW , the requests will be low priority - - Default is 0 (medium) - */ - void SetMetadataSchedulingPriority(int p); - - /** @see SetMetadataSchedulingPriority */ - int GetMetadataSchedulingPriority() const; - - /** Same as SetMetadataSchedulingPriority, for slices. Default is 0. */ - void SetSliceSchedulingPriority(int p); - - /** @see SetSliceSchedulingPriority */ - int GetSliceSchedulingPriority() const; - - /** Sets priorities for all requests. @see SetMetadataSchedulingPriority */ - void SetSchedulingPriority(int p); - - void SetDicomSlicePostProcessor(boost::shared_ptr slicePostProcessor) - { - // this will delete the previously stored slice processor, if any - slicePostProcessor_ = slicePostProcessor; - } - - boost::shared_ptr GetDicomSlicePostProcessor() - { - // this could be empty! - return slicePostProcessor_; - } - - bool IsVolumeImageReadyInHighQuality() const - { - return volumeImageReadyInHighQuality_; - } - - void LoadSeries(const std::string& seriesId); - - /** - This getter is used by clients that do not receive the geometry through - subscribing, for instance if they are created or listening only AFTER the - "geometry loaded" message is broadcast - */ - bool HasGeometry() const ORTHANC_OVERRIDE - { - return seriesGeometry_.HasGeometry(); - } - - /** - Same remark as HasGeometry - */ - const OrthancStone::VolumeImageGeometry& GetImageGeometry() const ORTHANC_OVERRIDE - { - return seriesGeometry_.GetImageGeometry(); - } - - /** - When a slice is requested, the strategy algorithm (that defines the - sequence of resources to be loaded from the server) is modified to - take into account this request (this is done in the ExtractedSlice ctor) - */ - virtual IExtractedSlice* - ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesFramesLoader.cpp --- a/Framework/Loaders/SeriesFramesLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,550 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SeriesFramesLoader.h" - -#include "../Oracle/ParseDicomFromFileCommand.h" -#include "../Oracle/ParseDicomFromWadoCommand.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include -#endif - -#include -#include -#include -#include - -#include - -namespace OrthancStone -{ - class SeriesFramesLoader::Payload : public Orthanc::IDynamicObject - { - private: - DicomSource source_; - size_t seriesIndex_; - std::string sopInstanceUid_; // Only used for debug purpose - unsigned int quality_; - bool hasWindowing_; - float windowingCenter_; - float windowingWidth_; - std::unique_ptr userPayload_; - - public: - Payload(const DicomSource& source, - size_t seriesIndex, - const std::string& sopInstanceUid, - unsigned int quality, - Orthanc::IDynamicObject* userPayload) : - source_(source), - seriesIndex_(seriesIndex), - sopInstanceUid_(sopInstanceUid), - quality_(quality), - hasWindowing_(false), - userPayload_(userPayload) - { - } - - size_t GetSeriesIndex() const - { - return seriesIndex_; - } - - const std::string& GetSopInstanceUid() const - { - return sopInstanceUid_; - } - - unsigned int GetQuality() const - { - return quality_; - } - - void SetWindowing(float center, - float width) - { - hasWindowing_ = true; - windowingCenter_ = center; - windowingWidth_ = width; - } - - bool HasWindowing() const - { - return hasWindowing_; - } - - float GetWindowingCenter() const - { - if (hasWindowing_) - { - return windowingCenter_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - float GetWindowingWidth() const - { - if (hasWindowing_) - { - return windowingWidth_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - const DicomSource& GetSource() const - { - return source_; - } - - Orthanc::IDynamicObject* GetUserPayload() const - { - return userPayload_.get(); - } - }; - - - SeriesFramesLoader::SeriesFramesLoader(ILoadersContext& context, - LoadedDicomResources& instances, - const std::string& dicomDirPath, - boost::shared_ptr dicomDir) : - context_(context), - frames_(instances), - dicomDirPath_(dicomDirPath), - dicomDir_(dicomDir) - { - } - - - void SeriesFramesLoader::EmitMessage(const Payload& payload, - const Orthanc::ImageAccessor& image) - { - const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(payload.GetSeriesIndex()); - const Orthanc::DicomMap& instance = frames_.GetInstance(payload.GetSeriesIndex()); - size_t frameIndex = frames_.GetFrameIndex(payload.GetSeriesIndex()); - - if (frameIndex >= parameters.GetImageInformation().GetNumberOfFrames() || - payload.GetSopInstanceUid() != parameters.GetSopInstanceUid()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - LOG(TRACE) << "Decoded instance " << payload.GetSopInstanceUid() << ", frame " - << frameIndex << ": " << image.GetWidth() << "x" - << image.GetHeight() << ", " << Orthanc::EnumerationToString(image.GetFormat()) - << ", quality " << payload.GetQuality(); - - FrameLoadedMessage message(*this, frameIndex, payload.GetQuality(), image, instance, parameters, payload.GetUserPayload()); - BroadcastMessage(message); - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - void SeriesFramesLoader::HandleDicom(const Payload& payload, - Orthanc::ParsedDicomFile& dicom) - { - size_t frameIndex = frames_.GetFrameIndex(payload.GetSeriesIndex()); - - std::unique_ptr decoded; - decoded.reset(Orthanc::DicomImageDecoder::Decode( - dicom, - static_cast(frameIndex))); - - if (decoded.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - EmitMessage(payload, *decoded); - } -#endif - - - void SeriesFramesLoader::HandleDicomWebRendered(const Payload& payload, - const std::string& body, - const std::map& headers) - { - assert(payload.GetSource().IsDicomWeb() && - payload.HasWindowing()); - - bool ok = false; - for (std::map::const_iterator it = headers.begin(); - it != headers.end(); ++it) - { - if (boost::iequals("content-type", it->first) && - boost::iequals(Orthanc::MIME_JPEG, it->second)) - { - ok = true; - break; - } - } - - if (!ok) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "The WADO-RS server has not generated a JPEG image on /rendered"); - } - - Orthanc::JpegReader reader; - reader.ReadFromMemory(body); - - switch (reader.GetFormat()) - { - case Orthanc::PixelFormat_RGB24: - EmitMessage(payload, reader); - break; - - case Orthanc::PixelFormat_Grayscale8: - { - const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(payload.GetSeriesIndex()); - - Orthanc::Image scaled(parameters.GetExpectedPixelFormat(), reader.GetWidth(), reader.GetHeight(), false); - Orthanc::ImageProcessing::Convert(scaled, reader); - - float w = payload.GetWindowingWidth(); - if (w <= 0.01f) - { - w = 0.01f; // Prevent division by zero - } - - const float c = payload.GetWindowingCenter(); - const float scaling = w / 255.0f; - const float offset = (c - w / 2.0f) / scaling; - - Orthanc::ImageProcessing::ShiftScale(scaled, offset, scaling, false /* truncation to speed up */); - EmitMessage(payload, scaled); - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - void SeriesFramesLoader::Handle(const ParseDicomSuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - - const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - if ((payload.GetSource().IsDicomDir() || - payload.GetSource().IsDicomWeb()) && - message.HasPixelData()) - { - HandleDicom(dynamic_cast(message.GetOrigin().GetPayload()), message.GetDicom()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -#endif - - - void SeriesFramesLoader::Handle(const GetOrthancImageCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - - const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - assert(payload.GetSource().IsOrthanc()); - - EmitMessage(payload, message.GetImage()); - } - - - void SeriesFramesLoader::Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - - const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); - assert(payload.GetSource().IsOrthanc()); - - EmitMessage(payload, message.GetImage()); - } - - - void SeriesFramesLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) - { - // This is to handle "/rendered" in DICOMweb - assert(message.GetOrigin().HasPayload()); - HandleDicomWebRendered(dynamic_cast(message.GetOrigin().GetPayload()), - message.GetAnswer(), message.GetAnswerHeaders()); - } - - - void SeriesFramesLoader::Handle(const HttpCommand::SuccessMessage& message) - { - // This is to handle "/rendered" in DICOMweb - assert(message.GetOrigin().HasPayload()); - HandleDicomWebRendered(dynamic_cast(message.GetOrigin().GetPayload()), - message.GetAnswer(), message.GetAnswerHeaders()); - } - - - void SeriesFramesLoader::GetPreviewWindowing(float& center, - float& width, - size_t index) const - { - const Orthanc::DicomMap& instance = frames_.GetInstance(index); - const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(index); - - if (parameters.HasDefaultWindowing()) - { - // TODO - Handle multiple presets (take the largest width) - center = parameters.GetDefaultWindowingCenter(); - width = parameters.GetDefaultWindowingWidth(); - } - else - { - float a, b; - if (instance.ParseFloat(a, Orthanc::DICOM_TAG_SMALLEST_IMAGE_PIXEL_VALUE) && - instance.ParseFloat(b, Orthanc::DICOM_TAG_LARGEST_IMAGE_PIXEL_VALUE) && - a < b) - { - center = (a + b) / 2.0f; - width = (b - a); - } - else - { - // Cannot infer a suitable windowing from the available tags - center = 128.0f; - width = 256.0f; - } - } - } - - - Orthanc::IDynamicObject& SeriesFramesLoader::FrameLoadedMessage::GetUserPayload() const - { - if (userPayload_) - { - return *userPayload_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void SeriesFramesLoader::Factory::SetDicomDir(const std::string& dicomDirPath, - boost::shared_ptr dicomDir) - { - dicomDirPath_ = dicomDirPath; - dicomDir_ = dicomDir; - } - - - boost::shared_ptr SeriesFramesLoader::Factory::Create(ILoadersContext::ILock& stone) - { - boost::shared_ptr loader( - new SeriesFramesLoader(stone.GetContext(), instances_, dicomDirPath_, dicomDir_)); - loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); - loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); - loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); - loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); - -#if ORTHANC_ENABLE_DCMTK == 1 - loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); -#endif - - return loader; - } - - - void SeriesFramesLoader::ScheduleLoadFrame(int priority, - const DicomSource& source, - size_t index, - unsigned int quality, - Orthanc::IDynamicObject* userPayload) - { - std::unique_ptr protection(userPayload); - - if (index >= frames_.GetFramesCount() || - quality >= source.GetQualityCount()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const Orthanc::DicomMap& instance = frames_.GetInstance(index); - - std::string sopInstanceUid; - if (!instance.LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "Missing SOPInstanceUID in a DICOM instance"); - } - - if (source.IsDicomDir()) - { - if (dicomDir_.get() == NULL) - { - // Should have been set in the factory - throw Orthanc::OrthancException( - Orthanc::ErrorCode_BadSequenceOfCalls, - "SeriesFramesLoader::Factory::SetDicomDir() should have been called"); - } - - assert(quality == 0); - - std::string file; - if (dicomDir_->LookupStringValue(file, sopInstanceUid, Orthanc::DICOM_TAG_REFERENCED_FILE_ID)) - { - std::unique_ptr command(new ParseDicomFromFileCommand(source, dicomDirPath_, file)); - command->SetPixelDataIncluded(true); - command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - else - { - LOG(WARNING) << "Missing tag ReferencedFileID in a DICOMDIR entry"; - } - } - else if (source.IsDicomWeb()) - { - std::string studyInstanceUid, seriesInstanceUid; - if (!instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || - !instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "Missing StudyInstanceUID or SeriesInstanceUID in a DICOM instance"); - } - - const std::string uri = ("/studies/" + studyInstanceUid + - "/series/" + seriesInstanceUid + - "/instances/" + sopInstanceUid); - - if (source.HasDicomWebRendered() && - quality == 0) - { - float c, w; - GetPreviewWindowing(c, w, index); - - std::map arguments, headers; - arguments["window"] = (boost::lexical_cast(c) + "," + - boost::lexical_cast(w) + ",linear"); - headers["Accept"] = "image/jpeg"; - - std::unique_ptr payload(new Payload(source, index, sopInstanceUid, quality, protection.release())); - payload->SetWindowing(c, w); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, - source.CreateDicomWebCommand(uri + "/rendered", arguments, headers, payload.release())); - } - } - else - { - assert((source.HasDicomWebRendered() && quality == 1) || - (!source.HasDicomWebRendered() && quality == 0)); - -#if ORTHANC_ENABLE_DCMTK == 1 - std::unique_ptr payload(new Payload(source, index, sopInstanceUid, quality, protection.release())); - - const std::map empty; - - std::unique_ptr command( - new ParseDicomFromWadoCommand(source, sopInstanceUid, source.CreateDicomWebCommand(uri, empty, empty, NULL))); - command->AcquirePayload(payload.release()); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "DCMTK is not enabled, cannot parse a DICOM instance"); -#endif - } - } - else if (source.IsOrthanc()) - { - std::string orthancId; - - { - std::string patientId, studyInstanceUid, seriesInstanceUid; - if (!instance.LookupStringValue(patientId, Orthanc::DICOM_TAG_PATIENT_ID, false) || - !instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || - !instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "Missing StudyInstanceUID or SeriesInstanceUID in a DICOM instance"); - } - - Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, sopInstanceUid); - orthancId = hasher.HashInstance(); - } - - const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(index); - - if (quality == 0 && source.HasOrthancWebViewer1()) - { - std::unique_ptr command(new GetOrthancWebViewerJpegCommand); - command->SetInstance(orthancId); - command->SetExpectedPixelFormat(parameters.GetExpectedPixelFormat()); - command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - else if (quality == 0 && source.HasOrthancAdvancedPreview()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - else - { - assert(quality <= 1); - assert(quality == 0 || - source.HasOrthancWebViewer1() || - source.HasOrthancAdvancedPreview()); - - std::unique_ptr command(new GetOrthancImageCommand); - command->SetFrameUri(orthancId, frames_.GetFrameIndex(index), parameters.GetExpectedPixelFormat()); - command->SetExpectedPixelFormat(parameters.GetExpectedPixelFormat()); - command->SetHttpHeader("Accept", Orthanc::MIME_PAM); - command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority, command.release()); - } - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesFramesLoader.h --- a/Framework/Loaders/SeriesFramesLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#include "OracleScheduler.h" -#include "DicomSource.h" -#include "SeriesOrderedFrames.h" -#include "ILoaderFactory.h" - -namespace OrthancStone -{ - class SeriesFramesLoader : - public ObserverBase, - public IObservable - { - private: - class Payload; - - ILoadersContext& context_; - SeriesOrderedFrames frames_; - std::string dicomDirPath_; - boost::shared_ptr dicomDir_; - - SeriesFramesLoader(ILoadersContext& context, - LoadedDicomResources& instances, - const std::string& dicomDirPath, - boost::shared_ptr dicomDir); - - void EmitMessage(const Payload& payload, - const Orthanc::ImageAccessor& image); - -#if ORTHANC_ENABLE_DCMTK == 1 - void HandleDicom(const Payload& payload, - Orthanc::ParsedDicomFile& dicom); -#endif - - void HandleDicomWebRendered(const Payload& payload, - const std::string& body, - const std::map& headers); - -#if ORTHANC_ENABLE_DCMTK == 1 - void Handle(const ParseDicomSuccessMessage& message); -#endif - - void Handle(const GetOrthancImageCommand::SuccessMessage& message); - - void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message); - - void Handle(const OrthancRestApiCommand::SuccessMessage& message); - - void Handle(const HttpCommand::SuccessMessage& message); - - void GetPreviewWindowing(float& center, - float& width, - size_t index) const; - - public: - class FrameLoadedMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - size_t frameIndex_; - unsigned int quality_; - const Orthanc::ImageAccessor& image_; - const Orthanc::DicomMap& instance_; - const DicomInstanceParameters& parameters_; - Orthanc::IDynamicObject* userPayload_; // Ownership is maintained by the caller - - public: - FrameLoadedMessage(const SeriesFramesLoader& loader, - size_t frameIndex, - unsigned int quality, - const Orthanc::ImageAccessor& image, - const Orthanc::DicomMap& instance, - const DicomInstanceParameters& parameters, - Orthanc::IDynamicObject* userPayload) : - OriginMessage(loader), - frameIndex_(frameIndex), - quality_(quality), - image_(image), - instance_(instance), - parameters_(parameters), - userPayload_(userPayload) - { - } - - size_t GetFrameIndex() const - { - return frameIndex_; - } - - unsigned int GetQuality() const - { - return quality_; - } - - const Orthanc::ImageAccessor& GetImage() const - { - return image_; - } - - const Orthanc::DicomMap& GetInstance() const - { - return instance_; - } - - const DicomInstanceParameters& GetInstanceParameters() const - { - return parameters_; - } - - bool HasUserPayload() const - { - return userPayload_ != NULL; - } - - Orthanc::IDynamicObject& GetUserPayload() const; - }; - - - class Factory : public ILoaderFactory - { - private: - LoadedDicomResources& instances_; - std::string dicomDirPath_; - boost::shared_ptr dicomDir_; - - public: - // No "const" because "LoadedDicomResources::GetResource()" will call "Flatten()" - Factory(LoadedDicomResources& instances) : - instances_(instances) - { - } - - void SetDicomDir(const std::string& dicomDirPath, - boost::shared_ptr dicomDir); - - virtual boost::shared_ptr Create(ILoadersContext::ILock& context); - }; - - const SeriesOrderedFrames& GetOrderedFrames() const - { - return frames_; - } - - void ScheduleLoadFrame(int priority, - const DicomSource& source, - size_t index, - unsigned int quality, - Orthanc::IDynamicObject* userPayload /* transfer ownership */); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesMetadataLoader.cpp --- a/Framework/Loaders/SeriesMetadataLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,346 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SeriesMetadataLoader.h" - -#include - -namespace OrthancStone -{ - SeriesMetadataLoader::SeriesMetadataLoader(boost::shared_ptr& loader) : - loader_(loader), - state_(State_Setup) - { - } - - - bool SeriesMetadataLoader::IsScheduledWithHigherPriority(const std::string& seriesInstanceUid, - int priority) const - { - if (series_.find(seriesInstanceUid) != series_.end()) - { - // This series is readily available - return true; - } - else - { - std::map::const_iterator found = scheduled_.find(seriesInstanceUid); - - return (found != scheduled_.end() && - found->second < priority); - } - } - - - void SeriesMetadataLoader::Handle(const DicomResourcesLoader::SuccessMessage& message) - { - assert(message.GetResources()); - - switch (state_) - { - case State_Setup: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - - case State_Default: - { - std::string studyInstanceUid; - std::string seriesInstanceUid; - - if (message.GetResources()->LookupTagValueConsensus(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID) && - message.GetResources()->LookupTagValueConsensus(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID)) - { - series_[seriesInstanceUid] = message.GetResources(); - - SuccessMessage loadedMessage(*this, message.GetDicomSource(), studyInstanceUid, - seriesInstanceUid, *message.GetResources()); - BroadcastMessage(loadedMessage); - } - - break; - } - - case State_DicomDir: - { - assert(!dicomDir_); - assert(seriesSize_.empty()); - - dicomDir_ = message.GetResources(); - - for (size_t i = 0; i < message.GetResources()->GetSize(); i++) - { - std::string seriesInstanceUid; - if (message.GetResources()->GetResource(i).LookupStringValue - (seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - boost::shared_ptr target - (new OrthancStone::LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); - - if (loader_->ScheduleLoadDicomFile(target, message.GetPriority(), message.GetDicomSource(), dicomDirPath_, - message.GetResources()->GetResource(i), false /* no need for pixel data */, - NULL /* TODO PAYLOAD */)) - { - std::map::iterator found = seriesSize_.find(seriesInstanceUid); - if (found == seriesSize_.end()) - { - series_[seriesInstanceUid].reset - (new OrthancStone::LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); - seriesSize_[seriesInstanceUid] = 1; - } - else - { - found->second ++; - } - } - } - } - - LOG(INFO) << "Read a DICOMDIR containing " << seriesSize_.size() << " series"; - - state_ = State_DicomFile; - break; - } - - case State_DicomFile: - { - assert(dicomDir_); - assert(message.GetResources()->GetSize() <= 1); // Could be zero if corrupted DICOM instance - - if (message.GetResources()->GetSize() == 1) - { - const Orthanc::DicomMap& instance = message.GetResources()->GetResource(0); - - std::string studyInstanceUid; - std::string seriesInstanceUid; - if (instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && - instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - Series::const_iterator series = series_.find(seriesInstanceUid); - std::map::const_iterator size = seriesSize_.find(seriesInstanceUid); - - if (series == series_.end() || - size == seriesSize_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - series->second->AddResource(instance); - - if (series->second->GetSize() > size->second) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else if (series->second->GetSize() == size->second) - { - // The series is complete - SuccessMessage loadedMessage( - *this, message.GetDicomSource(), - studyInstanceUid, seriesInstanceUid, *series->second); - loadedMessage.SetDicomDir(dicomDirPath_, dicomDir_); - BroadcastMessage(loadedMessage); - } - } - } - } - - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - SeriesMetadataLoader::SuccessMessage::SuccessMessage( - const SeriesMetadataLoader& loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - LoadedDicomResources& instances) : - OriginMessage(loader), - source_(source), - studyInstanceUid_(studyInstanceUid), - seriesInstanceUid_(seriesInstanceUid), - instances_(instances) - { - LOG(INFO) << "Loaded series " << seriesInstanceUid - << ", number of instances: " << instances_.GetSize(); - } - - - boost::shared_ptr SeriesMetadataLoader::Create(ILoadersContext::ILock& context) - { - boost::shared_ptr loader(DicomResourcesLoader::Create(context)); - - boost::shared_ptr obj(new SeriesMetadataLoader(loader)); - obj->Register(*loader, &SeriesMetadataLoader::Handle); - return obj; - } - - - SeriesMetadataLoader::Accessor::Accessor(SeriesMetadataLoader& that, - const std::string& seriesInstanceUid) - { - Series::const_iterator found = that.series_.find(seriesInstanceUid); - if (found != that.series_.end()) - { - assert(found->second != NULL); - series_ = found->second; - } - } - - - size_t SeriesMetadataLoader::Accessor::GetInstancesCount() const - { - if (IsComplete()) - { - return series_->GetSize(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Orthanc::DicomMap& SeriesMetadataLoader::Accessor::GetInstance(size_t index) const - { - if (IsComplete()) - { - return series_->GetResource(index); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void SeriesMetadataLoader::ScheduleLoadSeries(int priority, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) - { - if (state_ != State_Setup && - state_ != State_Default) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "The loader is working in DICOMDIR state"); - } - - state_ = State_Default; - - // Only re-schedule the loading if the previous loading was with lower priority - if (!IsScheduledWithHigherPriority(seriesInstanceUid, priority)) - { - if (source.IsDicomWeb()) - { - boost::shared_ptr target - (new LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); - loader_->ScheduleGetDicomWeb( - target, priority, source, - "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/metadata", - NULL /* TODO PAYLOAD */); - - scheduled_[seriesInstanceUid] = priority; - } - else if (source.IsOrthanc()) - { - // This flavor of the method is only available with DICOMweb, as - // Orthanc requires the "PatientID" to be known - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "The PatientID must be provided on Orthanc sources"); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - - void SeriesMetadataLoader::ScheduleLoadSeries(int priority, - const DicomSource& source, - const std::string& patientId, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) - { - if (state_ != State_Setup && - state_ != State_Default) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "The loader is working in DICOMDIR state"); - } - - state_ = State_Default; - - if (source.IsDicomWeb()) - { - ScheduleLoadSeries(priority, source, studyInstanceUid, seriesInstanceUid); - } - else if (!IsScheduledWithHigherPriority(seriesInstanceUid, priority)) - { - if (source.IsOrthanc()) - { - // Dummy SOP Instance UID, as we are working at the "series" level - Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, "dummy"); - - boost::shared_ptr target - (new LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); - - loader_->ScheduleLoadOrthancResources(target, priority, source, Orthanc::ResourceType_Series, - hasher.HashSeries(), Orthanc::ResourceType_Instance, - NULL /* TODO PAYLOAD */); - - scheduled_[seriesInstanceUid] = priority; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - - void SeriesMetadataLoader::ScheduleLoadDicomDir(int priority, - const DicomSource& source, - const std::string& path) - { - if (!source.IsDicomDir()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - if (state_ != State_Setup) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "The loader cannot load two different DICOMDIR"); - } - - state_ = State_DicomDir; - dicomDirPath_ = path; - boost::shared_ptr dicomDir - (new LoadedDicomResources(Orthanc::DICOM_TAG_REFERENCED_SOP_INSTANCE_UID_IN_FILE)); - loader_->ScheduleLoadDicomDir(dicomDir, priority, source, path, - NULL /* TODO PAYLOAD */); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesMetadataLoader.h --- a/Framework/Loaders/SeriesMetadataLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "DicomResourcesLoader.h" - -namespace OrthancStone -{ - class SeriesMetadataLoader : - public ObserverBase, - public IObservable - { - private: - enum State - { - State_Setup, - State_Default, - State_DicomDir, - State_DicomFile - }; - - typedef std::map > Series; - - boost::shared_ptr loader_; - State state_; - std::map scheduled_; // Maps a "SeriesInstanceUID" to a priority - Series series_; - boost::shared_ptr dicomDir_; - std::string dicomDirPath_; - std::map seriesSize_; - - SeriesMetadataLoader(boost::shared_ptr& loader); - - bool IsScheduledWithHigherPriority(const std::string& seriesInstanceUid, - int priority) const; - - void Handle(const DicomResourcesLoader::SuccessMessage& message); - - public: - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const DicomSource& source_; - const std::string& studyInstanceUid_; - const std::string& seriesInstanceUid_; - LoadedDicomResources& instances_; - std::string dicomDirPath_; - boost::shared_ptr dicomDir_; - - public: - SuccessMessage(const SeriesMetadataLoader& loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - LoadedDicomResources& instances); - - const DicomSource& GetDicomSource() const - { - return source_; - } - - const std::string& GetStudyInstanceUid() const - { - return studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return seriesInstanceUid_; - } - - size_t GetInstancesCount() const - { - return instances_.GetSize(); - } - - const Orthanc::DicomMap& GetInstance(size_t index) const - { - return instances_.GetResource(index); - } - - LoadedDicomResources& GetInstances() const - { - return instances_; - } - - void SetDicomDir(const std::string& dicomDirPath, - boost::shared_ptr dicomDir) - { - dicomDirPath_ = dicomDirPath; - dicomDir_ = dicomDir; - } - - const std::string& GetDicomDirPath() const - { - return dicomDirPath_; - } - - // Will be NULL on non-DICOMDIR sources - boost::shared_ptr GetDicomDir() const - { - return dicomDir_; - } - }; - - - class Factory : public ILoaderFactory - { - public: - virtual boost::shared_ptr Create(ILoadersContext::ILock& context) - { - return SeriesMetadataLoader::Create(context); - } - }; - - - static boost::shared_ptr Create(ILoadersContext::ILock& context); - - - class Accessor : public boost::noncopyable - { - private: - boost::shared_ptr series_; - - public: - Accessor(SeriesMetadataLoader& that, - const std::string& seriesInstanceUid); - - bool IsComplete() const - { - return series_ != NULL; - } - - size_t GetInstancesCount() const; - - const Orthanc::DicomMap& GetInstance(size_t index) const; - }; - - - void ScheduleLoadSeries(int priority, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid); - - void ScheduleLoadSeries(int priority, - const DicomSource& source, - const std::string& patientId, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid); - - void ScheduleLoadDicomDir(int priority, - const DicomSource& source, - const std::string& path); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesOrderedFrames.cpp --- a/Framework/Loaders/SeriesOrderedFrames.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,345 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "../Toolbox/SlicesSorter.h" -#include "SeriesOrderedFrames.h" - -#include - -namespace OrthancStone -{ - class SeriesOrderedFrames::Instance : public boost::noncopyable - { - private: - std::unique_ptr dicom_; - DicomInstanceParameters parameters_; - - public: - Instance(const Orthanc::DicomMap& dicom) : - dicom_(dicom.Clone()), - parameters_(dicom) - { - } - - const Orthanc::DicomMap& GetInstance() const - { - return *dicom_; - } - - const DicomInstanceParameters& GetInstanceParameters() const - { - return parameters_; - } - - bool Lookup3DGeometry(CoordinateSystem3D& target) const - { - try - { - std::string imagePositionPatient, imageOrientationPatient; - if (dicom_->LookupStringValue(imagePositionPatient, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && - dicom_->LookupStringValue(imageOrientationPatient, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) - { - target = CoordinateSystem3D(imagePositionPatient, imageOrientationPatient); - return true; - } - } - catch (Orthanc::OrthancException&) - { - } - - return false; - } - - bool LookupIndexInSeries(int& target) const - { - std::string value; - - if (dicom_->LookupStringValue(value, Orthanc::DICOM_TAG_INSTANCE_NUMBER, false) || - dicom_->LookupStringValue(value, Orthanc::DICOM_TAG_IMAGE_INDEX, false)) - { - try - { - target = boost::lexical_cast(value); - return true; - } - catch (boost::bad_lexical_cast&) - { - } - } - - return false; - } - }; - - - class SeriesOrderedFrames::Frame : public boost::noncopyable - { - private: - const Instance* instance_; - unsigned int frameIndex_; - - public: - Frame(const Instance& instance, - unsigned int frameIndex) : - instance_(&instance), - frameIndex_(frameIndex) - { - if (frameIndex_ >= instance.GetInstanceParameters().GetImageInformation().GetNumberOfFrames()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - const Orthanc::DicomMap& GetInstance() const - { - assert(instance_ != NULL); - return instance_->GetInstance(); - } - - const DicomInstanceParameters& GetInstanceParameters() const - { - assert(instance_ != NULL); - return instance_->GetInstanceParameters(); - } - - unsigned int GetFrameIndex() const - { - return frameIndex_; - } - }; - - - class SeriesOrderedFrames::InstanceWithIndexInSeries - { - private: - const Instance* instance_; // Don't use a reference to make "std::sort()" happy - int index_; - - public: - InstanceWithIndexInSeries(const Instance& instance) : - instance_(&instance) - { - if (!instance_->LookupIndexInSeries(index_)) - { - index_ = std::numeric_limits::max(); - } - } - - const Instance& GetInstance() const - { - return *instance_; - } - - int GetIndexInSeries() const - { - return index_; - } - - bool operator< (const InstanceWithIndexInSeries& other) const - { - return (index_ < other.index_); - } - }; - - - void SeriesOrderedFrames::Clear() - { - for (size_t i = 0; i < instances_.size(); i++) - { - assert(instances_[i] != NULL); - delete instances_[i]; - } - - for (size_t i = 0; i < orderedFrames_.size(); i++) - { - assert(orderedFrames_[i] != NULL); - delete orderedFrames_[i]; - } - - instances_.clear(); - orderedFrames_.clear(); - } - - - bool SeriesOrderedFrames::Sort3DVolume() - { - SlicesSorter sorter; - sorter.Reserve(instances_.size()); - - for (size_t i = 0; i < instances_.size(); i++) - { - CoordinateSystem3D geometry; - if (instances_[i]->Lookup3DGeometry(geometry)) - { - sorter.AddSlice(geometry, new Orthanc::SingleValueObject(instances_[i])); - } - else - { - return false; // Not a 3D volume - } - } - - if (!sorter.Sort() || - sorter.GetSlicesCount() != instances_.size() || - !sorter.AreAllSlicesDistinct()) - { - return false; - } - else - { - for (size_t i = 0; i < sorter.GetSlicesCount(); i++) - { - assert(sorter.HasSlicePayload(i)); - - const Orthanc::SingleValueObject& payload = - dynamic_cast&>(sorter.GetSlicePayload(i)); - - assert(payload.GetValue() != NULL); - - for (size_t j = 0; j < payload.GetValue()->GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); j++) - { - orderedFrames_.push_back(new Frame(*payload.GetValue(), - static_cast(j))); - } - } - - isRegular_ = sorter.ComputeSpacingBetweenSlices(spacingBetweenSlices_); - return true; - } - } - - - void SeriesOrderedFrames::SortIndexInSeries() - { - std::vector tmp; - tmp.reserve(instances_.size()); - - for (size_t i = 0; i < instances_.size(); i++) - { - assert(instances_[i] != NULL); - tmp.push_back(InstanceWithIndexInSeries(*instances_[i])); - } - - std::sort(tmp.begin(), tmp.end()); - - for (size_t i = 0; i < tmp.size(); i++) - { - for (size_t j = 0; j < tmp[i].GetInstance().GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); j++) - { - orderedFrames_.push_back(new Frame(tmp[i].GetInstance(), - static_cast(j))); - } - } - } - - - const SeriesOrderedFrames::Frame& SeriesOrderedFrames::GetFrame(size_t seriesIndex) const - { - if (seriesIndex >= orderedFrames_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(orderedFrames_[seriesIndex] != NULL); - return *(orderedFrames_[seriesIndex]); - } - } - - - SeriesOrderedFrames::SeriesOrderedFrames(LoadedDicomResources& instances) : - isVolume_(false), - isRegular_(false), - spacingBetweenSlices_(0) - { - instances_.reserve(instances.GetSize()); - - size_t numberOfFrames = 0; - - for (size_t i = 0; i < instances.GetSize(); i++) - { - try - { - std::unique_ptr instance(new Instance(instances.GetResource(i))); - numberOfFrames += instance->GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); - instances_.push_back(instance.release()); - } - catch (Orthanc::OrthancException&) - { - // The instance has not all the required DICOM tags, skip it - } - } - - orderedFrames_.reserve(numberOfFrames); - - if (Sort3DVolume()) - { - isVolume_ = true; - - if (isRegular_) - { - LOG(INFO) << "Regular 3D volume detected"; - } - else - { - LOG(INFO) << "Non-regular 3D volume detected"; - } - } - else - { - LOG(INFO) << "Series is not a 3D volume, sorting by index"; - SortIndexInSeries(); - } - - LOG(INFO) << "Number of frames: " << orderedFrames_.size(); - } - - - unsigned int SeriesOrderedFrames::GetFrameIndex(size_t seriesIndex) const - { - return GetFrame(seriesIndex).GetFrameIndex(); - } - - - const Orthanc::DicomMap& SeriesOrderedFrames::GetInstance(size_t seriesIndex) const - { - return GetFrame(seriesIndex).GetInstance(); - } - - - const DicomInstanceParameters& SeriesOrderedFrames::GetInstanceParameters(size_t seriesIndex) const - { - return GetFrame(seriesIndex).GetInstanceParameters(); - } - - - double SeriesOrderedFrames::GetSpacingBetweenSlices() const - { - if (IsRegular3DVolume()) - { - return spacingBetweenSlices_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesOrderedFrames.h --- a/Framework/Loaders/SeriesOrderedFrames.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "LoadedDicomResources.h" - -#include "../Toolbox/DicomInstanceParameters.h" - -namespace OrthancStone -{ - class SeriesOrderedFrames : public boost::noncopyable - { - private: - class Instance; - class Frame; - class InstanceWithIndexInSeries; - - std::vector instances_; - std::vector orderedFrames_; - bool isVolume_; - bool isRegular_; - double spacingBetweenSlices_; - - void Clear(); - - bool Sort3DVolume(); - - void SortIndexInSeries(); - - const Frame& GetFrame(size_t seriesIndex) const; - - public: - SeriesOrderedFrames(LoadedDicomResources& instances); - - ~SeriesOrderedFrames() - { - Clear(); - } - - size_t GetFramesCount() const - { - return orderedFrames_.size(); - } - - unsigned int GetFrameIndex(size_t seriesIndex) const; - - const Orthanc::DicomMap& GetInstance(size_t seriesIndex) const; - - const DicomInstanceParameters& GetInstanceParameters(size_t seriesIndex) const; - - // Are all frames parallel and aligned? - bool Is3DVolume() const - { - return isVolume_; - } - - // Are all frames parallel, aligned and evenly spaced? - bool IsRegular3DVolume() const - { - return isRegular_; - } - - // Only available on regular 3D volumes - double GetSpacingBetweenSlices() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesThumbnailsLoader.cpp --- a/Framework/Loaders/SeriesThumbnailsLoader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,773 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SeriesThumbnailsLoader.h" - -#include "LoadedDicomResources.h" -#include "../Oracle/ParseDicomFromWadoCommand.h" -#include "../Toolbox/ImageToolbox.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -#if ORTHANC_ENABLE_DCMTK == 1 -# include -# include -#endif - - -static const unsigned int JPEG_QUALITY = 70; // Only used for Orthanc source - -namespace OrthancStone -{ - static SeriesThumbnailType ExtractSopClassUid(const std::string& sopClassUid) - { - if (sopClassUid == "1.2.840.10008.5.1.4.1.1.104.1") // Encapsulated PDF Storage - { - return SeriesThumbnailType_Pdf; - } - else if (sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.1.1" || // Video Endoscopic Image Storage - sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.2.1" || // Video Microscopic Image Storage - sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.4.1") // Video Photographic Image Storage - { - return SeriesThumbnailType_Video; - } - else - { - return SeriesThumbnailType_Unsupported; - } - } - - - SeriesThumbnailsLoader::Thumbnail::Thumbnail(const std::string& image, - const std::string& mime) : - type_(SeriesThumbnailType_Image), - image_(image), - mime_(mime) - { - } - - - SeriesThumbnailsLoader::Thumbnail::Thumbnail(SeriesThumbnailType type) : - type_(type) - { - if (type == SeriesThumbnailType_Image) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - Orthanc::ImageAccessor* SeriesThumbnailsLoader::SuccessMessage::DecodeImage() const - { - if (GetType() != SeriesThumbnailType_Image) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - Orthanc::MimeType mime; - if (!Orthanc::LookupMimeType(mime, GetMime())) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "Unsupported MIME type for thumbnail: " + GetMime()); - } - - switch (mime) - { - case Orthanc::MimeType_Jpeg: - { - std::unique_ptr reader(new Orthanc::JpegReader); - reader->ReadFromMemory(GetEncodedImage()); - return reader.release(); - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "Cannot decode MIME type for thumbnail: " + GetMime()); - } - } - - - - void SeriesThumbnailsLoader::AcquireThumbnail(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - SeriesThumbnailsLoader::Thumbnail* thumbnail) - { - assert(thumbnail != NULL); - - std::unique_ptr protection(thumbnail); - - Thumbnails::iterator found = thumbnails_.find(seriesInstanceUid); - if (found == thumbnails_.end()) - { - thumbnails_[seriesInstanceUid] = protection.release(); - } - else - { - assert(found->second != NULL); - if (protection->GetType() == SeriesThumbnailType_NotLoaded || - protection->GetType() == SeriesThumbnailType_Unsupported) - { - // Don't replace an old entry if the current one is worse - return; - } - else - { - delete found->second; - found->second = protection.release(); - } - } - - LOG(INFO) << "Thumbnail updated for series: " << seriesInstanceUid << ": " << thumbnail->GetType(); - - SuccessMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail); - BroadcastMessage(message); - } - - - class SeriesThumbnailsLoader::Handler : public Orthanc::IDynamicObject - { - private: - boost::shared_ptr loader_; - DicomSource source_; - std::string studyInstanceUid_; - std::string seriesInstanceUid_; - - public: - Handler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - loader_(loader), - source_(source), - studyInstanceUid_(studyInstanceUid), - seriesInstanceUid_(seriesInstanceUid) - { - if (!loader) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - boost::shared_ptr GetLoader() - { - return loader_; - } - - const DicomSource& GetSource() const - { - return source_; - } - - const std::string& GetStudyInstanceUid() const - { - return studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return seriesInstanceUid_; - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) = 0; - - virtual void HandleError() - { - LOG(INFO) << "Cannot generate thumbnail for SeriesInstanceUID: " << seriesInstanceUid_; - } - }; - - - class SeriesThumbnailsLoader::DicomWebSopClassHandler : public SeriesThumbnailsLoader::Handler - { - private: - static bool GetSopClassUid(std::string& sopClassUid, - const Json::Value& json) - { - Orthanc::DicomMap dicom; - dicom.FromDicomWeb(json); - - return dicom.LookupStringValue(sopClassUid, Orthanc::DICOM_TAG_SOP_CLASS_UID, false); - } - - public: - DicomWebSopClassHandler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - Handler(loader, source, studyInstanceUid, seriesInstanceUid) - { - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) - { - Json::Reader reader; - Json::Value value; - - if (!reader.parse(body, value) || - value.type() != Json::arrayValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - else - { - SeriesThumbnailType type = SeriesThumbnailType_Unsupported; - - std::string sopClassUid; - if (value.size() > 0 && - GetSopClassUid(sopClassUid, value[0])) - { - bool ok = true; - - for (Json::Value::ArrayIndex i = 1; i < value.size() && ok; i++) - { - std::string s; - if (!GetSopClassUid(s, value[i]) || - s != sopClassUid) - { - ok = false; - } - } - - if (ok) - { - type = ExtractSopClassUid(sopClassUid); - } - } - - GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), - GetSeriesInstanceUid(), new Thumbnail(type)); - } - } - }; - - - class SeriesThumbnailsLoader::DicomWebThumbnailHandler : public SeriesThumbnailsLoader::Handler - { - public: - DicomWebThumbnailHandler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - Handler(loader, source, studyInstanceUid, seriesInstanceUid) - { - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) - { - std::string mime = Orthanc::MIME_JPEG; - for (std::map::const_iterator - it = headers.begin(); it != headers.end(); ++it) - { - if (boost::iequals(it->first, "content-type")) - { - mime = it->second; - } - } - - GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), - GetSeriesInstanceUid(), new Thumbnail(body, mime)); - } - - virtual void HandleError() - { - // The DICOMweb wasn't able to generate a thumbnail, try to - // retrieve the SopClassUID tag using QIDO-RS - - std::map arguments, headers; - arguments["0020000D"] = GetStudyInstanceUid(); - arguments["0020000E"] = GetSeriesInstanceUid(); - arguments["includefield"] = "00080016"; // SOP Class UID - - std::unique_ptr command( - GetSource().CreateDicomWebCommand( - "/instances", arguments, headers, new DicomWebSopClassHandler( - GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid()))); - GetLoader()->Schedule(command.release()); - } - }; - - - class SeriesThumbnailsLoader::ThumbnailInformation : public Orthanc::IDynamicObject - { - private: - DicomSource source_; - std::string studyInstanceUid_; - std::string seriesInstanceUid_; - - public: - ThumbnailInformation(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - source_(source), - studyInstanceUid_(studyInstanceUid), - seriesInstanceUid_(seriesInstanceUid) - { - } - - const DicomSource& GetDicomSource() const - { - return source_; - } - - const std::string& GetStudyInstanceUid() const - { - return studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return seriesInstanceUid_; - } - }; - - - class SeriesThumbnailsLoader::OrthancSopClassHandler : public SeriesThumbnailsLoader::Handler - { - private: - std::string instanceId_; - - public: - OrthancSopClassHandler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const std::string& instanceId) : - Handler(loader, source, studyInstanceUid, seriesInstanceUid), - instanceId_(instanceId) - { - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) - { - SeriesThumbnailType type = ExtractSopClassUid(body); - - if (type == SeriesThumbnailType_Pdf || - type == SeriesThumbnailType_Video) - { - GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), - GetSeriesInstanceUid(), new Thumbnail(type)); - } - else - { - std::unique_ptr command(new GetOrthancImageCommand); - command->SetUri("/instances/" + instanceId_ + "/preview"); - command->SetHttpHeader("Accept", Orthanc::MIME_JPEG); - command->AcquirePayload(new ThumbnailInformation( - GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid())); - GetLoader()->Schedule(command.release()); - } - } - }; - - - class SeriesThumbnailsLoader::SelectOrthancInstanceHandler : public SeriesThumbnailsLoader::Handler - { - public: - SelectOrthancInstanceHandler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - Handler(loader, source, studyInstanceUid, seriesInstanceUid) - { - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) - { - static const char* const INSTANCES = "Instances"; - - Json::Value json; - Json::Reader reader; - if (!reader.parse(body, json) || - json.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - if (json.isMember(INSTANCES) && - json[INSTANCES].type() == Json::arrayValue && - json[INSTANCES].size() > 0) - { - // Select one instance of the series to generate the thumbnail - Json::Value::ArrayIndex index = json[INSTANCES].size() / 2; - if (json[INSTANCES][index].type() == Json::stringValue) - { - std::map arguments, headers; - arguments["quality"] = boost::lexical_cast(JPEG_QUALITY); - headers["Accept"] = Orthanc::MIME_JPEG; - - const std::string instance = json[INSTANCES][index].asString(); - - std::unique_ptr command(new OrthancRestApiCommand); - command->SetUri("/instances/" + instance + "/metadata/SopClassUid"); - command->AcquirePayload( - new OrthancSopClassHandler( - GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid(), instance)); - GetLoader()->Schedule(command.release()); - } - } - } - }; - - -#if ORTHANC_ENABLE_DCMTK == 1 - class SeriesThumbnailsLoader::SelectDicomWebInstanceHandler : public SeriesThumbnailsLoader::Handler - { - public: - SelectDicomWebInstanceHandler(boost::shared_ptr loader, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) : - Handler(loader, source, studyInstanceUid, seriesInstanceUid) - { - } - - virtual void HandleSuccess(const std::string& body, - const std::map& headers) - { - Json::Value json; - Json::Reader reader; - if (!reader.parse(body, json) || - json.type() != Json::arrayValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - - LoadedDicomResources instances(Orthanc::DICOM_TAG_SOP_INSTANCE_UID); - instances.AddFromDicomWeb(json); - - std::string sopInstanceUid; - if (instances.GetSize() == 0 || - !instances.GetResource(0).LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - LOG(ERROR) << "Series without an instance: " << GetSeriesInstanceUid(); - } - else - { - GetLoader()->Schedule( - ParseDicomFromWadoCommand::Create( - GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid(), sopInstanceUid, false, - Orthanc::DicomTransferSyntax_LittleEndianExplicit /* useless, as no transcoding */, - new ThumbnailInformation( - GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid()))); - } - } - }; -#endif - - - void SeriesThumbnailsLoader::Schedule(IOracleCommand* command) - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), priority_, command); - } - - - void SeriesThumbnailsLoader::Handle(const HttpCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - dynamic_cast(message.GetOrigin().GetPayload()).HandleSuccess(message.GetAnswer(), message.GetAnswerHeaders()); - } - - - void SeriesThumbnailsLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - dynamic_cast(message.GetOrigin().GetPayload()).HandleSuccess(message.GetAnswer(), message.GetAnswerHeaders()); - } - - - void SeriesThumbnailsLoader::Handle(const GetOrthancImageCommand::SuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ThumbnailInformation& info = dynamic_cast(message.GetOrigin().GetPayload()); - - std::unique_ptr resized(Orthanc::ImageProcessing::FitSize(message.GetImage(), width_, height_)); - - std::string jpeg; - Orthanc::JpegWriter writer; - writer.SetQuality(JPEG_QUALITY); - writer.WriteToMemory(jpeg, *resized); - - AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), - info.GetSeriesInstanceUid(), new Thumbnail(jpeg, Orthanc::MIME_JPEG)); - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - void SeriesThumbnailsLoader::Handle(const ParseDicomSuccessMessage& message) - { - assert(message.GetOrigin().HasPayload()); - const ParseDicomFromWadoCommand& origin = - dynamic_cast(message.GetOrigin()); - const ThumbnailInformation& info = dynamic_cast(origin.GetPayload()); - - std::string tmp; - Orthanc::DicomTransferSyntax transferSyntax; - if (!message.GetDicom().LookupTransferSyntax(tmp)) - { - - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "DICOM instance without a transfer syntax: " + origin.GetSopInstanceUid()); - } - else if (!Orthanc::LookupTransferSyntax(transferSyntax, tmp) || - !ImageToolbox::IsDecodingSupported(transferSyntax)) - { - LOG(INFO) << "Asking the DICOMweb server to transcode, " - << "as I don't support this transfer syntax: " << tmp; - - Schedule(ParseDicomFromWadoCommand::Create( - origin.GetSource(), info.GetStudyInstanceUid(), info.GetSeriesInstanceUid(), - origin.GetSopInstanceUid(), true, Orthanc::DicomTransferSyntax_LittleEndianExplicit, - new ThumbnailInformation( - origin.GetSource(), info.GetStudyInstanceUid(), info.GetSeriesInstanceUid()))); - } - else - { - std::unique_ptr frame( - Orthanc::DicomImageDecoder::Decode(message.GetDicom(), 0)); - - std::unique_ptr thumbnail; - - if (frame->GetFormat() == Orthanc::PixelFormat_RGB24) - { - thumbnail.reset(Orthanc::ImageProcessing::FitSizeKeepAspectRatio(*frame, width_, height_)); - } - else - { - std::unique_ptr converted( - new Orthanc::Image(Orthanc::PixelFormat_Float32, frame->GetWidth(), frame->GetHeight(), false)); - Orthanc::ImageProcessing::Convert(*converted, *frame); - - std::unique_ptr resized( - Orthanc::ImageProcessing::FitSizeKeepAspectRatio(*converted, width_, height_)); - - float minValue, maxValue; - Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, *resized); - if (minValue + 0.01f < maxValue) - { - Orthanc::ImageProcessing::ShiftScale(*resized, -minValue, 255.0f / (maxValue - minValue), false); - } - else - { - Orthanc::ImageProcessing::Set(*resized, 0); - } - - converted.reset(NULL); - - thumbnail.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, width_, height_, false)); - Orthanc::ImageProcessing::Convert(*thumbnail, *resized); - } - - std::string jpeg; - Orthanc::JpegWriter writer; - writer.SetQuality(JPEG_QUALITY); - writer.WriteToMemory(jpeg, *thumbnail); - - AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), - info.GetSeriesInstanceUid(), new Thumbnail(jpeg, Orthanc::MIME_JPEG)); - } - } -#endif - - - void SeriesThumbnailsLoader::Handle(const OracleCommandExceptionMessage& message) - { - const OracleCommandBase& command = dynamic_cast(message.GetOrigin()); - assert(command.HasPayload()); - - if (command.GetType() == IOracleCommand::Type_GetOrthancImage) - { - // This is presumably a HTTP status 301 (Moved permanently) - // because of an unsupported DICOM file in "/preview" - const ThumbnailInformation& info = dynamic_cast(command.GetPayload()); - AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), - info.GetSeriesInstanceUid(), new Thumbnail(SeriesThumbnailType_Unsupported)); - } - else - { - dynamic_cast(command.GetPayload()).HandleError(); - } - } - - - SeriesThumbnailsLoader::SeriesThumbnailsLoader(ILoadersContext& context, - int priority) : - context_(context), - priority_(priority), - width_(128), - height_(128) - { - } - - - boost::shared_ptr SeriesThumbnailsLoader::Create(ILoadersContext::ILock& stone, - int priority) - { - boost::shared_ptr result(new SeriesThumbnailsLoader(stone.GetContext(), priority)); - result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); - result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); - result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); - result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); - -#if ORTHANC_ENABLE_DCMTK == 1 - result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); -#endif - - return result; - } - - - void SeriesThumbnailsLoader::SetThumbnailSize(unsigned int width, - unsigned int height) - { - if (width <= 0 || - height <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - width_ = width; - height_ = height; - } - } - - - void SeriesThumbnailsLoader::Clear() - { - for (Thumbnails::iterator it = thumbnails_.begin(); it != thumbnails_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - - thumbnails_.clear(); - } - - - SeriesThumbnailType SeriesThumbnailsLoader::GetSeriesThumbnail(std::string& image, - std::string& mime, - const std::string& seriesInstanceUid) const - { - Thumbnails::const_iterator found = thumbnails_.find(seriesInstanceUid); - - if (found == thumbnails_.end()) - { - return SeriesThumbnailType_NotLoaded; - } - else - { - assert(found->second != NULL); - image.assign(found->second->GetImage()); - mime.assign(found->second->GetMime()); - return found->second->GetType(); - } - } - - - void SeriesThumbnailsLoader::ScheduleLoadThumbnail(const DicomSource& source, - const std::string& patientId, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) - { - if (IsScheduledSeries(seriesInstanceUid)) - { - return; - } - - if (source.IsDicomWeb()) - { - if (!source.HasDicomWebRendered()) - { -#if ORTHANC_ENABLE_DCMTK == 1 - // Issue a QIDO-RS request to select one of the instances in the series - std::map arguments, headers; - arguments["0020000D"] = studyInstanceUid; - arguments["0020000E"] = seriesInstanceUid; - arguments["includefield"] = "00080018"; // SOP Instance UID is mandatory - - std::unique_ptr command( - source.CreateDicomWebCommand( - "/instances", arguments, headers, new SelectDicomWebInstanceHandler( - GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid))); - Schedule(command.release()); -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "Stone of Orthanc was built without support to decode DICOM images"); -#endif - } - else - { - const std::string uri = ("/studies/" + studyInstanceUid + - "/series/" + seriesInstanceUid + "/rendered"); - - std::map arguments, headers; - arguments["viewport"] = (boost::lexical_cast(width_) + "," + - boost::lexical_cast(height_)); - - // Needed to set this header explicitly, as long as emscripten - // does not include macro "EMSCRIPTEN_FETCH_RESPONSE_HEADERS" - // https://github.com/emscripten-core/emscripten/pull/8486 - headers["Accept"] = Orthanc::MIME_JPEG; - - std::unique_ptr command( - source.CreateDicomWebCommand( - uri, arguments, headers, new DicomWebThumbnailHandler( - GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid))); - Schedule(command.release()); - } - - scheduledSeries_.insert(seriesInstanceUid); - } - else if (source.IsOrthanc()) - { - // Dummy SOP Instance UID, as we are working at the "series" level - Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, "dummy"); - - std::unique_ptr command(new OrthancRestApiCommand); - command->SetUri("/series/" + hasher.HashSeries()); - command->AcquirePayload(new SelectOrthancInstanceHandler( - GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid)); - Schedule(command.release()); - - scheduledSeries_.insert(seriesInstanceUid); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "Can only load thumbnails from Orthanc or DICOMweb"); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/SeriesThumbnailsLoader.h --- a/Framework/Loaders/SeriesThumbnailsLoader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,240 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error Macro ORTHANC_ENABLE_DCMTK must be defined -#endif - - -#include "../Oracle/GetOrthancImageCommand.h" -#include "../Oracle/HttpCommand.h" -#include "../Oracle/OracleCommandExceptionMessage.h" -#include "../Oracle/OrthancRestApiCommand.h" -#include "DicomSource.h" -#include "ILoaderFactory.h" -#include "OracleScheduler.h" - - -namespace OrthancStone -{ - enum SeriesThumbnailType - { - SeriesThumbnailType_NotLoaded = 1, // The remote server cannot decode this image - SeriesThumbnailType_Unsupported = 2, // The remote server cannot decode this image - SeriesThumbnailType_Pdf = 3, - SeriesThumbnailType_Video = 4, - SeriesThumbnailType_Image = 5 - }; - - - class SeriesThumbnailsLoader : - public IObservable, - public ObserverBase - { - private: - class Thumbnail : public boost::noncopyable - { - private: - SeriesThumbnailType type_; - std::string image_; - std::string mime_; - - public: - Thumbnail(const std::string& image, - const std::string& mime); - - Thumbnail(SeriesThumbnailType type); - - SeriesThumbnailType GetType() const - { - return type_; - } - - const std::string& GetImage() const - { - return image_; - } - - const std::string& GetMime() const - { - return mime_; - } - }; - - public: - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const DicomSource& source_; - const std::string& studyInstanceUid_; - const std::string& seriesInstanceUid_; - const Thumbnail& thumbnail_; - - public: - SuccessMessage(const SeriesThumbnailsLoader& origin, - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const Thumbnail& thumbnail) : - OriginMessage(origin), - source_(source), - studyInstanceUid_(studyInstanceUid), - seriesInstanceUid_(seriesInstanceUid), - thumbnail_(thumbnail) - { - } - - const DicomSource& GetDicomSource() const - { - return source_; - } - - SeriesThumbnailType GetType() const - { - return thumbnail_.GetType(); - } - - const std::string& GetStudyInstanceUid() const - { - return studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return seriesInstanceUid_; - } - - const std::string& GetEncodedImage() const - { - return thumbnail_.GetImage(); - } - - const std::string& GetMime() const - { - return thumbnail_.GetMime(); - } - - Orthanc::ImageAccessor* DecodeImage() const; - }; - - private: - class Handler; - class DicomWebSopClassHandler; - class DicomWebThumbnailHandler; - class ThumbnailInformation; - class OrthancSopClassHandler; - class SelectOrthancInstanceHandler; - -#if ORTHANC_ENABLE_DCMTK == 1 - class SelectDicomWebInstanceHandler; -#endif - - // Maps a "Series Instance UID" to a thumbnail - typedef std::map Thumbnails; - - ILoadersContext& context_; - Thumbnails thumbnails_; - int priority_; - unsigned int width_; - unsigned int height_; - std::set scheduledSeries_; - - void AcquireThumbnail(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - Thumbnail* thumbnail /* takes ownership */); - - void Schedule(IOracleCommand* command); - - void Handle(const HttpCommand::SuccessMessage& message); - - void Handle(const OrthancRestApiCommand::SuccessMessage& message); - - void Handle(const GetOrthancImageCommand::SuccessMessage& message); - -#if ORTHANC_ENABLE_DCMTK == 1 - void Handle(const ParseDicomSuccessMessage& message); -#endif - - void Handle(const OracleCommandExceptionMessage& message); - - SeriesThumbnailsLoader(ILoadersContext& context, - int priority); - - public: - class Factory : public ILoaderFactory - { - private: - int priority_; - - public: - Factory() : - priority_(0) - { - } - - void SetPriority(int priority) - { - priority_ = priority; - } - - virtual boost::shared_ptr Create(ILoadersContext::ILock& context) - { - return SeriesThumbnailsLoader::Create(context, priority_); - } - }; - - - virtual ~SeriesThumbnailsLoader() - { - Clear(); - } - - - static boost::shared_ptr Create(ILoadersContext::ILock& context, - int priority); - - void SetThumbnailSize(unsigned int width, - unsigned int height); - - void Clear(); - - SeriesThumbnailType GetSeriesThumbnail(std::string& image, - std::string& mime, - const std::string& seriesInstanceUid) const; - - void ScheduleLoadThumbnail(const DicomSource& source, - const std::string& patientId, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid); - - bool IsScheduledSeries(const std::string& seriesInstanceUid) const - { - return scheduledSeries_.find(seriesInstanceUid) != scheduledSeries_.end(); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/WebAssemblyLoadersContext.cpp --- a/Framework/Loaders/WebAssemblyLoadersContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebAssemblyLoadersContext.h" - -namespace OrthancStone -{ - class WebAssemblyLoadersContext::Locker : public ILoadersContext::ILock - { - private: - WebAssemblyLoadersContext& that_; - - public: - Locker(WebAssemblyLoadersContext& that) : - that_(that) - { - } - - virtual ILoadersContext& GetContext() const ORTHANC_OVERRIDE - { - return that_; - } - - virtual IObservable& GetOracleObservable() const ORTHANC_OVERRIDE - { - return that_.oracle_.GetOracleObservable(); - } - - virtual void Schedule(boost::shared_ptr receiver, - int priority, - IOracleCommand* command /* Takes ownership */) ORTHANC_OVERRIDE - { - that_.scheduler_->Schedule(receiver, priority, command); - } - - virtual void CancelRequests(boost::shared_ptr receiver) ORTHANC_OVERRIDE - { - that_.scheduler_->CancelRequests(receiver); - } - - virtual void CancelAllRequests() ORTHANC_OVERRIDE - { - that_.scheduler_->CancelAllRequests(); - } - - virtual void AddLoader(boost::shared_ptr loader) ORTHANC_OVERRIDE - { - that_.loaders_.push_back(loader); - } - - virtual void GetStatistics(uint64_t& scheduledCommands, - uint64_t& processedCommands) ORTHANC_OVERRIDE - { - scheduledCommands = that_.scheduler_->GetTotalScheduled(); - processedCommands = that_.scheduler_->GetTotalProcessed(); - } - }; - - - WebAssemblyLoadersContext::WebAssemblyLoadersContext(unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority) - { - oracle_.GetOracleObservable(); - scheduler_ = OracleScheduler::Create(oracle_, oracle_.GetOracleObservable(), oracle_, - maxHighPriority, maxStandardPriority, maxLowPriority); - - if (!scheduler_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - ILoadersContext::ILock* WebAssemblyLoadersContext::Lock() - { - return new Locker(*this); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Loaders/WebAssemblyLoadersContext.h --- a/Framework/Loaders/WebAssemblyLoadersContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILoadersContext.h" -#include "../Oracle/WebAssemblyOracle.h" -#include "OracleScheduler.h" - -#include - -namespace OrthancStone -{ - class WebAssemblyLoadersContext : public ILoadersContext - { - private: - class Locker; - - WebAssemblyOracle oracle_; - boost::shared_ptr scheduler_; - std::list< boost::shared_ptr > loaders_; - - public: - WebAssemblyLoadersContext(unsigned int maxHighPriority, - unsigned int maxStandardPriority, - unsigned int maxLowPriority); - - void SetLocalOrthanc(const std::string& root) - { - oracle_.SetLocalOrthanc(root); - } - - void SetRemoteOrthanc(const Orthanc::WebServiceParameters& orthanc) - { - oracle_.SetRemoteOrthanc(orthanc); - } - - void SetDicomCacheSize(size_t size) - { - oracle_.SetDicomCacheSize(size); - } - - virtual ILock* Lock() ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/ICallable.h --- a/Framework/Messages/ICallable.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IMessage.h" -#include "IObserver.h" - -#include - -#include -#include - -#include -#include - -namespace OrthancStone -{ - // This is referencing an object and member function that can be notified - // by an IObservable. The object must derive from IO - // The member functions must be of type "void Method(const IMessage& message)" or reference a derived class of IMessage - class ICallable : public boost::noncopyable - { - public: - virtual ~ICallable() - { - } - - virtual void Apply(const IMessage& message) = 0; - - virtual const MessageIdentifier& GetMessageIdentifier() = 0; - - // TODO - Is this needed? - virtual boost::weak_ptr GetObserver() const = 0; - }; - - - template - class Callable : public ICallable - { - private: - typedef void (TObserver::* MemberMethod) (const TMessage&); - - boost::weak_ptr observer_; - MemberMethod function_; - - public: - Callable(boost::shared_ptr observer, - MemberMethod function) : - observer_(observer), - function_(function) - { - } - - virtual void Apply(const IMessage& message) - { - boost::shared_ptr lock(observer_); - if (lock) - { - TObserver& observer = dynamic_cast(*lock); - const TMessage& typedMessage = dynamic_cast(message); - (observer.*function_) (typedMessage); - } - } - - virtual const MessageIdentifier& GetMessageIdentifier() - { - return TMessage::GetStaticIdentifier(); - } - - virtual boost::weak_ptr GetObserver() const - { - return observer_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/IMessage.h --- a/Framework/Messages/IMessage.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -#include - -namespace OrthancStone -{ - class MessageIdentifier - { - private: - const char* file_; - int line_; - - bool IsEqual(const MessageIdentifier& other) const - { - return (line_ == other.line_ && - strcmp(file_, other.file_) == 0); - } - - public: - MessageIdentifier(const char* file, - int line) : - file_(file), - line_(line) - { - } - - MessageIdentifier() : - file_(NULL), - line_(0) - { - } - - std::string AsString() const - { - return std::string(file_) + ":" + boost::lexical_cast(line_); - } - - bool operator< (const MessageIdentifier& other) const - { - if (file_ == NULL) - { - return false; - } - else if (line_ != other.line_) - { - return line_ < other.line_; - } - else - { - return strcmp(file_, other.file_) < 0; - } - } - - bool operator== (const MessageIdentifier& other) const - { - return IsEqual(other); - } - - bool operator!= (const MessageIdentifier& other) const - { - return !IsEqual(other); - } - }; - - - /** - * Base messages that are exchanged between IObservable and - * IObserver. Messages are distinguished by the "__FILE__" and - * "__LINE__" macro, as in "Orthanc::SQLite::StatementId". - **/ - class IMessage : public boost::noncopyable - { - public: - virtual ~IMessage() - { - } - - virtual const MessageIdentifier& GetIdentifier() const = 0; - }; - - - /** - * Simple message implementation when no payload is needed but the - * origin is required. Sample usage: - * typedef OriginMessage SliceGeometryErrorMessage; - **/ - template - class OriginMessage : public IMessage - { - private: - const TOrigin& origin_; - - public: - OriginMessage(const TOrigin& origin) : - origin_(origin) - { - } - - const TOrigin& GetOrigin() const - { - return origin_; - } - }; -} - - -#define ORTHANC_STONE_MESSAGE(FILE, LINE) \ - public: \ - static const ::OrthancStone::MessageIdentifier& GetStaticIdentifier() \ - { \ - static const ::OrthancStone::MessageIdentifier id(FILE, LINE); \ - return id; \ - } \ - \ - virtual const ::OrthancStone::MessageIdentifier& GetIdentifier() const \ - { \ - return GetStaticIdentifier(); \ - } - - -#define ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(FILE, LINE, NAME, ORIGIN) \ - class NAME : public ::OrthancStone::OriginMessage \ - { \ - ORTHANC_STONE_MESSAGE(FILE, LINE); \ - \ - NAME(const ORIGIN& origin) : \ - OriginMessage(origin) \ - { \ - } \ - }; - - -#define ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(FILE, LINE, NAME) \ - class NAME : public ::OrthancStone::IMessage \ - { \ - ORTHANC_STONE_MESSAGE(FILE, LINE); \ - }; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/IMessageEmitter.h --- a/Framework/Messages/IMessageEmitter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IObserver.h" -#include "IMessage.h" - -#include - -namespace OrthancStone -{ - /** - This class may be used to customize the way the messages are sent between - a source and a destination, for instance by the ThreadedOracle. - - See the concrete class LockingEmitter for an example of when it is useful. - */ - class IMessageEmitter : public boost::noncopyable - { - public: - virtual ~IMessageEmitter() - { - } - - virtual void EmitMessage(boost::weak_ptr observer, - const IMessage& message) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/IObservable.cpp --- a/Framework/Messages/IObservable.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "IObservable.h" - -#include "../StoneException.h" - -#include - -#include - -namespace OrthancStone -{ - IObservable::~IObservable() - { - // delete all callables (this will also unregister them from the broker) - for (Callables::const_iterator it = callables_.begin(); - it != callables_.end(); ++it) - { - for (std::set::const_iterator - it2 = it->second.begin(); it2 != it->second.end(); ++it2) - { - delete *it2; - } - } - } - - - void IObservable::RegisterCallable(ICallable* callable) - { - if (callable == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - const MessageIdentifier& id = callable->GetMessageIdentifier(); - callables_[id].insert(callable); - } - - void IObservable::EmitMessageInternal(const IObserver* receiver, - const IMessage& message) - { - //LOG(TRACE) << "IObservable::EmitMessageInternal receiver = " << std::hex << receiver << std::dec; - Callables::const_iterator found = callables_.find(message.GetIdentifier()); - - if (found != callables_.end()) - { - for (std::set::const_iterator - it = found->second.begin(); it != found->second.end(); ++it) - { - assert(*it != NULL); - - boost::shared_ptr observer((*it)->GetObserver().lock()); - - if (observer) - { - if (receiver == NULL || // Are we broadcasting? - observer.get() == receiver) // Not broadcasting, but this is the receiver - { - try - { - (*it)->Apply(message); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception on callable: " << e.What(); - } - catch (StoneException& e) - { - LOG(ERROR) << "Exception on callable: " << e.What(); - } - catch (...) - { - LOG(ERROR) << "Native exception on callable"; - } - } - } - else - { - // TODO => Remove "it" from the list of callables => This - // allows to suppress the need for "Unregister()" - } - } - } - } - - - void IObservable::BroadcastMessage(const IMessage& message) - { - EmitMessageInternal(NULL, message); - } - - - void IObservable::EmitMessage(boost::weak_ptr observer, - const IMessage& message) - { - //LOG(TRACE) << "IObservable::EmitMessage observer = " << std::hex << observer.get() << std::dec; - - boost::shared_ptr lock(observer.lock()); - if (lock) - { - EmitMessageInternal(lock.get(), message); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/IObservable.h --- a/Framework/Messages/IObservable.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "ICallable.h" -#include "IObserver.h" - -#include -#include - -namespace OrthancStone -{ - class IObservable : public boost::noncopyable - { - private: - typedef std::map > Callables; - - Callables callables_; - - void EmitMessageInternal(const IObserver* receiver, - const IMessage& message); - - public: - virtual ~IObservable(); - - // Takes ownership of the callable - void RegisterCallable(ICallable* callable); - - void BroadcastMessage(const IMessage& message); - - void EmitMessage(boost::weak_ptr observer, - const IMessage& message); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/IObserver.h --- a/Framework/Messages/IObserver.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include - -namespace OrthancStone -{ - class IObserver : public boost::noncopyable - { - public: - IObserver() - { - } - - virtual ~IObserver() - { - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Messages/ObserverBase.h --- a/Framework/Messages/ObserverBase.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ICallable.h" -#include "IObserver.h" -#include "IObservable.h" - -#include - -#include - -namespace OrthancStone -{ - template - class ObserverBase : - public IObserver, - public boost::enable_shared_from_this - { - public: - boost::shared_ptr GetSharedObserver() - { - try - { - return this->shared_from_this(); - } - catch (boost::bad_weak_ptr&) - { - throw Orthanc::OrthancException( - Orthanc::ErrorCode_InternalError, - "Cannot get a shared pointer to an observer from its constructor, " - "or the observer is not created as a shared pointer"); - } - } - - template - ICallable* CreateCallable(void (TObserver::* MemberMethod) (const TMessage&)) - { - return new Callable(GetSharedObserver(), MemberMethod); - } - - template - void Register(IObservable& observable, - void (TObserver::* MemberMethod) (const TMessage&)) - { - observable.RegisterCallable(CreateCallable(MemberMethod)); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/IOpenGLContext.h --- a/Framework/OpenGL/IOpenGLContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class IOpenGLContext : public boost::noncopyable - { - public: - virtual ~IOpenGLContext() - { - } - - virtual bool IsContextLost() = 0; - - virtual void MakeCurrent() = 0; - - virtual void SwapBuffer() = 0; - - virtual unsigned int GetCanvasWidth() const = 0; - - virtual unsigned int GetCanvasHeight() const = 0; - - // Getting the size of the canvas can be expensive, especially - // in WebAssembly => avoid calling this method too often - // (e.g. on each refresh) - virtual void RefreshCanvasSize() = 0; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLIncludes.h --- a/Framework/OpenGL/OpenGLIncludes.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_OPENGL) -# error The macro ORTHANC_ENABLE_OPENGL must be defined -#endif - -#if ORTHANC_ENABLE_OPENGL != 1 -# error Support for OpenGL is disabled -#endif - -#if defined(__APPLE__) -# include -# include -#elif defined(QT_VERSION_MAJOR) && (QT_VERSION >= 5) -// Qt5 takes care of the inclusions -#elif defined(_WIN32) -// On Windows, use the compatibility headers provided by glew -# include -#else -# include -# include -#endif - -#if ORTHANC_ENABLE_SDL == 1 -# include - -# ifdef NDEBUG - -// glGetError is very expensive! - -# define ORTHANC_OPENGL_CHECK(name) -# define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) - -# else - -# define ORTHANC_OPENGL_CHECK(name) \ -if(true) \ -{ \ - GLenum error = glGetError(); \ - if (error != GL_NO_ERROR) { \ - SDL_GLContext ctx = SDL_GL_GetCurrentContext(); \ - LOG(ERROR) << "Error when calling " << name << " | current context is: 0x" << std::hex << ctx << " | error code is " << error; \ - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,"OpenGL error in " name " | See log."); \ - } \ -} else (void)0 - -# define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) \ -if(true) \ -{ \ - SDL_GLContext ctx = SDL_GL_GetCurrentContext(); \ - LOG(TRACE) << msg << " | Current OpenGL context is " << std::hex << ctx; \ -} else (void)0 - -# endif - -#endif - -#if ORTHANC_ENABLE_WASM == 1 -#include - -#define ORTHANC_OPENGL_CHECK(name) \ -if(true) \ -{ \ - GLenum error = glGetError(); \ - if (error != GL_NO_ERROR) { \ - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ - EM_BOOL lost = emscripten_is_webgl_context_lost(ctx); \ - LOG(ERROR) << "Error when calling " << name << " | current context is: 0x" << std::hex << ctx << " | error code is " << error << " | emscripten_is_webgl_context_lost = " << lost; \ - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,"OpenGL error in " name " | See log."); \ - } \ -} else (void)0 - -#define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) \ -if(true) \ -{ \ - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ - LOG(TRACE) << msg << " | Current OpenGL context is " << std::hex << ctx; \ -} else (void)0 - -#define ORTHANC_CHECK_CURRENT_CONTEXT(context) \ -if(true) \ -{ \ - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ - void* actualCtx = reinterpret_cast(ctx); \ - void* expectedCtx = context.DebugGetInternalContext(); \ - if(expectedCtx != actualCtx) \ - { \ - LOG(ERROR) << "Expected context was " << std::hex << expectedCtx << " while actual context is " << std::hex << actualCtx; \ - } \ -} else (void)0 - -#endif - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLProgram.cpp --- a/Framework/OpenGL/OpenGLProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLProgram.h" - -#include "OpenGLShader.h" -#include "IOpenGLContext.h" - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - OpenGLProgram::OpenGLProgram(OpenGL::IOpenGLContext& context) - : context_(context) - { - program_ = glCreateProgram(); - ORTHANC_OPENGL_CHECK("glCreateProgram"); - if (program_ == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot create an OpenGL program"); - } - } - - - OpenGLProgram::~OpenGLProgram() - { - try - { - if (!context_.IsContextLost()) - { - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteProgram"); - assert(program_ != 0); - glDeleteProgram(program_); - ORTHANC_OPENGL_CHECK("glDeleteProgram"); - } - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What(); - } - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in ~OpenGLProgram: " << e.what(); - } - catch (...) - { - LOG(ERROR) << "Unknown exception in ~OpenGLProgram"; - } - } - - void OpenGLProgram::Use() - { - //ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glUseProgram"); - glUseProgram(program_); - ORTHANC_OPENGL_CHECK("glUseProgram"); - } - - void OpenGLProgram::CompileShaders(const std::string& vertexCode, - const std::string& fragmentCode) - { - assert(program_ != 0); - - OpenGLShader vertexShader(GL_VERTEX_SHADER, vertexCode); - OpenGLShader fragmentShader(GL_FRAGMENT_SHADER, fragmentCode); - - glAttachShader(program_, vertexShader.Release()); - ORTHANC_OPENGL_CHECK("glAttachShader"); - glAttachShader(program_, fragmentShader.Release()); - ORTHANC_OPENGL_CHECK("glAttachShader"); - glLinkProgram(program_); - ORTHANC_OPENGL_CHECK("glLinkProgram"); - glValidateProgram(program_); - ORTHANC_OPENGL_CHECK("glValidateProgram"); - } - - GLint OpenGLProgram::GetUniformLocation(const std::string& name) - { - GLint location = glGetUniformLocation(program_, name.c_str()); - ORTHANC_OPENGL_CHECK("glGetUniformLocation"); - - if (location == -1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem, - "Inexistent uniform variable in shader: " + name); - } - else - { - return location; - } - } - - - GLint OpenGLProgram::GetAttributeLocation(const std::string& name) - { - GLint location = glGetAttribLocation(program_, name.c_str()); - ORTHANC_OPENGL_CHECK("glGetAttribLocation"); - - if (location == -1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem, - "Inexistent attribute in shader: " + name); - } - else - { - return location; - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLProgram.h --- a/Framework/OpenGL/OpenGLProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLIncludes.h" - -#include -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class IOpenGLContext; - - class OpenGLProgram : public boost::noncopyable - { - public: - // WARNING: A global OpenGL context must be active to create this object! - // the context is only passed so that it can be checked for loss - // when destructing the program resource - OpenGLProgram(OpenGL::IOpenGLContext& context); - - ~OpenGLProgram(); - - void Use(); - - // WARNING: A global OpenGL context must be active to run this method! - void CompileShaders(const std::string& vertexCode, - const std::string& fragmentCode); - - GLint GetUniformLocation(const std::string& name); - - GLint GetAttributeLocation(const std::string& name); - private: - GLuint program_; - OpenGL::IOpenGLContext& context_; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLShader.cpp --- a/Framework/OpenGL/OpenGLShader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLShader.h" - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - static GLuint CompileShader(GLenum type, - const std::string& source) - { - // Create shader object - const GLchar* sourceString[1]; - GLint sourceStringLengths[1]; - - sourceString[0] = source.c_str(); - sourceStringLengths[0] = static_cast(source.length()); - GLuint shader = glCreateShader(type); - ORTHANC_OPENGL_CHECK("glCreateShader"); - - if (shader == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot create an OpenGL shader"); - } - else - { - // Assign and compile the source to the shader object - glShaderSource(shader, 1, sourceString, sourceStringLengths); - ORTHANC_OPENGL_CHECK("glShaderSource"); - glCompileShader(shader); - ORTHANC_OPENGL_CHECK("glCompileShader"); - - // Check if there were errors - int infoLen = 0; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); - ORTHANC_OPENGL_CHECK("glGetShaderiv"); - - if (infoLen > 1) // Might be equal to 1, which amounts to no error - { - std::string infoLog; - infoLog.resize(infoLen + 1); - glGetShaderInfoLog(shader, infoLen, NULL, &infoLog[0]); - ORTHANC_OPENGL_CHECK("glGetShaderInfoLog"); - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader"); - glDeleteShader(shader); - ORTHANC_OPENGL_CHECK("glDeleteShader"); - - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Error while creating an OpenGL shader: " + infoLog); - } - else - { - return shader; - } - } - } - - - OpenGLShader::OpenGLShader(GLenum type, - const std::string& source) - { - shader_ = CompileShader(type, source); - isValid_ = true; - } - - - OpenGLShader::~OpenGLShader() - { - try - { - if (isValid_) - { - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader"); - glDeleteShader(shader_); - ORTHANC_OPENGL_CHECK("glDeleteShader"); - } - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What(); - } - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in ~OpenGLShader: " << e.what(); - } - catch (...) - { - LOG(ERROR) << "Unknown exception in ~OpenGLShader"; - } - } - - GLuint OpenGLShader::Release() - { - if (isValid_) - { - isValid_ = false; - return shader_; - } - else - { - LOG(ERROR) << "OpenGLShader::Release(): (!isValid_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLShader.h --- a/Framework/OpenGL/OpenGLShader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLIncludes.h" - -#include -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class OpenGLShader : public boost::noncopyable - { - private: - bool isValid_; - GLuint shader_; - - public: - OpenGLShader(GLenum type, - const std::string& source); - - ~OpenGLShader(); - - bool IsValid() const - { - return isValid_; - } - - GLuint Release(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLTexture.cpp --- a/Framework/OpenGL/OpenGLTexture.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLTexture.h" -#include "IOpenGLContext.h" - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - OpenGLTexture::OpenGLTexture(OpenGL::IOpenGLContext& context) - : width_(0) - , height_(0) - , context_(context) - { - if (!context_.IsContextLost()) - { - // Generate a texture object - glGenTextures(1, &texture_); - if (texture_ == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot create an OpenGL program"); - } - } - } - - OpenGLTexture::~OpenGLTexture() - { - try - { - if (!context_.IsContextLost()) - { - assert(texture_ != 0); - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteTextures"); - glDeleteTextures(1, &texture_); - } - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What(); - } - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in ~OpenGLTexture: " << e.what(); - } - catch (...) - { - LOG(ERROR) << "Unknown exception in ~OpenGLTexture"; - } - } - - void OpenGLTexture::Load(const Orthanc::ImageAccessor& image, - bool isLinearInterpolation) - { - if (!context_.IsContextLost()) - { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Disable byte-alignment restriction - - if (image.GetPitch() != image.GetBytesPerPixel() * image.GetWidth()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "Unsupported non-zero padding"); - } - - // Bind it - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture_); - - GLenum sourceFormat, internalFormat; - - switch (image.GetFormat()) - { - case Orthanc::PixelFormat_Grayscale8: - sourceFormat = GL_RED; - internalFormat = GL_RED; - break; - - case Orthanc::PixelFormat_RGB24: - sourceFormat = GL_RGB; - internalFormat = GL_RGB; - break; - - case Orthanc::PixelFormat_RGBA32: - sourceFormat = GL_RGBA; - internalFormat = GL_RGBA; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "No support for this format in OpenGL textures: " + - std::string(EnumerationToString(image.GetFormat()))); - } - - width_ = image.GetWidth(); - height_ = image.GetHeight(); - - GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); - - // Load the texture from the image buffer - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, image.GetWidth(), image.GetHeight(), - 0, sourceFormat, GL_UNSIGNED_BYTE, image.GetBuffer()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, interpolation); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, interpolation); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - } - } - - - void OpenGLTexture::Bind(GLint location) - { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture_); - glUniform1i(location, 0 /* texture unit */); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/OpenGLTexture.h --- a/Framework/OpenGL/OpenGLTexture.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLIncludes.h" - -#include - -#include - - -namespace OrthancStone -{ - namespace OpenGL - { - class IOpenGLContext; - - class OpenGLTexture : public boost::noncopyable - { - private: - GLuint texture_; - unsigned int width_; - unsigned int height_; - OpenGL::IOpenGLContext& context_; - - public: - OpenGLTexture(OpenGL::IOpenGLContext& context); - - ~OpenGLTexture(); - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - void Load(const Orthanc::ImageAccessor& image, - bool isLinearInterpolation); - - void Bind(GLint location); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/SdlOpenGLContext.cpp --- a/Framework/OpenGL/SdlOpenGLContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlOpenGLContext.h" -#include "../../Framework/StoneException.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#if !defined(ORTHANC_ENABLE_GLEW) -# error Macro ORTHANC_ENABLE_GLEW must be defined -#endif - -#if ORTHANC_ENABLE_GLEW == 1 -# include -#endif - -#include - -namespace OrthancStone -{ - SdlOpenGLContext::SdlOpenGLContext(const char* title, - unsigned int width, - unsigned int height, - bool allowDpiScaling) - : window_(title, width, height, true /* enable OpenGL */, allowDpiScaling) - , context_(NULL) - { - context_ = SDL_GL_CreateContext(window_.GetObject()); - - if (context_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot initialize OpenGL"); - } - -#if ORTHANC_ENABLE_GLEW == 1 - // The initialization function of glew (i.e. "glewInit()") can - // only be called once an OpenGL is setup. - // https://stackoverflow.com/a/45033669/881731 - { - static boost::mutex mutex_; - static bool isGlewInitialized_ = false; - - boost::mutex::scoped_lock lock(mutex_); - - if (!isGlewInitialized_) - { - LOG(INFO) << "Initializing glew"; - - GLenum err = glewInit(); - if (GLEW_OK != err) - { - LOG(ERROR) << glewGetErrorString(err); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot initialize glew"); - } - - isGlewInitialized_ = true; - } - } -#endif - } - - - SdlOpenGLContext::~SdlOpenGLContext() - { - SDL_GL_DeleteContext(context_); - } - - void SdlOpenGLContext::MakeCurrent() - { - if (SDL_GL_MakeCurrent(window_.GetObject(), context_) != 0) - { - const char* errText = SDL_GetError(); - std::stringstream ss; - ss << "Cannot set current OpenGL context. SDL error text: " << errText; - std::string errStr = ss.str(); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, errStr.c_str()); - } - - // This makes our buffer swap synchronized with the monitor's vertical refresh - SDL_GL_SetSwapInterval(1); - } - - - void SdlOpenGLContext::SwapBuffer() - { - // Swap our buffer to display the current contents of buffer on screen - SDL_GL_SwapWindow(window_.GetObject()); - } - - - unsigned int SdlOpenGLContext::GetCanvasWidth() const - { - int w = 0; - SDL_GL_GetDrawableSize(window_.GetObject(), &w, NULL); - return static_cast(w); - } - - - unsigned int SdlOpenGLContext::GetCanvasHeight() const - { - int h = 0; - SDL_GL_GetDrawableSize(window_.GetObject(), NULL, &h); - return static_cast(h); - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/SdlOpenGLContext.h --- a/Framework/OpenGL/SdlOpenGLContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include "IOpenGLContext.h" -#include "../Viewport/SdlWindow.h" - -#include - -#include - -namespace OrthancStone -{ - class SdlOpenGLContext : public OpenGL::IOpenGLContext - { - private: - SdlWindow window_; - SDL_GLContext context_; - - public: - SdlOpenGLContext(const char* title, - unsigned int width, - unsigned int height, - bool allowDpiScaling = true); - - ~SdlOpenGLContext(); - - SdlWindow& GetWindow() - { - return window_; - } - - virtual bool IsContextLost() ORTHANC_OVERRIDE - { - // On desktop applications, an OpenGL context should never be lost - return false; - } - - virtual void MakeCurrent() ORTHANC_OVERRIDE; - - virtual void SwapBuffer() ORTHANC_OVERRIDE; - - virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE; - - virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE; - - void ToggleMaximize() - { - window_.ToggleMaximize(); - } - - virtual void RefreshCanvasSize() ORTHANC_OVERRIDE - { - // Nothing to do for SDL - } - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/WebAssemblyOpenGLContext.cpp --- a/Framework/OpenGL/WebAssemblyOpenGLContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,271 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebAssemblyOpenGLContext.h" - -#include "../StoneException.h" - -#include - -#include -#include - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class WebAssemblyOpenGLContext::PImpl - { - private: - std::string canvasSelector_; - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context_; - unsigned int canvasWidth_; - unsigned int canvasHeight_; - bool isContextLost_; - - public: - PImpl(const std::string& canvasSelector) - : canvasSelector_(canvasSelector) - , isContextLost_(false) - { - // Context configuration - EmscriptenWebGLContextAttributes attr; - emscripten_webgl_init_context_attributes(&attr); - - context_ = emscripten_webgl_create_context(canvasSelector.c_str(), &attr); - if (context_ == 0) - { - std::string message("Cannot create an OpenGL context for the element with the following CSS selector: \""); - message += canvasSelector; - message += "\" Please make sure the -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 flag has been passed to Emscripten when building."; - LOG(ERROR) << message; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, message); - } - - UpdateSize(); - } - - void* DebugGetInternalContext() const - { - return reinterpret_cast(context_); - } - - bool IsContextLost() - { - //LOG(TRACE) << "IsContextLost() for context " << std::hex << context_ << std::dec; - bool apiFlag = (emscripten_is_webgl_context_lost(context_) != 0); - isContextLost_ = apiFlag; - return isContextLost_; - } - - void SetLostContext() - { - isContextLost_ = true; - } - - ~PImpl() - { - try - { - EMSCRIPTEN_RESULT result = emscripten_webgl_destroy_context(context_); - if (result != EMSCRIPTEN_RESULT_SUCCESS) - { - LOG(ERROR) << "emscripten_webgl_destroy_context returned code " << result; - } - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in WebAssemblyOpenGLContext::~PImpl: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in WebAssemblyOpenGLContext::~PImpl: " << e.What(); - } - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in WebAssemblyOpenGLContext::~PImpl: " << e.what(); - } - catch (...) - { - LOG(ERROR) << "Unknown exception in WebAssemblyOpenGLContext::~PImpl"; - } - } - - const std::string& GetCanvasSelector() const - { - return canvasSelector_; - } - - void MakeCurrent() - { - if (IsContextLost()) - { - LOG(ERROR) << "MakeCurrent() called on lost context " << context_; - throw StoneException(ErrorCode_WebGLContextLost); - } - - if (emscripten_is_webgl_context_lost(context_)) - { - LOG(ERROR) << "OpenGL context has been lost for canvas selector: " << canvasSelector_; - SetLostContext(); - throw StoneException(ErrorCode_WebGLContextLost); - } - - if (emscripten_webgl_make_context_current(context_) != EMSCRIPTEN_RESULT_SUCCESS) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Cannot set the OpenGL context"); - } - } - - void SwapBuffer() - { - /** - * "Rendered WebGL content is implicitly presented (displayed to - * the user) on the canvas when the event handler that renders with - * WebGL returns back to the browser event loop." - * https://emscripten.org/docs/api_reference/html5.h.html#webgl-context - * - * Could call "emscripten_webgl_commit_frame()" if - * "explicitSwapControl" option were set to "true". - **/ - } - - unsigned int GetCanvasWidth() const - { - return canvasWidth_; - } - - unsigned int GetCanvasHeight() const - { - return canvasHeight_; - } - - void UpdateSize() - { - double w, h; - emscripten_get_element_css_size(canvasSelector_.c_str(), &w, &h); - - /** - * Emscripten has the function emscripten_get_element_css_size() - * to query the width and height of a named HTML element. I'm - * calling this first to get the initial size of the canvas DOM - * element, and then call emscripten_set_canvas_size() to - * initialize the framebuffer size of the canvas to the same - * size as its DOM element. - * https://floooh.github.io/2017/02/22/emsc-html.html - **/ - - if (w <= 0 || - h <= 0) - { - canvasWidth_ = 0; - canvasHeight_ = 0; - } - else - { - canvasWidth_ = static_cast(boost::math::iround(w)); - canvasHeight_ = static_cast(boost::math::iround(h)); - } - - emscripten_set_canvas_element_size(canvasSelector_.c_str(), canvasWidth_, canvasHeight_); - } - }; - - - WebAssemblyOpenGLContext::WebAssemblyOpenGLContext(const std::string& canvasSelector) : - pimpl_(new PImpl(canvasSelector)) - { - } - - bool WebAssemblyOpenGLContext::IsContextLost() - { - return pimpl_->IsContextLost(); - } - - void WebAssemblyOpenGLContext::SetLostContext() - { - pimpl_->SetLostContext(); - } - - void* WebAssemblyOpenGLContext::DebugGetInternalContext() const - { - return pimpl_->DebugGetInternalContext(); - } - - void WebAssemblyOpenGLContext::MakeCurrent() - { - assert(pimpl_.get() != NULL); - pimpl_->MakeCurrent(); - } - - void WebAssemblyOpenGLContext::SwapBuffer() - { - assert(pimpl_.get() != NULL); - pimpl_->SwapBuffer(); - } - - unsigned int WebAssemblyOpenGLContext::GetCanvasWidth() const - { - assert(pimpl_.get() != NULL); - return pimpl_->GetCanvasWidth(); - } - - unsigned int WebAssemblyOpenGLContext::GetCanvasHeight() const - { - assert(pimpl_.get() != NULL); - return pimpl_->GetCanvasHeight(); - } - - void WebAssemblyOpenGLContext::RefreshCanvasSize() - { - assert(pimpl_.get() != NULL); - - try - { - pimpl_->UpdateSize(); - } - catch (const StoneException& e) - { - // Ignore problems about the loss of the WebGL context (edge case) - if (e.GetErrorCode() == ErrorCode_WebGLContextLost) - { - return; - } - else - { - throw; - } - } - } - - const std::string& WebAssemblyOpenGLContext::GetCanvasSelector() const - { - assert(pimpl_.get() != NULL); - return pimpl_->GetCanvasSelector(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OpenGL/WebAssemblyOpenGLContext.h --- a/Framework/OpenGL/WebAssemblyOpenGLContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if !defined(ORTHANC_ENABLE_WASM) -# error Macro ORTHANC_ENABLE_WASM must be defined -#endif - -#if ORTHANC_ENABLE_WASM != 1 -# error This file can only be used if targeting WebAssembly -#endif - -#if !defined(ORTHANC_ENABLE_OPENGL) -# error The macro ORTHANC_ENABLE_OPENGL must be defined -#endif - -#if ORTHANC_ENABLE_OPENGL != 1 -# error Support for OpenGL is disabled -#endif - -#include "IOpenGLContext.h" - -#include - -#include - -namespace OrthancStone -{ - namespace OpenGL - { - class WebAssemblyOpenGLContext : public OpenGL::IOpenGLContext - { - private: - class PImpl; - boost::shared_ptr pimpl_; - - public: - WebAssemblyOpenGLContext(const std::string& canvasSelector); - - virtual bool IsContextLost() ORTHANC_OVERRIDE; - - virtual void MakeCurrent() ORTHANC_OVERRIDE; - - virtual void SwapBuffer() ORTHANC_OVERRIDE; - - virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE; - - virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE; - - /** - Returns true if the underlying context has been successfully recreated - */ - //bool TryRecreate(); - - virtual void RefreshCanvasSize() ORTHANC_OVERRIDE; - - const std::string& GetCanvasSelector() const; - - - /** - * This is for manual context loss (debug purposes) - **/ - void* DebugGetInternalContext() const; - void SetLostContext(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GenericOracleRunner.cpp --- a/Framework/Oracle/GenericOracleRunner.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,524 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GenericOracleRunner.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#include "GetOrthancImageCommand.h" -#include "GetOrthancWebViewerJpegCommand.h" -#include "HttpCommand.h" -#include "OracleCommandExceptionMessage.h" -#include "OrthancRestApiCommand.h" -#include "ParseDicomFromFileCommand.h" -#include "ParseDicomFromWadoCommand.h" -#include "ReadFileCommand.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "ParseDicomSuccessMessage.h" -# include -# include -static unsigned int BUCKET_DICOMDIR = 0; -static unsigned int BUCKET_SOP = 1; -#endif - -#include -#include -#include -#include -#include - -#include - - - -namespace OrthancStone -{ - static void CopyHttpHeaders(Orthanc::HttpClient& client, - const Orthanc::HttpClient::HttpHeaders& headers) - { - for (Orthanc::HttpClient::HttpHeaders::const_iterator - it = headers.begin(); it != headers.end(); it++ ) - { - client.AddHeader(it->first, it->second); - } - } - - - static void DecodeAnswer(std::string& answer, - const Orthanc::HttpClient::HttpHeaders& headers) - { - Orthanc::HttpCompression contentEncoding = Orthanc::HttpCompression_None; - - for (Orthanc::HttpClient::HttpHeaders::const_iterator it = headers.begin(); - it != headers.end(); ++it) - { - std::string s; - Orthanc::Toolbox::ToLowerCase(s, it->first); - - if (s == "content-encoding") - { - if (it->second == "gzip") - { - contentEncoding = Orthanc::HttpCompression_Gzip; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "Unsupported HTTP Content-Encoding: " + it->second); - } - - break; - } - } - - if (contentEncoding == Orthanc::HttpCompression_Gzip) - { - std::string compressed; - answer.swap(compressed); - - Orthanc::GzipCompressor compressor; - compressor.Uncompress(answer, compressed.c_str(), compressed.size()); - - LOG(INFO) << "Uncompressing gzip Encoding: from " << compressed.size() - << " to " << answer.size() << " bytes"; - } - } - - - static void RunHttpCommand(std::string& answer, - Orthanc::HttpClient::HttpHeaders& answerHeaders, - const HttpCommand& command) - { - Orthanc::HttpClient client; - client.SetUrl(command.GetUrl()); - client.SetMethod(command.GetMethod()); - client.SetTimeout(command.GetTimeout()); - - CopyHttpHeaders(client, command.GetHttpHeaders()); - - if (command.HasCredentials()) - { - client.SetCredentials(command.GetUsername().c_str(), command.GetPassword().c_str()); - } - - if (command.GetMethod() == Orthanc::HttpMethod_Post || - command.GetMethod() == Orthanc::HttpMethod_Put) - { - client.SetBody(command.GetBody()); - } - - client.ApplyAndThrowException(answer, answerHeaders); - DecodeAnswer(answer, answerHeaders); - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const HttpCommand& command) - { - std::string answer; - Orthanc::HttpClient::HttpHeaders answerHeaders; - RunHttpCommand(answer, answerHeaders, command); - - HttpCommand::SuccessMessage message(command, answerHeaders, answer); - emitter.EmitMessage(receiver, message); - } - - - static void RunOrthancRestApiCommand(std::string& answer, - Orthanc::HttpClient::HttpHeaders& answerHeaders, - const Orthanc::WebServiceParameters& orthanc, - const OrthancRestApiCommand& command) - { - Orthanc::HttpClient client(orthanc, command.GetUri()); - client.SetRedirectionFollowed(false); - client.SetMethod(command.GetMethod()); - client.SetTimeout(command.GetTimeout()); - - CopyHttpHeaders(client, command.GetHttpHeaders()); - - if (command.GetMethod() == Orthanc::HttpMethod_Post || - command.GetMethod() == Orthanc::HttpMethod_Put) - { - client.SetBody(command.GetBody()); - } - - client.ApplyAndThrowException(answer, answerHeaders); - DecodeAnswer(answer, answerHeaders); - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const Orthanc::WebServiceParameters& orthanc, - const OrthancRestApiCommand& command) - { - std::string answer; - Orthanc::HttpClient::HttpHeaders answerHeaders; - RunOrthancRestApiCommand(answer, answerHeaders, orthanc, command); - - OrthancRestApiCommand::SuccessMessage message(command, answerHeaders, answer); - emitter.EmitMessage(receiver, message); - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const Orthanc::WebServiceParameters& orthanc, - const GetOrthancImageCommand& command) - { - Orthanc::HttpClient client(orthanc, command.GetUri()); - client.SetRedirectionFollowed(false); - client.SetTimeout(command.GetTimeout()); - - CopyHttpHeaders(client, command.GetHttpHeaders()); - - std::string answer; - Orthanc::HttpClient::HttpHeaders answerHeaders; - client.ApplyAndThrowException(answer, answerHeaders); - - DecodeAnswer(answer, answerHeaders); - - command.ProcessHttpAnswer(receiver, emitter, answer, answerHeaders); - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const Orthanc::WebServiceParameters& orthanc, - const GetOrthancWebViewerJpegCommand& command) - { - Orthanc::HttpClient client(orthanc, command.GetUri()); - client.SetRedirectionFollowed(false); - client.SetTimeout(command.GetTimeout()); - - CopyHttpHeaders(client, command.GetHttpHeaders()); - - std::string answer; - Orthanc::HttpClient::HttpHeaders answerHeaders; - client.ApplyAndThrowException(answer, answerHeaders); - - DecodeAnswer(answer, answerHeaders); - - command.ProcessHttpAnswer(receiver, emitter, answer); - } - - - static std::string GetPath(const std::string& root, - const std::string& file) - { - boost::filesystem::path a(root); - boost::filesystem::path b(file); - - boost::filesystem::path c; - if (b.is_absolute()) - { - c = b; - } - else - { - c = a / b; - } - - return c.string(); - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const std::string& root, - const ReadFileCommand& command) - { - std::string path = GetPath(root, command.GetPath()); - LOG(TRACE) << "Oracle reading file: " << path; - - std::string content; - Orthanc::SystemToolbox::ReadFile(content, path, true /* log */); - - ReadFileCommand::SuccessMessage message(command, content); - emitter.EmitMessage(receiver, message); - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - static Orthanc::ParsedDicomFile* ParseDicom(uint64_t& fileSize, /* OUT */ - const std::string& path, - bool isPixelData) - { - if (!Orthanc::SystemToolbox::IsRegularFile(path)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentFile); - } - - LOG(TRACE) << "Parsing DICOM file, " << (isPixelData ? "with" : "without") - << " pixel data: " << path; - - boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); - - fileSize = Orthanc::SystemToolbox::GetFileSize(path); - - // Check for 32bit systems - if (fileSize != static_cast(static_cast(fileSize))) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); - } - - DcmFileFormat dicom; - bool ok; - - if (isPixelData) - { - ok = dicom.loadFile(path.c_str()).good(); - } - else - { -#if DCMTK_VERSION_NUMBER >= 362 - /** - * NB : We could stop at (0x3007, 0x0000) instead of - * DCM_PixelData as the Stone framework does not use further - * tags (cf. the Orthanc::DICOM_TAG_* constants), but we still - * use "PixelData" as this does not change the runtime much, and - * as it is more explicit. - **/ - static const DcmTagKey STOP = DCM_PixelData; - //static const DcmTagKey STOP(0x3007, 0x0000); - - ok = dicom.loadFileUntilTag(path.c_str(), EXS_Unknown, EGL_noChange, - DCM_MaxReadLength, ERM_autoDetect, STOP).good(); -#else - // The primitive "loadFileUntilTag" was introduced in DCMTK 3.6.2 - ok = dicom.loadFile(path.c_str()).good(); -#endif - } - - if (ok) - { - std::unique_ptr result(new Orthanc::ParsedDicomFile(dicom)); - - boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); - LOG(TRACE) << path << ": parsed in " << (end-start).total_milliseconds() << " ms"; - - return result.release(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, - "Cannot parse file: " + path); - } - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - boost::shared_ptr cache, - const std::string& root, - const ParseDicomFromFileCommand& command) - { - const std::string path = GetPath(root, command.GetPath()); - - if (cache) - { - ParsedDicomCache::Reader reader(*cache, BUCKET_DICOMDIR, path); - if (reader.IsValid() && - (!command.IsPixelDataIncluded() || - reader.HasPixelData())) - { - // Reuse the DICOM file from the cache - ParseDicomSuccessMessage message(command, command.GetSource(), reader.GetDicom(), - reader.GetFileSize(), reader.HasPixelData()); - emitter.EmitMessage(receiver, message); - return; - } - } - - uint64_t fileSize; - std::unique_ptr parsed(ParseDicom(fileSize, path, command.IsPixelDataIncluded())); - - if (fileSize != static_cast(fileSize)) - { - // Cannot load such a large file on 32-bit architecture - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); - } - - { - ParseDicomSuccessMessage message - (command, command.GetSource(), *parsed, - static_cast(fileSize), command.IsPixelDataIncluded()); - emitter.EmitMessage(receiver, message); - } - - if (cache) - { - // Store it into the cache for future use - - // Invalidate to overwrite DICOM instance that would already - // be stored without pixel data - cache->Invalidate(BUCKET_DICOMDIR, path); - - cache->Acquire(BUCKET_DICOMDIR, path, parsed.release(), - static_cast(fileSize), command.IsPixelDataIncluded()); - } - } - - - static void RunInternal(boost::weak_ptr receiver, - IMessageEmitter& emitter, - boost::shared_ptr cache, - const Orthanc::WebServiceParameters& orthanc, - const ParseDicomFromWadoCommand& command) - { - if (cache) - { - ParsedDicomCache::Reader reader(*cache, BUCKET_SOP, command.GetSopInstanceUid()); - if (reader.IsValid() && - reader.HasPixelData()) - { - // Reuse the DICOM file from the cache - ParseDicomSuccessMessage message(command, command.GetSource(), reader.GetDicom(), - reader.GetFileSize(), reader.HasPixelData()); - emitter.EmitMessage(receiver, message); - return; - } - } - - std::string answer; - Orthanc::HttpClient::HttpHeaders answerHeaders; - - switch (command.GetRestCommand().GetType()) - { - case IOracleCommand::Type_Http: - RunHttpCommand(answer, answerHeaders, dynamic_cast(command.GetRestCommand())); - break; - - case IOracleCommand::Type_OrthancRestApi: - RunOrthancRestApiCommand(answer, answerHeaders, orthanc, - dynamic_cast(command.GetRestCommand())); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - size_t fileSize; - std::unique_ptr parsed(ParseDicomSuccessMessage::ParseWadoAnswer(fileSize, answer, answerHeaders)); - - { - ParseDicomSuccessMessage message(command, command.GetSource(), *parsed, fileSize, - true /* pixel data always is included in WADO-RS */); - emitter.EmitMessage(receiver, message); - } - - if (cache) - { - // Store it into the cache for future use - cache->Acquire(BUCKET_SOP, command.GetSopInstanceUid(), parsed.release(), fileSize, true); - } - } -#endif - - - void GenericOracleRunner::Run(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const IOracleCommand& command) - { - Orthanc::ErrorCode error = Orthanc::ErrorCode_Success; - - try - { - switch (command.GetType()) - { - case IOracleCommand::Type_Sleep: - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, - "Sleep command cannot be executed by the runner"); - - case IOracleCommand::Type_Http: - RunInternal(receiver, emitter, dynamic_cast(command)); - break; - - case IOracleCommand::Type_OrthancRestApi: - RunInternal(receiver, emitter, orthanc_, - dynamic_cast(command)); - break; - - case IOracleCommand::Type_GetOrthancImage: - RunInternal(receiver, emitter, orthanc_, - dynamic_cast(command)); - break; - - case IOracleCommand::Type_GetOrthancWebViewerJpeg: - RunInternal(receiver, emitter, orthanc_, - dynamic_cast(command)); - break; - - case IOracleCommand::Type_ReadFile: - RunInternal(receiver, emitter, rootDirectory_, - dynamic_cast(command)); - break; - - case IOracleCommand::Type_ParseDicomFromFile: - case IOracleCommand::Type_ParseDicomFromWado: -#if ORTHANC_ENABLE_DCMTK == 1 - switch (command.GetType()) - { - case IOracleCommand::Type_ParseDicomFromFile: - RunInternal(receiver, emitter, dicomCache_, rootDirectory_, - dynamic_cast(command)); - break; - - case IOracleCommand::Type_ParseDicomFromWado: - RunInternal(receiver, emitter, dicomCache_, orthanc_, - dynamic_cast(command)); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - break; -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "DCMTK must be enabled to parse DICOM files"); -#endif - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception within the oracle: " << e.What(); - error = e.GetErrorCode(); - } - catch (...) - { - LOG(ERROR) << "Threaded exception within the oracle"; - error = Orthanc::ErrorCode_InternalError; - } - - if (error != Orthanc::ErrorCode_Success) - { - OracleCommandExceptionMessage message(command, error); - emitter.EmitMessage(receiver, message); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GenericOracleRunner.h --- a/Framework/Oracle/GenericOracleRunner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include // To have the macros properly defined - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "../Toolbox/ParsedDicomCache.h" -#endif - -#include "IOracleCommand.h" -#include "../Messages/IMessageEmitter.h" - -#include // For ORTHANC_OVERRIDE -#include - -namespace OrthancStone -{ - class GenericOracleRunner : public boost::noncopyable - { - private: - Orthanc::WebServiceParameters orthanc_; - std::string rootDirectory_; - -#if ORTHANC_ENABLE_DCMTK == 1 - boost::shared_ptr dicomCache_; -#endif - - public: - GenericOracleRunner() : - rootDirectory_(".") - { - } - - void SetOrthanc(const Orthanc::WebServiceParameters& orthanc) - { - orthanc_ = orthanc; - } - - const Orthanc::WebServiceParameters& GetOrthanc() const - { - return orthanc_; - } - - void SetRootDirectory(const std::string& rootDirectory) - { - rootDirectory_ = rootDirectory; - } - - const std::string GetRootDirectory() const - { - return rootDirectory_; - } - -#if ORTHANC_ENABLE_DCMTK == 1 - void SetDicomCache(boost::shared_ptr cache) - { - dicomCache_ = cache; - } -#endif - - void Run(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const IOracleCommand& command); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GetOrthancImageCommand.cpp --- a/Framework/Oracle/GetOrthancImageCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GetOrthancImageCommand.h" - -#include -#include -#include -#include -#include - -namespace OrthancStone -{ - GetOrthancImageCommand::GetOrthancImageCommand() : - uri_("/"), - timeout_(600), - hasExpectedFormat_(false) - { - } - - - void GetOrthancImageCommand::SetExpectedPixelFormat(Orthanc::PixelFormat format) - { - hasExpectedFormat_ = true; - expectedFormat_ = format; - } - - - static std::string GetFormatSuffix(Orthanc::PixelFormat pixelFormat) - { - switch (pixelFormat) - { - case Orthanc::PixelFormat_RGB24: - return "preview"; - - case Orthanc::PixelFormat_Grayscale16: - return "image-uint16"; - - case Orthanc::PixelFormat_SignedGrayscale16: - return "image-int16"; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void GetOrthancImageCommand::SetInstanceUri(const std::string& instance, - Orthanc::PixelFormat pixelFormat) - { - uri_ = "/instances/" + instance + "/" + GetFormatSuffix(pixelFormat); - } - - - void GetOrthancImageCommand::SetFrameUri(const std::string& instance, - unsigned int frame, - Orthanc::PixelFormat pixelFormat) - { - uri_ = ("/instances/" + instance + "/frames/" + - boost::lexical_cast(frame) + "/" + GetFormatSuffix(pixelFormat)); - } - - - void GetOrthancImageCommand::ProcessHttpAnswer(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const std::string& answer, - const HttpHeaders& answerHeaders) const - { - for (HttpHeaders::const_iterator it = answerHeaders.begin(); it != answerHeaders.end(); ++it) - { - std::string key = Orthanc::Toolbox::StripSpaces(it->first); - Orthanc::Toolbox::ToLowerCase(key); - - if (key == "content-disposition" && - it->second == "filename=\"unsupported.png\"") - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, - "Orthanc cannot decode this image"); - } - } - - Orthanc::MimeType contentType = Orthanc::MimeType_Binary; - - for (HttpHeaders::const_iterator it = answerHeaders.begin(); - it != answerHeaders.end(); ++it) - { - std::string s; - Orthanc::Toolbox::ToLowerCase(s, it->first); - - if (s == "content-type") - { - contentType = Orthanc::StringToMimeType(it->second); - break; - } - } - - std::unique_ptr image; - - switch (contentType) - { - case Orthanc::MimeType_Png: - { - image.reset(new Orthanc::PngReader); - dynamic_cast(*image).ReadFromMemory(answer); - break; - } - - case Orthanc::MimeType_Pam: - { -#ifdef __EMSCRIPTEN__ - // "true" means we ask the PamReader to make an extra copy so that - // the resulting Orthanc::ImageAccessor is aligned (as malloc is). - // Indeed, even though alignment is not required in Web Assembly, - // Emscripten seems to check it and bail out if addresses are "odd" - image.reset(new Orthanc::PamReader(true)); -#else - // potentially unaligned, with is faster and consumes less heap memory - image.reset(new Orthanc::PamReader); -#endif - dynamic_cast(*image).ReadFromMemory(answer); - break; - } - - case Orthanc::MimeType_Jpeg: - { - image.reset(new Orthanc::JpegReader); - dynamic_cast(*image).ReadFromMemory(answer); - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "Unsupported HTTP Content-Type for an image: " + - std::string(Orthanc::EnumerationToString(contentType))); - } - - if (hasExpectedFormat_) - { - if (expectedFormat_ == Orthanc::PixelFormat_SignedGrayscale16 && - image->GetFormat() == Orthanc::PixelFormat_Grayscale16) - { - image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); - } - - if (expectedFormat_ != image->GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - } - - //{ - // // DEBUG DISPLAY IMAGE PROPERTIES BGO 2020-04-11 - // const Orthanc::ImageAccessor& source = *image; - // const void* sourceBuffer = source.GetConstBuffer(); - // intptr_t sourceBufferInt = reinterpret_cast(sourceBuffer); - // int sourceWidth = source.GetWidth(); - // int sourceHeight = source.GetHeight(); - // int sourcePitch = source.GetPitch(); - - // // TODO: turn error into trace below - // LOG(ERROR) << "GetOrthancImageCommand::ProcessHttpAnswer | source:" - // << " W = " << sourceWidth << " H = " << sourceHeight - // << " P = " << sourcePitch << " B = " << sourceBufferInt - // << " B % 4 == " << sourceBufferInt % 4; - //} - - - SuccessMessage message(*this, *image, contentType); - emitter.EmitMessage(receiver, message); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GetOrthancImageCommand.h --- a/Framework/Oracle/GetOrthancImageCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessageEmitter.h" -#include "OracleCommandBase.h" - -#include - -#include - -namespace OrthancStone -{ - class GetOrthancImageCommand : public OracleCommandBase - { - public: - typedef std::map HttpHeaders; - - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Orthanc::ImageAccessor& image_; - Orthanc::MimeType mime_; - - public: - SuccessMessage(const GetOrthancImageCommand& command, - const Orthanc::ImageAccessor& image, - Orthanc::MimeType mime) : - OriginMessage(command), - image_(image), - mime_(mime) - { - } - - const Orthanc::ImageAccessor& GetImage() const - { - return image_; - } - - Orthanc::MimeType GetMimeType() const - { - return mime_; - } - }; - - - private: - std::string uri_; - HttpHeaders headers_; - unsigned int timeout_; - bool hasExpectedFormat_; - Orthanc::PixelFormat expectedFormat_; - - GetOrthancImageCommand(const GetOrthancImageCommand& other) : - uri_(other.uri_), - headers_(other.headers_), - timeout_(other.timeout_), - hasExpectedFormat_(other.hasExpectedFormat_), - expectedFormat_(other.expectedFormat_) - { - } - - public: - GetOrthancImageCommand(); - - virtual Type GetType() const - { - return Type_GetOrthancImage; - } - - virtual IOracleCommand* Clone() const - { - return new GetOrthancImageCommand(*this); - } - - void SetExpectedPixelFormat(Orthanc::PixelFormat format); - - void SetUri(const std::string& uri) - { - uri_ = uri; - } - - void SetInstanceUri(const std::string& instance, - Orthanc::PixelFormat pixelFormat); - - void SetFrameUri(const std::string& instance, - unsigned int frame, - Orthanc::PixelFormat pixelFormat); - - void SetHttpHeader(const std::string& key, - const std::string& value) - { - headers_[key] = value; - } - - const std::string& GetUri() const - { - return uri_; - } - - const HttpHeaders& GetHttpHeaders() const - { - return headers_; - } - - void SetTimeout(unsigned int seconds) - { - timeout_ = seconds; - } - - unsigned int GetTimeout() const - { - return timeout_; - } - - void ProcessHttpAnswer(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const std::string& answer, - const HttpHeaders& answerHeaders) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GetOrthancWebViewerJpegCommand.h" - -#include "../Toolbox/LinearAlgebra.h" - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -// 'Json::Reader': Use CharReader and CharReaderBuilder instead -#pragma warning(disable:4996) -#endif - -#include -#include - -namespace OrthancStone -{ - GetOrthancWebViewerJpegCommand::GetOrthancWebViewerJpegCommand() : - frame_(0), - quality_(95), - timeout_(600), - expectedFormat_(Orthanc::PixelFormat_Grayscale8) - { - } - - - void GetOrthancWebViewerJpegCommand::SetQuality(unsigned int quality) - { - if (quality <= 0 || - quality > 100) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - quality_ = quality; - } - } - - - std::string GetOrthancWebViewerJpegCommand::GetUri() const - { - return ("/web-viewer/instances/jpeg" + boost::lexical_cast(quality_) + - "-" + instanceId_ + "_" + boost::lexical_cast(frame_)); - } - - - void GetOrthancWebViewerJpegCommand::ProcessHttpAnswer(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const std::string& answer) const - { - // This code comes from older "OrthancSlicesLoader::ParseSliceImageJpeg()" - - Json::Value encoded; - - { - Json::Reader reader; - if (!reader.parse(answer, encoded)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - if (encoded.type() != Json::objectValue || - !encoded.isMember("Orthanc") || - encoded["Orthanc"].type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - const Json::Value& info = encoded["Orthanc"]; - if (!info.isMember("PixelData") || - !info.isMember("Stretched") || - !info.isMember("Compression") || - info["Compression"].type() != Json::stringValue || - info["PixelData"].type() != Json::stringValue || - info["Stretched"].type() != Json::booleanValue || - info["Compression"].asString() != "Jpeg") - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - bool isSigned = false; - bool isStretched = info["Stretched"].asBool(); - - if (info.isMember("IsSigned")) - { - if (info["IsSigned"].type() != Json::booleanValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - isSigned = info["IsSigned"].asBool(); - } - } - - std::unique_ptr reader; - - { - std::string jpeg; - Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); - - reader.reset(new Orthanc::JpegReader); - dynamic_cast(*reader).ReadFromMemory(jpeg); - } - - if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image - { - if (expectedFormat_ != Orthanc::PixelFormat_RGB24) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (isSigned || isStretched) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - SuccessMessage message(*this, *reader); - emitter.EmitMessage(receiver, message); - return; - } - } - - if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (!isStretched) - { - if (expectedFormat_ != reader->GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - SuccessMessage message(*this, *reader); - emitter.EmitMessage(receiver, message); - return; - } - } - - int32_t stretchLow = 0; - int32_t stretchHigh = 0; - - if (!info.isMember("StretchLow") || - !info.isMember("StretchHigh") || - info["StretchLow"].type() != Json::intValue || - info["StretchHigh"].type() != Json::intValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - stretchLow = info["StretchLow"].asInt(); - stretchHigh = info["StretchHigh"].asInt(); - - if (stretchLow < -32768 || - stretchHigh > 65535 || - (stretchLow < 0 && stretchHigh > 32767)) - { - // This range cannot be represented with a uint16_t or an int16_t - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - // Decode a grayscale JPEG 8bpp image coming from the Web viewer - std::unique_ptr image - (new Orthanc::Image(expectedFormat_, reader->GetWidth(), reader->GetHeight(), false)); - - Orthanc::ImageProcessing::Convert(*image, *reader); - reader.reset(); - - float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; - - if (!LinearAlgebra::IsCloseToZero(scaling)) - { - float offset = static_cast(stretchLow) / scaling; - Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); - } - - SuccessMessage message(*this, *image); - emitter.EmitMessage(receiver, message); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/GetOrthancWebViewerJpegCommand.h --- a/Framework/Oracle/GetOrthancWebViewerJpegCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessageEmitter.h" -#include "OracleCommandBase.h" - -#include - -#include - -namespace OrthancStone -{ - class GetOrthancWebViewerJpegCommand : public OracleCommandBase - { - public: - typedef std::map HttpHeaders; - - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const Orthanc::ImageAccessor& image_; - - public: - SuccessMessage(const GetOrthancWebViewerJpegCommand& command, - const Orthanc::ImageAccessor& image) : - OriginMessage(command), - image_(image) - { - } - - const Orthanc::ImageAccessor& GetImage() const - { - return image_; - } - }; - - private: - std::string instanceId_; - unsigned int frame_; - unsigned int quality_; - HttpHeaders headers_; - unsigned int timeout_; - Orthanc::PixelFormat expectedFormat_; - - GetOrthancWebViewerJpegCommand(const GetOrthancWebViewerJpegCommand& other) : - instanceId_(other.instanceId_), - frame_(other.frame_), - quality_(other.quality_), - headers_(other.headers_), - timeout_(other.timeout_), - expectedFormat_(other.expectedFormat_) - { - } - - public: - GetOrthancWebViewerJpegCommand(); - - virtual Type GetType() const - { - return Type_GetOrthancWebViewerJpeg; - } - - virtual IOracleCommand* Clone() const - { - return new GetOrthancWebViewerJpegCommand(*this); - } - - void SetExpectedPixelFormat(Orthanc::PixelFormat format) - { - expectedFormat_ = format; - } - - void SetInstance(const std::string& instanceId) - { - instanceId_ = instanceId; - } - - void SetFrame(unsigned int frame) - { - frame_ = frame; - } - - void SetQuality(unsigned int quality); - - void SetHttpHeader(const std::string& key, - const std::string& value) - { - headers_[key] = value; - } - - Orthanc::PixelFormat GetExpectedPixelFormat() const - { - return expectedFormat_; - } - - const std::string& GetInstanceId() const - { - return instanceId_; - } - - unsigned int GetFrame() const - { - return frame_; - } - - unsigned int GetQuality() const - { - return quality_; - } - - const HttpHeaders& GetHttpHeaders() const - { - return headers_; - } - - void SetTimeout(unsigned int seconds) - { - timeout_ = seconds; - } - - unsigned int GetTimeout() const - { - return timeout_; - } - - std::string GetUri() const; - - void ProcessHttpAnswer(boost::weak_ptr receiver, - IMessageEmitter& emitter, - const std::string& answer) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/HttpCommand.cpp --- a/Framework/Oracle/HttpCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "HttpCommand.h" - -#include - -#ifdef _MSC_VER -// 'Json::Reader': Use CharReader and CharReaderBuilder instead -#pragma warning(disable:4996) -#endif - -#include -#include - -namespace OrthancStone -{ - void HttpCommand::SuccessMessage::ParseJsonBody(Json::Value& target) const - { - Json::Reader reader; - if (!reader.parse(answer_, target)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - HttpCommand::HttpCommand() : - method_(Orthanc::HttpMethod_Get), - url_("/"), - timeout_(600) - { - } - - - void HttpCommand::SetBody(const Json::Value& json) - { - Json::FastWriter writer; - body_ = writer.write(json); - } - - - const std::string& HttpCommand::GetBody() const - { - if (method_ == Orthanc::HttpMethod_Post || - method_ == Orthanc::HttpMethod_Put) - { - return body_; - } - else - { - LOG(ERROR) << "HttpCommand::GetBody(): method_ not _Post or _Put"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const std::string& HttpCommand::GetUsername() const - { - if (HasCredentials()) - { - return username_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const std::string& HttpCommand::GetPassword() const - { - if (HasCredentials()) - { - return password_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/HttpCommand.h --- a/Framework/Oracle/HttpCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "OracleCommandBase.h" - -#include - -#include -#include - -namespace OrthancStone -{ - class HttpCommand : public OracleCommandBase - { - public: - typedef std::map HttpHeaders; - - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const HttpHeaders& headers_; - const std::string& answer_; - - public: - SuccessMessage(const HttpCommand& command, - const HttpHeaders& answerHeaders, - const std::string& answer) : - OriginMessage(command), - headers_(answerHeaders), - answer_(answer) - { - } - - const std::string& GetAnswer() const - { - return answer_; - } - - void ParseJsonBody(Json::Value& target) const; - - const HttpHeaders& GetAnswerHeaders() const - { - return headers_; - } - }; - - - private: - Orthanc::HttpMethod method_; - std::string url_; - std::string body_; - HttpHeaders headers_; - unsigned int timeout_; - std::string username_; - std::string password_; - - HttpCommand(const HttpCommand& other) : - method_(other.method_), - url_(other.url_), - body_(other.body_), - headers_(other.headers_), - timeout_(other.timeout_), - username_(other.username_), - password_(other.password_) - { - } - - public: - HttpCommand(); - - virtual Type GetType() const - { - return Type_Http; - } - - virtual IOracleCommand* Clone() const - { - return new HttpCommand(*this); - } - - void SetMethod(Orthanc::HttpMethod method) - { - method_ = method; - } - - void SetUrl(const std::string& url) - { - url_ = url; - } - - void SetBody(const std::string& body) - { - body_ = body; - } - - void SetBody(const Json::Value& json); - - void SwapBody(std::string& body) - { - body_.swap(body); - } - - void SetHttpHeaders(const HttpHeaders& headers) - { - headers_ = headers; - } - - void SetHttpHeader(const std::string& key, - const std::string& value) - { - headers_[key] = value; - } - - Orthanc::HttpMethod GetMethod() const - { - return method_; - } - - const std::string& GetUrl() const - { - return url_; - } - - const std::string& GetBody() const; - - const HttpHeaders& GetHttpHeaders() const - { - return headers_; - } - - void SetTimeout(unsigned int seconds) - { - timeout_ = seconds; - } - - unsigned int GetTimeout() const - { - return timeout_; - } - - void SetCredentials(const std::string& username, - const std::string& password) - { - username_ = username; - password_ = password; - } - - void ClearCredentials() - { - username_.clear(); - password_.clear(); - } - - bool HasCredentials() const - { - return !username_.empty(); - } - - const std::string& GetUsername() const; - - const std::string& GetPassword() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/IOracle.h --- a/Framework/Oracle/IOracle.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IObserver.h" -#include "IOracleCommand.h" - -#include - -namespace OrthancStone -{ - class IOracle : public boost::noncopyable - { - public: - virtual ~IOracle() - { - } - - /** - * Returns "true" iff the command has actually been queued. If - * "false" is returned, the command has been freed, and it won't - * be processed (this is the case if the oracle is stopped). - **/ - virtual bool Schedule(boost::shared_ptr receiver, - IOracleCommand* command) = 0; // Takes ownership - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/IOracleCommand.h --- a/Framework/Oracle/IOracleCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - class IOracleCommand : public boost::noncopyable - { - public: - enum Type - { - Type_GetOrthancImage, - Type_GetOrthancWebViewerJpeg, - Type_Http, - Type_OrthancRestApi, - Type_ParseDicomFromFile, - Type_ParseDicomFromWado, - Type_ReadFile, - Type_Sleep - }; - - virtual ~IOracleCommand() - { - } - - virtual Type GetType() const = 0; - - // This only clones the command, *not* its possibly associated payload - virtual IOracleCommand* Clone() const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/OracleCommandBase.cpp --- a/Framework/Oracle/OracleCommandBase.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OracleCommandBase.h" - -#include - -namespace OrthancStone -{ - void OracleCommandBase::AcquirePayload(Orthanc::IDynamicObject* payload) - { - if (payload == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - payload_.reset(payload); - } - } - - - Orthanc::IDynamicObject& OracleCommandBase::GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - LOG(ERROR) << "OracleCommandBase::GetPayload(): (!HasPayload())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - Orthanc::IDynamicObject* OracleCommandBase::ReleasePayload() - { - if (HasPayload()) - { - return payload_.release(); - } - else - { - LOG(ERROR) << "OracleCommandBase::ReleasePayload(): (!HasPayload())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/OracleCommandBase.h --- a/Framework/Oracle/OracleCommandBase.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOracleCommand.h" - -#include -#include - -#include - -namespace OrthancStone -{ - class OracleCommandBase : public IOracleCommand - { - private: - std::unique_ptr payload_; - - public: - void AcquirePayload(Orthanc::IDynamicObject* payload); - - virtual bool HasPayload() const - { - return (payload_.get() != NULL); - } - - virtual Orthanc::IDynamicObject& GetPayload() const; - - Orthanc::IDynamicObject* ReleasePayload(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/OracleCommandExceptionMessage.h --- a/Framework/Oracle/OracleCommandExceptionMessage.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "IOracleCommand.h" - -#include - -namespace OrthancStone -{ - class OracleCommandExceptionMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - Orthanc::OrthancException exception_; - - public: - OracleCommandExceptionMessage(const IOracleCommand& command, - const Orthanc::ErrorCode& error) : - OriginMessage(command), - exception_(error) - { - } - - OracleCommandExceptionMessage(const IOracleCommand& command, - const Orthanc::OrthancException& exception) : - OriginMessage(command), - exception_(exception) - { - } - - const Orthanc::OrthancException& GetException() const - { - return exception_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/OrthancRestApiCommand.cpp --- a/Framework/Oracle/OrthancRestApiCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrthancRestApiCommand.h" - -#include - -#ifdef _MSC_VER -// 'Json::Reader': Use CharReader and CharReaderBuilder instead -#pragma warning(disable:4996) -#endif - -#include -#include - -namespace OrthancStone -{ - void OrthancRestApiCommand::SuccessMessage::ParseJsonBody(Json::Value& target) const - { - Json::Reader reader; - if (!reader.parse(answer_, target)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - OrthancRestApiCommand::OrthancRestApiCommand() : - method_(Orthanc::HttpMethod_Get), - uri_("/"), - timeout_(600), - applyPlugins_(false) - { - } - - - void OrthancRestApiCommand::SetBody(const Json::Value& json) - { - Json::FastWriter writer; - body_ = writer.write(json); - } - - - const std::string& OrthancRestApiCommand::GetBody() const - { - if (method_ == Orthanc::HttpMethod_Post || - method_ == Orthanc::HttpMethod_Put) - { - return body_; - } - else - { - LOG(ERROR) << "OrthancRestApiCommand::GetBody(): method_ not _Post or _Put"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/OrthancRestApiCommand.h --- a/Framework/Oracle/OrthancRestApiCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,172 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "OracleCommandBase.h" - -#include - -#include -#include - -namespace OrthancStone -{ - class OrthancRestApiCommand : public OracleCommandBase - { - public: - typedef std::map HttpHeaders; - - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const HttpHeaders& headers_; - const std::string& answer_; - - public: - SuccessMessage(const OrthancRestApiCommand& command, - const HttpHeaders& answerHeaders, - const std::string& answer) : - OriginMessage(command), - headers_(answerHeaders), - answer_(answer) - { - } - - const std::string& GetAnswer() const - { - return answer_; - } - - void ParseJsonBody(Json::Value& target) const; - - const HttpHeaders& GetAnswerHeaders() const - { - return headers_; - } - }; - - - private: - Orthanc::HttpMethod method_; - std::string uri_; - std::string body_; - HttpHeaders headers_; - unsigned int timeout_; - bool applyPlugins_; // Only makes sense for Stone as an Orthanc plugin - - OrthancRestApiCommand(const OrthancRestApiCommand& other) : - method_(other.method_), - uri_(other.uri_), - body_(other.body_), - headers_(other.headers_), - timeout_(other.timeout_), - applyPlugins_(other.applyPlugins_) - { - } - - public: - OrthancRestApiCommand(); - - virtual Type GetType() const - { - return Type_OrthancRestApi; - } - - virtual IOracleCommand* Clone() const - { - return new OrthancRestApiCommand(*this); - } - - void SetMethod(Orthanc::HttpMethod method) - { - method_ = method; - } - - void SetUri(const std::string& uri) - { - uri_ = uri; - } - - void SetBody(const std::string& body) - { - body_ = body; - } - - void SetBody(const Json::Value& json); - - void SwapBody(std::string& body) - { - body_.swap(body); - } - - void SetHttpHeaders(const HttpHeaders& headers) - { - headers_ = headers; - } - - void SetHttpHeader(const std::string& key, - const std::string& value) - { - headers_[key] = value; - } - - Orthanc::HttpMethod GetMethod() const - { - return method_; - } - - const std::string& GetUri() const - { - return uri_; - } - - const std::string& GetBody() const; - - const HttpHeaders& GetHttpHeaders() const - { - return headers_; - } - - void SetTimeout(unsigned int seconds) - { - timeout_ = seconds; - } - - unsigned int GetTimeout() const - { - return timeout_; - } - - void SetApplyPlugins(bool applyPlugins) - { - applyPlugins_ = applyPlugins; - } - - bool IsApplyPlugins() const - { - return applyPlugins_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomFromFileCommand.cpp --- a/Framework/Oracle/ParseDicomFromFileCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParseDicomFromFileCommand.h" - -#include - -#include - -namespace OrthancStone -{ - std::string ParseDicomFromFileCommand::GetDicomDirPath(const std::string& dicomDirPath, - const std::string& file) - { - std::string tmp = file; - -#if !defined(_WIN32) - std::replace(tmp.begin(), tmp.end(), '\\', '/'); -#endif - - boost::filesystem::path base = boost::filesystem::path(dicomDirPath).parent_path(); - - return (base / tmp).string(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomFromFileCommand.h --- a/Framework/Oracle/ParseDicomFromFileCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OracleCommandBase.h" -#include "../Loaders/DicomSource.h" - -#include - -namespace OrthancStone -{ - class ParseDicomFromFileCommand : public OracleCommandBase - { - private: - DicomSource source_; - std::string path_; - bool pixelDataIncluded_; - - ParseDicomFromFileCommand(const ParseDicomFromFileCommand& other) : - source_(other.source_), - path_(other.path_), - pixelDataIncluded_(other.pixelDataIncluded_) - { - } - - public: - ParseDicomFromFileCommand(const DicomSource& source, - const std::string& path) : - source_(source), - path_(path), - pixelDataIncluded_(true) - { - } - - ParseDicomFromFileCommand(const DicomSource& source, - const std::string& dicomDirPath, - const std::string& file) : - source_(source), - path_(GetDicomDirPath(dicomDirPath, file)), - pixelDataIncluded_(true) - { - } - - static std::string GetDicomDirPath(const std::string& dicomDirPath, - const std::string& file); - - virtual Type GetType() const - { - return Type_ParseDicomFromFile; - } - - virtual IOracleCommand* Clone() const - { - return new ParseDicomFromFileCommand(*this); - } - - const DicomSource& GetSource() const - { - return source_; - } - - const std::string& GetPath() const - { - return path_; - } - - bool IsPixelDataIncluded() const - { - return pixelDataIncluded_; - } - - void SetPixelDataIncluded(bool included) - { - pixelDataIncluded_ = included; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomFromWadoCommand.cpp --- a/Framework/Oracle/ParseDicomFromWadoCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParseDicomFromWadoCommand.h" - -#include - -namespace OrthancStone -{ - ParseDicomFromWadoCommand::ParseDicomFromWadoCommand(const DicomSource& source, - const std::string& sopInstanceUid, - IOracleCommand* restCommand) : - source_(source), - sopInstanceUid_(sopInstanceUid), - restCommand_(restCommand) - { - if (restCommand == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - if (restCommand_->GetType() != Type_Http && - restCommand_->GetType() != Type_OrthancRestApi) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType); - } - } - - - IOracleCommand* ParseDicomFromWadoCommand::Clone() const - { - assert(restCommand_.get() != NULL); - return new ParseDicomFromWadoCommand(source_, sopInstanceUid_, restCommand_->Clone()); - } - - - const IOracleCommand& ParseDicomFromWadoCommand::GetRestCommand() const - { - assert(restCommand_.get() != NULL); - return *restCommand_; - } - - - ParseDicomFromWadoCommand* ParseDicomFromWadoCommand::Create( - const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const std::string& sopInstanceUid, - bool transcode, - Orthanc::DicomTransferSyntax transferSyntax, - Orthanc::IDynamicObject* payload) - { - std::unique_ptr protection(payload); - - const std::string uri = ("/studies/" + studyInstanceUid + - "/series/" + seriesInstanceUid + - "/instances/" + sopInstanceUid); - - std::string s; - if (transcode) - { - s = Orthanc::GetTransferSyntaxUid(transferSyntax); - } - else - { - s = "*"; // No transcoding, keep source transfer syntax - } - - std::map arguments, headers; - headers["Accept"] = ("multipart/related; type=\"application/dicom\"; transfer-syntax=" + s); - - std::unique_ptr rest( - source.CreateDicomWebCommand(uri, arguments, headers, NULL)); - - std::unique_ptr command( - new ParseDicomFromWadoCommand(source, sopInstanceUid, rest.release())); - - if (protection.get() != NULL) - { - command->AcquirePayload(protection.release()); - } - - return command.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomFromWadoCommand.h --- a/Framework/Oracle/ParseDicomFromWadoCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OracleCommandBase.h" -#include "../Loaders/DicomSource.h" - -#include - -#include - -namespace OrthancStone -{ - class ParseDicomFromWadoCommand : public OracleCommandBase - { - private: - DicomSource source_; - std::string sopInstanceUid_; - std::unique_ptr restCommand_; - - public: - ParseDicomFromWadoCommand(const DicomSource& source, - const std::string& sopInstanceUid, - IOracleCommand* restCommand); - - virtual Type GetType() const - { - return Type_ParseDicomFromWado; - } - - virtual IOracleCommand* Clone() const; - - const DicomSource& GetSource() const - { - return source_; - } - - const std::string& GetSopInstanceUid() const - { - return sopInstanceUid_; - } - - const IOracleCommand& GetRestCommand() const; - - static ParseDicomFromWadoCommand* Create(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const std::string& sopInstanceUid, - bool transcode, - Orthanc::DicomTransferSyntax transferSyntax, - Orthanc::IDynamicObject* payload); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomSuccessMessage.cpp --- a/Framework/Oracle/ParseDicomSuccessMessage.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParseDicomSuccessMessage.h" - -#include -#include -#include - -namespace OrthancStone -{ - class MultipartHandler : public Orthanc::MultipartStreamReader::IHandler - { - private: - std::unique_ptr dicom_; - size_t size_; - - public: - MultipartHandler() : - size_(0) - { - } - - virtual void HandlePart(const std::map& headers, - const void* part, - size_t size) - { - if (dicom_.get()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "Multiple DICOM instances were contained in a WADO-RS request"); - } - else - { - dicom_.reset(new Orthanc::ParsedDicomFile(part, size)); - size_ = size; - } - } - - Orthanc::ParsedDicomFile* ReleaseDicom() - { - if (dicom_.get()) - { - return dicom_.release(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "WADO-RS request didn't contain any DICOM instance"); - } - } - - size_t GetSize() const - { - return size_; - } - }; - - - Orthanc::ParsedDicomFile* ParseDicomSuccessMessage::ParseWadoAnswer( - size_t& fileSize /* OUT */, - const std::string& answer, - const std::map& headers) - { - std::string contentType, subType, boundary, header; - if (Orthanc::MultipartStreamReader::GetMainContentType(header, headers) && - Orthanc::MultipartStreamReader::ParseMultipartContentType(contentType, subType, boundary, header) && - contentType == "multipart/related" && - subType == "application/dicom") - { - MultipartHandler handler; - - { - Orthanc::MultipartStreamReader reader(boundary); - reader.SetHandler(handler); - reader.AddChunk(answer); - reader.CloseStream(); - } - - fileSize = handler.GetSize(); - return handler.ReleaseDicom(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, - "Multipart/related answer of application/dicom was expected from DICOMweb server"); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ParseDicomSuccessMessage.h --- a/Framework/Oracle/ParseDicomSuccessMessage.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#if ORTHANC_ENABLE_DCMTK != 1 -# error Support for DCMTK must be enabled to use ParseDicomFromFileCommand -#endif - -#include "OracleCommandBase.h" -#include "../Messages/IMessageEmitter.h" -#include "../Messages/IObserver.h" - -#include - -namespace Orthanc -{ - class ParsedDicomFile; -} - -namespace OrthancStone -{ - class DicomSource; - - class ParseDicomSuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const DicomSource& source_; - Orthanc::ParsedDicomFile& dicom_; - size_t fileSize_; - bool hasPixelData_; - - public: - ParseDicomSuccessMessage(const OracleCommandBase& command, - const DicomSource& source, - Orthanc::ParsedDicomFile& dicom, - size_t fileSize, - bool hasPixelData) : - OriginMessage(command), - source_(source), - dicom_(dicom), - fileSize_(fileSize), - hasPixelData_(hasPixelData) - { - } - - const DicomSource& GetSource() const - { - return source_; - } - - Orthanc::ParsedDicomFile& GetDicom() const - { - return dicom_; - } - - size_t GetFileSize() const - { - return fileSize_; - } - - bool HasPixelData() const - { - return hasPixelData_; - } - - static Orthanc::ParsedDicomFile* ParseWadoAnswer(size_t& fileSize /* OUT */, - const std::string& answer, - const std::map& headers); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ReadFileCommand.h --- a/Framework/Oracle/ReadFileCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "OracleCommandBase.h" - -namespace OrthancStone -{ - class ReadFileCommand : public OracleCommandBase - { - public: - class SuccessMessage : public OriginMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - private: - const std::string& content_; - - public: - SuccessMessage(const ReadFileCommand& command, - const std::string& content) : - OriginMessage(command), - content_(content) - { - } - - const std::string& GetContent() const - { - return content_; - } - }; - - - private: - std::string path_; - - public: - ReadFileCommand(const std::string& path) : - path_(path) - { - } - - virtual Type GetType() const - { - return Type_ReadFile; - } - - virtual IOracleCommand* Clone() const - { - return new ReadFileCommand(path_); - } - - const std::string& GetPath() const - { - return path_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/SleepOracleCommand.h --- a/Framework/Oracle/SleepOracleCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "OracleCommandBase.h" - -namespace OrthancStone -{ - class SleepOracleCommand : public OracleCommandBase - { - private: - unsigned int milliseconds_; - - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, TimeoutMessage, SleepOracleCommand); - - SleepOracleCommand(unsigned int milliseconds) : - milliseconds_(milliseconds) - { - } - - virtual Type GetType() const - { - return Type_Sleep; - } - - virtual IOracleCommand* Clone() const - { - return new SleepOracleCommand(milliseconds_); - } - - unsigned int GetDelay() const - { - return milliseconds_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ThreadedOracle.cpp --- a/Framework/Oracle/ThreadedOracle.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,433 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ThreadedOracle.h" - -#include "SleepOracleCommand.h" - -#include -#include - -namespace OrthancStone -{ - class ThreadedOracle::Item : public Orthanc::IDynamicObject - { - private: - boost::weak_ptr receiver_; - std::unique_ptr command_; - - public: - Item(boost::weak_ptr receiver, - IOracleCommand* command) : - receiver_(receiver), - command_(command) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - boost::weak_ptr GetReceiver() - { - return receiver_; - } - - IOracleCommand& GetCommand() - { - assert(command_.get() != NULL); - return *command_; - } - }; - - - class ThreadedOracle::SleepingCommands : public boost::noncopyable - { - private: - class Item - { - private: - boost::weak_ptr receiver_; - std::unique_ptr command_; - boost::posix_time::ptime expiration_; - - public: - Item(boost::weak_ptr receiver, - SleepOracleCommand* command) : - receiver_(receiver), - command_(command) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - expiration_ = (boost::posix_time::microsec_clock::local_time() + - boost::posix_time::milliseconds(command_->GetDelay())); - } - - const boost::posix_time::ptime& GetExpirationTime() const - { - return expiration_; - } - - void Awake(IMessageEmitter& emitter) - { - assert(command_.get() != NULL); - - SleepOracleCommand::TimeoutMessage message(*command_); - emitter.EmitMessage(receiver_, message); - } - }; - - typedef std::list Content; - - boost::mutex mutex_; - Content content_; - - public: - ~SleepingCommands() - { - for (Content::iterator it = content_.begin(); it != content_.end(); ++it) - { - if (*it != NULL) - { - delete *it; - } - } - } - - void Add(boost::weak_ptr receiver, - SleepOracleCommand* command) // Takes ownership - { - boost::mutex::scoped_lock lock(mutex_); - - content_.push_back(new Item(receiver, command)); - } - - void AwakeExpired(IMessageEmitter& emitter) - { - boost::mutex::scoped_lock lock(mutex_); - - const boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); - - Content stillSleeping; - - for (Content::iterator it = content_.begin(); it != content_.end(); ++it) - { - if (*it != NULL && - (*it)->GetExpirationTime() <= now) - { - (*it)->Awake(emitter); - delete *it; - *it = NULL; - } - else - { - stillSleeping.push_back(*it); - } - } - - // Compact the still-sleeping commands - content_ = stillSleeping; - } - }; - - - void ThreadedOracle::Step() - { - std::unique_ptr object(queue_.Dequeue(100)); - - if (object.get() != NULL) - { - Item& item = dynamic_cast(*object); - - if (item.GetCommand().GetType() == IOracleCommand::Type_Sleep) - { - SleepOracleCommand& command = dynamic_cast(item.GetCommand()); - - std::unique_ptr copy(new SleepOracleCommand(command.GetDelay())); - - if (command.HasPayload()) - { - copy->AcquirePayload(command.ReleasePayload()); - } - - sleepingCommands_->Add(item.GetReceiver(), copy.release()); - } - else - { - GenericOracleRunner runner; - - { - boost::mutex::scoped_lock lock(mutex_); - runner.SetOrthanc(orthanc_); - runner.SetRootDirectory(rootDirectory_); - -#if ORTHANC_ENABLE_DCMTK == 1 - if (dicomCache_) - { - runner.SetDicomCache(dicomCache_); - } -#endif - } - - runner.Run(item.GetReceiver(), emitter_, item.GetCommand()); - } - } - } - - - void ThreadedOracle::Worker(ThreadedOracle* that) - { - assert(that != NULL); - - for (;;) - { - { - boost::mutex::scoped_lock lock(that->mutex_); - if (that->state_ != State_Running) - { - return; - } - } - - that->Step(); - } - } - - - void ThreadedOracle::SleepingWorker(ThreadedOracle* that) - { - assert(that != NULL); - - for (;;) - { - { - boost::mutex::scoped_lock lock(that->mutex_); - if (that->state_ != State_Running) - { - return; - } - } - - that->sleepingCommands_->AwakeExpired(that->emitter_); - - boost::this_thread::sleep(boost::posix_time::milliseconds(that->sleepingTimeResolution_)); - } - } - - - void ThreadedOracle::StopInternal() - { - { - boost::mutex::scoped_lock lock(mutex_); - - if (state_ == State_Setup || - state_ == State_Stopped) - { - return; - } - else - { - state_ = State_Stopped; - } - } - - if (sleepingWorker_.joinable()) - { - sleepingWorker_.join(); - } - - for (size_t i = 0; i < workers_.size(); i++) - { - if (workers_[i] != NULL) - { - if (workers_[i]->joinable()) - { - workers_[i]->join(); - } - - delete workers_[i]; - } - } - } - - - ThreadedOracle::ThreadedOracle(IMessageEmitter& emitter) : - emitter_(emitter), - rootDirectory_("."), - state_(State_Setup), - workers_(4), - sleepingCommands_(new SleepingCommands), - sleepingTimeResolution_(50) // By default, time resolution of 50ms - { - } - - - ThreadedOracle::~ThreadedOracle() - { - if (state_ == State_Running) - { - LOG(ERROR) << "The threaded oracle is still running, explicit call to " - << "Stop() is mandatory to avoid crashes"; - } - - try - { - StopInternal(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while stopping the threaded oracle: " << e.What(); - } - catch (...) - { - LOG(ERROR) << "Native exception while stopping the threaded oracle"; - } - } - - - void ThreadedOracle::SetOrthancParameters(const Orthanc::WebServiceParameters& orthanc) - { - boost::mutex::scoped_lock lock(mutex_); - orthanc_ = orthanc; - } - - - void ThreadedOracle::SetRootDirectory(const std::string& rootDirectory) - { - boost::mutex::scoped_lock lock(mutex_); - rootDirectory_ = rootDirectory; - } - - - void ThreadedOracle::SetThreadsCount(unsigned int count) - { - boost::mutex::scoped_lock lock(mutex_); - - if (count <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else if (state_ != State_Setup) - { - LOG(ERROR) << "ThreadedOracle::SetThreadsCount(): (state_ != State_Setup)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - workers_.resize(count); - } - } - - - void ThreadedOracle::SetSleepingTimeResolution(unsigned int milliseconds) - { - boost::mutex::scoped_lock lock(mutex_); - - if (milliseconds <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else if (state_ != State_Setup) - { - LOG(ERROR) << "ThreadedOracle::SetSleepingTimeResolution(): (state_ != State_Setup)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - sleepingTimeResolution_ = milliseconds; - } - } - - - void ThreadedOracle::SetDicomCacheSize(size_t size) - { -#if ORTHANC_ENABLE_DCMTK == 1 - boost::mutex::scoped_lock lock(mutex_); - - if (state_ != State_Setup) - { - LOG(ERROR) << "ThreadedOracle::SetDicomCacheSize(): (state_ != State_Setup)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - if (size == 0) - { - dicomCache_.reset(); - } - else - { - dicomCache_.reset(new ParsedDicomCache(size)); - } - } -#endif - } - - - void ThreadedOracle::Start() - { - boost::mutex::scoped_lock lock(mutex_); - - if (state_ != State_Setup) - { - LOG(ERROR) << "ThreadedOracle::Start(): (state_ != State_Setup)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - LOG(INFO) << "Starting oracle with " << workers_.size() << " worker threads"; - state_ = State_Running; - - for (unsigned int i = 0; i < workers_.size(); i++) - { - workers_[i] = new boost::thread(Worker, this); - } - - sleepingWorker_ = boost::thread(SleepingWorker, this); - } - } - - - bool ThreadedOracle::Schedule(boost::shared_ptr receiver, - IOracleCommand* command) - { - std::unique_ptr item(new Item(receiver, command)); - - { - boost::mutex::scoped_lock lock(mutex_); - - if (state_ == State_Running) - { - //LOG(INFO) << "New oracle command queued"; - queue_.Enqueue(item.release()); - return true; - } - else - { - LOG(TRACE) << "Command not enqueued, as the oracle has stopped"; - return false; - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/ThreadedOracle.h --- a/Framework/Oracle/ThreadedOracle.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include // To have the macros properly defined - -#if !defined(ORTHANC_ENABLE_THREADS) -# error The macro ORTHANC_ENABLE_THREADS must be defined -#endif - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#if ORTHANC_ENABLE_THREADS != 1 -# error This file can only compiled for native targets -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "../Toolbox/ParsedDicomCache.h" -#endif - -#include "IOracle.h" -#include "GenericOracleRunner.h" -#include "../Messages/IMessageEmitter.h" - -#include - - -namespace OrthancStone -{ - class ThreadedOracle : public IOracle - { - private: - enum State - { - State_Setup, - State_Running, - State_Stopped - }; - - class Item; - class SleepingCommands; - - IMessageEmitter& emitter_; - Orthanc::WebServiceParameters orthanc_; - std::string rootDirectory_; - Orthanc::SharedMessageQueue queue_; - State state_; - boost::mutex mutex_; - std::vector workers_; - boost::shared_ptr sleepingCommands_; - boost::thread sleepingWorker_; - unsigned int sleepingTimeResolution_; - -#if ORTHANC_ENABLE_DCMTK == 1 - boost::shared_ptr dicomCache_; -#endif - - void Step(); - - static void Worker(ThreadedOracle* that); - - static void SleepingWorker(ThreadedOracle* that); - - void StopInternal(); - - public: - ThreadedOracle(IMessageEmitter& emitter); - - virtual ~ThreadedOracle(); - - void SetOrthancParameters(const Orthanc::WebServiceParameters& orthanc); - - void SetRootDirectory(const std::string& rootDirectory); - - void SetThreadsCount(unsigned int count); - - void SetSleepingTimeResolution(unsigned int milliseconds); - - void SetDicomCacheSize(size_t size); - - void Start(); - - void Stop() - { - StopInternal(); - } - - virtual bool Schedule(boost::shared_ptr receiver, - IOracleCommand* command) ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/WebAssemblyOracle.cpp --- a/Framework/Oracle/WebAssemblyOracle.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,817 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebAssemblyOracle.h" - -#include "OracleCommandExceptionMessage.h" -#include "SleepOracleCommand.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "ParseDicomSuccessMessage.h" -static unsigned int BUCKET_SOP = 1; -#endif - -#include "GetOrthancImageCommand.h" -#include "GetOrthancWebViewerJpegCommand.h" -#include "HttpCommand.h" -#include "OrthancRestApiCommand.h" -#include "ParseDicomFromWadoCommand.h" - -#include -#include - -#include -#include -#include - -namespace OrthancStone -{ - class WebAssemblyOracle::TimeoutContext - { - private: - WebAssemblyOracle& oracle_; - boost::weak_ptr receiver_; - std::unique_ptr command_; - - public: - TimeoutContext(WebAssemblyOracle& oracle, - boost::weak_ptr receiver, - IOracleCommand* command) : - oracle_(oracle), - receiver_(receiver) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - command_.reset(dynamic_cast(command)); - } - } - - void EmitMessage() - { - assert(command_.get() != NULL); - - SleepOracleCommand::TimeoutMessage message(*command_); - oracle_.EmitMessage(receiver_, message); - } - - static void Callback(void *userData) - { - std::unique_ptr context(reinterpret_cast(userData)); - context->EmitMessage(); - } - }; - - - /** - This object is created on the heap for every http request. - It is deleted in the success (or error) callbacks. - - This object references the receiver of the request. Since this is a raw - reference, we need additional checks to make sure we send the response to - the same object, for the object can be deleted and a new one recreated at the - same address (it often happens in the [single-threaded] browser context). - */ - class WebAssemblyOracle::FetchContext : public boost::noncopyable - { - private: - WebAssemblyOracle& oracle_; - boost::weak_ptr receiver_; - std::unique_ptr command_; - std::string expectedContentType_; - - public: - FetchContext(WebAssemblyOracle& oracle, - boost::weak_ptr receiver, - IOracleCommand* command, - const std::string& expectedContentType) : - oracle_(oracle), - receiver_(receiver), - command_(command), - expectedContentType_(expectedContentType) - { - if (Orthanc::Logging::IsTraceLevelEnabled()) - { - // Calling "receiver.lock()" is expensive, hence the quick check if TRACE is enabled - LOG(TRACE) << "WebAssemblyOracle::FetchContext::FetchContext() | " - << "receiver address = " << std::hex << receiver.lock().get(); - } - - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - const std::string& GetExpectedContentType() const - { - return expectedContentType_; - } - - IMessageEmitter& GetEmitter() const - { - return oracle_; - } - - boost::weak_ptr GetReceiver() const - { - return receiver_; - } - - void EmitMessage(const IMessage& message) - { - if (Orthanc::Logging::IsTraceLevelEnabled()) - { - // Calling "receiver_.lock()" is expensive, hence the quick check if TRACE is enabled - LOG(TRACE) << "WebAssemblyOracle::FetchContext::EmitMessage receiver_ = " - << std::hex << receiver_.lock().get() << std::dec; - } - - oracle_.EmitMessage(receiver_, message); - } - - IOracleCommand& GetCommand() const - { - return *command_; - } - - template - const T& GetTypedCommand() const - { - return dynamic_cast(*command_); - } - -#if ORTHANC_ENABLE_DCMTK == 1 - void StoreInCache(const std::string& sopInstanceUid, - std::unique_ptr& dicom, - size_t fileSize) - { - if (oracle_.dicomCache_.get()) - { - // Store it into the cache for future use - oracle_.dicomCache_->Acquire(BUCKET_SOP, sopInstanceUid, - dicom.release(), fileSize, true); - } - } -#endif - - static void SuccessCallback(emscripten_fetch_t *fetch) - { - /** - * Firstly, make a local copy of the fetched information, and - * free data associated with the fetch. - **/ - - if (fetch->userData == NULL) - { - LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback fetch->userData is NULL!!!!!!!"; - return; - } - - std::unique_ptr context(reinterpret_cast(fetch->userData)); - - std::string answer; - if (fetch->numBytes > 0) - { - answer.assign(fetch->data, fetch->numBytes); - } - - - /** - * Retrieving the headers of the HTTP answer. - **/ - HttpHeaders headers; - -#if (__EMSCRIPTEN_major__ < 1 || \ - (__EMSCRIPTEN_major__ == 1 && __EMSCRIPTEN_minor__ < 38) || \ - (__EMSCRIPTEN_major__ == 1 && __EMSCRIPTEN_minor__ == 38 && __EMSCRIPTEN_tiny__ < 37)) -# warning Consider upgrading Emscripten to a version above 1.38.37, incomplete support of Fetch API - - /** - * HACK - If emscripten < 1.38.37, the fetch API does not - * contain a way to retrieve the HTTP headers of the answer. We - * make the assumption that the "Content-Type" header of the - * response is the same as the "Accept" header of the - * query. This is fixed thanks to the - * "emscripten_fetch_get_response_headers()" function that was - * added to "fetch.h" at emscripten-1.38.37 on 2019-06-26. - * - * https://github.com/emscripten-core/emscripten/blob/1.38.37/system/include/emscripten/fetch.h - * https://github.com/emscripten-core/emscripten/pull/8486 - **/ - if (fetch->userData != NULL) - { - if (!context->GetExpectedContentType().empty()) - { - headers["Content-Type"] = context->GetExpectedContentType(); - } - } -#else - { - size_t size = emscripten_fetch_get_response_headers_length(fetch); - - std::string plainHeaders(size + 1, '\0'); - emscripten_fetch_get_response_headers(fetch, &plainHeaders[0], size + 1); - - std::vector tokens; - Orthanc::Toolbox::TokenizeString(tokens, plainHeaders, '\n'); - - for (size_t i = 0; i < tokens.size(); i++) - { - size_t p = tokens[i].find(':'); - if (p != std::string::npos) - { - std::string key = Orthanc::Toolbox::StripSpaces(tokens[i].substr(0, p)); - std::string value = Orthanc::Toolbox::StripSpaces(tokens[i].substr(p + 1)); - headers[key] = value; - } - } - } -#endif - - LOG(TRACE) << "About to call emscripten_fetch_close"; - emscripten_fetch_close(fetch); - LOG(TRACE) << "Successfully called emscripten_fetch_close"; - - /** - * Secondly, use the retrieved data. - * IMPORTANT NOTE: the receiver might be dead. This is prevented - * by the object responsible for zombie check, later on. - **/ - try - { - if (context.get() == NULL) - { - LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback: (context.get() == NULL)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - switch (context->GetCommand().GetType()) - { - case IOracleCommand::Type_Http: - { - HttpCommand::SuccessMessage message(context->GetTypedCommand(), headers, answer); - context->EmitMessage(message); - break; - } - - case IOracleCommand::Type_OrthancRestApi: - { - LOG(TRACE) << "WebAssemblyOracle::FetchContext::SuccessCallback. About to call context->EmitMessage(message);"; - OrthancRestApiCommand::SuccessMessage message - (context->GetTypedCommand(), headers, answer); - context->EmitMessage(message); - break; - } - - case IOracleCommand::Type_GetOrthancImage: - { - context->GetTypedCommand().ProcessHttpAnswer - (context->GetReceiver(), context->GetEmitter(), answer, headers); - break; - } - - case IOracleCommand::Type_GetOrthancWebViewerJpeg: - { - context->GetTypedCommand().ProcessHttpAnswer - (context->GetReceiver(), context->GetEmitter(), answer); - break; - } - - case IOracleCommand::Type_ParseDicomFromWado: - { -#if ORTHANC_ENABLE_DCMTK == 1 - const ParseDicomFromWadoCommand& command = - context->GetTypedCommand(); - - size_t fileSize; - std::unique_ptr dicom - (ParseDicomSuccessMessage::ParseWadoAnswer(fileSize, answer, headers)); - - { - ParseDicomSuccessMessage message(command, command.GetSource(), *dicom, fileSize, true); - context->EmitMessage(message); - } - - context->StoreInCache(command.GetSopInstanceUid(), dicom, fileSize); -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); -#endif - break; - } - - default: - LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle (in SuccessCallback): " - << context->GetCommand().GetType(); - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - catch (Orthanc::OrthancException& e) - { - LOG(INFO) << "Error while processing a fetch answer in the oracle: " << e.What(); - - { - OracleCommandExceptionMessage message(context->GetCommand(), e); - context->EmitMessage(message); - } - } - } - - static void FailureCallback(emscripten_fetch_t *fetch) - { - std::unique_ptr context(reinterpret_cast(fetch->userData)); - - { - const size_t kEmscriptenStatusTextSize = sizeof(emscripten_fetch_t::statusText); - char message[kEmscriptenStatusTextSize + 1]; - memcpy(message, fetch->statusText, kEmscriptenStatusTextSize); - message[kEmscriptenStatusTextSize] = 0; - - /*LOG(ERROR) << "Fetching " << fetch->url - << " failed, HTTP failure status code: " << fetch->status - << " | statusText = " << message - << " | numBytes = " << fetch->numBytes - << " | totalBytes = " << fetch->totalBytes - << " | readyState = " << fetch->readyState;*/ - } - - { - OracleCommandExceptionMessage message - (context->GetCommand(), Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol)); - context->EmitMessage(message); - } - - /** - * TODO - The following code leads to an infinite recursion, at - * least with Firefox running on incognito mode => WHY? - **/ - emscripten_fetch_close(fetch); // Also free data on failure. - } - }; - - - - class WebAssemblyOracle::FetchCommand : public boost::noncopyable - { - private: - WebAssemblyOracle& oracle_; - boost::weak_ptr receiver_; - std::unique_ptr command_; - Orthanc::HttpMethod method_; - std::string url_; - std::string body_; - HttpHeaders headers_; - unsigned int timeout_; - std::string expectedContentType_; - bool hasCredentials_; - std::string username_; - std::string password_; - - public: - FetchCommand(WebAssemblyOracle& oracle, - boost::weak_ptr receiver, - IOracleCommand* command) : - oracle_(oracle), - receiver_(receiver), - command_(command), - method_(Orthanc::HttpMethod_Get), - timeout_(0), - hasCredentials_(false) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - void SetMethod(Orthanc::HttpMethod method) - { - method_ = method; - } - - void SetUrl(const std::string& url) - { - url_ = url; - } - - void SetBody(std::string& body /* will be swapped */) - { - body_.swap(body); - } - - void AddHttpHeaders(const HttpHeaders& headers) - { - for (HttpHeaders::const_iterator it = headers.begin(); it != headers.end(); ++it) - { - headers_[it->first] = it->second; - } - } - - void SetTimeout(unsigned int timeout) - { - timeout_ = timeout; - } - - void SetCredentials(const std::string& username, - const std::string& password) - { - hasCredentials_ = true; - username_ = username; - password_ = password; - } - - void Execute() - { - if (command_.get() == NULL) - { - // Cannot call Execute() twice - LOG(ERROR) << "WebAssemblyOracle::Execute(): (command_.get() == NULL)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - emscripten_fetch_attr_t attr; - emscripten_fetch_attr_init(&attr); - - const char* method; - - switch (method_) - { - case Orthanc::HttpMethod_Get: - method = "GET"; - break; - - case Orthanc::HttpMethod_Post: - method = "POST"; - break; - - case Orthanc::HttpMethod_Delete: - method = "DELETE"; - break; - - case Orthanc::HttpMethod_Put: - method = "PUT"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - strcpy(attr.requestMethod, method); - - attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY | EMSCRIPTEN_FETCH_REPLACE; - attr.onsuccess = FetchContext::SuccessCallback; - attr.onerror = FetchContext::FailureCallback; - attr.timeoutMSecs = timeout_ * 1000; - - if (hasCredentials_) - { - attr.withCredentials = EM_TRUE; - attr.userName = username_.c_str(); - attr.password = password_.c_str(); - } - - std::vector headers; - headers.reserve(2 * headers_.size() + 1); - - std::string expectedContentType; - - for (HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); ++it) - { - std::string key; - Orthanc::Toolbox::ToLowerCase(key, it->first); - - if (key == "accept") - { - expectedContentType = it->second; - } - - if (key != "accept-encoding") // Web browsers forbid the modification of this HTTP header - { - headers.push_back(it->first.c_str()); - headers.push_back(it->second.c_str()); - } - } - - headers.push_back(NULL); // Termination of the array of HTTP headers - - attr.requestHeaders = &headers[0]; - - char* requestData = NULL; - if (!body_.empty()) - requestData = reinterpret_cast(malloc(body_.size())); - - try - { - if (!body_.empty()) - { - memcpy(requestData, &(body_[0]), body_.size()); - attr.requestDataSize = body_.size(); - attr.requestData = requestData; - } - attr.userData = new FetchContext(oracle_, receiver_, command_.release(), expectedContentType); - - // Must be the last call to prevent memory leak on error - emscripten_fetch(&attr, url_.c_str()); - } - catch(...) - { - if(requestData != NULL) - free(requestData); - throw; - } - } - }; - - - void WebAssemblyOracle::SetOrthancUrl(FetchCommand& command, - const std::string& uri) const - { - if (isLocalOrthanc_) - { - command.SetUrl(localOrthancRoot_ + uri); - } - else - { - command.SetUrl(remoteOrthanc_.GetUrl() + uri); - command.AddHttpHeaders(remoteOrthanc_.GetHttpHeaders()); - - if (!remoteOrthanc_.GetUsername().empty()) - { - command.SetCredentials(remoteOrthanc_.GetUsername(), remoteOrthanc_.GetPassword()); - } - } - } - - - void WebAssemblyOracle::Execute(boost::weak_ptr receiver, - HttpCommand* command) - { - FetchCommand fetch(*this, receiver, command); - - fetch.SetMethod(command->GetMethod()); - fetch.SetUrl(command->GetUrl()); - fetch.AddHttpHeaders(command->GetHttpHeaders()); - fetch.SetTimeout(command->GetTimeout()); - - if (command->GetMethod() == Orthanc::HttpMethod_Post || - command->GetMethod() == Orthanc::HttpMethod_Put) - { - std::string body; - command->SwapBody(body); - fetch.SetBody(body); - } - - fetch.Execute(); - } - - - void WebAssemblyOracle::Execute(boost::weak_ptr receiver, - OrthancRestApiCommand* command) - { - try - { - //LOG(TRACE) << "*********** WebAssemblyOracle::Execute."; - //LOG(TRACE) << "WebAssemblyOracle::Execute | command = " << command; - FetchCommand fetch(*this, receiver, command); - - fetch.SetMethod(command->GetMethod()); - SetOrthancUrl(fetch, command->GetUri()); - fetch.AddHttpHeaders(command->GetHttpHeaders()); - fetch.SetTimeout(command->GetTimeout()); - - if (command->GetMethod() == Orthanc::HttpMethod_Post || - command->GetMethod() == Orthanc::HttpMethod_Put) - { - std::string body; - command->SwapBody(body); - fetch.SetBody(body); - } - - fetch.Execute(); - //LOG(TRACE) << "*********** successful end of WebAssemblyOracle::Execute."; - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What(); - } - //LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; - throw; - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in WebAssemblyOracle::Execute: " << e.what(); -// LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; - throw; - } - catch (...) - { - LOG(ERROR) << "Unknown exception in WebAssemblyOracle::Execute"; -// LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; - throw; - } - } - - - void WebAssemblyOracle::Execute(boost::weak_ptr receiver, - GetOrthancImageCommand* command) - { - FetchCommand fetch(*this, receiver, command); - - SetOrthancUrl(fetch, command->GetUri()); - fetch.AddHttpHeaders(command->GetHttpHeaders()); - fetch.SetTimeout(command->GetTimeout()); - - fetch.Execute(); - } - - - void WebAssemblyOracle::Execute(boost::weak_ptr receiver, - GetOrthancWebViewerJpegCommand* command) - { - FetchCommand fetch(*this, receiver, command); - - SetOrthancUrl(fetch, command->GetUri()); - fetch.AddHttpHeaders(command->GetHttpHeaders()); - fetch.SetTimeout(command->GetTimeout()); - - fetch.Execute(); - } - - - void WebAssemblyOracle::Execute(boost::weak_ptr receiver, - ParseDicomFromWadoCommand* command) - { - std::unique_ptr protection(command); - -#if ORTHANC_ENABLE_DCMTK == 1 - if (dicomCache_.get()) - { - ParsedDicomCache::Reader reader(*dicomCache_, BUCKET_SOP, protection->GetSopInstanceUid()); - if (reader.IsValid() && - reader.HasPixelData()) - { - // Reuse the DICOM file from the cache - ParseDicomSuccessMessage message(*protection, protection->GetSource(), reader.GetDicom(), - reader.GetFileSize(), reader.HasPixelData()); - EmitMessage(receiver, message); - return; - } - } -#endif - - switch (command->GetRestCommand().GetType()) - { - case IOracleCommand::Type_Http: - { - const HttpCommand& rest = - dynamic_cast(protection->GetRestCommand()); - - FetchCommand fetch(*this, receiver, protection.release()); - - fetch.SetMethod(rest.GetMethod()); - fetch.SetUrl(rest.GetUrl()); - fetch.AddHttpHeaders(rest.GetHttpHeaders()); - fetch.SetTimeout(rest.GetTimeout()); - - if (rest.GetMethod() == Orthanc::HttpMethod_Post || - rest.GetMethod() == Orthanc::HttpMethod_Put) - { - std::string body = rest.GetBody(); - fetch.SetBody(body); - } - - fetch.Execute(); - break; - } - - case IOracleCommand::Type_OrthancRestApi: - { - const OrthancRestApiCommand& rest = - dynamic_cast(protection->GetRestCommand()); - - FetchCommand fetch(*this, receiver, protection.release()); - - fetch.SetMethod(rest.GetMethod()); - SetOrthancUrl(fetch, rest.GetUri()); - fetch.AddHttpHeaders(rest.GetHttpHeaders()); - fetch.SetTimeout(rest.GetTimeout()); - - if (rest.GetMethod() == Orthanc::HttpMethod_Post || - rest.GetMethod() == Orthanc::HttpMethod_Put) - { - std::string body = rest.GetBody(); - fetch.SetBody(body); - } - - fetch.Execute(); - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - bool WebAssemblyOracle::Schedule(boost::shared_ptr receiver, - IOracleCommand* command) - { - LOG(TRACE) << "WebAssemblyOracle::Schedule : receiver = " - << std::hex << receiver.get(); - - std::unique_ptr protection(command); - - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - switch (command->GetType()) - { - case IOracleCommand::Type_Http: - Execute(receiver, dynamic_cast(protection.release())); - break; - - case IOracleCommand::Type_OrthancRestApi: - Execute(receiver, dynamic_cast(protection.release())); - break; - - case IOracleCommand::Type_GetOrthancImage: - Execute(receiver, dynamic_cast(protection.release())); - break; - - case IOracleCommand::Type_GetOrthancWebViewerJpeg: - break; - - case IOracleCommand::Type_Sleep: - { - unsigned int timeoutMS = dynamic_cast(command)->GetDelay(); - emscripten_set_timeout(TimeoutContext::Callback, timeoutMS, - new TimeoutContext(*this, receiver, protection.release())); - break; - } - - case IOracleCommand::Type_ParseDicomFromWado: -#if ORTHANC_ENABLE_DCMTK == 1 - Execute(receiver, dynamic_cast(protection.release())); -#else - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, - "DCMTK must be enabled to parse DICOM files"); -#endif - break; - - default: - LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle (in Schedule): " - << command->GetType(); - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - return true; - } - - - void WebAssemblyOracle::SetDicomCacheSize(size_t size) - { -#if ORTHANC_ENABLE_DCMTK == 1 - if (size == 0) - { - dicomCache_.reset(); - } - else - { - dicomCache_.reset(new ParsedDicomCache(size)); - } -#else - LOG(INFO) << "DCMTK support is disabled, the DICOM cache is disabled"; -#endif - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Oracle/WebAssemblyOracle.h --- a/Framework/Oracle/WebAssemblyOracle.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_WASM) -# error The macro ORTHANC_ENABLE_WASM must be defined -#endif - -#if ORTHANC_ENABLE_WASM != 1 -# error This file can only compiled for WebAssembly -#endif - -#include "../Messages/IObservable.h" -#include "../Messages/IMessageEmitter.h" -#include "IOracle.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "../Toolbox/ParsedDicomCache.h" -#endif - -#include - -#include - -namespace OrthancStone -{ - class GetOrthancImageCommand; - class GetOrthancWebViewerJpegCommand; - class HttpCommand; - class OrthancRestApiCommand; - class ParseDicomFromWadoCommand; - - class WebAssemblyOracle : - public IOracle, - public IMessageEmitter - { - private: - typedef std::map HttpHeaders; - - class TimeoutContext; - class FetchContext; - class FetchCommand; - - void SetOrthancUrl(FetchCommand& command, - const std::string& uri) const; - - void Execute(boost::weak_ptr receiver, - HttpCommand* command); - - void Execute(boost::weak_ptr receiver, - OrthancRestApiCommand* command); - - void Execute(boost::weak_ptr receiver, - GetOrthancImageCommand* command); - - void Execute(boost::weak_ptr receiver, - GetOrthancWebViewerJpegCommand* command); - - void Execute(boost::weak_ptr receiver, - ParseDicomFromWadoCommand* command); - - IObservable oracleObservable_; - bool isLocalOrthanc_; - std::string localOrthancRoot_; - Orthanc::WebServiceParameters remoteOrthanc_; - -#if ORTHANC_ENABLE_DCMTK == 1 - std::unique_ptr dicomCache_; -#endif - - public: - WebAssemblyOracle() : - isLocalOrthanc_(false) - { - } - - virtual void EmitMessage(boost::weak_ptr observer, - const IMessage& message) ORTHANC_OVERRIDE - { - oracleObservable_.EmitMessage(observer, message); - } - - virtual bool Schedule(boost::shared_ptr receiver, - IOracleCommand* command) ORTHANC_OVERRIDE; - - IObservable& GetOracleObservable() - { - return oracleObservable_; - } - - void SetLocalOrthanc(const std::string& root) - { - isLocalOrthanc_ = true; - localOrthancRoot_ = root; - } - - void SetRemoteOrthanc(const Orthanc::WebServiceParameters& orthanc) - { - isLocalOrthanc_ = false; - remoteOrthanc_ = orthanc; - } - - void SetDicomCacheSize(size_t size); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/OrthancStone.h --- a/Framework/OrthancStone.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -#pragma once - -/** - * Besides the "pragma once" above that only protects this file, - * define a macro to prevent including different versions of - * "OrthancStone.h" - **/ -#ifndef __ORTHANC_STONE_H -#define __ORTHANC_STONE_H - -#include - -#if ORTHANC_ENABLE_OPENGL == 1 -# define GL_GLEXT_PROTOTYPES 1 -#endif - - -#endif /* __ORTHANC_STONE_H */ diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/CairoCompositor.cpp --- a/Framework/Scene2D/CairoCompositor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoCompositor.h" - -#include "Internals/CairoColorTextureRenderer.h" -#include "Internals/CairoFloatTextureRenderer.h" -#include "Internals/CairoInfoPanelRenderer.h" -#include "Internals/CairoLookupTableTextureRenderer.h" -#include "Internals/CairoPolylineRenderer.h" -#include "Internals/CairoTextRenderer.h" - -#include - -namespace OrthancStone -{ - cairo_t* CairoCompositor::GetCairoContext() - { - if (context_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return context_->GetObject(); - } - } - - Internals::CompositorHelper::ILayerRenderer* CairoCompositor::Create(const ISceneLayer& layer) - { - switch (layer.GetType()) - { - case ISceneLayer::Type_Polyline: - return new Internals::CairoPolylineRenderer(*this, layer); - - case ISceneLayer::Type_InfoPanel: - return new Internals::CairoInfoPanelRenderer(*this, layer); - - case ISceneLayer::Type_ColorTexture: - return new Internals::CairoColorTextureRenderer(*this, layer); - - case ISceneLayer::Type_FloatTexture: - return new Internals::CairoFloatTextureRenderer(*this, layer); - - case ISceneLayer::Type_LookupTableTexture: - return new Internals::CairoLookupTableTextureRenderer(*this, layer); - - case ISceneLayer::Type_Text: - { - const TextSceneLayer& l = dynamic_cast(layer); - - Fonts::const_iterator found = fonts_.find(l.GetFontIndex()); - if (found == fonts_.end()) - { - return NULL; - } - else - { - assert(found->second != NULL); - return new Internals::CairoTextRenderer(*this, *found->second, l); - } - } - - default: - return NULL; - } - } - - - CairoCompositor::CairoCompositor(unsigned int canvasWidth, - unsigned int canvasHeight) - { - ResetScene(); - UpdateSize(canvasWidth, canvasHeight); - } - - void CairoCompositor::UpdateSize(unsigned int canvasWidth, - unsigned int canvasHeight) - { - canvas_.SetSize(canvasWidth, canvasHeight, false); - } - - CairoCompositor::~CairoCompositor() - { - for (Fonts::iterator it = fonts_.begin(); it != fonts_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - } - - - void CairoCompositor::SetFont(size_t index, - GlyphBitmapAlphabet* dict) // Takes ownership - { - if (dict == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - std::unique_ptr protection(dict); - - Fonts::iterator found = fonts_.find(index); - - if (found == fonts_.end()) - { - fonts_[index] = protection.release(); - } - else - { - assert(found->second != NULL); - delete found->second; - - found->second = protection.release(); - } - } - } - - -#if ORTHANC_ENABLE_LOCALE == 1 - void CairoCompositor::SetFont(size_t index, - const std::string& ttf, - unsigned int fontSize, - Orthanc::Encoding codepage) - { - FontRenderer renderer; - renderer.LoadFont(ttf, fontSize); - - std::unique_ptr alphabet(new GlyphBitmapAlphabet); - alphabet->LoadCodepage(renderer, codepage); - - SetFont(index, alphabet.release()); - } -#endif - - - void CairoCompositor::Refresh(const Scene2D& scene) - { - context_.reset(new CairoContext(canvas_)); - - // https://www.cairographics.org/FAQ/#clear_a_surface - cairo_set_source_rgba(context_->GetObject(), 0, 0, 0, 255); - cairo_paint(context_->GetObject()); - - helper_->Refresh(scene, canvas_.GetWidth(), canvas_.GetHeight()); - context_.reset(); - } - - - Orthanc::ImageAccessor* CairoCompositor::RenderText(size_t fontIndex, - const std::string& utf8) const - { - Fonts::const_iterator found = fonts_.find(fontIndex); - - if (found == fonts_.end()) - { - return NULL; - } - else - { - assert(found->second != NULL); - return found->second->RenderText(utf8); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/CairoCompositor.h --- a/Framework/Scene2D/CairoCompositor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ICompositor.h" -#include "../Fonts/GlyphBitmapAlphabet.h" -#include "../Wrappers/CairoContext.h" -#include "Internals/CompositorHelper.h" -#include "Internals/ICairoContextProvider.h" - -namespace OrthancStone -{ - class CairoCompositor : - public ICompositor, - private Internals::CompositorHelper::IRendererFactory, - private Internals::ICairoContextProvider - { - private: - typedef std::map Fonts; - - std::unique_ptr helper_; - CairoSurface canvas_; - Fonts fonts_; - - // Only valid during a call to "Refresh()" - std::unique_ptr context_; - - virtual cairo_t* GetCairoContext() ORTHANC_OVERRIDE; - - virtual Internals::CompositorHelper::ILayerRenderer* Create(const ISceneLayer& layer) ORTHANC_OVERRIDE; - - public: - CairoCompositor(unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual ~CairoCompositor(); - - const CairoSurface& GetCanvas() const - { - return canvas_; - } - - virtual void RefreshCanvasSize() ORTHANC_OVERRIDE - { - // The canvas size is constant in Cairo, except if - // "UpdateSize()" is called - } - - virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE - { - return canvas_.GetWidth(); - } - - virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE - { - return canvas_.GetHeight(); - } - - void SetFont(size_t index, - GlyphBitmapAlphabet* dict); // Takes ownership - -#if ORTHANC_ENABLE_LOCALE == 1 - virtual void SetFont(size_t index, - const std::string& ttf, - unsigned int fontSize, - Orthanc::Encoding codepage) ORTHANC_OVERRIDE; -#endif - - virtual void Refresh(const Scene2D& scene) ORTHANC_OVERRIDE; - - virtual void ResetScene() ORTHANC_OVERRIDE - { - helper_.reset(new Internals::CompositorHelper(*this)); - } - - void UpdateSize(unsigned int canvasWidth, - unsigned int canvasHeight); - - Orthanc::ImageAccessor* RenderText(size_t fontIndex, - const std::string& utf8) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Color.h --- a/Framework/Scene2D/Color.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - class Color - { - private: - uint8_t red_; - uint8_t green_; - uint8_t blue_; - - public: - Color() : - red_(255), - green_(255), - blue_(255) - { - } - - Color(uint8_t red, - uint8_t green, - uint8_t blue) : - red_(red), - green_(green), - blue_(blue) - { - } - - uint8_t GetRed() const - { - return red_; - } - - uint8_t GetGreen() const - { - return green_; - } - - uint8_t GetBlue() const - { - return blue_; - } - - float GetRedAsFloat() const - { - return static_cast(red_) / 255.0f; - } - - float GetGreenAsFloat() const - { - return static_cast(green_) / 255.0f; - } - - float GetBlueAsFloat() const - { - return static_cast(blue_) / 255.0f; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ColorSceneLayer.h --- a/Framework/Scene2D/ColorSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ISceneLayer.h" -#include "Color.h" - -#include // For ORTHANC_OVERRIDE - -namespace OrthancStone -{ - // TODO - Is this needed? - class ColorSceneLayer : public ISceneLayer - { - private: - Color color_; - uint64_t revision_; - - protected: - void BumpRevision() - { - // this is *not* thread-safe!!! => (SJO) no problem, Stone assumes mono-threading - revision_++; - } - - public: - ColorSceneLayer() : - revision_(0) - { - } - - virtual uint64_t GetRevision() const ORTHANC_OVERRIDE - { - return revision_; - } - - void SetColor(uint8_t red, - uint8_t green, - uint8_t blue) - { - color_ = Color(red, green, blue); - BumpRevision(); - } - - void SetColor(const Color& color) - { - color_ = color; - BumpRevision(); - } - - const Color& GetColor() const - { - return color_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ColorTextureSceneLayer.cpp --- a/Framework/Scene2D/ColorTextureSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ColorTextureSceneLayer.h" - -#include -#include - - -namespace OrthancStone -{ - ColorTextureSceneLayer::ColorTextureSceneLayer(const Orthanc::ImageAccessor& texture) - { - if (texture.GetFormat() != Orthanc::PixelFormat_Grayscale8 && - texture.GetFormat() != Orthanc::PixelFormat_RGBA32 && - texture.GetFormat() != Orthanc::PixelFormat_RGB24) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - SetTexture(Orthanc::Image::Clone(texture)); - } - - - ISceneLayer* ColorTextureSceneLayer::Clone() const - { - std::unique_ptr cloned(new ColorTextureSceneLayer(GetTexture())); - cloned->CopyParameters(*this); - return cloned.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ColorTextureSceneLayer.h --- a/Framework/Scene2D/ColorTextureSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "TextureBaseSceneLayer.h" - -namespace OrthancStone -{ - class ColorTextureSceneLayer : public TextureBaseSceneLayer - { - public: - // If using RGBA32, premultiplied alpha is assumed - ColorTextureSceneLayer(const Orthanc::ImageAccessor& texture); - - virtual ISceneLayer* Clone() const; - - virtual Type GetType() const - { - return Type_ColorTexture; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/FloatTextureSceneLayer.cpp --- a/Framework/Scene2D/FloatTextureSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "FloatTextureSceneLayer.h" - -#include "../Toolbox/ImageToolbox.h" - -#include -#include -#include - -namespace OrthancStone -{ - FloatTextureSceneLayer::FloatTextureSceneLayer(const Orthanc::ImageAccessor& texture) : - inverted_(false), - applyLog_(false) - { - { - std::unique_ptr t( - new Orthanc::Image(Orthanc::PixelFormat_Float32, - texture.GetWidth(), - texture.GetHeight(), - false)); - - Orthanc::ImageProcessing::Convert(*t, texture); - - SetTexture(t.release()); - } - - SetCustomWindowing(128, 256); - } - - - void FloatTextureSceneLayer::SetWindowing(ImageWindowing windowing) - { - if (windowing_ != windowing) - { - if (windowing == ImageWindowing_Custom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - windowing_ = windowing; - IncrementRevision(); - } - } - } - - void FloatTextureSceneLayer::SetCustomWindowing(float customCenter, - float customWidth) - { - if (customWidth <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - windowing_ = ImageWindowing_Custom; - customCenter_ = customCenter; - customWidth_ = customWidth; - IncrementRevision(); - } - } - - - void FloatTextureSceneLayer::GetWindowing(float& targetCenter, - float& targetWidth) const - { - ::OrthancStone::ComputeWindowing(targetCenter, targetWidth, - windowing_, customCenter_, customWidth_); - } - - - void FloatTextureSceneLayer::SetInverted(bool inverted) - { - inverted_ = inverted; - IncrementRevision(); - } - - - void FloatTextureSceneLayer::SetApplyLog(bool apply) - { - applyLog_ = apply; - IncrementRevision(); - } - - - void FloatTextureSceneLayer::FitRange() - { - float minValue, maxValue; - Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, GetTexture()); - - float width; - - assert(minValue <= maxValue); - if (LinearAlgebra::IsCloseToZero(maxValue - minValue)) - { - width = 1; - } - else - { - width = maxValue - minValue; - } - - SetCustomWindowing((minValue + maxValue) / 2.0f, width); - } - - - ISceneLayer* FloatTextureSceneLayer::Clone() const - { - std::unique_ptr cloned - (new FloatTextureSceneLayer(GetTexture())); - - cloned->CopyParameters(*this); - cloned->windowing_ = windowing_; - cloned->customCenter_ = customCenter_; - cloned->customWidth_ = customWidth_; - cloned->inverted_ = inverted_; - cloned->applyLog_ = applyLog_; - - return cloned.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/FloatTextureSceneLayer.h --- a/Framework/Scene2D/FloatTextureSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "TextureBaseSceneLayer.h" - -namespace OrthancStone -{ - class FloatTextureSceneLayer : public TextureBaseSceneLayer - { - private: - ImageWindowing windowing_; - float customCenter_; - float customWidth_; - bool inverted_; - bool applyLog_; - - public: - // The pixel format must be convertible to "Float32" - FloatTextureSceneLayer(const Orthanc::ImageAccessor& texture); - - void SetWindowing(ImageWindowing windowing); - - void SetCustomWindowing(float customCenter, - float customWidth); - - void GetWindowing(float& targetCenter, - float& targetWidth) const; - - ImageWindowing GetWindowingType() const - { - return windowing_; - } - - // To achieve MONOCHROME1 photometric interpretation - void SetInverted(bool inverted); - - bool IsInverted() const - { - return inverted_; - } - - void FitRange(); - - void SetApplyLog(bool apply); - - bool IsApplyLog() const - { - return applyLog_; - } - - virtual ISceneLayer* Clone() const; - - virtual Type GetType() const - { - return Type_FloatTexture; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/GrayscaleStyleConfigurator.cpp --- a/Framework/Scene2D/GrayscaleStyleConfigurator.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GrayscaleStyleConfigurator.h" - -#include "FloatTextureSceneLayer.h" - -#include - -namespace OrthancStone -{ - GrayscaleStyleConfigurator::GrayscaleStyleConfigurator() : - revision_(0), - linearInterpolation_(false), - hasWindowingOverride_(false), - customWindowWidth_(0), - customWindowCenter_(0), - hasInversionOverride_(false), - inverted_(false), - applyLog_(false) - { - } - - void GrayscaleStyleConfigurator::SetWindowing(ImageWindowing windowing) - { - hasWindowingOverride_ = true; - windowing_ = windowing; - revision_++; - } - - void GrayscaleStyleConfigurator::SetCustomWindowing(float windowCenter, float windowWidth) - { - SetWindowing(ImageWindowing_Custom); - customWindowCenter_ = windowCenter; - customWindowWidth_ = windowWidth; - } - - void GrayscaleStyleConfigurator::GetCustomWindowing(float& windowCenter, float& windowWidth) const - { - windowCenter = customWindowCenter_; - windowWidth = customWindowWidth_; - } - - void GrayscaleStyleConfigurator::SetInverted(bool inverted) - { - hasInversionOverride_ = true; - inverted_ = inverted; - revision_++; - } - - void GrayscaleStyleConfigurator::SetLinearInterpolation(bool enabled) - { - linearInterpolation_ = enabled; - revision_++; - } - - void GrayscaleStyleConfigurator::SetApplyLog(bool apply) - { - applyLog_ = apply; - revision_++; - } - - TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromImage( - const Orthanc::ImageAccessor& image) const - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromDicom( - const Orthanc::ImageAccessor& frame, - const DicomInstanceParameters& parameters) const - { - std::unique_ptr layer(parameters.CreateTexture(frame)); - - if (layer.get() == NULL || - layer->GetTexture().GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - else - { - return layer.release(); - } - } - - void GrayscaleStyleConfigurator::ApplyStyle(ISceneLayer& layer) const - { - FloatTextureSceneLayer& l = dynamic_cast(layer); - - l.SetLinearInterpolation(linearInterpolation_); - - if (hasWindowingOverride_) - { - if (windowing_ != ImageWindowing_Custom) - { - l.SetWindowing(windowing_); - } - else - { - l.SetCustomWindowing(customWindowCenter_, customWindowWidth_); - } - } - - if (hasInversionOverride_) - { - l.SetInverted(inverted_); - } - - l.SetApplyLog(applyLog_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/GrayscaleStyleConfigurator.h --- a/Framework/Scene2D/GrayscaleStyleConfigurator.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerStyleConfigurator.h" - -namespace OrthancStone -{ - /** - Creates layers to display the supplied image in grayscale. No dynamic - style is available. - */ - class GrayscaleStyleConfigurator : public ILayerStyleConfigurator - { - private: - uint64_t revision_; - bool linearInterpolation_; - bool hasWindowingOverride_; - ImageWindowing windowing_; - float customWindowWidth_; - float customWindowCenter_; - bool hasInversionOverride_; - bool inverted_; - bool applyLog_; - - public: - GrayscaleStyleConfigurator(); - - void SetWindowing(ImageWindowing windowing); - - void SetCustomWindowing(float windowCenter, float windowWidth); - - void GetCustomWindowing(float& windowCenter, float& windowWidth) const; - - void SetInverted(bool inverted); - - void SetLinearInterpolation(bool enabled); - - bool IsLinearInterpolation() const - { - return linearInterpolation_; - } - - void SetApplyLog(bool apply); - - bool IsApplyLog() const - { - return applyLog_; - } - - virtual uint64_t GetRevision() const - { - return revision_; - } - - virtual TextureBaseSceneLayer* CreateTextureFromImage( - const Orthanc::ImageAccessor& image) const; - - virtual TextureBaseSceneLayer* CreateTextureFromDicom( - const Orthanc::ImageAccessor& frame, - const DicomInstanceParameters& parameters) const; - - virtual void ApplyStyle(ISceneLayer& layer) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ICompositor.h --- a/Framework/Scene2D/ICompositor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "Scene2D.h" -#include "ScenePoint2D.h" - -namespace OrthancStone -{ - class ICompositor : public boost::noncopyable - { - public: - virtual ~ICompositor() - { - } - - // This function can be expensive (notably in wasm) - virtual void RefreshCanvasSize() = 0; - - virtual unsigned int GetCanvasWidth() const = 0; - - virtual unsigned int GetCanvasHeight() const = 0; - - /** - * WARNING: "Refresh()" must always be called with the same - * scene. If the scene changes, a call to "ResetScene()" must be - * done to reset the tracking of the revisions of the layers. - **/ - virtual void Refresh(const Scene2D& scene) = 0; - - virtual void ResetScene() = 0; - -#if ORTHANC_ENABLE_LOCALE == 1 - virtual void SetFont(size_t index, - const std::string& ttf, - unsigned int fontSize, - Orthanc::Encoding codepage) = 0; -#endif - - // Get the center of the given pixel, in canvas coordinates - ScenePoint2D GetPixelCenterCoordinates(int x, int y) const - { - return ScenePoint2D( - static_cast(x) + 0.5 - static_cast(GetCanvasWidth()) / 2.0, - static_cast(y) + 0.5 - static_cast(GetCanvasHeight()) / 2.0); - } - - void FitContent(Scene2D& scene) const - { - scene.FitContent(GetCanvasWidth(), GetCanvasHeight()); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ILayerStyleConfigurator.h --- a/Framework/Scene2D/ILayerStyleConfigurator.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/DicomInstanceParameters.h" - -namespace OrthancStone -{ - /** - This interface is implemented by objects able to create an ISceneLayer - suitable to display the Orthanc image supplied to the CreateTextureXX - factory methods (taking Dicom parameters into account if relevant). - - It can also refresh the style of an existing layer afterwards, to match - the configurator settings. - */ - class ILayerStyleConfigurator - { - public: - virtual ~ILayerStyleConfigurator() - { - } - - virtual uint64_t GetRevision() const = 0; - - virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const = 0; - - virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, - const DicomInstanceParameters& parameters) const = 0; - - virtual void ApplyStyle(ISceneLayer& layer) const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/IPointerTracker.h --- a/Framework/Scene2D/IPointerTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if 0 - -#include "PointerEvent.h" - -namespace OrthancStone -{ - class IPointerTracker : public boost::noncopyable - { - public: - virtual ~IPointerTracker() - { - } - - /** - This method will be repeatedly called during user interaction - */ - virtual void Update(const PointerEvent& event) = 0; - - /** - This method will be called when the tracker should commit its result - before being destroyed. - */ - virtual void Release() = 0; - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ISceneLayer.h --- a/Framework/Scene2D/ISceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/Extent2D.h" - -#include -#include - -namespace OrthancStone -{ - class ISceneLayer : public boost::noncopyable - { - public: - enum Type - { - Type_NullLayer, - Type_InfoPanel, - Type_ColorTexture, - Type_Polyline, - Type_Text, - Type_FloatTexture, - Type_LookupTableTexture - }; - - virtual ~ISceneLayer() - { - } - - virtual ISceneLayer* Clone() const = 0; - - virtual Type GetType() const = 0; - - virtual bool GetBoundingBox(Extent2D& target) const = 0; - - virtual uint64_t GetRevision() const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/InfoPanelSceneLayer.cpp --- a/Framework/Scene2D/InfoPanelSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "InfoPanelSceneLayer.h" - -#include -#include - -namespace OrthancStone -{ - InfoPanelSceneLayer::InfoPanelSceneLayer(const Orthanc::ImageAccessor& texture, - BitmapAnchor anchor, - bool isLinearInterpolation, - bool applySceneRotation) : - texture_(Orthanc::Image::Clone(texture)), - anchor_(anchor), - isLinearInterpolation_(isLinearInterpolation), - applySceneRotation_(applySceneRotation) - { - if (texture_->GetFormat() != Orthanc::PixelFormat_RGBA32 && - texture_->GetFormat() != Orthanc::PixelFormat_RGB24) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - } - - - void InfoPanelSceneLayer::ComputeAnchorLocation(int& x, - int& y, - BitmapAnchor anchor, - unsigned int textureWidth, - unsigned int textureHeight, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - int tw = static_cast(textureWidth); - int th = static_cast(textureHeight); - int cw = static_cast(canvasWidth); - int ch = static_cast(canvasHeight); - - switch (anchor) - { - case BitmapAnchor_TopLeft: - case BitmapAnchor_CenterLeft: - case BitmapAnchor_BottomLeft: - x = 0; - break; - - case BitmapAnchor_TopCenter: - case BitmapAnchor_Center: - case BitmapAnchor_BottomCenter: - x = (cw - tw) / 2; - break; - - case BitmapAnchor_TopRight: - case BitmapAnchor_CenterRight: - case BitmapAnchor_BottomRight: - x = cw - tw; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - switch (anchor) - { - case BitmapAnchor_TopLeft: - case BitmapAnchor_TopCenter: - case BitmapAnchor_TopRight: - y = 0; - break; - - case BitmapAnchor_CenterLeft: - case BitmapAnchor_Center: - case BitmapAnchor_CenterRight: - y = (ch - th) / 2; - break; - - case BitmapAnchor_BottomLeft: - case BitmapAnchor_BottomCenter: - case BitmapAnchor_BottomRight: - y = ch - th; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/InfoPanelSceneLayer.h --- a/Framework/Scene2D/InfoPanelSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ISceneLayer.h" -#include "../StoneEnumerations.h" - -#include -#include - -#include - -namespace OrthancStone -{ - class InfoPanelSceneLayer : public ISceneLayer - { - private: - std::unique_ptr texture_; - BitmapAnchor anchor_; - bool isLinearInterpolation_; - bool applySceneRotation_; - - public: - /** - * If you supply `true` for `applySceneRotation`, then, in addition to - * a translation to bring it at the desired anchoring location, the image - * will be rotated around its center by the same rotation as the scene - * transformation. - */ - InfoPanelSceneLayer(const Orthanc::ImageAccessor& texture, - BitmapAnchor anchor, - bool isLinearInterpolation, - bool applySceneRotation = false); - - virtual ISceneLayer* Clone() const - { - return new InfoPanelSceneLayer(*texture_, - anchor_, - isLinearInterpolation_, - applySceneRotation_); - } - - const Orthanc::ImageAccessor& GetTexture() const - { - return *texture_; - } - - BitmapAnchor GetAnchor() const - { - return anchor_; - } - - bool ShouldApplySceneRotation() const - { - return applySceneRotation_; - } - - bool IsLinearInterpolation() const - { - return isLinearInterpolation_; - } - - virtual Type GetType() const - { - return Type_InfoPanel; - } - - virtual bool GetBoundingBox(Extent2D& target) const - { - return false; - } - - virtual uint64_t GetRevision() const - { - return 0; - } - - static void ComputeAnchorLocation(int& x, - int& y, - BitmapAnchor anchor, - unsigned int textureWidth, - unsigned int textureHeight, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoBaseRenderer.h --- a/Framework/Scene2D/Internals/CairoBaseRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ICairoContextProvider.h" -#include "CompositorHelper.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class CairoBaseRenderer : public CompositorHelper::ILayerRenderer - { - private: - ICairoContextProvider& target_; - std::unique_ptr layer_; - - protected: - template - const T& GetLayer() const - { - return dynamic_cast(*layer_); - } - - cairo_t* GetCairoContext() const - { - return target_.GetCairoContext(); - } - - public: - CairoBaseRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - target_(target) - { - Update(layer); - } - - virtual void Update(const ISceneLayer& layer) - { - layer_.reset(layer.Clone()); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoColorTextureRenderer.cpp --- a/Framework/Scene2D/Internals/CairoColorTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoColorTextureRenderer.h" - -#include "../ColorTextureSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - CairoColorTextureRenderer::CairoColorTextureRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - target_(target) - { - Update(layer); - } - - - void CairoColorTextureRenderer::Update(const ISceneLayer& layer) - { - const ColorTextureSceneLayer& l = dynamic_cast(layer); - - texture_.Copy(l.GetTexture(), true); - textureTransform_ = l.GetTransform(); - isLinearInterpolation_ = l.IsLinearInterpolation(); - } - - - void CairoColorTextureRenderer::RenderColorTexture(ICairoContextProvider& target, - const AffineTransform2D& transform, - CairoSurface& texture, - const AffineTransform2D& textureTransform, - bool isLinearInterpolation) - { - cairo_t* cr = target.GetCairoContext(); - - AffineTransform2D t = - AffineTransform2D::Combine(transform, textureTransform); - Matrix h = t.GetHomogeneousMatrix(); - - cairo_save(cr); - - cairo_matrix_t m; - cairo_matrix_init(&m, h(0, 0), h(1, 0), h(0, 1), h(1, 1), h(0, 2), h(1, 2)); - cairo_transform(cr, &m); - - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cr, texture.GetObject(), 0, 0); - - if (isLinearInterpolation) - { - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); - } - else - { - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); - } - - cairo_paint(cr); - - cairo_restore(cr); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoColorTextureRenderer.h --- a/Framework/Scene2D/Internals/CairoColorTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoSurface.h" -#include "CompositorHelper.h" -#include "ICairoContextProvider.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoColorTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - ICairoContextProvider& target_; - CairoSurface texture_; - AffineTransform2D textureTransform_; - bool isLinearInterpolation_; - - public: - CairoColorTextureRenderer(ICairoContextProvider& target, - const ISceneLayer& layer); - - virtual void Update(const ISceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - RenderColorTexture(target_, transform, texture_, - textureTransform_, isLinearInterpolation_); - } - - static void RenderColorTexture(ICairoContextProvider& target, - const AffineTransform2D& transform, - CairoSurface& texture, - const AffineTransform2D& textureTransform, - bool isLinearInterpolation); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoFloatTextureRenderer.cpp --- a/Framework/Scene2D/Internals/CairoFloatTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoFloatTextureRenderer.h" - -#include "CairoColorTextureRenderer.h" -#include "../FloatTextureSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - void CairoFloatTextureRenderer::Update(const ISceneLayer& layer) - { - const FloatTextureSceneLayer& l = dynamic_cast(layer); - - textureTransform_ = l.GetTransform(); - isLinearInterpolation_ = l.IsLinearInterpolation(); - - float windowCenter, windowWidth; - l.GetWindowing(windowCenter, windowWidth); - - const float a = windowCenter - windowWidth / 2.0f; - const float slope = 256.0f / windowWidth; - - const Orthanc::ImageAccessor& source = l.GetTexture(); - const unsigned int width = source.GetWidth(); - const unsigned int height = source.GetHeight(); - texture_.SetSize(width, height, false); - - Orthanc::ImageAccessor target; - texture_.GetWriteableAccessor(target); - - assert(source.GetFormat() == Orthanc::PixelFormat_Float32 && - target.GetFormat() == Orthanc::PixelFormat_BGRA32 && - sizeof(float) == 4); - - static const float LOG_NORMALIZATION = 255.0f / log(1.0f + 255.0f); - - for (unsigned int y = 0; y < height; y++) - { - const float* p = reinterpret_cast(source.GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < width; x++) - { - float v = (*p - a) * slope; - if (v <= 0) - { - v = 0; - } - else if (v >= 255) - { - v = 255; - } - - if (l.IsApplyLog()) - { - // https://theailearner.com/2019/01/01/log-transformation/ - v = LOG_NORMALIZATION * log(1.0f + static_cast(v)); - } - - assert(v >= 0.0f && v <= 255.0f); - - uint8_t vv = static_cast(v); - - if (l.IsInverted()) - { - vv = 255 - vv; - } - - q[0] = vv; - q[1] = vv; - q[2] = vv; - - p++; - q += 4; - } - } - } - - - void CairoFloatTextureRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - CairoColorTextureRenderer::RenderColorTexture(target_, transform, texture_, - textureTransform_, isLinearInterpolation_); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoFloatTextureRenderer.h --- a/Framework/Scene2D/Internals/CairoFloatTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoSurface.h" -#include "CompositorHelper.h" -#include "ICairoContextProvider.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoFloatTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - ICairoContextProvider& target_; - CairoSurface texture_; - AffineTransform2D textureTransform_; - bool isLinearInterpolation_; - - public: - CairoFloatTextureRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - target_(target) - { - Update(layer); - } - - virtual void Update(const ISceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoInfoPanelRenderer.cpp --- a/Framework/Scene2D/Internals/CairoInfoPanelRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoInfoPanelRenderer.h" - -#include "../InfoPanelSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - void CairoInfoPanelRenderer::Update(const ISceneLayer& layer) - { - const InfoPanelSceneLayer& l = dynamic_cast(layer); - - texture_.Copy(l.GetTexture(), true); - anchor_ = l.GetAnchor(); - isLinearInterpolation_ = l.IsLinearInterpolation(); - applySceneRotation_ = l.ShouldApplySceneRotation(); - } - - void CairoInfoPanelRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - int dx, dy; - InfoPanelSceneLayer::ComputeAnchorLocation( - dx, dy, anchor_, texture_.GetWidth(), texture_.GetHeight(), - canvasWidth, canvasHeight); - - cairo_t* cr = target_.GetCairoContext(); - cairo_save(cr); - - if (applySceneRotation_) - { - // the transformation is as follows: - // - originally, the image is aligned so that its top left corner - // is at 0,0 - // - first, we translate the image by -w/2,-h/2 - // - then we rotate it, so that the next rotation will make the - // image rotate around its center. - // - then, we translate the image by +w/2,+h/2 to put it - // back in place - // - the fourth and last transform is the one that brings the - // image to its desired anchored location. - - int32_t halfWidth = - static_cast(0.5 * texture_.GetWidth()); - - int32_t halfHeight = - static_cast(0.5 * texture_.GetHeight()); - - AffineTransform2D translation1 = - AffineTransform2D::CreateOffset(-halfWidth, -halfHeight); - - const Matrix& sceneTransformM = transform.GetHomogeneousMatrix(); - Matrix r; - Matrix q; - LinearAlgebra::RQDecomposition3x3(r, q, sceneTransformM); - - // first, put the scene rotation in a cairo matrix - cairo_matrix_t m; - cairo_matrix_init( - &m, q(0, 0), q(1, 0), q(0, 1), q(1, 1), q(0, 2), q(1, 2)); - - // now let's build the transform piece by piece - // first translation (directly written in `transform`) - cairo_matrix_t transform; - cairo_matrix_init_identity(&transform); - cairo_matrix_translate(&transform, -halfWidth, -halfHeight); - - // then the rotation - cairo_matrix_multiply(&transform, &transform, &m); - - // then the second translation - { - cairo_matrix_t translation2; - cairo_matrix_init_translate(&translation2, halfWidth, halfHeight); - cairo_matrix_multiply(&transform, &transform, &m); - } - - // then the last translation - { - cairo_matrix_t translation3; - cairo_matrix_init_translate(&translation3, dx, dy); - cairo_matrix_multiply(&transform, &transform, &translation3); - } - cairo_transform(cr, &transform); - } - else - { - cairo_matrix_t t; - cairo_matrix_init_identity(&t); - cairo_matrix_translate(&t, dx, dy); - cairo_transform(cr, &t); - } - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cr, texture_.GetObject(), 0, 0); - - if (isLinearInterpolation_) - { - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); - } - else - { - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); - } - - cairo_paint(cr); - - cairo_restore(cr); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoInfoPanelRenderer.h --- a/Framework/Scene2D/Internals/CairoInfoPanelRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoSurface.h" -#include "CompositorHelper.h" -#include "ICairoContextProvider.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoInfoPanelRenderer : public CompositorHelper::ILayerRenderer - { - private: - ICairoContextProvider& target_; - CairoSurface texture_; - BitmapAnchor anchor_; - bool isLinearInterpolation_; - bool applySceneRotation_; - - public: - CairoInfoPanelRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - target_(target), - anchor_(BitmapAnchor_TopLeft), - applySceneRotation_(false) - - { - Update(layer); - } - - virtual void Update(const ISceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp --- a/Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoLookupTableTextureRenderer.h" - -#include "CairoColorTextureRenderer.h" -#include "../LookupTableTextureSceneLayer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - void CairoLookupTableTextureRenderer::Update(const ISceneLayer& layer) - { - const LookupTableTextureSceneLayer& l = dynamic_cast(layer); - - textureTransform_ = l.GetTransform(); - isLinearInterpolation_ = l.IsLinearInterpolation(); - - const Orthanc::ImageAccessor& source = l.GetTexture(); - const unsigned int width = source.GetWidth(); - const unsigned int height = source.GetHeight(); - texture_.SetSize(width, height, true /* alpha channel is enabled */); - - Orthanc::ImageAccessor target; - texture_.GetWriteableAccessor(target); - l.Render(target); - - cairo_surface_mark_dirty(texture_.GetObject()); - } - - void CairoLookupTableTextureRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - CairoColorTextureRenderer::RenderColorTexture(target_, transform, texture_, - textureTransform_, isLinearInterpolation_); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.h --- a/Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Wrappers/CairoSurface.h" -#include "CompositorHelper.h" -#include "ICairoContextProvider.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoLookupTableTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - ICairoContextProvider& target_; - CairoSurface texture_; - AffineTransform2D textureTransform_; - bool isLinearInterpolation_; - - public: - CairoLookupTableTextureRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - target_(target) - { - Update(layer); - } - - virtual void Update(const ISceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoPolylineRenderer.cpp --- a/Framework/Scene2D/Internals/CairoPolylineRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoPolylineRenderer.h" - -#include "../PolylineSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - void CairoPolylineRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - const PolylineSceneLayer& layer = GetLayer(); - - cairo_t* cr = GetCairoContext(); - - cairo_set_line_width(cr, layer.GetThickness()); - - for (size_t i = 0; i < layer.GetChainsCount(); i++) - { - const Color& color = layer.GetColor(i); - cairo_set_source_rgb(cr, color.GetRedAsFloat(), - color.GetGreenAsFloat(), - color.GetBlueAsFloat()); - - const PolylineSceneLayer::Chain& chain = layer.GetChain(i); - - if (!chain.empty()) - { - for (size_t j = 0; j < chain.size(); j++) - { - ScenePoint2D p = chain[j].Apply(transform); - - if (j == 0) - { - cairo_move_to(cr, p.GetX(), p.GetY()); - } - else - { - cairo_line_to(cr, p.GetX(), p.GetY()); - } - } - - if (layer.IsClosedChain(i)) - { - ScenePoint2D p = chain[0].Apply(transform); - cairo_line_to(cr, p.GetX(), p.GetY()); - } - } - - cairo_stroke(cr); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoPolylineRenderer.h --- a/Framework/Scene2D/Internals/CairoPolylineRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CairoBaseRenderer.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoPolylineRenderer : public CairoBaseRenderer - { - public: - CairoPolylineRenderer(ICairoContextProvider& target, - const ISceneLayer& layer) : - CairoBaseRenderer(target, layer) - { - } - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoTextRenderer.cpp --- a/Framework/Scene2D/Internals/CairoTextRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoTextRenderer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - CairoTextRenderer::CairoTextRenderer(ICairoContextProvider& target, - const GlyphBitmapAlphabet& alphabet, - const TextSceneLayer& layer) : - CairoBaseRenderer(target, layer) - { - std::unique_ptr source(alphabet.RenderText(layer.GetText())); - - if (source.get() != NULL) - { - text_.SetSize(source->GetWidth(), source->GetHeight(), true); - - Orthanc::ImageAccessor target; - text_.GetWriteableAccessor(target); - - if (source->GetFormat() != Orthanc::PixelFormat_Grayscale8 || - target.GetFormat() != Orthanc::PixelFormat_BGRA32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - const unsigned int width = source->GetWidth(); - const Color& color = layer.GetColor(); - - for (unsigned int y = 0; y < source->GetHeight(); y++) - { - const uint8_t* p = reinterpret_cast(source->GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < width; x++) - { - unsigned int alpha = *p; - - // Premultiplied alpha - q[0] = static_cast((color.GetBlue() * alpha) / 255); - q[1] = static_cast((color.GetGreen() * alpha) / 255); - q[2] = static_cast((color.GetRed() * alpha) / 255); - q[3] = *p; - - p++; - q += 4; - } - } - - cairo_surface_mark_dirty(text_.GetObject()); - } - } - - - void CairoTextRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (text_.GetWidth() != 0 && - text_.GetHeight() != 0) - { - const TextSceneLayer& layer = GetLayer(); - - cairo_t* cr = GetCairoContext(); - cairo_set_source_rgb(cr, layer.GetColor().GetRedAsFloat(), - layer.GetColor().GetGreenAsFloat(), - layer.GetColor().GetBlueAsFloat()); - - double dx, dy; // In pixels - ComputeAnchorTranslation(dx, dy, layer.GetAnchor(), text_.GetWidth(), - text_.GetHeight(), layer.GetBorder()); - - double x = layer.GetX(); - double y = layer.GetY(); - transform.Apply(x, y); - - cairo_save(cr); - - cairo_matrix_t t; - cairo_matrix_init_identity(&t); - cairo_matrix_translate(&t, x + dx, y + dy); - cairo_transform(cr, &t); - - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - cairo_set_source_surface(cr, text_.GetObject(), 0, 0); - cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); - cairo_paint(cr); - - cairo_restore(cr); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CairoTextRenderer.h --- a/Framework/Scene2D/Internals/CairoTextRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Fonts/GlyphBitmapAlphabet.h" -#include "../../Wrappers/CairoSurface.h" -#include "../TextSceneLayer.h" -#include "CairoBaseRenderer.h" - -namespace OrthancStone -{ - namespace Internals - { - class CairoTextRenderer : public CairoBaseRenderer - { - private: - CairoSurface text_; - - public: - CairoTextRenderer(ICairoContextProvider& target, - const GlyphBitmapAlphabet& alphabet, - const TextSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CompositorHelper.cpp --- a/Framework/Scene2D/Internals/CompositorHelper.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CompositorHelper.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class CompositorHelper::Item : public boost::noncopyable - { - private: - std::unique_ptr renderer_; - const ISceneLayer& layer_; - uint64_t layerIdentifier_; - uint64_t lastRevision_; - - public: - Item(ILayerRenderer* renderer, // Takes ownership - const ISceneLayer& layer, - uint64_t layerIdentifier) : - renderer_(renderer), - layer_(layer), - layerIdentifier_(layerIdentifier), - lastRevision_(layer.GetRevision()) - { - if (renderer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - ILayerRenderer& GetRenderer() const - { - assert(renderer_.get() != NULL); - return *renderer_; - } - - const ISceneLayer& GetLayer() const - { - return layer_; - } - - uint64_t GetLayerIdentifier() const - { - return layerIdentifier_; - } - - uint64_t GetLastRevision() const - { - return lastRevision_; - } - - void UpdateRenderer() - { - assert(renderer_.get() != NULL); - renderer_->Update(layer_); - lastRevision_ = layer_.GetRevision(); - } - }; - - - void CompositorHelper::Visit(const Scene2D& scene, - const ISceneLayer& layer, - uint64_t layerIdentifier, - int depth) - { - // "Visit()" is only applied to layers existing in the scene - assert(scene.HasLayer(depth)); - - Content::iterator found = content_.find(depth); - - assert(found == content_.end() || - found->second != NULL); - - if (found == content_.end() || - found->second->GetLayerIdentifier() != layerIdentifier) - { - // This is the first time this layer is rendered, or the layer - // is not the same as before - if (found != content_.end()) - { - delete found->second; - content_.erase(found); - } - - // the returned renderer can be NULL in case of an unknown layer - // or a NullLayer - std::unique_ptr renderer(factory_.Create(layer)); - - if (renderer.get() != NULL) - { - renderer->Render(sceneTransform_, canvasWidth_, canvasHeight_); - content_[depth] = new Item(renderer.release(), layer, layerIdentifier); - } - } - else - { - // This layer has already been rendered - assert(found->second->GetLastRevision() <= layer.GetRevision()); - - if (found->second->GetLastRevision() < layer.GetRevision()) - { - found->second->UpdateRenderer(); - } - - found->second->GetRenderer().Render(sceneTransform_, canvasWidth_, canvasHeight_); - } - - // Check invariants - assert(content_.find(depth) == content_.end() || - (content_[depth]->GetLayerIdentifier() == layerIdentifier && - content_[depth]->GetLastRevision() == layer.GetRevision())); - } - - - CompositorHelper::~CompositorHelper() - { - for (Content::iterator it = content_.begin(); it != content_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - } - - - void CompositorHelper::Refresh(const Scene2D& scene, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - /** - * Safeguard mechanism to enforce the fact that the same scene - * is always used with the compositor. Note that the safeguard - * is not 100% bullet-proof, as a new scene might reuse the same - * address as a previous scene. - **/ - if (lastScene_ != NULL && - lastScene_ != &scene) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "ICompositor::ResetScene() should have been called"); - } - - lastScene_ = &scene; - - // Bring coordinate (0,0) to the center of the canvas - AffineTransform2D offset = AffineTransform2D::CreateOffset( - static_cast(canvasWidth) / 2.0, - static_cast(canvasHeight) / 2.0); - - sceneTransform_ = AffineTransform2D::Combine(offset, scene.GetSceneToCanvasTransform()); - canvasWidth_ = canvasWidth; - canvasHeight_ = canvasHeight; - scene.Apply(*this); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/CompositorHelper.h --- a/Framework/Scene2D/Internals/CompositorHelper.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2D.h" -#include "../ScenePoint2D.h" -#include - -#include - -namespace OrthancStone -{ - namespace Internals - { - class CompositorHelper : protected Scene2D::IVisitor - { - public: - class ILayerRenderer : public boost::noncopyable - { - public: - virtual ~ILayerRenderer() - { - } - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) = 0; - - // "Update()" is only called if the type of the layer has not changed - virtual void Update(const ISceneLayer& layer) = 0; - }; - - class IRendererFactory : public boost::noncopyable - { - public: - virtual ~IRendererFactory() - { - } - - virtual ILayerRenderer* Create(const ISceneLayer& layer) = 0; - }; - - private: - class Item; - - typedef std::map Content; - - IRendererFactory& factory_; - Content content_; - const Scene2D* lastScene_; // This is only a safeguard, don't use it! - - // Only valid during a call to Refresh() - AffineTransform2D sceneTransform_; - unsigned int canvasWidth_; - unsigned int canvasHeight_; - - protected: - virtual void Visit(const Scene2D& scene, - const ISceneLayer& layer, - uint64_t layerIdentifier, - int depth); - - public: - CompositorHelper(IRendererFactory& factory) : - factory_(factory), - lastScene_(NULL) - { - } - - ~CompositorHelper(); - - void Refresh(const Scene2D& scene, - unsigned int canvasWidth, - unsigned int canvasHeight); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/FixedPointAligner.cpp --- a/Framework/Scene2D/Internals/FixedPointAligner.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../../Scene2DViewport/ViewportController.h" -#include "FixedPointAligner.h" - -namespace OrthancStone -{ - namespace Internals - { - FixedPointAligner::FixedPointAligner(boost::shared_ptr viewport, - const ScenePoint2D& p) - : viewport_(viewport) - , canvas_(p) - { - std::unique_ptr lock(viewport_->Lock()); - pivot_ = canvas_.Apply(lock->GetController().GetCanvasToSceneTransform()); - } - - - void FixedPointAligner::Apply() - { - std::unique_ptr lock(viewport_->Lock()); - ScenePoint2D p = canvas_.Apply( - lock->GetController().GetCanvasToSceneTransform()); - - lock->GetController().SetSceneToCanvasTransform( - AffineTransform2D::Combine( - lock->GetController().GetSceneToCanvasTransform(), - AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), - p.GetY() - pivot_.GetY()))); - lock->Invalidate(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/FixedPointAligner.h --- a/Framework/Scene2D/Internals/FixedPointAligner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../../Scene2DViewport/PredeclaredTypes.h" -#include "../../Scene2D/ScenePoint2D.h" -#include "../../Viewport/IViewport.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - // During a mouse event that modifies the view of a scene, keeps - // one point (the pivot) at a fixed position on the canvas - class FixedPointAligner : public boost::noncopyable - { - private: - boost::shared_ptr viewport_; - ScenePoint2D pivot_; - ScenePoint2D canvas_; - - public: - FixedPointAligner(boost::shared_ptr viewport, - const ScenePoint2D& p); - - void Apply(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/ICairoContextProvider.h --- a/Framework/Scene2D/Internals/ICairoContextProvider.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include -#include - -namespace OrthancStone -{ - namespace Internals - { - class ICairoContextProvider : public boost::noncopyable - { - public: - virtual ~ICairoContextProvider() - { - } - - virtual cairo_t* GetCairoContext() = 0; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLAdvancedPolylineRenderer.h" - -#include - - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLAdvancedPolylineRenderer::LoadLayer(const PolylineSceneLayer& layer) - { - data_.reset(new OpenGLLinesProgram::Data(context_, layer)); - - if (data_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - - OpenGLAdvancedPolylineRenderer::OpenGLAdvancedPolylineRenderer(OpenGL::IOpenGLContext& context, - OpenGLLinesProgram& program, - const PolylineSceneLayer& layer) : - context_(context), - program_(program) - { - LoadLayer(layer); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h --- a/Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CompositorHelper.h" -#include "OpenGLLinesProgram.h" - - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLAdvancedPolylineRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLLinesProgram& program_; - std::unique_ptr data_; - - void LoadLayer(const PolylineSceneLayer& layer); - - public: - OpenGLAdvancedPolylineRenderer(OpenGL::IOpenGLContext& context, - OpenGLLinesProgram& program, - const PolylineSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost()) - { - program_.Apply(*data_, transform, true, true); - } - } - - virtual void Update(const ISceneLayer& layer) - { - LoadLayer(dynamic_cast(layer)); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLBasicPolylineRenderer.h" - -#include "../../OpenGL/OpenGLIncludes.h" - -namespace OrthancStone -{ - namespace Internals - { - OpenGLBasicPolylineRenderer::OpenGLBasicPolylineRenderer(OpenGL::IOpenGLContext& context, - const PolylineSceneLayer& layer) : - context_(context) - { - layer_.Copy(layer); - } - - void OpenGLBasicPolylineRenderer::Render(const AffineTransform2D& transform) - { - if (!context_.IsContextLost()) - { - AffineTransform2D t = AffineTransform2D::Combine( - AffineTransform2D::CreateOpenGLClipspace(context_.GetCanvasWidth(), context_.GetCanvasHeight()), - transform); - - glUseProgram(0); - - glBegin(GL_LINES); - - for (size_t i = 0; i < layer_.GetChainsCount(); i++) - { - const Color& color = layer_.GetColor(i); - glColor3ub(color.GetRed(), color.GetGreen(), color.GetBlue()); - - const PolylineSceneLayer::Chain& chain = layer_.GetChain(i); - - if (chain.size() > 1) - { - ScenePoint2D previous = chain[0].Apply(t); - - for (size_t j = 1; j < chain.size(); j++) - { - ScenePoint2D p = chain[j].Apply(t); - - glVertex2f(static_cast(previous.GetX()), - static_cast(previous.GetY())); - glVertex2f(static_cast(p.GetX()), - static_cast(p.GetY())); - - previous = p; - } - - if (layer_.IsClosedChain(i)) - { - ScenePoint2D p = chain[0].Apply(t); - - glVertex2f(static_cast(previous.GetX()), - static_cast(previous.GetY())); - glVertex2f(static_cast(p.GetX()), - static_cast(p.GetY())); - } - } - } - - glEnd(); - } - } - - - void OpenGLBasicPolylineRenderer::Update(const ISceneLayer& layer) - { - layer_.Copy(dynamic_cast(layer)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.h --- a/Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../OpenGL/IOpenGLContext.h" -#include "../PolylineSceneLayer.h" -#include "CompositorHelper.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLBasicPolylineRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - PolylineSceneLayer layer_; - - public: - OpenGLBasicPolylineRenderer(OpenGL::IOpenGLContext& context, - const PolylineSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform); - - virtual void Update(const ISceneLayer& layer); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLColorTextureProgram.cpp --- a/Framework/Scene2D/Internals/OpenGLColorTextureProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLColorTextureProgram.h" -#include "OpenGLShaderVersionDirective.h" - -static const char* FRAGMENT_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "uniform sampler2D u_texture; \n" - "varying vec2 v_texcoord; \n" - "void main() \n" - "{ \n" - " gl_FragColor = texture2D(u_texture, v_texcoord); \n" - "}"; - - -namespace OrthancStone -{ - namespace Internals - { - OpenGLColorTextureProgram::OpenGLColorTextureProgram(OpenGL::IOpenGLContext& context) - : program_(context, FRAGMENT_SHADER) - , context_(context) - { - } - - - void OpenGLColorTextureProgram::Apply(OpenGL::OpenGLTexture& texture, - const AffineTransform2D& transform, - bool useAlpha) - { - if (!context_.IsContextLost()) - { - OpenGLTextureProgram::Execution execution(program_, texture, transform); - - if (useAlpha) - { - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - execution.DrawTriangles(); - glDisable(GL_BLEND); - } - else - { - execution.DrawTriangles(); - } - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLColorTextureProgram.h --- a/Framework/Scene2D/Internals/OpenGLColorTextureProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLTextureProgram.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLColorTextureProgram : public boost::noncopyable - { - public: - OpenGLColorTextureProgram(OpenGL::IOpenGLContext& context); - - void Apply(OpenGL::OpenGLTexture& texture, - const AffineTransform2D& transform, - bool useAlpha); - private: - OpenGLTextureProgram program_; - OpenGL::IOpenGLContext& context_; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLColorTextureRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLColorTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLColorTextureRenderer.h" - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLColorTextureRenderer::LoadTexture(const ColorTextureSceneLayer& layer) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - texture_.reset(new OpenGL::OpenGLTexture(context_)); - texture_->Load(layer.GetTexture(), layer.IsLinearInterpolation()); - layerTransform_ = layer.GetTransform(); - } - } - - - OpenGLColorTextureRenderer::OpenGLColorTextureRenderer(OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const ColorTextureSceneLayer& layer) : - context_(context), - program_(program) - { - LoadTexture(layer); - } - - - void OpenGLColorTextureRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost() && texture_.get() != NULL) - { - program_.Apply(*texture_, AffineTransform2D::Combine(transform, layerTransform_), true); - } - } - - - void OpenGLColorTextureRenderer::Update(const ISceneLayer& layer) - { - // Should never happen (no revisions in color textures) - LoadTexture(dynamic_cast(layer)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLColorTextureRenderer.h --- a/Framework/Scene2D/Internals/OpenGLColorTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLColorTextureProgram.h" -#include "CompositorHelper.h" -#include "../ColorTextureSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLColorTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLColorTextureProgram& program_; - std::unique_ptr texture_; - AffineTransform2D layerTransform_; - - void LoadTexture(const ColorTextureSceneLayer& layer); - - public: - OpenGLColorTextureRenderer(OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const ColorTextureSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual void Update(const ISceneLayer& layer); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLFloatTextureProgram.cpp --- a/Framework/Scene2D/Internals/OpenGLFloatTextureProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLFloatTextureProgram.h" -#include "OpenGLShaderVersionDirective.h" - -#include -#include -#include - - -static const char* FRAGMENT_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "uniform float u_offset; \n" - "uniform float u_slope; \n" - "uniform float u_windowCenter; \n" - "uniform float u_windowWidth; \n" - "uniform bool u_invert; \n" - "uniform sampler2D u_texture; \n" - "varying vec2 v_texcoord; \n" - "void main() \n" - "{ \n" - " vec4 t = texture2D(u_texture, v_texcoord); \n" - " float v = (t.r * 256.0 + t.g) * 256.0; \n" - " v = v * u_slope + u_offset; \n" // (*) - " float a = u_windowCenter - u_windowWidth / 2.0; \n" - " float dy = 1.0 / u_windowWidth; \n" - " if (v <= a) \n" - " v = 0.0; \n" - " else \n" - " { \n" - " v = (v - a) * dy; \n" - " if (v >= 1.0) \n" - " v = 1.0; \n" - " } \n" - " if (u_invert) \n" - " v = 1.0 - v; \n" - " gl_FragColor = vec4(v, v, v, 1); \n" - "}"; - - -namespace OrthancStone -{ - namespace Internals - { - OpenGLFloatTextureProgram::Data::Data( - OpenGL::IOpenGLContext& context - , const Orthanc::ImageAccessor& texture - , bool isLinearInterpolation) - : texture_(context) - , offset_(0.0f) - , slope_(0.0f) - { - if (texture.GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - float minValue, maxValue; - Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, texture); - - offset_ = minValue; - - if (LinearAlgebra::IsCloseToZero(maxValue - minValue)) - { - slope_ = 1; - } - else - { - slope_ = (maxValue - minValue) / 65536.0f; - assert(!LinearAlgebra::IsCloseToZero(slope_)); - } - - const unsigned int width = texture.GetWidth(); - const unsigned int height = texture.GetHeight(); - - Orthanc::Image converted(Orthanc::PixelFormat_RGB24, width, height, true); - - for (unsigned int y = 0; y < height; y++) - { - const float *p = reinterpret_cast(texture.GetConstRow(y)); - uint8_t *q = reinterpret_cast(converted.GetRow(y)); - - for (unsigned int x = 0; x < width; x++) - { - /** - * At (*), the floating-point "value" is reconstructed as - * "value = texture * slope + offset". - * <=> texture = (value - offset) / slope - **/ - - float texture = (*p - offset_) / slope_; - if (texture < 0) - { - texture = 0; - } - else if (texture >= 65535.0f) - { - texture = 65535.0f; - } - - uint16_t t = static_cast(texture); - - q[0] = t / 256; // red - q[1] = t % 256; // green - q[2] = 0; // blue is unused - - p++; - q += 3; - } - } - - texture_.Load(converted, isLinearInterpolation); - } - - - OpenGLFloatTextureProgram::OpenGLFloatTextureProgram(OpenGL::IOpenGLContext& context) - : program_(context, FRAGMENT_SHADER) - , context_(context) - { - } - - - void OpenGLFloatTextureProgram::Apply(Data& data, - const AffineTransform2D& transform, - float windowCenter, - float windowWidth, - bool invert) - { - if (!context_.IsContextLost()) - { - OpenGLTextureProgram::Execution execution(program_, data.GetTexture(), transform); - - glUniform1f(execution.GetUniformLocation("u_slope"), data.GetSlope()); - glUniform1f(execution.GetUniformLocation("u_offset"), data.GetOffset()); - glUniform1f(execution.GetUniformLocation("u_windowCenter"), windowCenter); - glUniform1f(execution.GetUniformLocation("u_windowWidth"), windowWidth); - glUniform1f(execution.GetUniformLocation("u_invert"), invert); - - execution.DrawTriangles(); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLFloatTextureProgram.h --- a/Framework/Scene2D/Internals/OpenGLFloatTextureProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLTextureProgram.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLFloatTextureProgram : public boost::noncopyable - { - public: - class Data : public boost::noncopyable - { - private: - OpenGL::OpenGLTexture texture_; - float offset_; - float slope_; - - public: - Data(OpenGL::IOpenGLContext& context, const Orthanc::ImageAccessor& texture, - bool isLinearInterpolation); - - float GetOffset() const - { - return offset_; - } - - float GetSlope() const - { - return slope_; - } - - OpenGL::OpenGLTexture& GetTexture() - { - return texture_; - } - }; - - public: - OpenGLFloatTextureProgram(OpenGL::IOpenGLContext& context); - - void Apply(Data& data, - const AffineTransform2D& transform, - float windowCenter, - float windowWidth, - bool invert); - private: - OpenGLTextureProgram program_; - OpenGL::IOpenGLContext& context_; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLFloatTextureRenderer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLFloatTextureRenderer::UpdateInternal(const FloatTextureSceneLayer& layer, - bool loadTexture) - { - if (!context_.IsContextLost()) - { - if (loadTexture) - { - if (layer.IsApplyLog()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - context_.MakeCurrent(); - texture_.reset(new OpenGLFloatTextureProgram::Data( - context_, layer.GetTexture(), layer.IsLinearInterpolation())); - } - - layerTransform_ = layer.GetTransform(); - layer.GetWindowing(windowCenter_, windowWidth_); - invert_ = layer.IsInverted(); - } - } - - - OpenGLFloatTextureRenderer::OpenGLFloatTextureRenderer(OpenGL::IOpenGLContext& context, - OpenGLFloatTextureProgram& program, - const FloatTextureSceneLayer& layer) : - context_(context), - program_(program) - { - UpdateInternal(layer, true); - } - - - void OpenGLFloatTextureRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost() && texture_.get() != NULL) - { - program_.Apply(*texture_, AffineTransform2D::Combine(transform, layerTransform_), - windowCenter_, windowWidth_, invert_); - } - } - - - void OpenGLFloatTextureRenderer::Update(const ISceneLayer& layer) - { - UpdateInternal(dynamic_cast(layer), false); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.h --- a/Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CompositorHelper.h" -#include "OpenGLFloatTextureProgram.h" -#include "../FloatTextureSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLFloatTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLFloatTextureProgram& program_; - std::unique_ptr texture_; - AffineTransform2D layerTransform_; - float windowCenter_; - float windowWidth_; - bool invert_; - - void UpdateInternal(const FloatTextureSceneLayer& layer, - bool loadTexture); - - public: - OpenGLFloatTextureRenderer(OpenGL::IOpenGLContext& context, - OpenGLFloatTextureProgram& program, - const FloatTextureSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual void Update(const ISceneLayer& layer); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLInfoPanelRenderer.h" - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLInfoPanelRenderer::LoadTexture(const InfoPanelSceneLayer& layer) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - texture_.reset(new OpenGL::OpenGLTexture(context_)); - texture_->Load(layer.GetTexture(), layer.IsLinearInterpolation()); - applySceneRotation_ = layer.ShouldApplySceneRotation(); - anchor_ = layer.GetAnchor(); - } - } - - OpenGLInfoPanelRenderer::OpenGLInfoPanelRenderer(OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const InfoPanelSceneLayer& layer) : - context_(context), - program_(program), - anchor_(BitmapAnchor_TopLeft), - applySceneRotation_(false) - { - LoadTexture(layer); - } - - void OpenGLInfoPanelRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost() && texture_.get() != NULL) - { - int dx = 0, dy = 0; - InfoPanelSceneLayer::ComputeAnchorLocation( - dx, dy, anchor_, texture_->GetWidth(), texture_->GetHeight(), - canvasWidth, canvasHeight); - - // The position of this type of layer is layer: Ignore the - // "transform" coming from the scene - AffineTransform2D actualTransform = - AffineTransform2D::CreateOffset(dx, dy); - - if (applySceneRotation_) - { - // the transformation is as follows: - // - originally, the image is aligned so that its top left corner - // is at 0,0 - // - first, we translate the image by -w/2,-h/2 - // - then we rotate it, so that the next rotation will make the - // image rotate around its center. - // - then, we translate the image by +w/2,+h/2 to put it - // back in place - // - the fourth and last transform is the one that brings the - // image to its desired anchored location. - - int32_t halfWidth = - static_cast(0.5 * texture_->GetWidth()); - - int32_t halfHeight= - static_cast(0.5 * texture_->GetHeight()); - - AffineTransform2D translation1 = - AffineTransform2D::CreateOffset(-halfWidth, -halfHeight); - - const Matrix& sceneTransformM = transform.GetHomogeneousMatrix(); - Matrix r; - Matrix q; - LinearAlgebra::RQDecomposition3x3(r, q, sceneTransformM); - - // counterintuitively, q is the rotation and r is the upper - // triangular - AffineTransform2D rotation(q); - - AffineTransform2D translation2 = - AffineTransform2D::CreateOffset(halfWidth, halfHeight); - - // please note that the last argument is the 1st applied - // transformation (rationale: if arguments are a, b and c, then - // the resulting matrix is a*b*c: - // x2 = (a*b*c)*x1 = (a*(b*(c*x1))) (you can see that the result - // of c*x1 is transformed by b, and the result of b*c*x1 is trans- - // formed by a) - actualTransform = AffineTransform2D::Combine(actualTransform, - translation2, - rotation, - translation1); - } - - program_.Apply(*texture_, actualTransform, true); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.h --- a/Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CompositorHelper.h" -#include "OpenGLColorTextureProgram.h" -#include "../InfoPanelSceneLayer.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLInfoPanelRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLColorTextureProgram& program_; - std::unique_ptr texture_; - BitmapAnchor anchor_; - bool applySceneRotation_; - - void LoadTexture(const InfoPanelSceneLayer& layer); - - public: - OpenGLInfoPanelRenderer(OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const InfoPanelSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual void Update(const ISceneLayer& layer) - { - LoadTexture(dynamic_cast(layer)); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLLinesProgram.cpp --- a/Framework/Scene2D/Internals/OpenGLLinesProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,511 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLLinesProgram.h" -#include "OpenGLShaderVersionDirective.h" - -#include - - -static const unsigned int COMPONENTS_POSITION = 3; -static const unsigned int COMPONENTS_COLOR = 3; -static const unsigned int COMPONENTS_MITER = 2; - - -static const char* VERTEX_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "attribute vec2 a_miter_direction; \n" - "attribute vec4 a_position; \n" - "attribute vec3 a_color; \n" - "uniform float u_thickness; \n" - "uniform mat4 u_matrix; \n" - "varying float v_distance; \n" - "varying vec3 v_color; \n" - "void main() \n" - "{ \n" - " v_distance = a_position.z; \n" - " v_color = a_color; \n" - " gl_Position = u_matrix * vec4(a_position.xy + a_position.z * a_miter_direction * u_thickness, 0, 1); \n" - "}"; - - -static const char* FRAGMENT_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "uniform bool u_antialiasing; \n" - "uniform float u_antialiasing_start; \n" - "varying float v_distance; \n" // Distance of the point to the segment - "varying vec3 v_color; \n" - "void main() \n" - "{ \n" - " float d = abs(v_distance); \n" - " if (!u_antialiasing || \n" - " d <= u_antialiasing_start) \n" - " gl_FragColor = vec4(v_color, 1); \n" - " else if (d >= 1.0) \n" - " gl_FragColor = vec4(0, 0, 0, 0); \n" - " else \n" - " { \n" - " float alpha = 1.0 - smoothstep(u_antialiasing_start, 1.0, d); \n" - " gl_FragColor = vec4(v_color * alpha, alpha); \n" - " } \n" - "}"; - - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLLinesProgram::Data::Segment - { - private: - bool isEmpty_; - double x1_; - double y1_; - double x2_; - double y2_; - double miterX1_; - double miterY1_; - double miterX2_; - double miterY2_; - - Vector lineAbove_; // In homogeneous coordinates (size = 3) - Vector lineBelow_; - - public: - Segment(const PolylineSceneLayer::Chain& chain, - size_t index1, - size_t index2) : - isEmpty_(false) - { - if (index1 >= chain.size() || - index2 >= chain.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - const ScenePoint2D& p = chain[index1]; - const ScenePoint2D& q = chain[index2]; - - x1_ = p.GetX(); - y1_ = p.GetY(); - x2_ = q.GetX(); - y2_ = q.GetY(); - - const double dx = x2_ - x1_; - const double dy = y2_ - y1_; - const double norm = sqrt(dx * dx + dy * dy); - - if (LinearAlgebra::IsCloseToZero(norm)) - { - isEmpty_ = true; - } - else - { - isEmpty_ = false; - const double normalX = -dy / norm; - const double normalY = dx / norm; - - miterX1_ = normalX; - miterY1_ = normalY; - miterX2_ = normalX; - miterY2_ = normalY; - - Vector a = LinearAlgebra::CreateVector(x1_ + normalX, y1_ + normalY, 1); - Vector b = LinearAlgebra::CreateVector(x2_ + normalX, y2_ + normalY, 1); - LinearAlgebra::CrossProduct(lineAbove_, a, b); - - a = LinearAlgebra::CreateVector(x1_ - normalX, y1_ - normalY, 1); - b = LinearAlgebra::CreateVector(x2_ - normalX, y2_ - normalY, 1); - LinearAlgebra::CrossProduct(lineBelow_, a, b); - } - } - } - - bool IsEmpty() const - { - return isEmpty_; - } - - static double ComputeSignedArea(double x1, - double y1, - double x2, - double y2, - double x3, - double y3) - { - // This computes the signed area of a 2D triangle. This - // formula is e.g. used in the sorting algorithm of Graham's - // scan to compute the convex hull. - // https://en.wikipedia.org/wiki/Graham_scan - return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1); - } - - static void CreateMiter(Segment& left, - Segment& right) - { - if (!left.IsEmpty() && - !right.IsEmpty()) - { - Vector above, below; - LinearAlgebra::CrossProduct(above, left.lineAbove_, right.lineAbove_); - LinearAlgebra::CrossProduct(below, left.lineBelow_, right.lineBelow_); - - if (!LinearAlgebra::IsCloseToZero(above[2]) && - !LinearAlgebra::IsCloseToZero(below[2])) - { - // Back to inhomogeneous 2D coordinates - above /= above[2]; - below /= below[2]; - - // Check whether "above" and "below" intersection points - // are on the half-plane defined by the endpoints of the - // two segments. This is an indicator of whether the angle - // is too acute. - double s1 = ComputeSignedArea(left.x1_, left.y1_, - above[0], above[1], - right.x2_, right.y2_); - double s2 = ComputeSignedArea(left.x1_, left.y1_, - below[0], below[1], - right.x2_, right.y2_); - - // The two signed areas must have the same sign - if (s1 * s2 >= 0) - { - left.miterX2_ = above[0] - left.x2_; - left.miterY2_ = above[1] - left.y2_; - - right.miterX1_ = left.miterX2_; - right.miterY1_ = left.miterY2_; - } - } - } - } - - void AddTriangles(std::vector& coords, - std::vector& miterDirections, - std::vector& colors, - const Color& color) - { - if (isEmpty_) - { - LOG(ERROR) << "OpenGLLinesProgram -- AddTriangles: (isEmpty_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - // First triangle - coords.push_back(static_cast(x1_)); - coords.push_back(static_cast(y1_)); - coords.push_back(static_cast(1)); - coords.push_back(static_cast(x2_)); - coords.push_back(static_cast(y2_)); - coords.push_back(static_cast(-1)); - coords.push_back(static_cast(x2_)); - coords.push_back(static_cast(y2_)); - coords.push_back(static_cast(1)); - - miterDirections.push_back(static_cast(miterX1_)); - miterDirections.push_back(static_cast(miterY1_)); - miterDirections.push_back(static_cast(miterX2_)); - miterDirections.push_back(static_cast(miterY2_)); - miterDirections.push_back(static_cast(miterX2_)); - miterDirections.push_back(static_cast(miterY2_)); - - // Second triangle - coords.push_back(static_cast(x1_)); - coords.push_back(static_cast(y1_)); - coords.push_back(static_cast(1)); - coords.push_back(static_cast(x1_)); - coords.push_back(static_cast(y1_)); - coords.push_back(static_cast(-1)); - coords.push_back(static_cast(x2_)); - coords.push_back(static_cast(y2_)); - coords.push_back(static_cast(-1)); - - miterDirections.push_back(static_cast(miterX1_)); - miterDirections.push_back(static_cast(miterY1_)); - miterDirections.push_back(static_cast(miterX1_)); - miterDirections.push_back(static_cast(miterY1_)); - miterDirections.push_back(static_cast(miterX2_)); - miterDirections.push_back(static_cast(miterY2_)); - - // Add the colors of the 2 triangles (leading to 2 * 3 values) - for (unsigned int i = 0; i < 6; i++) - { - colors.push_back(color.GetRedAsFloat()); - colors.push_back(color.GetGreenAsFloat()); - colors.push_back(color.GetBlueAsFloat()); - } - } - }; - - - OpenGLLinesProgram::Data::Data(OpenGL::IOpenGLContext& context, - const PolylineSceneLayer& layer) : - context_(context), - verticesCount_(0), - thickness_(static_cast(layer.GetThickness())) - { - if (!context_.IsContextLost()) - { - // High-level reference: - // https://mattdesl.svbtle.com/drawing-lines-is-hard - // https://forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shader - - size_t countVertices = 0; - for (size_t i = 0; i < layer.GetChainsCount(); i++) - { - size_t countSegments = layer.GetChain(i).size() - 1; - - if (layer.IsClosedChain(i)) - { - countSegments++; - } - - // Each segment is made of 2 triangles. One triangle is - // defined by 3 points in 2D => 6 vertices per segment. - countVertices += countSegments * 2 * 3; - } - - std::vector coords, colors, miterDirections; - coords.reserve(countVertices * COMPONENTS_POSITION); - colors.reserve(countVertices * COMPONENTS_COLOR); - miterDirections.reserve(countVertices * COMPONENTS_MITER); - - for (size_t i = 0; i < layer.GetChainsCount(); i++) - { - const PolylineSceneLayer::Chain& chain = layer.GetChain(i); - - if (chain.size() > 1) - { - std::vector segments; - for (size_t j = 1; j < chain.size(); j++) - { - segments.push_back(Segment(chain, j - 1, j)); - } - - if (layer.IsClosedChain(i)) - { - segments.push_back(Segment(chain, chain.size() - 1, 0)); - } - - // Try and create nice miters - for (size_t j = 1; j < segments.size(); j++) - { - Segment::CreateMiter(segments[j - 1], segments[j]); - } - - if (layer.IsClosedChain(i)) - { - Segment::CreateMiter(segments.back(), segments.front()); - } - - for (size_t j = 0; j < segments.size(); j++) - { - if (!segments[j].IsEmpty()) - { - segments[j].AddTriangles(coords, miterDirections, colors, layer.GetColor(i)); - } - } - } - } - - assert(coords.size() == colors.size()); - - if (!coords.empty()) - { - verticesCount_ = coords.size() / COMPONENTS_POSITION; - - context_.MakeCurrent(); - glGenBuffers(3, buffers_); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coords.size(), &coords[0], GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * miterDirections.size(), &miterDirections[0], GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[2]); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * colors.size(), &colors[0], GL_STATIC_DRAW); - } - } - } - - - OpenGLLinesProgram::Data::~Data() - { - if (!context_.IsContextLost() && !IsEmpty()) - { - context_.MakeCurrent(); - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteBuffers"); - glDeleteBuffers(3, buffers_); - } - } - - GLuint OpenGLLinesProgram::Data::GetVerticesBuffer() const - { - if (IsEmpty()) - { - LOG(ERROR) << "OpenGLLinesProgram::Data::GetVerticesBuffer(): (IsEmpty())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return buffers_[0]; - } - } - - - GLuint OpenGLLinesProgram::Data::GetMiterDirectionsBuffer() const - { - if (IsEmpty()) - { - LOG(ERROR) << "OpenGLLinesProgram::Data::GetMiterDirectionsBuffer(): (IsEmpty())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return buffers_[1]; - } - } - - - GLuint OpenGLLinesProgram::Data::GetColorsBuffer() const - { - if (IsEmpty()) - { - LOG(ERROR) << "OpenGLLinesProgram::Data::GetColorsBuffer(): (IsEmpty())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return buffers_[2]; - } - } - - - OpenGLLinesProgram::OpenGLLinesProgram(OpenGL::IOpenGLContext& context) : - context_(context) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - program_.reset(new OpenGL::OpenGLProgram(context_)); - program_->CompileShaders(VERTEX_SHADER, FRAGMENT_SHADER); - } - } - - void OpenGLLinesProgram::Apply(const Data& data, - const AffineTransform2D& transform, - bool antialiasing, - bool scaleIndependantThickness) - { - if (!context_.IsContextLost() && !data.IsEmpty()) - { - context_.MakeCurrent(); - program_->Use(); - - GLint locationPosition = program_->GetAttributeLocation("a_position"); - GLint locationMiterDirection = program_->GetAttributeLocation("a_miter_direction"); - GLint locationColor = program_->GetAttributeLocation("a_color"); - - float m[16]; - transform.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); - - glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); - - glBindBuffer(GL_ARRAY_BUFFER, data.GetVerticesBuffer()); - glEnableVertexAttribArray(locationPosition); - glVertexAttribPointer(locationPosition, COMPONENTS_POSITION, GL_FLOAT, GL_FALSE, 0, 0); - - glBindBuffer(GL_ARRAY_BUFFER, data.GetMiterDirectionsBuffer()); - glEnableVertexAttribArray(locationMiterDirection); - glVertexAttribPointer(locationMiterDirection, COMPONENTS_MITER, GL_FLOAT, GL_FALSE, 0, 0); - - glBindBuffer(GL_ARRAY_BUFFER, data.GetColorsBuffer()); - glEnableVertexAttribArray(locationColor); - glVertexAttribPointer(locationColor, COMPONENTS_COLOR, GL_FLOAT, GL_FALSE, 0, 0); - - glUniform1i(program_->GetUniformLocation("u_antialiasing"), (antialiasing ? 1 : 0)); - - const double zoom = transform.ComputeZoom(); - const double thickness = data.GetThickness() / 2.0; - const double aliasingBorder = 2.0; // Border for antialiasing ramp, in pixels - assert(aliasingBorder > 0); // Prevent division by zero with "t1" - - if (scaleIndependantThickness) - { - if (antialiasing) - { - double t1 = std::max(thickness, aliasingBorder); - double t0 = std::max(0.0, thickness - aliasingBorder); - - glUniform1f(program_->GetUniformLocation("u_thickness"), - static_cast(t1 / zoom)); - glUniform1f(program_->GetUniformLocation("u_antialiasing_start"), - static_cast(t0 / t1)); - } - else - { - glUniform1f(program_->GetUniformLocation("u_thickness"), - static_cast(thickness / zoom)); - } - } - else - { - if (antialiasing) - { - double t1 = std::max(thickness, aliasingBorder / zoom); - double t0 = std::max(0.0, thickness - aliasingBorder / zoom); - - glUniform1f(program_->GetUniformLocation("u_thickness"), - static_cast(t1)); - glUniform1f(program_->GetUniformLocation("u_antialiasing_start"), - static_cast(t0 / t1)); - } - else - { - glUniform1f(program_->GetUniformLocation("u_thickness"), - static_cast(thickness)); - } - } - - if (antialiasing) - { - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - glDrawArrays(GL_TRIANGLES, 0, - static_cast(data.GetVerticesCount())); - glDisable(GL_BLEND); - } - else - { - glDrawArrays(GL_TRIANGLES, 0, - static_cast(data.GetVerticesCount())); - } - - glDisableVertexAttribArray(locationPosition); - glDisableVertexAttribArray(locationMiterDirection); - glDisableVertexAttribArray(locationColor); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLLinesProgram.h --- a/Framework/Scene2D/Internals/OpenGLLinesProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../OpenGL/IOpenGLContext.h" -#include "../../OpenGL/OpenGLProgram.h" -#include "../../Toolbox/AffineTransform2D.h" -#include "../PolylineSceneLayer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLLinesProgram : public boost::noncopyable - { - public: - class Data : public boost::noncopyable - { - private: - class Segment; - - OpenGL::IOpenGLContext& context_; - GLuint buffers_[3]; - size_t verticesCount_; - float thickness_; - - public: - Data(OpenGL::IOpenGLContext& context, - const PolylineSceneLayer& layer); - - ~Data(); - - bool IsEmpty() const - { - return verticesCount_ == 0; - } - - const size_t GetVerticesCount() const - { - return verticesCount_; - } - - GLuint GetVerticesBuffer() const; - - GLuint GetMiterDirectionsBuffer() const; - - GLuint GetColorsBuffer() const; - - float GetThickness() const - { - return thickness_; - } - }; - - private: - OpenGL::IOpenGLContext& context_; - std::unique_ptr program_; - - public: - OpenGLLinesProgram(OpenGL::IOpenGLContext& context); - - void Apply(const Data& data, - const AffineTransform2D& transform, - bool antialiasing, - bool scaleIndependantThickness); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLLookupTableTextureRenderer.h" - -#include "../../Toolbox/ImageToolbox.h" - - -#include - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLLookupTableTextureRenderer::LoadTexture( - const LookupTableTextureSceneLayer& layer) - { - if (!context_.IsContextLost()) - { - const Orthanc::ImageAccessor& source = layer.GetTexture(); - const unsigned int width = source.GetWidth(); - const unsigned int height = source.GetHeight(); - - if (texture_.get() == NULL || - texture_->GetWidth() != width || - texture_->GetHeight() != height) - { - texture_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, width, height, false)); - } - - layer.Render(*texture_); - - context_.MakeCurrent(); - glTexture_.reset(new OpenGL::OpenGLTexture(context_)); - glTexture_->Load(*texture_, layer.IsLinearInterpolation()); - layerTransform_ = layer.GetTransform(); - } - } - - OpenGLLookupTableTextureRenderer::OpenGLLookupTableTextureRenderer( - OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const LookupTableTextureSceneLayer& layer) - : context_(context) - , program_(program) - { - LoadTexture(layer); - } - - - void OpenGLLookupTableTextureRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost() && glTexture_.get() != NULL) - { - program_.Apply( - *glTexture_, - AffineTransform2D::Combine(transform, layerTransform_), - true); - } - } - - - void OpenGLLookupTableTextureRenderer::Update(const ISceneLayer& layer) - { - // Should never happen (no revisions in color textures) - LoadTexture(dynamic_cast(layer)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h --- a/Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OpenGLColorTextureProgram.h" -#include "CompositorHelper.h" -#include "../LookupTableTextureSceneLayer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLLookupTableTextureRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLColorTextureProgram& program_; - std::unique_ptr glTexture_; - std::unique_ptr texture_; - AffineTransform2D layerTransform_; - - void LoadTexture(const LookupTableTextureSceneLayer& layer); - - public: - OpenGLLookupTableTextureRenderer( - OpenGL::IOpenGLContext& context, - OpenGLColorTextureProgram& program, - const LookupTableTextureSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual void Update(const ISceneLayer& layer); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLShaderVersionDirective.h --- a/Framework/Scene2D/Internals/OpenGLShaderVersionDirective.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_WASM == 1 -// https://emscripten.org/docs/optimizing/Optimizing-WebGL.html -# define ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE "precision mediump float;\n" -#else -# define ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE "#version 110\n" -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextProgram.cpp --- a/Framework/Scene2D/Internals/OpenGLTextProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,229 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLTextProgram.h" -#include "OpenGLShaderVersionDirective.h" - -#include "../../Fonts/OpenGLTextCoordinates.h" - -#include - - -static const unsigned int COMPONENTS = 2; - -static const char* VERTEX_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "attribute vec2 a_texcoord; \n" - "attribute vec4 a_position; \n" - "uniform mat4 u_matrix; \n" - "varying vec2 v_texcoord; \n" - "void main() \n" - "{ \n" - " gl_Position = u_matrix * a_position; \n" - " v_texcoord = a_texcoord; \n" - "}"; - -static const char* FRAGMENT_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "uniform sampler2D u_texture; \n" - "uniform vec3 u_color; \n" - "varying vec2 v_texcoord; \n" - "void main() \n" - "{ \n" - " vec4 v = texture2D(u_texture, v_texcoord); \n" - " gl_FragColor = vec4(u_color * v.w, v.w); \n" // Premultiplied alpha - "}"; - - -namespace OrthancStone -{ - namespace Internals - { - OpenGLTextProgram::OpenGLTextProgram(OpenGL::IOpenGLContext& context) : - context_(context) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - - program_.reset(new OpenGL::OpenGLProgram(context_)); - program_->CompileShaders(VERTEX_SHADER, FRAGMENT_SHADER); - - positionLocation_ = program_->GetAttributeLocation("a_position"); - textureLocation_ = program_->GetAttributeLocation("a_texcoord"); - } - } - - - OpenGLTextProgram::Data::Data(OpenGL::IOpenGLContext& context, - const GlyphTextureAlphabet& alphabet, - const TextSceneLayer& layer) : - context_(context), - red_(layer.GetColor().GetRedAsFloat()), - green_(layer.GetColor().GetGreenAsFloat()), - blue_(layer.GetColor().GetBlueAsFloat()), - x_(layer.GetX()), - y_(layer.GetY()), - border_(layer.GetBorder()), - anchor_(layer.GetAnchor()) - { - OpenGL::OpenGLTextCoordinates coordinates(alphabet, layer.GetText()); - textWidth_ = coordinates.GetTextWidth(); - textHeight_ = coordinates.GetTextHeight(); - - if (coordinates.IsEmpty()) - { - coordinatesCount_ = 0; - } - else - { - coordinatesCount_ = coordinates.GetRenderingCoords().size(); - - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - glGenBuffers(2, buffers_); - ORTHANC_OPENGL_CHECK("glGenBuffers"); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); - ORTHANC_OPENGL_CHECK("glBindBuffer"); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coordinatesCount_, - &coordinates.GetRenderingCoords()[0], GL_STATIC_DRAW); - ORTHANC_OPENGL_CHECK("glBufferData"); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); - ORTHANC_OPENGL_CHECK("glBindBuffer"); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coordinatesCount_, - &coordinates.GetTextureCoords()[0], GL_STATIC_DRAW); - ORTHANC_OPENGL_CHECK("glBufferData"); - } - } - } - - - OpenGLTextProgram::Data::~Data() - { - if (!context_.IsContextLost() && !IsEmpty()) - { - try - { - context_.MakeCurrent(); - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteBuffers"); - glDeleteBuffers(2, buffers_); - ORTHANC_OPENGL_CHECK("glDeleteBuffers"); - } - catch (const Orthanc::OrthancException& e) - { - if (e.HasDetails()) - { - LOG(ERROR) << "OrthancException in ~Data: " << e.What() << " Details: " << e.GetDetails(); - } - else - { - LOG(ERROR) << "OrthancException in ~Data: " << e.What(); - } - } - catch (const std::exception& e) - { - LOG(ERROR) << "std::exception in ~Data: " << e.what(); - } - catch (...) - { - LOG(ERROR) << "Unknown exception in ~Data"; - } - } - } - - - GLuint OpenGLTextProgram::Data::GetSceneLocationsBuffer() const - { - if (IsEmpty()) - { - LOG(ERROR) << "OpenGLTextProgram::Data::GetSceneLocationsBuffer(): (IsEmpty())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return buffers_[0]; - } - } - - GLuint OpenGLTextProgram::Data::GetTextureLocationsBuffer() const - { - if (IsEmpty()) - { - LOG(ERROR) << "OpenGLTextProgram::Data::GetTextureLocationsBuffer(): (IsEmpty())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return buffers_[1]; - } - } - - void OpenGLTextProgram::Apply(OpenGL::OpenGLTexture& fontTexture, - const Data& data, - const AffineTransform2D& transform) - { - if (!context_.IsContextLost() && !data.IsEmpty()) - { - context_.MakeCurrent(); - program_->Use(); - - double dx, dy; // In pixels - ComputeAnchorTranslation(dx, dy, data.GetAnchor(), - data.GetTextWidth(), data.GetTextHeight(), - static_cast(data.GetBorder())); - - double x = data.GetX(); - double y = data.GetY(); - transform.Apply(x, y); - - const AffineTransform2D t = AffineTransform2D::CreateOffset(x + dx, y + dy); - - float m[16]; - t.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); - - fontTexture.Bind(program_->GetUniformLocation("u_texture")); - glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); - glUniform3f(program_->GetUniformLocation("u_color"), - data.GetRed(), data.GetGreen(), data.GetBlue()); - - glBindBuffer(GL_ARRAY_BUFFER, data.GetSceneLocationsBuffer()); - glEnableVertexAttribArray(positionLocation_); - glVertexAttribPointer(positionLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); - - glBindBuffer(GL_ARRAY_BUFFER, data.GetTextureLocationsBuffer()); - glEnableVertexAttribArray(textureLocation_); - glVertexAttribPointer(textureLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); - - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - glDrawArrays(GL_TRIANGLES, 0, - static_cast(data.GetCoordinatesCount() / COMPONENTS)); - glDisable(GL_BLEND); - - glDisableVertexAttribArray(positionLocation_); - glDisableVertexAttribArray(textureLocation_); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextProgram.h --- a/Framework/Scene2D/Internals/OpenGLTextProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Fonts/GlyphTextureAlphabet.h" -#include "../../OpenGL/IOpenGLContext.h" -#include "../../OpenGL/OpenGLProgram.h" -#include "../../OpenGL/OpenGLTexture.h" -#include "../../Toolbox/AffineTransform2D.h" -#include "../TextSceneLayer.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLTextProgram : public boost::noncopyable - { - public: - class Data : public boost::noncopyable - { - private: - OpenGL::IOpenGLContext& context_; - size_t coordinatesCount_; - GLuint buffers_[2]; - float red_; - float green_; - float blue_; - double x_; - double y_; - double border_; - unsigned int textWidth_; - unsigned int textHeight_; - BitmapAnchor anchor_; - - public: - Data(OpenGL::IOpenGLContext& context, - const GlyphTextureAlphabet& alphabet, - const TextSceneLayer& layer); - - ~Data(); - - bool IsEmpty() const - { - return coordinatesCount_ == 0; - } - - size_t GetCoordinatesCount() const - { - return coordinatesCount_; - } - - GLuint GetSceneLocationsBuffer() const; - - GLuint GetTextureLocationsBuffer() const; - - float GetRed() const - { - return red_; - } - - float GetGreen() const - { - return green_; - } - - float GetBlue() const - { - return blue_; - } - - double GetX() const - { - return x_; - } - - double GetY() const - { - return y_; - } - - double GetBorder() const - { - return border_; - } - - unsigned int GetTextWidth() const - { - return textWidth_; - } - - unsigned int GetTextHeight() const - { - return textHeight_; - } - - BitmapAnchor GetAnchor() const - { - return anchor_; - } - }; - - private: - OpenGL::IOpenGLContext& context_; - std::unique_ptr program_; - GLint positionLocation_; - GLint textureLocation_; - - public: - OpenGLTextProgram(OpenGL::IOpenGLContext& context); - - void Apply(OpenGL::OpenGLTexture& fontTexture, - const Data& data, - const AffineTransform2D& transform); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextRenderer.cpp --- a/Framework/Scene2D/Internals/OpenGLTextRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLTextRenderer.h" - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLTextRenderer::LoadLayer(const TextSceneLayer& layer) - { - if (!context_.IsContextLost()) - data_.reset(new OpenGLTextProgram::Data(context_, alphabet_, layer)); - else - data_.reset(NULL); - } - - - OpenGLTextRenderer::OpenGLTextRenderer(OpenGL::IOpenGLContext& context, - OpenGLTextProgram& program, - const GlyphTextureAlphabet& alphabet, - OpenGL::OpenGLTexture& texture, - const TextSceneLayer& layer) : - context_(context), - program_(program), - alphabet_(alphabet), - texture_(texture) - { - LoadLayer(layer); - } - - - void OpenGLTextRenderer::Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - if (!context_.IsContextLost() && data_.get() != NULL) - { - program_.Apply(texture_, *data_, transform); - } - } - - void OpenGLTextRenderer::Update(const ISceneLayer& layer) - { - LoadLayer(dynamic_cast(layer)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextRenderer.h --- a/Framework/Scene2D/Internals/OpenGLTextRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CompositorHelper.h" -#include "OpenGLTextProgram.h" - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLTextRenderer : public CompositorHelper::ILayerRenderer - { - private: - OpenGL::IOpenGLContext& context_; - OpenGLTextProgram& program_; - const GlyphTextureAlphabet& alphabet_; - OpenGL::OpenGLTexture& texture_; - std::unique_ptr data_; - - void LoadLayer(const TextSceneLayer& layer); - - public: - OpenGLTextRenderer(OpenGL::IOpenGLContext& context, - OpenGLTextProgram& program, - const GlyphTextureAlphabet& alphabet, - OpenGL::OpenGLTexture& texture, - const TextSceneLayer& layer); - - virtual void Render(const AffineTransform2D& transform, - unsigned int canvasWidth, - unsigned int canvasHeight); - - virtual void Update(const ISceneLayer& layer); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextureProgram.cpp --- a/Framework/Scene2D/Internals/OpenGLTextureProgram.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OpenGLTextureProgram.h" -#include "OpenGLShaderVersionDirective.h" - -#include - -static const unsigned int COMPONENTS = 2; -static const unsigned int COUNT = 6; // 2 triangles in 2D - -static const char* VERTEX_SHADER = - ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE - "attribute vec2 a_texcoord; \n" - "attribute vec4 a_position; \n" - "uniform mat4 u_matrix; \n" - "varying vec2 v_texcoord; \n" - "void main() \n" - "{ \n" - " gl_Position = u_matrix * a_position; \n" - " v_texcoord = a_texcoord; \n" - "}"; - - -namespace OrthancStone -{ - namespace Internals - { - void OpenGLTextureProgram::InitializeExecution(OpenGL::OpenGLTexture& texture, - const AffineTransform2D& transform) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - program_->Use(); - - AffineTransform2D scale = AffineTransform2D::CreateScaling - (texture.GetWidth(), texture.GetHeight()); - - AffineTransform2D t = AffineTransform2D::Combine(transform, scale); - - float m[16]; - t.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); - - texture.Bind(program_->GetUniformLocation("u_texture")); - glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); - glEnableVertexAttribArray(positionLocation_); - glVertexAttribPointer(positionLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); - glEnableVertexAttribArray(textureLocation_); - glVertexAttribPointer(textureLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); - } - } - - void OpenGLTextureProgram::FinalizeExecution() - { - if (!context_.IsContextLost()) - { - glDisableVertexAttribArray(positionLocation_); - glDisableVertexAttribArray(textureLocation_); - } - } - - OpenGLTextureProgram::OpenGLTextureProgram(OpenGL::IOpenGLContext& context, - const char* fragmentShader) : - context_(context) - { - static const float POSITIONS[COMPONENTS * COUNT] = { - 0, 0, - 0, 1, - 1, 0, - 1, 0, - 0, 1, - 1, 1 - }; - - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); - - program_.reset(new OpenGL::OpenGLProgram(context_)); - program_->CompileShaders(VERTEX_SHADER, fragmentShader); - - positionLocation_ = program_->GetAttributeLocation("a_position"); - textureLocation_ = program_->GetAttributeLocation("a_texcoord"); - - glGenBuffers(2, buffers_); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * COMPONENTS * COUNT, POSITIONS, GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); - glBufferData(GL_ARRAY_BUFFER, sizeof(float) * COMPONENTS * COUNT, POSITIONS, GL_STATIC_DRAW); - } - } - - OpenGLTextureProgram::~OpenGLTextureProgram() - { - if (!context_.IsContextLost()) - { - ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("OpenGLTextureProgram::~OpenGLTextureProgram() | About to call glDeleteBuffers"); - context_.MakeCurrent(); - glDeleteBuffers(2, buffers_); - } - } - - - void OpenGLTextureProgram::Execution::DrawTriangles() - { - if (!that_.context_.IsContextLost()) - { - glDrawArrays(GL_TRIANGLES, 0, COUNT); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Internals/OpenGLTextureProgram.h --- a/Framework/Scene2D/Internals/OpenGLTextureProgram.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../OpenGL/IOpenGLContext.h" -#include "../../OpenGL/OpenGLProgram.h" -#include "../../OpenGL/OpenGLTexture.h" -#include "../../Toolbox/AffineTransform2D.h" - -#include - -namespace OrthancStone -{ - namespace Internals - { - class OpenGLTextureProgram : public boost::noncopyable - { - private: - OpenGL::IOpenGLContext& context_; - std::unique_ptr program_; - GLint positionLocation_; - GLint textureLocation_; - GLuint buffers_[2]; - - void InitializeExecution(OpenGL::OpenGLTexture& texture, - const AffineTransform2D& transform); - - void FinalizeExecution(); - - public: - OpenGLTextureProgram(OpenGL::IOpenGLContext& context, - const char* fragmentShader); - - ~OpenGLTextureProgram(); - - class Execution : public boost::noncopyable - { - private: - OpenGLTextureProgram& that_; - - public: - Execution(OpenGLTextureProgram& that, - OpenGL::OpenGLTexture& texture, - const AffineTransform2D& transform) : - that_(that) - { - that_.InitializeExecution(texture, transform); - } - - ~Execution() - { - that_.FinalizeExecution(); - } - - void DrawTriangles(); - - GLint GetUniformLocation(const std::string& name) - { - return that_.program_->GetUniformLocation(name); - } - }; - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/LookupTableStyleConfigurator.cpp --- a/Framework/Scene2D/LookupTableStyleConfigurator.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LookupTableStyleConfigurator.h" - -#include - -namespace OrthancStone -{ - static void StringToVector(std::vector& target, - const std::string& source) - { - target.resize(source.size()); - - for (size_t i = 0; i < source.size(); i++) - { - target[i] = source[i]; - } - } - - LookupTableStyleConfigurator::LookupTableStyleConfigurator() : - revision_(0), - hasLut_(false), - hasRange_(false), - applyLog_(false) - { - } - - void LookupTableStyleConfigurator::SetLookupTable(const std::vector& lut) - { - hasLut_ = true; - lut_ = lut; - revision_++; - } - - void LookupTableStyleConfigurator::SetLookupTable(const std::string& lut) - { - std::vector tmp; - StringToVector(tmp, lut); - SetLookupTable(tmp); - } - - void LookupTableStyleConfigurator::SetRange(float minValue, - float maxValue) - { - if (minValue > maxValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - if ((!hasRange_) || (minValue_ != minValue) || (maxValue_ != maxValue)) - revision_++; - hasRange_ = true; - minValue_ = minValue; - maxValue_ = maxValue; - } - } - - void LookupTableStyleConfigurator::SetApplyLog(bool apply) - { - applyLog_ = apply; - revision_++; - } - - TextureBaseSceneLayer* LookupTableStyleConfigurator::CreateTextureFromImage(const Orthanc::ImageAccessor& image) const - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - void LookupTableStyleConfigurator::ApplyStyle(ISceneLayer& layer) const - { - LookupTableTextureSceneLayer& l = dynamic_cast(layer); - - if (hasLut_) - { - l.SetLookupTable(lut_); - } - - if (hasRange_) - { - l.SetRange(minValue_, maxValue_); - } - else - { - l.FitRange(); - } - - l.SetApplyLog(applyLog_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/LookupTableStyleConfigurator.h --- a/Framework/Scene2D/LookupTableStyleConfigurator.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ILayerStyleConfigurator.h" - -namespace OrthancStone -{ - /** - This configurator supplies an API to set a display range and a LUT. - */ - class LookupTableStyleConfigurator : public ILayerStyleConfigurator - { - private: - uint64_t revision_; - bool hasLut_; - std::vector lut_; - bool hasRange_; - float minValue_; - float maxValue_; - bool applyLog_; - - public: - LookupTableStyleConfigurator(); - - void SetLookupTable(const std::string& lut); - - /** - See the SetLookupTable(const std::vector& lut) method in the - LookupTableTextureSceneLayer class. - */ - void SetLookupTable(const std::vector& lut); - - void SetRange(float minValue, float maxValue); - - void SetApplyLog(bool apply); - - bool IsApplyLog() const - { - return applyLog_; - } - - virtual uint64_t GetRevision() const - { - return revision_; - } - - virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const; - - virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, - const DicomInstanceParameters& parameters) const - { - return parameters.CreateLookupTableTexture(frame); - } - - virtual void ApplyStyle(ISceneLayer& layer) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/LookupTableTextureSceneLayer.cpp --- a/Framework/Scene2D/LookupTableTextureSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,311 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LookupTableTextureSceneLayer.h" - -#include -#include -#include - -namespace OrthancStone -{ - LookupTableTextureSceneLayer::LookupTableTextureSceneLayer(const Orthanc::ImageAccessor& texture) : - applyLog_(false) - { - { - std::unique_ptr t( - new Orthanc::Image(Orthanc::PixelFormat_Float32, - texture.GetWidth(), - texture.GetHeight(), - false)); - - Orthanc::ImageProcessing::Convert(*t, texture); - SetTexture(t.release()); - } - - SetLookupTableGrayscale(); // simple ramp between 0 and 255 - SetRange(0, 1); - } - - - void LookupTableTextureSceneLayer::SetLookupTableGrayscale() - { - std::vector rgb(3 * 256); - - for (size_t i = 0; i < 256; i++) - { - rgb[3 * i] = static_cast(i); - rgb[3 * i + 1] = static_cast(i); - rgb[3 * i + 2] = static_cast(i); - } - - SetLookupTableRgb(rgb); - } - - - void LookupTableTextureSceneLayer::SetLookupTableRgb(const std::vector& lut) - { - if (lut.size() != 3 * 256) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - lut_.resize(4 * 256); - - for (size_t i = 0; i < 256; i++) - { - // Premultiplied alpha - - if (i == 0) - { - // Make zero transparent - lut_[4 * i] = 0; // R - lut_[4 * i + 1] = 0; // G - lut_[4 * i + 2] = 0; // B - lut_[4 * i + 3] = 0; // A - } - else - { - float a = static_cast(i) / 255.0f; - - float r = static_cast(lut[3 * i]) * a; - float g = static_cast(lut[3 * i + 1]) * a; - float b = static_cast(lut[3 * i + 2]) * a; - - lut_[4 * i] = static_cast(std::floor(r)); - lut_[4 * i + 1] = static_cast(std::floor(g)); - lut_[4 * i + 2] = static_cast(std::floor(b)); - lut_[4 * i + 3] = static_cast(std::floor(a * 255.0f)); - } - } - - IncrementRevision(); - } - - - void LookupTableTextureSceneLayer::SetLookupTable(const std::vector& lut) - { - if (lut.size() == 4 * 256) - { - lut_ = lut; - IncrementRevision(); - } - else if (lut.size() == 3 * 256) - { - SetLookupTableRgb(lut); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - void LookupTableTextureSceneLayer::SetRange(float minValue, - float maxValue) - { - if (minValue > maxValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - minValue_ = minValue; - maxValue_ = maxValue; - IncrementRevision(); - } - } - - void LookupTableTextureSceneLayer::SetApplyLog(bool apply) - { - applyLog_ = apply; - IncrementRevision(); - } - - void LookupTableTextureSceneLayer::FitRange() - { - Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue_, maxValue_, GetTexture()); - assert(minValue_ <= maxValue_); - // TODO: debug to be removed - if (fabs(maxValue_ - minValue_) < 0.0001) { - LOG(INFO) << "LookupTableTextureSceneLayer::FitRange(): minValue_ = " << minValue_ << " maxValue_ = " << maxValue_; - } - IncrementRevision(); - } - - - ISceneLayer* LookupTableTextureSceneLayer::Clone() const - { - std::unique_ptr cloned - (new LookupTableTextureSceneLayer(GetTexture())); - - - // TODO: why is windowing_ not copied?????? - cloned->CopyParameters(*this); - cloned->minValue_ = minValue_; - cloned->maxValue_ = maxValue_; - cloned->lut_ = lut_; - - return cloned.release(); - } - - - // Templatized function to speed up computations, by avoiding - // testing conditions on each pixel - template - static void RenderInternal(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - float minValue, - float slope, - const std::vector& lut) - { - static const float LOG_NORMALIZATION = 255.0f / log(1.0f + 255.0f); - - const unsigned int width = source.GetWidth(); - const unsigned int height = source.GetHeight(); - - for (unsigned int y = 0; y < height; y++) - { - const float* p = reinterpret_cast(source.GetConstRow(y)); - uint8_t* q = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < width; x++) - { - float v = (*p - minValue) * slope; - if (v <= 0) - { - v = 0; - } - else if (v >= 255) - { - v = 255; - } - - if (IsApplyLog) - { - // https://theailearner.com/2019/01/01/log-transformation/ - v = LOG_NORMALIZATION * log(1.0f + static_cast(v)); - } - - assert(v >= 0.0f && v <= 255.0f); - - uint8_t vv = static_cast(v); - - switch (TargetFormat) - { - case Orthanc::PixelFormat_BGRA32: - // For Cairo surfaces - q[0] = lut[4 * vv + 2]; // B - q[1] = lut[4 * vv + 1]; // G - q[2] = lut[4 * vv + 0]; // R - q[3] = lut[4 * vv + 3]; // A - break; - - case Orthanc::PixelFormat_RGBA32: - // For OpenGL - q[0] = lut[4 * vv + 0]; // R - q[1] = lut[4 * vv + 1]; // G - q[2] = lut[4 * vv + 2]; // B - q[3] = lut[4 * vv + 3]; // A - break; - - default: - assert(0); - } - - p++; - q += 4; - } - } - } - - - void LookupTableTextureSceneLayer::Render(Orthanc::ImageAccessor& target) const - { - assert(sizeof(float) == 4); - - if (!HasTexture()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - const Orthanc::ImageAccessor& source = GetTexture(); - - if (source.GetFormat() != Orthanc::PixelFormat_Float32 || - (target.GetFormat() != Orthanc::PixelFormat_RGBA32 && - target.GetFormat() != Orthanc::PixelFormat_BGRA32)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (source.GetWidth() != target.GetWidth() || - source.GetHeight() != target.GetHeight()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); - } - - const float minValue = GetMinValue(); - float slope; - - if (GetMinValue() >= GetMaxValue()) - { - slope = 0; - } - else - { - slope = 256.0f / (GetMaxValue() - GetMinValue()); - } - - const std::vector& lut = GetLookupTable(); - if (lut.size() != 4 * 256) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - switch (target.GetFormat()) - { - case Orthanc::PixelFormat_RGBA32: - if (applyLog_) - { - RenderInternal(target, source, minValue, slope, lut); - } - else - { - RenderInternal(target, source, minValue, slope, lut); - } - break; - - case Orthanc::PixelFormat_BGRA32: - if (applyLog_) - { - RenderInternal(target, source, minValue, slope, lut); - } - else - { - RenderInternal(target, source, minValue, slope, lut); - } - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/LookupTableTextureSceneLayer.h --- a/Framework/Scene2D/LookupTableTextureSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "TextureBaseSceneLayer.h" - -namespace OrthancStone -{ - class LookupTableTextureSceneLayer : public TextureBaseSceneLayer - { - private: - ImageWindowing windowing_; - float minValue_; - float maxValue_; - std::vector lut_; - bool applyLog_; - - void SetLookupTableRgb(const std::vector& lut); - - public: - // The pixel format must be convertible to Float32 - LookupTableTextureSceneLayer(const Orthanc::ImageAccessor& texture); - - void SetLookupTableGrayscale(); - - // The vector must contain either 3 * 256 values (RGB), or 4 * 256 - // (RGBA). In the RGB case, an alpha channel will be automatically added. - void SetLookupTable(const std::vector& lut); - - void SetRange(float minValue, - float maxValue); - - void FitRange(); - - float GetMinValue() const - { - return minValue_; - } - - float GetMaxValue() const - { - return maxValue_; - } - - // This returns a vector of 4 * 256 values between 0 and 255, in RGBA. - const std::vector& GetLookupTable() const - { - return lut_; - } - - void SetApplyLog(bool apply); - - bool IsApplyLog() const - { - return applyLog_; - } - - virtual ISceneLayer* Clone() const; - - virtual Type GetType() const - { - return Type_LookupTableTexture; - } - - // Render the texture to a color image of format BGRA32 (Cairo - // surfaces) or RGBA32 (OpenGL) - void Render(Orthanc::ImageAccessor& target) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/NullLayer.h --- a/Framework/Scene2D/NullLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "ISceneLayer.h" - -#include - -#include - -/** - This layer can be used when a z-index needs to be booked inside a Scene2D. - - It can later be replaced by the actual layer. -*/ -namespace OrthancStone -{ - class NullLayer : public ISceneLayer - { - public: - NullLayer() {} - - virtual ISceneLayer* Clone() const ORTHANC_OVERRIDE - { - return new NullLayer(); - } - - virtual Type GetType() const ORTHANC_OVERRIDE - { - return Type_NullLayer; - } - - virtual bool GetBoundingBox(Extent2D& target) const ORTHANC_OVERRIDE - { - target = Extent2D(); - return false; - } - - virtual uint64_t GetRevision() const ORTHANC_OVERRIDE - { - return 0; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/OpenGLCompositor.cpp --- a/Framework/Scene2D/OpenGLCompositor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,258 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "OpenGLCompositor.h" - -#include "Internals/OpenGLAdvancedPolylineRenderer.h" -#include "Internals/OpenGLBasicPolylineRenderer.h" -#include "Internals/OpenGLColorTextureRenderer.h" -#include "Internals/OpenGLFloatTextureRenderer.h" -#include "Internals/OpenGLInfoPanelRenderer.h" -#include "Internals/OpenGLLookupTableTextureRenderer.h" -#include "Internals/OpenGLTextRenderer.h" - -namespace OrthancStone -{ - class OpenGLCompositor::Font : public boost::noncopyable - { - private: - std::unique_ptr alphabet_; - std::unique_ptr texture_; - - public: - Font(OpenGL::IOpenGLContext& context, const GlyphBitmapAlphabet& dict) - { - alphabet_.reset(new GlyphTextureAlphabet(dict)); - texture_.reset(new OpenGL::OpenGLTexture(context)); - - std::unique_ptr bitmap(alphabet_->ReleaseTexture()); - texture_->Load(*bitmap, true /* enable linear interpolation */); - } - - OpenGL::OpenGLTexture& GetTexture() const - { - assert(texture_.get() != NULL); - return *texture_; - } - - const GlyphTextureAlphabet& GetAlphabet() const - { - assert(alphabet_.get() != NULL); - return *alphabet_; - } - }; - - const OpenGLCompositor::Font* OpenGLCompositor::GetFont(size_t fontIndex) const - { - Fonts::const_iterator found = fonts_.find(fontIndex); - - if (found == fonts_.end()) - { - return NULL; // Unknown font, nothing should be drawn - } - else - { - assert(found->second != NULL); - return found->second; - } - } - - Internals::CompositorHelper::ILayerRenderer* OpenGLCompositor::Create(const ISceneLayer& layer) - { - if (!context_.IsContextLost()) - { - switch (layer.GetType()) - { - case ISceneLayer::Type_InfoPanel: - return new Internals::OpenGLInfoPanelRenderer - (context_, colorTextureProgram_, dynamic_cast(layer)); - - case ISceneLayer::Type_ColorTexture: - return new Internals::OpenGLColorTextureRenderer - (context_, colorTextureProgram_, dynamic_cast(layer)); - - case ISceneLayer::Type_FloatTexture: - return new Internals::OpenGLFloatTextureRenderer - (context_, floatTextureProgram_, dynamic_cast(layer)); - - case ISceneLayer::Type_LookupTableTexture: - return new Internals::OpenGLLookupTableTextureRenderer - (context_, colorTextureProgram_, dynamic_cast(layer)); - - case ISceneLayer::Type_Polyline: - return new Internals::OpenGLAdvancedPolylineRenderer - (context_, linesProgram_, dynamic_cast(layer)); - //return new Internals::OpenGLBasicPolylineRenderer(context_, dynamic_cast(layer)); - - case ISceneLayer::Type_Text: - { - const TextSceneLayer& l = dynamic_cast(layer); - const Font* font = GetFont(l.GetFontIndex()); - if (font == NULL) - { - LOG(WARNING) << "There is no font at index " << l.GetFontIndex(); - return NULL; - } - else - { - return new Internals::OpenGLTextRenderer - (context_, textProgram_, font->GetAlphabet(), font->GetTexture(), l); - } - } - - default: - return NULL; - } - } - else - { - // context is lost. returning null. - return NULL; - } - } - - OpenGLCompositor::OpenGLCompositor(OpenGL::IOpenGLContext& context) : - context_(context), - colorTextureProgram_(context), - floatTextureProgram_(context), - linesProgram_(context), - textProgram_(context), - canvasWidth_(0), - canvasHeight_(0) - { - if (!context_.IsContextLost()) - { - canvasWidth_ = context_.GetCanvasWidth(); - canvasHeight_ = context_.GetCanvasHeight(); - } - - ResetScene(); - } - - OpenGLCompositor::~OpenGLCompositor() - { - if (!context_.IsContextLost()) - { - try - { - try - { - context_.MakeCurrent(); // this can throw if context lost! - } - catch (...) - { - LOG(ERROR) << "context_.MakeCurrent() failed in OpenGLCompositor::~OpenGLCompositor()!"; - } - - for (Fonts::iterator it = fonts_.begin(); it != fonts_.end(); ++it) - { - try - { - - assert(it->second != NULL); - delete it->second; - } - catch (...) - { - LOG(ERROR) << "Exception thrown while deleting OpenGL-based font!"; - } - } - } - catch (...) - { - // logging threw an exception! - } - } - } - - void OpenGLCompositor::Refresh(const Scene2D& scene) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); // this can throw if context lost! - canvasWidth_ = context_.GetCanvasWidth(); - canvasHeight_ = context_.GetCanvasHeight(); - - glViewport(0, 0, canvasWidth_, canvasHeight_); - glClearColor(0, 0, 0, 1); - glClear(GL_COLOR_BUFFER_BIT); - - helper_->Refresh(scene, canvasWidth_, canvasHeight_); - - context_.SwapBuffer(); - } - } - - void OpenGLCompositor::SetFont(size_t index, - const GlyphBitmapAlphabet& dict) - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); // this can throw if context lost - - std::unique_ptr font(new Font(context_, dict)); - - Fonts::iterator found = fonts_.find(index); - - if (found == fonts_.end()) - { - fonts_[index] = font.release(); - } - else - { - assert(found->second != NULL); - delete found->second; - - found->second = font.release(); - } - } - } - -#if ORTHANC_ENABLE_LOCALE == 1 - void OpenGLCompositor::SetFont(size_t index, - const std::string& ttf, - unsigned int fontSize, - Orthanc::Encoding codepage) - { - if (!context_.IsContextLost()) - { - FontRenderer renderer; - renderer.LoadFont(ttf, fontSize); - - GlyphBitmapAlphabet dict; - dict.LoadCodepage(renderer, codepage); - - SetFont(index, dict); - } - } -#endif - - - void OpenGLCompositor::RefreshCanvasSize() - { - if (!context_.IsContextLost()) - { - context_.MakeCurrent(); // this can throw if context lost! - context_.RefreshCanvasSize(); // Difference with Refresh(scene) - canvasWidth_ = context_.GetCanvasWidth(); - canvasHeight_ = context_.GetCanvasHeight(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/OpenGLCompositor.h --- a/Framework/Scene2D/OpenGLCompositor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ICompositor.h" -#include "Internals/CompositorHelper.h" -#include "Internals/OpenGLColorTextureProgram.h" -#include "Internals/OpenGLFloatTextureProgram.h" -#include "Internals/OpenGLLinesProgram.h" -#include "Internals/OpenGLTextProgram.h" - -namespace OrthancStone -{ - class OpenGLCompositor : public ICompositor, private Internals::CompositorHelper::IRendererFactory - { - private: - class Font; - - typedef std::map Fonts; - - OpenGL::IOpenGLContext& context_; - Fonts fonts_; - std::unique_ptr helper_; - Internals::OpenGLColorTextureProgram colorTextureProgram_; - Internals::OpenGLFloatTextureProgram floatTextureProgram_; - Internals::OpenGLLinesProgram linesProgram_; - Internals::OpenGLTextProgram textProgram_; - unsigned int canvasWidth_; - unsigned int canvasHeight_; - - const Font* GetFont(size_t fontIndex) const; - - virtual Internals::CompositorHelper::ILayerRenderer* Create(const ISceneLayer& layer) ORTHANC_OVERRIDE; - - public: - OpenGLCompositor(OpenGL::IOpenGLContext& context); - - virtual ~OpenGLCompositor(); - - virtual void Refresh(const Scene2D& scene) ORTHANC_OVERRIDE; - - virtual void ResetScene() ORTHANC_OVERRIDE - { - helper_.reset(new Internals::CompositorHelper(*this)); - } - - void SetFont(size_t index, const GlyphBitmapAlphabet& dict); - -#if ORTHANC_ENABLE_LOCALE == 1 - void SetFont(size_t index, - const std::string& ttf, - unsigned int fontSize, - Orthanc::Encoding codepage) ORTHANC_OVERRIDE; -#endif - - virtual void RefreshCanvasSize() ORTHANC_OVERRIDE; - - virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE - { - return canvasWidth_; - } - - virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE - { - return canvasHeight_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PanSceneTracker.cpp --- a/Framework/Scene2D/PanSceneTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "PanSceneTracker.h" -#include "../Viewport/IViewport.h" -#include "../Scene2DViewport/ViewportController.h" - -#include - -namespace OrthancStone -{ - PanSceneTracker::PanSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event) - : OneGesturePointerTracker(viewport) - { - - std::unique_ptr lock(viewport_->Lock()); - - originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); - originalCanvasToScene_ = lock->GetController().GetCanvasToSceneTransform(); - - pivot_ = event.GetMainPosition().Apply(originalCanvasToScene_); - } - - - void PanSceneTracker::PointerMove(const PointerEvent& event) - { - ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_); - - std::unique_ptr lock(viewport_->Lock()); - - lock->GetController().SetSceneToCanvasTransform( - AffineTransform2D::Combine( - originalSceneToCanvas_, - AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), - p.GetY() - pivot_.GetY()))); - lock->Invalidate(); - } - - void PanSceneTracker::Cancel() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PanSceneTracker.h --- a/Framework/Scene2D/PanSceneTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2DViewport/OneGesturePointerTracker.h" - -namespace OrthancStone -{ - class PanSceneTracker : public OneGesturePointerTracker - { - public: - PanSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event); - - virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; - virtual void Cancel() ORTHANC_OVERRIDE; - - private: - ScenePoint2D pivot_; - AffineTransform2D originalSceneToCanvas_; - AffineTransform2D originalCanvasToScene_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PointerEvent.cpp --- a/Framework/Scene2D/PointerEvent.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "PointerEvent.h" - -#include - -namespace OrthancStone -{ - PointerEvent::PointerEvent() : - button_(MouseButton_None), - hasAltModifier_(false), - hasControlModifier_(false), - hasShiftModifier_(false) - { - } - - - ScenePoint2D PointerEvent::GetMainPosition() const - { - if (positions_.empty()) - { - return ScenePoint2D(0, 0); - } - else - { - return positions_[0]; - } - } - - - ScenePoint2D PointerEvent::GetPosition(size_t index) const - { - if (index < positions_.size()) - { - return positions_[index]; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PointerEvent.h --- a/Framework/Scene2D/PointerEvent.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ScenePoint2D.h" - -#include -#include - -namespace OrthancStone -{ - class PointerEvent : public boost::noncopyable - { - private: - MouseButton button_; - std::vector positions_; - bool hasAltModifier_; - bool hasControlModifier_; - bool hasShiftModifier_; - - public: - PointerEvent(); - - ScenePoint2D GetMainPosition() const; - - void AddPosition(const ScenePoint2D& p) - { - positions_.push_back(p); - } - - void AddPosition(double x, - double y) - { - positions_.push_back(ScenePoint2D(x, y)); - } - - size_t GetPositionsCount() const - { - return positions_.size(); - } - - ScenePoint2D GetPosition(size_t index) const; - - void SetAltModifier(bool value) - { - hasAltModifier_ = value; - } - - bool HasAltModifier() const - { - return hasAltModifier_; - } - - void SetControlModifier(bool value) - { - hasControlModifier_ = value; - } - - bool HasControlModifier() const - { - return hasControlModifier_; - } - - void SetShiftModifier(bool value) - { - hasShiftModifier_ = value; - } - - bool HasShiftModifier() const - { - return hasShiftModifier_; - } - - void SetMouseButton(MouseButton button) - { - button_ = button; - } - - MouseButton GetMouseButton() const - { - return button_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PolylineSceneLayer.cpp --- a/Framework/Scene2D/PolylineSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "PolylineSceneLayer.h" - -#include - -namespace OrthancStone -{ - void PolylineSceneLayer::Copy(const PolylineSceneLayer& other) - { - items_ = other.items_; - thickness_ = other.thickness_; - revision_ ++; - } - - - ISceneLayer* PolylineSceneLayer::Clone() const - { - std::unique_ptr cloned(new PolylineSceneLayer); - cloned->Copy(*this); - return cloned.release(); - } - - - void PolylineSceneLayer::SetThickness(double thickness) - { - if (thickness <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - thickness_ = thickness; - revision_++; - } - } - - - void PolylineSceneLayer::AddChain(const Chain& chain, - bool isClosed, - uint8_t red, - uint8_t green, - uint8_t blue) - { - if (!chain.empty()) - { - items_.push_back(Item()); - items_.back().chain_ = chain; - items_.back().closed_ = isClosed; - items_.back().color_ = Color(red, green, blue); - - revision_++; - } - } - - - void PolylineSceneLayer::ClearAllChains() - { - items_.clear(); - revision_++; - } - - const PolylineSceneLayer::Item& PolylineSceneLayer::GetItem(size_t i) const - { - if (i < items_.size()) - { - return items_[i]; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - bool PolylineSceneLayer::GetBoundingBox(Extent2D& target) const - { - target.Reset(); - - for (size_t i = 0; i < items_.size(); i++) - { - for (size_t j = 0; j < items_[i].chain_.size(); j++) - { - const ScenePoint2D& p = items_[i].chain_[j]; - target.AddPoint(p.GetX(), p.GetY()); - } - } - - return true; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/PolylineSceneLayer.h --- a/Framework/Scene2D/PolylineSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "Color.h" -#include "ScenePoint2D.h" -#include "ISceneLayer.h" - -#include - -namespace OrthancStone -{ - class PolylineSceneLayer : public ISceneLayer - { - public: - typedef std::vector Chain; - - private: - struct Item - { - Chain chain_; - bool closed_; - Color color_; - }; - - std::vector items_; - double thickness_; - uint64_t revision_; - - const Item& GetItem(size_t i) const; - - public: - PolylineSceneLayer() : - thickness_(1.0), - revision_(0) - { - } - - void Copy(const PolylineSceneLayer& other); - - virtual uint64_t GetRevision() const - { - return revision_; - } - - virtual ISceneLayer* Clone() const; - - void SetThickness(double thickness); - - double GetThickness() const - { - return thickness_; - } - - void Reserve(size_t countChains) - { - items_.reserve(countChains); - } - - void AddChain(const Chain& chain, - bool isClosed, - uint8_t red, - uint8_t green, - uint8_t blue); - - void AddChain(const Chain& chain, - bool isClosed, - const Color& color) - { - AddChain(chain, isClosed, color.GetRed(), color.GetGreen(), color.GetBlue()); - } - - void ClearAllChains(); - - size_t GetChainsCount() const - { - return items_.size(); - } - - const Chain& GetChain(size_t i) const - { - return GetItem(i).chain_; - } - - bool IsClosedChain(size_t i) const - { - return GetItem(i).closed_; - } - - const Color& GetColor(size_t i) const - { - return GetItem(i).color_; - } - - virtual Type GetType() const - { - return Type_Polyline; - } - - virtual bool GetBoundingBox(Extent2D& target) const; - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/RotateSceneTracker.cpp --- a/Framework/Scene2D/RotateSceneTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "RotateSceneTracker.h" -#include "../Scene2DViewport/ViewportController.h" - -namespace OrthancStone -{ - RotateSceneTracker::RotateSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event) - : OneGesturePointerTracker(viewport) - , click_(event.GetMainPosition()) - , aligner_(viewport, click_) - , isFirst_(true) - { - std::unique_ptr lock(viewport_->Lock()); - originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); - - } - - void RotateSceneTracker::PointerMove(const PointerEvent& event) - { - ScenePoint2D p = event.GetMainPosition(); - double dx = p.GetX() - click_.GetX(); - double dy = p.GetY() - click_.GetY(); - - if (std::abs(dx) > 5.0 || - std::abs(dy) > 5.0) - { - double a = atan2(dy, dx); - - if (isFirst_) - { - referenceAngle_ = a; - isFirst_ = false; - } - - std::unique_ptr lock(viewport_->Lock()); - - lock->GetController().SetSceneToCanvasTransform( - AffineTransform2D::Combine( - AffineTransform2D::CreateRotation(a - referenceAngle_), - originalSceneToCanvas_)); - aligner_.Apply(); - lock->Invalidate(); - } - } - - void RotateSceneTracker::Cancel() - { - // See remark above - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); - lock->Invalidate(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/RotateSceneTracker.h --- a/Framework/Scene2D/RotateSceneTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2DViewport/OneGesturePointerTracker.h" -#include "Internals/FixedPointAligner.h" -#include - -namespace OrthancStone -{ - class RotateSceneTracker : public OneGesturePointerTracker - { - public: - RotateSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event); - - virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; - virtual void Cancel() ORTHANC_OVERRIDE; - - private: - ScenePoint2D click_; - Internals::FixedPointAligner aligner_; - double referenceAngle_; - bool isFirst_; - AffineTransform2D originalSceneToCanvas_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Scene2D.cpp --- a/Framework/Scene2D/Scene2D.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,272 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Scene2D.h" - -#include - - -namespace OrthancStone -{ - class Scene2D::Item - { - private: - std::unique_ptr layer_; - uint64_t identifier_; - - public: - Item(ISceneLayer* layer, - uint64_t identifier) : - layer_(layer), - identifier_(identifier) - { - if (layer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - ISceneLayer& GetLayer() const - { - if (layer_.get() == NULL) - { - LOG(ERROR) << "Scene2D::Item::GetLayer(): (layer_.get() == NULL)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *layer_; - } - } - - ISceneLayer* ReleaseLayer() - { - if (layer_.get() == NULL) - { - LOG(ERROR) << "Scene2D::Item::ReleaseLayer(): (layer_.get() == NULL)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return layer_.release(); - } - } - - uint64_t GetIdentifier() const - { - return identifier_; - } - }; - - - Scene2D::Scene2D(const Scene2D& other) - : sceneToCanvas_(other.sceneToCanvas_) - , canvasToScene_(other.canvasToScene_) - , layerCounter_(0) - { - for (Content::const_iterator it = other.content_.begin(); - it != other.content_.end(); ++it) - { - content_[it->first] = new Item(it->second->GetLayer().Clone(), layerCounter_++); - } - } - - - Scene2D::~Scene2D() - { - for (Content::iterator it = content_.begin(); - it != content_.end(); ++it) - { - assert(it->second != NULL); - delete it->second; - } - } - - - void Scene2D::SetLayer(int depth, - ISceneLayer* layer) // Takes ownership - { - LOG(TRACE) << "SetLayer(" << depth << ", " << reinterpret_cast(layer) << ")"; - std::unique_ptr item(new Item(layer, layerCounter_++)); - - if (layer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - Content::iterator found = content_.find(depth); - - if (found == content_.end()) - { - content_[depth] = item.release(); - } - else - { - assert(found->second != NULL); - delete found->second; - found->second = item.release(); - } - } - - - void Scene2D::DeleteLayer(int depth) - { - - Content::iterator found = content_.find(depth); - - if (found != content_.end()) - { - LOG(TRACE) << "DeleteLayer --found-- (" << depth << ")"; - assert(found->second != NULL); - delete found->second; - content_.erase(found); - } - } - - - bool Scene2D::HasLayer(int depth) const - { - return (content_.find(depth) != content_.end()); - } - - - ISceneLayer& Scene2D::GetLayer(int depth) const - { - Content::const_iterator found = content_.find(depth); - - if (found == content_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(found->second != NULL); - return found->second->GetLayer(); - } - } - - - int Scene2D::GetMinDepth() const - { - if (content_.size() == 0) - return 0; - else - return content_.begin()->first; - } - - - int Scene2D::GetMaxDepth() const - { - if (content_.size() == 0) - return 0; - else - return content_.rbegin()->first; - } - - ISceneLayer* Scene2D::ReleaseLayer(int depth) - { - Content::iterator found = content_.find(depth); - - if (found == content_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(found->second != NULL); - - std::unique_ptr layer(found->second->ReleaseLayer()); - assert(layer.get() != NULL); - - content_.erase(found); - - return layer.release(); - } - } - - void Scene2D::Apply(IVisitor& visitor) const - { - for (Content::const_iterator it = content_.begin(); - it != content_.end(); ++it) - { - assert(it->second != NULL); - visitor.Visit(*this, it->second->GetLayer(), it->second->GetIdentifier(), it->first); - } - } - - - void Scene2D::SetSceneToCanvasTransform(const AffineTransform2D& transform) - { - // Make sure the transform is invertible before making any change - AffineTransform2D inverse = AffineTransform2D::Invert(transform); - - sceneToCanvas_ = transform; - canvasToScene_ = inverse; - } - - void Scene2D::GetBoundingBox(Extent2D &target) const - { - target.Reset(); - - for (Content::const_iterator it = content_.begin(); - it != content_.end(); ++it) - { - assert(it->second != NULL); - - Extent2D tmp; - if (it->second->GetLayer().GetBoundingBox(tmp)) - { - target.Union(tmp); - } - } - } - - void Scene2D::FitContent(unsigned int canvasWidth, - unsigned int canvasHeight) - { - Extent2D extent; - - GetBoundingBox(extent); - - if (!extent.IsEmpty()) - { - double zoomX = static_cast(canvasWidth) / extent.GetWidth(); - double zoomY = static_cast(canvasHeight) / extent.GetHeight(); - - double zoom = std::min(zoomX, zoomY); - if (LinearAlgebra::IsCloseToZero(zoom)) - { - zoom = 1; - } - - double panX = extent.GetCenterX(); - double panY = extent.GetCenterY(); - - // Bring the center of the scene to (0,0) - AffineTransform2D t1 = AffineTransform2D::CreateOffset(-panX, -panY); - - // Scale the scene - AffineTransform2D t2 = AffineTransform2D::CreateScaling(zoom, zoom); - - SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1)); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/Scene2D.h --- a/Framework/Scene2D/Scene2D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ISceneLayer.h" -#include "../Toolbox/AffineTransform2D.h" -#include "../Messages/IObservable.h" -#include "../Messages/IMessage.h" - -#include - -namespace OrthancStone -{ - class Scene2D : public boost::noncopyable - { - public: - class IVisitor : public boost::noncopyable - { - public: - virtual ~IVisitor() - { - } - - virtual void Visit(const Scene2D& scene, - const ISceneLayer& layer, - uint64_t layerIdentifier, - int depth) = 0; - }; - - private: - class Item; - - typedef std::map Content; - - Content content_; - AffineTransform2D sceneToCanvas_; - AffineTransform2D canvasToScene_; - uint64_t layerCounter_; - - Scene2D(const Scene2D& other); - - public: - Scene2D() : layerCounter_(0) - { - } - - ~Scene2D(); - - Scene2D* Clone() const - { - return new Scene2D(*this); - } - - void SetLayer(int depth, - ISceneLayer* layer); // Takes ownership - - /** - Removes the layer at specified depth and deletes the underlying object - */ - void DeleteLayer(int depth); - - bool HasLayer(int depth) const; - - ISceneLayer& GetLayer(int depth) const; - - /** - Returns the minimum depth among all layers or 0 if there are no layers - */ - int GetMinDepth() const; - - /** - Returns the minimum depth among all layers or 0 if there are no layers - */ - int GetMaxDepth() const; - - /** - Removes the layer at specified depth and transfers the object - ownership to the caller - */ - ISceneLayer* ReleaseLayer(int depth); - - void Apply(IVisitor& visitor) const; - - const AffineTransform2D& GetSceneToCanvasTransform() const - { - return sceneToCanvas_; - } - - const AffineTransform2D& GetCanvasToSceneTransform() const - { - return canvasToScene_; - } - - void SetSceneToCanvasTransform(const AffineTransform2D& transform); - - void FitContent(unsigned int canvasWidth, - unsigned int canvasHeight); - - void GetBoundingBox(Extent2D& target) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ScenePoint2D.h --- a/Framework/Scene2D/ScenePoint2D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/AffineTransform2D.h" -#include "../Toolbox/LinearAlgebra.h" - -namespace OrthancStone -{ - class ScenePoint2D - { - private: - double x_; - double y_; - - public: - ScenePoint2D() : - x_(0), - y_(0) - { - } - - ScenePoint2D(double x, - double y) : - x_(x), - y_(y) - { - } - - double GetX() const - { - return x_; - } - - double GetY() const - { - return y_; - } - - ScenePoint2D Apply(const AffineTransform2D& t) const - { - double x = x_; - double y = y_; - t.Apply(x, y); - return ScenePoint2D(x, y); - } - - const ScenePoint2D operator-(const ScenePoint2D& a) const - { - ScenePoint2D v; - v.x_ = x_ - a.x_; - v.y_ = y_ - a.y_; - - return v; - } - - const ScenePoint2D operator+(const ScenePoint2D& a) const - { - ScenePoint2D v; - v.x_ = x_ + a.x_; - v.y_ = y_ + a.y_; - - return v; - } - - const ScenePoint2D operator*(double a) const - { - ScenePoint2D v; - v.x_ = x_ * a; - v.y_ = y_ * a; - - return v; - } - - const ScenePoint2D operator/(double a) const - { - ScenePoint2D v; - v.x_ = x_ / a; - v.y_ = y_ / a; - - return v; - } - - static void MidPoint(ScenePoint2D& result, const ScenePoint2D& a, const ScenePoint2D& b) - { - result.x_ = 0.5 * (a.x_ + b.x_); - result.y_ = 0.5 * (a.y_ + b.y_); - } - - static double Dot(const ScenePoint2D& a, const ScenePoint2D& b) - { - return a.x_ * b.x_ + a.y_ * b.y_; - } - - static double SquaredMagnitude(const ScenePoint2D& v) - { - return v.x_ * v.x_ + v.y_ * v.y_; - } - - static double Magnitude(const ScenePoint2D& v) - { - double squaredMagnitude = SquaredMagnitude(v); - if (LinearAlgebra::IsCloseToZero(squaredMagnitude)) - return 0.0; - return sqrt(squaredMagnitude); - } - - static double SquaredDistancePtPt(const ScenePoint2D& a, const ScenePoint2D& b) - { - ScenePoint2D n = b - a; - return Dot(n, n); - } - - static double DistancePtPt(const ScenePoint2D& a, const ScenePoint2D& b) - { - double squaredDist = SquaredDistancePtPt(a, b); - return sqrt(squaredDist); - } - - /** - Distance from point p to [a,b] segment - - Rewritten from https://www.randygaul.net/2014/07/23/distance-point-to-line-segment/ - */ - static double SquaredDistancePtSegment(const ScenePoint2D& a, const ScenePoint2D& b, const ScenePoint2D& p) - { - ScenePoint2D n = b - a; - ScenePoint2D pa = a - p; - - double c = Dot(n, pa); - - // Closest point is a - if (c > 0.0) - return Dot(pa, pa); - - ScenePoint2D bp = p - b; - - // Closest point is b - if (Dot(n, bp) > 0.0) - return Dot(bp, bp); - - // if segment length is very short, we approximate distance to the - // distance with a - double nq = Dot(n, n); - if (LinearAlgebra::IsCloseToZero(nq)) - { - // segment is very small: approximate distance from point to segment - // with distance from p to a - return Dot(pa, pa); - } - else - { - // Closest point is between a and b - ScenePoint2D e = pa - n * (c / nq); - return Dot(e, e); - } - } - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/TextSceneLayer.cpp --- a/Framework/Scene2D/TextSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TextSceneLayer.h" - -#include - -namespace OrthancStone -{ - TextSceneLayer::TextSceneLayer() : - x_(0), - y_(0), - fontIndex_(0), - anchor_(BitmapAnchor_Center), - border_(0), - revision_(0) - { - } - - - ISceneLayer* TextSceneLayer::Clone() const - { - std::unique_ptr cloned(new TextSceneLayer); - cloned->SetColor(GetColor()); - cloned->x_ = x_; - cloned->y_ = y_; - cloned->utf8_ = utf8_; - cloned->fontIndex_ = fontIndex_; - cloned->anchor_ = anchor_; - cloned->border_ = border_; - return cloned.release(); - } - - void TextSceneLayer::SetPosition(double x, - double y) - { - if (x != x_ || y != y_) - { - x_ = x; - y_ = y; - revision_++; - } - } - - void TextSceneLayer::SetText(const std::string& utf8) - { - if (utf8 != utf8_) - { - utf8_ = utf8; - revision_++; - } - } - - void TextSceneLayer::SetFontIndex(size_t fontIndex) - { - if (fontIndex != fontIndex_) - { - fontIndex_ = fontIndex; - revision_++; - } - } - - void TextSceneLayer::SetAnchor(BitmapAnchor anchor) - { - if (anchor != anchor_) - { - anchor_ = anchor; - revision_++; - } - } - - void TextSceneLayer::SetBorder(unsigned int border) - { - if (border != border_) - { - border_ = border; - revision_++; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/TextSceneLayer.h --- a/Framework/Scene2D/TextSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ColorSceneLayer.h" -#include "../StoneEnumerations.h" - -#include -#include - -namespace OrthancStone -{ - class TextSceneLayer : public ColorSceneLayer - { - private: - double x_; - double y_; - std::string utf8_; - size_t fontIndex_; - BitmapAnchor anchor_; - unsigned int border_; - uint64_t revision_; - - public: - TextSceneLayer(); - - virtual ISceneLayer* Clone() const; - - void SetPosition(double x, - double y); - - void SetText(const std::string& utf8); - - void SetFontIndex(size_t fontIndex); - - void SetAnchor(BitmapAnchor anchor); - - void SetBorder(unsigned int border); - - double GetX() const - { - return x_; - } - - double GetY() const - { - return y_; - } - - unsigned int GetBorder() const - { - return border_; - } - - const std::string& GetText() const - { - return utf8_; - } - - size_t GetFontIndex() const - { - return fontIndex_; - } - - BitmapAnchor GetAnchor() const - { - return anchor_; - } - - virtual Type GetType() const - { - return Type_Text; - } - - virtual bool GetBoundingBox(Extent2D& target) const - { - return false; - } - - virtual uint64_t GetRevision() const - { - return revision_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/TextureBaseSceneLayer.cpp --- a/Framework/Scene2D/TextureBaseSceneLayer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TextureBaseSceneLayer.h" - -#include - -namespace OrthancStone -{ - void TextureBaseSceneLayer::SetTexture(Orthanc::ImageAccessor* texture) - { - if (texture == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - texture_.reset(texture); - IncrementRevision(); - } - } - - - void TextureBaseSceneLayer::CopyParameters(const TextureBaseSceneLayer& other) - { - originX_ = other.originX_; - originY_ = other.originY_; - pixelSpacingX_ = other.pixelSpacingX_; - pixelSpacingY_ = other.pixelSpacingY_; - angle_ = other.angle_; - isLinearInterpolation_ = other.isLinearInterpolation_; - } - - - TextureBaseSceneLayer::TextureBaseSceneLayer() : - originX_(0), - originY_(0), - pixelSpacingX_(1), - pixelSpacingY_(1), - angle_(0), - isLinearInterpolation_(false), - revision_(0) - { - if (pixelSpacingX_ <= 0 || - pixelSpacingY_ <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void TextureBaseSceneLayer::SetOrigin(double x, - double y) - { - originX_ = x; - originY_ = y; - IncrementRevision(); - } - - - void TextureBaseSceneLayer::SetPixelSpacing(double sx, - double sy) - { - if (sx <= 0 || - sy <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - pixelSpacingX_ = sx; - pixelSpacingY_ = sy; - IncrementRevision(); - } - } - - - void TextureBaseSceneLayer::SetAngle(double angle) - { - angle_ = angle; - IncrementRevision(); - } - - - void TextureBaseSceneLayer::SetLinearInterpolation(bool isLinearInterpolation) - { - isLinearInterpolation_ = isLinearInterpolation; - IncrementRevision(); - } - - - const Orthanc::ImageAccessor& TextureBaseSceneLayer::GetTexture() const - { - if (!HasTexture()) - { - LOG(ERROR) << "TextureBaseSceneLayer::GetTexture(): (!HasTexture())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *texture_; - } - } - - - AffineTransform2D TextureBaseSceneLayer::GetTransform() const - { - return AffineTransform2D::Combine( - AffineTransform2D::CreateOffset(originX_, originY_), - AffineTransform2D::CreateRotation(angle_), - AffineTransform2D::CreateScaling(pixelSpacingX_, pixelSpacingY_), - AffineTransform2D::CreateOffset(-0.5, -0.5)); - } - - - bool TextureBaseSceneLayer::GetBoundingBox(Extent2D& target) const - { - if (texture_.get() == NULL) - { - return false; - } - else - { - const AffineTransform2D t = GetTransform(); - - target.Reset(); - - double x, y; - - x = 0; - y = 0; - t.Apply(x, y); - target.AddPoint(x, y); - - x = static_cast(texture_->GetWidth()); - y = 0; - t.Apply(x, y); - target.AddPoint(x, y); - - x = 0; - y = static_cast(texture_->GetHeight()); - t.Apply(x, y); - target.AddPoint(x, y); - - x = static_cast(texture_->GetWidth()); - y = static_cast(texture_->GetHeight()); - t.Apply(x, y); - target.AddPoint(x, y); - - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/TextureBaseSceneLayer.h --- a/Framework/Scene2D/TextureBaseSceneLayer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "ISceneLayer.h" -#include "../Toolbox/AffineTransform2D.h" - -#include -#include - -namespace OrthancStone -{ - class TextureBaseSceneLayer : public ISceneLayer - { - private: - std::unique_ptr texture_; - double originX_; - double originY_; - double pixelSpacingX_; - double pixelSpacingY_; - double angle_; - bool isLinearInterpolation_; - uint64_t revision_; - - protected: - void SetTexture(Orthanc::ImageAccessor* texture); - - void IncrementRevision() - { - revision_++; - } - - void CopyParameters(const TextureBaseSceneLayer& other); - - public: - TextureBaseSceneLayer(); - - // Center of the top-left pixel - void SetOrigin(double x, - double y); - - void SetPixelSpacing(double sx, - double sy); - - // In radians - void SetAngle(double angle); - - void SetLinearInterpolation(bool isLinearInterpolation); - - double GetOriginX() const - { - return originX_; - } - - double GetOriginY() const - { - return originY_; - } - - double GetPixelSpacingX() const - { - return pixelSpacingX_; - } - - double GetPixelSpacingY() const - { - return pixelSpacingY_; - } - - double GetAngle() const - { - return angle_; - } - - bool IsLinearInterpolation() const - { - return isLinearInterpolation_; - } - - bool HasTexture() const - { - return (texture_.get() != NULL); - } - - const Orthanc::ImageAccessor& GetTexture() const; - - AffineTransform2D GetTransform() const; - - virtual bool GetBoundingBox(Extent2D& target) const; - - virtual uint64_t GetRevision() const - { - return revision_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ZoomSceneTracker.cpp --- a/Framework/Scene2D/ZoomSceneTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ZoomSceneTracker.h" -#include "../Scene2DViewport/ViewportController.h" - -namespace OrthancStone -{ - ZoomSceneTracker::ZoomSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event, - unsigned int canvasHeight) - : OneGesturePointerTracker(viewport) - , clickY_(event.GetMainPosition().GetY()) - , aligner_(viewport, event.GetMainPosition()) - { - - std::unique_ptr lock(viewport_->Lock()); - originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); - - if (canvasHeight <= 3) - { - active_ = false; - } - else - { - normalization_ = 1.0 / static_cast(canvasHeight - 1); - active_ = true; - } - } - - void ZoomSceneTracker::PointerMove(const PointerEvent& event) - { - static const double MIN_ZOOM = -4; - static const double MAX_ZOOM = 4; - - if (active_) - { - double y = event.GetMainPosition().GetY(); - - // In the range [-1,1] - double dy = static_cast(y - clickY_) * normalization_; - - double z; - - // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] - if (dy < -1.0) - { - z = MIN_ZOOM; - } - else if (dy > 1.0) - { - z = MAX_ZOOM; - } - else - { - z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; - } - - double zoom = pow(2.0, z); - - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().SetSceneToCanvasTransform( - AffineTransform2D::Combine( - AffineTransform2D::CreateScaling(zoom, zoom), - originalSceneToCanvas_)); - aligner_.Apply(); - lock->Invalidate(); - } - } - - void ZoomSceneTracker::Cancel() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); - lock->Invalidate(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2D/ZoomSceneTracker.h --- a/Framework/Scene2D/ZoomSceneTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - - -#include "../Scene2DViewport/OneGesturePointerTracker.h" -#include "../Viewport/IViewport.h" -#include "Internals/FixedPointAligner.h" - -#include - -namespace OrthancStone -{ - class ZoomSceneTracker : public OneGesturePointerTracker - { - public: - ZoomSceneTracker(boost::shared_ptr viewport, - const PointerEvent& event, - unsigned int canvasHeight); - - virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; - virtual void Cancel() ORTHANC_OVERRIDE; - - private: - double clickY_; - bool active_; - double normalization_; - Internals::FixedPointAligner aligner_; - AffineTransform2D originalSceneToCanvas_; - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/AngleMeasureTool.cpp --- a/Framework/Scene2DViewport/AngleMeasureTool.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,427 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "AngleMeasureTool.h" -#include "MeasureToolsToolbox.h" -#include "EditAngleMeasureTracker.h" -#include "LayerHolder.h" -#include "../StoneException.h" - -#include - -#include -#include - -//// -//// REMOVE THIS -//#ifndef NDEBUG -//extern void -//TrackerSample_SetInfoDisplayMessage(std::string key, std::string value); -//#endif -//// - -namespace OrthancStone -{ - // the params in the LayerHolder ctor specify the number of polyline and text - // layers - AngleMeasureTool::AngleMeasureTool( - boost::shared_ptr viewport) - : MeasureTool(viewport) -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,5))) -#else - , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,1))) -#endif - , angleHighlightArea_(AngleHighlightArea_None) - { - } - - boost::shared_ptr AngleMeasureTool::Create(boost::shared_ptr viewport) - { - boost::shared_ptr obj(new AngleMeasureTool(viewport)); - obj->MeasureTool::PostConstructor(); - obj->RefreshScene(); - return obj; - } - - AngleMeasureTool::~AngleMeasureTool() - { - // this measuring tool is a RABI for the corresponding visual layers - // stored in the 2D scene - Disable(); - RemoveFromScene(); - } - - void AngleMeasureTool::RemoveFromScene() - { - if (layerHolder_->AreLayersCreated() && IsSceneAlive()) - { - layerHolder_->DeleteLayers(); - } - } - - void AngleMeasureTool::SetSide1End(ScenePoint2D pt) - { - side1End_ = pt; - RefreshScene(); - } - - void AngleMeasureTool::SetSide2End(ScenePoint2D pt) - { - side2End_ = pt; - RefreshScene(); - } - - void AngleMeasureTool::SetAngleHighlightArea(AngleHighlightArea area) - { - if (angleHighlightArea_ != area) - { - angleHighlightArea_ = area; - RefreshScene(); - } - } - - void AngleMeasureTool::ResetHighlightState() - { - SetAngleHighlightArea(AngleHighlightArea_None); - } - - - boost::shared_ptr AngleMeasureTool::GetMemento() const - { - boost::shared_ptr memento(new AngleMeasureToolMemento()); - memento->center_ = center_; - memento->side1End_ = side1End_; - memento->side2End_ = side2End_; - return memento; - } - - void AngleMeasureTool::SetMemento(boost::shared_ptr mementoBase) - { - boost::shared_ptr memento = - boost::dynamic_pointer_cast(mementoBase); - - ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); - center_ = memento->center_; - side1End_ = memento->side1End_; - side2End_ = memento->side2End_; - RefreshScene(); - } - - std::string AngleMeasureTool::GetDescription() - { - std::stringstream ss; - ss << "AngleMeasureTool. Center = " << center_ << " Side1End = " - << side1End_ << " Side2End = " << side2End_; - return ss.str(); - } - - void AngleMeasureTool::Highlight(ScenePoint2D p) - { - AngleHighlightArea angleHighlightArea = AngleHitTest(p); - SetAngleHighlightArea(angleHighlightArea); - } - - AngleMeasureTool::AngleHighlightArea AngleMeasureTool::AngleHitTest(ScenePoint2D p) const - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); - - const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; - - { - const double sqDistanceFromSide1End = - ScenePoint2D::SquaredDistancePtPt(p, side1End_); - - if (sqDistanceFromSide1End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return AngleHighlightArea_Side1End; - } - - { - const double sqDistanceFromSide2End = - ScenePoint2D::SquaredDistancePtPt(p, side2End_); - - if (sqDistanceFromSide2End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return AngleHighlightArea_Side2End; - } - - { - const double sqDistanceFromCenter = - ScenePoint2D::SquaredDistancePtPt(p, center_); - if (sqDistanceFromCenter <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return AngleHighlightArea_Center; - } - - { - const double sqDistanceFromSide1 = - ScenePoint2D::SquaredDistancePtSegment(center_, side1End_, p); - - if (sqDistanceFromSide1 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return AngleHighlightArea_Side1; - } - - { - const double sqDistanceFromSide2 = - ScenePoint2D::SquaredDistancePtSegment(center_, side2End_, p); - - if (sqDistanceFromSide2 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return AngleHighlightArea_Side2; - } - - return AngleHighlightArea_None; - } - - bool AngleMeasureTool::HitTest(ScenePoint2D p) - { - return AngleHitTest(p) != AngleHighlightArea_None; - } - - - boost::shared_ptr AngleMeasureTool::CreateEditionTracker(const PointerEvent& e) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - scene.GetCanvasToSceneTransform()); - - if (!HitTest(scenePos)) - return boost::shared_ptr(); - - /** - new EditLineMeasureTracker( - boost::shared_ptr measureTool; - MessageBroker & broker, - boost::shared_ptr viewport, - const PointerEvent & e); - */ - - boost::shared_ptr editAngleMeasureTracker( - new EditAngleMeasureTracker(shared_from_this(), viewport_, e)); - return editAngleMeasureTracker; - } - - void AngleMeasureTool::SetCenter(ScenePoint2D pt) - { - center_ = pt; - RefreshScene(); - } - - void AngleMeasureTool::RefreshScene() - { - if (IsSceneAlive()) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - if (IsEnabled()) - { - layerHolder_->CreateLayersIfNeeded(); - - { - // Fill the polyline layer with the measurement lines - PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); - if (polylineLayer) - { - polylineLayer->ClearAllChains(); - - const Color color(TOOL_ANGLE_LINES_COLOR_RED, - TOOL_ANGLE_LINES_COLOR_GREEN, - TOOL_ANGLE_LINES_COLOR_BLUE); - - const Color highlightColor(TOOL_ANGLE_LINES_HL_COLOR_RED, - TOOL_ANGLE_LINES_HL_COLOR_GREEN, - TOOL_ANGLE_LINES_HL_COLOR_BLUE); - - // sides - { - { - PolylineSceneLayer::Chain chain; - chain.push_back(side1End_); - chain.push_back(center_); - - if ((angleHighlightArea_ == AngleHighlightArea_Side1) || - (angleHighlightArea_ == AngleHighlightArea_Side2)) - { - polylineLayer->AddChain(chain, false, highlightColor); - } - else - { - polylineLayer->AddChain(chain, false, color); - } - } - { - PolylineSceneLayer::Chain chain; - chain.push_back(side2End_); - chain.push_back(center_); - if ((angleHighlightArea_ == AngleHighlightArea_Side1) || - (angleHighlightArea_ == AngleHighlightArea_Side2)) - { - polylineLayer->AddChain(chain, false, highlightColor); - } - else - { - polylineLayer->AddChain(chain, false, color); - } - } - } - - // Create the handles - { - { - PolylineSceneLayer::Chain chain; - //TODO: take DPI into account - AddSquare(chain, controller.GetScene(), side1End_, - controller.GetHandleSideLengthS()); - - if (angleHighlightArea_ == AngleHighlightArea_Side1End) - polylineLayer->AddChain(chain, true, highlightColor); - else - polylineLayer->AddChain(chain, true, color); - - } - { - PolylineSceneLayer::Chain chain; - //TODO: take DPI into account - AddSquare(chain, controller.GetScene(), side2End_, - controller.GetHandleSideLengthS()); - - if (angleHighlightArea_ == AngleHighlightArea_Side2End) - polylineLayer->AddChain(chain, true, highlightColor); - else - polylineLayer->AddChain(chain, true, color); - } - } - - // Create the arc - { - PolylineSceneLayer::Chain chain; - - AddShortestArc(chain, side1End_, center_, side2End_, - controller.GetAngleToolArcRadiusS()); - if (angleHighlightArea_ == AngleHighlightArea_Center) - polylineLayer->AddChain(chain, false, highlightColor); - else - polylineLayer->AddChain(chain, false, color); - } - } - } - { - // Set the text layer - - double p1cAngle = atan2( - side1End_.GetY() - center_.GetY(), - side1End_.GetX() - center_.GetX()); - - double p2cAngle = atan2( - side2End_.GetY() - center_.GetY(), - side2End_.GetX() - center_.GetX()); - - double delta = NormalizeAngle(p2cAngle - p1cAngle); - double theta = p1cAngle + delta / 2; - - double ox = controller.GetAngleTopTextLabelDistanceS() * cos(theta); - double oy = controller.GetAngleTopTextLabelDistanceS() * sin(theta); - - double pointX = center_.GetX() + ox; - double pointY = center_.GetY() + oy; - - char buf[64]; - double angleDeg = RadiansToDegrees(delta); - - // http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=00B0&mode=hex - sprintf(buf, "%0.02f\xc2\xb0", angleDeg); - -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - SetTextLayerOutlineProperties( - scene, layerHolder_, buf, ScenePoint2D(pointX, pointY), 0); -#else - SetTextLayerProperties( - scene, layerHolder_, buf, ScenePoint2D(pointX, pointY) , 0); -#endif - -#if 0 - // TODO:make it togglable - bool enableInfoDisplay = true; - if (enableInfoDisplay) - { - TrackerSample_SetInfoDisplayMessage("center_.GetX()", - boost::lexical_cast(center_.GetX())); - - TrackerSample_SetInfoDisplayMessage("center_.GetY()", - boost::lexical_cast(center_.GetY())); - - TrackerSample_SetInfoDisplayMessage("side1End_.GetX()", - boost::lexical_cast(side1End_.GetX())); - - TrackerSample_SetInfoDisplayMessage("side1End_.GetY()", - boost::lexical_cast(side1End_.GetY())); - - TrackerSample_SetInfoDisplayMessage("side2End_.GetX()", - boost::lexical_cast(side2End_.GetX())); - - TrackerSample_SetInfoDisplayMessage("side2End_.GetY()", - boost::lexical_cast(side2End_.GetY())); - - TrackerSample_SetInfoDisplayMessage("p1cAngle (deg)", - boost::lexical_cast(RadiansToDegrees(p1cAngle))); - - TrackerSample_SetInfoDisplayMessage("delta (deg)", - boost::lexical_cast(RadiansToDegrees(delta))); - - TrackerSample_SetInfoDisplayMessage("theta (deg)", - boost::lexical_cast(RadiansToDegrees(theta))); - - TrackerSample_SetInfoDisplayMessage("p2cAngle (deg)", - boost::lexical_cast(RadiansToDegrees(p2cAngle))); - - TrackerSample_SetInfoDisplayMessage("ox (scene)", - boost::lexical_cast(ox)); - - TrackerSample_SetInfoDisplayMessage("offsetY (scene)", - boost::lexical_cast(oy)); - - TrackerSample_SetInfoDisplayMessage("pointX", - boost::lexical_cast(pointX)); - - TrackerSample_SetInfoDisplayMessage("pointY", - boost::lexical_cast(pointY)); - - TrackerSample_SetInfoDisplayMessage("angleDeg", - boost::lexical_cast(angleDeg)); - } -#endif - } - } - else - { - RemoveFromScene(); - } - lock->Invalidate(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/AngleMeasureTool.h --- a/Framework/Scene2DViewport/AngleMeasureTool.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "MeasureTool.h" - -#include "../Scene2DViewport/LayerHolder.h" -#include "../Scene2D/Scene2D.h" -#include "../Scene2D/ScenePoint2D.h" -#include "../Scene2D/PolylineSceneLayer.h" -#include "../Scene2D/TextSceneLayer.h" - -#include -#include -#include - -#include -#include - -namespace OrthancStone -{ - class AngleMeasureTool : public MeasureTool - { - public: - static boost::shared_ptr Create(boost::shared_ptr viewport); - - ~AngleMeasureTool(); - - void SetSide1End(ScenePoint2D start); - void SetCenter(ScenePoint2D start); - void SetSide2End(ScenePoint2D start); - - virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void ResetHighlightState() ORTHANC_OVERRIDE; - virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual boost::shared_ptr GetMemento() const ORTHANC_OVERRIDE; - virtual void SetMemento(boost::shared_ptr) ORTHANC_OVERRIDE; - virtual std::string GetDescription() ORTHANC_OVERRIDE; - - enum AngleHighlightArea - { - AngleHighlightArea_None, - AngleHighlightArea_Side1End, - AngleHighlightArea_Side1, - AngleHighlightArea_Side2End, - AngleHighlightArea_Side2, - AngleHighlightArea_Center - }; - - - AngleHighlightArea AngleHitTest(ScenePoint2D p) const; - - private: - AngleMeasureTool(boost::shared_ptr viewport); - - virtual void RefreshScene() ORTHANC_OVERRIDE; - void RemoveFromScene(); - void SetAngleHighlightArea(AngleHighlightArea area); - - private: - ScenePoint2D side1End_; - ScenePoint2D side2End_; - ScenePoint2D center_; - boost::shared_ptr layerHolder_; - AngleHighlightArea angleHighlightArea_; - }; - - class AngleMeasureToolMemento : public MeasureToolMemento - { - public: - ScenePoint2D side1End_; - ScenePoint2D side2End_; - ScenePoint2D center_; - }; -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateAngleMeasureCommand.cpp --- a/Framework/Scene2DViewport/CreateAngleMeasureCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "CreateAngleMeasureCommand.h" - -#include -#include - -namespace OrthancStone -{ - CreateAngleMeasureCommand::CreateAngleMeasureCommand( - boost::shared_ptr viewport, - ScenePoint2D point) - : CreateMeasureCommand(viewport) - , measureTool_(AngleMeasureTool::Create(viewport)) - { - - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - - controller.AddMeasureTool(measureTool_); - measureTool_->SetSide1End(point); - measureTool_->SetCenter(point); - measureTool_->SetSide2End(point); - } - - /** This method sets center*/ - void CreateAngleMeasureCommand::SetCenter(ScenePoint2D scenePos) - { - measureTool_->SetCenter(scenePos); - } - - /** This method sets end of side 2*/ - void CreateAngleMeasureCommand::SetSide2End(ScenePoint2D scenePos) - { - measureTool_->SetSide2End(scenePos); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateAngleMeasureCommand.h --- a/Framework/Scene2DViewport/CreateAngleMeasureCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "MeasureCommands.h" - -namespace OrthancStone -{ - class CreateAngleMeasureCommand : public CreateMeasureCommand - { - public: - /** Ctor sets end of side 1*/ - CreateAngleMeasureCommand( - boost::shared_ptr viewport, - ScenePoint2D point); - - /** This method sets center*/ - void SetCenter(ScenePoint2D scenePos); - - /** This method sets end of side 2*/ - void SetSide2End(ScenePoint2D scenePos); - - private: - virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE - { - return measureTool_; - } - boost::shared_ptr measureTool_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateAngleMeasureTracker.cpp --- a/Framework/Scene2DViewport/CreateAngleMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "CreateAngleMeasureTracker.h" -#include "CreateAngleMeasureCommand.h" - -#include - -namespace OrthancStone -{ - CreateAngleMeasureTracker::CreateAngleMeasureTracker( - boost::shared_ptr viewport, - const PointerEvent& e) - : CreateMeasureTracker(viewport) - , state_(CreatingSide1) - { - ScenePoint2D point = e.GetMainPosition(); - { - std::unique_ptr lock(viewport_->Lock()); - Scene2D& scene = lock->GetController().GetScene(); - point = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - } - command_.reset(new CreateAngleMeasureCommand(viewport, point)); - } - - CreateAngleMeasureTracker::~CreateAngleMeasureTracker() - { - } - - void CreateAngleMeasureTracker::PointerMove(const PointerEvent& event) - { - if (!alive_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Internal error: wrong state in CreateAngleMeasureTracker::" - "PointerMove: active_ == false"); - } - - - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - - ScenePoint2D scenePos = event.GetMainPosition().Apply( - controller.GetScene().GetCanvasToSceneTransform()); - - switch (state_) - { - case CreatingSide1: - GetCommand()->SetCenter(scenePos); - break; - case CreatingSide2: - GetCommand()->SetSide2End(scenePos); - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Wrong state in CreateAngleMeasureTracker::" - "PointerMove: state_ invalid"); - } - //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << " " << - // "scenePos.GetY() = " << scenePos.GetY(); - lock->Invalidate(); - } - } - - void CreateAngleMeasureTracker::PointerUp(const PointerEvent& e) - { - // TODO: the current app does not prevent multiple PointerDown AND - // PointerUp to be sent to the tracker. - // Unless we augment the PointerEvent structure with the button index, - // we cannot really tell if this pointer up event matches the initial - // pointer down event. Let's make it simple for now. - - switch (state_) - { - case CreatingSide1: - state_ = CreatingSide2; - break; - case CreatingSide2: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Wrong state in CreateAngleMeasureTracker::" - "PointerUp: state_ == CreatingSide2 ; this should not happen"); - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Wrong state in CreateAngleMeasureTracker::" - "PointerMove: state_ invalid"); - } - } - - void CreateAngleMeasureTracker::PointerDown(const PointerEvent& e) - { - switch (state_) - { - case CreatingSide1: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Wrong state in CreateAngleMeasureTracker::" - "PointerDown: state_ == CreatingSide1 ; this should not happen"); - break; - case CreatingSide2: - // we are done - alive_ = false; - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Wrong state in CreateAngleMeasureTracker::" - "PointerMove: state_ invalid"); - } - } - - boost::shared_ptr CreateAngleMeasureTracker::GetCommand() - { - return boost::dynamic_pointer_cast(command_); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateAngleMeasureTracker.h --- a/Framework/Scene2DViewport/CreateAngleMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "MeasureTrackers.h" -#include "MeasureCommands.h" - -#include - -namespace OrthancStone -{ - class CreateAngleMeasureTracker : public CreateMeasureTracker - { - public: - /** - When you create this tracker, you need to supply it with the undo stack - where it will store the commands that perform the actual measure tool - creation and modification. - In turn, a container for these commands to store the actual measuring - must be supplied, too - */ - CreateAngleMeasureTracker( - boost::shared_ptr viewport, - const PointerEvent& e); - - ~CreateAngleMeasureTracker(); - - virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; - - private: - boost::shared_ptr GetCommand(); - - enum State - { - CreatingSide1, - CreatingSide2, - Finished // just for debug - }; - State state_; - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateCircleMeasureTracker.cpp --- a/Framework/Scene2DViewport/CreateCircleMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -namespace OrthancStone -{ -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateCircleMeasureTracker.h --- a/Framework/Scene2DViewport/CreateCircleMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -namespace OrthancStone -{ -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateLineMeasureCommand.cpp --- a/Framework/Scene2DViewport/CreateLineMeasureCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "CreateLineMeasureCommand.h" - -#include -#include - -namespace OrthancStone -{ - CreateLineMeasureCommand::CreateLineMeasureCommand( - boost::shared_ptr viewport, - ScenePoint2D point) - : CreateMeasureCommand(viewport) - , measureTool_(LineMeasureTool::Create(viewport)) - { - - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - controller.AddMeasureTool(measureTool_); - measureTool_->Set(point, point); - lock->Invalidate(); - } - - void CreateLineMeasureCommand::SetEnd(ScenePoint2D scenePos) - { - measureTool_->SetEnd(scenePos); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateLineMeasureCommand.h --- a/Framework/Scene2DViewport/CreateLineMeasureCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "MeasureCommands.h" - -namespace OrthancStone -{ - class CreateLineMeasureCommand : public CreateMeasureCommand - { - public: - CreateLineMeasureCommand( - boost::shared_ptr viewport, - ScenePoint2D point); - - // the starting position is set in the ctor - void SetEnd(ScenePoint2D scenePos); - - private: - virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE - { - return measureTool_; - } - boost::shared_ptr measureTool_; - }; -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateLineMeasureTracker.cpp --- a/Framework/Scene2DViewport/CreateLineMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "CreateLineMeasureTracker.h" -#include "CreateLineMeasureCommand.h" - -#include - -namespace OrthancStone -{ - CreateLineMeasureTracker::CreateLineMeasureTracker( - boost::shared_ptr viewport, - const PointerEvent& e) - : CreateMeasureTracker(viewport) - { - ScenePoint2D point = e.GetMainPosition(); - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - point = e.GetMainPosition().Apply(controller.GetScene().GetCanvasToSceneTransform()); - } - command_.reset(new CreateLineMeasureCommand(viewport, point)); - } - - CreateLineMeasureTracker::~CreateLineMeasureTracker() - { - - } - - void CreateLineMeasureTracker::PointerMove(const PointerEvent& event) - { - if (!alive_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Internal error: wrong state in CreateLineMeasureTracker::" - "PointerMove: active_ == false"); - } - - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - - ScenePoint2D scenePos = event.GetMainPosition().Apply( - controller.GetScene().GetCanvasToSceneTransform()); - - //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << " " << - // "scenePos.GetY() = " << scenePos.GetY(); - - CreateLineMeasureTracker* concreteThis = - dynamic_cast(this); - assert(concreteThis != NULL); - GetCommand()->SetEnd(scenePos); - } - - void CreateLineMeasureTracker::PointerUp(const PointerEvent& e) - { - // TODO: the current app does not prevent multiple PointerDown AND - // PointerUp to be sent to the tracker. - // Unless we augment the PointerEvent structure with the button index, - // we cannot really tell if this pointer up event matches the initial - // pointer down event. Let's make it simple for now. - alive_ = false; - } - - void CreateLineMeasureTracker::PointerDown(const PointerEvent& e) - { - LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " - "are ignored when the line measure creation tracker is active"; - } - - boost::shared_ptr CreateLineMeasureTracker::GetCommand() - { - return boost::dynamic_pointer_cast(command_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateLineMeasureTracker.h --- a/Framework/Scene2DViewport/CreateLineMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "MeasureTrackers.h" - -#include -#include - -namespace OrthancStone -{ - class CreateLineMeasureTracker : public CreateMeasureTracker - { - public: - /** - When you create this tracker, you need to supply it with the undo stack - where it will store the commands that perform the actual measure tool - creation and modification. - In turn, a container for these commands to store the actual measuring - must be supplied, too - */ - CreateLineMeasureTracker( - boost::shared_ptr viewport, - const PointerEvent& e); - - ~CreateLineMeasureTracker(); - - virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; - - private: - boost::shared_ptr GetCommand(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateMeasureTracker.cpp --- a/Framework/Scene2DViewport/CreateMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateMeasureTracker.h --- a/Framework/Scene2DViewport/CreateMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/CreateSimpleTrackerAdapter.cpp --- a/Framework/Scene2DViewport/CreateSimpleTrackerAdapter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "IFlexiblePointerTracker.h" -#include "../Scene2D/IPointerTracker.h" - - -namespace OrthancStone -{ -#if 0 - namespace - { - class SimpleTrackerAdapter : public IFlexiblePointerTracker - { - public: - SimpleTrackerAdapter(boost::shared_ptr wrappedTracker) - : wrappedTracker_(wrappedTracker) - , active_(true) - { - } - - virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE - { - if(active_) - wrappedTracker_->Update(event); - }; - virtual void PointerUp(const PointerEvent& event) ORTHANC_OVERRIDE - { - if (wrappedTracker_) - { - wrappedTracker_->Release(); - wrappedTracker_ = NULL; - } - active_ = false; - } - virtual void PointerDown(const PointerEvent& event) ORTHANC_OVERRIDE - { - // nothing to do atm - } - virtual bool IsActive() const ORTHANC_OVERRIDE - { - return active_; - } - - virtual void Cancel() ORTHANC_OVERRIDE - { - wrappedTracker_ = NULL; - active_ = false; - } - - private: - boost::shared_ptr wrappedTracker_; - bool active_; - }; - } - - boost::shared_ptr CreateSimpleTrackerAdapter(boost::shared_ptr t) - { - return boost::shared_ptr(new SimpleTrackerAdapter(t)); - } -#endif -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditAngleMeasureCommand.cpp --- a/Framework/Scene2DViewport/EditAngleMeasureCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "EditAngleMeasureCommand.h" - -namespace OrthancStone -{ - EditAngleMeasureCommand::EditAngleMeasureCommand( - boost::shared_ptr measureTool, - boost::shared_ptr viewport) - : EditMeasureCommand(measureTool, viewport) - , measureTool_(measureTool) - { - } - - void EditAngleMeasureCommand::SetCenter(ScenePoint2D scenePos) - { - dynamic_cast(*measureTool_).SetCenter(scenePos); - mementoModified_ = measureTool_->GetMemento(); - } - - - void EditAngleMeasureCommand::SetSide1End(ScenePoint2D scenePos) - { - dynamic_cast(*measureTool_).SetSide1End(scenePos); - mementoModified_ = measureTool_->GetMemento(); - } - - - void EditAngleMeasureCommand::SetSide2End(ScenePoint2D scenePos) - { - dynamic_cast(*measureTool_).SetSide2End(scenePos); - mementoModified_ = measureTool_->GetMemento(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditAngleMeasureCommand.h --- a/Framework/Scene2DViewport/EditAngleMeasureCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "MeasureCommands.h" - -namespace OrthancStone -{ - class EditAngleMeasureCommand : public EditMeasureCommand - { - public: - /** Ctor sets end of side 1*/ - EditAngleMeasureCommand( - boost::shared_ptr measureTool, - boost::shared_ptr viewport); - - /** This method sets center*/ - void SetCenter(ScenePoint2D scenePos); - - /** This method sets end of side 1*/ - void SetSide1End(ScenePoint2D scenePos); - - /** This method sets end of side 2*/ - void SetSide2End(ScenePoint2D scenePos); - - private: - virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE - { - return measureTool_; - } - boost::shared_ptr measureTool_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditAngleMeasureTracker.cpp --- a/Framework/Scene2DViewport/EditAngleMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "EditAngleMeasureTracker.h" -#include "EditAngleMeasureCommand.h" - -#include "../StoneException.h" - -namespace OrthancStone -{ - EditAngleMeasureTracker::EditAngleMeasureTracker( - boost::shared_ptr measureTool, - boost::shared_ptr viewport, - const PointerEvent& e) - : EditMeasureTracker(viewport, e) - { - ScenePoint2D scenePos = e.GetMainPosition(); - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - scenePos = e.GetMainPosition().Apply(controller.GetScene().GetCanvasToSceneTransform()); - } - modifiedZone_ = dynamic_cast(*measureTool).AngleHitTest(scenePos); - command_.reset(new EditAngleMeasureCommand(measureTool, viewport)); - } - - EditAngleMeasureTracker::~EditAngleMeasureTracker() - { - - } - - void EditAngleMeasureTracker::PointerMove(const PointerEvent& e) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - scene.GetCanvasToSceneTransform()); - - ScenePoint2D delta = scenePos - GetOriginalClickPosition(); - - boost::shared_ptr memento = - boost::dynamic_pointer_cast(command_->mementoOriginal_); - - ORTHANC_ASSERT(memento.get() != NULL); - - switch (modifiedZone_) - { - case AngleMeasureTool::AngleHighlightArea_Center: - { - ScenePoint2D newCenter = memento->center_ + delta; - GetCommand()->SetCenter(newCenter); - } - break; - case AngleMeasureTool::AngleHighlightArea_Side1: - case AngleMeasureTool::AngleHighlightArea_Side2: - { - ScenePoint2D newCenter = memento->center_ + delta; - ScenePoint2D newSide1End = memento->side1End_ + delta; - ScenePoint2D newSide2End = memento->side2End_ + delta; - GetCommand()->SetCenter(newCenter); - GetCommand()->SetSide1End(newSide1End); - GetCommand()->SetSide2End(newSide2End); - } - break; - case AngleMeasureTool::AngleHighlightArea_Side1End: - { - ScenePoint2D newSide1End = memento->side1End_ + delta; - GetCommand()->SetSide1End(newSide1End); - } - break; - case AngleMeasureTool::AngleHighlightArea_Side2End: - { - ScenePoint2D newSide2End = memento->side2End_ + delta; - GetCommand()->SetSide2End(newSide2End); - } - break; - default: - LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; - break; - } - } - - void EditAngleMeasureTracker::PointerUp(const PointerEvent& e) - { - alive_ = false; - } - - void EditAngleMeasureTracker::PointerDown(const PointerEvent& e) - { - LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " - "are ignored when the edit angle tracker is active"; - } - - boost::shared_ptr EditAngleMeasureTracker::GetCommand() - { - boost::shared_ptr ret = boost::dynamic_pointer_cast(command_); - ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditAngleMeasureTracker::GetCommand()"); - return ret; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditAngleMeasureTracker.h --- a/Framework/Scene2DViewport/EditAngleMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "MeasureTrackers.h" - -namespace OrthancStone -{ - class EditAngleMeasureCommand; - - class EditAngleMeasureTracker : public EditMeasureTracker - { - public: - /** - When you create this tracker, you need to supply it with the undo stack - where it will store the commands that perform the actual measure tool - creation and modification. - In turn, a container for these commands to store the actual measuring - must be supplied, too - */ - EditAngleMeasureTracker( - boost::shared_ptr measureTool, - boost::shared_ptr viewport, - const PointerEvent& e); - - ~EditAngleMeasureTracker(); - - virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; - - private: - AngleMeasureTool::AngleHighlightArea modifiedZone_; - - boost::shared_ptr GetCommand(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditLineMeasureCommand.cpp --- a/Framework/Scene2DViewport/EditLineMeasureCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "EditLineMeasureCommand.h" - -namespace OrthancStone -{ - EditLineMeasureCommand::EditLineMeasureCommand( - boost::shared_ptr measureTool, - boost::shared_ptr viewport) - : EditMeasureCommand(measureTool, viewport) - , measureTool_(measureTool) - { - } - - - void EditLineMeasureCommand::SetStart(ScenePoint2D scenePos) - { - dynamic_cast(*measureTool_).SetStart(scenePos); - mementoModified_ = measureTool_->GetMemento(); - } - - - void EditLineMeasureCommand::SetEnd(ScenePoint2D scenePos) - { - dynamic_cast(*measureTool_).SetEnd(scenePos); - mementoModified_ = measureTool_->GetMemento(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditLineMeasureCommand.h --- a/Framework/Scene2DViewport/EditLineMeasureCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "MeasureCommands.h" - -namespace OrthancStone -{ - class EditLineMeasureCommand : public EditMeasureCommand - { - public: - EditLineMeasureCommand( - boost::shared_ptr measureTool, - boost::shared_ptr viewport); - - void SetStart(ScenePoint2D scenePos); - void SetEnd(ScenePoint2D scenePos); - - private: - virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE - { - return measureTool_; - } - boost::shared_ptr measureTool_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditLineMeasureTracker.cpp --- a/Framework/Scene2DViewport/EditLineMeasureTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "EditLineMeasureTracker.h" -#include "EditLineMeasureCommand.h" - -#include "../StoneException.h" - - -namespace OrthancStone -{ - EditLineMeasureTracker::EditLineMeasureTracker( - boost::shared_ptr measureTool, - boost::shared_ptr viewport, - const PointerEvent& e) - : EditMeasureTracker(viewport, e) - { - ScenePoint2D scenePos = e.GetMainPosition(); - { - std::unique_ptr lock(viewport_->Lock()); - Scene2D& scene = lock->GetController().GetScene(); - scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - } - modifiedZone_ = dynamic_cast(*measureTool).LineHitTest(scenePos); - command_.reset(new EditLineMeasureCommand(measureTool, viewport)); - } - - EditLineMeasureTracker::~EditLineMeasureTracker() - { - - } - - void EditLineMeasureTracker::PointerMove(const PointerEvent& e) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - scene.GetCanvasToSceneTransform()); - - ScenePoint2D delta = scenePos - GetOriginalClickPosition(); - - boost::shared_ptr memento = - boost::dynamic_pointer_cast(command_->mementoOriginal_); - - ORTHANC_ASSERT(memento.get() != NULL); - - switch (modifiedZone_) - { - case LineMeasureTool::LineHighlightArea_Start: - { - ScenePoint2D newStart = memento->start_ + delta; - GetCommand()->SetStart(newStart); - } - break; - case LineMeasureTool::LineHighlightArea_End: - { - ScenePoint2D newEnd = memento->end_ + delta; - GetCommand()->SetEnd(newEnd); - } - break; - case LineMeasureTool::LineHighlightArea_Segment: - { - ScenePoint2D newStart = memento->start_ + delta; - ScenePoint2D newEnd = memento->end_ + delta; - GetCommand()->SetStart(newStart); - GetCommand()->SetEnd(newEnd); - } - break; - default: - LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; - break; - } - } - - void EditLineMeasureTracker::PointerUp(const PointerEvent& e) - { - alive_ = false; - } - - void EditLineMeasureTracker::PointerDown(const PointerEvent& e) - { - LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " - "are ignored when the edit line tracker is active"; - } - - boost::shared_ptr EditLineMeasureTracker::GetCommand() - { - boost::shared_ptr ret = boost::dynamic_pointer_cast(command_); - ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditLineMeasureTracker::GetCommand()"); - return ret; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/EditLineMeasureTracker.h --- a/Framework/Scene2DViewport/EditLineMeasureTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "MeasureTrackers.h" - -namespace OrthancStone -{ - class EditLineMeasureCommand; - - class EditLineMeasureTracker : public EditMeasureTracker - { - public: - /** - When you create this tracker, you need to supply it with the undo stack - where it will store the commands that perform the actual measure tool - creation and modification. - In turn, a container for these commands to store the actual measuring - must be supplied, too - */ - EditLineMeasureTracker( - boost::shared_ptr measureTool, - boost::shared_ptr viewport, - const PointerEvent& e); - - ~EditLineMeasureTracker(); - - virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; - - private: - LineMeasureTool::LineHighlightArea modifiedZone_; - - boost::shared_ptr GetCommand(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/IFlexiblePointerTracker.h --- a/Framework/Scene2DViewport/IFlexiblePointerTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "PredeclaredTypes.h" - -#include "../Scene2D/PointerEvent.h" - - -namespace OrthancStone -{ - /** - This interface represents a flexible mouse tracker that can respond to - several events and is not automatically deleted upon mouse up or when touch - interaction is suspended : for instance, a stateful tracker with a two-step - interaction like: click & drag --> mouse up --> drag --> mouse click - (for instance, for an angle measuring tracker or an ellipse tracker) - */ - class IFlexiblePointerTracker : public boost::noncopyable - { - public: - virtual ~IFlexiblePointerTracker() {} - - /** - This method will be repeatedly called during user interaction - */ - virtual void PointerMove(const PointerEvent& event) = 0; - - /** - This method will be called when a touch/pointer is removed (mouse up, - pen lift, finger removed...) - */ - virtual void PointerUp(const PointerEvent& event) = 0; - - /** - This method will be called when a touch/pointer is added (mouse down, - pen or finger press) - - Important note: the initial pointer down that leads to creating the - tracker is NOT sent to the tracker. - - Thus, if you count the PointerDown vs PointerUp, there will be an extra - PointerUp. - */ - virtual void PointerDown(const PointerEvent& event) = 0; - - /** - This method will be repeatedly called by the tracker owner (for instance, - the application) to check whether the tracker must keep on receiving - interaction or if its job is done and it should be deleted. - */ - virtual bool IsAlive() const = 0; - - /** - This will be called if the tracker needs to be dismissed without committing - its changes to the underlying model. If the model has been modified during - tracker lifetime, it must be restored to its initial value - */ - virtual void Cancel() = 0; - }; - - - /** - This factory adopts the supplied simple tracker and creates a flexible - tracker wrapper around it. - */ - boost::shared_ptr CreateSimpleTrackerAdapter(boost::shared_ptr); -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/LayerHolder.cpp --- a/Framework/Scene2DViewport/LayerHolder.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,149 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "LayerHolder.h" -#include "../Scene2D/TextSceneLayer.h" -#include "../Scene2D/PolylineSceneLayer.h" -#include "../Scene2D/Scene2D.h" -#include "../Viewport/IViewport.h" -#include "../StoneException.h" - -namespace OrthancStone -{ - LayerHolder::LayerHolder( - boost::shared_ptr viewport, - int polylineLayerCount, - int textLayerCount, - int infoTextCount) - : textLayerCount_(textLayerCount) - , polylineLayerCount_(polylineLayerCount) - , infoTextCount_(infoTextCount) - , viewport_(viewport) - , baseLayerIndex_(-1) - { - - } - - void LayerHolder::CreateLayers() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - assert(baseLayerIndex_ == -1); - - baseLayerIndex_ = scene.GetMaxDepth() + 100; - - for (int i = 0; i < polylineLayerCount_; ++i) - { - std::unique_ptr layer(new PolylineSceneLayer()); - scene.SetLayer(baseLayerIndex_ + i, layer.release()); - } - - for (int i = 0; i < textLayerCount_; ++i) - { - std::unique_ptr layer(new TextSceneLayer()); - scene.SetLayer(baseLayerIndex_ + polylineLayerCount_ + i, layer.release()); - } - lock->Invalidate(); - } - - void LayerHolder::CreateLayersIfNeeded() - { - if (baseLayerIndex_ == -1) - CreateLayers(); - } - - bool LayerHolder::AreLayersCreated() const - { - return (baseLayerIndex_ != -1); - } - - void LayerHolder::DeleteLayersIfNeeded() - { - if (baseLayerIndex_ != -1) - DeleteLayers(); - } - - void LayerHolder::DeleteLayers() - { - std::unique_ptr lock(viewport_->Lock()); - Scene2D& scene = lock->GetController().GetScene(); - - for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i) - { - ORTHANC_ASSERT(scene.HasLayer(baseLayerIndex_ + i), "No layer"); - scene.DeleteLayer(baseLayerIndex_ + i); - } - baseLayerIndex_ = -1; - lock->Invalidate(); - } - - PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/) - { - std::unique_ptr lock(viewport_->Lock()); - Scene2D& scene = lock->GetController().GetScene(); - - using namespace Orthanc; - ORTHANC_ASSERT(baseLayerIndex_ != -1); - ORTHANC_ASSERT(scene.HasLayer(GetPolylineLayerIndex(index))); - ISceneLayer* layer = &(scene.GetLayer(GetPolylineLayerIndex(index))); - - PolylineSceneLayer* concreteLayer = - dynamic_cast(layer); - - ORTHANC_ASSERT(concreteLayer != NULL); - return concreteLayer; - } - - TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/) - { - std::unique_ptr lock(viewport_->Lock()); - Scene2D& scene = lock->GetController().GetScene(); - - using namespace Orthanc; - ORTHANC_ASSERT(baseLayerIndex_ != -1); - ORTHANC_ASSERT(scene.HasLayer(GetTextLayerIndex(index))); - ISceneLayer* layer = &(scene.GetLayer(GetTextLayerIndex(index))); - - TextSceneLayer* concreteLayer = - dynamic_cast(layer); - - ORTHANC_ASSERT(concreteLayer != NULL); - return concreteLayer; - } - - int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/) - { - using namespace Orthanc; - ORTHANC_ASSERT(index < polylineLayerCount_); - return baseLayerIndex_ + index; - } - - int LayerHolder::GetTextLayerIndex(int index /*= 0*/) - { - using namespace Orthanc; - ORTHANC_ASSERT(index < textLayerCount_); - - // the text layers are placed right after the polyline layers - // this means they are drawn ON TOP - return baseLayerIndex_ + polylineLayerCount_ + index; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/LayerHolder.h --- a/Framework/Scene2DViewport/LayerHolder.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "PredeclaredTypes.h" - -#include -#include -#include - -namespace OrthancStone -{ - class PolylineSceneLayer; - class TextSceneLayer; - - /** - This class holds the indices of a set a layer and supplies - getters to the concrete layer objects. Sounds very ad hoc, and it is. - */ - class LayerHolder : public boost::noncopyable - { - public: - /** - This ctor merely stores the scene and layer counts. No layer creation - performed at this time - */ - LayerHolder( - boost::shared_ptr viewport, - int polylineLayerCount, int textLayerCount, int infoTextCount = 0); - - /** - This actually creates the layers - */ - void CreateLayers(); - - /** - This creates the layers if they are not created yet. Can be useful in - some scenarios - */ - void CreateLayersIfNeeded(); - - /** - Whether the various text and polylines layers have all been created or - none at all - */ - bool AreLayersCreated() const; - - /** - This removes the layers from the scene - */ - void DeleteLayers(); - - /** - This removes the layers from the scene if they are already created - */ - void DeleteLayersIfNeeded(); - - /** - Please note that the returned pointer belongs to the scene.Don't you dare - storing or deleting it, you fool! - - This throws if the index is not valid or if the layers are not created or - have been deleted - */ - PolylineSceneLayer* GetPolylineLayer(int index = 0); - - /** - Please note that the returned pointer belongs to the scene. Don't you dare - storing or deleting it, you fool! - - This throws if the index is not valid or if the layers are not created or - have been deleted - */ - TextSceneLayer* GetTextLayer(int index = 0); - - //TextSceneLayer* GetTextLayer(int index = 0); - - private: - int GetPolylineLayerIndex(int index = 0); - int GetTextLayerIndex(int index = 0); - int GetInfoTextLayerIndex(int index = 0); - - int textLayerCount_; - int polylineLayerCount_; - int infoTextCount_; - boost::shared_ptr viewport_; - int baseLayerIndex_; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/LineMeasureTool.cpp --- a/Framework/Scene2DViewport/LineMeasureTool.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,293 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "LineMeasureTool.h" -#include "MeasureToolsToolbox.h" -#include "EditLineMeasureTracker.h" -#include "LayerHolder.h" -#include "../StoneException.h" - -#include - -#include - -namespace OrthancStone -{ - - LineMeasureTool::LineMeasureTool( - boost::shared_ptr viewport) - : MeasureTool(viewport) -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,5))) -#else - , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,1))) -#endif - , lineHighlightArea_(LineHighlightArea_None) - { - - } - - boost::shared_ptr LineMeasureTool::Create(boost::shared_ptr viewport) - { - boost::shared_ptr obj(new LineMeasureTool(viewport)); - obj->MeasureTool::PostConstructor(); - obj->RefreshScene(); - return obj; - } - - LineMeasureTool::~LineMeasureTool() - { - // this measuring tool is a RABI for the corresponding visual layers - // stored in the 2D scene - Disable(); - RemoveFromScene(); - } - - void LineMeasureTool::RemoveFromScene() - { - if (layerHolder_->AreLayersCreated() && IsSceneAlive()) - { - layerHolder_->DeleteLayers(); - } - } - - void LineMeasureTool::SetStart(ScenePoint2D start) - { - start_ = start; - RefreshScene(); - } - - void LineMeasureTool::SetEnd(ScenePoint2D end) - { - end_ = end; - RefreshScene(); - } - - void LineMeasureTool::Set(ScenePoint2D start, ScenePoint2D end) - { - start_ = start; - end_ = end; - RefreshScene(); - } - - void LineMeasureTool::SetLineHighlightArea(LineHighlightArea area) - { - if (lineHighlightArea_ != area) - { - lineHighlightArea_ = area; - RefreshScene(); - } - } - - std::string LineMeasureTool::GetDescription() - { - std::stringstream ss; - ss << "LineMeasureTool. Start = " << start_ << " End = " << end_; - return ss.str(); - } - - void LineMeasureTool::ResetHighlightState() - { - SetLineHighlightArea(LineHighlightArea_None); - } - - void LineMeasureTool::Highlight(ScenePoint2D p) - { - LineHighlightArea lineHighlightArea = LineHitTest(p); - SetLineHighlightArea(lineHighlightArea); - } - - LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); - const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; - - const double sqDistanceFromStart = - ScenePoint2D::SquaredDistancePtPt(p, start_); - - if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_Start; - - const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); - - if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_End; - - const double sqDistanceFromPtSegment = - ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); - - if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_Segment; - - return LineHighlightArea_None; - } - - bool LineMeasureTool::HitTest(ScenePoint2D p) - { - return LineHitTest(p) != LineHighlightArea_None; - } - - boost::shared_ptr LineMeasureTool::CreateEditionTracker(const PointerEvent& e) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - scene.GetCanvasToSceneTransform()); - - if (!HitTest(scenePos)) - return boost::shared_ptr(); - - boost::shared_ptr editLineMeasureTracker( - new EditLineMeasureTracker(shared_from_this(), viewport_, e)); - return editLineMeasureTracker; - } - - boost::shared_ptr LineMeasureTool::GetMemento() const - { - boost::shared_ptr memento(new LineMeasureToolMemento()); - memento->start_ = start_; - memento->end_ = end_; - return memento; - } - - void LineMeasureTool::SetMemento( - boost::shared_ptr mementoBase) - { - boost::shared_ptr memento = - boost::dynamic_pointer_cast(mementoBase); - - ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); - - start_ = memento->start_; - end_ = memento->end_; - RefreshScene(); - } - - void LineMeasureTool::RefreshScene() - { - if (IsSceneAlive()) - { - if (IsEnabled()) - { - - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - layerHolder_->CreateLayersIfNeeded(); - { - // Fill the polyline layer with the measurement line - - PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); - if (polylineLayer) - { - polylineLayer->ClearAllChains(); - - const Color color(TOOL_LINES_COLOR_RED, - TOOL_LINES_COLOR_GREEN, - TOOL_LINES_COLOR_BLUE); - - const Color highlightColor(TOOL_LINES_HL_COLOR_RED, - TOOL_LINES_HL_COLOR_GREEN, - TOOL_LINES_HL_COLOR_BLUE); - - { - PolylineSceneLayer::Chain chain; - chain.push_back(start_); - chain.push_back(end_); - if(lineHighlightArea_ == LineHighlightArea_Segment) - polylineLayer->AddChain(chain, false, highlightColor); - else - polylineLayer->AddChain(chain, false, color); - } - - // handles - { - { - PolylineSceneLayer::Chain chain; - - //TODO: take DPI into account - AddSquare(chain, controller.GetScene(), start_, - controller.GetHandleSideLengthS()); - - if (lineHighlightArea_ == LineHighlightArea_Start) - polylineLayer->AddChain(chain, true, highlightColor); - else - polylineLayer->AddChain(chain, true, color); - } - - { - PolylineSceneLayer::Chain chain; - - //TODO: take DPI into account - AddSquare(chain, controller.GetScene(), end_, - controller.GetHandleSideLengthS()); - - if (lineHighlightArea_ == LineHighlightArea_End) - polylineLayer->AddChain(chain, true, highlightColor); - else - polylineLayer->AddChain(chain, true, color); - } - } - } - } - { - // Set the text layer propreties - double deltaX = end_.GetX() - start_.GetX(); - double deltaY = end_.GetY() - start_.GetY(); - double squareDist = deltaX * deltaX + deltaY * deltaY; - double dist = sqrt(squareDist); - char buf[64]; - sprintf(buf, "%0.02f mm", dist); - - // TODO: for now we simply position the text overlay at the middle - // of the measuring segment - double midX = 0.5 * (end_.GetX() + start_.GetX()); - double midY = 0.5 * (end_.GetY() + start_.GetY()); - - { - -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - SetTextLayerOutlineProperties( - scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); -#else - SetTextLayerProperties( - scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); -#endif - lock->Invalidate(); - } - } - lock->Invalidate(); - } - else - { - RemoveFromScene(); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/LineMeasureTool.h --- a/Framework/Scene2DViewport/LineMeasureTool.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../Scene2D/PolylineSceneLayer.h" -#include "../Scene2D/Scene2D.h" -#include "../Scene2D/ScenePoint2D.h" -#include "../Scene2D/TextSceneLayer.h" -#include "MeasureTool.h" - -#include -#include -#include - -#include -#include - -namespace OrthancStone -{ - class LineMeasureTool : public MeasureTool - { - public: - static boost::shared_ptr Create(boost::shared_ptr viewport); - - ~LineMeasureTool(); - - void SetStart(ScenePoint2D start); - void SetEnd(ScenePoint2D end); - void Set(ScenePoint2D start, ScenePoint2D end); - - - virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void ResetHighlightState() ORTHANC_OVERRIDE; - virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE; - virtual boost::shared_ptr GetMemento() const ORTHANC_OVERRIDE; - virtual void SetMemento(boost::shared_ptr) ORTHANC_OVERRIDE; - virtual std::string GetDescription() ORTHANC_OVERRIDE; - - enum LineHighlightArea - { - LineHighlightArea_None, - LineHighlightArea_Start, - LineHighlightArea_End, - LineHighlightArea_Segment - }; - - - LineHighlightArea LineHitTest(ScenePoint2D p); - - private: - LineMeasureTool(boost::shared_ptr viewport); - - virtual void RefreshScene() ORTHANC_OVERRIDE; - void RemoveFromScene(); - void SetLineHighlightArea(LineHighlightArea area); - - private: - - private: - ScenePoint2D start_; - ScenePoint2D end_; - boost::shared_ptr layerHolder_; - int baseLayerIndex_; - LineHighlightArea lineHighlightArea_; - }; - - class LineMeasureToolMemento : public MeasureToolMemento - { - public: - ScenePoint2D start_; - ScenePoint2D end_; - }; - -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureCommands.cpp --- a/Framework/Scene2DViewport/MeasureCommands.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MeasureCommands.h" - -#include - -#include -#include - -namespace OrthancStone -{ - void CreateMeasureCommand::Undo() - { - std::unique_ptr lock(viewport_->Lock()); - // simply disable the measure tool upon undo - GetMeasureTool()->Disable(); - lock->GetController().RemoveMeasureTool(GetMeasureTool()); - } - - void CreateMeasureCommand::Redo() - { - std::unique_ptr lock(viewport_->Lock()); - GetMeasureTool()->Enable(); - lock->GetController().AddMeasureTool(GetMeasureTool()); - } - - CreateMeasureCommand::CreateMeasureCommand(boost::shared_ptr viewport) - : MeasureCommand(viewport) - { - - } - - CreateMeasureCommand::~CreateMeasureCommand() - { - // deleting the command should not change the model state - // we thus leave it as is - } - - void DeleteMeasureCommand::Redo() - { - std::unique_ptr lock(viewport_->Lock()); - // simply disable the measure tool upon undo - GetMeasureTool()->Disable(); - lock->GetController().RemoveMeasureTool(GetMeasureTool()); - } - - void DeleteMeasureCommand::Undo() - { - std::unique_ptr lock(viewport_->Lock()); - GetMeasureTool()->Enable(); - lock->GetController().AddMeasureTool(GetMeasureTool()); - } - - DeleteMeasureCommand::~DeleteMeasureCommand() - { - // deleting the command should not change the model state - // we thus leave it as is - } - - DeleteMeasureCommand::DeleteMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport) - : MeasureCommand(viewport) - , mementoOriginal_(measureTool->GetMemento()) - , measureTool_(measureTool) - , mementoModified_(measureTool->GetMemento()) - { - std::unique_ptr lock(viewport_->Lock()); - GetMeasureTool()->Disable(); - lock->GetController().RemoveMeasureTool(GetMeasureTool()); - } - - EditMeasureCommand::EditMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport) - : MeasureCommand(viewport) - , mementoOriginal_(measureTool->GetMemento()) - , mementoModified_(measureTool->GetMemento()) - { - - } - - EditMeasureCommand::~EditMeasureCommand() - { - - } - - void EditMeasureCommand::Undo() - { - // simply disable the measure tool upon undo - GetMeasureTool()->SetMemento(mementoOriginal_); - } - - void EditMeasureCommand::Redo() - { - GetMeasureTool()->SetMemento(mementoModified_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureCommands.h --- a/Framework/Scene2DViewport/MeasureCommands.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "../Viewport/IViewport.h" - -// to be moved into Stone -#include "PredeclaredTypes.h" -#include "MeasureTool.h" -#include "LineMeasureTool.h" -#include "AngleMeasureTool.h" - -#include -#include - -namespace OrthancStone -{ - class MeasureCommand : public boost::noncopyable - { - public: - MeasureCommand(boost::shared_ptr viewport) : viewport_(viewport) - {} - virtual void Undo() = 0; - virtual void Redo() = 0; - - virtual ~MeasureCommand() {}; - - protected: - boost::shared_ptr viewport_; - }; - - class CreateMeasureCommand : public MeasureCommand - { - public: - CreateMeasureCommand(boost::shared_ptr viewport); - virtual ~CreateMeasureCommand(); - virtual void Undo() ORTHANC_OVERRIDE; - virtual void Redo() ORTHANC_OVERRIDE; - private: - /** Must be implemented by the subclasses that create the actual tool */ - virtual boost::shared_ptr GetMeasureTool() = 0; - }; - - class EditMeasureCommand : public MeasureCommand - { - public: - EditMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport); - virtual ~EditMeasureCommand(); - virtual void Undo() ORTHANC_OVERRIDE; - virtual void Redo() ORTHANC_OVERRIDE; - - /** This memento is the original object state */ - boost::shared_ptr mementoOriginal_; - - private: - /** Must be implemented by the subclasses that edit the actual tool */ - virtual boost::shared_ptr GetMeasureTool() = 0; - - protected: - - /** This memento is updated by the subclasses upon modifications */ - boost::shared_ptr mementoModified_; - }; - - class DeleteMeasureCommand : public MeasureCommand - { - public: - DeleteMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport); - virtual ~DeleteMeasureCommand(); - virtual void Undo() ORTHANC_OVERRIDE; - virtual void Redo() ORTHANC_OVERRIDE; - - /** This memento is the original object state */ - boost::shared_ptr mementoOriginal_; - - private: - /** Must be implemented by the subclasses that edit the actual tool */ - virtual boost::shared_ptr GetMeasureTool() - { - return measureTool_; - } - - boost::shared_ptr measureTool_; - - protected: - - /** This memento is updated by the subclasses upon modifications */ - boost::shared_ptr mementoModified_; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureTool.cpp --- a/Framework/Scene2DViewport/MeasureTool.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MeasureTool.h" - -#include -#include -#include - -#include - -#include "../Viewport/IViewport.h" - -namespace OrthancStone -{ - void MeasureTool::Enable() - { - enabled_ = true; - RefreshScene(); - } - - void MeasureTool::Disable() - { - enabled_ = false; - RefreshScene(); - } - - bool MeasureTool::IsEnabled() const - { - return enabled_; - } - - MeasureTool::MeasureTool( - boost::shared_ptr viewport) - : viewport_(viewport) - , enabled_(true) - { - - } - - void MeasureTool::PostConstructor() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - - Register( - controller, - &MeasureTool::OnSceneTransformChanged); - } - - bool MeasureTool::IsSceneAlive() const - { - // since the lifetimes of the viewport, viewportcontroller (and the - // measuring tools inside it) are linked, the scene is always alive as - // long as "this" is alive - return true; - } - - void MeasureTool::OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message) - { - RefreshScene(); - } - - -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureTool.h --- a/Framework/Scene2DViewport/MeasureTool.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../Messages/ObserverBase.h" -#include "../Scene2D/PolylineSceneLayer.h" -#include "../Scene2D/Scene2D.h" -#include "../Scene2D/ScenePoint2D.h" -#include "../Scene2D/TextSceneLayer.h" -#include "../Scene2DViewport/PredeclaredTypes.h" -#include "../Scene2DViewport/ViewportController.h" - -#include - -#include -#include - -namespace OrthancStone -{ - class IFlexiblePointerTracker; - class MeasureToolMemento; - - class MeasureTool : public ObserverBase - { - public: - virtual ~MeasureTool() - { - } - - /** - Enabled tools are rendered in the scene. - */ - void Enable(); - - /** - Disabled tools are not rendered in the scene. This is useful to be able - to use them as their own memento in command stacks (when a measure tool - creation command has been undone, the measure remains alive in the - command object but is disabled so that it can be redone later on easily) - */ - void Disable(); - - /** - This method is called when the scene transform changes. It allows to - recompute the visual elements whose content depend upon the scene transform - */ - void OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message); - - /** - This function must be implemented by the measuring tool to return whether - a given point in scene coords is close to the measuring tool. - - This is used for mouse hover highlighting. - - It is assumed that if the pointer position leads to this function returning - true, then a click at that position will return a tracker to edit the - measuring tool - */ - virtual bool HitTest(ScenePoint2D p) = 0; - - /** - This method must return a memento the captures the tool state (not including - the highlighting state - */ - virtual boost::shared_ptr GetMemento() const = 0; - - /** - This method must apply the supplied memento (this requires RTTI to check - the type) - */ - virtual void SetMemento(boost::shared_ptr) = 0; - - /** - This must create an edition tracker suitable for the supplied click position, - or an empty pointer if no hit test (although this should have been checked - first) - */ - virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) = 0; - - /** - Will change the measuring tool to provide visual feedback on the GUI - element that is in the pointer hit zone - */ - virtual void Highlight(ScenePoint2D p) = 0; - - /** - This function must reset the visual highlighted hot zone feedback - */ - virtual void ResetHighlightState() = 0; - - /** - A description of the measuring tool, useful in debug logs - */ - virtual std::string GetDescription() = 0; - - protected: - MeasureTool(boost::shared_ptr viewport); - - void PostConstructor(); - - /** - The measuring tool may exist in a standalone fashion, without any available - scene (because the controller is dead or dying). This call allows to check - before accessing the scene. - */ - bool IsSceneAlive() const; - - /** - This is the meat of the tool: this method must [create (if needed) and] - update the layers and their data according to the measure tool kind and - current state. This is repeatedly called during user interaction - */ - virtual void RefreshScene() = 0; - - /** - enabled_ is not accessible by subclasses because there is a state machine - that we do not wanna mess with - */ - bool IsEnabled() const; - - /** - Protected to allow sub-classes to use this weak pointer in factory methods - (pass them to created objects) - */ - boost::shared_ptr viewport_; - - - private: - bool enabled_; - }; - - class MeasureToolMemento - { - public: - virtual ~MeasureToolMemento() {}; - }; - -} - - //extern void TrackerSample_SetInfoDisplayMessage( - // std::string key, std::string value); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureToolsToolbox.cpp --- a/Framework/Scene2DViewport/MeasureToolsToolbox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,366 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MeasureToolsToolbox.h" -#include "PredeclaredTypes.h" -#include "LayerHolder.h" -#include "ViewportController.h" - -#include "../Scene2D/TextSceneLayer.h" -#include "../Scene2D/Scene2D.h" -#include "../StoneException.h" - -#include - -namespace -{ - double g_pi = boost::math::constants::pi(); -} - -namespace OrthancStone -{ - void GetPositionOnBisectingLine( - ScenePoint2D& result - , const ScenePoint2D& p1 - , const ScenePoint2D& c - , const ScenePoint2D& p2 - , const double d) - { - // TODO: fix correct half-plane - double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); - double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); - double angle = 0.5 * (p1cAngle + p2cAngle); - double unitVectorX = cos(angle); - double unitVectorY = sin(angle); - double posX = c.GetX() + d * unitVectorX; - double posY = c.GetX() + d * unitVectorY; - result = ScenePoint2D(posX, posY); - } - - double RadiansToDegrees(double angleRad) - { - static const double factor = 180.0 / g_pi; - return angleRad * factor; - } - - void AddSquare(PolylineSceneLayer::Chain& chain, - const Scene2D& scene, - const ScenePoint2D& centerS, - const double& sideLengthS) - { - /* - The scene is required here because we need to draw the square with its - sides parallel to the SCREEN axis, not the SCENE axis - */ - - // get the scaling factor - const double sceneToCanvas = - scene.GetSceneToCanvasTransform().ComputeZoom(); - - chain.clear(); - chain.reserve(4); - ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); - //TODO: take DPI into account - double handleLX = centerC.GetX() - sideLengthS * sceneToCanvas * 0.5; - double handleTY = centerC.GetY() - sideLengthS * sceneToCanvas * 0.5; - double handleRX = centerC.GetX() + sideLengthS * sceneToCanvas * 0.5; - double handleBY = centerC.GetY() + sideLengthS * sceneToCanvas * 0.5; - ScenePoint2D LTC(handleLX, handleTY); - ScenePoint2D RTC(handleRX, handleTY); - ScenePoint2D RBC(handleRX, handleBY); - ScenePoint2D LBC(handleLX, handleBY); - - ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); - - chain.push_back(startLT); - chain.push_back(startRT); - chain.push_back(startRB); - chain.push_back(startLB); - } -#if 0 - void AddArc( - PolylineSceneLayer::Chain & chain - , const Scene2D & scene - , const ScenePoint2D & p1 - , const ScenePoint2D & c - , const ScenePoint2D & p2 - , const double& radiusS - , const bool clockwise - , const int subdivisionsCount) - { - double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); - double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); - AddArc( - chain, scene, c, radiusS, p1cAngle, p2cAngle, - clockwise, subdivisionsCount); - } -#endif - - void AddShortestArc( - PolylineSceneLayer::Chain& chain - , const ScenePoint2D& p1 - , const ScenePoint2D& c - , const ScenePoint2D& p2 - , const double& radiusS - , const int subdivisionsCount) - { - double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); - double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); - AddShortestArc( - chain, c, radiusS, p1cAngle, p2cAngle, subdivisionsCount); - } - - void AddShortestArc( - PolylineSceneLayer::Chain& chain - , const ScenePoint2D& centerS - , const double& radiusS - , const double startAngleRad - , const double endAngleRad - , const int subdivisionsCount) - { - // this gives a signed difference between angle which - // is the smallest difference (in magnitude) between - // the angles - double delta = NormalizeAngle(endAngleRad - startAngleRad); - - chain.clear(); - chain.reserve(subdivisionsCount + 1); - - double angleIncr = delta / static_cast(subdivisionsCount); - - double theta = startAngleRad; - for (int i = 0; i < subdivisionsCount + 1; ++i) - { - double offsetX = radiusS * cos(theta); - double offsetY = radiusS * sin(theta); - double pointX = centerS.GetX() + offsetX; - double pointY = centerS.GetY() + offsetY; - chain.push_back(ScenePoint2D(pointX, pointY)); - theta += angleIncr; - } - } - -#if 0 - void AddArc( - PolylineSceneLayer::Chain & chain - , const Scene2D & scene - , const ScenePoint2D & centerS - , const double& radiusS - , const double startAngleRad - , const double endAngleRad - , const bool clockwise - , const int subdivisionsCount) - { - double startAngleRadN = NormalizeAngle(startAngleRad); - double endAngleRadN = NormalizeAngle(endAngleRad); - - double angle1Rad = std::min(startAngleRadN, endAngleRadN); - double angle2Rad = std::max(startAngleRadN, endAngleRadN); - - // now we are sure angle1Rad < angle2Rad - // this means that if we draw from 1 to 2, it will be clockwise ( - // increasing angles). - // let's fix this: - if (!clockwise) - { - angle2Rad -= 2 * g_pi; - // now we are sure angle2Rad < angle1Rad (since they were normalized) - // and, thus, going from 1 to 2 means the angle values will DECREASE, - // which is the definition of anticlockwise - } - - chain.clear(); - chain.reserve(subdivisionsCount + 1); - - double angleIncr = (angle2Rad - angle1Rad) - / static_cast(subdivisionsCount); - - double theta = angle1Rad; - for (int i = 0; i < subdivisionsCount + 1; ++i) - { - double offsetX = radiusS * cos(theta); - double offsetY = radiusS * sin(theta); - double pointX = centerS.GetX() + offsetX; - double pointY = centerS.GetY() + offsetY; - chain.push_back(ScenePoint2D(pointX, pointY)); - theta += angleIncr; - } - } -#endif - - void AddCircle(PolylineSceneLayer::Chain& chain, - const ScenePoint2D& centerS, - const double& radiusS, - const int numSubdivisions) - { - //ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); - //TODO: take DPI into account - - // TODO: automatically compute the number for segments for smooth - // display based on the radius in pixels. - - chain.clear(); - chain.reserve(numSubdivisions); - - double angleIncr = (2.0 * g_pi) - / static_cast(numSubdivisions); - - double theta = 0; - for (int i = 0; i < numSubdivisions; ++i) - { - double offsetX = radiusS * cos(theta); - double offsetY = radiusS * sin(theta); - double pointX = centerS.GetX() + offsetX; - double pointY = centerS.GetY() + offsetY; - chain.push_back(ScenePoint2D(pointX, pointY)); - theta += angleIncr; - } - } - - double NormalizeAngle(double angle) - { - double retAngle = angle; - while (retAngle < -1.0 * g_pi) - retAngle += 2 * g_pi; - while (retAngle >= g_pi) - retAngle -= 2 * g_pi; - return retAngle; - } - - double MeasureAngle(const ScenePoint2D& p1, const ScenePoint2D& c, const ScenePoint2D& p2) - { - double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); - double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); - double delta = p2cAngle - p1cAngle; - return NormalizeAngle(delta); - } - - -#if 0 - void AddEllipse(PolylineSceneLayer::Chain & chain, - const Scene2D & scene, - const ScenePoint2D & centerS, - const double& halfHAxis, - const double& halfVAxis) - { - chain.clear(); - chain.reserve(4); - ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); - //TODO: take DPI into account - double handleLX = centerC.GetX() - sideLength / 2; - double handleTY = centerC.GetY() - sideLength / 2; - double handleRX = centerC.GetX() + sideLength / 2; - double handleBY = centerC.GetY() + sideLength / 2; - ScenePoint2D LTC(handleLX, handleTY); - ScenePoint2D RTC(handleRX, handleTY); - ScenePoint2D RBC(handleRX, handleBY); - ScenePoint2D LBC(handleLX, handleBY); - - ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); - ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); - - chain.push_back(startLT); - chain.push_back(startRT); - chain.push_back(startRB); - chain.push_back(startLB); - } -#endif - -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - /** - This utility function assumes that the layer holder contains 5 text layers - and will use the first four ones for the text background and the fifth one - for the actual text - */ - void SetTextLayerOutlineProperties( - Scene2D& scene - , boost::shared_ptr layerHolder - , const char* text - , ScenePoint2D p - , int startingLayerIndex) - { - double xoffsets[5] = { 2, 0, -2, 0, 0 }; - double yoffsets[5] = { 0, -2, 0, 2, 0 }; - - // get the scaling factor - const double pixelToScene = - scene.GetCanvasToSceneTransform().ComputeZoom(); - - for (int i = startingLayerIndex; i < startingLayerIndex + 5; ++i) - { - TextSceneLayer* textLayer = layerHolder->GetTextLayer(i); - if (textLayer != NULL) - { - textLayer->SetText(text); - - if (i == startingLayerIndex + 4) - { - textLayer->SetColor(TEXT_COLOR_RED, - TEXT_COLOR_GREEN, - TEXT_COLOR_BLUE); - } - else - { - textLayer->SetColor(TEXT_OUTLINE_COLOR_RED, - TEXT_OUTLINE_COLOR_GREEN, - TEXT_OUTLINE_COLOR_BLUE); - } - - ScenePoint2D textAnchor; - int offIndex = i - startingLayerIndex; - ORTHANC_ASSERT(offIndex >= 0 && offIndex < 5); - textLayer->SetPosition( - p.GetX() + xoffsets[offIndex] * pixelToScene, - p.GetY() + yoffsets[offIndex] * pixelToScene); - } - } - } -#else - void SetTextLayerProperties( - Scene2D& scene - , boost::shared_ptr layerHolder - , const char* text - , ScenePoint2D p - , int layerIndex) - { - TextSceneLayer* textLayer = layerHolder->GetTextLayer(layerIndex); - if (textLayer != NULL) - { - textLayer->SetText(text); - textLayer->SetColor(TEXT_COLOR_RED, TEXT_COLOR_GREEN, TEXT_COLOR_BLUE); - - ScenePoint2D textAnchor; - textLayer->SetPosition(p.GetX(), p.GetY()); - } - } -#endif - - std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p) - { - os << "x = " << p.GetX() << " , y = " << p.GetY(); - return os; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureToolsToolbox.h --- a/Framework/Scene2DViewport/MeasureToolsToolbox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,200 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "PredeclaredTypes.h" -#include "../Scene2D/PolylineSceneLayer.h" -#include "../Scene2D/Scene2D.h" - -namespace OrthancStone -{ - - /** - This function will create a square around the center point supplied in - scene coordinates, with a side length given in canvas coordinates. The - square sides are parallel to the canvas boundaries. - */ - void AddSquare(PolylineSceneLayer::Chain& chain, - const Scene2D& scene, - const ScenePoint2D& centerS, - const double& sideLengthS); - - /** - Creates an arc centered on c that goes - - from a point r1: - - so that r1 belongs to the p1,c line - - so that the distance from c to r1 equals radius - - to a point r2: - - so that r2 belongs to the p2,c line - - so that the distance from c to r2 equals radius - - that follows the shortest among the two possible paths - - Warning: the existing chain content will be wiped out. - */ - void AddShortestArc( - PolylineSceneLayer::Chain& chain - , const ScenePoint2D& p1 - , const ScenePoint2D& c - , const ScenePoint2D& p2 - , const double& radiusS - , const int subdivisionsCount = 63); - - /** - Creates an arc (open curve) with "numSubdivisions" (N + 1 points) from - start angle to end angle, by following the shortest arc. - - Warning: the existing chain content will be wiped out. - */ - void AddShortestArc( - PolylineSceneLayer::Chain& chain - , const ScenePoint2D& centerS - , const double& radiusS - , const double startAngleRad - , const double endAngleRad - , const int subdivisionsCount = 63); - -#if 0 - /** - Creates an arc centered on c that goes - - from a point r1: - - so that r1 belongs to the p1,c line - - so that the distance from c to r1 equals radius - - to a point r2: - - so that r2 belongs to the p2,c line - - so that the distance from c to r2 equals radius - - if clockwise is true, the arc is drawn from r1 to r2 with increasing - angle values. Otherwise, the angle values decrease. - - Warning: the existing chain content will be wiped out. - */ - - void AddArc( - PolylineSceneLayer::Chain & chain - , const Scene2D & scene - , const ScenePoint2D & p1 - , const ScenePoint2D & c - , const ScenePoint2D & p2 - , const double& radiusS - , const bool clockwise - , const int subdivisionsCount = 63); - - /** - Creates an arc (open curve) with "numSubdivisions" (N + 1 points) from - start angle to end angle with the supplied radius. - - if clockwise is true, the arc is drawn from start to end by increasing the - angle values. - - Otherwise, the angle value decreases from start to end. - - Warning: the existing chain content will be wiped out. - */ - void AddArc( - PolylineSceneLayer::Chain& chain - , const Scene2D& scene - , const ScenePoint2D& centerS - , const double& radiusS - , const double startAngleRad - , const double endAngleRad - , const bool clockwise - , const int subdivisionsCount = 63); -#endif - /** - Creates a circle (closed curve) with "numSubdivisions" - (N points) - - Warning: the existing chain content will be wiped out. - */ - void AddCircle(PolylineSceneLayer::Chain& chain, - const ScenePoint2D& centerS, - const double& radiusS, - const int numSubdivisions = 63); - - /** - Adds or subtracts 2*pi as many times as need to shift the specified - angle to a value such as: -pi <= value < pi - */ - double NormalizeAngle(double angle); - - /** - Returns the angle magnitude between the p1,c and p2,c lines. - The returned angle is between 0 and 2*pi - - If the angle is between 0 and pi, this means that the shortest arc - from p1 to p2 is clockwise. - - If the angle is between pi and 2*pi, this means that the shortest arc - from p1 to p2 is COUNTERclockwise. - - */ - double MeasureAngle( - const ScenePoint2D& p1, const ScenePoint2D& c, const ScenePoint2D& p2); - - /** - RadiansToDegrees - */ - double RadiansToDegrees(double angleRad); - - /** - This function will return the coordinates of a point that: - - belongs to the two bisecting lines of the p1 c p2 angle. - - is a distance d from c. - Among the four possible points, the one returned will be the one belonging - to the *smallest* half-plane defined by the [c,p1[ and [c,p2[ half-lines. - */ - void GetPositionOnBisectingLine( - ScenePoint2D& result - , const ScenePoint2D& p1 - , const ScenePoint2D& c - , const ScenePoint2D& p2 - , const double d); - - -#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 - /** - This helper is used when drawing text with an outline. - It set the properties for several text layers at once : first the - four outline layers, with a position shift and then the actual main text - layer. - - The five text layers are supposed to already exist in the scene, starting - from startingLayerIndex, up to (and not including) startingLayerIndex+5. - */ - void SetTextLayerOutlineProperties( - Scene2D& scene - , boost::shared_ptr layerHolder - , const char* text - , ScenePoint2D p - , int startingLayerIndex); -#else - void SetTextLayerProperties( - Scene2D& scene - , boost::shared_ptr layerHolder - , const char* text - , ScenePoint2D p - , int layerIndex); -#endif - - std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p); -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureTrackers.cpp --- a/Framework/Scene2DViewport/MeasureTrackers.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MeasureTrackers.h" -#include - -namespace OrthancStone -{ - - CreateMeasureTracker::CreateMeasureTracker(boost::shared_ptr viewport) - : viewport_(viewport) - , alive_(true) - , commitResult_(true) - { - } - - void CreateMeasureTracker::Cancel() - { - commitResult_ = false; - alive_ = false; - } - - bool CreateMeasureTracker::IsAlive() const - { - return alive_; - } - - CreateMeasureTracker::~CreateMeasureTracker() - { - // if the tracker completes successfully, we add the command - // to the undo stack - // otherwise, we simply undo it - - std::unique_ptr lock(viewport_->Lock()); - - if (commitResult_) - lock->GetController().PushCommand(command_); - else - command_->Undo(); - - lock->Invalidate(); - } - - EditMeasureTracker::EditMeasureTracker(boost::shared_ptr viewport, const PointerEvent& e) - : viewport_(viewport) - , alive_(true) - , commitResult_(true) - { - std::unique_ptr lock(viewport_->Lock()); - - originalClickPosition_ = e.GetMainPosition().Apply( - lock->GetController().GetScene().GetCanvasToSceneTransform()); - } - - void EditMeasureTracker::Cancel() - { - commitResult_ = false; - alive_ = false; - } - - bool EditMeasureTracker::IsAlive() const - { - return alive_; - } - - EditMeasureTracker::~EditMeasureTracker() - { - // if the tracker completes successfully, we add the command - // to the undo stack - // otherwise, we simply undo it - - std::unique_ptr lock(viewport_->Lock()); - - if (commitResult_) - lock->GetController().PushCommand(command_); - else - command_->Undo(); - - lock->Invalidate(); - } -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/MeasureTrackers.h --- a/Framework/Scene2DViewport/MeasureTrackers.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "IFlexiblePointerTracker.h" -#include "../Scene2D/Scene2D.h" -#include "../Scene2D/PointerEvent.h" - -#include "MeasureTool.h" -#include "MeasureCommands.h" - -#include -#include - -#include - -namespace OrthancStone -{ - class CreateMeasureTracker : public IFlexiblePointerTracker - { - public: - virtual void Cancel() ORTHANC_OVERRIDE; - virtual bool IsAlive() const ORTHANC_OVERRIDE; - protected: - CreateMeasureTracker(boost::shared_ptr viewport); - - ~CreateMeasureTracker(); - - protected: - boost::shared_ptr command_; - boost::shared_ptr viewport_; - bool alive_; - - private: - bool commitResult_; - }; - - class EditMeasureTracker : public IFlexiblePointerTracker - { - public: - virtual void Cancel() ORTHANC_OVERRIDE; - virtual bool IsAlive() const ORTHANC_OVERRIDE; - protected: - EditMeasureTracker(boost::shared_ptr viewport, const PointerEvent& e); - - ~EditMeasureTracker(); - - protected: - boost::shared_ptr command_; - boost::shared_ptr viewport_; - bool alive_; - - ScenePoint2D GetOriginalClickPosition() const - { - return originalClickPosition_; - } - private: - ScenePoint2D originalClickPosition_; - bool commitResult_; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/OneGesturePointerTracker.cpp --- a/Framework/Scene2DViewport/OneGesturePointerTracker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OneGesturePointerTracker.h" - -#include - -#include "../StoneException.h" - -namespace OrthancStone -{ - OneGesturePointerTracker::OneGesturePointerTracker( - boost::shared_ptr viewport) - : viewport_(viewport) - , alive_(true) - , currentTouchCount_(1) - { - } - - void OneGesturePointerTracker::PointerUp(const PointerEvent& event) - { - // pointer up is only called for the LAST up event in case of a multi-touch - // gesture - ORTHANC_ASSERT(currentTouchCount_ > 0, "Wrong state in tracker"); - currentTouchCount_--; - //LOG(TRACE) << "currentTouchCount_ becomes: " << currentTouchCount_; - if (currentTouchCount_ == 0) - { - //LOG(TRACE) << "currentTouchCount_ == 0 --> alive_ = false"; - alive_ = false; - } - } - - void OneGesturePointerTracker::PointerDown(const PointerEvent& event) - { - // additional touches are not taken into account but we need to count - // the number of active touches - currentTouchCount_++; - //LOG(TRACE) << "currentTouchCount_ becomes: " << currentTouchCount_; - - /** - * 2019-12-06 (SJO): Patch to have consistent behavior when mouse - * leaves the canvas while the tracker is still active, then - * button is released while out-of-canvas. Such an event is not - * caught (at least in WebAssembly), so we delete the tracker on - * the next click inside the canvas. - **/ - alive_ = false; - } - - bool OneGesturePointerTracker::IsAlive() const - { - return alive_; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/OneGesturePointerTracker.h --- a/Framework/Scene2DViewport/OneGesturePointerTracker.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "IFlexiblePointerTracker.h" - -#include "../Viewport/IViewport.h" - -#include -#include - -namespace OrthancStone -{ - /** - This base is class allows to write simple trackers that deal with single - drag gestures with only one touch. It is *not* suitable for multi-touch and - multi-state trackers where various mouse operations need to be handled. - - In order to write such a tracker: - - subclass this class - - you may store the initial click/touch position in the constructor - - implement PointerMove to react to pointer/touch events - - implement Cancel to restore the state at initial tracker creation time - - */ - class OneGesturePointerTracker : public IFlexiblePointerTracker - { - public: - OneGesturePointerTracker(boost::shared_ptr viewport); - virtual void PointerUp(const PointerEvent& event) ORTHANC_OVERRIDE; - virtual void PointerDown(const PointerEvent& event) ORTHANC_OVERRIDE; - virtual bool IsAlive() const ORTHANC_OVERRIDE; - - protected: - boost::shared_ptr viewport_; - - private: - bool alive_; - int currentTouchCount_; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/PredeclaredTypes.h --- a/Framework/Scene2DViewport/PredeclaredTypes.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include - -namespace OrthancStone - -{ - class Scene2D; - class MeasureTool; - class LineMeasureTool; - class AngleMeasureTool; - class IPointerTracker; - class IFlexiblePointerTracker; - class CreateMeasureCommand; - class CreateLineMeasureCommand; - class CreateAngleMeasureCommand; - class MeasureCommand; - class ViewportController; - class LayerHolder; - class IViewport; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/UndoStack.cpp --- a/Framework/Scene2DViewport/UndoStack.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "UndoStack.h" - -#include "MeasureCommands.h" - -#include "../StoneException.h" - -namespace OrthancStone -{ - UndoStack::UndoStack() : numAppliedCommands_(0) - {} - - void UndoStack::PushCommand(boost::shared_ptr command) - { - commandStack_.erase( - commandStack_.begin() + numAppliedCommands_, - commandStack_.end()); - - ORTHANC_ASSERT(std::find(commandStack_.begin(), commandStack_.end(), command) - == commandStack_.end(), "Duplicate command"); - commandStack_.push_back(command); - numAppliedCommands_++; - } - - void UndoStack::Undo() - { - ORTHANC_ASSERT(CanUndo(), ""); - commandStack_[numAppliedCommands_ - 1]->Undo(); - numAppliedCommands_--; - } - - void UndoStack::Redo() - { - ORTHANC_ASSERT(CanRedo(), ""); - commandStack_[numAppliedCommands_]->Redo(); - numAppliedCommands_++; - } - - bool UndoStack::CanUndo() const - { - return numAppliedCommands_ > 0; - } - - bool UndoStack::CanRedo() const - { - return numAppliedCommands_ < commandStack_.size(); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/UndoStack.h --- a/Framework/Scene2DViewport/UndoStack.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include - -#include - -namespace OrthancStone -{ - class MeasureCommand; - - class UndoStack - { - public: - UndoStack(); - - /** - Stores a command : - - this first trims the undo stack to keep the first numAppliedCommands_ - - then it adds the supplied command at the top of the undo stack - - In other words, when a new command is pushed, all the undone (and not - redone) commands are removed. - */ - void PushCommand(boost::shared_ptr command); - - /** - Undoes the command at the top of the undo stack, or throws if there is no - command to undo. - You can check "CanUndo" first to protect against extraneous redo. - */ - void Undo(); - - /** - Redoes the command that is just above the last applied command in the undo - stack or throws if there is no command to redo. - You can check "CanRedo" first to protect against extraneous redo. - */ - void Redo(); - - /** selfexpl */ - bool CanUndo() const; - - /** selfexpl */ - bool CanRedo() const; - - private: - std::vector > commandStack_; - - /** - This is always between >= 0 and <= undoStack_.size() and gives the - position where the controller is in the undo stack. - - If numAppliedCommands_ > 0, one can undo - - If numAppliedCommands_ < numAppliedCommands_.size(), one can redo - */ - size_t numAppliedCommands_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/ViewportController.cpp --- a/Framework/Scene2DViewport/ViewportController.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,307 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "ViewportController.h" - -#include "UndoStack.h" -#include "MeasureCommands.h" - -#include "../StoneException.h" -#include "../Scene2D/PanSceneTracker.h" -#include "../Scene2D/RotateSceneTracker.h" -#include "../Scene2D/ZoomSceneTracker.h" - -#include - -namespace OrthancStone -{ - IFlexiblePointerTracker* DefaultViewportInteractor::CreateTracker( - boost::shared_ptr viewport, - const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight) - { - switch (event.GetMouseButton()) - { - case MouseButton_Left: - return new RotateSceneTracker(viewport, event); - - case MouseButton_Middle: - return new PanSceneTracker(viewport, event); - - case MouseButton_Right: - { - if (viewportWidth != 0) - { - return new ZoomSceneTracker(viewport, event, viewportWidth); - } - else - { - return NULL; - } - } - - default: - return NULL; - } - } - - ViewportController::ViewportController(boost::shared_ptr viewport) - : viewport_(viewport) - , scene_(new Scene2D) - , canvasToSceneFactor_(1) - { - // undoStack_ is not default-initialized, which basically means empty. - // The controller must be able to cope with this. - } - - ViewportController::~ViewportController() - { - } - - void ViewportController::PushCommand( - boost::shared_ptr command) - { - boost::shared_ptr undoStack = undoStackW_.lock(); - if (undoStack.get() != NULL) - { - undoStack->PushCommand(command); - } - else - { - LOG(ERROR) << "Internal error: no undo stack!"; - } - } - - void ViewportController::Undo() - { - boost::shared_ptr undoStack = undoStackW_.lock(); - if (undoStack.get() != NULL) - { - undoStack->Undo(); - } - else - { - LOG(ERROR) << "Internal error: no undo stack!"; - } - } - - void ViewportController::Redo() - { - boost::shared_ptr undoStack = undoStackW_.lock(); - if (undoStack.get() != NULL) - { - undoStack->Redo(); - } - else - { - LOG(ERROR) << "Internal error: no undo stack!"; - } - } - - bool ViewportController::CanUndo() const - { - boost::shared_ptr undoStack = undoStackW_.lock(); - if (undoStack.get() != NULL) - { - return undoStack->CanUndo(); - } - else - { - LOG(ERROR) << "Internal error: no undo stack!"; - return false; - } - } - - bool ViewportController::CanRedo() const - { - boost::shared_ptr undoStack = undoStackW_.lock(); - if (undoStack.get() != NULL) - { - return undoStack->CanRedo(); - } - else - { - LOG(ERROR) << "Internal error: no undo stack!"; - return false; - } - } - - std::vector > - ViewportController::HitTestMeasureTools(ScenePoint2D p) - { - std::vector > ret; - - for (size_t i = 0; i < measureTools_.size(); ++i) - { - if (measureTools_[i]->HitTest(p)) - ret.push_back(measureTools_[i]); - } - return ret; - } - - void ViewportController::ResetMeasuringToolsHighlight() - { - for (size_t i = 0; i < measureTools_.size(); ++i) - { - measureTools_[i]->ResetHighlightState(); - } - } - - OrthancStone::AffineTransform2D - ViewportController::GetCanvasToSceneTransform() const - { - return scene_->GetCanvasToSceneTransform(); - } - - OrthancStone::AffineTransform2D - ViewportController::GetSceneToCanvasTransform() const - { - return scene_->GetSceneToCanvasTransform(); - } - - void ViewportController::SetSceneToCanvasTransform( - const AffineTransform2D& transform) - { - scene_->SetSceneToCanvasTransform(transform); - - canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); - BroadcastMessage(SceneTransformChanged(*this)); - } - - void ViewportController::FitContent(unsigned int viewportWidth, - unsigned int viewportHeight) - { - scene_->FitContent(viewportWidth, viewportHeight); - canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); - BroadcastMessage(SceneTransformChanged(*this)); - } - - void ViewportController::AddMeasureTool( - boost::shared_ptr measureTool) - { - ORTHANC_ASSERT(std::find(measureTools_.begin(), - measureTools_.end(), - measureTool) == measureTools_.end(), - "Duplicate measure tool"); - measureTools_.push_back(measureTool); - } - - void ViewportController::RemoveMeasureTool( - boost::shared_ptr measureTool) - { - ORTHANC_ASSERT(std::find(measureTools_.begin(), - measureTools_.end(), - measureTool) != measureTools_.end(), - "Measure tool not found"); - measureTools_.erase( - std::remove(measureTools_.begin(), measureTools_.end(), measureTool), - measureTools_.end()); - } - - double ViewportController::GetCanvasToSceneFactor() const - { - return canvasToSceneFactor_; - } - - double ViewportController::GetHandleSideLengthS() const - { - return HANDLE_SIDE_LENGTH_CANVAS_COORD * GetCanvasToSceneFactor(); - } - - double ViewportController::GetAngleToolArcRadiusS() const - { - return ARC_RADIUS_CANVAS_COORD * GetCanvasToSceneFactor(); - } - - double ViewportController::GetHitTestMaximumDistanceS() const - { - return HIT_TEST_MAX_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); - } - - double ViewportController::GetAngleTopTextLabelDistanceS() const - { - return TEXT_CENTER_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); - } - - - void ViewportController::HandleMousePress( - OrthancStone::IViewportInteractor& interactor, - const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight) - { - if (activeTracker_) - { - // We are dealing with a multi-stage tracker (that is made of several - // interactions) - activeTracker_->PointerDown(event); - - if (!activeTracker_->IsAlive()) - { - activeTracker_.reset(); - } - } - else - { - // Check whether there is already a measure tool at that position - for (size_t i = 0; i < measureTools_.size(); ++i) - { - if (measureTools_[i]->HitTest(event.GetMainPosition())) - { - activeTracker_ = measureTools_[i]->CreateEditionTracker(event); - return; - } - } - - // No measure tool, create new tracker from the interactor - activeTracker_.reset(interactor.CreateTracker(viewport_, - event, - viewportWidth, - viewportHeight)); - } - } - - bool ViewportController::HandleMouseMove(const PointerEvent& event) - { - if (activeTracker_) - { - activeTracker_->PointerMove(event); - return true; - } - else - { - return false; - } - } - - void ViewportController::HandleMouseRelease(const PointerEvent& event) - { - if (activeTracker_) - { - activeTracker_->PointerUp(event); - - if (!activeTracker_->IsAlive()) - { - activeTracker_.reset(); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Scene2DViewport/ViewportController.h --- a/Framework/Scene2DViewport/ViewportController.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,270 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "PredeclaredTypes.h" - -#include "../Messages/IObservable.h" -#include "../Scene2D/Scene2D.h" -#include "../Scene2DViewport/IFlexiblePointerTracker.h" - -#include - -#include -#include - -namespace OrthancStone -{ - // TODO - Move this to another file - class IViewportInteractor : public boost::noncopyable - { - public: - virtual ~IViewportInteractor() - { - } - - virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr viewport, - const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight) = 0; - }; - - - // TODO - Move this to another file - class DefaultViewportInteractor : public IViewportInteractor - { - public: - virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr viewport, - const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight) ORTHANC_OVERRIDE; - }; - - - class UndoStack; - - const double ARC_RADIUS_CANVAS_COORD = 30.0; - const double TEXT_CENTER_DISTANCE_CANVAS_COORD = 90; - - const double HANDLE_SIDE_LENGTH_CANVAS_COORD = 10.0; - const double HIT_TEST_MAX_DISTANCE_CANVAS_COORD = 15.0; - - const uint8_t TEXT_COLOR_RED = 0; - const uint8_t TEXT_COLOR_GREEN = 223; - const uint8_t TEXT_COLOR_BLUE = 81; - - const uint8_t TOOL_ANGLE_LINES_COLOR_RED = 0; - const uint8_t TOOL_ANGLE_LINES_COLOR_GREEN = 183; - const uint8_t TOOL_ANGLE_LINES_COLOR_BLUE = 17; - - const uint8_t TOOL_ANGLE_LINES_HL_COLOR_RED = 0; - const uint8_t TOOL_ANGLE_LINES_HL_COLOR_GREEN = 17; - const uint8_t TOOL_ANGLE_LINES_HL_COLOR_BLUE = 183; - - const uint8_t TOOL_LINES_COLOR_RED = 0; - const uint8_t TOOL_LINES_COLOR_GREEN = 223; - const uint8_t TOOL_LINES_COLOR_BLUE = 21; - - const uint8_t TOOL_LINES_HL_COLOR_RED = 0; - const uint8_t TOOL_LINES_HL_COLOR_GREEN = 21; - const uint8_t TOOL_LINES_HL_COLOR_BLUE = 223; - - const uint8_t TEXT_OUTLINE_COLOR_RED = 0; - const uint8_t TEXT_OUTLINE_COLOR_GREEN = 56; - const uint8_t TEXT_OUTLINE_COLOR_BLUE = 21; - - /** - This object is responsible for hosting a scene, responding to messages from - the model and updating the scene accordingly. - - It contains the list of active measuring tools as well as the stack - where measuring tool commands are stored. - - The active tracker is also stored in the viewport controller. - - Each canvas or other GUI area where we want to display a 2D image, either - directly or through slicing must be assigned a ViewportController. - */ - class ViewportController : - public IObservable, - public boost::enable_shared_from_this - { - public: - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, \ - SceneTransformChanged, \ - ViewportController); - - ViewportController(boost::shared_ptr viewport); - - ~ViewportController(); - - /** - This method returns the list of measure tools containing the supplied point - (in scene coords). A tracker can then be requested from the chosen - measure tool, if needed - */ - std::vector > HitTestMeasureTools( - ScenePoint2D p); - - /** - This function will traverse the measuring tools and will clear their - highlighted state - */ - void ResetMeasuringToolsHighlight(); - - /** - With this method, the object takes ownership of the supplied tracker and - updates it according to user interaction - */ - void AcquireActiveTracker(IFlexiblePointerTracker* tracker); - - /** Forwarded to the underlying scene */ - AffineTransform2D GetCanvasToSceneTransform() const; - - /** Forwarded to the underlying scene */ - AffineTransform2D GetSceneToCanvasTransform() const; - - /** Forwarded to the underlying scene, and broadcasted to the observers */ - void SetSceneToCanvasTransform(const AffineTransform2D& transform); - - /** Forwarded to the underlying scene, and broadcasted to the observers */ - void FitContent(unsigned int viewportWidth, - unsigned int viewportHeight); - - /** Adds a new measure tool */ - void AddMeasureTool(boost::shared_ptr measureTool); - - /** Removes a measure tool or throws if it cannot be found */ - void RemoveMeasureTool(boost::shared_ptr measureTool); - - /** - The square handle side length in *scene* coordinates - */ - double GetHandleSideLengthS() const; - - /** - The angle measure too arc radius in *scene* coordinates - - Note: you might wonder why this is not part of the AngleMeasureTool itself, - but we prefer to put all such constants in the same location, to ease - */ - double GetAngleToolArcRadiusS() const; - - /** - The hit test maximum distance in *scene* coordinates. - If a pointer event is less than GetHandleSideLengthS() to a GUI element, - the hit test for this GUI element is seen as true - */ - double GetHitTestMaximumDistanceS() const; - - /** - Distance between the top of the angle measuring tool and the center of - the label showing the actual measure, in *scene* coordinates - */ - double GetAngleTopTextLabelDistanceS() const; - - - /** forwarded to the UndoStack */ - void PushCommand(boost::shared_ptr command); - - /** forwarded to the UndoStack */ - void Undo(); - - /** forwarded to the UndoStack */ - void Redo(); - - /** forwarded to the UndoStack */ - bool CanUndo() const; - - /** forwarded to the UndoStack */ - bool CanRedo() const; - - - // Must be expressed in canvas coordinates - void HandleMousePress(IViewportInteractor& interactor, - const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight); - - // Must be expressed in canvas coordinates. Returns "true" if the - // state has changed, so that "Invalidate()" can be called. - bool HandleMouseMove(const PointerEvent& event); - - // Must be expressed in canvas coordinates - void HandleMouseRelease(const PointerEvent& event); - - const Scene2D& GetScene() const - { - return *scene_; - } - - Scene2D& GetScene() - { - return *scene_; - } - - /** - This method is used in a move pattern: when the ownership of the scene - managed by this viewport controller must be transferred to another - controller. - */ - Scene2D* ReleaseScene() - { - return scene_.release(); - } - - /** - This method is used when one wishes to replace the scene that is currently - managed by the controller. The previous scene is deleted and the controller - now has ownership of the new one. - */ - void AcquireScene(Scene2D* scene) - { - scene_.reset(scene); - } - - /** - Sets the undo stack that is used by PushCommand, Undo... - */ - void SetUndoStack(boost::weak_ptr undoStackW) - { - undoStackW_ = undoStackW; - } - - bool HasActiveTracker() const - { - return activeTracker_.get() != NULL; - } - - private: - double GetCanvasToSceneFactor() const; - - boost::shared_ptr viewport_; - boost::weak_ptr undoStackW_; // Global stack, possibly shared by all viewports - std::vector > measureTools_; - boost::shared_ptr activeTracker_; // TODO - Couldn't this be a "std::unique_ptr"? - - std::unique_ptr scene_; - - // this is cached - double canvasToSceneFactor_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/StoneEnumerations.cpp --- a/Framework/StoneEnumerations.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "StoneEnumerations.h" - -#include -#include -#include - -namespace OrthancStone -{ - SopClassUid StringToSopClassUid(const std::string& source) - { - std::string s = Orthanc::Toolbox::StripSpaces(source); - - if (s == "1.2.840.10008.5.1.4.1.1.481.2") - { - return SopClassUid_RTDose; - } - else - { - //LOG(INFO) << "Other SOP class UID: " << source; - return SopClassUid_Other; - } - } - - - void ComputeWindowing(float& targetCenter, - float& targetWidth, - ImageWindowing windowing, - float customCenter, - float customWidth) - { - switch (windowing) - { - case ImageWindowing_Custom: - targetCenter = customCenter; - targetWidth = customWidth; - break; - - case ImageWindowing_Bone: - targetCenter = 300; - targetWidth = 2000; - break; - - case ImageWindowing_Lung: - targetCenter = -600; - targetWidth = 1600; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void ComputeAnchorTranslation(double& deltaX, - double& deltaY, - BitmapAnchor anchor, - unsigned int bitmapWidth, - unsigned int bitmapHeight, - unsigned int border) - { - double dw = static_cast(bitmapWidth); - double dh = static_cast(bitmapHeight); - - switch (anchor) - { - case BitmapAnchor_TopLeft: - deltaX = 0; - deltaY = 0; - break; - - case BitmapAnchor_TopCenter: - deltaX = -dw / 2.0; - deltaY = 0; - break; - - case BitmapAnchor_TopRight: - deltaX = -dw; - deltaY = 0; - break; - - case BitmapAnchor_CenterLeft: - deltaX = 0; - deltaY = -dh / 2.0; - break; - - case BitmapAnchor_Center: - deltaX = -dw / 2.0; - deltaY = -dh / 2.0; - break; - - case BitmapAnchor_CenterRight: - deltaX = -dw; - deltaY = -dh / 2.0; - break; - - case BitmapAnchor_BottomLeft: - deltaX = 0; - deltaY = -dh; - break; - - case BitmapAnchor_BottomCenter: - deltaX = -dw / 2.0; - deltaY = -dh; - break; - - case BitmapAnchor_BottomRight: - deltaX = -dw; - deltaY = -dh; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (border != 0) - { - double b = static_cast(border); - - switch (anchor) - { - case BitmapAnchor_TopLeft: - case BitmapAnchor_TopCenter: - case BitmapAnchor_TopRight: - deltaY += b; - break; - - case BitmapAnchor_BottomLeft: - case BitmapAnchor_BottomCenter: - case BitmapAnchor_BottomRight: - deltaY -= b; - break; - - default: - break; - } - - switch (anchor) - { - case BitmapAnchor_TopLeft: - case BitmapAnchor_CenterLeft: - case BitmapAnchor_BottomLeft: - deltaX += b; - break; - - case BitmapAnchor_CenterRight: - case BitmapAnchor_TopRight: - case BitmapAnchor_BottomRight: - deltaX -= b; - break; - - default: - break; - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/StoneEnumerations.h --- a/Framework/StoneEnumerations.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,149 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OrthancFramework.h" - -#include - - -namespace OrthancStone -{ - enum SliceOffsetMode - { - SliceOffsetMode_Absolute, - SliceOffsetMode_Relative, - SliceOffsetMode_Loop - }; - - enum ImageWindowing - { - ImageWindowing_Bone, - ImageWindowing_Lung, - ImageWindowing_Custom - }; - - enum MouseButton - { - MouseButton_Left, - MouseButton_Right, - MouseButton_Middle, - MouseButton_None // For instance, because of touch event - }; - - enum MouseWheelDirection - { - MouseWheelDirection_Up, - MouseWheelDirection_Down - }; - - enum VolumeProjection - { - VolumeProjection_Axial, - VolumeProjection_Coronal, - VolumeProjection_Sagittal - }; - - enum ImageInterpolation - { - ImageInterpolation_Nearest, - ImageInterpolation_Bilinear, - ImageInterpolation_Trilinear - }; - - enum KeyboardModifiers - { - KeyboardModifiers_None = 0, - KeyboardModifiers_Shift = (1 << 0), - KeyboardModifiers_Control = (1 << 1), - KeyboardModifiers_Alt = (1 << 2) - }; - - enum KeyboardKeys - { - KeyboardKeys_Generic = 0, - - // let's use the same ids as in javascript to avoid some conversion in WASM: https://css-tricks.com/snippets/javascript/javascript-keycodes/ - KeyboardKeys_Backspace = 8, - KeyboardKeys_Left = 37, - KeyboardKeys_Up = 38, - KeyboardKeys_Right = 39, - KeyboardKeys_Down = 40, - KeyboardKeys_Delete = 46, - - KeyboardKeys_F1 = 112, - KeyboardKeys_F2 = 113, - KeyboardKeys_F3 = 114, - KeyboardKeys_F4 = 115, - KeyboardKeys_F5 = 116, - KeyboardKeys_F6 = 117, - KeyboardKeys_F7 = 118, - KeyboardKeys_F8 = 119, - KeyboardKeys_F9 = 120, - KeyboardKeys_F10 = 121, - KeyboardKeys_F11 = 122, - KeyboardKeys_F12 = 123, - }; - - enum SopClassUid - { - SopClassUid_Other, - SopClassUid_RTDose - }; - - enum BitmapAnchor - { - BitmapAnchor_BottomLeft, - BitmapAnchor_BottomCenter, - BitmapAnchor_BottomRight, - BitmapAnchor_CenterLeft, - BitmapAnchor_Center, - BitmapAnchor_CenterRight, - BitmapAnchor_TopLeft, - BitmapAnchor_TopCenter, - BitmapAnchor_TopRight - }; - - enum SliceAction - { - SliceAction_FastPlus, - SliceAction_Plus, - SliceAction_None, - SliceAction_Minus, - SliceAction_FastMinus - }; - - SopClassUid StringToSopClassUid(const std::string& source); - - void ComputeWindowing(float& targetCenter, - float& targetWidth, - ImageWindowing windowing, - float customCenter, - float customWidth); - - void ComputeAnchorTranslation(double& deltaX /* out */, - double& deltaY /* out */, - BitmapAnchor anchor, - unsigned int bitmapWidth, - unsigned int bitmapHeight, - unsigned int border = 0); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/StoneException.h --- a/Framework/StoneException.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "Toolbox/LinearAlgebra.h" - -#include - -#include - -#include - -namespace OrthancStone -{ - enum ErrorCode - { - ErrorCode_Success, - ErrorCode_OrthancError, // this StoneException is actually an OrthancException with an Orthanc error code - ErrorCode_ApplicationException, // this StoneException is specific to an application (and should have its own internal error code) - ErrorCode_NotImplemented, // case not implemented - - ErrorCode_CanOnlyAddOneLayerAtATime, - ErrorCode_CommandJsonInvalidFormat, - ErrorCode_WebGLContextLost, - ErrorCode_Last - }; - - - - class StoneException - { - protected: - OrthancStone::ErrorCode errorCode_; - - public: - explicit StoneException(ErrorCode errorCode) : - errorCode_(errorCode) - { - } - - virtual ~StoneException() {} - - ErrorCode GetErrorCode() const - { - return errorCode_; - } - - virtual const char* What() const - { - switch (errorCode_) - { - case ErrorCode_Success: - return "Success"; - break; - case ErrorCode_OrthancError: - return "OrthancError"; - break; - case ErrorCode_ApplicationException: - return "ApplicationException"; - break; - case ErrorCode_NotImplemented: - return "NotImplemented"; - break; - case ErrorCode_CanOnlyAddOneLayerAtATime: - return "CanOnlyAddOneLayerAtATime"; - break; - case ErrorCode_CommandJsonInvalidFormat: - return "CommandJsonInvalidFormat"; - break; - case ErrorCode_WebGLContextLost: - return "WebGLContextLost"; - break; - case ErrorCode_Last: - return "Last"; - break; - default: - return "Unknown exception code!"; - } - } - }; -} - -// See https://isocpp.org/wiki/faq/misc-technical-issues#macros-with-multi-stmts -// (or google "Multiple lines macro C++ faq lite" if link is dead) -#define ORTHANC_ASSERT2(cond,streamChainMessage) \ - if (!(cond)) { \ - std::stringstream sst; \ - sst << "Assertion failed. Condition = \"" #cond "\" Message = \"" << streamChainMessage << "\""; \ - std::string sstr = sst.str(); \ - throw ::Orthanc::OrthancException(::Orthanc::ErrorCode_InternalError,sstr.c_str()); \ - } else (void)0 - -#define ORTHANC_ASSERT1(cond) \ - if (!(cond)) { \ - std::stringstream sst; \ - sst << "Assertion failed. Condition = \"" #cond "\""; \ - std::string sstr = sst.str(); \ - throw ::Orthanc::OrthancException(::Orthanc::ErrorCode_InternalError,sstr.c_str()); \ - } else (void)0 - -# define ORTHANC_EXPAND( x ) x -# define GET_ORTHANC_ASSERT(_1,_2,NAME,...) NAME -# define ORTHANC_ASSERT(...) ORTHANC_EXPAND(GET_ORTHANC_ASSERT(__VA_ARGS__, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(__VA_ARGS__)) - - - - - -/* -Explanation: - -ORTHANC_ASSERT(a) -ORTHANC_EXPAND(GET_ORTHANC_ASSERT(a, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(a)) -ORTHANC_EXPAND(ORTHANC_ASSERT1(a)) -ORTHANC_ASSERT1(a) - -ORTHANC_ASSERT(a,b) -ORTHANC_EXPAND(GET_ORTHANC_ASSERT(a, b, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(a,b)) -ORTHANC_EXPAND(ORTHANC_ASSERT2(a,b)) -ORTHANC_ASSERT2(a,b) - -Note: ORTHANC_EXPAND is required for some older compilers (MS v100 cl.exe ) -*/ - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/StoneInitialization.cpp --- a/Framework/StoneInitialization.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "StoneInitialization.h" - -#if !defined(ORTHANC_ENABLE_SDL) -# error Macro ORTHANC_ENABLE_SDL must be defined -#endif - -#if !defined(ORTHANC_ENABLE_SSL) -# error Macro ORTHANC_ENABLE_SSL must be defined -#endif - -#if !defined(ORTHANC_ENABLE_CURL) -# error Macro ORTHANC_ENABLE_CURL must be defined -#endif - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error Macro ORTHANC_ENABLE_DCMTK must be defined -# if !defined(DCMTK_VERSION_NUMBER) -# error Macro DCMTK_VERSION_NUMBER must be defined -# endif -#endif - -#if ORTHANC_ENABLE_SDL == 1 -# include "Viewport/SdlWindow.h" -#endif - -#if ORTHANC_ENABLE_CURL == 1 -# include -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 -# include -#endif - -#if ORTHANC_ENABLE_WASM == 1 -static double viewportsTimeout_ = 1000; -static std::unique_ptr viewportsRegistry_; -#endif - -#include "Toolbox/LinearAlgebra.h" - -#include -#include -#include - -#include - - -namespace OrthancStone -{ - void StoneInitialize(void* pluginContext) - { - if (pluginContext != NULL) - { - Orthanc::Logging::InitializePluginContext(pluginContext); - } - else - { - Orthanc::Logging::Initialize(); - } - -#if ORTHANC_ENABLE_SSL == 1 - // Must be before curl - Orthanc::Toolbox::InitializeOpenSsl(); -#endif - -#if ORTHANC_ENABLE_CURL == 1 - Orthanc::HttpClient::GlobalInitialize(); -# if ORTHANC_ENABLE_SSL == 1 - Orthanc::HttpClient::ConfigureSsl(false, ""); -# endif -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 - Orthanc::FromDcmtkBridge::InitializeDictionary(true); - Orthanc::FromDcmtkBridge::InitializeCodecs(); -# if DCMTK_VERSION_NUMBER <= 360 - OFLog::configure(OFLogger::FATAL_LOG_LEVEL); -# else - OFLog::configure(OFLogger::OFF_LOG_LEVEL); -# endif -#endif - - /** - * This call is necessary to make "boost::lexical_cast<>" work in - * a consistent way in the presence of "double" or "float", and of - * a numeric locale that replaces dot (".") by comma (",") as the - * decimal separator. - * https://stackoverflow.com/a/18981514/881731 - **/ - std::locale::global(std::locale::classic()); - - { - // Run-time checks of locale settings, to be run after Qt has - // been initialized, as Qt changes locale settings - - { - OrthancStone::Vector v; - if (!OrthancStone::LinearAlgebra::ParseVector(v, "1.3671875\\-1.3671875") || - v.size() != 2 || - !OrthancStone::LinearAlgebra::IsNear(1.3671875f, v[0]) || - !OrthancStone::LinearAlgebra::IsNear(-1.3671875f, v[1])) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Error in the locale settings, giving up"); - } - } - - { - Json::Value dicomweb = Json::objectValue; - dicomweb["00280030"] = Json::objectValue; - dicomweb["00280030"]["vr"] = "DS"; - dicomweb["00280030"]["Value"] = Json::arrayValue; - dicomweb["00280030"]["Value"].append(1.2f); - dicomweb["00280030"]["Value"].append(-1.5f); - - Orthanc::DicomMap source; - source.FromDicomWeb(dicomweb); - - std::string s; - OrthancStone::Vector v; - if (!source.LookupStringValue(s, Orthanc::DICOM_TAG_PIXEL_SPACING, false) || - !OrthancStone::LinearAlgebra::ParseVector(v, s) || - v.size() != 2 || - !OrthancStone::LinearAlgebra::IsNear(1.2f, v[0]) || - !OrthancStone::LinearAlgebra::IsNear(-1.5f, v[1])) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Error in the locale settings, giving up"); - } - } - } - -#if ORTHANC_ENABLE_SDL == 1 - OrthancStone::SdlWindow::GlobalInitialize(); -#endif - } - - - void StoneFinalize() - { -#if ORTHANC_ENABLE_WASM == 1 - viewportsRegistry_.reset(); -#endif - -#if ORTHANC_ENABLE_SDL == 1 - OrthancStone::SdlWindow::GlobalFinalize(); -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 - Orthanc::FromDcmtkBridge::FinalizeCodecs(); -#endif - -#if ORTHANC_ENABLE_CURL == 1 - Orthanc::HttpClient::GlobalFinalize(); -#endif - -#if ORTHANC_ENABLE_SSL == 1 - Orthanc::Toolbox::FinalizeOpenSsl(); -#endif - - Orthanc::Logging::Finalize(); - } - - -#if ORTHANC_ENABLE_WASM == 1 - void SetWebGLViewportsRegistryTimeout(double timeout) - { - if (viewportsRegistry_.get()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - viewportsTimeout_ = timeout; - } - } -#endif - - -#if ORTHANC_ENABLE_WASM == 1 - WebGLViewportsRegistry& GetWebGLViewportsRegistry() - { - if (viewportsRegistry_.get() == NULL) - { - viewportsRegistry_.reset(new WebGLViewportsRegistry(viewportsTimeout_)); - } - - return *viewportsRegistry_; - } -#endif -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/StoneInitialization.h --- a/Framework/StoneInitialization.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if !defined(ORTHANC_ENABLE_WASM) -# error Macro ORTHANC_ENABLE_WASM must be defined -#endif - -#if ORTHANC_ENABLE_WASM == 1 -# include "Viewport/WebGLViewportsRegistry.h" -#endif - -#include - -namespace OrthancStone -{ - void StoneInitialize(void* pluginContext); - - inline void StoneInitialize() - { - StoneInitialize(NULL); - } - - void StoneFinalize(); - -#if ORTHANC_ENABLE_WASM == 1 - void SetWebGLViewportsRegistryTimeout(double timeout); -#endif - -#if ORTHANC_ENABLE_WASM == 1 - WebGLViewportsRegistry& GetWebGLViewportsRegistry(); -#endif -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/AffineTransform2D.cpp --- a/Framework/Toolbox/AffineTransform2D.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,271 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "AffineTransform2D.h" - -#include "ImageGeometry.h" - -#include -#include - -namespace OrthancStone -{ - AffineTransform2D::AffineTransform2D() : - matrix_(LinearAlgebra::IdentityMatrix(3)) - { - } - - - AffineTransform2D::AffineTransform2D(const Matrix& m) - { - if (m.size1() != 3 || - m.size2() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); - } - - if (!LinearAlgebra::IsCloseToZero(m(2, 0)) || - !LinearAlgebra::IsCloseToZero(m(2, 1)) || - LinearAlgebra::IsCloseToZero(m(2, 2))) - { - LOG(ERROR) << "Cannot setup an AffineTransform2D with perspective effects"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - matrix_ = m / m(2, 2); - } - - - void AffineTransform2D::Apply(double& x /* inout */, - double& y /* inout */) const - { - Vector p; - LinearAlgebra::AssignVector(p, x, y, 1); - - Vector q = LinearAlgebra::Product(matrix_, p); - - if (!LinearAlgebra::IsNear(q[2], 1.0)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - x = q[0]; - y = q[1]; - } - } - - - void AffineTransform2D::Apply(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - ImageInterpolation interpolation, - bool clear) const - { - assert(LinearAlgebra::IsNear(matrix_(2, 0), 0) && - LinearAlgebra::IsNear(matrix_(2, 1), 0) && - LinearAlgebra::IsNear(matrix_(2, 2), 1)); - - ApplyAffineTransform(target, source, - matrix_(0, 0), matrix_(0, 1), matrix_(0, 2), - matrix_(1, 0), matrix_(1, 1), matrix_(1, 2), - interpolation, clear); - } - - - void AffineTransform2D::ConvertToOpenGLMatrix(float target[16], - unsigned int canvasWidth, - unsigned int canvasHeight) const - { - const AffineTransform2D t = AffineTransform2D::Combine( - CreateOpenGLClipspace(canvasWidth, canvasHeight), *this); - - const Matrix source = t.GetHomogeneousMatrix(); - - if (source.size1() != 3 || - source.size2() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // "z" must be in the [-1,1] range, otherwise the texture does not show up - float z = 0; - - // Embed the 3x3 affine transform of the 2D plane into a 4x4 - // matrix (3D) for OpenGL. The matrix must be transposed. - - target[0] = static_cast(source(0, 0)); - target[1] = static_cast(source(1, 0)); - target[2] = 0; - target[3] = static_cast(source(2, 0)); - target[4] = static_cast(source(0, 1)); - target[5] = static_cast(source(1, 1)); - target[6] = 0; - target[7] = static_cast(source(2, 1)); - target[8] = 0; - target[9] = 0; - target[10] = -1; - target[11] = 0; - target[12] = static_cast(source(0, 2)); - target[13] = static_cast(source(1, 2)); - target[14] = -z; - target[15] = static_cast(source(2, 2)); - } - - - double AffineTransform2D::ComputeZoom() const - { - // Compute the length of the (0,0)-(1,1) diagonal (whose - // length is sqrt(2)) instead of the (0,0)-(1,0) unit segment, - // in order to cope with possible anisotropic zooming - - double x1 = 0; - double y1 = 0; - Apply(x1, y1); - - double x2 = 1; - double y2 = 1; - Apply(x2, y2); - - double dx = x2 - x1; - double dy = y2 - y1; - - double zoom = sqrt(dx * dx + dy * dy) / sqrt(2.0); - - if (LinearAlgebra::IsCloseToZero(zoom)) - { - return 1; // Default value if transform is ill-conditioned - } - else - { - return zoom; - } - } - - - AffineTransform2D AffineTransform2D::Invert(const AffineTransform2D& a) - { - AffineTransform2D t; - LinearAlgebra::InvertMatrix(t.matrix_, a.matrix_); - return t; - } - - - AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, - const AffineTransform2D& b) - { - return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), - b.GetHomogeneousMatrix())); - } - - - AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c) - { - return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), - b.GetHomogeneousMatrix(), - c.GetHomogeneousMatrix())); - } - - - AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c, - const AffineTransform2D& d) - { - return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), - b.GetHomogeneousMatrix(), - c.GetHomogeneousMatrix(), - d.GetHomogeneousMatrix())); - } - - AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c, - const AffineTransform2D& d, - const AffineTransform2D& e) - { - return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), - b.GetHomogeneousMatrix(), - c.GetHomogeneousMatrix(), - d.GetHomogeneousMatrix(), - e.GetHomogeneousMatrix())); - } - - AffineTransform2D AffineTransform2D::CreateOffset(double dx, - double dy) - { - AffineTransform2D t; - t.matrix_(0, 2) = dx; - t.matrix_(1, 2) = dy; - - return t; - } - - - AffineTransform2D AffineTransform2D::CreateScaling(double sx, - double sy) - { - AffineTransform2D t; - t.matrix_(0, 0) = sx; - t.matrix_(1, 1) = sy; - - return t; - } - - - AffineTransform2D AffineTransform2D::CreateRotation(double angle) - { - double cosine = cos(angle); - double sine = sin(angle); - - AffineTransform2D t; - t.matrix_(0, 0) = cosine; - t.matrix_(0, 1) = -sine; - t.matrix_(1, 0) = sine; - t.matrix_(1, 1) = cosine; - - return t; - } - - AffineTransform2D AffineTransform2D::CreateRotation(double angle, // CW rotation - double cx, // rotation center - double cy) // rotation center - { - return Combine( - CreateOffset(cx, cy), - CreateRotation(angle), - CreateOffset(-cx, -cy) - ); - } - - AffineTransform2D AffineTransform2D::CreateOpenGLClipspace(unsigned int canvasWidth, - unsigned int canvasHeight) - { - AffineTransform2D t; - t.matrix_(0, 0) = 2.0 / static_cast(canvasWidth); - t.matrix_(0, 2) = -1.0; - t.matrix_(1, 1) = -2.0 / static_cast(canvasHeight); - t.matrix_(1, 2) = 1.0; - - return t; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/AffineTransform2D.h --- a/Framework/Toolbox/AffineTransform2D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "LinearAlgebra.h" - -#include - -namespace OrthancStone -{ - class AffineTransform2D - { - private: - Matrix matrix_; - - public: - AffineTransform2D(); - - // The matrix must be 3x3, without perspective effects - AffineTransform2D(const Matrix& m); - - AffineTransform2D(const AffineTransform2D& other) : - matrix_(other.matrix_) - { - } - - const Matrix& GetHomogeneousMatrix() const - { - return matrix_; - } - - void Apply(double& x /* inout */, - double& y /* inout */) const; - - void Apply(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - ImageInterpolation interpolation, - bool clear) const; - - void ConvertToOpenGLMatrix(float target[16], - unsigned int canvasWidth, - unsigned int canvasHeight) const; - - double ComputeZoom() const; - - static AffineTransform2D Invert(const AffineTransform2D& a); - - static AffineTransform2D Combine(const AffineTransform2D& a, - const AffineTransform2D& b); - - static AffineTransform2D Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c); - - static AffineTransform2D Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c, - const AffineTransform2D& d); - - // transformations are applied right to left: - // `e` is the first transformation applied and `a` is the last one - static AffineTransform2D Combine(const AffineTransform2D& a, - const AffineTransform2D& b, - const AffineTransform2D& c, - const AffineTransform2D& d, - const AffineTransform2D& e); - - static AffineTransform2D CreateOffset(double dx, - double dy); - - static AffineTransform2D CreateScaling(double sx, - double sy); - - static AffineTransform2D CreateRotation(double angle); // CW rotation in radians - - static AffineTransform2D CreateRotation(double angle, // CW rotation in radians - double cx, // rotation center - double cy); // rotation center - - static AffineTransform2D CreateOpenGLClipspace(unsigned int canvasWidth, - unsigned int canvasHeight); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/CoordinateSystem3D.cpp --- a/Framework/Toolbox/CoordinateSystem3D.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,254 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CoordinateSystem3D.h" - -#include "LinearAlgebra.h" -#include "GeometryToolbox.h" - -#include -#include -#include - -namespace OrthancStone -{ - void CoordinateSystem3D::CheckAndComputeNormal() - { - // DICOM expects normal vectors to define the axes: "The row and - // column direction cosine vectors shall be normal, i.e., the dot - // product of each direction cosine vector with itself shall be - // unity." - // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.2.html - if (!LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(axisX_), 1.0) || - !LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(axisY_), 1.0)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - // The vectors within "Image Orientation Patient" must be - // orthogonal, according to the DICOM specification: "The row and - // column direction cosine vectors shall be orthogonal, i.e., - // their dot product shall be zero." - // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.2.html - if (!LinearAlgebra::IsCloseToZero(boost::numeric::ublas::inner_prod(axisX_, axisY_))) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - LinearAlgebra::CrossProduct(normal_, axisX_, axisY_); - - d_ = -(normal_[0] * origin_[0] + normal_[1] * origin_[1] + normal_[2] * origin_[2]); - - // Just a sanity check, it should be useless by construction - assert(LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(normal_), 1.0)); - } - - - void CoordinateSystem3D::SetupCanonical() - { - LinearAlgebra::AssignVector(origin_, 0, 0, 0); - LinearAlgebra::AssignVector(axisX_, 1, 0, 0); - LinearAlgebra::AssignVector(axisY_, 0, 1, 0); - CheckAndComputeNormal(); - } - - - CoordinateSystem3D::CoordinateSystem3D(const Vector& origin, - const Vector& axisX, - const Vector& axisY) : - origin_(origin), - axisX_(axisX), - axisY_(axisY) - { - CheckAndComputeNormal(); - } - - - void CoordinateSystem3D::Setup(const std::string& imagePositionPatient, - const std::string& imageOrientationPatient) - { - std::string tmpPosition = Orthanc::Toolbox::StripSpaces(imagePositionPatient); - std::string tmpOrientation = Orthanc::Toolbox::StripSpaces(imageOrientationPatient); - - Vector orientation; - if (!LinearAlgebra::ParseVector(origin_, tmpPosition) || - !LinearAlgebra::ParseVector(orientation, tmpOrientation) || - origin_.size() != 3 || - orientation.size() != 6) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - axisX_.resize(3); - axisX_[0] = orientation[0]; - axisX_[1] = orientation[1]; - axisX_[2] = orientation[2]; - - axisY_.resize(3); - axisY_[0] = orientation[3]; - axisY_[1] = orientation[4]; - axisY_[2] = orientation[5]; - - CheckAndComputeNormal(); - } - - - CoordinateSystem3D::CoordinateSystem3D(const IDicomDataset& dicom) - { - std::string a, b; - - if (dicom.GetStringValue(a, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT) && - dicom.GetStringValue(b, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT)) - { - Setup(a, b); - } - else - { - SetupCanonical(); - } - } - - - CoordinateSystem3D::CoordinateSystem3D(const Orthanc::DicomMap& dicom) - { - std::string a, b; - - if (dicom.LookupStringValue(a, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && - dicom.LookupStringValue(b, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) - { - Setup(a, b); - } - else - { - SetupCanonical(); - } - } - - - void CoordinateSystem3D::SetOrigin(const Vector& origin) - { - if (origin.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - origin_ = origin; - } - } - - - Vector CoordinateSystem3D::MapSliceToWorldCoordinates(double x, - double y) const - { - return origin_ + x * axisX_ + y * axisY_; - } - - - double CoordinateSystem3D::ProjectAlongNormal(const Vector& point) const - { - return boost::numeric::ublas::inner_prod(point, normal_); - } - - void CoordinateSystem3D::ProjectPoint2(double& offsetX, double& offsetY, const Vector& point) const - { - // Project the point onto the slice - double projectionX,projectionY,projectionZ; - GeometryToolbox::ProjectPointOntoPlane2(projectionX, projectionY, projectionZ, point, normal_, origin_); - - // As the axes are orthonormal vectors thanks to - // CheckAndComputeNormal(), the following dot products give the - // offset of the origin of the slice wrt. the origin of the - // reference plane https://en.wikipedia.org/wiki/Vector_projection - offsetX = axisX_[0] * (projectionX - origin_[0]) + axisX_[1] * (projectionY - origin_[1]) + axisX_[2] * (projectionZ - origin_[2]); - offsetY = axisY_[0] * (projectionX - origin_[0]) + axisY_[1] * (projectionY - origin_[1]) + axisY_[2] * (projectionZ - origin_[2]); - } - - void CoordinateSystem3D::ProjectPoint(double& offsetX, - double& offsetY, - const Vector& point) const - { - // Project the point onto the slice - Vector projection; - GeometryToolbox::ProjectPointOntoPlane(projection, point, normal_, origin_); - - // As the axes are orthonormal vectors thanks to - // CheckAndComputeNormal(), the following dot products give the - // offset of the origin of the slice wrt. the origin of the - // reference plane https://en.wikipedia.org/wiki/Vector_projection - offsetX = boost::numeric::ublas::inner_prod(axisX_, projection - origin_); - offsetY = boost::numeric::ublas::inner_prod(axisY_, projection - origin_); - } - - bool CoordinateSystem3D::IntersectSegment(Vector& p, - const Vector& edgeFrom, - const Vector& edgeTo) const - { - return GeometryToolbox::IntersectPlaneAndSegment(p, normal_, d_, edgeFrom, edgeTo); - } - - - bool CoordinateSystem3D::IntersectLine(Vector& p, - const Vector& origin, - const Vector& direction) const - { - return GeometryToolbox::IntersectPlaneAndLine(p, normal_, d_, origin, direction); - } - - - bool CoordinateSystem3D::ComputeDistance(double& distance, - const CoordinateSystem3D& a, - const CoordinateSystem3D& b) - { - bool opposite = false; // Ignored - - if (OrthancStone::GeometryToolbox::IsParallelOrOpposite( - opposite, a.GetNormal(), b.GetNormal())) - { - distance = std::abs(a.ProjectAlongNormal(a.GetOrigin()) - - a.ProjectAlongNormal(b.GetOrigin())); - return true; - } - else - { - return false; - } - } - - std::ostream& operator<< (std::ostream& s, const CoordinateSystem3D& that) - { - s << "origin: " << that.origin_ << " normal: " << that.normal_ - << " axisX: " << that.axisX_ << " axisY: " << that.axisY_ - << " D: " << that.d_; - return s; - } - - - CoordinateSystem3D CoordinateSystem3D::NormalizeCuttingPlane(const CoordinateSystem3D& plane) - { - double ox, oy; - plane.ProjectPoint(ox, oy, LinearAlgebra::CreateVector(0, 0, 0)); - - CoordinateSystem3D normalized(plane); - normalized.SetOrigin(plane.MapSliceToWorldCoordinates(ox, oy)); - return normalized; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/CoordinateSystem3D.h --- a/Framework/Toolbox/CoordinateSystem3D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2D/ScenePoint2D.h" -#include "LinearAlgebra.h" -#include "OrthancDatasets/IDicomDataset.h" - -#include - -namespace OrthancStone -{ - // Geometry of a 3D plane - class CoordinateSystem3D - { - private: - Vector origin_; - Vector normal_; - Vector axisX_; - Vector axisY_; - double d_; - - void CheckAndComputeNormal(); - - void Setup(const std::string& imagePositionPatient, - const std::string& imageOrientationPatient); - - void SetupCanonical(); - - double GetOffset() const; - - public: - CoordinateSystem3D() - { - SetupCanonical(); - } - - friend std::ostream& operator<< (std::ostream& s, const CoordinateSystem3D& that); - - CoordinateSystem3D(const Vector& origin, - const Vector& axisX, - const Vector& axisY); - - CoordinateSystem3D(const IDicomDataset& dicom); - - CoordinateSystem3D(const std::string& imagePositionPatient, - const std::string& imageOrientationPatient) - { - Setup(imagePositionPatient, imageOrientationPatient); - } - - CoordinateSystem3D(const Orthanc::DicomMap& dicom); - - const Vector& GetNormal() const - { - return normal_; - } - - const Vector& GetOrigin() const // This is the "Image Position Patient" tag - { - return origin_; - } - - const Vector& GetAxisX() const - { - return axisX_; - } - - const Vector& GetAxisY() const - { - return axisY_; - } - - void SetOrigin(const Vector& origin); - - Vector MapSliceToWorldCoordinates(double x, - double y) const; - - Vector MapSliceToWorldCoordinates(const ScenePoint2D& p) const - { - return MapSliceToWorldCoordinates(p.GetX(), p.GetY()); - } - - double ProjectAlongNormal(const Vector& point) const; - - void ProjectPoint(double& offsetX, - double& offsetY, - const Vector& point) const; - - ScenePoint2D ProjectPoint(const Vector& point) const - { - double x, y; - ProjectPoint(x, y, point); - return ScenePoint2D(x, y); - } - - /* - Alternated faster implementation (untested yet) - */ - void ProjectPoint2(double& offsetX, - double& offsetY, - const Vector& point) const; - - bool IntersectSegment(Vector& p, - const Vector& edgeFrom, - const Vector& edgeTo) const; - - bool IntersectLine(Vector& p, - const Vector& origin, - const Vector& direction) const; - - // Returns "false" is the two planes are not parallel - static bool ComputeDistance(double& distance, - const CoordinateSystem3D& a, - const CoordinateSystem3D& b); - - // Normalize a cutting plane so that the origin (0,0,0) of the 3D - // world is mapped to the origin of its (x,y) coordinate system - static CoordinateSystem3D NormalizeCuttingPlane(const CoordinateSystem3D& plane); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomInstanceParameters.cpp --- a/Framework/Toolbox/DicomInstanceParameters.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,530 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomInstanceParameters.h" - -#include "../Scene2D/ColorTextureSceneLayer.h" -#include "../Scene2D/FloatTextureSceneLayer.h" -#include "../Toolbox/GeometryToolbox.h" -#include "../Toolbox/ImageToolbox.h" - -#include -#include -#include -#include -#include - - -namespace OrthancStone -{ - void DicomInstanceParameters::Data::ComputeDoseOffsets(const Orthanc::DicomMap& dicom) - { - // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html - - { - std::string increment; - - if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) - { - Orthanc::Toolbox::ToUpperCase(increment); - if (increment != "3004,000C") // This is the "Grid Frame Offset Vector" tag (DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) - { - LOG(ERROR) << "RT-DOSE: Bad value for the \"FrameIncrementPointer\" tag"; - return; - } - } - } - - if (!LinearAlgebra::ParseVector(frameOffsets_, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || - frameOffsets_.size() < imageInformation_.GetNumberOfFrames()) - { - LOG(ERROR) << "RT-DOSE: No information about the 3D location of some slice(s)"; - frameOffsets_.clear(); - } - else - { - if (frameOffsets_.size() >= 2) - { - thickness_ = std::abs(frameOffsets_[1] - frameOffsets_[0]); - } - } - } - - - DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) : - imageInformation_(dicom) - { - if (imageInformation_.GetNumberOfFrames() <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (!dicom.LookupStringValue(studyInstanceUid_, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || - !dicom.LookupStringValue(seriesInstanceUid_, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) || - !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - std::string s; - if (!dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - sopClassUid_ = StringToSopClassUid(s); - } - - if (!dicom.ParseDouble(thickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) - { - thickness_ = 100.0 * std::numeric_limits::epsilon(); - } - - GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); - - std::string position, orientation; - if (dicom.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && - dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) - { - geometry_ = CoordinateSystem3D(position, orientation); - } - - if (sopClassUid_ == SopClassUid_RTDose) - { - ComputeDoseOffsets(dicom); - - static const Orthanc::DicomTag DICOM_TAG_DOSE_UNITS(0x3004, 0x0002); - - if (!dicom.LookupStringValue(doseUnits_, DICOM_TAG_DOSE_UNITS, false)) - { - LOG(ERROR) << "Tag DoseUnits (0x3004, 0x0002) is missing in " << sopInstanceUid_; - doseUnits_ = ""; - } - } - - isColor_ = (imageInformation_.GetPhotometricInterpretation() != Orthanc::PhotometricInterpretation_Monochrome1 && - imageInformation_.GetPhotometricInterpretation() != Orthanc::PhotometricInterpretation_Monochrome2); - - if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && - dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) - { - if (sopClassUid_ == SopClassUid_RTDose) - { - LOG(INFO) << "DOSE HAS Rescale*: rescaleIntercept_ = " << rescaleIntercept_ << " rescaleSlope_ = " << rescaleSlope_; - // WE SHOULD NOT TAKE THE RESCALE VALUE INTO ACCOUNT IN THE CASE OF DOSES - hasRescale_ = false; - } - else - { - hasRescale_ = true; - } - - } - else - { - hasRescale_ = false; - } - - if (dicom.ParseDouble(doseGridScaling_, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) - { - if (sopClassUid_ == SopClassUid_RTDose) - { - LOG(INFO) << "DOSE HAS DoseGridScaling: doseGridScaling_ = " << doseGridScaling_; - } - } - else - { - doseGridScaling_ = 1.0; - if (sopClassUid_ == SopClassUid_RTDose) - { - LOG(ERROR) << "Tag DoseGridScaling (0x3004, 0x000e) is missing in " << sopInstanceUid_ << " doseGridScaling_ will be set to 1.0"; - } - } - - Vector c, w; - if (LinearAlgebra::ParseVector(c, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && - LinearAlgebra::ParseVector(w, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH) && - c.size() > 0 && - w.size() > 0) - { - hasDefaultWindowing_ = true; - defaultWindowingCenter_ = static_cast(c[0]); - defaultWindowingWidth_ = static_cast(w[0]); - } - else - { - hasDefaultWindowing_ = false; - defaultWindowingCenter_ = 0; - defaultWindowingWidth_ = 0; - } - - if (sopClassUid_ == SopClassUid_RTDose) - { - switch (imageInformation_.GetBitsStored()) - { - case 16: - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; - break; - - case 32: - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale32; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - else if (isColor_) - { - expectedPixelFormat_ = Orthanc::PixelFormat_RGB24; - } - else if (imageInformation_.IsSigned()) - { - expectedPixelFormat_ = Orthanc::PixelFormat_SignedGrayscale16; - } - else - { - expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; - } - - // This computes the "IndexInSeries" metadata from Orthanc (check - // out "Orthanc::ServerIndex::Store()") - hasIndexInSeries_ = ( - dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || - dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); - } - - - CoordinateSystem3D DicomInstanceParameters::Data::GetFrameGeometry(unsigned int frame) const - { - if (frame == 0) - { - return geometry_; - } - else if (frame >= imageInformation_.GetNumberOfFrames()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else if (sopClassUid_ == SopClassUid_RTDose) - { - if (frame >= frameOffsets_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - return CoordinateSystem3D( - geometry_.GetOrigin() + frameOffsets_[frame] * geometry_.GetNormal(), - geometry_.GetAxisX(), - geometry_.GetAxisY()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - bool DicomInstanceParameters::Data::IsPlaneWithinSlice(unsigned int frame, - const CoordinateSystem3D& plane) const - { - if (frame >= imageInformation_.GetNumberOfFrames()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - CoordinateSystem3D tmp = geometry_; - - if (frame != 0) - { - tmp = GetFrameGeometry(frame); - } - - double distance; - - return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && - distance <= thickness_ / 2.0); - } - - void DicomInstanceParameters::Data::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, - bool useDouble) const - { - if (image.GetFormat() != Orthanc::PixelFormat_Float32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - double factor = doseGridScaling_; - double offset = 0.0; - - if (hasRescale_) - { - factor *= rescaleSlope_; - offset = rescaleIntercept_; - } - - if ( (factor != 1.0) || (offset != 0.0) ) - { - const unsigned int width = image.GetWidth(); - const unsigned int height = image.GetHeight(); - - for (unsigned int y = 0; y < height; y++) - { - float* p = reinterpret_cast(image.GetRow(y)); - - if (useDouble) - { - // Slower, accurate implementation using double - for (unsigned int x = 0; x < width; x++, p++) - { - double value = static_cast(*p); - *p = static_cast(value * factor + offset); - } - } - else - { - // Fast, approximate implementation using float - for (unsigned int x = 0; x < width; x++, p++) - { - *p = (*p) * static_cast(factor) + static_cast(offset); - } - } - } - } - } - - double DicomInstanceParameters::GetRescaleIntercept() const - { - if (data_.hasRescale_) - { - return data_.rescaleIntercept_; - } - else - { - LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - double DicomInstanceParameters::GetRescaleSlope() const - { - if (data_.hasRescale_) - { - return data_.rescaleSlope_; - } - else - { - LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - float DicomInstanceParameters::GetDefaultWindowingCenter() const - { - if (data_.hasDefaultWindowing_) - { - return data_.defaultWindowingCenter_; - } - else - { - LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingCenter(): no default windowing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - float DicomInstanceParameters::GetDefaultWindowingWidth() const - { - if (data_.hasDefaultWindowing_) - { - return data_.defaultWindowingWidth_; - } - else - { - LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingWidth(): no default windowing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const - { - std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, - pixelData.GetWidth(), - pixelData.GetHeight(), - false)); - Orthanc::ImageProcessing::Convert(*converted, pixelData); - - - // Correct rescale slope/intercept if need be - //data_.ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); - data_.ApplyRescaleAndDoseScaling(*converted, false); - - return converted.release(); - } - - - TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture - (const Orthanc::ImageAccessor& pixelData) const - { - // { - // const Orthanc::ImageAccessor& source = pixelData; - // const void* sourceBuffer = source.GetConstBuffer(); - // intptr_t sourceBufferInt = reinterpret_cast(sourceBuffer); - // int sourceWidth = source.GetWidth(); - // int sourceHeight = source.GetHeight(); - // int sourcePitch = source.GetPitch(); - - // // TODO: turn error into trace below - // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" - // << " W = " << sourceWidth << " H = " << sourceHeight - // << " P = " << sourcePitch << " B = " << sourceBufferInt - // << " B % 4 == " << sourceBufferInt % 4; - // } - - assert(sizeof(float) == 4); - - Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); - - if (sourceFormat != GetExpectedPixelFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (sourceFormat == Orthanc::PixelFormat_RGB24) - { - // This is the case of a color image. No conversion has to be done. - return new ColorTextureSceneLayer(pixelData); - } - else - { - // This is the case of a grayscale frame. Convert it to Float32. - std::unique_ptr texture; - - if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) - { - texture.reset(new FloatTextureSceneLayer(pixelData)); - } - else - { - std::unique_ptr converted(ConvertToFloat(pixelData)); - texture.reset(new FloatTextureSceneLayer(*converted)); - } - - if (data_.hasDefaultWindowing_) - { - texture->SetCustomWindowing(data_.defaultWindowingCenter_, - data_.defaultWindowingWidth_); - } - - - if (data_.imageInformation_.GetPhotometricInterpretation() - == Orthanc::PhotometricInterpretation_Monochrome1) - { - texture->SetInverted(true); - } - else if (data_.imageInformation_.GetPhotometricInterpretation() - == Orthanc::PhotometricInterpretation_Monochrome2) - { - texture->SetInverted(false); - } - - return texture.release(); - } - } - - - LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture - (const Orthanc::ImageAccessor& pixelData) const - { - std::unique_ptr texture; - - if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) - { - return new LookupTableTextureSceneLayer(pixelData); - } - else - { - std::unique_ptr converted(ConvertToFloat(pixelData)); - return new LookupTableTextureSceneLayer(*converted); - } - } - - - unsigned int DicomInstanceParameters::GetIndexInSeries() const - { - if (data_.hasIndexInSeries_) - { - return data_.indexInSeries_; - } - else - { - LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - double DicomInstanceParameters::Data::ApplyRescale(double value) const - { - double factor = doseGridScaling_; - double offset = 0.0; - - if (hasRescale_) - { - factor *= rescaleSlope_; - offset = rescaleIntercept_; - } - - return (value * factor + offset); - } - - - bool DicomInstanceParameters::Data::ComputeRegularSpacing(double& spacing) const - { - if (frameOffsets_.size() == 0) // Not a RT-DOSE - { - return false; - } - else if (frameOffsets_.size() == 1) - { - spacing = 1; // Edge case: RT-DOSE with one single frame - return true; - } - else - { - spacing = std::abs(frameOffsets_[1] - frameOffsets_[0]); - - for (size_t i = 1; i + 1 < frameOffsets_.size(); i++) - { - double s = frameOffsets_[i + 1] - frameOffsets_[i]; - if (!LinearAlgebra::IsNear(spacing, s, 0.001)) - { - return false; - } - } - - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomInstanceParameters.h --- a/Framework/Toolbox/DicomInstanceParameters.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,235 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "../Scene2D/LookupTableTextureSceneLayer.h" -#include "../Toolbox/CoordinateSystem3D.h" - -#include -#include - -namespace OrthancStone -{ - class DicomInstanceParameters : - public Orthanc::IDynamicObject /* to be used as a payload to SlicesSorter */ - { - // This class supersedes the deprecated "DicomFrameConverter" - - private: - struct Data // Struct to ease the copy constructor - { - std::string orthancInstanceId_; - std::string studyInstanceUid_; - std::string seriesInstanceUid_; - std::string sopInstanceUid_; - Orthanc::DicomImageInformation imageInformation_; - SopClassUid sopClassUid_; - double thickness_; - double pixelSpacingX_; - double pixelSpacingY_; - CoordinateSystem3D geometry_; - Vector frameOffsets_; - bool isColor_; - bool hasRescale_; - double rescaleIntercept_; - double rescaleSlope_; - bool hasDefaultWindowing_; - float defaultWindowingCenter_; - float defaultWindowingWidth_; - Orthanc::PixelFormat expectedPixelFormat_; - bool hasIndexInSeries_; - unsigned int indexInSeries_; - std::string doseUnits_; - double doseGridScaling_; - - void ComputeDoseOffsets(const Orthanc::DicomMap& dicom); - - Data(const Orthanc::DicomMap& dicom); - - CoordinateSystem3D GetFrameGeometry(unsigned int frame) const; - - bool IsPlaneWithinSlice(unsigned int frame, - const CoordinateSystem3D& plane) const; - - void ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, - bool useDouble) const; - - double ApplyRescale(double value) const; - - bool ComputeRegularSpacing(double& target) const; - }; - - - Data data_; - - - public: - DicomInstanceParameters(const DicomInstanceParameters& other) : - data_(other.data_) - { - } - - DicomInstanceParameters(const Orthanc::DicomMap& dicom) : - data_(dicom) - { - } - - DicomInstanceParameters* Clone() const - { - return new DicomInstanceParameters(*this); - } - - void SetOrthancInstanceIdentifier(const std::string& id) - { - data_.orthancInstanceId_ = id; - } - - const std::string& GetOrthancInstanceIdentifier() const - { - return data_.orthancInstanceId_; - } - - const Orthanc::DicomImageInformation& GetImageInformation() const - { - return data_.imageInformation_; - } - - const std::string& GetStudyInstanceUid() const - { - return data_.studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return data_.seriesInstanceUid_; - } - - const std::string& GetSopInstanceUid() const - { - return data_.sopInstanceUid_; - } - - SopClassUid GetSopClassUid() const - { - return data_.sopClassUid_; - } - - double GetThickness() const - { - return data_.thickness_; - } - - double GetPixelSpacingX() const - { - return data_.pixelSpacingX_; - } - - double GetPixelSpacingY() const - { - return data_.pixelSpacingY_; - } - - const CoordinateSystem3D& GetGeometry() const - { - return data_.geometry_; - } - - CoordinateSystem3D GetFrameGeometry(unsigned int frame) const - { - return data_.GetFrameGeometry(frame); - } - - bool IsPlaneWithinSlice(unsigned int frame, - const CoordinateSystem3D& plane) const - { - return data_.IsPlaneWithinSlice(frame, plane); - } - - bool IsColor() const - { - return data_.isColor_; - } - - bool HasRescale() const - { - return data_.hasRescale_; - } - - double GetRescaleIntercept() const; - - double GetRescaleSlope() const; - - bool HasDefaultWindowing() const - { - return data_.hasDefaultWindowing_; - } - - float GetDefaultWindowingCenter() const; - - float GetDefaultWindowingWidth() const; - - Orthanc::PixelFormat GetExpectedPixelFormat() const - { - return data_.expectedPixelFormat_; - } - - Orthanc::ImageAccessor* ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const; - - TextureBaseSceneLayer* CreateTexture(const Orthanc::ImageAccessor& pixelData) const; - - LookupTableTextureSceneLayer* CreateLookupTableTexture(const Orthanc::ImageAccessor& pixelData) const; - - bool HasIndexInSeries() const - { - return data_.hasIndexInSeries_; - } - - unsigned int GetIndexInSeries() const; - - const std::string& GetDoseUnits() const - { - return data_.doseUnits_; - } - - void SetDoseGridScaling(double value) - { - data_.doseGridScaling_ = value; - } - - double GetDoseGridScaling() const - { - return data_.doseGridScaling_; - } - - double ApplyRescale(double value) const - { - return data_.ApplyRescale(value); - } - - // Required for RT-DOSE - bool ComputeRegularSpacing(double& target) const - { - return data_.ComputeRegularSpacing(target); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructure2.cpp --- a/Framework/Toolbox/DicomStructure2.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,293 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructure2.h" - -#include "../Toolbox/GeometryToolbox.h" -#include "../Toolbox/DisjointDataSet.h" - -namespace OrthancStone -{ - // see header - //void DicomStructure2::ComputeNormal() - //{ - // try - // { - // if (polygons_.size() > 0) - // { - - // // TODO: check all polygons are OK - // const DicomStructurePolygon2 polygon = polygons_[0]; - // $$$$$$$$$$$$$$$$$ - // state_ = NormalComputed; - // } - // else - // { - // // bogus! no polygons. Let's assign a "nothing here" value - // LinearAlgebra::AssignVector(normal_, 0, 0, 0); - // state_ = Invalid; - // } - // } - // catch (const Orthanc::OrthancException& e) - // { - // state_ = Invalid; - // if (e.HasDetails()) - // { - // LOG(ERROR) << "OrthancException in ComputeNormal: " << e.What() << " Details: " << e.GetDetails(); - // } - // else - // { - // LOG(ERROR) << "OrthancException in ComputeNormal: " << e.What(); - // } - // throw; - // } - // catch (const std::exception& e) - // { - // state_ = Invalid; - // LOG(ERROR) << "std::exception in ComputeNormal: " << e.what(); - // throw; - // } - // catch (...) - // { - // state_ = Invalid; - // LOG(ERROR) << "Unknown exception in ComputeNormal"; - // throw; - // } - //} - - void DicomStructure2::ComputeSliceThickness() - { - if (state_ != NormalComputed) - { - LOG(ERROR) << "DicomStructure2::ComputeSliceThickness - state must be NormalComputed"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - if (polygons_.size() < 2) - { - // cannot compute thickness if there are not at least 2 slabs (structures) - sliceThickness_ = 1.0; - state_ = Invalid; - } - else - { - // normal can be (1,0,0), (0,1,0) or (0,0,1), nothing else. - // these can be compared with == (exact double representation) - if (normal_[0] == 1) - { - // in a single polygon, all the points have the same X - sliceThickness_ = fabs(polygons_[0].GetPoint(0)[0] - polygons_[1].GetPoint(0)[0]); - } - else if (normal_[1] == 1) - { - // in a single polygon, all the points have the same X - sliceThickness_ = fabs(polygons_[0].GetPoint(0)[1] - polygons_[1].GetPoint(0)[1]); - } - else if (normal_[2] == 1) - { - // in a single polygon, all the points have the same X - sliceThickness_ = fabs(polygons_[0].GetPoint(0)[2] - polygons_[1].GetPoint(0)[2]); - } - else - { - ORTHANC_ASSERT(false); - state_ = Invalid; - } - } - state_ = Valid; - } - - void DicomStructure2::AddPolygon(const DicomStructurePolygon2& polygon) - { - if (state_ != Building) - { - LOG(ERROR) << "DicomStructure2::AddPolygon - can only add polygon while building"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - polygons_.push_back(polygon); - } - - void DicomStructure2::ComputeDependentProperties() - { - if (state_ != Building) - { - LOG(ERROR) << "DicomStructure2::ComputeDependentProperties - can only be called once"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - for (size_t i = 0; i < polygons_.size(); ++i) - { - // "compute" the polygon normal - polygons_[i].ComputeDependentProperties(); - } - if (polygons_.size() > 0) - { - normal_ = polygons_[0].GetNormal(); - state_ = NormalComputed; - } - else - { - LinearAlgebra::AssignVector(normal_, 0, 0, 0); - state_ = Invalid; // THIS MAY HAPPEN !!! (for instance for instance 72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661 :) ) - } - if (polygons_.size() >= 2) - ComputeSliceThickness(); // this will change state_ from NormalComputed to Valid - } - - OrthancStone::Vector DicomStructure2::GetNormal() const - { - if (state_ != Valid && state_ != Invalid) - { - LOG(ERROR) << "DicomStructure2::GetNormal() -- please call ComputeDependentProperties first."; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - if (state_ == Invalid) - { - LOG(ERROR) << "DicomStructure2::GetNormal() -- The Dicom structure is invalid. The normal is set to 0,0,0"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - return normal_; - } - - const DicomStructurePolygon2* DicomStructure2::GetPolygonClosestToSlice( - const CoordinateSystem3D& plane) const - { - ORTHANC_ASSERT(state_ == Valid); - - // we assume 0,0,1 for now - ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)); - ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)); - - for (size_t i = 0; i < polygons_.size(); ++i) - { - const DicomStructurePolygon2& polygon = polygons_[i]; - - // "height" of cutting plane - double cutZ = plane.GetOrigin()[2]; - - if (LinearAlgebra::IsNear( - cutZ, polygon.GetZ(), - sliceThickness_ / 2.0 /* in mm */)) - return &polygon; - } - return NULL; - } - - - bool DicomStructure2::Project(std::vector< std::pair > & segments, const CoordinateSystem3D & plane) const - { - segments.clear(); - - Vector normal = GetNormal(); - - size_t totalRectCount = 0; - - // dummy var - bool isOpposite = false; - - // This is an axial projection - if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, plane.GetNormal())) - { - const DicomStructurePolygon2* polygon = GetPolygonClosestToSlice(plane); - if (polygon) - { - polygon->ProjectOnParallelPlane(segments, plane); - } - } - else - { - // let's compute the dot product of the plane normal and the polygons - // normal. - double dot = LinearAlgebra::DotProduct(plane.GetNormal(), normal); - - if (LinearAlgebra::IsNear(dot, 0)) - { - // Coronal or sagittal projection - - // vector of vector of rectangles that will be merged in a single big contour: - - // each polygon slab cut by a perpendicular plane yields 0..* rectangles - std::vector< RtStructRectanglesInSlab > rectanglesForEachSlab; - - for (size_t i = 0; i < polygons_.size(); ++i) - { - // book an entry for this slab - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - - // let's compute the intersection between the polygon and the plane - // intersections are in plane coords - std::vector intersections; - - polygons_[i].ProjectOnConstantPlane(intersections, plane); - - // for each pair of intersections, we add a rectangle. - if ((intersections.size() % 2) != 0) - { - LOG(WARNING) << "Odd number of intersections between structure " - << name_ << ", polygon # " << i - << " and plane where X axis is parallel to polygon normal vector"; - } - - size_t numRects = intersections.size() / 2; - - // we keep count of the total number of rects for vector pre-allocations - totalRectCount += numRects; - - for (size_t iRect = 0; iRect < numRects; ++iRect) - { - RtStructRectangleInSlab rectangle; - ORTHANC_ASSERT(LinearAlgebra::IsNear(intersections[2 * iRect].y, intersections[2 * iRect + 1].y)); - ORTHANC_ASSERT((2 * iRect + 1) < intersections.size()); - double x1 = intersections[2 * iRect].x; - double x2 = intersections[2 * iRect + 1].x; - double y1 = intersections[2 * iRect].y - sliceThickness_ * 0.5; - double y2 = intersections[2 * iRect].y + sliceThickness_ * 0.5; - - rectangle.xmin = std::min(x1, x2); - rectangle.xmax = std::max(x1, x2); - rectangle.ymin = std::min(y1, y2); - rectangle.ymax = std::max(y1, y2); - - // TODO: keep them sorted!!!! - - rectanglesForEachSlab.back().push_back(rectangle); - } - } - // now we need to merge all the slabs into a set of polygons (1 or more) - ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, totalRectCount); - } - else - { - // plane is not perpendicular to the polygons - // 180.0 / [Math]::Pi = 57.2957795130823 - double acDot = 57.2957795130823 * acos(dot); - LOG(ERROR) << "DicomStructure2::Project -- cutting plane must be " - << "perpendicular to the structures, but dot product is: " - << dot << " and (180/pi)*acos(dot) = " << acDot; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - return segments.size() != 0; - } -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructure2.h --- a/Framework/Toolbox/DicomStructure2.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructurePolygon2.h" -#include "DicomStructureSetUtils.h" - -namespace OrthancStone -{ - - /* - A structure has a color, a name, a set of slices.. - - Each slice is a polygon. - */ - struct DicomStructure2 - { - DicomStructure2() : - red_(0), green_(0), blue_(0), sliceThickness_(0), state_(Building) {} - - void AddPolygon(const DicomStructurePolygon2& polygon); - - /** - Once all polygons have been added, this method will determine: - - the slice orientation (through the normal vector) - - the spacing between slices (slice thickness) - - it will also set up the info required to efficiently compute plane - intersections later on. - */ - void ComputeDependentProperties(); - - /** - Being given a plane that is PARALLEL to the set of polygon structures, this - returns a pointer to the polygon located at that position (if it is closer - than thickness/2) or NULL if there is none. - - TODO: use sorted vector to improve - - DO NOT STORE THE RETURNED POINTER! - */ - const DicomStructurePolygon2* GetPolygonClosestToSlice(const CoordinateSystem3D& plane) const; - - Vector GetNormal() const; - - Color GetColor() const - { - return Color(red_, green_, blue_); - } - - bool IsValid() const - { - return state_ == Valid; - } - - /** - This method is used to project the 3D structure on a 2D plane. - - A structure is a stack of polygons, representing a volume. - - We need to compute the intersection between this volume and the supplied - cutting plane (the "slice"). This is more than a cutting plane: it is also - a 2D-coordinate system (the plane has axes vectors) - - The cutting plane is always parallel to the plane defined by two of the - world coordinate system axes. - - The result is a set of closed polygons. - - If the cut is parallel to the polygons, we pick the polygon closest to - the slice, project it on the slice and return it in slice coordinates. - - If the cut is perpendicular to the polygons, for each polygon, we compute - the intersection between the cutting plane and the polygon slab (imaginary - volume created by extruding the polygon above and below its plane by - thickness/2) : - - each slab, intersected by the plane, gives a set of 0..* rectangles \ - (only one if the polygon is convex) - - when doing this for the whole stack of slabs, we get a set of rectangles: - To compute these rectangles, for each polygon, we compute the intersection - between : - - the line defined by the intersection of the polygon plane and the cutting - plane - - the polygon itself - This yields 0 or 2*K points along the line C. These are turned into K - rectangles by taking two consecutive points along the line and extruding - this segment by sliceThickness/2 in the orientation of the polygon normal, - in both directions. - - Then, once this list of rectangles is computed, we need to group the - connected rectangles together. Connected, here, means sharing at least part - of an edge --> union/find data structures and algorithm. - */ - bool Project(std::vector< std::pair >& polygons, const CoordinateSystem3D& plane) const; - - std::string interpretation_; - std::string name_; - uint8_t red_; - uint8_t green_; - uint8_t blue_; - - /** Internal */ - const std::vector& GetPolygons() const - { - return polygons_; - } - - /** Internal */ - double GetSliceThickness() const - { - return sliceThickness_; - } - - private: - enum State - { - Building, - NormalComputed, - Valid, // When normal components AND slice thickness are computed - Invalid - }; - - void ComputeNormal(); - void ComputeSliceThickness(); - - std::vector polygons_; - Vector3D normal_; - double sliceThickness_; - - /* - After creation (and while polygons are added), state is Building. - After ComputeDependentProperties() is called, state can either be - Valid or Invalid. In any case, the object becomes immutable. - */ - State state_; - }; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructurePolygon2.cpp --- a/Framework/Toolbox/DicomStructurePolygon2.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,305 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructurePolygon2.h" - -#include "../Toolbox/LinearAlgebra.h" - -namespace OrthancStone -{ - void DicomStructurePolygon2::ComputeDependentProperties() - { - ORTHANC_ASSERT(state_ == Building); - - for (size_t j = 0; j < points_.size(); ++j) - { - // TODO: move to AddPoint! - const Point3D& p = points_[j]; - if (p[0] < minX_) - minX_ = p[0]; - if (p[0] > maxX_) - maxX_ = p[0]; - - if (p[1] < minY_) - minY_ = p[1]; - if (p[1] > maxY_) - maxY_ = p[1]; - - if (p[2] < minZ_) - minZ_ = p[2]; - if (p[2] > maxZ_) - maxZ_ = p[2]; - } - - if (LinearAlgebra::IsNear(minX_, maxX_)) - { - LinearAlgebra::AssignVector(normal_, 1, 0, 0); - //ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX, maxX)); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minY_, maxY_)); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minZ_, maxZ_)); - } - else if (LinearAlgebra::IsNear(minY_, maxY_)) - { - LinearAlgebra::AssignVector(normal_, 0, 1, 0); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX_, maxX_)); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minZ_, maxZ_)); - } - else if (LinearAlgebra::IsNear(minZ_, maxZ_)) - { - LinearAlgebra::AssignVector(normal_, 0, 0, 1); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX_, maxX_)); - ORTHANC_ASSERT(!LinearAlgebra::IsNear(minY_, maxY_)); - } - else - { - LOG(ERROR) << "The contour is not coplanar and not parallel to any axis."; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - state_ = Valid; - } - - - void DicomStructurePolygon2::ProjectOnConstantPlane( - std::vector& intersections, const CoordinateSystem3D& plane) const - { - // the plane can either have constant X, or constant Y. - // - for constant Z planes, use the ProjectOnParallelPlane method - // - other type of planes are not supported - - // V is the coordinate that is constant in the plane - double planeV = 0.0; - - // if true, then "u" in the code is "x" and "v" is "y". - // (v is constant in the plane) - bool uvxy = false; - - size_t uindex = static_cast(-1); - size_t vindex = static_cast(-1); - - ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[2], 0.0)); - - if (LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)) - { - // normal is 1,0,0 (or -1,0,0). - // plane is constant X - uindex = 1; - vindex = 0; - - uvxy = false; - planeV = plane.GetOrigin()[0]; - if (planeV < minX_) - return; - if (planeV > maxX_) - return; - } - else if (LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)) - { - // normal is 0,1,0 (or 0,-1,0). - // plane is constant Y - uindex = 0; - vindex = 1; - - uvxy = true; - planeV = plane.GetOrigin()[1]; - if (planeV < minY_) - return; - if (planeV > maxY_) - return; - } - else - { - // if the following assertion(s) fail(s), it means the plane is NOT a constant-X or constant-Y plane - LOG(ERROR) << "Plane normal must be (a,0,0) or (0,a,0), with a == -1 or a == 1"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - size_t pointCount = GetPointCount(); - if (pointCount >= 3) - { - // this vector will contain the coordinates of the intersection points - // between the plane and the polygon. - // these are expressed in the U coordinate, that is either X or Y, - // depending upon the plane orientation - std::vector uIntersections; - - // we loop on the segments of the polygon (TODO: optimize) - // and we compute the intersection between each segment and the cut - // cutting plane (slice) has a constant X - - for (size_t iPoint = 0; iPoint < pointCount; ++iPoint) - { - double u1 = points_[iPoint][uindex]; - double v1 = points_[iPoint][vindex]; - - double u2 = 0; - double v2 = 0; - - if (iPoint < pointCount - 1) - { - u2 = points_[iPoint + 1][uindex]; - v2 = points_[iPoint + 1][vindex]; - } - else - { - u2 = points_[0][uindex]; - v2 = points_[0][vindex]; - } - - // Check if the segment intersects the plane - if ((std::min(v1, v2) <= planeV) && (std::max(v1, v2) >= planeV)) - { - // special case: the segment is parallel to the plane but close to it - if (LinearAlgebra::IsNear(v1, v2)) - { - // in that case, we choose to label both points as an intersection - double x, y; - plane.ProjectPoint(x, y, points_[iPoint]); - intersections.push_back(Point2D(x, y)); - - plane.ProjectPoint(x, y, points_[iPoint + 1]); - intersections.push_back(Point2D(x, y)); - } - else - { - // we are looking for u so that (u,planeV) belongs to the segment - // let's define alpha = (u-u2)/(u1-u2) --> u = alpha*(u1-u2) + u2 - // alpha = (v2-planeV)/(v2-v1) - // because the following two triangles are similar - // [ (planeY,x) , (y2,x2), (planeY,x2) ] or - // [ (planeX,y) , (x2,y2), (planeX,y2) ] - // and - // [ (y1 ,x1) , (y2,x2), (y1 ,x2) ] or - // [ (x1 ,y1) , (x2,y2), (x1 ,y2) ] - - /* - void CoordinateSystem3D::ProjectPoint(double& offsetX, - double& offsetY, - const Vector& point) const - */ - double alpha = (v2 - planeV) / (v2 - v1); - - // get rid of numerical oddities - if (alpha < 0.0) - alpha = 0.0; - if (alpha > 1.0) - alpha = 1.0; - double u = alpha * (u1 - u2) + u2; - - // here is the intersection in world coordinates - Vector intersection; - if(uvxy) - LinearAlgebra::AssignVector(intersection, u, planeV, minZ_); - else - LinearAlgebra::AssignVector(intersection, planeV, u, minZ_); - - // and we convert it to plane coordinates - { - double xi, yi; - plane.ProjectPoint(xi, yi, intersection); - - // we consider that the x axis is always parallel to the polygons - // TODO: is this hypothesis safe?????? - uIntersections.insert(std::lower_bound(uIntersections.begin(), uIntersections.end(), xi), xi); - } - } - } - } // end of for (size_t iPoint = 0; iPoint < pointCount; ++iPoint) - - // now we convert the intersections to plane points - // we consider that the x axis is always parallel to the polygons - // TODO: same hypothesis as above: plane is perpendicular to polygons, - // plane is parallel to the XZ (constant Y) or YZ (constant X) 3D planes - for (size_t i = 0; i < uIntersections.size(); ++i) - { - double x = uIntersections[i]; - intersections.push_back(Point2D(x, minZ_)); - } - } // end of if (pointCount >= 3) - else - { - LOG(ERROR) << "This polygon has " << pointCount << " vertices, which is less than 3 --> skipping"; - } - } - -void OrthancStone::DicomStructurePolygon2::ProjectOnParallelPlane( - std::vector< std::pair >& segments, - const CoordinateSystem3D& plane) const -{ - if (points_.size() < 3) - return; - - // the plane is horizontal - ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)); - ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)); - - segments.clear(); - segments.reserve(points_.size()); - // since the returned values need to be expressed in the supplied coordinate - // system, we need to subtract origin_ from the returned points - - double planeOriginX = plane.GetOrigin()[0]; - double planeOriginY = plane.GetOrigin()[1]; - - // precondition: points_.size() >= 3 - for (size_t j = 0; j < points_.size()-1; ++j) - { - // segment between point j and j+1 - - const Point3D& point0 = GetPoint(j); - // subtract plane origin x and y - Point2D p0(point0[0] - planeOriginX, point0[1] - planeOriginY); - - const Point3D& point1 = GetPoint(j+1); - // subtract plane origin x and y - Point2D p1(point1[0] - planeOriginX, point1[1] - planeOriginY); - - segments.push_back(std::pair(p0,p1)); - } - - - // final segment - - const Point3D& point0 = GetPoint(points_.size() - 1); - // subtract plane origin x and y - Point2D p0(point0[0] - planeOriginX, point0[1] - planeOriginY); - - const Point3D& point1 = GetPoint(0); - // subtract plane origin x and y - Point2D p1(point1[0] - planeOriginX, point1[1] - planeOriginY); - - segments.push_back(std::pair(p0, p1)); -} - -double OrthancStone::DicomStructurePolygon2::GetZ() const -{ - ORTHANC_ASSERT(LinearAlgebra::IsNear(normal_[0], 0.0)); - ORTHANC_ASSERT(LinearAlgebra::IsNear(normal_[1], 0.0)); - ORTHANC_ASSERT(LinearAlgebra::IsNear(minZ_, maxZ_)); - return minZ_; -} - - -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructurePolygon2.h --- a/Framework/Toolbox/DicomStructurePolygon2.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "CoordinateSystem3D.h" -#include "DicomStructureSetUtils.h" -#include "Extent2D.h" - -#include "../Scene2D/Color.h" -#include "../StoneException.h" - -#include - -#include -#include - -namespace OrthancStone -{ - - /** - Only polygons that are planar and parallel to either the X,Y or Z plane - ("X plane" == plane where X is equal to a constant for each point) are - supported. - */ - class DicomStructurePolygon2 - { - public: - enum Type - { - ClosedPlanar, - Unsupported - }; - - DicomStructurePolygon2(std::string referencedSopInstanceUid, const std::string& type) - : referencedSopInstanceUid_(referencedSopInstanceUid) - , state_(Building) - , minX_(std::numeric_limits::max()) - , maxX_(-std::numeric_limits::max()) - , minY_(std::numeric_limits::max()) - , maxY_(-std::numeric_limits::max()) - , minZ_(std::numeric_limits::max()) - , maxZ_(-std::numeric_limits::max()) - , type_(TypeFromString(type)) - { - ORTHANC_ASSERT(type_ == ClosedPlanar); - } - - void ComputeDependentProperties(); - - size_t GetPointCount() const - { - ORTHANC_ASSERT(state_ == Valid); - return points_.size(); - } - - const Point3D& GetPoint(size_t i) const - { - ORTHANC_ASSERT(state_ == Valid); - return points_.at(i); - } - - void AddPoint(const Point3D& v) - { - ORTHANC_ASSERT(state_ == Building); - points_.push_back(v); - } - - void Reserve(size_t n) - { - ORTHANC_ASSERT(state_ == Building); - points_.reserve(n); - } - - /** - This method takes a plane+coord system that is parallel to the polygon - and adds to polygons a new vector with the ordered set of points projected - on the plane, in the plane coordinate system. - */ - void ProjectOnParallelPlane( - std::vector< std::pair >& segments, - const CoordinateSystem3D& plane) const; - - /** - Returns the coordinates of the intersection of the polygon and a plane - that is perpendicular to the polygons (plane has either constant X or - constant Y) - */ - void ProjectOnConstantPlane( - std::vector& intersections, - const CoordinateSystem3D& plane) const; - - /** - This method assumes polygon has a normal equal to 0,0,-1 and 0,0,1 (thus, - the polygon is parallel to the XY plane) and returns the Z coordinate of - all the polygon points - */ - double GetZ() const; - - /** - The normal sign is left undefined for now - */ - Vector3D GetNormal() const - { - return normal_; - } - - /** - This method will compute the intersection between a polygon and - a plane where either X, Y or Z is constant. - The plane is given with an origin and a normal. If the normal is - not parallel to an axis, an error is raised. - */ - void ComputeIntersectionWithPlane(const CoordinateSystem3D& plane); - - private: - static Type TypeFromString(const std::string& s) - { - if (s == "CLOSED_PLANAR") - return ClosedPlanar; - else - return Unsupported; - } - enum State - { - Building, - Valid - }; - std::string referencedSopInstanceUid_; - CoordinateSystem3D geometry_; - std::vector points_; - Vector3D normal_; // sign is irrelevant for now - State state_; - double minX_, maxX_, minY_, maxY_, minZ_, maxZ_; - Type type_; - }; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSet.cpp --- a/Framework/Toolbox/DicomStructureSet.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1067 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomStructureSet.h" -#include "DicomStructureSetUtils.h" - -#include "../Toolbox/GeometryToolbox.h" -#include "OrthancDatasets/DicomDatasetReader.h" - -#include -#include -#include - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable:4244) -#endif - -#include -#include -#include -#include -#include -#include - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif - -#if ORTHANC_ENABLE_DCMTK == 1 -# include "ParsedDicomDataset.h" -#endif - - -typedef boost::geometry::model::d2::point_xy BoostPoint; -typedef boost::geometry::model::polygon BoostPolygon; -typedef boost::geometry::model::multi_polygon BoostMultiPolygon; - - -static void Union(BoostMultiPolygon& output, - std::vector& input) -{ - for (size_t i = 0; i < input.size(); i++) - { - boost::geometry::correct(input[i]); - } - - if (input.size() == 0) - { - output.clear(); - } - else if (input.size() == 1) - { - output.resize(1); - output[0] = input[0]; - } - else - { - boost::geometry::union_(input[0], input[1], output); - - for (size_t i = 0; i < input.size(); i++) - { - BoostMultiPolygon tmp; - boost::geometry::union_(output, input[i], tmp); - output = tmp; - } - } -} - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - -static BoostPolygon CreateRectangle(float x1, float y1, - float x2, float y2) -{ - BoostPolygon r; - boost::geometry::append(r, BoostPoint(x1, y1)); - boost::geometry::append(r, BoostPoint(x1, y2)); - boost::geometry::append(r, BoostPoint(x2, y2)); - boost::geometry::append(r, BoostPoint(x2, y1)); - return r; -} - -#else - -namespace OrthancStone -{ - static RtStructRectangleInSlab CreateRectangle(float x1, float y1, - float x2, float y2) - { - RtStructRectangleInSlab rect; - rect.xmin = std::min(x1, x2); - rect.xmax = std::max(x1, x2); - rect.ymin = std::min(y1, y2); - rect.ymax = std::max(y1, y2); - return rect; - } - - bool CompareRectanglesForProjection(const std::pair& r1, const std::pair& r2) - { - return r1.second < r2.second; - } - - bool CompareSlabsY(const RtStructRectanglesInSlab& r1, const RtStructRectanglesInSlab& r2) - { - if ((r1.size() == 0) || (r2.size() == 0)) - return false; - - return r1[0].ymax < r2[0].ymax; - } -} - -#endif - -namespace OrthancStone -{ - static const Orthanc::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); - static const Orthanc::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); - static const Orthanc::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); - static const Orthanc::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); - static const Orthanc::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); - static const Orthanc::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); - static const Orthanc::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); - static const Orthanc::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); - static const Orthanc::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); - static const Orthanc::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); - static const Orthanc::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); - static const Orthanc::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); - - - static uint8_t ConvertColor(double v) - { - if (v < 0) - { - return 0; - } - else if (v >= 255) - { - return 255; - } - else - { - return static_cast(v); - } - } - - - static bool ParseVector(Vector& target, - const IDicomDataset& dataset, - const DicomPath& tag) - { - std::string value; - return (dataset.GetStringValue(value, tag) && - LinearAlgebra::ParseVector(target, value)); - } - - void DicomStructureSet::Polygon::CheckPointIsOnSlice(const Vector& v) const - { - if (hasSlice_) - { - double magnitude = - GeometryToolbox::ProjectAlongNormal(v, geometry_.GetNormal()); - if(!LinearAlgebra::IsNear( - magnitude, - projectionAlongNormal_, - sliceThickness_ / 2.0 /* in mm */ )) - { - LOG(ERROR) << "This RT-STRUCT contains a point that is off the " - << "slice of its instance | " - << "magnitude = " << magnitude << " | " - << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " - << "tolerance (sliceThickness_ / 2.0) = " << (sliceThickness_ / 2.0); - - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - } - - bool DicomStructureSet::Polygon::IsPointOnSliceIfAny(const Vector& v) const - { - if (hasSlice_) - { - double magnitude = - GeometryToolbox::ProjectAlongNormal(v, geometry_.GetNormal()); - bool onSlice = LinearAlgebra::IsNear( - magnitude, - projectionAlongNormal_, - sliceThickness_ / 2.0 /* in mm */); - if (!onSlice) - { - LOG(WARNING) << "This RT-STRUCT contains a point that is off the " - << "slice of its instance | " - << "magnitude = " << magnitude << " | " - << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " - << "tolerance (sliceThickness_ / 2.0) = " << (sliceThickness_ / 2.0); - } - return onSlice; - } - else - { - return true; - } - } - - void DicomStructureSet::Polygon::AddPoint(const Vector& v) - { -#if 1 - // BGO 2019-09-03 - if (IsPointOnSliceIfAny(v)) - { - points_.push_back(v); - } -#else - CheckPoint(v); - points_.push_back(v); -#endif - } - - - bool DicomStructureSet::Polygon::UpdateReferencedSlice(const ReferencedSlices& slices) - { - if (hasSlice_) - { - return true; - } - else - { - ReferencedSlices::const_iterator it = slices.find(sopInstanceUid_); - - if (it == slices.end()) - { - return false; - } - else - { - const CoordinateSystem3D& geometry = it->second.geometry_; - - hasSlice_ = true; - geometry_ = geometry; - projectionAlongNormal_ = GeometryToolbox::ProjectAlongNormal(geometry.GetOrigin(), geometry.GetNormal()); - sliceThickness_ = it->second.thickness_; - - extent_.Reset(); - - for (Points::const_iterator it = points_.begin(); it != points_.end(); ++it) - { - if (IsPointOnSliceIfAny(*it)) - { - double x, y; - geometry.ProjectPoint2(x, y, *it); - extent_.AddPoint(x, y); - } - } - return true; - } - } - } - - bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& slice) const - { - bool isOpposite = false; - - if (points_.empty() || - !hasSlice_ || - !GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), geometry_.GetNormal())) - { - return false; - } - - double d = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), geometry_.GetNormal()); - - return (LinearAlgebra::IsNear(d, projectionAlongNormal_, - sliceThickness_ / 2.0)); - } - - bool DicomStructureSet::Polygon::Project(double& x1, - double& y1, - double& x2, - double& y2, - const CoordinateSystem3D& slice) const - { - // TODO: optimize this method using a sweep-line algorithm for polygons - - if (!hasSlice_ || - points_.size() <= 1) - { - return false; - } - - double x, y; - geometry_.ProjectPoint2(x, y, slice.GetOrigin()); - - bool isOpposite; - if (GeometryToolbox::IsParallelOrOpposite - (isOpposite, slice.GetNormal(), geometry_.GetAxisY())) - { - // plane is constant Y - - if (y < extent_.GetY1() || - y > extent_.GetY2()) - { - // The polygon does not intersect the input slice - return false; - } - - bool isFirst = true; - double xmin = std::numeric_limits::infinity(); - double xmax = -std::numeric_limits::infinity(); - - double prevX, prevY; - geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); - - for (size_t i = 0; i < points_.size(); i++) - { - // Reference: ../../Resources/Computations/IntersectSegmentAndHorizontalLine.py - double curX, curY; - geometry_.ProjectPoint2(curX, curY, points_[i]); - - // if prev* and cur* are on opposite sides of y, this means that the - // segment intersects the plane. - if ((prevY < y && curY > y) || - (prevY > y && curY < y)) - { - double p = (curX * prevY - curY * prevX + y * (prevX - curX)) / (prevY - curY); - xmin = std::min(xmin, p); - xmax = std::max(xmax, p); - isFirst = false; - - // xmin and xmax represent the extent of the rectangle along the - // intersection between the plane and the polygon geometry - - } - - prevX = curX; - prevY = curY; - } - - // if NO segment intersects the plane - if (isFirst) - { - return false; - } - else - { - // y is the plane y coord in the polygon geometry - // xmin and xmax are ALSO expressed in the polygon geometry - - // let's convert them to 3D world geometry... - Vector p1 = (geometry_.MapSliceToWorldCoordinates(xmin, y) + - sliceThickness_ / 2.0 * geometry_.GetNormal()); - Vector p2 = (geometry_.MapSliceToWorldCoordinates(xmax, y) - - sliceThickness_ / 2.0 * geometry_.GetNormal()); - - // then to the cutting plane geometry... - slice.ProjectPoint2(x1, y1, p1); - slice.ProjectPoint2(x2, y2, p2); - return true; - } - } - else if (GeometryToolbox::IsParallelOrOpposite - (isOpposite, slice.GetNormal(), geometry_.GetAxisX())) - { - // plane is constant X => Sagittal view (remember that in the - // sagittal projection, the normal must be swapped) - - - /* - Please read the comments in the section above, by taking into account - the fact that, in this case, the plane has a constant X, not Y (in - polygon geometry_ coordinates) - */ - - if (x < extent_.GetX1() || - x > extent_.GetX2()) - { - return false; - } - - bool isFirst = true; - double ymin = std::numeric_limits::infinity(); - double ymax = -std::numeric_limits::infinity(); - - double prevX, prevY; - geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); - - for (size_t i = 0; i < points_.size(); i++) - { - // Reference: ../../Resources/Computations/IntersectSegmentAndVerticalLine.py - double curX, curY; - geometry_.ProjectPoint2(curX, curY, points_[i]); - - if ((prevX < x && curX > x) || - (prevX > x && curX < x)) - { - double p = (curX * prevY - curY * prevX + x * (curY - prevY)) / (curX - prevX); - ymin = std::min(ymin, p); - ymax = std::max(ymax, p); - isFirst = false; - } - - prevX = curX; - prevY = curY; - } - - if (isFirst) - { - return false; - } - else - { - Vector p1 = (geometry_.MapSliceToWorldCoordinates(x, ymin) + - sliceThickness_ / 2.0 * geometry_.GetNormal()); - Vector p2 = (geometry_.MapSliceToWorldCoordinates(x, ymax) - - sliceThickness_ / 2.0 * geometry_.GetNormal()); - - slice.ProjectPoint2(x1, y1, p1); - slice.ProjectPoint2(x2, y2, p2); - - return true; - } - } - else - { - // Should not happen - return false; - } - } - - - const DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) const - { - if (index >= structures_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - return structures_[index]; - } - - - DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) - { - if (index >= structures_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - return structures_[index]; - } - - void DicomStructureSet::Setup(const IDicomDataset& tags) - { - DicomDatasetReader reader(tags); - - size_t count, tmp; - if (!tags.GetSequenceSize(count, DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE) || - !tags.GetSequenceSize(tmp, DICOM_TAG_ROI_CONTOUR_SEQUENCE) || - tmp != count || - !tags.GetSequenceSize(tmp, DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE) || - tmp != count) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - structures_.resize(count); - for (size_t i = 0; i < count; i++) - { - structures_[i].interpretation_ = reader.GetStringValue - (DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, - DICOM_TAG_RT_ROI_INTERPRETED_TYPE), - "No interpretation"); - - structures_[i].name_ = reader.GetStringValue - (DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, - DICOM_TAG_ROI_NAME), - "No name"); - - Vector color; - if (ParseVector(color, tags, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_ROI_DISPLAY_COLOR)) && - color.size() == 3) - { - structures_[i].red_ = ConvertColor(color[0]); - structures_[i].green_ = ConvertColor(color[1]); - structures_[i].blue_ = ConvertColor(color[2]); - } - else - { - structures_[i].red_ = 255; - structures_[i].green_ = 0; - structures_[i].blue_ = 0; - } - - size_t countSlices; - if (!tags.GetSequenceSize(countSlices, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE))) - { - countSlices = 0; - } - - LOG(INFO) << "New RT structure: \"" << structures_[i].name_ - << "\" with interpretation \"" << structures_[i].interpretation_ - << "\" containing " << countSlices << " slices (color: " - << static_cast(structures_[i].red_) << "," - << static_cast(structures_[i].green_) << "," - << static_cast(structures_[i].blue_) << ")"; - - // These temporary variables avoid allocating many vectors in the loop below - DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); - - DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); - - DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); - - // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) - DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, - DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); - - DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_DATA); - - for (size_t j = 0; j < countSlices; j++) - { - unsigned int countPoints; - - countPointsPath.SetPrefixIndex(1, j); - if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; - - geometricTypePath.SetPrefixIndex(1, j); - std::string type = reader.GetMandatoryStringValue(geometricTypePath); - if (type != "CLOSED_PLANAR") - { - LOG(WARNING) << "Ignoring contour with geometry type: " << type; - continue; - } - - size_t size; - - imageSequencePath.SetPrefixIndex(1, j); - if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) - { - LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - referencedInstancePath.SetPrefixIndex(1, j); - std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); - - contourDataPath.SetPrefixIndex(1, j); - std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); - - Vector points; - if (!LinearAlgebra::ParseVector(points, slicesData) || - points.size() != 3 * countPoints) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - // seen in real world - if(Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") - { - LOG(ERROR) << "WARNING. The following Dicom tag (Referenced SOP Instance UID) contains an empty value : // (3006,0039)[" << i << "] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)"; - } - - Polygon polygon(sopInstanceUid); - polygon.Reserve(countPoints); - - for (size_t k = 0; k < countPoints; k++) - { - Vector v(3); - v[0] = points[3 * k]; - v[1] = points[3 * k + 1]; - v[2] = points[3 * k + 2]; - polygon.AddPoint(v); - } - - structures_[i].polygons_.push_back(polygon); - } - } - } - - -#if ORTHANC_ENABLE_DCMTK == 1 - DicomStructureSet::DicomStructureSet(Orthanc::ParsedDicomFile& instance) - { - ParsedDicomDataset dataset(instance); - Setup(dataset); - } -#endif - - - Vector DicomStructureSet::GetStructureCenter(size_t index) const - { - const Structure& structure = GetStructure(index); - - Vector center; - LinearAlgebra::AssignVector(center, 0, 0, 0); - if (structure.polygons_.empty()) - { - return center; - } - - double n = static_cast(structure.polygons_.size()); - - for (Polygons::const_iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - if (!polygon->GetPoints().empty()) - { - center += polygon->GetPoints().front() / n; - } - } - - return center; - } - - - const std::string& DicomStructureSet::GetStructureName(size_t index) const - { - return GetStructure(index).name_; - } - - - const std::string& DicomStructureSet::GetStructureInterpretation(size_t index) const - { - return GetStructure(index).interpretation_; - } - - - Color DicomStructureSet::GetStructureColor(size_t index) const - { - const Structure& s = GetStructure(index); - return Color(s.red_, s.green_, s.blue_); - } - - - void DicomStructureSet::GetStructureColor(uint8_t& red, - uint8_t& green, - uint8_t& blue, - size_t index) const - { - const Structure& s = GetStructure(index); - red = s.red_; - green = s.green_; - blue = s.blue_; - } - - - void DicomStructureSet::GetReferencedInstances(std::set& instances) - { - for (Structures::const_iterator structure = structures_.begin(); - structure != structures_.end(); ++structure) - { - for (Polygons::const_iterator polygon = structure->polygons_.begin(); - polygon != structure->polygons_.end(); ++polygon) - { - instances.insert(polygon->GetSopInstanceUid()); - } - } - } - - - void DicomStructureSet::AddReferencedSlice(const std::string& sopInstanceUid, - const std::string& seriesInstanceUid, - const CoordinateSystem3D& geometry, - double thickness) - { - if (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()) - { - // This geometry is already known - LOG(ERROR) << "DicomStructureSet::AddReferencedSlice(): (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()). sopInstanceUid = " << sopInstanceUid; - - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - if (thickness < 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (!referencedSlices_.empty()) - { - const ReferencedSlice& reference = referencedSlices_.begin()->second; - - if (reference.seriesInstanceUid_ != seriesInstanceUid) - { - LOG(ERROR) << "This RT-STRUCT refers to several different series"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (!GeometryToolbox::IsParallel(reference.geometry_.GetNormal(), geometry.GetNormal())) - { - LOG(ERROR) << "The slices in this RT-STRUCT are not parallel"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - referencedSlices_[sopInstanceUid] = ReferencedSlice(seriesInstanceUid, geometry, thickness); - - for (Structures::iterator structure = structures_.begin(); - structure != structures_.end(); ++structure) - { - for (Polygons::iterator polygon = structure->polygons_.begin(); - polygon != structure->polygons_.end(); ++polygon) - { - polygon->UpdateReferencedSlice(referencedSlices_); - } - } - } - } - - - void DicomStructureSet::AddReferencedSlice(const Orthanc::DicomMap& dataset) - { - CoordinateSystem3D slice(dataset); - - double thickness = 1; // 1 mm by default - - std::string s; - Vector v; - if (dataset.LookupStringValue(s, Orthanc::DICOM_TAG_SLICE_THICKNESS, false) && - LinearAlgebra::ParseVector(v, s) && - v.size() > 0) - { - thickness = v[0]; - } - - std::string instance, series; - if (dataset.LookupStringValue(instance, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false) && - dataset.LookupStringValue(series, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - AddReferencedSlice(instance, series, slice, thickness); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void DicomStructureSet::CheckReferencedSlices() - { - for (Structures::iterator structure = structures_.begin(); - structure != structures_.end(); ++structure) - { - for (Polygons::iterator polygon = structure->polygons_.begin(); - polygon != structure->polygons_.end(); ++polygon) - { - if (!polygon->UpdateReferencedSlice(referencedSlices_)) - { - std::string sopInstanceUid = polygon->GetSopInstanceUid(); - if (Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") - { - LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " - << " missing information about referenced instance " - << "(sopInstanceUid is empty!)"; - } - else - { - LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " - << " missing information about referenced instance " - << "(sopInstanceUid = " << sopInstanceUid << ")"; - } - //throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - } - } - - - Vector DicomStructureSet::GetNormal() const - { - if (referencedSlices_.empty()) - { - Vector v; - LinearAlgebra::AssignVector(v, 0, 0, 1); - return v; - } - else - { - return referencedSlices_.begin()->second.geometry_.GetNormal(); - } - } - - bool DicomStructureSet::ProjectStructure( -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - std::vector< std::vector >& polygons, -#else - std::vector< std::pair >& segments, -#endif - const Structure& structure, - const CoordinateSystem3D& sourceSlice) const - { - const CoordinateSystem3D slice = CoordinateSystem3D::NormalizeCuttingPlane(sourceSlice); - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - polygons.clear(); -#else - segments.clear(); -#endif - - Vector normal = GetNormal(); - - bool isOpposite; - if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetNormal())) - { - // This is an axial projection - - for (Polygons::const_iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - if (polygon->IsOnSlice(slice)) - { -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - polygons.push_back(std::vector()); - - for (Points::const_iterator p = polygon->GetPoints().begin(); - p != polygon->GetPoints().end(); ++p) - { - double x, y; - slice.ProjectPoint2(x, y, *p); - polygons.back().push_back(Point2D(x, y)); - } -#else - // we need to add all the segments corresponding to this polygon - const std::vector& points3D = polygon->GetPoints(); - if (points3D.size() >= 3) - { - Point2D prev2D; - { - Vector prev = points3D[0]; - double prevX, prevY; - slice.ProjectPoint2(prevX, prevY, prev); - prev2D = Point2D(prevX, prevY); - } - - size_t pointCount = points3D.size(); - for (size_t ipt = 1; ipt < pointCount; ++ipt) - { - Vector next = points3D[ipt]; - double nextX, nextY; - slice.ProjectPoint2(nextX, nextY, next); - Point2D next2D(nextX, nextY); - segments.push_back(std::pair(prev2D, next2D)); - prev2D = next2D; - } - } - else - { - LOG(ERROR) << "Contour with less than 3 points!"; - // !!! - } -#endif - } - } - - return true; - } - else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisX()) || - GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisY())) - { -#if 1 - // Sagittal or coronal projection - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - std::vector projected; - - for (Polygons::const_iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - double x1, y1, x2, y2; - - if (polygon->Project(x1, y1, x2, y2, slice)) - { - projected.push_back(CreateRectangle(x1, y1, x2, y2)); - } - } -#else - // this will contain the intersection of the polygon slab with - // the cutting plane, projected on the cutting plane coord system - // (that yields a rectangle) + the Z coordinate of the polygon - // (this is required to group polygons with the same Z later) - std::vector > projected; - - for (Polygons::const_iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - double x1, y1, x2, y2; - - if (polygon->Project(x1, y1, x2, y2, slice)) - { - double curZ = polygon->GetGeometryOrigin()[2]; - - // x1,y1 and x2,y2 are in "slice" coordinates (the cutting plane - // geometry) - projected.push_back(std::make_pair(CreateRectangle( - static_cast(x1), - static_cast(y1), - static_cast(x2), - static_cast(y2)),curZ)); - } - } -#endif - -#if USE_BOOST_UNION_FOR_POLYGONS != 1 - // projected contains a set of rectangles specified by two opposite - // corners (x1,y1,x2,y2) - // we need to merge them - // each slab yields ONE polygon! - - // we need to sorted all the rectangles that originate from the same Z - // into lanes. To make sure they are grouped together in the array, we - // sort it. - std::sort(projected.begin(), projected.end(), CompareRectanglesForProjection); - - std::vector rectanglesForEachSlab; - rectanglesForEachSlab.reserve(projected.size()); - - double curZ = 0; - for (size_t i = 0; i < projected.size(); ++i) - { -#if 0 - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); -#else - if (i == 0) - { - curZ = projected[i].second; - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - } - else - { - // this check is needed to prevent creating a new slab if - // the new polygon is at the same Z coord than last one - if (!LinearAlgebra::IsNear(curZ, projected[i].second)) - { - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - curZ = projected[i].second; - } - } -#endif - - rectanglesForEachSlab.back().push_back(projected[i].first); - - // as long as they have the same y, we should put them into the same lane - // BUT in Sebastien's code, there is only one polygon per lane. - - //std::cout << "rect: xmin = " << rect.xmin << " xmax = " << rect.xmax << " ymin = " << rect.ymin << " ymax = " << rect.ymax << std::endl; - } - - // now we need to sort the slabs in increasing Y order (see ConvertListOfSlabsToSegments) - std::sort(rectanglesForEachSlab.begin(), rectanglesForEachSlab.end(), CompareSlabsY); - - ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, projected.size()); -#else - BoostMultiPolygon merged; - Union(merged, projected); - - polygons.resize(merged.size()); - for (size_t i = 0; i < merged.size(); i++) - { - const std::vector& outer = merged[i].outer(); - - polygons[i].resize(outer.size()); - for (size_t j = 0; j < outer.size(); j++) - { - polygons[i][j] = Point2D(outer[j].x(), outer[j].y()); - } - } -#endif - -#else - for (Polygons::iterator polygon = structure.polygons_.begin(); - polygon != structure.polygons_.end(); ++polygon) - { - double x1, y1, x2, y2; - if (polygon->Project(x1, y1, x2, y2, slice)) - { - std::vector p(4); - p[0] = std::make_pair(x1, y1); - p[1] = std::make_pair(x2, y1); - p[2] = std::make_pair(x2, y2); - p[3] = std::make_pair(x1, y2); - polygons.push_back(p); - } - } -#endif - - return true; - } - else - { - return false; - } - } - - - void DicomStructureSet::ProjectOntoLayer(PolylineSceneLayer& layer, - const CoordinateSystem3D& plane, - size_t structureIndex, - const Color& color) const - { -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - std::vector< std::vector > polygons; - if (ProjectStructure(polygons, structureIndex, plane)) - { - for (size_t j = 0; j < polygons.size(); j++) - { - std::vector chain; - chain.reserve(polygons[j].size()); - - for (size_t k = 0; k < polygons[j].size(); k++) - { - chain.push_back(ScenePoint2D(polygons[j][k].x, polygons[j][k].y)); - } - - layer.AddChain(chain, true, color.GetRed(), color.GetGreen(), color.GetBlue()); - } - } - -#else - std::vector< std::pair > segments; - - if (ProjectStructure(segments, structureIndex, plane)) - { - for (size_t j = 0; j < segments.size(); j++) - { - std::vector chain(2); - chain[0] = ScenePoint2D(segments[j].first.x, segments[j].first.y); - chain[1] = ScenePoint2D(segments[j].second.x, segments[j].second.y); - layer.AddChain(chain, false, color.GetRed(), color.GetGreen(), color.GetBlue()); - } - } -#endif - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSet.h --- a/Framework/Toolbox/DicomStructureSet.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,236 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../OrthancStone.h" - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error The macro ORTHANC_ENABLE_DCMTK must be defined -#endif - -#include "DicomStructureSetUtils.h" -#include "CoordinateSystem3D.h" -#include "Extent2D.h" -#include "OrthancDatasets/FullOrthancDataset.h" -#include "../Scene2D/Color.h" -#include "../Scene2D/PolylineSceneLayer.h" - -#if ORTHANC_ENABLE_DCMTK == 1 -# include -#endif - -//#define USE_BOOST_UNION_FOR_POLYGONS 1 - - -#include - -namespace OrthancStone -{ - class DicomStructureSet : public boost::noncopyable - { - private: - struct ReferencedSlice - { - std::string seriesInstanceUid_; - CoordinateSystem3D geometry_; - double thickness_; - - ReferencedSlice() - { - } - - ReferencedSlice(const std::string& seriesInstanceUid, - const CoordinateSystem3D& geometry, - double thickness) : - seriesInstanceUid_(seriesInstanceUid), - geometry_(geometry), - thickness_(thickness) - { - } - }; - - typedef std::map ReferencedSlices; - - typedef std::vector Points; - - class Polygon - { - private: - std::string sopInstanceUid_; - bool hasSlice_; - CoordinateSystem3D geometry_; - double projectionAlongNormal_; - double sliceThickness_; // In millimeters - Points points_; - Extent2D extent_; - - void CheckPointIsOnSlice(const Vector& v) const; - bool IsPointOnSliceIfAny(const Vector& v) const; - - public: - Polygon(const std::string& sopInstanceUid) : - sopInstanceUid_(sopInstanceUid), - hasSlice_(false) - { - } - - void Reserve(size_t n) - { - points_.reserve(n); - } - - void AddPoint(const Vector& v); - - bool UpdateReferencedSlice(const ReferencedSlices& slices); - - bool IsOnSlice(const CoordinateSystem3D& geometry) const; - - const Vector& GetGeometryOrigin() const - { - return geometry_.GetOrigin(); - } - - const std::string& GetSopInstanceUid() const - { - return sopInstanceUid_; - } - - const Points& GetPoints() const - { - return points_; - } - - double GetSliceThickness() const - { - return sliceThickness_; - } - - bool Project(double& x1, - double& y1, - double& x2, - double& y2, - const CoordinateSystem3D& slice) const; - }; - - typedef std::list Polygons; - - struct Structure - { - std::string name_; - std::string interpretation_; - Polygons polygons_; - uint8_t red_; - uint8_t green_; - uint8_t blue_; - }; - - typedef std::vector Structures; - - Structures structures_; - ReferencedSlices referencedSlices_; - - void Setup(const IDicomDataset& dataset); - - const Structure& GetStructure(size_t index) const; - - Structure& GetStructure(size_t index); - - bool ProjectStructure( -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - std::vector< std::vector >& polygons, -#else - std::vector< std::pair >& segments, -#endif - const Structure& structure, - const CoordinateSystem3D& slice) const; - - public: - DicomStructureSet(const FullOrthancDataset& instance) - { - Setup(instance); - } - -#if ORTHANC_ENABLE_DCMTK == 1 - DicomStructureSet(Orthanc::ParsedDicomFile& instance); -#endif - - size_t GetStructuresCount() const - { - return structures_.size(); - } - - Vector GetStructureCenter(size_t index) const; - - const std::string& GetStructureName(size_t index) const; - - const std::string& GetStructureInterpretation(size_t index) const; - - Color GetStructureColor(size_t index) const; - - // TODO - remove - void GetStructureColor(uint8_t& red, - uint8_t& green, - uint8_t& blue, - size_t index) const; - - void GetReferencedInstances(std::set& instances); - - void AddReferencedSlice(const std::string& sopInstanceUid, - const std::string& seriesInstanceUid, - const CoordinateSystem3D& geometry, - double thickness); - - void AddReferencedSlice(const Orthanc::DicomMap& dataset); - - void CheckReferencedSlices(); - - Vector GetNormal() const; - -#if USE_BOOST_UNION_FOR_POLYGONS == 1 - bool ProjectStructure(std::vector< std::vector >& polygons, - size_t index, - const CoordinateSystem3D& slice) const - { - return ProjectStructure(polygons, GetStructure(index), slice); - } -#else - bool ProjectStructure(std::vector< std::pair >& segments, - size_t index, - const CoordinateSystem3D& slice) const - { - return ProjectStructure(segments, GetStructure(index), slice); - } -#endif - - void ProjectOntoLayer(PolylineSceneLayer& layer, - const CoordinateSystem3D& plane, - size_t structureIndex, - const Color& color) const; - - void ProjectOntoLayer(PolylineSceneLayer& layer, - const CoordinateSystem3D& plane, - size_t structureIndex) const - { - ProjectOntoLayer(layer, plane, structureIndex, GetStructureColor(structureIndex)); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSet2.cpp --- a/Framework/Toolbox/DicomStructureSet2.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,311 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructureSet2.h" - -#include "../Toolbox/LinearAlgebra.h" -#include "../StoneException.h" - -#include -#include -#include -#include - -#include -#include - -namespace OrthancStone -{ - static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); - static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); - static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); - static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); - static const OrthancPlugins::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); - static const OrthancPlugins::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); - static const OrthancPlugins::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); - static const OrthancPlugins::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); - static const OrthancPlugins::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); - static const OrthancPlugins::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); - static const OrthancPlugins::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); - static const OrthancPlugins::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); - - static inline uint8_t ConvertAndClipToByte(double v) - { - if (v < 0) - { - return 0; - } - else if (v >= 255) - { - return 255; - } - else - { - return static_cast(v); - } - } - - static bool ReadDicomToVector(Vector& target, - const OrthancPlugins::IDicomDataset& dataset, - const OrthancPlugins::DicomPath& tag) - { - std::string value; - return (dataset.GetStringValue(value, tag) && - LinearAlgebra::ParseVector(target, value)); - } - - - void DicomPathToString(std::string& s, const OrthancPlugins::DicomPath& dicomPath) - { - std::stringstream tmp; - for (size_t i = 0; i < dicomPath.GetPrefixLength(); ++i) - { - OrthancPlugins::DicomTag tag = dicomPath.GetPrefixTag(i); - - // We use this other object to be able to use GetMainTagsName - // and Format - Orthanc::DicomTag tag2(tag.GetGroup(), tag.GetElement()); - size_t index = dicomPath.GetPrefixIndex(i); - tmp << tag2.GetMainTagsName() << " (" << tag2.Format() << ") [" << index << "] / "; - } - const OrthancPlugins::DicomTag& tag = dicomPath.GetFinalTag(); - Orthanc::DicomTag tag2(tag.GetGroup(), tag.GetElement()); - tmp << tag2.GetMainTagsName() << " (" << tag2.Format() << ")"; - s = tmp.str(); - } - - std::ostream& operator<<(std::ostream& s, const OrthancPlugins::DicomPath& dicomPath) - { - std::string tmp; - DicomPathToString(tmp, dicomPath); - s << tmp; - return s; - } - - - DicomStructureSet2::DicomStructureSet2() - { - - } - - - DicomStructureSet2::~DicomStructureSet2() - { - - } - - void DicomStructureSet2::SetContents(const OrthancPlugins::FullOrthancDataset& tags) - { - FillStructuresFromDataset(tags); - ComputeDependentProperties(); - } - - void DicomStructureSet2::ComputeDependentProperties() - { - for (size_t i = 0; i < structures_.size(); ++i) - { - structures_[i].ComputeDependentProperties(); - } - } - - void DicomStructureSet2::FillStructuresFromDataset(const OrthancPlugins::FullOrthancDataset& tags) - { - OrthancPlugins::DicomDatasetReader reader(tags); - - // a few sanity checks - size_t count = 0, tmp = 0; - - // DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE (0x3006, 0x0080); - // DICOM_TAG_ROI_CONTOUR_SEQUENCE (0x3006, 0x0039); - // DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE (0x3006, 0x0020); - if (!tags.GetSequenceSize(count, DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE) || - !tags.GetSequenceSize(tmp, DICOM_TAG_ROI_CONTOUR_SEQUENCE) || - tmp != count || - !tags.GetSequenceSize(tmp, DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE) || - tmp != count) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - // let's now parse the structures stored in the dicom file - // DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE (0x3006, 0x0080) - // DICOM_TAG_RT_ROI_INTERPRETED_TYPE (0x3006, 0x00a4) - // DICOM_TAG_ROI_DISPLAY_COLOR (0x3006, 0x002a) - // DICOM_TAG_ROI_NAME (0x3006, 0x0026) - structures_.resize(count); - for (size_t i = 0; i < count; i++) - { - // (0x3006, 0x0080)[i]/(0x3006, 0x00a4) - structures_[i].interpretation_ = reader.GetStringValue - (OrthancPlugins::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, - DICOM_TAG_RT_ROI_INTERPRETED_TYPE), - "No interpretation"); - - // (0x3006, 0x0020)[i]/(0x3006, 0x0026) - structures_[i].name_ = reader.GetStringValue - (OrthancPlugins::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, - DICOM_TAG_ROI_NAME), - "No name"); - - Vector color; - // (0x3006, 0x0039)[i]/(0x3006, 0x002a) - if (ReadDicomToVector(color, tags, OrthancPlugins::DicomPath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, DICOM_TAG_ROI_DISPLAY_COLOR)) - && color.size() == 3) - { - structures_[i].red_ = ConvertAndClipToByte(color[0]); - structures_[i].green_ = ConvertAndClipToByte(color[1]); - structures_[i].blue_ = ConvertAndClipToByte(color[2]); - } - else - { - structures_[i].red_ = 255; - structures_[i].green_ = 0; - structures_[i].blue_ = 0; - } - - size_t countSlices; - // DICOM_TAG_ROI_CONTOUR_SEQUENCE (0x3006, 0x0039); - // DICOM_TAG_CONTOUR_SEQUENCE (0x3006, 0x0040); - if (!tags.GetSequenceSize(countSlices, OrthancPlugins::DicomPath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, DICOM_TAG_CONTOUR_SEQUENCE))) - { - LOG(WARNING) << "DicomStructureSet2::SetContents | structure \"" << structures_[i].name_ << "\" has no slices!"; - countSlices = 0; - } - - LOG(INFO) << "New RT structure: \"" << structures_[i].name_ - << "\" with interpretation \"" << structures_[i].interpretation_ - << "\" containing " << countSlices << " slices (color: " - << static_cast(structures_[i].red_) << "," - << static_cast(structures_[i].green_) << "," - << static_cast(structures_[i].blue_) << ")"; - - // These temporary variables avoid allocating many vectors in the loop below - - // (0x3006, 0x0039)[i]/(0x3006, 0x0040)[0]/(0x3006, 0x0046) - OrthancPlugins::DicomPath countPointsPath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); - - OrthancPlugins::DicomPath geometricTypePath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); - - OrthancPlugins::DicomPath imageSequencePath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); - - // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) - OrthancPlugins::DicomPath referencedInstancePath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, - DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); - - OrthancPlugins::DicomPath contourDataPath( - DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, - DICOM_TAG_CONTOUR_SEQUENCE, 0, - DICOM_TAG_CONTOUR_DATA); - - for (size_t j = 0; j < countSlices; j++) - { - unsigned int countPoints = 0; - - countPointsPath.SetPrefixIndex(1, j); - if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) - { - std::string s; - DicomPathToString(s, countPointsPath); - LOG(ERROR) << "Dicom path " << s << " is not valid (should contain an unsigned integer)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; - - geometricTypePath.SetPrefixIndex(1, j); - std::string type = reader.GetMandatoryStringValue(geometricTypePath); - if (type != "CLOSED_PLANAR") - { - // TODO: support points!! - LOG(WARNING) << "Ignoring contour with geometry type: " << type; - continue; - } - - size_t size = 0; - - imageSequencePath.SetPrefixIndex(1, j); - if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) - { - LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - referencedInstancePath.SetPrefixIndex(1, j); - std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); - - contourDataPath.SetPrefixIndex(1, j); - std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); - - Vector points; - if (!LinearAlgebra::ParseVector(points, slicesData) || - points.size() != 3 * countPoints) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - // seen in real world - if (Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") - { - LOG(ERROR) << "WARNING. The following Dicom tag (Referenced SOP Instance UID) contains an empty value : // (3006,0039)[" << i << "] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)"; - } - - DicomStructurePolygon2 polygon(sopInstanceUid,type); - polygon.Reserve(countPoints); - - for (size_t k = 0; k < countPoints; k++) - { - Vector v(3); - v[0] = points[3 * k]; - v[1] = points[3 * k + 1]; - v[2] = points[3 * k + 2]; - polygon.AddPoint(v); - } - structures_[i].AddPolygon(polygon); - } - } - } - - - void DicomStructureSet2::Clear() - { - structures_.clear(); - } - -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSet2.h --- a/Framework/Toolbox/DicomStructureSet2.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructure2.h" -#include "CoordinateSystem3D.h" -#include "Extent2D.h" -#include "../Scene2D/Color.h" - -#include - -#include - -namespace OrthancStone -{ - class DicomStructureSet2 : public boost::noncopyable - { - public: - DicomStructureSet2(); - ~DicomStructureSet2(); - - void SetContents(const OrthancPlugins::FullOrthancDataset& tags); - - size_t GetStructuresCount() const - { - return structures_.size(); - } - - void Clear(); - - const DicomStructure2& GetStructure(size_t i) const - { - // at() is like []() but with range check - return structures_.at(i); - } - - /** Internal use only */ - void FillStructuresFromDataset(const OrthancPlugins::FullOrthancDataset& tags); - - /** Internal use only */ - void ComputeDependentProperties(); - - /** Internal use only */ - std::vector structures_; - }; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSetUtils.cpp --- a/Framework/Toolbox/DicomStructureSetUtils.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,276 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "DicomStructureSetUtils.h" - -namespace OrthancStone -{ - -#if 0 - void DicomStructure2::PartitionRectangleList(std::vector< std::vector > & sets, const std::vector slabCuts) - { - // map position ( )--> disjoint set index - std::map, size_t> posToIndex; - - // disjoint set index --> position - std::map > indexToPos; - - size_t nextIndex = 0; - for (size_t i = 0; i < slabCuts.size(); ++i) - { - for (size_t j = 0; j < slabCuts[i].size(); ++j) - { - std::pair pos(i, j); - posToIndex = nextIndex; - indexToPos = pos; - } - } - // nextIndex is now the total rectangle count - DisjointDataSet ds(nextIndex); - - // we loop on all slabs (except the last one) and we connect all rectangles - if (slabCuts.size() < 2) - { -#error write special case - } - else - { - for (size_t i = 0; i < slabCuts.size() - 1; ++i) - { - for (size_t j = 0; j < slabCuts[i].size(); ++j) - { - const RtStructRectangleInSlab& r1 = slabCuts[i][j]; - const size_t r1i = posToIndex(std::pair(i, j)); - for (size_t k = 0; k < slabCuts[i + 1].size(); ++k) - { - const RtStructRectangleInSlab& r2 = slabCuts[i + 1][k]; - const size_t r2i = posToIndex(std::pair(i, j)); - // rect.xmin <= rectBottom.xmax && rectBottom.xmin <= rect.xmax - if ((r1.xmin <= r2.xmax) && (r2.xmin <= r1.xmax)) - { -#error now go! - } - - } - } - } - } -#endif - - /* - - compute list of segments : - - numberOfRectsFromHereOn = 0 - possibleNext = {in_k,in_kplus1} - - for all boundaries: - - we create a vertical segment and we push it - - if boundary is a start, numberOfRectsFromHereOn += 1. - - if we switch from 0 to 1, we start a segment - - if we switch from 1 to 2, we end the current segment and we record it - - if boundary is an end, numberOfRectsFromHereOn -= 1. - - if we switch from 1 to 0, we end the current segment and we record it - - if we switch from 2 to 1, we start a segment - */ - - // static - void AddSlabBoundaries( - std::vector > & boundaries, - const std::vector & slabCuts, size_t iSlab) - { - if (iSlab < slabCuts.size()) - { - const RtStructRectanglesInSlab& slab = slabCuts[iSlab]; - for (size_t iRect = 0; iRect < slab.size(); ++iRect) - { - const RtStructRectangleInSlab& rect = slab[iRect]; - { - std::pair boundary(rect.xmin, RectangleBoundaryKind_Start); - boundaries.insert(std::lower_bound(boundaries.begin(), boundaries.end(), boundary), boundary); - } - { - std::pair boundary(rect.xmax, RectangleBoundaryKind_End); - boundaries.insert(std::lower_bound(boundaries.begin(), boundaries.end(), boundary), boundary); - } - } - } - } - - // static - void ProcessBoundaryList( - std::vector< std::pair > & segments, - const std::vector > & boundaries, - double y) - { - Point2D start; - Point2D end; - int curNumberOfSegments = 0; // we count the number of segments. we only draw if it is 1 (not 0 or 2) - for (size_t i = 0; i < boundaries.size(); ++i) - { - switch (boundaries[i].second) - { - case RectangleBoundaryKind_Start: - curNumberOfSegments += 1; - switch (curNumberOfSegments) - { - case 0: - assert(false); - break; - case 1: - // a new segment has begun! - start.x = boundaries[i].first; - start.y = y; - break; - case 2: - // an extra segment has begun : stop the current one (we don't draw overlaps) - end.x = boundaries[i].first; - end.y = y; - segments.push_back(std::pair(start, end)); - break; - default: - //assert(false); // seen IRL ! - break; - } - break; - case RectangleBoundaryKind_End: - curNumberOfSegments -= 1; - switch (curNumberOfSegments) - { - case 0: - // a lone (thus active) segment has ended. - end.x = boundaries[i].first; - end.y = y; - segments.push_back(std::pair(start, end)); - break; - case 1: - // an extra segment has ended : start a new one one - start.x = boundaries[i].first; - start.y = y; - break; - default: - // this should not happen! - //assert(false); - break; - } - break; - default: - assert(false); - break; - } - } - } - -#if 0 - void ConvertListOfSlabsToSegments( - std::vector< std::pair >& segments, - const std::vector& slabCuts, - const size_t totalRectCount) - { -#error to delete - } -#else - // See https://www.dropbox.com/s/bllco6q8aazxk44/2019-09-18-rtstruct-cut-algorithm-rect-merge.png - void ConvertListOfSlabsToSegments( - std::vector< std::pair > & segments, - const std::vector & slabCuts, - const size_t totalRectCount) - { - if (slabCuts.size() == 0) - return; - - if (totalRectCount > 0) - segments.reserve(4 * totalRectCount); // worst case, but common. - - /* - VERTICAL - */ - for (size_t iSlab = 0; iSlab < slabCuts.size(); ++iSlab) - { - for (size_t iRect = 0; iRect < slabCuts[iSlab].size(); ++iRect) - { - const RtStructRectangleInSlab& rect = slabCuts[iSlab][iRect]; - { - Point2D p1(rect.xmin, rect.ymin); - Point2D p2(rect.xmin, rect.ymax); - segments.push_back(std::pair(p1, p2)); - } - { - Point2D p1(rect.xmax, rect.ymin); - Point2D p2(rect.xmax, rect.ymax); - segments.push_back(std::pair(p1, p2)); - } - } - } - - /* - HORIZONTAL - */ - - // if we have N slabs, we have N+1 potential vertical positions for horizontal segments - // - one for top of slab 0 - // - N-1 for all positions between two slabs - // - one for bottom of slab N-1 - - // this adds all the horizontal segments for the tops of 3the rectangles - // in row 0 - if (slabCuts[0].size() > 0) - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, 0); - - ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); - } - - // this adds all the horizontal segments belonging to two slabs - for (size_t iSlab = 0; iSlab < slabCuts.size() - 1; ++iSlab) - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, iSlab); - AddSlabBoundaries(boundaries, slabCuts, iSlab + 1); - double curY = 0; - if (slabCuts[iSlab].size() > 0) - { - curY = slabCuts[iSlab][0].ymax; - ProcessBoundaryList(segments, boundaries, curY); - } - else if (slabCuts[iSlab + 1].size() > 0) - { - curY = slabCuts[iSlab + 1][0].ymin; - ProcessBoundaryList(segments, boundaries, curY); - } - else - { - // nothing to do!! : both slab lists are empty! - } - } - - // this adds all the horizontal segments for the BOTTOM of the rectangles - // on last row - if (slabCuts[slabCuts.size() - 1].size() > 0) - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, slabCuts.size() - 1); - - ProcessBoundaryList(segments, boundaries, slabCuts[slabCuts.size() - 1][0].ymax); - } - } -#endif - } diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DicomStructureSetUtils.h --- a/Framework/Toolbox/DicomStructureSetUtils.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include - -#include "../Toolbox/LinearAlgebra.h" - -namespace OrthancStone -{ -#if 0 - struct Point3D - { - Point3D(double x, double y, double z) : x(x), y(y), z(z) {} - Point3D() : x(0), y(0), z(0) {} - double x, y, z; - }; - - struct Vector3D - { - Vector3D(double x, double y, double z) : x(x), y(y), z(z) {} - Vector3D() : x(0), y(0), z(0) {} - double x, y, z; - }; -#else - typedef Vector Vector3D; - typedef Vector Point3D; -#endif - - struct Point2D - { - Point2D(double x, double y) : x(x), y(y) {} - Point2D() : x(0), y(0) {} - double x, y; - }; - - - /** Internal */ - struct RtStructRectangleInSlab - { - double xmin, xmax, ymin, ymax; - }; - typedef std::vector RtStructRectanglesInSlab; - - enum RectangleBoundaryKind - { - RectangleBoundaryKind_Start, - RectangleBoundaryKind_End - }; - -#if 0 - /** Internal */ - void PartitionRectangleList(std::vector< std::vector > & sets, const std::vector); -#endif - - /** Internal */ - void ConvertListOfSlabsToSegments(std::vector< std::pair >& segments, const std::vector& slabCuts, const size_t totalRectCount); - - /** Internal */ - void AddSlabBoundaries(std::vector >& boundaries, const std::vector& slabCuts, size_t iSlab); - - /** Internal */ - void ProcessBoundaryList(std::vector< std::pair >& segments, const std::vector >& boundaries, double y); - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DisjointDataSet.h --- a/Framework/Toolbox/DisjointDataSet.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include - -#include "../StoneException.h" - -namespace OrthancStone -{ - class DisjointDataSet - { - public: - DisjointDataSet(size_t itemCount) : - parents_(itemCount), - ranks_(itemCount) - { - for (size_t index = 0; index < parents_.size(); index++) - { - SetParent(index,index); - ranks_[index] = 1; - } - } - - size_t Find(size_t item) - { - /* - If parents_[i] == i, it means i is representative of a set. - Otherwise, we go up the tree... - */ - if (GetParent(item) != item) - { - // if item is not a top item (representative of its set), - // we use path compression to improve future lookups - // see: https://en.wikipedia.org/wiki/Disjoint-set_data_structure#Path_compression - SetParent(item, Find(parents_[item])); - } - - // now that paths have been compressed, we are positively certain - // that item's parent is a set ("X is a set" means that X is the - // representative of a set) - return GetParent(item); - } - - /* - This merge the two sets that contains itemA and itemB - */ - void Union(size_t itemA, size_t itemB) - { - // Find current sets of x and y - size_t setA = Find(itemA); - size_t setB = Find(itemB); - - // if setA == setB, it means they are already in the same set and - // do not need to be merged! - if (setA != setB) - { - // we need to merge the sets, which means that the trees representing - // the sets needs to be merged (there must be a single top parent to - // all the items originally belonging to setA and setB must be the same) - - // since the algorithm speed is inversely proportional to the tree - // height (the rank), we need to combine trees in a way that - // minimizes this rank. See "Union by rank" at - // https://en.wikipedia.org/wiki/Disjoint-set_data_structure#by_rank - if (GetRank(setA) < GetRank(setB)) - { - SetParent(setA, setB); - } - else if (GetRank(setA) > GetRank(setB)) - { - SetParent(setB, setA); - } - else - { - SetParent(setB, setA); - BumpRank(setA); - // the trees had the same height but we attached the whole of setB - // under setA (under its parent), so the resulting tree is now - // 1 higher. setB is NOT representative of a set anymore. - } - } - } - - private: - size_t GetRank(size_t i) const - { - ORTHANC_ASSERT(i < ranks_.size()); - ORTHANC_ASSERT(ranks_.size() == parents_.size()); - return ranks_[i]; - } - - size_t GetParent(size_t i) const - { - ORTHANC_ASSERT(i < parents_.size()); - ORTHANC_ASSERT(ranks_.size() == parents_.size()); - return parents_[i]; - } - - void SetParent(size_t i, size_t parent) - { - ORTHANC_ASSERT(i < parents_.size()); - ORTHANC_ASSERT(ranks_.size() == parents_.size()); - parents_[i] = parent; - } - - void BumpRank(size_t i) - { - ORTHANC_ASSERT(i < ranks_.size()); - ORTHANC_ASSERT(ranks_.size() == parents_.size()); - ranks_[i] = ranks_[i] + 1u; - } - - /* - This vector contains the direct parent of each item - */ - std::vector parents_; - - /* - This vector contains the tree height of each set. The values in the - vector for non-representative items is UNDEFINED! - */ - std::vector ranks_; - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DynamicBitmap.cpp --- a/Framework/Toolbox/DynamicBitmap.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DynamicBitmap.h" - -#include -#include - -namespace OrthancStone -{ - DynamicBitmap::DynamicBitmap(const Orthanc::ImageAccessor& bitmap) : - bitmap_(Orthanc::Image::Clone(bitmap)) - { - if (bitmap_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/DynamicBitmap.h --- a/Framework/Toolbox/DynamicBitmap.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include -#include - -#include - -namespace OrthancStone -{ - class DynamicBitmap : public Orthanc::IDynamicObject - { - private: - std::unique_ptr bitmap_; - - public: - DynamicBitmap(const Orthanc::ImageAccessor& bitmap); - - const Orthanc::ImageAccessor& GetBitmap() const - { - return *bitmap_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/Extent2D.cpp --- a/Framework/Toolbox/Extent2D.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Extent2D.h" - -#include -#include -#include - -namespace OrthancStone -{ - Extent2D::Extent2D(double x1, - double y1, - double x2, - double y2) : - empty_(false), - x1_(x1), - y1_(y1), - x2_(x2), - y2_(y2) - { - if (x1_ > x2_) - { - std::swap(x1_, x2_); - } - - if (y1_ > y2_) - { - std::swap(y1_, y2_); - } - } - - - void Extent2D::Reset() - { - empty_ = true; - x1_ = 0; - y1_ = 0; - x2_ = 0; - y2_ = 0; - } - - void Extent2D::AddPoint(double x, - double y) - { - if (empty_) - { - x1_ = x; - y1_ = y; - x2_ = x; - y2_ = y; - empty_ = false; - } - else - { - x1_ = std::min(x1_, x); - y1_ = std::min(y1_, y); - x2_ = std::max(x2_, x); - y2_ = std::max(y2_, y); - } - - assert(x1_ <= x2_ && - y1_ <= y2_); // This is the invariant of the structure - } - - - void Extent2D::Union(const Extent2D& other) - { - if (other.empty_) - { - return; - } - - if (empty_) - { - *this = other; - return; - } - - assert(!empty_); - - x1_ = std::min(x1_, other.x1_); - y1_ = std::min(y1_, other.y1_); - x2_ = std::max(x2_, other.x2_); - y2_ = std::max(y2_, other.y2_); - - assert(x1_ <= x2_ && - y1_ <= y2_); // This is the invariant of the structure - } - - - bool Extent2D::IsEmpty() const - { - if (empty_) - { - return true; - } - else - { - assert(x1_ <= x2_ && - y1_ <= y2_); - return (x2_ <= x1_ + 10 * std::numeric_limits::epsilon() || - y2_ <= y1_ + 10 * std::numeric_limits::epsilon()); - } - } - - - bool Extent2D::Contains(double x, - double y) const - { - if (empty_) - { - return false; - } - else - { - return (x >= x1_ && x <= x2_ && - y >= y1_ && y <= y2_); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/Extent2D.h --- a/Framework/Toolbox/Extent2D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -namespace OrthancStone -{ - class Extent2D - { - private: - bool empty_; - double x1_; - double y1_; - double x2_; - double y2_; - - public: - Extent2D() - { - Reset(); - } - - Extent2D(double x1, - double y1, - double x2, - double y2); - - void Reset(); - - void AddPoint(double x, - double y); - - void Union(const Extent2D& other); - - bool IsEmpty() const; - - double GetX1() const - { - return x1_; - } - - double GetY1() const - { - return y1_; - } - - double GetX2() const - { - return x2_; - } - - double GetY2() const - { - return y2_; - } - - double GetWidth() const - { - return x2_ - x1_; - } - - double GetHeight() const - { - return y2_ - y1_; - } - - double GetCenterX() const - { - return (x1_ + x2_) / 2.0; - } - - double GetCenterY() const - { - return (y1_ + y2_) / 2.0; - } - - bool Contains(double x, - double y) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/FiniteProjectiveCamera.cpp --- a/Framework/Toolbox/FiniteProjectiveCamera.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,461 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "FiniteProjectiveCamera.h" - -#include "GeometryToolbox.h" -#include "SubpixelReader.h" - -#include -#include -#include -#include - -namespace OrthancStone -{ - void FiniteProjectiveCamera::ComputeMInverse() - { - using namespace boost::numeric::ublas; - - // inv(M) = inv(K * R) = inv(R) * inv(K) = R' * inv(K). This - // matrix is always invertible, by definition of finite - // projective cameras (page 157). - Matrix kinv; - LinearAlgebra::InvertUpperTriangularMatrix(kinv, k_); - minv_ = prod(trans(r_), kinv); - } - - - void FiniteProjectiveCamera::Setup(const Matrix& k, - const Matrix& r, - const Vector& c) - { - if (k.size1() != 3 || - k.size2() != 3 || - !LinearAlgebra::IsCloseToZero(k(1, 0)) || - !LinearAlgebra::IsCloseToZero(k(2, 0)) || - !LinearAlgebra::IsCloseToZero(k(2, 1))) - { - LOG(ERROR) << "Invalid intrinsic parameters"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (r.size1() != 3 || - r.size2() != 3) - { - LOG(ERROR) << "Invalid size for a 3D rotation matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (!LinearAlgebra::IsRotationMatrix(r, 100.0 * std::numeric_limits::epsilon())) - { - LOG(ERROR) << "Invalid rotation matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (c.size() != 3) - { - LOG(ERROR) << "Invalid camera center"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - k_ = k; - r_ = r; - c_ = c; - - ComputeMInverse(); - - Matrix tmp = LinearAlgebra::IdentityMatrix(3); - tmp.resize(3, 4); - tmp(0, 3) = -c[0]; - tmp(1, 3) = -c[1]; - tmp(2, 3) = -c[2]; - - p_ = LinearAlgebra::Product(k, r, tmp); - - assert(p_.size1() == 3 && - p_.size2() == 4); - - } - - - void FiniteProjectiveCamera::Setup(const Matrix& p) - { - if (p.size1() != 3 || - p.size2() != 4) - { - LOG(ERROR) << "Invalid camera matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - p_ = p; - - // M is the left 3x3 submatrix of "P" - Matrix m = p; - m.resize(3, 3); - - // p4 is the last column of "P" - Vector p4(3); - p4[0] = p(0, 3); - p4[1] = p(1, 3); - p4[2] = p(2, 3); - - // The RQ decomposition is explained on page 157 - LinearAlgebra::RQDecomposition3x3(k_, r_, m); - ComputeMInverse(); - - c_ = LinearAlgebra::Product(-minv_, p4); - } - - - FiniteProjectiveCamera::FiniteProjectiveCamera(const double k[9], - const double r[9], - const double c[3]) - { - Matrix kk, rr; - Vector cc; - - LinearAlgebra::FillMatrix(kk, 3, 3, k); - LinearAlgebra::FillMatrix(rr, 3, 3, r); - LinearAlgebra::FillVector(cc, 3, c); - - Setup(kk, rr, cc); - } - - - FiniteProjectiveCamera::FiniteProjectiveCamera(const double p[12]) - { - Matrix pp; - LinearAlgebra::FillMatrix(pp, 3, 4, p); - Setup(pp); - } - - - Vector FiniteProjectiveCamera::GetRayDirection(double x, - double y) const - { - // This derives from Equation (6.14) on page 162, taking "mu = - // 1" and noticing that "-inv(M)*p4" corresponds to the camera - // center in finite projective cameras - - // The (x,y) coordinates on the imaged plane, as an homogeneous vector - Vector xx(3); - xx[0] = x; - xx[1] = y; - xx[2] = 1.0; - - return boost::numeric::ublas::prod(minv_, xx); - } - - - - static Vector SetupApply(const Vector& v, - bool infinityAllowed) - { - if (v.size() == 3) - { - // Vector "v" in non-homogeneous coordinates, add the homogeneous component - Vector vv; - LinearAlgebra::AssignVector(vv, v[0], v[1], v[2], 1.0); - return vv; - } - else if (v.size() == 4) - { - // Vector "v" is already in homogeneous coordinates - - if (!infinityAllowed && - LinearAlgebra::IsCloseToZero(v[3])) - { - LOG(ERROR) << "Cannot apply a finite projective camera to a " - << "point at infinity with this method"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - return v; - } - else - { - LOG(ERROR) << "The input vector must represent a point in 3D"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void FiniteProjectiveCamera::ApplyFinite(double& x, - double& y, - const Vector& v) const - { - Vector p = boost::numeric::ublas::prod(p_, SetupApply(v, false)); - - if (LinearAlgebra::IsCloseToZero(p[2])) - { - // Point at infinity: Should not happen with a finite input point - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - x = p[0] / p[2]; - y = p[1] / p[2]; - } - } - - - Vector FiniteProjectiveCamera::ApplyGeneral(const Vector& v) const - { - return boost::numeric::ublas::prod(p_, SetupApply(v, true)); - } - - - static Vector AddHomogeneousCoordinate(const Vector& p) - { - assert(p.size() == 3); - return LinearAlgebra::CreateVector(p[0], p[1], p[2], 1); - } - - - FiniteProjectiveCamera::FiniteProjectiveCamera(const Vector& camera, - const Vector& principalPoint, - double angle, - unsigned int imageWidth, - unsigned int imageHeight, - double pixelSpacingX, - double pixelSpacingY) - { - if (camera.size() != 3 || - principalPoint.size() != 3 || - LinearAlgebra::IsCloseToZero(pixelSpacingX) || - LinearAlgebra::IsCloseToZero(pixelSpacingY)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const double focal = boost::numeric::ublas::norm_2(camera - principalPoint); - - if (LinearAlgebra::IsCloseToZero(focal)) - { - LOG(ERROR) << "Camera lies on the image plane"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - Matrix a; - GeometryToolbox::AlignVectorsWithRotation(a, camera - principalPoint, - LinearAlgebra::CreateVector(0, 0, -1)); - - Matrix r = LinearAlgebra::Product(GeometryToolbox::CreateRotationMatrixAlongZ(angle), a); - - Matrix k = LinearAlgebra::ZeroMatrix(3, 3); - k(0,0) = focal / pixelSpacingX; - k(1,1) = focal / pixelSpacingY; - k(0,2) = static_cast(imageWidth) / 2.0; - k(1,2) = static_cast(imageHeight) / 2.0; - k(2,2) = 1; - - Setup(k, r, camera); - - { - // Sanity checks - Vector v1 = LinearAlgebra::Product(p_, AddHomogeneousCoordinate(camera)); - Vector v2 = LinearAlgebra::Product(p_, AddHomogeneousCoordinate(principalPoint)); - - if (!LinearAlgebra::IsCloseToZero(v1[2]) || // Camera is mapped to singularity - LinearAlgebra::IsCloseToZero(v2[2])) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // The principal point must be mapped to the center of the image - v2 /= v2[2]; - - if (!LinearAlgebra::IsNear(v2[0], static_cast(imageWidth) / 2.0) || - !LinearAlgebra::IsNear(v2[1], static_cast(imageHeight) / 2.0)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - - - template - static void ApplyRaytracerInternal(Orthanc::ImageAccessor& target, - const FiniteProjectiveCamera& camera, - const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - VolumeProjection projection) - { - if (source.GetFormat() != SourceFormat || - target.GetFormat() != TargetFormat || - !std::numeric_limits::is_iec559 || - sizeof(float) != 4) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - LOG(WARNING) << "Input volume size: " << source.GetWidth() << "x" - << source.GetHeight() << "x" << source.GetDepth(); - LOG(WARNING) << "Input pixel format: " << Orthanc::EnumerationToString(source.GetFormat()); - LOG(WARNING) << "Output image size: " << target.GetWidth() << "x" << target.GetHeight(); - LOG(WARNING) << "Output pixel format: " << Orthanc::EnumerationToString(target.GetFormat()); - - const unsigned int slicesCount = geometry.GetProjectionDepth(projection); - const OrthancStone::Vector pixelSpacing = geometry.GetVoxelDimensions(projection); - const unsigned int targetWidth = target.GetWidth(); - const unsigned int targetHeight = target.GetHeight(); - - Orthanc::Image accumulator(Orthanc::PixelFormat_Float32, targetWidth, targetHeight, false); - Orthanc::Image counter(Orthanc::PixelFormat_Grayscale16, targetWidth, targetHeight, false); - Orthanc::ImageProcessing::Set(accumulator, 0); - Orthanc::ImageProcessing::Set(counter, 0); - - typedef SubpixelReader SourceReader; - - for (unsigned int z = 0; z < slicesCount; z++) - { - LOG(INFO) << "Applying raytracer on slice: " << z << "/" << slicesCount; - - OrthancStone::CoordinateSystem3D slice = geometry.GetProjectionSlice(projection, z); - OrthancStone::ImageBuffer3D::SliceReader sliceReader(source, projection, static_cast(z)); - - SourceReader pixelReader(sliceReader.GetAccessor()); - - for (unsigned int y = 0; y < targetHeight; y++) - { - float *qacc = reinterpret_cast(accumulator.GetRow(y)); - uint16_t *qcount = reinterpret_cast(counter.GetRow(y)); - - for (unsigned int x = 0; x < targetWidth; x++) - { - // Backproject the ray originating from the center of the target pixel - OrthancStone::Vector direction = camera.GetRayDirection(static_cast(x + 0.5), - static_cast(y + 0.5)); - - // Compute the 3D intersection of the ray with the slice plane - OrthancStone::Vector p; - if (slice.IntersectLine(p, camera.GetCenter(), direction)) - { - // Compute the 2D coordinates of the intersections, in slice coordinates - double ix, iy; - slice.ProjectPoint(ix, iy, p); - - ix /= pixelSpacing[0]; - iy /= pixelSpacing[1]; - - // Read and accumulate the value of the pixel - float pixel; - if (pixelReader.GetFloatValue( - pixel, static_cast(ix), static_cast(iy))) - { - if (MIP) - { - // MIP rendering - if (*qcount == 0) - { - (*qacc) = pixel; - (*qcount) = 1; - } - else if (pixel > *qacc) - { - (*qacc) = pixel; - } - } - else - { - // Mean intensity - (*qacc) += pixel; - (*qcount) ++; - } - } - } - - qacc++; - qcount++; - } - } - } - - - typedef Orthanc::PixelTraits TargetTraits; - - // "Flatten" the accumulator image to create the target image - for (unsigned int y = 0; y < targetHeight; y++) - { - const float *qacc = reinterpret_cast(accumulator.GetConstRow(y)); - const uint16_t *qcount = reinterpret_cast(counter.GetConstRow(y)); - typename TargetTraits::PixelType *p = reinterpret_cast(target.GetRow(y)); - - for (unsigned int x = 0; x < targetWidth; x++) - { - if (*qcount == 0) - { - TargetTraits::SetZero(*p); - } - else - { - TargetTraits::FloatToPixel(*p, *qacc / static_cast(*qcount)); - } - - p++; - qacc++; - qcount++; - } - } - } - - - Orthanc::ImageAccessor* - FiniteProjectiveCamera::ApplyRaytracer(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - Orthanc::PixelFormat targetFormat, - unsigned int targetWidth, - unsigned int targetHeight, - bool mip) const - { - // TODO - We consider the axial projection of the volume, but we - // should choose the projection that is the "most perpendicular" - // to the line joining the camera center and the principal point - const VolumeProjection projection = VolumeProjection_Axial; - - std::unique_ptr target - (new Orthanc::Image(targetFormat, targetWidth, targetHeight, false)); - - if (targetFormat == Orthanc::PixelFormat_Grayscale16 && - source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && mip) - { - ApplyRaytracerInternal - (*target, *this, source, geometry, projection); - } - else if (targetFormat == Orthanc::PixelFormat_Grayscale16 && - source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && !mip) - { - ApplyRaytracerInternal - (*target, *this, source, geometry, projection); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - return target.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/FiniteProjectiveCamera.h --- a/Framework/Toolbox/FiniteProjectiveCamera.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "LinearAlgebra.h" -#include "../Volumes/ImageBuffer3D.h" -#include "../Volumes/VolumeImageGeometry.h" - -namespace OrthancStone -{ - // Reference: "Multiple View Geometry in Computer Vision (2nd Edition)" - class FiniteProjectiveCamera : public boost::noncopyable - { - private: - Matrix p_; // 3x4 matrix - Equation (6.11) - page 157 - Matrix k_; // 3x3 matrix of intrinsic parameters - Equation (6.10) - page 157 - Matrix r_; // 3x3 rotation matrix in 3D space - Vector c_; // 3x1 vector in 3D space corresponding to camera center - Matrix minv_; // Inverse of the M = P(1:3,1:3) submatrix - - void ComputeMInverse(); - - void Setup(const Matrix& k, - const Matrix& r, - const Vector& c); - - void Setup(const Matrix& p); - - public: - FiniteProjectiveCamera(const Matrix& k, - const Matrix& r, - const Vector& c) - { - Setup(k, r, c); - } - - FiniteProjectiveCamera(const Matrix& p) - { - Setup(p); - } - - FiniteProjectiveCamera(const double k[9], - const double r[9], - const double c[3]); - - FiniteProjectiveCamera(const double p[12]); - - // Constructor that implements camera calibration - FiniteProjectiveCamera(const Vector& camera, - const Vector& principalPoint, - double angle, - unsigned int imageWidth, - unsigned int imageHeight, - double pixelSpacingX, - double pixelSpacingY); - - const Matrix& GetMatrix() const - { - return p_; - } - - const Matrix& GetRotation() const - { - return r_; - } - - const Vector& GetCenter() const - { - return c_; - } - - const Matrix& GetIntrinsicParameters() const - { - return k_; - } - - // Computes the 3D vector that represents the direction from the - // camera center to the (x,y) imaged point - Vector GetRayDirection(double x, - double y) const; - - // Apply the camera to a 3D point "v" that is not at infinity. "v" - // can be encoded either as a non-homogeneous vector (3 - // components), or as a homogeneous vector (4 components). - void ApplyFinite(double& x, - double& y, - const Vector& v) const; - - // Apply the camera to a 3D point "v" that is possibly at - // infinity. The result is a 2D point in homogeneous coordinates. - Vector ApplyGeneral(const Vector& v) const; - - Orthanc::ImageAccessor* ApplyRaytracer(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - Orthanc::PixelFormat targetFormat, - unsigned int targetWidth, - unsigned int targetHeight, - bool mip) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/GenericToolbox.cpp --- a/Framework/Toolbox/GenericToolbox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GenericToolbox.h" - -#include - -namespace OrthancStone -{ - namespace GenericToolbox - { - bool GetRgbaValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, uint8_t& alpha, const char* text) - { - boost::regex pattern("\\s*rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)\\s*"); - - boost::cmatch what; - - if (boost::regex_match(text, what, pattern)) - { - { - std::string redStr = what[1]; - bool ok = StringToInteger(red, redStr); - if (!ok) - return false; - } - { - std::string greenStr = what[2]; - bool ok = StringToInteger(green, greenStr); - if (!ok) - return false; - } - { - std::string blueStr = what[3]; - bool ok = StringToInteger(blue, blueStr); - if (!ok) - return false; - } - { - std::string alphaStr = what[4]; - bool ok = StringToInteger(alpha, alphaStr); - if (!ok) - return false; - } - return true; - } - else - { - return false; - } - } - bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const char* text) - { - boost::regex pattern("\\s*rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)\\s*"); - - boost::cmatch what; - - if (boost::regex_match(text, what, pattern)) - { - { - std::string redStr = what[1]; - bool ok = StringToInteger(red, redStr); - if (!ok) - return false; - } - { - std::string greenStr = what[2]; - bool ok = StringToInteger(green, greenStr); - if (!ok) - return false; - } - { - std::string blueStr = what[3]; - bool ok = StringToInteger(blue, blueStr); - if (!ok) - return false; - } - return true; - } - else - { - return false; - } - } - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/GenericToolbox.h --- a/Framework/Toolbox/GenericToolbox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,308 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include - -#include - -#include -#include -#include - -#include - -namespace OrthancStone -{ - namespace GenericToolbox - { - /** - Fast floating point string validation. - No trimming applied, so the input must match regex - /^[-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/ - The following are allowed as edge cases: "" and "-" - */ - inline bool LegitDoubleString(const char* text) - { - const char* p = text; - if(*p == '-') - p++; - size_t period = 0; - while(*p != 0) - { - if (*p >= '0' && *p <= '9') - ++p; - else if(*p == '.') - { - if(period > 0) - return false; - else - period++; - ++p; - } - else if (*p == 'e' || *p == 'E') - { - ++p; - if (*p == '-' || *p == '+') - ++p; - // "e+"/"E+" "e-"/"E-" or "e"/"E" must be followed by a number - if (!(*p >= '0' && *p <= '9')) - return false; - - // these must be the last in the string - while(*p >= '0' && *p <= '9') - ++p; - - return (*p == 0); - } - else - { - return false; - } - } - return true; - } - - /** - Fast integer string validation. - No trimming applied, so the input must match regex /^-?[0-9]*$/ - The following are allowed as edge cases: "" and "-" - */ - inline bool LegitIntegerString(const char* text) - { - const char* p = text; - if (*p == '-') - p++; - while (*p != 0) - { - if (*p >= '0' && *p <= '9') - ++p; - else - return false; - } - return true; - } - - /* - Fast string --> double conversion. - Must pass the LegitDoubleString test - - String to doubles with at most 18 digits - */ - inline bool StringToDouble(double& r, const char* text) - { - if(!LegitDoubleString(text)) - return false; - - static const double FRAC_FACTORS[] = - { - 1.0, - 0.1, - 0.01, - 0.001, - 0.0001, - 0.00001, - 0.000001, - 0.0000001, - 0.00000001, - 0.000000001, - 0.0000000001, - 0.00000000001, - 0.000000000001, - 0.0000000000001, - 0.00000000000001, - 0.000000000000001, - 0.0000000000000001, - 0.00000000000000001, - 0.000000000000000001, - 0.0000000000000000001 - }; - const size_t FRAC_FACTORS_LEN = sizeof(FRAC_FACTORS)/sizeof(double); - - r = 0.0; - double neg = 1.0; - const char* p = text; - - if (*p == '-') - { - neg = -1.0; - ++p; - } - // 12345.67890 - while (*p >= '0' && *p <= '9') - { - r = (r*10.0) + (*p - '0'); // 1 12 123 123 12345 - ++p; - } - if (*p == '.') - { - double f = 0.0; - size_t n = 1; - ++p; - while (*p >= '0' && *p <= '9' && n < FRAC_FACTORS_LEN) - { - f += (*p - '0') * FRAC_FACTORS[n]; - ++p; - ++n; - } - r += f; - } - r *= neg; - - // skip the remaining numbers until we reach not-a-digit (either the - // end of the string OR the scientific notation symbol) - while ((*p >= '0' && *p <= '9')) - ++p; - - if (*p == 0 ) - { - return true; - } - else if ((*p == 'e') || (*p == 'E')) - { - // process the scientific notation - double sign; // no init is safe (read below) - ++p; - if (*p == '-') - { - sign = -1.0; - // point to first number - ++p; - } - else if (*p == '+') - { - sign = 1.0; - // point to first number - ++p; - } - else if (*p >= '0' && *p <= '9') - { - sign = 1.0; - } - else - { - // only a sign char or a number is allowed - return false; - } - // now p points to the absolute value of the exponent - double exp = 0; - while (*p >= '0' && *p <= '9') - { - exp = (exp * 10.0) + static_cast(*p - '0'); // 1 12 123 123 12345 - ++p; - } - // now we have our exponent. put a sign on it. - exp *= sign; - double scFac = ::pow(10.0, exp); - r *= scFac; - - // only allowed symbol here is EOS - return (*p == 0); - } - else - { - // not allowed - return false; - } - } - - inline bool StringToDouble(double& r, const std::string& text) - { - return StringToDouble(r, text.c_str()); - } - - /** - Fast string to integer conversion. Leading zeroes and minus are accepted, - but a leading + sign is NOT. - Must pass the LegitIntegerString function test. - In addition, an empty string (or lone minus sign) yields 0. - */ - - template - inline bool StringToInteger(T& r, const char* text) - { - if (!LegitIntegerString(text)) - return false; - - r = 0; - T neg = 1; - const char* p = text; - - if (*p == '-') - { - neg = -1; - ++p; - } - while (*p >= '0' && *p <= '9') - { - r = (r * 10) + (*p - '0'); // 1 12 123 123 12345 - ++p; - } - r *= neg; - if (*p == 0) - return true; - else - return false; - } - - template - inline bool StringToInteger(T& r, const std::string& text) - { - return StringToInteger(r, text.c_str()); - } - - /** - if input is "rgb(12,23,255)" --> function fills `red`, `green` and `blue` and returns true - else ("everything else") --> function returns false and leaves all values untouched - */ - bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const char* text); - - /** - See main overload - */ - inline bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const std::string& text) - { - return GetRgbValuesFromString(red, green, blue, text.c_str()); - } - - /** - Same as GetRgbValuesFromString - */ - bool GetRgbaValuesFromString(uint8_t& red, - uint8_t& green, - uint8_t& blue, - uint8_t& alpha, - const char* text); - - /** - Same as GetRgbValuesFromString - */ - inline bool GetRgbaValuesFromString(uint8_t& red, - uint8_t& green, - uint8_t& blue, - uint8_t& alpha, - const std::string& text) - { - return GetRgbaValuesFromString(red, green, blue, alpha, text.c_str()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/GeometryToolbox.cpp --- a/Framework/Toolbox/GeometryToolbox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,572 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "GeometryToolbox.h" - -#include -#include - -#include - -namespace OrthancStone -{ - namespace GeometryToolbox - { - void ProjectPointOntoPlane(Vector& result, - const Vector& point, - const Vector& planeNormal, - const Vector& planeOrigin) - { - double norm = boost::numeric::ublas::norm_2(planeNormal); - if (LinearAlgebra::IsCloseToZero(norm)) - { - // Division by zero - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // Make sure the norm of the normal is 1 - Vector n; - n = planeNormal / norm; - - // Algebraic form of line–plane intersection, where the line passes - // through "point" along the direction "normal" (thus, l == n) - // https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection#Algebraic_form - result = boost::numeric::ublas::inner_prod(planeOrigin - point, n) * n + point; - } - - /* - undefined results if vector are not 3D - */ - void ProjectPointOntoPlane2( - double& resultX, - double& resultY, - double& resultZ, - const Vector& point, - const Vector& planeNormal, - const Vector& planeOrigin) - { - double pointX = point[0]; - double pointY = point[1]; - double pointZ = point[2]; - - double planeNormalX = planeNormal[0]; - double planeNormalY = planeNormal[1]; - double planeNormalZ = planeNormal[2]; - - double planeOriginX = planeOrigin[0]; - double planeOriginY = planeOrigin[1]; - double planeOriginZ = planeOrigin[2]; - - double normSq = (planeNormalX * planeNormalX) + (planeNormalY * planeNormalY) + (planeNormalZ * planeNormalZ); - - // Algebraic form of line–plane intersection, where the line passes - // through "point" along the direction "normal" (thus, l == n) - // https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection#Algebraic_form - - if (LinearAlgebra::IsNear(1.0, normSq)) - { - double nX = planeNormalX; - double nY = planeNormalY; - double nZ = planeNormalZ; - - double prod = (planeOriginX - pointX) * nX + (planeOriginY - pointY) * nY + (planeOriginZ - pointZ) * nZ; - - resultX = prod * nX + pointX; - resultY = prod * nY + pointY; - resultZ = prod * nZ + pointZ; - } - else - { - double norm = sqrt(normSq); - if (LinearAlgebra::IsCloseToZero(norm)) - { - // Division by zero - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - double invNorm = 1.0 / norm; - double nX = planeNormalX * invNorm; - double nY = planeNormalY * invNorm; - double nZ = planeNormalZ * invNorm; - - double prod = (planeOriginX - pointX) * nX + (planeOriginY - pointY) * nY + (planeOriginZ - pointZ) * nZ; - - resultX = prod * nX + pointX; - resultY = prod * nY + pointY; - resultZ = prod * nZ + pointZ; - } - } - - bool IsParallelOrOpposite(bool& isOpposite, - const Vector& u, - const Vector& v) - { - // The dot product of the two vectors gives the cosine of the angle - // between the vectors - // https://en.wikipedia.org/wiki/Dot_product - - double normU = boost::numeric::ublas::norm_2(u); - double normV = boost::numeric::ublas::norm_2(v); - - if (LinearAlgebra::IsCloseToZero(normU) || - LinearAlgebra::IsCloseToZero(normV)) - { - return false; - } - - double cosAngle = boost::numeric::ublas::inner_prod(u, v) / (normU * normV); - - // The angle must be zero, so the cosine must be almost equal to - // cos(0) == 1 (or cos(180) == -1 if allowOppositeDirection == true) - - if (LinearAlgebra::IsCloseToZero(cosAngle - 1.0)) - { - isOpposite = false; - return true; - } - else if (LinearAlgebra::IsCloseToZero(fabs(cosAngle) - 1.0)) - { - isOpposite = true; - return true; - } - else - { - return false; - } - } - - - bool IsParallel(const Vector& u, - const Vector& v) - { - bool isOpposite; - return (IsParallelOrOpposite(isOpposite, u, v) && - !isOpposite); - } - - - bool IntersectTwoPlanes(Vector& p, - Vector& direction, - const Vector& origin1, - const Vector& normal1, - const Vector& origin2, - const Vector& normal2) - { - // This is "Intersection of 2 Planes", possibility "(C) 3 Plane - // Intersect Point" of: - // http://geomalgorithms.com/a05-_intersect-1.html - - // The direction of the line of intersection is orthogonal to the - // normal of both planes - LinearAlgebra::CrossProduct(direction, normal1, normal2); - - double norm = boost::numeric::ublas::norm_2(direction); - if (LinearAlgebra::IsCloseToZero(norm)) - { - // The two planes are parallel or coincident - return false; - } - - double d1 = -boost::numeric::ublas::inner_prod(normal1, origin1); - double d2 = -boost::numeric::ublas::inner_prod(normal2, origin2); - Vector tmp = d2 * normal1 - d1 * normal2; - - LinearAlgebra::CrossProduct(p, tmp, direction); - p /= norm; - - return true; - } - - - bool ClipLineToRectangle(double& x1, // Coordinates of the clipped line (out) - double& y1, - double& x2, - double& y2, - const double ax, // Two points defining the line (in) - const double ay, - const double bx, - const double by, - const double& xmin, // Coordinates of the rectangle (in) - const double& ymin, - const double& xmax, - const double& ymax) - { - // This is Skala algorithm for rectangles, "A new approach to line - // and line segment clipping in homogeneous coordinates" - // (2005). This is a direct, non-optimized translation of Algorithm - // 2 in the paper. - - static const uint8_t tab1[16] = { 255 /* none */, - 0, - 0, - 1, - 1, - 255 /* na */, - 0, - 2, - 2, - 0, - 255 /* na */, - 1, - 1, - 0, - 0, - 255 /* none */ }; - - - static const uint8_t tab2[16] = { 255 /* none */, - 3, - 1, - 3, - 2, - 255 /* na */, - 2, - 3, - 3, - 2, - 255 /* na */, - 2, - 3, - 1, - 3, - 255 /* none */ }; - - // Create the coordinates of the rectangle - Vector x[4]; - LinearAlgebra::AssignVector(x[0], xmin, ymin, 1.0); - LinearAlgebra::AssignVector(x[1], xmax, ymin, 1.0); - LinearAlgebra::AssignVector(x[2], xmax, ymax, 1.0); - LinearAlgebra::AssignVector(x[3], xmin, ymax, 1.0); - - // Move to homogoneous coordinates in 2D - Vector p; - - { - Vector a, b; - LinearAlgebra::AssignVector(a, ax, ay, 1.0); - LinearAlgebra::AssignVector(b, bx, by, 1.0); - LinearAlgebra::CrossProduct(p, a, b); - } - - uint8_t c = 0; - - for (unsigned int k = 0; k < 4; k++) - { - if (boost::numeric::ublas::inner_prod(p, x[k]) >= 0) - { - c |= (1 << k); - } - } - - assert(c < 16); - - uint8_t i = tab1[c]; - uint8_t j = tab2[c]; - - if (i == 255 || j == 255) - { - return false; // No intersection - } - else - { - Vector a, b, e; - LinearAlgebra::CrossProduct(e, x[i], x[(i + 1) % 4]); - LinearAlgebra::CrossProduct(a, p, e); - LinearAlgebra::CrossProduct(e, x[j], x[(j + 1) % 4]); - LinearAlgebra::CrossProduct(b, p, e); - - // Go back to non-homogeneous coordinates - x1 = a[0] / a[2]; - y1 = a[1] / a[2]; - x2 = b[0] / b[2]; - y2 = b[1] / b[2]; - - return true; - } - } - - - void GetPixelSpacing(double& spacingX, - double& spacingY, - const Orthanc::DicomMap& dicom) - { - Vector v; - - if (LinearAlgebra::ParseVector(v, dicom, Orthanc::DICOM_TAG_PIXEL_SPACING)) - { - if (v.size() != 2 || - v[0] <= 0 || - v[1] <= 0) - { - LOG(ERROR) << "Bad value for PixelSpacing tag"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - // WARNING: X/Y are swapped (Y comes first) - spacingX = v[1]; - spacingY = v[0]; - } - } - else - { - // The "PixelSpacing" is of type 1C: It could be absent, use - // default value in such a case - spacingX = 1; - spacingY = 1; - } - } - - - Matrix CreateRotationMatrixAlongX(double a) - { - // Rotate along X axis (R_x) - // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations - Matrix r(3, 3); - r(0,0) = 1; - r(0,1) = 0; - r(0,2) = 0; - r(1,0) = 0; - r(1,1) = cos(a); - r(1,2) = -sin(a); - r(2,0) = 0; - r(2,1) = sin(a); - r(2,2) = cos(a); - return r; - } - - - Matrix CreateRotationMatrixAlongY(double a) - { - // Rotate along Y axis (R_y) - // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations - Matrix r(3, 3); - r(0,0) = cos(a); - r(0,1) = 0; - r(0,2) = sin(a); - r(1,0) = 0; - r(1,1) = 1; - r(1,2) = 0; - r(2,0) = -sin(a); - r(2,1) = 0; - r(2,2) = cos(a); - return r; - } - - - Matrix CreateRotationMatrixAlongZ(double a) - { - // Rotate along Z axis (R_z) - // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations - Matrix r(3, 3); - r(0,0) = cos(a); - r(0,1) = -sin(a); - r(0,2) = 0; - r(1,0) = sin(a); - r(1,1) = cos(a); - r(1,2) = 0; - r(2,0) = 0; - r(2,1) = 0; - r(2,2) = 1; - return r; - } - - - Matrix CreateTranslationMatrix(double dx, - double dy, - double dz) - { - Matrix m = LinearAlgebra::IdentityMatrix(4); - m(0,3) = dx; - m(1,3) = dy; - m(2,3) = dz; - return m; - } - - - Matrix CreateScalingMatrix(double sx, - double sy, - double sz) - { - Matrix m = LinearAlgebra::IdentityMatrix(4); - m(0,0) = sx; - m(1,1) = sy; - m(2,2) = sz; - return m; - } - - - bool IntersectPlaneAndSegment(Vector& p, - const Vector& normal, - double d, - const Vector& edgeFrom, - const Vector& edgeTo) - { - // http://geomalgorithms.com/a05-_intersect-1.html#Line-Plane-Intersection - - // Check for parallel line and plane - Vector direction = edgeTo - edgeFrom; - double denominator = boost::numeric::ublas::inner_prod(direction, normal); - - if (fabs(denominator) < 100.0 * std::numeric_limits::epsilon()) - { - return false; - } - else - { - // Compute intersection - double t = -(normal[0] * edgeFrom[0] + - normal[1] * edgeFrom[1] + - normal[2] * edgeFrom[2] + d) / denominator; - - if (t >= 0 && t <= 1) - { - // The intersection lies inside edge segment - p = edgeFrom + t * direction; - return true; - } - else - { - return false; - } - } - } - - - bool IntersectPlaneAndLine(Vector& p, - const Vector& normal, - double d, - const Vector& origin, - const Vector& direction) - { - // http://geomalgorithms.com/a05-_intersect-1.html#Line-Plane-Intersection - - // Check for parallel line and plane - double denominator = boost::numeric::ublas::inner_prod(direction, normal); - - if (fabs(denominator) < 100.0 * std::numeric_limits::epsilon()) - { - return false; - } - else - { - // Compute intersection - double t = -(normal[0] * origin[0] + - normal[1] * origin[1] + - normal[2] * origin[2] + d) / denominator; - - p = origin + t * direction; - return true; - } - } - - - void AlignVectorsWithRotation(Matrix& r, - const Vector& a, - const Vector& b) - { - // This is Rodrigues' rotation formula: - // https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula#Matrix_notation - - // Check also result A4.6 from "Multiple View Geometry in Computer - // Vision - 2nd edition" (p. 584) - - if (a.size() != 3 || - b.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - double aNorm = boost::numeric::ublas::norm_2(a); - double bNorm = boost::numeric::ublas::norm_2(b); - - if (LinearAlgebra::IsCloseToZero(aNorm) || - LinearAlgebra::IsCloseToZero(bNorm)) - { - LOG(ERROR) << "Vector with zero norm"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - Vector aUnit, bUnit; - aUnit = a / aNorm; - bUnit = b / bNorm; - - Vector v; - LinearAlgebra::CrossProduct(v, aUnit, bUnit); - - double cosine = boost::numeric::ublas::inner_prod(aUnit, bUnit); - - if (LinearAlgebra::IsCloseToZero(1 + cosine)) - { - // "a == -b": TODO - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - Matrix k; - LinearAlgebra::CreateSkewSymmetric(k, v); - -#if 0 - double sine = boost::numeric::ublas::norm_2(v); - - r = (boost::numeric::ublas::identity_matrix(3) + - sine * k + - (1 - cosine) * boost::numeric::ublas::prod(k, k)); -#else - r = (boost::numeric::ublas::identity_matrix(3) + - k + - boost::numeric::ublas::prod(k, k) / (1 + cosine)); -#endif - } - - - void ComputeNormalFromCosines(Vector& normal, - const Vector& cosines) - { - if (cosines.size() != 6) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - normal.resize(3); - normal[0] = cosines[1] * cosines[5] - cosines[2] * cosines[4]; - normal[1] = cosines[2] * cosines[3] - cosines[0] * cosines[5]; - normal[2] = cosines[0] * cosines[4] - cosines[1] * cosines[3]; - } - } - - - bool ComputeNormal(Vector& normal, - const Orthanc::DicomMap& dicom) - { - Vector cosines; - if (LinearAlgebra::ParseVector(cosines, dicom, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT) && - cosines.size() == 6) - { - ComputeNormalFromCosines(normal, cosines); - return true; - } - else - { - return false; - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/GeometryToolbox.h --- a/Framework/Toolbox/GeometryToolbox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "LinearAlgebra.h" - -namespace OrthancStone -{ - namespace GeometryToolbox - { - void ProjectPointOntoPlane(Vector& result, - const Vector& point, - const Vector& planeNormal, - const Vector& planeOrigin); - - /* - Alternated faster implementation (untested yet) - */ - void ProjectPointOntoPlane2(double& resultX, - double& resultY, - double& resultZ, - const Vector& point, - const Vector& planeNormal, - const Vector& planeOrigin); - - bool IsParallel(const Vector& u, - const Vector& v); - - bool IsParallelOrOpposite(bool& isOpposite, - const Vector& u, - const Vector& v); - - bool IntersectTwoPlanes(Vector& p, - Vector& direction, - const Vector& origin1, - const Vector& normal1, - const Vector& origin2, - const Vector& normal2); - - bool ClipLineToRectangle(double& x1, // Coordinates of the clipped line (out) - double& y1, - double& x2, - double& y2, - const double ax, // Two points defining the line (in) - const double ay, - const double bx, - const double by, - const double& xmin, // Coordinates of the rectangle (in) - const double& ymin, - const double& xmax, - const double& ymax); - - void GetPixelSpacing(double& spacingX, - double& spacingY, - const Orthanc::DicomMap& dicom); - - inline double ProjectAlongNormal(const Vector& point, - const Vector& normal) - { - return boost::numeric::ublas::inner_prod(point, normal); - } - - Matrix CreateRotationMatrixAlongX(double a); - - Matrix CreateRotationMatrixAlongY(double a); - - Matrix CreateRotationMatrixAlongZ(double a); - - Matrix CreateTranslationMatrix(double dx, - double dy, - double dz); - - Matrix CreateScalingMatrix(double sx, - double sy, - double sz); - - bool IntersectPlaneAndSegment(Vector& p, - const Vector& normal, - double d, - const Vector& edgeFrom, - const Vector& edgeTo); - - bool IntersectPlaneAndLine(Vector& p, - const Vector& normal, - double d, - const Vector& origin, - const Vector& direction); - - void AlignVectorsWithRotation(Matrix& r, - const Vector& a, - const Vector& b); - - void ComputeNormalFromCosines(Vector& normal, - const Vector& cosines); - - bool ComputeNormal(Vector& normal, - const Orthanc::DicomMap& dicom); - - inline float ComputeBilinearInterpolationUnitSquare(float x, - float y, - float f00, // source(0, 0) - float f01, // source(1, 0) - float f10, // source(0, 1) - float f11); // source(1, 1) - - inline float ComputeTrilinearInterpolationUnitSquare(float x, - float y, - float z, - float f000, // source(0, 0, 0) - float f001, // source(1, 0, 0) - float f010, // source(0, 1, 0) - float f011, // source(1, 1, 0) - float f100, // source(0, 0, 1) - float f101, // source(1, 0, 1) - float f110, // source(0, 1, 1) - float f111); // source(1, 1, 1) - }; -} - - -float OrthancStone::GeometryToolbox::ComputeBilinearInterpolationUnitSquare(float x, - float y, - float f00, - float f01, - float f10, - float f11) -{ - // This function only works within the unit square - assert(x >= 0 && y >= 0 && x <= 1 && y <= 1); - - // https://en.wikipedia.org/wiki/Bilinear_interpolation#Unit_square - return (f00 * (1.0f - x) * (1.0f - y) + - f01 * x * (1.0f - y) + - f10 * (1.0f - x) * y + - f11 * x * y); -} - - -float OrthancStone::GeometryToolbox::ComputeTrilinearInterpolationUnitSquare(float x, - float y, - float z, - float f000, - float f001, - float f010, - float f011, - float f100, - float f101, - float f110, - float f111) -{ - // "In practice, a trilinear interpolation is identical to two - // bilinear interpolation combined with a linear interpolation" - // https://en.wikipedia.org/wiki/Trilinear_interpolation#Method - float a = ComputeBilinearInterpolationUnitSquare(x, y, f000, f001, f010, f011); - float b = ComputeBilinearInterpolationUnitSquare(x, y, f100, f101, f110, f111); - - return (1.0f - z) * a + z * b; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ImageGeometry.cpp --- a/Framework/Toolbox/ImageGeometry.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,594 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ImageGeometry.h" - -#include "Extent2D.h" -#include "SubpixelReader.h" - -#include -#include -#include - - -namespace OrthancStone -{ - static void AddTransformedPoint(Extent2D& extent, - const Matrix& a, - double x, - double y) - { - assert(a.size1() == 3 && - a.size2() == 3); - - Vector p = LinearAlgebra::Product(a, LinearAlgebra::CreateVector(x, y, 1)); - - if (!LinearAlgebra::IsCloseToZero(p[2])) - { - extent.AddPoint(p[0] / p[2], p[1] / p[2]); - } - } - - - bool GetProjectiveTransformExtent(unsigned int& x1, - unsigned int& y1, - unsigned int& x2, - unsigned int& y2, - const Matrix& a, - unsigned int sourceWidth, - unsigned int sourceHeight, - unsigned int targetWidth, - unsigned int targetHeight) - { - if (targetWidth == 0 || - targetHeight == 0) - { - return false; - } - - Extent2D extent; - AddTransformedPoint(extent, a, 0, 0); - AddTransformedPoint(extent, a, sourceWidth, 0); - AddTransformedPoint(extent, a, 0, sourceHeight); - AddTransformedPoint(extent, a, sourceWidth, sourceHeight); - - if (extent.IsEmpty()) - { - return false; - } - else - { - int tmp = static_cast(std::floor(extent.GetX1())); - if (tmp < 0) - { - x1 = 0; - } - else - { - x1 = static_cast(tmp); - } - - tmp = static_cast(std::floor(extent.GetY1())); - if (tmp < 0) - { - y1 = 0; - } - else - { - y1 = static_cast(tmp); - } - - tmp = static_cast(std::ceil(extent.GetX2())); - if (tmp < 0) - { - return false; - } - else if (static_cast(tmp) >= targetWidth) - { - x2 = targetWidth - 1; - } - else - { - x2 = static_cast(tmp); - } - - tmp = static_cast(std::ceil(extent.GetY2())); - if (tmp < 0) - { - return false; - } - else if (static_cast(tmp) >= targetHeight) - { - y2 = targetHeight - 1; - } - else - { - y2 = static_cast(tmp); - } - - return (x1 <= x2 && - y1 <= y2); - } - } - - - template - static void ApplyAffineTransformToRow(typename Reader::PixelType* p, - Reader& reader, - unsigned int x1, - unsigned int x2, - float positionX, - float positionY, - float offsetX, - float offsetY) - { - typename Reader::PixelType value; - - for (unsigned int x = x1; x <= x2; x++, p++) - { - if (reader.GetValue(value, positionX, positionY)) - { - *p = value; - } - - if (HasOffsetX) - { - positionX += offsetX; - } - - if (HasOffsetY) - { - positionY += offsetY; - } - } - } - - - template - static void ApplyAffineInternal(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - const Matrix& a, - bool clear) - { - assert(target.GetFormat() == Format && - source.GetFormat() == Format); - - typedef SubpixelReader Reader; - typedef typename Reader::PixelType PixelType; - - if (clear) - { - if (Format == Orthanc::PixelFormat_RGB24) - { - Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255); - } - else - { - Orthanc::ImageProcessing::Set(target, 0); - } - } - - Matrix inva; - if (!LinearAlgebra::InvertMatrixUnsafe(inva, a)) - { - // Singular matrix - return; - } - - Reader reader(source); - - unsigned int x1, y1, x2, y2; - - if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, - source.GetWidth(), source.GetHeight(), - target.GetWidth(), target.GetHeight())) - { - const size_t targetPitch = target.GetPitch(); - uint8_t *targetRow = reinterpret_cast - (reinterpret_cast(target.GetRow(y1)) + x1); - - for (unsigned int y = y1; y <= y2; y++) - { - Vector start; - LinearAlgebra::AssignVector(start, static_cast(x1) + 0.5, - static_cast(y) + 0.5, 1); - start = boost::numeric::ublas::prod(inva, start); - assert(LinearAlgebra::IsNear(1.0, start(2))); - - Vector offset; - LinearAlgebra::AssignVector(offset, static_cast(x1) + 1.5, - static_cast(y) + 0.5, 1); - offset = boost::numeric::ublas::prod(inva, offset) - start; - assert(LinearAlgebra::IsNear(0.0, offset(2))); - - float startX = static_cast(start[0]); - float startY = static_cast(start[1]); - float offsetX = static_cast(offset[0]); - float offsetY = static_cast(offset[1]); - - PixelType* pixel = reinterpret_cast(targetRow); - if (LinearAlgebra::IsCloseToZero(offsetX)) - { - ApplyAffineTransformToRow - (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); - } - else if (LinearAlgebra::IsCloseToZero(offsetY)) - { - ApplyAffineTransformToRow - (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); - } - else - { - ApplyAffineTransformToRow - (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); - } - - targetRow += targetPitch; - } - } - } - - - void ApplyAffineTransform(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - double a11, - double a12, - double b1, - double a21, - double a22, - double b2, - ImageInterpolation interpolation, - bool clear) - { - if (source.GetFormat() != target.GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (interpolation != ImageInterpolation_Nearest && - interpolation != ImageInterpolation_Bilinear) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - Matrix a; - a.resize(3, 3); - a(0, 0) = a11; - a(0, 1) = a12; - a(0, 2) = b1; - a(1, 0) = a21; - a(1, 1) = a22; - a(1, 2) = b2; - a(2, 0) = 0; - a(2, 1) = 0; - a(2, 2) = 1; - - switch (source.GetFormat()) - { - case Orthanc::PixelFormat_Grayscale8: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyAffineInternal(target, source, a, clear); - break; - - case ImageInterpolation_Bilinear: - ApplyAffineInternal(target, source, a, clear); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_Grayscale16: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyAffineInternal(target, source, a, clear); - break; - - case ImageInterpolation_Bilinear: - ApplyAffineInternal(target, source, a, clear); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyAffineInternal(target, source, a, clear); - break; - - case ImageInterpolation_Bilinear: - ApplyAffineInternal(target, source, a, clear); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_Float32: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyAffineInternal(target, source, a, clear); - break; - - case ImageInterpolation_Bilinear: - ApplyAffineInternal(target, source, a, clear); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_RGB24: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyAffineInternal(target, source, a, clear); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - template - static void ApplyProjectiveInternal(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - const Matrix& a, - const Matrix& inva) - { - assert(target.GetFormat() == Format && - source.GetFormat() == Format); - - typedef SubpixelReader Reader; - typedef typename Reader::PixelType PixelType; - - Reader reader(source); - unsigned int x1, y1, x2, y2; - - const float floatWidth = static_cast(source.GetWidth()); - const float floatHeight = static_cast(source.GetHeight()); - - if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, - source.GetWidth(), source.GetHeight(), - target.GetWidth(), target.GetHeight())) - { - const size_t targetPitch = target.GetPitch(); - uint8_t *targetRow = reinterpret_cast - (reinterpret_cast(target.GetRow(y1)) + x1); - - for (unsigned int y = y1; y <= y2; y++) - { - PixelType *p = reinterpret_cast(targetRow); - - for (unsigned int x = x1; x <= x2; x++) - { - Vector v; - LinearAlgebra::AssignVector(v, static_cast(x) + 0.5, - static_cast(y) + 0.5, 1); - - Vector vv = LinearAlgebra::Product(inva, v); - - assert(!LinearAlgebra::IsCloseToZero(vv[2])); - const double w = 1.0 / vv[2]; - const float sourceX = static_cast(vv[0] * w); - const float sourceY = static_cast(vv[1] * w); - - // Make sure no integer overflow will occur after truncation - // (the static_cast could otherwise throw an - // exception in WebAssembly if strong projective effects) - if (sourceX < floatWidth && - sourceY < floatHeight) - { - reader.GetValue(*p, sourceX, sourceY); - } - - p++; - } - - targetRow += targetPitch; - } - } - } - - - void ApplyProjectiveTransform(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - const Matrix& a, - ImageInterpolation interpolation, - bool clear) - { - if (source.GetFormat() != target.GetFormat()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (a.size1() != 3 || - a.size2() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); - } - - if (interpolation != ImageInterpolation_Nearest && - interpolation != ImageInterpolation_Bilinear) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // Check whether we are dealing with an affine transform - if (LinearAlgebra::IsCloseToZero(a(2, 0)) && - LinearAlgebra::IsCloseToZero(a(2, 1))) - { - double w = a(2, 2); - if (LinearAlgebra::IsCloseToZero(w)) - { - LOG(ERROR) << "Singular projective matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - ApplyAffineTransform(target, source, - a(0, 0) / w, a(0, 1) / w, a(0, 2) / w, - a(1, 0) / w, a(1, 1) / w, a(1, 2) / w, - interpolation, clear); - return; - } - } - - if (clear) - { - if (target.GetFormat() == Orthanc::PixelFormat_RGB24) - { - Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255); - } - else - { - Orthanc::ImageProcessing::Set(target, 0); - } - } - - Matrix inva; - if (!LinearAlgebra::InvertMatrixUnsafe(inva, a)) - { - return; - } - - switch (source.GetFormat()) - { - case Orthanc::PixelFormat_Grayscale8: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyProjectiveInternal(target, source, a, inva); - break; - - case ImageInterpolation_Bilinear: - ApplyProjectiveInternal(target, source, a, inva); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_Grayscale16: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyProjectiveInternal(target, source, a, inva); - break; - - case ImageInterpolation_Bilinear: - ApplyProjectiveInternal(target, source, a, inva); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyProjectiveInternal(target, source, a, inva); - break; - - case ImageInterpolation_Bilinear: - ApplyProjectiveInternal(target, source, a, inva); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_Float32: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyProjectiveInternal(target, source, a, inva); - break; - - case ImageInterpolation_Bilinear: - ApplyProjectiveInternal(target, source, a, inva); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - case Orthanc::PixelFormat_RGB24: - switch (interpolation) - { - case ImageInterpolation_Nearest: - ApplyProjectiveInternal(target, source, a, inva); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ImageGeometry.h --- a/Framework/Toolbox/ImageGeometry.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "LinearAlgebra.h" - -#include - - -namespace OrthancStone -{ - // Returns the "useful" portion of the target image when applying a - // 3x3 perspective transform "a" (i.e. the bounding box where points - // of the source image are mapped to) - bool GetProjectiveTransformExtent(unsigned int& x1, - unsigned int& y1, - unsigned int& x2, - unsigned int& y2, - const Matrix& a, - unsigned int sourceWidth, - unsigned int sourceHeight, - unsigned int targetWidth, - unsigned int targetHeight); - - void ApplyAffineTransform(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - double a11, - double a12, - double b1, - double a21, - double a22, - double b2, - ImageInterpolation interpolation, - bool clear); - - void ApplyProjectiveTransform(Orthanc::ImageAccessor& target, - const Orthanc::ImageAccessor& source, - const Matrix& a, - ImageInterpolation interpolation, - bool clear); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ImageToolbox.cpp --- a/Framework/Toolbox/ImageToolbox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,337 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../OrthancStone.h" -#include "ImageToolbox.h" - -#include "../StoneException.h" - -#include -#include - -#include -#include - -#include -#include - -#include - -#if !defined(ORTHANC_ENABLE_DCMTK) -# error ORTHANC_ENABLE_DCMTK is not defined -#endif - -#if !defined(ORTHANC_ENABLE_DCMTK_JPEG) -# error ORTHANC_ENABLE_DCMTK_JPEG is not defined -#endif - -#if !defined(ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS) -# error ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS is not defined -#endif - - -namespace OrthancStone -{ - namespace - { - using Orthanc::PixelTraits; - using Orthanc::PixelFormat; - using Orthanc::ImageAccessor; - using Orthanc::PixelFormat; - - template - class PixelBinner - { - // "PixelBinner requires an arithmetic (integer or floating-point) pixel format" - typedef typename Orthanc::PixelTraits::PixelType PixelType; - BOOST_STATIC_ASSERT(boost::is_arithmetic::value); - - public: - PixelBinner(HistogramData& hd, double minValue, double maxValue) - : hd_(hd) - , minValue_(minValue) - , maxValue_(maxValue) - , division_(1.0 / hd_.binSize) - { - ORTHANC_ASSERT(hd_.bins.size() > 0); - ORTHANC_ASSERT(maxValue > minValue); - } - - ORTHANC_FORCE_INLINE void AddPixel(PixelType p) - { - if (p <= minValue_) - { - hd_.bins[0] += 1; - } - else if (p >= maxValue_) - { - hd_.bins.back() += 1; - } - else - { - double distanceFromMin = p - minValue_; - size_t binIndex = static_cast( - std::floor(distanceFromMin * division_)); - if (binIndex >= hd_.bins.size()) - binIndex = hd_.bins.size() - 1; - hd_.bins[binIndex] += 1; - } - } - private: - HistogramData& hd_; - double minValue_; - double maxValue_; - double division_; - }; - - template - struct Histogram - { - typedef typename PixelTraits::PixelType PixelType; - - static void Apply(const Orthanc::ImageAccessor& img, HistogramData& hd, - double minValue = 0, - double maxValue = 0) - { - ORTHANC_ASSERT(Format == img.GetFormat(), - "Internal error. Wrong template histogram type"); - - const size_t height = img.GetHeight(); - const size_t width = img.GetHeight(); - - if ((minValue == 0) && (maxValue == 0)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - //ORTHANC_ASSERT(boost::is_integral::value, - // "Min and max values must be supplied for float-based histogram"); - // - //PixelTraits::SetMinValue(minValue); - //PixelTraits::SetMaxValue(maxValue); - } - - hd.minValue = minValue; - - // the following code is not really pretty but ensures - size_t numBins = static_cast( - std::ceil((maxValue - minValue) / hd.binSize)); - - hd.bins.resize(numBins); - std::fill(hd.bins.begin(), hd.bins.end(), 0); - - PixelBinner binner(hd, minValue, maxValue); - for (uint32_t y = 0; y < height; ++y) - { - const PixelType* curPix = reinterpret_cast( - img.GetConstRow(y)); - - for (uint32_t x = 0; x < width; x++, curPix++) - { - binner.AddPixel(*curPix); - } - } - } - }; - - - template - struct ComputeMinMax__ - { - typedef typename PixelTraits::PixelType PixelType; - - static void Apply(const Orthanc::ImageAccessor& img, - PixelType& minValue, PixelType& maxValue) - { - ORTHANC_ASSERT(Format == img.GetFormat(), - "Internal error. Wrong template histogram type"); - - const size_t height = img.GetHeight(); - const size_t width = img.GetHeight(); - - if (height * width == 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - // min and max are crossed below. Think about it. This is OK :) - PixelTraits::SetMaxValue(minValue); - PixelTraits::SetMinValue(maxValue); - - for (uint32_t y = 0; y < height; ++y) - { - const PixelType* curPix = reinterpret_cast( - img.GetConstRow(y)); - - for (uint32_t x = 0; x < width; x++, curPix++) - { - if (*curPix <= minValue) - minValue = *curPix; - if (*curPix >= maxValue) - maxValue = *curPix; - } - } - } - }; - - template - void ComputeMinMax_(const Orthanc::ImageAccessor& img, - double& minValue, double& maxValue) - { - typedef typename PixelTraits::PixelType PixelType; - PixelType minValuePix = PixelType(); - PixelType maxValuePix = PixelType(); - ComputeMinMax__::Apply(img, minValuePix, maxValuePix); - minValue = static_cast(minValuePix); - maxValue = static_cast(maxValuePix); - } - - template - void ComputeHistogram_(const Orthanc::ImageAccessor& img, HistogramData& hd) - { - typedef typename PixelTraits::PixelType PixelType; - PixelType minValue = PixelType(); - PixelType maxValue = PixelType(); - ComputeMinMax__::Apply(img, minValue, maxValue); - - // make bins a little bigger to center integer pixel values - Histogram::Apply(img, hd, - static_cast(minValue) - 0.5, - static_cast(maxValue) + 0.5); - } - } - - void ComputeHistogram(const Orthanc::ImageAccessor& img, - HistogramData& hd, double binSize) - { - using namespace Orthanc; - - hd.binSize = binSize; - - // dynamic/static bridge - switch (img.GetFormat()) - { - case PixelFormat_Grayscale8: - ComputeHistogram_ (img, hd); - break; - case PixelFormat_Grayscale16: - ComputeHistogram_ (img, hd); - break; - case PixelFormat_SignedGrayscale16: - ComputeHistogram_(img, hd); - break; - case PixelFormat_Float32: - ComputeHistogram_ (img, hd); - break; - case PixelFormat_Grayscale32: - ComputeHistogram_ (img, hd); - break; - case PixelFormat_Grayscale64: - ComputeHistogram_ (img, hd); - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - } - - void ComputeMinMax(const Orthanc::ImageAccessor& img, - double& minValue, double& maxValue) - { - using namespace Orthanc; - - // dynamic/static bridge - switch (img.GetFormat()) - { - case PixelFormat_Grayscale8: - ComputeMinMax_ (img, minValue, maxValue); - break; - case PixelFormat_Grayscale16: - ComputeMinMax_ (img, minValue, maxValue); - break; - case PixelFormat_SignedGrayscale16: - ComputeMinMax_(img, minValue, maxValue); - break; - case PixelFormat_Float32: - ComputeMinMax_ (img, minValue, maxValue); - break; - case PixelFormat_Grayscale32: - ComputeMinMax_ (img, minValue, maxValue); - break; - case PixelFormat_Grayscale64: - ComputeMinMax_ (img, minValue, maxValue); - break; - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - } - - void DumpHistogramResult(std::string& s, const HistogramData& hd) - { - std::stringstream ss; - ss << "Histogram:\n"; - ss << "==========\n"; - ss << "\n"; - ss << "minValue : " << hd.minValue << "\n"; - ss << "binSize : " << hd.binSize << "\n"; - ss << "bins.size() : " << hd.bins.size() << "\n"; - ss << "bins :\n"; - double curBinStart = hd.minValue; - size_t pixCount = 0; - for (size_t i = 0; i < hd.bins.size(); ++i) - { - ss << "index: " << i << " (from " << curBinStart << " to " - << curBinStart + hd.binSize << ") : " << hd.bins[i] << " pixels\n"; - curBinStart += hd.binSize; - pixCount += hd.bins[i]; - } - ss << "total pix. count: " << pixCount << "\n"; - s = ss.str(); - } - - - bool ImageToolbox::IsDecodingSupported(Orthanc::DicomTransferSyntax& transferSyntax) - { - switch (transferSyntax) - { - case Orthanc::DicomTransferSyntax_LittleEndianImplicit: - case Orthanc::DicomTransferSyntax_LittleEndianExplicit: - case Orthanc::DicomTransferSyntax_DeflatedLittleEndianExplicit: - case Orthanc::DicomTransferSyntax_BigEndianExplicit: - case Orthanc::DicomTransferSyntax_RLELossless: - return true; - -#if (ORTHANC_ENABLE_DCMTK == 1) && (ORTHANC_ENABLE_DCMTK_JPEG == 1) - case Orthanc::DicomTransferSyntax_JPEGProcess1: - case Orthanc::DicomTransferSyntax_JPEGProcess2_4: - case Orthanc::DicomTransferSyntax_JPEGProcess14: - case Orthanc::DicomTransferSyntax_JPEGProcess14SV1: - return true; -#endif - -#if (ORTHANC_ENABLE_DCMTK == 1) && (ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS == 1) - case Orthanc::DicomTransferSyntax_JPEGLSLossless: - case Orthanc::DicomTransferSyntax_JPEGLSLossy: - return true; -#endif - - default: - return false; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ImageToolbox.h --- a/Framework/Toolbox/ImageToolbox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "LinearAlgebra.h" - -#include - -namespace OrthancStone -{ - - /** - This structure represents the result of an histogram computation - - bins[0] contains the values in [minValue , minValue + binSize [ - bins[1] contains the values in [minValue + binSize, minValue + 2*binSize [ - bins[2] contains the values in [minValue + 2*binSize, minValue + 3*binSize [ - ... - bins[N-1] contains the values in [minValue + (N-1)*binSize, minValue + N*binSize [ - - */ - struct HistogramData - { - std::vector bins; - double minValue; - double binSize; - }; - - /** - Dumps the supplied histogram to the supplied strings - */ - void DumpHistogramResult(std::string& s, const HistogramData& hd); - - /** - This will compute the histogram of the supplied image (count the number of - pixels). - - The image must contain arithmetic pixels (that is, having a single component, - integer or float). Compound pixel types like RGB, YUV are not supported and - will cause this function to throw an exception. - - The range of available values will be split in sets of size `binSize`, and - each set will contain the number of pixels in the given bin - (see HistogramResult above). - */ - void ComputeHistogram(const Orthanc::ImageAccessor& img, - HistogramData& hd, double binSize); - - - /** - Computes the min max values in an image - */ - void ComputeMinMax(const Orthanc::ImageAccessor& img, - double& minValue, double& maxValue); - - - class ImageToolbox - { - public: - static bool IsDecodingSupported(Orthanc::DicomTransferSyntax& transferSyntax); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/LinearAlgebra.cpp --- a/Framework/Toolbox/LinearAlgebra.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,751 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "LinearAlgebra.h" - -#include "../StoneException.h" -#include "GenericToolbox.h" - -#include -#include -#include - -#include -#include - -#include -#include -#include - -namespace OrthancStone -{ - namespace LinearAlgebra - { - void Print(const Vector& v) - { - for (size_t i = 0; i < v.size(); i++) - { - printf("%g\n", v[i]); - //printf("%8.2f\n", v[i]); - } - printf("\n"); - } - - - void Print(const Matrix& m) - { - for (size_t i = 0; i < m.size1(); i++) - { - for (size_t j = 0; j < m.size2(); j++) - { - printf("%g ", m(i,j)); - //printf("%8.2f ", m(i,j)); - } - printf("\n"); - } - printf("\n"); - } - - - bool ParseVector(Vector& target, - const std::string& value) - { - std::vector items; - Orthanc::Toolbox::TokenizeString(items, Orthanc::Toolbox::StripSpaces(value), '\\'); - - target.resize(items.size()); - - for (size_t i = 0; i < items.size(); i++) - { - /** - * SJO - 2019-11-19 - WARNING: I reverted from "std::stod()" - * to "boost::lexical_cast", as both "std::stod()" and - * "std::strtod()" are sensitive to locale settings, making - * this code non portable and very dangerous as it fails - * silently. A string such as "1.3671875\1.3671875" is - * interpreted as "1\1", because "std::stod()" expects a comma - * (",") instead of a point ("."). This problem is notably - * seen in Qt-based applications, that somehow set locales - * aggressively. - * - * "boost::lexical_cast<>" is also dependent on the locale - * settings, but apparently not in a way that makes this - * function fail with Qt. The Orthanc core defines macro - * "-DBOOST_LEXICAL_CAST_ASSUME_C_LOCALE" in static builds to - * this end. - **/ - -#if 0 // __cplusplus >= 201103L // Is C++11 enabled? - /** - * We try and avoid the use of "boost::lexical_cast<>" here, - * as it is very slow, and as Stone has to parse many doubles. - * https://tinodidriksen.com/2011/05/cpp-convert-string-to-double-speed/ - **/ - - try - { - target[i] = std::stod(items[i]); - } - catch (std::exception&) - { - target.clear(); - return false; - } - -#elif 0 - /** - * "std::strtod()" is the recommended alternative to - * "std::stod()". It is apparently as fast as plain-C - * "atof()", with more security. - **/ - char* end = NULL; - target[i] = std::strtod(items[i].c_str(), &end); - if (end == NULL || - end != items[i].c_str() + items[i].size()) - { - return false; - } - -#elif 1 - /** - * Use of our homemade implementation of - * "boost::lexical_cast()". It is much faster than boost. - **/ - if (!GenericToolbox::StringToDouble(target[i], items[i].c_str())) - { - return false; - } - -#else - /** - * Fallback implementation using Boost (slower, but somehow - * independent to locale contrarily to "std::stod()", and - * generic as it does not use our custom implementation). - **/ - try - { - target[i] = boost::lexical_cast(items[i]); - } - catch (boost::bad_lexical_cast&) - { - target.clear(); - return false; - } -#endif - } - - return true; - } - - - bool ParseVector(Vector& target, - const Orthanc::DicomMap& dataset, - const Orthanc::DicomTag& tag) - { - std::string value; - return (dataset.LookupStringValue(value, tag, false) && - ParseVector(target, value)); - } - - - void NormalizeVector(Vector& u) - { - double norm = boost::numeric::ublas::norm_2(u); - if (!IsCloseToZero(norm)) - { - u = u / norm; - } - } - - void CrossProduct(Vector& result, - const Vector& u, - const Vector& v) - { - if (u.size() != 3 || - v.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - result.resize(3); - - result[0] = u[1] * v[2] - u[2] * v[1]; - result[1] = u[2] * v[0] - u[0] * v[2]; - result[2] = u[0] * v[1] - u[1] * v[0]; - } - - double DotProduct(const Vector& u, const Vector& v) - { - if (u.size() != 3 || - v.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]); - } - - void FillMatrix(Matrix& target, - size_t rows, - size_t columns, - const double values[]) - { - target.resize(rows, columns); - - size_t index = 0; - - for (size_t y = 0; y < rows; y++) - { - for (size_t x = 0; x < columns; x++, index++) - { - target(y, x) = values[index]; - } - } - } - - - void FillVector(Vector& target, - size_t size, - const double values[]) - { - target.resize(size); - - for (size_t i = 0; i < size; i++) - { - target[i] = values[i]; - } - } - - - void Convert(Matrix& target, - const Vector& source) - { - const size_t n = source.size(); - - target.resize(n, 1); - - for (size_t i = 0; i < n; i++) - { - target(i, 0) = source[i]; - } - } - - - double ComputeDeterminant(const Matrix& a) - { - if (a.size1() != a.size2()) - { - LOG(ERROR) << "Determinant only exists for square matrices"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - // https://en.wikipedia.org/wiki/Rule_of_Sarrus - if (a.size1() == 1) - { - return a(0,0); - } - else if (a.size1() == 2) - { - return a(0,0) * a(1,1) - a(0,1) * a(1,0); - } - else if (a.size1() == 3) - { - return (a(0,0) * a(1,1) * a(2,2) + - a(0,1) * a(1,2) * a(2,0) + - a(0,2) * a(1,0) * a(2,1) - - a(2,0) * a(1,1) * a(0,2) - - a(2,1) * a(1,2) * a(0,0) - - a(2,2) * a(1,0) * a(0,1)); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - bool IsOrthogonalMatrix(const Matrix& q, - double threshold) - { - // https://en.wikipedia.org/wiki/Orthogonal_matrix - - if (q.size1() != q.size2()) - { - LOG(ERROR) << "An orthogonal matrix must be squared"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - using namespace boost::numeric::ublas; - - const Matrix check = prod(trans(q), q) - identity_matrix(q.size1()); - - type_traits::real_type norm = norm_inf(check); - - return (norm <= threshold); - } - - - bool IsOrthogonalMatrix(const Matrix& q) - { - return IsOrthogonalMatrix(q, 10.0 * std::numeric_limits::epsilon()); - } - - - bool IsRotationMatrix(const Matrix& r, - double threshold) - { - return (IsOrthogonalMatrix(r, threshold) && - IsNear(ComputeDeterminant(r), 1.0, threshold)); - } - - - bool IsRotationMatrix(const Matrix& r) - { - return IsRotationMatrix(r, 10.0 * std::numeric_limits::epsilon()); - } - - - void InvertUpperTriangularMatrix(Matrix& output, - const Matrix& k) - { - if (k.size1() != k.size2()) - { - LOG(ERROR) << "Determinant only exists for square matrices"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - output.resize(k.size1(), k.size2()); - - for (size_t i = 1; i < k.size1(); i++) - { - for (size_t j = 0; j < i; j++) - { - if (!IsCloseToZero(k(i, j))) - { - LOG(ERROR) << "Not an upper triangular matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - output(i, j) = 0; // The output is also upper triangular - } - } - - if (k.size1() == 3) - { - // https://math.stackexchange.com/a/1004181 - double a = k(0, 0); - double b = k(0, 1); - double c = k(0, 2); - double d = k(1, 1); - double e = k(1, 2); - double f = k(2, 2); - - if (IsCloseToZero(a) || - IsCloseToZero(d) || - IsCloseToZero(f)) - { - LOG(ERROR) << "Singular upper triangular matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - output(0, 0) = 1.0 / a; - output(0, 1) = -b / (a * d); - output(0, 2) = (b * e - c * d) / (a * f * d); - output(1, 1) = 1.0 / d; - output(1, 2) = -e / (f * d); - output(2, 2) = 1.0 / f; - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - static void GetGivensComponent(double& c, - double& s, - const Matrix& a, - size_t i, - size_t j) - { - assert(i < 3 && j < 3); - - double x = a(i, i); - double y = a(i, j); - double n = sqrt(x * x + y * y); - - if (IsCloseToZero(n)) - { - c = 1; - s = 0; - } - else - { - c = x / n; - s = -y / n; - } - } - - - /** - * This function computes the RQ decomposition of a 3x3 matrix, - * using Givens rotations. Reference: Algorithm A4.1 (page 579) of - * "Multiple View Geometry in Computer Vision" (2nd edition). The - * output matrix "Q" is a rotation matrix, and "R" is upper - * triangular. - **/ - void RQDecomposition3x3(Matrix& r, - Matrix& q, - const Matrix& a) - { - using namespace boost::numeric::ublas; - - if (a.size1() != 3 || - a.size2() != 3) - { - LOG(ERROR) << "Only applicable to a 3x3 matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - r.resize(3, 3); - q.resize(3, 3); - - r = a; - q = identity_matrix(3); - - { - // Set A(2,1) to zero - double c, s; - GetGivensComponent(c, s, r, 2, 1); - - double v[9] = { 1, 0, 0, - 0, c, -s, - 0, s, c }; - - Matrix g; - FillMatrix(g, 3, 3, v); - - r = prod(r, g); - q = prod(trans(g), q); - } - - - { - // Set A(2,0) to zero - double c, s; - GetGivensComponent(c, s, r, 2, 0); - - double v[9] = { c, 0, -s, - 0, 1, 0, - s, 0, c }; - - Matrix g; - FillMatrix(g, 3, 3, v); - - r = prod(r, g); - q = prod(trans(g), q); - } - - - { - // Set A(1,0) to zero - double c, s; - GetGivensComponent(c, s, r, 1, 0); - - double v[9] = { c, -s, 0, - s, c, 0, - 0, 0, 1 }; - - Matrix g; - FillMatrix(g, 3, 3, v); - - r = prod(r, g); - q = prod(trans(g), q); - } - - if (!IsCloseToZero(norm_inf(prod(r, q) - a)) || - !IsRotationMatrix(q) || - !IsCloseToZero(r(1, 0)) || - !IsCloseToZero(r(2, 0)) || - !IsCloseToZero(r(2, 1))) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - bool InvertMatrixUnsafe(Matrix& target, - const Matrix& source) - { - if (source.size1() != source.size2()) - { - LOG(ERROR) << "Inverse only exists for square matrices"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (source.size1() < 4) - { - // For matrices with size below 4, use direct computations - // instead of LU decomposition - - if (source.size1() == 0) - { - // By convention, the inverse of the empty matrix, is itself the empty matrix - target.resize(0, 0); - return true; - } - - double determinant = ComputeDeterminant(source); - - if (IsCloseToZero(determinant)) - { - return false; - } - - double denominator = 1.0 / determinant; - - target.resize(source.size1(), source.size2()); - - if (source.size1() == 1) - { - target(0, 0) = denominator; - - return true; - } - else if (source.size1() == 2) - { - // https://en.wikipedia.org/wiki/Invertible_matrix#Inversion_of_2_%C3%97_2_matrices - target(0, 0) = source(1, 1) * denominator; - target(0, 1) = -source(0, 1) * denominator; - target(1, 0) = -source(1, 0) * denominator; - target(1, 1) = source(0, 0) * denominator; - - return true; - } - else if (source.size1() == 3) - { - // https://en.wikipedia.org/wiki/Invertible_matrix#Inversion_of_3_%C3%97_3_matrices - const double a = source(0, 0); - const double b = source(0, 1); - const double c = source(0, 2); - const double d = source(1, 0); - const double e = source(1, 1); - const double f = source(1, 2); - const double g = source(2, 0); - const double h = source(2, 1); - const double i = source(2, 2); - - target(0, 0) = (e * i - f * h) * denominator; - target(0, 1) = -(b * i - c * h) * denominator; - target(0, 2) = (b * f - c * e) * denominator; - target(1, 0) = -(d * i - f * g) * denominator; - target(1, 1) = (a * i - c * g) * denominator; - target(1, 2) = -(a * f - c * d) * denominator; - target(2, 0) = (d * h - e * g) * denominator; - target(2, 1) = -(a * h - b * g) * denominator; - target(2, 2) = (a * e - b * d) * denominator; - - return true; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - else - { - // General case, using LU decomposition - - Matrix a = source; // Copy the source matrix, as "lu_factorize()" modifies it - - boost::numeric::ublas::permutation_matrix permutation(source.size1()); - - if (boost::numeric::ublas::lu_factorize(a, permutation) != 0) - { - return false; - } - else - { - target = boost::numeric::ublas::identity_matrix(source.size1()); - lu_substitute(a, permutation, target); - return true; - } - } - } - - - - void InvertMatrix(Matrix& target, - const Matrix& source) - { - if (!InvertMatrixUnsafe(target, source)) - { - LOG(ERROR) << "Cannot invert singular matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void CreateSkewSymmetric(Matrix& s, - const Vector& v) - { - if (v.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - s.resize(3, 3); - s(0,0) = 0; - s(0,1) = -v[2]; - s(0,2) = v[1]; - s(1,0) = v[2]; - s(1,1) = 0; - s(1,2) = -v[0]; - s(2,0) = -v[1]; - s(2,1) = v[0]; - s(2,2) = 0; - } - - - Matrix InvertScalingTranslationMatrix(const Matrix& t) - { - if (t.size1() != 4 || - t.size2() != 4 || - !LinearAlgebra::IsCloseToZero(t(0,1)) || - !LinearAlgebra::IsCloseToZero(t(0,2)) || - !LinearAlgebra::IsCloseToZero(t(1,0)) || - !LinearAlgebra::IsCloseToZero(t(1,2)) || - !LinearAlgebra::IsCloseToZero(t(2,0)) || - !LinearAlgebra::IsCloseToZero(t(2,1)) || - !LinearAlgebra::IsCloseToZero(t(3,0)) || - !LinearAlgebra::IsCloseToZero(t(3,1)) || - !LinearAlgebra::IsCloseToZero(t(3,2))) - { - LOG(ERROR) << "This matrix is more than a zoom/translate transform"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - const double sx = t(0,0); - const double sy = t(1,1); - const double sz = t(2,2); - const double w = t(3,3); - - if (LinearAlgebra::IsCloseToZero(sx) || - LinearAlgebra::IsCloseToZero(sy) || - LinearAlgebra::IsCloseToZero(sz) || - LinearAlgebra::IsCloseToZero(w)) - { - LOG(ERROR) << "Singular transform"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - const double tx = t(0,3); - const double ty = t(1,3); - const double tz = t(2,3); - - Matrix m = IdentityMatrix(4); - - m(0,0) = 1.0 / sx; - m(1,1) = 1.0 / sy; - m(2,2) = 1.0 / sz; - m(3,3) = 1.0 / w; - - m(0,3) = -tx / (sx * w); - m(1,3) = -ty / (sy * w); - m(2,3) = -tz / (sz * w); - - return m; - } - - - bool IsShearMatrix(const Matrix& shear) - { - return (shear.size1() == 4 && - shear.size2() == 4 && - LinearAlgebra::IsNear(1.0, shear(0,0)) && - LinearAlgebra::IsNear(0.0, shear(0,1)) && - LinearAlgebra::IsNear(0.0, shear(0,3)) && - LinearAlgebra::IsNear(0.0, shear(1,0)) && - LinearAlgebra::IsNear(1.0, shear(1,1)) && - LinearAlgebra::IsNear(0.0, shear(1,3)) && - LinearAlgebra::IsNear(0.0, shear(2,0)) && - LinearAlgebra::IsNear(0.0, shear(2,1)) && - LinearAlgebra::IsNear(1.0, shear(2,2)) && - LinearAlgebra::IsNear(0.0, shear(2,3)) && - LinearAlgebra::IsNear(0.0, shear(3,0)) && - LinearAlgebra::IsNear(0.0, shear(3,1)) && - LinearAlgebra::IsNear(1.0, shear(3,3))); - } - - - Matrix InvertShearMatrix(const Matrix& shear) - { - if (!IsShearMatrix(shear)) - { - LOG(ERROR) << "Not a valid shear matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - Matrix m = IdentityMatrix(4); - m(0,2) = -shear(0,2); - m(1,2) = -shear(1,2); - m(3,2) = -shear(3,2); - - return m; - } - } - - std::ostream& operator<<(std::ostream& s, const Vector& vec) - { - s << "("; - for (size_t i = 0; i < vec.size(); ++i) - { - s << vec(i); - if (i < (vec.size() - 1)) - s << ", "; - } - s << ")"; - return s; - } - - std::ostream& operator<<(std::ostream& s, const Matrix& m) - { - ORTHANC_ASSERT(m.size1() == m.size2()); - s << "("; - for (size_t i = 0; i < m.size1(); ++i) - { - s << "("; - for (size_t j = 0; j < m.size2(); ++j) - { - s << m(i,j); - if (j < (m.size2() - 1)) - s << ", "; - } - s << ")"; - if (i < (m.size1() - 1)) - s << ", "; - } - s << ")"; - return s; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/LinearAlgebra.h --- a/Framework/Toolbox/LinearAlgebra.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,299 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -// Patch for ublas in Boost 1.64.0 -// https://github.com/dealii/dealii/issues/4302 -#include -#if BOOST_VERSION >= 106300 // or 64, need to check -# include -#endif - -#include - -#include -#include - -namespace OrthancStone -{ - typedef boost::numeric::ublas::matrix Matrix; - typedef boost::numeric::ublas::vector Vector; - - // logs, debugging... - std::ostream& operator<<(std::ostream& s, const Vector& vec); - std::ostream& operator<<(std::ostream& s, const Matrix& m); - - namespace LinearAlgebra - { - void Print(const Vector& v); - - void Print(const Matrix& m); - - bool ParseVector(Vector& target, - const std::string& s); - - bool ParseVector(Vector& target, - const Orthanc::DicomMap& dataset, - const Orthanc::DicomTag& tag); - - inline void AssignVector(Vector& v, - double v1, - double v2) - { - v.resize(2); - v[0] = v1; - v[1] = v2; - } - - - inline void AssignVector(Vector& v, - double v1) - { - v.resize(1); - v[0] = v1; - } - - - inline void AssignVector(Vector& v, - double v1, - double v2, - double v3) - { - v.resize(3); - v[0] = v1; - v[1] = v2; - v[2] = v3; - } - - - inline void AssignVector(Vector& v, - double v1, - double v2, - double v3, - double v4) - { - v.resize(4); - v[0] = v1; - v[1] = v2; - v[2] = v3; - v[3] = v4; - } - - - inline Vector CreateVector(double v1) - { - Vector v; - AssignVector(v, v1); - return v; - } - - - inline Vector CreateVector(double v1, - double v2) - { - Vector v; - AssignVector(v, v1, v2); - return v; - } - - - inline Vector CreateVector(double v1, - double v2, - double v3) - { - Vector v; - AssignVector(v, v1, v2, v3); - return v; - } - - - inline Vector CreateVector(double v1, - double v2, - double v3, - double v4) - { - Vector v; - AssignVector(v, v1, v2, v3, v4); - return v; - } - - - inline bool IsNear(double x, - double y, - double threshold) - { - return fabs(x - y) <= threshold; - } - - inline bool IsNear(double x, - double y) - { - // As most input is read as single-precision numbers, we take the - // epsilon machine for float32 into consideration to compare numbers - return IsNear(x, y, 10.0 * std::numeric_limits::epsilon()); - } - - inline bool IsCloseToZero(double x) - { - return IsNear(x, 0.0); - } - - void NormalizeVector(Vector& u); - - void CrossProduct(Vector& result, - const Vector& u, - const Vector& v); - - double DotProduct(const Vector& u, const Vector& v); - - void FillMatrix(Matrix& target, - size_t rows, - size_t columns, - const double values[]); - - void FillVector(Vector& target, - size_t size, - const double values[]); - - void Convert(Matrix& target, - const Vector& source); - - inline Matrix Transpose(const Matrix& a) - { - return boost::numeric::ublas::trans(a); - } - - - inline Matrix IdentityMatrix(size_t size) - { - return boost::numeric::ublas::identity_matrix(size); - } - - - inline Matrix ZeroMatrix(size_t size1, - size_t size2) - { - return boost::numeric::ublas::zero_matrix(size1, size2); - } - - - inline Matrix Product(const Matrix& a, - const Matrix& b) - { - return boost::numeric::ublas::prod(a, b); - } - - - inline Vector Product(const Matrix& a, - const Vector& b) - { - return boost::numeric::ublas::prod(a, b); - } - - - inline Matrix Product(const Matrix& a, - const Matrix& b, - const Matrix& c) - { - return Product(a, Product(b, c)); - } - - - inline Matrix Product(const Matrix& a, - const Matrix& b, - const Matrix& c, - const Matrix& d) - { - return Product(a, Product(b, c, d)); - } - - - inline Matrix Product(const Matrix& a, - const Matrix& b, - const Matrix& c, - const Matrix& d, - const Matrix& e) - { - return Product(a, Product(b, c, d, e)); - } - - - inline Vector Product(const Matrix& a, - const Matrix& b, - const Vector& c) - { - return Product(Product(a, b), c); - } - - - inline Vector Product(const Matrix& a, - const Matrix& b, - const Matrix& c, - const Vector& d) - { - return Product(Product(a, b, c), d); - } - - - double ComputeDeterminant(const Matrix& a); - - bool IsOrthogonalMatrix(const Matrix& q, - double threshold); - - bool IsOrthogonalMatrix(const Matrix& q); - - bool IsRotationMatrix(const Matrix& r, - double threshold); - - bool IsRotationMatrix(const Matrix& r); - - void InvertUpperTriangularMatrix(Matrix& output, - const Matrix& k); - - /** - * This function computes the RQ decomposition of a 3x3 matrix, - * using Givens rotations. Reference: Algorithm A4.1 (page 579) of - * "Multiple View Geometry in Computer Vision" (2nd edition). The - * output matrix "Q" is a rotation matrix, and "R" is upper - * triangular. - **/ - void RQDecomposition3x3(Matrix& r, - Matrix& q, - const Matrix& a); - - void InvertMatrix(Matrix& target, - const Matrix& source); - - // This is the same as "InvertMatrix()", but without exception - bool InvertMatrixUnsafe(Matrix& target, - const Matrix& source); - - void CreateSkewSymmetric(Matrix& s, - const Vector& v); - - Matrix InvertScalingTranslationMatrix(const Matrix& t); - - bool IsShearMatrix(const Matrix& shear); - - Matrix InvertShearMatrix(const Matrix& shear); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/DicomDatasetReader.cpp --- a/Framework/Toolbox/OrthancDatasets/DicomDatasetReader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomDatasetReader.h" - -#include -#include - -#include - -namespace OrthancStone -{ - DicomDatasetReader::DicomDatasetReader(const IDicomDataset& dataset) : - dataset_(dataset) - { - } - - - std::string DicomDatasetReader::GetStringValue(const DicomPath& path, - const std::string& defaultValue) const - { - std::string s; - if (dataset_.GetStringValue(s, path)) - { - return s; - } - else - { - return defaultValue; - } - } - - - std::string DicomDatasetReader::GetMandatoryStringValue(const DicomPath& path) const - { - std::string s; - if (dataset_.GetStringValue(s, path)) - { - return s; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); - } - } - - - template - static bool GetValueInternal(T& target, - const IDicomDataset& dataset, - const DicomPath& path) - { - try - { - std::string s; - - if (dataset.GetStringValue(s, path)) - { - target = boost::lexical_cast(Orthanc::Toolbox::StripSpaces(s)); - return true; - } - else - { - return false; - } - } - catch (boost::bad_lexical_cast&) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - bool DicomDatasetReader::GetIntegerValue(int& target, - const DicomPath& path) const - { - return GetValueInternal(target, dataset_, path); - } - - - bool DicomDatasetReader::GetUnsignedIntegerValue(unsigned int& target, - const DicomPath& path) const - { - int value; - - if (!GetIntegerValue(value, path)) - { - return false; - } - else if (value >= 0) - { - target = static_cast(value); - return true; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - bool DicomDatasetReader::GetFloatValue(float& target, - const DicomPath& path) const - { - return GetValueInternal(target, dataset_, path); - } - - - bool DicomDatasetReader::GetDoubleValue(double& target, - const DicomPath& path) const - { - return GetValueInternal(target, dataset_, path); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/DicomDatasetReader.h --- a/Framework/Toolbox/OrthancDatasets/DicomDatasetReader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IDicomDataset.h" - -#include -#include - -namespace OrthancStone -{ - class DicomDatasetReader : public boost::noncopyable - { - private: - const IDicomDataset& dataset_; - - public: - DicomDatasetReader(const IDicomDataset& dataset); - - const IDicomDataset& GetDataset() const - { - return dataset_; - } - - std::string GetStringValue(const DicomPath& path, - const std::string& defaultValue) const; - - std::string GetMandatoryStringValue(const DicomPath& path) const; - - bool GetIntegerValue(int& target, - const DicomPath& path) const; - - bool GetUnsignedIntegerValue(unsigned int& target, - const DicomPath& path) const; - - bool GetFloatValue(float& target, - const DicomPath& path) const; - - bool GetDoubleValue(double& target, - const DicomPath& path) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/DicomPath.cpp --- a/Framework/Toolbox/OrthancDatasets/DicomPath.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomPath.h" - -#include - -#include - -namespace OrthancStone -{ - const DicomPath::Prefix& DicomPath::GetPrefixItem(size_t depth) const - { - if (depth >= prefix_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - return prefix_[depth]; - } - } - - - DicomPath::Prefix& DicomPath::GetPrefixItem(size_t depth) - { - if (depth >= prefix_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - return prefix_[depth]; - } - } - - - DicomPath::DicomPath(const Orthanc::DicomTag& sequence, - size_t index, - const Orthanc::DicomTag& tag) : - finalTag_(tag) - { - AddToPrefix(sequence, index); - } - - - DicomPath::DicomPath(const Orthanc::DicomTag& sequence1, - size_t index1, - const Orthanc::DicomTag& sequence2, - size_t index2, - const Orthanc::DicomTag& tag) : - finalTag_(tag) - { - AddToPrefix(sequence1, index1); - AddToPrefix(sequence2, index2); - } - - - DicomPath::DicomPath(const Orthanc::DicomTag& sequence1, - size_t index1, - const Orthanc::DicomTag& sequence2, - size_t index2, - const Orthanc::DicomTag& sequence3, - size_t index3, - const Orthanc::DicomTag& tag) : - finalTag_(tag) - { - AddToPrefix(sequence1, index1); - AddToPrefix(sequence2, index2); - AddToPrefix(sequence3, index3); - } - - - static std::string FormatHexadecimal(const Orthanc::DicomTag& tag) - { - char buf[16]; - sprintf(buf, "(%04x,%04x)", tag.GetGroup(), tag.GetElement()); - return buf; - } - - - std::string DicomPath::Format() const - { - std::string s; - - for (size_t i = 0; i < GetPrefixLength(); i++) - { - s += (FormatHexadecimal(GetPrefixTag(i)) + " / " + - boost::lexical_cast(i) + " / "); - } - - return s + FormatHexadecimal(GetFinalTag()); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/DicomPath.h --- a/Framework/Toolbox/OrthancDatasets/DicomPath.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include -#include - -namespace OrthancStone -{ - class DicomPath - { - private: - typedef std::pair Prefix; - - std::vector prefix_; - Orthanc::DicomTag finalTag_; - - const Prefix& GetPrefixItem(size_t depth) const; - - Prefix& GetPrefixItem(size_t depth); - - public: - DicomPath(const Orthanc::DicomTag& finalTag) : - finalTag_(finalTag) - { - } - - DicomPath(const Orthanc::DicomTag& sequence, - size_t index, - const Orthanc::DicomTag& tag); - - DicomPath(const Orthanc::DicomTag& sequence1, - size_t index1, - const Orthanc::DicomTag& sequence2, - size_t index2, - const Orthanc::DicomTag& tag); - - DicomPath(const Orthanc::DicomTag& sequence1, - size_t index1, - const Orthanc::DicomTag& sequence2, - size_t index2, - const Orthanc::DicomTag& sequence3, - size_t index3, - const Orthanc::DicomTag& tag); - - void AddToPrefix(const Orthanc::DicomTag& tag, - size_t position) - { - prefix_.push_back(std::make_pair(tag, position)); - } - - size_t GetPrefixLength() const - { - return prefix_.size(); - } - - Orthanc::DicomTag GetPrefixTag(size_t depth) const - { - return GetPrefixItem(depth).first; - } - - size_t GetPrefixIndex(size_t depth) const - { - return GetPrefixItem(depth).second; - } - - void SetPrefixIndex(size_t depth, - size_t value) - { - GetPrefixItem(depth).second = value; - } - - const Orthanc::DicomTag& GetFinalTag() const - { - return finalTag_; - } - - void SetFinalTag(const Orthanc::DicomTag& tag) - { - finalTag_ = tag; - } - - std::string Format() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/FullOrthancDataset.cpp --- a/Framework/Toolbox/OrthancDatasets/FullOrthancDataset.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,203 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "FullOrthancDataset.h" - -#include - -#include -#include - -namespace OrthancStone -{ - static const Json::Value* AccessTag(const Json::Value& dataset, - const Orthanc::DicomTag& tag) - { - if (dataset.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - char name[16]; - sprintf(name, "%04x,%04x", tag.GetGroup(), tag.GetElement()); - - if (!dataset.isMember(name)) - { - return NULL; - } - - const Json::Value& value = dataset[name]; - if (value.type() != Json::objectValue || - !value.isMember("Name") || - !value.isMember("Type") || - !value.isMember("Value") || - value["Name"].type() != Json::stringValue || - value["Type"].type() != Json::stringValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - return &value; - } - - - static const Json::Value& GetSequenceContent(const Json::Value& sequence) - { - assert(sequence.type() == Json::objectValue); - assert(sequence.isMember("Type")); - assert(sequence.isMember("Value")); - - const Json::Value& value = sequence["Value"]; - - if (sequence["Type"].asString() != "Sequence" || - value.type() != Json::arrayValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - return value; - } - } - - - static bool GetStringInternal(std::string& result, - const Json::Value& tag) - { - assert(tag.type() == Json::objectValue); - assert(tag.isMember("Type")); - assert(tag.isMember("Value")); - - const Json::Value& value = tag["Value"]; - - if (tag["Type"].asString() != "String" || - value.type() != Json::stringValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - result = value.asString(); - return true; - } - } - - - const Json::Value* FullOrthancDataset::LookupPath(const DicomPath& path) const - { - const Json::Value* content = &root_; - - for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++) - { - const Json::Value* sequence = AccessTag(*content, path.GetPrefixTag(depth)); - if (sequence == NULL) - { - return NULL; - } - - const Json::Value& nextContent = GetSequenceContent(*sequence); - - size_t index = path.GetPrefixIndex(depth); - if (index >= nextContent.size()) - { - return NULL; - } - else - { - content = &nextContent[static_cast(index)]; - } - } - - return AccessTag(*content, path.GetFinalTag()); - } - - - void FullOrthancDataset::CheckRoot() const - { - if (root_.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - FullOrthancDataset::FullOrthancDataset(IOrthancConnection& orthanc, - const std::string& uri) - { - IOrthancConnection::RestApiGet(root_, orthanc, uri); - CheckRoot(); - } - - - FullOrthancDataset::FullOrthancDataset(const std::string& content) - { - IOrthancConnection::ParseJson(root_, content); - CheckRoot(); - } - - - FullOrthancDataset::FullOrthancDataset(const void* content, - size_t size) - { - IOrthancConnection::ParseJson(root_, content, size); - CheckRoot(); - } - - - FullOrthancDataset::FullOrthancDataset(const Json::Value& root) : - root_(root) - { - CheckRoot(); - } - - - bool FullOrthancDataset::GetStringValue(std::string& result, - const DicomPath& path) const - { - const Json::Value* value = LookupPath(path); - - if (value == NULL) - { - return false; - } - else - { - return GetStringInternal(result, *value); - } - } - - - bool FullOrthancDataset::GetSequenceSize(size_t& size, - const DicomPath& path) const - { - const Json::Value* sequence = LookupPath(path); - - if (sequence == NULL) - { - return false; - } - else - { - size = GetSequenceContent(*sequence).size(); - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/FullOrthancDataset.h --- a/Framework/Toolbox/OrthancDatasets/FullOrthancDataset.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOrthancConnection.h" -#include "IDicomDataset.h" - -#include - -namespace OrthancStone -{ - class FullOrthancDataset : public IDicomDataset - { - private: - Json::Value root_; - - const Json::Value* LookupPath(const DicomPath& path) const; - - void CheckRoot() const; - - public: - FullOrthancDataset(IOrthancConnection& orthanc, - const std::string& uri); - - FullOrthancDataset(const std::string& content); - - FullOrthancDataset(const void* content, - size_t size); - - FullOrthancDataset(const Json::Value& root); - - virtual bool GetStringValue(std::string& result, - const DicomPath& path) const; - - virtual bool GetSequenceSize(size_t& size, - const DicomPath& path) const; - - FullOrthancDataset* Clone() const - { - return new FullOrthancDataset(this->root_); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/IDicomDataset.h --- a/Framework/Toolbox/OrthancDatasets/IDicomDataset.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "DicomPath.h" - -#include -#include - -namespace OrthancStone -{ - class IDicomDataset : public boost::noncopyable - { - public: - virtual ~IDicomDataset() - { - } - - virtual bool GetStringValue(std::string& result, - const DicomPath& path) const = 0; - - virtual bool GetSequenceSize(size_t& size, - const DicomPath& path) const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/IOrthancConnection.cpp --- a/Framework/Toolbox/OrthancDatasets/IOrthancConnection.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "IOrthancConnection.h" - -#include - -#include - -namespace OrthancStone -{ - void IOrthancConnection::ParseJson(Json::Value& result, - const std::string& content) - { - Json::Reader reader; - - if (!reader.parse(content, result)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void IOrthancConnection::ParseJson(Json::Value& result, - const void* content, - size_t size) - { - Json::Reader reader; - - if (!reader.parse(reinterpret_cast(content), - reinterpret_cast(content) + size, result)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void IOrthancConnection::RestApiGet(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri) - { - std::string content; - orthanc.RestApiGet(content, uri); - ParseJson(result, content); - } - - - void IOrthancConnection::RestApiPost(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body) - { - std::string content; - orthanc.RestApiPost(content, uri, body); - ParseJson(result, content); - } - - - void IOrthancConnection::RestApiPut(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body) - { - std::string content; - orthanc.RestApiPut(content, uri, body); - ParseJson(result, content); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/IOrthancConnection.h --- a/Framework/Toolbox/OrthancDatasets/IOrthancConnection.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "DicomPath.h" - -#include -#include -#include - -namespace OrthancStone -{ - class IOrthancConnection : public boost::noncopyable - { - public: - virtual ~IOrthancConnection() - { - } - - virtual void RestApiGet(std::string& result, - const std::string& uri) = 0; - - virtual void RestApiPost(std::string& result, - const std::string& uri, - const std::string& body) = 0; - - virtual void RestApiPut(std::string& result, - const std::string& uri, - const std::string& body) = 0; - - virtual void RestApiDelete(const std::string& uri) = 0; - - static void ParseJson(Json::Value& result, - const std::string& content); - - static void ParseJson(Json::Value& result, - const void* content, - size_t size); - - static void RestApiGet(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri); - - static void RestApiPost(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body); - - static void RestApiPut(Json::Value& result, - IOrthancConnection& orthanc, - const std::string& uri, - const std::string& body); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/NOTES.txt --- a/Framework/Toolbox/OrthancDatasets/NOTES.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -The files from this folder were previously (up to Orthanc <= 1.7.1) -contained in the folder "Plugins/Samples/Common/" from the Orthanc -source distribution. diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp --- a/Framework/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrthancHttpConnection.h" - -namespace OrthancStone -{ - void OrthancHttpConnection::Setup() - { - url_ = client_.GetUrl(); - - // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) - client_.SetRedirectionFollowed(false); - } - - - OrthancHttpConnection::OrthancHttpConnection() : - client_(Orthanc::WebServiceParameters(), "") - { - Setup(); - } - - - OrthancHttpConnection::OrthancHttpConnection(const Orthanc::WebServiceParameters& parameters) : - client_(parameters, "") - { - Setup(); - } - - - void OrthancHttpConnection::RestApiGet(std::string& result, - const std::string& uri) - { - boost::mutex::scoped_lock lock(mutex_); - - client_.SetMethod(Orthanc::HttpMethod_Get); - client_.SetUrl(url_ + uri); - client_.ApplyAndThrowException(result); - } - - - void OrthancHttpConnection::RestApiPost(std::string& result, - const std::string& uri, - const std::string& body) - { - boost::mutex::scoped_lock lock(mutex_); - - client_.SetMethod(Orthanc::HttpMethod_Post); - client_.SetUrl(url_ + uri); - client_.SetBody(body); - client_.ApplyAndThrowException(result); - } - - - void OrthancHttpConnection::RestApiPut(std::string& result, - const std::string& uri, - const std::string& body) - { - boost::mutex::scoped_lock lock(mutex_); - - client_.SetMethod(Orthanc::HttpMethod_Put); - client_.SetUrl(url_ + uri); - client_.SetBody(body); - client_.ApplyAndThrowException(result); - } - - - void OrthancHttpConnection::RestApiDelete(const std::string& uri) - { - boost::mutex::scoped_lock lock(mutex_); - - std::string result; - - client_.SetMethod(Orthanc::HttpMethod_Delete); - client_.SetUrl(url_ + uri); - client_.ApplyAndThrowException(result); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/OrthancHttpConnection.h --- a/Framework/Toolbox/OrthancDatasets/OrthancHttpConnection.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOrthancConnection.h" - -#include - -#include - -namespace OrthancStone -{ - // This class is thread-safe - class OrthancHttpConnection : public IOrthancConnection - { - private: - boost::mutex mutex_; - Orthanc::HttpClient client_; - std::string url_; - - void Setup(); - - public: - OrthancHttpConnection(); - - OrthancHttpConnection(const Orthanc::WebServiceParameters& parameters); - - virtual void RestApiGet(std::string& result, - const std::string& uri); - - virtual void RestApiPost(std::string& result, - const std::string& uri, - const std::string& body); - - virtual void RestApiPut(std::string& result, - const std::string& uri, - const std::string& body); - - virtual void RestApiDelete(const std::string& uri); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.cpp --- a/Framework/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SimplifiedOrthancDataset.h" - -namespace OrthancStone -{ - const Json::Value* SimplifiedOrthancDataset::LookupPath(const DicomPath& path) const - { - const Json::Value* content = &root_; - - for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++) - { - const char* name = path.GetPrefixTag(depth).GetName(); - if (content->type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (!content->isMember(name)) - { - return NULL; - } - - const Json::Value& sequence = (*content) [name]; - if (sequence.type() != Json::arrayValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - size_t index = path.GetPrefixIndex(depth); - if (index >= sequence.size()) - { - return NULL; - } - else - { - content = &sequence[static_cast(index)]; - } - } - - const char* name = path.GetFinalTag().GetName(); - - if (content->type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - if (!content->isMember(name)) - { - return NULL; - } - else - { - return &((*content) [name]); - } - } - - - void SimplifiedOrthancDataset::CheckRoot() const - { - if (root_.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - SimplifiedOrthancDataset::SimplifiedOrthancDataset(IOrthancConnection& orthanc, - const std::string& uri) - { - IOrthancConnection::RestApiGet(root_, orthanc, uri); - CheckRoot(); - } - - - SimplifiedOrthancDataset::SimplifiedOrthancDataset(const std::string& content) - { - IOrthancConnection::ParseJson(root_, content); - CheckRoot(); - } - - - bool SimplifiedOrthancDataset::GetStringValue(std::string& result, - const DicomPath& path) const - { - const Json::Value* value = LookupPath(path); - - if (value == NULL) - { - return false; - } - else if (value->type() != Json::stringValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - result = value->asString(); - return true; - } - } - - - bool SimplifiedOrthancDataset::GetSequenceSize(size_t& size, - const DicomPath& path) const - { - const Json::Value* sequence = LookupPath(path); - - if (sequence == NULL) - { - // Inexistent path - return false; - } - else if (sequence->type() != Json::arrayValue) - { - // Not a sequence - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - size = sequence->size(); - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.h --- a/Framework/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOrthancConnection.h" -#include "IDicomDataset.h" - -namespace OrthancStone -{ - class SimplifiedOrthancDataset : public IDicomDataset - { - private: - Json::Value root_; - - const Json::Value* LookupPath(const DicomPath& path) const; - - void CheckRoot() const; - - public: - SimplifiedOrthancDataset(IOrthancConnection& orthanc, - const std::string& uri); - - SimplifiedOrthancDataset(const std::string& content); - - virtual bool GetStringValue(std::string& result, - const DicomPath& path) const; - - virtual bool GetSequenceSize(size_t& size, - const DicomPath& path) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ParsedDicomCache.cpp --- a/Framework/Toolbox/ParsedDicomCache.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParsedDicomCache.h" - -namespace OrthancStone -{ - class ParsedDicomCache::Item : public Orthanc::ICacheable - { - private: - std::unique_ptr dicom_; - size_t fileSize_; - bool hasPixelData_; - - public: - Item(Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData) : - dicom_(dicom), - fileSize_(fileSize), - hasPixelData_(hasPixelData) - { - if (dicom == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - virtual size_t GetMemoryUsage() const - { - return fileSize_; - } - - Orthanc::ParsedDicomFile& GetDicom() const - { - assert(dicom_.get() != NULL); - return *dicom_; - } - - bool HasPixelData() const - { - return hasPixelData_; - } - }; - - - std::string ParsedDicomCache::GetIndex(unsigned int bucket, - const std::string& bucketKey) - { - return boost::lexical_cast(bucket) + "|" + bucketKey; - } - - - void ParsedDicomCache::Acquire(unsigned int bucket, - const std::string& bucketKey, - Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData) - { - LOG(TRACE) << "new item stored in cache: bucket " << bucket << ", key " << bucketKey; - cache_.Acquire(GetIndex(bucket, bucketKey), new Item(dicom, fileSize, hasPixelData)); - } - - - ParsedDicomCache::Reader::Reader(ParsedDicomCache& cache, - unsigned int bucket, - const std::string& bucketKey) : - /** - * The "DcmFileFormat" object cannot be accessed from multiple - * threads, even if using only getters. An unique lock (mutex) is - * mandatory. - **/ - accessor_(cache.cache_, GetIndex(bucket, bucketKey), true /* unique */) - { - if (accessor_.IsValid()) - { - LOG(TRACE) << "accessing item within cache: bucket " << bucket << ", key " << bucketKey; - item_ = &dynamic_cast(accessor_.GetValue()); - } - else - { - LOG(TRACE) << "missing item within cache: bucket " << bucket << ", key " << bucketKey; - item_ = NULL; - } - } - - - bool ParsedDicomCache::Reader::HasPixelData() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->HasPixelData(); - } - } - - - Orthanc::ParsedDicomFile& ParsedDicomCache::Reader::GetDicom() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->GetDicom(); - } - } - - - size_t ParsedDicomCache::Reader::GetFileSize() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->GetMemoryUsage(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ParsedDicomCache.h --- a/Framework/Toolbox/ParsedDicomCache.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace OrthancStone -{ - class ParsedDicomCache : public boost::noncopyable - { - private: - class Item; - - static std::string GetIndex(unsigned int bucket, - const std::string& bucketKey); - - Orthanc::MemoryObjectCache cache_; - - public: - ParsedDicomCache(size_t size) - { - cache_.SetMaximumSize(size); - } - - void Invalidate(unsigned int bucket, - const std::string& bucketKey) - { - cache_.Invalidate(GetIndex(bucket, bucketKey)); - } - - void Acquire(unsigned int bucket, - const std::string& bucketKey, - Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData); - - class Reader : public boost::noncopyable - { - private: - Orthanc::MemoryObjectCache::Accessor accessor_; - Item* item_; - - public: - Reader(ParsedDicomCache& cache, - unsigned int bucket, - const std::string& bucketKey); - - bool IsValid() const - { - return item_ != NULL; - } - - bool HasPixelData() const; - - Orthanc::ParsedDicomFile& GetDicom() const; - - size_t GetFileSize() const; - }; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ParsedDicomDataset.cpp --- a/Framework/Toolbox/ParsedDicomDataset.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParsedDicomDataset.h" - -#include - -namespace OrthancStone -{ - static DcmItem* LookupPath(Orthanc::ParsedDicomFile& dicom, - const DicomPath& path) - { - DcmItem* node = dicom.GetDcmtkObject().getDataset(); - - for (size_t i = 0; i < path.GetPrefixLength(); i++) - { - const Orthanc::DicomTag& tmp = path.GetPrefixTag(i); - DcmTagKey tag(tmp.GetGroup(), tmp.GetElement()); - - DcmSequenceOfItems* sequence = NULL; - if (!node->findAndGetSequence(tag, sequence).good() || - sequence == NULL) - { - return NULL; - } - - unsigned long pos = path.GetPrefixIndex(i); - if (pos >= sequence->card()) - { - return NULL; - } - - node = sequence->getItem(pos); - if (node == NULL) - { - return NULL; - } - } - - return node; - } - - - bool ParsedDicomDataset::GetStringValue(std::string& result, - const DicomPath& path) const - { - DcmItem* node = LookupPath(dicom_, path); - - if (node != NULL) - { - DcmTagKey tag(path.GetFinalTag().GetGroup(), path.GetFinalTag().GetElement()); - - const char* s = NULL; - if (node->findAndGetString(tag, s).good() && - s != NULL) - { - result.assign(s); - return true; - } - } - - return false; - } - - - bool ParsedDicomDataset::GetSequenceSize(size_t& size, - const DicomPath& path) const - { - DcmItem* node = LookupPath(dicom_, path); - - if (node != NULL) - { - DcmTagKey tag(path.GetFinalTag().GetGroup(), path.GetFinalTag().GetElement()); - - DcmSequenceOfItems* s = NULL; - if (node->findAndGetSequence(tag, s).good() && - s != NULL) - { - size = s->card(); - return true; - } - } - - return false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ParsedDicomDataset.h --- a/Framework/Toolbox/ParsedDicomDataset.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "OrthancDatasets/IDicomDataset.h" - -#include - -namespace OrthancStone -{ - class ParsedDicomDataset : public IDicomDataset - { - private: - Orthanc::ParsedDicomFile& dicom_; - - public: - ParsedDicomDataset(Orthanc::ParsedDicomFile& dicom) : - dicom_(dicom) - { - } - - virtual bool GetStringValue(std::string& result, - const DicomPath& path) const ORTHANC_OVERRIDE; - - virtual bool GetSequenceSize(size_t& size, - const DicomPath& path) const ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/PixelTestPatterns.h --- a/Framework/Toolbox/PixelTestPatterns.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -// PixelTestPatterns.h - -#pragma once - -#include "../StoneException.h" - -#include - -#include -#include -#include - -namespace OrthancStone -{ - namespace PixelTestPatterns - { - template - inline uint8_t byteAddClip(T v1, U v2) - { - double tmp = static_cast(v1) + static_cast(v2); - if (tmp > 255.0) - tmp = 255; - if (tmp < 0.0) - tmp = 0; - return static_cast(tmp+0.5); - } - - // fills the area with a horizontal gradient. - // leftmost pixels are filled with r0 g0 b0 - // rightmost pixels are filled with r1 g1 b1 - // linear interpolation in-between - inline void fillWithHGradient(Orthanc::ImageAccessor& target, - uint8_t r0, uint8_t g0, uint8_t b0, - uint8_t r1, uint8_t g1, uint8_t b1) - { - if (target.GetFormat() != Orthanc::PixelFormat_RGBA32) { - ORTHANC_ASSERT(false, "Wrong pixel format"); - } - const unsigned int width = target.GetWidth(); - const unsigned int height = target.GetHeight(); - - ORTHANC_ASSERT(width > 0); - ORTHANC_ASSERT(height > 0); - - double invWidth = 1.0 / static_cast(target.GetWidth()); - double rIncr = (static_cast(r1) - static_cast(r0))* invWidth; - double gIncr = (static_cast(g1) - static_cast(g0))* invWidth; - double bIncr = (static_cast(b1) - static_cast(b0))* invWidth; - - for (unsigned int y = 0; y < height; y++) - { - uint8_t r = r0; - uint8_t g = g0; - uint8_t b = b0; - uint8_t* q = reinterpret_cast(target.GetRow(y)); - for (unsigned int x = 0; x < width; x++) - { - q[0] = r; - q[1] = g; - q[2] = b; - q[3] = 255; - r = byteAddClip(r, rIncr); - g = byteAddClip(g, gIncr); - b = byteAddClip(b, bIncr); - q += 4; - } - } - } - - inline void fillWithVGradient(Orthanc::ImageAccessor& target, - uint8_t r0, uint8_t g0, uint8_t b0, - uint8_t r1, uint8_t g1, uint8_t b1) - { - if (target.GetFormat() != Orthanc::PixelFormat_RGBA32) { - ORTHANC_ASSERT(false, "Wrong pixel format"); - } - const unsigned int width = target.GetWidth(); - const unsigned int height = target.GetHeight(); - - ORTHANC_ASSERT(width > 0); - ORTHANC_ASSERT(height > 0); - - double invHeight = 1.0 / static_cast(target.GetHeight()); - double rIncr = (static_cast(r1) - static_cast(r0))* invHeight; - double gIncr = (static_cast(g1) - static_cast(g0))* invHeight; - double bIncr = (static_cast(b1) - static_cast(b0))* invHeight; - - uint8_t r = r0; - uint8_t g = g0; - uint8_t b = b0; - for (unsigned int y = 0; y < height; y++) - { - uint8_t* q = reinterpret_cast(target.GetRow(y)); - for (unsigned int x = 0; x < width; x++) - { - q[0] = r; - q[1] = g; - q[2] = b; - q[3] = 255; - q += 4; - } - r = byteAddClip(r, rIncr); - g = byteAddClip(g, gIncr); - b = byteAddClip(b, bIncr); - } - } - - } -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ShearWarpProjectiveTransform.cpp --- a/Framework/Toolbox/ShearWarpProjectiveTransform.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,664 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ShearWarpProjectiveTransform.h" - -#include "ImageGeometry.h" -#include "Extent2D.h" -#include "FiniteProjectiveCamera.h" -#include "GeometryToolbox.h" - -#include -#include -#include -#include - -#include -#include -#include - - -namespace OrthancStone -{ - static bool IsValidShear(const Matrix& M_shear) - { - return (LinearAlgebra::IsCloseToZero(M_shear(0, 1)) && - LinearAlgebra::IsCloseToZero(M_shear(1, 0)) && - LinearAlgebra::IsCloseToZero(M_shear(2, 0)) && - LinearAlgebra::IsCloseToZero(M_shear(2, 1)) && - LinearAlgebra::IsNear(1.0, M_shear(2, 2)) && - LinearAlgebra::IsCloseToZero(M_shear(2, 3)) && - LinearAlgebra::IsCloseToZero(M_shear(3, 0)) && - LinearAlgebra::IsCloseToZero(M_shear(3, 1)) && - LinearAlgebra::IsNear(1.0, M_shear(3, 3))); - } - - - static void ComputeShearParameters(double& scaling, - double& offsetX, - double& offsetY, - const Matrix& shear, - double z) - { - // Check out: ../../Resources/Computations/ComputeShearParameters.py - - if (!LinearAlgebra::IsShearMatrix(shear)) - { - LOG(ERROR) << "Not a valid shear matrix"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - scaling = 1.0 / (shear(3,2) * z + 1.0); - offsetX = shear(0,2) * z * scaling; - offsetY = shear(1,2) * z * scaling; - } - - - ShearWarpProjectiveTransform:: - ShearWarpProjectiveTransform(const Matrix& M_view, - //const Matrix& P, // Permutation applied to the volume - unsigned int volumeWidth, - unsigned int volumeHeight, - unsigned int volumeDepth, - double pixelSpacingX, - double pixelSpacingY, - unsigned int imageWidth, - unsigned int imageHeight) - { - eye_o.resize(4); - - { - // Find back the camera center given the "M_view" matrix - const double m11 = M_view(0, 0); - const double m12 = M_view(0, 1); - const double m13 = M_view(0, 2); - const double m14 = M_view(0, 3); - const double m21 = M_view(1, 0); - const double m22 = M_view(1, 1); - const double m23 = M_view(1, 2); - const double m24 = M_view(1, 3); - const double m41 = M_view(3, 0); - const double m42 = M_view(3, 1); - const double m43 = M_view(3, 2); - const double m44 = M_view(3, 3); - - // Equations (A.8) to (A.11) on page 203. Also check out - // "Finding the camera center" in "Multiple View Geometry in - // Computer Vision - 2nd edition", page 163. - const double vx[9] = { m12, m13, m14, m22, m23, m24, m42, m43, m44 }; - const double vy[9] = { m11, m13, m14, m21, m23, m24, m41, m43, m44 }; - const double vz[9] = { m11, m12, m14, m21, m22, m24, m41, m42, m44 }; - const double vw[9] = { m11, m12, m13, m21, m22, m23, m41, m42, m43 }; - - Matrix m; - - LinearAlgebra::FillMatrix(m, 3, 3, vx); - eye_o[0] = -LinearAlgebra::ComputeDeterminant(m); - - LinearAlgebra::FillMatrix(m, 3, 3, vy); - eye_o[1] = LinearAlgebra::ComputeDeterminant(m); - - LinearAlgebra::FillMatrix(m, 3, 3, vz); - eye_o[2] = -LinearAlgebra::ComputeDeterminant(m); - - LinearAlgebra::FillMatrix(m, 3, 3, vw); - eye_o[3] = LinearAlgebra::ComputeDeterminant(m); - - if (LinearAlgebra::IsCloseToZero(eye_o[3])) - { - LOG(ERROR) << "The shear-warp projective transform is not applicable to affine cameras"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - -#if 0 - // Assume "T_shift = I" (the eye does not lie on plane k = 0) - const Matrix T_shift = LinearAlgebra::IdentityMatrix(4); - - // Equation (A.13) on page 204, given that the inverse of a - // permutation matrix is its transpose (TODO CHECK). If no T_shift - // or permutation P is applied, M'_view == M_view - const Matrix MM_view = LinearAlgebra::Product( - M_view, - LinearAlgebra::Transpose(P), - LinearAlgebra::InvertScalingTranslationMatrix(T_shift)); -#else - // This is a shortcut, as we take "T_shift = I" and "P = I" - const Matrix MM_view = M_view; -#endif - - // Equation (A.14) on page 207 - Matrix MM_shear = LinearAlgebra::IdentityMatrix(4); - MM_shear(0, 2) = -eye_o[0] / eye_o[2]; - MM_shear(1, 2) = -eye_o[1] / eye_o[2]; - MM_shear(3, 2) = -eye_o[3] / eye_o[2]; - - - // Compute the extent of the intermediate image - Extent2D extent; - double maxScaling = 1; - - { - // Compute the shearing factors of the two extreme planes of the - // volume (z=0 and z=volumeDepth) - double scaling, offsetX, offsetY; - ComputeShearParameters(scaling, offsetX, offsetY, MM_shear, 0); - - if (scaling > 0) - { - extent.AddPoint(offsetX, offsetY); - extent.AddPoint(offsetX + static_cast(volumeWidth) * scaling, - offsetY + static_cast(volumeHeight) * scaling); - - if (scaling > maxScaling) - { - maxScaling = scaling; - } - } - - ComputeShearParameters(scaling, offsetX, offsetY, MM_shear, volumeDepth); - - if (scaling > 0) - { - extent.AddPoint(offsetX, offsetY); - extent.AddPoint(offsetX + static_cast(volumeWidth) * scaling, - offsetY + static_cast(volumeHeight) * scaling); - - if (scaling > maxScaling) - { - maxScaling = scaling; - } - } - } - - if (LinearAlgebra::IsCloseToZero(extent.GetWidth()) || - LinearAlgebra::IsCloseToZero(extent.GetHeight())) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - intermediateWidth_ = - static_cast(std::ceil(extent.GetWidth() / maxScaling)); - intermediateHeight_ = - static_cast(std::ceil(extent.GetHeight() / maxScaling)); - - // This is the product "T * S" in Equation (A.16) on page 209 - Matrix TS = LinearAlgebra::Product( - GeometryToolbox::CreateTranslationMatrix( - static_cast(intermediateWidth_) / 2.0, - static_cast(intermediateHeight_) / 2.0, 0), - GeometryToolbox::CreateScalingMatrix( - 1.0 / maxScaling, 1.0 / maxScaling, 1), - GeometryToolbox::CreateTranslationMatrix( - -extent.GetCenterX(), -extent.GetCenterY(), 0)); - - // This is Equation (A.16) on page 209. WARNING: There is an - // error in Lacroute's thesis: "inv(MM_shear)" is used instead - // of "MM_shear". - M_shear = LinearAlgebra::Product(TS, MM_shear); - - if (!IsValidShear(M_shear)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // This is Equation (A.17) on page 209 - Matrix tmp; - LinearAlgebra::InvertMatrix(tmp, M_shear); - M_warp = LinearAlgebra::Product(MM_view, tmp); - - // Intrinsic parameters of the camera - k_ = LinearAlgebra::ZeroMatrix(3, 4); - k_(0, 0) = 1.0 / pixelSpacingX; - k_(0, 3) = static_cast(imageWidth) / 2.0; - k_(1, 1) = 1.0 / pixelSpacingY; - k_(1, 3) = static_cast(imageHeight) / 2.0; - k_(2, 3) = 1.0; - } - - - FiniteProjectiveCamera *ShearWarpProjectiveTransform::CreateCamera() const - { - Matrix p = LinearAlgebra::Product(k_, M_warp, M_shear); - return new FiniteProjectiveCamera(p); - } - - - void ShearWarpProjectiveTransform::ComputeShearOnSlice(double& a11, - double& b1, - double& a22, - double& b2, - double& shearedZ, - const double sourceZ) - { - // Check out: ../../Resources/Computations/ComputeShearOnSlice.py - assert(IsValidShear(M_shear)); - - const double s11 = M_shear(0, 0); - const double s13 = M_shear(0, 2); - const double s14 = M_shear(0, 3); - const double s22 = M_shear(1, 1); - const double s23 = M_shear(1, 2); - const double s24 = M_shear(1, 3); - const double s43 = M_shear(3, 2); - - double scaling = 1.0 / (s43 * sourceZ + 1.0); - shearedZ = sourceZ * scaling; - - a11 = s11 * scaling; - a22 = s22 * scaling; - - b1 = (s13 * sourceZ + s14) * scaling; - b2 = (s23 * sourceZ + s24) * scaling; - } - - - Matrix ShearWarpProjectiveTransform::CalibrateView(const Vector& camera, - const Vector& principalPoint, - double angle) - { - if (camera.size() != 3 || - principalPoint.size() != 3) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const double sid = boost::numeric::ublas::norm_2(camera - principalPoint); - - Matrix a; - GeometryToolbox::AlignVectorsWithRotation(a, camera - principalPoint, - LinearAlgebra::CreateVector(0, 0, -1)); - - Matrix r = LinearAlgebra::Product(GeometryToolbox::CreateRotationMatrixAlongZ(angle), a); - - a = LinearAlgebra::ZeroMatrix(4, 4); - boost::numeric::ublas::subrange(a, 0, 3, 0, 3) = r; - - const Vector v = LinearAlgebra::Product(r, -camera); - a(0, 3) = v[0]; - a(1, 3) = v[1]; - a(2, 3) = v[2]; - a(3, 3) = 1; - - Matrix perspective = LinearAlgebra::ZeroMatrix(4, 4); - // https://stackoverflow.com/questions/5267866/calculation-of-a-perspective-transformation-matrix - perspective(0, 0) = sid; - perspective(1, 1) = sid; - perspective(2, 2) = sid; - perspective(3, 2) = 1; - - Matrix M_view = LinearAlgebra::Product(perspective, a); - assert(M_view.size1() == 4 && - M_view.size2() == 4); - - { - // Sanity checks - Vector p1 = LinearAlgebra::CreateVector(camera[0], camera[1], camera[2], 1.0); - Vector p2 = LinearAlgebra::CreateVector(principalPoint[0], principalPoint[1], principalPoint[2], 1.0); - - Vector v1 = LinearAlgebra::Product(M_view, p1); - Vector v2 = LinearAlgebra::Product(M_view, p2); - - if (!LinearAlgebra::IsCloseToZero(v1[3]) || // Must be mapped to singularity (w=0) - LinearAlgebra::IsCloseToZero(v2[3])) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // The principal point must be mapped to (0,0,z,1) - v2 /= v2[3]; - if (!LinearAlgebra::IsCloseToZero(v2[0]) || - !LinearAlgebra::IsCloseToZero(v2[1])) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - return M_view; - } - - - template - static void ApplyAxialInternal(Orthanc::ImageAccessor& target, - float& maxValue, - const Matrix& M_view, - const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - double pixelSpacing, - unsigned int countSlices, - ImageInterpolation shearInterpolation, - ImageInterpolation warpInterpolation) - { - typedef Orthanc::PixelTraits SourceTraits; - typedef Orthanc::PixelTraits TargetTraits; - - /** - * Step 1: Precompute some information. - **/ - - if (target.GetFormat() != TargetFormat || - source.GetFormat() != SourceFormat || - !std::numeric_limits::is_iec559 || - sizeof(float) != 4) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (countSlices > source.GetDepth()) - { - countSlices = source.GetDepth(); - } - - if (countSlices == 0) - { - maxValue = 0; - Orthanc::ImageProcessing::Set(target, 0); - return; - } - - LOG(INFO) << "Number of rendered slices: " << countSlices; - - - /** - * Step 2: Extract the shear-warp transform corresponding to - * M_view. - **/ - - // Compute the "world" matrix that maps the source volume to the - // (0,0,0)->(1,1,1) unit cube - Vector origin = geometry.GetCoordinates(0, 0, 0); - Vector ps = geometry.GetVoxelDimensions(VolumeProjection_Axial); - Matrix world = LinearAlgebra::Product( - GeometryToolbox::CreateScalingMatrix(1.0 / ps[0], 1.0 / ps[1], 1.0 / ps[2]), - GeometryToolbox::CreateTranslationMatrix(-origin[0], -origin[1], -origin[2])); - - Matrix worldInv; - LinearAlgebra::InvertMatrix(worldInv, world); - - ShearWarpProjectiveTransform shearWarp(LinearAlgebra::Product(M_view, worldInv), - /*LinearAlgebra::IdentityMatrix(4),*/ - source.GetWidth(), - source.GetHeight(), - source.GetDepth(), - pixelSpacing, pixelSpacing, - target.GetWidth(), target.GetHeight()); - - const unsigned int intermediateWidth = shearWarp.GetIntermediateWidth(); - const unsigned int intermediateHeight = shearWarp.GetIntermediateHeight(); - - - /** - * Step 3: Apply the "shear" part of the transform to form the - * intermediate image. The sheared images are accumulated into the - * Float32 image "accumulator". The number of samples available - * for each pixel is stored in the "counter" image. - **/ - - std::unique_ptr accumulator, counter, intermediate; - - accumulator.reset(new Orthanc::Image(Orthanc::PixelFormat_Float32, - intermediateWidth, intermediateHeight, false)); - counter.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, - intermediateWidth, intermediateHeight, false)); - intermediate.reset(new Orthanc::Image(SourceFormat, intermediateWidth, intermediateHeight, false)); - - Orthanc::ImageProcessing::Set(*accumulator, 0); - Orthanc::ImageProcessing::Set(*counter, 0); - - // Loop around the slices of the volume - for (unsigned int i = 0; i <= countSlices; i++) - { - // (3.a) Compute the shear for this specific slice - unsigned int z = static_cast( - boost::math::iround(static_cast(i) / - static_cast(countSlices) * - static_cast(source.GetDepth() - 1))); - - double a11, b1, a22, b2, vz; - shearWarp.ComputeShearOnSlice(a11, b1, a22, b2, vz, static_cast(z) + 0.5); - - - { - // (3.b) Detect the "useful" portion of the intermediate image - // for this slice (i.e. the bounding box where the source - // slice is mapped to by the shear), so as to update "counter" - Matrix a = LinearAlgebra::ZeroMatrix(3, 3); - a(0,0) = a11; - a(0,2) = b1; - a(1,1) = a22; - a(1,2) = b2; - a(2,2) = 1; - - unsigned int x1, y1, x2, y2; - if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, - source.GetWidth(), source.GetHeight(), - intermediateWidth, intermediateHeight)) - { - for (unsigned int y = y1; y <= y2; y++) - { - uint16_t* p = reinterpret_cast(counter->GetRow(y)) + x1; - for (unsigned int x = x1; x <= x2; x++, p++) - { - if (MIP) - { - // TODO - In the case of MIP, "counter" could be - // reduced to "PixelFormat_Grayscale8" to reduce - // memory usage - *p = 1; - } - else - { - *p += 1; - } - } - } - } - } - - - { - // (3.c) Shear the source slice into a temporary image - ImageBuffer3D::SliceReader reader(source, VolumeProjection_Axial, z); - ApplyAffineTransform(*intermediate, reader.GetAccessor(), - a11, 0, b1, - 0, a22, b2, - shearInterpolation, true); - } - - - for (unsigned int y = 0; y < intermediateHeight; y++) - { - // (3.d) Accumulate the pixels of the sheared image into "accumulator" - const typename SourceTraits::PixelType* p = - reinterpret_cast(intermediate->GetConstRow(y)); - - float* q = reinterpret_cast(accumulator->GetRow(y)); - - for (unsigned int x = 0; x < intermediateWidth; x++) - { - float pixel = SourceTraits::PixelToFloat(*p); - - if (MIP) - { - // Get maximum for MIP - if (*q < pixel) - { - *q = pixel; - } - } - else - { - *q += pixel; - } - - p++; - q++; - } - } - } - - - /** - * Step 4: The intermediate image (that will be transformed by the - * "warp") is now available as an accumulator image together with - * a counter image. "Flatten" these two images into one. - **/ - - intermediate.reset(new Orthanc::Image - (TargetFormat, intermediateWidth, intermediateHeight, false)); - - maxValue = 0; - - for (unsigned int y = 0; y < intermediateHeight; y++) - { - const float *qacc = reinterpret_cast(accumulator->GetConstRow(y)); - const uint16_t *qcount = reinterpret_cast(counter->GetConstRow(y)); - typename TargetTraits::PixelType *p = - reinterpret_cast(intermediate->GetRow(y)); - - for (unsigned int x = 0; x < intermediateWidth; x++) - { - if (*qcount == 0) - { - TargetTraits::SetZero(*p); - } - else - { - *p = static_cast - (*qacc / static_cast(*qcount)); - - if (*p > maxValue) - { - maxValue = *p; - } - } - - p++; - qacc++; - qcount++; - } - } - - // We don't need the accumulator images anymore - accumulator.reset(NULL); - counter.reset(NULL); - - - /** - * Step 6: Apply the "warp" part of the transform to map the - * intermediate image to the final image. - **/ - - Matrix warp; - - { - // (5.a) Compute the "warp" matrix by removing the 3rd row and - // 3rd column from the GetWarp() matrix - // Check out: ../../Resources/Computations/ComputeWarp.py - - Matrix fullWarp = LinearAlgebra::Product - (shearWarp.GetIntrinsicParameters(), shearWarp.GetWarp()); - - const double v[] = { - fullWarp(0,0), fullWarp(0,1), fullWarp(0,3), - fullWarp(1,0), fullWarp(1,1), fullWarp(1,3), - fullWarp(2,0), fullWarp(2,1), fullWarp(2,3) - }; - - LinearAlgebra::FillMatrix(warp, 3, 3, v); - } - - // (5.b) Apply the projective transform to the image - ApplyProjectiveTransform(target, *intermediate, warp, warpInterpolation, true); - } - - - template - static void ApplyAxialInternal2(Orthanc::ImageAccessor& target, - float& maxValue, - const Matrix& M_view, - const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - bool mip, - double pixelSpacing, - unsigned int countSlices, - ImageInterpolation shearInterpolation, - ImageInterpolation warpInterpolation) - { - if (mip) - { - ApplyAxialInternal - (target, maxValue, M_view, source, geometry, pixelSpacing, - countSlices, shearInterpolation, warpInterpolation); - } - else - { - ApplyAxialInternal - (target, maxValue, M_view, source, geometry, pixelSpacing, - countSlices, shearInterpolation, warpInterpolation); - } - } - - - Orthanc::ImageAccessor* - ShearWarpProjectiveTransform::ApplyAxial(float& maxValue, - const Matrix& M_view, - const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - Orthanc::PixelFormat targetFormat, - unsigned int targetWidth, - unsigned int targetHeight, - bool mip, - double pixelSpacing, - unsigned int countSlices, - ImageInterpolation shearInterpolation, - ImageInterpolation warpInterpolation) - { - std::unique_ptr target - (new Orthanc::Image(targetFormat, targetWidth, targetHeight, false)); - - if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && - targetFormat == Orthanc::PixelFormat_Grayscale16) - { - ApplyAxialInternal2 - (*target, maxValue, M_view, source, geometry, mip, pixelSpacing, - countSlices, shearInterpolation, warpInterpolation); - } - else if (source.GetFormat() == Orthanc::PixelFormat_SignedGrayscale16 && - targetFormat == Orthanc::PixelFormat_SignedGrayscale16) - { - ApplyAxialInternal2 - (*target, maxValue, M_view, source, geometry, mip, pixelSpacing, - countSlices, shearInterpolation, warpInterpolation); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - return target.release(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/ShearWarpProjectiveTransform.h --- a/Framework/Toolbox/ShearWarpProjectiveTransform.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "FiniteProjectiveCamera.h" - -namespace OrthancStone -{ - class ShearWarpProjectiveTransform : public boost::noncopyable - { - private: - Matrix k_; - Matrix M_shear; - Matrix M_warp; - Vector eye_o; - unsigned int intermediateWidth_; - unsigned int intermediateHeight_; - - public: - ShearWarpProjectiveTransform(const Matrix& M_view, - //const Matrix& P, // Permutation applied to the volume - unsigned int volumeWidth, - unsigned int volumeHeight, - unsigned int volumeDepth, - double pixelSpacingX, - double pixelSpacingY, - unsigned int imageWidth, - unsigned int imageHeight); - - const Matrix& GetIntrinsicParameters() const - { - return k_; - } - - const Matrix& GetShear() const - { - return M_shear; - } - - const Matrix& GetWarp() const - { - return M_warp; - } - - const Vector& GetCameraCenter() const - { - return eye_o; - } - - unsigned int GetIntermediateWidth() const - { - return intermediateWidth_; - } - - unsigned int GetIntermediateHeight() const - { - return intermediateHeight_; - } - - FiniteProjectiveCamera *CreateCamera() const; - - void ComputeShearOnSlice(double& a11, - double& b1, - double& a22, - double& b2, - double& shearedZ, - const double sourceZ); - - static Matrix CalibrateView(const Vector& camera, - const Vector& principalPoint, - double angle); - - static Orthanc::ImageAccessor* ApplyAxial(float& maxValue, - const Matrix& M_view, // cf. "CalibrateView()" - const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - Orthanc::PixelFormat targetFormat, - unsigned int targetWidth, - unsigned int targetHeight, - bool mip, - double pixelSpacing, - unsigned int countSlices, - ImageInterpolation shearInterpolation, - ImageInterpolation warpInterpolation); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SlicesSorter.cpp --- a/Framework/Toolbox/SlicesSorter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SlicesSorter.h" - -#include "GeometryToolbox.h" - -#include - -namespace OrthancStone -{ - class SlicesSorter::SliceWithDepth : public boost::noncopyable - { - private: - CoordinateSystem3D geometry_; - double depth_; - - std::unique_ptr payload_; - - public: - SliceWithDepth(const CoordinateSystem3D& geometry, - Orthanc::IDynamicObject* payload) : - geometry_(geometry), - depth_(0), - payload_(payload) - { - } - - void SetNormal(const Vector& normal) - { - depth_ = boost::numeric::ublas::inner_prod(geometry_.GetOrigin(), normal); - } - - double GetDepth() const - { - return depth_; - } - - const CoordinateSystem3D& GetGeometry() const - { - return geometry_; - } - - bool HasPayload() const - { - return (payload_.get() != NULL); - } - - const Orthanc::IDynamicObject& GetPayload() const - { - if (HasPayload()) - { - return *payload_; - } - else - { - LOG(ERROR) << "SlicesSorter::SliceWithDepth::GetPayload(): (!HasPayload())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - }; - - - struct SlicesSorter::Comparator - { - bool operator() (const SliceWithDepth* const& a, - const SliceWithDepth* const& b) const - { - return a->GetDepth() < b->GetDepth(); - } - }; - - - SlicesSorter::~SlicesSorter() - { - for (size_t i = 0; i < slices_.size(); i++) - { - assert(slices_[i] != NULL); - delete slices_[i]; - } - } - - - void SlicesSorter::AddSlice(const CoordinateSystem3D& slice, - Orthanc::IDynamicObject* payload) - { - slices_.push_back(new SliceWithDepth(slice, payload)); - } - - - const SlicesSorter::SliceWithDepth& SlicesSorter::GetSlice(size_t i) const - { - if (i >= slices_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(slices_[i] != NULL); - return *slices_[i]; - } - } - - - const CoordinateSystem3D& SlicesSorter::GetSliceGeometry(size_t i) const - { - return GetSlice(i).GetGeometry(); - } - - - bool SlicesSorter::HasSlicePayload(size_t i) const - { - return GetSlice(i).HasPayload(); - } - - - const Orthanc::IDynamicObject& SlicesSorter::GetSlicePayload(size_t i) const - { - return GetSlice(i).GetPayload(); - } - - - void SlicesSorter::SetNormal(const Vector& normal) - { - for (size_t i = 0; i < slices_.size(); i++) - { - slices_[i]->SetNormal(normal); - } - - hasNormal_ = true; - } - - - void SlicesSorter::SortInternal() - { - if (!hasNormal_) - { - LOG(ERROR) << "SlicesSorter::SortInternal(): (!hasNormal_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - Comparator comparator; - std::sort(slices_.begin(), slices_.end(), comparator); - } - - - void SlicesSorter::FilterNormal(const Vector& normal) - { - size_t pos = 0; - - for (size_t i = 0; i < slices_.size(); i++) - { - if (GeometryToolbox::IsParallel(normal, slices_[i]->GetGeometry().GetNormal())) - { - // This slice is compatible with the selected normal - slices_[pos] = slices_[i]; - pos += 1; - } - else - { - delete slices_[i]; - slices_[i] = NULL; - } - } - - slices_.resize(pos); - } - - - bool SlicesSorter::SelectNormal(Vector& normal) const - { - std::vector normalCandidates; - std::vector normalCount; - - bool found = false; - - for (size_t i = 0; !found && i < GetSlicesCount(); i++) - { - const Vector& normal = GetSlice(i).GetGeometry().GetNormal(); - - bool add = true; - for (size_t j = 0; add && j < normalCandidates.size(); j++) // (*) - { - if (GeometryToolbox::IsParallel(normal, normalCandidates[j])) - { - normalCount[j] += 1; - add = false; - } - } - - if (add) - { - if (normalCount.size() > 2) - { - // To get linear-time complexity in (*). This heuristics - // allows the series to have one single frame that is - // not parallel to the others (such a frame could be a - // generated preview) - found = false; - } - else - { - normalCandidates.push_back(normal); - normalCount.push_back(1); - } - } - } - - for (size_t i = 0; !found && i < normalCandidates.size(); i++) - { - unsigned int count = normalCount[i]; - if (count == GetSlicesCount() || - count + 1 == GetSlicesCount()) - { - normal = normalCandidates[i]; - found = true; - } - } - - return found; - } - - - bool SlicesSorter::Sort() - { - if (GetSlicesCount() > 0) - { - Vector normal; - if (SelectNormal(normal)) - { - FilterNormal(normal); - SetNormal(normal); - SortInternal(); - return true; - } - } - - return false; - } - - - bool SlicesSorter::LookupClosestSlice(size_t& index, - double& distance, - const CoordinateSystem3D& slice) const - { - // TODO Turn this linear-time lookup into a log-time lookup, - // keeping track of whether the slices are sorted along the normal - - bool found = false; - - distance = std::numeric_limits::infinity(); - - for (size_t i = 0; i < slices_.size(); i++) - { - assert(slices_[i] != NULL); - - double tmp; - if (CoordinateSystem3D::ComputeDistance(tmp, slices_[i]->GetGeometry(), slice)) - { - if (!found || - tmp < distance) - { - index = i; - distance = tmp; - found = true; - } - } - } - - return found; - } - - - bool SlicesSorter::ComputeSpacingBetweenSlices(double& spacing /* out */) const - { - if (GetSlicesCount() <= 1) - { - // This is a volume that is empty or that contains one single - // slice: Choose a dummy z-dimension for voxels - spacing = 1.0; - return true; - } - - const OrthancStone::CoordinateSystem3D& reference = GetSliceGeometry(0); - - double referencePosition = reference.ProjectAlongNormal(reference.GetOrigin()); - - double p = reference.ProjectAlongNormal(GetSliceGeometry(1).GetOrigin()); - spacing = p - referencePosition; - - if (spacing <= 0) - { - LOG(ERROR) << "SlicesSorter::ComputeSpacingBetweenSlices(): (spacing <= 0)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Please call the Sort() method before"); - } - - for (size_t i = 1; i < GetSlicesCount(); i++) - { - OrthancStone::Vector p = reference.GetOrigin() + spacing * static_cast(i) * reference.GetNormal(); - double d = boost::numeric::ublas::norm_2(p - GetSliceGeometry(i).GetOrigin()); - - if (!OrthancStone::LinearAlgebra::IsNear(d, 0, 0.001 /* tolerance expressed in mm */)) - { - return false; - } - } - - return true; - } - - - bool SlicesSorter::AreAllSlicesDistinct() const - { - if (GetSlicesCount() <= 1) - { - return true; - } - else - { - const OrthancStone::CoordinateSystem3D& reference = GetSliceGeometry(0); - double previousPosition = reference.ProjectAlongNormal(GetSliceGeometry(0).GetOrigin()); - - for (size_t i = 1; i < GetSlicesCount(); i++) - { - double position = reference.ProjectAlongNormal(GetSliceGeometry(i).GetOrigin()); - - if (OrthancStone::LinearAlgebra::IsNear(position, previousPosition, 0.001 /* tolerance expressed in mm */)) - { - return false; - } - - previousPosition = position; - } - - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SlicesSorter.h --- a/Framework/Toolbox/SlicesSorter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CoordinateSystem3D.h" - -#include - -namespace OrthancStone -{ - // TODO - Rename this as "PlanesSorter" - class SlicesSorter : public boost::noncopyable - { - private: - class SliceWithDepth; - struct Comparator; - - typedef std::vector Slices; - - Slices slices_; - bool hasNormal_; - - const SliceWithDepth& GetSlice(size_t i) const; - - void SetNormal(const Vector& normal); - - void SortInternal(); - - void FilterNormal(const Vector& normal); - - bool SelectNormal(Vector& normal) const; - - public: - SlicesSorter() : hasNormal_(false) - { - } - - ~SlicesSorter(); - - void Reserve(size_t count) - { - slices_.reserve(count); - } - - void AddSlice(const CoordinateSystem3D& plane) - { - AddSlice(plane, NULL); - } - - void AddSlice(const CoordinateSystem3D& plane, - Orthanc::IDynamicObject* payload); // Takes ownership - - size_t GetSlicesCount() const - { - return slices_.size(); - } - - const CoordinateSystem3D& GetSliceGeometry(size_t i) const; - - bool HasSlicePayload(size_t i) const; - - const Orthanc::IDynamicObject& GetSlicePayload(size_t i) const; - - // WARNING - Apply the sorting algorithm can reduce the number of - // slices. This is notably the case if all the slices are not - // parallel to the reference normal that will be selected. - bool Sort(); - - // TODO - Remove this - bool LookupClosestSlice(size_t& index, - double& distance, - const CoordinateSystem3D& slice) const; - - // WARNING - The slices must have been sorted before calling this method - bool ComputeSpacingBetweenSlices(double& spacing /* out */) const; - - // WARNING - The slices must have been sorted before calling this method - bool AreAllSlicesDistinct() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SortedFrames.cpp --- a/Framework/Toolbox/SortedFrames.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,405 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SortedFrames.h" - -#include "GeometryToolbox.h" - -#include -#include - -namespace OrthancStone -{ - SortedFrames::Instance::Instance(const Orthanc::DicomMap& tags) - { - tags_.Assign(tags); - - if (!tags.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - uint32_t tmp; - if (tags.ParseUnsignedInteger32(tmp, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) - { - numberOfFrames_ = tmp; - } - else - { - numberOfFrames_ = 1; - } - - std::string photometric; - if (tags.LookupStringValue(photometric, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, false)) - { - Orthanc::Toolbox::StripSpaces(photometric); - monochrome1_ = (photometric == "MONOCHROME1"); - } - else - { - monochrome1_ = false; - } - - hasPosition_ = ( - LinearAlgebra::ParseVector(position_, tags, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT) && - position_.size() == 3 && - GeometryToolbox::ComputeNormal(normal_, tags)); - } - - - const Vector& SortedFrames::Instance::GetNormal() const - { - if (hasPosition_) - { - return normal_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Vector& SortedFrames::Instance::GetPosition() const - { - if (hasPosition_) - { - return position_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - SortedFrames::Frame::Frame(const Instance& instance, - unsigned int frameIndex) : - instance_(&instance), - frameIndex_(frameIndex) - { - if (frameIndex >= instance.GetNumberOfFrames()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - const SortedFrames::Instance& SortedFrames::GetInstance(size_t index) const - { - if (index >= instances_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - assert(instances_[index] != NULL); - return *instances_[index]; - } - } - - - const SortedFrames::Frame& SortedFrames::GetFrame(size_t index) const - { - if (!sorted_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Sort() has not been called"); - } - if (index >= frames_.size()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - return frames_[index]; - } - } - - - void SortedFrames::Clear() - { - for (size_t i = 0; i < instances_.size(); i++) - { - assert(instances_[i] != NULL); - delete instances_[i]; - } - - studyInstanceUid_.clear(); - seriesInstanceUid_.clear(); - frames_.clear(); - sorted_ = true; - } - - - void SortedFrames::AddInstance(const Orthanc::DicomMap& tags) - { - std::unique_ptr instance(new Instance(tags)); - - std::string studyInstanceUid, seriesInstanceUid; - if (!tags.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || - !tags.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (instances_.empty()) - { - studyInstanceUid_ = studyInstanceUid; - seriesInstanceUid_ = seriesInstanceUid; - } - else - { - if (studyInstanceUid_ != studyInstanceUid || - seriesInstanceUid_ != seriesInstanceUid) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, - "Mixing instances from different series"); - } - } - - instances_.push_back(instance.release()); - sorted_ = false; - frames_.clear(); - } - - - void SortedFrames::AddFramesOfInstance(std::set& remainingInstances, - size_t index) - { - assert(instances_[index] != NULL); - const Instance& instance = *instances_[index]; - - for (unsigned int i = 0; i < instance.GetNumberOfFrames(); i++) - { - frames_.push_back(Frame(instance, i)); - } - - assert(remainingInstances.find(index) != remainingInstances.end()); - remainingInstances.erase(index); - } - - - namespace - { - template - class SortableItem - { - private: - T value_; - size_t instance_; - std::string sopInstanceUid_; - - public: - SortableItem(const T& value, - size_t instance, - const std::string& sopInstanceUid) : - value_(value), - instance_(instance), - sopInstanceUid_(sopInstanceUid) - { - } - - size_t GetInstanceIndex() const - { - return instance_; - } - - bool operator< (const SortableItem& other) const - { - return (value_ < other.value_ || - (value_ == other.value_ && - sopInstanceUid_ < other.sopInstanceUid_)); - } - }; - } - - - void SortedFrames::SortUsingIntegerTag(std::set& remainingInstances, - const Orthanc::DicomTag& tag) - { - std::vector< SortableItem > items; - items.reserve(remainingInstances.size()); - - for (std::set::const_iterator it = remainingInstances.begin(); - it != remainingInstances.end(); ++it) - { - assert(instances_[*it] != NULL); - const Instance& instance = *instances_[*it]; - - int32_t value; - std::string sopInstanceUid; - if (instance.GetTags().ParseInteger32(value, tag) && - instance.GetTags().LookupStringValue( - sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - items.push_back(SortableItem(value, *it, sopInstanceUid)); - } - } - - std::sort(items.begin(), items.end()); - - for (size_t i = 0; i < items.size(); i++) - { - AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); - } - } - - - void SortedFrames::SortUsingSopInstanceUid(std::set& remainingInstances) - { - std::vector > items; - items.reserve(remainingInstances.size()); - - for (std::set::const_iterator it = remainingInstances.begin(); - it != remainingInstances.end(); ++it) - { - assert(instances_[*it] != NULL); - const Instance& instance = *instances_[*it]; - - std::string sopInstanceUid; - if (instance.GetTags().LookupStringValue( - sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - items.push_back(SortableItem(0 /* arbitrary value */, *it, sopInstanceUid)); - } - } - - std::sort(items.begin(), items.end()); - - for (size_t i = 0; i < items.size(); i++) - { - AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); - } - } - - - void SortedFrames::SortUsing3DLocation(std::set& remainingInstances) - { - /** - * Compute the mean of the normal vectors, using the recursive - * formula for arithmetic means for numerical stability. - * https://diego.assencio.com/?index=c34d06f4f4de2375658ed41f70177d59 - **/ - - Vector meanNormal; - LinearAlgebra::AssignVector(meanNormal, 0, 0, 0); - - unsigned int n = 0; - - for (std::set::const_iterator it = remainingInstances.begin(); - it != remainingInstances.end(); ++it) - { - assert(instances_[*it] != NULL); - const Instance& instance = *instances_[*it]; - - if (instance.HasPosition()) - { - n += 1; - meanNormal += (instance.GetNormal() - meanNormal) / static_cast(n); - } - } - - std::vector > items; - items.reserve(n); - - for (std::set::const_iterator it = remainingInstances.begin(); - it != remainingInstances.end(); ++it) - { - assert(instances_[*it] != NULL); - const Instance& instance = *instances_[*it]; - - std::string sopInstanceUid; - if (instance.HasPosition() && - instance.GetTags().LookupStringValue( - sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - double p = LinearAlgebra::DotProduct(meanNormal, instance.GetPosition()); - items.push_back(SortableItem(p, *it, sopInstanceUid)); - } - } - - assert(items.size() <= n); - - std::sort(items.begin(), items.end()); - - for (size_t i = 0; i < items.size(); i++) - { - AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); - } - } - - - size_t SortedFrames::GetFramesCount() const - { - if (sorted_) - { - return frames_.size(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Sort() has not been called"); - } - } - - - void SortedFrames::Sort() - { - if (!sorted_) - { - size_t totalFrames = 0; - std::set remainingInstances; - - for (size_t i = 0; i < instances_.size(); i++) - { - assert(instances_[i] != NULL); - totalFrames += instances_[i]->GetNumberOfFrames(); - - remainingInstances.insert(i); - } - - frames_.clear(); - frames_.reserve(totalFrames); - - SortUsingIntegerTag(remainingInstances, Orthanc::DICOM_TAG_INSTANCE_NUMBER); // VR is "IS" - SortUsingIntegerTag(remainingInstances, Orthanc::DICOM_TAG_IMAGE_INDEX); // VR is "US" - SortUsing3DLocation(remainingInstances); - SortUsingSopInstanceUid(remainingInstances); - - // The following could in theory happen if several instances - // have the same SOPInstanceUID, no ordering is available - for (std::set::const_iterator it = remainingInstances.begin(); - it != remainingInstances.end(); it++) - { - AddFramesOfInstance(remainingInstances, *it); - } - - if (frames_.size() != totalFrames || - !remainingInstances.empty()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - sorted_ = true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SortedFrames.h --- a/Framework/Toolbox/SortedFrames.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "LinearAlgebra.h" - -namespace OrthancStone -{ - class SortedFrames : public boost::noncopyable - { - private: - class Instance : public boost::noncopyable - { - private: - bool hasPosition_; - Orthanc::DicomMap tags_; - std::string sopInstanceUid_; - unsigned int numberOfFrames_; - Vector normal_; // Only used in "Sort()" - Vector position_; // Only used in "Sort()" - bool monochrome1_; - - public: - Instance(const Orthanc::DicomMap& tags); - - const Orthanc::DicomMap& GetTags() const - { - return tags_; - } - - const std::string& GetSopInstanceUid() const - { - return sopInstanceUid_; - } - - unsigned int GetNumberOfFrames() const - { - return numberOfFrames_; - } - - bool HasPosition() const - { - return hasPosition_; - } - - const Vector& GetNormal() const; - - const Vector& GetPosition() const; - - bool IsMonochrome1() const - { - return monochrome1_; - } - }; - - struct Frame - { - private: - const Instance* instance_; - unsigned int frameIndex_; - - public: - Frame(const Instance& instance, - unsigned int frameIndex); - - const Instance& GetInstance() const - { - return *instance_; - } - - unsigned int GetFrameIndex() const - { - return frameIndex_; - } - }; - - std::string studyInstanceUid_; - std::string seriesInstanceUid_; - std::vector instances_; - std::vector frames_; - bool sorted_; - - const Instance& GetInstance(size_t index) const; - - const Frame& GetFrame(size_t index) const; - - void AddFramesOfInstance(std::set& remainingInstances, - size_t index); - - void SortUsingIntegerTag(std::set& remainingInstances, - const Orthanc::DicomTag& tag); - - void SortUsingSopInstanceUid(std::set& remainingInstances); - - void SortUsing3DLocation(std::set& remainingInstances); - - public: - SortedFrames() : - sorted_(true) - { - } - - ~SortedFrames() - { - Clear(); - } - - void Clear(); - - const std::string& GetStudyInstanceUid() const - { - return studyInstanceUid_; - } - - const std::string& GetSeriesInstanceUid() const - { - return seriesInstanceUid_; - } - - void AddInstance(const Orthanc::DicomMap& tags); - - size_t GetInstancesCount() const - { - return instances_.size(); - } - - const Orthanc::DicomMap& GetInstanceTags(size_t index) const - { - return GetInstance(index).GetTags(); - } - - const std::string& GetSopInstanceUid(size_t index) const - { - return GetInstance(index).GetSopInstanceUid(); - } - - bool IsSorted() const - { - return sorted_; - } - - size_t GetFramesCount() const; - - const Orthanc::DicomMap& GetFrameTags(size_t index) const - { - return GetFrame(index).GetInstance().GetTags(); - } - - const std::string& GetFrameSopInstanceUid(size_t index) const - { - return GetFrame(index).GetInstance().GetSopInstanceUid(); - } - - unsigned int GetFrameSiblingsCount(size_t index) const - { - return GetFrame(index).GetInstance().GetNumberOfFrames(); - } - - unsigned int GetFrameIndex(size_t index) const - { - return GetFrame(index).GetFrameIndex(); - } - - bool IsFrameMonochrome1(size_t index) const - { - return GetFrame(index).GetInstance().IsMonochrome1(); - } - - void Sort(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SubpixelReader.h --- a/Framework/Toolbox/SubpixelReader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,260 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "GeometryToolbox.h" - -#include - -#include -#include - -namespace OrthancStone -{ - namespace Internals - { - class SubpixelReaderBase : public boost::noncopyable - { - private: - const Orthanc::ImageAccessor& source_; - unsigned int width_; - unsigned int height_; - - public: - SubpixelReaderBase(const Orthanc::ImageAccessor& source) : - source_(source), - width_(source.GetWidth()), - height_(source.GetHeight()) - { - } - - ORTHANC_FORCE_INLINE - const Orthanc::ImageAccessor& GetSource() const - { - return source_; - } - - ORTHANC_FORCE_INLINE - unsigned int GetWidth() const - { - return width_; - } - - ORTHANC_FORCE_INLINE - unsigned int GetHeight() const - { - return height_; - } - }; - } - - - template - class SubpixelReader; - - - template - class SubpixelReader : - public Internals::SubpixelReaderBase - { - public: - typedef Orthanc::PixelTraits Traits; - typedef typename Traits::PixelType PixelType; - - SubpixelReader(const Orthanc::ImageAccessor& source) : - SubpixelReaderBase(source) - { - } - - inline bool GetValue(PixelType& target, - float x, - float y) const; - - inline bool GetFloatValue(float& target, - float x, - float y) const; - }; - - - - template - class SubpixelReader : - public Internals::SubpixelReaderBase - { - public: - typedef Orthanc::PixelTraits Traits; - typedef typename Traits::PixelType PixelType; - - SubpixelReader(const Orthanc::ImageAccessor& source) : - SubpixelReaderBase(source) - { - } - - inline bool GetFloatValue(float& target, - float x, - float y) const; - - inline bool GetValue(PixelType& target, - float x, - float y) const; - }; - - - - template - bool SubpixelReader::GetValue(PixelType& target, - float x, - float y) const - { - if (x < 0 || - y < 0) - { - return false; - } - else - { - unsigned int ux = static_cast(std::floor(x)); - unsigned int uy = static_cast(std::floor(y)); - - if (ux < GetWidth() && - uy < GetHeight()) - { - Orthanc::ImageTraits::GetPixel(target, GetSource(), ux, uy); - return true; - } - else - { - return false; - } - } - } - - - - template - bool SubpixelReader::GetFloatValue(float& target, - float x, - float y) const - { - PixelType value; - - if (GetValue(value, x, y)) - { - target = Traits::PixelToFloat(value); - return true; - } - else - { - return false; - } - } - - - - template - bool SubpixelReader::GetValue(PixelType& target, - float x, - float y) const - { - float value; - - if (GetFloatValue(value, x, y)) - { - Traits::FloatToPixel(target, value); - return true; - } - else - { - return false; - } - } - - - - template - bool SubpixelReader::GetFloatValue(float& target, - float x, - float y) const - { - x -= 0.5f; - y -= 0.5f; - - if (x < 0 || - y < 0) - { - return false; - } - else - { - unsigned int ux = static_cast(std::floor(x)); - unsigned int uy = static_cast(std::floor(y)); - - float f00, f01, f10, f11; - - if (ux < GetWidth() && - uy < GetHeight()) - { - f00 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, uy); - } - else - { - return false; - } - - if (ux + 1 < GetWidth()) - { - f01 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, uy); - } - else - { - f01 = f00; - } - - if (uy + 1 < GetHeight()) - { - f10 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, uy + 1); - } - else - { - f10 = f00; - } - - if (ux + 1 < GetWidth() && - uy + 1 < GetHeight()) - { - f11 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, uy + 1); - } - else - { - f11 = f00; - } - - float ax = x - static_cast(ux); - float ay = y - static_cast(uy); - target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare(ax, ay, f00, f01, f10, f11); - - return true; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/SubvoxelReader.h --- a/Framework/Toolbox/SubvoxelReader.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,470 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Volumes/ImageBuffer3D.h" -#include "GeometryToolbox.h" - -#include - -#include -#include - -namespace OrthancStone -{ - namespace Internals - { - /* - WARNING : the slice order is different between this class and ImageBuffer3D - - See the comment above ImageBuffer3D declaration. - - The slices are supposed to be stored in INCREASING z-order in this class! - */ - class SubvoxelReaderBase : public boost::noncopyable - { - private: - const ImageBuffer3D& source_; - unsigned int width_; - unsigned int height_; - unsigned int depth_; - - public: - SubvoxelReaderBase(const ImageBuffer3D& source) : - source_(source), - width_(source.GetWidth()), - height_(source.GetHeight()), - depth_(source.GetDepth()) - { - } - - ORTHANC_FORCE_INLINE - const Orthanc::ImageAccessor& GetSource() const - { - return source_.GetInternalImage(); - } - - ORTHANC_FORCE_INLINE - unsigned int GetWidth() const - { - return width_; - } - - ORTHANC_FORCE_INLINE - unsigned int GetHeight() const - { - return height_; - } - - ORTHANC_FORCE_INLINE - unsigned int GetDepth() const - { - return depth_; - } - - ORTHANC_FORCE_INLINE - unsigned int ComputeRow(unsigned int y, - unsigned int z) const - { - return z * height_ + y; - } - }; - } - - - /* - WARNING : the slice order is different between this class and ImageBuffer3D - - See the comment above ImageBuffer3D declaration. - - The slices are supposed to be stored in INCREASING z-order in this class! - */ - template - class SubvoxelReader; - - - /* - WARNING : the slice order is different between this class and ImageBuffer3D - - See the comment above ImageBuffer3D declaration. - - The slices are supposed to be stored in INCREASING z-order in this class! - */ - template - class SubvoxelReader : - public Internals::SubvoxelReaderBase - { - public: - typedef Orthanc::PixelTraits Traits; - typedef typename Traits::PixelType PixelType; - - SubvoxelReader(const ImageBuffer3D& source) : - SubvoxelReaderBase(source) - { - } - - inline bool GetValue(PixelType& target, - float x, - float y, - float z) const; - - inline bool GetFloatValue(float& target, - float x, - float y, - float z) const; - }; - - - /* - WARNING : the slice order is different between this class and ImageBuffer3D - - See the comment above ImageBuffer3D declaration. - - The slices are supposed to be stored in INCREASING z-order in this class! - */ - template - class SubvoxelReader : - public Internals::SubvoxelReaderBase - { - public: - typedef Orthanc::PixelTraits Traits; - typedef typename Traits::PixelType PixelType; - - SubvoxelReader(const ImageBuffer3D& source) : - SubvoxelReaderBase(source) - { - } - - inline bool Sample(float& f00, - float& f01, - float& f10, - float& f11, - unsigned int ux, - unsigned int uy, - unsigned int uz) const; - - inline bool GetValue(PixelType& target, - float x, - float y, - float z) const; - - inline bool GetFloatValue(float& target, - float x, - float y, - float z) const; - }; - - - /* - WARNING : the slice order is different between this class and ImageBuffer3D - - See the comment above ImageBuffer3D declaration. - - The slices are supposed to be stored in INCREASING z-order in this class! - */ - template - class SubvoxelReader : - public Internals::SubvoxelReaderBase - { - private: - SubvoxelReader bilinear_; - - public: - typedef Orthanc::PixelTraits Traits; - typedef typename Traits::PixelType PixelType; - - SubvoxelReader(const ImageBuffer3D& source) : - SubvoxelReaderBase(source), - bilinear_(source) - { - } - - inline bool GetValue(PixelType& target, - float x, - float y, - float z) const; - - inline bool GetFloatValue(float& target, - float x, - float y, - float z) const; - }; - - - /* - See important comment above - */ - - template - bool SubvoxelReader::GetValue(PixelType& target, - float x, - float y, - float z) const - { - if (x < 0 || - y < 0 || - z < 0) - { - return false; - } - else - { - unsigned int ux = static_cast(std::floor(x)); - unsigned int uy = static_cast(std::floor(y)); - unsigned int uz = static_cast(std::floor(z)); - - if (ux < GetWidth() && - uy < GetHeight() && - uz < GetDepth()) - { - Orthanc::ImageTraits::GetPixel(target, GetSource(), ux, ComputeRow(uy, uz)); - return true; - } - else - { - return false; - } - } - } - - - template - bool SubvoxelReader::GetFloatValue(float& target, - float x, - float y, - float z) const - { - PixelType value; - - if (GetValue(value, x, y, z)) - { - target = Traits::PixelToFloat(value); - return true; - } - else - { - return false; - } - } - - - /* - See important comment above - */ - - template - bool SubvoxelReader::Sample(float& f00, - float& f01, - float& f10, - float& f11, - unsigned int ux, - unsigned int uy, - unsigned int uz) const - { - if (ux < GetWidth() && - uy < GetHeight() && - uz < GetDepth()) - { - f00 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, ComputeRow(uy, uz)); - } - else - { - // Pixel is out of the volume - return false; - } - - if (ux + 1 < GetWidth()) - { - f01 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, ComputeRow(uy, uz)); - } - else - { - f01 = f00; - } - - if (uy + 1 < GetHeight()) - { - f10 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, ComputeRow(uy + 1, uz)); - } - else - { - f10 = f00; - } - - if (ux + 1 < GetWidth() && - uy + 1 < GetHeight()) - { - f11 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, ComputeRow(uy + 1, uz)); - } - else - { - f11 = f00; - } - - return true; - } - - - /* - See important comment above - */ - - template - bool SubvoxelReader::GetFloatValue(float& target, - float x, - float y, - float z) const - { - x -= 0.5f; - y -= 0.5f; - - if (x < 0 || - y < 0 || - z < 0) - { - return false; - } - else - { - unsigned int ux = static_cast(std::floor(x)); - unsigned int uy = static_cast(std::floor(y)); - unsigned int uz = static_cast(std::floor(z)); - - float f00, f01, f10, f11; - if (Sample(f00, f01, f10, f11, ux, uy, uz)) - { - float ax = x - static_cast(ux); - float ay = y - static_cast(uy); - - target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare(ax, ay, f00, f01, f10, f11); - return true; - } - else - { - return false; - } - } - } - - - /* - See important comment above - */ - - template - bool SubvoxelReader::GetValue(PixelType& target, - float x, - float y, - float z) const - { - float value; - - if (GetFloatValue(value, x, y, z)) - { - Traits::FloatToPixel(target, value); - return true; - } - else - { - return false; - } - } - - - - template - bool SubvoxelReader::GetFloatValue(float& target, - float x, - float y, - float z) const - { - x -= 0.5f; - y -= 0.5f; - z -= 0.5f; - - if (x < 0 || - y < 0 || - z < 0) - { - return false; - } - else - { - unsigned int ux = static_cast(std::floor(x)); - unsigned int uy = static_cast(std::floor(y)); - unsigned int uz = static_cast(std::floor(z)); - - float f000, f001, f010, f011; - if (bilinear_.Sample(f000, f001, f010, f011, ux, uy, uz)) - { - const float ax = x - static_cast(ux); - const float ay = y - static_cast(uy); - - float f100, f101, f110, f111; - - if (bilinear_.Sample(f100, f101, f110, f111, ux, uy, uz + 1)) - { - const float az = z - static_cast(uz); - target = GeometryToolbox::ComputeTrilinearInterpolationUnitSquare - (ax, ay, az, f000, f001, f010, f011, f100, f101, f110, f111); - } - else - { - target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare - (ax, ay, f000, f001, f010, f011); - } - - return true; - } - else - { - return false; - } - } - } - - - /* - See important comment above - */ - - - template - bool SubvoxelReader::GetValue(PixelType& target, - float x, - float y, - float z) const - { - float value; - - if (GetFloatValue(value, x, y, z)) - { - Traits::FloatToPixel(target, value); - return true; - } - else - { - return false; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/TextRenderer.cpp --- a/Framework/Toolbox/TextRenderer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "TextRenderer.h" - -#include "../Scene2D/CairoCompositor.h" -#include "../Scene2D/ColorTextureSceneLayer.h" -#include "../Scene2D/FloatTextureSceneLayer.h" -#include "../Scene2D/TextSceneLayer.h" -#include "../Fonts/GlyphBitmapAlphabet.h" -#include "../Fonts/FontRenderer.h" - -#include -#include -#include -#include - -namespace OrthancStone -{ - Orthanc::ImageAccessor* TextRenderer::Render(const std::string& ttf, - unsigned int fontSize, - const std::string& utf8String) - { - FontRenderer renderer; - renderer.LoadFont(ttf, fontSize); - - // add each char to be rendered to the alphabet - std::unique_ptr alphabet(new GlyphBitmapAlphabet); - - size_t posInString = 0; - uint32_t unicode; - size_t utf8CharLength; - - while (posInString < utf8String.size()) - { - Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, utf8CharLength, utf8String, posInString); - alphabet->AddUnicodeCharacter(renderer, unicode); - posInString += utf8CharLength; - } - - - std::unique_ptr renderedText(alphabet->RenderText(utf8String)); - - // add a blank line on top of the text (to improve bilinear filtering of the topmost line) - std::unique_ptr renderedTextExtended(new Orthanc::Image(renderedText->GetFormat(), renderedText->GetWidth(), renderedText->GetHeight() + 1, true)); - - Orthanc::ImageAccessor textRegion; - Orthanc::ImageAccessor firstLineRegion; - - renderedTextExtended->GetRegion(firstLineRegion, 0, 0, renderedText->GetWidth(), 1); - Orthanc::ImageProcessing::Set(firstLineRegion, 0); - - renderedTextExtended->GetRegion(textRegion, 0, 1, renderedText->GetWidth(), renderedText->GetHeight()); - Orthanc::ImageProcessing::Copy(textRegion, *renderedText); - - return renderedTextExtended.release(); - } - - - Orthanc::ImageAccessor* TextRenderer::RenderWithAlpha(const std::string& ttf, - unsigned int fontSize, - const std::string& utf8String, - uint8_t foreground) - { - std::unique_ptr renderedText8(Render(ttf, fontSize, utf8String)); - std::unique_ptr target(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, renderedText8->GetWidth(), renderedText8->GetHeight(), true)); - - Orthanc::ImageProcessing::Set(*target, foreground, foreground, foreground, *renderedText8); - return target.release(); - } - - - // currently disabled because the background is actually not transparent once we use the Cairo Compositor ! - // - // // renders text in color + a border with alpha in a RGBA32 image - // Orthanc::ImageAccessor* TextRenderer::RenderWithAlpha(const std::string& ttf, - // unsigned int fontSize, - // const std::string& utf8String, - // uint8_t foreground, - // uint8_t borderColor) - // { - // std::unique_ptr renderedBorderAlpha(RenderWithAlpha(ttf, fontSize, utf8String, borderColor)); - // std::unique_ptr renderedTextAlpha(RenderWithAlpha(ttf, fontSize, utf8String, foreground)); - - // unsigned int textWidth = renderedBorderAlpha->GetWidth(); - // unsigned int textHeight = renderedBorderAlpha->GetHeight(); - - // Scene2D targetScene; - // std::unique_ptr borderLayerLeft(new ColorTextureSceneLayer(*renderedBorderAlpha)); - // std::unique_ptr borderLayerRight(new ColorTextureSceneLayer(*renderedBorderAlpha)); - // std::unique_ptr borderLayerTop(new ColorTextureSceneLayer(*renderedBorderAlpha)); - // std::unique_ptr borderLayerBottom(new ColorTextureSceneLayer(*renderedBorderAlpha)); - // std::unique_ptr textLayerCenter(new ColorTextureSceneLayer(*renderedTextAlpha)); - - // borderLayerLeft->SetOrigin(0, 1); - // borderLayerRight->SetOrigin(2, 1); - // borderLayerTop->SetOrigin(1, 0); - // borderLayerBottom->SetOrigin(1, 2); - // textLayerCenter->SetOrigin(1, 1); - // targetScene.SetLayer(1, borderLayerLeft.release()); - // targetScene.SetLayer(2, borderLayerRight.release()); - // targetScene.SetLayer(3, borderLayerTop.release()); - // targetScene.SetLayer(4, borderLayerBottom.release()); - // targetScene.SetLayer(5, textLayerCenter.release()); - - // targetScene.FitContent(textWidth + 2, textHeight + 2); - // CairoCompositor compositor(targetScene, textWidth + 2, textHeight + 2); - // compositor.Refresh(); - - // Orthanc::ImageAccessor canvas; - // compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - // std::unique_ptr output(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, canvas.GetWidth(), canvas.GetHeight(), false)); - // Orthanc::ImageProcessing::Convert(*output, canvas); - // return output.release(); - // } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/TextRenderer.h --- a/Framework/Toolbox/TextRenderer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - // Helpers methods to render text in bitmaps. - // Compared to the GlyphBitmapAlphabet::RenderText, these methods do not need a - // code page. - class TextRenderer : public boost::noncopyable - { - public: - // simply renders text in GrayScale8 with a black background and a white text - static Orthanc::ImageAccessor* Render(const std::string& ttf, - unsigned int fontSize, - const std::string& utf8String); - - // renders text in "color" with alpha in a RGBA32 image - static Orthanc::ImageAccessor* RenderWithAlpha(const std::string& ttf, - unsigned int fontSize, - const std::string& utf8String, - uint8_t foreground); - - // // renders text in color + a border with alpha in a RGBA32 image - // static Orthanc::ImageAccessor* RenderWithAlpha(const std::string& ttf, - // unsigned int fontSize, - // const std::string& utf8String, - // uint8_t foreground, - // uint8_t borderColor); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/UndoRedoStack.cpp --- a/Framework/Toolbox/UndoRedoStack.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "UndoRedoStack.h" - -#include - -#include - -namespace OrthancStone -{ - void UndoRedoStack::Clear(UndoRedoStack::Stack::iterator from) - { - for (Stack::iterator it = from; it != stack_.end(); ++it) - { - assert(*it != NULL); - delete *it; - } - - stack_.erase(from, stack_.end()); - } - - - UndoRedoStack::UndoRedoStack() : - current_(stack_.end()) - { - } - - - UndoRedoStack::~UndoRedoStack() - { - Clear(stack_.begin()); - } - - - void UndoRedoStack::Add(ICommand* command) - { - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - Clear(current_); - - stack_.push_back(command); - current_ = stack_.end(); - } - - - void UndoRedoStack::Undo() - { - if (current_ != stack_.begin()) - { - --current_; - - assert(*current_ != NULL); - (*current_)->Undo(); - } - } - - void UndoRedoStack::Redo() - { - if (current_ != stack_.end()) - { - assert(*current_ != NULL); - (*current_)->Redo(); - - ++current_; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Toolbox/UndoRedoStack.h --- a/Framework/Toolbox/UndoRedoStack.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - - -namespace OrthancStone -{ - class UndoRedoStack : public boost::noncopyable - { - public: - class ICommand : public boost::noncopyable - { - public: - virtual ~ICommand() - { - } - - virtual void Undo() const = 0; - - virtual void Redo() const = 0; - }; - - private: - typedef std::list Stack; - - Stack stack_; - Stack::iterator current_; - - void Clear(Stack::iterator from); - - public: - UndoRedoStack(); - - ~UndoRedoStack(); - - void Add(ICommand* command); - - void Undo(); - - void Redo(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/IViewport.h --- a/Framework/Viewport/IViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../Scene2D/ICompositor.h" -#include "../Scene2DViewport/ViewportController.h" - -namespace OrthancStone -{ - /** - * Class that combines a Scene2D with a canvas where to draw the - * scene. A call to "Refresh()" will update the content of the - * canvas. A "IViewport" can possibly be accessed from several - * threads depending on the rendering back-end (e.g. in SDL or Qt): - * The "ILock" subclass implements the locking mechanism to modify - * the content of the scene. - * - * NB: The lock must be a "recursive_mutex", as the viewport - * controller can lock it a second time (TODO - Why so?). - **/ - class IViewport : public boost::noncopyable - { - public: - class ILock : public boost::noncopyable - { - public: - virtual ~ILock() - { - } - - virtual bool HasCompositor() const = 0; - - /** - Do not store the result! Only access the compositor interface through - the lock. - */ - virtual ICompositor& GetCompositor() = 0; - - /** - Do not store the result! Only access the compositor interface through - the lock. - */ - virtual ViewportController& GetController() = 0; - - virtual void Invalidate() = 0; - }; - - virtual ~IViewport() - { - } - - virtual ILock* Lock() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/SdlViewport.cpp --- a/Framework/Viewport/SdlViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,230 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "SdlViewport.h" - -#include - -#include - -namespace OrthancStone -{ - ICompositor& SdlViewport::SdlLock::GetCompositor() - { - if (that_.compositor_.get() == NULL) - { - // The derived class should have called "AcquireCompositor()" - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - return *that_.compositor_; - } - } - - - void SdlViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) - { - if (compositor == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - compositor_.reset(compositor); - } - - SdlViewport::SdlViewport() - { - refreshEvent_ = SDL_RegisterEvents(1); - - if (refreshEvent_ == static_cast(-1)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - void SdlViewport::PostConstructor() - { - controller_ = boost::make_shared(shared_from_this()); - } - - void SdlViewport::SendRefreshEvent() - { - SDL_Event event; - SDL_memset(&event, 0, sizeof(event)); - event.type = refreshEvent_; - SDL_PushEvent(&event); // This function is thread-safe, and can be called from other threads safely. - } - - - SdlOpenGLViewport::SdlOpenGLViewport(const std::string& title, - unsigned int width, - unsigned int height, - bool allowDpiScaling) : - context_(title.c_str(), width, height, allowDpiScaling) - { - AcquireCompositor(new OpenGLCompositor(context_)); // (*) - } - - boost::shared_ptr SdlOpenGLViewport::Create( - const std::string& title, - unsigned int width, - unsigned int height, - bool allowDpiScaling) - { - boost::shared_ptr that = - boost::shared_ptr(new SdlOpenGLViewport(title, width, height, allowDpiScaling)); - that->SdlViewport::PostConstructor(); - return that; - } - - uint32_t SdlOpenGLViewport::GetSdlWindowId() - { - SdlWindow& sdlWindowWrapper = context_.GetWindow(); - SDL_Window* sdlWindow = sdlWindowWrapper.GetObject(); - Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); - return sdlWindowId; - } - - SdlOpenGLViewport::~SdlOpenGLViewport() - { - // Make sure that the "OpenGLCompositor" is destroyed BEFORE the - // "OpenGLContext" it references (*) - ClearCompositor(); - } - - - void SdlOpenGLViewport::Paint() - { - SdlLock lock(*this); - lock.GetCompositor().Refresh(lock.GetController().GetScene()); - } - - - void SdlOpenGLViewport::UpdateSize(unsigned int width, unsigned int height) - { - // nothing to do in OpenGL, the OpenGLCompositor::UpdateSize will be called automatically - SdlLock lock(*this); - lock.Invalidate(); - } - - - void SdlOpenGLViewport::ToggleMaximize() - { - // No need to call "Invalidate()" here, as "UpdateSize()" will - // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" - SdlLock lock(*this); - context_.ToggleMaximize(); - } - - - - SdlCairoViewport::SdlCairoViewport(const char* title, - unsigned int width, - unsigned int height, - bool allowDpiScaling) : - window_(title, width, height, false /* enable OpenGL */, allowDpiScaling), - sdlSurface_(NULL) - { - AcquireCompositor(new CairoCompositor(width, height)); - } - - SdlCairoViewport::~SdlCairoViewport() - { - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - } - - uint32_t SdlCairoViewport::GetSdlWindowId() - { - SDL_Window* sdlWindow = window_.GetObject(); - Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); - return sdlWindowId; - } - - void SdlCairoViewport::Paint() - { - SdlLock lock(*this); - - lock.GetCompositor().Refresh(lock.GetController().GetScene()); - CreateSdlSurfaceFromCompositor(dynamic_cast(lock.GetCompositor())); - - if (sdlSurface_ != NULL) - { - window_.Render(sdlSurface_); - } - } - - - void SdlCairoViewport::UpdateSize(unsigned int width, - unsigned int height) - { - SdlLock lock(*this); - dynamic_cast(lock.GetCompositor()).UpdateSize(width, height); - lock.Invalidate(); - } - - - void SdlCairoViewport::ToggleMaximize() - { - // No need to call "Invalidate()" here, as "UpdateSize()" will - // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" - SdlLock lock(*this); - window_.ToggleMaximize(); - } - - - // Assumes that the mutex is locked - void SdlCairoViewport::CreateSdlSurfaceFromCompositor(CairoCompositor& compositor) - { - static const uint32_t rmask = 0x00ff0000; - static const uint32_t gmask = 0x0000ff00; - static const uint32_t bmask = 0x000000ff; - - const unsigned int width = compositor.GetCanvas().GetWidth(); - const unsigned int height = compositor.GetCanvas().GetHeight(); - - if (sdlSurface_ != NULL) - { - if (sdlSurface_->pixels == compositor.GetCanvas().GetBuffer() && - sdlSurface_->w == static_cast(width) && - sdlSurface_->h == static_cast(height) && - sdlSurface_->pitch == static_cast(compositor.GetCanvas().GetPitch())) - { - // The image from the compositor has not changed, no need to update the surface - return; - } - else - { - SDL_FreeSurface(sdlSurface_); - } - } - - sdlSurface_ = SDL_CreateRGBSurfaceFrom((void*)(compositor.GetCanvas().GetBuffer()), width, height, 32, - compositor.GetCanvas().GetPitch(), rmask, gmask, bmask, 0); - if (!sdlSurface_) - { - LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/SdlViewport.h --- a/Framework/Viewport/SdlViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,195 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#if !defined(ORTHANC_ENABLE_SDL) -# error Macro ORTHANC_ENABLE_SDL must be defined -#endif - -#if ORTHANC_ENABLE_SDL != 1 -# error SDL must be enabled to use this file -#endif - -#if !defined(ORTHANC_ENABLE_OPENGL) -# error The macro ORTHANC_ENABLE_OPENGL must be defined -#endif - -#if ORTHANC_ENABLE_OPENGL != 1 -# error Support for OpenGL is disabled -#endif - -#include "../OpenGL/SdlOpenGLContext.h" -#include "../Scene2D/OpenGLCompositor.h" -#include "../Scene2D/CairoCompositor.h" -#include "IViewport.h" - -#include - -// TODO: required for UndoStack injection -// I don't like it either :) -#include - -#include - -namespace OrthancStone -{ - class UndoStack; - - class SdlViewport : public IViewport, - public boost::enable_shared_from_this - { - private: - boost::recursive_mutex mutex_; - uint32_t refreshEvent_; - boost::shared_ptr controller_; - std::unique_ptr compositor_; - - void SendRefreshEvent(); - - protected: - class SdlLock : public ILock - { - private: - SdlViewport& that_; - boost::recursive_mutex::scoped_lock lock_; - - public: - SdlLock(SdlViewport& that) : - that_(that), - lock_(that.mutex_) - { - } - - virtual bool HasCompositor() const ORTHANC_OVERRIDE - { - return true; - } - - virtual ICompositor& GetCompositor() ORTHANC_OVERRIDE; - - virtual ViewportController& GetController() ORTHANC_OVERRIDE - { - return *that_.controller_; - } - - virtual void Invalidate() ORTHANC_OVERRIDE - { - that_.SendRefreshEvent(); - } - }; - - void ClearCompositor() - { - compositor_.reset(); - } - - void AcquireCompositor(ICompositor* compositor /* takes ownership */); - - protected: - SdlViewport(); - void PostConstructor(); - - public: - - bool IsRefreshEvent(const SDL_Event& event) const - { - return (event.type == refreshEvent_); - } - - virtual ILock* Lock() ORTHANC_OVERRIDE - { - return new SdlLock(*this); - } - - virtual uint32_t GetSdlWindowId() = 0; - - virtual void UpdateSize(unsigned int width, - unsigned int height) = 0; - - virtual void ToggleMaximize() = 0; - - // Must be invoked from the main SDL thread - virtual void Paint() = 0; - }; - - - class SdlOpenGLViewport : public SdlViewport - { - private: - SdlOpenGLContext context_; - - private: - SdlOpenGLViewport(const std::string& title, - unsigned int width, - unsigned int height, - bool allowDpiScaling = true); - public: - static boost::shared_ptr Create(const std::string&, - unsigned int width, - unsigned int height, - bool allowDpiScaling = true); - - - virtual ~SdlOpenGLViewport(); - - virtual uint32_t GetSdlWindowId() ORTHANC_OVERRIDE; - - virtual void Paint() ORTHANC_OVERRIDE; - - virtual void UpdateSize(unsigned int width, - unsigned int height) ORTHANC_OVERRIDE; - - virtual void ToggleMaximize() ORTHANC_OVERRIDE; - }; - - - class SdlCairoViewport : public SdlViewport - { - private: - SdlWindow window_; - SDL_Surface* sdlSurface_; - - void CreateSdlSurfaceFromCompositor(CairoCompositor& compositor); - - private: - SdlCairoViewport(const char* title, - unsigned int width, - unsigned int height, - bool allowDpiScaling = true); - public: - static boost::shared_ptr Create(const char* title, - unsigned int width, - unsigned int height, - bool allowDpiScaling = true); - - - virtual ~SdlCairoViewport(); - - virtual uint32_t GetSdlWindowId() ORTHANC_OVERRIDE; - - virtual void Paint() ORTHANC_OVERRIDE; - - virtual void UpdateSize(unsigned int width, - unsigned int height) ORTHANC_OVERRIDE; - - virtual void ToggleMaximize() ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/SdlWindow.cpp --- a/Framework/Viewport/SdlWindow.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlWindow.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#include -#include - -#ifdef WIN32 -#include // for SetProcessDpiAware -#endif -// WIN32 - -#include -#include -#include - -namespace OrthancStone -{ - SdlWindow::SdlWindow(const char* title, - unsigned int width, - unsigned int height, - bool enableOpenGl, - bool allowDpiScaling) : - maximized_(false) - { - // TODO Understand why, with SDL_WINDOW_OPENGL + MinGW32 + Release - // build mode, the application crashes whenever the SDL window is - // resized or maximized - - uint32_t windowFlags, rendererFlags; - if (enableOpenGl) - { - windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; - rendererFlags = SDL_RENDERER_ACCELERATED; - } - else - { - windowFlags = SDL_WINDOW_RESIZABLE; - rendererFlags = SDL_RENDERER_SOFTWARE; - } - -// TODO: probably required on MacOS X, too -#if defined(WIN32) && (_WIN32_WINNT >= 0x0600) - if (!allowDpiScaling) - { - // if we do NOT allow DPI scaling, it means an SDL pixel will be a real - // monitor pixel. This is needed for high-DPI applications - - // Enable high-DPI support on Windows - - // THE FOLLOWING HAS BEEN COMMENTED OUT BECAUSE IT WILL CRASH UNDER - // OLD WINDOWS VERSIONS - // ADD THIS AT THE TOP TO ENABLE IT: - // - //#pragma comment(lib, "Shcore.lib") THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness - //#include - //#include THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness - //#include THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness - // SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); - - // This is supported on Vista+ - SetProcessDPIAware(); - - windowFlags |= SDL_WINDOW_ALLOW_HIGHDPI; - } -#endif -// WIN32 - - window_ = SDL_CreateWindow(title, - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - width, height, windowFlags); - - if (window_ == NULL) - { - LOG(ERROR) << "Cannot create the SDL window: " << SDL_GetError(); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - renderer_ = SDL_CreateRenderer(window_, -1, rendererFlags); - if (!renderer_) - { - LOG(ERROR) << "Cannot create the SDL renderer: " << SDL_GetError(); - SDL_DestroyWindow(window_); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - SdlWindow::~SdlWindow() - { - if (renderer_ != NULL) - { - SDL_DestroyRenderer(renderer_); - } - - if (window_ != NULL) - { - SDL_DestroyWindow(window_); - } - } - - - unsigned int SdlWindow::GetWidth() const - { - int w = -1; - SDL_GetWindowSize(window_, &w, NULL); - - if (w < 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - return static_cast(w); - } - } - - - unsigned int SdlWindow::GetHeight() const - { - int h = -1; - SDL_GetWindowSize(window_, NULL, &h); - - if (h < 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - else - { - return static_cast(h); - } - } - - - void SdlWindow::Render(SDL_Surface* surface) - { - /** - * "You are strongly encouraged to call SDL_RenderClear() to - * initialize the backbuffer before starting each new frame's - * drawing, even if you plan to overwrite every pixel." - * https://wiki.libsdl.org/SDL_RenderPresent - **/ - SDL_SetRenderDrawColor(renderer_, 0, 0, 0, 255); - SDL_RenderClear(renderer_); // Clear the entire screen to our selected color - - SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer_, surface); - if (texture != NULL) - { - SDL_RenderCopy(renderer_, texture, NULL, NULL); - SDL_DestroyTexture(texture); - } - - SDL_RenderPresent(renderer_); - } - - - void SdlWindow::ToggleMaximize() - { - if (maximized_) - { - SDL_RestoreWindow(window_); - maximized_ = false; - } - else - { - SDL_MaximizeWindow(window_); - maximized_ = true; - } - } - - - void SdlWindow::GlobalInitialize() - { - if (SDL_Init(SDL_INIT_VIDEO) != 0) - { - LOG(ERROR) << "Cannot initialize SDL"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - void SdlWindow::GlobalFinalize() - { - SDL_Quit(); - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/SdlWindow.h --- a/Framework/Viewport/SdlWindow.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include - -// Forward declaration of SDL type to avoid clashes with DCMTK headers -// on "typedef Sint8", in "StoneInitialization.cpp" -struct SDL_Window; -struct SDL_Renderer; -struct SDL_Surface; - -namespace OrthancStone -{ - class SdlWindow : public boost::noncopyable - { - private: - struct SDL_Window *window_; - struct SDL_Renderer *renderer_; - bool maximized_; - - public: - SdlWindow(const char* title, - unsigned int width, - unsigned int height, - bool enableOpenGl, - bool allowDpiScaling = true); - - ~SdlWindow(); - - SDL_Window *GetObject() const - { - return window_; - } - - unsigned int GetWidth() const; - - unsigned int GetHeight() const; - - /** - * WARNING: "Refresh()" cannot only be called from the main SDL - * thread, in which the window was created. Otherwise, the - * renderer displays nothing! - **/ - void Render(struct SDL_Surface* surface); - - void ToggleMaximize(); - - static void GlobalInitialize(); - - static void GlobalFinalize(); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebAssemblyCairoViewport.cpp --- a/Framework/Viewport/WebAssemblyCairoViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebAssemblyCairoViewport.h" - -#include "../Scene2D/CairoCompositor.h" - -#include - -#include - -namespace OrthancStone -{ - void WebAssemblyCairoViewport::GetCanvasSize(unsigned int& width, - unsigned int& height) - { - double w, h; - emscripten_get_element_css_size(GetCanvasCssSelector().c_str(), &w, &h); - - /** - * Emscripten has the function emscripten_get_element_css_size() - * to query the width and height of a named HTML element. I'm - * calling this first to get the initial size of the canvas DOM - * element, and then call emscripten_set_canvas_size() to - * initialize the framebuffer size of the canvas to the same - * size as its DOM element. - * https://floooh.github.io/2017/02/22/emsc-html.html - **/ - if (w > 0 && - h > 0) - { - width = static_cast(boost::math::iround(w)); - height = static_cast(boost::math::iround(h)); - } - else - { - width = 0; - height = 0; - } - } - - - void WebAssemblyCairoViewport::Paint(ICompositor& compositor, - ViewportController& controller) - { - compositor.Refresh(controller.GetScene()); - - // Create a temporary memory buffer for the canvas in JavaScript - Orthanc::ImageAccessor cairo; - dynamic_cast(compositor).GetCanvas().GetReadOnlyAccessor(cairo); - - const unsigned int width = cairo.GetWidth(); - const unsigned int height = cairo.GetHeight(); - - if (javascript_.get() == NULL || - javascript_->GetWidth() != width || - javascript_->GetHeight() != height) - { - javascript_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, width, height, - true /* force minimal pitch */)); - } - - // Convert from BGRA32 memory layout (only color mode supported - // by Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 - // (as expected by HTML5 canvas). This simply amounts to - // swapping the B and R channels. Alpha channel is also set to - // full opacity (255). - uint8_t* q = reinterpret_cast(javascript_->GetBuffer()); - for (unsigned int y = 0; y < height; y++) - { - const uint8_t* p = reinterpret_cast(cairo.GetConstRow(y)); - for (unsigned int x = 0; x < width; x++) - { - q[0] = p[2]; // R - q[1] = p[1]; // G - q[2] = p[0]; // B - q[3] = 255; // A - - p += 4; - q += 4; - } - } - - // Execute JavaScript commands to blit the image buffer onto the - // 2D drawing context of the HTML5 canvas - EM_ASM({ - const data = new Uint8ClampedArray(Module.HEAP8.buffer, $1, 4 * $2 * $3); - const img = new ImageData(data, $2, $3); - const ctx = document.getElementById(UTF8ToString($0)).getContext('2d'); - ctx.putImageData(img, 0, 0); - }, - GetCanvasId().c_str(), // $0 - javascript_->GetBuffer(), // $1 - javascript_->GetWidth(), // $2 - javascript_->GetHeight()); // $3 - } - - - void WebAssemblyCairoViewport::UpdateSize(ICompositor& compositor) - { - unsigned int width, height; - GetCanvasSize(width, height); - emscripten_set_canvas_element_size(GetCanvasCssSelector().c_str(), width, height); - - dynamic_cast(compositor).UpdateSize(width, height); - } - - - WebAssemblyCairoViewport::WebAssemblyCairoViewport( - const std::string& canvasId) : - WebAssemblyViewport(canvasId) - { - unsigned int width, height; - GetCanvasSize(width, height); - emscripten_set_canvas_element_size(GetCanvasCssSelector().c_str(), - width, - height); - - AcquireCompositor(new CairoCompositor(width, height)); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebAssemblyCairoViewport.h --- a/Framework/Viewport/WebAssemblyCairoViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebAssemblyViewport.h" - -namespace OrthancStone -{ - class WebAssemblyCairoViewport : public WebAssemblyViewport - { - private: - std::unique_ptr javascript_; - - void GetCanvasSize(unsigned int& width, - unsigned int& height); - - protected: - virtual void Paint(ICompositor& compositor, - ViewportController& controller) ORTHANC_OVERRIDE; - - virtual void UpdateSize(ICompositor& compositor) ORTHANC_OVERRIDE; - - public: - WebAssemblyCairoViewport(const std::string& canvasId); - - virtual ~WebAssemblyCairoViewport() - { - ClearCompositor(); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebAssemblyViewport.cpp --- a/Framework/Viewport/WebAssemblyViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,339 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebAssemblyViewport.h" - -#include "../Toolbox/GenericToolbox.h" - -#include - -#include -#include - -namespace OrthancStone -{ - static void ConvertMouseEvent(PointerEvent& target, - const EmscriptenMouseEvent& source, - const ICompositor& compositor) - { - int x = static_cast(source.targetX); - int y = static_cast(source.targetY); - - switch (source.button) - { - case 0: - target.SetMouseButton(MouseButton_Left); - break; - - case 1: - target.SetMouseButton(MouseButton_Middle); - break; - - case 2: - target.SetMouseButton(MouseButton_Right); - break; - - default: - target.SetMouseButton(MouseButton_None); - break; - } - - target.AddPosition(compositor.GetPixelCenterCoordinates(x, y)); - target.SetAltModifier(source.altKey); - target.SetControlModifier(source.ctrlKey); - target.SetShiftModifier(source.shiftKey); - } - - - class WebAssemblyViewport::WasmLock : public ILock - { - private: - WebAssemblyViewport& that_; - - public: - WasmLock(WebAssemblyViewport& that) : - that_(that) - { - } - - virtual bool HasCompositor() const ORTHANC_OVERRIDE - { - return that_.compositor_.get() != NULL; - } - - virtual ICompositor& GetCompositor() ORTHANC_OVERRIDE - { - if (that_.compositor_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return *that_.compositor_; - } - } - - virtual ViewportController& GetController() ORTHANC_OVERRIDE - { - assert(that_.controller_); - return *that_.controller_; - } - - virtual void Invalidate() ORTHANC_OVERRIDE - { - that_.Invalidate(); - } - }; - - - EM_BOOL WebAssemblyViewport::OnRequestAnimationFrame(double time, void *userData) - { - LOG(TRACE) << __func__; - WebAssemblyViewport* that = reinterpret_cast(userData); - - if (that->compositor_.get() != NULL && - that->controller_ /* should always be true */) - { - that->Paint(*that->compositor_, *that->controller_); - } - - LOG(TRACE) << "Exiting: " << __func__; - return true; - } - - EM_BOOL WebAssemblyViewport::OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) - { - LOG(TRACE) << __func__; - WebAssemblyViewport* that = reinterpret_cast(userData); - - if (that->compositor_.get() != NULL) - { - that->UpdateSize(*that->compositor_); - that->Invalidate(); - } - - LOG(TRACE) << "Exiting: " << __func__; - return true; - } - - - EM_BOOL WebAssemblyViewport::OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) - { - WebAssemblyViewport* that = reinterpret_cast(userData); - - LOG(TRACE) << "mouse down: " << that->GetCanvasCssSelector(); - - if (that->compositor_.get() != NULL && - that->interactor_.get() != NULL) - { - PointerEvent pointer; - ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); - - that->controller_->HandleMousePress(*that->interactor_, pointer, - that->compositor_->GetCanvasWidth(), - that->compositor_->GetCanvasHeight()); - that->Invalidate(); - } - - LOG(TRACE) << "Exiting: " << __func__; - return true; - } - - - EM_BOOL WebAssemblyViewport::OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) - { - WebAssemblyViewport* that = reinterpret_cast(userData); - - if (that->compositor_.get() != NULL && - that->controller_->HasActiveTracker()) - { - PointerEvent pointer; - ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); - if (that->controller_->HandleMouseMove(pointer)) - { - that->Invalidate(); - } - } - - LOG(TRACE) << "Exiting: " << __func__; - return true; - } - - EM_BOOL WebAssemblyViewport::OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) - { - LOG(TRACE) << __func__; - WebAssemblyViewport* that = reinterpret_cast(userData); - - if (that->compositor_.get() != NULL) - { - PointerEvent pointer; - ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); - that->controller_->HandleMouseRelease(pointer); - that->Invalidate(); - } - - LOG(TRACE) << "Exiting: " << __func__; - return true; - } - - void WebAssemblyViewport::Invalidate() - { - emscripten_request_animation_frame(OnRequestAnimationFrame, reinterpret_cast(this)); - } - - void WebAssemblyViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) - { - if (compositor == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - compositor_.reset(compositor); - } - } - -#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 -// everything OK..... we're using the new setting -#else -#pragma message("WARNING: DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR is not defined or equal to 0. Stone will use the OLD Emscripten rules for DOM element selection.") -#endif - - WebAssemblyViewport::WebAssemblyViewport( - const std::string& canvasId, bool enableEmscriptenMouseEvents) : - canvasId_(canvasId), -#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 - canvasCssSelector_("#" + canvasId), -#else - canvasCssSelector_(canvasId), -#endif - interactor_(new DefaultViewportInteractor), - enableEmscriptenMouseEvents_(enableEmscriptenMouseEvents) - { - } - - void WebAssemblyViewport::PostConstructor() - { - boost::shared_ptr viewport = shared_from_this(); - controller_.reset(new ViewportController(viewport)); - - LOG(INFO) << "Initializing Stone viewport on HTML canvas: " - << canvasId_; - - if (canvasId_.empty() || - canvasId_[0] == '#') - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, - "The canvas identifier must not start with '#'"); - } - - // Disable right-click on the canvas (i.e. context menu) - EM_ASM({ - document.getElementById(UTF8ToString($0)).oncontextmenu = - function(event) - { - event.preventDefault(); - } - }, - canvasId_.c_str() // $0 - ); - - // It is not possible to monitor the resizing of individual - // canvas, so we track the full window of the browser - emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, - reinterpret_cast(this), - false, - OnResize); - - if (enableEmscriptenMouseEvents_) - { - - // if any of this function causes an error in the console, please - // make sure you are using the new (as of 1.39.x) version of - // emscripten element lookup rules( pass - // "-s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1" to the linker. - - emscripten_set_mousedown_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - OnMouseDown); - - emscripten_set_mousemove_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - OnMouseMove); - - emscripten_set_mouseup_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - OnMouseUp); - } - } - - void WebAssemblyViewport::UpdateCanvasSize() - { - UpdateSize(*compositor_); - } - - WebAssemblyViewport::~WebAssemblyViewport() - { - emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, - reinterpret_cast(this), - false, - NULL); - - if (enableEmscriptenMouseEvents_) - { - - emscripten_set_mousedown_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - NULL); - - emscripten_set_mousemove_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - NULL); - - emscripten_set_mouseup_callback(canvasCssSelector_.c_str(), - reinterpret_cast(this), - false, - NULL); - } - } - - IViewport::ILock* WebAssemblyViewport::Lock() - { - return new WasmLock(*this); - } - - void WebAssemblyViewport::AcquireInteractor(IViewportInteractor* interactor) - { - if (interactor == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - else - { - interactor_.reset(interactor); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebAssemblyViewport.h --- a/Framework/Viewport/WebAssemblyViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if !defined(ORTHANC_ENABLE_WASM) -# error Macro ORTHANC_ENABLE_WASM must be defined -#endif - -#if ORTHANC_ENABLE_WASM != 1 -# error This file can only be used if targeting WebAssembly -#endif - -#include "IViewport.h" - -#include - -#include -#include - -#include -#include - -namespace OrthancStone -{ - class WebAssemblyViewport : public IViewport, - public boost::enable_shared_from_this - - { - private: - class WasmLock; - - std::string canvasId_; - std::string canvasCssSelector_; - std::unique_ptr compositor_; - std::unique_ptr controller_; - std::unique_ptr interactor_; - bool enableEmscriptenMouseEvents_; - - static EM_BOOL OnRequestAnimationFrame(double time, void *userData); - - static EM_BOOL OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData); - - static EM_BOOL OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); - - static EM_BOOL OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); - - static EM_BOOL OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); - - protected: - void Invalidate(); - - void ClearCompositor() - { - compositor_.reset(); - } - - bool HasCompositor() const - { - return compositor_.get() != NULL; - } - - void AcquireCompositor(ICompositor* compositor /* takes ownership */); - - virtual void Paint(ICompositor& compositor, - ViewportController& controller) = 0; - - virtual void UpdateSize(ICompositor& compositor) = 0; - - /** - The second argument is temporary and should be deleted once the migration - to interactors is finished. - */ - WebAssemblyViewport(const std::string& canvasId, - bool enableEmscriptenMouseEvents = true); - - void PostConstructor(); - - public: - virtual ILock* Lock() ORTHANC_OVERRIDE; - - ~WebAssemblyViewport(); - - virtual void UpdateCanvasSize(); - - /** - This method takes ownership - */ - void AcquireInteractor(IViewportInteractor* interactor); - - const std::string& GetCanvasId() const - { - return canvasId_; - } - - /** - emscripten functions requires the css selector for the canvas. This is - different from the canvas id (the syntax is '#mycanvasid') - */ - const std::string& GetCanvasCssSelector() const - { - return canvasCssSelector_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebGLViewport.cpp --- a/Framework/Viewport/WebGLViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebGLViewport.h" - -#include "../StoneException.h" -#include "../Scene2D/OpenGLCompositor.h" - -namespace OrthancStone -{ - void WebGLViewport::Paint(ICompositor& compositor, - ViewportController& controller) - { - try - { - compositor.Refresh(controller.GetScene()); - - /** - * No need to manually swap the buffer: "Rendered WebGL content - * is implicitly presented (displayed to the user) on the canvas - * when the event handler that renders with WebGL returns back - * to the browser event loop." - * https://emscripten.org/docs/api_reference/html5.h.html#webgl-context - * - * Could call "emscripten_webgl_commit_frame()" if - * "explicitSwapControl" option were set to "true". - **/ - } - catch (const StoneException& e) - { - // Ignore problems about the loss of the WebGL context (edge case) - if (e.GetErrorCode() == ErrorCode_WebGLContextLost) - { - return; - } - else - { - throw; - } - } - } - - - WebGLViewport::WebGLViewport(const std::string& canvasId, bool enableEmscriptenMouseEvents) : - WebAssemblyViewport(canvasId,enableEmscriptenMouseEvents), - context_(GetCanvasCssSelector()) - { - AcquireCompositor(new OpenGLCompositor(context_)); - } - - boost::shared_ptr WebGLViewport::Create( - const std::string& canvasId, bool enableEmscriptenMouseEvents) - { - boost::shared_ptr that = boost::shared_ptr( - new WebGLViewport(canvasId, enableEmscriptenMouseEvents)); - - that->WebAssemblyViewport::PostConstructor(); - return that; - } - - WebGLViewport::~WebGLViewport() - { - // Make sure to delete the compositor before its parent "context_" gets - // deleted - ClearCompositor(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebGLViewport.h --- a/Framework/Viewport/WebGLViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebAssemblyViewport.h" -#include "../OpenGL/WebAssemblyOpenGLContext.h" - -namespace OrthancStone -{ - class WebGLViewport : public WebAssemblyViewport - { - private: - OpenGL::WebAssemblyOpenGLContext context_; - - WebGLViewport(const std::string& canvasId, bool enableEmscriptenMouseEvents); - - protected: - virtual void Paint(ICompositor& compositor, - ViewportController& controller) ORTHANC_OVERRIDE; - - virtual void UpdateSize(ICompositor& compositor) ORTHANC_OVERRIDE - { - context_.RefreshCanvasSize(); - } - - public: - static boost::shared_ptr Create(const std::string& canvasId, bool enableEmscriptenMouseEvents = true); - - virtual ~WebGLViewport(); - - bool IsContextLost() - { - return context_.IsContextLost(); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebGLViewportsRegistry.cpp --- a/Framework/Viewport/WebGLViewportsRegistry.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,185 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebGLViewportsRegistry.h" - -#include "../Toolbox/GenericToolbox.h" - -#include - -#include - -namespace OrthancStone -{ - void WebGLViewportsRegistry::LaunchTimer() - { - timeOutID_ = emscripten_set_timeout( - OnTimeoutCallback, - timeoutMS_, - reinterpret_cast(this)); - } - - void WebGLViewportsRegistry::OnTimeout() - { - for (Viewports::iterator it = viewports_.begin(); - it != viewports_.end(); - ++it) - { - if (it->second == NULL || - it->second->IsContextLost()) - { - LOG(INFO) << "WebGL context lost for canvas: " << it->first; - - // Try and duplicate the HTML5 canvas in the DOM - EM_ASM({ - var canvas = document.getElementById(UTF8ToString($0)); - if (canvas) { - var parent = canvas.parentElement; - if (parent) { - var cloned = canvas.cloneNode(true /* deep copy */); - parent.insertBefore(cloned, canvas); - parent.removeChild(canvas); - } - } - }, - it->first.c_str() // $0 = ID of the canvas - ); - - // At this point, the old canvas is removed from the DOM and - // replaced by a fresh one with the same ID: Recreate the - // WebGL context on the new canvas - boost::shared_ptr viewport; - - // we need to steal the properties from the old viewport - // and set them to the new viewport - { - std::unique_ptr lock(it->second->Lock()); - - // TODO: remove ViewportController - Scene2D* scene = lock->GetController().ReleaseScene(); - viewport = WebGLViewport::Create(it->first); - - { - std::unique_ptr newLock(viewport->Lock()); - newLock->GetController().AcquireScene(scene); - } - } - - // Replace the old WebGL viewport by the new one - it->second = viewport; - - // Tag the fresh canvas as needing a repaint - { - std::unique_ptr lock(it->second->Lock()); - lock->Invalidate(); - } - } - } - - LaunchTimer(); - } - - void WebGLViewportsRegistry::OnTimeoutCallback(void *userData) - { - // This object dies with the process or tab. - WebGLViewportsRegistry* that = - reinterpret_cast(userData); - that->OnTimeout(); - } - - WebGLViewportsRegistry::WebGLViewportsRegistry(double timeoutMS) : - timeoutMS_(timeoutMS), - timeOutID_(0) - { - if (timeoutMS <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - LaunchTimer(); - } - - WebGLViewportsRegistry::~WebGLViewportsRegistry() - { - emscripten_clear_timeout(timeOutID_); - Clear(); - } - - boost::shared_ptr WebGLViewportsRegistry::Add( - const std::string& canvasId) - { - if (viewports_.find(canvasId) != viewports_.end()) - { - LOG(ERROR) << "Canvas was already registered: " << canvasId; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - boost::shared_ptr viewport = - WebGLViewport::Create(canvasId); - viewports_[canvasId] = viewport; - return viewport; - } - } - - void WebGLViewportsRegistry::Remove(const std::string& canvasId) - { - Viewports::iterator found = viewports_.find(canvasId); - - if (found == viewports_.end()) - { - LOG(ERROR) << "Cannot remove unregistered canvas: " << canvasId; - } - else - { - viewports_.erase(found); - } - } - - void WebGLViewportsRegistry::Clear() - { - viewports_.clear(); - } - - WebGLViewportsRegistry::Accessor::Accessor(WebGLViewportsRegistry& that, - const std::string& canvasId) : - that_(that) - { - Viewports::iterator viewport = that.viewports_.find(canvasId); - if (viewport != that.viewports_.end() && - viewport->second != NULL) - { - lock_.reset(viewport->second->Lock()); - } - } - - IViewport::ILock& WebGLViewportsRegistry::Accessor::GetViewport() const - { - if (IsValid()) - { - return *lock_; - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Viewport/WebGLViewportsRegistry.h --- a/Framework/Viewport/WebGLViewportsRegistry.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebGLViewport.h" - -#include - -namespace OrthancStone -{ - /** - * This singleton class must be used if many WebGL viewports are - * created by the higher-level application, implying possible loss - * of WebGL contexts. The object will run an infinite update loop - * that checks whether all the WebGL context are still valid (not - * lost). If some WebGL context is lost, it is automatically - * reinitialized by created a fresh HTML5 canvas. - **/ - class WebGLViewportsRegistry : public boost::noncopyable, - public boost::enable_shared_from_this - { - private: - typedef std::map > Viewports; - - double timeoutMS_; - Viewports viewports_; - long timeOutID_; - - void LaunchTimer(); - - void OnTimeout(); - - static void OnTimeoutCallback(void *userData); - - public: - WebGLViewportsRegistry(double timeoutMS /* in milliseconds */); - - ~WebGLViewportsRegistry(); - - boost::shared_ptr Add(const std::string& canvasId); - - void Remove(const std::string& canvasId); - - void Clear(); - - class Accessor : public boost::noncopyable - { - private: - WebGLViewportsRegistry& that_; - std::unique_ptr lock_; - - public: - Accessor(WebGLViewportsRegistry& that, - const std::string& canvasId); - - bool IsValid() const - { - return lock_.get() != NULL; - } - - IViewport::ILock& GetViewport() const; - }; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomStructureSetSlicer2.cpp --- a/Framework/Volumes/DicomStructureSetSlicer2.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "DicomStructureSetSlicer2.h" - -#include "../Toolbox/GeometryToolbox.h" -#include "../Volumes/IVolumeSlicer.h" -#include "../Scene2D/PolylineSceneLayer.h" - -namespace OrthancStone -{ - DicomStructureSetSlicer2::DicomStructureSetSlicer2(boost::shared_ptr structureSet) - : structureSet_(structureSet) - {} - - IVolumeSlicer::IExtractedSlice* DicomStructureSetSlicer2::ExtractSlice(const CoordinateSystem3D& cuttingPlane) - { - // revision is always the same, hence 0 - return new DicomStructureSetSlice2(structureSet_, 0, cuttingPlane); - } - - DicomStructureSetSlice2::DicomStructureSetSlice2( - boost::weak_ptr structureSet, - uint64_t revision, - const CoordinateSystem3D& cuttingPlane) - : structureSet_(structureSet.lock()) - , isValid_(false) - { - bool opposite = false; - - if (structureSet_->GetStructuresCount() == 0) - { - isValid_ = false; - } - else - { - // some structures seen in real life have no polygons. We must be - // careful - bool found = false; - size_t curStructure = 0; - while (!found && curStructure < structureSet_->GetStructuresCount()) - { - if (structureSet_->GetStructure(curStructure).IsValid()) - { - found = true; - const Vector normal = structureSet_->GetStructure(0).GetNormal(); - isValid_ = ( - GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || - GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || - GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); - } - } - } - } - - ISceneLayer* DicomStructureSetSlice2::CreateSceneLayer( - const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane) - { - assert(isValid_); - - std::unique_ptr layer(new PolylineSceneLayer); - layer->SetThickness(2); // thickness of the on-screen line - - for (size_t i = 0; i < structureSet_->GetStructuresCount(); i++) - { - const DicomStructure2& structure = structureSet_->GetStructure(i); - if (structure.IsValid()) - { - const Color& color = structure.GetColor(); - - std::vector< std::pair > segments; - - if (structure.Project(segments, cuttingPlane)) - { - for (size_t j = 0; j < segments.size(); j++) - { - PolylineSceneLayer::Chain chain; - chain.resize(2); - - chain[0] = ScenePoint2D(segments[j].first.x, segments[j].first.y); - chain[1] = ScenePoint2D(segments[j].second.x, segments[j].second.y); - - layer->AddChain(chain, false /* NOT closed */, color); - } - } - } - } - return layer.release(); - } -} - - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomStructureSetSlicer2.h --- a/Framework/Volumes/DicomStructureSetSlicer2.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#include "../Toolbox/DicomStructureSet2.h" -#include "../Volumes/IVolumeSlicer.h" - -#include -#include - -namespace OrthancStone -{ - class DicomStructureSetSlice2 : public IVolumeSlicer::IExtractedSlice - { - public: - DicomStructureSetSlice2( - boost::weak_ptr structureSet, - uint64_t revision, - const CoordinateSystem3D& cuttingPlane); - - virtual bool IsValid() ORTHANC_OVERRIDE - { - return isValid_; - } - - virtual uint64_t GetRevision() ORTHANC_OVERRIDE - { - return revision_; - } - - virtual ISceneLayer* CreateSceneLayer( - const ILayerStyleConfigurator* configurator, // possibly absent - const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; - - private: - boost::shared_ptr structureSet_; - bool isValid_; - uint64_t revision_; - }; - - class DicomStructureSetSlicer2 : public IVolumeSlicer - { - public: - DicomStructureSetSlicer2(boost::shared_ptr structureSet); - - /** IVolumeSlicer impl */ - virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; - private: - boost::weak_ptr structureSet_; - }; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImage.cpp --- a/Framework/Volumes/DicomVolumeImage.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomVolumeImage.h" - -#include - - -namespace OrthancStone -{ - void DicomVolumeImage::CheckHasGeometry() const - { - if (!HasGeometry()) - { - LOG(ERROR) << "DicomVolumeImage::CheckHasGeometry(): (!HasGeometry())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void DicomVolumeImage::Initialize( - const VolumeImageGeometry& geometry, - Orthanc::PixelFormat format, - bool computeRange) - { - geometry_.reset(new VolumeImageGeometry(geometry)); - image_.reset(new ImageBuffer3D(format, geometry_->GetWidth(), geometry_->GetHeight(), - geometry_->GetDepth(), computeRange)); - - revision_ ++; - } - - - void DicomVolumeImage::SetDicomParameters(const DicomInstanceParameters& parameters) - { - parameters_.reset(parameters.Clone()); - revision_ ++; - } - - - bool DicomVolumeImage::HasGeometry() const - { - return (geometry_.get() != NULL && - image_.get() != NULL); - } - - - ImageBuffer3D& DicomVolumeImage::GetPixelData() - { - CheckHasGeometry(); - return *image_; - } - - - const ImageBuffer3D& DicomVolumeImage::GetPixelData() const - { - CheckHasGeometry(); - return *image_; - } - - - const VolumeImageGeometry& DicomVolumeImage::GetGeometry() const - { - CheckHasGeometry(); - return *geometry_; - } - - - const DicomInstanceParameters& DicomVolumeImage::GetDicomParameters() const - { - if (HasDicomParameters()) - { - return *parameters_; - } - else - { - LOG(ERROR) << "DicomVolumeImage::GetDicomParameters(): (!HasDicomParameters())"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImage.h --- a/Framework/Volumes/DicomVolumeImage.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Messages/IMessage.h" -#include "../Toolbox/DicomInstanceParameters.h" -#include "ImageBuffer3D.h" -#include "VolumeImageGeometry.h" - -namespace OrthancStone -{ - /** - This class combines a 3D image buffer, a 3D volume geometry and - information about the DICOM parameters of the series. - (MPR means MultiPlanar Reconstruction) - */ - class DicomVolumeImage : public boost::noncopyable - { - public: - // TODO - Are these messages still useful? - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, DicomVolumeImage); - ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentUpdatedMessage, DicomVolumeImage); - - private: - uint64_t revision_; - std::unique_ptr geometry_; - std::unique_ptr image_; - std::unique_ptr parameters_; - - void CheckHasGeometry() const; - - public: - DicomVolumeImage() : - revision_(0) - { - } - - void IncrementRevision() - { - revision_ ++; - } - - void Initialize(const VolumeImageGeometry& geometry, - Orthanc::PixelFormat format, - bool computeRange = false); - - // Used by volume slicers - void SetDicomParameters(const DicomInstanceParameters& parameters); - - uint64_t GetRevision() const - { - return revision_; - } - - bool HasGeometry() const; - - ImageBuffer3D& GetPixelData(); - - const ImageBuffer3D& GetPixelData() const; - - const VolumeImageGeometry& GetGeometry() const; - - bool HasDicomParameters() const - { - return parameters_.get() != NULL; - } - - const DicomInstanceParameters& GetDicomParameters() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImageMPRSlicer.cpp --- a/Framework/Volumes/DicomVolumeImageMPRSlicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomVolumeImageMPRSlicer.h" - -#include "../StoneException.h" - -#include "../Toolbox/ImageToolbox.h" - -#include -//#include -#include - -namespace OrthancStone -{ - void DicomVolumeImageMPRSlicer::Slice::CheckValid() const - { - if (!valid_) - { - LOG(ERROR) << "DicomVolumeImageMPRSlicer::Slice::CheckValid(): (!valid_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - DicomVolumeImageMPRSlicer::Slice::Slice(const DicomVolumeImage& volume, - const CoordinateSystem3D& cuttingPlane) : - volume_(volume), - revision_(volume_.GetRevision()) - { - valid_ = (volume_.HasDicomParameters() && - volume_.GetGeometry().DetectSlice(projection_, sliceIndex_, cuttingPlane)); - } - - - VolumeProjection DicomVolumeImageMPRSlicer::Slice::GetProjection() const - { - CheckValid(); - return projection_; - } - - - unsigned int DicomVolumeImageMPRSlicer::Slice::GetSliceIndex() const - { - CheckValid(); - return sliceIndex_; - } - - - ISceneLayer* DicomVolumeImageMPRSlicer::Slice::CreateSceneLayer(const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane) - { - CheckValid(); - - if (configurator == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer, - "A style configurator is mandatory for textures"); - } - - std::unique_ptr texture; - - { - const DicomInstanceParameters& parameters = volume_.GetDicomParameters(); - ImageBuffer3D::SliceReader reader(volume_.GetPixelData(), projection_, sliceIndex_); - - texture.reset(dynamic_cast - (configurator->CreateTextureFromDicom(reader.GetAccessor(), parameters))); - } - - const CoordinateSystem3D& system = volume_.GetGeometry().GetProjectionGeometry(projection_); - - double x0, y0, x1, y1; - cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin()); - cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX()); - - { - double xz, yz; - cuttingPlane.ProjectPoint(xz, yz, LinearAlgebra::CreateVector(0, 0, 0)); - texture->SetOrigin(x0 - xz, y0 - yz); - } - - double dx = x1 - x0; - double dy = y1 - y0; - if (!LinearAlgebra::IsCloseToZero(dx) || - !LinearAlgebra::IsCloseToZero(dy)) - { - texture->SetAngle(atan2(dy, dx)); - } - - Vector tmp = volume_.GetGeometry().GetVoxelDimensions(projection_); - texture->SetPixelSpacing(tmp[0], tmp[1]); - - return texture.release(); - } - - - DicomVolumeImageMPRSlicer::~DicomVolumeImageMPRSlicer() - { - LOG(TRACE) << "DicomVolumeImageMPRSlicer::~DicomVolumeImageMPRSlicer()"; - } - - IVolumeSlicer::IExtractedSlice* - DicomVolumeImageMPRSlicer::ExtractSlice(const CoordinateSystem3D& cuttingPlane) - { - if (volume_->HasGeometry()) - { - return new Slice(*volume_, cuttingPlane); - } - else - { - return new IVolumeSlicer::InvalidSlice; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImageMPRSlicer.h --- a/Framework/Volumes/DicomVolumeImageMPRSlicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "DicomVolumeImage.h" -#include "IVolumeSlicer.h" - -#include - -namespace OrthancStone -{ - /** - Implements the IVolumeSlicer on Dicom volume data when the cutting plane - that is supplied to the slicer is either axial, sagittal or coronal. - Arbitrary planes are *not* supported - */ - class DicomVolumeImageMPRSlicer : public IVolumeSlicer - { - public: - class Slice : public IExtractedSlice - { - private: - const DicomVolumeImage& volume_; - uint64_t revision_; - bool valid_; - VolumeProjection projection_; - unsigned int sliceIndex_; - - void CheckValid() const; - - public: - /** - Represents a slice of a volume image that is parallel to the - coordinate system axis. - The constructor initializes the type of projection (axial, sagittal or - coronal) and the corresponding slice index, from the cutting plane. - */ - Slice(const DicomVolumeImage& volume, - const CoordinateSystem3D& cuttingPlane); - - void SetRevision(uint64_t revision) - { - revision_ = revision; - } - - VolumeProjection GetProjection() const; - - unsigned int GetSliceIndex() const; - - virtual bool IsValid() - { - return valid_; - } - - virtual uint64_t GetRevision() - { - return revision_; - } - - virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane); - }; - - private: - boost::shared_ptr volume_; - - public: - DicomVolumeImageMPRSlicer(const boost::shared_ptr& volume) : - volume_(volume) - { - } - - boost::shared_ptr GetVolume() const - { - return volume_; - } - - virtual ~DicomVolumeImageMPRSlicer(); - - virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImageReslicer.cpp --- a/Framework/Volumes/DicomVolumeImageReslicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomVolumeImageReslicer.h" - -#include - -namespace OrthancStone -{ - class DicomVolumeImageReslicer::Slice : public IVolumeSlicer::IExtractedSlice - { - private: - DicomVolumeImageReslicer& that_; - CoordinateSystem3D cuttingPlane_; - - public: - Slice(DicomVolumeImageReslicer& that, - const CoordinateSystem3D& cuttingPlane) : - that_(that), - cuttingPlane_(cuttingPlane) - { - } - - virtual bool IsValid() - { - return true; - } - - virtual uint64_t GetRevision() - { - return that_.volume_->GetRevision(); - } - - virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane) - { - VolumeReslicer& reslicer = that_.reslicer_; - - if (configurator == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, - "Must provide a layer style configurator"); - } - - reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat()); - reslicer.Apply(that_.volume_->GetPixelData(), - that_.volume_->GetGeometry(), - cuttingPlane); - - if (reslicer.IsSuccess()) - { - std::unique_ptr layer - (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(), - that_.volume_->GetDicomParameters())); - if (layer.get() == NULL) - { - return NULL; - } - - double s = reslicer.GetPixelSpacing(); - layer->SetPixelSpacing(s, s); - layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s, - reslicer.GetOutputExtent().GetY1() + 0.5 * s); - - // TODO - Angle!! - - return layer.release(); - } - else - { - return NULL; - } - } - }; - - - DicomVolumeImageReslicer::DicomVolumeImageReslicer(const boost::shared_ptr& volume) : - volume_(volume) - { - if (volume.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - - IVolumeSlicer::IExtractedSlice* DicomVolumeImageReslicer::ExtractSlice(const CoordinateSystem3D& cuttingPlane) - { - if (volume_->HasGeometry()) - { - return new Slice(*this, cuttingPlane); - } - else - { - return new IVolumeSlicer::InvalidSlice; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/DicomVolumeImageReslicer.h --- a/Framework/Volumes/DicomVolumeImageReslicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "DicomVolumeImage.h" -#include "IVolumeSlicer.h" -#include "VolumeReslicer.h" - -#include - -namespace OrthancStone -{ - /** - This class is able to supply an extract slice for an arbitrary cutting - plane through a volume image - */ - class DicomVolumeImageReslicer : public IVolumeSlicer - { - private: - class Slice; - - boost::shared_ptr volume_; - VolumeReslicer reslicer_; - - public: - DicomVolumeImageReslicer(const boost::shared_ptr& volume); - - ImageInterpolation GetInterpolation() const - { - return reslicer_.GetInterpolation(); - } - - void SetInterpolation(ImageInterpolation interpolation) - { - reslicer_.SetInterpolation(interpolation); - } - - bool IsFastMode() const - { - return reslicer_.IsFastMode(); - } - - void SetFastMode(bool fast) - { - reslicer_.EnableFastMode(fast); - } - - virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/IGeometryProvider.h --- a/Framework/Volumes/IGeometryProvider.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Volumes/VolumeImageGeometry.h" - -namespace OrthancStone -{ - class IGeometryProvider - { - public: - virtual ~IGeometryProvider() {} - virtual bool HasGeometry() const = 0; - virtual const OrthancStone::VolumeImageGeometry& GetImageGeometry() const = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/IVolumeSlicer.cpp --- a/Framework/Volumes/IVolumeSlicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "IVolumeSlicer.h" - -#include - -namespace OrthancStone -{ - uint64_t IVolumeSlicer::InvalidSlice::GetRevision() - { - LOG(ERROR) << "IVolumeSlicer::InvalidSlice::GetRevision()"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - ISceneLayer* IVolumeSlicer::InvalidSlice::CreateSceneLayer(const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane) - { - LOG(ERROR) << "IVolumeSlicer::InvalidSlice::CreateSceneLayer()"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/IVolumeSlicer.h --- a/Framework/Volumes/IVolumeSlicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2D/ILayerStyleConfigurator.h" -#include "../Toolbox/CoordinateSystem3D.h" - -namespace OrthancStone -{ - /** - This interface is implemented by objects representing 3D volume data and - that are able to return an object that: - - represent a slice of their data - - are able to create the corresponding slice visual representation. - */ - class IVolumeSlicer : public boost::noncopyable - { - public: - /** - This interface is implemented by objects representing a slice of - volume data and that are able to create a 2D layer to display a this - slice. - - The CreateSceneLayer factory method is called with an optional - configurator that possibly impacts the ISceneLayer subclass that is - created (for instance, if a LUT must be applied on the texture when - displaying it) - */ - class IExtractedSlice : public boost::noncopyable - { - public: - virtual ~IExtractedSlice() - { - } - - /** - Invalid slices are created when the data is not ready yet or if the - cut is outside of the available geometry. - */ - virtual bool IsValid() = 0; - - /** - This retrieves the *revision* that gets incremented every time the - underlying object undergoes a mutable operation (that it, changes its - state). - This **must** be a cheap call. - */ - virtual uint64_t GetRevision() = 0; - - /** Creates the slice visual representation */ - virtual ISceneLayer* CreateSceneLayer( - const ILayerStyleConfigurator* configurator, // possibly absent - const CoordinateSystem3D& cuttingPlane) = 0; - }; - - /** - See IExtractedSlice.IsValid() - */ - class InvalidSlice : public IExtractedSlice - { - public: - virtual bool IsValid() - { - return false; - } - - virtual uint64_t GetRevision(); - - virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, - const CoordinateSystem3D& cuttingPlane); - }; - - - virtual ~IVolumeSlicer() - { - } - - /** - This method is implemented by the objects representing volumetric data - and must returns an IExtractedSlice subclass that contains all the data - needed to, later on, create its visual representation through - CreateSceneLayer. - Subclasses a.o.: - - InvalidSlice, - - DicomVolumeImageMPRSlicer::Slice, - - DicomVolumeImageReslicer::Slice - - DicomStructureSetLoader::Slice - */ - virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/ImageBuffer3D.cpp --- a/Framework/Volumes/ImageBuffer3D.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,311 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ImageBuffer3D.h" - -#include -#include -#include - -#include - -namespace OrthancStone -{ - void ImageBuffer3D::GetAxialSliceAccessor(Orthanc::ImageAccessor& target, - unsigned int slice, - bool readOnly) const - { - if (slice >= depth_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (readOnly) - { - target.AssignReadOnly(format_, width_, height_, image_.GetPitch(), - image_.GetConstRow(height_ * (depth_ - 1 - slice))); - } - else - { - target.AssignWritable(format_, width_, height_, image_.GetPitch(), - image_.GetRow(height_ * (depth_ - 1 - slice))); - } - } - - - void ImageBuffer3D::GetCoronalSliceAccessor(Orthanc::ImageAccessor& target, - unsigned int slice, - bool readOnly) const - { - if (slice >= height_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (readOnly) - { - target.AssignReadOnly(format_, width_, depth_, image_.GetPitch() * height_, - image_.GetConstRow(slice)); - } - else - { - target.AssignWritable(format_, width_, depth_, image_.GetPitch() * height_, - image_.GetRow(slice)); - } - } - - - Orthanc::Image* ImageBuffer3D::ExtractSagittalSlice(unsigned int slice) const - { - //LOG(TRACE) << "ImageBuffer3D::ExtractSagittalSlice this= " << std::hex << this << std::dec << " width_ = " << width_ << " height_ = " << height_ << " depth_ = " << depth_ << " slice = " << slice; - if (slice >= width_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::unique_ptr result(new Orthanc::Image(format_, height_, depth_, false)); - //LOG(TRACE) << "ImageBuffer3D::ExtractSagittalSlice result will be an image of WIDTH = " << height_ << " and HEIGHT = " << depth_; - - unsigned int bytesPerPixel = Orthanc::GetBytesPerPixel(format_); - - for (unsigned int z = 0; z < depth_; z++) - { - //uint8_t* target = reinterpret_cast(result->GetRow(depth_ - 1 - z)); - uint8_t* target = reinterpret_cast(result->GetRow(z)); - - for (unsigned int y = 0; y < height_; y++) - { - const void* source = (reinterpret_cast(image_.GetConstRow(y + z * height_)) + bytesPerPixel * slice); - const uint8_t* byteSrc = reinterpret_cast(source); - for (size_t byte = 0; byte < bytesPerPixel; ++byte) - target[byte] = byteSrc[byte]; - target += bytesPerPixel; - } - } - - return result.release(); - } - - - ImageBuffer3D::ImageBuffer3D(Orthanc::PixelFormat format, - unsigned int width, - unsigned int height, - unsigned int depth, - bool computeRange) : - image_(format, width, height * depth, false), - format_(format), - width_(width), - height_(height), - depth_(depth), - computeRange_(computeRange), - hasRange_(false) - { - LOG(TRACE) << "Created a 3D image of size " << width << "x" << height - << "x" << depth << " in " << Orthanc::EnumerationToString(format) - << " (" << (GetEstimatedMemorySize() / (1024ll * 1024ll)) << "MB)"; - } - - - void ImageBuffer3D::Clear() - { - memset(image_.GetBuffer(), 0, image_.GetHeight() * image_.GetPitch()); - } - - - uint64_t ImageBuffer3D::GetEstimatedMemorySize() const - { - return image_.GetPitch() * image_.GetHeight() * Orthanc::GetBytesPerPixel(format_); - } - - - void ImageBuffer3D::ExtendImageRange(const Orthanc::ImageAccessor& slice) - { - if (!computeRange_ || - slice.GetWidth() == 0 || - slice.GetHeight() == 0) - { - return; - } - - float sliceMin, sliceMax; - - switch (slice.GetFormat()) - { - case Orthanc::PixelFormat_Grayscale8: - case Orthanc::PixelFormat_Grayscale16: - case Orthanc::PixelFormat_Grayscale32: - case Orthanc::PixelFormat_SignedGrayscale16: - { - int64_t a, b; - Orthanc::ImageProcessing::GetMinMaxIntegerValue(a, b, slice); - sliceMin = static_cast(a); - sliceMax = static_cast(b); - break; - } - - case Orthanc::PixelFormat_Float32: - Orthanc::ImageProcessing::GetMinMaxFloatValue(sliceMin, sliceMax, slice); - break; - - default: - return; - } - - if (hasRange_) - { - minValue_ = std::min(minValue_, sliceMin); - maxValue_ = std::max(maxValue_, sliceMax); - } - else - { - hasRange_ = true; - minValue_ = sliceMin; - maxValue_ = sliceMax; - } - } - - - bool ImageBuffer3D::GetRange(float& minValue, - float& maxValue) const - { - if (hasRange_) - { - minValue = minValue_; - maxValue = maxValue_; - return true; - } - else - { - return false; - } - } - - - ImageBuffer3D::SliceReader::SliceReader(const ImageBuffer3D& that, - VolumeProjection projection, - unsigned int slice) - { - switch (projection) - { - case VolumeProjection_Axial: - that.GetAxialSliceAccessor(accessor_, slice, true); - break; - - case VolumeProjection_Coronal: - that.GetCoronalSliceAccessor(accessor_, slice, true); - break; - - case VolumeProjection_Sagittal: - sagittal_.reset(that.ExtractSagittalSlice(slice)); - sagittal_->GetReadOnlyAccessor(accessor_); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - void ImageBuffer3D::SliceWriter::Flush() - { - if (modified_) - { - if (sagittal_.get() != NULL) - { - // TODO - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - // Update the dynamic range of the underlying image, if - // "computeRange_" is set to true - that_.ExtendImageRange(accessor_); - } - } - - - ImageBuffer3D::SliceWriter::SliceWriter(ImageBuffer3D& that, - VolumeProjection projection, - unsigned int slice) : - that_(that), - modified_(false) - { - switch (projection) - { - case VolumeProjection_Axial: - that.GetAxialSliceAccessor(accessor_, slice, false); - break; - - case VolumeProjection_Coronal: - that.GetCoronalSliceAccessor(accessor_, slice, false); - break; - - case VolumeProjection_Sagittal: - sagittal_.reset(that.ExtractSagittalSlice(slice)); - sagittal_->GetWriteableAccessor(accessor_); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - uint8_t ImageBuffer3D::GetVoxelGrayscale8(unsigned int x, - unsigned int y, - unsigned int z) const - { - if (format_ != Orthanc::PixelFormat_Grayscale8) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (x >= width_ || - y >= height_ || - z >= depth_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const void* p = image_.GetConstRow(y + height_ * (depth_ - 1 - z)); - return reinterpret_cast(p) [x]; - } - - - uint16_t ImageBuffer3D::GetVoxelGrayscale16(unsigned int x, - unsigned int y, - unsigned int z) const - { - if (format_ != Orthanc::PixelFormat_Grayscale16) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - if (x >= width_ || - y >= height_ || - z >= depth_) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const void* p = image_.GetConstRow(y + height_ * (depth_ - 1 - z)); - return reinterpret_cast(p) [x]; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/ImageBuffer3D.h --- a/Framework/Volumes/ImageBuffer3D.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,231 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "../Toolbox/LinearAlgebra.h" - -#include -#include - -namespace OrthancStone -{ - /* - - This classes stores volume images sliced across the Z axis, vertically, in the decreasing Z order : - - +---------------+ - | | - | SLICE N-1 | - | | - +---------------+ - | | - | SLICE N-2 | - | | - +---------------+ - | | - | SLICE N-3 | - | | - . . - ...... ...... - . . - | | - | SLICE 2 | - | | - +---------------+ - | | - | SLICE 1 | - | | - +---------------+ - | | - | SLICE 0 | - | | - +---------------+ - - As you can see, if the 3d image has size width, height, depth, the 2d image has : - - 2d width = 3d width - - 2d height = 3d height * 3d depth - - */ - - class ImageBuffer3D : public boost::noncopyable - { - private: - Orthanc::Image image_; - Orthanc::PixelFormat format_; - unsigned int width_; - unsigned int height_; - unsigned int depth_; - bool computeRange_; - bool hasRange_; - float minValue_; - float maxValue_; - Matrix transform_; - Matrix transformInverse_; - - void ExtendImageRange(const Orthanc::ImageAccessor& slice); - - void GetAxialSliceAccessor(Orthanc::ImageAccessor& target, - unsigned int slice, - bool readOnly) const; - - void GetCoronalSliceAccessor(Orthanc::ImageAccessor& target, - unsigned int slice, - bool readOnly) const; - - Orthanc::Image* ExtractSagittalSlice(unsigned int slice) const; - - template - T GetPixelUnchecked(unsigned int x, - unsigned int y, - unsigned int z) const - { - const uint8_t* buffer = reinterpret_cast(image_.GetConstBuffer()); - const uint8_t* row = buffer + (y + height_ * (depth_ - 1 - z)) * image_.GetPitch(); - return reinterpret_cast(row) [x]; - } - - public: - ImageBuffer3D(Orthanc::PixelFormat format, - unsigned int width, - unsigned int height, - unsigned int depth, - bool computeRange); - - void Clear(); - - const Orthanc::ImageAccessor& GetInternalImage() const - { - return image_; - } - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - unsigned int GetDepth() const - { - return depth_; - } - - Orthanc::PixelFormat GetFormat() const - { - return format_; - } - - unsigned int GetBytesPerPixel() const - { - return Orthanc::GetBytesPerPixel(format_); - } - - uint64_t GetEstimatedMemorySize() const; - - bool GetRange(float& minValue, - float& maxValue) const; - - uint8_t GetVoxelGrayscale8Unchecked(unsigned int x, - unsigned int y, - unsigned int z) const - { - return GetPixelUnchecked(x, y, z); - } - - uint16_t GetVoxelGrayscale16Unchecked(unsigned int x, - unsigned int y, - unsigned int z) const - { - return GetPixelUnchecked(x, y, z); - } - - int16_t GetVoxelSignedGrayscale16Unchecked(unsigned int x, - unsigned int y, - unsigned int z) const - { - return GetPixelUnchecked(x, y, z); - } - - uint8_t GetVoxelGrayscale8(unsigned int x, - unsigned int y, - unsigned int z) const; - - uint16_t GetVoxelGrayscale16(unsigned int x, - unsigned int y, - unsigned int z) const; - - - class SliceReader : public boost::noncopyable - { - private: - Orthanc::ImageAccessor accessor_; - std::unique_ptr sagittal_; // Unused for axial and coronal - - public: - SliceReader(const ImageBuffer3D& that, - VolumeProjection projection, - unsigned int slice); - - const Orthanc::ImageAccessor& GetAccessor() const - { - return accessor_; - } - }; - - - class SliceWriter : public boost::noncopyable - { - private: - ImageBuffer3D& that_; - bool modified_; - Orthanc::ImageAccessor accessor_; - std::unique_ptr sagittal_; // Unused for axial and coronal - - void Flush(); - - public: - SliceWriter(ImageBuffer3D& that, - VolumeProjection projection, - unsigned int slice); - - ~SliceWriter() - { - Flush(); - } - - const Orthanc::ImageAccessor& GetAccessor() const - { - return accessor_; - } - - Orthanc::ImageAccessor& GetAccessor() - { - modified_ = true; - return accessor_; - } - }; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/OrientedVolumeBoundingBox.cpp --- a/Framework/Volumes/OrientedVolumeBoundingBox.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,268 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OrientedVolumeBoundingBox.h" - -#include "../Toolbox/GeometryToolbox.h" -#include "ImageBuffer3D.h" - -#include - -#include - -namespace OrthancStone -{ - OrientedVolumeBoundingBox::OrientedVolumeBoundingBox(const VolumeImageGeometry& geometry) - { - unsigned int n = geometry.GetDepth(); - if (n < 1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); - } - - Vector dim = geometry.GetVoxelDimensions(VolumeProjection_Axial); - - u_ = geometry.GetAxialGeometry().GetAxisX(); - v_ = geometry.GetAxialGeometry().GetAxisY(); - w_ = geometry.GetAxialGeometry().GetNormal(); - - hu_ = static_cast(geometry.GetWidth() * dim[0] / 2.0); - hv_ = static_cast(geometry.GetHeight() * dim[1] / 2.0); - hw_ = static_cast(geometry.GetDepth() * dim[2] / 2.0); - - c_ = (geometry.GetAxialGeometry().GetOrigin() + - (hu_ - dim[0] / 2.0) * u_ + - (hv_ - dim[1] / 2.0) * v_ + - (hw_ - dim[2] / 2.0) * w_); - } - - - bool OrientedVolumeBoundingBox::HasIntersectionWithPlane(std::vector& points, - const Vector& normal, - double d) const - { - assert(normal.size() == 3); - - double r = (hu_ * fabs(boost::numeric::ublas::inner_prod(normal, u_)) + - hv_ * fabs(boost::numeric::ublas::inner_prod(normal, v_)) + - hw_ * fabs(boost::numeric::ublas::inner_prod(normal, w_))); - - double s = boost::numeric::ublas::inner_prod(normal, c_) + d; - - if (fabs(s) >= r) - { - // No intersection, or intersection is reduced to a single point - return false; - } - else - { - Vector p; - - // Loop over all the 12 edges (segments) of the oriented - // bounding box, and check whether they intersect the plane - - // X-aligned edges - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, - c_ + u_ * hu_ - v_ * hv_ - w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ + v_ * hv_ - w_ * hw_, - c_ + u_ * hu_ + v_ * hv_ - w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ - v_ * hv_ + w_ * hw_, - c_ + u_ * hu_ - v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ + v_ * hv_ + w_ * hw_, - c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - // Y-aligned edges - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, - c_ - u_ * hu_ + v_ * hv_ - w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ + u_ * hu_ - v_ * hv_ - w_ * hw_, - c_ + u_ * hu_ + v_ * hv_ - w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ - v_ * hv_ + w_ * hw_, - c_ - u_ * hu_ + v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ + u_ * hu_ - v_ * hv_ + w_ * hw_, - c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - // Z-aligned edges - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, - c_ - u_ * hu_ - v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ + u_ * hu_ - v_ * hv_ - w_ * hw_, - c_ + u_ * hu_ - v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ - u_ * hu_ + v_ * hv_ - w_ * hw_, - c_ - u_ * hu_ + v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - if (GeometryToolbox::IntersectPlaneAndSegment - (p, normal, d, - c_ + u_ * hu_ + v_ * hv_ - w_ * hw_, - c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) - { - points.push_back(p); - } - - return true; - } - } - - - bool OrientedVolumeBoundingBox::HasIntersection(std::vector& points, - const CoordinateSystem3D& plane) const - { - // From the vector equation of a 3D plane (specified by origin - // and normal), to the general equation of a 3D plane (which - // looses information about the origin of the coordinate system) - const Vector& normal = plane.GetNormal(); - const Vector& origin = plane.GetOrigin(); - double d = -(normal[0] * origin[0] + normal[1] * origin[1] + normal[2] * origin[2]); - - return HasIntersectionWithPlane(points, normal, d); - } - - - bool OrientedVolumeBoundingBox::Contains(const Vector& p) const - { - assert(p.size() == 3); - - const Vector q = p - c_; - - return (fabs(boost::numeric::ublas::inner_prod(q, u_)) <= hu_ && - fabs(boost::numeric::ublas::inner_prod(q, v_)) <= hv_ && - fabs(boost::numeric::ublas::inner_prod(q, w_)) <= hw_); - } - - - void OrientedVolumeBoundingBox::FromInternalCoordinates(Vector& target, - double x, - double y, - double z) const - { - target = (c_ + - u_ * 2.0 * hu_ * (x - 0.5) + - v_ * 2.0 * hv_ * (y - 0.5) + - w_ * 2.0 * hw_ * (z - 0.5)); - } - - - void OrientedVolumeBoundingBox::FromInternalCoordinates(Vector& target, - const Vector& source) const - { - assert(source.size() == 3); - FromInternalCoordinates(target, source[0], source[1], source[2]); - } - - - void OrientedVolumeBoundingBox::ToInternalCoordinates(Vector& target, - const Vector& source) const - { - assert(source.size() == 3); - const Vector q = source - c_; - - double x = boost::numeric::ublas::inner_prod(q, u_) / (2.0 * hu_) + 0.5; - double y = boost::numeric::ublas::inner_prod(q, v_) / (2.0 * hv_) + 0.5; - double z = boost::numeric::ublas::inner_prod(q, w_) / (2.0 * hw_) + 0.5; - - LinearAlgebra::AssignVector(target, x, y, z); - } - - - bool OrientedVolumeBoundingBox::ComputeExtent(Extent2D& extent, - const CoordinateSystem3D& plane) const - { - extent.Reset(); - - std::vector points; - if (HasIntersection(points, plane)) - { - for (size_t i = 0; i < points.size(); i++) - { - double x, y; - plane.ProjectPoint(x, y, points[i]); - extent.AddPoint(x, y); - } - - return true; - } - else - { - return false; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/OrientedVolumeBoundingBox.h --- a/Framework/Volumes/OrientedVolumeBoundingBox.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/CoordinateSystem3D.h" -#include "../Toolbox/Extent2D.h" -#include "../Toolbox/LinearAlgebra.h" -#include "VolumeImageGeometry.h" - -namespace OrthancStone -{ - class OrientedVolumeBoundingBox : public boost::noncopyable - { - private: - Vector c_; // center - Vector u_; // normalized width vector - Vector v_; // normalized height vector - Vector w_; // normalized depth vector - double hu_; // half width - double hv_; // half height - double hw_; // half depth - - public: - OrientedVolumeBoundingBox(const VolumeImageGeometry& geometry); - - const Vector& GetCenter() const - { - return c_; - } - - bool HasIntersectionWithPlane(std::vector& points, - const Vector& normal, - double d) const; - - bool HasIntersection(std::vector& points, - const CoordinateSystem3D& plane) const; - - bool Contains(const Vector& p) const; - - void FromInternalCoordinates(Vector& target, - double x, - double y, - double z) const; - - void FromInternalCoordinates(Vector& target, - const Vector& source) const; - - void ToInternalCoordinates(Vector& target, - const Vector& source) const; - - bool ComputeExtent(Extent2D& extent, - const CoordinateSystem3D& plane) const; - }; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeImageGeometry.cpp --- a/Framework/Volumes/VolumeImageGeometry.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,356 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "VolumeImageGeometry.h" - -#include "../Toolbox/GeometryToolbox.h" - -#include - - -namespace OrthancStone -{ - void VolumeImageGeometry::Invalidate() - { - Vector p = (axialGeometry_.GetOrigin() + - static_cast(depth_ - 1) * voxelDimensions_[2] * axialGeometry_.GetNormal()); - - coronalGeometry_ = CoordinateSystem3D(p, - axialGeometry_.GetAxisX(), - -axialGeometry_.GetNormal()); - - sagittalGeometry_ = CoordinateSystem3D(p, - axialGeometry_.GetAxisY(), - -axialGeometry_.GetNormal()); - - Vector origin = ( - axialGeometry_.MapSliceToWorldCoordinates(-0.5 * voxelDimensions_[0], - -0.5 * voxelDimensions_[1]) - - 0.5 * voxelDimensions_[2] * axialGeometry_.GetNormal()); - - LOG(TRACE) << "VolumeImageGeometry::Invalidate() origin = " << origin(0) << "," << origin(1) << "," << origin(2) << " | width_ = " << width_ << " | height_ = " << height_ << " | depth_ = " << depth_; - - Vector scaling; - - if (width_ == 0 || - height_ == 0 || - depth_ == 0) - { - LinearAlgebra::AssignVector(scaling, 1, 1, 1); - } - else - { - scaling = ( - axialGeometry_.GetAxisX() * voxelDimensions_[0] * static_cast(width_) + - axialGeometry_.GetAxisY() * voxelDimensions_[1] * static_cast(height_) + - axialGeometry_.GetNormal() * voxelDimensions_[2] * static_cast(depth_)); - } - - transform_ = LinearAlgebra::Product( - GeometryToolbox::CreateTranslationMatrix(origin[0], origin[1], origin[2]), - GeometryToolbox::CreateScalingMatrix(scaling[0], scaling[1], scaling[2])); - - LinearAlgebra::InvertMatrix(transformInverse_, transform_); - } - - - VolumeImageGeometry::VolumeImageGeometry() : - width_(0), - height_(0), - depth_(0) - { - LinearAlgebra::AssignVector(voxelDimensions_, 1, 1, 1); - Invalidate(); - } - - - void VolumeImageGeometry::SetSizeInVoxels(unsigned int width, - unsigned int height, - unsigned int depth) - { - width_ = width; - height_ = height; - depth_ = depth; - Invalidate(); - } - - - void VolumeImageGeometry::SetAxialGeometry(const CoordinateSystem3D& geometry) - { - axialGeometry_ = geometry; - Invalidate(); - } - - - void VolumeImageGeometry::SetVoxelDimensions(double x, - double y, - double z) - { - if (x <= 0 || - y <= 0 || - z <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - else - { - LinearAlgebra::AssignVector(voxelDimensions_, x, y, z); - Invalidate(); - } - } - - - const CoordinateSystem3D& VolumeImageGeometry::GetProjectionGeometry(VolumeProjection projection) const - { - switch (projection) - { - case VolumeProjection_Axial: - return axialGeometry_; - - case VolumeProjection_Coronal: - return coronalGeometry_; - - case VolumeProjection_Sagittal: - return sagittalGeometry_; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - Vector VolumeImageGeometry::GetVoxelDimensions(VolumeProjection projection) const - { - switch (projection) - { - case VolumeProjection_Axial: - return voxelDimensions_; - - case VolumeProjection_Coronal: - return LinearAlgebra::CreateVector(voxelDimensions_[0], voxelDimensions_[2], voxelDimensions_[1]); - - case VolumeProjection_Sagittal: - return LinearAlgebra::CreateVector(voxelDimensions_[1], voxelDimensions_[2], voxelDimensions_[0]); - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - unsigned int VolumeImageGeometry::GetProjectionWidth(VolumeProjection projection) const - { - switch (projection) - { - case VolumeProjection_Axial: - return width_; - - case VolumeProjection_Coronal: - return width_; - - case VolumeProjection_Sagittal: - return height_; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - unsigned int VolumeImageGeometry::GetProjectionHeight(VolumeProjection projection) const - { - switch (projection) - { - case VolumeProjection_Axial: - return height_; - - case VolumeProjection_Coronal: - return depth_; - - case VolumeProjection_Sagittal: - return depth_; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - unsigned int VolumeImageGeometry::GetProjectionDepth(VolumeProjection projection) const - { - switch (projection) - { - case VolumeProjection_Axial: - return depth_; - - case VolumeProjection_Coronal: - return height_; - - case VolumeProjection_Sagittal: - return width_; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - - Vector VolumeImageGeometry::GetCoordinates(float x, - float y, - float z) const - { - Vector p = LinearAlgebra::Product(transform_, LinearAlgebra::CreateVector(x, y, z, 1)); - - assert(LinearAlgebra::IsNear(p[3], 1)); // Affine transform, no perspective effect - - // Back to non-homogeneous coordinates - return LinearAlgebra::CreateVector(p[0], p[1], p[2]); - } - - - bool VolumeImageGeometry::DetectProjection(VolumeProjection& projection, - const Vector& planeNormal) const - { - if (GeometryToolbox::IsParallel(planeNormal, axialGeometry_.GetNormal())) - { - projection = VolumeProjection_Axial; - return true; - } - else if (GeometryToolbox::IsParallel(planeNormal, coronalGeometry_.GetNormal())) - { - projection = VolumeProjection_Coronal; - return true; - } - else if (GeometryToolbox::IsParallel(planeNormal, sagittalGeometry_.GetNormal())) - { - projection = VolumeProjection_Sagittal; - return true; - } - else - { - return false; - } - } - - - bool VolumeImageGeometry::DetectSlice(VolumeProjection& projection, - unsigned int& slice, - const CoordinateSystem3D& plane) const - { - if (!DetectProjection(projection, plane.GetNormal())) - { - return false; - } - - // Transforms the coordinates of the origin of the plane, into the - // coordinates of the axial geometry - const Vector& origin = plane.GetOrigin(); - Vector p = LinearAlgebra::Product( - transformInverse_, - LinearAlgebra::CreateVector(origin[0], origin[1], origin[2], 1)); - - assert(LinearAlgebra::IsNear(p[3], 1)); - - double z; - - switch (projection) - { - case VolumeProjection_Axial: - z = p[2]; - break; - - case VolumeProjection_Coronal: - z = p[1]; - break; - - case VolumeProjection_Sagittal: - z = p[0]; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - const unsigned int projectionDepth = GetProjectionDepth(projection); - - z *= static_cast(projectionDepth); - if (z < 0) - { - return false; - } - else - { - unsigned int d = static_cast(std::floor(z)); - if (d >= projectionDepth) - { - return false; - } - else - { - slice = d; - return true; - } - } - } - - - CoordinateSystem3D VolumeImageGeometry::GetProjectionSlice(VolumeProjection projection, - unsigned int z) const - { - if (z >= GetProjectionDepth(projection)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - Vector dim = GetVoxelDimensions(projection); - CoordinateSystem3D plane = GetProjectionGeometry(projection); - - Vector normal = plane.GetNormal(); - if (projection == VolumeProjection_Sagittal) - { - /** - * WARNING: In sagittal geometry, the normal points to REDUCING - * X-axis in the 3D world. This is necessary to keep the - * right-hand coordinate system. Hence the negation. - **/ - normal = -normal; - } - - plane.SetOrigin(plane.GetOrigin() + static_cast(z) * dim[2] * normal); - - return plane; - } - - std::ostream& operator<<(std::ostream& s, const VolumeImageGeometry& v) - { - s << "width: " << v.width_ << " height: " << v.height_ - << " depth: " << v.depth_ - << " axialGeometry: " << v.axialGeometry_ - << " coronalGeometry: " << v.coronalGeometry_ - << " sagittalGeometry: " << v.sagittalGeometry_ - << " voxelDimensions_: " << v.voxelDimensions_ - << " height: " << v.height_ - << " transform: " << v.transform_ - << " transformInverse: " << v.transformInverse_; - return s; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeImageGeometry.h --- a/Framework/Volumes/VolumeImageGeometry.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../StoneEnumerations.h" -#include "../Toolbox/CoordinateSystem3D.h" - -#include - -namespace OrthancStone -{ - class VolumeImageGeometry - { - private: - unsigned int width_; - unsigned int height_; - unsigned int depth_; - CoordinateSystem3D axialGeometry_; - CoordinateSystem3D coronalGeometry_; - CoordinateSystem3D sagittalGeometry_; - Vector voxelDimensions_; - Matrix transform_; - Matrix transformInverse_; - - void Invalidate(); - - friend std::ostream& operator<<(std::ostream& s, const VolumeImageGeometry& v); - - public: - VolumeImageGeometry(); - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - unsigned int GetDepth() const - { - return depth_; - } - - const CoordinateSystem3D& GetAxialGeometry() const - { - return axialGeometry_; - } - - const CoordinateSystem3D& GetCoronalGeometry() const - { - return coronalGeometry_; - } - - const CoordinateSystem3D& GetSagittalGeometry() const - { - return sagittalGeometry_; - } - - const CoordinateSystem3D& GetProjectionGeometry(VolumeProjection projection) const; - - const Matrix& GetTransform() const - { - return transform_; - } - - const Matrix& GetTransformInverse() const - { - return transformInverse_; - } - - void SetSizeInVoxels(unsigned int width, - unsigned int height, - unsigned int depth); - - // Set the geometry of the first axial slice (i.e. the one whose - // depth == 0) - void SetAxialGeometry(const CoordinateSystem3D& geometry); - - void SetVoxelDimensions(double x, - double y, - double z); - - Vector GetVoxelDimensions(VolumeProjection projection) const; - - unsigned int GetProjectionWidth(VolumeProjection projection) const; - - unsigned int GetProjectionHeight(VolumeProjection projection) const; - - unsigned int GetProjectionDepth(VolumeProjection projection) const; - - // Get the 3D position of a point in the volume, where x, y and z - // lie in the [0;1] range - Vector GetCoordinates(float x, - float y, - float z) const; - - bool DetectProjection(VolumeProjection& projection, - const Vector& planeNormal) const; - - /** - Being given a cutting plane, this method will determine if it is an - axial, sagittal or coronal cut and returns - the slice number corresponding to this cut. - - If the cutting plane is not parallel to the three x = 0, y = 0 or z = 0 - planes, it is considered as arbitrary and the method returns false. - Otherwise, it returns true. - */ - bool DetectSlice(VolumeProjection& projection, - unsigned int& slice, - const CoordinateSystem3D& plane) const; - - CoordinateSystem3D GetProjectionSlice(VolumeProjection projection, - unsigned int z) const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeReslicer.cpp --- a/Framework/Volumes/VolumeReslicer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,839 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "VolumeReslicer.h" - -#include "../Toolbox/GeometryToolbox.h" -#include "../Toolbox/SubvoxelReader.h" - -#include -#include -#include - -#include - -namespace OrthancStone -{ - // Anonymous namespace to avoid clashes between compilation modules - namespace - { - enum TransferFunction - { - TransferFunction_Copy, - TransferFunction_Float, - TransferFunction_Linear - }; - - - template - class PixelShader; - - - template - class PixelShader - { - private: - typedef SubvoxelReader VoxelReader; - typedef Orthanc::PixelTraits PixelWriter; - - VoxelReader reader_; - - public: - PixelShader(const ImageBuffer3D& image, - float /* scaling */, - float /* offset */) : - reader_(image) - { - } - - ORTHANC_FORCE_INLINE - void Apply(typename PixelWriter::PixelType* pixel, - float volumeX, - float volumeY, - float volumeZ) - { - typename VoxelReader::PixelType value; - - if (!reader_.GetValue(value, volumeX, volumeY, volumeZ)) - { - VoxelReader::Traits::SetMinValue(value); - } - - *pixel = value; - } - }; - - - template - class PixelShader - { - private: - typedef SubvoxelReader VoxelReader; - typedef Orthanc::PixelTraits PixelWriter; - - VoxelReader reader_; - - public: - PixelShader(const ImageBuffer3D& image, - float /* scaling */, - float /* offset */) : - reader_(image) - { - } - - ORTHANC_FORCE_INLINE - void Apply(typename PixelWriter::PixelType* pixel, - float volumeX, - float volumeY, - float volumeZ) - { - typename VoxelReader::PixelType value; - - if (!reader_.GetValue(value, volumeX, volumeY, volumeZ)) - { - VoxelReader::Traits::SetMinValue(value); - } - - PixelWriter::FloatToPixel(*pixel, VoxelReader::Traits::PixelToFloat(value)); - } - }; - - - template - class PixelShader - { - private: - typedef SubvoxelReader VoxelReader; - typedef Orthanc::PixelTraits PixelWriter; - - VoxelReader reader_; - float outOfVolume_; - - public: - PixelShader(const ImageBuffer3D& image, - float /* scaling */, - float /* offset */) : - reader_(image), - outOfVolume_(static_cast(std::numeric_limits::min())) - { - } - - ORTHANC_FORCE_INLINE - void Apply(typename PixelWriter::PixelType* pixel, - float volumeX, - float volumeY, - float volumeZ) - { - float value; - - if (!reader_.GetFloatValue(value, volumeX, volumeY, volumeZ)) - { - value = outOfVolume_; - } - - PixelWriter::FloatToPixel(*pixel, value); - } - }; - - - template - class PixelShader - { - private: - typedef SubvoxelReader VoxelReader; - typedef Orthanc::PixelTraits PixelWriter; - - VoxelReader reader_; - float scaling_; - float offset_; - float outOfVolume_; - - public: - PixelShader(const ImageBuffer3D& image, - float scaling, - float offset) : - reader_(image), - scaling_(scaling), - offset_(offset), - outOfVolume_(static_cast(std::numeric_limits::min())) - { - } - - ORTHANC_FORCE_INLINE - void Apply(typename PixelWriter::PixelType* pixel, - float volumeX, - float volumeY, - float volumeZ) - { - float value; - - if (reader_.GetFloatValue(value, volumeX, volumeY, volumeZ)) - { - value = scaling_ * value + offset_; - } - else - { - value = outOfVolume_; - } - - PixelWriter::FloatToPixel(*pixel, value); - } - }; - - - - class FastRowIterator : public boost::noncopyable - { - private: - float position_[3]; - float offset_[3]; - - public: - FastRowIterator(const Orthanc::ImageAccessor& slice, - const Extent2D& extent, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box, - unsigned int y) - { - const double width = static_cast(slice.GetWidth()); - const double height = static_cast(slice.GetHeight()); - assert(y < height); - - Vector q1 = plane.MapSliceToWorldCoordinates - (extent.GetX1() + extent.GetWidth() * static_cast(0) / static_cast(width + 1), - extent.GetY1() + extent.GetHeight() * static_cast(y) / static_cast(height + 1)); - - Vector q2 = plane.MapSliceToWorldCoordinates - (extent.GetX1() + extent.GetWidth() * static_cast(width - 1) / static_cast(width + 1), - extent.GetY1() + extent.GetHeight() * static_cast(y) / static_cast(height + 1)); - - Vector r1, r2; - box.ToInternalCoordinates(r1, q1); - box.ToInternalCoordinates(r2, q2); - - position_[0] = static_cast(r1[0]); - position_[1] = static_cast(r1[1]); - position_[2] = static_cast(r1[2]); - - Vector tmp = (r2 - r1) / static_cast(width - 1); - offset_[0] = static_cast(tmp[0]); - offset_[1] = static_cast(tmp[1]); - offset_[2] = static_cast(tmp[2]); - } - - ORTHANC_FORCE_INLINE - void Next() - { - position_[0] += offset_[0]; - position_[1] += offset_[1]; - position_[2] += offset_[2]; - } - - ORTHANC_FORCE_INLINE - void GetVolumeCoordinates(float& x, - float& y, - float& z) const - { - x = position_[0]; - y = position_[1]; - z = position_[2]; - } - }; - - - class SlowRowIterator : public boost::noncopyable - { - private: - const Orthanc::ImageAccessor& slice_; - const Extent2D& extent_; - const CoordinateSystem3D& plane_; - const OrientedVolumeBoundingBox& box_; - unsigned int x_; - unsigned int y_; - - public: - SlowRowIterator(const Orthanc::ImageAccessor& slice, - const Extent2D& extent, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box, - unsigned int y) : - slice_(slice), - extent_(extent), - plane_(plane), - box_(box), - x_(0), - y_(y) - { - assert(y_ < slice_.GetHeight()); - } - - void Next() - { - x_++; - } - - void GetVolumeCoordinates(float& x, - float& y, - float& z) const - { - assert(x_ < slice_.GetWidth()); - - const double width = static_cast(slice_.GetWidth()); - const double height = static_cast(slice_.GetHeight()); - - Vector q = plane_.MapSliceToWorldCoordinates - (extent_.GetX1() + extent_.GetWidth() * static_cast(x_) / (width + 1.0), - extent_.GetY1() + extent_.GetHeight() * static_cast(y_) / (height + 1.0)); - - Vector r; - box_.ToInternalCoordinates(r, q); - - x = static_cast(r[0]); - y = static_cast(r[1]); - z = static_cast(r[2]); - } - }; - - - template - static void ProcessImage(Orthanc::ImageAccessor& slice, - const Extent2D& extent, - const ImageBuffer3D& source, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box, - float scaling, - float offset) - { - typedef PixelShader Shader; - - const unsigned int outputWidth = slice.GetWidth(); - const unsigned int outputHeight = slice.GetHeight(); - - const float sourceWidth = static_cast(source.GetWidth()); - const float sourceHeight = static_cast(source.GetHeight()); - const float sourceDepth = static_cast(source.GetDepth()); - - Shader shader(source, scaling, offset); - - for (unsigned int y = 0; y < outputHeight; y++) - { - typedef typename Orthanc::ImageTraits::PixelType PixelType; - PixelType* p = reinterpret_cast(slice.GetRow(y)); - - RowIterator it(slice, extent, plane, box, y); - - for (unsigned int x = 0; x < outputWidth; x++, p++) - { - float volumeX, volumeY, volumeZ; - it.GetVolumeCoordinates(volumeX, volumeY, volumeZ); - - shader.Apply(p, - volumeX * sourceWidth, - volumeY * sourceHeight, - volumeZ * sourceDepth); - it.Next(); - } - } - } - - - template - static void ProcessImage(Orthanc::ImageAccessor& slice, - const Extent2D& extent, - const ImageBuffer3D& source, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box, - ImageInterpolation interpolation, - bool hasLinearFunction, - float scaling, - float offset) - { - if (hasLinearFunction) - { - switch (interpolation) - { - case ImageInterpolation_Nearest: - ProcessImage - (slice, extent, source, plane, box, scaling, offset); - break; - - case ImageInterpolation_Bilinear: - ProcessImage - (slice, extent, source, plane, box, scaling, offset); - break; - - case ImageInterpolation_Trilinear: - ProcessImage - (slice, extent, source, plane, box, scaling, offset); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - else - { - switch (interpolation) - { - case ImageInterpolation_Nearest: - ProcessImage - (slice, extent, source, plane, box, 0, 0); - break; - - case ImageInterpolation_Bilinear: - ProcessImage - (slice, extent, source, plane, box, 0, 0); - break; - - case ImageInterpolation_Trilinear: - ProcessImage - (slice, extent, source, plane, box, 0, 0); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - - template - static void ProcessImage(Orthanc::ImageAccessor& slice, - const Extent2D& extent, - const ImageBuffer3D& source, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box, - ImageInterpolation interpolation, - bool hasLinearFunction, - float scaling, - float offset) - { - if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && - slice.GetFormat() == Orthanc::PixelFormat_Grayscale8) - { - ProcessImage - (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); - } - else if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && - slice.GetFormat() == Orthanc::PixelFormat_Grayscale16) - { - ProcessImage - (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); - } - else if (source.GetFormat() == Orthanc::PixelFormat_SignedGrayscale16 && - slice.GetFormat() == Orthanc::PixelFormat_BGRA32) - { - ProcessImage - (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); - } - else if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && - slice.GetFormat() == Orthanc::PixelFormat_BGRA32) - { - ProcessImage - (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - - - void VolumeReslicer::CheckIterators(const ImageBuffer3D& source, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box) const - { - for (unsigned int y = 0; y < slice_->GetHeight(); y++) - { - FastRowIterator fast(*slice_, extent_, plane, box, y); - SlowRowIterator slow(*slice_, extent_, plane, box, y); - - for (unsigned int x = 0; x < slice_->GetWidth(); x++) - { - float px, py, pz; - fast.GetVolumeCoordinates(px, py, pz); - - float qx, qy, qz; - slow.GetVolumeCoordinates(qx, qy, qz); - - Vector d; - LinearAlgebra::AssignVector(d, px - qx, py - qy, pz - qz); - double norm = boost::numeric::ublas::norm_2(d); - if (norm > 0.0001) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - fast.Next(); - slow.Next(); - } - } - } - - - void VolumeReslicer::Reset() - { - success_ = false; - extent_.Reset(); - slice_.reset(NULL); - } - - - float VolumeReslicer::GetMinOutputValue() const - { - switch (outputFormat_) - { - case Orthanc::PixelFormat_Grayscale8: - case Orthanc::PixelFormat_Grayscale16: - case Orthanc::PixelFormat_BGRA32: - return 0.0f; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - float VolumeReslicer::GetMaxOutputValue() const - { - switch (outputFormat_) - { - case Orthanc::PixelFormat_Grayscale8: - case Orthanc::PixelFormat_BGRA32: - return static_cast(std::numeric_limits::max()); - break; - - case Orthanc::PixelFormat_Grayscale16: - return static_cast(std::numeric_limits::max()); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - VolumeReslicer::VolumeReslicer() : - outputFormat_(Orthanc::PixelFormat_Grayscale8), - interpolation_(ImageInterpolation_Nearest), - fastMode_(true), - success_(false) - { - ResetLinearFunction(); - } - - - void VolumeReslicer::GetLinearFunction(float& scaling, - float& offset) const - { - if (hasLinearFunction_) - { - scaling = scaling_; - offset = offset_; - } - else - { - scaling = 1.0f; - offset = 0.0f; - } - } - - - void VolumeReslicer::ResetLinearFunction() - { - Reset(); - hasLinearFunction_ = false; - scaling_ = 1.0f; - offset_ = 0.0f; - } - - - void VolumeReslicer::SetLinearFunction(float scaling, - float offset) - { - Reset(); - hasLinearFunction_ = true; - scaling_ = scaling; - offset_ = offset; - } - - - void VolumeReslicer::SetWindow(float low, - float high) - { - //printf("Range in pixel values: %f->%f\n", low, high); - float scaling = (GetMaxOutputValue() - GetMinOutputValue()) / (high - low); - float offset = GetMinOutputValue() - scaling * low; - - SetLinearFunction(scaling, offset); - - /*float x = scaling_ * low + offset_; - float y = scaling_ * high + offset_; - printf("%f %f (should be %f->%f)\n", x, y, GetMinOutputValue(), GetMaxOutputValue());*/ - } - - - void VolumeReslicer::FitRange(const ImageBuffer3D& image) - { - float minInputValue, maxInputValue; - - if (!image.GetRange(minInputValue, maxInputValue) || - maxInputValue < 1) - { - ResetLinearFunction(); - } - else - { - SetWindow(minInputValue, maxInputValue); - } - } - - - void VolumeReslicer::SetWindowing(ImageWindowing windowing, - const ImageBuffer3D& image, - float rescaleSlope, - float rescaleIntercept) - { - if (windowing == ImageWindowing_Custom) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - float center, width; - ComputeWindowing(center, width, windowing, 0, 0); - - float a = (center - width / 2.0f - rescaleIntercept) / rescaleSlope; - float b = (center + width / 2.0f - rescaleIntercept) / rescaleSlope; - SetWindow(a, b); - } - - - void VolumeReslicer::SetOutputFormat(Orthanc::PixelFormat format) - { - if (format != Orthanc::PixelFormat_Grayscale8 && - format != Orthanc::PixelFormat_Grayscale16 && - format != Orthanc::PixelFormat_BGRA32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (hasLinearFunction_) - { - LOG(WARNING) << "Calls to VolumeReslicer::SetOutputFormat() should be done before VolumeReslicer::FitRange()"; - } - - outputFormat_ = format; - Reset(); - } - - - void VolumeReslicer::SetInterpolation(ImageInterpolation interpolation) - { - if (interpolation != ImageInterpolation_Nearest && - interpolation != ImageInterpolation_Bilinear && - interpolation != ImageInterpolation_Trilinear) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - interpolation_ = interpolation; - Reset(); - } - - - const Extent2D& VolumeReslicer::GetOutputExtent() const - { - if (success_) - { - return extent_; - } - else - { - LOG(ERROR) << "VolumeReslicer::GetOutputExtent(): (!success_)"; - - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - const Orthanc::ImageAccessor& VolumeReslicer::GetOutputSlice() const - { - if (success_) - { - assert(slice_.get() != NULL); - return *slice_; - } - else - { - LOG(ERROR) << "VolumeReslicer::GetOutputSlice(): (!success_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - Orthanc::ImageAccessor* VolumeReslicer::ReleaseOutputSlice() - { - if (success_) - { - assert(slice_.get() != NULL); - success_ = false; - return slice_.release(); - } - else - { - LOG(ERROR) << "VolumeReslicer::ReleaseOutputSlice(): (!success_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } - - - void VolumeReslicer::Apply(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - const CoordinateSystem3D& plane) - { - // Choose the default voxel size as the finest voxel dimension - // of the source volumetric image - const OrthancStone::Vector dim = - geometry.GetVoxelDimensions(OrthancStone::VolumeProjection_Axial); - double voxelSize = dim[0]; - - if (dim[1] < voxelSize) - { - voxelSize = dim[1]; - } - - if (dim[2] < voxelSize) - { - voxelSize = dim[2]; - } - - if (voxelSize <= 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - Apply(source, geometry, plane, voxelSize); - } - - - void VolumeReslicer::Apply(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - const CoordinateSystem3D& plane, - double voxelSize) - { - Reset(); - pixelSpacing_ = voxelSize; - - // Firstly, compute the intersection of the source volumetric - // image with the reslicing plane. This leads to a polygon with 3 - // to 6 vertices. We compute the extent of the intersection - // polygon, with respect to the coordinate system of the reslicing - // plane. - OrientedVolumeBoundingBox box(geometry); - - if (!box.ComputeExtent(extent_, plane)) - { - // The plane does not intersect with the bounding box of the volume - slice_.reset(new Orthanc::Image(outputFormat_, 0, 0, false)); - success_ = true; - return; - } - - // Secondly, the extent together with the voxel size gives the - // size of the output image - unsigned int width = boost::math::iround(extent_.GetWidth() / voxelSize); - unsigned int height = boost::math::iround(extent_.GetHeight() / voxelSize); - - slice_.reset(new Orthanc::Image(outputFormat_, width, height, false)); - - //CheckIterators(source, plane, box); - - if (fastMode_) - { - ProcessImage(*slice_, extent_, source, plane, box, - interpolation_, hasLinearFunction_, scaling_, offset_); - } - else - { - ProcessImage(*slice_, extent_, source, plane, box, - interpolation_, hasLinearFunction_, scaling_, offset_); - } - - success_ = true; - } - - - double VolumeReslicer::GetPixelSpacing() const - { - if (success_) - { - return pixelSpacing_; - } - else - { - LOG(ERROR) << "VolumeReslicer::GetPixelSpacing(): (!success_)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeReslicer.h --- a/Framework/Volumes/VolumeReslicer.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/Extent2D.h" -#include "OrientedVolumeBoundingBox.h" -#include "ImageBuffer3D.h" - -namespace OrthancStone -{ - // Hypothesis: The output voxels always have square size - class VolumeReslicer : public boost::noncopyable - { - private: - // Input parameters - Orthanc::PixelFormat outputFormat_; - bool hasLinearFunction_; - float scaling_; // "a" in "f(x) = a * x + b" - float offset_; // "b" in "f(x) = a * x + b" - ImageInterpolation interpolation_; - bool fastMode_; - - // Output of reslicing - bool success_; - Extent2D extent_; - std::unique_ptr slice_; - double pixelSpacing_; - - void CheckIterators(const ImageBuffer3D& source, - const CoordinateSystem3D& plane, - const OrientedVolumeBoundingBox& box) const; - - void Reset(); - - float GetMinOutputValue() const; - - float GetMaxOutputValue() const; - - void SetWindow(float low, - float high); - - public: - VolumeReslicer(); - - void GetLinearFunction(float& scaling, - float& offset) const; - - void ResetLinearFunction(); - - void SetLinearFunction(float scaling, - float offset); - - void FitRange(const ImageBuffer3D& image); - - void SetWindowing(ImageWindowing windowing, - const ImageBuffer3D& image, - float rescaleSlope, - float rescaleIntercept); - - Orthanc::PixelFormat GetOutputFormat() const - { - return outputFormat_; - } - - void SetOutputFormat(Orthanc::PixelFormat format); - - ImageInterpolation GetInterpolation() const - { - return interpolation_; - } - - void SetInterpolation(ImageInterpolation interpolation); - - bool IsFastMode() const - { - return fastMode_; - } - - void EnableFastMode(bool enabled) - { - fastMode_ = enabled; - } - - bool IsSuccess() const - { - return success_; - } - - const Extent2D& GetOutputExtent() const; - - const Orthanc::ImageAccessor& GetOutputSlice() const; - - Orthanc::ImageAccessor* ReleaseOutputSlice(); - - void Apply(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - const CoordinateSystem3D& plane); - - void Apply(const ImageBuffer3D& source, - const VolumeImageGeometry& geometry, - const CoordinateSystem3D& plane, - double voxelSize); - - double GetPixelSpacing() const; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeSceneLayerSource.cpp --- a/Framework/Volumes/VolumeSceneLayerSource.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "VolumeSceneLayerSource.h" - -#include "../Scene2D/NullLayer.h" -#include "../Viewport/IViewport.h" -#include "../StoneException.h" - -#include - -namespace OrthancStone -{ - static bool IsSameCuttingPlane(const CoordinateSystem3D& a, - const CoordinateSystem3D& b) - { - // TODO - What if the normal is reversed? - double distance; - return (CoordinateSystem3D::ComputeDistance(distance, a, b) && - LinearAlgebra::IsCloseToZero(distance)); - } - - - void VolumeSceneLayerSource::ClearLayer() - { - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - scene.DeleteLayer(layerDepth_); - } - lastPlane_.reset(NULL); - } - - VolumeSceneLayerSource::VolumeSceneLayerSource( - boost::shared_ptr viewport, - int layerDepth, - const boost::shared_ptr& slicer) - : viewport_(viewport) - , layerDepth_(layerDepth) - , slicer_(slicer) - { - if (slicer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - ORTHANC_ASSERT(!scene.HasLayer(layerDepth_)); - - // we need to book the scene layer depth by adding a dummy layer - std::unique_ptr nullLayer(new NullLayer); - scene.SetLayer(layerDepth_,nullLayer.release()); - } - } - - VolumeSceneLayerSource::~VolumeSceneLayerSource() - { - ClearLayer(); - } - - void VolumeSceneLayerSource::RemoveConfigurator() - { - configurator_.reset(); - lastPlane_.reset(); - } - - - void VolumeSceneLayerSource::SetConfigurator(ILayerStyleConfigurator* configurator) // Takes ownership - { - if (configurator == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - configurator_.reset(configurator); - - // Invalidate the layer - lastPlane_.reset(NULL); - } - - - ILayerStyleConfigurator& VolumeSceneLayerSource::GetConfigurator() const - { - if (configurator_.get() == NULL) - { - LOG(ERROR) << "VolumeSceneLayerSource::GetConfigurator(): (configurator_.get() == NULL)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return *configurator_; - } - - - void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - assert(slicer_.get() != NULL); - std::unique_ptr slice(slicer_->ExtractSlice(plane)); - - if (slice.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (!slice->IsValid()) - { - // The slicer cannot handle this cutting plane: Clear the layer - ClearLayer(); - } - else if (lastPlane_.get() != NULL && - IsSameCuttingPlane(*lastPlane_, plane) && - lastRevision_ == slice->GetRevision()) - { - // The content of the slice has not changed: Don't update the - // layer content, but possibly update its style - - if (configurator_.get() != NULL && - configurator_->GetRevision() != lastConfiguratorRevision_ && - scene.HasLayer(layerDepth_)) - { - configurator_->ApplyStyle(scene.GetLayer(layerDepth_)); - } - } - else - { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed"; - // Content has changed: An update is needed - lastPlane_.reset(new CoordinateSystem3D(plane)); - lastRevision_ = slice->GetRevision(); - - std::unique_ptr layer(slice->CreateSceneLayer(configurator_.get(), plane)); - if (layer.get() == NULL) - { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() == NULL)"; - ClearLayer(); - } - else - { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() != NULL)"; - if (configurator_.get() != NULL) - { - lastConfiguratorRevision_ = configurator_->GetRevision(); - configurator_->ApplyStyle(*layer); - } - - scene.SetLayer(layerDepth_, layer.release()); - } - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Volumes/VolumeSceneLayerSource.h --- a/Framework/Volumes/VolumeSceneLayerSource.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Scene2D/Scene2D.h" -#include "IVolumeSlicer.h" - -#include - -namespace OrthancStone -{ - class IViewport; - /** - This class applies one "volume slicer" to a "3D volume", in order - to create one "2D scene layer" that will be set onto the "2D - scene". The style of the layer can be fine-tuned using a "layer - style configurator". The class only changes the layer if the - cutting plane has been modified since the last call to "Update()". - */ - class VolumeSceneLayerSource : public boost::noncopyable - { - private: - boost::shared_ptr viewport_; - int layerDepth_; - boost::shared_ptr slicer_; - std::unique_ptr configurator_; - std::unique_ptr lastPlane_; - uint64_t lastRevision_; - uint64_t lastConfiguratorRevision_; - bool layerInScene_; - - void ClearLayer(); - - public: - VolumeSceneLayerSource(boost::shared_ptr viewport, - int layerDepth, - const boost::shared_ptr& slicer); - - ~VolumeSceneLayerSource(); - - const IVolumeSlicer& GetSlicer() const - { - return *slicer_; - } - - void RemoveConfigurator(); - - void SetConfigurator(ILayerStyleConfigurator* configurator); - - bool HasConfigurator() const - { - return configurator_.get() != NULL; - } - - ILayerStyleConfigurator& GetConfigurator() const; - - /** - Make sure the Scene2D is protected from concurrent accesses before - calling this method. - - If the scene that has been supplied to the ctor is part of an IViewport, - you can lock the whole viewport data (including scene) by means of the - IViewport::Lock method. - */ - void Update(const CoordinateSystem3D& plane); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Wrappers/CairoContext.cpp --- a/Framework/Wrappers/CairoContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoContext.h" - -#include -#include - - -namespace OrthancStone -{ - CairoContext::CairoContext(CairoSurface& surface) : - width_(surface.GetWidth()), - height_(surface.GetHeight()) - { - context_ = cairo_create(surface.GetObject()); - if (!context_) - { - LOG(ERROR) << "Cannot create Cairo drawing context"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - CairoContext::~CairoContext() - { - if (context_ != NULL) - { - cairo_destroy(context_); - context_ = NULL; - } - } - - - void CairoContext::SetSourceColor(uint8_t red, - uint8_t green, - uint8_t blue) - { - cairo_set_source_rgb(context_, - static_cast(red) / 255.0f, - static_cast(green) / 255.0f, - static_cast(blue) / 255.0f); - } - - - class CairoContext::AlphaSurface : public boost::noncopyable - { - private: - cairo_surface_t *surface_; - - public: - AlphaSurface(unsigned int width, - unsigned int height) - { - surface_ = cairo_image_surface_create(CAIRO_FORMAT_A8, width, height); - - if (!surface_) - { - // Should never occur - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) - { - LOG(ERROR) << "Cannot create a Cairo surface"; - cairo_surface_destroy(surface_); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - ~AlphaSurface() - { - cairo_surface_destroy(surface_); - } - - void GetAccessor(Orthanc::ImageAccessor& target) - { - target.AssignWritable(Orthanc::PixelFormat_Grayscale8, - cairo_image_surface_get_width(surface_), - cairo_image_surface_get_height(surface_), - cairo_image_surface_get_stride(surface_), - cairo_image_surface_get_data(surface_)); - } - - void Blit(cairo_t* cr, - double x, - double y) - { - cairo_surface_mark_dirty(surface_); - cairo_mask_surface(cr, surface_, x, y); - cairo_fill(cr); - } - }; - - - void CairoContext::DrawText(const Orthanc::Font& font, - const std::string& text, - double x, - double y, - BitmapAnchor anchor) - { - // Render a bitmap containing the text - unsigned int width, height; - font.ComputeTextExtent(width, height, text); - - AlphaSurface surface(width, height); - - Orthanc::ImageAccessor accessor; - surface.GetAccessor(accessor); - font.Draw(accessor, text, 0, 0, 255); - - // Correct the text location given the anchor location - double deltaX, deltaY; - ComputeAnchorTranslation(deltaX, deltaY, anchor, width, height); - - // Cancel zoom/rotation before blitting the text onto the surface - double pixelX = x; - double pixelY = y; - cairo_user_to_device(context_, &pixelX, &pixelY); - - cairo_save(context_); - cairo_identity_matrix(context_); - - // Blit the text bitmap - surface.Blit(context_, pixelX + deltaX, pixelY + deltaY); - cairo_restore(context_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Wrappers/CairoContext.h --- a/Framework/Wrappers/CairoContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "CairoSurface.h" -#include "../StoneEnumerations.h" - -#include - -namespace OrthancStone -{ - // This is a RAII wrapper around the Cairo drawing context - class CairoContext : public boost::noncopyable - { - private: - class AlphaSurface; - - cairo_t* context_; - unsigned int width_; - unsigned int height_; - - public: - CairoContext(CairoSurface& surface); - - ~CairoContext(); - - cairo_t* GetObject() - { - return context_; - } - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - void SetSourceColor(uint8_t red, - uint8_t green, - uint8_t blue); - - void SetSourceColor(const uint8_t color[3]) - { - SetSourceColor(color[0], color[1], color[2]); - } - - void DrawText(const Orthanc::Font& font, - const std::string& text, - double x, - double y, - BitmapAnchor anchor); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Wrappers/CairoSurface.cpp --- a/Framework/Wrappers/CairoSurface.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CairoSurface.h" - -#include -#include -#include - -namespace OrthancStone -{ - void CairoSurface::Release() - { - if (surface_) - { - cairo_surface_destroy(surface_); - surface_ = NULL; - } - } - - - void CairoSurface::Allocate(unsigned int width, - unsigned int height, - bool hasAlpha) - { - Release(); - - hasAlpha_ = hasAlpha; - - surface_ = cairo_image_surface_create - (hasAlpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, width, height); - if (!surface_) - { - // Should never occur - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) - { - LOG(ERROR) << "Cannot create a Cairo surface"; - cairo_surface_destroy(surface_); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - width_ = width; - height_ = height; - pitch_ = cairo_image_surface_get_stride(surface_); - buffer_ = cairo_image_surface_get_data(surface_); - } - - - CairoSurface::CairoSurface(Orthanc::ImageAccessor& accessor, - bool hasAlpha) : - hasAlpha_(hasAlpha) - { - if (accessor.GetFormat() != Orthanc::PixelFormat_BGRA32) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); - } - - width_ = accessor.GetWidth(); - height_ = accessor.GetHeight(); - pitch_ = accessor.GetPitch(); - buffer_ = accessor.GetBuffer(); - - surface_ = cairo_image_surface_create_for_data - (reinterpret_cast(buffer_), - hasAlpha_ ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, - width_, height_, pitch_); - if (!surface_) - { - // Should never occur - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) - { - LOG(ERROR) << "Bad pitch for a Cairo surface"; - cairo_surface_destroy(surface_); - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - - void CairoSurface::SetSize(unsigned int width, - unsigned int height, - bool hasAlpha) - { - if (hasAlpha_ != hasAlpha || - width_ != width || - height_ != height) - { - Allocate(width, height, hasAlpha); - } - } - - - void CairoSurface::Copy(const CairoSurface& other) - { - SetSize(other.GetWidth(), other.GetHeight(), other.HasAlpha()); - - Orthanc::ImageAccessor source, target; - - other.GetReadOnlyAccessor(source); - GetWriteableAccessor(target); - - Orthanc::ImageProcessing::Copy(target, source); - - cairo_surface_mark_dirty(surface_); - } - - - void CairoSurface::Copy(const Orthanc::ImageAccessor& source, - bool hasAlpha) - { - SetSize(source.GetWidth(), source.GetHeight(), hasAlpha); - - Orthanc::ImageAccessor target; - GetWriteableAccessor(target); - - Orthanc::ImageProcessing::Convert(target, source); - - cairo_surface_mark_dirty(surface_); - } - - - void CairoSurface::GetReadOnlyAccessor(Orthanc::ImageAccessor& target) const - { - target.AssignReadOnly(Orthanc::PixelFormat_BGRA32, width_, height_, pitch_, buffer_); - } - - - void CairoSurface::GetWriteableAccessor(Orthanc::ImageAccessor& target) - { - target.AssignWritable(Orthanc::PixelFormat_BGRA32, width_, height_, pitch_, buffer_); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Framework/Wrappers/CairoSurface.h --- a/Framework/Wrappers/CairoSurface.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include -#include - -namespace OrthancStone -{ - class CairoSurface : public boost::noncopyable - { - private: - cairo_surface_t* surface_; - unsigned int width_; - unsigned int height_; - unsigned int pitch_; - void* buffer_; - bool hasAlpha_; - - void Release(); - - void Allocate(unsigned int width, - unsigned int height, - bool hasAlpha); - - public: - CairoSurface() : - surface_(NULL) - { - Allocate(0, 0, false); - } - - CairoSurface(unsigned int width, - unsigned int height, - bool hasAlpha) : - surface_(NULL) - { - Allocate(width, height, hasAlpha); - } - - CairoSurface(Orthanc::ImageAccessor& accessor, - bool hasAlpha); - - ~CairoSurface() - { - Release(); - } - - void SetSize(unsigned int width, - unsigned int height, - bool hasAlpha); - - void Copy(const CairoSurface& other); - - void Copy(const Orthanc::ImageAccessor& source, - bool hasAlpha); - - unsigned int GetWidth() const - { - return width_; - } - - unsigned int GetHeight() const - { - return height_; - } - - unsigned int GetPitch() const - { - return pitch_; - } - - const void* GetBuffer() const - { - return buffer_; - } - - void* GetBuffer() - { - return buffer_; - } - - cairo_surface_t* GetObject() - { - return surface_; - } - - bool HasAlpha() const - { - return hasAlpha_; - } - - void GetReadOnlyAccessor(Orthanc::ImageAccessor& target) const; - - void GetWriteableAccessor(Orthanc::ImageAccessor& target); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Docs/stone-object-model-reference.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Docs/stone-object-model-reference.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,429 @@ +## Scene2D and viewport-related object reference + +### `Scene2D` + +Represents a collection of layers that display 2D data. + +These layers must implement `ISceneLayer` + +The layers must be created externally and set to a specific Z-order index +with the `SetLayer` method. + +The `Scene2D` object merely acts as a layer container. It has no rendering +or layer creation facility on its own. + +The `Scene2D` contains an `AffineTransform2D` structure that defines how +the various layer item coordinates are transformed before being displayed +on the viewport (aka canvas) + +It is up to each layer type-specific renderer to choose how this transformation +is used. See the various kinds of layer below for more details. + +Examining the `Scene2D` contents can be done either by implementing the +`Scene2D::IVisitor` interface and calling `Apply(IVisitor& visitor)` or by +iterating between `GetMinDepth()` and `GetMaxDepth()` and calling the +`ISceneLayer& GetLayer(int depth)` getter. + +### `ISceneLayer` + +Interface that must be implemented by `Scene2D` layers. This is a closed list +that, as of 2020-03, contains: + +``` + Type_InfoPanel, + Type_ColorTexture, + Type_Polyline, + Type_Text, + Type_FloatTexture, + Type_LookupTableTexture +``` + +Please note that this interface mandates the implementation of a `GetRevision` +method returning an `uint64_t`. + +The idea is that when a model gets converted to a set of `ISceneLayer` +instances, changes in the model that result in changes to the layers must +increase the revision number of these layers. + +That allows the rendering process to safely assume that a given layers whose +revision does not change hasn't been modified (this helps with caching). + +Every mutable method in `ISceneLayer` instances that possibly change the visual +representation of an `ISceneLayer` must increase this revision number. + +### Implementation: `FloatTextureSceneLayer` + +Layer that renders an `Orthanc::ImageAccessor` object that must be convertible +to `Float32` image. + +The constructor only uses the image accessor to perform a copy. It can safely +be deleted afterwards. + +The input values are mapped to the output values by taking into account various +properties that can be modified with: + +- `SetWindowing`: uses windowing presets like "bone" or "lung" +- `SetCustomWindowing`: with manual window center and width +- `SetInverted`: toggles black <-> white inversion after windowing +- `SetApplyLog`: uses a non-linear response curve described in + https://theailearner.com/2019/01/01/log-transformation/ that expands contrast + in dark areas while compressing contrast in bright ones. This is **not** + implemented in the OpenGL renderer! + +The corresponding renderers are `OpenGLFloatTextureRenderer` and +`CairoFloatTextureRenderer`. The scene transformation is applied during +rendering. + +### Implementation: `ColorTextureSceneLayer` + +Layer that renders an `Orthanc::ImageAccessor` object an RGBA image (alpha must +be premultiplied). + +The constructor only uses the image accessor to perform a copy. It can safely +be deleted afterwards. + +The corresponding renderers are `OpenGLColorTextureRenderer` and +`CairoColorTextureRenderer`. The scene transformation is applied during +rendering. + +### Implementation: `LookupTableTextureSceneLayer` + +Layer that renders an `Orthanc::ImageAccessor` object that must be convertible +to `Float32` image. + +The constructor only uses the image accessor to perform a copy. It can safely +be deleted afterwards. + +The final on-screen color of each pixel is determined by passing the input +`Float32` value through a 256-entry look-up table (LUT) that can be passed as +an array of either 256 x 3 bytes (for opaque RGB colors) or 256 x 4 bytes (for +RGBA pixels). The LUT is not specified at construction time, but with +calls to `SetLookupTable` or `SetLookupTableGrayscale` (that fills the LUT +with a gradient from black to white, fully opaque) + +The range of input values that is mapped to the entirety of the LUT is, by +default, the full image range, but can be customized with `SetRange`. + +The corresponding renderers are `OpenGLLookupTableTextureRenderer` and +`CairoLookupTableTextureRenderer`. The scene transformation is applied during +rendering. + +### Implementation: `PolylineSceneLayer` + +Layer that renders vector-based polygonal lines. + +Polylines can be added with the `AddChain` method, that accepts a `Chain`, that +is a typedef to `std::vector`, a flag to specify whether the +chain must be automatically close (last point of the vector connected to the +first one) and the chain color (a `Color` structure). + +Please note that the line thickness is, contrary to the color, specified +per-chain but rather per-layer. + +If you need multiple line thicknesses, multiple `PolylineSceneLayer` must be +created. + +The corresponding renderers are `OpenGLAdvancedPolylineRenderer` and +`CairoPolylineRenderer`. The scene transformation is applied during +rendering. + +### Implementation: `TextSceneLayer` + +This layers renders a paragraph of text. + +The inputs to the layer can be changed after creation and are: +- The text iself, supplied as an UTF-8 encoded string in `SetText` +- The font used for rendering, set by `SetFontIndex`. +- The text anchoring, through `SetAnchor`: the text can be anchored to + various positions, such as top lef, center, bottom center,... These + various anchors are part of the `BitmapAnchor` enumeration. +- The text position, relative to its anchor, through `SetPosition`. + +The font is supplied as an index. This is an index in the set of fonts +that has been registered in the viewport compositor. The following code +shows how to set such a font: + +``` +std::unique_ptr lock(viewport_.Lock()); +lock->GetCompositor().SetFont(0, + Orthanc::EmbeddedResources::UBUNTU_FONT, + 32, Orthanc::Encoding_Latin1); +// where 32 is the font size in pixels +``` + +This call uses the embedded `UBUNTU_FONT` resource that has been defined in +the `CMakeLists.txt` file with: + +``` +EmbedResources( + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf +) +``` + +Please note that you must supply a font: there is no default font provided by +the OpenGL or Cairo compositors. + +The corresponding renderers are `OpenGLTextRenderer` and +`CairoTextRenderer`. The scene transformation is not applied during rendering, +because the text anchoring, position and scaling are computed relative to the +viewport/canvas. + +### Implementation: `InfoPanelSceneLayer` + +This layer is designed to display an image, supplied through an +`Orthanc::ImageAccessor` reference (only used at construction time). + +The image is not transformed according to the normal layer transformation but +is rather positioned relative to the canvas, with the same mechanism as the +`TextSceneLayer` described above. + +The image position is specified with the sole means of the `SetAnchor` method. + +The corresponding renderers are `OpenGLInfoPanelRenderer` and +`CairoInfoPanelRenderer`. + +### `IViewport` + +https://bitbucket.org/sjodogne/orthanc-stone/src/broker/Framework/Viewport/IViewport.h + +(**not** the one in `Deprecated`) +- Implemented by classes that: + - manage the on-screen display of a `Scene2D` trough a compositor. + - Own the `ICompositor` object that performs the rendering. + - Own the `Scene2D` (TODO: currently through `ViewportController` --> `Scene2D`) + - Provide a `Lock` method that returns a RAII, that must be kept alive when + modifying the underlying objects (controller, compositor, scene), but not + longer. + +#### Implementation: `SdlOpenGLViewport` +- Implementation of a viewport rendered on a SDL window, that uses OpenGL for + rendering. +- Instantiating this object creates an SDL window. Automatic scaling for hiDPI + displays can be toggled on or off. + +#### Implementation: `WebGLViewport` +- Implementation of a viewport rendered on a DOM canvas, that uses OpenGL for + rendering. +- Contrary to the SDL OpenGL viewport, the canvas must already be existing + when the ctor is called. + +### `ICompositor` +The interface providing a rendering service for `Scene2D` objects. + +**Subclasses:** `CairoCompositor`, `OpenGLCompositor` + +You do not need to create compositor instances. They are created for you when +instantiating a viewport. + +### `ViewportController` +This concrete class is instantiated by its `IViewport` owner. + +**TODO:** its functionality is not well defined and should be moved into the +viewport base class. Support for measuring tools should be moved to a special +interactor. + +- contains: + - array of `MeasureTool` + - ref to `IViewport` + - `activeTracker_` + - owns a `Scene2D` + - weak ref to `UndoStack` + - cached `canvasToSceneFactor_` + +- contains logic to: + - pass commands to undostack (trivial) + - logic to locate `MeasureTool` in the HitTest + - OTOH, the meat of the measuring tool logic (highlighting etc..) is + done in app-specific code (`VolumeSlicerWidget`) + - accept new Scene transform and notify listeners + - **the code that uses the interactor** (`HandleMousePress`) is only + called by the new `WebAssemblyViewport` !!! **TODO** clean this mess + +### `IViewportInteractor` +- must provide logic to respond to `CreateTracker` + +### `DefaultViewportInteractor` +- provides Pan+Rotate+Zoom trackers + +### `WebGLViewportsRegistry` + +This class is a singleton (accessible through `GetWebGLViewportsRegistry()` +that deals with context losses in the WebGL contexts. + +You use it by creating a WebGLViewport in the following fashion: + +``` +boost::shared_ptr viewport( + OrthancStone::GetWebGLViewportsRegistry().Add(canvasId)); +``` + +## Source data related + +### `IVolumeSlicer` + +A very simple interface with a single method: +`IVolumeSlicer::IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane)` + +### `IVolumeSlicer::IExtractedSlice` + +On a slice has been extracted from a volume by an `IVolumeSlicer`, it can +report its *revision number*. + +If another call to `ExtractSlice` with the same cutting plane is made, but +the returned slice revision is different, it means that the volume has +changed and the scene layer must be refreshed. + +Please see `VolumeSceneLayerSource::Update` to check how this logic is +implemented. + + +### `OrthancSeriesVolumeProgressiveLoader` + +This class implements `IVolumeSlicer` (and `IObservable`) and can be used to +load a volume stored in a Dicom series on an Orthanc server. + +Over the course of the series loading, various notifications are sent: + +The first one is `OrthancStone::DicomVolumeImage::GeometryReadyMessage` that +is sent when the volume extent and geometric properties are known. + +Then, as slices get loaded and the volume is filled, +`OrthancStone::DicomVolumeImage::ContentUpdatedMessage` are sent. + +Once all the highest-quality slices have been loaded, the +`OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality` +notification is sent. + +Please note that calling `ExtractSlice` *before* the geometry is loaded will +yield an instance of `InvalidSlice` that cannot be used to create a layer. + +On the other hand, + +### `VolumeSceneLayerSource` + +This class makes the bridge between a volume (supplied by an `IVolumeSlicer` +interface) and a `Scene2D`. + +Please note that the bulk of the work is done the objects implementing +`IVolumeSlicer` and this object merely connects things together. + +For instance, deciding whether an image (texture) or vector (polyline) layer +is done by the `IVolumeSlicer` implementation. + +- contains: + - reference to Scene2D + - `layerIndex_` (fixed at ctor) that is the index, in the Scene2D layer + stack, of the layer that will be created/updated + - `IVolumeSlicer` + +- contains logic to: + - extract a slice from the slicer and set/refresh the Scene2D layer at + the supplied `layerIndex_` + - refresh this based on the slice revision or configuration revision + - accept a configuration that will be applied to the layer + - the `Update()` method will + +## Updates and the configurators + +`ISceneLayer` does not expose mutable methods. + +The way to change a layer once it has been created is through configurator +objets. + +If you plan to set (even only once) or modify some layer properties after +layer creation, you need to create a matching configurator objet. + +For instance, in the `VolumeSceneLayerSource`, the `SetConfigurator` method +will store a `ILayerStyleConfigurator* configurator_`. + +In the `OrthancView` ctor, you can see how it is used: + +``` +std::unique_ptr style( + new GrayscaleStyleConfigurator); + +style->SetLinearInterpolation(true); + +...... + +std::unique_ptr config( + new LookupTableStyleConfigurator); + +config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); + +``` + +The configurator type are created according to the type of layer.ΒΈ + +Later, in `VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane)`, +if the cutting plane has **not** changed and if the layer revision has **not** +changed, we test `configurator_->GetRevision() != lastConfiguratorRevision_` +and, if different, we call `configurator_->ApplyStyle(scene_.GetLayer(layerDepth_));` + +This allows to change layer properties that do not depend on the layer model +contents. + +On the other hand, if the layer revision has changed, when compared to the +last time it has been rendered (stored in `lastRevision_`), then we need to +ask the slice to create a brand new layer. + +Another way to see it is that layer rendering depend on model data and view +data. The model data is not mutable in the layer and, if the model changes, the +layer must be recreated. + +If only the view properties change (the configurator), we call ApplyStyle +(that **will** mutate some of the layer internals) + +Please note that the renderer does **not** know about the configurator : the +renderer uses properies in the layer and does not care whether those have +been set once at construction time or at every frame (configuration time). + + +## Cookbook + +### Simple application + +#### Building + +In order to create a Stone application, you need to: + +- CMake-based application: + ``` + include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneConfiguration.cmake) + ``` + with this library target that you have to define: + ``` + add_library(OrthancStone STATIC ${ORTHANC_STONE_SOURCES}) + ``` + then link with this library: + ``` + target_link_libraries(MyStoneApplication OrthancStone) + ``` + +Building is supported with emscripten, Visual C++ (>= 9.0), gcc... + +emscripten recommended version >= 1.38.41 + +These are very rough guidelines. See the `Samples` folder for actual examples. + +#### Structure + +The code requires a loader (object that ) + +Initialize: + +``` +Orthanc::Logging::Initialize(); +Orthanc::Logging::EnableInfoLevel(true); +``` +Call, in WASM: +``` +DISPATCH_JAVASCRIPT_EVENT("StoneInitialized"); +``` + +# Notes + +- It is NOT possible to abandon the existing loaders : they contain too much loader-specific getters + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/CairoConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/CairoConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,257 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +# ./configure --disable-pdf --disable-svg --disable-xlib --disable-xcb --disable-script --disable-ps --disable-ft --disable-fc --disable-png --disable-trace --disable-interpreter + + +if (STATIC_BUILD OR NOT USE_SYSTEM_CAIRO) + SET(CAIRO_SOURCES_DIR ${CMAKE_BINARY_DIR}/cairo-1.14.12) + SET(CAIRO_URL "http://orthanc.osimis.io/ThirdPartyDownloads/cairo-1.14.12.tar.xz") + SET(CAIRO_MD5 "9f0db9dbfca0966be8acd682e636d165") + + DownloadPackage(${CAIRO_MD5} ${CAIRO_URL} "${CAIRO_SOURCES_DIR}") + + file(COPY + ${CMAKE_CURRENT_LIST_DIR}/cairo-features.h + DESTINATION ${CAIRO_SOURCES_DIR}/src + ) + + set(CAIRO_SOURCES + ${CAIRO_SOURCES_DIR}/src/cairo-analysis-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-arc.c + ${CAIRO_SOURCES_DIR}/src/cairo-array.c + ${CAIRO_SOURCES_DIR}/src/cairo-atomic.c + ${CAIRO_SOURCES_DIR}/src/cairo-base64-stream.c + ${CAIRO_SOURCES_DIR}/src/cairo-base85-stream.c + ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann.c + ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann-rectangular.c + ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann-rectilinear.c + ${CAIRO_SOURCES_DIR}/src/cairo-botor-scan-converter.c + ${CAIRO_SOURCES_DIR}/src/cairo-boxes.c + ${CAIRO_SOURCES_DIR}/src/cairo-boxes-intersect.c + ${CAIRO_SOURCES_DIR}/src/cairo.c + ${CAIRO_SOURCES_DIR}/src/cairo-cache.c + ${CAIRO_SOURCES_DIR}/src/cairo-cff-subset.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip-boxes.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip-polygon.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip-region.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-clip-tor-scan-converter.c + # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-context.c + # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-gradient.c + # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-utils.c + ${CAIRO_SOURCES_DIR}/src/cairo-color.c + ${CAIRO_SOURCES_DIR}/src/cairo-composite-rectangles.c + ${CAIRO_SOURCES_DIR}/src/cairo-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-contour.c + ${CAIRO_SOURCES_DIR}/src/cairo-damage.c + ${CAIRO_SOURCES_DIR}/src/cairo-debug.c + ${CAIRO_SOURCES_DIR}/src/cairo-default-context.c + ${CAIRO_SOURCES_DIR}/src/cairo-deflate-stream.c + ${CAIRO_SOURCES_DIR}/src/cairo-device.c + # ${CAIRO_SOURCES_DIR}/src/cairo-directfb-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-egl-context.c + ${CAIRO_SOURCES_DIR}/src/cairo-error.c + ${CAIRO_SOURCES_DIR}/src/cairo-fallback-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-fixed.c + ${CAIRO_SOURCES_DIR}/src/cairo-font-face.c + ${CAIRO_SOURCES_DIR}/src/cairo-font-face-twin.c + ${CAIRO_SOURCES_DIR}/src/cairo-font-face-twin-data.c + ${CAIRO_SOURCES_DIR}/src/cairo-font-options.c + ${CAIRO_SOURCES_DIR}/src/cairo-freed-pool.c + ${CAIRO_SOURCES_DIR}/src/cairo-freelist.c + # ${CAIRO_SOURCES_DIR}/src/cairo-ft-font.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-composite.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-device.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-dispatch.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-glyphs.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-gradient.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-info.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-msaa-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-operand.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-shaders.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-source.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-spans-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-gl-traps-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-glx-context.c + ${CAIRO_SOURCES_DIR}/src/cairo-gstate.c + ${CAIRO_SOURCES_DIR}/src/cairo-hash.c + ${CAIRO_SOURCES_DIR}/src/cairo-hull.c + ${CAIRO_SOURCES_DIR}/src/cairo-image-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-image-info.c + ${CAIRO_SOURCES_DIR}/src/cairo-image-source.c + ${CAIRO_SOURCES_DIR}/src/cairo-image-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-line.c + ${CAIRO_SOURCES_DIR}/src/cairo-lzw.c + ${CAIRO_SOURCES_DIR}/src/cairo-mask-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-matrix.c + ${CAIRO_SOURCES_DIR}/src/cairo-mempool.c + ${CAIRO_SOURCES_DIR}/src/cairo-mesh-pattern-rasterizer.c + ${CAIRO_SOURCES_DIR}/src/cairo-misc.c + ${CAIRO_SOURCES_DIR}/src/cairo-mono-scan-converter.c + ${CAIRO_SOURCES_DIR}/src/cairo-mutex.c + ${CAIRO_SOURCES_DIR}/src/cairo-no-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-observer.c + # ${CAIRO_SOURCES_DIR}/src/cairo-os2-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-output-stream.c + ${CAIRO_SOURCES_DIR}/src/cairo-paginated-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-bounds.c + ${CAIRO_SOURCES_DIR}/src/cairo-path.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-fill.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-fixed.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-in-fill.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-boxes.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-polygon.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-traps.c + ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-tristrip.c + ${CAIRO_SOURCES_DIR}/src/cairo-pattern.c + # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-operators.c + # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-shading.c + # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-pen.c + # ${CAIRO_SOURCES_DIR}/src/cairo-png.c + ${CAIRO_SOURCES_DIR}/src/cairo-polygon.c + ${CAIRO_SOURCES_DIR}/src/cairo-polygon-intersect.c + ${CAIRO_SOURCES_DIR}/src/cairo-polygon-reduce.c + # ${CAIRO_SOURCES_DIR}/src/cairo-ps-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-font.c + # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-image-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-raster-source-pattern.c + ${CAIRO_SOURCES_DIR}/src/cairo-recording-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-rectangle.c + ${CAIRO_SOURCES_DIR}/src/cairo-rectangular-scan-converter.c + ${CAIRO_SOURCES_DIR}/src/cairo-region.c + ${CAIRO_SOURCES_DIR}/src/cairo-rtree.c + ${CAIRO_SOURCES_DIR}/src/cairo-scaled-font.c + ${CAIRO_SOURCES_DIR}/src/cairo-scaled-font-subsets.c + # ${CAIRO_SOURCES_DIR}/src/cairo-script-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-shape-mask-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-slope.c + ${CAIRO_SOURCES_DIR}/src/cairo-spans.c + ${CAIRO_SOURCES_DIR}/src/cairo-spans-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-spline.c + ${CAIRO_SOURCES_DIR}/src/cairo-stroke-dash.c + ${CAIRO_SOURCES_DIR}/src/cairo-stroke-style.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-clipper.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-fallback.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-observer.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-offset.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-snapshot.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-subsurface.c + ${CAIRO_SOURCES_DIR}/src/cairo-surface-wrapper.c + # ${CAIRO_SOURCES_DIR}/src/cairo-svg-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-tee-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-time.c + ${CAIRO_SOURCES_DIR}/src/cairo-tor22-scan-converter.c + ${CAIRO_SOURCES_DIR}/src/cairo-tor-scan-converter.c + ${CAIRO_SOURCES_DIR}/src/cairo-toy-font-face.c + ${CAIRO_SOURCES_DIR}/src/cairo-traps.c + ${CAIRO_SOURCES_DIR}/src/cairo-traps-compositor.c + ${CAIRO_SOURCES_DIR}/src/cairo-tristrip.c + ${CAIRO_SOURCES_DIR}/src/cairo-truetype-subset.c + ${CAIRO_SOURCES_DIR}/src/cairo-type1-fallback.c + ${CAIRO_SOURCES_DIR}/src/cairo-type1-glyph-names.c + ${CAIRO_SOURCES_DIR}/src/cairo-type1-subset.c + ${CAIRO_SOURCES_DIR}/src/cairo-type3-glyph-surface.c + ${CAIRO_SOURCES_DIR}/src/cairo-unicode.c + ${CAIRO_SOURCES_DIR}/src/cairo-user-font.c + ${CAIRO_SOURCES_DIR}/src/cairo-version.c + # ${CAIRO_SOURCES_DIR}/src/cairo-vg-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-wgl-context.c + ${CAIRO_SOURCES_DIR}/src/cairo-wideint.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-core.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-render.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-shm.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-resources.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-screen.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-shm.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface-core.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface-render.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-core-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-display.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-fallback-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-render-compositor.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-screen.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-source.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-surface-shm.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-visual.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-xcb-surface.c + # ${CAIRO_SOURCES_DIR}/src/cairo-xml-surface.c + ) + + include_directories(${CAIRO_SOURCES_DIR}/src) + + set(CAIRO_DEFINITIONS "HAS_PIXMAN_GLYPHS=1") + + if (${CMAKE_SYSTEM_NAME} STREQUAL "PNaCl") + # Disable vectorized instructions when targeting archicture-independent PNaCl + set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=1;HAVE_UINT64_T=1") + + elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "Android") + # Disable vectorized instructions and threading if targeting asm.js + set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=0;CAIRO_NO_MUTEX=1;HAVE_UINT64_T=1") + + elseif (CMAKE_COMPILER_IS_GNUCXX OR + CMAKE_SYSTEM_NAME STREQUAL "Darwin") + + set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=1;HAVE_UINT64_T=1;CAIRO_HAS_REAL_PTHREAD=1;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_FLOAT128") + + if (CMAKE_COMPILER_IS_GNUCXX) + set_property( + SOURCE ${CAIRO_SOURCES} + PROPERTY COMPILE_FLAGS "-Wno-attributes" + ) + endif() + + elseif (MSVC) + # The cairo source code comes with built-in support for Visual Studio + + else() + message(FATAL_ERROR "Support your platform here") + + endif() + + + if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + # Explicitly request static building on Windows + add_definitions(-DCAIRO_WIN32_STATIC_BUILD=1) + endif() + + + set_property( + SOURCE ${CAIRO_SOURCES} + PROPERTY COMPILE_DEFINITIONS "${CAIRO_DEFINITIONS}" + ) + +else() + + pkg_search_module(CAIRO REQUIRED cairo) + include_directories(${CAIRO_INCLUDE_DIRS}) + link_libraries(${CAIRO_LIBRARIES}) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/FreetypeConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/FreetypeConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,87 @@ +if (STATIC_BUILD OR NOT USE_SYSTEM_FREETYPE) + set(FREETYPE_SOURCES_DIR ${CMAKE_BINARY_DIR}/freetype-2.9.1) + set(FREETYPE_URL "http://orthanc.osimis.io/ThirdPartyDownloads/freetype-2.9.1.tar.gz") + set(FREETYPE_MD5 "3adb0e35d3c100c456357345ccfa8056") + + DownloadPackage(${FREETYPE_MD5} ${FREETYPE_URL} "${FREETYPE_SOURCES_DIR}") + + include_directories(BEFORE + ${FREETYPE_SOURCES_DIR}/include/ + ) + + add_definitions( + -DFT2_BUILD_LIBRARY + -DFT_CONFIG_OPTION_NO_ASSEMBLER + ) + + set(FREETYPE_SOURCES + ${FREETYPE_SOURCES_DIR}/src/autofit/autofit.c + ${FREETYPE_SOURCES_DIR}/src/base/ftbase.c + ${FREETYPE_SOURCES_DIR}/src/base/ftbbox.c + ${FREETYPE_SOURCES_DIR}/src/base/ftbdf.c + ${FREETYPE_SOURCES_DIR}/src/base/ftbitmap.c + ${FREETYPE_SOURCES_DIR}/src/base/ftcid.c + ${FREETYPE_SOURCES_DIR}/src/base/ftfstype.c + ${FREETYPE_SOURCES_DIR}/src/base/ftgasp.c + ${FREETYPE_SOURCES_DIR}/src/base/ftglyph.c + ${FREETYPE_SOURCES_DIR}/src/base/ftgxval.c + ${FREETYPE_SOURCES_DIR}/src/base/ftinit.c + ${FREETYPE_SOURCES_DIR}/src/base/ftmm.c + ${FREETYPE_SOURCES_DIR}/src/base/ftotval.c + ${FREETYPE_SOURCES_DIR}/src/base/ftpatent.c + ${FREETYPE_SOURCES_DIR}/src/base/ftpfr.c + ${FREETYPE_SOURCES_DIR}/src/base/ftstroke.c + ${FREETYPE_SOURCES_DIR}/src/base/ftsynth.c + ${FREETYPE_SOURCES_DIR}/src/base/ftsystem.c + ${FREETYPE_SOURCES_DIR}/src/base/fttype1.c + ${FREETYPE_SOURCES_DIR}/src/base/ftwinfnt.c + ${FREETYPE_SOURCES_DIR}/src/bdf/bdf.c + ${FREETYPE_SOURCES_DIR}/src/bzip2/ftbzip2.c + ${FREETYPE_SOURCES_DIR}/src/cache/ftcache.c + ${FREETYPE_SOURCES_DIR}/src/cff/cff.c + ${FREETYPE_SOURCES_DIR}/src/cid/type1cid.c + ${FREETYPE_SOURCES_DIR}/src/gzip/ftgzip.c + ${FREETYPE_SOURCES_DIR}/src/lzw/ftlzw.c + ${FREETYPE_SOURCES_DIR}/src/pcf/pcf.c + ${FREETYPE_SOURCES_DIR}/src/pfr/pfr.c + ${FREETYPE_SOURCES_DIR}/src/psaux/psaux.c + ${FREETYPE_SOURCES_DIR}/src/pshinter/pshinter.c + ${FREETYPE_SOURCES_DIR}/src/psnames/psnames.c + ${FREETYPE_SOURCES_DIR}/src/raster/raster.c + ${FREETYPE_SOURCES_DIR}/src/sfnt/sfnt.c + ${FREETYPE_SOURCES_DIR}/src/smooth/smooth.c + ${FREETYPE_SOURCES_DIR}/src/truetype/truetype.c + ${FREETYPE_SOURCES_DIR}/src/type1/type1.c + ${FREETYPE_SOURCES_DIR}/src/type42/type42.c + ${FREETYPE_SOURCES_DIR}/src/winfonts/winfnt.c + ) + + if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + list(APPEND FREETYPE_SOURCES + ${FREETYPE_SOURCES_DIR}/builds/windows/ftdebug.c + ) + endif() + + foreach(header + ${FREETYPE_SOURCES_DIR}/include/freetype/config/ftconfig.h + ${FREETYPE_SOURCES_DIR}/include/freetype/config/ftoption.h + ) + + set_source_files_properties( + ${FREETYPE_SOURCES} + PROPERTIES OBJECT_DEPENDS ${header} + ) + endforeach() + + source_group(ThirdParty\\Freetype REGULAR_EXPRESSION ${FREETYPE_SOURCES_DIR}/.*) + +else() + include(FindFreetype) + + if (NOT FREETYPE_FOUND) + message(FATAL_ERROR "Please install the libfreetype6-dev package") + endif() + + include_directories(${FREETYPE_INCLUDE_DIRS}) + link_libraries(${FREETYPE_LIBRARIES}) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/GlewConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/GlewConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +if (STATIC_BUILD OR NOT USE_SYSTEM_GLEW) + SET(GLEW_SOURCES_DIR ${CMAKE_BINARY_DIR}/glew-2.1.0) + SET(GLEW_URL "http://orthanc.osimis.io/ThirdPartyDownloads/glew-2.1.0.tgz") + SET(GLEW_MD5 "b2ab12331033ddfaa50dc39345343980") + DownloadPackage(${GLEW_MD5} ${GLEW_URL} "${GLEW_SOURCES_DIR}") + + set(GLEW_SOURCES + ${GLEW_SOURCES_DIR}/src/glew.c + ) + + include_directories(${GLEW_SOURCES_DIR}/include) + + add_definitions( + -DGLEW_STATIC=1 + ) + +else() + include(FindGLEW) + if (NOT GLEW_FOUND) + message(FATAL_ERROR "Please install the libglew-dev package") + endif() + + include_directories(${GLEW_INCLUDE_DIRS}) + link_libraries(${GLEW_LIBRARIES}) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/LinuxStandardBaseUic.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/LinuxStandardBaseUic.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import subprocess +import sys + +if len(sys.argv) <= 1: + sys.stderr.write('Please provide arguments for uic\n') + sys.exit(-1) + +path = '' +pos = 1 +while pos < len(sys.argv): + if sys.argv[pos].startswith('-'): + pos += 2 + else: + path = sys.argv[pos] + break + +if len(path) == 0: + sys.stderr.write('Unable to find the input file in the arguments to uic\n') + sys.exit(-1) + +with open(path, 'r') as f: + lines = f.read().split('\n') + if (len(lines) > 1 and + lines[0].startswith('. + + + +##################################################################### +## Configure the Orthanc Framework +##################################################################### + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + include(${CMAKE_CURRENT_LIST_DIR}/../Orthanc/CMake/DownloadOrthancFramework.cmake) + link_libraries(${ORTHANC_FRAMEWORK_LIBRARIES}) + + # Switch to the C++11 standard if the version of JsonCpp is 1.y.z + if (EXISTS ${JSONCPP_INCLUDE_DIR}/json/version.h) + file(STRINGS + "${JSONCPP_INCLUDE_DIR}/json/version.h" + JSONCPP_VERSION_MAJOR1 REGEX + ".*define JSONCPP_VERSION_MAJOR.*") + + if (NOT JSONCPP_VERSION_MAJOR1) + message(FATAL_ERROR "Unable to extract the major version of JsonCpp") + endif() + + string(REGEX REPLACE + ".*JSONCPP_VERSION_MAJOR.*([0-9]+)$" "\\1" + JSONCPP_VERSION_MAJOR ${JSONCPP_VERSION_MAJOR1}) + message("JsonCpp major version: ${JSONCPP_VERSION_MAJOR}") + + if (JSONCPP_VERSION_MAJOR GREATER 0) + message("Switching to C++11 standard") + if (CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + endif() + endif() + endif() + +else() + if (ENABLE_DCMTK) + set(ENABLE_LOCALE ON) + else() + if (NOT DEFINED ENABLE_LOCALE) + set(ENABLE_LOCALE OFF) # Disable support for locales (notably in Boost) + endif() + endif() + + include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkConfiguration.cmake) + include_directories( + ${ORTHANC_FRAMEWORK_ROOT}/Sources/ + ) +endif() + + +##################################################################### +## Sanity check of the configuration +##################################################################### + +if (ORTHANC_SANDBOXED) + if (ENABLE_CURL) + message(FATAL_ERROR "Cannot enable curl in sandboxed environments") + endif() + + if (ENABLE_SDL) + message(FATAL_ERROR "Cannot enable SDL in sandboxed environments") + endif() + + if (ENABLE_SSL) + message(FATAL_ERROR "Cannot enable SSL in sandboxed environments") + endif() +endif() + +if (ENABLE_OPENGL) + if (NOT ENABLE_SDL AND NOT ENABLE_WASM) + message(FATAL_ERROR "Cannot enable OpenGL if WebAssembly and SDL are both disabled") + endif() +endif() + +if (ENABLE_WASM) + if (NOT ORTHANC_SANDBOXED) + message(FATAL_ERROR "WebAssembly target must me configured as sandboxed") + endif() + + if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + message(FATAL_ERROR "WebAssembly target requires the emscripten compiler") + endif() + + set(ENABLE_THREADS OFF) + add_definitions(-DORTHANC_ENABLE_WASM=1) +else() + if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR + CMAKE_SYSTEM_NAME STREQUAL "PNaCl" OR + CMAKE_SYSTEM_NAME STREQUAL "NaCl32" OR + CMAKE_SYSTEM_NAME STREQUAL "NaCl64") + message(FATAL_ERROR "Trying to use a Web compiler for a native build") + endif() + + set(ENABLE_THREADS ON) + add_definitions(-DORTHANC_ENABLE_WASM=0) +endif() + + +##################################################################### +## Configure mandatory third-party components +##################################################################### + +include(FindPkgConfig) +include(${CMAKE_CURRENT_LIST_DIR}/CairoConfiguration.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/FreetypeConfiguration.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/PixmanConfiguration.cmake) + + + +##################################################################### +## Configure optional third-party components +##################################################################### + +if (NOT ORTHANC_SANDBOXED) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp + ) +endif() + + +if(ENABLE_SDL) + message("SDL is enabled") + include(${CMAKE_CURRENT_LIST_DIR}/SdlConfiguration.cmake) + add_definitions( + -DORTHANC_ENABLE_SDL=1 + ) +else() + message("SDL is disabled") + unset(USE_SYSTEM_SDL CACHE) + add_definitions( + -DORTHANC_ENABLE_SDL=0 + ) +endif() + + +if (ENABLE_THREADS) + add_definitions(-DORTHANC_ENABLE_THREADS=1) +else() + add_definitions(-DORTHANC_ENABLE_THREADS=0) +endif() + + +if (ENABLE_OPENGL AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + include(${CMAKE_CURRENT_LIST_DIR}/GlewConfiguration.cmake) + add_definitions( + -DORTHANC_ENABLE_GLEW=1 + ) +else() + add_definitions( + -DORTHANC_ENABLE_GLEW=0 + ) +endif() + + +if (ENABLE_OPENGL) + if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + # If including "FindOpenGL.cmake" using Emscripten (targeting + # WebAssembly), the "OPENGL_LIBRARIES" value incorrectly includes + # the "nul" library, which leads to warning message in Emscripten: + # 'shared:WARNING: emcc: cannot find library "nul"'. + include(FindOpenGL) + if (NOT OPENGL_FOUND) + message(FATAL_ERROR "Cannot find OpenGL on your system") + endif() + + link_libraries(${OPENGL_LIBRARIES}) + endif() + + add_definitions( + -DORTHANC_ENABLE_OPENGL=1 + ) +else() + add_definitions(-DORTHANC_ENABLE_OPENGL=0) +endif() + + + +##################################################################### +## Configuration of the C/C++ macros +##################################################################### + +if (MSVC) + # Remove some warnings on Visual Studio 2015 + add_definitions(-D_SCL_SECURE_NO_WARNINGS=1) +endif() + +add_definitions( + -DHAS_ORTHANC_EXCEPTION=1 + ) + +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + add_definitions(-DCHECK_OBSERVERS_MESSAGES) +endif() + + + +##################################################################### +## System-specific patches +##################################################################### + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND + NOT MSVC AND + ENABLE_SDL) + # This is necessary when compiling EXE for Windows using MinGW + link_libraries(mingw32) +endif() + +if (ORTHANC_SANDBOXED) + # Remove functions not suitable for a sandboxed environment + list(REMOVE_ITEM ORTHANC_CORE_SOURCES + ${ZLIB_SOURCES_DIR}/gzlib.c + ${ZLIB_SOURCES_DIR}/gzwrite.c + ${ZLIB_SOURCES_DIR}/gzread.c + ) +endif() + + + +##################################################################### +## All the source files required to build Stone of Orthanc +##################################################################### + +if (NOT ORTHANC_SANDBOXED) + set(PLATFORM_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Loaders/GenericLoadersContext.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/GenericLoadersContext.h + ) + + if (ENABLE_SDL) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlWindow.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlWindow.h + ) + endif() + + if (ENABLE_SDL) + if (ENABLE_OPENGL) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/SdlOpenGLContext.cpp + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/SdlOpenGLContext.h + ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlViewport.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlViewport.h + ) + endif() + endif() +endif() + + +if (ENABLE_DCMTK) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomSuccessMessage.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ParsedDicomCache.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ParsedDicomDataset.cpp + ) +endif() + +if (ENABLE_THREADS) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Oracle/ThreadedOracle.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/GenericOracleRunner.cpp + ) +endif() + + +if (ENABLE_WASM) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Loaders/WebAssemblyLoadersContext.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/WebAssemblyOracle.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyCairoViewport.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyViewport.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyViewport.h + ) +endif() + +if ((ENABLE_SDL OR ENABLE_WASM) AND ENABLE_GUIADAPTER) + list(APPEND APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Deprecated/GuiAdapter.cpp + ${ORTHANC_STONE_ROOT}/Sources/Deprecated/GuiAdapter.h + ) +endif() + + +list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/DicomPath.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/IOrthancConnection.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Fonts/FontRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Fonts/Glyph.cpp + ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphAlphabet.cpp + ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphBitmapAlphabet.cpp + ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphTextureAlphabet.cpp + ${ORTHANC_STONE_ROOT}/Sources/Fonts/TextBoundingBox.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingItemsSorter.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingItemsSorter.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingStrategy.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingStrategy.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomResourcesLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomSource.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomStructureSetLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomStructureSetLoader.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomVolumeLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/IFetchingItemsSorter.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/IFetchingStrategy.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoadedDicomResources.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderCache.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderCache.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderStateMachine.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderStateMachine.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancMultiframeVolumeLoader.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/OracleScheduler.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h + ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesFramesLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesMetadataLoader.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesOrderedFrames.cpp + ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesThumbnailsLoader.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Messages/ICallable.h + ${ORTHANC_STONE_ROOT}/Sources/Messages/IMessage.h + ${ORTHANC_STONE_ROOT}/Sources/Messages/IMessageEmitter.h + ${ORTHANC_STONE_ROOT}/Sources/Messages/IObservable.cpp + ${ORTHANC_STONE_ROOT}/Sources/Messages/IObservable.h + ${ORTHANC_STONE_ROOT}/Sources/Messages/IObserver.h + ${ORTHANC_STONE_ROOT}/Sources/Messages/ObserverBase.h + + ${ORTHANC_STONE_ROOT}/Sources/Oracle/GetOrthancImageCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/GetOrthancWebViewerJpegCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/HttpCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/OracleCommandBase.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/OrthancRestApiCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomFromFileCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomFromWadoCommand.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/CairoCompositor.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/CairoCompositor.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Color.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorTextureSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorTextureSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/FloatTextureSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/FloatTextureSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/GrayscaleStyleConfigurator.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/GrayscaleStyleConfigurator.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ICompositor.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ILayerStyleConfigurator.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/InfoPanelSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/InfoPanelSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/IPointerTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ISceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableStyleConfigurator.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableStyleConfigurator.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableTextureSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableTextureSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/NullLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PanSceneTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PanSceneTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PointerEvent.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PointerEvent.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PolylineSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PolylineSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/RotateSceneTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/RotateSceneTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Scene2D.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Scene2D.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ScenePoint2D.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextureBaseSceneLayer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextureBaseSceneLayer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ZoomSceneTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ZoomSceneTracker.h + + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoBaseRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoColorTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoColorTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoFloatTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoFloatTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoInfoPanelRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoInfoPanelRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoPolylineRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoPolylineRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoTextRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoTextRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CompositorHelper.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CompositorHelper.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/FixedPointAligner.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/FixedPointAligner.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/ICairoContextProvider.h + + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/AngleMeasureTool.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/AngleMeasureTool.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureCommand.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateCircleMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateCircleMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureCommand.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateSimpleTrackerAdapter.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureCommand.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureCommand.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureCommand.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/IFlexiblePointerTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LayerHolder.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LayerHolder.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LineMeasureTool.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LineMeasureTool.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureCommands.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureCommands.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTool.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTool.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureToolsToolbox.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureToolsToolbox.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTrackers.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTrackers.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/OneGesturePointerTracker.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/OneGesturePointerTracker.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/PredeclaredTypes.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/UndoStack.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/UndoStack.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/ViewportController.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/ViewportController.h + ${ORTHANC_STONE_ROOT}/Sources/StoneEnumerations.cpp + ${ORTHANC_STONE_ROOT}/Sources/StoneException.h + ${ORTHANC_STONE_ROOT}/Sources/StoneInitialization.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/AffineTransform2D.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/AffineTransform2D.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/CoordinateSystem3D.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/CoordinateSystem3D.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomInstanceParameters.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomInstanceParameters.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructure2.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructure2.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructurePolygon2.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructurePolygon2.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet2.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet2.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSetUtils.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSetUtils.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DisjointDataSet.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DynamicBitmap.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DynamicBitmap.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/Extent2D.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/Extent2D.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/FiniteProjectiveCamera.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/FiniteProjectiveCamera.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GenericToolbox.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GenericToolbox.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GeometryToolbox.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GeometryToolbox.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageGeometry.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageGeometry.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageToolbox.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageToolbox.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/LinearAlgebra.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/LinearAlgebra.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/PixelTestPatterns.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ShearWarpProjectiveTransform.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ShearWarpProjectiveTransform.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SlicesSorter.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SlicesSorter.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SortedFrames.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SortedFrames.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SubpixelReader.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SubvoxelReader.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/TextRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/TextRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/UndoRedoStack.cpp + ${ORTHANC_STONE_ROOT}/Sources/Toolbox/UndoRedoStack.h + + ${ORTHANC_STONE_ROOT}/Sources/Viewport/IViewport.h + + ${ORTHANC_STONE_ROOT}/Sources/Volumes/IGeometryProvider.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/IVolumeSlicer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/IVolumeSlicer.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/OrientedVolumeBoundingBox.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/OrientedVolumeBoundingBox.h + + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeImageGeometry.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeImageGeometry.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeReslicer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeReslicer.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeSceneLayerSource.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeSceneLayerSource.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomStructureSetSlicer2.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomStructureSetSlicer2.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageMPRSlicer.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageReslicer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageReslicer.h + ${ORTHANC_STONE_ROOT}/Sources/Volumes/ImageBuffer3D.cpp + ${ORTHANC_STONE_ROOT}/Sources/Volumes/ImageBuffer3D.h + + ${ORTHANC_STONE_ROOT}/Sources/Wrappers/CairoContext.cpp + ${ORTHANC_STONE_ROOT}/Sources/Wrappers/CairoSurface.cpp + + ${PLATFORM_SOURCES} + ${APPLICATIONS_SOURCES} + ${ORTHANC_CORE_SOURCES} + ${ORTHANC_DICOM_SOURCES} + + # Mandatory components + ${CAIRO_SOURCES} + ${FREETYPE_SOURCES} + ${PIXMAN_SOURCES} + + # Optional components + ${SDL_SOURCES} + ${QT_SOURCES} + ${GLEW_SOURCES} + ) + + +if (ENABLE_OPENGL) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/Fonts/OpenGLTextCoordinates.h + ${ORTHANC_STONE_ROOT}/Sources/Fonts/OpenGLTextCoordinates.cpp + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLProgram.h + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLShader.h + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLShader.cpp + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLTexture.h + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLTexture.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/OpenGLCompositor.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/OpenGLCompositor.cpp + + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureProgram.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLinesProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLinesProgram.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLShaderVersionDirective.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextProgram.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextRenderer.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextRenderer.h + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextureProgram.cpp + ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextureProgram.h + ) + + if (ENABLE_WASM) + list(APPEND ORTHANC_STONE_SOURCES + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/WebAssemblyOpenGLContext.cpp + ${ORTHANC_STONE_ROOT}/Sources/OpenGL/WebAssemblyOpenGLContext.h + ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebGLViewport.cpp + ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebGLViewportsRegistry.cpp + ) + endif() +endif() + +## +## TEST - Automatically add all ".h" headers to the list of sources +## + +macro(AutodetectHeaderFiles SOURCES_VAR) + set(TMP) + + foreach(f IN LISTS ${SOURCES_VAR}) + get_filename_component(_base ${f} NAME_WE) + get_filename_component(_dir ${f} DIRECTORY) + get_filename_component(_extension ${f} EXT) + set(_header ${_dir}/${_base}.h) + + if ((_extension STREQUAL ".cpp" OR + _extension STREQUAL ".cc" OR + _extension STREQUAL ".h") AND + EXISTS ${_header} AND + NOT IS_DIRECTORY ${_header} AND + NOT IS_SYMLINK ${_header}) + + # Prevent adding the header twice if it is already manually + # specified in the sources + list (FIND SOURCES_VAR ${_header} _index) + if (${_index} EQUAL -1) + list(APPEND TMP ${_header}) + endif() + endif() + endforeach() + + list(APPEND ${SOURCES_VAR} ${TMP}) +endmacro() + + +AutodetectHeaderFiles(ORTHANC_STONE_SOURCES) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/OrthancStoneParameters.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/OrthancStoneParameters.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,93 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + + +##################################################################### +## Select the location of the Orthanc framework +##################################################################### + +set(ORTHANC_STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../..) + +include(${CMAKE_CURRENT_LIST_DIR}/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_DEFAULT_VERSION "1.7.2") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +# Parameters of the build +set(STATIC_BUILD OFF CACHE BOOL "Static build of the third-party libraries (necessary for Windows)") +set(ALLOW_DOWNLOADS OFF CACHE BOOL "Allow CMake to download packages") +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc framework (can be \"system\", \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_VERSION "${ORTHANC_FRAMEWORK_DEFAULT_VERSION}" CACHE STRING "Version of the Orthanc framework") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + +# Advanced parameters to fine-tune linking against system libraries +set(ORTHANC_FRAMEWORK_STATIC OFF CACHE BOOL "If linking against the Orthanc framework system library, indicates whether this library was statically linked") +mark_as_advanced(ORTHANC_FRAMEWORK_STATIC) + + + +##################################################################### +## Import the parameters of the Orthanc Framework +##################################################################### + +if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + include(${CMAKE_CURRENT_LIST_DIR}/../Orthanc/CMake/DownloadOrthancFramework.cmake) + include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) + + unset(STANDALONE_BUILD CACHE) + set(STANDALONE_BUILD ON) # Embed DCMTK's dictionaries in static builds + + set(ENABLE_DCMTK OFF) + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_JPEG ON) + set(ENABLE_OPENSSL_ENGINES ON) + set(ENABLE_PNG ON) + set(ENABLE_SQLITE OFF) + set(ENABLE_ZLIB ON) +endif() + + + +##################################################################### +## CMake parameters tunable by the user +##################################################################### + +# Advanced parameters to fine-tune linking against system libraries +set(USE_SYSTEM_CAIRO ON CACHE BOOL "Use the system version of Cairo") +set(USE_SYSTEM_FREETYPE ON CACHE BOOL "Use the system version of Freetype") +set(USE_SYSTEM_GLEW ON CACHE BOOL "Use the system version of glew (for Windows only)") +set(USE_SYSTEM_PIXMAN ON CACHE BOOL "Use the system version of Pixman") +set(USE_SYSTEM_SDL ON CACHE BOOL "Use the system version of SDL2") + + + +##################################################################### +## Internal CMake parameters to enable the optional subcomponents of +## the Stone of Orthanc +##################################################################### + +set(ENABLE_OPENGL ON CACHE BOOL "Enable support of OpenGL") +set(ENABLE_WASM OFF CACHE INTERNAL "Enable support of WebAssembly") +set(ENABLE_GUIADAPTER OFF CACHE INTERNAL "Enable backward compatibility with the Stone GuiAdapter class") diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/PixmanConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/PixmanConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,243 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +if (STATIC_BUILD OR NOT USE_SYSTEM_PIXMAN) + SET(PIXMAN_SOURCES_DIR ${CMAKE_BINARY_DIR}/pixman-0.34.0) + SET(PIXMAN_URL "http://orthanc.osimis.io/ThirdPartyDownloads/pixman-0.34.0.tar.gz") + SET(PIXMAN_MD5 "e80ebae4da01e77f68744319f01d52a3") + + if (IS_DIRECTORY "${PIXMAN_SOURCES_DIR}") + set(FirstRun OFF) + else() + set(FirstRun ON) + endif() + + DownloadPackage(${PIXMAN_MD5} ${PIXMAN_URL} "${PIXMAN_SOURCES_DIR}") + + # Apply a patch for NaCl32: This bypasses the custom implementation of + # "cpuid" that makes use of assembly code leading to "unrecognized + # instruction" when validating ".nexe" files using "ncval" + execute_process( + COMMAND ${PATCH_EXECUTABLE} -p0 -N -i ${CMAKE_CURRENT_LIST_DIR}/PixmanConfiguration.patch + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + + if (Failure AND FirstRun) + message(FATAL_ERROR "Error while patching a file") + endif() + + set(PIXMAN_VERSION_MAJOR 0) + set(PIXMAN_VERSION_MINOR 34) + set(PIXMAN_VERSION_MICRO 0) + configure_file( + ${PIXMAN_SOURCES_DIR}/pixman/pixman-version.h.in + ${PIXMAN_SOURCES_DIR}/pixman/pixman-version.h) + + list(APPEND PIXMAN_SOURCES + ${PIXMAN_SOURCES_DIR}/pixman/pixman-access-accessors.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-access.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-bits-image.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-combine32.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-combine-float.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-conical-gradient.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-edge-accessors.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-edge.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-fast-path.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-filter.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-general.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-glyph.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-gradient-walker.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-image.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-implementation.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-linear-gradient.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-matrix.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-mips.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-mips-dspr2.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-mmx.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-noop.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-ppc.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-radial-gradient.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-region16.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-region32.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-region.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-solid-fill.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-timer.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-trap.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-utils.c + #${PIXMAN_SOURCES_DIR}/pixman/pixman-vmx.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-x86.c + ) + + set(PIXMAN_DEFINITIONS "PACKAGE=\"pixman\"") + + if (CMAKE_SYSTEM_PROCESSOR) + message("Processor: ${CMAKE_SYSTEM_PROCESSOR}") + else() + message("Processor: Not applicable") + endif() + + + ########################## + ## Portable Google NaCl + ########################## + + if (CMAKE_SYSTEM_NAME STREQUAL "PNaCl") + # No hardware acceleration + set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread") + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR + CMAKE_SYSTEM_NAME STREQUAL "Android") + ########################## + ## Emscripten (asm.js) + ########################## + + # No threading support + set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};PIXMAN_NO_TLS=1;HAVE_GCC_VECTOR_EXTENSIONS") + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") + + ########################## + ## Windows 32 or 64 + ########################## + + if (CMAKE_COMPILER_IS_GNUCXX) + set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_BUILTIN_CLZ;HAVE_FEDIVBYZERO=1;HAVE_FENV_H=1;HAVE_MPROTECT=1;HAVE_FLOAT128;HAVE_POSIX_MEMALIGN;USE_GCC_INLINE_ASM=1;HAVE_GETPAGESIZE=1") + + # The option "-mstackrealign" is necessary to avoid a crash on + # Windows if enabling SSE2. As an alternative, it is possible to + # fully disable hardware acceleration. + # https://bugs.freedesktop.org/show_bug.cgi?id=68300#c4 + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2 -mssse3 -mstackrealign") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -mssse3 -mstackrealign") + endif() + + list(APPEND PIXMAN_SOURCES + ${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c + ) + + if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + # Only enable MMX on Windows 32 + add_definitions( + -DUSE_X86_MMX=1 + ) + endif() + + add_definitions( + -DUSE_SSE2=1 + -DUSE_SSSE3=1 + ) + + + ########################## + ## Generic x86 processor + ########################## + + elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR + CMAKE_SYSTEM_NAME STREQUAL "NaCl32" OR + CMAKE_SYSTEM_NAME STREQUAL "NaCl64" OR + CMAKE_SYSTEM_NAME STREQUAL "Darwin") + + set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_BUILTIN_CLZ;HAVE_MPROTECT=1;HAVE_FLOAT128;HAVE_POSIX_MEMALIGN;USE_GCC_INLINE_ASM;HAVE_GETPAGESIZE=1") + + if (${CMAKE_SYSTEM_NAME} STREQUAL "NaCl32" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "NaCl64") + # The MMX instructions lead to "unrecognized instruction" when + # validating ".nexe" files using "ncval", disable them + else() + #add_definitions(-DUSE_X86_MMX=1) + endif() + + list(APPEND PIXMAN_SOURCES + ${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c + ) + add_definitions( + -DUSE_SSE2=1 + -DUSE_SSSE3=1 + ) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2 -mssse3") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -mssse3") + + + ########################## + ## ARM processor + ########################## + + elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv5te" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "armv6" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a" OR + CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + + set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread") + + if (NEON) + message("Processor with NEON instructions") + list(APPEND PIXMAN_SOURCES + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon-asm.S + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon-asm-bilinear.S + ) + add_definitions( + -DUSE_ARM_NEON=1 + ) + elseif() + message("Processor without NEON instructions") + endif() + + add_definitions( + -DUSE_ARM_SIMD=1 + ) + list(APPEND PIXMAN_SOURCES + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm.c + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd-asm.S + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd-asm-scaled.S + ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd.c + ) + + else() + message(FATAL_ERROR "Support your platform here") + endif() + + + include_directories( + ${PIXMAN_SOURCES_DIR}/pixman + ) + + set_property( + SOURCE ${PIXMAN_SOURCES} + PROPERTY COMPILE_DEFINITIONS ${PIXMAN_DEFINITIONS} + ) + +else() + + pkg_search_module(PIXMAN REQUIRED pixman-1) + include_directories(${PIXMAN_INCLUDE_DIRS}) + link_libraries(${PIXMAN_LIBRARIES}) + +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/PixmanConfiguration.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/PixmanConfiguration.patch Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,13 @@ +diff -urEb pixman-0.34.0.orig/pixman/pixman-x86.c pixman-0.34.0/pixman/pixman-x86.c +--- pixman-0.34.0.orig/pixman/pixman-x86.c 2016-07-05 12:46:52.889101224 +0200 ++++ pixman-0.34.0/pixman/pixman-x86.c 2016-07-05 12:47:07.253101808 +0200 +@@ -80,7 +80,7 @@ + static pixman_bool_t + have_cpuid (void) + { +-#if _PIXMAN_X86_64 || defined (_MSC_VER) ++#if _PIXMAN_X86_64 || defined (_MSC_VER) || defined(__native_client__) + + return TRUE; + +Only in pixman-0.34.0/pixman: pixman-x86.c~ diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/SdlConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/SdlConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,224 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +if (STATIC_BUILD OR NOT USE_SYSTEM_SDL) + SET(SDL_SOURCES_DIR ${CMAKE_BINARY_DIR}/SDL2-2.0.4) + SET(SDL_URL "http://orthanc.osimis.io/ThirdPartyDownloads/SDL2-2.0.4.tar.gz") + SET(SDL_MD5 "44fc4a023349933e7f5d7a582f7b886e") + DownloadPackage(${SDL_MD5} ${SDL_URL} "${SDL_SOURCES_DIR}") + + include_directories(${SDL_SOURCES_DIR}/include) + + set(TMP "${SDL_SOURCES_DIR}/include/SDL_config_premake.h") + if (NOT EXISTS "${TMP}") + file(WRITE "${TMP}" " +#include \"SDL_platform.h\" +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +") + endif() + + # General source files + file(GLOB SDL_SOURCES + ${SDL_SOURCES_DIR}/src/*.c + ${SDL_SOURCES_DIR}/src/atomic/*.c + ${SDL_SOURCES_DIR}/src/audio/*.c + ${SDL_SOURCES_DIR}/src/cpuinfo/*.c + ${SDL_SOURCES_DIR}/src/dynapi/*.c + ${SDL_SOURCES_DIR}/src/events/*.c + ${SDL_SOURCES_DIR}/src/file/*.c + ${SDL_SOURCES_DIR}/src/haptic/*.c + ${SDL_SOURCES_DIR}/src/joystick/*.c + ${SDL_SOURCES_DIR}/src/libm/*.c + ${SDL_SOURCES_DIR}/src/power/*.c + ${SDL_SOURCES_DIR}/src/render/*.c + ${SDL_SOURCES_DIR}/src/stdlib/*.c + ${SDL_SOURCES_DIR}/src/thread/*.c + ${SDL_SOURCES_DIR}/src/timer/*.c + ${SDL_SOURCES_DIR}/src/video/*.c + + ${SDL_SOURCES_DIR}/src/loadso/dummy/*.c + #${SDL_SOURCES_DIR}/src/timer/dummy/*.c + ${SDL_SOURCES_DIR}/src/audio/dummy/*.c + ${SDL_SOURCES_DIR}/src/filesystem/dummy/*.c + ${SDL_SOURCES_DIR}/src/haptic/dummy/*.c + ${SDL_SOURCES_DIR}/src/joystick/dummy/*.c + #${SDL_SOURCES_DIR}/src/main/dummy/*.c + ${SDL_SOURCES_DIR}/src/video/dummy/*.c + ) + + add_definitions( + -DUSING_PREMAKE_CONFIG_H=1 + + -DSDL_AUDIO_DISABLED=1 + -DSDL_AUDIO_DRIVER_DUMMY=1 + -DSDL_FILESYSTEM_DISABLED=1 + -DSDL_FILESYSTEM_DUMMY=1 + -DSDL_FILE_DISABLED=1 + -DSDL_HAPTIC_DISABLED=1 + -DSDL_JOYSTICK_DISABLED=1 + + #-DSDL_THREADS_DISABLED=1 + ) + + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + file(GLOB TMP + ${SDL_SOURCES_DIR}/src/core/linux/*.c + ${SDL_SOURCES_DIR}/src/loadso/dlopen/*.c + ${SDL_SOURCES_DIR}/src/render/software/*.c + ${SDL_SOURCES_DIR}/src/thread/pthread/*.c + ${SDL_SOURCES_DIR}/src/timer/unix/*.c + ${SDL_SOURCES_DIR}/src/video/x11/*.c + ) + + list(APPEND SDL_SOURCES ${TMP}) + + add_definitions( + -DSDL_LOADSO_DLOPEN=1 + -DSDL_THREAD_PTHREAD=1 + -DSDL_TIMER_UNIX=1 + -DSDL_POWER_DISABLED=1 + + -DSDL_VIDEO_DRIVER_X11=1 + + -DSDL_ASSEMBLY_ROUTINES=1 + -DSDL_THREAD_PTHREAD_RECURSIVE_MUTEX=1 + -DSDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS=1 + -DHAVE_GCC_SYNC_LOCK_TEST_AND_SET=1 + ) + + link_libraries(X11 Xext) + + if (NOT CMAKE_SYSTEM_VERSION STREQUAL "Raspberry") + # Raspberry Pi has no support for OpenGL + file(GLOB TMP + ${SDL_SOURCES_DIR}/src/render/opengl/*.c + ${SDL_SOURCES_DIR}/src/render/opengles2/*.c + ) + + list(APPEND SDL_SOURCES ${TMP}) + + add_definitions( + -DSDL_VIDEO_OPENGL=1 + -DSDL_VIDEO_OPENGL_ES2=1 + -DSDL_VIDEO_RENDER_OGL=1 + -DSDL_VIDEO_RENDER_OGL_ES2=1 + -DSDL_VIDEO_OPENGL_GLX=1 + -DSDL_VIDEO_OPENGL_EGL=1 + ) + endif() + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") + file(GLOB TMP + ${SDL_SOURCES_DIR}/src/audio/directsound/*.c + ${SDL_SOURCES_DIR}/src/audio/disk/*.c + ${SDL_SOURCES_DIR}/src/audio/winmm/*.c + ${SDL_SOURCES_DIR}/src/joystick/windows/*.c + ${SDL_SOURCES_DIR}/src/haptic/windows/*.c + ${SDL_SOURCES_DIR}/src/power/windows/*.c + + ${SDL_SOURCES_DIR}/src/main/windows/*.c + ${SDL_SOURCES_DIR}/src/core/windows/*.c + ${SDL_SOURCES_DIR}/src/loadso/windows/*.c + ${SDL_SOURCES_DIR}/src/render/direct3d/*.c + ${SDL_SOURCES_DIR}/src/render/direct3d11/*.c + ${SDL_SOURCES_DIR}/src/render/opengl/*.c + ${SDL_SOURCES_DIR}/src/render/psp/*.c + ${SDL_SOURCES_DIR}/src/render/opengles/*.c + ${SDL_SOURCES_DIR}/src/render/opengles2/*.c + ${SDL_SOURCES_DIR}/src/render/software/*.c + ${SDL_SOURCES_DIR}/src/thread/generic/SDL_syscond.c # Don't include more files from "thread/generic/*.c"! + ${SDL_SOURCES_DIR}/src/thread/windows/*.c + ${SDL_SOURCES_DIR}/src/timer/windows/*.c + ${SDL_SOURCES_DIR}/src/video/windows/*.c + ${SDL_SOURCES_DIR}/src/windows/dlopen/*.c + ) + + list(APPEND SDL_SOURCES ${TMP}) + + # NB: OpenGL ES headers are not available in MinGW-W64 + add_definitions( + -DSDL_LOADSO_WINDOWS=1 + -DSDL_THREAD_WINDOWS=1 + -DSDL_TIMER_WINDOWS=1 + -DSDL_POWER_WINDOWS=1 + + -DSDL_VIDEO_OPENGL=1 + -DSDL_VIDEO_OPENGL_WGL=1 + -DSDL_VIDEO_RENDER_D3D=1 + -DSDL_VIDEO_RENDER_OGL=1 + -DSDL_VIDEO_DRIVER_WINDOWS=1 + ) + + if (MSVC) + add_definitions( + -D__FLTUSED__ + -DHAVE_LIBC=1 + ) + else() + add_definitions( + -DHAVE_GCC_ATOMICS=1 + -DSDL_ASSEMBLY_ROUTINES=1 + ) + endif() + + link_libraries(imm32 winmm version) + + elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + file(GLOB TMP + ${SDL_SOURCES_DIR}/src/loadso/dlopen/*.c + ${SDL_SOURCES_DIR}/src/render/opengl/*.c + ${SDL_SOURCES_DIR}/src/render/opengles2/*.c + ${SDL_SOURCES_DIR}/src/render/software/*.c + ${SDL_SOURCES_DIR}/src/thread/pthread/*.c + ${SDL_SOURCES_DIR}/src/timer/unix/*.c + ${SDL_SOURCES_DIR}/src/video/cocoa/*.m + ) + + list(APPEND SDL_SOURCES ${TMP}) + + add_definitions( + -DSDL_LOADSO_DLOPEN=1 + -DSDL_THREAD_PTHREAD=1 + -DSDL_TIMER_UNIX=1 + -DSDL_POWER_DISABLED=1 + + -DSDL_VIDEO_DRIVER_COCOA=1 + -DSDL_VIDEO_OPENGL=1 + -DSDL_VIDEO_OPENGL_CGL=1 + -DSDL_VIDEO_RENDER_OGL=1 + + -DSDL_ASSEMBLY_ROUTINES=1 + -DSDL_THREAD_PTHREAD_RECURSIVE_MUTEX=1 + ) + + find_library(CARBON_LIBRARY Carbon) + find_library(COCOA_LIBRARY Cocoa) + find_library(IOKIT_LIBRARY IOKit) + find_library(QUARTZ_LIBRARY QuartzCore) + link_libraries(${CARBON_LIBRARY} ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${QUARTZ_LIBRARY}) + + endif() + +else() + pkg_search_module(SDL2 REQUIRED sdl2) + include_directories(${SDL2_INCLUDE_DIRS}) + link_libraries(${SDL2_LIBRARIES}) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/Version.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/Version.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,5 @@ +set(ORTHANC_STONE_VERSION "mainline") + +add_definitions( + -DORTHANC_STONE_VERSION="${ORTHANC_STONE_VERSION}" + ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/CMake/cairo-features.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/CMake/cairo-features.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,45 @@ +#ifndef CAIRO_FEATURES_H +#define CAIRO_FEATURES_H + +#define CAIRO_HAS_GOBJECT_FUNCTIONS 1 +#define CAIRO_HAS_IMAGE_SURFACE 1 +#define CAIRO_HAS_MIME_SURFACE 1 +#define CAIRO_HAS_OBSERVER_SURFACE 1 +#define CAIRO_HAS_RECORDING_SURFACE 1 +#define CAIRO_HAS_USER_FONT 1 + +/*#undef CAIRO_HAS_BEOS_SURFACE */ +/*#undef CAIRO_HAS_COGL_SURFACE */ +/*#undef CAIRO_HAS_DIRECTFB_SURFACE */ +/*#undef CAIRO_HAS_DRM_SURFACE */ +/*#undef CAIRO_HAS_EGL_FUNCTIONS */ +/*#undef CAIRO_HAS_FC_FONT */ +/*#undef CAIRO_HAS_FT_FONT */ +/*#undef CAIRO_HAS_GALLIUM_SURFACE */ +/*#undef CAIRO_HAS_GLESV2_SURFACE */ +/*#undef CAIRO_HAS_GLX_FUNCTIONS */ +/*#undef CAIRO_HAS_GL_SURFACE */ +/*#undef CAIRO_HAS_OS2_SURFACE */ +/*#undef CAIRO_HAS_PDF_SURFACE */ +/*#undef CAIRO_HAS_PNG_FUNCTIONS */ +/*#undef CAIRO_HAS_PS_SURFACE */ +/*#undef CAIRO_HAS_QT_SURFACE */ +/*#undef CAIRO_HAS_QUARTZ_FONT */ +/*#undef CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ +/*#undef CAIRO_HAS_QUARTZ_SURFACE */ +/*#undef CAIRO_HAS_SCRIPT_SURFACE */ +/*#undef CAIRO_HAS_SKIA_SURFACE */ +/*#undef CAIRO_HAS_SVG_SURFACE */ +/*#undef CAIRO_HAS_TEE_SURFACE */ +/*#undef CAIRO_HAS_VG_SURFACE */ +/*#undef CAIRO_HAS_WGL_FUNCTIONS */ +/*#undef CAIRO_HAS_WIN32_FONT */ +/*#undef CAIRO_HAS_WIN32_SURFACE */ +/*#undef CAIRO_HAS_XCB_SHM_FUNCTIONS */ +/*#undef CAIRO_HAS_XCB_SURFACE */ +/*#undef CAIRO_HAS_XLIB_SURFACE */ +/*#undef CAIRO_HAS_XLIB_XCB_FUNCTIONS */ +/*#undef CAIRO_HAS_XLIB_XRENDER_SURFACE */ +/*#undef CAIRO_HAS_XML_SURFACE */ + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/GenerateColormaps.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Colormaps/GenerateColormaps.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,36 @@ +#!/usr/bin/python + +import array +import matplotlib.pyplot as plt + +def GenerateColormap(name): + colormap = [] + + for gray in range(256): + if name == 'red': + color = (gray / 255.0, 0, 0) + elif name == 'green': + color = (0, gray / 255.0, 0) + elif name == 'blue': + color = (0, 0, gray / 255.0) + else: + color = plt.get_cmap(name) (gray) + + colormap += map(lambda k: int(round(color[k] * 255)), range(3)) + + colormap[0] = 0 + colormap[1] = 0 + colormap[2] = 0 + + return array.array('B', colormap).tostring() + + +for name in [ + 'hot', + 'jet', + 'blue', + 'green', + 'red', +]: + with open('%s.lut' % name, 'w') as f: + f.write(GenerateColormap(name)) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/blue.lut Binary file OrthancStone/Resources/Colormaps/blue.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/green.lut Binary file OrthancStone/Resources/Colormaps/green.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/hot.lut Binary file OrthancStone/Resources/Colormaps/hot.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/jet.lut Binary file OrthancStone/Resources/Colormaps/jet.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Colormaps/red.lut Binary file OrthancStone/Resources/Colormaps/red.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Computations/ComputeShearOnSlice.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Computations/ComputeShearOnSlice.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +#!/usr/bin/python + +from sympy import * +import pprint + +init_printing(use_unicode=True) + + +# Setup "T * S * M_shear" (Equation A.16) + +ex, ey, ew = symbols('ex ey ew') +sx, sy = symbols('sx, sy') +ti, tj = symbols('ti tj') + +T = Matrix([[ 1, 0, 0, ti ], + [ 0, 1, 0, tj ], + [ 0, 0, 1, 0 ], + [ 0, 0, 0, 1 ]]) + +# Equation (A.15), if "sx == sy == f" +S = Matrix([[ sx, 0, 0, 0 ], + [ 0, sy, 0, 0 ], + [ 0, 0, 1, 0 ], + [ 0, 0, 0, 1 ]]) + +# MM_shear, in Equation (A.14) +M = Matrix([[ 1, 0, ex, 0 ], + [ 0, 1, ey, 0 ], + [ 0, 0, 1, 0 ], + [ 0, 0, ew, 1 ]]) + + +x, y, z, w = symbols('x y z w') +p = Matrix([ x, y, z, w ]) + +print("\nT =" % T) +pprint.pprint(T); + +print("\nS =" % T) +pprint.pprint(S); + +print("\nM'_shear =" % T) +pprint.pprint(M); + +print("\nGeneral form of a Lacroute's shear matrix (Equation A.16): T * S * M'_shear =") +pprint.pprint(T * S * M); + +print("\nHence, alternative parametrization:") +a11, a13, a14, a22, a23, a24, a43 = symbols('a11 a13 a14 a22 a23 a24 a43') + +A = Matrix([[ a11, 0, a13, a14 ], + [ 0, a22, a23, a24 ], + [ 0, 0, 1, 0 ], + [ 0, 0, a43, 1 ]]) +pprint.pprint(A); + +v = A * p +v = v.subs(w, 1) + +print("\nAction of Lacroute's shear matrix A on plane z (taking w=1):\n%s\n" % v) + +print('Output x\' = %s\n' % (v[0]/v[3])) +print('Output y\' = %s\n' % (v[1]/v[3])) +print('Output z\' = %s\n' % (v[2]/v[3])) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Computations/ComputeShearParameters.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Computations/ComputeShearParameters.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,32 @@ +#!/usr/bin/python + +from sympy import * +import pprint + +init_printing(use_unicode=True) + +s13, s23, s43 = symbols('s13 s23 s43') +x, y, z, w = symbols('x y z w') + +A = Matrix([[ 1, 0, s13, 0 ], + [ 0, 1, s23, 0 ], + [ 0, 0, 1, 0 ], + [ 0, 0, s43, 1 ]]) + +print('\nLacroute\'s shear matrix (A.14) is:') +pprint.pprint(A) + +# At this point, we can write "print(A*p)". However, we don't care +# about the output "z" axis, as it is fixed. So we delete the 3rd row +# of A. + +A.row_del(2) + +p = Matrix([ x, y, z, 1 ]) + +v = A*p +print('\nAction of Lacroute\'s shear matrix on plane z (taking w=1):\n%s\n' % v) + +print('Scaling = %s' % (1/v[2])) +print('Offset X = %s' % (v[0]/v[2]).subs(x, 0)) +print('Offset Y = %s' % (v[1]/v[2]).subs(y, 0)) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Computations/ComputeWarp.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Computations/ComputeWarp.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,112 @@ +#!/usr/bin/python + +from sympy import * +from sympy.solvers import solve +import pprint +import sys + +init_printing(use_unicode=True) + + +# Create a test 3D vector using homogeneous coordinates +x, y, z, w = symbols('x y z w') +p = Matrix([ x, y, z, w ]) + + +# Create a shear matrix, and a scale/shift "T * S" transform as in +# Lacroute's thesis (Equation A.16, page 209) +ex, ey, ew = symbols('ex ey ew') +sx, sy, tx, ty = symbols('sx sy tx ty') + +TS = Matrix([[ sx, 0, 0, tx ], + [ 0, sy, 0, ty ], + [ 0, 0, 1, 0 ], + [ 0, 0, 0, 1 ]]) + +pureShear = Matrix([[ 1, 0, ex, 0 ], + [ 0, 1, ey, 0 ], + [ 0, 0, 1, 0 ], + [ 0, 0, ew, 1 ]]) + + +# Create a general warp matrix, that corresponds to "M_warp" in +# Equation (A.17) of Lacroute's thesis: +ww11, ww12, ww13, ww14, ww21, ww22, ww23, ww24, ww31, ww32, ww33, ww34, ww41, ww42, ww43, ww44 = symbols('ww11 ww12 ww13 ww14 ww21 ww22 ww23 ww24 ww31 ww32 ww33 ww34 ww41 ww42 ww43 ww44') + +WW = Matrix([[ ww11, ww12, ww13, ww14 ], + [ ww21, ww22, ww23, ww24 ], + [ ww31, ww32, ww33, ww34 ], + [ ww41, ww43, ww43, ww44 ]]) + + +# Create the matrix of intrinsic parameters of the camera +k11, k22, k14, k24 = symbols('k11 k22 k14 k24') +K = Matrix([[ k11, 0, 0, k14 ], + [ 0, k22, 0, k24 ], + [ 0, 0, 0, 1 ]]) + + +# The full decomposition is: +M_shear = TS * pureShear +M_warp = K * WW * TS.inv() +AA = M_warp * M_shear + +# Check that the central component "M_warp == K * WW * TS.inv()" that +# is the left part of "A" is another general warp matrix (i.e. no +# exception is thrown about incompatible matrix sizes): +M_warp * p + +if (M_warp.cols != 4 or + M_warp.rows != 3): + raise Exception('Invalid matrix size') + + +# We've just shown that "M_warp" is a general 3x4 matrix. Let's call +# it W: +w11, w12, w13, w14, w21, w22, w23, w24, w41, w42, w43, w44 = symbols('w11 w12 w13 w14 w21 w22 w23 w24 w41 w42 w43 w44') + +W = Matrix([[ w11, w12, w13, w14 ], + [ w21, w22, w23, w24 ], + [ w41, w43, w43, w44 ]]) + +# This shows that it is sufficient to study a decomposition of the +# following form: +A = W * M_shear +print('\nA = W * M_shear =') +pprint.pprint(A) + +sys.stdout.write('\nW = ') +pprint.pprint(W) + +sys.stdout.write('\nM_shear = ') +pprint.pprint(M_shear) + + + +# Let's consider one fixed 2D point (i,j) in the intermediate +# image. The 3D points (x,y,z,1) that are mapped to (i,j) must satisfy +# the equation "(i,j) == M_shear * (x,y,z,w)". As "M_shear" is +# invertible, we solve "(x,y,z,w) == inv(M_shear) * (i,j,k,1)". + +i, j, k = symbols('i j k') +l = M_shear.inv() * Matrix([ i, j, k, 1 ]) + +print('\nLocus for points imaged to some fixed (i,j,k,l) point in the intermediate image:') +print('x = %s' % l[0]) +print('y = %s' % l[1]) +print('z = %s' % l[2]) +print('w = %s' % l[3]) + + +# By inspecting the 4 equations above, we see that the locus entirely +# depends upon the "k" value that encodes the Z-axis + +print('\nGlobal effect of the shear-warp transform on this locus:') +q = expand(A * l) +pprint.pprint(q) + +print("\nWe can arbitrarily fix the value of 'k', so let's choose 'k=0':") +pprint.pprint(q.subs(k, 0)) + +print("\nThis gives the warp transform.") +print("QED: line after Equation (A.17) on page 209.\n") diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Computations/IntersectSegmentAndHorizontalLine.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Computations/IntersectSegmentAndHorizontalLine.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +from sympy import * + +# Intersection between the 2D line segment (prevX,prevY)-(curX,curY) and the +# horizontal line "y = y0" using homogeneous coordinates + +prevX, prevY, curX, curY, y0 = symbols('prevX prevY curX curY y0') + +p1 = Matrix([prevX, prevY, 1]) +p2 = Matrix([curX, curY, 1]) +l1 = p1.cross(p2) + +h1 = Matrix([0, y0, 1]) +h2 = Matrix([1, y0, 1]) +l2 = h1.cross(h2) + +a = l1.cross(l2) + +#pprint(cse(a/a[2], symbols = symbols('a b'))) +pprint(a / a[2]) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Computations/IntersectSegmentAndVerticalLine.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Computations/IntersectSegmentAndVerticalLine.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +from sympy import * + +# Intersection between the 2D line segment (prevX,prevY)-(curX,curY) and the +# vertical line "x = x0" using homogeneous coordinates + +prevX, prevY, curX, curY, x0 = symbols('prevX prevY curX curY x0') + +p1 = Matrix([prevX, prevY, 1]) +p2 = Matrix([curX, curY, 1]) +l1 = p1.cross(p2) + +h1 = Matrix([x0, 0, 1]) +h2 = Matrix([x0, 1, 1]) +l2 = h1.cross(h2) + +a = l1.cross(l2) + +pprint(a / a[2]) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Conventions.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Conventions.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,88 @@ + +Some notes about the lifetime of objects +======================================== + +Stone applications +------------------ + +A typical Stone application can be split in 3 parts: + +1- The "loaders part" and the associated "IOracle", that communicate + through "IMessage" objects. The lifetime of these objects is + governed by the "IStoneContext". + +2- The "data part" holds the data loaded by the "loaders part". The + related objects must not be aware of the oracle, neither of the + messages. It is up to the user application to store these objects. + +3- The "viewport part" is based upon the "Scene2D" class. + + +Multithreading +-------------- + +* Stone makes the hypothesis that its objects live in a single thread. + All the content of the "Framework" folder (with the exception of + the "Oracle" stuff) must not use "boost::thread". + +* The "IOracleCommand" classes represent commands that must be + executed asynchronously from the Stone thread. Their actual + execution is done by the "IOracle". + +* In WebAssembly, the "IOracle" corresponds to the "html5.h" + facilities (notably for the Fetch API). There is no mutex here, as + JavaScript is inherently single-threaded. + +* In plain C++ applications, the "IOracle" corresponds to a FIFO queue + of commands that are executed by a pool of threads. The Stone + context holds a global mutex, that must be properly locked by the + user application, and by the "IOracle" when it sends back messages + to the Stone loaders (cf. class "IMessageEmitter"). + +* Multithreading is thus achieved by defining new oracle commands by + subclassing "IOracleCommand", then by defining a way to execute them + (cf. class "GenericCommandRunner"). + + +References between objects +-------------------------- + +* An object allocated on the heap must never store a reference/pointer + to another object. + +* A class designed to be allocated only on the stack can store a + reference/pointer to another object. Here is the list of + such classes: + + - IMessage and its derived classes: All the messages are allocated + on the stack. + + +Pointers +-------- + +* As we are targeting C++03 (for VS2008 and LSB compatibility), use + "std::unique_ptr<>" and "boost::shared_ptr<>" (*not* + "std::shared_ptr<>"). We provide an implementation of std::unique_ptr for + pre-C++11 compilers. + +* The fact of transfering the ownership of one object to another must + be tagged by naming the method "Acquire...()", and by providing a + raw pointer. + +* Use "std::unique_ptr<>" if the goal is to internally store a pointer + whose lifetime corresponds to the host object. + +* The use of "boost::weak_ptr<>" should be restricted to + oracle/message handling. + +* The use of "boost::shared_ptr<>" should be minimized to avoid + clutter. The "loaders" and "data parts" objects must however + be created as "boost::shared_ptr<>". + + +Global context +-------------- + +* As the global Stone context can be created/destroyed by other + languages than C++, we don't use a "boost:shared_ptr<>". diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Commands/BaseCommands.yml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Commands/BaseCommands.yml Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,10 @@ +SelectTool: + target: Application + toolName: string + comment: Selects the current application tool +DownloadDicom: + target: SliceViewerWidget + comment: Downloads the slice currently displayed in the SliceViewerWidget +Export: + target: IWidget + comment: Export the content of the widget \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "NativeStoneApplicationContext.h" +#include "../../Platforms/Generic/OracleWebService.h" + +namespace OrthancStone +{ + void NativeStoneApplicationContext::GlobalMutexLocker::SetCentralWidget( + boost::shared_ptr widget) + { + that_.centralViewport_.SetCentralWidget(widget); + } + + + void NativeStoneApplicationContext::UpdateThread(NativeStoneApplicationContext* that) + { + while (!that->stopped_) + { + { + GlobalMutexLocker locker(*that); + locker.GetCentralViewport().DoAnimation(); + } + + boost::this_thread::sleep(boost::posix_time::milliseconds(that->updateDelayInMs_)); + } + } + + + NativeStoneApplicationContext::NativeStoneApplicationContext() : + stopped_(true), + updateDelayInMs_(100) // By default, 100ms between each refresh of the content + { + srand(static_cast(time(NULL))); + } + + + void NativeStoneApplicationContext::Start() + { + boost::recursive_mutex::scoped_lock lock(globalMutex_); + + if (stopped_ && + centralViewport_.HasAnimation()) + { + stopped_ = false; + updateThread_ = boost::thread(UpdateThread, this); + } + } + + + void NativeStoneApplicationContext::Stop() + { + stopped_ = true; + + if (updateThread_.joinable()) + { + updateThread_.join(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" +#include "../../Framework/Deprecated/Volumes/ISlicedVolume.h" +#include "../../Framework/Deprecated/Volumes/IVolumeLoader.h" + +#include +#include +#include "../StoneApplicationContext.h" + +namespace OrthancStone +{ + class NativeStoneApplicationContext : public StoneApplicationContext + { + private: + static void UpdateThread(NativeStoneApplicationContext* that); + + boost::recursive_mutex globalMutex_; + Deprecated::WidgetViewport centralViewport_; + boost::thread updateThread_; + bool stopped_; + unsigned int updateDelayInMs_; + + public: + class GlobalMutexLocker: public boost::noncopyable + { + private: + NativeStoneApplicationContext& that_; + boost::recursive_mutex::scoped_lock lock_; + + public: + GlobalMutexLocker(NativeStoneApplicationContext& that) : + that_(that), + lock_(that.globalMutex_) + { + } + + void SetCentralWidget(boost::shared_ptr widget); + + Deprecated::IViewport& GetCentralViewport() + { + return that_.centralViewport_; + } + + void SetUpdateDelay(unsigned int delayInMs) + { + that_.updateDelayInMs_ = delayInMs; + } + }; + + NativeStoneApplicationContext(); + + void Start(); + + void Stop(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,265 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#if ORTHANC_ENABLE_THREADS != 1 +#error this file shall be included only with the ORTHANC_ENABLE_THREADS set to 1 +#endif + +#include "NativeStoneApplicationRunner.h" + +#include "../../Framework/Deprecated/Toolbox/MessagingToolbox.h" +#include "../../Platforms/Generic/OracleWebService.h" +#include "../../Platforms/Generic/OracleDelayedCallExecutor.h" +#include "NativeStoneApplicationContext.h" + +#include +#include +#include +#include +#include + +#include + +namespace OrthancStone +{ + // Anonymous namespace to avoid clashes against other compilation modules + namespace + { + class LogStatusBar : public Deprecated::IStatusBar + { + public: + virtual void ClearMessage() + { + } + + virtual void SetMessage(const std::string& message) + { + LOG(WARNING) << message; + } + }; + } + + int NativeStoneApplicationRunner::Execute(int argc, + char* argv[]) + { + /****************************************************************** + * Initialize all the subcomponents of Orthanc Stone + ******************************************************************/ + + Orthanc::Logging::Initialize(); + Orthanc::Toolbox::InitializeOpenSsl(); + Orthanc::HttpClient::GlobalInitialize(); + + Initialize(); + + /****************************************************************** + * Declare and parse the command-line options of the application + ******************************************************************/ + + boost::program_options::options_description options; + + { // generic options + boost::program_options::options_description generic("Generic options"); + generic.add_options() + ("help", "Display this help and exit") + ("verbose", "Be verbose in logs") + ("orthanc", boost::program_options::value()-> + default_value("http://localhost:8042/"), + "URL to the Orthanc server") + ("username", "Username for the Orthanc server") + ("password", "Password for the Orthanc server") + ("https-verify", boost::program_options::value()-> + default_value(true), "Check HTTPS certificates") + ; + + options.add(generic); + } + + // platform specific options + DeclareCommandLineOptions(options); + + // application specific options + application_->DeclareStartupOptions(options); + + boost::program_options::variables_map parameters; + bool error = false; + + try + { + boost::program_options::store( + boost::program_options::command_line_parser(argc, argv). + options(options).allow_unregistered().run(), parameters); + boost::program_options::notify(parameters); + } + catch (boost::program_options::error& e) + { + LOG(ERROR) << + "Error while parsing the command-line arguments: " << e.what(); + error = true; + } + + + /****************************************************************** + * Configure the application with the command-line parameters + ******************************************************************/ + + if (error || parameters.count("help")) + { + std::cout << std::endl; + + std::cout << options << "\n"; + return error ? -1 : 0; + } + + if (parameters.count("https-verify") && + !parameters["https-verify"].as()) + { + LOG(WARNING) << "Turning off verification of HTTPS certificates (unsafe)"; + Orthanc::HttpClient::ConfigureSsl(false, ""); + } + + LOG(ERROR) << "???????? if (parameters.count(\"verbose\"))"; + if (parameters.count("verbose")) + { + LOG(ERROR) << "parameters.count(\"verbose\") != 0"; + Orthanc::Logging::EnableInfoLevel(true); + LOG(INFO) << "Verbose logs are enabled"; + } + + LOG(ERROR) << "???????? if (parameters.count(\"trace\"))"; + if (parameters.count("trace")) + { + LOG(ERROR) << "parameters.count(\"trace\") != 0"; + Orthanc::Logging::EnableTraceLevel(true); + VLOG(1) << "Trace logs are enabled"; + } + + ParseCommandLineOptions(parameters); + + bool success = true; + try + { + /**************************************************************** + * Initialize the connection to the Orthanc server + ****************************************************************/ + + Orthanc::WebServiceParameters webServiceParameters; + + if (parameters.count("orthanc")) + { + webServiceParameters.SetUrl(parameters["orthanc"].as()); + } + + if (parameters.count("username") && parameters.count("password")) + { + webServiceParameters.SetCredentials(parameters["username"]. + as(), + parameters["password"].as()); + } + + LOG(WARNING) << "URL to the Orthanc REST API: " << + webServiceParameters.GetUrl(); + + { + OrthancPlugins::OrthancHttpConnection orthanc(webServiceParameters); + if (!Deprecated::MessagingToolbox::CheckOrthancVersion(orthanc)) + { + LOG(ERROR) << "Your version of Orthanc is incompatible with Stone of " + << "Orthanc, please upgrade"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + + + /**************************************************************** + * Initialize the application + ****************************************************************/ + + LOG(WARNING) << "Creating the widgets of the application"; + + LogStatusBar statusBar; + + NativeStoneApplicationContext context; + + { + // use multiple threads to execute asynchronous tasks like + // download content + Deprecated::Oracle oracle(6); + oracle.Start(); + + { + boost::shared_ptr webService + (new Deprecated::OracleWebService(oracle, webServiceParameters, context)); + context.SetWebService(webService); + context.SetOrthancBaseUrl(webServiceParameters.GetUrl()); + + Deprecated::OracleDelayedCallExecutor delayedExecutor(oracle, context); + context.SetDelayedCallExecutor(delayedExecutor); + + application_->Initialize(&context, statusBar, parameters); + + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context); + locker.SetCentralWidget(application_->GetCentralWidget()); + locker.GetCentralViewport().SetStatusBar(statusBar); + } + + std::string title = application_->GetTitle(); + if (title.empty()) + { + title = "Stone of Orthanc"; + } + + /**************************************************************** + * Run the application + ****************************************************************/ + + Run(context, title, argc, argv); + + /**************************************************************** + * Finalize the application + ****************************************************************/ + + oracle.Stop(); + } + } + + LOG(WARNING) << "The application is stopping"; + application_->Finalize(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + success = false; + } + + + /****************************************************************** + * Finalize all the subcomponents of Orthanc Stone + ******************************************************************/ + + Finalize(); + Orthanc::HttpClient::GlobalFinalize(); + Orthanc::Toolbox::FinalizeOpenSsl(); + + return (success ? 0 : -1); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../IStoneApplication.h" + +#if ORTHANC_ENABLE_THREADS != 1 +#error this file shall be included only with the ORTHANC_ENABLE_THREADS set to 1 +#endif + +namespace OrthancStone +{ + class NativeStoneApplicationContext; + + class NativeStoneApplicationRunner + { + protected: + boost::shared_ptr application_; + + public: + NativeStoneApplicationRunner(boost::shared_ptr application) + : application_(application) + { + } + int Execute(int argc, + char* argv[]); + + virtual void Initialize() = 0; + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) = 0; + virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters) = 0; + + virtual void Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]) = 0; + virtual void Finalize() = 0; + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/Scene2DInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Generic/Scene2DInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "../../Framework/Scene2D/PointerEvent.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" +//#include "../../Framework/Scene2D/Internals/CompositorHelper.h" +#include "GuiAdapter.h" + + +namespace OrthancStone +{ + + class Scene2DInteractor + { + protected: + boost::shared_ptr viewportController_; +// boost::shared_ptr compositor_; + + public: + Scene2DInteractor(boost::shared_ptr viewportController) : + viewportController_(viewportController) + {} + +// void SetCompositor(boost::shared_ptr compositor) +// { +// compositor_ = compositor; +// } + + virtual bool OnMouseEvent(const GuiAdapterMouseEvent& guiEvent, const PointerEvent& pointerEvent) = 0; // returns true if it has handled the event + virtual bool OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) = 0; // returns true if it has handled the event + virtual bool OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) = 0; // returns true if it has handled the event + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/IStoneApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/IStoneApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,74 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "StoneApplicationContext.h" +#include "../Framework/Deprecated/Viewport/WidgetViewport.h" + +#include +#include + +namespace OrthancStone +{ +#if ORTHANC_ENABLE_QT==1 + class QStoneMainWindow; +#endif + + // a StoneApplication is an application that can actually be executed + // in multiple environments. i.e: it can run natively integrated in a QtApplication + // or it can be executed as part of a WebPage when compiled into WebAssembly. + class IStoneApplication : public boost::noncopyable + { + protected: + StoneApplicationContext* context_; + + public: + virtual ~IStoneApplication() + { + } + + virtual void DeclareStartupOptions(boost::program_options::options_description& options) = 0; + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) = 0; + + /** + This method is meant to process messages received from the outside world (i.e. GUI) + */ + virtual void HandleSerializedMessage(const char* data) = 0; + +#if ORTHANC_ENABLE_WASM==1 + virtual void InitializeWasm() {} // specific initialization when the app is running in WebAssembly. This is called after the other Initialize() +#endif +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow() = 0; +#endif + + virtual std::string GetTitle() const = 0; + + virtual void SetCentralWidget(boost::shared_ptr widget) = 0; + + virtual boost::shared_ptr GetCentralWidget() = 0; + + virtual void Finalize() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,238 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "QCairoWidget.h" + +#include +#include + +#include + + +QCairoWidget::StoneObserver::StoneObserver(QCairoWidget& that, + Deprecated::IViewport& viewport, + OrthancStone::MessageBroker& broker) : + OrthancStone::IObserver(broker), + that_(that) +{ + // get notified each time the content of the central viewport changes + viewport.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &StoneObserver::OnViewportChanged)); +} + + +QCairoWidget::QCairoWidget(QWidget *parent) : + QWidget(parent), + context_(NULL) +{ + setFocusPolicy(Qt::StrongFocus); // catch keyPressEvents +} + + +void QCairoWidget::SetContext(OrthancStone::NativeStoneApplicationContext& context) +{ + context_ = &context; + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + observer_.reset(new StoneObserver(*this, + locker.GetCentralViewport(), + locker.GetMessageBroker())); + } +} + + +void QCairoWidget::paintEvent(QPaintEvent* /*event*/) +{ + QPainter painter(this); + + if (image_.get() != NULL && + context_ != NULL) + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + Deprecated::IViewport& viewport = locker.GetCentralViewport(); + Orthanc::ImageAccessor a; + surface_.GetWriteableAccessor(a); + viewport.Render(a); + painter.drawImage(0, 0, *image_); + } + else + { + painter.fillRect(rect(), Qt::red); + } +} + +OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event) +{ + Qt::KeyboardModifiers qtModifiers = event->modifiers(); + int stoneModifiers = static_cast(OrthancStone::KeyboardModifiers_None); + if ((qtModifiers & Qt::AltModifier) != 0) + { + stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Alt); + } + if ((qtModifiers & Qt::ControlModifier) != 0) + { + stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Control); + } + if ((qtModifiers & Qt::ShiftModifier) != 0) + { + stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Shift); + } + return static_cast(stoneModifiers); +} + +void QCairoWidget::mousePressEvent(QMouseEvent* event) +{ + OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); + + OrthancStone::MouseButton button; + + switch (event->button()) + { + case Qt::LeftButton: + button = OrthancStone::MouseButton_Left; + break; + + case Qt::RightButton: + button = OrthancStone::MouseButton_Right; + break; + + case Qt::MiddleButton: + button = OrthancStone::MouseButton_Middle; + break; + + default: + return; // Unsupported button + } + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers, std::vector()); + } +} + + +void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) +{ + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseLeave(); +} + + +void QCairoWidget::mouseMoveEvent(QMouseEvent* event) +{ + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseMove(event->pos().x(), event->pos().y(), std::vector()); +} + + +void QCairoWidget::wheelEvent(QWheelEvent * event) +{ + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + + OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); + + if (event->orientation() == Qt::Vertical) + { + if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions + { + locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); + } + else + { + locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); + } + } +} + +void QCairoWidget::keyPressEvent(QKeyEvent *event) +{ + using namespace OrthancStone; + + OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); + + OrthancStone::KeyboardKeys keyType = OrthancStone::KeyboardKeys_Generic; + char keyChar = event->text()[0].toLatin1(); + +#define CASE_QT_KEY_TO_ORTHANC(qt, o) case qt: keyType = o; break; + if (keyChar == 0) + { + switch (event->key()) + { + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Up, KeyboardKeys_Up); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Down, KeyboardKeys_Down); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Left, KeyboardKeys_Left); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Right, KeyboardKeys_Right); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F1, KeyboardKeys_F1); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F2, KeyboardKeys_F2); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F3, KeyboardKeys_F3); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F4, KeyboardKeys_F4); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F5, KeyboardKeys_F5); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F6, KeyboardKeys_F6); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F7, KeyboardKeys_F7); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F8, KeyboardKeys_F8); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F9, KeyboardKeys_F9); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F10, KeyboardKeys_F10); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F11, KeyboardKeys_F11); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_F12, KeyboardKeys_F12); + default: + break; + } + } + else if (keyChar == 127) + { + switch (event->key()) + { + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Delete, KeyboardKeys_Delete); + CASE_QT_KEY_TO_ORTHANC(Qt::Key_Backspace, KeyboardKeys_Backspace); + default: + break; + } + } + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().KeyPressed(keyType, keyChar, stoneModifiers); + } +} + + +void QCairoWidget::resizeEvent(QResizeEvent* event) +{ + grabGesture(Qt::PanGesture); + QWidget::resizeEvent(event); + + if (event) + { + surface_.SetSize(event->size().width(), event->size().height(), true); + + image_.reset(new QImage(reinterpret_cast(surface_.GetBuffer()), + event->size().width(), + event->size().height(), + surface_.GetPitch(), + QImage::Format_RGB32)); + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().SetSize(event->size().width(), event->size().height()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,88 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../../Applications/Generic/NativeStoneApplicationContext.h" +#include "../../Framework/Wrappers/CairoSurface.h" +#include "../../Framework/Deprecated/Widgets/IWidget.h" + +#include +#include +#include + +class QCairoWidget : public QWidget +{ + Q_OBJECT + +private: + class StoneObserver : public OrthancStone::IObserver + { + private: + QCairoWidget& that_; + + public: + StoneObserver(QCairoWidget& that, + Deprecated::IViewport& viewport, + OrthancStone::MessageBroker& broker); + + void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) + { + that_.OnViewportChanged(); + } + }; + + std::unique_ptr image_; + OrthancStone::CairoSurface surface_; + OrthancStone::NativeStoneApplicationContext* context_; + std::unique_ptr observer_; + +protected: + virtual void paintEvent(QPaintEvent *event); + + virtual void resizeEvent(QResizeEvent *event); + + virtual void mouseMoveEvent(QMouseEvent *event); + + virtual void mousePressEvent(QMouseEvent *event); + + virtual void mouseReleaseEvent(QMouseEvent *event); + + virtual void wheelEvent(QWheelEvent *event); + + virtual void keyPressEvent(QKeyEvent *event); + +public: + explicit QCairoWidget(QWidget *parent); + + void SetContext(OrthancStone::NativeStoneApplicationContext& context); + + void OnViewportChanged() + { + update(); // schedule a repaint (handled by Qt) + emit ContentChanged(); + } + +signals: + void ContentChanged(); + +public slots: + +}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "QStoneMainWindow.h" + +namespace OrthancStone +{ + + QStoneMainWindow::QStoneMainWindow(NativeStoneApplicationContext& context, + QWidget *parent) : + QMainWindow(parent), + context_(context), + cairoCentralWidget_(NULL) + { + } + + void QStoneMainWindow::SetCentralStoneWidget(QCairoWidget& centralWidget) + { + cairoCentralWidget_ = ¢ralWidget; + cairoCentralWidget_->SetContext(context_); + } + + QStoneMainWindow::~QStoneMainWindow() + { + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,45 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include + +#include "QCairoWidget.h" +#include "../Generic/NativeStoneApplicationContext.h" + +namespace OrthancStone +{ + class QStoneMainWindow : public QMainWindow + { + Q_OBJECT + + private: + OrthancStone::NativeStoneApplicationContext& context_; + QCairoWidget *cairoCentralWidget_; + + protected: // you must inherit this class + QStoneMainWindow(NativeStoneApplicationContext& context, QWidget *parent = 0); + void SetCentralStoneWidget(QCairoWidget& centralWidget); + + public: + virtual ~QStoneMainWindow(); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#if ORTHANC_ENABLE_QT != 1 +#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 +#endif + +#include "QtStoneApplicationRunner.h" +#include +#include + +#include "../../Framework/Deprecated/Toolbox/MessagingToolbox.h" + +#include +#include +#include +#include +#include "../../Platforms/Generic/OracleWebService.h" + + +namespace OrthancStone +{ + void QtStoneApplicationRunner::Initialize() + { + } + + void QtStoneApplicationRunner::DeclareCommandLineOptions(boost::program_options::options_description& options) + { + } + + void QtStoneApplicationRunner::Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]) + { + context.Start(); + + QApplication qtApplication(argc, argv); + window_.reset(application_.CreateQtMainWindow()); + + window_->show(); + qtApplication.exec(); + + context.Stop(); + } + + void QtStoneApplicationRunner::Finalize() + { + } + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Generic/NativeStoneApplicationRunner.h" +#include "QStoneMainWindow.h" + +#if ORTHANC_ENABLE_QT != 1 +#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 +#endif + +namespace OrthancStone +{ + class QtStoneApplicationRunner : public NativeStoneApplicationRunner + { + protected: + std::unique_ptr window_; + + public: + QtStoneApplicationRunner(MessageBroker& broker, + IStoneApplication& application) + : NativeStoneApplicationRunner(broker, application) + { + } + + + virtual void Initialize(); + + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options); + virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters) {} + virtual void Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]); + virtual void Finalize(); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/BasicPetCtFusionApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/BasicPetCtFusionApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,202 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleInteractor.h" + +#include + +namespace OrthancStone +{ + namespace Samples + { + class BasicPetCtFusionApplication : public SampleApplicationBase + { + private: + class Interactor : public SampleInteractor + { + public: + static void SetStyle(LayeredSceneWidget& widget, + bool ct, + bool pet) + { + if (ct) + { + RenderStyle style; + style.windowing_ = ImageWindowing_Bone; + widget.SetLayerStyle(0, style); + } + else + { + RenderStyle style; + style.visible_ = false; + widget.SetLayerStyle(0, style); + } + + if (ct && pet) + { + RenderStyle style; + style.applyLut_ = true; + style.alpha_ = 0.5; + widget.SetLayerStyle(1, style); + } + else if (pet) + { + RenderStyle style; + style.applyLut_ = true; + widget.SetLayerStyle(1, style); + } + else + { + RenderStyle style; + style.visible_ = false; + widget.SetLayerStyle(1, style); + } + } + + + static bool IsVisible(LayeredSceneWidget& widget, + size_t layer) + { + RenderStyle style = widget.GetLayerStyle(layer); + return style.visible_; + } + + + static void ToggleInterpolation(LayeredSceneWidget& widget, + size_t layer) + { + RenderStyle style = widget.GetLayerStyle(layer); + + if (style.interpolation_ == ImageInterpolation_Bilinear) + { + style.interpolation_ = ImageInterpolation_Nearest; + } + else + { + style.interpolation_ = ImageInterpolation_Bilinear; + } + + widget.SetLayerStyle(layer, style); + } + + + Interactor(VolumeImage& volume, + VolumeProjection projection, + bool reverse) : + SampleInteractor(volume, projection, reverse) + { + } + + + virtual void KeyPressed(WorldSceneWidget& widget, + char key, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + LayeredSceneWidget& layered = dynamic_cast(widget); + + switch (key) + { + case 'c': + // Toggle the visibility of the CT layer + SetStyle(layered, !IsVisible(layered, 0), IsVisible(layered, 1)); + break; + + case 'p': + // Toggle the visibility of the PET layer + SetStyle(layered, IsVisible(layered, 0), !IsVisible(layered, 1)); + break; + + case 'i': + { + // Toggle on/off the interpolation + ToggleInterpolation(layered, 0); + ToggleInterpolation(layered, 1); + break; + } + + default: + break; + } + } + }; + + + public: + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("ct", boost::program_options::value(), + "Orthanc ID of the CT series") + ("pet", boost::program_options::value(), + "Orthanc ID of the PET series") + ("threads", boost::program_options::value()->default_value(3), + "Number of download threads for the CT series") + ; + + options.add(generic); + } + + virtual void Initialize(BasicApplicationContext& context, + IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + if (parameters.count("ct") != 1 || + parameters.count("pet") != 1) + { + LOG(ERROR) << "The series ID is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string ct = parameters["ct"].as(); + std::string pet = parameters["pet"].as(); + unsigned int threads = parameters["threads"].as(); + + VolumeImage& ctVolume = context.AddSeriesVolume(ct, true /* progressive download */, threads); + VolumeImage& petVolume = context.AddSeriesVolume(pet, true /* progressive download */, 1); + + // Take the PET volume as the reference for the slices + std::unique_ptr interactor(new Interactor(petVolume, VolumeProjection_Axial, false /* don't reverse normal */)); + + std::unique_ptr widget(new LayeredSceneWidget); + widget->AddLayer(new VolumeImage::LayerFactory(ctVolume)); + widget->AddLayer(new VolumeImage::LayerFactory(petVolume)); + widget->SetSlice(interactor->GetCursor().GetCurrentSlice()); + widget->SetInteractor(*interactor); + + Interactor::SetStyle(*widget, true, true); // Initially, show both CT and PET layers + + context.AddInteractor(interactor.release()); + context.SetCentralWidget(widget.release()); + + statusBar.SetMessage("Use the key \"t\" to toggle the fullscreen mode"); + statusBar.SetMessage("Use the key \"c\" to show/hide the CT layer"); + statusBar.SetMessage("Use the key \"p\" to show/hide the PET layer"); + statusBar.SetMessage("Use the key \"i\" to toggle the smoothing of the images"); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,292 @@ +# Usage (Linux): +# to build the WASM samples +# source ~/Downloads/emsdk/emsdk_env.sh && cmake -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc -DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON +# to build the Qt samples + +cmake_minimum_required(VERSION 2.8.3) +project(OrthancStone) + +include(../../../Resources/CMake/OrthancStoneParameters.cmake) + +set(ENABLE_STONE_DEPRECATED ON) # Need deprecated classes for these samples +set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON) + +include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +set(ORTHANC_STONE_APPLICATION_RESOURCES + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +if (OPENSSL_NO_CAPIENG) +add_definitions(-DOPENSSL_NO_CAPIENG=1) +endif() + + +# the following block has been borrowed from orthanc/**/Compiler.cmake +if (MSVC_MULTIPLE_PROCESSES) +# "If you omit the processMax argument in the /MP option, the +# compiler obtains the number of effective processors from the +# operating system, and then creates one process per effective +# processor" +# https://blog.kitware.com/cmake-building-with-all-your-cores/ +# https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") +endif() + +#set(ENABLE_DCMTK ON) + +set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") +set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") +set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") + +if (ENABLE_WASM) + ##################################################################### + ## Configuration of the Emscripten compiler for WebAssembly target + ##################################################################### + + set(WASM_FLAGS "-s WASM=1") + set(WASM_FLAGS "${WASM_FLAGS} -s STRICT=1") # drops support for all deprecated build options + set(WASM_FLAGS "${WASM_FLAGS} -s FILESYSTEM=1") # if we don't include it, gen_uuid.c fails to build because srand, getpid(), ... are not defined + set(WASM_FLAGS "${WASM_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0") # actually enable exception catching + set(WASM_FLAGS "${WASM_FLAGS} -s ERROR_ON_MISSING_LIBRARIES=1") + + if (CMAKE_BUILD_TYPE MATCHES DEBUG) + set(WASM_FLAGS "${WASM_FLAGS} -g4") # generate debug information + set(WASM_FLAGS "${WASM_FLAGS} -s ASSERTIONS=2") # more runtime checks + else() + set(WASM_FLAGS "${WASM_FLAGS} -Os") # optimize for web (speed and size) + endif() + + set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS}") # not always clear which flags are for the compiler and which one are for the linker -> pass them all to the linker too + # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Applications/Samples/samples-library.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"'") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_STACK=128000000") + + add_definitions(-DORTHANC_ENABLE_WASM=1) + set(ORTHANC_SANDBOXED ON) + +elseif (ENABLE_QT OR ENABLE_SDL) + + set(ENABLE_NATIVE ON) + set(ORTHANC_SANDBOXED OFF) + set(ENABLE_CRYPTO_OPTIONS ON) + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_WEB_CLIENT ON) + +else() + set(ENABLE_NATIVE ON) + set(ENABLE_OPENGL OFF) + +endif() + + +##################################################################### +## Configuration for Orthanc +##################################################################### + +# include(../../Resources/CMake/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.4.1") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + +add_definitions( + -DORTHANC_ENABLE_LOGGING_PLUGIN=0 + ) + + +##################################################################### +## Build a static library containing the Orthanc Stone framework +##################################################################### + + +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) + +include(../../../Resources/CMake/OrthancStoneConfiguration.cmake) + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + +##################################################################### +## Build all the sample applications +##################################################################### + +include_directories(${ORTHANC_STONE_ROOT}) + +# files common to all samples +list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleInteractor.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleApplicationBase.h + ) + +if (ENABLE_QT) + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp + ) + + ORTHANC_QT_WRAP_UI(SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui + ) + + ORTHANC_QT_WRAP_CPP(SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Qt/QCairoWidget.h + ${ORTHANC_STONE_ROOT}/Applications/Qt/QStoneMainWindow.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h + ) +endif() + +if (ENABLE_NATIVE) + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleMainNative.cpp + ) + +elseif (ENABLE_WASM) + + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleMainWasm.cpp + ${STONE_WASM_SOURCES} + ) +endif() + + +macro(BuildSingleFileSample Target Header Sample) + add_executable(${Target} + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/${Header} + ${SAMPLE_APPLICATIONS_SOURCES} + ) + set_target_properties(${Target} PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=${Sample}) + target_link_libraries(${Target} OrthancStone) +endmacro() + + +if (ENABLE_SDL) + #BuildSingleFileSample(OrthancStoneEmpty EmptyApplication.h 1) + #BuildSingleFileSample(OrthancStoneTestPattern TestPatternApplication.h 2) + BuildSingleFileSample(OrthancStoneSingleFrame SingleFrameApplication.h 3) + #BuildSingleFileSample(OrthancStoneSingleVolume SingleVolumeApplication.h 4) + #BuildSingleFileSample(OrthancStoneBasicPetCtFusion 5) + #BuildSingleFileSample(OrthancStoneSynchronizedSeries 6) + #BuildSingleFileSample(OrthancStoneLayoutPetCtFusion 7) + BuildSingleFileSample(OrthancStoneSimpleViewerSingleFile SimpleViewerApplicationSingleFile.h 8) # we keep that one just as a sample before we convert another sample to this pattern + BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) +endif() + +##### SimpleViewer sample (Qt and WASM only) ####### + +if (ENABLE_QT OR ENABLE_WASM) + + if (ENABLE_QT) + list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp + ) + + ORTHANC_QT_WRAP_UI(SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui + ) + + ORTHANC_QT_WRAP_CPP(SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h + ) + +elseif (ENABLE_WASM) + list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h + ${STONE_WASM_SOURCES} + ) + endif() + + add_executable(OrthancStoneSimpleViewer + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h + ${SIMPLE_VIEWER_APPLICATION_SOURCES} + ) + target_link_libraries(OrthancStoneSimpleViewer OrthancStone) + + BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) +endif() + +##################################################################### +## Build the unit tests +##################################################################### + +if (ENABLE_NATIVE) + add_executable(UnitTests + ${GOOGLE_TEST_SOURCES} + ${ORTHANC_STONE_ROOT}/UnitTestsSources/GenericToolboxTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/ImageToolboxTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/PixelTestPatternsTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStrategy.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStructureSet.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp + ) + + target_link_libraries(UnitTests OrthancStone) + + add_custom_command( + TARGET UnitTests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${ORTHANC_STONE_ROOT}/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" + "$/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" + ) + +endif() + +##################################################################### +## Generate the documentation if Doxygen is present +##################################################################### + +find_package(Doxygen) +if (DOXYGEN_FOUND) + configure_file( + ${ORTHANC_STONE_ROOT}/Resources/OrthancStone.doxygen + ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen + @ONLY) + + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen + COMMENT "Generating documentation with Doxygen" VERBATIM + ) +else() + message("Doxygen not found. The documentation will not be built.") +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt.old --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt.old Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,248 @@ +# Usage: see README file + +cmake_minimum_required(VERSION 2.8.3) + +# Automatically link Qt executables to qtmain target on Windows +# ("OLD" == do not link) +if(POLICY CMP0020) + cmake_policy(SET CMP0020 OLD) +endif() + +# Only interpret if() arguments as variables or keywords when unquoted. +# NEW = do NOT dereference *quoted* variables +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +project(OrthancStone) + +include(../../Resources/CMake/OrthancStoneParameters.cmake) + +#set(ENABLE_DCMTK ON) + +set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") +set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") +set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") + +# TODO: replace or compute STONE_SOURCES_DIR from CMAKE_CURRENT_LIST_FILE + +if (ENABLE_WASM) + ##################################################################### + ## Configuration of the Emscripten compiler for WebAssembly target + ##################################################################### + + set(WASM_FLAGS "-s WASM=1 -O0 -g0") + message("*****************************************************************************") + message("WARNING: optimizations are disabled in emcc!!! Enable them for production use") + message("*****************************************************************************") + set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") + + # Handling of memory + #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") # Resize + #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") # 512MB + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=536870912 -s TOTAL_STACK=128000000") # 512MB + resize + #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=1073741824") # 1GB + resize + + # To debug exceptions + #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DEMANGLE_SUPPORT=1 -s ASSERTIONS=2") + + add_definitions(-DORTHANC_ENABLE_WASM=1) + set(ORTHANC_SANDBOXED ON) + +elseif (ENABLE_QT OR ENABLE_SDL) + + set(ENABLE_NATIVE ON) + set(ORTHANC_SANDBOXED OFF) + set(ENABLE_CRYPTO_OPTIONS ON) + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_WEB_CLIENT ON) + +endif() + +##################################################################### +## Configuration for Orthanc +##################################################################### + +# include(../../Resources/CMake/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.4.1") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + +##################################################################### +## Build a static library containing the Orthanc Stone framework +##################################################################### + +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) + +include(../../Resources/CMake/OrthancStoneConfiguration.cmake) + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + +##################################################################### +## Build all the sample applications +##################################################################### + +include_directories(${ORTHANC_STONE_ROOT}) + +# files common to all samples +list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleInteractor.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleApplicationBase.h + ) + +if (ENABLE_QT) + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleQtApplicationRunner.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.cpp + ) + + ORTHANC_QT_WRAP_UI(SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.ui + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.ui + ) + + ORTHANC_QT_WRAP_CPP(SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Qt/QCairoWidget.h + ${ORTHANC_STONE_ROOT}/Applications/Qt/QStoneMainWindow.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.h + ) +endif() + +if (ENABLE_NATIVE) + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleMainNative.cpp + ) + +elseif (ENABLE_WASM) + + list(APPEND SAMPLE_APPLICATIONS_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleMainWasm.cpp + ${STONE_WASM_SOURCES} + ) +endif() + + +macro(BuildSingleFileSample Target Header Sample) + add_executable(${Target} + ${ORTHANC_STONE_ROOT}/Applications/Samples/${Header} + ${SAMPLE_APPLICATIONS_SOURCES} + ) + set_target_properties(${Target} PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=${Sample}) + target_link_libraries(${Target} OrthancStone) + + if (ENABLE_QT AND (CMAKE_SYSTEM_NAME STREQUAL "Windows")) + message("(ENABLE_QT and (CMAKE_SYSTEM_NAME matches \"Windows\")) is true") + add_custom_command( + TARGET ${Target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ + ) + endif() +endmacro() + +#BuildSingleFileSample(OrthancStoneEmpty EmptyApplication.h 1) +#BuildSingleFileSample(OrthancStoneTestPattern TestPatternApplication.h 2) +BuildSingleFileSample(OrthancStoneSingleFrame SingleFrameApplication.h 3) +#BuildSingleFileSample(OrthancStoneSingleVolume SingleVolumeApplication.h 4) +#BuildSingleFileSample(OrthancStoneBasicPetCtFusion 5) +#BuildSingleFileSample(OrthancStoneSynchronizedSeries 6) +#BuildSingleFileSample(OrthancStoneLayoutPetCtFusion 7) +BuildSingleFileSample(OrthancStoneSimpleViewerSingleFile SimpleViewerApplicationSingleFile.h 8) # we keep that one just as a sample before we convert another sample to this pattern +BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) + +##### SimpleViewer sample (Qt and WASM only) ####### + +if (ENABLE_QT OR ENABLE_WASM) + + # GenerateCodeFromFlatBufferSchema("${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ApplicationCommands.fbs") + + list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES ${FLATC_AUTOGENERATED_SOURCES}) + message(STATUS "SIMPLE_VIEWER_APPLICATION_SOURCES = ${SIMPLE_VIEWER_APPLICATION_SOURCES}") + message(STATUS "FLATC_AUTOGENERATED_SOURCES = ${FLATC_AUTOGENERATED_SOURCES}") + + if (ENABLE_QT) + list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.ui + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/mainQt.cpp + ) + + ORTHANC_QT_WRAP_UI(SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.ui + ) + + ORTHANC_QT_WRAP_CPP(SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.h + ) + +elseif (ENABLE_WASM) + list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Wasm/mainWasm.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp + ${STONE_WASM_SOURCES} + ) + endif() + + add_executable(OrthancStoneSimpleViewer + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/SimpleViewerApplication.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ThumbnailInteractor.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/MainWidgetInteractor.cpp + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/AppStatus.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Messages.h + ${SIMPLE_VIEWER_APPLICATION_SOURCES} + ) + target_link_libraries(OrthancStoneSimpleViewer OrthancStone) + +endif() + +##################################################################### +## Build the unit tests +##################################################################### + +if (ENABLE_NATIVE) + add_executable(UnitTests + ${GOOGLE_TEST_SOURCES} + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestExceptions.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp + ) + + target_link_libraries(UnitTests OrthancStone) +endif() + +##################################################################### +## Generate the documentation if Doxygen is present +##################################################################### + +find_package(Doxygen) +if (DOXYGEN_FOUND) + configure_file( + ${ORTHANC_STONE_ROOT}/Resources/OrthancStone.doxygen + ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen + @ONLY) + + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen + COMMENT "Generating documentation with Doxygen" VERBATIM + ) +else() + message("Doxygen not found. The documentation will not be built.") +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/EmptyApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/EmptyApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Widgets/EmptyWidget.h" + +namespace OrthancStone +{ + namespace Samples + { + class EmptyApplication : public SampleApplicationBase + { + public: + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("red", boost::program_options::value()->default_value(255), "Background color: red channel") + ("green", boost::program_options::value()->default_value(0), "Background color: green channel") + ("blue", boost::program_options::value()->default_value(0), "Background color: blue channel") + ; + + options.add(generic); + } + + virtual void Initialize(IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + int red = parameters["red"].as(); + int green = parameters["green"].as(); + int blue = parameters["blue"].as(); + + context_->SetCentralWidget(new EmptyWidget(red, green, blue)); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/LayoutPetCtFusionApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/LayoutPetCtFusionApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,398 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleInteractor.h" + +#include "../../../Framework/Layers/ReferenceLineFactory.h" +#include "../../../Framework/Layers/DicomStructureSetSlicer.h" +#include "../../../Framework/Widgets/LayoutWidget.h" + +#include + +namespace OrthancStone +{ + namespace Samples + { + class LayoutPetCtFusionApplication : + public SampleApplicationBase, + public LayeredSceneWidget::ISliceObserver, + public WorldSceneWidget::IWorldObserver + { + private: + class Interactor : public SampleInteractor + { + private: + LayoutPetCtFusionApplication& that_; + + public: + Interactor(LayoutPetCtFusionApplication& that, + VolumeImage& volume, + VolumeProjection projection, + bool reverse) : + SampleInteractor(volume, projection, reverse), + that_(that) + { + } + + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const SliceGeometry& slice, + const ViewportGeometry& view, + MouseButton button, + double x, + double y, + IStatusBar* statusBar) + { + if (button == MouseButton_Left) + { + // Center the sibling views over the clicked point + Vector p = slice.MapSliceToWorldCoordinates(x, y); + + if (statusBar != NULL) + { + char buf[64]; + sprintf(buf, "Click on coordinates (%.02f,%.02f,%.02f) in cm", p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); + statusBar->SetMessage(buf); + } + + that_.interactorAxial_->LookupSliceContainingPoint(*that_.ctAxial_, p); + that_.interactorCoronal_->LookupSliceContainingPoint(*that_.ctCoronal_, p); + that_.interactorSagittal_->LookupSliceContainingPoint(*that_.ctSagittal_, p); + } + + return NULL; + } + + virtual void KeyPressed(WorldSceneWidget& widget, + char key, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + if (key == 's') + { + that_.FitContent(); + } + } + }; + + bool processingEvent_; + Interactor* interactorAxial_; + Interactor* interactorCoronal_; + Interactor* interactorSagittal_; + LayeredSceneWidget* ctAxial_; + LayeredSceneWidget* ctCoronal_; + LayeredSceneWidget* ctSagittal_; + LayeredSceneWidget* petAxial_; + LayeredSceneWidget* petCoronal_; + LayeredSceneWidget* petSagittal_; + LayeredSceneWidget* fusionAxial_; + LayeredSceneWidget* fusionCoronal_; + LayeredSceneWidget* fusionSagittal_; + + + void FitContent() + { + petAxial_->FitContent(); + petCoronal_->FitContent(); + petSagittal_->FitContent(); + } + + + void AddLayer(LayeredSceneWidget& widget, + VolumeImage& volume, + bool isCt) + { + size_t layer; + widget.AddLayer(layer, new VolumeImage::LayerFactory(volume)); + + if (isCt) + { + RenderStyle style; + style.windowing_ = ImageWindowing_Bone; + widget.SetLayerStyle(layer, style); + } + else + { + RenderStyle style; + style.applyLut_ = true; + style.alpha_ = (layer == 0 ? 1.0f : 0.5f); + widget.SetLayerStyle(layer, style); + } + } + + + void ConnectSiblingLocations(LayeredSceneWidget& axial, + LayeredSceneWidget& coronal, + LayeredSceneWidget& sagittal) + { + ReferenceLineFactory::Configure(axial, coronal); + ReferenceLineFactory::Configure(axial, sagittal); + ReferenceLineFactory::Configure(coronal, sagittal); + } + + + void SynchronizeView(const WorldSceneWidget& source, + const ViewportGeometry& view, + LayeredSceneWidget& widget1, + LayeredSceneWidget& widget2, + LayeredSceneWidget& widget3) + { + if (&source == &widget1 || + &source == &widget2 || + &source == &widget3) + { + if (&source != &widget1) + { + widget1.SetView(view); + } + + if (&source != &widget2) + { + widget2.SetView(view); + } + + if (&source != &widget3) + { + widget3.SetView(view); + } + } + } + + + void SynchronizeSlice(const LayeredSceneWidget& source, + const SliceGeometry& slice, + LayeredSceneWidget& widget1, + LayeredSceneWidget& widget2, + LayeredSceneWidget& widget3) + { + if (&source == &widget1 || + &source == &widget2 || + &source == &widget3) + { + if (&source != &widget1) + { + widget1.SetSlice(slice); + } + + if (&source != &widget2) + { + widget2.SetSlice(slice); + } + + if (&source != &widget3) + { + widget3.SetSlice(slice); + } + } + } + + + LayeredSceneWidget* CreateWidget() + { + std::unique_ptr widget(new LayeredSceneWidget); + widget->Register(dynamic_cast(*this)); + widget->Register(dynamic_cast(*this)); + return widget.release(); + } + + + void CreateLayout(BasicApplicationContext& context) + { + std::unique_ptr layout(new OrthancStone::LayoutWidget); + layout->SetBackgroundCleared(true); + //layout->SetBackgroundColor(255,0,0); + layout->SetPadding(5); + + OrthancStone::LayoutWidget& layoutA = dynamic_cast + (layout->AddWidget(new OrthancStone::LayoutWidget)); + layoutA.SetPadding(0, 0, 0, 0, 5); + layoutA.SetVertical(); + petAxial_ = &dynamic_cast(layoutA.AddWidget(CreateWidget())); + OrthancStone::LayoutWidget& layoutA2 = dynamic_cast + (layoutA.AddWidget(new OrthancStone::LayoutWidget)); + layoutA2.SetPadding(0, 0, 0, 0, 5); + petSagittal_ = &dynamic_cast(layoutA2.AddWidget(CreateWidget())); + petCoronal_ = &dynamic_cast(layoutA2.AddWidget(CreateWidget())); + + OrthancStone::LayoutWidget& layoutB = dynamic_cast + (layout->AddWidget(new OrthancStone::LayoutWidget)); + layoutB.SetPadding(0, 0, 0, 0, 5); + layoutB.SetVertical(); + ctAxial_ = &dynamic_cast(layoutB.AddWidget(CreateWidget())); + OrthancStone::LayoutWidget& layoutB2 = dynamic_cast + (layoutB.AddWidget(new OrthancStone::LayoutWidget)); + layoutB2.SetPadding(0, 0, 0, 0, 5); + ctSagittal_ = &dynamic_cast(layoutB2.AddWidget(CreateWidget())); + ctCoronal_ = &dynamic_cast(layoutB2.AddWidget(CreateWidget())); + + OrthancStone::LayoutWidget& layoutC = dynamic_cast + (layout->AddWidget(new OrthancStone::LayoutWidget)); + layoutC.SetPadding(0, 0, 0, 0, 5); + layoutC.SetVertical(); + fusionAxial_ = &dynamic_cast(layoutC.AddWidget(CreateWidget())); + OrthancStone::LayoutWidget& layoutC2 = dynamic_cast + (layoutC.AddWidget(new OrthancStone::LayoutWidget)); + layoutC2.SetPadding(0, 0, 0, 0, 5); + fusionSagittal_ = &dynamic_cast(layoutC2.AddWidget(CreateWidget())); + fusionCoronal_ = &dynamic_cast(layoutC2.AddWidget(CreateWidget())); + + context.SetCentralWidget(layout.release()); + } + + + public: + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("ct", boost::program_options::value(), + "Orthanc ID of the CT series") + ("pet", boost::program_options::value(), + "Orthanc ID of the PET series") + ("rt", boost::program_options::value(), + "Orthanc ID of the DICOM RT-STRUCT series (optional)") + ("threads", boost::program_options::value()->default_value(3), + "Number of download threads for the CT series") + ; + + options.add(generic); + } + + virtual void Initialize(BasicApplicationContext& context, + IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + processingEvent_ = true; + + if (parameters.count("ct") != 1 || + parameters.count("pet") != 1) + { + LOG(ERROR) << "The series ID is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string ct = parameters["ct"].as(); + std::string pet = parameters["pet"].as(); + unsigned int threads = parameters["threads"].as(); + + VolumeImage& ctVolume = context.AddSeriesVolume(ct, true /* progressive download */, threads); + VolumeImage& petVolume = context.AddSeriesVolume(pet, true /* progressive download */, 1); + + // Take the PET volume as the reference for the slices + interactorAxial_ = &dynamic_cast + (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Axial, false))); + interactorCoronal_ = &dynamic_cast + (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Coronal, false))); + interactorSagittal_ = &dynamic_cast + (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Sagittal, true))); + + CreateLayout(context); + + AddLayer(*ctAxial_, ctVolume, true); + AddLayer(*ctCoronal_, ctVolume, true); + AddLayer(*ctSagittal_, ctVolume, true); + + AddLayer(*petAxial_, petVolume, false); + AddLayer(*petCoronal_, petVolume, false); + AddLayer(*petSagittal_, petVolume, false); + + AddLayer(*fusionAxial_, ctVolume, true); + AddLayer(*fusionAxial_, petVolume, false); + AddLayer(*fusionCoronal_, ctVolume, true); + AddLayer(*fusionCoronal_, petVolume, false); + AddLayer(*fusionSagittal_, ctVolume, true); + AddLayer(*fusionSagittal_, petVolume, false); + + if (parameters.count("rt") == 1) + { + DicomStructureSet& rtStruct = context.AddStructureSet(parameters["rt"].as()); + + Vector p = rtStruct.GetStructureCenter(0); + interactorAxial_->GetCursor().LookupSliceContainingPoint(p); + + ctAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); + petAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); + fusionAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); + } + + ConnectSiblingLocations(*ctAxial_, *ctCoronal_, *ctSagittal_); + ConnectSiblingLocations(*petAxial_, *petCoronal_, *petSagittal_); + ConnectSiblingLocations(*fusionAxial_, *fusionCoronal_, *fusionSagittal_); + + interactorAxial_->AddWidget(*ctAxial_); + interactorAxial_->AddWidget(*petAxial_); + interactorAxial_->AddWidget(*fusionAxial_); + + interactorCoronal_->AddWidget(*ctCoronal_); + interactorCoronal_->AddWidget(*petCoronal_); + interactorCoronal_->AddWidget(*fusionCoronal_); + + interactorSagittal_->AddWidget(*ctSagittal_); + interactorSagittal_->AddWidget(*petSagittal_); + interactorSagittal_->AddWidget(*fusionSagittal_); + + processingEvent_ = false; + + statusBar.SetMessage("Use the key \"t\" to toggle the fullscreen mode"); + statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); + } + + virtual void NotifySizeChange(const WorldSceneWidget& source, + ViewportGeometry& view) + { + view.FitContent(); + } + + virtual void NotifyViewChange(const WorldSceneWidget& source, + const ViewportGeometry& view) + { + if (!processingEvent_) // Avoid reentrant calls + { + processingEvent_ = true; + + SynchronizeView(source, view, *ctAxial_, *petAxial_, *fusionAxial_); + SynchronizeView(source, view, *ctCoronal_, *petCoronal_, *fusionCoronal_); + SynchronizeView(source, view, *ctSagittal_, *petSagittal_, *fusionSagittal_); + + processingEvent_ = false; + } + } + + virtual void NotifySliceContentChange(const LayeredSceneWidget& source, + const SliceGeometry& slice) + { + if (!processingEvent_) // Avoid reentrant calls + { + processingEvent_ = true; + + SynchronizeSlice(source, slice, *ctAxial_, *petAxial_, *fusionAxial_); + SynchronizeSlice(source, slice, *ctCoronal_, *petCoronal_, *fusionCoronal_); + SynchronizeSlice(source, slice, *ctSagittal_, *petSagittal_, *fusionSagittal_); + + processingEvent_ = false; + } + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,53 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "SampleMainWindow.h" + +/** + * Don't use "ui_MainWindow.h" instead of below, as + * this makes CMake unable to detect when the UI file changes. + **/ +#include +#include "../../../Applications/Samples/SampleApplicationBase.h" + +namespace OrthancStone +{ + namespace Samples + { + + SampleMainWindow::SampleMainWindow( + OrthancStone::NativeStoneApplicationContext& context, + OrthancStone::Samples::SampleSingleCanvasApplicationBase& stoneSampleApplication, + QWidget *parent) : + QStoneMainWindow(context, parent), + ui_(new Ui::SampleMainWindow), + stoneSampleApplication_(stoneSampleApplication) + { + ui_->setupUi(this); + SetCentralStoneWidget(*ui_->cairoCentralWidget); + } + + SampleMainWindow::~SampleMainWindow() + { + delete ui_; + } + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "../../../Qt/QCairoWidget.h" +#include "../../../Qt/QStoneMainWindow.h" + +namespace Ui +{ + class SampleMainWindow; +} + +namespace OrthancStone +{ + namespace Samples + { + + class SampleSingleCanvasApplicationBase; + + class SampleMainWindow : public QStoneMainWindow + { + Q_OBJECT + + private: + Ui::SampleMainWindow* ui_; + SampleSingleCanvasApplicationBase& stoneSampleApplication_; + + public: + explicit SampleMainWindow(OrthancStone::NativeStoneApplicationContext& context, SampleSingleCanvasApplicationBase& stoneSampleApplication, QWidget *parent = 0); + ~SampleMainWindow(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ + + + SampleMainWindow + + + + 0 + 0 + 903 + 634 + + + + + 500 + 300 + + + + + 500 + 300 + + + + Stone of Orthanc + + + Qt::LeftToRight + + + + + 0 + 0 + + + + Qt::LeftToRight + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 500 + + + + + + + + + + 0 + 0 + 903 + 22 + + + + + Test + + + + + + + + + QCairoWidget + QGraphicsView +
QCairoWidget.h
+
+
+ + +
diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "SampleMainWindow.h" + +/** + * Don't use "ui_MainWindow.h" instead of below, as + * this makes CMake unable to detect when the UI file changes. + **/ +#include +#include "../../../Applications/Samples/SampleApplicationBase.h" + +namespace OrthancStone +{ + namespace Samples + { + + SampleMainWindowWithButtons::SampleMainWindowWithButtons( + OrthancStone::NativeStoneApplicationContext& context, + OrthancStone::Samples::SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication, + QWidget *parent) : + QStoneMainWindow(context, parent), + ui_(new Ui::SampleMainWindowWithButtons), + stoneSampleApplication_(stoneSampleApplication) + { + ui_->setupUi(this); + SetCentralStoneWidget(*ui_->cairoCentralWidget); + +#if QT_VERSION >= 0x050000 + connect(ui_->toolButton1, &QToolButton::clicked, this, &SampleMainWindowWithButtons::tool1Clicked); + connect(ui_->toolButton2, &QToolButton::clicked, this, &SampleMainWindowWithButtons::tool2Clicked); + connect(ui_->pushButton1, &QPushButton::clicked, this, &SampleMainWindowWithButtons::pushButton1Clicked); + connect(ui_->pushButton1, &QPushButton::clicked, this, &SampleMainWindowWithButtons::pushButton2Clicked); +#else + connect(ui_->toolButton1, SIGNAL(clicked()), this, SLOT(tool1Clicked())); + connect(ui_->toolButton2, SIGNAL(clicked()), this, SLOT(tool2Clicked())); + connect(ui_->pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1Clicked())); + connect(ui_->pushButton1, SIGNAL(clicked()), this, SLOT(pushButton2Clicked())); +#endif + + std::string pushButton1Name; + std::string pushButton2Name; + std::string tool1Name; + std::string tool2Name; + stoneSampleApplication_.GetButtonNames(pushButton1Name, pushButton2Name, tool1Name, tool2Name); + + ui_->toolButton1->setText(QString::fromStdString(tool1Name)); + ui_->toolButton2->setText(QString::fromStdString(tool2Name)); + ui_->pushButton1->setText(QString::fromStdString(pushButton1Name)); + ui_->pushButton2->setText(QString::fromStdString(pushButton2Name)); + } + + SampleMainWindowWithButtons::~SampleMainWindowWithButtons() + { + delete ui_; + } + + void SampleMainWindowWithButtons::tool1Clicked() + { + stoneSampleApplication_.OnTool1Clicked(); + } + + void SampleMainWindowWithButtons::tool2Clicked() + { + stoneSampleApplication_.OnTool2Clicked(); + } + + void SampleMainWindowWithButtons::pushButton1Clicked() + { + stoneSampleApplication_.OnPushButton1Clicked(); + } + + void SampleMainWindowWithButtons::pushButton2Clicked() + { + stoneSampleApplication_.OnPushButton2Clicked(); + } + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "../../../Qt/QCairoWidget.h" +#include "../../../Qt/QStoneMainWindow.h" + +namespace Ui +{ + class SampleMainWindowWithButtons; +} + +namespace OrthancStone +{ + namespace Samples + { + + class SampleSingleCanvasWithButtonsApplicationBase; + + class SampleMainWindowWithButtons : public QStoneMainWindow + { + Q_OBJECT + + private: + Ui::SampleMainWindowWithButtons* ui_; + SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication_; + + public: + explicit SampleMainWindowWithButtons(OrthancStone::NativeStoneApplicationContext& context, SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication, QWidget *parent = 0); + ~SampleMainWindowWithButtons(); + + private slots: + void tool1Clicked(); + void tool2Clicked(); + void pushButton1Clicked(); + void pushButton2Clicked(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,130 @@ + + + SampleMainWindowWithButtons + + + + 0 + 0 + 903 + 634 + + + + + 500 + 300 + + + + + 500 + 300 + + + + Stone of Orthanc + + + Qt::LeftToRight + + + + + 0 + 0 + + + + Qt::LeftToRight + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 500 + + + + + + + + + 0 + 100 + + + + + 16777215 + 100 + + + + + + + tool1 + + + + + + + tool2 + + + + + + + action1 + + + + + + + action2 + + + + + + + + + + + + 0 + 0 + 903 + 22 + + + + + Test + + + + + + + + + QCairoWidget + QGraphicsView +
QCairoWidget.h
+
+
+ + +
diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../../Qt/QtStoneApplicationRunner.h" + +#if ORTHANC_ENABLE_QT != 1 +#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 +#endif + +namespace OrthancStone +{ + namespace Samples + { + class SampleQtApplicationRunner : public OrthancStone::QtStoneApplicationRunner + { + protected: + virtual void InitializeMainWindow(OrthancStone::NativeStoneApplicationContext& context) + { + window_.reset(application_.CreateQtMainWindow()); + } + public: + SampleQtApplicationRunner(MessageBroker& broker, + SampleApplicationBase& application) + : OrthancStone::QtStoneApplicationRunner(broker, application) + { + } + + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleApplicationBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleApplicationBase.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,133 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../../Applications/IStoneApplication.h" +#include "../../../Framework/Deprecated/Widgets/WorldSceneWidget.h" + +#if ORTHANC_ENABLE_WASM==1 +#include "../../../Platforms/Wasm/WasmPlatformApplicationAdapter.h" +#include "../../../Platforms/Wasm/Defaults.h" +#endif + +#if ORTHANC_ENABLE_QT==1 +#include "Qt/SampleMainWindow.h" +#include "Qt/SampleMainWindowWithButtons.h" +#endif + +namespace OrthancStone +{ + namespace Samples + { + class SampleApplicationBase : public IStoneApplication + { + private: + boost::shared_ptr mainWidget_; + + public: + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE + { + } + + virtual std::string GetTitle() const ORTHANC_OVERRIDE + { + return "Stone of Orthanc - Sample"; + } + + /** + * In the basic samples, the commands are handled by the platform adapter and NOT + * by the application handler + */ + virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE {}; + + + virtual void Finalize() ORTHANC_OVERRIDE {} + + virtual void SetCentralWidget(boost::shared_ptr widget) ORTHANC_OVERRIDE + { + mainWidget_ = widget; + } + + virtual boost::shared_ptr GetCentralWidget() ORTHANC_OVERRIDE + { + return mainWidget_; + } + +#if ORTHANC_ENABLE_WASM==1 + // default implementations for a single canvas named "canvas" in the HTML and an emtpy WasmApplicationAdapter + + virtual void InitializeWasm() ORTHANC_OVERRIDE + { + AttachWidgetToWasmViewport("canvas", mainWidget_); + } + + virtual WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(MessageBroker& broker) + { + return new WasmPlatformApplicationAdapter(broker, *this); + } +#endif + + }; + + // this application actually works in Qt and WASM + class SampleSingleCanvasWithButtonsApplicationBase : public SampleApplicationBase + { +public: + virtual void OnPushButton1Clicked() {} + virtual void OnPushButton2Clicked() {} + virtual void OnTool1Clicked() {} + virtual void OnTool2Clicked() {} + + virtual void GetButtonNames(std::string& pushButton1, + std::string& pushButton2, + std::string& tool1, + std::string& tool2 + ) { + pushButton1 = "action1"; + pushButton2 = "action2"; + tool1 = "tool1"; + tool2 = "tool2"; + } + +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow() { + return new SampleMainWindowWithButtons(dynamic_cast(*context_), *this); + } +#endif + + }; + + // this application actually works in SDL and WASM + class SampleSingleCanvasApplicationBase : public SampleApplicationBase + { +public: + +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow() { + return new SampleMainWindow(dynamic_cast(*context_), *this); + } +#endif + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,131 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Widgets/LayeredSceneWidget.h" +#include "../../../Framework/Widgets/IWorldSceneInteractor.h" +#include "../../../Framework/Toolbox/ParallelSlicesCursor.h" + +namespace OrthancStone +{ + namespace Samples + { + /** + * This is a basic mouse interactor for sample applications. It + * contains a set of parallel slices in the 3D space. The mouse + * wheel events make the widget change the slice that is + * displayed. + **/ + class SampleInteractor : public IWorldSceneInteractor + { + private: + ParallelSlicesCursor cursor_; + + public: + SampleInteractor(VolumeImage& volume, + VolumeProjection projection, + bool reverse) + { + std::unique_ptr slices(volume.GetGeometry(projection, reverse)); + cursor_.SetGeometry(*slices); + } + + SampleInteractor(ISeriesLoader& series, + bool reverse) + { + if (reverse) + { + std::unique_ptr slices(series.GetGeometry().Reverse()); + cursor_.SetGeometry(*slices); + } + else + { + cursor_.SetGeometry(series.GetGeometry()); + } + } + + SampleInteractor(const ParallelSlices& slices) + { + cursor_.SetGeometry(slices); + } + + ParallelSlicesCursor& GetCursor() + { + return cursor_; + } + + void AddWidget(LayeredSceneWidget& widget) + { + widget.SetInteractor(*this); + widget.SetSlice(cursor_.GetCurrentSlice()); + } + + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const ViewportGeometry& view, + MouseButton button, + double x, + double y, + IStatusBar* statusBar) + { + return NULL; + } + + virtual void MouseOver(CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) + { + } + + virtual void MouseWheel(WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + if (cursor_.ApplyWheelEvent(direction, modifiers)) + { + dynamic_cast(widget).SetSlice(cursor_.GetCurrentSlice()); + } + } + + virtual void KeyPressed(WorldSceneWidget& widget, + char key, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + } + + void LookupSliceContainingPoint(LayeredSceneWidget& widget, + const Vector& p) + { + if (cursor_.LookupSliceContainingPoint(p)) + { + widget.SetSlice(cursor_.GetCurrentSlice()); + } + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleList.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleList.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +// The macro "ORTHANC_STONE_SAMPLE" must be set by the CMake script + +#if ORTHANC_STONE_SAMPLE == 1 +#include "EmptyApplication.h" +typedef OrthancStone::Samples::EmptyApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 2 +#include "TestPatternApplication.h" +typedef OrthancStone::Samples::TestPatternApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 3 +#include "SingleFrameApplication.h" +typedef OrthancStone::Samples::SingleFrameApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 4 +#include "SingleVolumeApplication.h" +typedef OrthancStone::Samples::SingleVolumeApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 5 +#include "BasicPetCtFusionApplication.h" +typedef OrthancStone::Samples::BasicPetCtFusionApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 6 +#include "SynchronizedSeriesApplication.h" +typedef OrthancStone::Samples::SynchronizedSeriesApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 7 +#include "LayoutPetCtFusionApplication.h" +typedef OrthancStone::Samples::LayoutPetCtFusionApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 8 +#include "SimpleViewerApplicationSingleFile.h" +typedef OrthancStone::Samples::SimpleViewerApplication SampleApplication; + +#elif ORTHANC_STONE_SAMPLE == 9 +#include "SingleFrameEditorApplication.h" +typedef OrthancStone::Samples::SingleFrameEditorApplication SampleApplication; + +#else +#error Please set the ORTHANC_STONE_SAMPLE macro +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainNative.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainNative.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SampleList.h" +#if ORTHANC_ENABLE_SDL==1 +#include "../../Sdl/SdlStoneApplicationRunner.h" +#endif +#if ORTHANC_ENABLE_QT==1 +#include "Qt/SampleQtApplicationRunner.h" +#endif + +int main(int argc, char* argv[]) +{ + boost::shared_ptr sampleStoneApplication(new SampleApplication); + +#if ORTHANC_ENABLE_SDL==1 + OrthancStone::SdlStoneApplicationRunner sdlApplicationRunner(sampleStoneApplication); + return sdlApplicationRunner.Execute(argc, argv); +#endif + +#if ORTHANC_ENABLE_QT==1 + OrthancStone::Samples::SampleQtApplicationRunner qtAppRunner(sampleStoneApplication); + return qtAppRunner.Execute(argc, argv); +#endif +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainWasm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainWasm.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,37 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "Platforms/Wasm/WasmWebService.h" +#include "Platforms/Wasm/WasmViewport.h" + +#include + +#include "SampleList.h" + + +OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) +{ + return new SampleApplication(broker); +} + +OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application) +{ + return dynamic_cast(application)->CreateWasmApplicationAdapter(broker); +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Samples-status.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Samples-status.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +Executable versions +================ +Generic options +---------------------- +``` +("help", "Display this help and exit") +("verbose", "Be verbose in logs") +("orthanc", boost::program_options::value() + ->default_value("http://localhost:8042/"), + "URL to the Orthanc server") +("username", "Username for the Orthanc server") +("password", "Password for the Orthanc server") +("https-verify", boost::program_options::value() + ->default_value(true), "Check HTTPS certificates") +``` +OrthancStoneSimpleViewer +------------------------------------- +- Options: + ``` + - "studyId", std::string, "Orthanc ID of the study" + ``` +- study loading works OK +- Invert does not work: +``` +void SimpleViewerApplication::ExecuteAction(SimpleViewerApplication::Actions action) + { + // TODO + } +``` + +OrthancStoneSimpleViewerSingleFile +------------------------------------- +- Options: + ``` + - "studyId", std::string, "Orthanc ID of the study" + ``` + +Study loading works. + +The `line` and `circle` buttons work and call this: +``` +virtual void OnTool1Clicked() +{ + currentTool_ = Tools_LineMeasure; +} + +virtual void OnTool2Clicked() +{ + currentTool_ = Tools_CircleMeasure; +} +``` +The `action1` and `action2` buttons are not connected + +The following is displayed in the console at launch time: +``` +W0313 12:20:12.790449 NativeStoneApplicationRunner.cpp:55] Use the key "s" to reinitialize the layout +W0313 12:20:12.790449 NativeStoneApplicationRunner.cpp:55] Use the key "n" to go to next image in the main viewport +``` +However, when looking at `MainWidgetInteractor::KeyPressed` (`SimpleViewerApplicationSingleFile.h:169`), only the following is processed: +- 's': reset layout +- 'l': select line tool +- 'c': select circle tool + +OrthancStoneSingleFrame +------------------------------------- +``` +generic.add_options() +("instance", boost::program_options::value(), +"Orthanc ID of the instance") +("frame", boost::program_options::value() + ->default_value(0), +"Number of the frame, for multi-frame DICOM instances") +("smooth", boost::program_options::value() + ->default_value(true), +"Enable bilinear interpolation to smooth the image"); +``` +only key handled in `KeyPressed` is `s` to call `widget.FitContent()` + + +OrthancStoneSingleFrameEditor +------------------------------------- +``` +generic.add_options() +("instance", boost::program_options::value(), +"Orthanc ID of the instance") +("frame", boost::program_options::value() + ->default_value(0), +"Number of the frame, for multi-frame DICOM instances"); +``` +Available commands in `KeyPressed` (`SingleFrameEditorApplication.h:280`): +- 'a' widget.FitContent() +- 'c' Crop tool +- 'm' Mask tool +- 'd' dump to json and diplay result (?) +- 'e' export current view to Dicom with dummy tags (?) +- 'i' wdiget.SwitchInvert +- 't' Move tool +- 'n' switch between nearest and bilinear interpolation +- 'r' Rotate tool +- 's' Resize tool +- 'w' Windowing tool +- 'ctrl+y' redo +- 'ctrl+z' undo diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,48 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + + +namespace SimpleViewer +{ + struct AppStatus + { + std::string patientId; + std::string studyDescription; + std::string currentInstanceIdInMainViewport; + // note: if you add members here, update the serialization code below and deserialization in simple-viewer.ts -> onAppStatusUpdated() + + + AppStatus() + { + } + + void ToJson(Json::Value &output) const + { + output["patientId"] = patientId; + output["studyDescription"] = studyDescription; + output["currentInstanceIdInMainViewport"] = currentInstanceIdInMainViewport; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,111 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MainWidgetInteractor.h" + +#include "SimpleViewerApplication.h" + +namespace SimpleViewer { + + Deprecated::IWorldSceneMouseTracker* MainWidgetInteractor::CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + if (button == MouseButton_Left) + { + if (application_.GetCurrentTool() == Tool_LineMeasure) + { + return new Deprecated::LineMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), + x, y, 255, 0, 0, application_.GetFont()); + } + else if (application_.GetCurrentTool() == Tool_CircleMeasure) + { + return new Deprecated::CircleMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), + x, y, 255, 0, 0, application_.GetFont()); + } + else if (application_.GetCurrentTool() == Tool_Crop) + { + // TODO + } + else if (application_.GetCurrentTool() == Tool_Windowing) + { + // TODO + } + else if (application_.GetCurrentTool() == Tool_Zoom) + { + // TODO + } + else if (application_.GetCurrentTool() == Tool_Pan) + { + // TODO + } + } + return NULL; + } + + void MainWidgetInteractor::MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + { + if (statusBar != NULL) + { + Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); + + char buf[64]; + sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", + p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); + statusBar->SetMessage(buf); + } + } + + void MainWidgetInteractor::MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + } + + void MainWidgetInteractor::KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + switch (keyChar) + { + case 's': + widget.FitContent(); + break; + + default: + break; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../../../../Framework/Deprecated/Widgets/IWorldSceneInteractor.h" + +using namespace OrthancStone; + +namespace SimpleViewer { + + class SimpleViewerApplication; + + class MainWidgetInteractor : public Deprecated::IWorldSceneInteractor + { + private: + SimpleViewerApplication& application_; + + public: + MainWidgetInteractor(SimpleViewerApplication& application) : + application_(application) + { + } + + /** + WorldSceneWidget: + */ + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches); + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar); + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar); + + virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar); + }; + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,109 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "SimpleViewerMainWindow.h" + +/** + * Don't use "ui_MainWindow.h" instead of below, as + * this makes CMake unable to detect when the UI file changes. + **/ +#include +#include "../../SimpleViewerApplication.h" + + +namespace SimpleViewer +{ + template + bool ExecuteCommand(U* handler, const T& command) + { + std::string serializedCommand = StoneSerialize(command); + StoneDispatchToHandler(serializedCommand, handler); + } + + SimpleViewerMainWindow::SimpleViewerMainWindow( + OrthancStone::NativeStoneApplicationContext& context, + SimpleViewerApplication& stoneApplication, + QWidget *parent) : + QStoneMainWindow(context, parent), + ui_(new Ui::SimpleViewerMainWindow), + stoneApplication_(stoneApplication) + { + ui_->setupUi(this); + SetCentralStoneWidget(*ui_->cairoCentralWidget); + +#if QT_VERSION >= 0x050000 + connect(ui_->toolButtonCrop, &QToolButton::clicked, this, &SimpleViewerMainWindow::cropClicked); + connect(ui_->pushButtonUndoCrop, &QToolButton::clicked, this, &SimpleViewerMainWindow::undoCropClicked); + connect(ui_->toolButtonLine, &QToolButton::clicked, this, &SimpleViewerMainWindow::lineClicked); + connect(ui_->toolButtonCircle, &QToolButton::clicked, this, &SimpleViewerMainWindow::circleClicked); + connect(ui_->toolButtonWindowing, &QToolButton::clicked, this, &SimpleViewerMainWindow::windowingClicked); + connect(ui_->pushButtonRotate, &QPushButton::clicked, this, &SimpleViewerMainWindow::rotateClicked); + connect(ui_->pushButtonInvert, &QPushButton::clicked, this, &SimpleViewerMainWindow::invertClicked); +#else + connect(ui_->toolButtonCrop, SIGNAL(clicked()), this, SLOT(cropClicked())); + connect(ui_->toolButtonLine, SIGNAL(clicked()), this, SLOT(lineClicked())); + connect(ui_->toolButtonCircle, SIGNAL(clicked()), this, SLOT(circleClicked())); + connect(ui_->toolButtonWindowing, SIGNAL(clicked()), this, SLOT(windowingClicked())); + connect(ui_->pushButtonUndoCrop, SIGNAL(clicked()), this, SLOT(undoCropClicked())); + connect(ui_->pushButtonRotate, SIGNAL(clicked()), this, SLOT(rotateClicked())); + connect(ui_->pushButtonInvert, SIGNAL(clicked()), this, SLOT(invertClicked())); +#endif + } + + SimpleViewerMainWindow::~SimpleViewerMainWindow() + { + delete ui_; + } + + void SimpleViewerMainWindow::cropClicked() + { + stoneApplication_.ExecuteCommand(SelectTool(Tool_Crop)); + } + + void SimpleViewerMainWindow::undoCropClicked() + { + stoneApplication_.ExecuteCommand(Action(ActionType_UndoCrop)); + } + + void SimpleViewerMainWindow::lineClicked() + { + stoneApplication_.ExecuteCommand(SelectTool(Tool_LineMeasure)); + } + + void SimpleViewerMainWindow::circleClicked() + { + stoneApplication_.ExecuteCommand(SelectTool(Tool_CircleMeasure)); + } + + void SimpleViewerMainWindow::windowingClicked() + { + stoneApplication_.ExecuteCommand(SelectTool(Tool_Windowing)); + } + + void SimpleViewerMainWindow::rotateClicked() + { + stoneApplication_.ExecuteCommand(Action(ActionType_Rotate)); + } + + void SimpleViewerMainWindow::invertClicked() + { + stoneApplication_.ExecuteCommand(Action(ActionType_Invert)); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include +#include + +namespace Ui +{ + class SimpleViewerMainWindow; +} + +using namespace OrthancStone; + +namespace SimpleViewer +{ + class SimpleViewerApplication; + + class SimpleViewerMainWindow : public QStoneMainWindow + { + Q_OBJECT + + private: + Ui::SimpleViewerMainWindow* ui_; + SimpleViewerApplication& stoneApplication_; + + public: + explicit SimpleViewerMainWindow(OrthancStone::NativeStoneApplicationContext& context, SimpleViewerApplication& stoneApplication, QWidget *parent = 0); + ~SimpleViewerMainWindow(); + + private slots: + void cropClicked(); + void undoCropClicked(); + void rotateClicked(); + void windowingClicked(); + void lineClicked(); + void circleClicked(); + void invertClicked(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,151 @@ + + + SimpleViewerMainWindow + + + + 0 + 0 + 903 + 634 + + + + + 500 + 300 + + + + + 500 + 300 + + + + Stone of Orthanc + + + Qt::LeftToRight + + + + + 0 + 0 + + + + Qt::LeftToRight + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 500 + + + + + + + + + 0 + 100 + + + + + 16777215 + 100 + + + + + + + windowing + + + + + + + crop + + + + + + + undo crop + + + + + + + line + + + + + + + circle + + + + + + + rotate + + + + + + + invert + + + + + + + + + + + + 0 + 0 + 903 + 22 + + + + + Test + + + + + + + + + QCairoWidget + QGraphicsView +
QCairoWidget.h
+
+
+ + +
diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,35 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Applications/Qt/QtStoneApplicationRunner.h" + +#include "../../SimpleViewerApplication.h" +#include "Framework/Messages/MessageBroker.h" + + +int main(int argc, char* argv[]) +{ + OrthancStone::MessageBroker broker; + SimpleViewer::SimpleViewerApplication stoneApplication(broker); + + OrthancStone::QtStoneApplicationRunner qtAppRunner(broker, stoneApplication); + return qtAppRunner.Execute(argc, argv); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,225 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SimpleViewerApplication.h" + +#if ORTHANC_ENABLE_QT == 1 +# include "Qt/SimpleViewerMainWindow.h" +#endif + +#if ORTHANC_ENABLE_WASM == 1 +# include +#endif + +namespace SimpleViewer +{ + + void SimpleViewerApplication::Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + context_ = context; + statusBar_ = &statusBar; + + {// initialize viewports and layout + mainLayout_ = new Deprecated::LayoutWidget("main-layout"); + mainLayout_->SetPadding(10); + mainLayout_->SetBackgroundCleared(true); + mainLayout_->SetBackgroundColor(0, 0, 0); + mainLayout_->SetHorizontal(); + + thumbnailsLayout_ = new Deprecated::LayoutWidget("thumbnail-layout"); + thumbnailsLayout_->SetPadding(10); + thumbnailsLayout_->SetBackgroundCleared(true); + thumbnailsLayout_->SetBackgroundColor(50, 50, 50); + thumbnailsLayout_->SetVertical(); + + mainWidget_ = new Deprecated::SliceViewerWidget(IObserver::GetBroker(), "main-viewport"); + //mainWidget_->RegisterObserver(*this); + + // hierarchy + mainLayout_->AddWidget(thumbnailsLayout_); + mainLayout_->AddWidget(mainWidget_); + + // sources + smartLoader_.reset(new Deprecated::SmartLoader(IObserver::GetBroker(), context->GetOrthancApiClient())); + smartLoader_->SetImageQuality(Deprecated::SliceImageQuality_FullPam); + + mainLayout_->SetTransmitMouseOver(true); + mainWidgetInteractor_.reset(new MainWidgetInteractor(*this)); + mainWidget_->SetInteractor(*mainWidgetInteractor_); + thumbnailInteractor_.reset(new ThumbnailInteractor(*this)); + } + + statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); + statusBar.SetMessage("Use the key \"n\" to go to next image in the main viewport"); + + + if (parameters.count("studyId") < 1) + { + LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; + context->GetOrthancApiClient().GetJsonAsync("/studies", new Callable(*this, &SimpleViewerApplication::OnStudyListReceived)); + } + else + { + SelectStudy(parameters["studyId"].as()); + } + } + + + void SimpleViewerApplication::DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("studyId", boost::program_options::value(), + "Orthanc ID of the study") + ; + + options.add(generic); + } + + void SimpleViewerApplication::OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isArray() && + response.size() >= 1) + { + SelectStudy(response[0].asString()); + } + } + void SimpleViewerApplication::OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isObject() && response["Series"].isArray()) + { + for (size_t i=0; i < response["Series"].size(); i++) + { + context_->GetOrthancApiClient().GetJsonAsync("/series/" + response["Series"][(int)i].asString(), new Callable(*this, &SimpleViewerApplication::OnSeriesReceived)); + } + } + } + + void SimpleViewerApplication::OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isObject() && + response["Instances"].isArray() && + response["Instances"].size() > 0) + { + // keep track of all instances IDs + const std::string& seriesId = response["ID"].asString(); + seriesTags_[seriesId] = response; + instancesIdsPerSeriesId_[seriesId] = std::vector(); + for (size_t i = 0; i < response["Instances"].size(); i++) + { + const std::string& instanceId = response["Instances"][static_cast(i)].asString(); + instancesIdsPerSeriesId_[seriesId].push_back(instanceId); + } + + // load the first instance in the thumbnail + LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); + + // if this is the first thumbnail loaded, load the first instance in the mainWidget + if (mainWidget_->GetLayerCount() == 0) + { + smartLoader_->SetFrameInWidget(*mainWidget_, 0, instancesIdsPerSeriesId_[seriesId][0], 0); + } + } + } + + void SimpleViewerApplication::LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) + { + LOG(INFO) << "Loading thumbnail for series " << seriesId; + + Deprecated::SliceViewerWidget* thumbnailWidget = + new Deprecated::SliceViewerWidget(IObserver::GetBroker(), "thumbnail-series-" + seriesId); + thumbnails_.push_back(thumbnailWidget); + thumbnailsLayout_->AddWidget(thumbnailWidget); + + thumbnailWidget->RegisterObserverCallback( + new Callable + (*this, &SimpleViewerApplication::OnWidgetGeometryChanged)); + + smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); + thumbnailWidget->SetInteractor(*thumbnailInteractor_); + } + + void SimpleViewerApplication::SelectStudy(const std::string& studyId) + { + context_->GetOrthancApiClient().GetJsonAsync("/studies/" + studyId, new Callable(*this, &SimpleViewerApplication::OnStudyReceived)); + } + + void SimpleViewerApplication::OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message) + { + // TODO: The "const_cast" could probably be replaced by "mainWidget_" + const_cast(message.GetOrigin()).FitContent(); + } + + void SimpleViewerApplication::SelectSeriesInMainViewport(const std::string& seriesId) + { + smartLoader_->SetFrameInWidget(*mainWidget_, 0, instancesIdsPerSeriesId_[seriesId][0], 0); + } + + bool SimpleViewerApplication::Handle(const StoneSampleCommands::SelectTool& value) + { + currentTool_ = value.tool; + return true; + } + + bool SimpleViewerApplication::Handle(const StoneSampleCommands::Action& value) + { + switch (value.type) + { + case ActionType_Invert: + // TODO + break; + case ActionType_UndoCrop: + // TODO + break; + case ActionType_Rotate: + // TODO + break; + default: + throw std::runtime_error("Action type not supported"); + } + return true; + } + +#if ORTHANC_ENABLE_QT==1 + QStoneMainWindow* SimpleViewerApplication::CreateQtMainWindow() + { + return new SimpleViewerMainWindow(dynamic_cast(*context_), *this); + } +#endif + +#if ORTHANC_ENABLE_WASM==1 + void SimpleViewerApplication::InitializeWasm() { + + AttachWidgetToWasmViewport("canvasThumbnails", thumbnailsLayout_); + AttachWidgetToWasmViewport("canvasMain", mainWidget_); + } +#endif + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,175 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + + /* + This header contains the command definitions for the sample applications + */ +#include "Applications/Samples/StoneSampleCommands_generated.hpp" +using namespace StoneSampleCommands; + +#include "Applications/IStoneApplication.h" + +#include "../../../../Framework/Deprecated/Layers/CircleMeasureTracker.h" +#include "../../../../Framework/Deprecated/Layers/LineMeasureTracker.h" +#include "../../../../Framework/Deprecated/SmartLoader.h" +#include "../../../../Framework/Deprecated/Widgets/LayoutWidget.h" +#include "../../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" +#include "../../../../Framework/Messages/IObserver.h" + +#if ORTHANC_ENABLE_WASM==1 +#include "Platforms/Wasm/WasmPlatformApplicationAdapter.h" +#include "Platforms/Wasm/Defaults.h" +#endif + +#if ORTHANC_ENABLE_QT==1 +#include "Qt/SimpleViewerMainWindow.h" +#endif + +#include +#include + +#include "ThumbnailInteractor.h" +#include "MainWidgetInteractor.h" +#include "AppStatus.h" + +using namespace OrthancStone; + + +namespace SimpleViewer +{ + + class SimpleViewerApplication + : public IStoneApplication + , public IObserver + , public IObservable + , public StoneSampleCommands::IHandler + { + public: + + struct StatusUpdatedMessage : public IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + const AppStatus& status_; + + StatusUpdatedMessage(const AppStatus& status) + : status_(status) + { + } + }; + + private: + Tool currentTool_; + + std::unique_ptr mainWidgetInteractor_; + std::unique_ptr thumbnailInteractor_; + Deprecated::LayoutWidget* mainLayout_; + Deprecated::LayoutWidget* thumbnailsLayout_; + Deprecated::SliceViewerWidget* mainWidget_; + std::vector thumbnails_; + std::map > instancesIdsPerSeriesId_; + std::map seriesTags_; + unsigned int currentInstanceIndex_; + Deprecated::WidgetViewport* wasmViewport1_; + Deprecated::WidgetViewport* wasmViewport2_; + + Deprecated::IStatusBar* statusBar_; + std::unique_ptr smartLoader_; + + Orthanc::Font font_; + + public: + SimpleViewerApplication(MessageBroker& broker) : + IObserver(broker), + IObservable(broker), + currentTool_(StoneSampleCommands::Tool_LineMeasure), + mainLayout_(NULL), + currentInstanceIndex_(0), + wasmViewport1_(NULL), + wasmViewport2_(NULL) + { + font_.LoadFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); + } + + virtual void Finalize() ORTHANC_OVERRIDE {} + virtual Deprecated::IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainLayout_;} + + virtual void DeclareStartupOptions(boost::program_options::options_description& options) ORTHANC_OVERRIDE; + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE; + + void OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); + + void OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); + + void OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); + + void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId); + + void SelectStudy(const std::string& studyId); + + void OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message); + + void SelectSeriesInMainViewport(const std::string& seriesId); + + + Tool GetCurrentTool() const + { + return currentTool_; + } + + const Orthanc::Font& GetFont() const + { + return font_; + } + + // ExecuteAction method was empty (its body was a single "TODO" comment) + virtual bool Handle(const SelectTool& value) ORTHANC_OVERRIDE; + virtual bool Handle(const Action& value) ORTHANC_OVERRIDE; + + template + bool ExecuteCommand(const T& cmd) + { + std::string cmdStr = StoneSampleCommands::StoneSerialize(cmd); + return StoneSampleCommands::StoneDispatchToHandler(cmdStr, this); + } + + virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE + { + StoneSampleCommands::StoneDispatchToHandler(data, this); + } + + virtual std::string GetTitle() const ORTHANC_OVERRIDE {return "SimpleViewer";} + +#if ORTHANC_ENABLE_WASM==1 + virtual void InitializeWasm() ORTHANC_OVERRIDE; +#endif + +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow(); +#endif + }; + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "ThumbnailInteractor.h" + +#include "SimpleViewerApplication.h" + +namespace SimpleViewer { + + Deprecated::IWorldSceneMouseTracker* ThumbnailInteractor::CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + if (button == MouseButton_Left) + { + statusBar->SetMessage("selected thumbnail " + widget.GetName()); + std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); + application_.SelectSeriesInMainViewport(seriesId); + } + return NULL; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,77 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../../../Framework/Deprecated/Widgets/IWorldSceneInteractor.h" + +using namespace OrthancStone; + +namespace SimpleViewer { + + class SimpleViewerApplication; + + class ThumbnailInteractor : public Deprecated::IWorldSceneInteractor + { + private: + SimpleViewerApplication& application_; + public: + ThumbnailInteractor(SimpleViewerApplication& application) : + application_(application) + { + } + + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches); + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + {} + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + {} + + virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + {} + + }; + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,51 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "SimpleViewerWasmApplicationAdapter.h" + +namespace SimpleViewer +{ + + SimpleViewerWasmApplicationAdapter::SimpleViewerWasmApplicationAdapter(MessageBroker &broker, SimpleViewerApplication &application) + : WasmPlatformApplicationAdapter(broker, application), + viewerApplication_(application) + { + application.RegisterObserverCallback(new Callable(*this, &SimpleViewerWasmApplicationAdapter::OnStatusUpdated)); + } + + void SimpleViewerWasmApplicationAdapter::OnStatusUpdated(const SimpleViewerApplication::StatusUpdatedMessage &message) + { + Json::Value statusJson; + message.status_.ToJson(statusJson); + + Json::Value event; + event["event"] = "appStatusUpdated"; + event["data"] = statusJson; + + Json::StreamWriterBuilder builder; + std::unique_ptr writer(builder.newStreamWriter()); + std::ostringstream outputStr; + + writer->write(event, &outputStr); + + NotifyStatusUpdateFromCppToWebWithString(outputStr.str()); + } + +} // namespace SimpleViewer \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include "../../../../../../Framework/Messages/IObserver.h" +#include + +#include "../../SimpleViewerApplication.h" + +namespace SimpleViewer { + + class SimpleViewerWasmApplicationAdapter : public WasmPlatformApplicationAdapter + { + SimpleViewerApplication& viewerApplication_; + + public: + SimpleViewerWasmApplicationAdapter(MessageBroker& broker, SimpleViewerApplication& application); + + private: + void OnStatusUpdated(const SimpleViewerApplication::StatusUpdatedMessage& message); + + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,38 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "Platforms/Wasm/WasmWebService.h" +#include "Platforms/Wasm/WasmViewport.h" + +#include + +#include "../../SimpleViewerApplication.h" +#include "SimpleViewerWasmApplicationAdapter.h" + + +OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) { + + return new SimpleViewer::SimpleViewerApplication(broker); +} + +OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, IStoneApplication* application) +{ + return new SimpleViewer::SimpleViewerWasmApplicationAdapter(broker, *(dynamic_cast(application))); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ + + + + + + + + + + + + Simple Viewer + + + + +
+
+ +
+
+ +
+
+
+ + + + + + + + + +
+ + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,81 @@ +import wasmApplicationRunner = require('../../../../Platforms/Wasm/wasm-application-runner'); + +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewer", "/orthanc"); + +function SelectTool(toolName: string) { + var command = { + command: "selectTool:" + toolName, + commandType: "generic-no-arg-command", + args: { + } + }; + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); +} + +function PerformAction(actionName: string) { + var command = { + command: "action:" + actionName, + commandType: "generic-no-arg-command", + args: { + } + }; + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); +} + +class SimpleViewerUI { + + private _labelPatientId: HTMLSpanElement; + private _labelStudyDescription: HTMLSpanElement; + + public constructor() { + // install "SelectTool" handlers + document.querySelectorAll("[tool-selector]").forEach((e) => { + (e as HTMLButtonElement).addEventListener("click", () => { + SelectTool(e.attributes["tool-selector"].value); + }); + }); + + // install "PerformAction" handlers + document.querySelectorAll("[action-trigger]").forEach((e) => { + (e as HTMLButtonElement).addEventListener("click", () => { + PerformAction(e.attributes["action-trigger"].value); + }); + }); + + // connect all ui elements to members + this._labelPatientId = document.getElementById("label-patient-id") as HTMLSpanElement; + this._labelStudyDescription = document.getElementById("label-study-description") as HTMLSpanElement; + } + + public onAppStatusUpdated(status: any) { + this._labelPatientId.innerText = status["patientId"]; + this._labelStudyDescription.innerText = status["studyDescription"]; + // this.highlighThumbnail(status["currentInstanceIdInMainViewport"]); + } + +} + +var ui = new SimpleViewerUI(); + +// this method is called "from the C++ code" when the StoneApplication is updated. +// it can be used to update the UI of the application +function UpdateWebApplicationWithString(statusUpdateMessageString: string) { + console.log("updating web application with string: ", statusUpdateMessageString); + let statusUpdateMessage = JSON.parse(statusUpdateMessageString); + + if ("event" in statusUpdateMessage) { + let eventName = statusUpdateMessage["event"]; + if (eventName == "appStatusUpdated") { + ui.onAppStatusUpdated(statusUpdateMessage["data"]); + } + } +} + +function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { + console.log("updating web application with serialized message: ", statusUpdateMessageString); + console.log(""); +} + +// make it available to other js scripts in the application +( window).UpdateWebApplicationWithString = UpdateWebApplicationWithString; +( window).UpdateWebApplicationWithSerializedMessage = UpdateWebApplicationWithSerializedMessage; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/styles.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/styles.css Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +html, body { + width: 100%; + height: 100%; + margin: 0px; + border: 0; + overflow: hidden; /* Disable scrollbars */ + display: block; /* No floating content on sides */ + background-color: black; + color: white; + font-family: Arial, Helvetica, sans-serif; +} + +canvas { + left:0px; + top:0px; +} + +#canvas-group { + padding:5px; + background-color: grey; +} + +#status-group { + padding:5px; +} + +#worklist-group { + padding:5px; +} + +.vsol-button { + height: 40px; +} + +#thumbnails-group ul li { + display: inline; + list-style: none; +} + +.thumbnail { + width: 100px; + height: 100px; + padding: 3px; +} + +.thumbnail-selected { + border-width: 1px; + border-color: red; + border-style: solid; +} + +#template-thumbnail-li { + display: none !important; +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/tsconfig-simple-viewer.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/tsconfig-simple-viewer.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,9 @@ +{ + "extends" : "../../Web/tsconfig-samples", + "compilerOptions": { + }, + "include" : [ + "simple-viewer.ts", + "../../build-wasm/ApplicationCommands_generated.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewerApplicationSingleFile.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewerApplicationSingleFile.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,461 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Deprecated/Layers/CircleMeasureTracker.h" +#include "../../../Framework/Deprecated/Layers/LineMeasureTracker.h" +#include "../../../Framework/Deprecated/SmartLoader.h" +#include "../../../Framework/Deprecated/Widgets/LayoutWidget.h" +#include "../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" +#include "../../../Framework/Messages/IObserver.h" + +#if ORTHANC_ENABLE_WASM==1 +#include "../../../Platforms/Wasm/WasmPlatformApplicationAdapter.h" +#include "../../../Platforms/Wasm/Defaults.h" +#endif + +#include +#include + +namespace OrthancStone +{ + namespace Samples + { + class SimpleViewerApplication : + public SampleSingleCanvasWithButtonsApplicationBase, + public ObserverBase + { + private: + class ThumbnailInteractor : public Deprecated::IWorldSceneInteractor + { + private: + SimpleViewerApplication& application_; + + public: + ThumbnailInteractor(SimpleViewerApplication& application) : + application_(application) + { + } + + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + if (button == MouseButton_Left) + { + statusBar->SetMessage("selected thumbnail " + widget.GetName()); + std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); + application_.SelectSeriesInMainViewport(seriesId); + } + return NULL; + } + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + { + } + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + } + + virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + } + }; + + class MainWidgetInteractor : public Deprecated::IWorldSceneInteractor + { + private: + SimpleViewerApplication& application_; + + public: + MainWidgetInteractor(SimpleViewerApplication& application) : + application_(application) + { + } + + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + if (button == MouseButton_Left) + { + if (application_.currentTool_ == Tool_LineMeasure) + { + return new Deprecated::LineMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), + x, y, 255, 0, 0, application_.GetFont()); + } + else if (application_.currentTool_ == Tool_CircleMeasure) + { + return new Deprecated::CircleMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), + x, y, 255, 0, 0, application_.GetFont()); + } + } + return NULL; + } + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + { + if (statusBar != NULL) + { + Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); + + char buf[64]; + sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", + p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); + statusBar->SetMessage(buf); + } + } + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + } + + virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + switch (keyChar) + { + case 's': + widget.FitContent(); + break; + + case 'l': + application_.currentTool_ = Tool_LineMeasure; + break; + + case 'c': + application_.currentTool_ = Tool_CircleMeasure; + break; + + default: + break; + } + } + }; + + +#if ORTHANC_ENABLE_WASM==1 + class SimpleViewerApplicationAdapter : public WasmPlatformApplicationAdapter + { + SimpleViewerApplication& viewerApplication_; + + public: + SimpleViewerApplicationAdapter(SimpleViewerApplication& application) + : WasmPlatformApplicationAdapter(application), + viewerApplication_(application) + { + } + + virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input) + { + if (input == "select-tool:line-measure") + { + viewerApplication_.currentTool_ = Tool_LineMeasure; + NotifyStatusUpdateFromCppToWebWithString("currentTool=line-measure"); + } + else if (input == "select-tool:circle-measure") + { + viewerApplication_.currentTool_ = Tool_CircleMeasure; + NotifyStatusUpdateFromCppToWebWithString("currentTool=circle-measure"); + } + + output = "ok"; + } + + virtual void NotifySerializedMessageFromCppToWeb(const std::string& statusUpdateMessage) + { + UpdateStoneApplicationStatusFromCppWithSerializedMessage(statusUpdateMessage.c_str()); + } + + virtual void NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage) + { + UpdateStoneApplicationStatusFromCppWithString(statusUpdateMessage.c_str()); + } + + }; +#endif + enum Tool { + Tool_LineMeasure, + Tool_CircleMeasure + }; + + Tool currentTool_; + std::unique_ptr mainWidgetInteractor_; + std::unique_ptr thumbnailInteractor_; + Deprecated::LayoutWidget* mainLayout_; + Deprecated::LayoutWidget* thumbnailsLayout_; + std::vector > thumbnails_; + + std::map > instancesIdsPerSeriesId_; + std::map seriesTags_; + + unsigned int currentInstanceIndex_; + Deprecated::WidgetViewport* wasmViewport1_; + Deprecated::WidgetViewport* wasmViewport2_; + + Deprecated::IStatusBar* statusBar_; + std::unique_ptr smartLoader_; + + Orthanc::Font font_; + + public: + SimpleViewerApplication() : + currentTool_(Tool_LineMeasure), + mainLayout_(NULL), + currentInstanceIndex_(0), + wasmViewport1_(NULL), + wasmViewport2_(NULL) + { + font_.LoadFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); +// DeclareIgnoredMessage(MessageType_Widget_ContentChanged); + } + + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("studyId", boost::program_options::value(), + "Orthanc ID of the study") + ; + + options.add(generic); + } + + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + context_ = context; + statusBar_ = &statusBar; + + {// initialize viewports and layout + mainLayout_ = new Deprecated::LayoutWidget("main-layout"); + mainLayout_->SetPadding(10); + mainLayout_->SetBackgroundCleared(true); + mainLayout_->SetBackgroundColor(0, 0, 0); + mainLayout_->SetHorizontal(); + + boost::shared_ptr thumbnailsLayout_(new Deprecated::LayoutWidget("thumbnail-layout")); + thumbnailsLayout_->SetPadding(10); + thumbnailsLayout_->SetBackgroundCleared(true); + thumbnailsLayout_->SetBackgroundColor(50, 50, 50); + thumbnailsLayout_->SetVertical(); + + boost::shared_ptr widget + (new Deprecated::SliceViewerWidget("main-viewport")); + SetCentralWidget(widget); + //mainWidget_->RegisterObserver(*this); + + // hierarchy + mainLayout_->AddWidget(thumbnailsLayout_); + mainLayout_->AddWidget(widget); + + // sources + smartLoader_.reset(new Deprecated::SmartLoader(context->GetOrthancApiClient())); + smartLoader_->SetImageQuality(Deprecated::SliceImageQuality_FullPam); + + mainLayout_->SetTransmitMouseOver(true); + mainWidgetInteractor_.reset(new MainWidgetInteractor(*this)); + widget->SetInteractor(*mainWidgetInteractor_); + thumbnailInteractor_.reset(new ThumbnailInteractor(*this)); + } + + statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); + statusBar.SetMessage("Use the key \"n\" to go to next image in the main viewport"); + + + if (parameters.count("studyId") < 1) + { + LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; + context->GetOrthancApiClient()->GetJsonAsync( + "/studies", + new Deprecated::DeprecatedCallable + (GetSharedObserver(), &SimpleViewerApplication::OnStudyListReceived)); + } + else + { + SelectStudy(parameters["studyId"].as()); + } + } + + void OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isArray() && + response.size() >= 1) + { + SelectStudy(response[0].asString()); + } + } + + void OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isObject() && response["Series"].isArray()) + { + for (size_t i=0; i < response["Series"].size(); i++) + { + context_->GetOrthancApiClient()->GetJsonAsync( + "/series/" + response["Series"][(int)i].asString(), + new Deprecated::DeprecatedCallable + (GetSharedObserver(), &SimpleViewerApplication::OnSeriesReceived)); + } + } + } + + void OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& response = message.GetJson(); + + if (response.isObject() && + response["Instances"].isArray() && + response["Instances"].size() > 0) + { + // keep track of all instances IDs + const std::string& seriesId = response["ID"].asString(); + seriesTags_[seriesId] = response; + instancesIdsPerSeriesId_[seriesId] = std::vector(); + for (size_t i = 0; i < response["Instances"].size(); i++) + { + const std::string& instanceId = response["Instances"][static_cast(i)].asString(); + instancesIdsPerSeriesId_[seriesId].push_back(instanceId); + } + + // load the first instance in the thumbnail + LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); + + // if this is the first thumbnail loaded, load the first instance in the mainWidget + Deprecated::SliceViewerWidget& widget = dynamic_cast(*GetCentralWidget()); + if (widget.GetLayerCount() == 0) + { + smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); + } + } + } + + void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) + { + LOG(INFO) << "Loading thumbnail for series " << seriesId; + boost::shared_ptr thumbnailWidget(new Deprecated::SliceViewerWidget("thumbnail-series-" + seriesId)); + thumbnails_.push_back(thumbnailWidget); + thumbnailsLayout_->AddWidget(thumbnailWidget); + Register(*thumbnailWidget, &SimpleViewerApplication::OnWidgetGeometryChanged); + smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); + thumbnailWidget->SetInteractor(*thumbnailInteractor_); + } + + void SelectStudy(const std::string& studyId) + { + LOG(INFO) << "Selecting study: " << studyId; + context_->GetOrthancApiClient()->GetJsonAsync( + "/studies/" + studyId, new Deprecated::DeprecatedCallable + (GetSharedObserver(), &SimpleViewerApplication::OnStudyReceived)); + } + + void OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message) + { + // TODO: The "const_cast" could probably be replaced by "mainWidget" + const_cast(message.GetOrigin()).FitContent(); + } + + void SelectSeriesInMainViewport(const std::string& seriesId) + { + Deprecated::SliceViewerWidget& widget = dynamic_cast(*GetCentralWidget()); + smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); + } + + const Orthanc::Font& GetFont() const + { + return font_; + } + + virtual void OnPushButton1Clicked() {} + virtual void OnPushButton2Clicked() {} + virtual void OnTool1Clicked() { currentTool_ = Tool_LineMeasure;} + virtual void OnTool2Clicked() { currentTool_ = Tool_CircleMeasure;} + + virtual void GetButtonNames(std::string& pushButton1, + std::string& pushButton2, + std::string& tool1, + std::string& tool2) + { + tool1 = "line"; + tool2 = "circle"; + pushButton1 = "action1"; + pushButton2 = "action2"; + } + +#if ORTHANC_ENABLE_WASM==1 + virtual void InitializeWasm() + { + AttachWidgetToWasmViewport("canvas", thumbnailsLayout_); + AttachWidgetToWasmViewport("canvas2", widget); + } +#endif + + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,268 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.h" +#include "../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" + +#include +#include + +#include + + +namespace OrthancStone +{ + namespace Samples + { + class SingleFrameApplication : + public SampleSingleCanvasApplicationBase, + public ObserverBase + { + private: + class Interactor : public Deprecated::IWorldSceneInteractor + { + private: + SingleFrameApplication& application_; + + public: + Interactor(SingleFrameApplication& application) : + application_(application) + { + } + + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + return NULL; + } + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& widget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + { + if (statusBar != NULL) + { + Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); + + char buf[64]; + sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", + p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); + statusBar->SetMessage(buf); + } + } + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); + + switch (direction) + { + case MouseWheelDirection_Up: + application_.OffsetSlice(-scale); + break; + + case MouseWheelDirection_Down: + application_.OffsetSlice(scale); + break; + + default: + break; + } + } + + virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + switch (keyChar) + { + case 's': + widget.FitContent(); + break; + + default: + break; + } + } + }; + + + void OffsetSlice(int offset) + { + if (source_) + { + int slice = static_cast(slice_) + offset; + + if (slice < 0) + { + slice = 0; + } + + if (slice >= static_cast(source_->GetSlicesCount())) + { + slice = static_cast(source_->GetSlicesCount()) - 1; + } + + if (slice != static_cast(slice_)) + { + SetSlice(slice); + } + } + } + + + void SetSlice(size_t index) + { + if (source_ && + index < source_->GetSlicesCount()) + { + slice_ = static_cast(index); + +#if 1 + widget_->SetSlice(source_->GetSlice(slice_).GetGeometry()); +#else + // TEST for scene extents - Rotate the axes + double a = 15.0 / 180.0 * boost::math::constants::pi(); + +#if 1 + Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); + Vector y; GeometryToolbox::AssignVector(y, -sin(a), cos(a), 0); +#else + // Flip the normal + Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); + Vector y; GeometryToolbox::AssignVector(y, sin(a), -cos(a), 0); +#endif + + SliceGeometry s(source_->GetSlice(slice_).GetGeometry().GetOrigin(), x, y); + widget_->SetSlice(s); +#endif + } + } + + + void OnMainWidgetGeometryReady(const Deprecated::IVolumeSlicer::GeometryReadyMessage& message) + { + // Once the geometry of the series is downloaded from Orthanc, + // display its middle slice, and adapt the viewport to fit this + // slice + if (source_ && + source_.get() == &message.GetOrigin()) + { + SetSlice(source_->GetSlicesCount() / 2); + } + + widget_->FitContent(); + } + + boost::shared_ptr widget_; + std::unique_ptr mainWidgetInteractor_; + boost::shared_ptr source_; + unsigned int slice_; + + public: + SingleFrameApplication() : + slice_(0) + { + } + + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("instance", boost::program_options::value(), + "Orthanc ID of the instance") + ("frame", boost::program_options::value()->default_value(0), + "Number of the frame, for multi-frame DICOM instances") + ("smooth", boost::program_options::value()->default_value(true), + "Enable bilinear interpolation to smooth the image") + ; + + options.add(generic); + } + + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + context_ = context; + + statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); + + if (parameters.count("instance") != 1) + { + LOG(ERROR) << "The instance ID is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string instance = parameters["instance"].as(); + int frame = parameters["frame"].as(); + + widget_.reset(new Deprecated::SliceViewerWidget("main-widget")); + SetCentralWidget(widget_); + + boost::shared_ptr layer(new Deprecated::DicomSeriesVolumeSlicer); + layer->Connect(context->GetOrthancApiClient()); + source_ = layer; + + layer->LoadFrame(instance, frame); + Register(*layer, &SingleFrameApplication::OnMainWidgetGeometryReady); + widget_->AddLayer(layer); + + Deprecated::RenderStyle s; + + if (parameters["smooth"].as()) + { + s.interpolation_ = ImageInterpolation_Bilinear; + } + + widget_->SetLayerStyle(0, s); + widget_->SetTransmitMouseOver(true); + + mainWidgetInteractor_.reset(new Interactor(*this)); + widget_->SetInteractor(*mainWidgetInteractor_); + } + }; + + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameEditorApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameEditorApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,531 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Radiography/RadiographyLayerCropTracker.h" +#include "../../../Framework/Radiography/RadiographyLayerMaskTracker.h" +#include "../../../Framework/Radiography/RadiographyLayerMoveTracker.h" +#include "../../../Framework/Radiography/RadiographyLayerResizeTracker.h" +#include "../../../Framework/Radiography/RadiographyLayerRotateTracker.h" +#include "../../../Framework/Radiography/RadiographyMaskLayer.h" +#include "../../../Framework/Radiography/RadiographyScene.h" +#include "../../../Framework/Radiography/RadiographySceneCommand.h" +#include "../../../Framework/Radiography/RadiographySceneReader.h" +#include "../../../Framework/Radiography/RadiographySceneWriter.h" +#include "../../../Framework/Radiography/RadiographyWidget.h" +#include "../../../Framework/Radiography/RadiographyWindowingTracker.h" +#include "../../../Framework/Toolbox/TextRenderer.h" + +#include +#include +#include +#include +#include + + +// Export using PAM is faster than using PNG, but requires Orthanc +// core >= 1.4.3 +#define EXPORT_USING_PAM 1 + + +namespace OrthancStone +{ + namespace Samples + { + class RadiographyEditorInteractor : + public Deprecated::IWorldSceneInteractor, + public ObserverBase + { + private: + enum Tool + { + Tool_Move, + Tool_Rotate, + Tool_Crop, + Tool_Resize, + Tool_Mask, + Tool_Windowing + }; + + + StoneApplicationContext* context_; + UndoRedoStack undoRedoStack_; + Tool tool_; + RadiographyMaskLayer* maskLayer_; + + + static double GetHandleSize() + { + return 10.0; + } + + + public: + RadiographyEditorInteractor() : + context_(NULL), + tool_(Tool_Move), + maskLayer_(NULL) + { + } + + void SetContext(StoneApplicationContext& context) + { + context_ = &context; + } + + void SetMaskLayer(RadiographyMaskLayer* maskLayer) + { + maskLayer_ = maskLayer; + } + virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& worldWidget, + const Deprecated::ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + Deprecated::IStatusBar* statusBar, + const std::vector& displayTouches) + { + RadiographyWidget& widget = dynamic_cast(worldWidget); + + if (button == MouseButton_Left) + { + size_t selected; + + if (tool_ == Tool_Windowing) + { + return new RadiographyWindowingTracker( + undoRedoStack_, + widget.GetScene(), + widget, + OrthancStone::ImageInterpolation_Nearest, + viewportX, viewportY, + RadiographyWindowingTracker::Action_DecreaseWidth, + RadiographyWindowingTracker::Action_IncreaseWidth, + RadiographyWindowingTracker::Action_DecreaseCenter, + RadiographyWindowingTracker::Action_IncreaseCenter); + } + else if (!widget.LookupSelectedLayer(selected)) + { + // No layer is currently selected + size_t layer; + if (widget.GetScene().LookupLayer(layer, x, y)) + { + widget.Select(layer); + } + + return NULL; + } + else if (tool_ == Tool_Crop || + tool_ == Tool_Resize || + tool_ == Tool_Mask) + { + RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); + + ControlPoint controlPoint; + if (accessor.GetLayer().LookupControlPoint(controlPoint, x, y, view.GetZoom(), GetHandleSize())) + { + switch (tool_) + { + case Tool_Crop: + return new RadiographyLayerCropTracker + (undoRedoStack_, widget.GetScene(), view, selected, controlPoint); + + case Tool_Mask: + return new RadiographyLayerMaskTracker + (undoRedoStack_, widget.GetScene(), view, selected, controlPoint); + + case Tool_Resize: + return new RadiographyLayerResizeTracker + (undoRedoStack_, widget.GetScene(), selected, controlPoint, + (modifiers & KeyboardModifiers_Shift)); + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + else + { + size_t layer; + + if (widget.GetScene().LookupLayer(layer, x, y)) + { + widget.Select(layer); + } + else + { + widget.Unselect(); + } + + return NULL; + } + } + else + { + size_t layer; + + if (widget.GetScene().LookupLayer(layer, x, y)) + { + if (layer == selected) + { + switch (tool_) + { + case Tool_Move: + return new RadiographyLayerMoveTracker + (undoRedoStack_, widget.GetScene(), layer, x, y, + (modifiers & KeyboardModifiers_Shift)); + + case Tool_Rotate: + return new RadiographyLayerRotateTracker + (undoRedoStack_, widget.GetScene(), view, layer, x, y, + (modifiers & KeyboardModifiers_Shift)); + + default: + break; + } + + return NULL; + } + else + { + widget.Select(layer); + return NULL; + } + } + else + { + widget.Unselect(); + return NULL; + } + } + } + else + { + return NULL; + } + return NULL; + } + + virtual void MouseOver(CairoContext& context, + Deprecated::WorldSceneWidget& worldWidget, + const Deprecated::ViewportGeometry& view, + double x, + double y, + Deprecated::IStatusBar* statusBar) + { + RadiographyWidget& widget = dynamic_cast(worldWidget); + +#if 0 + if (statusBar != NULL) + { + char buf[64]; + sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0); + statusBar->SetMessage(buf); + } +#endif + + size_t selected; + + if (widget.LookupSelectedLayer(selected) && + (tool_ == Tool_Crop || + tool_ == Tool_Resize || + tool_ == Tool_Mask)) + { + RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); + + ControlPoint controlPoint; + if (accessor.GetLayer().LookupControlPoint(controlPoint, x, y, view.GetZoom(), GetHandleSize())) + { + double z = 1.0 / view.GetZoom(); + + context.SetSourceColor(255, 0, 0); + cairo_t* cr = context.GetObject(); + cairo_set_line_width(cr, 2.0 * z); + cairo_move_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); + cairo_line_to(cr, controlPoint.x + GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); + cairo_line_to(cr, controlPoint.x + GetHandleSize() * z, controlPoint.y + GetHandleSize() * z); + cairo_line_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y + GetHandleSize() * z); + cairo_line_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); + cairo_stroke(cr); + } + } + } + + virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + } + + virtual void KeyPressed(Deprecated::WorldSceneWidget& worldWidget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + Deprecated::IStatusBar* statusBar) + { + RadiographyWidget& widget = dynamic_cast(worldWidget); + + switch (keyChar) + { + case 'a': + widget.FitContent(); + break; + + case 'c': + tool_ = Tool_Crop; + break; + + case 'm': + tool_ = Tool_Mask; + widget.Select(1); + break; + + case 'd': + { + // dump to json and reload + Json::Value snapshot; + RadiographySceneWriter writer; + writer.Write(snapshot, widget.GetScene()); + + LOG(INFO) << "JSON export was successful: " + << snapshot.toStyledString(); + + boost::shared_ptr scene(new RadiographyScene); + RadiographySceneReader reader(*scene, *context_->GetOrthancApiClient()); + reader.Read(snapshot); + + widget.SetScene(scene); + };break; + + case 'e': + { + Orthanc::DicomMap tags; + + // Minimal set of tags to generate a valid CR image + tags.SetValue(Orthanc::DICOM_TAG_ACCESSION_NUMBER, "NOPE", false); + tags.SetValue(Orthanc::DICOM_TAG_BODY_PART_EXAMINED, "PELVIS", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); + //tags.SetValue(Orthanc::DICOM_TAG_LATERALITY, "", false); + tags.SetValue(Orthanc::DICOM_TAG_MANUFACTURER, "OSIMIS", false); + tags.SetValue(Orthanc::DICOM_TAG_MODALITY, "CR", false); + tags.SetValue(Orthanc::DICOM_TAG_PATIENT_BIRTH_DATE, "20000101", false); + tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ID, "hello", false); + tags.SetValue(Orthanc::DICOM_TAG_PATIENT_NAME, "HELLO^WORLD", false); + tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ORIENTATION, "", false); + tags.SetValue(Orthanc::DICOM_TAG_PATIENT_SEX, "M", false); + tags.SetValue(Orthanc::DICOM_TAG_REFERRING_PHYSICIAN_NAME, "HOUSE^MD", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_NUMBER, "1", false); + tags.SetValue(Orthanc::DICOM_TAG_SOP_CLASS_UID, "1.2.840.10008.5.1.4.1.1.1", false); + tags.SetValue(Orthanc::DICOM_TAG_STUDY_ID, "STUDY", false); + tags.SetValue(Orthanc::DICOM_TAG_VIEW_POSITION, "", false); + + if (context_ != NULL) + { + widget.GetScene().ExportDicom(*context_->GetOrthancApiClient(), + tags, std::string(), 0.1, 0.1, widget.IsInverted(), + false /* autoCrop */, widget.GetInterpolation(), EXPORT_USING_PAM); + } + + break; + } + + case 'i': + widget.SwitchInvert(); + break; + + case 't': + tool_ = Tool_Move; + break; + + case 'n': + { + switch (widget.GetInterpolation()) + { + case ImageInterpolation_Nearest: + LOG(INFO) << "Switching to bilinear interpolation"; + widget.SetInterpolation(ImageInterpolation_Bilinear); + break; + + case ImageInterpolation_Bilinear: + LOG(INFO) << "Switching to nearest neighbor interpolation"; + widget.SetInterpolation(ImageInterpolation_Nearest); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + break; + } + + case 'r': + tool_ = Tool_Rotate; + break; + + case 's': + tool_ = Tool_Resize; + break; + + case 'w': + tool_ = Tool_Windowing; + break; + + case 'y': + if (modifiers & KeyboardModifiers_Control) + { + undoRedoStack_.Redo(); + widget.NotifyContentChanged(); + } + break; + + case 'z': + if (modifiers & KeyboardModifiers_Control) + { + undoRedoStack_.Undo(); + widget.NotifyContentChanged(); + } + break; + + default: + break; + } + } + }; + + + + class SingleFrameEditorApplication : + public SampleSingleCanvasApplicationBase, + public IObserver + { + private: + boost::shared_ptr scene_; + RadiographyEditorInteractor interactor_; + RadiographyMaskLayer* maskLayer_; + + public: + virtual ~SingleFrameEditorApplication() + { + LOG(WARNING) << "Destroying the application"; + } + + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("instance", boost::program_options::value(), + "Orthanc ID of the instance") + ("frame", boost::program_options::value()->default_value(0), + "Number of the frame, for multi-frame DICOM instances") + ; + + options.add(generic); + } + + virtual void Initialize(StoneApplicationContext* context, + Deprecated::IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + context_ = context; + interactor_.SetContext(*context); + + statusBar.SetMessage("Use the key \"a\" to reinitialize the layout"); + statusBar.SetMessage("Use the key \"c\" to crop"); + statusBar.SetMessage("Use the key \"e\" to export DICOM to the Orthanc server"); + statusBar.SetMessage("Use the key \"f\" to switch full screen"); + statusBar.SetMessage("Use the key \"i\" to invert contrast"); + statusBar.SetMessage("Use the key \"m\" to modify the mask"); + statusBar.SetMessage("Use the key \"n\" to switch between nearest neighbor and bilinear interpolation"); + statusBar.SetMessage("Use the key \"r\" to rotate objects"); + statusBar.SetMessage("Use the key \"s\" to resize objects (not applicable to DICOM layers)"); + statusBar.SetMessage("Use the key \"t\" to move (translate) objects"); + statusBar.SetMessage("Use the key \"w\" to change windowing"); + + statusBar.SetMessage("Use the key \"ctrl-z\" to undo action"); + statusBar.SetMessage("Use the key \"ctrl-y\" to redo action"); + + if (parameters.count("instance") != 1) + { + LOG(ERROR) << "The instance ID is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string instance = parameters["instance"].as(); + //int frame = parameters["frame"].as(); + + scene_.reset(new RadiographyScene); + + RadiographyLayer& dicomLayer = scene_->LoadDicomFrame(*context->GetOrthancApiClient(), instance, 0, false, NULL); + //scene_->LoadDicomFrame(instance, frame, false); //.SetPan(200, 0); + // = scene_->LoadDicomFrame(context->GetOrthancApiClient(), "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false, NULL); + +#if !defined(ORTHANC_ENABLE_WASM) || ORTHANC_ENABLE_WASM != 1 + Orthanc::HttpClient::ConfigureSsl(true, "/etc/ssl/certs/ca-certificates.crt"); +#endif + + //scene_->LoadDicomWebFrame(context->GetWebService()); + + std::vector mask; + mask.push_back(Orthanc::ImageProcessing::ImagePoint(1100, 100)); + mask.push_back(Orthanc::ImageProcessing::ImagePoint(1100, 1000)); + mask.push_back(Orthanc::ImageProcessing::ImagePoint(2000, 1000)); + mask.push_back(Orthanc::ImageProcessing::ImagePoint(2200, 150)); + mask.push_back(Orthanc::ImageProcessing::ImagePoint(1500, 550)); + maskLayer_ = dynamic_cast(&(scene_->LoadMask(mask, dynamic_cast(dicomLayer), 128.0f, NULL))); + interactor_.SetMaskLayer(maskLayer_); + + { + std::unique_ptr renderedTextAlpha(TextRenderer::Render(Orthanc::EmbeddedResources::UBUNTU_FONT, 100, + "%ΓΆΓ‡aA&#")); + RadiographyLayer& layer = scene_->LoadAlphaBitmap(renderedTextAlpha.release(), NULL); + dynamic_cast(layer).SetForegroundValue(200.0f * 256.0f); + } + + { + RadiographyTextLayer::RegisterFont("ubuntu", Orthanc::EmbeddedResources::UBUNTU_FONT); + RadiographyLayer& layer = scene_->LoadText("Hello\nworld", "ubuntu", 20, 128, NULL, false); + layer.SetResizeable(true); + } + + { + RadiographyLayer& layer = scene_->LoadTestBlock(100, 50, NULL); + layer.SetResizeable(true); + layer.SetPan(0, 200); + } + + boost::shared_ptr widget(new RadiographyWidget(scene_, "main-widget")); + widget->SetTransmitMouseOver(true); + widget->SetInteractor(interactor_); + SetCentralWidget(widget); + + //scene_->SetWindowing(128, 256); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleVolumeApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleVolumeApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,277 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" +#include "../../../Framework/dev.h" +#include "../../../Framework/Layers/LineMeasureTracker.h" +#include "../../../Framework/Layers/CircleMeasureTracker.h" + +#include +#include + +#include // TODO REMOVE +#include "../../../Framework/Layers/DicomStructureSetSlicer.h" // TODO REMOVE +#include "../../../Framework/Toolbox/MessagingToolbox.h" // TODO REMOVE + +namespace OrthancStone +{ + namespace Samples + { + class SingleVolumeApplication : public SampleApplicationBase + { + private: + class Interactor : public VolumeImageInteractor + { + private: + SliceViewerWidget& widget_; + size_t layer_; + + protected: + virtual void NotifySliceContentChange(const ISlicedVolume& volume, + const size_t& sliceIndex, + const Slice& slice) + { + const OrthancVolumeImage& image = dynamic_cast(volume); + + RenderStyle s = widget_.GetLayerStyle(layer_); + + if (image.FitWindowingToRange(s, slice.GetConverter())) + { + //printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); + widget_.SetLayerStyle(layer_, s); + } + } + + virtual void MouseOver(CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) + { + const SliceViewerWidget& w = dynamic_cast(widget); + Vector p = w.GetSlice().MapSliceToWorldCoordinates(x, y); + printf("%f %f %f\n", p[0], p[1], p[2]); + } + + public: + Interactor(OrthancVolumeImage& volume, + SliceViewerWidget& widget, + VolumeProjection projection, + size_t layer) : + VolumeImageInteractor(volume, widget, projection), + widget_(widget), + layer_(layer) + { + } + }; + + + public: + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("series", boost::program_options::value(), + "Orthanc ID of the series") + ("instance", boost::program_options::value(), + "Orthanc ID of a multi-frame instance that describes a 3D volume") + ("threads", boost::program_options::value()->default_value(3), + "Number of download threads") + ("projection", boost::program_options::value()->default_value("axial"), + "Projection of interest (can be axial, sagittal or coronal)") + ("reverse", boost::program_options::value()->default_value(false), + "Reverse the normal direction of the volume") + ; + + options.add(generic); + } + + virtual void Initialize(IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + if (parameters.count("series") > 1 || + parameters.count("instance") > 1) + { + LOG(ERROR) << "Only one series or instance is allowed"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (parameters.count("series") == 1 && + parameters.count("instance") == 1) + { + LOG(ERROR) << "Cannot specify both a series and an instance"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string series; + if (parameters.count("series") == 1) + { + series = parameters["series"].as(); + } + + std::string instance; + if (parameters.count("instance") == 1) + { + instance = parameters["instance"].as(); + } + + if (series.empty() && + instance.empty()) + { + LOG(ERROR) << "The series ID or instance ID is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + //unsigned int threads = parameters["threads"].as(); + //bool reverse = parameters["reverse"].as(); + + std::string tmp = parameters["projection"].as(); + Orthanc::Toolbox::ToLowerCase(tmp); + + VolumeProjection projection; + if (tmp == "axial") + { + projection = VolumeProjection_Axial; + } + else if (tmp == "sagittal") + { + projection = VolumeProjection_Sagittal; + } + else if (tmp == "coronal") + { + projection = VolumeProjection_Coronal; + } + else + { + LOG(ERROR) << "Unknown projection: " << tmp; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::unique_ptr widget(new SliceViewerWidget); + +#if 1 + std::unique_ptr volume(new OrthancVolumeImage(context.GetWebService(), true)); + if (series.empty()) + { + volume->ScheduleLoadInstance(instance); + } + else + { + volume->ScheduleLoadSeries(series); + } + + widget->AddLayer(new VolumeImageMPRSlicer(*volume)); + + context_->AddInteractor(new Interactor(*volume, *widget, projection, 0)); + context_->AddSlicedVolume(volume.release()); + + if (1) + { + RenderStyle s; + //s.drawGrid_ = true; + s.alpha_ = 1; + s.windowing_ = ImageWindowing_Bone; + widget->SetLayerStyle(0, s); + } + else + { + RenderStyle s; + s.alpha_ = 1; + s.applyLut_ = true; + s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; + s.interpolation_ = ImageInterpolation_Bilinear; + widget->SetLayerStyle(0, s); + } +#else + std::unique_ptr ct(new OrthancVolumeImage(context_->GetWebService(), false)); + //ct->ScheduleLoadSeries("15a6f44a-ac7b88fe-19c462d9-dddd918e-b01550d8"); // 0178023P + //ct->ScheduleLoadSeries("dd069910-4f090474-7d2bba07-e5c10783-f9e4fb1d"); + //ct->ScheduleLoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // IBA + //ct->ScheduleLoadSeries("03677739-1d8bca40-db1daf59-d74ff548-7f6fc9c0"); // 0522c0001 TCIA + ct->ScheduleLoadSeries("295e8a13-dfed1320-ba6aebb2-9a13e20f-1b3eb953"); // Captain + + std::unique_ptr pet(new OrthancVolumeImage(context_->GetWebService(), true)); + //pet->ScheduleLoadSeries("48d2997f-8e25cd81-dd715b64-bd79cdcc-e8fcee53"); // 0178023P + //pet->ScheduleLoadSeries("aabad2e7-80702b5d-e599d26c-4f13398e-38d58a9e"); + //pet->ScheduleLoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // IBA 1 + //pet->ScheduleLoadInstance("337876a1-a68a9718-f15abccd-38faafa1-b99b496a"); // IBA 2 + //pet->ScheduleLoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // IBA 3 + //pet->ScheduleLoadInstance("269f26f4-0c83eeeb-2e67abbd-5467a40f-f1bec90c"); // 0522c0001 TCIA + pet->ScheduleLoadInstance("f080888c-0ab7528a-f7d9c28c-84980eb1-ff3b0ae6"); // Captain 1 + //pet->ScheduleLoadInstance("4f78055b-6499a2c5-1e089290-394acc05-3ec781c1"); // Captain 2 + + std::unique_ptr rtStruct(new StructureSetLoader(context_->GetWebService())); + //rtStruct->ScheduleLoadInstance("c2ebc17b-6b3548db-5e5da170-b8ecab71-ea03add3"); // 0178023P + //rtStruct->ScheduleLoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // IBA + //rtStruct->ScheduleLoadInstance("17cd032b-ad92a438-ca05f06a-f9e96668-7e3e9e20"); // 0522c0001 TCIA + rtStruct->ScheduleLoadInstance("96c889ab-29fe5c54-dda6e66c-3949e4da-58f90d75"); // Captain + + widget->AddLayer(new VolumeImageMPRSlicer(*ct)); + widget->AddLayer(new VolumeImageMPRSlicer(*pet)); + widget->AddLayer(new DicomStructureSetSlicer(*rtStruct)); + + context_->AddInteractor(new Interactor(*pet, *widget, projection, 1)); + //context_->AddInteractor(new VolumeImageInteractor(*ct, *widget, projection)); + + context_->AddSlicedVolume(ct.release()); + context_->AddSlicedVolume(pet.release()); + context_->AddVolumeLoader(rtStruct.release()); + + { + RenderStyle s; + //s.drawGrid_ = true; + s.alpha_ = 1; + s.windowing_ = ImageWindowing_Bone; + widget->SetLayerStyle(0, s); + } + + { + RenderStyle s; + //s.drawGrid_ = true; + s.SetColor(255, 0, 0); // Draw missing PET layer in red + s.alpha_ = 0.5; + s.applyLut_ = true; + s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; + s.interpolation_ = ImageInterpolation_Bilinear; + s.windowing_ = ImageWindowing_Custom; + s.customWindowCenter_ = 0; + s.customWindowWidth_ = 128; + widget->SetLayerStyle(1, s); + } +#endif + + + statusBar.SetMessage("Use the keys \"b\", \"l\" and \"d\" to change Hounsfield windowing"); + statusBar.SetMessage("Use the keys \"t\" to track the (X,Y,Z) mouse coordinates"); + statusBar.SetMessage("Use the keys \"m\" to measure distances"); + statusBar.SetMessage("Use the keys \"c\" to draw circles"); + + widget->SetTransmitMouseOver(true); + context_->SetCentralWidget(widget.release()); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands.yml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands.yml Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,35 @@ +# +# 1 2 3 4 5 6 7 8 +# 345678901234567890123456789012345678901234567890123456789012345678901234567890 +# +rootName: StoneSampleCommands + +# +---------------------------------+ +# | Messages from TypeScript to C++ | +# +---------------------------------+ + +enum Tool: + - LineMeasure + - CircleMeasure + - Crop + - Windowing + - Zoom + - Pan + - Move + - Rotate + - Resize + - Mask + +struct SelectTool: + __handler: cpp + tool: Tool + +enum ActionType: + - UndoCrop + - Rotate + - Invert + +struct Action: + __handler: cpp + type: ActionType + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generate.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generate.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,16 @@ +import sys +import os + +# add the generation script location to the search paths +sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'Resources', 'CodeGeneration')) + +# import the code generation tooling script +import stonegentool + +schemaFile = os.path.join(os.path.dirname(__file__), 'StoneSampleCommands.yml') +outDir = os.path.dirname(__file__) + +# ignition! +stonegentool.Process(schemaFile, outDir) + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.hpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,703 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 + +Generated on 2019-03-18 12:07:42.696093 by stonegentool + +*/ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +//#define STONEGEN_NO_CPP11 1 + +#ifdef STONEGEN_NO_CPP11 +#define StoneSmartPtr std::unique_ptr +#else +#define StoneSmartPtr std::unique_ptr +#endif + +namespace StoneSampleCommands +{ + /** Throws in case of problem */ + inline void _StoneDeserializeValue(int32_t& destValue, const Json::Value& jsonValue) + { + destValue = jsonValue.asInt(); + } + + inline Json::Value _StoneSerializeValue(int32_t value) + { + Json::Value result(value); + return result; + } + + inline void _StoneDeserializeValue(Json::Value& destValue, const Json::Value& jsonValue) + { + destValue = jsonValue; + } + + inline Json::Value _StoneSerializeValue(Json::Value value) + { + return value; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue(double& destValue, const Json::Value& jsonValue) + { + destValue = jsonValue.asDouble(); + } + + inline Json::Value _StoneSerializeValue(double value) + { + Json::Value result(value); + return result; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue(bool& destValue, const Json::Value& jsonValue) + { + destValue = jsonValue.asBool(); + } + + inline Json::Value _StoneSerializeValue(bool value) + { + Json::Value result(value); + return result; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue( + std::string& destValue + , const Json::Value& jsonValue) + { + destValue = jsonValue.asString(); + } + + inline Json::Value _StoneSerializeValue(const std::string& value) + { + // the following is better than + Json::Value result(value.data(),value.data()+value.size()); + return result; + } + + inline std::string MakeIndent(size_t indent) + { + char* txt = reinterpret_cast(malloc(indent+1)); // NO EXCEPTION BELOW!!!!!!!!!!!! + for(size_t i = 0; i < indent; ++i) + txt[i] = ' '; + txt[indent] = 0; + std::string retVal(txt); + free(txt); // NO EXCEPTION ABOVE !!!!!!!!!! + return retVal; + } + + // generic dumper + template + std::ostream& StoneDumpValue(std::ostream& out, const T& value, size_t indent) + { + out << MakeIndent(indent) << value; + return out; + } + + // string dumper + inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, size_t indent) + { + out << MakeIndent(indent) << "\"" << value << "\""; + return out; + } + + /** Throws in case of problem */ + template + void _StoneDeserializeValue( + std::map& destValue, const Json::Value& jsonValue) + { + destValue.clear(); + for ( + Json::Value::const_iterator itr = jsonValue.begin(); + itr != jsonValue.end(); + itr++) + { + std::string key; + _StoneDeserializeValue(key, itr.key()); + + T innerDestValue; + _StoneDeserializeValue(innerDestValue, *itr); + + destValue[key] = innerDestValue; + } + } + + template + Json::Value _StoneSerializeValue(const std::map& value) + { + Json::Value result(Json::objectValue); + + for (typename std::map::const_iterator it = value.cbegin(); + it != value.cend(); ++it) + { + // it->first it->second + result[it->first] = _StoneSerializeValue(it->second); + } + return result; + } + + template + std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, size_t indent) + { + out << MakeIndent(indent) << "{\n"; + for (typename std::map::const_iterator it = value.cbegin(); + it != value.cend(); ++it) + { + out << MakeIndent(indent+2) << "\"" << it->first << "\" : "; + StoneDumpValue(out, it->second, indent+2); + } + out << MakeIndent(indent) << "}\n"; + return out; + } + + /** Throws in case of problem */ + template + void _StoneDeserializeValue( + std::vector& destValue, const Json::Value& jsonValue) + { + destValue.clear(); + destValue.reserve(jsonValue.size()); + for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) + { + T innerDestValue; + _StoneDeserializeValue(innerDestValue, jsonValue[i]); + destValue.push_back(innerDestValue); + } + } + + template + Json::Value _StoneSerializeValue(const std::vector& value) + { + Json::Value result(Json::arrayValue); + for (size_t i = 0; i < value.size(); ++i) + { + result.append(_StoneSerializeValue(value[i])); + } + return result; + } + + template + std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, size_t indent) + { + out << MakeIndent(indent) << "[\n"; + for (size_t i = 0; i < value.size(); ++i) + { + StoneDumpValue(out, value[i], indent+2); + } + out << MakeIndent(indent) << "]\n"; + return out; + } + + inline void StoneCheckSerializedValueTypeGeneric(const Json::Value& value) + { + if ((!value.isMember("type")) || (!value["type"].isString())) + { + std::stringstream ss; + ss << "Cannot deserialize value ('type' key invalid)"; + throw std::runtime_error(ss.str()); + } + } + + inline void StoneCheckSerializedValueType( + const Json::Value& value, std::string typeStr) + { + StoneCheckSerializedValueTypeGeneric(value); + + std::string actTypeStr = value["type"].asString(); + if (actTypeStr != typeStr) + { + std::stringstream ss; + ss << "Cannot deserialize type" << actTypeStr + << "into " << typeStr; + throw std::runtime_error(ss.str()); + } + } + + // end of generic methods + +// end of generic methods + + enum Tool { + Tool_LineMeasure, + Tool_CircleMeasure, + Tool_Crop, + Tool_Windowing, + Tool_Zoom, + Tool_Pan, + Tool_Move, + Tool_Rotate, + Tool_Resize, + Tool_Mask, + }; + + inline std::string ToString(const Tool& value) + { + if( value == Tool_LineMeasure) + { + return std::string("LineMeasure"); + } + if( value == Tool_CircleMeasure) + { + return std::string("CircleMeasure"); + } + if( value == Tool_Crop) + { + return std::string("Crop"); + } + if( value == Tool_Windowing) + { + return std::string("Windowing"); + } + if( value == Tool_Zoom) + { + return std::string("Zoom"); + } + if( value == Tool_Pan) + { + return std::string("Pan"); + } + if( value == Tool_Move) + { + return std::string("Move"); + } + if( value == Tool_Rotate) + { + return std::string("Rotate"); + } + if( value == Tool_Resize) + { + return std::string("Resize"); + } + if( value == Tool_Mask) + { + return std::string("Mask"); + } + std::stringstream ss; + ss << "Value \"" << value << "\" cannot be converted to Tool. Possible values are: " + << " LineMeasure = " << static_cast(Tool_LineMeasure) << ", " + << " CircleMeasure = " << static_cast(Tool_CircleMeasure) << ", " + << " Crop = " << static_cast(Tool_Crop) << ", " + << " Windowing = " << static_cast(Tool_Windowing) << ", " + << " Zoom = " << static_cast(Tool_Zoom) << ", " + << " Pan = " << static_cast(Tool_Pan) << ", " + << " Move = " << static_cast(Tool_Move) << ", " + << " Rotate = " << static_cast(Tool_Rotate) << ", " + << " Resize = " << static_cast(Tool_Resize) << ", " + << " Mask = " << static_cast(Tool_Mask) << ", " + << std::endl; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + inline void FromString(Tool& value, std::string strValue) + { + if( strValue == std::string("LineMeasure") ) + { + value = Tool_LineMeasure; + return; + } + if( strValue == std::string("CircleMeasure") ) + { + value = Tool_CircleMeasure; + return; + } + if( strValue == std::string("Crop") ) + { + value = Tool_Crop; + return; + } + if( strValue == std::string("Windowing") ) + { + value = Tool_Windowing; + return; + } + if( strValue == std::string("Zoom") ) + { + value = Tool_Zoom; + return; + } + if( strValue == std::string("Pan") ) + { + value = Tool_Pan; + return; + } + if( strValue == std::string("Move") ) + { + value = Tool_Move; + return; + } + if( strValue == std::string("Rotate") ) + { + value = Tool_Rotate; + return; + } + if( strValue == std::string("Resize") ) + { + value = Tool_Resize; + return; + } + if( strValue == std::string("Mask") ) + { + value = Tool_Mask; + return; + } + + std::stringstream ss; + ss << "String \"" << strValue << "\" cannot be converted to Tool. Possible values are: LineMeasure CircleMeasure Crop Windowing Zoom Pan Move Rotate Resize Mask "; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + + inline void _StoneDeserializeValue( + Tool& destValue, const Json::Value& jsonValue) + { + FromString(destValue, jsonValue.asString()); + } + + inline Json::Value _StoneSerializeValue(const Tool& value) + { + std::string strValue = ToString(value); + return Json::Value(strValue); + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const Tool& value, size_t indent = 0) + { + if( value == Tool_LineMeasure) + { + out << MakeIndent(indent) << "LineMeasure" << std::endl; + } + if( value == Tool_CircleMeasure) + { + out << MakeIndent(indent) << "CircleMeasure" << std::endl; + } + if( value == Tool_Crop) + { + out << MakeIndent(indent) << "Crop" << std::endl; + } + if( value == Tool_Windowing) + { + out << MakeIndent(indent) << "Windowing" << std::endl; + } + if( value == Tool_Zoom) + { + out << MakeIndent(indent) << "Zoom" << std::endl; + } + if( value == Tool_Pan) + { + out << MakeIndent(indent) << "Pan" << std::endl; + } + if( value == Tool_Move) + { + out << MakeIndent(indent) << "Move" << std::endl; + } + if( value == Tool_Rotate) + { + out << MakeIndent(indent) << "Rotate" << std::endl; + } + if( value == Tool_Resize) + { + out << MakeIndent(indent) << "Resize" << std::endl; + } + if( value == Tool_Mask) + { + out << MakeIndent(indent) << "Mask" << std::endl; + } + return out; + } + + + enum ActionType { + ActionType_UndoCrop, + ActionType_Rotate, + ActionType_Invert, + }; + + inline std::string ToString(const ActionType& value) + { + if( value == ActionType_UndoCrop) + { + return std::string("UndoCrop"); + } + if( value == ActionType_Rotate) + { + return std::string("Rotate"); + } + if( value == ActionType_Invert) + { + return std::string("Invert"); + } + std::stringstream ss; + ss << "Value \"" << value << "\" cannot be converted to ActionType. Possible values are: " + << " UndoCrop = " << static_cast(ActionType_UndoCrop) << ", " + << " Rotate = " << static_cast(ActionType_Rotate) << ", " + << " Invert = " << static_cast(ActionType_Invert) << ", " + << std::endl; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + inline void FromString(ActionType& value, std::string strValue) + { + if( strValue == std::string("UndoCrop") ) + { + value = ActionType_UndoCrop; + return; + } + if( strValue == std::string("Rotate") ) + { + value = ActionType_Rotate; + return; + } + if( strValue == std::string("Invert") ) + { + value = ActionType_Invert; + return; + } + + std::stringstream ss; + ss << "String \"" << strValue << "\" cannot be converted to ActionType. Possible values are: UndoCrop Rotate Invert "; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + + inline void _StoneDeserializeValue( + ActionType& destValue, const Json::Value& jsonValue) + { + FromString(destValue, jsonValue.asString()); + } + + inline Json::Value _StoneSerializeValue(const ActionType& value) + { + std::string strValue = ToString(value); + return Json::Value(strValue); + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const ActionType& value, size_t indent = 0) + { + if( value == ActionType_UndoCrop) + { + out << MakeIndent(indent) << "UndoCrop" << std::endl; + } + if( value == ActionType_Rotate) + { + out << MakeIndent(indent) << "Rotate" << std::endl; + } + if( value == ActionType_Invert) + { + out << MakeIndent(indent) << "Invert" << std::endl; + } + return out; + } + + + +#ifdef _MSC_VER +#pragma region SelectTool +#endif //_MSC_VER + + struct SelectTool + { + Tool tool; + + SelectTool(Tool tool = Tool()) + { + this->tool = tool; + } + }; + + inline void _StoneDeserializeValue(SelectTool& destValue, const Json::Value& value) + { + _StoneDeserializeValue(destValue.tool, value["tool"]); + } + + inline Json::Value _StoneSerializeValue(const SelectTool& value) + { + Json::Value result(Json::objectValue); + result["tool"] = _StoneSerializeValue(value.tool); + + return result; + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const SelectTool& value, size_t indent = 0) + { + out << MakeIndent(indent) << "{\n"; + out << MakeIndent(indent) << "tool:\n"; + StoneDumpValue(out, value.tool,indent+2); + out << "\n"; + + out << MakeIndent(indent) << "}\n"; + return out; + } + + inline void StoneDeserialize(SelectTool& destValue, const Json::Value& value) + { + StoneCheckSerializedValueType(value, "StoneSampleCommands.SelectTool"); + _StoneDeserializeValue(destValue, value["value"]); + } + + inline Json::Value StoneSerializeToJson(const SelectTool& value) + { + Json::Value result(Json::objectValue); + result["type"] = "StoneSampleCommands.SelectTool"; + result["value"] = _StoneSerializeValue(value); + return result; + } + + inline std::string StoneSerialize(const SelectTool& value) + { + Json::Value resultJson = StoneSerializeToJson(value); + std::string resultStr = resultJson.toStyledString(); + return resultStr; + } + +#ifdef _MSC_VER +#pragma endregion SelectTool +#endif //_MSC_VER + +#ifdef _MSC_VER +#pragma region Action +#endif //_MSC_VER + + struct Action + { + ActionType type; + + Action(ActionType type = ActionType()) + { + this->type = type; + } + }; + + inline void _StoneDeserializeValue(Action& destValue, const Json::Value& value) + { + _StoneDeserializeValue(destValue.type, value["type"]); + } + + inline Json::Value _StoneSerializeValue(const Action& value) + { + Json::Value result(Json::objectValue); + result["type"] = _StoneSerializeValue(value.type); + + return result; + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const Action& value, size_t indent = 0) + { + out << MakeIndent(indent) << "{\n"; + out << MakeIndent(indent) << "type:\n"; + StoneDumpValue(out, value.type,indent+2); + out << "\n"; + + out << MakeIndent(indent) << "}\n"; + return out; + } + + inline void StoneDeserialize(Action& destValue, const Json::Value& value) + { + StoneCheckSerializedValueType(value, "StoneSampleCommands.Action"); + _StoneDeserializeValue(destValue, value["value"]); + } + + inline Json::Value StoneSerializeToJson(const Action& value) + { + Json::Value result(Json::objectValue); + result["type"] = "StoneSampleCommands.Action"; + result["value"] = _StoneSerializeValue(value); + return result; + } + + inline std::string StoneSerialize(const Action& value) + { + Json::Value resultJson = StoneSerializeToJson(value); + std::string resultStr = resultJson.toStyledString(); + return resultStr; + } + +#ifdef _MSC_VER +#pragma endregion Action +#endif //_MSC_VER + +#ifdef _MSC_VER +#pragma region Dispatching code +#endif //_MSC_VER + + class IHandler + { + public: + virtual bool Handle(const SelectTool& value) = 0; + virtual bool Handle(const Action& value) = 0; + }; + + /** Service function for StoneDispatchToHandler */ + inline bool StoneDispatchJsonToHandler( + const Json::Value& jsonValue, IHandler* handler) + { + StoneCheckSerializedValueTypeGeneric(jsonValue); + std::string type = jsonValue["type"].asString(); + if (type == "") + { + // this should never ever happen + throw std::runtime_error("Caught empty type while dispatching"); + } + else if (type == "StoneSampleCommands.SelectTool") + { + SelectTool value; + _StoneDeserializeValue(value, jsonValue["value"]); + return handler->Handle(value); + } + else if (type == "StoneSampleCommands.Action") + { + Action value; + _StoneDeserializeValue(value, jsonValue["value"]); + return handler->Handle(value); + } + else + { + return false; + } + } + + /** Takes a serialized type and passes this to the handler */ + inline bool StoneDispatchToHandler(std::string strValue, IHandler* handler) + { + Json::Value readValue; + + Json::CharReaderBuilder builder; + Json::CharReader* reader = builder.newCharReader(); + + StoneSmartPtr ptr(reader); + + std::string errors; + + bool ok = reader->parse( + strValue.c_str(), + strValue.c_str() + strValue.size(), + &readValue, + &errors + ); + if (!ok) + { + std::stringstream ss; + ss << "Jsoncpp parsing error: " << errors; + throw std::runtime_error(ss.str()); + } + return StoneDispatchJsonToHandler(readValue, handler); + } + +#ifdef _MSC_VER +#pragma endregion Dispatching code +#endif //_MSC_VER +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,333 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 + +Generated on 2019-03-18 12:07:42.696093 by stonegentool + +*/ + +function StoneCheckSerializedValueType(value: any, typeStr: string) +{ + StoneCheckSerializedValueTypeGeneric(value); + + if (value['type'] != typeStr) + { + throw new Error( + `Cannot deserialize type ${value['type']} into ${typeStr}`); + } +} + +function isString(val: any) :boolean +{ + return ((typeof val === 'string') || (val instanceof String)); +} + +function StoneCheckSerializedValueTypeGeneric(value: any) +{ + // console.//log("+-------------------------------------------------+"); + // console.//log("| StoneCheckSerializedValueTypeGeneric |"); + // console.//log("+-------------------------------------------------+"); + // console.//log("value = "); + // console.//log(value); + if ( (!('type' in value)) || (!isString(value.type)) ) + { + throw new Error( + "Cannot deserialize value ('type' key invalid)"); + } +} + +// end of generic methods + +export enum Tool { + LineMeasure = "LineMeasure", + CircleMeasure = "CircleMeasure", + Crop = "Crop", + Windowing = "Windowing", + Zoom = "Zoom", + Pan = "Pan", + Move = "Move", + Rotate = "Rotate", + Resize = "Resize", + Mask = "Mask" +}; + +export function Tool_FromString(strValue:string) : Tool +{ + if( strValue == "LineMeasure" ) + { + return Tool.LineMeasure; + } + if( strValue == "CircleMeasure" ) + { + return Tool.CircleMeasure; + } + if( strValue == "Crop" ) + { + return Tool.Crop; + } + if( strValue == "Windowing" ) + { + return Tool.Windowing; + } + if( strValue == "Zoom" ) + { + return Tool.Zoom; + } + if( strValue == "Pan" ) + { + return Tool.Pan; + } + if( strValue == "Move" ) + { + return Tool.Move; + } + if( strValue == "Rotate" ) + { + return Tool.Rotate; + } + if( strValue == "Resize" ) + { + return Tool.Resize; + } + if( strValue == "Mask" ) + { + return Tool.Mask; + } + + let msg : string = `String ${strValue} cannot be converted to Tool. Possible values are: LineMeasure, CircleMeasure, Crop, Windowing, Zoom, Pan, Move, Rotate, Resize, Mask`; + throw new Error(msg); +} + +export function Tool_ToString(value:Tool) : string +{ + if( value == Tool.LineMeasure ) + { + return "LineMeasure"; + } + if( value == Tool.CircleMeasure ) + { + return "CircleMeasure"; + } + if( value == Tool.Crop ) + { + return "Crop"; + } + if( value == Tool.Windowing ) + { + return "Windowing"; + } + if( value == Tool.Zoom ) + { + return "Zoom"; + } + if( value == Tool.Pan ) + { + return "Pan"; + } + if( value == Tool.Move ) + { + return "Move"; + } + if( value == Tool.Rotate ) + { + return "Rotate"; + } + if( value == Tool.Resize ) + { + return "Resize"; + } + if( value == Tool.Mask ) + { + return "Mask"; + } + + let msg : string = `Value ${value} cannot be converted to Tool. Possible values are: `; + { + let _LineMeasure_enumValue : string = Tool.LineMeasure; // enums are strings in stonecodegen, so this will work. + let msg_LineMeasure : string = `LineMeasure (${_LineMeasure_enumValue}), `; + msg = msg + msg_LineMeasure; + } + { + let _CircleMeasure_enumValue : string = Tool.CircleMeasure; // enums are strings in stonecodegen, so this will work. + let msg_CircleMeasure : string = `CircleMeasure (${_CircleMeasure_enumValue}), `; + msg = msg + msg_CircleMeasure; + } + { + let _Crop_enumValue : string = Tool.Crop; // enums are strings in stonecodegen, so this will work. + let msg_Crop : string = `Crop (${_Crop_enumValue}), `; + msg = msg + msg_Crop; + } + { + let _Windowing_enumValue : string = Tool.Windowing; // enums are strings in stonecodegen, so this will work. + let msg_Windowing : string = `Windowing (${_Windowing_enumValue}), `; + msg = msg + msg_Windowing; + } + { + let _Zoom_enumValue : string = Tool.Zoom; // enums are strings in stonecodegen, so this will work. + let msg_Zoom : string = `Zoom (${_Zoom_enumValue}), `; + msg = msg + msg_Zoom; + } + { + let _Pan_enumValue : string = Tool.Pan; // enums are strings in stonecodegen, so this will work. + let msg_Pan : string = `Pan (${_Pan_enumValue}), `; + msg = msg + msg_Pan; + } + { + let _Move_enumValue : string = Tool.Move; // enums are strings in stonecodegen, so this will work. + let msg_Move : string = `Move (${_Move_enumValue}), `; + msg = msg + msg_Move; + } + { + let _Rotate_enumValue : string = Tool.Rotate; // enums are strings in stonecodegen, so this will work. + let msg_Rotate : string = `Rotate (${_Rotate_enumValue}), `; + msg = msg + msg_Rotate; + } + { + let _Resize_enumValue : string = Tool.Resize; // enums are strings in stonecodegen, so this will work. + let msg_Resize : string = `Resize (${_Resize_enumValue}), `; + msg = msg + msg_Resize; + } + { + let _Mask_enumValue : string = Tool.Mask; // enums are strings in stonecodegen, so this will work. + let msg_Mask : string = `Mask (${_Mask_enumValue})`; + msg = msg + msg_Mask; + } + throw new Error(msg); +} + +export enum ActionType { + UndoCrop = "UndoCrop", + Rotate = "Rotate", + Invert = "Invert" +}; + +export function ActionType_FromString(strValue:string) : ActionType +{ + if( strValue == "UndoCrop" ) + { + return ActionType.UndoCrop; + } + if( strValue == "Rotate" ) + { + return ActionType.Rotate; + } + if( strValue == "Invert" ) + { + return ActionType.Invert; + } + + let msg : string = `String ${strValue} cannot be converted to ActionType. Possible values are: UndoCrop, Rotate, Invert`; + throw new Error(msg); +} + +export function ActionType_ToString(value:ActionType) : string +{ + if( value == ActionType.UndoCrop ) + { + return "UndoCrop"; + } + if( value == ActionType.Rotate ) + { + return "Rotate"; + } + if( value == ActionType.Invert ) + { + return "Invert"; + } + + let msg : string = `Value ${value} cannot be converted to ActionType. Possible values are: `; + { + let _UndoCrop_enumValue : string = ActionType.UndoCrop; // enums are strings in stonecodegen, so this will work. + let msg_UndoCrop : string = `UndoCrop (${_UndoCrop_enumValue}), `; + msg = msg + msg_UndoCrop; + } + { + let _Rotate_enumValue : string = ActionType.Rotate; // enums are strings in stonecodegen, so this will work. + let msg_Rotate : string = `Rotate (${_Rotate_enumValue}), `; + msg = msg + msg_Rotate; + } + { + let _Invert_enumValue : string = ActionType.Invert; // enums are strings in stonecodegen, so this will work. + let msg_Invert : string = `Invert (${_Invert_enumValue})`; + msg = msg + msg_Invert; + } + throw new Error(msg); +} + + + +export class SelectTool { + tool:Tool; + + constructor() { + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'StoneSampleCommands.SelectTool'; + container['value'] = this; + return JSON.stringify(container); + } + + public static StoneDeserialize(valueStr: string) : SelectTool + { + let value: any = JSON.parse(valueStr); + StoneCheckSerializedValueType(value, 'StoneSampleCommands.SelectTool'); + let result: SelectTool = value['value'] as SelectTool; + return result; + } +} +export class Action { + type:ActionType; + + constructor() { + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'StoneSampleCommands.Action'; + container['value'] = this; + return JSON.stringify(container); + } + + public static StoneDeserialize(valueStr: string) : Action + { + let value: any = JSON.parse(valueStr); + StoneCheckSerializedValueType(value, 'StoneSampleCommands.Action'); + let result: Action = value['value'] as Action; + return result; + } +} + +export interface IHandler { +}; + +/** Service function for StoneDispatchToHandler */ +export function StoneDispatchJsonToHandler( + jsonValue: any, handler: IHandler): boolean +{ + StoneCheckSerializedValueTypeGeneric(jsonValue); + let type: string = jsonValue["type"]; + if (type == "") + { + // this should never ever happen + throw new Error("Caught empty type while dispatching"); + } + else + { + return false; + } +} + +/** Takes a serialized type and passes this to the handler */ +export function StoneDispatchToHandler( + strValue: string, handler: IHandler): boolean +{ + // console.//log("+------------------------------------------------+"); + // console.//log("| StoneDispatchToHandler |"); + // console.//log("+------------------------------------------------+"); + // console.//log("strValue = "); + // console.//log(strValue); + let jsonValue: any = JSON.parse(strValue) + return StoneDispatchJsonToHandler(jsonValue, handler); +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SynchronizedSeriesApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SynchronizedSeriesApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,109 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleInteractor.h" + +#include "../../../Framework/Toolbox/OrthancSeriesLoader.h" +#include "../../../Framework/Layers/SeriesFrameRendererFactory.h" +#include "../../../Framework/Layers/ReferenceLineFactory.h" +#include "../../../Framework/Widgets/LayoutWidget.h" + +#include + +namespace OrthancStone +{ + namespace Samples + { + class SynchronizedSeriesApplication : public SampleApplicationBase + { + private: + LayeredSceneWidget* CreateSeriesWidget(BasicApplicationContext& context, + const std::string& series) + { + std::unique_ptr loader + (new OrthancSeriesLoader(context.GetWebService().GetConnection(), series)); + + std::unique_ptr interactor(new SampleInteractor(*loader, false)); + + std::unique_ptr widget(new LayeredSceneWidget); + widget->AddLayer(new SeriesFrameRendererFactory(loader.release(), false)); + widget->SetSlice(interactor->GetCursor().GetCurrentSlice()); + widget->SetInteractor(*interactor); + + context.AddInteractor(interactor.release()); + + return widget.release(); + } + + public: + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("a", boost::program_options::value(), + "Orthanc ID of the 1st series") + ("b", boost::program_options::value(), + "Orthanc ID of the 2nd series") + ("c", boost::program_options::value(), + "Orthanc ID of the 3rd series") + ; + + options.add(generic); + } + + virtual void Initialize(BasicApplicationContext& context, + IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + if (parameters.count("a") != 1 || + parameters.count("b") != 1 || + parameters.count("c") != 1) + { + LOG(ERROR) << "At least one of the three series IDs is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::unique_ptr a(CreateSeriesWidget(context, parameters["a"].as())); + std::unique_ptr b(CreateSeriesWidget(context, parameters["b"].as())); + std::unique_ptr c(CreateSeriesWidget(context, parameters["c"].as())); + + ReferenceLineFactory::Configure(*a, *b); + ReferenceLineFactory::Configure(*a, *c); + ReferenceLineFactory::Configure(*b, *c); + + std::unique_ptr layout(new LayoutWidget); + layout->SetPadding(5); + layout->AddWidget(a.release()); + + std::unique_ptr layoutB(new LayoutWidget); + layoutB->SetVertical(); + layoutB->SetPadding(5); + layoutB->AddWidget(b.release()); + layoutB->AddWidget(c.release()); + layout->AddWidget(layoutB.release()); + + context.SetCentralWidget(layout.release()); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/TestPatternApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/TestPatternApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "SampleApplicationBase.h" + +#include "../../../Framework/Widgets/TestCairoWidget.h" +#include "../../../Framework/Widgets/TestWorldSceneWidget.h" +#include "../../../Framework/Widgets/LayoutWidget.h" + +namespace OrthancStone +{ + namespace Samples + { + class TestPatternApplication : public SampleApplicationBase + { + public: + virtual void DeclareStartupOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description generic("Sample options"); + generic.add_options() + ("animate", boost::program_options::value()->default_value(true), "Animate the test pattern") + ; + + options.add(generic); + } + + virtual void Initialize(IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + std::unique_ptr layout(new LayoutWidget); + layout->SetPadding(10); + layout->SetBackgroundCleared(true); + layout->AddWidget(new TestCairoWidget(parameters["animate"].as())); + layout->AddWidget(new TestWorldSceneWidget(parameters["animate"].as())); + + context_->SetCentralWidget(layout.release()); + context_->SetUpdateDelay(25); // If animation, update the content each 25ms + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/index.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,23 @@ + + + + + + + + + + + + Wasm Samples + + + + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/samples-styles.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/samples-styles.css Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,16 @@ +html, body { + width: 100%; + height: 100%; + margin: 0px; + border: 0; + overflow: hidden; /* Disable scrollbars */ + display: block; /* No floating content on sides */ + background-color: black; + color: white; + font-family: Arial, Helvetica, sans-serif; +} + +canvas { + left:0px; + top:0px; +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,39 @@ + + + + + + + + + + + + + Simple Viewer + + + + +
+
+ +
+
+ +
+
+
+ line + circle + + +
+ + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); + +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewerSingleFile", "/orthanc"); + +function SelectTool(toolName: string) { + var command = { + command: "selectTool", + args: { + toolName: toolName + } + }; + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); + +} + +function PerformAction(commandName: string) { + var command = { + command: commandName, + commandType: "simple", + args: {} + }; + wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); +} + +//initializes the buttons +//----------------------- +// install "SelectTool" handlers +document.querySelectorAll("[tool-selector]").forEach((e) => { + console.log(e); + (e as HTMLInputElement).addEventListener("click", () => { + console.log(e); + SelectTool(e.attributes["tool-selector"].value); + }); +}); + +// install "PerformAction" handlers +document.querySelectorAll("[action-trigger]").forEach((e) => { + (e as HTMLInputElement).addEventListener("click", () => { + PerformAction(e.attributes["action-trigger"].value); + }); +}); + +// this method is called "from the C++ code" when the StoneApplication is updated. +// it can be used to update the UI of the application +function UpdateWebApplicationWithString(statusUpdateMessage: string) { + console.log(statusUpdateMessage); + + if (statusUpdateMessage.startsWith("series-description=")) { + document.getElementById("series-description").innerText = statusUpdateMessage.split("=")[1]; + } +} + +function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { + console.log("updating web application with serialized message: ", statusUpdateMessageString); + console.log(""); +} + +// make it available to other js scripts in the application +( window).UpdateWebApplicationWithString = UpdateWebApplicationWithString; + +( window).UpdateWebApplicationWithSerializedMessage = UpdateWebApplicationWithSerializedMessage; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.tsconfig.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.tsconfig.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,9 @@ +{ + "extends" : "./tsconfig-samples", + "compilerOptions": { + // "outFile": "../build-web/app-simple-viewer-single-file.js" + }, + "include" : [ + "simple-viewer-single-file.ts" + ] +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,22 @@ + + + + + + + + + + + + Simple Viewer + + + +
+ +
+ + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,3 @@ +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); + +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrameEditor", "/orthanc"); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.tsconfig.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.tsconfig.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,8 @@ +{ + "extends" : "./tsconfig-samples", + "compilerOptions": { + }, + "include" : [ + "single-frame-editor.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,22 @@ + + + + + + + + + + + + Simple Viewer + + + +
+ +
+ + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,4 @@ +import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); + +wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrame", "/orthanc"); + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.tsconfig.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.tsconfig.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,8 @@ +{ + "extends" : "./tsconfig-samples", + "compilerOptions": { + }, + "include" : [ + "single-frame.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/tsconfig-samples.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/tsconfig-samples.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,11 @@ +{ + "extends" : "../../../Platforms/Wasm/tsconfig-stone", + "compilerOptions": { + "sourceMap": false, + "lib" : [ + "es2017", + "dom", + "dom.iterable" + ] + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,27 @@ +#!/bin/bash +# +# usage: +# to build all targets in Debug: +# ./build-wasm.sh +# +# to build a single target in release: +# ./build-wasm.sh OrthancStoneSingleFrameEditor Release + +set -e + +target=${1:-all} +buildType=${2:-Debug} + +currentDir=$(pwd) +samplesRootDir=$(pwd) + +mkdir -p $samplesRootDir/build-wasm +cd $samplesRootDir/build-wasm + +source ~/apps/emsdk/emsdk_env.sh +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=~/apps/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=$buildType -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc -DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON +ninja $target + +echo "-- building the web application -- " +cd $currentDir +./build-web.sh \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh.old --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh.old Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,33 @@ +#!/bin/bash +# +# usage: +# to build all targets: +# ./build-wasm.sh +# +# to build a single target: +# ./build-wasm.sh OrthancStoneSingleFrameEditor + +set -e + +target=${1:-all} + +currentDir=$(pwd) +samplesRootDir=$(pwd) + +mkdir -p $samplesRootDir/build-wasm +cd $samplesRootDir/build-wasm + +source ~/apps/emsdk/emsdk_env.sh +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake \ + -DCMAKE_BUILD_TYPE=Release \ + -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone \ + -DORTHANC_FRAMEWORK_SOURCE=path \ + -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc \ + -DALLOW_DOWNLOADS=ON .. \ + -DENABLE_WASM=ON + +ninja $target + +echo "-- building the web application -- " +cd $currentDir +./build-web.sh diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web-ext.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web-ext.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +#!/bin/bash + +set -e + +target=${1:-all} +# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ + +currentDir=$(pwd) + +scriptDirRel=$(dirname $0) +#echo $scriptDirRel +scriptDirAbs=$(realpath $scriptDirRel) +echo $scriptDirAbs + +samplesRootDir=scriptDirAbs + +outputDir=$samplesRootDir/build-web/ +mkdir -p $outputDir + +# files used by all single files samples +cp $samplesRootDir/Web/index.html $outputDir +cp $samplesRootDir/Web/samples-styles.css $outputDir + +# build simple-viewer-single-file (obsolete project) +if [[ $target == "all" || $target == "OrthancStoneSimpleViewerSingleFile" ]]; then + cp $samplesRootDir/Web/simple-viewer-single-file.html $outputDir + tsc --allowJs --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json + cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js $outputDir + cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm $outputDir +fi + +# build single-frame +if [[ $target == "all" || $target == "OrthancStoneSingleFrame" ]]; then + cp $samplesRootDir/Web/single-frame.html $outputDir + tsc --allowJs --project $samplesRootDir/Web/single-frame.tsconfig.json + cp $currentDir/build-wasm/OrthancStoneSingleFrame.js $outputDir + cp $currentDir/build-wasm/OrthancStoneSingleFrame.wasm $outputDir +fi + +# build single-frame-editor +if [[ $target == "all" || $target == "OrthancStoneSingleFrameEditor" ]]; then + cp $samplesRootDir/Web/single-frame-editor.html $outputDir + tsc --allowJs --project $samplesRootDir/Web/single-frame-editor.tsconfig.json + cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.js $outputDir + cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm $outputDir +fi + +# build simple-viewer project +if [[ $target == "all" || $target == "OrthancStoneSimpleViewer" ]]; then + mkdir -p $outputDir/simple-viewer/ + cp $samplesRootDir/SimpleViewer/Wasm/simple-viewer.html $outputDir/simple-viewer/ + cp $samplesRootDir/SimpleViewer/Wasm/styles.css $outputDir/simple-viewer/ + tsc --allowJs --project $samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json + cp $currentDir/build-wasm/OrthancStoneSimpleViewer.js $outputDir/simple-viewer/ + cp $currentDir/build-wasm/OrthancStoneSimpleViewer.wasm $outputDir/simple-viewer/ +fi + +cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,74 @@ +#!/bin/bash + +set -e + +target=${1:-all} +# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ + +currentDir=$(pwd) +samplesRootDir=$(pwd) + +echo "*************************************************************************" +echo "samplesRootDir = $samplesRootDir" +echo "*************************************************************************" + +outputDir=$samplesRootDir/build-web/ +mkdir -p "$outputDir" + +# files used by all single files samples +cp "$samplesRootDir/Web/index.html" "$outputDir" +cp "$samplesRootDir/Web/samples-styles.css" "$outputDir" + +# # build simple-viewer-single-file (obsolete project) +# if [[ $target == "all" || $target == "OrthancStoneSimpleViewerSingleFile" ]]; then +# cp $samplesRootDir/Web/simple-viewer-single-file.html $outputDir +# tsc --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json --outDir "$outputDir" +# browserify \ +# "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ +# "$outputDir/Applications/Samples/Web/simple-viewer-single-file.js" \ +# -o "$outputDir/app-simple-viewer-single-file.js" +# cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js" $outputDir +# cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm" $outputDir +# fi + +# # build single-frame +# if [[ $target == "all" || $target == "OrthancStoneSingleFrame" ]]; then +# cp $samplesRootDir/Web/single-frame.html $outputDir +# tsc --project $samplesRootDir/Web/single-frame.tsconfig.json --outDir "$outputDir" +# browserify \ +# "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ +# "$outputDir/Applications/Samples/Web/single-frame.js" \ +# -o "$outputDir/app-single-frame.js" +# cp "$currentDir/build-wasm/OrthancStoneSingleFrame.js" $outputDir +# cp "$currentDir/build-wasm/OrthancStoneSingleFrame.wasm" $outputDir +# fi + +# build single-frame-editor +if [[ $target == "all" || $target == "OrthancStoneSingleFrameEditor" ]]; then + cp $samplesRootDir/Web/single-frame-editor.html $outputDir + tsc --project $samplesRootDir/Web/single-frame-editor.tsconfig.json --outDir "$outputDir" + browserify \ + "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/Applications/Samples/Web/single-frame-editor.js" \ + -o "$outputDir/app-single-frame-editor.js" + cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.js" $outputDir + cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm" $outputDir +fi + +# build simple-viewer project +if [[ $target == "all" || $target == "OrthancStoneSimpleViewer" ]]; then + mkdir -p $outputDir/simple-viewer/ + cp $samplesRootDir/SimpleViewer/Wasm/simple-viewer.html $outputDir/simple-viewer/ + cp $samplesRootDir/SimpleViewer/Wasm/styles.css $outputDir/simple-viewer/ + + # the root dir must contain all the source files for the whole project + tsc --module commonjs --allowJs --project "$samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json" --rootDir "$samplesRootDir/../.." --outDir "$outputDir/simple-viewer/" + browserify \ + "$outputDir/simple-viewer/Platforms/Wasm/wasm-application-runner.js" \ + "$outputDir/simple-viewer/Applications/Samples/SimpleViewer/Wasm/simple-viewer.js" \ + -o "$outputDir/simple-viewer/app-simple-viewer.js" + cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.js" "$outputDir/simple-viewer/" + cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.wasm" "$outputDir/simple-viewer/" +fi + +cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/get-requirements-windows.ps1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/get-requirements-windows.ps1 Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ + +if ($true) { + + Write-Error "This script is obsolete. Please work under WSL and run build-wasm.sh" + +} else { + + param( + [IO.DirectoryInfo] $EmsdkRootDir = "C:\Emscripten", + [bool] $Overwrite = $false + ) + + if (Test-Path -Path $EmsdkRootDir) { + if( $Override) { + Remove-Item -Path $EmsdkRootDir -Force -Recurse + } else { + throw "The `"$EmsdkRootDir`" folder may not exist! Use the Overwrite flag to bypass this check." + } + } + + # TODO: detect whether git is installed + # choco install -y git + + Write-Host "Will retrieve the Emscripten SDK to the `"$EmsdkRootDir`" folder" + + $EmsdkParentDir = split-path -Parent $EmsdkRootDir + $EmsdkRootName = split-path -Leaf $EmsdkRootDir + + Push-Location $EmsdkParentDir + + git clone https://github.com/juj/emsdk.git $EmsdkRootName + cd $EmsdkRootName + + git pull + + ./emsdk install latest + + ./emsdk activate latest + + echo "INFO: the ~/.emscripten file has been configured for this installation of Emscripten." + + Write-Host "emsdk is now installed in $EmsdkRootDir" + + Pop-Location + +} + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/nginx.local.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/nginx.local.conf Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +# Local config to serve the WASM samples static files and reverse proxy Orthanc. +# Uses port 9977 instead of 80. + +# `events` section is mandatory +events { + worker_connections 1024; # Default: 1024 +} + +http { + + # prevent nginx sync issues on OSX + proxy_buffering off; + + server { + listen 9977 default_server; + client_max_body_size 4G; + + # location may have to be adjusted depending on your OS and nginx install + include /etc/nginx/mime.types; + # if not in your system mime.types, add this line to support WASM: + # types { + # application/wasm wasm; + # } + + # serve WASM static files + root build-web/; + location / { + } + + # reverse proxy orthanc + location /orthanc/ { + rewrite /orthanc(.*) $1 break; + proxy_pass http://127.0.0.1:8042; + proxy_set_header Host $http_host; + proxy_set_header my-auth-header good-token; + proxy_request_buffering off; + proxy_max_temp_file_size 0; + client_max_body_size 0; + } + + + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/package-lock.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/package-lock.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==" + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,142 @@ +cmake_minimum_required(VERSION 2.8.3) +project(RtViewerDemo) + +if(MSVC) + add_definitions(/MP) + if (CMAKE_BUILD_TYPE MATCHES DEBUG) + add_definitions(/JMC) + endif() +endif() + +message("-------------------------------------------------------------------------------------------------------------------") +message("ORTHANC_FRAMEWORK_ROOT is set to ${ORTHANC_FRAMEWORK_ROOT}") +message("-------------------------------------------------------------------------------------------------------------------") + +if(NOT DEFINED ORTHANC_FRAMEWORK_ROOT) + message(FATAL_ERROR "The location of the Orthanc source repository must be set in the ORTHANC_FRAMEWORK_ROOT CMake variable") +endif() + +message("-------------------------------------------------------------------------------------------------------------------") +message("STONE_SOURCES_DIR is set to ${STONE_SOURCES_DIR}") +message("-------------------------------------------------------------------------------------------------------------------") + +if(NOT DEFINED STONE_SOURCES_DIR) + message(FATAL_ERROR "The location of the Stone of Orthanc source repository must be set in the STONE_SOURCES_DIR CMake variable") +endif() + +include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneParameters.cmake) + +if (OPENSSL_NO_CAPIENG) +add_definitions(-DOPENSSL_NO_CAPIENG=1) +endif() + +set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") +set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") +set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") + +if (ENABLE_WASM) + ##################################################################### + ## Configuration of the Emscripten compiler for WebAssembly target + ##################################################################### + + set(WASM_FLAGS "-s WASM=1") + set(WASM_FLAGS "${WASM_FLAGS} -s STRICT=1") # drops support for all deprecated build options + set(WASM_FLAGS "${WASM_FLAGS} -s FILESYSTEM=1") # if we don't include it, gen_uuid.c fails to build because srand, getpid(), ... are not defined + set(WASM_FLAGS "${WASM_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0") # actually enable exception catching + set(WASM_FLAGS "${WASM_FLAGS} -s ERROR_ON_MISSING_LIBRARIES=1") + + if (CMAKE_BUILD_TYPE MATCHES DEBUG) + set(WASM_FLAGS "${WASM_FLAGS} -g4") # generate debug information + set(WASM_FLAGS "${WASM_FLAGS} -s ASSERTIONS=2") # more runtime checks + else() + set(WASM_FLAGS "${WASM_FLAGS} -Os") # optimize for web (speed and size) + endif() + + set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS}") # not always clear which flags are for the compiler and which one are for the linker -> pass them all to the linker too + # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Applications/Samples/samples-library.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"'") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_STACK=128000000") + + add_definitions(-DORTHANC_ENABLE_WASM=1) + set(ORTHANC_SANDBOXED ON) + +elseif (ENABLE_QT OR ENABLE_SDL) + + set(ENABLE_NATIVE ON) + set(ORTHANC_SANDBOXED OFF) + set(ENABLE_CRYPTO_OPTIONS ON) + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_WEB_CLIENT ON) + +endif() + + +##################################################################### +## Configuration for Orthanc +##################################################################### + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.4.1") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + +add_definitions( + -DORTHANC_ENABLE_LOGGING_PLUGIN=0 + ) + + +##################################################################### +## Build a static library containing the Orthanc Stone framework +##################################################################### + +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) + +include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneConfiguration.cmake) + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + +##################################################################### +## Build all the sample applications +##################################################################### + +include_directories(${ORTHANC_STONE_ROOT}) + +list(APPEND RTVIEWERDEMO_APPLICATION_SOURCES + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleInteractor.h + ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleApplicationBase.h + ) + +if (ENABLE_WASM) + list(APPEND RTVIEWERDEMO_APPLICATION_SOURCES + ${STONE_WASM_SOURCES} + ) +endif() + +add_executable(RtViewerDemo + main.cpp + ${RTVIEWERDEMO_APPLICATION_SOURCES} +) +set_target_properties(RtViewerDemo PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=3) +target_include_directories(RtViewerDemo PRIVATE ${ORTHANC_STONE_ROOT}) +target_link_libraries(RtViewerDemo OrthancStone) + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-sdl-msvc15.ps1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-sdl-msvc15.ps1 Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,24 @@ +if (-not (Test-Path "build-sdl-msvc15")) { + mkdir -p "build-sdl-msvc15" +} + +cd build-sdl-msvc15 + +cmake -G "Visual Studio 15 2017 Win64" -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DSTONE_SOURCES_DIR="$($pwd)\..\..\..\.." -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\..\..\..\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON .. + +if (!$?) { + Write-Error 'cmake configuration failed' -ErrorAction Stop +} + +cmake --build . --target RtViewerDemo --config Debug + +if (!$?) { + Write-Error 'cmake build failed' -ErrorAction Stop +} + +cd Debug + +.\RtViewerDemo.exe --ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-wasm.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-wasm.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,29 @@ +#!/bin/bash +# +# usage: +# build-wasm BUILD_TYPE +# where BUILD_TYPE is Debug, RelWithDebInfo or Release + +set -e + +buildType=${1:-Debug} + +currentDir=$(pwd) +currentDirAbs=$(realpath $currentDir) + +mkdir -p build-wasm +cd build-wasm + +source ~/apps/emsdk/emsdk_env.sh +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake \ +-DCMAKE_BUILD_TYPE=$buildType -DSTONE_SOURCES_DIR=$currentDirAbs/../../../../orthanc-stone \ +-DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDirAbs/../../../../orthanc \ +-DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON + +ninja $target + +echo "-- building the web application -- " +cd $currentDir +./build-web.sh + +echo "Launch start-serving-files.sh to access the web sample application locally" diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-web.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-web.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +target=${1:-all} +# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ + +currentDir=$(pwd) +samplesRootDir=$(pwd) + +tscOutput=$samplesRootDir/build-tsc-output/ +outputDir=$samplesRootDir/build-web/ +mkdir -p "$outputDir" + +# files used by all single files samples +cp "$samplesRootDir/index.html" "$outputDir" +cp "$samplesRootDir/samples-styles.css" "$outputDir" + +# build rt-viewer-demo +cp $samplesRootDir/rt-viewer-demo.html $outputDir +tsc --project $samplesRootDir/rt-viewer-demo.tsconfig.json --outDir "$tscOutput" +browserify \ + "$tscOutput/orthanc-stone/Platforms/Wasm/logger.js" \ + "$tscOutput/orthanc-stone/Platforms/Wasm/stone-framework-loader.js" \ + "$tscOutput/orthanc-stone/Platforms/Wasm/wasm-application-runner.js" \ + "$tscOutput/orthanc-stone/Platforms/Wasm/wasm-viewport.js" \ + "$tscOutput/rt-viewer-sample/rt-viewer-demo.js" \ + -o "$outputDir/app-rt-viewer-demo.js" +cp "$currentDir/build-wasm/RtViewerDemo.js" $outputDir +cp "$currentDir/build-wasm/RtViewerDemo.wasm" $outputDir + +cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/index.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ + + + + + + + + + + + + Wasm Samples + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/main.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,893 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "Applications/IStoneApplication.h" +#include "Framework/Widgets/WorldSceneWidget.h" +#include "Framework/Widgets/LayoutWidget.h" + +#if ORTHANC_ENABLE_WASM==1 + #include "Platforms/Wasm/WasmPlatformApplicationAdapter.h" + #include "Platforms/Wasm/Defaults.h" + #include "Platforms/Wasm/WasmViewport.h" +#endif + +#if ORTHANC_ENABLE_QT==1 + #include "Qt/SampleMainWindow.h" + #include "Qt/SampleMainWindowWithButtons.h" +#endif + +#include "Framework/Layers/DicomSeriesVolumeSlicer.h" +#include "Framework/Widgets/SliceViewerWidget.h" +#include "Framework/Volumes/StructureSetLoader.h" + +#include +#include +#include + +#include +#include "Framework/dev.h" +#include "Framework/Widgets/LayoutWidget.h" +#include "Framework/Layers/DicomStructureSetSlicer.h" + +namespace OrthancStone +{ + namespace Samples + { + class RtViewerDemoBaseApplication : public IStoneApplication + { + protected: + // ownership is transferred to the application context +#ifndef RESTORE_NON_RTVIEWERDEMO_BEHAVIOR + LayoutWidget* mainWidget_; +#else + WorldSceneWidget* mainWidget_; +#endif + + public: + virtual void Initialize(StoneApplicationContext* context, + IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE + { + } + + virtual std::string GetTitle() const ORTHANC_OVERRIDE + { + return "Stone of Orthanc - Sample"; + } + + /** + * In the basic samples, the commands are handled by the platform adapter and NOT + * by the application handler + */ + virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE {}; + + + virtual void Finalize() ORTHANC_OVERRIDE {} + virtual IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainWidget_;} + +#if ORTHANC_ENABLE_WASM==1 + // default implementations for a single canvas named "canvas" in the HTML and an empty WasmApplicationAdapter + + virtual void InitializeWasm() ORTHANC_OVERRIDE + { + AttachWidgetToWasmViewport("canvas", mainWidget_); + } + + virtual WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(MessageBroker& broker) + { + return new WasmPlatformApplicationAdapter(broker, *this); + } +#endif + + }; + + // this application actually works in Qt and WASM + class RtViewerDemoBaseSingleCanvasWithButtonsApplication : public RtViewerDemoBaseApplication + { +public: + virtual void OnPushButton1Clicked() {} + virtual void OnPushButton2Clicked() {} + virtual void OnTool1Clicked() {} + virtual void OnTool2Clicked() {} + + virtual void GetButtonNames(std::string& pushButton1, + std::string& pushButton2, + std::string& tool1, + std::string& tool2 + ) { + pushButton1 = "action1"; + pushButton2 = "action2"; + tool1 = "tool1"; + tool2 = "tool2"; + } + +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow() { + return new SampleMainWindowWithButtons(dynamic_cast(*context_), *this); + } +#endif + + }; + + // this application actually works in SDL and WASM + class RtViewerDemoBaseApplicationSingleCanvas : public RtViewerDemoBaseApplication + { +public: + +#if ORTHANC_ENABLE_QT==1 + virtual QStoneMainWindow* CreateQtMainWindow() { + return new SampleMainWindow(dynamic_cast(*context_), *this); + } +#endif + }; + } +} + + + +namespace OrthancStone +{ + namespace Samples + { + template + void ReadDistributionInternal(std::vector& distribution, + const Orthanc::ImageAccessor& image) + { + const unsigned int width = image.GetWidth(); + const unsigned int height = image.GetHeight(); + + distribution.resize(width * height); + size_t pos = 0; + + for (unsigned int y = 0; y < height; y++) + { + for (unsigned int x = 0; x < width; x++, pos++) + { + distribution[pos] = Orthanc::ImageTraits::GetFloatPixel(image, x, y); + } + } + } + + void ReadDistribution(std::vector& distribution, + const Orthanc::ImageAccessor& image) + { + switch (image.GetFormat()) + { + case Orthanc::PixelFormat_Grayscale8: + ReadDistributionInternal(distribution, image); + break; + + case Orthanc::PixelFormat_Grayscale16: + ReadDistributionInternal(distribution, image); + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + ReadDistributionInternal(distribution, image); + break; + + case Orthanc::PixelFormat_Grayscale32: + ReadDistributionInternal(distribution, image); + break; + + case Orthanc::PixelFormat_Grayscale64: + ReadDistributionInternal(distribution, image); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + class DoseInteractor : public VolumeImageInteractor + { + private: + SliceViewerWidget& widget_; + size_t layer_; + DicomFrameConverter converter_; + + + + protected: + virtual void NotifySliceChange(const ISlicedVolume& slicedVolume, + const size_t& sliceIndex, + const Slice& slice) + { + converter_ = slice.GetConverter(); + + #if 0 + const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); + + RenderStyle s = widget_.GetLayerStyle(layer_); + + if (volume.FitWindowingToRange(s, slice.GetConverter())) + { + printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); + widget_.SetLayerStyle(layer_, s); + } + #endif + } + + virtual void NotifyVolumeReady(const ISlicedVolume& slicedVolume) + { + const float percentile = 0.01f; + const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); + + std::vector distribution; + ReadDistribution(distribution, volume.GetImage().GetInternalImage()); + std::sort(distribution.begin(), distribution.end()); + + int start = static_cast(std::ceil(distribution.size() * percentile)); + int end = static_cast(std::floor(distribution.size() * (1.0f - percentile))); + + float a = 0; + float b = 0; + + if (start < end && + start >= 0 && + end < static_cast(distribution.size())) + { + a = distribution[start]; + b = distribution[end]; + } + else if (!distribution.empty()) + { + // Too small distribution: Use full range + a = distribution.front(); + b = distribution.back(); + } + + //printf("%f %f\n", a, b); + + RenderStyle s = widget_.GetLayerStyle(layer_); + s.windowing_ = ImageWindowing_Custom; + s.customWindowCenter_ = static_cast(converter_.Apply((a + b) / 2.0f)); + s.customWindowWidth_ = static_cast(converter_.Apply(b - a)); + + // 96.210556 => 192.421112 + widget_.SetLayerStyle(layer_, s); + printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); + } + + public: + DoseInteractor(MessageBroker& broker, OrthancVolumeImage& volume, + SliceViewerWidget& widget, + VolumeProjection projection, + size_t layer) : + VolumeImageInteractor(broker, volume, widget, projection), + widget_(widget), + layer_(layer) + { + } + }; + + class RtViewerDemoApplication : + public RtViewerDemoBaseApplicationSingleCanvas, + public IObserver + { + public: + std::vector > doseCtWidgetLayerPairs_; + std::list interactors_; + + class Interactor : public IWorldSceneInteractor + { + private: + RtViewerDemoApplication& application_; + + public: + Interactor(RtViewerDemoApplication& application) : + application_(application) + { + } + + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const ViewportGeometry& view, + MouseButton button, + KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + IStatusBar* statusBar, + const std::vector& displayTouches) + { + return NULL; + } + + virtual void MouseOver(CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) + { + if (statusBar != NULL) + { + Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); + + char buf[64]; + sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", + p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); + statusBar->SetMessage(buf); + } + } + + virtual void MouseWheel(WorldSceneWidget& widget, + MouseWheelDirection direction, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); + + switch (direction) + { + case MouseWheelDirection_Up: + application_.OffsetSlice(-scale); + break; + + case MouseWheelDirection_Down: + application_.OffsetSlice(scale); + break; + + default: + break; + } + } + + virtual void KeyPressed(WorldSceneWidget& widget, + KeyboardKeys key, + char keyChar, + KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + switch (keyChar) + { + case 's': + // TODO: recursively traverse children + widget.FitContent(); + break; + + default: + break; + } + } + }; + + void OffsetSlice(int offset) + { + if (source_ != NULL) + { + int slice = static_cast(slice_) + offset; + + if (slice < 0) + { + slice = 0; + } + + if (slice >= static_cast(source_->GetSliceCount())) + { + slice = static_cast(source_->GetSliceCount()) - 1; + } + + if (slice != static_cast(slice_)) + { + SetSlice(slice); + } + } + } + + + SliceViewerWidget& GetMainWidget() + { + return *dynamic_cast(mainWidget_); + } + + + void SetSlice(size_t index) + { + if (source_ != NULL && + index < source_->GetSliceCount()) + { + slice_ = static_cast(index); + +#if 1 + GetMainWidget().SetSlice(source_->GetSlice(slice_).GetGeometry()); +#else + // TEST for scene extents - Rotate the axes + double a = 15.0 / 180.0 * boost::math::constants::pi(); + +#if 1 + Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); + Vector y; GeometryToolbox::AssignVector(y, -sin(a), cos(a), 0); +#else + // Flip the normal + Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); + Vector y; GeometryToolbox::AssignVector(y, sin(a), -cos(a), 0); +#endif + + SliceGeometry s(source_->GetSlice(slice_).GetGeometry().GetOrigin(), x, y); + widget_->SetSlice(s); +#endif + } + } + + + void OnMainWidgetGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) + { + // Once the geometry of the series is downloaded from Orthanc, + // display its middle slice, and adapt the viewport to fit this + // slice + if (source_ == &message.GetOrigin()) + { + SetSlice(source_->GetSliceCount() / 2); + } + + GetMainWidget().FitContent(); + } + + DicomFrameConverter converter_; + + void OnSliceContentChangedMessage(const ISlicedVolume::SliceContentChangedMessage& message) + { + converter_ = message.GetSlice().GetConverter(); + } + + void OnVolumeReadyMessage(const ISlicedVolume::VolumeReadyMessage& message) + { + const float percentile = 0.01f; + + auto& slicedVolume = message.GetOrigin(); + const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); + + std::vector distribution; + ReadDistribution(distribution, volume.GetImage().GetInternalImage()); + std::sort(distribution.begin(), distribution.end()); + + int start = static_cast(std::ceil(distribution.size() * percentile)); + int end = static_cast(std::floor(distribution.size() * (1.0f - percentile))); + + float a = 0; + float b = 0; + + if (start < end && + start >= 0 && + end < static_cast(distribution.size())) + { + a = distribution[start]; + b = distribution[end]; + } + else if (!distribution.empty()) + { + // Too small distribution: Use full range + a = distribution.front(); + b = distribution.back(); + } + + //printf("WINDOWING %f %f\n", a, b); + + for (const auto& pair : doseCtWidgetLayerPairs_) + { + auto widget = pair.first; + auto layer = pair.second; + RenderStyle s = widget->GetLayerStyle(layer); + s.windowing_ = ImageWindowing_Custom; + s.customWindowCenter_ = static_cast(converter_.Apply((a + b) / 2.0f)); + s.customWindowWidth_ = static_cast(converter_.Apply(b - a)); + + // 96.210556 => 192.421112 + widget->SetLayerStyle(layer, s); + printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); + } + } + + + + size_t AddDoseLayer(SliceViewerWidget& widget, + OrthancVolumeImage& volume, VolumeProjection projection); + + void AddStructLayer( + SliceViewerWidget& widget, StructureSetLoader& loader); + + SliceViewerWidget* CreateDoseCtWidget( + std::unique_ptr& ct, + std::unique_ptr& dose, + std::unique_ptr& structLoader, + VolumeProjection projection); + + void AddCtLayer(SliceViewerWidget& widget, OrthancVolumeImage& volume); + + std::unique_ptr mainWidgetInteractor_; + const DicomSeriesVolumeSlicer* source_; + unsigned int slice_; + + std::string ctSeries_; + std::string doseInstance_; + std::string doseSeries_; + std::string structInstance_; + std::unique_ptr dose_; + std::unique_ptr ct_; + std::unique_ptr struct_; + + public: + RtViewerDemoApplication(MessageBroker& broker) : + IObserver(broker), + source_(NULL), + slice_(0) + { + } + + /* + dev options on bgo xps15 + + COMMAND LINE + --ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 + + URL PARAMETERS + ?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 + + */ + + void ParseParameters(const boost::program_options::variables_map& parameters) + { + // Generic + { + if (parameters.count("verbose")) + { + Orthanc::Logging::EnableInfoLevel(true); + LOG(INFO) << "Verbose logs (info) are enabled"; + } + } + + { + if (parameters.count("trace")) + { + LOG(INFO) << "parameters.count(\"trace\") != 0"; + Orthanc::Logging::EnableTraceLevel(true); + VLOG(1) << "Trace logs (debug) are enabled"; + } + } + + // CT series + { + + if (parameters.count("ct-series") != 1) + { + LOG(ERROR) << "There must be exactly one CT series specified"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + ctSeries_ = parameters["ct-series"].as(); + } + + // RTDOSE + { + if (parameters.count("dose-instance") == 1) + { + doseInstance_ = parameters["dose-instance"].as(); + } + else + { +#ifdef BGO_NOT_IMPLEMENTED_YET + // Dose series + if (parameters.count("dose-series") != 1) + { + LOG(ERROR) << "the RTDOSE series is missing"; + throw Orthanc::OrthancException( + Orthanc::ErrorCode_ParameterOutOfRange); + } + doseSeries_ = parameters["ct"].as(); +#endif + LOG(ERROR) << "the RTSTRUCT instance is missing"; + throw Orthanc::OrthancException( + Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + // RTSTRUCT + { + if (parameters.count("struct-instance") == 1) + { + structInstance_ = parameters["struct-instance"].as(); + } + else + { +#ifdef BGO_NOT_IMPLEMENTED_YET + // Struct series + if (parameters.count("struct-series") != 1) + { + LOG(ERROR) << "the RTSTRUCT series is missing"; + throw Orthanc::OrthancException( + Orthanc::ErrorCode_ParameterOutOfRange); + } + structSeries_ = parameters["struct-series"].as(); +#endif + LOG(ERROR) << "the RTSTRUCT instance is missing"; + throw Orthanc::OrthancException( + Orthanc::ErrorCode_ParameterOutOfRange); + } + } + } + + virtual void DeclareStartupOptions( + boost::program_options::options_description& options) + { + boost::program_options::options_description generic( + "RtViewerDemo options. Please note that some of these options " + "are mutually exclusive"); + generic.add_options() + ("ct-series", boost::program_options::value(), + "Orthanc ID of the CT series") + ("dose-instance", boost::program_options::value(), + "Orthanc ID of the RTDOSE instance (incompatible with dose-series)") + ("dose-series", boost::program_options::value(), + "NOT IMPLEMENTED YET. Orthanc ID of the RTDOSE series (incompatible" + " with dose-instance)") + ("struct-instance", boost::program_options::value(), + "Orthanc ID of the RTSTRUCT instance (incompatible with struct-" + "series)") + ("struct-series", boost::program_options::value(), + "NOT IMPLEMENTED YET. Orthanc ID of the RTSTRUCT (incompatible with" + " struct-instance)") + ("smooth", boost::program_options::value()->default_value(true), + "Enable bilinear image smoothing") + ; + + options.add(generic); + } + + virtual void Initialize( + StoneApplicationContext* context, + IStatusBar& statusBar, + const boost::program_options::variables_map& parameters) + { + using namespace OrthancStone; + + ParseParameters(parameters); + + context_ = context; + + statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); + + if (!ctSeries_.empty()) + { + printf("CT = [%s]\n", ctSeries_.c_str()); + + ct_.reset(new OrthancStone::OrthancVolumeImage( + IObserver::GetBroker(), context->GetOrthancApiClient(), false)); + ct_->ScheduleLoadSeries(ctSeries_); + //ct_->ScheduleLoadSeries( + // "a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); + //ct_->ScheduleLoadSeries( + // "03677739-1d8bca40-db1daf59-d74ff548-7f6fc9c0"); + } + + if (!doseSeries_.empty() || + !doseInstance_.empty()) + { + dose_.reset(new OrthancStone::OrthancVolumeImage( + IObserver::GetBroker(), context->GetOrthancApiClient(), true)); + + + dose_->RegisterObserverCallback( + new Callable + (*this, &RtViewerDemoApplication::OnVolumeReadyMessage)); + + dose_->RegisterObserverCallback( + new Callable + (*this, &RtViewerDemoApplication::OnSliceContentChangedMessage)); + + if (doseInstance_.empty()) + { + dose_->ScheduleLoadSeries(doseSeries_); + } + else + { + dose_->ScheduleLoadInstance(doseInstance_); + } + + //dose_->ScheduleLoadInstance( + //"830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // 1 + //dose_->ScheduleLoadInstance( + //"269f26f4-0c83eeeb-2e67abbd-5467a40f-f1bec90c"); //0522c0001 TCIA + } + + if (!structInstance_.empty()) + { + struct_.reset(new OrthancStone::StructureSetLoader( + IObserver::GetBroker(), context->GetOrthancApiClient())); + + struct_->ScheduleLoadInstance(structInstance_); + + //struct_->ScheduleLoadInstance( + //"54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); + //struct_->ScheduleLoadInstance( + //"17cd032b-ad92a438-ca05f06a-f9e96668-7e3e9e20"); // 0522c0001 TCIA + } + + mainWidget_ = new LayoutWidget("main-layout"); + mainWidget_->SetBackgroundColor(0, 0, 0); + mainWidget_->SetBackgroundCleared(true); + mainWidget_->SetPadding(0); + + auto axialWidget = CreateDoseCtWidget + (ct_, dose_, struct_, OrthancStone::VolumeProjection_Axial); + mainWidget_->AddWidget(axialWidget); + + std::unique_ptr subLayout( + new OrthancStone::LayoutWidget("main-layout")); + subLayout->SetVertical(); + subLayout->SetPadding(5); + + auto coronalWidget = CreateDoseCtWidget + (ct_, dose_, struct_, OrthancStone::VolumeProjection_Coronal); + subLayout->AddWidget(coronalWidget); + + auto sagittalWidget = CreateDoseCtWidget + (ct_, dose_, struct_, OrthancStone::VolumeProjection_Sagittal); + subLayout->AddWidget(sagittalWidget); + + mainWidget_->AddWidget(subLayout.release()); + } + }; + + + size_t RtViewerDemoApplication::AddDoseLayer( + SliceViewerWidget& widget, + OrthancVolumeImage& volume, VolumeProjection projection) + { + size_t layer = widget.AddLayer( + new VolumeImageMPRSlicer(IObserver::GetBroker(), volume)); + + RenderStyle s; + //s.drawGrid_ = true; + s.SetColor(255, 0, 0); // Draw missing PET layer in red + s.alpha_ = 0.3f; + s.applyLut_ = true; + s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; + s.interpolation_ = ImageInterpolation_Bilinear; + widget.SetLayerStyle(layer, s); + + return layer; + } + + void RtViewerDemoApplication::AddStructLayer( + SliceViewerWidget& widget, StructureSetLoader& loader) + { + widget.AddLayer(new DicomStructureSetSlicer( + IObserver::GetBroker(), loader)); + } + + SliceViewerWidget* RtViewerDemoApplication::CreateDoseCtWidget( + std::unique_ptr& ct, + std::unique_ptr& dose, + std::unique_ptr& structLoader, + VolumeProjection projection) + { + std::unique_ptr widget( + new OrthancStone::SliceViewerWidget(IObserver::GetBroker(), + "ct-dose-widget")); + + if (ct.get() != NULL) + { + AddCtLayer(*widget, *ct); + } + + if (dose.get() != NULL) + { + size_t layer = AddDoseLayer(*widget, *dose, projection); + + // we need to store the dose rendering widget because we'll update them + // according to various asynchronous events + doseCtWidgetLayerPairs_.push_back(std::make_pair(widget.get(), layer)); +#if 0 + interactors_.push_back(new VolumeImageInteractor( + IObserver::GetBroker(), *dose, *widget, projection)); +#else + interactors_.push_back(new DoseInteractor( + IObserver::GetBroker(), *dose, *widget, projection, layer)); +#endif + } + else if (ct.get() != NULL) + { + interactors_.push_back( + new VolumeImageInteractor( + IObserver::GetBroker(), *ct, *widget, projection)); + } + + if (structLoader.get() != NULL) + { + AddStructLayer(*widget, *structLoader); + } + + return widget.release(); + } + + void RtViewerDemoApplication::AddCtLayer( + SliceViewerWidget& widget, + OrthancVolumeImage& volume) + { + size_t layer = widget.AddLayer( + new VolumeImageMPRSlicer(IObserver::GetBroker(), volume)); + + RenderStyle s; + //s.drawGrid_ = true; + s.alpha_ = 1; + s.windowing_ = ImageWindowing_Bone; + widget.SetLayerStyle(layer, s); + } + } +} + + + +#if ORTHANC_ENABLE_WASM==1 + +#include "Platforms/Wasm/WasmWebService.h" +#include "Platforms/Wasm/WasmViewport.h" + +#include + +//#include "SampleList.h" + + +OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) +{ + return new OrthancStone::Samples::RtViewerDemoApplication(broker); +} + +OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application) +{ + return dynamic_cast(application)->CreateWasmApplicationAdapter(broker); +} + +#else + +//#include "SampleList.h" +#if ORTHANC_ENABLE_SDL==1 +#include "Applications/Sdl/SdlStoneApplicationRunner.h" +#endif +#if ORTHANC_ENABLE_QT==1 +#include "Applications/Qt/SampleQtApplicationRunner.h" +#endif +#include "Framework/Messages/MessageBroker.h" + +int main(int argc, char* argv[]) +{ + OrthancStone::MessageBroker broker; + OrthancStone::Samples::RtViewerDemoApplication sampleStoneApplication(broker); + +#if ORTHANC_ENABLE_SDL==1 + OrthancStone::SdlStoneApplicationRunner sdlApplicationRunner(broker, sampleStoneApplication); + return sdlApplicationRunner.Execute(argc, argv); +#endif +#if ORTHANC_ENABLE_QT==1 + OrthancStone::Samples::SampleQtApplicationRunner qtAppRunner(broker, sampleStoneApplication); + return qtAppRunner.Execute(argc, argv); +#endif +} + + +#endif + + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/nginx.local.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/nginx.local.conf Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +# Local config to serve the WASM samples static files and reverse proxy Orthanc. +# Uses port 9977 instead of 80. + +# `events` section is mandatory +events { + worker_connections 1024; # Default: 1024 +} + +http { + + # prevent nginx sync issues on OSX + proxy_buffering off; + + server { + listen 9977 default_server; + client_max_body_size 4G; + + # location may have to be adjusted depending on your OS and nginx install + include /etc/nginx/mime.types; + # if not in your system mime.types, add this line to support WASM: + # types { + # application/wasm wasm; + # } + + # serve WASM static files + root build-web/; + location / { + } + + # reverse proxy orthanc + location /orthanc/ { + rewrite /orthanc(.*) $1 break; + proxy_pass http://127.0.0.1:8042; + proxy_set_header Host $http_host; + proxy_set_header my-auth-header good-token; + proxy_request_buffering off; + proxy_max_temp_file_size 0; + client_max_body_size 0; + } + + + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,25 @@ + + + + + + + + + + + + Simple Viewer + + + +
+

RTSTRUCT viewer demonstration

+
+
+ +
+ + + + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,5 @@ +import { InitializeWasmApplication } from '../../../Platforms/Wasm/wasm-application-runner'; + + +InitializeWasmApplication("RtViewerDemo", "/orthanc"); + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.tsconfig.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.tsconfig.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,8 @@ +{ + "extends" : "./tsconfig-samples", + "compilerOptions": { + }, + "include" : [ + "rt-viewer-demo.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/samples-styles.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/samples-styles.css Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,16 @@ +html, body { + width: 100%; + height: 100%; + margin: 0px; + border: 0; + overflow: hidden; /* Disable scrollbars */ + display: block; /* No floating content on sides */ + background-color: black; + color: white; + font-family: Arial, Helvetica, sans-serif; +} + +canvas { + left:0px; + top:0px; +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/start-serving-files.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/start-serving-files.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,9 @@ +#!/bin/bash + +sudo nginx -p $(pwd) -c nginx.local.conf + +echo "Please browse to :" + +echo "http://localhost:9977/rt-viewer-demo.html?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9" + +echo "(This requires you have uploaded the correct files to your local Orthanc instance)" diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/stop-serving-files.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/stop-serving-files.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,4 @@ +#!/bin/bash + +sudo nginx -s stop + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/tsconfig-samples.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/tsconfig-samples.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,11 @@ +{ + "extends" : "../../../Platforms/Wasm/tsconfig-stone.json", + "compilerOptions": { + "sourceMap": false, + "lib" : [ + "es2017", + "dom", + "dom.iterable" + ] + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/tsconfig-stone.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/tsconfig-stone.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,7 @@ +{ + "include" : [ + "../../Platforms/Wasm/stone-framework-loader.ts", + "../../Platforms/Wasm/wasm-application-runner.ts", + "../../Platforms/Wasm/wasm-viewport.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,94 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlCairoSurface.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#include +#include + +namespace OrthancStone +{ + SdlCairoSurface::SdlCairoSurface(SdlWindow& window) : + window_(window), + sdlSurface_(NULL) + { + } + + + SdlCairoSurface::~SdlCairoSurface() + { + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + } + + + void SdlCairoSurface::SetSize(unsigned int width, + unsigned int height) + { + if (cairoSurface_.get() == NULL || + cairoSurface_->GetWidth() != width || + cairoSurface_->GetHeight() != height) + { + cairoSurface_.reset(new CairoSurface(width, height, false /* no alpha */)); + + // TODO Big endian? + static const uint32_t rmask = 0x00ff0000; + static const uint32_t gmask = 0x0000ff00; + static const uint32_t bmask = 0x000000ff; + + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + + sdlSurface_ = SDL_CreateRGBSurfaceFrom(cairoSurface_->GetBuffer(), width, height, 32, + cairoSurface_->GetPitch(), rmask, gmask, bmask, 0); + if (!sdlSurface_) + { + LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + + + void SdlCairoSurface::Render(Deprecated::IViewport& viewport) + { + if (cairoSurface_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + Orthanc::ImageAccessor target; + cairoSurface_->GetWriteableAccessor(target); + + if (viewport.Render(target)) + { + window_.Render(sdlSurface_); + } + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include "../../Framework/Viewport/SdlWindow.h" +#include "../../Framework/Wrappers/CairoSurface.h" +#include "../../Framework/Deprecated/Viewport/IViewport.h" + +#include + +#include +#include + +namespace OrthancStone +{ + class SdlCairoSurface : public boost::noncopyable + { + private: + std::unique_ptr cairoSurface_; + SdlWindow& window_; + SDL_Surface* sdlSurface_; + + public: + SdlCairoSurface(SdlWindow& window); + + ~SdlCairoSurface(); + + void SetSize(unsigned int width, + unsigned int height); + + void Render(Deprecated::IViewport& viewport); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,282 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlEngine.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#include + +#include + +namespace OrthancStone +{ + void SdlEngine::SetSize(unsigned int width, + unsigned int height) + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context_); + locker.GetCentralViewport().SetSize(width, height); + surface_.SetSize(width, height); + } + + + void SdlEngine::RenderFrame() + { + if (viewportChanged_) + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context_); + surface_.Render(locker.GetCentralViewport()); + + viewportChanged_ = false; + } + } + + + KeyboardModifiers SdlEngine::GetKeyboardModifiers(const uint8_t* keyboardState, + const int scancodeCount) + { + int result = KeyboardModifiers_None; + + if (keyboardState != NULL) + { + if (SDL_SCANCODE_LSHIFT < scancodeCount && + keyboardState[SDL_SCANCODE_LSHIFT]) + { + result |= KeyboardModifiers_Shift; + } + + if (SDL_SCANCODE_RSHIFT < scancodeCount && + keyboardState[SDL_SCANCODE_RSHIFT]) + { + result |= KeyboardModifiers_Shift; + } + + if (SDL_SCANCODE_LCTRL < scancodeCount && + keyboardState[SDL_SCANCODE_LCTRL]) + { + result |= KeyboardModifiers_Control; + } + + if (SDL_SCANCODE_RCTRL < scancodeCount && + keyboardState[SDL_SCANCODE_RCTRL]) + { + result |= KeyboardModifiers_Control; + } + + if (SDL_SCANCODE_LALT < scancodeCount && + keyboardState[SDL_SCANCODE_LALT]) + { + result |= KeyboardModifiers_Alt; + } + + if (SDL_SCANCODE_RALT < scancodeCount && + keyboardState[SDL_SCANCODE_RALT]) + { + result |= KeyboardModifiers_Alt; + } + } + + return static_cast(result); + } + + + SdlEngine::SdlEngine(SdlWindow& window, + NativeStoneApplicationContext& context) : + window_(window), + context_(context), + surface_(window), + viewportChanged_(true) + { + } + + + void SdlEngine::Run() + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + SetSize(window_.GetWidth(), window_.GetHeight()); + + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context_); + locker.GetCentralViewport().FitContent(); + } + + bool stop = false; + while (!stop) + { + RenderFrame(); + + SDL_Event event; + + while (!stop && + SDL_PollEvent(&event)) + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context_); + + if (event.type == SDL_QUIT) + { + stop = true; + break; + } + else if (event.type == SDL_MOUSEBUTTONDOWN) + { + KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); + + switch (event.button.button) + { + case SDL_BUTTON_LEFT: + locker.GetCentralViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers, std::vector()); + break; + + case SDL_BUTTON_RIGHT: + locker.GetCentralViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers, std::vector()); + break; + + case SDL_BUTTON_MIDDLE: + locker.GetCentralViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers, std::vector()); + break; + + default: + break; + } + } + else if (event.type == SDL_MOUSEMOTION) + { + locker.GetCentralViewport().MouseMove(event.button.x, event.button.y, std::vector()); + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + locker.GetCentralViewport().MouseUp(); + } + else if (event.type == SDL_WINDOWEVENT) + { + switch (event.window.event) + { + case SDL_WINDOWEVENT_LEAVE: + locker.GetCentralViewport().MouseLeave(); + break; + + case SDL_WINDOWEVENT_ENTER: + locker.GetCentralViewport().MouseEnter(); + break; + + case SDL_WINDOWEVENT_SIZE_CHANGED: + SetSize(event.window.data1, event.window.data2); + break; + + default: + break; + } + } + else if (event.type == SDL_MOUSEWHEEL) + { + KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); + + int x, y; + SDL_GetMouseState(&x, &y); + + if (event.wheel.y > 0) + { + locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); + } + else if (event.wheel.y < 0) + { + locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); + } + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); + + switch (event.key.keysym.sym) + { + case SDLK_a: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'a', modifiers); break; + case SDLK_b: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'b', modifiers); break; + case SDLK_c: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'c', modifiers); break; + case SDLK_d: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'd', modifiers); break; + case SDLK_e: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'e', modifiers); break; + case SDLK_f: window_.ToggleMaximize(); break; + case SDLK_g: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'g', modifiers); break; + case SDLK_h: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'h', modifiers); break; + case SDLK_i: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'i', modifiers); break; + case SDLK_j: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'j', modifiers); break; + case SDLK_k: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'k', modifiers); break; + case SDLK_l: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'l', modifiers); break; + case SDLK_m: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'm', modifiers); break; + case SDLK_n: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'n', modifiers); break; + case SDLK_o: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'o', modifiers); break; + case SDLK_p: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'p', modifiers); break; + case SDLK_q: stop = true; break; + case SDLK_r: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'r', modifiers); break; + case SDLK_s: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 's', modifiers); break; + case SDLK_t: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 't', modifiers); break; + case SDLK_u: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'u', modifiers); break; + case SDLK_v: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'v', modifiers); break; + case SDLK_w: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'w', modifiers); break; + case SDLK_x: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'x', modifiers); break; + case SDLK_y: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'y', modifiers); break; + case SDLK_z: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'z', modifiers); break; + case SDLK_KP_0: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '0', modifiers); break; + case SDLK_KP_1: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '1', modifiers); break; + case SDLK_KP_2: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '2', modifiers); break; + case SDLK_KP_3: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '3', modifiers); break; + case SDLK_KP_4: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '4', modifiers); break; + case SDLK_KP_5: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '5', modifiers); break; + case SDLK_KP_6: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '6', modifiers); break; + case SDLK_KP_7: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '7', modifiers); break; + case SDLK_KP_8: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '8', modifiers); break; + case SDLK_KP_9: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '9', modifiers); break; + + case SDLK_PLUS: + case SDLK_KP_PLUS: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '+', modifiers); break; + + case SDLK_MINUS: + case SDLK_KP_MINUS: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '-', modifiers); break; + + case SDLK_DELETE: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Delete, 0, modifiers); break; + case SDLK_BACKSPACE: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Backspace, 0, modifiers); break; + case SDLK_RIGHT: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Right, 0, modifiers); break; + case SDLK_LEFT: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Left, 0, modifiers); break; + case SDLK_UP: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Up, 0, modifiers); break; + case SDLK_DOWN: + locker.GetCentralViewport().KeyPressed(KeyboardKeys_Down, 0, modifiers); break; + default: + break; + } + } + } + + // Small delay to avoid using 100% of CPU + SDL_Delay(1); + } + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include "../../Framework/Messages/ObserverBase.h" +#include "../Generic/NativeStoneApplicationContext.h" +#include "SdlCairoSurface.h" + +namespace OrthancStone +{ + class SdlEngine : public ObserverBase + { + private: + SdlWindow& window_; + NativeStoneApplicationContext& context_; + SdlCairoSurface surface_; + bool viewportChanged_; + + void SetSize(unsigned int width, + unsigned int height); + + void RenderFrame(); + + static KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, + const int scancodeCount); + + public: + SdlEngine(SdlWindow& window, + NativeStoneApplicationContext& context); + + void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) + { + viewportChanged_ = true; + } + + void Run(); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,108 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlOrthancSurface.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#include +#include +#include + +#include + +namespace OrthancStone +{ + SdlOrthancSurface::SdlOrthancSurface(SdlWindow& window) : + window_(window), + sdlSurface_(NULL) + { + } + + + SdlOrthancSurface::~SdlOrthancSurface() + { + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + } + + + void SdlOrthancSurface::SetSize(unsigned int width, + unsigned int height) + { + if (image_.get() == NULL || + image_->GetWidth() != width || + image_->GetHeight() != height) + { + image_.reset(new Orthanc::Image(Orthanc::PixelFormat_BGRA32, width, height, true)); // (*) + + if (image_->GetPitch() != image_->GetWidth() * 4) + { + // This should have been ensured by setting "forceMinimalPitch" to "true" (*) + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // TODO Big endian? + static const uint32_t rmask = 0x00ff0000; + static const uint32_t gmask = 0x0000ff00; + static const uint32_t bmask = 0x000000ff; + + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + + sdlSurface_ = SDL_CreateRGBSurfaceFrom(image_->GetBuffer(), width, height, 32, + image_->GetPitch(), rmask, gmask, bmask, 0); + if (!sdlSurface_) + { + LOG(ERROR) << "Cannot create a SDL surface from a Orthanc surface"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + + + Orthanc::ImageAccessor& SdlOrthancSurface::GetImage() + { + if (image_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return *image_; + } + + + void SdlOrthancSurface::Render() + { + if (image_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + window_.Render(sdlSurface_); + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include "../../Framework/Viewport/SdlWindow.h" + +#include +#include + +#include + +namespace OrthancStone +{ + class SdlOrthancSurface : public boost::noncopyable + { + private: + std::unique_ptr image_; + SdlWindow& window_; + SDL_Surface* sdlSurface_; + + public: + SdlOrthancSurface(SdlWindow& window); + + ~SdlOrthancSurface(); + + void SetSize(unsigned int width, + unsigned int height); + + Orthanc::ImageAccessor& GetImage(); + + void Render(); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,138 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#if ORTHANC_ENABLE_SDL != 1 +#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 1 +#endif + +#include "SdlStoneApplicationRunner.h" + +#include "../../Platforms/Generic/OracleWebService.h" +#include "SdlEngine.h" + +#include +#include +#include +#include +#include + +#include + +namespace OrthancStone +{ + void SdlStoneApplicationRunner::Initialize() + { + SdlWindow::GlobalInitialize(); + } + + + void SdlStoneApplicationRunner::DeclareCommandLineOptions(boost::program_options::options_description& options) + { + boost::program_options::options_description sdl("SDL options"); + sdl.add_options() + ("width", boost::program_options::value()->default_value(1024), "Initial width of the SDL window") + ("height", boost::program_options::value()->default_value(768), "Initial height of the SDL window") + ("opengl", boost::program_options::value()->default_value(true), "Enable OpenGL in SDL") + ; + + options.add(sdl); + } + + + void SdlStoneApplicationRunner::ParseCommandLineOptions(const boost::program_options::variables_map& parameters) + { + if (!parameters.count("width") || + !parameters.count("height") || + !parameters.count("opengl")) + { + LOG(ERROR) << "Parameter \"width\", \"height\" or \"opengl\" is missing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + int w = parameters["width"].as(); + int h = parameters["height"].as(); + if (w <= 0 || h <= 0) + { + LOG(ERROR) << "Parameters \"width\" and \"height\" must be positive"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + width_ = static_cast(w); + height_ = static_cast(h); + LOG(WARNING) << "Initial display size: " << width_ << "x" << height_; + + enableOpenGl_ = parameters["opengl"].as(); + if (enableOpenGl_) + { + LOG(WARNING) << "OpenGL is enabled, disable it with option \"--opengl=off\" if the application crashes"; + } + else + { + LOG(WARNING) << "OpenGL is disabled, enable it with option \"--opengl=on\" for best performance"; + } + } + + + void SdlStoneApplicationRunner::Run(NativeStoneApplicationContext& context, + const std::string& title, + int argc, + char* argv[]) + { + /************************************************************** + * Run the application inside a SDL window + **************************************************************/ + + LOG(WARNING) << "Starting the application"; + + SdlWindow window(title.c_str(), width_, height_, enableOpenGl_); + boost::shared_ptr sdl(new SdlEngine(window, context)); + + { + NativeStoneApplicationContext::GlobalMutexLocker locker(context); + + sdl->Register + (locker.GetCentralViewport(), &SdlEngine::OnViewportChanged); + + //context.GetCentralViewport().Register(sdl); // (*) + } + + context.Start(); + sdl->Run(); + + LOG(WARNING) << "Stopping the application"; + + // Don't move the "Stop()" command below out of the block, + // otherwise the application might crash, because the + // "SdlEngine" is an observer of the viewport (*) and the + // update thread started by "context.Start()" would call a + // destructed object (the "SdlEngine" is deleted with the + // lexical scope). + + // TODO Is this still true with message broker? + context.Stop(); + } + + + void SdlStoneApplicationRunner::Finalize() + { + SdlWindow::GlobalFinalize(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Generic/NativeStoneApplicationRunner.h" + +#if ORTHANC_ENABLE_SDL != 1 +#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 1 +#endif + +#include // Necessary to avoid undefined reference to `SDL_main' + +namespace OrthancStone +{ + class SdlStoneApplicationRunner : public NativeStoneApplicationRunner + { + private: + unsigned int width_; + unsigned int height_; + bool enableOpenGl_; + + public: + SdlStoneApplicationRunner(boost::shared_ptr application) : + NativeStoneApplicationRunner(application) + { + } + + virtual void Initialize(); + + virtual void DeclareCommandLineOptions(boost::program_options::options_description& options); + + virtual void Run(NativeStoneApplicationContext& context, + const std::string& title, + int argc, + char* argv[]); + + virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters); + + virtual void Finalize(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,86 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "StoneApplicationContext.h" + +#include + +namespace OrthancStone +{ + void StoneApplicationContext::InitializeOrthanc() + { + if (webService_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + orthanc_.reset(new Deprecated::OrthancApiClient(*webService_, orthancBaseUrl_)); + } + + + boost::shared_ptr StoneApplicationContext::GetWebService() + { + if (webService_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return webService_; + } + + + boost::shared_ptr StoneApplicationContext::GetOrthancApiClient() + { + if (orthanc_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return orthanc_; + } + + + void StoneApplicationContext::SetWebService(boost::shared_ptr webService) + { + webService_ = webService; + InitializeOrthanc(); + } + + + void StoneApplicationContext::SetOrthancBaseUrl(const std::string& baseUrl) + { + // Make sure the base url ends with "/" + if (baseUrl.empty() || + baseUrl[baseUrl.size() - 1] != '/') + { + orthancBaseUrl_ = baseUrl + "/"; + } + else + { + orthancBaseUrl_ = baseUrl; + } + + if (webService_ != NULL) + { + InitializeOrthanc(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,97 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Framework/Deprecated/Toolbox/IWebService.h" +#include "../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" +#include "../Framework/Deprecated/Toolbox/OrthancApiClient.h" +#include "../Framework/Deprecated/Viewport/WidgetViewport.h" + + +#ifdef _MSC_VER + #if _MSC_VER > 1910 + #define orthanc_override override + #else + #define orthanc_override + #endif +#elif defined __GNUC__ + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +/* Test for GCC > 3.2.0 */ + #if GCC_VERSION > 40900 + #define orthanc_override override + #else + #define orthanc_override + #endif +#else + #define orthanc_override +#endif + +#include + +namespace OrthancStone +{ + // a StoneApplicationContext contains the services that a StoneApplication + // uses and that depends on the environment in which the Application executes. + // I.e, the StoneApplicationContext provides a WebService interface such that + // the StoneApplication can perform HTTP requests. In a WASM environment, + // the WebService is provided by the browser while, in a native environment, + // the WebService is provided by the OracleWebService (a C++ Http client) + + class StoneApplicationContext : public boost::noncopyable + { + private: + boost::shared_ptr webService_; + Deprecated::IDelayedCallExecutor* delayedCallExecutor_; // TODO => shared_ptr ?? + boost::shared_ptr orthanc_; + std::string orthancBaseUrl_; + + void InitializeOrthanc(); + + public: + StoneApplicationContext() : + delayedCallExecutor_(NULL) + { + } + + virtual ~StoneApplicationContext() + { + } + + boost::shared_ptr GetWebService(); + + boost::shared_ptr GetOrthancApiClient(); + + void SetWebService(boost::shared_ptr webService); + + void SetOrthancBaseUrl(const std::string& baseUrl); + + void SetDelayedCallExecutor(Deprecated::IDelayedCallExecutor& delayedCallExecutor) + { + delayedCallExecutor_ = &delayedCallExecutor; + } + + Deprecated::IDelayedCallExecutor& GetDelayedCallExecutor() + { + return *delayedCallExecutor_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,92 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "StartupParametersBuilder.h" +#include +#include +#include "emscripten/html5.h" + +namespace OrthancStone +{ + void StartupParametersBuilder::Clear() + { + startupParameters_.clear(); + } + + void StartupParametersBuilder::SetStartupParameter( + const char* name, + const char* value) + { + startupParameters_.push_back(std::make_tuple(name, value)); + } + + void StartupParametersBuilder::GetStartupParameters( + boost::program_options::variables_map& parameters, + const boost::program_options::options_description& options) + { + std::vector argvStrings(startupParameters_.size() + 1); + // argv mirrors pointers to the internal argvStrings buffers. + // ****************************************************** + // THIS IS HIGHLY DANGEROUS SO BEWARE!!!!!!!!!!!!!! + // ****************************************************** + std::vector argv(startupParameters_.size() + 1); + + int argCounter = 0; + argvStrings[argCounter] = "dummy.exe"; + argv[argCounter] = argvStrings[argCounter].c_str(); + + argCounter++; + + std::string cmdLine = ""; + for ( StartupParameters::const_iterator it = startupParameters_.begin(); + it != startupParameters_.end(); + it++) + { + std::stringstream argSs; + + argSs << "--" << std::get<0>(*it); + if(std::get<1>(*it).length() > 0) + argSs << "=" << std::get<1>(*it); + + argvStrings[argCounter] = argSs.str(); + cmdLine = cmdLine + " " + argvStrings[argCounter]; + std::cout << cmdLine << std::endl; + argv[argCounter] = argvStrings[argCounter].c_str(); + argCounter++; + } + + + std::cout << "simulated cmdLine = \"" << cmdLine.c_str() << "\"\n"; + + try + { + boost::program_options::store( + boost::program_options::command_line_parser(argCounter, argv.data()). + options(options).allow_unregistered().run(), parameters); + boost::program_options::notify(parameters); + } + catch (boost::program_options::error& e) + { + std::cerr << "Error while parsing the command-line arguments: " << + e.what() << std::endl; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +#if ORTHANC_ENABLE_SDL == 1 +#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 0 +#endif + +namespace OrthancStone +{ + // This class is used to generate boost program options from a dico. + // In a Wasm context, startup options are passed as URI arguments that + // are then passed to this class as a dico. + // This class regenerates a fake command-line and parses it to produce + // the same output as if the app was started at command-line. + class StartupParametersBuilder + { + typedef std::list> StartupParameters; + StartupParameters startupParameters_; + + public: + + void Clear(); + // Please note that if a parameter is a flag-style one, the value that + // is passed should be an empty string + void SetStartupParameter(const char* name, const char* value); + void GetStartupParameters( + boost::program_options::variables_map& parameters_, + const boost::program_options::options_description& options); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DelayedCallCommand.h" +#include "boost/thread/thread.hpp" + +#include + +namespace Deprecated +{ + DelayedCallCommand::DelayedCallCommand(MessageHandler* callback, // takes ownership + unsigned int timeoutInMs, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context + ) : + callback_(callback), + payload_(payload), + context_(context), + expirationTimePoint_(boost::posix_time::microsec_clock::local_time() + boost::posix_time::milliseconds(timeoutInMs)), + timeoutInMs_(timeoutInMs) + { + } + + + void DelayedCallCommand::Execute() + { + while (boost::posix_time::microsec_clock::local_time() < expirationTimePoint_) + { + boost::this_thread::sleep(boost::posix_time::milliseconds(1)); + } + } + + void DelayedCallCommand::Commit() + { + // We want to make sure that, i.e, the UpdateThread is not + // triggered while we are updating the "model" with the result of + // an OracleCommand + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); + + if (callback_.get() != NULL) + { + IDelayedCallExecutor::TimeoutMessage message; // TODO: add payload + callback_->Apply(message); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOracleCommand.h" + +#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" +#include "../../Framework/Messages/IObservable.h" +#include "../../Framework/Messages/ICallable.h" +#include "../../Applications/Generic/NativeStoneApplicationContext.h" + +#include + +namespace Deprecated +{ + class DelayedCallCommand : public IOracleCommand, OrthancStone::IObservable + { + protected: + std::unique_ptr > callback_; + std::unique_ptr payload_; + OrthancStone::NativeStoneApplicationContext& context_; + boost::posix_time::ptime expirationTimePoint_; + unsigned int timeoutInMs_; + + public: + DelayedCallCommand(MessageHandler* callback, // takes ownership + unsigned int timeoutInMs, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context + ); + + virtual void Execute(); + + virtual void Commit(); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/IOracleCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/IOracleCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,42 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace Deprecated +{ + class IOracleCommand : public Orthanc::IDynamicObject + { + public: + virtual ~IOracleCommand() + { + } + + // This part of the command can be invoked simultaneously, and + // must not modify the Stone context + virtual void Execute() = 0; + + // This part of the command must be invoked in mutual exclusion + virtual void Commit() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,212 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Oracle.h" + +#include +#include +#include + +#include +#include +#include + +namespace Deprecated +{ + class Oracle::PImpl + { + private: + enum State + { + State_Init, + State_Started, + State_Stopped + }; + + boost::mutex oracleMutex_; + State state_; + std::vector threads_; + Orthanc::SharedMessageQueue queue_; + + static void Worker(PImpl* that) + { + for (;;) + { + State state; + + { + boost::mutex::scoped_lock lock(that->oracleMutex_); + state = that->state_; + } + + if (state == State_Stopped) + { + break; + } + + std::unique_ptr item(that->queue_.Dequeue(100)); + if (item.get() != NULL) + { + IOracleCommand& command = dynamic_cast(*item); + try + { + command.Execute(); + } + catch (Orthanc::OrthancException& /*ex*/) + { + // this is probably a curl error that has been triggered. We may just ignore it. + // The command.success_ will stay at false and this will be handled in the command.Commit + } + + // Random sleeping to test + //boost::this_thread::sleep(boost::posix_time::milliseconds(50 * (1 + rand() % 10))); + + command.Commit(); + } + } + } + + public: + PImpl(unsigned int threadCount) : + state_(State_Init), + threads_(threadCount) + { + } + + ~PImpl() + { + if (state_ == State_Started) + { + LOG(ERROR) << "You should have manually called Oracle::Stop()"; + Stop(); + } + } + + Orthanc::SharedMessageQueue& GetQueue() + { + return queue_; + } + + void Submit(IOracleCommand* command) + { + std::unique_ptr protection(command); + + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + boost::mutex::scoped_lock lock(oracleMutex_); + + switch (state_) + { + case State_Init: + case State_Started: + queue_.Enqueue(protection.release()); + break; + + case State_Stopped: + LOG(ERROR) << "Cannot schedule a request to the Oracle after having " + << "called Oracle::Stop()"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + } + + void Start() + { + boost::mutex::scoped_lock lock(oracleMutex_); + + if (state_ != State_Init) + { + LOG(ERROR) << "Oracle::PImpl::Start: (state_ != State_Init)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + for (size_t i = 0; i < threads_.size(); i++) + { + threads_[i] = new boost::thread(Worker, this); + } + + state_ = State_Started; + } + + void Stop() + { + { + boost::mutex::scoped_lock lock(oracleMutex_); + + if (state_ != State_Started) + { + LOG(ERROR) << "Oracle::PImpl::Stop(): (state_ != State_Started)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + state_ = State_Stopped; + } + + for (size_t i = 0; i < threads_.size(); i++) + { + if (threads_[i] != NULL) + { + if (threads_[i]->joinable()) + { + threads_[i]->join(); + } + + delete threads_[i]; + } + } + } + }; + + + Oracle::Oracle(unsigned int threadCount) : + pimpl_(new PImpl(threadCount)) + { + } + + void Oracle::Start() + { + pimpl_->Start(); + } + + + void Oracle::Submit(IOracleCommand* command) + { + pimpl_->Submit(command); + } + + + void Oracle::Stop() + { + pimpl_->Stop(); + } + + + void Oracle::WaitEmpty() + { + pimpl_->GetQueue().WaitEmpty(50); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,48 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOracleCommand.h" + +#include + +namespace Deprecated +{ + class Oracle : public boost::noncopyable + { + private: + class PImpl; + + boost::shared_ptr pimpl_; + + public: + Oracle(unsigned int threadCount); + + void Start(); + + void Submit(IOracleCommand* command); + + void WaitEmpty(); // For unit tests + + void Stop(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleDelayedCallExecutor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleDelayedCallExecutor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" +#include "Oracle.h" +#include "../../Applications/Generic/NativeStoneApplicationContext.h" +#include "DelayedCallCommand.h" + +namespace Deprecated +{ + // The OracleTimeout executes callbacks after a delay. + class OracleDelayedCallExecutor : public IDelayedCallExecutor + { + private: + Oracle& oracle_; + OrthancStone::NativeStoneApplicationContext& context_; + + public: + OracleDelayedCallExecutor(Oracle& oracle, + OrthancStone::NativeStoneApplicationContext& context) : + oracle_(oracle), + context_(context) + { + } + + virtual void Schedule(MessageHandler* callback, + unsigned int timeoutInMs = 1000) + { + oracle_.Submit(new DelayedCallCommand(callback, timeoutInMs, NULL, context_)); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OracleWebService.h" +#include "../../Framework/Deprecated/Toolbox/IWebService.h" + +namespace Deprecated +{ + + + class OracleWebService::WebServiceCachedGetCommand : public IOracleCommand, OrthancStone::IObservable + { + protected: + std::unique_ptr > successCallback_; + std::unique_ptr payload_; + boost::shared_ptr cachedMessage_; + OrthancStone::NativeStoneApplicationContext& context_; + + public: + WebServiceCachedGetCommand(MessageHandler* successCallback, // takes ownership + boost::shared_ptr cachedMessage, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context + ) : + successCallback_(successCallback), + payload_(payload), + cachedMessage_(cachedMessage), + context_(context) + { + } + + virtual void Execute() + { + // nothing to do, everything is in the commit + } + + virtual void Commit() + { + // We want to make sure that, i.e, the UpdateThread is not + // triggered while we are updating the "model" with the result of + // a WebServiceCommand + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); + + IWebService::HttpRequestSuccessMessage successMessage(cachedMessage_->GetUri(), + cachedMessage_->GetAnswer(), + cachedMessage_->GetAnswerSize(), + cachedMessage_->GetAnswerHttpHeaders(), + payload_.get()); + + successCallback_->Apply(successMessage); + } + }; + + void OracleWebService::NotifyHttpSuccessLater(boost::shared_ptr cachedMessage, + Orthanc::IDynamicObject* payload, // takes ownership + MessageHandler* successCallback) + { + oracle_.Submit(new WebServiceCachedGetCommand(successCallback, cachedMessage, payload, context_)); + } + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,92 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Toolbox/BaseWebService.h" +#include "Oracle.h" +#include "WebServiceGetCommand.h" +#include "WebServicePostCommand.h" +#include "WebServiceDeleteCommand.h" +#include "../../Applications/Generic/NativeStoneApplicationContext.h" + +namespace Deprecated +{ + // The OracleWebService performs HTTP requests in a native environment. + // It uses a thread pool to handle multiple HTTP requests in a same time. + // It works asynchronously to mimick the behaviour of the WebService running in a WASM environment. + class OracleWebService : public BaseWebService + { + private: + Oracle& oracle_; + OrthancStone::NativeStoneApplicationContext& context_; + Orthanc::WebServiceParameters parameters_; + + class WebServiceCachedGetCommand; + + public: + OracleWebService(Oracle& oracle, + const Orthanc::WebServiceParameters& parameters, + OrthancStone::NativeStoneApplicationContext& context) : + oracle_(oracle), + context_(context), + parameters_(parameters) + { + } + + virtual void PostAsync(const std::string& uri, + const HttpHeaders& headers, + const std::string& body, + Orthanc::IDynamicObject* payload, // takes ownership + MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback = NULL, // takes ownership + unsigned int timeoutInSeconds = 60) + { + oracle_.Submit(new WebServicePostCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, body, payload, context_)); + } + + virtual void DeleteAsync(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60) + { + oracle_.Submit(new WebServiceDeleteCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, payload, context_)); + } + + protected: + virtual void GetAsyncInternal(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload, // takes ownership + MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback = NULL,// takes ownership + unsigned int timeoutInSeconds = 60) + { + oracle_.Submit(new WebServiceGetCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, payload, context_)); + } + + virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, + Orthanc::IDynamicObject* payload, // takes ownership + MessageHandler* successCallback); + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebServiceCommandBase.h" + +#include + +namespace Deprecated +{ + WebServiceCommandBase::WebServiceCommandBase(MessageHandler* successCallback, + MessageHandler* failureCallback, + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context) : + successCallback_(successCallback), + failureCallback_(failureCallback), + parameters_(parameters), + url_(url), + headers_(headers), + payload_(payload), + success_(false), + httpStatus_(Orthanc::HttpStatus_None), + context_(context), + timeoutInSeconds_(timeoutInSeconds) + { + } + + + void WebServiceCommandBase::Commit() + { + // We want to make sure that, i.e, the UpdateThread is not + // triggered while we are updating the "model" with the result of + // a WebServiceCommand + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); + + if (success_ && successCallback_.get() != NULL) + { + IWebService::HttpRequestSuccessMessage message + (url_, answer_.c_str(), answer_.size(), answerHeaders_, payload_.get()); + successCallback_->Apply(message); + } + else if (!success_ && failureCallback_.get() != NULL) + { + IWebService::HttpRequestErrorMessage message(url_, httpStatus_, payload_.get()); + failureCallback_->Apply(message); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOracleCommand.h" + +#include "../../Framework/Deprecated/Toolbox/IWebService.h" +#include "../../Framework/Messages/IObservable.h" +#include "../../Framework/Messages/ICallable.h" +#include "../../Applications/Generic/NativeStoneApplicationContext.h" + +#include + +#include + +namespace Deprecated +{ + class WebServiceCommandBase : public IOracleCommand, OrthancStone::IObservable + { + protected: + std::unique_ptr > successCallback_; + std::unique_ptr > failureCallback_; + Orthanc::WebServiceParameters parameters_; + std::string url_; + IWebService::HttpHeaders headers_; + std::unique_ptr payload_; + bool success_; + Orthanc::HttpStatus httpStatus_; + std::string answer_; + IWebService::HttpHeaders answerHeaders_; + OrthancStone::NativeStoneApplicationContext& context_; + unsigned int timeoutInSeconds_; + + public: + WebServiceCommandBase(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context + ); + + virtual void Execute() = 0; + + virtual void Commit(); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebServiceDeleteCommand.h" + +#include + +namespace Deprecated +{ + WebServiceDeleteCommand::WebServiceDeleteCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const Deprecated::IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context) : + WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context) + { + } + + void WebServiceDeleteCommand::Execute() + { + Orthanc::HttpClient client(parameters_, "/"); + client.SetUrl(url_); + client.SetTimeout(timeoutInSeconds_); + client.SetMethod(Orthanc::HttpMethod_Delete); + + for (Deprecated::IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) + { + client.AddHeader(it->first, it->second); + } + + success_ = client.Apply(answer_, answerHeaders_); + httpStatus_ = client.GetLastStatus(); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,42 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebServiceCommandBase.h" + +namespace Deprecated +{ + class WebServiceDeleteCommand : public WebServiceCommandBase + { + public: + WebServiceDeleteCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context); + + virtual void Execute(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebServiceGetCommand.h" + +#include + +namespace Deprecated +{ + WebServiceGetCommand::WebServiceGetCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context) : + WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context) + { + } + + + void WebServiceGetCommand::Execute() + { + Orthanc::HttpClient client(parameters_, "/"); + client.SetUrl(url_); + client.SetTimeout(timeoutInSeconds_); + client.SetMethod(Orthanc::HttpMethod_Get); + + for (IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) + { + client.AddHeader(it->first, it->second); + } + + success_ = client.Apply(answer_, answerHeaders_); + httpStatus_ = client.GetLastStatus(); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebServiceCommandBase.h" + +namespace Deprecated +{ + class WebServiceGetCommand : public WebServiceCommandBase + { + public: + WebServiceGetCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context); + + virtual void Execute(); + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebServicePostCommand.h" + +#include + +namespace Deprecated +{ + WebServicePostCommand::WebServicePostCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const Deprecated::IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + const std::string& body, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context) : + WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context), + body_(body) + { + } + + void WebServicePostCommand::Execute() + { + Orthanc::HttpClient client(parameters_, "/"); + client.SetUrl(url_); + client.SetTimeout(timeoutInSeconds_); + client.SetMethod(Orthanc::HttpMethod_Post); + client.GetBody().swap(body_); + + for (Deprecated::IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) + { + client.AddHeader(it->first, it->second); + } + + success_ = client.Apply(answer_, answerHeaders_); + httpStatus_ = client.GetLastStatus(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebServiceCommandBase.h" + +namespace Deprecated +{ + class WebServicePostCommand : public WebServiceCommandBase + { + protected: + std::string body_; + + public: + WebServicePostCommand(MessageHandler* successCallback, // takes ownership + MessageHandler* failureCallback, // takes ownership + const Orthanc::WebServiceParameters& parameters, + const std::string& url, + const IWebService::HttpHeaders& headers, + unsigned int timeoutInSeconds, + const std::string& body, + Orthanc::IDynamicObject* payload /* takes ownership */, + OrthancStone::NativeStoneApplicationContext& context); + + virtual void Execute(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,437 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Defaults.h" + +#include "WasmWebService.h" +#include "WasmDelayedCallExecutor.h" +#include "../../../Framework/Deprecated/Widgets/TestCairoWidget.h" +#include "../../../Framework/Deprecated/Viewport/WidgetViewport.h" +#include +#include +#include +#include +#include + +#include + + +static unsigned int width_ = 0; +static unsigned int height_ = 0; + +/**********************************/ + +static std::unique_ptr application; +static std::unique_ptr applicationWasmAdapter = NULL; +static std::unique_ptr context; +static OrthancStone::StartupParametersBuilder startupParametersBuilder; +static OrthancStone::MessageBroker broker; + +static OrthancStone::ViewportContentChangedObserver viewportContentChangedObserver_(broker); +static OrthancStone::StatusBar statusBar_; + +static std::list> viewports_; + +std::shared_ptr FindViewportSharedPtr(ViewportHandle viewport) { + for (const auto& v : viewports_) { + if (v.get() == viewport) { + return v; + } + } + assert(false); + return std::shared_ptr(); +} + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 + // rewrite malloc/free in order to monitor allocations. We actually only monitor large allocations (like images ...) + + size_t bigChunksTotalSize = 0; + std::map allocatedBigChunks; + + extern void* emscripten_builtin_malloc(size_t bytes); + extern void emscripten_builtin_free(void* mem); + + void * __attribute__((noinline)) malloc(size_t size) + { + void *ptr = emscripten_builtin_malloc(size); + if (size > 100000) + { + bigChunksTotalSize += size; + printf("++ Allocated %zu bytes, got %p. (%zu MB consumed by big chunks)\n", size, ptr, bigChunksTotalSize/(1024*1024)); + allocatedBigChunks[ptr] = size; + } + return ptr; + } + + void __attribute__((noinline)) free(void *ptr) + { + emscripten_builtin_free(ptr); + + std::map::iterator it = allocatedBigChunks.find(ptr); + if (it != allocatedBigChunks.end()) + { + bigChunksTotalSize -= it->second; + printf("-- Freed %zu bytes at %p. (%zu MB consumed by big chunks)\n", it->second, ptr, bigChunksTotalSize/(1024*1024)); + allocatedBigChunks.erase(it); + } + } +#endif // 0 + + using namespace OrthancStone; + + // when WASM needs a C++ viewport + ViewportHandle EMSCRIPTEN_KEEPALIVE CreateCppViewport() { + + std::shared_ptr viewport(new Deprecated::WidgetViewport(broker)); + printf("viewport %x\n", (int)viewport.get()); + + viewports_.push_back(viewport); + + printf("There are now %lu viewports in C++\n", viewports_.size()); + + viewport->SetStatusBar(statusBar_); + + viewport->RegisterObserverCallback( + new Callable + (viewportContentChangedObserver_, &ViewportContentChangedObserver::OnViewportChanged)); + + return viewport.get(); + } + + // when WASM does not need a viewport anymore, it should release it + void EMSCRIPTEN_KEEPALIVE ReleaseCppViewport(ViewportHandle viewport) { + viewports_.remove_if([viewport](const std::shared_ptr& v) { return v.get() == viewport;}); + + printf("There are now %lu viewports in C++\n", viewports_.size()); + } + + void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle viewport) { + printf("Initializing Stone\n"); + OrthancStone::StoneInitialize(); + printf("CreateWasmApplication\n"); + + application.reset(CreateUserApplication(broker)); + applicationWasmAdapter.reset(CreateWasmApplicationAdapter(broker, application.get())); + Deprecated::WasmWebService::SetBroker(broker); + Deprecated::WasmDelayedCallExecutor::SetBroker(broker); + + startupParametersBuilder.Clear(); + } + + void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, + const char* value) { + startupParametersBuilder.SetStartupParameter(keyc, value); + } + + void EMSCRIPTEN_KEEPALIVE StartWasmApplication(const char* baseUri) { + + printf("StartWasmApplication\n"); + + Orthanc::Logging::SetErrorWarnInfoTraceLoggingFunctions( + stone_console_error, stone_console_warning, + stone_console_info, stone_console_trace); + + // recreate a command line from uri arguments and parse it + boost::program_options::variables_map parameters; + boost::program_options::options_description options; + application->DeclareStartupOptions(options); + startupParametersBuilder.GetStartupParameters(parameters, options); + + context.reset(new OrthancStone::StoneApplicationContext(broker)); + context->SetOrthancBaseUrl(baseUri); + printf("Base URL to Orthanc API: [%s]\n", baseUri); + context->SetWebService(Deprecated::WasmWebService::GetInstance()); + context->SetDelayedCallExecutor(Deprecated::WasmDelayedCallExecutor::GetInstance()); + application->Initialize(context.get(), statusBar_, parameters); + application->InitializeWasm(); + +// viewport->SetSize(width_, height_); + printf("StartWasmApplication - completed\n"); + } + + bool EMSCRIPTEN_KEEPALIVE WasmIsTraceLevelEnabled() + { + return Orthanc::Logging::IsTraceLevelEnabled(); + } + + bool EMSCRIPTEN_KEEPALIVE WasmIsInfoLevelEnabled() + { + return Orthanc::Logging::IsInfoLevelEnabled(); + } + + void EMSCRIPTEN_KEEPALIVE WasmDoAnimation() + { + for (auto viewport : viewports_) { + // TODO Only launch the JavaScript timer if "HasAnimation()" + if (viewport->HasAnimation()) + { + viewport->DoAnimation(); + } + + } + + } + + + void EMSCRIPTEN_KEEPALIVE ViewportSetSize(ViewportHandle viewport, unsigned int width, unsigned int height) + { + width_ = width; + height_ = height; + + viewport->SetSize(width, height); + } + + int EMSCRIPTEN_KEEPALIVE ViewportRender(ViewportHandle viewport, + unsigned int width, + unsigned int height, + uint8_t* data) + { + viewportContentChangedObserver_.Reset(); + + //printf("ViewportRender called %dx%d\n", width, height); + if (width == 0 || + height == 0) + { + return 1; + } + + Orthanc::ImageAccessor surface; + surface.AssignWritable(Orthanc::PixelFormat_BGRA32, width, height, 4 * width, data); + + viewport->Render(surface); + + // Convert from BGRA32 memory layout (only color mode supported by + // Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 (as + // expected by HTML5 canvas). This simply amounts to swapping the + // B and R channels. + uint8_t* p = data; + for (unsigned int y = 0; y < height; y++) { + for (unsigned int x = 0; x < width; x++) { + uint8_t tmp = p[0]; + p[0] = p[2]; + p[2] = tmp; + + p += 4; + } + } + + return 1; + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(ViewportHandle viewport, + unsigned int rawButton, + int x, + int y, + unsigned int rawModifiers) + { + OrthancStone::MouseButton button; + switch (rawButton) + { + case 0: + button = OrthancStone::MouseButton_Left; + break; + + case 1: + button = OrthancStone::MouseButton_Middle; + break; + + case 2: + button = OrthancStone::MouseButton_Right; + break; + + default: + return; // Unknown button + } + + viewport->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None, std::vector()); + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(ViewportHandle viewport, + int deltaY, + int x, + int y, + int isControl) + { + if (deltaY != 0) + { + OrthancStone::MouseWheelDirection direction = (deltaY < 0 ? + OrthancStone::MouseWheelDirection_Up : + OrthancStone::MouseWheelDirection_Down); + OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; + + if (isControl != 0) + { + modifiers = OrthancStone::KeyboardModifiers_Control; + } + + viewport->MouseWheel(direction, x, y, modifiers); + } + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(ViewportHandle viewport, + int x, + int y) + { + viewport->MouseMove(x, y, std::vector()); + } + + void GetTouchVector(std::vector& output, + int touchCount, + float x0, + float y0, + float x1, + float y1, + float x2, + float y2) + { + // TODO: it might be nice to try to pass all the x0,y0 coordinates as arrays but that's not so easy to pass array between JS and C++ + if (touchCount > 0) + { + output.push_back(Deprecated::Touch(x0, y0)); + } + if (touchCount > 1) + { + output.push_back(Deprecated::Touch(x1, y1)); + } + if (touchCount > 2) + { + output.push_back(Deprecated::Touch(x2, y2)); + } + + } + + void EMSCRIPTEN_KEEPALIVE ViewportTouchStart(ViewportHandle viewport, + int touchCount, + float x0, + float y0, + float x1, + float y1, + float x2, + float y2) + { + // printf("touch start with %d touches\n", touchCount); + + std::vector touches; + GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); + viewport->TouchStart(touches); + } + + void EMSCRIPTEN_KEEPALIVE ViewportTouchMove(ViewportHandle viewport, + int touchCount, + float x0, + float y0, + float x1, + float y1, + float x2, + float y2) + { + // printf("touch move with %d touches\n", touchCount); + + std::vector touches; + GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); + viewport->TouchMove(touches); + } + + void EMSCRIPTEN_KEEPALIVE ViewportTouchEnd(ViewportHandle viewport, + int touchCount, + float x0, + float y0, + float x1, + float y1, + float x2, + float y2) + { + // printf("touch end with %d touches remaining\n", touchCount); + + std::vector touches; + GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); + viewport->TouchEnd(touches); + } + + void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(ViewportHandle viewport, + int key, + const char* keyChar, + bool isShiftPressed, + bool isControlPressed, + bool isAltPressed) + + { + OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; + if (isShiftPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Shift); + } + if (isControlPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Control); + } + if (isAltPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Alt); + } + + char c = 0; + if (keyChar != NULL && key == OrthancStone::KeyboardKeys_Generic) { + c = keyChar[0]; + } + viewport->KeyPressed(static_cast(key), c, modifiers); + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseUp(ViewportHandle viewport) + { + viewport->MouseUp(); + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter(ViewportHandle viewport) + { + viewport->MouseEnter(); + } + + + void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave(ViewportHandle viewport) + { + viewport->MouseLeave(); + } + + const char* EMSCRIPTEN_KEEPALIVE SendSerializedMessageToStoneApplication(const char* message) + { + static std::string output; // we don't want the string to be deallocated when we return to JS code so we always use the same string (this is fine since JS is single-thread) + + //printf("SendSerializedMessageToStoneApplication\n"); + //printf("%s", message); + + if (applicationWasmAdapter.get() != NULL) { + applicationWasmAdapter->HandleSerializedMessageFromWeb(output, std::string(message)); + return output.c_str(); + } + printf("This Stone application does not have a Web Adapter, unable to send messages"); + return NULL; + } + +#ifdef __cplusplus +} +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" +#include "../../Framework/Deprecated/Widgets/LayoutWidget.h" +#include +#include + +typedef Deprecated::WidgetViewport* ViewportHandle; // the objects exchanged between JS and C++ + +#ifdef __cplusplus +extern "C" { +#endif + + // JS methods accessible from C++ + extern void ScheduleWebViewportRedrawFromCpp(ViewportHandle cppViewportHandle); + extern void UpdateStoneApplicationStatusFromCppWithString(const char* statusUpdateMessage); + extern void UpdateStoneApplicationStatusFromCppWithSerializedMessage(const char* statusUpdateMessage); + extern void stone_console_error(const char*); + extern void stone_console_warning(const char*); + extern void stone_console_info(const char*); + extern void stone_console_trace(const char*); + + // C++ methods accessible from JS + extern void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle cppViewportHandle); + extern void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, const char* value); + + +#ifdef __cplusplus +} +#endif + +// these methods must be implemented in the custom app "mainWasm.cpp" +extern OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker); +extern OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application); + +namespace OrthancStone { + + // default Observer to trigger Viewport redraw when something changes in the Viewport + class ViewportContentChangedObserver : public IObserver + { + private: + // Flag to avoid flooding JavaScript with redundant Redraw requests + bool isScheduled_; + + public: + ViewportContentChangedObserver(MessageBroker& broker) : + IObserver(broker), + isScheduled_(false) + { + } + + void Reset() + { + isScheduled_ = false; + } + + void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) + { + if (!isScheduled_) + { + ScheduleWebViewportRedrawFromCpp((ViewportHandle)&message.GetOrigin()); // loosing constness when transmitted to Web + isScheduled_ = true; + } + } + }; + + // default status bar to log messages on the console/stdout + class StatusBar : public Deprecated::IStatusBar + { + public: + virtual void ClearMessage() + { + } + + virtual void SetMessage(const std::string& message) + { + printf("%s\n", message.c_str()); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WasmDelayedCallExecutor.h" +#include "json/value.h" +#include "json/writer.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + + extern void WasmDelayedCallExecutor_Schedule(void* callable, + unsigned int timeoutInMs + /*void* payload*/); + + void EMSCRIPTEN_KEEPALIVE WasmDelayedCallExecutor_ExecuteCallback(void* callable + //void* payload + ) + { + if (callable == NULL) + { + throw; + } + else + { + reinterpret_cast*>(callable)-> + Apply(Deprecated::IDelayedCallExecutor::TimeoutMessage()); // uri, reinterpret_cast(payload))); + } + } + + +#ifdef __cplusplus +} +#endif + + + +namespace Deprecated +{ + OrthancStone::MessageBroker* WasmDelayedCallExecutor::broker_ = NULL; + + + void WasmDelayedCallExecutor::Schedule(OrthancStone::MessageHandler* callback, + unsigned int timeoutInMs) + { + WasmDelayedCallExecutor_Schedule(callback, timeoutInMs); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" +#include + +namespace Deprecated +{ + class WasmDelayedCallExecutor : public IDelayedCallExecutor + { + private: + static OrthancStone::MessageBroker* broker_; + + // Private constructor => Singleton design pattern + WasmDelayedCallExecutor(OrthancStone::MessageBroker& broker) : + IDelayedCallExecutor(broker) + { + } + + public: + static WasmDelayedCallExecutor& GetInstance() + { + if (broker_ == NULL) + { + printf("WasmDelayedCallExecutor::GetInstance(): broker not initialized\n"); + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + static WasmDelayedCallExecutor instance(*broker_); + return instance; + } + + static void SetBroker(OrthancStone::MessageBroker& broker) + { + broker_ = &broker; + } + + virtual void Schedule(OrthancStone::MessageHandler* callback, + unsigned int timeoutInMs = 1000); + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,7 @@ +mergeInto(LibraryManager.library, { + WasmDelayedCallExecutor_Schedule: function(callable, timeoutInMs/*, payload*/) { + setTimeout(function() { + window.WasmDelayedCallExecutor_ExecuteCallback(callable/*, payload*/); + }, timeoutInMs); + } +}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WasmPlatformApplicationAdapter.h" + +#include "Framework/StoneException.h" +#include +#include "Platforms/Wasm/Defaults.h" + +namespace OrthancStone +{ + WasmPlatformApplicationAdapter::WasmPlatformApplicationAdapter(MessageBroker& broker, IStoneApplication& application) + : IObserver(broker), + application_(application) + { + } + + void WasmPlatformApplicationAdapter::HandleSerializedMessageFromWeb(std::string& output, const std::string& input) + { + try + { + application_.HandleSerializedMessage(input.c_str()); + } + catch (StoneException& exc) + { + printf("Error while handling message from web (error code = %d):\n", exc.GetErrorCode()); + printf("While interpreting input: '%s'\n", input.c_str()); + output = std::string("ERROR : "); + } + catch (std::exception& exc) + { + printf("Error while handling message from web (error text = %s):\n", exc.what()); + printf("While interpreting input: '%s'\n", input.c_str()); + output = std::string("ERROR : "); + } + } + + void WasmPlatformApplicationAdapter::NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage) + { + try + { + UpdateStoneApplicationStatusFromCppWithString(statusUpdateMessage.c_str()); + } + catch (...) + { + printf("Error while handling string message to web\n"); + } + } + + void WasmPlatformApplicationAdapter::NotifyStatusUpdateFromCppToWebWithSerializedMessage(const std::string& statusUpdateMessage) + { + try + { + UpdateStoneApplicationStatusFromCppWithSerializedMessage(statusUpdateMessage.c_str()); + } + catch (...) + { + printf("Error while handling serialized message to web\n"); + } + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include "../../../Framework/Messages/IObserver.h" +#include + +namespace OrthancStone +{ + class WasmPlatformApplicationAdapter : public IObserver + { + IStoneApplication& application_; + public: + WasmPlatformApplicationAdapter(MessageBroker& broker, IStoneApplication& application); + + virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input); + virtual void NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage); + virtual void NotifyStatusUpdateFromCppToWebWithSerializedMessage(const std::string& statusUpdateMessage); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,34 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WasmViewport.h" + +#include +#include + +std::vector> wasmViewports; + +void AttachWidgetToWasmViewport(const char* htmlCanvasId, Deprecated::IWidget* centralWidget) { + std::shared_ptr viewport(CreateWasmViewportFromCpp(htmlCanvasId)); + viewport->SetCentralWidget(centralWidget); + + wasmViewports.push_back(viewport); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,39 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + // JS methods accessible from C++ + extern Deprecated::WidgetViewport* CreateWasmViewportFromCpp(const char* htmlCanvasId); + +#ifdef __cplusplus +} +#endif + +extern void AttachWidgetToWasmViewport(const char* htmlCanvasId, Deprecated::IWidget* centralWidget); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,189 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WasmWebService.h" +#include "json/value.h" +#include "json/writer.h" +#include +#include + +struct CachedSuccessNotification +{ + boost::shared_ptr cachedMessage; + std::unique_ptr payload; + OrthancStone::MessageHandler* successCallback; +}; + + +#ifdef __cplusplus +extern "C" { +#endif + + extern void WasmWebService_GetAsync(void* callableSuccess, + void* callableFailure, + const char* uri, + const char* headersInJsonString, + void* payload, + unsigned int timeoutInSeconds); + + extern void WasmWebService_ScheduleLaterCachedSuccessNotification(void* brol); + + extern void WasmWebService_PostAsync(void* callableSuccess, + void* callableFailure, + const char* uri, + const char* headersInJsonString, + const void* body, + size_t bodySize, + void* payload, + unsigned int timeoutInSeconds); + + extern void WasmWebService_DeleteAsync(void* callableSuccess, + void* callableFailure, + const char* uri, + const char* headersInJsonString, + void* payload, + unsigned int timeoutInSeconds); + + void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifyError(void* failureCallable, + const char* uri, + unsigned int httpStatus, + void* payload) + { + if (failureCallable != NULL) + { + reinterpret_cast*>(failureCallable)-> + Apply(Deprecated::IWebService::HttpRequestErrorMessage(uri, static_cast(httpStatus), reinterpret_cast(payload))); + } + } + + void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifyCachedSuccess(void* notification_) + { + // notification has been allocated in C++ and passed to JS. It must be deleted by this method + std::unique_ptr notification(reinterpret_cast(notification_)); + + notification->successCallback->Apply(Deprecated::IWebService::HttpRequestSuccessMessage( + notification->cachedMessage->GetUri(), + notification->cachedMessage->GetAnswer(), + notification->cachedMessage->GetAnswerSize(), + notification->cachedMessage->GetAnswerHttpHeaders(), + notification->payload.get() + )); + } + + void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifySuccess(void* successCallable, + const char* uri, + const void* body, + size_t bodySize, + const char* answerHeaders, + void* payload) + { + if (successCallable != NULL) + { + Deprecated::IWebService::HttpHeaders headers; + + // TODO - Parse "answerHeaders" + //printf("TODO: parse headers [%s]\n", answerHeaders); + + reinterpret_cast*>(successCallable)-> + Apply(Deprecated::IWebService::HttpRequestSuccessMessage(uri, body, bodySize, headers, + reinterpret_cast(payload))); + } + } + +#ifdef __cplusplus +} +#endif + + + +namespace Deprecated +{ + OrthancStone::MessageBroker* WasmWebService::broker_ = NULL; + + void ToJsonString(std::string& output, const IWebService::HttpHeaders& headers) + { + Json::Value jsonHeaders; + for (IWebService::HttpHeaders::const_iterator it = headers.begin(); it != headers.end(); it++ ) + { + jsonHeaders[it->first] = it->second; + } + + Json::StreamWriterBuilder builder; + std::unique_ptr writer(builder.newStreamWriter()); + std::ostringstream outputStr; + + writer->write(jsonHeaders, &outputStr); + output = outputStr.str(); + } + + void WasmWebService::PostAsync(const std::string& relativeUri, + const HttpHeaders& headers, + const std::string& body, + Orthanc::IDynamicObject* payload, + OrthancStone::MessageHandler* successCallable, + OrthancStone::MessageHandler* failureCallable, + unsigned int timeoutInSeconds) + { + std::string headersInJsonString; + ToJsonString(headersInJsonString, headers); + WasmWebService_PostAsync(successCallable, failureCallable, relativeUri.c_str(), headersInJsonString.c_str(), + body.c_str(), body.size(), payload, timeoutInSeconds); + } + + void WasmWebService::DeleteAsync(const std::string& relativeUri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload, + OrthancStone::MessageHandler* successCallable, + OrthancStone::MessageHandler* failureCallable, + unsigned int timeoutInSeconds) + { + std::string headersInJsonString; + ToJsonString(headersInJsonString, headers); + WasmWebService_DeleteAsync(successCallable, failureCallable, relativeUri.c_str(), headersInJsonString.c_str(), + payload, timeoutInSeconds); + } + + void WasmWebService::GetAsyncInternal(const std::string &relativeUri, + const HttpHeaders &headers, + Orthanc::IDynamicObject *payload, + OrthancStone::MessageHandler *successCallable, + OrthancStone::MessageHandler *failureCallable, + unsigned int timeoutInSeconds) + { + std::string headersInJsonString; + ToJsonString(headersInJsonString, headers); + WasmWebService_GetAsync(successCallable, failureCallable, relativeUri.c_str(), + headersInJsonString.c_str(), payload, timeoutInSeconds); + } + + void WasmWebService::NotifyHttpSuccessLater(boost::shared_ptr cachedMessage, + Orthanc::IDynamicObject* payload, // takes ownership + OrthancStone::MessageHandler* successCallback) + { + CachedSuccessNotification* notification = new CachedSuccessNotification(); // allocated on the heap, it will be passed to JS and deleted when coming back to C++ + notification->cachedMessage = cachedMessage; + notification->payload.reset(payload); + notification->successCallback = successCallback; + + WasmWebService_ScheduleLaterCachedSuccessNotification(notification); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,83 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Deprecated/Toolbox/BaseWebService.h" +#include + +namespace Deprecated +{ +class WasmWebService : public BaseWebService +{ +private: + static OrthancStone::MessageBroker *broker_; + + // Private constructor => Singleton design pattern + WasmWebService(OrthancStone::MessageBroker &broker) : BaseWebService(broker) + { + } + +public: + static WasmWebService &GetInstance() + { + if (broker_ == NULL) + { + printf("WasmWebService::GetInstance(): broker not initialized\n"); + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + static WasmWebService instance(*broker_); + return instance; + } + + static void SetBroker(OrthancStone::MessageBroker &broker) + { + broker_ = &broker; + } + + virtual void PostAsync(const std::string &uri, + const HttpHeaders &headers, + const std::string &body, + Orthanc::IDynamicObject *payload, + OrthancStone::MessageHandler *successCallable, + OrthancStone::MessageHandler *failureCallable = NULL, + unsigned int timeoutInSeconds = 60); + + virtual void DeleteAsync(const std::string &uri, + const HttpHeaders &headers, + Orthanc::IDynamicObject *payload, + OrthancStone::MessageHandler *successCallable, + OrthancStone::MessageHandler *failureCallable = NULL, + unsigned int timeoutInSeconds = 60); + +protected: + virtual void GetAsyncInternal(const std::string &uri, + const HttpHeaders &headers, + Orthanc::IDynamicObject *payload, + OrthancStone::MessageHandler *successCallable, + OrthancStone::MessageHandler *failureCallable = NULL, + unsigned int timeoutInSeconds = 60); + + virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, + Orthanc::IDynamicObject *payload, // takes ownership + OrthancStone::MessageHandler *successCallback); +}; +} // namespace Deprecated diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,108 @@ +mergeInto(LibraryManager.library, { + WasmWebService_GetAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) { + // Directly use XMLHttpRequest (no jQuery) to retrieve the raw binary data + // http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ + var xhr = new XMLHttpRequest(); + var url_ = UTF8ToString(url); + var headersInJsonString_ = UTF8ToString(headersInJsonString); + + xhr.open('GET', url_, true); + xhr.responseType = 'arraybuffer'; + xhr.timeout = timeoutInSeconds * 1000; + var headers = JSON.parse(headersInJsonString_); + for (var key in headers) { + xhr.setRequestHeader(key, headers[key]); + } + //console.log(xhr); + xhr.onreadystatechange = function() { + if (this.readyState == XMLHttpRequest.DONE) { + if (xhr.status === 200) { + var s = xhr.getAllResponseHeaders(); + var headers = _malloc(s.length + 1); + stringToUTF8(s, headers, s.length + 1); + + // TODO - Is "new Uint8Array()" necessary? This copies the + // answer to the WebAssembly stack, hence necessitating + // increasing the TOTAL_STACK parameter of Emscripten + window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), + this.response.byteLength, headers, payload); + } else { + window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); + } + } + } + + xhr.send(); + }, + + WasmWebService_ScheduleLaterCachedSuccessNotification: function (brol) { + setTimeout(function() { + window.WasmWebService_NotifyCachedSuccess(brol); + }, 0); + }, + + WasmWebService_PostAsync: function(callableSuccess, callableFailure, url, headersInJsonString, body, bodySize, payload, timeoutInSeconds) { + var xhr = new XMLHttpRequest(); + var url_ = UTF8ToString(url); + var headersInJsonString_ = UTF8ToString(headersInJsonString); + xhr.open('POST', url_, true); + xhr.timeout = timeoutInSeconds * 1000; + xhr.responseType = 'arraybuffer'; + xhr.setRequestHeader('Content-type', 'application/octet-stream'); + + var headers = JSON.parse(headersInJsonString_); + for (var key in headers) { + xhr.setRequestHeader(key, headers[key]); + } + + xhr.onreadystatechange = function() { + if (this.readyState == XMLHttpRequest.DONE) { + if (xhr.status === 200) { + var s = xhr.getAllResponseHeaders(); + var headers = _malloc(s.length + 1); + stringToUTF8(s, headers, s.length + 1); + + window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), + this.response.byteLength, headers, payload); + } else { + window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); + } + } + } + + xhr.send(new Uint8ClampedArray(HEAPU8.buffer, body, bodySize)); + }, + + WasmWebService_DeleteAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) { + var xhr = new XMLHttpRequest(); + var url_ = UTF8ToString(url); + var headersInJsonString_ = UTF8ToString(headersInJsonString); + xhr.open('DELETE', url_, true); + xhr.timeout = timeoutInSeconds * 1000; + xhr.responseType = 'arraybuffer'; + xhr.setRequestHeader('Content-type', 'application/octet-stream'); + + var headers = JSON.parse(headersInJsonString_); + for (var key in headers) { + xhr.setRequestHeader(key, headers[key]); + } + + xhr.onreadystatechange = function() { + if (this.readyState == XMLHttpRequest.DONE) { + if (xhr.status === 200) { + var s = xhr.getAllResponseHeaders(); + var headers = _malloc(s.length + 1); + stringToUTF8(s, headers, s.length + 1); + + window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), + this.response.byteLength, headers, payload); + } else { + window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); + } + } + } + + xhr.send(); + } + +}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/default-library.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/default-library.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +// this file contains the JS method you want to expose to C++ code + +mergeInto(LibraryManager.library, { + + ScheduleWebViewportRedrawFromCpp: function(cppViewportHandle) { + window.ScheduleWebViewportRedraw(cppViewportHandle); + }, + + CreateWasmViewportFromCpp: function(htmlCanvasId) { + return window.CreateWasmViewport(htmlCanvasId); + }, + + // each time the StoneApplication updates its status, it may signal it + // through this method. i.e, to change the status of a button in the web interface + UpdateStoneApplicationStatusFromCppWithString: function(statusUpdateMessage) { + var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); + window.UpdateWebApplicationWithString(statusUpdateMessage_); + }, + + // same, but with a serialized message + UpdateStoneApplicationStatusFromCppWithSerializedMessage: function(statusUpdateMessage) { + var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); + window.UpdateWebApplicationWithSerializedMessage(statusUpdateMessage_); + }, + + // These functions are called from C++ (through an extern declaration) + // and call the standard logger that, here, routes to the console. + + stone_console_error : function(message) { + var text = UTF8ToString(message); + window.errorFromCpp(text); + }, + + stone_console_warning : function(message) { + var text = UTF8ToString(message); + window.warningFromCpp(text); + }, + + stone_console_info: function(message) { + var text = UTF8ToString(message); + window.infoFromCpp(text); + }, + + stone_console_trace : function(message) { + var text = UTF8ToString(message); + window.debugFromCpp(text); + } + +}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/logger.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/logger.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,111 @@ +export enum LogSource { + Cpp, + Typescript +} + +export class StandardConsoleLogger { + public showSource: boolean = true; + + public debug(...args: any[]): void { + this._debug(LogSource.Typescript, ...args); + } + + public debugFromCpp(...args: any[]): void { + this._debug(LogSource.Cpp, ...args); + } + + public info(...args: any[]): void { + this._info(LogSource.Typescript, ...args); + } + + public infoFromCpp(message: string): void { + this._info(LogSource.Cpp, message); + } + + public warning(...args: any[]): void { + this._warning(LogSource.Typescript, ...args); + } + + public warningFromCpp(message: string): void { + this._warning(LogSource.Cpp, message); + } + + public error(...args: any[]): void { + this._error(LogSource.Typescript, ...args); + } + + public errorFromCpp(message: string): void { + this._error(LogSource.Cpp, message); + } + + public _debug(source: LogSource, ...args: any[]): void { + if (( window).IsTraceLevelEnabled) + { + if (( window).IsTraceLevelEnabled()) + { + var output = this.getOutput(source, args); + console.debug(...output); + } + } + } + + private _info(source: LogSource, ...args: any[]): void { + if (( window).IsInfoLevelEnabled) + { + if (( window).IsInfoLevelEnabled()) + { + var output = this.getOutput(source, args); + console.info(...output); + } + } + } + + public _warning(source: LogSource, ...args: any[]): void { + var output = this.getOutput(source, args); + console.warn(...output); + } + + public _error(source: LogSource, ...args: any[]): void { + var output = this.getOutput(source, args); + console.error(...output); + } + + + private getOutput(source: LogSource, args: any[]): any[] { + var prefix = this.getPrefix(); + var prefixAndSource = Array(); + + if (prefix != null) { + prefixAndSource = [prefix]; + } + + if (this.showSource) { + if (source == LogSource.Typescript) { + prefixAndSource = [...prefixAndSource, "TS "]; + } else if (source == LogSource.Cpp) { + prefixAndSource = [...prefixAndSource, "C++"]; + } + } + + if (prefixAndSource.length > 0) { + prefixAndSource = [...prefixAndSource, "|"]; + } + + return [...prefixAndSource, ...args]; + } + + protected getPrefix(): string | null { + return null; + } +} + +export class TimeConsoleLogger extends StandardConsoleLogger { + protected getPrefix(): string { + let now = new Date(); + let timeString = now.getHours().toString().padStart(2, "0") + ":" + now.getMinutes().toString().padStart(2, "0") + ":" + now.getSeconds().toString().padStart(2, "0") + "." + now.getMilliseconds().toString().padStart(3, "0"); + return timeString; + } +} + +export var defaultLogger: StandardConsoleLogger = new TimeConsoleLogger(); + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/stone-framework-loader.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/stone-framework-loader.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,95 @@ +/** + * This file contains primitives to interface with WebAssembly and + * with the Stone framework. + **/ +import * as Logger from './logger' + +export declare type InitializationCallback = () => void; + +//export declare var StoneFrameworkModule : any; +export var StoneFrameworkModule : any; + +//const ASSETS_FOLDER : string = "assets/lib"; +//const WASM_FILENAME : string = "orthanc-framework"; + +export class Framework +{ + private static singleton_ : Framework = null; + private static wasmModuleName_ : string = null; + + public static Configure(wasmModuleName: string) { + this.wasmModuleName_ = wasmModuleName; + } + + private constructor(verbose : boolean) + { + //this.ccall('Initialize', null, [ 'number' ], [ verbose ]); + } + + + public ccall( name: string, + returnType: string, + argTypes: Array, + argValues: Array) : any + { + return ( window).StoneFrameworkModule.ccall(name, returnType, argTypes, argValues); + } + + + public cwrap( name: string, + returnType: string, + argTypes: Array) : any + { + return ( window).StoneFrameworkModule.cwrap(name, returnType, argTypes); + } + + + public static GetInstance() : Framework + { + if (Framework.singleton_ == null) { + throw new Error('The WebAssembly module is not loaded yet'); + } else { + return Framework.singleton_; + } + } + + + public static Initialize( verbose: boolean, + callback: InitializationCallback) + { + Logger.defaultLogger.debug('Initializing WebAssembly Module'); + + ( window).errorFromCpp = function(text:any) { Logger.defaultLogger.errorFromCpp(text); }; + ( window).warningFromCpp = function(text:any) { Logger.defaultLogger.warningFromCpp(text); }; + ( window).infoFromCpp = function(text:any) { Logger.defaultLogger.infoFromCpp(text); }; + ( window).debugFromCpp = function(text:any) { Logger.defaultLogger.debugFromCpp(text); }; + + // ( window). + ( window).StoneFrameworkModule = { + preRun: [ + function() { + Logger.defaultLogger.debug('Loading the Stone Framework using WebAssembly'); + } + ], + postRun: [ + function() { + // This function is called by ".js" wrapper once the ".wasm" + // WebAssembly module has been loaded and compiled by the + // browser + Logger.defaultLogger.debug('WebAssembly is ready'); + Framework.singleton_ = new Framework(verbose); + callback(); + } + ], + totalDependencies: 0 + }; + + // Dynamic loading of the JavaScript wrapper around WebAssembly + var script = document.createElement('script'); + script.type = 'application/javascript'; + //script.src = "orthanc-stone.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; + script.src = this.wasmModuleName_ + ".js";// "OrthancStoneSimpleViewer.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; + script.async = true; + document.head.appendChild(script); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/tsconfig-stone.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/tsconfig-stone.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,8 @@ +{ + "include" : [ + "stone-framework-loader.ts", + "logger.ts", + "wasm-application-runner.ts", + "wasm-viewport.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-application-runner.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-application-runner.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,141 @@ +import * as Stone from './stone-framework-loader' +import * as StoneViewport from './wasm-viewport' +import * as Logger from './logger' + +if (!('WebAssembly' in window)) { + alert('Sorry, your browser does not support WebAssembly :('); +} + +//var StoneFrameworkModule : Stone.Framework = (window).StoneFrameworkModule; +//export declare var StoneFrameworkModule : Stone.Framework; + +// global functions +var WasmWebService_NotifyError: Function = null; +var WasmWebService_NotifySuccess: Function = null; +var WasmWebService_NotifyCachedSuccess: Function = null; +var WasmDelayedCallExecutor_ExecuteCallback: Function = null; +var WasmDoAnimation: Function = null; +var SetStartupParameter: Function = null; +var CreateWasmApplication: Function = null; +export var CreateCppViewport: Function = null; +var ReleaseCppViewport: Function = null; +var StartWasmApplication: Function = null; +export var SendSerializedMessageToStoneApplication: Function = null; + +var auxiliaryParameters : Map = null; + +export function SetApplicationParameters(params : Map) { + if (auxiliaryParameters != null) { + console.warn("wasm-application-runner.SetApplicationParameters: about to overwrite the existing application parameters!") + } + auxiliaryParameters = params; +} + +function DoAnimationThread() { + if (WasmDoAnimation != null) { + WasmDoAnimation(); + } + + // Update the viewport content every 100ms if need be + setTimeout(DoAnimationThread, 100); +} + + +function GetUriParameters(): Map { + var parameters = window.location.search.substr(1); + + if (parameters != null && + parameters != '') { + var result = new Map(); + var tokens = parameters.split('&'); + + for (var i = 0; i < tokens.length; i++) { + var tmp = tokens[i].split('='); + if (tmp.length == 2) { + result[tmp[0]] = decodeURIComponent(tmp[1]); + } else if(tmp.length == 1) { + // if there is no '=', we treat ot afterwards as a flag-style param + result[tmp[0]] = ""; + } + } + return result; + } + else { + return new Map(); + } +} + +// function UpdateWebApplication(statusUpdateMessage: string) { +// console.log(statusUpdateMessage); +// } + +function _InitializeWasmApplication(orthancBaseUrl: string): void { + + CreateWasmApplication(); + + // transmit the API-specified parameters to the app before initializing it + for (let key in auxiliaryParameters) { + if (auxiliaryParameters.hasOwnProperty(key)) { + Logger.defaultLogger.debug( + `About to call SetStartupParameter("${key}","${auxiliaryParameters[key]}")`); + SetStartupParameter(key, auxiliaryParameters[key]); + } + } + + // parse uri and transmit the URI parameters to the app before initializing it + let parameters = GetUriParameters(); + + for (let key in parameters) { + if (parameters.hasOwnProperty(key)) { + Logger.defaultLogger.debug( + `About to call SetStartupParameter("${key}","${parameters[key]}")`); + SetStartupParameter(key, parameters[key]); + } + } + + StartWasmApplication(orthancBaseUrl); + + // trigger a first resize of the canvas that has just been initialized + StoneViewport.WasmViewport.ResizeAll(); + + DoAnimationThread(); +} + +export function InitializeWasmApplication(wasmModuleName: string, orthancBaseUrl: string) { + + Stone.Framework.Configure(wasmModuleName); + + // Wait for the Orthanc Framework to be initialized (this initializes + // the WebAssembly environment) and then, create and initialize the Wasm application + Stone.Framework.Initialize(true, function () { + + Logger.defaultLogger.debug("Connecting C++ methods to JS methods"); + + SetStartupParameter = ( window).StoneFrameworkModule.cwrap('SetStartupParameter', null, ['string', 'string']); + CreateWasmApplication = ( window).StoneFrameworkModule.cwrap('CreateWasmApplication', null, ['number']); + CreateCppViewport = ( window).StoneFrameworkModule.cwrap('CreateCppViewport', 'number', []); + ReleaseCppViewport = ( window).StoneFrameworkModule.cwrap('ReleaseCppViewport', null, ['number']); + StartWasmApplication = ( window).StoneFrameworkModule.cwrap('StartWasmApplication', null, ['string']); + ( window).IsTraceLevelEnabled = ( window).StoneFrameworkModule.cwrap('WasmIsTraceLevelEnabled', 'boolean', null); + ( window).IsInfoLevelEnabled = ( window).StoneFrameworkModule.cwrap('WasmIsInfoLevelEnabled', 'boolean', null); + + ( window).WasmWebService_NotifyCachedSuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyCachedSuccess', null, ['number']); + ( window).WasmWebService_NotifySuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifySuccess', null, ['number', 'string', 'array', 'number', 'number']); + ( window).WasmWebService_NotifyError = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyError', null, ['number', 'string', 'number', 'number']); + ( window).WasmDelayedCallExecutor_ExecuteCallback = ( window).StoneFrameworkModule.cwrap('WasmDelayedCallExecutor_ExecuteCallback', null, ['number']); + // no need to put this into the globals for it's only used in this very module + WasmDoAnimation = ( window).StoneFrameworkModule.cwrap('WasmDoAnimation', null, []); + + SendSerializedMessageToStoneApplication = ( window).StoneFrameworkModule.cwrap('SendSerializedMessageToStoneApplication', 'string', ['string']); + + Logger.defaultLogger.debug("Connecting C++ methods to JS methods - done"); + + _InitializeWasmApplication(orthancBaseUrl); + }); +} + + +// exports.InitializeWasmApplication = InitializeWasmApplication; + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-viewport.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-viewport.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,359 @@ +import * as wasmApplicationRunner from './wasm-application-runner' +import * as Logger from './logger' + +var isPendingRedraw = false; + +function ScheduleWebViewportRedraw(cppViewportHandle: any) : void +{ + if (!isPendingRedraw) { + isPendingRedraw = true; + Logger.defaultLogger.debug('Scheduling a refresh of the viewport, as its content changed'); + window.requestAnimationFrame(function() { + isPendingRedraw = false; + let viewport = WasmViewport.GetFromCppViewport(cppViewportHandle); + if (viewport) { + viewport.Redraw(); + } + }); + } +} + +(window).ScheduleWebViewportRedraw = ScheduleWebViewportRedraw; + +declare function UTF8ToString(v: any): string; + +function CreateWasmViewport(htmlCanvasId: string) : any { + var cppViewportHandle = wasmApplicationRunner.CreateCppViewport(); + var canvasId = UTF8ToString(htmlCanvasId); + var webViewport = new WasmViewport(( window).StoneFrameworkModule, canvasId, cppViewportHandle); // viewports are stored in a static map in WasmViewport -> won't be deleted + webViewport.Initialize(); + + return cppViewportHandle; +} + +(window).CreateWasmViewport = CreateWasmViewport; + +export class WasmViewport { + + private static viewportsMapByCppHandle_ : Map = new Map(); // key = the C++ handle + private static viewportsMapByCanvasId_ : Map = new Map(); // key = the canvasId + + private module_ : any; + private canvasId_ : string; + private htmlCanvas_ : HTMLCanvasElement; + private context_ : CanvasRenderingContext2D | null; + private imageData_ : any = null; + private renderingBuffer_ : any = null; + + private touchGestureInProgress_: boolean = false; + private touchCount_: number = 0; + private touchGestureLastCoordinates_: [number, number][] = []; // last x,y coordinates of each touch + + private touchZoom_ : any = false; + private touchTranslation_ : any = false; + + private ViewportSetSize : Function; + private ViewportRender : Function; + private ViewportMouseDown : Function; + private ViewportMouseMove : Function; + private ViewportMouseUp : Function; + private ViewportMouseEnter : Function; + private ViewportMouseLeave : Function; + private ViewportMouseWheel : Function; + private ViewportKeyPressed : Function; + private ViewportTouchStart : Function; + private ViewportTouchMove : Function; + private ViewportTouchEnd : Function; + + private pimpl_ : any; // Private pointer to the underlying WebAssembly C++ object + + public constructor(module: any, canvasId: string, cppViewport: any) { + + this.pimpl_ = cppViewport; + WasmViewport.viewportsMapByCppHandle_[this.pimpl_] = this; + WasmViewport.viewportsMapByCanvasId_[canvasId] = this; + + this.module_ = module; + this.canvasId_ = canvasId; + this.htmlCanvas_ = document.getElementById(this.canvasId_) as HTMLCanvasElement; + if (this.htmlCanvas_ == null) { + Logger.defaultLogger.error("Can not create WasmViewport, did not find the canvas whose id is '", this.canvasId_, "'"); + } + this.context_ = this.htmlCanvas_.getContext('2d'); + + this.ViewportSetSize = this.module_.cwrap('ViewportSetSize', null, [ 'number', 'number', 'number' ]); + this.ViewportRender = this.module_.cwrap('ViewportRender', null, [ 'number', 'number', 'number', 'number' ]); + this.ViewportMouseDown = this.module_.cwrap('ViewportMouseDown', null, [ 'number', 'number', 'number', 'number', 'number' ]); + this.ViewportMouseMove = this.module_.cwrap('ViewportMouseMove', null, [ 'number', 'number', 'number' ]); + this.ViewportMouseUp = this.module_.cwrap('ViewportMouseUp', null, [ 'number' ]); + this.ViewportMouseEnter = this.module_.cwrap('ViewportMouseEnter', null, [ 'number' ]); + this.ViewportMouseLeave = this.module_.cwrap('ViewportMouseLeave', null, [ 'number' ]); + this.ViewportMouseWheel = this.module_.cwrap('ViewportMouseWheel', null, [ 'number', 'number', 'number', 'number', 'number' ]); + this.ViewportKeyPressed = this.module_.cwrap('ViewportKeyPressed', null, [ 'number', 'number', 'string', 'number', 'number' ]); + this.ViewportTouchStart = this.module_.cwrap('ViewportTouchStart', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); + this.ViewportTouchMove = this.module_.cwrap('ViewportTouchMove', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); + this.ViewportTouchEnd = this.module_.cwrap('ViewportTouchEnd', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); + } + + public GetCppViewport() : number { + return this.pimpl_; + } + + public static GetFromCppViewport(cppViewportHandle: number) : WasmViewport | null { + if (WasmViewport.viewportsMapByCppHandle_[cppViewportHandle] !== undefined) { + return WasmViewport.viewportsMapByCppHandle_[cppViewportHandle]; + } + Logger.defaultLogger.error("WasmViewport not found !"); + return null; + } + + public static GetFromCanvasId(canvasId: string) : WasmViewport | null { + if (WasmViewport.viewportsMapByCanvasId_[canvasId] !== undefined) { + return WasmViewport.viewportsMapByCanvasId_[canvasId]; + } + Logger.defaultLogger.error("WasmViewport not found !"); + return null; + } + + public static ResizeAll() { + for (let canvasId in WasmViewport.viewportsMapByCanvasId_) { + WasmViewport.viewportsMapByCanvasId_[canvasId].Resize(); + } + } + + public Redraw() { + if (this.imageData_ === null || + this.renderingBuffer_ === null || + this.ViewportRender(this.pimpl_, + this.imageData_.width, + this.imageData_.height, + this.renderingBuffer_) == 0) { + Logger.defaultLogger.error('The rendering has failed'); + } else { + // Create an accessor to the rendering buffer (i.e. create a + // "window" above the heap of the WASM module), then copy it to + // the ImageData object + this.imageData_.data.set(new Uint8ClampedArray( + this.module_.HEAPU8.buffer, + this.renderingBuffer_, + this.imageData_.width * this.imageData_.height * 4)); + + if (this.context_) { + this.context_.putImageData(this.imageData_, 0, 0); + } + } + } + + public Resize() { + if (this.imageData_ != null && + (this.imageData_.width != window.innerWidth || + this.imageData_.height != window.innerHeight)) { + this.imageData_ = null; + } + + // width/height is defined by the parent width/height + if (this.htmlCanvas_.parentElement) { + this.htmlCanvas_.width = this.htmlCanvas_.parentElement.offsetWidth; + this.htmlCanvas_.height = this.htmlCanvas_.parentElement.offsetHeight; + + Logger.defaultLogger.debug("resizing WasmViewport: ", this.htmlCanvas_.width, "x", this.htmlCanvas_.height); + + if (this.imageData_ === null && this.context_) { + this.imageData_ = this.context_.getImageData(0, 0, this.htmlCanvas_.width, this.htmlCanvas_.height); + this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); + + if (this.renderingBuffer_ != null) { + this.module_._free(this.renderingBuffer_); + } + + this.renderingBuffer_ = this.module_._malloc(this.imageData_.width * this.imageData_.height * 4); + } else { + this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); + } + + this.Redraw(); + } + } + + public Initialize() { + + // Force the rendering of the viewport for the first time + this.Resize(); + + var that : WasmViewport = this; + // Register an event listener to call the Resize() function + // each time the window is resized. + window.addEventListener('resize', function(event) { + that.Resize(); + }, false); + + this.htmlCanvas_.addEventListener('contextmenu', function(event) { + // Prevent right click on the canvas + event.preventDefault(); + }, false); + + this.htmlCanvas_.addEventListener('mouseleave', function(event) { + that.ViewportMouseLeave(that.pimpl_); + }); + + this.htmlCanvas_.addEventListener('mouseenter', function(event) { + that.ViewportMouseEnter(that.pimpl_); + }); + + this.htmlCanvas_.addEventListener('mousedown', function(event) { + var x = event.pageX - this.offsetLeft; + var y = event.pageY - this.offsetTop; + + that.ViewportMouseDown(that.pimpl_, event.button, x, y, 0 /* TODO detect modifier keys*/); + }); + + this.htmlCanvas_.addEventListener('mousemove', function(event) { + var x = event.pageX - this.offsetLeft; + var y = event.pageY - this.offsetTop; + that.ViewportMouseMove(that.pimpl_, x, y); + }); + + this.htmlCanvas_.addEventListener('mouseup', function(event) { + that.ViewportMouseUp(that.pimpl_); + }); + + window.addEventListener('keydown', function(event) { + var keyChar: string | null = event.key; + var keyCode = event.keyCode + if (keyChar.length == 1) { + keyCode = 0; // maps to OrthancStone::KeyboardKeys_Generic + } else { + keyChar = null; + } +// console.log("key: ", keyCode, keyChar); + that.ViewportKeyPressed(that.pimpl_, keyCode, keyChar, event.shiftKey, event.ctrlKey, event.altKey); + }); + + this.htmlCanvas_.addEventListener('wheel', function(event) { + var x = event.pageX - this.offsetLeft; + var y = event.pageY - this.offsetTop; + that.ViewportMouseWheel(that.pimpl_, event.deltaY, x, y, event.ctrlKey); + event.preventDefault(); + }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface + + this.htmlCanvas_.addEventListener('touchstart', function(event: TouchEvent) { + // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) + event.preventDefault(); + event.stopPropagation(); + + // TODO: find a way to pass the coordinates as an array between JS and C++ + var x0 = 0; + var y0 = 0; + var x1 = 0; + var y1 = 0; + var x2 = 0; + var y2 = 0; + if (event.targetTouches.length > 0) { + x0 = event.targetTouches[0].pageX; + y0 = event.targetTouches[0].pageY; + } + if (event.targetTouches.length > 1) { + x1 = event.targetTouches[1].pageX; + y1 = event.targetTouches[1].pageY; + } + if (event.targetTouches.length > 2) { + x2 = event.targetTouches[2].pageX; + y2 = event.targetTouches[2].pageY; + } + + that.ViewportTouchStart(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); + }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface + + this.htmlCanvas_.addEventListener('touchend', function(event) { + // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) + event.preventDefault(); + event.stopPropagation(); + + // TODO: find a way to pass the coordinates as an array between JS and C++ + var x0 = 0; + var y0 = 0; + var x1 = 0; + var y1 = 0; + var x2 = 0; + var y2 = 0; + if (event.targetTouches.length > 0) { + x0 = event.targetTouches[0].pageX; + y0 = event.targetTouches[0].pageY; + } + if (event.targetTouches.length > 1) { + x1 = event.targetTouches[1].pageX; + y1 = event.targetTouches[1].pageY; + } + if (event.targetTouches.length > 2) { + x2 = event.targetTouches[2].pageX; + y2 = event.targetTouches[2].pageY; + } + + that.ViewportTouchEnd(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); + }); + + this.htmlCanvas_.addEventListener('touchmove', function(event: TouchEvent) { + + // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) + event.preventDefault(); + event.stopPropagation(); + + + // TODO: find a way to pass the coordinates as an array between JS and C++ + var x0 = 0; + var y0 = 0; + var x1 = 0; + var y1 = 0; + var x2 = 0; + var y2 = 0; + if (event.targetTouches.length > 0) { + x0 = event.targetTouches[0].pageX; + y0 = event.targetTouches[0].pageY; + } + if (event.targetTouches.length > 1) { + x1 = event.targetTouches[1].pageX; + y1 = event.targetTouches[1].pageY; + } + if (event.targetTouches.length > 2) { + x2 = event.targetTouches[2].pageX; + y2 = event.targetTouches[2].pageY; + } + + that.ViewportTouchMove(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); + return; + + }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface + } + + public ResetTouch() { + if (this.touchTranslation_ || + this.touchZoom_) { + this.ViewportMouseUp(this.pimpl_); + } + + this.touchTranslation_ = false; + this.touchZoom_ = false; + } + + public GetTouchTranslation(event: any) { + var touch = event.targetTouches[0]; + return [ + touch.pageX, + touch.pageY + ]; + } + + public GetTouchZoom(event: any) { + var touch1 = event.targetTouches[0]; + var touch2 = event.targetTouches[1]; + var dx = (touch1.pageX - touch2.pageX); + var dy = (touch1.pageY - touch2.pageY); + var d = Math.sqrt(dx * dx + dy * dy); + return [ + (touch1.pageX + touch2.pageX) / 2.0, + (touch1.pageY + touch2.pageY) / 2.0, + d + ]; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,259 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +*/ + +namespace VsolStuff +{ + enum EnumMonth0 + { + January, + February, + March + }; + + // interface Serializer + // { + // Serialize(value: number): string; + // Serialize(value: string): string; + // Serialize(value: EnumMonth0): string; + // }; + function printf(value: any):void + { + console.log(value) + } + + // function StoneSerialize(value: string) : string; + // function StoneSerialize(value: number) : string; + // function StoneSerialize(value: EnumMonth0) : string; + function StoneSerialize(value: T[]) : string; + + function StoneSerialize(value: T[] | EnumMonth0) : string + { + let valueType = typeof value; + printf(`About to serialize value. Type is ${valueType}`) + printf(`About to serialize value. Type is ${typeof value}`) + return "Choucroute"; + } + + function main():number + { + enum Color {Red = 1, Green = 2, Blue = 4} + let color: Color = Color.Green; + printf("---------------------------"); + printf(`typeof color: ${typeof color}`); + printf("---------------------------"); + let colors: Color[] = [] + colors.push(Color.Green); + colors.push(Color.Red); + printf(`typeof colors: ${typeof colors}`); + printf(`Array.isArray(colors): ${Array.isArray(colors)}`); + printf("---------------------------"); + + + let toto:EnumMonth0[] = []; + + toto.push(EnumMonth0.February); + toto.push(EnumMonth0.March); + + printf(JSON.stringify(toto)); + + return 0; + + } + + main() + +// string StoneSerialize_number(int32_t value) +// { + +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(double value) +// { +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(bool value) +// { +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(const std::string& value) +// { +// // the following is better than +// Json::Value result(value.data(),value.data()+value.size()); +// return result; +// } + +// template +// Json::Value StoneSerialize(const std::map& value) +// { +// Json::Value result(Json::objectValue); + +// for (std::map::const_iterator it = value.cbegin(); +// it != value.cend(); ++it) +// { +// // it->first it->second +// result[it->first] = StoneSerialize(it->second); +// } +// return result; +// } + +// template +// Json::Value StoneSerialize(const std::vector& value) +// { +// Json::Value result(Json::arrayValue); +// for (size_t i = 0; i < value.size(); ++i) +// { +// result.append(StoneSerialize(value[i])); +// } +// return result; +// } + +// enum EnumMonth0 +// { +// January, +// February, +// March +// }; + +// std::string ToString(EnumMonth0 value) +// { +// switch(value) +// { +// case January: +// return "January"; +// case February: +// return "February"; +// case March: +// return "March"; +// default: +// { +// std::stringstream ss; +// ss << "Unrecognized EnumMonth0 value (" << static_cast(value) << ")"; +// throw std::runtime_error(ss.str()); +// } +// } +// } + +// void FromString(EnumMonth0& value, std::string strValue) +// { +// if (strValue == "January" || strValue == "EnumMonth0_January") +// { +// return January; +// } +// else if (strValue == "February" || strValue == "EnumMonth0_February") +// { +// return February; +// } +// #error Not implemented yet +// } + +// Json::Value StoneSerialize(const EnumMonth0& value) +// { +// return StoneSerialize(ToString(value)); +// } +// struct Message1 +// { +// int32_t a; +// std::string b; +// EnumMonth0 c; +// bool d; +// }; + +// struct Message2 +// { +// std::string toto; +// std::vector tata; +// std::vector tutu; +// std::map titi; +// std::map lulu; +// }; + +// Json::Value StoneSerialize(const Message1& value) +// { +// Json::Value result(Json::objectValue); +// result["a"] = StoneSerialize(value.a); +// result["b"] = StoneSerialize(value.b); +// result["c"] = StoneSerialize(value.c); +// result["d"] = StoneSerialize(value.d); +// return result; +// } + +// Json::Value StoneSerialize(const Message2& value) +// { +// Json::Value result(Json::objectValue); +// result["toto"] = StoneSerialize(value.toto); +// result["tata"] = StoneSerialize(value.tata); +// result["tutu"] = StoneSerialize(value.tutu); +// result["titi"] = StoneSerialize(value.titi); +// result["lulu"] = StoneSerialize(value.lulu); +// return result; +// } +// } + +// int main() +// { +// VsolStuff::Message1 msg1_0; +// msg1_0.a = 42; +// msg1_0.b = "Benjamin"; +// msg1_0.c = VsolStuff::January; +// msg1_0.d = true; + +// VsolStuff::Message1 msg1_1; +// msg1_1.a = 43; +// msg1_1.b = "Sandrine"; +// msg1_1.c = VsolStuff::March; +// msg1_0.d = false; + +// // std::string toto; +// // std::vector tata; +// // std::vector tutu; +// // std::map titi; +// // std::map lulu; + +// VsolStuff::Message2 msg2_0; +// msg2_0.toto = "Prout zizi"; +// msg2_0.tata.push_back(msg1_0); +// msg2_0.tata.push_back(msg1_1); +// msg2_0.tutu.push_back("Mercadet"); +// msg2_0.tutu.push_back("Poisson"); +// msg2_0.titi["44"] = "key 44"; +// msg2_0.titi["45"] = "key 45"; +// msg2_0.lulu["54"] = msg1_1; +// msg2_0.lulu["55"] = msg1_0; +// auto result = VsolStuff::StoneSerialize(msg2_0); +// auto resultStr = result.toStyledString(); + +// Json::Value readValue; + +// Json::CharReaderBuilder builder; +// Json::CharReader* reader = builder.newCharReader(); +// std::string errors; + +// bool ok = reader->parse( +// resultStr.c_str(), +// resultStr.c_str() + resultStr.size(), +// &readValue, +// &errors +// ); +// delete reader; + +// if (!ok) +// { +// std::stringstream ss; +// ss << "Json parsing error: " << errors; +// throw std::runtime_error(ss.str()); +// } +// std::cout << readValue.get("toto", "Default Value").asString() << std::endl; +// return 0; +// } + + +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground2.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground2.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +class Greeter { + greeting: string; + constructor(message: string) { + this.greeting = message; + } + greet() { + return "Hello, " + this.greeting; + } +} +enum Color { + Red, + Green, + Blue, +}; + +function ColorToString(value: Color) +{ + switch (value) + { + case Color.Red: + return "Red"; + case Color.Green: + return "Green"; + case Color.Blue: + return "Blue"; + default: + throw new Error(`Unrecognized Color value(${value})`); + } +} + +let color: Color = Color.Red; + +document.body.textContent = "

---------------------

" +document.body.textContent += "

********************************

" + +class TestMessage { + s1: string; + s2: Array; + s3: Array>; + s4: Map; + s5: Map>; + s6: Color; + s7: boolean; +} + +let tm = new TestMessage(); +tm.s2 = new Array() +tm.s2.push("toto"); +tm.s2.push("toto2"); +tm.s2.push("toto3"); +tm.s4 = new Map(); +tm.s4["toto"] = 42; +tm.s4["toto"] = 1999; +tm.s4["tatata"] = 1999; +tm.s6 = Color.Red; +tm.s7 = true + +let txt = JSON.stringify(tm) +let txtElem = document.createElement('textarea'); +txtElem.value = txt; + +document.body.appendChild(txtElem); + +let greeter = new Greeter("world"); + +let button = document.createElement('button'); +button.textContent = "Say Hello"; +button.onclick = function() { + alert(greeter.greet()); +} + +document.body.appendChild(button); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground3.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground3.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,275 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +*/ + +namespace VsolStuff222 { + export enum EnumMonth0 { + January, + February, + March + }; + + export class Message1 { + a: number; + b: string; + c: EnumMonth0; + d: boolean; + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'VsolStuff.Message1'; + container['value'] = this; + return JSON.stringify(container); + } + }; + + export class Message2 { + toto: string; + tata: Message1[]; + tutu: string[]; + titi: Map; + lulu: Map; + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'VsolStuff.Message2'; + container['value'] = this; + return JSON.stringify(container); + } + }; +} + +function printf(value: any): void { + console.log(value) +} + +function main(): number { + + let msg1_0 = new VsolStuff.Message1(); + msg1_0.a = 42; + msg1_0.b = "Benjamin"; + msg1_0.c = VsolStuff.EnumMonth0.January; + msg1_0.d = true; + + let msg1_1 = new VsolStuff.Message1(); + msg1_1.a = 43; + msg1_1.b = "Sandrine"; + msg1_1.c = VsolStuff.EnumMonth0.March; + msg1_0.d = false; + + // std::string toto; + // std::vector tata; + // std::vector tutu; + // std::map titi; + // std::map lulu; + + let msg2_0 = new VsolStuff.Message2(); + msg2_0.toto = "Prout zizi"; + msg2_0.tata = new Array(); + msg2_0.tata.push(msg1_0); + msg2_0.tata.push(msg1_1); + msg2_0.tutu.push("Mercadet"); + msg2_0.tutu.push("Poisson");ing + msg2_0.titi["44"] = "key 44"; + msg2_0.titi["45"] = "key 45"; + msg2_0.lulu["54"] = msg1_1; + msg2_0.lulu["55"] = msg1_0; + let result:string = VsolStuff.StoneSerialize(msg2_0); + return 0; +} + +main() + +// string StoneSerialize_number(int32_t value) +// { + +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(double value) +// { +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(bool value) +// { +// Json::Value result(value); +// return result; +// } + +// Json::Value StoneSerialize(const std::string& value) +// { +// // the following is better than +// Json::Value result(value.data(),value.data()+value.size()); +// return result; +// } + +// template +// Json::Value StoneSerialize(const std::map& value) +// { +// Json::Value result(Json::objectValue); + +// for (std::map::const_iterator it = value.cbegin(); +// it != value.cend(); ++it) +// { +// // it->first it->second +// result[it->first] = StoneSerialize(it->second); +// } +// return result; +// } + +// template +// Json::Value StoneSerialize(const std::vector& value) +// { +// Json::Value result(Json::arrayValue); +// for (size_t i = 0; i < value.size(); ++i) +// { +// result.append(StoneSerialize(value[i])); +// } +// return result; +// } + +// enum EnumMonth0 +// { +// January, +// February, +// March +// }; + +// std::string ToString(EnumMonth0 value) +// { +// switch(value) +// { +// case January: +// return "January"; +// case February: +// return "February"; +// case March: +// return "March"; +// default: +// { +// std::stringstream ss; +// ss << "Unrecognized EnumMonth0 value (" << static_cast(value) << ")"; +// throw std::runtime_error(ss.str()); +// } +// } +// } + +// void FromString(EnumMonth0& value, std::string strValue) +// { +// if (strValue == "January" || strValue == "EnumMonth0_January") +// { +// return January; +// } +// else if (strValue == "February" || strValue == "EnumMonth0_February") +// { +// return February; +// } +// #error Not implemented yet +// } + +// Json::Value StoneSerialize(const EnumMonth0& value) +// { +// return StoneSerialize(ToString(value)); +// } +// struct Message1 +// { +// int32_t a; +// std::string b; +// EnumMonth0 c; +// bool d; +// }; + +// struct Message2 +// { +// std::string toto; +// std::vector tata; +// std::vector tutu; +// std::map titi; +// std::map lulu; +// }; + +// Json::Value StoneSerialize(const Message1& value) +// { +// Json::Value result(Json::objectValue); +// result["a"] = StoneSerialize(value.a); +// result["b"] = StoneSerialize(value.b); +// result["c"] = StoneSerialize(value.c); +// result["d"] = StoneSerialize(value.d); +// return result; +// } + +// Json::Value StoneSerialize(const Message2& value) +// { +// Json::Value result(Json::objectValue); +// result["toto"] = StoneSerialize(value.toto); +// result["tata"] = StoneSerialize(value.tata); +// result["tutu"] = StoneSerialize(value.tutu); +// result["titi"] = StoneSerialize(value.titi); +// result["lulu"] = StoneSerialize(value.lulu); +// return result; +// } +// } + +// int main() +// { +// VsolStuff::Message1 msg1_0; +// msg1_0.a = 42; +// msg1_0.b = "Benjamin"; +// msg1_0.c = VsolStuff::January; +// msg1_0.d = true; + +// VsolStuff::Message1 msg1_1; +// msg1_1.a = 43; +// msg1_1.b = "Sandrine"; +// msg1_1.c = VsolStuff::March; +// msg1_0.d = false; + +// // std::string toto; +// // std::vector tata; +// // std::vector tutu; +// // std::map titi; +// // std::map lulu; + +// VsolStuff::Message2 msg2_0; +// msg2_0.toto = "Prout zizi"; +// msg2_0.tata.push_back(msg1_0); +// msg2_0.tata.push_back(msg1_1); +// msg2_0.tutu.push_back("Mercadet"); +// msg2_0.tutu.push_back("Poisson"); +// msg2_0.titi["44"] = "key 44"; +// msg2_0.titi["45"] = "key 45"; +// msg2_0.lulu["54"] = msg1_1; +// msg2_0.lulu["55"] = msg1_0; +// auto result = VsolStuff::StoneSerialize(msg2_0); +// auto resultStr = result.toStyledString(); + +// Json::Value readValue; + +// Json::CharReaderBuilder builder; +// Json::CharReader* reader = builder.newCharReader(); +// std::string errors; + +// bool ok = reader->parse( +// resultStr.c_str(), +// resultStr.c_str() + resultStr.size(), +// &readValue, +// &errors +// ); +// delete reader; + +// if (!ok) +// { +// std::stringstream ss; +// ss << "Json parsing error: " << errors; +// throw std::runtime_error(ss.str()); +// } +// std::cout << readValue.get("toto", "Default Value").asString() << std::endl; +// return 0; +// } + + +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground4.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground4.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +testYaml = """ +enum SomeEnum: + - january + - feb + +struct Message0: + a: string + +struct Message1: + a: string + b: int32 + c: vector + d: SomeEnum = january + e: SomeEnum= january + f: SomeEnum=january + g: SomeEnum =january + + +# github.com/AlDanial/cloc +header2 : + cloc_version : 1.67 + elapsed_seconds : int32_t + +header : + cloc_version : 1.67 + elapsed_seconds : int32_t + cloc_url : vector> + n_files : 1 + n_lines : 3 + files_per_second : 221.393718659277 + lines_per_second : 664.181155977831 + report_file : IDL.idl.yaml +IDL : + nFiles: 1 + blank: 0 + comment: 2 + code: 1 +EnumSUM: + - aaa + - bbb + +SUM: + blank: 0 + comment: 2 + code: 1 + nFiles: 1 +""" + +import yaml + +b = yaml.load(testYaml) +print(b) + +c = { + 'enum SomeEnum': ['january', 'feb'], + 'struct Message0': {'a': 'string'}, + 'struct Message1': { + 'a': 'string', + 'b': 'int32', + 'c': 'vector', + 'd': 'vector>', + 'e': 'SomeEnum= january', + 'f': 'SomeEnum=january', + 'g': 'SomeEnum =january' + }, +} + +print(c) \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/runts.ps1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/runts.ps1 Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +# echo "+----------------------+" +# echo "| playground.ts |" +# echo "+----------------------+" + +# tsc -t ES2015 .\playground.ts; node .\playground.js + +# echo "+----------------------+" +# echo "| playground3.ts |" +# echo "+----------------------+" + +# tsc -t ES2015 .\playground3.ts; node .\playground3.js + +echo "+----------------------+" +echo "| stonegen |" +echo "+----------------------+" + +if(-not (test-Path "build")) { + mkdir "build" +} + +echo "Generate the TS and CPP wrapper... (to build/)" +python stonegentool.py -o "." test_data/test1.yaml +if($LASTEXITCODE -ne 0) { + Write-Error ("Code generation failed!") + exit $LASTEXITCODE +} + +echo "Compile the TS wrapper to JS... (in build/)" +tsc --module commonjs --sourceMap -t ES2015 --outDir "build/" VsolMessages_generated.ts +if($LASTEXITCODE -ne 0) { + Write-Error ("Code compilation failed!") + exit $LASTEXITCODE +} + +echo "Compile the test app..." +tsc --module commonjs --sourceMap -t ES2015 --outDir "build/" test_stonegen.ts +if($LASTEXITCODE -ne 0) { + Write-Error ("Code compilation failed!") + exit $LASTEXITCODE +} + +browserify "build/test_stonegen.js" "build/VsolMessages_generated.js" -o "build_browser/test_stonegen_fused.js" + +cp .\test_stonegen.html .\build_browser\ + +echo "Run the test app..." +Push-Location +cd build_browser +node .\test_stonegen_fused.js +Pop-Location +if($LASTEXITCODE -ne 0) { + Write-Error ("Code execution failed!") + exit $LASTEXITCODE +} + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,1 @@ + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,206 @@ +import * as VsolMessages from "./VsolMessages_generated"; + +function TEST_StoneGen_SerializeComplex() { + let msg1_0 = new VsolMessages.Message1(); + msg1_0.a = 42; + msg1_0.b = "Benjamin"; + msg1_0.c = VsolMessages.EnumMonth0.January; + msg1_0.d = true; + let msg1_1 = new VsolMessages.Message1(); + msg1_1.a = 43; + msg1_1.b = "Sandrine"; + msg1_1.c = VsolMessages.EnumMonth0.March; + msg1_0.d = false; + let result1_0 = msg1_0.StoneSerialize(); + let resultStr1_0 = JSON.stringify(result1_0); + let result1_1 = msg1_1.StoneSerialize(); + let resultStr1_1 = JSON.stringify(result1_1); + // std::string toto; + // std::vector tata; + // std::vector tutu; + // std::map titi; + // std::map lulu; + let msg2_0 = new VsolMessages.Message2(); + msg2_0.toto = "Prout zizi"; + msg2_0.tata.push(msg1_0); + msg2_0.tata.push(msg1_1); + msg2_0.tutu.push("Mercadet"); + msg2_0.tutu.push("Poisson"); + msg2_0.titi["44"] = "key 44"; + msg2_0.titi["45"] = "key 45"; + msg2_0.lulu["54"] = msg1_1; + msg2_0.lulu["55"] = msg1_0; + let result2 = msg2_0.StoneSerialize(); + let resultStr2 = JSON.stringify(result2); + let refResult2 = `{ +"type" : "VsolMessages.Message2", +"value" : +{ + "lulu" : + { + "54" : + { + "a" : 43, + "b" : "Sandrine", + "c" : 2, + "d" : true + }, + "55" : + { + "a" : 42, + "b" : "Benjamin", + "c" : 0, + "d" : false + } + }, + "tata" : + [ + { + "a" : 42, + "b" : "Benjamin", + "c" : 0, + "d" : false + }, + { + "a" : 43, + "b" : "Sandrine", + "c" : 2, + "d" : true + } + ], + "titi" : + { + "44" : "key 44", + "45" : "key 45" + }, + "toto" : "Prout zizi", + "tutu" : + [ + "Mercadet", + "Poisson" + ] +} +} +`; + let refResult2Obj = JSON.parse(refResult2); + let resultStr2Obj = JSON.parse(resultStr2); + if (false) { + if (refResult2Obj !== resultStr2Obj) { + console.log("Results are different!"); + console.log(`refResult2Obj['value']['lulu']['54'] = ${refResult2Obj['value']['lulu']['54']}`); + console.log(`refResult2Obj['value']['lulu']['54']['a'] = ${refResult2Obj['value']['lulu']['54']['a']}`); + console.log("************************************************************"); + console.log("** REFERENCE OBJ **"); + console.log("************************************************************"); + console.log(refResult2Obj); + console.log("************************************************************"); + console.log("** ACTUAL OBJ **"); + console.log("************************************************************"); + console.log(resultStr2Obj); + console.log("************************************************************"); + console.log("** REFERENCE **"); + console.log("************************************************************"); + console.log(refResult2); + console.log("************************************************************"); + console.log("** ACTUAL **"); + console.log("************************************************************"); + console.log(resultStr2); + throw new Error("Wrong serialization"); + } + } + let refResultValue = JSON.parse(resultStr2); + console.log(refResultValue); +} +class MyDispatcher { + message1: VsolMessages.Message1; + message2: VsolMessages.Message2; + + HandleMessage1(value: VsolMessages.Message1) { + this.message1 = value; + return true; + } + HandleMessage2(value: VsolMessages.Message2) { + this.message2 = value; + return true; + } + HandleA(value) { + return true; + } + HandleB(value) { + return true; + } + HandleC(value) { + return true; + } +} +; +function TEST_StoneGen_DeserializeOkAndNok() { + let serializedMessage = `{ +"type" : "VsolMessages.Message2", +"value" : +{ + "lulu" : + { + "54" : + { + "a" : 43, + "b" : "Sandrine", + "c" : 2, + "d" : true + }, + "55" : + { + "a" : 42, + "b" : "Benjamin", + "c" : 0, + "d" : false + } + }, + "tata" : + [ + { + "a" : 42, + "b" : "Benjamin", + "c" : 0, + "d" : false + }, + { + "a" : 43, + "b" : "Sandrine", + "c" : 2, + "d" : true + } + ], + "titi" : + { + "44" : "key 44", + "45" : "key 45" + }, + "toto" : "Prout zizi", + "tutu" : + [ + "Mercadet", + "Poisson" + ] +} +}`; + let myDispatcher = new MyDispatcher(); + let ok = VsolMessages.StoneDispatchToHandler(serializedMessage, myDispatcher); + if (!ok) { + throw Error("Error when dispatching message!"); + } + if (myDispatcher.message1 != undefined) { + throw Error("(myDispatcher.Message1 != undefined)"); + } + if (myDispatcher.message2 == undefined) { + throw Error("(myDispatcher.Message2 == undefined)"); + } + console.log("TEST_StoneGen_DeserializeOkAndNok: OK!"); +} +function main() { + console.log("Entering main()"); + TEST_StoneGen_SerializeComplex(); + TEST_StoneGen_DeserializeOkAndNok(); + return 0; +} +console.log(`Exit code is: ${main()}`); \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/tsconfig.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/tsconfig.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,22 @@ +{ + // "extends": "../../../../../orthanc-stone/Platforms/Wasm/tsconfig-stone", + "compilerOptions": { + // "outFile": "../../../WebApplication-build/to-embed/app.js", + // "module": "system", + // "sourceMap": false, + "lib": [ + "es2017", + "es2017", + "dom", + "dom.iterable" + ] + }, + "include": [ + // "commands/*.ts", + // "logger.ts", + // "app.ts", + // "main.ts", + // "ui.ts", + // "popup.ts" + ] +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/README.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ +Requirements +---------------- + +Install Node and npm. + +Then: +- `npm install browserify` +- `npm install typescript` +- `npm install tsify` + +`testCppHandler` contains a C++ project that produces an executable +slurping a set of text files representing messages defined against +the `test_data/testTestStoneCodeGen.yaml' schema and dumping them to `cout`. + +'testWasmIntegrated` contains a small Web app demonstrating the +interaction between TypeScript and C++ in WASM. +source ~/apps/emsdk/emsdk_env.sh + + +Install Python and the following packages `pip install pyyaml yamlloader jinja2` diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,605 @@ +import json +import yaml +import re +import os +import sys +from jinja2 import Template +from io import StringIO +import time +import datetime +import yamlloader + +""" + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 +""" + +# see https://stackoverflow.com/a/2504457/2927708 +def trim(docstring): + if not docstring: + return '' + # Convert tabs to spaces (following the normal Python rules) + # and split into a list of lines: + lines = docstring.expandtabs().splitlines() + # Determine minimum indentation (first line doesn't count): + indent = sys.maxsize + for line in lines[1:]: + stripped = line.lstrip() + if stripped: + indent = min(indent, len(line) - len(stripped)) + # Remove indentation (first line is special): + trimmed = [lines[0].strip()] + if indent < sys.maxsize: + for line in lines[1:]: + trimmed.append(line[indent:].rstrip()) + # Strip off trailing and leading blank lines: + while trimmed and not trimmed[-1]: + trimmed.pop() + while trimmed and not trimmed[0]: + trimmed.pop(0) + # Return a single string: + return '\n'.join(trimmed) + +class JsonHelpers: + """A set of utilities to perform JSON operations""" + + @staticmethod + def removeCommentsFromJsonContent(string): + """ + Remove comments from a JSON file + + Comments are not allowed in JSON but, i.e., Orthanc configuration files + contains C++ like comments that we need to remove before python can + parse the file + """ + # remove all occurrence streamed comments (/*COMMENT */) from string + string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string) + + # remove all occurrence singleline comments (//COMMENT\n ) from string + string = re.sub(re.compile("//.*?\n"), "", string) + + return string + + @staticmethod + def loadJsonWithComments(path): + """ + Reads a JSON file that may contain C++ like comments + """ + with open(path, "r") as fp: + fileContent = fp.read() + fileContent = JsonHelpers.removeCommentsFromJsonContent(fileContent) + return json.loads(fileContent) + +class FieldDefinition: + + def __init__(self, name: str, type: str, defaultValue: str): + self.name = name + self.type = type + self.defaultValue = defaultValue + + @staticmethod + def fromKeyValue(key: str, value: str): + + if "=" in value: + splitValue = value.split(sep="=") + type = splitValue[0].strip(" ") + defaultValue = splitValue[1].strip(" ") + else: + type = value + defaultValue = None + + return FieldDefinition(name = key, type = type, defaultValue = defaultValue) + + +def LoadSchemaFromJson(filePath): + return JsonHelpers.loadJsonWithComments(filePath) + +def CanonToCpp(canonicalTypename): + # C++: prefix map vector and string with std::map, std::vector and + # std::string + # replace int32... by int32_t... + # replace float32 by float + # replace float64 by double + retVal = canonicalTypename + retVal = retVal.replace("map", "std::map") + retVal = retVal.replace("vector", "std::vector") + retVal = retVal.replace("set", "std::set") + retVal = retVal.replace("string", "std::string") + #uint32 and uint64 are handled by int32 and uint32 (because search and replace are done as partial words) + retVal = retVal.replace("int32", "int32_t") + retVal = retVal.replace("int64", "int64_t") + retVal = retVal.replace("float32", "float") + retVal = retVal.replace("float64", "double") + retVal = retVal.replace("json", "Json::Value") + return retVal + +def CanonToTs(canonicalTypename): + # TS: replace vector with Array and map with Map + # string remains string + # replace int32... by number + # replace float32... by number + retVal = canonicalTypename + retVal = retVal.replace("map", "Map") + retVal = retVal.replace("vector", "Array") + retVal = retVal.replace("set", "Set") + retVal = retVal.replace("uint32", "number") + retVal = retVal.replace("uint64", "number") + retVal = retVal.replace("int32", "number") + retVal = retVal.replace("int64", "number") + retVal = retVal.replace("float32", "number") + retVal = retVal.replace("float64", "number") + retVal = retVal.replace("bool", "boolean") + retVal = retVal.replace("json", "Object") + return retVal + +def NeedsTsConstruction(enums, tsType): + if tsType == 'boolean': + return False + elif tsType == 'number': + return False + elif tsType == 'string': + return False + else: + enumNames = [] + for enum in enums: + enumNames.append(enum['name']) + if tsType in enumNames: + return False + return True + +def NeedsCppConstruction(canonTypename): + return False + +def DefaultValueToTs(enums, field:FieldDefinition): + tsType = CanonToTs(field.type) + + enumNames = [] + for enum in enums: + enumNames.append(enum['name']) + + if tsType in enumNames: + return tsType + "." + field.defaultValue + else: + return field.defaultValue + +def DefaultValueToCpp(root, enums, field:FieldDefinition): + cppType = CanonToCpp(field.type) + + enumNames = [] + for enum in enums: + enumNames.append(enum['name']) + + if cppType in enumNames: + return root + "::" + cppType + "_" + field.defaultValue + else: + return field.defaultValue + +def RegisterTemplateFunction(template,func): + """Makes a function callable by a jinja2 template""" + template.globals[func.__name__] = func + return func + +def MakeTemplate(templateStr): + template = Template(templateStr) + RegisterTemplateFunction(template,CanonToCpp) + RegisterTemplateFunction(template,CanonToTs) + RegisterTemplateFunction(template,NeedsTsConstruction) + RegisterTemplateFunction(template,NeedsCppConstruction) + RegisterTemplateFunction(template, DefaultValueToTs) + RegisterTemplateFunction(template, DefaultValueToCpp) + return template + +def MakeTemplateFromFile(templateFileName): + + with open(templateFileName, "r") as templateFile: + templateFileContents = templateFile.read() + return MakeTemplate(templateFileContents) + + +def EatToken(sentence): + """splits "A,B,C" into "A" and "B,C" where A, B and C are type names + (including templates) like "int32", "TotoTutu", or + "map>,map>" """ + + if sentence.count("<") != sentence.count(">"): + raise Exception( + "Error in the partial template type list " + str(sentence) + "." + + " The number of < and > do not match!" + ) + + # the template level we're currently in + templateLevel = 0 + for i in range(len(sentence)): + if (sentence[i] == ",") and (templateLevel == 0): + return (sentence[0:i], sentence[i + 1 :]) + elif sentence[i] == "<": + templateLevel += 1 + elif sentence[i] == ">": + templateLevel -= 1 + return (sentence, "") + + +def SplitListOfTypes(typename): + """Splits something like + vector,int32,map> + in: + - vector + - int32 + map> + + This is not possible with a regex so + """ + stillStuffToEat = True + tokenList = [] + restOfString = typename + while stillStuffToEat: + firstToken, restOfString = EatToken(restOfString) + tokenList.append(firstToken) + if restOfString == "": + stillStuffToEat = False + return tokenList + + +templateRegex = \ + re.compile(r"([a-zA-Z0-9_]*[a-zA-Z0-9_]*)<([a-zA-Z0-9_,:<>]+)>") + + +def ParseTemplateType(typename): + """ If the type is a template like "SOMETHING>>", + then it returns (true,"SOMETHING","SOME>") + otherwise it returns (false,"","")""" + + # let's remove all whitespace from the type + # split without argument uses any whitespace string as separator + # (space, tab, newline, return or formfeed) + typename = "".join(typename.split()) + matches = templateRegex.match(typename) + if matches == None: + return (False, "", []) + else: + m = matches + assert len(m.groups()) == 2 + # we need to split with the commas that are outside of the + # defined types. Simply splitting at commas won't work + listOfDependentTypes = SplitListOfTypes(m.group(2)) + return (True, m.group(1), listOfDependentTypes) + +def GetStructFields(struct): + """This filters out the special metadata key from the struct fields""" + return [k for k in struct.keys() if k != '__handler'] + +def ComputeOrderFromTypeTree( + ancestors, + genOrder, + shortTypename, schema): + + if shortTypename in ancestors: + raise Exception( + "Cyclic dependency chain found: the last of " + str(ancestors) + + + " depends on " + str(shortTypename) + " that is already in the list." + ) + + if not (shortTypename in genOrder): + (isTemplate, _, dependentTypenames) = ParseTemplateType(shortTypename) + if isTemplate: + # if it is a template, it HAS dependent types... They can be + # anything (primitive, collection, enum, structs..). + # Let's process them! + for dependentTypename in dependentTypenames: + # childAncestors = ancestors.copy() NO TEMPLATE ANCESTOR!!! + # childAncestors.append(typename) + ComputeOrderFromTypeTree( + ancestors, genOrder, dependentTypename, schema + ) + else: + # If it is not template, we are only interested if it is a + # dependency that we must take into account in the dep graph, + # i.e., a struct. + if IsShortStructType(shortTypename, schema): + struct = schema[GetLongTypename(shortTypename, schema)] + # The keys in the struct dict are the member names + # The values in the struct dict are the member types + if struct: + # we reach this if struct is not None AND not empty + for field in GetStructFields(struct): + # we fill the chain of dependent types (starting here) + ancestors.append(shortTypename) + ComputeOrderFromTypeTree( + ancestors, genOrder, struct[field], schema) + # don't forget to restore it! + ancestors.pop() + + # now we're pretty sure our dependencies have been processed, + # we can start marking our code for generation (it might + # already have been done if someone referenced us earlier) + if not shortTypename in genOrder: + genOrder.append(shortTypename) + +# +-----------------------+ +# | Utility functions | +# +-----------------------+ + +def IsShortStructType(typename, schema): + fullStructName = "struct " + typename + return (fullStructName in schema) + +def GetLongTypename(shortTypename, schema): + if shortTypename.startswith("enum "): + raise RuntimeError('shortTypename.startswith("enum "):') + enumName = "enum " + shortTypename + isEnum = enumName in schema + + if shortTypename.startswith("struct "): + raise RuntimeError('shortTypename.startswith("struct "):') + structName = "struct " + shortTypename + isStruct = ("struct " + shortTypename) in schema + + if isEnum and isStruct: + raise RuntimeError('Enums and structs cannot have the same name') + + if isEnum: + return enumName + if isStruct: + return structName + +def IsTypename(fullName): + return (fullName.startswith("enum ") or fullName.startswith("struct ")) + +def IsEnumType(fullName): + return fullName.startswith("enum ") + +def IsStructType(fullName): + return fullName.startswith("struct ") + +def GetShortTypename(fullTypename): + if fullTypename.startswith("struct "): + return fullTypename[7:] + elif fullTypename.startswith("enum"): + return fullTypename[5:] + else: + raise RuntimeError \ + ('fullTypename should start with either "struct " or "enum "') + +def CheckSchemaSchema(schema): + if not "rootName" in schema: + raise Exception("schema lacks the 'rootName' key") + for name in schema.keys(): + if (not IsEnumType(name)) and (not IsStructType(name)) and \ + (name != 'rootName'): + raise RuntimeError \ + ('Type "' + str(name) + '" should start with "enum " or "struct "') + + # TODO: check enum fields are unique (in whole namespace) + # TODO: check struct fields are unique (in each struct) + # TODO: check that in the source schema, there are spaces after each colon + +nonTypeKeys = ['rootName'] +def GetTypesInSchema(schema): + """Returns the top schema keys that are actual type names""" + typeList = [k for k in schema if k not in nonTypeKeys] + return typeList + +# +-----------------------+ +# | Main processing logic | +# +-----------------------+ + +def ComputeRequiredDeclarationOrder(schema): + # sanity check + CheckSchemaSchema(schema) + + # we traverse the type dependency graph and we fill a queue with + # the required struct types, in a bottom-up fashion, to compute + # the declaration order + # The genOrder list contains the struct full names in the order + # where they must be defined. + # We do not care about the enums here... They do not depend upon + # anything and we'll handle them, in their original declaration + # order, at the start + genOrder = [] + for fullName in GetTypesInSchema(schema): + if IsStructType(fullName): + realName = GetShortTypename(fullName) + ancestors = [] + ComputeOrderFromTypeTree(ancestors, genOrder, realName, schema) + return genOrder + +def GetStructFields(fieldDict): + """Returns the regular (non __handler) struct fields""" + # the following happens for empty structs + if fieldDict == None: + return fieldDict + ret = {} + for k,v in fieldDict.items(): + if k != "__handler": + ret[k] = FieldDefinition.fromKeyValue(k, v) + if k.startswith("__") and k != "__handler": + raise RuntimeError("Fields starting with __ (double underscore) are reserved names!") + return ret + +def GetStructMetadata(fieldDict): + """Returns the __handler struct fields (there are default values that + can be overridden by entries in the schema + Not tested because it's a fail-safe: if something is broken in this, + dependent projects will not build.""" + metadataDict = {} + metadataDict['handleInCpp'] = False + metadataDict['handleInTypescript'] = False + + if fieldDict != None: + for k,v in fieldDict.items(): + if k.startswith("__") and k != "__handler": + raise RuntimeError("Fields starting with __ (double underscore) are reserved names") + if k == "__handler": + if type(v) == list: + for i in v: + if i == "cpp": + metadataDict['handleInCpp'] = True + elif i == "ts": + metadataDict['handleInTypescript'] = True + else: + raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\"") + elif type(v) == str: + if v == "cpp": + metadataDict['handleInCpp'] = True + elif v == "ts": + metadataDict['handleInTypescript'] = True + else: + raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\" (or a list of both)") + else: + raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\" (or a list of both)") + return metadataDict + +def ProcessSchema(schema, genOrder): + # sanity check + CheckSchemaSchema(schema) + + # let's doctor the schema to clean it up a bit + # order DOES NOT matter for enums, even though it's a list + enums = [] + for fullName in schema.keys(): + if IsEnumType(fullName): + # convert "enum Toto" to "Toto" + typename = GetShortTypename(fullName) + enum = {} + enum['name'] = typename + assert(type(schema[fullName]) == list) + enum['fields'] = schema[fullName] # must be a list + enums.append(enum) + + # now that the order has been established, we actually store\ + # the structs in the correct order + # the structs are like: + # example = [ + # { + # "name": "Message1", + # "fields": { + # "someMember":"int32", + # "someOtherMember":"vector" + # } + # }, + # { + # "name": "Message2", + # "fields": { + # "someMember":"int32", + # "someOtherMember22":"vector" + # } + # } + # ] + + structs = [] + for i in range(len(genOrder)): + # this is already the short name + typename = genOrder[i] + fieldDict = schema["struct " + typename] + struct = {} + struct['name'] = typename + struct['fields'] = GetStructFields(fieldDict) + struct['__meta__'] = GetStructMetadata(fieldDict) + structs.append(struct) + + templatingDict = {} + templatingDict['enums'] = enums + templatingDict['structs'] = structs + templatingDict['rootName'] = schema['rootName'] + + return templatingDict + +# +-----------------------+ +# | Write to files | +# +-----------------------+ + +# def WriteStreamsToFiles(rootName: str, genc: Dict[str, StringIO]) \ +# -> None: +# pass + +def LoadSchema(fn): + # latin-1 is a trick, when we do NOT care about NON-ascii chars but + # we wish to avoid using a decoding error handler + # (see http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html#files-in-an-ascii-compatible-encoding-best-effort-is-acceptable) + # TL;DR: all 256 values are mapped to characters in latin-1 so the file + # contents never cause an error. + with open(fn, 'r', encoding='latin-1') as f: + schemaText = f.read() + assert(type(schemaText) == str) + return LoadSchemaFromString(schemaText = schemaText) + +def LoadSchemaFromString(schemaText:str): + # ensure there is a space after each colon. Otherwise, dicts could be + # erroneously recognized as an array of strings containing ':' + for i in range(len(schemaText)-1): + ch = schemaText[i] + nextCh = schemaText[i+1] + if ch == ':': + if not (nextCh == ' ' or nextCh == '\n'): + lineNumber = schemaText.count("\n",0,i) + 1 + raise RuntimeError("Error at line " + str(lineNumber) + " in the schema: colons must be followed by a space or a newline!") + schema = yaml.load(schemaText, Loader = yamlloader.ordereddict.SafeLoader) + return schema + +def GetTemplatingDictFromSchemaFilename(fn): + return GetTemplatingDictFromSchema(LoadSchema(fn)) + +def GetTemplatingDictFromSchema(schema): + genOrder = ComputeRequiredDeclarationOrder(schema) + templatingDict = ProcessSchema(schema, genOrder) + currentDT = datetime.datetime.now() + templatingDict['currentDatetime'] = str(currentDT) + return templatingDict + +# +-----------------------+ +# | ENTRY POINT | +# +-----------------------+ +def Process(schemaFile, outDir): + tdico = GetTemplatingDictFromSchemaFilename(schemaFile) + + tsTemplateFile = \ + os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') + template = MakeTemplateFromFile(tsTemplateFile) + renderedTsCode = template.render(**tdico) + outputTsFile = os.path.join( \ + outDir,str(tdico['rootName']) + "_generated.ts") + with open(outputTsFile,"wt",encoding='utf8') as outFile: + outFile.write(renderedTsCode) + + cppTemplateFile = \ + os.path.join(os.path.dirname(__file__), 'template.in.h.j2') + template = MakeTemplateFromFile(cppTemplateFile) + renderedCppCode = template.render(**tdico) + outputCppFile = os.path.join( \ + outDir, str(tdico['rootName']) + "_generated.hpp") + with open(outputCppFile,"wt",encoding='utf8') as outFile: + outFile.write(renderedCppCode) + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser( + usage="""stonegentool.py [-h] [-o OUT_DIR] [-v] input_schema + EXAMPLE: python stonegentool.py -o "generated_files/" """ + + """ "mainSchema.yaml,App Specific Commands.json" """ + ) + parser.add_argument("input_schema", type=str, \ + help="path to the schema file") + parser.add_argument( + "-o", + "--out_dir", + type=str, + default=".", + help="""path of the directory where the files + will be generated. Default is current + working folder""", + ) + parser.add_argument( + "-v", + "--verbosity", + action="count", + default=0, + help="""increase output verbosity (0 == errors + only, 1 == some verbosity, 2 == nerd + mode""", + ) + + args = parser.parse_args() + schemaFile = args.input_schema + outDir = args.out_dir + Process(schemaFile, outDir) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool_test.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool_test.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,438 @@ +# +# 1 2 3 4 5 6 7 8 +# 345678901234567890123456789012345678901234567890123456789012345678901234567890 +# + +from stonegentool import \ +EatToken,SplitListOfTypes,ParseTemplateType,ProcessSchema, \ +CheckSchemaSchema,LoadSchema,trim,ComputeRequiredDeclarationOrder, \ +GetTemplatingDictFromSchemaFilename,MakeTemplate,MakeTemplateFromFile,LoadSchemaFromString,GetTemplatingDictFromSchema +import unittest +import os +import re +import pprint +from jinja2 import Template + +def RemoveDateTimeLine(s : str): + # regex are non-multiline by default, and $ does NOT match the end of the line + s2 = re.sub(r"^// autogenerated by stonegentool on .*\n","",s) + return s2 + +class TestStonegentool(unittest.TestCase): + def test_EatToken_empty(self): + c = r"" + a,b = EatToken(c) + self.assertEqual(a,r"") + self.assertEqual(b,r"") + + def test_EatToken_simpleNonTemplate(self): + c = r"int32" + a,b = EatToken(c) + self.assertEqual(a,r"int32") + self.assertEqual(b,r"") + + def test_EatToken_simpleTemplate(self): + c = r"vector" + a,b = EatToken(c) + self.assertEqual(a,r"vector") + self.assertEqual(b,r"") + + def test_EatToken_complexTemplate(self): + c = r"vector>,vector>" + a,b = EatToken(c) + self.assertEqual(a,r"vector>") + self.assertEqual(b,r"vector>") + + def test_EatToken_complexTemplates(self): + c = r"vector,map>>,map,map,string>" + a,b = EatToken(c) + self.assertEqual(a,r"vector,map>>") + self.assertEqual(b,r"map,map,string>") + a,b = EatToken(b) + self.assertEqual(a,r"map") + self.assertEqual(b,r"map,string>") + + def test_SplitListOfTypes(self): + c = r"vector,map>>,map,map,string>" + lot = SplitListOfTypes(c) + self.assertEqual(3,len(lot)) + self.assertEqual("vector,map>>",lot[0]) + self.assertEqual("map",lot[1]) + self.assertEqual("map,string>",lot[2]) + + def test_SplitListOfTypes_bogus(self): + c = r"vector,map>,map,map,string" + self.assertRaises(Exception,SplitListOfTypes,c) # the argument c must be passed to assertRaises, not as a normal call of SplitListOfTypes + + def test_ParseTemplateType_true(self): + c = "map>>,map,vector>>" + (ok,a,b) = ParseTemplateType(c) + self.assertEqual(ok,True) + self.assertEqual(a,"map") + self.assertEqual(b,["vector>>","map,vector>"]) + + (ok2,a2,b2) = ParseTemplateType(b[0]) + self.assertEqual(ok2,True) + self.assertEqual(a2,"vector") + self.assertEqual(b2,["map>"]) + + (ok3,a3,b3) = ParseTemplateType(b[1]) + self.assertEqual(ok3,True) + self.assertEqual(a3,"map") + self.assertEqual(b3,["vector","vector"]) + + (ok4,a4,b4) = ParseTemplateType(b2[0]) + self.assertEqual(ok4,True) + self.assertEqual(a4,"map") + self.assertEqual(b4,["int","vector"]) + + def test_ParseSchema(self): + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + obj = LoadSchema(fn) + # we're happy if it does not crash :) + CheckSchemaSchema(obj) + + def test_ComputeRequiredDeclarationOrder(self): + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + obj = LoadSchema(fn) + genOrder: str = ComputeRequiredDeclarationOrder(obj) + self.assertEqual(5,len(genOrder)) + self.assertEqual("A",genOrder[0]) + self.assertEqual("B",genOrder[1]) + self.assertEqual("C",genOrder[2]) + self.assertEqual("Message1",genOrder[3]) + self.assertEqual("Message2",genOrder[4]) + + # def test_GeneratePreambleEnumerationAndStructs(self): + # fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') + # obj = LoadSchema(fn) + # (_,genc,_) = ProcessSchema(obj) + + def test_genEnums(self): + self.maxDiff = None + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + obj = LoadSchema(fn) + genOrder: str = ComputeRequiredDeclarationOrder(obj) + processedSchema = ProcessSchema(obj, genOrder) + self.assertTrue('rootName' in processedSchema) + + structs = {} + for v in processedSchema['structs']: + structs[v['name']] = v + enums = {} + for v in processedSchema['enums']: + enums[v['name']] = v + + self.assertTrue('C' in structs) + self.assertTrue('someBs' in structs['C']['fields']) + self.assertTrue('CrispType' in enums) + self.assertTrue('Message1' in structs) + self.assertEqual('int32', structs['Message1']['fields']['memberInt32'].type) + self.assertEqual('string', structs['Message1']['fields']['memberString'].type) + self.assertEqual('EnumMonth0', structs['Message1']['fields']['memberEnumMonth'].type) + self.assertEqual('bool', structs['Message1']['fields']['memberBool'].type) + self.assertEqual('float32', structs['Message1']['fields']['memberFloat32'].type) + self.assertEqual('float64', structs['Message1']['fields']['memberFloat64'].type) + + def test_GenerateTypeScriptEnums(self): + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + tdico = GetTemplatingDictFromSchemaFilename(fn) + template = Template(""" // end of generic methods +{% for enum in enums%} export enum {{enum['name']}} { +{% for key in enum['fields']%} {{key}}, +{%endfor%} }; + +{%endfor%}""") + renderedCode = template.render(**tdico) + renderedCodeRef = """ // end of generic methods + export enum MovieType { + RomCom, + Horror, + ScienceFiction, + Vegetables, + }; + + export enum CrispType { + SaltAndPepper, + CreamAndChives, + Paprika, + Barbecue, + }; + + export enum EnumMonth0 { + January, + February, + March, + }; + +""" + self.assertEqual(renderedCodeRef,renderedCode) + + def test_GenerateCplusplusEnums(self): + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + tdico = GetTemplatingDictFromSchemaFilename(fn) + template = Template(""" // end of generic methods +{% for enum in enums%} enum {{enum['name']}} { +{% for key in enum['fields']%} {{key}}, +{%endfor%} }; + +{%endfor%}""") + renderedCode = template.render(**tdico) + renderedCodeRef = """ // end of generic methods + enum MovieType { + RomCom, + Horror, + ScienceFiction, + Vegetables, + }; + + enum CrispType { + SaltAndPepper, + CreamAndChives, + Paprika, + Barbecue, + }; + + enum EnumMonth0 { + January, + February, + March, + }; + +""" + self.assertEqual(renderedCodeRef,renderedCode) + + def test_generateTsStructType(self): + fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + tdico = GetTemplatingDictFromSchemaFilename(fn) + +# template = MakeTemplate(""" // end of generic methods +# {% for struct in struct%} export class {{struct['name']}} { +# {% for key in struct['fields']%} {{key}}:{{struct['fields'][key]}}, +# {% endfor %} +# constructor() { +# {% for key in struct['fields']%} +# {% if NeedsConstruction(struct['fields']['key'])} +# {{key}} = new {{CanonToTs(struct['fields']['key'])}}; +# {% end if %} +# {% endfor %} +# } +# {% endfor %} +# public StoneSerialize(): string { +# let container: object = {}; +# container['type'] = '{{rootName}}.{{struct['name']}}'; +# container['value'] = this; +# return JSON.stringify(container); +# } };""") + template = MakeTemplate(""" // end of generic methods +{% for struct in structs%} export class {{struct['name']}} { +{% for key in struct['fields']%} {{key}}:{{CanonToTs(struct['fields'][key]['type'])}}; +{% endfor %} + constructor() { +{% for key in struct['fields']%} this.{{key}} = new {{CanonToTs(struct['fields'][key]['type'])}}(); +{% endfor %} } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = '{{rootName}}.{{struct['name']}}'; + container['value'] = this; + return JSON.stringify(container); + } + }; + +{% endfor %}""") + renderedCode = template.render(**tdico) + renderedCodeRef = """ // end of generic methods + export class A { + someStrings:Array; + someInts2:Array; + movies:Array; + + constructor() { + this.someStrings = new Array(); + this.someInts2 = new Array(); + this.movies = new Array(); + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'TestStoneCodeGen.A'; + container['value'] = this; + return JSON.stringify(container); + } + }; + + export class B { + someAs:Array; + someInts:Array; + + constructor() { + this.someAs = new Array(); + this.someInts = new Array(); + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'TestStoneCodeGen.B'; + container['value'] = this; + return JSON.stringify(container); + } + }; + + export class C { + someBs:Array; + ddd:Array; + + constructor() { + this.someBs = new Array(); + this.ddd = new Array(); + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'TestStoneCodeGen.C'; + container['value'] = this; + return JSON.stringify(container); + } + }; + + export class Message1 { + memberInt32:number; + memberString:string; + memberEnumMonth:EnumMonth0; + memberBool:boolean; + memberFloat32:number; + memberFloat64:number; + + constructor() { + this.memberInt32 = new number(); + this.memberString = new string(); + this.memberEnumMonth = new EnumMonth0(); + this.memberBool = new boolean(); + this.memberFloat32 = new number(); + this.memberFloat64 = new number(); + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'TestStoneCodeGen.Message1'; + container['value'] = this; + return JSON.stringify(container); + } + }; + + export class Message2 { + memberString:string; + memberStringWithDefault:string; + memberVectorOfMessage1:Array; + memberVectorOfString:Array; + memberMapStringString:Map; + memberMapStringStruct:Map; + memberMapEnumFloat:Map; + memberEnumMovieType:MovieType; + memberJson:Object; + + constructor() { + this.memberString = new string(); + this.memberStringWithDefault = new string(); + this.memberVectorOfMessage1 = new Array(); + this.memberVectorOfString = new Array(); + this.memberMapStringString = new Map(); + this.memberMapStringStruct = new Map(); + this.memberMapEnumFloat = new Map(); + this.memberEnumMovieType = new MovieType(); + this.memberJson = new Object(); + } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = 'TestStoneCodeGen.Message2'; + container['value'] = this; + return JSON.stringify(container); + } + }; + +""" + # print(renderedCode) + self.maxDiff = None + self.assertEqual(renderedCodeRef, renderedCode) + + def test_generateWholeTsFile(self): + schemaFile = \ + os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') + tdico = GetTemplatingDictFromSchemaFilename(schemaFile) + tsTemplateFile = \ + os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') + template = MakeTemplateFromFile(tsTemplateFile) + renderedCode = template.render(**tdico) + print(renderedCode) + + def test_GenerateTypeScriptHandlerInterface(self): + pass + + def test_GenerateCppHandlerInterface(self): + pass + + def test_GenerateTypeScriptDispatcher(self): + pass + + def test_GenerateCppDispatcher(self): + pass + + def test_StringDefaultValueInTs(self): + schema = LoadSchemaFromString(""" + rootName: MyTest + struct Toto: + withoutDefault: string + withDefault: string = \"tutu\" + """) + tdico = GetTemplatingDictFromSchema(schema) + + tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') + template = MakeTemplateFromFile(tsTemplateFile) + renderedCode = template.render(**tdico) + self.assertIn("withDefault = \"tutu\"", renderedCode) + # print(renderedCode) + + cppTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.h.j2') + template = MakeTemplateFromFile(cppTemplateFile) + renderedCode = template.render(**tdico) + print(renderedCode) + self.assertIn("withDefault = \"tutu\"", renderedCode) + + + def test_EnumDefaultValue(self): + schema = LoadSchemaFromString(""" + rootName: MyTest + enum MyEnum: + - Toto + - Tutu + struct Toto: + withoutDefault: MyEnum + withDefault: MyEnum = Toto + """) + tdico = GetTemplatingDictFromSchema(schema) + + tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') + template = MakeTemplateFromFile(tsTemplateFile) + renderedCode = template.render(**tdico) + # print(renderedCode) + self.assertIn("withDefault = MyEnum.Toto", renderedCode) + + tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.h.j2') + template = MakeTemplateFromFile(tsTemplateFile) + renderedCode = template.render(**tdico) + self.assertIn("withDefault = MyTest::MyEnum_Toto", renderedCode) + # print(renderedCode) + + +# def test(self): +# s = 'hello world' +# self.assertEqual(s.split(), ['hello', 'world']) +# # check that s.split fails when the separator is not a string +# with self.assertRaises(TypeError): +# s.split(2) + +if __name__ == '__main__': + unittest.main() + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.h.j2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.h.j2 Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,551 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 + +Generated on {{currentDatetime}} by stonegentool + +*/ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +//#define STONEGEN_NO_CPP11 1 + +#ifdef STONEGEN_NO_CPP11 +#define StoneSmartPtr std::unique_ptr +#else +#define StoneSmartPtr std::unique_ptr +#endif + +namespace {{rootName}} +{ + /** Throws in case of problem */ + inline void _StoneDeserializeValue(int32_t& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asInt(); + } + } + + inline Json::Value _StoneSerializeValue(int32_t value) + { + Json::Value result(value); + return result; + } + + inline void _StoneDeserializeValue(int64_t& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asInt64(); + } + } + + inline Json::Value _StoneSerializeValue(int64_t value) + { + Json::Value result(static_cast(value)); + return result; + } + + inline void _StoneDeserializeValue(uint32_t& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asUInt(); + } + } + + inline Json::Value _StoneSerializeValue(uint32_t value) + { + Json::Value result(value); + return result; + } + + inline void _StoneDeserializeValue(uint64_t& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asUInt64(); + } + } + + inline Json::Value _StoneSerializeValue(uint64_t value) + { + Json::Value result(static_cast(value)); + return result; + } + + inline void _StoneDeserializeValue(Json::Value& destValue, const Json::Value& jsonValue) + { + destValue = jsonValue; + } + + inline Json::Value _StoneSerializeValue(Json::Value value) + { + return value; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue(double& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asDouble(); + } + } + + inline Json::Value _StoneSerializeValue(double value) + { + Json::Value result(value); + return result; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue(float& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asFloat(); + } + } + + inline Json::Value _StoneSerializeValue(float value) + { + Json::Value result(value); + return result; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue(bool& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asBool(); + } + } + + inline Json::Value _StoneSerializeValue(bool value) + { + Json::Value result(value); + return result; + } + + /** Throws in case of problem */ + inline void _StoneDeserializeValue( + std::string& destValue + , const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue = jsonValue.asString(); + } + } + + inline Json::Value _StoneSerializeValue(const std::string& value) + { + // the following is better than + Json::Value result(value.data(),value.data()+value.size()); + return result; + } + + inline std::string MakeIndent(size_t indent) + { + char* txt = reinterpret_cast(malloc(indent+1)); // NO EXCEPTION BELOW!!!!!!!!!!!! + for(size_t i = 0; i < indent; ++i) + txt[i] = ' '; + txt[indent] = 0; + std::string retVal(txt); + free(txt); // NO EXCEPTION ABOVE !!!!!!!!!! + return retVal; + } + + // generic dumper + template + std::ostream& StoneDumpValue(std::ostream& out, const T& value, size_t indent) + { + out << MakeIndent(indent) << value; + return out; + } + + // string dumper + inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, size_t indent) + { + out << MakeIndent(indent) << "\"" << value << "\""; + return out; + } + + inline std::string ToString(const std::string& str) + { + return str; + } + + inline void FromString(std::string& value, std::string strValue) + { + value = strValue; + } + + + /** Throws in case of problem */ + template + void _StoneDeserializeValue( + std::map& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + destValue.clear(); + for ( + Json::Value::const_iterator itr = jsonValue.begin(); + itr != jsonValue.end(); + itr++) + { + std::string strKey; + _StoneDeserializeValue(strKey, itr.key()); + TK key; + FromString(key, strKey); // if you have a compile error here, it means that your type is not suitable to be the key of a map (or you should overwrite the FromString/ToString in template.in.h.j2) + + TV innerDestValue; + _StoneDeserializeValue(innerDestValue, *itr); + + destValue[key] = innerDestValue; + } + } + } + + template + Json::Value _StoneSerializeValue(const std::map& value) + { + Json::Value result(Json::objectValue); + + for (typename std::map::const_iterator it = value.cbegin(); + it != value.cend(); ++it) + { + // it->first it->second + result[ToString(it->first)] = _StoneSerializeValue(it->second); + } + return result; + } + + template + std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, size_t indent) + { + out << MakeIndent(indent) << "{\n"; + for (typename std::map::const_iterator it = value.cbegin(); + it != value.cend(); ++it) + { + out << MakeIndent(indent+2) << "\"" << it->first << "\" : "; + StoneDumpValue(out, it->second, indent+2); + out << ", \n"; + } + out << MakeIndent(indent) << "}\n"; + return out; + } + + /** Throws in case of problem */ + template + void _StoneDeserializeValue( + std::vector& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull() && jsonValue.isArray()) + { + destValue.clear(); + destValue.reserve(jsonValue.size()); + for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) + { + T innerDestValue; + _StoneDeserializeValue(innerDestValue, jsonValue[i]); + destValue.push_back(innerDestValue); + } + } + } + + template + Json::Value _StoneSerializeValue(const std::vector& value) + { + Json::Value result(Json::arrayValue); + for (size_t i = 0; i < value.size(); ++i) + { + result.append(_StoneSerializeValue(value[i])); + } + return result; + } + + template + std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, size_t indent) + { + out << MakeIndent(indent) << "[\n"; + for (size_t i = 0; i < value.size(); ++i) + { + StoneDumpValue(out, value[i], indent+2); + out << ", \n"; + } + out << MakeIndent(indent) << "]\n"; + return out; + } + + /** Throws in case of problem */ + template + void _StoneDeserializeValue( + std::set& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull() && jsonValue.isArray()) + { + destValue.clear(); + for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) + { + T innerDestValue; + _StoneDeserializeValue(innerDestValue, jsonValue[i]); + destValue.insert(innerDestValue); + } + } + } + + template + Json::Value _StoneSerializeValue(const std::set& value) + { + Json::Value result(Json::arrayValue); + for (typename std::set::const_iterator it = value.begin(); it != value.end(); ++it) + { + result.append(_StoneSerializeValue(*it)); + } + return result; + } + + template + std::ostream& StoneDumpValue(std::ostream& out, const std::set& value, size_t indent) + { + out << MakeIndent(indent) << "[\n"; + for (typename std::set::const_iterator it = value.begin(); it != value.end(); ++it) + { + StoneDumpValue(out, *it, indent+2); + out << ", \n"; + } + out << MakeIndent(indent) << "]\n"; + return out; + } + + inline void StoneCheckSerializedValueTypeGeneric(const Json::Value& value) + { + if ((!value.isMember("type")) || (!value["type"].isString())) + { + std::stringstream ss; + ss << "Cannot deserialize value ('type' key invalid)"; + throw std::runtime_error(ss.str()); + } + } + + inline void StoneCheckSerializedValueType( + const Json::Value& value, std::string typeStr) + { + StoneCheckSerializedValueTypeGeneric(value); + + std::string actTypeStr = value["type"].asString(); + if (actTypeStr != typeStr) + { + std::stringstream ss; + ss << "Cannot deserialize type" << actTypeStr + << "into " << typeStr; + throw std::runtime_error(ss.str()); + } + } + + // end of generic methods + +// end of generic methods +{% for enum in enums%} + enum {{enum['name']}} { +{% for key in enum['fields']%} {{enum['name']}}_{{key}}, +{%endfor%} }; + + inline std::string ToString(const {{enum['name']}}& value) + { +{% for key in enum['fields']%} if( value == {{enum['name']}}_{{key}}) + { + return std::string("{{key}}"); + } +{%endfor%} std::stringstream ss; + ss << "Value \"" << value << "\" cannot be converted to {{enum['name']}}. Possible values are: " +{% for key in enum['fields']%} << " {{key}} = " << static_cast({{enum['name']}}_{{key}}) << ", " +{% endfor %} << std::endl; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + inline void FromString({{enum['name']}}& value, std::string strValue) + { +{% for key in enum['fields']%} if( strValue == std::string("{{key}}") ) + { + value = {{enum['name']}}_{{key}}; + return; + } +{%endfor%} + std::stringstream ss; + ss << "String \"" << strValue << "\" cannot be converted to {{enum['name']}}. Possible values are: {% for key in enum['fields']%}{{key}} {% endfor %}"; + std::string msg = ss.str(); + throw std::runtime_error(msg); + } + + + inline void _StoneDeserializeValue( + {{enum['name']}}& destValue, const Json::Value& jsonValue) + { + if (!jsonValue.isNull()) + { + FromString(destValue, jsonValue.asString()); + } + } + + inline Json::Value _StoneSerializeValue(const {{enum['name']}}& value) + { + std::string strValue = ToString(value); + return Json::Value(strValue); + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const {{enum['name']}}& value, size_t indent = 0) + { +{% for key in enum['fields']%} if( value == {{enum['name']}}_{{key}}) + { + out << MakeIndent(indent) << "{{key}}"; + } +{%endfor%} return out; + } + +{%endfor%} +{% for struct in structs%} +#ifdef _MSC_VER +#pragma region {{struct['name']}} +#endif //_MSC_VER + + struct {{struct['name']}} + { +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields'] %} {{CanonToCpp(struct['fields'][key]['type'])}} {{key}}; +{% endfor %}{% endif %}{% endif %} + {{struct['name']}}({% if struct %}{% if struct['fields'] %}{% for key in struct['fields'] %}{{CanonToCpp(struct['fields'][key]['type'])}} {{key}} = {% if struct['fields'][key]['defaultValue'] %}{{DefaultValueToCpp(rootName,enums,struct['fields'][key])}} {%else%} {{CanonToCpp(struct['fields'][key]['type'])}}() {%endif%} {{ ", " if not loop.last }}{% endfor %}{% endif %}{% endif %}) + { +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} this->{{key}} = {{key}}; +{% endfor %}{% endif %}{% endif %} } + }; + + inline void _StoneDeserializeValue({{struct['name']}}& destValue, const Json::Value& value) + { + if (!value.isNull()) + { +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} _StoneDeserializeValue(destValue.{{key}}, value["{{key}}"]); +{% endfor %}{% endif %}{% endif %} } + } + + inline Json::Value _StoneSerializeValue(const {{struct['name']}}& value) + { + Json::Value result(Json::objectValue); +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} result["{{key}}"] = _StoneSerializeValue(value.{{key}}); +{% endfor %}{% endif %}{% endif %} + return result; + } + + inline std::ostream& StoneDumpValue(std::ostream& out, const {{struct['name']}}& value, size_t indent = 0) + { + out << MakeIndent(indent) << "{\n"; +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} out << MakeIndent(indent+2) << "{{key}}: "; + StoneDumpValue(out, value.{{key}},indent+2); + out << ", \n"; +{% endfor %}{% endif %}{% endif %} + out << MakeIndent(indent) << "}"; + return out; + } + + inline void StoneDeserialize({{struct['name']}}& destValue, const Json::Value& value) + { + StoneCheckSerializedValueType(value, "{{rootName}}.{{struct['name']}}"); + _StoneDeserializeValue(destValue, value["value"]); + } + + inline Json::Value StoneSerializeToJson(const {{struct['name']}}& value) + { + Json::Value result(Json::objectValue); + result["type"] = "{{rootName}}.{{struct['name']}}"; + result["value"] = _StoneSerializeValue(value); + return result; + } + + inline std::string StoneSerialize(const {{struct['name']}}& value) + { + Json::Value resultJson = StoneSerializeToJson(value); + std::string resultStr = resultJson.toStyledString(); + return resultStr; + } + +#ifdef _MSC_VER +#pragma endregion {{struct['name']}} +#endif //_MSC_VER +{% endfor %} +#ifdef _MSC_VER +#pragma region Dispatching code +#endif //_MSC_VER + + class IHandler + { + public: +{% for struct in structs%}{% if struct['__meta__'].handleInCpp %} virtual bool Handle(const {{struct['name']}}& value) = 0; +{% endif %}{% endfor %} }; + + /** Service function for StoneDispatchToHandler */ + inline bool StoneDispatchJsonToHandler( + const Json::Value& jsonValue, IHandler* handler) + { + StoneCheckSerializedValueTypeGeneric(jsonValue); + std::string type = jsonValue["type"].asString(); + if (type == "") + { + // this should never ever happen + throw std::runtime_error("Caught empty type while dispatching"); + } +{% for struct in structs%}{% if struct['__meta__'].handleInCpp %} else if (type == "{{rootName}}.{{struct['name']}}") + { + {{struct['name']}} value; + _StoneDeserializeValue(value, jsonValue["value"]); + return handler->Handle(value); + } +{% endif %}{% endfor %} else + { + return false; + } + } + + /** Takes a serialized type and passes this to the handler */ + inline bool StoneDispatchToHandler(std::string strValue, IHandler* handler) + { + Json::Value readValue; + + Json::CharReaderBuilder builder; + Json::CharReader* reader = builder.newCharReader(); + + StoneSmartPtr ptr(reader); + + std::string errors; + + bool ok = reader->parse( + strValue.c_str(), + strValue.c_str() + strValue.size(), + &readValue, + &errors + ); + if (!ok) + { + std::stringstream ss; + ss << "Jsoncpp parsing error: " << errors; + throw std::runtime_error(ss.str()); + } + return StoneDispatchJsonToHandler(readValue, handler); + } + +#ifdef _MSC_VER +#pragma endregion Dispatching code +#endif //_MSC_VER +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.ts.j2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.ts.j2 Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,136 @@ +/* + 1 2 3 4 5 6 7 +12345678901234567890123456789012345678901234567890123456789012345678901234567890 + +Generated on {{currentDatetime}} by stonegentool + +*/ + +function StoneCheckSerializedValueType(value: any, typeStr: string) +{ + StoneCheckSerializedValueTypeGeneric(value); + + if (value['type'] != typeStr) + { + throw new Error( + `Cannot deserialize type ${value['type']} into ${typeStr}`); + } +} + +function isString(val: any) :boolean +{ + return ((typeof val === 'string') || (val instanceof String)); +} + +function StoneCheckSerializedValueTypeGeneric(value: any) +{ + // console.//log("+-------------------------------------------------+"); + // console.//log("| StoneCheckSerializedValueTypeGeneric |"); + // console.//log("+-------------------------------------------------+"); + // console.//log("value = "); + // console.//log(value); + if ( (!('type' in value)) || (!isString(value.type)) ) + { + throw new Error( + "Cannot deserialize value ('type' key invalid)"); + } +} + +// end of generic methods +{% for enum in enums%} +export enum {{enum['name']}} { +{% for key in enum['fields']%} {{key}} = "{{key}}"{% if not loop.last %},{%endif%} +{%endfor%}}; + +export function {{enum['name']}}_FromString(strValue:string) : {{enum['name']}} +{ +{% for key in enum['fields'] %} if( strValue == "{{key}}" ) + { + return {{enum['name']}}.{{key}}; + } +{%endfor%} + let msg : string = `String ${strValue} cannot be converted to {{enum['name']}}. Possible values are: {% for key in enum['fields']%}{{key}}{% if not loop.last %}, {%endif%}{% endfor %}`; + throw new Error(msg); +} + +export function {{enum['name']}}_ToString(value:{{enum['name']}}) : string +{ +{% for key in enum['fields'] %} if( value == {{enum['name']}}.{{key}} ) + { + return "{{key}}"; + } +{%endfor%} + let msg : string = `Value ${value} cannot be converted to {{enum['name']}}. Possible values are: `; +{% for key in enum['fields']%} { + let _{{key}}_enumValue : string = {{enum['name']}}.{{key}}; // enums are strings in stonecodegen, so this will work. + let msg_{{key}} : string = `{{key}} (${_{{key}}_enumValue}){% if not loop.last %}, {%endif%}`; + msg = msg + msg_{{key}}; + } +{%endfor%} throw new Error(msg); +} +{%endfor%} + + +{% for struct in structs%}export class {{struct['name']}} { +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} {{key}}:{{CanonToTs(struct['fields'][key]['type'])}}; +{% endfor %}{% endif %}{% endif %} + constructor() { +{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%}{% if NeedsTsConstruction(enums,CanonToTs(struct['fields'][key]['type'])) %} this.{{key}} = new {{CanonToTs(struct['fields'][key]['type'])}}(); +{% endif %} +{% if struct['fields'][key]['defaultValue'] %} this.{{key}} = {{DefaultValueToTs(enums,struct['fields'][key])}}; +{% endif %}{% endfor %}{% endif %}{% endif %} } + + public StoneSerialize(): string { + let container: object = {}; + container['type'] = '{{rootName}}.{{struct['name']}}'; + container['value'] = this; + return JSON.stringify(container); + } + + public static StoneDeserialize(valueStr: string) : {{struct['name']}} + { + let value: any = JSON.parse(valueStr); + StoneCheckSerializedValueType(value, '{{rootName}}.{{struct['name']}}'); + let result: {{struct['name']}} = value['value'] as {{struct['name']}}; + return result; + } +} +{% endfor %} +export interface IHandler { +{% for struct in structs%}{% if struct['__meta__'].handleInTypescript %} Handle{{struct['name']}}(value: {{struct['name']}}): boolean; +{% endif %}{% endfor %}}; + +/** Service function for StoneDispatchToHandler */ +export function StoneDispatchJsonToHandler( + jsonValue: any, handler: IHandler): boolean +{ + StoneCheckSerializedValueTypeGeneric(jsonValue); + let type: string = jsonValue["type"]; + if (type == "") + { + // this should never ever happen + throw new Error("Caught empty type while dispatching"); + } +{% for struct in structs%}{% if struct['__meta__'].handleInTypescript %} else if (type == "{{rootName}}.{{struct['name']}}") + { + let value = jsonValue["value"] as {{struct['name']}}; + return handler.Handle{{struct['name']}}(value); + } +{% endif %}{% endfor %} else + { + return false; + } +} + +/** Takes a serialized type and passes this to the handler */ +export function StoneDispatchToHandler( + strValue: string, handler: IHandler): boolean +{ + // console.//log("+------------------------------------------------+"); + // console.//log("| StoneDispatchToHandler |"); + // console.//log("+------------------------------------------------+"); + // console.//log("strValue = "); + // console.//log(strValue); + let jsonValue: any = JSON.parse(strValue) + return StoneDispatchJsonToHandler(jsonValue, handler); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 2.8) + +project(testCppHandler) + +set(testCppHandler_Codegen_Deps + ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml + ${CMAKE_CURRENT_LIST_DIR}/../template.in.h.j2 +) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/VsolMessages_generated.hpp + COMMAND python ${CMAKE_CURRENT_LIST_DIR}/../stonegentool.py -o ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml + DEPENDS ${testCppHandler_Codegen_Deps} +) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake) +conan_basic_setup() + +add_executable(testCppHandler main.cpp ${CMAKE_CURRENT_BINARY_DIR}/VsolMessages_generated.hpp ${testCppHandler_Codegen_Deps}) + +target_include_directories(testCppHandler PUBLIC ${CMAKE_BINARY_DIR}) + +conan_target_link_libraries(testCppHandler) + +set_property(TARGET testCppHandler PROPERTY CXX_STANDARD 17) + +install(TARGETS testCppHandler DESTINATION bin) + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/README.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,34 @@ +Requirements +============== +- Install Python 3.x (tested with 3.7) +- Install conan with `pip install conan` (tested with 1.12.2) +- Install CMake (tested with 3.12) +- Under Windows: Visual Studio 2017 +- Under *nix*: Ninja + +How to build under *nix* +=============================== +- Navigate to `testCppHandler` folder +- `conan install . -g cmake` +- `mkdir build` +- `cd build` +- `cmake -G "Ninja" ..` +- `cmake --build . --config Debug` or - `cmake --build . --config Release` + +How to build under Windows with Visual Studio +============================================== +- Navigate to repo root +- `mkdir build` +- `cd build` +- `conan install .. -g cmake_multi -s build_type=Release` +- `conan install .. -g cmake_multi -s build_type=Debug` +- `cmake -G "Visual Studio 15 2017 Win64" ..` (modify for your current Visual Studio version) +- `cmake --build . --config Debug` or - `cmake --build . --config Release` + +How to execute the test +======================= +- `cd test_data && testCppHandler --pattern=*.json` + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/conanfile.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/conanfile.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,4 @@ +[requires] +jsoncpp/1.8.4@theirix/stable +gtest/1.8.1@bincrafters/stable +boost/1.69.0@conan/stable diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/main.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,160 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include +#include +#include +#include +using namespace std; +namespace fs = std::filesystem; + +#include +using namespace boost::program_options; + +#include "TestStoneCodeGen_generated.hpp" + +/** +Transforms `str` by replacing occurrences of `oldStr` with `newStr`, using +plain text (*not* regular expressions.) +*/ +static inline void ReplaceInString( + string& str, + const std::string& oldStr, + const std::string& newStr) +{ + std::string::size_type pos = 0u; + while ((pos = str.find(oldStr, pos)) != std::string::npos) { + str.replace(pos, oldStr.length(), newStr); + pos += newStr.length(); + } +} + +string SlurpFile(const string& fileName) +{ + ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate); + + ifstream::pos_type fileSize = ifs.tellg(); + ifs.seekg(0, ios::beg); + + vector bytes(fileSize); + ifs.read(bytes.data(), fileSize); + + return string(bytes.data(), fileSize); +} + +class MyHandler : public TestStoneCodeGen::IHandler +{ +public: + virtual bool Handle(const TestStoneCodeGen::A& value) override + { + TestStoneCodeGen::StoneDumpValue(cout, value); + return true; + } + virtual bool Handle(const TestStoneCodeGen::B& value) override + { + TestStoneCodeGen::StoneDumpValue(cout, value); + return true; + } + virtual bool Handle(const TestStoneCodeGen::C& value) override + { + TestStoneCodeGen::StoneDumpValue(cout, value); + return true; + } + virtual bool Handle(const TestStoneCodeGen::Message1& value) override + { + TestStoneCodeGen::StoneDumpValue(cout, value); + return true; + } + virtual bool Handle(const TestStoneCodeGen::Message2& value) override + { + TestStoneCodeGen::StoneDumpValue(cout, value); + return true; + } +}; + +template +void ProcessPath(T filePath) +{ + cout << "+--------------------------------------------+\n"; + cout << "| Processing: " << filePath.path().string() << "\n"; + cout << "+--------------------------------------------+\n"; + MyHandler handler; + auto contents = SlurpFile(filePath.path().string()); + TestStoneCodeGen::StoneDispatchToHandler(contents, &handler); +} + +int main(int argc, char** argv) +{ + try + { + + options_description desc("Allowed options"); + desc.add_options() + // First parameter describes option name/short name + // The second is parameter to option + // The third is description + ("help,h", "print usage message") + ("pattern,p", value(), "pattern for input") + ; + + variables_map vm; + store(parse_command_line(argc, argv, desc), vm); + + if (vm.count("help")) + { + cout << desc << "\n"; + return 0; + } + + notify(vm); + + string pattern = vm["pattern"].as(); + + // tranform globbing pattern into regex + // we should deal with -, ., *... + string regexPatternStr = pattern; + cout << "Pattern is: " << regexPatternStr << endl; + ReplaceInString(regexPatternStr, "\\", "\\\\"); + ReplaceInString(regexPatternStr, "-", "\\-"); + ReplaceInString(regexPatternStr, ".", "\\."); + ReplaceInString(regexPatternStr, "*", ".*"); + ReplaceInString(regexPatternStr, "?", "."); + cout << "Corresponding regex is: " << regexPatternStr << endl; + + regex regexPattern(regexPatternStr); + + for (auto& p : fs::directory_iterator(".")) + { + auto fileName = p.path().filename().string(); + if (regex_match(fileName, regexPattern)) + { + ProcessPath(p); + } + } + return 0; + + + } + catch (exception& e) + { + cerr << e.what() << "\n"; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/test_data/test_Message2.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/test_data/test_Message2.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,47 @@ +{ + "type": "TestStoneCodeGen.Message2", + "value": { + "memberVectorOfMessage1": [ + { + "memberInt32": 42, + "memberString": "Benjamin", + "memberEnumMonth": "January", + "memberBool": false, + "memberFloat32": 0.1, + "memberFloat64": -0.2 + }, + { + "memberInt32": 43, + "memberString": "Sandrine", + "memberEnumMonth": "March" + } + ], + "memberVectorOfString": [ + "Mercadet", + "Poisson" + ], + "memberMapStringString": { + "44": "key 44", + "45": "key 45" + }, + "memberMapStringStruct": { + "54": { + "memberInt32": 43, + "memberString": "Sandrine", + "memberEnumMonth": "March" + }, + "55": { + "memberInt32": 42, + "memberString": "Benjamin", + "memberEnumMonth": "January", + "memberBool": false + } + }, + "memberString": "Prout zizi", + "memberMapEnumFloat" : { + "SaltAndPepper" : 0.1, + "CreamAndChives" : -0.2 + }, + "memberJson" : {"custom-key": "custom-value"} + } +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 2.8) + +project(testWasmIntegratedCpp) + +set(WASM_FLAGS "-s WASM=1 -O0 -g0") +set(WASM_MODULE_NAME "TestWasmIntegratedModule" CACHE STRING "Name of the WebAssembly module") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${CMAKE_CURRENT_LIST_DIR}/DefaultLibrary.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0 -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=536870912 -s TOTAL_STACK=128000000") # 512MB + resize + +add_definitions(-DORTHANC_ENABLE_WASM=1) + +set(testWasmIntegratedCpp_Codegen_Deps + ${CMAKE_CURRENT_LIST_DIR}/testWasmIntegratedCpp_api.yaml + ${CMAKE_CURRENT_LIST_DIR}/../template.in.h.j2 + ${CMAKE_CURRENT_LIST_DIR}/../template.in.ts.j2 +) + +set(jsoncppRootDir ${CMAKE_CURRENT_LIST_DIR}/jsoncpp-1.8.4) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.hpp ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.ts + COMMAND python3 ${CMAKE_CURRENT_LIST_DIR}/../stonegentool.py -o ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml + DEPENDS ${testCppHandler_Codegen_Deps} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml +) + +add_executable(testWasmIntegratedCpp + main.cpp + ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.hpp + ${jsoncppRootDir}/jsoncpp.cpp + ${testCppHandler_Codegen_Deps}) + +target_include_directories(testWasmIntegratedCpp PUBLIC ${CMAKE_BINARY_DIR}) +target_include_directories(testWasmIntegratedCpp PUBLIC ${jsoncppRootDir}) + +set_property(TARGET testWasmIntegratedCpp PROPERTY CXX_STANDARD 11) + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/DefaultLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/DefaultLibrary.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,15 @@ +// this file contains the JS method you want to expose to C++ code + +mergeInto(LibraryManager.library, { + // each time the Application updates its status, it may signal it through this method. i.e, to change the status of a button in the web interface + // It needs to be put in this file so that the emscripten SDK linker knows where to find it. + SendFreeTextFromCppJS: function(statusUpdateMessage) { + var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); + window.SendFreeTextFromCpp(statusUpdateMessage_); + }, + SendMessageFromCppJS: function(statusUpdateMessage) { + var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); + window.SendMessageFromCpp(statusUpdateMessage_); + } +}); + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build-web.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build-web.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,31 @@ +#!/bin/bash +set -e + +mkdir -p build-final + +# compile TS to JS +tsc --module commonjs --sourceMap -t ES2015 --outDir "build-tsc/" build-wasm/TestStoneCodeGen_generated.ts testWasmIntegrated.ts + +# bundle JS files to final build dir +browserify "build-tsc/build-wasm/testWasmIntegratedCpp_generated.js" "build-tsc/testWasmIntegrated.js" -o "build-final/testWasmIntegratedApp.js" + +# copy WASM loader JS file to final build dir +cp build-wasm/testWasmIntegratedCpp.js build-final/ + +# copy HTML start page to output dir +cp testWasmIntegrated.html build-final/ + + +# copy styles to output dir +cp styles.css build-final/ + +# copy WASM binary to output dir +cp build-wasm/testWasmIntegratedCpp.wasm build-final/ + +cp ../test_data/testTestStoneCodeGen.yaml build-final/ +cp ../testCppHandler/test_data/test_Message2.json build-final/cppHandler_test_Message2.json + +echo "...Serving files at http://127.0.0.1:8080/build-final/testWasmIntegrated.html" + +sudo python3 serve.py + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +mkdir -p build-wasm +cd build-wasm + +# shellcheck source="$HOME/apps/emsdk/emsdk_env.sh" +source "$HOME/apps/emsdk/emsdk_env.sh" +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_WASM=ON .. + +ninja + +cd .. + +./build-web.sh + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json-forwards.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json-forwards.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,344 @@ +/// Json-cpp amalgamated forward header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json-forwards.h" +/// This header provides forward declaration for all JsonCpp types. + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +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. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED +# define JSON_FORWARD_AMALGAMATED_H_INCLUDED +/// If defined, indicates that the source file is amalgamated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED +#include +#include +#include +#include +#include +#include +#include +#include + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgamated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgamated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int +msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) // MSVC +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // defined(_MSC_VER) + +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override + +#if __cplusplus >= 201103L +#define JSONCPP_NOEXCEPT noexcept +#define JSONCPP_OP_EXPLICIT explicit +#elif defined(_MSC_VER) && _MSC_VER < 1900 +#define JSONCPP_NOEXCEPT throw() +#define JSONCPP_OP_EXPLICIT explicit +#elif defined(_MSC_VER) && _MSC_VER >= 1900 +#define JSONCPP_NOEXCEPT noexcept +#define JSONCPP_OP_EXPLICIT explicit +#else +#define JSONCPP_NOEXCEPT throw() +#define JSONCPP_OP_EXPLICIT +#endif + +#ifndef JSON_HAS_RVALUE_REFERENCES + +#if defined(_MSC_VER) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // MSVC >= 2013 + +#ifdef __clang__ +#if __has_feature(cxx_rvalue_references) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // has_feature + +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // GXX_EXPERIMENTAL + +#endif // __clang__ || __GNUC__ + +#endif // not defined JSON_HAS_RVALUE_REFERENCES + +#ifndef JSON_HAS_RVALUE_REFERENCES +#define JSON_HAS_RVALUE_REFERENCES 0 +#endif + +#ifdef __clang__ +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#endif +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#endif // __clang__ || __GNUC__ + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +#if __GNUC__ >= 6 +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#endif + +#if !defined(JSON_IS_AMALGAMATION) + +#include "allocator.h" +#include "version.h" + +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef int64_t Int64; +typedef uint64_t UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) + +template +using Allocator = typename std::conditional, + std::allocator>::type; +using String = std::basic_string, Allocator>; +using IStringStream = std::basic_istringstream; +using OStringStream = std::basic_ostringstream; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,2366 @@ +/// Json-cpp amalgamated header (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +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. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + +#ifndef JSON_AMALGAMATED_H_INCLUDED +# define JSON_AMALGAMATED_H_INCLUDED +/// If defined, indicates that the source file is amalgamated +/// to prevent private header inclusion. +#define JSON_IS_AMALGAMATION + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +// DO NOT EDIT. This file (and "version") is generated by CMake. +// Run CMake configure step to update it. +#ifndef JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED + +#define JSONCPP_VERSION_STRING "1.8.4" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 8 +#define JSONCPP_VERSION_PATCH 4 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) + +#ifdef JSONCPP_USING_SECURE_MEMORY +#undef JSONCPP_USING_SECURE_MEMORY +#endif +#define JSONCPP_USING_SECURE_MEMORY 0 +// If non-zero, the library zeroes any memory that it has allocated before +// it frees its memory. + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_ALLOCATOR_H_INCLUDED +#define CPPTL_JSON_ALLOCATOR_H_INCLUDED + +#include +#include + +#pragma pack(push, 8) + +namespace Json { +template class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + * The pointer argument is tagged as "volatile" to prevent the + * compiler optimizing out this critical step. + */ + void deallocate(volatile pointer p, size_type n) { + std::memset(p, 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast(p)) T(std::forward(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template SecureAllocator(const SecureAllocator&) {} + template struct rebind { using other = SecureAllocator; }; +}; + +template +bool operator==(const SecureAllocator&, const SecureAllocator&) { + return true; +} + +template +bool operator!=(const SecureAllocator&, const SecureAllocator&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // CPPTL_JSON_ALLOCATOR_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED +#include +#include +#include +#include +#include +#include +#include +#include + +/// If defined, indicates that json library is embedded in CppTL library. +//# define JSON_IN_CPPTL 1 + +/// If defined, indicates that json may leverage CppTL library +//# define JSON_USE_CPPTL 1 +/// If defined, indicates that cpptl vector based map should be used instead of +/// std::map +/// as Value container. +//# define JSON_USE_CPPTL_SMALLMAP 1 + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +/// If defined, indicates that the source file is amalgamated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgamated header. +// #define JSON_IS_AMALGAMATION + +#ifdef JSON_IN_CPPTL +#include +#ifndef JSON_USE_CPPTL +#define JSON_USE_CPPTL 1 +#endif +#endif + +#ifdef JSON_IN_CPPTL +#define JSON_API CPPTL_API +#elif defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#elif defined(JSON_DLL) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_IN_CPPTL +#if !defined(JSON_API) +#define JSON_API +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int +msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +#if defined(_MSC_VER) // MSVC +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // defined(_MSC_VER) + +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override + +#if __cplusplus >= 201103L +#define JSONCPP_NOEXCEPT noexcept +#define JSONCPP_OP_EXPLICIT explicit +#elif defined(_MSC_VER) && _MSC_VER < 1900 +#define JSONCPP_NOEXCEPT throw() +#define JSONCPP_OP_EXPLICIT explicit +#elif defined(_MSC_VER) && _MSC_VER >= 1900 +#define JSONCPP_NOEXCEPT noexcept +#define JSONCPP_OP_EXPLICIT explicit +#else +#define JSONCPP_NOEXCEPT throw() +#define JSONCPP_OP_EXPLICIT +#endif + +#ifndef JSON_HAS_RVALUE_REFERENCES + +#if defined(_MSC_VER) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // MSVC >= 2013 + +#ifdef __clang__ +#if __has_feature(cxx_rvalue_references) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // has_feature + +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) +#define JSON_HAS_RVALUE_REFERENCES 1 +#endif // GXX_EXPERIMENTAL + +#endif // __clang__ || __GNUC__ + +#endif // not defined JSON_HAS_RVALUE_REFERENCES + +#ifndef JSON_HAS_RVALUE_REFERENCES +#define JSON_HAS_RVALUE_REFERENCES 0 +#endif + +#ifdef __clang__ +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#endif +#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#endif // __clang__ || __GNUC__ + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +#if __GNUC__ >= 6 +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#endif + +#if !defined(JSON_IS_AMALGAMATION) + +#include "allocator.h" +#include "version.h" + +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { +typedef int Int; +typedef unsigned int UInt; +#if defined(JSON_NO_INT64) +typedef int LargestInt; +typedef unsigned int LargestUInt; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#else // if defined(_MSC_VER) // Other platforms, use long long +typedef int64_t Int64; +typedef uint64_t UInt64; +#endif // if defined(_MSC_VER) +typedef Int64 LargestInt; +typedef UInt64 LargestUInt; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) + +template +using Allocator = typename std::conditional, + std::allocator>::type; +using String = std::basic_string, Allocator>; +using IStringStream = std::basic_istringstream; +using OStringStream = std::basic_ostringstream; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; + +#endif // JSON_CONFIG_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/config.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class FastWriter; +class StyledWriter; + +// reader.h +class Reader; + +// features.h +class Features; + +// value.h +typedef unsigned int ArrayIndex; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/forwards.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_FEATURES_H_INCLUDED +#define CPPTL_JSON_FEATURES_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ +class JSON_API Features { +public: + /** \brief A configuration that allows all features and assumes all strings + * are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON + * specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_{true}; + + /// \c true if root must be either an array or an object value. Default: \c + /// false. + bool strictRoot_{false}; + + /// \c true if dropped null placeholders are allowed. Default: \c false. + bool allowDroppedNullPlaceholders_{false}; + + /// \c true if numeric object key are allowed. Default: \c false. + bool allowNumericKeys_{false}; +}; + +} // namespace Json + +#pragma pack(pop) + +#endif // CPPTL_JSON_FEATURES_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/features.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_H_INCLUDED +#define CPPTL_JSON_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +#ifndef JSON_USE_CPPTL_SMALLMAP +#include +#else +#include +#endif +#ifdef JSON_USE_CPPTL +#include +#endif + +// Conditional NORETURN attribute on the throw functions would: +// a) suppress false positives from static code analysis +// b) possibly improve optimization opportunities. +#if !defined(JSONCPP_NORETURN) +#if defined(_MSC_VER) +#define JSONCPP_NORETURN __declspec(noreturn) +#elif defined(__GNUC__) +#define JSONCPP_NORETURN __attribute__((__noreturn__)) +#else +#define JSONCPP_NORETURN +#endif +#endif + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + +/** Base class for all exceptions we throw. + * + * We use nothing but these internally. Of course, STL can throw others. + */ +class JSON_API Exception : public std::exception { +public: + Exception(String msg); + ~Exception() JSONCPP_NOEXCEPT override; + char const* what() const JSONCPP_NOEXCEPT override; + +protected: + String msg_; +}; + +/** Exceptions which the user cannot easily avoid. + * + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input + * + * \remark derived from Json::Exception + */ +class JSON_API RuntimeError : public Exception { +public: + RuntimeError(String const& msg); +}; + +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. + * + * These are precondition-violations (user bugs) and internal errors (our bugs). + * + * \remark derived from Json::Exception + */ +class JSON_API LogicError : public Exception { +public: + LogicError(String const& msg); +}; + +/// used internally +JSONCPP_NORETURN void throwRuntimeError(String const& msg); +/// used internally +JSONCPP_NORETURN void throwLogicError(String const& msg); + +/** \brief Type of the value held by a Value object. + */ +enum ValueType { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). +}; + +enum CommentPlacement { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for + /// root value) + numberOfCommentPlacement +}; + +/** \brief Type of precision for formatting of real values. + */ +enum PrecisionType { + significantDigits = 0, ///< we set max number of significant digits in string + decimalPlaces ///< we set max number of digits after "." in string +}; + +//# ifdef JSON_USE_CPPTL +// typedef CppTL::AnyEnumerator EnumMemberNames; +// typedef CppTL::AnyEnumerator EnumValues; +//# endif + +/** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignment takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ +class JSON_API StaticString { +public: + explicit StaticString(const char* czstring) : c_str_(czstring) {} + + operator const char*() const { return c_str_; } + + const char* c_str() const { return c_str_; } + +private: + const char* c_str_; +}; + +/** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * Values of an #objectValue or #arrayValue can be accessed using operator[]() + * methods. + * Non-const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resized and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtain default value in the case the + * required element does not exist. + * + * It is possible to iterate over the list of member keys of an object using + * the getMemberNames() method. + * + * \note #Value string-length fit in size_t, but keys must be < 2^30. + * (The reason is an implementation detail.) A #CharReader will raise an + * exception if a bound is exceeded to avoid security holes in your app, + * but the Value API does *not* check bounds. That is the responsibility + * of the caller. + */ +class JSON_API Value { + friend class ValueIteratorBase; + +public: + typedef std::vector Members; + typedef ValueIterator iterator; + typedef ValueConstIterator const_iterator; + typedef Json::UInt UInt; + typedef Json::Int Int; +#if defined(JSON_HAS_INT64) + typedef Json::UInt64 UInt64; + typedef Json::Int64 Int64; +#endif // defined(JSON_HAS_INT64) + typedef Json::LargestInt LargestInt; + typedef Json::LargestUInt LargestUInt; + typedef Json::ArrayIndex ArrayIndex; + + // Required for boost integration, e. g. BOOST_TEST + typedef std::string value_type; + + static const Value& null; ///< We regret this reference to a global instance; + ///< prefer the simpler Value(). + static const Value& nullRef; ///< just a kludge for binary-compatibility; same + ///< as null + static Value const& nullSingleton(); ///< Prefer this to null or nullRef. + + /// Minimum signed integer value that can be stored in a Json::Value. + static const LargestInt minLargestInt; + /// Maximum signed integer value that can be stored in a Json::Value. + static const LargestInt maxLargestInt; + /// Maximum unsigned integer value that can be stored in a Json::Value. + static const LargestUInt maxLargestUInt; + + /// Minimum signed int value that can be stored in a Json::Value. + static const Int minInt; + /// Maximum signed int value that can be stored in a Json::Value. + static const Int maxInt; + /// Maximum unsigned int value that can be stored in a Json::Value. + static const UInt maxUInt; + +#if defined(JSON_HAS_INT64) + /// Minimum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 minInt64; + /// Maximum signed 64 bits int value that can be stored in a Json::Value. + static const Int64 maxInt64; + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. + static const UInt64 maxUInt64; +#endif // defined(JSON_HAS_INT64) + + /// Default precision for real value for string representation. + static const UInt defaultRealPrecision; + +// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler +// when using gcc and clang backend compilers. CZString +// cannot be defined as private. See issue #486 +#ifdef __NVCC__ +public: +#else +private: +#endif +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + class CZString { + public: + enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; + CZString(ArrayIndex index); + CZString(char const* str, unsigned length, DuplicationPolicy allocate); + CZString(CZString const& other); +#if JSON_HAS_RVALUE_REFERENCES + CZString(CZString&& other); +#endif + ~CZString(); + CZString& operator=(const CZString& other); + +#if JSON_HAS_RVALUE_REFERENCES + CZString& operator=(CZString&& other); +#endif + + bool operator<(CZString const& other) const; + bool operator==(CZString const& other) const; + ArrayIndex index() const; + // const char* c_str() const; ///< \deprecated + char const* data() const; + unsigned length() const; + bool isStaticString() const; + + private: + void swap(CZString& other); + + struct StringStorage { + unsigned policy_ : 2; + unsigned length_ : 30; // 1GB max + }; + + char const* cstr_; // actually, a prefixed string, unless policy is noDup + union { + ArrayIndex index_; + StringStorage storage_; + }; + }; + +public: +#ifndef JSON_USE_CPPTL_SMALLMAP + typedef std::map ObjectValues; +#else + typedef CppTL::SmallMap ObjectValues; +#endif // ifndef JSON_USE_CPPTL_SMALLMAP +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +public: + /** \brief Create a default Value of the given type. + + This is a very useful constructor. + To create an empty array, pass arrayValue. + To create an empty object, pass objectValue. + Another Value can then be set to this one by assignment. +This is useful since clear() and resize() will not alter types. + + Examples: +\code +Json::Value null_value; // null +Json::Value arr_value(Json::arrayValue); // [] +Json::Value obj_value(Json::objectValue); // {} +\endcode + */ + Value(ValueType type = nullValue); + Value(Int value); + Value(UInt value); +#if defined(JSON_HAS_INT64) + Value(Int64 value); + Value(UInt64 value); +#endif // if defined(JSON_HAS_INT64) + Value(double value); + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) + Value(const char* begin, const char* end); ///< Copy all, incl zeroes. + /** \brief Constructs a value from a static string. + + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to this + * constructor. + * \note This works only for null-terminated strings. (We cannot change the + * size of this class, so we have nowhere to store the length, + * which might be computed later for various operations.) + * + * Example of usage: + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode + */ + Value(const StaticString& value); + Value(const String& value); ///< Copy data() til size(). Embedded + ///< zeroes too. +#ifdef JSON_USE_CPPTL + Value(const CppTL::ConstString& value); +#endif + Value(bool value); + Value(const Value& other); + Value(Value&& other); + ~Value(); + + /// \note Overwrite existing comments. To preserve comments, use + /// #swapPayload(). + Value& operator=(const Value& other); + Value& operator=(Value&& other); + + /// Swap everything. + void swap(Value& other); + /// Swap values but leave comments and source offsets in place. + void swapPayload(Value& other); + + /// copy everything. + void copy(const Value& other); + /// copy values but leave comments and source offsets in place. + void copyPayload(const Value& other); + + ValueType type() const; + + /// Compare payload only, not comments etc. + bool operator<(const Value& other) const; + bool operator<=(const Value& other) const; + bool operator>=(const Value& other) const; + bool operator>(const Value& other) const; + bool operator==(const Value& other) const; + bool operator!=(const Value& other) const; + int compare(const Value& other) const; + + const char* asCString() const; ///< Embedded zeroes could cause you trouble! +#if JSONCPP_USING_SECURE_MEMORY + unsigned getCStringLength() const; // Allows you to understand the length of + // the CString +#endif + String asString() const; ///< Embedded zeroes are possible. + /** Get raw char* of string-value. + * \return false if !string. (Seg-fault if str or end are NULL.) + */ + bool getString(char const** begin, char const** end) const; +#ifdef JSON_USE_CPPTL + CppTL::ConstString asConstString() const; +#endif + Int asInt() const; + UInt asUInt() const; +#if defined(JSON_HAS_INT64) + Int64 asInt64() const; + UInt64 asUInt64() const; +#endif // if defined(JSON_HAS_INT64) + LargestInt asLargestInt() const; + LargestUInt asLargestUInt() const; + float asFloat() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isInt64() const; + bool isUInt() const; + bool isUInt64() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + bool isConvertibleTo(ValueType other) const; + + /// Number of values in array or object + ArrayIndex size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return !isNull() + JSONCPP_OP_EXPLICIT operator bool() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to newSize elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize(ArrayIndex newSize); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](ArrayIndex index); + + /// Access an array element (zero based index ). + /// If the array contains less than index element, then null value are + /// inserted + /// in the array so that its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](int index); + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](ArrayIndex index) const; + + /// Access an array element (zero based index ) + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](int index) const; + + /// If the array contains at least index+1 elements, returns the element + /// value, + /// otherwise returns defaultValue. + Value get(ArrayIndex index, const Value& defaultValue) const; + /// Return true if index < size(). + bool isValidIndex(ArrayIndex index) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value& append(const Value& value); + +#if JSON_HAS_RVALUE_REFERENCES + Value& append(Value&& value); +#endif + + /// Access an object value by name, create a null member if it does not exist. + /// \note Because of our implementation, keys are limited to 2^30 -1 chars. + /// Exceeding that will cause an exception. + Value& operator[](const char* key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const char* key) const; + /// Access an object value by name, create a null member if it does not exist. + /// \param key may contain embedded nulls. + Value& operator[](const String& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + /// \param key may contain embedded nulls. + const Value& operator[](const String& key) const; + /** \brief Access an object value by name, create a null member if it does not + exist. + + * If the object has no entry for that name, then the member name used to + store + * the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value& operator[](const StaticString& key); +#ifdef JSON_USE_CPPTL + /// Access an object value by name, create a null member if it does not exist. + Value& operator[](const CppTL::ConstString& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const CppTL::ConstString& key) const; +#endif + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const char* key, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \note key may contain embedded nulls. + Value + get(const char* begin, const char* end, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \param key may contain embedded nulls. + Value get(const String& key, const Value& defaultValue) const; +#ifdef JSON_USE_CPPTL + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const CppTL::ConstString& key, const Value& defaultValue) const; +#endif + /// Most general and efficient version of isMember()const, get()const, + /// and operator[]const + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + Value const* find(char const* begin, char const* end) const; + /// Most general and efficient version of object-mutators. + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. + Value const* demand(char const* begin, char const* end); + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + void removeMember(const char* key); + /// Same as removeMember(const char*) + /// \param key may contain embedded nulls. + void removeMember(const String& key); + /// Same as removeMember(const char* begin, const char* end, Value* removed), + /// but 'key' is null-terminated. + bool removeMember(const char* key, Value* removed); + /** \brief Remove the named map member. + + Update 'removed' iff removed. + \param key may contain embedded nulls. + \return true iff removed (no exceptions) + */ + bool removeMember(String const& key, Value* removed); + /// Same as removeMember(String const& key, Value* removed) + bool removeMember(const char* begin, const char* end, Value* removed); + /** \brief Remove the indexed array element. + + O(n) expensive operations. + Update 'removed' iff removed. + \return true if removed (no exceptions) + */ + bool removeIndex(ArrayIndex index, Value* removed); + + /// Return true if the object has a member named key. + /// \note 'key' must be null-terminated. + bool isMember(const char* key) const; + /// Return true if the object has a member named key. + /// \param key may contain embedded nulls. + bool isMember(const String& key) const; + /// Same as isMember(String const& key)const + bool isMember(const char* begin, const char* end) const; +#ifdef JSON_USE_CPPTL + /// Return true if the object has a member named key. + bool isMember(const CppTL::ConstString& key) const; +#endif + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + + //# ifdef JSON_USE_CPPTL + // EnumMemberNames enumMemberNames() const; + // EnumValues enumValues() const; + //# endif + + /// \deprecated Always pass len. + JSONCPP_DEPRECATED("Use setComment(String const&) instead.") + void setComment(const char* comment, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement); + /// Comments must be //... or /* ... */ + void setComment(const String& comment, CommentPlacement placement); + bool hasComment(CommentPlacement placement) const; + /// Include delimiters and embedded newlines. + String getComment(CommentPlacement placement) const; + + String toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + + // Accessors for the [start, limit) range of bytes within the JSON text from + // which this value was parsed, if any. + void setOffsetStart(ptrdiff_t start); + void setOffsetLimit(ptrdiff_t limit); + ptrdiff_t getOffsetStart() const; + ptrdiff_t getOffsetLimit() const; + +private: + void setType(ValueType v) { bits_.value_type_ = v; } + bool isAllocated() const { return bits_.allocated_; } + void setIsAllocated(bool v) { bits_.allocated_ = v; } + + void initBasic(ValueType type, bool allocated = false); + void dupPayload(const Value& other); + void releasePayload(); + void dupMeta(const Value& other); + + Value& resolveReference(const char* key); + Value& resolveReference(const char* key, const char* end); + + struct CommentInfo { + CommentInfo(); + ~CommentInfo(); + + void setComment(const char* text, size_t len); + + char* comment_{nullptr}; + }; + + // struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder { + LargestInt int_; + LargestUInt uint_; + double real_; + bool bool_; + char* string_; // if allocated_, ptr to { unsigned, char[] }. + ObjectValues* map_; + } value_; + + struct { + // Really a ValueType, but types should agree for bitfield packing. + unsigned int value_type_ : 8; + // Unless allocated_, string_ must be null-terminated. + unsigned int allocated_ : 1; + } bits_; + + CommentInfo* comments_; + + // [start, limit) byte offsets in the source JSON text from which this Value + // was extracted. + ptrdiff_t start_; + ptrdiff_t limit_; +}; + +/** \brief Experimental and untested: represents an element of the "path" to + * access a node. + */ +class JSON_API PathArgument { +public: + friend class Path; + + PathArgument(); + PathArgument(ArrayIndex index); + PathArgument(const char* key); + PathArgument(const String& key); + +private: + enum Kind { kindNone = 0, kindIndex, kindKey }; + String key_; + ArrayIndex index_{}; + Kind kind_{kindNone}; +}; + +/** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provied as parameter + */ +class JSON_API Path { +public: + Path(const String& path, + const PathArgument& a1 = PathArgument(), + const PathArgument& a2 = PathArgument(), + const PathArgument& a3 = PathArgument(), + const PathArgument& a4 = PathArgument(), + const PathArgument& a5 = PathArgument()); + + const Value& resolve(const Value& root) const; + Value resolve(const Value& root, const Value& defaultValue) const; + /// Creates the "path" to access the specified node and returns a reference on + /// the node. + Value& make(Value& root) const; + +private: + typedef std::vector InArgs; + typedef std::vector Args; + + void makePath(const String& path, const InArgs& in); + void addPathInArg(const String& path, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind); + static void invalidPath(const String& path, int location); + + Args args_; +}; + +/** \brief base class for Value iterators. + * + */ +class JSON_API ValueIteratorBase { +public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef unsigned int size_t; + typedef int difference_type; + typedef ValueIteratorBase SelfType; + + bool operator==(const SelfType& other) const { return isEqual(other); } + + bool operator!=(const SelfType& other) const { return !isEqual(other); } + + difference_type operator-(const SelfType& other) const { + return other.computeDistance(*this); + } + + /// Return either the index or the member name of the referenced value as a + /// Value. + Value key() const; + + /// Return the index of the referenced Value, or -1 if it is not an + /// arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value, or "" if it is not an + /// objectValue. + /// \note Avoid `c_str()` on result, as embedded zeroes are possible. + String name() const; + + /// Return the member name of the referenced Value. "" if it is not an + /// objectValue. + /// \deprecated This cannot be used for UTF-8 strings, since there can be + /// embedded nulls. + JSONCPP_DEPRECATED("Use `key = name();` instead.") + char const* memberName() const; + /// Return the member name of the referenced Value, or NULL if it is not an + /// objectValue. + /// \note Better version than memberName(). Allows embedded nulls. + char const* memberName(char const** end) const; + +protected: + Value& deref() const; + + void increment(); + + void decrement(); + + difference_type computeDistance(const SelfType& other) const; + + bool isEqual(const SelfType& other) const; + + void copy(const SelfType& other); + +private: + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_{true}; + +public: + // For some reason, BORLAND needs these at the end, rather + // than earlier. No idea why. + ValueIteratorBase(); + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); +}; + +/** \brief const iterator for object and array value. + * + */ +class JSON_API ValueConstIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef const Value value_type; + // typedef unsigned int size_t; + // typedef int difference_type; + typedef const Value& reference; + typedef const Value* pointer; + typedef ValueConstIterator SelfType; + + ValueConstIterator(); + ValueConstIterator(ValueIterator const& other); + +private: + /*! \internal Use by Value to create an iterator. + */ + explicit ValueConstIterator(const Value::ObjectValues::iterator& current); + +public: + SelfType& operator=(const ValueIteratorBase& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +/** \brief Iterator for object and array value. + */ +class JSON_API ValueIterator : public ValueIteratorBase { + friend class Value; + +public: + typedef Value value_type; + typedef unsigned int size_t; + typedef int difference_type; + typedef Value& reference; + typedef Value* pointer; + typedef ValueIterator SelfType; + + ValueIterator(); + explicit ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueIterator& other); + +private: + /*! \internal Use by Value to create an iterator. + */ + explicit ValueIterator(const Value::ObjectValues::iterator& current); + +public: + SelfType& operator=(const SelfType& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +inline void swap(Value& a, Value& b) { a.swap(b); } + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/value.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_READER_H_INCLUDED +#define CPPTL_JSON_READER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "features.h" +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Unserialize a JSON document into a + *Value. + * + * \deprecated Use CharReader and CharReaderBuilder. + */ +class JSON_API Reader { +public: + typedef char Char; + typedef const Char* Location; + + /** \brief An error tagged with where in the JSON text it was encountered. + * + * The offsets give the [start, limit) range of bytes within the text. Note + * that this is bytes, not codepoints. + * + */ + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + String message; + }; + + /** \brief Constructs a Reader allowing all features + * for parsing. + */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set + * for parsing. + */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") + Reader(const Features& features); + + /** \brief Read a Value from a JSON + * document. + * \param document UTF-8 encoded string containing the document to read. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + * back during + * serialization, \c false to discard comments. + * This parameter is ignored if + * Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool + parse(const std::string& document, Value& root, bool collectComments = true); + + /** \brief Read a Value from a JSON + document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param collectComments \c true to collect comment and allow writing them + back during + * serialization, \c false to discard comments. + * This parameter is ignored if + Features::allowComments_ + * is \c false. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(IStream& is, Value& root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + * \deprecated Use getFormattedErrorMessages() instead (typo fix). + */ + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") + String getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * \return Formatted error message with the list of errors with their location + * in + * the parsed document. An empty string is returned if no error + * occurred + * during parsing. + */ + String getFormattedErrorMessages() const; + + /** \brief Returns a vector of structured erros encounted while parsing. + * \return A (possibly empty) vector of StructuredError objects. Currently + * only one error can be returned, but the caller should tolerate + * multiple + * errors. This can occur if the parser recovers from a non-fatal + * parse error and then encounters additional errors. + */ + std::vector getStructuredErrors() const; + + /** \brief Add a semantic error message. + * \param value JSON Value location associated with the error + * \param message The error message. + * \return \c true if the error was successfully added, \c false if the + * Value offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message); + + /** \brief Add a semantic error message with extra context. + * \param value JSON Value location associated with the error + * \param message The error message. + * \param extra Additional JSON Value location to contextualize the error + * \return \c true if the error was successfully added, \c false if either + * Value offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message, const Value& extra); + + /** \brief Return whether there are any errors. + * \return \c true if there are no errors to report \c false if + * errors have occurred. + */ + bool good() const; + +private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + String message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, String& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const String& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + String getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static bool containsNewLine(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + String document_; + Location begin_{}; + Location end_{}; + Location current_{}; + Location lastValueEnd_{}; + Value* lastValue_{}; + String commentsBefore_; + Features features_; + bool collectComments_{}; +}; // Reader + +/** Interface for reading JSON from a char array. + */ +class JSON_API CharReader { +public: + virtual ~CharReader() = default; + /** \brief Read a Value from a JSON + document. + * The document must be a UTF-8 encoded string containing the document to + read. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the + document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + document to read. + * Must be >= beginDoc. + * \param root [out] Contains the root value of the document if it was + * successfully parsed. + * \param errs [out] Formatted error messages (if not NULL) + * a user friendly string that lists errors in the parsed + * document. + * \return \c true if the document was successfully parsed, \c false if an + error occurred. + */ + virtual bool parse(char const* beginDoc, + char const* endDoc, + Value* root, + String* errs) = 0; + + class JSON_API Factory { + public: + virtual ~Factory() = default; + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual CharReader* newCharReader() const = 0; + }; // Factory +}; // CharReader + +/** \brief Build a CharReader implementation. + +Usage: +\code + using namespace Json; + CharReaderBuilder builder; + builder["collectComments"] = false; + Value value; + String errs; + bool ok = parseFromStream(builder, std::cin, &value, &errs); +\endcode +*/ +class JSON_API CharReaderBuilder : public CharReader::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + These are case-sensitive. + Available settings (case-sensitive): + - `"collectComments": false or true` + - true to collect comment and allow writing them + back during serialization, false to discard comments. + This parameter is ignored if allowComments is false. + - `"allowComments": false or true` + - true if comments are allowed. + - `"strictRoot": false or true` + - true if root must be either an array or an object value + - `"allowDroppedNullPlaceholders": false or true` + - true if dropped null placeholders are allowed. (See + StreamWriterBuilder.) + - `"allowNumericKeys": false or true` + - true if numeric object keys are allowed. + - `"allowSingleQuotes": false or true` + - true if '' are allowed for strings (both keys and values) + - `"stackLimit": integer` + - Exceeding stackLimit (recursive depth of `readValue()`) will + cause an exception. + - This is a security issue (seg-faults caused by deeply nested JSON), + so the default is low. + - `"failIfExtra": false or true` + - If true, `parse()` returns false when extra non-whitespace trails + the JSON value in the input string. + - `"rejectDupKeys": false or true` + - If true, `parse()` returns false when a key is duplicated within an + object. + - `"allowSpecialFloats": false or true` + - If true, special float values (NaNs and infinities) are allowed + and their values are lossfree restorable. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + CharReaderBuilder(); + ~CharReaderBuilder() override; + + CharReader* newCharReader() const override; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + + /** A simple way to update a specific setting. + */ + Value& operator[](const String& key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults + */ + static void setDefaults(Json::Value* settings); + /** Same as old Features::strictMode(). + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode + */ + static void strictMode(Json::Value* settings); +}; + +/** Consume entire stream and use its begin/end. + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream(CharReader::Factory const&, + IStream&, + Value* root, + std::string* errs); + +/** \brief Read from 'sin' into 'root'. + + Always keep comments from the input JSON. + + This can be used to read a file into a particular sub-object. + For example: + \code + Json::Value root; + cin >> root["dir"]["file"]; + cout << root; + \endcode + Result: + \verbatim + { + "dir": { + "file": { + // The input stream JSON would be nested here. + } + } + } + \endverbatim + \throw std::exception on parse error. + \see Json::operator<<() +*/ +JSON_API IStream& operator>>(IStream&, Value&); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // CPPTL_JSON_READER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/reader.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_WRITER_H_INCLUDED +#define JSON_WRITER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +class Value; + +/** + +Usage: +\code + using namespace Json; + void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { + std::unique_ptr const writer( + factory.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush + } +\endcode +*/ +class JSON_API StreamWriter { +protected: + OStream* sout_; // not owned; will not delete +public: + StreamWriter(); + virtual ~StreamWriter(); + /** Write Value into document as configured in sub-class. + Do not take ownership of sout, but maintain a reference during function. + \pre sout != NULL + \return zero on success (For now, we always return zero, so check the + stream instead.) \throw std::exception possibly, depending on configuration + */ + virtual int write(Value const& root, OStream* sout) = 0; + + /** \brief A simple abstract factory. + */ + class JSON_API Factory { + public: + virtual ~Factory(); + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const = 0; + }; // Factory +}; // StreamWriter + +/** \brief Write into stringstream, then return string, for convenience. + * A StreamWriter will be created from the factory, used, and then deleted. + */ +String JSON_API writeString(StreamWriter::Factory const& factory, + Value const& root); + +/** \brief Build a StreamWriter implementation. + +Usage: +\code + using namespace Json; + Value value = ...; + StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = " "; // or whatever you like + std::unique_ptr writer( + builder.newStreamWriter()); + writer->write(value, &std::cout); + std::cout << std::endl; // add lf and flush +\endcode +*/ +class JSON_API StreamWriterBuilder : public StreamWriter::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + Available settings (case-sensitive): + - "commentStyle": "None" or "All" + - "indentation": "". + - Setting this to an empty string also omits newline characters. + - "enableYAMLCompatibility": false or true + - slightly change the whitespace around colons + - "dropNullPlaceholders": false or true + - Drop the "null" string from the writer's output for nullValues. + Strictly speaking, this is not valid JSON. But when the output is being + fed to a browser's JavaScript, it makes for smaller output and the + browser can handle the output just fine. + - "useSpecialFloats": false or true + - If true, outputs non-finite floating point values in the following way: + NaN values as "NaN", positive infinity as "Infinity", and negative + infinity as "-Infinity". + - "precision": int + - Number of precision digits for formatting of real values. + - "precisionType": "significant"(default) or "decimal" + - Type of precision for formatting of real values. + + You can examine 'settings_` yourself + to see the defaults. You can also write and read them just like any + JSON Value. + \sa setDefaults() + */ + Json::Value settings_; + + StreamWriterBuilder(); + ~StreamWriterBuilder() override; + + /** + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + StreamWriter* newStreamWriter() const override; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + /** A simple way to update a specific setting. + */ + Value& operator[](const String& key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults + */ + static void setDefaults(Json::Value* settings); +}; + +/** \brief Abstract class for writers. + * \deprecated Use StreamWriter. (And really, this is an implementation detail.) + */ +class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer { +public: + virtual ~Writer(); + + virtual String write(const Value& root) = 0; +}; + +/** \brief Outputs a Value in JSON format + *without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' + *consumption, + * but may be useful to support feature such as RPC where bandwidth is limited. + * \sa Reader, Value + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter + : public Writer { +public: + FastWriter(); + ~FastWriter() override = default; + + void enableYAMLCompatibility(); + + /** \brief Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's JavaScript, it makes for smaller output and the + * browser can handle the output just fine. + */ + void dropNullPlaceholders(); + + void omitEndingLineFeed(); + +public: // overridden from Writer + String write(const Value& root) override; + +private: + void writeValue(const Value& value); + + String document_; + bool yamlCompatibilityEnabled_{false}; + bool dropNullPlaceholders_{false}; + bool omitEndingLineFeed_{false}; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +/** \brief Writes a Value in JSON format in a + *human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + *line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + *types, + * and all the values fit on one lines, then print the array on a single + *line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + *#CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledWriter : public Writer { +public: + StyledWriter(); + ~StyledWriter() override = default; + +public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + String write(const Value& root) override; + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultilineArray(const Value& value); + void pushValue(const String& value); + void writeIndent(); + void writeWithIndent(const String& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + String document_; + String indentString_; + unsigned int rightMargin_{74}; + unsigned int indentSize_{3}; + bool addChildValues_{false}; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +/** \brief Writes a Value in JSON format in a + human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + types, + * and all the values fit on one lines, then print the array on a single + line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + #CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledStreamWriter { +public: + /** + * \param indentation Each level will be indented by this amount extra. + */ + StyledStreamWriter(String indentation = "\t"); + ~StyledStreamWriter() = default; + +public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not + * return a value. + */ + void write(OStream& out, const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultilineArray(const Value& value); + void pushValue(const String& value); + void writeIndent(); + void writeWithIndent(const String& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); + + typedef std::vector ChildValues; + + ChildValues childValues_; + OStream* document_; + String indentString_; + unsigned int rightMargin_{74}; + String indentation_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(JSON_HAS_INT64) +String JSON_API valueToString(Int value); +String JSON_API valueToString(UInt value); +#endif // if defined(JSON_HAS_INT64) +String JSON_API valueToString(LargestInt value); +String JSON_API valueToString(LargestUInt value); +String JSON_API +valueToString(double value, + unsigned int precision = Value::defaultRealPrecision, + PrecisionType precisionType = PrecisionType::significantDigits); +String JSON_API valueToString(bool value); +String JSON_API valueToQuotedString(const char* value); + +/// \brief Output using the StyledStreamWriter. +/// \see Json::operator>>() +JSON_API OStream& operator<<(OStream&, const Value& root); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_WRITER_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/writer.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED +#define CPPTL_JSON_ASSERTIONS_H_INCLUDED + +#include +#include + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +/** It should not be possible for a maliciously designed file to + * cause an abort() or seg-fault, so these macros are used only + * for pre-condition violations and internal logic errors. + */ +#if JSON_USE_EXCEPTION + +// @todo <= add detail about condition in exception +#define JSON_ASSERT(condition) \ + { \ + if (!(condition)) { \ + Json::throwLogicError("assert json failed"); \ + } \ + } + +#define JSON_FAIL_MESSAGE(message) \ + { \ + OStringStream oss; \ + oss << message; \ + Json::throwLogicError(oss.str()); \ + abort(); \ + } + +#else // JSON_USE_EXCEPTION + +#define JSON_ASSERT(condition) assert(condition) + +// The call to assert() will show the failure message in debug builds. In +// release builds we abort, for a core-dump or debugger. +#define JSON_FAIL_MESSAGE(message) \ + { \ + OStringStream oss; \ + oss << message; \ + assert(false && oss.str().c_str()); \ + abort(); \ + } + +#endif + +#define JSON_ASSERT_MESSAGE(condition, message) \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } + +#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/assertions.h +// ////////////////////////////////////////////////////////////////////// + + + + + +#endif //ifndef JSON_AMALGAMATED_H_INCLUDED diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/jsoncpp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/jsoncpp.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,5418 @@ +/// Json-cpp amalgamated source (http://jsoncpp.sourceforge.net/). +/// It is intended to be used with #include "json/json.h" + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + +/* +The JsonCpp library's source code, including accompanying documentation, +tests and demonstration applications, are licensed under the following +conditions... + +Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all +jurisdictions which recognize such a disclaimer. In such jurisdictions, +this software is released into the Public Domain. + +In jurisdictions which do not recognize Public Domain property (e.g. Germany as of +2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and +The JsonCpp Authors, and is released under the terms of the MIT License (see below). + +In jurisdictions which recognize Public Domain property, the user of this +software may choose to accept it either as 1) Public Domain, 2) under the +conditions of the MIT License (see below), or 3) under the terms of dual +Public Domain/MIT License conditions described here, as they choose. + +The MIT License is about as close to Public Domain as a license can get, and is +described in clear, concise terms at: + + http://en.wikipedia.org/wiki/MIT_License + +The full text of the MIT License follows: + +======================================================================== +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors + +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. +======================================================================== +(END LICENSE TEXT) + +The MIT license is compatible with both the GPL and commercial +software, affording one all of the rights of Public Domain with the +minor nuisance of being required to keep the above copyright notice +and license text in the source code. Note also that by accepting the +Public Domain "license" you can re-license your copy using whatever +license you like. + +*/ + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: LICENSE +// ////////////////////////////////////////////////////////////////////// + + + + + + +#include "json/json.h" + +#ifndef JSON_IS_AMALGAMATION +#error "Compile with -I PATH_TO_JSON_DIRECTORY" +#endif + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include +#endif + +// Also support old flag NO_LOCALE_SUPPORT +#ifdef NO_LOCALE_SUPPORT +#define JSONCPP_NO_LOCALE_SUPPORT +#endif + +#ifndef JSONCPP_NO_LOCALE_SUPPORT +#include +#endif + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { +static inline char getDecimalPoint() { +#ifdef JSONCPP_NO_LOCALE_SUPPORT + return '\0'; +#else + struct lconv* lc = localeconv(); + return lc ? *(lc->decimal_point) : '\0'; +#endif +} + +/// Converts a unicode code-point to UTF-8. +static inline String codePointToUTF8(unsigned int cp) { + String result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +typedef char UIntToStringBuffer[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned integer to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast(value % 10U + static_cast('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +template Iter fixNumericLocale(Iter begin, Iter end) { + for (; begin != end; ++begin) { + if (*begin == ',') { + *begin = '.'; + } + } + return begin; +} + +template void fixNumericLocaleInput(Iter begin, Iter end) { + char decimalPoint = getDecimalPoint(); + if (decimalPoint == '\0' || decimalPoint == '.') { + return; + } + for (; begin != end; ++begin) { + if (*begin == '.') { + *begin = decimalPoint; + } + } +} + +/** + * Return iterator that would be the new end of the range [begin,end), if we + * were to delete zeros in the end of string, but not the last zero before '.'. + */ +template Iter fixZerosInTheEnd(Iter begin, Iter end) { + for (; begin != end; --end) { + if (*(end - 1) != '0') { + return end; + } + // Don't delete the last zero before the decimal point. + if (begin != (end - 1) && *(end - 2) == '.') { + return end; + } + } + return end; +} + +} // namespace Json + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_tool.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors +// Copyright (C) 2016 InfoTeCS JSC. All rights reserved. +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#if __cplusplus >= 201103L + +#if !defined(sscanf) +#define sscanf std::sscanf +#endif + +#endif //__cplusplus + +#if defined(_MSC_VER) +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES +#endif //_MSC_VER + +#if defined(_MSC_VER) +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile +// time to change the stack limit +#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) +#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 +#endif + +static size_t const stackLimit_g = + JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr CharReaderPtr; +#else +typedef std::unique_ptr CharReaderPtr; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() = default; + +Features Features::all() { return {}; } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + features.allowDroppedNullPlaceholders_ = false; + features.allowNumericKeys_ = false; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() + : errors_(), document_(), commentsBefore_(), features_(Features::all()) {} + +Reader::Reader(const Features& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool Reader::parse(const std::string& document, + Value& root, + bool collectComments) { + document_.assign(document.begin(), document.end()); + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& is, Value& root, bool collectComments) { + // std::istream_iterator begin(is); + // std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since String is reference-counted, this at least does not + // create an extra copy. + String doc; + std::getline(is, doc, (char)EOF); + return parse(doc.data(), doc.data() + doc.size(), root, collectComments); +} + +bool Reader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // readValue() may call itself only if it calls readObject() or ReadArray(). + // These methods execute nodes_.push() just before and nodes_.pop)() just + // after calling readValue(). parse() executes one nodes_.push(), so > instead + // of >=. + if (nodes_.size() > stackLimit_g) + throwRuntimeError("Exceeded stackLimit in readValue()."); + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenFalse: { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNull: { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // Else, fall through... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { + String normalized; + normalized.reserve(static_cast(end - begin)); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void Reader::addComment(Location begin, + Location end, + CommentPlacement placement) { + assert(collectComments_); + const String& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != nullptr); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + const char* p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } +} + +bool Reader::readString() { + Char c = '\0'; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& token) { + Token tokenName; + String name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = String(numberName.asCString()); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); +} + +bool Reader::readArray(Token& token) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + skipSpaces(); + if (current_ != end_ && *current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token currentToken; + // Accept Comment after last item in the array. + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); + } + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); + } + if (currentToken.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of + // them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + auto digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative && value == maxIntegerValue) + decoded = Value::minLargestInt; + else if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + String buffer(token.start_, token.end_); + IStringStream is(buffer); + if (!(is >> value)) + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + String decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeString(Token& token, String& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, current); + if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool Reader::addError(const String& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + size_t const errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const String& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +String Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +// Deprecated. Preserved for backward compatibility +String Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +String Reader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector Reader::getStructuredErrors() const { + std::vector allErrors; + for (const auto& error : errors_) { + Reader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool Reader::pushError(const Value& value, const String& message) { + ptrdiff_t const length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = nullptr; + errors_.push_back(info); + return true; +} + +bool Reader::pushError(const Value& value, + const String& message, + const Value& extra) { + ptrdiff_t const length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length || + extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool Reader::good() const { return errors_.empty(); } + +// exact copy of Features +class OurFeatures { +public: + static OurFeatures all(); + bool allowComments_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + bool allowSpecialFloats_; + size_t stackLimit_; +}; // OurFeatures + +// exact copy of Implementation of class Features +// //////////////////////////////// + +OurFeatures OurFeatures::all() { return {}; } + +// Implementation of class Reader +// //////////////////////////////// + +// exact copy of Reader, renamed to OurReader +class OurReader { +public: + typedef char Char; + typedef const Char* Location; + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + String message; + }; + + OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments = true); + String getFormattedErrorMessages() const; + std::vector getStructuredErrors() const; + bool pushError(const Value& value, const String& message); + bool pushError(const Value& value, const String& message, const Value& extra); + bool good() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenNaN, + tokenPosInf, + tokenNegInf, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + String message_; + Location extra_; + }; + + typedef std::deque Errors; + + bool readToken(Token& token); + void skipSpaces(); + bool match(Location pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + bool readNumber(bool checkInf); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, String& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const String& message, + Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void + getLocationLineAndColumn(Location location, int& line, int& column) const; + String getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static String normalizeEOL(Location begin, Location end); + static bool containsNewLine(Location begin, Location end); + + typedef std::stack Nodes; + Nodes nodes_; + Errors errors_; + String document_; + Location begin_; + Location end_; + Location current_; + Location lastValueEnd_; + Value* lastValue_; + String commentsBefore_; + + OurFeatures const features_; + bool collectComments_; +}; // OurReader + +// complete copy of Read impl, for OurReader + +bool OurReader::containsNewLine(OurReader::Location begin, + OurReader::Location end) { + for (; begin < end; ++begin) + if (*begin == '\n' || *begin == '\r') + return true; + return false; +} + +OurReader::OurReader(OurFeatures const& features) + : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), + lastValue_(), commentsBefore_(), features_(features), collectComments_() { +} + +bool OurReader::parse(const char* beginDoc, + const char* endDoc, + Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_) { + if ((features_.strictRoot_ || token.type_ != tokenError) && + token.type_ != tokenEndOfStream) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + // To preserve the old behaviour we cast size_t to int. + if (nodes_.size() > features_.stackLimit_) + throwRuntimeError("Exceeded stackLimit in readValue()."); + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenFalse: { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNull: { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNaN: { + Value v(std::numeric_limits::quiet_NaN()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenPosInf: { + Value v(std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNegInf: { + Value v(-std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // else, fall through ... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + break; + } // else fall through + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + token.type_ = tokenNumber; + readNumber(false); + break; + case '-': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenNegInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case 'N': + if (features_.allowSpecialFloats_) { + token.type_ = tokenNaN; + ok = match("aN", 2); + } else { + ok = false; + } + break; + case 'I': + if (features_.allowSpecialFloats_) { + token.type_ = tokenPosInf; + ok = match("nfinity", 7); + } else { + ok = false; + } + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return true; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool OurReader::match(Location pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +String OurReader::normalizeEOL(OurReader::Location begin, + OurReader::Location end) { + String normalized; + normalized.reserve(static_cast(end - begin)); + OurReader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void OurReader::addComment(Location begin, + Location end, + CommentPlacement placement) { + assert(collectComments_); + const String& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != nullptr); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment() { + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +bool OurReader::readNumber(bool checkInf) { + const char* p = current_; + if (checkInf && p != end_ && *p == 'I') { + current_ = ++p; + return false; + } + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + return true; +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& token) { + Token tokenName; + String name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); + } + if (name.length() >= (1U << 30)) + throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + String msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover(msg, tokenName, tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); +} + +bool OurReader::readArray(Token& token) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + skipSpaces(); + if (current_ != end_ && *current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token currentToken; + // Accept Comment after last item in the array. + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); + } + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); + } + if (currentToken.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of + // them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::minLargestInt) + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + auto digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + const int bufferSize = 32; + int count; + ptrdiff_t const length = token.end_ - token.start_; + + // Sanity check to avoid buffer overflow exploits. + if (length < 0) { + return addError("Unable to parse token length", token); + } + auto const ulength = static_cast(length); + + // Avoid using a string constant for the format control string given to + // sscanf, as this can cause hard to debug crashes on OS X. See here for more + // info: + // + // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html + char format[] = "%lf"; + + if (length <= bufferSize) { + Char buffer[bufferSize + 1]; + memcpy(buffer, token.start_, ulength); + buffer[length] = 0; + fixNumericLocaleInput(buffer, buffer + length); + count = sscanf(buffer, format, &value); + } else { + String buffer(token.start_, token.end_); + count = sscanf(buffer.c_str(), format, &value); + } + + if (count != 1) + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + String decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeString(Token& token, String& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + else if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, + Location& current, + Location end, + unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, current); + if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, + Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool OurReader::addError(const String& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + size_t errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const String& message, + Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, + int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +String OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +String OurReader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector OurReader::getStructuredErrors() const { + std::vector allErrors; + for (const auto& error : errors_) { + OurReader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool OurReader::pushError(const Value& value, const String& message) { + ptrdiff_t length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = end_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = nullptr; + errors_.push_back(info); + return true; +} + +bool OurReader::pushError(const Value& value, + const String& message, + const Value& extra) { + ptrdiff_t length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length || + extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool OurReader::good() const { return errors_.empty(); } + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; + +public: + OurCharReader(bool collectComments, OurFeatures const& features) + : collectComments_(collectComments), reader_(features) {} + bool parse(char const* beginDoc, + char const* endDoc, + Value* root, + String* errs) override { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } +CharReaderBuilder::~CharReaderBuilder() = default; +CharReader* CharReaderBuilder::newCharReader() const { + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = + settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); +#if defined(JSON_HAS_INT64) + features.stackLimit_ = settings_["stackLimit"].asUInt64(); +#else + features.stackLimit_ = settings_["stackLimit"].asUInt(); +#endif + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + return new OurCharReader(collectComments, features); +} +static void getValidReaderKeys(std::set* valid_keys) { + valid_keys->clear(); + valid_keys->insert("collectComments"); + valid_keys->insert("allowComments"); + valid_keys->insert("strictRoot"); + valid_keys->insert("allowDroppedNullPlaceholders"); + valid_keys->insert("allowNumericKeys"); + valid_keys->insert("allowSingleQuotes"); + valid_keys->insert("stackLimit"); + valid_keys->insert("failIfExtra"); + valid_keys->insert("rejectDupKeys"); + valid_keys->insert("allowSpecialFloats"); +} +bool CharReaderBuilder::validate(Json::Value* invalid) const { + Json::Value my_invalid; + if (!invalid) + invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidReaderKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + String const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return inv.empty(); +} +Value& CharReaderBuilder::operator[](const String& key) { + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) { + //! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; + (*settings)["allowSpecialFloats"] = false; + //! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) { + //! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; + (*settings)["allowSpecialFloats"] = false; + //! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream(CharReader::Factory const& fact, + IStream& sin, + Value* root, + String* errs) { + OStringStream ssin; + ssin << sin.rdbuf(); + String doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +IStream& operator>>(IStream& sin, Value& root) { + CharReaderBuilder b; + String errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + throwRuntimeError(errs); + } + return sin; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_reader.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() : current_() {} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() const { return current_->second; } + +void ValueIteratorBase::increment() { ++current_; } + +void ValueIteratorBase::decrement() { --current_; } + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { +#ifdef JSON_USE_CPPTL_SMALLMAP + return other.current_ - current_; +#else + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +#endif +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +String ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) + return String(); + return String(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = nullptr; + return nullptr; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() = default; + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator::ValueConstIterator(ValueIterator const& other) + : ValueIteratorBase(other) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() = default; + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) { + throwRuntimeError("ConstIterator to Iterator should never be allowed."); +} + +ValueIterator::ValueIterator(const ValueIterator& other) = default; + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_valueiterator.inl +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#ifdef JSON_USE_CPPTL +#include +#endif +#include // min() +#include // size_t + +// Provide implementation equivalent of std::snprintf for older _MSC compilers +#if defined(_MSC_VER) && _MSC_VER < 1900 +#include +static int msvc_pre1900_c99_vsnprintf(char* outBuf, + size_t size, + const char* format, + va_list ap) { + int count = -1; + if (size != 0) + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + return count; +} + +int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, + size_t size, + const char* format, + ...) { + va_list ap; + va_start(ap, format); + const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); + va_end(ap); + return count; +} +#endif + +// Disable warning C4702 : unreachable code +#if defined(_MSC_VER) +#pragma warning(disable : 4702) +#endif + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +#define ALIGNAS(byte_alignment) +#endif +// static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; +// const unsigned char& kNullRef = kNull[0]; +// const Value& Value::null = reinterpret_cast(kNullRef); +// const Value& Value::nullRef = null; + +// static +Value const& Value::nullSingleton() { + static Value const nullStatic; + return nullStatic; +} + +// for backwards compatibility, we'll leave these global references around, but +// DO NOT use them in JSONCPP library code any more! +Value const& Value::null = Value::nullSingleton(); +Value const& Value::nullRef = Value::nullSingleton(); + +const Int Value::minInt = Int(~(UInt(-1) / 2)); +const Int Value::maxInt = Int(UInt(-1) / 2); +const UInt Value::maxUInt = UInt(-1); +#if defined(JSON_HAS_INT64) +const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); +const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); +const UInt64 Value::maxUInt64 = UInt64(-1); +// The constant is hard-coded because some compiler have trouble +// converting Value::maxUInt64 to a double correctly (AIX/xlC). +// Assumes that UInt64 is a 64 bits integer. +static const double maxUInt64AsDouble = 18446744073709551615.0; +#endif // defined(JSON_HAS_INT64) +const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); +const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); +const LargestUInt Value::maxLargestUInt = LargestUInt(-1); + +const UInt Value::defaultRealPrecision = 17; + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template +static inline bool InRange(double d, T min, U max) { + // The casts can lose precision, but we are looking only for + // an approximate range. Might fail on edge cases though. ~cdunn + // return d >= static_cast(min) && d <= static_cast(max); + return d >= min && d <= max; +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast(Int64(value / 2)) * 2.0 + + static_cast(Int64(value & 1)); +} + +template static inline double integerToDouble(T value) { + return static_cast(value); +} + +template +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, size_t length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= static_cast(Value::maxInt)) + length = Value::maxInt - 1; + + char* newString = static_cast(malloc(length + 1)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue(const char* value, + unsigned int length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - + sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; + char* newString = static_cast(malloc(actualLength)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = + 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString(bool isPrefixed, + char const* prefixed, + unsigned* length, + char const** value) { + if (!isPrefixed) { + *length = static_cast(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by + * duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +#if JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + unsigned length = 0; + char const* valueDecoded; + decodePrefixedString(true, value, &length, &valueDecoded); + size_t const size = sizeof(unsigned) + length + 1U; + memset(value, 0, size); + free(value); +} +static inline void releaseStringValue(char* value, unsigned length) { + // length==0 => we allocated the strings memory + size_t size = (length == 0) ? strlen(value) : length; + memset(value, 0, size); + free(value); +} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { free(value); } +static inline void releaseStringValue(char* value, unsigned) { free(value); } +#endif // JSONCPP_USING_SECURE_MEMORY + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +Exception::Exception(String msg) : msg_(std::move(msg)) {} +Exception::~Exception() JSONCPP_NOEXCEPT {} +char const* Exception::what() const JSONCPP_NOEXCEPT { return msg_.c_str(); } +RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} +LogicError::LogicError(String const& msg) : Exception(msg) {} +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { + throw RuntimeError(msg); +} +JSONCPP_NORETURN void throwLogicError(String const& msg) { + throw LogicError(msg); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CommentInfo +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +Value::CommentInfo::CommentInfo() = default; + +Value::CommentInfo::~CommentInfo() { + if (comment_) + releaseStringValue(comment_, 0u); +} + +void Value::CommentInfo::setComment(const char* text, size_t len) { + if (comment_) { + releaseStringValue(comment_, 0u); + comment_ = nullptr; + } + JSON_ASSERT(text != nullptr); + JSON_ASSERT_MESSAGE( + text[0] == '\0' || text[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + // It seems that /**/ style comments are acceptable as well. + comment_ = duplicateStringValue(text, len); +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} + +Value::CZString::CZString(char const* str, + unsigned length, + DuplicationPolicy allocate) + : cstr_(str) { + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = length & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) { + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = + static_cast( + other.cstr_ + ? (static_cast(other.storage_.policy_) == + noDuplication + ? noDuplication + : duplicate) + : static_cast(other.storage_.policy_)) & + 3U; + storage_.length_ = other.storage_.length_; +} + +#if JSON_HAS_RVALUE_REFERENCES +Value::CZString::CZString(CZString&& other) + : cstr_(other.cstr_), index_(other.index_) { + other.cstr_ = nullptr; +} +#endif + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) { + releaseStringValue(const_cast(cstr_), + storage_.length_ + 1u); // +1 for null terminating + // character for sake of + // completeness but not actually + // necessary + } +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(const CZString& other) { + cstr_ = other.cstr_; + index_ = other.index_; + return *this; +} + +#if JSON_HAS_RVALUE_REFERENCES +Value::CZString& Value::CZString::operator=(CZString&& other) { + cstr_ = other.cstr_; + index_ = other.index_; + other.cstr_ = nullptr; + return *this; +} +#endif + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) + return index_ < other.index_; + // return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) + return true; + if (comp > 0) + return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) + return index_ == other.index_; + // return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) + return false; + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +// const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { + return storage_.policy_ == noDuplication; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType type) { + static char const emptyString[] = ""; + initBasic(type); + switch (type) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + // allocated_ == false, so this is safe. + value_.string_ = const_cast(static_cast(emptyString)); + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + JSON_ASSERT_MESSAGE(value != nullptr, + "Null Value Passed to Value Constructor"); + value_.string_ = duplicateAndPrefixStringValue( + value, static_cast(strlen(value))); +} + +Value::Value(const char* begin, const char* end) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(begin, static_cast(end - begin)); +} + +Value::Value(const String& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue( + value.data(), static_cast(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast(value.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value::Value(const CppTL::ConstString& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue( + value, static_cast(value.length())); +} +#endif + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(const Value& other) { + dupPayload(other); + dupMeta(other); +} + +Value::Value(Value&& other) { + initBasic(nullValue); + swap(other); +} + +Value::~Value() { + releasePayload(); + delete[] comments_; + value_.uint_ = 0; +} + +Value& Value::operator=(const Value& other) { + Value(other).swap(*this); + return *this; +} + +Value& Value::operator=(Value&& other) { + other.swap(*this); + return *this; +} + +void Value::swapPayload(Value& other) { + std::swap(bits_, other.bits_); + std::swap(value_, other.value_); +} + +void Value::copyPayload(const Value& other) { + releasePayload(); + dupPayload(other); +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); + std::swap(start_, other.start_); + std::swap(limit_, other.limit_); +} + +void Value::copy(const Value& other) { + copyPayload(other); + delete[] comments_; + dupMeta(other); +} + +ValueType Value::type() const { + return static_cast(bits_.value_type_); +} + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type() - other.type(); + if (typeDelta) + return typeDelta < 0 ? true : false; + switch (type()) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + if (other.value_.string_) + return true; + else + return false; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) + return true; + if (comp > 0) + return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + int delta = int(value_.map_->size() - other.value_.map_->size()); + if (delta) + return delta < 0; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + if (type() != other.type()) + return false; + switch (type()) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + if (this_len != other_len) + return false; + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == nullptr) + return nullptr; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return this_str; +} + +#if JSONCPP_USING_SECURE_MEMORY +unsigned Value::getCStringLength() const { + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) + return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return this_len; +} +#endif + +bool Value::getString(char const** begin, char const** end) const { + if (type() != stringValue) + return false; + if (value_.string_ == nullptr) + return false; + unsigned length; + decodePrefixedString(this->isAllocated(), this->value_.string_, &length, + begin); + *end = *begin + length; + return true; +} + +String Value::asString() const { + switch (type()) { + case nullValue: + return ""; + case stringValue: { + if (value_.string_ == nullptr) + return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return String(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +#ifdef JSON_USE_CPPTL +CppTL::ConstString Value::asConstString() const { + unsigned len; + char const* str; + decodePrefixedString(isAllocated(), value_.string_, &len, &str); + return CppTL::ConstString(str, len); +} +#endif + +Value::Int Value::asInt() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type()) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type()) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type()) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + // This can fail (silently?) if the value is bigger than MAX_FLOAT. + return static_cast(integerToDouble(value_.uint_)); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0f : 0.0f; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type()) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ ? true : false; + case uintValue: + return value_.uint_ ? true : false; + case realValue: + // This is kind of strange. Not recommended. + return (value_.real_ != 0.0) ? true : false; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type() == booleanValue && value_.bool_ == false) || + (type() == stringValue && asString().empty()) || + (type() == arrayValue && value_.map_->empty()) || + (type() == objectValue && value_.map_->empty()) || + type() == nullValue; + case intValue: + return isInt() || + (type() == realValue && InRange(value_.real_, minInt, maxInt)) || + type() == booleanValue || type() == nullValue; + case uintValue: + return isUInt() || + (type() == realValue && InRange(value_.real_, 0, maxUInt)) || + type() == booleanValue || type() == nullValue; + case realValue: + return isNumeric() || type() == booleanValue || type() == nullValue; + case booleanValue: + return isNumeric() || type() == booleanValue || type() == nullValue; + case stringValue: + return isNumeric() || type() == booleanValue || type() == stringValue || + type() == nullValue; + case arrayValue: + return type() == arrayValue || type() == nullValue; + case objectValue: + return type() == objectValue || type() == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0u; + else + return false; +} + +Value::operator bool() const { return !isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || + type() == objectValue, + "in Json::Value::clear(): requires complex value"); + start_ = 0; + limit_ = 0; + switch (type()) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type() == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + this->operator[](newSize - 1); + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + JSON_ASSERT(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type() == nullValue) + *this = Value(arrayValue); + CZString key(index); + auto it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type() == nullValue) + return nullSingleton(); + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullSingleton(); + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType type, bool allocated) { + setType(type); + setIsAllocated(allocated); + comments_ = nullptr; + start_ = 0; + limit_ = 0; +} + +void Value::dupPayload(const Value& other) { + setType(other.type()); + setIsAllocated(false); + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.isAllocated()) { + unsigned len; + char const* str; + decodePrefixedString(other.isAllocated(), other.value_.string_, &len, + &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + setIsAllocated(true); + } else { + value_.string_ = other.value_.string_; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::releasePayload() { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (isAllocated()) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::dupMeta(const Value& other) { + if (other.comments_) { + comments_ = new CommentInfo[numberOfCommentPlacement]; + for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { + const CommentInfo& otherComment = other.comments_[comment]; + if (otherComment.comment_) + comments_[comment].setComment(otherComment.comment_, + strlen(otherComment.comment_)); + } + } else { + comments_ = nullptr; + } + start_ = other.start_; + limit_ = other.limit_; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type() == nullValue) + *this = Value(objectValue); + CZString actualKey(key, static_cast(strlen(key)), + CZString::noDuplication); // NOTE! + auto it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* end) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type() == nullValue) + *this = Value(objectValue); + CZString actualKey(key, static_cast(end - key), + CZString::duplicateOnCopy); + auto it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullSingleton() ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* begin, char const* end) const { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::find(key, end, found): requires " + "objectValue or nullValue"); + if (type() == nullValue) + return nullptr; + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return nullptr; + return &(*it).second; +} +const Value& Value::operator[](const char* key) const { + Value const* found = find(key, key + strlen(key)); + if (!found) + return nullSingleton(); + return *found; +} +Value const& Value::operator[](const String& key) const { + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) + return nullSingleton(); + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const String& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +#ifdef JSON_USE_CPPTL +Value& Value::operator[](const CppTL::ConstString& key) { + return resolveReference(key.c_str(), key.end_c_str()); +} +Value const& Value::operator[](CppTL::ConstString const& key) const { + Value const* found = find(key.c_str(), key.end_c_str()); + if (!found) + return nullSingleton(); + return *found; +} +#endif + +Value& Value::append(const Value& value) { return (*this)[size()] = value; } + +#if JSON_HAS_RVALUE_REFERENCES +Value& Value::append(Value&& value) { + return (*this)[size()] = std::move(value); +} +#endif + +Value Value::get(char const* begin, + char const* end, + Value const& defaultValue) const { + Value const* found = find(begin, end); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const { + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(String const& key, Value const& defaultValue) const { + return get(key.data(), key.data() + key.length(), defaultValue); +} + +bool Value::removeMember(const char* begin, const char* end, Value* removed) { + if (type() != objectValue) { + return false; + } + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); + auto it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + if (removed) +#if JSON_HAS_RVALUE_REFERENCES + *removed = std::move(it->second); +#else + *removed = it->second; +#endif + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) { + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(String const& key, Value* removed) { + return removeMember(key.data(), key.data() + key.length(), removed); +} +void Value::removeMember(const char* key) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type() == nullValue) + return; + + CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); + value_.map_->erase(actualKey); +} +void Value::removeMember(const String& key) { removeMember(key.c_str()); } + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type() != arrayValue) { + return false; + } + CZString key(index); + auto it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + if (removed) + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i) { + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + auto itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +#ifdef JSON_USE_CPPTL +Value Value::get(const CppTL::ConstString& key, + const Value& defaultValue) const { + return get(key.c_str(), key.end_c_str(), defaultValue); +} +#endif + +bool Value::isMember(char const* begin, char const* end) const { + Value const* value = find(begin, end); + return nullptr != value; +} +bool Value::isMember(char const* key) const { + return isMember(key, key + strlen(key)); +} +bool Value::isMember(String const& key) const { + return isMember(key.data(), key.data() + key.length()); +} + +#ifdef JSON_USE_CPPTL +bool Value::isMember(const CppTL::ConstString& key) const { + return isMember(key.c_str(), key.end_c_str()); +} +#endif + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type() == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(String((*it).first.data(), (*it).first.length())); + } + return members; +} +// +//# ifdef JSON_USE_CPPTL +// EnumMemberNames +// Value::enumMemberNames() const +//{ +// if ( type() == objectValue ) +// { +// return CppTL::Enum::any( CppTL::Enum::transform( +// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), +// MemberNamesTransform() ) ); +// } +// return EnumMemberNames(); +//} +// +// +// EnumValues +// Value::enumValues() const +//{ +// if ( type() == objectValue || type() == arrayValue ) +// return CppTL::Enum::anyValues( *(value_.map_), +// CppTL::Type() ); +// return EnumValues(); +//} +// +//# endif + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type() == nullValue; } + +bool Value::isBool() const { return type() == booleanValue; } + +bool Value::isInt() const { + switch (type()) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= minInt && value_.int_ <= maxInt; +#else + return true; +#endif + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type()) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); +#else + return value_.int_ >= 0; +#endif + case uintValue: +#if defined(JSON_HAS_INT64) + return value_.uint_ <= maxUInt; +#else + return true; +#endif + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type()) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type()) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { + switch (type()) { + case intValue: + case uintValue: + return true; + case realValue: +#if defined(JSON_HAS_INT64) + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); +#else + return value_.real_ >= minInt && value_.real_ <= maxUInt && + IsIntegral(value_.real_); +#endif // JSON_HAS_INT64 + default: + break; + } + return false; +} + +bool Value::isDouble() const { + return type() == intValue || type() == uintValue || type() == realValue; +} + +bool Value::isNumeric() const { return isDouble(); } + +bool Value::isString() const { return type() == stringValue; } + +bool Value::isArray() const { return type() == arrayValue; } + +bool Value::isObject() const { return type() == objectValue; } + +void Value::setComment(const char* comment, + size_t len, + CommentPlacement placement) { + if (!comments_) + comments_ = new CommentInfo[numberOfCommentPlacement]; + if ((len > 0) && (comment[len - 1] == '\n')) { + // Always discard trailing newline, to aid indentation. + len -= 1; + } + comments_[placement].setComment(comment, len); +} + +void Value::setComment(const char* comment, CommentPlacement placement) { + setComment(comment, strlen(comment), placement); +} + +void Value::setComment(const String& comment, CommentPlacement placement) { + setComment(comment.c_str(), comment.length(), placement); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_ != nullptr && comments_[placement].comment_ != nullptr; +} + +String Value::getComment(CommentPlacement placement) const { + if (hasComment(placement)) + return comments_[placement].comment_; + return ""; +} + +void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } + +void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } + +ptrdiff_t Value::getOffsetStart() const { return start_; } + +ptrdiff_t Value::getOffsetLimit() const { return limit_; } + +String Value::toStyledString() const { + StreamWriterBuilder builder; + + String out = this->hasComment(commentBefore) ? "\n" : ""; + out += Json::writeString(builder, *this); + out += '\n'; + + return out; +} + +Value::const_iterator Value::begin() const { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return {}; +} + +Value::const_iterator Value::end() const { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return {}; +} + +Value::iterator Value::begin() { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() : key_() {} + +PathArgument::PathArgument(ArrayIndex index) + : key_(), index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) + : key_(key), index_(), kind_(kindKey) {} + +PathArgument::PathArgument(const String& key) + : key_(key.c_str()), index_(), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const String& path, + const PathArgument& a1, + const PathArgument& a2, + const PathArgument& a3, + const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.reserve(5); + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const String& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + auto itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *++current != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.' || *current == ']') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(String(beginName, current)); + } + } +} + +void Path::addPathInArg(const String& /*path*/, + const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg++); + } +} + +void Path::invalidPath(const String& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... + return Value::null; + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + return Value::null; + } + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) { + // Error: unable to resolve path (object has no member named '' at + // position...) + return Value::null; + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_value.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L +#include +#include + +#if !defined(isnan) +#define isnan std::isnan +#endif + +#if !defined(isfinite) +#define isfinite std::isfinite +#endif + +#else +#include +#include + +#if defined(_MSC_VER) +#if !defined(isnan) +#include +#define isnan _isnan +#endif + +#if !defined(isfinite) +#include +#define isfinite _finite +#endif + +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES + +#endif //_MSC_VER + +#if defined(__sun) && defined(__SVR4) // Solaris +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#endif + +#if defined(__hpux) +#if !defined(isfinite) +#if defined(__ia64) && !defined(finite) +#define isfinite(x) \ + ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) +#endif +#endif +#endif + +#if !defined(isnan) +// IEEE standard states that NaN values will not compare to themselves +#define isnan(x) (x != x) +#endif + +#if !defined(__APPLE__) +#if !defined(isfinite) +#define isfinite finite +#endif +#endif +#endif + +#if defined(_MSC_VER) +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +typedef std::unique_ptr StreamWriterPtr; +#else +typedef std::unique_ptr StreamWriterPtr; +#endif + +String valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + if (value == Value::minLargestInt) { + uintToString(LargestUInt(Value::maxLargestInt) + 1, current); + *--current = '-'; + } else if (value < 0) { + uintToString(LargestUInt(-value), current); + *--current = '-'; + } else { + uintToString(LargestUInt(value), current); + } + assert(current >= buffer); + return current; +} + +String valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +String valueToString(Int value) { return valueToString(LargestInt(value)); } + +String valueToString(UInt value) { return valueToString(LargestUInt(value)); } + +#endif // # if defined(JSON_HAS_INT64) + +namespace { +String valueToString(double value, + bool useSpecialFloats, + unsigned int precision, + PrecisionType precisionType) { + // Print into the buffer. We need not request the alternative representation + // that always has a decimal point because JSON doesn't distinguish the + // concepts of reals and integers. + if (!isfinite(value)) { + static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, + {"null", "-1e+9999", "1e+9999"}}; + return reps[useSpecialFloats ? 0 : 1] + [isnan(value) ? 0 : (value < 0) ? 1 : 2]; + } + + String buffer(size_t(36), '\0'); + while (true) { + int len = jsoncpp_snprintf( + &*buffer.begin(), buffer.size(), + (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", + precision, value); + assert(len >= 0); + auto wouldPrint = static_cast(len); + if (wouldPrint >= buffer.size()) { + buffer.resize(wouldPrint + 1); + continue; + } + buffer.resize(wouldPrint); + break; + } + + buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); + + // strip the zero padding from the right + if (precisionType == PrecisionType::decimalPlaces) { + buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end()), buffer.end()); + } + + // try to ensure we preserve the fact that this was given to us as a double on + // input + if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { + buffer += ".0"; + } + return buffer; +} +} // namespace + +String valueToString(double value, + unsigned int precision, + PrecisionType precisionType) { + return valueToString(value, false, precision, precisionType); +} + +String valueToString(bool value) { return value ? "true" : "false"; } + +static bool isAnyCharRequiredQuoting(char const* s, size_t n) { + assert(s || !n); + + char const* const end = s + n; + for (char const* cur = s; cur < end; ++cur) { + if (*cur == '\\' || *cur == '\"' || *cur < ' ' || + static_cast(*cur) < 0x80) + return true; + } + return false; +} + +static unsigned int utf8ToCodepoint(const char*& s, const char* e) { + const unsigned int REPLACEMENT_CHARACTER = 0xFFFD; + + unsigned int firstByte = static_cast(*s); + + if (firstByte < 0x80) + return firstByte; + + if (firstByte < 0xE0) { + if (e - s < 2) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = + ((firstByte & 0x1F) << 6) | (static_cast(s[1]) & 0x3F); + s += 1; + // oversized encoded characters are invalid + return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; + } + + if (firstByte < 0xF0) { + if (e - s < 3) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = ((firstByte & 0x0F) << 12) | + ((static_cast(s[1]) & 0x3F) << 6) | + (static_cast(s[2]) & 0x3F); + s += 2; + // surrogates aren't valid codepoints itself + // shouldn't be UTF-8 encoded + if (calculated >= 0xD800 && calculated <= 0xDFFF) + return REPLACEMENT_CHARACTER; + // oversized encoded characters are invalid + return calculated < 0x800 ? REPLACEMENT_CHARACTER : calculated; + } + + if (firstByte < 0xF8) { + if (e - s < 4) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = ((firstByte & 0x07) << 18) | + ((static_cast(s[1]) & 0x3F) << 12) | + ((static_cast(s[2]) & 0x3F) << 6) | + (static_cast(s[3]) & 0x3F); + s += 3; + // oversized encoded characters are invalid + return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; + } + + return REPLACEMENT_CHARACTER; +} + +static const char hex2[] = "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + +static String toHex16Bit(unsigned int x) { + const unsigned int hi = (x >> 8) & 0xff; + const unsigned int lo = x & 0xff; + String result(4, ' '); + result[0] = hex2[2 * hi]; + result[1] = hex2[2 * hi + 1]; + result[2] = hex2[2 * lo]; + result[3] = hex2[2 * lo + 1]; + return result; +} + +static String valueToQuotedStringN(const char* value, unsigned length) { + if (value == nullptr) + return ""; + + if (!isAnyCharRequiredQuoting(value, length)) + return String("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to String is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL + String result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid = 0x20) + result += static_cast(cp); + else if (cp < 0x10000) { // codepoint is in Basic Multilingual Plane + result += "\\u"; + result += toHex16Bit(cp); + } else { // codepoint is not in Basic Multilingual Plane + // convert to surrogate pair first + cp -= 0x10000; + result += "\\u"; + result += toHex16Bit((cp >> 10) + 0xD800); + result += "\\u"; + result += toHex16Bit((cp & 0x3FF) + 0xDC00); + } + } break; + } + } + result += "\""; + return result; +} + +String valueToQuotedString(const char* value) { + return valueToQuotedStringN(value, static_cast(strlen(value))); +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() = default; + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + + = default; + +void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } + +void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } + +void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } + +String FastWriter::write(const Value& root) { + document_.clear(); + writeValue(root); + if (!omitEndingLineFeed_) + document_ += '\n'; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + if (!dropNullPlaceholders_) + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + document_ += valueToQuotedStringN(str, static_cast(end - str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + ArrayIndex size = value.size(); + for (ArrayIndex index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (auto it = members.begin(); it != members.end(); ++it) { + const String& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), + static_cast(name.length())); + document_ += yamlCompatibilityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() = default; + +String StyledWriter::write(const Value& root) { + document_.clear(); + addChildValues_ = false; + indentString_.clear(); + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += '\n'; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + const String& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultilineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultilineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const String& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const String& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(indentString_.size() >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += '\n'; + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += '\n'; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += '\n'; + document_ += root.getComment(commentAfter); + document_ += '\n'; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(String indentation) + : document_(nullptr), indentation_(std::move(indentation)), + addChildValues_(), indented_(false) {} + +void StyledStreamWriter::write(OStream& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_.clear(); + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = nullptr; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + const String& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultilineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultilineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const String& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const String& value) { + if (!indented_) + writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter { + BuiltStyledStreamWriter(String indentation, + CommentStyle::Enum cs, + String colonSymbol, + String nullSymbol, + String endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision, + PrecisionType precisionType); + int write(Value const& root, OStream* sout) override; + +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultilineArray(Value const& value); + void pushValue(String const& value); + void writeIndent(); + void writeWithIndent(String const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + typedef std::vector ChildValues; + + ChildValues childValues_; + String indentString_; + unsigned int rightMargin_; + String indentation_; + CommentStyle::Enum cs_; + String colonSymbol_; + String nullSymbol_; + String endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; + bool useSpecialFloats_ : 1; + unsigned int precision_; + PrecisionType precisionType_; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter(String indentation, + CommentStyle::Enum cs, + String colonSymbol, + String nullSymbol, + String endingLineFeedSymbol, + bool useSpecialFloats, + unsigned int precision, + PrecisionType precisionType) + : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), + colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), + endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), + addChildValues_(false), indented_(false), + useSpecialFloats_(useSpecialFloats), precision_(precision), + precisionType_(precisionType) {} +int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_.clear(); + writeCommentBeforeValue(root); + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = nullptr; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, + precisionType_)); + break; + case stringValue: { + // Is NULL is possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + String const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedStringN( + name.data(), static_cast(name.length()))); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultilineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) + *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ((!indentation_.empty()) ? ", " : ","); + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) + *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(String const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(String const& value) { + if (!indented_) + writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) + return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( + Value const& root) { + if (cs_ == CommentStyle::None) + return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() : sout_(nullptr) {} +StreamWriter::~StreamWriter() = default; +StreamWriter::Factory::~Factory() = default; +StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } +StreamWriterBuilder::~StreamWriterBuilder() = default; +StreamWriter* StreamWriterBuilder::newStreamWriter() const { + String indentation = settings_["indentation"].asString(); + String cs_str = settings_["commentStyle"].asString(); + String pt_str = settings_["precisionType"].asString(); + bool eyc = settings_["enableYAMLCompatibility"].asBool(); + bool dnp = settings_["dropNullPlaceholders"].asBool(); + bool usf = settings_["useSpecialFloats"].asBool(); + unsigned int pre = settings_["precision"].asUInt(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + PrecisionType precisionType(significantDigits); + if (pt_str == "significant") { + precisionType = PrecisionType::significantDigits; + } else if (pt_str == "decimal") { + precisionType = PrecisionType::decimalPlaces; + } else { + throwRuntimeError("precisionType must be 'significant' or 'decimal'"); + } + String colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + String nullSymbol = "null"; + if (dnp) { + nullSymbol.clear(); + } + if (pre > 17) + pre = 17; + String endingLineFeedSymbol; + return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, + endingLineFeedSymbol, usf, pre, + precisionType); +} +static void getValidWriterKeys(std::set* valid_keys) { + valid_keys->clear(); + valid_keys->insert("indentation"); + valid_keys->insert("commentStyle"); + valid_keys->insert("enableYAMLCompatibility"); + valid_keys->insert("dropNullPlaceholders"); + valid_keys->insert("useSpecialFloats"); + valid_keys->insert("precision"); + valid_keys->insert("precisionType"); +} +bool StreamWriterBuilder::validate(Json::Value* invalid) const { + Json::Value my_invalid; + if (!invalid) + invalid = &my_invalid; // so we do not need to test for NULL + Json::Value& inv = *invalid; + std::set valid_keys; + getValidWriterKeys(&valid_keys); + Value::Members keys = settings_.getMemberNames(); + size_t n = keys.size(); + for (size_t i = 0; i < n; ++i) { + String const& key = keys[i]; + if (valid_keys.find(key) == valid_keys.end()) { + inv[key] = settings_[key]; + } + } + return inv.empty(); +} +Value& StreamWriterBuilder::operator[](const String& key) { + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) { + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + (*settings)["useSpecialFloats"] = false; + (*settings)["precision"] = 17; + (*settings)["precisionType"] = "significant"; + //! [StreamWriterBuilderDefaults] +} + +String writeString(StreamWriter::Factory const& factory, Value const& root) { + OStringStream sout; + StreamWriterPtr const writer(factory.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +OStream& operator<<(OStream& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: src/lib_json/json_writer.cpp +// ////////////////////////////////////////////////////////////////////// + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/main.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,207 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include +#include +#include +#include "TestStoneCodeGen_generated.hpp" + +using std::stringstream; + +int main() +{ + std::cout << "Hello world from testWasmIntegrated! (this is sent from C++)" << std::endl; + try + { + const char* jsonData = R"bgo({"definition": + { + "val" : [ "berk", 42 ], + "zozo" : { "23": "zloutch", "lalala": 42} + } + })bgo"; + std::string strValue(jsonData); + + Json::Value readValue; + + Json::CharReaderBuilder builder; + Json::CharReader* reader = builder.newCharReader(); + + StoneSmartPtr ptr(reader); + + std::string errors; + + bool ok = reader->parse( + strValue.c_str(), + strValue.c_str() + strValue.size(), + &readValue, + &errors + ); + if (!ok) + { + std::stringstream ss; + ss << "Jsoncpp parsing error: " << errors; + throw std::runtime_error(ss.str()); + } + std::cout << "Json parsing OK" << std::endl; + std::cout << readValue << std::endl; + } + catch(std::exception& e) + { + std::cout << "Json parsing THROW" << std::endl; + std::cout << "e.what() = " << e.what() << std::endl; + } +} + +extern "C" void SendMessageFromCppJS(const char* message); +extern "C" void SendFreeTextFromCppJS(const char* message); + +#define HANDLE_MESSAGE(Type,value) \ + stringstream ss; \ + ss << "Received an instance of:\n" #Type "\n. Here's the dump:\n"; \ + TestStoneCodeGen::StoneDumpValue(ss, value, 0); \ + SendFreeTextFromCppJS(ss.str().c_str()); \ + return true; + +#define ECHO_MESSAGE(Type,value) \ + stringstream ss; \ + ss << "Received an instance of:\n" #Type "\n. Here's the dump:\n"; \ + TestStoneCodeGen::StoneDumpValue(ss, value, 0); \ + SendFreeTextFromCppJS(ss.str().c_str()); \ + std::string serializedInCpp = StoneSerialize(value); \ + SendMessageFromCppJS(serializedInCpp.c_str()); \ + return true; + +class MyHandler : public TestStoneCodeGen::IHandler +{ + public: + virtual bool Handle(const TestStoneCodeGen::A& value) override + { + HANDLE_MESSAGE(TestStoneCodeGen::A,value) + } + virtual bool Handle(const TestStoneCodeGen::B& value) override + { + HANDLE_MESSAGE(TestStoneCodeGen::B,value) + } + + virtual bool Handle(const TestStoneCodeGen::Message1& value) override + { + HANDLE_MESSAGE(TestStoneCodeGen::Message1,value) + } + + virtual bool Handle(const TestStoneCodeGen::Message2& value) override + { + HANDLE_MESSAGE(TestStoneCodeGen::Message2,value) + } + + virtual bool Handle(const TestStoneCodeGen::C& value) override + { + HANDLE_MESSAGE(TestStoneCodeGen::C,value) + } +}; + +class MyEchoHandler : public TestStoneCodeGen::IHandler +{ + public: + virtual bool Handle(const TestStoneCodeGen::A& value) override + { + ECHO_MESSAGE(TestStoneCodeGen::A,value) + } + virtual bool Handle(const TestStoneCodeGen::B& value) override + { + ECHO_MESSAGE(TestStoneCodeGen::B,value) + } + + virtual bool Handle(const TestStoneCodeGen::Message1& value) override + { + ECHO_MESSAGE(TestStoneCodeGen::Message1,value) + } + + virtual bool Handle(const TestStoneCodeGen::Message2& value) override + { + ECHO_MESSAGE(TestStoneCodeGen::Message2,value) + } + + virtual bool Handle(const TestStoneCodeGen::C& value) override + { + ECHO_MESSAGE(TestStoneCodeGen::C,value) + } +}; + +extern "C" void EMSCRIPTEN_KEEPALIVE SendMessageToCpp(const char* message) +{ + MyHandler handler; + try + { + bool handled = TestStoneCodeGen::StoneDispatchToHandler(message,&handler); + if(!handled) + { + SendFreeTextFromCppJS("This message is valid JSON, but was not handled!"); + } + } + catch(std::exception& e) + { + stringstream ss; + ss << "Error while parsing message: " << e.what() << "\n"; + SendFreeTextFromCppJS(ss.str().c_str()); + } +} + +extern "C" void EMSCRIPTEN_KEEPALIVE SendMessageToCppForEcho(const char* message) +{ + MyEchoHandler echoHandler; + try + { + bool handled = TestStoneCodeGen::StoneDispatchToHandler(message,&echoHandler); + if(!handled) + { + SendFreeTextFromCppJS("This message is valid JSON, but was not handled by the echo handler!"); + } + } + catch(std::exception& e) + { + stringstream ss; + ss << "Error while parsing message: " << e.what() << "\n"; + SendFreeTextFromCppJS(ss.str().c_str()); + } +} + +void EMSCRIPTEN_KEEPALIVE StartWasmApplication(const char* baseUri) +{ + printf("Hello! (this is sent from C++)\n"); + +// // recreate a command line from uri arguments and parse it +// boost::program_options::variables_map parameters; +// boost::program_options::options_description options; +// application->DeclareStartupOptions(options); +// startupParametersBuilder.GetStartupParameters(parameters, options); + +// context.reset(new OrthancStone::StoneApplicationContext(broker)); +// context->SetOrthancBaseUrl(baseUri); +// printf("Base URL to Orthanc API: [%s]\n", baseUri); +// context->SetWebService(OrthancStone::WasmWebService::GetInstance()); +// context->SetDelayedCallExecutor(OrthancStone::WasmDelayedCallExecutor::GetInstance()); +// application->Initialize(context.get(), statusBar_, parameters); +// application->InitializeWasm(); + +// // viewport->SetSize(width_, height_); +// printf("StartWasmApplication - completed\n"); + SendFreeTextFromCppJS("Hello world from C++!"); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/serve.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/serve.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# tested on python 3.4 ,python of lower version has different module organization. +# from https://gist.github.com/HaiyangXu/ec88cbdce3cdbac7b8d5 +import http.server +from http.server import HTTPServer, BaseHTTPRequestHandler +import socketserver + +PORT = 8080 + +Handler = http.server.SimpleHTTPRequestHandler + +Handler.extensions_map = { + '.manifest': 'text/cache-manifest', + '.html': 'text/html', + '.png': 'image/png', + '.jpg': 'image/jpg', + '.svg': 'image/svg+xml', + '.wasm': 'application/wasm', + '.css': 'text/css', + '.js': 'application/x-javascript', + '': 'application/octet-stream', # Default +} + +httpd = socketserver.TCPServer(("", PORT), Handler) + +print("serving at port", PORT) +httpd.serve_forever() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/styles.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/styles.css Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,66 @@ +.TestWasm-grid-container { + display: grid; + grid-template-columns: 0.55fr 0.55fr 0.55fr 0.55fr 0.6fr 1.1fr 1.1fr; + grid-template-rows: 1.1fr 0.9fr 0.2fr 0.3fr 0.1fr 0.3fr 0.1fr; + grid-template-areas: + "SerializedInput SerializedInput SerializedInput SerializedInput ButtonContainer CppOutput CppOutput" + "SerializedInput SerializedInput SerializedInput SerializedInput ButtonContainer CppOutput CppOutput" + ". . . . . . ." + "Test1 Test2 Test3 Test4 . . ." + ". . . . . . ." + "Test5 Test6 Test7 Test8 . . ." + "TestTsCppTs . . . . . ." + ". . . . . . ." + ; + height: 480px; + } + + .TestWasm-ButtonContainer { + display: grid; + grid-template-columns: 0.2fr 0.8fr 0.2fr; + grid-template-rows: 0.2fr 0.5fr 0.2fr 0.5fr 0.2fr 0.5fr 0.2fr; + grid-template-areas: + ". . ." + ". TriggerButton ." + ". . ." + ". ClearButton ." + ". . ." + ". ShowSchemaButton ." + ". . ." + ; + } + + .TestWasm-TriggerButton { grid-area: TriggerButton; } + + .TestWasm-ClearButton { grid-area: ClearButton; } + + .TestWasm-ShowSchemaButton { grid-area: ShowSchemaButton; } + + +.TestWasm-SerializedInput { grid-area: SerializedInput; } + +.TestWasm-CppOutput { grid-area: CppOutput; } + +.TestWasm-ButtonContainer { grid-area: ButtonContainer; } + +.TestWasm-Test1 { grid-area: Test1; } + +.TestWasm-Test2 { grid-area: Test2; } + +.TestWasm-Test3 { grid-area: Test3; } + +.TestWasm-Test4 { grid-area: Test4; } + +.TestWasm-Test5 { grid-area: Test5; } + +.TestWasm-Test6 { grid-area: Test6; } + +.TestWasm-Test7 { grid-area: Test7; } + +.TestWasm-Test8 { grid-area: Test8; } + +.TestWasm-ts-cpp-ts { grid-area: TestTsCppTs; } + +.TestWasm-button { + width:80px; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,82 @@ + + + + + + + + Javascript to WASM message passing + + + + +
+ + +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + + + + + +
+ + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.ts Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,210 @@ +var SendMessageToCpp: Function = null; +export var TestWasmIntegratedModule : any; + +import * as TestStoneCodeGen from './build-wasm/TestStoneCodeGen_generated' + +/* ++--------------------------------------------------+ +| install emscripten handlers | ++--------------------------------------------------+ +*/ + +// ( window).Module = { +// preRun: [ +// function() { +// console.log('Loading the Stone Framework using WebAssembly'); +// } +// ], +// postRun: [ +// function() { +// // This function is called by ".js" wrapper once the ".wasm" +// // WebAssembly module has been loaded and compiled by the +// // browser +// console.log('WebAssembly is ready'); +// // window.SendMessageToCpp = ( window).Module.cwrap('SendMessageToCpp', 'string', ['string']); +// // window.SendFreeTextToCpp = ( window).Module.cwrap('SendFreeTextToCpp', 'string', ['string']); +// } +// ], +// print: function(text : string) { +// console.log(text); +// }, +// printErr: function(text : string) { +// console.error(text); +// }, +// totalDependencies: 0 +// }; + +/* ++--------------------------------------------------+ +| install handlers | ++--------------------------------------------------+ +*/ +document.querySelectorAll(".TestWasm-button").forEach((e) => { + (e as HTMLButtonElement).addEventListener("click", () => { + ButtonClick(e.attributes["tool-selector"].value); + }); +}); + +/* ++--------------------------------------------------+ +| define stock messages | ++--------------------------------------------------+ +*/ +let schemaText: string = null; +fetch("testTestStoneCodeGen.yaml").then(function(res) {return res.text();}).then(function(text) {schemaText = text;}); + +let stockSerializedMessages = new Map(); +stockSerializedMessages["Test CppHandler message2"] = null; +fetch("cppHandler_test_Message2.json").then(function(res) {return res.text();}).then(function(text) {stockSerializedMessages["Test CppHandler message2"] = text;}); + +stockSerializedMessages["Test 2"] = ` { + "type" : "TestStoneCodeGen.Message1", + "value" : { + "memberInt32" : -987, + "memberString" : "SalomΓ©", + "memberEnumMonth" : "March", + "memberBool" : true, + "memberFloat32" : 0.1, + "memberFloat64" : -0.2, + "extraMember" : "don't care" + } +}`; +stockSerializedMessages["Test 3"] = "Test 3 stock message sdfsfsdfsdf"; +stockSerializedMessages["Test 4"] = "Test 4 stock message 355345345"; +stockSerializedMessages["Test 5"] = "Test 5 stock message 34535"; +stockSerializedMessages["Test 6"] = "Test 6 stock message xcvcxvx"; +stockSerializedMessages["Test 7"] = "Test 7 stock message fgwqewqdgg"; +stockSerializedMessages["Test 8"] = "Test 8 stock message fgfsdfsdgg"; + +/* ++--------------------------------------------------+ +| define handler | ++--------------------------------------------------+ +*/ + +function setSerializedInputValue(text: string) { + let e : HTMLTextAreaElement = document.getElementById('TestWasm-SerializedInput') as HTMLTextAreaElement; + e.value = text; +} + +function getSerializedInputValue(): string { + let e : HTMLTextAreaElement = document.getElementById('TestWasm-SerializedInput') as HTMLTextAreaElement; + return e.value; +} + +function setCppOutputValue(text: string) { + let e : HTMLTextAreaElement = document.getElementById('TestWasm-CppOutput') as HTMLTextAreaElement; + e.value = text; +} + +function getCppOutputValue(): string { + let e : HTMLTextAreaElement = document.getElementById('TestWasm-CppOutput') as HTMLTextAreaElement; + return e.value; +} + +function SendFreeTextFromCpp(txt: string):string +{ + setCppOutputValue(getCppOutputValue() + "\n" + txt); + return ""; +} +( window).SendFreeTextFromCpp = SendFreeTextFromCpp; + +var referenceMessages = Array(); + +function testTsCppTs() { + var r = new TestStoneCodeGen.Message2(); + r.memberEnumMovieType = TestStoneCodeGen.MovieType.RomCom; + r.memberStringWithDefault = "overriden"; + r.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives] = 0.5; + r.memberString = "reference-messsage2-test1"; + + referenceMessages[r.memberString] = r; + var strMsg2 = r.StoneSerialize(); + let SendMessageToCppForEchoLocal = ( window).Module.cwrap('SendMessageToCppForEcho', 'string', ['string']); + SendMessageToCppForEchoLocal(strMsg2); +} + +class MyEchoHandler implements TestStoneCodeGen.IHandler +{ + public HandleMessage2(value: TestStoneCodeGen.Message2): boolean + { + if (value.memberString in referenceMessages) { + let r = referenceMessages[value.memberString]; + let equals = (value.memberStringWithDefault == r.memberStringWithDefault); + if (TestStoneCodeGen.CrispType.CreamAndChives in r.memberMapEnumFloat) { + equals == equals && r.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives] == value.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives]; + } + // TODO continue comparison + + if (equals) { + console.log("objects are equals after round trip"); + return true; + } + } + console.log("problem after round trip"); + return true; + } +} + +function SendMessageFromCpp(txt: string):string +{ + setCppOutputValue(getCppOutputValue() + "\n" + txt); + TestStoneCodeGen.StoneDispatchToHandler(txt, new MyEchoHandler()); + return ""; +} +( window).SendMessageFromCpp = SendMessageFromCpp; + + + +function ButtonClick(buttonName: string) { + if (buttonName.startsWith('Test ')) { + setSerializedInputValue(stockSerializedMessages[buttonName]); + } + else if (buttonName == "Test-ts-cpp-ts") { + testTsCppTs(); + } + else if(buttonName == 'Trigger') + { + let serializedInputValue:string = getSerializedInputValue(); + + let SendMessageToCppLocal = ( window).Module.cwrap('SendMessageToCpp', 'string', ['string']); + SendMessageToCppLocal(serializedInputValue); + } + else if(buttonName == 'Clear') + { + setCppOutputValue(""); + } + else if(buttonName == 'ShowSchema') + { + setCppOutputValue(schemaText); + } + else + { + throw new Error("Internal error!"); + } +} + + + +// this method is called "from the C++ code" when the StoneApplication is updated. +// it can be used to update the UI of the application +function UpdateWebApplicationWithString(statusUpdateMessageString: string) { + console.log("updating web application (string): ", statusUpdateMessageString); + let statusUpdateMessage = JSON.parse(statusUpdateMessageString); + + if ("event" in statusUpdateMessage) + { + let eventName = statusUpdateMessage["event"]; + if (eventName == "appStatusUpdated") + { + //ui.onAppStatusUpdated(statusUpdateMessage["data"]); + } + } +} + + +function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { + console.log("updating web application (serialized message): ", statusUpdateMessageString); + console.log(""); +} + \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/test2.yaml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/test2.yaml Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,17 @@ +enum EnumMonth0: + - January + - February + - Month + +struct Message1: + a: int32 + b: string + c: EnumMonth0 + d: bool + +struct Message2: + toto: string + tata: vector + tutu: vector + titi: map + lulu: map diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/testTestStoneCodeGen.yaml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/testTestStoneCodeGen.yaml Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +# +# 1 2 3 4 5 6 7 8 +# 345678901234567890123456789012345678901234567890123456789012345678901234567890 +# +rootName: TestStoneCodeGen + +struct B: + __handler: cpp + + someAs: vector + someInts: vector + +struct C: + __handler: cpp + + someBs: vector + ddd: vector + +struct A: + __handler: cpp + + someStrings: vector + someInts2: vector + movies: vector + +struct Message1: + __handler: cpp + + memberInt32: int32 + memberString: string + memberEnumMonth: EnumMonth0 + memberBool: bool + memberFloat32: float32 + memberFloat64: float64 + +struct Message2: + __handler: [cpp, ts] + + memberString: string + memberStringWithDefault: string = "my-default-value" + memberVectorOfMessage1: vector + memberVectorOfString: vector + memberMapStringString: map + memberMapStringStruct: map + memberMapEnumFloat: map + memberEnumMovieType: MovieType + memberJson: json + +enum MovieType: + - RomCom + - Horror + - ScienceFiction + - Vegetables + +enum CrispType: + - SaltAndPepper + - CreamAndChives + - Paprika + - Barbecue + +enum EnumMonth0: + - January + - February + - March diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,275 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "BasicScene.h" + +// From Stone +#include "Framework/Scene2D/Scene2D.h" +#include "Framework/Scene2D/ColorTextureSceneLayer.h" +#include "Framework/Scene2D/PolylineSceneLayer.h" +#include "Framework/Scene2D/TextSceneLayer.h" + +#include "Framework/Scene2D/PanSceneTracker.h" +#include "Framework/Scene2D/ZoomSceneTracker.h" +#include "Framework/Scene2D/RotateSceneTracker.h" + +#include "Framework/Scene2D/CairoCompositor.h" + +// From Orthanc framework +#include +#include +#include + +using namespace OrthancStone; + +const unsigned int BASIC_SCENE_FONT_SIZE = 32; +const int BASIC_SCENE_LAYER_POSITION = 150; + +void PrepareScene(Scene2D& scene) +{ + //Scene2D& scene(*controller->GetScene()); + // Texture of 2x2 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + p[3] = 0; + p[4] = 255; + p[5] = 0; + + p = reinterpret_cast(i.GetRow(1)); + p[0] = 0; + p[1] = 0; + p[2] = 255; + + p[3] = 255; + p[4] = 0; + p[5] = 0; + + scene.SetLayer(12, new ColorTextureSceneLayer(i)); + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-3, 2); + l->SetPixelSpacing(1.5, 1); + l->SetAngle(20.0 / 180.0 * 3.14); + scene.SetLayer(14, l.release()); + } + + // Texture of 1x1 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-2, 1); + l->SetAngle(20.0 / 180.0 * 3.14); + scene.SetLayer(13, l.release()); + } + + // Some lines + { + std::unique_ptr layer(new PolylineSceneLayer); + + layer->SetThickness(1); + + PolylineSceneLayer::Chain chain; + chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); + chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); + layer->AddChain(chain, true, 255, 0, 0); + + chain.clear(); + chain.push_back(ScenePoint2D(-5, -5)); + chain.push_back(ScenePoint2D(5, -5)); + chain.push_back(ScenePoint2D(5, 5)); + chain.push_back(ScenePoint2D(-5, 5)); + layer->AddChain(chain, true, 0, 255, 0); + + double dy = 1.01; + chain.clear(); + chain.push_back(ScenePoint2D(-4, -4)); + chain.push_back(ScenePoint2D(4, -4 + dy)); + chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); + chain.push_back(ScenePoint2D(4, 2)); + layer->AddChain(chain, false, 0, 0, 255); + + // layer->SetColor(0,255, 255); + scene.SetLayer(50, layer.release()); + } + + // Some text + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetText("Hello"); + scene.SetLayer(100, layer.release()); + } +} + +#if ORTHANC_SANDBOXED == 0 +void TakeScreenshot(const std::string& target, + const OrthancStone::Scene2D& scene, + unsigned int canvasWidth, + unsigned int canvasHeight) +{ + using namespace OrthancStone; + // Take a screenshot, then save it as PNG file + CairoCompositor compositor(scene, canvasWidth, canvasHeight); + compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); + compositor.Refresh(); + + Orthanc::ImageAccessor canvas; + compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); + Orthanc::ImageProcessing::Convert(png, canvas); + + Orthanc::PngWriter writer; + writer.WriteToFile(target, png); +} +#endif + +void ShowCursorInfo(Scene2D& scene, const PointerEvent& pointerEvent) +{ + ScenePoint2D p = pointerEvent.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + + char buf[64]; + sprintf(buf, "(%0.02f,%0.02f)", p.GetX(), p.GetY()); + + if (scene.HasLayer(BASIC_SCENE_LAYER_POSITION)) + { + TextSceneLayer& layer = + dynamic_cast(scene.GetLayer(BASIC_SCENE_LAYER_POSITION)); + layer.SetText(buf); + layer.SetPosition(p.GetX(), p.GetY()); + } + else + { + std::unique_ptr + layer(new TextSceneLayer); + layer->SetColor(0, 255, 0); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_BottomCenter); + layer->SetPosition(p.GetX(), p.GetY()); + scene.SetLayer(BASIC_SCENE_LAYER_POSITION, layer.release()); + } +} + + + +bool BasicScene2DInteractor::OnMouseEvent(const GuiAdapterMouseEvent& event, const PointerEvent& pointerEvent) +{ + if (currentTracker_.get() != NULL) + { + switch (event.type) + { + case GUIADAPTER_EVENT_MOUSEUP: + { + currentTracker_->PointerUp(pointerEvent); + if (!currentTracker_->IsAlive()) + { + currentTracker_.reset(); + } + };break; + case GUIADAPTER_EVENT_MOUSEMOVE: + { + currentTracker_->PointerMove(pointerEvent); + };break; + default: + return false; + } + return true; + } + else if (event.type == GUIADAPTER_EVENT_MOUSEDOWN) + { + if (event.button == GUIADAPTER_MOUSEBUTTON_LEFT) + { + currentTracker_.reset(new RotateSceneTracker(viewportController_, pointerEvent)); + } + else if (event.button == GUIADAPTER_MOUSEBUTTON_MIDDLE) + { + currentTracker_.reset(new PanSceneTracker(viewportController_, pointerEvent)); + } + else if (event.button == GUIADAPTER_MOUSEBUTTON_RIGHT) + { + currentTracker_.reset(new ZoomSceneTracker(viewportController_, pointerEvent, viewportController_->GetViewport().GetCanvasHeight())); + } + } + else if (event.type == GUIADAPTER_EVENT_MOUSEMOVE) + { + if (showCursorInfo_) + { + Scene2D& scene(viewportController_->GetScene()); + ShowCursorInfo(scene, pointerEvent); + } + return true; + } + return false; +} + +bool BasicScene2DInteractor::OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) +{ + if (guiEvent.type == GUIADAPTER_EVENT_KEYDOWN) + { + switch (guiEvent.sym[0]) + { + case 's': + { + //viewportController_->FitContent(viewportController_->GetViewport().GetCanvasWidth(), viewportController_->GetViewport().GetCanvasHeight()); + viewportController_->FitContent(); + return true; + }; +#if ORTHANC_SANDBOXED == 0 + case 'c': + { + Scene2D& scene(viewportController_->GetScene()); + TakeScreenshot("screenshot.png", scene, viewportController_->GetViewport().GetCanvasWidth(), viewportController_->GetViewport().GetCanvasHeight()); + return true; + } +#endif + case 'd': + { + showCursorInfo_ = !showCursorInfo_; + if (!showCursorInfo_) + { + Scene2D& scene(viewportController_->GetScene()); + scene.DeleteLayer(BASIC_SCENE_LAYER_POSITION); + } + + return true; + } + } + } + return false; +} + +bool BasicScene2DInteractor::OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) +{ + return false; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include "Framework/Scene2DViewport/ViewportController.h" +#include "Framework/Scene2D/Scene2D.h" + +extern const unsigned int BASIC_SCENE_FONT_SIZE; +extern const int BASIC_SCENE_LAYER_POSITION; + +extern void PrepareScene(OrthancStone::Scene2D& scene); +extern void TakeScreenshot(const std::string& target, + const OrthancStone::Scene2D& scene, + unsigned int canvasWidth, + unsigned int canvasHeight); + + +#include "Applications/Generic/Scene2DInteractor.h" +#include "Framework/Scene2DViewport/IFlexiblePointerTracker.h" + + +class BasicScene2DInteractor : public OrthancStone::Scene2DInteractor +{ + boost::shared_ptr currentTracker_; + bool showCursorInfo_; +public: + BasicScene2DInteractor(boost::shared_ptr viewportController) : + Scene2DInteractor(viewportController), + showCursorInfo_(false) + {} + + virtual bool OnMouseEvent(const OrthancStone::GuiAdapterMouseEvent& event, const OrthancStone::PointerEvent& pointerEvent) override; + virtual bool OnKeyboardEvent(const OrthancStone::GuiAdapterKeyboardEvent& guiEvent) override; + virtual bool OnWheelEvent(const OrthancStone::GuiAdapterWheelEvent& guiEvent) override; +}; + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainQt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainQt.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#define GLEW_STATIC 1 +// From Stone +#include "../../Framework/OpenGL/OpenGLIncludes.h" +#include "../../Applications/Sdl/SdlWindow.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" +#include "../../Framework/Scene2D/Scene2D.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" +#include "../../Framework/Scene2DViewport/UndoStack.h" + +#include "../../Framework/StoneInitialization.h" +#include "../../Framework/Messages/MessageBroker.h" + +// From Orthanc framework +#include +#include +#include +#include +#include + +#include +#include +#include "EmbeddedResources.h" + +#include +#include +#include + +#include "BasicScene.h" + + +using namespace OrthancStone; + + + +static void GLAPIENTRY OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam ) +{ + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), + type, severity, message ); + } +} + +extern void InitGL(); + +#include +#include "BasicSceneWindow.h" + +int main(int argc, char* argv[]) +{ + QApplication a(argc, argv); + + OrthancStone::Samples::BasicSceneWindow window; + window.show(); + window.GetOpenGlWidget().Init(); + + MessageBroker broker; + boost::shared_ptr undoStack(new UndoStack); + boost::shared_ptr controller = boost::make_shared(undoStack, boost::ref(broker), window.GetOpenGlWidget()); + PrepareScene(controller->GetScene()); + + window.GetOpenGlWidget().GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); + + boost::shared_ptr interactor(new BasicScene2DInteractor(controller)); + window.GetOpenGlWidget().SetInteractor(interactor); + + controller->FitContent(); + + return a.exec(); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainSdl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainSdl.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,199 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +// From Stone +#include "Framework/Viewport/SdlViewport.h" +#include "Framework/Scene2D/OpenGLCompositor.h" +#include "Framework/Scene2DViewport/UndoStack.h" +#include "Framework/StoneInitialization.h" +#include "Framework/Messages/MessageBroker.h" + +// From Orthanc framework +#include +#include + +#include +#include + +#include +#include + + +#include "BasicScene.h" + +using namespace OrthancStone; + +boost::shared_ptr interactor; + +void HandleApplicationEvent(boost::shared_ptr controller, + const SDL_Event& event) +{ + using namespace OrthancStone; + Scene2D& scene(controller->GetScene()); + if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP || event.type == SDL_MOUSEMOTION) + { + // TODO: this code is copy/pasted from GuiAdapter::Run() -> find the right place + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + bool ctrlPressed(false); + bool shiftPressed(false); + bool altPressed(false); + + if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) + altPressed = true; + + GuiAdapterMouseEvent guiEvent; + ConvertFromPlatform(guiEvent, ctrlPressed, shiftPressed, altPressed, event); + PointerEvent pointerEvent; + pointerEvent.AddPosition(controller->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); + + interactor->OnMouseEvent(guiEvent, pointerEvent); + return; + } + else if ((event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) && event.key.repeat == 0 /* Ignore key bounce */) + { + GuiAdapterKeyboardEvent guiEvent; + ConvertFromPlatform(guiEvent, event); + + interactor->OnKeyboardEvent(guiEvent); + } + +} + + +static void GLAPIENTRY +OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam ) +{ + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), + type, severity, message ); + } +} + + +void Run(boost::shared_ptr controller) +{ + SdlViewport& sdlViewport = dynamic_cast(controller->GetViewport()); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); + + controller->GetViewport().GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); + + controller->GetViewport().Refresh(); + controller->FitContent(); + + + bool stop = false; + while (!stop) + { + controller->GetViewport().Refresh(); + + SDL_Event event; + while (!stop && + SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + stop = true; + break; + } + else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + sdlViewport.UpdateSize(event.window.data1, event.window.data2); + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + sdlViewport.GetWindow().ToggleMaximize(); + break; + + case SDLK_q: + stop = true; + break; + + default: + break; + } + } + + HandleApplicationEvent(controller, event); + } + + SDL_Delay(1); + } + interactor.reset(); +} + + + + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + using namespace OrthancStone; + StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); + + try + { + SdlOpenGLViewport viewport("Hello", 1024, 768); + MessageBroker broker; + boost::shared_ptr undoStack(new UndoStack); + boost::shared_ptr controller = boost::make_shared(undoStack, boost::ref(broker), boost::ref(viewport)); + interactor.reset(new BasicScene2DInteractor(controller)); + PrepareScene(controller->GetScene()); + Run(controller); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + StoneFinalize(); + + return 0; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "../../Framework/OpenGL/OpenGLIncludes.h" +#include "BasicSceneWindow.h" + +/** + * Don't use "ui_MainWindow.h" instead of below, as + * this makes CMake unable to detect when the UI file changes. + **/ +#include +#include "../../Applications/Samples/SampleApplicationBase.h" + +namespace OrthancStone +{ + namespace Samples + { + + BasicSceneWindow::BasicSceneWindow( + QWidget *parent) : + ui_(new Ui::BasicSceneWindow) + { + ui_->setupUi(this); + } + + BasicSceneWindow::~BasicSceneWindow() + { + delete ui_; + } + + QStoneOpenGlWidget& BasicSceneWindow::GetOpenGlWidget() + { + return *(ui_->centralWidget); + } + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once +#include +#include +// #include "../../Qt/QCairoWidget.h" +// #include "../../Qt/QStoneMainWindow.h" + +namespace Ui +{ + class BasicSceneWindow; +} + +namespace OrthancStone +{ + namespace Samples + { + + //class SampleSingleCanvasApplicationBase; + + class BasicSceneWindow : public QMainWindow + { + Q_OBJECT + + private: + Ui::BasicSceneWindow* ui_; + //SampleSingleCanvasApplicationBase& stoneSampleApplication_; + + public: + explicit BasicSceneWindow(QWidget *parent = 0); + ~BasicSceneWindow(); + + QStoneOpenGlWidget& GetOpenGlWidget(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.ui Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ + + + BasicSceneWindow + + + + 0 + 0 + 903 + 634 + + + + + 500 + 300 + + + + + 500 + 300 + + + + Stone of Orthanc + + + Qt::LeftToRight + + + + + 0 + 0 + + + + Qt::LeftToRight + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 500 + + + + + + + + + + 0 + 0 + 903 + 21 + + + + + Test + + + + + + + + + QStoneOpenGlWidget + QWidget +
QStoneOpenGlWidget.h
+
+
+ + +
diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,83 @@ +cmake_minimum_required(VERSION 2.8.3) + +##################################################################### +## Configuration of the Orthanc framework +##################################################################### + +# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it +# must be the first inclusion +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.5.7") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + + +##################################################################### +## Configuration of the Stone framework +##################################################################### + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +set(ORTHANC_STONE_APPLICATION_RESOURCES + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) +SET(ENABLE_QT ON) +SET(ENABLE_SDL OFF) +SET(ENABLE_WEB_CLIENT ON) +SET(ORTHANC_SANDBOXED OFF) +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) + +add_definitions( + -DORTHANC_ENABLE_LOGGING_PLUGIN=0 + ) +##################################################################### +## Build the samples +##################################################################### + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + +list(APPEND BASIC_SCENE_APPLICATIONS_SOURCES + BasicSceneWindow.cpp + ) + +ORTHANC_QT_WRAP_UI(BASIC_SCENE_APPLICATIONS_SOURCES + BasicSceneWindow.ui + ) + +ORTHANC_QT_WRAP_CPP(BASIC_SCENE_APPLICATIONS_SOURCES + BasicSceneWindow.h + QStoneOpenGlWidget.h + ) + +add_executable(MpBasicScene + ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/BasicScene.h + ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/BasicScene.cpp + ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/mainQt.cpp + QStoneOpenGlWidget.cpp + ${BASIC_SCENE_APPLICATIONS_SOURCES} + ) + +target_include_directories(MpBasicScene PUBLIC ${CMAKE_SOURCE_DIR} ${ORTHANC_STONE_ROOT}) +target_link_libraries(MpBasicScene OrthancStone) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,192 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "../../Framework/OpenGL/OpenGLIncludes.h" +#include "QStoneOpenGlWidget.h" + +#include + +using namespace OrthancStone; + +void QStoneOpenGlWidget::initializeGL() +{ + glewInit(); +} + +void QStoneOpenGlWidget::MakeCurrent() +{ + this->makeCurrent(); +} + +void QStoneOpenGlWidget::resizeGL(int w, int h) +{ + +} + +void QStoneOpenGlWidget::paintGL() +{ + if (compositor_) + { + compositor_->Refresh(); + } + doneCurrent(); +} + +void ConvertFromPlatform( + OrthancStone::GuiAdapterMouseEvent& guiEvent, + PointerEvent& pointerEvent, + const QMouseEvent& qtEvent, + const IViewport& viewport) +{ + guiEvent.targetX = qtEvent.x(); + guiEvent.targetY = qtEvent.y(); + pointerEvent.AddPosition(viewport.GetPixelCenterCoordinates(guiEvent.targetX, guiEvent.targetY)); + + switch (qtEvent.button()) + { + case Qt::LeftButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_LEFT; break; + case Qt::MiddleButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_MIDDLE; break; + case Qt::RightButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_RIGHT; break; + default: + guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_LEFT; + } + + if (qtEvent.modifiers().testFlag(Qt::ShiftModifier)) + { + guiEvent.shiftKey = true; + } + if (qtEvent.modifiers().testFlag(Qt::ControlModifier)) + { + guiEvent.ctrlKey = true; + } + if (qtEvent.modifiers().testFlag(Qt::AltModifier)) + { + guiEvent.altKey = true; + } +} + +void QStoneOpenGlWidget::mouseEvent(QMouseEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType) +{ + OrthancStone::GuiAdapterMouseEvent guiEvent; + PointerEvent pointerEvent; + ConvertFromPlatform(guiEvent, pointerEvent, *qtEvent, *this); + guiEvent.type = guiEventType; + + if (sceneInteractor_.get() != NULL && compositor_.get() != NULL) + { + sceneInteractor_->OnMouseEvent(guiEvent, pointerEvent); + } + + // force redraw of the OpenGL widget + update(); +} + +void QStoneOpenGlWidget::mousePressEvent(QMouseEvent* qtEvent) +{ + mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEDOWN); +} + +void QStoneOpenGlWidget::mouseMoveEvent(QMouseEvent* qtEvent) +{ + mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEMOVE); +} + +void QStoneOpenGlWidget::mouseReleaseEvent(QMouseEvent* qtEvent) +{ + mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEUP); +} + +void ConvertFromPlatform( + OrthancStone::GuiAdapterKeyboardEvent& guiEvent, + const QKeyEvent& qtEvent) +{ + if (qtEvent.text().length() > 0) + { + guiEvent.sym[0] = qtEvent.text()[0].cell(); + } + else + { + guiEvent.sym[0] = 0; + } + guiEvent.sym[1] = 0; + + if (qtEvent.modifiers().testFlag(Qt::ShiftModifier)) + { + guiEvent.shiftKey = true; + } + if (qtEvent.modifiers().testFlag(Qt::ControlModifier)) + { + guiEvent.ctrlKey = true; + } + if (qtEvent.modifiers().testFlag(Qt::AltModifier)) + { + guiEvent.altKey = true; + } + +} + + +bool QStoneOpenGlWidget::keyEvent(QKeyEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType) +{ + bool handled = false; + OrthancStone::GuiAdapterKeyboardEvent guiEvent; + ConvertFromPlatform(guiEvent, *qtEvent); + guiEvent.type = guiEventType; + + if (sceneInteractor_.get() != NULL && compositor_.get() != NULL) + { + handled = sceneInteractor_->OnKeyboardEvent(guiEvent); + + if (handled) + { + // force redraw of the OpenGL widget + update(); + } + } + return handled; +} + +void QStoneOpenGlWidget::keyPressEvent(QKeyEvent *qtEvent) +{ + bool handled = keyEvent(qtEvent, GUIADAPTER_EVENT_KEYDOWN); + if (!handled) + { + QOpenGLWidget::keyPressEvent(qtEvent); + } +} + +void QStoneOpenGlWidget::keyReleaseEvent(QKeyEvent *qtEvent) +{ + bool handled = keyEvent(qtEvent, GUIADAPTER_EVENT_KEYUP); + if (!handled) + { + QOpenGLWidget::keyPressEvent(qtEvent); + } +} + +void QStoneOpenGlWidget::wheelEvent(QWheelEvent *qtEvent) +{ + OrthancStone::GuiAdapterWheelEvent guiEvent; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + + // force redraw of the OpenGL widget + update(); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,111 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once +#include "../../Framework/OpenGL/OpenGLIncludes.h" +#include +#include +#include + +#include +#include "../../Framework/OpenGL/IOpenGLContext.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Viewport/ViewportBase.h" +#include "../../Applications/Generic/Scene2DInteractor.h" + +namespace OrthancStone +{ + class QStoneOpenGlWidget : + public QOpenGLWidget, + public OpenGL::IOpenGLContext, + public ViewportBase + { + std::unique_ptr compositor_; + boost::shared_ptr sceneInteractor_; + QOpenGLContext openGlContext_; + + public: + QStoneOpenGlWidget(QWidget *parent) : + QOpenGLWidget(parent), + ViewportBase("QtStoneOpenGlWidget") // TODO: we shall be able to define a name but construction time is too early ! + { + setFocusPolicy(Qt::StrongFocus); // to enable keyPressEvent + setMouseTracking(true); // to enable mouseMoveEvent event when no button is pressed + } + + void Init() + { + QSurfaceFormat requestedFormat; + requestedFormat.setVersion( 2, 0 ); + openGlContext_.setFormat( requestedFormat ); + openGlContext_.create(); + openGlContext_.makeCurrent(context()->surface()); + + compositor_.reset(new OpenGLCompositor(*this, GetScene())); + } + + protected: + + //**** QWidget overrides + void initializeGL() override; + void resizeGL(int w, int h) override; + void paintGL() override; + + void mousePressEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent *event) override; + void wheelEvent(QWheelEvent* event) override; + + //**** IOpenGLContext overrides + + virtual void MakeCurrent() override; + virtual void SwapBuffer() override {} + + virtual unsigned int GetCanvasWidth() const override + { + return this->width(); + } + + virtual unsigned int GetCanvasHeight() const override + { + return this->height(); + } + + public: + + void SetInteractor(boost::shared_ptr sceneInteractor) + { + sceneInteractor_ = sceneInteractor; + } + + virtual ICompositor& GetCompositor() + { + return *compositor_; + } + + protected: + void mouseEvent(QMouseEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType); + bool keyEvent(QKeyEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType); + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,93 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Scene2DInteractor.h" + +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" + + +namespace OrthancStone +{ + +} + +using namespace OrthancStone; + + +bool BasicScene2DInteractor::OnMouseEvent(const GuiAdapterMouseEvent& event, const PointerEvent& pointerEvent) +{ + if (currentTracker_.get() != NULL) + { + switch (event.type) + { + case GUIADAPTER_EVENT_MOUSEUP: + { + currentTracker_->PointerUp(pointerEvent); + if (!currentTracker_->IsAlive()) + { + currentTracker_.reset(); + } + };break; + case GUIADAPTER_EVENT_MOUSEMOVE: + { + currentTracker_->PointerMove(pointerEvent); + };break; + } + return true; + } + else + { + if (event.button == GUIADAPTER_MOUSEBUTTON_LEFT) + { + currentTracker_.reset(new RotateSceneTracker(viewportController_, pointerEvent)); + } + else if (event.button == GUIADAPTER_MOUSEBUTTON_MIDDLE) + { + currentTracker_.reset(new PanSceneTracker(viewportController_, pointerEvent)); + } + else if (event.button == GUIADAPTER_MOUSEBUTTON_RIGHT && compositor_.get() != NULL) + { + currentTracker_.reset(new ZoomSceneTracker(viewportController_, pointerEvent, compositor_->GetHeight())); + } + return true; + } + return false; +} + +bool BasicScene2DInteractor::OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) +{ + switch (guiEvent.sym[0]) + { + case 's': + { + viewportController_->FitContent(compositor_->GetWidth(), compositor_->GetHeight()); + return true; + }; + } + return false; +} + +bool BasicScene2DInteractor::OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) +{ + return false; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Applications/Generic/Scene2DInteractor.h" +#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" + + +class BasicScene2DInteractor : public OrthancStone::Scene2DInteractor +{ + boost::shared_ptr currentTracker_; +public: + BasicScene2DInteractor(boost::shared_ptr viewportController) : + Scene2DInteractor(viewportController) + {} + + virtual bool OnMouseEvent(const OrthancStone::GuiAdapterMouseEvent& event, const OrthancStone::PointerEvent& pointerEvent) override; + virtual bool OnKeyboardEvent(const OrthancStone::GuiAdapterKeyboardEvent& guiEvent); + virtual bool OnWheelEvent(const OrthancStone::GuiAdapterWheelEvent& guiEvent); +}; + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/README.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,195 @@ + +**These samples are deprecated and not guaranteed to work. A migration to a +new version of the Stone API is underway.** + +Please read orthanc-stone/Samples/README.md first for general requirements. + + + +Deprecated -- to be sorted +=========================== + +The following assumes that the source code to be downloaded in +`~/orthanc-stone` and Orthanc source code to be checked out in +`~/orthanc`. + +Building the WASM samples +------------------------------------- + +``` +cd ~/orthanc-stone/Applications/Samples +./build-wasm.sh +``` + +Serving the WASM samples +------------------------------------ +``` +# launch an Orthanc listening on 8042 port: +Orthanc + +# launch an nginx that will serve the WASM static files and reverse +# proxy +sudo nginx -p $(pwd) -c nginx.local.conf +``` + +You can now open the samples in http://localhost:9977 + +Building the SDL native samples (SimpleViewer only) +--------------------------------------------------- + +The following also assumes that you have checked out the Orthanc +source code in an `orthanc` folder next to the Stone of Orthanc +repository, please enter the following: + +**Simple make generator with dynamic build** + +``` +# Please set $currentDir to the current folder +mkdir -p ~/builds/orthanc-stone-build +cd ~/builds/orthanc-stone-build +cmake -DORTHANC_FRAMEWORK_SOURCE=path \ + -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc \ + -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON \ + ~/orthanc-stone/Applications/Samples/ +``` + +**Ninja generator with static SDL build (pwsh script)** + +``` +# Please yourself one level above the orthanc-stone and orthanc folders +if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } +cd stone_build_sdl +cmake -G Ninja -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ +``` + +**Ninja generator with static SDL build (bash/zsh script)** + +``` +# Please yourself one level above the orthanc-stone and orthanc folders +if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } +cd stone_build_sdl +cmake -G Ninja -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="`pwd`/../orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ +``` + +**Visual Studio 2017 generator with static SDL build (pwsh script)** + +``` +# The following will use Visual Studio 2017 to build the SDL samples +# in debug mode (with multiple compilers in parallel). NOTE: place +# yourself one level above the `orthanc-stone` and `orthanc` folders + +if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } +cd stone_build_sdl +cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ +cmake --build . --config Debug +``` + +If you are working on Windows, add the correct generator option to +cmake to, for instance, generate msbuild files for Visual Studio. + +Then, under Linux: +``` +cmake --build . --target OrthancStoneSimpleViewer -- -j 5 +``` + +Note: replace `$($pwd)` with the current directory when not using Powershell + +Building the Qt native samples (SimpleViewer only) under Windows: +------------------------------------------------------------------ + +**Visual Studio 2017 generator with static Qt build (pwsh script)** + +For instance, if Qt is installed in `C:\Qt\5.12.0\msvc2017_64` + +``` +# The following will use Visual Studio 2017 to build the SDL samples +# in debug mode (with multiple compilers in parallel). NOTE: place +# yourself one level above the `orthanc-stone` and `orthanc` folders + +if( -not (test-path stone_build_qt)) { mkdir stone_build_qt } +cd stone_build_qt +cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DCMAKE_PREFIX_PATH=C:\Qt\5.12.0\msvc2017_64 -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_QT=ON ../orthanc-stone/Applications/Samples/ +cmake --build . --config Debug +``` + +Note: replace `$($pwd)` with the current directory when not using Powershell + + + + + + +Building the SDL native samples (SimpleViewer only) under Windows: +------------------------------------------------------------------ +`cmake -DSTATIC_BUILD=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON -G "Visual Studio 15 2017 Win64" ../orthanc-stone/Applications/Samples/` + +Note: replace `$($pwd)` with the current directory when not using Powershell + +Executing the native samples: +-------------------------------- +``` +# launch an Orthanc listening on 8042 port: +Orthanc + +# launch the sample +./OrthancStoneSimpleViewer --studyId=XX +``` + +Build the Application Samples +----------------------------- + +**Visual Studio 2008 (v90) ** + +``` +cmake -G "Visual Studio 9 2008" -DUSE_LEGACY_JSONCPP=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples +``` + +**Visual Studio 2019 (v142) ** + +``` +cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples +``` + +**Visual Studio 2017 (v140) ** + +``` +cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples +``` + + +Build the core Samples +--------------------------- +How to build the newest (2019-04-29) SDL samples under Windows, *inside* a +folder that is sibling to the orthanc-stone folder: + +**Visual Studio 2019 (v142) ** + +``` +cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl +``` + +**Visual Studio 2017 (v140) ** + +``` +cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl +``` + +**Visual Studio 2008 (v90) ** + +``` +cmake -G "Visual Studio 9 2008" -DUSE_LEGACY_JSONCPP=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl +``` + +And under Ubuntu (note the /mnt/c/osi/dev/orthanc folder): +``` +cmake -G "Ninja" -DENABLE_OPENGL=ON -DSTATIC_BUILD=OFF -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="/mnt/c/osi/dev/orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl +``` + +TODO trackers: +- CANCELLED (using outlined text now) text overlay 50% --> ColorTextureLayer 50% +- DONE angle tracker: draw arcs +- Handles on arc +- Select measure tool with hit test --> Delete command + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/BasicScene.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/BasicScene.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,418 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +// From Stone +#include "../../Framework/Viewport/SdlViewport.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" +#include "../../Framework/Scene2DViewport/UndoStack.h" + +#include "../../Framework/StoneInitialization.h" +#include "../../Framework/Messages/MessageBroker.h" + +// From Orthanc framework +#include +#include +#include +#include +#include + +#include + +#include +#include + +static const unsigned int FONT_SIZE = 32; +static const int LAYER_POSITION = 150; + +#define OPENGL_ENABLED 0 + +void PrepareScene(OrthancStone::Scene2D& scene) +{ + using namespace OrthancStone; + + // Texture of 2x2 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + p[3] = 0; + p[4] = 255; + p[5] = 0; + + p = reinterpret_cast(i.GetRow(1)); + p[0] = 0; + p[1] = 0; + p[2] = 255; + + p[3] = 255; + p[4] = 0; + p[5] = 0; + + scene.SetLayer(12, new ColorTextureSceneLayer(i)); + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-3, 2); + l->SetPixelSpacing(1.5, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + scene.SetLayer(14, l.release()); + } + + // Texture of 1x1 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-2, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + scene.SetLayer(13, l.release()); + } + + // Some lines + { + std::unique_ptr layer(new PolylineSceneLayer); + + layer->SetThickness(10); + + PolylineSceneLayer::Chain chain; + chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); + chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); + layer->AddChain(chain, true, 255, 0, 0); + + chain.clear(); + chain.push_back(ScenePoint2D(-5, -5)); + chain.push_back(ScenePoint2D(5, -5)); + chain.push_back(ScenePoint2D(5, 5)); + chain.push_back(ScenePoint2D(-5, 5)); + layer->AddChain(chain, true, 0, 255, 0); + + double dy = 1.01; + chain.clear(); + chain.push_back(ScenePoint2D(-4, -4)); + chain.push_back(ScenePoint2D(4, -4 + dy)); + chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); + chain.push_back(ScenePoint2D(4, 2)); + layer->AddChain(chain, false, 0, 0, 255); + + scene.SetLayer(50, layer.release()); + } + + // Some text + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetText("Hello"); + scene.SetLayer(100, layer.release()); + } +} + + +void TakeScreenshot(const std::string& target, + const OrthancStone::Scene2D& scene, + unsigned int canvasWidth, + unsigned int canvasHeight) +{ + using namespace OrthancStone; + // Take a screenshot, then save it as PNG file + CairoCompositor compositor(scene, canvasWidth, canvasHeight); + compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE, Orthanc::Encoding_Latin1); + compositor.Refresh(); + + Orthanc::ImageAccessor canvas; + compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); + Orthanc::ImageProcessing::Convert(png, canvas); + + Orthanc::PngWriter writer; + writer.WriteToFile(target, png); +} + + +void HandleApplicationEvent(const SDL_Event& event, + boost::shared_ptr& controller, + boost::shared_ptr& activeTracker) +{ + using namespace OrthancStone; + + Scene2D& scene = controller->GetScene(); + IViewport& viewport = controller->GetViewport(); + + if (event.type == SDL_MOUSEMOTION) + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + if (activeTracker.get() == NULL && + SDL_SCANCODE_LCTRL < scancodeCount && + keyboardState[SDL_SCANCODE_LCTRL]) + { + // The "left-ctrl" key is down, while no tracker is present + + PointerEvent e; + e.AddPosition(viewport.GetPixelCenterCoordinates(event.button.x, event.button.y)); + + ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + + char buf[64]; + sprintf(buf, "(%0.02f,%0.02f)", p.GetX(), p.GetY()); + + if (scene.HasLayer(LAYER_POSITION)) + { + TextSceneLayer& layer = + dynamic_cast(scene.GetLayer(LAYER_POSITION)); + layer.SetText(buf); + layer.SetPosition(p.GetX(), p.GetY()); + } + else + { + std::unique_ptr + layer(new TextSceneLayer); + layer->SetColor(0, 255, 0); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_BottomCenter); + layer->SetPosition(p.GetX(), p.GetY()); + scene.SetLayer(LAYER_POSITION, layer.release()); + } + } + else + { + scene.DeleteLayer(LAYER_POSITION); + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN) + { + PointerEvent e; + e.AddPosition(viewport.GetPixelCenterCoordinates(event.button.x, event.button.y)); + + switch (event.button.button) + { + case SDL_BUTTON_MIDDLE: + activeTracker = boost::make_shared(controller, e); + break; + + case SDL_BUTTON_RIGHT: + activeTracker = boost::make_shared + (controller, e, viewport.GetCanvasHeight()); + break; + + case SDL_BUTTON_LEFT: + activeTracker = boost::make_shared(controller, e); + break; + + default: + break; + } + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_s: + controller->FitContent(viewport.GetCanvasWidth(), + viewport.GetCanvasHeight()); + break; + + case SDLK_c: + TakeScreenshot("screenshot.png", scene, + viewport.GetCanvasWidth(), + viewport.GetCanvasHeight()); + break; + + default: + break; + } + } +} + +#if OPENGL_ENABLED==1 +static void GLAPIENTRY +OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam ) +{ + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), + type, severity, message ); + } +} +#endif + +void Run(OrthancStone::MessageBroker& broker, + OrthancStone::SdlViewport& viewport) +{ + using namespace OrthancStone; + + boost::shared_ptr controller( + new ViewportController(boost::make_shared(), broker, viewport)); + +#if OPENGL_ENABLED==1 + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); +#endif + + boost::shared_ptr tracker; + + bool firstShown = true; + bool stop = false; + while (!stop) + { + viewport.Refresh(); + + SDL_Event event; + while (!stop && + SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + stop = true; + break; + } + else if (event.type == SDL_MOUSEMOTION) + { + if (tracker) + { + PointerEvent e; + e.AddPosition(viewport.GetPixelCenterCoordinates( + event.button.x, event.button.y)); + tracker->PointerMove(e); + } + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + if (tracker) + { + PointerEvent e; + e.AddPosition(viewport.GetPixelCenterCoordinates( + event.button.x, event.button.y)); + tracker->PointerUp(e); + if(!tracker->IsAlive()) + tracker.reset(); + } + } + else if (event.type == SDL_WINDOWEVENT) + { + switch (event.window.event) + { + case SDL_WINDOWEVENT_SIZE_CHANGED: + tracker.reset(); + viewport.UpdateSize(event.window.data1, event.window.data2); + break; + + case SDL_WINDOWEVENT_SHOWN: + if (firstShown) + { + // Once the window is first shown, fit the content to its size + controller->FitContent(viewport.GetCanvasWidth(), viewport.GetCanvasHeight()); + firstShown = false; + } + + break; + + default: + break; + } + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + viewport.GetWindow().ToggleMaximize(); + break; + + case SDLK_q: + stop = true; + break; + + default: + break; + } + } + + HandleApplicationEvent(event, controller, tracker); + } + + SDL_Delay(1); + } +} + + + + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + OrthancStone::StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); + + try + { +#if OPENGL_ENABLED==1 + OrthancStone::SdlOpenGLViewport viewport("Hello", 1024, 768); +#else + OrthancStone::SdlCairoViewport viewport("Hello", 1024, 768); +#endif + PrepareScene(viewport.GetScene()); + + viewport.GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE, Orthanc::Encoding_Latin1); + + OrthancStone::MessageBroker broker; + Run(broker, viewport); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + OrthancStone::StoneFinalize(); + + return 0; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,129 @@ +cmake_minimum_required(VERSION 2.8.3) + +##################################################################### +## Configuration of the Orthanc framework +##################################################################### + +# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it +# must be the first inclusion +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.5.7") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + + +##################################################################### +## Configuration of the Stone framework +##################################################################### + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +set(ORTHANC_STONE_APPLICATION_RESOURCES + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +SET(ENABLE_SDL_CONSOLE OFF CACHE BOOL "Enable the use of the MIT-licensed SDL_Console") +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) +SET(ENABLE_SDL ON) +SET(ENABLE_WEB_CLIENT ON) +SET(ORTHANC_SANDBOXED OFF) +LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) + +add_definitions( + -DORTHANC_ENABLE_LOGGING_PLUGIN=0 + ) + + +##################################################################### +## Build the samples +##################################################################### + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + +# +# BasicScene +# + +add_executable(BasicScene + BasicScene.cpp + ) + +target_link_libraries(BasicScene OrthancStone) + +# +# TrackerSample +# + +LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSample.cpp") +LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSampleApp.cpp") +LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSampleApp.h") + +if (MSVC AND MSVC_VERSION GREATER 1700) + LIST(APPEND TRACKERSAMPLE_SOURCE "cpp.hint") +endif() + +add_executable(TrackerSample + ${TRACKERSAMPLE_SOURCE} + ) + +target_link_libraries(TrackerSample OrthancStone) + +# +# Loader +# + +add_executable(Loader + Loader.cpp + ) + +target_link_libraries(Loader OrthancStone) + +# +# FusionMprSdl +# + +add_executable(FusionMprSdl + FusionMprSdl.cpp + FusionMprSdl.h +) + +target_link_libraries(FusionMprSdl OrthancStone) + +# +# Multiplatform Basic Scene +# + +LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/BasicScene.cpp") +LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/BasicScene.h") +LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/mainSdl.cpp") + +if (MSVC AND MSVC_VERSION GREATER 1700) + LIST(APPEND MP_BASIC_SCENE_SOURCE "cpp.hint") +endif() + +add_executable(MpBasicScene + ${MP_BASIC_SCENE_SOURCE} + ) + +target_include_directories(MpBasicScene PUBLIC ${ORTHANC_STONE_ROOT}) +target_link_libraries(MpBasicScene OrthancStone) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,805 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "FusionMprSdl.h" + +#include "../../Framework/OpenGL/SdlOpenGLContext.h" + +#include "../../Framework/StoneInitialization.h" + +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" + +#include "../../Framework/Scene2DViewport/UndoStack.h" +#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" +#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" +#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" +#include "../../Framework/Scene2DViewport/MeasureTool.h" +#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" + +#include "../../Framework/Volumes/VolumeSceneLayerSource.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../../Framework/Oracle/ThreadedOracle.h" +#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" +#include "../../Framework/Loaders/DicomStructureSetLoader.h" +#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" +#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" +#include "Core/SystemToolbox.h" + +namespace OrthancStone +{ + const char* FusionMprMeasureToolToString(size_t i) + { + static const char* descs[] = { + "FusionMprGuiTool_Rotate", + "FusionMprGuiTool_Pan", + "FusionMprGuiTool_Zoom", + "FusionMprGuiTool_LineMeasure", + "FusionMprGuiTool_CircleMeasure", + "FusionMprGuiTool_AngleMeasure", + "FusionMprGuiTool_EllipseMeasure", + "FusionMprGuiTool_LAST" + }; + if (i >= FusionMprGuiTool_LAST) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); + } + return descs[i]; + } + + Scene2D& FusionMprSdlApp::GetScene() + { + return controller_->GetScene(); + } + + const Scene2D& FusionMprSdlApp::GetScene() const + { + return controller_->GetScene(); + } + + void FusionMprSdlApp::SelectNextTool() + { + currentTool_ = static_cast(currentTool_ + 1); + if (currentTool_ == FusionMprGuiTool_LAST) + currentTool_ = static_cast(0);; + printf("Current tool is now: %s\n", FusionMprMeasureToolToString(currentTool_)); + } + + void FusionMprSdlApp::DisplayInfoText() + { + // do not try to use stuff too early! + ICompositor* pCompositor = &(viewport_.GetCompositor()); + if (pCompositor == NULL) + return; + + std::stringstream msg; + + for (std::map::const_iterator kv = infoTextMap_.begin(); + kv != infoTextMap_.end(); ++kv) + { + msg << kv->first << " : " << kv->second << std::endl; + } + std::string msgS = msg.str(); + + TextSceneLayer* layerP = NULL; + if (GetScene().HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = dynamic_cast( + GetScene().GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); + layerP = &layer; + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layerP = layer.get(); + layer->SetColor(0, 255, 0); + layer->SetFontIndex(1); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_TopLeft); + //layer->SetPosition(0,0); + GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + // position the fixed info text in the upper right corner + layerP->SetText(msgS.c_str()); + double cX = viewport_.GetCompositor().GetCanvasWidth() * (-0.5); + double cY = viewport_.GetCompositor().GetCanvasHeight() * (-0.5); + GetScene().GetCanvasToSceneTransform().Apply(cX,cY); + layerP->SetPosition(cX, cY); + } + + void FusionMprSdlApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) + { + ScenePoint2D p = e.GetMainPosition().Apply(GetScene().GetCanvasToSceneTransform()); + + char buf[128]; + sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", + p.GetX(), p.GetY(), + e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); + + if (GetScene().HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = + dynamic_cast(GetScene().GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); + layer.SetText(buf); + layer.SetPosition(p.GetX(), p.GetY()); + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetColor(0, 255, 0); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_BottomCenter); + layer->SetPosition(p.GetX(), p.GetY()); + GetScene().SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + } + + void FusionMprSdlApp::HideInfoText() + { + GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); + } + + void FusionMprSdlApp::HandleApplicationEvent( + const SDL_Event & event) + { + DisplayInfoText(); + + if (event.type == SDL_MOUSEMOTION) + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + if (activeTracker_.get() == NULL && + SDL_SCANCODE_LALT < scancodeCount && + keyboardState[SDL_SCANCODE_LALT]) + { + // The "left-ctrl" key is down, while no tracker is present + // Let's display the info text + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + + DisplayFloatingCtrlInfoText(e); + } + else + { + HideInfoText(); + //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)"; + if (activeTracker_.get() != NULL) + { + //LOG(TRACE) << "(activeTracker_.get() != NULL)"; + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + + //LOG(TRACE) << "event.button.x = " << event.button.x << " " << + // "event.button.y = " << event.button.y; + LOG(TRACE) << "activeTracker_->PointerMove(e); " << + e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); + + activeTracker_->PointerMove(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + } + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + if (activeTracker_) + { + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); + activeTracker_->PointerUp(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN) + { + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + if (activeTracker_) + { + activeTracker_->PointerDown(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + else + { + // we ATTEMPT to create a tracker if need be + activeTracker_ = CreateSuitableTracker(event, e); + } + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_ESCAPE: + if (activeTracker_) + { + activeTracker_->Cancel(); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + break; + + case SDLK_t: + if (!activeTracker_) + SelectNextTool(); + else + { + LOG(WARNING) << "You cannot change the active tool when an interaction" + " is taking place"; + } + break; + case SDLK_s: + controller_->FitContent(viewport_.GetCompositor().GetCanvasWidth(), + viewport_.GetCompositor().GetCanvasHeight()); + break; + + case SDLK_z: + LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; + if (event.key.keysym.mod & KMOD_CTRL) + { + if (controller_->CanUndo()) + { + LOG(TRACE) << "Undoing..."; + controller_->Undo(); + } + else + { + LOG(WARNING) << "Nothing to undo!!!"; + } + } + break; + + case SDLK_y: + LOG(TRACE) << "SDLK_y has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; + if (event.key.keysym.mod & KMOD_CTRL) + { + if (controller_->CanRedo()) + { + LOG(TRACE) << "Redoing..."; + controller_->Redo(); + } + else + { + LOG(WARNING) << "Nothing to redo!!!"; + } + } + break; + + case SDLK_c: + TakeScreenshot( + "screenshot.png", + viewport_.GetCompositor().GetCanvasWidth(), + viewport_.GetCompositor().GetCanvasHeight()); + break; + + default: + break; + } + } + } + + + void FusionMprSdlApp::OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message) + { + DisplayInfoText(); + } + + boost::shared_ptr FusionMprSdlApp::CreateSuitableTracker( + const SDL_Event & event, + const PointerEvent & e) + { + using namespace Orthanc; + + switch (event.button.button) + { + case SDL_BUTTON_MIDDLE: + return boost::shared_ptr(new PanSceneTracker + (controller_, e)); + + case SDL_BUTTON_RIGHT: + return boost::shared_ptr(new ZoomSceneTracker + (controller_, e, viewport_.GetCompositor().GetCanvasHeight())); + + case SDL_BUTTON_LEFT: + { + //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; + // TODO: we need to iterate on the set of measuring tool and perform + // a hit test to check if a tracker needs to be created for edition. + // Otherwise, depending upon the active tool, we might want to create + // a "measuring tool creation" tracker + + // TODO: if there are conflicts, we should prefer a tracker that + // pertains to the type of measuring tool currently selected (TBD?) + boost::shared_ptr hitTestTracker = TrackerHitTest(e); + + if (hitTestTracker != NULL) + { + //LOG(TRACE) << "hitTestTracker != NULL"; + return hitTestTracker; + } + else + { + switch (currentTool_) + { + case FusionMprGuiTool_Rotate: + //LOG(TRACE) << "Creating RotateSceneTracker"; + return boost::shared_ptr(new RotateSceneTracker( + controller_, e)); + case FusionMprGuiTool_Pan: + return boost::shared_ptr(new PanSceneTracker( + controller_, e)); + case FusionMprGuiTool_Zoom: + return boost::shared_ptr(new ZoomSceneTracker( + controller_, e, viewport_.GetCompositor().GetCanvasHeight())); + //case GuiTool_AngleMeasure: + // return new AngleMeasureTracker(GetScene(), e); + //case GuiTool_CircleMeasure: + // return new CircleMeasureTracker(GetScene(), e); + //case GuiTool_EllipseMeasure: + // return new EllipseMeasureTracker(GetScene(), e); + case FusionMprGuiTool_LineMeasure: + return boost::shared_ptr(new CreateLineMeasureTracker( + IObserver::GetBroker(), controller_, e)); + case FusionMprGuiTool_AngleMeasure: + return boost::shared_ptr(new CreateAngleMeasureTracker( + IObserver::GetBroker(), controller_, e)); + case FusionMprGuiTool_CircleMeasure: + LOG(ERROR) << "Not implemented yet!"; + return boost::shared_ptr(); + case FusionMprGuiTool_EllipseMeasure: + LOG(ERROR) << "Not implemented yet!"; + return boost::shared_ptr(); + default: + throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); + } + } + } + default: + return boost::shared_ptr(); + } + } + + + FusionMprSdlApp::FusionMprSdlApp(MessageBroker& broker) + : IObserver(broker) + , broker_(broker) + , oracleObservable_(broker) + , oracle_(*this) + , currentTool_(FusionMprGuiTool_Rotate) + , undoStack_(new UndoStack) + , viewport_("Hello", 1024, 1024, false) // False means we do NOT let Windows treat this as a legacy application that needs to be scaled + { + //oracleObservable.RegisterObserverCallback + //(new Callable + // (*this, &FusionMprSdlApp::Handle)); + + //oracleObservable.RegisterObserverCallback + //(new Callable + // (*this, &FusionMprSdlApp::Handle)); + + //oracleObservable.RegisterObserverCallback + //(new Callable + // (*this, &ToFusionMprSdlAppto::Handle)); + + oracleObservable_.RegisterObserverCallback + (new Callable + (*this, &FusionMprSdlApp::Handle)); + + controller_ = boost::shared_ptr( + new ViewportController(undoStack_, broker_, viewport_)); + + controller_->RegisterObserverCallback( + new Callable + (*this, &FusionMprSdlApp::OnSceneTransformChanged)); + + TEXTURE_2x2_1_ZINDEX = 1; + TEXTURE_1x1_ZINDEX = 2; + TEXTURE_2x2_2_ZINDEX = 3; + LINESET_1_ZINDEX = 4; + LINESET_2_ZINDEX = 5; + FLOATING_INFOTEXT_LAYER_ZINDEX = 6; + FIXED_INFOTEXT_LAYER_ZINDEX = 7; + } + + void FusionMprSdlApp::PrepareScene() + { + // Texture of 2x2 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); + + uint8_t* p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + p[3] = 0; + p[4] = 255; + p[5] = 0; + + p = reinterpret_cast(i.GetRow(1)); + p[0] = 0; + p[1] = 0; + p[2] = 255; + + p[3] = 255; + p[4] = 0; + p[5] = 0; + + GetScene().SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); + } + } + + void FusionMprSdlApp::DisableTracker() + { + if (activeTracker_) + { + activeTracker_->Cancel(); + activeTracker_.reset(); + } + } + + void FusionMprSdlApp::TakeScreenshot(const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + CairoCompositor compositor(GetScene(), canvasWidth, canvasHeight); + compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor.Refresh(); + + Orthanc::ImageAccessor canvas; + compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); + Orthanc::ImageProcessing::Convert(png, canvas); + + Orthanc::PngWriter writer; + writer.WriteToFile(target, png); + } + + + boost::shared_ptr FusionMprSdlApp::TrackerHitTest(const PointerEvent & e) + { + // std::vector> measureTools_; + return boost::shared_ptr(); + } + + static void GLAPIENTRY + OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) + { + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } + } + + static bool g_stopApplication = false; + + + void FusionMprSdlApp::Handle(const DicomVolumeImage::GeometryReadyMessage& message) + { + printf("Geometry ready\n"); + + //plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); + //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); + plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); + plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); + + //Refresh(); + } + + + void FusionMprSdlApp::Handle(const OracleCommandExceptionMessage& message) + { + printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType()); + + switch (message.GetCommand().GetType()) + { + case IOracleCommand::Type_GetOrthancWebViewerJpeg: + printf("URI: [%s]\n", dynamic_cast + (message.GetCommand()).GetUri().c_str()); + break; + + default: + break; + } + } + + void FusionMprSdlApp::SetVolume1(int depth, + const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + source1_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); + + if (style != NULL) + { + source1_->SetConfigurator(style); + } + } + + void FusionMprSdlApp::SetVolume2(int depth, + const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + source2_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); + + if (style != NULL) + { + source2_->SetConfigurator(style); + } + } + + void FusionMprSdlApp::SetStructureSet(int depth, + const boost::shared_ptr& volume) + { + source3_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); + } + + void FusionMprSdlApp::Run() + { + // False means we do NOT let Windows treat this as a legacy application + // that needs to be scaled + controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); + + viewport_.GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_0, Orthanc::Encoding_Latin1); + viewport_.GetCompositor().SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_1, Orthanc::Encoding_Latin1); + + + //////// from loader + { + Orthanc::WebServiceParameters p; + //p.SetUrl("http://localhost:8043/"); + p.SetCredentials("orthanc", "orthanc"); + oracle_.SetOrthancParameters(p); + } + + //////// from Run + + boost::shared_ptr ct(new DicomVolumeImage); + boost::shared_ptr dose(new DicomVolumeImage); + + + boost::shared_ptr ctLoader; + boost::shared_ptr doseLoader; + boost::shared_ptr rtstructLoader; + + { + ctLoader.reset(new OrthancSeriesVolumeProgressiveLoader(ct, oracle_, oracleObservable_)); + doseLoader.reset(new OrthancMultiframeVolumeLoader(dose, oracle_, oracleObservable_)); + rtstructLoader.reset(new DicomStructureSetLoader(oracle_, oracleObservable_)); + } + + //toto->SetReferenceLoader(*ctLoader); + //doseLoader->RegisterObserverCallback + //(new Callable + // (*this, &FusionMprSdlApp::Handle)); + ctLoader->RegisterObserverCallback + (new Callable + (*this, &FusionMprSdlApp::Handle)); + + this->SetVolume1(0, ctLoader, new GrayscaleStyleConfigurator); + + { + std::unique_ptr config(new LookupTableStyleConfigurator); + config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); + + boost::shared_ptr tmp(new DicomVolumeImageMPRSlicer(dose)); + this->SetVolume2(1, tmp, config.release()); + } + + this->SetStructureSet(2, rtstructLoader); + +#if 1 + /* + BGO data + http://localhost:8042/twiga-orthanc-viewer-demo/twiga-orthanc-viewer-demo.html?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa + & + dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb + & + struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 + */ + ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT + doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE + rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT +#else + //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT + //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE + //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT + + // 2017-05-16 + ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT + doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE + rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT +#endif + + oracle_.Start(); + +//// END from loader + + while (!g_stopApplication) + { + viewport_.GetCompositor().Refresh(); + +//////// from loader + if (source1_.get() != NULL) + { + source1_->Update(plane_); + } + + if (source2_.get() != NULL) + { + source2_->Update(plane_); + } + + if (source3_.get() != NULL) + { + source3_->Update(plane_); + } +//// END from loader + + SDL_Event event; + while (!g_stopApplication && SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + g_stopApplication = true; + break; + } + else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + DisableTracker(); // was: tracker.reset(NULL); + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + viewport_.GetWindow().ToggleMaximize(); + break; + + case SDLK_s: + controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); + break; + + case SDLK_q: + g_stopApplication = true; + break; + default: + break; + } + } + HandleApplicationEvent(event); + } + SDL_Delay(1); + } + + //// from loader + + //Orthanc::SystemToolbox::ServerBarrier(); + + /** + * WARNING => The oracle must be stopped BEFORE the objects using + * it are destroyed!!! This forces to wait for the completion of + * the running callback methods. Otherwise, the callbacks methods + * might still be running while their parent object is destroyed, + * resulting in crashes. This is very visible if adding a sleep(), + * as in (*). + **/ + + oracle_.Stop(); + //// END from loader + } + + void FusionMprSdlApp::SetInfoDisplayMessage( + std::string key, std::string value) + { + if (value == "") + infoTextMap_.erase(key); + else + infoTextMap_[key] = value; + DisplayInfoText(); + } + +} + + +boost::weak_ptr g_app; + +void FusionMprSdl_SetInfoDisplayMessage(std::string key, std::string value) +{ + boost::shared_ptr app = g_app.lock(); + if (app) + { + app->SetInfoDisplayMessage(key, value); + } +} + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + using namespace OrthancStone; + + StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); +// Orthanc::Logging::EnableTraceLevel(true); + + try + { + OrthancStone::MessageBroker broker; + boost::shared_ptr app(new FusionMprSdlApp(broker)); + g_app = app; + app->PrepareScene(); + app->Run(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + StoneFinalize(); + + return 0; +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,209 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Viewport/SdlViewport.h" + +#include "../../Framework/Messages/IObserver.h" +#include "../../Framework/Messages/IMessageEmitter.h" +#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" +#include "../../Framework/Volumes/DicomVolumeImage.h" +#include "../../Framework/Oracle/ThreadedOracle.h" + +#include +#include +#include + +#include + +namespace OrthancStone +{ + class OpenGLCompositor; + class IVolumeSlicer; + class ILayerStyleConfigurator; + class DicomStructureSetLoader; + class IOracle; + class ThreadedOracle; + class VolumeSceneLayerSource; + class NativeFusionMprApplicationContext; + class SdlOpenGLViewport; + + enum FusionMprGuiTool + { + FusionMprGuiTool_Rotate = 0, + FusionMprGuiTool_Pan, + FusionMprGuiTool_Zoom, + FusionMprGuiTool_LineMeasure, + FusionMprGuiTool_CircleMeasure, + FusionMprGuiTool_AngleMeasure, + FusionMprGuiTool_EllipseMeasure, + FusionMprGuiTool_LAST + }; + + const char* MeasureToolToString(size_t i); + + static const unsigned int FONT_SIZE_0 = 32; + static const unsigned int FONT_SIZE_1 = 24; + + class Scene2D; + class UndoStack; + + /** + This application subclasses IMessageEmitter to use a mutex before forwarding Oracle messages (that + can be sent from multiple threads) + */ + class FusionMprSdlApp : public IObserver + , public boost::enable_shared_from_this + , public IMessageEmitter + { + public: + // 12 because. + FusionMprSdlApp(MessageBroker& broker); + + void PrepareScene(); + void Run(); + void SetInfoDisplayMessage(std::string key, std::string value); + void DisableTracker(); + + Scene2D& GetScene(); + const Scene2D& GetScene() const; + + void HandleApplicationEvent(const SDL_Event& event); + + /** + This method is called when the scene transform changes. It allows to + recompute the visual elements whose content depend upon the scene transform + */ + void OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message); + + + virtual void EmitMessage(const IObserver& observer, + const IMessage& message) ORTHANC_OVERRIDE + { + try + { + boost::unique_lock lock(mutex_); + oracleObservable_.EmitMessage(observer, message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while emitting a message: " << e.What(); + throw; + } + } + + private: +#if 1 + // if threaded (not wasm) + MessageBroker& broker_; + IObservable oracleObservable_; + ThreadedOracle oracle_; + boost::shared_mutex mutex_; // to serialize messages from the ThreadedOracle +#endif + + void SelectNextTool(); + + /** + This returns a random point in the canvas part of the scene, but in + scene coordinates + */ + ScenePoint2D GetRandomPointInScene() const; + + boost::shared_ptr TrackerHitTest(const PointerEvent& e); + + boost::shared_ptr CreateSuitableTracker( + const SDL_Event& event, + const PointerEvent& e); + + void TakeScreenshot( + const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight); + + /** + This adds the command at the top of the undo stack + */ + void Commit(boost::shared_ptr cmd); + void Undo(); + void Redo(); + + + // TODO private + void Handle(const DicomVolumeImage::GeometryReadyMessage& message); + void Handle(const OracleCommandExceptionMessage& message); + + void SetVolume1( + int depth, + const boost::shared_ptr& volume, + ILayerStyleConfigurator* style); + + void SetVolume2( + int depth, + const boost::shared_ptr& volume, + ILayerStyleConfigurator* style); + + void SetStructureSet( + int depth, + const boost::shared_ptr& volume); + + + + private: + void DisplayFloatingCtrlInfoText(const PointerEvent& e); + void DisplayInfoText(); + void HideInfoText(); + + private: + CoordinateSystem3D plane_; + + boost::shared_ptr source1_, source2_, source3_; + + /** + WARNING: the measuring tools do store a reference to the scene, and it + paramount that the scene gets destroyed AFTER the measurement tools. + */ + boost::shared_ptr controller_; + + std::map infoTextMap_; + boost::shared_ptr activeTracker_; + + //static const int LAYER_POSITION = 150; + + int TEXTURE_2x2_1_ZINDEX; + int TEXTURE_1x1_ZINDEX; + int TEXTURE_2x2_2_ZINDEX; + int LINESET_1_ZINDEX; + int LINESET_2_ZINDEX; + int FLOATING_INFOTEXT_LAYER_ZINDEX; + int FIXED_INFOTEXT_LAYER_ZINDEX; + + FusionMprGuiTool currentTool_; + boost::shared_ptr undoStack_; + SdlOpenGLViewport viewport_; + }; + +} + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/Loader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/Loader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,518 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "../../Framework/Loaders/DicomStructureSetLoader.h" +#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" +#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../Framework/Oracle/SleepOracleCommand.h" +#include "../../Framework/Oracle/ThreadedOracle.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" +#include "../../Framework/StoneInitialization.h" +#include "../../Framework/Volumes/VolumeSceneLayerSource.h" +#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" +#include "../../Framework/Volumes/DicomVolumeImageReslicer.h" + +// From Orthanc framework +#include +#include +#include +#include +#include + + +namespace OrthancStone +{ + class NativeApplicationContext : public IMessageEmitter + { + private: + boost::shared_mutex mutex_; + MessageBroker broker_; + IObservable oracleObservable_; + + public: + NativeApplicationContext() : + oracleObservable_(broker_) + { + } + + + virtual void EmitMessage(const IObserver& observer, + const IMessage& message) ORTHANC_OVERRIDE + { + try + { + boost::unique_lock lock(mutex_); + oracleObservable_.EmitMessage(observer, message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while emitting a message: " << e.What(); + } + } + + + class ReaderLock : public boost::noncopyable + { + private: + NativeApplicationContext& that_; + boost::shared_lock lock_; + + public: + ReaderLock(NativeApplicationContext& that) : + that_(that), + lock_(that.mutex_) + { + } + }; + + + class WriterLock : public boost::noncopyable + { + private: + NativeApplicationContext& that_; + boost::unique_lock lock_; + + public: + WriterLock(NativeApplicationContext& that) : + that_(that), + lock_(that.mutex_) + { + } + + MessageBroker& GetBroker() + { + return that_.broker_; + } + + IObservable& GetOracleObservable() + { + return that_.oracleObservable_; + } + }; + }; +} + + + +class Toto : public OrthancStone::IObserver +{ +private: + OrthancStone::CoordinateSystem3D plane_; + OrthancStone::IOracle& oracle_; + OrthancStone::Scene2D scene_; + std::unique_ptr source1_, source2_, source3_; + + + void Refresh() + { + if (source1_.get() != NULL) + { + source1_->Update(plane_); + } + + if (source2_.get() != NULL) + { + source2_->Update(plane_); + } + + if (source3_.get() != NULL) + { + source3_->Update(plane_); + } + + scene_.FitContent(1024, 768); + + { + OrthancStone::CairoCompositor compositor(scene_, 1024, 768); + compositor.Refresh(); + + Orthanc::ImageAccessor accessor; + compositor.GetCanvas().GetReadOnlyAccessor(accessor); + + Orthanc::Image tmp(Orthanc::PixelFormat_RGB24, accessor.GetWidth(), accessor.GetHeight(), false); + Orthanc::ImageProcessing::Convert(tmp, accessor); + + static unsigned int count = 0; + char buf[64]; + sprintf(buf, "scene-%06d.png", count++); + + Orthanc::PngWriter writer; + writer.WriteToFile(buf, tmp); + } + } + + + void Handle(const OrthancStone::DicomVolumeImage::GeometryReadyMessage& message) + { + printf("Geometry ready\n"); + + plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); + //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); + //plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); + plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); + + Refresh(); + } + + + void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message) + { + if (message.GetOrigin().HasPayload()) + { + printf("TIMEOUT! %d\n", dynamic_cast& >(message.GetOrigin().GetPayload()).GetValue()); + } + else + { + printf("TIMEOUT\n"); + + Refresh(); + + /** + * The sleep() leads to a crash if the oracle is still running, + * while this object is destroyed. Always stop the oracle before + * destroying active objects. (*) + **/ + // boost::this_thread::sleep(boost::posix_time::seconds(2)); + + oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(message.GetOrigin().GetDelay())); + } + } + + void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + Json::Value v; + message.ParseJsonBody(v); + + printf("ICI [%s]\n", v.toStyledString().c_str()); + } + + void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) + { + printf("IMAGE %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); + } + + void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) + { + printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); + } + + void Handle(const OrthancStone::OracleCommandExceptionMessage& message) + { + printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType()); + + switch (message.GetCommand().GetType()) + { + case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg: + printf("URI: [%s]\n", dynamic_cast + (message.GetCommand()).GetUri().c_str()); + break; + + default: + break; + } + } + +public: + Toto(OrthancStone::IOracle& oracle, + OrthancStone::IObservable& oracleObservable) : + IObserver(oracleObservable.GetBroker()), + oracle_(oracle) + { + oracleObservable.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + + oracleObservable.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + + oracleObservable.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + + oracleObservable.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + + oracleObservable.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + } + + void SetReferenceLoader(OrthancStone::IObservable& loader) + { + loader.RegisterObserverCallback + (new OrthancStone::Callable + (*this, &Toto::Handle)); + } + + void SetVolume1(int depth, + const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + source1_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); + + if (style != NULL) + { + source1_->SetConfigurator(style); + } + } + + void SetVolume2(int depth, + const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + source2_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); + + if (style != NULL) + { + source2_->SetConfigurator(style); + } + } + + void SetStructureSet(int depth, + const boost::shared_ptr& volume) + { + source3_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); + } + +}; + + +void Run(OrthancStone::NativeApplicationContext& context, + OrthancStone::ThreadedOracle& oracle) +{ + // the oracle has been supplied with the context (as an IEmitter) upon + // creation + boost::shared_ptr ct(new OrthancStone::DicomVolumeImage); + boost::shared_ptr dose(new OrthancStone::DicomVolumeImage); + + + boost::shared_ptr toto; + boost::shared_ptr ctLoader; + boost::shared_ptr doseLoader; + boost::shared_ptr rtstructLoader; + + { + OrthancStone::NativeApplicationContext::WriterLock lock(context); + toto.reset(new Toto(oracle, lock.GetOracleObservable())); + + // the oracle is used to schedule commands + // the oracleObservable is used by the loaders to: + // - request the broker (lifetime mgmt) + // - register the loader callbacks (called indirectly by the oracle) + ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); + doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); + rtstructLoader.reset(new OrthancStone::DicomStructureSetLoader(oracle, lock.GetOracleObservable())); + } + + + //toto->SetReferenceLoader(*ctLoader); + toto->SetReferenceLoader(*doseLoader); + + +#if 1 + toto->SetVolume1(0, ctLoader, new OrthancStone::GrayscaleStyleConfigurator); +#else + { + boost::shared_ptr reslicer(new OrthancStone::DicomVolumeImageReslicer(ct)); + toto->SetVolume1(0, reslicer, new OrthancStone::GrayscaleStyleConfigurator); + } +#endif + + + { + std::unique_ptr config(new OrthancStone::LookupTableStyleConfigurator); + config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); + + boost::shared_ptr tmp(new OrthancStone::DicomVolumeImageMPRSlicer(dose)); + toto->SetVolume2(1, tmp, config.release()); + } + + toto->SetStructureSet(2, rtstructLoader); + + oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100)); + + if (0) + { + Json::Value v = Json::objectValue; + v["Level"] = "Series"; + v["Query"] = Json::objectValue; + + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetMethod(Orthanc::HttpMethod_Post); + command->SetUri("/tools/find"); + command->SetBody(v); + + oracle.Schedule(*toto, command.release()); + } + + if(0) + { + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); + command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg))); + command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); + oracle.Schedule(*toto, command.release()); + } + + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); + command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); + command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); + oracle.Schedule(*toto, command.release()); + } + + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); + command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); + command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); + oracle.Schedule(*toto, command.release()); + } + + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); + command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); + oracle.Schedule(*toto, command.release()); + } + + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); + command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); + command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); + oracle.Schedule(*toto, command.release()); + } + + if (0) + { + std::unique_ptr command(new OrthancStone::GetOrthancWebViewerJpegCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e"); + command->SetQuality(90); + oracle.Schedule(*toto, command.release()); + } + + + if (0) + { + for (unsigned int i = 0; i < 10; i++) + { + std::unique_ptr command(new OrthancStone::SleepOracleCommand(i * 1000)); + command->SetPayload(new Orthanc::SingleValueObject(42 * i)); + oracle.Schedule(*toto, command.release()); + } + } + } + + // 2017-11-17-Anonymized +#if 0 + // BGO data + ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT + doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE + //rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT +#else + //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT + //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE + //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT + + // 2017-05-16 + ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT + doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE + rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT +#endif + // 2015-01-28-Multiframe + //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT + + // Delphine + //ctLoader->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT + //ctLoader->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm + + + { + LOG(WARNING) << "...Waiting for Ctrl-C..."; + + oracle.Start(); + + Orthanc::SystemToolbox::ServerBarrier(); + + /** + * WARNING => The oracle must be stopped BEFORE the objects using + * it are destroyed!!! This forces to wait for the completion of + * the running callback methods. Otherwise, the callbacks methods + * might still be running while their parent object is destroyed, + * resulting in crashes. This is very visible if adding a sleep(), + * as in (*). + **/ + + oracle.Stop(); + } +} + + + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + OrthancStone::StoneInitialize(); + //Orthanc::Logging::EnableInfoLevel(true); + + try + { + OrthancStone::NativeApplicationContext context; + + OrthancStone::ThreadedOracle oracle(context); + //oracle.SetThreadsCount(1); + + { + Orthanc::WebServiceParameters p; + //p.SetUrl("http://localhost:8043/"); + p.SetCredentials("orthanc", "orthanc"); + oracle.SetOrthancParameters(p); + } + + //oracle.Start(); + + Run(context, oracle); + + //oracle.Stop(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + OrthancStone::StoneFinalize(); + + return 0; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/RadiographyEditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/RadiographyEditor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,267 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../Shared/RadiographyEditorApp.h" + +// From Stone +#include "../../Framework/Oracle/SleepOracleCommand.h" +#include "../../Framework/Oracle/ThreadedOracle.h" +#include "../../Applications/Sdl/SdlOpenGLWindow.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/StoneInitialization.h" + +#include +#include + + +#include +#include + +#include +#include + +using namespace OrthancStone; + +namespace OrthancStone +{ + class NativeApplicationContext : public IMessageEmitter + { + private: + boost::shared_mutex mutex_; + MessageBroker broker_; + IObservable oracleObservable_; + + public: + NativeApplicationContext() : + oracleObservable_(broker_) + { + } + + + virtual void EmitMessage(const IObserver& observer, + const IMessage& message) ORTHANC_OVERRIDE + { + try + { + boost::unique_lock lock(mutex_); + oracleObservable_.EmitMessage(observer, message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while emitting a message: " << e.What(); + } + } + + + class ReaderLock : public boost::noncopyable + { + private: + NativeApplicationContext& that_; + boost::shared_lock lock_; + + public: + ReaderLock(NativeApplicationContext& that) : + that_(that), + lock_(that.mutex_) + { + } + }; + + + class WriterLock : public boost::noncopyable + { + private: + NativeApplicationContext& that_; + boost::unique_lock lock_; + + public: + WriterLock(NativeApplicationContext& that) : + that_(that), + lock_(that.mutex_) + { + } + + MessageBroker& GetBroker() + { + return that_.broker_; + } + + IObservable& GetOracleObservable() + { + return that_.oracleObservable_; + } + }; + }; +} + +class OpenGlSdlCompositorFactory : public ICompositorFactory +{ + OpenGL::IOpenGLContext& openGlContext_; + +public: + OpenGlSdlCompositorFactory(OpenGL::IOpenGLContext& openGlContext) : + openGlContext_(openGlContext) + {} + + ICompositor* GetCompositor(const Scene2D& scene) + { + + OpenGLCompositor* compositor = new OpenGLCompositor(openGlContext_, scene); + compositor->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_1, Orthanc::Encoding_Latin1); + return compositor; + } +}; + +static void GLAPIENTRY +OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) +{ + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } +} + + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + using namespace OrthancStone; + + StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); + // Orthanc::Logging::EnableTraceLevel(true); + + try + { + OrthancStone::NativeApplicationContext context; + OrthancStone::NativeApplicationContext::WriterLock lock(context); + OrthancStone::ThreadedOracle oracle(context); + + // False means we do NOT let Windows treat this as a legacy application + // that needs to be scaled + SdlOpenGLWindow window("Hello", 1024, 1024, false); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); + + std::unique_ptr compositorFactory(new OpenGlSdlCompositorFactory(window)); + boost::shared_ptr app(new RadiographyEditorApp(oracle, lock.GetOracleObservable(), compositorFactory.release())); + app->PrepareScene(); + app->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); + + bool stopApplication = false; + + while (!stopApplication) + { + app->Refresh(); + + SDL_Event event; + while (!stopApplication && SDL_PollEvent(&event)) + { + OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; + if (event.key.keysym.mod & KMOD_CTRL) + modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Control)); + if (event.key.keysym.mod & KMOD_ALT) + modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Alt)); + if (event.key.keysym.mod & KMOD_SHIFT) + modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Shift)); + + OrthancStone::MouseButton button; + if (event.button.button == SDL_BUTTON_LEFT) + button = OrthancStone::MouseButton_Left; + else if (event.button.button == SDL_BUTTON_MIDDLE) + button = OrthancStone::MouseButton_Middle; + else if (event.button.button == SDL_BUTTON_RIGHT) + button = OrthancStone::MouseButton_Right; + + if (event.type == SDL_QUIT) + { + stopApplication = true; + break; + } + else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + app->DisableTracker(); // was: tracker.reset(NULL); + app->UpdateSize(); + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + window.GetWindow().ToggleMaximize(); + break; + + case SDLK_q: + stopApplication = true; + break; + default: + { + app->OnKeyPressed(event.key.keysym.sym, modifiers); + } + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN) + { + app->OnMouseDown(event.button.x, event.button.y, modifiers, button); + } + else if (event.type == SDL_MOUSEMOTION) + { + app->OnMouseMove(event.button.x, event.button.y, modifiers); + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + app->OnMouseUp(event.button.x, event.button.y, modifiers, button); + } + } + SDL_Delay(1); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + StoneFinalize(); + + return 0; +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSample.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSample.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,93 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "TrackerSampleApp.h" + + // From Stone +#include "../../Framework/OpenGL/SdlOpenGLContext.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/StoneInitialization.h" + +#include +#include + + +#include +#include + +#include +#include + +/* +TODO: + +- to decouple the trackers from the sample, we need to supply them with + the scene rather than the app + +- in order to do that, we need a GetNextFreeZIndex function (or something + along those lines) in the scene object + +*/ + +boost::weak_ptr g_app; + +void TrackerSample_SetInfoDisplayMessage(std::string key, std::string value) +{ + boost::shared_ptr app = g_app.lock(); + if (app) + { + app->SetInfoDisplayMessage(key, value); + } +} + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + using namespace OrthancStone; + + StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); +// Orthanc::Logging::EnableTraceLevel(true); + + try + { + MessageBroker broker; + boost::shared_ptr app(new TrackerSampleApp(broker)); + g_app = app; + app->PrepareScene(); + app->Run(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + StoneFinalize(); + + return 0; +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,733 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "TrackerSampleApp.h" + +#include "../../Framework/OpenGL/SdlOpenGLContext.h" +#include "../../Framework/Scene2D/CairoCompositor.h" +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" +#include "../../Framework/Scene2D/Scene2D.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2DViewport/UndoStack.h" +#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" +#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" +#include "../../Framework/StoneInitialization.h" + +// From Orthanc framework +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace OrthancStone +{ + const char* MeasureToolToString(size_t i) + { + static const char* descs[] = { + "GuiTool_Rotate", + "GuiTool_Pan", + "GuiTool_Zoom", + "GuiTool_LineMeasure", + "GuiTool_CircleMeasure", + "GuiTool_AngleMeasure", + "GuiTool_EllipseMeasure", + "GuiTool_LAST" + }; + if (i >= GuiTool_LAST) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); + } + return descs[i]; + } + + void TrackerSampleApp::SelectNextTool() + { + currentTool_ = static_cast(currentTool_ + 1); + if (currentTool_ == GuiTool_LAST) + currentTool_ = static_cast(0);; + printf("Current tool is now: %s\n", MeasureToolToString(currentTool_)); + } + + void TrackerSampleApp::DisplayInfoText() + { + // do not try to use stuff too early! + std::stringstream msg; + + for (std::map::const_iterator kv = infoTextMap_.begin(); + kv != infoTextMap_.end(); ++kv) + { + msg << kv->first << " : " << kv->second << std::endl; + } + std::string msgS = msg.str(); + + TextSceneLayer* layerP = NULL; + if (controller_->GetScene().HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = dynamic_cast( + controller_->GetScene().GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); + layerP = &layer; + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layerP = layer.get(); + layer->SetColor(0, 255, 0); + layer->SetFontIndex(1); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_TopLeft); + //layer->SetPosition(0,0); + controller_->GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + // position the fixed info text in the upper right corner + layerP->SetText(msgS.c_str()); + double cX = GetCompositor().GetCanvasWidth() * (-0.5); + double cY = GetCompositor().GetCanvasHeight() * (-0.5); + controller_->GetScene().GetCanvasToSceneTransform().Apply(cX,cY); + layerP->SetPosition(cX, cY); + } + + void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) + { + ScenePoint2D p = e.GetMainPosition().Apply(controller_->GetScene().GetCanvasToSceneTransform()); + + char buf[128]; + sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", + p.GetX(), p.GetY(), + e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); + + if (controller_->GetScene().HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = + dynamic_cast(controller_->GetScene().GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); + layer.SetText(buf); + layer.SetPosition(p.GetX(), p.GetY()); + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetColor(0, 255, 0); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_BottomCenter); + layer->SetPosition(p.GetX(), p.GetY()); + controller_->GetScene().SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + } + + void TrackerSampleApp::HideInfoText() + { + controller_->GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); + } + + ScenePoint2D TrackerSampleApp::GetRandomPointInScene() const + { + unsigned int w = GetCompositor().GetCanvasWidth(); + LOG(TRACE) << "GetCompositor().GetCanvasWidth() = " << + GetCompositor().GetCanvasWidth(); + unsigned int h = GetCompositor().GetCanvasHeight(); + LOG(TRACE) << "GetCompositor().GetCanvasHeight() = " << + GetCompositor().GetCanvasHeight(); + + if ((w >= RAND_MAX) || (h >= RAND_MAX)) + LOG(WARNING) << "Canvas is too big : tools will not be randomly placed"; + + int x = rand() % w; + int y = rand() % h; + LOG(TRACE) << "random x = " << x << "random y = " << y; + + ScenePoint2D p = controller_->GetViewport().GetPixelCenterCoordinates(x, y); + LOG(TRACE) << "--> p.GetX() = " << p.GetX() << " p.GetY() = " << p.GetY(); + + ScenePoint2D r = p.Apply(controller_->GetScene().GetCanvasToSceneTransform()); + LOG(TRACE) << "--> r.GetX() = " << r.GetX() << " r.GetY() = " << r.GetY(); + return r; + } + + void TrackerSampleApp::CreateRandomMeasureTool() + { + static bool srandCalled = false; + if (!srandCalled) + { + srand(42); + srandCalled = true; + } + + int i = rand() % 2; + LOG(TRACE) << "random i = " << i; + switch (i) + { + case 0: + // line measure + { + boost::shared_ptr cmd = + boost::make_shared( + boost::ref(IObserver::GetBroker()), + controller_, + GetRandomPointInScene()); + cmd->SetEnd(GetRandomPointInScene()); + controller_->PushCommand(cmd); + } + break; + case 1: + // angle measure + { + boost::shared_ptr cmd = + boost::make_shared( + boost::ref(IObserver::GetBroker()), + controller_, + GetRandomPointInScene()); + cmd->SetCenter(GetRandomPointInScene()); + cmd->SetSide2End(GetRandomPointInScene()); + controller_->PushCommand(cmd); + } + break; + } + } + + void TrackerSampleApp::HandleApplicationEvent( + const SDL_Event & event) + { + DisplayInfoText(); + + if (event.type == SDL_MOUSEMOTION) + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + if (activeTracker_.get() == NULL && + SDL_SCANCODE_LALT < scancodeCount && + keyboardState[SDL_SCANCODE_LALT]) + { + // The "left-ctrl" key is down, while no tracker is present + // Let's display the info text + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + + DisplayFloatingCtrlInfoText(e); + } + else if (activeTracker_.get() != NULL) + { + HideInfoText(); + //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)"; + if (activeTracker_.get() != NULL) + { + //LOG(TRACE) << "(activeTracker_.get() != NULL)"; + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + + //LOG(TRACE) << "event.button.x = " << event.button.x << " " << + // "event.button.y = " << event.button.y; + LOG(TRACE) << "activeTracker_->PointerMove(e); " << + e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); + + activeTracker_->PointerMove(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + } + else + { + HideInfoText(); + + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); + + ScenePoint2D scenePos = e.GetMainPosition().Apply( + controller_->GetScene().GetCanvasToSceneTransform()); + //auto measureTools = GetController()->HitTestMeasureTools(scenePos); + //LOG(TRACE) << "# of hit tests: " << measureTools.size(); + + // this returns the collection of measuring tools where hit test is true + std::vector > measureTools = controller_->HitTestMeasureTools(scenePos); + + // let's refresh the measuring tools highlighted state + // first let's tag them as "unhighlighted" + controller_->ResetMeasuringToolsHighlight(); + + // then immediately take the first one and ask it to highlight the + // measuring tool UI part that is hot + if (measureTools.size() > 0) + { + measureTools[0]->Highlight(scenePos); + } + } + } + else if (event.type == SDL_MOUSEBUTTONUP) + { + if (activeTracker_) + { + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); + activeTracker_->PointerUp(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN) + { + PointerEvent e; + e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( + event.button.x, event.button.y)); + if (activeTracker_) + { + activeTracker_->PointerDown(e); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + else + { + // we ATTEMPT to create a tracker if need be + activeTracker_ = CreateSuitableTracker(event, e); + } + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_ESCAPE: + if (activeTracker_) + { + activeTracker_->Cancel(); + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); + } + break; + + case SDLK_t: + if (!activeTracker_) + SelectNextTool(); + else + { + LOG(WARNING) << "You cannot change the active tool when an interaction" + " is taking place"; + } + break; + + case SDLK_m: + CreateRandomMeasureTool(); + break; + case SDLK_s: + controller_->FitContent(GetCompositor().GetCanvasWidth(), + GetCompositor().GetCanvasHeight()); + break; + + case SDLK_z: + LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; + if (event.key.keysym.mod & KMOD_CTRL) + { + if (controller_->CanUndo()) + { + LOG(TRACE) << "Undoing..."; + controller_->Undo(); + } + else + { + LOG(WARNING) << "Nothing to undo!!!"; + } + } + break; + + case SDLK_y: + LOG(TRACE) << "SDLK_y has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; + if (event.key.keysym.mod & KMOD_CTRL) + { + if (controller_->CanRedo()) + { + LOG(TRACE) << "Redoing..."; + controller_->Redo(); + } + else + { + LOG(WARNING) << "Nothing to redo!!!"; + } + } + break; + + case SDLK_c: + TakeScreenshot( + "screenshot.png", + GetCompositor().GetCanvasWidth(), + GetCompositor().GetCanvasHeight()); + break; + + default: + break; + } + } + } + + + void TrackerSampleApp::OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message) + { + DisplayInfoText(); + } + + boost::shared_ptr TrackerSampleApp::CreateSuitableTracker( + const SDL_Event & event, + const PointerEvent & e) + { + using namespace Orthanc; + + switch (event.button.button) + { + case SDL_BUTTON_MIDDLE: + return boost::shared_ptr(new PanSceneTracker + (controller_, e)); + + case SDL_BUTTON_RIGHT: + return boost::shared_ptr(new ZoomSceneTracker + (controller_, e, GetCompositor().GetCanvasHeight())); + + case SDL_BUTTON_LEFT: + { + //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; + // TODO: we need to iterate on the set of measuring tool and perform + // a hit test to check if a tracker needs to be created for edition. + // Otherwise, depending upon the active tool, we might want to create + // a "measuring tool creation" tracker + + // TODO: if there are conflicts, we should prefer a tracker that + // pertains to the type of measuring tool currently selected (TBD?) + boost::shared_ptr hitTestTracker = TrackerHitTest(e); + + if (hitTestTracker != NULL) + { + //LOG(TRACE) << "hitTestTracker != NULL"; + return hitTestTracker; + } + else + { + switch (currentTool_) + { + case GuiTool_Rotate: + //LOG(TRACE) << "Creating RotateSceneTracker"; + return boost::shared_ptr(new RotateSceneTracker( + controller_, e)); + case GuiTool_Pan: + return boost::shared_ptr(new PanSceneTracker( + controller_, e)); + case GuiTool_Zoom: + return boost::shared_ptr(new ZoomSceneTracker( + controller_, e, GetCompositor().GetCanvasHeight())); + //case GuiTool_AngleMeasure: + // return new AngleMeasureTracker(GetScene(), e); + //case GuiTool_CircleMeasure: + // return new CircleMeasureTracker(GetScene(), e); + //case GuiTool_EllipseMeasure: + // return new EllipseMeasureTracker(GetScene(), e); + case GuiTool_LineMeasure: + return boost::shared_ptr(new CreateLineMeasureTracker( + IObserver::GetBroker(), controller_, e)); + case GuiTool_AngleMeasure: + return boost::shared_ptr(new CreateAngleMeasureTracker( + IObserver::GetBroker(), controller_, e)); + case GuiTool_CircleMeasure: + LOG(ERROR) << "Not implemented yet!"; + return boost::shared_ptr(); + case GuiTool_EllipseMeasure: + LOG(ERROR) << "Not implemented yet!"; + return boost::shared_ptr(); + default: + throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); + } + } + } + default: + return boost::shared_ptr(); + } + } + + + TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) + , currentTool_(GuiTool_Rotate) + , undoStack_(new UndoStack) + , viewport_("Hello", 1024, 1024, false) // False means we do NOT let Windows treat this as a legacy application that needs to be scaled + { + controller_ = boost::shared_ptr( + new ViewportController(undoStack_, broker, viewport_)); + + controller_->RegisterObserverCallback( + new Callable + (*this, &TrackerSampleApp::OnSceneTransformChanged)); + + TEXTURE_2x2_1_ZINDEX = 1; + TEXTURE_1x1_ZINDEX = 2; + TEXTURE_2x2_2_ZINDEX = 3; + LINESET_1_ZINDEX = 4; + LINESET_2_ZINDEX = 5; + FLOATING_INFOTEXT_LAYER_ZINDEX = 6; + FIXED_INFOTEXT_LAYER_ZINDEX = 7; + } + + void TrackerSampleApp::PrepareScene() + { + // Texture of 2x2 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); + + uint8_t* p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + p[3] = 0; + p[4] = 255; + p[5] = 0; + + p = reinterpret_cast(i.GetRow(1)); + p[0] = 0; + p[1] = 0; + p[2] = 255; + + p[3] = 255; + p[4] = 0; + p[5] = 0; + + controller_->GetScene().SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-3, 2); + l->SetPixelSpacing(1.5, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + controller_->GetScene().SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); + } + + // Texture of 1x1 size + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); + + uint8_t* p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-2, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + controller_->GetScene().SetLayer(TEXTURE_1x1_ZINDEX, l.release()); + } + + // Some lines + { + std::unique_ptr layer(new PolylineSceneLayer); + + layer->SetThickness(1); + + PolylineSceneLayer::Chain chain; + chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); + chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); + layer->AddChain(chain, true, 255, 0, 0); + + chain.clear(); + chain.push_back(ScenePoint2D(-5, -5)); + chain.push_back(ScenePoint2D(5, -5)); + chain.push_back(ScenePoint2D(5, 5)); + chain.push_back(ScenePoint2D(-5, 5)); + layer->AddChain(chain, true, 0, 255, 0); + + double dy = 1.01; + chain.clear(); + chain.push_back(ScenePoint2D(-4, -4)); + chain.push_back(ScenePoint2D(4, -4 + dy)); + chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); + chain.push_back(ScenePoint2D(4, 2)); + layer->AddChain(chain, false, 0, 0, 255); + + controller_->GetScene().SetLayer(LINESET_1_ZINDEX, layer.release()); + } + + // Some text + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetText("Hello"); + controller_->GetScene().SetLayer(LINESET_2_ZINDEX, layer.release()); + } + } + + + void TrackerSampleApp::DisableTracker() + { + if (activeTracker_) + { + activeTracker_->Cancel(); + activeTracker_.reset(); + } + } + + void TrackerSampleApp::TakeScreenshot(const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + CairoCompositor compositor(controller_->GetScene(), canvasWidth, canvasHeight); + compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor.Refresh(); + + Orthanc::ImageAccessor canvas; + compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); + Orthanc::ImageProcessing::Convert(png, canvas); + + Orthanc::PngWriter writer; + writer.WriteToFile(target, png); + } + + + boost::shared_ptr TrackerSampleApp::TrackerHitTest(const PointerEvent & e) + { + // std::vector> measureTools_; + ScenePoint2D scenePos = e.GetMainPosition().Apply( + controller_->GetScene().GetCanvasToSceneTransform()); + + std::vector > measureTools = controller_->HitTestMeasureTools(scenePos); + + if (measureTools.size() > 0) + { + return measureTools[0]->CreateEditionTracker(e); + } + return boost::shared_ptr(); + } + + static void GLAPIENTRY + OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) + { + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } + } + + static bool g_stopApplication = false; + + ICompositor& TrackerSampleApp::GetCompositor() + { + using namespace Orthanc; + try + { + SdlViewport& viewport = dynamic_cast(viewport_); + return viewport.GetCompositor(); + } + catch (std::bad_cast e) + { + throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!"); + } + } + + const ICompositor& TrackerSampleApp::GetCompositor() const + { + using namespace Orthanc; + try + { + SdlViewport& viewport = const_cast(dynamic_cast(viewport_)); + return viewport.GetCompositor(); + } + catch (std::bad_cast e) + { + throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!"); + } + } + + + void TrackerSampleApp::Run() + { + controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); + + GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_0, Orthanc::Encoding_Latin1); + GetCompositor().SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_1, Orthanc::Encoding_Latin1); + + while (!g_stopApplication) + { + GetCompositor().Refresh(); + + SDL_Event event; + while (!g_stopApplication && SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + g_stopApplication = true; + break; + } + else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + DisableTracker(); // was: tracker.reset(NULL); + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + viewport_.GetWindow().ToggleMaximize(); + break; + + case SDLK_q: + g_stopApplication = true; + break; + default: + break; + } + } + HandleApplicationEvent(event); + } + SDL_Delay(1); + } + } + + void TrackerSampleApp::SetInfoDisplayMessage( + std::string key, std::string value) + { + if (value == "") + infoTextMap_.erase(key); + else + infoTextMap_[key] = value; + DisplayInfoText(); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,150 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Messages/IObserver.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" +#include "../../Framework/Scene2DViewport/MeasureTool.h" +#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" +#include "../../Framework/Viewport/SdlViewport.h" + +#include + +#include +#include +#include + +namespace OrthancStone +{ + enum GuiTool + { + GuiTool_Rotate = 0, + GuiTool_Pan, + GuiTool_Zoom, + GuiTool_LineMeasure, + GuiTool_CircleMeasure, + GuiTool_AngleMeasure, + GuiTool_EllipseMeasure, + GuiTool_LAST + }; + + const char* MeasureToolToString(size_t i); + + static const unsigned int FONT_SIZE_0 = 32; + static const unsigned int FONT_SIZE_1 = 24; + + class Scene2D; + class UndoStack; + + class TrackerSampleApp : public IObserver + , public boost::enable_shared_from_this + { + public: + // 12 because. + TrackerSampleApp(MessageBroker& broker); + void PrepareScene(); + void Run(); + void SetInfoDisplayMessage(std::string key, std::string value); + void DisableTracker(); + + void HandleApplicationEvent(const SDL_Event& event); + + /** + This method is called when the scene transform changes. It allows to + recompute the visual elements whose content depend upon the scene transform + */ + void OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message); + + private: + void SelectNextTool(); + void CreateRandomMeasureTool(); + + + /** + In the case of this app, the viewport is an SDL viewport and it has + a OpenGLCompositor& GetCompositor() method + */ + ICompositor& GetCompositor(); + + /** + See the other overload + */ + const ICompositor& GetCompositor() const; + + /** + This returns a random point in the canvas part of the scene, but in + scene coordinates + */ + ScenePoint2D GetRandomPointInScene() const; + + boost::shared_ptr TrackerHitTest(const PointerEvent& e); + + boost::shared_ptr CreateSuitableTracker( + const SDL_Event& event, + const PointerEvent& e); + + void TakeScreenshot( + const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight); + + /** + This adds the command at the top of the undo stack + */ + void Commit(boost::shared_ptr cmd); + void Undo(); + void Redo(); + + private: + void DisplayFloatingCtrlInfoText(const PointerEvent& e); + void DisplayInfoText(); + void HideInfoText(); + + private: + /** + WARNING: the measuring tools do store a reference to the scene, and it + paramount that the scene gets destroyed AFTER the measurement tools. + */ + boost::shared_ptr controller_; + + std::map infoTextMap_; + boost::shared_ptr activeTracker_; + + //static const int LAYER_POSITION = 150; + + int TEXTURE_2x2_1_ZINDEX; + int TEXTURE_1x1_ZINDEX; + int TEXTURE_2x2_2_ZINDEX; + int LINESET_1_ZINDEX; + int LINESET_2_ZINDEX; + int FLOATING_INFOTEXT_LAYER_ZINDEX; + int FIXED_INFOTEXT_LAYER_ZINDEX; + + GuiTool currentTool_; + boost::shared_ptr undoStack_; + SdlOpenGLViewport viewport_; + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/cpp.hint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/Sdl/cpp.hint Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,2 @@ +#define ORTHANC_OVERRIDE +#define ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(FILE, LINE, NAME) class NAME : public ::OrthancStone::IMessage {}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,427 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + + +#include "dev.h" + +#include + +#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../Framework/Oracle/SleepOracleCommand.h" +#include "../../Framework/Oracle/WebAssemblyOracle.h" +#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../Framework/StoneInitialization.h" +#include "../../Framework/Volumes/VolumeSceneLayerSource.h" + + +namespace OrthancStone +{ + class VolumeSlicerWidget : public IObserver + { + private: + OrthancStone::WebAssemblyViewport viewport_; + std::unique_ptr source_; + VolumeProjection projection_; + std::vector planes_; + size_t currentPlane_; + + void Handle(const DicomVolumeImage::GeometryReadyMessage& message) + { + LOG(INFO) << "Geometry is available"; + + const VolumeImageGeometry& geometry = message.GetOrigin().GetGeometry(); + + const unsigned int depth = geometry.GetProjectionDepth(projection_); + currentPlane_ = depth / 2; + + planes_.resize(depth); + + for (unsigned int z = 0; z < depth; z++) + { + planes_[z] = geometry.GetProjectionSlice(projection_, z); + } + + Refresh(); + + viewport_.FitContent(); + } + + public: + VolumeSlicerWidget(MessageBroker& broker, + const std::string& canvas, + VolumeProjection projection) : + IObserver(broker), + viewport_(broker, canvas), + projection_(projection), + currentPlane_(0) + { + } + + void UpdateSize() + { + viewport_.UpdateSize(); + } + + void SetSlicer(int layerDepth, + const boost::shared_ptr& slicer, + IObservable& loader, + ILayerStyleConfigurator* configurator) + { + if (source_.get() != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Only one slicer can be registered"); + } + + loader.RegisterObserverCallback( + new Callable + (*this, &VolumeSlicerWidget::Handle)); + + source_.reset(new VolumeSceneLayerSource(viewport_.GetScene(), layerDepth, slicer)); + + if (configurator != NULL) + { + source_->SetConfigurator(configurator); + } + } + + void Refresh() + { + if (source_.get() != NULL && + currentPlane_ < planes_.size()) + { + source_->Update(planes_[currentPlane_]); + viewport_.Refresh(); + } + } + + size_t GetSlicesCount() const + { + return planes_.size(); + } + + void Scroll(int delta) + { + if (!planes_.empty()) + { + int tmp = static_cast(currentPlane_) + delta; + unsigned int next; + + if (tmp < 0) + { + next = 0; + } + else if (tmp >= static_cast(planes_.size())) + { + next = planes_.size() - 1; + } + else + { + next = static_cast(tmp); + } + + if (next != currentPlane_) + { + currentPlane_ = next; + Refresh(); + } + } + } + }; +} + + + + +boost::shared_ptr ct_(new OrthancStone::DicomVolumeImage); + +boost::shared_ptr loader_; + +std::unique_ptr widget1_; +std::unique_ptr widget2_; +std::unique_ptr widget3_; + +OrthancStone::MessageBroker broker_; +OrthancStone::WebAssemblyOracle oracle_(broker_); + + +EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) +{ + try + { + if (widget1_.get() != NULL) + { + widget1_->UpdateSize(); + } + + if (widget2_.get() != NULL) + { + widget2_->UpdateSize(); + } + + if (widget3_.get() != NULL) + { + widget3_->UpdateSize(); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while updating canvas size: " << e.What(); + } + + return true; +} + + + + +EM_BOOL OnAnimationFrame(double time, void *userData) +{ + try + { + if (widget1_.get() != NULL) + { + widget1_->Refresh(); + } + + if (widget2_.get() != NULL) + { + widget2_->Refresh(); + } + + if (widget3_.get() != NULL) + { + widget3_->Refresh(); + } + + return true; + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception in the animation loop, stopping now: " << e.What(); + return false; + } +} + + +static bool ctrlDown_ = false; + + +EM_BOOL OnMouseWheel(int eventType, + const EmscriptenWheelEvent *wheelEvent, + void *userData) +{ + try + { + if (userData != NULL) + { + int delta = 0; + + if (wheelEvent->deltaY < 0) + { + delta = -1; + } + + if (wheelEvent->deltaY > 0) + { + delta = 1; + } + + OrthancStone::VolumeSlicerWidget& widget = + *reinterpret_cast(userData); + + if (ctrlDown_) + { + delta *= static_cast(widget.GetSlicesCount() / 10); + } + + widget.Scroll(delta); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception in the wheel event: " << e.What(); + } + + return true; +} + + +EM_BOOL OnKeyDown(int eventType, + const EmscriptenKeyboardEvent *keyEvent, + void *userData) +{ + ctrlDown_ = keyEvent->ctrlKey; + return false; +} + + +EM_BOOL OnKeyUp(int eventType, + const EmscriptenKeyboardEvent *keyEvent, + void *userData) +{ + ctrlDown_ = false; + return false; +} + + + + +namespace OrthancStone +{ + class TestSleep : public IObserver + { + private: + WebAssemblyOracle& oracle_; + + void Schedule() + { + oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(2000)); + } + + void Handle(const SleepOracleCommand::TimeoutMessage& message) + { + LOG(INFO) << "TIMEOUT"; + Schedule(); + } + + public: + TestSleep(MessageBroker& broker, + WebAssemblyOracle& oracle) : + IObserver(broker), + oracle_(oracle) + { + oracle.RegisterObserverCallback( + new Callable + (*this, &TestSleep::Handle)); + + LOG(INFO) << "STARTING"; + Schedule(); + } + }; + + //static TestSleep testSleep(broker_, oracle_); +} + + + +static std::map arguments_; + +static bool GetArgument(std::string& value, + const std::string& key) +{ + std::map::const_iterator found = arguments_.find(key); + + if (found == arguments_.end()) + { + return false; + } + else + { + value = found->second; + return true; + } +} + + +extern "C" +{ + int main(int argc, char const *argv[]) + { + OrthancStone::StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); + // Orthanc::Logging::EnableTraceLevel(true); + EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); + } + + EMSCRIPTEN_KEEPALIVE + void SetArgument(const char* key, const char* value) + { + // This is called for each GET argument (cf. "app.js") + LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; + arguments_[key] = value; + } + + EMSCRIPTEN_KEEPALIVE + void Initialize() + { + try + { + oracle_.SetOrthancRoot(".."); + + loader_.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct_, oracle_, oracle_)); + + widget1_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas1", OrthancStone::VolumeProjection_Axial)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget1_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget1_->UpdateSize(); + + widget2_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas2", OrthancStone::VolumeProjection_Coronal)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget2_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget2_->UpdateSize(); + + widget3_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas3", OrthancStone::VolumeProjection_Sagittal)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget3_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget3_->UpdateSize(); + + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnWindowResize); // DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 !! + + emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnMouseWheel); + emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnMouseWheel); + emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnMouseWheel); + + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); + + emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); + + + std::string ct; + if (GetArgument(ct, "ct")) + { + //loader_->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); + loader_->LoadSeries(ct); + } + else + { + LOG(ERROR) << "No Orthanc identifier for the CT series was provided"; + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception during Initialize(): " << e.What(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ + + + + + + + + + + + + Stone of Orthanc + + + + + + + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,210 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "dev.h" + +#include +#include + +// From Stone +#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" +#include "../../Framework/StoneInitialization.h" + +// From Orthanc framework +#include +#include +#include + +void PrepareScene(OrthancStone::Scene2D& scene) +{ + using namespace OrthancStone; + + // Texture of 2x2 size + if (1) + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + p[3] = 0; + p[4] = 255; + p[5] = 0; + + p = reinterpret_cast(i.GetRow(1)); + p[0] = 0; + p[1] = 0; + p[2] = 255; + + p[3] = 255; + p[4] = 0; + p[5] = 0; + + scene.SetLayer(12, new ColorTextureSceneLayer(i)); + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-3, 2); + l->SetPixelSpacing(1.5, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + scene.SetLayer(14, l.release()); + } + + // Texture of 1x1 size + if (1) + { + Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); + + uint8_t *p = reinterpret_cast(i.GetRow(0)); + p[0] = 255; + p[1] = 0; + p[2] = 0; + + std::unique_ptr l(new ColorTextureSceneLayer(i)); + l->SetOrigin(-2, 1); + l->SetAngle(20.0 / 180.0 * M_PI); + scene.SetLayer(13, l.release()); + } + + // Some lines + if (1) + { + std::unique_ptr layer(new PolylineSceneLayer); + + layer->SetThickness(1); + + PolylineSceneLayer::Chain chain; + chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); + chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); + chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); + layer->AddChain(chain, true, 255, 0, 0); + + chain.clear(); + chain.push_back(ScenePoint2D(-5, -5)); + chain.push_back(ScenePoint2D(5, -5)); + chain.push_back(ScenePoint2D(5, 5)); + chain.push_back(ScenePoint2D(-5, 5)); + layer->AddChain(chain, true, 0, 255, 0); + + double dy = 1.01; + chain.clear(); + chain.push_back(ScenePoint2D(-4, -4)); + chain.push_back(ScenePoint2D(4, -4 + dy)); + chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); + chain.push_back(ScenePoint2D(4, 2)); + layer->AddChain(chain, false, 0, 0, 255); + + scene.SetLayer(50, layer.release()); + } + + // Some text + if (1) + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetText("Hello"); + scene.SetLayer(100, layer.release()); + } +} + + +std::unique_ptr viewport1_; +std::unique_ptr viewport2_; +std::unique_ptr viewport3_; +boost::shared_ptr controller1_; +boost::shared_ptr controller2_; +boost::shared_ptr controller3_; +OrthancStone::MessageBroker broker_; + + +EM_BOOL OnWindowResize( + int eventType, const EmscriptenUiEvent *uiEvent, void *userData) +{ + if (viewport1_.get() != NULL) + { + viewport1_->UpdateSize(); + } + + if (viewport2_.get() != NULL) + { + viewport2_->UpdateSize(); + } + + if (viewport3_.get() != NULL) + { + viewport3_->UpdateSize(); + } + + return true; +} + +extern "C" +{ + int main(int argc, char const *argv[]) + { + OrthancStone::StoneInitialize(); + // Orthanc::Logging::EnableInfoLevel(true); + // Orthanc::Logging::EnableTraceLevel(true); + EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); + } + + EMSCRIPTEN_KEEPALIVE + void Initialize() + { + viewport1_.reset(new OrthancStone::WebAssemblyViewport("mycanvas1")); + PrepareScene(viewport1_->GetScene()); + viewport1_->UpdateSize(); + + viewport2_.reset(new OrthancStone::WebAssemblyViewport("mycanvas2")); + PrepareScene(viewport2_->GetScene()); + viewport2_->UpdateSize(); + + viewport3_.reset(new OrthancStone::WebAssemblyViewport("mycanvas3")); + PrepareScene(viewport3_->GetScene()); + viewport3_->UpdateSize(); + + viewport1_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE, Orthanc::Encoding_Latin1); + viewport2_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE, Orthanc::Encoding_Latin1); + viewport3_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE, Orthanc::Encoding_Latin1); + + controller1_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport1_)); + controller2_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport2_)); + controller3_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport3_)); + + controller1_->FitContent(viewport1_->GetCanvasWidth(), viewport1_->GetCanvasHeight()); + controller2_->FitContent(viewport2_->GetCanvasWidth(), viewport2_->GetCanvasHeight()); + controller3_->FitContent(viewport3_->GetCanvasWidth(), viewport3_->GetCanvasHeight()); + + viewport1_->Refresh(); + viewport2_->Refresh(); + viewport3_->Refresh(); + + SetupEvents("mycanvas1", controller1_); + SetupEvents("mycanvas2", controller2_); + SetupEvents("mycanvas3", controller3_); + + emscripten_set_resize_callback("#window", NULL, false, OnWindowResize); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ + + + + + + + + + + + + Stone of Orthanc + + + + + + + + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,119 @@ +cmake_minimum_required(VERSION 2.8.3) + + +##################################################################### +## Configuration of the Emscripten compiler for WebAssembly target +##################################################################### + +set(WASM_FLAGS "-s WASM=1 -s FETCH=1") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXIT_RUNTIME=1") + +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") + + +##################################################################### +## Configuration of the Orthanc framework +##################################################################### + +# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it +# must be the first inclusion +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) + +if (ORTHANC_STONE_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_VERSION "mainline") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") +else() + set(ORTHANC_FRAMEWORK_VERSION "1.5.7") + set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") +endif() + +set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") +set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") +set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") + + +##################################################################### +## Configuration of the Stone framework +##################################################################### + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) +include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +set(ORTHANC_STONE_APPLICATION_RESOURCES + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) +SET(ORTHANC_SANDBOXED ON) +SET(ENABLE_WASM ON) + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) + +add_definitions( + -DORTHANC_ENABLE_LOGGING_PLUGIN=0 + ) + + +##################################################################### +## Build the samples +##################################################################### + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ) + + +if (ON) + add_executable(BasicScene + BasicScene.cpp + #${CMAKE_CURRENT_LIST_DIR}/../Shared/SharedBasicScene.h + ${CMAKE_CURRENT_LIST_DIR}/../Shared/SharedBasicScene.cpp + ) + + target_link_libraries(BasicScene OrthancStone) + + install( + TARGETS BasicScene + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} + ) +endif() + + +if (ON) + add_executable(BasicMPR + BasicMPR.cpp + ) + + target_link_libraries(BasicMPR OrthancStone) + + install( + TARGETS BasicMPR + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} + ) +endif() + + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/BasicMPR.wasm + ${CMAKE_CURRENT_BINARY_DIR}/BasicScene.wasm + ${CMAKE_SOURCE_DIR}/BasicMPR.html + ${CMAKE_SOURCE_DIR}/BasicScene.html + ${CMAKE_SOURCE_DIR}/Configuration.json + ${CMAKE_SOURCE_DIR}/app.js + ${CMAKE_SOURCE_DIR}/index.html + DESTINATION ${CMAKE_INSTALL_PREFIX} + ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/Configuration.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/Configuration.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,17 @@ +{ + "Plugins": [ + "/usr/local/share/orthanc/plugins/libOrthancWebViewer.so", + "/usr/local/share/orthanc/plugins/libServeFolders.so" + ], + "StorageDirectory" : "/var/lib/orthanc/db", + "IndexDirectory" : "/var/lib/orthanc/db", + "RemoteAccessAllowed" : true, + "AuthenticationEnabled" : false, + "ServeFolders" : { + "AllowCache" : false, + "GenerateETag" : true, + "Folders" : { + "/stone" : "/root/stone" + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/ConfigurationLocalSJO.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/ConfigurationLocalSJO.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ +{ + "Plugins": [ + "/home/jodogne/Subversion/orthanc-webviewer/r/libOrthancWebViewer.so", + "/home/jodogne/Subversion/orthanc/r/libServeFolders.so" + ], + "StorageDirectory" : "/tmp/orthanc-db", + "IndexDirectory" : "/tmp/orthanc-db", + "RemoteAccessAllowed" : true, + "AuthenticationEnabled" : false, + "ServeFolders" : { + "AllowCache" : false, + "GenerateETag" : true, + "Folders" : { + "/stone" : "/tmp/stone" + } + }, + "WebViewer" : { + "CachePath" : "/tmp/orthanc-db/WebViewerCache" + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/NOTES.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/NOTES.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +Docker SJO +========== + +$ source ~/Downloads/emsdk/emsdk_env.sh +$ cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON .. -DCMAKE_INSTALL_PREFIX=/tmp/stone +$ ninja install +$ docker run -p 4242:4242 -p 8042:8042 --rm -v /tmp/stone:/root/stone:ro -v /tmp/stone-db/:/var/lib/orthanc/db/ jodogne/orthanc-plugins:latest /root/stone/Configuration.json --verbose + +WARNING: This won't work using "orthanc-plugins:1.5.6", as support for +PAM is mandatatory in "/instances/.../image-uint16". + + +Docker BGO +========== + +On Ubuntu WSL +------------- +. ~/apps/emsdk/emsdk_env.sh +cd /mnt/c/osi/dev/ +mkdir -p build_stone_newsamples_wasm_wsl +mkdir -p build_install_stone_newsamples_wasm_wsl +cd build_stone_newsamples_wasm_wsl +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/osi/dev/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/osi/dev/build_install_stone_newsamples_wasm_wsl +ninja install + +Then, on Windows +----------------- +docker run -p 4242:4242 -p 8042:8042 --rm -v "C:/osi/dev/build_install_stone_newsamples_wasm_wsl:/root/stone:ro" jodogne/orthanc-plugins:1.5.6 /root/stone/Configuration.json --verbose + +# WAIT A COUPLE OF SECS +# if the archive has NOT already been unzipped, unzip it +# upload dicom files to running orthanc + +cd C:\osi\dev\twiga-orthanc-viewer\demo\dicomfiles +if (-not (test-path RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57)) { unzip RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57.zip} +ImportDicomFiles.ps1 127.0.0.1 8042 .\RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57\ + +--> localhost:8042 --> Plugins --> serve-folders --> stone --> ... + +Local BGO +========== + +. ~/apps/emsdk/emsdk_env.sh +cd /mnt/c/osi/dev/ +mkdir -p build_stone_newsamples_wasm_wsl +mkdir -p build_install_stone_newsamples_wasm_wsl +cd build_stone_newsamples_wasm_wsl +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/osi/dev/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/osi/dev/build_install_stone_newsamples_wasm_wsl + + + +TODO: Orthanc.exe + + +Local SJO +========== + +$ source ~/Downloads/emsdk/emsdk_env.sh +$ cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON .. -DCMAKE_INSTALL_PREFIX=/tmp/stone +$ ninja install + +$ make -C ~/Subversion/orthanc/r -j4 +$ make -C ~/Subversion/orthanc-webviewer/r -j4 +$ ~/Subversion/orthanc/r/Orthanc ../ConfigurationLocalSJO.json + + +Local AM +======== + +. ~/apps/emsdk/emsdk_env.sh +cd /mnt/c/o/ +mkdir -p build_stone_newsamples_wasm_wsl +mkdir -p build_install_stone_newsamples_wasm_wsl +cd build_stone_newsamples_wasm_wsl +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/fastcomp/emscripten/cmake/Modules/Platform/Emscripten.cmake -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=/mnt/c/o/orthanc/ -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/o/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/o/build_install_stone_newsamples_wasm_wsl +ninja diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/app.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/app.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,33 @@ +/** + * This is a generic bootstrap code that is shared by all the Stone + * sample applications. + **/ + +// Check support for WebAssembly +if (!('WebAssembly' in window)) { + alert('Sorry, your browser does not support WebAssembly :('); +} else { + + // Wait for the module to be loaded (the event "WebAssemblyLoaded" + // must be emitted by the "main" function) + window.addEventListener('WebAssemblyLoaded', function() { + + // Loop over the GET arguments + var parameters = window.location.search.substr(1); + if (parameters != null && parameters != '') { + var tokens = parameters.split('&'); + for (var i = 0; i < tokens.length; i++) { + var arg = tokens[i].split('='); + if (arg.length == 2) { + + // Send each GET argument to WebAssembly + Module.ccall('SetArgument', null, [ 'string', 'string' ], + [ arg[0], decodeURIComponent(arg[1]) ]); + } + } + } + + // Inform the WebAssembly module that it can start + Module.ccall('Initialize', null, null, null); + }); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/dev.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/dev.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,202 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Framework/Viewport/WebAssemblyViewport.h" +#include "../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../Framework/Scene2D/PanSceneTracker.h" +#include "../../Framework/Scene2D/RotateSceneTracker.h" +#include "../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../Framework/Scene2DViewport/UndoStack.h" +#include "../../Framework/Scene2DViewport/ViewportController.h" + +#include + +#include +#include + +static const unsigned int FONT_SIZE = 32; + +namespace OrthancStone +{ + class ActiveTracker : public boost::noncopyable + { + private: + boost::shared_ptr tracker_; + std::string canvasIdentifier_; + bool insideCanvas_; + + public: + ActiveTracker(const boost::shared_ptr& tracker, + const std::string& canvasId) : + tracker_(tracker), + canvasIdentifier_(canvasId), + insideCanvas_(true) + { + if (tracker_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + bool IsAlive() const + { + return tracker_->IsAlive(); + } + + void PointerMove(const PointerEvent& event) + { + tracker_->PointerMove(event); + } + + void PointerUp(const PointerEvent& event) + { + tracker_->PointerUp(event); + } + }; +} + +static OrthancStone::PointerEvent* ConvertMouseEvent( + const EmscriptenMouseEvent& source, + OrthancStone::IViewport& viewport) +{ + std::unique_ptr target( + new OrthancStone::PointerEvent); + + target->AddPosition(viewport.GetPixelCenterCoordinates( + source.targetX, source.targetY)); + target->SetAltModifier(source.altKey); + target->SetControlModifier(source.ctrlKey); + target->SetShiftModifier(source.shiftKey); + + return target.release(); +} + +std::unique_ptr tracker_; + +EM_BOOL OnMouseEvent(int eventType, + const EmscriptenMouseEvent *mouseEvent, + void *userData) +{ + if (mouseEvent != NULL && + userData != NULL) + { + boost::shared_ptr& controller = + *reinterpret_cast*>(userData); + + switch (eventType) + { + case EMSCRIPTEN_EVENT_CLICK: + { + static unsigned int count = 0; + char buf[64]; + sprintf(buf, "click %d", count++); + + std::unique_ptr layer(new OrthancStone::TextSceneLayer); + layer->SetText(buf); + controller->GetViewport().GetScene().SetLayer(100, layer.release()); + controller->GetViewport().Refresh(); + break; + } + + case EMSCRIPTEN_EVENT_MOUSEDOWN: + { + boost::shared_ptr t; + + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + + switch (mouseEvent->button) + { + case 0: // Left button + emscripten_console_log("Creating RotateSceneTracker"); + t.reset(new OrthancStone::RotateSceneTracker( + controller, *event)); + break; + + case 1: // Middle button + emscripten_console_log("Creating PanSceneTracker"); + LOG(INFO) << "Creating PanSceneTracker" ; + t.reset(new OrthancStone::PanSceneTracker( + controller, *event)); + break; + + case 2: // Right button + emscripten_console_log("Creating ZoomSceneTracker"); + t.reset(new OrthancStone::ZoomSceneTracker( + controller, *event, controller->GetViewport().GetCanvasWidth())); + break; + + default: + break; + } + } + + if (t.get() != NULL) + { + tracker_.reset( + new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier())); + controller->GetViewport().Refresh(); + } + + break; + } + + case EMSCRIPTEN_EVENT_MOUSEMOVE: + if (tracker_.get() != NULL) + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + tracker_->PointerMove(*event); + controller->GetViewport().Refresh(); + } + break; + + case EMSCRIPTEN_EVENT_MOUSEUP: + if (tracker_.get() != NULL) + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + tracker_->PointerUp(*event); + controller->GetViewport().Refresh(); + if (!tracker_->IsAlive()) + tracker_.reset(); + } + break; + + default: + break; + } + } + + return true; +} + + +void SetupEvents(const std::string& canvas, + boost::shared_ptr& controller) +{ + emscripten_set_mousedown_callback(canvas.c_str(), &controller, false, OnMouseEvent); + emscripten_set_mousemove_callback(canvas.c_str(), &controller, false, OnMouseEvent); + emscripten_set_mouseup_callback(canvas.c_str(), &controller, false, OnMouseEvent); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Deprecated/Samples/WebAssembly/index.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,16 @@ + + + + + + + Stone of Orthanc + + +

Available samples

+
+ + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Messaging/CurlOrthancConnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Messaging/CurlOrthancConnection.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CurlOrthancConnection.h" + +#if ORTHANC_ENABLE_CURL == 1 + +#include "../../Resources/Orthanc/Core/HttpClient.h" +#include "../../Resources/Orthanc/Core/OrthancException.h" + +namespace OrthancStone +{ + void CurlOrthancConnection::RestApiGet(std::string& result, + const std::string& uri) + { + /** + * TODO: This function sometimes crashes if compiled with + * MinGW-W64 (32 bit) in Release mode, on Windows XP. Introducing + * a mutex here fixes the issue. Not sure of what is the + * culprit. Maybe a bug in a old version of MinGW? + **/ + + Orthanc::HttpClient client(parameters_, uri); + + // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) + client.SetRedirectionFollowed(false); + + if (!client.Apply(result)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + } + + + void CurlOrthancConnection::RestApiPost(std::string& result, + const std::string& uri, + const std::string& body) + { + Orthanc::HttpClient client(parameters_, uri); + + // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) + client.SetRedirectionFollowed(false); + + client.SetBody(body); + client.SetMethod(Orthanc::HttpMethod_Post); + + if (!client.Apply(result)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Messaging/CurlOrthancConnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Messaging/CurlOrthancConnection.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOrthancConnection.h" + +#if ORTHANC_ENABLE_CURL == 1 + +#include "../../Resources/Orthanc/Core/WebServiceParameters.h" + +namespace OrthancStone +{ + class CurlOrthancConnection : public IOrthancConnection + { + private: + Orthanc::WebServiceParameters parameters_; + + public: + CurlOrthancConnection(const Orthanc::WebServiceParameters& parameters) : + parameters_(parameters) + { + } + + const Orthanc::WebServiceParameters& GetParameters() const + { + return parameters_; + } + + virtual void RestApiGet(std::string& result, + const std::string& uri); + + virtual void RestApiPost(std::string& result, + const std::string& uri, + const std::string& body); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Messaging/IOrthancConnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Messaging/IOrthancConnection.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,41 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/IThreadSafety.h" + +#include + +namespace OrthancStone +{ + // Derived classes must be thread-safe + class IOrthancConnection : public IThreadSafe + { + public: + virtual void RestApiGet(std::string& result, + const std::string& uri) = 0; + + virtual void RestApiPost(std::string& result, + const std::string& uri, + const std::string& body) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/ReferenceLineFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/ReferenceLineFactory.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ReferenceLineFactory.h" + +#include "LineLayerRenderer.h" + +namespace OrthancStone +{ + ReferenceLineFactory::ReferenceLineFactory(SliceViewerWidget& owner, + SliceViewerWidget& sibling) : + owner_(owner), + sibling_(sibling), + hasLayerIndex_(false) + { + style_.SetColor(0, 255, 0); + slice_ = sibling.GetSlice(); + sibling_.Register(*this); + } + + + void ReferenceLineFactory::NotifySliceContentChange(const SliceViewerWidget& source, + const SliceGeometry& slice) + { + if (&source == &sibling_) + { + SetSlice(slice); + } + } + + + void ReferenceLineFactory::SetLayerIndex(size_t layerIndex) + { + hasLayerIndex_ = true; + layerIndex_ = layerIndex; + } + + + void ReferenceLineFactory::SetStyle(const RenderStyle& style) + { + style_ = style; + } + + + RenderStyle ReferenceLineFactory::GetRenderStyle() + { + return style_; + } + + + void ReferenceLineFactory::SetSlice(const SliceGeometry& slice) + { + slice_ = slice; + + if (hasLayerIndex_) + { + owner_.InvalidateLayer(layerIndex_); + } + } + + + ILayerRenderer* ReferenceLineFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) + { + Vector p, d; + + // Compute the line of intersection between the two slices + if (!GeometryToolbox::IntersectTwoPlanes(p, d, + slice_.GetOrigin(), slice_.GetNormal(), + viewportSlice.GetOrigin(), viewportSlice.GetNormal())) + { + // The two slice are parallel, don't try and display the intersection + return NULL; + } + + double x1, y1, x2, y2; + viewportSlice.ProjectPoint(x1, y1, p); + viewportSlice.ProjectPoint(x2, y2, p + 1000.0 * d); + + double sx1, sy1, sx2, sy2; + owner_.GetView().GetSceneExtent(sx1, sy1, sx2, sy2); + + if (GeometryToolbox::ClipLineToRectangle(x1, y1, x2, y2, + x1, y1, x2, y2, + sx1, sy1, sx2, sy2)) + { + std::unique_ptr layer(new LineLayerRenderer(x1, y1, x2, y2)); + layer->SetLayerStyle(style_); + return layer.release(); + } + else + { + // Parallel slices + return NULL; + } + } + + + ISliceableVolume& ReferenceLineFactory::GetSourceVolume() const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void ReferenceLineFactory::Configure(SliceViewerWidget& a, + SliceViewerWidget& b) + { + { + size_t layerIndex; + ILayerRendererFactory& factory = a.AddLayer(layerIndex, new ReferenceLineFactory(a, b)); + dynamic_cast(factory).SetLayerIndex(layerIndex); + } + + { + size_t layerIndex; + ILayerRendererFactory& factory = b.AddLayer(layerIndex, new ReferenceLineFactory(b, a)); + dynamic_cast(factory).SetLayerIndex(layerIndex); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/ReferenceLineFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/ReferenceLineFactory.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,77 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Widgets/SliceViewerWidget.h" + +namespace OrthancStone +{ + class ReferenceLineFactory : + public ILayerRendererFactory, + public SliceViewerWidget::ISliceObserver + { + private: + SliceViewerWidget& owner_; + SliceViewerWidget& sibling_; + SliceGeometry slice_; + RenderStyle style_; + bool hasLayerIndex_; + size_t layerIndex_; + + + public: + ReferenceLineFactory(SliceViewerWidget& owner, + SliceViewerWidget& sibling); + + virtual void NotifySliceContentChange(const SliceViewerWidget& source, + const SliceGeometry& slice); + + void SetLayerIndex(size_t layerIndex); + + void SetStyle(const RenderStyle& style); + + RenderStyle GetRenderStyle(); + + void SetSlice(const SliceGeometry& slice); + + virtual bool GetExtent(double& x1, + double& y1, + double& x2, + double& y2, + const SliceGeometry& viewportSlice) + { + return false; + } + + virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); + + virtual bool HasSourceVolume() const + { + return false; + } + + virtual ISliceableVolume& GetSourceVolume() const; + + static void Configure(SliceViewerWidget& a, + SliceViewerWidget& b); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/BinarySemaphore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/BinarySemaphore.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "BinarySemaphore.h" + +namespace OrthancStone +{ + BinarySemaphore::BinarySemaphore() : + proceed_(false) + { + } + + void BinarySemaphore::Signal() + { + //boost::mutex::scoped_lock lock(mutex_); + + proceed_ = true; + condition_.notify_one(); + } + + void BinarySemaphore::Wait() + { + boost::mutex::scoped_lock lock(mutex_); + + while (!proceed_) + { + condition_.wait(lock); + } + + proceed_ = false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/BinarySemaphore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/BinarySemaphore.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace OrthancStone +{ + class BinarySemaphore : public boost::noncopyable + { + private: + bool proceed_; + boost::mutex mutex_; + boost::condition_variable condition_; + + public: + explicit BinarySemaphore(); + + void Signal(); + + void Wait(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/IThreadSafety.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/IThreadSafety.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + /** + * Dummy interface to explicitely tag the interfaces whose derived + * class must be thread-safe. The different methods of such classes + * might be simlultaneously invoked by several threads, and should + * be properly protected by mutexes. + **/ + class IThreadSafe : public boost::noncopyable + { + public: + virtual ~IThreadSafe() + { + } + }; + + + /** + * Dummy interface to explicitely tag the interfaces that are NOT + * expected to be thread-safe. The Orthanc Stone framework ensures + * that at most one method of such classes will be invoked at a + * given time. Such classes are automatically protected by the + * Orthanc Stone framework wherever required. + **/ + class IThreadUnsafe : public boost::noncopyable + { + public: + virtual ~IThreadUnsafe() + { + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/SdlBuffering.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/SdlBuffering.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,134 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlBuffering.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#include "../../Resources/Orthanc/Core/Logging.h" +#include "../../Resources/Orthanc/Core/OrthancException.h" + +namespace OrthancStone +{ + SdlBuffering::SdlBuffering() : + sdlSurface_(NULL), + pendingFrame_(false) + { + } + + + SdlBuffering::~SdlBuffering() + { + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + } + + + void SdlBuffering::SetSize(unsigned int width, + unsigned int height, + IViewport& viewport) + { + boost::mutex::scoped_lock lock(mutex_); + + viewport.SetSize(width, height); + + if (offscreenSurface_.get() == NULL || + offscreenSurface_->GetWidth() != width || + offscreenSurface_->GetHeight() != height) + { + offscreenSurface_.reset(new CairoSurface(width, height)); + } + + if (onscreenSurface_.get() == NULL || + onscreenSurface_->GetWidth() != width || + onscreenSurface_->GetHeight() != height) + { + onscreenSurface_.reset(new CairoSurface(width, height)); + + // TODO Big endian? + static const uint32_t rmask = 0x00ff0000; + static const uint32_t gmask = 0x0000ff00; + static const uint32_t bmask = 0x000000ff; + + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + + sdlSurface_ = SDL_CreateRGBSurfaceFrom(onscreenSurface_->GetBuffer(), width, height, 32, + onscreenSurface_->GetPitch(), rmask, gmask, bmask, 0); + if (!sdlSurface_) + { + LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + pendingFrame_ = false; + } + + + bool SdlBuffering::RenderOffscreen(IViewport& viewport) + { + boost::mutex::scoped_lock lock(mutex_); + + if (offscreenSurface_.get() == NULL) + { + return false; + } + + Orthanc::ImageAccessor target = offscreenSurface_->GetAccessor(); + + if (viewport.Render(target) && + !pendingFrame_) + { + pendingFrame_ = true; + return true; + } + else + { + return false; + } + } + + + void SdlBuffering::SwapToScreen(SdlWindow& window) + { + if (!pendingFrame_ || + offscreenSurface_.get() == NULL || + onscreenSurface_.get() == NULL) + { + return; + } + + { + boost::mutex::scoped_lock lock(mutex_); + onscreenSurface_->Copy(*offscreenSurface_); + } + + window.Render(sdlSurface_); + pendingFrame_ = false; + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/SdlBuffering.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/SdlBuffering.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include "SdlWindow.h" +#include "../../Framework/Viewport/CairoSurface.h" +#include "../../Framework/Viewport/IViewport.h" + +#include + +namespace OrthancStone +{ + class SdlBuffering : public boost::noncopyable + { + private: + boost::mutex mutex_; + std::unique_ptr offscreenSurface_; + std::unique_ptr onscreenSurface_; + SDL_Surface* sdlSurface_; + bool pendingFrame_; + + public: + SdlBuffering(); + + ~SdlBuffering(); + + void SetSize(unsigned int width, + unsigned int height, + IViewport& viewport); + + // Returns "true" if a new refresh of the display should be + // triggered afterwards + bool RenderOffscreen(IViewport& viewport); + + void SwapToScreen(SdlWindow& window); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Threading/SharedValue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Threading/SharedValue.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace OrthancStone +{ + // A value that is protected by a mutex, in order to be shared by + // multiple threads + template + class SharedValue : public boost::noncopyable + { + private: + boost::mutex mutex_; + T value_; + + public: + class Locker : public boost::noncopyable + { + private: + boost::mutex::scoped_lock lock_; + T& value_; + + public: + Locker(SharedValue& shared) : + lock_(shared.mutex_), + value_(shared.value_) + { + } + + T& GetValue() const + { + return value_; + } + }; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Toolbox/DicomDataset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Toolbox/DicomDataset.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,304 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomDataset.h" + +#include "../../Resources/Orthanc/Core/OrthancException.h" +#include "../../Resources/Orthanc/Core/Logging.h" +#include "../../Resources/Orthanc/Core/Toolbox.h" + +#include +#include +#include + +namespace OrthancStone +{ + static uint16_t GetCharValue(char c) + { + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else + return 0; + } + + + static uint16_t GetHexadecimalValue(const char* c) + { + return ((GetCharValue(c[0]) << 12) + + (GetCharValue(c[1]) << 8) + + (GetCharValue(c[2]) << 4) + + GetCharValue(c[3])); + } + + + static DicomDataset::Tag ParseTag(const std::string& tag) + { + if (tag.size() == 9 && + isxdigit(tag[0]) && + isxdigit(tag[1]) && + isxdigit(tag[2]) && + isxdigit(tag[3]) && + (tag[4] == '-' || tag[4] == ',') && + isxdigit(tag[5]) && + isxdigit(tag[6]) && + isxdigit(tag[7]) && + isxdigit(tag[8])) + { + uint16_t group = GetHexadecimalValue(tag.c_str()); + uint16_t element = GetHexadecimalValue(tag.c_str() + 5); + return std::make_pair(group, element); + } + else if (tag.size() == 8 && + isxdigit(tag[0]) && + isxdigit(tag[1]) && + isxdigit(tag[2]) && + isxdigit(tag[3]) && + isxdigit(tag[4]) && + isxdigit(tag[5]) && + isxdigit(tag[6]) && + isxdigit(tag[7])) + { + uint16_t group = GetHexadecimalValue(tag.c_str()); + uint16_t element = GetHexadecimalValue(tag.c_str() + 4); + return std::make_pair(group, element); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + void DicomDataset::Parse(const std::string& content) + { + Json::Value json; + Json::Reader reader; + if (!reader.parse(content, json)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + Parse(json); + } + + + void DicomDataset::Parse(const Json::Value& content) + { + if (content.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + Json::Value::Members members = content.getMemberNames(); + for (size_t i = 0; i < members.size(); i++) + { + Tag tag = ParseTag(members[i]); + + const Json::Value& item = content[members[i]]; + + if (item.type() != Json::objectValue || + !item.isMember("Type") || + !item.isMember("Value") || + !item.isMember("Name") || + item["Type"].type() != Json::stringValue || + item["Name"].type() != Json::stringValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (item["Type"].asString() == "String") + { + if (item["Value"].type() == Json::stringValue) + { + values_[tag] = item["Value"].asString(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + } + } + + + DicomDataset::DicomDataset(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId) + { + std::string content; + orthanc.RestApiGet(content, "/instances/" + instanceId + "/tags"); + + Parse(content); + } + + + std::string DicomDataset::GetStringValue(const Tag& tag) const + { + Values::const_iterator it = values_.find(tag); + + if (it == values_.end()) + { + LOG(ERROR) << "Trying to access a DICOM tag that is not set in a DICOM dataset"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem); + } + else + { + return it->second; + } + } + + + std::string DicomDataset::GetStringValue(const Tag& tag, + const std::string& defaultValue) const + { + Values::const_iterator it = values_.find(tag); + + if (it == values_.end()) + { + return defaultValue; + } + else + { + return it->second; + } + } + + + float DicomDataset::GetFloatValue(const Tag& tag) const + { + try + { + return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); + } + catch (boost::bad_lexical_cast&) + { + LOG(ERROR) << "Trying to access a DICOM tag that is not a float"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + double DicomDataset::GetDoubleValue(const Tag& tag) const + { + try + { + return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); + } + catch (boost::bad_lexical_cast&) + { + LOG(ERROR) << "Trying to access a DICOM tag that is not a float"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + int DicomDataset::GetIntegerValue(const Tag& tag) const + { + try + { + return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); + } + catch (boost::bad_lexical_cast&) + { + LOG(ERROR) << "Trying to access a DICOM tag that is not an integer"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + unsigned int DicomDataset::GetUnsignedIntegerValue(const Tag& tag) const + { + int v = GetIntegerValue(tag); + + if (v < 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + return static_cast(v); + } + } + + + void DicomDataset::GetVectorValue(Vector& vector, + const Tag& tag) const + { + if (!GeometryToolbox::ParseVector(vector, Orthanc::Toolbox::StripSpaces(GetStringValue(tag)))) + { + LOG(ERROR) << "Trying to access a DICOM tag that is not a vector"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void DicomDataset::GetVectorValue(Vector& vector, + const Tag& tag, + size_t expectedSize) const + { + GetVectorValue(vector, tag); + + if (vector.size() != expectedSize) + { + LOG(ERROR) << "A vector in a DICOM tag has a bad size"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void DicomDataset::Print() const + { + for (Values::const_iterator it = values_.begin(); it != values_.end(); ++it) + { + printf("%04x,%04x = [%s]\n", it->first.first, it->first.second, it->second.c_str()); + } + printf("\n"); + } + + + bool DicomDataset::IsGrayscale() const + { + std::string photometric = Orthanc::Toolbox::StripSpaces(GetStringValue(DICOM_TAG_PHOTOMETRIC_INTERPRETATION)); + + return (photometric == "MONOCHROME1" || + photometric == "MONOCHROME2"); + } + + + void DicomDataset::GetPixelSpacing(double& spacingX, + double& spacingY) const + { + if (HasTag(DICOM_TAG_PIXEL_SPACING)) + { + Vector spacing; + GetVectorValue(spacing, DICOM_TAG_PIXEL_SPACING, 2); + spacingX = spacing[0]; + spacingY = spacing[1]; + } + else + { + spacingX = 1.0; + spacingY = 1.0; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Graveyard/Toolbox/DicomDataset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Graveyard/Toolbox/DicomDataset.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,109 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Resources/Orthanc/Plugins/Samples/Common/IOrthancConnection.h" + +#include +#include +#include + +namespace OrthancStone +{ + // This class is NOT thread-safe + // This is a lightweight alternative to Orthanc::DicomMap + class DicomDataset : public boost::noncopyable + { + public: + typedef std::pair Tag; + + private: + typedef std::map Values; + + Values values_; + + void Parse(const std::string& content); + + void Parse(const Json::Value& content); + + public: + DicomDataset(const std::string& content) + { + Parse(content); + } + + DicomDataset(const Json::Value& content) + { + Parse(content); + } + + DicomDataset(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId); + + bool HasTag(const Tag& tag) const + { + return values_.find(tag) != values_.end(); + } + + std::string GetStringValue(const Tag& tag) const; + + std::string GetStringValue(const Tag& tag, + const std::string& defaultValue) const; + + float GetFloatValue(const Tag& tag) const; + + double GetDoubleValue(const Tag& tag) const; + + int GetIntegerValue(const Tag& tag) const; + + unsigned int GetUnsignedIntegerValue(const Tag& tag) const; + + void GetVectorValue(Vector& vector, + const Tag& tag, + size_t expectedSize) const; + + void GetVectorValue(Vector& vector, + const Tag& tag) const; + + void Print() const; + + bool IsGrayscale() const; + + void GetPixelSpacing(double& spacingX, + double& spacingY) const; + }; + + + static const DicomDataset::Tag DICOM_TAG_COLUMNS(0x0028, 0x0011); + static const DicomDataset::Tag DICOM_TAG_IMAGE_ORIENTATION_PATIENT(0x0020, 0x0037); + static const DicomDataset::Tag DICOM_TAG_IMAGE_POSITION_PATIENT(0x0020, 0x0032); + static const DicomDataset::Tag DICOM_TAG_NUMBER_OF_FRAMES(0x0028, 0x0008); + static const DicomDataset::Tag DICOM_TAG_PIXEL_REPRESENTATION(0x0028, 0x0103); + static const DicomDataset::Tag DICOM_TAG_PIXEL_SPACING(0x0028, 0x0030); + static const DicomDataset::Tag DICOM_TAG_RESCALE_INTERCEPT(0x0028, 0x1052); + static const DicomDataset::Tag DICOM_TAG_RESCALE_SLOPE(0x0028, 0x1053); + static const DicomDataset::Tag DICOM_TAG_ROWS(0x0028, 0x0010); + static const DicomDataset::Tag DICOM_TAG_SLICE_THICKNESS(0x0018, 0x0050); + static const DicomDataset::Tag DICOM_TAG_WINDOW_CENTER(0x0028, 0x1050); + static const DicomDataset::Tag DICOM_TAG_WINDOW_WIDTH(0x0028, 0x1051); + static const DicomDataset::Tag DICOM_TAG_PHOTOMETRIC_INTERPRETATION(0x0028, 0x0004); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/AutoGeneratedCode.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/AutoGeneratedCode.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +set(EMBED_RESOURCES_PYTHON "${CMAKE_CURRENT_LIST_DIR}/../EmbedResources.py" + CACHE INTERNAL "Path to the EmbedResources.py script from Orthanc") +set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED") +set(AUTOGENERATED_SOURCES) + +file(MAKE_DIRECTORY ${AUTOGENERATED_DIR}) +include_directories(${AUTOGENERATED_DIR}) + +macro(EmbedResources) + # Convert a semicolon separated list to a whitespace separated string + set(SCRIPT_OPTIONS) + set(SCRIPT_ARGUMENTS) + set(DEPENDENCIES) + set(IS_PATH_NAME false) + + set(TARGET_BASE "${AUTOGENERATED_DIR}/EmbeddedResources") + + # Loop over the arguments of the function + foreach(arg ${ARGN}) + # Extract the first character of the argument + string(SUBSTRING "${arg}" 0 1 FIRST_CHAR) + if (${FIRST_CHAR} STREQUAL "-") + # If the argument starts with a dash "-", this is an option to + # EmbedResources.py + if (${arg} MATCHES "--target=.*") + # Does the argument starts with "--target="? + string(SUBSTRING "${arg}" 9 -1 TARGET) # 9 is the length of "--target=" + set(TARGET_BASE "${AUTOGENERATED_DIR}/${TARGET}") + else() + list(APPEND SCRIPT_OPTIONS ${arg}) + endif() + else() + if (${IS_PATH_NAME}) + list(APPEND SCRIPT_ARGUMENTS "${arg}") + list(APPEND DEPENDENCIES "${arg}") + set(IS_PATH_NAME false) + else() + list(APPEND SCRIPT_ARGUMENTS "${arg}") + set(IS_PATH_NAME true) + endif() + endif() + endforeach() + + add_custom_command( + OUTPUT + "${TARGET_BASE}.h" + "${TARGET_BASE}.cpp" + COMMAND ${PYTHON_EXECUTABLE} ${EMBED_RESOURCES_PYTHON} + ${SCRIPT_OPTIONS} "${TARGET_BASE}" ${SCRIPT_ARGUMENTS} + DEPENDS + ${EMBED_RESOURCES_PYTHON} + ${DEPENDENCIES} + ) + + list(APPEND AUTOGENERATED_SOURCES + "${TARGET_BASE}.cpp" + ) +endmacro() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/Compiler.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/Compiler.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,243 @@ +# This file sets all the compiler-related flags + + +# Save the current compiler flags to the cache every time cmake configures the project +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "compiler flags" FORCE) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "compiler flags" FORCE) + + +include(CheckLibraryExists) + +if ((CMAKE_CROSSCOMPILING AND NOT + "${CMAKE_SYSTEM_VERSION}" STREQUAL "CrossToolNg") OR + "${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") + # Cross-compilation necessarily implies standalone and static build + SET(STATIC_BUILD ON) + SET(STANDALONE_BUILD ON) +endif() + + +if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") + # Cache the environment variables "LSB_CC" and "LSB_CXX" for further + # use by "ExternalProject" in CMake + SET(CMAKE_LSB_CC $ENV{LSB_CC} CACHE STRING "") + SET(CMAKE_LSB_CXX $ENV{LSB_CXX} CACHE STRING "") +endif() + + +if (CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-long-long") + + # --std=c99 makes libcurl not to compile + # -pedantic gives a lot of warnings on OpenSSL + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -Wno-variadic-macros") + + if (CMAKE_CROSSCOMPILING) + # http://stackoverflow.com/a/3543845/881731 + set(CMAKE_RC_COMPILE_OBJECT " -O coff -I ") + endif() + +elseif (MSVC) + # Use static runtime under Visual Studio + # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace + # http://stackoverflow.com/a/6510446 + foreach(flag_var + CMAKE_C_FLAGS_DEBUG + CMAKE_CXX_FLAGS_DEBUG + CMAKE_C_FLAGS_RELEASE + CMAKE_CXX_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_RELWITHDEBINFO) + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") + endforeach(flag_var) + + # Add /Zm256 compiler option to Visual Studio to fix PCH errors + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm256") + + # New in Orthanc 1.5.5 + if (MSVC_MULTIPLE_PROCESSES) + # "If you omit the processMax argument in the /MP option, the + # compiler obtains the number of effective processors from the + # operating system, and then creates one process per effective + # processor" + # https://blog.kitware.com/cmake-building-with-all-your-cores/ + # https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + endif() + + add_definitions( + -D_CRT_SECURE_NO_WARNINGS=1 + -D_CRT_SECURE_NO_DEPRECATE=1 + ) + + if (MSVC_VERSION LESS 1600) + # Starting with Visual Studio >= 2010 (i.e. macro _MSC_VER >= + # 1600), Microsoft ships a standard-compliant + # header. For earlier versions of Visual Studio, give access to a + # compatibility header. + # http://stackoverflow.com/a/70630/881731 + # https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#External_links + include_directories(${CMAKE_CURRENT_LIST_DIR}/../../Resources/ThirdParty/VisualStudio) + endif() + + link_libraries(netapi32) +endif() + + +if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + # In FreeBSD/OpenBSD, the "/usr/local/" folder contains the ports and need to be imported + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib") +endif() + + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR + ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" AND + NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") + # The "--no-undefined" linker flag makes the shared libraries + # (plugins ModalityWorklists and ServeFolders) fail to compile on + # OpenBSD, and make the PostgreSQL plugin complain about missing + # "environ" global variable in FreeBSD + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") + endif() + + # Remove the "-rdynamic" option + # http://www.mail-archive.com/cmake@cmake.org/msg08837.html + set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") + link_libraries(pthread) + + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + link_libraries(rt) + endif() + + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND + NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + link_libraries(dl) + endif() + + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND + NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + # The "--as-needed" linker flag is not available on FreeBSD and OpenBSD + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--as-needed") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed") + endif() + + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND + NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + # FreeBSD/OpenBSD have just one single interface for file + # handling, which is 64bit clean, so there is no need to define macro + # for LFS (Large File Support). + # https://ohse.de/uwe/articles/lfs.html + add_definitions( + -D_LARGEFILE64_SOURCE=1 + -D_FILE_OFFSET_BITS=64 + ) + endif() + +elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + if (MSVC) + message("MSVC compiler version = " ${MSVC_VERSION} "\n") + # Starting Visual Studio 2013 (version 1800), it is not possible + # to target Windows XP anymore + if (MSVC_VERSION LESS 1800) + add_definitions( + -DWINVER=0x0501 + -D_WIN32_WINNT=0x0501 + ) + endif() + else() + add_definitions( + -DWINVER=0x0501 + -D_WIN32_WINNT=0x0501 + ) + endif() + + add_definitions( + -D_CRT_SECURE_NO_WARNINGS=1 + ) + link_libraries(rpcrt4 ws2_32) + + if (CMAKE_COMPILER_IS_GNUCXX) + # Some additional C/C++ compiler flags for MinGW + SET(MINGW_NO_WARNINGS "-Wno-unused-function -Wno-unused-variable") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MINGW_NO_WARNINGS} -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MINGW_NO_WARNINGS}") + + if (DYNAMIC_MINGW_STDLIB) + else() + # This is a patch for MinGW64 + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++") + endif() + + CHECK_LIBRARY_EXISTS(winpthread pthread_create "" HAVE_WIN_PTHREAD) + if (HAVE_WIN_PTHREAD) + if (DYNAMIC_MINGW_STDLIB) + else() + # This line is necessary to compile with recent versions of MinGW, + # otherwise "libwinpthread-1.dll" is not statically linked. + SET(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic") + endif() + add_definitions(-DHAVE_WIN_PTHREAD=1) + else() + add_definitions(-DHAVE_WIN_PTHREAD=0) + endif() + endif() + +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + add_definitions( + -D_XOPEN_SOURCE=1 + ) + link_libraries(iconv) + +elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + message("Building using Emscripten (for WebAssembly or asm.js targets)") + include(${CMAKE_CURRENT_LIST_DIR}/EmscriptenParameters.cmake) + +elseif (CMAKE_SYSTEM_NAME STREQUAL "Android") + +else() + message("Unknown target platform: ${CMAKE_SYSTEM_NAME}") + message(FATAL_ERROR "Support your platform here") +endif() + + +if (DEFINED ENABLE_PROFILING AND ENABLE_PROFILING) + if (CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pg") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") + else() + message(FATAL_ERROR "Don't know how to enable profiling on your configuration") + endif() +endif() + + +if (CMAKE_COMPILER_IS_GNUCXX) + # "When creating a static library using binutils (ar) and there + # exist a duplicate object name (e.g. a/Foo.cpp.o, b/Foo.cpp.o), the + # resulting static library can end up having only one of the + # duplicate objects. [...] This bug only happens if there are many + # objects." The trick consists in replacing the "r" argument + # ("replace") provided to "ar" (as used in CMake < 3.1) by the "q" + # argument ("quick append"). This is because of the fact that CMake + # will invoke "ar" several times with several batches of ".o" + # objects, and using "r" would overwrite symbols defined in + # preceding batches. https://cmake.org/Bug/view.php?id=14874 + set(CMAKE_CXX_ARCHIVE_APPEND " q ") +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,535 @@ +# Orthanc - A Lightweight, RESTful DICOM Store +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., 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. +# +# In addition, as a special exception, the copyright holders of this +# program give permission to link the code of its release with the +# OpenSSL project's "OpenSSL" library (or with modified versions of it +# that use the same license as the "OpenSSL" library), and distribute +# the linked executables. You must obey the GNU General Public License +# in all respects for all of the code used other than "OpenSSL". If you +# modify file(s) with this exception, you may extend this exception to +# your version of the file(s), but you are not obligated to do so. If +# you do not wish to do so, delete this exception statement from your +# version. If you delete this exception statement from all source files +# in the program, then also delete it here. +# +# 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 . + + + +## +## Check whether the parent script sets the mandatory variables +## + +if (NOT DEFINED ORTHANC_FRAMEWORK_SOURCE OR + (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system" AND + NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg" AND + NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "web" AND + NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" AND + NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "path")) + message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_SOURCE must be set to \"system\", \"hg\", \"web\", \"archive\" or \"path\"") +endif() + + +## +## Detection of the requested version +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg" OR + ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR + ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") + if (NOT DEFINED ORTHANC_FRAMEWORK_VERSION) + message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_VERSION must be set") + endif() + + if (DEFINED ORTHANC_FRAMEWORK_MAJOR OR + DEFINED ORTHANC_FRAMEWORK_MINOR OR + DEFINED ORTHANC_FRAMEWORK_REVISION OR + DEFINED ORTHANC_FRAMEWORK_MD5) + message(FATAL_ERROR "Some internal variable has been set") + endif() + + set(ORTHANC_FRAMEWORK_MD5 "") + + if (NOT DEFINED ORTHANC_FRAMEWORK_BRANCH) + if (ORTHANC_FRAMEWORK_VERSION STREQUAL "mainline") + set(ORTHANC_FRAMEWORK_BRANCH "default") + set(ORTHANC_FRAMEWORK_MAJOR 999) + set(ORTHANC_FRAMEWORK_MINOR 999) + set(ORTHANC_FRAMEWORK_REVISION 999) + + else() + set(ORTHANC_FRAMEWORK_BRANCH "Orthanc-${ORTHANC_FRAMEWORK_VERSION}") + + set(RE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$") + string(REGEX REPLACE ${RE} "\\1" ORTHANC_FRAMEWORK_MAJOR ${ORTHANC_FRAMEWORK_VERSION}) + string(REGEX REPLACE ${RE} "\\2" ORTHANC_FRAMEWORK_MINOR ${ORTHANC_FRAMEWORK_VERSION}) + string(REGEX REPLACE ${RE} "\\3" ORTHANC_FRAMEWORK_REVISION ${ORTHANC_FRAMEWORK_VERSION}) + + if (NOT ORTHANC_FRAMEWORK_MAJOR MATCHES "^[0-9]+$" OR + NOT ORTHANC_FRAMEWORK_MINOR MATCHES "^[0-9]+$" OR + NOT ORTHANC_FRAMEWORK_REVISION MATCHES "^[0-9]+$") + message("Bad version of the Orthanc framework: ${ORTHANC_FRAMEWORK_VERSION}") + endif() + + if (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.3.1") + set(ORTHANC_FRAMEWORK_MD5 "dac95bd6cf86fb19deaf4e612961f378") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.3.2") + set(ORTHANC_FRAMEWORK_MD5 "d0ccdf68e855d8224331f13774992750") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.0") + set(ORTHANC_FRAMEWORK_MD5 "81e15f34d97ac32bbd7d26e85698835a") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.1") + set(ORTHANC_FRAMEWORK_MD5 "9b6f6114264b17ed421b574cd6476127") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.2") + set(ORTHANC_FRAMEWORK_MD5 "d1ee84927dcf668e60eb5868d24b9394") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.0") + set(ORTHANC_FRAMEWORK_MD5 "4429d8d9dea4ff6648df80ec3c64d79e") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.1") + set(ORTHANC_FRAMEWORK_MD5 "099671538865e5da96208b37494d6718") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.2") + set(ORTHANC_FRAMEWORK_MD5 "8867050f3e9a1ce6157c1ea7a9433b1b") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.3") + set(ORTHANC_FRAMEWORK_MD5 "bf2f5ed1adb8b0fc5f10d278e68e1dfe") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.4") + set(ORTHANC_FRAMEWORK_MD5 "404baef5d4c43e7c5d9410edda8ef5a5") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.5") + set(ORTHANC_FRAMEWORK_MD5 "cfc437e0687ae4bd725fd93dc1f08bc4") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.6") + set(ORTHANC_FRAMEWORK_MD5 "3c29de1e289b5472342947168f0105c0") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.7") + set(ORTHANC_FRAMEWORK_MD5 "e1b76f01116d9b5d4ac8cc39980560e3") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.8") + set(ORTHANC_FRAMEWORK_MD5 "82323e8c49a667f658a3639ea4dbc336") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.6.0") + set(ORTHANC_FRAMEWORK_MD5 "eab428d6e53f61e847fa360bb17ebe25") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.6.1") + set(ORTHANC_FRAMEWORK_MD5 "3971f5de96ba71dc9d3f3690afeaa7c0") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.7.0") + set(ORTHANC_FRAMEWORK_MD5 "ce5f689e852b01d3672bd3d2f952a5ef") + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.7.1") + set(ORTHANC_FRAMEWORK_MD5 "3c171217f930abe80246997bdbcaf7cc") + + # Below this point are development snapshots that were used to + # release some plugin, before an official release of the Orthanc + # framework was available. Here is the command to be used to + # generate a proper archive: + # + # $ hg archive /tmp/Orthanc-`hg id -i | sed 's/\+//'`.tar.gz + # + elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "ae0e3fd609df") + # DICOMweb 1.1 (framework pre-1.6.0) + set(ORTHANC_FRAMEWORK_MD5 "7e09e9b530a2f527854f0b782d7e0645") + endif() + endif() + endif() + +elseif (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + message("Using the Orthanc framework from a path of the filesystem. Assuming mainline version.") + set(ORTHANC_FRAMEWORK_MAJOR 999) + set(ORTHANC_FRAMEWORK_MINOR 999) + set(ORTHANC_FRAMEWORK_REVISION 999) +endif() + + + +## +## Detection of the third-party software +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg") + find_program(ORTHANC_FRAMEWORK_HG hg) + + if (${ORTHANC_FRAMEWORK_HG} MATCHES "ORTHANC_FRAMEWORK_HG-NOTFOUND") + message(FATAL_ERROR "Please install Mercurial") + endif() +endif() + + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR + ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + find_program(ORTHANC_FRAMEWORK_7ZIP 7z + PATHS + "$ENV{ProgramFiles}/7-Zip" + "$ENV{ProgramW6432}/7-Zip" + ) + + if (${ORTHANC_FRAMEWORK_7ZIP} MATCHES "ORTHANC_FRAMEWORK_7ZIP-NOTFOUND") + message(FATAL_ERROR "Please install the '7-zip' software (http://www.7-zip.org/)") + endif() + + else() + find_program(ORTHANC_FRAMEWORK_TAR tar) + if (${ORTHANC_FRAMEWORK_TAR} MATCHES "ORTHANC_FRAMEWORK_TAR-NOTFOUND") + message(FATAL_ERROR "Please install the 'tar' package") + endif() + endif() +endif() + + + +## +## Case of the Orthanc framework specified as a path on the filesystem +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "path") + if (NOT DEFINED ORTHANC_FRAMEWORK_ROOT) + message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_ROOT must provide the path to the sources of Orthanc") + endif() + + if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}) + message(FATAL_ERROR "Non-existing directory: ${ORTHANC_FRAMEWORK_ROOT}") + endif() + + if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) + message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_FRAMEWORK_ROOT}") + endif() +endif() + + + +## +## Case of the Orthanc framework cloned using Mercurial +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg") + if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) + message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") + endif() + + set(ORTHANC_ROOT ${CMAKE_BINARY_DIR}/orthanc) + + if (EXISTS ${ORTHANC_ROOT}) + message("Updating the Orthanc source repository using Mercurial") + execute_process( + COMMAND ${ORTHANC_FRAMEWORK_HG} pull + WORKING_DIRECTORY ${ORTHANC_ROOT} + RESULT_VARIABLE Failure + ) + else() + message("Forking the Orthanc source repository using Mercurial") + execute_process( + COMMAND ${ORTHANC_FRAMEWORK_HG} clone "https://hg.orthanc-server.com/orthanc/" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + endif() + + if (Failure OR NOT EXISTS ${ORTHANC_ROOT}) + message(FATAL_ERROR "Cannot fork the Orthanc repository") + endif() + + message("Setting branch of the Orthanc repository to: ${ORTHANC_FRAMEWORK_BRANCH}") + + execute_process( + COMMAND ${ORTHANC_FRAMEWORK_HG} update -c ${ORTHANC_FRAMEWORK_BRANCH} + WORKING_DIRECTORY ${ORTHANC_ROOT} + RESULT_VARIABLE Failure + ) + + if (Failure) + message(FATAL_ERROR "Error while running Mercurial") + endif() + + unset(ORTHANC_FRAMEWORK_ROOT CACHE) + set(ORTHANC_FRAMEWORK_ROOT "${ORTHANC_ROOT}/OrthancFramework" CACHE + STRING "Path to the Orthanc framework source directory") + + if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) + message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_ROOT}") + endif() + + unset(ORTHANC_ROOT) +endif() + + + +## +## Case of the Orthanc framework provided as a source archive on the +## filesystem +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive") + if (NOT DEFINED ORTHANC_FRAMEWORK_ARCHIVE) + message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_ARCHIVE must provide the path to the sources of Orthanc") + endif() +endif() + + + +## +## Case of the Orthanc framework downloaded from the Web +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") + if (DEFINED ORTHANC_FRAMEWORK_URL) + string(REGEX REPLACE "^.*/" "" ORTHANC_FRAMEMORK_FILENAME "${ORTHANC_FRAMEWORK_URL}") + else() + # Default case: Download from the official Web site + set(ORTHANC_FRAMEMORK_FILENAME Orthanc-${ORTHANC_FRAMEWORK_VERSION}.tar.gz) + set(ORTHANC_FRAMEWORK_URL "http://orthanc.osimis.io/ThirdPartyDownloads/orthanc-framework/${ORTHANC_FRAMEMORK_FILENAME}") + endif() + + set(ORTHANC_FRAMEWORK_ARCHIVE "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${ORTHANC_FRAMEMORK_FILENAME}") + + if (NOT EXISTS "${ORTHANC_FRAMEWORK_ARCHIVE}") + if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) + message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") + endif() + + message("Downloading: ${ORTHANC_FRAMEWORK_URL}") + + file(DOWNLOAD + "${ORTHANC_FRAMEWORK_URL}" "${ORTHANC_FRAMEWORK_ARCHIVE}" + SHOW_PROGRESS EXPECTED_MD5 "${ORTHANC_FRAMEWORK_MD5}" + TIMEOUT 60 + INACTIVITY_TIMEOUT 60 + ) + else() + message("Using local copy of: ${ORTHANC_FRAMEWORK_URL}") + endif() +endif() + + + + +## +## Uncompressing the Orthanc framework, if it was retrieved from a +## source archive on the filesystem, or from the official Web site +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR + ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") + + if (NOT DEFINED ORTHANC_FRAMEWORK_ARCHIVE OR + NOT DEFINED ORTHANC_FRAMEWORK_VERSION OR + NOT DEFINED ORTHANC_FRAMEWORK_MD5) + message(FATAL_ERROR "Internal error") + endif() + + if (ORTHANC_FRAMEWORK_MD5 STREQUAL "") + message(FATAL_ERROR "Unknown release of Orthanc: ${ORTHANC_FRAMEWORK_VERSION}") + endif() + + file(MD5 ${ORTHANC_FRAMEWORK_ARCHIVE} ActualMD5) + + if (NOT "${ActualMD5}" STREQUAL "${ORTHANC_FRAMEWORK_MD5}") + message(FATAL_ERROR "The MD5 hash of the Orthanc archive is invalid: ${ORTHANC_FRAMEWORK_ARCHIVE}") + endif() + + set(ORTHANC_ROOT "${CMAKE_BINARY_DIR}/Orthanc-${ORTHANC_FRAMEWORK_VERSION}") + + if (NOT IS_DIRECTORY "${ORTHANC_ROOT}") + if (NOT ORTHANC_FRAMEWORK_ARCHIVE MATCHES ".tar.gz$") + message(FATAL_ERROR "Archive should have the \".tar.gz\" extension: ${ORTHANC_FRAMEWORK_ARCHIVE}") + endif() + + message("Uncompressing: ${ORTHANC_FRAMEWORK_ARCHIVE}") + + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # How to silently extract files using 7-zip + # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly + + execute_process( + COMMAND ${ORTHANC_FRAMEWORK_7ZIP} e -y ${ORTHANC_FRAMEWORK_ARCHIVE} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + get_filename_component(TMP_FILENAME "${ORTHANC_FRAMEWORK_ARCHIVE}" NAME) + string(REGEX REPLACE ".gz$" "" TMP_FILENAME2 "${TMP_FILENAME}") + + execute_process( + COMMAND ${ORTHANC_FRAMEWORK_7ZIP} x -y ${TMP_FILENAME2} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + + else() + execute_process( + COMMAND sh -c "${ORTHANC_FRAMEWORK_TAR} xfz ${ORTHANC_FRAMEWORK_ARCHIVE}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + endif() + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + if (NOT IS_DIRECTORY "${ORTHANC_ROOT}") + message(FATAL_ERROR "The Orthanc framework was not uncompressed at the proper location. Check the CMake instructions.") + endif() + endif() + + unset(ORTHANC_FRAMEWORK_ROOT CACHE) + set(ORTHANC_FRAMEWORK_ROOT "${ORTHANC_ROOT}/OrthancFramework" CACHE + STRING "Path to the Orthanc framework source directory") + + if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) + message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_ROOT}") + endif() + + unset(ORTHANC_ROOT) +endif() + + + +## +## Case of the Orthanc framework installed as a shared library in a +## GNU/Linux distribution (typically Debian). New in Orthanc 1.7.2. +## + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + set(ORTHANC_FRAMEWORK_LIBDIR "" CACHE PATH "") + + if (CMAKE_SYSTEM_NAME STREQUAL "Windows" AND + CMAKE_COMPILER_IS_GNUCXX) # MinGW + set(DYNAMIC_MINGW_STDLIB ON) # Disable static linking against libc (to throw exceptions) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libstdc++") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++") + endif() + + include(CheckIncludeFile) + include(CheckIncludeFileCXX) + include(FindPythonInterp) + include(${CMAKE_CURRENT_LIST_DIR}/Compiler.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/DownloadPackage.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/AutoGeneratedCode.cmake) + set(EMBED_RESOURCES_PYTHON ${CMAKE_CURRENT_LIST_DIR}/EmbedResources.py) + + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR + ORTHANC_FRAMEWORK_STATIC) + include_directories(${ORTHANC_FRAMEWORK_ROOT}/..) + else() + # Look for mandatory dependency JsonCpp (cf. JsonCppConfiguration.cmake) + find_path(JSONCPP_INCLUDE_DIR json/reader.h + /usr/include/jsoncpp + /usr/local/include/jsoncpp + ) + + message("JsonCpp include dir: ${JSONCPP_INCLUDE_DIR}") + include_directories(${JSONCPP_INCLUDE_DIR}) + link_libraries(jsoncpp) + + CHECK_INCLUDE_FILE_CXX(${JSONCPP_INCLUDE_DIR}/json/reader.h HAVE_JSONCPP_H) + if (NOT HAVE_JSONCPP_H) + message(FATAL_ERROR "Please install the libjsoncpp-dev package") + endif() + + # Look for mandatory dependency Boost (cf. BoostConfiguration.cmake) + include(FindBoost) + find_package(Boost COMPONENTS filesystem thread system date_time regex ${ORTHANC_BOOST_COMPONENTS}) + + if (NOT Boost_FOUND) + message(FATAL_ERROR "Unable to locate Boost on this system") + endif() + + include_directories(${Boost_INCLUDE_DIRS}) + link_libraries(${Boost_LIBRARIES}) + + # Optional component - Lua + if (ENABLE_LUA) + include(FindLua) + + if (NOT LUA_FOUND) + message(FATAL_ERROR "Please install the liblua-dev package") + endif() + + include_directories(${LUA_INCLUDE_DIR}) + link_libraries(${LUA_LIBRARIES}) + endif() + + # Optional component - SQLite + if (ENABLE_SQLITE) + CHECK_INCLUDE_FILE(sqlite3.h HAVE_SQLITE_H) + if (NOT HAVE_SQLITE_H) + message(FATAL_ERROR "Please install the libsqlite3-dev package") + endif() + link_libraries(sqlite3) + endif() + + # Optional component - Pugixml + if (ENABLE_PUGIXML) + CHECK_INCLUDE_FILE_CXX(pugixml.hpp HAVE_PUGIXML_H) + if (NOT HAVE_PUGIXML_H) + message(FATAL_ERROR "Please install the libpugixml-dev package") + endif() + link_libraries(pugixml) + endif() + + # Optional component - DCMTK + if (ENABLE_DCMTK) + include(FindDCMTK) + include_directories(${DCMTK_INCLUDE_DIRS}) + link_libraries(${DCMTK_LIBRARIES}) + endif() + endif() + + # Look for Orthanc framework shared library + include(CheckCXXSymbolExists) + + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + set(ORTHANC_FRAMEWORK_INCLUDE_DIR ${ORTHANC_FRAMEWORK_ROOT}) + else() + find_path(ORTHANC_FRAMEWORK_INCLUDE_DIR OrthancFramework.h + /usr/include/orthanc-framework + /usr/local/include/orthanc-framework + ${ORTHANC_FRAMEWORK_ROOT} + ) + endif() + + if (${ORTHANC_FRAMEWORK_INCLUDE_DIR} STREQUAL "ORTHANC_FRAMEWORK_INCLUDE_DIR-NOTFOUND") + message(FATAL_ERROR "Cannot locate the OrthancFramework.h header") + endif() + + message("Orthanc framework include dir: ${ORTHANC_FRAMEWORK_INCLUDE_DIR}") + include_directories(${ORTHANC_FRAMEWORK_INCLUDE_DIR}) + + if ("${ORTHANC_FRAMEWORK_LIBDIR}" STREQUAL "") + set(ORTHANC_FRAMEWORK_LIBRARIES OrthancFramework) + else() + if (MSVC) + set(Suffix ".lib") + set(Prefix "") + else() + list(GET CMAKE_FIND_LIBRARY_PREFIXES 0 Prefix) + list(GET CMAKE_FIND_LIBRARY_SUFFIXES 0 Suffix) + endif() + set(ORTHANC_FRAMEWORK_LIBRARIES ${ORTHANC_FRAMEWORK_LIBDIR}/${Prefix}OrthancFramework${Suffix}) + endif() + + set(CMAKE_REQUIRED_INCLUDES "${ORTHANC_FRAMEWORK_INCLUDE_DIR}") + set(CMAKE_REQUIRED_LIBRARIES "${ORTHANC_FRAMEWORK_LIBRARIES}") + + check_cxx_symbol_exists("Orthanc::InitializeFramework" "OrthancFramework.h" HAVE_ORTHANC_FRAMEWORK) + if (NOT HAVE_ORTHANC_FRAMEWORK) + message(FATAL_ERROR "Cannot find the Orthanc framework") + endif() + + unset(CMAKE_REQUIRED_INCLUDES) + unset(CMAKE_REQUIRED_LIBRARIES) + + if (NOT "${ORTHANC_FRAMEWORK_ROOT}" STREQUAL "") + include_directories(${ORTHANC_FRAMEWORK_ROOT}) + endif() +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/DownloadPackage.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/DownloadPackage.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,258 @@ +macro(GetUrlFilename TargetVariable Url) + string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${Url}") +endmacro() + + +macro(GetUrlExtension TargetVariable Url) + #string(REGEX REPLACE "^.*/[^.]*\\." "" TMP "${Url}") + string(REGEX REPLACE "^.*\\." "" TMP "${Url}") + string(TOLOWER "${TMP}" "${TargetVariable}") +endmacro() + + + +## +## Setup the patch command-line tool +## + +if (NOT ORTHANC_DISABLE_PATCH) + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + set(PATCH_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/../ThirdParty/patch/patch.exe) + if (NOT EXISTS ${PATCH_EXECUTABLE}) + message(FATAL_ERROR "Unable to find the patch.exe tool that is shipped with Orthanc") + endif() + + else () + find_program(PATCH_EXECUTABLE patch) + if (${PATCH_EXECUTABLE} MATCHES "PATCH_EXECUTABLE-NOTFOUND") + message(FATAL_ERROR "Please install the 'patch' standard command-line tool") + endif() + endif() +endif() + + + +## +## Check the existence of the required decompression tools +## + +if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + find_program(ZIP_EXECUTABLE 7z + PATHS + "$ENV{ProgramFiles}/7-Zip" + "$ENV{ProgramW6432}/7-Zip" + ) + + if (${ZIP_EXECUTABLE} MATCHES "ZIP_EXECUTABLE-NOTFOUND") + message(FATAL_ERROR "Please install the '7-zip' software (http://www.7-zip.org/)") + endif() + +else() + find_program(UNZIP_EXECUTABLE unzip) + if (${UNZIP_EXECUTABLE} MATCHES "UNZIP_EXECUTABLE-NOTFOUND") + message(FATAL_ERROR "Please install the 'unzip' package") + endif() + + find_program(TAR_EXECUTABLE tar) + if (${TAR_EXECUTABLE} MATCHES "TAR_EXECUTABLE-NOTFOUND") + message(FATAL_ERROR "Please install the 'tar' package") + endif() + + find_program(GUNZIP_EXECUTABLE gunzip) + if (${GUNZIP_EXECUTABLE} MATCHES "GUNZIP_EXECUTABLE-NOTFOUND") + message(FATAL_ERROR "Please install the 'gzip' package") + endif() +endif() + + +macro(DownloadFile MD5 Url) + GetUrlFilename(TMP_FILENAME "${Url}") + + set(TMP_PATH "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${TMP_FILENAME}") + if (NOT EXISTS "${TMP_PATH}") + message("Downloading ${Url}") + + # This fixes issue 6: "I think cmake shouldn't download the + # packages which are not in the system, it should stop and let + # user know." + # https://code.google.com/p/orthanc/issues/detail?id=6 + if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) + message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") + endif() + + if ("${MD5}" STREQUAL "no-check") + message(WARNING "Not checking the MD5 of: ${Url}") + file(DOWNLOAD "${Url}" "${TMP_PATH}" + SHOW_PROGRESS TIMEOUT 300 INACTIVITY_TIMEOUT 60 + STATUS Failure) + else() + file(DOWNLOAD "${Url}" "${TMP_PATH}" + SHOW_PROGRESS TIMEOUT 300 INACTIVITY_TIMEOUT 60 + EXPECTED_MD5 "${MD5}" STATUS Failure) + endif() + + list(GET Failure 0 Status) + if (NOT Status EQUAL 0) + message(FATAL_ERROR "Cannot download file: ${Url}") + endif() + + else() + message("Using local copy of ${Url}") + + if ("${MD5}" STREQUAL "no-check") + message(WARNING "Not checking the MD5 of: ${Url}") + else() + file(MD5 ${TMP_PATH} ActualMD5) + if (NOT "${ActualMD5}" STREQUAL "${MD5}") + message(FATAL_ERROR "The MD5 hash of a previously download file is invalid: ${TMP_PATH}") + endif() + endif() + endif() +endmacro() + + +macro(DownloadPackage MD5 Url TargetDirectory) + if (NOT IS_DIRECTORY "${TargetDirectory}") + DownloadFile("${MD5}" "${Url}") + + GetUrlExtension(TMP_EXTENSION "${Url}") + #message(${TMP_EXTENSION}) + message("Uncompressing ${TMP_FILENAME}") + + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # How to silently extract files using 7-zip + # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly + + if (("${TMP_EXTENSION}" STREQUAL "gz") OR + ("${TMP_EXTENSION}" STREQUAL "tgz") OR + ("${TMP_EXTENSION}" STREQUAL "xz")) + execute_process( + COMMAND ${ZIP_EXECUTABLE} e -y ${TMP_PATH} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + if ("${TMP_EXTENSION}" STREQUAL "tgz") + string(REGEX REPLACE ".tgz$" ".tar" TMP_FILENAME2 "${TMP_FILENAME}") + elseif ("${TMP_EXTENSION}" STREQUAL "gz") + string(REGEX REPLACE ".gz$" "" TMP_FILENAME2 "${TMP_FILENAME}") + elseif ("${TMP_EXTENSION}" STREQUAL "xz") + string(REGEX REPLACE ".xz" "" TMP_FILENAME2 "${TMP_FILENAME}") + endif() + + execute_process( + COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_FILENAME2} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + elseif ("${TMP_EXTENSION}" STREQUAL "zip") + execute_process( + COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_PATH} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + else() + message(FATAL_ERROR "Unsupported package extension: ${TMP_EXTENSION}") + endif() + + else() + if ("${TMP_EXTENSION}" STREQUAL "zip") + execute_process( + COMMAND sh -c "${UNZIP_EXECUTABLE} -q ${TMP_PATH}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + elseif (("${TMP_EXTENSION}" STREQUAL "gz") OR ("${TMP_EXTENSION}" STREQUAL "tgz")) + #message("tar xvfz ${TMP_PATH}") + execute_process( + COMMAND sh -c "${TAR_EXECUTABLE} xfz ${TMP_PATH}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + elseif ("${TMP_EXTENSION}" STREQUAL "bz2") + execute_process( + COMMAND sh -c "${TAR_EXECUTABLE} xfj ${TMP_PATH}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + elseif ("${TMP_EXTENSION}" STREQUAL "xz") + execute_process( + COMMAND sh -c "${TAR_EXECUTABLE} xf ${TMP_PATH}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + ) + else() + message(FATAL_ERROR "Unsupported package extension: ${TMP_EXTENSION}") + endif() + endif() + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + if (NOT IS_DIRECTORY "${TargetDirectory}") + message(FATAL_ERROR "The package was not uncompressed at the proper location. Check the CMake instructions.") + endif() + endif() +endmacro() + + + +macro(DownloadCompressedFile MD5 Url TargetFile) + if (NOT EXISTS "${TargetFile}") + DownloadFile("${MD5}" "${Url}") + + GetUrlExtension(TMP_EXTENSION "${Url}") + #message(${TMP_EXTENSION}) + message("Uncompressing ${TMP_FILENAME}") + + if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # How to silently extract files using 7-zip + # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly + + if ("${TMP_EXTENSION}" STREQUAL "gz") + execute_process( + # "-so" writes uncompressed file to stdout + COMMAND ${ZIP_EXECUTABLE} e -so -y ${TMP_PATH} + OUTPUT_FILE "${TargetFile}" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE Failure + OUTPUT_QUIET + ) + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + else() + message(FATAL_ERROR "Unsupported file extension: ${TMP_EXTENSION}") + endif() + + else() + if ("${TMP_EXTENSION}" STREQUAL "gz") + execute_process( + COMMAND sh -c "${GUNZIP_EXECUTABLE} -c ${TMP_PATH}" + OUTPUT_FILE "${TargetFile}" + RESULT_VARIABLE Failure + ) + else() + message(FATAL_ERROR "Unsupported file extension: ${TMP_EXTENSION}") + endif() + endif() + + if (Failure) + message(FATAL_ERROR "Error while running the uncompression tool") + endif() + + if (NOT EXISTS "${TargetFile}") + message(FATAL_ERROR "The file was not uncompressed at the proper location. Check the CMake instructions.") + endif() + endif() +endmacro() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/EmbedResources.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/EmbedResources.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,455 @@ +#!/usr/bin/python + +# Orthanc - A Lightweight, RESTful DICOM Store +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., 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. +# +# In addition, as a special exception, the copyright holders of this +# program give permission to link the code of its release with the +# OpenSSL project's "OpenSSL" library (or with modified versions of it +# that use the same license as the "OpenSSL" library), and distribute +# the linked executables. You must obey the GNU General Public License +# in all respects for all of the code used other than "OpenSSL". If you +# modify file(s) with this exception, you may extend this exception to +# your version of the file(s), but you are not obligated to do so. If +# you do not wish to do so, delete this exception statement from your +# version. If you delete this exception statement from all source files +# in the program, then also delete it here. +# +# 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 . + + +import sys +import os +import os.path +import pprint +import re + +UPCASE_CHECK = True +USE_SYSTEM_EXCEPTION = False +EXCEPTION_CLASS = 'OrthancException' +OUT_OF_RANGE_EXCEPTION = '::Orthanc::OrthancException(::Orthanc::ErrorCode_ParameterOutOfRange)' +INEXISTENT_PATH_EXCEPTION = '::Orthanc::OrthancException(::Orthanc::ErrorCode_InexistentItem)' +NAMESPACE = 'Orthanc.EmbeddedResources' +FRAMEWORK_PATH = None + +ARGS = [] +for i in range(len(sys.argv)): + if not sys.argv[i].startswith('--'): + ARGS.append(sys.argv[i]) + elif sys.argv[i].lower() == '--no-upcase-check': + UPCASE_CHECK = False + elif sys.argv[i].lower() == '--system-exception': + USE_SYSTEM_EXCEPTION = True + EXCEPTION_CLASS = '::std::runtime_error' + OUT_OF_RANGE_EXCEPTION = '%s("Parameter out of range")' % EXCEPTION_CLASS + INEXISTENT_PATH_EXCEPTION = '%s("Unknown path in a directory resource")' % EXCEPTION_CLASS + elif sys.argv[i].startswith('--namespace='): + NAMESPACE = sys.argv[i][sys.argv[i].find('=') + 1 : ] + elif sys.argv[i].startswith('--framework-path='): + FRAMEWORK_PATH = sys.argv[i][sys.argv[i].find('=') + 1 : ] + +if len(ARGS) < 2 or len(ARGS) % 2 != 0: + print ('Usage:') + print ('python %s [--no-upcase-check] [--system-exception] [--namespace=] [ ]*' % sys.argv[0]) + exit(-1) + +TARGET_BASE_FILENAME = ARGS[1] +SOURCES = ARGS[2:] + +try: + # Make sure the destination directory exists + os.makedirs(os.path.normpath(os.path.join(TARGET_BASE_FILENAME, '..'))) +except: + pass + + +##################################################################### +## Read each resource file +##################################################################### + +def CheckNoUpcase(s): + global UPCASE_CHECK + if (UPCASE_CHECK and + re.search('[A-Z]', s) != None): + raise Exception("Path in a directory with an upcase letter: %s" % s) + +resources = {} + +counter = 0 +i = 0 +while i < len(SOURCES): + resourceName = SOURCES[i].upper() + pathName = SOURCES[i + 1] + + if not os.path.exists(pathName): + raise Exception("Non existing path: %s" % pathName) + + if resourceName in resources: + raise Exception("Twice the same resource: " + resourceName) + + if os.path.isdir(pathName): + # The resource is a directory: Recursively explore its files + content = {} + for root, dirs, files in os.walk(pathName): + dirs.sort() + files.sort() + base = os.path.relpath(root, pathName) + + # Fix issue #24 (Build fails on OSX when directory has .DS_Store files): + # Ignore folders whose name starts with a dot (".") + if base.find('/.') != -1: + print('Ignoring folder: %s' % root) + continue + + for f in files: + if f.find('~') == -1: # Ignore Emacs backup files + if base == '.': + r = f + else: + r = os.path.join(base, f) + + CheckNoUpcase(r) + r = '/' + r.replace('\\', '/') + if r in content: + raise Exception("Twice the same filename (check case): " + r) + + content[r] = { + 'Filename' : os.path.join(root, f), + 'Index' : counter + } + counter += 1 + + resources[resourceName] = { + 'Type' : 'Directory', + 'Files' : content + } + + elif os.path.isfile(pathName): + resources[resourceName] = { + 'Type' : 'File', + 'Index' : counter, + 'Filename' : pathName + } + counter += 1 + + else: + raise Exception("Not a regular file, nor a directory: " + pathName) + + i += 2 + +#pprint.pprint(resources) + + +##################################################################### +## Write .h header +##################################################################### + +header = open(TARGET_BASE_FILENAME + '.h', 'w') + +header.write(""" +#pragma once + +#include +#include + +#if defined(_MSC_VER) +# pragma warning(disable: 4065) // "Switch statement contains 'default' but no 'case' labels" +#endif + +""") + + +for ns in NAMESPACE.split('.'): + header.write('namespace %s {\n' % ns) + + +header.write(""" + enum FileResourceId + { +""") + +isFirst = True +for name in resources: + if resources[name]['Type'] == 'File': + if isFirst: + isFirst = False + else: + header.write(',\n') + header.write(' %s' % name) + +header.write(""" + }; + + enum DirectoryResourceId + { +""") + +isFirst = True +for name in resources: + if resources[name]['Type'] == 'Directory': + if isFirst: + isFirst = False + else: + header.write(',\n') + header.write(' %s' % name) + +header.write(""" + }; + + const void* GetFileResourceBuffer(FileResourceId id); + size_t GetFileResourceSize(FileResourceId id); + void GetFileResource(std::string& result, FileResourceId id); + + const void* GetDirectoryResourceBuffer(DirectoryResourceId id, const char* path); + size_t GetDirectoryResourceSize(DirectoryResourceId id, const char* path); + void GetDirectoryResource(std::string& result, DirectoryResourceId id, const char* path); + + void ListResources(std::list& result, DirectoryResourceId id); + +""") + + +for ns in NAMESPACE.split('.'): + header.write('}\n') + +header.close() + + + +##################################################################### +## Write the resource content in the .cpp source +##################################################################### + +PYTHON_MAJOR_VERSION = sys.version_info[0] + +def WriteResource(cpp, item): + cpp.write(' static const uint8_t resource%dBuffer[] = {' % item['Index']) + + f = open(item['Filename'], "rb") + content = f.read() + f.close() + + # http://stackoverflow.com/a/1035360 + pos = 0 + buffer = [] # instead of appending a few bytes at a time to the cpp file, + # we first append each chunk to a list, join it and write it + # to the file. We've measured that it was 2-3 times faster in python3. + # Note that speed is important since if generation is too slow, + # cmake might try to compile the EmbeddedResources.cpp file while it is + # still being generated ! + for b in content: + if PYTHON_MAJOR_VERSION == 2: + c = ord(b[0]) + else: + c = b + + if pos > 0: + buffer.append(",") + + if (pos % 16) == 0: + buffer.append("\n") + + if c < 0: + raise Exception("Internal error") + + buffer.append("0x%02x" % c) + pos += 1 + + cpp.write("".join(buffer)) + # Zero-size array are disallowed, so we put one single void character in it. + if pos == 0: + cpp.write(' 0') + + cpp.write(' };\n') + cpp.write(' static const size_t resource%dSize = %d;\n' % (item['Index'], pos)) + + +cpp = open(TARGET_BASE_FILENAME + '.cpp', 'w') + +cpp.write('#include "%s.h"\n' % os.path.basename(TARGET_BASE_FILENAME)) + +if USE_SYSTEM_EXCEPTION: + cpp.write('#include ') +elif FRAMEWORK_PATH != None: + cpp.write('#include "%s/OrthancException.h"' % FRAMEWORK_PATH) +else: + cpp.write('#include ') + +cpp.write(""" +#include +#include + +""") + +for ns in NAMESPACE.split('.'): + cpp.write('namespace %s {\n' % ns) + + +for name in resources: + if resources[name]['Type'] == 'File': + WriteResource(cpp, resources[name]) + else: + for f in resources[name]['Files']: + WriteResource(cpp, resources[name]['Files'][f]) + + + +##################################################################### +## Write the accessors to the file resources in .cpp +##################################################################### + +cpp.write(""" + const void* GetFileResourceBuffer(FileResourceId id) + { + switch (id) + { +""") +for name in resources: + if resources[name]['Type'] == 'File': + cpp.write(' case %s:\n' % name) + cpp.write(' return resource%dBuffer;\n' % resources[name]['Index']) + +cpp.write(""" + default: + throw %s; + } + } + + size_t GetFileResourceSize(FileResourceId id) + { + switch (id) + { +""" % OUT_OF_RANGE_EXCEPTION) + +for name in resources: + if resources[name]['Type'] == 'File': + cpp.write(' case %s:\n' % name) + cpp.write(' return resource%dSize;\n' % resources[name]['Index']) + +cpp.write(""" + default: + throw %s; + } + } +""" % OUT_OF_RANGE_EXCEPTION) + + + +##################################################################### +## Write the accessors to the directory resources in .cpp +##################################################################### + +cpp.write(""" + const void* GetDirectoryResourceBuffer(DirectoryResourceId id, const char* path) + { + switch (id) + { +""") + +for name in resources: + if resources[name]['Type'] == 'Directory': + cpp.write(' case %s:\n' % name) + isFirst = True + for path in resources[name]['Files']: + cpp.write(' if (!strcmp(path, "%s"))\n' % path) + cpp.write(' return resource%dBuffer;\n' % resources[name]['Files'][path]['Index']) + cpp.write(' throw %s;\n\n' % INEXISTENT_PATH_EXCEPTION) + +cpp.write(""" default: + throw %s; + } + } + + size_t GetDirectoryResourceSize(DirectoryResourceId id, const char* path) + { + switch (id) + { +""" % OUT_OF_RANGE_EXCEPTION) + +for name in resources: + if resources[name]['Type'] == 'Directory': + cpp.write(' case %s:\n' % name) + isFirst = True + for path in resources[name]['Files']: + cpp.write(' if (!strcmp(path, "%s"))\n' % path) + cpp.write(' return resource%dSize;\n' % resources[name]['Files'][path]['Index']) + cpp.write(' throw %s;\n\n' % INEXISTENT_PATH_EXCEPTION) + +cpp.write(""" default: + throw %s; + } + } +""" % OUT_OF_RANGE_EXCEPTION) + + + + +##################################################################### +## List the resources in a directory +##################################################################### + +cpp.write(""" + void ListResources(std::list& result, DirectoryResourceId id) + { + result.clear(); + + switch (id) + { +""") + +for name in resources: + if resources[name]['Type'] == 'Directory': + cpp.write(' case %s:\n' % name) + for path in sorted(resources[name]['Files']): + cpp.write(' result.push_back("%s");\n' % path) + cpp.write(' break;\n\n') + +cpp.write(""" default: + throw %s; + } + } +""" % OUT_OF_RANGE_EXCEPTION) + + + + +##################################################################### +## Write the convenience wrappers in .cpp +##################################################################### + +cpp.write(""" + void GetFileResource(std::string& result, FileResourceId id) + { + size_t size = GetFileResourceSize(id); + result.resize(size); + if (size > 0) + memcpy(&result[0], GetFileResourceBuffer(id), size); + } + + void GetDirectoryResource(std::string& result, DirectoryResourceId id, const char* path) + { + size_t size = GetDirectoryResourceSize(id, path); + result.resize(size); + if (size > 0) + memcpy(&result[0], GetDirectoryResourceBuffer(id, path), size); + } +""") + + +for ns in NAMESPACE.split('.'): + cpp.write('}\n') + +cpp.close() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +if (USE_GOOGLE_TEST_DEBIAN_PACKAGE) + find_path(GOOGLE_TEST_DEBIAN_SOURCES_DIR + NAMES src/gtest-all.cc + PATHS + ${CROSSTOOL_NG_IMAGE}/usr/src/gtest + ${CROSSTOOL_NG_IMAGE}/usr/src/googletest/googletest + PATH_SUFFIXES src + ) + + find_path(GOOGLE_TEST_DEBIAN_INCLUDE_DIR + NAMES gtest.h + PATHS + ${CROSSTOOL_NG_IMAGE}/usr/include/gtest + ) + + message("Path to the Debian Google Test sources: ${GOOGLE_TEST_DEBIAN_SOURCES_DIR}") + message("Path to the Debian Google Test includes: ${GOOGLE_TEST_DEBIAN_INCLUDE_DIR}") + + set(GOOGLE_TEST_SOURCES + ${GOOGLE_TEST_DEBIAN_SOURCES_DIR}/src/gtest-all.cc + ) + + include_directories(${GOOGLE_TEST_DEBIAN_SOURCES_DIR}) + + if (NOT EXISTS ${GOOGLE_TEST_SOURCES} OR + NOT EXISTS ${GOOGLE_TEST_DEBIAN_INCLUDE_DIR}/gtest.h) + message(FATAL_ERROR "Please install the libgtest-dev package") + endif() + +elseif (STATIC_BUILD OR NOT USE_SYSTEM_GOOGLE_TEST) + set(GOOGLE_TEST_SOURCES_DIR ${CMAKE_BINARY_DIR}/googletest-release-1.8.1) + set(GOOGLE_TEST_URL "http://orthanc.osimis.io/ThirdPartyDownloads/gtest-1.8.1.tar.gz") + set(GOOGLE_TEST_MD5 "2e6fbeb6a91310a16efe181886c59596") + + DownloadPackage(${GOOGLE_TEST_MD5} ${GOOGLE_TEST_URL} "${GOOGLE_TEST_SOURCES_DIR}") + + include_directories( + ${GOOGLE_TEST_SOURCES_DIR}/googletest + ${GOOGLE_TEST_SOURCES_DIR}/googletest/include + ${GOOGLE_TEST_SOURCES_DIR} + ) + + set(GOOGLE_TEST_SOURCES + ${GOOGLE_TEST_SOURCES_DIR}/googletest/src/gtest-all.cc + ) + + # https://code.google.com/p/googletest/issues/detail?id=412 + if (MSVC) # VS2012 does not support tuples correctly yet + add_definitions(/D _VARIADIC_MAX=10) + endif() + + if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") + add_definitions(-DGTEST_HAS_CLONE=0) + endif() + + source_group(ThirdParty\\GoogleTest REGULAR_EXPRESSION ${GOOGLE_TEST_SOURCES_DIR}/.*) + +else() + include(FindGTest) + if (NOT GTEST_FOUND) + message(FATAL_ERROR "Unable to find GoogleTest") + endif() + + include_directories(${GTEST_INCLUDE_DIRS}) + + # The variable GTEST_LIBRARIES contains the shared library of + # Google Test, create an alias for more uniformity + set(GOOGLE_TEST_LIBRARIES ${GTEST_LIBRARIES}) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/README.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/README.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,3 @@ +This folder contains an excerpt of the source code of Orthanc. It is +automatically generated using the "../Resources/SyncOrthancFolder.py" +script. diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/Toolchains/LinuxStandardBaseToolchain.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/Toolchains/LinuxStandardBaseToolchain.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,79 @@ +# +# Full build, as used on the BuildBot CIS: +# +# $ LSB_CC=gcc-4.8 LSB_CXX=g++-4.8 cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../Resources/LinuxStandardBaseToolchain.cmake -DUSE_LEGACY_JSONCPP=ON -DUSE_LEGACY_LIBICU=ON -DBOOST_LOCALE_BACKEND=icu -DENABLE_PKCS11=ON -G Ninja +# +# Or, more lightweight version (without libp11 and ICU): +# +# $ LSB_CC=gcc-4.8 LSB_CXX=g++-4.8 cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../Resources/LinuxStandardBaseToolchain.cmake -DUSE_LEGACY_JSONCPP=ON -G Ninja +# + +INCLUDE(CMakeForceCompiler) + +SET(LSB_PATH $ENV{LSB_PATH} CACHE STRING "") +SET(LSB_CC $ENV{LSB_CC} CACHE STRING "") +SET(LSB_CXX $ENV{LSB_CXX} CACHE STRING "") +SET(LSB_TARGET_VERSION "4.0" CACHE STRING "") + +IF ("${LSB_PATH}" STREQUAL "") + SET(LSB_PATH "/opt/lsb") +ENDIF() + +IF (EXISTS ${LSB_PATH}/lib64) + SET(LSB_TARGET_PROCESSOR "x86_64") + SET(LSB_LIBPATH ${LSB_PATH}/lib64-${LSB_TARGET_VERSION}) +ELSEIF (EXISTS ${LSB_PATH}/lib) + SET(LSB_TARGET_PROCESSOR "x86") + SET(LSB_LIBPATH ${LSB_PATH}/lib-${LSB_TARGET_VERSION}) +ELSE() + MESSAGE(FATAL_ERROR "Unable to detect the target processor architecture. Check the LSB_PATH environment variable.") +ENDIF() + +SET(LSB_CPPPATH ${LSB_PATH}/include) +SET(PKG_CONFIG_PATH ${LSB_LIBPATH}/pkgconfig/) + +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION LinuxStandardBase) +SET(CMAKE_SYSTEM_PROCESSOR ${LSB_TARGET_PROCESSOR}) + +# which compilers to use for C and C++ +SET(CMAKE_C_COMPILER ${LSB_PATH}/bin/lsbcc) + +if (${CMAKE_VERSION} VERSION_LESS "3.6.0") + CMAKE_FORCE_CXX_COMPILER(${LSB_PATH}/bin/lsbc++ GNU) +else() + SET(CMAKE_CXX_COMPILER ${LSB_PATH}/bin/lsbc++) +endif() + +# here is the target environment located +SET(CMAKE_FIND_ROOT_PATH ${LSB_PATH}) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + +SET(CMAKE_CROSSCOMPILING OFF) + + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -I${LSB_PATH}/include" CACHE INTERNAL "" FORCE) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -nostdinc++ -I${LSB_PATH}/include -I${LSB_PATH}/include/c++ -I${LSB_PATH}/include/c++/backward" CACHE INTERNAL "" FORCE) +SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -L${LSB_LIBPATH} --lsb-besteffort" CACHE INTERNAL "" FORCE) +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -L${LSB_LIBPATH} --lsb-besteffort" CACHE INTERNAL "" FORCE) + +if (NOT "${LSB_CXX}" STREQUAL "") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-cxx=${LSB_CXX}") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-cxx=${LSB_CXX}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-cxx=${LSB_CXX}") +endif() + +if (NOT "${LSB_CC}" STREQUAL "") + SET(CMAKE_C_FLAGS "${CMAKE_CC_FLAGS} --lsb-cc=${LSB_CC}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-cc=${LSB_CC}") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-cc=${LSB_CC}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-cc=${LSB_CC}") +endif() + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain32.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain32.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,17 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) + +# here is the target environment located +set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain64.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain64.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,17 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +# here is the target environment located +set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/Orthanc/Toolchains/MinGWToolchain.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/Orthanc/Toolchains/MinGWToolchain.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER i586-mingw32msvc-gcc) +set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++) +set(CMAKE_RC_COMPILER i586-mingw32msvc-windres) + +# here is the target environment located +set(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTACK_SIZE_PARAM_IS_A_RESERVATION=0x10000" CACHE INTERNAL "" FORCE) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTACK_SIZE_PARAM_IS_A_RESERVATION=0x10000" CACHE INTERNAL "" FORCE) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/OrthancLogoDocumentation.png Binary file OrthancStone/Resources/OrthancLogoDocumentation.png has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/OrthancStone.doxygen --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/OrthancStone.doxygen Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,1795 @@ +# Doxyfile 1.8.1.2 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = OrthancStone + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @ORTHANC_STONE_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Stone of Orthanc API" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = @ORTHANC_STONE_ROOT@/Resources/OrthancLogoDocumentation.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = OrthancStoneDocumentation + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @ORTHANC_STONE_ROOT@/Applications \ + @ORTHANC_STONE_ROOT@/Framework \ + @ORTHANC_STONE_ROOT@/Platforms + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = @ORTHANC_STONE_ROOT@/Framework/Orthanc/Resources/ \ + @ORTHANC_STONE_ROOT@/Applications/Samples/build-wasm/ + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = Orthanc::Internals + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = doc + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Resources/SyncOrthancFolder.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Resources/SyncOrthancFolder.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,81 @@ +#!/usr/bin/python + +# +# This maintenance script updates the content of the "Orthanc" folder +# to match the latest version of the Orthanc source code. +# + +import multiprocessing +import os +import stat +import urllib2 + +TARGET = os.path.join(os.path.dirname(__file__), 'Orthanc') +PLUGIN_SDK_VERSION = '1.0.0' +REPOSITORY = 'https://hg.orthanc-server.com/orthanc/raw-file' + +FILES = [ + ('OrthancFramework/Resources/CMake/AutoGeneratedCode.cmake', 'CMake'), + ('OrthancFramework/Resources/CMake/Compiler.cmake', 'CMake'), + ('OrthancFramework/Resources/CMake/DownloadOrthancFramework.cmake', 'CMake'), + ('OrthancFramework/Resources/CMake/DownloadPackage.cmake', 'CMake'), + ('OrthancFramework/Resources/CMake/GoogleTestConfiguration.cmake', 'CMake'), + ('OrthancFramework/Resources/EmbedResources.py', 'CMake'), + + ('OrthancFramework/Resources/Toolchains/LinuxStandardBaseToolchain.cmake', 'Toolchains'), + ('OrthancFramework/Resources/Toolchains/MinGW-W64-Toolchain32.cmake', 'Toolchains'), + ('OrthancFramework/Resources/Toolchains/MinGW-W64-Toolchain64.cmake', 'Toolchains'), + ('OrthancFramework/Resources/Toolchains/MinGWToolchain.cmake', 'Toolchains'), + + ('OrthancServer/Plugins/Samples/Common/OrthancPluginCppWrapper.h', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), + ('OrthancServer/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), + ('OrthancServer/Plugins/Samples/Common/OrthancPluginException.h', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), + ('OrthancServer/Plugins/Samples/Common/ExportedSymbolsPlugins.list', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), + ('OrthancServer/Plugins/Samples/Common/OrthancPluginsExports.cmake', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), + ('OrthancServer/Plugins/Samples/Common/VersionScriptPlugins.map', + '../../StoneWebViewer/Resources/Orthanc/Plugins'), +] + +SDK = [ + 'orthanc/OrthancCPlugin.h', +] + + +def Download(x): + branch = x[0] + source = x[1] + target = os.path.join(TARGET, x[2]) + print target + + try: + os.makedirs(os.path.dirname(target)) + except: + pass + + url = '%s/%s/%s' % (REPOSITORY, branch, source) + + with open(target, 'w') as f: + f.write(urllib2.urlopen(url).read()) + + +commands = [] + +for f in FILES: + commands.append([ 'default', + f[0], + os.path.join(f[1], os.path.basename(f[0])) ]) + +for f in SDK: + commands.append([ + 'Orthanc-%s' % PLUGIN_SDK_VERSION, + 'Plugins/Include/%s' % f, + '../../StoneWebViewer/Resources/OrthancSdk-%s/%s' % (PLUGIN_SDK_VERSION, f) + ]) + +pool = multiprocessing.Pool(10) # simultaneous downloads +pool.map(Download, commands) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Common/RtViewerApp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Common/RtViewerApp.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,250 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +// Sample app +#include "RtViewerApp.h" +#include "RtViewerView.h" +#include "SampleHelpers.h" + +// Stone of Orthanc +#include "../../Sources/StoneInitialization.h" +#include "../../Sources/Scene2D/CairoCompositor.h" +#include "../../Sources/Scene2D/ColorTextureSceneLayer.h" +#include "../../Sources/Scene2D/OpenGLCompositor.h" +#include "../../Sources/Scene2D/PanSceneTracker.h" +#include "../../Sources/Scene2D/ZoomSceneTracker.h" +#include "../../Sources/Scene2D/RotateSceneTracker.h" +#include "../../Sources/Scene2DViewport/UndoStack.h" +#include "../../Sources/Scene2DViewport/CreateLineMeasureTracker.h" +#include "../../Sources/Scene2DViewport/CreateAngleMeasureTracker.h" +#include "../../Sources/Scene2DViewport/IFlexiblePointerTracker.h" +#include "../../Sources/Scene2DViewport/MeasureTool.h" +#include "../../Sources/Scene2DViewport/PredeclaredTypes.h" +#include "../../Sources/Volumes/VolumeSceneLayerSource.h" +#include "../../Sources/Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../../Sources/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../Sources/Scene2D/LookupTableStyleConfigurator.h" +#include "../../Sources/Volumes/DicomVolumeImageMPRSlicer.h" +#include "../../Sources/StoneException.h" + +// Orthanc +#include +#include + +// System +#include +#include +#include + +#include + + +namespace OrthancStone +{ + void RtViewerApp::InvalidateAllViewports() + { + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->Invalidate(); + } + } + + const VolumeImageGeometry& RtViewerApp::GetMainGeometry() + { + ORTHANC_ASSERT(geometryProvider_.get() != NULL); + ORTHANC_ASSERT(geometryProvider_->HasGeometry()); + const VolumeImageGeometry& geometry = geometryProvider_->GetImageGeometry(); + return geometry; + } + + RtViewerApp::RtViewerApp() + : undoStack_(new UndoStack) + { + // Create the volumes that will be filled later on + ctVolume_ = boost::make_shared(); + doseVolume_ = boost::make_shared(); + } + + boost::shared_ptr RtViewerApp::Create() + { + boost::shared_ptr thisOne(new RtViewerApp()); + return thisOne; + } + + void RtViewerApp::DisableTracker() + { + if (activeTracker_) + { + activeTracker_->Cancel(); + activeTracker_.reset(); + } + } + + void RtViewerApp::CreateView(const std::string& canvasId, VolumeProjection projection) + { + boost::shared_ptr + view(new RtViewerView(shared_from_this(), canvasId, projection)); + + view->RegisterMessages(); + + view->CreateLayers(ctLoader_, doseLoader_, doseVolume_, rtstructLoader_); + + views_.push_back(view); + } + + void RtViewerApp::CreateLoaders() + { + // the viewport hosts the scene + { + // "true" means use progressive quality (jpeg 50 --> jpeg 90 --> 16-bit raw) + // "false" means only using hi quality + // TODO: add flag for quality + ctLoader_ = OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext_, ctVolume_, true); + + // better priority for CT vs dose and struct + ctLoader_->SetSchedulingPriority(-100); + + + // we need to store the CT loader to ask from geometry details later on when geometry is loaded + geometryProvider_ = ctLoader_; + + doseLoader_ = OrthancMultiframeVolumeLoader::Create(*loadersContext_, doseVolume_); + rtstructLoader_ = DicomStructureSetLoader::Create(*loadersContext_); + } + + /** + Register for notifications issued by the loaders + */ + + Register + (*ctLoader_, &RtViewerApp::HandleGeometryReady); + + Register + (*ctLoader_, &RtViewerApp::HandleCTLoaded); + + Register + (*ctLoader_, &RtViewerApp::HandleCTContentUpdated); + + Register + (*doseLoader_, &RtViewerApp::HandleDoseLoaded); + + Register + (*rtstructLoader_, &RtViewerApp::HandleStructuresReady); + + Register + (*rtstructLoader_, &RtViewerApp::HandleStructuresUpdated); + } + + void RtViewerApp::StartLoaders() + { + ORTHANC_ASSERT(HasArgument("ctseries") && HasArgument("rtdose") && HasArgument("rtstruct")); + + LOG(INFO) << "About to load:"; + LOG(INFO) << " CT : " << GetArgument("ctseries"); + LOG(INFO) << " RTDOSE : " << GetArgument("rtdose"); + LOG(INFO) << " RTSTRUCT : " << GetArgument("rtstruct"); + ctLoader_->LoadSeries(GetArgument("ctseries")); + doseLoader_->LoadInstance(GetArgument("rtdose")); + rtstructLoader_->LoadInstanceFullVisibility(GetArgument("rtstruct")); + } + + void RtViewerApp::HandleGeometryReady(const DicomVolumeImage::GeometryReadyMessage& message) + { + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->RetrieveGeometry(); + } + FitContent(); + UpdateLayersInAllViews(); + } + + void RtViewerApp::FitContent() + { + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->FitContent(); + } + } + + void RtViewerApp::UpdateLayersInAllViews() + { + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->UpdateLayers(); + } + } + + void RtViewerApp::HandleCTLoaded(const OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality& message) + { + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->RetrieveGeometry(); + } + UpdateLayersInAllViews(); + } + + void RtViewerApp::HandleCTContentUpdated(const DicomVolumeImage::ContentUpdatedMessage& message) + { + UpdateLayersInAllViews(); + } + + void RtViewerApp::HandleDoseLoaded(const DicomVolumeImage::ContentUpdatedMessage& message) + { + //TODO: compute dose extent, with outlier rejection + UpdateLayersInAllViews(); + } + + void RtViewerApp::HandleStructuresReady(const DicomStructureSetLoader::StructuresReady& message) + { + UpdateLayersInAllViews(); + } + + void RtViewerApp::HandleStructuresUpdated(const DicomStructureSetLoader::StructuresUpdated& message) + { + UpdateLayersInAllViews(); + } + + void RtViewerApp::SetArgument(const std::string& key, const std::string& value) + { + if (key == "loglevel") + OrthancStoneHelpers::SetLogLevel(value); + else + arguments_[key] = value; + } + + std::string RtViewerApp::GetArgument(const std::string& key) const + { + std::map::const_iterator found = arguments_.find(key); + if (found == arguments_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return found->second; + } + } + + bool RtViewerApp::HasArgument(const std::string& key) const + { + return (arguments_.find(key) != arguments_.end()); + } +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Common/RtViewerApp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Common/RtViewerApp.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,169 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Sources/Loaders/DicomStructureSetLoader.h" +#include "../../Sources/Loaders/ILoadersContext.h" +#include "../../Sources/Loaders/OrthancMultiframeVolumeLoader.h" +#include "../../Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../Sources/Messages/IMessageEmitter.h" +#include "../../Sources/Messages/IObserver.h" +#include "../../Sources/Messages/ObserverBase.h" +#include "../../Sources/Oracle/OracleCommandExceptionMessage.h" +#include "../../Sources/Scene2DViewport/ViewportController.h" +#include "../../Sources/Viewport/IViewport.h" +#include "../../Sources/Volumes/DicomVolumeImage.h" + +#include +#include +#include + +#if ORTHANC_ENABLE_SDL +#include +#endif + +namespace OrthancStone +{ + class OpenGLCompositor; + class IVolumeSlicer; + class ILayerStyleConfigurator; + class DicomStructureSetLoader; + class IOracle; + class ThreadedOracle; + class VolumeSceneLayerSource; + class SdlOpenGLViewport; + class RtViewerView; + + static const unsigned int FONT_SIZE_0 = 32; + static const unsigned int FONT_SIZE_1 = 24; + + class Scene2D; + class UndoStack; + + /** + This application subclasses IMessageEmitter to use a mutex before forwarding Oracle messages (that + can be sent from multiple threads) + */ + class RtViewerApp : public ObserverBase + { + public: + + void PrepareScene(); + +#if ORTHANC_ENABLE_SDL + public: + void RunSdl(int argc, char* argv[]); + void SdlRunLoop(const std::vector >& views, + OrthancStone::IViewportInteractor& interactor); + private: + void ProcessOptions(int argc, char* argv[]); + void HandleApplicationEvent(const SDL_Event& event); +#elif ORTHANC_ENABLE_WASM + public: + void RunWasm(); +#else +# error Either ORTHANC_ENABLE_SDL or ORTHANC_ENABLE_WASM must be enabled +#endif + + public: + void DisableTracker(); + + /** + Called by command-line option processing or when parsing the URL + parameters. + */ + void SetArgument(const std::string& key, const std::string& value); + + const VolumeImageGeometry& GetMainGeometry(); + + static boost::shared_ptr Create(); + + void CreateView(const std::string& canvasId, VolumeProjection projection); + + protected: + RtViewerApp(); + + private: + void CreateLoaders(); + void StartLoaders(); + void SelectNextTool(); + + // argument handling + // SetArgument is above (public section) + std::map arguments_; + + std::string GetArgument(const std::string& key) const; + bool HasArgument(const std::string& key) const; + + /** + This adds the command at the top of the undo stack + */ + //void Commit(boost::shared_ptr cmd); + void Undo(); + void Redo(); + + void HandleGeometryReady(const DicomVolumeImage::GeometryReadyMessage& message); + + // TODO: wire this + void HandleCTLoaded(const OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality& message); + void HandleCTContentUpdated(const OrthancStone::DicomVolumeImage::ContentUpdatedMessage& message); + void HandleDoseLoaded(const OrthancStone::DicomVolumeImage::ContentUpdatedMessage& message); + void HandleStructuresReady(const OrthancStone::DicomStructureSetLoader::StructuresReady& message); + void HandleStructuresUpdated(const OrthancStone::DicomStructureSetLoader::StructuresUpdated& message); + + + private: + void RetrieveGeometry(); + void FitContent(); + void InvalidateAllViewports(); + void UpdateLayersInAllViews(); + + private: + boost::shared_ptr ctVolume_; + boost::shared_ptr doseVolume_; + + std::vector > views_; + + boost::shared_ptr ctLoader_; + boost::shared_ptr doseLoader_; + boost::shared_ptr rtstructLoader_; + + /** encapsulates resources shared by loaders */ + boost::shared_ptr loadersContext_; + + /** + another interface to the ctLoader object (that also implements the IVolumeSlicer interface), that serves as the + reference for the geometry (position and dimensions of the volume + size of each voxel). It could be changed to be + the dose instead, but the CT is chosen because it usually has a better spatial resolution. + */ + boost::shared_ptr geometryProvider_; + + + boost::shared_ptr activeTracker_; + + boost::shared_ptr undoStack_; + }; + +} + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Common/RtViewerView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Common/RtViewerView.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,350 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +// Sample app +#include "RtViewerView.h" +#include "RtViewerApp.h" +#include "SampleHelpers.h" + +#include + +// Stone of Orthanc +#include "../../Sources/Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../../Sources/Scene2D/CairoCompositor.h" +#include "../../Sources/Scene2D/ColorTextureSceneLayer.h" +#include "../../Sources/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../Sources/Scene2D/LookupTableStyleConfigurator.h" +#include "../../Sources/Scene2D/OpenGLCompositor.h" +#include "../../Sources/Scene2D/PanSceneTracker.h" +#include "../../Sources/Scene2D/RotateSceneTracker.h" +#include "../../Sources/Scene2D/ZoomSceneTracker.h" +#include "../../Sources/Scene2DViewport/CreateAngleMeasureTracker.h" +#include "../../Sources/Scene2DViewport/CreateLineMeasureTracker.h" +#include "../../Sources/Scene2DViewport/IFlexiblePointerTracker.h" +#include "../../Sources/Scene2DViewport/MeasureTool.h" +#include "../../Sources/Scene2DViewport/PredeclaredTypes.h" +#include "../../Sources/Scene2DViewport/UndoStack.h" +#include "../../Sources/StoneException.h" +#include "../../Sources/StoneInitialization.h" +#include "../../Sources/Volumes/DicomVolumeImageMPRSlicer.h" +#include "../../Sources/Volumes/VolumeSceneLayerSource.h" + +// Orthanc +#include // For std::unique_ptr<> +#include +#include + +// System +#include +#include +#include + +#include + + +namespace OrthancStone +{ + boost::shared_ptr RtViewerView::GetApp() + { + return app_.lock(); + } + + void RtViewerView::DisplayInfoText() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + // do not try to use stuff too early! + OrthancStone::ICompositor& compositor = lock->GetCompositor(); + + std::stringstream msg; + + for (std::map::const_iterator kv = infoTextMap_.begin(); + kv != infoTextMap_.end(); ++kv) + { + msg << kv->first << " : " << kv->second << std::endl; + } + std::string msgS = msg.str(); + + TextSceneLayer* layerP = NULL; + if (scene.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = dynamic_cast( + scene.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); + layerP = &layer; + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layerP = layer.get(); + layer->SetColor(0, 255, 0); + layer->SetFontIndex(1); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_TopLeft); + //layer->SetPosition(0,0); + scene.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + // position the fixed info text in the upper right corner + layerP->SetText(msgS.c_str()); + double cX = compositor.GetCanvasWidth() * (-0.5); + double cY = compositor.GetCanvasHeight() * (-0.5); + scene.GetCanvasToSceneTransform().Apply(cX, cY); + layerP->SetPosition(cX, cY); + lock->Invalidate(); + } + + void RtViewerView::DisplayFloatingCtrlInfoText(const PointerEvent& e) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + + char buf[128]; + sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", + p.GetX(), p.GetY(), + e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); + + if (scene.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = + dynamic_cast(scene.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); + layer.SetText(buf); + layer.SetPosition(p.GetX(), p.GetY()); + } + else + { + std::unique_ptr layer(new TextSceneLayer); + layer->SetColor(0, 255, 0); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_BottomCenter); + layer->SetPosition(p.GetX(), p.GetY()); + scene.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + } + + void RtViewerView::HideInfoText() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + scene.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); + } + + void RtViewerView::OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message) + { + DisplayInfoText(); + } + + void RtViewerView::Invalidate() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + + void RtViewerView::FitContent() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + + void RtViewerView::Scroll(int delta) + { + if (!planes_.empty()) + { + int next = 0; + int temp = static_cast(currentPlane_) + delta; + + if (temp < 0) + { + next = 0; + } + else if (temp >= static_cast(planes_.size())) + { + next = static_cast(planes_.size()) - 1; + } + else + { + next = static_cast(temp); + } + LOG(INFO) << "RtViewerView::Scroll(" << delta << ") --> slice is now = " << next; + + if (next != static_cast(currentPlane_)) + { + currentPlane_ = next; + UpdateLayers(); + } + } + } + + void RtViewerView::RetrieveGeometry() + { + const VolumeImageGeometry& geometry = GetApp()->GetMainGeometry(); + + const unsigned int depth = geometry.GetProjectionDepth(projection_); + currentPlane_ = depth / 2; + + planes_.resize(depth); + + for (unsigned int z = 0; z < depth; z++) + { + planes_[z] = geometry.GetProjectionSlice(projection_, z); + } + + UpdateLayers(); + } + + void RtViewerView::UpdateLayers() + { + std::unique_ptr lock(viewport_->Lock()); + + if (planes_.size() == 0) + { + RetrieveGeometry(); + } + + if (currentPlane_ < planes_.size()) + { + if (ctVolumeLayerSource_.get() != NULL) + { + ctVolumeLayerSource_->Update(planes_[currentPlane_]); + } + if (doseVolumeLayerSource_.get() != NULL) + { + doseVolumeLayerSource_->Update(planes_[currentPlane_]); + } + if (structLayerSource_.get() != NULL) + { + structLayerSource_->Update(planes_[currentPlane_]); + } + } + lock->Invalidate(); + } + + void RtViewerView::PrepareViewport() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + ICompositor& compositor = lock->GetCompositor(); + + // False means we do NOT let a hi-DPI aware desktop managedr treat this as a legacy application that requires + // scaling. + controller.FitContent(compositor.GetCanvasWidth(), compositor.GetCanvasHeight()); + + std::string ttf; + Orthanc::EmbeddedResources::GetFileResource(ttf, Orthanc::EmbeddedResources::UBUNTU_FONT); + compositor.SetFont(0, ttf, FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor.SetFont(1, ttf, FONT_SIZE_1, Orthanc::Encoding_Latin1); + } + + void RtViewerView::SetInfoDisplayMessage( + std::string key, std::string value) + { + if (value == "") + infoTextMap_.erase(key); + else + infoTextMap_[key] = value; + DisplayInfoText(); + } + + void RtViewerView::RegisterMessages() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Register(controller, &RtViewerView::OnSceneTransformChanged); + } + + void RtViewerView::CreateLayers(boost::shared_ptr ctLoader, + boost::shared_ptr doseLoader, + boost::shared_ptr doseVolume, + boost::shared_ptr rtstructLoader) + { + /** + Configure the CT + */ + std::unique_ptr style(new GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + + this->SetCtVolumeSlicer(ctLoader, style.release()); + + { + std::string lut; + Orthanc::EmbeddedResources::GetFileResource(lut, Orthanc::EmbeddedResources::COLORMAP_HOT); + + std::unique_ptr config(new LookupTableStyleConfigurator); + config->SetLookupTable(lut); + + boost::shared_ptr tmp(new DicomVolumeImageMPRSlicer(doseVolume)); + this->SetDoseVolumeSlicer(tmp, config.release()); + } + + this->SetStructureSet(rtstructLoader); + } + + void RtViewerView::SetCtVolumeSlicer(const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + int depth = scene.GetMaxDepth() + 1; + + ctVolumeLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); + + if (style != NULL) + { + ctVolumeLayerSource_->SetConfigurator(style); + } + } + + void RtViewerView::SetDoseVolumeSlicer(const boost::shared_ptr& volume, + OrthancStone::ILayerStyleConfigurator* style) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + int depth = scene.GetMaxDepth() + 1; + + doseVolumeLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); + + if (style != NULL) + { + doseVolumeLayerSource_->SetConfigurator(style); + } + } + + void RtViewerView::SetStructureSet(const boost::shared_ptr& volume) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + int depth = scene.GetMaxDepth() + 1; + + structLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Common/RtViewerView.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Common/RtViewerView.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,136 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Sources/Loaders/DicomStructureSetLoader.h" +#include "../../Sources/Loaders/ILoadersContext.h" +#include "../../Sources/Loaders/OrthancMultiframeVolumeLoader.h" +#include "../../Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../Sources/Messages/IMessageEmitter.h" +#include "../../Sources/Messages/IObserver.h" +#include "../../Sources/Messages/ObserverBase.h" +#include "../../Sources/Oracle/OracleCommandExceptionMessage.h" +#include "../../Sources/Scene2DViewport/ViewportController.h" +#include "../../Sources/Viewport/IViewport.h" +#include "../../Sources/Volumes/DicomVolumeImage.h" +#include "../../Sources/Volumes/VolumeSceneLayerSource.h" + +#include +#include +#include + +namespace OrthancStone +{ + class RtViewerApp; + + class RtViewerView : public ObserverBase + { + public: + RtViewerView(boost::weak_ptr app, + const std::string& canvasId, + VolumeProjection projection) + : app_(app) + , currentPlane_(0) + , projection_(projection) + { + viewport_ = CreateViewport(canvasId); + FLOATING_INFOTEXT_LAYER_ZINDEX = 6; + FIXED_INFOTEXT_LAYER_ZINDEX = 7; + } + + /** + This method is called when the scene transform changes. It allows to + recompute the visual elements whose content depend upon the scene transform + */ + void OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message); + + /** + This method will ask the VolumeSceneLayerSource, that are responsible to + generated 2D content based on a volume and a cutting plane, to regenerate + it. This is required if the volume itself changes (during loading) or if + the cutting plane is changed + */ + void UpdateLayers(); + + void Refresh(); + + void TakeScreenshot( + const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight); + + void Scroll(int delta); + + void Invalidate(); + void FitContent(); + void RetrieveGeometry(); + void PrepareViewport(); + void RegisterMessages(); + +#if ORTHANC_ENABLE_SDL == 1 + void EnableGLDebugOutput(); +#endif + + void CreateLayers(boost::shared_ptr ctLoader, + boost::shared_ptr doseLoader, + boost::shared_ptr doseVolume, + boost::shared_ptr rtstructLoader); + + boost::shared_ptr GetViewport() + { + return viewport_; + } + + private: + void SetInfoDisplayMessage(std::string key, std::string value); + boost::shared_ptr GetApp(); + boost::shared_ptr CreateViewport(const std::string& canvasId); + void DisplayInfoText(); + void HideInfoText(); + void DisplayFloatingCtrlInfoText(const PointerEvent& e); + + void SetCtVolumeSlicer(const boost::shared_ptr& volume, + ILayerStyleConfigurator* style); + + void SetDoseVolumeSlicer(const boost::shared_ptr& volume, + ILayerStyleConfigurator* style); + + void SetStructureSet(const boost::shared_ptr& volume); + + private: + boost::weak_ptr app_; + boost::shared_ptr ctVolumeLayerSource_, doseVolumeLayerSource_, structLayerSource_; + + // collection of cutting planes for this particular view + std::vector planes_; + size_t currentPlane_; + + VolumeProjection projection_; + + std::map infoTextMap_; + + int FLOATING_INFOTEXT_LAYER_ZINDEX; + int FIXED_INFOTEXT_LAYER_ZINDEX; + boost::shared_ptr viewport_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Common/SampleHelpers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Common/SampleHelpers.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include + +#include +#include + +namespace OrthancStoneHelpers +{ + inline void SetLogLevel(std::string logLevel) + { + boost::to_lower(logLevel); + if (logLevel == "warning") + { + Orthanc::Logging::EnableInfoLevel(false); + Orthanc::Logging::EnableTraceLevel(false); + } + else if (logLevel == "info") + { + Orthanc::Logging::EnableInfoLevel(true); + Orthanc::Logging::EnableTraceLevel(false); + } + else if (logLevel == "trace") + { + Orthanc::Logging::EnableInfoLevel(true); + Orthanc::Logging::EnableTraceLevel(true); + } + else + { + std::cerr << "Unknown log level \"" << logLevel << "\". Will use TRACE as default!"; + Orthanc::Logging::EnableInfoLevel(true); + Orthanc::Logging::EnableTraceLevel(true); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/README.md Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,233 @@ +General +======= +These samples assume that a recent version of Orthanc is checked out in an +`orthanc` folder next to the `orthanc-stone` folder. Let's call the top folder +the `devroot` folder. This name does not matter and is not used anywhere. + +Here's the directory layout that we suggest: + +``` +devroot/ + | + +- orthanc/ + | + +- orthanc-stone/ + | + ... +``` + + Orthanc can be retrieved with: + ``` + hg clone https://hg.orthanc-server.com/orthanc + ``` + +Furthermore, the samples usually assume that an Orthanc is running locally, +without authentication, on port 8042. The samples can easily be tweaked if +your setup is different. + +When Dicom resources are to be displayed, their IDs can be supplied in the +various ways suitable for the platform (command-line arguments, URL parameters +or through the GUI) + + +This repo contains two sample projects: + +SingleFrameViewer +----------------- + +This sample application displays a single frame of a Dicom instance that can +be loaded from Orthanc, either by using the Orthanc REST API or through the +Dicomweb server functionality of Orthanc. + +RtViewer +-------- + +This sample application displays set of Radiotherapy data: +- a CT scan +- an RT-Dose +- an RT-Struct + +The WebAssembly version displays 3 viewports with MPR data +while the SDL sample displays a single viewport. + + +WebAssembly samples +=================== + +Building the WebAssembly samples require the Emscripten SDK +(https://emscripten.org/). This SDK goes far beyond the simple compilation to +the wasm (Web Assembly) bytecode and provides a comprehensive library that +eases porting native C and C++ programs and libraries. The Emscripten SDK also +makes it easy to generate the companion Javascript files requires to use a +wasm module in a web application. + +Although Emscripten runs on all major platforms, Stone of Orthanc is developed +and tested with the Linux version of Emscripten. + +Emscripten runs perfectly fine under the Windows Subsystem for Linux (that is +the environment used quite often by the Stone of Orthanc team) + +**Important note:** The following examples **and the build scripts** will +assume that you have installed the Emscripten SDK in `~/apps/emsdk`. + +The following packages should get you going (a Debian-like distribution such +as Debian or Ubuntu is assumed) + +``` +sudo apt-get update +sudo apt-get install -y build-essential curl wget git python cmake pkg-config +sudo apt-get install -y mercurial unzip npm ninja-build p7zip-full gettext-base +``` + +To build the Wasm samples, just launch the `build-wasm-samples.sh` script from +this folder. Optionaly, you can pass the build type as an argument. +We suggest that you do *not* use the `Debug` configuration unless you really +need it, for the additional checks that are made will lead to a very long +build time and much slower execution (more severe than with a native non-wasm +target) + +In order to run the sample, you may serve it with the ServeFolders plugin. +You can i.e: add such a section in your orthanc configuration file: + +``` +{ + "Plugins" : ["LibServeFolders.so], + "ServeFolders" : { + "/single-frame-viewer" : "..../out/install-stone-wasm-samples-RelWithDebInfo/SingleFrameViewer", + "/rt-viewer": "..../out/install-stone-wasm-samples-RelWithDebInfo/RtViewer" + } +} +``` + +You'll then be able to open the single-frame-viewer demo at `http://localhost:8042/single-frame-viewer/index.html` + +The rt-viewer demo at +`http://localhost:8044/rt-viewer/index.html?ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9`. Note that you must provide 3 ids in the url: + +- the CT series Orthanc ID +- the RT-Dose instance Orthanc ID +- the RT-Struct instance Orthanc ID + + +RtViewer +----------------- + +This sample application displays three MPR views of a CT+RTDOSE+RTSTRUCT dataset, loaded from Orthanc. The Orthanc IDs of the dataset must be supplied as URL parameters like: + +``` +http://localhost:9979/rtviewer/index.html?loglevel=info&ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 +``` + +(notice the loglevel parameter that can be `warning`, `info` or `trace`, in increasing verbosity order) + +This sample uses plain Javascript and requires the +Emscripten toolchain and cmake, in addition to a few standard packages. + +To build it, just launch the `build-wasm-RtViewer.sh` script from +this folder. Optionaly, you can pass the build type as an argument. +We suggest that you do *not* use the `Debug` configuration unless you really +need it, for the additional checks that are made will lead to a very long +build time and much slower execution (more severe than with a native non-wasm +target) + +In order to run the sample, you may serve it with the ServeFolders plugin. +You can i.e: add such a section in your orthanc configuration file: + +``` +{ + "Plugins" : ["LibServeFolders.so], + "ServeFolders" : { + "/rt-viewer" : "..../out/install-stone-wasm-RtViewer-RelWithDebInfo" + } +} +``` + +You'll then be able to open the demo at `http://localhost:8042/rt-viewer/index.html` + + +Native samples +================= + +### Windows build + +Here's how to build the SdlSimpleViewer example using Visual Studio 2019 +(the shell is Powershell, but the legacy shell can also be used with some +tweaks). This example is meant to be launched from the folder above +orthanc-stone. + +``` + # create the build folder and navigate to it + $buildDir = "build-stone-sdlviewer-msvc16-x64" + + if (-not (Test-Path $buildDir)) { + mkdir -p $buildDir | Out-Null + } + + cd $buildDir + + # perform the configuration + cmake -G "Visual Studio 16 2019" -A x64 ` + -DMSVC_MULTIPLE_PROCESSES=ON ` + -DALLOW_DOWNLOADS=ON ` + -DSTATIC_BUILD=ON ` + -DOPENSSL_NO_CAPIENG=ON ` + ../orthanc-stone/Samples/Sdl + + $solutionPath = ls -filter *.sln + Write-Host "Solution file(s) available at: $solutionPath" +``` + +The initial configuration step will be quite lengthy, for CMake needs to +setup its internal cache based on your environment and build tools. + +Subsequent runs will be several orders of magnitude faster! + +One the solution (.sln) file is ready, you can open it using the Visual Studio +IDE and choose Build --> Build solution. + +An alternative is to execute `cmake --build .` in the build folder created by +the script. + +In order to run the sample, make sure you've an Orthanc server running i.e. on +port 8042 and launch: + +``` +./SdlSimpleViewer --orthanc http://localhost:8042 --instance 7fc84013-abef174e-3354ca83-b9cdb2a4-f1a74368 + +./RtViewerSdl --orthanc http://localhost:8042 --ctseries a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --rtdose 830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --rtstruct 54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 +``` + +RtViewer +--------------- + +### Windows build + +Here's how to build the SdlSimpleViewer example using Visual Studio 2019 +(the shell is Powershell, but the legacy shell can also be used with some +tweaks). This example is meant to be launched from the folder above +orthanc-stone. + +``` + $buildRootDir = "out" + $buildDirName = "build-stone-sdl-RtViewer-msvc16-x64" + $buildDir = Join-Path -Path $buildRootDir -ChildPath $buildDirName + + if (-not (Test-Path $buildDir)) { + mkdir -p $buildDir | Out-Null + } + + cd $buildDir + + cmake -G "Visual Studio 16 2019" -A x64 ` + -DMSVC_MULTIPLE_PROCESSES=ON ` + -DALLOW_DOWNLOADS=ON ` + -DSTATIC_BUILD=ON ` + -DOPENSSL_NO_CAPIENG=ON ` + ../../orthanc-stone/Samples/Sdl/RtViewer +``` + +Executing `cmake --build .` in the build folder will launch the Microsoft +builder on the solution. + +Alternatively, you can open and build the solution using Visual Studio 2019. + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/BoostExtendedConfiguration.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/BoostExtendedConfiguration.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +# Stone of Orthanc +# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics +# Department, University Hospital of Liege, Belgium +# Copyright (C) 2017-2020 Osimis S.A., Belgium +# +# This program is free software: you can redistribute it and/or +# modify it under the terms of the GNU Affero 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 +# Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +if (STATIC_BUILD OR NOT USE_SYSTEM_BOOST) + set(BOOST_EXTENDED_SOURCES + ${BOOST_SOURCES_DIR}/libs/program_options/src/cmdline.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/config_file.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/convert.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/options_description.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/parsers.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/positional_options.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/split.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/utf8_codecvt_facet.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/value_semantic.cpp + ${BOOST_SOURCES_DIR}/libs/program_options/src/variables_map.cpp + ${BOOST_SOURCES_DIR}/libs/chrono/src/thread_clock.cpp + ${BOOST_SOURCES_DIR}/libs/chrono/src/chrono.cpp + ${BOOST_SOURCES_DIR}/libs/chrono/src/process_cpu_clocks.cpp + #${BOOST_SOURCES_DIR}/libs/program_options/src/winmain.cpp + ) + add_definitions(-DBOOST_PROGRAM_OPTIONS_NO_LIB) +else() + link_libraries(boost_program_options) +endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,111 @@ +cmake_minimum_required(VERSION 2.8.10) + +project(OrthancStone) + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + set(ORTHANC_BOOST_COMPONENTS program_options) + + set(USE_SYSTEM_GOOGLE_TEST ON CACHE BOOL "Use the system version of Google Test") + set(USE_GOOGLE_TEST_DEBIAN_PACKAGE OFF CACHE BOOL "Use the sources of Google Test shipped with libgtest-dev (Debian only)") + mark_as_advanced(USE_GOOGLE_TEST_DEBIAN_PACKAGE) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/DownloadPackage.cmake) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake) + +else() + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_LOCALE ON) # Necessary for text rendering + set(ENABLE_OPENGL ON) # <== + set(ENABLE_WEB_CLIENT ON) +endif() + +set(ENABLE_DCMTK ON) # <== +set(ENABLE_SDL ON) + +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) +include(${CMAKE_SOURCE_DIR}/Utilities.cmake) + +if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + # This include must be after "OrthancStoneConfiguration.cmake" to + # have "BOOST_SOURCES_DIR" defined + include(${CMAKE_SOURCE_DIR}/BoostExtendedConfiguration.cmake) +endif() + + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +EmbedResources( + COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +SortFilesInSourceGroups() + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ${AUTOGENERATED_SOURCES} + ${BOOST_EXTENDED_SOURCES} + ) + +message(${AUTOGENERATED_SOURCES}) + + + +############################# +project(RtViewerSdl) + +add_executable(RtViewerSdl + RtViewer/RtViewerSdl.cpp + SdlHelpers.h + ../Common/RtViewerApp.cpp + ../Common/RtViewerApp.h + ../Common/RtViewerView.cpp + ../Common/RtViewerView.h + ../Common/SampleHelpers.h + ) + +target_link_libraries(RtViewerSdl OrthancStone ${DCMTK_LIBRARIES}) + +############################# +project(SdlSimpleViewer) + +add_executable(SdlSimpleViewer + SdlHelpers.h + ../Common/SampleHelpers.h + SingleFrameViewer/SdlSimpleViewerApplication.h + SingleFrameViewer/SdlSimpleViewer.cpp + ) + +target_link_libraries(SdlSimpleViewer OrthancStone ${DCMTK_LIBRARIES}) + +############################# +project(UnitTests) + +add_executable(UnitTests + ${GOOGLE_TEST_SOURCES} + ${ORTHANC_STONE_ROOT}/UnitTestsSources/GenericToolboxTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/ImageToolboxTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/PixelTestPatternsTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStrategy.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStructureSet.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/SortedFramesTests.cpp + ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp + ) + +target_link_libraries(UnitTests OrthancStone) + +add_custom_command( + TARGET UnitTests + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${ORTHANC_STONE_ROOT}/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" + "$/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" +) + +target_link_libraries(UnitTests OrthancStone ${DCMTK_LIBRARIES}) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/RtViewer/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/RtViewer/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +cmake_minimum_required(VERSION 2.8.10) + +project(RtViewerSdl) + +include(${CMAKE_SOURCE_DIR}/../../../Resources/CMake/OrthancStoneParameters.cmake) + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + set(ORTHANC_BOOST_COMPONENTS program_options) + + set(USE_SYSTEM_GOOGLE_TEST ON CACHE BOOL "Use the system version of Google Test") + set(USE_GOOGLE_TEST_DEBIAN_PACKAGE OFF CACHE BOOL "Use the sources of Google Test shipped with libgtest-dev (Debian only)") + mark_as_advanced(USE_GOOGLE_TEST_DEBIAN_PACKAGE) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/DownloadPackage.cmake) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake) + +else() + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_LOCALE ON) # Necessary for text rendering + set(ENABLE_OPENGL ON) # <== + set(ENABLE_WEB_CLIENT ON) +endif() + +set(ENABLE_DCMTK ON) # <== +set(ENABLE_SDL ON) + +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) +include(${CMAKE_SOURCE_DIR}/../Utilities.cmake) + +if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + # This include must be after "OrthancStoneConfiguration.cmake" to + # have "BOOST_SOURCES_DIR" defined + include(${CMAKE_SOURCE_DIR}/../BoostExtendedConfiguration.cmake) +endif() + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +EmbedResources( + COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +SortFilesInSourceGroups() + +add_executable(RtViewerSdl + RtViewerSdl.cpp + ../SdlHelpers.h + ../../Common/RtViewerApp.cpp + ../../Common/RtViewerApp.h + ../../Common/RtViewerView.cpp + ../../Common/RtViewerView.h + ../../Common/SampleHelpers.h + ${ORTHANC_STONE_SOURCES} + ${AUTOGENERATED_SOURCES} + ${BOOST_EXTENDED_SOURCES} + ) + +target_link_libraries(RtViewerSdl ${DCMTK_LIBRARIES}) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/RtViewer/CMakeSettings.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/RtViewer/CMakeSettings.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,34 @@ +ο»Ώ{ + // this file is meant to be used with Visual Studio CMake support + // tested with VS 16.5.4+ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}/../../../../out/build-stone-sdl-RtViewer-ninja-msvc16-x64-Debug", + "installRoot": "${projectDir}/../../../../out/install-stone-sdl-RtViewer-ninja-msvc16-x64-Debug", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "variables": [ + { + "name": "ALLOW_DOWNLOADS", + "value": "True", + "type": "BOOL" + }, + { + "name": "MSVC_MULTIPLE_PROCESSES", + "value": "True", + "type": "BOOL" + }, + { + "name": "STATIC_BUILD", + "value": "True", + "type": "BOOL" + } + ] + } + ] +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/RtViewer/RtViewerSdl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/RtViewer/RtViewerSdl.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,458 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../../Common/RtViewerApp.h" +#include "../../Common/RtViewerView.h" +#include "../SdlHelpers.h" + +#include + +// Stone of Orthanc includes +#include "../../../Sources/Loaders/GenericLoadersContext.h" +#include "../../../Sources/OpenGL/OpenGLIncludes.h" +#include "../../../Sources/OpenGL/SdlOpenGLContext.h" +#include "../../../Sources/StoneException.h" +#include "../../../Sources/StoneInitialization.h" + +// Orthanc (a.o. for screenshot capture) +#include // For std::unique_ptr<> +#include +#include +#include + + +#include +#include + +// #include this include might be necessary in more recent boost versions + +#include + +#include + + +#if !defined(__APPLE__) +/** + * OpenGL: "OS X does not seem to support debug output functionality + * (as gathered online)." + * https://learnopengl.com/In-Practice/Debugging + **/ +static void GLAPIENTRY +OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) +{ + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } +} +#endif + +namespace OrthancStone +{ + void RtViewerView::EnableGLDebugOutput() + { +#if !defined(__APPLE__) + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); +#endif + } + + boost::shared_ptr RtViewerView::CreateViewport(const std::string& canvasId) + { + // False means we do NOT let Windows treat this as a legacy application that needs to be scaled + return SdlOpenGLViewport::Create(canvasId, 1024, 1024, false); + } + + void RtViewerApp::ProcessOptions(int argc, char* argv[]) + { + namespace po = boost::program_options; + po::options_description desc("Usage:"); + + desc.add_options() + ("loglevel", po::value()->default_value("WARNING"), + "You can choose WARNING, INFO or TRACE for the logging level: Errors and warnings will always be displayed. (default: WARNING)") + + ("orthanc", po::value()->default_value("http://localhost:8042"), + "Base URL of the Orthanc instance") + + ("ctseries", po::value()->default_value("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"), + "Orthanc ID of the CT series to load") + + ("rtdose", po::value()->default_value("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"), + "Orthanc ID of the RTDOSE instance to load") + + ("rtstruct", po::value()->default_value("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"), + "Orthanc ID of the RTSTRUCT instance to load") + ; + + po::variables_map vm; + try + { + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + } + catch (std::exception& e) + { + std::cerr << "Please check your command line options! (\"" << e.what() << "\")" << std::endl; + } + + for (po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it) + { + std::string key = it->first; + const po::variable_value& value = it->second; + const std::string& strValue = value.as(); + SetArgument(key, strValue); + } + } + + void RtViewerApp::RunSdl(int argc, char* argv[]) + { + ProcessOptions(argc, argv); + + /** + Create the shared loaders context + */ + loadersContext_.reset(new GenericLoadersContext(1, 4, 1)); + + // we are in SDL --> downcast to concrete type + boost::shared_ptr loadersContext = boost::dynamic_pointer_cast(loadersContext_); + + /** + Url of the Orthanc instance + Typically, in a native application (Qt, SDL), it will be an absolute URL like "http://localhost:8042". In + wasm on the browser, it could be an absolute URL, provided you do not have cross-origin problems, or a relative + URL. In our wasm samples, it is set to "..", because we set up either a reverse proxy or an Orthanc ServeFolders + plugin that serves the main web application from an URL like "http://localhost:8042/rtviewer" (with ".." leading + to the main Orthanc root URL) + */ + std::string orthancUrl = arguments_["orthanc"]; + + { + Orthanc::WebServiceParameters p; + if (HasArgument("orthanc")) + { + p.SetUrl(orthancUrl); + } + if (HasArgument("user")) + { + ORTHANC_ASSERT(HasArgument("password")); + p.SetCredentials(GetArgument("user"), GetArgument("password")); + } + else + { + ORTHANC_ASSERT(!HasArgument("password")); + } + loadersContext->SetOrthancParameters(p); + } + + loadersContext->StartOracle(); + + CreateLoaders(); + + /** + Create viewports + */ + CreateView("RtViewer Axial", VolumeProjection_Axial); + CreateView("RtViewer Coronal", VolumeProjection_Coronal); + CreateView("RtViewer Sagittal", VolumeProjection_Sagittal); + + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->PrepareViewport(); + views_[i]->EnableGLDebugOutput(); + } + + DefaultViewportInteractor interactor; + + /** + It is very important that the Oracle (responsible for network I/O) be started before creating and firing the + loaders, for any command scheduled by the loader before the oracle is started will be lost. + */ + StartLoaders(); + + + SdlRunLoop(views_, interactor); + loadersContext->StopOracle(); + } + + void RtViewerView::TakeScreenshot(const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + std::string ttf; + Orthanc::EmbeddedResources::GetFileResource(ttf, Orthanc::EmbeddedResources::UBUNTU_FONT); + + CairoCompositor compositor(canvasWidth, canvasHeight); + compositor.SetFont(0, ttf, FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor.Refresh(scene); + + Orthanc::ImageAccessor canvas; + compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); + Orthanc::ImageProcessing::Convert(png, canvas); + + Orthanc::PngWriter writer; + writer.WriteToFile(target, png); + } + + static boost::shared_ptr GetViewFromWindowId( + const std::vector >& views, + Uint32 windowID) + { + using namespace OrthancStone; + for (size_t i = 0; i < views.size(); ++i) + { + boost::shared_ptr view = views[i]; + boost::shared_ptr viewport = view->GetViewport(); + boost::shared_ptr sdlViewport = boost::dynamic_pointer_cast(viewport); + Uint32 curWindowID = sdlViewport->GetSdlWindowId(); + if (windowID == curWindowID) + return view; + } + return boost::shared_ptr(); + } + + void RtViewerApp::SdlRunLoop(const std::vector >& views, + OrthancStone::IViewportInteractor& interactor) + { + using namespace OrthancStone; + + // const std::vector >& views + std::vector > viewports; + for (size_t i = 0; i < views.size(); ++i) + { + boost::shared_ptr view = views[i]; + boost::shared_ptr viewport = view->GetViewport(); + boost::shared_ptr sdlViewport = + boost::dynamic_pointer_cast(viewport); + viewports.push_back(sdlViewport); + } + + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + bool stop = false; + while (!stop) + { + std::vector sdlEvents; + std::map userEventsMap; + SDL_Event sdlEvent; + + // FIRST: collect all pending events + while (SDL_PollEvent(&sdlEvent) != 0) + { + if ( (sdlEvent.type >= SDL_USEREVENT) && + (sdlEvent.type < SDL_LASTEVENT) ) + { + // we don't want to have multiple refresh events , + // and since every refresh event is a user event with a special type, + // we use a map + userEventsMap[sdlEvent.type] = sdlEvent; + } + else + { + sdlEvents.push_back(sdlEvent); + } + } + + // SECOND: add all user events to sdlEvents + for (std::map::const_iterator it = userEventsMap.begin(); it != userEventsMap.end(); ++it) + sdlEvents.push_back(it->second); + + // now process the events + for (std::vector::const_iterator it = sdlEvents.begin(); it != sdlEvents.end(); ++it) + { + const SDL_Event& sdlEvent = *it; + + if (sdlEvent.type == SDL_QUIT) + { + stop = true; + break; + } + else if (sdlEvent.type == SDL_WINDOWEVENT && + (sdlEvent.window.event == SDL_WINDOWEVENT_RESIZED || + sdlEvent.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) + { + boost::shared_ptr view = GetViewFromWindowId( + views, sdlEvent.window.windowID); + + boost::shared_ptr sdlViewport = + boost::dynamic_pointer_cast(view->GetViewport()); + + sdlViewport->UpdateSize(sdlEvent.window.data1, sdlEvent.window.data2); + } + else if (sdlEvent.type == SDL_WINDOWEVENT && + (sdlEvent.window.event == SDL_WINDOWEVENT_SHOWN || + sdlEvent.window.event == SDL_WINDOWEVENT_EXPOSED)) + { + boost::shared_ptr view = GetViewFromWindowId( + views, sdlEvent.window.windowID); + boost::shared_ptr sdlViewport = + boost::dynamic_pointer_cast(view->GetViewport()); + sdlViewport->Paint(); + } + else if (sdlEvent.type == SDL_KEYDOWN && + sdlEvent.key.repeat == 0 /* Ignore key bounce */) + { + boost::shared_ptr view = GetViewFromWindowId( + views, sdlEvent.window.windowID); + + switch (sdlEvent.key.keysym.sym) + { + case SDLK_f: + { + boost::shared_ptr sdlViewport = + boost::dynamic_pointer_cast(view->GetViewport()); + sdlViewport->ToggleMaximize(); + } + break; + + case SDLK_s: + { + std::unique_ptr lock(view->GetViewport()->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + break; + + case SDLK_q: + stop = true; + break; + + default: + break; + } + } + else if (sdlEvent.type == SDL_MOUSEBUTTONDOWN || + sdlEvent.type == SDL_MOUSEMOTION || + sdlEvent.type == SDL_MOUSEBUTTONUP) + { + boost::shared_ptr view = GetViewFromWindowId( + views, sdlEvent.window.windowID); + + std::unique_ptr lock(view->GetViewport()->Lock()); + if (lock->HasCompositor()) + { + OrthancStone::PointerEvent p; + OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), + sdlEvent, keyboardState, scancodeCount); + + switch (sdlEvent.type) + { + case SDL_MOUSEBUTTONDOWN: + lock->GetController().HandleMousePress(interactor, p, + lock->GetCompositor().GetCanvasWidth(), + lock->GetCompositor().GetCanvasHeight()); + lock->Invalidate(); + break; + + case SDL_MOUSEMOTION: + if (lock->GetController().HandleMouseMove(p)) + { + lock->Invalidate(); + } + break; + + case SDL_MOUSEBUTTONUP: + lock->GetController().HandleMouseRelease(p); + lock->Invalidate(); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + else if (sdlEvent.type == SDL_MOUSEWHEEL) + { + boost::shared_ptr view = GetViewFromWindowId( + views, sdlEvent.window.windowID); + + int delta = 0; + if (sdlEvent.wheel.y < 0) + delta = -1; + if (sdlEvent.wheel.y > 0) + delta = 1; + + view->Scroll(delta); + } + else + { + for (size_t i = 0; i < views.size(); ++i) + { + boost::shared_ptr sdlViewport = + boost::dynamic_pointer_cast(views[i]->GetViewport()); + if (sdlViewport->IsRefreshEvent(sdlEvent)) + { + sdlViewport->Paint(); + } + } + } + } + // Small delay to avoid using 100% of CPU + SDL_Delay(1); + } + } + } +} + +boost::weak_ptr g_app; + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + using namespace OrthancStone; + + StoneInitialize(); + + try + { + boost::shared_ptr app = RtViewerApp::Create(); + g_app = app; + app->RunSdl(argc,argv); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "EXCEPTION: " << e.What(); + } + + StoneFinalize(); + + return 0; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/SdlHelpers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/SdlHelpers.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,142 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL != 1 +# error This file cannot be used if ORTHANC_ENABLE_SDL != 1 +#endif + +#include "../../Sources/Viewport/SdlViewport.h" + +#include + +#include + +#include +#include + +namespace OrthancStoneHelpers +{ + + inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, + const int scancodeCount) + { + using namespace OrthancStone; + int result = KeyboardModifiers_None; + + if (keyboardState != NULL) + { + if (SDL_SCANCODE_LSHIFT < scancodeCount && + keyboardState[SDL_SCANCODE_LSHIFT]) + { + result |= KeyboardModifiers_Shift; + } + + if (SDL_SCANCODE_RSHIFT < scancodeCount && + keyboardState[SDL_SCANCODE_RSHIFT]) + { + result |= KeyboardModifiers_Shift; + } + + if (SDL_SCANCODE_LCTRL < scancodeCount && + keyboardState[SDL_SCANCODE_LCTRL]) + { + result |= KeyboardModifiers_Control; + } + + if (SDL_SCANCODE_RCTRL < scancodeCount && + keyboardState[SDL_SCANCODE_RCTRL]) + { + result |= KeyboardModifiers_Control; + } + + if (SDL_SCANCODE_LALT < scancodeCount && + keyboardState[SDL_SCANCODE_LALT]) + { + result |= KeyboardModifiers_Alt; + } + + if (SDL_SCANCODE_RALT < scancodeCount && + keyboardState[SDL_SCANCODE_RALT]) + { + result |= KeyboardModifiers_Alt; + } + } + + return static_cast(result); + } + + + inline void GetPointerEvent(OrthancStone::PointerEvent& p, + const OrthancStone::ICompositor& compositor, + SDL_Event event, + const uint8_t* keyboardState, + const int scancodeCount) + { + using namespace OrthancStone; + KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); + + switch (event.button.button) + { + case SDL_BUTTON_LEFT: + p.SetMouseButton(OrthancStone::MouseButton_Left); + break; + + case SDL_BUTTON_RIGHT: + p.SetMouseButton(OrthancStone::MouseButton_Right); + break; + + case SDL_BUTTON_MIDDLE: + p.SetMouseButton(OrthancStone::MouseButton_Middle); + break; + + default: + p.SetMouseButton(OrthancStone::MouseButton_None); + break; + } + + p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); + p.SetAltModifier( (modifiers & KeyboardModifiers_Alt) != 0); + p.SetControlModifier( (modifiers & KeyboardModifiers_Control) != 0); + p.SetShiftModifier( (modifiers & KeyboardModifiers_Shift) != 0); + } + + + inline boost::shared_ptr GetSdlViewportFromWindowId( + const std::vector >& viewports, + Uint32 windowID) + { + using namespace OrthancStone; + for (size_t i = 0; i < viewports.size(); ++i) + { + boost::shared_ptr viewport = viewports[i]; + boost::shared_ptr sdlViewport = boost::dynamic_pointer_cast(viewport); + Uint32 curWindowID = sdlViewport->GetSdlWindowId(); + if (windowID == curWindowID) + return sdlViewport; + } + + return boost::shared_ptr(); + } +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/SingleFrameViewer/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/SingleFrameViewer/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 2.8.10) + +project(SdlSimpleViewer) + +include(${CMAKE_SOURCE_DIR}/../../../Resources/CMake/OrthancStoneParameters.cmake) + +if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + set(ORTHANC_BOOST_COMPONENTS program_options) + + set(USE_SYSTEM_GOOGLE_TEST ON CACHE BOOL "Use the system version of Google Test") + set(USE_GOOGLE_TEST_DEBIAN_PACKAGE OFF CACHE BOOL "Use the sources of Google Test shipped with libgtest-dev (Debian only)") + mark_as_advanced(USE_GOOGLE_TEST_DEBIAN_PACKAGE) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/DownloadPackage.cmake) + include(${ORTHANC_STONE_ROOT}/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake) + +else() + set(ENABLE_GOOGLE_TEST ON) + set(ENABLE_LOCALE ON) # Necessary for text rendering + set(ENABLE_OPENGL ON) # <== + set(ENABLE_WEB_CLIENT ON) +endif() + +set(ENABLE_DCMTK ON) # <== +set(ENABLE_SDL ON) + +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) +include(${CMAKE_SOURCE_DIR}/../Utilities.cmake) + +if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") + # This include must be after "OrthancStoneConfiguration.cmake" to + # have "BOOST_SOURCES_DIR" defined + include(${CMAKE_SOURCE_DIR}/../BoostExtendedConfiguration.cmake) +endif() + +SortFilesInSourceGroups() + +add_executable(SdlSimpleViewer + ../SdlHelpers.h + ../../Common/SampleHelpers.h + SdlSimpleViewerApplication.h + SdlSimpleViewer.cpp + ${ORTHANC_STONE_SOURCES} + ) + +target_link_libraries(SdlSimpleViewer ${DCMTK_LIBRARIES}) + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/SingleFrameViewer/CMakeSettings.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/SingleFrameViewer/CMakeSettings.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,37 @@ +ο»Ώ{ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "variables": [ + { + "name": "MSVC_MULTIPLE_PROCESSES", + "value": "True", + "type": "BOOL" + }, + { + "name": "ALLOW_DOWNLOADS", + "value": "True", + "type": "BOOL" + }, + { + "name": "STATIC_BUILD", + "value": "True", + "type": "BOOL" + }, + { + "name": "OPENSSL_NO_CAPIENG", + "value": "True", + "type": "BOOL" + }, + ] + } + ] +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,273 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlSimpleViewerApplication.h" +#include "../SdlHelpers.h" +#include "../../Common/SampleHelpers.h" + +#include "../../../Sources/Loaders/GenericLoadersContext.h" +#include "../../../Sources/StoneException.h" +#include "../../../Sources/StoneEnumerations.h" +#include "../../../Sources/StoneInitialization.h" +#include "../../../Sources/Viewport/SdlViewport.h" + +#include // For std::unique_ptr<> +#include + +#include +#include + +#include + + +std::string orthancUrl; +std::string instanceId; +int frameIndex = 0; + + +static void ProcessOptions(int argc, char* argv[]) +{ + namespace po = boost::program_options; + po::options_description desc("Usage:"); + + desc.add_options() + ("loglevel", po::value()->default_value("WARNING"), + "You can choose WARNING, INFO or TRACE for the logging level: Errors and warnings will always be displayed. (default: WARNING)") + + ("orthanc", po::value()->default_value("http://localhost:8042"), + "Base URL of the Orthanc instance") + + ("instance", po::value()->default_value("285dece8-e1956b38-cdc7d084-6ce3371e-536a9ffc"), + "Orthanc ID of the instance to display") + + ("frame_index", po::value()->default_value(0), + "The zero-based index of the frame (for multi-frame instances)") + ; + + po::variables_map vm; + try + { + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + } + catch (std::exception& e) + { + std::cerr << "Please check your command line options! (\"" << e.what() << "\")" << std::endl; + } + + if (vm.count("loglevel") > 0) + { + std::string logLevel = vm["loglevel"].as(); + OrthancStoneHelpers::SetLogLevel(logLevel); + } + + if (vm.count("orthanc") > 0) + { + // maybe check URL validity here + orthancUrl = vm["orthanc"].as(); + } + + if (vm.count("instance") > 0) + { + instanceId = vm["instance"].as(); + } + + if (vm.count("frame_index") > 0) + { + frameIndex = vm["frame_index"].as(); + } + +} + +/** + * IMPORTANT: The full arguments to "main()" are needed for SDL on + * Windows. Otherwise, one gets the linking error "undefined reference + * to `SDL_main'". https://wiki.libsdl.org/FAQWindows + **/ +int main(int argc, char* argv[]) +{ + try + { + OrthancStone::StoneInitialize(); + + ProcessOptions(argc, argv); + + //Orthanc::Logging::EnableInfoLevel(true); + //Orthanc::Logging::EnableTraceLevel(true); + + { + +#if 1 + boost::shared_ptr viewport = + OrthancStone::SdlOpenGLViewport::Create("Stone of Orthanc", 800, 600); +#else + boost::shared_ptr viewport = + OrthancStone::SdlCairoViewport::Create("Stone of Orthanc", 800, 600); +#endif + + OrthancStone::GenericLoadersContext context(1, 4, 1); + + Orthanc::WebServiceParameters orthancWebService; + orthancWebService.SetUrl(orthancUrl); + context.SetOrthancParameters(orthancWebService); + + context.StartOracle(); + + { + + boost::shared_ptr application( + SdlSimpleViewerApplication::Create(context, viewport)); + + OrthancStone::DicomSource source; + + application->LoadOrthancFrame(source, instanceId, frameIndex); + + OrthancStone::DefaultViewportInteractor interactor; + + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + bool stop = false; + while (!stop) + { + bool paint = false; + SDL_Event event; + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + stop = true; + break; + } + else if (viewport->IsRefreshEvent(event)) + { + paint = true; + } + else if (event.type == SDL_WINDOWEVENT && + (event.window.event == SDL_WINDOWEVENT_RESIZED || + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) + { + viewport->UpdateSize(event.window.data1, event.window.data2); + } + else if (event.type == SDL_WINDOWEVENT && + (event.window.event == SDL_WINDOWEVENT_SHOWN || + event.window.event == SDL_WINDOWEVENT_EXPOSED)) + { + paint = true; + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + viewport->ToggleMaximize(); + break; + + case SDLK_s: + application->FitContent(); + break; + + case SDLK_q: + stop = true; + break; + + default: + break; + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN || + event.type == SDL_MOUSEMOTION || + event.type == SDL_MOUSEBUTTONUP) + { + std::unique_ptr lock(viewport->Lock()); + if (lock->HasCompositor()) + { + OrthancStone::PointerEvent p; + OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), + event, keyboardState, scancodeCount); + + switch (event.type) + { + case SDL_MOUSEBUTTONDOWN: + lock->GetController().HandleMousePress(interactor, p, + lock->GetCompositor().GetCanvasWidth(), + lock->GetCompositor().GetCanvasHeight()); + lock->Invalidate(); + break; + + case SDL_MOUSEMOTION: + if (lock->GetController().HandleMouseMove(p)) + { + lock->Invalidate(); + } + break; + + case SDL_MOUSEBUTTONUP: + lock->GetController().HandleMouseRelease(p); + lock->Invalidate(); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + } + + if (paint) + { + viewport->Paint(); + } + + // Small delay to avoid using 100% of CPU + SDL_Delay(1); + } + } + context.StopOracle(); + } + } + + OrthancStone::StoneFinalize(); + return 0; + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "OrthancException: " << e.What(); + return -1; + } + catch (OrthancStone::StoneException& e) + { + LOG(ERROR) << "StoneException: " << e.What(); + return -1; + } + catch (std::runtime_error& e) + { + LOG(ERROR) << "Runtime error: " << e.what(); + return -1; + } + catch (...) + { + LOG(ERROR) << "Native exception"; + return -1; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/SingleFrameViewer/SdlSimpleViewerApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/SingleFrameViewer/SdlSimpleViewerApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,168 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../../Sources/Viewport/IViewport.h" +#include "../../../Sources/Loaders/DicomResourcesLoader.h" +#include "../../../Sources/Loaders/ILoadersContext.h" +#include "../../../Sources/Loaders/SeriesFramesLoader.h" +#include "../../../Sources/Loaders/SeriesThumbnailsLoader.h" + +#include // For std::unique_ptr<> + +#include + + +using OrthancStone::ILoadersContext; +using OrthancStone::ObserverBase; +using OrthancStone::IViewport; +using OrthancStone::DicomResourcesLoader; +using OrthancStone::SeriesFramesLoader; +using OrthancStone::TextureBaseSceneLayer; +using OrthancStone::DicomSource; +using OrthancStone::SeriesThumbnailsLoader; +using OrthancStone::LoadedDicomResources; +using OrthancStone::SeriesThumbnailType; +using OrthancStone::OracleScheduler; +using OrthancStone::OrthancRestApiCommand; +using OrthancStone::OracleScheduler; +using OrthancStone::OracleScheduler; +using OrthancStone::OracleScheduler; + + +class SdlSimpleViewerApplication : public ObserverBase +{ + +public: + static boost::shared_ptr Create(ILoadersContext& context, boost::shared_ptr viewport) + { + boost::shared_ptr application(new SdlSimpleViewerApplication(context, viewport)); + + { + std::unique_ptr lock(context.Lock()); + application->dicomLoader_ = DicomResourcesLoader::Create(*lock); + } + + application->Register(*application->dicomLoader_, &SdlSimpleViewerApplication::Handle); + + return application; + } + + void LoadOrthancFrame(const DicomSource& source, const std::string& instanceId, unsigned int frame) + { + std::unique_ptr lock(context_.Lock()); + + dicomLoader_->ScheduleLoadOrthancResource(boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), + 0, source, Orthanc::ResourceType_Instance, instanceId, + new Orthanc::SingleValueObject(frame)); + } + +#if 0 + void LoadDicomWebFrame(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const std::string& sopInstanceUid, + unsigned int frame) + { + std::unique_ptr lock(context_.Lock()); + + // We first must load the "/metadata" to know the number of frames + dicomLoader_->ScheduleGetDicomWeb( + boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), 0, source, + "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/instances/" + sopInstanceUid + "/metadata", + new Orthanc::SingleValueObject(frame)); + } +#endif + + void FitContent() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + +private: + ILoadersContext& context_; + boost::shared_ptr viewport_; + boost::shared_ptr dicomLoader_; + boost::shared_ptr framesLoader_; + + SdlSimpleViewerApplication(ILoadersContext& context, + boost::shared_ptr viewport) : + context_(context), + viewport_(viewport) + { + } + + void Handle(const SeriesFramesLoader::FrameLoadedMessage& message) + { + LOG(INFO) << "Frame decoded! " + << message.GetImage().GetWidth() << "x" << message.GetImage().GetHeight() + << " " << Orthanc::EnumerationToString(message.GetImage().GetFormat()); + + std::unique_ptr layer( + message.GetInstanceParameters().CreateTexture(message.GetImage())); + layer->SetLinearInterpolation(true); + + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().GetScene().SetLayer(0, layer.release()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + } + + void Handle(const DicomResourcesLoader::SuccessMessage& message) + { + if (message.GetResources()->GetSize() != 1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + //message.GetResources()->GetResource(0).Print(stdout); + + { + std::unique_ptr lock(context_.Lock()); + SeriesFramesLoader::Factory f(*message.GetResources()); + + framesLoader_ = boost::dynamic_pointer_cast( + f.Create(*lock)); + + Register( + *framesLoader_, &SdlSimpleViewerApplication::Handle); + + assert(message.HasUserPayload()); + + const Orthanc::SingleValueObject& payload = + dynamic_cast&>( + message.GetUserPayload()); + + LOG(INFO) << "Loading pixel data of frame: " << payload.GetValue(); + framesLoader_->ScheduleLoadFrame( + 0, message.GetDicomSource(), payload.GetValue(), + message.GetDicomSource().GetQualityCount() - 1 /* download best quality available */, + NULL); + } + } + +}; + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/Sdl/Utilities.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/Sdl/Utilities.cmake Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ + + +macro(GetFilenameFromPath TargetVariable Path) +#message(STATUS "GetFilenameFromPath (1): Path = ${Path} TargetVariable = ${${TargetVariable}}") +string(REPLACE "\\" "/" PathWithFwdSlashes "${Path}") +string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${PathWithFwdSlashes}") +#message(STATUS "GetFilenameFromPath (2): Path = ${Path} Path = ${PathWithFwdSlashes} TargetVariable = ${TargetVariable}") +endmacro() + +macro(GetFilePathWithoutLastExtension TargetVariable FilePath) +string(REGEX REPLACE "(^.*)\\.([^\\.]+)" "\\1" ${TargetVariable} "${FilePath}") +#message(STATUS "GetFileNameWithoutLastExtension: FilePath = ${FilePath} TargetVariable = ${${TargetVariable}}") +endmacro() + +macro(Test_GetFilePathWithoutLastExtension) +set(tmp "/prout/zi/goui.goui.cpp") +GetFilePathWithoutLastExtension(TargetVariable "${tmp}") +if(NOT ("${TargetVariable}" STREQUAL "/prout/zi/goui.goui")) + message(FATAL_ERROR "Test_GetFilePathWithoutLastExtension failed (1)") +else() + #message(STATUS "Test_GetFilePathWithoutLastExtension: <>") +endif() +endmacro() + +Test_GetFilePathWithoutLastExtension() + +macro(Test_GetFilenameFromPath) +set(tmp "/prout/../../dada/zi/goui.goui.cpp") +GetFilenameFromPath(TargetVariable "${tmp}") +if(NOT ("${TargetVariable}" STREQUAL "goui.goui.cpp")) + message(FATAL_ERROR "Test_GetFilenameFromPath failed") +else() + #message(STATUS "Test_GetFilenameFromPath: <>") +endif() +endmacro() + +Test_GetFilenameFromPath() + +macro(SortFilesInSourceGroups) + if(FALSE) + foreach(source IN LISTS ORTHANC_STONE_SOURCES) + # if("${source}" MATCHES ".*/pixman.*\\.c") + # message("pixman source: ${source}") + # elseif("${source}" MATCHES ".*/pixman.*\\.c") + # message("pixman header: ${source}") + # endif() + + if("${source}" MATCHES ".*\\.\\./.*") + message("source raw: ${source}") + #file(TO_CMAKE_PATH ${source} sourceCMakePath) + get_filename_component(sourceCMakePath ${source} ABSOLUTE) + message("source CMake: ${sourceCMakePath}") + endif() + + # returns the containing directory with forward slashes + # get_filename_component(source_path "${source}" PATH) + + # converts / to \ + # string(REPLACE "/" "\\" source_path_msvc "${source_path}") + #source_group("Stone ${source_path_msvc}" FILES "${source}") + endforeach() + endif() + + source_group("Orthanc Framework\\Sources" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*cpp") + source_group("Orthanc Framework\\Headers" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*hpp") + source_group("Orthanc Framework\\Headers" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*h") + + source_group("Stone Library\\Sources" REGULAR_EXPRESSION ".*/orthanc-stone/.*cpp") + source_group("Stone Library\\Headers" REGULAR_EXPRESSION ".*/orthanc-stone/.*hpp") + source_group("Stone Library\\Headers" REGULAR_EXPRESSION ".*/orthanc-stone/.*h") + + source_group("Stone Samples\\Source" REGULAR_EXPRESSION ".*orthanc-stone/Samples/.*\\.cpp") + source_group("Stone Samples\\Headers" REGULAR_EXPRESSION ".*orthanc-stone/Samples/.*\\.h") + + source_group("ThirdParty\\cairo" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/cairo[^/]*/.*") + source_group("ThirdParty\\pixman" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/pixman[^/]*/.*") + source_group("ThirdParty\\base64" REGULAR_EXPRESSION ".*ThirdParty/base64.*") + source_group("ThirdParty\\SDL2" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/SDL2.*") + source_group("ThirdParty\\glew" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/glew.*") + source_group("AUTOGENERATED" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/AUTOGENERATED/.*") + source_group("ThirdParty\\minizip" REGULAR_EXPRESSION ".*ThirdParty/minizip/.*") + source_group("ThirdParty\\md5" REGULAR_EXPRESSION ".*ThirdParty/md5/.*") +endmacro() + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,133 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(OrthancStone) + +# Configuration of the Emscripten compiler for WebAssembly target +# --------------------------------------------------------------- +set(USE_WASM ON CACHE BOOL "") + +set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") + +set(WASM_FLAGS "-s WASM=1 -s FETCH=1") +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") +endif() + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") +add_definitions( + -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 +) + +# Stone of Orthanc configuration +# --------------------------------------------------------------- +set(ALLOW_DOWNLOADS ON) + +include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) + +SET(ENABLE_DCMTK OFF) # Not necessary +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) # Necessary for text rendering +SET(ENABLE_WASM ON) +SET(ORTHANC_SANDBOXED ON) + +# this will set up the build system for Stone of Orthanc and will +# populate the ORTHANC_STONE_SOURCES CMake variable +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) + + +# We embed a font to be used for on-screen overlays +# --------------------------------------------------------------- + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +EmbedResources( + COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +add_library(OrthancStone STATIC + ${ORTHANC_STONE_SOURCES} + ${AUTOGENERATED_SOURCES} + ) + +################################################################################ + +# Define the WASM module +# --------------------------------------------------------------- + +project(RtViewerWasm) + +add_executable(RtViewerWasm + RtViewer/RtViewerWasm.cpp + ../Common/RtViewerApp.cpp + ../Common/RtViewerApp.h + ../Common/RtViewerView.cpp + ../Common/RtViewerView.h + ) + +target_link_libraries(RtViewerWasm OrthancStone) + +# Declare installation files for the module +# --------------------------------------------------------------- +install( + TARGETS RtViewerWasm + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/RtViewer/ + ) + +# Declare installation files for the companion files (web scaffolding) +# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js +# (the generated JS loader for the WASM module) is handled by the `install1` +# section above: it is considered to be the binary output of +# the linker. +# --------------------------------------------------------------- +install( + FILES + ${CMAKE_SOURCE_DIR}/RtViewer/RtViewerWasmApp.js + ${CMAKE_SOURCE_DIR}/RtViewer/index.html + ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.wasm + DESTINATION ${CMAKE_INSTALL_PREFIX}/RtViewer/ + ) + +################################################################################ + +# Define the WASM module +# --------------------------------------------------------------- + +project(SingleFrameViewerWasm) + +add_executable(SingleFrameViewerWasm + SingleFrameViewer/SingleFrameViewer.cpp + ) + +target_link_libraries(SingleFrameViewerWasm OrthancStone) + +# Declare installation files for the module +# --------------------------------------------------------------- +install( + TARGETS SingleFrameViewerWasm + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/SingleFrameViewer/ + ) + +# Declare installation files for the companion files (web scaffolding) +# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js +# (the generated JS loader for the WASM module) is handled by the `install1` +# section above: it is considered to be the binary output of +# the linker. +# --------------------------------------------------------------- +install( + FILES + ${CMAKE_SOURCE_DIR}/SingleFrameViewer/SingleFrameViewerApp.js + ${CMAKE_SOURCE_DIR}/SingleFrameViewer/index.html + ${CMAKE_CURRENT_BINARY_DIR}/SingleFrameViewerWasm.wasm + DESTINATION ${CMAKE_INSTALL_PREFIX}/SingleFrameViewer/ + ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/NOTES.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/NOTES.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,22 @@ + +Building WebAssembly samples using Docker +========================================= + +The script "./docker-build.sh" can be used to quickly build the +WebAssembly samples on any GNU/Linux distribution equipped with +Docker. This avoids newcomers to install Emscripten and learn the +CMake options. Just type: + +$ ./docker-build.sh Release + +After successful build, the binaries will be installed in the +following folder (i.e. in the folder "wasm-binaries" at the root of +the source distribution): + +$ ls -l ../../wasm-binaries + + +NB: The source code of the Docker build environment can be found at +the following location: +https://github.com/jodogne/OrthancDocker/tree/master/wasm-builder + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(RtViewerWasm) + +# Configuration of the Emscripten compiler for WebAssembly target +# --------------------------------------------------------------- +set(USE_WASM ON CACHE BOOL "") + +set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") + +set(WASM_FLAGS "-s WASM=1 -s FETCH=1") +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") +endif() + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") +add_definitions( + -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 +) + +# Stone of Orthanc configuration +# --------------------------------------------------------------- +set(ALLOW_DOWNLOADS ON) + +include(${CMAKE_SOURCE_DIR}/../../../Resources/CMake/OrthancStoneParameters.cmake) + +SET(ENABLE_DCMTK OFF) # Not necessary +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) # Necessary for text rendering +SET(ENABLE_WASM ON) +SET(ORTHANC_SANDBOXED ON) + +# this will set up the build system for Stone of Orthanc and will +# populate the ORTHANC_STONE_SOURCES CMake variable +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) + + +# We embed a font to be used for on-screen overlays +# --------------------------------------------------------------- + +DownloadPackage( + "a24b8136b8f3bb93f166baf97d9328de" + "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" + "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") + +EmbedResources( + COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut + UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf + ) + +# Define the WASM module +# --------------------------------------------------------------- +add_executable(RtViewerWasm + RtViewerWasm.cpp + ../../Common/RtViewerApp.cpp + ../../Common/RtViewerApp.h + ../../Common/RtViewerView.cpp + ../../Common/RtViewerView.h + ${ORTHANC_STONE_SOURCES} + ${AUTOGENERATED_SOURCES} + ) + +# Declare installation files for the module +# --------------------------------------------------------------- +install( + TARGETS RtViewerWasm + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} + ) + +# Declare installation files for the companion files (web scaffolding) +# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js +# (the generated JS loader for the WASM module) is handled by the `install1` +# section above: it is considered to be the binary output of +# the linker. +# --------------------------------------------------------------- +install( + FILES + ${CMAKE_SOURCE_DIR}/RtViewerWasmApp.js + ${CMAKE_SOURCE_DIR}/index.html + ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.wasm + DESTINATION ${CMAKE_INSTALL_PREFIX} + ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/OBSOLETE.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/OBSOLETE.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,559 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../../../Framework/Oracle/SleepOracleCommand.h" +#include "../../../Framework/Oracle/WebAssemblyOracle.h" +#include "../../../Framework/Scene2D/GrayscaleStyleConfigurator.h" +#include "../../../Framework/Scene2D/OpenGLCompositor.h" +#include "../../../Framework/Scene2D/PanSceneTracker.h" +#include "../../../Framework/Scene2D/RotateSceneTracker.h" +#include "../../../Framework/Scene2D/ZoomSceneTracker.h" +#include "../../../Framework/Scene2DViewport/UndoStack.h" +#include "../../../Framework/Scene2DViewport/ViewportController.h" +#include "../../../Framework/StoneInitialization.h" +#include "../../../Framework/Viewport/WebAssemblyViewport.h" +#include "../../../Framework/Volumes/VolumeSceneLayerSource.h" + +#include + +#include +#include + +#include + + +class ViewportManager; + +static const unsigned int FONT_SIZE = 32; + +boost::shared_ptr ct_(new OrthancStone::DicomVolumeImage); +boost::shared_ptr loader_; +std::unique_ptr widget1_; +std::unique_ptr widget2_; +std::unique_ptr widget3_; +//OrthancStone::MessageBroker broker_; +//OrthancStone::WebAssemblyOracle oracle_(broker_); +std::unique_ptr tracker_; +static std::map arguments_; +static bool ctrlDown_ = false; + + +#if 0 + +// use the one from WebAssemblyViewport +static OrthancStone::PointerEvent* ConvertMouseEvent( + const EmscriptenMouseEvent& source, + OrthancStone::IViewport& viewport) +{ + + std::unique_ptr target( + new OrthancStone::PointerEvent); + + target->AddPosition(viewport.GetPixelCenterCoordinates( + source.targetX, source.targetY)); + target->SetAltModifier(source.altKey); + target->SetControlModifier(source.ctrlKey); + target->SetShiftModifier(source.shiftKey); + + return target.release(); +} +#endif + + +EM_BOOL OnMouseEvent(int eventType, + const EmscriptenMouseEvent *mouseEvent, + void *userData) +{ + if (mouseEvent != NULL && + userData != NULL) + { + boost::shared_ptr& viewport = + *reinterpret_cast*>(userData); + + std::unique_ptr lock = (*viewport)->Lock(); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + switch (eventType) + { + case EMSCRIPTEN_EVENT_CLICK: + { + static unsigned int count = 0; + char buf[64]; + sprintf(buf, "click %d", count++); + + std::unique_ptr layer(new OrthancStone::TextSceneLayer); + layer->SetText(buf); + scene.SetLayer(100, layer.release()); + lock->Invalidate(); + break; + } + + case EMSCRIPTEN_EVENT_MOUSEDOWN: + { + boost::shared_ptr t; + + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + + switch (mouseEvent->button) + { + case 0: // Left button + emscripten_console_log("Creating RotateSceneTracker"); + t.reset(new OrthancStone::RotateSceneTracker( + viewport, *event)); + break; + + case 1: // Middle button + emscripten_console_log("Creating PanSceneTracker"); + LOG(INFO) << "Creating PanSceneTracker" ; + t.reset(new OrthancStone::PanSceneTracker( + viewport, *event)); + break; + + case 2: // Right button + emscripten_console_log("Creating ZoomSceneTracker"); + t.reset(new OrthancStone::ZoomSceneTracker( + viewport, *event, controller->GetViewport().GetCanvasWidth())); + break; + + default: + break; + } + } + + if (t.get() != NULL) + { + tracker_.reset( + new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier())); + controller->GetViewport().Refresh(); + } + + break; + } + + case EMSCRIPTEN_EVENT_MOUSEMOVE: + if (tracker_.get() != NULL) + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + tracker_->PointerMove(*event); + controller->GetViewport().Refresh(); + } + break; + + case EMSCRIPTEN_EVENT_MOUSEUP: + if (tracker_.get() != NULL) + { + std::unique_ptr event( + ConvertMouseEvent(*mouseEvent, controller->GetViewport())); + tracker_->PointerUp(*event); + controller->GetViewport().Refresh(); + if (!tracker_->IsAlive()) + tracker_.reset(); + } + break; + + default: + break; + } + } + + return true; +} + + +void SetupEvents(const std::string& canvas, + boost::shared_ptr& viewport) +{ + emscripten_set_mousedown_callback(canvas.c_str(), &viewport, false, OnMouseEvent); + emscripten_set_mousemove_callback(canvas.c_str(), &viewport, false, OnMouseEvent); + emscripten_set_mouseup_callback(canvas.c_str(), &viewport, false, OnMouseEvent); +} + + class ViewportManager : public OrthanStone::ObserverBase + { + private: + OrthancStone::WebAssemblyViewport viewport_; + std::unique_ptr source_; + VolumeProjection projection_; + std::vector planes_; + size_t currentPlane_; + + void Handle(const DicomVolumeImage::GeometryReadyMessage& message) + { + LOG(INFO) << "Geometry is available"; + + const VolumeImageGeometry& geometry = message.GetOrigin().GetGeometry(); + + const unsigned int depth = geometry.GetProjectionDepth(projection_); + + // select an initial cutting plane halfway through the volume + currentPlane_ = depth / 2; + + planes_.resize(depth); + + for (unsigned int z = 0; z < depth; z++) + { + planes_[z] = geometry.GetProjectionSlice(projection_, z); + } + + Refresh(); + + viewport_.FitContent(); + } + + public: + ViewportManager(const std::string& canvas, + VolumeProjection projection) : + projection_(projection), + currentPlane_(0) + { + viewport_ = OrthancStone::WebGLViewport::Create(canvas); + } + + void UpdateSize() + { + viewport_.UpdateSize(); + } + + void SetSlicer(int layerDepth, + const boost::shared_ptr& slicer, + IObservable& loader, + ILayerStyleConfigurator* configurator) + { + if (source_.get() != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Only one slicer can be registered"); + } + + loader.RegisterObserverCallback( + new Callable + (*this, &ViewportManager::Handle)); + + source_.reset(new VolumeSceneLayerSource(viewport_.GetScene(), layerDepth, slicer)); + + if (configurator != NULL) + { + source_->SetConfigurator(configurator); + } + } + + void Refresh() + { + if (source_.get() != NULL && + currentPlane_ < planes_.size()) + { + source_->Update(planes_[currentPlane_]); + viewport_.Refresh(); + } + } + + size_t GetSlicesCount() const + { + return planes_.size(); + } + + void Scroll(int delta) + { + if (!planes_.empty()) + { + int tmp = static_cast(currentPlane_) + delta; + unsigned int next; + + if (tmp < 0) + { + next = 0; + } + else if (tmp >= static_cast(planes_.size())) + { + next = planes_.size() - 1; + } + else + { + next = static_cast(tmp); + } + + if (next != currentPlane_) + { + currentPlane_ = next; + Refresh(); + } + } + } + }; +} + + +EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) +{ + try + { + if (widget1_.get() != NULL) + { + widget1_->UpdateSize(); + } + + if (widget2_.get() != NULL) + { + widget2_->UpdateSize(); + } + + if (widget3_.get() != NULL) + { + widget3_->UpdateSize(); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while updating canvas size: " << e.What(); + } + + return true; +} + +EM_BOOL OnAnimationFrame(double time, void *userData) +{ + try + { + if (widget1_.get() != NULL) + { + widget1_->Refresh(); + } + + if (widget2_.get() != NULL) + { + widget2_->Refresh(); + } + + if (widget3_.get() != NULL) + { + widget3_->Refresh(); + } + + return true; + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception in the animation loop, stopping now: " << e.What(); + return false; + } +} + +EM_BOOL OnMouseWheel(int eventType, + const EmscriptenWheelEvent *wheelEvent, + void *userData) +{ + try + { + if (userData != NULL) + { + int delta = 0; + + if (wheelEvent->deltaY < 0) + { + delta = -1; + } + + if (wheelEvent->deltaY > 0) + { + delta = 1; + } + + OrthancStone::ViewportManager& widget = + *reinterpret_cast(userData); + + if (ctrlDown_) + { + delta *= static_cast(widget.GetSlicesCount() / 10); + } + + widget.Scroll(delta); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception in the wheel event: " << e.What(); + } + + return true; +} + + +EM_BOOL OnKeyDown(int eventType, + const EmscriptenKeyboardEvent *keyEvent, + void *userData) +{ + ctrlDown_ = keyEvent->ctrlKey; + return false; +} + + +EM_BOOL OnKeyUp(int eventType, + const EmscriptenKeyboardEvent *keyEvent, + void *userData) +{ + ctrlDown_ = false; + return false; +} + + + +#if 0 +namespace OrthancStone +{ + class TestSleep : public IObserver + { + private: + WebAssemblyOracle& oracle_; + + void Schedule() + { + oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(2000)); + } + + void Handle(const SleepOracleCommand::TimeoutMessage& message) + { + LOG(INFO) << "TIMEOUT"; + Schedule(); + } + + public: + TestSleep(MessageBroker& broker, + WebAssemblyOracle& oracle) : + IObserver(broker), + oracle_(oracle) + { + oracle.RegisterObserverCallback( + new Callable + (*this, &TestSleep::Handle)); + + LOG(INFO) << "STARTING"; + Schedule(); + } + }; + + //static TestSleep testSleep(broker_, oracle_); +} +#endif + +static bool GetArgument(std::string& value, + const std::string& key) +{ + std::map::const_iterator found = arguments_.find(key); + + if (found == arguments_.end()) + { + return false; + } + else + { + value = found->second; + return true; + } +} + + +extern "C" +{ + int main(int argc, char const *argv[]) + { + OrthancStone::StoneInitialize(); + Orthanc::Logging::EnableInfoLevel(true); + // Orthanc::Logging::EnableTraceLevel(true); + EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); + } + + EMSCRIPTEN_KEEPALIVE + void SetArgument(const char* key, const char* value) + { + // This is called for each GET argument (cf. "app.js") + LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; + arguments_[key] = value; + } + + EMSCRIPTEN_KEEPALIVE + void Initialize() + { + try + { + oracle_.SetOrthancRoot(".."); + + loader_.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct_, oracle_, oracle_)); + + widget1_.reset(new OrthancStone::ViewportManager("mycanvas1", OrthancStone::VolumeProjection_Axial)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget1_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget1_->UpdateSize(); + + widget2_.reset(new OrthancStone::ViewportManager("mycanvas2", OrthancStone::VolumeProjection_Coronal)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget2_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget2_->UpdateSize(); + + widget3_.reset(new OrthancStone::ViewportManager("mycanvas3", OrthancStone::VolumeProjection_Sagittal)); + { + std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget3_->SetSlicer(0, loader_, *loader_, style.release()); + } + widget3_->UpdateSize(); + + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnWindowResize); // DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 !! + + emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnMouseWheel); + emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnMouseWheel); + emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnMouseWheel); + + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); + + //emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); + + std::string ct; + if (GetArgument(ct, "ct")) + { + //loader_->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); + loader_->LoadSeries(ct); + } + else + { + LOG(ERROR) << "No Orthanc identifier for the CT series was provided"; + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception during Initialize(): " << e.What(); + } + } +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasm.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,198 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../../Common/RtViewerApp.h" +#include "../../Common/RtViewerView.h" +#include "../../Common/SampleHelpers.h" + +// Stone of Orthanc includes +#include "../../../Sources/Loaders/WebAssemblyLoadersContext.h" +#include "../../../Sources/StoneException.h" +#include "../../../Sources/StoneInitialization.h" +#include "../../../Sources/Viewport/WebGLViewport.h" +//#include "../../../Sources/OpenGL/WebAssemblyOpenGLContext.h" + +#include + +#include +#include +// #include this include might be necessary in more recent boost versions + +#include +#include + + +#define DISPATCH_JAVASCRIPT_EVENT(name) \ + EM_ASM( \ + const customEvent = document.createEvent("CustomEvent"); \ + customEvent.initCustomEvent(name, false, false, undefined); \ + window.dispatchEvent(customEvent); \ + ); + +#define EXTERN_CATCH_EXCEPTIONS \ + catch (Orthanc::OrthancException& e) \ + { \ + LOG(ERROR) << "OrthancException: " << e.What(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (OrthancStone::StoneException& e) \ + { \ + LOG(ERROR) << "StoneException: " << e.What(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (std::exception& e) \ + { \ + LOG(ERROR) << "Runtime error: " << e.what(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (...) \ + { \ + LOG(ERROR) << "Native exception"; \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } + +namespace OrthancStone +{ + // typedef EM_BOOL (*OnMouseWheelFunc)(int eventType, const EmscriptenWheelEvent* wheelEvent, void* userData); + + EM_BOOL RtViewerView_Scroll(int eventType, + const EmscriptenWheelEvent* wheelEvent, + void* userData) + { + RtViewerView* that = reinterpret_cast(userData); + + int delta = 0; + if (wheelEvent->deltaY < 0) + delta = -1; + if (wheelEvent->deltaY > 0) + delta = 1; + + that->Scroll(delta); + + return 1; + } + + boost::shared_ptr RtViewerView::CreateViewport( + const std::string& canvasId) + { + boost::shared_ptr viewport = WebGLViewport::Create(canvasId); + + void* userData = reinterpret_cast(this); + + // manually add the mouse wheel handler + + std::string selector = "#" + canvasId; + + emscripten_set_wheel_callback_on_thread( + selector.c_str(), + userData, + false, + &RtViewerView_Scroll, + EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); + + return viewport; + } + + void RtViewerView::TakeScreenshot(const std::string& target, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + + void RtViewerApp::RunWasm() + { + loadersContext_.reset(new OrthancStone::WebAssemblyLoadersContext(1, 4, 1)); + + // we are in WASM --> downcast to concrete type + boost::shared_ptr loadersContext = + boost::dynamic_pointer_cast(loadersContext_); + + if (HasArgument("orthanc")) + loadersContext->SetLocalOrthanc(GetArgument("orthanc")); + else + loadersContext->SetLocalOrthanc(".."); + + loadersContext->SetDicomCacheSize(128 * 1024 * 1024); // 128MB + + CreateLoaders(); + + CreateView("RtViewer_Axial", VolumeProjection_Axial); + CreateView("RtViewer_Coronal", VolumeProjection_Coronal); + CreateView("RtViewer_Sagittal", VolumeProjection_Sagittal); + + for (size_t i = 0; i < views_.size(); ++i) + { + views_[i]->PrepareViewport(); + } + + StartLoaders(); + + DefaultViewportInteractor interactor; + } +} + +extern "C" +{ + boost::shared_ptr g_app; + + int main(int argc, char const *argv[]) + { + try + { + OrthancStone::StoneInitialize(); + Orthanc::Logging::Initialize(); + Orthanc::Logging::EnableTraceLevel(true); + + LOG(WARNING) << "Initializing native Stone"; + + LOG(WARNING) << "Compiled with Emscripten " << __EMSCRIPTEN_major__ + << "." << __EMSCRIPTEN_minor__ + << "." << __EMSCRIPTEN_tiny__; + + LOG(INFO) << "Endianness: " << Orthanc::EnumerationToString(Orthanc::Toolbox::DetectEndianness()); + + g_app = OrthancStone::RtViewerApp::Create(); + + DISPATCH_JAVASCRIPT_EVENT("WasmModuleInitialized"); + } + EXTERN_CATCH_EXCEPTIONS; + } + + EMSCRIPTEN_KEEPALIVE + void Initialize(const char* canvasId) + { + try + { + g_app->RunWasm(); + } + EXTERN_CATCH_EXCEPTIONS; + } + + EMSCRIPTEN_KEEPALIVE + void SetArgument(const char* key, const char* value) + { + // This is called for each GET argument (cf. "app.js") + LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; + g_app->SetArgument(key, value); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasmApp.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasmApp.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,85 @@ + +// This object wraps the functions exposed by the wasm module + +const WasmModuleWrapper = function() { + this._InitializeViewport = undefined; +}; + +WasmModuleWrapper.prototype.Setup = function(Module) { + this._SetArgument = Module.cwrap('SetArgument', null, [ 'string', 'string' ]); + this._Initialize = Module.cwrap('Initialize', null, [ 'string' ]); +}; + +WasmModuleWrapper.prototype.SetArgument = function(key, value) { + this._SetArgument(key, value); +}; + +WasmModuleWrapper.prototype.Initialize = function(canvasId) { + this._Initialize(canvasId); +}; + +var wasmModuleWrapper = new WasmModuleWrapper(); + +$(document).ready(function() { + + window.addEventListener('WasmModuleInitialized', function() { + + // bind the C++ global functions + wasmModuleWrapper.Setup(Module); + + console.warn('Native C++ module initialized'); + + // Loop over the GET arguments + var parameters = window.location.search.substr(1); + if (parameters != null && parameters != '') { + var tokens = parameters.split('&'); + for (var i = 0; i < tokens.length; i++) { + var arg = tokens[i].split('='); + if (arg.length == 2) { + // Send each GET argument to WebAssembly + wasmModuleWrapper.SetArgument(arg[0], decodeURIComponent(arg[1])); + } + } + } + wasmModuleWrapper.Initialize(); + }); + + window.addEventListener('StoneException', function() { + alert('Exception caught in C++ code'); + }); + + var scriptSource; + + if ('WebAssembly' in window) { + console.warn('Loading WebAssembly'); + scriptSource = 'RtViewerWasm.js'; + } else { + console.error('Your browser does not support WebAssembly!'); + } + + // Option 1: Loading script using plain HTML + + /* + var script = document.createElement('script'); + script.src = scriptSource; + script.type = 'text/javascript'; + document.body.appendChild(script); + */ + + // Option 2: Loading script using AJAX (gives the opportunity to + // report explicit errors) + + axios.get(scriptSource) + .then(function (response) { + var script = document.createElement('script'); + script.innerHTML = response.data; + script.type = 'text/javascript'; + document.body.appendChild(script); + }) + .catch(function (error) { + alert('Cannot load the WebAssembly framework'); + }); +}); + +// http://localhost:9979/rtviewer/index.html?loglevel=trace&ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasmWrapper.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/RtViewerWasmWrapper.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,27 @@ + +const Stone = function() { + this._InitializeViewport = undefined; + this._LoadOrthanc = undefined; + this._LoadDicomWeb = undefined; +}; + +Stone.prototype.Setup = function(Module) { + this._InitializeViewport = Module.cwrap('InitializeViewport', null, [ 'string' ]); + this._LoadOrthanc = Module.cwrap('LoadOrthanc', null, [ 'string', 'int' ]); + this._LoadDicomWeb = Module.cwrap('LoadDicomWeb', null, [ 'string', 'string', 'string', 'string', 'int' ]); +}; + +Stone.prototype.InitializeViewport = function(canvasId) { + this._InitializeViewport(canvasId); +}; + +Stone.prototype.LoadOrthanc = function(instance, frame) { + this._LoadOrthanc(instance, frame); +}; + +Stone.prototype.LoadDicomWeb = function(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame) { + this._LoadDicomWeb(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame); +}; + +var stone = new Stone(); + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/RtViewer/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/RtViewer/index.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +ο»Ώ + + + Stone of Orthanc Single Frame Viewer + + + + + + + + + + + + + + + + + + + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 2.8.3) + +project(SingleFrameViewer) + +# Configuration of the Emscripten compiler for WebAssembly target +# --------------------------------------------------------------- +set(USE_WASM ON CACHE BOOL "") + +set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") + +set(WASM_FLAGS "-s WASM=1 -s FETCH=1") +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") +endif() + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") +add_definitions( + -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 +) + +# Stone of Orthanc configuration +# --------------------------------------------------------------- +set(ALLOW_DOWNLOADS ON) + +include(${CMAKE_SOURCE_DIR}/../../../Resources/CMake/OrthancStoneParameters.cmake) + +SET(ENABLE_DCMTK OFF) # Not necessary +SET(ENABLE_GOOGLE_TEST OFF) +SET(ENABLE_LOCALE ON) # Necessary for text rendering +SET(ENABLE_WASM ON) +SET(ORTHANC_SANDBOXED ON) + +# this will set up the build system for Stone of Orthanc and will +# populate the ORTHANC_STONE_SOURCES CMake variable +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) + +# Define the WASM module +# --------------------------------------------------------------- +add_executable(SingleFrameViewerWasm + SingleFrameViewer.cpp + ${ORTHANC_STONE_SOURCES} + ) + +# Declare installation files for the module +# --------------------------------------------------------------- +install( + TARGETS SingleFrameViewerWasm + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} + ) + +# Declare installation files for the companion files (web scaffolding) +# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js +# (the generated JS loader for the WASM module) is handled by the `install1` +# section above: it is considered to be the binary output of +# the linker. +# --------------------------------------------------------------- +install( + FILES + ${CMAKE_SOURCE_DIR}/SingleFrameViewerApp.js + ${CMAKE_SOURCE_DIR}/index.html + ${CMAKE_CURRENT_BINARY_DIR}/SingleFrameViewerWasm.wasm + DESTINATION ${CMAKE_INSTALL_PREFIX} + ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/CMakeSettings.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/CMakeSettings.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,39 @@ +ο»Ώ{ + "configurations": [ + { + "name": "wasm32-RelWithDebInfo", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + //"inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "cmakeToolchain": "C:/osi/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake", + "intelliSenseMode": "windows-clang-x64", + "variables": [ + { + "name": "CMAKE_BUILD_TYPE", + "value": "RelWithDebInfo", + "type": "STRING" + }, + { + "name": "ALLOW_DOWNLOADS", + "value": "True", + "type": "BOOL" + }, + { + "name": "STATIC_BUILD", + "value": "True", + "type": "BOOL" + }, + { + "name": "OPENSSL_NO_CAPIENG", + "value": "True", + "type": "BOOL" + } + ] + } + ] +} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,169 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SingleFrameViewerApplication.h" + +#include "../../../Sources/Loaders/WebAssemblyLoadersContext.h" +#include "../../../Sources/StoneException.h" +#include "../../../Sources/StoneInitialization.h" + +#include // For std::unique_ptr<> +#include + +#include +#include + + +#define DISPATCH_JAVASCRIPT_EVENT(name) \ + EM_ASM( \ + const customEvent = document.createEvent("CustomEvent"); \ + customEvent.initCustomEvent(name, false, false, undefined); \ + window.dispatchEvent(customEvent); \ + ); + +#define EXTERN_CATCH_EXCEPTIONS \ + catch (Orthanc::OrthancException& e) \ + { \ + LOG(ERROR) << "OrthancException: " << e.What(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (OrthancStone::StoneException& e) \ + { \ + LOG(ERROR) << "StoneException: " << e.What(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (std::exception& e) \ + { \ + LOG(ERROR) << "Runtime error: " << e.what(); \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } \ + catch (...) \ + { \ + LOG(ERROR) << "Native exception"; \ + DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ + } + + + +namespace OrthancStone +{ +} + +static std::unique_ptr context_; +static boost::shared_ptr application_; + +extern "C" +{ + int main(int argc, char const *argv[]) + { + try + { + Orthanc::Logging::Initialize(); + Orthanc::Logging::EnableInfoLevel(true); + //Orthanc::Logging::EnableTraceLevel(true); + LOG(WARNING) << "Initializing native Stone"; + + LOG(WARNING) << "Compiled with Emscripten " << __EMSCRIPTEN_major__ + << "." << __EMSCRIPTEN_minor__ + << "." << __EMSCRIPTEN_tiny__; + + LOG(INFO) << "Endianness: " << Orthanc::EnumerationToString(Orthanc::Toolbox::DetectEndianness()); + context_.reset(new OrthancStone::WebAssemblyLoadersContext(1, 4, 1)); + context_->SetLocalOrthanc(".."); + context_->SetDicomCacheSize(128 * 1024 * 1024); // 128MB + + DISPATCH_JAVASCRIPT_EVENT("WasmModuleInitialized"); + } + EXTERN_CATCH_EXCEPTIONS; + + return 0; + } + + EMSCRIPTEN_KEEPALIVE + void InitializeViewport(const char* canvasId) + { + try + { + if (context_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "The loaders context is not available yet"); + } + + if (application_.get() != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Only one single viewport is available for this application"); + } + + boost::shared_ptr viewport(OrthancStone::GetWebGLViewportsRegistry().Add(canvasId)); + application_ = OrthancStone::Application::Create(*context_, viewport); + + { + OrthancStone::WebGLViewportsRegistry::Accessor accessor( + OrthancStone::GetWebGLViewportsRegistry(), canvasId); + + if (accessor.IsValid()) + { + accessor.GetViewport().Invalidate(); + } + } + } + EXTERN_CATCH_EXCEPTIONS; + } + + + EMSCRIPTEN_KEEPALIVE + void LoadFromOrthanc(const char* instance, + int frame) + { + try + { + if (application_.get() != NULL) + { + OrthancStone::DicomSource source; + application_->LoadOrthancFrame(source, instance, frame); + } + } + EXTERN_CATCH_EXCEPTIONS; + } + + + EMSCRIPTEN_KEEPALIVE + void LoadFromDicomWeb(const char* server, + const char* studyInstanceUid, + const char* seriesInstanceUid, + const char* sopInstanceUid, + int frame) + { + try + { + if (application_.get() != NULL) + { + OrthancStone::DicomSource source; + source.SetDicomWebThroughOrthancSource(server); + application_->LoadDicomWebFrame(source, studyInstanceUid, seriesInstanceUid, + sopInstanceUid, frame); + } + } + EXTERN_CATCH_EXCEPTIONS; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApp.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApp.js Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,74 @@ + +// This object wraps the functions exposed by the wasm module + +const WasmModuleWrapper = function() { + this._InitializeViewport = undefined; + this._LoadFromOrthanc = undefined; +}; + +WasmModuleWrapper.prototype.Setup = function(Module) { + this._InitializeViewport = Module.cwrap('InitializeViewport', null, [ 'string' ]); + this._LoadFromOrthanc = Module.cwrap('LoadFromOrthanc', null, [ 'string', 'int' ]); +}; + +WasmModuleWrapper.prototype.InitializeViewport = function(canvasId) { + this._InitializeViewport(canvasId); +}; + +WasmModuleWrapper.prototype.LoadFromOrthanc = function(instance, frame) { + this._LoadFromOrthanc(instance, frame); +}; + +var wasmModuleWrapper = new WasmModuleWrapper(); + +$(document).ready(function() { + + window.addEventListener('WasmModuleInitialized', function() { + wasmModuleWrapper.Setup(Module); + console.warn('Native C++ module initialized'); + + wasmModuleWrapper.InitializeViewport('viewport'); + }); + + window.addEventListener('StoneException', function() { + alert('Exception caught in C++ code'); + }); + + var scriptSource; + + if ('WebAssembly' in window) { + console.warn('Loading WebAssembly'); + scriptSource = 'SingleFrameViewerWasm.js'; + } else { + console.error('Your browser does not support WebAssembly!'); + } + + // Option 1: Loading script using plain HTML + + /* + var script = document.createElement('script'); + script.src = scriptSource; + script.type = 'text/javascript'; + document.body.appendChild(script); + */ + + // Option 2: Loading script using AJAX (gives the opportunity to + // report explicit errors) + + axios.get(scriptSource) + .then(function (response) { + var script = document.createElement('script'); + script.innerHTML = response.data; + script.type = 'text/javascript'; + document.body.appendChild(script); + }) + .catch(function (error) { + alert('Cannot load the WebAssembly framework'); + }); +}); + + +$('#orthancLoad').click(function() { + wasmModuleWrapper.LoadFromOrthanc($('#orthancInstance').val(), + $('#orthancFrame').val()); +}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,502 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../../Sources/Loaders/DicomResourcesLoader.h" +#include "../../../Sources/Loaders/ILoadersContext.h" +#include "../../../Sources/Loaders/SeriesFramesLoader.h" +#include "../../../Sources/Loaders/SeriesThumbnailsLoader.h" +#include "../../../Sources/Viewport/IViewport.h" + +#include // For std::unique_ptr<> + +#include + + +namespace OrthancStone +{ + class Application : public ObserverBase + { + private: + ILoadersContext& context_; + boost::shared_ptr viewport_; + boost::shared_ptr dicomLoader_; + boost::shared_ptr framesLoader_; + + Application(ILoadersContext& context, + boost::shared_ptr viewport) : + context_(context), + viewport_(viewport) + { + } + + void Handle(const SeriesFramesLoader::FrameLoadedMessage& message) + { + LOG(INFO) << "Frame decoded! " + << message.GetImage().GetWidth() << "x" << message.GetImage().GetHeight() + << " " << Orthanc::EnumerationToString(message.GetImage().GetFormat()); + + std::unique_ptr layer( + message.GetInstanceParameters().CreateTexture(message.GetImage())); + layer->SetLinearInterpolation(true); + + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().GetScene().SetLayer(0, layer.release()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + } + + void Handle(const DicomResourcesLoader::SuccessMessage& message) + { + if (message.GetResources()->GetSize() != 1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + //message.GetResources()->GetResource(0).Print(stdout); + + { + std::unique_ptr lock(context_.Lock()); + SeriesFramesLoader::Factory f(*message.GetResources()); + + framesLoader_ = boost::dynamic_pointer_cast(f.Create(*lock)); + Register(*framesLoader_, &Application::Handle); + + assert(message.HasUserPayload()); + const Orthanc::SingleValueObject& payload = + dynamic_cast&>(message.GetUserPayload()); + + LOG(INFO) << "Loading pixel data of frame: " << payload.GetValue(); + framesLoader_->ScheduleLoadFrame( + 0, message.GetDicomSource(), payload.GetValue(), + message.GetDicomSource().GetQualityCount() - 1 /* download best quality available */, + NULL); + } + } + + public: + static boost::shared_ptr Create(ILoadersContext& context, + boost::shared_ptr viewport) + { + boost::shared_ptr application(new Application(context, viewport)); + + { + std::unique_ptr lock(context.Lock()); + application->dicomLoader_ = DicomResourcesLoader::Create(*lock); + } + + application->Register(*application->dicomLoader_, &Application::Handle); + + return application; + } + + void LoadOrthancFrame(const DicomSource& source, + const std::string& instanceId, + unsigned int frame) + { + std::unique_ptr lock(context_.Lock()); + + dicomLoader_->ScheduleLoadOrthancResource( + boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), + 0, source, Orthanc::ResourceType_Instance, instanceId, + new Orthanc::SingleValueObject(frame)); + } + + void LoadDicomWebFrame(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const std::string& sopInstanceUid, + unsigned int frame) + { + std::unique_ptr lock(context_.Lock()); + + // We first must load the "/metadata" to know the number of frames + dicomLoader_->ScheduleGetDicomWeb( + boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), 0, source, + "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/instances/" + sopInstanceUid + "/metadata", + new Orthanc::SingleValueObject(frame)); + } + + void FitContent() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + }; + + + + class IWebViewerLoadersObserver : public boost::noncopyable + { + public: + virtual ~IWebViewerLoadersObserver() + { + } + + virtual void SignalSeriesUpdated(LoadedDicomResources& series) = 0; + + virtual void SignalThumbnailLoaded(const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + SeriesThumbnailType type) = 0; + }; + + + class WebViewerLoaders : public ObserverBase + { + private: + static const int PRIORITY_ADD_RESOURCES = 0; + static const int PRIORITY_THUMBNAILS = OracleScheduler::PRIORITY_LOW + 100; + + enum Type + { + Type_Orthanc = 1, + Type_DicomWeb = 2 + }; + + ILoadersContext& context_; + std::unique_ptr observer_; + bool loadThumbnails_; + DicomSource source_; + std::set scheduledSeries_; + std::set scheduledThumbnails_; + std::set scheduledStudies_; + boost::shared_ptr loadedSeries_; + boost::shared_ptr loadedStudies_; + boost::shared_ptr resourcesLoader_; + boost::shared_ptr thumbnailsLoader_; + + WebViewerLoaders(ILoadersContext& context, + IWebViewerLoadersObserver* observer) : + context_(context), + observer_(observer), + loadThumbnails_(false) + { + loadedSeries_ = boost::make_shared(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); + loadedStudies_ = boost::make_shared(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID); + } + + static Orthanc::IDynamicObject* CreatePayload(Type type) + { + return new Orthanc::SingleValueObject(type); + } + + void HandleThumbnail(const SeriesThumbnailsLoader::SuccessMessage& message) + { + if (observer_.get() != NULL) + { + observer_->SignalThumbnailLoaded(message.GetStudyInstanceUid(), + message.GetSeriesInstanceUid(), + message.GetType()); + } + } + + void HandleLoadedResources(const DicomResourcesLoader::SuccessMessage& message) + { + LoadedDicomResources series(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); + + switch (dynamic_cast&>(message.GetUserPayload()).GetValue()) + { + case Type_DicomWeb: + { + for (size_t i = 0; i < loadedSeries_->GetSize(); i++) + { + std::string study; + if (loadedSeries_->GetResource(i).LookupStringValue( + study, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && + loadedStudies_->HasResource(study)) + { + Orthanc::DicomMap m; + m.Assign(loadedSeries_->GetResource(i)); + loadedStudies_->MergeResource(m, study); + series.AddResource(m); + } + } + + break; + } + + case Type_Orthanc: + { + for (size_t i = 0; i < message.GetResources()->GetSize(); i++) + { + series.AddResource(message.GetResources()->GetResource(i)); + } + + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + if (loadThumbnails_ && + (!source_.IsDicomWeb() || + source_.HasDicomWebRendered())) + { + for (size_t i = 0; i < series.GetSize(); i++) + { + std::string patientId, studyInstanceUid, seriesInstanceUid; + if (series.GetResource(i).LookupStringValue(patientId, Orthanc::DICOM_TAG_PATIENT_ID, false) && + series.GetResource(i).LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && + series.GetResource(i).LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) && + scheduledThumbnails_.find(seriesInstanceUid) == scheduledThumbnails_.end()) + { + scheduledThumbnails_.insert(seriesInstanceUid); + thumbnailsLoader_->ScheduleLoadThumbnail(source_, patientId, studyInstanceUid, seriesInstanceUid); + } + } + } + + if (observer_.get() != NULL && + series.GetSize() > 0) + { + observer_->SignalSeriesUpdated(series); + } + } + + void HandleOrthancRestApi(const OrthancRestApiCommand::SuccessMessage& message) + { + Json::Value body; + message.ParseJsonBody(body); + + if (body.type() != Json::arrayValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + else + { + for (Json::Value::ArrayIndex i = 0; i < body.size(); i++) + { + if (body[i].type() == Json::stringValue) + { + AddOrthancSeries(body[i].asString()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + } + } + + public: + static boost::shared_ptr Create(ILoadersContext& context, + const DicomSource& source, + bool loadThumbnails, + IWebViewerLoadersObserver* observer) + { + boost::shared_ptr application(new WebViewerLoaders(context, observer)); + application->source_ = source; + application->loadThumbnails_ = loadThumbnails; + + { + std::unique_ptr lock(context.Lock()); + + application->resourcesLoader_ = DicomResourcesLoader::Create(*lock); + + { + SeriesThumbnailsLoader::Factory f; + f.SetPriority(PRIORITY_THUMBNAILS); + application->thumbnailsLoader_ = boost::dynamic_pointer_cast(f.Create(*lock)); + } + + application->Register( + lock->GetOracleObservable(), &WebViewerLoaders::HandleOrthancRestApi); + + application->Register( + *application->resourcesLoader_, &WebViewerLoaders::HandleLoadedResources); + + application->Register( + *application->thumbnailsLoader_, &WebViewerLoaders::HandleThumbnail); + + lock->AddLoader(application); + } + + return application; + } + + void AddDicomAllSeries() + { + std::unique_ptr lock(context_.Lock()); + + if (source_.IsDicomWeb()) + { + resourcesLoader_->ScheduleGetDicomWeb(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, + "/series", CreatePayload(Type_DicomWeb)); + resourcesLoader_->ScheduleGetDicomWeb(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, + "/studies", CreatePayload(Type_DicomWeb)); + } + else if (source_.IsOrthanc()) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetMethod(Orthanc::HttpMethod_Get); + command->SetUri("/series"); + lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + void AddDicomStudy(const std::string& studyInstanceUid) + { + // Avoid adding twice the same study + if (scheduledStudies_.find(studyInstanceUid) == scheduledStudies_.end()) + { + scheduledStudies_.insert(studyInstanceUid); + + if (source_.IsDicomWeb()) + { + Orthanc::DicomMap filter; + filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); + + std::set tags; + + { + std::unique_ptr lock(context_.Lock()); + + resourcesLoader_->ScheduleQido(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, + Orthanc::ResourceType_Study, filter, tags, CreatePayload(Type_DicomWeb)); + + resourcesLoader_->ScheduleQido(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, + Orthanc::ResourceType_Series, filter, tags, CreatePayload(Type_DicomWeb)); + } + } + else if (source_.IsOrthanc()) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetMethod(Orthanc::HttpMethod_Post); + command->SetUri("/tools/find"); + + Json::Value body; + body["Level"] = "Series"; + body["Query"] = Json::objectValue; + body["Query"]["StudyInstanceUID"] = studyInstanceUid; + command->SetBody(body); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + void AddDicomSeries(const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) + { + std::set tags; + + std::unique_ptr lock(context_.Lock()); + + if (scheduledStudies_.find(studyInstanceUid) == scheduledStudies_.end()) + { + scheduledStudies_.insert(studyInstanceUid); + + if (source_.IsDicomWeb()) + { + Orthanc::DicomMap filter; + filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); + + resourcesLoader_->ScheduleQido(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, + Orthanc::ResourceType_Study, filter, tags, CreatePayload(Type_DicomWeb)); + } + } + + if (scheduledSeries_.find(seriesInstanceUid) == scheduledSeries_.end()) + { + scheduledSeries_.insert(seriesInstanceUid); + + if (source_.IsDicomWeb()) + { + Orthanc::DicomMap filter; + filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); + filter.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, seriesInstanceUid, false); + + resourcesLoader_->ScheduleQido(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, + Orthanc::ResourceType_Series, filter, tags, CreatePayload(Type_DicomWeb)); + } + else if (source_.IsOrthanc()) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetMethod(Orthanc::HttpMethod_Post); + command->SetUri("/tools/find"); + + Json::Value body; + body["Level"] = "Series"; + body["Query"] = Json::objectValue; + body["Query"]["StudyInstanceUID"] = studyInstanceUid; + body["Query"]["SeriesInstanceUID"] = seriesInstanceUid; + command->SetBody(body); + + lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + void AddOrthancStudy(const std::string& orthancId) + { + if (source_.IsOrthanc()) + { + std::unique_ptr lock(context_.Lock()); + resourcesLoader_->ScheduleLoadOrthancResources( + loadedSeries_, PRIORITY_ADD_RESOURCES, source_, + Orthanc::ResourceType_Study, orthancId, Orthanc::ResourceType_Series, + CreatePayload(Type_Orthanc)); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, + "Only applicable to Orthanc DICOM sources"); + } + } + + void AddOrthancSeries(const std::string& orthancId) + { + if (source_.IsOrthanc()) + { + std::unique_ptr lock(context_.Lock()); + resourcesLoader_->ScheduleLoadOrthancResource( + loadedSeries_, PRIORITY_ADD_RESOURCES, + source_, Orthanc::ResourceType_Series, orthancId, + CreatePayload(Type_Orthanc)); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, + "Only applicable to Orthanc DICOM sources"); + } + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/SingleFrameViewer/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/SingleFrameViewer/index.html Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ + + + + Stone of Orthanc Single Frame Viewer + + + + + + + + + + +

Viewport

+ + + + +

Load from Orthanc

+

+ Orthanc instance: +

+

+ Frame number: +

+

+ +

+ + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/docker-build.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/docker-build.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,27 @@ +#!/bin/bash + +set -ex + +IMAGE=jodogne/wasm-builder:1.39.17-upstream + +if [ "$1" != "Debug" -a "$1" != "Release" ]; then + echo "Please provide build type: Debug or Release" + exit -1 +fi + +if [ -t 1 ]; then + # TTY is available => use interactive mode + DOCKER_FLAGS='-i' +fi + +ROOT_DIR=`dirname $(readlink -f $0)`/../.. + +mkdir -p ${ROOT_DIR}/wasm-binaries + +docker run -t ${DOCKER_FLAGS} --rm \ + --user $(id -u):$(id -g) \ + -v ${ROOT_DIR}:/source:ro \ + -v ${ROOT_DIR}/wasm-binaries:/target:rw ${IMAGE} \ + bash /source/OrthancStone/Samples/WebAssembly/docker-internal.sh $1 + +ls -lR ${ROOT_DIR}/wasm-binaries/ diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/WebAssembly/docker-internal.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/WebAssembly/docker-internal.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,30 @@ +#!/bin/bash +set -ex + +source /opt/emsdk/emsdk_env.sh + +# Use a folder that is writeable by non-root users for the Emscripten cache +export EM_CACHE=/tmp/emscripten-cache + +# Get the Orthanc framework +cd /tmp/ +hg clone https://hg.orthanc-server.com/orthanc/ + +# Make a copy of the read-only folder containing the source code into +# a writeable folder, because of "DownloadPackage.cmake" that writes +# to the "ThirdPartyDownloads" folder next to the "CMakeLists.txt" +cd /source +hg clone /source /tmp/source-writeable + +mkdir /tmp/build +cd /tmp/build + +cmake /tmp/source-writeable/OrthancStone/Samples/WebAssembly \ + -DCMAKE_BUILD_TYPE=$1 \ + -DCMAKE_INSTALL_PREFIX=/target \ + -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \ + -DORTHANC_FRAMEWORK_ROOT=/tmp/orthanc/OrthancFramework \ + -DSTATIC_BUILD=ON \ + -G Ninja + +ninja -j2 install diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Samples/build-wasm-samples.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Samples/build-wasm-samples.sh Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,48 @@ +#!/bin/bash +# +# usage: +# to build the samples in RelWithDebInfo: +# ./build-wasm-samples.sh +# +# to build the samples in Release: +# ./build-wasm-samples.sh Release + +set -e + +if [ ! -d "WebAssembly" ]; then + echo "This script must be run from the Samples folder one level below orthanc-stone" + exit 1 +fi + + +currentDir=$(pwd) +samplesRootDir=$(pwd) +devrootDir=$(pwd)/../../ + +buildType=${1:-RelWithDebInfo} +buildFolderName="$devrootDir/out/build-stone-wasm-samples-$buildType" +installFolderName="$devrootDir/out/install-stone-wasm-samples-$buildType" + +mkdir -p $buildFolderName +# change current folder to the build folder +pushd $buildFolderName + +# configure the environment to use Emscripten +source ~/apps/emsdk/emsdk_env.sh + +emcmake cmake -G "Ninja" \ + -DCMAKE_BUILD_TYPE=$buildType \ + -DCMAKE_INSTALL_PREFIX=$installFolderName \ + -DSTATIC_BUILD=ON -DALLOW_DOWNLOADS=ON \ + $samplesRootDir/WebAssembly + +# perform build + installation +ninja +ninja install + +# restore the original working folder +popd + +echo "If all went well, the output files can be found in $installFolderName:" + +ls $installFolderName \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/GuiAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/GuiAdapter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,1139 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "GuiAdapter.h" + +#if ORTHANC_ENABLE_OPENGL == 1 +# include "../OpenGL/OpenGLIncludes.h" +#endif + +#if ORTHANC_ENABLE_SDL == 1 +# include +# include +# include +#endif + +#include + +namespace OrthancStone +{ + std::ostream& operator<<( + std::ostream& os, const GuiAdapterKeyboardEvent& event) + { + os << "sym: " << event.sym << " (" << (int)(event.sym[0]) << ") ctrl: " << event.ctrlKey << ", " << + "shift: " << event.shiftKey << ", " << + "alt: " << event.altKey; + return os; + } + + std::ostream& operator<<( + std::ostream& os, const GuiAdapterMouseEvent& event) + { + os << "targetX: " << event.targetX << " targetY: " << event.targetY << " button: " << event.button + << "ctrlKey: " << event.ctrlKey << "shiftKey: " << event.shiftKey << "altKey: " << event.altKey; + + return os; + } + + int GuiAdapter::s_instanceCount = 0; + +#if ORTHANC_ENABLE_WASM == 1 + void GuiAdapter::Run(GuiAdapterRunFunc /*func*/, void* /*cookie*/) + { + } + + void ConvertFromPlatform( + GuiAdapterUiEvent& dest, + int eventType, + const EmscriptenUiEvent& src) + { + // no data for now + } + + void ConvertFromPlatform( + GuiAdapterMouseEvent& dest, + int eventType, + const EmscriptenMouseEvent& src) + { + memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); + switch (eventType) + { + case EMSCRIPTEN_EVENT_CLICK: + LOG(ERROR) << "Emscripten EMSCRIPTEN_EVENT_CLICK is not supported"; + ORTHANC_ASSERT(false, "Not supported"); + break; + case EMSCRIPTEN_EVENT_MOUSEDOWN: + dest.type = GUIADAPTER_EVENT_MOUSEDOWN; + break; + case EMSCRIPTEN_EVENT_DBLCLICK: + dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; + break; + case EMSCRIPTEN_EVENT_MOUSEMOVE: + dest.type = GUIADAPTER_EVENT_MOUSEMOVE; + break; + case EMSCRIPTEN_EVENT_MOUSEUP: + dest.type = GUIADAPTER_EVENT_MOUSEUP; + break; + case EMSCRIPTEN_EVENT_WHEEL: + dest.type = GUIADAPTER_EVENT_WHEEL; + break; + + default: + LOG(ERROR) << "Emscripten event: " << eventType << " is not supported"; + ORTHANC_ASSERT(false, "Not supported"); + } + //dest.timestamp = src.timestamp; + //dest.screenX = src.screenX; + //dest.screenY = src.screenY; + //dest.clientX = src.clientX; + //dest.clientY = src.clientY; + dest.ctrlKey = src.ctrlKey; + dest.shiftKey = src.shiftKey; + dest.altKey = src.altKey; + //dest.metaKey = src.metaKey; + dest.button = src.button; + //dest.buttons = src.buttons; + //dest.movementX = src.movementX; + //dest.movementY = src.movementY; + dest.targetX = src.targetX; + dest.targetY = src.targetY; + //dest.canvasX = src.canvasX; + //dest.canvasY = src.canvasY; + //dest.padding = src.padding; + } + + void ConvertFromPlatform( GuiAdapterWheelEvent& dest, int eventType, const EmscriptenWheelEvent& src) + { + ConvertFromPlatform(dest.mouse, eventType, src.mouse); + dest.deltaX = src.deltaX; + dest.deltaY = src.deltaY; + switch (src.deltaMode) + { + case DOM_DELTA_PIXEL: + dest.deltaMode = GUIADAPTER_DELTA_PIXEL; + break; + case DOM_DELTA_LINE: + dest.deltaMode = GUIADAPTER_DELTA_LINE; + break; + case DOM_DELTA_PAGE: + dest.deltaMode = GUIADAPTER_DELTA_PAGE; + break; + default: + ORTHANC_ASSERT(false, "Unknown deltaMode: " << src.deltaMode << + " in wheel event..."); + } + dest.deltaMode = src.deltaMode; + } + + void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const EmscriptenKeyboardEvent& src) + { + dest.sym[0] = src.key[0]; + dest.sym[1] = 0; + dest.ctrlKey = src.ctrlKey; + dest.shiftKey = src.shiftKey; + dest.altKey = src.altKey; + } + + template + struct FuncAdapterPayload + { + std::string canvasCssSelector; + void* userData; + GenericFunc callback; + }; + + template + EM_BOOL OnEventAdapterFunc( + int eventType, const EmscriptenEvent* emEvent, void* userData) + { + // userData is OnMouseWheelFuncAdapterPayload + FuncAdapterPayload* payload = + reinterpret_cast*>(userData); + // LOG(INFO) << "OnEventAdapterFunc"; + // LOG(INFO) << "------------------"; + // LOG(INFO) << "eventType: " << eventType << " wheelEvent: " << + // (int)wheelEvent << " userData: " << userData << + // " payload->userData: " << payload->userData; + + GuiAdapterEvent guiEvent; + ConvertFromPlatform(guiEvent, eventType, *emEvent); + bool ret = (*(payload->callback))(payload->canvasCssSelector, &guiEvent, payload->userData); + return static_cast(ret); + } + + template + EM_BOOL OnEventAdapterFunc2( + int /*eventType*/, const EmscriptenEvent* wheelEvent, void* userData) + { + // userData is OnMouseWheelFuncAdapterPayload + FuncAdapterPayload* payload = + reinterpret_cast*>(userData); + + GuiAdapterEvent guiEvent; + ConvertFromPlatform(guiEvent, *wheelEvent); + bool ret = (*(payload->callback))(payload->canvasCssSelector, &guiEvent, payload->userData); + return static_cast(ret); + } + + template + EM_BOOL OnEventAdapterFunc3( + double time, void* userData) + { + // userData is OnMouseWheelFuncAdapterPayload + FuncAdapterPayload* payload = + reinterpret_cast*>(userData); + //std::unique_ptr< FuncAdapterPayload > deleter(payload); + bool ret = (*(payload->callback))(time, payload->userData); + return static_cast(ret); + } + + /* + + Explanation + =========== + + - in "older" Emscripten, where DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR doesn't exist or is set to 0, + the following strings need to be used to register events: + - for canvas, the canvas DOM id. In case of ", the string needs + to be "mycanvas" + - for the window (for key events), the string needs to be "#window" + - in newer Emscripten where DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR==1 (or maybe is not there anymore, in the + future as of 2020-04-20) + - for canvas, the canvas DOM id. In case of ", the string needs + to be "#mycanvas" (notice the "number sign", aka "hash", NOT AKA "sharp", as can be read on https://en.wikipedia.org/wiki/Number_sign) + - for the window (for key events), the string needs to be EMSCRIPTEN_EVENT_TARGET_WINDOW. I do not mean + "EMSCRIPTEN_EVENT_TARGET_WINDOW", but the #define EMSCRIPTEN_EVENT_TARGET_WINDOW ((const char*)2) that + can be found in emscripten/html5.h + + The code below converts the input canvasId (as in the old emscripten) to the emscripten-compliant one, with the + following compile condition : #if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 + + If the DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR build parameter disappears, you might want to refactor this code + or continue to pass the DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR compile macro (which is different from the CMake + variable) + + What we are doing below: + - in older Emscripten, the registration functions will receive "mycanvas" and "#window" and the callbacks will receive + the same std::string in their payload ("mycanvas" and "#window") + + - in newer Emscripten, the registration functions will receive "#mycanvas" and EMSCRIPTEN_EVENT_TARGET_WINDOW, but + the callbacks will receive "#mycanvas" and "#window" (since it is not possible to store the EMSCRIPTEN_EVENT_TARGET_WINDOW + magic value in an std::string, while we still want the callback to be able to change its behavior according to the + target element. + + */ + + void convertElementTarget(const char*& outCanvasCssSelectorSz, std::string& outCanvasCssSelector, const std::string& canvasId) + { + // only "#window" can start with a # + if (canvasId[0] == '#') + { + ORTHANC_ASSERT(canvasId == "#window"); + } +#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 + if (canvasId == "#window") + { + // we store this in the payload so that the callback can + outCanvasCssSelector = "#window"; + outCanvasCssSelectorSz = EMSCRIPTEN_EVENT_TARGET_WINDOW; + } + else + { + outCanvasCssSelector = "#" + canvasId; + outCanvasCssSelectorSz = outCanvasCssSelector.c_str(); + } +#else + if (canvasId == "#window") + { + // we store this in the payload so that the callback can + outCanvasCssSelector = "#window"; + outCanvasCssSelectorSz = outCanvasCssSelector.c_str();; + } + else + { + outCanvasCssSelector = canvasId; + outCanvasCssSelectorSz = outCanvasCssSelector.c_str();; + } +#endif + } + + // resize: (const char* target, void* userData, EM_BOOL useCapture, em_ui_callback_func callback) + template< + typename GenericFunc, + typename GuiAdapterEvent, + typename EmscriptenEvent, + typename EmscriptenSetCallbackFunc> + static void SetCallback( + EmscriptenSetCallbackFunc emFunc, + std::string canvasId, void* userData, bool capture, GenericFunc func) + { + std::string canvasCssSelector; + const char* canvasCssSelectorSz = NULL; + convertElementTarget(canvasCssSelectorSz, canvasCssSelector, canvasId); + + // TODO: write RemoveCallback with an int id that gets returned from here + + // create userdata payload + std::unique_ptr > payload(new FuncAdapterPayload()); + payload->canvasCssSelector = canvasCssSelector; + payload->callback = func; + payload->userData = userData; + void* userDataRaw = reinterpret_cast(payload.release()); + + // call the registration function + (*emFunc)( + canvasCssSelectorSz, + userDataRaw, + static_cast(capture), + &OnEventAdapterFunc, + EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); + } + + template< + typename GenericFunc, + typename GuiAdapterEvent, + typename EmscriptenEvent, + typename EmscriptenSetCallbackFunc> + static void SetCallback2( + EmscriptenSetCallbackFunc emFunc, + std::string canvasId, void* userData, bool capture, GenericFunc func) + { + std::string canvasCssSelector; + const char* canvasCssSelectorSz = NULL; + convertElementTarget(canvasCssSelectorSz, canvasCssSelector, canvasId); + + // TODO: write RemoveCallback with an int id that gets returned from here + + // create userdata payload + std::unique_ptr > payload(new FuncAdapterPayload()); + payload->canvasCssSelector = canvasCssSelector; + payload->callback = func; + payload->userData = userData; + void* userDataRaw = reinterpret_cast(payload.release()); + + // call the registration function + (*emFunc)( + canvasCssSelectorSz, + userDataRaw, + static_cast(capture), + &OnEventAdapterFunc2, + EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); + } + + template< + typename GenericFunc, + typename EmscriptenSetCallbackFunc> + static void SetAnimationFrameCallback( + EmscriptenSetCallbackFunc emFunc, + void* userData, GenericFunc func) + { + std::unique_ptr > payload( + new FuncAdapterPayload() + ); + payload->canvasCssSelector = "UNDEFINED"; + payload->callback = func; + payload->userData = userData; + void* userDataRaw = reinterpret_cast(payload.release()); + (*emFunc)( + &OnEventAdapterFunc3, + userDataRaw); + } + + void GuiAdapter::SetWheelCallback( + std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func) + { + SetCallback( + &emscripten_set_wheel_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + + void GuiAdapter::SetMouseDblClickCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + SetCallback( + &emscripten_set_dblclick_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + + void GuiAdapter::SetMouseDownCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + SetCallback( + &emscripten_set_mousedown_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + void GuiAdapter::SetMouseMoveCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + // LOG(INFO) << "SetMouseMoveCallback -- " << "supplied userData: " << + // userData; + + SetCallback( + &emscripten_set_mousemove_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + void GuiAdapter::SetMouseUpCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + SetCallback( + &emscripten_set_mouseup_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + void GuiAdapter::SetKeyDownCallback( + std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) + { + SetCallback2( + &emscripten_set_keydown_callback_on_thread, + canvasId, + userData, + capture, + func); + } + + void GuiAdapter::SetKeyUpCallback( + std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) + { + SetCallback2( + &emscripten_set_keyup_callback_on_thread, + canvasId, + userData, + capture, + func); + } + +#if 0 + // useless under Wasm where canvas resize is handled automatically + void GuiAdapter::SetResizeCallback( + std::string canvasId, void* userData, bool capture, OnWindowResizeFunc func) + { + SetCallback( + &emscripten_set_resize_callback_on_thread, + canvasId, + userData, + capture, + func); + } +#endif + + void GuiAdapter::RequestAnimationFrame( + OnAnimationFrameFunc func, void* userData) + { + SetAnimationFrameCallback( + &emscripten_request_animation_frame_loop, + userData, + func); + } + +#if 0 + void GuiAdapter::SetKeyDownCallback( + std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) + { + emscripten_set_keydown_callback(canvasId.c_str(), userData, static_cast(capture), func); + } + void GuiAdapter::SetKeyUpCallback( + std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) + { + emscripten_set_keyup_callback(canvasId.c_str(), userData, static_cast(capture), func); + } + + // handled from within WebAssemblyViewport + //void GuiAdapter::SetResizeCallback(std::string canvasId, void* userData, bool capture, OnWindowResizeFunc func) + //{ + // emscripten_set_resize_callback(canvasId.c_str(), userData, static_cast(capture), func); + //} + + void GuiAdapter::RequestAnimationFrame(OnAnimationFrameFunc func, void* userData) + { + emscripten_request_animation_frame_loop(func, userData); + } +#endif + + +#else + + // SDL ONLY + void ConvertFromPlatform(GuiAdapterMouseEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source) + { + memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); + switch (source.type) + { + case SDL_MOUSEBUTTONDOWN: + if (source.button.clicks == 1) { + dest.type = GUIADAPTER_EVENT_MOUSEDOWN; + } else if (source.button.clicks == 2) { + dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; + } else { + dest.type = GUIADAPTER_EVENT_MOUSEDBLCLICK; + LOG(WARNING) << "Multiple-click ignored."; + } + break; + case SDL_MOUSEMOTION: + dest.type = GUIADAPTER_EVENT_MOUSEMOVE; + break; + case SDL_MOUSEBUTTONUP: + dest.type = GUIADAPTER_EVENT_MOUSEUP; + break; + case SDL_MOUSEWHEEL: + dest.type = GUIADAPTER_EVENT_WHEEL; + break; + default: + LOG(ERROR) << "SDL event: " << source.type << " is not supported"; + ORTHANC_ASSERT(false, "Not supported"); + } + //dest.timestamp = src.timestamp; + //dest.screenX = src.screenX; + //dest.screenY = src.screenY; + //dest.clientX = src.clientX; + //dest.clientY = src.clientY; + dest.ctrlKey = ctrlPressed; + dest.shiftKey = shiftPressed; + dest.altKey = altPressed; + //dest.metaKey = src.metaKey; + switch (source.button.button) + { + case SDL_BUTTON_MIDDLE: + dest.button =GUIADAPTER_MOUSEBUTTON_MIDDLE; + break; + + case SDL_BUTTON_RIGHT: + dest.button = GUIADAPTER_MOUSEBUTTON_RIGHT; + break; + + case SDL_BUTTON_LEFT: + dest.button = GUIADAPTER_MOUSEBUTTON_LEFT; + break; + + default: + break; + } + //dest.buttons = src.buttons; + //dest.movementX = src.movementX; + //dest.movementY = src.movementY; + dest.targetX = source.button.x; + dest.targetY = source.button.y; + //dest.canvasX = src.canvasX; + //dest.canvasY = src.canvasY; + //dest.padding = src.padding; + } + + void ConvertFromPlatform( + GuiAdapterWheelEvent& dest, + bool ctrlPressed, bool shiftPressed, bool altPressed, + const SDL_Event& source) + { + ConvertFromPlatform(dest.mouse, ctrlPressed, shiftPressed, altPressed, source); + dest.deltaX = source.wheel.x; + dest.deltaY = source.wheel.y; + } + + void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const SDL_Event& src) + { + memset(&dest, 0, sizeof(GuiAdapterMouseEvent)); + switch (src.type) + { + case SDL_KEYDOWN: + dest.type = GUIADAPTER_EVENT_KEYDOWN; + break; + case SDL_KEYUP: + dest.type = GUIADAPTER_EVENT_KEYUP; + break; + default: + LOG(ERROR) << "SDL event: " << src.type << " is not supported"; + ORTHANC_ASSERT(false, "Not supported"); + } + dest.sym[0] = src.key.keysym.sym; + dest.sym[1] = 0; + + if (src.key.keysym.mod & KMOD_CTRL) + dest.ctrlKey = true; + else + dest.ctrlKey = false; + + if (src.key.keysym.mod & KMOD_SHIFT) + dest.shiftKey = true; + else + dest.shiftKey = false; + + if (src.key.keysym.mod & KMOD_ALT) + dest.altKey = true; + else + dest.altKey = false; + } + + // SDL ONLY + void GuiAdapter::SetSdlResizeCallback( + std::string canvasId, void* userData, bool capture, OnSdlWindowResizeFunc func) + { + resizeHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetMouseDownCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + mouseDownHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetMouseDblClickCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + mouseDblCickHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetMouseMoveCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + mouseMoveHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetMouseUpCallback( + std::string canvasId, void* userData, bool capture, OnMouseEventFunc func) + { + mouseUpHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetWheelCallback( + std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func) + { + mouseWheelHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetKeyDownCallback( + std::string canvasId, void* userData, bool capture, OnKeyDownFunc func) + { + keyDownHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetKeyUpCallback( + std::string canvasId, void* userData, bool capture, OnKeyUpFunc func) + { + keyUpHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::SetGenericSdlEventCallback( + std::string canvasId, void* userData, bool capture, OnSdlEventCallback func) + { + sdlEventHandlers_.push_back(EventHandlerData(canvasId, func, userData)); + } + + // SDL ONLY + void GuiAdapter::OnAnimationFrame() + { + std::vector disabledAnimationHandlers; + for (size_t i = 0; i < animationFrameHandlers_.size(); i++) + { + // TODO: fix time + bool goOn = (*(animationFrameHandlers_[i].first))(0, animationFrameHandlers_[i].second); + + // If the function returns false, we need to emulate what happens in Web + // and remove the function from the handlers... + if (!goOn) + disabledAnimationHandlers.push_back(i); + } + for (size_t i = 0; i < disabledAnimationHandlers.size(); i++) + { + ORTHANC_ASSERT(animationFrameHandlers_.begin() + disabledAnimationHandlers[i] < animationFrameHandlers_.end()); + animationFrameHandlers_.erase(animationFrameHandlers_.begin() + disabledAnimationHandlers[i]); + } + } + + // SDL ONLY + void GuiAdapter::OnResize(unsigned int width, unsigned int height) + { + for (size_t i = 0; i < resizeHandlers_.size(); i++) + { + (*(resizeHandlers_[i].func))( + resizeHandlers_[i].canvasName, NULL, width, height, resizeHandlers_[i].userData); + } + } + + + + void GuiAdapter::OnSdlGenericEvent(const SDL_Event& sdlEvent) + { + // Events related to a window are only sent to the related canvas + // User events are sent to everyone (we can't filter them here) + + /* + SDL_WindowEvent SDL_WINDOWEVENT + SDL_KeyboardEvent SDL_KEYDOWN + SDL_KEYUP + SDL_TextEditingEvent SDL_TEXTEDITING + SDL_TextInputEvent SDL_TEXTINPUT + SDL_MouseMotionEvent SDL_MOUSEMOTION + SDL_MouseButtonEvent SDL_MOUSEBUTTONDOWN + SDL_MOUSEBUTTONUP + SDL_MouseWheelEvent SDL_MOUSEWHEEL + SDL_UserEvent SDL_USEREVENT through ::SDL_LASTEVENT-1 + */ + + // if this string is left empty, it means the message will be sent to + // all widgets. + // otherwise, it contains the originating message window title + + std::string windowTitle; + uint32_t windowId = 0; + + if (sdlEvent.type == SDL_WINDOWEVENT) + windowId = sdlEvent.window.windowID; + else if (sdlEvent.type == SDL_KEYDOWN || sdlEvent.type == SDL_KEYUP) + windowId = sdlEvent.key.windowID; + else if (sdlEvent.type == SDL_TEXTEDITING) + windowId = sdlEvent.edit.windowID; + else if (sdlEvent.type == SDL_TEXTINPUT) + windowId = sdlEvent.text.windowID; + else if (sdlEvent.type == SDL_MOUSEMOTION) + windowId = sdlEvent.motion.windowID; + else if (sdlEvent.type == SDL_MOUSEBUTTONDOWN || sdlEvent.type == SDL_MOUSEBUTTONUP) + windowId = sdlEvent.button.windowID; + else if (sdlEvent.type == SDL_MOUSEWHEEL) + windowId = sdlEvent.wheel.windowID; + else if (sdlEvent.type >= SDL_USEREVENT && sdlEvent.type <= (SDL_LASTEVENT-1)) + windowId = sdlEvent.user.windowID; + + if (windowId != 0) + { + SDL_Window* sdlWindow = SDL_GetWindowFromID(windowId); + ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowId << "\" is not a valid SDL window ID!"); + const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); + ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowId << "\" has a NULL window title!"); + windowTitle = windowTitleSz; + ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowId << "\" has an empty window title!"); + } + + for (size_t i = 0; i < sdlEventHandlers_.size(); i++) + { + // normally, the handlers return a bool indicating whether they + // have handled the event or not, but we don't really care about this + std::string& canvasName = sdlEventHandlers_[i].canvasName; + + bool sendEvent = true; + + if (windowTitle != "" && (canvasName != windowTitle)) + sendEvent = false; + + if (sendEvent) + { + OnSdlEventCallback func = sdlEventHandlers_[i].func; + (*func)(canvasName, sdlEvent, sdlEventHandlers_[i].userData); + } + } + } + + // SDL ONLY + void GuiAdapter::OnMouseWheelEvent(uint32_t windowID, const GuiAdapterWheelEvent& event) + { + // the SDL window name IS the canvas name ("canvas" is used because this lib + // is designed for Wasm + SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); + ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); + + const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); + ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); + + std::string windowTitle(windowTitleSz); + ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); + + switch (event.mouse.type) + { + case GUIADAPTER_EVENT_WHEEL: + for (size_t i = 0; i < mouseWheelHandlers_.size(); i++) + { + if (mouseWheelHandlers_[i].canvasName == windowTitle) + (*(mouseWheelHandlers_[i].func))(windowTitle, &event, mouseWheelHandlers_[i].userData); + } + break; + default: + ORTHANC_ASSERT(false, "Wrong event.type: " << event.mouse.type << " in GuiAdapter::OnMouseWheelEvent(...)"); + break; + } + } + + + void GuiAdapter::OnKeyboardEvent(uint32_t windowID, const GuiAdapterKeyboardEvent& event) + { + // only one-letter (ascii) keyboard events supported for now + ORTHANC_ASSERT(event.sym[0] != 0); + ORTHANC_ASSERT(event.sym[1] == 0); + + SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); + ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); + + const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); + ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); + + std::string windowTitle(windowTitleSz); + ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); + + switch (event.type) + { + case GUIADAPTER_EVENT_KEYDOWN: + for (size_t i = 0; i < keyDownHandlers_.size(); i++) + { + (*(keyDownHandlers_[i].func))(windowTitle, &event, keyDownHandlers_[i].userData); + } + break; + case GUIADAPTER_EVENT_KEYUP: + for (size_t i = 0; i < keyUpHandlers_.size(); i++) + { + (*(keyUpHandlers_[i].func))(windowTitle, &event, keyUpHandlers_[i].userData); + } + break; + default: + ORTHANC_ASSERT(false, "Wrong event.type: " << event.type << " in GuiAdapter::OnKeyboardEvent(...)"); + break; + } + } + + // SDL ONLY + void GuiAdapter::OnMouseEvent(uint32_t windowID, const GuiAdapterMouseEvent& event) + { + if (windowID == 0) + { + LOG(WARNING) << "GuiAdapter::OnMouseEvent -- windowID == 0 and event won't be routed!"; + } + else + { + // the SDL window name IS the canvas name ("canvas" is used because this lib + // is designed for Wasm + SDL_Window* sdlWindow = SDL_GetWindowFromID(windowID); + + ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << windowID << "\" is not a valid SDL window ID!"); + + const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); + ORTHANC_ASSERT(windowTitleSz != NULL, "Window ID \"" << windowID << "\" has a NULL window title!"); + + std::string windowTitle(windowTitleSz); + ORTHANC_ASSERT(windowTitle != "", "Window ID \"" << windowID << "\" has an empty window title!"); + + switch (event.type) + { + case GUIADAPTER_EVENT_MOUSEDOWN: + for (size_t i = 0; i < mouseDownHandlers_.size(); i++) + { + if (mouseDownHandlers_[i].canvasName == windowTitle) + (*(mouseDownHandlers_[i].func))(windowTitle, &event, mouseDownHandlers_[i].userData); + } + break; + case GUIADAPTER_EVENT_MOUSEDBLCLICK: + for (size_t i = 0; i < mouseDblCickHandlers_.size(); i++) + { + if (mouseDblCickHandlers_[i].canvasName == windowTitle) + (*(mouseDblCickHandlers_[i].func))(windowTitle, &event, mouseDblCickHandlers_[i].userData); + } + break; + case GUIADAPTER_EVENT_MOUSEMOVE: + for (size_t i = 0; i < mouseMoveHandlers_.size(); i++) + { + if (mouseMoveHandlers_[i].canvasName == windowTitle) + (*(mouseMoveHandlers_[i].func))(windowTitle, &event, mouseMoveHandlers_[i].userData); + } + break; + case GUIADAPTER_EVENT_MOUSEUP: + for (size_t i = 0; i < mouseUpHandlers_.size(); i++) + { + if (mouseUpHandlers_[i].canvasName == windowTitle) + (*(mouseUpHandlers_[i].func))(windowTitle, &event, mouseUpHandlers_[i].userData); + } + break; + default: + ORTHANC_ASSERT(false, "Wrong event.type: " << event.type << " in GuiAdapter::OnMouseEvent(...)"); + break; + } + } + } + + + // extern void Debug_SetContextToBeKilled(std::string title); + // extern void Debug_SetContextToBeRestored(std::string title); + + // SDL ONLY + void GuiAdapter::RequestAnimationFrame(OnAnimationFrameFunc func, void* userData) + { + animationFrameHandlers_.push_back(std::make_pair(func, userData)); + } + +# if ORTHANC_ENABLE_OPENGL == 1 && !defined(__APPLE__) /* OpenGL debug is not available on OS X */ + + // SDL ONLY + static void GLAPIENTRY + OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar * message, + const void* userParam) + { + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } + } +# endif + +#if 0 + // TODO: remove this when generic sdl event handlers are implemented in + // the DoseView + // SDL ONLY + bool GuiAdapter::IsSdlViewPortRefreshEvent(const SDL_Event& event) const + { + SDL_Window* sdlWindow = SDL_GetWindowFromID(event.window.windowID); + + ORTHANC_ASSERT(sdlWindow != NULL, "Window ID \"" << event.window.windowID << "\" is not a valid SDL window ID!"); + + const char* windowTitleSz = SDL_GetWindowTitle(sdlWindow); + + // now we need to find the DoseView from from the canvas name! + // (and retrieve the SdlViewport) + boost::shared_ptr foundWidget; + VisitWidgets([&foundWidget, windowTitleSz](auto widget) + { + if (widget->GetCanvasIdentifier() == std::string(windowTitleSz)) + foundWidget = widget; + }); + ORTHANC_ASSERT(foundWidget, "The window named: \"" << windowTitleSz << "\" was not found in the registered widgets!"); + return foundWidget->GetSdlViewport().IsRefreshEvent(event); + } +#endif + + // SDL ONLY + void GuiAdapter::Run(GuiAdapterRunFunc func, void* cookie) + { +#if 1 + // TODO: MAKE THIS DYNAMIC !!! See SdlOpenGLViewport vs Cairo in ViewportWrapper +# if ORTHANC_ENABLE_OPENGL == 1 && !defined(__APPLE__) + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); +# endif +#endif + + // Uint32 SDL_GetWindowID(SDL_Window* window) + // SDL_Window* SDL_GetWindowFromID(Uint32 id) // may return NULL + + bool stop = false; + while (!stop) + { + { + // TODO: lock all viewports here! (use a scoped object) + if(func != NULL) + (*func)(cookie); + OnAnimationFrame(); // in SDL we must call it + } + + while (!stop) + { + std::vector sdlEvents; + std::map userEventsMap; + + SDL_Event sdlEvent; + + // FIRST: collect all pending events + while (SDL_PollEvent(&sdlEvent) != 0) + { + if ( (sdlEvent.type >= SDL_USEREVENT) && + (sdlEvent.type < SDL_LASTEVENT) ) + { + // we don't want to have multiple events with the same event.type + userEventsMap[sdlEvent.type] = sdlEvent; + } + else + { + sdlEvents.push_back(sdlEvent); + } + } + + // SECOND: collect all user events + for (std::map::const_iterator it = userEventsMap.begin(); it != userEventsMap.end(); ++it) + sdlEvents.push_back(it->second); + + // now process the events + for (std::vector::const_iterator it = sdlEvents.begin(); it != sdlEvents.end(); ++it) + { + const SDL_Event& sdlEvent = *it; + // TODO: lock all viewports here! (use a scoped object) + + if (sdlEvent.type == SDL_QUIT) + { + // TODO: call exit callbacks here + stop = true; + break; + } + else if ((sdlEvent.type == SDL_MOUSEMOTION) || + (sdlEvent.type == SDL_MOUSEBUTTONDOWN) || + (sdlEvent.type == SDL_MOUSEBUTTONUP)) + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + bool ctrlPressed(false); + bool shiftPressed(false); + bool altPressed(false); + + if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) + altPressed = true; + + GuiAdapterMouseEvent dest; + ConvertFromPlatform(dest, ctrlPressed, shiftPressed, altPressed, sdlEvent); + OnMouseEvent(sdlEvent.window.windowID, dest); + #if 0 + // for reference, how to create trackers + if (tracker) + { + PointerEvent e; + e.AddPosition(compositor.GetPixelCenterCoordinates( + sdlEvent.button.x, sdlEvent.button.y)); + tracker->PointerMove(e); + } + #endif + } + else if (sdlEvent.type == SDL_MOUSEWHEEL) + { + + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + bool ctrlPressed(false); + bool shiftPressed(false); + bool altPressed(false); + + if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) + ctrlPressed = true; + if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) + shiftPressed = true; + if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) + altPressed = true; + + GuiAdapterWheelEvent dest; + ConvertFromPlatform(dest, ctrlPressed, shiftPressed, altPressed, sdlEvent); + OnMouseWheelEvent(sdlEvent.window.windowID, dest); + + //KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); + + //int x, y; + //SDL_GetMouseState(&x, &y); + + //if (sdlEvent.wheel.y > 0) + //{ + // locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); + //} + //else if (sdlEvent.wheel.y < 0) + //{ + // locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); + //} + } + else if (sdlEvent.type == SDL_WINDOWEVENT && + (sdlEvent.window.event == SDL_WINDOWEVENT_RESIZED || + sdlEvent.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) + { + #if 0 + tracker.reset(); + #endif + OnResize(sdlEvent.window.data1, sdlEvent.window.data2); + } + else if (sdlEvent.type == SDL_KEYDOWN && sdlEvent.key.repeat == 0 /* Ignore key bounce */) + { + switch (sdlEvent.key.keysym.sym) + { + case SDLK_f: + // window.GetWindow().ToggleMaximize(); //TODO: move to particular handler + break; + + // This commented out code was used to debug the context + // loss/restoring code (2019-08-10) + // case SDLK_k: + // { + // SDL_Window* window = SDL_GetWindowFromID(sdlEvent.window.windowID); + // std::string windowTitle(SDL_GetWindowTitle(window)); + // Debug_SetContextToBeKilled(windowTitle); + // } + // break; + // case SDLK_l: + // { + // SDL_Window* window = SDL_GetWindowFromID(sdlEvent.window.windowID); + // std::string windowTitle(SDL_GetWindowTitle(window)); + // Debug_SetContextToBeRestored(windowTitle); + // } + // break; + + case SDLK_q: + stop = true; + break; + + default: + GuiAdapterKeyboardEvent dest; + ConvertFromPlatform(dest, sdlEvent); + OnKeyboardEvent(sdlEvent.window.windowID, dest); + break; + } + } + + OnSdlGenericEvent(sdlEvent); + } + SDL_Delay(1); + } + } + } +#endif +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/GuiAdapter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/GuiAdapter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,377 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include + +#if ORTHANC_ENABLE_WASM != 1 +# ifdef __EMSCRIPTEN__ +# error __EMSCRIPTEN__ is defined and ORTHANC_ENABLE_WASM != 1 +# endif +#endif + +#if ORTHANC_ENABLE_WASM == 1 +# ifndef __EMSCRIPTEN__ +# error __EMSCRIPTEN__ is not defined and ORTHANC_ENABLE_WASM == 1 +# endif +#endif + +#if ORTHANC_ENABLE_WASM == 1 +# include +#else +# if ORTHANC_ENABLE_SDL == 1 +# include +# endif +#endif + +#include "../StoneException.h" + +#include +#include +#include + +namespace OrthancStone +{ +#if ORTHANC_ENABLE_SDL == 1 + class SdlViewport; +#endif + +#if 0 + + /** + This interface is used to store the widgets that are controlled by the + GuiAdapter and receive event callbacks. + The callbacks may possibly be downcast (using dynamic_cast, for safety) \ + to the actual widget type + */ + class IGuiAdapterWidget + { + public: + virtual ~IGuiAdapterWidget() {} + +#if #if ORTHANC_ENABLE_SDL == 1 + /** + Returns the SdlViewport that this widget contains. If the underlying + viewport type is *not* SDL, then an error is returned. + */ + virtual SdlViewport& GetSdlViewport() = 0; +#endif + }; + +#endif + + enum GuiAdapterMouseButtonType + { + GUIADAPTER_MOUSEBUTTON_LEFT = 0, + GUIADAPTER_MOUSEBUTTON_MIDDLE = 1, + GUIADAPTER_MOUSEBUTTON_RIGHT = 2 + }; + + + enum GuiAdapterHidEventType + { + GUIADAPTER_EVENT_MOUSEDOWN = 1973, + GUIADAPTER_EVENT_MOUSEMOVE = 1974, + GUIADAPTER_EVENT_MOUSEDBLCLICK = 1975, + GUIADAPTER_EVENT_MOUSEUP = 1976, + GUIADAPTER_EVENT_WHEEL = 1977, + GUIADAPTER_EVENT_KEYDOWN = 1978, + GUIADAPTER_EVENT_KEYUP = 1979, + }; + + const unsigned int GUIADAPTER_DELTA_PIXEL = 2973; + const unsigned int GUIADAPTER_DELTA_LINE = 2974; + const unsigned int GUIADAPTER_DELTA_PAGE = 2975; + + struct GuiAdapterUiEvent; + struct GuiAdapterMouseEvent; + struct GuiAdapterWheelEvent; + struct GuiAdapterKeyboardEvent; + +#if 1 + typedef bool (*OnMouseEventFunc) (std::string canvasId, const GuiAdapterMouseEvent* mouseEvent, void* userData); + typedef bool (*OnMouseWheelFunc) (std::string canvasId, const GuiAdapterWheelEvent* wheelEvent, void* userData); + typedef bool (*OnKeyDownFunc) (std::string canvasId, const GuiAdapterKeyboardEvent* keyEvent, void* userData); + typedef bool (*OnKeyUpFunc) (std::string canvasId, const GuiAdapterKeyboardEvent* keyEvent, void* userData); + typedef bool (*OnAnimationFrameFunc)(double time, void* userData); + +#if ORTHANC_ENABLE_SDL == 1 + typedef bool (*OnSdlEventCallback) (std::string canvasId, const SDL_Event& sdlEvent, void* userData); + + typedef bool (*OnSdlWindowResizeFunc)(std::string canvasId, + const GuiAdapterUiEvent* uiEvent, + unsigned int width, + unsigned int height, + void* userData); + + +#endif + +#else + +#if ORTHANC_ENABLE_WASM == 1 + typedef EM_BOOL (*OnMouseEventFunc)(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); + typedef EM_BOOL (*OnMouseWheelFunc)(int eventType, const EmscriptenWheelEvent* wheelEvent, void* userData); + typedef EM_BOOL (*OnKeyDownFunc) (int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData); + typedef EM_BOOL (*OnKeyUpFunc) (int eventType, const EmscriptenKeyboardEvent* keyEvent, void* userData); + + typedef EM_BOOL (*OnAnimationFrameFunc)(double time, void* userData); + typedef EM_BOOL (*OnWindowResizeFunc)(int eventType, const EmscriptenUiEvent* uiEvent, void* userData); +#else + typedef bool (*OnMouseEventFunc)(int eventType, const SDL_Event* mouseEvent, void* userData); + typedef bool (*OnMouseWheelFunc)(int eventType, const SDL_Event* wheelEvent, void* userData); + typedef bool (*OnKeyDownFunc) (int eventType, const SDL_Event* keyEvent, void* userData); + typedef bool (*OnKeyUpFunc) (int eventType, const SDL_Event* keyEvent, void* userData); + + typedef bool (*OnAnimationFrameFunc)(double time, void* userData); + typedef bool (*OnWindowResizeFunc)(int eventType, const GuiAdapterUiEvent* uiEvent, void* userData); +#endif + +#endif + struct GuiAdapterMouseEvent + { + GuiAdapterHidEventType type; + //double timestamp; + //long screenX; + //long screenY; + //long clientX; + //long clientY; + bool ctrlKey; + bool shiftKey; + bool altKey; + //bool metaKey; + unsigned short button; + //unsigned short buttons; + //long movementX; + //long movementY; + long targetX; + long targetY; + // canvasX and canvasY are deprecated - there no longer exists a Module['canvas'] object, so canvasX/Y are no longer reported (register a listener on canvas directly to get canvas coordinates, or translate manually) + //long canvasX; + //long canvasY; + //long padding; + + public: + GuiAdapterMouseEvent() + : ctrlKey(false), + shiftKey(false), + altKey(false) + { + } + }; + + struct GuiAdapterWheelEvent { + GuiAdapterMouseEvent mouse; + double deltaX; + double deltaY; + unsigned long deltaMode; + }; + + // we don't use any data now + struct GuiAdapterUiEvent {}; + + // EmscriptenKeyboardEvent + struct GuiAdapterKeyboardEvent + { + GuiAdapterHidEventType type; + char sym[32]; + bool ctrlKey; + bool shiftKey; + bool altKey; + }; + + std::ostream& operator<<(std::ostream& os, const GuiAdapterKeyboardEvent& event); + std::ostream& operator<<(std::ostream& os, const GuiAdapterMouseEvent& event); + + /* + Mousedown event trigger when either the left or right (or middle) mouse is pressed + on the object; + + Mouseup event trigger when either the left or right (or middle) mouse is released + above the object after triggered mousedown event and held. + + Click event trigger when the only left mouse button is pressed and released on the + same object, requires the Mousedown and Mouseup event happened before Click event. + + The normal expect trigger order: onMousedown >> onMouseup >> onClick + + Testing in Chrome v58, the time between onMouseup and onClick events are around + 7ms to 15ms + + FROM: https://codingrepo.com/javascript/2017/05/19/javascript-difference-mousedown-mouseup-click-events/ + */ +#if ORTHANC_ENABLE_WASM == 1 + void ConvertFromPlatform(GuiAdapterUiEvent& dest, int eventType, const EmscriptenUiEvent& src); + + void ConvertFromPlatform(GuiAdapterMouseEvent& dest, int eventType, const EmscriptenMouseEvent& src); + + void ConvertFromPlatform(GuiAdapterWheelEvent& dest, int eventType, const EmscriptenWheelEvent& src); + + void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const EmscriptenKeyboardEvent& src); +#else + +# if ORTHANC_ENABLE_SDL == 1 + void ConvertFromPlatform(GuiAdapterMouseEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source); + + void ConvertFromPlatform(GuiAdapterWheelEvent& dest, bool ctrlPressed, bool shiftPressed, bool altPressed, const SDL_Event& source); + + void ConvertFromPlatform(GuiAdapterKeyboardEvent& dest, const SDL_Event& source); + +# endif + +#endif + + typedef void (*GuiAdapterRunFunc)(void*); + + class GuiAdapter + { + public: + GuiAdapter() + { + ORTHANC_ASSERT(s_instanceCount == 0); + s_instanceCount = 1; + } + + ~GuiAdapter() + { + s_instanceCount -= 1; + } + + /** + emscripten_set_resize_callback("EMSCRIPTEN_EVENT_TARGET_WINDOW", NULL, false, OnWindowResize); + + emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnXXXMouseWheel); + emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnXXXMouseWheel); + emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnXXXMouseWheel); + + emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); ---> NO! + emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); + + emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); + + SDL: + see https://wiki.libsdl.org/SDL_CaptureMouse + + */ + + void SetMouseDownCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); + void SetMouseDblClickCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); + void SetMouseMoveCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); + void SetMouseUpCallback (std::string canvasId, void* userData, bool capture, OnMouseEventFunc func); + void SetWheelCallback (std::string canvasId, void* userData, bool capture, OnMouseWheelFunc func); + void SetKeyDownCallback (std::string canvasId, void* userData, bool capture, OnKeyDownFunc func); + void SetKeyUpCallback (std::string canvasId, void* userData, bool capture, OnKeyUpFunc func); + +#if ORTHANC_ENABLE_SDL == 1 + + void SetGenericSdlEventCallback (std::string canvasId, void* userData, bool capture, OnSdlEventCallback func); + + typedef bool (*OnSdlEventCallback) (std::string canvasId, const SDL_Event& sdlEvent, void* userData); + + // if you pass "#window", then any Window resize will trigger the callback + // (this special string is converted to EMSCRIPTEN_EVENT_TARGET_WINDOW in DOM, when DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1) + void SetSdlResizeCallback(std::string canvasId, + void* userData, + bool capture, + OnSdlWindowResizeFunc func); +#endif + + void RequestAnimationFrame(OnAnimationFrameFunc func, void* userData); + + // TODO: implement and call to remove canvases [in SDL, although code should be generic] + void SetOnExitCallback(); + + /** + Under SDL, this function does NOT return until all windows have been closed. + Under wasm, it returns without doing anything, since the event loop is managed + by the browser. + */ + void Run(GuiAdapterRunFunc func = NULL, void* cookie = NULL); + + private: + +#if ORTHANC_ENABLE_SDL == 1 + /** + Gives observers a chance to react based on generic event handlers. This + is used, for instance, when the viewport lock interface is invalidated. + */ + void OnSdlGenericEvent(const SDL_Event& sdlEvent); +#endif + + /** + In SDL, this executes all the registered headers + */ + void OnAnimationFrame(); + + //void RequestAnimationFrame(OnAnimationFrameFunc func, void* userData); + std::vector > + animationFrameHandlers_; + + void OnResize(unsigned int width, unsigned int height); + +#if ORTHANC_ENABLE_SDL == 1 + template + struct EventHandlerData + { + EventHandlerData(std::string canvasName, Func func, void* userData) + : canvasName(canvasName) + , func(func) + , userData(userData) + { + } + + std::string canvasName; + Func func; + void* userData; + }; + std::vector > resizeHandlers_; + std::vector > mouseDownHandlers_; + std::vector > mouseDblCickHandlers_; + std::vector > mouseMoveHandlers_; + std::vector > mouseUpHandlers_; + std::vector > mouseWheelHandlers_; + std::vector > keyDownHandlers_; + std::vector > keyUpHandlers_; + std::vector > sdlEventHandlers_; + + /** + This executes all the registered headers if needed (in wasm, the browser + deals with this) + */ + void OnMouseEvent(uint32_t windowID, const GuiAdapterMouseEvent& event); + + void OnKeyboardEvent(uint32_t windowID, const GuiAdapterKeyboardEvent& event); + + /** + Same remark as OnMouseEvent + */ + void OnMouseWheelEvent(uint32_t windowID, const GuiAdapterWheelEvent& event); + +#endif + + /** + This executes all the registered headers if needed (in wasm, the browser + deals with this) + */ + void ViewportsUpdateSize(); + + static int s_instanceCount; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/CircleMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/CircleMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,106 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CircleMeasureTracker.h" + +#include +#include + +namespace Deprecated +{ + CircleMeasureTracker::CircleMeasureTracker(IStatusBar* statusBar, + const OrthancStone::CoordinateSystem3D& slice, + double x, + double y, + uint8_t red, + uint8_t green, + uint8_t blue, + const Orthanc::Font& font) : + statusBar_(statusBar), + slice_(slice), + x1_(x), + y1_(y), + x2_(x), + y2_(y), + font_(font) + { + color_[0] = red; + color_[1] = green; + color_[2] = blue; + } + + + void CircleMeasureTracker::Render(OrthancStone::CairoContext& context, + double zoom) + { + double x = (x1_ + x2_) / 2.0; + double y = (y1_ + y2_) / 2.0; + + OrthancStone::Vector tmp; + OrthancStone::LinearAlgebra::AssignVector(tmp, x2_ - x1_, y2_ - y1_); + double r = boost::numeric::ublas::norm_2(tmp) / 2.0; + + context.SetSourceColor(color_[0], color_[1], color_[2]); + + cairo_t* cr = context.GetObject(); + cairo_save(cr); + cairo_set_line_width(cr, 2.0 / zoom); + cairo_translate(cr, x, y); + cairo_arc(cr, 0, 0, r, 0, 2.0 * boost::math::constants::pi()); + cairo_stroke_preserve(cr); + cairo_stroke(cr); + cairo_restore(cr); + + context.DrawText(font_, FormatRadius(), x, y, OrthancStone::BitmapAnchor_Center); + } + + + double CircleMeasureTracker::GetRadius() const // In millimeters + { + OrthancStone::Vector a = slice_.MapSliceToWorldCoordinates(x1_, y1_); + OrthancStone::Vector b = slice_.MapSliceToWorldCoordinates(x2_, y2_); + return boost::numeric::ublas::norm_2(b - a) / 2.0; + } + + + std::string CircleMeasureTracker::FormatRadius() const + { + char buf[64]; + sprintf(buf, "%0.01f cm", GetRadius() / 10.0); + return buf; + } + + void CircleMeasureTracker::MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + x2_ = x; + y2_ = y; + + if (statusBar_ != NULL) + { + statusBar_->SetMessage("Circle radius: " + FormatRadius()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/CircleMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/CircleMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Widgets/IWorldSceneMouseTracker.h" +#include "../Viewport/IStatusBar.h" +#include "../../Toolbox/CoordinateSystem3D.h" + +#include + +namespace Deprecated +{ + class CircleMeasureTracker : public IWorldSceneMouseTracker + { + private: + IStatusBar* statusBar_; + OrthancStone::CoordinateSystem3D slice_; + double x1_; + double y1_; + double x2_; + double y2_; + uint8_t color_[3]; + const Orthanc::Font& font_; + + public: + CircleMeasureTracker(IStatusBar* statusBar, + const OrthancStone::CoordinateSystem3D& slice, + double x, + double y, + uint8_t red, + uint8_t green, + uint8_t blue, + const Orthanc::Font& font); + + virtual bool HasRender() const + { + return true; + } + + virtual void Render(OrthancStone::CairoContext& context, + double zoom); + + double GetRadius() const; // In millimeters + + std::string FormatRadius() const; + + virtual void MouseUp() + { + // Possibly create a new landmark "volume" with the circle in subclasses + } + + virtual void MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/ColorFrameRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/ColorFrameRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ColorFrameRenderer.h" + +#include +#include +#include + +namespace Deprecated +{ + OrthancStone::CairoSurface* ColorFrameRenderer::GenerateDisplay(const RenderStyle& style) + { + std::unique_ptr display + (new OrthancStone::CairoSurface(frame_->GetWidth(), frame_->GetHeight(), false /* no alpha */)); + + Orthanc::ImageAccessor target; + display->GetWriteableAccessor(target); + + Orthanc::ImageProcessing::Convert(target, *frame_); + + return display.release(); + } + + + ColorFrameRenderer::ColorFrameRenderer(const Orthanc::ImageAccessor& frame, + const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality) : + FrameRenderer(framePlane, pixelSpacingX, pixelSpacingY, isFullQuality), + frame_(Orthanc::Image::Clone(frame)) + { + if (frame_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (frame_->GetFormat() != Orthanc::PixelFormat_RGB24) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/ColorFrameRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/ColorFrameRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "FrameRenderer.h" + +namespace Deprecated +{ + class ColorFrameRenderer : public FrameRenderer + { + private: + std::unique_ptr frame_; // In RGB24 + + protected: + virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style); + + public: + ColorFrameRenderer(const Orthanc::ImageAccessor& frame, + const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/DicomSeriesVolumeSlicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/DicomSeriesVolumeSlicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,181 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomSeriesVolumeSlicer.h" + +#include "FrameRenderer.h" +#include "../Toolbox/DicomFrameConverter.h" + +#include +#include + +#include + +namespace Deprecated +{ + + void DicomSeriesVolumeSlicer::OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message) + { + if (message.GetOrigin().GetSlicesCount() > 0) + { + BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); + } + else + { + BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); + } + } + + void DicomSeriesVolumeSlicer::OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message) + { + BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); + } + + + class DicomSeriesVolumeSlicer::RendererFactory : public LayerReadyMessage::IRendererFactory + { + private: + const OrthancSlicesLoader::SliceImageReadyMessage& message_; + + public: + RendererFactory(const OrthancSlicesLoader::SliceImageReadyMessage& message) : + message_(message) + { + } + + virtual ILayerRenderer* CreateRenderer() const + { + bool isFull = (message_.GetEffectiveQuality() == SliceImageQuality_FullPng || + message_.GetEffectiveQuality() == SliceImageQuality_FullPam); + + return FrameRenderer::CreateRenderer(message_.GetImage(), message_.GetSlice(), isFull); + } + }; + + void DicomSeriesVolumeSlicer::OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message) + { + // first notify that the pixel data of the frame is ready (targeted to, i.e: an image cache) + BroadcastMessage(FrameReadyMessage(*this, message.GetImage(), + message.GetEffectiveQuality(), message.GetSlice())); + + // then notify that the layer is ready for rendering + RendererFactory factory(message); + BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, message.GetSlice().GetGeometry())); + } + + void DicomSeriesVolumeSlicer::OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message) + { + BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, message.GetSlice().GetGeometry())); + } + + + DicomSeriesVolumeSlicer::DicomSeriesVolumeSlicer() : + quality_(SliceImageQuality_FullPng) + { + } + + void DicomSeriesVolumeSlicer::Connect(boost::shared_ptr orthanc) + { + loader_.reset(new OrthancSlicesLoader(orthanc)); + Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceGeometryReady); + Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceGeometryError); + Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceImageReady); + Register(*loader_, &DicomSeriesVolumeSlicer::OnSliceImageError); + } + + void DicomSeriesVolumeSlicer::LoadSeries(const std::string& seriesId) + { + if (loader_.get() == NULL) + { + // Should have called "Connect()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + loader_->ScheduleLoadSeries(seriesId); + } + + + void DicomSeriesVolumeSlicer::LoadInstance(const std::string& instanceId) + { + if (loader_.get() == NULL) + { + // Should have called "Connect()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + loader_->ScheduleLoadInstance(instanceId); + } + + + void DicomSeriesVolumeSlicer::LoadFrame(const std::string& instanceId, + unsigned int frame) + { + if (loader_.get() == NULL) + { + // Should have called "Connect()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + loader_->ScheduleLoadFrame(instanceId, frame); + } + + + bool DicomSeriesVolumeSlicer::GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice) + { + if (loader_.get() == NULL) + { + // Should have called "Connect()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + size_t index; + + if (loader_->IsGeometryReady() && + loader_->LookupSlice(index, viewportSlice)) + { + loader_->GetSlice(index).GetExtent(points); + return true; + } + else + { + return false; + } + } + + + void DicomSeriesVolumeSlicer::ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) + { + if (loader_.get() == NULL) + { + // Should have called "Connect()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + size_t index; + + if (loader_->IsGeometryReady() && + loader_->LookupSlice(index, viewportSlice)) + { + loader_->ScheduleLoadSliceImage(index, quality_); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/DicomSeriesVolumeSlicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/DicomSeriesVolumeSlicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,129 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IVolumeSlicer.h" +#include "../../Messages/ObserverBase.h" +#include "../Toolbox/IWebService.h" +#include "../Toolbox/OrthancSlicesLoader.h" +#include "../Toolbox/OrthancApiClient.h" + +namespace Deprecated +{ + // this class is in charge of loading a Frame. + // once it's been loaded (first the geometry and then the image), + // messages are sent to observers so they can use it + class DicomSeriesVolumeSlicer : + public IVolumeSlicer, + public OrthancStone::ObserverBase + //private OrthancSlicesLoader::ISliceLoaderObserver + { + public: + // TODO: Add "frame" and "instanceId" + class FrameReadyMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Orthanc::ImageAccessor& frame_; + SliceImageQuality imageQuality_; + const Slice& slice_; + + public: + FrameReadyMessage(DicomSeriesVolumeSlicer& origin, + const Orthanc::ImageAccessor& frame, + SliceImageQuality imageQuality, + const Slice& slice) : + OriginMessage(origin), + frame_(frame), + imageQuality_(imageQuality), + slice_(slice) + { + } + + const Orthanc::ImageAccessor& GetFrame() const + { + return frame_; + } + + SliceImageQuality GetImageQuality() const + { + return imageQuality_; + } + + const Slice& GetSlice() const + { + return slice_; + } + }; + + + private: + class RendererFactory; + + boost::shared_ptr loader_; + SliceImageQuality quality_; + + public: + DicomSeriesVolumeSlicer(); + + void Connect(boost::shared_ptr orthanc); + + void LoadSeries(const std::string& seriesId); + + void LoadInstance(const std::string& instanceId); + + void LoadFrame(const std::string& instanceId, + unsigned int frame); + + void SetImageQuality(SliceImageQuality quality) + { + quality_ = quality; + } + + SliceImageQuality GetImageQuality() const + { + return quality_; + } + + size_t GetSlicesCount() const + { + return loader_->GetSlicesCount(); + } + + const Slice& GetSlice(size_t slice) const + { + return loader_->GetSlice(slice); + } + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice); + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice); + +protected: + void OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message); + void OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message); + void OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message); + void OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/DicomStructureSetSlicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/DicomStructureSetSlicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,183 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "DicomStructureSetSlicer.h" + +#include "../../Toolbox/DicomStructureSet.h" + +namespace Deprecated +{ + class DicomStructureSetSlicer::Renderer : public ILayerRenderer + { + private: + class Structure + { + private: + bool visible_; + uint8_t red_; + uint8_t green_; + uint8_t blue_; + std::string name_; + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + std::vector< std::vector > polygons_; +#else + std::vector< std::pair > segments_; +#endif + + public: + Structure(OrthancStone::DicomStructureSet& structureSet, + const OrthancStone::CoordinateSystem3D& plane, + size_t index) : + name_(structureSet.GetStructureName(index)) + { + structureSet.GetStructureColor(red_, green_, blue_, index); + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + visible_ = structureSet.ProjectStructure(polygons_, index, plane); +#else + visible_ = structureSet.ProjectStructure(segments_, index, plane); +#endif + } + + void Render(OrthancStone::CairoContext& context) + { + if (visible_) + { + cairo_t* cr = context.GetObject(); + + context.SetSourceColor(red_, green_, blue_); + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + for (size_t i = 0; i < polygons_.size(); i++) + { + cairo_move_to(cr, polygons_[i][0].x, polygons_[i][0].y); + for (size_t j = 0; j < polygons_[i].size(); j++) + { + cairo_line_to(cr, polygons_[i][j].x, polygons_[i][j].y); + } + cairo_line_to(cr, polygons_[i][0].x, polygons_[i][0].y); + cairo_stroke(cr); + } +#else + for (size_t i = 0; i < segments_.size(); i++) + { + cairo_move_to(cr, segments_[i].first.x, segments_[i].first.y); + cairo_line_to(cr, segments_[i].second.x, segments_[i].second.y); + cairo_stroke(cr); + } +#endif + } + } + }; + + typedef std::list Structures; + + OrthancStone::CoordinateSystem3D plane_; + Structures structures_; + + public: + Renderer(OrthancStone::DicomStructureSet& structureSet, + const OrthancStone::CoordinateSystem3D& plane) : + plane_(plane) + { + for (size_t k = 0; k < structureSet.GetStructuresCount(); k++) + { + structures_.push_back(new Structure(structureSet, plane, k)); + } + } + + virtual ~Renderer() + { + for (Structures::iterator it = structures_.begin(); + it != structures_.end(); ++it) + { + delete *it; + } + } + + virtual bool RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + cairo_set_line_width(context.GetObject(), 2.0f / view.GetZoom()); + + for (Structures::const_iterator it = structures_.begin(); + it != structures_.end(); ++it) + { + assert(*it != NULL); + (*it)->Render(context); + } + + return true; + } + + virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() + { + return plane_; + } + + virtual void SetLayerStyle(const RenderStyle& style) + { + } + + virtual bool IsFullQuality() + { + return true; + } + }; + + + class DicomStructureSetSlicer::RendererFactory : public LayerReadyMessage::IRendererFactory + { + private: + OrthancStone::DicomStructureSet& structureSet_; + const OrthancStone::CoordinateSystem3D& plane_; + + public: + RendererFactory(OrthancStone::DicomStructureSet& structureSet, + const OrthancStone::CoordinateSystem3D& plane) : + structureSet_(structureSet), + plane_(plane) + { + } + + virtual ILayerRenderer* CreateRenderer() const + { + return new Renderer(structureSet_, plane_); + } + }; + + + DicomStructureSetSlicer::DicomStructureSetSlicer(StructureSetLoader& loader) : + loader_(loader) + { + Register(loader_, &DicomStructureSetSlicer::OnStructureSetLoaded); + } + + + void DicomStructureSetSlicer::ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportPlane) + { + if (loader_.HasStructureSet()) + { + RendererFactory factory(loader_.GetStructureSet(), viewportPlane); + BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, viewportPlane)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/DicomStructureSetSlicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/DicomStructureSetSlicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IVolumeSlicer.h" +#include "../Volumes/StructureSetLoader.h" + +namespace Deprecated +{ + class DicomStructureSetSlicer : + public IVolumeSlicer, + public OrthancStone::ObserverBase + { + private: + class Renderer; + class RendererFactory; + + StructureSetLoader& loader_; + + void OnStructureSetLoaded(const IVolumeLoader::ContentChangedMessage& message) + { + BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); + } + + public: + DicomStructureSetSlicer(StructureSetLoader& loader); + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportPlane) + { + return false; + } + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportPlane); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/FrameRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/FrameRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,140 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "FrameRenderer.h" + +#include "GrayscaleFrameRenderer.h" +#include "ColorFrameRenderer.h" + +#include + +namespace Deprecated +{ + FrameRenderer::FrameRenderer(const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality) : + framePlane_(framePlane), + pixelSpacingX_(pixelSpacingX), + pixelSpacingY_(pixelSpacingY), + isFullQuality_(isFullQuality) + { + } + + + bool FrameRenderer::RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + if (!style_.visible_) + { + return true; + } + + if (display_.get() == NULL) + { + display_.reset(GenerateDisplay(style_)); + } + + assert(display_.get() != NULL); + + cairo_t *cr = context.GetObject(); + + cairo_save(cr); + + cairo_matrix_t transform; + cairo_matrix_init_identity(&transform); + cairo_matrix_scale(&transform, pixelSpacingX_, pixelSpacingY_); + cairo_matrix_translate(&transform, -0.5, -0.5); + cairo_transform(cr, &transform); + + //cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(cr, display_->GetObject(), 0, 0); + + switch (style_.interpolation_) + { + case OrthancStone::ImageInterpolation_Nearest: + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); + break; + + case OrthancStone::ImageInterpolation_Bilinear: + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + cairo_paint_with_alpha(cr, style_.alpha_); + + if (style_.drawGrid_) + { + context.SetSourceColor(style_.drawColor_); + cairo_set_line_width(cr, 0.5 / view.GetZoom()); + + for (unsigned int x = 0; x <= display_->GetWidth(); x++) + { + cairo_move_to(cr, x, 0); + cairo_line_to(cr, x, display_->GetHeight()); + } + + for (unsigned int y = 0; y <= display_->GetHeight(); y++) + { + cairo_move_to(cr, 0, y); + cairo_line_to(cr, display_->GetWidth(), y); + } + + cairo_stroke(cr); + } + + cairo_restore(cr); + + return true; + } + + + void FrameRenderer::SetLayerStyle(const RenderStyle& style) + { + style_ = style; + display_.reset(NULL); + } + + + ILayerRenderer* FrameRenderer::CreateRenderer(const Orthanc::ImageAccessor& frame, + const Deprecated::Slice& framePlane, + bool isFullQuality) + { + if (frame.GetFormat() == Orthanc::PixelFormat_RGB24) + { + return new ColorFrameRenderer(frame, + framePlane.GetGeometry(), + framePlane.GetPixelSpacingX(), + framePlane.GetPixelSpacingY(), isFullQuality); + } + else + { + return new GrayscaleFrameRenderer(frame, + framePlane.GetConverter(), + framePlane.GetGeometry(), + framePlane.GetPixelSpacingX(), + framePlane.GetPixelSpacingY(), isFullQuality); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/FrameRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/FrameRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRenderer.h" + +#include "../Toolbox/Slice.h" + +namespace Deprecated +{ + class FrameRenderer : public ILayerRenderer + { + private: + OrthancStone::CoordinateSystem3D framePlane_; + double pixelSpacingX_; + double pixelSpacingY_; + RenderStyle style_; + bool isFullQuality_; + std::unique_ptr display_; + + protected: + virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style) = 0; + + public: + FrameRenderer(const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality); + + virtual bool RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view); + + virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() + { + return framePlane_; + } + + virtual void SetLayerStyle(const RenderStyle& style); + + virtual bool IsFullQuality() + { + return isFullQuality_; + } + + // TODO: Avoid cloning the "frame" + static ILayerRenderer* CreateRenderer(const Orthanc::ImageAccessor& frame, + const Deprecated::Slice& framePlane, + bool isFullQuality); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/GrayscaleFrameRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/GrayscaleFrameRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,141 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GrayscaleFrameRenderer.h" + +#include +#include + +namespace Deprecated +{ + OrthancStone::CairoSurface* GrayscaleFrameRenderer::GenerateDisplay(const RenderStyle& style) + { + assert(frame_->GetFormat() == Orthanc::PixelFormat_Float32); + + std::unique_ptr result; + + float windowCenter, windowWidth; + style.ComputeWindowing(windowCenter, windowWidth, + defaultWindowCenter_, defaultWindowWidth_); + + float x0 = windowCenter - windowWidth / 2.0f; + float x1 = windowCenter + windowWidth / 2.0f; + + //LOG(INFO) << "Window: " << x0 << " => " << x1; + + result.reset(new OrthancStone::CairoSurface(frame_->GetWidth(), frame_->GetHeight(), false /* no alpha */)); + + const uint8_t* lut = NULL; + if (style.applyLut_) + { + if (Orthanc::EmbeddedResources::GetFileResourceSize(style.lut_) != 3 * 256) + { + // Invalid colormap + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + lut = reinterpret_cast(Orthanc::EmbeddedResources::GetFileResourceBuffer(style.lut_)); + } + + Orthanc::ImageAccessor target; + result->GetWriteableAccessor(target); + + const unsigned int width = target.GetWidth(); + const unsigned int height = target.GetHeight(); + + for (unsigned int y = 0; y < height; y++) + { + const float* p = reinterpret_cast(frame_->GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < width; x++, p++, q += 4) + { + uint8_t v = 0; + if (windowWidth >= 0.001f) // Avoid division by zero + { + if (*p >= x1) + { + v = 255; + } + else if (*p <= x0) + { + v = 0; + } + else + { + // https://en.wikipedia.org/wiki/Linear_interpolation + v = static_cast(255.0f * (*p - x0) / (x1 - x0)); + } + + if (style.reverse_ ^ (photometric_ == Orthanc::PhotometricInterpretation_Monochrome1)) + { + v = 255 - v; + } + } + + if (style.applyLut_) + { + assert(lut != NULL); + q[3] = 255; + q[2] = lut[3 * v]; + q[1] = lut[3 * v + 1]; + q[0] = lut[3 * v + 2]; + } + else + { + q[3] = 255; + q[2] = v; + q[1] = v; + q[0] = v; + } + } + } + + return result.release(); + } + + + GrayscaleFrameRenderer::GrayscaleFrameRenderer(const Orthanc::ImageAccessor& frame, + const Deprecated::DicomFrameConverter& converter, + const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality) : + FrameRenderer(framePlane, pixelSpacingX, pixelSpacingY, isFullQuality), + frame_(Orthanc::Image::Clone(frame)), + defaultWindowCenter_(static_cast(converter.GetDefaultWindowCenter())), + defaultWindowWidth_(static_cast(converter.GetDefaultWindowWidth())), + photometric_(converter.GetPhotometricInterpretation()) + { + if (frame_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + converter.ConvertFrameInplace(frame_); + assert(frame_.get() != NULL); + + if (frame_->GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/GrayscaleFrameRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/GrayscaleFrameRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,48 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "FrameRenderer.h" +#include "../Toolbox/DicomFrameConverter.h" + +namespace Deprecated +{ + class GrayscaleFrameRenderer : public FrameRenderer + { + private: + std::unique_ptr frame_; // In Float32 + float defaultWindowCenter_; + float defaultWindowWidth_; + Orthanc::PhotometricInterpretation photometric_; + + protected: + virtual OrthancStone::CairoSurface* GenerateDisplay(const RenderStyle& style); + + public: + GrayscaleFrameRenderer(const Orthanc::ImageAccessor& frame, + const Deprecated::DicomFrameConverter& converter, + const OrthancStone::CoordinateSystem3D& framePlane, + double pixelSpacingX, + double pixelSpacingY, + bool isFullQuality); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/ILayerRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/ILayerRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,47 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoContext.h" +#include "../../Toolbox/CoordinateSystem3D.h" +#include "../Toolbox/ViewportGeometry.h" +#include "RenderStyle.h" + +namespace Deprecated +{ + class ILayerRenderer : public boost::noncopyable + { + public: + virtual ~ILayerRenderer() + { + } + + virtual bool RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view) = 0; + + virtual void SetLayerStyle(const RenderStyle& style) = 0; + + virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() = 0; + + virtual bool IsFullQuality() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/IVolumeSlicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/IVolumeSlicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,134 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRenderer.h" +#include "../Toolbox/Slice.h" +#include "../../Messages/IObservable.h" +#include "../../Messages/IMessage.h" +#include "Images/Image.h" +#include + +namespace Deprecated +{ + class IVolumeSlicer : public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, IVolumeSlicer); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, IVolumeSlicer); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, IVolumeSlicer); + + class SliceContentChangedMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Deprecated::Slice& slice_; + + public: + SliceContentChangedMessage(IVolumeSlicer& origin, + const Deprecated::Slice& slice) : + OriginMessage(origin), + slice_(slice) + { + } + + const Deprecated::Slice& GetSlice() const + { + return slice_; + } + }; + + + class LayerReadyMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + public: + class IRendererFactory : public boost::noncopyable + { + public: + virtual ~IRendererFactory() + { + } + + virtual ILayerRenderer* CreateRenderer() const = 0; + }; + + private: + const IRendererFactory& factory_; + const OrthancStone::CoordinateSystem3D& slice_; + + public: + LayerReadyMessage(IVolumeSlicer& origin, + const IRendererFactory& rendererFactory, + const OrthancStone::CoordinateSystem3D& slice) : + OriginMessage(origin), + factory_(rendererFactory), + slice_(slice) + { + } + + ILayerRenderer* CreateRenderer() const + { + return factory_.CreateRenderer(); + } + + const OrthancStone::CoordinateSystem3D& GetSlice() const + { + return slice_; + } + }; + + + class LayerErrorMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const OrthancStone::CoordinateSystem3D& slice_; + + public: + LayerErrorMessage(IVolumeSlicer& origin, + const OrthancStone::CoordinateSystem3D& slice) : + OriginMessage(origin), + slice_(slice) + { + } + + const OrthancStone::CoordinateSystem3D& GetSlice() const + { + return slice_; + } + }; + + + virtual ~IVolumeSlicer() + { + } + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice) = 0; + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/LineLayerRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/LineLayerRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LineLayerRenderer.h" + +namespace Deprecated +{ + LineLayerRenderer::LineLayerRenderer(double x1, + double y1, + double x2, + double y2, + const OrthancStone::CoordinateSystem3D& plane) : + x1_(x1), + y1_(y1), + x2_(x2), + y2_(y2), + plane_(plane) + { + RenderStyle style; + SetLayerStyle(style); + } + + + bool LineLayerRenderer::RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + if (visible_) + { + context.SetSourceColor(color_); + + cairo_t *cr = context.GetObject(); + cairo_set_line_width(cr, 1.0 / view.GetZoom()); + cairo_move_to(cr, x1_, y1_); + cairo_line_to(cr, x2_, y2_); + cairo_stroke(cr); + } + + return true; + } + + + void LineLayerRenderer::SetLayerStyle(const RenderStyle& style) + { + visible_ = style.visible_; + color_[0] = style.drawColor_[0]; + color_[1] = style.drawColor_[1]; + color_[2] = style.drawColor_[2]; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/LineLayerRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/LineLayerRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRenderer.h" + +namespace Deprecated +{ + class LineLayerRenderer : public ILayerRenderer + { + private: + double x1_; + double y1_; + double x2_; + double y2_; + OrthancStone::CoordinateSystem3D plane_; + bool visible_; + uint8_t color_[3]; + + public: + LineLayerRenderer(double x1, + double y1, + double x2, + double y2, + const OrthancStone::CoordinateSystem3D& plane); + + virtual bool RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view); + + virtual void SetLayerStyle(const RenderStyle& style); + + virtual const OrthancStone::CoordinateSystem3D& GetLayerPlane() + { + return plane_; + } + + virtual bool IsFullQuality() + { + return true; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/LineMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/LineMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,102 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LineMeasureTracker.h" + +#include + +namespace Deprecated +{ + LineMeasureTracker::LineMeasureTracker(IStatusBar* statusBar, + const OrthancStone::CoordinateSystem3D& slice, + double x, + double y, + uint8_t red, + uint8_t green, + uint8_t blue, + const Orthanc::Font& font) : + statusBar_(statusBar), + slice_(slice), + x1_(x), + y1_(y), + x2_(x), + y2_(y), + font_(font) + { + color_[0] = red; + color_[1] = green; + color_[2] = blue; + } + + + void LineMeasureTracker::Render(OrthancStone::CairoContext& context, + double zoom) + { + context.SetSourceColor(color_[0], color_[1], color_[2]); + + cairo_t* cr = context.GetObject(); + cairo_set_line_width(cr, 2.0 / zoom); + cairo_move_to(cr, x1_, y1_); + cairo_line_to(cr, x2_, y2_); + cairo_stroke(cr); + + if (y2_ - y1_ < 0) + { + context.DrawText(font_, FormatLength(), x2_, y2_ - 5, OrthancStone::BitmapAnchor_BottomCenter); + } + else + { + context.DrawText(font_, FormatLength(), x2_, y2_ + 5, OrthancStone::BitmapAnchor_TopCenter); + } + } + + + double LineMeasureTracker::GetLength() const // In millimeters + { + OrthancStone::Vector a = slice_.MapSliceToWorldCoordinates(x1_, y1_); + OrthancStone::Vector b = slice_.MapSliceToWorldCoordinates(x2_, y2_); + return boost::numeric::ublas::norm_2(b - a); + } + + + std::string LineMeasureTracker::FormatLength() const + { + char buf[64]; + sprintf(buf, "%0.01f cm", GetLength() / 10.0); + return buf; + } + + void LineMeasureTracker::MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + x2_ = x; + y2_ = y; + + if (statusBar_ != NULL) + { + statusBar_->SetMessage("Line length: " + FormatLength()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/LineMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/LineMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Widgets/IWorldSceneMouseTracker.h" + +#include "../Viewport/IStatusBar.h" +#include "../../Toolbox/CoordinateSystem3D.h" + +namespace Deprecated +{ + class LineMeasureTracker : public IWorldSceneMouseTracker + { + private: + IStatusBar* statusBar_; + OrthancStone::CoordinateSystem3D slice_; + double x1_; + double y1_; + double x2_; + double y2_; + uint8_t color_[3]; + unsigned int fontSize_; + const Orthanc::Font& font_; + + public: + LineMeasureTracker(IStatusBar* statusBar, + const OrthancStone::CoordinateSystem3D& slice, + double x, + double y, + uint8_t red, + uint8_t green, + uint8_t blue, + const Orthanc::Font& font); + + virtual bool HasRender() const + { + return true; + } + + virtual void Render(OrthancStone::CairoContext& context, + double zoom); + + double GetLength() const; // In millimeters + + std::string FormatLength() const; + + virtual void MouseUp() + { + // Possibly create a new landmark "volume" with the line in subclasses + } + + virtual void MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/RenderStyle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/RenderStyle.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,106 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RenderStyle.h" + +#include "../../Volumes/ImageBuffer3D.h" +#include "../Toolbox/DicomFrameConverter.h" + +#include + +namespace Deprecated +{ + RenderStyle::RenderStyle() + { + visible_ = true; + reverse_ = false; + windowing_ = OrthancStone::ImageWindowing_Custom; + alpha_ = 1; + applyLut_ = false; + lut_ = Orthanc::EmbeddedResources::COLORMAP_HOT; + drawGrid_ = false; + drawColor_[0] = 255; + drawColor_[1] = 255; + drawColor_[2] = 255; + customWindowCenter_ = 128; + customWindowWidth_ = 256; + interpolation_ = OrthancStone::ImageInterpolation_Nearest; + fontSize_ = 14; + } + + + void RenderStyle::ComputeWindowing(float& targetCenter, + float& targetWidth, + float defaultCenter, + float defaultWidth) const + { + if (windowing_ == OrthancStone::ImageWindowing_Custom) + { + targetCenter = customWindowCenter_; + targetWidth = customWindowWidth_; + } + else + { + return ::OrthancStone::ComputeWindowing + (targetCenter, targetWidth, windowing_, defaultCenter, defaultWidth); + } + } + + + void RenderStyle::SetColor(uint8_t red, + uint8_t green, + uint8_t blue) + { + drawColor_[0] = red; + drawColor_[1] = green; + drawColor_[2] = blue; + } + + + bool RenderStyle::FitRange(const OrthancStone::ImageBuffer3D& image, + const DicomFrameConverter& converter) + { + float minValue, maxValue; + + windowing_ = OrthancStone::ImageWindowing_Custom; + + if (image.GetRange(minValue, maxValue)) + { + // casting the narrower type to wider before calling the + operator + // will prevent overflowing (this is why the cast to double is only + // done on the first operand) + customWindowCenter_ = static_cast( + converter.Apply((static_cast(minValue) + maxValue) / 2.0)); + + customWindowWidth_ = static_cast( + converter.Apply(static_cast(maxValue) - minValue)); + + if (customWindowWidth_ > 1) + { + return true; + } + } + + customWindowCenter_ = 128.0; + customWindowWidth_ = 256.0; + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/RenderStyle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/RenderStyle.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../StoneEnumerations.h" +#include "../../Volumes/ImageBuffer3D.h" +#include "../Toolbox/DicomFrameConverter.h" + +#include + +#include + +namespace Deprecated +{ + struct RenderStyle + { + bool visible_; + bool reverse_; + OrthancStone::ImageWindowing windowing_; + float alpha_; // In [0,1] + bool applyLut_; + Orthanc::EmbeddedResources::FileResourceId lut_; + bool drawGrid_; + uint8_t drawColor_[3]; + float customWindowCenter_; + float customWindowWidth_; + OrthancStone::ImageInterpolation interpolation_; + unsigned int fontSize_; + + RenderStyle(); + + void ComputeWindowing(float& targetCenter, + float& targetWidth, + float defaultCenter, + float defaultWidth) const; + + void SetColor(uint8_t red, + uint8_t green, + uint8_t blue); + + bool FitRange(const OrthancStone::ImageBuffer3D& image, + const DicomFrameConverter& converter); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SeriesFrameRendererFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SeriesFrameRendererFactory.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,177 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SeriesFrameRendererFactory.h" + +#include "FrameRenderer.h" + +#include +#include +#include +#include +#include + + +namespace Deprecated +{ + void SeriesFrameRendererFactory::ReadCurrentFrameDataset(size_t frame) + { + if (currentDataset_.get() != NULL && + (fast_ || currentFrame_ == frame)) + { + // The frame has not changed since the previous call, no need to + // update the DICOM dataset + return; + } + + currentDataset_.reset(loader_->DownloadDicom(frame)); + currentFrame_ = frame; + + if (currentDataset_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + void SeriesFrameRendererFactory::GetCurrentPixelSpacing(double& spacingX, + double& spacingY) const + { + if (currentDataset_.get() == NULL) + { + // There was no previous call "ReadCurrentFrameDataset()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + GeometryToolbox::GetPixelSpacing(spacingX, spacingY, *currentDataset_); + } + + + double SeriesFrameRendererFactory::GetCurrentSliceThickness() const + { + if (currentDataset_.get() == NULL) + { + // There was no previous call "ReadCurrentFrameDataset()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + try + { + OrthancPlugins::DicomDatasetReader reader(*currentDataset_); + + double thickness; + if (reader.GetDoubleValue(thickness, OrthancPlugins::DICOM_TAG_SLICE_THICKNESS)) + { + return thickness; + } + } + catch (ORTHANC_PLUGINS_EXCEPTION_CLASS& e) + { + } + + // Some arbitrary large slice thickness + return std::numeric_limits::infinity(); + } + + + SeriesFrameRendererFactory::SeriesFrameRendererFactory(ISeriesLoader* loader, // Takes ownership + bool fast) : + loader_(loader), + currentFrame_(0), + fast_(fast) + { + if (loader == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + bool SeriesFrameRendererFactory::GetExtent(double& x1, + double& y1, + double& x2, + double& y2, + const SliceGeometry& viewportSlice) + { + if (currentDataset_.get() == NULL) + { + // There has been no previous call to + // "CreateLayerRenderer". Read some arbitrary DICOM frame, the + // one at the middle of the series. + unsigned int depth = loader_->GetGeometry().GetSliceCount(); + ReadCurrentFrameDataset(depth / 2); + } + + double spacingX, spacingY; + GetCurrentPixelSpacing(spacingX, spacingY); + + return FrameRenderer::ComputeFrameExtent(x1, y1, x2, y2, + viewportSlice, + loader_->GetGeometry().GetSlice(0), + loader_->GetWidth(), + loader_->GetHeight(), + spacingX, spacingY); + } + + + ILayerRenderer* SeriesFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) + { + size_t closest; + double distance; + + bool isOpposite; + if (!GeometryToolbox::IsParallelOrOpposite(isOpposite, loader_->GetGeometry().GetNormal(), viewportSlice.GetNormal()) || + !loader_->GetGeometry().ComputeClosestSlice(closest, distance, viewportSlice.GetOrigin())) + { + // Unable to compute the slice in the series that is the + // closest to the slice displayed by the viewport + return NULL; + } + + ReadCurrentFrameDataset(closest); + assert(currentDataset_.get() != NULL); + + double spacingX, spacingY; + GetCurrentPixelSpacing(spacingX, spacingY); + + if (distance <= GetCurrentSliceThickness() / 2.0) + { + SliceGeometry frameSlice(*currentDataset_); + return FrameRenderer::CreateRenderer(loader_->DownloadFrame(closest), + frameSlice, + *currentDataset_, + spacingX, spacingY, + true); + } + else + { + // The closest slice of the series is too far away from the + // slice displayed by the viewport + return NULL; + } + } + + + ISliceableVolume& SeriesFrameRendererFactory::GetSourceVolume() const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SeriesFrameRendererFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SeriesFrameRendererFactory.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,65 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRendererFactory.h" + +#include "../Toolbox/ISeriesLoader.h" + +namespace Deprecated +{ + class SeriesFrameRendererFactory : public ILayerRendererFactory + { + private: + std::unique_ptr loader_; + size_t currentFrame_; + bool fast_; + + std::unique_ptr currentDataset_; + + void ReadCurrentFrameDataset(size_t frame); + + void GetCurrentPixelSpacing(double& spacingX, + double& spacingY) const; + + double GetCurrentSliceThickness() const; + + public: + SeriesFrameRendererFactory(ISeriesLoader* loader, // Takes ownership + bool fast); + + virtual bool GetExtent(double& x1, + double& y1, + double& x2, + double& y2, + const SliceGeometry& viewportSlice); + + virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); + + virtual bool HasSourceVolume() const + { + return false; + } + + virtual ISliceableVolume& GetSourceVolume() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SingleFrameRendererFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SingleFrameRendererFactory.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,88 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SingleFrameRendererFactory.h" + +#include "FrameRenderer.h" +#include "../Toolbox/MessagingToolbox.h" +#include "../Toolbox/DicomFrameConverter.h" + +#include +#include +#include + +namespace Deprecated +{ + SingleFrameRendererFactory::SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId, + unsigned int frame) : + orthanc_(orthanc), + instance_(instanceId), + frame_(frame) + { + dicom_.reset(new OrthancPlugins::FullOrthancDataset(orthanc, "/instances/" + instanceId + "/tags")); + + DicomFrameConverter converter; + converter.ReadParameters(*dicom_); + format_ = converter.GetExpectedPixelFormat(); + } + + + bool SingleFrameRendererFactory::GetExtent(double& x1, + double& y1, + double& x2, + double& y2, + const SliceGeometry& viewportSlice) + { + // Assume that PixelSpacingX == PixelSpacingY == 1 + + OrthancPlugins::DicomDatasetReader reader(*dicom_); + + unsigned int width, height; + + if (!reader.GetUnsignedIntegerValue(width, OrthancPlugins::DICOM_TAG_COLUMNS) || + !reader.GetUnsignedIntegerValue(height, OrthancPlugins::DICOM_TAG_ROWS)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + x1 = 0; + y1 = 0; + x2 = static_cast(width); + y2 = static_cast(height); + + return true; + } + + + ILayerRenderer* SingleFrameRendererFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) + { + SliceGeometry frameSlice(*dicom_); + return FrameRenderer::CreateRenderer(MessagingToolbox::DecodeFrame(orthanc_, instance_, frame_, format_), + frameSlice, *dicom_, 1, 1, true); + } + + + ISliceableVolume& SingleFrameRendererFactory::GetSourceVolume() const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SingleFrameRendererFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SingleFrameRendererFactory.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRendererFactory.h" +#include + +namespace Deprecated +{ + class SingleFrameRendererFactory : public ILayerRendererFactory + { + private: + OrthancPlugins::IOrthancConnection& orthanc_; + std::unique_ptr dicom_; + + std::string instance_; + unsigned int frame_; + Orthanc::PixelFormat format_; + + public: + SingleFrameRendererFactory(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId, + unsigned int frame); + + const OrthancPlugins::IDicomDataset& GetDataset() const + { + return *dicom_; + } + + SliceGeometry GetSliceGeometry() + { + return SliceGeometry(*dicom_); + } + + virtual bool GetExtent(double& x1, + double& y1, + double& x2, + double& y2, + const SliceGeometry& viewportSlice); + + virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); + + virtual bool HasSourceVolume() const + { + return false; + } + + virtual ISliceableVolume& GetSourceVolume() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SliceOutlineRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SliceOutlineRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SliceOutlineRenderer.h" + +namespace Deprecated +{ + bool SliceOutlineRenderer::RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + if (style_.visible_) + { + cairo_t *cr = context.GetObject(); + cairo_save(cr); + + context.SetSourceColor(style_.drawColor_); + + double x1 = -0.5 * pixelSpacingX_; + double y1 = -0.5 * pixelSpacingY_; + + cairo_set_line_width(cr, 1.0 / view.GetZoom()); + cairo_rectangle(cr, x1, y1, + static_cast(width_) * pixelSpacingX_, + static_cast(height_) * pixelSpacingY_); + + double handleSize = 10.0f / view.GetZoom(); + cairo_move_to(cr, x1 + handleSize, y1); + cairo_line_to(cr, x1, y1 + handleSize); + + cairo_stroke(cr); + cairo_restore(cr); + } + + return true; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Layers/SliceOutlineRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Layers/SliceOutlineRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerRenderer.h" +#include "../Toolbox/Slice.h" + +namespace Deprecated +{ + class SliceOutlineRenderer : public ILayerRenderer + { + private: + OrthancStone::CoordinateSystem3D geometry_; + double pixelSpacingX_; + double pixelSpacingY_; + unsigned int width_; + unsigned int height_; + RenderStyle style_; + + public: + SliceOutlineRenderer(const Slice& slice) : + geometry_(slice.GetGeometry()), + pixelSpacingX_(slice.GetPixelSpacingX()), + pixelSpacingY_(slice.GetPixelSpacingY()), + width_(slice.GetWidth()), + height_(slice.GetHeight()) + { + } + + virtual bool RenderLayer(OrthancStone::CairoContext& context, + const ViewportGeometry& view); + + virtual void SetLayerStyle(const RenderStyle& style) + { + style_ = style; + } + + virtual const OrthancStone::CoordinateSystem3D& GetLayerSlice() + { + return geometry_; + } + + virtual bool IsFullQuality() + { + return true; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Loaders/DicomStructureSetLoader2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Loaders/DicomStructureSetLoader2.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,125 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructureSetLoader2.h" + +#include "../Messages/IObservable.h" +#include "../Oracle/IOracle.h" +#include "../Oracle/OracleCommandExceptionMessage.h" + +namespace Deprecated +{ + + DicomStructureSetLoader2::DicomStructureSetLoader2( + DicomStructureSet2& structureSet + , IOracle& oracle + , IObservable& oracleObservable) + : IObserver(oracleObservable.GetBroker()) + , IObservable(oracleObservable.GetBroker()) + , structureSet_(structureSet) + , oracle_(oracle) + , oracleObservable_(oracleObservable) + , structuresReady_(false) + { + LOG(TRACE) << "DicomStructureSetLoader2(" << std::hex << this << std::dec << ")::DicomStructureSetLoader2()"; + + oracleObservable.RegisterObserverCallback( + new Callable + (*this, &DicomStructureSetLoader2::HandleSuccessMessage)); + + oracleObservable.RegisterObserverCallback( + new Callable + (*this, &DicomStructureSetLoader2::HandleExceptionMessage)); + } + + DicomStructureSetLoader2::~DicomStructureSetLoader2() + { + LOG(TRACE) << "DicomStructureSetLoader2(" << std::hex << this << std::dec << ")::~DicomStructureSetLoader2()"; + oracleObservable_.Unregister(this); + } + + void DicomStructureSetLoader2::LoadInstanceFromString(const std::string& body) + { + OrthancPlugins::FullOrthancDataset dicom(body); + //loader.content_.reset(new DicomStructureSet(dicom)); + structureSet_.Clear(); + structureSet_.SetContents(dicom); + SetStructuresReady(); + } + + void DicomStructureSetLoader2::HandleSuccessMessage(const OrthancRestApiCommand::SuccessMessage& message) + { + const std::string& body = message.GetAnswer(); + LoadInstanceFromString(body); + } + + void DicomStructureSetLoader2::HandleExceptionMessage(const OracleCommandExceptionMessage& message) + { + LOG(ERROR) << "DicomStructureSetLoader2::HandleExceptionMessage: error when trying to load data. " + << "Error: " << message.GetException().What() << " Details: " + << message.GetException().GetDetails(); + } + + void DicomStructureSetLoader2::LoadInstance(const std::string& instanceId) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + + std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; + + command->SetUri(uri); + oracle_.Schedule(*this, command.release()); + } + + void DicomStructureSetLoader2::SetStructuresReady() + { + structuresReady_ = true; + } + + bool DicomStructureSetLoader2::AreStructuresReady() const + { + return structuresReady_; + } + + /* + + void LoaderStateMachine::HandleExceptionMessage(const OracleCommandExceptionMessage& message) + { + LOG(ERROR) << "LoaderStateMachine::HandleExceptionMessage: error in the state machine, stopping all processing"; + LOG(ERROR) << "Error: " << message.GetException().What() << " Details: " << + message.GetException().GetDetails(); + Clear(); + } + + LoaderStateMachine::~LoaderStateMachine() + { + Clear(); + } + + + */ + +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Loaders/DicomStructureSetLoader2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Loaders/DicomStructureSetLoader2.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,87 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "../Toolbox/DicomStructureSet2.h" +#include "../Messages/IMessage.h" +#include "../Messages/IObserver.h" +#include "../Messages/IObservable.h" +#include "../Oracle/OrthancRestApiCommand.h" + +#include + +namespace Deprecated +{ + class IOracle; + class IObservable; + class OrthancRestApiCommand; + class OracleCommandExceptionMessage; + + class DicomStructureSetLoader2 : public IObserver, public IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresReady, DicomStructureSetLoader2); + + /** + Warning: the structureSet, oracle and oracleObservable objects must live + at least as long as this object (TODO: shared_ptr?) + */ + DicomStructureSetLoader2(DicomStructureSet2& structureSet, IOracle& oracle, IObservable& oracleObservable); + + ~DicomStructureSetLoader2(); + + void LoadInstance(const std::string& instanceId); + + /** Internal use */ + void LoadInstanceFromString(const std::string& body); + + void SetStructuresReady(); + bool AreStructuresReady() const; + + private: + /** + Called back by the oracle when data is ready! + */ + void HandleSuccessMessage(const OrthancRestApiCommand::SuccessMessage& message); + + /** + Called back by the oracle when shit hits the fan + */ + void HandleExceptionMessage(const OracleCommandExceptionMessage& message); + + /** + The structure set that will be (cleared and) filled with data from the + loader + */ + DicomStructureSet2& structureSet_; + + IOracle& oracle_; + IObservable& oracleObservable_; + bool structuresReady_; + }; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Messages/LockingEmitter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Messages/LockingEmitter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "LockingEmitter.h" + +#include + +namespace Deprecated +{ + void LockingEmitter::EmitMessage(boost::weak_ptr observer, + const OrthancStone::IMessage& message) + { + try + { + boost::unique_lock lock(mutex_); + oracleObservable_.EmitMessage(observer, message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while emitting a message: " << e.What(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Messages/LockingEmitter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Messages/LockingEmitter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,87 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include + +#include "../../Messages/IMessageEmitter.h" +#include "../../Messages/IObservable.h" + +#include + +namespace Deprecated +{ + /** + * This class is used when using the ThreadedOracle : since messages + * can be sent from multiple Oracle threads, this IMessageEmitter + * implementation serializes the callbacks. + * + * The internal mutex used in Oracle messaging can also be used to + * protect the application data. Thus, this class can be used as a single + * application-wide mutex. + */ + class LockingEmitter : public OrthancStone::IMessageEmitter + { + private: + boost::shared_mutex mutex_; + OrthancStone::IObservable oracleObservable_; + + public: + virtual void EmitMessage(boost::weak_ptr observer, + const OrthancStone::IMessage& message) ORTHANC_OVERRIDE; + + + class ReaderLock : public boost::noncopyable + { + private: + LockingEmitter& that_; + boost::shared_lock lock_; + + public: + ReaderLock(LockingEmitter& that) : + that_(that), + lock_(that.mutex_) + { + } + }; + + + class WriterLock : public boost::noncopyable + { + private: + LockingEmitter& that_; + boost::unique_lock lock_; + + public: + WriterLock(LockingEmitter& that) : + that_(that), + lock_(that.mutex_) + { + } + + OrthancStone::IObservable& GetOracleObservable() + { + return that_.oracleObservable_; + } + }; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyAlphaLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyAlphaLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,152 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyAlphaLayer.h" + +#include "RadiographyScene.h" +#include "../Toolbox/ImageGeometry.h" + +#include +#include +#include + + +namespace OrthancStone +{ + + void RadiographyAlphaLayer::SetAlpha(Orthanc::ImageAccessor* image) + { + std::unique_ptr raii(image); + + if (image == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (image->GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + SetSize(image->GetWidth(), image->GetHeight()); + +#if __cplusplus < 201103L + alpha_.reset(raii.release()); +#else + alpha_ = std::move(raii); +#endif + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyAlphaLayer::Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const + { + if (alpha_.get() == NULL) + { + return; + } + + if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + unsigned int cropX, cropY, cropWidth, cropHeight; + GetCrop(cropX, cropY, cropWidth, cropHeight); + + const AffineTransform2D t = AffineTransform2D::Combine( + viewTransform, GetTransform(), + AffineTransform2D::CreateOffset(cropX, cropY)); + + Orthanc::ImageAccessor cropped; + alpha_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); + + Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); + + unsigned int x1, y1, x2, y2; + + if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, + t.GetHomogeneousMatrix(), + cropped.GetWidth(), + cropped.GetHeight(), + buffer.GetWidth(), + buffer.GetHeight())) + { + return; // layer is outside the buffer + } + + t.Apply(tmp, cropped, interpolation, true /* clear */); + + float value = foreground_; + + if (!applyWindowing) // if applying the windowing, it means we are ie rendering the image for a realtime visualization -> the foreground_ value is the value we want to see on the screen -> don't change it + { + // if not applying the windowing, it means ie that we are saving a dicom image to file and the windowing will be applied by a viewer later on -> we want the "foreground" value to be correct once the windowing will be applied + value = windowCenter - windowWidth/2 + (foreground_ / 65535.0f) * windowWidth; + + if (value < 0.0f) + { + value = 0.0f; + } + if (value > 65535.0f) + { + value = 65535.0f; + } + } + + for (unsigned int y = y1; y <= y2; y++) + { + float *q = reinterpret_cast(buffer.GetRow(y)) + x1; + const uint8_t *p = reinterpret_cast(tmp.GetRow(y)) + x1; + + for (unsigned int x = x1; x <= x2; x++, p++, q++) + { + float a = static_cast(*p) / 255.0f; + + *q = (a * value + (1.0f - a) * (*q)); + } + } + } + + bool RadiographyAlphaLayer::GetRange(float& minValue, + float& maxValue) const + { + minValue = 0; + maxValue = 0; + + if (foreground_ < 0) + { + minValue = foreground_; + } + + if (foreground_ > 0) + { + maxValue = foreground_; + } + + return true; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyAlphaLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyAlphaLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,85 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyLayer.h" + +#include + +namespace OrthancStone +{ + class RadiographyScene; + + // creates a transparent layer whose alpha channel is provided as a UINT8 image to SetAlpha. + // The color of the "mask" is either defined by a ForegroundValue or by the center value of the + // windowing from the scene. + class RadiographyAlphaLayer : public RadiographyLayer + { + private: + std::unique_ptr alpha_; // Grayscale8 in the range [0, 255] 0 = transparent, 255 = opaque -> the foreground value will be displayed + float foreground_; // in the range [0.0, 65535.0] + + public: + RadiographyAlphaLayer(const RadiographyScene& scene) : + RadiographyLayer(scene), + foreground_(0) + { + } + + + void SetForegroundValue(float foreground) + { + foreground_ = foreground; + } + + float GetForegroundValue() const + { + return foreground_; + } + + void SetAlpha(Orthanc::ImageAccessor* image); + + virtual bool GetDefaultWindowing(float& center, + float& width) const + { + return false; + } + + + virtual void Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const; + + virtual bool GetRange(float& minValue, + float& maxValue) const; + + const Orthanc::ImageAccessor& GetAlpha() const + { + return *(alpha_.get()); + } + + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyDicomLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyDicomLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,264 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyDicomLayer.h" + +#include "RadiographyScene.h" +#include "../Deprecated/Toolbox/DicomFrameConverter.h" +#include "../Toolbox/ImageGeometry.h" + +#include +#include +#include +#include + +static OrthancPlugins::DicomTag ConvertTag(const Orthanc::DicomTag& tag) +{ + return OrthancPlugins::DicomTag(tag.GetGroup(), tag.GetElement()); +} + +namespace OrthancStone +{ + + void RadiographyDicomLayer::ApplyConverter() + { + if (source_.get() != NULL && + converter_.get() != NULL) + { + converted_.reset(converter_->ConvertFrame(*source_)); + } + } + + + RadiographyDicomLayer::RadiographyDicomLayer(const RadiographyScene& scene) : + RadiographyLayer(scene) + { + + } + + void RadiographyDicomLayer::SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset) + { + converter_.reset(new Deprecated::DicomFrameConverter); + converter_->ReadParameters(dataset); + ApplyConverter(); + + std::string tmp; + Vector pixelSpacing; + + if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PIXEL_SPACING)) && + LinearAlgebra::ParseVector(pixelSpacing, tmp) && + pixelSpacing.size() == 2) + { + SetPixelSpacing(pixelSpacing[0], pixelSpacing[1]); + } + + OrthancPlugins::DicomDatasetReader reader(dataset); + + unsigned int width, height; + if (!reader.GetUnsignedIntegerValue(width, ConvertTag(Orthanc::DICOM_TAG_COLUMNS)) || + !reader.GetUnsignedIntegerValue(height, ConvertTag(Orthanc::DICOM_TAG_ROWS))) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + SetSize(width, height); + } + + if (dataset.GetStringValue(tmp, ConvertTag(Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION))) + { + if (tmp == "MONOCHROME1") + { + SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode_Monochrome1); + } + else if (tmp == "MONOCHROME2") + { + SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode_Monochrome2); + } + } + } + + void RadiographyDicomLayer::SetSourceImage(Orthanc::ImageAccessor* image) // Takes ownership + { + std::unique_ptr raii(image); + + if (image == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + SetSize(image->GetWidth(), image->GetHeight()); + +#if __cplusplus < 201103L + source_.reset(raii.release()); +#else + source_ = std::move(raii); +#endif + + ApplyConverter(); + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyDicomLayer::SetSourceImage(Orthanc::ImageAccessor* image, double newPixelSpacingX, double newPixelSpacingY, bool emitLayerEditedEvent) // Takes ownership + { + std::unique_ptr raii(image); + + if (image == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + SetSize(image->GetWidth(), image->GetHeight(), false); + +#if __cplusplus < 201103L + source_.reset(raii.release()); +#else + source_ = std::move(raii); +#endif + + ApplyConverter(); + + SetPixelSpacing(newPixelSpacingX, newPixelSpacingY, false); + + if (emitLayerEditedEvent) + { + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + } + + + void RadiographyDicomLayer::SetDicomFrameConverter(Deprecated::DicomFrameConverter* converter) + { + converter_.reset(converter); + } + + void RadiographyDicomLayer::Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const + { + if (converted_.get() != NULL) + { + if (converted_->GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + unsigned int cropX, cropY, cropWidth, cropHeight; + GetCrop(cropX, cropY, cropWidth, cropHeight); + + AffineTransform2D t = AffineTransform2D::Combine( + viewTransform, GetTransform(), + AffineTransform2D::CreateOffset(cropX, cropY)); + + Orthanc::ImageAccessor cropped; + converted_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); + + unsigned int x1, y1, x2, y2; + if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, + t.GetHomogeneousMatrix(), + cropped.GetWidth(), + cropped.GetHeight(), + buffer.GetWidth(), + buffer.GetHeight())) + { + return; // layer is outside the buffer + } + + t.Apply(buffer, cropped, interpolation, false); + + if (applyWindowing) + { + // apply windowing but stay in the range [0.0, 65535.0] + float w0 = windowCenter - windowWidth / 2.0f; + float w1 = windowCenter + windowWidth / 2.0f; + + if (windowWidth >= 0.001f) // Avoid division by zero at (*) + { + float scaling = 1.0f / (w1 - w0) * 65535.0f; + for (unsigned int y = y1; y <= y2; y++) + { + float* p = reinterpret_cast(buffer.GetRow(y)) + x1; + + for (unsigned int x = x1; x <= x2; x++, p++) + { + if (*p >= w1) + { + *p = 65535.0; + } + else if (*p <= w0) + { + *p = 0; + } + else + { + // https://en.wikipedia.org/wiki/Linear_interpolation + *p = scaling * (*p - w0); // (*) + } + } + } + } + } + + } + } + + + bool RadiographyDicomLayer::GetDefaultWindowing(float& center, + float& width) const + { + if (converter_.get() != NULL && + converter_->HasDefaultWindow()) + { + center = static_cast(converter_->GetDefaultWindowCenter()); + width = static_cast(converter_->GetDefaultWindowWidth()); + return true; + } + else + { + return false; + } + } + + + bool RadiographyDicomLayer::GetRange(float& minValue, + float& maxValue) const + { + if (converted_.get() != NULL) + { + if (converted_->GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, *converted_); + return true; + } + else + { + return false; + } + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyDicomLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyDicomLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,105 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Deprecated/Toolbox/DicomFrameConverter.h" +#include "RadiographyLayer.h" + +#include + +namespace OrthancStone +{ + class RadiographyScene; + + class RadiographyDicomLayer : public RadiographyLayer + { + private: + std::unique_ptr source_; // Content of PixelData + std::unique_ptr converter_; + std::unique_ptr converted_; // Float32 + std::string instanceId_; + unsigned int frame_; + + void ApplyConverter(); + + public: + RadiographyDicomLayer(const RadiographyScene& scene); + + void SetInstance(const std::string& instanceId, unsigned int frame) + { + instanceId_ = instanceId; + frame_ = frame; + } + + std::string GetInstanceId() const + { + return instanceId_; + } + + unsigned int GetFrame() const + { + return frame_; + } + + virtual size_t GetApproximateMemoryUsage() const + { + size_t size = 0; + if (source_.get() != NULL) + { + size += source_->GetPitch() * source_->GetHeight(); + } + if (converted_.get() != NULL) + { + size += converted_->GetPitch() * converted_->GetHeight(); + } + + return size; + } + + + void SetDicomTags(const OrthancPlugins::FullOrthancDataset& dataset); + + void SetSourceImage(Orthanc::ImageAccessor* image); // Takes ownership + + void SetSourceImage(Orthanc::ImageAccessor* image, double newPixelSpacingX, double newPixelSpacingY, bool emitLayerEditedEvent = true); // Takes ownership + + const Orthanc::ImageAccessor* GetSourceImage() const {return source_.get();} // currently need this access to serialize scene in plain old data to send to a WASM worker + + const Deprecated::DicomFrameConverter& GetDicomFrameConverter() const {return *converter_;} // currently need this access to serialize scene in plain old data to send to a WASM worker + + // Takes ownership + void SetDicomFrameConverter(Deprecated::DicomFrameConverter* converter); + + virtual void Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const; + + virtual bool GetDefaultWindowing(float& center, + float& width) const; + + virtual bool GetRange(float& minValue, + float& maxValue) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,402 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayer.h" + +#include + + +namespace OrthancStone +{ + static double Square(double x) + { + return x * x; + } + + + RadiographyLayer::Geometry::Geometry() : + hasCrop_(false), + flipVertical_(false), + flipHorizontal_(false), + panX_(0), + panY_(0), + angle_(0), + resizeable_(false), + pixelSpacingX_(1), + pixelSpacingY_(1) + { + + } + + void RadiographyLayer::Geometry::GetCrop(unsigned int &x, unsigned int &y, unsigned int &width, unsigned int &height) const + { + if (!hasCrop_) + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); // you should probably use RadiographyLayer::GetCrop() or at least call HasCrop() before + + x = cropX_; + y = cropY_; + width = cropWidth_; + height = cropHeight_; + } + + void RadiographyLayer::UpdateTransform() + { + // important to update transform_ before getting the center to use the right scaling !!! + transform_ = AffineTransform2D::CreateScaling(geometry_.GetScalingX(), geometry_.GetScalingY()); + + double centerX, centerY; + GetCenter(centerX, centerY); + + transform_ = AffineTransform2D::Combine( + AffineTransform2D::CreateOffset(geometry_.GetPanX(), geometry_.GetPanY()), + AffineTransform2D::CreateRotation(geometry_.GetAngle(), centerX, centerY), + transform_); + + transformInverse_ = AffineTransform2D::Invert(transform_); + } + + + void RadiographyLayer::AddToExtent(Extent2D& extent, + double x, + double y) const + { + GetTransform().Apply(x, y); + extent.AddPoint(x, y); + } + + bool RadiographyLayer::Contains(double x, + double y) const + { + GetTransformInverse().Apply(x, y); + + unsigned int cropX, cropY, cropWidth, cropHeight; + GetCrop(cropX, cropY, cropWidth, cropHeight); + + return (x >= cropX && x <= cropX + cropWidth && + y >= cropY && y <= cropY + cropHeight); + } + + + void RadiographyLayer::DrawBorders(CairoContext& context, + double zoom) + { + if (GetControlPointCount() < 3 ) + return; + + cairo_t* cr = context.GetObject(); + cairo_set_line_width(cr, 2.0 / zoom); + + ControlPoint cp; + GetControlPoint(cp, 0); + cairo_move_to(cr, cp.x, cp.y); + + for (size_t i = 0; i < GetControlPointCount(); i++) + { + GetControlPoint(cp, i); + cairo_line_to(cr, cp.x, cp.y); + } + + cairo_close_path(cr); + cairo_stroke(cr); + } + + + RadiographyLayer::RadiographyLayer(const RadiographyScene& scene) : + index_(0), + hasSize_(false), + width_(0), + height_(0), + prefferedPhotometricDisplayMode_(RadiographyPhotometricDisplayMode_Default), + scene_(scene) + { + UpdateTransform(); + } + + void RadiographyLayer::ResetCrop() + { + geometry_.ResetCrop(); + UpdateTransform(); + } + + void RadiographyLayer::SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode) + { + prefferedPhotometricDisplayMode_ = prefferedPhotometricDisplayMode; + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyLayer::SetCrop(unsigned int x, + unsigned int y, + unsigned int width, + unsigned int height) + { + if (!hasSize_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + if (x + width > width_ || + y + height > height_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + geometry_.SetCrop(x, y, width, height); + UpdateTransform(); + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyLayer::SetGeometry(const Geometry& geometry) + { + geometry_ = geometry; + + if (hasSize_) + { + UpdateTransform(); + } + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + + void RadiographyLayer::GetCrop(unsigned int& x, + unsigned int& y, + unsigned int& width, + unsigned int& height) const + { + if (GetGeometry().HasCrop()) + { + GetGeometry().GetCrop(x, y, width, height); + } + else + { + x = 0; + y = 0; + width = width_; + height = height_; + } + } + + + void RadiographyLayer::SetAngle(double angle) + { + geometry_.SetAngle(angle); + UpdateTransform(); + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyLayer::SetFlipVertical(bool flip) + { + geometry_.SetFlipVertical(flip); + UpdateTransform(); + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyLayer::SetFlipHorizontal(bool flip) + { + geometry_.SetFlipHorizontal(flip); + UpdateTransform(); + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyLayer::SetSize(unsigned int width, + unsigned int height, + bool emitLayerEditedEvent) + { + hasSize_ = true; + width_ = width; + height_ = height; + + UpdateTransform(); + + if (emitLayerEditedEvent) + { + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + } + + Extent2D RadiographyLayer::GetSceneExtent(bool /*minimal*/) const + { + Extent2D extent; + + unsigned int x, y, width, height; + GetCrop(x, y, width, height); + + double dx = static_cast(x); + double dy = static_cast(y); + double dwidth = static_cast(width); + double dheight = static_cast(height); + + // AddToExtent transforms the coordinates from image to scene + AddToExtent(extent, dx, dy); + AddToExtent(extent, dx + dwidth, dy); + AddToExtent(extent, dx, dy + dheight); + AddToExtent(extent, dx + dwidth, dy + dheight); + + return extent; + } + + + bool RadiographyLayer::GetPixel(unsigned int& imageX, + unsigned int& imageY, + double sceneX, + double sceneY) const + { + if (width_ == 0 || + height_ == 0) + { + return false; + } + else + { + GetTransformInverse().Apply(sceneX, sceneY); + + int x = static_cast(std::floor(sceneX)); + int y = static_cast(std::floor(sceneY)); + + if (x < 0) + { + imageX = 0; + } + else if (x >= static_cast(width_)) + { + imageX = width_; + } + else + { + imageX = static_cast(x); + } + + if (y < 0) + { + imageY = 0; + } + else if (y >= static_cast(height_)) + { + imageY = height_; + } + else + { + imageY = static_cast(y); + } + + return true; + } + } + + + void RadiographyLayer::SetPan(double x, + double y) + { + geometry_.SetPan(x, y); + UpdateTransform(); + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + + void RadiographyLayer::SetPixelSpacing(double x, + double y, + bool emitLayerEditedEvent) + { + geometry_.SetPixelSpacing(x, y); + UpdateTransform(); + if (emitLayerEditedEvent) + { + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + } + + + void RadiographyLayer::GetCenter(double& centerX, + double& centerY) const + { + centerX = static_cast(width_) / 2.0; + centerY = static_cast(height_) / 2.0; + GetTransform().Apply(centerX, centerY); + } + + + + size_t RadiographyLayer::GetControlPointCount() const {return 4;} + + void RadiographyLayer::GetControlPoint(ControlPoint& cpScene /* out in scene coordinates */, + size_t index) const + { + unsigned int cropX, cropY, cropWidth, cropHeight; + GetCrop(cropX, cropY, cropWidth, cropHeight); + + ControlPoint cp; + switch (index) + { + case RadiographyControlPointType_TopLeftCorner: + cp = ControlPoint(cropX, cropY, RadiographyControlPointType_TopLeftCorner); + break; + + case RadiographyControlPointType_TopRightCorner: + cp = ControlPoint(cropX + cropWidth, cropY, RadiographyControlPointType_TopRightCorner); + break; + + case RadiographyControlPointType_BottomLeftCorner: + cp = ControlPoint(cropX, cropY + cropHeight, RadiographyControlPointType_BottomLeftCorner); + break; + + case RadiographyControlPointType_BottomRightCorner: + cp = ControlPoint(cropX + cropWidth, cropY + cropHeight, RadiographyControlPointType_BottomRightCorner); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // transforms image coordinates into scene coordinates + GetTransform().Apply(cp.x, cp.y); + cpScene = cp; + } + + bool RadiographyLayer::LookupControlPoint(ControlPoint& cpScene /* out */, + double x, + double y, + double zoom, + double viewportDistance) const + { + double threshold = Square(viewportDistance / zoom); + + for (size_t i = 0; i < GetControlPointCount(); i++) + { + ControlPoint cp; + GetControlPoint(cp, i); + + double d = Square(cp.x - x) + Square(cp.y - y); + + if (d <= threshold) + { + cpScene = cp; + return true; + } + } + + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,395 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include "../Toolbox/AffineTransform2D.h" +#include "../Toolbox/Extent2D.h" +#include "../Wrappers/CairoContext.h" +#include "../Messages/IMessage.h" +#include "../Messages/IObservable.h" + +namespace OrthancStone +{ + class RadiographyScene; + + enum RadiographyControlPointType + { + RadiographyControlPointType_TopLeftCorner = 0, + RadiographyControlPointType_TopRightCorner = 1, + RadiographyControlPointType_BottomRightCorner = 2, + RadiographyControlPointType_BottomLeftCorner = 3 + }; + + enum RadiographyPhotometricDisplayMode + { + RadiographyPhotometricDisplayMode_Default, + + RadiographyPhotometricDisplayMode_Monochrome1, + RadiographyPhotometricDisplayMode_Monochrome2 + }; + + + struct ControlPoint + { + double x; + double y; + size_t index; + + ControlPoint(double x, double y, size_t index) + : x(x), + y(y), + index(index) + {} + + ControlPoint() + : x(0), + y(0), + index(std::numeric_limits::max()) + {} + }; + + class RadiographyLayer : public IObservable + { + friend class RadiographyScene; + + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, LayerEditedMessage, RadiographyLayer); + + class Geometry + { + bool hasCrop_; + unsigned int cropX_; + unsigned int cropY_; + unsigned int cropWidth_; + unsigned int cropHeight_; + bool flipVertical_; + bool flipHorizontal_; + double panX_; + double panY_; + double angle_; + bool resizeable_; + double pixelSpacingX_; + double pixelSpacingY_; + + public: + Geometry(); + + void ResetCrop() + { + hasCrop_ = false; + } + + void SetCrop(unsigned int x, + unsigned int y, + unsigned int width, + unsigned int height) + { + hasCrop_ = true; + cropX_ = x; + cropY_ = y; + cropWidth_ = width; + cropHeight_ = height; + } + + bool HasCrop() const + { + return hasCrop_; + } + + void GetCrop(unsigned int& x, + unsigned int& y, + unsigned int& width, + unsigned int& height) const; + + void SetAngle(double angle) + { + angle_ = angle; + } + + double GetAngle() const + { + return angle_; + } + + void SetPan(double x, + double y) + { + panX_ = x; + panY_ = y; + } + + double GetPanX() const + { + return panX_; + } + + double GetPanY() const + { + return panY_; + } + + bool IsResizeable() const + { + return resizeable_; + } + + void SetResizeable(bool resizeable) + { + resizeable_ = resizeable; + } + + void SetPixelSpacing(double x, + double y) + { + pixelSpacingX_ = x; + pixelSpacingY_ = y; + } + + double GetPixelSpacingX() const + { + return pixelSpacingX_; + } + + double GetPixelSpacingY() const + { + return pixelSpacingY_; + } + + void SetFlipVertical(bool flip) // mirrors image around an horizontal axis (note: flip is applied before the rotation !) + { + flipVertical_ = flip; + } + + void SetFlipHorizontal(bool flip) // mirrors image around a vertical axis (note: flip is applied before the rotation !) + { + flipHorizontal_ = flip; + } + + bool GetFlipVertical() const + { + return flipVertical_; + } + + bool GetFlipHorizontal() const + { + return flipHorizontal_; + } + + double GetScalingX() const + { + return (flipHorizontal_ ? - pixelSpacingX_: pixelSpacingX_); + } + + double GetScalingY() const + { + return (flipVertical_ ? - pixelSpacingY_: pixelSpacingY_); + } + }; + + private: + size_t index_; + bool hasSize_; + unsigned int width_; + unsigned int height_; + AffineTransform2D transform_; + AffineTransform2D transformInverse_; + Geometry geometry_; + RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode_; + const RadiographyScene& scene_; + + protected: + void SetPreferredPhotomotricDisplayMode(RadiographyPhotometricDisplayMode prefferedPhotometricDisplayMode); + + private: + void UpdateTransform(); + + void AddToExtent(Extent2D& extent, + double x, + double y) const; + + void SetIndex(size_t index) + { + index_ = index; + } + + bool Contains(double x, + double y) const; + + void DrawBorders(CairoContext& context, + double zoom); + + public: + RadiographyLayer(const RadiographyScene& scene); + + virtual ~RadiographyLayer() + { + } + + virtual const AffineTransform2D& GetTransform() const + { + return transform_; + } + + virtual const AffineTransform2D& GetTransformInverse() const + { + return transformInverse_; + } + + size_t GetIndex() const + { + return index_; + } + + const RadiographyScene& GetScene() const + { + return scene_; + } + + const Geometry& GetGeometry() const + { + return geometry_; + } + + void SetGeometry(const Geometry& geometry); + + void ResetCrop(); + + void SetCrop(unsigned int x, // those are pixel coordinates/size + unsigned int y, + unsigned int width, + unsigned int height); + + void SetCrop(const Extent2D& sceneExtent) + { + Extent2D imageCrop; + + { + double x = sceneExtent.GetX1(); + double y = sceneExtent.GetY1(); + GetTransformInverse().Apply(x, y); + imageCrop.AddPoint(x, y); + } + + { + double x = sceneExtent.GetX2(); + double y = sceneExtent.GetY2(); + GetTransformInverse().Apply(x, y); + imageCrop.AddPoint(x, y); + } + + SetCrop(static_cast(std::max(0.0, std::floor(imageCrop.GetX1()))), + static_cast(std::max(0.0, std::floor(imageCrop.GetY1()))), + std::min(width_, static_cast(std::ceil(imageCrop.GetWidth()))), + std::min(height_, static_cast(std::ceil(imageCrop.GetHeight()))) + ); + } + + + void GetCrop(unsigned int& x, + unsigned int& y, + unsigned int& width, + unsigned int& height) const; + + void SetAngle(double angle); + + void SetPan(double x, + double y); + + void SetFlipVertical(bool flip); // mirrors image around an horizontal axis (note: flip is applied before the rotation !) + + void SetFlipHorizontal(bool flip); // mirrors image around a vertical axis (note: flip is applied before the rotation !) + + void SetResizeable(bool resizeable) + { + geometry_.SetResizeable(resizeable); + } + + void SetSize(unsigned int width, + unsigned int height, + bool emitLayerEditedEvent = true); + + bool HasSize() const + { + return hasSize_; + } + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + virtual Extent2D GetSceneExtent(bool minimal) const; + + virtual bool GetPixel(unsigned int& imageX, + unsigned int& imageY, + double sceneX, + double sceneY) const; + + void SetPixelSpacing(double x, + double y, + bool emitLayerEditedEvent = true); + + void GetCenter(double& centerX, + double& centerY) const; + + virtual void GetControlPoint(ControlPoint& cpScene /* out in scene coordinates */, + size_t index) const; + + virtual size_t GetControlPointCount() const; + + bool LookupControlPoint(ControlPoint& cpScene /* out */, + double x, + double y, + double zoom, + double viewportDistance) const; + + virtual bool GetDefaultWindowing(float& center, + float& width) const = 0; + + RadiographyPhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const + { + return prefferedPhotometricDisplayMode_; + } + + virtual void Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const = 0; + + virtual bool GetRange(float& minValue, + float& maxValue) const = 0; + + virtual size_t GetApproximateMemoryUsage() const // this is used to limit the number of scenes loaded in RAM when resources are limited (we actually only count the size used by the images, not the C structs) + { + return 0; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerCropTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerCropTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,145 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayerCropTracker.h" + +#include "RadiographySceneCommand.h" + +#include + +namespace OrthancStone +{ + class RadiographyLayerCropTracker::UndoRedoCommand : public RadiographySceneCommand + { + private: + unsigned int sourceCropX_; + unsigned int sourceCropY_; + unsigned int sourceCropWidth_; + unsigned int sourceCropHeight_; + unsigned int targetCropX_; + unsigned int targetCropY_; + unsigned int targetCropWidth_; + unsigned int targetCropHeight_; + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const + { + layer.SetCrop(sourceCropX_, sourceCropY_, sourceCropWidth_, sourceCropHeight_); + } + + virtual void RedoInternal(RadiographyLayer& layer) const + { + layer.SetCrop(targetCropX_, targetCropY_, targetCropWidth_, targetCropHeight_); + } + + public: + UndoRedoCommand(const RadiographyLayerCropTracker& tracker) : + RadiographySceneCommand(tracker.accessor_), + sourceCropX_(tracker.cropX_), + sourceCropY_(tracker.cropY_), + sourceCropWidth_(tracker.cropWidth_), + sourceCropHeight_(tracker.cropHeight_) + { + tracker.accessor_.GetLayer().GetCrop(targetCropX_, targetCropY_, + targetCropWidth_, targetCropHeight_); + } + }; + + + RadiographyLayerCropTracker::RadiographyLayerCropTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + const ControlPoint& startControlPoint) : + undoRedoStack_(undoRedoStack), + accessor_(scene, layer), + startControlPoint_(startControlPoint) + { + if (accessor_.IsValid()) + { + accessor_.GetLayer().GetCrop(cropX_, cropY_, cropWidth_, cropHeight_); + } + } + + + void RadiographyLayerCropTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyLayerCropTracker::MouseUp() + { + if (accessor_.IsValid()) + { + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + } + + + void RadiographyLayerCropTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + if (accessor_.IsValid()) + { + unsigned int x, y; + + RadiographyLayer& layer = accessor_.GetLayer(); + if (layer.GetPixel(x, y, sceneX, sceneY)) + { + unsigned int targetX, targetWidth; + + if (startControlPoint_.index == RadiographyControlPointType_TopLeftCorner || + startControlPoint_.index == RadiographyControlPointType_BottomLeftCorner) + { + targetX = std::min(x, cropX_ + cropWidth_); + targetWidth = cropX_ + cropWidth_ - targetX; + } + else + { + targetX = cropX_; + targetWidth = std::max(x, cropX_) - cropX_; + } + + unsigned int targetY, targetHeight; + + if (startControlPoint_.index == RadiographyControlPointType_TopLeftCorner || + startControlPoint_.index == RadiographyControlPointType_TopRightCorner) + { + targetY = std::min(y, cropY_ + cropHeight_); + targetHeight = cropY_ + cropHeight_ - targetY; + } + else + { + targetY = cropY_; + targetHeight = std::max(y, cropY_) - cropY_; + } + + layer.SetCrop(targetX, targetY, targetWidth, targetHeight); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerCropTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerCropTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Toolbox/ViewportGeometry.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + class RadiographyLayerCropTracker : public Deprecated::IWorldSceneMouseTracker + { + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene::LayerAccessor accessor_; + ControlPoint startControlPoint_; + unsigned int cropX_; + unsigned int cropY_; + unsigned int cropWidth_; + unsigned int cropHeight_; + + public: + RadiographyLayerCropTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + const ControlPoint& startControlPoint); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMaskTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMaskTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,140 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayerMaskTracker.h" +#include "RadiographyMaskLayer.h" + +#include "RadiographySceneCommand.h" + +#include + +namespace OrthancStone +{ + class RadiographyLayerMaskTracker::UndoRedoCommand : public RadiographySceneCommand + { + private: + ControlPoint sourceSceneCp_; + ControlPoint targetSceneCp_; + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const + { + RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); + if (maskLayer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + unsigned int ix, iy; // image coordinates + if (maskLayer->GetPixel(ix, iy, sourceSceneCp_.x, sourceSceneCp_.y)) + { + maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), sourceSceneCp_.index); + } + } + + virtual void RedoInternal(RadiographyLayer& layer) const + { + RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); + if (maskLayer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + unsigned int ix, iy; // image coordinates + if (maskLayer->GetPixel(ix, iy, targetSceneCp_.x, targetSceneCp_.y)) + { + maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), targetSceneCp_.index); + } + } + + public: + UndoRedoCommand(const RadiographyLayerMaskTracker& tracker) : + RadiographySceneCommand(tracker.accessor_), + sourceSceneCp_(tracker.startSceneCp_), + targetSceneCp_(tracker.endSceneCp_) + { + RadiographyMaskLayer* maskLayer = dynamic_cast(&(tracker.accessor_.GetLayer())); + if (maskLayer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + unsigned int ix, iy; // image coordinates + if (maskLayer->GetPixel(ix, iy, targetSceneCp_.x, targetSceneCp_.y)) + { + maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), targetSceneCp_.index); + } + } + }; + + + RadiographyLayerMaskTracker::RadiographyLayerMaskTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + const ControlPoint& startSceneControlPoint) : + undoRedoStack_(undoRedoStack), + accessor_(scene, layer), + startSceneCp_(startSceneControlPoint), + endSceneCp_(startSceneControlPoint) + { + } + + + void RadiographyLayerMaskTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyLayerMaskTracker::MouseUp() + { + if (accessor_.IsValid() && startSceneCp_.x != endSceneCp_.x && startSceneCp_.y != endSceneCp_.y) + { + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + } + + + void RadiographyLayerMaskTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + if (accessor_.IsValid()) + { + unsigned int ix, iy; // image coordinates + + RadiographyLayer& layer = accessor_.GetLayer(); + if (layer.GetPixel(ix, iy, sceneX, sceneY)) + { + endSceneCp_ = ControlPoint(sceneX, sceneY, startSceneCp_.index); + + RadiographyMaskLayer* maskLayer = dynamic_cast(&layer); + if (maskLayer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + maskLayer->SetCorner(Orthanc::ImageProcessing::ImagePoint((int32_t)ix, (int32_t)iy), startSceneCp_.index); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMaskTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMaskTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,65 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Toolbox/ViewportGeometry.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + class RadiographyLayerMaskTracker : public Deprecated::IWorldSceneMouseTracker + { + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene::LayerAccessor accessor_; + ControlPoint startSceneCp_; + ControlPoint endSceneCp_; + + public: + RadiographyLayerMaskTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + const ControlPoint& startSceneControlPoint); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMoveTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMoveTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,126 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayerMoveTracker.h" + +#include "RadiographySceneCommand.h" + +#include + +namespace OrthancStone +{ + class RadiographyLayerMoveTracker::UndoRedoCommand : public RadiographySceneCommand + { + private: + double sourceX_; + double sourceY_; + double targetX_; + double targetY_; + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const + { + layer.SetPan(sourceX_, sourceY_); + } + + virtual void RedoInternal(RadiographyLayer& layer) const + { + layer.SetPan(targetX_, targetY_); + } + + public: + UndoRedoCommand(const RadiographyLayerMoveTracker& tracker) : + RadiographySceneCommand(tracker.accessor_), + sourceX_(tracker.panX_), + sourceY_(tracker.panY_), + targetX_(tracker.accessor_.GetLayer().GetGeometry().GetPanX()), + targetY_(tracker.accessor_.GetLayer().GetGeometry().GetPanY()) + { + } + }; + + + RadiographyLayerMoveTracker::RadiographyLayerMoveTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + size_t layer, + double x, + double y, + bool oneAxis) : + undoRedoStack_(undoRedoStack), + accessor_(scene, layer), + clickX_(x), + clickY_(y), + oneAxis_(oneAxis) + { + if (accessor_.IsValid()) + { + panX_ = accessor_.GetLayer().GetGeometry().GetPanX(); + panY_ = accessor_.GetLayer().GetGeometry().GetPanY(); + } + } + + + void RadiographyLayerMoveTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyLayerMoveTracker::MouseUp() + { + if (accessor_.IsValid()) + { + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + } + + + void RadiographyLayerMoveTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + if (accessor_.IsValid()) + { + double dx = sceneX - clickX_; + double dy = sceneY - clickY_; + + if (oneAxis_) + { + if (fabs(dx) > fabs(dy)) + { + accessor_.GetLayer().SetPan(dx + panX_, panY_); + } + else + { + accessor_.GetLayer().SetPan(panX_, dy + panY_); + } + } + else + { + accessor_.GetLayer().SetPan(dx + panX_, dy + panY_); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMoveTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerMoveTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + class RadiographyLayerMoveTracker : public Deprecated::IWorldSceneMouseTracker + { + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene::LayerAccessor accessor_; + double clickX_; + double clickY_; + double panX_; + double panY_; + bool oneAxis_; + + public: + RadiographyLayerMoveTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + size_t layer, + double x, + double y, + bool oneAxis); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerResizeTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerResizeTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,188 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayerResizeTracker.h" + +#include "RadiographySceneCommand.h" + +#include + +#include + + +namespace OrthancStone +{ + static double ComputeDistance(double x1, + double y1, + double x2, + double y2) + { + double dx = x1 - x2; + double dy = y1 - y2; + return sqrt(dx * dx + dy * dy); + } + + + class RadiographyLayerResizeTracker::UndoRedoCommand : public RadiographySceneCommand + { + private: + double sourceSpacingX_; + double sourceSpacingY_; + double sourcePanX_; + double sourcePanY_; + double targetSpacingX_; + double targetSpacingY_; + double targetPanX_; + double targetPanY_; + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const + { + layer.SetPixelSpacing(sourceSpacingX_, sourceSpacingY_); + layer.SetPan(sourcePanX_, sourcePanY_); + } + + virtual void RedoInternal(RadiographyLayer& layer) const + { + layer.SetPixelSpacing(targetSpacingX_, targetSpacingY_); + layer.SetPan(targetPanX_, targetPanY_); + } + + public: + UndoRedoCommand(const RadiographyLayerResizeTracker& tracker) : + RadiographySceneCommand(tracker.accessor_), + sourceSpacingX_(tracker.originalSpacingX_), + sourceSpacingY_(tracker.originalSpacingY_), + sourcePanX_(tracker.originalPanX_), + sourcePanY_(tracker.originalPanY_), + targetSpacingX_(tracker.accessor_.GetLayer().GetGeometry().GetPixelSpacingX()), + targetSpacingY_(tracker.accessor_.GetLayer().GetGeometry().GetPixelSpacingY()), + targetPanX_(tracker.accessor_.GetLayer().GetGeometry().GetPanX()), + targetPanY_(tracker.accessor_.GetLayer().GetGeometry().GetPanY()) + { + } + }; + + + RadiographyLayerResizeTracker::RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + size_t layer, + const ControlPoint& startControlPoint, + bool roundScaling) : + undoRedoStack_(undoRedoStack), + accessor_(scene, layer), + roundScaling_(roundScaling) + { + if (accessor_.IsValid() && + accessor_.GetLayer().GetGeometry().IsResizeable()) + { + originalSpacingX_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingX(); + originalSpacingY_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingY(); + originalPanX_ = accessor_.GetLayer().GetGeometry().GetPanX(); + originalPanY_ = accessor_.GetLayer().GetGeometry().GetPanY(); + + size_t oppositeControlPointType; + switch (startControlPoint.index) + { + case RadiographyControlPointType_TopLeftCorner: + oppositeControlPointType = RadiographyControlPointType_BottomRightCorner; + break; + + case RadiographyControlPointType_TopRightCorner: + oppositeControlPointType = RadiographyControlPointType_BottomLeftCorner; + break; + + case RadiographyControlPointType_BottomLeftCorner: + oppositeControlPointType = RadiographyControlPointType_TopRightCorner; + break; + + case RadiographyControlPointType_BottomRightCorner: + oppositeControlPointType = RadiographyControlPointType_TopLeftCorner; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + accessor_.GetLayer().GetControlPoint(startOppositeControlPoint_, oppositeControlPointType); + + double d = ComputeDistance(startControlPoint.x, startControlPoint.y, startOppositeControlPoint_.x, startOppositeControlPoint_.y); + if (d >= std::numeric_limits::epsilon()) + { + baseScaling_ = 1.0 / d; + } + else + { + // Avoid division by zero in extreme cases + accessor_.Invalidate(); + } + } + } + + + void RadiographyLayerResizeTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyLayerResizeTracker::MouseUp() + { + if (accessor_.IsValid() && + accessor_.GetLayer().GetGeometry().IsResizeable()) + { + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + } + + + void RadiographyLayerResizeTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + static const double ROUND_SCALING = 0.1; + + if (accessor_.IsValid() && + accessor_.GetLayer().GetGeometry().IsResizeable()) + { + double scaling = ComputeDistance(startOppositeControlPoint_.x, startOppositeControlPoint_.y, sceneX, sceneY) * baseScaling_; + + if (roundScaling_) + { + scaling = boost::math::round((scaling / ROUND_SCALING) * ROUND_SCALING); + } + + RadiographyLayer& layer = accessor_.GetLayer(); + layer.SetPixelSpacing(scaling * originalSpacingX_, + scaling * originalSpacingY_); + + // Keep the opposite corner at a fixed location + ControlPoint currentOppositeCorner; + layer.GetControlPoint(currentOppositeCorner, startOppositeControlPoint_.index); + layer.SetPan(layer.GetGeometry().GetPanX() + startOppositeControlPoint_.x - currentOppositeCorner.x, + layer.GetGeometry().GetPanY() + startOppositeControlPoint_.y - currentOppositeCorner.y); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerResizeTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerResizeTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + class RadiographyLayerResizeTracker : public Deprecated::IWorldSceneMouseTracker + { + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene::LayerAccessor accessor_; + bool roundScaling_; + double originalSpacingX_; + double originalSpacingY_; + double originalPanX_; + double originalPanY_; + ControlPoint startOppositeControlPoint_; + double baseScaling_; + + public: + RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + size_t layer, + const ControlPoint& startControlPoint, + bool roundScaling); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerRotateTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerRotateTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,156 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyLayerRotateTracker.h" + +#include "RadiographySceneCommand.h" + +#include + +#include +#include + +namespace OrthancStone +{ + class RadiographyLayerRotateTracker::UndoRedoCommand : public RadiographySceneCommand + { + private: + double sourceAngle_; + double targetAngle_; + + static int ToDegrees(double angle) + { + return boost::math::iround(angle * 180.0 / boost::math::constants::pi()); + } + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const + { + LOG(INFO) << "Undo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; + layer.SetAngle(sourceAngle_); + } + + virtual void RedoInternal(RadiographyLayer& layer) const + { + LOG(INFO) << "Redo - Set angle to " << ToDegrees(sourceAngle_) << " degrees"; + layer.SetAngle(targetAngle_); + } + + public: + UndoRedoCommand(const RadiographyLayerRotateTracker& tracker) : + RadiographySceneCommand(tracker.accessor_), + sourceAngle_(tracker.originalAngle_), + targetAngle_(tracker.accessor_.GetLayer().GetGeometry().GetAngle()) + { + } + }; + + + bool RadiographyLayerRotateTracker::ComputeAngle(double& angle /* out */, + double sceneX, + double sceneY) const + { + Vector u; + LinearAlgebra::AssignVector(u, sceneX - centerX_, sceneY - centerY_); + + double nu = boost::numeric::ublas::norm_2(u); + + if (!LinearAlgebra::IsCloseToZero(nu)) + { + u /= nu; + angle = atan2(u[1], u[0]); + return true; + } + else + { + return false; + } + } + + + RadiographyLayerRotateTracker::RadiographyLayerRotateTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + double x, + double y, + bool roundAngles) : + undoRedoStack_(undoRedoStack), + accessor_(scene, layer), + roundAngles_(roundAngles) + { + if (accessor_.IsValid()) + { + accessor_.GetLayer().GetCenter(centerX_, centerY_); + originalAngle_ = accessor_.GetLayer().GetGeometry().GetAngle(); + + double sceneX, sceneY; + view.MapDisplayToScene(sceneX, sceneY, x, y); + + if (!ComputeAngle(clickAngle_, x, y)) + { + accessor_.Invalidate(); + } + } + } + + + void RadiographyLayerRotateTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyLayerRotateTracker::MouseUp() + { + if (accessor_.IsValid()) + { + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + } + + + void RadiographyLayerRotateTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + static const double ROUND_ANGLE = 15.0 / 180.0 * boost::math::constants::pi(); + + double angle; + + if (accessor_.IsValid() && + ComputeAngle(angle, sceneX, sceneY)) + { + angle = angle - clickAngle_ + originalAngle_; + + if (roundAngles_) + { + angle = boost::math::round((angle / ROUND_ANGLE) * ROUND_ANGLE); + } + + accessor_.GetLayer().SetAngle(angle); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerRotateTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyLayerRotateTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,75 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Toolbox/ViewportGeometry.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + + +namespace OrthancStone +{ + class RadiographyLayerRotateTracker : public Deprecated::IWorldSceneMouseTracker + { + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene::LayerAccessor accessor_; + double centerX_; + double centerY_; + double originalAngle_; + double clickAngle_; + bool roundAngles_; + + bool ComputeAngle(double& angle /* out */, + double sceneX, + double sceneY) const; + + public: + RadiographyLayerRotateTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + const Deprecated::ViewportGeometry& view, + size_t layer, + double x, + double y, + bool roundAngles); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyMaskLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyMaskLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,200 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyMaskLayer.h" +#include "RadiographyDicomLayer.h" + +#include "RadiographyScene.h" +#include "../Toolbox/ImageGeometry.h" + +#include +#include +#include + +namespace OrthancStone +{ + const unsigned char IN_MASK_VALUE = 0x77; + const unsigned char OUT_MASK_VALUE = 0xFF; + + const AffineTransform2D& RadiographyMaskLayer::GetTransform() const + { + return dicomLayer_.GetTransform(); + } + + const AffineTransform2D& RadiographyMaskLayer::GetTransformInverse() const + { + return dicomLayer_.GetTransformInverse(); + } + + bool RadiographyMaskLayer::GetPixel(unsigned int& imageX, + unsigned int& imageY, + double sceneX, + double sceneY) const + { + return dicomLayer_.GetPixel(imageX, imageY, sceneX, sceneY); + } + + std::string RadiographyMaskLayer::GetInstanceId() const + { + return dicomLayer_.GetInstanceId(); + } + + void RadiographyMaskLayer::SetCorner(const Orthanc::ImageProcessing::ImagePoint& corner, size_t index) + { + if (index < corners_.size()) + corners_[index] = corner; + else + corners_.push_back(corner); + invalidated_ = true; + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + void RadiographyMaskLayer::SetCorners(const std::vector& corners) + { + corners_ = corners; + invalidated_ = true; + + BroadcastMessage(RadiographyLayer::LayerEditedMessage(*this)); + } + + Extent2D RadiographyMaskLayer::GetSceneExtent(bool minimal) const + { + if (!minimal) + { + return RadiographyLayer::GetSceneExtent(minimal); + } + else + { // get the extent of the in-mask area + Extent2D sceneExtent; + + for (std::vector::const_iterator corner = corners_.begin(); corner != corners_.end(); ++corner) + { + double x = static_cast(corner->GetX()); + double y = static_cast(corner->GetY()); + + dicomLayer_.GetTransform().Apply(x, y); + sceneExtent.AddPoint(x, y); + } + return sceneExtent; + } + } + + + + void RadiographyMaskLayer::Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const + { + if (dicomLayer_.GetWidth() == 0 || dicomLayer_.GetSourceImage() == NULL) // nothing to do if the DICOM layer is not displayed (or not loaded) + return; + + if (invalidated_) + { + mask_.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, dicomLayer_.GetWidth(), dicomLayer_.GetHeight(), false)); + + DrawMask(); + + invalidated_ = false; + } + + {// rendering + if (buffer.GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + unsigned int cropX, cropY, cropWidth, cropHeight; + dicomLayer_.GetCrop(cropX, cropY, cropWidth, cropHeight); + + const AffineTransform2D t = AffineTransform2D::Combine( + viewTransform, dicomLayer_.GetTransform(), + AffineTransform2D::CreateOffset(cropX, cropY)); + + Orthanc::ImageAccessor cropped; + mask_->GetRegion(cropped, cropX, cropY, cropWidth, cropHeight); + + Orthanc::Image tmp(Orthanc::PixelFormat_Grayscale8, buffer.GetWidth(), buffer.GetHeight(), false); + + + unsigned int x1, y1, x2, y2; + if (!OrthancStone::GetProjectiveTransformExtent(x1, y1, x2, y2, + t.GetHomogeneousMatrix(), + cropped.GetWidth(), + cropped.GetHeight(), + buffer.GetWidth(), + buffer.GetHeight())) + { + return; // layer is outside the buffer + } + + t.Apply(tmp, cropped, ImageInterpolation_Nearest, true /* clear */); + + // we have observed vertical lines at the image border (probably due to bilinear filtering of the DICOM image when it is not aligned with the buffer pixels) + // -> draw the mask one line further on each side + if (x1 >= 1) + { + x1 = x1 - 1; + } + if (x2 < buffer.GetWidth() - 2) + { + x2 = x2 + 1; + } + + // Blit + for (unsigned int y = y1; y <= y2; y++) + { + float *q = reinterpret_cast(buffer.GetRow(y)) + x1; + const uint8_t *p = reinterpret_cast(tmp.GetRow(y)) + x1; + + for (unsigned int x = x1; x <= x2; x++, p++, q++) + { + if (*p != IN_MASK_VALUE) + *q = foreground_; + // else keep the underlying pixel value + } + } + + } + } + + void RadiographyMaskLayer::DrawMask() const + { + // first fill the complete image + Orthanc::ImageProcessing::Set(*mask_, OUT_MASK_VALUE); + + // clip corners + std::vector clippedCorners; + for (size_t i = 0; i < corners_.size(); i++) + { + clippedCorners.push_back(corners_[i]); + clippedCorners[i].ClipTo(0, mask_->GetWidth() - 1, 0, mask_->GetHeight() - 1); + } + + // fill mask + Orthanc::ImageProcessing::FillPolygon(*mask_, clippedCorners, IN_MASK_VALUE); + + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyMaskLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyMaskLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,146 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyLayer.h" + +#include +#include +#include + +namespace OrthancStone +{ + class RadiographyScene; + class RadiographyDicomLayer; + + class RadiographyMaskLayer : public RadiographyLayer + { + private: + std::vector corners_; + const RadiographyDicomLayer& dicomLayer_; + mutable bool invalidated_; + float foreground_; + + mutable std::unique_ptr mask_; + public: + RadiographyMaskLayer(const RadiographyScene& scene, const RadiographyDicomLayer& dicomLayer, + float foreground) : + RadiographyLayer(scene), + dicomLayer_(dicomLayer), + invalidated_(true), + foreground_(foreground) + { + } + + virtual size_t GetApproximateMemoryUsage() const + { + size_t size = 0; + if (mask_.get() != NULL) + { + size += mask_->GetPitch() * mask_->GetHeight(); + } + + return size; + } + + + void SetCorners(const std::vector& corners); + void SetCorner(const Orthanc::ImageProcessing::ImagePoint& corner, size_t index); + + const std::vector& GetCorners() const + { + return corners_; + } + + float GetForeground() const + { + return foreground_; + } + + virtual void Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + float windowCenter, + float windowWidth, + bool applyWindowing) const; + + std::string GetInstanceId() const; + + virtual size_t GetControlPointCount() const + { + return corners_.size(); + } + + virtual void GetControlPoint(ControlPoint& cpScene, + size_t index) const + { + ControlPoint cp(corners_[index].GetX(), corners_[index].GetY(), index); + + // transforms image coordinates into scene coordinates + GetTransform().Apply(cp.x, cp.y); + cpScene = cp; + } + + virtual Extent2D GetSceneExtent(bool minimal) const; + + virtual bool GetDefaultWindowing(float& center, + float& width) const + { + return false; + } + + virtual bool GetRange(float& minValue, + float& maxValue) const + { + minValue = 0; + maxValue = 0; + + if (foreground_ < 0) + { + minValue = foreground_; + } + + if (foreground_ > 0) + { + maxValue = foreground_; + } + + return true; + + } + + virtual bool GetPixel(unsigned int& imageX, + unsigned int& imageY, + double sceneX, + double sceneY) const; + + protected: + virtual const AffineTransform2D& GetTransform() const; + + virtual const AffineTransform2D& GetTransformInverse() const; + + + private: + void DrawMask() const; + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyScene.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyScene.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,968 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyScene.h" + +#include "RadiographyAlphaLayer.h" +#include "RadiographyDicomLayer.h" +#include "RadiographyTextLayer.h" +#include "RadiographyMaskLayer.h" +#include "../Deprecated/Toolbox/DicomFrameConverter.h" +#include "../Scene2D/CairoCompositor.h" +#include "../Scene2D/FloatTextureSceneLayer.h" +#include "../Scene2D/TextSceneLayer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +namespace OrthancStone +{ + RadiographyScene::LayerAccessor::LayerAccessor(RadiographyScene& scene, + size_t index) : + scene_(scene), + index_(index) + { + Layers::iterator layer = scene.layers_.find(index); + if (layer == scene.layers_.end()) + { + layer_ = NULL; + } + else + { + assert(layer->second != NULL); + layer_ = layer->second; + } + } + + + RadiographyScene::LayerAccessor::LayerAccessor(RadiographyScene& scene, + double x, + double y) : + scene_(scene), + index_(0) // Dummy initialization + { + if (scene.LookupLayer(index_, x, y)) + { + Layers::iterator layer = scene.layers_.find(index_); + + if (layer == scene.layers_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + assert(layer->second != NULL); + layer_ = layer->second; + } + } + else + { + layer_ = NULL; + } + } + + + RadiographyScene& RadiographyScene::LayerAccessor::GetScene() const + { + if (IsValid()) + { + return scene_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + size_t RadiographyScene::LayerAccessor::GetIndex() const + { + if (IsValid()) + { + return index_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + RadiographyLayer& RadiographyScene::LayerAccessor::GetLayer() const + { + if (IsValid()) + { + return *layer_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + void RadiographyScene::_RegisterLayer(RadiographyLayer* layer) + { + std::unique_ptr raii(layer); + + // LOG(INFO) << "Registering layer: " << countLayers_; + + size_t index = nextLayerIndex_++; + raii->SetIndex(index); + layers_[index] = raii.release(); + } + + RadiographyLayer& RadiographyScene::RegisterLayer(RadiographyLayer* layer) + { + if (layer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + _RegisterLayer(layer); + + BroadcastMessage(GeometryChangedMessage(*this, *layer)); + BroadcastMessage(ContentChangedMessage(*this, *layer)); + Register(*layer, &RadiographyScene::OnLayerEdited); + + return *layer; + } + + size_t RadiographyScene::GetApproximateMemoryUsage() const + { + size_t size = 0; + for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) + { + size += it->second->GetApproximateMemoryUsage(); + } + return size; + } + + void RadiographyScene::OnLayerEdited(const RadiographyLayer::LayerEditedMessage& message) + { + BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, message.GetOrigin())); + } + + + RadiographyScene::RadiographyScene() : + nextLayerIndex_(0), + hasWindowing_(false), + windowingCenter_(0), // Dummy initialization + windowingWidth_(0) // Dummy initialization + { + } + + + RadiographyScene::~RadiographyScene() + { + for (Layers::iterator it = layers_.begin(); it != layers_.end(); it++) + { + assert(it->second != NULL); + delete it->second; + } + } + + RadiographyPhotometricDisplayMode RadiographyScene::GetPreferredPhotomotricDisplayMode() const + { + // return the mode of the first layer who "cares" about its display mode (normaly, the one and only layer that is a DicomLayer) + for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) + { + if (it->second->GetPreferredPhotomotricDisplayMode() != RadiographyPhotometricDisplayMode_Default) + { + return it->second->GetPreferredPhotomotricDisplayMode(); + } + } + + return RadiographyPhotometricDisplayMode_Default; + } + + + void RadiographyScene::GetLayersIndexes(std::vector& output) const + { + for (Layers::const_iterator it = layers_.begin(); it != layers_.end(); it++) + { + output.push_back(it->first); + } + } + + void RadiographyScene::RemoveLayer(size_t layerIndex) + { + LOG(INFO) << "Removing layer: " << layerIndex; + + Layers::iterator found = layers_.find(layerIndex); + + if (found == layers_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(found->second != NULL); + delete found->second; + + layers_.erase(found); + + LOG(INFO) << "Removing layer, there are now : " << layers_.size() << " layers"; + + _OnLayerRemoved(); + + BroadcastMessage(RadiographyScene::LayerRemovedMessage(*this, layerIndex)); + } + } + + const RadiographyLayer& RadiographyScene::GetLayer(size_t layerIndex) const + { + Layers::const_iterator found = layers_.find(layerIndex); + + if (found == layers_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(found->second != NULL); + return *found->second; + } + } + + RadiographyLayer& RadiographyScene::GetLayer(size_t layerIndex) + { + Layers::const_iterator found = layers_.find(layerIndex); + + if (found == layers_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(found->second != NULL); + return *found->second; + } + } + + bool RadiographyScene::GetWindowing(float& center, + float& width) const + { + if (hasWindowing_) + { + center = windowingCenter_; + width = windowingWidth_; + return true; + } + else + { + return false; + } + } + + + void RadiographyScene::GetWindowingWithDefault(float& center, + float& width) const + { + if (!GetWindowing(center, width)) + { + center = 128; + width = 256; + } + } + + + void RadiographyScene::SetWindowing(float center, + float width) + { + hasWindowing_ = true; + windowingCenter_ = center; + windowingWidth_ = width; + + BroadcastMessage(RadiographyScene::WindowingChangedMessage(*this)); + } + + + RadiographyLayer& RadiographyScene::UpdateText(size_t layerIndex, + const std::string& utf8, + const std::string& font, + unsigned int fontSize, + uint8_t foreground) + { + RadiographyTextLayer& textLayer = dynamic_cast(GetLayer(layerIndex)); + textLayer.SetText(utf8, font, fontSize, foreground); + + BroadcastMessage(RadiographyScene::ContentChangedMessage(*this, textLayer)); + BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, textLayer)); + return textLayer; + } + + + RadiographyLayer& RadiographyScene::LoadText(const std::string& utf8, + const std::string& font, + unsigned int fontSize, + uint8_t foreground, + RadiographyLayer::Geometry* centerGeometry, + bool isCenterGeometry) + { + std::unique_ptr alpha(new RadiographyTextLayer(*this)); + alpha->SetText(utf8, font, fontSize, foreground); + if (centerGeometry != NULL) + { + if (isCenterGeometry) + { + // modify geometry to reference the top left corner + double tlx = centerGeometry->GetPanX(); + double tly = centerGeometry->GetPanY(); + Extent2D textExtent = alpha->GetSceneExtent(false); + tlx = tlx - (textExtent.GetWidth() / 2) * centerGeometry->GetPixelSpacingX(); + tly = tly - (textExtent.GetHeight() / 2) * centerGeometry->GetPixelSpacingY(); + centerGeometry->SetPan(tlx, tly); + } + alpha->SetGeometry(*centerGeometry); + } + + RadiographyLayer& registeredLayer = RegisterLayer(alpha.release()); + + BroadcastMessage(RadiographyScene::LayerEditedMessage(*this, registeredLayer)); + return registeredLayer; + } + + + RadiographyLayer& RadiographyScene::LoadTestBlock(unsigned int width, + unsigned int height, + RadiographyLayer::Geometry* geometry) + { + std::unique_ptr block(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, width, height, false)); + + for (unsigned int padding = 0; + (width > 2 * padding) && (height > 2 * padding); + padding++) + { + uint8_t color; + if (255 > 10 * padding) + { + color = 255 - 10 * padding; + } + else + { + color = 0; + } + + Orthanc::ImageAccessor region; + block->GetRegion(region, padding, padding, width - 2 * padding, height - 2 * padding); + Orthanc::ImageProcessing::Set(region, color); + } + + return LoadAlphaBitmap(block.release(), geometry); + } + + RadiographyLayer& RadiographyScene::LoadMask(const std::vector& corners, + const RadiographyDicomLayer& dicomLayer, + float foreground, + RadiographyLayer::Geometry* geometry) + { + std::unique_ptr mask(new RadiographyMaskLayer(*this, dicomLayer, foreground)); + mask->SetCorners(corners); + if (geometry != NULL) + { + mask->SetGeometry(*geometry); + } + + return RegisterLayer(mask.release()); + } + + + RadiographyLayer& RadiographyScene::LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, RadiographyLayer::Geometry *geometry) + { + std::unique_ptr alpha(new RadiographyAlphaLayer(*this)); + alpha->SetAlpha(bitmap); + if (geometry != NULL) + { + alpha->SetGeometry(*geometry); + } + + return RegisterLayer(alpha.release()); + } + + RadiographyLayer& RadiographyScene::LoadDicomImage(Orthanc::ImageAccessor* dicomImage, // takes ownership + const std::string& instance, + unsigned int frame, + Deprecated::DicomFrameConverter* converter, // takes ownership + RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode, + RadiographyLayer::Geometry* geometry) + { + RadiographyDicomLayer& layer = dynamic_cast(RegisterLayer(new RadiographyDicomLayer(*this))); + + layer.SetInstance(instance, frame); + + if (geometry != NULL) + { + layer.SetGeometry(*geometry); + } + + layer.SetDicomFrameConverter(converter); + layer.SetSourceImage(dicomImage); + layer.SetPreferredPhotomotricDisplayMode(preferredPhotometricDisplayMode); + + return layer; + } + + RadiographyLayer& RadiographyScene::LoadDicomFrame(Deprecated::OrthancApiClient& orthanc, + const std::string& instance, + unsigned int frame, + bool httpCompression, + RadiographyLayer::Geometry* geometry) + { + RadiographyDicomLayer& layer = dynamic_cast(RegisterLayer(new RadiographyDicomLayer( *this))); + layer.SetInstance(instance, frame); + + if (geometry != NULL) + { + layer.SetGeometry(*geometry); + } + + { + Deprecated::IWebService::HttpHeaders headers; + std::string uri = "/instances/" + instance + "/tags"; + + orthanc.GetBinaryAsync( + uri, headers, + new Deprecated::DeprecatedCallable + (GetSharedObserver(), &RadiographyScene::OnTagsReceived), NULL, + new Orthanc::SingleValueObject(layer.GetIndex())); + } + + { + Deprecated::IWebService::HttpHeaders headers; + headers["Accept"] = "image/x-portable-arbitrarymap"; + + if (httpCompression) + { + headers["Accept-Encoding"] = "gzip"; + } + + std::string uri = ("/instances/" + instance + "/frames/" + + boost::lexical_cast(frame) + "/image-uint16"); + + orthanc.GetBinaryAsync( + uri, headers, + new Deprecated::DeprecatedCallable + (GetSharedObserver(), &RadiographyScene::OnFrameReceived), NULL, + new Orthanc::SingleValueObject(layer.GetIndex())); + } + + return layer; + } + + + RadiographyLayer& RadiographyScene::LoadDicomWebFrame(Deprecated::IWebService& web) + { + RadiographyLayer& layer = RegisterLayer(new RadiographyDicomLayer(*this)); + + + return layer; + } + + + + void RadiographyScene::OnTagsReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message) + { + size_t index = dynamic_cast&> + (message.GetPayload()).GetValue(); + + VLOG(1) << "JSON received: " << message.GetUri().c_str() + << " (" << message.GetAnswerSize() << " bytes) for layer " << index; + + Layers::iterator layer = layers_.find(index); + if (layer != layers_.end()) + { + assert(layer->second != NULL); + + OrthancPlugins::FullOrthancDataset dicom(message.GetAnswer(), message.GetAnswerSize()); + dynamic_cast(layer->second)->SetDicomTags(dicom); + + float c, w; + if (!hasWindowing_ && + layer->second->GetDefaultWindowing(c, w)) + { + hasWindowing_ = true; + windowingCenter_ = c; + windowingWidth_ = w; + } + + BroadcastMessage(GeometryChangedMessage(*this, *(layer->second))); + } + } + + + void RadiographyScene::OnFrameReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message) + { + size_t index = dynamic_cast&>(message.GetPayload()).GetValue(); + + VLOG(1) << "DICOM frame received: " << message.GetUri().c_str() + << " (" << message.GetAnswerSize() << " bytes) for layer " << index; + + Layers::iterator layer = layers_.find(index); + if (layer != layers_.end()) + { + assert(layer->second != NULL); + + std::string content; + if (message.GetAnswerSize() > 0) + { + content.assign(reinterpret_cast(message.GetAnswer()), message.GetAnswerSize()); + } + + std::unique_ptr reader(new Orthanc::PamReader); + reader->ReadFromMemory(content); + dynamic_cast(layer->second)->SetSourceImage(reader.release()); + + BroadcastMessage(ContentChangedMessage(*this, *(layer->second))); + } + } + + + Extent2D RadiographyScene::GetSceneExtent(bool minimal) const + { + Extent2D extent; + + for (Layers::const_iterator it = layers_.begin(); + it != layers_.end(); ++it) + { + assert(it->second != NULL); + extent.Union(it->second->GetSceneExtent(minimal)); + } + + return extent; + } + + + void RadiographyScene::Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + bool applyWindowing) const + { + // Render layers in the background-to-foreground order + for (size_t index = 0; index < nextLayerIndex_; index++) + { + try + { + Layers::const_iterator it = layers_.find(index); + if (it != layers_.end()) + { + assert(it->second != NULL); + it->second->Render(buffer, viewTransform, interpolation, windowingCenter_, windowingWidth_, applyWindowing); + } + } + catch (Orthanc::OrthancException& ex) + { + LOG(ERROR) << "RadiographyScene::Render: " << index << ", OrthancException: " << ex.GetDetails(); + throw ex; // rethrow because we want it to crash to see there's a problem ! + } + catch (...) + { + LOG(ERROR) << "RadiographyScene::Render: " << index << ", unkown exception: "; + throw; // rethrow because we want it to crash to see there's a problem ! + } + } + } + + + bool RadiographyScene::LookupLayer(size_t& index /* out */, + double x, + double y) const + { + // Render layers in the foreground-to-background order + for (size_t i = nextLayerIndex_; i > 0; i--) + { + index = i - 1; + Layers::const_iterator it = layers_.find(index); + if (it != layers_.end()) + { + assert(it->second != NULL); + if (it->second->Contains(x, y)) + { + return true; + } + } + } + + return false; + } + + + void RadiographyScene::DrawBorder(CairoContext& context, + unsigned int layer, + double zoom) + { + Layers::const_iterator found = layers_.find(layer); + + if (found != layers_.end()) + { + context.SetSourceColor(255, 0, 0); + found->second->DrawBorders(context, zoom); + } + } + + + void RadiographyScene::GetRange(float& minValue, + float& maxValue) const + { + bool first = true; + + for (Layers::const_iterator it = layers_.begin(); + it != layers_.end(); it++) + { + assert(it->second != NULL); + + float a, b; + if (it->second->GetRange(a, b)) + { + if (first) + { + minValue = a; + maxValue = b; + first = false; + } + else + { + minValue = std::min(a, minValue); + maxValue = std::max(b, maxValue); + } + } + } + + if (first) + { + minValue = 0; + maxValue = 0; + } + } + + void RadiographyScene::ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, + const Orthanc::ImageAccessor& renderedScene, + size_t layerIndex, + bool isCropped, + ImageInterpolation interpolation) + { + Extent2D sceneExtent = GetSceneExtent(isCropped); + + double pixelSpacingX = sceneExtent.GetWidth() / renderedScene.GetWidth(); + double pixelSpacingY = sceneExtent.GetHeight() / renderedScene.GetHeight(); + + AffineTransform2D view = AffineTransform2D::Combine( + AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), + AffineTransform2D::CreateOffset(-sceneExtent.GetX1(), -sceneExtent.GetY1())); + + AffineTransform2D layerToSceneTransform = AffineTransform2D::Combine( + view, + GetLayer(layerIndex).GetTransform()); + + AffineTransform2D sceneToLayerTransform = AffineTransform2D::Invert(layerToSceneTransform); + sceneToLayerTransform.Apply(layer, renderedScene, interpolation, false); + } + + Orthanc::Image* RadiographyScene::ExportToImage(double pixelSpacingX, + double pixelSpacingY, + ImageInterpolation interpolation, + bool invert, + int64_t maxValue /* for inversion */, + bool autoCrop, + bool applyWindowing) + { + if (pixelSpacingX <= 0 || + pixelSpacingY <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + Extent2D extent = GetSceneExtent(autoCrop); + + int w = boost::math::iround(extent.GetWidth() / pixelSpacingX); + int h = boost::math::iround(extent.GetHeight() / pixelSpacingY); + + if (w < 0 || h < 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + Orthanc::Image layers(Orthanc::PixelFormat_Float32, + static_cast(w), + static_cast(h), false); + + AffineTransform2D view = AffineTransform2D::Combine( + AffineTransform2D::CreateScaling(1.0 / pixelSpacingX, 1.0 / pixelSpacingY), + AffineTransform2D::CreateOffset(-extent.GetX1(), -extent.GetY1())); + + // wipe background before rendering + if (GetPreferredPhotomotricDisplayMode() == RadiographyPhotometricDisplayMode_Monochrome1) + { + Orthanc::ImageProcessing::Set(layers, 65535); + } + else + { + Orthanc::ImageProcessing::Set(layers, 0); + } + + Render(layers, view, interpolation, applyWindowing); + + std::unique_ptr rendered(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, + layers.GetWidth(), layers.GetHeight(), false)); + + Orthanc::ImageProcessing::Convert(*rendered, layers); + if (invert) + Orthanc::ImageProcessing::Invert(*rendered, maxValue); + + return rendered.release(); + } + + + Orthanc::Image* RadiographyScene::ExportToCreateDicomRequestAndImage(Json::Value& createDicomRequestContent, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation) + { + LOG(INFO) << "Exporting RadiographyScene to DICOM"; + + std::unique_ptr rendered(ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, autoCrop, false)); // note: we don't invert the image in the pixels data because we'll set the PhotometricDisplayMode correctly in the DICOM tags + + createDicomRequestContent["Tags"] = dicomTags; + + RadiographyPhotometricDisplayMode photometricMode = GetPreferredPhotomotricDisplayMode(); + if ((invert && photometricMode != RadiographyPhotometricDisplayMode_Monochrome2) || + (!invert && photometricMode == RadiographyPhotometricDisplayMode_Monochrome1)) + { + createDicomRequestContent["Tags"]["PhotometricInterpretation"] = "MONOCHROME1"; + } + else + { + createDicomRequestContent["Tags"]["PhotometricInterpretation"] = "MONOCHROME2"; + } + + // WARNING: The order of PixelSpacing is Y/X. We use "%0.8f" to + // avoid floating-point numbers to grow over 16 characters, + // which would be invalid according to DICOM standard + // ("dciodvfy" would complain). + char buf[32]; + sprintf(buf, "%0.8f\\%0.8f", pixelSpacingY, pixelSpacingX); + + createDicomRequestContent["Tags"]["PixelSpacing"] = buf; + + float center, width; + if (GetWindowing(center, width)) + { + createDicomRequestContent["Tags"]["WindowCenter"] = + boost::lexical_cast(boost::math::iround(center)); + + createDicomRequestContent["Tags"]["WindowWidth"] = + boost::lexical_cast(boost::math::iround(width)); + } + + if (!parentOrthancId.empty()) + { + createDicomRequestContent["Parent"] = parentOrthancId; + } + + return rendered.release(); + } + + + void RadiographyScene::ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam) + { + LOG(INFO) << "Exporting RadiographyScene to DICOM"; + VLOG(1) << "Exporting RadiographyScene to: export to image"; + + std::unique_ptr rendered(ExportToCreateDicomRequestAndImage(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation)); + + // convert the image into base64 for inclusing in the createDicomRequest + std::string base64; + + { + std::string content; + + if (usePam) + { + VLOG(1) << "Exporting RadiographyScene: convert to PAM"; + Orthanc::PamWriter writer; + writer.WriteToMemory(content, *rendered); + } + else + { + Orthanc::PngWriter writer; + writer.WriteToMemory(content, *rendered); + } + + VLOG(1) << "Exporting RadiographyScene: encoding to base64"; + Orthanc::Toolbox::EncodeBase64(base64, content); + } + + // This is Data URI scheme: https://en.wikipedia.org/wiki/Data_URI_scheme + createDicomRequestContent["Content"] = ("data:" + + std::string(usePam ? Orthanc::MIME_PAM : Orthanc::MIME_PNG) + + ";base64," + base64); + + VLOG(1) << "Exporting RadiographyScene: create-dicom request is ready"; + } + + + void RadiographyScene::ExportDicom(Deprecated::OrthancApiClient& orthanc, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam) + { + Json::Value createDicomRequestContent; + + ExportToCreateDicomRequest(createDicomRequestContent, dicomTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); + + orthanc.PostJsonAsyncExpectJson( + "/tools/create-dicom", createDicomRequestContent, + new Deprecated::DeprecatedCallable + (GetSharedObserver(), &RadiographyScene::OnDicomExported), + NULL, NULL); + + } + + + // Export using PAM is faster than using PNG, but requires Orthanc + // core >= 1.4.3 + void RadiographyScene::ExportDicom(Deprecated::OrthancApiClient& orthanc, + const Orthanc::DicomMap& dicom, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam) + { + std::set tags; + dicom.GetTags(tags); + + Json::Value jsonTags = Json::objectValue; + + for (std::set::const_iterator + tag = tags.begin(); tag != tags.end(); ++tag) + { + const Orthanc::DicomValue& value = dicom.GetValue(*tag); + if (!value.IsNull() && + !value.IsBinary()) + { + jsonTags[tag->Format()] = value.GetContent(); + } + } + + ExportDicom(orthanc, jsonTags, parentOrthancId, pixelSpacingX, pixelSpacingY, invert, autoCrop, interpolation, usePam); + } + + void RadiographyScene::OnDicomExported(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) + { + LOG(INFO) << "DICOM export was successful: " + << message.GetJson().toStyledString(); + } + + + void RadiographyScene::OnDicomWebReceived(const Deprecated::IWebService::HttpRequestSuccessMessage& message) + { + LOG(INFO) << "DICOMweb WADO-RS received: " << message.GetAnswerSize() << " bytes"; + + const Deprecated::IWebService::HttpHeaders& h = message.GetAnswerHttpHeaders(); + for (Deprecated::IWebService::HttpHeaders::const_iterator + it = h.begin(); it != h.end(); ++it) + { + printf("[%s] = [%s]\n", it->first.c_str(), it->second.c_str()); + } + } + + void RadiographyScene::ExportToScene2D(Scene2D& output) const + { + int depth = 0; + for (Layers::const_iterator it = layers_.begin(); + it != layers_.end(); ++it) + { + assert(it->second != NULL); + + std::unique_ptr layer; + if (dynamic_cast(it->second)) + { + RadiographyDicomLayer* oldLayer = dynamic_cast(it->second); + + std::unique_ptr newLayer(new FloatTextureSceneLayer(*(oldLayer->GetSourceImage()))); + + newLayer->SetOrigin(oldLayer->GetGeometry().GetPanX(), + oldLayer->GetGeometry().GetPanY() + ); + newLayer->SetAngle(oldLayer->GetGeometry().GetAngle()); + + layer.reset(newLayer.release()); + + // TODO: windowing dynamic_cast + } + else if (dynamic_cast(it->second)) + { + RadiographyTextLayer* oldLayer = dynamic_cast(it->second); + + std::unique_ptr newLayer(new TextSceneLayer()); + + newLayer->SetText(oldLayer->GetText()); + newLayer->SetColor(oldLayer->GetForegroundGreyLevel(), + oldLayer->GetForegroundGreyLevel(), + oldLayer->GetForegroundGreyLevel() + ); + newLayer->SetPosition(oldLayer->GetGeometry().GetPanX(), + oldLayer->GetGeometry().GetPanY() + ); + newLayer->SetFontIndex(1); + newLayer->SetAnchor(BitmapAnchor_TopLeft); + //newLayer->SetAngle(oldLayer->GetGeometry().GetAngle()); + + layer.reset(newLayer.release()); + } + + output.SetLayer(depth++, layer.release()); + + } + + } + +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyScene.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyScene.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,371 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyLayer.h" +#include "../Messages/ObserverBase.h" +#include "../Deprecated/Toolbox/DicomFrameConverter.h" +#include "../Deprecated/Toolbox/OrthancApiClient.h" +#include "../StoneEnumerations.h" +#include "../Scene2D/Scene2D.h" + +#include +#include + + +namespace OrthancStone +{ + class RadiographyDicomLayer; + + class RadiographyScene : + public ObserverBase, + public IObservable + { + friend class RadiographySceneGeometryReader; + public: + class GeometryChangedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + RadiographyLayer& layer_; + + public: + GeometryChangedMessage(const RadiographyScene& origin, + RadiographyLayer& layer) : + OriginMessage(origin), + layer_(layer) + { + } + + RadiographyLayer& GetLayer() const + { + return layer_; + } + }; + + class ContentChangedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + RadiographyLayer& layer_; + + public: + ContentChangedMessage(const RadiographyScene& origin, + RadiographyLayer& layer) : + OriginMessage(origin), + layer_(layer) + { + } + + RadiographyLayer& GetLayer() const + { + return layer_; + } + }; + + class LayerEditedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const RadiographyLayer& layer_; + + public: + LayerEditedMessage(const RadiographyScene& origin, + const RadiographyLayer& layer) : + OriginMessage(origin), + layer_(layer) + { + } + + const RadiographyLayer& GetLayer() const + { + return layer_; + } + }; + + class LayerRemovedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + size_t& layerIndex_; + + public: + LayerRemovedMessage(const RadiographyScene& origin, + size_t& layerIndex) : + OriginMessage(origin), + layerIndex_(layerIndex) + { + } + + size_t& GetLayerIndex() const + { + return layerIndex_; + } + }; + + + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, WindowingChangedMessage, RadiographyScene); + + + class LayerAccessor : public boost::noncopyable + { + private: + RadiographyScene& scene_; + size_t index_; + RadiographyLayer* layer_; + + public: + LayerAccessor(RadiographyScene& scene, + size_t index); + + LayerAccessor(RadiographyScene& scene, + double x, + double y); + + void Invalidate() + { + layer_ = NULL; + } + + bool IsValid() const + { + return layer_ != NULL; + } + + RadiographyScene& GetScene() const; + + size_t GetIndex() const; + + RadiographyLayer& GetLayer() const; + }; + + + protected: + typedef std::map Layers; + + size_t nextLayerIndex_; + bool hasWindowing_; + float windowingCenter_; + float windowingWidth_; + Layers layers_; + + public: + RadiographyLayer& RegisterLayer(RadiographyLayer* layer); + + protected: + virtual void _RegisterLayer(RadiographyLayer* layer); + virtual void _OnLayerRemoved() {} + + void SetLayerIndex(RadiographyLayer* layer, size_t index) + { + layer->SetIndex(index); + } + + virtual void OnTagsReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message); + + virtual void OnFrameReceived(const Deprecated::OrthancApiClient::BinaryResponseReadyMessage& message); + + void OnDicomExported(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); + + void OnDicomWebReceived(const Deprecated::IWebService::HttpRequestSuccessMessage& message); + + virtual void OnLayerEdited(const RadiographyLayer::LayerEditedMessage& message); + + public: + RadiographyScene(); + + virtual ~RadiographyScene(); + + virtual size_t GetApproximateMemoryUsage() const; + + bool GetWindowing(float& center, + float& width) const; + + void GetWindowingWithDefault(float& center, + float& width) const; + + virtual void SetWindowing(float center, + float width); + + RadiographyPhotometricDisplayMode GetPreferredPhotomotricDisplayMode() const; + + RadiographyLayer& LoadText(const std::string& utf8, + const std::string& font, + unsigned int fontSize, + uint8_t foreground, + RadiographyLayer::Geometry* geometry, + bool isCenterGeometry); + + RadiographyLayer& UpdateText(size_t layerIndex, + const std::string& font, + const std::string& utf8, + unsigned int fontSize, + uint8_t foreground); + + RadiographyLayer& LoadTestBlock(unsigned int width, + unsigned int height, + RadiographyLayer::Geometry* geometry); + + RadiographyLayer& LoadMask(const std::vector& corners, + const RadiographyDicomLayer& dicomLayer, + float foreground, + RadiographyLayer::Geometry* geometry); + + RadiographyLayer& LoadAlphaBitmap(Orthanc::ImageAccessor* bitmap, // takes ownership + RadiographyLayer::Geometry* geometry); + + virtual RadiographyLayer& LoadDicomImage(Orthanc::ImageAccessor* dicomImage, // takes ownership + const std::string& instance, + unsigned int frame, + Deprecated::DicomFrameConverter* converter, // takes ownership + RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode, + RadiographyLayer::Geometry* geometry); + + virtual RadiographyLayer& LoadDicomFrame(Deprecated::OrthancApiClient& orthanc, + const std::string& instance, + unsigned int frame, + bool httpCompression, + RadiographyLayer::Geometry* geometry); // pass NULL if you want default geometry + + RadiographyLayer& LoadDicomWebFrame(Deprecated::IWebService& web); + + void RemoveLayer(size_t layerIndex); + + RadiographyLayer& GetLayer(size_t layerIndex); + + const RadiographyLayer& GetLayer(size_t layerIndex) const; + + template + TypeLayer* GetTypedLayer(size_t indexOfType = 0) + { + std::vector layerIndexes; + GetLayersIndexes(layerIndexes); + + size_t count = 0; + + for (size_t i = 0; i < layerIndexes.size(); ++i) + { + TypeLayer* typedLayer = dynamic_cast(layers_[layerIndexes[i]]); + if (typedLayer != NULL) + { + if (count == indexOfType) + { + return typedLayer; + } + count++; + } + } + + return NULL; + } + + void GetLayersIndexes(std::vector& output) const; + + virtual Extent2D GetSceneExtent(bool minimal) const; + + virtual void Render(Orthanc::ImageAccessor& buffer, + const AffineTransform2D& viewTransform, + ImageInterpolation interpolation, + bool applyWindowing) const; + + bool LookupLayer(size_t& index /* out */, + double x, + double y) const; + + void DrawBorder(CairoContext& context, + unsigned int layer, + double zoom); + + void GetRange(float& minValue, + float& maxValue) const; + + void ExportToScene2D(Scene2D& output) const; + + // Export using PAM is faster than using PNG, but requires Orthanc + // core >= 1.4.3 + void ExportDicom(Deprecated::OrthancApiClient& orthanc, + const Orthanc::DicomMap& dicom, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam); + + void ExportDicom(Deprecated::OrthancApiClient& orthanc, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam); + + void ExportToCreateDicomRequest(Json::Value& createDicomRequestContent, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation, + bool usePam); + + Orthanc::Image* ExportToCreateDicomRequestAndImage(Json::Value& createDicomRequestContent, + const Json::Value& dicomTags, + const std::string& parentOrthancId, + double pixelSpacingX, + double pixelSpacingY, + bool invert, + bool autoCrop, + ImageInterpolation interpolation); + + Orthanc::Image* ExportToImage(double pixelSpacingX, + double pixelSpacingY, + ImageInterpolation interpolation, + bool autoCrop, + bool applyWindowing) + { + return ExportToImage(pixelSpacingX, pixelSpacingY, interpolation, false, 0, autoCrop, applyWindowing); + } + + Orthanc::Image* ExportToImage(double pixelSpacingX, + double pixelSpacingY, + ImageInterpolation interpolation, + bool invert, + int64_t maxValue /* for inversion */, + bool autoCrop, + bool applyWindowing); + + void ExtractLayerFromRenderedScene(Orthanc::ImageAccessor& layer, + const Orthanc::ImageAccessor& renderedScene, + size_t layerIndex, + bool isCropped, + ImageInterpolation interpolation); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographySceneCommand.h" + + +namespace OrthancStone +{ + RadiographySceneCommand::RadiographySceneCommand(RadiographyScene& scene, + size_t layer) : + scene_(scene), + layer_(layer) + { + } + + + RadiographySceneCommand::RadiographySceneCommand(const RadiographyScene::LayerAccessor& accessor) : + scene_(accessor.GetScene()), + layer_(accessor.GetIndex()) + { + } + + + void RadiographySceneCommand::Undo() const + { + RadiographyScene::LayerAccessor accessor(scene_, layer_); + + if (accessor.IsValid()) + { + UndoInternal(accessor.GetLayer()); + } + } + + + void RadiographySceneCommand::Redo() const + { + RadiographyScene::LayerAccessor accessor(scene_, layer_); + + if (accessor.IsValid()) + { + RedoInternal(accessor.GetLayer()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + class RadiographySceneCommand : public UndoRedoStack::ICommand + { + private: + RadiographyScene& scene_; + size_t layer_; + + protected: + virtual void UndoInternal(RadiographyLayer& layer) const = 0; + + virtual void RedoInternal(RadiographyLayer& layer) const = 0; + + public: + RadiographySceneCommand(RadiographyScene& scene, + size_t layer); + + RadiographySceneCommand(const RadiographyScene::LayerAccessor& accessor); + + virtual void Undo() const; + + virtual void Redo() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneReader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneReader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,189 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographySceneReader.h" + +#include "../Deprecated/Toolbox/DicomFrameConverter.h" + +#include +#include +#include +#include + +namespace OrthancStone +{ + + void RadiographySceneBuilder::Read(const Json::Value& input, Orthanc::ImageAccessor* dicomImage /* takes ownership */, + Deprecated::DicomFrameConverter* dicomFrameConverter /* takes ownership */, + RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode + ) + { + dicomImage_.reset(dicomImage); + dicomFrameConverter_.reset(dicomFrameConverter); + preferredPhotometricDisplayMode_ = preferredPhotometricDisplayMode; + Read(input); + } + + RadiographyDicomLayer* RadiographySceneBuilder::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) + { + return dynamic_cast(&(scene_.LoadDicomImage(dicomImage_.release(), instanceId, frame, dicomFrameConverter_.release(), preferredPhotometricDisplayMode_, geometry))); + } + + + RadiographyDicomLayer* RadiographySceneReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) + { + return dynamic_cast(&(scene_.LoadDicomFrame(orthancApiClient_, instanceId, frame, false, geometry))); + } + + RadiographyDicomLayer* RadiographySceneGeometryReader::LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry) + { + std::unique_ptr layer(new RadiographyPlaceholderLayer(scene_)); + layer->SetGeometry(*geometry); + layer->SetSize(dicomImageWidth_, dicomImageHeight_); + scene_.RegisterLayer(layer.get()); + + return layer.release(); + } + + void RadiographySceneBuilder::Read(const Json::Value& input) + { + unsigned int version = input["version"].asUInt(); + + if (version != 1) + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + + if (input.isMember("hasWindowing") && input["hasWindowing"].asBool()) + { + scene_.SetWindowing(input["windowCenter"].asFloat(), input["windowWidth"].asFloat()); + } + + RadiographyDicomLayer* dicomLayer = NULL; + for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) + { + const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; + RadiographyLayer::Geometry geometry; + + if (jsonLayer["type"].asString() == "dicom") + { + ReadLayerGeometry(geometry, jsonLayer); + dicomLayer = LoadDicom(jsonLayer["instanceId"].asString(), jsonLayer["frame"].asUInt(), &geometry); + } + else if (jsonLayer["type"].asString() == "mask") + { + if (dicomLayer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); // we always assumed the dicom layer was read before the mask + } + ReadLayerGeometry(geometry, jsonLayer); + + float foreground = jsonLayer["foreground"].asFloat(); + std::vector corners; + for (size_t i = 0; i < jsonLayer["corners"].size(); i++) + { + Orthanc::ImageProcessing::ImagePoint corner(jsonLayer["corners"][(int)i]["x"].asInt(), + jsonLayer["corners"][(int)i]["y"].asInt()); + corners.push_back(corner); + } + + scene_.LoadMask(corners, *dicomLayer, foreground, &geometry); + } + else if (jsonLayer["type"].asString() == "text") + { + ReadLayerGeometry(geometry, jsonLayer); + scene_.LoadText(jsonLayer["text"].asString(), jsonLayer["font"].asString(), jsonLayer["fontSize"].asUInt(), static_cast(jsonLayer["foreground"].asUInt()), &geometry, false); + } + else if (jsonLayer["type"].asString() == "alpha") + { + ReadLayerGeometry(geometry, jsonLayer); + + const std::string& pngContentBase64 = jsonLayer["content"].asString(); + std::string pngContent; + std::string mimeType; + Orthanc::Toolbox::DecodeDataUriScheme(mimeType, pngContent, pngContentBase64); + + std::unique_ptr image; + if (mimeType == "image/png") + { + image.reset(new Orthanc::PngReader()); + dynamic_cast(image.get())->ReadFromMemory(pngContent); + } + else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + + RadiographyAlphaLayer& layer = dynamic_cast(scene_.LoadAlphaBitmap(image.release(), &geometry)); + + if (!jsonLayer["isUsingWindowing"].asBool()) + { + layer.SetForegroundValue((float)(jsonLayer["foreground"].asDouble())); + } + } + else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + + + void RadiographySceneBuilder::ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input) + { + for(size_t layerIndex = 0; layerIndex < input["layers"].size(); layerIndex++) + { + const Json::Value& jsonLayer = input["layers"][(int)layerIndex]; + if (jsonLayer["type"].asString() == "dicom") + { + ReadLayerGeometry(geometry, jsonLayer); + return; + } + } + } + + void RadiographySceneBuilder::ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& jsonLayer) + { + {// crop + unsigned int x, y, width, height; + if (jsonLayer["crop"]["hasCrop"].asBool()) + { + x = jsonLayer["crop"]["x"].asUInt(); + y = jsonLayer["crop"]["y"].asUInt(); + width = jsonLayer["crop"]["width"].asUInt(); + height = jsonLayer["crop"]["height"].asUInt(); + geometry.SetCrop(x, y, width, height); + } + } + + geometry.SetAngle(jsonLayer["angle"].asDouble()); + geometry.SetResizeable(jsonLayer["isResizable"].asBool()); + geometry.SetPan(jsonLayer["pan"]["x"].asDouble(), jsonLayer["pan"]["y"].asDouble()); + geometry.SetPixelSpacing(jsonLayer["pixelSpacing"]["x"].asDouble(), jsonLayer["pixelSpacing"]["y"].asDouble()); + + // these fields were introduced later -> they might not exist + if (jsonLayer.isMember("flipVertical")) + { + geometry.SetFlipVertical(jsonLayer["flipVertical"].asBool()); + } + if (jsonLayer.isMember("flipHorizontal")) + { + geometry.SetFlipHorizontal(jsonLayer["flipHorizontal"].asBool()); + } + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneReader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,113 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyScene.h" +#include "RadiographyAlphaLayer.h" +#include "RadiographyDicomLayer.h" +#include "RadiographyMaskLayer.h" +#include "RadiographyTextLayer.h" +#include "../Deprecated/Toolbox/OrthancApiClient.h" + +#include +#include + +namespace OrthancStone +{ + // a layer containing only the geometry of a DICOM layer (bit hacky !) + class RadiographyPlaceholderLayer : public RadiographyDicomLayer + { + public: + RadiographyPlaceholderLayer(const RadiographyScene& scene) : + RadiographyDicomLayer(scene) + { + } + + }; + + + // HACK: I had to introduce this builder class in order to be able to recreate a RadiographyScene + // from a serialized scene that is passed to web-workers. + // It needs some architecturing... + class RadiographySceneBuilder : public boost::noncopyable + { + protected: + RadiographyScene& scene_; + std::unique_ptr dicomImage_; + std::unique_ptr dicomFrameConverter_; + RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode_; + + public: + RadiographySceneBuilder(RadiographyScene& scene) : + scene_(scene) + { + } + + void Read(const Json::Value& input); + void Read(const Json::Value& input, + Orthanc::ImageAccessor* dicomImage, // takes ownership + Deprecated::DicomFrameConverter* dicomFrameConverter, // takes ownership + RadiographyPhotometricDisplayMode preferredPhotometricDisplayMode + ); + + static void ReadLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input); + static void ReadDicomLayerGeometry(RadiographyLayer::Geometry& geometry, const Json::Value& input); + + protected: + virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); + + }; + + + class RadiographySceneReader : public RadiographySceneBuilder + { + Deprecated::OrthancApiClient& orthancApiClient_; + + public: + RadiographySceneReader(RadiographyScene& scene, Deprecated::OrthancApiClient& orthancApiClient) : + RadiographySceneBuilder(scene), + orthancApiClient_(orthancApiClient) + { + } + + protected: + virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); + }; + + // reads the whole scene but the DICOM image such that we have the full geometry + class RadiographySceneGeometryReader : public RadiographySceneBuilder + { + unsigned int dicomImageWidth_; + unsigned int dicomImageHeight_; + + public: + RadiographySceneGeometryReader(RadiographyScene& scene, unsigned int dicomImageWidth, unsigned int dicomImageHeight) : + RadiographySceneBuilder(scene), + dicomImageWidth_(dicomImageWidth), + dicomImageHeight_(dicomImageHeight) + { + } + + protected: + virtual RadiographyDicomLayer* LoadDicom(const std::string& instanceId, unsigned int frame, RadiographyLayer::Geometry* geometry); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneWriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneWriter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,168 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographySceneWriter.h" + +#include +#include +#include + +namespace OrthancStone +{ + void RadiographySceneWriter::Write(Json::Value& output, const RadiographyScene& scene) + { + output["version"] = 1; + float windowCenter, windowWidth; + bool hasWindowing = scene.GetWindowing(windowCenter, windowWidth); + output["hasWindowing"] = hasWindowing; + if (hasWindowing) + { + output["windowCenter"] = windowCenter; + output["windowWidth"] = windowWidth; + } + output["layers"] = Json::arrayValue; + + std::vector layersIndexes; + scene.GetLayersIndexes(layersIndexes); + + for (std::vector::iterator itLayerIndex = layersIndexes.begin(); itLayerIndex < layersIndexes.end(); itLayerIndex++) + { + Json::Value layer; + WriteLayer(layer, scene.GetLayer(*itLayerIndex)); + output["layers"].append(layer); + } + } + + void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyDicomLayer& layer) + { + output["type"] = "dicom"; + output["instanceId"] = layer.GetInstanceId(); + output["frame"] = layer.GetFrame(); + } + + void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyTextLayer& layer) + { + output["type"] = "text"; + output["text"] = layer.GetText(); + output["font"] = layer.GetFont(); + output["fontSize"] = layer.GetFontSize(); + output["foreground"] = layer.GetForegroundGreyLevel(); + } + + void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyMaskLayer& layer) + { + output["type"] = "mask"; + output["instanceId"] = layer.GetInstanceId(); // the dicom layer it's being linked to + output["foreground"] = layer.GetForeground(); + output["corners"] = Json::arrayValue; + const std::vector& corners = layer.GetCorners(); + for (size_t i = 0; i < corners.size(); i++) + { + Json::Value corner; + corner["x"] = corners[i].GetX(); + corner["y"] = corners[i].GetY(); + output["corners"].append(corner); + } + } + + void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyAlphaLayer& layer) + { + output["type"] = "alpha"; + + //output["bitmap"] = + const Orthanc::ImageAccessor& alpha = layer.GetAlpha(); + + Orthanc::PngWriter pngWriter; + std::string pngContent; + std::string pngContentBase64; + pngWriter.WriteToMemory(pngContent, alpha); + + Orthanc::Toolbox::EncodeDataUriScheme(pngContentBase64, "image/png", pngContent); + output["content"] = pngContentBase64; + output["foreground"] = layer.GetForegroundValue(); + } + + void RadiographySceneWriter::WriteLayer(Json::Value& output, const RadiographyLayer& layer) + { + const RadiographyLayer::Geometry& geometry = layer.GetGeometry(); + + {// crop + Json::Value crop; + if (geometry.HasCrop()) + { + unsigned int x, y, width, height; + geometry.GetCrop(x, y, width, height); + crop["hasCrop"] = true; + crop["x"] = x; + crop["y"] = y; + crop["width"] = width; + crop["height"] = height; + } + else + { + crop["hasCrop"] = false; + } + + output["crop"] = crop; + } + + output["angle"] = geometry.GetAngle(); + output["isResizable"] = geometry.IsResizeable(); + + {// pan + Json::Value pan; + pan["x"] = geometry.GetPanX(); + pan["y"] = geometry.GetPanY(); + output["pan"] = pan; + } + + {// pixelSpacing + Json::Value pan; + pan["x"] = geometry.GetPixelSpacingX(); + pan["y"] = geometry.GetPixelSpacingY(); + output["pixelSpacing"] = pan; + } + + output["flipVertical"] = geometry.GetFlipVertical(); + output["flipHorizontal"] = geometry.GetFlipHorizontal(); + + if (dynamic_cast(&layer) != NULL) + { + WriteLayer(output, dynamic_cast(layer)); + } + else if (dynamic_cast(&layer) != NULL) + { + WriteLayer(output, dynamic_cast(layer)); + } + else if (dynamic_cast(&layer) != NULL) + { + WriteLayer(output, dynamic_cast(layer)); + } + else if (dynamic_cast(&layer) != NULL) + { + WriteLayer(output, dynamic_cast(layer)); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographySceneWriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographySceneWriter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyScene.h" +#include "RadiographyAlphaLayer.h" +#include "RadiographyDicomLayer.h" +#include "RadiographyTextLayer.h" +#include "RadiographyMaskLayer.h" +#include + +namespace OrthancStone +{ + class RadiographyScene; + + class RadiographySceneWriter : public boost::noncopyable + { + + public: + RadiographySceneWriter() + { + } + + void Write(Json::Value& output, const RadiographyScene& scene); + + private: + void WriteLayer(Json::Value& output, const RadiographyLayer& layer); + void WriteLayer(Json::Value& output, const RadiographyDicomLayer& layer); + void WriteLayer(Json::Value& output, const RadiographyTextLayer& layer); + void WriteLayer(Json::Value& output, const RadiographyAlphaLayer& layer); + void WriteLayer(Json::Value& output, const RadiographyMaskLayer& layer); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyTextLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyTextLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "RadiographyTextLayer.h" + +#include "RadiographyScene.h" +#include "../Toolbox/TextRenderer.h" + +#include + +namespace OrthancStone +{ + std::map RadiographyTextLayer::fonts_; + + void RadiographyTextLayer::SetText(const std::string& utf8, + const std::string& font, + unsigned int fontSize, + uint8_t foregroundGreyLevel) + { + if (fonts_.find(font) == fonts_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "The font has not been registered"); + } + + text_ = utf8; + font_ = font; + fontSize_ = fontSize; + foregroundGreyLevel_ = foregroundGreyLevel; + + SetAlpha(TextRenderer::Render(fonts_[font_], + fontSize_, + text_)); + + SetForegroundValue(foregroundGreyLevel * 256.0f); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyTextLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyTextLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "RadiographyAlphaLayer.h" + +namespace OrthancStone +{ + class RadiographyScene; + + class RadiographyTextLayer : public RadiographyAlphaLayer + { + private: + std::string text_; + std::string font_; + unsigned int fontSize_; + uint8_t foregroundGreyLevel_; + + static std::map fonts_; + public: + RadiographyTextLayer(const RadiographyScene& scene) : + RadiographyAlphaLayer(scene) + { + } + + void SetText(const std::string& utf8, const std::string& font, unsigned int fontSize, uint8_t foregroundGreyLevel); + + const std::string& GetText() const + { + return text_; + } + + const std::string& GetFont() const + { + return font_; + } + + unsigned int GetFontSize() const + { + return fontSize_; + } + + uint8_t GetForegroundGreyLevel() const + { + return foregroundGreyLevel_; + } + + static void RegisterFont(const std::string& name, Orthanc::EmbeddedResources::FileResourceId fontResourceId) + { + fonts_[name] = fontResourceId; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,284 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyWidget.h" + +#include +#include +#include + +#include "RadiographyMaskLayer.h" + +namespace OrthancStone +{ + + bool RadiographyWidget::IsInvertedInternal() const + { + // MONOCHROME1 images must be inverted and the user can invert the + // image, too -> XOR the two + return (scene_->GetPreferredPhotomotricDisplayMode() == + RadiographyPhotometricDisplayMode_Monochrome1) ^ invert_; + } + + void RadiographyWidget::RenderBackground( + Orthanc::ImageAccessor& image, float minValue, float maxValue) + { + // wipe background before rendering + float backgroundValue = minValue; + + switch (scene_->GetPreferredPhotomotricDisplayMode()) + { + case RadiographyPhotometricDisplayMode_Monochrome1: + case RadiographyPhotometricDisplayMode_Default: + if (IsInvertedInternal()) + backgroundValue = maxValue; + else + backgroundValue = minValue; + break; + case RadiographyPhotometricDisplayMode_Monochrome2: + if (IsInvertedInternal()) + backgroundValue = minValue; + else + backgroundValue = maxValue; + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + Orthanc::ImageProcessing::Set(image, static_cast(backgroundValue)); + } + + bool RadiographyWidget::RenderInternal(unsigned int width, + unsigned int height, + ImageInterpolation interpolation) + { + if (floatBuffer_.get() == NULL || + floatBuffer_->GetWidth() != width || + floatBuffer_->GetHeight() != height) + { + floatBuffer_.reset(new Orthanc::Image( + Orthanc::PixelFormat_Float32, width, height, false)); + + if (floatBuffer_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "RadiographyWidget::RenderInternal: unable to allocate float buffer"); + } + } + + if (cairoBuffer_.get() == NULL || + cairoBuffer_->GetWidth() != width || + cairoBuffer_->GetHeight() != height) + { + cairoBuffer_.reset(new CairoSurface(width, height, false /* no alpha */)); + + if (cairoBuffer_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "RadiographyWidget::RenderInternal: unable to allocate cairo buffer"); + } + } + + RenderBackground(*floatBuffer_, 0.0, 65535.0); + + scene_->Render(*floatBuffer_, GetView().GetMatrix(), interpolation, true); + + // Conversion from Float32 to BGRA32 (cairo). Very similar to + // GrayscaleFrameRenderer => TODO MERGE? + Orthanc::ImageAccessor target; + cairoBuffer_->GetWriteableAccessor(target); + + bool invert = IsInvertedInternal(); + + for (unsigned int y = 0; y < height; y++) + { + const float* p = reinterpret_cast(floatBuffer_->GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < width; x++, p++, q += 4) + { + uint8_t v = 0; + if (*p >= 65535.0) + { + v = 255; + } + else if (*p <= 0.0) + { + v = 0; + } + else + { + v = static_cast(*p / 256.0); + } + + if (invert) + { + v = 255 - v; + } + + q[0] = v; + q[1] = v; + q[2] = v; + q[3] = 255; + } + } + + return true; + } + + + bool RadiographyWidget::RenderScene(CairoContext& context, + const Deprecated::ViewportGeometry& view) + { + cairo_t* cr = context.GetObject(); + + if (RenderInternal(context.GetWidth(), context.GetHeight(), interpolation_)) + { + // https://www.cairographics.org/FAQ/#paint_from_a_surface + cairo_save(cr); + cairo_identity_matrix(cr); + cairo_set_source_surface(cr, cairoBuffer_->GetObject(), 0, 0); + cairo_paint(cr); + cairo_restore(cr); + } + else + { + // https://www.cairographics.org/FAQ/#clear_a_surface + context.SetSourceColor(0, 0, 0); + cairo_paint(cr); + } + + if (hasSelection_) + { + scene_->DrawBorder( + context, static_cast(selectedLayer_), view.GetZoom()); + } + + return true; + } + + + RadiographyWidget::RadiographyWidget(boost::shared_ptr scene, + const std::string& name) : + WorldSceneWidget(name), + invert_(false), + interpolation_(ImageInterpolation_Nearest), + hasSelection_(false), + selectedLayer_(0) // Dummy initialization + { + SetScene(scene); + } + + + void RadiographyWidget::Select(size_t layer) + { + hasSelection_ = true; + selectedLayer_ = layer; + + NotifyContentChanged(); + BroadcastMessage(SelectionChangedMessage(*this)); + } + + void RadiographyWidget::Unselect() + { + hasSelection_ = false; + + NotifyContentChanged(); + BroadcastMessage(SelectionChangedMessage(*this)); + } + + bool RadiographyWidget::LookupSelectedLayer(size_t& layer) const + { + if (hasSelection_) + { + layer = selectedLayer_; + return true; + } + else + { + return false; + } + } + + + void RadiographyWidget::OnGeometryChanged(const RadiographyScene::GeometryChangedMessage& message) + { +// LOG(INFO) << "Scene geometry has changed"; + FitContent(); + } + + + void RadiographyWidget::OnContentChanged(const RadiographyScene::ContentChangedMessage& message) + { +// LOG(INFO) << "Scene content has changed"; + NotifyContentChanged(); + } + + void RadiographyWidget::OnLayerRemoved(const RadiographyScene::LayerRemovedMessage& message) + { + size_t removedLayerIndex = message.GetLayerIndex(); + if (hasSelection_ && selectedLayer_ == removedLayerIndex) + { + Unselect(); + } + NotifyContentChanged(); + } + + void RadiographyWidget::SetInvert(bool invert) + { + if (invert_ != invert) + { + invert_ = invert; + NotifyContentChanged(); + } + } + + + void RadiographyWidget::SwitchInvert() + { + invert_ = !invert_; + NotifyContentChanged(); + } + + + void RadiographyWidget::SetInterpolation(ImageInterpolation interpolation) + { + if (interpolation_ != interpolation) + { + interpolation_ = interpolation; + NotifyContentChanged(); + } + } + + void RadiographyWidget::SetScene(boost::shared_ptr scene) + { + scene_ = scene; + + Register(*scene_, &RadiographyWidget::OnGeometryChanged); + Register(*scene_, &RadiographyWidget::OnContentChanged); + Register(*scene_, &RadiographyWidget::OnLayerRemoved); + + Unselect(); + + NotifyContentChanged(); + + // force redraw + FitContent(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,131 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Deprecated/Widgets/WorldSceneWidget.h" +#include "../Messages/ObserverBase.h" +#include "RadiographyScene.h" + + +namespace OrthancStone +{ + class RadiographyMaskLayer; + + class RadiographyWidget : + public Deprecated::WorldSceneWidget, + public ObserverBase, + public IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SelectionChangedMessage, RadiographyWidget); + + private: + boost::shared_ptr scene_; + std::unique_ptr floatBuffer_; + std::unique_ptr cairoBuffer_; + bool invert_; + ImageInterpolation interpolation_; + bool hasSelection_; + size_t selectedLayer_; + + bool RenderInternal(unsigned int width, + unsigned int height, + ImageInterpolation interpolation); + + protected: + virtual Extent2D GetSceneExtent() + { + return scene_->GetSceneExtent(false); + } + + virtual bool RenderScene(CairoContext& context, + const Deprecated::ViewportGeometry& view); + + virtual void RenderBackground(Orthanc::ImageAccessor& image, float minValue, float maxValue); + + bool IsInvertedInternal() const; + + public: + RadiographyWidget(boost::shared_ptr scene, // TODO: check how we can avoid boost::shared_ptr here since we don't want them in the public API (app is keeping a boost::shared_ptr to this right now) + const std::string& name); + + RadiographyScene& GetScene() const + { + return *scene_; + } + + void SetScene(boost::shared_ptr scene); + + void Select(size_t layer); + + void Unselect(); + + template bool SelectLayerByType(size_t index = 0); + + bool LookupSelectedLayer(size_t& layer) const; + + void OnGeometryChanged(const RadiographyScene::GeometryChangedMessage& message); + + void OnContentChanged(const RadiographyScene::ContentChangedMessage& message); + + void OnLayerRemoved(const RadiographyScene::LayerRemovedMessage& message); + + void SetInvert(bool invert); + + void SwitchInvert(); + + bool IsInverted() const + { + return invert_; + } + + void SetInterpolation(ImageInterpolation interpolation); + + ImageInterpolation GetInterpolation() const + { + return interpolation_; + } + }; + + template bool RadiographyWidget::SelectLayerByType(size_t index) + { + std::vector layerIndexes; + size_t count = 0; + scene_->GetLayersIndexes(layerIndexes); + + for (size_t i = 0; i < layerIndexes.size(); ++i) + { + const LayerType* typedLayer = dynamic_cast(&(scene_->GetLayer(layerIndexes[i]))); + if (typedLayer != NULL) + { + if (count == index) + { + Select(layerIndexes[i]); + return true; + } + count++; + } + } + + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyWindowingTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyWindowingTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,192 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "RadiographyWindowingTracker.h" +#include "RadiographyWidget.h" + +#include + + +namespace OrthancStone +{ + class RadiographyWindowingTracker::UndoRedoCommand : public UndoRedoStack::ICommand + { + private: + RadiographyScene& scene_; + float sourceCenter_; + float sourceWidth_; + float targetCenter_; + float targetWidth_; + + public: + UndoRedoCommand(const RadiographyWindowingTracker& tracker) : + scene_(tracker.scene_), + sourceCenter_(tracker.sourceCenter_), + sourceWidth_(tracker.sourceWidth_) + { + scene_.GetWindowingWithDefault(targetCenter_, targetWidth_); + } + + virtual void Undo() const + { + scene_.SetWindowing(sourceCenter_, sourceWidth_); + } + + virtual void Redo() const + { + scene_.SetWindowing(targetCenter_, targetWidth_); + } + }; + + + void RadiographyWindowingTracker::ComputeAxisEffect(int& deltaCenter, + int& deltaWidth, + int delta, + Action actionNegative, + Action actionPositive) + { + if (delta < 0) + { + switch (actionNegative) + { + case Action_IncreaseWidth: + deltaWidth = -delta; + break; + + case Action_DecreaseWidth: + deltaWidth = delta; + break; + + case Action_IncreaseCenter: + deltaCenter = -delta; + break; + + case Action_DecreaseCenter: + deltaCenter = delta; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + else if (delta > 0) + { + switch (actionPositive) + { + case Action_IncreaseWidth: + deltaWidth = delta; + break; + + case Action_DecreaseWidth: + deltaWidth = -delta; + break; + + case Action_IncreaseCenter: + deltaCenter = delta; + break; + + case Action_DecreaseCenter: + deltaCenter = -delta; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + + + RadiographyWindowingTracker::RadiographyWindowingTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + RadiographyWidget& widget, + ImageInterpolation interpolationDuringTracking, + int x, + int y, + Action leftAction, + Action rightAction, + Action upAction, + Action downAction) : + undoRedoStack_(undoRedoStack), + scene_(scene), + widget_(widget), + initialWidgetInterpolation_(widget.GetInterpolation()), + clickX_(x), + clickY_(y), + leftAction_(leftAction), + rightAction_(rightAction), + upAction_(upAction), + downAction_(downAction) + { + scene_.GetWindowingWithDefault(sourceCenter_, sourceWidth_); + widget_.SetInterpolation(interpolationDuringTracking); + + float minValue, maxValue; + scene.GetRange(minValue, maxValue); + + assert(minValue <= maxValue); + + float delta = (maxValue - minValue); + strength_ = delta / 1000.0f; // 1px move will change the ww/wc by 0.1% + + if (strength_ < 1) + { + strength_ = 1; + } + } + + + void RadiographyWindowingTracker::Render(CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void RadiographyWindowingTracker::MouseUp() + { + widget_.SetInterpolation(initialWidgetInterpolation_); + undoRedoStack_.Add(new UndoRedoCommand(*this)); + } + + + void RadiographyWindowingTracker::MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + // This follows the behavior of the Osimis Web viewer: + // https://bitbucket.org/osimis/osimis-webviewer-plugin/src/master/frontend/src/app/viewport/image-plugins/windowing-viewport-tool.class.js + + static const float SCALE = 1.0; + + int deltaCenter = 0; + int deltaWidth = 0; + + ComputeAxisEffect(deltaCenter, deltaWidth, displayX - clickX_, leftAction_, rightAction_); + ComputeAxisEffect(deltaCenter, deltaWidth, displayY - clickY_, upAction_, downAction_); + + float newCenter = sourceCenter_ + (deltaCenter / SCALE * strength_); + float newWidth = sourceWidth_ + (deltaWidth / SCALE * strength_); + scene_.SetWindowing(newCenter, newWidth); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Radiography/RadiographyWindowingTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Radiography/RadiographyWindowingTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/UndoRedoStack.h" +#include "../Deprecated/Widgets/IWorldSceneMouseTracker.h" +#include "RadiographyScene.h" + +namespace OrthancStone +{ + + class RadiographyWidget; + + class RadiographyWindowingTracker : public Deprecated::IWorldSceneMouseTracker + { + public: + enum Action + { + Action_IncreaseWidth, + Action_DecreaseWidth, + Action_IncreaseCenter, + Action_DecreaseCenter + }; + + private: + class UndoRedoCommand; + + UndoRedoStack& undoRedoStack_; + RadiographyScene& scene_; + RadiographyWidget& widget_; + ImageInterpolation initialWidgetInterpolation_; + int clickX_; + int clickY_; + Action leftAction_; + Action rightAction_; + Action upAction_; + Action downAction_; + float strength_; + float sourceCenter_; + float sourceWidth_; + + static void ComputeAxisEffect(int& deltaCenter, + int& deltaWidth, + int delta, + Action actionNegative, + Action actionPositive); + + public: + RadiographyWindowingTracker(UndoRedoStack& undoRedoStack, + RadiographyScene& scene, + RadiographyWidget& widget, + ImageInterpolation interpolationDuringTracking, + int x, + int y, + Action leftAction, + Action rightAction, + Action upAction, + Action downAction); + + virtual bool HasRender() const + { + return false; + } + + virtual void Render(CairoContext& context, + double zoom); + + virtual void MouseUp(); + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/SmartLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/SmartLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,285 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SmartLoader.h" + +#include "../StoneException.h" +#include "Layers/DicomSeriesVolumeSlicer.h" +#include "Layers/FrameRenderer.h" +#include "Widgets/SliceViewerWidget.h" + +#include +#include + +namespace Deprecated +{ + enum CachedSliceStatus + { + CachedSliceStatus_ScheduledToLoad, + CachedSliceStatus_GeometryLoaded, + CachedSliceStatus_ImageLoaded + }; + + class SmartLoader::CachedSlice : public IVolumeSlicer + { + public: + class RendererFactory : public LayerReadyMessage::IRendererFactory + { + private: + const CachedSlice& that_; + + public: + RendererFactory(const CachedSlice& that) : + that_(that) + { + } + + virtual ILayerRenderer* CreateRenderer() const + { + bool isFull = (that_.effectiveQuality_ == SliceImageQuality_FullPng || + that_.effectiveQuality_ == SliceImageQuality_FullPam); + + return FrameRenderer::CreateRenderer(*that_.image_, *that_.slice_, isFull); + } + }; + + unsigned int sliceIndex_; + std::unique_ptr slice_; + boost::shared_ptr image_; + SliceImageQuality effectiveQuality_; + CachedSliceStatus status_; + + public: + virtual ~CachedSlice() + { + } + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice) + { + // TODO: viewportSlice is not used !!!! + slice_->GetExtent(points); + return true; + } + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) + { + // TODO: viewportSlice is not used !!!! + + // it has already been loaded -> trigger the "layer ready" message immediately otherwise, do nothing now. The LayerReady will be triggered + // once the VolumeSlicer is ready + if (status_ == CachedSliceStatus_ImageLoaded) + { + LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is loaded): " << slice_->GetOrthancInstanceId(); + + RendererFactory factory(*this); + BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, slice_->GetGeometry())); + } + else + { + LOG(WARNING) << "ScheduleLayerCreation for CachedSlice (image is not loaded yet): " << slice_->GetOrthancInstanceId(); + } + } + + CachedSlice* Clone() const + { + CachedSlice* output = new CachedSlice; + output->sliceIndex_ = sliceIndex_; + output->slice_.reset(slice_->Clone()); + output->image_ = image_; + output->effectiveQuality_ = effectiveQuality_; + output->status_ = status_; + + return output; + } + + }; + + + SmartLoader::SmartLoader(boost::shared_ptr orthancApiClient) : + imageQuality_(SliceImageQuality_FullPam), + orthancApiClient_(orthancApiClient) + { + } + + void SmartLoader::SetFrameInWidget(SliceViewerWidget& sliceViewer, + size_t layerIndex, + const std::string& instanceId, + unsigned int frame) + { + // TODO: check if this frame has already been loaded or is already being loaded. + // - if already loaded: create a "clone" that will emit the GeometryReady/ImageReady messages "immediately" + // (it can not be immediate because Observers needs to register first and this is done after this method returns) + // - if currently loading, we need to return an object that will observe the existing VolumeSlicer and forward + // the messages to its observables + // in both cases, we must be carefull about objects lifecycle !!! + + boost::shared_ptr layerSource; + std::string sliceKeyId = instanceId + ":" + boost::lexical_cast(frame); + SmartLoader::CachedSlice* cachedSlice = NULL; + + if (cachedSlices_.find(sliceKeyId) != cachedSlices_.end()) // && cachedSlices_[sliceKeyId]->status_ == CachedSliceStatus_Loaded) + { + layerSource.reset(cachedSlices_[sliceKeyId]->Clone()); + cachedSlice = dynamic_cast(layerSource.get()); + } + else + { + layerSource.reset(new DicomSeriesVolumeSlicer); + dynamic_cast(layerSource.get())->Connect(orthancApiClient_); + dynamic_cast(layerSource.get())->SetImageQuality(imageQuality_); + Register(*layerSource, &SmartLoader::OnLayerGeometryReady); + Register(*layerSource, &SmartLoader::OnFrameReady); + Register(*layerSource, &SmartLoader::OnLayerReady); + dynamic_cast(layerSource.get())->LoadFrame(instanceId, frame); + } + + // make sure that the widget registers the events before we trigger them + if (sliceViewer.GetLayerCount() == layerIndex) + { + sliceViewer.AddLayer(layerSource); + } + else if (sliceViewer.GetLayerCount() > layerIndex) + { + sliceViewer.ReplaceLayer(layerIndex, layerSource); + } + else + { + throw OrthancStone::StoneException(OrthancStone::ErrorCode_CanOnlyAddOneLayerAtATime); + } + + if (cachedSlice != NULL) + { + BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*cachedSlice)); + } + + } + + void SmartLoader::PreloadSlice(const std::string instanceId, + unsigned int frame) + { + // TODO: reactivate -> need to be able to ScheduleLayerLoading in IVolumeSlicer without calling ScheduleLayerCreation + return; + // TODO: check if it is already in the cache + + + + // create the slice in the cache with "empty" data + boost::shared_ptr cachedSlice(new CachedSlice); + cachedSlice->slice_.reset(new Slice(instanceId, frame)); + cachedSlice->status_ = CachedSliceStatus_ScheduledToLoad; + std::string sliceKeyId = instanceId + ":" + boost::lexical_cast(frame); + + LOG(WARNING) << "Will preload: " << sliceKeyId; + + cachedSlices_[sliceKeyId] = boost::shared_ptr(cachedSlice); + + std::unique_ptr layerSource(new DicomSeriesVolumeSlicer); + dynamic_cast(layerSource.get())->Connect(orthancApiClient_); + dynamic_cast(layerSource.get())->SetImageQuality(imageQuality_); + Register(*layerSource, &SmartLoader::OnLayerGeometryReady); + Register(*layerSource, &SmartLoader::OnFrameReady); + Register(*layerSource, &SmartLoader::OnLayerReady); + dynamic_cast(layerSource.get())->LoadFrame(instanceId, frame); + + // keep a ref to the VolumeSlicer until the slice is fully loaded and saved to cache + preloadingInstances_[sliceKeyId] = boost::shared_ptr(layerSource.release()); + } + + +// void PreloadStudy(const std::string studyId) +// { +// /* TODO */ +// } + +// void PreloadSeries(const std::string seriesId) +// { +// /* TODO */ +// } + + + void SmartLoader::OnLayerGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) + { + const DicomSeriesVolumeSlicer& source = + dynamic_cast(message.GetOrigin()); + + // save/replace the slice in cache + const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() + std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + + boost::lexical_cast(slice.GetFrame())); + + LOG(WARNING) << "Geometry ready: " << sliceKeyId; + + boost::shared_ptr cachedSlice(new CachedSlice); + cachedSlice->slice_.reset(slice.Clone()); + cachedSlice->effectiveQuality_ = source.GetImageQuality(); + cachedSlice->status_ = CachedSliceStatus_GeometryLoaded; + + cachedSlices_[sliceKeyId] = boost::shared_ptr(cachedSlice); + + // re-emit original Layer message to observers + BroadcastMessage(message); + } + + + void SmartLoader::OnFrameReady(const DicomSeriesVolumeSlicer::FrameReadyMessage& message) + { + // save/replace the slice in cache + const Slice& slice = message.GetSlice(); + std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + + boost::lexical_cast(slice.GetFrame())); + + LOG(WARNING) << "Image ready: " << sliceKeyId; + + boost::shared_ptr cachedSlice(new CachedSlice); + cachedSlice->image_.reset(Orthanc::Image::Clone(message.GetFrame())); + cachedSlice->effectiveQuality_ = message.GetImageQuality(); + cachedSlice->slice_.reset(message.GetSlice().Clone()); + cachedSlice->status_ = CachedSliceStatus_ImageLoaded; + + cachedSlices_[sliceKeyId] = cachedSlice; + + // re-emit original Layer message to observers + BroadcastMessage(message); + } + + + void SmartLoader::OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message) + { + const DicomSeriesVolumeSlicer& source = + dynamic_cast(message.GetOrigin()); + + const Slice& slice = source.GetSlice(0); // TODO handle GetSliceCount() ? + std::string sliceKeyId = (slice.GetOrthancInstanceId() + ":" + + boost::lexical_cast(slice.GetFrame())); + + LOG(WARNING) << "Layer ready: " << sliceKeyId; + + // remove the slice from the preloading slices now that it has been fully loaded and it is referenced in the cache + if (preloadingInstances_.find(sliceKeyId) != preloadingInstances_.end()) + { + preloadingInstances_.erase(sliceKeyId); + } + + // re-emit original Layer message to observers + BroadcastMessage(message); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/SmartLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/SmartLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once +#include + +#include "Layers/DicomSeriesVolumeSlicer.h" +#include "../Messages/IObservable.h" +#include "Toolbox/OrthancApiClient.h" + +namespace Deprecated +{ + class SliceViewerWidget; + + class SmartLoader : public OrthancStone::IObservable, public OrthancStone::ObserverBase + { + class CachedSlice; + + protected: + typedef std::map > CachedSlices; + CachedSlices cachedSlices_; + + typedef std::map > PreloadingInstances; + PreloadingInstances preloadingInstances_; + + SliceImageQuality imageQuality_; + boost::shared_ptr orthancApiClient_; + + public: + SmartLoader(boost::shared_ptr orthancApiClient); // TODO: add maxPreloadStorageSizeInBytes + +// void PreloadStudy(const std::string studyId); +// void PreloadSeries(const std::string seriesId); + void PreloadSlice(const std::string instanceId, unsigned int frame); + + void SetImageQuality(SliceImageQuality imageQuality) { imageQuality_ = imageQuality; } + + void SetFrameInWidget(SliceViewerWidget& sliceViewer, size_t layerIndex, const std::string& instanceId, unsigned int frame); + + void GetFirstInstanceIdForSeries(std::string& output, const std::string& seriesId); + + private: + void OnLayerGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message); + void OnFrameReady(const DicomSeriesVolumeSlicer::FrameReadyMessage& message); + void OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message); + + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/BaseWebService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/BaseWebService.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,178 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "BaseWebService.h" + +#include "../../Messages/IObservable.h" +#include "../../../Platforms/Generic/IOracleCommand.h" + +#include + +#include +#include +#include + +namespace Deprecated +{ + + + class BaseWebService::BaseWebServicePayload : public Orthanc::IDynamicObject + { + private: + std::unique_ptr< MessageHandler > userSuccessHandler_; + std::unique_ptr< MessageHandler > userFailureHandler_; + std::unique_ptr< Orthanc::IDynamicObject> userPayload_; + + public: + BaseWebServicePayload(MessageHandler* userSuccessHandler, + MessageHandler* userFailureHandler, + Orthanc::IDynamicObject* userPayload) : + userSuccessHandler_(userSuccessHandler), + userFailureHandler_(userFailureHandler), + userPayload_(userPayload) + { + } + + void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const + { + if (userSuccessHandler_.get() != NULL) + { + // recreate a success message with the user payload + IWebService::HttpRequestSuccessMessage successMessage(message.GetUri(), + message.GetAnswer(), + message.GetAnswerSize(), + message.GetAnswerHttpHeaders(), + userPayload_.get()); + userSuccessHandler_->Apply(successMessage); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const + { + if (userFailureHandler_.get() != NULL) + { + // recreate a failure message with the user payload + IWebService::HttpRequestErrorMessage failureMessage(message.GetUri(), + message.GetHttpStatus(), + userPayload_.get()); + + userFailureHandler_->Apply(failureMessage); + } + } + + }; + + + void BaseWebService::GetAsync(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback, + unsigned int timeoutInSeconds) + { + if (!cacheEnabled_ || cache_.find(uri) == cache_.end()) + { + GetAsyncInternal(uri, headers, + new BaseWebService::BaseWebServicePayload(successCallback, failureCallback, payload), // ownership is transfered + new DeprecatedCallable + (GetSharedObserver(), &BaseWebService::CacheAndNotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &BaseWebService::NotifyHttpError), + timeoutInSeconds); + } + else + { + // put the uri on top of the most recently accessed list + std::deque::iterator it = std::find(orderedCacheKeys_.begin(), orderedCacheKeys_.end(), uri); + if (it != orderedCacheKeys_.end()) + { + std::string uri = *it; + orderedCacheKeys_.erase(it); + orderedCacheKeys_.push_front(uri); + } + + // create a command and "post" it to the Oracle so it is executed and commited "later" + NotifyHttpSuccessLater(cache_[uri], payload, successCallback); + } + + } + + + + void BaseWebService::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) + { + if (message.HasPayload()) + { + dynamic_cast(message.GetPayload()).HandleSuccess(message); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + void BaseWebService::CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) + { + if (cacheEnabled_) + { + while (cacheCurrentSize_ + message.GetAnswerSize() > cacheMaxSize_ && orderedCacheKeys_.size() > 0) + { + VLOG(1) << "BaseWebService: clearing cache: " << cacheCurrentSize_ << "/" << cacheMaxSize_ << "(" << message.GetAnswerSize() << ")"; + const std::string& oldestUri = orderedCacheKeys_.back(); + HttpCache::iterator it = cache_.find(oldestUri); + if (it != cache_.end()) + { + cacheCurrentSize_ -= it->second->GetAnswerSize(); + cache_.erase(it); + } + orderedCacheKeys_.pop_back(); + + } + + boost::shared_ptr cachedMessage(new CachedHttpRequestSuccessMessage(message)); + cache_[message.GetUri()] = cachedMessage; + orderedCacheKeys_.push_front(message.GetUri()); + cacheCurrentSize_ += message.GetAnswerSize(); + } + + NotifyHttpSuccess(message); + } + + void BaseWebService::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) + { + if (message.HasPayload()) + { + dynamic_cast(message.GetPayload()).HandleFailure(message); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/BaseWebService.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/BaseWebService.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IWebService.h" +#include "../../Messages/ObserverBase.h" + +#include +#include +#include + +namespace Deprecated +{ + // This is an intermediate of IWebService that implements some caching on + // the HTTP GET requests + class BaseWebService : public IWebService, public OrthancStone::ObserverBase + { + public: + class CachedHttpRequestSuccessMessage + { + protected: + std::string uri_; + void* answer_; + size_t answerSize_; + IWebService::HttpHeaders answerHeaders_; + + public: + CachedHttpRequestSuccessMessage(const IWebService::HttpRequestSuccessMessage& message) : + uri_(message.GetUri()), + answerSize_(message.GetAnswerSize()), + answerHeaders_(message.GetAnswerHttpHeaders()) + { + answer_ = malloc(answerSize_); + memcpy(answer_, message.GetAnswer(), answerSize_); + } + + ~CachedHttpRequestSuccessMessage() + { + free(answer_); + } + + const std::string& GetUri() const + { + return uri_; + } + + const void* GetAnswer() const + { + return answer_; + } + + size_t GetAnswerSize() const + { + return answerSize_; + } + + const IWebService::HttpHeaders& GetAnswerHttpHeaders() const + { + return answerHeaders_; + } + + }; + protected: + class BaseWebServicePayload; + + bool cacheEnabled_; + size_t cacheCurrentSize_; + size_t cacheMaxSize_; + + typedef std::map > HttpCache; + HttpCache cache_; + std::deque orderedCacheKeys_; + + public: + BaseWebService() : + cacheEnabled_(false), + cacheCurrentSize_(0), + cacheMaxSize_(100*1024*1024) + { + } + + virtual ~BaseWebService() + { + } + + virtual void EnableCache(bool enable) + { + cacheEnabled_ = enable; + } + + virtual void GetAsync(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60); + + protected: + virtual void GetAsyncInternal(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60) = 0; + + virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, + Orthanc::IDynamicObject* payload, // takes ownership + MessageHandler* successCallback) = 0; + + private: + void NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); + + void NotifyHttpError(const IWebService::HttpRequestErrorMessage& message); + + void CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/DicomFrameConverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/DicomFrameConverter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,282 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomFrameConverter.h" + +#include "../../Toolbox/LinearAlgebra.h" + +#include +#include +#include +#include + +namespace Deprecated +{ + static const Orthanc::DicomTag IMAGE_TAGS[] = + { + Orthanc::DICOM_TAG_BITS_STORED, + Orthanc::DICOM_TAG_DOSE_GRID_SCALING, + Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, + Orthanc::DICOM_TAG_PIXEL_REPRESENTATION, + Orthanc::DICOM_TAG_RESCALE_INTERCEPT, + Orthanc::DICOM_TAG_RESCALE_SLOPE, + Orthanc::DICOM_TAG_WINDOW_CENTER, + Orthanc::DICOM_TAG_WINDOW_WIDTH + }; + + + void DicomFrameConverter::SetDefaultParameters() + { + isSigned_ = true; + isColor_ = false; + hasRescale_ = false; + rescaleIntercept_ = 0; + rescaleSlope_ = 1; + hasDefaultWindow_ = false; + defaultWindowCenter_ = 128; + defaultWindowWidth_ = 256; + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; + } + + + void DicomFrameConverter::ReadParameters(const Orthanc::DicomMap& dicom) + { + SetDefaultParameters(); + + OrthancStone::Vector c, w; + if (OrthancStone::LinearAlgebra::ParseVector(c, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && + OrthancStone::LinearAlgebra::ParseVector(w, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH) && + c.size() > 0 && + w.size() > 0) + { + hasDefaultWindow_ = true; + defaultWindowCenter_ = static_cast(c[0]); + defaultWindowWidth_ = static_cast(w[0]); + } + + int32_t tmp; + if (!dicom.ParseInteger32(tmp, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION)) + { + // Type 1 tag, must be present + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + isSigned_ = (tmp == 1); + + double doseGridScaling; + bool isRTDose = false; + + if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && + dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) + { + hasRescale_ = true; + } + else if (dicom.ParseDouble(doseGridScaling, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) + { + // This is for RT-DOSE + hasRescale_ = true; + isRTDose = true; + rescaleIntercept_ = 0; + rescaleSlope_ = doseGridScaling; + + if (!dicom.ParseInteger32(tmp, Orthanc::DICOM_TAG_BITS_STORED)) + { + // Type 1 tag, must be present + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + switch (tmp) + { + case 16: + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; + break; + + case 32: + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale32; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + std::string photometric; + if (dicom.LookupStringValue(photometric, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, false)) + { + photometric = Orthanc::Toolbox::StripSpaces(photometric); + } + else + { + // Type 1 tag, must be present + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + photometric_ = Orthanc::StringToPhotometricInterpretation(photometric.c_str()); + + isColor_ = (photometric != "MONOCHROME1" && + photometric != "MONOCHROME2"); + + // TODO Add more checks, e.g. on the number of bytes per value + // (cf. DicomImageInformation.h in Orthanc) + + if (!isRTDose) + { + if (isColor_) + { + expectedPixelFormat_ = Orthanc::PixelFormat_RGB24; + } + else if (isSigned_) + { + expectedPixelFormat_ = Orthanc::PixelFormat_SignedGrayscale16; + } + else + { + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; + } + } + } + + + void DicomFrameConverter::ReadParameters(const OrthancPlugins::IDicomDataset& dicom) + { + Orthanc::DicomMap converted; + + for (size_t i = 0; i < sizeof(IMAGE_TAGS) / sizeof(Orthanc::DicomTag); i++) + { + OrthancPlugins::DicomTag tag(IMAGE_TAGS[i].GetGroup(), IMAGE_TAGS[i].GetElement()); + + std::string value; + if (dicom.GetStringValue(value, tag)) + { + converted.SetValue(IMAGE_TAGS[i], value, false); + } + } + + ReadParameters(converted); + } + + + void DicomFrameConverter::ConvertFrameInplace(std::unique_ptr& source) const + { + assert(sizeof(float) == 4); + + if (source.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (source->GetFormat() == GetExpectedPixelFormat() && + source->GetFormat() == Orthanc::PixelFormat_RGB24) + { + // No conversion has to be done, check out (*) + return; + } + else + { + source.reset(ConvertFrame(*source)); + } + } + + + Orthanc::ImageAccessor* DicomFrameConverter::ConvertFrame(const Orthanc::ImageAccessor& source) const + { + assert(sizeof(float) == 4); + + Orthanc::PixelFormat sourceFormat = source.GetFormat(); + + if (sourceFormat != GetExpectedPixelFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (sourceFormat == Orthanc::PixelFormat_RGB24) + { + // This is the case of a color image. No conversion has to be done (*) + std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_RGB24, + source.GetWidth(), + source.GetHeight(), + false)); + Orthanc::ImageProcessing::Copy(*converted, source); + return converted.release(); + } + else + { + assert(sourceFormat == Orthanc::PixelFormat_Grayscale16 || + sourceFormat == Orthanc::PixelFormat_Grayscale32 || + sourceFormat == Orthanc::PixelFormat_SignedGrayscale16); + + // This is the case of a grayscale frame. Convert it to Float32. + std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, + source.GetWidth(), + source.GetHeight(), + false)); + Orthanc::ImageProcessing::Convert(*converted, source); + + // Correct rescale slope/intercept if need be + ApplyRescale(*converted, sourceFormat != Orthanc::PixelFormat_Grayscale32); + + return converted.release(); + } + } + + + void DicomFrameConverter::ApplyRescale(Orthanc::ImageAccessor& image, + bool useDouble) const + { + if (image.GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (hasRescale_) + { + for (unsigned int y = 0; y < image.GetHeight(); y++) + { + float* p = reinterpret_cast(image.GetRow(y)); + + if (useDouble) + { + // Slower, accurate implementation using double + for (unsigned int x = 0; x < image.GetWidth(); x++, p++) + { + double value = static_cast(*p); + *p = static_cast(value * rescaleSlope_ + rescaleIntercept_); + } + } + else + { + // Fast, approximate implementation using float + for (unsigned int x = 0; x < image.GetWidth(); x++, p++) + { + *p = (*p) * static_cast(rescaleSlope_) + static_cast(rescaleIntercept_); + } + } + } + } + } + + + double DicomFrameConverter::Apply(double x) const + { + return x * rescaleSlope_ + rescaleIntercept_; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/DicomFrameConverter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/DicomFrameConverter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,170 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include +#include +#include + +#include + +namespace Deprecated +{ + /** + * This class is responsible for converting the pixel format of a + * DICOM frame coming from Orthanc, into a pixel format that is + * suitable for Stone, given the relevant DICOM tags: + * - Color frames will stay in the RGB24 format. + * - Grayscale frames will be converted to the Float32 format. + **/ + class DicomFrameConverter + { + private: + bool isSigned_; + bool isColor_; + bool hasRescale_; + double rescaleIntercept_; + double rescaleSlope_; + bool hasDefaultWindow_; + double defaultWindowCenter_; + double defaultWindowWidth_; + + Orthanc::PhotometricInterpretation photometric_; + Orthanc::PixelFormat expectedPixelFormat_; + + void SetDefaultParameters(); + + public: + DicomFrameConverter() + { + SetDefaultParameters(); + } + + ~DicomFrameConverter() + { + // TODO: check whether this dtor is called or not + // An MSVC warning explains that declaring an + // std::unique_ptr with a forward-declared type + // prevents its dtor from being called. Does not + // seem an issue here (only POD types inside), but + // definitely something to keep an eye on. + (void)0; + } + + // AM: this is required to serialize/deserialize it + DicomFrameConverter( + bool isSigned, + bool isColor, + bool hasRescale, + double rescaleIntercept, + double rescaleSlope, + bool hasDefaultWindow, + double defaultWindowCenter, + double defaultWindowWidth, + Orthanc::PhotometricInterpretation photometric, + Orthanc::PixelFormat expectedPixelFormat + ): + isSigned_(isSigned), + isColor_(isColor), + hasRescale_(hasRescale), + rescaleIntercept_(rescaleIntercept), + rescaleSlope_(rescaleSlope), + hasDefaultWindow_(hasDefaultWindow), + defaultWindowCenter_(defaultWindowCenter), + defaultWindowWidth_(defaultWindowWidth), + photometric_(photometric), + expectedPixelFormat_(expectedPixelFormat) + {} + + void GetParameters(bool& isSigned, + bool& isColor, + bool& hasRescale, + double& rescaleIntercept, + double& rescaleSlope, + bool& hasDefaultWindow, + double& defaultWindowCenter, + double& defaultWindowWidth, + Orthanc::PhotometricInterpretation& photometric, + Orthanc::PixelFormat& expectedPixelFormat) const + { + isSigned = isSigned_; + isColor = isColor_; + hasRescale = hasRescale_; + rescaleIntercept = rescaleIntercept_; + rescaleSlope = rescaleSlope_; + hasDefaultWindow = hasDefaultWindow_; + defaultWindowCenter = defaultWindowCenter_; + defaultWindowWidth = defaultWindowWidth_; + photometric = photometric_; + expectedPixelFormat = expectedPixelFormat_; + } + + Orthanc::PixelFormat GetExpectedPixelFormat() const + { + return expectedPixelFormat_; + } + + Orthanc::PhotometricInterpretation GetPhotometricInterpretation() const + { + return photometric_; + } + + void ReadParameters(const Orthanc::DicomMap& dicom); + + void ReadParameters(const OrthancPlugins::IDicomDataset& dicom); + + bool HasDefaultWindow() const + { + return hasDefaultWindow_; + } + + double GetDefaultWindowCenter() const + { + return defaultWindowCenter_; + } + + double GetDefaultWindowWidth() const + { + return defaultWindowWidth_; + } + + double GetRescaleIntercept() const + { + return rescaleIntercept_; + } + + double GetRescaleSlope() const + { + return rescaleSlope_; + } + + void ConvertFrameInplace(std::unique_ptr& source) const; + + Orthanc::ImageAccessor* ConvertFrame(const Orthanc::ImageAccessor& source) const; + + void ApplyRescale(Orthanc::ImageAccessor& image, + bool useDouble) const; + + double Apply(double x) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/DownloadStack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/DownloadStack.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,196 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DownloadStack.h" + +#include + +#include + +namespace Deprecated +{ + bool DownloadStack::CheckInvariants() const + { + std::vector dequeued(nodes_.size(), true); + + int i = firstNode_; + while (i != NIL) + { + const Node& node = nodes_[i]; + + dequeued[i] = false; + + if (node.next_ != NIL && + nodes_[node.next_].prev_ != i) + { + return false; + } + + if (node.prev_ != NIL && + nodes_[node.prev_].next_ != i) + { + return false; + } + + i = nodes_[i].next_; + } + + for (size_t i = 0; i < nodes_.size(); i++) + { + if (nodes_[i].dequeued_ != dequeued[i]) + { + return false; + } + } + + return true; + } + + + DownloadStack::DownloadStack(unsigned int size) + { + nodes_.resize(size); + + if (size == 0) + { + firstNode_ = NIL; + } + else + { + for (size_t i = 0; i < size; i++) + { + nodes_[i].prev_ = static_cast(i - 1); + nodes_[i].next_ = static_cast(i + 1); + nodes_[i].dequeued_ = false; + } + + nodes_.front().prev_ = NIL; + nodes_.back().next_ = NIL; + firstNode_ = 0; + } + + assert(CheckInvariants()); + } + + + DownloadStack::~DownloadStack() + { + assert(CheckInvariants()); + } + + + bool DownloadStack::Pop(unsigned int& value) + { + assert(CheckInvariants()); + + if (firstNode_ == NIL) + { + for (size_t i = 0; i < nodes_.size(); i++) + { + assert(nodes_[i].dequeued_); + } + + return false; + } + else + { + assert(firstNode_ >= 0 && firstNode_ < static_cast(nodes_.size())); + value = firstNode_; + + Node& node = nodes_[firstNode_]; + assert(node.prev_ == NIL); + assert(!node.dequeued_); + + node.dequeued_ = true; + firstNode_ = node.next_; + + if (firstNode_ != NIL) + { + nodes_[firstNode_].prev_ = NIL; + } + + return true; + } + } + + + void DownloadStack::SetTopNodeInternal(unsigned int value) + { + assert(CheckInvariants()); + + Node& node = nodes_[value]; + + if (node.dequeued_) + { + // This node has already been processed by the download thread, nothing to do + return; + } + + // Remove the node from the list + if (node.prev_ == NIL) + { + assert(firstNode_ == static_cast(value)); + + // This is already the top node in the list, nothing to do + return; + } + + nodes_[node.prev_].next_ = node.next_; + + if (node.next_ != NIL) + { + nodes_[node.next_].prev_ = node.prev_; + } + + // Add back the node at the top of the list + assert(firstNode_ != NIL); + + Node& old = nodes_[firstNode_]; + assert(old.prev_ == NIL); + assert(!old.dequeued_); + node.prev_ = NIL; + node.next_ = firstNode_; + old.prev_ = value; + + firstNode_ = value; + } + + + void DownloadStack::SetTopNode(unsigned int value) + { + if (value >= nodes_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + SetTopNodeInternal(value); + } + + + void DownloadStack::SetTopNodePermissive(int value) + { + if (value >= 0 && + value < static_cast(nodes_.size())) + { + SetTopNodeInternal(value); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/DownloadStack.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/DownloadStack.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace Deprecated +{ + class DownloadStack : public boost::noncopyable + { + private: + static const int NIL = -1; + + // This is a doubly-linked list + struct Node + { + int next_; + int prev_; + bool dequeued_; + }; + + std::vector nodes_; + int firstNode_; + + bool CheckInvariants() const; + + void SetTopNodeInternal(unsigned int value); + + public: + DownloadStack(unsigned int size); + + ~DownloadStack(); + + bool Pop(unsigned int& value); + + void SetTopNode(unsigned int value); + + void SetTopNodePermissive(int value); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/IDelayedCallExecutor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/IDelayedCallExecutor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IWebService.h" +#include "../../Messages/IObserver.h" +#include "../../Messages/ICallable.h" + +#include +#include + +#include +#include + +namespace Deprecated +{ + // The IDelayedCall executes a callback after a delay (equivalent to timeout() function in javascript). + class IDelayedCallExecutor : public boost::noncopyable + { + public: + ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(__FILE__, __LINE__, TimeoutMessage); + + virtual ~IDelayedCallExecutor() + { + } + + virtual void Schedule(MessageHandler* callback, + unsigned int timeoutInMs = 1000) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ISeriesLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ISeriesLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,59 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ParallelSlices.h" + +#include +#include + +namespace Deprecated +{ + class ISeriesLoader : public boost::noncopyable + { + public: + virtual ~ISeriesLoader() + { + } + + virtual ParallelSlices& GetGeometry() = 0; + + virtual Orthanc::PixelFormat GetPixelFormat() = 0; + + virtual unsigned int GetWidth() = 0; + + virtual unsigned int GetHeight() = 0; + + virtual OrthancPlugins::IDicomDataset* DownloadDicom(size_t index) = 0; + + // This downloads the frame from Orthanc. The resulting pixel + // format must be Grayscale8, Grayscale16, SignedGrayscale16 or + // RGB24. Orthanc Stone assumes the conversion of the photometric + // interpretation is done by Orthanc. + virtual Orthanc::ImageAccessor* DownloadFrame(size_t index) = 0; + + virtual Orthanc::ImageAccessor* DownloadJpegFrame(size_t index, + unsigned int quality) = 0; + + virtual bool IsJpegAvailable() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/IWebService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/IWebService.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "IWebService.h" + +#include + + +namespace Deprecated +{ + const Orthanc::IDynamicObject& + IWebService::HttpRequestSuccessMessage::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Orthanc::IDynamicObject& + IWebService::HttpRequestErrorMessage::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/IWebService.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/IWebService.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,213 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Messages/IObserver.h" +#include "../../Messages/ICallable.h" + +#include +#include +#include + +#include +#include + +namespace Deprecated +{ + template + class MessageHandler : public OrthancStone::ICallable + { + }; + + + template + class DeprecatedCallable : public MessageHandler + { + private: + typedef void (TObserver::* MemberMethod) (const TMessage&); + + boost::weak_ptr observer_; + MemberMethod function_; + + public: + DeprecatedCallable(boost::shared_ptr observer, + MemberMethod function) : + observer_(observer), + function_(function) + { + } + + virtual void Apply(const OrthancStone::IMessage& message) + { + boost::shared_ptr lock(observer_); + if (lock) + { + TObserver& observer = dynamic_cast(*lock); + const TMessage& typedMessage = dynamic_cast(message); + (observer.*function_) (typedMessage); + } + } + + virtual const OrthancStone::MessageIdentifier& GetMessageIdentifier() + { + return TMessage::GetStaticIdentifier(); + } + + virtual boost::weak_ptr GetObserver() const + { + return observer_; + } + }; + + + // The IWebService performs HTTP requests. + // Since applications can run in native or WASM environment and, since + // in a WASM environment, the WebService is asynchronous, the IWebservice + // also implements an asynchronous interface: you must schedule a request + // and you'll be notified when the response/error is ready. + class IWebService : public boost::noncopyable + { + public: + typedef std::map HttpHeaders; + + class HttpRequestSuccessMessage : public OrthancStone::IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& uri_; + const void* answer_; + size_t answerSize_; + const HttpHeaders& answerHeaders_; + const Orthanc::IDynamicObject* payload_; + + public: + HttpRequestSuccessMessage(const std::string& uri, + const void* answer, + size_t answerSize, + const HttpHeaders& answerHeaders, + const Orthanc::IDynamicObject* payload) : + uri_(uri), + answer_(answer), + answerSize_(answerSize), + answerHeaders_(answerHeaders), + payload_(payload) + { + } + + const std::string& GetUri() const + { + return uri_; + } + + const void* GetAnswer() const + { + return answer_; + } + + size_t GetAnswerSize() const + { + return answerSize_; + } + + const HttpHeaders& GetAnswerHttpHeaders() const + { + return answerHeaders_; + } + + bool HasPayload() const + { + return payload_ != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + }; + + + class HttpRequestErrorMessage : public OrthancStone::IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& uri_; + const Orthanc::IDynamicObject* payload_; + Orthanc::HttpStatus httpStatus_; + + public: + HttpRequestErrorMessage(const std::string& uri, + Orthanc::HttpStatus httpStatus, + const Orthanc::IDynamicObject* payload) : + uri_(uri), + payload_(payload), + httpStatus_(httpStatus) + { + } + + const std::string& GetUri() const + { + return uri_; + } + + Orthanc::HttpStatus GetHttpStatus() const + { + return httpStatus_; + } + + bool HasPayload() const + { + return payload_ != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + }; + + + virtual ~IWebService() + { + } + + virtual void EnableCache(bool enable) = 0; + + virtual void GetAsync(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60) = 0; + + virtual void PostAsync(const std::string& uri, + const HttpHeaders& headers, + const std::string& body, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60) = 0; + + virtual void DeleteAsync(const std::string& uri, + const HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + unsigned int timeoutInSeconds = 60) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/MessagingToolbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/MessagingToolbox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,462 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MessagingToolbox.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef _MSC_VER +// 'Json::Reader': Use CharReader and CharReaderBuilder instead +#pragma warning(disable:4996) +#endif + +#include +#include + + +namespace Deprecated +{ + namespace MessagingToolbox + { + static bool ParseVersion(std::string& version, + unsigned int& major, + unsigned int& minor, + unsigned int& patch, + const Json::Value& info) + { + if (info.type() != Json::objectValue || + !info.isMember("Version") || + info["Version"].type() != Json::stringValue) + { + return false; + } + + version = info["Version"].asString(); + if (version == "mainline") + { + // Some arbitrary high values Orthanc versions will never reach ;) + major = 999; + minor = 999; + patch = 999; + return true; + } + + std::vector tokens; + Orthanc::Toolbox::TokenizeString(tokens, version, '.'); + + if (tokens.size() != 2 && + tokens.size() != 3) + { + return false; + } + + int a, b, c; + try + { + a = boost::lexical_cast(tokens[0]); + b = boost::lexical_cast(tokens[1]); + + if (tokens.size() == 3) + { + c = boost::lexical_cast(tokens[2]); + } + else + { + c = 0; + } + } + catch (boost::bad_lexical_cast&) + { + return false; + } + + if (a < 0 || + b < 0 || + c < 0) + { + return false; + } + else + { + major = static_cast(a); + minor = static_cast(b); + patch = static_cast(c); + return true; + } + } + + + bool ParseJson(Json::Value& target, + const void* content, + size_t size) + { + Json::Reader reader; + return reader.parse(reinterpret_cast(content), + reinterpret_cast(content) + size, + target); + } + + void JsonToString(std::string& target, + const Json::Value& source) + { + Json::FastWriter writer; + target = writer.write(source); + } + + static void ParseJsonException(Json::Value& target, + const std::string& source) + { + Json::Reader reader; + if (!reader.parse(source, target)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void RestApiGet(Json::Value& target, + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& uri) + { + std::string tmp; + orthanc.RestApiGet(tmp, uri); + ParseJsonException(target, tmp); + } + + + void RestApiPost(Json::Value& target, + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body) + { + std::string tmp; + orthanc.RestApiPost(tmp, uri, body); + ParseJsonException(target, tmp); + } + + + bool HasWebViewerInstalled(OrthancPlugins::IOrthancConnection& orthanc) + { + try + { + Json::Value json; + RestApiGet(json, orthanc, "/plugins/web-viewer"); + return json.type() == Json::objectValue; + } + catch (Orthanc::OrthancException&) + { + return false; + } + } + + + bool CheckOrthancVersion(OrthancPlugins::IOrthancConnection& orthanc) + { + Json::Value json; + std::string version; + unsigned int major, minor, patch; + + try + { + RestApiGet(json, orthanc, "/system"); + } + catch (Orthanc::OrthancException&) + { + LOG(ERROR) << "Cannot connect to your Orthanc server"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + if (!ParseVersion(version, major, minor, patch, json)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + LOG(WARNING) << "Version of the Orthanc core (must be above 1.3.1): " << version; + + // Stone is only compatible with Orthanc >= 1.3.1 + if (major < 1 || + (major == 1 && minor < 3) || + (major == 1 && minor == 3 && patch < 1)) + { + return false; + } + + try + { + RestApiGet(json, orthanc, "/plugins/web-viewer"); + } + catch (Orthanc::OrthancException&) + { + // The Web viewer is not installed, this is OK + LOG(WARNING) << "The Web viewer plugin is not installed, progressive download is disabled"; + return true; + } + + if (!ParseVersion(version, major, minor, patch, json)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + LOG(WARNING) << "Version of the Web viewer plugin (must be above 2.2): " << version; + + return (major >= 3 || + (major == 2 && minor >= 2)); + } + + + Orthanc::ImageAccessor* DecodeFrame(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instance, + unsigned int frame, + Orthanc::PixelFormat targetFormat) + { + std::string uri = ("instances/" + instance + "/frames/" + + boost::lexical_cast(frame)); + + std::string compressed; + + switch (targetFormat) + { + case Orthanc::PixelFormat_RGB24: + orthanc.RestApiGet(compressed, uri + "/preview"); + break; + + case Orthanc::PixelFormat_Grayscale16: + orthanc.RestApiGet(compressed, uri + "/image-uint16"); + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + orthanc.RestApiGet(compressed, uri + "/image-int16"); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::unique_ptr result(new Orthanc::PngReader); + result->ReadFromMemory(compressed); + + if (targetFormat == Orthanc::PixelFormat_SignedGrayscale16) + { + if (result->GetFormat() == Orthanc::PixelFormat_Grayscale16) + { + result->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + + return result.release(); + } + + + Orthanc::ImageAccessor* DecodeJpegFrame(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instance, + unsigned int frame, + unsigned int quality, + Orthanc::PixelFormat targetFormat) + { + if (quality <= 0 || + quality > 100) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // This requires the official Web viewer plugin to be installed! + std::string uri = ("web-viewer/instances/jpeg" + + boost::lexical_cast(quality) + + "-" + instance + "_" + + boost::lexical_cast(frame)); + + Json::Value encoded; + RestApiGet(encoded, orthanc, uri); + + if (encoded.type() != Json::objectValue || + !encoded.isMember("Orthanc") || + encoded["Orthanc"].type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + Json::Value& info = encoded["Orthanc"]; + if (!info.isMember("PixelData") || + !info.isMember("Stretched") || + !info.isMember("Compression") || + info["Compression"].type() != Json::stringValue || + info["PixelData"].type() != Json::stringValue || + info["Stretched"].type() != Json::booleanValue || + info["Compression"].asString() != "Jpeg") + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + bool isSigned = false; + bool isStretched = info["Stretched"].asBool(); + + if (info.isMember("IsSigned")) + { + if (info["IsSigned"].type() != Json::booleanValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + else + { + isSigned = info["IsSigned"].asBool(); + } + } + + std::string jpeg; + Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); + + std::unique_ptr reader(new Orthanc::JpegReader); + reader->ReadFromMemory(jpeg); + + if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image + { + if (targetFormat != Orthanc::PixelFormat_RGB24) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + if (isSigned || isStretched) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + else + { + return reader.release(); + } + } + + if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + if (!isStretched) + { + if (targetFormat != reader->GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + return reader.release(); + } + + int32_t stretchLow = 0; + int32_t stretchHigh = 0; + + if (!info.isMember("StretchLow") || + !info.isMember("StretchHigh") || + info["StretchLow"].type() != Json::intValue || + info["StretchHigh"].type() != Json::intValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + stretchLow = info["StretchLow"].asInt(); + stretchHigh = info["StretchHigh"].asInt(); + + if (stretchLow < -32768 || + stretchHigh > 65535 || + (stretchLow < 0 && stretchHigh > 32767)) + { + // This range cannot be represented with a uint16_t or an int16_t + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + // Decode a grayscale JPEG 8bpp image coming from the Web viewer + std::unique_ptr image + (new Orthanc::Image(targetFormat, reader->GetWidth(), reader->GetHeight(), false)); + + float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; + float offset = static_cast(stretchLow) / scaling; + + Orthanc::ImageProcessing::Convert(*image, *reader); + Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); + +#if 0 + /*info.removeMember("PixelData"); + std::cout << info.toStyledString();*/ + + int64_t a, b; + Orthanc::ImageProcessing::GetMinMaxValue(a, b, *image); + std::cout << stretchLow << "->" << stretchHigh << " = " << a << "->" << b << std::endl; +#endif + + return image.release(); + } + + + static void AddTag(Orthanc::DicomMap& target, + const OrthancPlugins::IDicomDataset& source, + const Orthanc::DicomTag& tag) + { + OrthancPlugins::DicomTag key(tag.GetGroup(), tag.GetElement()); + + std::string value; + if (source.GetStringValue(value, key)) + { + target.SetValue(tag, value, false); + } + } + + + void ConvertDataset(Orthanc::DicomMap& target, + const OrthancPlugins::IDicomDataset& source) + { + target.Clear(); + + AddTag(target, source, Orthanc::DICOM_TAG_BITS_ALLOCATED); + AddTag(target, source, Orthanc::DICOM_TAG_BITS_STORED); + AddTag(target, source, Orthanc::DICOM_TAG_COLUMNS); + AddTag(target, source, Orthanc::DICOM_TAG_DOSE_GRID_SCALING); + AddTag(target, source, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER); + AddTag(target, source, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR); + AddTag(target, source, Orthanc::DICOM_TAG_HIGH_BIT); + AddTag(target, source, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT); + AddTag(target, source, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT); + AddTag(target, source, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES); + AddTag(target, source, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION); + AddTag(target, source, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION); + AddTag(target, source, Orthanc::DICOM_TAG_PIXEL_SPACING); + AddTag(target, source, Orthanc::DICOM_TAG_PLANAR_CONFIGURATION); + AddTag(target, source, Orthanc::DICOM_TAG_RESCALE_INTERCEPT); + AddTag(target, source, Orthanc::DICOM_TAG_RESCALE_SLOPE); + AddTag(target, source, Orthanc::DICOM_TAG_ROWS); + AddTag(target, source, Orthanc::DICOM_TAG_SAMPLES_PER_PIXEL); + AddTag(target, source, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); + AddTag(target, source, Orthanc::DICOM_TAG_SLICE_THICKNESS); + AddTag(target, source, Orthanc::DICOM_TAG_SOP_CLASS_UID); + AddTag(target, source, Orthanc::DICOM_TAG_SOP_INSTANCE_UID); + AddTag(target, source, Orthanc::DICOM_TAG_WINDOW_CENTER); + AddTag(target, source, Orthanc::DICOM_TAG_WINDOW_WIDTH); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/MessagingToolbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/MessagingToolbox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,75 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../StoneEnumerations.h" + +#include +#include +#include +#include + +#include + +namespace Deprecated +{ + namespace MessagingToolbox + { + bool ParseJson(Json::Value& target, + const void* content, + size_t size); + + void JsonToString(std::string& target, + const Json::Value& source); + + + void RestApiGet(Json::Value& target, + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& uri); + + void RestApiPost(Json::Value& target, + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body); + + bool HasWebViewerInstalled(OrthancPlugins::IOrthancConnection& orthanc); + + bool CheckOrthancVersion(OrthancPlugins::IOrthancConnection& orthanc); + + // This downloads the image from Orthanc and keeps its pixel + // format unchanged (will be either Grayscale8, Grayscale16, + // SignedGrayscale16, or RGB24) + Orthanc::ImageAccessor* DecodeFrame(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instance, + unsigned int frame, + Orthanc::PixelFormat targetFormat); + + Orthanc::ImageAccessor* DecodeJpegFrame(OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instance, + unsigned int frame, + unsigned int quality, + Orthanc::PixelFormat targetFormat); + + void ConvertDataset(Orthanc::DicomMap& target, + const OrthancPlugins::IDicomDataset& source); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/OrthancApiClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/OrthancApiClient.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,334 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "OrthancApiClient.h" + +#include "../Toolbox/MessagingToolbox.h" + +#include + +namespace Deprecated +{ + const Orthanc::IDynamicObject& OrthancApiClient::JsonResponseReadyMessage::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Orthanc::IDynamicObject& OrthancApiClient::BinaryResponseReadyMessage::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Orthanc::IDynamicObject& OrthancApiClient::EmptyResponseReadyMessage::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + class OrthancApiClient::WebServicePayload : public Orthanc::IDynamicObject + { + private: + std::unique_ptr< MessageHandler > emptyHandler_; + std::unique_ptr< MessageHandler > jsonHandler_; + std::unique_ptr< MessageHandler > binaryHandler_; + std::unique_ptr< MessageHandler > failureHandler_; + std::unique_ptr< Orthanc::IDynamicObject > userPayload_; + + void NotifyConversionError(const IWebService::HttpRequestSuccessMessage& message) const + { + if (failureHandler_.get() != NULL) + { + failureHandler_->Apply(IWebService::HttpRequestErrorMessage + (message.GetUri(), Orthanc::HttpStatus_None, userPayload_.get())); + } + } + + public: + WebServicePayload(MessageHandler* handler, + MessageHandler* failureHandler, + Orthanc::IDynamicObject* userPayload) : + emptyHandler_(handler), + failureHandler_(failureHandler), + userPayload_(userPayload) + + { + if (handler == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + WebServicePayload(MessageHandler* handler, + MessageHandler* failureHandler, + Orthanc::IDynamicObject* userPayload) : + binaryHandler_(handler), + failureHandler_(failureHandler), + userPayload_(userPayload) + { + if (handler == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + WebServicePayload(MessageHandler* handler, + MessageHandler* failureHandler, + Orthanc::IDynamicObject* userPayload) : + jsonHandler_(handler), + failureHandler_(failureHandler), + userPayload_(userPayload) + { + if (handler == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const + { + if (emptyHandler_.get() != NULL) + { + emptyHandler_->Apply(OrthancApiClient::EmptyResponseReadyMessage + (message.GetUri(), userPayload_.get())); + } + else if (binaryHandler_.get() != NULL) + { + binaryHandler_->Apply(OrthancApiClient::BinaryResponseReadyMessage + (message.GetUri(), message.GetAnswer(), + message.GetAnswerSize(), userPayload_.get())); + } + else if (jsonHandler_.get() != NULL) + { + Json::Value response; + if (MessagingToolbox::ParseJson(response, message.GetAnswer(), message.GetAnswerSize())) + { + jsonHandler_->Apply(OrthancApiClient::JsonResponseReadyMessage + (message.GetUri(), response, userPayload_.get())); + } + else + { + NotifyConversionError(message); + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const + { + if (failureHandler_.get() != NULL) + { + failureHandler_->Apply(IWebService::HttpRequestErrorMessage + (message.GetUri(), message.GetHttpStatus(), userPayload_.get())); + } + } + }; + + + OrthancApiClient::OrthancApiClient(IWebService& web, + const std::string& baseUrl) : + web_(web), + baseUrl_(baseUrl) + { + } + + + void OrthancApiClient::GetJsonAsync( + const std::string& uri, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + IWebService::HttpHeaders emptyHeaders; + web_.GetAsync(baseUrl_ + uri, + emptyHeaders, + new WebServicePayload(successCallback, failureCallback, payload), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); + } + + + void OrthancApiClient::GetBinaryAsync( + const std::string& uri, + const std::string& contentType, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + IWebService::HttpHeaders headers; + headers["Accept"] = contentType; + GetBinaryAsync(uri, headers, successCallback, failureCallback, payload); + } + + void OrthancApiClient::GetBinaryAsync( + const std::string& uri, + const IWebService::HttpHeaders& headers, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + // printf("GET [%s] [%s]\n", baseUrl_.c_str(), uri.c_str()); + + web_.GetAsync(baseUrl_ + uri, headers, + new WebServicePayload(successCallback, failureCallback, payload), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); + } + + + void OrthancApiClient::PostBinaryAsyncExpectJson( + const std::string& uri, + const std::string& body, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, + new WebServicePayload(successCallback, failureCallback, payload), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); + + } + + void OrthancApiClient::PostBinaryAsync( + const std::string& uri, + const std::string& body) + { + web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, NULL, NULL, NULL); + } + + void OrthancApiClient::PostBinaryAsync( + const std::string& uri, + const std::string& body, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload /* takes ownership */) + { + web_.PostAsync(baseUrl_ + uri, IWebService::HttpHeaders(), body, + new WebServicePayload(successCallback, failureCallback, payload), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); + } + + void OrthancApiClient::PostJsonAsyncExpectJson( + const std::string& uri, + const Json::Value& data, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + std::string body; + MessagingToolbox::JsonToString(body, data); + return PostBinaryAsyncExpectJson(uri, body, successCallback, failureCallback, payload); + } + + void OrthancApiClient::PostJsonAsync( + const std::string& uri, + const Json::Value& data) + { + std::string body; + MessagingToolbox::JsonToString(body, data); + return PostBinaryAsync(uri, body); + } + + void OrthancApiClient::PostJsonAsync( + const std::string& uri, + const Json::Value& data, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload /* takes ownership */) + { + std::string body; + MessagingToolbox::JsonToString(body, data); + return PostBinaryAsync(uri, body, successCallback, failureCallback, payload); + } + + void OrthancApiClient::DeleteAsync( + const std::string& uri, + MessageHandler* successCallback, + MessageHandler* failureCallback, + Orthanc::IDynamicObject* payload) + { + web_.DeleteAsync(baseUrl_ + uri, IWebService::HttpHeaders(), + new WebServicePayload(successCallback, failureCallback, payload), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpSuccess), + new DeprecatedCallable + (GetSharedObserver(), &OrthancApiClient::NotifyHttpError)); + } + + + void OrthancApiClient::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) + { + if (message.HasPayload()) + { + dynamic_cast(message.GetPayload()).HandleSuccess(message); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + void OrthancApiClient::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) + { + if (message.HasPayload()) + { + dynamic_cast(message.GetPayload()).HandleFailure(message); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/OrthancApiClient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/OrthancApiClient.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,252 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +#include "IWebService.h" +#include "../../Messages/ObserverBase.h" + +namespace Deprecated +{ + enum SliceImageQuality + { + SliceImageQuality_FullPng, // smaller to transmit but longer to generate on Orthanc side (better choice when on low bandwidth) + SliceImageQuality_FullPam, // bigger to transmit but faster to generate on Orthanc side (better choice when on localhost or LAN) + SliceImageQuality_Jpeg50, + SliceImageQuality_Jpeg90, + SliceImageQuality_Jpeg95, + + SliceImageQuality_InternalRaw // downloads the raw pixels data as they are stored in the DICOM file (internal use only) + }; + + class OrthancApiClient : + public OrthancStone::IObservable, + public OrthancStone::ObserverBase + { + public: + class JsonResponseReadyMessage : public OrthancStone::IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& uri_; + const Json::Value& json_; + const Orthanc::IDynamicObject* payload_; + + public: + JsonResponseReadyMessage(const std::string& uri, + const Json::Value& json, + const Orthanc::IDynamicObject* payload) : + uri_(uri), + json_(json), + payload_(payload) + { + } + + const std::string& GetUri() const + { + return uri_; + } + + const Json::Value& GetJson() const + { + return json_; + } + + bool HasPayload() const + { + return payload_ != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + }; + + + class BinaryResponseReadyMessage : public OrthancStone::IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& uri_; + const void* answer_; + size_t answerSize_; + const Orthanc::IDynamicObject* payload_; + + public: + BinaryResponseReadyMessage(const std::string& uri, + const void* answer, + size_t answerSize, + const Orthanc::IDynamicObject* payload) : + uri_(uri), + answer_(answer), + answerSize_(answerSize), + payload_(payload) + { + } + + const std::string& GetUri() const + { + return uri_; + } + + const void* GetAnswer() const + { + return answer_; + } + + size_t GetAnswerSize() const + { + return answerSize_; + } + + bool HasPayload() const + { + return payload_ != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + }; + + + class EmptyResponseReadyMessage : public OrthancStone::IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& uri_; + const Orthanc::IDynamicObject* payload_; + + public: + EmptyResponseReadyMessage(const std::string& uri, + const Orthanc::IDynamicObject* payload) : + uri_(uri), + payload_(payload) + { + } + + const std::string& GetUri() const + { + return uri_; + } + + bool HasPayload() const + { + return payload_ != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + }; + + + + private: + class WebServicePayload; + + protected: + IWebService& web_; + std::string baseUrl_; + + public: + OrthancApiClient(IWebService& web, + const std::string& baseUrl); + + virtual ~OrthancApiClient() + { + } + + const std::string& GetBaseUrl() const {return baseUrl_;} + + // schedule a GET request expecting a JSON response. + void GetJsonAsync(const std::string& uri, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a GET request expecting a binary response. + void GetBinaryAsync(const std::string& uri, + const std::string& contentType, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a GET request expecting a binary response. + void GetBinaryAsync(const std::string& uri, + const IWebService::HttpHeaders& headers, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a POST request expecting a JSON response. + void PostBinaryAsyncExpectJson(const std::string& uri, + const std::string& body, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a POST request expecting a JSON response. + void PostJsonAsyncExpectJson(const std::string& uri, + const Json::Value& data, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a POST request and don't mind the response. + void PostJsonAsync(const std::string& uri, + const Json::Value& data); + + // schedule a POST request and don't expect any response. + void PostJsonAsync(const std::string& uri, + const Json::Value& data, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + + // schedule a POST request and don't mind the response. + void PostBinaryAsync(const std::string& uri, + const std::string& body); + + // schedule a POST request and don't expect any response. + void PostBinaryAsync(const std::string& uri, + const std::string& body, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + // schedule a DELETE request expecting an empty response. + void DeleteAsync(const std::string& uri, + MessageHandler* successCallback, + MessageHandler* failureCallback = NULL, + Orthanc::IDynamicObject* payload = NULL /* takes ownership */); + + void NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message); + + void NotifyHttpError(const IWebService::HttpRequestErrorMessage& message); + + private: + void HandleFromCache(const std::string& uri, + const IWebService::HttpHeaders& headers, + Orthanc::IDynamicObject* payload /* takes ownership */); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/OrthancSlicesLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/OrthancSlicesLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,901 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrthancSlicesLoader.h" + +#include "../Toolbox/MessagingToolbox.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + + +/** + * TODO This is a SLOW implementation of base64 decoding, because + * "Orthanc::Toolbox::DecodeBase64()" does not work properly with + * WASM. UNDERSTAND WHY. + * https://stackoverflow.com/a/34571089/881731 + **/ +static std::string base64_decode(const std::string &in) +{ + std::string out; + + std::vector T(256,-1); + for (int i=0; i<64; i++) T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; + + int val=0, valb=-8; + for (size_t i = 0; i < in.size(); i++) { + unsigned char c = in[i]; + if (T[c] == -1) break; + val = (val<<6) + T[c]; + valb += 6; + if (valb>=0) { + out.push_back(char((val>>valb)&0xFF)); + valb-=8; + } + } + return out; +} + + + +namespace Deprecated +{ + class OrthancSlicesLoader::Operation : public Orthanc::IDynamicObject + { + private: + Mode mode_; + unsigned int frame_; + unsigned int sliceIndex_; + const Slice* slice_; + std::string instanceId_; + SliceImageQuality quality_; + + Operation(Mode mode) : + mode_(mode) + { + } + + public: + Mode GetMode() const + { + return mode_; + } + + SliceImageQuality GetQuality() const + { + assert(mode_ == Mode_LoadImage || + mode_ == Mode_LoadRawImage); + return quality_; + } + + unsigned int GetSliceIndex() const + { + assert(mode_ == Mode_LoadImage || + mode_ == Mode_LoadRawImage); + return sliceIndex_; + } + + const Slice& GetSlice() const + { + assert(mode_ == Mode_LoadImage || + mode_ == Mode_LoadRawImage); + assert(slice_ != NULL); + return *slice_; + } + + unsigned int GetFrame() const + { + assert(mode_ == Mode_FrameGeometry); + return frame_; + } + + const std::string& GetInstanceId() const + { + assert(mode_ == Mode_FrameGeometry || + mode_ == Mode_InstanceGeometry); + return instanceId_; + } + + static Operation* DownloadInstanceGeometry(const std::string& instanceId) + { + std::unique_ptr operation(new Operation(Mode_InstanceGeometry)); + operation->instanceId_ = instanceId; + return operation.release(); + } + + static Operation* DownloadFrameGeometry(const std::string& instanceId, + unsigned int frame) + { + std::unique_ptr operation(new Operation(Mode_FrameGeometry)); + operation->instanceId_ = instanceId; + operation->frame_ = frame; + return operation.release(); + } + + static Operation* DownloadSliceImage(unsigned int sliceIndex, + const Slice& slice, + SliceImageQuality quality) + { + std::unique_ptr tmp(new Operation(Mode_LoadImage)); + tmp->sliceIndex_ = sliceIndex; + tmp->slice_ = &slice; + tmp->quality_ = quality; + return tmp.release(); + } + + static Operation* DownloadSliceRawImage(unsigned int sliceIndex, + const Slice& slice) + { + std::unique_ptr tmp(new Operation(Mode_LoadRawImage)); + tmp->sliceIndex_ = sliceIndex; + tmp->slice_ = &slice; + tmp->quality_ = SliceImageQuality_InternalRaw; + return tmp.release(); + } + + static Operation* DownloadDicomFile(const Slice& slice) + { + std::unique_ptr tmp(new Operation(Mode_LoadDicomFile)); + tmp->slice_ = &slice; + return tmp.release(); + } + + }; + + void OrthancSlicesLoader::NotifySliceImageSuccess(const Operation& operation, + const Orthanc::ImageAccessor& image) + { + OrthancSlicesLoader::SliceImageReadyMessage msg + (*this, operation.GetSliceIndex(), operation.GetSlice(), image, operation.GetQuality()); + BroadcastMessage(msg); + } + + + void OrthancSlicesLoader::NotifySliceImageError(const Operation& operation) + { + OrthancSlicesLoader::SliceImageErrorMessage msg + (*this, operation.GetSliceIndex(), operation.GetSlice(), operation.GetQuality()); + BroadcastMessage(msg); + } + + + void OrthancSlicesLoader::SortAndFinalizeSlices() + { + bool ok = slices_.Sort(); + + state_ = State_GeometryReady; + + if (ok) + { + LOG(INFO) << "Loaded a series with " << slices_.GetSlicesCount() << " slice(s)"; + BroadcastMessage(SliceGeometryReadyMessage(*this)); + } + else + { + LOG(ERROR) << "This series is empty"; + BroadcastMessage(SliceGeometryErrorMessage(*this)); + } + } + + void OrthancSlicesLoader::OnGeometryError(const IWebService::HttpRequestErrorMessage& message) + { + BroadcastMessage(SliceGeometryErrorMessage(*this)); + state_ = State_Error; + } + + void OrthancSlicesLoader::OnSliceImageError(const IWebService::HttpRequestErrorMessage& message) + { + NotifySliceImageError(dynamic_cast(message.GetPayload())); + state_ = State_Error; + } + + void OrthancSlicesLoader::ParseSeriesGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& series = message.GetJson(); + Json::Value::Members instances = series.getMemberNames(); + + slices_.Reserve(instances.size()); + + for (size_t i = 0; i < instances.size(); i++) + { + OrthancPlugins::FullOrthancDataset dataset(series[instances[i]]); + + Orthanc::DicomMap dicom; + MessagingToolbox::ConvertDataset(dicom, dataset); + + unsigned int frames; + if (!dicom.ParseUnsignedInteger32(frames, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) + { + frames = 1; + } + + for (unsigned int frame = 0; frame < frames; frame++) + { + std::unique_ptr slice(new Slice); + if (slice->ParseOrthancFrame(dicom, instances[i], frame)) + { + OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); + slices_.AddSlice(geometry, slice.release()); + } + else + { + LOG(WARNING) << "Skipping invalid frame " << frame << " within instance " << instances[i]; + } + } + } + + SortAndFinalizeSlices(); + } + + void OrthancSlicesLoader::ParseInstanceGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& tags = message.GetJson(); + const std::string& instanceId = dynamic_cast(message.GetPayload()).GetInstanceId(); + + OrthancPlugins::FullOrthancDataset dataset(tags); + + Orthanc::DicomMap dicom; + MessagingToolbox::ConvertDataset(dicom, dataset); + + unsigned int frames; + if (!dicom.ParseUnsignedInteger32(frames, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) + { + frames = 1; + } + + LOG(INFO) << "Instance " << instanceId << " contains " << frames << " frame(s)"; + + for (unsigned int frame = 0; frame < frames; frame++) + { + std::unique_ptr slice(new Slice); + if (slice->ParseOrthancFrame(dicom, instanceId, frame)) + { + OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); + slices_.AddSlice(geometry, slice.release()); + } + else + { + LOG(WARNING) << "Skipping invalid multi-frame instance " << instanceId; + BroadcastMessage(SliceGeometryErrorMessage(*this)); + return; + } + } + + SortAndFinalizeSlices(); + } + + + void OrthancSlicesLoader::ParseFrameGeometry(const OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& tags = message.GetJson(); + const std::string& instanceId = dynamic_cast(message.GetPayload()).GetInstanceId(); + unsigned int frame = dynamic_cast(message.GetPayload()).GetFrame(); + + OrthancPlugins::FullOrthancDataset dataset(tags); + + state_ = State_GeometryReady; + + Orthanc::DicomMap dicom; + MessagingToolbox::ConvertDataset(dicom, dataset); + + std::unique_ptr slice(new Slice); + if (slice->ParseOrthancFrame(dicom, instanceId, frame)) + { + LOG(INFO) << "Loaded instance geometry " << instanceId; + + OrthancStone::CoordinateSystem3D geometry = slice->GetGeometry(); + slices_.AddSlice(geometry, slice.release()); + + BroadcastMessage(SliceGeometryReadyMessage(*this)); + } + else + { + LOG(WARNING) << "Skipping invalid instance " << instanceId; + BroadcastMessage(SliceGeometryErrorMessage(*this)); + } + } + + + void OrthancSlicesLoader::ParseSliceImagePng(const OrthancApiClient::BinaryResponseReadyMessage& message) + { + const Operation& operation = dynamic_cast(message.GetPayload()); + std::unique_ptr image; + + try + { + image.reset(new Orthanc::PngReader); + dynamic_cast(*image).ReadFromMemory(message.GetAnswer(), message.GetAnswerSize()); + } + catch (Orthanc::OrthancException&) + { + NotifySliceImageError(operation); + return; + } + + if (image->GetWidth() != operation.GetSlice().GetWidth() || + image->GetHeight() != operation.GetSlice().GetHeight()) + { + NotifySliceImageError(operation); + return; + } + + if (operation.GetSlice().GetConverter().GetExpectedPixelFormat() == + Orthanc::PixelFormat_SignedGrayscale16) + { + if (image->GetFormat() == Orthanc::PixelFormat_Grayscale16) + { + image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); + } + else + { + NotifySliceImageError(operation); + return; + } + } + + NotifySliceImageSuccess(operation, *image); + } + + void OrthancSlicesLoader::ParseSliceImagePam(const OrthancApiClient::BinaryResponseReadyMessage& message) + { + const Operation& operation = dynamic_cast(message.GetPayload()); + std::unique_ptr image; + + try + { + image.reset(new Orthanc::PamReader); + dynamic_cast(*image).ReadFromMemory(message.GetAnswer(), message.GetAnswerSize()); + } + catch (Orthanc::OrthancException&) + { + NotifySliceImageError(operation); + return; + } + + if (image->GetWidth() != operation.GetSlice().GetWidth() || + image->GetHeight() != operation.GetSlice().GetHeight()) + { + NotifySliceImageError(operation); + return; + } + + if (operation.GetSlice().GetConverter().GetExpectedPixelFormat() == + Orthanc::PixelFormat_SignedGrayscale16) + { + if (image->GetFormat() == Orthanc::PixelFormat_Grayscale16) + { + image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); + } + else + { + NotifySliceImageError(operation); + return; + } + } + + NotifySliceImageSuccess(operation, *image); + } + + + void OrthancSlicesLoader::ParseSliceImageJpeg(const OrthancApiClient::JsonResponseReadyMessage& message) + { + const Operation& operation = dynamic_cast(message.GetPayload()); + + const Json::Value& encoded = message.GetJson(); + if (encoded.type() != Json::objectValue || + !encoded.isMember("Orthanc") || + encoded["Orthanc"].type() != Json::objectValue) + { + NotifySliceImageError(operation); + return; + } + + const Json::Value& info = encoded["Orthanc"]; + if (!info.isMember("PixelData") || + !info.isMember("Stretched") || + !info.isMember("Compression") || + info["Compression"].type() != Json::stringValue || + info["PixelData"].type() != Json::stringValue || + info["Stretched"].type() != Json::booleanValue || + info["Compression"].asString() != "Jpeg") + { + NotifySliceImageError(operation); + return; + } + + bool isSigned = false; + bool isStretched = info["Stretched"].asBool(); + + if (info.isMember("IsSigned")) + { + if (info["IsSigned"].type() != Json::booleanValue) + { + NotifySliceImageError(operation); + return; + } + else + { + isSigned = info["IsSigned"].asBool(); + } + } + + std::unique_ptr reader; + + { + std::string jpeg; + //Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); + jpeg = base64_decode(info["PixelData"].asString()); + + try + { + reader.reset(new Orthanc::JpegReader); + dynamic_cast(*reader).ReadFromMemory(jpeg); + } + catch (Orthanc::OrthancException&) + { + NotifySliceImageError(operation); + return; + } + } + + Orthanc::PixelFormat expectedFormat = + operation.GetSlice().GetConverter().GetExpectedPixelFormat(); + + if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image + { + if (expectedFormat != Orthanc::PixelFormat_RGB24) + { + NotifySliceImageError(operation); + return; + } + + if (isSigned || isStretched) + { + NotifySliceImageError(operation); + return; + } + else + { + NotifySliceImageSuccess(operation, *reader); + return; + } + } + + if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + NotifySliceImageError(operation); + return; + } + + if (!isStretched) + { + if (expectedFormat != reader->GetFormat()) + { + NotifySliceImageError(operation); + return; + } + else + { + NotifySliceImageSuccess(operation, *reader); + return; + } + } + + int32_t stretchLow = 0; + int32_t stretchHigh = 0; + + if (!info.isMember("StretchLow") || + !info.isMember("StretchHigh") || + info["StretchLow"].type() != Json::intValue || + info["StretchHigh"].type() != Json::intValue) + { + NotifySliceImageError(operation); + return; + } + + stretchLow = info["StretchLow"].asInt(); + stretchHigh = info["StretchHigh"].asInt(); + + if (stretchLow < -32768 || + stretchHigh > 65535 || + (stretchLow < 0 && stretchHigh > 32767)) + { + // This range cannot be represented with a uint16_t or an int16_t + NotifySliceImageError(operation); + return; + } + + // Decode a grayscale JPEG 8bpp image coming from the Web viewer + std::unique_ptr image + (new Orthanc::Image(expectedFormat, reader->GetWidth(), reader->GetHeight(), false)); + + Orthanc::ImageProcessing::Convert(*image, *reader); + reader.reset(); + + float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; + + if (!OrthancStone::LinearAlgebra::IsCloseToZero(scaling)) + { + float offset = static_cast(stretchLow) / scaling; + Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); + } + + NotifySliceImageSuccess(operation, *image); + } + + + class StringImage : public Orthanc::ImageAccessor + { + private: + std::string buffer_; + + public: + StringImage(Orthanc::PixelFormat format, + unsigned int width, + unsigned int height, + std::string& buffer) + { + if (buffer.size() != Orthanc::GetBytesPerPixel(format) * width * height) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + buffer_.swap(buffer); // The source buffer is now empty + + void* data = (buffer_.empty() ? NULL : &buffer_[0]); + + AssignWritable(format, width, height, + Orthanc::GetBytesPerPixel(format) * width, data); + } + }; + + void OrthancSlicesLoader::ParseSliceRawImage(const OrthancApiClient::BinaryResponseReadyMessage& message) + { + const Operation& operation = dynamic_cast(message.GetPayload()); + Orthanc::GzipCompressor compressor; + + std::string raw; + compressor.Uncompress(raw, message.GetAnswer(), message.GetAnswerSize()); + + const Orthanc::DicomImageInformation& info = operation.GetSlice().GetImageInformation(); + + if (info.GetBitsAllocated() == 32 && + info.GetBitsStored() == 32 && + info.GetHighBit() == 31 && + info.GetChannelCount() == 1 && + !info.IsSigned() && + info.GetPhotometricInterpretation() == Orthanc::PhotometricInterpretation_Monochrome2 && + raw.size() == info.GetWidth() * info.GetHeight() * 4) + { + // This is the case of RT-DOSE (uint32_t values) + + std::unique_ptr image + (new StringImage(Orthanc::PixelFormat_Grayscale32, info.GetWidth(), + info.GetHeight(), raw)); + + // TODO - Only for big endian + for (unsigned int y = 0; y < image->GetHeight(); y++) + { + uint32_t *p = reinterpret_cast(image->GetRow(y)); + for (unsigned int x = 0; x < image->GetWidth(); x++, p++) + { + *p = le32toh(*p); + } + } + + NotifySliceImageSuccess(operation, *image); + } + else if (info.GetBitsAllocated() == 16 && + info.GetBitsStored() == 16 && + info.GetHighBit() == 15 && + info.GetChannelCount() == 1 && + !info.IsSigned() && + info.GetPhotometricInterpretation() == Orthanc::PhotometricInterpretation_Monochrome2 && + raw.size() == info.GetWidth() * info.GetHeight() * 2) + { + std::unique_ptr image + (new StringImage(Orthanc::PixelFormat_Grayscale16, info.GetWidth(), + info.GetHeight(), raw)); + + // TODO - Big endian ? + + NotifySliceImageSuccess(operation, *image); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + } + + + OrthancSlicesLoader::OrthancSlicesLoader(boost::shared_ptr orthanc) : + orthanc_(orthanc), + state_(State_Initialization) + { + } + + + void OrthancSlicesLoader::ScheduleLoadSeries(const std::string& seriesId) + { + if (state_ != State_Initialization) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + state_ = State_LoadingGeometry; + orthanc_->GetJsonAsync("/series/" + seriesId + "/instances-tags", + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseSeriesGeometry), + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), + NULL); + } + } + + void OrthancSlicesLoader::ScheduleLoadInstance(const std::string& instanceId) + { + if (state_ != State_Initialization) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + state_ = State_LoadingGeometry; + + // Tag "3004-000c" is "Grid Frame Offset Vector", which is + // mandatory to read RT DOSE, but is too long to be returned by default + orthanc_->GetJsonAsync("/instances/" + instanceId + "/tags?ignore-length=3004-000c", + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseInstanceGeometry), + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), + Operation::DownloadInstanceGeometry(instanceId)); + } + } + + + void OrthancSlicesLoader::ScheduleLoadFrame(const std::string& instanceId, + unsigned int frame) + { + if (state_ != State_Initialization) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + state_ = State_LoadingGeometry; + + orthanc_->GetJsonAsync("/instances/" + instanceId + "/tags", + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::ParseFrameGeometry), + new DeprecatedCallable(GetSharedObserver(), &OrthancSlicesLoader::OnGeometryError), + Operation::DownloadFrameGeometry(instanceId, frame)); + } + } + + + bool OrthancSlicesLoader::IsGeometryReady() const + { + return state_ == State_GeometryReady; + } + + + size_t OrthancSlicesLoader::GetSlicesCount() const + { + if (state_ != State_GeometryReady) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return slices_.GetSlicesCount(); + } + + + const Slice& OrthancSlicesLoader::GetSlice(size_t index) const + { + if (state_ != State_GeometryReady) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return dynamic_cast(slices_.GetSlicePayload(index)); + } + + + bool OrthancSlicesLoader::LookupSlice(size_t& index, + const OrthancStone::CoordinateSystem3D& plane) const + { + if (state_ != State_GeometryReady) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + double distance; + return (slices_.LookupClosestSlice(index, distance, plane) && + distance <= GetSlice(index).GetThickness() / 2.0); + } + + + void OrthancSlicesLoader::ScheduleSliceImagePng(const Slice& slice, + size_t index) + { + std::string uri = ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + + boost::lexical_cast(slice.GetFrame())); + + switch (slice.GetConverter().GetExpectedPixelFormat()) + { + case Orthanc::PixelFormat_RGB24: + uri += "/preview"; + break; + + case Orthanc::PixelFormat_Grayscale16: + uri += "/image-uint16"; + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + uri += "/image-int16"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + orthanc_->GetBinaryAsync(uri, "image/png", + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImagePng), + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), + Operation::DownloadSliceImage( + static_cast(index), slice, SliceImageQuality_FullPng)); + } + + void OrthancSlicesLoader::ScheduleSliceImagePam(const Slice& slice, + size_t index) + { + std::string uri = + ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + + boost::lexical_cast(slice.GetFrame())); + + switch (slice.GetConverter().GetExpectedPixelFormat()) + { + case Orthanc::PixelFormat_RGB24: + uri += "/preview"; + break; + + case Orthanc::PixelFormat_Grayscale16: + uri += "/image-uint16"; + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + uri += "/image-int16"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + orthanc_->GetBinaryAsync(uri, "image/x-portable-arbitrarymap", + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImagePam), + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), + Operation::DownloadSliceImage(static_cast(index), + slice, SliceImageQuality_FullPam)); + } + + + + void OrthancSlicesLoader::ScheduleSliceImageJpeg(const Slice& slice, + size_t index, + SliceImageQuality quality) + { + unsigned int value; + + switch (quality) + { + case SliceImageQuality_Jpeg50: + value = 50; + break; + + case SliceImageQuality_Jpeg90: + value = 90; + break; + + case SliceImageQuality_Jpeg95: + value = 95; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // This requires the official Web viewer plugin to be installed! + std::string uri = ("/web-viewer/instances/jpeg" + + boost::lexical_cast(value) + + "-" + slice.GetOrthancInstanceId() + "_" + + boost::lexical_cast(slice.GetFrame())); + + orthanc_->GetJsonAsync(uri, + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceImageJpeg), + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), + Operation::DownloadSliceImage( + static_cast(index), slice, quality)); + } + + + + void OrthancSlicesLoader::ScheduleLoadSliceImage(size_t index, + SliceImageQuality quality) + { + if (state_ != State_GeometryReady) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + const Slice& slice = GetSlice(index); + + if (slice.HasOrthancDecoding()) + { + switch (quality) + { + case SliceImageQuality_FullPng: + ScheduleSliceImagePng(slice, index); + break; + case SliceImageQuality_FullPam: + ScheduleSliceImagePam(slice, index); + break; + default: + ScheduleSliceImageJpeg(slice, index, quality); + } + } + else + { + std::string uri = ("/instances/" + slice.GetOrthancInstanceId() + "/frames/" + + boost::lexical_cast(slice.GetFrame()) + "/raw.gz"); + orthanc_->GetBinaryAsync(uri, IWebService::HttpHeaders(), + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::ParseSliceRawImage), + new DeprecatedCallable + (GetSharedObserver(), &OrthancSlicesLoader::OnSliceImageError), + Operation::DownloadSliceRawImage( + static_cast(index), slice)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/OrthancSlicesLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/OrthancSlicesLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,211 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Messages/IObservable.h" +#include "../../Messages/ObserverBase.h" +#include "../../StoneEnumerations.h" +#include "../../Toolbox/SlicesSorter.h" +#include "IWebService.h" +#include "OrthancApiClient.h" +#include "Slice.h" + +#include + + +namespace Deprecated +{ + class OrthancSlicesLoader : + public OrthancStone::IObservable, + public OrthancStone::ObserverBase + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SliceGeometryReadyMessage, OrthancSlicesLoader); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, SliceGeometryErrorMessage, OrthancSlicesLoader); + + + class SliceImageReadyMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + unsigned int sliceIndex_; + const Slice& slice_; + const Orthanc::ImageAccessor& image_; + SliceImageQuality effectiveQuality_; + + public: + SliceImageReadyMessage(const OrthancSlicesLoader& origin, + unsigned int sliceIndex, + const Slice& slice, + const Orthanc::ImageAccessor& image, + SliceImageQuality effectiveQuality) : + OriginMessage(origin), + sliceIndex_(sliceIndex), + slice_(slice), + image_(image), + effectiveQuality_(effectiveQuality) + { + } + + unsigned int GetSliceIndex() const + { + return sliceIndex_; + } + + const Slice& GetSlice() const + { + return slice_; + } + + const Orthanc::ImageAccessor& GetImage() const + { + return image_; + } + + SliceImageQuality GetEffectiveQuality() const + { + return effectiveQuality_; + } + }; + + + class SliceImageErrorMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Slice& slice_; + unsigned int sliceIndex_; + SliceImageQuality effectiveQuality_; + + public: + SliceImageErrorMessage(const OrthancSlicesLoader& origin, + unsigned int sliceIndex, + const Slice& slice, + SliceImageQuality effectiveQuality) : + OriginMessage(origin), + slice_(slice), + sliceIndex_(sliceIndex), + effectiveQuality_(effectiveQuality) + { + } + unsigned int GetSliceIndex() const + { + return sliceIndex_; + } + + const Slice& GetSlice() const + { + return slice_; + } + + SliceImageQuality GetEffectiveQuality() const + { + return effectiveQuality_; + } + }; + + private: + enum State + { + State_Error, + State_Initialization, + State_LoadingGeometry, + State_GeometryReady + }; + + enum Mode + { + Mode_SeriesGeometry, + Mode_InstanceGeometry, + Mode_FrameGeometry, + Mode_LoadImage, + Mode_LoadRawImage, + Mode_LoadDicomFile + }; + + class Operation; + + boost::shared_ptr orthanc_; + State state_; + OrthancStone::SlicesSorter slices_; + + void NotifySliceImageSuccess(const Operation& operation, + const Orthanc::ImageAccessor& image); + + void NotifySliceImageError(const Operation& operation); + + void OnGeometryError(const IWebService::HttpRequestErrorMessage& message); + + void OnSliceImageError(const IWebService::HttpRequestErrorMessage& message); + + void ParseSeriesGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); + + void ParseInstanceGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); + + void ParseFrameGeometry(const OrthancApiClient::JsonResponseReadyMessage& message); + + void ParseSliceImagePng(const OrthancApiClient::BinaryResponseReadyMessage& message); + + void ParseSliceImagePam(const OrthancApiClient::BinaryResponseReadyMessage& message); + + void ParseSliceImageJpeg(const OrthancApiClient::JsonResponseReadyMessage& message); + + void ParseSliceRawImage(const OrthancApiClient::BinaryResponseReadyMessage& message); + + void ScheduleSliceImagePng(const Slice& slice, + size_t index); + + void ScheduleSliceImagePam(const Slice& slice, + size_t index); + + void ScheduleSliceImageJpeg(const Slice& slice, + size_t index, + SliceImageQuality quality); + + void SortAndFinalizeSlices(); + + public: + OrthancSlicesLoader(//ISliceLoaderObserver& callback, + boost::shared_ptr orthancApi); + + void ScheduleLoadSeries(const std::string& seriesId); + + void ScheduleLoadInstance(const std::string& instanceId); + + void ScheduleLoadFrame(const std::string& instanceId, + unsigned int frame); + + bool IsGeometryReady() const; + + size_t GetSlicesCount() const; + + const Slice& GetSlice(size_t index) const; + + bool LookupSlice(size_t& index, + const OrthancStone::CoordinateSystem3D& plane) const; + + void ScheduleLoadSliceImage(size_t index, + SliceImageQuality requestedQuality); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ParallelSlices.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ParallelSlices.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,215 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParallelSlices.h" + +#include "../../Toolbox/GeometryToolbox.h" +#include "../../Volumes/ImageBuffer3D.h" + +#include +#include + +namespace Deprecated +{ + ParallelSlices::ParallelSlices() + { + Clear(); + } + + + ParallelSlices::ParallelSlices(const ParallelSlices& other) + { + normal_ = other.normal_; + + slices_.resize(other.slices_.size()); + + for (size_t i = 0; i < slices_.size(); i++) + { + assert(other.slices_[i] != NULL); + slices_[i] = new OrthancStone::CoordinateSystem3D(*other.slices_[i]); + } + } + + + void ParallelSlices::Clear() + { + for (size_t i = 0; i < slices_.size(); i++) + { + if (slices_[i] != NULL) + { + delete slices_[i]; + slices_[i] = NULL; + } + } + + slices_.clear(); + OrthancStone::LinearAlgebra::AssignVector(normal_, 0, 0, 1); + } + + + ParallelSlices::~ParallelSlices() + { + Clear(); + } + + + void ParallelSlices::AddSlice(const OrthancStone::CoordinateSystem3D& slice) + { + if (slices_.empty()) + { + normal_ = slice.GetNormal(); + slices_.push_back(new OrthancStone::CoordinateSystem3D(slice)); + } + else if (OrthancStone::GeometryToolbox::IsParallel(slice.GetNormal(), normal_)) + { + slices_.push_back(new OrthancStone::CoordinateSystem3D(slice)); + } + else + { + LOG(ERROR) << "Trying to add a slice that is not parallel to the previous ones"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void ParallelSlices::AddSlice(const OrthancStone::Vector& origin, + const OrthancStone::Vector& axisX, + const OrthancStone::Vector& axisY) + { + OrthancStone::CoordinateSystem3D slice(origin, axisX, axisY); + AddSlice(slice); + } + + + const OrthancStone::CoordinateSystem3D& ParallelSlices::GetSlice(size_t index) const + { + if (index >= slices_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + return *slices_[index]; + } + } + + + bool ParallelSlices::ComputeClosestSlice(size_t& closestSlice, + double& closestDistance, + const OrthancStone::Vector& origin) const + { + if (slices_.empty()) + { + return false; + } + + double reference = boost::numeric::ublas::inner_prod(origin, normal_); + + closestSlice = 0; + closestDistance = std::numeric_limits::infinity(); + + for (size_t i = 0; i < slices_.size(); i++) + { + double distance = fabs(boost::numeric::ublas::inner_prod(slices_[i]->GetOrigin(), normal_) - reference); + + if (distance < closestDistance) + { + closestSlice = i; + closestDistance = distance; + } + } + + return true; + } + + + ParallelSlices* ParallelSlices::Reverse() const + { + std::unique_ptr reversed(new ParallelSlices); + + for (size_t i = slices_.size(); i > 0; i--) + { + const OrthancStone::CoordinateSystem3D& slice = *slices_[i - 1]; + + reversed->AddSlice(slice.GetOrigin(), + -slice.GetAxisX(), + slice.GetAxisY()); + } + + return reversed.release(); + } + + + ParallelSlices* ParallelSlices::FromVolumeImage(const OrthancStone::VolumeImageGeometry& geometry, + OrthancStone::VolumeProjection projection) + { + const OrthancStone::Vector dimensions = geometry.GetVoxelDimensions(OrthancStone::VolumeProjection_Axial); + const OrthancStone::CoordinateSystem3D& axial = geometry.GetAxialGeometry(); + + std::unique_ptr result(new ParallelSlices); + + switch (projection) + { + case OrthancStone::VolumeProjection_Axial: + for (unsigned int z = 0; z < geometry.GetDepth(); z++) + { + OrthancStone::Vector origin = axial.GetOrigin(); + origin += static_cast(z) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisX(), + axial.GetAxisY()); + } + break; + + case OrthancStone::VolumeProjection_Coronal: + for (unsigned int y = 0; y < geometry.GetHeight(); y++) + { + OrthancStone::Vector origin = axial.GetOrigin(); + origin += static_cast(y) * dimensions[1] * axial.GetAxisY(); + origin += static_cast(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisX(), + -axial.GetNormal()); + } + break; + + case OrthancStone::VolumeProjection_Sagittal: + for (unsigned int x = 0; x < geometry.GetWidth(); x++) + { + OrthancStone::Vector origin = axial.GetOrigin(); + origin += static_cast(x) * dimensions[0] * axial.GetAxisX(); + origin += static_cast(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisY(), + -axial.GetNormal()); + } + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return result.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ParallelSlices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ParallelSlices.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Toolbox/CoordinateSystem3D.h" +#include "../../Volumes/VolumeImageGeometry.h" + +namespace Deprecated +{ + class ParallelSlices : public boost::noncopyable + { + private: + OrthancStone::Vector normal_; + std::vector slices_; + + ParallelSlices& operator= (const ParallelSlices& other); // Forbidden + + void Clear(); + + public: + ParallelSlices(); + + ParallelSlices(const ParallelSlices& other); + + ~ParallelSlices(); + + const OrthancStone::Vector& GetNormal() const + { + return normal_; + } + + void AddSlice(const OrthancStone::CoordinateSystem3D& slice); + + void AddSlice(const OrthancStone::Vector& origin, + const OrthancStone::Vector& axisX, + const OrthancStone::Vector& axisY); + + size_t GetSliceCount() const + { + return slices_.size(); + } + + const OrthancStone::CoordinateSystem3D& GetSlice(size_t index) const; + + bool ComputeClosestSlice(size_t& closestSlice, + double& closestDistance, + const OrthancStone::Vector& origin) const; + + ParallelSlices* Reverse() const; + + static ParallelSlices* FromVolumeImage(const OrthancStone::VolumeImageGeometry& geometry, + OrthancStone::VolumeProjection projection); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ParallelSlicesCursor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ParallelSlicesCursor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,221 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParallelSlicesCursor.h" + +#include + +namespace Deprecated +{ + size_t ParallelSlicesCursor::GetDefaultSlice() + { + if (slices_.get() == NULL) + { + return 0; + } + else + { + return slices_->GetSliceCount() / 2; + } + } + + + size_t ParallelSlicesCursor::GetSliceCount() + { + if (slices_.get() == NULL) + { + return 0; + } + else + { + return slices_->GetSliceCount(); + } + } + + + OrthancStone::CoordinateSystem3D ParallelSlicesCursor::GetSlice(size_t slice) + { + if (slices_.get() == NULL) + { + return OrthancStone::CoordinateSystem3D(); + } + else + { + return slices_->GetSlice(slice); + } + } + + + void ParallelSlicesCursor::SetGeometry(const ParallelSlices& slices) + { + slices_.reset(new ParallelSlices(slices)); + + currentSlice_ = GetDefaultSlice(); + } + + + OrthancStone::CoordinateSystem3D ParallelSlicesCursor::GetCurrentSlice() + { + if (slices_.get() != NULL && + currentSlice_ < slices_->GetSliceCount()) + { + return slices_->GetSlice(currentSlice_); + } + else + { + return OrthancStone::CoordinateSystem3D(); // No slice is available, return the canonical geometry + } + } + + + bool ParallelSlicesCursor::SetDefaultSlice() + { + size_t slice = GetDefaultSlice(); + + if (currentSlice_ != slice) + { + currentSlice_ = slice; + return true; + } + else + { + return false; + } + } + + + bool ParallelSlicesCursor::ApplyOffset(OrthancStone::SliceOffsetMode mode, + int offset) + { + if (slices_.get() == NULL) + { + return false; + } + + int count = static_cast(slices_->GetSliceCount()); + if (count == 0) + { + return false; + } + + int slice; + if (static_cast(currentSlice_) >= count) + { + slice = count - 1; + } + else + { + slice = static_cast(currentSlice_); + } + + switch (mode) + { + case OrthancStone::SliceOffsetMode_Absolute: + { + slice = offset; + break; + } + + case OrthancStone::SliceOffsetMode_Relative: + { + slice += offset; + break; + } + + case OrthancStone::SliceOffsetMode_Loop: + { + slice += offset; + while (slice < 0) + { + slice += count; + } + + while (slice >= count) + { + slice -= count; + } + + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (slice < 0) + { + slice = 0; + } + + if (slice >= count) + { + slice = count - 1; + } + + if (slice != static_cast(currentSlice_)) + { + currentSlice_ = static_cast(slice); + return true; + } + else + { + return false; + } + } + + + bool ParallelSlicesCursor::ApplyWheelEvent(OrthancStone::MouseWheelDirection direction, + OrthancStone::KeyboardModifiers modifiers) + { + int offset = (modifiers & OrthancStone::KeyboardModifiers_Control ? 10 : 1); + + switch (direction) + { + case OrthancStone::MouseWheelDirection_Down: + return ApplyOffset(OrthancStone::SliceOffsetMode_Relative, -offset); + + case OrthancStone::MouseWheelDirection_Up: + return ApplyOffset(OrthancStone::SliceOffsetMode_Relative, offset); + + default: + return false; + } + } + + + bool ParallelSlicesCursor::LookupSliceContainingPoint(const OrthancStone::Vector& p) + { + size_t slice; + double distance; + + if (slices_.get() != NULL && + slices_->ComputeClosestSlice(slice, distance, p)) + { + if (currentSlice_ != slice) + { + currentSlice_ = slice; + return true; + } + } + + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ParallelSlicesCursor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ParallelSlicesCursor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ParallelSlices.h" +#include "../../StoneEnumerations.h" + +#include + +namespace Deprecated +{ + class ParallelSlicesCursor : public boost::noncopyable + { + private: + std::unique_ptr slices_; + size_t currentSlice_; + + size_t GetDefaultSlice(); + + public: + ParallelSlicesCursor() : + currentSlice_(0) + { + } + + void SetGeometry(const ParallelSlices& slices); + + size_t GetSliceCount(); + + OrthancStone::CoordinateSystem3D GetSlice(size_t slice); + + OrthancStone::CoordinateSystem3D GetCurrentSlice(); + + // Returns "true" iff. the slice has actually changed + bool SetDefaultSlice(); + + // Returns "true" iff. the slice has actually changed + bool ApplyOffset(OrthancStone::SliceOffsetMode mode, + int offset); + + // Returns "true" iff. the slice has actually changed + bool ApplyWheelEvent(OrthancStone::MouseWheelDirection direction, + OrthancStone::KeyboardModifiers modifiers); + + // Returns "true" iff. the slice has actually changed + bool LookupSliceContainingPoint(const OrthancStone::Vector& p); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/Slice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/Slice.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,367 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Slice.h" + +#include "../../StoneEnumerations.h" +#include "../../Toolbox/GeometryToolbox.h" + +#include +#include +#include + +#include + +namespace Deprecated +{ + static bool ParseDouble(double& target, + const std::string& source) + { + try + { + target = boost::lexical_cast(source); + return true; + } + catch (boost::bad_lexical_cast&) + { + return false; + } + } + + Slice* Slice::Clone() const + { + std::unique_ptr target(new Slice()); + + target->type_ = type_; + target->orthancInstanceId_ = orthancInstanceId_; + target->sopClassUid_ = sopClassUid_; + target->frame_ = frame_; + target->frameCount_ = frameCount_; + target->geometry_ = geometry_; + target->pixelSpacingX_ = pixelSpacingX_; + target->pixelSpacingY_ = pixelSpacingY_; + target->thickness_ = thickness_; + target->width_ = width_; + target->height_ = height_; + target->converter_ = converter_; + if (imageInformation_.get() != NULL) + target->imageInformation_.reset(imageInformation_->Clone()); + + return target.release(); + } + + bool Slice::ComputeRTDoseGeometry(const Orthanc::DicomMap& dataset, + unsigned int frame) + { + // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html + + { + std::string increment; + + if (dataset.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) + { + Orthanc::Toolbox::ToUpperCase(increment); + if (increment != "3004,000C") // This is the "Grid Frame Offset Vector" tag + { + LOG(ERROR) << "Bad value for the \"FrameIncrementPointer\" tag"; + return false; + } + } + } + + std::string offsetTag; + + if (!dataset.LookupStringValue(offsetTag, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, false) || + offsetTag.empty()) + { + LOG(ERROR) << "Cannot read the \"GridFrameOffsetVector\" tag, check you are using Orthanc >= 1.3.1"; + return false; + } + + std::vector offsets; + Orthanc::Toolbox::TokenizeString(offsets, offsetTag, '\\'); + + if (frameCount_ <= 1 || + offsets.size() < frameCount_ || + offsets.size() < 2 || + frame >= frameCount_) + { + LOG(ERROR) << "No information about the 3D location of some slice(s) in a RT DOSE"; + return false; + } + + double offset0, offset1, z; + + if (!ParseDouble(offset0, offsets[0]) || + !ParseDouble(offset1, offsets[1]) || + !ParseDouble(z, offsets[frame])) + { + LOG(ERROR) << "Invalid syntax"; + return false; + } + + if (!OrthancStone::LinearAlgebra::IsCloseToZero(offset0)) + { + LOG(ERROR) << "Invalid syntax"; + return false; + } + + geometry_ = OrthancStone::CoordinateSystem3D(geometry_.GetOrigin() + z * geometry_.GetNormal(), + //+ 650 * geometry_.GetAxisX(), + geometry_.GetAxisX(), + geometry_.GetAxisY()); + + thickness_ = offset1 - offset0; + if (thickness_ < 0) + { + thickness_ = -thickness_; + } + + return true; + } + + + bool Slice::ParseOrthancFrame(const Orthanc::DicomMap& dataset, + const std::string& instanceId, + unsigned int frame) + { + orthancInstanceId_ = instanceId; + frame_ = frame; + type_ = Type_OrthancDecodableFrame; + imageInformation_.reset(new Orthanc::DicomImageInformation(dataset)); + + if (!dataset.LookupStringValue(sopClassUid_, Orthanc::DICOM_TAG_SOP_CLASS_UID, false) || + sopClassUid_.empty()) + { + LOG(ERROR) << "Instance without a SOP class UID"; + return false; + } + + if (!dataset.ParseUnsignedInteger32(frameCount_, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) + { + frameCount_ = 1; // Assume instance with one frame + } + + if (frame >= frameCount_) + { + return false; + } + + if (!dataset.ParseUnsignedInteger32(width_, Orthanc::DICOM_TAG_COLUMNS) || + !dataset.ParseUnsignedInteger32(height_, Orthanc::DICOM_TAG_ROWS)) + { + return false; + } + + thickness_ = 100.0 * std::numeric_limits::epsilon(); + + std::string tmp; + if (dataset.LookupStringValue(tmp, Orthanc::DICOM_TAG_SLICE_THICKNESS, false)) + { + if (!tmp.empty() && + !ParseDouble(thickness_, tmp)) + { + return false; // Syntax error + } + } + + converter_.ReadParameters(dataset); + + OrthancStone::GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dataset); + + std::string position, orientation; + if (dataset.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && + dataset.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) + { + geometry_ = OrthancStone::CoordinateSystem3D(position, orientation); + + bool ok = true; + + switch (OrthancStone::StringToSopClassUid(sopClassUid_)) + { + case OrthancStone::SopClassUid_RTDose: + type_ = Type_OrthancRawFrame; + ok = ComputeRTDoseGeometry(dataset, frame); + break; + + default: + break; + } + + if (!ok) + { + LOG(ERROR) << "Cannot deduce the 3D location of frame " << frame + << " in instance " << instanceId << ", whose SOP class UID is: " << sopClassUid_; + return false; + } + } + + return true; + } + + + const std::string Slice::GetOrthancInstanceId() const + { + if (type_ == Type_OrthancDecodableFrame || + type_ == Type_OrthancRawFrame) + { + return orthancInstanceId_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + unsigned int Slice::GetFrame() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return frame_; + } + + + const OrthancStone::CoordinateSystem3D& Slice::GetGeometry() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return geometry_; + } + + + double Slice::GetThickness() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return thickness_; + } + + + double Slice::GetPixelSpacingX() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return pixelSpacingX_; + } + + + double Slice::GetPixelSpacingY() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return pixelSpacingY_; + } + + + unsigned int Slice::GetWidth() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return width_; + } + + + unsigned int Slice::GetHeight() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return height_; + } + + + const DicomFrameConverter& Slice::GetConverter() const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return converter_; + } + + + bool Slice::ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const + { + if (type_ == Type_Invalid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + bool opposite; + return (OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, + GetGeometry().GetNormal(), + plane.GetNormal()) && + OrthancStone::LinearAlgebra::IsNear(GetGeometry().ProjectAlongNormal(GetGeometry().GetOrigin()), + GetGeometry().ProjectAlongNormal(plane.GetOrigin()), + thickness_ / 2.0)); + } + + + void Slice::GetExtent(std::vector& points) const + { + double sx = GetPixelSpacingX(); + double sy = GetPixelSpacingY(); + double w = static_cast(GetWidth()); + double h = static_cast(GetHeight()); + + points.clear(); + points.push_back(GetGeometry().MapSliceToWorldCoordinates(-0.5 * sx, -0.5 * sy)); + points.push_back(GetGeometry().MapSliceToWorldCoordinates((w - 0.5) * sx, -0.5 * sy)); + points.push_back(GetGeometry().MapSliceToWorldCoordinates(-0.5 * sx, (h - 0.5) * sy)); + points.push_back(GetGeometry().MapSliceToWorldCoordinates((w - 0.5) * sx, (h - 0.5) * sy)); + } + + + const Orthanc::DicomImageInformation& Slice::GetImageInformation() const + { + if (imageInformation_.get() == NULL) + { + // Only available if constructing the "Slice" object with a DICOM map + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *imageInformation_; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/Slice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/Slice.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,155 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Toolbox/CoordinateSystem3D.h" +#include "DicomFrameConverter.h" + +#include +#include + +namespace Deprecated +{ + // TODO - Remove this class + class Slice : + public Orthanc::IDynamicObject /* to be used as a payload of SlicesSorter */ + { + private: + enum Type + { + Type_Invalid, + Type_Standalone, + Type_OrthancDecodableFrame, + Type_OrthancRawFrame + // TODO A slice could come from some DICOM file (URL) + }; + + bool ComputeRTDoseGeometry(const Orthanc::DicomMap& dataset, + unsigned int frame); + + Type type_; + std::string orthancInstanceId_; + std::string sopClassUid_; + unsigned int frame_; + unsigned int frameCount_; // TODO : Redundant with "imageInformation_" + OrthancStone::CoordinateSystem3D geometry_; + double pixelSpacingX_; + double pixelSpacingY_; + double thickness_; + unsigned int width_; // TODO : Redundant with "imageInformation_" + unsigned int height_; // TODO : Redundant with "imageInformation_" + DicomFrameConverter converter_; // TODO : Partially redundant with "imageInformation_" + + std::unique_ptr imageInformation_; + + public: + Slice() : + type_(Type_Invalid) + { + } + + + // this constructor is used to reference, i.e, a slice that is being loaded + Slice(const std::string& orthancInstanceId, + unsigned int frame) : + type_(Type_Invalid), + orthancInstanceId_(orthancInstanceId), + frame_(frame) + { + } + + // TODO Is this constructor the best way to go to tackle missing + // layers within SliceViewerWidget? + Slice(const OrthancStone::CoordinateSystem3D& plane, + double thickness) : + type_(Type_Standalone), + frame_(0), + frameCount_(0), + geometry_(plane), + pixelSpacingX_(1), + pixelSpacingY_(1), + thickness_(thickness), + width_(0), + height_(0) + { + } + + Slice(const OrthancStone::CoordinateSystem3D& plane, + double pixelSpacingX, + double pixelSpacingY, + double thickness, + unsigned int width, + unsigned int height, + const DicomFrameConverter& converter) : + type_(Type_Standalone), + frameCount_(1), + geometry_(plane), + pixelSpacingX_(pixelSpacingX), + pixelSpacingY_(pixelSpacingY), + thickness_(thickness), + width_(width), + height_(height), + converter_(converter) + { + } + + bool IsValid() const + { + return type_ != Type_Invalid; + } + + bool ParseOrthancFrame(const Orthanc::DicomMap& dataset, + const std::string& instanceId, + unsigned int frame); + + bool HasOrthancDecoding() const + { + return type_ == Type_OrthancDecodableFrame; + } + + const std::string GetOrthancInstanceId() const; + + unsigned int GetFrame() const; + + const OrthancStone::CoordinateSystem3D& GetGeometry() const; + + double GetThickness() const; + + double GetPixelSpacingX() const; + + double GetPixelSpacingY() const; + + unsigned int GetWidth() const; + + unsigned int GetHeight() const; + + const DicomFrameConverter& GetConverter() const; + + bool ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const; + + void GetExtent(std::vector& points) const; + + const Orthanc::DicomImageInformation& GetImageInformation() const; + + Slice* Clone() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ViewportGeometry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ViewportGeometry.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,217 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ViewportGeometry.h" + +#include +#include + +#include + +namespace Deprecated +{ + void ViewportGeometry::ComputeTransform() + { + // The following lines must be read in reverse order! + cairo_matrix_t tmp; + + // Bring the center of the scene to the center of the view + cairo_matrix_init_translate(&transform_, + panX_ + static_cast(width_) / 2.0, + panY_ + static_cast(height_) / 2.0); + + // Apply the zoom around (0,0) + cairo_matrix_init_scale(&tmp, zoom_, zoom_); + cairo_matrix_multiply(&transform_, &tmp, &transform_); + + // Bring the center of the scene to (0,0) + cairo_matrix_init_translate(&tmp, + -(sceneExtent_.GetX1() + sceneExtent_.GetX2()) / 2.0, + -(sceneExtent_.GetY1() + sceneExtent_.GetY2()) / 2.0); + cairo_matrix_multiply(&transform_, &tmp, &transform_); + } + + + ViewportGeometry::ViewportGeometry() + { + width_ = 0; + height_ = 0; + + zoom_ = 1; + panX_ = 0; + panY_ = 0; + + ComputeTransform(); + } + + + void ViewportGeometry::SetDisplaySize(unsigned int width, + unsigned int height) + { + if (width_ != width || + height_ != height) + { + LOG(INFO) << "New display size: " << width << "x" << height; + + width_ = width; + height_ = height; + + ComputeTransform(); + } + } + + + void ViewportGeometry::SetSceneExtent(const OrthancStone::Extent2D& extent) + { +// LOG(INFO) << "New scene extent: (" +// << extent.GetX1() << "," << extent.GetY1() << ") => (" +// << extent.GetX2() << "," << extent.GetY2() << ")"; + + sceneExtent_ = extent; + ComputeTransform(); + } + + + void ViewportGeometry::MapDisplayToScene(double& sceneX /* out */, + double& sceneY /* out */, + double x, + double y) const + { + cairo_matrix_t transform = transform_; + + if (cairo_matrix_invert(&transform) != CAIRO_STATUS_SUCCESS) + { + LOG(ERROR) << "Cannot invert singular matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + sceneX = x; + sceneY = y; + cairo_matrix_transform_point(&transform, &sceneX, &sceneY); + } + + + void ViewportGeometry::MapSceneToDisplay(int& displayX /* out */, + int& displayY /* out */, + double x, + double y) const + { + cairo_matrix_transform_point(&transform_, &x, &y); + + displayX = static_cast(boost::math::iround(x)); + displayY = static_cast(boost::math::iround(y)); + } + + + void ViewportGeometry::MapPixelCenterToScene(std::vector& sceneTouches /* out */, + const std::vector& displayTouches) const + { + double sceneX, sceneY; + sceneTouches.clear(); + for (size_t t = 0; t < displayTouches.size(); t++) + { + MapPixelCenterToScene( + sceneX, + sceneY, + static_cast(displayTouches[t].x), + static_cast(displayTouches[t].y)); + + sceneTouches.push_back(Touch((float)sceneX, (float)sceneY)); + } + } + + void ViewportGeometry::MapPixelCenterToScene(double& sceneX, + double& sceneY, + int x, + int y) const + { + // Take the center of the pixel + MapDisplayToScene(sceneX, sceneY, + static_cast(x) + 0.5, + static_cast(y) + 0.5); + } + + + void ViewportGeometry::FitContent() + { + if (width_ > 0 && + height_ > 0 && + !sceneExtent_.IsEmpty()) + { + double zoomX = static_cast(width_) / (sceneExtent_.GetX2() - sceneExtent_.GetX1()); + double zoomY = static_cast(height_) / (sceneExtent_.GetY2() - sceneExtent_.GetY1()); + zoom_ = zoomX < zoomY ? zoomX : zoomY; + + panX_ = 0; + panY_ = 0; + + ComputeTransform(); + } + } + + + void ViewportGeometry::ApplyTransform(OrthancStone::CairoContext& context) const + { + cairo_set_matrix(context.GetObject(), &transform_); + } + + + void ViewportGeometry::GetPan(double& x, + double& y) const + { + x = panX_; + y = panY_; + } + + + void ViewportGeometry::SetPan(double x, + double y) + { + panX_ = x; + panY_ = y; + ComputeTransform(); + } + + + void ViewportGeometry::SetZoom(double zoom) + { + zoom_ = zoom; + ComputeTransform(); + } + + + OrthancStone::Matrix ViewportGeometry::GetMatrix() const + { + OrthancStone::Matrix m(3, 3); + + m(0, 0) = transform_.xx; + m(0, 1) = transform_.xy; + m(0, 2) = transform_.x0; + m(1, 0) = transform_.yx; + m(1, 1) = transform_.yy; + m(1, 2) = transform_.y0; + m(2, 0) = 0; + m(2, 1) = 0; + m(2, 2) = 1; + + return m; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Toolbox/ViewportGeometry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Toolbox/ViewportGeometry.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,110 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoContext.h" +#include "../../Toolbox/Extent2D.h" +#include "../../Toolbox/LinearAlgebra.h" +#include "../Viewport/IMouseTracker.h" // to include "Touch" definition + +namespace Deprecated +{ + class ViewportGeometry + { + private: + // Extent of the scene (in world units) + OrthancStone::Extent2D sceneExtent_; + + // Size of the display (in pixels) + unsigned int width_; + unsigned int height_; + + // Zoom/pan + double zoom_; + double panX_; // In pixels (display units) + double panY_; + + cairo_matrix_t transform_; // Scene-to-display transformation + + void ComputeTransform(); + + public: + ViewportGeometry(); + + void SetDisplaySize(unsigned int width, + unsigned int height); + + void SetSceneExtent(const OrthancStone::Extent2D& extent); + + const OrthancStone::Extent2D& GetSceneExtent() const + { + return sceneExtent_; + } + + void MapDisplayToScene(double& sceneX /* out */, + double& sceneY /* out */, + double x, + double y) const; + + void MapPixelCenterToScene(double& sceneX /* out */, + double& sceneY /* out */, + int x, + int y) const; + + void MapPixelCenterToScene(std::vector& sceneTouches /* out */, + const std::vector& displayTouches) const; + + void MapSceneToDisplay(int& displayX /* out */, + int& displayY /* out */, + double x, + double y) const; + + unsigned int GetDisplayWidth() const + { + return width_; + } + + unsigned int GetDisplayHeight() const + { + return height_; + } + + double GetZoom() const + { + return zoom_; + } + + void FitContent(); + + void ApplyTransform(OrthancStone::CairoContext& context) const; + + void GetPan(double& x, + double& y) const; + + void SetPan(double x, + double y); + + void SetZoom(double zoom); + + OrthancStone::Matrix GetMatrix() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/CairoFont.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/CairoFont.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,65 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoFont.h" + +#include +#include + +namespace Deprecated +{ + CairoFont::CairoFont(const char* family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) + { + font_ = cairo_toy_font_face_create(family, slant, weight); + if (font_ == NULL) + { + LOG(ERROR) << "Unknown font: " << family; + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + } + + + CairoFont::~CairoFont() + { + if (font_ != NULL) + { + cairo_font_face_destroy(font_); + } + } + + + void CairoFont::Draw(OrthancStone::CairoContext& context, + const std::string& text, + double size) + { + if (size <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + cairo_t* cr = context.GetObject(); + cairo_set_font_face(cr, font_); + cairo_set_font_size(cr, size); + cairo_show_text(cr, text.c_str()); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/CairoFont.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/CairoFont.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if !defined(ORTHANC_SANDBOXED) +# error The macro ORTHANC_SANDBOXED must be defined +#endif + +#if ORTHANC_SANDBOXED == 1 +# error The class CairoFont cannot be used in sandboxed environments +#endif + +#include "../../Wrappers/CairoContext.h" + +namespace Deprecated +{ + class CairoFont : public boost::noncopyable + { + private: + cairo_font_face_t* font_; + + public: + CairoFont(const char* family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); + + ~CairoFont(); + + void Draw(OrthancStone::CairoContext& context, + const std::string& text, + double size); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/IMouseTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/IMouseTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,66 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoSurface.h" +#include + +namespace Deprecated +{ + struct Touch + { + float x; + float y; + + Touch(float x, float y) + : x(x), + y(y) + { + } + Touch() + : x(0.0f), + y(0.0f) + { + } + }; + + + // this is tracking a mouse in screen coordinates/pixels unlike + // the IWorldSceneMouseTracker that is tracking a mouse + // in scene coordinates/mm. + class IMouseTracker : public boost::noncopyable + { + public: + virtual ~IMouseTracker() + { + } + + virtual void Render(Orthanc::ImageAccessor& surface) = 0; + + virtual void MouseUp() = 0; + + // Returns "true" iff. the background scene must be repainted + virtual void MouseMove(int x, + int y, + const std::vector& displayTouches) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/IStatusBar.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/IStatusBar.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace Deprecated +{ + class IStatusBar : public boost::noncopyable + { + public: + virtual ~IStatusBar() + { + } + + virtual void ClearMessage() = 0; + + virtual void SetMessage(const std::string& message) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/IViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/IViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,87 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IStatusBar.h" +#include "../../StoneEnumerations.h" +#include "../../Messages/IObservable.h" +#include "../Viewport/IMouseTracker.h" // only to get the "Touch" definition + +#include + + +namespace Deprecated +{ + class IWidget; // Forward declaration + + class IViewport : public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ViewportChangedMessage, IViewport); + + virtual void FitContent() = 0; + + virtual void SetStatusBar(IStatusBar& statusBar) = 0; + + virtual void SetSize(unsigned int width, + unsigned int height) = 0; + + // The function returns "true" iff. a new frame was rendered + virtual bool Render(Orthanc::ImageAccessor& surface) = 0; + + virtual void MouseDown(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) = 0; + + virtual void MouseUp() = 0; + + virtual void MouseMove(int x, + int y, + const std::vector& displayTouches) = 0; + + virtual void MouseEnter() = 0; + + virtual void MouseLeave() = 0; + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) = 0; + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) = 0; + + virtual bool HasAnimation() = 0; + + virtual void DoAnimation() = 0; + + // Should only be called from IWidget + // TODO Why should this be virtual? + virtual void NotifyContentChanged() + { + BroadcastMessage(ViewportChangedMessage(*this)); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/WidgetViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/WidgetViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,286 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WidgetViewport.h" + +#include +#include + +namespace Deprecated +{ + WidgetViewport::WidgetViewport() : + statusBar_(NULL), + isMouseOver_(false), + lastMouseX_(0), + lastMouseY_(0), + backgroundChanged_(false) + { + } + + + void WidgetViewport::FitContent() + { + if (centralWidget_.get() != NULL) + { + centralWidget_->FitContent(); + } + } + + + void WidgetViewport::SetStatusBar(IStatusBar& statusBar) + { + statusBar_ = &statusBar; + + if (centralWidget_.get() != NULL) + { + centralWidget_->SetStatusBar(statusBar); + } + } + + + void WidgetViewport::SetCentralWidget(boost::shared_ptr widget) + { + if (widget == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + mouseTracker_.reset(NULL); + + centralWidget_ = widget; + centralWidget_->SetViewport(*this); + + if (statusBar_ != NULL) + { + centralWidget_->SetStatusBar(*statusBar_); + } + + NotifyBackgroundChanged(); + } + + + void WidgetViewport::NotifyBackgroundChanged() + { + backgroundChanged_ = true; + NotifyContentChanged(); + } + + + void WidgetViewport::SetSize(unsigned int width, + unsigned int height) + { + background_.SetSize(width, height, false /* no alpha */); + + if (centralWidget_.get() != NULL) + { + centralWidget_->SetSize(width, height); + } + + NotifyBackgroundChanged(); + } + + + bool WidgetViewport::Render(Orthanc::ImageAccessor& surface) + { + if (centralWidget_.get() == NULL) + { + return false; + } + + Orthanc::ImageAccessor background; + background_.GetWriteableAccessor(background); + + if (backgroundChanged_ && + !centralWidget_->Render(background)) + { + return false; + } + + if (background.GetWidth() != surface.GetWidth() || + background.GetHeight() != surface.GetHeight()) + { + return false; + } + + Orthanc::ImageProcessing::Convert(surface, background); + + if (mouseTracker_.get() != NULL) + { + mouseTracker_->Render(surface); + } + else if (isMouseOver_) + { + centralWidget_->RenderMouseOver(surface, lastMouseX_, lastMouseY_); + } + + return true; + } + + void WidgetViewport::TouchStart(const std::vector& displayTouches) + { + MouseDown(OrthancStone::MouseButton_Left, (int)displayTouches[0].x, (int)displayTouches[0].y, OrthancStone::KeyboardModifiers_None, displayTouches); // one touch is equivalent to a mouse tracker without left button -> set the mouse coordinates to the first touch coordinates + } + + void WidgetViewport::TouchMove(const std::vector& displayTouches) + { + MouseMove((int)displayTouches[0].x, (int)displayTouches[0].y, displayTouches); // one touch is equivalent to a mouse tracker without left button -> set the mouse coordinates to the first touch coordinates + } + + void WidgetViewport::TouchEnd(const std::vector& displayTouches) + { + // note: TouchEnd is not triggered when a single touch gesture ends (it is only triggered when + // going from 2 touches to 1 touch, ...) + MouseUp(); + } + + void WidgetViewport::MouseDown(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& displayTouches + ) + { + lastMouseX_ = x; + lastMouseY_ = y; + + if (centralWidget_.get() != NULL) + { + mouseTracker_.reset(centralWidget_->CreateMouseTracker(button, x, y, modifiers, displayTouches)); + } + else + { + mouseTracker_.reset(NULL); + } + + NotifyContentChanged(); + } + + + void WidgetViewport::MouseUp() + { + if (mouseTracker_.get() != NULL) + { + mouseTracker_->MouseUp(); + mouseTracker_.reset(NULL); + NotifyContentChanged(); + } + } + + + void WidgetViewport::MouseMove(int x, + int y, + const std::vector& displayTouches) + { + if (centralWidget_.get() == NULL) + { + return; + } + + lastMouseX_ = x; + lastMouseY_ = y; + + bool repaint = false; + + if (mouseTracker_.get() != NULL) + { + mouseTracker_->MouseMove(x, y, displayTouches); + repaint = true; + } + else + { + repaint = centralWidget_->HasRenderMouseOver(); + } + + if (repaint) + { + // The scene must be repainted, notify the observers + NotifyContentChanged(); + } + } + + + void WidgetViewport::MouseEnter() + { + isMouseOver_ = true; + NotifyContentChanged(); + } + + + void WidgetViewport::MouseLeave() + { + isMouseOver_ = false; + + if (mouseTracker_.get() != NULL) + { + mouseTracker_->MouseUp(); + mouseTracker_.reset(NULL); + } + + NotifyContentChanged(); + } + + + void WidgetViewport::MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + if (centralWidget_.get() != NULL && + mouseTracker_.get() == NULL) + { + centralWidget_->MouseWheel(direction, x, y, modifiers); + } + } + + + void WidgetViewport::KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) + { + if (centralWidget_.get() != NULL && + mouseTracker_.get() == NULL) + { + centralWidget_->KeyPressed(key, keyChar, modifiers); + } + } + + + bool WidgetViewport::HasAnimation() + { + if (centralWidget_.get() != NULL) + { + return centralWidget_->HasAnimation(); + } + else + { + return false; + } + } + + + void WidgetViewport::DoAnimation() + { + if (centralWidget_.get() != NULL) + { + centralWidget_->DoAnimation(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Viewport/WidgetViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Viewport/WidgetViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IViewport.h" +#include "../Widgets/IWidget.h" + +#include + +#include + +namespace Deprecated +{ + class WidgetViewport : public IViewport + { + private: + boost::shared_ptr centralWidget_; + IStatusBar* statusBar_; + std::unique_ptr mouseTracker_; + bool isMouseOver_; + int lastMouseX_; + int lastMouseY_; + OrthancStone::CairoSurface background_; + bool backgroundChanged_; + + public: + WidgetViewport(); + + virtual void FitContent(); + + virtual void SetStatusBar(IStatusBar& statusBar); + + void SetCentralWidget(boost::shared_ptr widget); + + virtual void NotifyBackgroundChanged(); + + virtual void SetSize(unsigned int width, + unsigned int height); + + virtual bool Render(Orthanc::ImageAccessor& surface); + + virtual void MouseDown(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& displayTouches); + + virtual void MouseUp(); + + virtual void MouseMove(int x, + int y, + const std::vector& displayTouches); + + virtual void MouseEnter(); + + virtual void MouseLeave(); + + virtual void TouchStart(const std::vector& touches); + + virtual void TouchMove(const std::vector& touches); + + virtual void TouchEnd(const std::vector& touches); + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers); + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers); + + virtual bool HasAnimation(); + + virtual void DoAnimation(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Volumes/ISlicedVolume.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Volumes/ISlicedVolume.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Messages/IObservable.h" +#include "../Toolbox/Slice.h" + +namespace Deprecated +{ + class ISlicedVolume : public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, ISlicedVolume); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, ISlicedVolume); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, ISlicedVolume); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeReadyMessage, ISlicedVolume); + + + class SliceContentChangedMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + size_t sliceIndex_; + const Slice& slice_; + + public: + SliceContentChangedMessage(ISlicedVolume& origin, + size_t sliceIndex, + const Slice& slice) : + OriginMessage(origin), + sliceIndex_(sliceIndex), + slice_(slice) + { + } + + size_t GetSliceIndex() const + { + return sliceIndex_; + } + + const Slice& GetSlice() const + { + return slice_; + } + }; + + + virtual size_t GetSliceCount() const = 0; + + virtual const Slice& GetSlice(size_t slice) const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Volumes/IVolumeLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Volumes/IVolumeLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,35 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Messages/IObservable.h" + +namespace Deprecated +{ + class IVolumeLoader : public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, IVolumeLoader); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryErrorMessage, IVolumeLoader); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, IVolumeLoader); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Volumes/StructureSetLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Volumes/StructureSetLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,156 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "StructureSetLoader.h" + +#include "../Toolbox/MessagingToolbox.h" + +#include + +namespace Deprecated +{ + StructureSetLoader::StructureSetLoader(OrthancApiClient& orthanc) : + orthanc_(orthanc) + { + } + + + void StructureSetLoader::OnReferencedSliceLoaded(const OrthancApiClient::JsonResponseReadyMessage& message) + { + OrthancPlugins::FullOrthancDataset dataset(message.GetJson()); + + Orthanc::DicomMap slice; + MessagingToolbox::ConvertDataset(slice, dataset); + structureSet_->AddReferencedSlice(slice); + + BroadcastMessage(ContentChangedMessage(*this)); + } + + + void StructureSetLoader::OnStructureSetLoaded(const OrthancApiClient::JsonResponseReadyMessage& message) + { + OrthancPlugins::FullOrthancDataset dataset(message.GetJson()); + structureSet_.reset(new OrthancStone::DicomStructureSet(dataset)); + + std::set instances; + structureSet_->GetReferencedInstances(instances); + + for (std::set::const_iterator it = instances.begin(); + it != instances.end(); ++it) + { + orthanc_.PostBinaryAsyncExpectJson("/tools/lookup", *it, + new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnLookupCompleted)); + } + + BroadcastMessage(GeometryReadyMessage(*this)); + } + + + void StructureSetLoader::OnLookupCompleted(const OrthancApiClient::JsonResponseReadyMessage& message) + { + const Json::Value& lookup = message.GetJson(); + + if (lookup.type() != Json::arrayValue || + lookup.size() != 1 || + !lookup[0].isMember("Type") || + !lookup[0].isMember("Path") || + lookup[0]["Type"].type() != Json::stringValue || + lookup[0]["ID"].type() != Json::stringValue || + lookup[0]["Type"].asString() != "Instance") + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + const std::string& instance = lookup[0]["ID"].asString(); + orthanc_.GetJsonAsync("/instances/" + instance + "/tags", + new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnReferencedSliceLoaded)); + } + + + void StructureSetLoader::ScheduleLoadInstance(const std::string& instance) + { + if (structureSet_.get() != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + orthanc_.GetJsonAsync("/instances/" + instance + "/tags?ignore-length=3006-0050", + new DeprecatedCallable(GetSharedObserver(), &StructureSetLoader::OnStructureSetLoaded)); + } + } + + + OrthancStone::DicomStructureSet& StructureSetLoader::GetStructureSet() + { + if (structureSet_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *structureSet_; + } + } + + + OrthancStone::DicomStructureSet* StructureSetLoader::SynchronousLoad( + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId) + { + const std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; + OrthancPlugins::FullOrthancDataset dataset(orthanc, uri); + + std::unique_ptr result + (new OrthancStone::DicomStructureSet(dataset)); + + std::set instances; + result->GetReferencedInstances(instances); + + for (std::set::const_iterator it = instances.begin(); + it != instances.end(); ++it) + { + Json::Value lookup; + MessagingToolbox::RestApiPost(lookup, orthanc, "/tools/lookup", *it); + + if (lookup.type() != Json::arrayValue || + lookup.size() != 1 || + !lookup[0].isMember("Type") || + !lookup[0].isMember("Path") || + lookup[0]["Type"].type() != Json::stringValue || + lookup[0]["ID"].type() != Json::stringValue || + lookup[0]["Type"].asString() != "Instance") + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + + OrthancPlugins::FullOrthancDataset slice + (orthanc, "/instances/" + lookup[0]["ID"].asString() + "/tags"); + Orthanc::DicomMap m; + MessagingToolbox::ConvertDataset(m, slice); + result->AddReferencedSlice(m); + } + + result->CheckReferencedSlices(); + + return result.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Volumes/StructureSetLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Volumes/StructureSetLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Messages/ObserverBase.h" +#include "../../Toolbox/DicomStructureSet.h" +#include "../Toolbox/OrthancApiClient.h" +#include "IVolumeLoader.h" + +#include + +namespace Deprecated +{ + class StructureSetLoader : + public IVolumeLoader, + public OrthancStone::ObserverBase + { + private: + OrthancApiClient& orthanc_; + std::unique_ptr structureSet_; + + void OnReferencedSliceLoaded(const OrthancApiClient::JsonResponseReadyMessage& message); + + void OnStructureSetLoaded(const OrthancApiClient::JsonResponseReadyMessage& message); + + void OnLookupCompleted(const OrthancApiClient::JsonResponseReadyMessage& message); + + public: + StructureSetLoader(OrthancApiClient& orthanc); + + void ScheduleLoadInstance(const std::string& instance); + + bool HasStructureSet() const + { + return structureSet_.get() != NULL; + } + + OrthancStone::DicomStructureSet& GetStructureSet(); + + static OrthancStone::DicomStructureSet* SynchronousLoad( + OrthancPlugins::IOrthancConnection& orthanc, + const std::string& instanceId); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/CairoWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/CairoWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,101 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoWidget.h" + +#include +#include + +namespace Deprecated +{ + static bool IsAligned(const Orthanc::ImageAccessor& target) + { + // TODO + return true; + } + + CairoWidget::CairoWidget(const std::string& name) : + WidgetBase(name) + { + } + + void CairoWidget::SetSize(unsigned int width, + unsigned int height) + { + surface_.SetSize(width, height, false /* no alpha */); + } + + + bool CairoWidget::Render(Orthanc::ImageAccessor& target) + { + // Don't call the base class here, as + // "ClearBackgroundCairo()" is a faster alternative + + if (IsAligned(target)) + { + OrthancStone::CairoSurface surface(target, false /* no alpha */); + OrthancStone::CairoContext context(surface); + ClearBackgroundCairo(context); + return RenderCairo(context); + } + else + { + OrthancStone::CairoContext context(surface_); + ClearBackgroundCairo(context); + + if (RenderCairo(context)) + { + Orthanc::ImageAccessor surface; + surface_.GetReadOnlyAccessor(surface); + Orthanc::ImageProcessing::Copy(target, surface); + return true; + } + else + { + return false; + } + } + } + + + void CairoWidget::RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y) + { + if (IsAligned(target)) + { + OrthancStone::CairoSurface surface(target, false /* no alpha */); + OrthancStone::CairoContext context(surface); + RenderMouseOverCairo(context, x, y); + } + else + { + Orthanc::ImageAccessor accessor; + surface_.GetWriteableAccessor(accessor); + Orthanc::ImageProcessing::Copy(accessor, target); + + OrthancStone::CairoContext context(surface_); + RenderMouseOverCairo(context, x, y); + + Orthanc::ImageProcessing::Copy(target, accessor); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/CairoWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/CairoWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WidgetBase.h" + +namespace Deprecated +{ + class CairoWidget : public WidgetBase + { + private: + OrthancStone::CairoSurface surface_; + + protected: + virtual bool RenderCairo(OrthancStone::CairoContext& context) = 0; + + virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, + int x, + int y) = 0; + + public: + CairoWidget(const std::string& name); + + virtual void SetSize(unsigned int width, + unsigned int height); + + virtual bool Render(Orthanc::ImageAccessor& target); + + virtual void RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/EmptyWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/EmptyWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,41 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "EmptyWidget.h" + +#include +#include + +namespace Deprecated +{ + bool EmptyWidget::Render(Orthanc::ImageAccessor& surface) + { + // Note: This call is slow + Orthanc::ImageProcessing::Set(surface, red_, green_, blue_, 255); + return true; + } + + + void EmptyWidget::DoAnimation() + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/EmptyWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/EmptyWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,116 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IWidget.h" + +namespace Deprecated +{ + /** + * This is a test widget that simply fills its surface with an + * uniform color. + **/ + class EmptyWidget : public IWidget + { + private: + uint8_t red_; + uint8_t green_; + uint8_t blue_; + + public: + EmptyWidget(uint8_t red, + uint8_t green, + uint8_t blue) : + red_(red), + green_(green), + blue_(blue) + { + } + + virtual void FitContent() + { + } + + virtual void SetParent(IWidget& widget) + { + } + + virtual void SetViewport(WidgetViewport& viewport) + { + } + + virtual void NotifyContentChanged() + { + } + + virtual void SetStatusBar(IStatusBar& statusBar) + { + } + + virtual void SetSize(unsigned int width, + unsigned int height) + { + } + + virtual bool Render(Orthanc::ImageAccessor& surface); + + virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) + { + return NULL; + } + + virtual void RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y) + { + } + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + } + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) + { + } + + virtual bool HasAnimation() const + { + return false; + } + + virtual void DoAnimation(); + + virtual bool HasRenderMouseOver() + { + return false; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/IWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/IWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,81 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../StoneEnumerations.h" +#include "../Viewport/IMouseTracker.h" +#include "../Viewport/IStatusBar.h" + +namespace Deprecated +{ + class WidgetViewport; // Forward declaration + + class IWidget : public boost::noncopyable + { + public: + virtual ~IWidget() + { + } + + virtual void FitContent() = 0; + + virtual void SetParent(IWidget& parent) = 0; + + virtual void SetViewport(WidgetViewport& viewport) = 0; + + virtual void SetStatusBar(IStatusBar& statusBar) = 0; + + virtual void SetSize(unsigned int width, + unsigned int height) = 0; + + virtual bool Render(Orthanc::ImageAccessor& surface) = 0; + + virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) = 0; + + virtual void RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y) = 0; + + virtual bool HasRenderMouseOver() = 0; + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) = 0; + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) = 0; + + virtual bool HasAnimation() const = 0; + + virtual void DoAnimation() = 0; + + // Subclasses can call this method to signal the display of the + // widget must be refreshed + virtual void NotifyContentChanged() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/IWorldSceneInteractor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/IWorldSceneInteractor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,70 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IWorldSceneMouseTracker.h" + +#include "../Toolbox/ViewportGeometry.h" +#include "../../StoneEnumerations.h" +#include "../Viewport/IStatusBar.h" + +namespace Deprecated +{ + class WorldSceneWidget; + + class IWorldSceneInteractor : public boost::noncopyable + { + public: + virtual ~IWorldSceneInteractor() + { + } + + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const ViewportGeometry& view, + OrthancStone::MouseButton button, + OrthancStone::KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + IStatusBar* statusBar, + const std::vector& touches) = 0; + + virtual void MouseOver(OrthancStone::CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) = 0; + + virtual void MouseWheel(WorldSceneWidget& widget, + OrthancStone::MouseWheelDirection direction, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) = 0; + + virtual void KeyPressed(WorldSceneWidget& widget, + OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/IWorldSceneMouseTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/IWorldSceneMouseTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoContext.h" +#include "../Viewport/IMouseTracker.h" // only to get the "Touch" definition + +namespace Deprecated +{ + + // this is tracking a mouse in scene coordinates/mm unlike + // the IMouseTracker that is tracking a mouse + // in screen coordinates/pixels. + class IWorldSceneMouseTracker : public boost::noncopyable + { + public: + virtual ~IWorldSceneMouseTracker() + { + } + + virtual bool HasRender() const = 0; + + virtual void Render(OrthancStone::CairoContext& context, + double zoom) = 0; + + virtual void MouseUp() = 0; + + virtual void MouseMove(int displayX, + int displayY, + double sceneX, + double sceneY, + const std::vector& displayTouches, + const std::vector& sceneTouches) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/LayoutWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/LayoutWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,501 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LayoutWidget.h" + +#include +#include + +#include + +namespace Deprecated +{ + class LayoutWidget::LayoutMouseTracker : public IMouseTracker + { + private: + std::unique_ptr tracker_; + int left_; + int top_; + unsigned int width_; + unsigned int height_; + + public: + LayoutMouseTracker(IMouseTracker* tracker, + int left, + int top, + unsigned int width, + unsigned int height) : + tracker_(tracker), + left_(left), + top_(top), + width_(width), + height_(height) + { + if (tracker == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + virtual void Render(Orthanc::ImageAccessor& surface) + { + Orthanc::ImageAccessor accessor; + surface.GetRegion(accessor, left_, top_, width_, height_); + tracker_->Render(accessor); + } + + virtual void MouseUp() + { + tracker_->MouseUp(); + } + + virtual void MouseMove(int x, + int y, + const std::vector& displayTouches) + { + std::vector relativeTouches; + for (size_t t = 0; t < displayTouches.size(); t++) + { + relativeTouches.push_back(Touch(displayTouches[t].x - left_, displayTouches[t].y - top_)); + } + + tracker_->MouseMove(x - left_, y - top_, relativeTouches); + } + }; + + + class LayoutWidget::ChildWidget : public boost::noncopyable + { + private: + boost::shared_ptr widget_; + int left_; + int top_; + unsigned int width_; + unsigned int height_; + + public: + ChildWidget(boost::shared_ptr widget) : + widget_(widget) + { + assert(widget != NULL); + SetEmpty(); + } + + void DoAnimation() + { + if (widget_->HasAnimation()) + { + widget_->DoAnimation(); + } + } + + IWidget& GetWidget() const + { + return *widget_; + } + + void SetRectangle(unsigned int left, + unsigned int top, + unsigned int width, + unsigned int height) + { + left_ = left; + top_ = top; + width_ = width; + height_ = height; + + widget_->SetSize(width, height); + } + + void SetEmpty() + { + SetRectangle(0, 0, 0, 0); + } + + bool Contains(int x, + int y) const + { + return (x >= left_ && + y >= top_ && + x < left_ + static_cast(width_) && + y < top_ + static_cast(height_)); + } + + bool Render(Orthanc::ImageAccessor& target) + { + if (width_ == 0 || + height_ == 0) + { + return true; + } + else + { + Orthanc::ImageAccessor accessor; + target.GetRegion(accessor, left_, top_, width_, height_); + return widget_->Render(accessor); + } + } + + IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) + { + if (Contains(x, y)) + { + IMouseTracker* tracker = widget_->CreateMouseTracker(button, + x - left_, + y - top_, + modifiers, + touches); + if (tracker) + { + return new LayoutMouseTracker(tracker, left_, top_, width_, height_); + } + } + + return NULL; + } + + void RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y) + { + if (Contains(x, y)) + { + Orthanc::ImageAccessor accessor; + target.GetRegion(accessor, left_, top_, width_, height_); + + widget_->RenderMouseOver(accessor, x - left_, y - top_); + } + } + + void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + if (Contains(x, y)) + { + widget_->MouseWheel(direction, x - left_, y - top_, modifiers); + } + } + + bool HasRenderMouseOver() + { + return widget_->HasRenderMouseOver(); + } + }; + + + void LayoutWidget::ComputeChildrenExtents() + { + if (children_.size() == 0) + { + return; + } + + float internal = static_cast(paddingInternal_); + + if (width_ <= paddingLeft_ + paddingRight_ || + height_ <= paddingTop_ + paddingBottom_) + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->SetEmpty(); + } + } + else if (isHorizontal_) + { + unsigned int padding = paddingLeft_ + paddingRight_ + (static_cast(children_.size()) - 1) * paddingInternal_; + float childWidth = ((static_cast(width_) - static_cast(padding)) / + static_cast(children_.size())); + + for (size_t i = 0; i < children_.size(); i++) + { + float left = static_cast(paddingLeft_) + static_cast(i) * (childWidth + internal); + float right = left + childWidth; + + if (left >= right) + { + children_[i]->SetEmpty(); + } + else + { + children_[i]->SetRectangle(static_cast(left), + paddingTop_, + boost::math::iround(right - left), + height_ - paddingTop_ - paddingBottom_); + } + } + } + else + { + unsigned int padding = paddingTop_ + paddingBottom_ + (static_cast(children_.size()) - 1) * paddingInternal_; + float childHeight = ((static_cast(height_) - static_cast(padding)) / + static_cast(children_.size())); + + for (size_t i = 0; i < children_.size(); i++) + { + float top = static_cast(paddingTop_) + static_cast(i) * (childHeight + internal); + float bottom = top + childHeight; + + if (top >= bottom) + { + children_[i]->SetEmpty(); + } + else + { + children_[i]->SetRectangle(paddingTop_, + static_cast(top), + width_ - paddingLeft_ - paddingRight_, + boost::math::iround(bottom - top)); + } + } + } + + NotifyContentChanged(*this); + } + + + LayoutWidget::LayoutWidget(const std::string& name) : + WidgetBase(name), + isHorizontal_(true), + width_(0), + height_(0), + paddingLeft_(0), + paddingTop_(0), + paddingRight_(0), + paddingBottom_(0), + paddingInternal_(0) + { + } + + + LayoutWidget::~LayoutWidget() + { + for (size_t i = 0; i < children_.size(); i++) + { + delete children_[i]; + } + } + + + void LayoutWidget::FitContent() + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->GetWidget().FitContent(); + } + } + + + void LayoutWidget::NotifyContentChanged(const IWidget& widget) + { + // One of the children has changed + WidgetBase::NotifyContentChanged(); + } + + + void LayoutWidget::SetHorizontal() + { + isHorizontal_ = true; + ComputeChildrenExtents(); + } + + + void LayoutWidget::SetVertical() + { + isHorizontal_ = false; + ComputeChildrenExtents(); + } + + + void LayoutWidget::SetPadding(unsigned int left, + unsigned int top, + unsigned int right, + unsigned int bottom, + unsigned int spacing) + { + paddingLeft_ = left; + paddingTop_ = top; + paddingRight_ = right; + paddingBottom_ = bottom; + paddingInternal_ = spacing; + } + + + void LayoutWidget::SetPadding(unsigned int padding) + { + paddingLeft_ = padding; + paddingTop_ = padding; + paddingRight_ = padding; + paddingBottom_ = padding; + paddingInternal_ = padding; + } + + + void LayoutWidget::AddWidget(boost::shared_ptr widget) // Takes ownership + { + if (widget == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (GetStatusBar() != NULL) + { + widget->SetStatusBar(*GetStatusBar()); + } + + children_.push_back(new ChildWidget(widget)); + widget->SetParent(*this); + + ComputeChildrenExtents(); + + if (widget->HasAnimation()) + { + hasAnimation_ = true; + } + } + + + void LayoutWidget::SetStatusBar(IStatusBar& statusBar) + { + WidgetBase::SetStatusBar(statusBar); + + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->GetWidget().SetStatusBar(statusBar); + } + } + + + void LayoutWidget::SetSize(unsigned int width, + unsigned int height) + { + width_ = width; + height_ = height; + ComputeChildrenExtents(); + } + + + bool LayoutWidget::Render(Orthanc::ImageAccessor& surface) + { + if (!WidgetBase::Render(surface)) + { + return false; + } + + for (size_t i = 0; i < children_.size(); i++) + { + if (!children_[i]->Render(surface)) + { + return false; + } + } + + return true; + } + + + IMouseTracker* LayoutWidget::CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) + { + for (size_t i = 0; i < children_.size(); i++) + { + IMouseTracker* tracker = children_[i]->CreateMouseTracker(button, x, y, modifiers, touches); + if (tracker != NULL) + { + return tracker; + } + } + + return NULL; + } + + + void LayoutWidget::RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y) + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->RenderMouseOver(target, x, y); + } + } + + + void LayoutWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->MouseWheel(direction, x, y, modifiers); + } + } + + + void LayoutWidget::KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->GetWidget().KeyPressed(key, keyChar, modifiers); + } + } + + + void LayoutWidget::DoAnimation() + { + if (hasAnimation_) + { + for (size_t i = 0; i < children_.size(); i++) + { + children_[i]->DoAnimation(); + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + bool LayoutWidget::HasRenderMouseOver() + { + for (size_t i = 0; i < children_.size(); i++) + { + if (children_[i]->HasRenderMouseOver()) + { + return true; + } + } + + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/LayoutWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/LayoutWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,134 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WidgetBase.h" + +#include +#include + +namespace Deprecated +{ + class LayoutWidget : public WidgetBase + { + private: + class LayoutMouseTracker; + class ChildWidget; + + std::vector children_; + bool isHorizontal_; + unsigned int width_; + unsigned int height_; + std::unique_ptr mouseTracker_; + unsigned int paddingLeft_; + unsigned int paddingTop_; + unsigned int paddingRight_; + unsigned int paddingBottom_; + unsigned int paddingInternal_; + bool hasAnimation_; + + void ComputeChildrenExtents(); + + public: + LayoutWidget(const std::string& name); + + virtual ~LayoutWidget(); + + virtual void FitContent(); + + virtual void NotifyContentChanged(const IWidget& widget); + + void SetHorizontal(); + + void SetVertical(); + + void SetPadding(unsigned int left, + unsigned int top, + unsigned int right, + unsigned int bottom, + unsigned int spacing); + + void SetPadding(unsigned int padding); + + unsigned int GetPaddingLeft() const + { + return paddingLeft_; + } + + unsigned int GetPaddingTop() const + { + return paddingTop_; + } + + unsigned int GetPaddingRight() const + { + return paddingRight_; + } + + unsigned int GetPaddingBottom() const + { + return paddingBottom_; + } + + unsigned int GetPaddingInternal() const + { + return paddingInternal_; + } + + void AddWidget(boost::shared_ptr widget); + + virtual void SetStatusBar(IStatusBar& statusBar); + + virtual void SetSize(unsigned int width, + unsigned int height); + + virtual bool Render(Orthanc::ImageAccessor& surface); + + virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches); + + virtual void RenderMouseOver(Orthanc::ImageAccessor& target, + int x, + int y); + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers); + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers); + + virtual bool HasAnimation() const + { + return hasAnimation_; + } + + virtual void DoAnimation(); + + virtual bool HasRenderMouseOver(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/PanMouseTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/PanMouseTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "PanMouseTracker.h" + +#include +#include + +namespace Deprecated +{ + PanMouseTracker::PanMouseTracker(WorldSceneWidget& that, + int x, + int y) : + that_(that) + { + that.GetView().GetPan(originalPanX_, originalPanY_); + that.GetView().MapPixelCenterToScene(downX_, downY_, x, y); + } + + + void PanMouseTracker::Render(OrthancStone::CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void PanMouseTracker::MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + ViewportGeometry view = that_.GetView(); + view.SetPan(originalPanX_ + (x - downX_) * view.GetZoom(), + originalPanY_ + (y - downY_) * view.GetZoom()); + that_.SetView(view); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/PanMouseTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/PanMouseTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WorldSceneWidget.h" + +namespace Deprecated +{ + class PanMouseTracker : public IWorldSceneMouseTracker + { + private: + WorldSceneWidget& that_; + double originalPanX_; + double originalPanY_; + double downX_; + double downY_; + + public: + PanMouseTracker(WorldSceneWidget& that, + int x, + int y); + + virtual bool HasRender() const + { + return false; + } + + virtual void MouseUp() + { + } + + virtual void Render(OrthancStone::CairoContext& context, + double zoom); + + virtual void MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/PanZoomMouseTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/PanZoomMouseTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "PanZoomMouseTracker.h" + +#include +#include +#include + +namespace Deprecated +{ + Touch GetCenter(const std::vector& touches) + { + return Touch((touches[0].x + touches[1].x) / 2.0f, (touches[0].y + touches[1].y) / 2.0f); + } + + double GetDistance(const std::vector& touches) + { + float dx = touches[0].x - touches[1].x; + float dy = touches[0].y - touches[1].y; + return sqrt((double)(dx * dx) + (double)(dy * dy)); + } + + + PanZoomMouseTracker::PanZoomMouseTracker(WorldSceneWidget& that, + const std::vector& startTouches) + : that_(that), + originalZoom_(that.GetView().GetZoom()) + { + that.GetView().GetPan(originalPanX_, originalPanY_); + that.GetView().MapPixelCenterToScene(originalSceneTouches_, startTouches); + + originalDisplayCenter_ = GetCenter(startTouches); + originalSceneCenter_ = GetCenter(originalSceneTouches_); + originalDisplayDistanceBetweenTouches_ = GetDistance(startTouches); + +// printf("original Pan %f %f\n", originalPanX_, originalPanY_); +// printf("original Zoom %f \n", originalZoom_); +// printf("original distance %f \n", (float)originalDisplayDistanceBetweenTouches_); +// printf("original display touches 0 %f %f\n", startTouches[0].x, startTouches[0].y); +// printf("original display touches 1 %f %f\n", startTouches[1].x, startTouches[1].y); +// printf("original Scene center %f %f\n", originalSceneCenter_.x, originalSceneCenter_.y); + + unsigned int height = that.GetView().GetDisplayHeight(); + + if (height <= 3) + { + idle_ = true; + LOG(WARNING) << "image is too small to zoom (current height = " << height << ")"; + } + else + { + idle_ = false; + normalization_ = 1.0 / static_cast(height - 1); + } + + } + + + void PanZoomMouseTracker::Render(OrthancStone::CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void PanZoomMouseTracker::MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + ViewportGeometry view = that_.GetView(); + +// printf("Display touches 0 %f %f\n", displayTouches[0].x, displayTouches[0].y); +// printf("Display touches 1 %f %f\n", displayTouches[1].x, displayTouches[1].y); +// printf("Scene touches 0 %f %f\n", sceneTouches[0].x, sceneTouches[0].y); +// printf("Scene touches 1 %f %f\n", sceneTouches[1].x, sceneTouches[1].y); + +// printf("zoom = %f\n", view.GetZoom()); + Touch currentSceneCenter = GetCenter(sceneTouches); + double panX = originalPanX_ + (currentSceneCenter.x - originalSceneCenter_.x) * view.GetZoom(); + double panY = originalPanY_ + (currentSceneCenter.y - originalSceneCenter_.y) * view.GetZoom(); + + view.SetPan(panX, panY); + + static const double MIN_ZOOM = -4; + static const double MAX_ZOOM = 4; + + if (!idle_) + { + double currentDistanceBetweenTouches = GetDistance(displayTouches); + + double dy = static_cast(currentDistanceBetweenTouches - originalDisplayDistanceBetweenTouches_) * normalization_; // In the range [-1,1] + double z; + + // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] + if (dy < -1.0) + { + z = MIN_ZOOM; + } + else if (dy > 1.0) + { + z = MAX_ZOOM; + } + else + { + z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; + } + + z = pow(2.0, z); + + view.SetZoom(z * originalZoom_); + } + + that_.SetView(view); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/PanZoomMouseTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/PanZoomMouseTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,65 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WorldSceneWidget.h" + +namespace Deprecated +{ + class PanZoomMouseTracker : public IWorldSceneMouseTracker + { + private: + WorldSceneWidget& that_; + std::vector originalSceneTouches_; + Touch originalSceneCenter_; + Touch originalDisplayCenter_; + double originalPanX_; + double originalPanY_; + double originalZoom_; + double originalDisplayDistanceBetweenTouches_; + bool idle_; + double normalization_; + + public: + PanZoomMouseTracker(WorldSceneWidget& that, + const std::vector& startTouches); + + virtual bool HasRender() const + { + return false; + } + + virtual void MouseUp() + { + } + + virtual void Render(OrthancStone::CairoContext& context, + double zoom); + + virtual void MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/SliceViewerWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/SliceViewerWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,616 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SliceViewerWidget.h" + +#include "../Layers/SliceOutlineRenderer.h" +#include "../../Toolbox/GeometryToolbox.h" +#include "../Layers/FrameRenderer.h" + +#include +#include + +#include + + +static const double THIN_SLICE_THICKNESS = 100.0 * std::numeric_limits::epsilon(); + +namespace Deprecated +{ + void SliceViewerWidget::Scene::DeleteLayer(size_t index) + { + if (index >= renderers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + assert(countMissing_ <= renderers_.size()); + + if (renderers_[index] != NULL) + { + assert(countMissing_ < renderers_.size()); + delete renderers_[index]; + renderers_[index] = NULL; + countMissing_++; + } + } + + + SliceViewerWidget::Scene::Scene(const OrthancStone::CoordinateSystem3D& plane, + double thickness, + size_t countLayers) : + plane_(plane), + thickness_(thickness), + countMissing_(countLayers), + renderers_(countLayers, NULL) + { + if (thickness <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + SliceViewerWidget::Scene::~Scene() + { + for (size_t i = 0; i < renderers_.size(); i++) + { + DeleteLayer(i); + } + } + + void SliceViewerWidget::Scene::SetLayer(size_t index, + ILayerRenderer* renderer) // Takes ownership + { + if (renderer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + DeleteLayer(index); + + renderers_[index] = renderer; + countMissing_--; + } + + + bool SliceViewerWidget::Scene::RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view, + const OrthancStone::CoordinateSystem3D& viewportPlane) + { + bool fullQuality = true; + cairo_t *cr = context.GetObject(); + + for (size_t i = 0; i < renderers_.size(); i++) + { + if (renderers_[i] != NULL) + { + const OrthancStone::CoordinateSystem3D& framePlane = renderers_[i]->GetLayerPlane(); + + double x0, y0, x1, y1, x2, y2; + viewportPlane.ProjectPoint(x0, y0, framePlane.GetOrigin()); + viewportPlane.ProjectPoint(x1, y1, framePlane.GetOrigin() + framePlane.GetAxisX()); + viewportPlane.ProjectPoint(x2, y2, framePlane.GetOrigin() + framePlane.GetAxisY()); + + /** + * Now we solve the system of linear equations Ax + b = x', given: + * A [0 ; 0] + b = [x0 ; y0] + * A [1 ; 0] + b = [x1 ; y1] + * A [0 ; 1] + b = [x2 ; y2] + * <=> + * b = [x0 ; y0] + * A [1 ; 0] = [x1 ; y1] - b = [x1 - x0 ; y1 - y0] + * A [0 ; 1] = [x2 ; y2] - b = [x2 - x0 ; y2 - y0] + * <=> + * b = [x0 ; y0] + * [a11 ; a21] = [x1 - x0 ; y1 - y0] + * [a12 ; a22] = [x2 - x0 ; y2 - y0] + **/ + + cairo_matrix_t transform; + cairo_matrix_init(&transform, x1 - x0, y1 - y0, x2 - x0, y2 - y0, x0, y0); + + cairo_save(cr); + cairo_transform(cr, &transform); + + if (!renderers_[i]->RenderLayer(context, view)) + { + cairo_restore(cr); + return false; + } + + cairo_restore(cr); + } + + if (renderers_[i] != NULL && + !renderers_[i]->IsFullQuality()) + { + fullQuality = false; + } + } + + if (!fullQuality) + { + double x, y; + view.MapDisplayToScene(x, y, static_cast(view.GetDisplayWidth()) / 2.0, 10); + + cairo_translate(cr, x, y); + +#if 1 + double s = 5.0 / view.GetZoom(); + cairo_rectangle(cr, -s, -s, 2.0 * s, 2.0 * s); +#else + // TODO Drawing filled circles makes WebAssembly crash! + cairo_arc(cr, 0, 0, 5.0 / view.GetZoom(), 0, 2.0 * boost::math::constants::pi()); +#endif + + cairo_set_line_width(cr, 2.0 / view.GetZoom()); + cairo_set_source_rgb(cr, 1, 1, 1); + cairo_stroke_preserve(cr); + cairo_set_source_rgb(cr, 1, 0, 0); + cairo_fill(cr); + } + + return true; + } + + void SliceViewerWidget::Scene::SetLayerStyle(size_t index, + const RenderStyle& style) + { + if (renderers_[index] != NULL) + { + renderers_[index]->SetLayerStyle(style); + } + } + + bool SliceViewerWidget::Scene::ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const + { + bool isOpposite; + if (!OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, + plane.GetNormal(), + plane_.GetNormal())) + { + return false; + } + else + { + double z = (plane_.ProjectAlongNormal(plane.GetOrigin()) - + plane_.ProjectAlongNormal(plane_.GetOrigin())); + + if (z < 0) + { + z = -z; + } + + return z <= thickness_; + } + } + + + bool SliceViewerWidget::LookupLayer(size_t& index /* out */, + const IVolumeSlicer& layer) const + { + LayersIndex::const_iterator found = layersIndex_.find(&layer); + + if (found == layersIndex_.end()) + { + return false; + } + else + { + index = found->second; + assert(index < layers_.size() && + layers_[index].get() == &layer); + return true; + } + } + + + void SliceViewerWidget::GetLayerExtent(OrthancStone::Extent2D& extent, + IVolumeSlicer& source) const + { + extent.Reset(); + + std::vector points; + if (source.GetExtent(points, plane_)) + { + for (size_t i = 0; i < points.size(); i++) + { + double x, y; + plane_.ProjectPoint(x, y, points[i]); + extent.AddPoint(x, y); + } + } + } + + + OrthancStone::Extent2D SliceViewerWidget::GetSceneExtent() + { + OrthancStone::Extent2D sceneExtent; + + for (size_t i = 0; i < layers_.size(); i++) + { + assert(layers_[i] != NULL); + OrthancStone::Extent2D layerExtent; + GetLayerExtent(layerExtent, *layers_[i]); + + sceneExtent.Union(layerExtent); + } + + return sceneExtent; + } + + + bool SliceViewerWidget::RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + if (currentScene_.get() != NULL) + { + return currentScene_->RenderScene(context, view, plane_); + } + else + { + return true; + } + } + + + void SliceViewerWidget::ResetPendingScene() + { + double thickness; + if (pendingScene_.get() == NULL) + { + thickness = 1.0; + } + else + { + thickness = pendingScene_->GetThickness(); + } + + pendingScene_.reset(new Scene(plane_, thickness, layers_.size())); + } + + + void SliceViewerWidget::UpdateLayer(size_t index, + ILayerRenderer* renderer, + const OrthancStone::CoordinateSystem3D& plane) + { + LOG(INFO) << "Updating layer " << index; + + std::unique_ptr tmp(renderer); + + if (renderer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (index >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + assert(layers_.size() == styles_.size()); + renderer->SetLayerStyle(styles_[index]); + + if (currentScene_.get() != NULL && + currentScene_->ContainsPlane(plane)) + { + currentScene_->SetLayer(index, tmp.release()); + NotifyContentChanged(); + } + else if (pendingScene_.get() != NULL && + pendingScene_->ContainsPlane(plane)) + { + pendingScene_->SetLayer(index, tmp.release()); + + if (currentScene_.get() == NULL || + !currentScene_->IsComplete() || + pendingScene_->IsComplete()) + { +#if __cplusplus < 201103L + currentScene_.reset(pendingScene_.release()); +#else + currentScene_ = std::move(pendingScene_); +#endif + + NotifyContentChanged(); + } + } + } + + + SliceViewerWidget::SliceViewerWidget(const std::string& name) : + WorldSceneWidget(name), + started_(false) + { + SetBackgroundCleared(true); + } + + + void SliceViewerWidget::ObserveLayer(IVolumeSlicer& layer) + { + // currently ignoring errors of type IVolumeSlicer::GeometryErrorMessage + + Register(layer, &SliceViewerWidget::OnGeometryReady); + Register(layer, &SliceViewerWidget::OnSliceChanged); + Register(layer, &SliceViewerWidget::OnContentChanged); + Register(layer, &SliceViewerWidget::OnLayerReady); + Register(layer, &SliceViewerWidget::OnLayerError); + } + + + size_t SliceViewerWidget::AddLayer(boost::shared_ptr layer) + { + if (layer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + size_t index = layers_.size(); + layers_.push_back(layer); + styles_.push_back(RenderStyle()); + layersIndex_[layer.get()] = index; + + ResetPendingScene(); + + ObserveLayer(*layer); + + ResetChangedLayers(); + + return index; + } + + + void SliceViewerWidget::ReplaceLayer(size_t index, + boost::shared_ptr layer) + { + if (layer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (index >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + layers_[index] = layer; + layersIndex_[layer.get()] = index; + + ResetPendingScene(); + + ObserveLayer(*layer); + + InvalidateLayer(index); + } + + + void SliceViewerWidget::RemoveLayer(size_t index) + { + if (index >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + IVolumeSlicer* previousLayer = layers_[index].get(); + layersIndex_.erase(layersIndex_.find(previousLayer)); + layers_.erase(layers_.begin() + index); + changedLayers_.erase(changedLayers_.begin() + index); + styles_.erase(styles_.begin() + index); + + layers_[index].reset(); + + currentScene_->DeleteLayer(index); + ResetPendingScene(); + + NotifyContentChanged(); + } + + + const RenderStyle& SliceViewerWidget::GetLayerStyle(size_t layer) const + { + if (layer >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + assert(layers_.size() == styles_.size()); + return styles_[layer]; + } + + + void SliceViewerWidget::SetLayerStyle(size_t layer, + const RenderStyle& style) + { + if (layer >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + assert(layers_.size() == styles_.size()); + styles_[layer] = style; + + if (currentScene_.get() != NULL) + { + currentScene_->SetLayerStyle(layer, style); + } + + if (pendingScene_.get() != NULL) + { + pendingScene_->SetLayerStyle(layer, style); + } + + NotifyContentChanged(); + } + + + void SliceViewerWidget::SetSlice(const OrthancStone::CoordinateSystem3D& plane) + { + LOG(INFO) << "Setting slice origin: (" << plane.GetOrigin()[0] + << "," << plane.GetOrigin()[1] + << "," << plane.GetOrigin()[2] << ")"; + + Deprecated::Slice displayedSlice(plane_, THIN_SLICE_THICKNESS); + + //if (!displayedSlice.ContainsPlane(slice)) + { + if (currentScene_.get() == NULL || + (pendingScene_.get() != NULL && + pendingScene_->IsComplete())) + { +#if __cplusplus < 201103L + currentScene_.reset(pendingScene_.release()); +#else + currentScene_ = std::move(pendingScene_); +#endif + } + + plane_ = plane; + ResetPendingScene(); + + InvalidateAllLayers(); // TODO Removing this line avoid loading twice the image in WASM + } + + BroadcastMessage(DisplayedSliceMessage(*this, displayedSlice)); + } + + + void SliceViewerWidget::OnGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) + { + size_t i; + if (LookupLayer(i, message.GetOrigin())) + { + LOG(INFO) << ": Geometry ready for layer " << i << " in " << GetName(); + + changedLayers_[i] = true; + //layers_[i]->ScheduleLayerCreation(plane_); + } + BroadcastMessage(GeometryChangedMessage(*this)); + } + + + void SliceViewerWidget::InvalidateAllLayers() + { + for (size_t i = 0; i < layers_.size(); i++) + { + assert(layers_[i] != NULL); + changedLayers_[i] = true; + + //layers_[i]->ScheduleLayerCreation(plane_); + } + } + + + void SliceViewerWidget::InvalidateLayer(size_t layer) + { + if (layer >= layers_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + assert(layers_[layer] != NULL); + changedLayers_[layer] = true; + + //layers_[layer]->ScheduleLayerCreation(plane_); + } + + + void SliceViewerWidget::OnContentChanged(const IVolumeSlicer::ContentChangedMessage& message) + { + size_t index; + if (LookupLayer(index, message.GetOrigin())) + { + InvalidateLayer(index); + } + + BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); + } + + + void SliceViewerWidget::OnSliceChanged(const IVolumeSlicer::SliceContentChangedMessage& message) + { + if (message.GetSlice().ContainsPlane(plane_)) + { + size_t index; + if (LookupLayer(index, message.GetOrigin())) + { + InvalidateLayer(index); + } + } + + BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); + } + + + void SliceViewerWidget::OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message) + { + size_t index; + if (LookupLayer(index, message.GetOrigin())) + { + LOG(INFO) << "Renderer ready for layer " << index; + UpdateLayer(index, message.CreateRenderer(), message.GetSlice()); + } + + BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); + } + + + void SliceViewerWidget::OnLayerError(const IVolumeSlicer::LayerErrorMessage& message) + { + size_t index; + if (LookupLayer(index, message.GetOrigin())) + { + LOG(ERROR) << "Using error renderer on layer " << index; + + // TODO + //UpdateLayer(index, new SliceOutlineRenderer(slice), slice); + + BroadcastMessage(SliceViewerWidget::ContentChangedMessage(*this)); + } + } + + + void SliceViewerWidget::ResetChangedLayers() + { + changedLayers_.resize(layers_.size()); + + for (size_t i = 0; i < changedLayers_.size(); i++) + { + changedLayers_[i] = false; + } + } + + + void SliceViewerWidget::DoAnimation() + { + assert(changedLayers_.size() <= layers_.size()); + + for (size_t i = 0; i < changedLayers_.size(); i++) + { + if (changedLayers_[i]) + { + layers_[i]->ScheduleLayerCreation(plane_); + } + } + + ResetChangedLayers(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/SliceViewerWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/SliceViewerWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,210 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WorldSceneWidget.h" +#include "../Layers/IVolumeSlicer.h" +#include "../../Toolbox/Extent2D.h" +#include "../../Messages/ObserverBase.h" + +#include + +namespace Deprecated +{ + class SliceViewerWidget : + public WorldSceneWidget, + public OrthancStone::ObserverBase, + public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryChangedMessage, SliceViewerWidget); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentChangedMessage, SliceViewerWidget); + + + // TODO - Use this message in ReferenceLineSource + class DisplayedSliceMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Deprecated::Slice& slice_; + + public: + DisplayedSliceMessage(SliceViewerWidget& origin, + const Deprecated::Slice& slice) : + OriginMessage(origin), + slice_(slice) + { + } + + const Deprecated::Slice& GetSlice() const + { + return slice_; + } + }; + + private: + SliceViewerWidget(const SliceViewerWidget&); + SliceViewerWidget& operator=(const SliceViewerWidget&); + + class Scene : public boost::noncopyable + { + private: + OrthancStone::CoordinateSystem3D plane_; + double thickness_; + size_t countMissing_; + std::vector renderers_; + + public: + void DeleteLayer(size_t index); + + Scene(const OrthancStone::CoordinateSystem3D& plane, + double thickness, + size_t countLayers); + + ~Scene(); + + void SetLayer(size_t index, + ILayerRenderer* renderer); // Takes ownership + + const OrthancStone::CoordinateSystem3D& GetPlane() const + { + return plane_; + } + + bool HasRenderer(size_t index) + { + return renderers_[index] != NULL; + } + + bool IsComplete() const + { + return countMissing_ == 0; + } + + unsigned int GetCountMissing() const + { + return static_cast(countMissing_); + } + + bool RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view, + const OrthancStone::CoordinateSystem3D& viewportPlane); + + void SetLayerStyle(size_t index, + const RenderStyle& style); + + bool ContainsPlane(const OrthancStone::CoordinateSystem3D& plane) const; + + double GetThickness() const + { + return thickness_; + } + }; + + + typedef std::map LayersIndex; + + bool started_; + LayersIndex layersIndex_; + std::vector > layers_; + std::vector styles_; + OrthancStone::CoordinateSystem3D plane_; + std::unique_ptr currentScene_; + std::unique_ptr pendingScene_; + std::vector changedLayers_; + + bool LookupLayer(size_t& index /* out */, + const IVolumeSlicer& layer) const; + + void GetLayerExtent(OrthancStone::Extent2D& extent, + IVolumeSlicer& source) const; + + void OnGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message); + + virtual void OnContentChanged(const IVolumeSlicer::ContentChangedMessage& message); + + virtual void OnSliceChanged(const IVolumeSlicer::SliceContentChangedMessage& message); + + virtual void OnLayerReady(const IVolumeSlicer::LayerReadyMessage& message); + + virtual void OnLayerError(const IVolumeSlicer::LayerErrorMessage& message); + + void ObserveLayer(IVolumeSlicer& source); + + void ResetChangedLayers(); + + public: + SliceViewerWidget(const std::string& name); + + virtual OrthancStone::Extent2D GetSceneExtent(); + + protected: + virtual bool RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view); + + void ResetPendingScene(); + + void UpdateLayer(size_t index, + ILayerRenderer* renderer, + const OrthancStone::CoordinateSystem3D& plane); + + void InvalidateAllLayers(); + + void InvalidateLayer(size_t layer); + + public: + virtual ~SliceViewerWidget() + { + } + + size_t AddLayer(boost::shared_ptr layer); + + void ReplaceLayer(size_t layerIndex, boost::shared_ptr layer); // Takes ownership + + void RemoveLayer(size_t layerIndex); + + size_t GetLayerCount() const + { + return layers_.size(); + } + + const RenderStyle& GetLayerStyle(size_t layer) const; + + void SetLayerStyle(size_t layer, + const RenderStyle& style); + + void SetSlice(const OrthancStone::CoordinateSystem3D& plane); + + const OrthancStone::CoordinateSystem3D& GetSlice() const + { + return plane_; + } + + virtual bool HasAnimation() const + { + return true; + } + + virtual void DoAnimation(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/TestCairoWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/TestCairoWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,126 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TestCairoWidget.h" + +#include + + +namespace Deprecated +{ + namespace Samples + { + void TestCairoWidget::DoAnimation() + { + value_ -= 0.01f; + if (value_ < 0) + { + value_ = 1; + } + + NotifyContentChanged(); + } + + + bool TestCairoWidget::RenderCairo(OrthancStone::CairoContext& context) + { + cairo_t* cr = context.GetObject(); + + cairo_set_source_rgb (cr, .3, 0, 0); + cairo_paint(cr); + + cairo_set_source_rgb(cr, 0, 1, 0); + cairo_rectangle(cr, width_ / 4, height_ / 4, width_ / 2, height_ / 2); + cairo_set_line_width(cr, 1.0); + cairo_fill(cr); + + cairo_set_source_rgb(cr, 0, 1, value_); + cairo_rectangle(cr, width_ / 2 - 50, height_ / 2 - 50, 100, 100); + cairo_fill(cr); + + return true; + } + + + void TestCairoWidget::RenderMouseOverCairo(OrthancStone::CairoContext& context, + int x, + int y) + { + cairo_t* cr = context.GetObject(); + + cairo_set_source_rgb (cr, 1, 0, 0); + cairo_rectangle(cr, x - 5, y - 5, 10, 10); + cairo_set_line_width(cr, 1.0); + cairo_stroke(cr); + + char buf[64]; + sprintf(buf, "(%d,%d)", x, y); + UpdateStatusBar(buf); + } + + + TestCairoWidget::TestCairoWidget(const std::string& name, bool animate) : + CairoWidget(name), + width_(0), + height_(0), + value_(1), + animate_(animate) + { + } + + + void TestCairoWidget::SetSize(unsigned int width, + unsigned int height) + { + CairoWidget::SetSize(width, height); + width_ = width; + height_ = height; + } + + + IMouseTracker* TestCairoWidget::CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) + { + UpdateStatusBar("Click"); + return NULL; + } + + + void TestCairoWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + UpdateStatusBar(direction == OrthancStone::MouseWheelDirection_Down ? "Wheel down" : "Wheel up"); + } + + + void TestCairoWidget::KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) + { + UpdateStatusBar("Key pressed: \"" + std::string(1, keyChar) + "\""); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/TestCairoWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/TestCairoWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,79 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CairoWidget.h" + +namespace Deprecated +{ + namespace Samples + { + class TestCairoWidget : public CairoWidget + { + private: + unsigned int width_; + unsigned int height_; + float value_; + bool animate_; + + protected: + virtual bool RenderCairo(OrthancStone::CairoContext& context); + + virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, + int x, + int y); + + public: + TestCairoWidget(const std::string& name, bool animate); + + virtual void SetSize(unsigned int width, + unsigned int height); + + virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches); + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers); + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers); + + virtual bool HasAnimation() const + { + return animate_; + } + + virtual void DoAnimation(); + + virtual bool HasRenderMouseOver() + { + return true; + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/TestWorldSceneWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/TestWorldSceneWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,149 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TestWorldSceneWidget.h" + +#include + +#include +#include + +namespace Deprecated +{ + namespace Samples + { + class TestWorldSceneWidget::Interactor : public IWorldSceneInteractor + { + public: + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const ViewportGeometry& view, + OrthancStone::MouseButton button, + OrthancStone::KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + IStatusBar* statusBar, + const std::vector& touches) + { + if (statusBar) + { + char buf[64]; + sprintf(buf, "X = %0.2f, Y = %0.2f", x, y); + statusBar->SetMessage(buf); + } + + return NULL; + } + + virtual void MouseOver(OrthancStone::CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) + { + double S = 0.5; + + if (fabs(x) <= S && + fabs(y) <= S) + { + cairo_t* cr = context.GetObject(); + cairo_set_source_rgb(cr, 1, 0, 0); + cairo_rectangle(cr, -S, -S , 2.0 * S, 2.0 * S); + cairo_set_line_width(cr, 1.0 / view.GetZoom()); + cairo_stroke(cr); + } + } + + virtual void MouseWheel(WorldSceneWidget& widget, + OrthancStone::MouseWheelDirection direction, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + if (statusBar) + { + statusBar->SetMessage(direction == OrthancStone::MouseWheelDirection_Down ? "Wheel down" : "Wheel up"); + } + } + + virtual void KeyPressed(WorldSceneWidget& widget, + OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) + { + if (statusBar) + { + statusBar->SetMessage("Key pressed: \"" + std::string(1, keyChar) + "\""); + } + } + }; + + + bool TestWorldSceneWidget::RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view) + { + cairo_t* cr = context.GetObject(); + + // Clear background + cairo_set_source_rgb(cr, 0, 0, 0); + cairo_paint(cr); + + float color = static_cast(count_ % 16) / 15.0f; + cairo_set_source_rgb(cr, 0, 1.0f - color, color); + cairo_rectangle(cr, -10, -.5, 20, 1); + cairo_fill(cr); + + return true; + } + + + TestWorldSceneWidget::TestWorldSceneWidget(const std::string& name, bool animate) : + WorldSceneWidget(name), + interactor_(new Interactor), + animate_(animate), + count_(0) + { + SetInteractor(*interactor_); + } + + + OrthancStone::Extent2D TestWorldSceneWidget::GetSceneExtent() + { + return OrthancStone::Extent2D(-10, -.5, 10, .5); + } + + + void TestWorldSceneWidget::DoAnimation() + { + if (animate_) + { + count_++; + NotifyContentChanged(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/TestWorldSceneWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/TestWorldSceneWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WorldSceneWidget.h" + +#include + +namespace Deprecated +{ + namespace Samples + { + class TestWorldSceneWidget : public WorldSceneWidget + { + private: + class Interactor; + + std::unique_ptr interactor_; + bool animate_; + unsigned int count_; + + protected: + virtual bool RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view); + + public: + TestWorldSceneWidget(const std::string& name, bool animate); + + virtual OrthancStone::Extent2D GetSceneExtent(); + + virtual bool HasAnimation() const + { + return animate_; + } + + virtual void DoAnimation(); + + virtual bool HasRenderMouseOver() + { + return true; + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/WidgetBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/WidgetBase.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,166 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WidgetBase.h" + +#include +#include +#include + +namespace Deprecated +{ + void WidgetBase::NotifyContentChanged() + { + if (parent_ != NULL) + { + parent_->NotifyContentChanged(); + } + + if (viewport_ != NULL) + { + viewport_->NotifyBackgroundChanged(); + } + } + + + void WidgetBase::SetParent(IWidget& parent) + { + if (parent_ != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + parent_ = &parent; + } + } + + + void WidgetBase::ClearBackgroundOrthanc(Orthanc::ImageAccessor& target) const + { + // Clear the background using Orthanc + + if (backgroundCleared_) + { + Orthanc::ImageProcessing::Set(target, + backgroundColor_[0], + backgroundColor_[1], + backgroundColor_[2], + 255 /* alpha */); + } + } + + + void WidgetBase::ClearBackgroundCairo(OrthancStone::CairoContext& context) const + { + // Clear the background using Cairo + + if (IsBackgroundCleared()) + { + uint8_t red, green, blue; + GetBackgroundColor(red, green, blue); + + context.SetSourceColor(red, green, blue); + cairo_paint(context.GetObject()); + } + } + + + void WidgetBase::ClearBackgroundCairo(Orthanc::ImageAccessor& target) const + { + OrthancStone::CairoSurface surface(target, false /* no alpha */); + OrthancStone::CairoContext context(surface); + ClearBackgroundCairo(context); + } + + + void WidgetBase::UpdateStatusBar(const std::string& message) + { + if (statusBar_ != NULL) + { + statusBar_->SetMessage(message); + } + } + + + WidgetBase::WidgetBase(const std::string& name) : + parent_(NULL), + viewport_(NULL), + statusBar_(NULL), + backgroundCleared_(false), + transmitMouseOver_(false), + name_(name) + { + backgroundColor_[0] = 0; + backgroundColor_[1] = 0; + backgroundColor_[2] = 0; + } + + + void WidgetBase::SetViewport(WidgetViewport& viewport) + { + if (viewport_ != NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + viewport_ = &viewport; + } + } + + + void WidgetBase::SetBackgroundColor(uint8_t red, + uint8_t green, + uint8_t blue) + { + backgroundColor_[0] = red; + backgroundColor_[1] = green; + backgroundColor_[2] = blue; + } + + void WidgetBase::GetBackgroundColor(uint8_t& red, + uint8_t& green, + uint8_t& blue) const + { + red = backgroundColor_[0]; + green = backgroundColor_[1]; + blue = backgroundColor_[2]; + } + + + bool WidgetBase::Render(Orthanc::ImageAccessor& surface) + { +#if 0 + ClearBackgroundOrthanc(surface); +#else + ClearBackgroundCairo(surface); // Faster than Orthanc +#endif + + return true; + } + + + void WidgetBase::DoAnimation() + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/WidgetBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/WidgetBase.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,117 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IWidget.h" + +#include "../../Wrappers/CairoContext.h" +#include "../Viewport/WidgetViewport.h" + +namespace Deprecated +{ + class WidgetBase : public IWidget + { + private: + IWidget* parent_; + WidgetViewport* viewport_; + IStatusBar* statusBar_; + bool backgroundCleared_; + uint8_t backgroundColor_[3]; + bool transmitMouseOver_; + std::string name_; + + protected: + void ClearBackgroundOrthanc(Orthanc::ImageAccessor& target) const; + + void ClearBackgroundCairo(OrthancStone::CairoContext& context) const; + + void ClearBackgroundCairo(Orthanc::ImageAccessor& target) const; + + void UpdateStatusBar(const std::string& message); + + IStatusBar* GetStatusBar() const + { + return statusBar_; + } + + public: + WidgetBase(const std::string& name); + + virtual void FitContent() + { + } + + virtual void SetParent(IWidget& parent); + + virtual void SetViewport(WidgetViewport& viewport); + + void SetBackgroundCleared(bool clear) + { + backgroundCleared_ = clear; + } + + bool IsBackgroundCleared() const + { + return backgroundCleared_; + } + + void SetTransmitMouseOver(bool transmit) + { + transmitMouseOver_ = transmit; + } + + void SetBackgroundColor(uint8_t red, + uint8_t green, + uint8_t blue); + + void GetBackgroundColor(uint8_t& red, + uint8_t& green, + uint8_t& blue) const; + + virtual void SetStatusBar(IStatusBar& statusBar) + { + statusBar_ = &statusBar; + } + + virtual bool Render(Orthanc::ImageAccessor& surface); + + virtual bool HasAnimation() const + { + return false; + } + + virtual void DoAnimation(); + + virtual bool HasRenderMouseOver() + { + return transmitMouseOver_; + } + + virtual void NotifyContentChanged(); + + const std::string& GetName() const + { + return name_; + } + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/WorldSceneWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/WorldSceneWidget.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,229 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WorldSceneWidget.h" + +#include "PanMouseTracker.h" +#include "ZoomMouseTracker.h" +#include "PanZoomMouseTracker.h" + +#include +#include + +#include +#include +#include + +namespace Deprecated +{ + // this is an adapter between a IWorldSceneMouseTracker + // that is tracking a mouse in scene coordinates/mm and + // an IMouseTracker that is tracking a mouse + // in screen coordinates/pixels. + class WorldSceneWidget::SceneMouseTracker : public IMouseTracker + { + private: + ViewportGeometry view_; + std::unique_ptr tracker_; + + public: + SceneMouseTracker(const ViewportGeometry& view, + IWorldSceneMouseTracker* tracker) : + view_(view), + tracker_(tracker) + { + if (tracker == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + virtual void Render(Orthanc::ImageAccessor& target) + { + if (tracker_->HasRender()) + { + OrthancStone::CairoSurface surface(target, false /* no alpha */); + OrthancStone::CairoContext context(surface); + view_.ApplyTransform(context); + tracker_->Render(context, view_.GetZoom()); + } + } + + virtual void MouseUp() + { + tracker_->MouseUp(); + } + + virtual void MouseMove(int x, + int y, + const std::vector& displayTouches) + { + double sceneX, sceneY; + view_.MapPixelCenterToScene(sceneX, sceneY, x, y); + + std::vector sceneTouches; + for (size_t t = 0; t < displayTouches.size(); t++) + { + double sx, sy; + + view_.MapPixelCenterToScene( + sx, sy, (int)displayTouches[t].x, (int)displayTouches[t].y); + + sceneTouches.push_back( + Touch(static_cast(sx), static_cast(sy))); + } + tracker_->MouseMove(x, y, sceneX, sceneY, displayTouches, sceneTouches); + } + }; + + + bool WorldSceneWidget::RenderCairo(OrthancStone::CairoContext& context) + { + view_.ApplyTransform(context); + return RenderScene(context, view_); + } + + + void WorldSceneWidget::RenderMouseOverCairo(OrthancStone::CairoContext& context, + int x, + int y) + { + ViewportGeometry view = GetView(); + view.ApplyTransform(context); + + double sceneX, sceneY; + view.MapPixelCenterToScene(sceneX, sceneY, x, y); + + if (interactor_) + { + interactor_->MouseOver(context, *this, view, sceneX, sceneY, GetStatusBar()); + } + } + + + void WorldSceneWidget::SetSceneExtent(ViewportGeometry& view) + { + view.SetSceneExtent(GetSceneExtent()); + } + + + void WorldSceneWidget::SetSize(unsigned int width, + unsigned int height) + { + CairoWidget::SetSize(width, height); + view_.SetDisplaySize(width, height); + } + + + void WorldSceneWidget::SetInteractor(IWorldSceneInteractor& interactor) + { + interactor_ = &interactor; + } + + + void WorldSceneWidget::FitContent() + { + SetSceneExtent(view_); + view_.FitContent(); + + NotifyContentChanged(); + } + + + void WorldSceneWidget::SetView(const ViewportGeometry& view) + { + view_ = view; + + NotifyContentChanged(); + } + + + IMouseTracker* WorldSceneWidget::CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches) + { + double sceneX, sceneY; + view_.MapPixelCenterToScene(sceneX, sceneY, x, y); + + // asks the Widget Interactor to provide a mouse tracker + std::unique_ptr tracker; + + if (interactor_) + { + tracker.reset(interactor_->CreateMouseTracker(*this, view_, button, modifiers, x, y, sceneX, sceneY, GetStatusBar(), touches)); + } + + if (tracker.get() != NULL) + { + return new SceneMouseTracker(view_, tracker.release()); + } + else if (hasDefaultMouseEvents_) + { + if (touches.size() == 2) + { + return new SceneMouseTracker(view_, new PanZoomMouseTracker(*this, touches)); + } + else + { + switch (button) + { + case OrthancStone::MouseButton_Middle: + return new SceneMouseTracker(view_, new PanMouseTracker(*this, x, y)); + + case OrthancStone::MouseButton_Right: + return new SceneMouseTracker(view_, new ZoomMouseTracker(*this, x, y)); + + default: + return NULL; + } + } + } + else + { + return NULL; + } + } + + + void WorldSceneWidget::MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers) + { + if (interactor_) + { + interactor_->MouseWheel(*this, direction, modifiers, GetStatusBar()); + } + } + + + void WorldSceneWidget::KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers) + { + if (interactor_) + { + interactor_->KeyPressed(*this, key, keyChar, modifiers, GetStatusBar()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/WorldSceneWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/WorldSceneWidget.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CairoWidget.h" +#include "IWorldSceneInteractor.h" + +#include "../Toolbox/ViewportGeometry.h" + +namespace Deprecated +{ + class WorldSceneWidget : public CairoWidget + { + private: + class SceneMouseTracker; + + ViewportGeometry view_; + IWorldSceneInteractor* interactor_; + bool hasDefaultMouseEvents_; + + protected: + virtual OrthancStone::Extent2D GetSceneExtent() = 0; + + virtual bool RenderScene(OrthancStone::CairoContext& context, + const ViewportGeometry& view) = 0; + + // From CairoWidget + virtual bool RenderCairo(OrthancStone::CairoContext& context); + + // From CairoWidget + virtual void RenderMouseOverCairo(OrthancStone::CairoContext& context, + int x, + int y); + + void SetSceneExtent(ViewportGeometry& geometry); + + public: + WorldSceneWidget(const std::string& name) : + CairoWidget(name), + interactor_(NULL), + hasDefaultMouseEvents_(true) + { + } + + void SetDefaultMouseEvents(bool value) + { + hasDefaultMouseEvents_ = value; + } + + bool HasDefaultMouseEvents() const + { + return hasDefaultMouseEvents_; + } + + void SetInteractor(IWorldSceneInteractor& interactor); + + void SetView(const ViewportGeometry& view); + + const ViewportGeometry& GetView() const + { + return view_; + } + + virtual void SetSize(unsigned int width, + unsigned int height); + + virtual void FitContent(); + + virtual IMouseTracker* CreateMouseTracker(OrthancStone::MouseButton button, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers, + const std::vector& touches); + + virtual void MouseWheel(OrthancStone::MouseWheelDirection direction, + int x, + int y, + OrthancStone::KeyboardModifiers modifiers); + + virtual void KeyPressed(OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/ZoomMouseTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/ZoomMouseTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,110 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ZoomMouseTracker.h" + +#include +#include + +namespace Deprecated +{ + ZoomMouseTracker::ZoomMouseTracker(WorldSceneWidget& that, + int x, + int y) : + that_(that), + originalZoom_(that.GetView().GetZoom()), + downX_(x), + downY_(y) + { + that.GetView().MapPixelCenterToScene(centerX_, centerY_, x, y); + + unsigned int height = that.GetView().GetDisplayHeight(); + + if (height <= 3) + { + idle_ = true; + LOG(WARNING) << "image is too small to zoom (current height = " << height << ")"; + } + else + { + idle_ = false; + normalization_ = 1.0 / static_cast(height - 1); + } + } + + + void ZoomMouseTracker::Render(OrthancStone::CairoContext& context, + double zoom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void ZoomMouseTracker::MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches) + { + static const double MIN_ZOOM = -4; + static const double MAX_ZOOM = 4; + + + if (!idle_) + { + double dy = static_cast(displayY - downY_) * normalization_; // In the range [-1,1] + double z; + + // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] + if (dy < -1.0) + { + z = MIN_ZOOM; + } + else if (dy > 1.0) + { + z = MAX_ZOOM; + } + else + { + z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; + } + + z = pow(2.0, z); + + ViewportGeometry view = that_.GetView(); + + view.SetZoom(z * originalZoom_); + + // Correct the pan so that the original click point is kept at + // the same location on the display + double panX, panY; + view.GetPan(panX, panY); + + int tx, ty; + view.MapSceneToDisplay(tx, ty, centerX_, centerY_); + view.SetPan(panX + static_cast(downX_ - tx), + panY + static_cast(downY_ - ty)); + + that_.SetView(view); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/Widgets/ZoomMouseTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/Widgets/ZoomMouseTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WorldSceneWidget.h" + +namespace Deprecated +{ + class ZoomMouseTracker : public IWorldSceneMouseTracker + { + private: + WorldSceneWidget& that_; + double originalZoom_; + int downX_; + int downY_; + double centerX_; + double centerY_; + bool idle_; + double normalization_; + + public: + ZoomMouseTracker(WorldSceneWidget& that, + int x, + int y); + + virtual bool HasRender() const + { + return false; + } + + virtual void MouseUp() + { + } + + virtual void Render(OrthancStone::CairoContext& context, + double zoom); + + virtual void MouseMove(int displayX, + int displayY, + double x, + double y, + const std::vector& displayTouches, + const std::vector& sceneTouches); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Deprecated/dev.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Deprecated/dev.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,958 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "Layers/FrameRenderer.h" +#include "Layers/LineLayerRenderer.h" +#include "Layers/SliceOutlineRenderer.h" +#include "Toolbox/DownloadStack.h" +#include "Toolbox/GeometryToolbox.h" +#include "Toolbox/OrthancSlicesLoader.h" +#include "Volumes/ISlicedVolume.h" +#include "Volumes/ImageBuffer3D.h" +#include "Widgets/SliceViewerWidget.h" + +#include +#include +#include + +#include + + +namespace Deprecated +{ + // TODO: Handle errors while loading + class OrthancVolumeImage : + public ISlicedVolume, + public OrthancStone::IObserver + { + private: + OrthancSlicesLoader loader_; + std::unique_ptr image_; + std::unique_ptr downloadStack_; + bool computeRange_; + size_t pendingSlices_; + + void ScheduleSliceDownload() + { + assert(downloadStack_.get() != NULL); + + unsigned int slice; + if (downloadStack_->Pop(slice)) + { + loader_.ScheduleLoadSliceImage(slice, OrthancStone::SliceImageQuality_Jpeg90); + } + } + + + static bool IsCompatible(const Slice& a, + const Slice& b) + { + if (!OrthancStone::GeometryToolbox::IsParallel(a.GetGeometry().GetNormal(), + b.GetGeometry().GetNormal())) + { + LOG(ERROR) << "A slice in the volume image is not parallel to the others."; + return false; + } + + if (a.GetConverter().GetExpectedPixelFormat() != b.GetConverter().GetExpectedPixelFormat()) + { + LOG(ERROR) << "The pixel format changes across the slices of the volume image."; + return false; + } + + if (a.GetWidth() != b.GetWidth() || + a.GetHeight() != b.GetHeight()) + { + LOG(ERROR) << "The slices dimensions (width/height) are varying throughout the volume image"; + return false; + } + + if (!OrthancStone::LinearAlgebra::IsNear(a.GetPixelSpacingX(), b.GetPixelSpacingX()) || + !OrthancStone::LinearAlgebra::IsNear(a.GetPixelSpacingY(), b.GetPixelSpacingY())) + { + LOG(ERROR) << "The pixel spacing of the slices change across the volume image"; + return false; + } + + return true; + } + + + static double GetDistance(const Slice& a, + const Slice& b) + { + return fabs(a.GetGeometry().ProjectAlongNormal(a.GetGeometry().GetOrigin()) - + a.GetGeometry().ProjectAlongNormal(b.GetGeometry().GetOrigin())); + } + + + void OnSliceGeometryReady(const OrthancSlicesLoader::SliceGeometryReadyMessage& message) + { + assert(&message.GetOrigin() == &loader_); + + if (loader_.GetSlicesCount() == 0) + { + LOG(ERROR) << "Empty volume image"; + BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); + return; + } + + for (size_t i = 1; i < loader_.GetSlicesCount(); i++) + { + if (!IsCompatible(loader_.GetSlice(0), loader_.GetSlice(i))) + { + BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); + return; + } + } + + double spacingZ; + + if (loader_.GetSlicesCount() > 1) + { + spacingZ = GetDistance(loader_.GetSlice(0), loader_.GetSlice(1)); + } + else + { + // This is a volume with one single slice: Choose a dummy + // z-dimension for voxels + spacingZ = 1; + } + + for (size_t i = 1; i < loader_.GetSlicesCount(); i++) + { + if (!OrthancStone::LinearAlgebra::IsNear(spacingZ, GetDistance(loader_.GetSlice(i - 1), loader_.GetSlice(i)), + 0.001 /* this is expressed in mm */)) + { + LOG(ERROR) << "The distance between successive slices is not constant in a volume image"; + BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); + return; + } + } + + unsigned int width = loader_.GetSlice(0).GetWidth(); + unsigned int height = loader_.GetSlice(0).GetHeight(); + Orthanc::PixelFormat format = loader_.GetSlice(0).GetConverter().GetExpectedPixelFormat(); + LOG(INFO) << "Creating a volume image of size " << width << "x" << height + << "x" << loader_.GetSlicesCount() << " in " << Orthanc::EnumerationToString(format); + + image_.reset(new OrthancStone::ImageBuffer3D(format, width, height, static_cast(loader_.GetSlicesCount()), computeRange_)); + image_->GetGeometry().SetAxialGeometry(loader_.GetSlice(0).GetGeometry()); + image_->GetGeometry().SetVoxelDimensions(loader_.GetSlice(0).GetPixelSpacingX(), + loader_.GetSlice(0).GetPixelSpacingY(), spacingZ); + image_->Clear(); + + downloadStack_.reset(new DownloadStack(static_cast(loader_.GetSlicesCount()))); + pendingSlices_ = loader_.GetSlicesCount(); + + for (unsigned int i = 0; i < 4; i++) // Limit to 4 simultaneous downloads + { + ScheduleSliceDownload(); + } + + // TODO Check the DicomFrameConverter are constant + + BroadcastMessage(ISlicedVolume::GeometryReadyMessage(*this)); + } + + + void OnSliceGeometryError(const OrthancSlicesLoader::SliceGeometryErrorMessage& message) + { + assert(&message.GetOrigin() == &loader_); + + LOG(ERROR) << "Unable to download a volume image"; + BroadcastMessage(ISlicedVolume::GeometryErrorMessage(*this)); + } + + + void OnSliceImageReady(const OrthancSlicesLoader::SliceImageReadyMessage& message) + { + assert(&message.GetOrigin() == &loader_); + + { + OrthancStone::ImageBuffer3D::SliceWriter writer(*image_, OrthancStone::VolumeProjection_Axial, message.GetSliceIndex()); + Orthanc::ImageProcessing::Copy(writer.GetAccessor(), message.GetImage()); + } + + BroadcastMessage(ISlicedVolume::SliceContentChangedMessage + (*this, message.GetSliceIndex(), message.GetSlice())); + + if (pendingSlices_ == 1) + { + BroadcastMessage(ISlicedVolume::VolumeReadyMessage(*this)); + pendingSlices_ = 0; + } + else if (pendingSlices_ > 1) + { + pendingSlices_ -= 1; + } + + ScheduleSliceDownload(); + } + + + void OnSliceImageError(const OrthancSlicesLoader::SliceImageErrorMessage& message) + { + assert(&message.GetOrigin() == &loader_); + + LOG(ERROR) << "Cannot download slice " << message.GetSliceIndex() << " in a volume image"; + ScheduleSliceDownload(); + } + + + public: + OrthancVolumeImage(OrthancStone::MessageBroker& broker, + OrthancApiClient& orthanc, + bool computeRange) : + ISlicedVolume(broker), + IObserver(broker), + loader_(broker, orthanc), + computeRange_(computeRange), + pendingSlices_(0) + { + loader_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &OrthancVolumeImage::OnSliceGeometryReady)); + + loader_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &OrthancVolumeImage::OnSliceGeometryError)); + + loader_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &OrthancVolumeImage::OnSliceImageReady)); + + loader_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &OrthancVolumeImage::OnSliceImageError)); + } + + void ScheduleLoadSeries(const std::string& seriesId) + { + loader_.ScheduleLoadSeries(seriesId); + } + + void ScheduleLoadInstance(const std::string& instanceId) + { + loader_.ScheduleLoadInstance(instanceId); + } + + void ScheduleLoadFrame(const std::string& instanceId, + unsigned int frame) + { + loader_.ScheduleLoadFrame(instanceId, frame); + } + + virtual size_t GetSlicesCount() const + { + return loader_.GetSlicesCount(); + } + + virtual const Slice& GetSlice(size_t index) const + { + return loader_.GetSlice(index); + } + + OrthancStone::ImageBuffer3D& GetImage() const + { + if (image_.get() == NULL) + { + // The geometry is not ready yet + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *image_; + } + } + + bool FitWindowingToRange(RenderStyle& style, + const DicomFrameConverter& converter) const + { + if (image_.get() == NULL) + { + return false; + } + else + { + return image_->FitWindowingToRange(style, converter); + } + } + }; + + + class VolumeImageGeometry + { + private: + unsigned int width_; + unsigned int height_; + size_t depth_; + double pixelSpacingX_; + double pixelSpacingY_; + double sliceThickness_; + OrthancStone::CoordinateSystem3D reference_; + DicomFrameConverter converter_; + + double ComputeAxialThickness(const OrthancVolumeImage& volume) const + { + double thickness; + + size_t n = volume.GetSlicesCount(); + if (n > 1) + { + const Slice& a = volume.GetSlice(0); + const Slice& b = volume.GetSlice(n - 1); + thickness = ((reference_.ProjectAlongNormal(b.GetGeometry().GetOrigin()) - + reference_.ProjectAlongNormal(a.GetGeometry().GetOrigin())) / + (static_cast(n) - 1.0)); + } + else + { + thickness = volume.GetSlice(0).GetThickness(); + } + + if (thickness <= 0) + { + // The slices should have been sorted with increasing Z + // (along the normal) by the OrthancSlicesLoader + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + else + { + return thickness; + } + } + + void SetupAxial(const OrthancVolumeImage& volume) + { + const Slice& axial = volume.GetSlice(0); + + width_ = axial.GetWidth(); + height_ = axial.GetHeight(); + depth_ = volume.GetSlicesCount(); + + pixelSpacingX_ = axial.GetPixelSpacingX(); + pixelSpacingY_ = axial.GetPixelSpacingY(); + sliceThickness_ = ComputeAxialThickness(volume); + + reference_ = axial.GetGeometry(); + } + + void SetupCoronal(const OrthancVolumeImage& volume) + { + const Slice& axial = volume.GetSlice(0); + double axialThickness = ComputeAxialThickness(volume); + + width_ = axial.GetWidth(); + height_ = static_cast(volume.GetSlicesCount()); + depth_ = axial.GetHeight(); + + pixelSpacingX_ = axial.GetPixelSpacingX(); + pixelSpacingY_ = axialThickness; + sliceThickness_ = axial.GetPixelSpacingY(); + + OrthancStone::Vector origin = axial.GetGeometry().GetOrigin(); + origin += (static_cast(volume.GetSlicesCount() - 1) * + axialThickness * axial.GetGeometry().GetNormal()); + + reference_ = OrthancStone::CoordinateSystem3D(origin, + axial.GetGeometry().GetAxisX(), + - axial.GetGeometry().GetNormal()); + } + + void SetupSagittal(const OrthancVolumeImage& volume) + { + const Slice& axial = volume.GetSlice(0); + double axialThickness = ComputeAxialThickness(volume); + + width_ = axial.GetHeight(); + height_ = static_cast(volume.GetSlicesCount()); + depth_ = axial.GetWidth(); + + pixelSpacingX_ = axial.GetPixelSpacingY(); + pixelSpacingY_ = axialThickness; + sliceThickness_ = axial.GetPixelSpacingX(); + + OrthancStone::Vector origin = axial.GetGeometry().GetOrigin(); + origin += (static_cast(volume.GetSlicesCount() - 1) * + axialThickness * axial.GetGeometry().GetNormal()); + + reference_ = OrthancStone::CoordinateSystem3D(origin, + axial.GetGeometry().GetAxisY(), + axial.GetGeometry().GetNormal()); + } + + public: + VolumeImageGeometry(const OrthancVolumeImage& volume, + OrthancStone::VolumeProjection projection) + { + if (volume.GetSlicesCount() == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + converter_ = volume.GetSlice(0).GetConverter(); + + switch (projection) + { + case OrthancStone::VolumeProjection_Axial: + SetupAxial(volume); + break; + + case OrthancStone::VolumeProjection_Coronal: + SetupCoronal(volume); + break; + + case OrthancStone::VolumeProjection_Sagittal: + SetupSagittal(volume); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + size_t GetSlicesCount() const + { + return depth_; + } + + const OrthancStone::Vector& GetNormal() const + { + return reference_.GetNormal(); + } + + bool LookupSlice(size_t& index, + const OrthancStone::CoordinateSystem3D& slice) const + { + bool opposite; + if (!OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, + reference_.GetNormal(), + slice.GetNormal())) + { + return false; + } + + double z = (reference_.ProjectAlongNormal(slice.GetOrigin()) - + reference_.ProjectAlongNormal(reference_.GetOrigin())) / sliceThickness_; + + int s = static_cast(boost::math::iround(z)); + + if (s < 0 || + s >= static_cast(depth_)) + { + return false; + } + else + { + index = static_cast(s); + return true; + } + } + + Slice* GetSlice(size_t slice) const + { + if (slice >= depth_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + OrthancStone::CoordinateSystem3D origin(reference_.GetOrigin() + + static_cast(slice) * sliceThickness_ * reference_.GetNormal(), + reference_.GetAxisX(), + reference_.GetAxisY()); + + return new Slice(origin, pixelSpacingX_, pixelSpacingY_, sliceThickness_, + width_, height_, converter_); + } + } + }; + + + + class VolumeImageMPRSlicer : + public IVolumeSlicer, + public OrthancStone::IObserver + { + private: + class RendererFactory : public LayerReadyMessage::IRendererFactory + { + private: + const Orthanc::ImageAccessor& frame_; + const Slice& slice_; + bool isFullQuality_; + + public: + RendererFactory(const Orthanc::ImageAccessor& frame, + const Slice& slice, + bool isFullQuality) : + frame_(frame), + slice_(slice), + isFullQuality_(isFullQuality) + { + } + + virtual ILayerRenderer* CreateRenderer() const + { + return FrameRenderer::CreateRenderer(frame_, slice_, isFullQuality_); + } + }; + + + OrthancVolumeImage& volume_; + std::unique_ptr axialGeometry_; + std::unique_ptr coronalGeometry_; + std::unique_ptr sagittalGeometry_; + + + bool IsGeometryReady() const + { + return axialGeometry_.get() != NULL; + } + + void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message) + { + assert(&message.GetOrigin() == &volume_); + + // These 3 values are only used to speed up the IVolumeSlicer + axialGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Axial)); + coronalGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Coronal)); + sagittalGeometry_.reset(new VolumeImageGeometry(volume_, OrthancStone::VolumeProjection_Sagittal)); + + BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); + } + + void OnGeometryError(const ISlicedVolume::GeometryErrorMessage& message) + { + assert(&message.GetOrigin() == &volume_); + + BroadcastMessage(IVolumeSlicer::GeometryErrorMessage(*this)); + } + + void OnContentChanged(const ISlicedVolume::ContentChangedMessage& message) + { + assert(&message.GetOrigin() == &volume_); + + BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); + } + + void OnSliceContentChanged(const ISlicedVolume::SliceContentChangedMessage& message) + { + assert(&message.GetOrigin() == &volume_); + + //IVolumeSlicer::OnSliceContentChange(slice); + + // TODO Improve this? + BroadcastMessage(IVolumeSlicer::ContentChangedMessage(*this)); + } + + const VolumeImageGeometry& GetProjectionGeometry(OrthancStone::VolumeProjection projection) + { + if (!IsGeometryReady()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + switch (projection) + { + case OrthancStone::VolumeProjection_Axial: + return *axialGeometry_; + + case OrthancStone::VolumeProjection_Sagittal: + return *sagittalGeometry_; + + case OrthancStone::VolumeProjection_Coronal: + return *coronalGeometry_; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + bool DetectProjection(OrthancStone::VolumeProjection& projection, + const OrthancStone::CoordinateSystem3D& viewportSlice) + { + bool isOpposite; // Ignored + + if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, + viewportSlice.GetNormal(), + axialGeometry_->GetNormal())) + { + projection = OrthancStone::VolumeProjection_Axial; + return true; + } + else if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, + viewportSlice.GetNormal(), + sagittalGeometry_->GetNormal())) + { + projection = OrthancStone::VolumeProjection_Sagittal; + return true; + } + else if (OrthancStone::GeometryToolbox::IsParallelOrOpposite(isOpposite, + viewportSlice.GetNormal(), + coronalGeometry_->GetNormal())) + { + projection = OrthancStone::VolumeProjection_Coronal; + return true; + } + else + { + return false; + } + } + + + public: + VolumeImageMPRSlicer(OrthancStone::MessageBroker& broker, + OrthancVolumeImage& volume) : + IVolumeSlicer(broker), + IObserver(broker), + volume_(volume) + { + volume_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &VolumeImageMPRSlicer::OnGeometryReady)); + + volume_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &VolumeImageMPRSlicer::OnGeometryError)); + + volume_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &VolumeImageMPRSlicer::OnContentChanged)); + + volume_.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &VolumeImageMPRSlicer::OnSliceContentChanged)); + } + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice) ORTHANC_OVERRIDE + { + OrthancStone::VolumeProjection projection; + + if (!IsGeometryReady() || + !DetectProjection(projection, viewportSlice)) + { + return false; + } + else + { + // As the slices of the volumic image are arranged in a box, + // we only consider one single reference slice (the one with index 0). + std::unique_ptr slice(GetProjectionGeometry(projection).GetSlice(0)); + slice->GetExtent(points); + + return true; + } + } + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) ORTHANC_OVERRIDE + { + OrthancStone::VolumeProjection projection; + + if (IsGeometryReady() && + DetectProjection(projection, viewportSlice)) + { + const VolumeImageGeometry& geometry = GetProjectionGeometry(projection); + + size_t closest; + + if (geometry.LookupSlice(closest, viewportSlice)) + { + bool isFullQuality = true; // TODO + + std::unique_ptr frame; + + { + OrthancStone::ImageBuffer3D::SliceReader reader(volume_.GetImage(), projection, static_cast(closest)); + + // TODO Transfer ownership if non-axial, to avoid memcpy + frame.reset(Orthanc::Image::Clone(reader.GetAccessor())); + } + + std::unique_ptr slice(geometry.GetSlice(closest)); + + RendererFactory factory(*frame, *slice, isFullQuality); + + BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, slice->GetGeometry())); + return; + } + } + + // Error + OrthancStone::CoordinateSystem3D slice; + BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, slice)); + } + }; + + + class VolumeImageInteractor : + public IWorldSceneInteractor, + public OrthancStone::IObserver + { + private: + SliceViewerWidget& widget_; + OrthancStone::VolumeProjection projection_; + std::unique_ptr slices_; + size_t slice_; + + protected: + void OnGeometryReady(const ISlicedVolume::GeometryReadyMessage& message) + { + if (slices_.get() == NULL) + { + const OrthancVolumeImage& image = + dynamic_cast(message.GetOrigin()); + + slices_.reset(new VolumeImageGeometry(image, projection_)); + SetSlice(slices_->GetSlicesCount() / 2); + + widget_.FitContent(); + } + } + + virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, + const ViewportGeometry& view, + OrthancStone::MouseButton button, + OrthancStone::KeyboardModifiers modifiers, + int viewportX, + int viewportY, + double x, + double y, + IStatusBar* statusBar, + const std::vector& touches) ORTHANC_OVERRIDE + { + return NULL; + } + + virtual void MouseOver(OrthancStone::CairoContext& context, + WorldSceneWidget& widget, + const ViewportGeometry& view, + double x, + double y, + IStatusBar* statusBar) ORTHANC_OVERRIDE + { + } + + virtual void MouseWheel(WorldSceneWidget& widget, + OrthancStone::MouseWheelDirection direction, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) ORTHANC_OVERRIDE + { + int scale = (modifiers & OrthancStone::KeyboardModifiers_Control ? 10 : 1); + + switch (direction) + { + case OrthancStone::MouseWheelDirection_Up: + OffsetSlice(-scale); + break; + + case OrthancStone::MouseWheelDirection_Down: + OffsetSlice(scale); + break; + + default: + break; + } + } + + virtual void KeyPressed(WorldSceneWidget& widget, + OrthancStone::KeyboardKeys key, + char keyChar, + OrthancStone::KeyboardModifiers modifiers, + IStatusBar* statusBar) ORTHANC_OVERRIDE + { + switch (keyChar) + { + case 's': + widget.FitContent(); + break; + + default: + break; + } + } + + public: + VolumeImageInteractor(OrthancStone::MessageBroker& broker, + OrthancVolumeImage& volume, + SliceViewerWidget& widget, + OrthancStone::VolumeProjection projection) : + IObserver(broker), + widget_(widget), + projection_(projection) + { + widget.SetInteractor(*this); + + volume.RegisterObserverCallback( + new OrthancStone::Callable + (*this, &VolumeImageInteractor::OnGeometryReady)); + } + + bool IsGeometryReady() const + { + return slices_.get() != NULL; + } + + size_t GetSlicesCount() const + { + if (slices_.get() == NULL) + { + return 0; + } + else + { + return slices_->GetSlicesCount(); + } + } + + void OffsetSlice(int offset) + { + if (slices_.get() != NULL) + { + int slice = static_cast(slice_) + offset; + + if (slice < 0) + { + slice = 0; + } + + if (slice >= static_cast(slices_->GetSlicesCount())) + { + slice = static_cast(slices_->GetSlicesCount()) - 1; + } + + if (slice != static_cast(slice_)) + { + SetSlice(slice); + } + } + } + + void SetSlice(size_t slice) + { + if (slices_.get() != NULL) + { + slice_ = slice; + + std::unique_ptr tmp(slices_->GetSlice(slice_)); + widget_.SetSlice(tmp->GetGeometry()); + } + } + }; + + + + class ReferenceLineSource : public IVolumeSlicer + { + private: + class RendererFactory : public LayerReadyMessage::IRendererFactory + { + private: + double x1_; + double y1_; + double x2_; + double y2_; + const OrthancStone::CoordinateSystem3D& slice_; + + public: + RendererFactory(double x1, + double y1, + double x2, + double y2, + const OrthancStone::CoordinateSystem3D& slice) : + x1_(x1), + y1_(y1), + x2_(x2), + y2_(y2), + slice_(slice) + { + } + + virtual ILayerRenderer* CreateRenderer() const + { + return new LineLayerRenderer(x1_, y1_, x2_, y2_, slice_); + } + }; + + SliceViewerWidget& otherPlane_; + + public: + ReferenceLineSource(OrthancStone::MessageBroker& broker, + SliceViewerWidget& otherPlane) : + IVolumeSlicer(broker), + otherPlane_(otherPlane) + { + BroadcastMessage(IVolumeSlicer::GeometryReadyMessage(*this)); + } + + virtual bool GetExtent(std::vector& points, + const OrthancStone::CoordinateSystem3D& viewportSlice) + { + return false; + } + + virtual void ScheduleLayerCreation(const OrthancStone::CoordinateSystem3D& viewportSlice) + { + Slice reference(viewportSlice, 0.001); + + OrthancStone::Vector p, d; + + const OrthancStone::CoordinateSystem3D& slice = otherPlane_.GetSlice(); + + // Compute the line of intersection between the two slices + if (!OrthancStone::GeometryToolbox::IntersectTwoPlanes(p, d, + slice.GetOrigin(), slice.GetNormal(), + viewportSlice.GetOrigin(), viewportSlice.GetNormal())) + { + // The two slice are parallel, don't try and display the intersection + BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, reference.GetGeometry())); + } + else + { + double x1, y1, x2, y2; + viewportSlice.ProjectPoint(x1, y1, p); + viewportSlice.ProjectPoint(x2, y2, p + 1000.0 * d); + + const OrthancStone::Extent2D extent = otherPlane_.GetSceneExtent(); + + if (OrthancStone::GeometryToolbox::ClipLineToRectangle(x1, y1, x2, y2, + x1, y1, x2, y2, + extent.GetX1(), extent.GetY1(), + extent.GetX2(), extent.GetY2())) + { + RendererFactory factory(x1, y1, x2, y2, slice); + BroadcastMessage(IVolumeSlicer::LayerReadyMessage(*this, factory, reference.GetGeometry())); + } + else + { + // Error: Parallel slices + BroadcastMessage(IVolumeSlicer::LayerErrorMessage(*this, reference.GetGeometry())); + } + } + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/FontRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/FontRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,178 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "FontRenderer.h" + +#include "../Toolbox/DynamicBitmap.h" + +#include + + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H + + +// https://stackoverflow.com/questions/31161284/how-can-i-get-the-corresponding-error-string-from-an-ft-error-code +static std::string GetErrorMessage(FT_Error err) +{ +#undef __FTERRORS_H__ +#define FT_ERRORDEF( e, v, s ) case e: return s; +#define FT_ERROR_START_LIST switch (err) { +#define FT_ERROR_END_LIST } +#include FT_ERRORS_H + return "(Unknown error)"; +} + + +static void CheckError(FT_Error err) +{ + if (err != 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Error in FreeType: " + GetErrorMessage(err)); + } +} + + +namespace OrthancStone +{ + class FontRenderer::PImpl : public boost::noncopyable + { + private: + std::string fontContent_; + FT_Library library_; + FT_Face face_; + + void Clear() + { + if (face_ != NULL) + { + FT_Done_Face(face_); + face_ = NULL; + } + + fontContent_.clear(); + } + + public: + PImpl() : + library_(NULL), + face_(NULL) + { + CheckError(FT_Init_FreeType(&library_)); + } + + + ~PImpl() + { + Clear(); + FT_Done_FreeType(library_); + } + + + void LoadFont(const std::string& fontContent, + unsigned int fontSize) + { + Clear(); + + // It is necessary to make a private copy of the font, as + // Freetype makes the assumption that the buffer containing the + // font is never deleted + fontContent_.assign(fontContent); + + const FT_Byte* data = reinterpret_cast(fontContent_.c_str()); + + CheckError(FT_New_Memory_Face( + library_, data, static_cast(fontContent_.size()), 0, &face_)); + + CheckError(FT_Set_Char_Size(face_, // handle to face object + 0, // char_width in 1/64th of points + fontSize * 64, // char_height in 1/64th of points + 72, // horizontal device resolution + 72)); // vertical device resolution + + CheckError(FT_Select_Charmap(face_, FT_ENCODING_UNICODE)); + } + + + Glyph* Render(uint32_t unicode) + { + if (face_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "First call LoadFont()"); + } + else if (FT_Load_Char(face_, unicode, FT_LOAD_RENDER) != 0) + { + // This character is not available + return NULL; + } + else + { + if (face_->glyph->format != FT_GLYPH_FORMAT_BITMAP) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + //CheckError(FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1)); + } + + Orthanc::ImageAccessor bitmap; + bitmap.AssignReadOnly(Orthanc::PixelFormat_Grayscale8, + face_->glyph->bitmap.width, + face_->glyph->bitmap.rows, + face_->glyph->bitmap.pitch, + face_->glyph->bitmap.buffer); + + std::unique_ptr glyph( + new Glyph(bitmap.GetWidth(), + bitmap.GetHeight(), + face_->glyph->bitmap_left, + -face_->glyph->bitmap_top, // Positive for an upwards vertical distance + face_->glyph->advance.x >> 6, + face_->glyph->metrics.vertAdvance >> 6)); + + glyph->SetPayload(new DynamicBitmap(bitmap)); + + return glyph.release(); + } + } + }; + + + + FontRenderer::FontRenderer() : + pimpl_(new PImpl) + { + } + + + void FontRenderer::LoadFont(const std::string& fontContent, + unsigned int fontSize) + { + pimpl_->LoadFont(fontContent, fontSize); + } + + + Glyph* FontRenderer::Render(uint32_t unicode) + { + return pimpl_->Render(unicode); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/FontRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/FontRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "Glyph.h" + +#include +#include + + +namespace OrthancStone +{ + class FontRenderer : public boost::noncopyable + { + private: + class PImpl; + boost::shared_ptr pimpl_; + + public: + FontRenderer(); + + void LoadFont(const std::string& fontContent, + unsigned int fontSize); + + Glyph* Render(uint32_t unicode); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/Glyph.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/Glyph.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,93 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Glyph.h" + +#include + + +namespace OrthancStone +{ + Glyph::Glyph(const Glyph& other) : + width_(other.width_), + height_(other.height_), + offsetLeft_(other.offsetLeft_), + offsetTop_(other.offsetTop_), + advanceX_(other.advanceX_), + lineHeight_(other.lineHeight_) + { + } + + + Glyph::Glyph(unsigned int width, + unsigned int height, + int offsetLeft, + int offsetTop, + int advanceX, + unsigned int lineHeight) : + width_(width), + height_(height), + offsetLeft_(offsetLeft), + offsetTop_(offsetTop), + advanceX_(advanceX), + lineHeight_(lineHeight) + { + } + + + void Glyph::SetPayload(Orthanc::IDynamicObject* payload) // Takes ownership + { + if (payload == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + payload_.reset(payload); + } + } + + + const Orthanc::IDynamicObject& Glyph::GetPayload() const + { + if (payload_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *payload_; + } + } + + + Orthanc::IDynamicObject* Glyph::ReleasePayload() + { + if (payload_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return payload_.release(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/Glyph.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/Glyph.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +#include + + +namespace OrthancStone +{ + class Glyph : public boost::noncopyable + { + private: + unsigned int width_; + unsigned int height_; + int offsetLeft_; + int offsetTop_; + int advanceX_; + unsigned int lineHeight_; + + std::unique_ptr payload_; + + public: + // WARNING: This does not copy the payload + Glyph(const Glyph& other); + + Glyph(unsigned int width, + unsigned int height, + int offsetLeft, + int offsetTop, + int advanceX, + unsigned int lineHeight); + + void SetPayload(Orthanc::IDynamicObject* payload); + + int GetOffsetLeft() const + { + return offsetLeft_; + } + + int GetOffsetTop() const + { + return offsetTop_; + } + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + unsigned int GetAdvanceX() const + { + return advanceX_; + } + + unsigned int GetLineHeight() const + { + return lineHeight_; + } + + bool HasPayload() const + { + return payload_.get() != NULL; + } + + const Orthanc::IDynamicObject& GetPayload() const; + + Orthanc::IDynamicObject* ReleasePayload(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphAlphabet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphAlphabet.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,169 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GlyphAlphabet.h" + +#include +#include + + +namespace OrthancStone +{ + void GlyphAlphabet::Clear() + { + for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + content_.clear(); + lineHeight_ = 0; + } + + + void GlyphAlphabet::Register(uint32_t unicode, + const Glyph& glyph, + Orthanc::IDynamicObject* payload) + { + std::unique_ptr protection(payload); + + // Don't add twice the same character + if (content_.find(unicode) == content_.end()) + { + std::unique_ptr raii(new Glyph(glyph)); + + if (payload != NULL) + { + raii->SetPayload(protection.release()); + } + + content_[unicode] = raii.release(); + + lineHeight_ = std::max(lineHeight_, glyph.GetLineHeight()); + } + } + + + void GlyphAlphabet::Register(FontRenderer& renderer, + uint32_t unicode) + { + std::unique_ptr glyph(renderer.Render(unicode)); + + if (glyph.get() != NULL) + { + Register(unicode, *glyph, glyph->ReleasePayload()); + } + } + + +#if ORTHANC_ENABLE_LOCALE == 1 + bool GlyphAlphabet::GetUnicodeFromCodepage(uint32_t& unicode, + unsigned int index, + Orthanc::Encoding encoding) + { + if (index > 255) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::string character; + character.resize(1); + character[0] = static_cast(index); + + std::string utf8 = Orthanc::Toolbox::ConvertToUtf8(character, encoding, false /* no code extensions */); + + if (utf8.empty()) + { + // This character is not available in this codepage + return false; + } + else + { + size_t length; + Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, length, utf8, 0); + assert(length != 0); + return true; + } + } +#endif + + + void GlyphAlphabet::Apply(IGlyphVisitor& visitor) const + { + for (Content::const_iterator it = content_.begin(); it != content_.end(); ++it) + { + assert(it->second != NULL); + visitor.Visit(it->first, *it->second); + } + } + + + void GlyphAlphabet::Apply(ITextVisitor& visitor, + const std::string& utf8) const + { + size_t pos = 0; + int x = 0; + int y = 0; + + while (pos < utf8.size()) + { + if (utf8[pos] == '\r') + { + // Ignore carriage return + pos++; + } + else if (utf8[pos] == '\n') + { + // This is a newline character + x = 0; + y += static_cast(lineHeight_); + + pos++; + } + else + { + uint32_t unicode; + size_t length; + Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, length, utf8, pos); + + Content::const_iterator glyph = content_.find(unicode); + + if (glyph != content_.end()) + { + assert(glyph->second != NULL); + const Orthanc::IDynamicObject* payload = + (glyph->second->HasPayload() ? &glyph->second->GetPayload() : NULL); + + visitor.Visit(unicode, + x + glyph->second->GetOffsetLeft(), + y + glyph->second->GetOffsetTop(), + glyph->second->GetWidth(), + glyph->second->GetHeight(), + payload); + x += glyph->second->GetAdvanceX(); + } + + assert(length != 0); + pos += length; + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphAlphabet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphAlphabet.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,105 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "FontRenderer.h" + +#include + +#include + +namespace OrthancStone +{ + class GlyphAlphabet : public boost::noncopyable + { + public: + class ITextVisitor : public boost::noncopyable + { + public: + virtual ~ITextVisitor() + { + } + + virtual void Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload /* can be NULL */) = 0; + }; + + + class IGlyphVisitor : public boost::noncopyable + { + public: + virtual ~IGlyphVisitor() + { + } + + virtual void Visit(uint32_t unicode, + const Glyph& glyph) = 0; + }; + + + private: + typedef std::map Content; + + Content content_; + unsigned int lineHeight_; + + public: + GlyphAlphabet() : + lineHeight_(0) + { + } + + ~GlyphAlphabet() + { + Clear(); + } + + void Clear(); + + void Register(uint32_t unicode, + const Glyph& glyph, + Orthanc::IDynamicObject* payload); + + void Register(FontRenderer& renderer, + uint32_t unicode); + +#if ORTHANC_ENABLE_LOCALE == 1 + static bool GetUnicodeFromCodepage(uint32_t& unicode, + unsigned int index, + Orthanc::Encoding encoding); +#endif + + size_t GetSize() const + { + return content_.size(); + } + + void Apply(IGlyphVisitor& visitor) const; + + void Apply(ITextVisitor& visitor, + const std::string& utf8) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphBitmapAlphabet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphBitmapAlphabet.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,113 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GlyphBitmapAlphabet.h" + +#include "TextBoundingBox.h" +#include "../Toolbox/DynamicBitmap.h" + +#include +#include + +namespace OrthancStone +{ + class GlyphBitmapAlphabet::RenderTextVisitor : public GlyphAlphabet::ITextVisitor + { + private: + Orthanc::ImageAccessor& target_; + const GlyphBitmapAlphabet& that_; + int offsetX_; + int offsetY_; + + public: + RenderTextVisitor(Orthanc::ImageAccessor& target, + const GlyphBitmapAlphabet& that, + int offsetX, + int offsetY) : + target_(target), + that_(that), + offsetX_(offsetX), + offsetY_(offsetY) + { + } + + virtual void Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload) + { + int left = x + offsetX_; + int top = y + offsetY_; + + assert(payload != NULL); + const DynamicBitmap& glyph = *dynamic_cast(payload); + + assert(left >= 0 && + top >= 0 && + static_cast(left) + width <= target_.GetWidth() && + static_cast(top) + height <= target_.GetHeight() && + width == glyph.GetBitmap().GetWidth() && + height == glyph.GetBitmap().GetHeight()); + + { + Orthanc::ImageAccessor region; + target_.GetRegion(region, left, top, width, height); + Orthanc::ImageProcessing::Copy(region, glyph.GetBitmap()); + } + } + }; + + +#if ORTHANC_ENABLE_LOCALE == 1 + void GlyphBitmapAlphabet::LoadCodepage(FontRenderer& renderer, + Orthanc::Encoding codepage) + { + for (unsigned int i = 0; i < 256; i++) + { + uint32_t unicode; + if (GlyphAlphabet::GetUnicodeFromCodepage(unicode, i, codepage)) + { + AddUnicodeCharacter(renderer, unicode); + } + } + } +#endif + + + Orthanc::ImageAccessor* GlyphBitmapAlphabet::RenderText(const std::string& utf8) const + { + TextBoundingBox box(alphabet_, utf8); + + std::unique_ptr bitmap( + new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, + box.GetWidth(), box.GetHeight(), + true /* force minimal pitch */)); + + Orthanc::ImageProcessing::Set(*bitmap, 0); + + RenderTextVisitor visitor(*bitmap, *this, -box.GetLeft(), -box.GetTop()); + alphabet_.Apply(visitor, utf8); + + return bitmap.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphBitmapAlphabet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphBitmapAlphabet.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "GlyphAlphabet.h" + +#include + +namespace OrthancStone +{ + class GlyphBitmapAlphabet : public boost::noncopyable + { + private: + class RenderTextVisitor; + + GlyphAlphabet alphabet_; + + public: + const GlyphAlphabet& GetAlphabet() const + { + return alphabet_; + } + + void AddUnicodeCharacter(FontRenderer& renderer, + uint32_t unicode) + { + alphabet_.Register(renderer, unicode); + } + + +#if ORTHANC_ENABLE_LOCALE == 1 + void LoadCodepage(FontRenderer& renderer, + Orthanc::Encoding codepage); +#endif + + + Orthanc::ImageAccessor* RenderText(const std::string& utf8) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphTextureAlphabet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphTextureAlphabet.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,304 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GlyphTextureAlphabet.h" + +#include "TextBoundingBox.h" +#include "../Toolbox/DynamicBitmap.h" + +#include +#include +#include + +#if defined(__EMSCRIPTEN__) +/* +Avoid this error: +.../boost/math/special_functions/round.hpp:86:12: warning: implicit conversion from 'std::__2::numeric_limits::type' (aka 'int') to 'float' changes value from 2147483647 to 2147483648 [-Wimplicit-int-float-conversion] +.../boost/math/special_functions/round.hpp:93:11: note: in instantiation of function template specialization 'boost::math::iround >' requested here +.../orthanc-stone/Framework/Fonts/GlyphTextureAlphabet.cpp:92:28: note: in instantiation of function template specialization 'boost::math::iround' requested here +*/ +#pragma GCC diagnostic ignored "-Wimplicit-int-float-conversion" +#endif + +#include + +namespace OrthancStone +{ + class GlyphTextureAlphabet::GlyphSizeVisitor : public GlyphAlphabet::IGlyphVisitor + { + private: + unsigned int maxWidth_; + unsigned int maxHeight_; + + public: + GlyphSizeVisitor() : + maxWidth_(0), + maxHeight_(0) + { + } + + virtual void Visit(uint32_t unicode, + const Glyph& glyph) + { + maxWidth_ = std::max(maxWidth_, glyph.GetWidth()); + maxHeight_ = std::max(maxHeight_, glyph.GetHeight()); + } + + unsigned int GetMaxWidth() const + { + return maxWidth_; + } + + unsigned int GetMaxHeight() const + { + return maxHeight_; + } + }; + + + class GlyphTextureAlphabet::TextureGenerator : public GlyphAlphabet::IGlyphVisitor + { + private: + std::unique_ptr texture_; + + unsigned int countColumns_; + unsigned int countRows_; + GlyphAlphabet& targetAlphabet_; + unsigned int glyphMaxWidth_; + unsigned int glyphMaxHeight_; + unsigned int column_; + unsigned int row_; + + public: + TextureGenerator(GlyphAlphabet& targetAlphabet, + unsigned int countGlyphs, + unsigned int glyphMaxWidth, + unsigned int glyphMaxHeight) : + targetAlphabet_(targetAlphabet), + glyphMaxWidth_(glyphMaxWidth), + glyphMaxHeight_(glyphMaxHeight), + column_(0), + row_(0) + { + int c = boost::math::iround(sqrt(static_cast(countGlyphs))); + + if (c <= 0) + { + countColumns_ = 1; + } + else + { + countColumns_ = static_cast(c); + } + + countRows_ = countGlyphs / countColumns_; + if (countGlyphs % countColumns_ != 0) + { + countRows_++; + } + + texture_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, + countColumns_ * glyphMaxWidth_, + countRows_ * glyphMaxHeight_, + true /* force minimal pitch */)); + + Orthanc::ImageProcessing::Set(*texture_, 0, 0, 0, 0); + } + + + virtual void Visit(uint32_t unicode, + const Glyph& glyph) + { + if (!glyph.HasPayload()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + if (column_ >= countColumns_ || + row_ >= countRows_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + unsigned int x = column_ * glyphMaxWidth_; + unsigned int y = row_ * glyphMaxHeight_; + + const Orthanc::ImageAccessor& source = dynamic_cast(glyph.GetPayload()).GetBitmap(); + + if (source.GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + targetAlphabet_.Register(unicode, glyph, new TextureLocation(x, y)); + + Orthanc::ImageAccessor target; + texture_->GetRegion(target, x, y, source.GetWidth(), source.GetHeight()); + + //Orthanc::ImageProcessing::Copy(target, bitmap->GetBitmap()); + + for (unsigned int y = 0; y < source.GetHeight(); y++) + { + const uint8_t* p = reinterpret_cast(source.GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < source.GetWidth(); x++) + { + // Premultiplied alpha + q[0] = 0; + q[1] = 0; + q[2] = 0; + q[3] = *p; + + p++; + q += 4; + } + } + + column_++; + if (column_ == countColumns_) + { + column_ = 0; + row_++; + } + } + + + Orthanc::ImageAccessor* ReleaseTexture() + { + return texture_.release(); + } + }; + + + class GlyphTextureAlphabet::RenderTextVisitor : public GlyphAlphabet::ITextVisitor + { + private: + Orthanc::ImageAccessor& target_; + const Orthanc::ImageAccessor& texture_; + int offsetX_; + int offsetY_; + + public: + RenderTextVisitor(Orthanc::ImageAccessor& target, + const GlyphTextureAlphabet& that, + int offsetX, + int offsetY) : + target_(target), + texture_(that.GetTexture()), + offsetX_(offsetX), + offsetY_(offsetY) + { + } + + virtual void Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload) + { + int left = x + offsetX_; + int top = y + offsetY_; + + assert(payload != NULL); + const TextureLocation& location = *dynamic_cast(payload); + + assert(left >= 0 && + top >= 0 && + static_cast(left) + width <= target_.GetWidth() && + static_cast(top) + height <= target_.GetHeight()); + + { + Orthanc::ImageAccessor to; + target_.GetRegion(to, left, top, width, height); + + Orthanc::ImageAccessor from; + texture_.GetRegion(from, location.GetX(), location.GetY(), width, height); + + Orthanc::ImageProcessing::Copy(to, from); + } + } + }; + + + GlyphTextureAlphabet::GlyphTextureAlphabet(const GlyphBitmapAlphabet& sourceAlphabet) : + textureWidth_(0), + textureHeight_(0) + { + GlyphSizeVisitor size; + sourceAlphabet.GetAlphabet().Apply(size); + + TextureGenerator generator(alphabet_, + static_cast(sourceAlphabet.GetAlphabet().GetSize()), + size.GetMaxWidth(), + size.GetMaxHeight()); + sourceAlphabet.GetAlphabet().Apply(generator); + + texture_.reset(generator.ReleaseTexture()); + textureWidth_ = texture_->GetWidth(); + textureHeight_ = texture_->GetHeight(); + } + + + const Orthanc::ImageAccessor& GlyphTextureAlphabet::GetTexture() const + { + if (texture_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *texture_; + } + } + + + Orthanc::ImageAccessor* GlyphTextureAlphabet::ReleaseTexture() + { + if (texture_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return texture_.release(); + } + } + + + Orthanc::ImageAccessor* GlyphTextureAlphabet::RenderText(const std::string& utf8) + { + TextBoundingBox box(alphabet_, utf8); + + std::unique_ptr bitmap( + new Orthanc::Image(Orthanc::PixelFormat_RGBA32, + box.GetWidth(), box.GetHeight(), + true /* force minimal pitch */)); + + Orthanc::ImageProcessing::Set(*bitmap, 0, 0, 0, 0); + + RenderTextVisitor visitor(*bitmap, *this, -box.GetLeft(), -box.GetTop()); + alphabet_.Apply(visitor, utf8); + + return bitmap.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/GlyphTextureAlphabet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/GlyphTextureAlphabet.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,92 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "GlyphBitmapAlphabet.h" + +#include + +namespace OrthancStone +{ + class GlyphTextureAlphabet : public boost::noncopyable + { + public: + class TextureLocation : public Orthanc::IDynamicObject + { + private: + unsigned int x_; + unsigned int y_; + + public: + TextureLocation(unsigned int x, + unsigned int y) : + x_(x), + y_(y) + { + } + + unsigned int GetX() const + { + return x_; + } + + unsigned int GetY() const + { + return y_; + } + }; + + private: + class GlyphSizeVisitor; + class TextureGenerator; + class RenderTextVisitor; + + GlyphAlphabet alphabet_; + std::unique_ptr texture_; + unsigned int textureWidth_; + unsigned int textureHeight_; + + public: + GlyphTextureAlphabet(const GlyphBitmapAlphabet& sourceAlphabet); + + const Orthanc::ImageAccessor& GetTexture() const; + + Orthanc::ImageAccessor* ReleaseTexture(); + + Orthanc::ImageAccessor* RenderText(const std::string& utf8); + + const GlyphAlphabet& GetAlphabet() const + { + return alphabet_; + } + + unsigned int GetTextureWidth() const + { + return textureWidth_; + } + + unsigned int GetTextureHeight() const + { + return textureHeight_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/OpenGLTextCoordinates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/OpenGLTextCoordinates.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,117 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLTextCoordinates.h" + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + void OpenGLTextCoordinates::Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload) + { + // Rendering coordinates + float rx1 = static_cast(x - box_.GetLeft()); + float ry1 = static_cast(y - box_.GetTop()); + float rx2 = rx1 + static_cast(width); + float ry2 = ry1 + static_cast(height); + + // Texture coordinates + assert(payload != NULL); + const GlyphTextureAlphabet::TextureLocation& location = + *dynamic_cast(payload); + + float tx1 = location.GetX() / textureWidth_; + float ty1 = location.GetY() / textureHeight_; + float tx2 = tx1 + (static_cast(width) / textureWidth_); + float ty2 = ty1 + (static_cast(height) / textureHeight_); + + const float rpos[6][2] = { + { rx1, ry1 }, + { rx1, ry2 }, + { rx2, ry1 }, + { rx2, ry1 }, + { rx1, ry2 }, + { rx2, ry2 } + }; + + const float tpos[6][2] = { + { tx1, ty1 }, + { tx1, ty2 }, + { tx2, ty1 }, + { tx2, ty1 }, + { tx1, ty2 }, + { tx2, ty2 } + }; + + for (unsigned int i = 0; i < 6; i++) + { + renderingCoords_.push_back(rpos[i][0]); + renderingCoords_.push_back(rpos[i][1]); + textureCoords_.push_back(tpos[i][0]); + textureCoords_.push_back(tpos[i][1]); + } + } + + + OpenGLTextCoordinates::OpenGLTextCoordinates(const GlyphTextureAlphabet& alphabet, + const std::string& utf8) : + box_(alphabet.GetAlphabet(), utf8), + textureWidth_(static_cast(alphabet.GetTextureWidth())), + textureHeight_(static_cast(alphabet.GetTextureHeight())) + { + if (textureWidth_ <= 0 || + textureHeight_ <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + width_ = static_cast(box_.GetWidth()); + height_ = static_cast(box_.GetHeight()); + + // Each character is made of two 2D triangles (= 2 * 3 * 2 = 12) + renderingCoords_.reserve(box_.GetCharactersCount() * 12); + textureCoords_.reserve(box_.GetCharactersCount() * 12); + + alphabet.GetAlphabet().Apply(*this, utf8); + } + + + const std::vector& OpenGLTextCoordinates::GetRenderingCoords() const + { + assert(renderingCoords_.size() == textureCoords_.size()); + return renderingCoords_; + } + + + const std::vector& OpenGLTextCoordinates::GetTextureCoords() const + { + assert(renderingCoords_.size() == textureCoords_.size()); + return textureCoords_; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/OpenGLTextCoordinates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/OpenGLTextCoordinates.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "GlyphTextureAlphabet.h" +#include "TextBoundingBox.h" + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class OpenGLTextCoordinates : protected GlyphAlphabet::ITextVisitor + { + private: + TextBoundingBox box_; + float width_; + float height_; + std::vector renderingCoords_; + std::vector textureCoords_; + float textureWidth_; + float textureHeight_; + + protected: + virtual void Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload); + + public: + OpenGLTextCoordinates(const GlyphTextureAlphabet& alphabet, + const std::string& utf8); + + unsigned int GetTextWidth() const + { + return box_.GetWidth(); + } + + unsigned int GetTextHeight() const + { + return box_.GetHeight(); + } + + bool IsEmpty() const + { + return renderingCoords_.empty(); + } + + const std::vector& GetRenderingCoords() const; + + const std::vector& GetTextureCoords() const; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/TextBoundingBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/TextBoundingBox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TextBoundingBox.h" + +namespace OrthancStone +{ + void TextBoundingBox::AddPoint(int x, + int y) + { + left_ = std::min(left_, x); + right_ = std::max(right_, x); + top_ = std::min(top_, y); + bottom_ = std::max(bottom_, y); + } + + + void TextBoundingBox::Clear() + { + left_ = 0; + top_ = 0; + right_ = 0; + bottom_ = 0; + countCharacters_ = 0; + } + + + void TextBoundingBox::Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload /* ignored */) + { + AddPoint(x, y); + AddPoint(x + static_cast(width), + y + static_cast(height)); + countCharacters_++; + } + + + TextBoundingBox::TextBoundingBox(const GlyphAlphabet& alphabet, + const std::string& utf8) + { + Clear(); + alphabet.Apply(*this, utf8); + } + + + unsigned int TextBoundingBox::GetWidth() const + { + assert(left_ <= right_); + return static_cast(right_ - left_ + 1); + } + + + unsigned int TextBoundingBox::GetHeight() const + { + assert(top_ <= bottom_); + return static_cast(bottom_ - top_ + 1); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Fonts/TextBoundingBox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Fonts/TextBoundingBox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "GlyphAlphabet.h" + +namespace OrthancStone +{ + class TextBoundingBox : protected GlyphAlphabet::ITextVisitor + { + private: + int left_; + int top_; + int right_; + int bottom_; + unsigned int countCharacters_; + + void AddPoint(int x, + int y); + + void Clear(); + + protected: + virtual void Visit(uint32_t unicode, + int x, + int y, + unsigned int width, + unsigned int height, + const Orthanc::IDynamicObject* payload /* ignored */); + + public: + TextBoundingBox(const GlyphAlphabet& alphabet, + const std::string& utf8); + + int GetLeft() const + { + return left_; + } + + int GetTop() const + { + return top_; + } + + unsigned int GetWidth() const; + + unsigned int GetHeight() const; + + unsigned int GetCharactersCount() const + { + return countCharacters_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/BasicFetchingItemsSorter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/BasicFetchingItemsSorter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,74 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "BasicFetchingItemsSorter.h" + +#include + +namespace OrthancStone +{ + BasicFetchingItemsSorter::BasicFetchingItemsSorter(unsigned int itemsCount) : + itemsCount_(itemsCount) + { + if (itemsCount == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void BasicFetchingItemsSorter::Sort(std::vector& target, + unsigned int current) + { + if (current >= itemsCount_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + target.clear(); + target.reserve(itemsCount_); + target.push_back(current); + + const unsigned int countBelow = current; + const unsigned int countAbove = (itemsCount_ - 1) - current; + const unsigned int n = std::min(countBelow, countAbove); + + for (unsigned int i = 1; i <= n; i++) + { + assert(current + i < itemsCount_ && + current >= i); + target.push_back(current + i); + target.push_back(current - i); + } + + for (unsigned int i = current - n; i > 0; i--) + { + target.push_back(i - 1); + } + + for (unsigned int i = current + n + 1; i < itemsCount_; i++) + { + target.push_back(i); + } + + assert(target.size() == itemsCount_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/BasicFetchingItemsSorter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/BasicFetchingItemsSorter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,53 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IFetchingItemsSorter.h" + +namespace OrthancStone +{ + class BasicFetchingItemsSorter : public IFetchingItemsSorter + { + private: + unsigned int itemsCount_; + + public: + class Factory : public IFactory + { + public: + virtual IFetchingItemsSorter* CreateSorter(unsigned int itemsCount) const + { + return new BasicFetchingItemsSorter(itemsCount); + } + }; + + BasicFetchingItemsSorter(unsigned int itemsCount); + + virtual unsigned int GetItemsCount() const + { + return itemsCount_; + } + + virtual void Sort(std::vector& target, + unsigned int current); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/BasicFetchingStrategy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/BasicFetchingStrategy.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,145 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "BasicFetchingStrategy.h" + +#include + +namespace OrthancStone +{ + void BasicFetchingStrategy::Schedule(unsigned int item, + unsigned int quality) + { + assert(item < GetItemsCount() && + quality <= maxQuality_); + + if (nextQuality_[item] <= quality) + { + content_.push_back(ContentItem(item, quality)); + } + } + + + BasicFetchingStrategy::BasicFetchingStrategy(IFetchingItemsSorter* sorter, // Takes ownership + unsigned int maxQuality) : + sorter_(sorter), + maxQuality_(maxQuality), + position_(0), + blockSize_(2) + { + if (sorter == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + nextQuality_.resize(sorter_->GetItemsCount(), 0); // Does not change along calls to "SetCurrent()" + + SetCurrent(0); + } + + + void BasicFetchingStrategy::SetBlockSize(unsigned int size) + { + if (size <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + blockSize_ = size; + } + + + bool BasicFetchingStrategy::GetNext(unsigned int& item, + unsigned int& quality) + { + if (position_ >= content_.size()) + { + return false; + } + else + { + item = content_[position_].GetItem(); + quality = content_[position_].GetQuality(); + + assert(nextQuality_[item] <= quality); + nextQuality_[item] = quality + 1; + + position_ ++; + return true; + } + } + + + void BasicFetchingStrategy::SetCurrent(unsigned int item) + { + // TODO - This function is O(N) complexity where "N" is the + // number of items times the max quality. Could use a LRU index. + + position_ = 0; + + std::vector v; + sorter_->Sort(v, item); + + assert(v.size() == GetItemsCount()); + + if (v.size() == 0) + { + return; + } + + content_.clear(); + content_.reserve(v.size() * maxQuality_); + + Schedule(v.front(), maxQuality_); + + for (unsigned int q = 0; q <= maxQuality_; q++) + { + unsigned int start = 1 + q * blockSize_; + unsigned int end = start + blockSize_; + + if (q == maxQuality_ || + end > v.size()) + { + end = static_cast(v.size()); + } + + unsigned int a = 0; + if (maxQuality_ >= q + 1) + { + a = maxQuality_ - q - 1; + } + + for (unsigned int j = a; j <= maxQuality_; j++) + { + for (unsigned int i = start; i < end; i++) + { + Schedule(v[i], j); + } + } + } + } + + + void BasicFetchingStrategy::RecycleFurthest(unsigned int& item) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/BasicFetchingStrategy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/BasicFetchingStrategy.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IFetchingItemsSorter.h" +#include "IFetchingStrategy.h" + +#include + +#include + +namespace OrthancStone +{ + class BasicFetchingStrategy : public IFetchingStrategy + { + private: + class ContentItem + { + private: + unsigned int item_; + unsigned int quality_; + + public: + ContentItem(unsigned int item, + unsigned int quality) : + item_(item), + quality_(quality) + { + } + + unsigned int GetItem() const + { + return item_; + } + + unsigned int GetQuality() const + { + return quality_; + } + }; + + std::unique_ptr sorter_; + std::vector nextQuality_; + unsigned int maxQuality_; + std::vector content_; + size_t position_; + unsigned int blockSize_; + + void Schedule(unsigned int item, + unsigned int quality); + + public: + BasicFetchingStrategy(IFetchingItemsSorter* sorter, // Takes ownership + unsigned int maxQuality); + + virtual unsigned int GetItemsCount() const + { + return sorter_->GetItemsCount(); + } + + virtual unsigned int GetMaxQuality() const + { + return maxQuality_; + } + + // WARNING - This parameters is only considered during the next + // call to SetCurrent(). + void SetBlockSize(unsigned int size); + + virtual bool GetNext(unsigned int& item, + unsigned int& quality); + + virtual void SetCurrent(unsigned int item); + + virtual void RecycleFurthest(unsigned int& item); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomResourcesLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomResourcesLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,910 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomResourcesLoader.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "../Oracle/ParseDicomFromFileCommand.h" +# include +# include +#endif + +#include + +namespace OrthancStone +{ + static std::string GetUri(Orthanc::ResourceType level) + { + switch (level) + { + case Orthanc::ResourceType_Patient: + return "patients"; + + case Orthanc::ResourceType_Study: + return "studies"; + + case Orthanc::ResourceType_Series: + return "series"; + + case Orthanc::ResourceType_Instance: + return "instances"; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + class DicomResourcesLoader::Handler : public Orthanc::IDynamicObject + { + private: + boost::shared_ptr loader_; + boost::shared_ptr target_; + int priority_; + DicomSource source_; + boost::shared_ptr userPayload_; + + public: + Handler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr userPayload) : + loader_(loader), + target_(target), + priority_(priority), + source_(source), + userPayload_(userPayload) + { + if (!loader || + !target) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + virtual ~Handler() + { + } + + void BroadcastSuccess() + { + SuccessMessage message(*loader_, target_, priority_, source_, userPayload_.get()); + loader_->BroadcastMessage(message); + } + + boost::shared_ptr GetLoader() + { + assert(loader_); + return loader_; + } + + boost::shared_ptr GetTarget() + { + assert(target_); + return target_; + } + + int GetPriority() const + { + return priority_; + } + + const DicomSource& GetSource() const + { + return source_; + } + + const boost::shared_ptr GetUserPayload() const + { + return userPayload_; + } + }; + + + class DicomResourcesLoader::StringHandler : public DicomResourcesLoader::Handler + { + public: + StringHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr userPayload) : + Handler(loader, target, priority, source, userPayload) + { + } + + virtual void HandleJson(const Json::Value& body) = 0; + + virtual void HandleString(const std::string& body) + { + Json::Reader reader; + Json::Value value; + if (reader.parse(body, value)) + { + HandleJson(value); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + }; + + + class DicomResourcesLoader::DicomWebHandler : public StringHandler + { + public: + DicomWebHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr userPayload) : + StringHandler(loader, target, priority, source, userPayload) + { + } + + virtual void HandleJson(const Json::Value& body) + { + GetTarget()->AddFromDicomWeb(body); + BroadcastSuccess(); + } + }; + + + class DicomResourcesLoader::OrthancHandler : public StringHandler + { + private: + boost::shared_ptr remainingCommands_; + + protected: + void CloseCommand() + { + assert(remainingCommands_); + + if (*remainingCommands_ == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + (*remainingCommands_) --; + + if (*remainingCommands_ == 0) + { + BroadcastSuccess(); + } + } + + public: + OrthancHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload) : + StringHandler(loader, target, priority, source, userPayload), + remainingCommands_(remainingCommands) + { + if (!remainingCommands) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + (*remainingCommands) ++; + } + + boost::shared_ptr GetRemainingCommands() + { + assert(remainingCommands_); + return remainingCommands_; + } + }; + + + class DicomResourcesLoader::OrthancInstanceTagsHandler : public OrthancHandler + { + public: + OrthancInstanceTagsHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload) : + OrthancHandler(loader, target, priority, source, remainingCommands, userPayload) + { + } + + virtual void HandleJson(const Json::Value& body) + { + GetTarget()->AddFromOrthanc(body); + CloseCommand(); + } + }; + + + class DicomResourcesLoader::OrthancOneChildInstanceHandler : public OrthancHandler + { + public: + OrthancOneChildInstanceHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload) : + OrthancHandler(loader, target, priority, source, remainingCommands, userPayload) + { + } + + virtual void HandleJson(const Json::Value& body) + { + static const char* const ID = "ID"; + + if (body.type() == Json::arrayValue) + { + if (body.size() > 0) + { + if (body[0].type() == Json::objectValue && + body[0].isMember(ID) && + body[0][ID].type() == Json::stringValue) + { + GetLoader()->ScheduleLoadOrthancInstanceTags + (GetTarget(), GetPriority(), GetSource(), body[0][ID].asString(), GetRemainingCommands(), GetUserPayload()); + CloseCommand(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + }; + + + class DicomResourcesLoader::OrthancAllChildrenInstancesHandler : public OrthancHandler + { + private: + Orthanc::ResourceType bottomLevel_; + + public: + OrthancAllChildrenInstancesHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr remainingCommands, + Orthanc::ResourceType bottomLevel, + boost::shared_ptr userPayload) : + OrthancHandler(loader, target, priority, source, remainingCommands, userPayload), + bottomLevel_(bottomLevel) + { + } + + virtual void HandleJson(const Json::Value& body) + { + static const char* const ID = "ID"; + static const char* const INSTANCES = "Instances"; + + if (body.type() == Json::arrayValue) + { + for (Json::Value::ArrayIndex i = 0; i < body.size(); i++) + { + switch (bottomLevel_) + { + case Orthanc::ResourceType_Patient: + case Orthanc::ResourceType_Study: + if (body[i].type() == Json::objectValue && + body[i].isMember(ID) && + body[i][ID].type() == Json::stringValue) + { + GetLoader()->ScheduleLoadOrthancOneChildInstance + (GetTarget(), GetPriority(), GetSource(), bottomLevel_, + body[i][ID].asString(), GetRemainingCommands(), GetUserPayload()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + break; + + case Orthanc::ResourceType_Series: + // At the series level, avoid a call to + // "/series/.../instances", as we already have this + // information in the JSON + if (body[i].type() == Json::objectValue && + body[i].isMember(INSTANCES) && + body[i][INSTANCES].type() == Json::arrayValue) + { + if (body[i][INSTANCES].size() > 0) + { + if (body[i][INSTANCES][0].type() == Json::stringValue) + { + GetLoader()->ScheduleLoadOrthancInstanceTags + (GetTarget(), GetPriority(), GetSource(), + body[i][INSTANCES][0].asString(), GetRemainingCommands(), GetUserPayload()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + } + + break; + + case Orthanc::ResourceType_Instance: + if (body[i].type() == Json::objectValue && + body[i].isMember(ID) && + body[i][ID].type() == Json::stringValue) + { + GetLoader()->ScheduleLoadOrthancInstanceTags + (GetTarget(), GetPriority(), GetSource(), + body[i][ID].asString(), GetRemainingCommands(), GetUserPayload()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + + CloseCommand(); + } + }; + + +#if ORTHANC_ENABLE_DCMTK == 1 + static void ExploreDicomDir(OrthancStone::LoadedDicomResources& instances, + const Orthanc::ParsedDicomDir& dicomDir, + Orthanc::ResourceType level, + size_t index, + const Orthanc::DicomMap& parent) + { + std::string expectedType; + + switch (level) + { + case Orthanc::ResourceType_Patient: + expectedType = "PATIENT"; + break; + + case Orthanc::ResourceType_Study: + expectedType = "STUDY"; + break; + + case Orthanc::ResourceType_Series: + expectedType = "SERIES"; + break; + + case Orthanc::ResourceType_Instance: + expectedType = "IMAGE"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + for (;;) + { + std::unique_ptr current(dicomDir.GetItem(index).Clone()); + current->RemoveBinaryTags(); + current->Merge(parent); + + std::string type; + if (!current->LookupStringValue(type, Orthanc::DICOM_TAG_DIRECTORY_RECORD_TYPE, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (type == expectedType) + { + if (level == Orthanc::ResourceType_Instance) + { + instances.AddResource(*current); + } + else + { + size_t lower; + if (dicomDir.LookupLower(lower, index)) + { + ExploreDicomDir(instances, dicomDir, Orthanc::GetChildResourceType(level), lower, *current); + } + } + } + + size_t next; + if (dicomDir.LookupNext(next, index)) + { + index = next; + } + else + { + return; + } + } + } +#endif + + +#if ORTHANC_ENABLE_DCMTK == 1 + void DicomResourcesLoader::GetDicomDirInstances(LoadedDicomResources& target, + const Orthanc::ParsedDicomDir& dicomDir) + { + Orthanc::DicomMap parent; + ExploreDicomDir(target, dicomDir, Orthanc::ResourceType_Patient, 0, parent); + } +#endif + + +#if ORTHANC_ENABLE_DCMTK == 1 + class DicomResourcesLoader::DicomDirHandler : public StringHandler + { + public: + DicomDirHandler(boost::shared_ptr loader, + boost::shared_ptr target, + int priority, + const DicomSource& source, + boost::shared_ptr userPayload) : + StringHandler(loader, target, priority, source, userPayload) + { + } + + virtual void HandleJson(const Json::Value& body) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + virtual void HandleString(const std::string& body) + { + Orthanc::ParsedDicomDir dicomDir(body); + GetDicomDirInstances(*GetTarget(), dicomDir); + BroadcastSuccess(); + } + }; +#endif + + + void DicomResourcesLoader::Handle(const HttpCommand::SuccessMessage& message) + { + if (message.GetOrigin().HasPayload()) + { + dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetAnswer()); + } + } + + + void DicomResourcesLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) + { + if (message.GetOrigin().HasPayload()) + { + dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetAnswer()); + } + } + + + void DicomResourcesLoader::Handle(const ReadFileCommand::SuccessMessage& message) + { + if (message.GetOrigin().HasPayload()) + { + dynamic_cast(message.GetOrigin().GetPayload()).HandleString(message.GetContent()); + } + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + void DicomResourcesLoader::Handle(const ParseDicomSuccessMessage& message) + { + if (message.GetOrigin().HasPayload()) + { + Handler& handler = dynamic_cast(message.GetOrigin().GetPayload()); + + std::set ignoreTagLength; + ignoreTagLength.insert(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR); // Needed for RT-DOSE + + Orthanc::DicomMap summary; + message.GetDicom().ExtractDicomSummary(summary, ignoreTagLength); + handler.GetTarget()->AddResource(summary); + + handler.BroadcastSuccess(); + } + } +#endif + + + void DicomResourcesLoader::Handle(const OracleCommandExceptionMessage& message) + { + // TODO + LOG(ERROR) << "Exception: " << message.GetException().What(); + } + + + void DicomResourcesLoader::ScheduleLoadOrthancInstanceTags(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& instanceId, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetUri("/instances/" + instanceId + "/tags"); + command->AcquirePayload(new OrthancInstanceTagsHandler(shared_from_this(), target, priority, + source, remainingCommands, userPayload)); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + + + void DicomResourcesLoader::ScheduleLoadOrthancOneChildInstance(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType level, + const std::string& id, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload) + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetUri("/" + GetUri(level) + "/" + id + "/instances"); + command->AcquirePayload(new OrthancOneChildInstanceHandler(shared_from_this(), target, priority, + source, remainingCommands, userPayload)); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + + + + const Orthanc::IDynamicObject& DicomResourcesLoader::SuccessMessage::GetUserPayload() const + { + if (userPayload_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *userPayload_; + } + } + + + boost::shared_ptr DicomResourcesLoader::Create(ILoadersContext::ILock& stone) + { + boost::shared_ptr result(new DicomResourcesLoader(stone.GetContext())); + result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); + result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); + result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); + result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); + +#if ORTHANC_ENABLE_DCMTK == 1 + result->Register(stone.GetOracleObservable(), &DicomResourcesLoader::Handle); +#endif + + return result; + } + + + static void SetIncludeTags(std::map& arguments, + const std::set& includeTags) + { + if (!includeTags.empty()) + { + std::string s; + bool first = true; + + for (std::set::const_iterator + it = includeTags.begin(); it != includeTags.end(); ++it) + { + if (first) + { + first = false; + } + else + { + s += ","; + } + + char buf[16]; + sprintf(buf, "%04X%04X", it->GetGroup(), it->GetElement()); + s += std::string(buf); + } + + arguments["includefield"] = s; + } + } + + + void DicomResourcesLoader::ScheduleGetDicomWeb(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& uri, + const std::set& includeTags, + Orthanc::IDynamicObject* userPayload) + { + boost::shared_ptr protection(userPayload); + + if (!source.IsDicomWeb()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMweb source"); + } + + std::map arguments, headers; + SetIncludeTags(arguments, includeTags); + + std::unique_ptr command( + source.CreateDicomWebCommand(uri, arguments, headers, + new DicomWebHandler(shared_from_this(), target, priority, source, protection))); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + + + void DicomResourcesLoader::ScheduleQido(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType level, + const Orthanc::DicomMap& filter, + const std::set& includeTags, + Orthanc::IDynamicObject* userPayload) + { + boost::shared_ptr protection(userPayload); + + if (!source.IsDicomWeb()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMweb source"); + } + + std::string uri; + switch (level) + { + case Orthanc::ResourceType_Study: + uri = "/studies"; + break; + + case Orthanc::ResourceType_Series: + uri = "/series"; + break; + + case Orthanc::ResourceType_Instance: + uri = "/instances"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::set tags; + filter.GetTags(tags); + + std::map arguments, headers; + + for (std::set::const_iterator it = tags.begin(); it != tags.end(); ++it) + { + std::string s; + if (filter.LookupStringValue(s, *it, false /* no binary */)) + { + char buf[16]; + sprintf(buf, "%04X%04X", it->GetGroup(), it->GetElement()); + arguments[buf] = s; + } + } + + SetIncludeTags(arguments, includeTags); + + std::unique_ptr command( + source.CreateDicomWebCommand(uri, arguments, headers, + new DicomWebHandler(shared_from_this(), target, priority, source, protection))); + + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + + + void DicomResourcesLoader::ScheduleLoadOrthancResources(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType topLevel, + const std::string& topId, + Orthanc::ResourceType bottomLevel, + Orthanc::IDynamicObject* userPayload) + { + boost::shared_ptr protection(userPayload); + + if (!source.IsOrthanc()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not an Orthanc source"); + } + + bool ok = false; + + switch (topLevel) + { + case Orthanc::ResourceType_Patient: + ok = (bottomLevel == Orthanc::ResourceType_Patient || + bottomLevel == Orthanc::ResourceType_Study || + bottomLevel == Orthanc::ResourceType_Series || + bottomLevel == Orthanc::ResourceType_Instance); + break; + + case Orthanc::ResourceType_Study: + ok = (bottomLevel == Orthanc::ResourceType_Study || + bottomLevel == Orthanc::ResourceType_Series || + bottomLevel == Orthanc::ResourceType_Instance); + break; + + case Orthanc::ResourceType_Series: + ok = (bottomLevel == Orthanc::ResourceType_Series || + bottomLevel == Orthanc::ResourceType_Instance); + break; + + case Orthanc::ResourceType_Instance: + ok = (bottomLevel == Orthanc::ResourceType_Instance); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (!ok) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + boost::shared_ptr remainingCommands(new unsigned int(0)); + + if (topLevel == Orthanc::ResourceType_Instance) + { + ScheduleLoadOrthancInstanceTags(target, priority, source, topId, remainingCommands, protection); + } + else if (topLevel == bottomLevel) + { + ScheduleLoadOrthancOneChildInstance(target, priority, source, topLevel, topId, remainingCommands, protection); + } + else + { + std::unique_ptr command(new OrthancRestApiCommand); + command->SetUri("/" + GetUri(topLevel) + "/" + topId + "/" + GetUri(bottomLevel)); + command->AcquirePayload(new OrthancAllChildrenInstancesHandler + (shared_from_this(), target, priority, source, + remainingCommands, bottomLevel, protection)); + + { + std::unique_ptr lock(context_.Lock()); + + // GetSharedObserver() means "this" (for use as an IObserver), as a + // shared_ptr + // The oracle will thus call "this" + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + } + + + void DicomResourcesLoader::ScheduleLoadDicomDir(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& path, + Orthanc::IDynamicObject* userPayload) + { + boost::shared_ptr protection(userPayload); + + if (!source.IsDicomDir()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, "Not a DICOMDIR source"); + } + + if (target->GetIndexedTag() == Orthanc::DICOM_TAG_SOP_INSTANCE_UID) + { + LOG(WARNING) << "If loading DICOMDIR, it is advised to index tag " + << "ReferencedSopInstanceUidInFile (0004,1511)"; + } + +#if ORTHANC_ENABLE_DCMTK == 1 + std::unique_ptr command(new ReadFileCommand(path)); + command->AcquirePayload(new DicomDirHandler(shared_from_this(), target, priority, source, protection)); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "DCMTK is disabled, cannot load DICOMDIR"); +#endif + } + + + void DicomResourcesLoader::ScheduleLoadDicomFile(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& path, + bool includePixelData, + Orthanc::IDynamicObject* userPayload) + { + boost::shared_ptr protection(userPayload); + +#if ORTHANC_ENABLE_DCMTK == 1 + std::unique_ptr command(new ParseDicomFromFileCommand(source, path)); + command->SetPixelDataIncluded(includePixelData); + command->AcquirePayload(new Handler(shared_from_this(), target, priority, source, protection)); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "DCMTK is disabled, cannot load DICOM files"); +#endif + } + + + bool DicomResourcesLoader::ScheduleLoadDicomFile(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& dicomDirPath, + const Orthanc::DicomMap& dicomDirEntry, + bool includePixelData, + Orthanc::IDynamicObject* userPayload) + { + std::unique_ptr protection(userPayload); + +#if ORTHANC_ENABLE_DCMTK == 1 + std::string file; + if (dicomDirEntry.LookupStringValue(file, Orthanc::DICOM_TAG_REFERENCED_FILE_ID, false)) + { + ScheduleLoadDicomFile(target, priority, source, ParseDicomFromFileCommand::GetDicomDirPath(dicomDirPath, file), + includePixelData, protection.release()); + return true; + } + else + { + return false; + } +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "DCMTK is disabled, cannot load DICOM files"); +#endif + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomResourcesLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomResourcesLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,234 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#include "../Oracle/HttpCommand.h" +#include "../Oracle/OracleCommandExceptionMessage.h" +#include "../Oracle/OrthancRestApiCommand.h" +#include "../Oracle/ReadFileCommand.h" +#include "DicomSource.h" +#include "ILoaderFactory.h" +#include "LoadedDicomResources.h" +#include "OracleScheduler.h" + +namespace Orthanc +{ +#if ORTHANC_ENABLE_DCMTK == 1 + class ParsedDicomDir; +#endif +} + +namespace OrthancStone +{ +#if ORTHANC_ENABLE_DCMTK == 1 + class ParseDicomFromFileCommand; +#endif + + class DicomResourcesLoader : + public ObserverBase, + public IObservable + { + private: + class Handler; + class StringHandler; + class DicomWebHandler; + class OrthancHandler; + class OrthancInstanceTagsHandler; + class OrthancOneChildInstanceHandler; + class OrthancAllChildrenInstancesHandler; + +#if ORTHANC_ENABLE_DCMTK == 1 + class DicomDirHandler; +#endif + + void Handle(const HttpCommand::SuccessMessage& message); + + void Handle(const OrthancRestApiCommand::SuccessMessage& message); + + void Handle(const ReadFileCommand::SuccessMessage& message); + + void Handle(const OracleCommandExceptionMessage& message); + +#if ORTHANC_ENABLE_DCMTK == 1 + void Handle(const ParseDicomSuccessMessage& message); +#endif + + void ScheduleLoadOrthancInstanceTags(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& instanceId, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload); + + void ScheduleLoadOrthancOneChildInstance(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType level, + const std::string& id, + boost::shared_ptr remainingCommands, + boost::shared_ptr userPayload); + + DicomResourcesLoader(ILoadersContext& context) : + context_(context) + { + } + + ILoadersContext& context_; + + + public: + class SuccessMessage : public OrthancStone::OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + boost::shared_ptr resources_; + int priority_; + const DicomSource& source_; + const Orthanc::IDynamicObject* userPayload_; + + public: + SuccessMessage(const DicomResourcesLoader& origin, + boost::shared_ptr resources, + int priority, + const DicomSource& source, + const Orthanc::IDynamicObject* userPayload) : + OriginMessage(origin), + resources_(resources), + priority_(priority), + source_(source), + userPayload_(userPayload) + { + } + + int GetPriority() const + { + return priority_; + } + + const boost::shared_ptr GetResources() const + { + return resources_; + } + + const DicomSource& GetDicomSource() const + { + return source_; + } + + bool HasUserPayload() const + { + return userPayload_ != NULL; + } + + const Orthanc::IDynamicObject& GetUserPayload() const; + }; + + + class Factory : public ILoaderFactory + { + public: + virtual boost::shared_ptr Create(ILoadersContext::ILock& stone) + { + return DicomResourcesLoader::Create(stone); + } + }; + + + static boost::shared_ptr Create(ILoadersContext::ILock& stone); + + void ScheduleGetDicomWeb(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& uri, + const std::set& includeTags, + Orthanc::IDynamicObject* userPayload); + + void ScheduleGetDicomWeb(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& uri, + Orthanc::IDynamicObject* userPayload) + { + std::set includeTags; + ScheduleGetDicomWeb(target, priority, source, uri, includeTags, userPayload); + } + + void ScheduleQido(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType level, + const Orthanc::DicomMap& filter, + const std::set& includeTags, + Orthanc::IDynamicObject* userPayload); + + void ScheduleLoadOrthancResources(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType topLevel, + const std::string& topId, + Orthanc::ResourceType bottomLevel, + Orthanc::IDynamicObject* userPayload); + + void ScheduleLoadOrthancResource(boost::shared_ptr target, + int priority, + const DicomSource& source, + Orthanc::ResourceType level, + const std::string& id, + Orthanc::IDynamicObject* userPayload) + { + ScheduleLoadOrthancResources(target, priority, source, level, id, level, userPayload); + } + +#if ORTHANC_ENABLE_DCMTK == 1 + static void GetDicomDirInstances(LoadedDicomResources& target, + const Orthanc::ParsedDicomDir& dicomDir); +#endif + + void ScheduleLoadDicomDir(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& path, + Orthanc::IDynamicObject* userPayload); + + void ScheduleLoadDicomFile(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& path, + bool includePixelData, + Orthanc::IDynamicObject* userPayload); + + bool ScheduleLoadDicomFile(boost::shared_ptr target, + int priority, + const DicomSource& source, + const std::string& dicomDirPath, + const Orthanc::DicomMap& dicomDirEntry, + bool includePixelData, + Orthanc::IDynamicObject* userPayload); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomSource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomSource.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,356 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomSource.h" + +#include "../Oracle/HttpCommand.h" +#include "../Oracle/OrthancRestApiCommand.h" + +#include + +#include + +namespace OrthancStone +{ + static std::string EncodeGetArguments(const std::string& uri, + const std::map& arguments) + { + std::string s = uri; + bool first = true; + + for (std::map::const_iterator + it = arguments.begin(); it != arguments.end(); ++it) + { + if (first) + { + s += "?"; + first = false; + } + else + { + s += "&"; + } + + s += it->first + "=" + it->second; + } + + // TODO: Call Orthanc::Toolbox::UriEncode() ? + + return s; + } + + + void DicomSource::SetOrthancSource(const Orthanc::WebServiceParameters& parameters) + { + type_ = DicomSourceType_Orthanc; + webService_ = parameters; + hasOrthancWebViewer1_ = false; + hasOrthancAdvancedPreview_ = false; + } + + + void DicomSource::SetOrthancSource() + { + Orthanc::WebServiceParameters parameters; + parameters.SetUrl("http://localhost:8042/"); + SetOrthancSource(parameters); + } + + + const Orthanc::WebServiceParameters& DicomSource::GetOrthancParameters() const + { + if (type_ == DicomSourceType_Orthanc || + type_ == DicomSourceType_DicomWebThroughOrthanc) + { + return webService_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void DicomSource::SetDicomDirSource() + { + type_ = DicomSourceType_DicomDir; + } + + + void DicomSource::SetDicomWebSource(const std::string& baseUrl) + { + type_ = DicomSourceType_DicomWeb; + webService_.SetUrl(baseUrl); + webService_.ClearCredentials(); + } + + + void DicomSource::SetDicomWebSource(const std::string& baseUrl, + const std::string& username, + const std::string& password) + { + type_ = DicomSourceType_DicomWeb; + webService_.SetUrl(baseUrl); + webService_.SetCredentials(username, password); + } + + + void DicomSource::SetDicomWebThroughOrthancSource(const Orthanc::WebServiceParameters& orthancParameters, + const std::string& dicomWebRoot, + const std::string& serverName) + { + type_ = DicomSourceType_DicomWebThroughOrthanc; + webService_ = orthancParameters; + orthancDicomWebRoot_ = dicomWebRoot; + serverName_ = serverName; + } + + + void DicomSource::SetDicomWebThroughOrthancSource(const std::string& serverName) + { + Orthanc::WebServiceParameters orthanc; + orthanc.SetUrl("http://localhost:8042/"); + SetDicomWebThroughOrthancSource(orthanc, "/dicom-web/", serverName); + } + + + bool DicomSource::IsDicomWeb() const + { + return (type_ == DicomSourceType_DicomWeb || + type_ == DicomSourceType_DicomWebThroughOrthanc); + } + + + IOracleCommand* DicomSource::CreateDicomWebCommand(const std::string& uri, + const std::map& arguments, + const std::map& headers, + Orthanc::IDynamicObject* payload) const + { + std::unique_ptr protection(payload); + + switch (type_) + { + case DicomSourceType_DicomWeb: + { + std::unique_ptr command(new HttpCommand); + + command->SetMethod(Orthanc::HttpMethod_Get); + command->SetUrl(webService_.GetUrl() + EncodeGetArguments(uri, arguments)); + command->SetHttpHeaders(webService_.GetHttpHeaders()); + + for (std::map::const_iterator + it = headers.begin(); it != headers.end(); ++it) + { + command->SetHttpHeader(it->first, it->second); + } + + if (!webService_.GetUsername().empty()) + { + command->SetCredentials(webService_.GetUsername(), webService_.GetPassword()); + } + + if (protection.get()) + { + command->AcquirePayload(protection.release()); + } + + return command.release(); + } + + case DicomSourceType_DicomWebThroughOrthanc: + { + Json::Value args = Json::objectValue; + for (std::map::const_iterator + it = arguments.begin(); it != arguments.end(); ++it) + { + args[it->first] = it->second; + } + + Json::Value h = Json::objectValue; + for (std::map::const_iterator + it = headers.begin(); it != headers.end(); ++it) + { + h[it->first] = it->second; + } + + Json::Value body = Json::objectValue; + body["Uri"] = uri; + body["Arguments"] = args; + body["HttpHeaders"] = h; + + std::unique_ptr command(new OrthancRestApiCommand); + command->SetMethod(Orthanc::HttpMethod_Post); + command->SetUri(orthancDicomWebRoot_ + "/servers/" + serverName_ + "/get"); + command->SetBody(body); + + if (protection.get()) + { + command->AcquirePayload(protection.release()); + } + + return command.release(); + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void DicomSource::AutodetectOrthancFeatures(const std::string& system, + const std::string& plugins) + { + static const char* const REST_API_VERSION = "ApiVersion"; + + if (IsDicomWeb()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + Json::Value a, b; + Json::Reader reader; + if (reader.parse(system, a) && + reader.parse(plugins, b) && + a.type() == Json::objectValue && + b.type() == Json::arrayValue && + a.isMember(REST_API_VERSION) && + a[REST_API_VERSION].type() == Json::intValue) + { + SetOrthancAdvancedPreview(a[REST_API_VERSION].asInt() >= 5); + + hasOrthancWebViewer1_ = false; + + for (Json::Value::ArrayIndex i = 0; i < b.size(); i++) + { + if (b[i].type() != Json::stringValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (boost::iequals(b[i].asString(), "web-viewer")) + { + hasOrthancWebViewer1_ = true; + } + } + } + else + { + printf("[%s] [%s]\n", system.c_str(), plugins.c_str()); + + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void DicomSource::SetOrthancWebViewer1(bool hasPlugin) + { + if (IsOrthanc()) + { + hasOrthancWebViewer1_ = hasPlugin; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + bool DicomSource::HasOrthancWebViewer1() const + { + if (IsOrthanc()) + { + return hasOrthancWebViewer1_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + void DicomSource::SetOrthancAdvancedPreview(bool hasFeature) + { + if (IsOrthanc()) + { + hasOrthancAdvancedPreview_ = hasFeature; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + bool DicomSource::HasOrthancAdvancedPreview() const + { + if (IsOrthanc()) + { + return hasOrthancAdvancedPreview_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + void DicomSource::SetDicomWebRendered(bool hasFeature) + { + if (IsDicomWeb()) + { + hasDicomWebRendered_ = hasFeature; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + bool DicomSource::HasDicomWebRendered() const + { + if (IsDicomWeb()) + { + return hasDicomWebRendered_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + unsigned int DicomSource::GetQualityCount() const + { + if (IsDicomWeb()) + { + return (HasDicomWebRendered() ? 2 : 1); + } + else if (IsOrthanc()) + { + return (HasOrthancWebViewer1() || + HasOrthancAdvancedPreview() ? 2 : 1); + } + else if (IsDicomDir()) + { + return 1; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomSource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomSource.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,125 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Oracle/IOracleCommand.h" + +#include + +namespace OrthancStone +{ + enum DicomSourceType + { + DicomSourceType_Orthanc, + DicomSourceType_DicomWeb, + DicomSourceType_DicomWebThroughOrthanc, + DicomSourceType_DicomDir + }; + + + class DicomSource + { + private: + DicomSourceType type_; + Orthanc::WebServiceParameters webService_; + std::string orthancDicomWebRoot_; + std::string serverName_; + bool hasOrthancWebViewer1_; + bool hasOrthancAdvancedPreview_; + bool hasDicomWebRendered_; + + public: + DicomSource() : + hasOrthancWebViewer1_(false), + hasOrthancAdvancedPreview_(false), + hasDicomWebRendered_(false) + { + SetOrthancSource(); + } + + DicomSourceType GetType() const + { + return type_; + } + + void SetOrthancSource(); + + void SetOrthancSource(const Orthanc::WebServiceParameters& parameters); + + const Orthanc::WebServiceParameters& GetOrthancParameters() const; + + void SetDicomDirSource(); + + void SetDicomWebSource(const std::string& baseUrl); + + void SetDicomWebSource(const std::string& baseUrl, + const std::string& username, + const std::string& password); + + void SetDicomWebThroughOrthancSource(const Orthanc::WebServiceParameters& orthancParameters, + const std::string& dicomWebRoot, + const std::string& serverName); + + void SetDicomWebThroughOrthancSource(const std::string& serverName); + + bool IsDicomWeb() const; + + bool IsOrthanc() const + { + return type_ == DicomSourceType_Orthanc; + } + + bool IsDicomDir() const + { + return type_ == DicomSourceType_DicomDir; + } + + IOracleCommand* CreateDicomWebCommand(const std::string& uri, + const std::map& arguments, + const std::map& headers, + Orthanc::IDynamicObject* payload /* takes ownership */) const; + + IOracleCommand* CreateDicomWebCommand(const std::string& uri, + Orthanc::IDynamicObject* payload /* takes ownership */) const + { + std::map none; + return CreateDicomWebCommand(uri, none, none, payload); + } + + void AutodetectOrthancFeatures(const std::string& system, + const std::string& plugins); + + void SetOrthancWebViewer1(bool hasPlugin); + + bool HasOrthancWebViewer1() const; + + void SetOrthancAdvancedPreview(bool hasFeature); + + bool HasOrthancAdvancedPreview() const; + + void SetDicomWebRendered(bool hasFeature); + + bool HasDicomWebRendered() const; + + unsigned int GetQualityCount() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomStructureSetLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomStructureSetLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,495 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomStructureSetLoader.h" + +#include "../Scene2D/PolylineSceneLayer.h" +#include "../StoneException.h" +#include "../Toolbox/GeometryToolbox.h" + +#include + +#include + +namespace OrthancStone +{ + +#if 0 + void DumpDicomMap(std::ostream& o, const Orthanc::DicomMap& dicomMap) + { + using namespace std; + //ios_base::fmtflags state = o.flags(); + //o.flags(ios::right | ios::hex); + //o << "(" << setfill('0') << setw(4) << tag.GetGroup() + // << "," << setw(4) << tag.GetElement() << ")"; + //o.flags(state); + Json::Value val; + dicomMap.Serialize(val); + o << val; + //return o; + } +#endif + + // implementation of IInstanceLookupHandler that uses Orthanc REST API calls to retrive the + // geometry of referenced instances + class DicomStructureSetLoader::RestInstanceLookupHandler : public DicomStructureSetLoader::IInstanceLookupHandler, + public LoaderStateMachine + { + public: + static boost::shared_ptr Create(DicomStructureSetLoader& loader) + { + boost::shared_ptr obj(new RestInstanceLookupHandler(loader)); + obj->LoaderStateMachine::PostConstructor(); + return obj; + } + + protected: + RestInstanceLookupHandler(DicomStructureSetLoader& loader) + : LoaderStateMachine(loader.loadersContext_) + , loader_(loader) + { + } + + virtual void RetrieveReferencedSlices(const std::set& nonEmptyInstances) ORTHANC_OVERRIDE; + + private: + // these subclasses hold the loading state + class AddReferencedInstance; // 2nd state + class LookupInstance; // 1st state + + DicomStructureSetLoader& loader_; + }; + + class DicomStructureSetLoader::RestInstanceLookupHandler::AddReferencedInstance : public LoaderStateMachine::State + { + private: + std::string instanceId_; + + public: + AddReferencedInstance(DicomStructureSetLoader& that, + const std::string& instanceId) : + State(that), + instanceId_(instanceId) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + Json::Value tags; + message.ParseJsonBody(tags); + + Orthanc::DicomMap dicom; + dicom.FromDicomAsJson(tags); + + DicomStructureSetLoader& loader = GetLoader(); + + loader.AddReferencedSlice(dicom); + } + }; + + + // State that converts a "SOP Instance UID" to an Orthanc identifier + class DicomStructureSetLoader::RestInstanceLookupHandler::LookupInstance : public LoaderStateMachine::State + { + private: + std::string sopInstanceUid_; + + public: + LookupInstance(DicomStructureSetLoader& that, + const std::string& sopInstanceUid) : + State(that), + sopInstanceUid_(sopInstanceUid) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + DicomStructureSetLoader& loader = GetLoader(); + + Json::Value lookup; + message.ParseJsonBody(lookup); + + if (lookup.type() != Json::arrayValue || + lookup.size() != 1 || + !lookup[0].isMember("Type") || + !lookup[0].isMember("Path") || + lookup[0]["Type"].type() != Json::stringValue || + lookup[0]["ID"].type() != Json::stringValue || + lookup[0]["Type"].asString() != "Instance") + { + std::stringstream msg; + msg << "Unknown resource! message.GetAnswer() = " << message.GetAnswer() << " message.GetAnswerHeaders() = "; + for (OrthancStone::OrthancRestApiCommand::HttpHeaders::const_iterator it = message.GetAnswerHeaders().begin(); + it != message.GetAnswerHeaders().end(); ++it) + { + msg << "\nkey: \"" << it->first << "\" value: \"" << it->second << "\"\n"; + } + const std::string msgStr = msg.str(); + LOG(ERROR) << msgStr; + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + + const std::string instanceId = lookup[0]["ID"].asString(); + + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + std::string uri = "/instances/" + instanceId + "/tags"; + command->SetUri(uri); + command->AcquirePayload(new AddReferencedInstance(loader, instanceId)); + Schedule(command.release()); + } + } + }; + + void DicomStructureSetLoader::RestInstanceLookupHandler::RetrieveReferencedSlices( + const std::set& nonEmptyInstances) + { + for (std::set::const_iterator it = nonEmptyInstances.begin(); + it != nonEmptyInstances.end(); + ++it) + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetUri("/tools/lookup"); + command->SetMethod(Orthanc::HttpMethod_Post); + command->SetBody(*it); + command->AcquirePayload(new LookupInstance(loader_, *it)); + Schedule(command.release()); + } + } + + class DicomStructureSetLoader::LoadStructure : public LoaderStateMachine::State + { + public: + LoadStructure(DicomStructureSetLoader& that) : + State(that) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + DicomStructureSetLoader& loader = GetLoader(); + + // Set the actual structure set content + { + FullOrthancDataset dicom(message.GetAnswer()); + + loader.content_.reset(new OrthancStone::DicomStructureSet(dicom)); + } + + // initialize visibility flags + SetDefaultStructureVisibility(); + + // retrieve the (non-empty) referenced instances (the CT slices containing the corresponding structures) + // Some (admittedly invalid) Dicom files have empty values in the + // 0008,1155 tag. We try our best to cope with this. + // this is why we use `nonEmptyInstances` and not `instances` + std::set instances; + std::set nonEmptyInstances; + + // this traverses the polygon collection for all structures and retrieve the SOPInstanceUID of + // the referenced instances + loader.content_->GetReferencedInstances(instances); + + for (std::set::const_iterator + it = instances.begin(); it != instances.end(); ++it) + { + std::string instance = Orthanc::Toolbox::StripSpaces(*it); + if(instance != "") + nonEmptyInstances.insert(instance); + } + + loader.RetrieveReferencedSlices(nonEmptyInstances); + } + + void SetDefaultStructureVisibility() + { + DicomStructureSetLoader& loader = GetLoader(); + + size_t structureCount = loader.content_->GetStructuresCount(); + + loader.structureVisibility_.resize(structureCount); + bool everythingVisible = false; + if ((loader.initiallyVisibleStructures_.size() == 1) + && (loader.initiallyVisibleStructures_[0].size() == 1) + && (loader.initiallyVisibleStructures_[0][0] == '*')) + { + everythingVisible = true; + } + + for (size_t i = 0; i < structureCount; ++i) + { + // if a single "*" string is supplied, this means we want everything + // to be visible... + if (everythingVisible) + { + loader.structureVisibility_.at(i) = true; + } + else + { + // otherwise, we only enable visibility for those structures whose + // names are mentioned in the initiallyVisibleStructures_ array + const std::string& structureName = loader.content_->GetStructureName(i); + + std::vector::iterator foundIt = + std::find( + loader.initiallyVisibleStructures_.begin(), + loader.initiallyVisibleStructures_.end(), + structureName); + std::vector::iterator endIt = loader.initiallyVisibleStructures_.end(); + if (foundIt != endIt) + loader.structureVisibility_.at(i) = true; + else + loader.structureVisibility_.at(i) = false; + } + } + } + + private: + + + }; + + + class DicomStructureSetLoader::Slice : public IExtractedSlice + { + private: + const OrthancStone::DicomStructureSet& content_; + uint64_t revision_; + bool isValid_; + std::vector visibility_; + + public: + /** + The visibility vector must either: + - be empty + or + - contain the same number of items as the number of structures in the + structure set. + In the first case (empty vector), all the structures are displayed. + In the second case, the visibility of each structure is defined by the + content of the vector at the corresponding index. + */ + Slice(const OrthancStone::DicomStructureSet& content, + uint64_t revision, + const OrthancStone::CoordinateSystem3D& cuttingPlane, + std::vector visibility = std::vector()) + : content_(content) + , revision_(revision) + , visibility_(visibility) + { + ORTHANC_ASSERT((visibility_.size() == content_.GetStructuresCount()) + || (visibility_.size() == 0u)); + + bool opposite; + + const OrthancStone::Vector normal = content.GetNormal(); + isValid_ = ( + OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || + OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || + OrthancStone::GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); + } + + virtual bool IsValid() + { + return isValid_; + } + + virtual uint64_t GetRevision() + { + return revision_; + } + + virtual OrthancStone::ISceneLayer* CreateSceneLayer( + const OrthancStone::ILayerStyleConfigurator* configurator, + const OrthancStone::CoordinateSystem3D& cuttingPlane) + { + assert(isValid_); + + std::unique_ptr layer(new OrthancStone::PolylineSceneLayer); + layer->SetThickness(2); + + for (size_t i = 0; i < content_.GetStructuresCount(); i++) + { + if ((visibility_.size() == 0) || visibility_.at(i)) + { + const OrthancStone::Color& color = content_.GetStructureColor(i); + +#ifdef USE_BOOST_UNION_FOR_POLYGONS + std::vector< std::vector > polygons; + + if (content_.ProjectStructure(polygons, i, cuttingPlane)) + { + for (size_t j = 0; j < polygons.size(); j++) + { + PolylineSceneLayer::Chain chain; + chain.resize(polygons[j].size()); + + for (size_t k = 0; k < polygons[j].size(); k++) + { + chain[k] = ScenePoint2D(polygons[j][k].x, polygons[j][k].y); + } + + layer->AddChain(chain, true /* closed */, color); + } + } +#else + std::vector< std::pair > segments; + + if (content_.ProjectStructure(segments, i, cuttingPlane)) + { + for (size_t j = 0; j < segments.size(); j++) + { + OrthancStone::PolylineSceneLayer::Chain chain; + chain.resize(2); + + chain[0] = OrthancStone::ScenePoint2D(segments[j].first.x, segments[j].first.y); + chain[1] = OrthancStone::ScenePoint2D(segments[j].second.x, segments[j].second.y); + + layer->AddChain(chain, false /* NOT closed */, color); + } + } +#endif + } + } + + return layer.release(); + } + }; + + + DicomStructureSetLoader::DicomStructureSetLoader( + OrthancStone::ILoadersContext& loadersContext) + : LoaderStateMachine(loadersContext) + , loadersContext_(loadersContext) + , revision_(0) + , countProcessedInstances_(0) + , countReferencedInstances_(0) + , structuresReady_(false) + { + // the default handler to retrieve slice geometry is RestInstanceLookupHandler + instanceLookupHandler_ = RestInstanceLookupHandler::Create(*this); + } + + boost::shared_ptr DicomStructureSetLoader::Create(OrthancStone::ILoadersContext& loadersContext) + { + boost::shared_ptr obj( + new DicomStructureSetLoader( + loadersContext)); + obj->LoaderStateMachine::PostConstructor(); + return obj; + } + + void DicomStructureSetLoader::AddReferencedSlice(const Orthanc::DicomMap& dicom) + { + content_->AddReferencedSlice(dicom); + countProcessedInstances_ ++; + assert(countProcessedInstances_ <= countReferencedInstances_); + + revision_++; + SetStructuresUpdated(); + + if (countProcessedInstances_ == countReferencedInstances_) + { + // All the referenced instances have been loaded, finalize the RT-STRUCT + content_->CheckReferencedSlices(); + revision_++; + SetStructuresReady(); + } + } + + void DicomStructureSetLoader::RetrieveReferencedSlices(const std::set& nonEmptyInstances) + { + // we set the number of referenced instances. This allows to know, in the method above, when we're done + countReferencedInstances_ = static_cast(nonEmptyInstances.size()); + instanceLookupHandler_->RetrieveReferencedSlices(nonEmptyInstances); + } + + void DicomStructureSetLoader::SetStructureDisplayState(size_t structureIndex, bool display) + { + structureVisibility_.at(structureIndex) = display; + revision_++; + } + + DicomStructureSetLoader::~DicomStructureSetLoader() + { + LOG(TRACE) << "DicomStructureSetLoader::~DicomStructureSetLoader()"; + } + + void DicomStructureSetLoader::LoadInstance( + const std::string& instanceId, + const std::vector& initiallyVisibleStructures) + { + Start(); + + instanceId_ = instanceId; + initiallyVisibleStructures_ = initiallyVisibleStructures; + + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + + std::string uri = "/instances/" + instanceId + "/tags?ignore-length=3006-0050"; + + command->SetUri(uri); + command->AcquirePayload(new LoadStructure(*this)); + Schedule(command.release()); + } + } + + void DicomStructureSetLoader::LoadInstanceFullVisibility(const std::string& instanceId) + { + std::vector initiallyVisibleStructures; + initiallyVisibleStructures.push_back("*"); // wildcard to make all structure sets visible + LoadInstance(instanceId, initiallyVisibleStructures); + } + + OrthancStone::IVolumeSlicer::IExtractedSlice* DicomStructureSetLoader::ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) + { + if (content_.get() == NULL) + { + // Geometry is not available yet + return new OrthancStone::IVolumeSlicer::InvalidSlice; + } + else + { + return new Slice(*content_, revision_, cuttingPlane, structureVisibility_); + } + } + + void DicomStructureSetLoader::SetStructuresUpdated() + { + BroadcastMessage(DicomStructureSetLoader::StructuresUpdated(*this)); + } + + void DicomStructureSetLoader::SetStructuresReady() + { + ORTHANC_ASSERT(!structuresReady_); + structuresReady_ = true; + BroadcastMessage(DicomStructureSetLoader::StructuresReady(*this)); + } + + bool DicomStructureSetLoader::AreStructuresReady() const + { + return structuresReady_; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomStructureSetLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomStructureSetLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,146 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/DicomStructureSet.h" +#include "../Volumes/IVolumeSlicer.h" +#include "../Loaders/ILoadersContext.h" +#include "LoaderStateMachine.h" + +#include + +namespace OrthancStone +{ + class DicomStructureSetLoader : + public LoaderStateMachine, + public OrthancStone::IVolumeSlicer, + public OrthancStone::IObservable + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresReady, DicomStructureSetLoader); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, StructuresUpdated, DicomStructureSetLoader); + + /** + + Once the structure set has been loaded (the LoadStructure state), we need to fill it with geometry information + from the referenced slices (tag (0008,1155) described here: + https://dicom.innolitics.com/ciods/rt-structure-set/general-reference/00081140/00081155 + + This interface allows to customize how this information can be gathered. By default, the RestInstanceLookupHandler + will perform a REST call to the Orthanc API to retrieve this information. + + Injecting another implementation of this interface is useful when where this information can be supplied in + another (faster) way (for instance, if a separate loader for the CT series can be used to supply the slice geometry) + */ + class IInstanceLookupHandler + { + public: + virtual void RetrieveReferencedSlices(const std::set& instances) = 0; + }; + + // predeclaration of the default IInstanceLookupHandler implementation + class RestInstanceLookupHandler; + + static boost::shared_ptr Create( + OrthancStone::ILoadersContext& loadersContext); + + void SetInstanceLookupHandler(boost::shared_ptr instanceLookupHandler) + { + instanceLookupHandler_ = instanceLookupHandler; + } + + OrthancStone::DicomStructureSet* GetContent() + { + return content_.get(); + } + + void SetStructureDisplayState(size_t structureIndex, bool display); + + bool GetStructureDisplayState(size_t structureIndex) const + { + return structureVisibility_.at(structureIndex); + } + + ~DicomStructureSetLoader(); + + void LoadInstance(const std::string& instanceId, + const std::vector& initiallyVisibleStructures = std::vector()); + + void LoadInstanceFullVisibility(const std::string& instanceId); + + + virtual IExtractedSlice* ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; + + void SetStructuresReady(); + void SetStructuresUpdated(); + + bool AreStructuresReady() const; + + /** + Called by the IInstanceLookupHandler when slice referenced instance information is available. + When the last referenced slice is received, this method will perform a final check and will warn observers + */ + void AddReferencedSlice(const Orthanc::DicomMap& dicom); + + private: + class Slice; + + // Only state of LoaderStateMachine + class LoadStructure; // 1st state + + OrthancStone::ILoadersContext& loadersContext_; + std::unique_ptr content_; + uint64_t revision_; + std::string instanceId_; + unsigned int countProcessedInstances_; + unsigned int countReferencedInstances_; + + // will be set to true once the loading is finished + bool structuresReady_; + + /** + At load time, these strings are used to initialize the structureVisibility_ + vector. + + As a special case, if initiallyVisibleStructures_ contains a single string + that is '*', ALL structures will be made visible. + */ + std::vector initiallyVisibleStructures_; + + /** + Contains the "Should this structure be displayed?" flag for all structures. + Only filled when structures are loaded. + + Changing this value directly affects the rendering + */ + std::vector structureVisibility_; + + + boost::shared_ptr instanceLookupHandler_; + + private: + void RetrieveReferencedSlices(const std::set& nonEmptyInstances); + + protected: + DicomStructureSetLoader(OrthancStone::ILoadersContext& loadersContext); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomVolumeLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomVolumeLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,188 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomVolumeLoader.h" + +#include + +namespace OrthancStone +{ + DicomVolumeLoader::DicomVolumeLoader(boost::shared_ptr& framesLoader, + bool computeRange) : + framesLoader_(framesLoader), + isValid_(false), + started_(false), + remaining_(0) + { + volume_.reset(new OrthancStone::DicomVolumeImage); + + const SeriesOrderedFrames& frames = framesLoader_->GetOrderedFrames(); + + if (frames.IsRegular3DVolume() && + frames.GetFramesCount() > 0) + { + // TODO - Is "0" the good choice for the reference frame? + // Shouldn't we use "count - 1" depending on the direction + // of the normal? + const OrthancStone::DicomInstanceParameters& parameters = frames.GetInstanceParameters(0); + + OrthancStone::CoordinateSystem3D plane(frames.GetInstance(0)); + + OrthancStone::VolumeImageGeometry geometry; + geometry.SetSizeInVoxels(parameters.GetImageInformation().GetWidth(), + parameters.GetImageInformation().GetHeight(), + static_cast(frames.GetFramesCount())); + geometry.SetAxialGeometry(plane); + + double spacing; + if (parameters.GetSopClassUid() == SopClassUid_RTDose) + { + if (!parameters.ComputeRegularSpacing(spacing)) + { + LOG(WARNING) << "Unable to compute the spacing in a RT-DOSE instance"; + spacing = frames.GetSpacingBetweenSlices(); + } + } + else + { + spacing = frames.GetSpacingBetweenSlices(); + } + + geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), + parameters.GetPixelSpacingY(), spacing); + volume_->Initialize(geometry, parameters.GetExpectedPixelFormat(), computeRange); + volume_->GetPixelData().Clear(); + volume_->SetDicomParameters(parameters); + + remaining_ = frames.GetFramesCount(); + isValid_ = true; + } + else + { + LOG(WARNING) << "Not a regular 3D volume"; + } + } + + + void DicomVolumeLoader::Handle(const OrthancStone::SeriesFramesLoader::FrameLoadedMessage& message) + { + if (remaining_ == 0 || + !message.HasUserPayload()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (message.GetImage().GetWidth() != volume_->GetPixelData().GetWidth() || + message.GetImage().GetHeight() != volume_->GetPixelData().GetHeight()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); + } + + if (message.GetImage().GetFormat() != volume_->GetPixelData().GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (message.GetFrameIndex() >= volume_->GetPixelData().GetDepth()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + size_t frameIndex = dynamic_cast&> + (message.GetUserPayload()).GetValue(); + + { + ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), + VolumeProjection_Axial, + static_cast(frameIndex)); + + Orthanc::ImageProcessing::Copy(writer.GetAccessor(), message.GetImage()); + } + + volume_->IncrementRevision(); + + { + VolumeUpdatedMessage updated(*this, + static_cast(frameIndex)); + + BroadcastMessage(updated); + } + + remaining_--; + + if (remaining_ == 0) + { + VolumeReadyMessage ready(*this); + BroadcastMessage(ready); + } + } + + + DicomVolumeLoader::Factory::Factory(LoadedDicomResources& instances) : + framesFactory_(instances), + computeRange_(false) + { + } + + DicomVolumeLoader::Factory::Factory(const SeriesMetadataLoader::SuccessMessage& metadata) : + framesFactory_(metadata.GetInstances()), + computeRange_(false) + { + SetDicomDir(metadata.GetDicomDirPath(), metadata.GetDicomDir()); // Only useful for DICOMDIR sources + } + + + boost::shared_ptr DicomVolumeLoader::Factory::Create(ILoadersContext::ILock& context) + { + boost::shared_ptr frames = + boost::dynamic_pointer_cast(framesFactory_.Create(context)); + + boost::shared_ptr volume(new DicomVolumeLoader(frames, computeRange_)); + volume->Register(*frames, &DicomVolumeLoader::Handle); + + return volume; + } + + void DicomVolumeLoader::Start(int priority, + const DicomSource& source) + { + if (started_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + started_ = true; + + if (IsValid()) + { + for (size_t i = 0; i < GetOrderedFrames().GetFramesCount(); i++) + { + framesLoader_->ScheduleLoadFrame(priority, source, i, source.GetQualityCount() - 1, + new Orthanc::SingleValueObject(i)); + } + } + else + { + VolumeReadyMessage ready(*this); + BroadcastMessage(ready); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/DicomVolumeLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/DicomVolumeLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,141 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Volumes/DicomVolumeImage.h" +#include "SeriesFramesLoader.h" +#include "SeriesMetadataLoader.h" + +namespace OrthancStone +{ + class DicomVolumeLoader : + public ObserverBase, + public IObservable + { + private: + boost::shared_ptr framesLoader_; + boost::shared_ptr volume_; + bool isValid_; + bool started_; + size_t remaining_; + + DicomVolumeLoader(boost::shared_ptr& framesLoader, + bool computeRange); + + void Handle(const OrthancStone::SeriesFramesLoader::FrameLoadedMessage& message); + + public: + class VolumeReadyMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + public: + VolumeReadyMessage(const DicomVolumeLoader& loader) : + OriginMessage(loader) + { + } + + const DicomVolumeImage& GetVolume() const + { + assert(GetOrigin().GetVolume()); + return *GetOrigin().GetVolume(); + } + }; + + + class VolumeUpdatedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + unsigned int axial_; + + public: + VolumeUpdatedMessage(const DicomVolumeLoader& loader, + unsigned int axial) : + OriginMessage(loader), + axial_(axial) + { + } + + unsigned int GetAxialIndex() const + { + return axial_; + } + + const DicomVolumeImage& GetVolume() const + { + assert(GetOrigin().GetVolume()); + return *GetOrigin().GetVolume(); + } + }; + + + class Factory : public ILoaderFactory + { + private: + SeriesFramesLoader::Factory framesFactory_; + bool computeRange_; + + public: + Factory(LoadedDicomResources& instances); + + Factory(const SeriesMetadataLoader::SuccessMessage& metadata); + + void SetComputeRange(bool computeRange) + { + computeRange_ = computeRange; + } + + void SetDicomDir(const std::string& dicomDirPath, + boost::shared_ptr dicomDir) + { + framesFactory_.SetDicomDir(dicomDirPath, dicomDir); + } + + virtual boost::shared_ptr Create(ILoadersContext::ILock& context) ORTHANC_OVERRIDE; + }; + + bool IsValid() const + { + return isValid_; + } + + bool IsFullyLoaded() const + { + return remaining_ == 0; + } + + boost::shared_ptr GetVolume() const + { + return volume_; + } + + const SeriesOrderedFrames& GetOrderedFrames() const + { + return framesLoader_->GetOrderedFrames(); + } + + void Start(int priority, + const DicomSource& source); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/GenericLoadersContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/GenericLoadersContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,183 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GenericLoadersContext.h" + +namespace OrthancStone +{ + class GenericLoadersContext::Locker : public ILoadersContext::ILock + { + private: + GenericLoadersContext& that_; + boost::recursive_mutex::scoped_lock lock_; + + public: + Locker(GenericLoadersContext& that) : + that_(that), + lock_(that.mutex_) + { + if (!that_.scheduler_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + virtual ILoadersContext& GetContext() const ORTHANC_OVERRIDE + { + return that_; + }; + + virtual void AddLoader(boost::shared_ptr loader) ORTHANC_OVERRIDE + { + that_.loaders_.push_back(loader); + } + + virtual IObservable& GetOracleObservable() const ORTHANC_OVERRIDE + { + return that_.oracleObservable_; + } + + virtual void Schedule(boost::shared_ptr receiver, + int priority, + IOracleCommand* command /* Takes ownership */) ORTHANC_OVERRIDE + { + that_.scheduler_->Schedule(receiver, priority, command); + }; + + virtual void CancelRequests(boost::shared_ptr receiver) ORTHANC_OVERRIDE + { + that_.scheduler_->CancelRequests(receiver); + } + + virtual void CancelAllRequests() ORTHANC_OVERRIDE + { + that_.scheduler_->CancelAllRequests(); + } + + virtual void GetStatistics(uint64_t& scheduledCommands, + uint64_t& processedCommands) ORTHANC_OVERRIDE + { + scheduledCommands = that_.scheduler_->GetTotalScheduled(); + processedCommands = that_.scheduler_->GetTotalProcessed(); + } + }; + + + void GenericLoadersContext::EmitMessage(boost::weak_ptr observer, + const IMessage& message) + { + boost::recursive_mutex::scoped_lock lock(mutex_); + //LOG(INFO) << " inside emit lock: " << message.GetIdentifier().AsString(); + oracleObservable_.EmitMessage(observer, message); + //LOG(INFO) << " outside emit lock"; + } + + + GenericLoadersContext::GenericLoadersContext(unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority) + { + oracle_.reset(new ThreadedOracle(*this)); + scheduler_ = OracleScheduler::Create(*oracle_, oracleObservable_, *this, + maxHighPriority, maxStandardPriority, maxLowPriority); + + if (!scheduler_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + GenericLoadersContext::~GenericLoadersContext() + { + LOG(INFO) << "scheduled commands: " << scheduler_->GetTotalScheduled() + << ", processed commands: " << scheduler_->GetTotalProcessed(); + scheduler_.reset(); + //LOG(INFO) << "counter: " << scheduler_.use_count(); + } + + + void GenericLoadersContext::SetOrthancParameters(const Orthanc::WebServiceParameters& parameters) + { + boost::recursive_mutex::scoped_lock lock(mutex_); + oracle_->SetOrthancParameters(parameters); + } + + + void GenericLoadersContext::SetRootDirectory(const std::string& root) + { + boost::recursive_mutex::scoped_lock lock(mutex_); + oracle_->SetRootDirectory(root); + } + + + void GenericLoadersContext::SetDicomCacheSize(size_t size) + { + boost::recursive_mutex::scoped_lock lock(mutex_); + oracle_->SetDicomCacheSize(size); + } + + + void GenericLoadersContext::StartOracle() + { + boost::recursive_mutex::scoped_lock lock(mutex_); + oracle_->Start(); + //LOG(INFO) << "STARTED ORACLE"; + } + + + void GenericLoadersContext::StopOracle() + { + /** + * DON'T lock "mutex_" here, otherwise Stone won't be able to + * stop if one command being executed by the oracle has to emit + * a message (method "EmitMessage()" would have to lock the + * mutex too). + **/ + + //LOG(INFO) << "STOPPING ORACLE"; + oracle_->Stop(); + //LOG(INFO) << "STOPPED ORACLE"; + } + + + void GenericLoadersContext::WaitUntilComplete() + { + for (;;) + { + { + boost::recursive_mutex::scoped_lock lock(mutex_); + if (scheduler_ && + scheduler_->GetTotalScheduled() == scheduler_->GetTotalProcessed()) + { + return; + } + } + + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); + } + } + + ILoadersContext::ILock* GenericLoadersContext::Lock() + { + return new Locker(*this); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/GenericLoadersContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/GenericLoadersContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../Messages/IMessageEmitter.h" +#include "../Oracle/ThreadedOracle.h" +#include "ILoadersContext.h" +#include "DicomSource.h" +#include "OracleScheduler.h" + +#include + +namespace OrthancStone +{ + class GenericLoadersContext : + public ILoadersContext, + private IMessageEmitter + { + private: + class Locker; + + // "Recursive mutex" is necessary, to be able to run + // "ILoaderFactory" from a message handler triggered by + // "EmitMessage()" + boost::recursive_mutex mutex_; + + IObservable oracleObservable_; + std::unique_ptr oracle_; + boost::shared_ptr scheduler_; + + // Necessary to keep the loaders persistent (including global + // function promises), after the function that created them is + // left. This avoids creating one global variable for each loader. + std::list< boost::shared_ptr > loaders_; + + virtual void EmitMessage(boost::weak_ptr observer, + const IMessage& message) ORTHANC_OVERRIDE; + + public: + GenericLoadersContext(unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority); + + virtual ~GenericLoadersContext(); + + virtual ILock* Lock() ORTHANC_OVERRIDE; + + void SetOrthancParameters(const Orthanc::WebServiceParameters& parameters); + + void SetRootDirectory(const std::string& root); + + void SetDicomCacheSize(size_t size); + + void StartOracle(); + + void StopOracle(); + + void WaitUntilComplete(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/IFetchingItemsSorter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/IFetchingItemsSorter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace OrthancStone +{ + class IFetchingItemsSorter : public boost::noncopyable + { + public: + class IFactory : public boost::noncopyable + { + public: + virtual ~IFactory() + { + } + + virtual IFetchingItemsSorter* CreateSorter(unsigned int itemsCount) const = 0; + }; + + virtual ~IFetchingItemsSorter() + { + } + + virtual unsigned int GetItemsCount() const = 0; + + // Sort a set of items given the current item + virtual void Sort(std::vector& target, + unsigned int current) = 0; + }; +}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/IFetchingStrategy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/IFetchingStrategy.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + class IFetchingStrategy : public boost::noncopyable + { + public: + virtual ~IFetchingStrategy() + { + } + + virtual unsigned int GetItemsCount() const = 0; + + virtual unsigned int GetMaxQuality() const = 0; + + virtual bool GetNext(unsigned int& item, + unsigned int& quality) = 0; + + virtual void SetCurrent(unsigned int item) = 0; + + // Ask the strategy to re-schedule the item with the lowest + // priority in the fetching order. This allows to know which item + // should be dropped from a cache. + virtual void RecycleFurthest(unsigned int& item) = 0; + }; +}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/ILoaderFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/ILoaderFactory.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,41 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILoadersContext.h" + +namespace OrthancStone +{ + class ILoaderFactory : public boost::noncopyable + { + public: + virtual ~ILoaderFactory() + { + } + + /** + * Factory function that creates a new loader, to be used by the + * Stone loaders context. + **/ + virtual boost::shared_ptr Create(ILoadersContext::ILock& context) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/ILoadersContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/ILoadersContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,126 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IObserver.h" +#include "../Messages/IObservable.h" +#include "../Oracle/IOracleCommand.h" + +#include + +namespace OrthancStone +{ + class ILoadersContext : public boost::noncopyable + { + public: + class ILock : public boost::noncopyable + { + public: + virtual ~ILock() + { + } + + /** + * This method is useful for loaders that must be able to + * re-lock the Stone loaders context in the future (for instance + * to schedule new commands once some command is processed). + **/ + virtual ILoadersContext& GetContext() const = 0; + + /** + * Get a reference to the observable against which a loader must + * listen to be informed of messages issued by the oracle once + * some command is processed. + **/ + virtual IObservable& GetOracleObservable() const = 0; + + /** + * Schedule a new command for further processing by the + * oracle. The "receiver" argument indicates to which object the + * notification messages are sent by the oracle upon completion + * of the command. The command is possibly not directly sent to + * the oracle: Instead, an internal "OracleScheduler" object is + * often used as a priority queue to rule the order in which + * commands are actually sent to the oracle. Hence the + * "priority" argument (commands with lower value are executed + * first). + **/ + virtual void Schedule(boost::shared_ptr receiver, + int priority, + IOracleCommand* command /* Takes ownership */) = 0; + + /** + * Cancel all the commands that are waiting in the + * "OracleScheduler" queue and that are linked to the given + * receiver (i.e. the observer that was specified at the time + * method "Schedule()" was called). This is useful for real-time + * processing, as it allows to replace commands that were + * scheduled in the past by more urgent commands. + * + * Note that this call does not affect commands that would have + * already be sent to the oracle. As a consequence, the receiver + * might still receive messages that were sent to the oracle + * before the cancellation (be prepared to handle such + * messages). + **/ + virtual void CancelRequests(boost::shared_ptr receiver) = 0; + + /** + * Same as "CancelRequests()", but targets all the receivers. + **/ + virtual void CancelAllRequests() = 0; + + /** + * Add a reference to the given observer in the Stone loaders + * context. This can be used to match the lifetime of a loader + * with the lifetime of the Stone context: This is useful if + * your Stone application does not keep a reference to the + * loader by itself (typically in global promises), which would + * make the loader disappear as soon as the scope of the + * variable is left. + **/ + virtual void AddLoader(boost::shared_ptr loader) = 0; + + /** + * Returns the number of commands that were scheduled and + * processed using the "Schedule()" method. By "processed" + * commands, we refer to the number of commands that were either + * executed by the oracle, or canceled by the user. So the + * counting sequences are monotonically increasing over time. + **/ + virtual void GetStatistics(uint64_t& scheduledCommands, + uint64_t& processedCommands) = 0; + }; + + virtual ~ILoadersContext() + { + } + + /** + * Locks the Stone loaders context, to give access to its + * underlying features. This is important for Stone applications + * running in a multi-threaded environment, for which a global + * mutex is locked. + **/ + virtual ILock* Lock() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoadedDicomResources.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoadedDicomResources.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,233 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LoadedDicomResources.h" + +#include + +#include + + +namespace OrthancStone +{ + void LoadedDicomResources::Flatten() + { + // Lazy generation of a "std::vector" from the "std::map" + if (flattened_.empty()) + { + flattened_.resize(resources_.size()); + + size_t pos = 0; + for (Resources::const_iterator it = resources_.begin(); it != resources_.end(); ++it) + { + assert(it->second != NULL); + flattened_[pos++] = it->second; + } + } + else + { + // No need to flatten + assert(flattened_.size() == resources_.size()); + } + } + + + void LoadedDicomResources::AddFromDicomWebInternal(const Json::Value& dicomweb) + { + assert(dicomweb.type() == Json::objectValue); + Orthanc::DicomMap dicom; + dicom.FromDicomWeb(dicomweb); + AddResource(dicom); + } + + + LoadedDicomResources::LoadedDicomResources(const LoadedDicomResources& other, + const Orthanc::DicomTag& indexedTag) : + indexedTag_(indexedTag) + { + for (Resources::const_iterator it = other.resources_.begin(); + it != other.resources_.end(); ++it) + { + assert(it->second != NULL); + AddResource(*it->second); + } + } + + void LoadedDicomResources::Clear() + { + for (Resources::iterator it = resources_.begin(); it != resources_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + + resources_.clear(); + flattened_.clear(); + } + + + Orthanc::DicomMap& LoadedDicomResources::GetResource(size_t index) + { + Flatten(); + + if (index >= flattened_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(flattened_[index] != NULL); + return *flattened_[index]; + } + } + + + void LoadedDicomResources::MergeResource(Orthanc::DicomMap& target, + const std::string& id) const + { + Resources::const_iterator it = resources_.find(id); + + if (it == resources_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem); + } + else + { + assert(it->second != NULL); + target.Merge(*it->second); + } + } + + + bool LoadedDicomResources::LookupStringValue(std::string& target, + const std::string& id, + const Orthanc::DicomTag& tag) const + { + Resources::const_iterator found = resources_.find(id); + + if (found == resources_.end()) + { + return false; + } + else + { + assert(found->second != NULL); + return found->second->LookupStringValue(target, tag, false); + } + } + + + void LoadedDicomResources::AddResource(const Orthanc::DicomMap& dicom) + { + std::string id; + + if (dicom.LookupStringValue(id, indexedTag_, false /* no binary value */) && + resources_.find(id) == resources_.end() /* Don't index twice the same resource */) + { + resources_[id] = dicom.Clone(); + flattened_.clear(); // Invalidate the flattened version + } + } + + + void LoadedDicomResources::AddFromOrthanc(const Json::Value& tags) + { + Orthanc::DicomMap dicom; + dicom.FromDicomAsJson(tags); + AddResource(dicom); + } + + + void LoadedDicomResources::AddFromDicomWeb(const Json::Value& dicomweb) + { + if (dicomweb.type() == Json::objectValue) + { + AddFromDicomWebInternal(dicomweb); + } + else if (dicomweb.type() == Json::arrayValue) + { + for (Json::Value::ArrayIndex i = 0; i < dicomweb.size(); i++) + { + if (dicomweb[i].type() == Json::objectValue) + { + AddFromDicomWebInternal(dicomweb[i]); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + } + + + bool LoadedDicomResources::LookupTagValueConsensus(std::string& target, + const Orthanc::DicomTag& tag) const + { + typedef std::map Counter; + + Counter counter; + + for (Resources::const_iterator it = resources_.begin(); it != resources_.end(); ++it) + { + assert(it->second != NULL); + + std::string value; + if (it->second->LookupStringValue(value, tag, false)) + { + Counter::iterator found = counter.find(value); + if (found == counter.end()) + { + counter[value] = 1; + } + else + { + found->second ++; + } + } + } + + Counter::const_iterator best = counter.end(); + + for (Counter::const_iterator it = counter.begin(); it != counter.end(); ++it) + { + if (best == counter.end() || + best->second < it->second) + { + best = it; + } + } + + if (best == counter.end()) + { + return false; + } + else + { + target = best->first; + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoadedDicomResources.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoadedDicomResources.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + + +namespace OrthancStone +{ + /** + Stores an indexed collection of DicomMap objects. The index is a + user-specified DicomTag. + */ + class LoadedDicomResources : public boost::noncopyable + { + private: + typedef std::map Resources; + + Orthanc::DicomTag indexedTag_; + Resources resources_; + std::vector flattened_; + + void Flatten(); + + void AddFromDicomWebInternal(const Json::Value& dicomweb); + + public: + LoadedDicomResources(const Orthanc::DicomTag& indexedTag) : + indexedTag_(indexedTag) + { + } + + // Re-index another set of resources using another tag + LoadedDicomResources(const LoadedDicomResources& other, + const Orthanc::DicomTag& indexedTag); + + ~LoadedDicomResources() + { + Clear(); + } + + const Orthanc::DicomTag& GetIndexedTag() const + { + return indexedTag_; + } + + void Clear(); + + size_t GetSize() const + { + return resources_.size(); + } + + Orthanc::DicomMap& GetResource(size_t index); + + bool HasResource(const std::string& id) const + { + return resources_.find(id) != resources_.end(); + } + + void MergeResource(Orthanc::DicomMap& target, + const std::string& id) const; + + bool LookupStringValue(std::string& target, + const std::string& id, + const Orthanc::DicomTag& tag) const; + + void AddResource(const Orthanc::DicomMap& dicom); + + void AddFromOrthanc(const Json::Value& tags); + + void AddFromDicomWeb(const Json::Value& dicomweb); + + bool LookupTagValueConsensus(std::string& target, + const Orthanc::DicomTag& tag) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoaderCache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoaderCache.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,270 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "LoaderCache.h" + +#include "../StoneException.h" +#include "OrthancSeriesVolumeProgressiveLoader.h" +#include "OrthancMultiframeVolumeLoader.h" +#include "DicomStructureSetLoader.h" + +#include "../Loaders/ILoadersContext.h" + +#if ORTHANC_ENABLE_WASM == 1 +# include +# include "../Oracle/WebAssemblyOracle.h" +#else +# include "../Oracle/ThreadedOracle.h" +#endif + +#include "../Volumes/DicomVolumeImage.h" +#include "../Volumes/DicomVolumeImageMPRSlicer.h" + +#include +#include + +namespace OrthancStone +{ + LoaderCache::LoaderCache(OrthancStone::ILoadersContext& loadersContext, bool useCtProgressiveQuality) + : loadersContext_(loadersContext) + , useCtProgressiveQuality_(useCtProgressiveQuality) + + { + + } + + boost::shared_ptr + LoaderCache::GetSeriesVolumeProgressiveLoader(std::string seriesUuid) + { + try + { + // normalize keys a little + NormalizeUuid(seriesUuid); + + // find in cache + if (seriesVolumeProgressiveLoaders_.find(seriesUuid) == seriesVolumeProgressiveLoaders_.end()) + { + std::unique_ptr lock(loadersContext_.Lock()); + + boost::shared_ptr volumeImage(new OrthancStone::DicomVolumeImage); + boost::shared_ptr loader; + + // true means "use progressive quality" + // false means "load high quality slices only" + loader = OrthancSeriesVolumeProgressiveLoader::Create(loadersContext_, volumeImage, useCtProgressiveQuality_); + loader->LoadSeries(seriesUuid); + seriesVolumeProgressiveLoaders_[seriesUuid] = loader; + } + else + { +// LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : returning cached loader for seriesUUid = " << seriesUuid; + } + return seriesVolumeProgressiveLoaders_[seriesUuid]; + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); + } + throw; + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); + throw; + } + catch (...) + { + LOG(ERROR) << "Unknown exception in LoaderCache"; + throw; + } + } + + boost::shared_ptr LoaderCache::GetMultiframeVolumeLoader(std::string instanceUuid) + { + // normalize keys a little + NormalizeUuid(instanceUuid); + + // if the loader is not available, let's trigger its creation + if(multiframeVolumeLoaders_.find(instanceUuid) == multiframeVolumeLoaders_.end()) + { + GetMultiframeDicomVolumeImageMPRSlicer(instanceUuid); + } + ORTHANC_ASSERT(multiframeVolumeLoaders_.find(instanceUuid) != multiframeVolumeLoaders_.end()); + + return multiframeVolumeLoaders_[instanceUuid]; + } + + boost::shared_ptr LoaderCache::GetMultiframeDicomVolumeImageMPRSlicer(std::string instanceUuid) + { + try + { + // normalize keys a little + NormalizeUuid(instanceUuid); + + // find in cache + if (dicomVolumeImageMPRSlicers_.find(instanceUuid) == dicomVolumeImageMPRSlicers_.end()) + { + std::unique_ptr lock(loadersContext_.Lock()); + boost::shared_ptr volumeImage(new OrthancStone::DicomVolumeImage); + boost::shared_ptr loader; + { + loader = OrthancMultiframeVolumeLoader::Create(loadersContext_, volumeImage); + loader->LoadInstance(instanceUuid); + } + multiframeVolumeLoaders_[instanceUuid] = loader; + boost::shared_ptr mprSlicer(new OrthancStone::DicomVolumeImageMPRSlicer(volumeImage)); + dicomVolumeImageMPRSlicers_[instanceUuid] = mprSlicer; + } + return dicomVolumeImageMPRSlicers_[instanceUuid]; + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); + } + throw; + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); + throw; + } + catch (...) + { + LOG(ERROR) << "Unknown exception in LoaderCache"; + throw; + } + } + + std::string LoaderCache::BuildDicomStructureSetLoaderKey( + const std::string& instanceUuid, + const std::string& uniqueKey) + { + return instanceUuid + "_" + uniqueKey; + } + + boost::shared_ptr LoaderCache::GetDicomStructureSetLoader( + std::string inInstanceUuid, + const std::vector& initiallyVisibleStructures, + const std::string& uniqueKey) + { + try + { + // normalize keys a little + NormalizeUuid(inInstanceUuid); + + std::string entryKey = BuildDicomStructureSetLoaderKey(inInstanceUuid, uniqueKey); + + // find in cache + if (dicomStructureSetLoaders_.find(entryKey) == dicomStructureSetLoaders_.end()) + { + std::unique_ptr lock(loadersContext_.Lock()); + + boost::shared_ptr loader; + { + loader = DicomStructureSetLoader::Create(loadersContext_); + loader->LoadInstance(inInstanceUuid, initiallyVisibleStructures); + } + dicomStructureSetLoaders_[entryKey] = loader; + } + return dicomStructureSetLoaders_[entryKey]; + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in LoaderCache: " << e.What(); + } + throw; + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in LoaderCache: " << e.what(); + throw; + } + catch (...) + { + LOG(ERROR) << "Unknown exception in LoaderCache"; + throw; + } + } + + void LoaderCache::ClearCache() + { + std::unique_ptr lock(loadersContext_.Lock()); + +#ifndef NDEBUG + // ISO way of checking for debug builds + DebugDisplayObjRefCounts(); +#endif + seriesVolumeProgressiveLoaders_.clear(); + multiframeVolumeLoaders_.clear(); + dicomVolumeImageMPRSlicers_.clear(); + dicomStructureSetLoaders_.clear(); + + } + + template void DebugDisplayObjRefCountsInMap( + const std::string& name, const std::map >& myMap) + { + LOG(TRACE) << "Map \"" << name << "\" ref counts:"; + size_t i = 0; + for (typename std::map >::const_iterator + it = myMap.begin(); it != myMap.end(); ++it) + { + LOG(TRACE) << " element #" << i << ": ref count = " << it->second.use_count(); + i++; + } + } + + void LoaderCache::DebugDisplayObjRefCounts() + { + DebugDisplayObjRefCountsInMap("seriesVolumeProgressiveLoaders_", seriesVolumeProgressiveLoaders_); + DebugDisplayObjRefCountsInMap("multiframeVolumeLoaders_", multiframeVolumeLoaders_); + DebugDisplayObjRefCountsInMap("dicomVolumeImageMPRSlicers_", dicomVolumeImageMPRSlicers_); + DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders_", dicomStructureSetLoaders_); + } + + /** + This method could have been called StripSpacesAndChangeToLower but we might want to + add some UUID validation to the argument + */ + void LoaderCache::NormalizeUuid(std::string& uuid) + { + std::string temp = Orthanc::Toolbox::StripSpaces(uuid); + Orthanc::Toolbox::ToLowerCase(temp); + uuid.swap(temp); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoaderCache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoaderCache.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,106 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../Volumes/DicomVolumeImageMPRSlicer.h" +#include "OrthancSeriesVolumeProgressiveLoader.h" +#include "OrthancMultiframeVolumeLoader.h" +#include "DicomStructureSetLoader.h" + +#include + +#include +#include +#include + +namespace OrthancStone +{ + class ILoadersContext; +} + +namespace OrthancStone +{ + class LoaderCache + { + public: + + virtual ~LoaderCache() {} + + /** + By default, the CT loader in loader cache will only download the highest quality slices. + If you pass true for useCtProgressiveQuality, jpeg (50/100 quality), then jpeg (90/100 quality) + then eventually uncompressed 16-bit images will be loaded. + */ + LoaderCache(OrthancStone::ILoadersContext& loadersContext, bool useCtProgressiveQuality = false); + + boost::shared_ptr + GetSeriesVolumeProgressiveLoader (std::string seriesUuid); + + boost::shared_ptr + GetMultiframeDicomVolumeImageMPRSlicer(std::string instanceUuid); + + boost::shared_ptr + GetMultiframeVolumeLoader(std::string instanceUuid); + + /** + The DicomStructureSetLoader instances are stored in a map and indexed + by a key built from instanceUuid and uniqueKey. + + If instanceUuid and uniqueKey correspond to an already existing loader, it is returned. + + Please note that initiallyVisibleStructures is only used if the call results in the creation + of a new loader. In that case, the value is passed to the constructor. + */ + boost::shared_ptr + GetDicomStructureSetLoader( + std::string instanceUuid, + const std::vector& initiallyVisibleStructures, + const std::string& uniqueKey = ""); + + std::string BuildDicomStructureSetLoaderKey( + const std::string& instanceUuid, + const std::string& uniqueKey = ""); + + void ClearCache(); + + /** + Service method static and exposed for unit tests. + */ + static void NormalizeUuid(std::string& uuid); + + protected: + + void DebugDisplayObjRefCounts(); + + OrthancStone::ILoadersContext& loadersContext_; + bool useCtProgressiveQuality_; + + std::map > + seriesVolumeProgressiveLoaders_; + std::map > + multiframeVolumeLoaders_; + std::map > + dicomVolumeImageMPRSlicers_; + std::map > + dicomStructureSetLoaders_; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoaderStateMachine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoaderStateMachine.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,219 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LoaderStateMachine.h" + +#include "../Loaders/ILoadersContext.h" + +#include + +namespace OrthancStone +{ + void LoaderStateMachine::State::Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + + void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + + void LoaderStateMachine::State::Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + + void LoaderStateMachine::Schedule(OrthancStone::OracleCommandBase* command) + { + LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Schedule()"; + + std::unique_ptr protection(command); + + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (!command->HasPayload()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, + "The payload must contain the next state"); + } + pendingCommands_.push_back(protection.release()); + + Step(); + } + + + void LoaderStateMachine::Start() + { + LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Start()"; + + if (active_) + { + LOG(TRACE) << "LoaderStateMachine::Start() called while active_ is true"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + active_ = true; + + for (size_t i = 0; i < simultaneousDownloads_; i++) + { + Step(); + } + } + + + void LoaderStateMachine::Step() + { + if (!pendingCommands_.empty() && + activeCommands_ < simultaneousDownloads_) + { + + OrthancStone::IOracleCommand* nextCommand = pendingCommands_.front(); + + LOG(TRACE) << " LoaderStateMachine(" << std::hex << this << std::dec << + ")::Step(): activeCommands_ (" << activeCommands_ << + ") < simultaneousDownloads_ (" << simultaneousDownloads_ << + ") --> will Schedule command addr " << std::hex << nextCommand << std::dec; + + { + std::unique_ptr lock(loadersContext_.Lock()); + boost::shared_ptr observer(GetSharedObserver()); + lock->Schedule(observer, 0, nextCommand); // TODO: priority! + } + pendingCommands_.pop_front(); + + activeCommands_++; + } + else + { + LOG(TRACE) << " LoaderStateMachine(" << std::hex << this << std::dec << + ")::Step(): activeCommands_ (" << activeCommands_ << + ") >= simultaneousDownloads_ (" << simultaneousDownloads_ << + ") --> will NOT Schedule command"; + } + } + + + void LoaderStateMachine::Clear() + { + LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::Clear()"; + for (PendingCommands::iterator it = pendingCommands_.begin(); + it != pendingCommands_.end(); ++it) + { + delete *it; + } + + pendingCommands_.clear(); + } + + + void LoaderStateMachine::HandleExceptionMessage(const OrthancStone::OracleCommandExceptionMessage& message) + { + LOG(ERROR) << "LoaderStateMachine::HandleExceptionMessage: error in the state machine, stopping all processing"; + LOG(ERROR) << "Error: " << message.GetException().What() << " Details: " << + message.GetException().GetDetails(); + Clear(); + } + + template + void LoaderStateMachine::HandleSuccessMessage(const T& message) + { + if (activeCommands_ <= 0) { + LOG(ERROR) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::HandleSuccessMessage : activeCommands_ should be > 0 but is: " << activeCommands_; + } + else { + activeCommands_--; + try + { + dynamic_cast(message.GetOrigin().GetPayload()).Handle(message); + Step(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Error in the state machine, stopping all processing: " << + e.What() << " Details: " << e.GetDetails(); + Clear(); + } + } + } + + + LoaderStateMachine::LoaderStateMachine( + OrthancStone::ILoadersContext& loadersContext) + : loadersContext_(loadersContext) + , active_(false) + , simultaneousDownloads_(4) + , activeCommands_(0) + { + using OrthancStone::ILoadersContext; + + LOG(TRACE) + << "LoaderStateMachine(" << std::hex << this + << std::dec << ")::LoaderStateMachine()"; + } + + void LoaderStateMachine::PostConstructor() + { + std::unique_ptr + lock(loadersContext_.Lock()); + + OrthancStone::IObservable& observable = lock->GetOracleObservable(); + + // TODO => Move this out of constructor + Register( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register( + observable, &LoaderStateMachine::HandleSuccessMessage); + Register( + observable, &LoaderStateMachine::HandleExceptionMessage); + } + + LoaderStateMachine::~LoaderStateMachine() + { + LOG(TRACE) << "LoaderStateMachine(" << std::hex << this << std::dec << ")::~LoaderStateMachine()"; + Clear(); + } + + void LoaderStateMachine::SetSimultaneousDownloads(unsigned int count) + { + if (active_) + { + LOG(ERROR) << "LoaderStateMachine::SetSimultaneousDownloads called while active_ is true"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else if (count == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + simultaneousDownloads_ = count; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/LoaderStateMachine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/LoaderStateMachine.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,126 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IObservable.h" +#include "../Messages/ObserverBase.h" +#include "../Oracle/GetOrthancImageCommand.h" +#include "../Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../Oracle/IOracle.h" +#include "../Oracle/OracleCommandExceptionMessage.h" +#include "../Oracle/OrthancRestApiCommand.h" + +#include + +#include + +namespace OrthancStone +{ + class ILoadersContext; + + /** + This class is supplied with Oracle commands and will schedule up to + simultaneousDownloads_ of them at the same time, then will schedule the + rest once slots become available. It is used, a.o., by the + OrtancMultiframeVolumeLoader class. + + To use it, you need to create commands that derive from State. + + You need to initialize them with the object that must be called when + an answer is received. + */ + + class LoaderStateMachine : public OrthancStone::ObserverBase + { + public: + class State : public Orthanc::IDynamicObject + { + private: + LoaderStateMachine& that_; + + public: + State(LoaderStateMachine& that) : + that_(that) + { + } + + State(const State& currentState) : + that_(currentState.that_) + { + } + + void Schedule(OrthancStone::OracleCommandBase* command) const + { + that_.Schedule(command); + } + + template + T& GetLoader() const + { + return dynamic_cast(that_); + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message); + + virtual void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message); + + virtual void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message); + }; + + void Schedule(OrthancStone::OracleCommandBase* command); + + void Start(); + + private: + void Step(); + + void Clear(); + + void HandleExceptionMessage(const OrthancStone::OracleCommandExceptionMessage& message); + + template + void HandleSuccessMessage(const T& message); + + typedef std::list PendingCommands; + + OrthancStone::ILoadersContext& loadersContext_; + bool active_; + unsigned int simultaneousDownloads_; + PendingCommands pendingCommands_; + unsigned int activeCommands_; + + + public: + LoaderStateMachine(OrthancStone::ILoadersContext& loadersContext); + + void PostConstructor(); + + virtual ~LoaderStateMachine(); + + bool IsActive() const + { + return active_; + } + + void SetSimultaneousDownloads(unsigned int count); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OracleScheduler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OracleScheduler.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,557 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OracleScheduler.h" + +#include "../Oracle/ParseDicomFromFileCommand.h" + +namespace OrthancStone +{ + class OracleScheduler::ReceiverPayload : public Orthanc::IDynamicObject + { + private: + Priority priority_; + boost::weak_ptr receiver_; + std::unique_ptr command_; + + public: + ReceiverPayload(Priority priority, + boost::weak_ptr receiver, + IOracleCommand* command) : + priority_(priority), + receiver_(receiver), + command_(command) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + Priority GetActivePriority() const + { + return priority_; + } + + boost::weak_ptr GetOriginalReceiver() const + { + return receiver_; + } + + const IOracleCommand& GetOriginalCommand() const + { + assert(command_.get() != NULL); + return *command_; + } + }; + + + class OracleScheduler::ScheduledCommand : public boost::noncopyable + { + private: + boost::weak_ptr receiver_; + std::unique_ptr command_; + + public: + ScheduledCommand(boost::shared_ptr receiver, + IOracleCommand* command) : + receiver_(receiver), + command_(command) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + boost::weak_ptr GetReceiver() + { + return receiver_; + } + + bool IsSameReceiver(boost::shared_ptr receiver) const + { + boost::shared_ptr lock(receiver_.lock()); + + return (lock && + lock.get() == receiver.get()); + } + + IOracleCommand* WrapCommand(Priority priority) + { + if (command_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + std::unique_ptr wrapped(command_->Clone()); + dynamic_cast(*wrapped).AcquirePayload(new ReceiverPayload(priority, receiver_, command_.release())); + return wrapped.release(); + } + } + }; + + + + void OracleScheduler::ClearQueue(Queue& queue) + { + for (Queue::iterator it = queue.begin(); it != queue.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + + totalProcessed_ ++; + } + + queue.clear(); + } + + + void OracleScheduler::RemoveReceiverFromQueue(Queue& queue, + boost::shared_ptr receiver) + { + if (!receiver) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + Queue tmp; + + for (Queue::iterator it = queue.begin(); it != queue.end(); ++it) + { + assert(it->second != NULL); + + if (!(it->second->IsSameReceiver(receiver))) + { + // This promise is still active + tmp.insert(std::make_pair(it->first, it->second)); + } + else + { + delete it->second; + + totalProcessed_ ++; + } + } + + queue = tmp; + } + + + void OracleScheduler::CheckInvariants() const + { +#ifndef NDEBUG + /*char buf[1024]; + sprintf(buf, "active: %d %d %d ; pending: %lu %lu %lu", + activeHighPriorityCommands_, activeStandardPriorityCommands_, activeLowPriorityCommands_, + highPriorityQueue_.size(), standardPriorityQueue_.size(), lowPriorityQueue_.size()); + LOG(INFO) << buf;*/ + + assert(activeHighPriorityCommands_ <= maxHighPriorityCommands_); + assert(activeStandardPriorityCommands_ <= maxStandardPriorityCommands_); + assert(activeLowPriorityCommands_ <= maxLowPriorityCommands_); + assert(totalProcessed_ <= totalScheduled_); + + for (Queue::const_iterator it = standardPriorityQueue_.begin(); it != standardPriorityQueue_.end(); ++it) + { + assert(it->first > PRIORITY_HIGH && + it->first < PRIORITY_LOW); + } + + for (Queue::const_iterator it = highPriorityQueue_.begin(); it != highPriorityQueue_.end(); ++it) + { + assert(it->first <= PRIORITY_HIGH); + } + + for (Queue::const_iterator it = lowPriorityQueue_.begin(); it != lowPriorityQueue_.end(); ++it) + { + assert(it->first >= PRIORITY_LOW); + } +#endif + } + + + void OracleScheduler::SpawnFromQueue(Queue& queue, + Priority priority) + { + CheckInvariants(); + + Queue::iterator item = queue.begin(); + assert(item != queue.end()); + + std::unique_ptr command(dynamic_cast(item->second)); + queue.erase(item); + + if (command.get() != NULL) + { + /** + * Only schedule the command for execution in the oracle, if its + * receiver has not been destroyed yet. + **/ + boost::shared_ptr observer(command->GetReceiver().lock()); + if (observer) + { + if (oracle_.Schedule(GetSharedObserver(), command->WrapCommand(priority))) + { + /** + * Executing this code if "Schedule()" returned "false" + * above, will result in a memory leak within + * "OracleScheduler", as the scheduler believes that some + * command is still active (i.e. pending to be executed by + * the oracle), hereby stalling the scheduler during its + * destruction, and not freeing the + * "shared_ptr" of the Stone context (check + * out "sjo-playground/WebViewer/Backend/Leak") + **/ + + switch (priority) + { + case Priority_High: + activeHighPriorityCommands_ ++; + break; + + case Priority_Standard: + activeStandardPriorityCommands_ ++; + break; + + case Priority_Low: + activeLowPriorityCommands_ ++; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + else + { + totalProcessed_ ++; + } + } + } + else + { + LOG(ERROR) << "NULL command, should never happen"; + } + + CheckInvariants(); + } + + + void OracleScheduler::SpawnCommands() + { + // Send as many commands as possible to the oracle + while (!highPriorityQueue_.empty()) + { + if (activeHighPriorityCommands_ < maxHighPriorityCommands_) + { + // First fill the high-priority lane + SpawnFromQueue(highPriorityQueue_, Priority_High); + } + else if (activeStandardPriorityCommands_ < maxStandardPriorityCommands_) + { + // There remain too many high-priority commands for the + // high-priority lane, schedule them to the standard-priority lanes + SpawnFromQueue(highPriorityQueue_, Priority_Standard); + } + else if (activeLowPriorityCommands_ < maxLowPriorityCommands_) + { + SpawnFromQueue(highPriorityQueue_, Priority_Low); + } + else + { + return; // No slot available + } + } + + while (!standardPriorityQueue_.empty()) + { + if (activeStandardPriorityCommands_ < maxStandardPriorityCommands_) + { + SpawnFromQueue(standardPriorityQueue_, Priority_Standard); + } + else if (activeLowPriorityCommands_ < maxLowPriorityCommands_) + { + SpawnFromQueue(standardPriorityQueue_, Priority_Low); + } + else + { + return; + } + } + + while (!lowPriorityQueue_.empty()) + { + if (activeLowPriorityCommands_ < maxLowPriorityCommands_) + { + SpawnFromQueue(lowPriorityQueue_, Priority_Low); + } + else + { + return; + } + } + } + + + void OracleScheduler::RemoveActiveCommand(const ReceiverPayload& payload) + { + CheckInvariants(); + + totalProcessed_ ++; + + switch (payload.GetActivePriority()) + { + case Priority_High: + assert(activeHighPriorityCommands_ > 0); + activeHighPriorityCommands_ --; + break; + + case Priority_Standard: + assert(activeStandardPriorityCommands_ > 0); + activeStandardPriorityCommands_ --; + break; + + case Priority_Low: + assert(activeLowPriorityCommands_ > 0); + activeLowPriorityCommands_ --; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + SpawnCommands(); + + CheckInvariants(); + } + + + void OracleScheduler::Handle(const GetOrthancImageCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + GetOrthancImageCommand::SuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetImage(), message.GetMimeType()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + + void OracleScheduler::Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + GetOrthancWebViewerJpegCommand::SuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetImage()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + + void OracleScheduler::Handle(const HttpCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + HttpCommand::SuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetAnswerHeaders(), message.GetAnswer()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + + void OracleScheduler::Handle(const OrthancRestApiCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + OrthancRestApiCommand::SuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetAnswerHeaders(), message.GetAnswer()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + void OracleScheduler::Handle(const ParseDicomSuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + ParseDicomSuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetSource(), message.GetDicom(), message.GetFileSize(), message.HasPixelData()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } +#endif + + + void OracleScheduler::Handle(const ReadFileCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ReceiverPayload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + + RemoveActiveCommand(payload); + + ReadFileCommand::SuccessMessage bis( + dynamic_cast(payload.GetOriginalCommand()), + message.GetContent()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + + void OracleScheduler::Handle(const OracleCommandExceptionMessage& message) + { + const OracleCommandBase& command = dynamic_cast(message.GetOrigin()); + + assert(command.HasPayload()); + const ReceiverPayload& payload = dynamic_cast(command.GetPayload()); + + RemoveActiveCommand(payload); + + OracleCommandExceptionMessage bis(payload.GetOriginalCommand(), message.GetException()); + emitter_.EmitMessage(payload.GetOriginalReceiver(), bis); + } + + + OracleScheduler::OracleScheduler(IOracle& oracle, + IMessageEmitter& emitter, + unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority) : + oracle_(oracle), + emitter_(emitter), + maxHighPriorityCommands_(maxHighPriority), + maxStandardPriorityCommands_(maxStandardPriority), + maxLowPriorityCommands_(maxLowPriority), + activeHighPriorityCommands_(0), + activeStandardPriorityCommands_(0), + activeLowPriorityCommands_(0), + totalScheduled_(0), + totalProcessed_(0) + { + assert(PRIORITY_HIGH < 0 && + PRIORITY_LOW > 0); + + if (maxLowPriority <= 0) + { + // There must be at least 1 lane available to deal with low-priority commands + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + boost::shared_ptr OracleScheduler::Create(IOracle& oracle, + IObservable& oracleObservable, + IMessageEmitter& emitter, + unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority) + { + boost::shared_ptr scheduler + (new OracleScheduler(oracle, emitter, maxHighPriority, maxStandardPriority, maxLowPriority)); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + scheduler->Register(oracleObservable, &OracleScheduler::Handle); + +#if ORTHANC_ENABLE_DCMTK == 1 + scheduler->Register(oracleObservable, &OracleScheduler::Handle); +#endif + + return scheduler; + } + + + OracleScheduler::~OracleScheduler() + { + CancelAllRequests(); + } + + + void OracleScheduler::CancelRequests(boost::shared_ptr receiver) + { + RemoveReceiverFromQueue(standardPriorityQueue_, receiver); + RemoveReceiverFromQueue(highPriorityQueue_, receiver); + RemoveReceiverFromQueue(lowPriorityQueue_, receiver); + } + + + void OracleScheduler::CancelAllRequests() + { + ClearQueue(standardPriorityQueue_); + ClearQueue(highPriorityQueue_); + ClearQueue(lowPriorityQueue_); + } + + + void OracleScheduler::Schedule(boost::shared_ptr receiver, + int priority, + IOracleCommand* command /* Takes ownership */) + { + std::unique_ptr pending(new ScheduledCommand(receiver, dynamic_cast(command))); + + /** + * Safeguard to remember that a new "Handle()" method and a call + * to "scheduler->Register()" must be implemented for each + * possible oracle command. + **/ + assert(command->GetType() == IOracleCommand::Type_GetOrthancImage || + command->GetType() == IOracleCommand::Type_GetOrthancWebViewerJpeg || + command->GetType() == IOracleCommand::Type_Http || + command->GetType() == IOracleCommand::Type_OrthancRestApi || + command->GetType() == IOracleCommand::Type_ParseDicomFromFile || + command->GetType() == IOracleCommand::Type_ParseDicomFromWado || + command->GetType() == IOracleCommand::Type_ReadFile); + + if (priority <= PRIORITY_HIGH) + { + highPriorityQueue_.insert(std::make_pair(priority, pending.release())); + } + else if (priority >= PRIORITY_LOW) + { + lowPriorityQueue_.insert(std::make_pair(priority, pending.release())); + } + else + { + standardPriorityQueue_.insert(std::make_pair(priority, pending.release())); + } + + totalScheduled_ ++; + + SpawnCommands(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OracleScheduler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OracleScheduler.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,169 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#include "../Messages/IMessageEmitter.h" +#include "../Messages/ObserverBase.h" +#include "../Oracle/GetOrthancImageCommand.h" +#include "../Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../Oracle/HttpCommand.h" +#include "../Oracle/IOracle.h" +#include "../Oracle/OracleCommandExceptionMessage.h" +#include "../Oracle/OrthancRestApiCommand.h" +#include "../Oracle/ReadFileCommand.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "../Oracle/ParseDicomSuccessMessage.h" +#endif + +namespace OrthancStone +{ + class OracleScheduler : public ObserverBase + { + public: + static const int PRIORITY_HIGH = -1; + static const int PRIORITY_LOW = 100; + + private: + enum Priority + { + Priority_Low, + Priority_Standard, + Priority_High + }; + + class ReceiverPayload; + class ScheduledCommand; + + typedef std::multimap Queue; + + IOracle& oracle_; + IMessageEmitter& emitter_; + Queue standardPriorityQueue_; + Queue highPriorityQueue_; + Queue lowPriorityQueue_; + unsigned int maxHighPriorityCommands_; // Used if priority <= PRIORITY_HIGH + unsigned int maxStandardPriorityCommands_; + unsigned int maxLowPriorityCommands_; // Used if priority >= PRIORITY_LOW + unsigned int activeHighPriorityCommands_; + unsigned int activeStandardPriorityCommands_; + unsigned int activeLowPriorityCommands_; + uint64_t totalScheduled_; + uint64_t totalProcessed_; + + void ClearQueue(Queue& queue); + + void RemoveReceiverFromQueue(Queue& queue, + boost::shared_ptr receiver); + + void CheckInvariants() const; + + void SpawnFromQueue(Queue& queue, + Priority priority); + + void SpawnCommands(); + + void RemoveActiveCommand(const ReceiverPayload& payload); + + void Handle(const GetOrthancImageCommand::SuccessMessage& message); + + void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message); + + void Handle(const HttpCommand::SuccessMessage& message); + + void Handle(const OrthancRestApiCommand::SuccessMessage& message); + +#if ORTHANC_ENABLE_DCMTK == 1 + void Handle(const ParseDicomSuccessMessage& message); +#endif + + void Handle(const ReadFileCommand::SuccessMessage& message); + + void Handle(const OracleCommandExceptionMessage& message); + + OracleScheduler(IOracle& oracle, + IMessageEmitter& emitter, + unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority); + + public: + static boost::shared_ptr Create(IOracle& oracle, + IObservable& oracleObservable, + IMessageEmitter& emitter) + { + return Create(oracle, oracleObservable, emitter, 1, 4, 1); + } + + static boost::shared_ptr Create(IOracle& oracle, + IObservable& oracleObservable, + IMessageEmitter& emitter, + unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority); + + ~OracleScheduler(); + + unsigned int GetMaxHighPriorityCommands() const + { + return maxHighPriorityCommands_; + } + + unsigned int GetMaxStandardPriorityCommands() const + { + return maxStandardPriorityCommands_; + } + + unsigned int GetMaxLowPriorityCommands() const + { + return maxLowPriorityCommands_; + } + + uint64_t GetTotalScheduled() const + { + return totalScheduled_; + } + + uint64_t GetTotalProcessed() const + { + return totalProcessed_; + } + + // Cancel the HTTP requests that are still pending in the queues, + // and that are associated with the given receiver. Note that the + // receiver might still receive answers to HTTP requests that were + // already submitted to the oracle. + void CancelRequests(boost::shared_ptr receiver); + + void CancelAllRequests(); + + void Schedule(boost::shared_ptr receiver, + int priority, + IOracleCommand* command /* Takes ownership */); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,615 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrthancMultiframeVolumeLoader.h" + +#include +#include + +namespace OrthancStone +{ + class OrthancMultiframeVolumeLoader::LoadRTDoseGeometry : public LoaderStateMachine::State + { + private: + std::unique_ptr dicom_; + + public: + LoadRTDoseGeometry(OrthancMultiframeVolumeLoader& that, + Orthanc::DicomMap* dicom) : + State(that), + dicom_(dicom) + { + if (dicom == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + // Complete the DICOM tags with just-received "Grid Frame Offset Vector" + std::string s = Orthanc::Toolbox::StripSpaces(message.GetAnswer()); + dicom_->SetValue(Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR, s, false); + + GetLoader().SetGeometry(*dicom_); + } + }; + + + static std::string GetSopClassUid(const Orthanc::DicomMap& dicom) + { + std::string s; + if (!dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "DICOM file without SOP class UID"); + } + else + { + return s; + } + } + + + class OrthancMultiframeVolumeLoader::LoadGeometry : public State + { + public: + LoadGeometry(OrthancMultiframeVolumeLoader& that) : + State(that) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + OrthancMultiframeVolumeLoader& loader = GetLoader(); + + Json::Value body; + message.ParseJsonBody(body); + + if (body.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + std::unique_ptr dicom(new Orthanc::DicomMap); + dicom->FromDicomAsJson(body); + + if (OrthancStone::StringToSopClassUid(GetSopClassUid(*dicom)) == OrthancStone::SopClassUid_RTDose) + { + // Download the "Grid Frame Offset Vector" DICOM tag, that is + // mandatory for RT-DOSE, but is too long to be returned by default + + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetUri("/instances/" + loader.GetInstanceId() + "/content/" + + Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR.Format()); + command->AcquirePayload(new LoadRTDoseGeometry(loader, dicom.release())); + + Schedule(command.release()); + } + else + { + loader.SetGeometry(*dicom); + } + } + }; + + class OrthancMultiframeVolumeLoader::LoadTransferSyntax : public State + { + public: + LoadTransferSyntax(OrthancMultiframeVolumeLoader& that) : + State(that) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + GetLoader().SetTransferSyntax(message.GetAnswer()); + } + }; + + class OrthancMultiframeVolumeLoader::LoadUncompressedPixelData : public State + { + public: + LoadUncompressedPixelData(OrthancMultiframeVolumeLoader& that) : + State(that) + { + } + + virtual void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + GetLoader().SetUncompressedPixelData(message.GetAnswer()); + } + }; + + const std::string& OrthancMultiframeVolumeLoader::GetInstanceId() const + { + if (IsActive()) + { + return instanceId_; + } + else + { + LOG(ERROR) << "OrthancMultiframeVolumeLoader::GetInstanceId(): (!IsActive())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + void OrthancMultiframeVolumeLoader::ScheduleFrameDownloads() + { + if (transferSyntaxUid_.empty() || + !volume_->HasGeometry()) + { + return; + } + /* + 1.2.840.10008.1.2 Implicit VR Endian: Default Transfer Syntax for DICOM + 1.2.840.10008.1.2.1 Explicit VR Little Endian + 1.2.840.10008.1.2.2 Explicit VR Big Endian + + See https://www.dicomlibrary.com/dicom/transfer-syntax/ + */ + if (transferSyntaxUid_ == "1.2.840.10008.1.2" || + transferSyntaxUid_ == "1.2.840.10008.1.2.1" || + transferSyntaxUid_ == "1.2.840.10008.1.2.2") + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + command->SetUri("/instances/" + instanceId_ + "/content/" + + Orthanc::DICOM_TAG_PIXEL_DATA.Format() + "/0"); + command->AcquirePayload(new LoadUncompressedPixelData(*this)); + Schedule(command.release()); + } + else + { + throw Orthanc::OrthancException( + Orthanc::ErrorCode_NotImplemented, + "No support for multiframe instances with transfer syntax: " + transferSyntaxUid_); + } + } + + void OrthancMultiframeVolumeLoader::SetTransferSyntax(const std::string& transferSyntax) + { + transferSyntaxUid_ = Orthanc::Toolbox::StripSpaces(transferSyntax); + ScheduleFrameDownloads(); + } + + void OrthancMultiframeVolumeLoader::SetGeometry(const Orthanc::DicomMap& dicom) + { + OrthancStone::DicomInstanceParameters parameters(dicom); + volume_->SetDicomParameters(parameters); + + Orthanc::PixelFormat format; + if (!parameters.GetImageInformation().ExtractPixelFormat(format, true)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + double spacingZ; + switch (parameters.GetSopClassUid()) + { + case OrthancStone::SopClassUid_RTDose: + spacingZ = parameters.GetThickness(); + break; + + default: + throw Orthanc::OrthancException( + Orthanc::ErrorCode_NotImplemented, + "No support for multiframe instances with SOP class UID: " + GetSopClassUid(dicom)); + } + + const unsigned int width = parameters.GetImageInformation().GetWidth(); + const unsigned int height = parameters.GetImageInformation().GetHeight(); + const unsigned int depth = parameters.GetImageInformation().GetNumberOfFrames(); + + { + OrthancStone::VolumeImageGeometry geometry; + geometry.SetSizeInVoxels(width, height, depth); + geometry.SetAxialGeometry(parameters.GetGeometry()); + geometry.SetVoxelDimensions(parameters.GetPixelSpacingX(), + parameters.GetPixelSpacingY(), spacingZ); + volume_->Initialize(geometry, format, true /* Do compute range */); + } + + volume_->GetPixelData().Clear(); + + ScheduleFrameDownloads(); + + + + BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); + } + + + ORTHANC_FORCE_INLINE + static void CopyPixel(uint32_t& target, const void* source) + { + // TODO - check alignement? + target = le32toh(*reinterpret_cast(source)); + } + + ORTHANC_FORCE_INLINE + static void CopyPixel(uint16_t& target, const void* source) + { + // TODO - check alignement? + target = le16toh(*reinterpret_cast(source)); + } + + ORTHANC_FORCE_INLINE + static void CopyPixel(int16_t& target, const void* source) + { + // byte swapping is the same for unsigned and signed integers + // (the sign bit is always stored with the MSByte) + uint16_t* targetUp = reinterpret_cast(&target); + CopyPixel(*targetUp, source); + } + + template + void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeDistribution( + const std::string& pixelData, std::map& distribution) + { + OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); + + const unsigned int bpp = target.GetBytesPerPixel(); + const unsigned int width = target.GetWidth(); + const unsigned int height = target.GetHeight(); + const unsigned int depth = target.GetDepth(); + + if (pixelData.size() != bpp * width * height * depth) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "The pixel data has not the proper size"); + } + + if (pixelData.empty()) + { + return; + } + + // first pass to initialize map + { + const uint8_t* source = reinterpret_cast(pixelData.c_str()); + + for (unsigned int z = 0; z < depth; z++) + { + for (unsigned int y = 0; y < height; y++) + { + for (unsigned int x = 0; x < width; x++) + { + T value; + CopyPixel(value, source); + distribution[value] = 0; + source += bpp; + } + } + } + } + + { + const uint8_t* source = reinterpret_cast(pixelData.c_str()); + + for (unsigned int z = 0; z < depth; z++) + { + OrthancStone::ImageBuffer3D::SliceWriter writer(target, OrthancStone::VolumeProjection_Axial, z); + + assert(writer.GetAccessor().GetWidth() == width && + writer.GetAccessor().GetHeight() == height); +#if 0 + for (unsigned int y = 0; y < height; y++) + { + assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); + + T* target = reinterpret_cast(writer.GetAccessor().GetRow(y)); + + for (unsigned int x = 0; x < width; x++) + { + CopyPixel(*target, source); + + distribution[*target] += 1; + + target++; + source += bpp; + } + } +#else + // optimized version (fixed) as of 2020-04-15 + unsigned int pitch = writer.GetAccessor().GetPitch(); + T* targetAddrLine = reinterpret_cast(writer.GetAccessor().GetRow(0)); + assert(sizeof(T) == Orthanc::GetBytesPerPixel(target.GetFormat())); + + for (unsigned int y = 0; y < height; y++) + { + T* targetAddrPix = targetAddrLine; + for (unsigned int x = 0; x < width; x++) + { + CopyPixel(*targetAddrPix, source); + + distribution[*targetAddrPix] += 1; + + targetAddrPix++; + source += bpp; + } + uint8_t* targetAddrLineBytes = reinterpret_cast(targetAddrLine) + pitch; + targetAddrLine = reinterpret_cast(targetAddrLineBytes); + } +#endif + } + } + } + + template + void OrthancMultiframeVolumeLoader::ComputeMinMaxWithOutlierRejection( + const std::map& distribution) + { + if (distribution.size() == 0) + { + LOG(ERROR) << "ComputeMinMaxWithOutlierRejection -- Volume image empty."; + } + else + { + OrthancStone::ImageBuffer3D& target = volume_->GetPixelData(); + + const uint64_t width = target.GetWidth(); + const uint64_t height = target.GetHeight(); + const uint64_t depth = target.GetDepth(); + const uint64_t voxelCount = width * height * depth; + + // now that we have distribution[pixelValue] == numberOfPixelsWithValue + // compute number of values and check (assertion) that it is equal to + // width * height * depth + { + typename std::map::const_iterator it = distribution.begin(); + uint64_t totalCount = 0; + distributionRawMin_ = static_cast(it->first); + + while (it != distribution.end()) + { + T pixelValue = it->first; + uint64_t count = it->second; + totalCount += count; + it++; + if (it == distribution.end()) + distributionRawMax_ = static_cast(pixelValue); + } + LOG(INFO) << "Volume image. First distribution value = " + << static_cast(distributionRawMin_) + << " | Last distribution value = " + << static_cast(distributionRawMax_); + + if (totalCount != voxelCount) + { + LOG(ERROR) << "Internal error in dose distribution computation. TC (" + << totalCount << ") != VoxC (" << voxelCount; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + // compute the number of voxels to reject at each end of the distribution + uint64_t endRejectionCount = static_cast( + outliersHalfRejectionRate_ * voxelCount); + + if (endRejectionCount > voxelCount) + { + LOG(ERROR) << "Internal error in dose distribution computation." + << " endRejectionCount = " << endRejectionCount + << " | voxelCount = " << voxelCount; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // this will contain the actual distribution minimum after outlier + // rejection + T resultMin = 0; + + // then start from start and remove pixel values up to + // endRejectionCount voxels rejected + { + typename std::map::const_iterator it = distribution.begin(); + + uint64_t currentCount = 0; + + while (it != distribution.end()) + { + T pixelValue = it->first; + uint64_t count = it->second; + + // if this pixelValue crosses the rejection threshold, let's set it + // and exit the loop + if ((currentCount <= endRejectionCount) && + (currentCount + count > endRejectionCount)) + { + resultMin = pixelValue; + break; + } + else + { + currentCount += count; + } + // and continue walking along the distribution + it++; + } + } + + // this will contain the actual distribution maximum after outlier + // rejection + T resultMax = 0; + // now start from END and remove pixel values up to + // endRejectionCount voxels rejected + { + typename std::map::const_reverse_iterator it = distribution.rbegin(); + + uint64_t currentCount = 0; + + while (it != distribution.rend()) + { + T pixelValue = it->first; + uint64_t count = it->second; + + if ((currentCount <= endRejectionCount) && + (currentCount + count > endRejectionCount)) + { + resultMax = pixelValue; + break; + } + else + { + currentCount += count; + } + // and continue walking along the distribution + it++; + } + } + if (resultMin > resultMax) + { + LOG(ERROR) << "Internal error in dose distribution computation! " << + "resultMin (" << resultMin << ") > resultMax (" << resultMax << ")"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + computedDistributionMin_ = static_cast(resultMin); + computedDistributionMax_ = static_cast(resultMax); + } + } + + template + void OrthancMultiframeVolumeLoader::CopyPixelDataAndComputeMinMax( + const std::string& pixelData) + { + std::map distribution; + CopyPixelDataAndComputeDistribution(pixelData, distribution); + ComputeMinMaxWithOutlierRejection(distribution); + } + + void OrthancMultiframeVolumeLoader::SetUncompressedPixelData(const std::string& pixelData) + { + switch (volume_->GetPixelData().GetFormat()) + { + case Orthanc::PixelFormat_Grayscale32: + CopyPixelDataAndComputeMinMax(pixelData); + break; + case Orthanc::PixelFormat_Grayscale16: + CopyPixelDataAndComputeMinMax(pixelData); + break; + case Orthanc::PixelFormat_SignedGrayscale16: + CopyPixelDataAndComputeMinMax(pixelData); + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + volume_->IncrementRevision(); + + pixelDataLoaded_ = true; + BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); + } + + bool OrthancMultiframeVolumeLoader::HasGeometry() const + { + return volume_->HasGeometry(); + } + + const OrthancStone::VolumeImageGeometry& OrthancMultiframeVolumeLoader::GetImageGeometry() const + { + return volume_->GetGeometry(); + } + + OrthancMultiframeVolumeLoader::OrthancMultiframeVolumeLoader( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + float outliersHalfRejectionRate) + : LoaderStateMachine(loadersContext) + , volume_(volume) + , pixelDataLoaded_(false) + , outliersHalfRejectionRate_(outliersHalfRejectionRate) + , distributionRawMin_(0) + , distributionRawMax_(0) + , computedDistributionMin_(0) + , computedDistributionMax_(0) + { + if (volume.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + + boost::shared_ptr + OrthancMultiframeVolumeLoader::Create( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + float outliersHalfRejectionRate /*= 0.0005*/) + { + boost::shared_ptr obj( + new OrthancMultiframeVolumeLoader( + loadersContext, + volume, + outliersHalfRejectionRate)); + obj->LoaderStateMachine::PostConstructor(); + return obj; + } + + OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader() + { + LOG(TRACE) << "OrthancMultiframeVolumeLoader::~OrthancMultiframeVolumeLoader()"; + } + + void OrthancMultiframeVolumeLoader::GetDistributionMinMax + (float& minValue, float& maxValue) const + { + if (distributionRawMin_ == 0 && distributionRawMax_ == 0) + { + LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; + } + minValue = distributionRawMin_; + maxValue = distributionRawMax_; + } + + void OrthancMultiframeVolumeLoader::GetDistributionMinMaxWithOutliersRejection + (float& minValue, float& maxValue) const + { + if (computedDistributionMin_ == 0 && computedDistributionMax_ == 0) + { + LOG(WARNING) << "GetDistributionMinMaxWithOutliersRejection called before computation!"; + } + minValue = computedDistributionMin_; + maxValue = computedDistributionMax_; + } + + void OrthancMultiframeVolumeLoader::LoadInstance(const std::string& instanceId) + { + Start(); + + instanceId_ = instanceId; + + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetHttpHeader("Accept-Encoding", "gzip"); + command->SetUri("/instances/" + instanceId + "/tags"); + command->AcquirePayload(new LoadGeometry(*this)); + Schedule(command.release()); + } + + { + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetUri("/instances/" + instanceId + "/metadata/TransferSyntax"); + command->AcquirePayload(new LoadTransferSyntax(*this)); + Schedule(command.release()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OrthancMultiframeVolumeLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,123 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "LoaderStateMachine.h" +#include "../Volumes/DicomVolumeImage.h" +#include "../Volumes/IGeometryProvider.h" + +#include + +namespace OrthancStone +{ + class OrthancMultiframeVolumeLoader : + public LoaderStateMachine, + public OrthancStone::IObservable, + public IGeometryProvider + { + private: + class LoadRTDoseGeometry; + class LoadGeometry; + class LoadTransferSyntax; + class LoadUncompressedPixelData; + + boost::shared_ptr volume_; + std::string instanceId_; + std::string transferSyntaxUid_; + bool pixelDataLoaded_; + float outliersHalfRejectionRate_; + float distributionRawMin_; + float distributionRawMax_; + float computedDistributionMin_; + float computedDistributionMax_; + + const std::string& GetInstanceId() const; + + void ScheduleFrameDownloads(); + + void SetTransferSyntax(const std::string& transferSyntax); + + void SetGeometry(const Orthanc::DicomMap& dicom); + + + /** + This method will : + + - copy the pixel values from the response to the volume image + - compute the maximum and minimum value while discarding the + outliersHalfRejectionRate_ fraction of the outliers from both the start + and the end of the distribution. + + In English, this means that, if the volume dataset contains a few extreme + values very different from the rest (outliers) that we want to get rid of, + this method allows to do so. + + If you supply 0.005, for instance, it means 1% of the extreme values will + be rejected (0.5% on each side of the distribution) + */ + template + void CopyPixelDataAndComputeMinMax(const std::string& pixelData); + + /** Service method for CopyPixelDataAndComputeMinMax*/ + template + void CopyPixelDataAndComputeDistribution( + const std::string& pixelData, + std::map& distribution); + + /** Service method for CopyPixelDataAndComputeMinMax*/ + template + void ComputeMinMaxWithOutlierRejection( + const std::map& distribution); + + void SetUncompressedPixelData(const std::string& pixelData); + + protected: + OrthancMultiframeVolumeLoader( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + float outliersHalfRejectionRate); + public: + + static boost::shared_ptr Create( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + float outliersHalfRejectionRate = 0.0005); + + virtual ~OrthancMultiframeVolumeLoader(); + + bool HasGeometry() const; + const OrthancStone::VolumeImageGeometry& GetImageGeometry() const; + + bool IsPixelDataLoaded() const + { + return pixelDataLoaded_; + } + + void GetDistributionMinMax + (float& minValue, float& maxValue) const; + + void GetDistributionMinMaxWithOutliersRejection + (float& minValue, float& maxValue) const; + + void LoadInstance(const std::string& instanceId); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,611 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrthancSeriesVolumeProgressiveLoader.h" + +#include "../StoneException.h" +#include "../Loaders/ILoadersContext.h" +#include "../Loaders/BasicFetchingItemsSorter.h" +#include "../Loaders/BasicFetchingStrategy.h" +#include "../Toolbox/GeometryToolbox.h" +#include "../Volumes/DicomVolumeImageMPRSlicer.h" + +#include +#include +#include + + +namespace OrthancStone +{ + using OrthancStone::ILoadersContext; + + class OrthancSeriesVolumeProgressiveLoader::ExtractedSlice : public OrthancStone::DicomVolumeImageMPRSlicer::Slice + { + private: + const OrthancSeriesVolumeProgressiveLoader& that_; + + public: + ExtractedSlice(const OrthancSeriesVolumeProgressiveLoader& that, + const OrthancStone::CoordinateSystem3D& plane) : + OrthancStone::DicomVolumeImageMPRSlicer::Slice(*that.volume_, plane), + that_(that) + { + if (IsValid()) + { + if (GetProjection() == OrthancStone::VolumeProjection_Axial) + { + // For coronal and sagittal projections, we take the global + // revision of the volume because even if a single slice changes, + // this means the projection will yield a different result --> + // we must increase the revision as soon as any slice changes + SetRevision(that_.seriesGeometry_.GetSliceRevision(GetSliceIndex())); + } + + if (that_.strategy_.get() != NULL && + GetProjection() == OrthancStone::VolumeProjection_Axial) + { + that_.strategy_->SetCurrent(GetSliceIndex()); + } + } + } + }; + + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSlice( + size_t index, const OrthancStone::DicomInstanceParameters& reference) const + { + const OrthancStone::DicomInstanceParameters& slice = *slices_[index]; + + if (!OrthancStone::GeometryToolbox::IsParallel( + reference.GetGeometry().GetNormal(), + slice.GetGeometry().GetNormal())) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, + "A slice in the volume image is not parallel to the others"); + } + + if (reference.GetExpectedPixelFormat() != slice.GetExpectedPixelFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, + "The pixel format changes across the slices of the volume image"); + } + + if (reference.GetImageInformation().GetWidth() != slice.GetImageInformation().GetWidth() || + reference.GetImageInformation().GetHeight() != slice.GetImageInformation().GetHeight()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize, + "The width/height of slices are not constant in the volume image"); + } + + if (!OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingX(), slice.GetPixelSpacingX()) || + !OrthancStone::LinearAlgebra::IsNear(reference.GetPixelSpacingY(), slice.GetPixelSpacingY())) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, + "The pixel spacing of the slices change across the volume image"); + } + } + + + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckVolume() const + { + for (size_t i = 0; i < slices_.size(); i++) + { + assert(slices_[i] != NULL); + if (slices_[i]->GetImageInformation().GetNumberOfFrames() != 1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, + "This class does not support multi-frame images"); + } + } + + if (slices_.size() != 0) + { + const OrthancStone::DicomInstanceParameters& reference = *slices_[0]; + + for (size_t i = 1; i < slices_.size(); i++) + { + CheckSlice(i, reference); + } + } + } + + + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::Clear() + { + for (size_t i = 0; i < slices_.size(); i++) + { + assert(slices_[i] != NULL); + delete slices_[i]; + } + + slices_.clear(); + slicesRevision_.clear(); + } + + + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index) const + { + if (!HasGeometry()) + { + LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::CheckSliceIndex(size_t index): (!HasGeometry())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else if (index >= slices_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(slices_.size() == GetImageGeometry().GetDepth() && + slices_.size() == slicesRevision_.size()); + } + } + + + // WARNING: The payload of "slices" must be of class "DicomInstanceParameters" + // (called with the slices created in LoadGeometry) + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::ComputeGeometry(OrthancStone::SlicesSorter& slices) + { + Clear(); + + if (!slices.Sort()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, + "Cannot sort the 3D slices of a DICOM series"); + } + + if (slices.GetSlicesCount() == 0) + { + geometry_.reset(new OrthancStone::VolumeImageGeometry); + } + else + { + slices_.reserve(slices.GetSlicesCount()); + slicesRevision_.resize(slices.GetSlicesCount(), 0); + + for (size_t i = 0; i < slices.GetSlicesCount(); i++) + { + const OrthancStone::DicomInstanceParameters& slice = + dynamic_cast(slices.GetSlicePayload(i)); + slices_.push_back(new OrthancStone::DicomInstanceParameters(slice)); + } + + CheckVolume(); + + double spacingZ; + + if (slices.ComputeSpacingBetweenSlices(spacingZ)) + { + LOG(TRACE) << "Computed spacing between slices: " << spacingZ << "mm"; + + const OrthancStone::DicomInstanceParameters& parameters = *slices_[0]; + + geometry_.reset(new OrthancStone::VolumeImageGeometry); + geometry_->SetSizeInVoxels(parameters.GetImageInformation().GetWidth(), + parameters.GetImageInformation().GetHeight(), + static_cast(slices.GetSlicesCount())); + geometry_->SetAxialGeometry(slices.GetSliceGeometry(0)); + geometry_->SetVoxelDimensions(parameters.GetPixelSpacingX(), + parameters.GetPixelSpacingY(), spacingZ); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadGeometry, + "The origins of the slices of a volume image are not regularly spaced"); + } + } + } + + + const OrthancStone::VolumeImageGeometry& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry() const + { + if (!HasGeometry()) + { + LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetImageGeometry(): (!HasGeometry())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + assert(slices_.size() == geometry_->GetDepth()); + return *geometry_; + } + } + + + const OrthancStone::DicomInstanceParameters& OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceParameters(size_t index) const + { + CheckSliceIndex(index); + return *slices_[index]; + } + + + uint64_t OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::GetSliceRevision(size_t index) const + { + CheckSliceIndex(index); + return slicesRevision_[index]; + } + + + void OrthancSeriesVolumeProgressiveLoader::SeriesGeometry::IncrementSliceRevision(size_t index) + { + CheckSliceIndex(index); + slicesRevision_[index] ++; + } + + + static unsigned int GetSliceIndexPayload(const OrthancStone::OracleCommandBase& command) + { + assert(command.HasPayload()); + return dynamic_cast< const Orthanc::SingleValueObject& >(command.GetPayload()).GetValue(); + } + + + void OrthancSeriesVolumeProgressiveLoader::ScheduleNextSliceDownload() + { + assert(strategy_.get() != NULL); + + unsigned int sliceIndex = 0, quality = 0; + + if (strategy_->GetNext(sliceIndex, quality)) + { + if (!progressiveQuality_) + { + ORTHANC_ASSERT(quality == QUALITY_00, "INTERNAL ERROR. quality != QUALITY_00 in " + << "OrthancSeriesVolumeProgressiveLoader::ScheduleNextSliceDownload"); + } + + const OrthancStone::DicomInstanceParameters& slice = seriesGeometry_.GetSliceParameters(sliceIndex); + + const std::string& instance = slice.GetOrthancInstanceIdentifier(); + if (instance.empty()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + std::unique_ptr command; + + if (!progressiveQuality_ || quality == QUALITY_02) + { + std::unique_ptr tmp(new OrthancStone::GetOrthancImageCommand); + // TODO: review the following comment. + // - Commented out by bgo on 2019-07-19 | reason: Alain has seen cases + // where gzipping the uint16 image took 11 sec to produce 5mb. + // The unzipped request was much much faster. + // - Re-enabled on 2019-07-30. Reason: in Web Assembly, the browser + // does not use the Accept-Encoding header and always requests + // compression. Furthermore, NOT + tmp->SetHttpHeader("Accept-Encoding", "gzip"); + tmp->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); + tmp->SetInstanceUri(instance, slice.GetExpectedPixelFormat()); + tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); + //LOG(INFO) + // << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" + // << " sliceIndex = " << sliceIndex << " slice quality = " << quality + // << " URI = " << tmp->GetUri(); + command.reset(tmp.release()); + } + else // progressive mode is true AND quality is not final (different from QUALITY_02 + { + std::unique_ptr tmp( + new OrthancStone::GetOrthancWebViewerJpegCommand); + + // TODO: review the following comment. Commented out by bgo on 2019-07-19 + // (gzip for jpeg seems overkill) + //tmp->SetHttpHeader("Accept-Encoding", "gzip"); + tmp->SetInstance(instance); + tmp->SetQuality((quality == 0 ? 50 : 90)); // QUALITY_00 is Jpeg50 while QUALITY_01 is Jpeg90 + tmp->SetExpectedPixelFormat(slice.GetExpectedPixelFormat()); + LOG(TRACE) + << "OrthancSeriesVolumeProgressiveLoader.ScheduleNextSliceDownload()" + << " sliceIndex = " << sliceIndex << " slice quality = " << quality; + command.reset(tmp.release()); + } + + command->AcquirePayload(new Orthanc::SingleValueObject(sliceIndex)); + + { + std::unique_ptr lock(loadersContext_.Lock()); + boost::shared_ptr observer(GetSharedObserver()); + lock->Schedule(observer, sliceSchedulingPriority_, command.release()); + } + } + else + { + // loading is finished! + volumeImageReadyInHighQuality_ = true; + BroadcastMessage(OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality(*this)); + } + } + +/** + This is called in response to GET "/series/XXXXXXXXXXXXX/instances-tags" +*/ + void OrthancSeriesVolumeProgressiveLoader::LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) + { + Json::Value body; + message.ParseJsonBody(body); + + if (body.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + { + Json::Value::Members instances = body.getMemberNames(); + + OrthancStone::SlicesSorter slices; + + for (size_t i = 0; i < instances.size(); i++) + { + Orthanc::DicomMap dicom; + dicom.FromDicomAsJson(body[instances[i]]); + + std::unique_ptr instance(new OrthancStone::DicomInstanceParameters(dicom)); + instance->SetOrthancInstanceIdentifier(instances[i]); + + // the 3D plane corresponding to the slice + OrthancStone::CoordinateSystem3D geometry = instance->GetGeometry(); + slices.AddSlice(geometry, instance.release()); + + if (slicePostProcessor_) + slicePostProcessor_->ProcessCTDicomSlice(dicom); + } + + seriesGeometry_.ComputeGeometry(slices); + } + + size_t slicesCount = seriesGeometry_.GetImageGeometry().GetDepth(); + + if (slicesCount == 0) + { + volume_->Initialize(seriesGeometry_.GetImageGeometry(), Orthanc::PixelFormat_Grayscale8); + } + else + { + const OrthancStone::DicomInstanceParameters& parameters = seriesGeometry_.GetSliceParameters(0); + + volume_->Initialize(seriesGeometry_.GetImageGeometry(), parameters.GetExpectedPixelFormat()); + volume_->SetDicomParameters(parameters); + volume_->GetPixelData().Clear(); + + // If we are in progressive mode, the Fetching strategy will first request QUALITY_00, then QUALITY_01, then + // QUALITY_02... Otherwise, it's only QUALITY_00 + unsigned int maxQuality = QUALITY_00; + if (progressiveQuality_) + maxQuality = QUALITY_02; + + strategy_.reset(new OrthancStone::BasicFetchingStrategy( + sorter_->CreateSorter(static_cast(slicesCount)), + maxQuality)); + + assert(simultaneousDownloads_ != 0); + for (unsigned int i = 0; i < simultaneousDownloads_; i++) + { + ScheduleNextSliceDownload(); + } + } + + slicesQuality_.resize(slicesCount, 0); + + BroadcastMessage(OrthancStone::DicomVolumeImage::GeometryReadyMessage(*volume_)); + } + + + void OrthancSeriesVolumeProgressiveLoader::SetSliceContent(unsigned int sliceIndex, + const Orthanc::ImageAccessor& image, + unsigned int quality) + { + ORTHANC_ASSERT(sliceIndex < slicesQuality_.size() && + slicesQuality_.size() == volume_->GetPixelData().GetDepth()); + + if (!progressiveQuality_) + { + ORTHANC_ASSERT(quality == QUALITY_00); + ORTHANC_ASSERT(slicesQuality_[sliceIndex] == QUALITY_00); + } + + if (quality >= slicesQuality_[sliceIndex]) + { + { + OrthancStone::ImageBuffer3D::SliceWriter writer(volume_->GetPixelData(), + OrthancStone::VolumeProjection_Axial, + sliceIndex); + + Orthanc::ImageProcessing::Copy(writer.GetAccessor(), image); + } + + volume_->IncrementRevision(); + seriesGeometry_.IncrementSliceRevision(sliceIndex); + slicesQuality_[sliceIndex] = quality; + + BroadcastMessage(OrthancStone::DicomVolumeImage::ContentUpdatedMessage(*volume_)); + } + LOG(TRACE) << "SetSliceContent sliceIndex = " << sliceIndex << " -- will " + << " now call ScheduleNextSliceDownload()"; + ScheduleNextSliceDownload(); + } + + void OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent( + const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) + { + unsigned int quality = QUALITY_00; + if (progressiveQuality_) + quality = QUALITY_02; + + SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), + message.GetImage(), + quality); + } + + void OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent( + const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) + { + ORTHANC_ASSERT(progressiveQuality_, "INTERNAL ERROR: OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent" + << " called while progressiveQuality_ is false!"); + + LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent"; + unsigned int quality; + + switch (dynamic_cast(message.GetOrigin()).GetQuality()) + { + case 50: + quality = QUALITY_00; + break; + + case 90: + quality = QUALITY_01; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + SetSliceContent(GetSliceIndexPayload(message.GetOrigin()), message.GetImage(), quality); + } + + + void OrthancSeriesVolumeProgressiveLoader::SetMetadataSchedulingPriority(int p) + { + medadataSchedulingPriority_ = p; + } + + int OrthancSeriesVolumeProgressiveLoader::GetMetadataSchedulingPriority() const + { + return medadataSchedulingPriority_; + } + + void OrthancSeriesVolumeProgressiveLoader::SetSliceSchedulingPriority(int p) + { + sliceSchedulingPriority_ = p; + } + + int OrthancSeriesVolumeProgressiveLoader::GetSliceSchedulingPriority() const + { + return sliceSchedulingPriority_; + } + + void OrthancSeriesVolumeProgressiveLoader::SetSchedulingPriority(int p) + { + medadataSchedulingPriority_ = p; + sliceSchedulingPriority_ = p; + } + + OrthancSeriesVolumeProgressiveLoader::OrthancSeriesVolumeProgressiveLoader( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + bool progressiveQuality) + : loadersContext_(loadersContext) + , active_(false) + , progressiveQuality_(progressiveQuality) + , simultaneousDownloads_(4) + , volume_(volume) + , sorter_(new OrthancStone::BasicFetchingItemsSorter::Factory) + , volumeImageReadyInHighQuality_(false) + , medadataSchedulingPriority_(0) + , sliceSchedulingPriority_(0) + { + } + + boost::shared_ptr + OrthancSeriesVolumeProgressiveLoader::Create( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + bool progressiveQuality) + { + std::unique_ptr lock(loadersContext.Lock()); + + boost::shared_ptr obj( + new OrthancSeriesVolumeProgressiveLoader( + loadersContext, volume, progressiveQuality)); + + obj->Register( + lock->GetOracleObservable(), + &OrthancSeriesVolumeProgressiveLoader::LoadGeometry); + + obj->Register( + lock->GetOracleObservable(), + &OrthancSeriesVolumeProgressiveLoader::LoadBestQualitySliceContent); + + obj->Register( + lock->GetOracleObservable(), + &OrthancSeriesVolumeProgressiveLoader::LoadJpegSliceContent); + + return obj; + } + + + OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader() + { + LOG(TRACE) << "OrthancSeriesVolumeProgressiveLoader::~OrthancSeriesVolumeProgressiveLoader()"; + } + + void OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(unsigned int count) + { + if (active_) + { + LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::SetSimultaneousDownloads(): (active_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else if (count == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + simultaneousDownloads_ = count; + } + } + + + void OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId) + { + if (active_) + { + LOG(ERROR) << "OrthancSeriesVolumeProgressiveLoader::LoadSeries(const std::string& seriesId): (active_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + active_ = true; + + std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); + command->SetUri("/series/" + seriesId + "/instances-tags"); + { + std::unique_ptr lock(loadersContext_.Lock()); + boost::shared_ptr observer(GetSharedObserver()); + lock->Schedule(observer, medadataSchedulingPriority_, command.release()); + } + } + } + + + OrthancStone::IVolumeSlicer::IExtractedSlice* + OrthancSeriesVolumeProgressiveLoader::ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) + { + if (volume_->HasGeometry()) + { + return new ExtractedSlice(*this, cuttingPlane); + } + else + { + return new IVolumeSlicer::InvalidSlice; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,227 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Loaders/IFetchingItemsSorter.h" +#include "../Loaders/IFetchingStrategy.h" +#include "../Messages/IObservable.h" +#include "../Messages/ObserverBase.h" +#include "../Oracle/GetOrthancImageCommand.h" +#include "../Oracle/GetOrthancWebViewerJpegCommand.h" +#include "../Oracle/IOracle.h" +#include "../Oracle/OrthancRestApiCommand.h" +#include "../Toolbox/SlicesSorter.h" +#include "../Volumes/DicomVolumeImage.h" +#include "../Volumes/IVolumeSlicer.h" + +#include "../Volumes/IGeometryProvider.h" + + +#include + +namespace OrthancStone +{ + class ILoadersContext; + /** + This class is used to manage the progressive loading of a volume that + is stored in a Dicom series. + */ + class OrthancSeriesVolumeProgressiveLoader : + public OrthancStone::ObserverBase, + public OrthancStone::IObservable, + public OrthancStone::IVolumeSlicer, + public IGeometryProvider + { + public: + class ISlicePostProcessor + { + public: + virtual void ProcessCTDicomSlice(const Orthanc::DicomMap& dicom) = 0; + }; + + private: + static const unsigned int QUALITY_00 = 0; + static const unsigned int QUALITY_01 = 1; + static const unsigned int QUALITY_02 = 2; + + class ExtractedSlice; + + + /** Helper class internal to OrthancSeriesVolumeProgressiveLoader */ + class SeriesGeometry : public boost::noncopyable + { + private: + void CheckSlice(size_t index, + const OrthancStone::DicomInstanceParameters& reference) const; + + void CheckVolume() const; + + void Clear(); + + void CheckSliceIndex(size_t index) const; + + std::unique_ptr geometry_; + std::vector slices_; + std::vector slicesRevision_; + + public: + ~SeriesGeometry() + { + Clear(); + } + + void ComputeGeometry(OrthancStone::SlicesSorter& slices); + + virtual bool HasGeometry() const + { + return geometry_.get() != NULL; + } + + virtual const OrthancStone::VolumeImageGeometry& GetImageGeometry() const; + + const OrthancStone::DicomInstanceParameters& GetSliceParameters(size_t index) const; + + uint64_t GetSliceRevision(size_t index) const; + + void IncrementSliceRevision(size_t index); + }; + + void ScheduleNextSliceDownload(); + + void LoadGeometry(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message); + + void SetSliceContent(unsigned int sliceIndex, + const Orthanc::ImageAccessor& image, + unsigned int quality); + + void LoadBestQualitySliceContent(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message); + + void LoadJpegSliceContent(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message); + + OrthancStone::ILoadersContext& loadersContext_; + bool active_; + bool progressiveQuality_; + unsigned int simultaneousDownloads_; + SeriesGeometry seriesGeometry_; + boost::shared_ptr volume_; + std::unique_ptr sorter_; + std::unique_ptr strategy_; + + std::vector slicesQuality_; + bool volumeImageReadyInHighQuality_; + + boost::shared_ptr slicePostProcessor_; + + /** See priority setters/getters below */ + int medadataSchedulingPriority_; + + /** See priority setters/getters below */ + int sliceSchedulingPriority_; + + OrthancSeriesVolumeProgressiveLoader( + OrthancStone::ILoadersContext& loadersContext, + boost::shared_ptr volume, + bool progressiveQuality); + + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, VolumeImageReadyInHighQuality, OrthancSeriesVolumeProgressiveLoader); + + /** + See doc for the progressiveQuality_ field + */ + static boost::shared_ptr Create( + OrthancStone::ILoadersContext& context, + boost::shared_ptr volume, + bool progressiveQuality = false); + + virtual ~OrthancSeriesVolumeProgressiveLoader(); + + void SetSimultaneousDownloads(unsigned int count); + + /** + Sets the relative priority of the requests for metadata. + - if p < PRIORITY_HIGH (-1) , the requests will be high priority + - if PRIORITY_LOW (100) > p > PRIORITY_HIGH , the requests will be medium priority + - if p > PRIORITY_LOW , the requests will be low priority + + Default is 0 (medium) + */ + void SetMetadataSchedulingPriority(int p); + + /** @see SetMetadataSchedulingPriority */ + int GetMetadataSchedulingPriority() const; + + /** Same as SetMetadataSchedulingPriority, for slices. Default is 0. */ + void SetSliceSchedulingPriority(int p); + + /** @see SetSliceSchedulingPriority */ + int GetSliceSchedulingPriority() const; + + /** Sets priorities for all requests. @see SetMetadataSchedulingPriority */ + void SetSchedulingPriority(int p); + + void SetDicomSlicePostProcessor(boost::shared_ptr slicePostProcessor) + { + // this will delete the previously stored slice processor, if any + slicePostProcessor_ = slicePostProcessor; + } + + boost::shared_ptr GetDicomSlicePostProcessor() + { + // this could be empty! + return slicePostProcessor_; + } + + bool IsVolumeImageReadyInHighQuality() const + { + return volumeImageReadyInHighQuality_; + } + + void LoadSeries(const std::string& seriesId); + + /** + This getter is used by clients that do not receive the geometry through + subscribing, for instance if they are created or listening only AFTER the + "geometry loaded" message is broadcast + */ + bool HasGeometry() const ORTHANC_OVERRIDE + { + return seriesGeometry_.HasGeometry(); + } + + /** + Same remark as HasGeometry + */ + const OrthancStone::VolumeImageGeometry& GetImageGeometry() const ORTHANC_OVERRIDE + { + return seriesGeometry_.GetImageGeometry(); + } + + /** + When a slice is requested, the strategy algorithm (that defines the + sequence of resources to be loaded from the server) is modified to + take into account this request (this is done in the ExtractedSlice ctor) + */ + virtual IExtractedSlice* + ExtractSlice(const OrthancStone::CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesFramesLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesFramesLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,550 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SeriesFramesLoader.h" + +#include "../Oracle/ParseDicomFromFileCommand.h" +#include "../Oracle/ParseDicomFromWadoCommand.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include +#endif + +#include +#include +#include +#include + +#include + +namespace OrthancStone +{ + class SeriesFramesLoader::Payload : public Orthanc::IDynamicObject + { + private: + DicomSource source_; + size_t seriesIndex_; + std::string sopInstanceUid_; // Only used for debug purpose + unsigned int quality_; + bool hasWindowing_; + float windowingCenter_; + float windowingWidth_; + std::unique_ptr userPayload_; + + public: + Payload(const DicomSource& source, + size_t seriesIndex, + const std::string& sopInstanceUid, + unsigned int quality, + Orthanc::IDynamicObject* userPayload) : + source_(source), + seriesIndex_(seriesIndex), + sopInstanceUid_(sopInstanceUid), + quality_(quality), + hasWindowing_(false), + userPayload_(userPayload) + { + } + + size_t GetSeriesIndex() const + { + return seriesIndex_; + } + + const std::string& GetSopInstanceUid() const + { + return sopInstanceUid_; + } + + unsigned int GetQuality() const + { + return quality_; + } + + void SetWindowing(float center, + float width) + { + hasWindowing_ = true; + windowingCenter_ = center; + windowingWidth_ = width; + } + + bool HasWindowing() const + { + return hasWindowing_; + } + + float GetWindowingCenter() const + { + if (hasWindowing_) + { + return windowingCenter_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + float GetWindowingWidth() const + { + if (hasWindowing_) + { + return windowingWidth_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + const DicomSource& GetSource() const + { + return source_; + } + + Orthanc::IDynamicObject* GetUserPayload() const + { + return userPayload_.get(); + } + }; + + + SeriesFramesLoader::SeriesFramesLoader(ILoadersContext& context, + LoadedDicomResources& instances, + const std::string& dicomDirPath, + boost::shared_ptr dicomDir) : + context_(context), + frames_(instances), + dicomDirPath_(dicomDirPath), + dicomDir_(dicomDir) + { + } + + + void SeriesFramesLoader::EmitMessage(const Payload& payload, + const Orthanc::ImageAccessor& image) + { + const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(payload.GetSeriesIndex()); + const Orthanc::DicomMap& instance = frames_.GetInstance(payload.GetSeriesIndex()); + size_t frameIndex = frames_.GetFrameIndex(payload.GetSeriesIndex()); + + if (frameIndex >= parameters.GetImageInformation().GetNumberOfFrames() || + payload.GetSopInstanceUid() != parameters.GetSopInstanceUid()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + LOG(TRACE) << "Decoded instance " << payload.GetSopInstanceUid() << ", frame " + << frameIndex << ": " << image.GetWidth() << "x" + << image.GetHeight() << ", " << Orthanc::EnumerationToString(image.GetFormat()) + << ", quality " << payload.GetQuality(); + + FrameLoadedMessage message(*this, frameIndex, payload.GetQuality(), image, instance, parameters, payload.GetUserPayload()); + BroadcastMessage(message); + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + void SeriesFramesLoader::HandleDicom(const Payload& payload, + Orthanc::ParsedDicomFile& dicom) + { + size_t frameIndex = frames_.GetFrameIndex(payload.GetSeriesIndex()); + + std::unique_ptr decoded; + decoded.reset(Orthanc::DicomImageDecoder::Decode( + dicom, + static_cast(frameIndex))); + + if (decoded.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + EmitMessage(payload, *decoded); + } +#endif + + + void SeriesFramesLoader::HandleDicomWebRendered(const Payload& payload, + const std::string& body, + const std::map& headers) + { + assert(payload.GetSource().IsDicomWeb() && + payload.HasWindowing()); + + bool ok = false; + for (std::map::const_iterator it = headers.begin(); + it != headers.end(); ++it) + { + if (boost::iequals("content-type", it->first) && + boost::iequals(Orthanc::MIME_JPEG, it->second)) + { + ok = true; + break; + } + } + + if (!ok) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "The WADO-RS server has not generated a JPEG image on /rendered"); + } + + Orthanc::JpegReader reader; + reader.ReadFromMemory(body); + + switch (reader.GetFormat()) + { + case Orthanc::PixelFormat_RGB24: + EmitMessage(payload, reader); + break; + + case Orthanc::PixelFormat_Grayscale8: + { + const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(payload.GetSeriesIndex()); + + Orthanc::Image scaled(parameters.GetExpectedPixelFormat(), reader.GetWidth(), reader.GetHeight(), false); + Orthanc::ImageProcessing::Convert(scaled, reader); + + float w = payload.GetWindowingWidth(); + if (w <= 0.01f) + { + w = 0.01f; // Prevent division by zero + } + + const float c = payload.GetWindowingCenter(); + const float scaling = w / 255.0f; + const float offset = (c - w / 2.0f) / scaling; + + Orthanc::ImageProcessing::ShiftScale(scaled, offset, scaling, false /* truncation to speed up */); + EmitMessage(payload, scaled); + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + void SeriesFramesLoader::Handle(const ParseDicomSuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + + const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + if ((payload.GetSource().IsDicomDir() || + payload.GetSource().IsDicomWeb()) && + message.HasPixelData()) + { + HandleDicom(dynamic_cast(message.GetOrigin().GetPayload()), message.GetDicom()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +#endif + + + void SeriesFramesLoader::Handle(const GetOrthancImageCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + + const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + assert(payload.GetSource().IsOrthanc()); + + EmitMessage(payload, message.GetImage()); + } + + + void SeriesFramesLoader::Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + + const Payload& payload = dynamic_cast(message.GetOrigin().GetPayload()); + assert(payload.GetSource().IsOrthanc()); + + EmitMessage(payload, message.GetImage()); + } + + + void SeriesFramesLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) + { + // This is to handle "/rendered" in DICOMweb + assert(message.GetOrigin().HasPayload()); + HandleDicomWebRendered(dynamic_cast(message.GetOrigin().GetPayload()), + message.GetAnswer(), message.GetAnswerHeaders()); + } + + + void SeriesFramesLoader::Handle(const HttpCommand::SuccessMessage& message) + { + // This is to handle "/rendered" in DICOMweb + assert(message.GetOrigin().HasPayload()); + HandleDicomWebRendered(dynamic_cast(message.GetOrigin().GetPayload()), + message.GetAnswer(), message.GetAnswerHeaders()); + } + + + void SeriesFramesLoader::GetPreviewWindowing(float& center, + float& width, + size_t index) const + { + const Orthanc::DicomMap& instance = frames_.GetInstance(index); + const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(index); + + if (parameters.HasDefaultWindowing()) + { + // TODO - Handle multiple presets (take the largest width) + center = parameters.GetDefaultWindowingCenter(); + width = parameters.GetDefaultWindowingWidth(); + } + else + { + float a, b; + if (instance.ParseFloat(a, Orthanc::DICOM_TAG_SMALLEST_IMAGE_PIXEL_VALUE) && + instance.ParseFloat(b, Orthanc::DICOM_TAG_LARGEST_IMAGE_PIXEL_VALUE) && + a < b) + { + center = (a + b) / 2.0f; + width = (b - a); + } + else + { + // Cannot infer a suitable windowing from the available tags + center = 128.0f; + width = 256.0f; + } + } + } + + + Orthanc::IDynamicObject& SeriesFramesLoader::FrameLoadedMessage::GetUserPayload() const + { + if (userPayload_) + { + return *userPayload_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void SeriesFramesLoader::Factory::SetDicomDir(const std::string& dicomDirPath, + boost::shared_ptr dicomDir) + { + dicomDirPath_ = dicomDirPath; + dicomDir_ = dicomDir; + } + + + boost::shared_ptr SeriesFramesLoader::Factory::Create(ILoadersContext::ILock& stone) + { + boost::shared_ptr loader( + new SeriesFramesLoader(stone.GetContext(), instances_, dicomDirPath_, dicomDir_)); + loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); + loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); + loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); + loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); + +#if ORTHANC_ENABLE_DCMTK == 1 + loader->Register(stone.GetOracleObservable(), &SeriesFramesLoader::Handle); +#endif + + return loader; + } + + + void SeriesFramesLoader::ScheduleLoadFrame(int priority, + const DicomSource& source, + size_t index, + unsigned int quality, + Orthanc::IDynamicObject* userPayload) + { + std::unique_ptr protection(userPayload); + + if (index >= frames_.GetFramesCount() || + quality >= source.GetQualityCount()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const Orthanc::DicomMap& instance = frames_.GetInstance(index); + + std::string sopInstanceUid; + if (!instance.LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "Missing SOPInstanceUID in a DICOM instance"); + } + + if (source.IsDicomDir()) + { + if (dicomDir_.get() == NULL) + { + // Should have been set in the factory + throw Orthanc::OrthancException( + Orthanc::ErrorCode_BadSequenceOfCalls, + "SeriesFramesLoader::Factory::SetDicomDir() should have been called"); + } + + assert(quality == 0); + + std::string file; + if (dicomDir_->LookupStringValue(file, sopInstanceUid, Orthanc::DICOM_TAG_REFERENCED_FILE_ID)) + { + std::unique_ptr command(new ParseDicomFromFileCommand(source, dicomDirPath_, file)); + command->SetPixelDataIncluded(true); + command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + else + { + LOG(WARNING) << "Missing tag ReferencedFileID in a DICOMDIR entry"; + } + } + else if (source.IsDicomWeb()) + { + std::string studyInstanceUid, seriesInstanceUid; + if (!instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || + !instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "Missing StudyInstanceUID or SeriesInstanceUID in a DICOM instance"); + } + + const std::string uri = ("/studies/" + studyInstanceUid + + "/series/" + seriesInstanceUid + + "/instances/" + sopInstanceUid); + + if (source.HasDicomWebRendered() && + quality == 0) + { + float c, w; + GetPreviewWindowing(c, w, index); + + std::map arguments, headers; + arguments["window"] = (boost::lexical_cast(c) + "," + + boost::lexical_cast(w) + ",linear"); + headers["Accept"] = "image/jpeg"; + + std::unique_ptr payload(new Payload(source, index, sopInstanceUid, quality, protection.release())); + payload->SetWindowing(c, w); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, + source.CreateDicomWebCommand(uri + "/rendered", arguments, headers, payload.release())); + } + } + else + { + assert((source.HasDicomWebRendered() && quality == 1) || + (!source.HasDicomWebRendered() && quality == 0)); + +#if ORTHANC_ENABLE_DCMTK == 1 + std::unique_ptr payload(new Payload(source, index, sopInstanceUid, quality, protection.release())); + + const std::map empty; + + std::unique_ptr command( + new ParseDicomFromWadoCommand(source, sopInstanceUid, source.CreateDicomWebCommand(uri, empty, empty, NULL))); + command->AcquirePayload(payload.release()); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "DCMTK is not enabled, cannot parse a DICOM instance"); +#endif + } + } + else if (source.IsOrthanc()) + { + std::string orthancId; + + { + std::string patientId, studyInstanceUid, seriesInstanceUid; + if (!instance.LookupStringValue(patientId, Orthanc::DICOM_TAG_PATIENT_ID, false) || + !instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || + !instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "Missing StudyInstanceUID or SeriesInstanceUID in a DICOM instance"); + } + + Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, sopInstanceUid); + orthancId = hasher.HashInstance(); + } + + const DicomInstanceParameters& parameters = frames_.GetInstanceParameters(index); + + if (quality == 0 && source.HasOrthancWebViewer1()) + { + std::unique_ptr command(new GetOrthancWebViewerJpegCommand); + command->SetInstance(orthancId); + command->SetExpectedPixelFormat(parameters.GetExpectedPixelFormat()); + command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + else if (quality == 0 && source.HasOrthancAdvancedPreview()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + else + { + assert(quality <= 1); + assert(quality == 0 || + source.HasOrthancWebViewer1() || + source.HasOrthancAdvancedPreview()); + + std::unique_ptr command(new GetOrthancImageCommand); + command->SetFrameUri(orthancId, frames_.GetFrameIndex(index), parameters.GetExpectedPixelFormat()); + command->SetExpectedPixelFormat(parameters.GetExpectedPixelFormat()); + command->SetHttpHeader("Accept", Orthanc::MIME_PAM); + command->AcquirePayload(new Payload(source, index, sopInstanceUid, quality, protection.release())); + + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority, command.release()); + } + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesFramesLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesFramesLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,178 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#include "OracleScheduler.h" +#include "DicomSource.h" +#include "SeriesOrderedFrames.h" +#include "ILoaderFactory.h" + +namespace OrthancStone +{ + class SeriesFramesLoader : + public ObserverBase, + public IObservable + { + private: + class Payload; + + ILoadersContext& context_; + SeriesOrderedFrames frames_; + std::string dicomDirPath_; + boost::shared_ptr dicomDir_; + + SeriesFramesLoader(ILoadersContext& context, + LoadedDicomResources& instances, + const std::string& dicomDirPath, + boost::shared_ptr dicomDir); + + void EmitMessage(const Payload& payload, + const Orthanc::ImageAccessor& image); + +#if ORTHANC_ENABLE_DCMTK == 1 + void HandleDicom(const Payload& payload, + Orthanc::ParsedDicomFile& dicom); +#endif + + void HandleDicomWebRendered(const Payload& payload, + const std::string& body, + const std::map& headers); + +#if ORTHANC_ENABLE_DCMTK == 1 + void Handle(const ParseDicomSuccessMessage& message); +#endif + + void Handle(const GetOrthancImageCommand::SuccessMessage& message); + + void Handle(const GetOrthancWebViewerJpegCommand::SuccessMessage& message); + + void Handle(const OrthancRestApiCommand::SuccessMessage& message); + + void Handle(const HttpCommand::SuccessMessage& message); + + void GetPreviewWindowing(float& center, + float& width, + size_t index) const; + + public: + class FrameLoadedMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + size_t frameIndex_; + unsigned int quality_; + const Orthanc::ImageAccessor& image_; + const Orthanc::DicomMap& instance_; + const DicomInstanceParameters& parameters_; + Orthanc::IDynamicObject* userPayload_; // Ownership is maintained by the caller + + public: + FrameLoadedMessage(const SeriesFramesLoader& loader, + size_t frameIndex, + unsigned int quality, + const Orthanc::ImageAccessor& image, + const Orthanc::DicomMap& instance, + const DicomInstanceParameters& parameters, + Orthanc::IDynamicObject* userPayload) : + OriginMessage(loader), + frameIndex_(frameIndex), + quality_(quality), + image_(image), + instance_(instance), + parameters_(parameters), + userPayload_(userPayload) + { + } + + size_t GetFrameIndex() const + { + return frameIndex_; + } + + unsigned int GetQuality() const + { + return quality_; + } + + const Orthanc::ImageAccessor& GetImage() const + { + return image_; + } + + const Orthanc::DicomMap& GetInstance() const + { + return instance_; + } + + const DicomInstanceParameters& GetInstanceParameters() const + { + return parameters_; + } + + bool HasUserPayload() const + { + return userPayload_ != NULL; + } + + Orthanc::IDynamicObject& GetUserPayload() const; + }; + + + class Factory : public ILoaderFactory + { + private: + LoadedDicomResources& instances_; + std::string dicomDirPath_; + boost::shared_ptr dicomDir_; + + public: + // No "const" because "LoadedDicomResources::GetResource()" will call "Flatten()" + Factory(LoadedDicomResources& instances) : + instances_(instances) + { + } + + void SetDicomDir(const std::string& dicomDirPath, + boost::shared_ptr dicomDir); + + virtual boost::shared_ptr Create(ILoadersContext::ILock& context); + }; + + const SeriesOrderedFrames& GetOrderedFrames() const + { + return frames_; + } + + void ScheduleLoadFrame(int priority, + const DicomSource& source, + size_t index, + unsigned int quality, + Orthanc::IDynamicObject* userPayload /* transfer ownership */); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesMetadataLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesMetadataLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,346 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SeriesMetadataLoader.h" + +#include + +namespace OrthancStone +{ + SeriesMetadataLoader::SeriesMetadataLoader(boost::shared_ptr& loader) : + loader_(loader), + state_(State_Setup) + { + } + + + bool SeriesMetadataLoader::IsScheduledWithHigherPriority(const std::string& seriesInstanceUid, + int priority) const + { + if (series_.find(seriesInstanceUid) != series_.end()) + { + // This series is readily available + return true; + } + else + { + std::map::const_iterator found = scheduled_.find(seriesInstanceUid); + + return (found != scheduled_.end() && + found->second < priority); + } + } + + + void SeriesMetadataLoader::Handle(const DicomResourcesLoader::SuccessMessage& message) + { + assert(message.GetResources()); + + switch (state_) + { + case State_Setup: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + + case State_Default: + { + std::string studyInstanceUid; + std::string seriesInstanceUid; + + if (message.GetResources()->LookupTagValueConsensus(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID) && + message.GetResources()->LookupTagValueConsensus(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID)) + { + series_[seriesInstanceUid] = message.GetResources(); + + SuccessMessage loadedMessage(*this, message.GetDicomSource(), studyInstanceUid, + seriesInstanceUid, *message.GetResources()); + BroadcastMessage(loadedMessage); + } + + break; + } + + case State_DicomDir: + { + assert(!dicomDir_); + assert(seriesSize_.empty()); + + dicomDir_ = message.GetResources(); + + for (size_t i = 0; i < message.GetResources()->GetSize(); i++) + { + std::string seriesInstanceUid; + if (message.GetResources()->GetResource(i).LookupStringValue + (seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + boost::shared_ptr target + (new OrthancStone::LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); + + if (loader_->ScheduleLoadDicomFile(target, message.GetPriority(), message.GetDicomSource(), dicomDirPath_, + message.GetResources()->GetResource(i), false /* no need for pixel data */, + NULL /* TODO PAYLOAD */)) + { + std::map::iterator found = seriesSize_.find(seriesInstanceUid); + if (found == seriesSize_.end()) + { + series_[seriesInstanceUid].reset + (new OrthancStone::LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); + seriesSize_[seriesInstanceUid] = 1; + } + else + { + found->second ++; + } + } + } + } + + LOG(INFO) << "Read a DICOMDIR containing " << seriesSize_.size() << " series"; + + state_ = State_DicomFile; + break; + } + + case State_DicomFile: + { + assert(dicomDir_); + assert(message.GetResources()->GetSize() <= 1); // Could be zero if corrupted DICOM instance + + if (message.GetResources()->GetSize() == 1) + { + const Orthanc::DicomMap& instance = message.GetResources()->GetResource(0); + + std::string studyInstanceUid; + std::string seriesInstanceUid; + if (instance.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && + instance.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + Series::const_iterator series = series_.find(seriesInstanceUid); + std::map::const_iterator size = seriesSize_.find(seriesInstanceUid); + + if (series == series_.end() || + size == seriesSize_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + series->second->AddResource(instance); + + if (series->second->GetSize() > size->second) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else if (series->second->GetSize() == size->second) + { + // The series is complete + SuccessMessage loadedMessage( + *this, message.GetDicomSource(), + studyInstanceUid, seriesInstanceUid, *series->second); + loadedMessage.SetDicomDir(dicomDirPath_, dicomDir_); + BroadcastMessage(loadedMessage); + } + } + } + } + + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + SeriesMetadataLoader::SuccessMessage::SuccessMessage( + const SeriesMetadataLoader& loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + LoadedDicomResources& instances) : + OriginMessage(loader), + source_(source), + studyInstanceUid_(studyInstanceUid), + seriesInstanceUid_(seriesInstanceUid), + instances_(instances) + { + LOG(INFO) << "Loaded series " << seriesInstanceUid + << ", number of instances: " << instances_.GetSize(); + } + + + boost::shared_ptr SeriesMetadataLoader::Create(ILoadersContext::ILock& context) + { + boost::shared_ptr loader(DicomResourcesLoader::Create(context)); + + boost::shared_ptr obj(new SeriesMetadataLoader(loader)); + obj->Register(*loader, &SeriesMetadataLoader::Handle); + return obj; + } + + + SeriesMetadataLoader::Accessor::Accessor(SeriesMetadataLoader& that, + const std::string& seriesInstanceUid) + { + Series::const_iterator found = that.series_.find(seriesInstanceUid); + if (found != that.series_.end()) + { + assert(found->second != NULL); + series_ = found->second; + } + } + + + size_t SeriesMetadataLoader::Accessor::GetInstancesCount() const + { + if (IsComplete()) + { + return series_->GetSize(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Orthanc::DicomMap& SeriesMetadataLoader::Accessor::GetInstance(size_t index) const + { + if (IsComplete()) + { + return series_->GetResource(index); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void SeriesMetadataLoader::ScheduleLoadSeries(int priority, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) + { + if (state_ != State_Setup && + state_ != State_Default) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "The loader is working in DICOMDIR state"); + } + + state_ = State_Default; + + // Only re-schedule the loading if the previous loading was with lower priority + if (!IsScheduledWithHigherPriority(seriesInstanceUid, priority)) + { + if (source.IsDicomWeb()) + { + boost::shared_ptr target + (new LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); + loader_->ScheduleGetDicomWeb( + target, priority, source, + "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/metadata", + NULL /* TODO PAYLOAD */); + + scheduled_[seriesInstanceUid] = priority; + } + else if (source.IsOrthanc()) + { + // This flavor of the method is only available with DICOMweb, as + // Orthanc requires the "PatientID" to be known + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "The PatientID must be provided on Orthanc sources"); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + + void SeriesMetadataLoader::ScheduleLoadSeries(int priority, + const DicomSource& source, + const std::string& patientId, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) + { + if (state_ != State_Setup && + state_ != State_Default) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "The loader is working in DICOMDIR state"); + } + + state_ = State_Default; + + if (source.IsDicomWeb()) + { + ScheduleLoadSeries(priority, source, studyInstanceUid, seriesInstanceUid); + } + else if (!IsScheduledWithHigherPriority(seriesInstanceUid, priority)) + { + if (source.IsOrthanc()) + { + // Dummy SOP Instance UID, as we are working at the "series" level + Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, "dummy"); + + boost::shared_ptr target + (new LoadedDicomResources(Orthanc::DICOM_TAG_SOP_INSTANCE_UID)); + + loader_->ScheduleLoadOrthancResources(target, priority, source, Orthanc::ResourceType_Series, + hasher.HashSeries(), Orthanc::ResourceType_Instance, + NULL /* TODO PAYLOAD */); + + scheduled_[seriesInstanceUid] = priority; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + + void SeriesMetadataLoader::ScheduleLoadDicomDir(int priority, + const DicomSource& source, + const std::string& path) + { + if (!source.IsDicomDir()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + if (state_ != State_Setup) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "The loader cannot load two different DICOMDIR"); + } + + state_ = State_DicomDir; + dicomDirPath_ = path; + boost::shared_ptr dicomDir + (new LoadedDicomResources(Orthanc::DICOM_TAG_REFERENCED_SOP_INSTANCE_UID_IN_FILE)); + loader_->ScheduleLoadDicomDir(dicomDir, priority, source, path, + NULL /* TODO PAYLOAD */); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesMetadataLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesMetadataLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,176 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "DicomResourcesLoader.h" + +namespace OrthancStone +{ + class SeriesMetadataLoader : + public ObserverBase, + public IObservable + { + private: + enum State + { + State_Setup, + State_Default, + State_DicomDir, + State_DicomFile + }; + + typedef std::map > Series; + + boost::shared_ptr loader_; + State state_; + std::map scheduled_; // Maps a "SeriesInstanceUID" to a priority + Series series_; + boost::shared_ptr dicomDir_; + std::string dicomDirPath_; + std::map seriesSize_; + + SeriesMetadataLoader(boost::shared_ptr& loader); + + bool IsScheduledWithHigherPriority(const std::string& seriesInstanceUid, + int priority) const; + + void Handle(const DicomResourcesLoader::SuccessMessage& message); + + public: + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const DicomSource& source_; + const std::string& studyInstanceUid_; + const std::string& seriesInstanceUid_; + LoadedDicomResources& instances_; + std::string dicomDirPath_; + boost::shared_ptr dicomDir_; + + public: + SuccessMessage(const SeriesMetadataLoader& loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + LoadedDicomResources& instances); + + const DicomSource& GetDicomSource() const + { + return source_; + } + + const std::string& GetStudyInstanceUid() const + { + return studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return seriesInstanceUid_; + } + + size_t GetInstancesCount() const + { + return instances_.GetSize(); + } + + const Orthanc::DicomMap& GetInstance(size_t index) const + { + return instances_.GetResource(index); + } + + LoadedDicomResources& GetInstances() const + { + return instances_; + } + + void SetDicomDir(const std::string& dicomDirPath, + boost::shared_ptr dicomDir) + { + dicomDirPath_ = dicomDirPath; + dicomDir_ = dicomDir; + } + + const std::string& GetDicomDirPath() const + { + return dicomDirPath_; + } + + // Will be NULL on non-DICOMDIR sources + boost::shared_ptr GetDicomDir() const + { + return dicomDir_; + } + }; + + + class Factory : public ILoaderFactory + { + public: + virtual boost::shared_ptr Create(ILoadersContext::ILock& context) + { + return SeriesMetadataLoader::Create(context); + } + }; + + + static boost::shared_ptr Create(ILoadersContext::ILock& context); + + + class Accessor : public boost::noncopyable + { + private: + boost::shared_ptr series_; + + public: + Accessor(SeriesMetadataLoader& that, + const std::string& seriesInstanceUid); + + bool IsComplete() const + { + return series_ != NULL; + } + + size_t GetInstancesCount() const; + + const Orthanc::DicomMap& GetInstance(size_t index) const; + }; + + + void ScheduleLoadSeries(int priority, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid); + + void ScheduleLoadSeries(int priority, + const DicomSource& source, + const std::string& patientId, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid); + + void ScheduleLoadDicomDir(int priority, + const DicomSource& source, + const std::string& path); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesOrderedFrames.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesOrderedFrames.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,345 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "../Toolbox/SlicesSorter.h" +#include "SeriesOrderedFrames.h" + +#include + +namespace OrthancStone +{ + class SeriesOrderedFrames::Instance : public boost::noncopyable + { + private: + std::unique_ptr dicom_; + DicomInstanceParameters parameters_; + + public: + Instance(const Orthanc::DicomMap& dicom) : + dicom_(dicom.Clone()), + parameters_(dicom) + { + } + + const Orthanc::DicomMap& GetInstance() const + { + return *dicom_; + } + + const DicomInstanceParameters& GetInstanceParameters() const + { + return parameters_; + } + + bool Lookup3DGeometry(CoordinateSystem3D& target) const + { + try + { + std::string imagePositionPatient, imageOrientationPatient; + if (dicom_->LookupStringValue(imagePositionPatient, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && + dicom_->LookupStringValue(imageOrientationPatient, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) + { + target = CoordinateSystem3D(imagePositionPatient, imageOrientationPatient); + return true; + } + } + catch (Orthanc::OrthancException&) + { + } + + return false; + } + + bool LookupIndexInSeries(int& target) const + { + std::string value; + + if (dicom_->LookupStringValue(value, Orthanc::DICOM_TAG_INSTANCE_NUMBER, false) || + dicom_->LookupStringValue(value, Orthanc::DICOM_TAG_IMAGE_INDEX, false)) + { + try + { + target = boost::lexical_cast(value); + return true; + } + catch (boost::bad_lexical_cast&) + { + } + } + + return false; + } + }; + + + class SeriesOrderedFrames::Frame : public boost::noncopyable + { + private: + const Instance* instance_; + unsigned int frameIndex_; + + public: + Frame(const Instance& instance, + unsigned int frameIndex) : + instance_(&instance), + frameIndex_(frameIndex) + { + if (frameIndex_ >= instance.GetInstanceParameters().GetImageInformation().GetNumberOfFrames()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + const Orthanc::DicomMap& GetInstance() const + { + assert(instance_ != NULL); + return instance_->GetInstance(); + } + + const DicomInstanceParameters& GetInstanceParameters() const + { + assert(instance_ != NULL); + return instance_->GetInstanceParameters(); + } + + unsigned int GetFrameIndex() const + { + return frameIndex_; + } + }; + + + class SeriesOrderedFrames::InstanceWithIndexInSeries + { + private: + const Instance* instance_; // Don't use a reference to make "std::sort()" happy + int index_; + + public: + InstanceWithIndexInSeries(const Instance& instance) : + instance_(&instance) + { + if (!instance_->LookupIndexInSeries(index_)) + { + index_ = std::numeric_limits::max(); + } + } + + const Instance& GetInstance() const + { + return *instance_; + } + + int GetIndexInSeries() const + { + return index_; + } + + bool operator< (const InstanceWithIndexInSeries& other) const + { + return (index_ < other.index_); + } + }; + + + void SeriesOrderedFrames::Clear() + { + for (size_t i = 0; i < instances_.size(); i++) + { + assert(instances_[i] != NULL); + delete instances_[i]; + } + + for (size_t i = 0; i < orderedFrames_.size(); i++) + { + assert(orderedFrames_[i] != NULL); + delete orderedFrames_[i]; + } + + instances_.clear(); + orderedFrames_.clear(); + } + + + bool SeriesOrderedFrames::Sort3DVolume() + { + SlicesSorter sorter; + sorter.Reserve(instances_.size()); + + for (size_t i = 0; i < instances_.size(); i++) + { + CoordinateSystem3D geometry; + if (instances_[i]->Lookup3DGeometry(geometry)) + { + sorter.AddSlice(geometry, new Orthanc::SingleValueObject(instances_[i])); + } + else + { + return false; // Not a 3D volume + } + } + + if (!sorter.Sort() || + sorter.GetSlicesCount() != instances_.size() || + !sorter.AreAllSlicesDistinct()) + { + return false; + } + else + { + for (size_t i = 0; i < sorter.GetSlicesCount(); i++) + { + assert(sorter.HasSlicePayload(i)); + + const Orthanc::SingleValueObject& payload = + dynamic_cast&>(sorter.GetSlicePayload(i)); + + assert(payload.GetValue() != NULL); + + for (size_t j = 0; j < payload.GetValue()->GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); j++) + { + orderedFrames_.push_back(new Frame(*payload.GetValue(), + static_cast(j))); + } + } + + isRegular_ = sorter.ComputeSpacingBetweenSlices(spacingBetweenSlices_); + return true; + } + } + + + void SeriesOrderedFrames::SortIndexInSeries() + { + std::vector tmp; + tmp.reserve(instances_.size()); + + for (size_t i = 0; i < instances_.size(); i++) + { + assert(instances_[i] != NULL); + tmp.push_back(InstanceWithIndexInSeries(*instances_[i])); + } + + std::sort(tmp.begin(), tmp.end()); + + for (size_t i = 0; i < tmp.size(); i++) + { + for (size_t j = 0; j < tmp[i].GetInstance().GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); j++) + { + orderedFrames_.push_back(new Frame(tmp[i].GetInstance(), + static_cast(j))); + } + } + } + + + const SeriesOrderedFrames::Frame& SeriesOrderedFrames::GetFrame(size_t seriesIndex) const + { + if (seriesIndex >= orderedFrames_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(orderedFrames_[seriesIndex] != NULL); + return *(orderedFrames_[seriesIndex]); + } + } + + + SeriesOrderedFrames::SeriesOrderedFrames(LoadedDicomResources& instances) : + isVolume_(false), + isRegular_(false), + spacingBetweenSlices_(0) + { + instances_.reserve(instances.GetSize()); + + size_t numberOfFrames = 0; + + for (size_t i = 0; i < instances.GetSize(); i++) + { + try + { + std::unique_ptr instance(new Instance(instances.GetResource(i))); + numberOfFrames += instance->GetInstanceParameters().GetImageInformation().GetNumberOfFrames(); + instances_.push_back(instance.release()); + } + catch (Orthanc::OrthancException&) + { + // The instance has not all the required DICOM tags, skip it + } + } + + orderedFrames_.reserve(numberOfFrames); + + if (Sort3DVolume()) + { + isVolume_ = true; + + if (isRegular_) + { + LOG(INFO) << "Regular 3D volume detected"; + } + else + { + LOG(INFO) << "Non-regular 3D volume detected"; + } + } + else + { + LOG(INFO) << "Series is not a 3D volume, sorting by index"; + SortIndexInSeries(); + } + + LOG(INFO) << "Number of frames: " << orderedFrames_.size(); + } + + + unsigned int SeriesOrderedFrames::GetFrameIndex(size_t seriesIndex) const + { + return GetFrame(seriesIndex).GetFrameIndex(); + } + + + const Orthanc::DicomMap& SeriesOrderedFrames::GetInstance(size_t seriesIndex) const + { + return GetFrame(seriesIndex).GetInstance(); + } + + + const DicomInstanceParameters& SeriesOrderedFrames::GetInstanceParameters(size_t seriesIndex) const + { + return GetFrame(seriesIndex).GetInstanceParameters(); + } + + + double SeriesOrderedFrames::GetSpacingBetweenSlices() const + { + if (IsRegular3DVolume()) + { + return spacingBetweenSlices_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesOrderedFrames.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesOrderedFrames.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,85 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "LoadedDicomResources.h" + +#include "../Toolbox/DicomInstanceParameters.h" + +namespace OrthancStone +{ + class SeriesOrderedFrames : public boost::noncopyable + { + private: + class Instance; + class Frame; + class InstanceWithIndexInSeries; + + std::vector instances_; + std::vector orderedFrames_; + bool isVolume_; + bool isRegular_; + double spacingBetweenSlices_; + + void Clear(); + + bool Sort3DVolume(); + + void SortIndexInSeries(); + + const Frame& GetFrame(size_t seriesIndex) const; + + public: + SeriesOrderedFrames(LoadedDicomResources& instances); + + ~SeriesOrderedFrames() + { + Clear(); + } + + size_t GetFramesCount() const + { + return orderedFrames_.size(); + } + + unsigned int GetFrameIndex(size_t seriesIndex) const; + + const Orthanc::DicomMap& GetInstance(size_t seriesIndex) const; + + const DicomInstanceParameters& GetInstanceParameters(size_t seriesIndex) const; + + // Are all frames parallel and aligned? + bool Is3DVolume() const + { + return isVolume_; + } + + // Are all frames parallel, aligned and evenly spaced? + bool IsRegular3DVolume() const + { + return isRegular_; + } + + // Only available on regular 3D volumes + double GetSpacingBetweenSlices() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesThumbnailsLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesThumbnailsLoader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,773 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SeriesThumbnailsLoader.h" + +#include "LoadedDicomResources.h" +#include "../Oracle/ParseDicomFromWadoCommand.h" +#include "../Toolbox/ImageToolbox.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#if ORTHANC_ENABLE_DCMTK == 1 +# include +# include +#endif + + +static const unsigned int JPEG_QUALITY = 70; // Only used for Orthanc source + +namespace OrthancStone +{ + static SeriesThumbnailType ExtractSopClassUid(const std::string& sopClassUid) + { + if (sopClassUid == "1.2.840.10008.5.1.4.1.1.104.1") // Encapsulated PDF Storage + { + return SeriesThumbnailType_Pdf; + } + else if (sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.1.1" || // Video Endoscopic Image Storage + sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.2.1" || // Video Microscopic Image Storage + sopClassUid == "1.2.840.10008.5.1.4.1.1.77.1.4.1") // Video Photographic Image Storage + { + return SeriesThumbnailType_Video; + } + else + { + return SeriesThumbnailType_Unsupported; + } + } + + + SeriesThumbnailsLoader::Thumbnail::Thumbnail(const std::string& image, + const std::string& mime) : + type_(SeriesThumbnailType_Image), + image_(image), + mime_(mime) + { + } + + + SeriesThumbnailsLoader::Thumbnail::Thumbnail(SeriesThumbnailType type) : + type_(type) + { + if (type == SeriesThumbnailType_Image) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + Orthanc::ImageAccessor* SeriesThumbnailsLoader::SuccessMessage::DecodeImage() const + { + if (GetType() != SeriesThumbnailType_Image) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + Orthanc::MimeType mime; + if (!Orthanc::LookupMimeType(mime, GetMime())) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "Unsupported MIME type for thumbnail: " + GetMime()); + } + + switch (mime) + { + case Orthanc::MimeType_Jpeg: + { + std::unique_ptr reader(new Orthanc::JpegReader); + reader->ReadFromMemory(GetEncodedImage()); + return reader.release(); + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "Cannot decode MIME type for thumbnail: " + GetMime()); + } + } + + + + void SeriesThumbnailsLoader::AcquireThumbnail(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + SeriesThumbnailsLoader::Thumbnail* thumbnail) + { + assert(thumbnail != NULL); + + std::unique_ptr protection(thumbnail); + + Thumbnails::iterator found = thumbnails_.find(seriesInstanceUid); + if (found == thumbnails_.end()) + { + thumbnails_[seriesInstanceUid] = protection.release(); + } + else + { + assert(found->second != NULL); + if (protection->GetType() == SeriesThumbnailType_NotLoaded || + protection->GetType() == SeriesThumbnailType_Unsupported) + { + // Don't replace an old entry if the current one is worse + return; + } + else + { + delete found->second; + found->second = protection.release(); + } + } + + LOG(INFO) << "Thumbnail updated for series: " << seriesInstanceUid << ": " << thumbnail->GetType(); + + SuccessMessage message(*this, source, studyInstanceUid, seriesInstanceUid, *thumbnail); + BroadcastMessage(message); + } + + + class SeriesThumbnailsLoader::Handler : public Orthanc::IDynamicObject + { + private: + boost::shared_ptr loader_; + DicomSource source_; + std::string studyInstanceUid_; + std::string seriesInstanceUid_; + + public: + Handler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + loader_(loader), + source_(source), + studyInstanceUid_(studyInstanceUid), + seriesInstanceUid_(seriesInstanceUid) + { + if (!loader) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + boost::shared_ptr GetLoader() + { + return loader_; + } + + const DicomSource& GetSource() const + { + return source_; + } + + const std::string& GetStudyInstanceUid() const + { + return studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return seriesInstanceUid_; + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) = 0; + + virtual void HandleError() + { + LOG(INFO) << "Cannot generate thumbnail for SeriesInstanceUID: " << seriesInstanceUid_; + } + }; + + + class SeriesThumbnailsLoader::DicomWebSopClassHandler : public SeriesThumbnailsLoader::Handler + { + private: + static bool GetSopClassUid(std::string& sopClassUid, + const Json::Value& json) + { + Orthanc::DicomMap dicom; + dicom.FromDicomWeb(json); + + return dicom.LookupStringValue(sopClassUid, Orthanc::DICOM_TAG_SOP_CLASS_UID, false); + } + + public: + DicomWebSopClassHandler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + Handler(loader, source, studyInstanceUid, seriesInstanceUid) + { + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) + { + Json::Reader reader; + Json::Value value; + + if (!reader.parse(body, value) || + value.type() != Json::arrayValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + else + { + SeriesThumbnailType type = SeriesThumbnailType_Unsupported; + + std::string sopClassUid; + if (value.size() > 0 && + GetSopClassUid(sopClassUid, value[0])) + { + bool ok = true; + + for (Json::Value::ArrayIndex i = 1; i < value.size() && ok; i++) + { + std::string s; + if (!GetSopClassUid(s, value[i]) || + s != sopClassUid) + { + ok = false; + } + } + + if (ok) + { + type = ExtractSopClassUid(sopClassUid); + } + } + + GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), + GetSeriesInstanceUid(), new Thumbnail(type)); + } + } + }; + + + class SeriesThumbnailsLoader::DicomWebThumbnailHandler : public SeriesThumbnailsLoader::Handler + { + public: + DicomWebThumbnailHandler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + Handler(loader, source, studyInstanceUid, seriesInstanceUid) + { + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) + { + std::string mime = Orthanc::MIME_JPEG; + for (std::map::const_iterator + it = headers.begin(); it != headers.end(); ++it) + { + if (boost::iequals(it->first, "content-type")) + { + mime = it->second; + } + } + + GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), + GetSeriesInstanceUid(), new Thumbnail(body, mime)); + } + + virtual void HandleError() + { + // The DICOMweb wasn't able to generate a thumbnail, try to + // retrieve the SopClassUID tag using QIDO-RS + + std::map arguments, headers; + arguments["0020000D"] = GetStudyInstanceUid(); + arguments["0020000E"] = GetSeriesInstanceUid(); + arguments["includefield"] = "00080016"; // SOP Class UID + + std::unique_ptr command( + GetSource().CreateDicomWebCommand( + "/instances", arguments, headers, new DicomWebSopClassHandler( + GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid()))); + GetLoader()->Schedule(command.release()); + } + }; + + + class SeriesThumbnailsLoader::ThumbnailInformation : public Orthanc::IDynamicObject + { + private: + DicomSource source_; + std::string studyInstanceUid_; + std::string seriesInstanceUid_; + + public: + ThumbnailInformation(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + source_(source), + studyInstanceUid_(studyInstanceUid), + seriesInstanceUid_(seriesInstanceUid) + { + } + + const DicomSource& GetDicomSource() const + { + return source_; + } + + const std::string& GetStudyInstanceUid() const + { + return studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return seriesInstanceUid_; + } + }; + + + class SeriesThumbnailsLoader::OrthancSopClassHandler : public SeriesThumbnailsLoader::Handler + { + private: + std::string instanceId_; + + public: + OrthancSopClassHandler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const std::string& instanceId) : + Handler(loader, source, studyInstanceUid, seriesInstanceUid), + instanceId_(instanceId) + { + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) + { + SeriesThumbnailType type = ExtractSopClassUid(body); + + if (type == SeriesThumbnailType_Pdf || + type == SeriesThumbnailType_Video) + { + GetLoader()->AcquireThumbnail(GetSource(), GetStudyInstanceUid(), + GetSeriesInstanceUid(), new Thumbnail(type)); + } + else + { + std::unique_ptr command(new GetOrthancImageCommand); + command->SetUri("/instances/" + instanceId_ + "/preview"); + command->SetHttpHeader("Accept", Orthanc::MIME_JPEG); + command->AcquirePayload(new ThumbnailInformation( + GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid())); + GetLoader()->Schedule(command.release()); + } + } + }; + + + class SeriesThumbnailsLoader::SelectOrthancInstanceHandler : public SeriesThumbnailsLoader::Handler + { + public: + SelectOrthancInstanceHandler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + Handler(loader, source, studyInstanceUid, seriesInstanceUid) + { + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) + { + static const char* const INSTANCES = "Instances"; + + Json::Value json; + Json::Reader reader; + if (!reader.parse(body, json) || + json.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + if (json.isMember(INSTANCES) && + json[INSTANCES].type() == Json::arrayValue && + json[INSTANCES].size() > 0) + { + // Select one instance of the series to generate the thumbnail + Json::Value::ArrayIndex index = json[INSTANCES].size() / 2; + if (json[INSTANCES][index].type() == Json::stringValue) + { + std::map arguments, headers; + arguments["quality"] = boost::lexical_cast(JPEG_QUALITY); + headers["Accept"] = Orthanc::MIME_JPEG; + + const std::string instance = json[INSTANCES][index].asString(); + + std::unique_ptr command(new OrthancRestApiCommand); + command->SetUri("/instances/" + instance + "/metadata/SopClassUid"); + command->AcquirePayload( + new OrthancSopClassHandler( + GetLoader(), GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid(), instance)); + GetLoader()->Schedule(command.release()); + } + } + } + }; + + +#if ORTHANC_ENABLE_DCMTK == 1 + class SeriesThumbnailsLoader::SelectDicomWebInstanceHandler : public SeriesThumbnailsLoader::Handler + { + public: + SelectDicomWebInstanceHandler(boost::shared_ptr loader, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) : + Handler(loader, source, studyInstanceUid, seriesInstanceUid) + { + } + + virtual void HandleSuccess(const std::string& body, + const std::map& headers) + { + Json::Value json; + Json::Reader reader; + if (!reader.parse(body, json) || + json.type() != Json::arrayValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); + } + + LoadedDicomResources instances(Orthanc::DICOM_TAG_SOP_INSTANCE_UID); + instances.AddFromDicomWeb(json); + + std::string sopInstanceUid; + if (instances.GetSize() == 0 || + !instances.GetResource(0).LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + LOG(ERROR) << "Series without an instance: " << GetSeriesInstanceUid(); + } + else + { + GetLoader()->Schedule( + ParseDicomFromWadoCommand::Create( + GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid(), sopInstanceUid, false, + Orthanc::DicomTransferSyntax_LittleEndianExplicit /* useless, as no transcoding */, + new ThumbnailInformation( + GetSource(), GetStudyInstanceUid(), GetSeriesInstanceUid()))); + } + } + }; +#endif + + + void SeriesThumbnailsLoader::Schedule(IOracleCommand* command) + { + std::unique_ptr lock(context_.Lock()); + lock->Schedule(GetSharedObserver(), priority_, command); + } + + + void SeriesThumbnailsLoader::Handle(const HttpCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + dynamic_cast(message.GetOrigin().GetPayload()).HandleSuccess(message.GetAnswer(), message.GetAnswerHeaders()); + } + + + void SeriesThumbnailsLoader::Handle(const OrthancRestApiCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + dynamic_cast(message.GetOrigin().GetPayload()).HandleSuccess(message.GetAnswer(), message.GetAnswerHeaders()); + } + + + void SeriesThumbnailsLoader::Handle(const GetOrthancImageCommand::SuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ThumbnailInformation& info = dynamic_cast(message.GetOrigin().GetPayload()); + + std::unique_ptr resized(Orthanc::ImageProcessing::FitSize(message.GetImage(), width_, height_)); + + std::string jpeg; + Orthanc::JpegWriter writer; + writer.SetQuality(JPEG_QUALITY); + writer.WriteToMemory(jpeg, *resized); + + AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), + info.GetSeriesInstanceUid(), new Thumbnail(jpeg, Orthanc::MIME_JPEG)); + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + void SeriesThumbnailsLoader::Handle(const ParseDicomSuccessMessage& message) + { + assert(message.GetOrigin().HasPayload()); + const ParseDicomFromWadoCommand& origin = + dynamic_cast(message.GetOrigin()); + const ThumbnailInformation& info = dynamic_cast(origin.GetPayload()); + + std::string tmp; + Orthanc::DicomTransferSyntax transferSyntax; + if (!message.GetDicom().LookupTransferSyntax(tmp)) + { + + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "DICOM instance without a transfer syntax: " + origin.GetSopInstanceUid()); + } + else if (!Orthanc::LookupTransferSyntax(transferSyntax, tmp) || + !ImageToolbox::IsDecodingSupported(transferSyntax)) + { + LOG(INFO) << "Asking the DICOMweb server to transcode, " + << "as I don't support this transfer syntax: " << tmp; + + Schedule(ParseDicomFromWadoCommand::Create( + origin.GetSource(), info.GetStudyInstanceUid(), info.GetSeriesInstanceUid(), + origin.GetSopInstanceUid(), true, Orthanc::DicomTransferSyntax_LittleEndianExplicit, + new ThumbnailInformation( + origin.GetSource(), info.GetStudyInstanceUid(), info.GetSeriesInstanceUid()))); + } + else + { + std::unique_ptr frame( + Orthanc::DicomImageDecoder::Decode(message.GetDicom(), 0)); + + std::unique_ptr thumbnail; + + if (frame->GetFormat() == Orthanc::PixelFormat_RGB24) + { + thumbnail.reset(Orthanc::ImageProcessing::FitSizeKeepAspectRatio(*frame, width_, height_)); + } + else + { + std::unique_ptr converted( + new Orthanc::Image(Orthanc::PixelFormat_Float32, frame->GetWidth(), frame->GetHeight(), false)); + Orthanc::ImageProcessing::Convert(*converted, *frame); + + std::unique_ptr resized( + Orthanc::ImageProcessing::FitSizeKeepAspectRatio(*converted, width_, height_)); + + float minValue, maxValue; + Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, *resized); + if (minValue + 0.01f < maxValue) + { + Orthanc::ImageProcessing::ShiftScale(*resized, -minValue, 255.0f / (maxValue - minValue), false); + } + else + { + Orthanc::ImageProcessing::Set(*resized, 0); + } + + converted.reset(NULL); + + thumbnail.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale8, width_, height_, false)); + Orthanc::ImageProcessing::Convert(*thumbnail, *resized); + } + + std::string jpeg; + Orthanc::JpegWriter writer; + writer.SetQuality(JPEG_QUALITY); + writer.WriteToMemory(jpeg, *thumbnail); + + AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), + info.GetSeriesInstanceUid(), new Thumbnail(jpeg, Orthanc::MIME_JPEG)); + } + } +#endif + + + void SeriesThumbnailsLoader::Handle(const OracleCommandExceptionMessage& message) + { + const OracleCommandBase& command = dynamic_cast(message.GetOrigin()); + assert(command.HasPayload()); + + if (command.GetType() == IOracleCommand::Type_GetOrthancImage) + { + // This is presumably a HTTP status 301 (Moved permanently) + // because of an unsupported DICOM file in "/preview" + const ThumbnailInformation& info = dynamic_cast(command.GetPayload()); + AcquireThumbnail(info.GetDicomSource(), info.GetStudyInstanceUid(), + info.GetSeriesInstanceUid(), new Thumbnail(SeriesThumbnailType_Unsupported)); + } + else + { + dynamic_cast(command.GetPayload()).HandleError(); + } + } + + + SeriesThumbnailsLoader::SeriesThumbnailsLoader(ILoadersContext& context, + int priority) : + context_(context), + priority_(priority), + width_(128), + height_(128) + { + } + + + boost::shared_ptr SeriesThumbnailsLoader::Create(ILoadersContext::ILock& stone, + int priority) + { + boost::shared_ptr result(new SeriesThumbnailsLoader(stone.GetContext(), priority)); + result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); + result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); + result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); + result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); + +#if ORTHANC_ENABLE_DCMTK == 1 + result->Register(stone.GetOracleObservable(), &SeriesThumbnailsLoader::Handle); +#endif + + return result; + } + + + void SeriesThumbnailsLoader::SetThumbnailSize(unsigned int width, + unsigned int height) + { + if (width <= 0 || + height <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + width_ = width; + height_ = height; + } + } + + + void SeriesThumbnailsLoader::Clear() + { + for (Thumbnails::iterator it = thumbnails_.begin(); it != thumbnails_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + + thumbnails_.clear(); + } + + + SeriesThumbnailType SeriesThumbnailsLoader::GetSeriesThumbnail(std::string& image, + std::string& mime, + const std::string& seriesInstanceUid) const + { + Thumbnails::const_iterator found = thumbnails_.find(seriesInstanceUid); + + if (found == thumbnails_.end()) + { + return SeriesThumbnailType_NotLoaded; + } + else + { + assert(found->second != NULL); + image.assign(found->second->GetImage()); + mime.assign(found->second->GetMime()); + return found->second->GetType(); + } + } + + + void SeriesThumbnailsLoader::ScheduleLoadThumbnail(const DicomSource& source, + const std::string& patientId, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid) + { + if (IsScheduledSeries(seriesInstanceUid)) + { + return; + } + + if (source.IsDicomWeb()) + { + if (!source.HasDicomWebRendered()) + { +#if ORTHANC_ENABLE_DCMTK == 1 + // Issue a QIDO-RS request to select one of the instances in the series + std::map arguments, headers; + arguments["0020000D"] = studyInstanceUid; + arguments["0020000E"] = seriesInstanceUid; + arguments["includefield"] = "00080018"; // SOP Instance UID is mandatory + + std::unique_ptr command( + source.CreateDicomWebCommand( + "/instances", arguments, headers, new SelectDicomWebInstanceHandler( + GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid))); + Schedule(command.release()); +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "Stone of Orthanc was built without support to decode DICOM images"); +#endif + } + else + { + const std::string uri = ("/studies/" + studyInstanceUid + + "/series/" + seriesInstanceUid + "/rendered"); + + std::map arguments, headers; + arguments["viewport"] = (boost::lexical_cast(width_) + "," + + boost::lexical_cast(height_)); + + // Needed to set this header explicitly, as long as emscripten + // does not include macro "EMSCRIPTEN_FETCH_RESPONSE_HEADERS" + // https://github.com/emscripten-core/emscripten/pull/8486 + headers["Accept"] = Orthanc::MIME_JPEG; + + std::unique_ptr command( + source.CreateDicomWebCommand( + uri, arguments, headers, new DicomWebThumbnailHandler( + GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid))); + Schedule(command.release()); + } + + scheduledSeries_.insert(seriesInstanceUid); + } + else if (source.IsOrthanc()) + { + // Dummy SOP Instance UID, as we are working at the "series" level + Orthanc::DicomInstanceHasher hasher(patientId, studyInstanceUid, seriesInstanceUid, "dummy"); + + std::unique_ptr command(new OrthancRestApiCommand); + command->SetUri("/series/" + hasher.HashSeries()); + command->AcquirePayload(new SelectOrthancInstanceHandler( + GetSharedObserver(), source, studyInstanceUid, seriesInstanceUid)); + Schedule(command.release()); + + scheduledSeries_.insert(seriesInstanceUid); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "Can only load thumbnails from Orthanc or DICOMweb"); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/SeriesThumbnailsLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/SeriesThumbnailsLoader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,240 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error Macro ORTHANC_ENABLE_DCMTK must be defined +#endif + + +#include "../Oracle/GetOrthancImageCommand.h" +#include "../Oracle/HttpCommand.h" +#include "../Oracle/OracleCommandExceptionMessage.h" +#include "../Oracle/OrthancRestApiCommand.h" +#include "DicomSource.h" +#include "ILoaderFactory.h" +#include "OracleScheduler.h" + + +namespace OrthancStone +{ + enum SeriesThumbnailType + { + SeriesThumbnailType_NotLoaded = 1, // The remote server cannot decode this image + SeriesThumbnailType_Unsupported = 2, // The remote server cannot decode this image + SeriesThumbnailType_Pdf = 3, + SeriesThumbnailType_Video = 4, + SeriesThumbnailType_Image = 5 + }; + + + class SeriesThumbnailsLoader : + public IObservable, + public ObserverBase + { + private: + class Thumbnail : public boost::noncopyable + { + private: + SeriesThumbnailType type_; + std::string image_; + std::string mime_; + + public: + Thumbnail(const std::string& image, + const std::string& mime); + + Thumbnail(SeriesThumbnailType type); + + SeriesThumbnailType GetType() const + { + return type_; + } + + const std::string& GetImage() const + { + return image_; + } + + const std::string& GetMime() const + { + return mime_; + } + }; + + public: + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const DicomSource& source_; + const std::string& studyInstanceUid_; + const std::string& seriesInstanceUid_; + const Thumbnail& thumbnail_; + + public: + SuccessMessage(const SeriesThumbnailsLoader& origin, + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const Thumbnail& thumbnail) : + OriginMessage(origin), + source_(source), + studyInstanceUid_(studyInstanceUid), + seriesInstanceUid_(seriesInstanceUid), + thumbnail_(thumbnail) + { + } + + const DicomSource& GetDicomSource() const + { + return source_; + } + + SeriesThumbnailType GetType() const + { + return thumbnail_.GetType(); + } + + const std::string& GetStudyInstanceUid() const + { + return studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return seriesInstanceUid_; + } + + const std::string& GetEncodedImage() const + { + return thumbnail_.GetImage(); + } + + const std::string& GetMime() const + { + return thumbnail_.GetMime(); + } + + Orthanc::ImageAccessor* DecodeImage() const; + }; + + private: + class Handler; + class DicomWebSopClassHandler; + class DicomWebThumbnailHandler; + class ThumbnailInformation; + class OrthancSopClassHandler; + class SelectOrthancInstanceHandler; + +#if ORTHANC_ENABLE_DCMTK == 1 + class SelectDicomWebInstanceHandler; +#endif + + // Maps a "Series Instance UID" to a thumbnail + typedef std::map Thumbnails; + + ILoadersContext& context_; + Thumbnails thumbnails_; + int priority_; + unsigned int width_; + unsigned int height_; + std::set scheduledSeries_; + + void AcquireThumbnail(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + Thumbnail* thumbnail /* takes ownership */); + + void Schedule(IOracleCommand* command); + + void Handle(const HttpCommand::SuccessMessage& message); + + void Handle(const OrthancRestApiCommand::SuccessMessage& message); + + void Handle(const GetOrthancImageCommand::SuccessMessage& message); + +#if ORTHANC_ENABLE_DCMTK == 1 + void Handle(const ParseDicomSuccessMessage& message); +#endif + + void Handle(const OracleCommandExceptionMessage& message); + + SeriesThumbnailsLoader(ILoadersContext& context, + int priority); + + public: + class Factory : public ILoaderFactory + { + private: + int priority_; + + public: + Factory() : + priority_(0) + { + } + + void SetPriority(int priority) + { + priority_ = priority; + } + + virtual boost::shared_ptr Create(ILoadersContext::ILock& context) + { + return SeriesThumbnailsLoader::Create(context, priority_); + } + }; + + + virtual ~SeriesThumbnailsLoader() + { + Clear(); + } + + + static boost::shared_ptr Create(ILoadersContext::ILock& context, + int priority); + + void SetThumbnailSize(unsigned int width, + unsigned int height); + + void Clear(); + + SeriesThumbnailType GetSeriesThumbnail(std::string& image, + std::string& mime, + const std::string& seriesInstanceUid) const; + + void ScheduleLoadThumbnail(const DicomSource& source, + const std::string& patientId, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid); + + bool IsScheduledSeries(const std::string& seriesInstanceUid) const + { + return scheduledSeries_.find(seriesInstanceUid) != scheduledSeries_.end(); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/WebAssemblyLoadersContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/WebAssemblyLoadersContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,97 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebAssemblyLoadersContext.h" + +namespace OrthancStone +{ + class WebAssemblyLoadersContext::Locker : public ILoadersContext::ILock + { + private: + WebAssemblyLoadersContext& that_; + + public: + Locker(WebAssemblyLoadersContext& that) : + that_(that) + { + } + + virtual ILoadersContext& GetContext() const ORTHANC_OVERRIDE + { + return that_; + } + + virtual IObservable& GetOracleObservable() const ORTHANC_OVERRIDE + { + return that_.oracle_.GetOracleObservable(); + } + + virtual void Schedule(boost::shared_ptr receiver, + int priority, + IOracleCommand* command /* Takes ownership */) ORTHANC_OVERRIDE + { + that_.scheduler_->Schedule(receiver, priority, command); + } + + virtual void CancelRequests(boost::shared_ptr receiver) ORTHANC_OVERRIDE + { + that_.scheduler_->CancelRequests(receiver); + } + + virtual void CancelAllRequests() ORTHANC_OVERRIDE + { + that_.scheduler_->CancelAllRequests(); + } + + virtual void AddLoader(boost::shared_ptr loader) ORTHANC_OVERRIDE + { + that_.loaders_.push_back(loader); + } + + virtual void GetStatistics(uint64_t& scheduledCommands, + uint64_t& processedCommands) ORTHANC_OVERRIDE + { + scheduledCommands = that_.scheduler_->GetTotalScheduled(); + processedCommands = that_.scheduler_->GetTotalProcessed(); + } + }; + + + WebAssemblyLoadersContext::WebAssemblyLoadersContext(unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority) + { + oracle_.GetOracleObservable(); + scheduler_ = OracleScheduler::Create(oracle_, oracle_.GetOracleObservable(), oracle_, + maxHighPriority, maxStandardPriority, maxLowPriority); + + if (!scheduler_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + ILoadersContext::ILock* WebAssemblyLoadersContext::Lock() + { + return new Locker(*this); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Loaders/WebAssemblyLoadersContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Loaders/WebAssemblyLoadersContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILoadersContext.h" +#include "../Oracle/WebAssemblyOracle.h" +#include "OracleScheduler.h" + +#include + +namespace OrthancStone +{ + class WebAssemblyLoadersContext : public ILoadersContext + { + private: + class Locker; + + WebAssemblyOracle oracle_; + boost::shared_ptr scheduler_; + std::list< boost::shared_ptr > loaders_; + + public: + WebAssemblyLoadersContext(unsigned int maxHighPriority, + unsigned int maxStandardPriority, + unsigned int maxLowPriority); + + void SetLocalOrthanc(const std::string& root) + { + oracle_.SetLocalOrthanc(root); + } + + void SetRemoteOrthanc(const Orthanc::WebServiceParameters& orthanc) + { + oracle_.SetRemoteOrthanc(orthanc); + } + + void SetDicomCacheSize(size_t size) + { + oracle_.SetDicomCacheSize(size); + } + + virtual ILock* Lock() ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/ICallable.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/ICallable.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,95 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IMessage.h" +#include "IObserver.h" + +#include + +#include +#include + +#include +#include + +namespace OrthancStone +{ + // This is referencing an object and member function that can be notified + // by an IObservable. The object must derive from IO + // The member functions must be of type "void Method(const IMessage& message)" or reference a derived class of IMessage + class ICallable : public boost::noncopyable + { + public: + virtual ~ICallable() + { + } + + virtual void Apply(const IMessage& message) = 0; + + virtual const MessageIdentifier& GetMessageIdentifier() = 0; + + // TODO - Is this needed? + virtual boost::weak_ptr GetObserver() const = 0; + }; + + + template + class Callable : public ICallable + { + private: + typedef void (TObserver::* MemberMethod) (const TMessage&); + + boost::weak_ptr observer_; + MemberMethod function_; + + public: + Callable(boost::shared_ptr observer, + MemberMethod function) : + observer_(observer), + function_(function) + { + } + + virtual void Apply(const IMessage& message) + { + boost::shared_ptr lock(observer_); + if (lock) + { + TObserver& observer = dynamic_cast(*lock); + const TMessage& typedMessage = dynamic_cast(message); + (observer.*function_) (typedMessage); + } + } + + virtual const MessageIdentifier& GetMessageIdentifier() + { + return TMessage::GetStaticIdentifier(); + } + + virtual boost::weak_ptr GetObserver() const + { + return observer_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/IMessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/IMessage.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,161 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +#include + +namespace OrthancStone +{ + class MessageIdentifier + { + private: + const char* file_; + int line_; + + bool IsEqual(const MessageIdentifier& other) const + { + return (line_ == other.line_ && + strcmp(file_, other.file_) == 0); + } + + public: + MessageIdentifier(const char* file, + int line) : + file_(file), + line_(line) + { + } + + MessageIdentifier() : + file_(NULL), + line_(0) + { + } + + std::string AsString() const + { + return std::string(file_) + ":" + boost::lexical_cast(line_); + } + + bool operator< (const MessageIdentifier& other) const + { + if (file_ == NULL) + { + return false; + } + else if (line_ != other.line_) + { + return line_ < other.line_; + } + else + { + return strcmp(file_, other.file_) < 0; + } + } + + bool operator== (const MessageIdentifier& other) const + { + return IsEqual(other); + } + + bool operator!= (const MessageIdentifier& other) const + { + return !IsEqual(other); + } + }; + + + /** + * Base messages that are exchanged between IObservable and + * IObserver. Messages are distinguished by the "__FILE__" and + * "__LINE__" macro, as in "Orthanc::SQLite::StatementId". + **/ + class IMessage : public boost::noncopyable + { + public: + virtual ~IMessage() + { + } + + virtual const MessageIdentifier& GetIdentifier() const = 0; + }; + + + /** + * Simple message implementation when no payload is needed but the + * origin is required. Sample usage: + * typedef OriginMessage SliceGeometryErrorMessage; + **/ + template + class OriginMessage : public IMessage + { + private: + const TOrigin& origin_; + + public: + OriginMessage(const TOrigin& origin) : + origin_(origin) + { + } + + const TOrigin& GetOrigin() const + { + return origin_; + } + }; +} + + +#define ORTHANC_STONE_MESSAGE(FILE, LINE) \ + public: \ + static const ::OrthancStone::MessageIdentifier& GetStaticIdentifier() \ + { \ + static const ::OrthancStone::MessageIdentifier id(FILE, LINE); \ + return id; \ + } \ + \ + virtual const ::OrthancStone::MessageIdentifier& GetIdentifier() const \ + { \ + return GetStaticIdentifier(); \ + } + + +#define ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(FILE, LINE, NAME, ORIGIN) \ + class NAME : public ::OrthancStone::OriginMessage \ + { \ + ORTHANC_STONE_MESSAGE(FILE, LINE); \ + \ + NAME(const ORIGIN& origin) : \ + OriginMessage(origin) \ + { \ + } \ + }; + + +#define ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(FILE, LINE, NAME) \ + class NAME : public ::OrthancStone::IMessage \ + { \ + ORTHANC_STONE_MESSAGE(FILE, LINE); \ + }; diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/IMessageEmitter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/IMessageEmitter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,47 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IObserver.h" +#include "IMessage.h" + +#include + +namespace OrthancStone +{ + /** + This class may be used to customize the way the messages are sent between + a source and a destination, for instance by the ThreadedOracle. + + See the concrete class LockingEmitter for an example of when it is useful. + */ + class IMessageEmitter : public boost::noncopyable + { + public: + virtual ~IMessageEmitter() + { + } + + virtual void EmitMessage(boost::weak_ptr observer, + const IMessage& message) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/IObservable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/IObservable.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,123 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "IObservable.h" + +#include "../StoneException.h" + +#include + +#include + +namespace OrthancStone +{ + IObservable::~IObservable() + { + // delete all callables (this will also unregister them from the broker) + for (Callables::const_iterator it = callables_.begin(); + it != callables_.end(); ++it) + { + for (std::set::const_iterator + it2 = it->second.begin(); it2 != it->second.end(); ++it2) + { + delete *it2; + } + } + } + + + void IObservable::RegisterCallable(ICallable* callable) + { + if (callable == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + const MessageIdentifier& id = callable->GetMessageIdentifier(); + callables_[id].insert(callable); + } + + void IObservable::EmitMessageInternal(const IObserver* receiver, + const IMessage& message) + { + //LOG(TRACE) << "IObservable::EmitMessageInternal receiver = " << std::hex << receiver << std::dec; + Callables::const_iterator found = callables_.find(message.GetIdentifier()); + + if (found != callables_.end()) + { + for (std::set::const_iterator + it = found->second.begin(); it != found->second.end(); ++it) + { + assert(*it != NULL); + + boost::shared_ptr observer((*it)->GetObserver().lock()); + + if (observer) + { + if (receiver == NULL || // Are we broadcasting? + observer.get() == receiver) // Not broadcasting, but this is the receiver + { + try + { + (*it)->Apply(message); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception on callable: " << e.What(); + } + catch (StoneException& e) + { + LOG(ERROR) << "Exception on callable: " << e.What(); + } + catch (...) + { + LOG(ERROR) << "Native exception on callable"; + } + } + } + else + { + // TODO => Remove "it" from the list of callables => This + // allows to suppress the need for "Unregister()" + } + } + } + } + + + void IObservable::BroadcastMessage(const IMessage& message) + { + EmitMessageInternal(NULL, message); + } + + + void IObservable::EmitMessage(boost::weak_ptr observer, + const IMessage& message) + { + //LOG(TRACE) << "IObservable::EmitMessage observer = " << std::hex << observer.get() << std::dec; + + boost::shared_ptr lock(observer.lock()); + if (lock) + { + EmitMessageInternal(lock.get(), message); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/IObservable.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/IObservable.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "ICallable.h" +#include "IObserver.h" + +#include +#include + +namespace OrthancStone +{ + class IObservable : public boost::noncopyable + { + private: + typedef std::map > Callables; + + Callables callables_; + + void EmitMessageInternal(const IObserver* receiver, + const IMessage& message); + + public: + virtual ~IObservable(); + + // Takes ownership of the callable + void RegisterCallable(ICallable* callable); + + void BroadcastMessage(const IMessage& message); + + void EmitMessage(boost::weak_ptr observer, + const IMessage& message); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/IObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/IObserver.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,41 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include + +namespace OrthancStone +{ + class IObserver : public boost::noncopyable + { + public: + IObserver() + { + } + + virtual ~IObserver() + { + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Messages/ObserverBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Messages/ObserverBase.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ICallable.h" +#include "IObserver.h" +#include "IObservable.h" + +#include + +#include + +namespace OrthancStone +{ + template + class ObserverBase : + public IObserver, + public boost::enable_shared_from_this + { + public: + boost::shared_ptr GetSharedObserver() + { + try + { + return this->shared_from_this(); + } + catch (boost::bad_weak_ptr&) + { + throw Orthanc::OrthancException( + Orthanc::ErrorCode_InternalError, + "Cannot get a shared pointer to an observer from its constructor, " + "or the observer is not created as a shared pointer"); + } + } + + template + ICallable* CreateCallable(void (TObserver::* MemberMethod) (const TMessage&)) + { + return new Callable(GetSharedObserver(), MemberMethod); + } + + template + void Register(IObservable& observable, + void (TObserver::* MemberMethod) (const TMessage&)) + { + observable.RegisterCallable(CreateCallable(MemberMethod)); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/IOpenGLContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/IOpenGLContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,53 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class IOpenGLContext : public boost::noncopyable + { + public: + virtual ~IOpenGLContext() + { + } + + virtual bool IsContextLost() = 0; + + virtual void MakeCurrent() = 0; + + virtual void SwapBuffer() = 0; + + virtual unsigned int GetCanvasWidth() const = 0; + + virtual unsigned int GetCanvasHeight() const = 0; + + // Getting the size of the canvas can be expensive, especially + // in WebAssembly => avoid calling this method too often + // (e.g. on each refresh) + virtual void RefreshCanvasSize() = 0; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLIncludes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLIncludes.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,116 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_OPENGL) +# error The macro ORTHANC_ENABLE_OPENGL must be defined +#endif + +#if ORTHANC_ENABLE_OPENGL != 1 +# error Support for OpenGL is disabled +#endif + +#if defined(__APPLE__) +# include +# include +#elif defined(QT_VERSION_MAJOR) && (QT_VERSION >= 5) +// Qt5 takes care of the inclusions +#elif defined(_WIN32) +// On Windows, use the compatibility headers provided by glew +# include +#else +# include +# include +#endif + +#if ORTHANC_ENABLE_SDL == 1 +# include + +# ifdef NDEBUG + +// glGetError is very expensive! + +# define ORTHANC_OPENGL_CHECK(name) +# define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) + +# else + +# define ORTHANC_OPENGL_CHECK(name) \ +if(true) \ +{ \ + GLenum error = glGetError(); \ + if (error != GL_NO_ERROR) { \ + SDL_GLContext ctx = SDL_GL_GetCurrentContext(); \ + LOG(ERROR) << "Error when calling " << name << " | current context is: 0x" << std::hex << ctx << " | error code is " << error; \ + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,"OpenGL error in " name " | See log."); \ + } \ +} else (void)0 + +# define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) \ +if(true) \ +{ \ + SDL_GLContext ctx = SDL_GL_GetCurrentContext(); \ + LOG(TRACE) << msg << " | Current OpenGL context is " << std::hex << ctx; \ +} else (void)0 + +# endif + +#endif + +#if ORTHANC_ENABLE_WASM == 1 +#include + +#define ORTHANC_OPENGL_CHECK(name) \ +if(true) \ +{ \ + GLenum error = glGetError(); \ + if (error != GL_NO_ERROR) { \ + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ + EM_BOOL lost = emscripten_is_webgl_context_lost(ctx); \ + LOG(ERROR) << "Error when calling " << name << " | current context is: 0x" << std::hex << ctx << " | error code is " << error << " | emscripten_is_webgl_context_lost = " << lost; \ + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,"OpenGL error in " name " | See log."); \ + } \ +} else (void)0 + +#define ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT(msg) \ +if(true) \ +{ \ + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ + LOG(TRACE) << msg << " | Current OpenGL context is " << std::hex << ctx; \ +} else (void)0 + +#define ORTHANC_CHECK_CURRENT_CONTEXT(context) \ +if(true) \ +{ \ + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_get_current_context(); \ + void* actualCtx = reinterpret_cast(ctx); \ + void* expectedCtx = context.DebugGetInternalContext(); \ + if(expectedCtx != actualCtx) \ + { \ + LOG(ERROR) << "Expected context was " << std::hex << expectedCtx << " while actual context is " << std::hex << actualCtx; \ + } \ +} else (void)0 + +#endif + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLProgram.h" + +#include "OpenGLShader.h" +#include "IOpenGLContext.h" + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + OpenGLProgram::OpenGLProgram(OpenGL::IOpenGLContext& context) + : context_(context) + { + program_ = glCreateProgram(); + ORTHANC_OPENGL_CHECK("glCreateProgram"); + if (program_ == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot create an OpenGL program"); + } + } + + + OpenGLProgram::~OpenGLProgram() + { + try + { + if (!context_.IsContextLost()) + { + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteProgram"); + assert(program_ != 0); + glDeleteProgram(program_); + ORTHANC_OPENGL_CHECK("glDeleteProgram"); + } + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in ~OpenGLProgram: " << e.What(); + } + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in ~OpenGLProgram: " << e.what(); + } + catch (...) + { + LOG(ERROR) << "Unknown exception in ~OpenGLProgram"; + } + } + + void OpenGLProgram::Use() + { + //ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glUseProgram"); + glUseProgram(program_); + ORTHANC_OPENGL_CHECK("glUseProgram"); + } + + void OpenGLProgram::CompileShaders(const std::string& vertexCode, + const std::string& fragmentCode) + { + assert(program_ != 0); + + OpenGLShader vertexShader(GL_VERTEX_SHADER, vertexCode); + OpenGLShader fragmentShader(GL_FRAGMENT_SHADER, fragmentCode); + + glAttachShader(program_, vertexShader.Release()); + ORTHANC_OPENGL_CHECK("glAttachShader"); + glAttachShader(program_, fragmentShader.Release()); + ORTHANC_OPENGL_CHECK("glAttachShader"); + glLinkProgram(program_); + ORTHANC_OPENGL_CHECK("glLinkProgram"); + glValidateProgram(program_); + ORTHANC_OPENGL_CHECK("glValidateProgram"); + } + + GLint OpenGLProgram::GetUniformLocation(const std::string& name) + { + GLint location = glGetUniformLocation(program_, name.c_str()); + ORTHANC_OPENGL_CHECK("glGetUniformLocation"); + + if (location == -1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem, + "Inexistent uniform variable in shader: " + name); + } + else + { + return location; + } + } + + + GLint OpenGLProgram::GetAttributeLocation(const std::string& name) + { + GLint location = glGetAttribLocation(program_, name.c_str()); + ORTHANC_OPENGL_CHECK("glGetAttribLocation"); + + if (location == -1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem, + "Inexistent attribute in shader: " + name); + } + else + { + return location; + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,59 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLIncludes.h" + +#include +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class IOpenGLContext; + + class OpenGLProgram : public boost::noncopyable + { + public: + // WARNING: A global OpenGL context must be active to create this object! + // the context is only passed so that it can be checked for loss + // when destructing the program resource + OpenGLProgram(OpenGL::IOpenGLContext& context); + + ~OpenGLProgram(); + + void Use(); + + // WARNING: A global OpenGL context must be active to run this method! + void CompileShaders(const std::string& vertexCode, + const std::string& fragmentCode); + + GLint GetUniformLocation(const std::string& name); + + GLint GetAttributeLocation(const std::string& name); + private: + GLuint program_; + OpenGL::IOpenGLContext& context_; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLShader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLShader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,135 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLShader.h" + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + static GLuint CompileShader(GLenum type, + const std::string& source) + { + // Create shader object + const GLchar* sourceString[1]; + GLint sourceStringLengths[1]; + + sourceString[0] = source.c_str(); + sourceStringLengths[0] = static_cast(source.length()); + GLuint shader = glCreateShader(type); + ORTHANC_OPENGL_CHECK("glCreateShader"); + + if (shader == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot create an OpenGL shader"); + } + else + { + // Assign and compile the source to the shader object + glShaderSource(shader, 1, sourceString, sourceStringLengths); + ORTHANC_OPENGL_CHECK("glShaderSource"); + glCompileShader(shader); + ORTHANC_OPENGL_CHECK("glCompileShader"); + + // Check if there were errors + int infoLen = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); + ORTHANC_OPENGL_CHECK("glGetShaderiv"); + + if (infoLen > 1) // Might be equal to 1, which amounts to no error + { + std::string infoLog; + infoLog.resize(infoLen + 1); + glGetShaderInfoLog(shader, infoLen, NULL, &infoLog[0]); + ORTHANC_OPENGL_CHECK("glGetShaderInfoLog"); + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader"); + glDeleteShader(shader); + ORTHANC_OPENGL_CHECK("glDeleteShader"); + + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Error while creating an OpenGL shader: " + infoLog); + } + else + { + return shader; + } + } + } + + + OpenGLShader::OpenGLShader(GLenum type, + const std::string& source) + { + shader_ = CompileShader(type, source); + isValid_ = true; + } + + + OpenGLShader::~OpenGLShader() + { + try + { + if (isValid_) + { + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteShader"); + glDeleteShader(shader_); + ORTHANC_OPENGL_CHECK("glDeleteShader"); + } + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in ~OpenGLShader: " << e.What(); + } + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in ~OpenGLShader: " << e.what(); + } + catch (...) + { + LOG(ERROR) << "Unknown exception in ~OpenGLShader"; + } + } + + GLuint OpenGLShader::Release() + { + if (isValid_) + { + isValid_ = false; + return shader_; + } + else + { + LOG(ERROR) << "OpenGLShader::Release(): (!isValid_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLShader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLShader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,53 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLIncludes.h" + +#include +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class OpenGLShader : public boost::noncopyable + { + private: + bool isValid_; + GLuint shader_; + + public: + OpenGLShader(GLenum type, + const std::string& source); + + ~OpenGLShader(); + + bool IsValid() const + { + return isValid_; + } + + GLuint Release(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLTexture.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLTexture.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,145 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLTexture.h" +#include "IOpenGLContext.h" + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + OpenGLTexture::OpenGLTexture(OpenGL::IOpenGLContext& context) + : width_(0) + , height_(0) + , context_(context) + { + if (!context_.IsContextLost()) + { + // Generate a texture object + glGenTextures(1, &texture_); + if (texture_ == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot create an OpenGL program"); + } + } + } + + OpenGLTexture::~OpenGLTexture() + { + try + { + if (!context_.IsContextLost()) + { + assert(texture_ != 0); + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteTextures"); + glDeleteTextures(1, &texture_); + } + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What(); + } + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in ~OpenGLTexture: " << e.what(); + } + catch (...) + { + LOG(ERROR) << "Unknown exception in ~OpenGLTexture"; + } + } + + void OpenGLTexture::Load(const Orthanc::ImageAccessor& image, + bool isLinearInterpolation) + { + if (!context_.IsContextLost()) + { + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Disable byte-alignment restriction + + if (image.GetPitch() != image.GetBytesPerPixel() * image.GetWidth()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "Unsupported non-zero padding"); + } + + // Bind it + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture_); + + GLenum sourceFormat, internalFormat; + + switch (image.GetFormat()) + { + case Orthanc::PixelFormat_Grayscale8: + sourceFormat = GL_RED; + internalFormat = GL_RED; + break; + + case Orthanc::PixelFormat_RGB24: + sourceFormat = GL_RGB; + internalFormat = GL_RGB; + break; + + case Orthanc::PixelFormat_RGBA32: + sourceFormat = GL_RGBA; + internalFormat = GL_RGBA; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "No support for this format in OpenGL textures: " + + std::string(EnumerationToString(image.GetFormat()))); + } + + width_ = image.GetWidth(); + height_ = image.GetHeight(); + + GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); + + // Load the texture from the image buffer + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, image.GetWidth(), image.GetHeight(), + 0, sourceFormat, GL_UNSIGNED_BYTE, image.GetBuffer()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, interpolation); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, interpolation); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } + } + + + void OpenGLTexture::Bind(GLint location) + { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture_); + glUniform1i(location, 0 /* texture unit */); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/OpenGLTexture.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/OpenGLTexture.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,66 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLIncludes.h" + +#include + +#include + + +namespace OrthancStone +{ + namespace OpenGL + { + class IOpenGLContext; + + class OpenGLTexture : public boost::noncopyable + { + private: + GLuint texture_; + unsigned int width_; + unsigned int height_; + OpenGL::IOpenGLContext& context_; + + public: + OpenGLTexture(OpenGL::IOpenGLContext& context); + + ~OpenGLTexture(); + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + void Load(const Orthanc::ImageAccessor& image, + bool isLinearInterpolation); + + void Bind(GLint location); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/SdlOpenGLContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/SdlOpenGLContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,127 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlOpenGLContext.h" +#include "../StoneException.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#if !defined(ORTHANC_ENABLE_GLEW) +# error Macro ORTHANC_ENABLE_GLEW must be defined +#endif + +#if ORTHANC_ENABLE_GLEW == 1 +# include +#endif + +#include + +namespace OrthancStone +{ + SdlOpenGLContext::SdlOpenGLContext(const char* title, + unsigned int width, + unsigned int height, + bool allowDpiScaling) + : window_(title, width, height, true /* enable OpenGL */, allowDpiScaling) + , context_(NULL) + { + context_ = SDL_GL_CreateContext(window_.GetObject()); + + if (context_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot initialize OpenGL"); + } + +#if ORTHANC_ENABLE_GLEW == 1 + // The initialization function of glew (i.e. "glewInit()") can + // only be called once an OpenGL is setup. + // https://stackoverflow.com/a/45033669/881731 + { + static boost::mutex mutex_; + static bool isGlewInitialized_ = false; + + boost::mutex::scoped_lock lock(mutex_); + + if (!isGlewInitialized_) + { + LOG(INFO) << "Initializing glew"; + + GLenum err = glewInit(); + if (GLEW_OK != err) + { + LOG(ERROR) << glewGetErrorString(err); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot initialize glew"); + } + + isGlewInitialized_ = true; + } + } +#endif + } + + + SdlOpenGLContext::~SdlOpenGLContext() + { + SDL_GL_DeleteContext(context_); + } + + void SdlOpenGLContext::MakeCurrent() + { + if (SDL_GL_MakeCurrent(window_.GetObject(), context_) != 0) + { + const char* errText = SDL_GetError(); + std::stringstream ss; + ss << "Cannot set current OpenGL context. SDL error text: " << errText; + std::string errStr = ss.str(); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, errStr.c_str()); + } + + // This makes our buffer swap synchronized with the monitor's vertical refresh + SDL_GL_SetSwapInterval(1); + } + + + void SdlOpenGLContext::SwapBuffer() + { + // Swap our buffer to display the current contents of buffer on screen + SDL_GL_SwapWindow(window_.GetObject()); + } + + + unsigned int SdlOpenGLContext::GetCanvasWidth() const + { + int w = 0; + SDL_GL_GetDrawableSize(window_.GetObject(), &w, NULL); + return static_cast(w); + } + + + unsigned int SdlOpenGLContext::GetCanvasHeight() const + { + int h = 0; + SDL_GL_GetDrawableSize(window_.GetObject(), NULL, &h); + return static_cast(h); + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/SdlOpenGLContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/SdlOpenGLContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include "IOpenGLContext.h" +#include "../Viewport/SdlWindow.h" + +#include + +#include + +namespace OrthancStone +{ + class SdlOpenGLContext : public OpenGL::IOpenGLContext + { + private: + SdlWindow window_; + SDL_GLContext context_; + + public: + SdlOpenGLContext(const char* title, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + + ~SdlOpenGLContext(); + + SdlWindow& GetWindow() + { + return window_; + } + + virtual bool IsContextLost() ORTHANC_OVERRIDE + { + // On desktop applications, an OpenGL context should never be lost + return false; + } + + virtual void MakeCurrent() ORTHANC_OVERRIDE; + + virtual void SwapBuffer() ORTHANC_OVERRIDE; + + virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE; + + virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE; + + void ToggleMaximize() + { + window_.ToggleMaximize(); + } + + virtual void RefreshCanvasSize() ORTHANC_OVERRIDE + { + // Nothing to do for SDL + } + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/WebAssemblyOpenGLContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/WebAssemblyOpenGLContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,271 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebAssemblyOpenGLContext.h" + +#include "../StoneException.h" + +#include + +#include +#include + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class WebAssemblyOpenGLContext::PImpl + { + private: + std::string canvasSelector_; + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context_; + unsigned int canvasWidth_; + unsigned int canvasHeight_; + bool isContextLost_; + + public: + PImpl(const std::string& canvasSelector) + : canvasSelector_(canvasSelector) + , isContextLost_(false) + { + // Context configuration + EmscriptenWebGLContextAttributes attr; + emscripten_webgl_init_context_attributes(&attr); + + context_ = emscripten_webgl_create_context(canvasSelector.c_str(), &attr); + if (context_ == 0) + { + std::string message("Cannot create an OpenGL context for the element with the following CSS selector: \""); + message += canvasSelector; + message += "\" Please make sure the -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 flag has been passed to Emscripten when building."; + LOG(ERROR) << message; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, message); + } + + UpdateSize(); + } + + void* DebugGetInternalContext() const + { + return reinterpret_cast(context_); + } + + bool IsContextLost() + { + //LOG(TRACE) << "IsContextLost() for context " << std::hex << context_ << std::dec; + bool apiFlag = (emscripten_is_webgl_context_lost(context_) != 0); + isContextLost_ = apiFlag; + return isContextLost_; + } + + void SetLostContext() + { + isContextLost_ = true; + } + + ~PImpl() + { + try + { + EMSCRIPTEN_RESULT result = emscripten_webgl_destroy_context(context_); + if (result != EMSCRIPTEN_RESULT_SUCCESS) + { + LOG(ERROR) << "emscripten_webgl_destroy_context returned code " << result; + } + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in WebAssemblyOpenGLContext::~PImpl: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in WebAssemblyOpenGLContext::~PImpl: " << e.What(); + } + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in WebAssemblyOpenGLContext::~PImpl: " << e.what(); + } + catch (...) + { + LOG(ERROR) << "Unknown exception in WebAssemblyOpenGLContext::~PImpl"; + } + } + + const std::string& GetCanvasSelector() const + { + return canvasSelector_; + } + + void MakeCurrent() + { + if (IsContextLost()) + { + LOG(ERROR) << "MakeCurrent() called on lost context " << context_; + throw StoneException(ErrorCode_WebGLContextLost); + } + + if (emscripten_is_webgl_context_lost(context_)) + { + LOG(ERROR) << "OpenGL context has been lost for canvas selector: " << canvasSelector_; + SetLostContext(); + throw StoneException(ErrorCode_WebGLContextLost); + } + + if (emscripten_webgl_make_context_current(context_) != EMSCRIPTEN_RESULT_SUCCESS) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Cannot set the OpenGL context"); + } + } + + void SwapBuffer() + { + /** + * "Rendered WebGL content is implicitly presented (displayed to + * the user) on the canvas when the event handler that renders with + * WebGL returns back to the browser event loop." + * https://emscripten.org/docs/api_reference/html5.h.html#webgl-context + * + * Could call "emscripten_webgl_commit_frame()" if + * "explicitSwapControl" option were set to "true". + **/ + } + + unsigned int GetCanvasWidth() const + { + return canvasWidth_; + } + + unsigned int GetCanvasHeight() const + { + return canvasHeight_; + } + + void UpdateSize() + { + double w, h; + emscripten_get_element_css_size(canvasSelector_.c_str(), &w, &h); + + /** + * Emscripten has the function emscripten_get_element_css_size() + * to query the width and height of a named HTML element. I'm + * calling this first to get the initial size of the canvas DOM + * element, and then call emscripten_set_canvas_size() to + * initialize the framebuffer size of the canvas to the same + * size as its DOM element. + * https://floooh.github.io/2017/02/22/emsc-html.html + **/ + + if (w <= 0 || + h <= 0) + { + canvasWidth_ = 0; + canvasHeight_ = 0; + } + else + { + canvasWidth_ = static_cast(boost::math::iround(w)); + canvasHeight_ = static_cast(boost::math::iround(h)); + } + + emscripten_set_canvas_element_size(canvasSelector_.c_str(), canvasWidth_, canvasHeight_); + } + }; + + + WebAssemblyOpenGLContext::WebAssemblyOpenGLContext(const std::string& canvasSelector) : + pimpl_(new PImpl(canvasSelector)) + { + } + + bool WebAssemblyOpenGLContext::IsContextLost() + { + return pimpl_->IsContextLost(); + } + + void WebAssemblyOpenGLContext::SetLostContext() + { + pimpl_->SetLostContext(); + } + + void* WebAssemblyOpenGLContext::DebugGetInternalContext() const + { + return pimpl_->DebugGetInternalContext(); + } + + void WebAssemblyOpenGLContext::MakeCurrent() + { + assert(pimpl_.get() != NULL); + pimpl_->MakeCurrent(); + } + + void WebAssemblyOpenGLContext::SwapBuffer() + { + assert(pimpl_.get() != NULL); + pimpl_->SwapBuffer(); + } + + unsigned int WebAssemblyOpenGLContext::GetCanvasWidth() const + { + assert(pimpl_.get() != NULL); + return pimpl_->GetCanvasWidth(); + } + + unsigned int WebAssemblyOpenGLContext::GetCanvasHeight() const + { + assert(pimpl_.get() != NULL); + return pimpl_->GetCanvasHeight(); + } + + void WebAssemblyOpenGLContext::RefreshCanvasSize() + { + assert(pimpl_.get() != NULL); + + try + { + pimpl_->UpdateSize(); + } + catch (const StoneException& e) + { + // Ignore problems about the loss of the WebGL context (edge case) + if (e.GetErrorCode() == ErrorCode_WebGLContextLost) + { + return; + } + else + { + throw; + } + } + } + + const std::string& WebAssemblyOpenGLContext::GetCanvasSelector() const + { + assert(pimpl_.get() != NULL); + return pimpl_->GetCanvasSelector(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OpenGL/WebAssemblyOpenGLContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OpenGL/WebAssemblyOpenGLContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,86 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if !defined(ORTHANC_ENABLE_WASM) +# error Macro ORTHANC_ENABLE_WASM must be defined +#endif + +#if ORTHANC_ENABLE_WASM != 1 +# error This file can only be used if targeting WebAssembly +#endif + +#if !defined(ORTHANC_ENABLE_OPENGL) +# error The macro ORTHANC_ENABLE_OPENGL must be defined +#endif + +#if ORTHANC_ENABLE_OPENGL != 1 +# error Support for OpenGL is disabled +#endif + +#include "IOpenGLContext.h" + +#include + +#include + +namespace OrthancStone +{ + namespace OpenGL + { + class WebAssemblyOpenGLContext : public OpenGL::IOpenGLContext + { + private: + class PImpl; + boost::shared_ptr pimpl_; + + public: + WebAssemblyOpenGLContext(const std::string& canvasSelector); + + virtual bool IsContextLost() ORTHANC_OVERRIDE; + + virtual void MakeCurrent() ORTHANC_OVERRIDE; + + virtual void SwapBuffer() ORTHANC_OVERRIDE; + + virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE; + + virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE; + + /** + Returns true if the underlying context has been successfully recreated + */ + //bool TryRecreate(); + + virtual void RefreshCanvasSize() ORTHANC_OVERRIDE; + + const std::string& GetCanvasSelector() const; + + + /** + * This is for manual context loss (debug purposes) + **/ + void* DebugGetInternalContext() const; + void SetLostContext(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GenericOracleRunner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GenericOracleRunner.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,524 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GenericOracleRunner.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#include "GetOrthancImageCommand.h" +#include "GetOrthancWebViewerJpegCommand.h" +#include "HttpCommand.h" +#include "OracleCommandExceptionMessage.h" +#include "OrthancRestApiCommand.h" +#include "ParseDicomFromFileCommand.h" +#include "ParseDicomFromWadoCommand.h" +#include "ReadFileCommand.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "ParseDicomSuccessMessage.h" +# include +# include +static unsigned int BUCKET_DICOMDIR = 0; +static unsigned int BUCKET_SOP = 1; +#endif + +#include +#include +#include +#include +#include + +#include + + + +namespace OrthancStone +{ + static void CopyHttpHeaders(Orthanc::HttpClient& client, + const Orthanc::HttpClient::HttpHeaders& headers) + { + for (Orthanc::HttpClient::HttpHeaders::const_iterator + it = headers.begin(); it != headers.end(); it++ ) + { + client.AddHeader(it->first, it->second); + } + } + + + static void DecodeAnswer(std::string& answer, + const Orthanc::HttpClient::HttpHeaders& headers) + { + Orthanc::HttpCompression contentEncoding = Orthanc::HttpCompression_None; + + for (Orthanc::HttpClient::HttpHeaders::const_iterator it = headers.begin(); + it != headers.end(); ++it) + { + std::string s; + Orthanc::Toolbox::ToLowerCase(s, it->first); + + if (s == "content-encoding") + { + if (it->second == "gzip") + { + contentEncoding = Orthanc::HttpCompression_Gzip; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "Unsupported HTTP Content-Encoding: " + it->second); + } + + break; + } + } + + if (contentEncoding == Orthanc::HttpCompression_Gzip) + { + std::string compressed; + answer.swap(compressed); + + Orthanc::GzipCompressor compressor; + compressor.Uncompress(answer, compressed.c_str(), compressed.size()); + + LOG(INFO) << "Uncompressing gzip Encoding: from " << compressed.size() + << " to " << answer.size() << " bytes"; + } + } + + + static void RunHttpCommand(std::string& answer, + Orthanc::HttpClient::HttpHeaders& answerHeaders, + const HttpCommand& command) + { + Orthanc::HttpClient client; + client.SetUrl(command.GetUrl()); + client.SetMethod(command.GetMethod()); + client.SetTimeout(command.GetTimeout()); + + CopyHttpHeaders(client, command.GetHttpHeaders()); + + if (command.HasCredentials()) + { + client.SetCredentials(command.GetUsername().c_str(), command.GetPassword().c_str()); + } + + if (command.GetMethod() == Orthanc::HttpMethod_Post || + command.GetMethod() == Orthanc::HttpMethod_Put) + { + client.SetBody(command.GetBody()); + } + + client.ApplyAndThrowException(answer, answerHeaders); + DecodeAnswer(answer, answerHeaders); + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const HttpCommand& command) + { + std::string answer; + Orthanc::HttpClient::HttpHeaders answerHeaders; + RunHttpCommand(answer, answerHeaders, command); + + HttpCommand::SuccessMessage message(command, answerHeaders, answer); + emitter.EmitMessage(receiver, message); + } + + + static void RunOrthancRestApiCommand(std::string& answer, + Orthanc::HttpClient::HttpHeaders& answerHeaders, + const Orthanc::WebServiceParameters& orthanc, + const OrthancRestApiCommand& command) + { + Orthanc::HttpClient client(orthanc, command.GetUri()); + client.SetRedirectionFollowed(false); + client.SetMethod(command.GetMethod()); + client.SetTimeout(command.GetTimeout()); + + CopyHttpHeaders(client, command.GetHttpHeaders()); + + if (command.GetMethod() == Orthanc::HttpMethod_Post || + command.GetMethod() == Orthanc::HttpMethod_Put) + { + client.SetBody(command.GetBody()); + } + + client.ApplyAndThrowException(answer, answerHeaders); + DecodeAnswer(answer, answerHeaders); + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + const OrthancRestApiCommand& command) + { + std::string answer; + Orthanc::HttpClient::HttpHeaders answerHeaders; + RunOrthancRestApiCommand(answer, answerHeaders, orthanc, command); + + OrthancRestApiCommand::SuccessMessage message(command, answerHeaders, answer); + emitter.EmitMessage(receiver, message); + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + const GetOrthancImageCommand& command) + { + Orthanc::HttpClient client(orthanc, command.GetUri()); + client.SetRedirectionFollowed(false); + client.SetTimeout(command.GetTimeout()); + + CopyHttpHeaders(client, command.GetHttpHeaders()); + + std::string answer; + Orthanc::HttpClient::HttpHeaders answerHeaders; + client.ApplyAndThrowException(answer, answerHeaders); + + DecodeAnswer(answer, answerHeaders); + + command.ProcessHttpAnswer(receiver, emitter, answer, answerHeaders); + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const Orthanc::WebServiceParameters& orthanc, + const GetOrthancWebViewerJpegCommand& command) + { + Orthanc::HttpClient client(orthanc, command.GetUri()); + client.SetRedirectionFollowed(false); + client.SetTimeout(command.GetTimeout()); + + CopyHttpHeaders(client, command.GetHttpHeaders()); + + std::string answer; + Orthanc::HttpClient::HttpHeaders answerHeaders; + client.ApplyAndThrowException(answer, answerHeaders); + + DecodeAnswer(answer, answerHeaders); + + command.ProcessHttpAnswer(receiver, emitter, answer); + } + + + static std::string GetPath(const std::string& root, + const std::string& file) + { + boost::filesystem::path a(root); + boost::filesystem::path b(file); + + boost::filesystem::path c; + if (b.is_absolute()) + { + c = b; + } + else + { + c = a / b; + } + + return c.string(); + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& root, + const ReadFileCommand& command) + { + std::string path = GetPath(root, command.GetPath()); + LOG(TRACE) << "Oracle reading file: " << path; + + std::string content; + Orthanc::SystemToolbox::ReadFile(content, path, true /* log */); + + ReadFileCommand::SuccessMessage message(command, content); + emitter.EmitMessage(receiver, message); + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + static Orthanc::ParsedDicomFile* ParseDicom(uint64_t& fileSize, /* OUT */ + const std::string& path, + bool isPixelData) + { + if (!Orthanc::SystemToolbox::IsRegularFile(path)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentFile); + } + + LOG(TRACE) << "Parsing DICOM file, " << (isPixelData ? "with" : "without") + << " pixel data: " << path; + + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + + fileSize = Orthanc::SystemToolbox::GetFileSize(path); + + // Check for 32bit systems + if (fileSize != static_cast(static_cast(fileSize))) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); + } + + DcmFileFormat dicom; + bool ok; + + if (isPixelData) + { + ok = dicom.loadFile(path.c_str()).good(); + } + else + { +#if DCMTK_VERSION_NUMBER >= 362 + /** + * NB : We could stop at (0x3007, 0x0000) instead of + * DCM_PixelData as the Stone framework does not use further + * tags (cf. the Orthanc::DICOM_TAG_* constants), but we still + * use "PixelData" as this does not change the runtime much, and + * as it is more explicit. + **/ + static const DcmTagKey STOP = DCM_PixelData; + //static const DcmTagKey STOP(0x3007, 0x0000); + + ok = dicom.loadFileUntilTag(path.c_str(), EXS_Unknown, EGL_noChange, + DCM_MaxReadLength, ERM_autoDetect, STOP).good(); +#else + // The primitive "loadFileUntilTag" was introduced in DCMTK 3.6.2 + ok = dicom.loadFile(path.c_str()).good(); +#endif + } + + if (ok) + { + std::unique_ptr result(new Orthanc::ParsedDicomFile(dicom)); + + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + LOG(TRACE) << path << ": parsed in " << (end-start).total_milliseconds() << " ms"; + + return result.release(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, + "Cannot parse file: " + path); + } + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + boost::shared_ptr cache, + const std::string& root, + const ParseDicomFromFileCommand& command) + { + const std::string path = GetPath(root, command.GetPath()); + + if (cache) + { + ParsedDicomCache::Reader reader(*cache, BUCKET_DICOMDIR, path); + if (reader.IsValid() && + (!command.IsPixelDataIncluded() || + reader.HasPixelData())) + { + // Reuse the DICOM file from the cache + ParseDicomSuccessMessage message(command, command.GetSource(), reader.GetDicom(), + reader.GetFileSize(), reader.HasPixelData()); + emitter.EmitMessage(receiver, message); + return; + } + } + + uint64_t fileSize; + std::unique_ptr parsed(ParseDicom(fileSize, path, command.IsPixelDataIncluded())); + + if (fileSize != static_cast(fileSize)) + { + // Cannot load such a large file on 32-bit architecture + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); + } + + { + ParseDicomSuccessMessage message + (command, command.GetSource(), *parsed, + static_cast(fileSize), command.IsPixelDataIncluded()); + emitter.EmitMessage(receiver, message); + } + + if (cache) + { + // Store it into the cache for future use + + // Invalidate to overwrite DICOM instance that would already + // be stored without pixel data + cache->Invalidate(BUCKET_DICOMDIR, path); + + cache->Acquire(BUCKET_DICOMDIR, path, parsed.release(), + static_cast(fileSize), command.IsPixelDataIncluded()); + } + } + + + static void RunInternal(boost::weak_ptr receiver, + IMessageEmitter& emitter, + boost::shared_ptr cache, + const Orthanc::WebServiceParameters& orthanc, + const ParseDicomFromWadoCommand& command) + { + if (cache) + { + ParsedDicomCache::Reader reader(*cache, BUCKET_SOP, command.GetSopInstanceUid()); + if (reader.IsValid() && + reader.HasPixelData()) + { + // Reuse the DICOM file from the cache + ParseDicomSuccessMessage message(command, command.GetSource(), reader.GetDicom(), + reader.GetFileSize(), reader.HasPixelData()); + emitter.EmitMessage(receiver, message); + return; + } + } + + std::string answer; + Orthanc::HttpClient::HttpHeaders answerHeaders; + + switch (command.GetRestCommand().GetType()) + { + case IOracleCommand::Type_Http: + RunHttpCommand(answer, answerHeaders, dynamic_cast(command.GetRestCommand())); + break; + + case IOracleCommand::Type_OrthancRestApi: + RunOrthancRestApiCommand(answer, answerHeaders, orthanc, + dynamic_cast(command.GetRestCommand())); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + size_t fileSize; + std::unique_ptr parsed(ParseDicomSuccessMessage::ParseWadoAnswer(fileSize, answer, answerHeaders)); + + { + ParseDicomSuccessMessage message(command, command.GetSource(), *parsed, fileSize, + true /* pixel data always is included in WADO-RS */); + emitter.EmitMessage(receiver, message); + } + + if (cache) + { + // Store it into the cache for future use + cache->Acquire(BUCKET_SOP, command.GetSopInstanceUid(), parsed.release(), fileSize, true); + } + } +#endif + + + void GenericOracleRunner::Run(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const IOracleCommand& command) + { + Orthanc::ErrorCode error = Orthanc::ErrorCode_Success; + + try + { + switch (command.GetType()) + { + case IOracleCommand::Type_Sleep: + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, + "Sleep command cannot be executed by the runner"); + + case IOracleCommand::Type_Http: + RunInternal(receiver, emitter, dynamic_cast(command)); + break; + + case IOracleCommand::Type_OrthancRestApi: + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; + + case IOracleCommand::Type_GetOrthancImage: + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; + + case IOracleCommand::Type_GetOrthancWebViewerJpeg: + RunInternal(receiver, emitter, orthanc_, + dynamic_cast(command)); + break; + + case IOracleCommand::Type_ReadFile: + RunInternal(receiver, emitter, rootDirectory_, + dynamic_cast(command)); + break; + + case IOracleCommand::Type_ParseDicomFromFile: + case IOracleCommand::Type_ParseDicomFromWado: +#if ORTHANC_ENABLE_DCMTK == 1 + switch (command.GetType()) + { + case IOracleCommand::Type_ParseDicomFromFile: + RunInternal(receiver, emitter, dicomCache_, rootDirectory_, + dynamic_cast(command)); + break; + + case IOracleCommand::Type_ParseDicomFromWado: + RunInternal(receiver, emitter, dicomCache_, orthanc_, + dynamic_cast(command)); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + break; +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "DCMTK must be enabled to parse DICOM files"); +#endif + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception within the oracle: " << e.What(); + error = e.GetErrorCode(); + } + catch (...) + { + LOG(ERROR) << "Threaded exception within the oracle"; + error = Orthanc::ErrorCode_InternalError; + } + + if (error != Orthanc::ErrorCode_Success) + { + OracleCommandExceptionMessage message(command, error); + emitter.EmitMessage(receiver, message); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GenericOracleRunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GenericOracleRunner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include // To have the macros properly defined + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "../Toolbox/ParsedDicomCache.h" +#endif + +#include "IOracleCommand.h" +#include "../Messages/IMessageEmitter.h" + +#include // For ORTHANC_OVERRIDE +#include + +namespace OrthancStone +{ + class GenericOracleRunner : public boost::noncopyable + { + private: + Orthanc::WebServiceParameters orthanc_; + std::string rootDirectory_; + +#if ORTHANC_ENABLE_DCMTK == 1 + boost::shared_ptr dicomCache_; +#endif + + public: + GenericOracleRunner() : + rootDirectory_(".") + { + } + + void SetOrthanc(const Orthanc::WebServiceParameters& orthanc) + { + orthanc_ = orthanc; + } + + const Orthanc::WebServiceParameters& GetOrthanc() const + { + return orthanc_; + } + + void SetRootDirectory(const std::string& rootDirectory) + { + rootDirectory_ = rootDirectory; + } + + const std::string GetRootDirectory() const + { + return rootDirectory_; + } + +#if ORTHANC_ENABLE_DCMTK == 1 + void SetDicomCache(boost::shared_ptr cache) + { + dicomCache_ = cache; + } +#endif + + void Run(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const IOracleCommand& command); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GetOrthancImageCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GetOrthancImageCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,189 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GetOrthancImageCommand.h" + +#include +#include +#include +#include +#include + +namespace OrthancStone +{ + GetOrthancImageCommand::GetOrthancImageCommand() : + uri_("/"), + timeout_(600), + hasExpectedFormat_(false) + { + } + + + void GetOrthancImageCommand::SetExpectedPixelFormat(Orthanc::PixelFormat format) + { + hasExpectedFormat_ = true; + expectedFormat_ = format; + } + + + static std::string GetFormatSuffix(Orthanc::PixelFormat pixelFormat) + { + switch (pixelFormat) + { + case Orthanc::PixelFormat_RGB24: + return "preview"; + + case Orthanc::PixelFormat_Grayscale16: + return "image-uint16"; + + case Orthanc::PixelFormat_SignedGrayscale16: + return "image-int16"; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void GetOrthancImageCommand::SetInstanceUri(const std::string& instance, + Orthanc::PixelFormat pixelFormat) + { + uri_ = "/instances/" + instance + "/" + GetFormatSuffix(pixelFormat); + } + + + void GetOrthancImageCommand::SetFrameUri(const std::string& instance, + unsigned int frame, + Orthanc::PixelFormat pixelFormat) + { + uri_ = ("/instances/" + instance + "/frames/" + + boost::lexical_cast(frame) + "/" + GetFormatSuffix(pixelFormat)); + } + + + void GetOrthancImageCommand::ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer, + const HttpHeaders& answerHeaders) const + { + for (HttpHeaders::const_iterator it = answerHeaders.begin(); it != answerHeaders.end(); ++it) + { + std::string key = Orthanc::Toolbox::StripSpaces(it->first); + Orthanc::Toolbox::ToLowerCase(key); + + if (key == "content-disposition" && + it->second == "filename=\"unsupported.png\"") + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat, + "Orthanc cannot decode this image"); + } + } + + Orthanc::MimeType contentType = Orthanc::MimeType_Binary; + + for (HttpHeaders::const_iterator it = answerHeaders.begin(); + it != answerHeaders.end(); ++it) + { + std::string s; + Orthanc::Toolbox::ToLowerCase(s, it->first); + + if (s == "content-type") + { + contentType = Orthanc::StringToMimeType(it->second); + break; + } + } + + std::unique_ptr image; + + switch (contentType) + { + case Orthanc::MimeType_Png: + { + image.reset(new Orthanc::PngReader); + dynamic_cast(*image).ReadFromMemory(answer); + break; + } + + case Orthanc::MimeType_Pam: + { +#ifdef __EMSCRIPTEN__ + // "true" means we ask the PamReader to make an extra copy so that + // the resulting Orthanc::ImageAccessor is aligned (as malloc is). + // Indeed, even though alignment is not required in Web Assembly, + // Emscripten seems to check it and bail out if addresses are "odd" + image.reset(new Orthanc::PamReader(true)); +#else + // potentially unaligned, with is faster and consumes less heap memory + image.reset(new Orthanc::PamReader); +#endif + dynamic_cast(*image).ReadFromMemory(answer); + break; + } + + case Orthanc::MimeType_Jpeg: + { + image.reset(new Orthanc::JpegReader); + dynamic_cast(*image).ReadFromMemory(answer); + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "Unsupported HTTP Content-Type for an image: " + + std::string(Orthanc::EnumerationToString(contentType))); + } + + if (hasExpectedFormat_) + { + if (expectedFormat_ == Orthanc::PixelFormat_SignedGrayscale16 && + image->GetFormat() == Orthanc::PixelFormat_Grayscale16) + { + image->SetFormat(Orthanc::PixelFormat_SignedGrayscale16); + } + + if (expectedFormat_ != image->GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + } + + //{ + // // DEBUG DISPLAY IMAGE PROPERTIES BGO 2020-04-11 + // const Orthanc::ImageAccessor& source = *image; + // const void* sourceBuffer = source.GetConstBuffer(); + // intptr_t sourceBufferInt = reinterpret_cast(sourceBuffer); + // int sourceWidth = source.GetWidth(); + // int sourceHeight = source.GetHeight(); + // int sourcePitch = source.GetPitch(); + + // // TODO: turn error into trace below + // LOG(ERROR) << "GetOrthancImageCommand::ProcessHttpAnswer | source:" + // << " W = " << sourceWidth << " H = " << sourceHeight + // << " P = " << sourcePitch << " B = " << sourceBufferInt + // << " B % 4 == " << sourceBufferInt % 4; + //} + + + SuccessMessage message(*this, *image, contentType); + emitter.EmitMessage(receiver, message); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GetOrthancImageCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GetOrthancImageCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,142 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessageEmitter.h" +#include "OracleCommandBase.h" + +#include + +#include + +namespace OrthancStone +{ + class GetOrthancImageCommand : public OracleCommandBase + { + public: + typedef std::map HttpHeaders; + + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Orthanc::ImageAccessor& image_; + Orthanc::MimeType mime_; + + public: + SuccessMessage(const GetOrthancImageCommand& command, + const Orthanc::ImageAccessor& image, + Orthanc::MimeType mime) : + OriginMessage(command), + image_(image), + mime_(mime) + { + } + + const Orthanc::ImageAccessor& GetImage() const + { + return image_; + } + + Orthanc::MimeType GetMimeType() const + { + return mime_; + } + }; + + + private: + std::string uri_; + HttpHeaders headers_; + unsigned int timeout_; + bool hasExpectedFormat_; + Orthanc::PixelFormat expectedFormat_; + + GetOrthancImageCommand(const GetOrthancImageCommand& other) : + uri_(other.uri_), + headers_(other.headers_), + timeout_(other.timeout_), + hasExpectedFormat_(other.hasExpectedFormat_), + expectedFormat_(other.expectedFormat_) + { + } + + public: + GetOrthancImageCommand(); + + virtual Type GetType() const + { + return Type_GetOrthancImage; + } + + virtual IOracleCommand* Clone() const + { + return new GetOrthancImageCommand(*this); + } + + void SetExpectedPixelFormat(Orthanc::PixelFormat format); + + void SetUri(const std::string& uri) + { + uri_ = uri; + } + + void SetInstanceUri(const std::string& instance, + Orthanc::PixelFormat pixelFormat); + + void SetFrameUri(const std::string& instance, + unsigned int frame, + Orthanc::PixelFormat pixelFormat); + + void SetHttpHeader(const std::string& key, + const std::string& value) + { + headers_[key] = value; + } + + const std::string& GetUri() const + { + return uri_; + } + + const HttpHeaders& GetHttpHeaders() const + { + return headers_; + } + + void SetTimeout(unsigned int seconds) + { + timeout_ = seconds; + } + + unsigned int GetTimeout() const + { + return timeout_; + } + + void ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer, + const HttpHeaders& answerHeaders) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GetOrthancWebViewerJpegCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GetOrthancWebViewerJpegCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,210 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GetOrthancWebViewerJpegCommand.h" + +#include "../Toolbox/LinearAlgebra.h" + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +// 'Json::Reader': Use CharReader and CharReaderBuilder instead +#pragma warning(disable:4996) +#endif + +#include +#include + +namespace OrthancStone +{ + GetOrthancWebViewerJpegCommand::GetOrthancWebViewerJpegCommand() : + frame_(0), + quality_(95), + timeout_(600), + expectedFormat_(Orthanc::PixelFormat_Grayscale8) + { + } + + + void GetOrthancWebViewerJpegCommand::SetQuality(unsigned int quality) + { + if (quality <= 0 || + quality > 100) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + quality_ = quality; + } + } + + + std::string GetOrthancWebViewerJpegCommand::GetUri() const + { + return ("/web-viewer/instances/jpeg" + boost::lexical_cast(quality_) + + "-" + instanceId_ + "_" + boost::lexical_cast(frame_)); + } + + + void GetOrthancWebViewerJpegCommand::ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer) const + { + // This code comes from older "OrthancSlicesLoader::ParseSliceImageJpeg()" + + Json::Value encoded; + + { + Json::Reader reader; + if (!reader.parse(answer, encoded)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + if (encoded.type() != Json::objectValue || + !encoded.isMember("Orthanc") || + encoded["Orthanc"].type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + const Json::Value& info = encoded["Orthanc"]; + if (!info.isMember("PixelData") || + !info.isMember("Stretched") || + !info.isMember("Compression") || + info["Compression"].type() != Json::stringValue || + info["PixelData"].type() != Json::stringValue || + info["Stretched"].type() != Json::booleanValue || + info["Compression"].asString() != "Jpeg") + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + bool isSigned = false; + bool isStretched = info["Stretched"].asBool(); + + if (info.isMember("IsSigned")) + { + if (info["IsSigned"].type() != Json::booleanValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + isSigned = info["IsSigned"].asBool(); + } + } + + std::unique_ptr reader; + + { + std::string jpeg; + Orthanc::Toolbox::DecodeBase64(jpeg, info["PixelData"].asString()); + + reader.reset(new Orthanc::JpegReader); + dynamic_cast(*reader).ReadFromMemory(jpeg); + } + + if (reader->GetFormat() == Orthanc::PixelFormat_RGB24) // This is a color image + { + if (expectedFormat_ != Orthanc::PixelFormat_RGB24) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (isSigned || isStretched) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + SuccessMessage message(*this, *reader); + emitter.EmitMessage(receiver, message); + return; + } + } + + if (reader->GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (!isStretched) + { + if (expectedFormat_ != reader->GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + SuccessMessage message(*this, *reader); + emitter.EmitMessage(receiver, message); + return; + } + } + + int32_t stretchLow = 0; + int32_t stretchHigh = 0; + + if (!info.isMember("StretchLow") || + !info.isMember("StretchHigh") || + info["StretchLow"].type() != Json::intValue || + info["StretchHigh"].type() != Json::intValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + stretchLow = info["StretchLow"].asInt(); + stretchHigh = info["StretchHigh"].asInt(); + + if (stretchLow < -32768 || + stretchHigh > 65535 || + (stretchLow < 0 && stretchHigh > 32767)) + { + // This range cannot be represented with a uint16_t or an int16_t + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + // Decode a grayscale JPEG 8bpp image coming from the Web viewer + std::unique_ptr image + (new Orthanc::Image(expectedFormat_, reader->GetWidth(), reader->GetHeight(), false)); + + Orthanc::ImageProcessing::Convert(*image, *reader); + reader.reset(); + + float scaling = static_cast(stretchHigh - stretchLow) / 255.0f; + + if (!LinearAlgebra::IsCloseToZero(scaling)) + { + float offset = static_cast(stretchLow) / scaling; + Orthanc::ImageProcessing::ShiftScale(*image, offset, scaling, true); + } + + SuccessMessage message(*this, *image); + emitter.EmitMessage(receiver, message); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/GetOrthancWebViewerJpegCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/GetOrthancWebViewerJpegCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,154 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessageEmitter.h" +#include "OracleCommandBase.h" + +#include + +#include + +namespace OrthancStone +{ + class GetOrthancWebViewerJpegCommand : public OracleCommandBase + { + public: + typedef std::map HttpHeaders; + + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const Orthanc::ImageAccessor& image_; + + public: + SuccessMessage(const GetOrthancWebViewerJpegCommand& command, + const Orthanc::ImageAccessor& image) : + OriginMessage(command), + image_(image) + { + } + + const Orthanc::ImageAccessor& GetImage() const + { + return image_; + } + }; + + private: + std::string instanceId_; + unsigned int frame_; + unsigned int quality_; + HttpHeaders headers_; + unsigned int timeout_; + Orthanc::PixelFormat expectedFormat_; + + GetOrthancWebViewerJpegCommand(const GetOrthancWebViewerJpegCommand& other) : + instanceId_(other.instanceId_), + frame_(other.frame_), + quality_(other.quality_), + headers_(other.headers_), + timeout_(other.timeout_), + expectedFormat_(other.expectedFormat_) + { + } + + public: + GetOrthancWebViewerJpegCommand(); + + virtual Type GetType() const + { + return Type_GetOrthancWebViewerJpeg; + } + + virtual IOracleCommand* Clone() const + { + return new GetOrthancWebViewerJpegCommand(*this); + } + + void SetExpectedPixelFormat(Orthanc::PixelFormat format) + { + expectedFormat_ = format; + } + + void SetInstance(const std::string& instanceId) + { + instanceId_ = instanceId; + } + + void SetFrame(unsigned int frame) + { + frame_ = frame; + } + + void SetQuality(unsigned int quality); + + void SetHttpHeader(const std::string& key, + const std::string& value) + { + headers_[key] = value; + } + + Orthanc::PixelFormat GetExpectedPixelFormat() const + { + return expectedFormat_; + } + + const std::string& GetInstanceId() const + { + return instanceId_; + } + + unsigned int GetFrame() const + { + return frame_; + } + + unsigned int GetQuality() const + { + return quality_; + } + + const HttpHeaders& GetHttpHeaders() const + { + return headers_; + } + + void SetTimeout(unsigned int seconds) + { + timeout_ = seconds; + } + + unsigned int GetTimeout() const + { + return timeout_; + } + + std::string GetUri() const; + + void ProcessHttpAnswer(boost::weak_ptr receiver, + IMessageEmitter& emitter, + const std::string& answer) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/HttpCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/HttpCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,100 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "HttpCommand.h" + +#include + +#ifdef _MSC_VER +// 'Json::Reader': Use CharReader and CharReaderBuilder instead +#pragma warning(disable:4996) +#endif + +#include +#include + +namespace OrthancStone +{ + void HttpCommand::SuccessMessage::ParseJsonBody(Json::Value& target) const + { + Json::Reader reader; + if (!reader.parse(answer_, target)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + HttpCommand::HttpCommand() : + method_(Orthanc::HttpMethod_Get), + url_("/"), + timeout_(600) + { + } + + + void HttpCommand::SetBody(const Json::Value& json) + { + Json::FastWriter writer; + body_ = writer.write(json); + } + + + const std::string& HttpCommand::GetBody() const + { + if (method_ == Orthanc::HttpMethod_Post || + method_ == Orthanc::HttpMethod_Put) + { + return body_; + } + else + { + LOG(ERROR) << "HttpCommand::GetBody(): method_ not _Post or _Put"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const std::string& HttpCommand::GetUsername() const + { + if (HasCredentials()) + { + return username_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const std::string& HttpCommand::GetPassword() const + { + if (HasCredentials()) + { + return password_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/HttpCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/HttpCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,186 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "OracleCommandBase.h" + +#include + +#include +#include + +namespace OrthancStone +{ + class HttpCommand : public OracleCommandBase + { + public: + typedef std::map HttpHeaders; + + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const HttpHeaders& headers_; + const std::string& answer_; + + public: + SuccessMessage(const HttpCommand& command, + const HttpHeaders& answerHeaders, + const std::string& answer) : + OriginMessage(command), + headers_(answerHeaders), + answer_(answer) + { + } + + const std::string& GetAnswer() const + { + return answer_; + } + + void ParseJsonBody(Json::Value& target) const; + + const HttpHeaders& GetAnswerHeaders() const + { + return headers_; + } + }; + + + private: + Orthanc::HttpMethod method_; + std::string url_; + std::string body_; + HttpHeaders headers_; + unsigned int timeout_; + std::string username_; + std::string password_; + + HttpCommand(const HttpCommand& other) : + method_(other.method_), + url_(other.url_), + body_(other.body_), + headers_(other.headers_), + timeout_(other.timeout_), + username_(other.username_), + password_(other.password_) + { + } + + public: + HttpCommand(); + + virtual Type GetType() const + { + return Type_Http; + } + + virtual IOracleCommand* Clone() const + { + return new HttpCommand(*this); + } + + void SetMethod(Orthanc::HttpMethod method) + { + method_ = method; + } + + void SetUrl(const std::string& url) + { + url_ = url; + } + + void SetBody(const std::string& body) + { + body_ = body; + } + + void SetBody(const Json::Value& json); + + void SwapBody(std::string& body) + { + body_.swap(body); + } + + void SetHttpHeaders(const HttpHeaders& headers) + { + headers_ = headers; + } + + void SetHttpHeader(const std::string& key, + const std::string& value) + { + headers_[key] = value; + } + + Orthanc::HttpMethod GetMethod() const + { + return method_; + } + + const std::string& GetUrl() const + { + return url_; + } + + const std::string& GetBody() const; + + const HttpHeaders& GetHttpHeaders() const + { + return headers_; + } + + void SetTimeout(unsigned int seconds) + { + timeout_ = seconds; + } + + unsigned int GetTimeout() const + { + return timeout_; + } + + void SetCredentials(const std::string& username, + const std::string& password) + { + username_ = username; + password_ = password; + } + + void ClearCredentials() + { + username_.clear(); + password_.clear(); + } + + bool HasCredentials() const + { + return !username_.empty(); + } + + const std::string& GetUsername() const; + + const std::string& GetPassword() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/IOracle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/IOracle.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IObserver.h" +#include "IOracleCommand.h" + +#include + +namespace OrthancStone +{ + class IOracle : public boost::noncopyable + { + public: + virtual ~IOracle() + { + } + + /** + * Returns "true" iff the command has actually been queued. If + * "false" is returned, the command has been freed, and it won't + * be processed (this is the case if the oracle is stopped). + **/ + virtual bool Schedule(boost::shared_ptr receiver, + IOracleCommand* command) = 0; // Takes ownership + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/IOracleCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/IOracleCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + class IOracleCommand : public boost::noncopyable + { + public: + enum Type + { + Type_GetOrthancImage, + Type_GetOrthancWebViewerJpeg, + Type_Http, + Type_OrthancRestApi, + Type_ParseDicomFromFile, + Type_ParseDicomFromWado, + Type_ReadFile, + Type_Sleep + }; + + virtual ~IOracleCommand() + { + } + + virtual Type GetType() const = 0; + + // This only clones the command, *not* its possibly associated payload + virtual IOracleCommand* Clone() const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/OracleCommandBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/OracleCommandBase.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OracleCommandBase.h" + +#include + +namespace OrthancStone +{ + void OracleCommandBase::AcquirePayload(Orthanc::IDynamicObject* payload) + { + if (payload == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + payload_.reset(payload); + } + } + + + Orthanc::IDynamicObject& OracleCommandBase::GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + LOG(ERROR) << "OracleCommandBase::GetPayload(): (!HasPayload())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + Orthanc::IDynamicObject* OracleCommandBase::ReleasePayload() + { + if (HasPayload()) + { + return payload_.release(); + } + else + { + LOG(ERROR) << "OracleCommandBase::ReleasePayload(): (!HasPayload())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/OracleCommandBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/OracleCommandBase.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOracleCommand.h" + +#include +#include + +#include + +namespace OrthancStone +{ + class OracleCommandBase : public IOracleCommand + { + private: + std::unique_ptr payload_; + + public: + void AcquirePayload(Orthanc::IDynamicObject* payload); + + virtual bool HasPayload() const + { + return (payload_.get() != NULL); + } + + virtual Orthanc::IDynamicObject& GetPayload() const; + + Orthanc::IDynamicObject* ReleasePayload(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/OracleCommandExceptionMessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/OracleCommandExceptionMessage.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "IOracleCommand.h" + +#include + +namespace OrthancStone +{ + class OracleCommandExceptionMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + Orthanc::OrthancException exception_; + + public: + OracleCommandExceptionMessage(const IOracleCommand& command, + const Orthanc::ErrorCode& error) : + OriginMessage(command), + exception_(error) + { + } + + OracleCommandExceptionMessage(const IOracleCommand& command, + const Orthanc::OrthancException& exception) : + OriginMessage(command), + exception_(exception) + { + } + + const Orthanc::OrthancException& GetException() const + { + return exception_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/OrthancRestApiCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/OrthancRestApiCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,75 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrthancRestApiCommand.h" + +#include + +#ifdef _MSC_VER +// 'Json::Reader': Use CharReader and CharReaderBuilder instead +#pragma warning(disable:4996) +#endif + +#include +#include + +namespace OrthancStone +{ + void OrthancRestApiCommand::SuccessMessage::ParseJsonBody(Json::Value& target) const + { + Json::Reader reader; + if (!reader.parse(answer_, target)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + OrthancRestApiCommand::OrthancRestApiCommand() : + method_(Orthanc::HttpMethod_Get), + uri_("/"), + timeout_(600), + applyPlugins_(false) + { + } + + + void OrthancRestApiCommand::SetBody(const Json::Value& json) + { + Json::FastWriter writer; + body_ = writer.write(json); + } + + + const std::string& OrthancRestApiCommand::GetBody() const + { + if (method_ == Orthanc::HttpMethod_Post || + method_ == Orthanc::HttpMethod_Put) + { + return body_; + } + else + { + LOG(ERROR) << "OrthancRestApiCommand::GetBody(): method_ not _Post or _Put"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/OrthancRestApiCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/OrthancRestApiCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,172 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "OracleCommandBase.h" + +#include + +#include +#include + +namespace OrthancStone +{ + class OrthancRestApiCommand : public OracleCommandBase + { + public: + typedef std::map HttpHeaders; + + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const HttpHeaders& headers_; + const std::string& answer_; + + public: + SuccessMessage(const OrthancRestApiCommand& command, + const HttpHeaders& answerHeaders, + const std::string& answer) : + OriginMessage(command), + headers_(answerHeaders), + answer_(answer) + { + } + + const std::string& GetAnswer() const + { + return answer_; + } + + void ParseJsonBody(Json::Value& target) const; + + const HttpHeaders& GetAnswerHeaders() const + { + return headers_; + } + }; + + + private: + Orthanc::HttpMethod method_; + std::string uri_; + std::string body_; + HttpHeaders headers_; + unsigned int timeout_; + bool applyPlugins_; // Only makes sense for Stone as an Orthanc plugin + + OrthancRestApiCommand(const OrthancRestApiCommand& other) : + method_(other.method_), + uri_(other.uri_), + body_(other.body_), + headers_(other.headers_), + timeout_(other.timeout_), + applyPlugins_(other.applyPlugins_) + { + } + + public: + OrthancRestApiCommand(); + + virtual Type GetType() const + { + return Type_OrthancRestApi; + } + + virtual IOracleCommand* Clone() const + { + return new OrthancRestApiCommand(*this); + } + + void SetMethod(Orthanc::HttpMethod method) + { + method_ = method; + } + + void SetUri(const std::string& uri) + { + uri_ = uri; + } + + void SetBody(const std::string& body) + { + body_ = body; + } + + void SetBody(const Json::Value& json); + + void SwapBody(std::string& body) + { + body_.swap(body); + } + + void SetHttpHeaders(const HttpHeaders& headers) + { + headers_ = headers; + } + + void SetHttpHeader(const std::string& key, + const std::string& value) + { + headers_[key] = value; + } + + Orthanc::HttpMethod GetMethod() const + { + return method_; + } + + const std::string& GetUri() const + { + return uri_; + } + + const std::string& GetBody() const; + + const HttpHeaders& GetHttpHeaders() const + { + return headers_; + } + + void SetTimeout(unsigned int seconds) + { + timeout_ = seconds; + } + + unsigned int GetTimeout() const + { + return timeout_; + } + + void SetApplyPlugins(bool applyPlugins) + { + applyPlugins_ = applyPlugins; + } + + bool IsApplyPlugins() const + { + return applyPlugins_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomFromFileCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomFromFileCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParseDicomFromFileCommand.h" + +#include + +#include + +namespace OrthancStone +{ + std::string ParseDicomFromFileCommand::GetDicomDirPath(const std::string& dicomDirPath, + const std::string& file) + { + std::string tmp = file; + +#if !defined(_WIN32) + std::replace(tmp.begin(), tmp.end(), '\\', '/'); +#endif + + boost::filesystem::path base = boost::filesystem::path(dicomDirPath).parent_path(); + + return (base / tmp).string(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomFromFileCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomFromFileCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OracleCommandBase.h" +#include "../Loaders/DicomSource.h" + +#include + +namespace OrthancStone +{ + class ParseDicomFromFileCommand : public OracleCommandBase + { + private: + DicomSource source_; + std::string path_; + bool pixelDataIncluded_; + + ParseDicomFromFileCommand(const ParseDicomFromFileCommand& other) : + source_(other.source_), + path_(other.path_), + pixelDataIncluded_(other.pixelDataIncluded_) + { + } + + public: + ParseDicomFromFileCommand(const DicomSource& source, + const std::string& path) : + source_(source), + path_(path), + pixelDataIncluded_(true) + { + } + + ParseDicomFromFileCommand(const DicomSource& source, + const std::string& dicomDirPath, + const std::string& file) : + source_(source), + path_(GetDicomDirPath(dicomDirPath, file)), + pixelDataIncluded_(true) + { + } + + static std::string GetDicomDirPath(const std::string& dicomDirPath, + const std::string& file); + + virtual Type GetType() const + { + return Type_ParseDicomFromFile; + } + + virtual IOracleCommand* Clone() const + { + return new ParseDicomFromFileCommand(*this); + } + + const DicomSource& GetSource() const + { + return source_; + } + + const std::string& GetPath() const + { + return path_; + } + + bool IsPixelDataIncluded() const + { + return pixelDataIncluded_; + } + + void SetPixelDataIncluded(bool included) + { + pixelDataIncluded_ = included; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomFromWadoCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomFromWadoCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParseDicomFromWadoCommand.h" + +#include + +namespace OrthancStone +{ + ParseDicomFromWadoCommand::ParseDicomFromWadoCommand(const DicomSource& source, + const std::string& sopInstanceUid, + IOracleCommand* restCommand) : + source_(source), + sopInstanceUid_(sopInstanceUid), + restCommand_(restCommand) + { + if (restCommand == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (restCommand_->GetType() != Type_Http && + restCommand_->GetType() != Type_OrthancRestApi) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType); + } + } + + + IOracleCommand* ParseDicomFromWadoCommand::Clone() const + { + assert(restCommand_.get() != NULL); + return new ParseDicomFromWadoCommand(source_, sopInstanceUid_, restCommand_->Clone()); + } + + + const IOracleCommand& ParseDicomFromWadoCommand::GetRestCommand() const + { + assert(restCommand_.get() != NULL); + return *restCommand_; + } + + + ParseDicomFromWadoCommand* ParseDicomFromWadoCommand::Create( + const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const std::string& sopInstanceUid, + bool transcode, + Orthanc::DicomTransferSyntax transferSyntax, + Orthanc::IDynamicObject* payload) + { + std::unique_ptr protection(payload); + + const std::string uri = ("/studies/" + studyInstanceUid + + "/series/" + seriesInstanceUid + + "/instances/" + sopInstanceUid); + + std::string s; + if (transcode) + { + s = Orthanc::GetTransferSyntaxUid(transferSyntax); + } + else + { + s = "*"; // No transcoding, keep source transfer syntax + } + + std::map arguments, headers; + headers["Accept"] = ("multipart/related; type=\"application/dicom\"; transfer-syntax=" + s); + + std::unique_ptr rest( + source.CreateDicomWebCommand(uri, arguments, headers, NULL)); + + std::unique_ptr command( + new ParseDicomFromWadoCommand(source, sopInstanceUid, rest.release())); + + if (protection.get() != NULL) + { + command->AcquirePayload(protection.release()); + } + + return command.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomFromWadoCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomFromWadoCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OracleCommandBase.h" +#include "../Loaders/DicomSource.h" + +#include + +#include + +namespace OrthancStone +{ + class ParseDicomFromWadoCommand : public OracleCommandBase + { + private: + DicomSource source_; + std::string sopInstanceUid_; + std::unique_ptr restCommand_; + + public: + ParseDicomFromWadoCommand(const DicomSource& source, + const std::string& sopInstanceUid, + IOracleCommand* restCommand); + + virtual Type GetType() const + { + return Type_ParseDicomFromWado; + } + + virtual IOracleCommand* Clone() const; + + const DicomSource& GetSource() const + { + return source_; + } + + const std::string& GetSopInstanceUid() const + { + return sopInstanceUid_; + } + + const IOracleCommand& GetRestCommand() const; + + static ParseDicomFromWadoCommand* Create(const DicomSource& source, + const std::string& studyInstanceUid, + const std::string& seriesInstanceUid, + const std::string& sopInstanceUid, + bool transcode, + Orthanc::DicomTransferSyntax transferSyntax, + Orthanc::IDynamicObject* payload); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomSuccessMessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomSuccessMessage.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,107 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParseDicomSuccessMessage.h" + +#include +#include +#include + +namespace OrthancStone +{ + class MultipartHandler : public Orthanc::MultipartStreamReader::IHandler + { + private: + std::unique_ptr dicom_; + size_t size_; + + public: + MultipartHandler() : + size_(0) + { + } + + virtual void HandlePart(const std::map& headers, + const void* part, + size_t size) + { + if (dicom_.get()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "Multiple DICOM instances were contained in a WADO-RS request"); + } + else + { + dicom_.reset(new Orthanc::ParsedDicomFile(part, size)); + size_ = size; + } + } + + Orthanc::ParsedDicomFile* ReleaseDicom() + { + if (dicom_.get()) + { + return dicom_.release(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "WADO-RS request didn't contain any DICOM instance"); + } + } + + size_t GetSize() const + { + return size_; + } + }; + + + Orthanc::ParsedDicomFile* ParseDicomSuccessMessage::ParseWadoAnswer( + size_t& fileSize /* OUT */, + const std::string& answer, + const std::map& headers) + { + std::string contentType, subType, boundary, header; + if (Orthanc::MultipartStreamReader::GetMainContentType(header, headers) && + Orthanc::MultipartStreamReader::ParseMultipartContentType(contentType, subType, boundary, header) && + contentType == "multipart/related" && + subType == "application/dicom") + { + MultipartHandler handler; + + { + Orthanc::MultipartStreamReader reader(boundary); + reader.SetHandler(handler); + reader.AddChunk(answer); + reader.CloseStream(); + } + + fileSize = handler.GetSize(); + return handler.ReleaseDicom(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol, + "Multipart/related answer of application/dicom was expected from DICOMweb server"); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ParseDicomSuccessMessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ParseDicomSuccessMessage.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,97 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#if ORTHANC_ENABLE_DCMTK != 1 +# error Support for DCMTK must be enabled to use ParseDicomFromFileCommand +#endif + +#include "OracleCommandBase.h" +#include "../Messages/IMessageEmitter.h" +#include "../Messages/IObserver.h" + +#include + +namespace Orthanc +{ + class ParsedDicomFile; +} + +namespace OrthancStone +{ + class DicomSource; + + class ParseDicomSuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const DicomSource& source_; + Orthanc::ParsedDicomFile& dicom_; + size_t fileSize_; + bool hasPixelData_; + + public: + ParseDicomSuccessMessage(const OracleCommandBase& command, + const DicomSource& source, + Orthanc::ParsedDicomFile& dicom, + size_t fileSize, + bool hasPixelData) : + OriginMessage(command), + source_(source), + dicom_(dicom), + fileSize_(fileSize), + hasPixelData_(hasPixelData) + { + } + + const DicomSource& GetSource() const + { + return source_; + } + + Orthanc::ParsedDicomFile& GetDicom() const + { + return dicom_; + } + + size_t GetFileSize() const + { + return fileSize_; + } + + bool HasPixelData() const + { + return hasPixelData_; + } + + static Orthanc::ParsedDicomFile* ParseWadoAnswer(size_t& fileSize /* OUT */, + const std::string& answer, + const std::map& headers); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ReadFileCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ReadFileCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "OracleCommandBase.h" + +namespace OrthancStone +{ + class ReadFileCommand : public OracleCommandBase + { + public: + class SuccessMessage : public OriginMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + private: + const std::string& content_; + + public: + SuccessMessage(const ReadFileCommand& command, + const std::string& content) : + OriginMessage(command), + content_(content) + { + } + + const std::string& GetContent() const + { + return content_; + } + }; + + + private: + std::string path_; + + public: + ReadFileCommand(const std::string& path) : + path_(path) + { + } + + virtual Type GetType() const + { + return Type_ReadFile; + } + + virtual IOracleCommand* Clone() const + { + return new ReadFileCommand(path_); + } + + const std::string& GetPath() const + { + return path_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/SleepOracleCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/SleepOracleCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "OracleCommandBase.h" + +namespace OrthancStone +{ + class SleepOracleCommand : public OracleCommandBase + { + private: + unsigned int milliseconds_; + + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, TimeoutMessage, SleepOracleCommand); + + SleepOracleCommand(unsigned int milliseconds) : + milliseconds_(milliseconds) + { + } + + virtual Type GetType() const + { + return Type_Sleep; + } + + virtual IOracleCommand* Clone() const + { + return new SleepOracleCommand(milliseconds_); + } + + unsigned int GetDelay() const + { + return milliseconds_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ThreadedOracle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ThreadedOracle.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,433 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ThreadedOracle.h" + +#include "SleepOracleCommand.h" + +#include +#include + +namespace OrthancStone +{ + class ThreadedOracle::Item : public Orthanc::IDynamicObject + { + private: + boost::weak_ptr receiver_; + std::unique_ptr command_; + + public: + Item(boost::weak_ptr receiver, + IOracleCommand* command) : + receiver_(receiver), + command_(command) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + boost::weak_ptr GetReceiver() + { + return receiver_; + } + + IOracleCommand& GetCommand() + { + assert(command_.get() != NULL); + return *command_; + } + }; + + + class ThreadedOracle::SleepingCommands : public boost::noncopyable + { + private: + class Item + { + private: + boost::weak_ptr receiver_; + std::unique_ptr command_; + boost::posix_time::ptime expiration_; + + public: + Item(boost::weak_ptr receiver, + SleepOracleCommand* command) : + receiver_(receiver), + command_(command) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + expiration_ = (boost::posix_time::microsec_clock::local_time() + + boost::posix_time::milliseconds(command_->GetDelay())); + } + + const boost::posix_time::ptime& GetExpirationTime() const + { + return expiration_; + } + + void Awake(IMessageEmitter& emitter) + { + assert(command_.get() != NULL); + + SleepOracleCommand::TimeoutMessage message(*command_); + emitter.EmitMessage(receiver_, message); + } + }; + + typedef std::list Content; + + boost::mutex mutex_; + Content content_; + + public: + ~SleepingCommands() + { + for (Content::iterator it = content_.begin(); it != content_.end(); ++it) + { + if (*it != NULL) + { + delete *it; + } + } + } + + void Add(boost::weak_ptr receiver, + SleepOracleCommand* command) // Takes ownership + { + boost::mutex::scoped_lock lock(mutex_); + + content_.push_back(new Item(receiver, command)); + } + + void AwakeExpired(IMessageEmitter& emitter) + { + boost::mutex::scoped_lock lock(mutex_); + + const boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); + + Content stillSleeping; + + for (Content::iterator it = content_.begin(); it != content_.end(); ++it) + { + if (*it != NULL && + (*it)->GetExpirationTime() <= now) + { + (*it)->Awake(emitter); + delete *it; + *it = NULL; + } + else + { + stillSleeping.push_back(*it); + } + } + + // Compact the still-sleeping commands + content_ = stillSleeping; + } + }; + + + void ThreadedOracle::Step() + { + std::unique_ptr object(queue_.Dequeue(100)); + + if (object.get() != NULL) + { + Item& item = dynamic_cast(*object); + + if (item.GetCommand().GetType() == IOracleCommand::Type_Sleep) + { + SleepOracleCommand& command = dynamic_cast(item.GetCommand()); + + std::unique_ptr copy(new SleepOracleCommand(command.GetDelay())); + + if (command.HasPayload()) + { + copy->AcquirePayload(command.ReleasePayload()); + } + + sleepingCommands_->Add(item.GetReceiver(), copy.release()); + } + else + { + GenericOracleRunner runner; + + { + boost::mutex::scoped_lock lock(mutex_); + runner.SetOrthanc(orthanc_); + runner.SetRootDirectory(rootDirectory_); + +#if ORTHANC_ENABLE_DCMTK == 1 + if (dicomCache_) + { + runner.SetDicomCache(dicomCache_); + } +#endif + } + + runner.Run(item.GetReceiver(), emitter_, item.GetCommand()); + } + } + } + + + void ThreadedOracle::Worker(ThreadedOracle* that) + { + assert(that != NULL); + + for (;;) + { + { + boost::mutex::scoped_lock lock(that->mutex_); + if (that->state_ != State_Running) + { + return; + } + } + + that->Step(); + } + } + + + void ThreadedOracle::SleepingWorker(ThreadedOracle* that) + { + assert(that != NULL); + + for (;;) + { + { + boost::mutex::scoped_lock lock(that->mutex_); + if (that->state_ != State_Running) + { + return; + } + } + + that->sleepingCommands_->AwakeExpired(that->emitter_); + + boost::this_thread::sleep(boost::posix_time::milliseconds(that->sleepingTimeResolution_)); + } + } + + + void ThreadedOracle::StopInternal() + { + { + boost::mutex::scoped_lock lock(mutex_); + + if (state_ == State_Setup || + state_ == State_Stopped) + { + return; + } + else + { + state_ = State_Stopped; + } + } + + if (sleepingWorker_.joinable()) + { + sleepingWorker_.join(); + } + + for (size_t i = 0; i < workers_.size(); i++) + { + if (workers_[i] != NULL) + { + if (workers_[i]->joinable()) + { + workers_[i]->join(); + } + + delete workers_[i]; + } + } + } + + + ThreadedOracle::ThreadedOracle(IMessageEmitter& emitter) : + emitter_(emitter), + rootDirectory_("."), + state_(State_Setup), + workers_(4), + sleepingCommands_(new SleepingCommands), + sleepingTimeResolution_(50) // By default, time resolution of 50ms + { + } + + + ThreadedOracle::~ThreadedOracle() + { + if (state_ == State_Running) + { + LOG(ERROR) << "The threaded oracle is still running, explicit call to " + << "Stop() is mandatory to avoid crashes"; + } + + try + { + StopInternal(); + } + catch (Orthanc::OrthancException& e) + { + LOG(ERROR) << "Exception while stopping the threaded oracle: " << e.What(); + } + catch (...) + { + LOG(ERROR) << "Native exception while stopping the threaded oracle"; + } + } + + + void ThreadedOracle::SetOrthancParameters(const Orthanc::WebServiceParameters& orthanc) + { + boost::mutex::scoped_lock lock(mutex_); + orthanc_ = orthanc; + } + + + void ThreadedOracle::SetRootDirectory(const std::string& rootDirectory) + { + boost::mutex::scoped_lock lock(mutex_); + rootDirectory_ = rootDirectory; + } + + + void ThreadedOracle::SetThreadsCount(unsigned int count) + { + boost::mutex::scoped_lock lock(mutex_); + + if (count <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else if (state_ != State_Setup) + { + LOG(ERROR) << "ThreadedOracle::SetThreadsCount(): (state_ != State_Setup)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + workers_.resize(count); + } + } + + + void ThreadedOracle::SetSleepingTimeResolution(unsigned int milliseconds) + { + boost::mutex::scoped_lock lock(mutex_); + + if (milliseconds <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else if (state_ != State_Setup) + { + LOG(ERROR) << "ThreadedOracle::SetSleepingTimeResolution(): (state_ != State_Setup)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + sleepingTimeResolution_ = milliseconds; + } + } + + + void ThreadedOracle::SetDicomCacheSize(size_t size) + { +#if ORTHANC_ENABLE_DCMTK == 1 + boost::mutex::scoped_lock lock(mutex_); + + if (state_ != State_Setup) + { + LOG(ERROR) << "ThreadedOracle::SetDicomCacheSize(): (state_ != State_Setup)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + if (size == 0) + { + dicomCache_.reset(); + } + else + { + dicomCache_.reset(new ParsedDicomCache(size)); + } + } +#endif + } + + + void ThreadedOracle::Start() + { + boost::mutex::scoped_lock lock(mutex_); + + if (state_ != State_Setup) + { + LOG(ERROR) << "ThreadedOracle::Start(): (state_ != State_Setup)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + LOG(INFO) << "Starting oracle with " << workers_.size() << " worker threads"; + state_ = State_Running; + + for (unsigned int i = 0; i < workers_.size(); i++) + { + workers_[i] = new boost::thread(Worker, this); + } + + sleepingWorker_ = boost::thread(SleepingWorker, this); + } + } + + + bool ThreadedOracle::Schedule(boost::shared_ptr receiver, + IOracleCommand* command) + { + std::unique_ptr item(new Item(receiver, command)); + + { + boost::mutex::scoped_lock lock(mutex_); + + if (state_ == State_Running) + { + //LOG(INFO) << "New oracle command queued"; + queue_.Enqueue(item.release()); + return true; + } + else + { + LOG(TRACE) << "Command not enqueued, as the oracle has stopped"; + return false; + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/ThreadedOracle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/ThreadedOracle.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,112 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include // To have the macros properly defined + +#if !defined(ORTHANC_ENABLE_THREADS) +# error The macro ORTHANC_ENABLE_THREADS must be defined +#endif + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#if ORTHANC_ENABLE_THREADS != 1 +# error This file can only compiled for native targets +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "../Toolbox/ParsedDicomCache.h" +#endif + +#include "IOracle.h" +#include "GenericOracleRunner.h" +#include "../Messages/IMessageEmitter.h" + +#include + + +namespace OrthancStone +{ + class ThreadedOracle : public IOracle + { + private: + enum State + { + State_Setup, + State_Running, + State_Stopped + }; + + class Item; + class SleepingCommands; + + IMessageEmitter& emitter_; + Orthanc::WebServiceParameters orthanc_; + std::string rootDirectory_; + Orthanc::SharedMessageQueue queue_; + State state_; + boost::mutex mutex_; + std::vector workers_; + boost::shared_ptr sleepingCommands_; + boost::thread sleepingWorker_; + unsigned int sleepingTimeResolution_; + +#if ORTHANC_ENABLE_DCMTK == 1 + boost::shared_ptr dicomCache_; +#endif + + void Step(); + + static void Worker(ThreadedOracle* that); + + static void SleepingWorker(ThreadedOracle* that); + + void StopInternal(); + + public: + ThreadedOracle(IMessageEmitter& emitter); + + virtual ~ThreadedOracle(); + + void SetOrthancParameters(const Orthanc::WebServiceParameters& orthanc); + + void SetRootDirectory(const std::string& rootDirectory); + + void SetThreadsCount(unsigned int count); + + void SetSleepingTimeResolution(unsigned int milliseconds); + + void SetDicomCacheSize(size_t size); + + void Start(); + + void Stop() + { + StopInternal(); + } + + virtual bool Schedule(boost::shared_ptr receiver, + IOracleCommand* command) ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/WebAssemblyOracle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/WebAssemblyOracle.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,817 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebAssemblyOracle.h" + +#include "OracleCommandExceptionMessage.h" +#include "SleepOracleCommand.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "ParseDicomSuccessMessage.h" +static unsigned int BUCKET_SOP = 1; +#endif + +#include "GetOrthancImageCommand.h" +#include "GetOrthancWebViewerJpegCommand.h" +#include "HttpCommand.h" +#include "OrthancRestApiCommand.h" +#include "ParseDicomFromWadoCommand.h" + +#include +#include + +#include +#include +#include + +namespace OrthancStone +{ + class WebAssemblyOracle::TimeoutContext + { + private: + WebAssemblyOracle& oracle_; + boost::weak_ptr receiver_; + std::unique_ptr command_; + + public: + TimeoutContext(WebAssemblyOracle& oracle, + boost::weak_ptr receiver, + IOracleCommand* command) : + oracle_(oracle), + receiver_(receiver) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + command_.reset(dynamic_cast(command)); + } + } + + void EmitMessage() + { + assert(command_.get() != NULL); + + SleepOracleCommand::TimeoutMessage message(*command_); + oracle_.EmitMessage(receiver_, message); + } + + static void Callback(void *userData) + { + std::unique_ptr context(reinterpret_cast(userData)); + context->EmitMessage(); + } + }; + + + /** + This object is created on the heap for every http request. + It is deleted in the success (or error) callbacks. + + This object references the receiver of the request. Since this is a raw + reference, we need additional checks to make sure we send the response to + the same object, for the object can be deleted and a new one recreated at the + same address (it often happens in the [single-threaded] browser context). + */ + class WebAssemblyOracle::FetchContext : public boost::noncopyable + { + private: + WebAssemblyOracle& oracle_; + boost::weak_ptr receiver_; + std::unique_ptr command_; + std::string expectedContentType_; + + public: + FetchContext(WebAssemblyOracle& oracle, + boost::weak_ptr receiver, + IOracleCommand* command, + const std::string& expectedContentType) : + oracle_(oracle), + receiver_(receiver), + command_(command), + expectedContentType_(expectedContentType) + { + if (Orthanc::Logging::IsTraceLevelEnabled()) + { + // Calling "receiver.lock()" is expensive, hence the quick check if TRACE is enabled + LOG(TRACE) << "WebAssemblyOracle::FetchContext::FetchContext() | " + << "receiver address = " << std::hex << receiver.lock().get(); + } + + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + const std::string& GetExpectedContentType() const + { + return expectedContentType_; + } + + IMessageEmitter& GetEmitter() const + { + return oracle_; + } + + boost::weak_ptr GetReceiver() const + { + return receiver_; + } + + void EmitMessage(const IMessage& message) + { + if (Orthanc::Logging::IsTraceLevelEnabled()) + { + // Calling "receiver_.lock()" is expensive, hence the quick check if TRACE is enabled + LOG(TRACE) << "WebAssemblyOracle::FetchContext::EmitMessage receiver_ = " + << std::hex << receiver_.lock().get() << std::dec; + } + + oracle_.EmitMessage(receiver_, message); + } + + IOracleCommand& GetCommand() const + { + return *command_; + } + + template + const T& GetTypedCommand() const + { + return dynamic_cast(*command_); + } + +#if ORTHANC_ENABLE_DCMTK == 1 + void StoreInCache(const std::string& sopInstanceUid, + std::unique_ptr& dicom, + size_t fileSize) + { + if (oracle_.dicomCache_.get()) + { + // Store it into the cache for future use + oracle_.dicomCache_->Acquire(BUCKET_SOP, sopInstanceUid, + dicom.release(), fileSize, true); + } + } +#endif + + static void SuccessCallback(emscripten_fetch_t *fetch) + { + /** + * Firstly, make a local copy of the fetched information, and + * free data associated with the fetch. + **/ + + if (fetch->userData == NULL) + { + LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback fetch->userData is NULL!!!!!!!"; + return; + } + + std::unique_ptr context(reinterpret_cast(fetch->userData)); + + std::string answer; + if (fetch->numBytes > 0) + { + answer.assign(fetch->data, fetch->numBytes); + } + + + /** + * Retrieving the headers of the HTTP answer. + **/ + HttpHeaders headers; + +#if (__EMSCRIPTEN_major__ < 1 || \ + (__EMSCRIPTEN_major__ == 1 && __EMSCRIPTEN_minor__ < 38) || \ + (__EMSCRIPTEN_major__ == 1 && __EMSCRIPTEN_minor__ == 38 && __EMSCRIPTEN_tiny__ < 37)) +# warning Consider upgrading Emscripten to a version above 1.38.37, incomplete support of Fetch API + + /** + * HACK - If emscripten < 1.38.37, the fetch API does not + * contain a way to retrieve the HTTP headers of the answer. We + * make the assumption that the "Content-Type" header of the + * response is the same as the "Accept" header of the + * query. This is fixed thanks to the + * "emscripten_fetch_get_response_headers()" function that was + * added to "fetch.h" at emscripten-1.38.37 on 2019-06-26. + * + * https://github.com/emscripten-core/emscripten/blob/1.38.37/system/include/emscripten/fetch.h + * https://github.com/emscripten-core/emscripten/pull/8486 + **/ + if (fetch->userData != NULL) + { + if (!context->GetExpectedContentType().empty()) + { + headers["Content-Type"] = context->GetExpectedContentType(); + } + } +#else + { + size_t size = emscripten_fetch_get_response_headers_length(fetch); + + std::string plainHeaders(size + 1, '\0'); + emscripten_fetch_get_response_headers(fetch, &plainHeaders[0], size + 1); + + std::vector tokens; + Orthanc::Toolbox::TokenizeString(tokens, plainHeaders, '\n'); + + for (size_t i = 0; i < tokens.size(); i++) + { + size_t p = tokens[i].find(':'); + if (p != std::string::npos) + { + std::string key = Orthanc::Toolbox::StripSpaces(tokens[i].substr(0, p)); + std::string value = Orthanc::Toolbox::StripSpaces(tokens[i].substr(p + 1)); + headers[key] = value; + } + } + } +#endif + + LOG(TRACE) << "About to call emscripten_fetch_close"; + emscripten_fetch_close(fetch); + LOG(TRACE) << "Successfully called emscripten_fetch_close"; + + /** + * Secondly, use the retrieved data. + * IMPORTANT NOTE: the receiver might be dead. This is prevented + * by the object responsible for zombie check, later on. + **/ + try + { + if (context.get() == NULL) + { + LOG(ERROR) << "WebAssemblyOracle::FetchContext::SuccessCallback: (context.get() == NULL)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + switch (context->GetCommand().GetType()) + { + case IOracleCommand::Type_Http: + { + HttpCommand::SuccessMessage message(context->GetTypedCommand(), headers, answer); + context->EmitMessage(message); + break; + } + + case IOracleCommand::Type_OrthancRestApi: + { + LOG(TRACE) << "WebAssemblyOracle::FetchContext::SuccessCallback. About to call context->EmitMessage(message);"; + OrthancRestApiCommand::SuccessMessage message + (context->GetTypedCommand(), headers, answer); + context->EmitMessage(message); + break; + } + + case IOracleCommand::Type_GetOrthancImage: + { + context->GetTypedCommand().ProcessHttpAnswer + (context->GetReceiver(), context->GetEmitter(), answer, headers); + break; + } + + case IOracleCommand::Type_GetOrthancWebViewerJpeg: + { + context->GetTypedCommand().ProcessHttpAnswer + (context->GetReceiver(), context->GetEmitter(), answer); + break; + } + + case IOracleCommand::Type_ParseDicomFromWado: + { +#if ORTHANC_ENABLE_DCMTK == 1 + const ParseDicomFromWadoCommand& command = + context->GetTypedCommand(); + + size_t fileSize; + std::unique_ptr dicom + (ParseDicomSuccessMessage::ParseWadoAnswer(fileSize, answer, headers)); + + { + ParseDicomSuccessMessage message(command, command.GetSource(), *dicom, fileSize, true); + context->EmitMessage(message); + } + + context->StoreInCache(command.GetSopInstanceUid(), dicom, fileSize); +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); +#endif + break; + } + + default: + LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle (in SuccessCallback): " + << context->GetCommand().GetType(); + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + catch (Orthanc::OrthancException& e) + { + LOG(INFO) << "Error while processing a fetch answer in the oracle: " << e.What(); + + { + OracleCommandExceptionMessage message(context->GetCommand(), e); + context->EmitMessage(message); + } + } + } + + static void FailureCallback(emscripten_fetch_t *fetch) + { + std::unique_ptr context(reinterpret_cast(fetch->userData)); + + { + const size_t kEmscriptenStatusTextSize = sizeof(emscripten_fetch_t::statusText); + char message[kEmscriptenStatusTextSize + 1]; + memcpy(message, fetch->statusText, kEmscriptenStatusTextSize); + message[kEmscriptenStatusTextSize] = 0; + + /*LOG(ERROR) << "Fetching " << fetch->url + << " failed, HTTP failure status code: " << fetch->status + << " | statusText = " << message + << " | numBytes = " << fetch->numBytes + << " | totalBytes = " << fetch->totalBytes + << " | readyState = " << fetch->readyState;*/ + } + + { + OracleCommandExceptionMessage message + (context->GetCommand(), Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol)); + context->EmitMessage(message); + } + + /** + * TODO - The following code leads to an infinite recursion, at + * least with Firefox running on incognito mode => WHY? + **/ + emscripten_fetch_close(fetch); // Also free data on failure. + } + }; + + + + class WebAssemblyOracle::FetchCommand : public boost::noncopyable + { + private: + WebAssemblyOracle& oracle_; + boost::weak_ptr receiver_; + std::unique_ptr command_; + Orthanc::HttpMethod method_; + std::string url_; + std::string body_; + HttpHeaders headers_; + unsigned int timeout_; + std::string expectedContentType_; + bool hasCredentials_; + std::string username_; + std::string password_; + + public: + FetchCommand(WebAssemblyOracle& oracle, + boost::weak_ptr receiver, + IOracleCommand* command) : + oracle_(oracle), + receiver_(receiver), + command_(command), + method_(Orthanc::HttpMethod_Get), + timeout_(0), + hasCredentials_(false) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + void SetMethod(Orthanc::HttpMethod method) + { + method_ = method; + } + + void SetUrl(const std::string& url) + { + url_ = url; + } + + void SetBody(std::string& body /* will be swapped */) + { + body_.swap(body); + } + + void AddHttpHeaders(const HttpHeaders& headers) + { + for (HttpHeaders::const_iterator it = headers.begin(); it != headers.end(); ++it) + { + headers_[it->first] = it->second; + } + } + + void SetTimeout(unsigned int timeout) + { + timeout_ = timeout; + } + + void SetCredentials(const std::string& username, + const std::string& password) + { + hasCredentials_ = true; + username_ = username; + password_ = password; + } + + void Execute() + { + if (command_.get() == NULL) + { + // Cannot call Execute() twice + LOG(ERROR) << "WebAssemblyOracle::Execute(): (command_.get() == NULL)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + emscripten_fetch_attr_t attr; + emscripten_fetch_attr_init(&attr); + + const char* method; + + switch (method_) + { + case Orthanc::HttpMethod_Get: + method = "GET"; + break; + + case Orthanc::HttpMethod_Post: + method = "POST"; + break; + + case Orthanc::HttpMethod_Delete: + method = "DELETE"; + break; + + case Orthanc::HttpMethod_Put: + method = "PUT"; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + strcpy(attr.requestMethod, method); + + attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY | EMSCRIPTEN_FETCH_REPLACE; + attr.onsuccess = FetchContext::SuccessCallback; + attr.onerror = FetchContext::FailureCallback; + attr.timeoutMSecs = timeout_ * 1000; + + if (hasCredentials_) + { + attr.withCredentials = EM_TRUE; + attr.userName = username_.c_str(); + attr.password = password_.c_str(); + } + + std::vector headers; + headers.reserve(2 * headers_.size() + 1); + + std::string expectedContentType; + + for (HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); ++it) + { + std::string key; + Orthanc::Toolbox::ToLowerCase(key, it->first); + + if (key == "accept") + { + expectedContentType = it->second; + } + + if (key != "accept-encoding") // Web browsers forbid the modification of this HTTP header + { + headers.push_back(it->first.c_str()); + headers.push_back(it->second.c_str()); + } + } + + headers.push_back(NULL); // Termination of the array of HTTP headers + + attr.requestHeaders = &headers[0]; + + char* requestData = NULL; + if (!body_.empty()) + requestData = reinterpret_cast(malloc(body_.size())); + + try + { + if (!body_.empty()) + { + memcpy(requestData, &(body_[0]), body_.size()); + attr.requestDataSize = body_.size(); + attr.requestData = requestData; + } + attr.userData = new FetchContext(oracle_, receiver_, command_.release(), expectedContentType); + + // Must be the last call to prevent memory leak on error + emscripten_fetch(&attr, url_.c_str()); + } + catch(...) + { + if(requestData != NULL) + free(requestData); + throw; + } + } + }; + + + void WebAssemblyOracle::SetOrthancUrl(FetchCommand& command, + const std::string& uri) const + { + if (isLocalOrthanc_) + { + command.SetUrl(localOrthancRoot_ + uri); + } + else + { + command.SetUrl(remoteOrthanc_.GetUrl() + uri); + command.AddHttpHeaders(remoteOrthanc_.GetHttpHeaders()); + + if (!remoteOrthanc_.GetUsername().empty()) + { + command.SetCredentials(remoteOrthanc_.GetUsername(), remoteOrthanc_.GetPassword()); + } + } + } + + + void WebAssemblyOracle::Execute(boost::weak_ptr receiver, + HttpCommand* command) + { + FetchCommand fetch(*this, receiver, command); + + fetch.SetMethod(command->GetMethod()); + fetch.SetUrl(command->GetUrl()); + fetch.AddHttpHeaders(command->GetHttpHeaders()); + fetch.SetTimeout(command->GetTimeout()); + + if (command->GetMethod() == Orthanc::HttpMethod_Post || + command->GetMethod() == Orthanc::HttpMethod_Put) + { + std::string body; + command->SwapBody(body); + fetch.SetBody(body); + } + + fetch.Execute(); + } + + + void WebAssemblyOracle::Execute(boost::weak_ptr receiver, + OrthancRestApiCommand* command) + { + try + { + //LOG(TRACE) << "*********** WebAssemblyOracle::Execute."; + //LOG(TRACE) << "WebAssemblyOracle::Execute | command = " << command; + FetchCommand fetch(*this, receiver, command); + + fetch.SetMethod(command->GetMethod()); + SetOrthancUrl(fetch, command->GetUri()); + fetch.AddHttpHeaders(command->GetHttpHeaders()); + fetch.SetTimeout(command->GetTimeout()); + + if (command->GetMethod() == Orthanc::HttpMethod_Post || + command->GetMethod() == Orthanc::HttpMethod_Put) + { + std::string body; + command->SwapBody(body); + fetch.SetBody(body); + } + + fetch.Execute(); + //LOG(TRACE) << "*********** successful end of WebAssemblyOracle::Execute."; + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in WebAssemblyOracle::Execute: " << e.What(); + } + //LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; + throw; + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in WebAssemblyOracle::Execute: " << e.what(); +// LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; + throw; + } + catch (...) + { + LOG(ERROR) << "Unknown exception in WebAssemblyOracle::Execute"; +// LOG(TRACE) << "*********** failing end of WebAssemblyOracle::Execute."; + throw; + } + } + + + void WebAssemblyOracle::Execute(boost::weak_ptr receiver, + GetOrthancImageCommand* command) + { + FetchCommand fetch(*this, receiver, command); + + SetOrthancUrl(fetch, command->GetUri()); + fetch.AddHttpHeaders(command->GetHttpHeaders()); + fetch.SetTimeout(command->GetTimeout()); + + fetch.Execute(); + } + + + void WebAssemblyOracle::Execute(boost::weak_ptr receiver, + GetOrthancWebViewerJpegCommand* command) + { + FetchCommand fetch(*this, receiver, command); + + SetOrthancUrl(fetch, command->GetUri()); + fetch.AddHttpHeaders(command->GetHttpHeaders()); + fetch.SetTimeout(command->GetTimeout()); + + fetch.Execute(); + } + + + void WebAssemblyOracle::Execute(boost::weak_ptr receiver, + ParseDicomFromWadoCommand* command) + { + std::unique_ptr protection(command); + +#if ORTHANC_ENABLE_DCMTK == 1 + if (dicomCache_.get()) + { + ParsedDicomCache::Reader reader(*dicomCache_, BUCKET_SOP, protection->GetSopInstanceUid()); + if (reader.IsValid() && + reader.HasPixelData()) + { + // Reuse the DICOM file from the cache + ParseDicomSuccessMessage message(*protection, protection->GetSource(), reader.GetDicom(), + reader.GetFileSize(), reader.HasPixelData()); + EmitMessage(receiver, message); + return; + } + } +#endif + + switch (command->GetRestCommand().GetType()) + { + case IOracleCommand::Type_Http: + { + const HttpCommand& rest = + dynamic_cast(protection->GetRestCommand()); + + FetchCommand fetch(*this, receiver, protection.release()); + + fetch.SetMethod(rest.GetMethod()); + fetch.SetUrl(rest.GetUrl()); + fetch.AddHttpHeaders(rest.GetHttpHeaders()); + fetch.SetTimeout(rest.GetTimeout()); + + if (rest.GetMethod() == Orthanc::HttpMethod_Post || + rest.GetMethod() == Orthanc::HttpMethod_Put) + { + std::string body = rest.GetBody(); + fetch.SetBody(body); + } + + fetch.Execute(); + break; + } + + case IOracleCommand::Type_OrthancRestApi: + { + const OrthancRestApiCommand& rest = + dynamic_cast(protection->GetRestCommand()); + + FetchCommand fetch(*this, receiver, protection.release()); + + fetch.SetMethod(rest.GetMethod()); + SetOrthancUrl(fetch, rest.GetUri()); + fetch.AddHttpHeaders(rest.GetHttpHeaders()); + fetch.SetTimeout(rest.GetTimeout()); + + if (rest.GetMethod() == Orthanc::HttpMethod_Post || + rest.GetMethod() == Orthanc::HttpMethod_Put) + { + std::string body = rest.GetBody(); + fetch.SetBody(body); + } + + fetch.Execute(); + break; + } + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + bool WebAssemblyOracle::Schedule(boost::shared_ptr receiver, + IOracleCommand* command) + { + LOG(TRACE) << "WebAssemblyOracle::Schedule : receiver = " + << std::hex << receiver.get(); + + std::unique_ptr protection(command); + + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + switch (command->GetType()) + { + case IOracleCommand::Type_Http: + Execute(receiver, dynamic_cast(protection.release())); + break; + + case IOracleCommand::Type_OrthancRestApi: + Execute(receiver, dynamic_cast(protection.release())); + break; + + case IOracleCommand::Type_GetOrthancImage: + Execute(receiver, dynamic_cast(protection.release())); + break; + + case IOracleCommand::Type_GetOrthancWebViewerJpeg: + break; + + case IOracleCommand::Type_Sleep: + { + unsigned int timeoutMS = dynamic_cast(command)->GetDelay(); + emscripten_set_timeout(TimeoutContext::Callback, timeoutMS, + new TimeoutContext(*this, receiver, protection.release())); + break; + } + + case IOracleCommand::Type_ParseDicomFromWado: +#if ORTHANC_ENABLE_DCMTK == 1 + Execute(receiver, dynamic_cast(protection.release())); +#else + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, + "DCMTK must be enabled to parse DICOM files"); +#endif + break; + + default: + LOG(ERROR) << "Command type not implemented by the WebAssembly Oracle (in Schedule): " + << command->GetType(); + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + return true; + } + + + void WebAssemblyOracle::SetDicomCacheSize(size_t size) + { +#if ORTHANC_ENABLE_DCMTK == 1 + if (size == 0) + { + dicomCache_.reset(); + } + else + { + dicomCache_.reset(new ParsedDicomCache(size)); + } +#else + LOG(INFO) << "DCMTK support is disabled, the DICOM cache is disabled"; +#endif + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Oracle/WebAssemblyOracle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Oracle/WebAssemblyOracle.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,126 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_WASM) +# error The macro ORTHANC_ENABLE_WASM must be defined +#endif + +#if ORTHANC_ENABLE_WASM != 1 +# error This file can only compiled for WebAssembly +#endif + +#include "../Messages/IObservable.h" +#include "../Messages/IMessageEmitter.h" +#include "IOracle.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "../Toolbox/ParsedDicomCache.h" +#endif + +#include + +#include + +namespace OrthancStone +{ + class GetOrthancImageCommand; + class GetOrthancWebViewerJpegCommand; + class HttpCommand; + class OrthancRestApiCommand; + class ParseDicomFromWadoCommand; + + class WebAssemblyOracle : + public IOracle, + public IMessageEmitter + { + private: + typedef std::map HttpHeaders; + + class TimeoutContext; + class FetchContext; + class FetchCommand; + + void SetOrthancUrl(FetchCommand& command, + const std::string& uri) const; + + void Execute(boost::weak_ptr receiver, + HttpCommand* command); + + void Execute(boost::weak_ptr receiver, + OrthancRestApiCommand* command); + + void Execute(boost::weak_ptr receiver, + GetOrthancImageCommand* command); + + void Execute(boost::weak_ptr receiver, + GetOrthancWebViewerJpegCommand* command); + + void Execute(boost::weak_ptr receiver, + ParseDicomFromWadoCommand* command); + + IObservable oracleObservable_; + bool isLocalOrthanc_; + std::string localOrthancRoot_; + Orthanc::WebServiceParameters remoteOrthanc_; + +#if ORTHANC_ENABLE_DCMTK == 1 + std::unique_ptr dicomCache_; +#endif + + public: + WebAssemblyOracle() : + isLocalOrthanc_(false) + { + } + + virtual void EmitMessage(boost::weak_ptr observer, + const IMessage& message) ORTHANC_OVERRIDE + { + oracleObservable_.EmitMessage(observer, message); + } + + virtual bool Schedule(boost::shared_ptr receiver, + IOracleCommand* command) ORTHANC_OVERRIDE; + + IObservable& GetOracleObservable() + { + return oracleObservable_; + } + + void SetLocalOrthanc(const std::string& root) + { + isLocalOrthanc_ = true; + localOrthancRoot_ = root; + } + + void SetRemoteOrthanc(const Orthanc::WebServiceParameters& orthanc) + { + isLocalOrthanc_ = false; + remoteOrthanc_ = orthanc; + } + + void SetDicomCacheSize(size_t size); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/OrthancStone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/OrthancStone.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,18 @@ +#pragma once + +/** + * Besides the "pragma once" above that only protects this file, + * define a macro to prevent including different versions of + * "OrthancStone.h" + **/ +#ifndef __ORTHANC_STONE_H +#define __ORTHANC_STONE_H + +#include + +#if ORTHANC_ENABLE_OPENGL == 1 +# define GL_GLEXT_PROTOTYPES 1 +#endif + + +#endif /* __ORTHANC_STONE_H */ diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/CairoCompositor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/CairoCompositor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,184 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoCompositor.h" + +#include "Internals/CairoColorTextureRenderer.h" +#include "Internals/CairoFloatTextureRenderer.h" +#include "Internals/CairoInfoPanelRenderer.h" +#include "Internals/CairoLookupTableTextureRenderer.h" +#include "Internals/CairoPolylineRenderer.h" +#include "Internals/CairoTextRenderer.h" + +#include + +namespace OrthancStone +{ + cairo_t* CairoCompositor::GetCairoContext() + { + if (context_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return context_->GetObject(); + } + } + + Internals::CompositorHelper::ILayerRenderer* CairoCompositor::Create(const ISceneLayer& layer) + { + switch (layer.GetType()) + { + case ISceneLayer::Type_Polyline: + return new Internals::CairoPolylineRenderer(*this, layer); + + case ISceneLayer::Type_InfoPanel: + return new Internals::CairoInfoPanelRenderer(*this, layer); + + case ISceneLayer::Type_ColorTexture: + return new Internals::CairoColorTextureRenderer(*this, layer); + + case ISceneLayer::Type_FloatTexture: + return new Internals::CairoFloatTextureRenderer(*this, layer); + + case ISceneLayer::Type_LookupTableTexture: + return new Internals::CairoLookupTableTextureRenderer(*this, layer); + + case ISceneLayer::Type_Text: + { + const TextSceneLayer& l = dynamic_cast(layer); + + Fonts::const_iterator found = fonts_.find(l.GetFontIndex()); + if (found == fonts_.end()) + { + return NULL; + } + else + { + assert(found->second != NULL); + return new Internals::CairoTextRenderer(*this, *found->second, l); + } + } + + default: + return NULL; + } + } + + + CairoCompositor::CairoCompositor(unsigned int canvasWidth, + unsigned int canvasHeight) + { + ResetScene(); + UpdateSize(canvasWidth, canvasHeight); + } + + void CairoCompositor::UpdateSize(unsigned int canvasWidth, + unsigned int canvasHeight) + { + canvas_.SetSize(canvasWidth, canvasHeight, false); + } + + CairoCompositor::~CairoCompositor() + { + for (Fonts::iterator it = fonts_.begin(); it != fonts_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + } + + + void CairoCompositor::SetFont(size_t index, + GlyphBitmapAlphabet* dict) // Takes ownership + { + if (dict == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + std::unique_ptr protection(dict); + + Fonts::iterator found = fonts_.find(index); + + if (found == fonts_.end()) + { + fonts_[index] = protection.release(); + } + else + { + assert(found->second != NULL); + delete found->second; + + found->second = protection.release(); + } + } + } + + +#if ORTHANC_ENABLE_LOCALE == 1 + void CairoCompositor::SetFont(size_t index, + const std::string& ttf, + unsigned int fontSize, + Orthanc::Encoding codepage) + { + FontRenderer renderer; + renderer.LoadFont(ttf, fontSize); + + std::unique_ptr alphabet(new GlyphBitmapAlphabet); + alphabet->LoadCodepage(renderer, codepage); + + SetFont(index, alphabet.release()); + } +#endif + + + void CairoCompositor::Refresh(const Scene2D& scene) + { + context_.reset(new CairoContext(canvas_)); + + // https://www.cairographics.org/FAQ/#clear_a_surface + cairo_set_source_rgba(context_->GetObject(), 0, 0, 0, 255); + cairo_paint(context_->GetObject()); + + helper_->Refresh(scene, canvas_.GetWidth(), canvas_.GetHeight()); + context_.reset(); + } + + + Orthanc::ImageAccessor* CairoCompositor::RenderText(size_t fontIndex, + const std::string& utf8) const + { + Fonts::const_iterator found = fonts_.find(fontIndex); + + if (found == fonts_.end()) + { + return NULL; + } + else + { + assert(found->second != NULL); + return found->second->RenderText(utf8); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/CairoCompositor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/CairoCompositor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,101 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ICompositor.h" +#include "../Fonts/GlyphBitmapAlphabet.h" +#include "../Wrappers/CairoContext.h" +#include "Internals/CompositorHelper.h" +#include "Internals/ICairoContextProvider.h" + +namespace OrthancStone +{ + class CairoCompositor : + public ICompositor, + private Internals::CompositorHelper::IRendererFactory, + private Internals::ICairoContextProvider + { + private: + typedef std::map Fonts; + + std::unique_ptr helper_; + CairoSurface canvas_; + Fonts fonts_; + + // Only valid during a call to "Refresh()" + std::unique_ptr context_; + + virtual cairo_t* GetCairoContext() ORTHANC_OVERRIDE; + + virtual Internals::CompositorHelper::ILayerRenderer* Create(const ISceneLayer& layer) ORTHANC_OVERRIDE; + + public: + CairoCompositor(unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual ~CairoCompositor(); + + const CairoSurface& GetCanvas() const + { + return canvas_; + } + + virtual void RefreshCanvasSize() ORTHANC_OVERRIDE + { + // The canvas size is constant in Cairo, except if + // "UpdateSize()" is called + } + + virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE + { + return canvas_.GetWidth(); + } + + virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE + { + return canvas_.GetHeight(); + } + + void SetFont(size_t index, + GlyphBitmapAlphabet* dict); // Takes ownership + +#if ORTHANC_ENABLE_LOCALE == 1 + virtual void SetFont(size_t index, + const std::string& ttf, + unsigned int fontSize, + Orthanc::Encoding codepage) ORTHANC_OVERRIDE; +#endif + + virtual void Refresh(const Scene2D& scene) ORTHANC_OVERRIDE; + + virtual void ResetScene() ORTHANC_OVERRIDE + { + helper_.reset(new Internals::CompositorHelper(*this)); + } + + void UpdateSize(unsigned int canvasWidth, + unsigned int canvasHeight); + + Orthanc::ImageAccessor* RenderText(size_t fontIndex, + const std::string& utf8) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Color.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Color.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,82 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + class Color + { + private: + uint8_t red_; + uint8_t green_; + uint8_t blue_; + + public: + Color() : + red_(255), + green_(255), + blue_(255) + { + } + + Color(uint8_t red, + uint8_t green, + uint8_t blue) : + red_(red), + green_(green), + blue_(blue) + { + } + + uint8_t GetRed() const + { + return red_; + } + + uint8_t GetGreen() const + { + return green_; + } + + uint8_t GetBlue() const + { + return blue_; + } + + float GetRedAsFloat() const + { + return static_cast(red_) / 255.0f; + } + + float GetGreenAsFloat() const + { + return static_cast(green_) / 255.0f; + } + + float GetBlueAsFloat() const + { + return static_cast(blue_) / 255.0f; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ColorSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ColorSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,75 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ISceneLayer.h" +#include "Color.h" + +#include // For ORTHANC_OVERRIDE + +namespace OrthancStone +{ + // TODO - Is this needed? + class ColorSceneLayer : public ISceneLayer + { + private: + Color color_; + uint64_t revision_; + + protected: + void BumpRevision() + { + // this is *not* thread-safe!!! => (SJO) no problem, Stone assumes mono-threading + revision_++; + } + + public: + ColorSceneLayer() : + revision_(0) + { + } + + virtual uint64_t GetRevision() const ORTHANC_OVERRIDE + { + return revision_; + } + + void SetColor(uint8_t red, + uint8_t green, + uint8_t blue) + { + color_ = Color(red, green, blue); + BumpRevision(); + } + + void SetColor(const Color& color) + { + color_ = color; + BumpRevision(); + } + + const Color& GetColor() const + { + return color_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ColorTextureSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ColorTextureSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ColorTextureSceneLayer.h" + +#include +#include + + +namespace OrthancStone +{ + ColorTextureSceneLayer::ColorTextureSceneLayer(const Orthanc::ImageAccessor& texture) + { + if (texture.GetFormat() != Orthanc::PixelFormat_Grayscale8 && + texture.GetFormat() != Orthanc::PixelFormat_RGBA32 && + texture.GetFormat() != Orthanc::PixelFormat_RGB24) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + SetTexture(Orthanc::Image::Clone(texture)); + } + + + ISceneLayer* ColorTextureSceneLayer::Clone() const + { + std::unique_ptr cloned(new ColorTextureSceneLayer(GetTexture())); + cloned->CopyParameters(*this); + return cloned.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ColorTextureSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ColorTextureSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,41 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "TextureBaseSceneLayer.h" + +namespace OrthancStone +{ + class ColorTextureSceneLayer : public TextureBaseSceneLayer + { + public: + // If using RGBA32, premultiplied alpha is assumed + ColorTextureSceneLayer(const Orthanc::ImageAccessor& texture); + + virtual ISceneLayer* Clone() const; + + virtual Type GetType() const + { + return Type_ColorTexture; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/FloatTextureSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/FloatTextureSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,142 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "FloatTextureSceneLayer.h" + +#include "../Toolbox/ImageToolbox.h" + +#include +#include +#include + +namespace OrthancStone +{ + FloatTextureSceneLayer::FloatTextureSceneLayer(const Orthanc::ImageAccessor& texture) : + inverted_(false), + applyLog_(false) + { + { + std::unique_ptr t( + new Orthanc::Image(Orthanc::PixelFormat_Float32, + texture.GetWidth(), + texture.GetHeight(), + false)); + + Orthanc::ImageProcessing::Convert(*t, texture); + + SetTexture(t.release()); + } + + SetCustomWindowing(128, 256); + } + + + void FloatTextureSceneLayer::SetWindowing(ImageWindowing windowing) + { + if (windowing_ != windowing) + { + if (windowing == ImageWindowing_Custom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + windowing_ = windowing; + IncrementRevision(); + } + } + } + + void FloatTextureSceneLayer::SetCustomWindowing(float customCenter, + float customWidth) + { + if (customWidth <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + windowing_ = ImageWindowing_Custom; + customCenter_ = customCenter; + customWidth_ = customWidth; + IncrementRevision(); + } + } + + + void FloatTextureSceneLayer::GetWindowing(float& targetCenter, + float& targetWidth) const + { + ::OrthancStone::ComputeWindowing(targetCenter, targetWidth, + windowing_, customCenter_, customWidth_); + } + + + void FloatTextureSceneLayer::SetInverted(bool inverted) + { + inverted_ = inverted; + IncrementRevision(); + } + + + void FloatTextureSceneLayer::SetApplyLog(bool apply) + { + applyLog_ = apply; + IncrementRevision(); + } + + + void FloatTextureSceneLayer::FitRange() + { + float minValue, maxValue; + Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, GetTexture()); + + float width; + + assert(minValue <= maxValue); + if (LinearAlgebra::IsCloseToZero(maxValue - minValue)) + { + width = 1; + } + else + { + width = maxValue - minValue; + } + + SetCustomWindowing((minValue + maxValue) / 2.0f, width); + } + + + ISceneLayer* FloatTextureSceneLayer::Clone() const + { + std::unique_ptr cloned + (new FloatTextureSceneLayer(GetTexture())); + + cloned->CopyParameters(*this); + cloned->windowing_ = windowing_; + cloned->customCenter_ = customCenter_; + cloned->customWidth_ = customWidth_; + cloned->inverted_ = inverted_; + cloned->applyLog_ = applyLog_; + + return cloned.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/FloatTextureSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/FloatTextureSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,78 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "TextureBaseSceneLayer.h" + +namespace OrthancStone +{ + class FloatTextureSceneLayer : public TextureBaseSceneLayer + { + private: + ImageWindowing windowing_; + float customCenter_; + float customWidth_; + bool inverted_; + bool applyLog_; + + public: + // The pixel format must be convertible to "Float32" + FloatTextureSceneLayer(const Orthanc::ImageAccessor& texture); + + void SetWindowing(ImageWindowing windowing); + + void SetCustomWindowing(float customCenter, + float customWidth); + + void GetWindowing(float& targetCenter, + float& targetWidth) const; + + ImageWindowing GetWindowingType() const + { + return windowing_; + } + + // To achieve MONOCHROME1 photometric interpretation + void SetInverted(bool inverted); + + bool IsInverted() const + { + return inverted_; + } + + void FitRange(); + + void SetApplyLog(bool apply); + + bool IsApplyLog() const + { + return applyLog_; + } + + virtual ISceneLayer* Clone() const; + + virtual Type GetType() const + { + return Type_FloatTexture; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/GrayscaleStyleConfigurator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/GrayscaleStyleConfigurator.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,129 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GrayscaleStyleConfigurator.h" + +#include "FloatTextureSceneLayer.h" + +#include + +namespace OrthancStone +{ + GrayscaleStyleConfigurator::GrayscaleStyleConfigurator() : + revision_(0), + linearInterpolation_(false), + hasWindowingOverride_(false), + customWindowWidth_(0), + customWindowCenter_(0), + hasInversionOverride_(false), + inverted_(false), + applyLog_(false) + { + } + + void GrayscaleStyleConfigurator::SetWindowing(ImageWindowing windowing) + { + hasWindowingOverride_ = true; + windowing_ = windowing; + revision_++; + } + + void GrayscaleStyleConfigurator::SetCustomWindowing(float windowCenter, float windowWidth) + { + SetWindowing(ImageWindowing_Custom); + customWindowCenter_ = windowCenter; + customWindowWidth_ = windowWidth; + } + + void GrayscaleStyleConfigurator::GetCustomWindowing(float& windowCenter, float& windowWidth) const + { + windowCenter = customWindowCenter_; + windowWidth = customWindowWidth_; + } + + void GrayscaleStyleConfigurator::SetInverted(bool inverted) + { + hasInversionOverride_ = true; + inverted_ = inverted; + revision_++; + } + + void GrayscaleStyleConfigurator::SetLinearInterpolation(bool enabled) + { + linearInterpolation_ = enabled; + revision_++; + } + + void GrayscaleStyleConfigurator::SetApplyLog(bool apply) + { + applyLog_ = apply; + revision_++; + } + + TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromImage( + const Orthanc::ImageAccessor& image) const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromDicom( + const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const + { + std::unique_ptr layer(parameters.CreateTexture(frame)); + + if (layer.get() == NULL || + layer->GetTexture().GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + else + { + return layer.release(); + } + } + + void GrayscaleStyleConfigurator::ApplyStyle(ISceneLayer& layer) const + { + FloatTextureSceneLayer& l = dynamic_cast(layer); + + l.SetLinearInterpolation(linearInterpolation_); + + if (hasWindowingOverride_) + { + if (windowing_ != ImageWindowing_Custom) + { + l.SetWindowing(windowing_); + } + else + { + l.SetCustomWindowing(customWindowCenter_, customWindowWidth_); + } + } + + if (hasInversionOverride_) + { + l.SetInverted(inverted_); + } + + l.SetApplyLog(applyLog_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/GrayscaleStyleConfigurator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/GrayscaleStyleConfigurator.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerStyleConfigurator.h" + +namespace OrthancStone +{ + /** + Creates layers to display the supplied image in grayscale. No dynamic + style is available. + */ + class GrayscaleStyleConfigurator : public ILayerStyleConfigurator + { + private: + uint64_t revision_; + bool linearInterpolation_; + bool hasWindowingOverride_; + ImageWindowing windowing_; + float customWindowWidth_; + float customWindowCenter_; + bool hasInversionOverride_; + bool inverted_; + bool applyLog_; + + public: + GrayscaleStyleConfigurator(); + + void SetWindowing(ImageWindowing windowing); + + void SetCustomWindowing(float windowCenter, float windowWidth); + + void GetCustomWindowing(float& windowCenter, float& windowWidth) const; + + void SetInverted(bool inverted); + + void SetLinearInterpolation(bool enabled); + + bool IsLinearInterpolation() const + { + return linearInterpolation_; + } + + void SetApplyLog(bool apply); + + bool IsApplyLog() const + { + return applyLog_; + } + + virtual uint64_t GetRevision() const + { + return revision_; + } + + virtual TextureBaseSceneLayer* CreateTextureFromImage( + const Orthanc::ImageAccessor& image) const; + + virtual TextureBaseSceneLayer* CreateTextureFromDicom( + const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const; + + virtual void ApplyStyle(ISceneLayer& layer) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ICompositor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ICompositor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "Scene2D.h" +#include "ScenePoint2D.h" + +namespace OrthancStone +{ + class ICompositor : public boost::noncopyable + { + public: + virtual ~ICompositor() + { + } + + // This function can be expensive (notably in wasm) + virtual void RefreshCanvasSize() = 0; + + virtual unsigned int GetCanvasWidth() const = 0; + + virtual unsigned int GetCanvasHeight() const = 0; + + /** + * WARNING: "Refresh()" must always be called with the same + * scene. If the scene changes, a call to "ResetScene()" must be + * done to reset the tracking of the revisions of the layers. + **/ + virtual void Refresh(const Scene2D& scene) = 0; + + virtual void ResetScene() = 0; + +#if ORTHANC_ENABLE_LOCALE == 1 + virtual void SetFont(size_t index, + const std::string& ttf, + unsigned int fontSize, + Orthanc::Encoding codepage) = 0; +#endif + + // Get the center of the given pixel, in canvas coordinates + ScenePoint2D GetPixelCenterCoordinates(int x, int y) const + { + return ScenePoint2D( + static_cast(x) + 0.5 - static_cast(GetCanvasWidth()) / 2.0, + static_cast(y) + 0.5 - static_cast(GetCanvasHeight()) / 2.0); + } + + void FitContent(Scene2D& scene) const + { + scene.FitContent(GetCanvasWidth(), GetCanvasHeight()); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ILayerStyleConfigurator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ILayerStyleConfigurator.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/DicomInstanceParameters.h" + +namespace OrthancStone +{ + /** + This interface is implemented by objects able to create an ISceneLayer + suitable to display the Orthanc image supplied to the CreateTextureXX + factory methods (taking Dicom parameters into account if relevant). + + It can also refresh the style of an existing layer afterwards, to match + the configurator settings. + */ + class ILayerStyleConfigurator + { + public: + virtual ~ILayerStyleConfigurator() + { + } + + virtual uint64_t GetRevision() const = 0; + + virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const = 0; + + virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const = 0; + + virtual void ApplyStyle(ISceneLayer& layer) const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/IPointerTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/IPointerTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if 0 + +#include "PointerEvent.h" + +namespace OrthancStone +{ + class IPointerTracker : public boost::noncopyable + { + public: + virtual ~IPointerTracker() + { + } + + /** + This method will be repeatedly called during user interaction + */ + virtual void Update(const PointerEvent& event) = 0; + + /** + This method will be called when the tracker should commit its result + before being destroyed. + */ + virtual void Release() = 0; + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ISceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ISceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,57 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/Extent2D.h" + +#include +#include + +namespace OrthancStone +{ + class ISceneLayer : public boost::noncopyable + { + public: + enum Type + { + Type_NullLayer, + Type_InfoPanel, + Type_ColorTexture, + Type_Polyline, + Type_Text, + Type_FloatTexture, + Type_LookupTableTexture + }; + + virtual ~ISceneLayer() + { + } + + virtual ISceneLayer* Clone() const = 0; + + virtual Type GetType() const = 0; + + virtual bool GetBoundingBox(Extent2D& target) const = 0; + + virtual uint64_t GetRevision() const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/InfoPanelSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/InfoPanelSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,107 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "InfoPanelSceneLayer.h" + +#include +#include + +namespace OrthancStone +{ + InfoPanelSceneLayer::InfoPanelSceneLayer(const Orthanc::ImageAccessor& texture, + BitmapAnchor anchor, + bool isLinearInterpolation, + bool applySceneRotation) : + texture_(Orthanc::Image::Clone(texture)), + anchor_(anchor), + isLinearInterpolation_(isLinearInterpolation), + applySceneRotation_(applySceneRotation) + { + if (texture_->GetFormat() != Orthanc::PixelFormat_RGBA32 && + texture_->GetFormat() != Orthanc::PixelFormat_RGB24) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + } + + + void InfoPanelSceneLayer::ComputeAnchorLocation(int& x, + int& y, + BitmapAnchor anchor, + unsigned int textureWidth, + unsigned int textureHeight, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + int tw = static_cast(textureWidth); + int th = static_cast(textureHeight); + int cw = static_cast(canvasWidth); + int ch = static_cast(canvasHeight); + + switch (anchor) + { + case BitmapAnchor_TopLeft: + case BitmapAnchor_CenterLeft: + case BitmapAnchor_BottomLeft: + x = 0; + break; + + case BitmapAnchor_TopCenter: + case BitmapAnchor_Center: + case BitmapAnchor_BottomCenter: + x = (cw - tw) / 2; + break; + + case BitmapAnchor_TopRight: + case BitmapAnchor_CenterRight: + case BitmapAnchor_BottomRight: + x = cw - tw; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + switch (anchor) + { + case BitmapAnchor_TopLeft: + case BitmapAnchor_TopCenter: + case BitmapAnchor_TopRight: + y = 0; + break; + + case BitmapAnchor_CenterLeft: + case BitmapAnchor_Center: + case BitmapAnchor_CenterRight: + y = (ch - th) / 2; + break; + + case BitmapAnchor_BottomLeft: + case BitmapAnchor_BottomCenter: + case BitmapAnchor_BottomRight: + y = ch - th; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/InfoPanelSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/InfoPanelSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,105 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ISceneLayer.h" +#include "../StoneEnumerations.h" + +#include +#include + +#include + +namespace OrthancStone +{ + class InfoPanelSceneLayer : public ISceneLayer + { + private: + std::unique_ptr texture_; + BitmapAnchor anchor_; + bool isLinearInterpolation_; + bool applySceneRotation_; + + public: + /** + * If you supply `true` for `applySceneRotation`, then, in addition to + * a translation to bring it at the desired anchoring location, the image + * will be rotated around its center by the same rotation as the scene + * transformation. + */ + InfoPanelSceneLayer(const Orthanc::ImageAccessor& texture, + BitmapAnchor anchor, + bool isLinearInterpolation, + bool applySceneRotation = false); + + virtual ISceneLayer* Clone() const + { + return new InfoPanelSceneLayer(*texture_, + anchor_, + isLinearInterpolation_, + applySceneRotation_); + } + + const Orthanc::ImageAccessor& GetTexture() const + { + return *texture_; + } + + BitmapAnchor GetAnchor() const + { + return anchor_; + } + + bool ShouldApplySceneRotation() const + { + return applySceneRotation_; + } + + bool IsLinearInterpolation() const + { + return isLinearInterpolation_; + } + + virtual Type GetType() const + { + return Type_InfoPanel; + } + + virtual bool GetBoundingBox(Extent2D& target) const + { + return false; + } + + virtual uint64_t GetRevision() const + { + return 0; + } + + static void ComputeAnchorLocation(int& x, + int& y, + BitmapAnchor anchor, + unsigned int textureWidth, + unsigned int textureHeight, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoBaseRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoBaseRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,65 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ICairoContextProvider.h" +#include "CompositorHelper.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class CairoBaseRenderer : public CompositorHelper::ILayerRenderer + { + private: + ICairoContextProvider& target_; + std::unique_ptr layer_; + + protected: + template + const T& GetLayer() const + { + return dynamic_cast(*layer_); + } + + cairo_t* GetCairoContext() const + { + return target_.GetCairoContext(); + } + + public: + CairoBaseRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + target_(target) + { + Update(layer); + } + + virtual void Update(const ISceneLayer& layer) + { + layer_.reset(layer.Clone()); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoColorTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoColorTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,83 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoColorTextureRenderer.h" + +#include "../ColorTextureSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + CairoColorTextureRenderer::CairoColorTextureRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + target_(target) + { + Update(layer); + } + + + void CairoColorTextureRenderer::Update(const ISceneLayer& layer) + { + const ColorTextureSceneLayer& l = dynamic_cast(layer); + + texture_.Copy(l.GetTexture(), true); + textureTransform_ = l.GetTransform(); + isLinearInterpolation_ = l.IsLinearInterpolation(); + } + + + void CairoColorTextureRenderer::RenderColorTexture(ICairoContextProvider& target, + const AffineTransform2D& transform, + CairoSurface& texture, + const AffineTransform2D& textureTransform, + bool isLinearInterpolation) + { + cairo_t* cr = target.GetCairoContext(); + + AffineTransform2D t = + AffineTransform2D::Combine(transform, textureTransform); + Matrix h = t.GetHomogeneousMatrix(); + + cairo_save(cr); + + cairo_matrix_t m; + cairo_matrix_init(&m, h(0, 0), h(1, 0), h(0, 1), h(1, 1), h(0, 2), h(1, 2)); + cairo_transform(cr, &m); + + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(cr, texture.GetObject(), 0, 0); + + if (isLinearInterpolation) + { + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); + } + else + { + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); + } + + cairo_paint(cr); + + cairo_restore(cr); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoColorTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoColorTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoSurface.h" +#include "CompositorHelper.h" +#include "ICairoContextProvider.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoColorTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + ICairoContextProvider& target_; + CairoSurface texture_; + AffineTransform2D textureTransform_; + bool isLinearInterpolation_; + + public: + CairoColorTextureRenderer(ICairoContextProvider& target, + const ISceneLayer& layer); + + virtual void Update(const ISceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + RenderColorTexture(target_, transform, texture_, + textureTransform_, isLinearInterpolation_); + } + + static void RenderColorTexture(ICairoContextProvider& target, + const AffineTransform2D& transform, + CairoSurface& texture, + const AffineTransform2D& textureTransform, + bool isLinearInterpolation); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoFloatTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoFloatTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,109 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoFloatTextureRenderer.h" + +#include "CairoColorTextureRenderer.h" +#include "../FloatTextureSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + void CairoFloatTextureRenderer::Update(const ISceneLayer& layer) + { + const FloatTextureSceneLayer& l = dynamic_cast(layer); + + textureTransform_ = l.GetTransform(); + isLinearInterpolation_ = l.IsLinearInterpolation(); + + float windowCenter, windowWidth; + l.GetWindowing(windowCenter, windowWidth); + + const float a = windowCenter - windowWidth / 2.0f; + const float slope = 256.0f / windowWidth; + + const Orthanc::ImageAccessor& source = l.GetTexture(); + const unsigned int width = source.GetWidth(); + const unsigned int height = source.GetHeight(); + texture_.SetSize(width, height, false); + + Orthanc::ImageAccessor target; + texture_.GetWriteableAccessor(target); + + assert(source.GetFormat() == Orthanc::PixelFormat_Float32 && + target.GetFormat() == Orthanc::PixelFormat_BGRA32 && + sizeof(float) == 4); + + static const float LOG_NORMALIZATION = 255.0f / log(1.0f + 255.0f); + + for (unsigned int y = 0; y < height; y++) + { + const float* p = reinterpret_cast(source.GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < width; x++) + { + float v = (*p - a) * slope; + if (v <= 0) + { + v = 0; + } + else if (v >= 255) + { + v = 255; + } + + if (l.IsApplyLog()) + { + // https://theailearner.com/2019/01/01/log-transformation/ + v = LOG_NORMALIZATION * log(1.0f + static_cast(v)); + } + + assert(v >= 0.0f && v <= 255.0f); + + uint8_t vv = static_cast(v); + + if (l.IsInverted()) + { + vv = 255 - vv; + } + + q[0] = vv; + q[1] = vv; + q[2] = vv; + + p++; + q += 4; + } + } + } + + + void CairoFloatTextureRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + CairoColorTextureRenderer::RenderColorTexture(target_, transform, texture_, + textureTransform_, isLinearInterpolation_); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoFloatTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoFloatTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoSurface.h" +#include "CompositorHelper.h" +#include "ICairoContextProvider.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoFloatTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + ICairoContextProvider& target_; + CairoSurface texture_; + AffineTransform2D textureTransform_; + bool isLinearInterpolation_; + + public: + CairoFloatTextureRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + target_(target) + { + Update(layer); + } + + virtual void Update(const ISceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoInfoPanelRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoInfoPanelRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,132 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoInfoPanelRenderer.h" + +#include "../InfoPanelSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + void CairoInfoPanelRenderer::Update(const ISceneLayer& layer) + { + const InfoPanelSceneLayer& l = dynamic_cast(layer); + + texture_.Copy(l.GetTexture(), true); + anchor_ = l.GetAnchor(); + isLinearInterpolation_ = l.IsLinearInterpolation(); + applySceneRotation_ = l.ShouldApplySceneRotation(); + } + + void CairoInfoPanelRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + int dx, dy; + InfoPanelSceneLayer::ComputeAnchorLocation( + dx, dy, anchor_, texture_.GetWidth(), texture_.GetHeight(), + canvasWidth, canvasHeight); + + cairo_t* cr = target_.GetCairoContext(); + cairo_save(cr); + + if (applySceneRotation_) + { + // the transformation is as follows: + // - originally, the image is aligned so that its top left corner + // is at 0,0 + // - first, we translate the image by -w/2,-h/2 + // - then we rotate it, so that the next rotation will make the + // image rotate around its center. + // - then, we translate the image by +w/2,+h/2 to put it + // back in place + // - the fourth and last transform is the one that brings the + // image to its desired anchored location. + + int32_t halfWidth = + static_cast(0.5 * texture_.GetWidth()); + + int32_t halfHeight = + static_cast(0.5 * texture_.GetHeight()); + + AffineTransform2D translation1 = + AffineTransform2D::CreateOffset(-halfWidth, -halfHeight); + + const Matrix& sceneTransformM = transform.GetHomogeneousMatrix(); + Matrix r; + Matrix q; + LinearAlgebra::RQDecomposition3x3(r, q, sceneTransformM); + + // first, put the scene rotation in a cairo matrix + cairo_matrix_t m; + cairo_matrix_init( + &m, q(0, 0), q(1, 0), q(0, 1), q(1, 1), q(0, 2), q(1, 2)); + + // now let's build the transform piece by piece + // first translation (directly written in `transform`) + cairo_matrix_t transform; + cairo_matrix_init_identity(&transform); + cairo_matrix_translate(&transform, -halfWidth, -halfHeight); + + // then the rotation + cairo_matrix_multiply(&transform, &transform, &m); + + // then the second translation + { + cairo_matrix_t translation2; + cairo_matrix_init_translate(&translation2, halfWidth, halfHeight); + cairo_matrix_multiply(&transform, &transform, &m); + } + + // then the last translation + { + cairo_matrix_t translation3; + cairo_matrix_init_translate(&translation3, dx, dy); + cairo_matrix_multiply(&transform, &transform, &translation3); + } + cairo_transform(cr, &transform); + } + else + { + cairo_matrix_t t; + cairo_matrix_init_identity(&t); + cairo_matrix_translate(&t, dx, dy); + cairo_transform(cr, &t); + } + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(cr, texture_.GetObject(), 0, 0); + + if (isLinearInterpolation_) + { + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); + } + else + { + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); + } + + cairo_paint(cr); + + cairo_restore(cr); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoInfoPanelRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoInfoPanelRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,59 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoSurface.h" +#include "CompositorHelper.h" +#include "ICairoContextProvider.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoInfoPanelRenderer : public CompositorHelper::ILayerRenderer + { + private: + ICairoContextProvider& target_; + CairoSurface texture_; + BitmapAnchor anchor_; + bool isLinearInterpolation_; + bool applySceneRotation_; + + public: + CairoInfoPanelRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + target_(target), + anchor_(BitmapAnchor_TopLeft), + applySceneRotation_(false) + + { + Update(layer); + } + + virtual void Update(const ISceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoLookupTableTextureRenderer.h" + +#include "CairoColorTextureRenderer.h" +#include "../LookupTableTextureSceneLayer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + void CairoLookupTableTextureRenderer::Update(const ISceneLayer& layer) + { + const LookupTableTextureSceneLayer& l = dynamic_cast(layer); + + textureTransform_ = l.GetTransform(); + isLinearInterpolation_ = l.IsLinearInterpolation(); + + const Orthanc::ImageAccessor& source = l.GetTexture(); + const unsigned int width = source.GetWidth(); + const unsigned int height = source.GetHeight(); + texture_.SetSize(width, height, true /* alpha channel is enabled */); + + Orthanc::ImageAccessor target; + texture_.GetWriteableAccessor(target); + l.Render(target); + + cairo_surface_mark_dirty(texture_.GetObject()); + } + + void CairoLookupTableTextureRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + CairoColorTextureRenderer::RenderColorTexture(target_, transform, texture_, + textureTransform_, isLinearInterpolation_); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Wrappers/CairoSurface.h" +#include "CompositorHelper.h" +#include "ICairoContextProvider.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoLookupTableTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + ICairoContextProvider& target_; + CairoSurface texture_; + AffineTransform2D textureTransform_; + bool isLinearInterpolation_; + + public: + CairoLookupTableTextureRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + target_(target) + { + Update(layer); + } + + virtual void Update(const ISceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoPolylineRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoPolylineRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoPolylineRenderer.h" + +#include "../PolylineSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + void CairoPolylineRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + const PolylineSceneLayer& layer = GetLayer(); + + cairo_t* cr = GetCairoContext(); + + cairo_set_line_width(cr, layer.GetThickness()); + + for (size_t i = 0; i < layer.GetChainsCount(); i++) + { + const Color& color = layer.GetColor(i); + cairo_set_source_rgb(cr, color.GetRedAsFloat(), + color.GetGreenAsFloat(), + color.GetBlueAsFloat()); + + const PolylineSceneLayer::Chain& chain = layer.GetChain(i); + + if (!chain.empty()) + { + for (size_t j = 0; j < chain.size(); j++) + { + ScenePoint2D p = chain[j].Apply(transform); + + if (j == 0) + { + cairo_move_to(cr, p.GetX(), p.GetY()); + } + else + { + cairo_line_to(cr, p.GetX(), p.GetY()); + } + } + + if (layer.IsClosedChain(i)) + { + ScenePoint2D p = chain[0].Apply(transform); + cairo_line_to(cr, p.GetX(), p.GetY()); + } + } + + cairo_stroke(cr); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoPolylineRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoPolylineRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CairoBaseRenderer.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoPolylineRenderer : public CairoBaseRenderer + { + public: + CairoPolylineRenderer(ICairoContextProvider& target, + const ISceneLayer& layer) : + CairoBaseRenderer(target, layer) + { + } + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoTextRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoTextRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,116 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoTextRenderer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + CairoTextRenderer::CairoTextRenderer(ICairoContextProvider& target, + const GlyphBitmapAlphabet& alphabet, + const TextSceneLayer& layer) : + CairoBaseRenderer(target, layer) + { + std::unique_ptr source(alphabet.RenderText(layer.GetText())); + + if (source.get() != NULL) + { + text_.SetSize(source->GetWidth(), source->GetHeight(), true); + + Orthanc::ImageAccessor target; + text_.GetWriteableAccessor(target); + + if (source->GetFormat() != Orthanc::PixelFormat_Grayscale8 || + target.GetFormat() != Orthanc::PixelFormat_BGRA32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + const unsigned int width = source->GetWidth(); + const Color& color = layer.GetColor(); + + for (unsigned int y = 0; y < source->GetHeight(); y++) + { + const uint8_t* p = reinterpret_cast(source->GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < width; x++) + { + unsigned int alpha = *p; + + // Premultiplied alpha + q[0] = static_cast((color.GetBlue() * alpha) / 255); + q[1] = static_cast((color.GetGreen() * alpha) / 255); + q[2] = static_cast((color.GetRed() * alpha) / 255); + q[3] = *p; + + p++; + q += 4; + } + } + + cairo_surface_mark_dirty(text_.GetObject()); + } + } + + + void CairoTextRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (text_.GetWidth() != 0 && + text_.GetHeight() != 0) + { + const TextSceneLayer& layer = GetLayer(); + + cairo_t* cr = GetCairoContext(); + cairo_set_source_rgb(cr, layer.GetColor().GetRedAsFloat(), + layer.GetColor().GetGreenAsFloat(), + layer.GetColor().GetBlueAsFloat()); + + double dx, dy; // In pixels + ComputeAnchorTranslation(dx, dy, layer.GetAnchor(), text_.GetWidth(), + text_.GetHeight(), layer.GetBorder()); + + double x = layer.GetX(); + double y = layer.GetY(); + transform.Apply(x, y); + + cairo_save(cr); + + cairo_matrix_t t; + cairo_matrix_init_identity(&t); + cairo_matrix_translate(&t, x + dx, y + dy); + cairo_transform(cr, &t); + + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(cr, text_.GetObject(), 0, 0); + cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR); + cairo_paint(cr); + + cairo_restore(cr); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CairoTextRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CairoTextRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,48 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Fonts/GlyphBitmapAlphabet.h" +#include "../../Wrappers/CairoSurface.h" +#include "../TextSceneLayer.h" +#include "CairoBaseRenderer.h" + +namespace OrthancStone +{ + namespace Internals + { + class CairoTextRenderer : public CairoBaseRenderer + { + private: + CairoSurface text_; + + public: + CairoTextRenderer(ICairoContextProvider& target, + const GlyphBitmapAlphabet& alphabet, + const TextSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CompositorHelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CompositorHelper.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,177 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CompositorHelper.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class CompositorHelper::Item : public boost::noncopyable + { + private: + std::unique_ptr renderer_; + const ISceneLayer& layer_; + uint64_t layerIdentifier_; + uint64_t lastRevision_; + + public: + Item(ILayerRenderer* renderer, // Takes ownership + const ISceneLayer& layer, + uint64_t layerIdentifier) : + renderer_(renderer), + layer_(layer), + layerIdentifier_(layerIdentifier), + lastRevision_(layer.GetRevision()) + { + if (renderer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + ILayerRenderer& GetRenderer() const + { + assert(renderer_.get() != NULL); + return *renderer_; + } + + const ISceneLayer& GetLayer() const + { + return layer_; + } + + uint64_t GetLayerIdentifier() const + { + return layerIdentifier_; + } + + uint64_t GetLastRevision() const + { + return lastRevision_; + } + + void UpdateRenderer() + { + assert(renderer_.get() != NULL); + renderer_->Update(layer_); + lastRevision_ = layer_.GetRevision(); + } + }; + + + void CompositorHelper::Visit(const Scene2D& scene, + const ISceneLayer& layer, + uint64_t layerIdentifier, + int depth) + { + // "Visit()" is only applied to layers existing in the scene + assert(scene.HasLayer(depth)); + + Content::iterator found = content_.find(depth); + + assert(found == content_.end() || + found->second != NULL); + + if (found == content_.end() || + found->second->GetLayerIdentifier() != layerIdentifier) + { + // This is the first time this layer is rendered, or the layer + // is not the same as before + if (found != content_.end()) + { + delete found->second; + content_.erase(found); + } + + // the returned renderer can be NULL in case of an unknown layer + // or a NullLayer + std::unique_ptr renderer(factory_.Create(layer)); + + if (renderer.get() != NULL) + { + renderer->Render(sceneTransform_, canvasWidth_, canvasHeight_); + content_[depth] = new Item(renderer.release(), layer, layerIdentifier); + } + } + else + { + // This layer has already been rendered + assert(found->second->GetLastRevision() <= layer.GetRevision()); + + if (found->second->GetLastRevision() < layer.GetRevision()) + { + found->second->UpdateRenderer(); + } + + found->second->GetRenderer().Render(sceneTransform_, canvasWidth_, canvasHeight_); + } + + // Check invariants + assert(content_.find(depth) == content_.end() || + (content_[depth]->GetLayerIdentifier() == layerIdentifier && + content_[depth]->GetLastRevision() == layer.GetRevision())); + } + + + CompositorHelper::~CompositorHelper() + { + for (Content::iterator it = content_.begin(); it != content_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + } + + + void CompositorHelper::Refresh(const Scene2D& scene, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + /** + * Safeguard mechanism to enforce the fact that the same scene + * is always used with the compositor. Note that the safeguard + * is not 100% bullet-proof, as a new scene might reuse the same + * address as a previous scene. + **/ + if (lastScene_ != NULL && + lastScene_ != &scene) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "ICompositor::ResetScene() should have been called"); + } + + lastScene_ = &scene; + + // Bring coordinate (0,0) to the center of the canvas + AffineTransform2D offset = AffineTransform2D::CreateOffset( + static_cast(canvasWidth) / 2.0, + static_cast(canvasHeight) / 2.0); + + sceneTransform_ = AffineTransform2D::Combine(offset, scene.GetSceneToCanvasTransform()); + canvasWidth_ = canvasWidth; + canvasHeight_ = canvasHeight; + scene.Apply(*this); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/CompositorHelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/CompositorHelper.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2D.h" +#include "../ScenePoint2D.h" +#include + +#include + +namespace OrthancStone +{ + namespace Internals + { + class CompositorHelper : protected Scene2D::IVisitor + { + public: + class ILayerRenderer : public boost::noncopyable + { + public: + virtual ~ILayerRenderer() + { + } + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) = 0; + + // "Update()" is only called if the type of the layer has not changed + virtual void Update(const ISceneLayer& layer) = 0; + }; + + class IRendererFactory : public boost::noncopyable + { + public: + virtual ~IRendererFactory() + { + } + + virtual ILayerRenderer* Create(const ISceneLayer& layer) = 0; + }; + + private: + class Item; + + typedef std::map Content; + + IRendererFactory& factory_; + Content content_; + const Scene2D* lastScene_; // This is only a safeguard, don't use it! + + // Only valid during a call to Refresh() + AffineTransform2D sceneTransform_; + unsigned int canvasWidth_; + unsigned int canvasHeight_; + + protected: + virtual void Visit(const Scene2D& scene, + const ISceneLayer& layer, + uint64_t layerIdentifier, + int depth); + + public: + CompositorHelper(IRendererFactory& factory) : + factory_(factory), + lastScene_(NULL) + { + } + + ~CompositorHelper(); + + void Refresh(const Scene2D& scene, + unsigned int canvasWidth, + unsigned int canvasHeight); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/FixedPointAligner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/FixedPointAligner.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../../Scene2DViewport/ViewportController.h" +#include "FixedPointAligner.h" + +namespace OrthancStone +{ + namespace Internals + { + FixedPointAligner::FixedPointAligner(boost::shared_ptr viewport, + const ScenePoint2D& p) + : viewport_(viewport) + , canvas_(p) + { + std::unique_ptr lock(viewport_->Lock()); + pivot_ = canvas_.Apply(lock->GetController().GetCanvasToSceneTransform()); + } + + + void FixedPointAligner::Apply() + { + std::unique_ptr lock(viewport_->Lock()); + ScenePoint2D p = canvas_.Apply( + lock->GetController().GetCanvasToSceneTransform()); + + lock->GetController().SetSceneToCanvasTransform( + AffineTransform2D::Combine( + lock->GetController().GetSceneToCanvasTransform(), + AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), + p.GetY() - pivot_.GetY()))); + lock->Invalidate(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/FixedPointAligner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/FixedPointAligner.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../../Scene2DViewport/PredeclaredTypes.h" +#include "../../Scene2D/ScenePoint2D.h" +#include "../../Viewport/IViewport.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + // During a mouse event that modifies the view of a scene, keeps + // one point (the pivot) at a fixed position on the canvas + class FixedPointAligner : public boost::noncopyable + { + private: + boost::shared_ptr viewport_; + ScenePoint2D pivot_; + ScenePoint2D canvas_; + + public: + FixedPointAligner(boost::shared_ptr viewport, + const ScenePoint2D& p); + + void Apply(); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/ICairoContextProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/ICairoContextProvider.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,42 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include +#include + +namespace OrthancStone +{ + namespace Internals + { + class ICairoContextProvider : public boost::noncopyable + { + public: + virtual ~ICairoContextProvider() + { + } + + virtual cairo_t* GetCairoContext() = 0; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,51 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLAdvancedPolylineRenderer.h" + +#include + + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLAdvancedPolylineRenderer::LoadLayer(const PolylineSceneLayer& layer) + { + data_.reset(new OpenGLLinesProgram::Data(context_, layer)); + + if (data_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + + OpenGLAdvancedPolylineRenderer::OpenGLAdvancedPolylineRenderer(OpenGL::IOpenGLContext& context, + OpenGLLinesProgram& program, + const PolylineSceneLayer& layer) : + context_(context), + program_(program) + { + LoadLayer(layer); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CompositorHelper.h" +#include "OpenGLLinesProgram.h" + + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLAdvancedPolylineRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLLinesProgram& program_; + std::unique_ptr data_; + + void LoadLayer(const PolylineSceneLayer& layer); + + public: + OpenGLAdvancedPolylineRenderer(OpenGL::IOpenGLContext& context, + OpenGLLinesProgram& program, + const PolylineSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost()) + { + program_.Apply(*data_, transform, true, true); + } + } + + virtual void Update(const ISceneLayer& layer) + { + LoadLayer(dynamic_cast(layer)); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,94 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLBasicPolylineRenderer.h" + +#include "../../OpenGL/OpenGLIncludes.h" + +namespace OrthancStone +{ + namespace Internals + { + OpenGLBasicPolylineRenderer::OpenGLBasicPolylineRenderer(OpenGL::IOpenGLContext& context, + const PolylineSceneLayer& layer) : + context_(context) + { + layer_.Copy(layer); + } + + void OpenGLBasicPolylineRenderer::Render(const AffineTransform2D& transform) + { + if (!context_.IsContextLost()) + { + AffineTransform2D t = AffineTransform2D::Combine( + AffineTransform2D::CreateOpenGLClipspace(context_.GetCanvasWidth(), context_.GetCanvasHeight()), + transform); + + glUseProgram(0); + + glBegin(GL_LINES); + + for (size_t i = 0; i < layer_.GetChainsCount(); i++) + { + const Color& color = layer_.GetColor(i); + glColor3ub(color.GetRed(), color.GetGreen(), color.GetBlue()); + + const PolylineSceneLayer::Chain& chain = layer_.GetChain(i); + + if (chain.size() > 1) + { + ScenePoint2D previous = chain[0].Apply(t); + + for (size_t j = 1; j < chain.size(); j++) + { + ScenePoint2D p = chain[j].Apply(t); + + glVertex2f(static_cast(previous.GetX()), + static_cast(previous.GetY())); + glVertex2f(static_cast(p.GetX()), + static_cast(p.GetY())); + + previous = p; + } + + if (layer_.IsClosedChain(i)) + { + ScenePoint2D p = chain[0].Apply(t); + + glVertex2f(static_cast(previous.GetX()), + static_cast(previous.GetY())); + glVertex2f(static_cast(p.GetX()), + static_cast(p.GetY())); + } + } + } + + glEnd(); + } + } + + + void OpenGLBasicPolylineRenderer::Update(const ISceneLayer& layer) + { + layer_.Copy(dynamic_cast(layer)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,49 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../OpenGL/IOpenGLContext.h" +#include "../PolylineSceneLayer.h" +#include "CompositorHelper.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLBasicPolylineRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + PolylineSceneLayer layer_; + + public: + OpenGLBasicPolylineRenderer(OpenGL::IOpenGLContext& context, + const PolylineSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform); + + virtual void Update(const ISceneLayer& layer); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLColorTextureProgram.h" +#include "OpenGLShaderVersionDirective.h" + +static const char* FRAGMENT_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "uniform sampler2D u_texture; \n" + "varying vec2 v_texcoord; \n" + "void main() \n" + "{ \n" + " gl_FragColor = texture2D(u_texture, v_texcoord); \n" + "}"; + + +namespace OrthancStone +{ + namespace Internals + { + OpenGLColorTextureProgram::OpenGLColorTextureProgram(OpenGL::IOpenGLContext& context) + : program_(context, FRAGMENT_SHADER) + , context_(context) + { + } + + + void OpenGLColorTextureProgram::Apply(OpenGL::OpenGLTexture& texture, + const AffineTransform2D& transform, + bool useAlpha) + { + if (!context_.IsContextLost()) + { + OpenGLTextureProgram::Execution execution(program_, texture, transform); + + if (useAlpha) + { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + execution.DrawTriangles(); + glDisable(GL_BLEND); + } + else + { + execution.DrawTriangles(); + } + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLTextureProgram.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLColorTextureProgram : public boost::noncopyable + { + public: + OpenGLColorTextureProgram(OpenGL::IOpenGLContext& context); + + void Apply(OpenGL::OpenGLTexture& texture, + const AffineTransform2D& transform, + bool useAlpha); + private: + OpenGLTextureProgram program_; + OpenGL::IOpenGLContext& context_; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,67 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLColorTextureRenderer.h" + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLColorTextureRenderer::LoadTexture(const ColorTextureSceneLayer& layer) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + texture_.reset(new OpenGL::OpenGLTexture(context_)); + texture_->Load(layer.GetTexture(), layer.IsLinearInterpolation()); + layerTransform_ = layer.GetTransform(); + } + } + + + OpenGLColorTextureRenderer::OpenGLColorTextureRenderer(OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const ColorTextureSceneLayer& layer) : + context_(context), + program_(program) + { + LoadTexture(layer); + } + + + void OpenGLColorTextureRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost() && texture_.get() != NULL) + { + program_.Apply(*texture_, AffineTransform2D::Combine(transform, layerTransform_), true); + } + } + + + void OpenGLColorTextureRenderer::Update(const ISceneLayer& layer) + { + // Should never happen (no revisions in color textures) + LoadTexture(dynamic_cast(layer)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,54 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLColorTextureProgram.h" +#include "CompositorHelper.h" +#include "../ColorTextureSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLColorTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLColorTextureProgram& program_; + std::unique_ptr texture_; + AffineTransform2D layerTransform_; + + void LoadTexture(const ColorTextureSceneLayer& layer); + + public: + OpenGLColorTextureRenderer(OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const ColorTextureSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual void Update(const ISceneLayer& layer); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,162 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLFloatTextureProgram.h" +#include "OpenGLShaderVersionDirective.h" + +#include +#include +#include + + +static const char* FRAGMENT_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "uniform float u_offset; \n" + "uniform float u_slope; \n" + "uniform float u_windowCenter; \n" + "uniform float u_windowWidth; \n" + "uniform bool u_invert; \n" + "uniform sampler2D u_texture; \n" + "varying vec2 v_texcoord; \n" + "void main() \n" + "{ \n" + " vec4 t = texture2D(u_texture, v_texcoord); \n" + " float v = (t.r * 256.0 + t.g) * 256.0; \n" + " v = v * u_slope + u_offset; \n" // (*) + " float a = u_windowCenter - u_windowWidth / 2.0; \n" + " float dy = 1.0 / u_windowWidth; \n" + " if (v <= a) \n" + " v = 0.0; \n" + " else \n" + " { \n" + " v = (v - a) * dy; \n" + " if (v >= 1.0) \n" + " v = 1.0; \n" + " } \n" + " if (u_invert) \n" + " v = 1.0 - v; \n" + " gl_FragColor = vec4(v, v, v, 1); \n" + "}"; + + +namespace OrthancStone +{ + namespace Internals + { + OpenGLFloatTextureProgram::Data::Data( + OpenGL::IOpenGLContext& context + , const Orthanc::ImageAccessor& texture + , bool isLinearInterpolation) + : texture_(context) + , offset_(0.0f) + , slope_(0.0f) + { + if (texture.GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + float minValue, maxValue; + Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue, maxValue, texture); + + offset_ = minValue; + + if (LinearAlgebra::IsCloseToZero(maxValue - minValue)) + { + slope_ = 1; + } + else + { + slope_ = (maxValue - minValue) / 65536.0f; + assert(!LinearAlgebra::IsCloseToZero(slope_)); + } + + const unsigned int width = texture.GetWidth(); + const unsigned int height = texture.GetHeight(); + + Orthanc::Image converted(Orthanc::PixelFormat_RGB24, width, height, true); + + for (unsigned int y = 0; y < height; y++) + { + const float *p = reinterpret_cast(texture.GetConstRow(y)); + uint8_t *q = reinterpret_cast(converted.GetRow(y)); + + for (unsigned int x = 0; x < width; x++) + { + /** + * At (*), the floating-point "value" is reconstructed as + * "value = texture * slope + offset". + * <=> texture = (value - offset) / slope + **/ + + float texture = (*p - offset_) / slope_; + if (texture < 0) + { + texture = 0; + } + else if (texture >= 65535.0f) + { + texture = 65535.0f; + } + + uint16_t t = static_cast(texture); + + q[0] = t / 256; // red + q[1] = t % 256; // green + q[2] = 0; // blue is unused + + p++; + q += 3; + } + } + + texture_.Load(converted, isLinearInterpolation); + } + + + OpenGLFloatTextureProgram::OpenGLFloatTextureProgram(OpenGL::IOpenGLContext& context) + : program_(context, FRAGMENT_SHADER) + , context_(context) + { + } + + + void OpenGLFloatTextureProgram::Apply(Data& data, + const AffineTransform2D& transform, + float windowCenter, + float windowWidth, + bool invert) + { + if (!context_.IsContextLost()) + { + OpenGLTextureProgram::Execution execution(program_, data.GetTexture(), transform); + + glUniform1f(execution.GetUniformLocation("u_slope"), data.GetSlope()); + glUniform1f(execution.GetUniformLocation("u_offset"), data.GetOffset()); + glUniform1f(execution.GetUniformLocation("u_windowCenter"), windowCenter); + glUniform1f(execution.GetUniformLocation("u_windowWidth"), windowWidth); + glUniform1f(execution.GetUniformLocation("u_invert"), invert); + + execution.DrawTriangles(); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLTextureProgram.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLFloatTextureProgram : public boost::noncopyable + { + public: + class Data : public boost::noncopyable + { + private: + OpenGL::OpenGLTexture texture_; + float offset_; + float slope_; + + public: + Data(OpenGL::IOpenGLContext& context, const Orthanc::ImageAccessor& texture, + bool isLinearInterpolation); + + float GetOffset() const + { + return offset_; + } + + float GetSlope() const + { + return slope_; + } + + OpenGL::OpenGLTexture& GetTexture() + { + return texture_; + } + }; + + public: + OpenGLFloatTextureProgram(OpenGL::IOpenGLContext& context); + + void Apply(Data& data, + const AffineTransform2D& transform, + float windowCenter, + float windowWidth, + bool invert); + private: + OpenGLTextureProgram program_; + OpenGL::IOpenGLContext& context_; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,81 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLFloatTextureRenderer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLFloatTextureRenderer::UpdateInternal(const FloatTextureSceneLayer& layer, + bool loadTexture) + { + if (!context_.IsContextLost()) + { + if (loadTexture) + { + if (layer.IsApplyLog()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + context_.MakeCurrent(); + texture_.reset(new OpenGLFloatTextureProgram::Data( + context_, layer.GetTexture(), layer.IsLinearInterpolation())); + } + + layerTransform_ = layer.GetTransform(); + layer.GetWindowing(windowCenter_, windowWidth_); + invert_ = layer.IsInverted(); + } + } + + + OpenGLFloatTextureRenderer::OpenGLFloatTextureRenderer(OpenGL::IOpenGLContext& context, + OpenGLFloatTextureProgram& program, + const FloatTextureSceneLayer& layer) : + context_(context), + program_(program) + { + UpdateInternal(layer, true); + } + + + void OpenGLFloatTextureRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost() && texture_.get() != NULL) + { + program_.Apply(*texture_, AffineTransform2D::Combine(transform, layerTransform_), + windowCenter_, windowWidth_, invert_); + } + } + + + void OpenGLFloatTextureRenderer::Update(const ISceneLayer& layer) + { + UpdateInternal(dynamic_cast(layer), false); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CompositorHelper.h" +#include "OpenGLFloatTextureProgram.h" +#include "../FloatTextureSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLFloatTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLFloatTextureProgram& program_; + std::unique_ptr texture_; + AffineTransform2D layerTransform_; + float windowCenter_; + float windowWidth_; + bool invert_; + + void UpdateInternal(const FloatTextureSceneLayer& layer, + bool loadTexture); + + public: + OpenGLFloatTextureRenderer(OpenGL::IOpenGLContext& context, + OpenGLFloatTextureProgram& program, + const FloatTextureSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual void Update(const ISceneLayer& layer); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,117 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLInfoPanelRenderer.h" + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLInfoPanelRenderer::LoadTexture(const InfoPanelSceneLayer& layer) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + texture_.reset(new OpenGL::OpenGLTexture(context_)); + texture_->Load(layer.GetTexture(), layer.IsLinearInterpolation()); + applySceneRotation_ = layer.ShouldApplySceneRotation(); + anchor_ = layer.GetAnchor(); + } + } + + OpenGLInfoPanelRenderer::OpenGLInfoPanelRenderer(OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const InfoPanelSceneLayer& layer) : + context_(context), + program_(program), + anchor_(BitmapAnchor_TopLeft), + applySceneRotation_(false) + { + LoadTexture(layer); + } + + void OpenGLInfoPanelRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost() && texture_.get() != NULL) + { + int dx = 0, dy = 0; + InfoPanelSceneLayer::ComputeAnchorLocation( + dx, dy, anchor_, texture_->GetWidth(), texture_->GetHeight(), + canvasWidth, canvasHeight); + + // The position of this type of layer is layer: Ignore the + // "transform" coming from the scene + AffineTransform2D actualTransform = + AffineTransform2D::CreateOffset(dx, dy); + + if (applySceneRotation_) + { + // the transformation is as follows: + // - originally, the image is aligned so that its top left corner + // is at 0,0 + // - first, we translate the image by -w/2,-h/2 + // - then we rotate it, so that the next rotation will make the + // image rotate around its center. + // - then, we translate the image by +w/2,+h/2 to put it + // back in place + // - the fourth and last transform is the one that brings the + // image to its desired anchored location. + + int32_t halfWidth = + static_cast(0.5 * texture_->GetWidth()); + + int32_t halfHeight= + static_cast(0.5 * texture_->GetHeight()); + + AffineTransform2D translation1 = + AffineTransform2D::CreateOffset(-halfWidth, -halfHeight); + + const Matrix& sceneTransformM = transform.GetHomogeneousMatrix(); + Matrix r; + Matrix q; + LinearAlgebra::RQDecomposition3x3(r, q, sceneTransformM); + + // counterintuitively, q is the rotation and r is the upper + // triangular + AffineTransform2D rotation(q); + + AffineTransform2D translation2 = + AffineTransform2D::CreateOffset(halfWidth, halfHeight); + + // please note that the last argument is the 1st applied + // transformation (rationale: if arguments are a, b and c, then + // the resulting matrix is a*b*c: + // x2 = (a*b*c)*x1 = (a*(b*(c*x1))) (you can see that the result + // of c*x1 is transformed by b, and the result of b*c*x1 is trans- + // formed by a) + actualTransform = AffineTransform2D::Combine(actualTransform, + translation2, + rotation, + translation1); + } + + program_.Apply(*texture_, actualTransform, true); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CompositorHelper.h" +#include "OpenGLColorTextureProgram.h" +#include "../InfoPanelSceneLayer.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLInfoPanelRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLColorTextureProgram& program_; + std::unique_ptr texture_; + BitmapAnchor anchor_; + bool applySceneRotation_; + + void LoadTexture(const InfoPanelSceneLayer& layer); + + public: + OpenGLInfoPanelRenderer(OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const InfoPanelSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual void Update(const ISceneLayer& layer) + { + LoadTexture(dynamic_cast(layer)); + } + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLLinesProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLLinesProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,511 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLLinesProgram.h" +#include "OpenGLShaderVersionDirective.h" + +#include + + +static const unsigned int COMPONENTS_POSITION = 3; +static const unsigned int COMPONENTS_COLOR = 3; +static const unsigned int COMPONENTS_MITER = 2; + + +static const char* VERTEX_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "attribute vec2 a_miter_direction; \n" + "attribute vec4 a_position; \n" + "attribute vec3 a_color; \n" + "uniform float u_thickness; \n" + "uniform mat4 u_matrix; \n" + "varying float v_distance; \n" + "varying vec3 v_color; \n" + "void main() \n" + "{ \n" + " v_distance = a_position.z; \n" + " v_color = a_color; \n" + " gl_Position = u_matrix * vec4(a_position.xy + a_position.z * a_miter_direction * u_thickness, 0, 1); \n" + "}"; + + +static const char* FRAGMENT_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "uniform bool u_antialiasing; \n" + "uniform float u_antialiasing_start; \n" + "varying float v_distance; \n" // Distance of the point to the segment + "varying vec3 v_color; \n" + "void main() \n" + "{ \n" + " float d = abs(v_distance); \n" + " if (!u_antialiasing || \n" + " d <= u_antialiasing_start) \n" + " gl_FragColor = vec4(v_color, 1); \n" + " else if (d >= 1.0) \n" + " gl_FragColor = vec4(0, 0, 0, 0); \n" + " else \n" + " { \n" + " float alpha = 1.0 - smoothstep(u_antialiasing_start, 1.0, d); \n" + " gl_FragColor = vec4(v_color * alpha, alpha); \n" + " } \n" + "}"; + + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLLinesProgram::Data::Segment + { + private: + bool isEmpty_; + double x1_; + double y1_; + double x2_; + double y2_; + double miterX1_; + double miterY1_; + double miterX2_; + double miterY2_; + + Vector lineAbove_; // In homogeneous coordinates (size = 3) + Vector lineBelow_; + + public: + Segment(const PolylineSceneLayer::Chain& chain, + size_t index1, + size_t index2) : + isEmpty_(false) + { + if (index1 >= chain.size() || + index2 >= chain.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + const ScenePoint2D& p = chain[index1]; + const ScenePoint2D& q = chain[index2]; + + x1_ = p.GetX(); + y1_ = p.GetY(); + x2_ = q.GetX(); + y2_ = q.GetY(); + + const double dx = x2_ - x1_; + const double dy = y2_ - y1_; + const double norm = sqrt(dx * dx + dy * dy); + + if (LinearAlgebra::IsCloseToZero(norm)) + { + isEmpty_ = true; + } + else + { + isEmpty_ = false; + const double normalX = -dy / norm; + const double normalY = dx / norm; + + miterX1_ = normalX; + miterY1_ = normalY; + miterX2_ = normalX; + miterY2_ = normalY; + + Vector a = LinearAlgebra::CreateVector(x1_ + normalX, y1_ + normalY, 1); + Vector b = LinearAlgebra::CreateVector(x2_ + normalX, y2_ + normalY, 1); + LinearAlgebra::CrossProduct(lineAbove_, a, b); + + a = LinearAlgebra::CreateVector(x1_ - normalX, y1_ - normalY, 1); + b = LinearAlgebra::CreateVector(x2_ - normalX, y2_ - normalY, 1); + LinearAlgebra::CrossProduct(lineBelow_, a, b); + } + } + } + + bool IsEmpty() const + { + return isEmpty_; + } + + static double ComputeSignedArea(double x1, + double y1, + double x2, + double y2, + double x3, + double y3) + { + // This computes the signed area of a 2D triangle. This + // formula is e.g. used in the sorting algorithm of Graham's + // scan to compute the convex hull. + // https://en.wikipedia.org/wiki/Graham_scan + return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1); + } + + static void CreateMiter(Segment& left, + Segment& right) + { + if (!left.IsEmpty() && + !right.IsEmpty()) + { + Vector above, below; + LinearAlgebra::CrossProduct(above, left.lineAbove_, right.lineAbove_); + LinearAlgebra::CrossProduct(below, left.lineBelow_, right.lineBelow_); + + if (!LinearAlgebra::IsCloseToZero(above[2]) && + !LinearAlgebra::IsCloseToZero(below[2])) + { + // Back to inhomogeneous 2D coordinates + above /= above[2]; + below /= below[2]; + + // Check whether "above" and "below" intersection points + // are on the half-plane defined by the endpoints of the + // two segments. This is an indicator of whether the angle + // is too acute. + double s1 = ComputeSignedArea(left.x1_, left.y1_, + above[0], above[1], + right.x2_, right.y2_); + double s2 = ComputeSignedArea(left.x1_, left.y1_, + below[0], below[1], + right.x2_, right.y2_); + + // The two signed areas must have the same sign + if (s1 * s2 >= 0) + { + left.miterX2_ = above[0] - left.x2_; + left.miterY2_ = above[1] - left.y2_; + + right.miterX1_ = left.miterX2_; + right.miterY1_ = left.miterY2_; + } + } + } + } + + void AddTriangles(std::vector& coords, + std::vector& miterDirections, + std::vector& colors, + const Color& color) + { + if (isEmpty_) + { + LOG(ERROR) << "OpenGLLinesProgram -- AddTriangles: (isEmpty_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + // First triangle + coords.push_back(static_cast(x1_)); + coords.push_back(static_cast(y1_)); + coords.push_back(static_cast(1)); + coords.push_back(static_cast(x2_)); + coords.push_back(static_cast(y2_)); + coords.push_back(static_cast(-1)); + coords.push_back(static_cast(x2_)); + coords.push_back(static_cast(y2_)); + coords.push_back(static_cast(1)); + + miterDirections.push_back(static_cast(miterX1_)); + miterDirections.push_back(static_cast(miterY1_)); + miterDirections.push_back(static_cast(miterX2_)); + miterDirections.push_back(static_cast(miterY2_)); + miterDirections.push_back(static_cast(miterX2_)); + miterDirections.push_back(static_cast(miterY2_)); + + // Second triangle + coords.push_back(static_cast(x1_)); + coords.push_back(static_cast(y1_)); + coords.push_back(static_cast(1)); + coords.push_back(static_cast(x1_)); + coords.push_back(static_cast(y1_)); + coords.push_back(static_cast(-1)); + coords.push_back(static_cast(x2_)); + coords.push_back(static_cast(y2_)); + coords.push_back(static_cast(-1)); + + miterDirections.push_back(static_cast(miterX1_)); + miterDirections.push_back(static_cast(miterY1_)); + miterDirections.push_back(static_cast(miterX1_)); + miterDirections.push_back(static_cast(miterY1_)); + miterDirections.push_back(static_cast(miterX2_)); + miterDirections.push_back(static_cast(miterY2_)); + + // Add the colors of the 2 triangles (leading to 2 * 3 values) + for (unsigned int i = 0; i < 6; i++) + { + colors.push_back(color.GetRedAsFloat()); + colors.push_back(color.GetGreenAsFloat()); + colors.push_back(color.GetBlueAsFloat()); + } + } + }; + + + OpenGLLinesProgram::Data::Data(OpenGL::IOpenGLContext& context, + const PolylineSceneLayer& layer) : + context_(context), + verticesCount_(0), + thickness_(static_cast(layer.GetThickness())) + { + if (!context_.IsContextLost()) + { + // High-level reference: + // https://mattdesl.svbtle.com/drawing-lines-is-hard + // https://forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shader + + size_t countVertices = 0; + for (size_t i = 0; i < layer.GetChainsCount(); i++) + { + size_t countSegments = layer.GetChain(i).size() - 1; + + if (layer.IsClosedChain(i)) + { + countSegments++; + } + + // Each segment is made of 2 triangles. One triangle is + // defined by 3 points in 2D => 6 vertices per segment. + countVertices += countSegments * 2 * 3; + } + + std::vector coords, colors, miterDirections; + coords.reserve(countVertices * COMPONENTS_POSITION); + colors.reserve(countVertices * COMPONENTS_COLOR); + miterDirections.reserve(countVertices * COMPONENTS_MITER); + + for (size_t i = 0; i < layer.GetChainsCount(); i++) + { + const PolylineSceneLayer::Chain& chain = layer.GetChain(i); + + if (chain.size() > 1) + { + std::vector segments; + for (size_t j = 1; j < chain.size(); j++) + { + segments.push_back(Segment(chain, j - 1, j)); + } + + if (layer.IsClosedChain(i)) + { + segments.push_back(Segment(chain, chain.size() - 1, 0)); + } + + // Try and create nice miters + for (size_t j = 1; j < segments.size(); j++) + { + Segment::CreateMiter(segments[j - 1], segments[j]); + } + + if (layer.IsClosedChain(i)) + { + Segment::CreateMiter(segments.back(), segments.front()); + } + + for (size_t j = 0; j < segments.size(); j++) + { + if (!segments[j].IsEmpty()) + { + segments[j].AddTriangles(coords, miterDirections, colors, layer.GetColor(i)); + } + } + } + } + + assert(coords.size() == colors.size()); + + if (!coords.empty()) + { + verticesCount_ = coords.size() / COMPONENTS_POSITION; + + context_.MakeCurrent(); + glGenBuffers(3, buffers_); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coords.size(), &coords[0], GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * miterDirections.size(), &miterDirections[0], GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[2]); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * colors.size(), &colors[0], GL_STATIC_DRAW); + } + } + } + + + OpenGLLinesProgram::Data::~Data() + { + if (!context_.IsContextLost() && !IsEmpty()) + { + context_.MakeCurrent(); + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteBuffers"); + glDeleteBuffers(3, buffers_); + } + } + + GLuint OpenGLLinesProgram::Data::GetVerticesBuffer() const + { + if (IsEmpty()) + { + LOG(ERROR) << "OpenGLLinesProgram::Data::GetVerticesBuffer(): (IsEmpty())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return buffers_[0]; + } + } + + + GLuint OpenGLLinesProgram::Data::GetMiterDirectionsBuffer() const + { + if (IsEmpty()) + { + LOG(ERROR) << "OpenGLLinesProgram::Data::GetMiterDirectionsBuffer(): (IsEmpty())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return buffers_[1]; + } + } + + + GLuint OpenGLLinesProgram::Data::GetColorsBuffer() const + { + if (IsEmpty()) + { + LOG(ERROR) << "OpenGLLinesProgram::Data::GetColorsBuffer(): (IsEmpty())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return buffers_[2]; + } + } + + + OpenGLLinesProgram::OpenGLLinesProgram(OpenGL::IOpenGLContext& context) : + context_(context) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + program_.reset(new OpenGL::OpenGLProgram(context_)); + program_->CompileShaders(VERTEX_SHADER, FRAGMENT_SHADER); + } + } + + void OpenGLLinesProgram::Apply(const Data& data, + const AffineTransform2D& transform, + bool antialiasing, + bool scaleIndependantThickness) + { + if (!context_.IsContextLost() && !data.IsEmpty()) + { + context_.MakeCurrent(); + program_->Use(); + + GLint locationPosition = program_->GetAttributeLocation("a_position"); + GLint locationMiterDirection = program_->GetAttributeLocation("a_miter_direction"); + GLint locationColor = program_->GetAttributeLocation("a_color"); + + float m[16]; + transform.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); + + glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); + + glBindBuffer(GL_ARRAY_BUFFER, data.GetVerticesBuffer()); + glEnableVertexAttribArray(locationPosition); + glVertexAttribPointer(locationPosition, COMPONENTS_POSITION, GL_FLOAT, GL_FALSE, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, data.GetMiterDirectionsBuffer()); + glEnableVertexAttribArray(locationMiterDirection); + glVertexAttribPointer(locationMiterDirection, COMPONENTS_MITER, GL_FLOAT, GL_FALSE, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, data.GetColorsBuffer()); + glEnableVertexAttribArray(locationColor); + glVertexAttribPointer(locationColor, COMPONENTS_COLOR, GL_FLOAT, GL_FALSE, 0, 0); + + glUniform1i(program_->GetUniformLocation("u_antialiasing"), (antialiasing ? 1 : 0)); + + const double zoom = transform.ComputeZoom(); + const double thickness = data.GetThickness() / 2.0; + const double aliasingBorder = 2.0; // Border for antialiasing ramp, in pixels + assert(aliasingBorder > 0); // Prevent division by zero with "t1" + + if (scaleIndependantThickness) + { + if (antialiasing) + { + double t1 = std::max(thickness, aliasingBorder); + double t0 = std::max(0.0, thickness - aliasingBorder); + + glUniform1f(program_->GetUniformLocation("u_thickness"), + static_cast(t1 / zoom)); + glUniform1f(program_->GetUniformLocation("u_antialiasing_start"), + static_cast(t0 / t1)); + } + else + { + glUniform1f(program_->GetUniformLocation("u_thickness"), + static_cast(thickness / zoom)); + } + } + else + { + if (antialiasing) + { + double t1 = std::max(thickness, aliasingBorder / zoom); + double t0 = std::max(0.0, thickness - aliasingBorder / zoom); + + glUniform1f(program_->GetUniformLocation("u_thickness"), + static_cast(t1)); + glUniform1f(program_->GetUniformLocation("u_antialiasing_start"), + static_cast(t0 / t1)); + } + else + { + glUniform1f(program_->GetUniformLocation("u_thickness"), + static_cast(thickness)); + } + } + + if (antialiasing) + { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glDrawArrays(GL_TRIANGLES, 0, + static_cast(data.GetVerticesCount())); + glDisable(GL_BLEND); + } + else + { + glDrawArrays(GL_TRIANGLES, 0, + static_cast(data.GetVerticesCount())); + } + + glDisableVertexAttribArray(locationPosition); + glDisableVertexAttribArray(locationMiterDirection); + glDisableVertexAttribArray(locationColor); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLLinesProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLLinesProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../OpenGL/IOpenGLContext.h" +#include "../../OpenGL/OpenGLProgram.h" +#include "../../Toolbox/AffineTransform2D.h" +#include "../PolylineSceneLayer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLLinesProgram : public boost::noncopyable + { + public: + class Data : public boost::noncopyable + { + private: + class Segment; + + OpenGL::IOpenGLContext& context_; + GLuint buffers_[3]; + size_t verticesCount_; + float thickness_; + + public: + Data(OpenGL::IOpenGLContext& context, + const PolylineSceneLayer& layer); + + ~Data(); + + bool IsEmpty() const + { + return verticesCount_ == 0; + } + + const size_t GetVerticesCount() const + { + return verticesCount_; + } + + GLuint GetVerticesBuffer() const; + + GLuint GetMiterDirectionsBuffer() const; + + GLuint GetColorsBuffer() const; + + float GetThickness() const + { + return thickness_; + } + }; + + private: + OpenGL::IOpenGLContext& context_; + std::unique_ptr program_; + + public: + OpenGLLinesProgram(OpenGL::IOpenGLContext& context); + + void Apply(const Data& data, + const AffineTransform2D& transform, + bool antialiasing, + bool scaleIndependantThickness); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLLookupTableTextureRenderer.h" + +#include "../../Toolbox/ImageToolbox.h" + + +#include + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLLookupTableTextureRenderer::LoadTexture( + const LookupTableTextureSceneLayer& layer) + { + if (!context_.IsContextLost()) + { + const Orthanc::ImageAccessor& source = layer.GetTexture(); + const unsigned int width = source.GetWidth(); + const unsigned int height = source.GetHeight(); + + if (texture_.get() == NULL || + texture_->GetWidth() != width || + texture_->GetHeight() != height) + { + texture_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, width, height, false)); + } + + layer.Render(*texture_); + + context_.MakeCurrent(); + glTexture_.reset(new OpenGL::OpenGLTexture(context_)); + glTexture_->Load(*texture_, layer.IsLinearInterpolation()); + layerTransform_ = layer.GetTransform(); + } + } + + OpenGLLookupTableTextureRenderer::OpenGLLookupTableTextureRenderer( + OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const LookupTableTextureSceneLayer& layer) + : context_(context) + , program_(program) + { + LoadTexture(layer); + } + + + void OpenGLLookupTableTextureRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost() && glTexture_.get() != NULL) + { + program_.Apply( + *glTexture_, + AffineTransform2D::Combine(transform, layerTransform_), + true); + } + } + + + void OpenGLLookupTableTextureRenderer::Update(const ISceneLayer& layer) + { + // Should never happen (no revisions in color textures) + LoadTexture(dynamic_cast(layer)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,58 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OpenGLColorTextureProgram.h" +#include "CompositorHelper.h" +#include "../LookupTableTextureSceneLayer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLLookupTableTextureRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLColorTextureProgram& program_; + std::unique_ptr glTexture_; + std::unique_ptr texture_; + AffineTransform2D layerTransform_; + + void LoadTexture(const LookupTableTextureSceneLayer& layer); + + public: + OpenGLLookupTableTextureRenderer( + OpenGL::IOpenGLContext& context, + OpenGLColorTextureProgram& program, + const LookupTableTextureSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual void Update(const ISceneLayer& layer); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLShaderVersionDirective.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLShaderVersionDirective.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,29 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_WASM == 1 +// https://emscripten.org/docs/optimizing/Optimizing-WebGL.html +# define ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE "precision mediump float;\n" +#else +# define ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE "#version 110\n" +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,229 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLTextProgram.h" +#include "OpenGLShaderVersionDirective.h" + +#include "../../Fonts/OpenGLTextCoordinates.h" + +#include + + +static const unsigned int COMPONENTS = 2; + +static const char* VERTEX_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "attribute vec2 a_texcoord; \n" + "attribute vec4 a_position; \n" + "uniform mat4 u_matrix; \n" + "varying vec2 v_texcoord; \n" + "void main() \n" + "{ \n" + " gl_Position = u_matrix * a_position; \n" + " v_texcoord = a_texcoord; \n" + "}"; + +static const char* FRAGMENT_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "uniform sampler2D u_texture; \n" + "uniform vec3 u_color; \n" + "varying vec2 v_texcoord; \n" + "void main() \n" + "{ \n" + " vec4 v = texture2D(u_texture, v_texcoord); \n" + " gl_FragColor = vec4(u_color * v.w, v.w); \n" // Premultiplied alpha + "}"; + + +namespace OrthancStone +{ + namespace Internals + { + OpenGLTextProgram::OpenGLTextProgram(OpenGL::IOpenGLContext& context) : + context_(context) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + + program_.reset(new OpenGL::OpenGLProgram(context_)); + program_->CompileShaders(VERTEX_SHADER, FRAGMENT_SHADER); + + positionLocation_ = program_->GetAttributeLocation("a_position"); + textureLocation_ = program_->GetAttributeLocation("a_texcoord"); + } + } + + + OpenGLTextProgram::Data::Data(OpenGL::IOpenGLContext& context, + const GlyphTextureAlphabet& alphabet, + const TextSceneLayer& layer) : + context_(context), + red_(layer.GetColor().GetRedAsFloat()), + green_(layer.GetColor().GetGreenAsFloat()), + blue_(layer.GetColor().GetBlueAsFloat()), + x_(layer.GetX()), + y_(layer.GetY()), + border_(layer.GetBorder()), + anchor_(layer.GetAnchor()) + { + OpenGL::OpenGLTextCoordinates coordinates(alphabet, layer.GetText()); + textWidth_ = coordinates.GetTextWidth(); + textHeight_ = coordinates.GetTextHeight(); + + if (coordinates.IsEmpty()) + { + coordinatesCount_ = 0; + } + else + { + coordinatesCount_ = coordinates.GetRenderingCoords().size(); + + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + glGenBuffers(2, buffers_); + ORTHANC_OPENGL_CHECK("glGenBuffers"); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); + ORTHANC_OPENGL_CHECK("glBindBuffer"); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coordinatesCount_, + &coordinates.GetRenderingCoords()[0], GL_STATIC_DRAW); + ORTHANC_OPENGL_CHECK("glBufferData"); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); + ORTHANC_OPENGL_CHECK("glBindBuffer"); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * coordinatesCount_, + &coordinates.GetTextureCoords()[0], GL_STATIC_DRAW); + ORTHANC_OPENGL_CHECK("glBufferData"); + } + } + } + + + OpenGLTextProgram::Data::~Data() + { + if (!context_.IsContextLost() && !IsEmpty()) + { + try + { + context_.MakeCurrent(); + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteBuffers"); + glDeleteBuffers(2, buffers_); + ORTHANC_OPENGL_CHECK("glDeleteBuffers"); + } + catch (const Orthanc::OrthancException& e) + { + if (e.HasDetails()) + { + LOG(ERROR) << "OrthancException in ~Data: " << e.What() << " Details: " << e.GetDetails(); + } + else + { + LOG(ERROR) << "OrthancException in ~Data: " << e.What(); + } + } + catch (const std::exception& e) + { + LOG(ERROR) << "std::exception in ~Data: " << e.what(); + } + catch (...) + { + LOG(ERROR) << "Unknown exception in ~Data"; + } + } + } + + + GLuint OpenGLTextProgram::Data::GetSceneLocationsBuffer() const + { + if (IsEmpty()) + { + LOG(ERROR) << "OpenGLTextProgram::Data::GetSceneLocationsBuffer(): (IsEmpty())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return buffers_[0]; + } + } + + GLuint OpenGLTextProgram::Data::GetTextureLocationsBuffer() const + { + if (IsEmpty()) + { + LOG(ERROR) << "OpenGLTextProgram::Data::GetTextureLocationsBuffer(): (IsEmpty())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return buffers_[1]; + } + } + + void OpenGLTextProgram::Apply(OpenGL::OpenGLTexture& fontTexture, + const Data& data, + const AffineTransform2D& transform) + { + if (!context_.IsContextLost() && !data.IsEmpty()) + { + context_.MakeCurrent(); + program_->Use(); + + double dx, dy; // In pixels + ComputeAnchorTranslation(dx, dy, data.GetAnchor(), + data.GetTextWidth(), data.GetTextHeight(), + static_cast(data.GetBorder())); + + double x = data.GetX(); + double y = data.GetY(); + transform.Apply(x, y); + + const AffineTransform2D t = AffineTransform2D::CreateOffset(x + dx, y + dy); + + float m[16]; + t.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); + + fontTexture.Bind(program_->GetUniformLocation("u_texture")); + glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); + glUniform3f(program_->GetUniformLocation("u_color"), + data.GetRed(), data.GetGreen(), data.GetBlue()); + + glBindBuffer(GL_ARRAY_BUFFER, data.GetSceneLocationsBuffer()); + glEnableVertexAttribArray(positionLocation_); + glVertexAttribPointer(positionLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, data.GetTextureLocationsBuffer()); + glEnableVertexAttribArray(textureLocation_); + glVertexAttribPointer(textureLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glDrawArrays(GL_TRIANGLES, 0, + static_cast(data.GetCoordinatesCount() / COMPONENTS)); + glDisable(GL_BLEND); + + glDisableVertexAttribArray(positionLocation_); + glDisableVertexAttribArray(textureLocation_); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../Fonts/GlyphTextureAlphabet.h" +#include "../../OpenGL/IOpenGLContext.h" +#include "../../OpenGL/OpenGLProgram.h" +#include "../../OpenGL/OpenGLTexture.h" +#include "../../Toolbox/AffineTransform2D.h" +#include "../TextSceneLayer.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLTextProgram : public boost::noncopyable + { + public: + class Data : public boost::noncopyable + { + private: + OpenGL::IOpenGLContext& context_; + size_t coordinatesCount_; + GLuint buffers_[2]; + float red_; + float green_; + float blue_; + double x_; + double y_; + double border_; + unsigned int textWidth_; + unsigned int textHeight_; + BitmapAnchor anchor_; + + public: + Data(OpenGL::IOpenGLContext& context, + const GlyphTextureAlphabet& alphabet, + const TextSceneLayer& layer); + + ~Data(); + + bool IsEmpty() const + { + return coordinatesCount_ == 0; + } + + size_t GetCoordinatesCount() const + { + return coordinatesCount_; + } + + GLuint GetSceneLocationsBuffer() const; + + GLuint GetTextureLocationsBuffer() const; + + float GetRed() const + { + return red_; + } + + float GetGreen() const + { + return green_; + } + + float GetBlue() const + { + return blue_; + } + + double GetX() const + { + return x_; + } + + double GetY() const + { + return y_; + } + + double GetBorder() const + { + return border_; + } + + unsigned int GetTextWidth() const + { + return textWidth_; + } + + unsigned int GetTextHeight() const + { + return textHeight_; + } + + BitmapAnchor GetAnchor() const + { + return anchor_; + } + }; + + private: + OpenGL::IOpenGLContext& context_; + std::unique_ptr program_; + GLint positionLocation_; + GLint textureLocation_; + + public: + OpenGLTextProgram(OpenGL::IOpenGLContext& context); + + void Apply(OpenGL::OpenGLTexture& fontTexture, + const Data& data, + const AffineTransform2D& transform); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,66 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLTextRenderer.h" + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLTextRenderer::LoadLayer(const TextSceneLayer& layer) + { + if (!context_.IsContextLost()) + data_.reset(new OpenGLTextProgram::Data(context_, alphabet_, layer)); + else + data_.reset(NULL); + } + + + OpenGLTextRenderer::OpenGLTextRenderer(OpenGL::IOpenGLContext& context, + OpenGLTextProgram& program, + const GlyphTextureAlphabet& alphabet, + OpenGL::OpenGLTexture& texture, + const TextSceneLayer& layer) : + context_(context), + program_(program), + alphabet_(alphabet), + texture_(texture) + { + LoadLayer(layer); + } + + + void OpenGLTextRenderer::Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight) + { + if (!context_.IsContextLost() && data_.get() != NULL) + { + program_.Apply(texture_, *data_, transform); + } + } + + void OpenGLTextRenderer::Update(const ISceneLayer& layer) + { + LoadLayer(dynamic_cast(layer)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,56 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CompositorHelper.h" +#include "OpenGLTextProgram.h" + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLTextRenderer : public CompositorHelper::ILayerRenderer + { + private: + OpenGL::IOpenGLContext& context_; + OpenGLTextProgram& program_; + const GlyphTextureAlphabet& alphabet_; + OpenGL::OpenGLTexture& texture_; + std::unique_ptr data_; + + void LoadLayer(const TextSceneLayer& layer); + + public: + OpenGLTextRenderer(OpenGL::IOpenGLContext& context, + OpenGLTextProgram& program, + const GlyphTextureAlphabet& alphabet, + OpenGL::OpenGLTexture& texture, + const TextSceneLayer& layer); + + virtual void Render(const AffineTransform2D& transform, + unsigned int canvasWidth, + unsigned int canvasHeight); + + virtual void Update(const ISceneLayer& layer); + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextureProgram.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextureProgram.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OpenGLTextureProgram.h" +#include "OpenGLShaderVersionDirective.h" + +#include + +static const unsigned int COMPONENTS = 2; +static const unsigned int COUNT = 6; // 2 triangles in 2D + +static const char* VERTEX_SHADER = + ORTHANC_STONE_OPENGL_SHADER_VERSION_DIRECTIVE + "attribute vec2 a_texcoord; \n" + "attribute vec4 a_position; \n" + "uniform mat4 u_matrix; \n" + "varying vec2 v_texcoord; \n" + "void main() \n" + "{ \n" + " gl_Position = u_matrix * a_position; \n" + " v_texcoord = a_texcoord; \n" + "}"; + + +namespace OrthancStone +{ + namespace Internals + { + void OpenGLTextureProgram::InitializeExecution(OpenGL::OpenGLTexture& texture, + const AffineTransform2D& transform) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + program_->Use(); + + AffineTransform2D scale = AffineTransform2D::CreateScaling + (texture.GetWidth(), texture.GetHeight()); + + AffineTransform2D t = AffineTransform2D::Combine(transform, scale); + + float m[16]; + t.ConvertToOpenGLMatrix(m, context_.GetCanvasWidth(), context_.GetCanvasHeight()); + + texture.Bind(program_->GetUniformLocation("u_texture")); + glUniformMatrix4fv(program_->GetUniformLocation("u_matrix"), 1, GL_FALSE, m); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); + glEnableVertexAttribArray(positionLocation_); + glVertexAttribPointer(positionLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); + glEnableVertexAttribArray(textureLocation_); + glVertexAttribPointer(textureLocation_, COMPONENTS, GL_FLOAT, GL_FALSE, 0, 0); + } + } + + void OpenGLTextureProgram::FinalizeExecution() + { + if (!context_.IsContextLost()) + { + glDisableVertexAttribArray(positionLocation_); + glDisableVertexAttribArray(textureLocation_); + } + } + + OpenGLTextureProgram::OpenGLTextureProgram(OpenGL::IOpenGLContext& context, + const char* fragmentShader) : + context_(context) + { + static const float POSITIONS[COMPONENTS * COUNT] = { + 0, 0, + 0, 1, + 1, 0, + 1, 0, + 0, 1, + 1, 1 + }; + + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); + + program_.reset(new OpenGL::OpenGLProgram(context_)); + program_->CompileShaders(VERTEX_SHADER, fragmentShader); + + positionLocation_ = program_->GetAttributeLocation("a_position"); + textureLocation_ = program_->GetAttributeLocation("a_texcoord"); + + glGenBuffers(2, buffers_); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * COMPONENTS * COUNT, POSITIONS, GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, buffers_[1]); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * COMPONENTS * COUNT, POSITIONS, GL_STATIC_DRAW); + } + } + + OpenGLTextureProgram::~OpenGLTextureProgram() + { + if (!context_.IsContextLost()) + { + ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("OpenGLTextureProgram::~OpenGLTextureProgram() | About to call glDeleteBuffers"); + context_.MakeCurrent(); + glDeleteBuffers(2, buffers_); + } + } + + + void OpenGLTextureProgram::Execution::DrawTriangles() + { + if (!that_.context_.IsContextLost()) + { + glDrawArrays(GL_TRIANGLES, 0, COUNT); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Internals/OpenGLTextureProgram.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Internals/OpenGLTextureProgram.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,83 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../../OpenGL/IOpenGLContext.h" +#include "../../OpenGL/OpenGLProgram.h" +#include "../../OpenGL/OpenGLTexture.h" +#include "../../Toolbox/AffineTransform2D.h" + +#include + +namespace OrthancStone +{ + namespace Internals + { + class OpenGLTextureProgram : public boost::noncopyable + { + private: + OpenGL::IOpenGLContext& context_; + std::unique_ptr program_; + GLint positionLocation_; + GLint textureLocation_; + GLuint buffers_[2]; + + void InitializeExecution(OpenGL::OpenGLTexture& texture, + const AffineTransform2D& transform); + + void FinalizeExecution(); + + public: + OpenGLTextureProgram(OpenGL::IOpenGLContext& context, + const char* fragmentShader); + + ~OpenGLTextureProgram(); + + class Execution : public boost::noncopyable + { + private: + OpenGLTextureProgram& that_; + + public: + Execution(OpenGLTextureProgram& that, + OpenGL::OpenGLTexture& texture, + const AffineTransform2D& transform) : + that_(that) + { + that_.InitializeExecution(texture, transform); + } + + ~Execution() + { + that_.FinalizeExecution(); + } + + void DrawTriangles(); + + GLint GetUniformLocation(const std::string& name) + { + return that_.program_->GetUniformLocation(name); + } + }; + }; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/LookupTableStyleConfigurator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/LookupTableStyleConfigurator.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,109 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LookupTableStyleConfigurator.h" + +#include + +namespace OrthancStone +{ + static void StringToVector(std::vector& target, + const std::string& source) + { + target.resize(source.size()); + + for (size_t i = 0; i < source.size(); i++) + { + target[i] = source[i]; + } + } + + LookupTableStyleConfigurator::LookupTableStyleConfigurator() : + revision_(0), + hasLut_(false), + hasRange_(false), + applyLog_(false) + { + } + + void LookupTableStyleConfigurator::SetLookupTable(const std::vector& lut) + { + hasLut_ = true; + lut_ = lut; + revision_++; + } + + void LookupTableStyleConfigurator::SetLookupTable(const std::string& lut) + { + std::vector tmp; + StringToVector(tmp, lut); + SetLookupTable(tmp); + } + + void LookupTableStyleConfigurator::SetRange(float minValue, + float maxValue) + { + if (minValue > maxValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + if ((!hasRange_) || (minValue_ != minValue) || (maxValue_ != maxValue)) + revision_++; + hasRange_ = true; + minValue_ = minValue; + maxValue_ = maxValue; + } + } + + void LookupTableStyleConfigurator::SetApplyLog(bool apply) + { + applyLog_ = apply; + revision_++; + } + + TextureBaseSceneLayer* LookupTableStyleConfigurator::CreateTextureFromImage(const Orthanc::ImageAccessor& image) const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + void LookupTableStyleConfigurator::ApplyStyle(ISceneLayer& layer) const + { + LookupTableTextureSceneLayer& l = dynamic_cast(layer); + + if (hasLut_) + { + l.SetLookupTable(lut_); + } + + if (hasRange_) + { + l.SetRange(minValue_, maxValue_); + } + else + { + l.FitRange(); + } + + l.SetApplyLog(applyLog_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/LookupTableStyleConfigurator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/LookupTableStyleConfigurator.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,77 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ILayerStyleConfigurator.h" + +namespace OrthancStone +{ + /** + This configurator supplies an API to set a display range and a LUT. + */ + class LookupTableStyleConfigurator : public ILayerStyleConfigurator + { + private: + uint64_t revision_; + bool hasLut_; + std::vector lut_; + bool hasRange_; + float minValue_; + float maxValue_; + bool applyLog_; + + public: + LookupTableStyleConfigurator(); + + void SetLookupTable(const std::string& lut); + + /** + See the SetLookupTable(const std::vector& lut) method in the + LookupTableTextureSceneLayer class. + */ + void SetLookupTable(const std::vector& lut); + + void SetRange(float minValue, float maxValue); + + void SetApplyLog(bool apply); + + bool IsApplyLog() const + { + return applyLog_; + } + + virtual uint64_t GetRevision() const + { + return revision_; + } + + virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const; + + virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const + { + return parameters.CreateLookupTableTexture(frame); + } + + virtual void ApplyStyle(ISceneLayer& layer) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,311 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LookupTableTextureSceneLayer.h" + +#include +#include +#include + +namespace OrthancStone +{ + LookupTableTextureSceneLayer::LookupTableTextureSceneLayer(const Orthanc::ImageAccessor& texture) : + applyLog_(false) + { + { + std::unique_ptr t( + new Orthanc::Image(Orthanc::PixelFormat_Float32, + texture.GetWidth(), + texture.GetHeight(), + false)); + + Orthanc::ImageProcessing::Convert(*t, texture); + SetTexture(t.release()); + } + + SetLookupTableGrayscale(); // simple ramp between 0 and 255 + SetRange(0, 1); + } + + + void LookupTableTextureSceneLayer::SetLookupTableGrayscale() + { + std::vector rgb(3 * 256); + + for (size_t i = 0; i < 256; i++) + { + rgb[3 * i] = static_cast(i); + rgb[3 * i + 1] = static_cast(i); + rgb[3 * i + 2] = static_cast(i); + } + + SetLookupTableRgb(rgb); + } + + + void LookupTableTextureSceneLayer::SetLookupTableRgb(const std::vector& lut) + { + if (lut.size() != 3 * 256) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + lut_.resize(4 * 256); + + for (size_t i = 0; i < 256; i++) + { + // Premultiplied alpha + + if (i == 0) + { + // Make zero transparent + lut_[4 * i] = 0; // R + lut_[4 * i + 1] = 0; // G + lut_[4 * i + 2] = 0; // B + lut_[4 * i + 3] = 0; // A + } + else + { + float a = static_cast(i) / 255.0f; + + float r = static_cast(lut[3 * i]) * a; + float g = static_cast(lut[3 * i + 1]) * a; + float b = static_cast(lut[3 * i + 2]) * a; + + lut_[4 * i] = static_cast(std::floor(r)); + lut_[4 * i + 1] = static_cast(std::floor(g)); + lut_[4 * i + 2] = static_cast(std::floor(b)); + lut_[4 * i + 3] = static_cast(std::floor(a * 255.0f)); + } + } + + IncrementRevision(); + } + + + void LookupTableTextureSceneLayer::SetLookupTable(const std::vector& lut) + { + if (lut.size() == 4 * 256) + { + lut_ = lut; + IncrementRevision(); + } + else if (lut.size() == 3 * 256) + { + SetLookupTableRgb(lut); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + void LookupTableTextureSceneLayer::SetRange(float minValue, + float maxValue) + { + if (minValue > maxValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + minValue_ = minValue; + maxValue_ = maxValue; + IncrementRevision(); + } + } + + void LookupTableTextureSceneLayer::SetApplyLog(bool apply) + { + applyLog_ = apply; + IncrementRevision(); + } + + void LookupTableTextureSceneLayer::FitRange() + { + Orthanc::ImageProcessing::GetMinMaxFloatValue(minValue_, maxValue_, GetTexture()); + assert(minValue_ <= maxValue_); + // TODO: debug to be removed + if (fabs(maxValue_ - minValue_) < 0.0001) { + LOG(INFO) << "LookupTableTextureSceneLayer::FitRange(): minValue_ = " << minValue_ << " maxValue_ = " << maxValue_; + } + IncrementRevision(); + } + + + ISceneLayer* LookupTableTextureSceneLayer::Clone() const + { + std::unique_ptr cloned + (new LookupTableTextureSceneLayer(GetTexture())); + + + // TODO: why is windowing_ not copied?????? + cloned->CopyParameters(*this); + cloned->minValue_ = minValue_; + cloned->maxValue_ = maxValue_; + cloned->lut_ = lut_; + + return cloned.release(); + } + + + // Templatized function to speed up computations, by avoiding + // testing conditions on each pixel + template + static void RenderInternal(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + float minValue, + float slope, + const std::vector& lut) + { + static const float LOG_NORMALIZATION = 255.0f / log(1.0f + 255.0f); + + const unsigned int width = source.GetWidth(); + const unsigned int height = source.GetHeight(); + + for (unsigned int y = 0; y < height; y++) + { + const float* p = reinterpret_cast(source.GetConstRow(y)); + uint8_t* q = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < width; x++) + { + float v = (*p - minValue) * slope; + if (v <= 0) + { + v = 0; + } + else if (v >= 255) + { + v = 255; + } + + if (IsApplyLog) + { + // https://theailearner.com/2019/01/01/log-transformation/ + v = LOG_NORMALIZATION * log(1.0f + static_cast(v)); + } + + assert(v >= 0.0f && v <= 255.0f); + + uint8_t vv = static_cast(v); + + switch (TargetFormat) + { + case Orthanc::PixelFormat_BGRA32: + // For Cairo surfaces + q[0] = lut[4 * vv + 2]; // B + q[1] = lut[4 * vv + 1]; // G + q[2] = lut[4 * vv + 0]; // R + q[3] = lut[4 * vv + 3]; // A + break; + + case Orthanc::PixelFormat_RGBA32: + // For OpenGL + q[0] = lut[4 * vv + 0]; // R + q[1] = lut[4 * vv + 1]; // G + q[2] = lut[4 * vv + 2]; // B + q[3] = lut[4 * vv + 3]; // A + break; + + default: + assert(0); + } + + p++; + q += 4; + } + } + } + + + void LookupTableTextureSceneLayer::Render(Orthanc::ImageAccessor& target) const + { + assert(sizeof(float) == 4); + + if (!HasTexture()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + const Orthanc::ImageAccessor& source = GetTexture(); + + if (source.GetFormat() != Orthanc::PixelFormat_Float32 || + (target.GetFormat() != Orthanc::PixelFormat_RGBA32 && + target.GetFormat() != Orthanc::PixelFormat_BGRA32)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (source.GetWidth() != target.GetWidth() || + source.GetHeight() != target.GetHeight()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); + } + + const float minValue = GetMinValue(); + float slope; + + if (GetMinValue() >= GetMaxValue()) + { + slope = 0; + } + else + { + slope = 256.0f / (GetMaxValue() - GetMinValue()); + } + + const std::vector& lut = GetLookupTable(); + if (lut.size() != 4 * 256) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + switch (target.GetFormat()) + { + case Orthanc::PixelFormat_RGBA32: + if (applyLog_) + { + RenderInternal(target, source, minValue, slope, lut); + } + else + { + RenderInternal(target, source, minValue, slope, lut); + } + break; + + case Orthanc::PixelFormat_BGRA32: + if (applyLog_) + { + RenderInternal(target, source, minValue, slope, lut); + } + else + { + RenderInternal(target, source, minValue, slope, lut); + } + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,88 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "TextureBaseSceneLayer.h" + +namespace OrthancStone +{ + class LookupTableTextureSceneLayer : public TextureBaseSceneLayer + { + private: + ImageWindowing windowing_; + float minValue_; + float maxValue_; + std::vector lut_; + bool applyLog_; + + void SetLookupTableRgb(const std::vector& lut); + + public: + // The pixel format must be convertible to Float32 + LookupTableTextureSceneLayer(const Orthanc::ImageAccessor& texture); + + void SetLookupTableGrayscale(); + + // The vector must contain either 3 * 256 values (RGB), or 4 * 256 + // (RGBA). In the RGB case, an alpha channel will be automatically added. + void SetLookupTable(const std::vector& lut); + + void SetRange(float minValue, + float maxValue); + + void FitRange(); + + float GetMinValue() const + { + return minValue_; + } + + float GetMaxValue() const + { + return maxValue_; + } + + // This returns a vector of 4 * 256 values between 0 and 255, in RGBA. + const std::vector& GetLookupTable() const + { + return lut_; + } + + void SetApplyLog(bool apply); + + bool IsApplyLog() const + { + return applyLog_; + } + + virtual ISceneLayer* Clone() const; + + virtual Type GetType() const + { + return Type_LookupTableTexture; + } + + // Render the texture to a color image of format BGRA32 (Cairo + // surfaces) or RGBA32 (OpenGL) + void Render(Orthanc::ImageAccessor& target) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/NullLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/NullLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "ISceneLayer.h" + +#include + +#include + +/** + This layer can be used when a z-index needs to be booked inside a Scene2D. + + It can later be replaced by the actual layer. +*/ +namespace OrthancStone +{ + class NullLayer : public ISceneLayer + { + public: + NullLayer() {} + + virtual ISceneLayer* Clone() const ORTHANC_OVERRIDE + { + return new NullLayer(); + } + + virtual Type GetType() const ORTHANC_OVERRIDE + { + return Type_NullLayer; + } + + virtual bool GetBoundingBox(Extent2D& target) const ORTHANC_OVERRIDE + { + target = Extent2D(); + return false; + } + + virtual uint64_t GetRevision() const ORTHANC_OVERRIDE + { + return 0; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/OpenGLCompositor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/OpenGLCompositor.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,258 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "OpenGLCompositor.h" + +#include "Internals/OpenGLAdvancedPolylineRenderer.h" +#include "Internals/OpenGLBasicPolylineRenderer.h" +#include "Internals/OpenGLColorTextureRenderer.h" +#include "Internals/OpenGLFloatTextureRenderer.h" +#include "Internals/OpenGLInfoPanelRenderer.h" +#include "Internals/OpenGLLookupTableTextureRenderer.h" +#include "Internals/OpenGLTextRenderer.h" + +namespace OrthancStone +{ + class OpenGLCompositor::Font : public boost::noncopyable + { + private: + std::unique_ptr alphabet_; + std::unique_ptr texture_; + + public: + Font(OpenGL::IOpenGLContext& context, const GlyphBitmapAlphabet& dict) + { + alphabet_.reset(new GlyphTextureAlphabet(dict)); + texture_.reset(new OpenGL::OpenGLTexture(context)); + + std::unique_ptr bitmap(alphabet_->ReleaseTexture()); + texture_->Load(*bitmap, true /* enable linear interpolation */); + } + + OpenGL::OpenGLTexture& GetTexture() const + { + assert(texture_.get() != NULL); + return *texture_; + } + + const GlyphTextureAlphabet& GetAlphabet() const + { + assert(alphabet_.get() != NULL); + return *alphabet_; + } + }; + + const OpenGLCompositor::Font* OpenGLCompositor::GetFont(size_t fontIndex) const + { + Fonts::const_iterator found = fonts_.find(fontIndex); + + if (found == fonts_.end()) + { + return NULL; // Unknown font, nothing should be drawn + } + else + { + assert(found->second != NULL); + return found->second; + } + } + + Internals::CompositorHelper::ILayerRenderer* OpenGLCompositor::Create(const ISceneLayer& layer) + { + if (!context_.IsContextLost()) + { + switch (layer.GetType()) + { + case ISceneLayer::Type_InfoPanel: + return new Internals::OpenGLInfoPanelRenderer + (context_, colorTextureProgram_, dynamic_cast(layer)); + + case ISceneLayer::Type_ColorTexture: + return new Internals::OpenGLColorTextureRenderer + (context_, colorTextureProgram_, dynamic_cast(layer)); + + case ISceneLayer::Type_FloatTexture: + return new Internals::OpenGLFloatTextureRenderer + (context_, floatTextureProgram_, dynamic_cast(layer)); + + case ISceneLayer::Type_LookupTableTexture: + return new Internals::OpenGLLookupTableTextureRenderer + (context_, colorTextureProgram_, dynamic_cast(layer)); + + case ISceneLayer::Type_Polyline: + return new Internals::OpenGLAdvancedPolylineRenderer + (context_, linesProgram_, dynamic_cast(layer)); + //return new Internals::OpenGLBasicPolylineRenderer(context_, dynamic_cast(layer)); + + case ISceneLayer::Type_Text: + { + const TextSceneLayer& l = dynamic_cast(layer); + const Font* font = GetFont(l.GetFontIndex()); + if (font == NULL) + { + LOG(WARNING) << "There is no font at index " << l.GetFontIndex(); + return NULL; + } + else + { + return new Internals::OpenGLTextRenderer + (context_, textProgram_, font->GetAlphabet(), font->GetTexture(), l); + } + } + + default: + return NULL; + } + } + else + { + // context is lost. returning null. + return NULL; + } + } + + OpenGLCompositor::OpenGLCompositor(OpenGL::IOpenGLContext& context) : + context_(context), + colorTextureProgram_(context), + floatTextureProgram_(context), + linesProgram_(context), + textProgram_(context), + canvasWidth_(0), + canvasHeight_(0) + { + if (!context_.IsContextLost()) + { + canvasWidth_ = context_.GetCanvasWidth(); + canvasHeight_ = context_.GetCanvasHeight(); + } + + ResetScene(); + } + + OpenGLCompositor::~OpenGLCompositor() + { + if (!context_.IsContextLost()) + { + try + { + try + { + context_.MakeCurrent(); // this can throw if context lost! + } + catch (...) + { + LOG(ERROR) << "context_.MakeCurrent() failed in OpenGLCompositor::~OpenGLCompositor()!"; + } + + for (Fonts::iterator it = fonts_.begin(); it != fonts_.end(); ++it) + { + try + { + + assert(it->second != NULL); + delete it->second; + } + catch (...) + { + LOG(ERROR) << "Exception thrown while deleting OpenGL-based font!"; + } + } + } + catch (...) + { + // logging threw an exception! + } + } + } + + void OpenGLCompositor::Refresh(const Scene2D& scene) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); // this can throw if context lost! + canvasWidth_ = context_.GetCanvasWidth(); + canvasHeight_ = context_.GetCanvasHeight(); + + glViewport(0, 0, canvasWidth_, canvasHeight_); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + helper_->Refresh(scene, canvasWidth_, canvasHeight_); + + context_.SwapBuffer(); + } + } + + void OpenGLCompositor::SetFont(size_t index, + const GlyphBitmapAlphabet& dict) + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); // this can throw if context lost + + std::unique_ptr font(new Font(context_, dict)); + + Fonts::iterator found = fonts_.find(index); + + if (found == fonts_.end()) + { + fonts_[index] = font.release(); + } + else + { + assert(found->second != NULL); + delete found->second; + + found->second = font.release(); + } + } + } + +#if ORTHANC_ENABLE_LOCALE == 1 + void OpenGLCompositor::SetFont(size_t index, + const std::string& ttf, + unsigned int fontSize, + Orthanc::Encoding codepage) + { + if (!context_.IsContextLost()) + { + FontRenderer renderer; + renderer.LoadFont(ttf, fontSize); + + GlyphBitmapAlphabet dict; + dict.LoadCodepage(renderer, codepage); + + SetFont(index, dict); + } + } +#endif + + + void OpenGLCompositor::RefreshCanvasSize() + { + if (!context_.IsContextLost()) + { + context_.MakeCurrent(); // this can throw if context lost! + context_.RefreshCanvasSize(); // Difference with Refresh(scene) + canvasWidth_ = context_.GetCanvasWidth(); + canvasHeight_ = context_.GetCanvasHeight(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/OpenGLCompositor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/OpenGLCompositor.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,87 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ICompositor.h" +#include "Internals/CompositorHelper.h" +#include "Internals/OpenGLColorTextureProgram.h" +#include "Internals/OpenGLFloatTextureProgram.h" +#include "Internals/OpenGLLinesProgram.h" +#include "Internals/OpenGLTextProgram.h" + +namespace OrthancStone +{ + class OpenGLCompositor : public ICompositor, private Internals::CompositorHelper::IRendererFactory + { + private: + class Font; + + typedef std::map Fonts; + + OpenGL::IOpenGLContext& context_; + Fonts fonts_; + std::unique_ptr helper_; + Internals::OpenGLColorTextureProgram colorTextureProgram_; + Internals::OpenGLFloatTextureProgram floatTextureProgram_; + Internals::OpenGLLinesProgram linesProgram_; + Internals::OpenGLTextProgram textProgram_; + unsigned int canvasWidth_; + unsigned int canvasHeight_; + + const Font* GetFont(size_t fontIndex) const; + + virtual Internals::CompositorHelper::ILayerRenderer* Create(const ISceneLayer& layer) ORTHANC_OVERRIDE; + + public: + OpenGLCompositor(OpenGL::IOpenGLContext& context); + + virtual ~OpenGLCompositor(); + + virtual void Refresh(const Scene2D& scene) ORTHANC_OVERRIDE; + + virtual void ResetScene() ORTHANC_OVERRIDE + { + helper_.reset(new Internals::CompositorHelper(*this)); + } + + void SetFont(size_t index, const GlyphBitmapAlphabet& dict); + +#if ORTHANC_ENABLE_LOCALE == 1 + void SetFont(size_t index, + const std::string& ttf, + unsigned int fontSize, + Orthanc::Encoding codepage) ORTHANC_OVERRIDE; +#endif + + virtual void RefreshCanvasSize() ORTHANC_OVERRIDE; + + virtual unsigned int GetCanvasWidth() const ORTHANC_OVERRIDE + { + return canvasWidth_; + } + + virtual unsigned int GetCanvasHeight() const ORTHANC_OVERRIDE + { + return canvasHeight_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PanSceneTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PanSceneTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,63 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "PanSceneTracker.h" +#include "../Viewport/IViewport.h" +#include "../Scene2DViewport/ViewportController.h" + +#include + +namespace OrthancStone +{ + PanSceneTracker::PanSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event) + : OneGesturePointerTracker(viewport) + { + + std::unique_ptr lock(viewport_->Lock()); + + originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); + originalCanvasToScene_ = lock->GetController().GetCanvasToSceneTransform(); + + pivot_ = event.GetMainPosition().Apply(originalCanvasToScene_); + } + + + void PanSceneTracker::PointerMove(const PointerEvent& event) + { + ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_); + + std::unique_ptr lock(viewport_->Lock()); + + lock->GetController().SetSceneToCanvasTransform( + AffineTransform2D::Combine( + originalSceneToCanvas_, + AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), + p.GetY() - pivot_.GetY()))); + lock->Invalidate(); + } + + void PanSceneTracker::Cancel() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PanSceneTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PanSceneTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,42 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2DViewport/OneGesturePointerTracker.h" + +namespace OrthancStone +{ + class PanSceneTracker : public OneGesturePointerTracker + { + public: + PanSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event); + + virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; + virtual void Cancel() ORTHANC_OVERRIDE; + + private: + ScenePoint2D pivot_; + AffineTransform2D originalSceneToCanvas_; + AffineTransform2D originalCanvasToScene_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PointerEvent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PointerEvent.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "PointerEvent.h" + +#include + +namespace OrthancStone +{ + PointerEvent::PointerEvent() : + button_(MouseButton_None), + hasAltModifier_(false), + hasControlModifier_(false), + hasShiftModifier_(false) + { + } + + + ScenePoint2D PointerEvent::GetMainPosition() const + { + if (positions_.empty()) + { + return ScenePoint2D(0, 0); + } + else + { + return positions_[0]; + } + } + + + ScenePoint2D PointerEvent::GetPosition(size_t index) const + { + if (index < positions_.size()) + { + return positions_[index]; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PointerEvent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PointerEvent.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ScenePoint2D.h" + +#include +#include + +namespace OrthancStone +{ + class PointerEvent : public boost::noncopyable + { + private: + MouseButton button_; + std::vector positions_; + bool hasAltModifier_; + bool hasControlModifier_; + bool hasShiftModifier_; + + public: + PointerEvent(); + + ScenePoint2D GetMainPosition() const; + + void AddPosition(const ScenePoint2D& p) + { + positions_.push_back(p); + } + + void AddPosition(double x, + double y) + { + positions_.push_back(ScenePoint2D(x, y)); + } + + size_t GetPositionsCount() const + { + return positions_.size(); + } + + ScenePoint2D GetPosition(size_t index) const; + + void SetAltModifier(bool value) + { + hasAltModifier_ = value; + } + + bool HasAltModifier() const + { + return hasAltModifier_; + } + + void SetControlModifier(bool value) + { + hasControlModifier_ = value; + } + + bool HasControlModifier() const + { + return hasControlModifier_; + } + + void SetShiftModifier(bool value) + { + hasShiftModifier_ = value; + } + + bool HasShiftModifier() const + { + return hasShiftModifier_; + } + + void SetMouseButton(MouseButton button) + { + button_ = button; + } + + MouseButton GetMouseButton() const + { + return button_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PolylineSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PolylineSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,110 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "PolylineSceneLayer.h" + +#include + +namespace OrthancStone +{ + void PolylineSceneLayer::Copy(const PolylineSceneLayer& other) + { + items_ = other.items_; + thickness_ = other.thickness_; + revision_ ++; + } + + + ISceneLayer* PolylineSceneLayer::Clone() const + { + std::unique_ptr cloned(new PolylineSceneLayer); + cloned->Copy(*this); + return cloned.release(); + } + + + void PolylineSceneLayer::SetThickness(double thickness) + { + if (thickness <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + thickness_ = thickness; + revision_++; + } + } + + + void PolylineSceneLayer::AddChain(const Chain& chain, + bool isClosed, + uint8_t red, + uint8_t green, + uint8_t blue) + { + if (!chain.empty()) + { + items_.push_back(Item()); + items_.back().chain_ = chain; + items_.back().closed_ = isClosed; + items_.back().color_ = Color(red, green, blue); + + revision_++; + } + } + + + void PolylineSceneLayer::ClearAllChains() + { + items_.clear(); + revision_++; + } + + const PolylineSceneLayer::Item& PolylineSceneLayer::GetItem(size_t i) const + { + if (i < items_.size()) + { + return items_[i]; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + bool PolylineSceneLayer::GetBoundingBox(Extent2D& target) const + { + target.Reset(); + + for (size_t i = 0; i < items_.size(); i++) + { + for (size_t j = 0; j < items_[i].chain_.size(); j++) + { + const ScenePoint2D& p = items_[i].chain_[j]; + target.AddPoint(p.GetX(), p.GetY()); + } + } + + return true; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/PolylineSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/PolylineSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,122 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "Color.h" +#include "ScenePoint2D.h" +#include "ISceneLayer.h" + +#include + +namespace OrthancStone +{ + class PolylineSceneLayer : public ISceneLayer + { + public: + typedef std::vector Chain; + + private: + struct Item + { + Chain chain_; + bool closed_; + Color color_; + }; + + std::vector items_; + double thickness_; + uint64_t revision_; + + const Item& GetItem(size_t i) const; + + public: + PolylineSceneLayer() : + thickness_(1.0), + revision_(0) + { + } + + void Copy(const PolylineSceneLayer& other); + + virtual uint64_t GetRevision() const + { + return revision_; + } + + virtual ISceneLayer* Clone() const; + + void SetThickness(double thickness); + + double GetThickness() const + { + return thickness_; + } + + void Reserve(size_t countChains) + { + items_.reserve(countChains); + } + + void AddChain(const Chain& chain, + bool isClosed, + uint8_t red, + uint8_t green, + uint8_t blue); + + void AddChain(const Chain& chain, + bool isClosed, + const Color& color) + { + AddChain(chain, isClosed, color.GetRed(), color.GetGreen(), color.GetBlue()); + } + + void ClearAllChains(); + + size_t GetChainsCount() const + { + return items_.size(); + } + + const Chain& GetChain(size_t i) const + { + return GetItem(i).chain_; + } + + bool IsClosedChain(size_t i) const + { + return GetItem(i).closed_; + } + + const Color& GetColor(size_t i) const + { + return GetItem(i).color_; + } + + virtual Type GetType() const + { + return Type_Polyline; + } + + virtual bool GetBoundingBox(Extent2D& target) const; + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "RotateSceneTracker.h" +#include "../Scene2DViewport/ViewportController.h" + +namespace OrthancStone +{ + RotateSceneTracker::RotateSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event) + : OneGesturePointerTracker(viewport) + , click_(event.GetMainPosition()) + , aligner_(viewport, click_) + , isFirst_(true) + { + std::unique_ptr lock(viewport_->Lock()); + originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); + + } + + void RotateSceneTracker::PointerMove(const PointerEvent& event) + { + ScenePoint2D p = event.GetMainPosition(); + double dx = p.GetX() - click_.GetX(); + double dy = p.GetY() - click_.GetY(); + + if (std::abs(dx) > 5.0 || + std::abs(dy) > 5.0) + { + double a = atan2(dy, dx); + + if (isFirst_) + { + referenceAngle_ = a; + isFirst_ = false; + } + + std::unique_ptr lock(viewport_->Lock()); + + lock->GetController().SetSceneToCanvasTransform( + AffineTransform2D::Combine( + AffineTransform2D::CreateRotation(a - referenceAngle_), + originalSceneToCanvas_)); + aligner_.Apply(); + lock->Invalidate(); + } + } + + void RotateSceneTracker::Cancel() + { + // See remark above + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); + lock->Invalidate(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/RotateSceneTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/RotateSceneTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2DViewport/OneGesturePointerTracker.h" +#include "Internals/FixedPointAligner.h" +#include + +namespace OrthancStone +{ + class RotateSceneTracker : public OneGesturePointerTracker + { + public: + RotateSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event); + + virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; + virtual void Cancel() ORTHANC_OVERRIDE; + + private: + ScenePoint2D click_; + Internals::FixedPointAligner aligner_; + double referenceAngle_; + bool isFirst_; + AffineTransform2D originalSceneToCanvas_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Scene2D.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Scene2D.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,272 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Scene2D.h" + +#include + + +namespace OrthancStone +{ + class Scene2D::Item + { + private: + std::unique_ptr layer_; + uint64_t identifier_; + + public: + Item(ISceneLayer* layer, + uint64_t identifier) : + layer_(layer), + identifier_(identifier) + { + if (layer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + ISceneLayer& GetLayer() const + { + if (layer_.get() == NULL) + { + LOG(ERROR) << "Scene2D::Item::GetLayer(): (layer_.get() == NULL)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *layer_; + } + } + + ISceneLayer* ReleaseLayer() + { + if (layer_.get() == NULL) + { + LOG(ERROR) << "Scene2D::Item::ReleaseLayer(): (layer_.get() == NULL)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return layer_.release(); + } + } + + uint64_t GetIdentifier() const + { + return identifier_; + } + }; + + + Scene2D::Scene2D(const Scene2D& other) + : sceneToCanvas_(other.sceneToCanvas_) + , canvasToScene_(other.canvasToScene_) + , layerCounter_(0) + { + for (Content::const_iterator it = other.content_.begin(); + it != other.content_.end(); ++it) + { + content_[it->first] = new Item(it->second->GetLayer().Clone(), layerCounter_++); + } + } + + + Scene2D::~Scene2D() + { + for (Content::iterator it = content_.begin(); + it != content_.end(); ++it) + { + assert(it->second != NULL); + delete it->second; + } + } + + + void Scene2D::SetLayer(int depth, + ISceneLayer* layer) // Takes ownership + { + LOG(TRACE) << "SetLayer(" << depth << ", " << reinterpret_cast(layer) << ")"; + std::unique_ptr item(new Item(layer, layerCounter_++)); + + if (layer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + Content::iterator found = content_.find(depth); + + if (found == content_.end()) + { + content_[depth] = item.release(); + } + else + { + assert(found->second != NULL); + delete found->second; + found->second = item.release(); + } + } + + + void Scene2D::DeleteLayer(int depth) + { + + Content::iterator found = content_.find(depth); + + if (found != content_.end()) + { + LOG(TRACE) << "DeleteLayer --found-- (" << depth << ")"; + assert(found->second != NULL); + delete found->second; + content_.erase(found); + } + } + + + bool Scene2D::HasLayer(int depth) const + { + return (content_.find(depth) != content_.end()); + } + + + ISceneLayer& Scene2D::GetLayer(int depth) const + { + Content::const_iterator found = content_.find(depth); + + if (found == content_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(found->second != NULL); + return found->second->GetLayer(); + } + } + + + int Scene2D::GetMinDepth() const + { + if (content_.size() == 0) + return 0; + else + return content_.begin()->first; + } + + + int Scene2D::GetMaxDepth() const + { + if (content_.size() == 0) + return 0; + else + return content_.rbegin()->first; + } + + ISceneLayer* Scene2D::ReleaseLayer(int depth) + { + Content::iterator found = content_.find(depth); + + if (found == content_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(found->second != NULL); + + std::unique_ptr layer(found->second->ReleaseLayer()); + assert(layer.get() != NULL); + + content_.erase(found); + + return layer.release(); + } + } + + void Scene2D::Apply(IVisitor& visitor) const + { + for (Content::const_iterator it = content_.begin(); + it != content_.end(); ++it) + { + assert(it->second != NULL); + visitor.Visit(*this, it->second->GetLayer(), it->second->GetIdentifier(), it->first); + } + } + + + void Scene2D::SetSceneToCanvasTransform(const AffineTransform2D& transform) + { + // Make sure the transform is invertible before making any change + AffineTransform2D inverse = AffineTransform2D::Invert(transform); + + sceneToCanvas_ = transform; + canvasToScene_ = inverse; + } + + void Scene2D::GetBoundingBox(Extent2D &target) const + { + target.Reset(); + + for (Content::const_iterator it = content_.begin(); + it != content_.end(); ++it) + { + assert(it->second != NULL); + + Extent2D tmp; + if (it->second->GetLayer().GetBoundingBox(tmp)) + { + target.Union(tmp); + } + } + } + + void Scene2D::FitContent(unsigned int canvasWidth, + unsigned int canvasHeight) + { + Extent2D extent; + + GetBoundingBox(extent); + + if (!extent.IsEmpty()) + { + double zoomX = static_cast(canvasWidth) / extent.GetWidth(); + double zoomY = static_cast(canvasHeight) / extent.GetHeight(); + + double zoom = std::min(zoomX, zoomY); + if (LinearAlgebra::IsCloseToZero(zoom)) + { + zoom = 1; + } + + double panX = extent.GetCenterX(); + double panY = extent.GetCenterY(); + + // Bring the center of the scene to (0,0) + AffineTransform2D t1 = AffineTransform2D::CreateOffset(-panX, -panY); + + // Scale the scene + AffineTransform2D t2 = AffineTransform2D::CreateScaling(zoom, zoom); + + SetSceneToCanvasTransform(AffineTransform2D::Combine(t2, t1)); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/Scene2D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/Scene2D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,120 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ISceneLayer.h" +#include "../Toolbox/AffineTransform2D.h" +#include "../Messages/IObservable.h" +#include "../Messages/IMessage.h" + +#include + +namespace OrthancStone +{ + class Scene2D : public boost::noncopyable + { + public: + class IVisitor : public boost::noncopyable + { + public: + virtual ~IVisitor() + { + } + + virtual void Visit(const Scene2D& scene, + const ISceneLayer& layer, + uint64_t layerIdentifier, + int depth) = 0; + }; + + private: + class Item; + + typedef std::map Content; + + Content content_; + AffineTransform2D sceneToCanvas_; + AffineTransform2D canvasToScene_; + uint64_t layerCounter_; + + Scene2D(const Scene2D& other); + + public: + Scene2D() : layerCounter_(0) + { + } + + ~Scene2D(); + + Scene2D* Clone() const + { + return new Scene2D(*this); + } + + void SetLayer(int depth, + ISceneLayer* layer); // Takes ownership + + /** + Removes the layer at specified depth and deletes the underlying object + */ + void DeleteLayer(int depth); + + bool HasLayer(int depth) const; + + ISceneLayer& GetLayer(int depth) const; + + /** + Returns the minimum depth among all layers or 0 if there are no layers + */ + int GetMinDepth() const; + + /** + Returns the minimum depth among all layers or 0 if there are no layers + */ + int GetMaxDepth() const; + + /** + Removes the layer at specified depth and transfers the object + ownership to the caller + */ + ISceneLayer* ReleaseLayer(int depth); + + void Apply(IVisitor& visitor) const; + + const AffineTransform2D& GetSceneToCanvasTransform() const + { + return sceneToCanvas_; + } + + const AffineTransform2D& GetCanvasToSceneTransform() const + { + return canvasToScene_; + } + + void SetSceneToCanvasTransform(const AffineTransform2D& transform); + + void FitContent(unsigned int canvasWidth, + unsigned int canvasHeight); + + void GetBoundingBox(Extent2D& target) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ScenePoint2D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ScenePoint2D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,179 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/AffineTransform2D.h" +#include "../Toolbox/LinearAlgebra.h" + +namespace OrthancStone +{ + class ScenePoint2D + { + private: + double x_; + double y_; + + public: + ScenePoint2D() : + x_(0), + y_(0) + { + } + + ScenePoint2D(double x, + double y) : + x_(x), + y_(y) + { + } + + double GetX() const + { + return x_; + } + + double GetY() const + { + return y_; + } + + ScenePoint2D Apply(const AffineTransform2D& t) const + { + double x = x_; + double y = y_; + t.Apply(x, y); + return ScenePoint2D(x, y); + } + + const ScenePoint2D operator-(const ScenePoint2D& a) const + { + ScenePoint2D v; + v.x_ = x_ - a.x_; + v.y_ = y_ - a.y_; + + return v; + } + + const ScenePoint2D operator+(const ScenePoint2D& a) const + { + ScenePoint2D v; + v.x_ = x_ + a.x_; + v.y_ = y_ + a.y_; + + return v; + } + + const ScenePoint2D operator*(double a) const + { + ScenePoint2D v; + v.x_ = x_ * a; + v.y_ = y_ * a; + + return v; + } + + const ScenePoint2D operator/(double a) const + { + ScenePoint2D v; + v.x_ = x_ / a; + v.y_ = y_ / a; + + return v; + } + + static void MidPoint(ScenePoint2D& result, const ScenePoint2D& a, const ScenePoint2D& b) + { + result.x_ = 0.5 * (a.x_ + b.x_); + result.y_ = 0.5 * (a.y_ + b.y_); + } + + static double Dot(const ScenePoint2D& a, const ScenePoint2D& b) + { + return a.x_ * b.x_ + a.y_ * b.y_; + } + + static double SquaredMagnitude(const ScenePoint2D& v) + { + return v.x_ * v.x_ + v.y_ * v.y_; + } + + static double Magnitude(const ScenePoint2D& v) + { + double squaredMagnitude = SquaredMagnitude(v); + if (LinearAlgebra::IsCloseToZero(squaredMagnitude)) + return 0.0; + return sqrt(squaredMagnitude); + } + + static double SquaredDistancePtPt(const ScenePoint2D& a, const ScenePoint2D& b) + { + ScenePoint2D n = b - a; + return Dot(n, n); + } + + static double DistancePtPt(const ScenePoint2D& a, const ScenePoint2D& b) + { + double squaredDist = SquaredDistancePtPt(a, b); + return sqrt(squaredDist); + } + + /** + Distance from point p to [a,b] segment + + Rewritten from https://www.randygaul.net/2014/07/23/distance-point-to-line-segment/ + */ + static double SquaredDistancePtSegment(const ScenePoint2D& a, const ScenePoint2D& b, const ScenePoint2D& p) + { + ScenePoint2D n = b - a; + ScenePoint2D pa = a - p; + + double c = Dot(n, pa); + + // Closest point is a + if (c > 0.0) + return Dot(pa, pa); + + ScenePoint2D bp = p - b; + + // Closest point is b + if (Dot(n, bp) > 0.0) + return Dot(bp, bp); + + // if segment length is very short, we approximate distance to the + // distance with a + double nq = Dot(n, n); + if (LinearAlgebra::IsCloseToZero(nq)) + { + // segment is very small: approximate distance from point to segment + // with distance from p to a + return Dot(pa, pa); + } + else + { + // Closest point is between a and b + ScenePoint2D e = pa - n * (c / nq); + return Dot(e, e); + } + } + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/TextSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/TextSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,98 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TextSceneLayer.h" + +#include + +namespace OrthancStone +{ + TextSceneLayer::TextSceneLayer() : + x_(0), + y_(0), + fontIndex_(0), + anchor_(BitmapAnchor_Center), + border_(0), + revision_(0) + { + } + + + ISceneLayer* TextSceneLayer::Clone() const + { + std::unique_ptr cloned(new TextSceneLayer); + cloned->SetColor(GetColor()); + cloned->x_ = x_; + cloned->y_ = y_; + cloned->utf8_ = utf8_; + cloned->fontIndex_ = fontIndex_; + cloned->anchor_ = anchor_; + cloned->border_ = border_; + return cloned.release(); + } + + void TextSceneLayer::SetPosition(double x, + double y) + { + if (x != x_ || y != y_) + { + x_ = x; + y_ = y; + revision_++; + } + } + + void TextSceneLayer::SetText(const std::string& utf8) + { + if (utf8 != utf8_) + { + utf8_ = utf8; + revision_++; + } + } + + void TextSceneLayer::SetFontIndex(size_t fontIndex) + { + if (fontIndex != fontIndex_) + { + fontIndex_ = fontIndex; + revision_++; + } + } + + void TextSceneLayer::SetAnchor(BitmapAnchor anchor) + { + if (anchor != anchor_) + { + anchor_ = anchor; + revision_++; + } + } + + void TextSceneLayer::SetBorder(unsigned int border) + { + if (border != border_) + { + border_ = border; + revision_++; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/TextSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/TextSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,104 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ColorSceneLayer.h" +#include "../StoneEnumerations.h" + +#include +#include + +namespace OrthancStone +{ + class TextSceneLayer : public ColorSceneLayer + { + private: + double x_; + double y_; + std::string utf8_; + size_t fontIndex_; + BitmapAnchor anchor_; + unsigned int border_; + uint64_t revision_; + + public: + TextSceneLayer(); + + virtual ISceneLayer* Clone() const; + + void SetPosition(double x, + double y); + + void SetText(const std::string& utf8); + + void SetFontIndex(size_t fontIndex); + + void SetAnchor(BitmapAnchor anchor); + + void SetBorder(unsigned int border); + + double GetX() const + { + return x_; + } + + double GetY() const + { + return y_; + } + + unsigned int GetBorder() const + { + return border_; + } + + const std::string& GetText() const + { + return utf8_; + } + + size_t GetFontIndex() const + { + return fontIndex_; + } + + BitmapAnchor GetAnchor() const + { + return anchor_; + } + + virtual Type GetType() const + { + return Type_Text; + } + + virtual bool GetBoundingBox(Extent2D& target) const + { + return false; + } + + virtual uint64_t GetRevision() const + { + return revision_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,171 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TextureBaseSceneLayer.h" + +#include + +namespace OrthancStone +{ + void TextureBaseSceneLayer::SetTexture(Orthanc::ImageAccessor* texture) + { + if (texture == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + texture_.reset(texture); + IncrementRevision(); + } + } + + + void TextureBaseSceneLayer::CopyParameters(const TextureBaseSceneLayer& other) + { + originX_ = other.originX_; + originY_ = other.originY_; + pixelSpacingX_ = other.pixelSpacingX_; + pixelSpacingY_ = other.pixelSpacingY_; + angle_ = other.angle_; + isLinearInterpolation_ = other.isLinearInterpolation_; + } + + + TextureBaseSceneLayer::TextureBaseSceneLayer() : + originX_(0), + originY_(0), + pixelSpacingX_(1), + pixelSpacingY_(1), + angle_(0), + isLinearInterpolation_(false), + revision_(0) + { + if (pixelSpacingX_ <= 0 || + pixelSpacingY_ <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void TextureBaseSceneLayer::SetOrigin(double x, + double y) + { + originX_ = x; + originY_ = y; + IncrementRevision(); + } + + + void TextureBaseSceneLayer::SetPixelSpacing(double sx, + double sy) + { + if (sx <= 0 || + sy <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + pixelSpacingX_ = sx; + pixelSpacingY_ = sy; + IncrementRevision(); + } + } + + + void TextureBaseSceneLayer::SetAngle(double angle) + { + angle_ = angle; + IncrementRevision(); + } + + + void TextureBaseSceneLayer::SetLinearInterpolation(bool isLinearInterpolation) + { + isLinearInterpolation_ = isLinearInterpolation; + IncrementRevision(); + } + + + const Orthanc::ImageAccessor& TextureBaseSceneLayer::GetTexture() const + { + if (!HasTexture()) + { + LOG(ERROR) << "TextureBaseSceneLayer::GetTexture(): (!HasTexture())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *texture_; + } + } + + + AffineTransform2D TextureBaseSceneLayer::GetTransform() const + { + return AffineTransform2D::Combine( + AffineTransform2D::CreateOffset(originX_, originY_), + AffineTransform2D::CreateRotation(angle_), + AffineTransform2D::CreateScaling(pixelSpacingX_, pixelSpacingY_), + AffineTransform2D::CreateOffset(-0.5, -0.5)); + } + + + bool TextureBaseSceneLayer::GetBoundingBox(Extent2D& target) const + { + if (texture_.get() == NULL) + { + return false; + } + else + { + const AffineTransform2D t = GetTransform(); + + target.Reset(); + + double x, y; + + x = 0; + y = 0; + t.Apply(x, y); + target.AddPoint(x, y); + + x = static_cast(texture_->GetWidth()); + y = 0; + t.Apply(x, y); + target.AddPoint(x, y); + + x = 0; + y = static_cast(texture_->GetHeight()); + t.Apply(x, y); + target.AddPoint(x, y); + + x = static_cast(texture_->GetWidth()); + y = static_cast(texture_->GetHeight()); + t.Apply(x, y); + target.AddPoint(x, y); + + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/TextureBaseSceneLayer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,115 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "ISceneLayer.h" +#include "../Toolbox/AffineTransform2D.h" + +#include +#include + +namespace OrthancStone +{ + class TextureBaseSceneLayer : public ISceneLayer + { + private: + std::unique_ptr texture_; + double originX_; + double originY_; + double pixelSpacingX_; + double pixelSpacingY_; + double angle_; + bool isLinearInterpolation_; + uint64_t revision_; + + protected: + void SetTexture(Orthanc::ImageAccessor* texture); + + void IncrementRevision() + { + revision_++; + } + + void CopyParameters(const TextureBaseSceneLayer& other); + + public: + TextureBaseSceneLayer(); + + // Center of the top-left pixel + void SetOrigin(double x, + double y); + + void SetPixelSpacing(double sx, + double sy); + + // In radians + void SetAngle(double angle); + + void SetLinearInterpolation(bool isLinearInterpolation); + + double GetOriginX() const + { + return originX_; + } + + double GetOriginY() const + { + return originY_; + } + + double GetPixelSpacingX() const + { + return pixelSpacingX_; + } + + double GetPixelSpacingY() const + { + return pixelSpacingY_; + } + + double GetAngle() const + { + return angle_; + } + + bool IsLinearInterpolation() const + { + return isLinearInterpolation_; + } + + bool HasTexture() const + { + return (texture_.get() != NULL); + } + + const Orthanc::ImageAccessor& GetTexture() const; + + AffineTransform2D GetTransform() const; + + virtual bool GetBoundingBox(Extent2D& target) const; + + virtual uint64_t GetRevision() const + { + return revision_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,95 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ZoomSceneTracker.h" +#include "../Scene2DViewport/ViewportController.h" + +namespace OrthancStone +{ + ZoomSceneTracker::ZoomSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event, + unsigned int canvasHeight) + : OneGesturePointerTracker(viewport) + , clickY_(event.GetMainPosition().GetY()) + , aligner_(viewport, event.GetMainPosition()) + { + + std::unique_ptr lock(viewport_->Lock()); + originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); + + if (canvasHeight <= 3) + { + active_ = false; + } + else + { + normalization_ = 1.0 / static_cast(canvasHeight - 1); + active_ = true; + } + } + + void ZoomSceneTracker::PointerMove(const PointerEvent& event) + { + static const double MIN_ZOOM = -4; + static const double MAX_ZOOM = 4; + + if (active_) + { + double y = event.GetMainPosition().GetY(); + + // In the range [-1,1] + double dy = static_cast(y - clickY_) * normalization_; + + double z; + + // Linear interpolation from [-1, 1] to [MIN_ZOOM, MAX_ZOOM] + if (dy < -1.0) + { + z = MIN_ZOOM; + } + else if (dy > 1.0) + { + z = MAX_ZOOM; + } + else + { + z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; + } + + double zoom = pow(2.0, z); + + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().SetSceneToCanvasTransform( + AffineTransform2D::Combine( + AffineTransform2D::CreateScaling(zoom, zoom), + originalSceneToCanvas_)); + aligner_.Apply(); + lock->Invalidate(); + } + } + + void ZoomSceneTracker::Cancel() + { + std::unique_ptr lock(viewport_->Lock()); + lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); + lock->Invalidate(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2D/ZoomSceneTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,51 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + + +#include "../Scene2DViewport/OneGesturePointerTracker.h" +#include "../Viewport/IViewport.h" +#include "Internals/FixedPointAligner.h" + +#include + +namespace OrthancStone +{ + class ZoomSceneTracker : public OneGesturePointerTracker + { + public: + ZoomSceneTracker(boost::shared_ptr viewport, + const PointerEvent& event, + unsigned int canvasHeight); + + virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE; + virtual void Cancel() ORTHANC_OVERRIDE; + + private: + double clickY_; + bool active_; + double normalization_; + Internals::FixedPointAligner aligner_; + AffineTransform2D originalSceneToCanvas_; + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,427 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "AngleMeasureTool.h" +#include "MeasureToolsToolbox.h" +#include "EditAngleMeasureTracker.h" +#include "LayerHolder.h" +#include "../StoneException.h" + +#include + +#include +#include + +//// +//// REMOVE THIS +//#ifndef NDEBUG +//extern void +//TrackerSample_SetInfoDisplayMessage(std::string key, std::string value); +//#endif +//// + +namespace OrthancStone +{ + // the params in the LayerHolder ctor specify the number of polyline and text + // layers + AngleMeasureTool::AngleMeasureTool( + boost::shared_ptr viewport) + : MeasureTool(viewport) +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,5))) +#else + , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,1))) +#endif + , angleHighlightArea_(AngleHighlightArea_None) + { + } + + boost::shared_ptr AngleMeasureTool::Create(boost::shared_ptr viewport) + { + boost::shared_ptr obj(new AngleMeasureTool(viewport)); + obj->MeasureTool::PostConstructor(); + obj->RefreshScene(); + return obj; + } + + AngleMeasureTool::~AngleMeasureTool() + { + // this measuring tool is a RABI for the corresponding visual layers + // stored in the 2D scene + Disable(); + RemoveFromScene(); + } + + void AngleMeasureTool::RemoveFromScene() + { + if (layerHolder_->AreLayersCreated() && IsSceneAlive()) + { + layerHolder_->DeleteLayers(); + } + } + + void AngleMeasureTool::SetSide1End(ScenePoint2D pt) + { + side1End_ = pt; + RefreshScene(); + } + + void AngleMeasureTool::SetSide2End(ScenePoint2D pt) + { + side2End_ = pt; + RefreshScene(); + } + + void AngleMeasureTool::SetAngleHighlightArea(AngleHighlightArea area) + { + if (angleHighlightArea_ != area) + { + angleHighlightArea_ = area; + RefreshScene(); + } + } + + void AngleMeasureTool::ResetHighlightState() + { + SetAngleHighlightArea(AngleHighlightArea_None); + } + + + boost::shared_ptr AngleMeasureTool::GetMemento() const + { + boost::shared_ptr memento(new AngleMeasureToolMemento()); + memento->center_ = center_; + memento->side1End_ = side1End_; + memento->side2End_ = side2End_; + return memento; + } + + void AngleMeasureTool::SetMemento(boost::shared_ptr mementoBase) + { + boost::shared_ptr memento = + boost::dynamic_pointer_cast(mementoBase); + + ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); + center_ = memento->center_; + side1End_ = memento->side1End_; + side2End_ = memento->side2End_; + RefreshScene(); + } + + std::string AngleMeasureTool::GetDescription() + { + std::stringstream ss; + ss << "AngleMeasureTool. Center = " << center_ << " Side1End = " + << side1End_ << " Side2End = " << side2End_; + return ss.str(); + } + + void AngleMeasureTool::Highlight(ScenePoint2D p) + { + AngleHighlightArea angleHighlightArea = AngleHitTest(p); + SetAngleHighlightArea(angleHighlightArea); + } + + AngleMeasureTool::AngleHighlightArea AngleMeasureTool::AngleHitTest(ScenePoint2D p) const + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); + + const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; + + { + const double sqDistanceFromSide1End = + ScenePoint2D::SquaredDistancePtPt(p, side1End_); + + if (sqDistanceFromSide1End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return AngleHighlightArea_Side1End; + } + + { + const double sqDistanceFromSide2End = + ScenePoint2D::SquaredDistancePtPt(p, side2End_); + + if (sqDistanceFromSide2End <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return AngleHighlightArea_Side2End; + } + + { + const double sqDistanceFromCenter = + ScenePoint2D::SquaredDistancePtPt(p, center_); + if (sqDistanceFromCenter <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return AngleHighlightArea_Center; + } + + { + const double sqDistanceFromSide1 = + ScenePoint2D::SquaredDistancePtSegment(center_, side1End_, p); + + if (sqDistanceFromSide1 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return AngleHighlightArea_Side1; + } + + { + const double sqDistanceFromSide2 = + ScenePoint2D::SquaredDistancePtSegment(center_, side2End_, p); + + if (sqDistanceFromSide2 <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return AngleHighlightArea_Side2; + } + + return AngleHighlightArea_None; + } + + bool AngleMeasureTool::HitTest(ScenePoint2D p) + { + return AngleHitTest(p) != AngleHighlightArea_None; + } + + + boost::shared_ptr AngleMeasureTool::CreateEditionTracker(const PointerEvent& e) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + ScenePoint2D scenePos = e.GetMainPosition().Apply( + scene.GetCanvasToSceneTransform()); + + if (!HitTest(scenePos)) + return boost::shared_ptr(); + + /** + new EditLineMeasureTracker( + boost::shared_ptr measureTool; + MessageBroker & broker, + boost::shared_ptr viewport, + const PointerEvent & e); + */ + + boost::shared_ptr editAngleMeasureTracker( + new EditAngleMeasureTracker(shared_from_this(), viewport_, e)); + return editAngleMeasureTracker; + } + + void AngleMeasureTool::SetCenter(ScenePoint2D pt) + { + center_ = pt; + RefreshScene(); + } + + void AngleMeasureTool::RefreshScene() + { + if (IsSceneAlive()) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + if (IsEnabled()) + { + layerHolder_->CreateLayersIfNeeded(); + + { + // Fill the polyline layer with the measurement lines + PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); + if (polylineLayer) + { + polylineLayer->ClearAllChains(); + + const Color color(TOOL_ANGLE_LINES_COLOR_RED, + TOOL_ANGLE_LINES_COLOR_GREEN, + TOOL_ANGLE_LINES_COLOR_BLUE); + + const Color highlightColor(TOOL_ANGLE_LINES_HL_COLOR_RED, + TOOL_ANGLE_LINES_HL_COLOR_GREEN, + TOOL_ANGLE_LINES_HL_COLOR_BLUE); + + // sides + { + { + PolylineSceneLayer::Chain chain; + chain.push_back(side1End_); + chain.push_back(center_); + + if ((angleHighlightArea_ == AngleHighlightArea_Side1) || + (angleHighlightArea_ == AngleHighlightArea_Side2)) + { + polylineLayer->AddChain(chain, false, highlightColor); + } + else + { + polylineLayer->AddChain(chain, false, color); + } + } + { + PolylineSceneLayer::Chain chain; + chain.push_back(side2End_); + chain.push_back(center_); + if ((angleHighlightArea_ == AngleHighlightArea_Side1) || + (angleHighlightArea_ == AngleHighlightArea_Side2)) + { + polylineLayer->AddChain(chain, false, highlightColor); + } + else + { + polylineLayer->AddChain(chain, false, color); + } + } + } + + // Create the handles + { + { + PolylineSceneLayer::Chain chain; + //TODO: take DPI into account + AddSquare(chain, controller.GetScene(), side1End_, + controller.GetHandleSideLengthS()); + + if (angleHighlightArea_ == AngleHighlightArea_Side1End) + polylineLayer->AddChain(chain, true, highlightColor); + else + polylineLayer->AddChain(chain, true, color); + + } + { + PolylineSceneLayer::Chain chain; + //TODO: take DPI into account + AddSquare(chain, controller.GetScene(), side2End_, + controller.GetHandleSideLengthS()); + + if (angleHighlightArea_ == AngleHighlightArea_Side2End) + polylineLayer->AddChain(chain, true, highlightColor); + else + polylineLayer->AddChain(chain, true, color); + } + } + + // Create the arc + { + PolylineSceneLayer::Chain chain; + + AddShortestArc(chain, side1End_, center_, side2End_, + controller.GetAngleToolArcRadiusS()); + if (angleHighlightArea_ == AngleHighlightArea_Center) + polylineLayer->AddChain(chain, false, highlightColor); + else + polylineLayer->AddChain(chain, false, color); + } + } + } + { + // Set the text layer + + double p1cAngle = atan2( + side1End_.GetY() - center_.GetY(), + side1End_.GetX() - center_.GetX()); + + double p2cAngle = atan2( + side2End_.GetY() - center_.GetY(), + side2End_.GetX() - center_.GetX()); + + double delta = NormalizeAngle(p2cAngle - p1cAngle); + double theta = p1cAngle + delta / 2; + + double ox = controller.GetAngleTopTextLabelDistanceS() * cos(theta); + double oy = controller.GetAngleTopTextLabelDistanceS() * sin(theta); + + double pointX = center_.GetX() + ox; + double pointY = center_.GetY() + oy; + + char buf[64]; + double angleDeg = RadiansToDegrees(delta); + + // http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=00B0&mode=hex + sprintf(buf, "%0.02f\xc2\xb0", angleDeg); + +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + SetTextLayerOutlineProperties( + scene, layerHolder_, buf, ScenePoint2D(pointX, pointY), 0); +#else + SetTextLayerProperties( + scene, layerHolder_, buf, ScenePoint2D(pointX, pointY) , 0); +#endif + +#if 0 + // TODO:make it togglable + bool enableInfoDisplay = true; + if (enableInfoDisplay) + { + TrackerSample_SetInfoDisplayMessage("center_.GetX()", + boost::lexical_cast(center_.GetX())); + + TrackerSample_SetInfoDisplayMessage("center_.GetY()", + boost::lexical_cast(center_.GetY())); + + TrackerSample_SetInfoDisplayMessage("side1End_.GetX()", + boost::lexical_cast(side1End_.GetX())); + + TrackerSample_SetInfoDisplayMessage("side1End_.GetY()", + boost::lexical_cast(side1End_.GetY())); + + TrackerSample_SetInfoDisplayMessage("side2End_.GetX()", + boost::lexical_cast(side2End_.GetX())); + + TrackerSample_SetInfoDisplayMessage("side2End_.GetY()", + boost::lexical_cast(side2End_.GetY())); + + TrackerSample_SetInfoDisplayMessage("p1cAngle (deg)", + boost::lexical_cast(RadiansToDegrees(p1cAngle))); + + TrackerSample_SetInfoDisplayMessage("delta (deg)", + boost::lexical_cast(RadiansToDegrees(delta))); + + TrackerSample_SetInfoDisplayMessage("theta (deg)", + boost::lexical_cast(RadiansToDegrees(theta))); + + TrackerSample_SetInfoDisplayMessage("p2cAngle (deg)", + boost::lexical_cast(RadiansToDegrees(p2cAngle))); + + TrackerSample_SetInfoDisplayMessage("ox (scene)", + boost::lexical_cast(ox)); + + TrackerSample_SetInfoDisplayMessage("offsetY (scene)", + boost::lexical_cast(oy)); + + TrackerSample_SetInfoDisplayMessage("pointX", + boost::lexical_cast(pointX)); + + TrackerSample_SetInfoDisplayMessage("pointY", + boost::lexical_cast(pointY)); + + TrackerSample_SetInfoDisplayMessage("angleDeg", + boost::lexical_cast(angleDeg)); + } +#endif + } + } + else + { + RemoveFromScene(); + } + lock->Invalidate(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "MeasureTool.h" + +#include "../Scene2DViewport/LayerHolder.h" +#include "../Scene2D/Scene2D.h" +#include "../Scene2D/ScenePoint2D.h" +#include "../Scene2D/PolylineSceneLayer.h" +#include "../Scene2D/TextSceneLayer.h" + +#include +#include +#include + +#include +#include + +namespace OrthancStone +{ + class AngleMeasureTool : public MeasureTool + { + public: + static boost::shared_ptr Create(boost::shared_ptr viewport); + + ~AngleMeasureTool(); + + void SetSide1End(ScenePoint2D start); + void SetCenter(ScenePoint2D start); + void SetSide2End(ScenePoint2D start); + + virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void ResetHighlightState() ORTHANC_OVERRIDE; + virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual boost::shared_ptr GetMemento() const ORTHANC_OVERRIDE; + virtual void SetMemento(boost::shared_ptr) ORTHANC_OVERRIDE; + virtual std::string GetDescription() ORTHANC_OVERRIDE; + + enum AngleHighlightArea + { + AngleHighlightArea_None, + AngleHighlightArea_Side1End, + AngleHighlightArea_Side1, + AngleHighlightArea_Side2End, + AngleHighlightArea_Side2, + AngleHighlightArea_Center + }; + + + AngleHighlightArea AngleHitTest(ScenePoint2D p) const; + + private: + AngleMeasureTool(boost::shared_ptr viewport); + + virtual void RefreshScene() ORTHANC_OVERRIDE; + void RemoveFromScene(); + void SetAngleHighlightArea(AngleHighlightArea area); + + private: + ScenePoint2D side1End_; + ScenePoint2D side2End_; + ScenePoint2D center_; + boost::shared_ptr layerHolder_; + AngleHighlightArea angleHighlightArea_; + }; + + class AngleMeasureToolMemento : public MeasureToolMemento + { + public: + ScenePoint2D side1End_; + ScenePoint2D side2End_; + ScenePoint2D center_; + }; +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "CreateAngleMeasureCommand.h" + +#include +#include + +namespace OrthancStone +{ + CreateAngleMeasureCommand::CreateAngleMeasureCommand( + boost::shared_ptr viewport, + ScenePoint2D point) + : CreateMeasureCommand(viewport) + , measureTool_(AngleMeasureTool::Create(viewport)) + { + + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + + controller.AddMeasureTool(measureTool_); + measureTool_->SetSide1End(point); + measureTool_->SetCenter(point); + measureTool_->SetSide2End(point); + } + + /** This method sets center*/ + void CreateAngleMeasureCommand::SetCenter(ScenePoint2D scenePos) + { + measureTool_->SetCenter(scenePos); + } + + /** This method sets end of side 2*/ + void CreateAngleMeasureCommand::SetSide2End(ScenePoint2D scenePos) + { + measureTool_->SetSide2End(scenePos); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,47 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "MeasureCommands.h" + +namespace OrthancStone +{ + class CreateAngleMeasureCommand : public CreateMeasureCommand + { + public: + /** Ctor sets end of side 1*/ + CreateAngleMeasureCommand( + boost::shared_ptr viewport, + ScenePoint2D point); + + /** This method sets center*/ + void SetCenter(ScenePoint2D scenePos); + + /** This method sets end of side 2*/ + void SetSide2End(ScenePoint2D scenePos); + + private: + virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE + { + return measureTool_; + } + boost::shared_ptr measureTool_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,133 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "CreateAngleMeasureTracker.h" +#include "CreateAngleMeasureCommand.h" + +#include + +namespace OrthancStone +{ + CreateAngleMeasureTracker::CreateAngleMeasureTracker( + boost::shared_ptr viewport, + const PointerEvent& e) + : CreateMeasureTracker(viewport) + , state_(CreatingSide1) + { + ScenePoint2D point = e.GetMainPosition(); + { + std::unique_ptr lock(viewport_->Lock()); + Scene2D& scene = lock->GetController().GetScene(); + point = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + } + command_.reset(new CreateAngleMeasureCommand(viewport, point)); + } + + CreateAngleMeasureTracker::~CreateAngleMeasureTracker() + { + } + + void CreateAngleMeasureTracker::PointerMove(const PointerEvent& event) + { + if (!alive_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Internal error: wrong state in CreateAngleMeasureTracker::" + "PointerMove: active_ == false"); + } + + + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + + ScenePoint2D scenePos = event.GetMainPosition().Apply( + controller.GetScene().GetCanvasToSceneTransform()); + + switch (state_) + { + case CreatingSide1: + GetCommand()->SetCenter(scenePos); + break; + case CreatingSide2: + GetCommand()->SetSide2End(scenePos); + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Wrong state in CreateAngleMeasureTracker::" + "PointerMove: state_ invalid"); + } + //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << " " << + // "scenePos.GetY() = " << scenePos.GetY(); + lock->Invalidate(); + } + } + + void CreateAngleMeasureTracker::PointerUp(const PointerEvent& e) + { + // TODO: the current app does not prevent multiple PointerDown AND + // PointerUp to be sent to the tracker. + // Unless we augment the PointerEvent structure with the button index, + // we cannot really tell if this pointer up event matches the initial + // pointer down event. Let's make it simple for now. + + switch (state_) + { + case CreatingSide1: + state_ = CreatingSide2; + break; + case CreatingSide2: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Wrong state in CreateAngleMeasureTracker::" + "PointerUp: state_ == CreatingSide2 ; this should not happen"); + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Wrong state in CreateAngleMeasureTracker::" + "PointerMove: state_ invalid"); + } + } + + void CreateAngleMeasureTracker::PointerDown(const PointerEvent& e) + { + switch (state_) + { + case CreatingSide1: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Wrong state in CreateAngleMeasureTracker::" + "PointerDown: state_ == CreatingSide1 ; this should not happen"); + break; + case CreatingSide2: + // we are done + alive_ = false; + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Wrong state in CreateAngleMeasureTracker::" + "PointerMove: state_ invalid"); + } + } + + boost::shared_ptr CreateAngleMeasureTracker::GetCommand() + { + return boost::dynamic_pointer_cast(command_); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "MeasureTrackers.h" +#include "MeasureCommands.h" + +#include + +namespace OrthancStone +{ + class CreateAngleMeasureTracker : public CreateMeasureTracker + { + public: + /** + When you create this tracker, you need to supply it with the undo stack + where it will store the commands that perform the actual measure tool + creation and modification. + In turn, a container for these commands to store the actual measuring + must be supplied, too + */ + CreateAngleMeasureTracker( + boost::shared_ptr viewport, + const PointerEvent& e); + + ~CreateAngleMeasureTracker(); + + virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; + + private: + boost::shared_ptr GetCommand(); + + enum State + { + CreatingSide1, + CreatingSide2, + Finished // just for debug + }; + State state_; + + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateCircleMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateCircleMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,23 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +namespace OrthancStone +{ +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateCircleMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateCircleMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,25 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +namespace OrthancStone +{ +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateLineMeasureCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "CreateLineMeasureCommand.h" + +#include +#include + +namespace OrthancStone +{ + CreateLineMeasureCommand::CreateLineMeasureCommand( + boost::shared_ptr viewport, + ScenePoint2D point) + : CreateMeasureCommand(viewport) + , measureTool_(LineMeasureTool::Create(viewport)) + { + + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + controller.AddMeasureTool(measureTool_); + measureTool_->Set(point, point); + lock->Invalidate(); + } + + void CreateLineMeasureCommand::SetEnd(ScenePoint2D scenePos) + { + measureTool_->SetEnd(scenePos); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateLineMeasureCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,45 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "MeasureCommands.h" + +namespace OrthancStone +{ + class CreateLineMeasureCommand : public CreateMeasureCommand + { + public: + CreateLineMeasureCommand( + boost::shared_ptr viewport, + ScenePoint2D point); + + // the starting position is set in the ctor + void SetEnd(ScenePoint2D scenePos); + + private: + virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE + { + return measureTool_; + } + boost::shared_ptr measureTool_; + }; +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,91 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "CreateLineMeasureTracker.h" +#include "CreateLineMeasureCommand.h" + +#include + +namespace OrthancStone +{ + CreateLineMeasureTracker::CreateLineMeasureTracker( + boost::shared_ptr viewport, + const PointerEvent& e) + : CreateMeasureTracker(viewport) + { + ScenePoint2D point = e.GetMainPosition(); + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + point = e.GetMainPosition().Apply(controller.GetScene().GetCanvasToSceneTransform()); + } + command_.reset(new CreateLineMeasureCommand(viewport, point)); + } + + CreateLineMeasureTracker::~CreateLineMeasureTracker() + { + + } + + void CreateLineMeasureTracker::PointerMove(const PointerEvent& event) + { + if (!alive_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Internal error: wrong state in CreateLineMeasureTracker::" + "PointerMove: active_ == false"); + } + + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + + ScenePoint2D scenePos = event.GetMainPosition().Apply( + controller.GetScene().GetCanvasToSceneTransform()); + + //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << " " << + // "scenePos.GetY() = " << scenePos.GetY(); + + CreateLineMeasureTracker* concreteThis = + dynamic_cast(this); + assert(concreteThis != NULL); + GetCommand()->SetEnd(scenePos); + } + + void CreateLineMeasureTracker::PointerUp(const PointerEvent& e) + { + // TODO: the current app does not prevent multiple PointerDown AND + // PointerUp to be sent to the tracker. + // Unless we augment the PointerEvent structure with the button index, + // we cannot really tell if this pointer up event matches the initial + // pointer down event. Let's make it simple for now. + alive_ = false; + } + + void CreateLineMeasureTracker::PointerDown(const PointerEvent& e) + { + LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " + "are ignored when the line measure creation tracker is active"; + } + + boost::shared_ptr CreateLineMeasureTracker::GetCommand() + { + return boost::dynamic_pointer_cast(command_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,53 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "MeasureTrackers.h" + +#include +#include + +namespace OrthancStone +{ + class CreateLineMeasureTracker : public CreateMeasureTracker + { + public: + /** + When you create this tracker, you need to supply it with the undo stack + where it will store the commands that perform the actual measure tool + creation and modification. + In turn, a container for these commands to store the actual measuring + must be supplied, too + */ + CreateLineMeasureTracker( + boost::shared_ptr viewport, + const PointerEvent& e); + + ~CreateLineMeasureTracker(); + + virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; + + private: + boost::shared_ptr GetCommand(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,20 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,22 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/CreateSimpleTrackerAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/CreateSimpleTrackerAdapter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,79 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "IFlexiblePointerTracker.h" +#include "../Scene2D/IPointerTracker.h" + + +namespace OrthancStone +{ +#if 0 + namespace + { + class SimpleTrackerAdapter : public IFlexiblePointerTracker + { + public: + SimpleTrackerAdapter(boost::shared_ptr wrappedTracker) + : wrappedTracker_(wrappedTracker) + , active_(true) + { + } + + virtual void PointerMove(const PointerEvent& event) ORTHANC_OVERRIDE + { + if(active_) + wrappedTracker_->Update(event); + }; + virtual void PointerUp(const PointerEvent& event) ORTHANC_OVERRIDE + { + if (wrappedTracker_) + { + wrappedTracker_->Release(); + wrappedTracker_ = NULL; + } + active_ = false; + } + virtual void PointerDown(const PointerEvent& event) ORTHANC_OVERRIDE + { + // nothing to do atm + } + virtual bool IsActive() const ORTHANC_OVERRIDE + { + return active_; + } + + virtual void Cancel() ORTHANC_OVERRIDE + { + wrappedTracker_ = NULL; + active_ = false; + } + + private: + boost::shared_ptr wrappedTracker_; + bool active_; + }; + } + + boost::shared_ptr CreateSimpleTrackerAdapter(boost::shared_ptr t) + { + return boost::shared_ptr(new SimpleTrackerAdapter(t)); + } +#endif +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditAngleMeasureCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "EditAngleMeasureCommand.h" + +namespace OrthancStone +{ + EditAngleMeasureCommand::EditAngleMeasureCommand( + boost::shared_ptr measureTool, + boost::shared_ptr viewport) + : EditMeasureCommand(measureTool, viewport) + , measureTool_(measureTool) + { + } + + void EditAngleMeasureCommand::SetCenter(ScenePoint2D scenePos) + { + dynamic_cast(*measureTool_).SetCenter(scenePos); + mementoModified_ = measureTool_->GetMemento(); + } + + + void EditAngleMeasureCommand::SetSide1End(ScenePoint2D scenePos) + { + dynamic_cast(*measureTool_).SetSide1End(scenePos); + mementoModified_ = measureTool_->GetMemento(); + } + + + void EditAngleMeasureCommand::SetSide2End(ScenePoint2D scenePos) + { + dynamic_cast(*measureTool_).SetSide2End(scenePos); + mementoModified_ = measureTool_->GetMemento(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditAngleMeasureCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "MeasureCommands.h" + +namespace OrthancStone +{ + class EditAngleMeasureCommand : public EditMeasureCommand + { + public: + /** Ctor sets end of side 1*/ + EditAngleMeasureCommand( + boost::shared_ptr measureTool, + boost::shared_ptr viewport); + + /** This method sets center*/ + void SetCenter(ScenePoint2D scenePos); + + /** This method sets end of side 1*/ + void SetSide1End(ScenePoint2D scenePos); + + /** This method sets end of side 2*/ + void SetSide2End(ScenePoint2D scenePos); + + private: + virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE + { + return measureTool_; + } + boost::shared_ptr measureTool_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,119 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "EditAngleMeasureTracker.h" +#include "EditAngleMeasureCommand.h" + +#include "../StoneException.h" + +namespace OrthancStone +{ + EditAngleMeasureTracker::EditAngleMeasureTracker( + boost::shared_ptr measureTool, + boost::shared_ptr viewport, + const PointerEvent& e) + : EditMeasureTracker(viewport, e) + { + ScenePoint2D scenePos = e.GetMainPosition(); + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + scenePos = e.GetMainPosition().Apply(controller.GetScene().GetCanvasToSceneTransform()); + } + modifiedZone_ = dynamic_cast(*measureTool).AngleHitTest(scenePos); + command_.reset(new EditAngleMeasureCommand(measureTool, viewport)); + } + + EditAngleMeasureTracker::~EditAngleMeasureTracker() + { + + } + + void EditAngleMeasureTracker::PointerMove(const PointerEvent& e) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + ScenePoint2D scenePos = e.GetMainPosition().Apply( + scene.GetCanvasToSceneTransform()); + + ScenePoint2D delta = scenePos - GetOriginalClickPosition(); + + boost::shared_ptr memento = + boost::dynamic_pointer_cast(command_->mementoOriginal_); + + ORTHANC_ASSERT(memento.get() != NULL); + + switch (modifiedZone_) + { + case AngleMeasureTool::AngleHighlightArea_Center: + { + ScenePoint2D newCenter = memento->center_ + delta; + GetCommand()->SetCenter(newCenter); + } + break; + case AngleMeasureTool::AngleHighlightArea_Side1: + case AngleMeasureTool::AngleHighlightArea_Side2: + { + ScenePoint2D newCenter = memento->center_ + delta; + ScenePoint2D newSide1End = memento->side1End_ + delta; + ScenePoint2D newSide2End = memento->side2End_ + delta; + GetCommand()->SetCenter(newCenter); + GetCommand()->SetSide1End(newSide1End); + GetCommand()->SetSide2End(newSide2End); + } + break; + case AngleMeasureTool::AngleHighlightArea_Side1End: + { + ScenePoint2D newSide1End = memento->side1End_ + delta; + GetCommand()->SetSide1End(newSide1End); + } + break; + case AngleMeasureTool::AngleHighlightArea_Side2End: + { + ScenePoint2D newSide2End = memento->side2End_ + delta; + GetCommand()->SetSide2End(newSide2End); + } + break; + default: + LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; + break; + } + } + + void EditAngleMeasureTracker::PointerUp(const PointerEvent& e) + { + alive_ = false; + } + + void EditAngleMeasureTracker::PointerDown(const PointerEvent& e) + { + LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " + "are ignored when the edit angle tracker is active"; + } + + boost::shared_ptr EditAngleMeasureTracker::GetCommand() + { + boost::shared_ptr ret = boost::dynamic_pointer_cast(command_); + ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditAngleMeasureTracker::GetCommand()"); + return ret; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "MeasureTrackers.h" + +namespace OrthancStone +{ + class EditAngleMeasureCommand; + + class EditAngleMeasureTracker : public EditMeasureTracker + { + public: + /** + When you create this tracker, you need to supply it with the undo stack + where it will store the commands that perform the actual measure tool + creation and modification. + In turn, a container for these commands to store the actual measuring + must be supplied, too + */ + EditAngleMeasureTracker( + boost::shared_ptr measureTool, + boost::shared_ptr viewport, + const PointerEvent& e); + + ~EditAngleMeasureTracker(); + + virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; + + private: + AngleMeasureTool::AngleHighlightArea modifiedZone_; + + boost::shared_ptr GetCommand(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditLineMeasureCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureCommand.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,46 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "EditLineMeasureCommand.h" + +namespace OrthancStone +{ + EditLineMeasureCommand::EditLineMeasureCommand( + boost::shared_ptr measureTool, + boost::shared_ptr viewport) + : EditMeasureCommand(measureTool, viewport) + , measureTool_(measureTool) + { + } + + + void EditLineMeasureCommand::SetStart(ScenePoint2D scenePos) + { + dynamic_cast(*measureTool_).SetStart(scenePos); + mementoModified_ = measureTool_->GetMemento(); + } + + + void EditLineMeasureCommand::SetEnd(ScenePoint2D scenePos) + { + dynamic_cast(*measureTool_).SetEnd(scenePos); + mementoModified_ = measureTool_->GetMemento(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditLineMeasureCommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureCommand.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,43 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "MeasureCommands.h" + +namespace OrthancStone +{ + class EditLineMeasureCommand : public EditMeasureCommand + { + public: + EditLineMeasureCommand( + boost::shared_ptr measureTool, + boost::shared_ptr viewport); + + void SetStart(ScenePoint2D scenePos); + void SetEnd(ScenePoint2D scenePos); + + private: + virtual boost::shared_ptr GetMeasureTool() ORTHANC_OVERRIDE + { + return measureTool_; + } + boost::shared_ptr measureTool_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,112 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "EditLineMeasureTracker.h" +#include "EditLineMeasureCommand.h" + +#include "../StoneException.h" + + +namespace OrthancStone +{ + EditLineMeasureTracker::EditLineMeasureTracker( + boost::shared_ptr measureTool, + boost::shared_ptr viewport, + const PointerEvent& e) + : EditMeasureTracker(viewport, e) + { + ScenePoint2D scenePos = e.GetMainPosition(); + { + std::unique_ptr lock(viewport_->Lock()); + Scene2D& scene = lock->GetController().GetScene(); + scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + } + modifiedZone_ = dynamic_cast(*measureTool).LineHitTest(scenePos); + command_.reset(new EditLineMeasureCommand(measureTool, viewport)); + } + + EditLineMeasureTracker::~EditLineMeasureTracker() + { + + } + + void EditLineMeasureTracker::PointerMove(const PointerEvent& e) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + ScenePoint2D scenePos = e.GetMainPosition().Apply( + scene.GetCanvasToSceneTransform()); + + ScenePoint2D delta = scenePos - GetOriginalClickPosition(); + + boost::shared_ptr memento = + boost::dynamic_pointer_cast(command_->mementoOriginal_); + + ORTHANC_ASSERT(memento.get() != NULL); + + switch (modifiedZone_) + { + case LineMeasureTool::LineHighlightArea_Start: + { + ScenePoint2D newStart = memento->start_ + delta; + GetCommand()->SetStart(newStart); + } + break; + case LineMeasureTool::LineHighlightArea_End: + { + ScenePoint2D newEnd = memento->end_ + delta; + GetCommand()->SetEnd(newEnd); + } + break; + case LineMeasureTool::LineHighlightArea_Segment: + { + ScenePoint2D newStart = memento->start_ + delta; + ScenePoint2D newEnd = memento->end_ + delta; + GetCommand()->SetStart(newStart); + GetCommand()->SetEnd(newEnd); + } + break; + default: + LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; + break; + } + } + + void EditLineMeasureTracker::PointerUp(const PointerEvent& e) + { + alive_ = false; + } + + void EditLineMeasureTracker::PointerDown(const PointerEvent& e) + { + LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " + "are ignored when the edit line tracker is active"; + } + + boost::shared_ptr EditLineMeasureTracker::GetCommand() + { + boost::shared_ptr ret = boost::dynamic_pointer_cast(command_); + ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditLineMeasureTracker::GetCommand()"); + return ret; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "MeasureTrackers.h" + +namespace OrthancStone +{ + class EditLineMeasureCommand; + + class EditLineMeasureTracker : public EditMeasureTracker + { + public: + /** + When you create this tracker, you need to supply it with the undo stack + where it will store the commands that perform the actual measure tool + creation and modification. + In turn, a container for these commands to store the actual measuring + must be supplied, too + */ + EditLineMeasureTracker( + boost::shared_ptr measureTool, + boost::shared_ptr viewport, + const PointerEvent& e); + + ~EditLineMeasureTracker(); + + virtual void PointerMove(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerUp(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual void PointerDown(const PointerEvent& e) ORTHANC_OVERRIDE; + + private: + LineMeasureTool::LineHighlightArea modifiedZone_; + + boost::shared_ptr GetCommand(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/IFlexiblePointerTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/IFlexiblePointerTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,88 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "PredeclaredTypes.h" + +#include "../Scene2D/PointerEvent.h" + + +namespace OrthancStone +{ + /** + This interface represents a flexible mouse tracker that can respond to + several events and is not automatically deleted upon mouse up or when touch + interaction is suspended : for instance, a stateful tracker with a two-step + interaction like: click & drag --> mouse up --> drag --> mouse click + (for instance, for an angle measuring tracker or an ellipse tracker) + */ + class IFlexiblePointerTracker : public boost::noncopyable + { + public: + virtual ~IFlexiblePointerTracker() {} + + /** + This method will be repeatedly called during user interaction + */ + virtual void PointerMove(const PointerEvent& event) = 0; + + /** + This method will be called when a touch/pointer is removed (mouse up, + pen lift, finger removed...) + */ + virtual void PointerUp(const PointerEvent& event) = 0; + + /** + This method will be called when a touch/pointer is added (mouse down, + pen or finger press) + + Important note: the initial pointer down that leads to creating the + tracker is NOT sent to the tracker. + + Thus, if you count the PointerDown vs PointerUp, there will be an extra + PointerUp. + */ + virtual void PointerDown(const PointerEvent& event) = 0; + + /** + This method will be repeatedly called by the tracker owner (for instance, + the application) to check whether the tracker must keep on receiving + interaction or if its job is done and it should be deleted. + */ + virtual bool IsAlive() const = 0; + + /** + This will be called if the tracker needs to be dismissed without committing + its changes to the underlying model. If the model has been modified during + tracker lifetime, it must be restored to its initial value + */ + virtual void Cancel() = 0; + }; + + + /** + This factory adopts the supplied simple tracker and creates a flexible + tracker wrapper around it. + */ + boost::shared_ptr CreateSimpleTrackerAdapter(boost::shared_ptr); +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/LayerHolder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/LayerHolder.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,149 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "LayerHolder.h" +#include "../Scene2D/TextSceneLayer.h" +#include "../Scene2D/PolylineSceneLayer.h" +#include "../Scene2D/Scene2D.h" +#include "../Viewport/IViewport.h" +#include "../StoneException.h" + +namespace OrthancStone +{ + LayerHolder::LayerHolder( + boost::shared_ptr viewport, + int polylineLayerCount, + int textLayerCount, + int infoTextCount) + : textLayerCount_(textLayerCount) + , polylineLayerCount_(polylineLayerCount) + , infoTextCount_(infoTextCount) + , viewport_(viewport) + , baseLayerIndex_(-1) + { + + } + + void LayerHolder::CreateLayers() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + assert(baseLayerIndex_ == -1); + + baseLayerIndex_ = scene.GetMaxDepth() + 100; + + for (int i = 0; i < polylineLayerCount_; ++i) + { + std::unique_ptr layer(new PolylineSceneLayer()); + scene.SetLayer(baseLayerIndex_ + i, layer.release()); + } + + for (int i = 0; i < textLayerCount_; ++i) + { + std::unique_ptr layer(new TextSceneLayer()); + scene.SetLayer(baseLayerIndex_ + polylineLayerCount_ + i, layer.release()); + } + lock->Invalidate(); + } + + void LayerHolder::CreateLayersIfNeeded() + { + if (baseLayerIndex_ == -1) + CreateLayers(); + } + + bool LayerHolder::AreLayersCreated() const + { + return (baseLayerIndex_ != -1); + } + + void LayerHolder::DeleteLayersIfNeeded() + { + if (baseLayerIndex_ != -1) + DeleteLayers(); + } + + void LayerHolder::DeleteLayers() + { + std::unique_ptr lock(viewport_->Lock()); + Scene2D& scene = lock->GetController().GetScene(); + + for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i) + { + ORTHANC_ASSERT(scene.HasLayer(baseLayerIndex_ + i), "No layer"); + scene.DeleteLayer(baseLayerIndex_ + i); + } + baseLayerIndex_ = -1; + lock->Invalidate(); + } + + PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/) + { + std::unique_ptr lock(viewport_->Lock()); + Scene2D& scene = lock->GetController().GetScene(); + + using namespace Orthanc; + ORTHANC_ASSERT(baseLayerIndex_ != -1); + ORTHANC_ASSERT(scene.HasLayer(GetPolylineLayerIndex(index))); + ISceneLayer* layer = &(scene.GetLayer(GetPolylineLayerIndex(index))); + + PolylineSceneLayer* concreteLayer = + dynamic_cast(layer); + + ORTHANC_ASSERT(concreteLayer != NULL); + return concreteLayer; + } + + TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/) + { + std::unique_ptr lock(viewport_->Lock()); + Scene2D& scene = lock->GetController().GetScene(); + + using namespace Orthanc; + ORTHANC_ASSERT(baseLayerIndex_ != -1); + ORTHANC_ASSERT(scene.HasLayer(GetTextLayerIndex(index))); + ISceneLayer* layer = &(scene.GetLayer(GetTextLayerIndex(index))); + + TextSceneLayer* concreteLayer = + dynamic_cast(layer); + + ORTHANC_ASSERT(concreteLayer != NULL); + return concreteLayer; + } + + int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/) + { + using namespace Orthanc; + ORTHANC_ASSERT(index < polylineLayerCount_); + return baseLayerIndex_ + index; + } + + int LayerHolder::GetTextLayerIndex(int index /*= 0*/) + { + using namespace Orthanc; + ORTHANC_ASSERT(index < textLayerCount_); + + // the text layers are placed right after the polyline layers + // this means they are drawn ON TOP + return baseLayerIndex_ + polylineLayerCount_ + index; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/LayerHolder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/LayerHolder.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,108 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "PredeclaredTypes.h" + +#include +#include +#include + +namespace OrthancStone +{ + class PolylineSceneLayer; + class TextSceneLayer; + + /** + This class holds the indices of a set a layer and supplies + getters to the concrete layer objects. Sounds very ad hoc, and it is. + */ + class LayerHolder : public boost::noncopyable + { + public: + /** + This ctor merely stores the scene and layer counts. No layer creation + performed at this time + */ + LayerHolder( + boost::shared_ptr viewport, + int polylineLayerCount, int textLayerCount, int infoTextCount = 0); + + /** + This actually creates the layers + */ + void CreateLayers(); + + /** + This creates the layers if they are not created yet. Can be useful in + some scenarios + */ + void CreateLayersIfNeeded(); + + /** + Whether the various text and polylines layers have all been created or + none at all + */ + bool AreLayersCreated() const; + + /** + This removes the layers from the scene + */ + void DeleteLayers(); + + /** + This removes the layers from the scene if they are already created + */ + void DeleteLayersIfNeeded(); + + /** + Please note that the returned pointer belongs to the scene.Don't you dare + storing or deleting it, you fool! + + This throws if the index is not valid or if the layers are not created or + have been deleted + */ + PolylineSceneLayer* GetPolylineLayer(int index = 0); + + /** + Please note that the returned pointer belongs to the scene. Don't you dare + storing or deleting it, you fool! + + This throws if the index is not valid or if the layers are not created or + have been deleted + */ + TextSceneLayer* GetTextLayer(int index = 0); + + //TextSceneLayer* GetTextLayer(int index = 0); + + private: + int GetPolylineLayerIndex(int index = 0); + int GetTextLayerIndex(int index = 0); + int GetInfoTextLayerIndex(int index = 0); + + int textLayerCount_; + int polylineLayerCount_; + int infoTextCount_; + boost::shared_ptr viewport_; + int baseLayerIndex_; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,293 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "LineMeasureTool.h" +#include "MeasureToolsToolbox.h" +#include "EditLineMeasureTracker.h" +#include "LayerHolder.h" +#include "../StoneException.h" + +#include + +#include + +namespace OrthancStone +{ + + LineMeasureTool::LineMeasureTool( + boost::shared_ptr viewport) + : MeasureTool(viewport) +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,5))) +#else + , layerHolder_(boost::shared_ptr(new LayerHolder(viewport,1,1))) +#endif + , lineHighlightArea_(LineHighlightArea_None) + { + + } + + boost::shared_ptr LineMeasureTool::Create(boost::shared_ptr viewport) + { + boost::shared_ptr obj(new LineMeasureTool(viewport)); + obj->MeasureTool::PostConstructor(); + obj->RefreshScene(); + return obj; + } + + LineMeasureTool::~LineMeasureTool() + { + // this measuring tool is a RABI for the corresponding visual layers + // stored in the 2D scene + Disable(); + RemoveFromScene(); + } + + void LineMeasureTool::RemoveFromScene() + { + if (layerHolder_->AreLayersCreated() && IsSceneAlive()) + { + layerHolder_->DeleteLayers(); + } + } + + void LineMeasureTool::SetStart(ScenePoint2D start) + { + start_ = start; + RefreshScene(); + } + + void LineMeasureTool::SetEnd(ScenePoint2D end) + { + end_ = end; + RefreshScene(); + } + + void LineMeasureTool::Set(ScenePoint2D start, ScenePoint2D end) + { + start_ = start; + end_ = end; + RefreshScene(); + } + + void LineMeasureTool::SetLineHighlightArea(LineHighlightArea area) + { + if (lineHighlightArea_ != area) + { + lineHighlightArea_ = area; + RefreshScene(); + } + } + + std::string LineMeasureTool::GetDescription() + { + std::stringstream ss; + ss << "LineMeasureTool. Start = " << start_ << " End = " << end_; + return ss.str(); + } + + void LineMeasureTool::ResetHighlightState() + { + SetLineHighlightArea(LineHighlightArea_None); + } + + void LineMeasureTool::Highlight(ScenePoint2D p) + { + LineHighlightArea lineHighlightArea = LineHitTest(p); + SetLineHighlightArea(lineHighlightArea); + } + + LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); + const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; + + const double sqDistanceFromStart = + ScenePoint2D::SquaredDistancePtPt(p, start_); + + if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_Start; + + const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); + + if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_End; + + const double sqDistanceFromPtSegment = + ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); + + if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_Segment; + + return LineHighlightArea_None; + } + + bool LineMeasureTool::HitTest(ScenePoint2D p) + { + return LineHitTest(p) != LineHighlightArea_None; + } + + boost::shared_ptr LineMeasureTool::CreateEditionTracker(const PointerEvent& e) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + ScenePoint2D scenePos = e.GetMainPosition().Apply( + scene.GetCanvasToSceneTransform()); + + if (!HitTest(scenePos)) + return boost::shared_ptr(); + + boost::shared_ptr editLineMeasureTracker( + new EditLineMeasureTracker(shared_from_this(), viewport_, e)); + return editLineMeasureTracker; + } + + boost::shared_ptr LineMeasureTool::GetMemento() const + { + boost::shared_ptr memento(new LineMeasureToolMemento()); + memento->start_ = start_; + memento->end_ = end_; + return memento; + } + + void LineMeasureTool::SetMemento( + boost::shared_ptr mementoBase) + { + boost::shared_ptr memento = + boost::dynamic_pointer_cast(mementoBase); + + ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); + + start_ = memento->start_; + end_ = memento->end_; + RefreshScene(); + } + + void LineMeasureTool::RefreshScene() + { + if (IsSceneAlive()) + { + if (IsEnabled()) + { + + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + layerHolder_->CreateLayersIfNeeded(); + { + // Fill the polyline layer with the measurement line + + PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); + if (polylineLayer) + { + polylineLayer->ClearAllChains(); + + const Color color(TOOL_LINES_COLOR_RED, + TOOL_LINES_COLOR_GREEN, + TOOL_LINES_COLOR_BLUE); + + const Color highlightColor(TOOL_LINES_HL_COLOR_RED, + TOOL_LINES_HL_COLOR_GREEN, + TOOL_LINES_HL_COLOR_BLUE); + + { + PolylineSceneLayer::Chain chain; + chain.push_back(start_); + chain.push_back(end_); + if(lineHighlightArea_ == LineHighlightArea_Segment) + polylineLayer->AddChain(chain, false, highlightColor); + else + polylineLayer->AddChain(chain, false, color); + } + + // handles + { + { + PolylineSceneLayer::Chain chain; + + //TODO: take DPI into account + AddSquare(chain, controller.GetScene(), start_, + controller.GetHandleSideLengthS()); + + if (lineHighlightArea_ == LineHighlightArea_Start) + polylineLayer->AddChain(chain, true, highlightColor); + else + polylineLayer->AddChain(chain, true, color); + } + + { + PolylineSceneLayer::Chain chain; + + //TODO: take DPI into account + AddSquare(chain, controller.GetScene(), end_, + controller.GetHandleSideLengthS()); + + if (lineHighlightArea_ == LineHighlightArea_End) + polylineLayer->AddChain(chain, true, highlightColor); + else + polylineLayer->AddChain(chain, true, color); + } + } + } + } + { + // Set the text layer propreties + double deltaX = end_.GetX() - start_.GetX(); + double deltaY = end_.GetY() - start_.GetY(); + double squareDist = deltaX * deltaX + deltaY * deltaY; + double dist = sqrt(squareDist); + char buf[64]; + sprintf(buf, "%0.02f mm", dist); + + // TODO: for now we simply position the text overlay at the middle + // of the measuring segment + double midX = 0.5 * (end_.GetX() + start_.GetX()); + double midY = 0.5 * (end_.GetY() + start_.GetY()); + + { + +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + SetTextLayerOutlineProperties( + scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); +#else + SetTextLayerProperties( + scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); +#endif + lock->Invalidate(); + } + } + lock->Invalidate(); + } + else + { + RemoveFromScene(); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,94 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../Scene2D/PolylineSceneLayer.h" +#include "../Scene2D/Scene2D.h" +#include "../Scene2D/ScenePoint2D.h" +#include "../Scene2D/TextSceneLayer.h" +#include "MeasureTool.h" + +#include +#include +#include + +#include +#include + +namespace OrthancStone +{ + class LineMeasureTool : public MeasureTool + { + public: + static boost::shared_ptr Create(boost::shared_ptr viewport); + + ~LineMeasureTool(); + + void SetStart(ScenePoint2D start); + void SetEnd(ScenePoint2D end); + void Set(ScenePoint2D start, ScenePoint2D end); + + + virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void ResetHighlightState() ORTHANC_OVERRIDE; + virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE; + virtual boost::shared_ptr GetMemento() const ORTHANC_OVERRIDE; + virtual void SetMemento(boost::shared_ptr) ORTHANC_OVERRIDE; + virtual std::string GetDescription() ORTHANC_OVERRIDE; + + enum LineHighlightArea + { + LineHighlightArea_None, + LineHighlightArea_Start, + LineHighlightArea_End, + LineHighlightArea_Segment + }; + + + LineHighlightArea LineHitTest(ScenePoint2D p); + + private: + LineMeasureTool(boost::shared_ptr viewport); + + virtual void RefreshScene() ORTHANC_OVERRIDE; + void RemoveFromScene(); + void SetLineHighlightArea(LineHighlightArea area); + + private: + + private: + ScenePoint2D start_; + ScenePoint2D end_; + boost::shared_ptr layerHolder_; + int baseLayerIndex_; + LineHighlightArea lineHighlightArea_; + }; + + class LineMeasureToolMemento : public MeasureToolMemento + { + public: + ScenePoint2D start_; + ScenePoint2D end_; + }; + +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,112 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MeasureCommands.h" + +#include + +#include +#include + +namespace OrthancStone +{ + void CreateMeasureCommand::Undo() + { + std::unique_ptr lock(viewport_->Lock()); + // simply disable the measure tool upon undo + GetMeasureTool()->Disable(); + lock->GetController().RemoveMeasureTool(GetMeasureTool()); + } + + void CreateMeasureCommand::Redo() + { + std::unique_ptr lock(viewport_->Lock()); + GetMeasureTool()->Enable(); + lock->GetController().AddMeasureTool(GetMeasureTool()); + } + + CreateMeasureCommand::CreateMeasureCommand(boost::shared_ptr viewport) + : MeasureCommand(viewport) + { + + } + + CreateMeasureCommand::~CreateMeasureCommand() + { + // deleting the command should not change the model state + // we thus leave it as is + } + + void DeleteMeasureCommand::Redo() + { + std::unique_ptr lock(viewport_->Lock()); + // simply disable the measure tool upon undo + GetMeasureTool()->Disable(); + lock->GetController().RemoveMeasureTool(GetMeasureTool()); + } + + void DeleteMeasureCommand::Undo() + { + std::unique_ptr lock(viewport_->Lock()); + GetMeasureTool()->Enable(); + lock->GetController().AddMeasureTool(GetMeasureTool()); + } + + DeleteMeasureCommand::~DeleteMeasureCommand() + { + // deleting the command should not change the model state + // we thus leave it as is + } + + DeleteMeasureCommand::DeleteMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport) + : MeasureCommand(viewport) + , mementoOriginal_(measureTool->GetMemento()) + , measureTool_(measureTool) + , mementoModified_(measureTool->GetMemento()) + { + std::unique_ptr lock(viewport_->Lock()); + GetMeasureTool()->Disable(); + lock->GetController().RemoveMeasureTool(GetMeasureTool()); + } + + EditMeasureCommand::EditMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport) + : MeasureCommand(viewport) + , mementoOriginal_(measureTool->GetMemento()) + , mementoModified_(measureTool->GetMemento()) + { + + } + + EditMeasureCommand::~EditMeasureCommand() + { + + } + + void EditMeasureCommand::Undo() + { + // simply disable the measure tool upon undo + GetMeasureTool()->SetMemento(mementoOriginal_); + } + + void EditMeasureCommand::Redo() + { + GetMeasureTool()->SetMemento(mementoModified_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureCommands.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureCommands.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,108 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ +#pragma once + +#include "../Viewport/IViewport.h" + +// to be moved into Stone +#include "PredeclaredTypes.h" +#include "MeasureTool.h" +#include "LineMeasureTool.h" +#include "AngleMeasureTool.h" + +#include +#include + +namespace OrthancStone +{ + class MeasureCommand : public boost::noncopyable + { + public: + MeasureCommand(boost::shared_ptr viewport) : viewport_(viewport) + {} + virtual void Undo() = 0; + virtual void Redo() = 0; + + virtual ~MeasureCommand() {}; + + protected: + boost::shared_ptr viewport_; + }; + + class CreateMeasureCommand : public MeasureCommand + { + public: + CreateMeasureCommand(boost::shared_ptr viewport); + virtual ~CreateMeasureCommand(); + virtual void Undo() ORTHANC_OVERRIDE; + virtual void Redo() ORTHANC_OVERRIDE; + private: + /** Must be implemented by the subclasses that create the actual tool */ + virtual boost::shared_ptr GetMeasureTool() = 0; + }; + + class EditMeasureCommand : public MeasureCommand + { + public: + EditMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport); + virtual ~EditMeasureCommand(); + virtual void Undo() ORTHANC_OVERRIDE; + virtual void Redo() ORTHANC_OVERRIDE; + + /** This memento is the original object state */ + boost::shared_ptr mementoOriginal_; + + private: + /** Must be implemented by the subclasses that edit the actual tool */ + virtual boost::shared_ptr GetMeasureTool() = 0; + + protected: + + /** This memento is updated by the subclasses upon modifications */ + boost::shared_ptr mementoModified_; + }; + + class DeleteMeasureCommand : public MeasureCommand + { + public: + DeleteMeasureCommand(boost::shared_ptr measureTool, boost::shared_ptr viewport); + virtual ~DeleteMeasureCommand(); + virtual void Undo() ORTHANC_OVERRIDE; + virtual void Redo() ORTHANC_OVERRIDE; + + /** This memento is the original object state */ + boost::shared_ptr mementoOriginal_; + + private: + /** Must be implemented by the subclasses that edit the actual tool */ + virtual boost::shared_ptr GetMeasureTool() + { + return measureTool_; + } + + boost::shared_ptr measureTool_; + + protected: + + /** This memento is updated by the subclasses upon modifications */ + boost::shared_ptr mementoModified_; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureTool.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureTool.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MeasureTool.h" + +#include +#include +#include + +#include + +#include "../Viewport/IViewport.h" + +namespace OrthancStone +{ + void MeasureTool::Enable() + { + enabled_ = true; + RefreshScene(); + } + + void MeasureTool::Disable() + { + enabled_ = false; + RefreshScene(); + } + + bool MeasureTool::IsEnabled() const + { + return enabled_; + } + + MeasureTool::MeasureTool( + boost::shared_ptr viewport) + : viewport_(viewport) + , enabled_(true) + { + + } + + void MeasureTool::PostConstructor() + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + + Register( + controller, + &MeasureTool::OnSceneTransformChanged); + } + + bool MeasureTool::IsSceneAlive() const + { + // since the lifetimes of the viewport, viewportcontroller (and the + // measuring tools inside it) are linked, the scene is always alive as + // long as "this" is alive + return true; + } + + void MeasureTool::OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message) + { + RefreshScene(); + } + + +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureTool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureTool.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,160 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../Messages/ObserverBase.h" +#include "../Scene2D/PolylineSceneLayer.h" +#include "../Scene2D/Scene2D.h" +#include "../Scene2D/ScenePoint2D.h" +#include "../Scene2D/TextSceneLayer.h" +#include "../Scene2DViewport/PredeclaredTypes.h" +#include "../Scene2DViewport/ViewportController.h" + +#include + +#include +#include + +namespace OrthancStone +{ + class IFlexiblePointerTracker; + class MeasureToolMemento; + + class MeasureTool : public ObserverBase + { + public: + virtual ~MeasureTool() + { + } + + /** + Enabled tools are rendered in the scene. + */ + void Enable(); + + /** + Disabled tools are not rendered in the scene. This is useful to be able + to use them as their own memento in command stacks (when a measure tool + creation command has been undone, the measure remains alive in the + command object but is disabled so that it can be redone later on easily) + */ + void Disable(); + + /** + This method is called when the scene transform changes. It allows to + recompute the visual elements whose content depend upon the scene transform + */ + void OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message); + + /** + This function must be implemented by the measuring tool to return whether + a given point in scene coords is close to the measuring tool. + + This is used for mouse hover highlighting. + + It is assumed that if the pointer position leads to this function returning + true, then a click at that position will return a tracker to edit the + measuring tool + */ + virtual bool HitTest(ScenePoint2D p) = 0; + + /** + This method must return a memento the captures the tool state (not including + the highlighting state + */ + virtual boost::shared_ptr GetMemento() const = 0; + + /** + This method must apply the supplied memento (this requires RTTI to check + the type) + */ + virtual void SetMemento(boost::shared_ptr) = 0; + + /** + This must create an edition tracker suitable for the supplied click position, + or an empty pointer if no hit test (although this should have been checked + first) + */ + virtual boost::shared_ptr CreateEditionTracker(const PointerEvent& e) = 0; + + /** + Will change the measuring tool to provide visual feedback on the GUI + element that is in the pointer hit zone + */ + virtual void Highlight(ScenePoint2D p) = 0; + + /** + This function must reset the visual highlighted hot zone feedback + */ + virtual void ResetHighlightState() = 0; + + /** + A description of the measuring tool, useful in debug logs + */ + virtual std::string GetDescription() = 0; + + protected: + MeasureTool(boost::shared_ptr viewport); + + void PostConstructor(); + + /** + The measuring tool may exist in a standalone fashion, without any available + scene (because the controller is dead or dying). This call allows to check + before accessing the scene. + */ + bool IsSceneAlive() const; + + /** + This is the meat of the tool: this method must [create (if needed) and] + update the layers and their data according to the measure tool kind and + current state. This is repeatedly called during user interaction + */ + virtual void RefreshScene() = 0; + + /** + enabled_ is not accessible by subclasses because there is a state machine + that we do not wanna mess with + */ + bool IsEnabled() const; + + /** + Protected to allow sub-classes to use this weak pointer in factory methods + (pass them to created objects) + */ + boost::shared_ptr viewport_; + + + private: + bool enabled_; + }; + + class MeasureToolMemento + { + public: + virtual ~MeasureToolMemento() {}; + }; + +} + + //extern void TrackerSample_SetInfoDisplayMessage( + // std::string key, std::string value); diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,366 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MeasureToolsToolbox.h" +#include "PredeclaredTypes.h" +#include "LayerHolder.h" +#include "ViewportController.h" + +#include "../Scene2D/TextSceneLayer.h" +#include "../Scene2D/Scene2D.h" +#include "../StoneException.h" + +#include + +namespace +{ + double g_pi = boost::math::constants::pi(); +} + +namespace OrthancStone +{ + void GetPositionOnBisectingLine( + ScenePoint2D& result + , const ScenePoint2D& p1 + , const ScenePoint2D& c + , const ScenePoint2D& p2 + , const double d) + { + // TODO: fix correct half-plane + double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); + double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); + double angle = 0.5 * (p1cAngle + p2cAngle); + double unitVectorX = cos(angle); + double unitVectorY = sin(angle); + double posX = c.GetX() + d * unitVectorX; + double posY = c.GetX() + d * unitVectorY; + result = ScenePoint2D(posX, posY); + } + + double RadiansToDegrees(double angleRad) + { + static const double factor = 180.0 / g_pi; + return angleRad * factor; + } + + void AddSquare(PolylineSceneLayer::Chain& chain, + const Scene2D& scene, + const ScenePoint2D& centerS, + const double& sideLengthS) + { + /* + The scene is required here because we need to draw the square with its + sides parallel to the SCREEN axis, not the SCENE axis + */ + + // get the scaling factor + const double sceneToCanvas = + scene.GetSceneToCanvasTransform().ComputeZoom(); + + chain.clear(); + chain.reserve(4); + ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); + //TODO: take DPI into account + double handleLX = centerC.GetX() - sideLengthS * sceneToCanvas * 0.5; + double handleTY = centerC.GetY() - sideLengthS * sceneToCanvas * 0.5; + double handleRX = centerC.GetX() + sideLengthS * sceneToCanvas * 0.5; + double handleBY = centerC.GetY() + sideLengthS * sceneToCanvas * 0.5; + ScenePoint2D LTC(handleLX, handleTY); + ScenePoint2D RTC(handleRX, handleTY); + ScenePoint2D RBC(handleRX, handleBY); + ScenePoint2D LBC(handleLX, handleBY); + + ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); + + chain.push_back(startLT); + chain.push_back(startRT); + chain.push_back(startRB); + chain.push_back(startLB); + } +#if 0 + void AddArc( + PolylineSceneLayer::Chain & chain + , const Scene2D & scene + , const ScenePoint2D & p1 + , const ScenePoint2D & c + , const ScenePoint2D & p2 + , const double& radiusS + , const bool clockwise + , const int subdivisionsCount) + { + double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); + double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); + AddArc( + chain, scene, c, radiusS, p1cAngle, p2cAngle, + clockwise, subdivisionsCount); + } +#endif + + void AddShortestArc( + PolylineSceneLayer::Chain& chain + , const ScenePoint2D& p1 + , const ScenePoint2D& c + , const ScenePoint2D& p2 + , const double& radiusS + , const int subdivisionsCount) + { + double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); + double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); + AddShortestArc( + chain, c, radiusS, p1cAngle, p2cAngle, subdivisionsCount); + } + + void AddShortestArc( + PolylineSceneLayer::Chain& chain + , const ScenePoint2D& centerS + , const double& radiusS + , const double startAngleRad + , const double endAngleRad + , const int subdivisionsCount) + { + // this gives a signed difference between angle which + // is the smallest difference (in magnitude) between + // the angles + double delta = NormalizeAngle(endAngleRad - startAngleRad); + + chain.clear(); + chain.reserve(subdivisionsCount + 1); + + double angleIncr = delta / static_cast(subdivisionsCount); + + double theta = startAngleRad; + for (int i = 0; i < subdivisionsCount + 1; ++i) + { + double offsetX = radiusS * cos(theta); + double offsetY = radiusS * sin(theta); + double pointX = centerS.GetX() + offsetX; + double pointY = centerS.GetY() + offsetY; + chain.push_back(ScenePoint2D(pointX, pointY)); + theta += angleIncr; + } + } + +#if 0 + void AddArc( + PolylineSceneLayer::Chain & chain + , const Scene2D & scene + , const ScenePoint2D & centerS + , const double& radiusS + , const double startAngleRad + , const double endAngleRad + , const bool clockwise + , const int subdivisionsCount) + { + double startAngleRadN = NormalizeAngle(startAngleRad); + double endAngleRadN = NormalizeAngle(endAngleRad); + + double angle1Rad = std::min(startAngleRadN, endAngleRadN); + double angle2Rad = std::max(startAngleRadN, endAngleRadN); + + // now we are sure angle1Rad < angle2Rad + // this means that if we draw from 1 to 2, it will be clockwise ( + // increasing angles). + // let's fix this: + if (!clockwise) + { + angle2Rad -= 2 * g_pi; + // now we are sure angle2Rad < angle1Rad (since they were normalized) + // and, thus, going from 1 to 2 means the angle values will DECREASE, + // which is the definition of anticlockwise + } + + chain.clear(); + chain.reserve(subdivisionsCount + 1); + + double angleIncr = (angle2Rad - angle1Rad) + / static_cast(subdivisionsCount); + + double theta = angle1Rad; + for (int i = 0; i < subdivisionsCount + 1; ++i) + { + double offsetX = radiusS * cos(theta); + double offsetY = radiusS * sin(theta); + double pointX = centerS.GetX() + offsetX; + double pointY = centerS.GetY() + offsetY; + chain.push_back(ScenePoint2D(pointX, pointY)); + theta += angleIncr; + } + } +#endif + + void AddCircle(PolylineSceneLayer::Chain& chain, + const ScenePoint2D& centerS, + const double& radiusS, + const int numSubdivisions) + { + //ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); + //TODO: take DPI into account + + // TODO: automatically compute the number for segments for smooth + // display based on the radius in pixels. + + chain.clear(); + chain.reserve(numSubdivisions); + + double angleIncr = (2.0 * g_pi) + / static_cast(numSubdivisions); + + double theta = 0; + for (int i = 0; i < numSubdivisions; ++i) + { + double offsetX = radiusS * cos(theta); + double offsetY = radiusS * sin(theta); + double pointX = centerS.GetX() + offsetX; + double pointY = centerS.GetY() + offsetY; + chain.push_back(ScenePoint2D(pointX, pointY)); + theta += angleIncr; + } + } + + double NormalizeAngle(double angle) + { + double retAngle = angle; + while (retAngle < -1.0 * g_pi) + retAngle += 2 * g_pi; + while (retAngle >= g_pi) + retAngle -= 2 * g_pi; + return retAngle; + } + + double MeasureAngle(const ScenePoint2D& p1, const ScenePoint2D& c, const ScenePoint2D& p2) + { + double p1cAngle = atan2(p1.GetY() - c.GetY(), p1.GetX() - c.GetX()); + double p2cAngle = atan2(p2.GetY() - c.GetY(), p2.GetX() - c.GetX()); + double delta = p2cAngle - p1cAngle; + return NormalizeAngle(delta); + } + + +#if 0 + void AddEllipse(PolylineSceneLayer::Chain & chain, + const Scene2D & scene, + const ScenePoint2D & centerS, + const double& halfHAxis, + const double& halfVAxis) + { + chain.clear(); + chain.reserve(4); + ScenePoint2D centerC = centerS.Apply(scene.GetSceneToCanvasTransform()); + //TODO: take DPI into account + double handleLX = centerC.GetX() - sideLength / 2; + double handleTY = centerC.GetY() - sideLength / 2; + double handleRX = centerC.GetX() + sideLength / 2; + double handleBY = centerC.GetY() + sideLength / 2; + ScenePoint2D LTC(handleLX, handleTY); + ScenePoint2D RTC(handleRX, handleTY); + ScenePoint2D RBC(handleRX, handleBY); + ScenePoint2D LBC(handleLX, handleBY); + + ScenePoint2D startLT = LTC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startRT = RTC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startRB = RBC.Apply(scene.GetCanvasToSceneTransform()); + ScenePoint2D startLB = LBC.Apply(scene.GetCanvasToSceneTransform()); + + chain.push_back(startLT); + chain.push_back(startRT); + chain.push_back(startRB); + chain.push_back(startLB); + } +#endif + +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + /** + This utility function assumes that the layer holder contains 5 text layers + and will use the first four ones for the text background and the fifth one + for the actual text + */ + void SetTextLayerOutlineProperties( + Scene2D& scene + , boost::shared_ptr layerHolder + , const char* text + , ScenePoint2D p + , int startingLayerIndex) + { + double xoffsets[5] = { 2, 0, -2, 0, 0 }; + double yoffsets[5] = { 0, -2, 0, 2, 0 }; + + // get the scaling factor + const double pixelToScene = + scene.GetCanvasToSceneTransform().ComputeZoom(); + + for (int i = startingLayerIndex; i < startingLayerIndex + 5; ++i) + { + TextSceneLayer* textLayer = layerHolder->GetTextLayer(i); + if (textLayer != NULL) + { + textLayer->SetText(text); + + if (i == startingLayerIndex + 4) + { + textLayer->SetColor(TEXT_COLOR_RED, + TEXT_COLOR_GREEN, + TEXT_COLOR_BLUE); + } + else + { + textLayer->SetColor(TEXT_OUTLINE_COLOR_RED, + TEXT_OUTLINE_COLOR_GREEN, + TEXT_OUTLINE_COLOR_BLUE); + } + + ScenePoint2D textAnchor; + int offIndex = i - startingLayerIndex; + ORTHANC_ASSERT(offIndex >= 0 && offIndex < 5); + textLayer->SetPosition( + p.GetX() + xoffsets[offIndex] * pixelToScene, + p.GetY() + yoffsets[offIndex] * pixelToScene); + } + } + } +#else + void SetTextLayerProperties( + Scene2D& scene + , boost::shared_ptr layerHolder + , const char* text + , ScenePoint2D p + , int layerIndex) + { + TextSceneLayer* textLayer = layerHolder->GetTextLayer(layerIndex); + if (textLayer != NULL) + { + textLayer->SetText(text); + textLayer->SetColor(TEXT_COLOR_RED, TEXT_COLOR_GREEN, TEXT_COLOR_BLUE); + + ScenePoint2D textAnchor; + textLayer->SetPosition(p.GetX(), p.GetY()); + } + } +#endif + + std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p) + { + os << "x = " << p.GetX() << " , y = " << p.GetY(); + return os; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,200 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "PredeclaredTypes.h" +#include "../Scene2D/PolylineSceneLayer.h" +#include "../Scene2D/Scene2D.h" + +namespace OrthancStone +{ + + /** + This function will create a square around the center point supplied in + scene coordinates, with a side length given in canvas coordinates. The + square sides are parallel to the canvas boundaries. + */ + void AddSquare(PolylineSceneLayer::Chain& chain, + const Scene2D& scene, + const ScenePoint2D& centerS, + const double& sideLengthS); + + /** + Creates an arc centered on c that goes + - from a point r1: + - so that r1 belongs to the p1,c line + - so that the distance from c to r1 equals radius + - to a point r2: + - so that r2 belongs to the p2,c line + - so that the distance from c to r2 equals radius + - that follows the shortest among the two possible paths + + Warning: the existing chain content will be wiped out. + */ + void AddShortestArc( + PolylineSceneLayer::Chain& chain + , const ScenePoint2D& p1 + , const ScenePoint2D& c + , const ScenePoint2D& p2 + , const double& radiusS + , const int subdivisionsCount = 63); + + /** + Creates an arc (open curve) with "numSubdivisions" (N + 1 points) from + start angle to end angle, by following the shortest arc. + + Warning: the existing chain content will be wiped out. + */ + void AddShortestArc( + PolylineSceneLayer::Chain& chain + , const ScenePoint2D& centerS + , const double& radiusS + , const double startAngleRad + , const double endAngleRad + , const int subdivisionsCount = 63); + +#if 0 + /** + Creates an arc centered on c that goes + - from a point r1: + - so that r1 belongs to the p1,c line + - so that the distance from c to r1 equals radius + - to a point r2: + - so that r2 belongs to the p2,c line + - so that the distance from c to r2 equals radius + + if clockwise is true, the arc is drawn from r1 to r2 with increasing + angle values. Otherwise, the angle values decrease. + + Warning: the existing chain content will be wiped out. + */ + + void AddArc( + PolylineSceneLayer::Chain & chain + , const Scene2D & scene + , const ScenePoint2D & p1 + , const ScenePoint2D & c + , const ScenePoint2D & p2 + , const double& radiusS + , const bool clockwise + , const int subdivisionsCount = 63); + + /** + Creates an arc (open curve) with "numSubdivisions" (N + 1 points) from + start angle to end angle with the supplied radius. + + if clockwise is true, the arc is drawn from start to end by increasing the + angle values. + + Otherwise, the angle value decreases from start to end. + + Warning: the existing chain content will be wiped out. + */ + void AddArc( + PolylineSceneLayer::Chain& chain + , const Scene2D& scene + , const ScenePoint2D& centerS + , const double& radiusS + , const double startAngleRad + , const double endAngleRad + , const bool clockwise + , const int subdivisionsCount = 63); +#endif + /** + Creates a circle (closed curve) with "numSubdivisions" + (N points) + + Warning: the existing chain content will be wiped out. + */ + void AddCircle(PolylineSceneLayer::Chain& chain, + const ScenePoint2D& centerS, + const double& radiusS, + const int numSubdivisions = 63); + + /** + Adds or subtracts 2*pi as many times as need to shift the specified + angle to a value such as: -pi <= value < pi + */ + double NormalizeAngle(double angle); + + /** + Returns the angle magnitude between the p1,c and p2,c lines. + The returned angle is between 0 and 2*pi + + If the angle is between 0 and pi, this means that the shortest arc + from p1 to p2 is clockwise. + + If the angle is between pi and 2*pi, this means that the shortest arc + from p1 to p2 is COUNTERclockwise. + + */ + double MeasureAngle( + const ScenePoint2D& p1, const ScenePoint2D& c, const ScenePoint2D& p2); + + /** + RadiansToDegrees + */ + double RadiansToDegrees(double angleRad); + + /** + This function will return the coordinates of a point that: + - belongs to the two bisecting lines of the p1 c p2 angle. + - is a distance d from c. + Among the four possible points, the one returned will be the one belonging + to the *smallest* half-plane defined by the [c,p1[ and [c,p2[ half-lines. + */ + void GetPositionOnBisectingLine( + ScenePoint2D& result + , const ScenePoint2D& p1 + , const ScenePoint2D& c + , const ScenePoint2D& p2 + , const double d); + + +#if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 + /** + This helper is used when drawing text with an outline. + It set the properties for several text layers at once : first the + four outline layers, with a position shift and then the actual main text + layer. + + The five text layers are supposed to already exist in the scene, starting + from startingLayerIndex, up to (and not including) startingLayerIndex+5. + */ + void SetTextLayerOutlineProperties( + Scene2D& scene + , boost::shared_ptr layerHolder + , const char* text + , ScenePoint2D p + , int startingLayerIndex); +#else + void SetTextLayerProperties( + Scene2D& scene + , boost::shared_ptr layerHolder + , const char* text + , ScenePoint2D p + , int layerIndex); +#endif + + std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p); +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,100 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "MeasureTrackers.h" +#include + +namespace OrthancStone +{ + + CreateMeasureTracker::CreateMeasureTracker(boost::shared_ptr viewport) + : viewport_(viewport) + , alive_(true) + , commitResult_(true) + { + } + + void CreateMeasureTracker::Cancel() + { + commitResult_ = false; + alive_ = false; + } + + bool CreateMeasureTracker::IsAlive() const + { + return alive_; + } + + CreateMeasureTracker::~CreateMeasureTracker() + { + // if the tracker completes successfully, we add the command + // to the undo stack + // otherwise, we simply undo it + + std::unique_ptr lock(viewport_->Lock()); + + if (commitResult_) + lock->GetController().PushCommand(command_); + else + command_->Undo(); + + lock->Invalidate(); + } + + EditMeasureTracker::EditMeasureTracker(boost::shared_ptr viewport, const PointerEvent& e) + : viewport_(viewport) + , alive_(true) + , commitResult_(true) + { + std::unique_ptr lock(viewport_->Lock()); + + originalClickPosition_ = e.GetMainPosition().Apply( + lock->GetController().GetScene().GetCanvasToSceneTransform()); + } + + void EditMeasureTracker::Cancel() + { + commitResult_ = false; + alive_ = false; + } + + bool EditMeasureTracker::IsAlive() const + { + return alive_; + } + + EditMeasureTracker::~EditMeasureTracker() + { + // if the tracker completes successfully, we add the command + // to the undo stack + // otherwise, we simply undo it + + std::unique_ptr lock(viewport_->Lock()); + + if (commitResult_) + lock->GetController().PushCommand(command_); + else + command_->Undo(); + + lock->Invalidate(); + } +} + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/MeasureTrackers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "IFlexiblePointerTracker.h" +#include "../Scene2D/Scene2D.h" +#include "../Scene2D/PointerEvent.h" + +#include "MeasureTool.h" +#include "MeasureCommands.h" + +#include +#include + +#include + +namespace OrthancStone +{ + class CreateMeasureTracker : public IFlexiblePointerTracker + { + public: + virtual void Cancel() ORTHANC_OVERRIDE; + virtual bool IsAlive() const ORTHANC_OVERRIDE; + protected: + CreateMeasureTracker(boost::shared_ptr viewport); + + ~CreateMeasureTracker(); + + protected: + boost::shared_ptr command_; + boost::shared_ptr viewport_; + bool alive_; + + private: + bool commitResult_; + }; + + class EditMeasureTracker : public IFlexiblePointerTracker + { + public: + virtual void Cancel() ORTHANC_OVERRIDE; + virtual bool IsAlive() const ORTHANC_OVERRIDE; + protected: + EditMeasureTracker(boost::shared_ptr viewport, const PointerEvent& e); + + ~EditMeasureTracker(); + + protected: + boost::shared_ptr command_; + boost::shared_ptr viewport_; + bool alive_; + + ScenePoint2D GetOriginalClickPosition() const + { + return originalClickPosition_; + } + private: + ScenePoint2D originalClickPosition_; + bool commitResult_; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OneGesturePointerTracker.h" + +#include + +#include "../StoneException.h" + +namespace OrthancStone +{ + OneGesturePointerTracker::OneGesturePointerTracker( + boost::shared_ptr viewport) + : viewport_(viewport) + , alive_(true) + , currentTouchCount_(1) + { + } + + void OneGesturePointerTracker::PointerUp(const PointerEvent& event) + { + // pointer up is only called for the LAST up event in case of a multi-touch + // gesture + ORTHANC_ASSERT(currentTouchCount_ > 0, "Wrong state in tracker"); + currentTouchCount_--; + //LOG(TRACE) << "currentTouchCount_ becomes: " << currentTouchCount_; + if (currentTouchCount_ == 0) + { + //LOG(TRACE) << "currentTouchCount_ == 0 --> alive_ = false"; + alive_ = false; + } + } + + void OneGesturePointerTracker::PointerDown(const PointerEvent& event) + { + // additional touches are not taken into account but we need to count + // the number of active touches + currentTouchCount_++; + //LOG(TRACE) << "currentTouchCount_ becomes: " << currentTouchCount_; + + /** + * 2019-12-06 (SJO): Patch to have consistent behavior when mouse + * leaves the canvas while the tracker is still active, then + * button is released while out-of-canvas. Such an event is not + * caught (at least in WebAssembly), so we delete the tracker on + * the next click inside the canvas. + **/ + alive_ = false; + } + + bool OneGesturePointerTracker::IsAlive() const + { + return alive_; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "IFlexiblePointerTracker.h" + +#include "../Viewport/IViewport.h" + +#include +#include + +namespace OrthancStone +{ + /** + This base is class allows to write simple trackers that deal with single + drag gestures with only one touch. It is *not* suitable for multi-touch and + multi-state trackers where various mouse operations need to be handled. + + In order to write such a tracker: + - subclass this class + - you may store the initial click/touch position in the constructor + - implement PointerMove to react to pointer/touch events + - implement Cancel to restore the state at initial tracker creation time + + */ + class OneGesturePointerTracker : public IFlexiblePointerTracker + { + public: + OneGesturePointerTracker(boost::shared_ptr viewport); + virtual void PointerUp(const PointerEvent& event) ORTHANC_OVERRIDE; + virtual void PointerDown(const PointerEvent& event) ORTHANC_OVERRIDE; + virtual bool IsAlive() const ORTHANC_OVERRIDE; + + protected: + boost::shared_ptr viewport_; + + private: + bool alive_; + int currentTouchCount_; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/PredeclaredTypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/PredeclaredTypes.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,42 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include + +namespace OrthancStone + +{ + class Scene2D; + class MeasureTool; + class LineMeasureTool; + class AngleMeasureTool; + class IPointerTracker; + class IFlexiblePointerTracker; + class CreateMeasureCommand; + class CreateLineMeasureCommand; + class CreateAngleMeasureCommand; + class MeasureCommand; + class ViewportController; + class LayerHolder; + class IViewport; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/UndoStack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/UndoStack.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,68 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "UndoStack.h" + +#include "MeasureCommands.h" + +#include "../StoneException.h" + +namespace OrthancStone +{ + UndoStack::UndoStack() : numAppliedCommands_(0) + {} + + void UndoStack::PushCommand(boost::shared_ptr command) + { + commandStack_.erase( + commandStack_.begin() + numAppliedCommands_, + commandStack_.end()); + + ORTHANC_ASSERT(std::find(commandStack_.begin(), commandStack_.end(), command) + == commandStack_.end(), "Duplicate command"); + commandStack_.push_back(command); + numAppliedCommands_++; + } + + void UndoStack::Undo() + { + ORTHANC_ASSERT(CanUndo(), ""); + commandStack_[numAppliedCommands_ - 1]->Undo(); + numAppliedCommands_--; + } + + void UndoStack::Redo() + { + ORTHANC_ASSERT(CanRedo(), ""); + commandStack_[numAppliedCommands_]->Redo(); + numAppliedCommands_++; + } + + bool UndoStack::CanUndo() const + { + return numAppliedCommands_ > 0; + } + + bool UndoStack::CanRedo() const + { + return numAppliedCommands_ < commandStack_.size(); + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/UndoStack.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/UndoStack.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,77 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include + +#include + +namespace OrthancStone +{ + class MeasureCommand; + + class UndoStack + { + public: + UndoStack(); + + /** + Stores a command : + - this first trims the undo stack to keep the first numAppliedCommands_ + - then it adds the supplied command at the top of the undo stack + + In other words, when a new command is pushed, all the undone (and not + redone) commands are removed. + */ + void PushCommand(boost::shared_ptr command); + + /** + Undoes the command at the top of the undo stack, or throws if there is no + command to undo. + You can check "CanUndo" first to protect against extraneous redo. + */ + void Undo(); + + /** + Redoes the command that is just above the last applied command in the undo + stack or throws if there is no command to redo. + You can check "CanRedo" first to protect against extraneous redo. + */ + void Redo(); + + /** selfexpl */ + bool CanUndo() const; + + /** selfexpl */ + bool CanRedo() const; + + private: + std::vector > commandStack_; + + /** + This is always between >= 0 and <= undoStack_.size() and gives the + position where the controller is in the undo stack. + - If numAppliedCommands_ > 0, one can undo + - If numAppliedCommands_ < numAppliedCommands_.size(), one can redo + */ + size_t numAppliedCommands_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/ViewportController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,307 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "ViewportController.h" + +#include "UndoStack.h" +#include "MeasureCommands.h" + +#include "../StoneException.h" +#include "../Scene2D/PanSceneTracker.h" +#include "../Scene2D/RotateSceneTracker.h" +#include "../Scene2D/ZoomSceneTracker.h" + +#include + +namespace OrthancStone +{ + IFlexiblePointerTracker* DefaultViewportInteractor::CreateTracker( + boost::shared_ptr viewport, + const PointerEvent& event, + unsigned int viewportWidth, + unsigned int viewportHeight) + { + switch (event.GetMouseButton()) + { + case MouseButton_Left: + return new RotateSceneTracker(viewport, event); + + case MouseButton_Middle: + return new PanSceneTracker(viewport, event); + + case MouseButton_Right: + { + if (viewportWidth != 0) + { + return new ZoomSceneTracker(viewport, event, viewportWidth); + } + else + { + return NULL; + } + } + + default: + return NULL; + } + } + + ViewportController::ViewportController(boost::shared_ptr viewport) + : viewport_(viewport) + , scene_(new Scene2D) + , canvasToSceneFactor_(1) + { + // undoStack_ is not default-initialized, which basically means empty. + // The controller must be able to cope with this. + } + + ViewportController::~ViewportController() + { + } + + void ViewportController::PushCommand( + boost::shared_ptr command) + { + boost::shared_ptr undoStack = undoStackW_.lock(); + if (undoStack.get() != NULL) + { + undoStack->PushCommand(command); + } + else + { + LOG(ERROR) << "Internal error: no undo stack!"; + } + } + + void ViewportController::Undo() + { + boost::shared_ptr undoStack = undoStackW_.lock(); + if (undoStack.get() != NULL) + { + undoStack->Undo(); + } + else + { + LOG(ERROR) << "Internal error: no undo stack!"; + } + } + + void ViewportController::Redo() + { + boost::shared_ptr undoStack = undoStackW_.lock(); + if (undoStack.get() != NULL) + { + undoStack->Redo(); + } + else + { + LOG(ERROR) << "Internal error: no undo stack!"; + } + } + + bool ViewportController::CanUndo() const + { + boost::shared_ptr undoStack = undoStackW_.lock(); + if (undoStack.get() != NULL) + { + return undoStack->CanUndo(); + } + else + { + LOG(ERROR) << "Internal error: no undo stack!"; + return false; + } + } + + bool ViewportController::CanRedo() const + { + boost::shared_ptr undoStack = undoStackW_.lock(); + if (undoStack.get() != NULL) + { + return undoStack->CanRedo(); + } + else + { + LOG(ERROR) << "Internal error: no undo stack!"; + return false; + } + } + + std::vector > + ViewportController::HitTestMeasureTools(ScenePoint2D p) + { + std::vector > ret; + + for (size_t i = 0; i < measureTools_.size(); ++i) + { + if (measureTools_[i]->HitTest(p)) + ret.push_back(measureTools_[i]); + } + return ret; + } + + void ViewportController::ResetMeasuringToolsHighlight() + { + for (size_t i = 0; i < measureTools_.size(); ++i) + { + measureTools_[i]->ResetHighlightState(); + } + } + + OrthancStone::AffineTransform2D + ViewportController::GetCanvasToSceneTransform() const + { + return scene_->GetCanvasToSceneTransform(); + } + + OrthancStone::AffineTransform2D + ViewportController::GetSceneToCanvasTransform() const + { + return scene_->GetSceneToCanvasTransform(); + } + + void ViewportController::SetSceneToCanvasTransform( + const AffineTransform2D& transform) + { + scene_->SetSceneToCanvasTransform(transform); + + canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); + BroadcastMessage(SceneTransformChanged(*this)); + } + + void ViewportController::FitContent(unsigned int viewportWidth, + unsigned int viewportHeight) + { + scene_->FitContent(viewportWidth, viewportHeight); + canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); + BroadcastMessage(SceneTransformChanged(*this)); + } + + void ViewportController::AddMeasureTool( + boost::shared_ptr measureTool) + { + ORTHANC_ASSERT(std::find(measureTools_.begin(), + measureTools_.end(), + measureTool) == measureTools_.end(), + "Duplicate measure tool"); + measureTools_.push_back(measureTool); + } + + void ViewportController::RemoveMeasureTool( + boost::shared_ptr measureTool) + { + ORTHANC_ASSERT(std::find(measureTools_.begin(), + measureTools_.end(), + measureTool) != measureTools_.end(), + "Measure tool not found"); + measureTools_.erase( + std::remove(measureTools_.begin(), measureTools_.end(), measureTool), + measureTools_.end()); + } + + double ViewportController::GetCanvasToSceneFactor() const + { + return canvasToSceneFactor_; + } + + double ViewportController::GetHandleSideLengthS() const + { + return HANDLE_SIDE_LENGTH_CANVAS_COORD * GetCanvasToSceneFactor(); + } + + double ViewportController::GetAngleToolArcRadiusS() const + { + return ARC_RADIUS_CANVAS_COORD * GetCanvasToSceneFactor(); + } + + double ViewportController::GetHitTestMaximumDistanceS() const + { + return HIT_TEST_MAX_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); + } + + double ViewportController::GetAngleTopTextLabelDistanceS() const + { + return TEXT_CENTER_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); + } + + + void ViewportController::HandleMousePress( + OrthancStone::IViewportInteractor& interactor, + const PointerEvent& event, + unsigned int viewportWidth, + unsigned int viewportHeight) + { + if (activeTracker_) + { + // We are dealing with a multi-stage tracker (that is made of several + // interactions) + activeTracker_->PointerDown(event); + + if (!activeTracker_->IsAlive()) + { + activeTracker_.reset(); + } + } + else + { + // Check whether there is already a measure tool at that position + for (size_t i = 0; i < measureTools_.size(); ++i) + { + if (measureTools_[i]->HitTest(event.GetMainPosition())) + { + activeTracker_ = measureTools_[i]->CreateEditionTracker(event); + return; + } + } + + // No measure tool, create new tracker from the interactor + activeTracker_.reset(interactor.CreateTracker(viewport_, + event, + viewportWidth, + viewportHeight)); + } + } + + bool ViewportController::HandleMouseMove(const PointerEvent& event) + { + if (activeTracker_) + { + activeTracker_->PointerMove(event); + return true; + } + else + { + return false; + } + } + + void ViewportController::HandleMouseRelease(const PointerEvent& event) + { + if (activeTracker_) + { + activeTracker_->PointerUp(event); + + if (!activeTracker_->IsAlive()) + { + activeTracker_.reset(); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Scene2DViewport/ViewportController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,270 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "PredeclaredTypes.h" + +#include "../Messages/IObservable.h" +#include "../Scene2D/Scene2D.h" +#include "../Scene2DViewport/IFlexiblePointerTracker.h" + +#include + +#include +#include + +namespace OrthancStone +{ + // TODO - Move this to another file + class IViewportInteractor : public boost::noncopyable + { + public: + virtual ~IViewportInteractor() + { + } + + virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr viewport, + const PointerEvent& event, + unsigned int viewportWidth, + unsigned int viewportHeight) = 0; + }; + + + // TODO - Move this to another file + class DefaultViewportInteractor : public IViewportInteractor + { + public: + virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr viewport, + const PointerEvent& event, + unsigned int viewportWidth, + unsigned int viewportHeight) ORTHANC_OVERRIDE; + }; + + + class UndoStack; + + const double ARC_RADIUS_CANVAS_COORD = 30.0; + const double TEXT_CENTER_DISTANCE_CANVAS_COORD = 90; + + const double HANDLE_SIDE_LENGTH_CANVAS_COORD = 10.0; + const double HIT_TEST_MAX_DISTANCE_CANVAS_COORD = 15.0; + + const uint8_t TEXT_COLOR_RED = 0; + const uint8_t TEXT_COLOR_GREEN = 223; + const uint8_t TEXT_COLOR_BLUE = 81; + + const uint8_t TOOL_ANGLE_LINES_COLOR_RED = 0; + const uint8_t TOOL_ANGLE_LINES_COLOR_GREEN = 183; + const uint8_t TOOL_ANGLE_LINES_COLOR_BLUE = 17; + + const uint8_t TOOL_ANGLE_LINES_HL_COLOR_RED = 0; + const uint8_t TOOL_ANGLE_LINES_HL_COLOR_GREEN = 17; + const uint8_t TOOL_ANGLE_LINES_HL_COLOR_BLUE = 183; + + const uint8_t TOOL_LINES_COLOR_RED = 0; + const uint8_t TOOL_LINES_COLOR_GREEN = 223; + const uint8_t TOOL_LINES_COLOR_BLUE = 21; + + const uint8_t TOOL_LINES_HL_COLOR_RED = 0; + const uint8_t TOOL_LINES_HL_COLOR_GREEN = 21; + const uint8_t TOOL_LINES_HL_COLOR_BLUE = 223; + + const uint8_t TEXT_OUTLINE_COLOR_RED = 0; + const uint8_t TEXT_OUTLINE_COLOR_GREEN = 56; + const uint8_t TEXT_OUTLINE_COLOR_BLUE = 21; + + /** + This object is responsible for hosting a scene, responding to messages from + the model and updating the scene accordingly. + + It contains the list of active measuring tools as well as the stack + where measuring tool commands are stored. + + The active tracker is also stored in the viewport controller. + + Each canvas or other GUI area where we want to display a 2D image, either + directly or through slicing must be assigned a ViewportController. + */ + class ViewportController : + public IObservable, + public boost::enable_shared_from_this + { + public: + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, \ + SceneTransformChanged, \ + ViewportController); + + ViewportController(boost::shared_ptr viewport); + + ~ViewportController(); + + /** + This method returns the list of measure tools containing the supplied point + (in scene coords). A tracker can then be requested from the chosen + measure tool, if needed + */ + std::vector > HitTestMeasureTools( + ScenePoint2D p); + + /** + This function will traverse the measuring tools and will clear their + highlighted state + */ + void ResetMeasuringToolsHighlight(); + + /** + With this method, the object takes ownership of the supplied tracker and + updates it according to user interaction + */ + void AcquireActiveTracker(IFlexiblePointerTracker* tracker); + + /** Forwarded to the underlying scene */ + AffineTransform2D GetCanvasToSceneTransform() const; + + /** Forwarded to the underlying scene */ + AffineTransform2D GetSceneToCanvasTransform() const; + + /** Forwarded to the underlying scene, and broadcasted to the observers */ + void SetSceneToCanvasTransform(const AffineTransform2D& transform); + + /** Forwarded to the underlying scene, and broadcasted to the observers */ + void FitContent(unsigned int viewportWidth, + unsigned int viewportHeight); + + /** Adds a new measure tool */ + void AddMeasureTool(boost::shared_ptr measureTool); + + /** Removes a measure tool or throws if it cannot be found */ + void RemoveMeasureTool(boost::shared_ptr measureTool); + + /** + The square handle side length in *scene* coordinates + */ + double GetHandleSideLengthS() const; + + /** + The angle measure too arc radius in *scene* coordinates + + Note: you might wonder why this is not part of the AngleMeasureTool itself, + but we prefer to put all such constants in the same location, to ease + */ + double GetAngleToolArcRadiusS() const; + + /** + The hit test maximum distance in *scene* coordinates. + If a pointer event is less than GetHandleSideLengthS() to a GUI element, + the hit test for this GUI element is seen as true + */ + double GetHitTestMaximumDistanceS() const; + + /** + Distance between the top of the angle measuring tool and the center of + the label showing the actual measure, in *scene* coordinates + */ + double GetAngleTopTextLabelDistanceS() const; + + + /** forwarded to the UndoStack */ + void PushCommand(boost::shared_ptr command); + + /** forwarded to the UndoStack */ + void Undo(); + + /** forwarded to the UndoStack */ + void Redo(); + + /** forwarded to the UndoStack */ + bool CanUndo() const; + + /** forwarded to the UndoStack */ + bool CanRedo() const; + + + // Must be expressed in canvas coordinates + void HandleMousePress(IViewportInteractor& interactor, + const PointerEvent& event, + unsigned int viewportWidth, + unsigned int viewportHeight); + + // Must be expressed in canvas coordinates. Returns "true" if the + // state has changed, so that "Invalidate()" can be called. + bool HandleMouseMove(const PointerEvent& event); + + // Must be expressed in canvas coordinates + void HandleMouseRelease(const PointerEvent& event); + + const Scene2D& GetScene() const + { + return *scene_; + } + + Scene2D& GetScene() + { + return *scene_; + } + + /** + This method is used in a move pattern: when the ownership of the scene + managed by this viewport controller must be transferred to another + controller. + */ + Scene2D* ReleaseScene() + { + return scene_.release(); + } + + /** + This method is used when one wishes to replace the scene that is currently + managed by the controller. The previous scene is deleted and the controller + now has ownership of the new one. + */ + void AcquireScene(Scene2D* scene) + { + scene_.reset(scene); + } + + /** + Sets the undo stack that is used by PushCommand, Undo... + */ + void SetUndoStack(boost::weak_ptr undoStackW) + { + undoStackW_ = undoStackW; + } + + bool HasActiveTracker() const + { + return activeTracker_.get() != NULL; + } + + private: + double GetCanvasToSceneFactor() const; + + boost::shared_ptr viewport_; + boost::weak_ptr undoStackW_; // Global stack, possibly shared by all viewports + std::vector > measureTools_; + boost::shared_ptr activeTracker_; // TODO - Couldn't this be a "std::unique_ptr"? + + std::unique_ptr scene_; + + // this is cached + double canvasToSceneFactor_; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/StoneEnumerations.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/StoneEnumerations.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,177 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "StoneEnumerations.h" + +#include +#include +#include + +namespace OrthancStone +{ + SopClassUid StringToSopClassUid(const std::string& source) + { + std::string s = Orthanc::Toolbox::StripSpaces(source); + + if (s == "1.2.840.10008.5.1.4.1.1.481.2") + { + return SopClassUid_RTDose; + } + else + { + //LOG(INFO) << "Other SOP class UID: " << source; + return SopClassUid_Other; + } + } + + + void ComputeWindowing(float& targetCenter, + float& targetWidth, + ImageWindowing windowing, + float customCenter, + float customWidth) + { + switch (windowing) + { + case ImageWindowing_Custom: + targetCenter = customCenter; + targetWidth = customWidth; + break; + + case ImageWindowing_Bone: + targetCenter = 300; + targetWidth = 2000; + break; + + case ImageWindowing_Lung: + targetCenter = -600; + targetWidth = 1600; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void ComputeAnchorTranslation(double& deltaX, + double& deltaY, + BitmapAnchor anchor, + unsigned int bitmapWidth, + unsigned int bitmapHeight, + unsigned int border) + { + double dw = static_cast(bitmapWidth); + double dh = static_cast(bitmapHeight); + + switch (anchor) + { + case BitmapAnchor_TopLeft: + deltaX = 0; + deltaY = 0; + break; + + case BitmapAnchor_TopCenter: + deltaX = -dw / 2.0; + deltaY = 0; + break; + + case BitmapAnchor_TopRight: + deltaX = -dw; + deltaY = 0; + break; + + case BitmapAnchor_CenterLeft: + deltaX = 0; + deltaY = -dh / 2.0; + break; + + case BitmapAnchor_Center: + deltaX = -dw / 2.0; + deltaY = -dh / 2.0; + break; + + case BitmapAnchor_CenterRight: + deltaX = -dw; + deltaY = -dh / 2.0; + break; + + case BitmapAnchor_BottomLeft: + deltaX = 0; + deltaY = -dh; + break; + + case BitmapAnchor_BottomCenter: + deltaX = -dw / 2.0; + deltaY = -dh; + break; + + case BitmapAnchor_BottomRight: + deltaX = -dw; + deltaY = -dh; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (border != 0) + { + double b = static_cast(border); + + switch (anchor) + { + case BitmapAnchor_TopLeft: + case BitmapAnchor_TopCenter: + case BitmapAnchor_TopRight: + deltaY += b; + break; + + case BitmapAnchor_BottomLeft: + case BitmapAnchor_BottomCenter: + case BitmapAnchor_BottomRight: + deltaY -= b; + break; + + default: + break; + } + + switch (anchor) + { + case BitmapAnchor_TopLeft: + case BitmapAnchor_CenterLeft: + case BitmapAnchor_BottomLeft: + deltaX += b; + break; + + case BitmapAnchor_CenterRight: + case BitmapAnchor_TopRight: + case BitmapAnchor_BottomRight: + deltaX -= b; + break; + + default: + break; + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/StoneEnumerations.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/StoneEnumerations.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,149 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OrthancFramework.h" + +#include + + +namespace OrthancStone +{ + enum SliceOffsetMode + { + SliceOffsetMode_Absolute, + SliceOffsetMode_Relative, + SliceOffsetMode_Loop + }; + + enum ImageWindowing + { + ImageWindowing_Bone, + ImageWindowing_Lung, + ImageWindowing_Custom + }; + + enum MouseButton + { + MouseButton_Left, + MouseButton_Right, + MouseButton_Middle, + MouseButton_None // For instance, because of touch event + }; + + enum MouseWheelDirection + { + MouseWheelDirection_Up, + MouseWheelDirection_Down + }; + + enum VolumeProjection + { + VolumeProjection_Axial, + VolumeProjection_Coronal, + VolumeProjection_Sagittal + }; + + enum ImageInterpolation + { + ImageInterpolation_Nearest, + ImageInterpolation_Bilinear, + ImageInterpolation_Trilinear + }; + + enum KeyboardModifiers + { + KeyboardModifiers_None = 0, + KeyboardModifiers_Shift = (1 << 0), + KeyboardModifiers_Control = (1 << 1), + KeyboardModifiers_Alt = (1 << 2) + }; + + enum KeyboardKeys + { + KeyboardKeys_Generic = 0, + + // let's use the same ids as in javascript to avoid some conversion in WASM: https://css-tricks.com/snippets/javascript/javascript-keycodes/ + KeyboardKeys_Backspace = 8, + KeyboardKeys_Left = 37, + KeyboardKeys_Up = 38, + KeyboardKeys_Right = 39, + KeyboardKeys_Down = 40, + KeyboardKeys_Delete = 46, + + KeyboardKeys_F1 = 112, + KeyboardKeys_F2 = 113, + KeyboardKeys_F3 = 114, + KeyboardKeys_F4 = 115, + KeyboardKeys_F5 = 116, + KeyboardKeys_F6 = 117, + KeyboardKeys_F7 = 118, + KeyboardKeys_F8 = 119, + KeyboardKeys_F9 = 120, + KeyboardKeys_F10 = 121, + KeyboardKeys_F11 = 122, + KeyboardKeys_F12 = 123, + }; + + enum SopClassUid + { + SopClassUid_Other, + SopClassUid_RTDose + }; + + enum BitmapAnchor + { + BitmapAnchor_BottomLeft, + BitmapAnchor_BottomCenter, + BitmapAnchor_BottomRight, + BitmapAnchor_CenterLeft, + BitmapAnchor_Center, + BitmapAnchor_CenterRight, + BitmapAnchor_TopLeft, + BitmapAnchor_TopCenter, + BitmapAnchor_TopRight + }; + + enum SliceAction + { + SliceAction_FastPlus, + SliceAction_Plus, + SliceAction_None, + SliceAction_Minus, + SliceAction_FastMinus + }; + + SopClassUid StringToSopClassUid(const std::string& source); + + void ComputeWindowing(float& targetCenter, + float& targetWidth, + ImageWindowing windowing, + float customCenter, + float customWidth); + + void ComputeAnchorTranslation(double& deltaX /* out */, + double& deltaY /* out */, + BitmapAnchor anchor, + unsigned int bitmapWidth, + unsigned int bitmapHeight, + unsigned int border = 0); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/StoneException.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/StoneException.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,148 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "Toolbox/LinearAlgebra.h" + +#include + +#include + +#include + +namespace OrthancStone +{ + enum ErrorCode + { + ErrorCode_Success, + ErrorCode_OrthancError, // this StoneException is actually an OrthancException with an Orthanc error code + ErrorCode_ApplicationException, // this StoneException is specific to an application (and should have its own internal error code) + ErrorCode_NotImplemented, // case not implemented + + ErrorCode_CanOnlyAddOneLayerAtATime, + ErrorCode_CommandJsonInvalidFormat, + ErrorCode_WebGLContextLost, + ErrorCode_Last + }; + + + + class StoneException + { + protected: + OrthancStone::ErrorCode errorCode_; + + public: + explicit StoneException(ErrorCode errorCode) : + errorCode_(errorCode) + { + } + + virtual ~StoneException() {} + + ErrorCode GetErrorCode() const + { + return errorCode_; + } + + virtual const char* What() const + { + switch (errorCode_) + { + case ErrorCode_Success: + return "Success"; + break; + case ErrorCode_OrthancError: + return "OrthancError"; + break; + case ErrorCode_ApplicationException: + return "ApplicationException"; + break; + case ErrorCode_NotImplemented: + return "NotImplemented"; + break; + case ErrorCode_CanOnlyAddOneLayerAtATime: + return "CanOnlyAddOneLayerAtATime"; + break; + case ErrorCode_CommandJsonInvalidFormat: + return "CommandJsonInvalidFormat"; + break; + case ErrorCode_WebGLContextLost: + return "WebGLContextLost"; + break; + case ErrorCode_Last: + return "Last"; + break; + default: + return "Unknown exception code!"; + } + } + }; +} + +// See https://isocpp.org/wiki/faq/misc-technical-issues#macros-with-multi-stmts +// (or google "Multiple lines macro C++ faq lite" if link is dead) +#define ORTHANC_ASSERT2(cond,streamChainMessage) \ + if (!(cond)) { \ + std::stringstream sst; \ + sst << "Assertion failed. Condition = \"" #cond "\" Message = \"" << streamChainMessage << "\""; \ + std::string sstr = sst.str(); \ + throw ::Orthanc::OrthancException(::Orthanc::ErrorCode_InternalError,sstr.c_str()); \ + } else (void)0 + +#define ORTHANC_ASSERT1(cond) \ + if (!(cond)) { \ + std::stringstream sst; \ + sst << "Assertion failed. Condition = \"" #cond "\""; \ + std::string sstr = sst.str(); \ + throw ::Orthanc::OrthancException(::Orthanc::ErrorCode_InternalError,sstr.c_str()); \ + } else (void)0 + +# define ORTHANC_EXPAND( x ) x +# define GET_ORTHANC_ASSERT(_1,_2,NAME,...) NAME +# define ORTHANC_ASSERT(...) ORTHANC_EXPAND(GET_ORTHANC_ASSERT(__VA_ARGS__, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(__VA_ARGS__)) + + + + + +/* +Explanation: + +ORTHANC_ASSERT(a) +ORTHANC_EXPAND(GET_ORTHANC_ASSERT(a, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(a)) +ORTHANC_EXPAND(ORTHANC_ASSERT1(a)) +ORTHANC_ASSERT1(a) + +ORTHANC_ASSERT(a,b) +ORTHANC_EXPAND(GET_ORTHANC_ASSERT(a, b, ORTHANC_ASSERT2, ORTHANC_ASSERT1, UNUSED)(a,b)) +ORTHANC_EXPAND(ORTHANC_ASSERT2(a,b)) +ORTHANC_ASSERT2(a,b) + +Note: ORTHANC_EXPAND is required for some older compilers (MS v100 cl.exe ) +*/ + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/StoneInitialization.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/StoneInitialization.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,212 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "StoneInitialization.h" + +#if !defined(ORTHANC_ENABLE_SDL) +# error Macro ORTHANC_ENABLE_SDL must be defined +#endif + +#if !defined(ORTHANC_ENABLE_SSL) +# error Macro ORTHANC_ENABLE_SSL must be defined +#endif + +#if !defined(ORTHANC_ENABLE_CURL) +# error Macro ORTHANC_ENABLE_CURL must be defined +#endif + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error Macro ORTHANC_ENABLE_DCMTK must be defined +# if !defined(DCMTK_VERSION_NUMBER) +# error Macro DCMTK_VERSION_NUMBER must be defined +# endif +#endif + +#if ORTHANC_ENABLE_SDL == 1 +# include "Viewport/SdlWindow.h" +#endif + +#if ORTHANC_ENABLE_CURL == 1 +# include +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 +# include +#endif + +#if ORTHANC_ENABLE_WASM == 1 +static double viewportsTimeout_ = 1000; +static std::unique_ptr viewportsRegistry_; +#endif + +#include "Toolbox/LinearAlgebra.h" + +#include +#include +#include + +#include + + +namespace OrthancStone +{ + void StoneInitialize(void* pluginContext) + { + if (pluginContext != NULL) + { + Orthanc::Logging::InitializePluginContext(pluginContext); + } + else + { + Orthanc::Logging::Initialize(); + } + +#if ORTHANC_ENABLE_SSL == 1 + // Must be before curl + Orthanc::Toolbox::InitializeOpenSsl(); +#endif + +#if ORTHANC_ENABLE_CURL == 1 + Orthanc::HttpClient::GlobalInitialize(); +# if ORTHANC_ENABLE_SSL == 1 + Orthanc::HttpClient::ConfigureSsl(false, ""); +# endif +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 + Orthanc::FromDcmtkBridge::InitializeDictionary(true); + Orthanc::FromDcmtkBridge::InitializeCodecs(); +# if DCMTK_VERSION_NUMBER <= 360 + OFLog::configure(OFLogger::FATAL_LOG_LEVEL); +# else + OFLog::configure(OFLogger::OFF_LOG_LEVEL); +# endif +#endif + + /** + * This call is necessary to make "boost::lexical_cast<>" work in + * a consistent way in the presence of "double" or "float", and of + * a numeric locale that replaces dot (".") by comma (",") as the + * decimal separator. + * https://stackoverflow.com/a/18981514/881731 + **/ + std::locale::global(std::locale::classic()); + + { + // Run-time checks of locale settings, to be run after Qt has + // been initialized, as Qt changes locale settings + + { + OrthancStone::Vector v; + if (!OrthancStone::LinearAlgebra::ParseVector(v, "1.3671875\\-1.3671875") || + v.size() != 2 || + !OrthancStone::LinearAlgebra::IsNear(1.3671875f, v[0]) || + !OrthancStone::LinearAlgebra::IsNear(-1.3671875f, v[1])) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Error in the locale settings, giving up"); + } + } + + { + Json::Value dicomweb = Json::objectValue; + dicomweb["00280030"] = Json::objectValue; + dicomweb["00280030"]["vr"] = "DS"; + dicomweb["00280030"]["Value"] = Json::arrayValue; + dicomweb["00280030"]["Value"].append(1.2f); + dicomweb["00280030"]["Value"].append(-1.5f); + + Orthanc::DicomMap source; + source.FromDicomWeb(dicomweb); + + std::string s; + OrthancStone::Vector v; + if (!source.LookupStringValue(s, Orthanc::DICOM_TAG_PIXEL_SPACING, false) || + !OrthancStone::LinearAlgebra::ParseVector(v, s) || + v.size() != 2 || + !OrthancStone::LinearAlgebra::IsNear(1.2f, v[0]) || + !OrthancStone::LinearAlgebra::IsNear(-1.5f, v[1])) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Error in the locale settings, giving up"); + } + } + } + +#if ORTHANC_ENABLE_SDL == 1 + OrthancStone::SdlWindow::GlobalInitialize(); +#endif + } + + + void StoneFinalize() + { +#if ORTHANC_ENABLE_WASM == 1 + viewportsRegistry_.reset(); +#endif + +#if ORTHANC_ENABLE_SDL == 1 + OrthancStone::SdlWindow::GlobalFinalize(); +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 + Orthanc::FromDcmtkBridge::FinalizeCodecs(); +#endif + +#if ORTHANC_ENABLE_CURL == 1 + Orthanc::HttpClient::GlobalFinalize(); +#endif + +#if ORTHANC_ENABLE_SSL == 1 + Orthanc::Toolbox::FinalizeOpenSsl(); +#endif + + Orthanc::Logging::Finalize(); + } + + +#if ORTHANC_ENABLE_WASM == 1 + void SetWebGLViewportsRegistryTimeout(double timeout) + { + if (viewportsRegistry_.get()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + viewportsTimeout_ = timeout; + } + } +#endif + + +#if ORTHANC_ENABLE_WASM == 1 + WebGLViewportsRegistry& GetWebGLViewportsRegistry() + { + if (viewportsRegistry_.get() == NULL) + { + viewportsRegistry_.reset(new WebGLViewportsRegistry(viewportsTimeout_)); + } + + return *viewportsRegistry_; + } +#endif +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/StoneInitialization.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/StoneInitialization.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if !defined(ORTHANC_ENABLE_WASM) +# error Macro ORTHANC_ENABLE_WASM must be defined +#endif + +#if ORTHANC_ENABLE_WASM == 1 +# include "Viewport/WebGLViewportsRegistry.h" +#endif + +#include + +namespace OrthancStone +{ + void StoneInitialize(void* pluginContext); + + inline void StoneInitialize() + { + StoneInitialize(NULL); + } + + void StoneFinalize(); + +#if ORTHANC_ENABLE_WASM == 1 + void SetWebGLViewportsRegistryTimeout(double timeout); +#endif + +#if ORTHANC_ENABLE_WASM == 1 + WebGLViewportsRegistry& GetWebGLViewportsRegistry(); +#endif +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/AffineTransform2D.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/AffineTransform2D.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,271 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "AffineTransform2D.h" + +#include "ImageGeometry.h" + +#include +#include + +namespace OrthancStone +{ + AffineTransform2D::AffineTransform2D() : + matrix_(LinearAlgebra::IdentityMatrix(3)) + { + } + + + AffineTransform2D::AffineTransform2D(const Matrix& m) + { + if (m.size1() != 3 || + m.size2() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); + } + + if (!LinearAlgebra::IsCloseToZero(m(2, 0)) || + !LinearAlgebra::IsCloseToZero(m(2, 1)) || + LinearAlgebra::IsCloseToZero(m(2, 2))) + { + LOG(ERROR) << "Cannot setup an AffineTransform2D with perspective effects"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + matrix_ = m / m(2, 2); + } + + + void AffineTransform2D::Apply(double& x /* inout */, + double& y /* inout */) const + { + Vector p; + LinearAlgebra::AssignVector(p, x, y, 1); + + Vector q = LinearAlgebra::Product(matrix_, p); + + if (!LinearAlgebra::IsNear(q[2], 1.0)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + x = q[0]; + y = q[1]; + } + } + + + void AffineTransform2D::Apply(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + ImageInterpolation interpolation, + bool clear) const + { + assert(LinearAlgebra::IsNear(matrix_(2, 0), 0) && + LinearAlgebra::IsNear(matrix_(2, 1), 0) && + LinearAlgebra::IsNear(matrix_(2, 2), 1)); + + ApplyAffineTransform(target, source, + matrix_(0, 0), matrix_(0, 1), matrix_(0, 2), + matrix_(1, 0), matrix_(1, 1), matrix_(1, 2), + interpolation, clear); + } + + + void AffineTransform2D::ConvertToOpenGLMatrix(float target[16], + unsigned int canvasWidth, + unsigned int canvasHeight) const + { + const AffineTransform2D t = AffineTransform2D::Combine( + CreateOpenGLClipspace(canvasWidth, canvasHeight), *this); + + const Matrix source = t.GetHomogeneousMatrix(); + + if (source.size1() != 3 || + source.size2() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // "z" must be in the [-1,1] range, otherwise the texture does not show up + float z = 0; + + // Embed the 3x3 affine transform of the 2D plane into a 4x4 + // matrix (3D) for OpenGL. The matrix must be transposed. + + target[0] = static_cast(source(0, 0)); + target[1] = static_cast(source(1, 0)); + target[2] = 0; + target[3] = static_cast(source(2, 0)); + target[4] = static_cast(source(0, 1)); + target[5] = static_cast(source(1, 1)); + target[6] = 0; + target[7] = static_cast(source(2, 1)); + target[8] = 0; + target[9] = 0; + target[10] = -1; + target[11] = 0; + target[12] = static_cast(source(0, 2)); + target[13] = static_cast(source(1, 2)); + target[14] = -z; + target[15] = static_cast(source(2, 2)); + } + + + double AffineTransform2D::ComputeZoom() const + { + // Compute the length of the (0,0)-(1,1) diagonal (whose + // length is sqrt(2)) instead of the (0,0)-(1,0) unit segment, + // in order to cope with possible anisotropic zooming + + double x1 = 0; + double y1 = 0; + Apply(x1, y1); + + double x2 = 1; + double y2 = 1; + Apply(x2, y2); + + double dx = x2 - x1; + double dy = y2 - y1; + + double zoom = sqrt(dx * dx + dy * dy) / sqrt(2.0); + + if (LinearAlgebra::IsCloseToZero(zoom)) + { + return 1; // Default value if transform is ill-conditioned + } + else + { + return zoom; + } + } + + + AffineTransform2D AffineTransform2D::Invert(const AffineTransform2D& a) + { + AffineTransform2D t; + LinearAlgebra::InvertMatrix(t.matrix_, a.matrix_); + return t; + } + + + AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, + const AffineTransform2D& b) + { + return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), + b.GetHomogeneousMatrix())); + } + + + AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c) + { + return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), + b.GetHomogeneousMatrix(), + c.GetHomogeneousMatrix())); + } + + + AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c, + const AffineTransform2D& d) + { + return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), + b.GetHomogeneousMatrix(), + c.GetHomogeneousMatrix(), + d.GetHomogeneousMatrix())); + } + + AffineTransform2D AffineTransform2D::Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c, + const AffineTransform2D& d, + const AffineTransform2D& e) + { + return AffineTransform2D(LinearAlgebra::Product(a.GetHomogeneousMatrix(), + b.GetHomogeneousMatrix(), + c.GetHomogeneousMatrix(), + d.GetHomogeneousMatrix(), + e.GetHomogeneousMatrix())); + } + + AffineTransform2D AffineTransform2D::CreateOffset(double dx, + double dy) + { + AffineTransform2D t; + t.matrix_(0, 2) = dx; + t.matrix_(1, 2) = dy; + + return t; + } + + + AffineTransform2D AffineTransform2D::CreateScaling(double sx, + double sy) + { + AffineTransform2D t; + t.matrix_(0, 0) = sx; + t.matrix_(1, 1) = sy; + + return t; + } + + + AffineTransform2D AffineTransform2D::CreateRotation(double angle) + { + double cosine = cos(angle); + double sine = sin(angle); + + AffineTransform2D t; + t.matrix_(0, 0) = cosine; + t.matrix_(0, 1) = -sine; + t.matrix_(1, 0) = sine; + t.matrix_(1, 1) = cosine; + + return t; + } + + AffineTransform2D AffineTransform2D::CreateRotation(double angle, // CW rotation + double cx, // rotation center + double cy) // rotation center + { + return Combine( + CreateOffset(cx, cy), + CreateRotation(angle), + CreateOffset(-cx, -cy) + ); + } + + AffineTransform2D AffineTransform2D::CreateOpenGLClipspace(unsigned int canvasWidth, + unsigned int canvasHeight) + { + AffineTransform2D t; + t.matrix_(0, 0) = 2.0 / static_cast(canvasWidth); + t.matrix_(0, 2) = -1.0; + t.matrix_(1, 1) = -2.0 / static_cast(canvasHeight); + t.matrix_(1, 2) = 1.0; + + return t; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/AffineTransform2D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/AffineTransform2D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,103 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "LinearAlgebra.h" + +#include + +namespace OrthancStone +{ + class AffineTransform2D + { + private: + Matrix matrix_; + + public: + AffineTransform2D(); + + // The matrix must be 3x3, without perspective effects + AffineTransform2D(const Matrix& m); + + AffineTransform2D(const AffineTransform2D& other) : + matrix_(other.matrix_) + { + } + + const Matrix& GetHomogeneousMatrix() const + { + return matrix_; + } + + void Apply(double& x /* inout */, + double& y /* inout */) const; + + void Apply(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + ImageInterpolation interpolation, + bool clear) const; + + void ConvertToOpenGLMatrix(float target[16], + unsigned int canvasWidth, + unsigned int canvasHeight) const; + + double ComputeZoom() const; + + static AffineTransform2D Invert(const AffineTransform2D& a); + + static AffineTransform2D Combine(const AffineTransform2D& a, + const AffineTransform2D& b); + + static AffineTransform2D Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c); + + static AffineTransform2D Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c, + const AffineTransform2D& d); + + // transformations are applied right to left: + // `e` is the first transformation applied and `a` is the last one + static AffineTransform2D Combine(const AffineTransform2D& a, + const AffineTransform2D& b, + const AffineTransform2D& c, + const AffineTransform2D& d, + const AffineTransform2D& e); + + static AffineTransform2D CreateOffset(double dx, + double dy); + + static AffineTransform2D CreateScaling(double sx, + double sy); + + static AffineTransform2D CreateRotation(double angle); // CW rotation in radians + + static AffineTransform2D CreateRotation(double angle, // CW rotation in radians + double cx, // rotation center + double cy); // rotation center + + static AffineTransform2D CreateOpenGLClipspace(unsigned int canvasWidth, + unsigned int canvasHeight); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/CoordinateSystem3D.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/CoordinateSystem3D.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,254 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CoordinateSystem3D.h" + +#include "LinearAlgebra.h" +#include "GeometryToolbox.h" + +#include +#include +#include + +namespace OrthancStone +{ + void CoordinateSystem3D::CheckAndComputeNormal() + { + // DICOM expects normal vectors to define the axes: "The row and + // column direction cosine vectors shall be normal, i.e., the dot + // product of each direction cosine vector with itself shall be + // unity." + // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.2.html + if (!LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(axisX_), 1.0) || + !LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(axisY_), 1.0)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + // The vectors within "Image Orientation Patient" must be + // orthogonal, according to the DICOM specification: "The row and + // column direction cosine vectors shall be orthogonal, i.e., + // their dot product shall be zero." + // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.2.html + if (!LinearAlgebra::IsCloseToZero(boost::numeric::ublas::inner_prod(axisX_, axisY_))) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + LinearAlgebra::CrossProduct(normal_, axisX_, axisY_); + + d_ = -(normal_[0] * origin_[0] + normal_[1] * origin_[1] + normal_[2] * origin_[2]); + + // Just a sanity check, it should be useless by construction + assert(LinearAlgebra::IsNear(boost::numeric::ublas::norm_2(normal_), 1.0)); + } + + + void CoordinateSystem3D::SetupCanonical() + { + LinearAlgebra::AssignVector(origin_, 0, 0, 0); + LinearAlgebra::AssignVector(axisX_, 1, 0, 0); + LinearAlgebra::AssignVector(axisY_, 0, 1, 0); + CheckAndComputeNormal(); + } + + + CoordinateSystem3D::CoordinateSystem3D(const Vector& origin, + const Vector& axisX, + const Vector& axisY) : + origin_(origin), + axisX_(axisX), + axisY_(axisY) + { + CheckAndComputeNormal(); + } + + + void CoordinateSystem3D::Setup(const std::string& imagePositionPatient, + const std::string& imageOrientationPatient) + { + std::string tmpPosition = Orthanc::Toolbox::StripSpaces(imagePositionPatient); + std::string tmpOrientation = Orthanc::Toolbox::StripSpaces(imageOrientationPatient); + + Vector orientation; + if (!LinearAlgebra::ParseVector(origin_, tmpPosition) || + !LinearAlgebra::ParseVector(orientation, tmpOrientation) || + origin_.size() != 3 || + orientation.size() != 6) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + axisX_.resize(3); + axisX_[0] = orientation[0]; + axisX_[1] = orientation[1]; + axisX_[2] = orientation[2]; + + axisY_.resize(3); + axisY_[0] = orientation[3]; + axisY_[1] = orientation[4]; + axisY_[2] = orientation[5]; + + CheckAndComputeNormal(); + } + + + CoordinateSystem3D::CoordinateSystem3D(const IDicomDataset& dicom) + { + std::string a, b; + + if (dicom.GetStringValue(a, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT) && + dicom.GetStringValue(b, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT)) + { + Setup(a, b); + } + else + { + SetupCanonical(); + } + } + + + CoordinateSystem3D::CoordinateSystem3D(const Orthanc::DicomMap& dicom) + { + std::string a, b; + + if (dicom.LookupStringValue(a, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && + dicom.LookupStringValue(b, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) + { + Setup(a, b); + } + else + { + SetupCanonical(); + } + } + + + void CoordinateSystem3D::SetOrigin(const Vector& origin) + { + if (origin.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + origin_ = origin; + } + } + + + Vector CoordinateSystem3D::MapSliceToWorldCoordinates(double x, + double y) const + { + return origin_ + x * axisX_ + y * axisY_; + } + + + double CoordinateSystem3D::ProjectAlongNormal(const Vector& point) const + { + return boost::numeric::ublas::inner_prod(point, normal_); + } + + void CoordinateSystem3D::ProjectPoint2(double& offsetX, double& offsetY, const Vector& point) const + { + // Project the point onto the slice + double projectionX,projectionY,projectionZ; + GeometryToolbox::ProjectPointOntoPlane2(projectionX, projectionY, projectionZ, point, normal_, origin_); + + // As the axes are orthonormal vectors thanks to + // CheckAndComputeNormal(), the following dot products give the + // offset of the origin of the slice wrt. the origin of the + // reference plane https://en.wikipedia.org/wiki/Vector_projection + offsetX = axisX_[0] * (projectionX - origin_[0]) + axisX_[1] * (projectionY - origin_[1]) + axisX_[2] * (projectionZ - origin_[2]); + offsetY = axisY_[0] * (projectionX - origin_[0]) + axisY_[1] * (projectionY - origin_[1]) + axisY_[2] * (projectionZ - origin_[2]); + } + + void CoordinateSystem3D::ProjectPoint(double& offsetX, + double& offsetY, + const Vector& point) const + { + // Project the point onto the slice + Vector projection; + GeometryToolbox::ProjectPointOntoPlane(projection, point, normal_, origin_); + + // As the axes are orthonormal vectors thanks to + // CheckAndComputeNormal(), the following dot products give the + // offset of the origin of the slice wrt. the origin of the + // reference plane https://en.wikipedia.org/wiki/Vector_projection + offsetX = boost::numeric::ublas::inner_prod(axisX_, projection - origin_); + offsetY = boost::numeric::ublas::inner_prod(axisY_, projection - origin_); + } + + bool CoordinateSystem3D::IntersectSegment(Vector& p, + const Vector& edgeFrom, + const Vector& edgeTo) const + { + return GeometryToolbox::IntersectPlaneAndSegment(p, normal_, d_, edgeFrom, edgeTo); + } + + + bool CoordinateSystem3D::IntersectLine(Vector& p, + const Vector& origin, + const Vector& direction) const + { + return GeometryToolbox::IntersectPlaneAndLine(p, normal_, d_, origin, direction); + } + + + bool CoordinateSystem3D::ComputeDistance(double& distance, + const CoordinateSystem3D& a, + const CoordinateSystem3D& b) + { + bool opposite = false; // Ignored + + if (OrthancStone::GeometryToolbox::IsParallelOrOpposite( + opposite, a.GetNormal(), b.GetNormal())) + { + distance = std::abs(a.ProjectAlongNormal(a.GetOrigin()) - + a.ProjectAlongNormal(b.GetOrigin())); + return true; + } + else + { + return false; + } + } + + std::ostream& operator<< (std::ostream& s, const CoordinateSystem3D& that) + { + s << "origin: " << that.origin_ << " normal: " << that.normal_ + << " axisX: " << that.axisX_ << " axisY: " << that.axisY_ + << " D: " << that.d_; + return s; + } + + + CoordinateSystem3D CoordinateSystem3D::NormalizeCuttingPlane(const CoordinateSystem3D& plane) + { + double ox, oy; + plane.ProjectPoint(ox, oy, LinearAlgebra::CreateVector(0, 0, 0)); + + CoordinateSystem3D normalized(plane); + normalized.SetOrigin(plane.MapSliceToWorldCoordinates(ox, oy)); + return normalized; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/CoordinateSystem3D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/CoordinateSystem3D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,140 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2D/ScenePoint2D.h" +#include "LinearAlgebra.h" +#include "OrthancDatasets/IDicomDataset.h" + +#include + +namespace OrthancStone +{ + // Geometry of a 3D plane + class CoordinateSystem3D + { + private: + Vector origin_; + Vector normal_; + Vector axisX_; + Vector axisY_; + double d_; + + void CheckAndComputeNormal(); + + void Setup(const std::string& imagePositionPatient, + const std::string& imageOrientationPatient); + + void SetupCanonical(); + + double GetOffset() const; + + public: + CoordinateSystem3D() + { + SetupCanonical(); + } + + friend std::ostream& operator<< (std::ostream& s, const CoordinateSystem3D& that); + + CoordinateSystem3D(const Vector& origin, + const Vector& axisX, + const Vector& axisY); + + CoordinateSystem3D(const IDicomDataset& dicom); + + CoordinateSystem3D(const std::string& imagePositionPatient, + const std::string& imageOrientationPatient) + { + Setup(imagePositionPatient, imageOrientationPatient); + } + + CoordinateSystem3D(const Orthanc::DicomMap& dicom); + + const Vector& GetNormal() const + { + return normal_; + } + + const Vector& GetOrigin() const // This is the "Image Position Patient" tag + { + return origin_; + } + + const Vector& GetAxisX() const + { + return axisX_; + } + + const Vector& GetAxisY() const + { + return axisY_; + } + + void SetOrigin(const Vector& origin); + + Vector MapSliceToWorldCoordinates(double x, + double y) const; + + Vector MapSliceToWorldCoordinates(const ScenePoint2D& p) const + { + return MapSliceToWorldCoordinates(p.GetX(), p.GetY()); + } + + double ProjectAlongNormal(const Vector& point) const; + + void ProjectPoint(double& offsetX, + double& offsetY, + const Vector& point) const; + + ScenePoint2D ProjectPoint(const Vector& point) const + { + double x, y; + ProjectPoint(x, y, point); + return ScenePoint2D(x, y); + } + + /* + Alternated faster implementation (untested yet) + */ + void ProjectPoint2(double& offsetX, + double& offsetY, + const Vector& point) const; + + bool IntersectSegment(Vector& p, + const Vector& edgeFrom, + const Vector& edgeTo) const; + + bool IntersectLine(Vector& p, + const Vector& origin, + const Vector& direction) const; + + // Returns "false" is the two planes are not parallel + static bool ComputeDistance(double& distance, + const CoordinateSystem3D& a, + const CoordinateSystem3D& b); + + // Normalize a cutting plane so that the origin (0,0,0) of the 3D + // world is mapped to the origin of its (x,y) coordinate system + static CoordinateSystem3D NormalizeCuttingPlane(const CoordinateSystem3D& plane); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,530 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomInstanceParameters.h" + +#include "../Scene2D/ColorTextureSceneLayer.h" +#include "../Scene2D/FloatTextureSceneLayer.h" +#include "../Toolbox/GeometryToolbox.h" +#include "../Toolbox/ImageToolbox.h" + +#include +#include +#include +#include +#include + + +namespace OrthancStone +{ + void DicomInstanceParameters::Data::ComputeDoseOffsets(const Orthanc::DicomMap& dicom) + { + // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html + + { + std::string increment; + + if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) + { + Orthanc::Toolbox::ToUpperCase(increment); + if (increment != "3004,000C") // This is the "Grid Frame Offset Vector" tag (DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) + { + LOG(ERROR) << "RT-DOSE: Bad value for the \"FrameIncrementPointer\" tag"; + return; + } + } + } + + if (!LinearAlgebra::ParseVector(frameOffsets_, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || + frameOffsets_.size() < imageInformation_.GetNumberOfFrames()) + { + LOG(ERROR) << "RT-DOSE: No information about the 3D location of some slice(s)"; + frameOffsets_.clear(); + } + else + { + if (frameOffsets_.size() >= 2) + { + thickness_ = std::abs(frameOffsets_[1] - frameOffsets_[0]); + } + } + } + + + DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) : + imageInformation_(dicom) + { + if (imageInformation_.GetNumberOfFrames() <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (!dicom.LookupStringValue(studyInstanceUid_, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || + !dicom.LookupStringValue(seriesInstanceUid_, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) || + !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + std::string s; + if (!dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + sopClassUid_ = StringToSopClassUid(s); + } + + if (!dicom.ParseDouble(thickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) + { + thickness_ = 100.0 * std::numeric_limits::epsilon(); + } + + GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); + + std::string position, orientation; + if (dicom.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && + dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) + { + geometry_ = CoordinateSystem3D(position, orientation); + } + + if (sopClassUid_ == SopClassUid_RTDose) + { + ComputeDoseOffsets(dicom); + + static const Orthanc::DicomTag DICOM_TAG_DOSE_UNITS(0x3004, 0x0002); + + if (!dicom.LookupStringValue(doseUnits_, DICOM_TAG_DOSE_UNITS, false)) + { + LOG(ERROR) << "Tag DoseUnits (0x3004, 0x0002) is missing in " << sopInstanceUid_; + doseUnits_ = ""; + } + } + + isColor_ = (imageInformation_.GetPhotometricInterpretation() != Orthanc::PhotometricInterpretation_Monochrome1 && + imageInformation_.GetPhotometricInterpretation() != Orthanc::PhotometricInterpretation_Monochrome2); + + if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && + dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) + { + if (sopClassUid_ == SopClassUid_RTDose) + { + LOG(INFO) << "DOSE HAS Rescale*: rescaleIntercept_ = " << rescaleIntercept_ << " rescaleSlope_ = " << rescaleSlope_; + // WE SHOULD NOT TAKE THE RESCALE VALUE INTO ACCOUNT IN THE CASE OF DOSES + hasRescale_ = false; + } + else + { + hasRescale_ = true; + } + + } + else + { + hasRescale_ = false; + } + + if (dicom.ParseDouble(doseGridScaling_, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) + { + if (sopClassUid_ == SopClassUid_RTDose) + { + LOG(INFO) << "DOSE HAS DoseGridScaling: doseGridScaling_ = " << doseGridScaling_; + } + } + else + { + doseGridScaling_ = 1.0; + if (sopClassUid_ == SopClassUid_RTDose) + { + LOG(ERROR) << "Tag DoseGridScaling (0x3004, 0x000e) is missing in " << sopInstanceUid_ << " doseGridScaling_ will be set to 1.0"; + } + } + + Vector c, w; + if (LinearAlgebra::ParseVector(c, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && + LinearAlgebra::ParseVector(w, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH) && + c.size() > 0 && + w.size() > 0) + { + hasDefaultWindowing_ = true; + defaultWindowingCenter_ = static_cast(c[0]); + defaultWindowingWidth_ = static_cast(w[0]); + } + else + { + hasDefaultWindowing_ = false; + defaultWindowingCenter_ = 0; + defaultWindowingWidth_ = 0; + } + + if (sopClassUid_ == SopClassUid_RTDose) + { + switch (imageInformation_.GetBitsStored()) + { + case 16: + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; + break; + + case 32: + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale32; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + else if (isColor_) + { + expectedPixelFormat_ = Orthanc::PixelFormat_RGB24; + } + else if (imageInformation_.IsSigned()) + { + expectedPixelFormat_ = Orthanc::PixelFormat_SignedGrayscale16; + } + else + { + expectedPixelFormat_ = Orthanc::PixelFormat_Grayscale16; + } + + // This computes the "IndexInSeries" metadata from Orthanc (check + // out "Orthanc::ServerIndex::Store()") + hasIndexInSeries_ = ( + dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || + dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); + } + + + CoordinateSystem3D DicomInstanceParameters::Data::GetFrameGeometry(unsigned int frame) const + { + if (frame == 0) + { + return geometry_; + } + else if (frame >= imageInformation_.GetNumberOfFrames()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else if (sopClassUid_ == SopClassUid_RTDose) + { + if (frame >= frameOffsets_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + return CoordinateSystem3D( + geometry_.GetOrigin() + frameOffsets_[frame] * geometry_.GetNormal(), + geometry_.GetAxisX(), + geometry_.GetAxisY()); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + bool DicomInstanceParameters::Data::IsPlaneWithinSlice(unsigned int frame, + const CoordinateSystem3D& plane) const + { + if (frame >= imageInformation_.GetNumberOfFrames()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + CoordinateSystem3D tmp = geometry_; + + if (frame != 0) + { + tmp = GetFrameGeometry(frame); + } + + double distance; + + return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && + distance <= thickness_ / 2.0); + } + + void DicomInstanceParameters::Data::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, + bool useDouble) const + { + if (image.GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + double factor = doseGridScaling_; + double offset = 0.0; + + if (hasRescale_) + { + factor *= rescaleSlope_; + offset = rescaleIntercept_; + } + + if ( (factor != 1.0) || (offset != 0.0) ) + { + const unsigned int width = image.GetWidth(); + const unsigned int height = image.GetHeight(); + + for (unsigned int y = 0; y < height; y++) + { + float* p = reinterpret_cast(image.GetRow(y)); + + if (useDouble) + { + // Slower, accurate implementation using double + for (unsigned int x = 0; x < width; x++, p++) + { + double value = static_cast(*p); + *p = static_cast(value * factor + offset); + } + } + else + { + // Fast, approximate implementation using float + for (unsigned int x = 0; x < width; x++, p++) + { + *p = (*p) * static_cast(factor) + static_cast(offset); + } + } + } + } + } + + double DicomInstanceParameters::GetRescaleIntercept() const + { + if (data_.hasRescale_) + { + return data_.rescaleIntercept_; + } + else + { + LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + double DicomInstanceParameters::GetRescaleSlope() const + { + if (data_.hasRescale_) + { + return data_.rescaleSlope_; + } + else + { + LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + float DicomInstanceParameters::GetDefaultWindowingCenter() const + { + if (data_.hasDefaultWindowing_) + { + return data_.defaultWindowingCenter_; + } + else + { + LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingCenter(): no default windowing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + float DicomInstanceParameters::GetDefaultWindowingWidth() const + { + if (data_.hasDefaultWindowing_) + { + return data_.defaultWindowingWidth_; + } + else + { + LOG(ERROR) << "DicomInstanceParameters::GetDefaultWindowingWidth(): no default windowing"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const + { + std::unique_ptr converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, + pixelData.GetWidth(), + pixelData.GetHeight(), + false)); + Orthanc::ImageProcessing::Convert(*converted, pixelData); + + + // Correct rescale slope/intercept if need be + //data_.ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); + data_.ApplyRescaleAndDoseScaling(*converted, false); + + return converted.release(); + } + + + TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture + (const Orthanc::ImageAccessor& pixelData) const + { + // { + // const Orthanc::ImageAccessor& source = pixelData; + // const void* sourceBuffer = source.GetConstBuffer(); + // intptr_t sourceBufferInt = reinterpret_cast(sourceBuffer); + // int sourceWidth = source.GetWidth(); + // int sourceHeight = source.GetHeight(); + // int sourcePitch = source.GetPitch(); + + // // TODO: turn error into trace below + // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" + // << " W = " << sourceWidth << " H = " << sourceHeight + // << " P = " << sourcePitch << " B = " << sourceBufferInt + // << " B % 4 == " << sourceBufferInt % 4; + // } + + assert(sizeof(float) == 4); + + Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); + + if (sourceFormat != GetExpectedPixelFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (sourceFormat == Orthanc::PixelFormat_RGB24) + { + // This is the case of a color image. No conversion has to be done. + return new ColorTextureSceneLayer(pixelData); + } + else + { + // This is the case of a grayscale frame. Convert it to Float32. + std::unique_ptr texture; + + if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) + { + texture.reset(new FloatTextureSceneLayer(pixelData)); + } + else + { + std::unique_ptr converted(ConvertToFloat(pixelData)); + texture.reset(new FloatTextureSceneLayer(*converted)); + } + + if (data_.hasDefaultWindowing_) + { + texture->SetCustomWindowing(data_.defaultWindowingCenter_, + data_.defaultWindowingWidth_); + } + + + if (data_.imageInformation_.GetPhotometricInterpretation() + == Orthanc::PhotometricInterpretation_Monochrome1) + { + texture->SetInverted(true); + } + else if (data_.imageInformation_.GetPhotometricInterpretation() + == Orthanc::PhotometricInterpretation_Monochrome2) + { + texture->SetInverted(false); + } + + return texture.release(); + } + } + + + LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture + (const Orthanc::ImageAccessor& pixelData) const + { + std::unique_ptr texture; + + if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) + { + return new LookupTableTextureSceneLayer(pixelData); + } + else + { + std::unique_ptr converted(ConvertToFloat(pixelData)); + return new LookupTableTextureSceneLayer(*converted); + } + } + + + unsigned int DicomInstanceParameters::GetIndexInSeries() const + { + if (data_.hasIndexInSeries_) + { + return data_.indexInSeries_; + } + else + { + LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + double DicomInstanceParameters::Data::ApplyRescale(double value) const + { + double factor = doseGridScaling_; + double offset = 0.0; + + if (hasRescale_) + { + factor *= rescaleSlope_; + offset = rescaleIntercept_; + } + + return (value * factor + offset); + } + + + bool DicomInstanceParameters::Data::ComputeRegularSpacing(double& spacing) const + { + if (frameOffsets_.size() == 0) // Not a RT-DOSE + { + return false; + } + else if (frameOffsets_.size() == 1) + { + spacing = 1; // Edge case: RT-DOSE with one single frame + return true; + } + else + { + spacing = std::abs(frameOffsets_[1] - frameOffsets_[0]); + + for (size_t i = 1; i + 1 < frameOffsets_.size(); i++) + { + double s = frameOffsets_[i + 1] - frameOffsets_[i]; + if (!LinearAlgebra::IsNear(spacing, s, 0.001)) + { + return false; + } + } + + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomInstanceParameters.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomInstanceParameters.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,235 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "../Scene2D/LookupTableTextureSceneLayer.h" +#include "../Toolbox/CoordinateSystem3D.h" + +#include +#include + +namespace OrthancStone +{ + class DicomInstanceParameters : + public Orthanc::IDynamicObject /* to be used as a payload to SlicesSorter */ + { + // This class supersedes the deprecated "DicomFrameConverter" + + private: + struct Data // Struct to ease the copy constructor + { + std::string orthancInstanceId_; + std::string studyInstanceUid_; + std::string seriesInstanceUid_; + std::string sopInstanceUid_; + Orthanc::DicomImageInformation imageInformation_; + SopClassUid sopClassUid_; + double thickness_; + double pixelSpacingX_; + double pixelSpacingY_; + CoordinateSystem3D geometry_; + Vector frameOffsets_; + bool isColor_; + bool hasRescale_; + double rescaleIntercept_; + double rescaleSlope_; + bool hasDefaultWindowing_; + float defaultWindowingCenter_; + float defaultWindowingWidth_; + Orthanc::PixelFormat expectedPixelFormat_; + bool hasIndexInSeries_; + unsigned int indexInSeries_; + std::string doseUnits_; + double doseGridScaling_; + + void ComputeDoseOffsets(const Orthanc::DicomMap& dicom); + + Data(const Orthanc::DicomMap& dicom); + + CoordinateSystem3D GetFrameGeometry(unsigned int frame) const; + + bool IsPlaneWithinSlice(unsigned int frame, + const CoordinateSystem3D& plane) const; + + void ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, + bool useDouble) const; + + double ApplyRescale(double value) const; + + bool ComputeRegularSpacing(double& target) const; + }; + + + Data data_; + + + public: + DicomInstanceParameters(const DicomInstanceParameters& other) : + data_(other.data_) + { + } + + DicomInstanceParameters(const Orthanc::DicomMap& dicom) : + data_(dicom) + { + } + + DicomInstanceParameters* Clone() const + { + return new DicomInstanceParameters(*this); + } + + void SetOrthancInstanceIdentifier(const std::string& id) + { + data_.orthancInstanceId_ = id; + } + + const std::string& GetOrthancInstanceIdentifier() const + { + return data_.orthancInstanceId_; + } + + const Orthanc::DicomImageInformation& GetImageInformation() const + { + return data_.imageInformation_; + } + + const std::string& GetStudyInstanceUid() const + { + return data_.studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return data_.seriesInstanceUid_; + } + + const std::string& GetSopInstanceUid() const + { + return data_.sopInstanceUid_; + } + + SopClassUid GetSopClassUid() const + { + return data_.sopClassUid_; + } + + double GetThickness() const + { + return data_.thickness_; + } + + double GetPixelSpacingX() const + { + return data_.pixelSpacingX_; + } + + double GetPixelSpacingY() const + { + return data_.pixelSpacingY_; + } + + const CoordinateSystem3D& GetGeometry() const + { + return data_.geometry_; + } + + CoordinateSystem3D GetFrameGeometry(unsigned int frame) const + { + return data_.GetFrameGeometry(frame); + } + + bool IsPlaneWithinSlice(unsigned int frame, + const CoordinateSystem3D& plane) const + { + return data_.IsPlaneWithinSlice(frame, plane); + } + + bool IsColor() const + { + return data_.isColor_; + } + + bool HasRescale() const + { + return data_.hasRescale_; + } + + double GetRescaleIntercept() const; + + double GetRescaleSlope() const; + + bool HasDefaultWindowing() const + { + return data_.hasDefaultWindowing_; + } + + float GetDefaultWindowingCenter() const; + + float GetDefaultWindowingWidth() const; + + Orthanc::PixelFormat GetExpectedPixelFormat() const + { + return data_.expectedPixelFormat_; + } + + Orthanc::ImageAccessor* ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const; + + TextureBaseSceneLayer* CreateTexture(const Orthanc::ImageAccessor& pixelData) const; + + LookupTableTextureSceneLayer* CreateLookupTableTexture(const Orthanc::ImageAccessor& pixelData) const; + + bool HasIndexInSeries() const + { + return data_.hasIndexInSeries_; + } + + unsigned int GetIndexInSeries() const; + + const std::string& GetDoseUnits() const + { + return data_.doseUnits_; + } + + void SetDoseGridScaling(double value) + { + data_.doseGridScaling_ = value; + } + + double GetDoseGridScaling() const + { + return data_.doseGridScaling_; + } + + double ApplyRescale(double value) const + { + return data_.ApplyRescale(value); + } + + // Required for RT-DOSE + bool ComputeRegularSpacing(double& target) const + { + return data_.ComputeRegularSpacing(target); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructure2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructure2.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,293 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructure2.h" + +#include "../Toolbox/GeometryToolbox.h" +#include "../Toolbox/DisjointDataSet.h" + +namespace OrthancStone +{ + // see header + //void DicomStructure2::ComputeNormal() + //{ + // try + // { + // if (polygons_.size() > 0) + // { + + // // TODO: check all polygons are OK + // const DicomStructurePolygon2 polygon = polygons_[0]; + // $$$$$$$$$$$$$$$$$ + // state_ = NormalComputed; + // } + // else + // { + // // bogus! no polygons. Let's assign a "nothing here" value + // LinearAlgebra::AssignVector(normal_, 0, 0, 0); + // state_ = Invalid; + // } + // } + // catch (const Orthanc::OrthancException& e) + // { + // state_ = Invalid; + // if (e.HasDetails()) + // { + // LOG(ERROR) << "OrthancException in ComputeNormal: " << e.What() << " Details: " << e.GetDetails(); + // } + // else + // { + // LOG(ERROR) << "OrthancException in ComputeNormal: " << e.What(); + // } + // throw; + // } + // catch (const std::exception& e) + // { + // state_ = Invalid; + // LOG(ERROR) << "std::exception in ComputeNormal: " << e.what(); + // throw; + // } + // catch (...) + // { + // state_ = Invalid; + // LOG(ERROR) << "Unknown exception in ComputeNormal"; + // throw; + // } + //} + + void DicomStructure2::ComputeSliceThickness() + { + if (state_ != NormalComputed) + { + LOG(ERROR) << "DicomStructure2::ComputeSliceThickness - state must be NormalComputed"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + if (polygons_.size() < 2) + { + // cannot compute thickness if there are not at least 2 slabs (structures) + sliceThickness_ = 1.0; + state_ = Invalid; + } + else + { + // normal can be (1,0,0), (0,1,0) or (0,0,1), nothing else. + // these can be compared with == (exact double representation) + if (normal_[0] == 1) + { + // in a single polygon, all the points have the same X + sliceThickness_ = fabs(polygons_[0].GetPoint(0)[0] - polygons_[1].GetPoint(0)[0]); + } + else if (normal_[1] == 1) + { + // in a single polygon, all the points have the same X + sliceThickness_ = fabs(polygons_[0].GetPoint(0)[1] - polygons_[1].GetPoint(0)[1]); + } + else if (normal_[2] == 1) + { + // in a single polygon, all the points have the same X + sliceThickness_ = fabs(polygons_[0].GetPoint(0)[2] - polygons_[1].GetPoint(0)[2]); + } + else + { + ORTHANC_ASSERT(false); + state_ = Invalid; + } + } + state_ = Valid; + } + + void DicomStructure2::AddPolygon(const DicomStructurePolygon2& polygon) + { + if (state_ != Building) + { + LOG(ERROR) << "DicomStructure2::AddPolygon - can only add polygon while building"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + polygons_.push_back(polygon); + } + + void DicomStructure2::ComputeDependentProperties() + { + if (state_ != Building) + { + LOG(ERROR) << "DicomStructure2::ComputeDependentProperties - can only be called once"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + for (size_t i = 0; i < polygons_.size(); ++i) + { + // "compute" the polygon normal + polygons_[i].ComputeDependentProperties(); + } + if (polygons_.size() > 0) + { + normal_ = polygons_[0].GetNormal(); + state_ = NormalComputed; + } + else + { + LinearAlgebra::AssignVector(normal_, 0, 0, 0); + state_ = Invalid; // THIS MAY HAPPEN !!! (for instance for instance 72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661 :) ) + } + if (polygons_.size() >= 2) + ComputeSliceThickness(); // this will change state_ from NormalComputed to Valid + } + + OrthancStone::Vector DicomStructure2::GetNormal() const + { + if (state_ != Valid && state_ != Invalid) + { + LOG(ERROR) << "DicomStructure2::GetNormal() -- please call ComputeDependentProperties first."; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + if (state_ == Invalid) + { + LOG(ERROR) << "DicomStructure2::GetNormal() -- The Dicom structure is invalid. The normal is set to 0,0,0"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + return normal_; + } + + const DicomStructurePolygon2* DicomStructure2::GetPolygonClosestToSlice( + const CoordinateSystem3D& plane) const + { + ORTHANC_ASSERT(state_ == Valid); + + // we assume 0,0,1 for now + ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)); + ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)); + + for (size_t i = 0; i < polygons_.size(); ++i) + { + const DicomStructurePolygon2& polygon = polygons_[i]; + + // "height" of cutting plane + double cutZ = plane.GetOrigin()[2]; + + if (LinearAlgebra::IsNear( + cutZ, polygon.GetZ(), + sliceThickness_ / 2.0 /* in mm */)) + return &polygon; + } + return NULL; + } + + + bool DicomStructure2::Project(std::vector< std::pair > & segments, const CoordinateSystem3D & plane) const + { + segments.clear(); + + Vector normal = GetNormal(); + + size_t totalRectCount = 0; + + // dummy var + bool isOpposite = false; + + // This is an axial projection + if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, plane.GetNormal())) + { + const DicomStructurePolygon2* polygon = GetPolygonClosestToSlice(plane); + if (polygon) + { + polygon->ProjectOnParallelPlane(segments, plane); + } + } + else + { + // let's compute the dot product of the plane normal and the polygons + // normal. + double dot = LinearAlgebra::DotProduct(plane.GetNormal(), normal); + + if (LinearAlgebra::IsNear(dot, 0)) + { + // Coronal or sagittal projection + + // vector of vector of rectangles that will be merged in a single big contour: + + // each polygon slab cut by a perpendicular plane yields 0..* rectangles + std::vector< RtStructRectanglesInSlab > rectanglesForEachSlab; + + for (size_t i = 0; i < polygons_.size(); ++i) + { + // book an entry for this slab + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + + // let's compute the intersection between the polygon and the plane + // intersections are in plane coords + std::vector intersections; + + polygons_[i].ProjectOnConstantPlane(intersections, plane); + + // for each pair of intersections, we add a rectangle. + if ((intersections.size() % 2) != 0) + { + LOG(WARNING) << "Odd number of intersections between structure " + << name_ << ", polygon # " << i + << " and plane where X axis is parallel to polygon normal vector"; + } + + size_t numRects = intersections.size() / 2; + + // we keep count of the total number of rects for vector pre-allocations + totalRectCount += numRects; + + for (size_t iRect = 0; iRect < numRects; ++iRect) + { + RtStructRectangleInSlab rectangle; + ORTHANC_ASSERT(LinearAlgebra::IsNear(intersections[2 * iRect].y, intersections[2 * iRect + 1].y)); + ORTHANC_ASSERT((2 * iRect + 1) < intersections.size()); + double x1 = intersections[2 * iRect].x; + double x2 = intersections[2 * iRect + 1].x; + double y1 = intersections[2 * iRect].y - sliceThickness_ * 0.5; + double y2 = intersections[2 * iRect].y + sliceThickness_ * 0.5; + + rectangle.xmin = std::min(x1, x2); + rectangle.xmax = std::max(x1, x2); + rectangle.ymin = std::min(y1, y2); + rectangle.ymax = std::max(y1, y2); + + // TODO: keep them sorted!!!! + + rectanglesForEachSlab.back().push_back(rectangle); + } + } + // now we need to merge all the slabs into a set of polygons (1 or more) + ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, totalRectCount); + } + else + { + // plane is not perpendicular to the polygons + // 180.0 / [Math]::Pi = 57.2957795130823 + double acDot = 57.2957795130823 * acos(dot); + LOG(ERROR) << "DicomStructure2::Project -- cutting plane must be " + << "perpendicular to the structures, but dot product is: " + << dot << " and (180/pi)*acos(dot) = " << acDot; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + return segments.size() != 0; + } +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructure2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructure2.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,161 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructurePolygon2.h" +#include "DicomStructureSetUtils.h" + +namespace OrthancStone +{ + + /* + A structure has a color, a name, a set of slices.. + + Each slice is a polygon. + */ + struct DicomStructure2 + { + DicomStructure2() : + red_(0), green_(0), blue_(0), sliceThickness_(0), state_(Building) {} + + void AddPolygon(const DicomStructurePolygon2& polygon); + + /** + Once all polygons have been added, this method will determine: + - the slice orientation (through the normal vector) + - the spacing between slices (slice thickness) + + it will also set up the info required to efficiently compute plane + intersections later on. + */ + void ComputeDependentProperties(); + + /** + Being given a plane that is PARALLEL to the set of polygon structures, this + returns a pointer to the polygon located at that position (if it is closer + than thickness/2) or NULL if there is none. + + TODO: use sorted vector to improve + + DO NOT STORE THE RETURNED POINTER! + */ + const DicomStructurePolygon2* GetPolygonClosestToSlice(const CoordinateSystem3D& plane) const; + + Vector GetNormal() const; + + Color GetColor() const + { + return Color(red_, green_, blue_); + } + + bool IsValid() const + { + return state_ == Valid; + } + + /** + This method is used to project the 3D structure on a 2D plane. + + A structure is a stack of polygons, representing a volume. + + We need to compute the intersection between this volume and the supplied + cutting plane (the "slice"). This is more than a cutting plane: it is also + a 2D-coordinate system (the plane has axes vectors) + + The cutting plane is always parallel to the plane defined by two of the + world coordinate system axes. + + The result is a set of closed polygons. + + If the cut is parallel to the polygons, we pick the polygon closest to + the slice, project it on the slice and return it in slice coordinates. + + If the cut is perpendicular to the polygons, for each polygon, we compute + the intersection between the cutting plane and the polygon slab (imaginary + volume created by extruding the polygon above and below its plane by + thickness/2) : + - each slab, intersected by the plane, gives a set of 0..* rectangles \ + (only one if the polygon is convex) + - when doing this for the whole stack of slabs, we get a set of rectangles: + To compute these rectangles, for each polygon, we compute the intersection + between : + - the line defined by the intersection of the polygon plane and the cutting + plane + - the polygon itself + This yields 0 or 2*K points along the line C. These are turned into K + rectangles by taking two consecutive points along the line and extruding + this segment by sliceThickness/2 in the orientation of the polygon normal, + in both directions. + + Then, once this list of rectangles is computed, we need to group the + connected rectangles together. Connected, here, means sharing at least part + of an edge --> union/find data structures and algorithm. + */ + bool Project(std::vector< std::pair >& polygons, const CoordinateSystem3D& plane) const; + + std::string interpretation_; + std::string name_; + uint8_t red_; + uint8_t green_; + uint8_t blue_; + + /** Internal */ + const std::vector& GetPolygons() const + { + return polygons_; + } + + /** Internal */ + double GetSliceThickness() const + { + return sliceThickness_; + } + + private: + enum State + { + Building, + NormalComputed, + Valid, // When normal components AND slice thickness are computed + Invalid + }; + + void ComputeNormal(); + void ComputeSliceThickness(); + + std::vector polygons_; + Vector3D normal_; + double sliceThickness_; + + /* + After creation (and while polygons are added), state is Building. + After ComputeDependentProperties() is called, state can either be + Valid or Invalid. In any case, the object becomes immutable. + */ + State state_; + }; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructurePolygon2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructurePolygon2.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,305 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructurePolygon2.h" + +#include "../Toolbox/LinearAlgebra.h" + +namespace OrthancStone +{ + void DicomStructurePolygon2::ComputeDependentProperties() + { + ORTHANC_ASSERT(state_ == Building); + + for (size_t j = 0; j < points_.size(); ++j) + { + // TODO: move to AddPoint! + const Point3D& p = points_[j]; + if (p[0] < minX_) + minX_ = p[0]; + if (p[0] > maxX_) + maxX_ = p[0]; + + if (p[1] < minY_) + minY_ = p[1]; + if (p[1] > maxY_) + maxY_ = p[1]; + + if (p[2] < minZ_) + minZ_ = p[2]; + if (p[2] > maxZ_) + maxZ_ = p[2]; + } + + if (LinearAlgebra::IsNear(minX_, maxX_)) + { + LinearAlgebra::AssignVector(normal_, 1, 0, 0); + //ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX, maxX)); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minY_, maxY_)); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minZ_, maxZ_)); + } + else if (LinearAlgebra::IsNear(minY_, maxY_)) + { + LinearAlgebra::AssignVector(normal_, 0, 1, 0); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX_, maxX_)); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minZ_, maxZ_)); + } + else if (LinearAlgebra::IsNear(minZ_, maxZ_)) + { + LinearAlgebra::AssignVector(normal_, 0, 0, 1); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minX_, maxX_)); + ORTHANC_ASSERT(!LinearAlgebra::IsNear(minY_, maxY_)); + } + else + { + LOG(ERROR) << "The contour is not coplanar and not parallel to any axis."; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + state_ = Valid; + } + + + void DicomStructurePolygon2::ProjectOnConstantPlane( + std::vector& intersections, const CoordinateSystem3D& plane) const + { + // the plane can either have constant X, or constant Y. + // - for constant Z planes, use the ProjectOnParallelPlane method + // - other type of planes are not supported + + // V is the coordinate that is constant in the plane + double planeV = 0.0; + + // if true, then "u" in the code is "x" and "v" is "y". + // (v is constant in the plane) + bool uvxy = false; + + size_t uindex = static_cast(-1); + size_t vindex = static_cast(-1); + + ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[2], 0.0)); + + if (LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)) + { + // normal is 1,0,0 (or -1,0,0). + // plane is constant X + uindex = 1; + vindex = 0; + + uvxy = false; + planeV = plane.GetOrigin()[0]; + if (planeV < minX_) + return; + if (planeV > maxX_) + return; + } + else if (LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)) + { + // normal is 0,1,0 (or 0,-1,0). + // plane is constant Y + uindex = 0; + vindex = 1; + + uvxy = true; + planeV = plane.GetOrigin()[1]; + if (planeV < minY_) + return; + if (planeV > maxY_) + return; + } + else + { + // if the following assertion(s) fail(s), it means the plane is NOT a constant-X or constant-Y plane + LOG(ERROR) << "Plane normal must be (a,0,0) or (0,a,0), with a == -1 or a == 1"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + size_t pointCount = GetPointCount(); + if (pointCount >= 3) + { + // this vector will contain the coordinates of the intersection points + // between the plane and the polygon. + // these are expressed in the U coordinate, that is either X or Y, + // depending upon the plane orientation + std::vector uIntersections; + + // we loop on the segments of the polygon (TODO: optimize) + // and we compute the intersection between each segment and the cut + // cutting plane (slice) has a constant X + + for (size_t iPoint = 0; iPoint < pointCount; ++iPoint) + { + double u1 = points_[iPoint][uindex]; + double v1 = points_[iPoint][vindex]; + + double u2 = 0; + double v2 = 0; + + if (iPoint < pointCount - 1) + { + u2 = points_[iPoint + 1][uindex]; + v2 = points_[iPoint + 1][vindex]; + } + else + { + u2 = points_[0][uindex]; + v2 = points_[0][vindex]; + } + + // Check if the segment intersects the plane + if ((std::min(v1, v2) <= planeV) && (std::max(v1, v2) >= planeV)) + { + // special case: the segment is parallel to the plane but close to it + if (LinearAlgebra::IsNear(v1, v2)) + { + // in that case, we choose to label both points as an intersection + double x, y; + plane.ProjectPoint(x, y, points_[iPoint]); + intersections.push_back(Point2D(x, y)); + + plane.ProjectPoint(x, y, points_[iPoint + 1]); + intersections.push_back(Point2D(x, y)); + } + else + { + // we are looking for u so that (u,planeV) belongs to the segment + // let's define alpha = (u-u2)/(u1-u2) --> u = alpha*(u1-u2) + u2 + // alpha = (v2-planeV)/(v2-v1) + // because the following two triangles are similar + // [ (planeY,x) , (y2,x2), (planeY,x2) ] or + // [ (planeX,y) , (x2,y2), (planeX,y2) ] + // and + // [ (y1 ,x1) , (y2,x2), (y1 ,x2) ] or + // [ (x1 ,y1) , (x2,y2), (x1 ,y2) ] + + /* + void CoordinateSystem3D::ProjectPoint(double& offsetX, + double& offsetY, + const Vector& point) const + */ + double alpha = (v2 - planeV) / (v2 - v1); + + // get rid of numerical oddities + if (alpha < 0.0) + alpha = 0.0; + if (alpha > 1.0) + alpha = 1.0; + double u = alpha * (u1 - u2) + u2; + + // here is the intersection in world coordinates + Vector intersection; + if(uvxy) + LinearAlgebra::AssignVector(intersection, u, planeV, minZ_); + else + LinearAlgebra::AssignVector(intersection, planeV, u, minZ_); + + // and we convert it to plane coordinates + { + double xi, yi; + plane.ProjectPoint(xi, yi, intersection); + + // we consider that the x axis is always parallel to the polygons + // TODO: is this hypothesis safe?????? + uIntersections.insert(std::lower_bound(uIntersections.begin(), uIntersections.end(), xi), xi); + } + } + } + } // end of for (size_t iPoint = 0; iPoint < pointCount; ++iPoint) + + // now we convert the intersections to plane points + // we consider that the x axis is always parallel to the polygons + // TODO: same hypothesis as above: plane is perpendicular to polygons, + // plane is parallel to the XZ (constant Y) or YZ (constant X) 3D planes + for (size_t i = 0; i < uIntersections.size(); ++i) + { + double x = uIntersections[i]; + intersections.push_back(Point2D(x, minZ_)); + } + } // end of if (pointCount >= 3) + else + { + LOG(ERROR) << "This polygon has " << pointCount << " vertices, which is less than 3 --> skipping"; + } + } + +void OrthancStone::DicomStructurePolygon2::ProjectOnParallelPlane( + std::vector< std::pair >& segments, + const CoordinateSystem3D& plane) const +{ + if (points_.size() < 3) + return; + + // the plane is horizontal + ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[0], 0.0)); + ORTHANC_ASSERT(LinearAlgebra::IsNear(plane.GetNormal()[1], 0.0)); + + segments.clear(); + segments.reserve(points_.size()); + // since the returned values need to be expressed in the supplied coordinate + // system, we need to subtract origin_ from the returned points + + double planeOriginX = plane.GetOrigin()[0]; + double planeOriginY = plane.GetOrigin()[1]; + + // precondition: points_.size() >= 3 + for (size_t j = 0; j < points_.size()-1; ++j) + { + // segment between point j and j+1 + + const Point3D& point0 = GetPoint(j); + // subtract plane origin x and y + Point2D p0(point0[0] - planeOriginX, point0[1] - planeOriginY); + + const Point3D& point1 = GetPoint(j+1); + // subtract plane origin x and y + Point2D p1(point1[0] - planeOriginX, point1[1] - planeOriginY); + + segments.push_back(std::pair(p0,p1)); + } + + + // final segment + + const Point3D& point0 = GetPoint(points_.size() - 1); + // subtract plane origin x and y + Point2D p0(point0[0] - planeOriginX, point0[1] - planeOriginY); + + const Point3D& point1 = GetPoint(0); + // subtract plane origin x and y + Point2D p1(point1[0] - planeOriginX, point1[1] - planeOriginY); + + segments.push_back(std::pair(p0, p1)); +} + +double OrthancStone::DicomStructurePolygon2::GetZ() const +{ + ORTHANC_ASSERT(LinearAlgebra::IsNear(normal_[0], 0.0)); + ORTHANC_ASSERT(LinearAlgebra::IsNear(normal_[1], 0.0)); + ORTHANC_ASSERT(LinearAlgebra::IsNear(minZ_, maxZ_)); + return minZ_; +} + + +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructurePolygon2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructurePolygon2.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,161 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "CoordinateSystem3D.h" +#include "DicomStructureSetUtils.h" +#include "Extent2D.h" + +#include "../Scene2D/Color.h" +#include "../StoneException.h" + +#include + +#include +#include + +namespace OrthancStone +{ + + /** + Only polygons that are planar and parallel to either the X,Y or Z plane + ("X plane" == plane where X is equal to a constant for each point) are + supported. + */ + class DicomStructurePolygon2 + { + public: + enum Type + { + ClosedPlanar, + Unsupported + }; + + DicomStructurePolygon2(std::string referencedSopInstanceUid, const std::string& type) + : referencedSopInstanceUid_(referencedSopInstanceUid) + , state_(Building) + , minX_(std::numeric_limits::max()) + , maxX_(-std::numeric_limits::max()) + , minY_(std::numeric_limits::max()) + , maxY_(-std::numeric_limits::max()) + , minZ_(std::numeric_limits::max()) + , maxZ_(-std::numeric_limits::max()) + , type_(TypeFromString(type)) + { + ORTHANC_ASSERT(type_ == ClosedPlanar); + } + + void ComputeDependentProperties(); + + size_t GetPointCount() const + { + ORTHANC_ASSERT(state_ == Valid); + return points_.size(); + } + + const Point3D& GetPoint(size_t i) const + { + ORTHANC_ASSERT(state_ == Valid); + return points_.at(i); + } + + void AddPoint(const Point3D& v) + { + ORTHANC_ASSERT(state_ == Building); + points_.push_back(v); + } + + void Reserve(size_t n) + { + ORTHANC_ASSERT(state_ == Building); + points_.reserve(n); + } + + /** + This method takes a plane+coord system that is parallel to the polygon + and adds to polygons a new vector with the ordered set of points projected + on the plane, in the plane coordinate system. + */ + void ProjectOnParallelPlane( + std::vector< std::pair >& segments, + const CoordinateSystem3D& plane) const; + + /** + Returns the coordinates of the intersection of the polygon and a plane + that is perpendicular to the polygons (plane has either constant X or + constant Y) + */ + void ProjectOnConstantPlane( + std::vector& intersections, + const CoordinateSystem3D& plane) const; + + /** + This method assumes polygon has a normal equal to 0,0,-1 and 0,0,1 (thus, + the polygon is parallel to the XY plane) and returns the Z coordinate of + all the polygon points + */ + double GetZ() const; + + /** + The normal sign is left undefined for now + */ + Vector3D GetNormal() const + { + return normal_; + } + + /** + This method will compute the intersection between a polygon and + a plane where either X, Y or Z is constant. + The plane is given with an origin and a normal. If the normal is + not parallel to an axis, an error is raised. + */ + void ComputeIntersectionWithPlane(const CoordinateSystem3D& plane); + + private: + static Type TypeFromString(const std::string& s) + { + if (s == "CLOSED_PLANAR") + return ClosedPlanar; + else + return Unsupported; + } + enum State + { + Building, + Valid + }; + std::string referencedSopInstanceUid_; + CoordinateSystem3D geometry_; + std::vector points_; + Vector3D normal_; // sign is irrelevant for now + State state_; + double minX_, maxX_, minY_, maxY_, minZ_, maxZ_; + Type type_; + }; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSet.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,1067 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomStructureSet.h" +#include "DicomStructureSetUtils.h" + +#include "../Toolbox/GeometryToolbox.h" +#include "OrthancDatasets/DicomDatasetReader.h" + +#include +#include +#include + +#if defined(_MSC_VER) +# pragma warning(push) +# pragma warning(disable:4244) +#endif + +#include +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif + +#if ORTHANC_ENABLE_DCMTK == 1 +# include "ParsedDicomDataset.h" +#endif + + +typedef boost::geometry::model::d2::point_xy BoostPoint; +typedef boost::geometry::model::polygon BoostPolygon; +typedef boost::geometry::model::multi_polygon BoostMultiPolygon; + + +static void Union(BoostMultiPolygon& output, + std::vector& input) +{ + for (size_t i = 0; i < input.size(); i++) + { + boost::geometry::correct(input[i]); + } + + if (input.size() == 0) + { + output.clear(); + } + else if (input.size() == 1) + { + output.resize(1); + output[0] = input[0]; + } + else + { + boost::geometry::union_(input[0], input[1], output); + + for (size_t i = 0; i < input.size(); i++) + { + BoostMultiPolygon tmp; + boost::geometry::union_(output, input[i], tmp); + output = tmp; + } + } +} + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + +static BoostPolygon CreateRectangle(float x1, float y1, + float x2, float y2) +{ + BoostPolygon r; + boost::geometry::append(r, BoostPoint(x1, y1)); + boost::geometry::append(r, BoostPoint(x1, y2)); + boost::geometry::append(r, BoostPoint(x2, y2)); + boost::geometry::append(r, BoostPoint(x2, y1)); + return r; +} + +#else + +namespace OrthancStone +{ + static RtStructRectangleInSlab CreateRectangle(float x1, float y1, + float x2, float y2) + { + RtStructRectangleInSlab rect; + rect.xmin = std::min(x1, x2); + rect.xmax = std::max(x1, x2); + rect.ymin = std::min(y1, y2); + rect.ymax = std::max(y1, y2); + return rect; + } + + bool CompareRectanglesForProjection(const std::pair& r1, const std::pair& r2) + { + return r1.second < r2.second; + } + + bool CompareSlabsY(const RtStructRectanglesInSlab& r1, const RtStructRectanglesInSlab& r2) + { + if ((r1.size() == 0) || (r2.size() == 0)) + return false; + + return r1[0].ymax < r2[0].ymax; + } +} + +#endif + +namespace OrthancStone +{ + static const Orthanc::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); + static const Orthanc::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); + static const Orthanc::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); + static const Orthanc::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); + static const Orthanc::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); + static const Orthanc::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); + static const Orthanc::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); + static const Orthanc::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); + static const Orthanc::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); + static const Orthanc::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); + static const Orthanc::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); + static const Orthanc::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); + + + static uint8_t ConvertColor(double v) + { + if (v < 0) + { + return 0; + } + else if (v >= 255) + { + return 255; + } + else + { + return static_cast(v); + } + } + + + static bool ParseVector(Vector& target, + const IDicomDataset& dataset, + const DicomPath& tag) + { + std::string value; + return (dataset.GetStringValue(value, tag) && + LinearAlgebra::ParseVector(target, value)); + } + + void DicomStructureSet::Polygon::CheckPointIsOnSlice(const Vector& v) const + { + if (hasSlice_) + { + double magnitude = + GeometryToolbox::ProjectAlongNormal(v, geometry_.GetNormal()); + if(!LinearAlgebra::IsNear( + magnitude, + projectionAlongNormal_, + sliceThickness_ / 2.0 /* in mm */ )) + { + LOG(ERROR) << "This RT-STRUCT contains a point that is off the " + << "slice of its instance | " + << "magnitude = " << magnitude << " | " + << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " + << "tolerance (sliceThickness_ / 2.0) = " << (sliceThickness_ / 2.0); + + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + } + + bool DicomStructureSet::Polygon::IsPointOnSliceIfAny(const Vector& v) const + { + if (hasSlice_) + { + double magnitude = + GeometryToolbox::ProjectAlongNormal(v, geometry_.GetNormal()); + bool onSlice = LinearAlgebra::IsNear( + magnitude, + projectionAlongNormal_, + sliceThickness_ / 2.0 /* in mm */); + if (!onSlice) + { + LOG(WARNING) << "This RT-STRUCT contains a point that is off the " + << "slice of its instance | " + << "magnitude = " << magnitude << " | " + << "projectionAlongNormal_ = " << projectionAlongNormal_ << " | " + << "tolerance (sliceThickness_ / 2.0) = " << (sliceThickness_ / 2.0); + } + return onSlice; + } + else + { + return true; + } + } + + void DicomStructureSet::Polygon::AddPoint(const Vector& v) + { +#if 1 + // BGO 2019-09-03 + if (IsPointOnSliceIfAny(v)) + { + points_.push_back(v); + } +#else + CheckPoint(v); + points_.push_back(v); +#endif + } + + + bool DicomStructureSet::Polygon::UpdateReferencedSlice(const ReferencedSlices& slices) + { + if (hasSlice_) + { + return true; + } + else + { + ReferencedSlices::const_iterator it = slices.find(sopInstanceUid_); + + if (it == slices.end()) + { + return false; + } + else + { + const CoordinateSystem3D& geometry = it->second.geometry_; + + hasSlice_ = true; + geometry_ = geometry; + projectionAlongNormal_ = GeometryToolbox::ProjectAlongNormal(geometry.GetOrigin(), geometry.GetNormal()); + sliceThickness_ = it->second.thickness_; + + extent_.Reset(); + + for (Points::const_iterator it = points_.begin(); it != points_.end(); ++it) + { + if (IsPointOnSliceIfAny(*it)) + { + double x, y; + geometry.ProjectPoint2(x, y, *it); + extent_.AddPoint(x, y); + } + } + return true; + } + } + } + + bool DicomStructureSet::Polygon::IsOnSlice(const CoordinateSystem3D& slice) const + { + bool isOpposite = false; + + if (points_.empty() || + !hasSlice_ || + !GeometryToolbox::IsParallelOrOpposite(isOpposite, slice.GetNormal(), geometry_.GetNormal())) + { + return false; + } + + double d = GeometryToolbox::ProjectAlongNormal(slice.GetOrigin(), geometry_.GetNormal()); + + return (LinearAlgebra::IsNear(d, projectionAlongNormal_, + sliceThickness_ / 2.0)); + } + + bool DicomStructureSet::Polygon::Project(double& x1, + double& y1, + double& x2, + double& y2, + const CoordinateSystem3D& slice) const + { + // TODO: optimize this method using a sweep-line algorithm for polygons + + if (!hasSlice_ || + points_.size() <= 1) + { + return false; + } + + double x, y; + geometry_.ProjectPoint2(x, y, slice.GetOrigin()); + + bool isOpposite; + if (GeometryToolbox::IsParallelOrOpposite + (isOpposite, slice.GetNormal(), geometry_.GetAxisY())) + { + // plane is constant Y + + if (y < extent_.GetY1() || + y > extent_.GetY2()) + { + // The polygon does not intersect the input slice + return false; + } + + bool isFirst = true; + double xmin = std::numeric_limits::infinity(); + double xmax = -std::numeric_limits::infinity(); + + double prevX, prevY; + geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); + + for (size_t i = 0; i < points_.size(); i++) + { + // Reference: ../../Resources/Computations/IntersectSegmentAndHorizontalLine.py + double curX, curY; + geometry_.ProjectPoint2(curX, curY, points_[i]); + + // if prev* and cur* are on opposite sides of y, this means that the + // segment intersects the plane. + if ((prevY < y && curY > y) || + (prevY > y && curY < y)) + { + double p = (curX * prevY - curY * prevX + y * (prevX - curX)) / (prevY - curY); + xmin = std::min(xmin, p); + xmax = std::max(xmax, p); + isFirst = false; + + // xmin and xmax represent the extent of the rectangle along the + // intersection between the plane and the polygon geometry + + } + + prevX = curX; + prevY = curY; + } + + // if NO segment intersects the plane + if (isFirst) + { + return false; + } + else + { + // y is the plane y coord in the polygon geometry + // xmin and xmax are ALSO expressed in the polygon geometry + + // let's convert them to 3D world geometry... + Vector p1 = (geometry_.MapSliceToWorldCoordinates(xmin, y) + + sliceThickness_ / 2.0 * geometry_.GetNormal()); + Vector p2 = (geometry_.MapSliceToWorldCoordinates(xmax, y) - + sliceThickness_ / 2.0 * geometry_.GetNormal()); + + // then to the cutting plane geometry... + slice.ProjectPoint2(x1, y1, p1); + slice.ProjectPoint2(x2, y2, p2); + return true; + } + } + else if (GeometryToolbox::IsParallelOrOpposite + (isOpposite, slice.GetNormal(), geometry_.GetAxisX())) + { + // plane is constant X => Sagittal view (remember that in the + // sagittal projection, the normal must be swapped) + + + /* + Please read the comments in the section above, by taking into account + the fact that, in this case, the plane has a constant X, not Y (in + polygon geometry_ coordinates) + */ + + if (x < extent_.GetX1() || + x > extent_.GetX2()) + { + return false; + } + + bool isFirst = true; + double ymin = std::numeric_limits::infinity(); + double ymax = -std::numeric_limits::infinity(); + + double prevX, prevY; + geometry_.ProjectPoint2(prevX, prevY, points_[points_.size() - 1]); + + for (size_t i = 0; i < points_.size(); i++) + { + // Reference: ../../Resources/Computations/IntersectSegmentAndVerticalLine.py + double curX, curY; + geometry_.ProjectPoint2(curX, curY, points_[i]); + + if ((prevX < x && curX > x) || + (prevX > x && curX < x)) + { + double p = (curX * prevY - curY * prevX + x * (curY - prevY)) / (curX - prevX); + ymin = std::min(ymin, p); + ymax = std::max(ymax, p); + isFirst = false; + } + + prevX = curX; + prevY = curY; + } + + if (isFirst) + { + return false; + } + else + { + Vector p1 = (geometry_.MapSliceToWorldCoordinates(x, ymin) + + sliceThickness_ / 2.0 * geometry_.GetNormal()); + Vector p2 = (geometry_.MapSliceToWorldCoordinates(x, ymax) - + sliceThickness_ / 2.0 * geometry_.GetNormal()); + + slice.ProjectPoint2(x1, y1, p1); + slice.ProjectPoint2(x2, y2, p2); + + return true; + } + } + else + { + // Should not happen + return false; + } + } + + + const DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) const + { + if (index >= structures_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return structures_[index]; + } + + + DicomStructureSet::Structure& DicomStructureSet::GetStructure(size_t index) + { + if (index >= structures_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return structures_[index]; + } + + void DicomStructureSet::Setup(const IDicomDataset& tags) + { + DicomDatasetReader reader(tags); + + size_t count, tmp; + if (!tags.GetSequenceSize(count, DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE) || + !tags.GetSequenceSize(tmp, DICOM_TAG_ROI_CONTOUR_SEQUENCE) || + tmp != count || + !tags.GetSequenceSize(tmp, DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE) || + tmp != count) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + structures_.resize(count); + for (size_t i = 0; i < count; i++) + { + structures_[i].interpretation_ = reader.GetStringValue + (DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, + DICOM_TAG_RT_ROI_INTERPRETED_TYPE), + "No interpretation"); + + structures_[i].name_ = reader.GetStringValue + (DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, + DICOM_TAG_ROI_NAME), + "No name"); + + Vector color; + if (ParseVector(color, tags, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_ROI_DISPLAY_COLOR)) && + color.size() == 3) + { + structures_[i].red_ = ConvertColor(color[0]); + structures_[i].green_ = ConvertColor(color[1]); + structures_[i].blue_ = ConvertColor(color[2]); + } + else + { + structures_[i].red_ = 255; + structures_[i].green_ = 0; + structures_[i].blue_ = 0; + } + + size_t countSlices; + if (!tags.GetSequenceSize(countSlices, DicomPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE))) + { + countSlices = 0; + } + + LOG(INFO) << "New RT structure: \"" << structures_[i].name_ + << "\" with interpretation \"" << structures_[i].interpretation_ + << "\" containing " << countSlices << " slices (color: " + << static_cast(structures_[i].red_) << "," + << static_cast(structures_[i].green_) << "," + << static_cast(structures_[i].blue_) << ")"; + + // These temporary variables avoid allocating many vectors in the loop below + DicomPath countPointsPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); + + DicomPath geometricTypePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); + + DicomPath imageSequencePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); + + // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) + DicomPath referencedInstancePath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, + DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); + + DicomPath contourDataPath(DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_DATA); + + for (size_t j = 0; j < countSlices; j++) + { + unsigned int countPoints; + + countPointsPath.SetPrefixIndex(1, j); + if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; + + geometricTypePath.SetPrefixIndex(1, j); + std::string type = reader.GetMandatoryStringValue(geometricTypePath); + if (type != "CLOSED_PLANAR") + { + LOG(WARNING) << "Ignoring contour with geometry type: " << type; + continue; + } + + size_t size; + + imageSequencePath.SetPrefixIndex(1, j); + if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) + { + LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + referencedInstancePath.SetPrefixIndex(1, j); + std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); + + contourDataPath.SetPrefixIndex(1, j); + std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); + + Vector points; + if (!LinearAlgebra::ParseVector(points, slicesData) || + points.size() != 3 * countPoints) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + // seen in real world + if(Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") + { + LOG(ERROR) << "WARNING. The following Dicom tag (Referenced SOP Instance UID) contains an empty value : // (3006,0039)[" << i << "] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)"; + } + + Polygon polygon(sopInstanceUid); + polygon.Reserve(countPoints); + + for (size_t k = 0; k < countPoints; k++) + { + Vector v(3); + v[0] = points[3 * k]; + v[1] = points[3 * k + 1]; + v[2] = points[3 * k + 2]; + polygon.AddPoint(v); + } + + structures_[i].polygons_.push_back(polygon); + } + } + } + + +#if ORTHANC_ENABLE_DCMTK == 1 + DicomStructureSet::DicomStructureSet(Orthanc::ParsedDicomFile& instance) + { + ParsedDicomDataset dataset(instance); + Setup(dataset); + } +#endif + + + Vector DicomStructureSet::GetStructureCenter(size_t index) const + { + const Structure& structure = GetStructure(index); + + Vector center; + LinearAlgebra::AssignVector(center, 0, 0, 0); + if (structure.polygons_.empty()) + { + return center; + } + + double n = static_cast(structure.polygons_.size()); + + for (Polygons::const_iterator polygon = structure.polygons_.begin(); + polygon != structure.polygons_.end(); ++polygon) + { + if (!polygon->GetPoints().empty()) + { + center += polygon->GetPoints().front() / n; + } + } + + return center; + } + + + const std::string& DicomStructureSet::GetStructureName(size_t index) const + { + return GetStructure(index).name_; + } + + + const std::string& DicomStructureSet::GetStructureInterpretation(size_t index) const + { + return GetStructure(index).interpretation_; + } + + + Color DicomStructureSet::GetStructureColor(size_t index) const + { + const Structure& s = GetStructure(index); + return Color(s.red_, s.green_, s.blue_); + } + + + void DicomStructureSet::GetStructureColor(uint8_t& red, + uint8_t& green, + uint8_t& blue, + size_t index) const + { + const Structure& s = GetStructure(index); + red = s.red_; + green = s.green_; + blue = s.blue_; + } + + + void DicomStructureSet::GetReferencedInstances(std::set& instances) + { + for (Structures::const_iterator structure = structures_.begin(); + structure != structures_.end(); ++structure) + { + for (Polygons::const_iterator polygon = structure->polygons_.begin(); + polygon != structure->polygons_.end(); ++polygon) + { + instances.insert(polygon->GetSopInstanceUid()); + } + } + } + + + void DicomStructureSet::AddReferencedSlice(const std::string& sopInstanceUid, + const std::string& seriesInstanceUid, + const CoordinateSystem3D& geometry, + double thickness) + { + if (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()) + { + // This geometry is already known + LOG(ERROR) << "DicomStructureSet::AddReferencedSlice(): (referencedSlices_.find(sopInstanceUid) != referencedSlices_.end()). sopInstanceUid = " << sopInstanceUid; + + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + if (thickness < 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (!referencedSlices_.empty()) + { + const ReferencedSlice& reference = referencedSlices_.begin()->second; + + if (reference.seriesInstanceUid_ != seriesInstanceUid) + { + LOG(ERROR) << "This RT-STRUCT refers to several different series"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (!GeometryToolbox::IsParallel(reference.geometry_.GetNormal(), geometry.GetNormal())) + { + LOG(ERROR) << "The slices in this RT-STRUCT are not parallel"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + referencedSlices_[sopInstanceUid] = ReferencedSlice(seriesInstanceUid, geometry, thickness); + + for (Structures::iterator structure = structures_.begin(); + structure != structures_.end(); ++structure) + { + for (Polygons::iterator polygon = structure->polygons_.begin(); + polygon != structure->polygons_.end(); ++polygon) + { + polygon->UpdateReferencedSlice(referencedSlices_); + } + } + } + } + + + void DicomStructureSet::AddReferencedSlice(const Orthanc::DicomMap& dataset) + { + CoordinateSystem3D slice(dataset); + + double thickness = 1; // 1 mm by default + + std::string s; + Vector v; + if (dataset.LookupStringValue(s, Orthanc::DICOM_TAG_SLICE_THICKNESS, false) && + LinearAlgebra::ParseVector(v, s) && + v.size() > 0) + { + thickness = v[0]; + } + + std::string instance, series; + if (dataset.LookupStringValue(instance, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false) && + dataset.LookupStringValue(series, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + AddReferencedSlice(instance, series, slice, thickness); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void DicomStructureSet::CheckReferencedSlices() + { + for (Structures::iterator structure = structures_.begin(); + structure != structures_.end(); ++structure) + { + for (Polygons::iterator polygon = structure->polygons_.begin(); + polygon != structure->polygons_.end(); ++polygon) + { + if (!polygon->UpdateReferencedSlice(referencedSlices_)) + { + std::string sopInstanceUid = polygon->GetSopInstanceUid(); + if (Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") + { + LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " + << " missing information about referenced instance " + << "(sopInstanceUid is empty!)"; + } + else + { + LOG(ERROR) << "DicomStructureSet::CheckReferencedSlices(): " + << " missing information about referenced instance " + << "(sopInstanceUid = " << sopInstanceUid << ")"; + } + //throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + } + } + + + Vector DicomStructureSet::GetNormal() const + { + if (referencedSlices_.empty()) + { + Vector v; + LinearAlgebra::AssignVector(v, 0, 0, 1); + return v; + } + else + { + return referencedSlices_.begin()->second.geometry_.GetNormal(); + } + } + + bool DicomStructureSet::ProjectStructure( +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + std::vector< std::vector >& polygons, +#else + std::vector< std::pair >& segments, +#endif + const Structure& structure, + const CoordinateSystem3D& sourceSlice) const + { + const CoordinateSystem3D slice = CoordinateSystem3D::NormalizeCuttingPlane(sourceSlice); + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + polygons.clear(); +#else + segments.clear(); +#endif + + Vector normal = GetNormal(); + + bool isOpposite; + if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetNormal())) + { + // This is an axial projection + + for (Polygons::const_iterator polygon = structure.polygons_.begin(); + polygon != structure.polygons_.end(); ++polygon) + { + if (polygon->IsOnSlice(slice)) + { +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + polygons.push_back(std::vector()); + + for (Points::const_iterator p = polygon->GetPoints().begin(); + p != polygon->GetPoints().end(); ++p) + { + double x, y; + slice.ProjectPoint2(x, y, *p); + polygons.back().push_back(Point2D(x, y)); + } +#else + // we need to add all the segments corresponding to this polygon + const std::vector& points3D = polygon->GetPoints(); + if (points3D.size() >= 3) + { + Point2D prev2D; + { + Vector prev = points3D[0]; + double prevX, prevY; + slice.ProjectPoint2(prevX, prevY, prev); + prev2D = Point2D(prevX, prevY); + } + + size_t pointCount = points3D.size(); + for (size_t ipt = 1; ipt < pointCount; ++ipt) + { + Vector next = points3D[ipt]; + double nextX, nextY; + slice.ProjectPoint2(nextX, nextY, next); + Point2D next2D(nextX, nextY); + segments.push_back(std::pair(prev2D, next2D)); + prev2D = next2D; + } + } + else + { + LOG(ERROR) << "Contour with less than 3 points!"; + // !!! + } +#endif + } + } + + return true; + } + else if (GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisX()) || + GeometryToolbox::IsParallelOrOpposite(isOpposite, normal, slice.GetAxisY())) + { +#if 1 + // Sagittal or coronal projection + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + std::vector projected; + + for (Polygons::const_iterator polygon = structure.polygons_.begin(); + polygon != structure.polygons_.end(); ++polygon) + { + double x1, y1, x2, y2; + + if (polygon->Project(x1, y1, x2, y2, slice)) + { + projected.push_back(CreateRectangle(x1, y1, x2, y2)); + } + } +#else + // this will contain the intersection of the polygon slab with + // the cutting plane, projected on the cutting plane coord system + // (that yields a rectangle) + the Z coordinate of the polygon + // (this is required to group polygons with the same Z later) + std::vector > projected; + + for (Polygons::const_iterator polygon = structure.polygons_.begin(); + polygon != structure.polygons_.end(); ++polygon) + { + double x1, y1, x2, y2; + + if (polygon->Project(x1, y1, x2, y2, slice)) + { + double curZ = polygon->GetGeometryOrigin()[2]; + + // x1,y1 and x2,y2 are in "slice" coordinates (the cutting plane + // geometry) + projected.push_back(std::make_pair(CreateRectangle( + static_cast(x1), + static_cast(y1), + static_cast(x2), + static_cast(y2)),curZ)); + } + } +#endif + +#if USE_BOOST_UNION_FOR_POLYGONS != 1 + // projected contains a set of rectangles specified by two opposite + // corners (x1,y1,x2,y2) + // we need to merge them + // each slab yields ONE polygon! + + // we need to sorted all the rectangles that originate from the same Z + // into lanes. To make sure they are grouped together in the array, we + // sort it. + std::sort(projected.begin(), projected.end(), CompareRectanglesForProjection); + + std::vector rectanglesForEachSlab; + rectanglesForEachSlab.reserve(projected.size()); + + double curZ = 0; + for (size_t i = 0; i < projected.size(); ++i) + { +#if 0 + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); +#else + if (i == 0) + { + curZ = projected[i].second; + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + } + else + { + // this check is needed to prevent creating a new slab if + // the new polygon is at the same Z coord than last one + if (!LinearAlgebra::IsNear(curZ, projected[i].second)) + { + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + curZ = projected[i].second; + } + } +#endif + + rectanglesForEachSlab.back().push_back(projected[i].first); + + // as long as they have the same y, we should put them into the same lane + // BUT in Sebastien's code, there is only one polygon per lane. + + //std::cout << "rect: xmin = " << rect.xmin << " xmax = " << rect.xmax << " ymin = " << rect.ymin << " ymax = " << rect.ymax << std::endl; + } + + // now we need to sort the slabs in increasing Y order (see ConvertListOfSlabsToSegments) + std::sort(rectanglesForEachSlab.begin(), rectanglesForEachSlab.end(), CompareSlabsY); + + ConvertListOfSlabsToSegments(segments, rectanglesForEachSlab, projected.size()); +#else + BoostMultiPolygon merged; + Union(merged, projected); + + polygons.resize(merged.size()); + for (size_t i = 0; i < merged.size(); i++) + { + const std::vector& outer = merged[i].outer(); + + polygons[i].resize(outer.size()); + for (size_t j = 0; j < outer.size(); j++) + { + polygons[i][j] = Point2D(outer[j].x(), outer[j].y()); + } + } +#endif + +#else + for (Polygons::iterator polygon = structure.polygons_.begin(); + polygon != structure.polygons_.end(); ++polygon) + { + double x1, y1, x2, y2; + if (polygon->Project(x1, y1, x2, y2, slice)) + { + std::vector p(4); + p[0] = std::make_pair(x1, y1); + p[1] = std::make_pair(x2, y1); + p[2] = std::make_pair(x2, y2); + p[3] = std::make_pair(x1, y2); + polygons.push_back(p); + } + } +#endif + + return true; + } + else + { + return false; + } + } + + + void DicomStructureSet::ProjectOntoLayer(PolylineSceneLayer& layer, + const CoordinateSystem3D& plane, + size_t structureIndex, + const Color& color) const + { +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + std::vector< std::vector > polygons; + if (ProjectStructure(polygons, structureIndex, plane)) + { + for (size_t j = 0; j < polygons.size(); j++) + { + std::vector chain; + chain.reserve(polygons[j].size()); + + for (size_t k = 0; k < polygons[j].size(); k++) + { + chain.push_back(ScenePoint2D(polygons[j][k].x, polygons[j][k].y)); + } + + layer.AddChain(chain, true, color.GetRed(), color.GetGreen(), color.GetBlue()); + } + } + +#else + std::vector< std::pair > segments; + + if (ProjectStructure(segments, structureIndex, plane)) + { + for (size_t j = 0; j < segments.size(); j++) + { + std::vector chain(2); + chain[0] = ScenePoint2D(segments[j].first.x, segments[j].first.y); + chain[1] = ScenePoint2D(segments[j].second.x, segments[j].second.y); + layer.AddChain(chain, false, color.GetRed(), color.GetGreen(), color.GetBlue()); + } + } +#endif + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSet.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,236 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../OrthancStone.h" + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error The macro ORTHANC_ENABLE_DCMTK must be defined +#endif + +#include "DicomStructureSetUtils.h" +#include "CoordinateSystem3D.h" +#include "Extent2D.h" +#include "OrthancDatasets/FullOrthancDataset.h" +#include "../Scene2D/Color.h" +#include "../Scene2D/PolylineSceneLayer.h" + +#if ORTHANC_ENABLE_DCMTK == 1 +# include +#endif + +//#define USE_BOOST_UNION_FOR_POLYGONS 1 + + +#include + +namespace OrthancStone +{ + class DicomStructureSet : public boost::noncopyable + { + private: + struct ReferencedSlice + { + std::string seriesInstanceUid_; + CoordinateSystem3D geometry_; + double thickness_; + + ReferencedSlice() + { + } + + ReferencedSlice(const std::string& seriesInstanceUid, + const CoordinateSystem3D& geometry, + double thickness) : + seriesInstanceUid_(seriesInstanceUid), + geometry_(geometry), + thickness_(thickness) + { + } + }; + + typedef std::map ReferencedSlices; + + typedef std::vector Points; + + class Polygon + { + private: + std::string sopInstanceUid_; + bool hasSlice_; + CoordinateSystem3D geometry_; + double projectionAlongNormal_; + double sliceThickness_; // In millimeters + Points points_; + Extent2D extent_; + + void CheckPointIsOnSlice(const Vector& v) const; + bool IsPointOnSliceIfAny(const Vector& v) const; + + public: + Polygon(const std::string& sopInstanceUid) : + sopInstanceUid_(sopInstanceUid), + hasSlice_(false) + { + } + + void Reserve(size_t n) + { + points_.reserve(n); + } + + void AddPoint(const Vector& v); + + bool UpdateReferencedSlice(const ReferencedSlices& slices); + + bool IsOnSlice(const CoordinateSystem3D& geometry) const; + + const Vector& GetGeometryOrigin() const + { + return geometry_.GetOrigin(); + } + + const std::string& GetSopInstanceUid() const + { + return sopInstanceUid_; + } + + const Points& GetPoints() const + { + return points_; + } + + double GetSliceThickness() const + { + return sliceThickness_; + } + + bool Project(double& x1, + double& y1, + double& x2, + double& y2, + const CoordinateSystem3D& slice) const; + }; + + typedef std::list Polygons; + + struct Structure + { + std::string name_; + std::string interpretation_; + Polygons polygons_; + uint8_t red_; + uint8_t green_; + uint8_t blue_; + }; + + typedef std::vector Structures; + + Structures structures_; + ReferencedSlices referencedSlices_; + + void Setup(const IDicomDataset& dataset); + + const Structure& GetStructure(size_t index) const; + + Structure& GetStructure(size_t index); + + bool ProjectStructure( +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + std::vector< std::vector >& polygons, +#else + std::vector< std::pair >& segments, +#endif + const Structure& structure, + const CoordinateSystem3D& slice) const; + + public: + DicomStructureSet(const FullOrthancDataset& instance) + { + Setup(instance); + } + +#if ORTHANC_ENABLE_DCMTK == 1 + DicomStructureSet(Orthanc::ParsedDicomFile& instance); +#endif + + size_t GetStructuresCount() const + { + return structures_.size(); + } + + Vector GetStructureCenter(size_t index) const; + + const std::string& GetStructureName(size_t index) const; + + const std::string& GetStructureInterpretation(size_t index) const; + + Color GetStructureColor(size_t index) const; + + // TODO - remove + void GetStructureColor(uint8_t& red, + uint8_t& green, + uint8_t& blue, + size_t index) const; + + void GetReferencedInstances(std::set& instances); + + void AddReferencedSlice(const std::string& sopInstanceUid, + const std::string& seriesInstanceUid, + const CoordinateSystem3D& geometry, + double thickness); + + void AddReferencedSlice(const Orthanc::DicomMap& dataset); + + void CheckReferencedSlices(); + + Vector GetNormal() const; + +#if USE_BOOST_UNION_FOR_POLYGONS == 1 + bool ProjectStructure(std::vector< std::vector >& polygons, + size_t index, + const CoordinateSystem3D& slice) const + { + return ProjectStructure(polygons, GetStructure(index), slice); + } +#else + bool ProjectStructure(std::vector< std::pair >& segments, + size_t index, + const CoordinateSystem3D& slice) const + { + return ProjectStructure(segments, GetStructure(index), slice); + } +#endif + + void ProjectOntoLayer(PolylineSceneLayer& layer, + const CoordinateSystem3D& plane, + size_t structureIndex, + const Color& color) const; + + void ProjectOntoLayer(PolylineSceneLayer& layer, + const CoordinateSystem3D& plane, + size_t structureIndex) const + { + ProjectOntoLayer(layer, plane, structureIndex, GetStructureColor(structureIndex)); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSet2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSet2.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,311 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructureSet2.h" + +#include "../Toolbox/LinearAlgebra.h" +#include "../StoneException.h" + +#include +#include +#include +#include + +#include +#include + +namespace OrthancStone +{ + static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_GEOMETRIC_TYPE(0x3006, 0x0042); + static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_IMAGE_SEQUENCE(0x3006, 0x0016); + static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_SEQUENCE(0x3006, 0x0040); + static const OrthancPlugins::DicomTag DICOM_TAG_CONTOUR_DATA(0x3006, 0x0050); + static const OrthancPlugins::DicomTag DICOM_TAG_NUMBER_OF_CONTOUR_POINTS(0x3006, 0x0046); + static const OrthancPlugins::DicomTag DICOM_TAG_REFERENCED_SOP_INSTANCE_UID(0x0008, 0x1155); + static const OrthancPlugins::DicomTag DICOM_TAG_ROI_CONTOUR_SEQUENCE(0x3006, 0x0039); + static const OrthancPlugins::DicomTag DICOM_TAG_ROI_DISPLAY_COLOR(0x3006, 0x002a); + static const OrthancPlugins::DicomTag DICOM_TAG_ROI_NAME(0x3006, 0x0026); + static const OrthancPlugins::DicomTag DICOM_TAG_RT_ROI_INTERPRETED_TYPE(0x3006, 0x00a4); + static const OrthancPlugins::DicomTag DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE(0x3006, 0x0080); + static const OrthancPlugins::DicomTag DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE(0x3006, 0x0020); + + static inline uint8_t ConvertAndClipToByte(double v) + { + if (v < 0) + { + return 0; + } + else if (v >= 255) + { + return 255; + } + else + { + return static_cast(v); + } + } + + static bool ReadDicomToVector(Vector& target, + const OrthancPlugins::IDicomDataset& dataset, + const OrthancPlugins::DicomPath& tag) + { + std::string value; + return (dataset.GetStringValue(value, tag) && + LinearAlgebra::ParseVector(target, value)); + } + + + void DicomPathToString(std::string& s, const OrthancPlugins::DicomPath& dicomPath) + { + std::stringstream tmp; + for (size_t i = 0; i < dicomPath.GetPrefixLength(); ++i) + { + OrthancPlugins::DicomTag tag = dicomPath.GetPrefixTag(i); + + // We use this other object to be able to use GetMainTagsName + // and Format + Orthanc::DicomTag tag2(tag.GetGroup(), tag.GetElement()); + size_t index = dicomPath.GetPrefixIndex(i); + tmp << tag2.GetMainTagsName() << " (" << tag2.Format() << ") [" << index << "] / "; + } + const OrthancPlugins::DicomTag& tag = dicomPath.GetFinalTag(); + Orthanc::DicomTag tag2(tag.GetGroup(), tag.GetElement()); + tmp << tag2.GetMainTagsName() << " (" << tag2.Format() << ")"; + s = tmp.str(); + } + + std::ostream& operator<<(std::ostream& s, const OrthancPlugins::DicomPath& dicomPath) + { + std::string tmp; + DicomPathToString(tmp, dicomPath); + s << tmp; + return s; + } + + + DicomStructureSet2::DicomStructureSet2() + { + + } + + + DicomStructureSet2::~DicomStructureSet2() + { + + } + + void DicomStructureSet2::SetContents(const OrthancPlugins::FullOrthancDataset& tags) + { + FillStructuresFromDataset(tags); + ComputeDependentProperties(); + } + + void DicomStructureSet2::ComputeDependentProperties() + { + for (size_t i = 0; i < structures_.size(); ++i) + { + structures_[i].ComputeDependentProperties(); + } + } + + void DicomStructureSet2::FillStructuresFromDataset(const OrthancPlugins::FullOrthancDataset& tags) + { + OrthancPlugins::DicomDatasetReader reader(tags); + + // a few sanity checks + size_t count = 0, tmp = 0; + + // DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE (0x3006, 0x0080); + // DICOM_TAG_ROI_CONTOUR_SEQUENCE (0x3006, 0x0039); + // DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE (0x3006, 0x0020); + if (!tags.GetSequenceSize(count, DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE) || + !tags.GetSequenceSize(tmp, DICOM_TAG_ROI_CONTOUR_SEQUENCE) || + tmp != count || + !tags.GetSequenceSize(tmp, DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE) || + tmp != count) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + // let's now parse the structures stored in the dicom file + // DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE (0x3006, 0x0080) + // DICOM_TAG_RT_ROI_INTERPRETED_TYPE (0x3006, 0x00a4) + // DICOM_TAG_ROI_DISPLAY_COLOR (0x3006, 0x002a) + // DICOM_TAG_ROI_NAME (0x3006, 0x0026) + structures_.resize(count); + for (size_t i = 0; i < count; i++) + { + // (0x3006, 0x0080)[i]/(0x3006, 0x00a4) + structures_[i].interpretation_ = reader.GetStringValue + (OrthancPlugins::DicomPath(DICOM_TAG_RT_ROI_OBSERVATIONS_SEQUENCE, i, + DICOM_TAG_RT_ROI_INTERPRETED_TYPE), + "No interpretation"); + + // (0x3006, 0x0020)[i]/(0x3006, 0x0026) + structures_[i].name_ = reader.GetStringValue + (OrthancPlugins::DicomPath(DICOM_TAG_STRUCTURE_SET_ROI_SEQUENCE, i, + DICOM_TAG_ROI_NAME), + "No name"); + + Vector color; + // (0x3006, 0x0039)[i]/(0x3006, 0x002a) + if (ReadDicomToVector(color, tags, OrthancPlugins::DicomPath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, DICOM_TAG_ROI_DISPLAY_COLOR)) + && color.size() == 3) + { + structures_[i].red_ = ConvertAndClipToByte(color[0]); + structures_[i].green_ = ConvertAndClipToByte(color[1]); + structures_[i].blue_ = ConvertAndClipToByte(color[2]); + } + else + { + structures_[i].red_ = 255; + structures_[i].green_ = 0; + structures_[i].blue_ = 0; + } + + size_t countSlices; + // DICOM_TAG_ROI_CONTOUR_SEQUENCE (0x3006, 0x0039); + // DICOM_TAG_CONTOUR_SEQUENCE (0x3006, 0x0040); + if (!tags.GetSequenceSize(countSlices, OrthancPlugins::DicomPath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, DICOM_TAG_CONTOUR_SEQUENCE))) + { + LOG(WARNING) << "DicomStructureSet2::SetContents | structure \"" << structures_[i].name_ << "\" has no slices!"; + countSlices = 0; + } + + LOG(INFO) << "New RT structure: \"" << structures_[i].name_ + << "\" with interpretation \"" << structures_[i].interpretation_ + << "\" containing " << countSlices << " slices (color: " + << static_cast(structures_[i].red_) << "," + << static_cast(structures_[i].green_) << "," + << static_cast(structures_[i].blue_) << ")"; + + // These temporary variables avoid allocating many vectors in the loop below + + // (0x3006, 0x0039)[i]/(0x3006, 0x0040)[0]/(0x3006, 0x0046) + OrthancPlugins::DicomPath countPointsPath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_NUMBER_OF_CONTOUR_POINTS); + + OrthancPlugins::DicomPath geometricTypePath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_GEOMETRIC_TYPE); + + OrthancPlugins::DicomPath imageSequencePath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_IMAGE_SEQUENCE); + + // (3006,0039)[i] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155) + OrthancPlugins::DicomPath referencedInstancePath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_IMAGE_SEQUENCE, 0, + DICOM_TAG_REFERENCED_SOP_INSTANCE_UID); + + OrthancPlugins::DicomPath contourDataPath( + DICOM_TAG_ROI_CONTOUR_SEQUENCE, i, + DICOM_TAG_CONTOUR_SEQUENCE, 0, + DICOM_TAG_CONTOUR_DATA); + + for (size_t j = 0; j < countSlices; j++) + { + unsigned int countPoints = 0; + + countPointsPath.SetPrefixIndex(1, j); + if (!reader.GetUnsignedIntegerValue(countPoints, countPointsPath)) + { + std::string s; + DicomPathToString(s, countPointsPath); + LOG(ERROR) << "Dicom path " << s << " is not valid (should contain an unsigned integer)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + //LOG(INFO) << "Parsing slice containing " << countPoints << " vertices"; + + geometricTypePath.SetPrefixIndex(1, j); + std::string type = reader.GetMandatoryStringValue(geometricTypePath); + if (type != "CLOSED_PLANAR") + { + // TODO: support points!! + LOG(WARNING) << "Ignoring contour with geometry type: " << type; + continue; + } + + size_t size = 0; + + imageSequencePath.SetPrefixIndex(1, j); + if (!tags.GetSequenceSize(size, imageSequencePath) || size != 1) + { + LOG(ERROR) << "The ContourImageSequence sequence (tag 3006,0016) must be present and contain one entry."; + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + referencedInstancePath.SetPrefixIndex(1, j); + std::string sopInstanceUid = reader.GetMandatoryStringValue(referencedInstancePath); + + contourDataPath.SetPrefixIndex(1, j); + std::string slicesData = reader.GetMandatoryStringValue(contourDataPath); + + Vector points; + if (!LinearAlgebra::ParseVector(points, slicesData) || + points.size() != 3 * countPoints) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + // seen in real world + if (Orthanc::Toolbox::StripSpaces(sopInstanceUid) == "") + { + LOG(ERROR) << "WARNING. The following Dicom tag (Referenced SOP Instance UID) contains an empty value : // (3006,0039)[" << i << "] / (0x3006, 0x0040)[0] / (0x3006, 0x0016)[0] / (0x0008, 0x1155)"; + } + + DicomStructurePolygon2 polygon(sopInstanceUid,type); + polygon.Reserve(countPoints); + + for (size_t k = 0; k < countPoints; k++) + { + Vector v(3); + v[0] = points[3 * k]; + v[1] = points[3 * k + 1]; + v[2] = points[3 * k + 2]; + polygon.AddPoint(v); + } + structures_[i].AddPolygon(polygon); + } + } + } + + + void DicomStructureSet2::Clear() + { + structures_.clear(); + } + +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSet2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSet2.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,71 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructure2.h" +#include "CoordinateSystem3D.h" +#include "Extent2D.h" +#include "../Scene2D/Color.h" + +#include + +#include + +namespace OrthancStone +{ + class DicomStructureSet2 : public boost::noncopyable + { + public: + DicomStructureSet2(); + ~DicomStructureSet2(); + + void SetContents(const OrthancPlugins::FullOrthancDataset& tags); + + size_t GetStructuresCount() const + { + return structures_.size(); + } + + void Clear(); + + const DicomStructure2& GetStructure(size_t i) const + { + // at() is like []() but with range check + return structures_.at(i); + } + + /** Internal use only */ + void FillStructuresFromDataset(const OrthancPlugins::FullOrthancDataset& tags); + + /** Internal use only */ + void ComputeDependentProperties(); + + /** Internal use only */ + std::vector structures_; + }; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSetUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSetUtils.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,276 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "DicomStructureSetUtils.h" + +namespace OrthancStone +{ + +#if 0 + void DicomStructure2::PartitionRectangleList(std::vector< std::vector > & sets, const std::vector slabCuts) + { + // map position ( )--> disjoint set index + std::map, size_t> posToIndex; + + // disjoint set index --> position + std::map > indexToPos; + + size_t nextIndex = 0; + for (size_t i = 0; i < slabCuts.size(); ++i) + { + for (size_t j = 0; j < slabCuts[i].size(); ++j) + { + std::pair pos(i, j); + posToIndex = nextIndex; + indexToPos = pos; + } + } + // nextIndex is now the total rectangle count + DisjointDataSet ds(nextIndex); + + // we loop on all slabs (except the last one) and we connect all rectangles + if (slabCuts.size() < 2) + { +#error write special case + } + else + { + for (size_t i = 0; i < slabCuts.size() - 1; ++i) + { + for (size_t j = 0; j < slabCuts[i].size(); ++j) + { + const RtStructRectangleInSlab& r1 = slabCuts[i][j]; + const size_t r1i = posToIndex(std::pair(i, j)); + for (size_t k = 0; k < slabCuts[i + 1].size(); ++k) + { + const RtStructRectangleInSlab& r2 = slabCuts[i + 1][k]; + const size_t r2i = posToIndex(std::pair(i, j)); + // rect.xmin <= rectBottom.xmax && rectBottom.xmin <= rect.xmax + if ((r1.xmin <= r2.xmax) && (r2.xmin <= r1.xmax)) + { +#error now go! + } + + } + } + } + } +#endif + + /* + + compute list of segments : + + numberOfRectsFromHereOn = 0 + possibleNext = {in_k,in_kplus1} + + for all boundaries: + - we create a vertical segment and we push it + - if boundary is a start, numberOfRectsFromHereOn += 1. + - if we switch from 0 to 1, we start a segment + - if we switch from 1 to 2, we end the current segment and we record it + - if boundary is an end, numberOfRectsFromHereOn -= 1. + - if we switch from 1 to 0, we end the current segment and we record it + - if we switch from 2 to 1, we start a segment + */ + + // static + void AddSlabBoundaries( + std::vector > & boundaries, + const std::vector & slabCuts, size_t iSlab) + { + if (iSlab < slabCuts.size()) + { + const RtStructRectanglesInSlab& slab = slabCuts[iSlab]; + for (size_t iRect = 0; iRect < slab.size(); ++iRect) + { + const RtStructRectangleInSlab& rect = slab[iRect]; + { + std::pair boundary(rect.xmin, RectangleBoundaryKind_Start); + boundaries.insert(std::lower_bound(boundaries.begin(), boundaries.end(), boundary), boundary); + } + { + std::pair boundary(rect.xmax, RectangleBoundaryKind_End); + boundaries.insert(std::lower_bound(boundaries.begin(), boundaries.end(), boundary), boundary); + } + } + } + } + + // static + void ProcessBoundaryList( + std::vector< std::pair > & segments, + const std::vector > & boundaries, + double y) + { + Point2D start; + Point2D end; + int curNumberOfSegments = 0; // we count the number of segments. we only draw if it is 1 (not 0 or 2) + for (size_t i = 0; i < boundaries.size(); ++i) + { + switch (boundaries[i].second) + { + case RectangleBoundaryKind_Start: + curNumberOfSegments += 1; + switch (curNumberOfSegments) + { + case 0: + assert(false); + break; + case 1: + // a new segment has begun! + start.x = boundaries[i].first; + start.y = y; + break; + case 2: + // an extra segment has begun : stop the current one (we don't draw overlaps) + end.x = boundaries[i].first; + end.y = y; + segments.push_back(std::pair(start, end)); + break; + default: + //assert(false); // seen IRL ! + break; + } + break; + case RectangleBoundaryKind_End: + curNumberOfSegments -= 1; + switch (curNumberOfSegments) + { + case 0: + // a lone (thus active) segment has ended. + end.x = boundaries[i].first; + end.y = y; + segments.push_back(std::pair(start, end)); + break; + case 1: + // an extra segment has ended : start a new one one + start.x = boundaries[i].first; + start.y = y; + break; + default: + // this should not happen! + //assert(false); + break; + } + break; + default: + assert(false); + break; + } + } + } + +#if 0 + void ConvertListOfSlabsToSegments( + std::vector< std::pair >& segments, + const std::vector& slabCuts, + const size_t totalRectCount) + { +#error to delete + } +#else + // See https://www.dropbox.com/s/bllco6q8aazxk44/2019-09-18-rtstruct-cut-algorithm-rect-merge.png + void ConvertListOfSlabsToSegments( + std::vector< std::pair > & segments, + const std::vector & slabCuts, + const size_t totalRectCount) + { + if (slabCuts.size() == 0) + return; + + if (totalRectCount > 0) + segments.reserve(4 * totalRectCount); // worst case, but common. + + /* + VERTICAL + */ + for (size_t iSlab = 0; iSlab < slabCuts.size(); ++iSlab) + { + for (size_t iRect = 0; iRect < slabCuts[iSlab].size(); ++iRect) + { + const RtStructRectangleInSlab& rect = slabCuts[iSlab][iRect]; + { + Point2D p1(rect.xmin, rect.ymin); + Point2D p2(rect.xmin, rect.ymax); + segments.push_back(std::pair(p1, p2)); + } + { + Point2D p1(rect.xmax, rect.ymin); + Point2D p2(rect.xmax, rect.ymax); + segments.push_back(std::pair(p1, p2)); + } + } + } + + /* + HORIZONTAL + */ + + // if we have N slabs, we have N+1 potential vertical positions for horizontal segments + // - one for top of slab 0 + // - N-1 for all positions between two slabs + // - one for bottom of slab N-1 + + // this adds all the horizontal segments for the tops of 3the rectangles + // in row 0 + if (slabCuts[0].size() > 0) + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, 0); + + ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); + } + + // this adds all the horizontal segments belonging to two slabs + for (size_t iSlab = 0; iSlab < slabCuts.size() - 1; ++iSlab) + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, iSlab); + AddSlabBoundaries(boundaries, slabCuts, iSlab + 1); + double curY = 0; + if (slabCuts[iSlab].size() > 0) + { + curY = slabCuts[iSlab][0].ymax; + ProcessBoundaryList(segments, boundaries, curY); + } + else if (slabCuts[iSlab + 1].size() > 0) + { + curY = slabCuts[iSlab + 1][0].ymin; + ProcessBoundaryList(segments, boundaries, curY); + } + else + { + // nothing to do!! : both slab lists are empty! + } + } + + // this adds all the horizontal segments for the BOTTOM of the rectangles + // on last row + if (slabCuts[slabCuts.size() - 1].size() > 0) + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, slabCuts.size() - 1); + + ProcessBoundaryList(segments, boundaries, slabCuts[slabCuts.size() - 1][0].ymax); + } + } +#endif + } diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DicomStructureSetUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DicomStructureSetUtils.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,84 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include + +#include "../Toolbox/LinearAlgebra.h" + +namespace OrthancStone +{ +#if 0 + struct Point3D + { + Point3D(double x, double y, double z) : x(x), y(y), z(z) {} + Point3D() : x(0), y(0), z(0) {} + double x, y, z; + }; + + struct Vector3D + { + Vector3D(double x, double y, double z) : x(x), y(y), z(z) {} + Vector3D() : x(0), y(0), z(0) {} + double x, y, z; + }; +#else + typedef Vector Vector3D; + typedef Vector Point3D; +#endif + + struct Point2D + { + Point2D(double x, double y) : x(x), y(y) {} + Point2D() : x(0), y(0) {} + double x, y; + }; + + + /** Internal */ + struct RtStructRectangleInSlab + { + double xmin, xmax, ymin, ymax; + }; + typedef std::vector RtStructRectanglesInSlab; + + enum RectangleBoundaryKind + { + RectangleBoundaryKind_Start, + RectangleBoundaryKind_End + }; + +#if 0 + /** Internal */ + void PartitionRectangleList(std::vector< std::vector > & sets, const std::vector); +#endif + + /** Internal */ + void ConvertListOfSlabsToSegments(std::vector< std::pair >& segments, const std::vector& slabCuts, const size_t totalRectCount); + + /** Internal */ + void AddSlabBoundaries(std::vector >& boundaries, const std::vector& slabCuts, size_t iSlab); + + /** Internal */ + void ProcessBoundaryList(std::vector< std::pair >& segments, const std::vector >& boundaries, double y); + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DisjointDataSet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DisjointDataSet.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,144 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include + +#include "../StoneException.h" + +namespace OrthancStone +{ + class DisjointDataSet + { + public: + DisjointDataSet(size_t itemCount) : + parents_(itemCount), + ranks_(itemCount) + { + for (size_t index = 0; index < parents_.size(); index++) + { + SetParent(index,index); + ranks_[index] = 1; + } + } + + size_t Find(size_t item) + { + /* + If parents_[i] == i, it means i is representative of a set. + Otherwise, we go up the tree... + */ + if (GetParent(item) != item) + { + // if item is not a top item (representative of its set), + // we use path compression to improve future lookups + // see: https://en.wikipedia.org/wiki/Disjoint-set_data_structure#Path_compression + SetParent(item, Find(parents_[item])); + } + + // now that paths have been compressed, we are positively certain + // that item's parent is a set ("X is a set" means that X is the + // representative of a set) + return GetParent(item); + } + + /* + This merge the two sets that contains itemA and itemB + */ + void Union(size_t itemA, size_t itemB) + { + // Find current sets of x and y + size_t setA = Find(itemA); + size_t setB = Find(itemB); + + // if setA == setB, it means they are already in the same set and + // do not need to be merged! + if (setA != setB) + { + // we need to merge the sets, which means that the trees representing + // the sets needs to be merged (there must be a single top parent to + // all the items originally belonging to setA and setB must be the same) + + // since the algorithm speed is inversely proportional to the tree + // height (the rank), we need to combine trees in a way that + // minimizes this rank. See "Union by rank" at + // https://en.wikipedia.org/wiki/Disjoint-set_data_structure#by_rank + if (GetRank(setA) < GetRank(setB)) + { + SetParent(setA, setB); + } + else if (GetRank(setA) > GetRank(setB)) + { + SetParent(setB, setA); + } + else + { + SetParent(setB, setA); + BumpRank(setA); + // the trees had the same height but we attached the whole of setB + // under setA (under its parent), so the resulting tree is now + // 1 higher. setB is NOT representative of a set anymore. + } + } + } + + private: + size_t GetRank(size_t i) const + { + ORTHANC_ASSERT(i < ranks_.size()); + ORTHANC_ASSERT(ranks_.size() == parents_.size()); + return ranks_[i]; + } + + size_t GetParent(size_t i) const + { + ORTHANC_ASSERT(i < parents_.size()); + ORTHANC_ASSERT(ranks_.size() == parents_.size()); + return parents_[i]; + } + + void SetParent(size_t i, size_t parent) + { + ORTHANC_ASSERT(i < parents_.size()); + ORTHANC_ASSERT(ranks_.size() == parents_.size()); + parents_[i] = parent; + } + + void BumpRank(size_t i) + { + ORTHANC_ASSERT(i < ranks_.size()); + ORTHANC_ASSERT(ranks_.size() == parents_.size()); + ranks_[i] = ranks_[i] + 1u; + } + + /* + This vector contains the direct parent of each item + */ + std::vector parents_; + + /* + This vector contains the tree height of each set. The values in the + vector for non-representative items is UNDEFINED! + */ + std::vector ranks_; + }; + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DynamicBitmap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DynamicBitmap.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,37 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DynamicBitmap.h" + +#include +#include + +namespace OrthancStone +{ + DynamicBitmap::DynamicBitmap(const Orthanc::ImageAccessor& bitmap) : + bitmap_(Orthanc::Image::Clone(bitmap)) + { + if (bitmap_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/DynamicBitmap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/DynamicBitmap.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,45 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include +#include + +#include + +namespace OrthancStone +{ + class DynamicBitmap : public Orthanc::IDynamicObject + { + private: + std::unique_ptr bitmap_; + + public: + DynamicBitmap(const Orthanc::ImageAccessor& bitmap); + + const Orthanc::ImageAccessor& GetBitmap() const + { + return *bitmap_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/Extent2D.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/Extent2D.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,139 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "Extent2D.h" + +#include +#include +#include + +namespace OrthancStone +{ + Extent2D::Extent2D(double x1, + double y1, + double x2, + double y2) : + empty_(false), + x1_(x1), + y1_(y1), + x2_(x2), + y2_(y2) + { + if (x1_ > x2_) + { + std::swap(x1_, x2_); + } + + if (y1_ > y2_) + { + std::swap(y1_, y2_); + } + } + + + void Extent2D::Reset() + { + empty_ = true; + x1_ = 0; + y1_ = 0; + x2_ = 0; + y2_ = 0; + } + + void Extent2D::AddPoint(double x, + double y) + { + if (empty_) + { + x1_ = x; + y1_ = y; + x2_ = x; + y2_ = y; + empty_ = false; + } + else + { + x1_ = std::min(x1_, x); + y1_ = std::min(y1_, y); + x2_ = std::max(x2_, x); + y2_ = std::max(y2_, y); + } + + assert(x1_ <= x2_ && + y1_ <= y2_); // This is the invariant of the structure + } + + + void Extent2D::Union(const Extent2D& other) + { + if (other.empty_) + { + return; + } + + if (empty_) + { + *this = other; + return; + } + + assert(!empty_); + + x1_ = std::min(x1_, other.x1_); + y1_ = std::min(y1_, other.y1_); + x2_ = std::max(x2_, other.x2_); + y2_ = std::max(y2_, other.y2_); + + assert(x1_ <= x2_ && + y1_ <= y2_); // This is the invariant of the structure + } + + + bool Extent2D::IsEmpty() const + { + if (empty_) + { + return true; + } + else + { + assert(x1_ <= x2_ && + y1_ <= y2_); + return (x2_ <= x1_ + 10 * std::numeric_limits::epsilon() || + y2_ <= y1_ + 10 * std::numeric_limits::epsilon()); + } + } + + + bool Extent2D::Contains(double x, + double y) const + { + if (empty_) + { + return false; + } + else + { + return (x >= x1_ && x <= x2_ && + y >= y1_ && y <= y2_); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/Extent2D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/Extent2D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,98 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +namespace OrthancStone +{ + class Extent2D + { + private: + bool empty_; + double x1_; + double y1_; + double x2_; + double y2_; + + public: + Extent2D() + { + Reset(); + } + + Extent2D(double x1, + double y1, + double x2, + double y2); + + void Reset(); + + void AddPoint(double x, + double y); + + void Union(const Extent2D& other); + + bool IsEmpty() const; + + double GetX1() const + { + return x1_; + } + + double GetY1() const + { + return y1_; + } + + double GetX2() const + { + return x2_; + } + + double GetY2() const + { + return y2_; + } + + double GetWidth() const + { + return x2_ - x1_; + } + + double GetHeight() const + { + return y2_ - y1_; + } + + double GetCenterX() const + { + return (x1_ + x2_) / 2.0; + } + + double GetCenterY() const + { + return (y1_ + y2_) / 2.0; + } + + bool Contains(double x, + double y) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/FiniteProjectiveCamera.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/FiniteProjectiveCamera.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,461 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "FiniteProjectiveCamera.h" + +#include "GeometryToolbox.h" +#include "SubpixelReader.h" + +#include +#include +#include +#include + +namespace OrthancStone +{ + void FiniteProjectiveCamera::ComputeMInverse() + { + using namespace boost::numeric::ublas; + + // inv(M) = inv(K * R) = inv(R) * inv(K) = R' * inv(K). This + // matrix is always invertible, by definition of finite + // projective cameras (page 157). + Matrix kinv; + LinearAlgebra::InvertUpperTriangularMatrix(kinv, k_); + minv_ = prod(trans(r_), kinv); + } + + + void FiniteProjectiveCamera::Setup(const Matrix& k, + const Matrix& r, + const Vector& c) + { + if (k.size1() != 3 || + k.size2() != 3 || + !LinearAlgebra::IsCloseToZero(k(1, 0)) || + !LinearAlgebra::IsCloseToZero(k(2, 0)) || + !LinearAlgebra::IsCloseToZero(k(2, 1))) + { + LOG(ERROR) << "Invalid intrinsic parameters"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (r.size1() != 3 || + r.size2() != 3) + { + LOG(ERROR) << "Invalid size for a 3D rotation matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (!LinearAlgebra::IsRotationMatrix(r, 100.0 * std::numeric_limits::epsilon())) + { + LOG(ERROR) << "Invalid rotation matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (c.size() != 3) + { + LOG(ERROR) << "Invalid camera center"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + k_ = k; + r_ = r; + c_ = c; + + ComputeMInverse(); + + Matrix tmp = LinearAlgebra::IdentityMatrix(3); + tmp.resize(3, 4); + tmp(0, 3) = -c[0]; + tmp(1, 3) = -c[1]; + tmp(2, 3) = -c[2]; + + p_ = LinearAlgebra::Product(k, r, tmp); + + assert(p_.size1() == 3 && + p_.size2() == 4); + + } + + + void FiniteProjectiveCamera::Setup(const Matrix& p) + { + if (p.size1() != 3 || + p.size2() != 4) + { + LOG(ERROR) << "Invalid camera matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + p_ = p; + + // M is the left 3x3 submatrix of "P" + Matrix m = p; + m.resize(3, 3); + + // p4 is the last column of "P" + Vector p4(3); + p4[0] = p(0, 3); + p4[1] = p(1, 3); + p4[2] = p(2, 3); + + // The RQ decomposition is explained on page 157 + LinearAlgebra::RQDecomposition3x3(k_, r_, m); + ComputeMInverse(); + + c_ = LinearAlgebra::Product(-minv_, p4); + } + + + FiniteProjectiveCamera::FiniteProjectiveCamera(const double k[9], + const double r[9], + const double c[3]) + { + Matrix kk, rr; + Vector cc; + + LinearAlgebra::FillMatrix(kk, 3, 3, k); + LinearAlgebra::FillMatrix(rr, 3, 3, r); + LinearAlgebra::FillVector(cc, 3, c); + + Setup(kk, rr, cc); + } + + + FiniteProjectiveCamera::FiniteProjectiveCamera(const double p[12]) + { + Matrix pp; + LinearAlgebra::FillMatrix(pp, 3, 4, p); + Setup(pp); + } + + + Vector FiniteProjectiveCamera::GetRayDirection(double x, + double y) const + { + // This derives from Equation (6.14) on page 162, taking "mu = + // 1" and noticing that "-inv(M)*p4" corresponds to the camera + // center in finite projective cameras + + // The (x,y) coordinates on the imaged plane, as an homogeneous vector + Vector xx(3); + xx[0] = x; + xx[1] = y; + xx[2] = 1.0; + + return boost::numeric::ublas::prod(minv_, xx); + } + + + + static Vector SetupApply(const Vector& v, + bool infinityAllowed) + { + if (v.size() == 3) + { + // Vector "v" in non-homogeneous coordinates, add the homogeneous component + Vector vv; + LinearAlgebra::AssignVector(vv, v[0], v[1], v[2], 1.0); + return vv; + } + else if (v.size() == 4) + { + // Vector "v" is already in homogeneous coordinates + + if (!infinityAllowed && + LinearAlgebra::IsCloseToZero(v[3])) + { + LOG(ERROR) << "Cannot apply a finite projective camera to a " + << "point at infinity with this method"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return v; + } + else + { + LOG(ERROR) << "The input vector must represent a point in 3D"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void FiniteProjectiveCamera::ApplyFinite(double& x, + double& y, + const Vector& v) const + { + Vector p = boost::numeric::ublas::prod(p_, SetupApply(v, false)); + + if (LinearAlgebra::IsCloseToZero(p[2])) + { + // Point at infinity: Should not happen with a finite input point + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + x = p[0] / p[2]; + y = p[1] / p[2]; + } + } + + + Vector FiniteProjectiveCamera::ApplyGeneral(const Vector& v) const + { + return boost::numeric::ublas::prod(p_, SetupApply(v, true)); + } + + + static Vector AddHomogeneousCoordinate(const Vector& p) + { + assert(p.size() == 3); + return LinearAlgebra::CreateVector(p[0], p[1], p[2], 1); + } + + + FiniteProjectiveCamera::FiniteProjectiveCamera(const Vector& camera, + const Vector& principalPoint, + double angle, + unsigned int imageWidth, + unsigned int imageHeight, + double pixelSpacingX, + double pixelSpacingY) + { + if (camera.size() != 3 || + principalPoint.size() != 3 || + LinearAlgebra::IsCloseToZero(pixelSpacingX) || + LinearAlgebra::IsCloseToZero(pixelSpacingY)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const double focal = boost::numeric::ublas::norm_2(camera - principalPoint); + + if (LinearAlgebra::IsCloseToZero(focal)) + { + LOG(ERROR) << "Camera lies on the image plane"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + Matrix a; + GeometryToolbox::AlignVectorsWithRotation(a, camera - principalPoint, + LinearAlgebra::CreateVector(0, 0, -1)); + + Matrix r = LinearAlgebra::Product(GeometryToolbox::CreateRotationMatrixAlongZ(angle), a); + + Matrix k = LinearAlgebra::ZeroMatrix(3, 3); + k(0,0) = focal / pixelSpacingX; + k(1,1) = focal / pixelSpacingY; + k(0,2) = static_cast(imageWidth) / 2.0; + k(1,2) = static_cast(imageHeight) / 2.0; + k(2,2) = 1; + + Setup(k, r, camera); + + { + // Sanity checks + Vector v1 = LinearAlgebra::Product(p_, AddHomogeneousCoordinate(camera)); + Vector v2 = LinearAlgebra::Product(p_, AddHomogeneousCoordinate(principalPoint)); + + if (!LinearAlgebra::IsCloseToZero(v1[2]) || // Camera is mapped to singularity + LinearAlgebra::IsCloseToZero(v2[2])) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // The principal point must be mapped to the center of the image + v2 /= v2[2]; + + if (!LinearAlgebra::IsNear(v2[0], static_cast(imageWidth) / 2.0) || + !LinearAlgebra::IsNear(v2[1], static_cast(imageHeight) / 2.0)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + + + template + static void ApplyRaytracerInternal(Orthanc::ImageAccessor& target, + const FiniteProjectiveCamera& camera, + const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + VolumeProjection projection) + { + if (source.GetFormat() != SourceFormat || + target.GetFormat() != TargetFormat || + !std::numeric_limits::is_iec559 || + sizeof(float) != 4) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + LOG(WARNING) << "Input volume size: " << source.GetWidth() << "x" + << source.GetHeight() << "x" << source.GetDepth(); + LOG(WARNING) << "Input pixel format: " << Orthanc::EnumerationToString(source.GetFormat()); + LOG(WARNING) << "Output image size: " << target.GetWidth() << "x" << target.GetHeight(); + LOG(WARNING) << "Output pixel format: " << Orthanc::EnumerationToString(target.GetFormat()); + + const unsigned int slicesCount = geometry.GetProjectionDepth(projection); + const OrthancStone::Vector pixelSpacing = geometry.GetVoxelDimensions(projection); + const unsigned int targetWidth = target.GetWidth(); + const unsigned int targetHeight = target.GetHeight(); + + Orthanc::Image accumulator(Orthanc::PixelFormat_Float32, targetWidth, targetHeight, false); + Orthanc::Image counter(Orthanc::PixelFormat_Grayscale16, targetWidth, targetHeight, false); + Orthanc::ImageProcessing::Set(accumulator, 0); + Orthanc::ImageProcessing::Set(counter, 0); + + typedef SubpixelReader SourceReader; + + for (unsigned int z = 0; z < slicesCount; z++) + { + LOG(INFO) << "Applying raytracer on slice: " << z << "/" << slicesCount; + + OrthancStone::CoordinateSystem3D slice = geometry.GetProjectionSlice(projection, z); + OrthancStone::ImageBuffer3D::SliceReader sliceReader(source, projection, static_cast(z)); + + SourceReader pixelReader(sliceReader.GetAccessor()); + + for (unsigned int y = 0; y < targetHeight; y++) + { + float *qacc = reinterpret_cast(accumulator.GetRow(y)); + uint16_t *qcount = reinterpret_cast(counter.GetRow(y)); + + for (unsigned int x = 0; x < targetWidth; x++) + { + // Backproject the ray originating from the center of the target pixel + OrthancStone::Vector direction = camera.GetRayDirection(static_cast(x + 0.5), + static_cast(y + 0.5)); + + // Compute the 3D intersection of the ray with the slice plane + OrthancStone::Vector p; + if (slice.IntersectLine(p, camera.GetCenter(), direction)) + { + // Compute the 2D coordinates of the intersections, in slice coordinates + double ix, iy; + slice.ProjectPoint(ix, iy, p); + + ix /= pixelSpacing[0]; + iy /= pixelSpacing[1]; + + // Read and accumulate the value of the pixel + float pixel; + if (pixelReader.GetFloatValue( + pixel, static_cast(ix), static_cast(iy))) + { + if (MIP) + { + // MIP rendering + if (*qcount == 0) + { + (*qacc) = pixel; + (*qcount) = 1; + } + else if (pixel > *qacc) + { + (*qacc) = pixel; + } + } + else + { + // Mean intensity + (*qacc) += pixel; + (*qcount) ++; + } + } + } + + qacc++; + qcount++; + } + } + } + + + typedef Orthanc::PixelTraits TargetTraits; + + // "Flatten" the accumulator image to create the target image + for (unsigned int y = 0; y < targetHeight; y++) + { + const float *qacc = reinterpret_cast(accumulator.GetConstRow(y)); + const uint16_t *qcount = reinterpret_cast(counter.GetConstRow(y)); + typename TargetTraits::PixelType *p = reinterpret_cast(target.GetRow(y)); + + for (unsigned int x = 0; x < targetWidth; x++) + { + if (*qcount == 0) + { + TargetTraits::SetZero(*p); + } + else + { + TargetTraits::FloatToPixel(*p, *qacc / static_cast(*qcount)); + } + + p++; + qacc++; + qcount++; + } + } + } + + + Orthanc::ImageAccessor* + FiniteProjectiveCamera::ApplyRaytracer(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + Orthanc::PixelFormat targetFormat, + unsigned int targetWidth, + unsigned int targetHeight, + bool mip) const + { + // TODO - We consider the axial projection of the volume, but we + // should choose the projection that is the "most perpendicular" + // to the line joining the camera center and the principal point + const VolumeProjection projection = VolumeProjection_Axial; + + std::unique_ptr target + (new Orthanc::Image(targetFormat, targetWidth, targetHeight, false)); + + if (targetFormat == Orthanc::PixelFormat_Grayscale16 && + source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && mip) + { + ApplyRaytracerInternal + (*target, *this, source, geometry, projection); + } + else if (targetFormat == Orthanc::PixelFormat_Grayscale16 && + source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && !mip) + { + ApplyRaytracerInternal + (*target, *this, source, geometry, projection); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + return target.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/FiniteProjectiveCamera.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/FiniteProjectiveCamera.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,119 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "LinearAlgebra.h" +#include "../Volumes/ImageBuffer3D.h" +#include "../Volumes/VolumeImageGeometry.h" + +namespace OrthancStone +{ + // Reference: "Multiple View Geometry in Computer Vision (2nd Edition)" + class FiniteProjectiveCamera : public boost::noncopyable + { + private: + Matrix p_; // 3x4 matrix - Equation (6.11) - page 157 + Matrix k_; // 3x3 matrix of intrinsic parameters - Equation (6.10) - page 157 + Matrix r_; // 3x3 rotation matrix in 3D space + Vector c_; // 3x1 vector in 3D space corresponding to camera center + Matrix minv_; // Inverse of the M = P(1:3,1:3) submatrix + + void ComputeMInverse(); + + void Setup(const Matrix& k, + const Matrix& r, + const Vector& c); + + void Setup(const Matrix& p); + + public: + FiniteProjectiveCamera(const Matrix& k, + const Matrix& r, + const Vector& c) + { + Setup(k, r, c); + } + + FiniteProjectiveCamera(const Matrix& p) + { + Setup(p); + } + + FiniteProjectiveCamera(const double k[9], + const double r[9], + const double c[3]); + + FiniteProjectiveCamera(const double p[12]); + + // Constructor that implements camera calibration + FiniteProjectiveCamera(const Vector& camera, + const Vector& principalPoint, + double angle, + unsigned int imageWidth, + unsigned int imageHeight, + double pixelSpacingX, + double pixelSpacingY); + + const Matrix& GetMatrix() const + { + return p_; + } + + const Matrix& GetRotation() const + { + return r_; + } + + const Vector& GetCenter() const + { + return c_; + } + + const Matrix& GetIntrinsicParameters() const + { + return k_; + } + + // Computes the 3D vector that represents the direction from the + // camera center to the (x,y) imaged point + Vector GetRayDirection(double x, + double y) const; + + // Apply the camera to a 3D point "v" that is not at infinity. "v" + // can be encoded either as a non-homogeneous vector (3 + // components), or as a homogeneous vector (4 components). + void ApplyFinite(double& x, + double& y, + const Vector& v) const; + + // Apply the camera to a 3D point "v" that is possibly at + // infinity. The result is a 2D point in homogeneous coordinates. + Vector ApplyGeneral(const Vector& v) const; + + Orthanc::ImageAccessor* ApplyRaytracer(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + Orthanc::PixelFormat targetFormat, + unsigned int targetWidth, + unsigned int targetHeight, + bool mip) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/GenericToolbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/GenericToolbox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,104 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GenericToolbox.h" + +#include + +namespace OrthancStone +{ + namespace GenericToolbox + { + bool GetRgbaValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, uint8_t& alpha, const char* text) + { + boost::regex pattern("\\s*rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)\\s*"); + + boost::cmatch what; + + if (boost::regex_match(text, what, pattern)) + { + { + std::string redStr = what[1]; + bool ok = StringToInteger(red, redStr); + if (!ok) + return false; + } + { + std::string greenStr = what[2]; + bool ok = StringToInteger(green, greenStr); + if (!ok) + return false; + } + { + std::string blueStr = what[3]; + bool ok = StringToInteger(blue, blueStr); + if (!ok) + return false; + } + { + std::string alphaStr = what[4]; + bool ok = StringToInteger(alpha, alphaStr); + if (!ok) + return false; + } + return true; + } + else + { + return false; + } + } + bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const char* text) + { + boost::regex pattern("\\s*rgb\\s*\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)\\s*"); + + boost::cmatch what; + + if (boost::regex_match(text, what, pattern)) + { + { + std::string redStr = what[1]; + bool ok = StringToInteger(red, redStr); + if (!ok) + return false; + } + { + std::string greenStr = what[2]; + bool ok = StringToInteger(green, greenStr); + if (!ok) + return false; + } + { + std::string blueStr = what[3]; + bool ok = StringToInteger(blue, blueStr); + if (!ok) + return false; + } + return true; + } + else + { + return false; + } + } + + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/GenericToolbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/GenericToolbox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,308 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include +#include + +#include + +#include +#include +#include + +#include + +namespace OrthancStone +{ + namespace GenericToolbox + { + /** + Fast floating point string validation. + No trimming applied, so the input must match regex + /^[-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/ + The following are allowed as edge cases: "" and "-" + */ + inline bool LegitDoubleString(const char* text) + { + const char* p = text; + if(*p == '-') + p++; + size_t period = 0; + while(*p != 0) + { + if (*p >= '0' && *p <= '9') + ++p; + else if(*p == '.') + { + if(period > 0) + return false; + else + period++; + ++p; + } + else if (*p == 'e' || *p == 'E') + { + ++p; + if (*p == '-' || *p == '+') + ++p; + // "e+"/"E+" "e-"/"E-" or "e"/"E" must be followed by a number + if (!(*p >= '0' && *p <= '9')) + return false; + + // these must be the last in the string + while(*p >= '0' && *p <= '9') + ++p; + + return (*p == 0); + } + else + { + return false; + } + } + return true; + } + + /** + Fast integer string validation. + No trimming applied, so the input must match regex /^-?[0-9]*$/ + The following are allowed as edge cases: "" and "-" + */ + inline bool LegitIntegerString(const char* text) + { + const char* p = text; + if (*p == '-') + p++; + while (*p != 0) + { + if (*p >= '0' && *p <= '9') + ++p; + else + return false; + } + return true; + } + + /* + Fast string --> double conversion. + Must pass the LegitDoubleString test + + String to doubles with at most 18 digits + */ + inline bool StringToDouble(double& r, const char* text) + { + if(!LegitDoubleString(text)) + return false; + + static const double FRAC_FACTORS[] = + { + 1.0, + 0.1, + 0.01, + 0.001, + 0.0001, + 0.00001, + 0.000001, + 0.0000001, + 0.00000001, + 0.000000001, + 0.0000000001, + 0.00000000001, + 0.000000000001, + 0.0000000000001, + 0.00000000000001, + 0.000000000000001, + 0.0000000000000001, + 0.00000000000000001, + 0.000000000000000001, + 0.0000000000000000001 + }; + const size_t FRAC_FACTORS_LEN = sizeof(FRAC_FACTORS)/sizeof(double); + + r = 0.0; + double neg = 1.0; + const char* p = text; + + if (*p == '-') + { + neg = -1.0; + ++p; + } + // 12345.67890 + while (*p >= '0' && *p <= '9') + { + r = (r*10.0) + (*p - '0'); // 1 12 123 123 12345 + ++p; + } + if (*p == '.') + { + double f = 0.0; + size_t n = 1; + ++p; + while (*p >= '0' && *p <= '9' && n < FRAC_FACTORS_LEN) + { + f += (*p - '0') * FRAC_FACTORS[n]; + ++p; + ++n; + } + r += f; + } + r *= neg; + + // skip the remaining numbers until we reach not-a-digit (either the + // end of the string OR the scientific notation symbol) + while ((*p >= '0' && *p <= '9')) + ++p; + + if (*p == 0 ) + { + return true; + } + else if ((*p == 'e') || (*p == 'E')) + { + // process the scientific notation + double sign; // no init is safe (read below) + ++p; + if (*p == '-') + { + sign = -1.0; + // point to first number + ++p; + } + else if (*p == '+') + { + sign = 1.0; + // point to first number + ++p; + } + else if (*p >= '0' && *p <= '9') + { + sign = 1.0; + } + else + { + // only a sign char or a number is allowed + return false; + } + // now p points to the absolute value of the exponent + double exp = 0; + while (*p >= '0' && *p <= '9') + { + exp = (exp * 10.0) + static_cast(*p - '0'); // 1 12 123 123 12345 + ++p; + } + // now we have our exponent. put a sign on it. + exp *= sign; + double scFac = ::pow(10.0, exp); + r *= scFac; + + // only allowed symbol here is EOS + return (*p == 0); + } + else + { + // not allowed + return false; + } + } + + inline bool StringToDouble(double& r, const std::string& text) + { + return StringToDouble(r, text.c_str()); + } + + /** + Fast string to integer conversion. Leading zeroes and minus are accepted, + but a leading + sign is NOT. + Must pass the LegitIntegerString function test. + In addition, an empty string (or lone minus sign) yields 0. + */ + + template + inline bool StringToInteger(T& r, const char* text) + { + if (!LegitIntegerString(text)) + return false; + + r = 0; + T neg = 1; + const char* p = text; + + if (*p == '-') + { + neg = -1; + ++p; + } + while (*p >= '0' && *p <= '9') + { + r = (r * 10) + (*p - '0'); // 1 12 123 123 12345 + ++p; + } + r *= neg; + if (*p == 0) + return true; + else + return false; + } + + template + inline bool StringToInteger(T& r, const std::string& text) + { + return StringToInteger(r, text.c_str()); + } + + /** + if input is "rgb(12,23,255)" --> function fills `red`, `green` and `blue` and returns true + else ("everything else") --> function returns false and leaves all values untouched + */ + bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const char* text); + + /** + See main overload + */ + inline bool GetRgbValuesFromString(uint8_t& red, uint8_t& green, uint8_t& blue, const std::string& text) + { + return GetRgbValuesFromString(red, green, blue, text.c_str()); + } + + /** + Same as GetRgbValuesFromString + */ + bool GetRgbaValuesFromString(uint8_t& red, + uint8_t& green, + uint8_t& blue, + uint8_t& alpha, + const char* text); + + /** + Same as GetRgbValuesFromString + */ + inline bool GetRgbaValuesFromString(uint8_t& red, + uint8_t& green, + uint8_t& blue, + uint8_t& alpha, + const std::string& text) + { + return GetRgbaValuesFromString(red, green, blue, alpha, text.c_str()); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/GeometryToolbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/GeometryToolbox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,572 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "GeometryToolbox.h" + +#include +#include + +#include + +namespace OrthancStone +{ + namespace GeometryToolbox + { + void ProjectPointOntoPlane(Vector& result, + const Vector& point, + const Vector& planeNormal, + const Vector& planeOrigin) + { + double norm = boost::numeric::ublas::norm_2(planeNormal); + if (LinearAlgebra::IsCloseToZero(norm)) + { + // Division by zero + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // Make sure the norm of the normal is 1 + Vector n; + n = planeNormal / norm; + + // Algebraic form of line–plane intersection, where the line passes + // through "point" along the direction "normal" (thus, l == n) + // https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection#Algebraic_form + result = boost::numeric::ublas::inner_prod(planeOrigin - point, n) * n + point; + } + + /* + undefined results if vector are not 3D + */ + void ProjectPointOntoPlane2( + double& resultX, + double& resultY, + double& resultZ, + const Vector& point, + const Vector& planeNormal, + const Vector& planeOrigin) + { + double pointX = point[0]; + double pointY = point[1]; + double pointZ = point[2]; + + double planeNormalX = planeNormal[0]; + double planeNormalY = planeNormal[1]; + double planeNormalZ = planeNormal[2]; + + double planeOriginX = planeOrigin[0]; + double planeOriginY = planeOrigin[1]; + double planeOriginZ = planeOrigin[2]; + + double normSq = (planeNormalX * planeNormalX) + (planeNormalY * planeNormalY) + (planeNormalZ * planeNormalZ); + + // Algebraic form of line–plane intersection, where the line passes + // through "point" along the direction "normal" (thus, l == n) + // https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection#Algebraic_form + + if (LinearAlgebra::IsNear(1.0, normSq)) + { + double nX = planeNormalX; + double nY = planeNormalY; + double nZ = planeNormalZ; + + double prod = (planeOriginX - pointX) * nX + (planeOriginY - pointY) * nY + (planeOriginZ - pointZ) * nZ; + + resultX = prod * nX + pointX; + resultY = prod * nY + pointY; + resultZ = prod * nZ + pointZ; + } + else + { + double norm = sqrt(normSq); + if (LinearAlgebra::IsCloseToZero(norm)) + { + // Division by zero + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + double invNorm = 1.0 / norm; + double nX = planeNormalX * invNorm; + double nY = planeNormalY * invNorm; + double nZ = planeNormalZ * invNorm; + + double prod = (planeOriginX - pointX) * nX + (planeOriginY - pointY) * nY + (planeOriginZ - pointZ) * nZ; + + resultX = prod * nX + pointX; + resultY = prod * nY + pointY; + resultZ = prod * nZ + pointZ; + } + } + + bool IsParallelOrOpposite(bool& isOpposite, + const Vector& u, + const Vector& v) + { + // The dot product of the two vectors gives the cosine of the angle + // between the vectors + // https://en.wikipedia.org/wiki/Dot_product + + double normU = boost::numeric::ublas::norm_2(u); + double normV = boost::numeric::ublas::norm_2(v); + + if (LinearAlgebra::IsCloseToZero(normU) || + LinearAlgebra::IsCloseToZero(normV)) + { + return false; + } + + double cosAngle = boost::numeric::ublas::inner_prod(u, v) / (normU * normV); + + // The angle must be zero, so the cosine must be almost equal to + // cos(0) == 1 (or cos(180) == -1 if allowOppositeDirection == true) + + if (LinearAlgebra::IsCloseToZero(cosAngle - 1.0)) + { + isOpposite = false; + return true; + } + else if (LinearAlgebra::IsCloseToZero(fabs(cosAngle) - 1.0)) + { + isOpposite = true; + return true; + } + else + { + return false; + } + } + + + bool IsParallel(const Vector& u, + const Vector& v) + { + bool isOpposite; + return (IsParallelOrOpposite(isOpposite, u, v) && + !isOpposite); + } + + + bool IntersectTwoPlanes(Vector& p, + Vector& direction, + const Vector& origin1, + const Vector& normal1, + const Vector& origin2, + const Vector& normal2) + { + // This is "Intersection of 2 Planes", possibility "(C) 3 Plane + // Intersect Point" of: + // http://geomalgorithms.com/a05-_intersect-1.html + + // The direction of the line of intersection is orthogonal to the + // normal of both planes + LinearAlgebra::CrossProduct(direction, normal1, normal2); + + double norm = boost::numeric::ublas::norm_2(direction); + if (LinearAlgebra::IsCloseToZero(norm)) + { + // The two planes are parallel or coincident + return false; + } + + double d1 = -boost::numeric::ublas::inner_prod(normal1, origin1); + double d2 = -boost::numeric::ublas::inner_prod(normal2, origin2); + Vector tmp = d2 * normal1 - d1 * normal2; + + LinearAlgebra::CrossProduct(p, tmp, direction); + p /= norm; + + return true; + } + + + bool ClipLineToRectangle(double& x1, // Coordinates of the clipped line (out) + double& y1, + double& x2, + double& y2, + const double ax, // Two points defining the line (in) + const double ay, + const double bx, + const double by, + const double& xmin, // Coordinates of the rectangle (in) + const double& ymin, + const double& xmax, + const double& ymax) + { + // This is Skala algorithm for rectangles, "A new approach to line + // and line segment clipping in homogeneous coordinates" + // (2005). This is a direct, non-optimized translation of Algorithm + // 2 in the paper. + + static const uint8_t tab1[16] = { 255 /* none */, + 0, + 0, + 1, + 1, + 255 /* na */, + 0, + 2, + 2, + 0, + 255 /* na */, + 1, + 1, + 0, + 0, + 255 /* none */ }; + + + static const uint8_t tab2[16] = { 255 /* none */, + 3, + 1, + 3, + 2, + 255 /* na */, + 2, + 3, + 3, + 2, + 255 /* na */, + 2, + 3, + 1, + 3, + 255 /* none */ }; + + // Create the coordinates of the rectangle + Vector x[4]; + LinearAlgebra::AssignVector(x[0], xmin, ymin, 1.0); + LinearAlgebra::AssignVector(x[1], xmax, ymin, 1.0); + LinearAlgebra::AssignVector(x[2], xmax, ymax, 1.0); + LinearAlgebra::AssignVector(x[3], xmin, ymax, 1.0); + + // Move to homogoneous coordinates in 2D + Vector p; + + { + Vector a, b; + LinearAlgebra::AssignVector(a, ax, ay, 1.0); + LinearAlgebra::AssignVector(b, bx, by, 1.0); + LinearAlgebra::CrossProduct(p, a, b); + } + + uint8_t c = 0; + + for (unsigned int k = 0; k < 4; k++) + { + if (boost::numeric::ublas::inner_prod(p, x[k]) >= 0) + { + c |= (1 << k); + } + } + + assert(c < 16); + + uint8_t i = tab1[c]; + uint8_t j = tab2[c]; + + if (i == 255 || j == 255) + { + return false; // No intersection + } + else + { + Vector a, b, e; + LinearAlgebra::CrossProduct(e, x[i], x[(i + 1) % 4]); + LinearAlgebra::CrossProduct(a, p, e); + LinearAlgebra::CrossProduct(e, x[j], x[(j + 1) % 4]); + LinearAlgebra::CrossProduct(b, p, e); + + // Go back to non-homogeneous coordinates + x1 = a[0] / a[2]; + y1 = a[1] / a[2]; + x2 = b[0] / b[2]; + y2 = b[1] / b[2]; + + return true; + } + } + + + void GetPixelSpacing(double& spacingX, + double& spacingY, + const Orthanc::DicomMap& dicom) + { + Vector v; + + if (LinearAlgebra::ParseVector(v, dicom, Orthanc::DICOM_TAG_PIXEL_SPACING)) + { + if (v.size() != 2 || + v[0] <= 0 || + v[1] <= 0) + { + LOG(ERROR) << "Bad value for PixelSpacing tag"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + // WARNING: X/Y are swapped (Y comes first) + spacingX = v[1]; + spacingY = v[0]; + } + } + else + { + // The "PixelSpacing" is of type 1C: It could be absent, use + // default value in such a case + spacingX = 1; + spacingY = 1; + } + } + + + Matrix CreateRotationMatrixAlongX(double a) + { + // Rotate along X axis (R_x) + // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations + Matrix r(3, 3); + r(0,0) = 1; + r(0,1) = 0; + r(0,2) = 0; + r(1,0) = 0; + r(1,1) = cos(a); + r(1,2) = -sin(a); + r(2,0) = 0; + r(2,1) = sin(a); + r(2,2) = cos(a); + return r; + } + + + Matrix CreateRotationMatrixAlongY(double a) + { + // Rotate along Y axis (R_y) + // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations + Matrix r(3, 3); + r(0,0) = cos(a); + r(0,1) = 0; + r(0,2) = sin(a); + r(1,0) = 0; + r(1,1) = 1; + r(1,2) = 0; + r(2,0) = -sin(a); + r(2,1) = 0; + r(2,2) = cos(a); + return r; + } + + + Matrix CreateRotationMatrixAlongZ(double a) + { + // Rotate along Z axis (R_z) + // https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations + Matrix r(3, 3); + r(0,0) = cos(a); + r(0,1) = -sin(a); + r(0,2) = 0; + r(1,0) = sin(a); + r(1,1) = cos(a); + r(1,2) = 0; + r(2,0) = 0; + r(2,1) = 0; + r(2,2) = 1; + return r; + } + + + Matrix CreateTranslationMatrix(double dx, + double dy, + double dz) + { + Matrix m = LinearAlgebra::IdentityMatrix(4); + m(0,3) = dx; + m(1,3) = dy; + m(2,3) = dz; + return m; + } + + + Matrix CreateScalingMatrix(double sx, + double sy, + double sz) + { + Matrix m = LinearAlgebra::IdentityMatrix(4); + m(0,0) = sx; + m(1,1) = sy; + m(2,2) = sz; + return m; + } + + + bool IntersectPlaneAndSegment(Vector& p, + const Vector& normal, + double d, + const Vector& edgeFrom, + const Vector& edgeTo) + { + // http://geomalgorithms.com/a05-_intersect-1.html#Line-Plane-Intersection + + // Check for parallel line and plane + Vector direction = edgeTo - edgeFrom; + double denominator = boost::numeric::ublas::inner_prod(direction, normal); + + if (fabs(denominator) < 100.0 * std::numeric_limits::epsilon()) + { + return false; + } + else + { + // Compute intersection + double t = -(normal[0] * edgeFrom[0] + + normal[1] * edgeFrom[1] + + normal[2] * edgeFrom[2] + d) / denominator; + + if (t >= 0 && t <= 1) + { + // The intersection lies inside edge segment + p = edgeFrom + t * direction; + return true; + } + else + { + return false; + } + } + } + + + bool IntersectPlaneAndLine(Vector& p, + const Vector& normal, + double d, + const Vector& origin, + const Vector& direction) + { + // http://geomalgorithms.com/a05-_intersect-1.html#Line-Plane-Intersection + + // Check for parallel line and plane + double denominator = boost::numeric::ublas::inner_prod(direction, normal); + + if (fabs(denominator) < 100.0 * std::numeric_limits::epsilon()) + { + return false; + } + else + { + // Compute intersection + double t = -(normal[0] * origin[0] + + normal[1] * origin[1] + + normal[2] * origin[2] + d) / denominator; + + p = origin + t * direction; + return true; + } + } + + + void AlignVectorsWithRotation(Matrix& r, + const Vector& a, + const Vector& b) + { + // This is Rodrigues' rotation formula: + // https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula#Matrix_notation + + // Check also result A4.6 from "Multiple View Geometry in Computer + // Vision - 2nd edition" (p. 584) + + if (a.size() != 3 || + b.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + double aNorm = boost::numeric::ublas::norm_2(a); + double bNorm = boost::numeric::ublas::norm_2(b); + + if (LinearAlgebra::IsCloseToZero(aNorm) || + LinearAlgebra::IsCloseToZero(bNorm)) + { + LOG(ERROR) << "Vector with zero norm"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + Vector aUnit, bUnit; + aUnit = a / aNorm; + bUnit = b / bNorm; + + Vector v; + LinearAlgebra::CrossProduct(v, aUnit, bUnit); + + double cosine = boost::numeric::ublas::inner_prod(aUnit, bUnit); + + if (LinearAlgebra::IsCloseToZero(1 + cosine)) + { + // "a == -b": TODO + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + Matrix k; + LinearAlgebra::CreateSkewSymmetric(k, v); + +#if 0 + double sine = boost::numeric::ublas::norm_2(v); + + r = (boost::numeric::ublas::identity_matrix(3) + + sine * k + + (1 - cosine) * boost::numeric::ublas::prod(k, k)); +#else + r = (boost::numeric::ublas::identity_matrix(3) + + k + + boost::numeric::ublas::prod(k, k) / (1 + cosine)); +#endif + } + + + void ComputeNormalFromCosines(Vector& normal, + const Vector& cosines) + { + if (cosines.size() != 6) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + normal.resize(3); + normal[0] = cosines[1] * cosines[5] - cosines[2] * cosines[4]; + normal[1] = cosines[2] * cosines[3] - cosines[0] * cosines[5]; + normal[2] = cosines[0] * cosines[4] - cosines[1] * cosines[3]; + } + } + + + bool ComputeNormal(Vector& normal, + const Orthanc::DicomMap& dicom) + { + Vector cosines; + if (LinearAlgebra::ParseVector(cosines, dicom, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT) && + cosines.size() == 6) + { + ComputeNormalFromCosines(normal, cosines); + return true; + } + else + { + return false; + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/GeometryToolbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/GeometryToolbox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,177 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "LinearAlgebra.h" + +namespace OrthancStone +{ + namespace GeometryToolbox + { + void ProjectPointOntoPlane(Vector& result, + const Vector& point, + const Vector& planeNormal, + const Vector& planeOrigin); + + /* + Alternated faster implementation (untested yet) + */ + void ProjectPointOntoPlane2(double& resultX, + double& resultY, + double& resultZ, + const Vector& point, + const Vector& planeNormal, + const Vector& planeOrigin); + + bool IsParallel(const Vector& u, + const Vector& v); + + bool IsParallelOrOpposite(bool& isOpposite, + const Vector& u, + const Vector& v); + + bool IntersectTwoPlanes(Vector& p, + Vector& direction, + const Vector& origin1, + const Vector& normal1, + const Vector& origin2, + const Vector& normal2); + + bool ClipLineToRectangle(double& x1, // Coordinates of the clipped line (out) + double& y1, + double& x2, + double& y2, + const double ax, // Two points defining the line (in) + const double ay, + const double bx, + const double by, + const double& xmin, // Coordinates of the rectangle (in) + const double& ymin, + const double& xmax, + const double& ymax); + + void GetPixelSpacing(double& spacingX, + double& spacingY, + const Orthanc::DicomMap& dicom); + + inline double ProjectAlongNormal(const Vector& point, + const Vector& normal) + { + return boost::numeric::ublas::inner_prod(point, normal); + } + + Matrix CreateRotationMatrixAlongX(double a); + + Matrix CreateRotationMatrixAlongY(double a); + + Matrix CreateRotationMatrixAlongZ(double a); + + Matrix CreateTranslationMatrix(double dx, + double dy, + double dz); + + Matrix CreateScalingMatrix(double sx, + double sy, + double sz); + + bool IntersectPlaneAndSegment(Vector& p, + const Vector& normal, + double d, + const Vector& edgeFrom, + const Vector& edgeTo); + + bool IntersectPlaneAndLine(Vector& p, + const Vector& normal, + double d, + const Vector& origin, + const Vector& direction); + + void AlignVectorsWithRotation(Matrix& r, + const Vector& a, + const Vector& b); + + void ComputeNormalFromCosines(Vector& normal, + const Vector& cosines); + + bool ComputeNormal(Vector& normal, + const Orthanc::DicomMap& dicom); + + inline float ComputeBilinearInterpolationUnitSquare(float x, + float y, + float f00, // source(0, 0) + float f01, // source(1, 0) + float f10, // source(0, 1) + float f11); // source(1, 1) + + inline float ComputeTrilinearInterpolationUnitSquare(float x, + float y, + float z, + float f000, // source(0, 0, 0) + float f001, // source(1, 0, 0) + float f010, // source(0, 1, 0) + float f011, // source(1, 1, 0) + float f100, // source(0, 0, 1) + float f101, // source(1, 0, 1) + float f110, // source(0, 1, 1) + float f111); // source(1, 1, 1) + }; +} + + +float OrthancStone::GeometryToolbox::ComputeBilinearInterpolationUnitSquare(float x, + float y, + float f00, + float f01, + float f10, + float f11) +{ + // This function only works within the unit square + assert(x >= 0 && y >= 0 && x <= 1 && y <= 1); + + // https://en.wikipedia.org/wiki/Bilinear_interpolation#Unit_square + return (f00 * (1.0f - x) * (1.0f - y) + + f01 * x * (1.0f - y) + + f10 * (1.0f - x) * y + + f11 * x * y); +} + + +float OrthancStone::GeometryToolbox::ComputeTrilinearInterpolationUnitSquare(float x, + float y, + float z, + float f000, + float f001, + float f010, + float f011, + float f100, + float f101, + float f110, + float f111) +{ + // "In practice, a trilinear interpolation is identical to two + // bilinear interpolation combined with a linear interpolation" + // https://en.wikipedia.org/wiki/Trilinear_interpolation#Method + float a = ComputeBilinearInterpolationUnitSquare(x, y, f000, f001, f010, f011); + float b = ComputeBilinearInterpolationUnitSquare(x, y, f100, f101, f110, f111); + + return (1.0f - z) * a + z * b; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ImageGeometry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ImageGeometry.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,594 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ImageGeometry.h" + +#include "Extent2D.h" +#include "SubpixelReader.h" + +#include +#include +#include + + +namespace OrthancStone +{ + static void AddTransformedPoint(Extent2D& extent, + const Matrix& a, + double x, + double y) + { + assert(a.size1() == 3 && + a.size2() == 3); + + Vector p = LinearAlgebra::Product(a, LinearAlgebra::CreateVector(x, y, 1)); + + if (!LinearAlgebra::IsCloseToZero(p[2])) + { + extent.AddPoint(p[0] / p[2], p[1] / p[2]); + } + } + + + bool GetProjectiveTransformExtent(unsigned int& x1, + unsigned int& y1, + unsigned int& x2, + unsigned int& y2, + const Matrix& a, + unsigned int sourceWidth, + unsigned int sourceHeight, + unsigned int targetWidth, + unsigned int targetHeight) + { + if (targetWidth == 0 || + targetHeight == 0) + { + return false; + } + + Extent2D extent; + AddTransformedPoint(extent, a, 0, 0); + AddTransformedPoint(extent, a, sourceWidth, 0); + AddTransformedPoint(extent, a, 0, sourceHeight); + AddTransformedPoint(extent, a, sourceWidth, sourceHeight); + + if (extent.IsEmpty()) + { + return false; + } + else + { + int tmp = static_cast(std::floor(extent.GetX1())); + if (tmp < 0) + { + x1 = 0; + } + else + { + x1 = static_cast(tmp); + } + + tmp = static_cast(std::floor(extent.GetY1())); + if (tmp < 0) + { + y1 = 0; + } + else + { + y1 = static_cast(tmp); + } + + tmp = static_cast(std::ceil(extent.GetX2())); + if (tmp < 0) + { + return false; + } + else if (static_cast(tmp) >= targetWidth) + { + x2 = targetWidth - 1; + } + else + { + x2 = static_cast(tmp); + } + + tmp = static_cast(std::ceil(extent.GetY2())); + if (tmp < 0) + { + return false; + } + else if (static_cast(tmp) >= targetHeight) + { + y2 = targetHeight - 1; + } + else + { + y2 = static_cast(tmp); + } + + return (x1 <= x2 && + y1 <= y2); + } + } + + + template + static void ApplyAffineTransformToRow(typename Reader::PixelType* p, + Reader& reader, + unsigned int x1, + unsigned int x2, + float positionX, + float positionY, + float offsetX, + float offsetY) + { + typename Reader::PixelType value; + + for (unsigned int x = x1; x <= x2; x++, p++) + { + if (reader.GetValue(value, positionX, positionY)) + { + *p = value; + } + + if (HasOffsetX) + { + positionX += offsetX; + } + + if (HasOffsetY) + { + positionY += offsetY; + } + } + } + + + template + static void ApplyAffineInternal(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + const Matrix& a, + bool clear) + { + assert(target.GetFormat() == Format && + source.GetFormat() == Format); + + typedef SubpixelReader Reader; + typedef typename Reader::PixelType PixelType; + + if (clear) + { + if (Format == Orthanc::PixelFormat_RGB24) + { + Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255); + } + else + { + Orthanc::ImageProcessing::Set(target, 0); + } + } + + Matrix inva; + if (!LinearAlgebra::InvertMatrixUnsafe(inva, a)) + { + // Singular matrix + return; + } + + Reader reader(source); + + unsigned int x1, y1, x2, y2; + + if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, + source.GetWidth(), source.GetHeight(), + target.GetWidth(), target.GetHeight())) + { + const size_t targetPitch = target.GetPitch(); + uint8_t *targetRow = reinterpret_cast + (reinterpret_cast(target.GetRow(y1)) + x1); + + for (unsigned int y = y1; y <= y2; y++) + { + Vector start; + LinearAlgebra::AssignVector(start, static_cast(x1) + 0.5, + static_cast(y) + 0.5, 1); + start = boost::numeric::ublas::prod(inva, start); + assert(LinearAlgebra::IsNear(1.0, start(2))); + + Vector offset; + LinearAlgebra::AssignVector(offset, static_cast(x1) + 1.5, + static_cast(y) + 0.5, 1); + offset = boost::numeric::ublas::prod(inva, offset) - start; + assert(LinearAlgebra::IsNear(0.0, offset(2))); + + float startX = static_cast(start[0]); + float startY = static_cast(start[1]); + float offsetX = static_cast(offset[0]); + float offsetY = static_cast(offset[1]); + + PixelType* pixel = reinterpret_cast(targetRow); + if (LinearAlgebra::IsCloseToZero(offsetX)) + { + ApplyAffineTransformToRow + (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); + } + else if (LinearAlgebra::IsCloseToZero(offsetY)) + { + ApplyAffineTransformToRow + (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); + } + else + { + ApplyAffineTransformToRow + (pixel, reader, x1, x2, startX, startY, offsetX, offsetY); + } + + targetRow += targetPitch; + } + } + } + + + void ApplyAffineTransform(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + double a11, + double a12, + double b1, + double a21, + double a22, + double b2, + ImageInterpolation interpolation, + bool clear) + { + if (source.GetFormat() != target.GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (interpolation != ImageInterpolation_Nearest && + interpolation != ImageInterpolation_Bilinear) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + Matrix a; + a.resize(3, 3); + a(0, 0) = a11; + a(0, 1) = a12; + a(0, 2) = b1; + a(1, 0) = a21; + a(1, 1) = a22; + a(1, 2) = b2; + a(2, 0) = 0; + a(2, 1) = 0; + a(2, 2) = 1; + + switch (source.GetFormat()) + { + case Orthanc::PixelFormat_Grayscale8: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyAffineInternal(target, source, a, clear); + break; + + case ImageInterpolation_Bilinear: + ApplyAffineInternal(target, source, a, clear); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_Grayscale16: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyAffineInternal(target, source, a, clear); + break; + + case ImageInterpolation_Bilinear: + ApplyAffineInternal(target, source, a, clear); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyAffineInternal(target, source, a, clear); + break; + + case ImageInterpolation_Bilinear: + ApplyAffineInternal(target, source, a, clear); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_Float32: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyAffineInternal(target, source, a, clear); + break; + + case ImageInterpolation_Bilinear: + ApplyAffineInternal(target, source, a, clear); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_RGB24: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyAffineInternal(target, source, a, clear); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + template + static void ApplyProjectiveInternal(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + const Matrix& a, + const Matrix& inva) + { + assert(target.GetFormat() == Format && + source.GetFormat() == Format); + + typedef SubpixelReader Reader; + typedef typename Reader::PixelType PixelType; + + Reader reader(source); + unsigned int x1, y1, x2, y2; + + const float floatWidth = static_cast(source.GetWidth()); + const float floatHeight = static_cast(source.GetHeight()); + + if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, + source.GetWidth(), source.GetHeight(), + target.GetWidth(), target.GetHeight())) + { + const size_t targetPitch = target.GetPitch(); + uint8_t *targetRow = reinterpret_cast + (reinterpret_cast(target.GetRow(y1)) + x1); + + for (unsigned int y = y1; y <= y2; y++) + { + PixelType *p = reinterpret_cast(targetRow); + + for (unsigned int x = x1; x <= x2; x++) + { + Vector v; + LinearAlgebra::AssignVector(v, static_cast(x) + 0.5, + static_cast(y) + 0.5, 1); + + Vector vv = LinearAlgebra::Product(inva, v); + + assert(!LinearAlgebra::IsCloseToZero(vv[2])); + const double w = 1.0 / vv[2]; + const float sourceX = static_cast(vv[0] * w); + const float sourceY = static_cast(vv[1] * w); + + // Make sure no integer overflow will occur after truncation + // (the static_cast could otherwise throw an + // exception in WebAssembly if strong projective effects) + if (sourceX < floatWidth && + sourceY < floatHeight) + { + reader.GetValue(*p, sourceX, sourceY); + } + + p++; + } + + targetRow += targetPitch; + } + } + } + + + void ApplyProjectiveTransform(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + const Matrix& a, + ImageInterpolation interpolation, + bool clear) + { + if (source.GetFormat() != target.GetFormat()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (a.size1() != 3 || + a.size2() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); + } + + if (interpolation != ImageInterpolation_Nearest && + interpolation != ImageInterpolation_Bilinear) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // Check whether we are dealing with an affine transform + if (LinearAlgebra::IsCloseToZero(a(2, 0)) && + LinearAlgebra::IsCloseToZero(a(2, 1))) + { + double w = a(2, 2); + if (LinearAlgebra::IsCloseToZero(w)) + { + LOG(ERROR) << "Singular projective matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + ApplyAffineTransform(target, source, + a(0, 0) / w, a(0, 1) / w, a(0, 2) / w, + a(1, 0) / w, a(1, 1) / w, a(1, 2) / w, + interpolation, clear); + return; + } + } + + if (clear) + { + if (target.GetFormat() == Orthanc::PixelFormat_RGB24) + { + Orthanc::ImageProcessing::Set(target, 0, 0, 0, 255); + } + else + { + Orthanc::ImageProcessing::Set(target, 0); + } + } + + Matrix inva; + if (!LinearAlgebra::InvertMatrixUnsafe(inva, a)) + { + return; + } + + switch (source.GetFormat()) + { + case Orthanc::PixelFormat_Grayscale8: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyProjectiveInternal(target, source, a, inva); + break; + + case ImageInterpolation_Bilinear: + ApplyProjectiveInternal(target, source, a, inva); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_Grayscale16: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyProjectiveInternal(target, source, a, inva); + break; + + case ImageInterpolation_Bilinear: + ApplyProjectiveInternal(target, source, a, inva); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_SignedGrayscale16: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyProjectiveInternal(target, source, a, inva); + break; + + case ImageInterpolation_Bilinear: + ApplyProjectiveInternal(target, source, a, inva); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_Float32: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyProjectiveInternal(target, source, a, inva); + break; + + case ImageInterpolation_Bilinear: + ApplyProjectiveInternal(target, source, a, inva); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + case Orthanc::PixelFormat_RGB24: + switch (interpolation) + { + case ImageInterpolation_Nearest: + ApplyProjectiveInternal(target, source, a, inva); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ImageGeometry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ImageGeometry.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "LinearAlgebra.h" + +#include + + +namespace OrthancStone +{ + // Returns the "useful" portion of the target image when applying a + // 3x3 perspective transform "a" (i.e. the bounding box where points + // of the source image are mapped to) + bool GetProjectiveTransformExtent(unsigned int& x1, + unsigned int& y1, + unsigned int& x2, + unsigned int& y2, + const Matrix& a, + unsigned int sourceWidth, + unsigned int sourceHeight, + unsigned int targetWidth, + unsigned int targetHeight); + + void ApplyAffineTransform(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + double a11, + double a12, + double b1, + double a21, + double a22, + double b2, + ImageInterpolation interpolation, + bool clear); + + void ApplyProjectiveTransform(Orthanc::ImageAccessor& target, + const Orthanc::ImageAccessor& source, + const Matrix& a, + ImageInterpolation interpolation, + bool clear); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ImageToolbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ImageToolbox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,337 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../OrthancStone.h" +#include "ImageToolbox.h" + +#include "../StoneException.h" + +#include +#include + +#include +#include + +#include +#include + +#include + +#if !defined(ORTHANC_ENABLE_DCMTK) +# error ORTHANC_ENABLE_DCMTK is not defined +#endif + +#if !defined(ORTHANC_ENABLE_DCMTK_JPEG) +# error ORTHANC_ENABLE_DCMTK_JPEG is not defined +#endif + +#if !defined(ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS) +# error ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS is not defined +#endif + + +namespace OrthancStone +{ + namespace + { + using Orthanc::PixelTraits; + using Orthanc::PixelFormat; + using Orthanc::ImageAccessor; + using Orthanc::PixelFormat; + + template + class PixelBinner + { + // "PixelBinner requires an arithmetic (integer or floating-point) pixel format" + typedef typename Orthanc::PixelTraits::PixelType PixelType; + BOOST_STATIC_ASSERT(boost::is_arithmetic::value); + + public: + PixelBinner(HistogramData& hd, double minValue, double maxValue) + : hd_(hd) + , minValue_(minValue) + , maxValue_(maxValue) + , division_(1.0 / hd_.binSize) + { + ORTHANC_ASSERT(hd_.bins.size() > 0); + ORTHANC_ASSERT(maxValue > minValue); + } + + ORTHANC_FORCE_INLINE void AddPixel(PixelType p) + { + if (p <= minValue_) + { + hd_.bins[0] += 1; + } + else if (p >= maxValue_) + { + hd_.bins.back() += 1; + } + else + { + double distanceFromMin = p - minValue_; + size_t binIndex = static_cast( + std::floor(distanceFromMin * division_)); + if (binIndex >= hd_.bins.size()) + binIndex = hd_.bins.size() - 1; + hd_.bins[binIndex] += 1; + } + } + private: + HistogramData& hd_; + double minValue_; + double maxValue_; + double division_; + }; + + template + struct Histogram + { + typedef typename PixelTraits::PixelType PixelType; + + static void Apply(const Orthanc::ImageAccessor& img, HistogramData& hd, + double minValue = 0, + double maxValue = 0) + { + ORTHANC_ASSERT(Format == img.GetFormat(), + "Internal error. Wrong template histogram type"); + + const size_t height = img.GetHeight(); + const size_t width = img.GetHeight(); + + if ((minValue == 0) && (maxValue == 0)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + //ORTHANC_ASSERT(boost::is_integral::value, + // "Min and max values must be supplied for float-based histogram"); + // + //PixelTraits::SetMinValue(minValue); + //PixelTraits::SetMaxValue(maxValue); + } + + hd.minValue = minValue; + + // the following code is not really pretty but ensures + size_t numBins = static_cast( + std::ceil((maxValue - minValue) / hd.binSize)); + + hd.bins.resize(numBins); + std::fill(hd.bins.begin(), hd.bins.end(), 0); + + PixelBinner binner(hd, minValue, maxValue); + for (uint32_t y = 0; y < height; ++y) + { + const PixelType* curPix = reinterpret_cast( + img.GetConstRow(y)); + + for (uint32_t x = 0; x < width; x++, curPix++) + { + binner.AddPixel(*curPix); + } + } + } + }; + + + template + struct ComputeMinMax__ + { + typedef typename PixelTraits::PixelType PixelType; + + static void Apply(const Orthanc::ImageAccessor& img, + PixelType& minValue, PixelType& maxValue) + { + ORTHANC_ASSERT(Format == img.GetFormat(), + "Internal error. Wrong template histogram type"); + + const size_t height = img.GetHeight(); + const size_t width = img.GetHeight(); + + if (height * width == 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + // min and max are crossed below. Think about it. This is OK :) + PixelTraits::SetMaxValue(minValue); + PixelTraits::SetMinValue(maxValue); + + for (uint32_t y = 0; y < height; ++y) + { + const PixelType* curPix = reinterpret_cast( + img.GetConstRow(y)); + + for (uint32_t x = 0; x < width; x++, curPix++) + { + if (*curPix <= minValue) + minValue = *curPix; + if (*curPix >= maxValue) + maxValue = *curPix; + } + } + } + }; + + template + void ComputeMinMax_(const Orthanc::ImageAccessor& img, + double& minValue, double& maxValue) + { + typedef typename PixelTraits::PixelType PixelType; + PixelType minValuePix = PixelType(); + PixelType maxValuePix = PixelType(); + ComputeMinMax__::Apply(img, minValuePix, maxValuePix); + minValue = static_cast(minValuePix); + maxValue = static_cast(maxValuePix); + } + + template + void ComputeHistogram_(const Orthanc::ImageAccessor& img, HistogramData& hd) + { + typedef typename PixelTraits::PixelType PixelType; + PixelType minValue = PixelType(); + PixelType maxValue = PixelType(); + ComputeMinMax__::Apply(img, minValue, maxValue); + + // make bins a little bigger to center integer pixel values + Histogram::Apply(img, hd, + static_cast(minValue) - 0.5, + static_cast(maxValue) + 0.5); + } + } + + void ComputeHistogram(const Orthanc::ImageAccessor& img, + HistogramData& hd, double binSize) + { + using namespace Orthanc; + + hd.binSize = binSize; + + // dynamic/static bridge + switch (img.GetFormat()) + { + case PixelFormat_Grayscale8: + ComputeHistogram_ (img, hd); + break; + case PixelFormat_Grayscale16: + ComputeHistogram_ (img, hd); + break; + case PixelFormat_SignedGrayscale16: + ComputeHistogram_(img, hd); + break; + case PixelFormat_Float32: + ComputeHistogram_ (img, hd); + break; + case PixelFormat_Grayscale32: + ComputeHistogram_ (img, hd); + break; + case PixelFormat_Grayscale64: + ComputeHistogram_ (img, hd); + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + } + + void ComputeMinMax(const Orthanc::ImageAccessor& img, + double& minValue, double& maxValue) + { + using namespace Orthanc; + + // dynamic/static bridge + switch (img.GetFormat()) + { + case PixelFormat_Grayscale8: + ComputeMinMax_ (img, minValue, maxValue); + break; + case PixelFormat_Grayscale16: + ComputeMinMax_ (img, minValue, maxValue); + break; + case PixelFormat_SignedGrayscale16: + ComputeMinMax_(img, minValue, maxValue); + break; + case PixelFormat_Float32: + ComputeMinMax_ (img, minValue, maxValue); + break; + case PixelFormat_Grayscale32: + ComputeMinMax_ (img, minValue, maxValue); + break; + case PixelFormat_Grayscale64: + ComputeMinMax_ (img, minValue, maxValue); + break; + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + } + + void DumpHistogramResult(std::string& s, const HistogramData& hd) + { + std::stringstream ss; + ss << "Histogram:\n"; + ss << "==========\n"; + ss << "\n"; + ss << "minValue : " << hd.minValue << "\n"; + ss << "binSize : " << hd.binSize << "\n"; + ss << "bins.size() : " << hd.bins.size() << "\n"; + ss << "bins :\n"; + double curBinStart = hd.minValue; + size_t pixCount = 0; + for (size_t i = 0; i < hd.bins.size(); ++i) + { + ss << "index: " << i << " (from " << curBinStart << " to " + << curBinStart + hd.binSize << ") : " << hd.bins[i] << " pixels\n"; + curBinStart += hd.binSize; + pixCount += hd.bins[i]; + } + ss << "total pix. count: " << pixCount << "\n"; + s = ss.str(); + } + + + bool ImageToolbox::IsDecodingSupported(Orthanc::DicomTransferSyntax& transferSyntax) + { + switch (transferSyntax) + { + case Orthanc::DicomTransferSyntax_LittleEndianImplicit: + case Orthanc::DicomTransferSyntax_LittleEndianExplicit: + case Orthanc::DicomTransferSyntax_DeflatedLittleEndianExplicit: + case Orthanc::DicomTransferSyntax_BigEndianExplicit: + case Orthanc::DicomTransferSyntax_RLELossless: + return true; + +#if (ORTHANC_ENABLE_DCMTK == 1) && (ORTHANC_ENABLE_DCMTK_JPEG == 1) + case Orthanc::DicomTransferSyntax_JPEGProcess1: + case Orthanc::DicomTransferSyntax_JPEGProcess2_4: + case Orthanc::DicomTransferSyntax_JPEGProcess14: + case Orthanc::DicomTransferSyntax_JPEGProcess14SV1: + return true; +#endif + +#if (ORTHANC_ENABLE_DCMTK == 1) && (ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS == 1) + case Orthanc::DicomTransferSyntax_JPEGLSLossless: + case Orthanc::DicomTransferSyntax_JPEGLSLossy: + return true; +#endif + + default: + return false; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ImageToolbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ImageToolbox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,82 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "LinearAlgebra.h" + +#include + +namespace OrthancStone +{ + + /** + This structure represents the result of an histogram computation + + bins[0] contains the values in [minValue , minValue + binSize [ + bins[1] contains the values in [minValue + binSize, minValue + 2*binSize [ + bins[2] contains the values in [minValue + 2*binSize, minValue + 3*binSize [ + ... + bins[N-1] contains the values in [minValue + (N-1)*binSize, minValue + N*binSize [ + + */ + struct HistogramData + { + std::vector bins; + double minValue; + double binSize; + }; + + /** + Dumps the supplied histogram to the supplied strings + */ + void DumpHistogramResult(std::string& s, const HistogramData& hd); + + /** + This will compute the histogram of the supplied image (count the number of + pixels). + + The image must contain arithmetic pixels (that is, having a single component, + integer or float). Compound pixel types like RGB, YUV are not supported and + will cause this function to throw an exception. + + The range of available values will be split in sets of size `binSize`, and + each set will contain the number of pixels in the given bin + (see HistogramResult above). + */ + void ComputeHistogram(const Orthanc::ImageAccessor& img, + HistogramData& hd, double binSize); + + + /** + Computes the min max values in an image + */ + void ComputeMinMax(const Orthanc::ImageAccessor& img, + double& minValue, double& maxValue); + + + class ImageToolbox + { + public: + static bool IsDecodingSupported(Orthanc::DicomTransferSyntax& transferSyntax); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/LinearAlgebra.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/LinearAlgebra.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,751 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "LinearAlgebra.h" + +#include "../StoneException.h" +#include "GenericToolbox.h" + +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace OrthancStone +{ + namespace LinearAlgebra + { + void Print(const Vector& v) + { + for (size_t i = 0; i < v.size(); i++) + { + printf("%g\n", v[i]); + //printf("%8.2f\n", v[i]); + } + printf("\n"); + } + + + void Print(const Matrix& m) + { + for (size_t i = 0; i < m.size1(); i++) + { + for (size_t j = 0; j < m.size2(); j++) + { + printf("%g ", m(i,j)); + //printf("%8.2f ", m(i,j)); + } + printf("\n"); + } + printf("\n"); + } + + + bool ParseVector(Vector& target, + const std::string& value) + { + std::vector items; + Orthanc::Toolbox::TokenizeString(items, Orthanc::Toolbox::StripSpaces(value), '\\'); + + target.resize(items.size()); + + for (size_t i = 0; i < items.size(); i++) + { + /** + * SJO - 2019-11-19 - WARNING: I reverted from "std::stod()" + * to "boost::lexical_cast", as both "std::stod()" and + * "std::strtod()" are sensitive to locale settings, making + * this code non portable and very dangerous as it fails + * silently. A string such as "1.3671875\1.3671875" is + * interpreted as "1\1", because "std::stod()" expects a comma + * (",") instead of a point ("."). This problem is notably + * seen in Qt-based applications, that somehow set locales + * aggressively. + * + * "boost::lexical_cast<>" is also dependent on the locale + * settings, but apparently not in a way that makes this + * function fail with Qt. The Orthanc core defines macro + * "-DBOOST_LEXICAL_CAST_ASSUME_C_LOCALE" in static builds to + * this end. + **/ + +#if 0 // __cplusplus >= 201103L // Is C++11 enabled? + /** + * We try and avoid the use of "boost::lexical_cast<>" here, + * as it is very slow, and as Stone has to parse many doubles. + * https://tinodidriksen.com/2011/05/cpp-convert-string-to-double-speed/ + **/ + + try + { + target[i] = std::stod(items[i]); + } + catch (std::exception&) + { + target.clear(); + return false; + } + +#elif 0 + /** + * "std::strtod()" is the recommended alternative to + * "std::stod()". It is apparently as fast as plain-C + * "atof()", with more security. + **/ + char* end = NULL; + target[i] = std::strtod(items[i].c_str(), &end); + if (end == NULL || + end != items[i].c_str() + items[i].size()) + { + return false; + } + +#elif 1 + /** + * Use of our homemade implementation of + * "boost::lexical_cast()". It is much faster than boost. + **/ + if (!GenericToolbox::StringToDouble(target[i], items[i].c_str())) + { + return false; + } + +#else + /** + * Fallback implementation using Boost (slower, but somehow + * independent to locale contrarily to "std::stod()", and + * generic as it does not use our custom implementation). + **/ + try + { + target[i] = boost::lexical_cast(items[i]); + } + catch (boost::bad_lexical_cast&) + { + target.clear(); + return false; + } +#endif + } + + return true; + } + + + bool ParseVector(Vector& target, + const Orthanc::DicomMap& dataset, + const Orthanc::DicomTag& tag) + { + std::string value; + return (dataset.LookupStringValue(value, tag, false) && + ParseVector(target, value)); + } + + + void NormalizeVector(Vector& u) + { + double norm = boost::numeric::ublas::norm_2(u); + if (!IsCloseToZero(norm)) + { + u = u / norm; + } + } + + void CrossProduct(Vector& result, + const Vector& u, + const Vector& v) + { + if (u.size() != 3 || + v.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + result.resize(3); + + result[0] = u[1] * v[2] - u[2] * v[1]; + result[1] = u[2] * v[0] - u[0] * v[2]; + result[2] = u[0] * v[1] - u[1] * v[0]; + } + + double DotProduct(const Vector& u, const Vector& v) + { + if (u.size() != 3 || + v.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]); + } + + void FillMatrix(Matrix& target, + size_t rows, + size_t columns, + const double values[]) + { + target.resize(rows, columns); + + size_t index = 0; + + for (size_t y = 0; y < rows; y++) + { + for (size_t x = 0; x < columns; x++, index++) + { + target(y, x) = values[index]; + } + } + } + + + void FillVector(Vector& target, + size_t size, + const double values[]) + { + target.resize(size); + + for (size_t i = 0; i < size; i++) + { + target[i] = values[i]; + } + } + + + void Convert(Matrix& target, + const Vector& source) + { + const size_t n = source.size(); + + target.resize(n, 1); + + for (size_t i = 0; i < n; i++) + { + target(i, 0) = source[i]; + } + } + + + double ComputeDeterminant(const Matrix& a) + { + if (a.size1() != a.size2()) + { + LOG(ERROR) << "Determinant only exists for square matrices"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + // https://en.wikipedia.org/wiki/Rule_of_Sarrus + if (a.size1() == 1) + { + return a(0,0); + } + else if (a.size1() == 2) + { + return a(0,0) * a(1,1) - a(0,1) * a(1,0); + } + else if (a.size1() == 3) + { + return (a(0,0) * a(1,1) * a(2,2) + + a(0,1) * a(1,2) * a(2,0) + + a(0,2) * a(1,0) * a(2,1) - + a(2,0) * a(1,1) * a(0,2) - + a(2,1) * a(1,2) * a(0,0) - + a(2,2) * a(1,0) * a(0,1)); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + bool IsOrthogonalMatrix(const Matrix& q, + double threshold) + { + // https://en.wikipedia.org/wiki/Orthogonal_matrix + + if (q.size1() != q.size2()) + { + LOG(ERROR) << "An orthogonal matrix must be squared"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + using namespace boost::numeric::ublas; + + const Matrix check = prod(trans(q), q) - identity_matrix(q.size1()); + + type_traits::real_type norm = norm_inf(check); + + return (norm <= threshold); + } + + + bool IsOrthogonalMatrix(const Matrix& q) + { + return IsOrthogonalMatrix(q, 10.0 * std::numeric_limits::epsilon()); + } + + + bool IsRotationMatrix(const Matrix& r, + double threshold) + { + return (IsOrthogonalMatrix(r, threshold) && + IsNear(ComputeDeterminant(r), 1.0, threshold)); + } + + + bool IsRotationMatrix(const Matrix& r) + { + return IsRotationMatrix(r, 10.0 * std::numeric_limits::epsilon()); + } + + + void InvertUpperTriangularMatrix(Matrix& output, + const Matrix& k) + { + if (k.size1() != k.size2()) + { + LOG(ERROR) << "Determinant only exists for square matrices"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + output.resize(k.size1(), k.size2()); + + for (size_t i = 1; i < k.size1(); i++) + { + for (size_t j = 0; j < i; j++) + { + if (!IsCloseToZero(k(i, j))) + { + LOG(ERROR) << "Not an upper triangular matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + output(i, j) = 0; // The output is also upper triangular + } + } + + if (k.size1() == 3) + { + // https://math.stackexchange.com/a/1004181 + double a = k(0, 0); + double b = k(0, 1); + double c = k(0, 2); + double d = k(1, 1); + double e = k(1, 2); + double f = k(2, 2); + + if (IsCloseToZero(a) || + IsCloseToZero(d) || + IsCloseToZero(f)) + { + LOG(ERROR) << "Singular upper triangular matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + output(0, 0) = 1.0 / a; + output(0, 1) = -b / (a * d); + output(0, 2) = (b * e - c * d) / (a * f * d); + output(1, 1) = 1.0 / d; + output(1, 2) = -e / (f * d); + output(2, 2) = 1.0 / f; + } + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + static void GetGivensComponent(double& c, + double& s, + const Matrix& a, + size_t i, + size_t j) + { + assert(i < 3 && j < 3); + + double x = a(i, i); + double y = a(i, j); + double n = sqrt(x * x + y * y); + + if (IsCloseToZero(n)) + { + c = 1; + s = 0; + } + else + { + c = x / n; + s = -y / n; + } + } + + + /** + * This function computes the RQ decomposition of a 3x3 matrix, + * using Givens rotations. Reference: Algorithm A4.1 (page 579) of + * "Multiple View Geometry in Computer Vision" (2nd edition). The + * output matrix "Q" is a rotation matrix, and "R" is upper + * triangular. + **/ + void RQDecomposition3x3(Matrix& r, + Matrix& q, + const Matrix& a) + { + using namespace boost::numeric::ublas; + + if (a.size1() != 3 || + a.size2() != 3) + { + LOG(ERROR) << "Only applicable to a 3x3 matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + r.resize(3, 3); + q.resize(3, 3); + + r = a; + q = identity_matrix(3); + + { + // Set A(2,1) to zero + double c, s; + GetGivensComponent(c, s, r, 2, 1); + + double v[9] = { 1, 0, 0, + 0, c, -s, + 0, s, c }; + + Matrix g; + FillMatrix(g, 3, 3, v); + + r = prod(r, g); + q = prod(trans(g), q); + } + + + { + // Set A(2,0) to zero + double c, s; + GetGivensComponent(c, s, r, 2, 0); + + double v[9] = { c, 0, -s, + 0, 1, 0, + s, 0, c }; + + Matrix g; + FillMatrix(g, 3, 3, v); + + r = prod(r, g); + q = prod(trans(g), q); + } + + + { + // Set A(1,0) to zero + double c, s; + GetGivensComponent(c, s, r, 1, 0); + + double v[9] = { c, -s, 0, + s, c, 0, + 0, 0, 1 }; + + Matrix g; + FillMatrix(g, 3, 3, v); + + r = prod(r, g); + q = prod(trans(g), q); + } + + if (!IsCloseToZero(norm_inf(prod(r, q) - a)) || + !IsRotationMatrix(q) || + !IsCloseToZero(r(1, 0)) || + !IsCloseToZero(r(2, 0)) || + !IsCloseToZero(r(2, 1))) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + bool InvertMatrixUnsafe(Matrix& target, + const Matrix& source) + { + if (source.size1() != source.size2()) + { + LOG(ERROR) << "Inverse only exists for square matrices"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (source.size1() < 4) + { + // For matrices with size below 4, use direct computations + // instead of LU decomposition + + if (source.size1() == 0) + { + // By convention, the inverse of the empty matrix, is itself the empty matrix + target.resize(0, 0); + return true; + } + + double determinant = ComputeDeterminant(source); + + if (IsCloseToZero(determinant)) + { + return false; + } + + double denominator = 1.0 / determinant; + + target.resize(source.size1(), source.size2()); + + if (source.size1() == 1) + { + target(0, 0) = denominator; + + return true; + } + else if (source.size1() == 2) + { + // https://en.wikipedia.org/wiki/Invertible_matrix#Inversion_of_2_%C3%97_2_matrices + target(0, 0) = source(1, 1) * denominator; + target(0, 1) = -source(0, 1) * denominator; + target(1, 0) = -source(1, 0) * denominator; + target(1, 1) = source(0, 0) * denominator; + + return true; + } + else if (source.size1() == 3) + { + // https://en.wikipedia.org/wiki/Invertible_matrix#Inversion_of_3_%C3%97_3_matrices + const double a = source(0, 0); + const double b = source(0, 1); + const double c = source(0, 2); + const double d = source(1, 0); + const double e = source(1, 1); + const double f = source(1, 2); + const double g = source(2, 0); + const double h = source(2, 1); + const double i = source(2, 2); + + target(0, 0) = (e * i - f * h) * denominator; + target(0, 1) = -(b * i - c * h) * denominator; + target(0, 2) = (b * f - c * e) * denominator; + target(1, 0) = -(d * i - f * g) * denominator; + target(1, 1) = (a * i - c * g) * denominator; + target(1, 2) = -(a * f - c * d) * denominator; + target(2, 0) = (d * h - e * g) * denominator; + target(2, 1) = -(a * h - b * g) * denominator; + target(2, 2) = (a * e - b * d) * denominator; + + return true; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + else + { + // General case, using LU decomposition + + Matrix a = source; // Copy the source matrix, as "lu_factorize()" modifies it + + boost::numeric::ublas::permutation_matrix permutation(source.size1()); + + if (boost::numeric::ublas::lu_factorize(a, permutation) != 0) + { + return false; + } + else + { + target = boost::numeric::ublas::identity_matrix(source.size1()); + lu_substitute(a, permutation, target); + return true; + } + } + } + + + + void InvertMatrix(Matrix& target, + const Matrix& source) + { + if (!InvertMatrixUnsafe(target, source)) + { + LOG(ERROR) << "Cannot invert singular matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void CreateSkewSymmetric(Matrix& s, + const Vector& v) + { + if (v.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + s.resize(3, 3); + s(0,0) = 0; + s(0,1) = -v[2]; + s(0,2) = v[1]; + s(1,0) = v[2]; + s(1,1) = 0; + s(1,2) = -v[0]; + s(2,0) = -v[1]; + s(2,1) = v[0]; + s(2,2) = 0; + } + + + Matrix InvertScalingTranslationMatrix(const Matrix& t) + { + if (t.size1() != 4 || + t.size2() != 4 || + !LinearAlgebra::IsCloseToZero(t(0,1)) || + !LinearAlgebra::IsCloseToZero(t(0,2)) || + !LinearAlgebra::IsCloseToZero(t(1,0)) || + !LinearAlgebra::IsCloseToZero(t(1,2)) || + !LinearAlgebra::IsCloseToZero(t(2,0)) || + !LinearAlgebra::IsCloseToZero(t(2,1)) || + !LinearAlgebra::IsCloseToZero(t(3,0)) || + !LinearAlgebra::IsCloseToZero(t(3,1)) || + !LinearAlgebra::IsCloseToZero(t(3,2))) + { + LOG(ERROR) << "This matrix is more than a zoom/translate transform"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + const double sx = t(0,0); + const double sy = t(1,1); + const double sz = t(2,2); + const double w = t(3,3); + + if (LinearAlgebra::IsCloseToZero(sx) || + LinearAlgebra::IsCloseToZero(sy) || + LinearAlgebra::IsCloseToZero(sz) || + LinearAlgebra::IsCloseToZero(w)) + { + LOG(ERROR) << "Singular transform"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + const double tx = t(0,3); + const double ty = t(1,3); + const double tz = t(2,3); + + Matrix m = IdentityMatrix(4); + + m(0,0) = 1.0 / sx; + m(1,1) = 1.0 / sy; + m(2,2) = 1.0 / sz; + m(3,3) = 1.0 / w; + + m(0,3) = -tx / (sx * w); + m(1,3) = -ty / (sy * w); + m(2,3) = -tz / (sz * w); + + return m; + } + + + bool IsShearMatrix(const Matrix& shear) + { + return (shear.size1() == 4 && + shear.size2() == 4 && + LinearAlgebra::IsNear(1.0, shear(0,0)) && + LinearAlgebra::IsNear(0.0, shear(0,1)) && + LinearAlgebra::IsNear(0.0, shear(0,3)) && + LinearAlgebra::IsNear(0.0, shear(1,0)) && + LinearAlgebra::IsNear(1.0, shear(1,1)) && + LinearAlgebra::IsNear(0.0, shear(1,3)) && + LinearAlgebra::IsNear(0.0, shear(2,0)) && + LinearAlgebra::IsNear(0.0, shear(2,1)) && + LinearAlgebra::IsNear(1.0, shear(2,2)) && + LinearAlgebra::IsNear(0.0, shear(2,3)) && + LinearAlgebra::IsNear(0.0, shear(3,0)) && + LinearAlgebra::IsNear(0.0, shear(3,1)) && + LinearAlgebra::IsNear(1.0, shear(3,3))); + } + + + Matrix InvertShearMatrix(const Matrix& shear) + { + if (!IsShearMatrix(shear)) + { + LOG(ERROR) << "Not a valid shear matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + Matrix m = IdentityMatrix(4); + m(0,2) = -shear(0,2); + m(1,2) = -shear(1,2); + m(3,2) = -shear(3,2); + + return m; + } + } + + std::ostream& operator<<(std::ostream& s, const Vector& vec) + { + s << "("; + for (size_t i = 0; i < vec.size(); ++i) + { + s << vec(i); + if (i < (vec.size() - 1)) + s << ", "; + } + s << ")"; + return s; + } + + std::ostream& operator<<(std::ostream& s, const Matrix& m) + { + ORTHANC_ASSERT(m.size1() == m.size2()); + s << "("; + for (size_t i = 0; i < m.size1(); ++i) + { + s << "("; + for (size_t j = 0; j < m.size2(); ++j) + { + s << m(i,j); + if (j < (m.size2() - 1)) + s << ", "; + } + s << ")"; + if (i < (m.size1() - 1)) + s << ", "; + } + s << ")"; + return s; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/LinearAlgebra.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/LinearAlgebra.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,299 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +// Patch for ublas in Boost 1.64.0 +// https://github.com/dealii/dealii/issues/4302 +#include +#if BOOST_VERSION >= 106300 // or 64, need to check +# include +#endif + +#include + +#include +#include + +namespace OrthancStone +{ + typedef boost::numeric::ublas::matrix Matrix; + typedef boost::numeric::ublas::vector Vector; + + // logs, debugging... + std::ostream& operator<<(std::ostream& s, const Vector& vec); + std::ostream& operator<<(std::ostream& s, const Matrix& m); + + namespace LinearAlgebra + { + void Print(const Vector& v); + + void Print(const Matrix& m); + + bool ParseVector(Vector& target, + const std::string& s); + + bool ParseVector(Vector& target, + const Orthanc::DicomMap& dataset, + const Orthanc::DicomTag& tag); + + inline void AssignVector(Vector& v, + double v1, + double v2) + { + v.resize(2); + v[0] = v1; + v[1] = v2; + } + + + inline void AssignVector(Vector& v, + double v1) + { + v.resize(1); + v[0] = v1; + } + + + inline void AssignVector(Vector& v, + double v1, + double v2, + double v3) + { + v.resize(3); + v[0] = v1; + v[1] = v2; + v[2] = v3; + } + + + inline void AssignVector(Vector& v, + double v1, + double v2, + double v3, + double v4) + { + v.resize(4); + v[0] = v1; + v[1] = v2; + v[2] = v3; + v[3] = v4; + } + + + inline Vector CreateVector(double v1) + { + Vector v; + AssignVector(v, v1); + return v; + } + + + inline Vector CreateVector(double v1, + double v2) + { + Vector v; + AssignVector(v, v1, v2); + return v; + } + + + inline Vector CreateVector(double v1, + double v2, + double v3) + { + Vector v; + AssignVector(v, v1, v2, v3); + return v; + } + + + inline Vector CreateVector(double v1, + double v2, + double v3, + double v4) + { + Vector v; + AssignVector(v, v1, v2, v3, v4); + return v; + } + + + inline bool IsNear(double x, + double y, + double threshold) + { + return fabs(x - y) <= threshold; + } + + inline bool IsNear(double x, + double y) + { + // As most input is read as single-precision numbers, we take the + // epsilon machine for float32 into consideration to compare numbers + return IsNear(x, y, 10.0 * std::numeric_limits::epsilon()); + } + + inline bool IsCloseToZero(double x) + { + return IsNear(x, 0.0); + } + + void NormalizeVector(Vector& u); + + void CrossProduct(Vector& result, + const Vector& u, + const Vector& v); + + double DotProduct(const Vector& u, const Vector& v); + + void FillMatrix(Matrix& target, + size_t rows, + size_t columns, + const double values[]); + + void FillVector(Vector& target, + size_t size, + const double values[]); + + void Convert(Matrix& target, + const Vector& source); + + inline Matrix Transpose(const Matrix& a) + { + return boost::numeric::ublas::trans(a); + } + + + inline Matrix IdentityMatrix(size_t size) + { + return boost::numeric::ublas::identity_matrix(size); + } + + + inline Matrix ZeroMatrix(size_t size1, + size_t size2) + { + return boost::numeric::ublas::zero_matrix(size1, size2); + } + + + inline Matrix Product(const Matrix& a, + const Matrix& b) + { + return boost::numeric::ublas::prod(a, b); + } + + + inline Vector Product(const Matrix& a, + const Vector& b) + { + return boost::numeric::ublas::prod(a, b); + } + + + inline Matrix Product(const Matrix& a, + const Matrix& b, + const Matrix& c) + { + return Product(a, Product(b, c)); + } + + + inline Matrix Product(const Matrix& a, + const Matrix& b, + const Matrix& c, + const Matrix& d) + { + return Product(a, Product(b, c, d)); + } + + + inline Matrix Product(const Matrix& a, + const Matrix& b, + const Matrix& c, + const Matrix& d, + const Matrix& e) + { + return Product(a, Product(b, c, d, e)); + } + + + inline Vector Product(const Matrix& a, + const Matrix& b, + const Vector& c) + { + return Product(Product(a, b), c); + } + + + inline Vector Product(const Matrix& a, + const Matrix& b, + const Matrix& c, + const Vector& d) + { + return Product(Product(a, b, c), d); + } + + + double ComputeDeterminant(const Matrix& a); + + bool IsOrthogonalMatrix(const Matrix& q, + double threshold); + + bool IsOrthogonalMatrix(const Matrix& q); + + bool IsRotationMatrix(const Matrix& r, + double threshold); + + bool IsRotationMatrix(const Matrix& r); + + void InvertUpperTriangularMatrix(Matrix& output, + const Matrix& k); + + /** + * This function computes the RQ decomposition of a 3x3 matrix, + * using Givens rotations. Reference: Algorithm A4.1 (page 579) of + * "Multiple View Geometry in Computer Vision" (2nd edition). The + * output matrix "Q" is a rotation matrix, and "R" is upper + * triangular. + **/ + void RQDecomposition3x3(Matrix& r, + Matrix& q, + const Matrix& a); + + void InvertMatrix(Matrix& target, + const Matrix& source); + + // This is the same as "InvertMatrix()", but without exception + bool InvertMatrixUnsafe(Matrix& target, + const Matrix& source); + + void CreateSkewSymmetric(Matrix& s, + const Vector& v); + + Matrix InvertScalingTranslationMatrix(const Matrix& t); + + bool IsShearMatrix(const Matrix& shear); + + Matrix InvertShearMatrix(const Matrix& shear); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,132 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomDatasetReader.h" + +#include +#include + +#include + +namespace OrthancStone +{ + DicomDatasetReader::DicomDatasetReader(const IDicomDataset& dataset) : + dataset_(dataset) + { + } + + + std::string DicomDatasetReader::GetStringValue(const DicomPath& path, + const std::string& defaultValue) const + { + std::string s; + if (dataset_.GetStringValue(s, path)) + { + return s; + } + else + { + return defaultValue; + } + } + + + std::string DicomDatasetReader::GetMandatoryStringValue(const DicomPath& path) const + { + std::string s; + if (dataset_.GetStringValue(s, path)) + { + return s; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentTag); + } + } + + + template + static bool GetValueInternal(T& target, + const IDicomDataset& dataset, + const DicomPath& path) + { + try + { + std::string s; + + if (dataset.GetStringValue(s, path)) + { + target = boost::lexical_cast(Orthanc::Toolbox::StripSpaces(s)); + return true; + } + else + { + return false; + } + } + catch (boost::bad_lexical_cast&) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + bool DicomDatasetReader::GetIntegerValue(int& target, + const DicomPath& path) const + { + return GetValueInternal(target, dataset_, path); + } + + + bool DicomDatasetReader::GetUnsignedIntegerValue(unsigned int& target, + const DicomPath& path) const + { + int value; + + if (!GetIntegerValue(value, path)) + { + return false; + } + else if (value >= 0) + { + target = static_cast(value); + return true; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + bool DicomDatasetReader::GetFloatValue(float& target, + const DicomPath& path) const + { + return GetValueInternal(target, dataset_, path); + } + + + bool DicomDatasetReader::GetDoubleValue(double& target, + const DicomPath& path) const + { + return GetValueInternal(target, dataset_, path); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,61 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IDicomDataset.h" + +#include +#include + +namespace OrthancStone +{ + class DicomDatasetReader : public boost::noncopyable + { + private: + const IDicomDataset& dataset_; + + public: + DicomDatasetReader(const IDicomDataset& dataset); + + const IDicomDataset& GetDataset() const + { + return dataset_; + } + + std::string GetStringValue(const DicomPath& path, + const std::string& defaultValue) const; + + std::string GetMandatoryStringValue(const DicomPath& path) const; + + bool GetIntegerValue(int& target, + const DicomPath& path) const; + + bool GetUnsignedIntegerValue(unsigned int& target, + const DicomPath& path) const; + + bool GetFloatValue(float& target, + const DicomPath& path) const; + + bool GetDoubleValue(double& target, + const DicomPath& path) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/DicomPath.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/DicomPath.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,112 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomPath.h" + +#include + +#include + +namespace OrthancStone +{ + const DicomPath::Prefix& DicomPath::GetPrefixItem(size_t depth) const + { + if (depth >= prefix_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + return prefix_[depth]; + } + } + + + DicomPath::Prefix& DicomPath::GetPrefixItem(size_t depth) + { + if (depth >= prefix_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + return prefix_[depth]; + } + } + + + DicomPath::DicomPath(const Orthanc::DicomTag& sequence, + size_t index, + const Orthanc::DicomTag& tag) : + finalTag_(tag) + { + AddToPrefix(sequence, index); + } + + + DicomPath::DicomPath(const Orthanc::DicomTag& sequence1, + size_t index1, + const Orthanc::DicomTag& sequence2, + size_t index2, + const Orthanc::DicomTag& tag) : + finalTag_(tag) + { + AddToPrefix(sequence1, index1); + AddToPrefix(sequence2, index2); + } + + + DicomPath::DicomPath(const Orthanc::DicomTag& sequence1, + size_t index1, + const Orthanc::DicomTag& sequence2, + size_t index2, + const Orthanc::DicomTag& sequence3, + size_t index3, + const Orthanc::DicomTag& tag) : + finalTag_(tag) + { + AddToPrefix(sequence1, index1); + AddToPrefix(sequence2, index2); + AddToPrefix(sequence3, index3); + } + + + static std::string FormatHexadecimal(const Orthanc::DicomTag& tag) + { + char buf[16]; + sprintf(buf, "(%04x,%04x)", tag.GetGroup(), tag.GetElement()); + return buf; + } + + + std::string DicomPath::Format() const + { + std::string s; + + for (size_t i = 0; i < GetPrefixLength(); i++) + { + s += (FormatHexadecimal(GetPrefixTag(i)) + " / " + + boost::lexical_cast(i) + " / "); + } + + return s + FormatHexadecimal(GetFinalTag()); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/DicomPath.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/DicomPath.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,106 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include +#include + +namespace OrthancStone +{ + class DicomPath + { + private: + typedef std::pair Prefix; + + std::vector prefix_; + Orthanc::DicomTag finalTag_; + + const Prefix& GetPrefixItem(size_t depth) const; + + Prefix& GetPrefixItem(size_t depth); + + public: + DicomPath(const Orthanc::DicomTag& finalTag) : + finalTag_(finalTag) + { + } + + DicomPath(const Orthanc::DicomTag& sequence, + size_t index, + const Orthanc::DicomTag& tag); + + DicomPath(const Orthanc::DicomTag& sequence1, + size_t index1, + const Orthanc::DicomTag& sequence2, + size_t index2, + const Orthanc::DicomTag& tag); + + DicomPath(const Orthanc::DicomTag& sequence1, + size_t index1, + const Orthanc::DicomTag& sequence2, + size_t index2, + const Orthanc::DicomTag& sequence3, + size_t index3, + const Orthanc::DicomTag& tag); + + void AddToPrefix(const Orthanc::DicomTag& tag, + size_t position) + { + prefix_.push_back(std::make_pair(tag, position)); + } + + size_t GetPrefixLength() const + { + return prefix_.size(); + } + + Orthanc::DicomTag GetPrefixTag(size_t depth) const + { + return GetPrefixItem(depth).first; + } + + size_t GetPrefixIndex(size_t depth) const + { + return GetPrefixItem(depth).second; + } + + void SetPrefixIndex(size_t depth, + size_t value) + { + GetPrefixItem(depth).second = value; + } + + const Orthanc::DicomTag& GetFinalTag() const + { + return finalTag_; + } + + void SetFinalTag(const Orthanc::DicomTag& tag) + { + finalTag_ = tag; + } + + std::string Format() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,203 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "FullOrthancDataset.h" + +#include + +#include +#include + +namespace OrthancStone +{ + static const Json::Value* AccessTag(const Json::Value& dataset, + const Orthanc::DicomTag& tag) + { + if (dataset.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + char name[16]; + sprintf(name, "%04x,%04x", tag.GetGroup(), tag.GetElement()); + + if (!dataset.isMember(name)) + { + return NULL; + } + + const Json::Value& value = dataset[name]; + if (value.type() != Json::objectValue || + !value.isMember("Name") || + !value.isMember("Type") || + !value.isMember("Value") || + value["Name"].type() != Json::stringValue || + value["Type"].type() != Json::stringValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + return &value; + } + + + static const Json::Value& GetSequenceContent(const Json::Value& sequence) + { + assert(sequence.type() == Json::objectValue); + assert(sequence.isMember("Type")); + assert(sequence.isMember("Value")); + + const Json::Value& value = sequence["Value"]; + + if (sequence["Type"].asString() != "Sequence" || + value.type() != Json::arrayValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + return value; + } + } + + + static bool GetStringInternal(std::string& result, + const Json::Value& tag) + { + assert(tag.type() == Json::objectValue); + assert(tag.isMember("Type")); + assert(tag.isMember("Value")); + + const Json::Value& value = tag["Value"]; + + if (tag["Type"].asString() != "String" || + value.type() != Json::stringValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + result = value.asString(); + return true; + } + } + + + const Json::Value* FullOrthancDataset::LookupPath(const DicomPath& path) const + { + const Json::Value* content = &root_; + + for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++) + { + const Json::Value* sequence = AccessTag(*content, path.GetPrefixTag(depth)); + if (sequence == NULL) + { + return NULL; + } + + const Json::Value& nextContent = GetSequenceContent(*sequence); + + size_t index = path.GetPrefixIndex(depth); + if (index >= nextContent.size()) + { + return NULL; + } + else + { + content = &nextContent[static_cast(index)]; + } + } + + return AccessTag(*content, path.GetFinalTag()); + } + + + void FullOrthancDataset::CheckRoot() const + { + if (root_.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + FullOrthancDataset::FullOrthancDataset(IOrthancConnection& orthanc, + const std::string& uri) + { + IOrthancConnection::RestApiGet(root_, orthanc, uri); + CheckRoot(); + } + + + FullOrthancDataset::FullOrthancDataset(const std::string& content) + { + IOrthancConnection::ParseJson(root_, content); + CheckRoot(); + } + + + FullOrthancDataset::FullOrthancDataset(const void* content, + size_t size) + { + IOrthancConnection::ParseJson(root_, content, size); + CheckRoot(); + } + + + FullOrthancDataset::FullOrthancDataset(const Json::Value& root) : + root_(root) + { + CheckRoot(); + } + + + bool FullOrthancDataset::GetStringValue(std::string& result, + const DicomPath& path) const + { + const Json::Value* value = LookupPath(path); + + if (value == NULL) + { + return false; + } + else + { + return GetStringInternal(result, *value); + } + } + + + bool FullOrthancDataset::GetSequenceSize(size_t& size, + const DicomPath& path) const + { + const Json::Value* sequence = LookupPath(path); + + if (sequence == NULL) + { + return false; + } + else + { + size = GetSequenceContent(*sequence).size(); + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,62 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOrthancConnection.h" +#include "IDicomDataset.h" + +#include + +namespace OrthancStone +{ + class FullOrthancDataset : public IDicomDataset + { + private: + Json::Value root_; + + const Json::Value* LookupPath(const DicomPath& path) const; + + void CheckRoot() const; + + public: + FullOrthancDataset(IOrthancConnection& orthanc, + const std::string& uri); + + FullOrthancDataset(const std::string& content); + + FullOrthancDataset(const void* content, + size_t size); + + FullOrthancDataset(const Json::Value& root); + + virtual bool GetStringValue(std::string& result, + const DicomPath& path) const; + + virtual bool GetSequenceSize(size_t& size, + const DicomPath& path) const; + + FullOrthancDataset* Clone() const + { + return new FullOrthancDataset(this->root_); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/IDicomDataset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/IDicomDataset.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,44 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "DicomPath.h" + +#include +#include + +namespace OrthancStone +{ + class IDicomDataset : public boost::noncopyable + { + public: + virtual ~IDicomDataset() + { + } + + virtual bool GetStringValue(std::string& result, + const DicomPath& path) const = 0; + + virtual bool GetSequenceSize(size_t& size, + const DicomPath& path) const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/IOrthancConnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/IOrthancConnection.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,86 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "IOrthancConnection.h" + +#include + +#include + +namespace OrthancStone +{ + void IOrthancConnection::ParseJson(Json::Value& result, + const std::string& content) + { + Json::Reader reader; + + if (!reader.parse(content, result)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void IOrthancConnection::ParseJson(Json::Value& result, + const void* content, + size_t size) + { + Json::Reader reader; + + if (!reader.parse(reinterpret_cast(content), + reinterpret_cast(content) + size, result)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + void IOrthancConnection::RestApiGet(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri) + { + std::string content; + orthanc.RestApiGet(content, uri); + ParseJson(result, content); + } + + + void IOrthancConnection::RestApiPost(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body) + { + std::string content; + orthanc.RestApiPost(content, uri, body); + ParseJson(result, content); + } + + + void IOrthancConnection::RestApiPut(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body) + { + std::string content; + orthanc.RestApiPut(content, uri, body); + ParseJson(result, content); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/IOrthancConnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/IOrthancConnection.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,73 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "DicomPath.h" + +#include +#include +#include + +namespace OrthancStone +{ + class IOrthancConnection : public boost::noncopyable + { + public: + virtual ~IOrthancConnection() + { + } + + virtual void RestApiGet(std::string& result, + const std::string& uri) = 0; + + virtual void RestApiPost(std::string& result, + const std::string& uri, + const std::string& body) = 0; + + virtual void RestApiPut(std::string& result, + const std::string& uri, + const std::string& body) = 0; + + virtual void RestApiDelete(const std::string& uri) = 0; + + static void ParseJson(Json::Value& result, + const std::string& content); + + static void ParseJson(Json::Value& result, + const void* content, + size_t size); + + static void RestApiGet(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri); + + static void RestApiPost(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body); + + static void RestApiPut(Json::Value& result, + IOrthancConnection& orthanc, + const std::string& uri, + const std::string& body); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/NOTES.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/NOTES.txt Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,3 @@ +The files from this folder were previously (up to Orthanc <= 1.7.1) +contained in the folder "Plugins/Samples/Common/" from the Orthanc +source distribution. diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,96 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrthancHttpConnection.h" + +namespace OrthancStone +{ + void OrthancHttpConnection::Setup() + { + url_ = client_.GetUrl(); + + // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) + client_.SetRedirectionFollowed(false); + } + + + OrthancHttpConnection::OrthancHttpConnection() : + client_(Orthanc::WebServiceParameters(), "") + { + Setup(); + } + + + OrthancHttpConnection::OrthancHttpConnection(const Orthanc::WebServiceParameters& parameters) : + client_(parameters, "") + { + Setup(); + } + + + void OrthancHttpConnection::RestApiGet(std::string& result, + const std::string& uri) + { + boost::mutex::scoped_lock lock(mutex_); + + client_.SetMethod(Orthanc::HttpMethod_Get); + client_.SetUrl(url_ + uri); + client_.ApplyAndThrowException(result); + } + + + void OrthancHttpConnection::RestApiPost(std::string& result, + const std::string& uri, + const std::string& body) + { + boost::mutex::scoped_lock lock(mutex_); + + client_.SetMethod(Orthanc::HttpMethod_Post); + client_.SetUrl(url_ + uri); + client_.SetBody(body); + client_.ApplyAndThrowException(result); + } + + + void OrthancHttpConnection::RestApiPut(std::string& result, + const std::string& uri, + const std::string& body) + { + boost::mutex::scoped_lock lock(mutex_); + + client_.SetMethod(Orthanc::HttpMethod_Put); + client_.SetUrl(url_ + uri); + client_.SetBody(body); + client_.ApplyAndThrowException(result); + } + + + void OrthancHttpConnection::RestApiDelete(const std::string& uri) + { + boost::mutex::scoped_lock lock(mutex_); + + std::string result; + + client_.SetMethod(Orthanc::HttpMethod_Delete); + client_.SetUrl(url_ + uri); + client_.ApplyAndThrowException(result); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,60 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOrthancConnection.h" + +#include + +#include + +namespace OrthancStone +{ + // This class is thread-safe + class OrthancHttpConnection : public IOrthancConnection + { + private: + boost::mutex mutex_; + Orthanc::HttpClient client_; + std::string url_; + + void Setup(); + + public: + OrthancHttpConnection(); + + OrthancHttpConnection(const Orthanc::WebServiceParameters& parameters); + + virtual void RestApiGet(std::string& result, + const std::string& uri); + + virtual void RestApiPost(std::string& result, + const std::string& uri, + const std::string& body); + + virtual void RestApiPut(std::string& result, + const std::string& uri, + const std::string& body); + + virtual void RestApiDelete(const std::string& uri); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,143 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SimplifiedOrthancDataset.h" + +namespace OrthancStone +{ + const Json::Value* SimplifiedOrthancDataset::LookupPath(const DicomPath& path) const + { + const Json::Value* content = &root_; + + for (unsigned int depth = 0; depth < path.GetPrefixLength(); depth++) + { + const char* name = path.GetPrefixTag(depth).GetName(); + if (content->type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (!content->isMember(name)) + { + return NULL; + } + + const Json::Value& sequence = (*content) [name]; + if (sequence.type() != Json::arrayValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + size_t index = path.GetPrefixIndex(depth); + if (index >= sequence.size()) + { + return NULL; + } + else + { + content = &sequence[static_cast(index)]; + } + } + + const char* name = path.GetFinalTag().GetName(); + + if (content->type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + if (!content->isMember(name)) + { + return NULL; + } + else + { + return &((*content) [name]); + } + } + + + void SimplifiedOrthancDataset::CheckRoot() const + { + if (root_.type() != Json::objectValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + } + + + SimplifiedOrthancDataset::SimplifiedOrthancDataset(IOrthancConnection& orthanc, + const std::string& uri) + { + IOrthancConnection::RestApiGet(root_, orthanc, uri); + CheckRoot(); + } + + + SimplifiedOrthancDataset::SimplifiedOrthancDataset(const std::string& content) + { + IOrthancConnection::ParseJson(root_, content); + CheckRoot(); + } + + + bool SimplifiedOrthancDataset::GetStringValue(std::string& result, + const DicomPath& path) const + { + const Json::Value* value = LookupPath(path); + + if (value == NULL) + { + return false; + } + else if (value->type() != Json::stringValue) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + result = value->asString(); + return true; + } + } + + + bool SimplifiedOrthancDataset::GetSequenceSize(size_t& size, + const DicomPath& path) const + { + const Json::Value* sequence = LookupPath(path); + + if (sequence == NULL) + { + // Inexistent path + return false; + } + else if (sequence->type() != Json::arrayValue) + { + // Not a sequence + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + else + { + size = sequence->size(); + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/OrthancDatasets/SimplifiedOrthancDataset.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "IOrthancConnection.h" +#include "IDicomDataset.h" + +namespace OrthancStone +{ + class SimplifiedOrthancDataset : public IDicomDataset + { + private: + Json::Value root_; + + const Json::Value* LookupPath(const DicomPath& path) const; + + void CheckRoot() const; + + public: + SimplifiedOrthancDataset(IOrthancConnection& orthanc, + const std::string& uri); + + SimplifiedOrthancDataset(const std::string& content); + + virtual bool GetStringValue(std::string& result, + const DicomPath& path) const; + + virtual bool GetSequenceSize(size_t& size, + const DicomPath& path) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ParsedDicomCache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ParsedDicomCache.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,143 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParsedDicomCache.h" + +namespace OrthancStone +{ + class ParsedDicomCache::Item : public Orthanc::ICacheable + { + private: + std::unique_ptr dicom_; + size_t fileSize_; + bool hasPixelData_; + + public: + Item(Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData) : + dicom_(dicom), + fileSize_(fileSize), + hasPixelData_(hasPixelData) + { + if (dicom == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + virtual size_t GetMemoryUsage() const + { + return fileSize_; + } + + Orthanc::ParsedDicomFile& GetDicom() const + { + assert(dicom_.get() != NULL); + return *dicom_; + } + + bool HasPixelData() const + { + return hasPixelData_; + } + }; + + + std::string ParsedDicomCache::GetIndex(unsigned int bucket, + const std::string& bucketKey) + { + return boost::lexical_cast(bucket) + "|" + bucketKey; + } + + + void ParsedDicomCache::Acquire(unsigned int bucket, + const std::string& bucketKey, + Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData) + { + LOG(TRACE) << "new item stored in cache: bucket " << bucket << ", key " << bucketKey; + cache_.Acquire(GetIndex(bucket, bucketKey), new Item(dicom, fileSize, hasPixelData)); + } + + + ParsedDicomCache::Reader::Reader(ParsedDicomCache& cache, + unsigned int bucket, + const std::string& bucketKey) : + /** + * The "DcmFileFormat" object cannot be accessed from multiple + * threads, even if using only getters. An unique lock (mutex) is + * mandatory. + **/ + accessor_(cache.cache_, GetIndex(bucket, bucketKey), true /* unique */) + { + if (accessor_.IsValid()) + { + LOG(TRACE) << "accessing item within cache: bucket " << bucket << ", key " << bucketKey; + item_ = &dynamic_cast(accessor_.GetValue()); + } + else + { + LOG(TRACE) << "missing item within cache: bucket " << bucket << ", key " << bucketKey; + item_ = NULL; + } + } + + + bool ParsedDicomCache::Reader::HasPixelData() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->HasPixelData(); + } + } + + + Orthanc::ParsedDicomFile& ParsedDicomCache::Reader::GetDicom() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->GetDicom(); + } + } + + + size_t ParsedDicomCache::Reader::GetFileSize() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->GetMemoryUsage(); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ParsedDicomCache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ParsedDicomCache.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,80 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace OrthancStone +{ + class ParsedDicomCache : public boost::noncopyable + { + private: + class Item; + + static std::string GetIndex(unsigned int bucket, + const std::string& bucketKey); + + Orthanc::MemoryObjectCache cache_; + + public: + ParsedDicomCache(size_t size) + { + cache_.SetMaximumSize(size); + } + + void Invalidate(unsigned int bucket, + const std::string& bucketKey) + { + cache_.Invalidate(GetIndex(bucket, bucketKey)); + } + + void Acquire(unsigned int bucket, + const std::string& bucketKey, + Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData); + + class Reader : public boost::noncopyable + { + private: + Orthanc::MemoryObjectCache::Accessor accessor_; + Item* item_; + + public: + Reader(ParsedDicomCache& cache, + unsigned int bucket, + const std::string& bucketKey); + + bool IsValid() const + { + return item_ != NULL; + } + + bool HasPixelData() const; + + Orthanc::ParsedDicomFile& GetDicom() const; + + size_t GetFileSize() const; + }; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ParsedDicomDataset.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ParsedDicomDataset.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,104 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParsedDicomDataset.h" + +#include + +namespace OrthancStone +{ + static DcmItem* LookupPath(Orthanc::ParsedDicomFile& dicom, + const DicomPath& path) + { + DcmItem* node = dicom.GetDcmtkObject().getDataset(); + + for (size_t i = 0; i < path.GetPrefixLength(); i++) + { + const Orthanc::DicomTag& tmp = path.GetPrefixTag(i); + DcmTagKey tag(tmp.GetGroup(), tmp.GetElement()); + + DcmSequenceOfItems* sequence = NULL; + if (!node->findAndGetSequence(tag, sequence).good() || + sequence == NULL) + { + return NULL; + } + + unsigned long pos = path.GetPrefixIndex(i); + if (pos >= sequence->card()) + { + return NULL; + } + + node = sequence->getItem(pos); + if (node == NULL) + { + return NULL; + } + } + + return node; + } + + + bool ParsedDicomDataset::GetStringValue(std::string& result, + const DicomPath& path) const + { + DcmItem* node = LookupPath(dicom_, path); + + if (node != NULL) + { + DcmTagKey tag(path.GetFinalTag().GetGroup(), path.GetFinalTag().GetElement()); + + const char* s = NULL; + if (node->findAndGetString(tag, s).good() && + s != NULL) + { + result.assign(s); + return true; + } + } + + return false; + } + + + bool ParsedDicomDataset::GetSequenceSize(size_t& size, + const DicomPath& path) const + { + DcmItem* node = LookupPath(dicom_, path); + + if (node != NULL) + { + DcmTagKey tag(path.GetFinalTag().GetGroup(), path.GetFinalTag().GetElement()); + + DcmSequenceOfItems* s = NULL; + if (node->findAndGetSequence(tag, s).good() && + s != NULL) + { + size = s->card(); + return true; + } + } + + return false; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ParsedDicomDataset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ParsedDicomDataset.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,47 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "OrthancDatasets/IDicomDataset.h" + +#include + +namespace OrthancStone +{ + class ParsedDicomDataset : public IDicomDataset + { + private: + Orthanc::ParsedDicomFile& dicom_; + + public: + ParsedDicomDataset(Orthanc::ParsedDicomFile& dicom) : + dicom_(dicom) + { + } + + virtual bool GetStringValue(std::string& result, + const DicomPath& path) const ORTHANC_OVERRIDE; + + virtual bool GetSequenceSize(size_t& size, + const DicomPath& path) const ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/PixelTestPatterns.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/PixelTestPatterns.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,130 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +// PixelTestPatterns.h + +#pragma once + +#include "../StoneException.h" + +#include + +#include +#include +#include + +namespace OrthancStone +{ + namespace PixelTestPatterns + { + template + inline uint8_t byteAddClip(T v1, U v2) + { + double tmp = static_cast(v1) + static_cast(v2); + if (tmp > 255.0) + tmp = 255; + if (tmp < 0.0) + tmp = 0; + return static_cast(tmp+0.5); + } + + // fills the area with a horizontal gradient. + // leftmost pixels are filled with r0 g0 b0 + // rightmost pixels are filled with r1 g1 b1 + // linear interpolation in-between + inline void fillWithHGradient(Orthanc::ImageAccessor& target, + uint8_t r0, uint8_t g0, uint8_t b0, + uint8_t r1, uint8_t g1, uint8_t b1) + { + if (target.GetFormat() != Orthanc::PixelFormat_RGBA32) { + ORTHANC_ASSERT(false, "Wrong pixel format"); + } + const unsigned int width = target.GetWidth(); + const unsigned int height = target.GetHeight(); + + ORTHANC_ASSERT(width > 0); + ORTHANC_ASSERT(height > 0); + + double invWidth = 1.0 / static_cast(target.GetWidth()); + double rIncr = (static_cast(r1) - static_cast(r0))* invWidth; + double gIncr = (static_cast(g1) - static_cast(g0))* invWidth; + double bIncr = (static_cast(b1) - static_cast(b0))* invWidth; + + for (unsigned int y = 0; y < height; y++) + { + uint8_t r = r0; + uint8_t g = g0; + uint8_t b = b0; + uint8_t* q = reinterpret_cast(target.GetRow(y)); + for (unsigned int x = 0; x < width; x++) + { + q[0] = r; + q[1] = g; + q[2] = b; + q[3] = 255; + r = byteAddClip(r, rIncr); + g = byteAddClip(g, gIncr); + b = byteAddClip(b, bIncr); + q += 4; + } + } + } + + inline void fillWithVGradient(Orthanc::ImageAccessor& target, + uint8_t r0, uint8_t g0, uint8_t b0, + uint8_t r1, uint8_t g1, uint8_t b1) + { + if (target.GetFormat() != Orthanc::PixelFormat_RGBA32) { + ORTHANC_ASSERT(false, "Wrong pixel format"); + } + const unsigned int width = target.GetWidth(); + const unsigned int height = target.GetHeight(); + + ORTHANC_ASSERT(width > 0); + ORTHANC_ASSERT(height > 0); + + double invHeight = 1.0 / static_cast(target.GetHeight()); + double rIncr = (static_cast(r1) - static_cast(r0))* invHeight; + double gIncr = (static_cast(g1) - static_cast(g0))* invHeight; + double bIncr = (static_cast(b1) - static_cast(b0))* invHeight; + + uint8_t r = r0; + uint8_t g = g0; + uint8_t b = b0; + for (unsigned int y = 0; y < height; y++) + { + uint8_t* q = reinterpret_cast(target.GetRow(y)); + for (unsigned int x = 0; x < width; x++) + { + q[0] = r; + q[1] = g; + q[2] = b; + q[3] = 255; + q += 4; + } + r = byteAddClip(r, rIncr); + g = byteAddClip(g, gIncr); + b = byteAddClip(b, bIncr); + } + } + + } +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ShearWarpProjectiveTransform.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ShearWarpProjectiveTransform.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,664 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ShearWarpProjectiveTransform.h" + +#include "ImageGeometry.h" +#include "Extent2D.h" +#include "FiniteProjectiveCamera.h" +#include "GeometryToolbox.h" + +#include +#include +#include +#include + +#include +#include +#include + + +namespace OrthancStone +{ + static bool IsValidShear(const Matrix& M_shear) + { + return (LinearAlgebra::IsCloseToZero(M_shear(0, 1)) && + LinearAlgebra::IsCloseToZero(M_shear(1, 0)) && + LinearAlgebra::IsCloseToZero(M_shear(2, 0)) && + LinearAlgebra::IsCloseToZero(M_shear(2, 1)) && + LinearAlgebra::IsNear(1.0, M_shear(2, 2)) && + LinearAlgebra::IsCloseToZero(M_shear(2, 3)) && + LinearAlgebra::IsCloseToZero(M_shear(3, 0)) && + LinearAlgebra::IsCloseToZero(M_shear(3, 1)) && + LinearAlgebra::IsNear(1.0, M_shear(3, 3))); + } + + + static void ComputeShearParameters(double& scaling, + double& offsetX, + double& offsetY, + const Matrix& shear, + double z) + { + // Check out: ../../Resources/Computations/ComputeShearParameters.py + + if (!LinearAlgebra::IsShearMatrix(shear)) + { + LOG(ERROR) << "Not a valid shear matrix"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + scaling = 1.0 / (shear(3,2) * z + 1.0); + offsetX = shear(0,2) * z * scaling; + offsetY = shear(1,2) * z * scaling; + } + + + ShearWarpProjectiveTransform:: + ShearWarpProjectiveTransform(const Matrix& M_view, + //const Matrix& P, // Permutation applied to the volume + unsigned int volumeWidth, + unsigned int volumeHeight, + unsigned int volumeDepth, + double pixelSpacingX, + double pixelSpacingY, + unsigned int imageWidth, + unsigned int imageHeight) + { + eye_o.resize(4); + + { + // Find back the camera center given the "M_view" matrix + const double m11 = M_view(0, 0); + const double m12 = M_view(0, 1); + const double m13 = M_view(0, 2); + const double m14 = M_view(0, 3); + const double m21 = M_view(1, 0); + const double m22 = M_view(1, 1); + const double m23 = M_view(1, 2); + const double m24 = M_view(1, 3); + const double m41 = M_view(3, 0); + const double m42 = M_view(3, 1); + const double m43 = M_view(3, 2); + const double m44 = M_view(3, 3); + + // Equations (A.8) to (A.11) on page 203. Also check out + // "Finding the camera center" in "Multiple View Geometry in + // Computer Vision - 2nd edition", page 163. + const double vx[9] = { m12, m13, m14, m22, m23, m24, m42, m43, m44 }; + const double vy[9] = { m11, m13, m14, m21, m23, m24, m41, m43, m44 }; + const double vz[9] = { m11, m12, m14, m21, m22, m24, m41, m42, m44 }; + const double vw[9] = { m11, m12, m13, m21, m22, m23, m41, m42, m43 }; + + Matrix m; + + LinearAlgebra::FillMatrix(m, 3, 3, vx); + eye_o[0] = -LinearAlgebra::ComputeDeterminant(m); + + LinearAlgebra::FillMatrix(m, 3, 3, vy); + eye_o[1] = LinearAlgebra::ComputeDeterminant(m); + + LinearAlgebra::FillMatrix(m, 3, 3, vz); + eye_o[2] = -LinearAlgebra::ComputeDeterminant(m); + + LinearAlgebra::FillMatrix(m, 3, 3, vw); + eye_o[3] = LinearAlgebra::ComputeDeterminant(m); + + if (LinearAlgebra::IsCloseToZero(eye_o[3])) + { + LOG(ERROR) << "The shear-warp projective transform is not applicable to affine cameras"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + +#if 0 + // Assume "T_shift = I" (the eye does not lie on plane k = 0) + const Matrix T_shift = LinearAlgebra::IdentityMatrix(4); + + // Equation (A.13) on page 204, given that the inverse of a + // permutation matrix is its transpose (TODO CHECK). If no T_shift + // or permutation P is applied, M'_view == M_view + const Matrix MM_view = LinearAlgebra::Product( + M_view, + LinearAlgebra::Transpose(P), + LinearAlgebra::InvertScalingTranslationMatrix(T_shift)); +#else + // This is a shortcut, as we take "T_shift = I" and "P = I" + const Matrix MM_view = M_view; +#endif + + // Equation (A.14) on page 207 + Matrix MM_shear = LinearAlgebra::IdentityMatrix(4); + MM_shear(0, 2) = -eye_o[0] / eye_o[2]; + MM_shear(1, 2) = -eye_o[1] / eye_o[2]; + MM_shear(3, 2) = -eye_o[3] / eye_o[2]; + + + // Compute the extent of the intermediate image + Extent2D extent; + double maxScaling = 1; + + { + // Compute the shearing factors of the two extreme planes of the + // volume (z=0 and z=volumeDepth) + double scaling, offsetX, offsetY; + ComputeShearParameters(scaling, offsetX, offsetY, MM_shear, 0); + + if (scaling > 0) + { + extent.AddPoint(offsetX, offsetY); + extent.AddPoint(offsetX + static_cast(volumeWidth) * scaling, + offsetY + static_cast(volumeHeight) * scaling); + + if (scaling > maxScaling) + { + maxScaling = scaling; + } + } + + ComputeShearParameters(scaling, offsetX, offsetY, MM_shear, volumeDepth); + + if (scaling > 0) + { + extent.AddPoint(offsetX, offsetY); + extent.AddPoint(offsetX + static_cast(volumeWidth) * scaling, + offsetY + static_cast(volumeHeight) * scaling); + + if (scaling > maxScaling) + { + maxScaling = scaling; + } + } + } + + if (LinearAlgebra::IsCloseToZero(extent.GetWidth()) || + LinearAlgebra::IsCloseToZero(extent.GetHeight())) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + intermediateWidth_ = + static_cast(std::ceil(extent.GetWidth() / maxScaling)); + intermediateHeight_ = + static_cast(std::ceil(extent.GetHeight() / maxScaling)); + + // This is the product "T * S" in Equation (A.16) on page 209 + Matrix TS = LinearAlgebra::Product( + GeometryToolbox::CreateTranslationMatrix( + static_cast(intermediateWidth_) / 2.0, + static_cast(intermediateHeight_) / 2.0, 0), + GeometryToolbox::CreateScalingMatrix( + 1.0 / maxScaling, 1.0 / maxScaling, 1), + GeometryToolbox::CreateTranslationMatrix( + -extent.GetCenterX(), -extent.GetCenterY(), 0)); + + // This is Equation (A.16) on page 209. WARNING: There is an + // error in Lacroute's thesis: "inv(MM_shear)" is used instead + // of "MM_shear". + M_shear = LinearAlgebra::Product(TS, MM_shear); + + if (!IsValidShear(M_shear)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // This is Equation (A.17) on page 209 + Matrix tmp; + LinearAlgebra::InvertMatrix(tmp, M_shear); + M_warp = LinearAlgebra::Product(MM_view, tmp); + + // Intrinsic parameters of the camera + k_ = LinearAlgebra::ZeroMatrix(3, 4); + k_(0, 0) = 1.0 / pixelSpacingX; + k_(0, 3) = static_cast(imageWidth) / 2.0; + k_(1, 1) = 1.0 / pixelSpacingY; + k_(1, 3) = static_cast(imageHeight) / 2.0; + k_(2, 3) = 1.0; + } + + + FiniteProjectiveCamera *ShearWarpProjectiveTransform::CreateCamera() const + { + Matrix p = LinearAlgebra::Product(k_, M_warp, M_shear); + return new FiniteProjectiveCamera(p); + } + + + void ShearWarpProjectiveTransform::ComputeShearOnSlice(double& a11, + double& b1, + double& a22, + double& b2, + double& shearedZ, + const double sourceZ) + { + // Check out: ../../Resources/Computations/ComputeShearOnSlice.py + assert(IsValidShear(M_shear)); + + const double s11 = M_shear(0, 0); + const double s13 = M_shear(0, 2); + const double s14 = M_shear(0, 3); + const double s22 = M_shear(1, 1); + const double s23 = M_shear(1, 2); + const double s24 = M_shear(1, 3); + const double s43 = M_shear(3, 2); + + double scaling = 1.0 / (s43 * sourceZ + 1.0); + shearedZ = sourceZ * scaling; + + a11 = s11 * scaling; + a22 = s22 * scaling; + + b1 = (s13 * sourceZ + s14) * scaling; + b2 = (s23 * sourceZ + s24) * scaling; + } + + + Matrix ShearWarpProjectiveTransform::CalibrateView(const Vector& camera, + const Vector& principalPoint, + double angle) + { + if (camera.size() != 3 || + principalPoint.size() != 3) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const double sid = boost::numeric::ublas::norm_2(camera - principalPoint); + + Matrix a; + GeometryToolbox::AlignVectorsWithRotation(a, camera - principalPoint, + LinearAlgebra::CreateVector(0, 0, -1)); + + Matrix r = LinearAlgebra::Product(GeometryToolbox::CreateRotationMatrixAlongZ(angle), a); + + a = LinearAlgebra::ZeroMatrix(4, 4); + boost::numeric::ublas::subrange(a, 0, 3, 0, 3) = r; + + const Vector v = LinearAlgebra::Product(r, -camera); + a(0, 3) = v[0]; + a(1, 3) = v[1]; + a(2, 3) = v[2]; + a(3, 3) = 1; + + Matrix perspective = LinearAlgebra::ZeroMatrix(4, 4); + // https://stackoverflow.com/questions/5267866/calculation-of-a-perspective-transformation-matrix + perspective(0, 0) = sid; + perspective(1, 1) = sid; + perspective(2, 2) = sid; + perspective(3, 2) = 1; + + Matrix M_view = LinearAlgebra::Product(perspective, a); + assert(M_view.size1() == 4 && + M_view.size2() == 4); + + { + // Sanity checks + Vector p1 = LinearAlgebra::CreateVector(camera[0], camera[1], camera[2], 1.0); + Vector p2 = LinearAlgebra::CreateVector(principalPoint[0], principalPoint[1], principalPoint[2], 1.0); + + Vector v1 = LinearAlgebra::Product(M_view, p1); + Vector v2 = LinearAlgebra::Product(M_view, p2); + + if (!LinearAlgebra::IsCloseToZero(v1[3]) || // Must be mapped to singularity (w=0) + LinearAlgebra::IsCloseToZero(v2[3])) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + // The principal point must be mapped to (0,0,z,1) + v2 /= v2[3]; + if (!LinearAlgebra::IsCloseToZero(v2[0]) || + !LinearAlgebra::IsCloseToZero(v2[1])) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + return M_view; + } + + + template + static void ApplyAxialInternal(Orthanc::ImageAccessor& target, + float& maxValue, + const Matrix& M_view, + const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + double pixelSpacing, + unsigned int countSlices, + ImageInterpolation shearInterpolation, + ImageInterpolation warpInterpolation) + { + typedef Orthanc::PixelTraits SourceTraits; + typedef Orthanc::PixelTraits TargetTraits; + + /** + * Step 1: Precompute some information. + **/ + + if (target.GetFormat() != TargetFormat || + source.GetFormat() != SourceFormat || + !std::numeric_limits::is_iec559 || + sizeof(float) != 4) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (countSlices > source.GetDepth()) + { + countSlices = source.GetDepth(); + } + + if (countSlices == 0) + { + maxValue = 0; + Orthanc::ImageProcessing::Set(target, 0); + return; + } + + LOG(INFO) << "Number of rendered slices: " << countSlices; + + + /** + * Step 2: Extract the shear-warp transform corresponding to + * M_view. + **/ + + // Compute the "world" matrix that maps the source volume to the + // (0,0,0)->(1,1,1) unit cube + Vector origin = geometry.GetCoordinates(0, 0, 0); + Vector ps = geometry.GetVoxelDimensions(VolumeProjection_Axial); + Matrix world = LinearAlgebra::Product( + GeometryToolbox::CreateScalingMatrix(1.0 / ps[0], 1.0 / ps[1], 1.0 / ps[2]), + GeometryToolbox::CreateTranslationMatrix(-origin[0], -origin[1], -origin[2])); + + Matrix worldInv; + LinearAlgebra::InvertMatrix(worldInv, world); + + ShearWarpProjectiveTransform shearWarp(LinearAlgebra::Product(M_view, worldInv), + /*LinearAlgebra::IdentityMatrix(4),*/ + source.GetWidth(), + source.GetHeight(), + source.GetDepth(), + pixelSpacing, pixelSpacing, + target.GetWidth(), target.GetHeight()); + + const unsigned int intermediateWidth = shearWarp.GetIntermediateWidth(); + const unsigned int intermediateHeight = shearWarp.GetIntermediateHeight(); + + + /** + * Step 3: Apply the "shear" part of the transform to form the + * intermediate image. The sheared images are accumulated into the + * Float32 image "accumulator". The number of samples available + * for each pixel is stored in the "counter" image. + **/ + + std::unique_ptr accumulator, counter, intermediate; + + accumulator.reset(new Orthanc::Image(Orthanc::PixelFormat_Float32, + intermediateWidth, intermediateHeight, false)); + counter.reset(new Orthanc::Image(Orthanc::PixelFormat_Grayscale16, + intermediateWidth, intermediateHeight, false)); + intermediate.reset(new Orthanc::Image(SourceFormat, intermediateWidth, intermediateHeight, false)); + + Orthanc::ImageProcessing::Set(*accumulator, 0); + Orthanc::ImageProcessing::Set(*counter, 0); + + // Loop around the slices of the volume + for (unsigned int i = 0; i <= countSlices; i++) + { + // (3.a) Compute the shear for this specific slice + unsigned int z = static_cast( + boost::math::iround(static_cast(i) / + static_cast(countSlices) * + static_cast(source.GetDepth() - 1))); + + double a11, b1, a22, b2, vz; + shearWarp.ComputeShearOnSlice(a11, b1, a22, b2, vz, static_cast(z) + 0.5); + + + { + // (3.b) Detect the "useful" portion of the intermediate image + // for this slice (i.e. the bounding box where the source + // slice is mapped to by the shear), so as to update "counter" + Matrix a = LinearAlgebra::ZeroMatrix(3, 3); + a(0,0) = a11; + a(0,2) = b1; + a(1,1) = a22; + a(1,2) = b2; + a(2,2) = 1; + + unsigned int x1, y1, x2, y2; + if (GetProjectiveTransformExtent(x1, y1, x2, y2, a, + source.GetWidth(), source.GetHeight(), + intermediateWidth, intermediateHeight)) + { + for (unsigned int y = y1; y <= y2; y++) + { + uint16_t* p = reinterpret_cast(counter->GetRow(y)) + x1; + for (unsigned int x = x1; x <= x2; x++, p++) + { + if (MIP) + { + // TODO - In the case of MIP, "counter" could be + // reduced to "PixelFormat_Grayscale8" to reduce + // memory usage + *p = 1; + } + else + { + *p += 1; + } + } + } + } + } + + + { + // (3.c) Shear the source slice into a temporary image + ImageBuffer3D::SliceReader reader(source, VolumeProjection_Axial, z); + ApplyAffineTransform(*intermediate, reader.GetAccessor(), + a11, 0, b1, + 0, a22, b2, + shearInterpolation, true); + } + + + for (unsigned int y = 0; y < intermediateHeight; y++) + { + // (3.d) Accumulate the pixels of the sheared image into "accumulator" + const typename SourceTraits::PixelType* p = + reinterpret_cast(intermediate->GetConstRow(y)); + + float* q = reinterpret_cast(accumulator->GetRow(y)); + + for (unsigned int x = 0; x < intermediateWidth; x++) + { + float pixel = SourceTraits::PixelToFloat(*p); + + if (MIP) + { + // Get maximum for MIP + if (*q < pixel) + { + *q = pixel; + } + } + else + { + *q += pixel; + } + + p++; + q++; + } + } + } + + + /** + * Step 4: The intermediate image (that will be transformed by the + * "warp") is now available as an accumulator image together with + * a counter image. "Flatten" these two images into one. + **/ + + intermediate.reset(new Orthanc::Image + (TargetFormat, intermediateWidth, intermediateHeight, false)); + + maxValue = 0; + + for (unsigned int y = 0; y < intermediateHeight; y++) + { + const float *qacc = reinterpret_cast(accumulator->GetConstRow(y)); + const uint16_t *qcount = reinterpret_cast(counter->GetConstRow(y)); + typename TargetTraits::PixelType *p = + reinterpret_cast(intermediate->GetRow(y)); + + for (unsigned int x = 0; x < intermediateWidth; x++) + { + if (*qcount == 0) + { + TargetTraits::SetZero(*p); + } + else + { + *p = static_cast + (*qacc / static_cast(*qcount)); + + if (*p > maxValue) + { + maxValue = *p; + } + } + + p++; + qacc++; + qcount++; + } + } + + // We don't need the accumulator images anymore + accumulator.reset(NULL); + counter.reset(NULL); + + + /** + * Step 6: Apply the "warp" part of the transform to map the + * intermediate image to the final image. + **/ + + Matrix warp; + + { + // (5.a) Compute the "warp" matrix by removing the 3rd row and + // 3rd column from the GetWarp() matrix + // Check out: ../../Resources/Computations/ComputeWarp.py + + Matrix fullWarp = LinearAlgebra::Product + (shearWarp.GetIntrinsicParameters(), shearWarp.GetWarp()); + + const double v[] = { + fullWarp(0,0), fullWarp(0,1), fullWarp(0,3), + fullWarp(1,0), fullWarp(1,1), fullWarp(1,3), + fullWarp(2,0), fullWarp(2,1), fullWarp(2,3) + }; + + LinearAlgebra::FillMatrix(warp, 3, 3, v); + } + + // (5.b) Apply the projective transform to the image + ApplyProjectiveTransform(target, *intermediate, warp, warpInterpolation, true); + } + + + template + static void ApplyAxialInternal2(Orthanc::ImageAccessor& target, + float& maxValue, + const Matrix& M_view, + const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + bool mip, + double pixelSpacing, + unsigned int countSlices, + ImageInterpolation shearInterpolation, + ImageInterpolation warpInterpolation) + { + if (mip) + { + ApplyAxialInternal + (target, maxValue, M_view, source, geometry, pixelSpacing, + countSlices, shearInterpolation, warpInterpolation); + } + else + { + ApplyAxialInternal + (target, maxValue, M_view, source, geometry, pixelSpacing, + countSlices, shearInterpolation, warpInterpolation); + } + } + + + Orthanc::ImageAccessor* + ShearWarpProjectiveTransform::ApplyAxial(float& maxValue, + const Matrix& M_view, + const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + Orthanc::PixelFormat targetFormat, + unsigned int targetWidth, + unsigned int targetHeight, + bool mip, + double pixelSpacing, + unsigned int countSlices, + ImageInterpolation shearInterpolation, + ImageInterpolation warpInterpolation) + { + std::unique_ptr target + (new Orthanc::Image(targetFormat, targetWidth, targetHeight, false)); + + if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && + targetFormat == Orthanc::PixelFormat_Grayscale16) + { + ApplyAxialInternal2 + (*target, maxValue, M_view, source, geometry, mip, pixelSpacing, + countSlices, shearInterpolation, warpInterpolation); + } + else if (source.GetFormat() == Orthanc::PixelFormat_SignedGrayscale16 && + targetFormat == Orthanc::PixelFormat_SignedGrayscale16) + { + ApplyAxialInternal2 + (*target, maxValue, M_view, source, geometry, mip, pixelSpacing, + countSlices, shearInterpolation, warpInterpolation); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + return target.release(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/ShearWarpProjectiveTransform.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/ShearWarpProjectiveTransform.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,105 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "FiniteProjectiveCamera.h" + +namespace OrthancStone +{ + class ShearWarpProjectiveTransform : public boost::noncopyable + { + private: + Matrix k_; + Matrix M_shear; + Matrix M_warp; + Vector eye_o; + unsigned int intermediateWidth_; + unsigned int intermediateHeight_; + + public: + ShearWarpProjectiveTransform(const Matrix& M_view, + //const Matrix& P, // Permutation applied to the volume + unsigned int volumeWidth, + unsigned int volumeHeight, + unsigned int volumeDepth, + double pixelSpacingX, + double pixelSpacingY, + unsigned int imageWidth, + unsigned int imageHeight); + + const Matrix& GetIntrinsicParameters() const + { + return k_; + } + + const Matrix& GetShear() const + { + return M_shear; + } + + const Matrix& GetWarp() const + { + return M_warp; + } + + const Vector& GetCameraCenter() const + { + return eye_o; + } + + unsigned int GetIntermediateWidth() const + { + return intermediateWidth_; + } + + unsigned int GetIntermediateHeight() const + { + return intermediateHeight_; + } + + FiniteProjectiveCamera *CreateCamera() const; + + void ComputeShearOnSlice(double& a11, + double& b1, + double& a22, + double& b2, + double& shearedZ, + const double sourceZ); + + static Matrix CalibrateView(const Vector& camera, + const Vector& principalPoint, + double angle); + + static Orthanc::ImageAccessor* ApplyAxial(float& maxValue, + const Matrix& M_view, // cf. "CalibrateView()" + const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + Orthanc::PixelFormat targetFormat, + unsigned int targetWidth, + unsigned int targetHeight, + bool mip, + double pixelSpacing, + unsigned int countSlices, + ImageInterpolation shearInterpolation, + ImageInterpolation warpInterpolation); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SlicesSorter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SlicesSorter.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,357 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SlicesSorter.h" + +#include "GeometryToolbox.h" + +#include + +namespace OrthancStone +{ + class SlicesSorter::SliceWithDepth : public boost::noncopyable + { + private: + CoordinateSystem3D geometry_; + double depth_; + + std::unique_ptr payload_; + + public: + SliceWithDepth(const CoordinateSystem3D& geometry, + Orthanc::IDynamicObject* payload) : + geometry_(geometry), + depth_(0), + payload_(payload) + { + } + + void SetNormal(const Vector& normal) + { + depth_ = boost::numeric::ublas::inner_prod(geometry_.GetOrigin(), normal); + } + + double GetDepth() const + { + return depth_; + } + + const CoordinateSystem3D& GetGeometry() const + { + return geometry_; + } + + bool HasPayload() const + { + return (payload_.get() != NULL); + } + + const Orthanc::IDynamicObject& GetPayload() const + { + if (HasPayload()) + { + return *payload_; + } + else + { + LOG(ERROR) << "SlicesSorter::SliceWithDepth::GetPayload(): (!HasPayload())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + }; + + + struct SlicesSorter::Comparator + { + bool operator() (const SliceWithDepth* const& a, + const SliceWithDepth* const& b) const + { + return a->GetDepth() < b->GetDepth(); + } + }; + + + SlicesSorter::~SlicesSorter() + { + for (size_t i = 0; i < slices_.size(); i++) + { + assert(slices_[i] != NULL); + delete slices_[i]; + } + } + + + void SlicesSorter::AddSlice(const CoordinateSystem3D& slice, + Orthanc::IDynamicObject* payload) + { + slices_.push_back(new SliceWithDepth(slice, payload)); + } + + + const SlicesSorter::SliceWithDepth& SlicesSorter::GetSlice(size_t i) const + { + if (i >= slices_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(slices_[i] != NULL); + return *slices_[i]; + } + } + + + const CoordinateSystem3D& SlicesSorter::GetSliceGeometry(size_t i) const + { + return GetSlice(i).GetGeometry(); + } + + + bool SlicesSorter::HasSlicePayload(size_t i) const + { + return GetSlice(i).HasPayload(); + } + + + const Orthanc::IDynamicObject& SlicesSorter::GetSlicePayload(size_t i) const + { + return GetSlice(i).GetPayload(); + } + + + void SlicesSorter::SetNormal(const Vector& normal) + { + for (size_t i = 0; i < slices_.size(); i++) + { + slices_[i]->SetNormal(normal); + } + + hasNormal_ = true; + } + + + void SlicesSorter::SortInternal() + { + if (!hasNormal_) + { + LOG(ERROR) << "SlicesSorter::SortInternal(): (!hasNormal_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + Comparator comparator; + std::sort(slices_.begin(), slices_.end(), comparator); + } + + + void SlicesSorter::FilterNormal(const Vector& normal) + { + size_t pos = 0; + + for (size_t i = 0; i < slices_.size(); i++) + { + if (GeometryToolbox::IsParallel(normal, slices_[i]->GetGeometry().GetNormal())) + { + // This slice is compatible with the selected normal + slices_[pos] = slices_[i]; + pos += 1; + } + else + { + delete slices_[i]; + slices_[i] = NULL; + } + } + + slices_.resize(pos); + } + + + bool SlicesSorter::SelectNormal(Vector& normal) const + { + std::vector normalCandidates; + std::vector normalCount; + + bool found = false; + + for (size_t i = 0; !found && i < GetSlicesCount(); i++) + { + const Vector& normal = GetSlice(i).GetGeometry().GetNormal(); + + bool add = true; + for (size_t j = 0; add && j < normalCandidates.size(); j++) // (*) + { + if (GeometryToolbox::IsParallel(normal, normalCandidates[j])) + { + normalCount[j] += 1; + add = false; + } + } + + if (add) + { + if (normalCount.size() > 2) + { + // To get linear-time complexity in (*). This heuristics + // allows the series to have one single frame that is + // not parallel to the others (such a frame could be a + // generated preview) + found = false; + } + else + { + normalCandidates.push_back(normal); + normalCount.push_back(1); + } + } + } + + for (size_t i = 0; !found && i < normalCandidates.size(); i++) + { + unsigned int count = normalCount[i]; + if (count == GetSlicesCount() || + count + 1 == GetSlicesCount()) + { + normal = normalCandidates[i]; + found = true; + } + } + + return found; + } + + + bool SlicesSorter::Sort() + { + if (GetSlicesCount() > 0) + { + Vector normal; + if (SelectNormal(normal)) + { + FilterNormal(normal); + SetNormal(normal); + SortInternal(); + return true; + } + } + + return false; + } + + + bool SlicesSorter::LookupClosestSlice(size_t& index, + double& distance, + const CoordinateSystem3D& slice) const + { + // TODO Turn this linear-time lookup into a log-time lookup, + // keeping track of whether the slices are sorted along the normal + + bool found = false; + + distance = std::numeric_limits::infinity(); + + for (size_t i = 0; i < slices_.size(); i++) + { + assert(slices_[i] != NULL); + + double tmp; + if (CoordinateSystem3D::ComputeDistance(tmp, slices_[i]->GetGeometry(), slice)) + { + if (!found || + tmp < distance) + { + index = i; + distance = tmp; + found = true; + } + } + } + + return found; + } + + + bool SlicesSorter::ComputeSpacingBetweenSlices(double& spacing /* out */) const + { + if (GetSlicesCount() <= 1) + { + // This is a volume that is empty or that contains one single + // slice: Choose a dummy z-dimension for voxels + spacing = 1.0; + return true; + } + + const OrthancStone::CoordinateSystem3D& reference = GetSliceGeometry(0); + + double referencePosition = reference.ProjectAlongNormal(reference.GetOrigin()); + + double p = reference.ProjectAlongNormal(GetSliceGeometry(1).GetOrigin()); + spacing = p - referencePosition; + + if (spacing <= 0) + { + LOG(ERROR) << "SlicesSorter::ComputeSpacingBetweenSlices(): (spacing <= 0)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Please call the Sort() method before"); + } + + for (size_t i = 1; i < GetSlicesCount(); i++) + { + OrthancStone::Vector p = reference.GetOrigin() + spacing * static_cast(i) * reference.GetNormal(); + double d = boost::numeric::ublas::norm_2(p - GetSliceGeometry(i).GetOrigin()); + + if (!OrthancStone::LinearAlgebra::IsNear(d, 0, 0.001 /* tolerance expressed in mm */)) + { + return false; + } + } + + return true; + } + + + bool SlicesSorter::AreAllSlicesDistinct() const + { + if (GetSlicesCount() <= 1) + { + return true; + } + else + { + const OrthancStone::CoordinateSystem3D& reference = GetSliceGeometry(0); + double previousPosition = reference.ProjectAlongNormal(GetSliceGeometry(0).GetOrigin()); + + for (size_t i = 1; i < GetSlicesCount(); i++) + { + double position = reference.ProjectAlongNormal(GetSliceGeometry(i).GetOrigin()); + + if (OrthancStone::LinearAlgebra::IsNear(position, previousPosition, 0.001 /* tolerance expressed in mm */)) + { + return false; + } + + previousPosition = position; + } + + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SlicesSorter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SlicesSorter.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,99 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CoordinateSystem3D.h" + +#include + +namespace OrthancStone +{ + // TODO - Rename this as "PlanesSorter" + class SlicesSorter : public boost::noncopyable + { + private: + class SliceWithDepth; + struct Comparator; + + typedef std::vector Slices; + + Slices slices_; + bool hasNormal_; + + const SliceWithDepth& GetSlice(size_t i) const; + + void SetNormal(const Vector& normal); + + void SortInternal(); + + void FilterNormal(const Vector& normal); + + bool SelectNormal(Vector& normal) const; + + public: + SlicesSorter() : hasNormal_(false) + { + } + + ~SlicesSorter(); + + void Reserve(size_t count) + { + slices_.reserve(count); + } + + void AddSlice(const CoordinateSystem3D& plane) + { + AddSlice(plane, NULL); + } + + void AddSlice(const CoordinateSystem3D& plane, + Orthanc::IDynamicObject* payload); // Takes ownership + + size_t GetSlicesCount() const + { + return slices_.size(); + } + + const CoordinateSystem3D& GetSliceGeometry(size_t i) const; + + bool HasSlicePayload(size_t i) const; + + const Orthanc::IDynamicObject& GetSlicePayload(size_t i) const; + + // WARNING - Apply the sorting algorithm can reduce the number of + // slices. This is notably the case if all the slices are not + // parallel to the reference normal that will be selected. + bool Sort(); + + // TODO - Remove this + bool LookupClosestSlice(size_t& index, + double& distance, + const CoordinateSystem3D& slice) const; + + // WARNING - The slices must have been sorted before calling this method + bool ComputeSpacingBetweenSlices(double& spacing /* out */) const; + + // WARNING - The slices must have been sorted before calling this method + bool AreAllSlicesDistinct() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SortedFrames.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SortedFrames.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,405 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SortedFrames.h" + +#include "GeometryToolbox.h" + +#include +#include + +namespace OrthancStone +{ + SortedFrames::Instance::Instance(const Orthanc::DicomMap& tags) + { + tags_.Assign(tags); + + if (!tags.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + uint32_t tmp; + if (tags.ParseUnsignedInteger32(tmp, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) + { + numberOfFrames_ = tmp; + } + else + { + numberOfFrames_ = 1; + } + + std::string photometric; + if (tags.LookupStringValue(photometric, Orthanc::DICOM_TAG_PHOTOMETRIC_INTERPRETATION, false)) + { + Orthanc::Toolbox::StripSpaces(photometric); + monochrome1_ = (photometric == "MONOCHROME1"); + } + else + { + monochrome1_ = false; + } + + hasPosition_ = ( + LinearAlgebra::ParseVector(position_, tags, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT) && + position_.size() == 3 && + GeometryToolbox::ComputeNormal(normal_, tags)); + } + + + const Vector& SortedFrames::Instance::GetNormal() const + { + if (hasPosition_) + { + return normal_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Vector& SortedFrames::Instance::GetPosition() const + { + if (hasPosition_) + { + return position_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + SortedFrames::Frame::Frame(const Instance& instance, + unsigned int frameIndex) : + instance_(&instance), + frameIndex_(frameIndex) + { + if (frameIndex >= instance.GetNumberOfFrames()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + const SortedFrames::Instance& SortedFrames::GetInstance(size_t index) const + { + if (index >= instances_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + assert(instances_[index] != NULL); + return *instances_[index]; + } + } + + + const SortedFrames::Frame& SortedFrames::GetFrame(size_t index) const + { + if (!sorted_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Sort() has not been called"); + } + if (index >= frames_.size()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + return frames_[index]; + } + } + + + void SortedFrames::Clear() + { + for (size_t i = 0; i < instances_.size(); i++) + { + assert(instances_[i] != NULL); + delete instances_[i]; + } + + studyInstanceUid_.clear(); + seriesInstanceUid_.clear(); + frames_.clear(); + sorted_ = true; + } + + + void SortedFrames::AddInstance(const Orthanc::DicomMap& tags) + { + std::unique_ptr instance(new Instance(tags)); + + std::string studyInstanceUid, seriesInstanceUid; + if (!tags.LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || + !tags.LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); + } + + if (instances_.empty()) + { + studyInstanceUid_ = studyInstanceUid; + seriesInstanceUid_ = seriesInstanceUid; + } + else + { + if (studyInstanceUid_ != studyInstanceUid || + seriesInstanceUid_ != seriesInstanceUid) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, + "Mixing instances from different series"); + } + } + + instances_.push_back(instance.release()); + sorted_ = false; + frames_.clear(); + } + + + void SortedFrames::AddFramesOfInstance(std::set& remainingInstances, + size_t index) + { + assert(instances_[index] != NULL); + const Instance& instance = *instances_[index]; + + for (unsigned int i = 0; i < instance.GetNumberOfFrames(); i++) + { + frames_.push_back(Frame(instance, i)); + } + + assert(remainingInstances.find(index) != remainingInstances.end()); + remainingInstances.erase(index); + } + + + namespace + { + template + class SortableItem + { + private: + T value_; + size_t instance_; + std::string sopInstanceUid_; + + public: + SortableItem(const T& value, + size_t instance, + const std::string& sopInstanceUid) : + value_(value), + instance_(instance), + sopInstanceUid_(sopInstanceUid) + { + } + + size_t GetInstanceIndex() const + { + return instance_; + } + + bool operator< (const SortableItem& other) const + { + return (value_ < other.value_ || + (value_ == other.value_ && + sopInstanceUid_ < other.sopInstanceUid_)); + } + }; + } + + + void SortedFrames::SortUsingIntegerTag(std::set& remainingInstances, + const Orthanc::DicomTag& tag) + { + std::vector< SortableItem > items; + items.reserve(remainingInstances.size()); + + for (std::set::const_iterator it = remainingInstances.begin(); + it != remainingInstances.end(); ++it) + { + assert(instances_[*it] != NULL); + const Instance& instance = *instances_[*it]; + + int32_t value; + std::string sopInstanceUid; + if (instance.GetTags().ParseInteger32(value, tag) && + instance.GetTags().LookupStringValue( + sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + items.push_back(SortableItem(value, *it, sopInstanceUid)); + } + } + + std::sort(items.begin(), items.end()); + + for (size_t i = 0; i < items.size(); i++) + { + AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); + } + } + + + void SortedFrames::SortUsingSopInstanceUid(std::set& remainingInstances) + { + std::vector > items; + items.reserve(remainingInstances.size()); + + for (std::set::const_iterator it = remainingInstances.begin(); + it != remainingInstances.end(); ++it) + { + assert(instances_[*it] != NULL); + const Instance& instance = *instances_[*it]; + + std::string sopInstanceUid; + if (instance.GetTags().LookupStringValue( + sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + items.push_back(SortableItem(0 /* arbitrary value */, *it, sopInstanceUid)); + } + } + + std::sort(items.begin(), items.end()); + + for (size_t i = 0; i < items.size(); i++) + { + AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); + } + } + + + void SortedFrames::SortUsing3DLocation(std::set& remainingInstances) + { + /** + * Compute the mean of the normal vectors, using the recursive + * formula for arithmetic means for numerical stability. + * https://diego.assencio.com/?index=c34d06f4f4de2375658ed41f70177d59 + **/ + + Vector meanNormal; + LinearAlgebra::AssignVector(meanNormal, 0, 0, 0); + + unsigned int n = 0; + + for (std::set::const_iterator it = remainingInstances.begin(); + it != remainingInstances.end(); ++it) + { + assert(instances_[*it] != NULL); + const Instance& instance = *instances_[*it]; + + if (instance.HasPosition()) + { + n += 1; + meanNormal += (instance.GetNormal() - meanNormal) / static_cast(n); + } + } + + std::vector > items; + items.reserve(n); + + for (std::set::const_iterator it = remainingInstances.begin(); + it != remainingInstances.end(); ++it) + { + assert(instances_[*it] != NULL); + const Instance& instance = *instances_[*it]; + + std::string sopInstanceUid; + if (instance.HasPosition() && + instance.GetTags().LookupStringValue( + sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + double p = LinearAlgebra::DotProduct(meanNormal, instance.GetPosition()); + items.push_back(SortableItem(p, *it, sopInstanceUid)); + } + } + + assert(items.size() <= n); + + std::sort(items.begin(), items.end()); + + for (size_t i = 0; i < items.size(); i++) + { + AddFramesOfInstance(remainingInstances, items[i].GetInstanceIndex()); + } + } + + + size_t SortedFrames::GetFramesCount() const + { + if (sorted_) + { + return frames_.size(); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, + "Sort() has not been called"); + } + } + + + void SortedFrames::Sort() + { + if (!sorted_) + { + size_t totalFrames = 0; + std::set remainingInstances; + + for (size_t i = 0; i < instances_.size(); i++) + { + assert(instances_[i] != NULL); + totalFrames += instances_[i]->GetNumberOfFrames(); + + remainingInstances.insert(i); + } + + frames_.clear(); + frames_.reserve(totalFrames); + + SortUsingIntegerTag(remainingInstances, Orthanc::DICOM_TAG_INSTANCE_NUMBER); // VR is "IS" + SortUsingIntegerTag(remainingInstances, Orthanc::DICOM_TAG_IMAGE_INDEX); // VR is "US" + SortUsing3DLocation(remainingInstances); + SortUsingSopInstanceUid(remainingInstances); + + // The following could in theory happen if several instances + // have the same SOPInstanceUID, no ordering is available + for (std::set::const_iterator it = remainingInstances.begin(); + it != remainingInstances.end(); it++) + { + AddFramesOfInstance(remainingInstances, *it); + } + + if (frames_.size() != totalFrames || + !remainingInstances.empty()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + sorted_ = true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SortedFrames.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SortedFrames.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,190 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "LinearAlgebra.h" + +namespace OrthancStone +{ + class SortedFrames : public boost::noncopyable + { + private: + class Instance : public boost::noncopyable + { + private: + bool hasPosition_; + Orthanc::DicomMap tags_; + std::string sopInstanceUid_; + unsigned int numberOfFrames_; + Vector normal_; // Only used in "Sort()" + Vector position_; // Only used in "Sort()" + bool monochrome1_; + + public: + Instance(const Orthanc::DicomMap& tags); + + const Orthanc::DicomMap& GetTags() const + { + return tags_; + } + + const std::string& GetSopInstanceUid() const + { + return sopInstanceUid_; + } + + unsigned int GetNumberOfFrames() const + { + return numberOfFrames_; + } + + bool HasPosition() const + { + return hasPosition_; + } + + const Vector& GetNormal() const; + + const Vector& GetPosition() const; + + bool IsMonochrome1() const + { + return monochrome1_; + } + }; + + struct Frame + { + private: + const Instance* instance_; + unsigned int frameIndex_; + + public: + Frame(const Instance& instance, + unsigned int frameIndex); + + const Instance& GetInstance() const + { + return *instance_; + } + + unsigned int GetFrameIndex() const + { + return frameIndex_; + } + }; + + std::string studyInstanceUid_; + std::string seriesInstanceUid_; + std::vector instances_; + std::vector frames_; + bool sorted_; + + const Instance& GetInstance(size_t index) const; + + const Frame& GetFrame(size_t index) const; + + void AddFramesOfInstance(std::set& remainingInstances, + size_t index); + + void SortUsingIntegerTag(std::set& remainingInstances, + const Orthanc::DicomTag& tag); + + void SortUsingSopInstanceUid(std::set& remainingInstances); + + void SortUsing3DLocation(std::set& remainingInstances); + + public: + SortedFrames() : + sorted_(true) + { + } + + ~SortedFrames() + { + Clear(); + } + + void Clear(); + + const std::string& GetStudyInstanceUid() const + { + return studyInstanceUid_; + } + + const std::string& GetSeriesInstanceUid() const + { + return seriesInstanceUid_; + } + + void AddInstance(const Orthanc::DicomMap& tags); + + size_t GetInstancesCount() const + { + return instances_.size(); + } + + const Orthanc::DicomMap& GetInstanceTags(size_t index) const + { + return GetInstance(index).GetTags(); + } + + const std::string& GetSopInstanceUid(size_t index) const + { + return GetInstance(index).GetSopInstanceUid(); + } + + bool IsSorted() const + { + return sorted_; + } + + size_t GetFramesCount() const; + + const Orthanc::DicomMap& GetFrameTags(size_t index) const + { + return GetFrame(index).GetInstance().GetTags(); + } + + const std::string& GetFrameSopInstanceUid(size_t index) const + { + return GetFrame(index).GetInstance().GetSopInstanceUid(); + } + + unsigned int GetFrameSiblingsCount(size_t index) const + { + return GetFrame(index).GetInstance().GetNumberOfFrames(); + } + + unsigned int GetFrameIndex(size_t index) const + { + return GetFrame(index).GetFrameIndex(); + } + + bool IsFrameMonochrome1(size_t index) const + { + return GetFrame(index).GetInstance().IsMonochrome1(); + } + + void Sort(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SubpixelReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SubpixelReader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,260 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "GeometryToolbox.h" + +#include + +#include +#include + +namespace OrthancStone +{ + namespace Internals + { + class SubpixelReaderBase : public boost::noncopyable + { + private: + const Orthanc::ImageAccessor& source_; + unsigned int width_; + unsigned int height_; + + public: + SubpixelReaderBase(const Orthanc::ImageAccessor& source) : + source_(source), + width_(source.GetWidth()), + height_(source.GetHeight()) + { + } + + ORTHANC_FORCE_INLINE + const Orthanc::ImageAccessor& GetSource() const + { + return source_; + } + + ORTHANC_FORCE_INLINE + unsigned int GetWidth() const + { + return width_; + } + + ORTHANC_FORCE_INLINE + unsigned int GetHeight() const + { + return height_; + } + }; + } + + + template + class SubpixelReader; + + + template + class SubpixelReader : + public Internals::SubpixelReaderBase + { + public: + typedef Orthanc::PixelTraits Traits; + typedef typename Traits::PixelType PixelType; + + SubpixelReader(const Orthanc::ImageAccessor& source) : + SubpixelReaderBase(source) + { + } + + inline bool GetValue(PixelType& target, + float x, + float y) const; + + inline bool GetFloatValue(float& target, + float x, + float y) const; + }; + + + + template + class SubpixelReader : + public Internals::SubpixelReaderBase + { + public: + typedef Orthanc::PixelTraits Traits; + typedef typename Traits::PixelType PixelType; + + SubpixelReader(const Orthanc::ImageAccessor& source) : + SubpixelReaderBase(source) + { + } + + inline bool GetFloatValue(float& target, + float x, + float y) const; + + inline bool GetValue(PixelType& target, + float x, + float y) const; + }; + + + + template + bool SubpixelReader::GetValue(PixelType& target, + float x, + float y) const + { + if (x < 0 || + y < 0) + { + return false; + } + else + { + unsigned int ux = static_cast(std::floor(x)); + unsigned int uy = static_cast(std::floor(y)); + + if (ux < GetWidth() && + uy < GetHeight()) + { + Orthanc::ImageTraits::GetPixel(target, GetSource(), ux, uy); + return true; + } + else + { + return false; + } + } + } + + + + template + bool SubpixelReader::GetFloatValue(float& target, + float x, + float y) const + { + PixelType value; + + if (GetValue(value, x, y)) + { + target = Traits::PixelToFloat(value); + return true; + } + else + { + return false; + } + } + + + + template + bool SubpixelReader::GetValue(PixelType& target, + float x, + float y) const + { + float value; + + if (GetFloatValue(value, x, y)) + { + Traits::FloatToPixel(target, value); + return true; + } + else + { + return false; + } + } + + + + template + bool SubpixelReader::GetFloatValue(float& target, + float x, + float y) const + { + x -= 0.5f; + y -= 0.5f; + + if (x < 0 || + y < 0) + { + return false; + } + else + { + unsigned int ux = static_cast(std::floor(x)); + unsigned int uy = static_cast(std::floor(y)); + + float f00, f01, f10, f11; + + if (ux < GetWidth() && + uy < GetHeight()) + { + f00 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, uy); + } + else + { + return false; + } + + if (ux + 1 < GetWidth()) + { + f01 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, uy); + } + else + { + f01 = f00; + } + + if (uy + 1 < GetHeight()) + { + f10 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, uy + 1); + } + else + { + f10 = f00; + } + + if (ux + 1 < GetWidth() && + uy + 1 < GetHeight()) + { + f11 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, uy + 1); + } + else + { + f11 = f00; + } + + float ax = x - static_cast(ux); + float ay = y - static_cast(uy); + target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare(ax, ay, f00, f01, f10, f11); + + return true; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/SubvoxelReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/SubvoxelReader.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,470 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Volumes/ImageBuffer3D.h" +#include "GeometryToolbox.h" + +#include + +#include +#include + +namespace OrthancStone +{ + namespace Internals + { + /* + WARNING : the slice order is different between this class and ImageBuffer3D + + See the comment above ImageBuffer3D declaration. + + The slices are supposed to be stored in INCREASING z-order in this class! + */ + class SubvoxelReaderBase : public boost::noncopyable + { + private: + const ImageBuffer3D& source_; + unsigned int width_; + unsigned int height_; + unsigned int depth_; + + public: + SubvoxelReaderBase(const ImageBuffer3D& source) : + source_(source), + width_(source.GetWidth()), + height_(source.GetHeight()), + depth_(source.GetDepth()) + { + } + + ORTHANC_FORCE_INLINE + const Orthanc::ImageAccessor& GetSource() const + { + return source_.GetInternalImage(); + } + + ORTHANC_FORCE_INLINE + unsigned int GetWidth() const + { + return width_; + } + + ORTHANC_FORCE_INLINE + unsigned int GetHeight() const + { + return height_; + } + + ORTHANC_FORCE_INLINE + unsigned int GetDepth() const + { + return depth_; + } + + ORTHANC_FORCE_INLINE + unsigned int ComputeRow(unsigned int y, + unsigned int z) const + { + return z * height_ + y; + } + }; + } + + + /* + WARNING : the slice order is different between this class and ImageBuffer3D + + See the comment above ImageBuffer3D declaration. + + The slices are supposed to be stored in INCREASING z-order in this class! + */ + template + class SubvoxelReader; + + + /* + WARNING : the slice order is different between this class and ImageBuffer3D + + See the comment above ImageBuffer3D declaration. + + The slices are supposed to be stored in INCREASING z-order in this class! + */ + template + class SubvoxelReader : + public Internals::SubvoxelReaderBase + { + public: + typedef Orthanc::PixelTraits Traits; + typedef typename Traits::PixelType PixelType; + + SubvoxelReader(const ImageBuffer3D& source) : + SubvoxelReaderBase(source) + { + } + + inline bool GetValue(PixelType& target, + float x, + float y, + float z) const; + + inline bool GetFloatValue(float& target, + float x, + float y, + float z) const; + }; + + + /* + WARNING : the slice order is different between this class and ImageBuffer3D + + See the comment above ImageBuffer3D declaration. + + The slices are supposed to be stored in INCREASING z-order in this class! + */ + template + class SubvoxelReader : + public Internals::SubvoxelReaderBase + { + public: + typedef Orthanc::PixelTraits Traits; + typedef typename Traits::PixelType PixelType; + + SubvoxelReader(const ImageBuffer3D& source) : + SubvoxelReaderBase(source) + { + } + + inline bool Sample(float& f00, + float& f01, + float& f10, + float& f11, + unsigned int ux, + unsigned int uy, + unsigned int uz) const; + + inline bool GetValue(PixelType& target, + float x, + float y, + float z) const; + + inline bool GetFloatValue(float& target, + float x, + float y, + float z) const; + }; + + + /* + WARNING : the slice order is different between this class and ImageBuffer3D + + See the comment above ImageBuffer3D declaration. + + The slices are supposed to be stored in INCREASING z-order in this class! + */ + template + class SubvoxelReader : + public Internals::SubvoxelReaderBase + { + private: + SubvoxelReader bilinear_; + + public: + typedef Orthanc::PixelTraits Traits; + typedef typename Traits::PixelType PixelType; + + SubvoxelReader(const ImageBuffer3D& source) : + SubvoxelReaderBase(source), + bilinear_(source) + { + } + + inline bool GetValue(PixelType& target, + float x, + float y, + float z) const; + + inline bool GetFloatValue(float& target, + float x, + float y, + float z) const; + }; + + + /* + See important comment above + */ + + template + bool SubvoxelReader::GetValue(PixelType& target, + float x, + float y, + float z) const + { + if (x < 0 || + y < 0 || + z < 0) + { + return false; + } + else + { + unsigned int ux = static_cast(std::floor(x)); + unsigned int uy = static_cast(std::floor(y)); + unsigned int uz = static_cast(std::floor(z)); + + if (ux < GetWidth() && + uy < GetHeight() && + uz < GetDepth()) + { + Orthanc::ImageTraits::GetPixel(target, GetSource(), ux, ComputeRow(uy, uz)); + return true; + } + else + { + return false; + } + } + } + + + template + bool SubvoxelReader::GetFloatValue(float& target, + float x, + float y, + float z) const + { + PixelType value; + + if (GetValue(value, x, y, z)) + { + target = Traits::PixelToFloat(value); + return true; + } + else + { + return false; + } + } + + + /* + See important comment above + */ + + template + bool SubvoxelReader::Sample(float& f00, + float& f01, + float& f10, + float& f11, + unsigned int ux, + unsigned int uy, + unsigned int uz) const + { + if (ux < GetWidth() && + uy < GetHeight() && + uz < GetDepth()) + { + f00 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, ComputeRow(uy, uz)); + } + else + { + // Pixel is out of the volume + return false; + } + + if (ux + 1 < GetWidth()) + { + f01 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, ComputeRow(uy, uz)); + } + else + { + f01 = f00; + } + + if (uy + 1 < GetHeight()) + { + f10 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux, ComputeRow(uy + 1, uz)); + } + else + { + f10 = f00; + } + + if (ux + 1 < GetWidth() && + uy + 1 < GetHeight()) + { + f11 = Orthanc::ImageTraits::GetFloatPixel(GetSource(), ux + 1, ComputeRow(uy + 1, uz)); + } + else + { + f11 = f00; + } + + return true; + } + + + /* + See important comment above + */ + + template + bool SubvoxelReader::GetFloatValue(float& target, + float x, + float y, + float z) const + { + x -= 0.5f; + y -= 0.5f; + + if (x < 0 || + y < 0 || + z < 0) + { + return false; + } + else + { + unsigned int ux = static_cast(std::floor(x)); + unsigned int uy = static_cast(std::floor(y)); + unsigned int uz = static_cast(std::floor(z)); + + float f00, f01, f10, f11; + if (Sample(f00, f01, f10, f11, ux, uy, uz)) + { + float ax = x - static_cast(ux); + float ay = y - static_cast(uy); + + target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare(ax, ay, f00, f01, f10, f11); + return true; + } + else + { + return false; + } + } + } + + + /* + See important comment above + */ + + template + bool SubvoxelReader::GetValue(PixelType& target, + float x, + float y, + float z) const + { + float value; + + if (GetFloatValue(value, x, y, z)) + { + Traits::FloatToPixel(target, value); + return true; + } + else + { + return false; + } + } + + + + template + bool SubvoxelReader::GetFloatValue(float& target, + float x, + float y, + float z) const + { + x -= 0.5f; + y -= 0.5f; + z -= 0.5f; + + if (x < 0 || + y < 0 || + z < 0) + { + return false; + } + else + { + unsigned int ux = static_cast(std::floor(x)); + unsigned int uy = static_cast(std::floor(y)); + unsigned int uz = static_cast(std::floor(z)); + + float f000, f001, f010, f011; + if (bilinear_.Sample(f000, f001, f010, f011, ux, uy, uz)) + { + const float ax = x - static_cast(ux); + const float ay = y - static_cast(uy); + + float f100, f101, f110, f111; + + if (bilinear_.Sample(f100, f101, f110, f111, ux, uy, uz + 1)) + { + const float az = z - static_cast(uz); + target = GeometryToolbox::ComputeTrilinearInterpolationUnitSquare + (ax, ay, az, f000, f001, f010, f011, f100, f101, f110, f111); + } + else + { + target = GeometryToolbox::ComputeBilinearInterpolationUnitSquare + (ax, ay, f000, f001, f010, f011); + } + + return true; + } + else + { + return false; + } + } + } + + + /* + See important comment above + */ + + + template + bool SubvoxelReader::GetValue(PixelType& target, + float x, + float y, + float z) const + { + float value; + + if (GetFloatValue(value, x, y, z)) + { + Traits::FloatToPixel(target, value); + return true; + } + else + { + return false; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/TextRenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/TextRenderer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,135 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "TextRenderer.h" + +#include "../Scene2D/CairoCompositor.h" +#include "../Scene2D/ColorTextureSceneLayer.h" +#include "../Scene2D/FloatTextureSceneLayer.h" +#include "../Scene2D/TextSceneLayer.h" +#include "../Fonts/GlyphBitmapAlphabet.h" +#include "../Fonts/FontRenderer.h" + +#include +#include +#include +#include + +namespace OrthancStone +{ + Orthanc::ImageAccessor* TextRenderer::Render(const std::string& ttf, + unsigned int fontSize, + const std::string& utf8String) + { + FontRenderer renderer; + renderer.LoadFont(ttf, fontSize); + + // add each char to be rendered to the alphabet + std::unique_ptr alphabet(new GlyphBitmapAlphabet); + + size_t posInString = 0; + uint32_t unicode; + size_t utf8CharLength; + + while (posInString < utf8String.size()) + { + Orthanc::Toolbox::Utf8ToUnicodeCharacter(unicode, utf8CharLength, utf8String, posInString); + alphabet->AddUnicodeCharacter(renderer, unicode); + posInString += utf8CharLength; + } + + + std::unique_ptr renderedText(alphabet->RenderText(utf8String)); + + // add a blank line on top of the text (to improve bilinear filtering of the topmost line) + std::unique_ptr renderedTextExtended(new Orthanc::Image(renderedText->GetFormat(), renderedText->GetWidth(), renderedText->GetHeight() + 1, true)); + + Orthanc::ImageAccessor textRegion; + Orthanc::ImageAccessor firstLineRegion; + + renderedTextExtended->GetRegion(firstLineRegion, 0, 0, renderedText->GetWidth(), 1); + Orthanc::ImageProcessing::Set(firstLineRegion, 0); + + renderedTextExtended->GetRegion(textRegion, 0, 1, renderedText->GetWidth(), renderedText->GetHeight()); + Orthanc::ImageProcessing::Copy(textRegion, *renderedText); + + return renderedTextExtended.release(); + } + + + Orthanc::ImageAccessor* TextRenderer::RenderWithAlpha(const std::string& ttf, + unsigned int fontSize, + const std::string& utf8String, + uint8_t foreground) + { + std::unique_ptr renderedText8(Render(ttf, fontSize, utf8String)); + std::unique_ptr target(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, renderedText8->GetWidth(), renderedText8->GetHeight(), true)); + + Orthanc::ImageProcessing::Set(*target, foreground, foreground, foreground, *renderedText8); + return target.release(); + } + + + // currently disabled because the background is actually not transparent once we use the Cairo Compositor ! + // + // // renders text in color + a border with alpha in a RGBA32 image + // Orthanc::ImageAccessor* TextRenderer::RenderWithAlpha(const std::string& ttf, + // unsigned int fontSize, + // const std::string& utf8String, + // uint8_t foreground, + // uint8_t borderColor) + // { + // std::unique_ptr renderedBorderAlpha(RenderWithAlpha(ttf, fontSize, utf8String, borderColor)); + // std::unique_ptr renderedTextAlpha(RenderWithAlpha(ttf, fontSize, utf8String, foreground)); + + // unsigned int textWidth = renderedBorderAlpha->GetWidth(); + // unsigned int textHeight = renderedBorderAlpha->GetHeight(); + + // Scene2D targetScene; + // std::unique_ptr borderLayerLeft(new ColorTextureSceneLayer(*renderedBorderAlpha)); + // std::unique_ptr borderLayerRight(new ColorTextureSceneLayer(*renderedBorderAlpha)); + // std::unique_ptr borderLayerTop(new ColorTextureSceneLayer(*renderedBorderAlpha)); + // std::unique_ptr borderLayerBottom(new ColorTextureSceneLayer(*renderedBorderAlpha)); + // std::unique_ptr textLayerCenter(new ColorTextureSceneLayer(*renderedTextAlpha)); + + // borderLayerLeft->SetOrigin(0, 1); + // borderLayerRight->SetOrigin(2, 1); + // borderLayerTop->SetOrigin(1, 0); + // borderLayerBottom->SetOrigin(1, 2); + // textLayerCenter->SetOrigin(1, 1); + // targetScene.SetLayer(1, borderLayerLeft.release()); + // targetScene.SetLayer(2, borderLayerRight.release()); + // targetScene.SetLayer(3, borderLayerTop.release()); + // targetScene.SetLayer(4, borderLayerBottom.release()); + // targetScene.SetLayer(5, textLayerCenter.release()); + + // targetScene.FitContent(textWidth + 2, textHeight + 2); + // CairoCompositor compositor(targetScene, textWidth + 2, textHeight + 2); + // compositor.Refresh(); + + // Orthanc::ImageAccessor canvas; + // compositor.GetCanvas().GetReadOnlyAccessor(canvas); + + // std::unique_ptr output(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, canvas.GetWidth(), canvas.GetHeight(), false)); + // Orthanc::ImageProcessing::Convert(*output, canvas); + // return output.release(); + // } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/TextRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/TextRenderer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,52 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +namespace OrthancStone +{ + // Helpers methods to render text in bitmaps. + // Compared to the GlyphBitmapAlphabet::RenderText, these methods do not need a + // code page. + class TextRenderer : public boost::noncopyable + { + public: + // simply renders text in GrayScale8 with a black background and a white text + static Orthanc::ImageAccessor* Render(const std::string& ttf, + unsigned int fontSize, + const std::string& utf8String); + + // renders text in "color" with alpha in a RGBA32 image + static Orthanc::ImageAccessor* RenderWithAlpha(const std::string& ttf, + unsigned int fontSize, + const std::string& utf8String, + uint8_t foreground); + + // // renders text in color + a border with alpha in a RGBA32 image + // static Orthanc::ImageAccessor* RenderWithAlpha(const std::string& ttf, + // unsigned int fontSize, + // const std::string& utf8String, + // uint8_t foreground, + // uint8_t borderColor); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/UndoRedoStack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/UndoRedoStack.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "UndoRedoStack.h" + +#include + +#include + +namespace OrthancStone +{ + void UndoRedoStack::Clear(UndoRedoStack::Stack::iterator from) + { + for (Stack::iterator it = from; it != stack_.end(); ++it) + { + assert(*it != NULL); + delete *it; + } + + stack_.erase(from, stack_.end()); + } + + + UndoRedoStack::UndoRedoStack() : + current_(stack_.end()) + { + } + + + UndoRedoStack::~UndoRedoStack() + { + Clear(stack_.begin()); + } + + + void UndoRedoStack::Add(ICommand* command) + { + if (command == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + Clear(current_); + + stack_.push_back(command); + current_ = stack_.end(); + } + + + void UndoRedoStack::Undo() + { + if (current_ != stack_.begin()) + { + --current_; + + assert(*current_ != NULL); + (*current_)->Undo(); + } + } + + void UndoRedoStack::Redo() + { + if (current_ != stack_.end()) + { + assert(*current_ != NULL); + (*current_)->Redo(); + + ++current_; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Toolbox/UndoRedoStack.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Toolbox/UndoRedoStack.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,64 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + + +namespace OrthancStone +{ + class UndoRedoStack : public boost::noncopyable + { + public: + class ICommand : public boost::noncopyable + { + public: + virtual ~ICommand() + { + } + + virtual void Undo() const = 0; + + virtual void Redo() const = 0; + }; + + private: + typedef std::list Stack; + + Stack stack_; + Stack::iterator current_; + + void Clear(Stack::iterator from); + + public: + UndoRedoStack(); + + ~UndoRedoStack(); + + void Add(ICommand* command); + + void Undo(); + + void Redo(); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/IViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/IViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,72 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#include "../Scene2D/ICompositor.h" +#include "../Scene2DViewport/ViewportController.h" + +namespace OrthancStone +{ + /** + * Class that combines a Scene2D with a canvas where to draw the + * scene. A call to "Refresh()" will update the content of the + * canvas. A "IViewport" can possibly be accessed from several + * threads depending on the rendering back-end (e.g. in SDL or Qt): + * The "ILock" subclass implements the locking mechanism to modify + * the content of the scene. + * + * NB: The lock must be a "recursive_mutex", as the viewport + * controller can lock it a second time (TODO - Why so?). + **/ + class IViewport : public boost::noncopyable + { + public: + class ILock : public boost::noncopyable + { + public: + virtual ~ILock() + { + } + + virtual bool HasCompositor() const = 0; + + /** + Do not store the result! Only access the compositor interface through + the lock. + */ + virtual ICompositor& GetCompositor() = 0; + + /** + Do not store the result! Only access the compositor interface through + the lock. + */ + virtual ViewportController& GetController() = 0; + + virtual void Invalidate() = 0; + }; + + virtual ~IViewport() + { + } + + virtual ILock* Lock() = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/SdlViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/SdlViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,230 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "SdlViewport.h" + +#include + +#include + +namespace OrthancStone +{ + ICompositor& SdlViewport::SdlLock::GetCompositor() + { + if (that_.compositor_.get() == NULL) + { + // The derived class should have called "AcquireCompositor()" + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + return *that_.compositor_; + } + } + + + void SdlViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) + { + if (compositor == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + compositor_.reset(compositor); + } + + SdlViewport::SdlViewport() + { + refreshEvent_ = SDL_RegisterEvents(1); + + if (refreshEvent_ == static_cast(-1)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + void SdlViewport::PostConstructor() + { + controller_ = boost::make_shared(shared_from_this()); + } + + void SdlViewport::SendRefreshEvent() + { + SDL_Event event; + SDL_memset(&event, 0, sizeof(event)); + event.type = refreshEvent_; + SDL_PushEvent(&event); // This function is thread-safe, and can be called from other threads safely. + } + + + SdlOpenGLViewport::SdlOpenGLViewport(const std::string& title, + unsigned int width, + unsigned int height, + bool allowDpiScaling) : + context_(title.c_str(), width, height, allowDpiScaling) + { + AcquireCompositor(new OpenGLCompositor(context_)); // (*) + } + + boost::shared_ptr SdlOpenGLViewport::Create( + const std::string& title, + unsigned int width, + unsigned int height, + bool allowDpiScaling) + { + boost::shared_ptr that = + boost::shared_ptr(new SdlOpenGLViewport(title, width, height, allowDpiScaling)); + that->SdlViewport::PostConstructor(); + return that; + } + + uint32_t SdlOpenGLViewport::GetSdlWindowId() + { + SdlWindow& sdlWindowWrapper = context_.GetWindow(); + SDL_Window* sdlWindow = sdlWindowWrapper.GetObject(); + Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); + return sdlWindowId; + } + + SdlOpenGLViewport::~SdlOpenGLViewport() + { + // Make sure that the "OpenGLCompositor" is destroyed BEFORE the + // "OpenGLContext" it references (*) + ClearCompositor(); + } + + + void SdlOpenGLViewport::Paint() + { + SdlLock lock(*this); + lock.GetCompositor().Refresh(lock.GetController().GetScene()); + } + + + void SdlOpenGLViewport::UpdateSize(unsigned int width, unsigned int height) + { + // nothing to do in OpenGL, the OpenGLCompositor::UpdateSize will be called automatically + SdlLock lock(*this); + lock.Invalidate(); + } + + + void SdlOpenGLViewport::ToggleMaximize() + { + // No need to call "Invalidate()" here, as "UpdateSize()" will + // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" + SdlLock lock(*this); + context_.ToggleMaximize(); + } + + + + SdlCairoViewport::SdlCairoViewport(const char* title, + unsigned int width, + unsigned int height, + bool allowDpiScaling) : + window_(title, width, height, false /* enable OpenGL */, allowDpiScaling), + sdlSurface_(NULL) + { + AcquireCompositor(new CairoCompositor(width, height)); + } + + SdlCairoViewport::~SdlCairoViewport() + { + if (sdlSurface_) + { + SDL_FreeSurface(sdlSurface_); + } + } + + uint32_t SdlCairoViewport::GetSdlWindowId() + { + SDL_Window* sdlWindow = window_.GetObject(); + Uint32 sdlWindowId = SDL_GetWindowID(sdlWindow); + return sdlWindowId; + } + + void SdlCairoViewport::Paint() + { + SdlLock lock(*this); + + lock.GetCompositor().Refresh(lock.GetController().GetScene()); + CreateSdlSurfaceFromCompositor(dynamic_cast(lock.GetCompositor())); + + if (sdlSurface_ != NULL) + { + window_.Render(sdlSurface_); + } + } + + + void SdlCairoViewport::UpdateSize(unsigned int width, + unsigned int height) + { + SdlLock lock(*this); + dynamic_cast(lock.GetCompositor()).UpdateSize(width, height); + lock.Invalidate(); + } + + + void SdlCairoViewport::ToggleMaximize() + { + // No need to call "Invalidate()" here, as "UpdateSize()" will + // be invoked after event "SDL_WINDOWEVENT_SIZE_CHANGED" + SdlLock lock(*this); + window_.ToggleMaximize(); + } + + + // Assumes that the mutex is locked + void SdlCairoViewport::CreateSdlSurfaceFromCompositor(CairoCompositor& compositor) + { + static const uint32_t rmask = 0x00ff0000; + static const uint32_t gmask = 0x0000ff00; + static const uint32_t bmask = 0x000000ff; + + const unsigned int width = compositor.GetCanvas().GetWidth(); + const unsigned int height = compositor.GetCanvas().GetHeight(); + + if (sdlSurface_ != NULL) + { + if (sdlSurface_->pixels == compositor.GetCanvas().GetBuffer() && + sdlSurface_->w == static_cast(width) && + sdlSurface_->h == static_cast(height) && + sdlSurface_->pitch == static_cast(compositor.GetCanvas().GetPitch())) + { + // The image from the compositor has not changed, no need to update the surface + return; + } + else + { + SDL_FreeSurface(sdlSurface_); + } + } + + sdlSurface_ = SDL_CreateRGBSurfaceFrom((void*)(compositor.GetCanvas().GetBuffer()), width, height, 32, + compositor.GetCanvas().GetPitch(), rmask, gmask, bmask, 0); + if (!sdlSurface_) + { + LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/SdlViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/SdlViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,195 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#pragma once + +#if !defined(ORTHANC_ENABLE_SDL) +# error Macro ORTHANC_ENABLE_SDL must be defined +#endif + +#if ORTHANC_ENABLE_SDL != 1 +# error SDL must be enabled to use this file +#endif + +#if !defined(ORTHANC_ENABLE_OPENGL) +# error The macro ORTHANC_ENABLE_OPENGL must be defined +#endif + +#if ORTHANC_ENABLE_OPENGL != 1 +# error Support for OpenGL is disabled +#endif + +#include "../OpenGL/SdlOpenGLContext.h" +#include "../Scene2D/OpenGLCompositor.h" +#include "../Scene2D/CairoCompositor.h" +#include "IViewport.h" + +#include + +// TODO: required for UndoStack injection +// I don't like it either :) +#include + +#include + +namespace OrthancStone +{ + class UndoStack; + + class SdlViewport : public IViewport, + public boost::enable_shared_from_this + { + private: + boost::recursive_mutex mutex_; + uint32_t refreshEvent_; + boost::shared_ptr controller_; + std::unique_ptr compositor_; + + void SendRefreshEvent(); + + protected: + class SdlLock : public ILock + { + private: + SdlViewport& that_; + boost::recursive_mutex::scoped_lock lock_; + + public: + SdlLock(SdlViewport& that) : + that_(that), + lock_(that.mutex_) + { + } + + virtual bool HasCompositor() const ORTHANC_OVERRIDE + { + return true; + } + + virtual ICompositor& GetCompositor() ORTHANC_OVERRIDE; + + virtual ViewportController& GetController() ORTHANC_OVERRIDE + { + return *that_.controller_; + } + + virtual void Invalidate() ORTHANC_OVERRIDE + { + that_.SendRefreshEvent(); + } + }; + + void ClearCompositor() + { + compositor_.reset(); + } + + void AcquireCompositor(ICompositor* compositor /* takes ownership */); + + protected: + SdlViewport(); + void PostConstructor(); + + public: + + bool IsRefreshEvent(const SDL_Event& event) const + { + return (event.type == refreshEvent_); + } + + virtual ILock* Lock() ORTHANC_OVERRIDE + { + return new SdlLock(*this); + } + + virtual uint32_t GetSdlWindowId() = 0; + + virtual void UpdateSize(unsigned int width, + unsigned int height) = 0; + + virtual void ToggleMaximize() = 0; + + // Must be invoked from the main SDL thread + virtual void Paint() = 0; + }; + + + class SdlOpenGLViewport : public SdlViewport + { + private: + SdlOpenGLContext context_; + + private: + SdlOpenGLViewport(const std::string& title, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + public: + static boost::shared_ptr Create(const std::string&, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + + + virtual ~SdlOpenGLViewport(); + + virtual uint32_t GetSdlWindowId() ORTHANC_OVERRIDE; + + virtual void Paint() ORTHANC_OVERRIDE; + + virtual void UpdateSize(unsigned int width, + unsigned int height) ORTHANC_OVERRIDE; + + virtual void ToggleMaximize() ORTHANC_OVERRIDE; + }; + + + class SdlCairoViewport : public SdlViewport + { + private: + SdlWindow window_; + SDL_Surface* sdlSurface_; + + void CreateSdlSurfaceFromCompositor(CairoCompositor& compositor); + + private: + SdlCairoViewport(const char* title, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + public: + static boost::shared_ptr Create(const char* title, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + + + virtual ~SdlCairoViewport(); + + virtual uint32_t GetSdlWindowId() ORTHANC_OVERRIDE; + + virtual void Paint() ORTHANC_OVERRIDE; + + virtual void UpdateSize(unsigned int width, + unsigned int height) ORTHANC_OVERRIDE; + + virtual void ToggleMaximize() ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/SdlWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/SdlWindow.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,210 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "SdlWindow.h" + +#if ORTHANC_ENABLE_SDL == 1 + +#include +#include + +#ifdef WIN32 +#include // for SetProcessDpiAware +#endif +// WIN32 + +#include +#include +#include + +namespace OrthancStone +{ + SdlWindow::SdlWindow(const char* title, + unsigned int width, + unsigned int height, + bool enableOpenGl, + bool allowDpiScaling) : + maximized_(false) + { + // TODO Understand why, with SDL_WINDOW_OPENGL + MinGW32 + Release + // build mode, the application crashes whenever the SDL window is + // resized or maximized + + uint32_t windowFlags, rendererFlags; + if (enableOpenGl) + { + windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + rendererFlags = SDL_RENDERER_ACCELERATED; + } + else + { + windowFlags = SDL_WINDOW_RESIZABLE; + rendererFlags = SDL_RENDERER_SOFTWARE; + } + +// TODO: probably required on MacOS X, too +#if defined(WIN32) && (_WIN32_WINNT >= 0x0600) + if (!allowDpiScaling) + { + // if we do NOT allow DPI scaling, it means an SDL pixel will be a real + // monitor pixel. This is needed for high-DPI applications + + // Enable high-DPI support on Windows + + // THE FOLLOWING HAS BEEN COMMENTED OUT BECAUSE IT WILL CRASH UNDER + // OLD WINDOWS VERSIONS + // ADD THIS AT THE TOP TO ENABLE IT: + // + //#pragma comment(lib, "Shcore.lib") THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness + //#include + //#include THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness + //#include THIS IS ONLY REQUIRED FOR SetProcessDpiAwareness + // SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE); + + // This is supported on Vista+ + SetProcessDPIAware(); + + windowFlags |= SDL_WINDOW_ALLOW_HIGHDPI; + } +#endif +// WIN32 + + window_ = SDL_CreateWindow(title, + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + width, height, windowFlags); + + if (window_ == NULL) + { + LOG(ERROR) << "Cannot create the SDL window: " << SDL_GetError(); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + renderer_ = SDL_CreateRenderer(window_, -1, rendererFlags); + if (!renderer_) + { + LOG(ERROR) << "Cannot create the SDL renderer: " << SDL_GetError(); + SDL_DestroyWindow(window_); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + SdlWindow::~SdlWindow() + { + if (renderer_ != NULL) + { + SDL_DestroyRenderer(renderer_); + } + + if (window_ != NULL) + { + SDL_DestroyWindow(window_); + } + } + + + unsigned int SdlWindow::GetWidth() const + { + int w = -1; + SDL_GetWindowSize(window_, &w, NULL); + + if (w < 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + return static_cast(w); + } + } + + + unsigned int SdlWindow::GetHeight() const + { + int h = -1; + SDL_GetWindowSize(window_, NULL, &h); + + if (h < 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + else + { + return static_cast(h); + } + } + + + void SdlWindow::Render(SDL_Surface* surface) + { + /** + * "You are strongly encouraged to call SDL_RenderClear() to + * initialize the backbuffer before starting each new frame's + * drawing, even if you plan to overwrite every pixel." + * https://wiki.libsdl.org/SDL_RenderPresent + **/ + SDL_SetRenderDrawColor(renderer_, 0, 0, 0, 255); + SDL_RenderClear(renderer_); // Clear the entire screen to our selected color + + SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer_, surface); + if (texture != NULL) + { + SDL_RenderCopy(renderer_, texture, NULL, NULL); + SDL_DestroyTexture(texture); + } + + SDL_RenderPresent(renderer_); + } + + + void SdlWindow::ToggleMaximize() + { + if (maximized_) + { + SDL_RestoreWindow(window_); + maximized_ = false; + } + else + { + SDL_MaximizeWindow(window_); + maximized_ = true; + } + } + + + void SdlWindow::GlobalInitialize() + { + if (SDL_Init(SDL_INIT_VIDEO) != 0) + { + LOG(ERROR) << "Cannot initialize SDL"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + void SdlWindow::GlobalFinalize() + { + SDL_Quit(); + } +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/SdlWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/SdlWindow.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if ORTHANC_ENABLE_SDL == 1 + +#include + +// Forward declaration of SDL type to avoid clashes with DCMTK headers +// on "typedef Sint8", in "StoneInitialization.cpp" +struct SDL_Window; +struct SDL_Renderer; +struct SDL_Surface; + +namespace OrthancStone +{ + class SdlWindow : public boost::noncopyable + { + private: + struct SDL_Window *window_; + struct SDL_Renderer *renderer_; + bool maximized_; + + public: + SdlWindow(const char* title, + unsigned int width, + unsigned int height, + bool enableOpenGl, + bool allowDpiScaling = true); + + ~SdlWindow(); + + SDL_Window *GetObject() const + { + return window_; + } + + unsigned int GetWidth() const; + + unsigned int GetHeight() const; + + /** + * WARNING: "Refresh()" cannot only be called from the main SDL + * thread, in which the window was created. Otherwise, the + * renderer displays nothing! + **/ + void Render(struct SDL_Surface* surface); + + void ToggleMaximize(); + + static void GlobalInitialize(); + + static void GlobalFinalize(); + }; +} + +#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebAssemblyCairoViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebAssemblyCairoViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,139 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebAssemblyCairoViewport.h" + +#include "../Scene2D/CairoCompositor.h" + +#include + +#include + +namespace OrthancStone +{ + void WebAssemblyCairoViewport::GetCanvasSize(unsigned int& width, + unsigned int& height) + { + double w, h; + emscripten_get_element_css_size(GetCanvasCssSelector().c_str(), &w, &h); + + /** + * Emscripten has the function emscripten_get_element_css_size() + * to query the width and height of a named HTML element. I'm + * calling this first to get the initial size of the canvas DOM + * element, and then call emscripten_set_canvas_size() to + * initialize the framebuffer size of the canvas to the same + * size as its DOM element. + * https://floooh.github.io/2017/02/22/emsc-html.html + **/ + if (w > 0 && + h > 0) + { + width = static_cast(boost::math::iround(w)); + height = static_cast(boost::math::iround(h)); + } + else + { + width = 0; + height = 0; + } + } + + + void WebAssemblyCairoViewport::Paint(ICompositor& compositor, + ViewportController& controller) + { + compositor.Refresh(controller.GetScene()); + + // Create a temporary memory buffer for the canvas in JavaScript + Orthanc::ImageAccessor cairo; + dynamic_cast(compositor).GetCanvas().GetReadOnlyAccessor(cairo); + + const unsigned int width = cairo.GetWidth(); + const unsigned int height = cairo.GetHeight(); + + if (javascript_.get() == NULL || + javascript_->GetWidth() != width || + javascript_->GetHeight() != height) + { + javascript_.reset(new Orthanc::Image(Orthanc::PixelFormat_RGBA32, width, height, + true /* force minimal pitch */)); + } + + // Convert from BGRA32 memory layout (only color mode supported + // by Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 + // (as expected by HTML5 canvas). This simply amounts to + // swapping the B and R channels. Alpha channel is also set to + // full opacity (255). + uint8_t* q = reinterpret_cast(javascript_->GetBuffer()); + for (unsigned int y = 0; y < height; y++) + { + const uint8_t* p = reinterpret_cast(cairo.GetConstRow(y)); + for (unsigned int x = 0; x < width; x++) + { + q[0] = p[2]; // R + q[1] = p[1]; // G + q[2] = p[0]; // B + q[3] = 255; // A + + p += 4; + q += 4; + } + } + + // Execute JavaScript commands to blit the image buffer onto the + // 2D drawing context of the HTML5 canvas + EM_ASM({ + const data = new Uint8ClampedArray(Module.HEAP8.buffer, $1, 4 * $2 * $3); + const img = new ImageData(data, $2, $3); + const ctx = document.getElementById(UTF8ToString($0)).getContext('2d'); + ctx.putImageData(img, 0, 0); + }, + GetCanvasId().c_str(), // $0 + javascript_->GetBuffer(), // $1 + javascript_->GetWidth(), // $2 + javascript_->GetHeight()); // $3 + } + + + void WebAssemblyCairoViewport::UpdateSize(ICompositor& compositor) + { + unsigned int width, height; + GetCanvasSize(width, height); + emscripten_set_canvas_element_size(GetCanvasCssSelector().c_str(), width, height); + + dynamic_cast(compositor).UpdateSize(width, height); + } + + + WebAssemblyCairoViewport::WebAssemblyCairoViewport( + const std::string& canvasId) : + WebAssemblyViewport(canvasId) + { + unsigned int width, height; + GetCanvasSize(width, height); + emscripten_set_canvas_element_size(GetCanvasCssSelector().c_str(), + width, + height); + + AcquireCompositor(new CairoCompositor(width, height)); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebAssemblyCairoViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebAssemblyCairoViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,50 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebAssemblyViewport.h" + +namespace OrthancStone +{ + class WebAssemblyCairoViewport : public WebAssemblyViewport + { + private: + std::unique_ptr javascript_; + + void GetCanvasSize(unsigned int& width, + unsigned int& height); + + protected: + virtual void Paint(ICompositor& compositor, + ViewportController& controller) ORTHANC_OVERRIDE; + + virtual void UpdateSize(ICompositor& compositor) ORTHANC_OVERRIDE; + + public: + WebAssemblyCairoViewport(const std::string& canvasId); + + virtual ~WebAssemblyCairoViewport() + { + ClearCompositor(); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebAssemblyViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebAssemblyViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,339 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebAssemblyViewport.h" + +#include "../Toolbox/GenericToolbox.h" + +#include + +#include +#include + +namespace OrthancStone +{ + static void ConvertMouseEvent(PointerEvent& target, + const EmscriptenMouseEvent& source, + const ICompositor& compositor) + { + int x = static_cast(source.targetX); + int y = static_cast(source.targetY); + + switch (source.button) + { + case 0: + target.SetMouseButton(MouseButton_Left); + break; + + case 1: + target.SetMouseButton(MouseButton_Middle); + break; + + case 2: + target.SetMouseButton(MouseButton_Right); + break; + + default: + target.SetMouseButton(MouseButton_None); + break; + } + + target.AddPosition(compositor.GetPixelCenterCoordinates(x, y)); + target.SetAltModifier(source.altKey); + target.SetControlModifier(source.ctrlKey); + target.SetShiftModifier(source.shiftKey); + } + + + class WebAssemblyViewport::WasmLock : public ILock + { + private: + WebAssemblyViewport& that_; + + public: + WasmLock(WebAssemblyViewport& that) : + that_(that) + { + } + + virtual bool HasCompositor() const ORTHANC_OVERRIDE + { + return that_.compositor_.get() != NULL; + } + + virtual ICompositor& GetCompositor() ORTHANC_OVERRIDE + { + if (that_.compositor_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *that_.compositor_; + } + } + + virtual ViewportController& GetController() ORTHANC_OVERRIDE + { + assert(that_.controller_); + return *that_.controller_; + } + + virtual void Invalidate() ORTHANC_OVERRIDE + { + that_.Invalidate(); + } + }; + + + EM_BOOL WebAssemblyViewport::OnRequestAnimationFrame(double time, void *userData) + { + LOG(TRACE) << __func__; + WebAssemblyViewport* that = reinterpret_cast(userData); + + if (that->compositor_.get() != NULL && + that->controller_ /* should always be true */) + { + that->Paint(*that->compositor_, *that->controller_); + } + + LOG(TRACE) << "Exiting: " << __func__; + return true; + } + + EM_BOOL WebAssemblyViewport::OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) + { + LOG(TRACE) << __func__; + WebAssemblyViewport* that = reinterpret_cast(userData); + + if (that->compositor_.get() != NULL) + { + that->UpdateSize(*that->compositor_); + that->Invalidate(); + } + + LOG(TRACE) << "Exiting: " << __func__; + return true; + } + + + EM_BOOL WebAssemblyViewport::OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) + { + WebAssemblyViewport* that = reinterpret_cast(userData); + + LOG(TRACE) << "mouse down: " << that->GetCanvasCssSelector(); + + if (that->compositor_.get() != NULL && + that->interactor_.get() != NULL) + { + PointerEvent pointer; + ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); + + that->controller_->HandleMousePress(*that->interactor_, pointer, + that->compositor_->GetCanvasWidth(), + that->compositor_->GetCanvasHeight()); + that->Invalidate(); + } + + LOG(TRACE) << "Exiting: " << __func__; + return true; + } + + + EM_BOOL WebAssemblyViewport::OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) + { + WebAssemblyViewport* that = reinterpret_cast(userData); + + if (that->compositor_.get() != NULL && + that->controller_->HasActiveTracker()) + { + PointerEvent pointer; + ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); + if (that->controller_->HandleMouseMove(pointer)) + { + that->Invalidate(); + } + } + + LOG(TRACE) << "Exiting: " << __func__; + return true; + } + + EM_BOOL WebAssemblyViewport::OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) + { + LOG(TRACE) << __func__; + WebAssemblyViewport* that = reinterpret_cast(userData); + + if (that->compositor_.get() != NULL) + { + PointerEvent pointer; + ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); + that->controller_->HandleMouseRelease(pointer); + that->Invalidate(); + } + + LOG(TRACE) << "Exiting: " << __func__; + return true; + } + + void WebAssemblyViewport::Invalidate() + { + emscripten_request_animation_frame(OnRequestAnimationFrame, reinterpret_cast(this)); + } + + void WebAssemblyViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) + { + if (compositor == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + compositor_.reset(compositor); + } + } + +#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 +// everything OK..... we're using the new setting +#else +#pragma message("WARNING: DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR is not defined or equal to 0. Stone will use the OLD Emscripten rules for DOM element selection.") +#endif + + WebAssemblyViewport::WebAssemblyViewport( + const std::string& canvasId, bool enableEmscriptenMouseEvents) : + canvasId_(canvasId), +#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR == 1 + canvasCssSelector_("#" + canvasId), +#else + canvasCssSelector_(canvasId), +#endif + interactor_(new DefaultViewportInteractor), + enableEmscriptenMouseEvents_(enableEmscriptenMouseEvents) + { + } + + void WebAssemblyViewport::PostConstructor() + { + boost::shared_ptr viewport = shared_from_this(); + controller_.reset(new ViewportController(viewport)); + + LOG(INFO) << "Initializing Stone viewport on HTML canvas: " + << canvasId_; + + if (canvasId_.empty() || + canvasId_[0] == '#') + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange, + "The canvas identifier must not start with '#'"); + } + + // Disable right-click on the canvas (i.e. context menu) + EM_ASM({ + document.getElementById(UTF8ToString($0)).oncontextmenu = + function(event) + { + event.preventDefault(); + } + }, + canvasId_.c_str() // $0 + ); + + // It is not possible to monitor the resizing of individual + // canvas, so we track the full window of the browser + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, + reinterpret_cast(this), + false, + OnResize); + + if (enableEmscriptenMouseEvents_) + { + + // if any of this function causes an error in the console, please + // make sure you are using the new (as of 1.39.x) version of + // emscripten element lookup rules( pass + // "-s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1" to the linker. + + emscripten_set_mousedown_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + OnMouseDown); + + emscripten_set_mousemove_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + OnMouseMove); + + emscripten_set_mouseup_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + OnMouseUp); + } + } + + void WebAssemblyViewport::UpdateCanvasSize() + { + UpdateSize(*compositor_); + } + + WebAssemblyViewport::~WebAssemblyViewport() + { + emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, + reinterpret_cast(this), + false, + NULL); + + if (enableEmscriptenMouseEvents_) + { + + emscripten_set_mousedown_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + NULL); + + emscripten_set_mousemove_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + NULL); + + emscripten_set_mouseup_callback(canvasCssSelector_.c_str(), + reinterpret_cast(this), + false, + NULL); + } + } + + IViewport::ILock* WebAssemblyViewport::Lock() + { + return new WasmLock(*this); + } + + void WebAssemblyViewport::AcquireInteractor(IViewportInteractor* interactor) + { + if (interactor == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + else + { + interactor_.reset(interactor); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebAssemblyViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebAssemblyViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,123 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#if !defined(ORTHANC_ENABLE_WASM) +# error Macro ORTHANC_ENABLE_WASM must be defined +#endif + +#if ORTHANC_ENABLE_WASM != 1 +# error This file can only be used if targeting WebAssembly +#endif + +#include "IViewport.h" + +#include + +#include +#include + +#include +#include + +namespace OrthancStone +{ + class WebAssemblyViewport : public IViewport, + public boost::enable_shared_from_this + + { + private: + class WasmLock; + + std::string canvasId_; + std::string canvasCssSelector_; + std::unique_ptr compositor_; + std::unique_ptr controller_; + std::unique_ptr interactor_; + bool enableEmscriptenMouseEvents_; + + static EM_BOOL OnRequestAnimationFrame(double time, void *userData); + + static EM_BOOL OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData); + + static EM_BOOL OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); + + static EM_BOOL OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); + + static EM_BOOL OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); + + protected: + void Invalidate(); + + void ClearCompositor() + { + compositor_.reset(); + } + + bool HasCompositor() const + { + return compositor_.get() != NULL; + } + + void AcquireCompositor(ICompositor* compositor /* takes ownership */); + + virtual void Paint(ICompositor& compositor, + ViewportController& controller) = 0; + + virtual void UpdateSize(ICompositor& compositor) = 0; + + /** + The second argument is temporary and should be deleted once the migration + to interactors is finished. + */ + WebAssemblyViewport(const std::string& canvasId, + bool enableEmscriptenMouseEvents = true); + + void PostConstructor(); + + public: + virtual ILock* Lock() ORTHANC_OVERRIDE; + + ~WebAssemblyViewport(); + + virtual void UpdateCanvasSize(); + + /** + This method takes ownership + */ + void AcquireInteractor(IViewportInteractor* interactor); + + const std::string& GetCanvasId() const + { + return canvasId_; + } + + /** + emscripten functions requires the css selector for the canvas. This is + different from the canvas id (the syntax is '#mycanvasid') + */ + const std::string& GetCanvasCssSelector() const + { + return canvasCssSelector_; + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebGLViewport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebGLViewport.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,85 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebGLViewport.h" + +#include "../StoneException.h" +#include "../Scene2D/OpenGLCompositor.h" + +namespace OrthancStone +{ + void WebGLViewport::Paint(ICompositor& compositor, + ViewportController& controller) + { + try + { + compositor.Refresh(controller.GetScene()); + + /** + * No need to manually swap the buffer: "Rendered WebGL content + * is implicitly presented (displayed to the user) on the canvas + * when the event handler that renders with WebGL returns back + * to the browser event loop." + * https://emscripten.org/docs/api_reference/html5.h.html#webgl-context + * + * Could call "emscripten_webgl_commit_frame()" if + * "explicitSwapControl" option were set to "true". + **/ + } + catch (const StoneException& e) + { + // Ignore problems about the loss of the WebGL context (edge case) + if (e.GetErrorCode() == ErrorCode_WebGLContextLost) + { + return; + } + else + { + throw; + } + } + } + + + WebGLViewport::WebGLViewport(const std::string& canvasId, bool enableEmscriptenMouseEvents) : + WebAssemblyViewport(canvasId,enableEmscriptenMouseEvents), + context_(GetCanvasCssSelector()) + { + AcquireCompositor(new OpenGLCompositor(context_)); + } + + boost::shared_ptr WebGLViewport::Create( + const std::string& canvasId, bool enableEmscriptenMouseEvents) + { + boost::shared_ptr that = boost::shared_ptr( + new WebGLViewport(canvasId, enableEmscriptenMouseEvents)); + + that->WebAssemblyViewport::PostConstructor(); + return that; + } + + WebGLViewport::~WebGLViewport() + { + // Make sure to delete the compositor before its parent "context_" gets + // deleted + ClearCompositor(); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebGLViewport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebGLViewport.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,55 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebAssemblyViewport.h" +#include "../OpenGL/WebAssemblyOpenGLContext.h" + +namespace OrthancStone +{ + class WebGLViewport : public WebAssemblyViewport + { + private: + OpenGL::WebAssemblyOpenGLContext context_; + + WebGLViewport(const std::string& canvasId, bool enableEmscriptenMouseEvents); + + protected: + virtual void Paint(ICompositor& compositor, + ViewportController& controller) ORTHANC_OVERRIDE; + + virtual void UpdateSize(ICompositor& compositor) ORTHANC_OVERRIDE + { + context_.RefreshCanvasSize(); + } + + public: + static boost::shared_ptr Create(const std::string& canvasId, bool enableEmscriptenMouseEvents = true); + + virtual ~WebGLViewport(); + + bool IsContextLost() + { + return context_.IsContextLost(); + } + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebGLViewportsRegistry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebGLViewportsRegistry.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,185 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "WebGLViewportsRegistry.h" + +#include "../Toolbox/GenericToolbox.h" + +#include + +#include + +namespace OrthancStone +{ + void WebGLViewportsRegistry::LaunchTimer() + { + timeOutID_ = emscripten_set_timeout( + OnTimeoutCallback, + timeoutMS_, + reinterpret_cast(this)); + } + + void WebGLViewportsRegistry::OnTimeout() + { + for (Viewports::iterator it = viewports_.begin(); + it != viewports_.end(); + ++it) + { + if (it->second == NULL || + it->second->IsContextLost()) + { + LOG(INFO) << "WebGL context lost for canvas: " << it->first; + + // Try and duplicate the HTML5 canvas in the DOM + EM_ASM({ + var canvas = document.getElementById(UTF8ToString($0)); + if (canvas) { + var parent = canvas.parentElement; + if (parent) { + var cloned = canvas.cloneNode(true /* deep copy */); + parent.insertBefore(cloned, canvas); + parent.removeChild(canvas); + } + } + }, + it->first.c_str() // $0 = ID of the canvas + ); + + // At this point, the old canvas is removed from the DOM and + // replaced by a fresh one with the same ID: Recreate the + // WebGL context on the new canvas + boost::shared_ptr viewport; + + // we need to steal the properties from the old viewport + // and set them to the new viewport + { + std::unique_ptr lock(it->second->Lock()); + + // TODO: remove ViewportController + Scene2D* scene = lock->GetController().ReleaseScene(); + viewport = WebGLViewport::Create(it->first); + + { + std::unique_ptr newLock(viewport->Lock()); + newLock->GetController().AcquireScene(scene); + } + } + + // Replace the old WebGL viewport by the new one + it->second = viewport; + + // Tag the fresh canvas as needing a repaint + { + std::unique_ptr lock(it->second->Lock()); + lock->Invalidate(); + } + } + } + + LaunchTimer(); + } + + void WebGLViewportsRegistry::OnTimeoutCallback(void *userData) + { + // This object dies with the process or tab. + WebGLViewportsRegistry* that = + reinterpret_cast(userData); + that->OnTimeout(); + } + + WebGLViewportsRegistry::WebGLViewportsRegistry(double timeoutMS) : + timeoutMS_(timeoutMS), + timeOutID_(0) + { + if (timeoutMS <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + LaunchTimer(); + } + + WebGLViewportsRegistry::~WebGLViewportsRegistry() + { + emscripten_clear_timeout(timeOutID_); + Clear(); + } + + boost::shared_ptr WebGLViewportsRegistry::Add( + const std::string& canvasId) + { + if (viewports_.find(canvasId) != viewports_.end()) + { + LOG(ERROR) << "Canvas was already registered: " << canvasId; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + boost::shared_ptr viewport = + WebGLViewport::Create(canvasId); + viewports_[canvasId] = viewport; + return viewport; + } + } + + void WebGLViewportsRegistry::Remove(const std::string& canvasId) + { + Viewports::iterator found = viewports_.find(canvasId); + + if (found == viewports_.end()) + { + LOG(ERROR) << "Cannot remove unregistered canvas: " << canvasId; + } + else + { + viewports_.erase(found); + } + } + + void WebGLViewportsRegistry::Clear() + { + viewports_.clear(); + } + + WebGLViewportsRegistry::Accessor::Accessor(WebGLViewportsRegistry& that, + const std::string& canvasId) : + that_(that) + { + Viewports::iterator viewport = that.viewports_.find(canvasId); + if (viewport != that.viewports_.end() && + viewport->second != NULL) + { + lock_.reset(viewport->second->Lock()); + } + } + + IViewport::ILock& WebGLViewportsRegistry::Accessor::GetViewport() const + { + if (IsValid()) + { + return *lock_; + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Viewport/WebGLViewportsRegistry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Viewport/WebGLViewportsRegistry.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,83 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "WebGLViewport.h" + +#include + +namespace OrthancStone +{ + /** + * This singleton class must be used if many WebGL viewports are + * created by the higher-level application, implying possible loss + * of WebGL contexts. The object will run an infinite update loop + * that checks whether all the WebGL context are still valid (not + * lost). If some WebGL context is lost, it is automatically + * reinitialized by created a fresh HTML5 canvas. + **/ + class WebGLViewportsRegistry : public boost::noncopyable, + public boost::enable_shared_from_this + { + private: + typedef std::map > Viewports; + + double timeoutMS_; + Viewports viewports_; + long timeOutID_; + + void LaunchTimer(); + + void OnTimeout(); + + static void OnTimeoutCallback(void *userData); + + public: + WebGLViewportsRegistry(double timeoutMS /* in milliseconds */); + + ~WebGLViewportsRegistry(); + + boost::shared_ptr Add(const std::string& canvasId); + + void Remove(const std::string& canvasId); + + void Clear(); + + class Accessor : public boost::noncopyable + { + private: + WebGLViewportsRegistry& that_; + std::unique_ptr lock_; + + public: + Accessor(WebGLViewportsRegistry& that, + const std::string& canvasId); + + bool IsValid() const + { + return lock_.get() != NULL; + } + + IViewport::ILock& GetViewport() const; + }; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomStructureSetSlicer2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomStructureSetSlicer2.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,116 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "DicomStructureSetSlicer2.h" + +#include "../Toolbox/GeometryToolbox.h" +#include "../Volumes/IVolumeSlicer.h" +#include "../Scene2D/PolylineSceneLayer.h" + +namespace OrthancStone +{ + DicomStructureSetSlicer2::DicomStructureSetSlicer2(boost::shared_ptr structureSet) + : structureSet_(structureSet) + {} + + IVolumeSlicer::IExtractedSlice* DicomStructureSetSlicer2::ExtractSlice(const CoordinateSystem3D& cuttingPlane) + { + // revision is always the same, hence 0 + return new DicomStructureSetSlice2(structureSet_, 0, cuttingPlane); + } + + DicomStructureSetSlice2::DicomStructureSetSlice2( + boost::weak_ptr structureSet, + uint64_t revision, + const CoordinateSystem3D& cuttingPlane) + : structureSet_(structureSet.lock()) + , isValid_(false) + { + bool opposite = false; + + if (structureSet_->GetStructuresCount() == 0) + { + isValid_ = false; + } + else + { + // some structures seen in real life have no polygons. We must be + // careful + bool found = false; + size_t curStructure = 0; + while (!found && curStructure < structureSet_->GetStructuresCount()) + { + if (structureSet_->GetStructure(curStructure).IsValid()) + { + found = true; + const Vector normal = structureSet_->GetStructure(0).GetNormal(); + isValid_ = ( + GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetNormal()) || + GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisX()) || + GeometryToolbox::IsParallelOrOpposite(opposite, normal, cuttingPlane.GetAxisY())); + } + } + } + } + + ISceneLayer* DicomStructureSetSlice2::CreateSceneLayer( + const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane) + { + assert(isValid_); + + std::unique_ptr layer(new PolylineSceneLayer); + layer->SetThickness(2); // thickness of the on-screen line + + for (size_t i = 0; i < structureSet_->GetStructuresCount(); i++) + { + const DicomStructure2& structure = structureSet_->GetStructure(i); + if (structure.IsValid()) + { + const Color& color = structure.GetColor(); + + std::vector< std::pair > segments; + + if (structure.Project(segments, cuttingPlane)) + { + for (size_t j = 0; j < segments.size(); j++) + { + PolylineSceneLayer::Chain chain; + chain.resize(2); + + chain[0] = ScenePoint2D(segments[j].first.x, segments[j].first.y); + chain[1] = ScenePoint2D(segments[j].second.x, segments[j].second.y); + + layer->AddChain(chain, false /* NOT closed */, color); + } + } + } + } + return layer.release(); + } +} + + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomStructureSetSlicer2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomStructureSetSlicer2.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#include "../Toolbox/DicomStructureSet2.h" +#include "../Volumes/IVolumeSlicer.h" + +#include +#include + +namespace OrthancStone +{ + class DicomStructureSetSlice2 : public IVolumeSlicer::IExtractedSlice + { + public: + DicomStructureSetSlice2( + boost::weak_ptr structureSet, + uint64_t revision, + const CoordinateSystem3D& cuttingPlane); + + virtual bool IsValid() ORTHANC_OVERRIDE + { + return isValid_; + } + + virtual uint64_t GetRevision() ORTHANC_OVERRIDE + { + return revision_; + } + + virtual ISceneLayer* CreateSceneLayer( + const ILayerStyleConfigurator* configurator, // possibly absent + const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; + + private: + boost::shared_ptr structureSet_; + bool isValid_; + uint64_t revision_; + }; + + class DicomStructureSetSlicer2 : public IVolumeSlicer + { + public: + DicomStructureSetSlicer2(boost::shared_ptr structureSet); + + /** IVolumeSlicer impl */ + virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; + private: + boost::weak_ptr structureSet_; + }; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImage.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,99 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomVolumeImage.h" + +#include + + +namespace OrthancStone +{ + void DicomVolumeImage::CheckHasGeometry() const + { + if (!HasGeometry()) + { + LOG(ERROR) << "DicomVolumeImage::CheckHasGeometry(): (!HasGeometry())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void DicomVolumeImage::Initialize( + const VolumeImageGeometry& geometry, + Orthanc::PixelFormat format, + bool computeRange) + { + geometry_.reset(new VolumeImageGeometry(geometry)); + image_.reset(new ImageBuffer3D(format, geometry_->GetWidth(), geometry_->GetHeight(), + geometry_->GetDepth(), computeRange)); + + revision_ ++; + } + + + void DicomVolumeImage::SetDicomParameters(const DicomInstanceParameters& parameters) + { + parameters_.reset(parameters.Clone()); + revision_ ++; + } + + + bool DicomVolumeImage::HasGeometry() const + { + return (geometry_.get() != NULL && + image_.get() != NULL); + } + + + ImageBuffer3D& DicomVolumeImage::GetPixelData() + { + CheckHasGeometry(); + return *image_; + } + + + const ImageBuffer3D& DicomVolumeImage::GetPixelData() const + { + CheckHasGeometry(); + return *image_; + } + + + const VolumeImageGeometry& DicomVolumeImage::GetGeometry() const + { + CheckHasGeometry(); + return *geometry_; + } + + + const DicomInstanceParameters& DicomVolumeImage::GetDicomParameters() const + { + if (HasDicomParameters()) + { + return *parameters_; + } + else + { + LOG(ERROR) << "DicomVolumeImage::GetDicomParameters(): (!HasDicomParameters())"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImage.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,89 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Messages/IMessage.h" +#include "../Toolbox/DicomInstanceParameters.h" +#include "ImageBuffer3D.h" +#include "VolumeImageGeometry.h" + +namespace OrthancStone +{ + /** + This class combines a 3D image buffer, a 3D volume geometry and + information about the DICOM parameters of the series. + (MPR means MultiPlanar Reconstruction) + */ + class DicomVolumeImage : public boost::noncopyable + { + public: + // TODO - Are these messages still useful? + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, GeometryReadyMessage, DicomVolumeImage); + ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, ContentUpdatedMessage, DicomVolumeImage); + + private: + uint64_t revision_; + std::unique_ptr geometry_; + std::unique_ptr image_; + std::unique_ptr parameters_; + + void CheckHasGeometry() const; + + public: + DicomVolumeImage() : + revision_(0) + { + } + + void IncrementRevision() + { + revision_ ++; + } + + void Initialize(const VolumeImageGeometry& geometry, + Orthanc::PixelFormat format, + bool computeRange = false); + + // Used by volume slicers + void SetDicomParameters(const DicomInstanceParameters& parameters); + + uint64_t GetRevision() const + { + return revision_; + } + + bool HasGeometry() const; + + ImageBuffer3D& GetPixelData(); + + const ImageBuffer3D& GetPixelData() const; + + const VolumeImageGeometry& GetGeometry() const; + + bool HasDicomParameters() const + { + return parameters_.get() != NULL; + } + + const DicomInstanceParameters& GetDicomParameters() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,133 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomVolumeImageMPRSlicer.h" + +#include "../StoneException.h" + +#include "../Toolbox/ImageToolbox.h" + +#include +//#include +#include + +namespace OrthancStone +{ + void DicomVolumeImageMPRSlicer::Slice::CheckValid() const + { + if (!valid_) + { + LOG(ERROR) << "DicomVolumeImageMPRSlicer::Slice::CheckValid(): (!valid_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + DicomVolumeImageMPRSlicer::Slice::Slice(const DicomVolumeImage& volume, + const CoordinateSystem3D& cuttingPlane) : + volume_(volume), + revision_(volume_.GetRevision()) + { + valid_ = (volume_.HasDicomParameters() && + volume_.GetGeometry().DetectSlice(projection_, sliceIndex_, cuttingPlane)); + } + + + VolumeProjection DicomVolumeImageMPRSlicer::Slice::GetProjection() const + { + CheckValid(); + return projection_; + } + + + unsigned int DicomVolumeImageMPRSlicer::Slice::GetSliceIndex() const + { + CheckValid(); + return sliceIndex_; + } + + + ISceneLayer* DicomVolumeImageMPRSlicer::Slice::CreateSceneLayer(const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane) + { + CheckValid(); + + if (configurator == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer, + "A style configurator is mandatory for textures"); + } + + std::unique_ptr texture; + + { + const DicomInstanceParameters& parameters = volume_.GetDicomParameters(); + ImageBuffer3D::SliceReader reader(volume_.GetPixelData(), projection_, sliceIndex_); + + texture.reset(dynamic_cast + (configurator->CreateTextureFromDicom(reader.GetAccessor(), parameters))); + } + + const CoordinateSystem3D& system = volume_.GetGeometry().GetProjectionGeometry(projection_); + + double x0, y0, x1, y1; + cuttingPlane.ProjectPoint(x0, y0, system.GetOrigin()); + cuttingPlane.ProjectPoint(x1, y1, system.GetOrigin() + system.GetAxisX()); + + { + double xz, yz; + cuttingPlane.ProjectPoint(xz, yz, LinearAlgebra::CreateVector(0, 0, 0)); + texture->SetOrigin(x0 - xz, y0 - yz); + } + + double dx = x1 - x0; + double dy = y1 - y0; + if (!LinearAlgebra::IsCloseToZero(dx) || + !LinearAlgebra::IsCloseToZero(dy)) + { + texture->SetAngle(atan2(dy, dx)); + } + + Vector tmp = volume_.GetGeometry().GetVoxelDimensions(projection_); + texture->SetPixelSpacing(tmp[0], tmp[1]); + + return texture.release(); + } + + + DicomVolumeImageMPRSlicer::~DicomVolumeImageMPRSlicer() + { + LOG(TRACE) << "DicomVolumeImageMPRSlicer::~DicomVolumeImageMPRSlicer()"; + } + + IVolumeSlicer::IExtractedSlice* + DicomVolumeImageMPRSlicer::ExtractSlice(const CoordinateSystem3D& cuttingPlane) + { + if (volume_->HasGeometry()) + { + return new Slice(*volume_, cuttingPlane); + } + else + { + return new IVolumeSlicer::InvalidSlice; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,101 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "DicomVolumeImage.h" +#include "IVolumeSlicer.h" + +#include + +namespace OrthancStone +{ + /** + Implements the IVolumeSlicer on Dicom volume data when the cutting plane + that is supplied to the slicer is either axial, sagittal or coronal. + Arbitrary planes are *not* supported + */ + class DicomVolumeImageMPRSlicer : public IVolumeSlicer + { + public: + class Slice : public IExtractedSlice + { + private: + const DicomVolumeImage& volume_; + uint64_t revision_; + bool valid_; + VolumeProjection projection_; + unsigned int sliceIndex_; + + void CheckValid() const; + + public: + /** + Represents a slice of a volume image that is parallel to the + coordinate system axis. + The constructor initializes the type of projection (axial, sagittal or + coronal) and the corresponding slice index, from the cutting plane. + */ + Slice(const DicomVolumeImage& volume, + const CoordinateSystem3D& cuttingPlane); + + void SetRevision(uint64_t revision) + { + revision_ = revision; + } + + VolumeProjection GetProjection() const; + + unsigned int GetSliceIndex() const; + + virtual bool IsValid() + { + return valid_; + } + + virtual uint64_t GetRevision() + { + return revision_; + } + + virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane); + }; + + private: + boost::shared_ptr volume_; + + public: + DicomVolumeImageMPRSlicer(const boost::shared_ptr& volume) : + volume_(volume) + { + } + + boost::shared_ptr GetVolume() const + { + return volume_; + } + + virtual ~DicomVolumeImageMPRSlicer(); + + virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) ORTHANC_OVERRIDE; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,116 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "DicomVolumeImageReslicer.h" + +#include + +namespace OrthancStone +{ + class DicomVolumeImageReslicer::Slice : public IVolumeSlicer::IExtractedSlice + { + private: + DicomVolumeImageReslicer& that_; + CoordinateSystem3D cuttingPlane_; + + public: + Slice(DicomVolumeImageReslicer& that, + const CoordinateSystem3D& cuttingPlane) : + that_(that), + cuttingPlane_(cuttingPlane) + { + } + + virtual bool IsValid() + { + return true; + } + + virtual uint64_t GetRevision() + { + return that_.volume_->GetRevision(); + } + + virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane) + { + VolumeReslicer& reslicer = that_.reslicer_; + + if (configurator == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, + "Must provide a layer style configurator"); + } + + reslicer.SetOutputFormat(that_.volume_->GetPixelData().GetFormat()); + reslicer.Apply(that_.volume_->GetPixelData(), + that_.volume_->GetGeometry(), + cuttingPlane); + + if (reslicer.IsSuccess()) + { + std::unique_ptr layer + (configurator->CreateTextureFromDicom(reslicer.GetOutputSlice(), + that_.volume_->GetDicomParameters())); + if (layer.get() == NULL) + { + return NULL; + } + + double s = reslicer.GetPixelSpacing(); + layer->SetPixelSpacing(s, s); + layer->SetOrigin(reslicer.GetOutputExtent().GetX1() + 0.5 * s, + reslicer.GetOutputExtent().GetY1() + 0.5 * s); + + // TODO - Angle!! + + return layer.release(); + } + else + { + return NULL; + } + } + }; + + + DicomVolumeImageReslicer::DicomVolumeImageReslicer(const boost::shared_ptr& volume) : + volume_(volume) + { + if (volume.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + + IVolumeSlicer::IExtractedSlice* DicomVolumeImageReslicer::ExtractSlice(const CoordinateSystem3D& cuttingPlane) + { + if (volume_->HasGeometry()) + { + return new Slice(*this, cuttingPlane); + } + else + { + return new IVolumeSlicer::InvalidSlice; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,69 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "DicomVolumeImage.h" +#include "IVolumeSlicer.h" +#include "VolumeReslicer.h" + +#include + +namespace OrthancStone +{ + /** + This class is able to supply an extract slice for an arbitrary cutting + plane through a volume image + */ + class DicomVolumeImageReslicer : public IVolumeSlicer + { + private: + class Slice; + + boost::shared_ptr volume_; + VolumeReslicer reslicer_; + + public: + DicomVolumeImageReslicer(const boost::shared_ptr& volume); + + ImageInterpolation GetInterpolation() const + { + return reslicer_.GetInterpolation(); + } + + void SetInterpolation(ImageInterpolation interpolation) + { + reslicer_.SetInterpolation(interpolation); + } + + bool IsFastMode() const + { + return reslicer_.IsFastMode(); + } + + void SetFastMode(bool fast) + { + reslicer_.EnableFastMode(fast); + } + + virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/IGeometryProvider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/IGeometryProvider.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,35 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Volumes/VolumeImageGeometry.h" + +namespace OrthancStone +{ + class IGeometryProvider + { + public: + virtual ~IGeometryProvider() {} + virtual bool HasGeometry() const = 0; + virtual const OrthancStone::VolumeImageGeometry& GetImageGeometry() const = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/IVolumeSlicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/IVolumeSlicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,40 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "IVolumeSlicer.h" + +#include + +namespace OrthancStone +{ + uint64_t IVolumeSlicer::InvalidSlice::GetRevision() + { + LOG(ERROR) << "IVolumeSlicer::InvalidSlice::GetRevision()"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + ISceneLayer* IVolumeSlicer::InvalidSlice::CreateSceneLayer(const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane) + { + LOG(ERROR) << "IVolumeSlicer::InvalidSlice::CreateSceneLayer()"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/IVolumeSlicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/IVolumeSlicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,110 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2D/ILayerStyleConfigurator.h" +#include "../Toolbox/CoordinateSystem3D.h" + +namespace OrthancStone +{ + /** + This interface is implemented by objects representing 3D volume data and + that are able to return an object that: + - represent a slice of their data + - are able to create the corresponding slice visual representation. + */ + class IVolumeSlicer : public boost::noncopyable + { + public: + /** + This interface is implemented by objects representing a slice of + volume data and that are able to create a 2D layer to display a this + slice. + + The CreateSceneLayer factory method is called with an optional + configurator that possibly impacts the ISceneLayer subclass that is + created (for instance, if a LUT must be applied on the texture when + displaying it) + */ + class IExtractedSlice : public boost::noncopyable + { + public: + virtual ~IExtractedSlice() + { + } + + /** + Invalid slices are created when the data is not ready yet or if the + cut is outside of the available geometry. + */ + virtual bool IsValid() = 0; + + /** + This retrieves the *revision* that gets incremented every time the + underlying object undergoes a mutable operation (that it, changes its + state). + This **must** be a cheap call. + */ + virtual uint64_t GetRevision() = 0; + + /** Creates the slice visual representation */ + virtual ISceneLayer* CreateSceneLayer( + const ILayerStyleConfigurator* configurator, // possibly absent + const CoordinateSystem3D& cuttingPlane) = 0; + }; + + /** + See IExtractedSlice.IsValid() + */ + class InvalidSlice : public IExtractedSlice + { + public: + virtual bool IsValid() + { + return false; + } + + virtual uint64_t GetRevision(); + + virtual ISceneLayer* CreateSceneLayer(const ILayerStyleConfigurator* configurator, + const CoordinateSystem3D& cuttingPlane); + }; + + + virtual ~IVolumeSlicer() + { + } + + /** + This method is implemented by the objects representing volumetric data + and must returns an IExtractedSlice subclass that contains all the data + needed to, later on, create its visual representation through + CreateSceneLayer. + Subclasses a.o.: + - InvalidSlice, + - DicomVolumeImageMPRSlicer::Slice, + - DicomVolumeImageReslicer::Slice + - DicomStructureSetLoader::Slice + */ + virtual IExtractedSlice* ExtractSlice(const CoordinateSystem3D& cuttingPlane) = 0; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/ImageBuffer3D.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/ImageBuffer3D.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,311 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ImageBuffer3D.h" + +#include +#include +#include + +#include + +namespace OrthancStone +{ + void ImageBuffer3D::GetAxialSliceAccessor(Orthanc::ImageAccessor& target, + unsigned int slice, + bool readOnly) const + { + if (slice >= depth_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (readOnly) + { + target.AssignReadOnly(format_, width_, height_, image_.GetPitch(), + image_.GetConstRow(height_ * (depth_ - 1 - slice))); + } + else + { + target.AssignWritable(format_, width_, height_, image_.GetPitch(), + image_.GetRow(height_ * (depth_ - 1 - slice))); + } + } + + + void ImageBuffer3D::GetCoronalSliceAccessor(Orthanc::ImageAccessor& target, + unsigned int slice, + bool readOnly) const + { + if (slice >= height_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (readOnly) + { + target.AssignReadOnly(format_, width_, depth_, image_.GetPitch() * height_, + image_.GetConstRow(slice)); + } + else + { + target.AssignWritable(format_, width_, depth_, image_.GetPitch() * height_, + image_.GetRow(slice)); + } + } + + + Orthanc::Image* ImageBuffer3D::ExtractSagittalSlice(unsigned int slice) const + { + //LOG(TRACE) << "ImageBuffer3D::ExtractSagittalSlice this= " << std::hex << this << std::dec << " width_ = " << width_ << " height_ = " << height_ << " depth_ = " << depth_ << " slice = " << slice; + if (slice >= width_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + std::unique_ptr result(new Orthanc::Image(format_, height_, depth_, false)); + //LOG(TRACE) << "ImageBuffer3D::ExtractSagittalSlice result will be an image of WIDTH = " << height_ << " and HEIGHT = " << depth_; + + unsigned int bytesPerPixel = Orthanc::GetBytesPerPixel(format_); + + for (unsigned int z = 0; z < depth_; z++) + { + //uint8_t* target = reinterpret_cast(result->GetRow(depth_ - 1 - z)); + uint8_t* target = reinterpret_cast(result->GetRow(z)); + + for (unsigned int y = 0; y < height_; y++) + { + const void* source = (reinterpret_cast(image_.GetConstRow(y + z * height_)) + bytesPerPixel * slice); + const uint8_t* byteSrc = reinterpret_cast(source); + for (size_t byte = 0; byte < bytesPerPixel; ++byte) + target[byte] = byteSrc[byte]; + target += bytesPerPixel; + } + } + + return result.release(); + } + + + ImageBuffer3D::ImageBuffer3D(Orthanc::PixelFormat format, + unsigned int width, + unsigned int height, + unsigned int depth, + bool computeRange) : + image_(format, width, height * depth, false), + format_(format), + width_(width), + height_(height), + depth_(depth), + computeRange_(computeRange), + hasRange_(false) + { + LOG(TRACE) << "Created a 3D image of size " << width << "x" << height + << "x" << depth << " in " << Orthanc::EnumerationToString(format) + << " (" << (GetEstimatedMemorySize() / (1024ll * 1024ll)) << "MB)"; + } + + + void ImageBuffer3D::Clear() + { + memset(image_.GetBuffer(), 0, image_.GetHeight() * image_.GetPitch()); + } + + + uint64_t ImageBuffer3D::GetEstimatedMemorySize() const + { + return image_.GetPitch() * image_.GetHeight() * Orthanc::GetBytesPerPixel(format_); + } + + + void ImageBuffer3D::ExtendImageRange(const Orthanc::ImageAccessor& slice) + { + if (!computeRange_ || + slice.GetWidth() == 0 || + slice.GetHeight() == 0) + { + return; + } + + float sliceMin, sliceMax; + + switch (slice.GetFormat()) + { + case Orthanc::PixelFormat_Grayscale8: + case Orthanc::PixelFormat_Grayscale16: + case Orthanc::PixelFormat_Grayscale32: + case Orthanc::PixelFormat_SignedGrayscale16: + { + int64_t a, b; + Orthanc::ImageProcessing::GetMinMaxIntegerValue(a, b, slice); + sliceMin = static_cast(a); + sliceMax = static_cast(b); + break; + } + + case Orthanc::PixelFormat_Float32: + Orthanc::ImageProcessing::GetMinMaxFloatValue(sliceMin, sliceMax, slice); + break; + + default: + return; + } + + if (hasRange_) + { + minValue_ = std::min(minValue_, sliceMin); + maxValue_ = std::max(maxValue_, sliceMax); + } + else + { + hasRange_ = true; + minValue_ = sliceMin; + maxValue_ = sliceMax; + } + } + + + bool ImageBuffer3D::GetRange(float& minValue, + float& maxValue) const + { + if (hasRange_) + { + minValue = minValue_; + maxValue = maxValue_; + return true; + } + else + { + return false; + } + } + + + ImageBuffer3D::SliceReader::SliceReader(const ImageBuffer3D& that, + VolumeProjection projection, + unsigned int slice) + { + switch (projection) + { + case VolumeProjection_Axial: + that.GetAxialSliceAccessor(accessor_, slice, true); + break; + + case VolumeProjection_Coronal: + that.GetCoronalSliceAccessor(accessor_, slice, true); + break; + + case VolumeProjection_Sagittal: + sagittal_.reset(that.ExtractSagittalSlice(slice)); + sagittal_->GetReadOnlyAccessor(accessor_); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + void ImageBuffer3D::SliceWriter::Flush() + { + if (modified_) + { + if (sagittal_.get() != NULL) + { + // TODO + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + + // Update the dynamic range of the underlying image, if + // "computeRange_" is set to true + that_.ExtendImageRange(accessor_); + } + } + + + ImageBuffer3D::SliceWriter::SliceWriter(ImageBuffer3D& that, + VolumeProjection projection, + unsigned int slice) : + that_(that), + modified_(false) + { + switch (projection) + { + case VolumeProjection_Axial: + that.GetAxialSliceAccessor(accessor_, slice, false); + break; + + case VolumeProjection_Coronal: + that.GetCoronalSliceAccessor(accessor_, slice, false); + break; + + case VolumeProjection_Sagittal: + sagittal_.reset(that.ExtractSagittalSlice(slice)); + sagittal_->GetWriteableAccessor(accessor_); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + uint8_t ImageBuffer3D::GetVoxelGrayscale8(unsigned int x, + unsigned int y, + unsigned int z) const + { + if (format_ != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (x >= width_ || + y >= height_ || + z >= depth_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const void* p = image_.GetConstRow(y + height_ * (depth_ - 1 - z)); + return reinterpret_cast(p) [x]; + } + + + uint16_t ImageBuffer3D::GetVoxelGrayscale16(unsigned int x, + unsigned int y, + unsigned int z) const + { + if (format_ != Orthanc::PixelFormat_Grayscale16) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + if (x >= width_ || + y >= height_ || + z >= depth_) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const void* p = image_.GetConstRow(y + height_ * (depth_ - 1 - z)); + return reinterpret_cast(p) [x]; + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/ImageBuffer3D.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/ImageBuffer3D.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,231 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "../Toolbox/LinearAlgebra.h" + +#include +#include + +namespace OrthancStone +{ + /* + + This classes stores volume images sliced across the Z axis, vertically, in the decreasing Z order : + + +---------------+ + | | + | SLICE N-1 | + | | + +---------------+ + | | + | SLICE N-2 | + | | + +---------------+ + | | + | SLICE N-3 | + | | + . . + ...... ...... + . . + | | + | SLICE 2 | + | | + +---------------+ + | | + | SLICE 1 | + | | + +---------------+ + | | + | SLICE 0 | + | | + +---------------+ + + As you can see, if the 3d image has size width, height, depth, the 2d image has : + - 2d width = 3d width + - 2d height = 3d height * 3d depth + + */ + + class ImageBuffer3D : public boost::noncopyable + { + private: + Orthanc::Image image_; + Orthanc::PixelFormat format_; + unsigned int width_; + unsigned int height_; + unsigned int depth_; + bool computeRange_; + bool hasRange_; + float minValue_; + float maxValue_; + Matrix transform_; + Matrix transformInverse_; + + void ExtendImageRange(const Orthanc::ImageAccessor& slice); + + void GetAxialSliceAccessor(Orthanc::ImageAccessor& target, + unsigned int slice, + bool readOnly) const; + + void GetCoronalSliceAccessor(Orthanc::ImageAccessor& target, + unsigned int slice, + bool readOnly) const; + + Orthanc::Image* ExtractSagittalSlice(unsigned int slice) const; + + template + T GetPixelUnchecked(unsigned int x, + unsigned int y, + unsigned int z) const + { + const uint8_t* buffer = reinterpret_cast(image_.GetConstBuffer()); + const uint8_t* row = buffer + (y + height_ * (depth_ - 1 - z)) * image_.GetPitch(); + return reinterpret_cast(row) [x]; + } + + public: + ImageBuffer3D(Orthanc::PixelFormat format, + unsigned int width, + unsigned int height, + unsigned int depth, + bool computeRange); + + void Clear(); + + const Orthanc::ImageAccessor& GetInternalImage() const + { + return image_; + } + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + unsigned int GetDepth() const + { + return depth_; + } + + Orthanc::PixelFormat GetFormat() const + { + return format_; + } + + unsigned int GetBytesPerPixel() const + { + return Orthanc::GetBytesPerPixel(format_); + } + + uint64_t GetEstimatedMemorySize() const; + + bool GetRange(float& minValue, + float& maxValue) const; + + uint8_t GetVoxelGrayscale8Unchecked(unsigned int x, + unsigned int y, + unsigned int z) const + { + return GetPixelUnchecked(x, y, z); + } + + uint16_t GetVoxelGrayscale16Unchecked(unsigned int x, + unsigned int y, + unsigned int z) const + { + return GetPixelUnchecked(x, y, z); + } + + int16_t GetVoxelSignedGrayscale16Unchecked(unsigned int x, + unsigned int y, + unsigned int z) const + { + return GetPixelUnchecked(x, y, z); + } + + uint8_t GetVoxelGrayscale8(unsigned int x, + unsigned int y, + unsigned int z) const; + + uint16_t GetVoxelGrayscale16(unsigned int x, + unsigned int y, + unsigned int z) const; + + + class SliceReader : public boost::noncopyable + { + private: + Orthanc::ImageAccessor accessor_; + std::unique_ptr sagittal_; // Unused for axial and coronal + + public: + SliceReader(const ImageBuffer3D& that, + VolumeProjection projection, + unsigned int slice); + + const Orthanc::ImageAccessor& GetAccessor() const + { + return accessor_; + } + }; + + + class SliceWriter : public boost::noncopyable + { + private: + ImageBuffer3D& that_; + bool modified_; + Orthanc::ImageAccessor accessor_; + std::unique_ptr sagittal_; // Unused for axial and coronal + + void Flush(); + + public: + SliceWriter(ImageBuffer3D& that, + VolumeProjection projection, + unsigned int slice); + + ~SliceWriter() + { + Flush(); + } + + const Orthanc::ImageAccessor& GetAccessor() const + { + return accessor_; + } + + Orthanc::ImageAccessor& GetAccessor() + { + modified_ = true; + return accessor_; + } + }; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/OrientedVolumeBoundingBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/OrientedVolumeBoundingBox.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,268 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "OrientedVolumeBoundingBox.h" + +#include "../Toolbox/GeometryToolbox.h" +#include "ImageBuffer3D.h" + +#include + +#include + +namespace OrthancStone +{ + OrientedVolumeBoundingBox::OrientedVolumeBoundingBox(const VolumeImageGeometry& geometry) + { + unsigned int n = geometry.GetDepth(); + if (n < 1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageSize); + } + + Vector dim = geometry.GetVoxelDimensions(VolumeProjection_Axial); + + u_ = geometry.GetAxialGeometry().GetAxisX(); + v_ = geometry.GetAxialGeometry().GetAxisY(); + w_ = geometry.GetAxialGeometry().GetNormal(); + + hu_ = static_cast(geometry.GetWidth() * dim[0] / 2.0); + hv_ = static_cast(geometry.GetHeight() * dim[1] / 2.0); + hw_ = static_cast(geometry.GetDepth() * dim[2] / 2.0); + + c_ = (geometry.GetAxialGeometry().GetOrigin() + + (hu_ - dim[0] / 2.0) * u_ + + (hv_ - dim[1] / 2.0) * v_ + + (hw_ - dim[2] / 2.0) * w_); + } + + + bool OrientedVolumeBoundingBox::HasIntersectionWithPlane(std::vector& points, + const Vector& normal, + double d) const + { + assert(normal.size() == 3); + + double r = (hu_ * fabs(boost::numeric::ublas::inner_prod(normal, u_)) + + hv_ * fabs(boost::numeric::ublas::inner_prod(normal, v_)) + + hw_ * fabs(boost::numeric::ublas::inner_prod(normal, w_))); + + double s = boost::numeric::ublas::inner_prod(normal, c_) + d; + + if (fabs(s) >= r) + { + // No intersection, or intersection is reduced to a single point + return false; + } + else + { + Vector p; + + // Loop over all the 12 edges (segments) of the oriented + // bounding box, and check whether they intersect the plane + + // X-aligned edges + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, + c_ + u_ * hu_ - v_ * hv_ - w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ + v_ * hv_ - w_ * hw_, + c_ + u_ * hu_ + v_ * hv_ - w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ - v_ * hv_ + w_ * hw_, + c_ + u_ * hu_ - v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ + v_ * hv_ + w_ * hw_, + c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + // Y-aligned edges + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, + c_ - u_ * hu_ + v_ * hv_ - w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ + u_ * hu_ - v_ * hv_ - w_ * hw_, + c_ + u_ * hu_ + v_ * hv_ - w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ - v_ * hv_ + w_ * hw_, + c_ - u_ * hu_ + v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ + u_ * hu_ - v_ * hv_ + w_ * hw_, + c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + // Z-aligned edges + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ - v_ * hv_ - w_ * hw_, + c_ - u_ * hu_ - v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ + u_ * hu_ - v_ * hv_ - w_ * hw_, + c_ + u_ * hu_ - v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ - u_ * hu_ + v_ * hv_ - w_ * hw_, + c_ - u_ * hu_ + v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + if (GeometryToolbox::IntersectPlaneAndSegment + (p, normal, d, + c_ + u_ * hu_ + v_ * hv_ - w_ * hw_, + c_ + u_ * hu_ + v_ * hv_ + w_ * hw_)) + { + points.push_back(p); + } + + return true; + } + } + + + bool OrientedVolumeBoundingBox::HasIntersection(std::vector& points, + const CoordinateSystem3D& plane) const + { + // From the vector equation of a 3D plane (specified by origin + // and normal), to the general equation of a 3D plane (which + // looses information about the origin of the coordinate system) + const Vector& normal = plane.GetNormal(); + const Vector& origin = plane.GetOrigin(); + double d = -(normal[0] * origin[0] + normal[1] * origin[1] + normal[2] * origin[2]); + + return HasIntersectionWithPlane(points, normal, d); + } + + + bool OrientedVolumeBoundingBox::Contains(const Vector& p) const + { + assert(p.size() == 3); + + const Vector q = p - c_; + + return (fabs(boost::numeric::ublas::inner_prod(q, u_)) <= hu_ && + fabs(boost::numeric::ublas::inner_prod(q, v_)) <= hv_ && + fabs(boost::numeric::ublas::inner_prod(q, w_)) <= hw_); + } + + + void OrientedVolumeBoundingBox::FromInternalCoordinates(Vector& target, + double x, + double y, + double z) const + { + target = (c_ + + u_ * 2.0 * hu_ * (x - 0.5) + + v_ * 2.0 * hv_ * (y - 0.5) + + w_ * 2.0 * hw_ * (z - 0.5)); + } + + + void OrientedVolumeBoundingBox::FromInternalCoordinates(Vector& target, + const Vector& source) const + { + assert(source.size() == 3); + FromInternalCoordinates(target, source[0], source[1], source[2]); + } + + + void OrientedVolumeBoundingBox::ToInternalCoordinates(Vector& target, + const Vector& source) const + { + assert(source.size() == 3); + const Vector q = source - c_; + + double x = boost::numeric::ublas::inner_prod(q, u_) / (2.0 * hu_) + 0.5; + double y = boost::numeric::ublas::inner_prod(q, v_) / (2.0 * hv_) + 0.5; + double z = boost::numeric::ublas::inner_prod(q, w_) / (2.0 * hw_) + 0.5; + + LinearAlgebra::AssignVector(target, x, y, z); + } + + + bool OrientedVolumeBoundingBox::ComputeExtent(Extent2D& extent, + const CoordinateSystem3D& plane) const + { + extent.Reset(); + + std::vector points; + if (HasIntersection(points, plane)) + { + for (size_t i = 0; i < points.size(); i++) + { + double x, y; + plane.ProjectPoint(x, y, points[i]); + extent.AddPoint(x, y); + } + + return true; + } + else + { + return false; + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/OrientedVolumeBoundingBox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/OrientedVolumeBoundingBox.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,74 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/CoordinateSystem3D.h" +#include "../Toolbox/Extent2D.h" +#include "../Toolbox/LinearAlgebra.h" +#include "VolumeImageGeometry.h" + +namespace OrthancStone +{ + class OrientedVolumeBoundingBox : public boost::noncopyable + { + private: + Vector c_; // center + Vector u_; // normalized width vector + Vector v_; // normalized height vector + Vector w_; // normalized depth vector + double hu_; // half width + double hv_; // half height + double hw_; // half depth + + public: + OrientedVolumeBoundingBox(const VolumeImageGeometry& geometry); + + const Vector& GetCenter() const + { + return c_; + } + + bool HasIntersectionWithPlane(std::vector& points, + const Vector& normal, + double d) const; + + bool HasIntersection(std::vector& points, + const CoordinateSystem3D& plane) const; + + bool Contains(const Vector& p) const; + + void FromInternalCoordinates(Vector& target, + double x, + double y, + double z) const; + + void FromInternalCoordinates(Vector& target, + const Vector& source) const; + + void ToInternalCoordinates(Vector& target, + const Vector& source) const; + + bool ComputeExtent(Extent2D& extent, + const CoordinateSystem3D& plane) const; + }; +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeImageGeometry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeImageGeometry.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,356 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "VolumeImageGeometry.h" + +#include "../Toolbox/GeometryToolbox.h" + +#include + + +namespace OrthancStone +{ + void VolumeImageGeometry::Invalidate() + { + Vector p = (axialGeometry_.GetOrigin() + + static_cast(depth_ - 1) * voxelDimensions_[2] * axialGeometry_.GetNormal()); + + coronalGeometry_ = CoordinateSystem3D(p, + axialGeometry_.GetAxisX(), + -axialGeometry_.GetNormal()); + + sagittalGeometry_ = CoordinateSystem3D(p, + axialGeometry_.GetAxisY(), + -axialGeometry_.GetNormal()); + + Vector origin = ( + axialGeometry_.MapSliceToWorldCoordinates(-0.5 * voxelDimensions_[0], + -0.5 * voxelDimensions_[1]) - + 0.5 * voxelDimensions_[2] * axialGeometry_.GetNormal()); + + LOG(TRACE) << "VolumeImageGeometry::Invalidate() origin = " << origin(0) << "," << origin(1) << "," << origin(2) << " | width_ = " << width_ << " | height_ = " << height_ << " | depth_ = " << depth_; + + Vector scaling; + + if (width_ == 0 || + height_ == 0 || + depth_ == 0) + { + LinearAlgebra::AssignVector(scaling, 1, 1, 1); + } + else + { + scaling = ( + axialGeometry_.GetAxisX() * voxelDimensions_[0] * static_cast(width_) + + axialGeometry_.GetAxisY() * voxelDimensions_[1] * static_cast(height_) + + axialGeometry_.GetNormal() * voxelDimensions_[2] * static_cast(depth_)); + } + + transform_ = LinearAlgebra::Product( + GeometryToolbox::CreateTranslationMatrix(origin[0], origin[1], origin[2]), + GeometryToolbox::CreateScalingMatrix(scaling[0], scaling[1], scaling[2])); + + LinearAlgebra::InvertMatrix(transformInverse_, transform_); + } + + + VolumeImageGeometry::VolumeImageGeometry() : + width_(0), + height_(0), + depth_(0) + { + LinearAlgebra::AssignVector(voxelDimensions_, 1, 1, 1); + Invalidate(); + } + + + void VolumeImageGeometry::SetSizeInVoxels(unsigned int width, + unsigned int height, + unsigned int depth) + { + width_ = width; + height_ = height; + depth_ = depth; + Invalidate(); + } + + + void VolumeImageGeometry::SetAxialGeometry(const CoordinateSystem3D& geometry) + { + axialGeometry_ = geometry; + Invalidate(); + } + + + void VolumeImageGeometry::SetVoxelDimensions(double x, + double y, + double z) + { + if (x <= 0 || + y <= 0 || + z <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + else + { + LinearAlgebra::AssignVector(voxelDimensions_, x, y, z); + Invalidate(); + } + } + + + const CoordinateSystem3D& VolumeImageGeometry::GetProjectionGeometry(VolumeProjection projection) const + { + switch (projection) + { + case VolumeProjection_Axial: + return axialGeometry_; + + case VolumeProjection_Coronal: + return coronalGeometry_; + + case VolumeProjection_Sagittal: + return sagittalGeometry_; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + Vector VolumeImageGeometry::GetVoxelDimensions(VolumeProjection projection) const + { + switch (projection) + { + case VolumeProjection_Axial: + return voxelDimensions_; + + case VolumeProjection_Coronal: + return LinearAlgebra::CreateVector(voxelDimensions_[0], voxelDimensions_[2], voxelDimensions_[1]); + + case VolumeProjection_Sagittal: + return LinearAlgebra::CreateVector(voxelDimensions_[1], voxelDimensions_[2], voxelDimensions_[0]); + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + unsigned int VolumeImageGeometry::GetProjectionWidth(VolumeProjection projection) const + { + switch (projection) + { + case VolumeProjection_Axial: + return width_; + + case VolumeProjection_Coronal: + return width_; + + case VolumeProjection_Sagittal: + return height_; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + unsigned int VolumeImageGeometry::GetProjectionHeight(VolumeProjection projection) const + { + switch (projection) + { + case VolumeProjection_Axial: + return height_; + + case VolumeProjection_Coronal: + return depth_; + + case VolumeProjection_Sagittal: + return depth_; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + unsigned int VolumeImageGeometry::GetProjectionDepth(VolumeProjection projection) const + { + switch (projection) + { + case VolumeProjection_Axial: + return depth_; + + case VolumeProjection_Coronal: + return height_; + + case VolumeProjection_Sagittal: + return width_; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + } + + + Vector VolumeImageGeometry::GetCoordinates(float x, + float y, + float z) const + { + Vector p = LinearAlgebra::Product(transform_, LinearAlgebra::CreateVector(x, y, z, 1)); + + assert(LinearAlgebra::IsNear(p[3], 1)); // Affine transform, no perspective effect + + // Back to non-homogeneous coordinates + return LinearAlgebra::CreateVector(p[0], p[1], p[2]); + } + + + bool VolumeImageGeometry::DetectProjection(VolumeProjection& projection, + const Vector& planeNormal) const + { + if (GeometryToolbox::IsParallel(planeNormal, axialGeometry_.GetNormal())) + { + projection = VolumeProjection_Axial; + return true; + } + else if (GeometryToolbox::IsParallel(planeNormal, coronalGeometry_.GetNormal())) + { + projection = VolumeProjection_Coronal; + return true; + } + else if (GeometryToolbox::IsParallel(planeNormal, sagittalGeometry_.GetNormal())) + { + projection = VolumeProjection_Sagittal; + return true; + } + else + { + return false; + } + } + + + bool VolumeImageGeometry::DetectSlice(VolumeProjection& projection, + unsigned int& slice, + const CoordinateSystem3D& plane) const + { + if (!DetectProjection(projection, plane.GetNormal())) + { + return false; + } + + // Transforms the coordinates of the origin of the plane, into the + // coordinates of the axial geometry + const Vector& origin = plane.GetOrigin(); + Vector p = LinearAlgebra::Product( + transformInverse_, + LinearAlgebra::CreateVector(origin[0], origin[1], origin[2], 1)); + + assert(LinearAlgebra::IsNear(p[3], 1)); + + double z; + + switch (projection) + { + case VolumeProjection_Axial: + z = p[2]; + break; + + case VolumeProjection_Coronal: + z = p[1]; + break; + + case VolumeProjection_Sagittal: + z = p[0]; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + const unsigned int projectionDepth = GetProjectionDepth(projection); + + z *= static_cast(projectionDepth); + if (z < 0) + { + return false; + } + else + { + unsigned int d = static_cast(std::floor(z)); + if (d >= projectionDepth) + { + return false; + } + else + { + slice = d; + return true; + } + } + } + + + CoordinateSystem3D VolumeImageGeometry::GetProjectionSlice(VolumeProjection projection, + unsigned int z) const + { + if (z >= GetProjectionDepth(projection)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + Vector dim = GetVoxelDimensions(projection); + CoordinateSystem3D plane = GetProjectionGeometry(projection); + + Vector normal = plane.GetNormal(); + if (projection == VolumeProjection_Sagittal) + { + /** + * WARNING: In sagittal geometry, the normal points to REDUCING + * X-axis in the 3D world. This is necessary to keep the + * right-hand coordinate system. Hence the negation. + **/ + normal = -normal; + } + + plane.SetOrigin(plane.GetOrigin() + static_cast(z) * dim[2] * normal); + + return plane; + } + + std::ostream& operator<<(std::ostream& s, const VolumeImageGeometry& v) + { + s << "width: " << v.width_ << " height: " << v.height_ + << " depth: " << v.depth_ + << " axialGeometry: " << v.axialGeometry_ + << " coronalGeometry: " << v.coronalGeometry_ + << " sagittalGeometry: " << v.sagittalGeometry_ + << " voxelDimensions_: " << v.voxelDimensions_ + << " height: " << v.height_ + << " transform: " << v.transform_ + << " transformInverse: " << v.transformInverse_; + return s; + } + +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeImageGeometry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeImageGeometry.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,138 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../StoneEnumerations.h" +#include "../Toolbox/CoordinateSystem3D.h" + +#include + +namespace OrthancStone +{ + class VolumeImageGeometry + { + private: + unsigned int width_; + unsigned int height_; + unsigned int depth_; + CoordinateSystem3D axialGeometry_; + CoordinateSystem3D coronalGeometry_; + CoordinateSystem3D sagittalGeometry_; + Vector voxelDimensions_; + Matrix transform_; + Matrix transformInverse_; + + void Invalidate(); + + friend std::ostream& operator<<(std::ostream& s, const VolumeImageGeometry& v); + + public: + VolumeImageGeometry(); + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + unsigned int GetDepth() const + { + return depth_; + } + + const CoordinateSystem3D& GetAxialGeometry() const + { + return axialGeometry_; + } + + const CoordinateSystem3D& GetCoronalGeometry() const + { + return coronalGeometry_; + } + + const CoordinateSystem3D& GetSagittalGeometry() const + { + return sagittalGeometry_; + } + + const CoordinateSystem3D& GetProjectionGeometry(VolumeProjection projection) const; + + const Matrix& GetTransform() const + { + return transform_; + } + + const Matrix& GetTransformInverse() const + { + return transformInverse_; + } + + void SetSizeInVoxels(unsigned int width, + unsigned int height, + unsigned int depth); + + // Set the geometry of the first axial slice (i.e. the one whose + // depth == 0) + void SetAxialGeometry(const CoordinateSystem3D& geometry); + + void SetVoxelDimensions(double x, + double y, + double z); + + Vector GetVoxelDimensions(VolumeProjection projection) const; + + unsigned int GetProjectionWidth(VolumeProjection projection) const; + + unsigned int GetProjectionHeight(VolumeProjection projection) const; + + unsigned int GetProjectionDepth(VolumeProjection projection) const; + + // Get the 3D position of a point in the volume, where x, y and z + // lie in the [0;1] range + Vector GetCoordinates(float x, + float y, + float z) const; + + bool DetectProjection(VolumeProjection& projection, + const Vector& planeNormal) const; + + /** + Being given a cutting plane, this method will determine if it is an + axial, sagittal or coronal cut and returns + the slice number corresponding to this cut. + + If the cutting plane is not parallel to the three x = 0, y = 0 or z = 0 + planes, it is considered as arbitrary and the method returns false. + Otherwise, it returns true. + */ + bool DetectSlice(VolumeProjection& projection, + unsigned int& slice, + const CoordinateSystem3D& plane) const; + + CoordinateSystem3D GetProjectionSlice(VolumeProjection projection, + unsigned int z) const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeReslicer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeReslicer.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,839 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "VolumeReslicer.h" + +#include "../Toolbox/GeometryToolbox.h" +#include "../Toolbox/SubvoxelReader.h" + +#include +#include +#include + +#include + +namespace OrthancStone +{ + // Anonymous namespace to avoid clashes between compilation modules + namespace + { + enum TransferFunction + { + TransferFunction_Copy, + TransferFunction_Float, + TransferFunction_Linear + }; + + + template + class PixelShader; + + + template + class PixelShader + { + private: + typedef SubvoxelReader VoxelReader; + typedef Orthanc::PixelTraits PixelWriter; + + VoxelReader reader_; + + public: + PixelShader(const ImageBuffer3D& image, + float /* scaling */, + float /* offset */) : + reader_(image) + { + } + + ORTHANC_FORCE_INLINE + void Apply(typename PixelWriter::PixelType* pixel, + float volumeX, + float volumeY, + float volumeZ) + { + typename VoxelReader::PixelType value; + + if (!reader_.GetValue(value, volumeX, volumeY, volumeZ)) + { + VoxelReader::Traits::SetMinValue(value); + } + + *pixel = value; + } + }; + + + template + class PixelShader + { + private: + typedef SubvoxelReader VoxelReader; + typedef Orthanc::PixelTraits PixelWriter; + + VoxelReader reader_; + + public: + PixelShader(const ImageBuffer3D& image, + float /* scaling */, + float /* offset */) : + reader_(image) + { + } + + ORTHANC_FORCE_INLINE + void Apply(typename PixelWriter::PixelType* pixel, + float volumeX, + float volumeY, + float volumeZ) + { + typename VoxelReader::PixelType value; + + if (!reader_.GetValue(value, volumeX, volumeY, volumeZ)) + { + VoxelReader::Traits::SetMinValue(value); + } + + PixelWriter::FloatToPixel(*pixel, VoxelReader::Traits::PixelToFloat(value)); + } + }; + + + template + class PixelShader + { + private: + typedef SubvoxelReader VoxelReader; + typedef Orthanc::PixelTraits PixelWriter; + + VoxelReader reader_; + float outOfVolume_; + + public: + PixelShader(const ImageBuffer3D& image, + float /* scaling */, + float /* offset */) : + reader_(image), + outOfVolume_(static_cast(std::numeric_limits::min())) + { + } + + ORTHANC_FORCE_INLINE + void Apply(typename PixelWriter::PixelType* pixel, + float volumeX, + float volumeY, + float volumeZ) + { + float value; + + if (!reader_.GetFloatValue(value, volumeX, volumeY, volumeZ)) + { + value = outOfVolume_; + } + + PixelWriter::FloatToPixel(*pixel, value); + } + }; + + + template + class PixelShader + { + private: + typedef SubvoxelReader VoxelReader; + typedef Orthanc::PixelTraits PixelWriter; + + VoxelReader reader_; + float scaling_; + float offset_; + float outOfVolume_; + + public: + PixelShader(const ImageBuffer3D& image, + float scaling, + float offset) : + reader_(image), + scaling_(scaling), + offset_(offset), + outOfVolume_(static_cast(std::numeric_limits::min())) + { + } + + ORTHANC_FORCE_INLINE + void Apply(typename PixelWriter::PixelType* pixel, + float volumeX, + float volumeY, + float volumeZ) + { + float value; + + if (reader_.GetFloatValue(value, volumeX, volumeY, volumeZ)) + { + value = scaling_ * value + offset_; + } + else + { + value = outOfVolume_; + } + + PixelWriter::FloatToPixel(*pixel, value); + } + }; + + + + class FastRowIterator : public boost::noncopyable + { + private: + float position_[3]; + float offset_[3]; + + public: + FastRowIterator(const Orthanc::ImageAccessor& slice, + const Extent2D& extent, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box, + unsigned int y) + { + const double width = static_cast(slice.GetWidth()); + const double height = static_cast(slice.GetHeight()); + assert(y < height); + + Vector q1 = plane.MapSliceToWorldCoordinates + (extent.GetX1() + extent.GetWidth() * static_cast(0) / static_cast(width + 1), + extent.GetY1() + extent.GetHeight() * static_cast(y) / static_cast(height + 1)); + + Vector q2 = plane.MapSliceToWorldCoordinates + (extent.GetX1() + extent.GetWidth() * static_cast(width - 1) / static_cast(width + 1), + extent.GetY1() + extent.GetHeight() * static_cast(y) / static_cast(height + 1)); + + Vector r1, r2; + box.ToInternalCoordinates(r1, q1); + box.ToInternalCoordinates(r2, q2); + + position_[0] = static_cast(r1[0]); + position_[1] = static_cast(r1[1]); + position_[2] = static_cast(r1[2]); + + Vector tmp = (r2 - r1) / static_cast(width - 1); + offset_[0] = static_cast(tmp[0]); + offset_[1] = static_cast(tmp[1]); + offset_[2] = static_cast(tmp[2]); + } + + ORTHANC_FORCE_INLINE + void Next() + { + position_[0] += offset_[0]; + position_[1] += offset_[1]; + position_[2] += offset_[2]; + } + + ORTHANC_FORCE_INLINE + void GetVolumeCoordinates(float& x, + float& y, + float& z) const + { + x = position_[0]; + y = position_[1]; + z = position_[2]; + } + }; + + + class SlowRowIterator : public boost::noncopyable + { + private: + const Orthanc::ImageAccessor& slice_; + const Extent2D& extent_; + const CoordinateSystem3D& plane_; + const OrientedVolumeBoundingBox& box_; + unsigned int x_; + unsigned int y_; + + public: + SlowRowIterator(const Orthanc::ImageAccessor& slice, + const Extent2D& extent, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box, + unsigned int y) : + slice_(slice), + extent_(extent), + plane_(plane), + box_(box), + x_(0), + y_(y) + { + assert(y_ < slice_.GetHeight()); + } + + void Next() + { + x_++; + } + + void GetVolumeCoordinates(float& x, + float& y, + float& z) const + { + assert(x_ < slice_.GetWidth()); + + const double width = static_cast(slice_.GetWidth()); + const double height = static_cast(slice_.GetHeight()); + + Vector q = plane_.MapSliceToWorldCoordinates + (extent_.GetX1() + extent_.GetWidth() * static_cast(x_) / (width + 1.0), + extent_.GetY1() + extent_.GetHeight() * static_cast(y_) / (height + 1.0)); + + Vector r; + box_.ToInternalCoordinates(r, q); + + x = static_cast(r[0]); + y = static_cast(r[1]); + z = static_cast(r[2]); + } + }; + + + template + static void ProcessImage(Orthanc::ImageAccessor& slice, + const Extent2D& extent, + const ImageBuffer3D& source, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box, + float scaling, + float offset) + { + typedef PixelShader Shader; + + const unsigned int outputWidth = slice.GetWidth(); + const unsigned int outputHeight = slice.GetHeight(); + + const float sourceWidth = static_cast(source.GetWidth()); + const float sourceHeight = static_cast(source.GetHeight()); + const float sourceDepth = static_cast(source.GetDepth()); + + Shader shader(source, scaling, offset); + + for (unsigned int y = 0; y < outputHeight; y++) + { + typedef typename Orthanc::ImageTraits::PixelType PixelType; + PixelType* p = reinterpret_cast(slice.GetRow(y)); + + RowIterator it(slice, extent, plane, box, y); + + for (unsigned int x = 0; x < outputWidth; x++, p++) + { + float volumeX, volumeY, volumeZ; + it.GetVolumeCoordinates(volumeX, volumeY, volumeZ); + + shader.Apply(p, + volumeX * sourceWidth, + volumeY * sourceHeight, + volumeZ * sourceDepth); + it.Next(); + } + } + } + + + template + static void ProcessImage(Orthanc::ImageAccessor& slice, + const Extent2D& extent, + const ImageBuffer3D& source, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box, + ImageInterpolation interpolation, + bool hasLinearFunction, + float scaling, + float offset) + { + if (hasLinearFunction) + { + switch (interpolation) + { + case ImageInterpolation_Nearest: + ProcessImage + (slice, extent, source, plane, box, scaling, offset); + break; + + case ImageInterpolation_Bilinear: + ProcessImage + (slice, extent, source, plane, box, scaling, offset); + break; + + case ImageInterpolation_Trilinear: + ProcessImage + (slice, extent, source, plane, box, scaling, offset); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + else + { + switch (interpolation) + { + case ImageInterpolation_Nearest: + ProcessImage + (slice, extent, source, plane, box, 0, 0); + break; + + case ImageInterpolation_Bilinear: + ProcessImage + (slice, extent, source, plane, box, 0, 0); + break; + + case ImageInterpolation_Trilinear: + ProcessImage + (slice, extent, source, plane, box, 0, 0); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + + template + static void ProcessImage(Orthanc::ImageAccessor& slice, + const Extent2D& extent, + const ImageBuffer3D& source, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box, + ImageInterpolation interpolation, + bool hasLinearFunction, + float scaling, + float offset) + { + if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && + slice.GetFormat() == Orthanc::PixelFormat_Grayscale8) + { + ProcessImage + (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); + } + else if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && + slice.GetFormat() == Orthanc::PixelFormat_Grayscale16) + { + ProcessImage + (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); + } + else if (source.GetFormat() == Orthanc::PixelFormat_SignedGrayscale16 && + slice.GetFormat() == Orthanc::PixelFormat_BGRA32) + { + ProcessImage + (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); + } + else if (source.GetFormat() == Orthanc::PixelFormat_Grayscale16 && + slice.GetFormat() == Orthanc::PixelFormat_BGRA32) + { + ProcessImage + (slice, extent, source, plane, box, interpolation, hasLinearFunction, scaling, offset); + } + else + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + } + + + + void VolumeReslicer::CheckIterators(const ImageBuffer3D& source, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box) const + { + for (unsigned int y = 0; y < slice_->GetHeight(); y++) + { + FastRowIterator fast(*slice_, extent_, plane, box, y); + SlowRowIterator slow(*slice_, extent_, plane, box, y); + + for (unsigned int x = 0; x < slice_->GetWidth(); x++) + { + float px, py, pz; + fast.GetVolumeCoordinates(px, py, pz); + + float qx, qy, qz; + slow.GetVolumeCoordinates(qx, qy, qz); + + Vector d; + LinearAlgebra::AssignVector(d, px - qx, py - qy, pz - qz); + double norm = boost::numeric::ublas::norm_2(d); + if (norm > 0.0001) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + fast.Next(); + slow.Next(); + } + } + } + + + void VolumeReslicer::Reset() + { + success_ = false; + extent_.Reset(); + slice_.reset(NULL); + } + + + float VolumeReslicer::GetMinOutputValue() const + { + switch (outputFormat_) + { + case Orthanc::PixelFormat_Grayscale8: + case Orthanc::PixelFormat_Grayscale16: + case Orthanc::PixelFormat_BGRA32: + return 0.0f; + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + float VolumeReslicer::GetMaxOutputValue() const + { + switch (outputFormat_) + { + case Orthanc::PixelFormat_Grayscale8: + case Orthanc::PixelFormat_BGRA32: + return static_cast(std::numeric_limits::max()); + break; + + case Orthanc::PixelFormat_Grayscale16: + return static_cast(std::numeric_limits::max()); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + } + + + VolumeReslicer::VolumeReslicer() : + outputFormat_(Orthanc::PixelFormat_Grayscale8), + interpolation_(ImageInterpolation_Nearest), + fastMode_(true), + success_(false) + { + ResetLinearFunction(); + } + + + void VolumeReslicer::GetLinearFunction(float& scaling, + float& offset) const + { + if (hasLinearFunction_) + { + scaling = scaling_; + offset = offset_; + } + else + { + scaling = 1.0f; + offset = 0.0f; + } + } + + + void VolumeReslicer::ResetLinearFunction() + { + Reset(); + hasLinearFunction_ = false; + scaling_ = 1.0f; + offset_ = 0.0f; + } + + + void VolumeReslicer::SetLinearFunction(float scaling, + float offset) + { + Reset(); + hasLinearFunction_ = true; + scaling_ = scaling; + offset_ = offset; + } + + + void VolumeReslicer::SetWindow(float low, + float high) + { + //printf("Range in pixel values: %f->%f\n", low, high); + float scaling = (GetMaxOutputValue() - GetMinOutputValue()) / (high - low); + float offset = GetMinOutputValue() - scaling * low; + + SetLinearFunction(scaling, offset); + + /*float x = scaling_ * low + offset_; + float y = scaling_ * high + offset_; + printf("%f %f (should be %f->%f)\n", x, y, GetMinOutputValue(), GetMaxOutputValue());*/ + } + + + void VolumeReslicer::FitRange(const ImageBuffer3D& image) + { + float minInputValue, maxInputValue; + + if (!image.GetRange(minInputValue, maxInputValue) || + maxInputValue < 1) + { + ResetLinearFunction(); + } + else + { + SetWindow(minInputValue, maxInputValue); + } + } + + + void VolumeReslicer::SetWindowing(ImageWindowing windowing, + const ImageBuffer3D& image, + float rescaleSlope, + float rescaleIntercept) + { + if (windowing == ImageWindowing_Custom) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + float center, width; + ComputeWindowing(center, width, windowing, 0, 0); + + float a = (center - width / 2.0f - rescaleIntercept) / rescaleSlope; + float b = (center + width / 2.0f - rescaleIntercept) / rescaleSlope; + SetWindow(a, b); + } + + + void VolumeReslicer::SetOutputFormat(Orthanc::PixelFormat format) + { + if (format != Orthanc::PixelFormat_Grayscale8 && + format != Orthanc::PixelFormat_Grayscale16 && + format != Orthanc::PixelFormat_BGRA32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + if (hasLinearFunction_) + { + LOG(WARNING) << "Calls to VolumeReslicer::SetOutputFormat() should be done before VolumeReslicer::FitRange()"; + } + + outputFormat_ = format; + Reset(); + } + + + void VolumeReslicer::SetInterpolation(ImageInterpolation interpolation) + { + if (interpolation != ImageInterpolation_Nearest && + interpolation != ImageInterpolation_Bilinear && + interpolation != ImageInterpolation_Trilinear) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + interpolation_ = interpolation; + Reset(); + } + + + const Extent2D& VolumeReslicer::GetOutputExtent() const + { + if (success_) + { + return extent_; + } + else + { + LOG(ERROR) << "VolumeReslicer::GetOutputExtent(): (!success_)"; + + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + const Orthanc::ImageAccessor& VolumeReslicer::GetOutputSlice() const + { + if (success_) + { + assert(slice_.get() != NULL); + return *slice_; + } + else + { + LOG(ERROR) << "VolumeReslicer::GetOutputSlice(): (!success_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + Orthanc::ImageAccessor* VolumeReslicer::ReleaseOutputSlice() + { + if (success_) + { + assert(slice_.get() != NULL); + success_ = false; + return slice_.release(); + } + else + { + LOG(ERROR) << "VolumeReslicer::ReleaseOutputSlice(): (!success_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } + + + void VolumeReslicer::Apply(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + const CoordinateSystem3D& plane) + { + // Choose the default voxel size as the finest voxel dimension + // of the source volumetric image + const OrthancStone::Vector dim = + geometry.GetVoxelDimensions(OrthancStone::VolumeProjection_Axial); + double voxelSize = dim[0]; + + if (dim[1] < voxelSize) + { + voxelSize = dim[1]; + } + + if (dim[2] < voxelSize) + { + voxelSize = dim[2]; + } + + if (voxelSize <= 0) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + Apply(source, geometry, plane, voxelSize); + } + + + void VolumeReslicer::Apply(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + const CoordinateSystem3D& plane, + double voxelSize) + { + Reset(); + pixelSpacing_ = voxelSize; + + // Firstly, compute the intersection of the source volumetric + // image with the reslicing plane. This leads to a polygon with 3 + // to 6 vertices. We compute the extent of the intersection + // polygon, with respect to the coordinate system of the reslicing + // plane. + OrientedVolumeBoundingBox box(geometry); + + if (!box.ComputeExtent(extent_, plane)) + { + // The plane does not intersect with the bounding box of the volume + slice_.reset(new Orthanc::Image(outputFormat_, 0, 0, false)); + success_ = true; + return; + } + + // Secondly, the extent together with the voxel size gives the + // size of the output image + unsigned int width = boost::math::iround(extent_.GetWidth() / voxelSize); + unsigned int height = boost::math::iround(extent_.GetHeight() / voxelSize); + + slice_.reset(new Orthanc::Image(outputFormat_, width, height, false)); + + //CheckIterators(source, plane, box); + + if (fastMode_) + { + ProcessImage(*slice_, extent_, source, plane, box, + interpolation_, hasLinearFunction_, scaling_, offset_); + } + else + { + ProcessImage(*slice_, extent_, source, plane, box, + interpolation_, hasLinearFunction_, scaling_, offset_); + } + + success_ = true; + } + + + double VolumeReslicer::GetPixelSpacing() const + { + if (success_) + { + return pixelSpacing_; + } + else + { + LOG(ERROR) << "VolumeReslicer::GetPixelSpacing(): (!success_)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeReslicer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeReslicer.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,125 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Toolbox/Extent2D.h" +#include "OrientedVolumeBoundingBox.h" +#include "ImageBuffer3D.h" + +namespace OrthancStone +{ + // Hypothesis: The output voxels always have square size + class VolumeReslicer : public boost::noncopyable + { + private: + // Input parameters + Orthanc::PixelFormat outputFormat_; + bool hasLinearFunction_; + float scaling_; // "a" in "f(x) = a * x + b" + float offset_; // "b" in "f(x) = a * x + b" + ImageInterpolation interpolation_; + bool fastMode_; + + // Output of reslicing + bool success_; + Extent2D extent_; + std::unique_ptr slice_; + double pixelSpacing_; + + void CheckIterators(const ImageBuffer3D& source, + const CoordinateSystem3D& plane, + const OrientedVolumeBoundingBox& box) const; + + void Reset(); + + float GetMinOutputValue() const; + + float GetMaxOutputValue() const; + + void SetWindow(float low, + float high); + + public: + VolumeReslicer(); + + void GetLinearFunction(float& scaling, + float& offset) const; + + void ResetLinearFunction(); + + void SetLinearFunction(float scaling, + float offset); + + void FitRange(const ImageBuffer3D& image); + + void SetWindowing(ImageWindowing windowing, + const ImageBuffer3D& image, + float rescaleSlope, + float rescaleIntercept); + + Orthanc::PixelFormat GetOutputFormat() const + { + return outputFormat_; + } + + void SetOutputFormat(Orthanc::PixelFormat format); + + ImageInterpolation GetInterpolation() const + { + return interpolation_; + } + + void SetInterpolation(ImageInterpolation interpolation); + + bool IsFastMode() const + { + return fastMode_; + } + + void EnableFastMode(bool enabled) + { + fastMode_ = enabled; + } + + bool IsSuccess() const + { + return success_; + } + + const Extent2D& GetOutputExtent() const; + + const Orthanc::ImageAccessor& GetOutputSlice() const; + + Orthanc::ImageAccessor* ReleaseOutputSlice(); + + void Apply(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + const CoordinateSystem3D& plane); + + void Apply(const ImageBuffer3D& source, + const VolumeImageGeometry& geometry, + const CoordinateSystem3D& plane, + double voxelSize); + + double GetPixelSpacing() const; + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,175 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "VolumeSceneLayerSource.h" + +#include "../Scene2D/NullLayer.h" +#include "../Viewport/IViewport.h" +#include "../StoneException.h" + +#include + +namespace OrthancStone +{ + static bool IsSameCuttingPlane(const CoordinateSystem3D& a, + const CoordinateSystem3D& b) + { + // TODO - What if the normal is reversed? + double distance; + return (CoordinateSystem3D::ComputeDistance(distance, a, b) && + LinearAlgebra::IsCloseToZero(distance)); + } + + + void VolumeSceneLayerSource::ClearLayer() + { + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + scene.DeleteLayer(layerDepth_); + } + lastPlane_.reset(NULL); + } + + VolumeSceneLayerSource::VolumeSceneLayerSource( + boost::shared_ptr viewport, + int layerDepth, + const boost::shared_ptr& slicer) + : viewport_(viewport) + , layerDepth_(layerDepth) + , slicer_(slicer) + { + if (slicer == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + ORTHANC_ASSERT(!scene.HasLayer(layerDepth_)); + + // we need to book the scene layer depth by adding a dummy layer + std::unique_ptr nullLayer(new NullLayer); + scene.SetLayer(layerDepth_,nullLayer.release()); + } + } + + VolumeSceneLayerSource::~VolumeSceneLayerSource() + { + ClearLayer(); + } + + void VolumeSceneLayerSource::RemoveConfigurator() + { + configurator_.reset(); + lastPlane_.reset(); + } + + + void VolumeSceneLayerSource::SetConfigurator(ILayerStyleConfigurator* configurator) // Takes ownership + { + if (configurator == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + configurator_.reset(configurator); + + // Invalidate the layer + lastPlane_.reset(NULL); + } + + + ILayerStyleConfigurator& VolumeSceneLayerSource::GetConfigurator() const + { + if (configurator_.get() == NULL) + { + LOG(ERROR) << "VolumeSceneLayerSource::GetConfigurator(): (configurator_.get() == NULL)"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + + return *configurator_; + } + + + void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane) + { + std::unique_ptr lock(viewport_->Lock()); + ViewportController& controller = lock->GetController(); + Scene2D& scene = controller.GetScene(); + + assert(slicer_.get() != NULL); + std::unique_ptr slice(slicer_->ExtractSlice(plane)); + + if (slice.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (!slice->IsValid()) + { + // The slicer cannot handle this cutting plane: Clear the layer + ClearLayer(); + } + else if (lastPlane_.get() != NULL && + IsSameCuttingPlane(*lastPlane_, plane) && + lastRevision_ == slice->GetRevision()) + { + // The content of the slice has not changed: Don't update the + // layer content, but possibly update its style + + if (configurator_.get() != NULL && + configurator_->GetRevision() != lastConfiguratorRevision_ && + scene.HasLayer(layerDepth_)) + { + configurator_->ApplyStyle(scene.GetLayer(layerDepth_)); + } + } + else + { + LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed"; + // Content has changed: An update is needed + lastPlane_.reset(new CoordinateSystem3D(plane)); + lastRevision_ = slice->GetRevision(); + + std::unique_ptr layer(slice->CreateSceneLayer(configurator_.get(), plane)); + if (layer.get() == NULL) + { + LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() == NULL)"; + ClearLayer(); + } + else + { + LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() != NULL)"; + if (configurator_.get() != NULL) + { + lastConfiguratorRevision_ = configurator_->GetRevision(); + configurator_->ApplyStyle(*layer); + } + + scene.SetLayer(layerDepth_, layer.release()); + } + } + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Volumes/VolumeSceneLayerSource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,86 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "../Scene2D/Scene2D.h" +#include "IVolumeSlicer.h" + +#include + +namespace OrthancStone +{ + class IViewport; + /** + This class applies one "volume slicer" to a "3D volume", in order + to create one "2D scene layer" that will be set onto the "2D + scene". The style of the layer can be fine-tuned using a "layer + style configurator". The class only changes the layer if the + cutting plane has been modified since the last call to "Update()". + */ + class VolumeSceneLayerSource : public boost::noncopyable + { + private: + boost::shared_ptr viewport_; + int layerDepth_; + boost::shared_ptr slicer_; + std::unique_ptr configurator_; + std::unique_ptr lastPlane_; + uint64_t lastRevision_; + uint64_t lastConfiguratorRevision_; + bool layerInScene_; + + void ClearLayer(); + + public: + VolumeSceneLayerSource(boost::shared_ptr viewport, + int layerDepth, + const boost::shared_ptr& slicer); + + ~VolumeSceneLayerSource(); + + const IVolumeSlicer& GetSlicer() const + { + return *slicer_; + } + + void RemoveConfigurator(); + + void SetConfigurator(ILayerStyleConfigurator* configurator); + + bool HasConfigurator() const + { + return configurator_.get() != NULL; + } + + ILayerStyleConfigurator& GetConfigurator() const; + + /** + Make sure the Scene2D is protected from concurrent accesses before + calling this method. + + If the scene that has been supplied to the ctor is part of an IViewport, + you can lock the whole viewport data (including scene) by means of the + IViewport::Lock method. + */ + void Update(const CoordinateSystem3D& plane); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Wrappers/CairoContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Wrappers/CairoContext.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,146 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoContext.h" + +#include +#include + + +namespace OrthancStone +{ + CairoContext::CairoContext(CairoSurface& surface) : + width_(surface.GetWidth()), + height_(surface.GetHeight()) + { + context_ = cairo_create(surface.GetObject()); + if (!context_) + { + LOG(ERROR) << "Cannot create Cairo drawing context"; + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + CairoContext::~CairoContext() + { + if (context_ != NULL) + { + cairo_destroy(context_); + context_ = NULL; + } + } + + + void CairoContext::SetSourceColor(uint8_t red, + uint8_t green, + uint8_t blue) + { + cairo_set_source_rgb(context_, + static_cast(red) / 255.0f, + static_cast(green) / 255.0f, + static_cast(blue) / 255.0f); + } + + + class CairoContext::AlphaSurface : public boost::noncopyable + { + private: + cairo_surface_t *surface_; + + public: + AlphaSurface(unsigned int width, + unsigned int height) + { + surface_ = cairo_image_surface_create(CAIRO_FORMAT_A8, width, height); + + if (!surface_) + { + // Should never occur + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) + { + LOG(ERROR) << "Cannot create a Cairo surface"; + cairo_surface_destroy(surface_); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + ~AlphaSurface() + { + cairo_surface_destroy(surface_); + } + + void GetAccessor(Orthanc::ImageAccessor& target) + { + target.AssignWritable(Orthanc::PixelFormat_Grayscale8, + cairo_image_surface_get_width(surface_), + cairo_image_surface_get_height(surface_), + cairo_image_surface_get_stride(surface_), + cairo_image_surface_get_data(surface_)); + } + + void Blit(cairo_t* cr, + double x, + double y) + { + cairo_surface_mark_dirty(surface_); + cairo_mask_surface(cr, surface_, x, y); + cairo_fill(cr); + } + }; + + + void CairoContext::DrawText(const Orthanc::Font& font, + const std::string& text, + double x, + double y, + BitmapAnchor anchor) + { + // Render a bitmap containing the text + unsigned int width, height; + font.ComputeTextExtent(width, height, text); + + AlphaSurface surface(width, height); + + Orthanc::ImageAccessor accessor; + surface.GetAccessor(accessor); + font.Draw(accessor, text, 0, 0, 255); + + // Correct the text location given the anchor location + double deltaX, deltaY; + ComputeAnchorTranslation(deltaX, deltaY, anchor, width, height); + + // Cancel zoom/rotation before blitting the text onto the surface + double pixelX = x; + double pixelY = y; + cairo_user_to_device(context_, &pixelX, &pixelY); + + cairo_save(context_); + cairo_identity_matrix(context_); + + // Blit the text bitmap + surface.Blit(context_, pixelX + deltaX, pixelY + deltaY); + cairo_restore(context_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Wrappers/CairoContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Wrappers/CairoContext.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,76 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include "CairoSurface.h" +#include "../StoneEnumerations.h" + +#include + +namespace OrthancStone +{ + // This is a RAII wrapper around the Cairo drawing context + class CairoContext : public boost::noncopyable + { + private: + class AlphaSurface; + + cairo_t* context_; + unsigned int width_; + unsigned int height_; + + public: + CairoContext(CairoSurface& surface); + + ~CairoContext(); + + cairo_t* GetObject() + { + return context_; + } + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + void SetSourceColor(uint8_t red, + uint8_t green, + uint8_t blue); + + void SetSourceColor(const uint8_t color[3]) + { + SetSourceColor(color[0], color[1], color[2]); + } + + void DrawText(const Orthanc::Font& font, + const std::string& text, + double x, + double y, + BitmapAnchor anchor); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Wrappers/CairoSurface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Wrappers/CairoSurface.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,155 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "CairoSurface.h" + +#include +#include +#include + +namespace OrthancStone +{ + void CairoSurface::Release() + { + if (surface_) + { + cairo_surface_destroy(surface_); + surface_ = NULL; + } + } + + + void CairoSurface::Allocate(unsigned int width, + unsigned int height, + bool hasAlpha) + { + Release(); + + hasAlpha_ = hasAlpha; + + surface_ = cairo_image_surface_create + (hasAlpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, width, height); + if (!surface_) + { + // Should never occur + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) + { + LOG(ERROR) << "Cannot create a Cairo surface"; + cairo_surface_destroy(surface_); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + width_ = width; + height_ = height; + pitch_ = cairo_image_surface_get_stride(surface_); + buffer_ = cairo_image_surface_get_data(surface_); + } + + + CairoSurface::CairoSurface(Orthanc::ImageAccessor& accessor, + bool hasAlpha) : + hasAlpha_(hasAlpha) + { + if (accessor.GetFormat() != Orthanc::PixelFormat_BGRA32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + width_ = accessor.GetWidth(); + height_ = accessor.GetHeight(); + pitch_ = accessor.GetPitch(); + buffer_ = accessor.GetBuffer(); + + surface_ = cairo_image_surface_create_for_data + (reinterpret_cast(buffer_), + hasAlpha_ ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, + width_, height_, pitch_); + if (!surface_) + { + // Should never occur + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + if (cairo_surface_status(surface_) != CAIRO_STATUS_SUCCESS) + { + LOG(ERROR) << "Bad pitch for a Cairo surface"; + cairo_surface_destroy(surface_); + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + + + void CairoSurface::SetSize(unsigned int width, + unsigned int height, + bool hasAlpha) + { + if (hasAlpha_ != hasAlpha || + width_ != width || + height_ != height) + { + Allocate(width, height, hasAlpha); + } + } + + + void CairoSurface::Copy(const CairoSurface& other) + { + SetSize(other.GetWidth(), other.GetHeight(), other.HasAlpha()); + + Orthanc::ImageAccessor source, target; + + other.GetReadOnlyAccessor(source); + GetWriteableAccessor(target); + + Orthanc::ImageProcessing::Copy(target, source); + + cairo_surface_mark_dirty(surface_); + } + + + void CairoSurface::Copy(const Orthanc::ImageAccessor& source, + bool hasAlpha) + { + SetSize(source.GetWidth(), source.GetHeight(), hasAlpha); + + Orthanc::ImageAccessor target; + GetWriteableAccessor(target); + + Orthanc::ImageProcessing::Convert(target, source); + + cairo_surface_mark_dirty(surface_); + } + + + void CairoSurface::GetReadOnlyAccessor(Orthanc::ImageAccessor& target) const + { + target.AssignReadOnly(Orthanc::PixelFormat_BGRA32, width_, height_, pitch_, buffer_); + } + + + void CairoSurface::GetWriteableAccessor(Orthanc::ImageAccessor& target) + { + target.AssignWritable(Orthanc::PixelFormat_BGRA32, width_, height_, pitch_, buffer_); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/Sources/Wrappers/CairoSurface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/Sources/Wrappers/CairoSurface.h Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,118 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include + +#include +#include + +namespace OrthancStone +{ + class CairoSurface : public boost::noncopyable + { + private: + cairo_surface_t* surface_; + unsigned int width_; + unsigned int height_; + unsigned int pitch_; + void* buffer_; + bool hasAlpha_; + + void Release(); + + void Allocate(unsigned int width, + unsigned int height, + bool hasAlpha); + + public: + CairoSurface() : + surface_(NULL) + { + Allocate(0, 0, false); + } + + CairoSurface(unsigned int width, + unsigned int height, + bool hasAlpha) : + surface_(NULL) + { + Allocate(width, height, hasAlpha); + } + + CairoSurface(Orthanc::ImageAccessor& accessor, + bool hasAlpha); + + ~CairoSurface() + { + Release(); + } + + void SetSize(unsigned int width, + unsigned int height, + bool hasAlpha); + + void Copy(const CairoSurface& other); + + void Copy(const Orthanc::ImageAccessor& source, + bool hasAlpha); + + unsigned int GetWidth() const + { + return width_; + } + + unsigned int GetHeight() const + { + return height_; + } + + unsigned int GetPitch() const + { + return pitch_; + } + + const void* GetBuffer() const + { + return buffer_; + } + + void* GetBuffer() + { + return buffer_; + } + + cairo_surface_t* GetObject() + { + return surface_; + } + + bool HasAlpha() const + { + return hasAlpha_; + } + + void GetReadOnlyAccessor(Orthanc::ImageAccessor& target) const; + + void GetWriteableAccessor(Orthanc::ImageAccessor& target); + }; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,45721 @@ +{ + "0008,0005" : { + "Name" : "SpecificCharacterSet", + "Type" : "String", + "Value" : "ISO_IR 100" + }, + "0008,0012" : { + "Name" : "InstanceCreationDate", + "Type" : "String", + "Value" : "20180624" + }, + "0008,0013" : { + "Name" : "InstanceCreationTime", + "Type" : "String", + "Value" : "134156" + }, + "0008,0016" : { + "Name" : "SOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.481.3" + }, + "0008,0018" : { + "Name" : "SOPInstanceUID", + "Type" : "String", + "Value" : "1.2.752.243.1.1.20180802070448020.2000.14574" + }, + "0008,0020" : { + "Name" : "StudyDate", + "Type" : "String", + "Value" : "20180624" + }, + "0008,0021" : { + "Name" : "SeriesDate", + "Type" : "String", + "Value" : "20180624" + }, + "0008,0030" : { + "Name" : "StudyTime", + "Type" : "String", + "Value" : "120802" + }, + "0008,0031" : { + "Name" : "SeriesTime", + "Type" : "String", + "Value" : "134156" + }, + "0008,0050" : { + "Name" : "AccessionNumber", + "Type" : "String", + "Value" : "" + }, + "0008,0060" : { + "Name" : "Modality", + "Type" : "String", + "Value" : "RTSTRUCT" + }, + "0008,0070" : { + "Name" : "Manufacturer", + "Type" : "String", + "Value" : "RaySearch Laboratories" + }, + "0008,0090" : { + "Name" : "ReferringPhysicianName", + "Type" : "String", + "Value" : "" + }, + "0008,1030" : { + "Name" : "StudyDescription", + "Type" : "String", + "Value" : "RT^PCPT_120_KVP (Adult)" + }, + "0008,103e" : { + "Name" : "SeriesDescription", + "Type" : "String", + "Value" : "RS: Approved Structure Set" + }, + "0008,1070" : { + "Name" : "OperatorsName", + "Type" : "String", + "Value" : "" + }, + "0008,1090" : { + "Name" : "ManufacturerModelName", + "Type" : "String", + "Value" : "RayStation" + }, + "0010,0010" : { + "Name" : "PatientName", + "Type" : "String", + "Value" : "Provision^Phantom^QA" + }, + "0010,0020" : { + "Name" : "PatientID", + "Type" : "String", + "Value" : "04041982" + }, + "0010,0030" : { + "Name" : "PatientBirthDate", + "Type" : "String", + "Value" : "19820404" + }, + "0010,0040" : { + "Name" : "PatientSex", + "Type" : "String", + "Value" : "O" + }, + "0018,1020" : { + "Name" : "SoftwareVersions", + "Type" : "String", + "Value" : "8.0.1.6 (Dicom Export)" + }, + "0020,000d" : { + "Name" : "StudyInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412504788800000016" + }, + "0020,000e" : { + "Name" : "SeriesInstanceUID", + "Type" : "String", + "Value" : "1.2.752.243.1.1.20180802070448020.2000.14574.1" + }, + "0020,0010" : { + "Name" : "StudyID", + "Type" : "String", + "Value" : "1" + }, + "0020,0011" : { + "Name" : "SeriesNumber", + "Type" : "String", + "Value" : "1" + }, + "0020,0013" : { + "Name" : "InstanceNumber", + "Type" : "String", + "Value" : "1" + }, + "0020,0052" : { + "Name" : "FrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "0020,1040" : { + "Name" : "PositionReferenceIndicator", + "Type" : "String", + "Value" : "" + }, + "3006,0002" : { + "Name" : "StructureSetLabel", + "Type" : "String", + "Value" : "RS: Approved" + }, + "3006,0008" : { + "Name" : "StructureSetDate", + "Type" : "String", + "Value" : "20180624" + }, + "3006,0009" : { + "Name" : "StructureSetTime", + "Type" : "String", + "Value" : "134156" + }, + "3006,0010" : { + "Name" : "ReferencedFrameOfReferenceSequence", + "Type" : "Sequence", + "Value" : [ + { + "0020,0052" : { + "Name" : "FrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0012" : { + "Name" : "RTReferencedStudySequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.3.1.2.3.1" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412504788800000016" + }, + "3006,0014" : { + "Name" : "RTReferencedSeriesSequence", + "Type" : "Sequence", + "Value" : [ + { + "0020,000e" : { + "Name" : "SeriesInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002193" + }, + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002194" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002195" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002198" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002199" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002388" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002389" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002390" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002391" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002392" + } + }, + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002393" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + }, + "3006,0020" : { + "Name" : "StructureSetROISequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "External" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "CTV" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "PTV" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "PTV Eval" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "Bladder" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "Rectum" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "Air Override" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "CT Isocenter" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + }, + { + "3006,0022" : { + "Name" : "ROINumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0024" : { + "Name" : "ReferencedFrameOfReferenceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" + }, + "3006,0026" : { + "Name" : "ROIName", + "Type" : "String", + "Value" : "Isocenter" + }, + "3006,0036" : { + "Name" : "ROIGenerationAlgorithm", + "Type" : "String", + "Value" : "SEMIAUTOMATIC" + } + } + ] + }, + "3006,0039" : { + "Name" : "ROIContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "0\\128\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002389" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "143" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-131.8359\\-272.7055\\-175\\-133.9264\\-270.5703\\-175\\-135.7422\\-268.5421\\-175\\-136.3525\\-266.6641\\-175\\-137.6953\\-265.4705\\-175\\-138.3168\\-264.7109\\-175\\-139.6484\\-263.4482\\-175\\-140.0744\\-262.7578\\-175\\-141.6016\\-259.7253\\-175\\-141.7969\\-258.8516\\-175\\-142.9287\\-256.8984\\-175\\-143.5547\\-256.1355\\-175\\-144.0694\\-254.9453\\-175\\-145.5078\\-253.7626\\-175\\-146.1325\\-252.9922\\-175\\-146.5718\\-251.0391\\-175\\-147.4609\\-249.871\\-175\\-148.7116\\-247.1328\\-175\\-149.2784\\-245.1797\\-175\\-149.954\\-243.2266\\-175\\-150.7428\\-241.2734\\-175\\-151.3672\\-240.705\\-175\\-152.203\\-239.3203\\-175\\-152.3438\\-237.3672\\-175\\-153.5667\\-235.4141\\-175\\-154.2728\\-231.5078\\-175\\-155.474\\-229.5547\\-175\\-155.6019\\-227.6016\\-175\\-156.6483\\-225.6484\\-175\\-156.9864\\-223.6953\\-175\\-157.1378\\-221.7422\\-175\\-158.2475\\-219.7891\\-175\\-158.3921\\-217.8359\\-175\\-159.6641\\-215.8828\\-175\\-160.0241\\-213.9297\\-175\\-160.1245\\-211.9766\\-175\\-160.1991\\-208.0703\\-175\\-160.4293\\-206.1172\\-175\\-161.4816\\-204.1641\\-175\\-161.4872\\-198.3047\\-175\\-160.4368\\-196.3516\\-175\\-160.2162\\-194.3984\\-175\\-160.1482\\-190.4922\\-175\\-160.0519\\-188.5391\\-175\\-159.6563\\-186.5859\\-175\\-158.4045\\-184.6328\\-175\\-158.1949\\-182.6797\\-175\\-157.0475\\-180.7266\\-175\\-156.6305\\-178.7734\\-175\\-155.7304\\-176.8203\\-175\\-154.1251\\-174.8672\\-175\\-153.5573\\-172.9141\\-175\\-151.3672\\-169.6098\\-175\\-149.4141\\-167.5505\\-175\\-146.9809\\-165.1016\\-175\\-146.1733\\-163.1484\\-175\\-145.5078\\-162.439\\-175\\-143.5547\\-160.7921\\-175\\-141.6016\\-159.9223\\-175\\-138.7921\\-157.2891\\-175\\-137.6953\\-156.5387\\-175\\-135.7422\\-155.4173\\-175\\-133.7891\\-153.8933\\-175\\-132.6069\\-153.3828\\-175\\-131.8359\\-153.2125\\-175\\-129.5856\\-151.4297\\-175\\-127.9297\\-150.8933\\-175\\-125.9766\\-149.1409\\-175\\-124.0234\\-148.9303\\-175\\-122.0703\\-147.9629\\-175\\-121.4844\\-147.5234\\-175\\-120.1172\\-147.1133\\-175\\-118.1641\\-147.0926\\-175\\-116.2109\\-146.791\\-175\\-114.7461\\-145.5703\\-175\\-114.1657\\-145.5703\\-175\\-114.2383\\-149.4766\\-175\\-116.0199\\-151.4297\\-175\\-116.0623\\-155.3359\\-175\\-117.8894\\-157.2891\\-175\\-117.9436\\-161.1953\\-175\\-118.1641\\-161.651\\-175\\-119.4119\\-163.1484\\-175\\-119.3704\\-165.1016\\-175\\-119.5204\\-167.0547\\-175\\-119.5204\\-169.0078\\-175\\-119.6899\\-170.9609\\-175\\-120.1172\\-171.1681\\-175\\-122.0703\\-171.4492\\-175\\-123.4809\\-172.9141\\-175\\-125.2219\\-174.8672\\-175\\-125.2848\\-178.7734\\-175\\-125.8681\\-180.7266\\-175\\-125.9766\\-181.7031\\-175\\-126.9531\\-182.6797\\-175\\-127.9297\\-182.7988\\-175\\-129.4643\\-184.6328\\-175\\-128.479\\-186.5859\\-175\\-127.9297\\-187.3184\\-175\\-125.9766\\-187.7456\\-175\\-125.4688\\-188.5391\\-175\\-126.0851\\-190.4922\\-175\\-126.0986\\-192.4453\\-175\\-126.3428\\-194.3984\\-175\\-127.727\\-196.3516\\-175\\-127.7956\\-202.2109\\-175\\-127.9297\\-202.6131\\-175\\-129.1282\\-204.1641\\-175\\-128.8365\\-206.1172\\-175\\-129.5876\\-208.0703\\-175\\-129.5573\\-211.9766\\-175\\-129.6237\\-213.9297\\-175\\-129.8828\\-214.3999\\-175\\-131.2175\\-215.8828\\-175\\-130.5589\\-217.8359\\-175\\-129.8828\\-218.5684\\-175\\-129.5499\\-219.7891\\-175\\-129.5499\\-221.7422\\-175\\-129.2969\\-223.6953\\-175\\-127.9297\\-225.3229\\-175\\-127.7982\\-225.6484\\-175\\-127.8711\\-227.6016\\-175\\-129.5499\\-229.5547\\-175\\-129.5876\\-235.4141\\-175\\-129.8828\\-236.3209\\-175\\-130.6966\\-237.3672\\-175\\-129.8096\\-239.3203\\-175\\-129.8828\\-241.599\\-175\\-130.7983\\-243.2266\\-175\\-131.1701\\-245.1797\\-175\\-131.4228\\-247.1328\\-175\\-131.1678\\-249.0859\\-175\\-131.2012\\-251.0391\\-175\\-131.8359\\-252.4496\\-175\\-132.2428\\-252.9922\\-175\\-132.512\\-254.9453\\-175\\-132.7428\\-258.8516\\-175\\-132.7428\\-264.7109\\-175\\-132.8125\\-266.6641\\-175\\-133.3365\\-268.6172\\-175\\-132.9102\\-270.5703\\-175\\-131.8359\\-271.5469\\-175\\-131.4523\\-272.5234\\-175" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002388" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "208" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-302.0705\\-173\\-83.00781\\-300.9754\\-173\\-86.91406\\-300.8166\\-173\\-88.86719\\-300.521\\-173\\-90.82031\\-299.9072\\-173\\-92.77344\\-299.5658\\-173\\-94.72656\\-299.0435\\-173\\-96.67969\\-298.3087\\-173\\-98.37431\\-297.9141\\-173\\-100.5859\\-296.6277\\-173\\-102.5391\\-296.1421\\-173\\-104.4922\\-295.0589\\-173\\-106.4453\\-294.7641\\-173\\-108.3984\\-293.6721\\-173\\-110.3516\\-292.811\\-173\\-112.3047\\-290.9783\\-173\\-114.2578\\-290.5478\\-173\\-116.2109\\-289.0671\\-173\\-118.119\\-288.1484\\-173\\-120.1172\\-286.5138\\-173\\-122.0703\\-285.335\\-173\\-124.0234\\-283.4826\\-173\\-127.9297\\-279.9471\\-173\\-131.1599\\-276.4297\\-173\\-133.7891\\-273.7756\\-173\\-136.4906\\-270.5703\\-173\\-138.0115\\-268.6172\\-173\\-139.1138\\-266.6641\\-173\\-140.7258\\-264.7109\\-173\\-142.0506\\-262.7578\\-173\\-142.9807\\-260.8047\\-173\\-144.1303\\-258.8516\\-173\\-145.1157\\-256.8984\\-173\\-145.5078\\-256.391\\-173\\-147.749\\-252.9922\\-173\\-148.4946\\-251.0391\\-173\\-150.2841\\-247.1328\\-173\\-150.9292\\-245.1797\\-173\\-152.0162\\-243.2266\\-173\\-152.7\\-241.2734\\-173\\-153.8602\\-239.3203\\-173\\-154.3324\\-237.3672\\-173\\-155.7617\\-233.4609\\-173\\-156.1929\\-231.5078\\-173\\-156.7742\\-229.5547\\-173\\-158.1292\\-225.6484\\-173\\-159.0056\\-221.7422\\-173\\-159.938\\-219.7891\\-173\\-160.2966\\-217.8359\\-173\\-161.4349\\-213.9297\\-173\\-161.7352\\-211.9766\\-173\\-162.1708\\-206.1172\\-173\\-162.366\\-204.1641\\-173\\-162.4242\\-202.2109\\-173\\-162.4157\\-198.3047\\-173\\-162.2089\\-196.3516\\-173\\-161.8108\\-190.4922\\-173\\-161.5221\\-188.5391\\-173\\-160.2804\\-184.6328\\-173\\-159.8476\\-182.6797\\-173\\-158.7508\\-180.7266\\-173\\-158.17\\-178.7734\\-173\\-157.2947\\-176.8203\\-173\\-156.1256\\-174.8672\\-173\\-155.2734\\-172.9282\\-173\\-154.1372\\-170.9609\\-173\\-151.3672\\-167.5165\\-173\\-149.198\\-165.1016\\-173\\-147.8591\\-163.1484\\-173\\-145.5078\\-160.7521\\-173\\-143.5547\\-159.118\\-173\\-141.6016\\-157.7076\\-173\\-141.1865\\-157.2891\\-173\\-137.6953\\-154.4925\\-173\\-131.8359\\-150.8857\\-173\\-129.7182\\-149.4766\\-173\\-127.9297\\-148.4627\\-173\\-125.9766\\-147.2246\\-173\\-124.0234\\-146.5265\\-173\\-120.1172\\-144.7879\\-173\\-118.1641\\-144.224\\-173\\-116.2109\\-143.181\\-173\\-114.2578\\-142.5557\\-173\\-110.3516\\-141.6247\\-173\\-108.3984\\-140.7968\\-173\\-106.4453\\-140.3998\\-173\\-104.4922\\-140.1908\\-173\\-102.5391\\-139.2664\\-173\\-98.63281\\-138.5217\\-173\\-96.67969\\-137.4128\\-173\\-92.77344\\-136.9472\\-173\\-90.82031\\-135.9013\\-173\\-88.86719\\-135.5287\\-173\\-86.91406\\-135.4302\\-173\\-84.96094\\-134.9024\\-173\\-83.00781\\-134.6305\\-173\\-81.05469\\-134.5352\\-173\\-77.14844\\-133.1644\\-173\\-73.24219\\-132.9727\\-173\\-69.33594\\-132.9144\\-173\\-63.47656\\-132.9329\\-173\\-59.57031\\-133.0063\\-173\\-53.71094\\-133.2785\\-173\\-51.58944\\-133.8516\\-173\\-49.80469\\-134.5417\\-173\\-47.85156\\-134.7486\\-173\\-44.04634\\-135.8047\\-173\\-41.99219\\-136.651\\-173\\-39.58038\\-137.7578\\-173\\-38.08594\\-138.9907\\-173\\-36.13281\\-139.503\\-173\\-34.17969\\-141.2263\\-173\\-33.33333\\-141.6641\\-173\\-32.22656\\-142.5228\\-173\\-30.27344\\-143.5539\\-173\\-28.28664\\-145.5703\\-173\\-27.00893\\-147.5234\\-173\\-26.36719\\-149.1278\\-173\\-25.39063\\-149.4766\\-173\\-24.41406\\-151.1042\\-173\\-24.2513\\-153.3828\\-173\\-24.41406\\-153.8711\\-173\\-25.39063\\-155.3359\\-173\\-25.8789\\-157.2891\\-173\\-25.8789\\-159.2422\\-173\\-26.85547\\-161.1953\\-173\\-27.34375\\-163.1484\\-173\\-26.85547\\-165.1016\\-173\\-28.32031\\-166.5664\\-173\\-29.29687\\-167.0547\\-173\\-30.27344\\-168.0313\\-173\\-30.76172\\-169.0078\\-173\\-31.25\\-170.9609\\-173\\-32.22656\\-171.4492\\-173\\-33.69141\\-172.9141\\-173\\-34.50521\\-174.8672\\-173\\-35.64453\\-176.8203\\-173\\-35.64453\\-178.7734\\-173\\-35.80729\\-180.7266\\-173\\-36.13281\\-181.2148\\-173\\-37.59766\\-182.6797\\-173\\-37.76041\\-184.6328\\-173\\-38.57422\\-186.5859\\-173\\-38.57422\\-188.5391\\-173\\-40.03906\\-191.4688\\-173\\-41.01563\\-194.3984\\-173\\-41.50391\\-196.3516\\-173\\-42.31771\\-198.3047\\-173\\-42.72461\\-200.2578\\-173\\-42.48047\\-202.2109\\-173\\-43.45703\\-204.1641\\-173\\-43.75\\-206.1172\\-173\\-43.70117\\-208.0703\\-173\\-44.18945\\-210.0234\\-173\\-44.27083\\-213.9297\\-173\\-44.92188\\-215.8828\\-173\\-44.43359\\-217.8359\\-173\\-44.43359\\-219.7891\\-173\\-44.92188\\-221.7422\\-173\\-44.92188\\-223.6953\\-173\\-44.43359\\-225.6484\\-173\\-44.92187\\-227.6016\\-173\\-44.92187\\-229.5547\\-173\\-45.89844\\-230.5313\\-173\\-46.22396\\-231.5078\\-173\\-46.22396\\-233.4609\\-173\\-46.38672\\-235.4141\\-173\\-46.38672\\-237.3672\\-173\\-47.36328\\-241.2734\\-173\\-47.36328\\-243.2266\\-173\\-49.31641\\-245.1797\\-173\\-49.07227\\-247.1328\\-173\\-49.47916\\-249.0859\\-173\\-49.31641\\-251.0391\\-173\\-49.47916\\-252.9922\\-173\\-49.80469\\-253.9688\\-173\\-50.78125\\-254.9453\\-173\\-50.78125\\-256.8984\\-173\\-51.75781\\-257.875\\-173\\-52.08333\\-258.8516\\-173\\-52.24609\\-260.8047\\-173\\-51.26953\\-262.7578\\-173\\-51.43229\\-264.7109\\-173\\-52.24609\\-266.6641\\-173\\-51.43229\\-268.6172\\-173\\-51.26953\\-270.5703\\-173\\-50.29297\\-274.4766\\-173\\-50.29297\\-280.3359\\-173\\-49.80469\\-281.3125\\-173\\-49.56055\\-282.2891\\-173\\-49.80469\\-283.2656\\-173\\-50.29297\\-284.2422\\-173\\-49.31641\\-286.1953\\-173\\-50.29297\\-288.1484\\-173\\-50.29297\\-292.0547\\-173\\-49.31641\\-294.0078\\-173\\-49.47917\\-295.9609\\-173\\-49.80469\\-296.0011\\-173\\-51.75781\\-297.9933\\-173\\-53.71094\\-298.1582\\-173\\-55.05371\\-299.8672\\-173\\-55.66406\\-300.2428\\-173\\-59.57031\\-300.5762\\-173\\-61.52344\\-301.8472\\-173\\-63.47656\\-302.0208\\-173\\-67.38281\\-302.1855\\-173\\-73.24219\\-302.2627\\-173\\-77.14844\\-302.2606\\-173" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "174" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-302.0081\\-171\\-88.86719\\-301.4367\\-171\\-92.77344\\-300.6752\\-171\\-94.72656\\-300.1905\\-171\\-96.67969\\-299.3295\\-171\\-98.63281\\-298.7279\\-171\\-102.5391\\-297.0441\\-171\\-104.4922\\-296.4428\\-171\\-106.4453\\-295.4397\\-171\\-108.3984\\-294.8102\\-171\\-112.3047\\-292.7268\\-171\\-114.2578\\-291.4096\\-171\\-116.2109\\-290.3423\\-171\\-118.1641\\-289.0867\\-171\\-120.1172\\-287.6334\\-171\\-122.0703\\-286.3098\\-171\\-124.3734\\-284.2422\\-171\\-127.9297\\-281.1463\\-171\\-129.8828\\-279.1208\\-171\\-134.1316\\-274.4766\\-171\\-135.4813\\-272.5234\\-171\\-140.0099\\-266.6641\\-171\\-141.1802\\-264.7109\\-171\\-142.4703\\-262.7578\\-171\\-144.6404\\-258.8516\\-171\\-145.967\\-256.8984\\-171\\-146.9277\\-254.9453\\-171\\-148.1223\\-252.9922\\-171\\-148.8627\\-251.0391\\-171\\-149.9157\\-249.0859\\-171\\-150.5687\\-247.1328\\-171\\-151.6568\\-245.1797\\-171\\-152.427\\-243.2266\\-171\\-153.4296\\-241.2734\\-171\\-154.184\\-239.3203\\-171\\-154.7985\\-237.3672\\-171\\-155.6626\\-235.4141\\-171\\-156.6319\\-231.5078\\-171\\-157.474\\-229.5547\\-171\\-158.5458\\-225.6484\\-171\\-159.3541\\-223.6953\\-171\\-159.9174\\-221.7422\\-171\\-160.3237\\-219.7891\\-171\\-160.8627\\-217.8359\\-171\\-161.5167\\-215.8828\\-171\\-161.8713\\-213.9297\\-171\\-162.1034\\-211.9766\\-171\\-162.6244\\-206.1172\\-171\\-162.9118\\-202.2109\\-171\\-162.9118\\-198.3047\\-171\\-162.7652\\-196.3516\\-171\\-162.17\\-190.4922\\-171\\-161.9274\\-188.5391\\-171\\-161.5646\\-186.5859\\-171\\-160.8329\\-184.6328\\-171\\-159.6591\\-180.7266\\-171\\-158.6172\\-178.7734\\-171\\-157.8757\\-176.8203\\-171\\-156.6885\\-174.8672\\-171\\-155.8687\\-172.9141\\-171\\-153.3203\\-169.1163\\-171\\-151.3672\\-166.558\\-171\\-148.4169\\-163.1484\\-171\\-146.5129\\-161.1953\\-171\\-142.2288\\-157.2891\\-171\\-139.6484\\-155.2266\\-171\\-135.7422\\-152.569\\-171\\-133.7891\\-151.3195\\-171\\-131.8359\\-150.2282\\-171\\-129.8828\\-148.8443\\-171\\-127.9297\\-147.8585\\-171\\-125.9766\\-146.7584\\-171\\-124.0234\\-146.0825\\-171\\-122.0703\\-145.044\\-171\\-120.1172\\-144.4328\\-171\\-118.1641\\-143.4942\\-171\\-114.2578\\-142.026\\-171\\-112.3047\\-141.1727\\-171\\-108.3984\\-140.1858\\-171\\-106.4453\\-139.4144\\-171\\-104.4922\\-138.919\\-171\\-102.5391\\-138.5402\\-171\\-100.5859\\-137.9576\\-171\\-98.63281\\-137.1797\\-171\\-94.72656\\-136.2451\\-171\\-92.77344\\-135.4857\\-171\\-86.91406\\-134.1339\\-171\\-84.96094\\-133.632\\-171\\-81.05469\\-133.0043\\-171\\-77.14844\\-132.5393\\-171\\-71.28906\\-131.5794\\-171\\-69.33594\\-131.4399\\-171\\-65.42969\\-131.3038\\-171\\-61.52344\\-131.3704\\-171\\-59.57031\\-131.5166\\-171\\-57.61719\\-131.762\\-171\\-53.71094\\-132.4681\\-171\\-49.80469\\-132.9677\\-171\\-47.85156\\-133.3135\\-171\\-43.94531\\-134.7256\\-171\\-41.99219\\-135.2492\\-171\\-38.08594\\-137.0089\\-171\\-34.17969\\-139.2227\\-171\\-28.32031\\-143.4777\\-171\\-24.41406\\-147.0985\\-171\\-22.13762\\-149.4766\\-171\\-21.32469\\-151.4297\\-171\\-19.71436\\-153.3828\\-171\\-19.11169\\-155.3359\\-171\\-18.55469\\-155.9842\\-171\\-17.73649\\-157.2891\\-171\\-17.04821\\-159.2422\\-171\\-15.88611\\-161.1953\\-171\\-15.60925\\-163.1484\\-171\\-14.41825\\-165.1016\\-171\\-14.16949\\-167.0547\\-171\\-13.58247\\-169.0078\\-171\\-13.12663\\-172.9141\\-171\\-12.93721\\-176.8203\\-171\\-12.28376\\-178.7734\\-171\\-11.83297\\-180.7266\\-171\\-11.63358\\-184.6328\\-171\\-11.54175\\-188.5391\\-171\\-10.23392\\-190.4922\\-171\\-10.01862\\-194.3984\\-171\\-9.942289\\-200.2578\\-171\\-9.994507\\-206.1172\\-171\\-9.978141\\-211.9766\\-171\\-10.04093\\-215.8828\\-171\\-10.25102\\-223.6953\\-171\\-10.36516\\-225.6484\\-171\\-11.58531\\-227.6016\\-171\\-11.71875\\-233.4609\\-171\\-11.95098\\-237.3672\\-171\\-12.76507\\-239.3203\\-171\\-13.31329\\-243.2266\\-171\\-13.95723\\-245.1797\\-171\\-14.32729\\-249.0859\\-171\\-15.46224\\-251.0391\\-171\\-15.74468\\-252.9922\\-171\\-16.29144\\-254.9453\\-171\\-17.56779\\-256.8984\\-171\\-17.6883\\-258.8516\\-171\\-18.55469\\-260.2833\\-171\\-19.03161\\-260.8047\\-171\\-19.64052\\-262.7578\\-171\\-20.66443\\-266.6641\\-171\\-21.74549\\-268.6172\\-171\\-23.18869\\-270.5703\\-171\\-23.6969\\-272.5234\\-171\\-25.23942\\-274.4766\\-171\\-25.96933\\-276.4297\\-171\\-27.52183\\-278.3828\\-171\\-28.34932\\-280.3359\\-171\\-32.22656\\-284.4049\\-171\\-33.66341\\-286.1953\\-171\\-34.9985\\-288.1484\\-171\\-37.0666\\-290.1016\\-171\\-39.61955\\-292.0547\\-171\\-41.99219\\-294.3489\\-171\\-43.94531\\-295.4144\\-171\\-45.89844\\-296.5841\\-171\\-47.85156\\-298.2568\\-171\\-49.80469\\-298.9216\\-171\\-51.75781\\-300.2641\\-171\\-53.71094\\-300.8955\\-171\\-57.61719\\-302.3018\\-171\\-61.52344\\-302.8631\\-171\\-67.38281\\-303.4177\\-171\\-69.33594\\-303.5293\\-171\\-71.28906\\-303.5311\\-171\\-75.19531\\-303.3842\\-171\\-83.00781\\-302.638\\-171\\-84.96094\\-302.3959\\-171" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "55.37684\\-297.9141\\-171\\53.71094\\-296.4235\\-171\\51.75781\\-296.1394\\-171\\51.41195\\-295.9609\\-171\\49.80469\\-294.418\\-171\\47.85156\\-294.2967\\-171\\45.89844\\-292.55\\-171\\43.94531\\-292.3643\\-171\\41.58266\\-290.1016\\-171\\40.03906\\-288.3926\\-171\\38.08594\\-286.6785\\-171\\36.13281\\-286.3474\\-171\\35.97819\\-286.1953\\-171\\35.52698\\-284.2422\\-171\\34.17969\\-282.7574\\-171\\32.22656\\-280.9361\\-171\\31.70277\\-280.3359\\-171\\30.27344\\-279.0781\\-171\\29.68618\\-278.3828\\-171\\29.26358\\-276.4297\\-171\\27.32077\\-274.4766\\-171\\26.66364\\-272.5234\\-171\\25.05208\\-270.5703\\-171\\24.41406\\-269.9568\\-171\\22.46094\\-267.4087\\-171\\21.25822\\-264.7109\\-171\\19.81141\\-260.8047\\-171\\19.42568\\-258.8516\\-171\\18.55469\\-256.8197\\-171\\17.85881\\-254.9453\\-171\\17.71851\\-252.9922\\-171\\16.18481\\-251.0391\\-171\\15.88579\\-249.0859\\-171\\14.97774\\-247.1328\\-171\\14.64844\\-246.1214\\-171\\14.03439\\-243.2266\\-171\\13.54774\\-241.2734\\-171\\13.36785\\-239.3203\\-171\\13.18359\\-233.4609\\-171\\12.69531\\-232.9541\\-171\\11.95817\\-231.5078\\-171\\11.86996\\-229.5547\\-171\\11.98572\\-227.6016\\-171\\11.73855\\-223.6953\\-171\\11.73222\\-221.7422\\-171\\10.54275\\-219.7891\\-171\\11.24108\\-217.8359\\-171\\10.74219\\-217.1895\\-171\\10.20281\\-215.8828\\-171\\10.11827\\-213.9297\\-171\\10.03339\\-208.0703\\-171\\10.04012\\-204.1641\\-171\\9.984334\\-196.3516\\-171\\10.07876\\-188.5391\\-171\\10.25391\\-182.6797\\-171\\11.71875\\-180.7266\\-171\\11.9598\\-172.9141\\-171\\13.23379\\-169.0078\\-171\\13.70216\\-167.0547\\-171\\14.64844\\-163.7909\\-171\\14.91672\\-163.1484\\-171\\16.60156\\-160.0878\\-171\\17.23189\\-159.2422\\-171\\18.01568\\-157.2891\\-171\\19.539\\-155.3359\\-171\\20.50781\\-153.5921\\-171\\21.89556\\-151.4297\\-171\\22.46094\\-150.9216\\-171\\24.41406\\-148.6911\\-171\\25.73482\\-147.5234\\-171\\28.32031\\-145.0642\\-171\\30.27344\\-144.5057\\-171\\32.22656\\-142.5121\\-171\\34.17969\\-140.8306\\-171\\36.13281\\-140.0894\\-171\\36.58466\\-139.7109\\-171\\40.03906\\-137.8083\\-171\\41.99219\\-138.7804\\-171\\43.94531\\-136.887\\-171\\45.89844\\-136.667\\-171\\47.85156\\-135.5117\\-171\\49.80469\\-135.3234\\-171\\51.75781\\-135.3634\\-171\\53.71094\\-134.7305\\-171\\55.66406\\-134.292\\-171\\57.61719\\-134.3295\\-171\\61.52344\\-134.5946\\-171\\63.47656\\-134.2955\\-171\\63.96484\\-133.8516\\-171\\65.42969\\-133.3406\\-171\\67.38281\\-133.4035\\-171\\68.24841\\-133.8516\\-171\\69.33594\\-134.9391\\-171\\71.28906\\-135.0885\\-171\\75.19531\\-135.6199\\-171\\77.63672\\-135.8047\\-171\\78.125\\-137.7578\\-171\\79.10156\\-138.7344\\-171\\79.24107\\-139.7109\\-171\\78.85742\\-141.6641\\-171\\76.9043\\-143.6172\\-171\\78.125\\-145.5703\\-171\\78.125\\-147.5234\\-171\\77.3112\\-151.4297\\-171\\78.40401\\-153.3828\\-171\\78.125\\-155.3359\\-171\\77.14844\\-156.4753\\-171\\75.19531\\-156.8008\\-171\\73.24219\\-157.9866\\-171\\71.28906\\-158.5098\\-171\\70.55664\\-159.2422\\-171\\69.0918\\-161.1953\\-171\\68.35938\\-163.1484\\-171\\67.87109\\-165.1016\\-171\\67.05729\\-167.0547\\-171\\68.35938\\-169.0078\\-171\\67.38281\\-169.9844\\-171\\66.79688\\-170.9609\\-171\\65.42969\\-173.8906\\-171\\65.10416\\-174.8672\\-171\\65.75521\\-176.8203\\-171\\65.18555\\-178.7734\\-171\\65.10416\\-180.7266\\-171\\64.45313\\-182.6797\\-171\\65.10416\\-184.6328\\-171\\63.80209\\-188.5391\\-171\\64.45313\\-190.4922\\-171\\64.45313\\-192.4453\\-171\\63.7207\\-194.3984\\-171\\63.7207\\-198.3047\\-171\\63.80209\\-200.2578\\-171\\62.5\\-202.2109\\-171\\62.5\\-206.1172\\-171\\61.19792\\-208.0703\\-171\\60.79102\\-210.0234\\-171\\60.05859\\-211.9766\\-171\\60.05859\\-217.8359\\-171\\59.24479\\-219.7891\\-171\\59.81445\\-221.7422\\-171\\60.05859\\-223.6953\\-171\\59.57031\\-224.6719\\-171\\59.32617\\-225.6484\\-171\\59.73307\\-227.6016\\-171\\59.24479\\-229.5547\\-171\\60.30273\\-231.5078\\-171\\59.81445\\-235.4141\\-171\\59.81445\\-237.3672\\-171\\59.57031\\-238.3438\\-171\\58.59375\\-239.3203\\-171\\58.34961\\-241.2734\\-171\\58.34961\\-245.1797\\-171\\57.37305\\-247.1328\\-171\\57.29167\\-249.0859\\-171\\56.88477\\-251.0391\\-171\\56.15234\\-252.9922\\-171\\56.64063\\-254.9453\\-171\\55.98959\\-256.8984\\-171\\56.64063\\-258.8516\\-171\\55.9082\\-260.8047\\-171\\55.66406\\-261.7813\\-171\\55.17578\\-262.7578\\-171\\55.17578\\-264.7109\\-171\\53.71094\\-267.6406\\-171\\53.4668\\-268.6172\\-171\\54.03646\\-270.5703\\-171\\53.95508\\-274.4766\\-171\\53.4668\\-276.4297\\-171\\52.73438\\-278.3828\\-171\\53.95508\\-280.3359\\-171\\53.38542\\-282.2891\\-171\\53.38542\\-284.2422\\-171\\54.93164\\-286.1953\\-171\\54.03646\\-290.1016\\-171\\54.85026\\-292.0547\\-171\\55.9082\\-295.9609\\-171\\57.29167\\-297.9141\\-171" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-73.24219\\-303.8542\\-169\\-75.19531\\-303.675\\-169\\-79.10156\\-303.1839\\-169\\-84.96094\\-302.5885\\-169\\-86.91406\\-302.2715\\-169\\-90.82031\\-301.2267\\-169\\-94.72656\\-300.4363\\-169\\-96.67969\\-299.662\\-169\\-100.5859\\-298.3394\\-169\\-102.5391\\-297.3136\\-169\\-104.4922\\-296.6992\\-169\\-106.4453\\-295.7298\\-169\\-108.3984\\-294.9905\\-169\\-110.3516\\-294.1102\\-169\\-112.3047\\-292.9929\\-169\\-114.2578\\-291.7224\\-169\\-116.2109\\-290.6448\\-169\\-122.0703\\-286.5929\\-169\\-124.6476\\-284.2422\\-169\\-127.9297\\-281.3329\\-169\\-129.8828\\-279.3381\\-169\\-131.8359\\-277.196\\-169\\-134.4105\\-274.4766\\-169\\-135.9787\\-272.5234\\-169\\-137.1861\\-270.5703\\-169\\-140.3014\\-266.6641\\-169\\-142.6606\\-262.7578\\-169\\-143.9251\\-260.8047\\-169\\-144.8669\\-258.8516\\-169\\-146.2197\\-256.8984\\-169\\-147.1953\\-254.9453\\-169\\-148.3177\\-252.9922\\-169\\-149.0861\\-251.0391\\-169\\-150.1282\\-249.0859\\-169\\-150.8028\\-247.1328\\-169\\-151.9624\\-245.1797\\-169\\-152.6912\\-243.2266\\-169\\-153.7619\\-241.2734\\-169\\-154.3957\\-239.3203\\-169\\-155.952\\-235.4141\\-169\\-156.367\\-233.4609\\-169\\-157.0253\\-231.5078\\-169\\-157.8465\\-229.5547\\-169\\-158.3226\\-227.6016\\-169\\-159.7611\\-223.6953\\-169\\-160.7096\\-219.7891\\-169\\-161.3966\\-217.8359\\-169\\-161.8514\\-215.8828\\-169\\-162.5682\\-210.0234\\-169\\-163.1557\\-206.1172\\-169\\-163.3599\\-204.1641\\-169\\-163.4646\\-202.2109\\-169\\-163.4961\\-198.3047\\-169\\-163.3954\\-196.3516\\-169\\-163.1406\\-194.3984\\-169\\-162.4244\\-190.4922\\-169\\-161.876\\-186.5859\\-169\\-161.3841\\-184.6328\\-169\\-160.5882\\-182.6797\\-169\\-160.0018\\-180.7266\\-169\\-159.1797\\-178.7865\\-169\\-157.2266\\-174.9214\\-169\\-156.1366\\-172.9141\\-169\\-153.7016\\-169.0078\\-169\\-151.3672\\-166.101\\-169\\-148.7422\\-163.1484\\-169\\-146.9126\\-161.1953\\-169\\-142.6151\\-157.2891\\-169\\-139.6484\\-154.8016\\-169\\-137.581\\-153.3828\\-169\\-133.7891\\-150.8891\\-169\\-131.8359\\-149.7809\\-169\\-129.8828\\-148.5287\\-169\\-127.9297\\-147.3937\\-169\\-125.9766\\-146.5408\\-169\\-124.0234\\-145.8032\\-169\\-122.0703\\-144.8222\\-169\\-120.1172\\-144.2056\\-169\\-118.1641\\-143.1472\\-169\\-116.2109\\-142.4861\\-169\\-114.2578\\-141.6564\\-169\\-112.3047\\-140.9361\\-169\\-110.3516\\-140.4684\\-169\\-108.3984\\-139.8427\\-169\\-106.4453\\-139.1134\\-169\\-102.5391\\-138.2558\\-169\\-100.5859\\-137.443\\-169\\-96.67969\\-136.4423\\-169\\-94.72656\\-135.6962\\-169\\-92.77344\\-135.1299\\-169\\-88.86719\\-134.2272\\-169\\-86.91406\\-133.6111\\-169\\-84.96094\\-133.2155\\-169\\-83.00781\\-132.9478\\-169\\-79.10156\\-132.5555\\-169\\-77.14844\\-132.2146\\-169\\-75.19531\\-131.7228\\-169\\-73.24219\\-131.4399\\-169\\-71.28906\\-131.2669\\-169\\-67.38281\\-131.1162\\-169\\-63.47656\\-131.0934\\-169\\-59.57031\\-131.2457\\-169\\-57.61719\\-131.4219\\-169\\-55.66406\\-131.7087\\-169\\-53.71094\\-132.1744\\-169\\-51.75781\\-132.5232\\-169\\-47.85156\\-133.0592\\-169\\-45.89844\\-133.5819\\-169\\-43.94531\\-134.3728\\-169\\-40.03906\\-135.59\\-169\\-38.08594\\-136.592\\-169\\-36.13281\\-137.4609\\-169\\-32.66398\\-139.7109\\-169\\-30.27344\\-141.3561\\-169\\-27.46302\\-143.6172\\-169\\-24.41406\\-146.4973\\-169\\-21.72112\\-149.4766\\-169\\-20.23199\\-151.4297\\-169\\-19.22526\\-153.3828\\-169\\-18.0161\\-155.3359\\-169\\-17.22301\\-157.2891\\-169\\-16.09281\\-159.2422\\-169\\-15.40612\\-161.1953\\-169\\-14.48328\\-163.1484\\-169\\-13.89492\\-165.1016\\-169\\-13.14041\\-169.0078\\-169\\-12.60938\\-170.9609\\-169\\-12.1844\\-172.9141\\-169\\-11.9687\\-174.8672\\-169\\-11.66539\\-178.7734\\-169\\-11.45089\\-180.7266\\-169\\-11.06542\\-182.6797\\-169\\-10.5806\\-184.6328\\-169\\-10.27135\\-186.5859\\-169\\-9.760791\\-192.4453\\-169\\-9.571362\\-196.3516\\-169\\-9.478082\\-200.2578\\-169\\-9.508928\\-206.1172\\-169\\-9.460802\\-210.0234\\-169\\-9.532335\\-213.9297\\-169\\-9.690118\\-217.8359\\-169\\-9.950508\\-225.6484\\-169\\-10.25391\\-229.5547\\-169\\-10.59358\\-231.5078\\-169\\-11.07449\\-233.4609\\-169\\-11.41036\\-235.4141\\-169\\-11.83877\\-239.3203\\-169\\-12.13458\\-241.2734\\-169\\-13.2393\\-245.1797\\-169\\-13.94413\\-249.0859\\-169\\-14.41988\\-251.0391\\-169\\-15.17519\\-252.9922\\-169\\-16.33103\\-256.8984\\-169\\-17.28678\\-258.8516\\-169\\-17.85562\\-260.8047\\-169\\-18.95229\\-262.7578\\-169\\-20.22182\\-266.6641\\-169\\-21.30418\\-268.6172\\-169\\-22.17134\\-270.5703\\-169\\-23.39124\\-272.5234\\-169\\-25.53991\\-276.4297\\-169\\-26.85205\\-278.3828\\-169\\-27.89142\\-280.3359\\-169\\-29.49089\\-282.2891\\-169\\-31.23146\\-284.2422\\-169\\-34.48683\\-288.1484\\-169\\-40.03906\\-293.359\\-169\\-41.99219\\-294.9531\\-169\\-43.94531\\-296.2575\\-169\\-45.89844\\-297.3216\\-169\\-47.85156\\-298.6786\\-169\\-51.75781\\-300.6086\\-169\\-53.71094\\-301.1629\\-169\\-57.61719\\-302.5222\\-169\\-67.38281\\-303.7811\\-169\\-69.33594\\-303.9089\\-169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "257" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-301.8099\\-169\\59.57031\\-301.3076\\-169\\57.61719\\-300.7721\\-169\\55.66406\\-300.4261\\-169\\54.13187\\-299.8672\\-169\\51.75781\\-298.7472\\-169\\49.80469\\-297.3715\\-169\\47.85156\\-296.6995\\-169\\45.89844\\-295.1841\\-169\\43.94531\\-294.386\\-169\\41.99219\\-292.9022\\-169\\40.03906\\-290.9544\\-169\\38.08594\\-289.1103\\-169\\36.13281\\-287.766\\-169\\34.47951\\-286.1953\\-169\\33.1563\\-284.2422\\-169\\31.40818\\-282.2891\\-169\\30.27344\\-281.1623\\-169\\27.97445\\-278.3828\\-169\\27.07435\\-276.4297\\-169\\25.61549\\-274.4766\\-169\\24.85988\\-272.5234\\-169\\24.41406\\-272.0064\\-169\\22.06643\\-268.6172\\-169\\21.21519\\-266.6641\\-169\\20.14951\\-264.7109\\-169\\18.96624\\-260.8047\\-169\\18.05124\\-258.8516\\-169\\17.19574\\-254.9453\\-169\\16.28675\\-252.9922\\-169\\15.67667\\-251.0391\\-169\\14.16331\\-247.1328\\-169\\13.34417\\-243.2266\\-169\\12.32824\\-239.3203\\-169\\12.07498\\-237.3672\\-169\\11.79778\\-233.4609\\-169\\10.86957\\-227.6016\\-169\\10.46036\\-225.6484\\-169\\10.28022\\-223.6953\\-169\\10.0234\\-219.7891\\-169\\10.0072\\-217.8359\\-169\\9.745173\\-213.9297\\-169\\9.53284\\-208.0703\\-169\\9.534486\\-202.2109\\-169\\9.480081\\-200.2578\\-169\\9.573514\\-192.4453\\-169\\9.709676\\-188.5391\\-169\\9.996536\\-182.6797\\-169\\10.23687\\-180.7266\\-169\\11.00787\\-176.8203\\-169\\11.85116\\-170.9609\\-169\\12.29239\\-169.0078\\-169\\13.09291\\-167.0547\\-169\\14.24864\\-163.1484\\-169\\15.33518\\-161.1953\\-169\\16.12261\\-159.2422\\-169\\17.39839\\-157.2891\\-169\\19.77873\\-153.3828\\-169\\21.21384\\-151.4297\\-169\\24.41406\\-147.6665\\-169\\26.64493\\-145.5703\\-169\\29.01786\\-143.6172\\-169\\31.62977\\-141.6641\\-169\\32.22656\\-141.1152\\-169\\34.47033\\-139.7109\\-169\\38.08594\\-137.6745\\-169\\40.03906\\-136.7691\\-169\\41.99219\\-136.5511\\-169\\43.94531\\-135.1235\\-169\\45.89844\\-134.7874\\-169\\47.85156\\-134.1081\\-169\\49.80469\\-133.5799\\-169\\51.75781\\-133.4423\\-169\\53.71094\\-132.8549\\-169\\55.66406\\-132.5882\\-169\\59.57031\\-132.2212\\-169\\61.52344\\-132.0883\\-169\\63.47656\\-131.8246\\-169\\65.42969\\-131.2578\\-169\\67.38281\\-131.2706\\-169\\69.33594\\-132.0406\\-169\\71.28906\\-132.1682\\-169\\73.24219\\-132.1355\\-169\\75.19531\\-132.212\\-169\\77.14844\\-132.4348\\-169\\81.05469\\-132.7626\\-169\\83.00781\\-133.0155\\-169\\84.96094\\-133.4167\\-169\\86.91406\\-133.5116\\-169\\88.86719\\-133.7043\\-169\\90.82031\\-134.032\\-169\\92.77344\\-134.7932\\-169\\96.67969\\-135.2239\\-169\\97.91396\\-135.8047\\-169\\100.5859\\-137.9317\\-169\\102.5391\\-138.0284\\-169\\104.4922\\-138.2513\\-169\\106.4453\\-139.2837\\-169\\108.3984\\-139.5005\\-169\\110.3516\\-140.4181\\-169\\112.3047\\-140.9561\\-169\\114.2578\\-141.0734\\-169\\116.0889\\-141.6641\\-169\\118.1641\\-142.6668\\-169\\120.1172\\-142.8375\\-169\\121.3257\\-143.6172\\-169\\122.0703\\-144.3712\\-169\\124.0234\\-144.6581\\-169\\125.9766\\-145.737\\-169\\129.8828\\-147.3755\\-169\\131.8359\\-148.7528\\-169\\133.7891\\-149.385\\-169\\135.7422\\-151.3442\\-169\\139.1907\\-153.3828\\-169\\139.6484\\-153.8711\\-169\\142.1509\\-155.3359\\-169\\145.5078\\-158.6642\\-169\\146.1515\\-159.2422\\-169\\147.9492\\-161.1953\\-169\\151.3672\\-164.6892\\-169\\151.6322\\-165.1016\\-169\\152.2311\\-167.0547\\-169\\153.7737\\-169.0078\\-169\\153.9307\\-170.9609\\-169\\154.034\\-174.8672\\-169\\153.3398\\-178.7734\\-169\\151.6602\\-180.7266\\-169\\151.6242\\-182.6797\\-169\\151.3672\\-183.2656\\-169\\149.4141\\-183.3933\\-169\\147.4609\\-182.7836\\-169\\145.5078\\-181.108\\-169\\143.5547\\-181.0573\\-169\\141.6016\\-181.6308\\-169\\139.6484\\-182.7685\\-169\\137.6953\\-181.1923\\-169\\135.9992\\-182.6797\\-169\\137.2255\\-184.6328\\-169\\138.6127\\-186.5859\\-169\\139.6484\\-187.8839\\-169\\140.4969\\-188.5391\\-169\\140.9053\\-190.4922\\-169\\141.6016\\-192.4918\\-169\\142.7455\\-194.3984\\-169\\142.5985\\-196.3516\\-169\\141.9271\\-198.3047\\-169\\141.6016\\-198.6709\\-169\\140.8288\\-200.2578\\-169\\140.0023\\-202.2109\\-169\\137.6953\\-204.3992\\-169\\135.7422\\-205.5854\\-169\\132.3844\\-208.0703\\-169\\133.7891\\-209.5564\\-169\\135.7422\\-209.1831\\-169\\137.6953\\-207.7167\\-169\\138.0157\\-208.0703\\-169\\138.339\\-210.0234\\-169\\138.3534\\-211.9766\\-169\\136.5039\\-213.9297\\-169\\136.3407\\-215.8828\\-169\\137.6953\\-217.5625\\-169\\138.0371\\-217.8359\\-169\\135.7422\\-219.9518\\-169\\133.7891\\-219.2371\\-169\\133.1209\\-219.7891\\-169\\133.7377\\-221.7422\\-169\\135.5591\\-223.6953\\-169\\135.7422\\-224.2813\\-169\\137.6953\\-223.5732\\-169\\139.6484\\-222.7188\\-169\\140.8854\\-221.7422\\-169\\140.408\\-219.7891\\-169\\143.5547\\-219.4318\\-169\\145.1823\\-219.7891\\-169\\148.0067\\-221.7422\\-169\\147.4609\\-222.5856\\-169\\145.5078\\-222.5309\\-169\\144.3434\\-223.6953\\-169\\143.8965\\-225.6484\\-169\\143.5547\\-226.2027\\-169\\141.6016\\-228.6697\\-169\\139.6484\\-228.9398\\-169\\139.0099\\-229.5547\\-169\\138.2042\\-231.5078\\-169\\138.2243\\-233.4609\\-169\\140.103\\-235.4141\\-169\\139.9148\\-237.3672\\-169\\139.5089\\-237.3672\\-169\\137.6953\\-235.7803\\-169\\135.7422\\-234.8607\\-169\\134.7656\\-235.4141\\-169\\133.7891\\-236.7975\\-169\\133.5261\\-237.3672\\-169\\134.2593\\-239.3203\\-169\\135.7422\\-240.9886\\-169\\136.1694\\-241.2734\\-169\\137.6953\\-243.0173\\-169\\139.6484\\-240.8713\\-169\\141.6016\\-240.7852\\-169\\143.5547\\-239.418\\-169\\145.5078\\-241.0022\\-169\\146.8395\\-241.2734\\-169\\147.4609\\-241.957\\-169\\149.4141\\-242.993\\-169\\149.6528\\-243.2266\\-169\\150.4883\\-245.1797\\-169\\151.3672\\-246.0586\\-169\\153.3203\\-246.6158\\-169\\155.2734\\-247.0491\\-169\\155.2734\\-247.2723\\-169\\153.6175\\-249.0859\\-169\\153.1808\\-252.9922\\-169\\151.5625\\-254.9453\\-169\\151.3672\\-255.3987\\-169\\149.9192\\-256.8984\\-169\\148.2928\\-258.8516\\-169\\147.8299\\-260.8047\\-169\\146.1033\\-262.7578\\-169\\145.841\\-264.7109\\-169\\145.5078\\-265.14\\-169\\141.9744\\-268.6172\\-169\\141.6016\\-269.6965\\-169\\139.9374\\-272.5234\\-169\\137.6953\\-274.6259\\-169\\135.7422\\-275.5833\\-169\\134.8958\\-276.4297\\-169\\133.7891\\-277.173\\-169\\132.6633\\-278.3828\\-169\\129.8828\\-281.0427\\-169\\127.9297\\-282.1638\\-169\\125.9766\\-283.597\\-169\\125.3744\\-284.2422\\-169\\122.0703\\-286.47\\-169\\120.1172\\-288.2671\\-169\\118.1641\\-288.6922\\-169\\116.2109\\-290.5596\\-169\\114.2578\\-291.1924\\-169\\113.3955\\-292.0547\\-169\\112.3047\\-292.8496\\-169\\110.3516\\-293.0136\\-169\\108.3984\\-294.2318\\-169\\106.4453\\-294.6619\\-169\\104.4922\\-295.9449\\-169\\102.5391\\-296.0929\\-169\\100.5859\\-297.2137\\-169\\98.63281\\-297.4314\\-169\\96.67969\\-298.5016\\-169\\94.72656\\-299.0335\\-169\\92.77344\\-299.1011\\-169\\90.82031\\-299.9676\\-169\\88.86719\\-300.647\\-169\\84.96094\\-300.7585\\-169\\82.20564\\-301.8203\\-169\\79.10156\\-302.577\\-169\\75.19531\\-302.6948\\-169\\71.28906\\-302.6257\\-169\\69.33594\\-302.2037\\-169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "4" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "143.5547\\-189.3458\\-169\\143.133\\-188.5391\\-169\\143.5547\\-188.2349\\-169\\143.886\\-188.5391\\-169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "4" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "145.5078\\-194.8053\\-169\\144.6036\\-194.3984\\-169\\145.5078\\-193.1777\\-169\\146.7928\\-194.3984\\-169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "149.4141\\-216.2923\\-169\\149.1319\\-215.8828\\-169\\149.2473\\-213.9297\\-169\\147.4609\\-212.0023\\-169\\145.5078\\-214.0812\\-169\\143.5547\\-211.9014\\-169\\141.6016\\-210.566\\-169\\141.0203\\-210.0234\\-169\\141.6016\\-209.642\\-169\\143.5547\\-209.6297\\-169\\145.4139\\-208.0703\\-169\\145.3879\\-206.1172\\-169\\145.1737\\-204.1641\\-169\\145.3738\\-202.2109\\-169\\145.6533\\-202.2109\\-169\\147.4866\\-204.1641\\-169\\147.966\\-206.1172\\-169\\147.966\\-208.0703\\-169\\148.1934\\-210.0234\\-169\\147.4924\\-211.9766\\-169\\149.573\\-213.9297\\-169\\149.7875\\-215.8828\\-169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "181" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-303.8682\\-167\\-79.10156\\-303.2914\\-167\\-83.00781\\-302.8616\\-167\\-84.96094\\-302.7003\\-167\\-86.91406\\-302.4227\\-167\\-88.86719\\-301.9653\\-167\\-90.82031\\-301.3931\\-167\\-94.72656\\-300.5706\\-167\\-96.67969\\-299.9626\\-167\\-98.63281\\-299.1595\\-167\\-100.5859\\-298.5634\\-167\\-102.5391\\-297.5571\\-167\\-104.4922\\-296.8603\\-167\\-106.4453\\-296.0469\\-167\\-108.3984\\-295.1125\\-167\\-110.3516\\-294.3546\\-167\\-110.8253\\-294.0078\\-167\\-114.2288\\-292.0547\\-167\\-116.2109\\-290.8091\\-167\\-118.1641\\-289.3966\\-167\\-120.1172\\-288.2358\\-167\\-122.0703\\-286.7733\\-167\\-124.8006\\-284.2422\\-167\\-127.9297\\-281.4396\\-167\\-129.8828\\-279.4686\\-167\\-130.8533\\-278.3828\\-167\\-134.6139\\-274.4766\\-167\\-136.2235\\-272.5234\\-167\\-137.4283\\-270.5703\\-167\\-138.8977\\-268.6172\\-167\\-140.5108\\-266.6641\\-167\\-141.8457\\-264.7109\\-167\\-142.8571\\-262.7578\\-167\\-144.1561\\-260.8047\\-167\\-145.0998\\-258.8516\\-167\\-146.3941\\-256.8984\\-167\\-147.5296\\-254.9453\\-167\\-150.2918\\-249.0859\\-167\\-151.0728\\-247.1328\\-167\\-152.173\\-245.1797\\-167\\-152.9857\\-243.2266\\-167\\-154.0079\\-241.2734\\-167\\-154.6203\\-239.3203\\-167\\-155.5324\\-237.3672\\-167\\-156.1422\\-235.4141\\-167\\-156.5817\\-233.4609\\-167\\-157.5103\\-231.5078\\-167\\-158.6326\\-227.6016\\-167\\-159.5202\\-225.6484\\-167\\-160.5314\\-221.7422\\-167\\-161.202\\-219.7891\\-167\\-161.7525\\-217.8359\\-167\\-162.0739\\-215.8828\\-167\\-162.5779\\-211.9766\\-167\\-163.3599\\-208.0703\\-167\\-163.5866\\-206.1172\\-167\\-163.8046\\-202.2109\\-167\\-163.8359\\-198.3047\\-167\\-163.6258\\-194.3984\\-167\\-163.3336\\-192.4453\\-167\\-162.7894\\-190.4922\\-167\\-162.3999\\-188.5391\\-167\\-161.7479\\-184.6328\\-167\\-160.3162\\-180.7266\\-167\\-159.668\\-178.7734\\-167\\-158.5306\\-176.8203\\-167\\-157.6425\\-174.8672\\-167\\-156.3832\\-172.9141\\-167\\-154.0558\\-169.0078\\-167\\-152.4658\\-167.0547\\-167\\-147.3178\\-161.1953\\-167\\-142.9162\\-157.2891\\-167\\-139.6484\\-154.486\\-167\\-137.6953\\-153.0377\\-167\\-135.7422\\-151.9426\\-167\\-135.0999\\-151.4297\\-167\\-132.0143\\-149.4766\\-167\\-129.8828\\-148.2941\\-167\\-127.9297\\-147.0962\\-167\\-125.9766\\-146.3872\\-167\\-122.0703\\-144.6651\\-167\\-120.1172\\-143.9607\\-167\\-118.1641\\-142.9347\\-167\\-116.2109\\-142.2692\\-167\\-114.2578\\-141.3631\\-167\\-112.3047\\-140.7577\\-167\\-110.3516\\-140.2586\\-167\\-108.3984\\-139.4931\\-167\\-106.4453\\-138.919\\-167\\-104.4922\\-138.5426\\-167\\-100.5859\\-137.1515\\-167\\-98.63281\\-136.6768\\-167\\-96.67969\\-136.0983\\-167\\-94.72656\\-135.3253\\-167\\-90.82031\\-134.4635\\-167\\-88.86719\\-133.8125\\-167\\-86.91406\\-133.3207\\-167\\-84.96094\\-133.0084\\-167\\-79.10156\\-132.2986\\-167\\-77.14844\\-131.762\\-167\\-75.19531\\-131.3957\\-167\\-71.28906\\-131.099\\-167\\-67.38281\\-130.9686\\-167\\-63.47656\\-130.9637\\-167\\-59.57031\\-131.1143\\-167\\-55.66406\\-131.4584\\-167\\-51.75781\\-132.3674\\-167\\-47.85156\\-132.9223\\-167\\-45.89844\\-133.3207\\-167\\-41.99219\\-134.7265\\-167\\-40.03906\\-135.3318\\-167\\-38.08594\\-136.3564\\-167\\-36.13281\\-137.183\\-167\\-32.22656\\-139.5298\\-167\\-30.27344\\-140.8895\\-167\\-27.11565\\-143.6172\\-167\\-24.41406\\-146.2332\\-167\\-22.46094\\-148.3173\\-167\\-19.96228\\-151.4297\\-167\\-18.98636\\-153.3828\\-167\\-17.77872\\-155.3359\\-167\\-16.9181\\-157.2891\\-167\\-15.84671\\-159.2422\\-167\\-15.18165\\-161.1953\\-167\\-14.20111\\-163.1484\\-167\\-13.70129\\-165.1016\\-167\\-13.31042\\-167.0547\\-167\\-12.24002\\-170.9609\\-167\\-11.93576\\-172.9141\\-167\\-11.4787\\-178.7734\\-167\\-11.2087\\-180.7266\\-167\\-10.6756\\-182.6797\\-167\\-10.31681\\-184.6328\\-167\\-9.994284\\-188.5391\\-167\\-9.61691\\-192.4453\\-167\\-9.397322\\-196.3516\\-167\\-9.27124\\-202.2109\\-167\\-9.211189\\-210.0234\\-167\\-9.268246\\-213.9297\\-167\\-9.38522\\-215.8828\\-167\\-9.595352\\-221.7422\\-167\\-9.728599\\-223.6953\\-167\\-9.867447\\-227.6016\\-167\\-10.27135\\-231.5078\\-167\\-11.2274\\-235.4141\\-167\\-11.99525\\-241.2734\\-167\\-12.40517\\-243.2266\\-167\\-13.09543\\-245.1797\\-167\\-13.86834\\-249.0859\\-167\\-14.34744\\-251.0391\\-167\\-15.10976\\-252.9922\\-167\\-16.20483\\-256.8984\\-167\\-17.1875\\-258.8516\\-167\\-17.78886\\-260.8047\\-167\\-18.86345\\-262.7578\\-167\\-20.14838\\-266.6641\\-167\\-21.24605\\-268.6172\\-167\\-22.08984\\-270.5703\\-167\\-23.34547\\-272.5234\\-167\\-25.4889\\-276.4297\\-167\\-26.77582\\-278.3828\\-167\\-27.83526\\-280.3359\\-167\\-29.45006\\-282.2891\\-167\\-31.18369\\-284.2422\\-167\\-32.22656\\-285.627\\-167\\-34.17969\\-288.0341\\-167\\-40.03906\\-293.6157\\-167\\-40.4971\\-294.0078\\-167\\-43.94531\\-296.476\\-167\\-45.89844\\-297.5741\\-167\\-47.85156\\-298.8579\\-167\\-49.80469\\-299.875\\-167\\-51.75781\\-300.7254\\-167\\-53.71094\\-301.2894\\-167\\-55.66406\\-302.0497\\-167\\-57.61719\\-302.6075\\-167\\-61.52344\\-303.136\\-167\\-65.48394\\-303.7734\\-167\\-67.38281\\-304.0092\\-167\\-69.33594\\-304.099\\-167\\-73.24219\\-304.0209\\-167" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "174" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-301.8284\\-167\\57.61719\\-301.2669\\-167\\55.66406\\-300.8209\\-167\\53.71094\\-300.2383\\-167\\51.75781\\-299.2064\\-167\\49.80469\\-298.3557\\-167\\47.85156\\-297.0696\\-167\\43.94531\\-294.8546\\-167\\40.23918\\-292.0547\\-167\\38.08594\\-290.0756\\-167\\36.13281\\-288.4352\\-167\\33.88445\\-286.1953\\-167\\30.76528\\-282.2891\\-167\\30.27344\\-281.7747\\-167\\27.59399\\-278.3828\\-167\\26.36719\\-276.3754\\-167\\25.31226\\-274.4766\\-167\\23.96746\\-272.5234\\-167\\22.99528\\-270.5703\\-167\\21.67411\\-268.6172\\-167\\19.81378\\-264.7109\\-167\\19.32026\\-262.7578\\-167\\17.80149\\-258.8516\\-167\\17.44792\\-256.8984\\-167\\16.90051\\-254.9453\\-167\\16.04432\\-252.9922\\-167\\15.48623\\-251.0391\\-167\\14.64075\\-249.0859\\-167\\13.95256\\-247.1328\\-167\\13.13612\\-243.2266\\-167\\12.50895\\-241.2734\\-167\\12.07886\\-239.3203\\-167\\11.85591\\-237.3672\\-167\\11.59068\\-233.4609\\-167\\11.28203\\-231.5078\\-167\\10.47165\\-227.6016\\-167\\10.19597\\-225.6484\\-167\\10.0297\\-221.7422\\-167\\9.87885\\-219.7891\\-167\\9.453588\\-211.9766\\-167\\9.305334\\-208.0703\\-167\\9.353164\\-204.1641\\-167\\9.280454\\-200.2578\\-167\\9.423553\\-192.4453\\-167\\9.784867\\-184.6328\\-167\\10.33579\\-178.7734\\-167\\11.14695\\-174.8672\\-167\\11.76652\\-170.9609\\-167\\12.14718\\-169.0078\\-167\\12.9115\\-167.0547\\-167\\13.55205\\-165.1016\\-167\\14.05165\\-163.1484\\-167\\15.05859\\-161.1953\\-167\\15.87469\\-159.2422\\-167\\17.13929\\-157.2891\\-167\\18.1425\\-155.3359\\-167\\20.50781\\-151.8898\\-167\\22.3508\\-149.4766\\-167\\24.41406\\-147.2082\\-167\\26.36719\\-145.392\\-167\\28.44881\\-143.6172\\-167\\32.22656\\-140.7331\\-167\\34.17969\\-139.4076\\-167\\36.13281\\-138.5307\\-167\\38.08594\\-137.2415\\-167\\40.03906\\-136.425\\-167\\41.99219\\-135.3853\\-167\\45.89844\\-134.1866\\-167\\47.85156\\-133.3633\\-167\\49.80469\\-133.0172\\-167\\51.75781\\-132.7823\\-167\\56.22746\\-131.8984\\-167\\61.52344\\-130.9404\\-167\\67.38281\\-130.7693\\-167\\69.33594\\-130.8745\\-167\\73.24219\\-130.94\\-167\\77.14844\\-131.5474\\-167\\79.10156\\-131.9699\\-167\\81.05469\\-132.2767\\-167\\84.96094\\-132.7364\\-167\\88.86719\\-133.0913\\-167\\90.82031\\-133.3499\\-167\\92.77344\\-133.7663\\-167\\94.72656\\-134.3028\\-167\\98.63281\\-135.0223\\-167\\100.5859\\-136.0382\\-167\\104.4922\\-136.7813\\-167\\108.3984\\-138.2496\\-167\\113.9147\\-139.7109\\-167\\116.2109\\-140.4336\\-167\\120.1172\\-141.3096\\-167\\122.0703\\-142.3694\\-167\\124.0234\\-142.8761\\-167\\125.9766\\-143.9881\\-167\\127.9297\\-144.6889\\-167\\131.8359\\-146.7352\\-167\\133.4588\\-147.5234\\-167\\135.7422\\-148.9017\\-167\\137.6953\\-150.254\\-167\\139.6169\\-151.4297\\-167\\143.5547\\-154.1716\\-167\\147.105\\-157.2891\\-167\\149.4141\\-159.4714\\-167\\151.3672\\-161.4937\\-167\\153.3203\\-163.74\\-167\\154.3464\\-165.1016\\-167\\157.2266\\-169.2767\\-167\\158.045\\-170.9609\\-167\\160.4167\\-174.8672\\-167\\161.1328\\-176.7629\\-167\\162.0096\\-178.7734\\-167\\162.2523\\-180.7266\\-167\\163.5544\\-182.6797\\-167\\163.7434\\-184.6328\\-167\\163.8744\\-188.5391\\-167\\165.136\\-190.4922\\-167\\165.3985\\-194.3984\\-167\\165.4934\\-198.3047\\-167\\165.5239\\-202.2109\\-167\\165.5031\\-206.1172\\-167\\165.42\\-211.9766\\-167\\165.1517\\-217.8359\\-167\\165.0042\\-219.7891\\-167\\163.7494\\-221.7422\\-167\\163.6955\\-227.6016\\-167\\163.6098\\-229.5547\\-167\\162.7407\\-231.5078\\-167\\162.2759\\-233.4609\\-167\\162.0672\\-235.4141\\-167\\160.7866\\-239.3203\\-167\\160.2766\\-241.2734\\-167\\159.3646\\-243.2266\\-167\\158.0889\\-247.1328\\-167\\156.1468\\-251.0391\\-167\\155.4672\\-252.9922\\-167\\153.3203\\-256.5544\\-167\\151.6493\\-258.8516\\-167\\150.4322\\-260.8047\\-167\\149.0217\\-262.7578\\-167\\148.0278\\-264.7109\\-167\\146.4716\\-266.6641\\-167\\144.6487\\-268.6172\\-167\\143.0995\\-270.5703\\-167\\141.676\\-272.5234\\-167\\139.6484\\-274.6607\\-167\\137.6849\\-276.4297\\-167\\135.7422\\-277.8906\\-167\\131.8359\\-281.3664\\-167\\129.8828\\-282.933\\-167\\127.9297\\-284.1278\\-167\\124.0234\\-287.1297\\-167\\122.0703\\-288.433\\-167\\120.1172\\-289.5267\\-167\\116.1606\\-292.0547\\-167\\112.5632\\-294.0078\\-167\\112.3047\\-294.2061\\-167\\108.3984\\-295.5571\\-167\\106.4453\\-296.4652\\-167\\102.5391\\-297.7011\\-167\\100.5859\\-298.7838\\-167\\98.63281\\-299.1886\\-167\\96.67969\\-300.048\\-167\\94.72656\\-300.6429\\-167\\92.77344\\-300.884\\-167\\90.82031\\-301.2726\\-167\\88.86719\\-301.875\\-167\\86.91406\\-302.1985\\-167\\83.00781\\-302.6582\\-167\\81.05469\\-302.8131\\-167\\75.19531\\-303.0565\\-167\\71.28906\\-302.9643\\-167\\67.38281\\-302.7469\\-167\\63.47656\\-302.461\\-167\\61.52344\\-302.2685\\-167" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "183" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-303.9729\\-165\\-81.05469\\-303.136\\-165\\-86.91406\\-302.53\\-165\\-88.86719\\-302.1411\\-165\\-90.82031\\-301.5382\\-165\\-94.72656\\-300.6905\\-165\\-96.67969\\-300.1794\\-165\\-98.63281\\-299.3523\\-165\\-100.5859\\-298.7287\\-165\\-104.4922\\-296.9863\\-165\\-106.4453\\-296.2888\\-165\\-108.3984\\-295.2131\\-165\\-110.3516\\-294.5291\\-165\\-112.3047\\-293.3054\\-165\\-114.2578\\-292.2541\\-165\\-117.3944\\-290.1016\\-165\\-118.1641\\-289.4879\\-165\\-120.1172\\-288.3963\\-165\\-122.0703\\-286.8789\\-165\\-125.9766\\-283.2656\\-165\\-127.9297\\-281.5332\\-165\\-129.8828\\-279.5642\\-165\\-130.9257\\-278.3828\\-165\\-134.7461\\-274.4766\\-165\\-136.369\\-272.5234\\-165\\-137.6869\\-270.5703\\-165\\-139.1066\\-268.6172\\-165\\-140.6712\\-266.6641\\-165\\-142.0864\\-264.7109\\-165\\-143.0315\\-262.7578\\-165\\-144.3212\\-260.8047\\-165\\-145.5078\\-258.6696\\-165\\-147.4609\\-255.443\\-165\\-147.8254\\-254.9453\\-165\\-148.6217\\-252.9922\\-165\\-149.6601\\-251.0391\\-165\\-150.4608\\-249.0859\\-165\\-151.4619\\-247.1328\\-165\\-153.3582\\-243.2266\\-165\\-154.2127\\-241.2734\\-165\\-154.8733\\-239.3203\\-165\\-155.8018\\-237.3672\\-165\\-156.2968\\-235.4141\\-165\\-156.9081\\-233.4609\\-165\\-157.8159\\-231.5078\\-165\\-158.3344\\-229.5547\\-165\\-159.8362\\-225.6484\\-165\\-160.3027\\-223.6953\\-165\\-160.8869\\-221.7422\\-165\\-161.5851\\-219.7891\\-165\\-161.9724\\-217.8359\\-165\\-162.5089\\-213.9297\\-165\\-163.4069\\-210.0234\\-165\\-163.6801\\-208.0703\\-165\\-164.0421\\-202.2109\\-165\\-164.0778\\-198.3047\\-165\\-163.8892\\-194.3984\\-165\\-163.7042\\-192.4453\\-165\\-163.3085\\-190.4922\\-165\\-162.7189\\-188.5391\\-165\\-161.9948\\-184.6328\\-165\\-161.5329\\-182.6797\\-165\\-160.6638\\-180.7266\\-165\\-159.9823\\-178.7734\\-165\\-159.1797\\-177.1683\\-165\\-157.2266\\-173.6533\\-165\\-156.6695\\-172.9141\\-165\\-155.694\\-170.9609\\-165\\-154.3333\\-169.0078\\-165\\-152.7495\\-167.0547\\-165\\-147.8195\\-161.1953\\-165\\-145.5078\\-159.1504\\-165\\-143.5547\\-157.5625\\-165\\-140.9875\\-155.3359\\-165\\-137.6953\\-152.7741\\-165\\-135.7422\\-151.6423\\-165\\-133.7891\\-150.3928\\-165\\-131.8359\\-149.0263\\-165\\-129.8828\\-148.0806\\-165\\-127.9297\\-146.9131\\-165\\-125.9766\\-146.2652\\-165\\-124.0234\\-145.2309\\-165\\-122.0703\\-144.5386\\-165\\-118.1641\\-142.7839\\-165\\-116.2109\\-142.0612\\-165\\-114.2578\\-141.1511\\-165\\-110.3516\\-140.0602\\-165\\-108.3984\\-139.2328\\-165\\-104.4922\\-138.345\\-165\\-102.5391\\-137.5221\\-165\\-100.5859\\-136.9357\\-165\\-98.63281\\-136.4501\\-165\\-96.67969\\-135.6826\\-165\\-94.72656\\-135.0979\\-165\\-92.77344\\-134.683\\-165\\-90.82031\\-134.1515\\-165\\-88.86719\\-133.4733\\-165\\-86.91406\\-133.1084\\-165\\-83.00781\\-132.6528\\-165\\-81.05469\\-132.3447\\-165\\-77.14844\\-131.4399\\-165\\-75.19531\\-131.2118\\-165\\-71.28906\\-130.9637\\-165\\-67.38281\\-130.8515\\-165\\-61.52344\\-130.9266\\-165\\-57.61719\\-131.1416\\-165\\-55.66406\\-131.3114\\-165\\-53.71094\\-131.6358\\-165\\-51.75781\\-132.2101\\-165\\-49.80469\\-132.5867\\-165\\-47.85156\\-132.8282\\-165\\-45.89844\\-133.1692\\-165\\-43.94531\\-133.7663\\-165\\-41.99219\\-134.5752\\-165\\-40.03906\\-135.1864\\-165\\-38.08594\\-136.2251\\-165\\-36.13281\\-137.0557\\-165\\-34.17969\\-138.2145\\-165\\-32.22656\\-139.2227\\-165\\-30.27344\\-140.6228\\-165\\-28.32031\\-142.2676\\-165\\-24.41406\\-146.0329\\-165\\-22.46094\\-148.0907\\-165\\-19.77379\\-151.4297\\-165\\-16.59393\\-157.2891\\-165\\-15.67613\\-159.2422\\-165\\-14.97176\\-161.1953\\-165\\-14.05531\\-163.1484\\-165\\-13.1638\\-167.0547\\-165\\-12.50895\\-169.0078\\-165\\-12.05842\\-170.9609\\-165\\-11.8207\\-172.9141\\-165\\-11.32111\\-178.7734\\-165\\-10.95998\\-180.7266\\-165\\-10.46036\\-182.6797\\-165\\-10.18807\\-184.6328\\-165\\-9.936063\\-188.5391\\-165\\-9.401483\\-194.3984\\-165\\-9.188863\\-202.2109\\-165\\-9.191176\\-204.1641\\-165\\-9.078664\\-210.0234\\-165\\-9.138778\\-213.9297\\-165\\-9.363839\\-217.8359\\-165\\-9.490317\\-221.7422\\-165\\-9.671271\\-225.6484\\-165\\-9.944898\\-229.5547\\-165\\-10.18807\\-231.5078\\-165\\-10.5806\\-233.4609\\-165\\-11.1341\\-235.4141\\-165\\-11.46376\\-237.3672\\-165\\-11.96435\\-241.2734\\-165\\-12.33082\\-243.2266\\-165\\-13.03469\\-245.1797\\-165\\-13.83846\\-249.0859\\-165\\-14.31418\\-251.0391\\-165\\-15.09123\\-252.9922\\-165\\-16.18562\\-256.8984\\-165\\-17.18298\\-258.8516\\-165\\-17.77242\\-260.8047\\-165\\-18.82234\\-262.7578\\-165\\-20.15953\\-266.6641\\-165\\-21.26034\\-268.6172\\-165\\-22.13319\\-270.5703\\-165\\-23.38637\\-272.5234\\-165\\-25.54515\\-276.4297\\-165\\-26.81843\\-278.3828\\-165\\-27.88412\\-280.3359\\-165\\-29.47329\\-282.2891\\-165\\-31.17811\\-284.2422\\-165\\-34.17969\\-288.1032\\-165\\-40.03906\\-293.7952\\-165\\-43.94531\\-296.5928\\-165\\-47.85156\\-298.9789\\-165\\-49.80469\\-300.0974\\-165\\-51.75781\\-300.8261\\-165\\-53.71094\\-301.4146\\-165\\-55.66406\\-302.2012\\-165\\-57.61719\\-302.6648\\-165\\-61.52344\\-303.2302\\-165\\-65.42969\\-303.9221\\-165\\-67.38281\\-304.1302\\-165\\-69.33594\\-304.1988\\-165\\-73.24219\\-304.1095\\-165" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "170" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.0479\\-165\\57.61719\\-301.4037\\-165\\53.71094\\-300.3893\\-165\\51.75781\\-299.3665\\-165\\49.80469\\-298.5216\\-165\\47.85156\\-297.2251\\-165\\45.89844\\-296.2389\\-165\\43.94531\\-294.9906\\-165\\40.03906\\-292.2198\\-165\\36.13281\\-288.6973\\-165\\33.64258\\-286.1953\\-165\\32.02967\\-284.2422\\-165\\27.45028\\-278.3828\\-165\\26.15957\\-276.4297\\-165\\25.14648\\-274.4766\\-165\\23.76478\\-272.5234\\-165\\22.67718\\-270.5703\\-165\\21.48438\\-268.6172\\-165\\20.48438\\-266.6641\\-165\\19.69203\\-264.7109\\-165\\19.18292\\-262.7578\\-165\\18.27469\\-260.8047\\-165\\17.6959\\-258.8516\\-165\\17.32086\\-256.8984\\-165\\15.90545\\-252.9922\\-165\\15.35135\\-251.0391\\-165\\14.44322\\-249.0859\\-165\\13.84995\\-247.1328\\-165\\12.9996\\-243.2266\\-165\\12.35594\\-241.2734\\-165\\11.98033\\-239.3203\\-165\\11.46205\\-233.4609\\-165\\11.09669\\-231.5078\\-165\\10.5806\\-229.5547\\-165\\10.26257\\-227.6016\\-165\\10.05314\\-225.6484\\-165\\9.874659\\-221.7422\\-165\\9.492842\\-215.8828\\-165\\9.203942\\-211.9766\\-165\\9.057273\\-208.0703\\-165\\9.132544\\-202.2109\\-165\\9.103436\\-200.2578\\-165\\9.331597\\-194.3984\\-165\\9.359195\\-192.4453\\-165\\9.746755\\-184.6328\\-165\\10.24534\\-178.7734\\-165\\10.5806\\-176.8203\\-165\\11.07871\\-174.8672\\-165\\12.07886\\-169.0078\\-165\\12.85429\\-167.0547\\-165\\13.49706\\-165.1016\\-165\\13.9719\\-163.1484\\-165\\15.76987\\-159.2422\\-165\\16.97515\\-157.2891\\-165\\17.96646\\-155.3359\\-165\\20.50781\\-151.5016\\-165\\22.07661\\-149.4766\\-165\\24.41406\\-146.8993\\-165\\28.04487\\-143.6172\\-165\\30.56453\\-141.6641\\-165\\34.17969\\-139.1276\\-165\\36.13281\\-138.2756\\-165\\38.08594\\-137.0114\\-165\\40.03906\\-136.1616\\-165\\41.99219\\-135.1444\\-165\\43.94531\\-134.5885\\-165\\45.89844\\-133.7492\\-165\\47.85156\\-133.1191\\-165\\51.75781\\-132.5845\\-165\\55.66406\\-131.6015\\-165\\61.52344\\-130.7611\\-165\\65.42969\\-130.7187\\-165\\67.38281\\-130.6103\\-165\\71.28906\\-130.5854\\-165\\73.24219\\-130.7049\\-165\\75.19531\\-131.1685\\-165\\77.14844\\-131.3622\\-165\\80.92152\\-131.8984\\-165\\84.96094\\-132.6003\\-165\\88.86719\\-132.946\\-165\\92.77344\\-133.4983\\-165\\96.67969\\-134.4924\\-165\\100.5859\\-135.1858\\-165\\104.4922\\-136.4883\\-165\\106.4453\\-136.9644\\-165\\110.3516\\-138.2899\\-165\\114.2578\\-139.3023\\-165\\116.2109\\-140.022\\-165\\118.1641\\-140.5541\\-165\\120.1172\\-140.9716\\-165\\124.0234\\-142.5744\\-165\\125.9766\\-143.2767\\-165\\127.9297\\-144.3557\\-165\\129.8828\\-145.1282\\-165\\131.8359\\-146.3114\\-165\\133.7891\\-147.0918\\-165\\137.5631\\-149.4766\\-165\\140.5415\\-151.4297\\-165\\141.6016\\-152.2792\\-165\\145.5078\\-155.0381\\-165\\148.0469\\-157.2891\\-165\\151.3672\\-160.5221\\-165\\153.6823\\-163.1484\\-165\\155.2734\\-165.3108\\-165\\157.7981\\-169.0078\\-165\\158.9284\\-170.9609\\-165\\160.1799\\-172.9141\\-165\\161.3069\\-174.8672\\-165\\162.0848\\-176.8203\\-165\\162.7341\\-178.7734\\-165\\163.608\\-180.7266\\-165\\164.1315\\-182.6797\\-165\\164.5477\\-184.6328\\-165\\165.1057\\-186.5859\\-165\\165.8754\\-190.4922\\-165\\166.2099\\-194.3984\\-165\\166.4851\\-198.3047\\-165\\166.6302\\-202.2109\\-165\\166.6439\\-206.1172\\-165\\166.4683\\-210.0234\\-165\\166.0989\\-215.8828\\-165\\165.798\\-219.7891\\-165\\164.7699\\-225.6484\\-165\\164.2103\\-229.5547\\-165\\163.4831\\-233.4609\\-165\\162.7276\\-235.4141\\-165\\162.2106\\-237.3672\\-165\\161.8225\\-239.3203\\-165\\160.2153\\-243.2266\\-165\\159.5741\\-245.1797\\-165\\158.4417\\-247.1328\\-165\\157.7002\\-249.0859\\-165\\156.561\\-251.0391\\-165\\155.8878\\-252.9922\\-165\\154.655\\-254.9453\\-165\\153.6761\\-256.8984\\-165\\153.3203\\-257.317\\-165\\151.3672\\-260.184\\-165\\150.855\\-260.8047\\-165\\149.742\\-262.7578\\-165\\148.4058\\-264.7109\\-165\\146.8963\\-266.6641\\-165\\143.5547\\-270.6868\\-165\\142.1144\\-272.5234\\-165\\139.6484\\-275.0791\\-165\\135.7422\\-278.6692\\-165\\133.7796\\-280.3359\\-165\\131.8359\\-281.7558\\-165\\128.6901\\-284.2422\\-165\\125.9766\\-286.2341\\-165\\122.0703\\-288.8873\\-165\\120.1172\\-289.8972\\-165\\116.2109\\-292.444\\-165\\114.2578\\-293.351\\-165\\112.3047\\-294.4863\\-165\\110.3516\\-295.1248\\-165\\106.4453\\-296.8033\\-165\\104.4922\\-297.4102\\-165\\102.5391\\-298.4052\\-165\\98.63281\\-299.6386\\-165\\96.67969\\-300.3949\\-165\\94.72656\\-300.8209\\-165\\90.82031\\-301.5671\\-165\\88.86719\\-302.1246\\-165\\86.91406\\-302.461\\-165\\83.00781\\-302.7694\\-165\\75.19531\\-303.1282\\-165\\71.28906\\-303.071\\-165\\63.47656\\-302.6097\\-165\\61.52344\\-302.4315\\-165" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.811\\-163\\-81.05469\\-303.1958\\-163\\-86.91406\\-302.6028\\-163\\-88.86719\\-302.2611\\-163\\-92.77344\\-301.1966\\-163\\-96.67969\\-300.3524\\-163\\-98.63281\\-299.5352\\-163\\-102.5391\\-298.1011\\-163\\-104.4922\\-297.0938\\-163\\-106.4453\\-296.446\\-163\\-108.3984\\-295.329\\-163\\-110.3516\\-294.6439\\-163\\-112.3047\\-293.4267\\-163\\-114.2578\\-292.4012\\-163\\-117.4993\\-290.1016\\-163\\-118.1641\\-289.5598\\-163\\-120.1172\\-288.5174\\-163\\-122.0703\\-286.9676\\-163\\-125.9766\\-283.3192\\-163\\-127.2374\\-282.2891\\-163\\-129.8828\\-279.6872\\-163\\-131.046\\-278.3828\\-163\\-134.8503\\-274.4766\\-163\\-136.489\\-272.5234\\-163\\-137.6953\\-270.8145\\-163\\-139.6484\\-268.2672\\-163\\-142.2373\\-264.7109\\-163\\-143.207\\-262.7578\\-163\\-143.5547\\-262.3122\\-163\\-145.5078\\-259.0841\\-163\\-146.7523\\-256.8984\\-163\\-148.0107\\-254.9453\\-163\\-148.7822\\-252.9922\\-163\\-149.9057\\-251.0391\\-163\\-150.6333\\-249.0859\\-163\\-151.7857\\-247.1328\\-163\\-152.5836\\-245.1797\\-163\\-153.6832\\-243.2266\\-163\\-155.1735\\-239.3203\\-163\\-156.0059\\-237.3672\\-163\\-156.4777\\-235.4141\\-163\\-157.3351\\-233.4609\\-163\\-158.0438\\-231.5078\\-163\\-158.6008\\-229.5547\\-163\\-159.5158\\-227.6016\\-163\\-160.5722\\-223.6953\\-163\\-161.315\\-221.7422\\-163\\-161.8304\\-219.7891\\-163\\-162.4042\\-215.8828\\-163\\-162.8059\\-213.9297\\-163\\-163.3478\\-211.9766\\-163\\-163.6963\\-210.0234\\-163\\-163.8892\\-208.0703\\-163\\-164.1555\\-204.1641\\-163\\-164.3163\\-200.2578\\-163\\-164.2333\\-196.3516\\-163\\-163.9326\\-192.4453\\-163\\-163.6801\\-190.4922\\-163\\-163.1851\\-188.5391\\-163\\-162.5551\\-186.5859\\-163\\-161.8189\\-182.6797\\-163\\-161.1328\\-180.873\\-163\\-159.4597\\-176.8203\\-163\\-159.1797\\-176.4461\\-163\\-155.9663\\-170.9609\\-163\\-153.3203\\-167.3031\\-163\\-149.8241\\-163.1484\\-163\\-147.4609\\-160.585\\-163\\-145.5078\\-158.8353\\-163\\-141.3261\\-155.3359\\-163\\-137.6953\\-152.5873\\-163\\-135.7422\\-151.3477\\-163\\-133.7891\\-150.2247\\-163\\-131.8359\\-148.8389\\-163\\-129.8828\\-147.8804\\-163\\-127.9297\\-146.7632\\-163\\-125.9766\\-146.155\\-163\\-124.0234\\-145.0756\\-163\\-122.0703\\-144.431\\-163\\-120.1172\\-143.4178\\-163\\-116.2109\\-141.8834\\-163\\-114.2578\\-141.0071\\-163\\-112.3047\\-140.4934\\-163\\-110.3516\\-139.857\\-163\\-108.3984\\-139.0831\\-163\\-106.4453\\-138.6786\\-163\\-104.4922\\-138.1417\\-163\\-102.5391\\-137.2753\\-163\\-98.63281\\-136.2042\\-163\\-96.67969\\-135.3932\\-163\\-92.77344\\-134.4806\\-163\\-88.86719\\-133.2798\\-163\\-86.91406\\-132.9643\\-163\\-83.00781\\-132.5232\\-163\\-79.10156\\-131.6475\\-163\\-77.14844\\-131.2814\\-163\\-75.19531\\-131.0973\\-163\\-71.28906\\-130.8608\\-163\\-67.38281\\-130.7679\\-163\\-63.47656\\-130.7926\\-163\\-57.61719\\-131.058\\-163\\-55.66406\\-131.2251\\-163\\-53.71094\\-131.5166\\-163\\-51.75781\\-132.0952\\-163\\-49.80469\\-132.5155\\-163\\-45.89844\\-133.0691\\-163\\-43.94531\\-133.5965\\-163\\-41.99219\\-134.4763\\-163\\-40.03906\\-135.096\\-163\\-38.08594\\-136.1004\\-163\\-36.13281\\-136.9184\\-163\\-34.17969\\-138.0858\\-163\\-32.22656\\-139.0621\\-163\\-30.27344\\-140.4566\\-163\\-28.73283\\-141.6641\\-163\\-26.66708\\-143.6172\\-163\\-22.46094\\-147.9066\\-163\\-19.61946\\-151.4297\\-163\\-18.47141\\-153.3828\\-163\\-17.48101\\-155.3359\\-163\\-16.33708\\-157.2891\\-163\\-13.9719\\-163.1484\\-163\\-13.0598\\-167.0547\\-163\\-12.34209\\-169.0078\\-163\\-11.95427\\-170.9609\\-163\\-11.18665\\-178.7734\\-163\\-10.32624\\-182.6797\\-163\\-10.09971\\-184.6328\\-163\\-9.871572\\-188.5391\\-163\\-9.513775\\-192.4453\\-163\\-9.396575\\-194.3984\\-163\\-9.289109\\-198.3047\\-163\\-9.140115\\-206.1172\\-163\\-9.078664\\-211.9766\\-163\\-9.355918\\-217.8359\\-163\\-9.473179\\-221.7422\\-163\\-9.950508\\-229.5547\\-163\\-10.18025\\-231.5078\\-163\\-10.5806\\-233.4609\\-163\\-11.14695\\-235.4141\\-163\\-11.46376\\-237.3672\\-163\\-11.95427\\-241.2734\\-163\\-12.37916\\-243.2266\\-163\\-13.07091\\-245.1797\\-163\\-13.83846\\-249.0859\\-163\\-14.29036\\-251.0391\\-163\\-15.06958\\-252.9922\\-163\\-16.27604\\-256.8984\\-163\\-17.27598\\-258.8516\\-163\\-17.83539\\-260.8047\\-163\\-18.91043\\-262.7578\\-163\\-20.26013\\-266.6641\\-163\\-22.46094\\-270.7345\\-163\\-24.41406\\-274.1271\\-163\\-24.69829\\-274.4766\\-163\\-25.6633\\-276.4297\\-163\\-26.93899\\-278.3828\\-163\\-28.02459\\-280.3359\\-163\\-29.54889\\-282.2891\\-163\\-31.21405\\-284.2422\\-163\\-34.17969\\-288.0341\\-163\\-38.08594\\-291.9826\\-163\\-40.17857\\-294.0078\\-163\\-41.99219\\-295.2055\\-163\\-43.94531\\-296.6683\\-163\\-45.89844\\-297.9368\\-163\\-49.80469\\-300.2277\\-163\\-53.71094\\-301.5138\\-163\\-55.66406\\-302.3186\\-163\\-57.61719\\-302.7065\\-163\\-59.57031\\-302.98\\-163\\-65.42969\\-304.044\\-163\\-67.38281\\-304.2081\\-163\\-69.33594\\-304.2617\\-163\\-73.24219\\-304.1894\\-163\\-75.19531\\-304.0664\\-163" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "180" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.1646\\-163\\57.61719\\-301.5138\\-163\\53.71094\\-300.4924\\-163\\51.75781\\-299.5151\\-163\\49.80469\\-298.6384\\-163\\47.85156\\-297.3659\\-163\\45.89844\\-296.403\\-163\\42.28899\\-294.0078\\-163\\40.03906\\-292.4141\\-163\\36.13281\\-288.8605\\-163\\33.47736\\-286.1953\\-163\\31.83741\\-284.2422\\-163\\30.27344\\-282.2455\\-163\\27.34375\\-278.3828\\-163\\26.02466\\-276.4297\\-163\\25.02359\\-274.4766\\-163\\24.41406\\-273.7382\\-163\\22.40753\\-270.5703\\-163\\20.29803\\-266.6641\\-163\\19.61411\\-264.7109\\-163\\19.07854\\-262.7578\\-163\\18.12275\\-260.8047\\-163\\17.17169\\-256.8984\\-163\\16.33103\\-254.9453\\-163\\15.19739\\-251.0391\\-163\\14.28553\\-249.0859\\-163\\13.77589\\-247.1328\\-163\\12.86677\\-243.2266\\-163\\12.24002\\-241.2734\\-163\\11.89732\\-239.3203\\-163\\11.30281\\-233.4609\\-163\\10.36516\\-229.5547\\-163\\9.973204\\-225.6484\\-163\\9.61691\\-219.7891\\-163\\9.160156\\-213.9297\\-163\\8.942106\\-211.9766\\-163\\8.842889\\-210.0234\\-163\\8.766352\\-206.1172\\-163\\8.781433\\-204.1641\\-163\\8.926505\\-200.2578\\-163\\9.306408\\-194.3984\\-163\\9.522749\\-188.5391\\-163\\9.775061\\-184.6328\\-163\\10.2285\\-178.7734\\-163\\10.53049\\-176.8203\\-163\\11.02218\\-174.8672\\-163\\11.39884\\-172.9141\\-163\\12.03435\\-169.0078\\-163\\13.44883\\-165.1016\\-163\\13.92917\\-163.1484\\-163\\15.71038\\-159.2422\\-163\\16.87168\\-157.2891\\-163\\17.88364\\-155.3359\\-163\\19.1945\\-153.3828\\-163\\20.40375\\-151.4297\\-163\\21.92993\\-149.4766\\-163\\24.41406\\-146.7695\\-163\\27.80512\\-143.6172\\-163\\30.27344\\-141.6085\\-163\\34.17969\\-138.9754\\-163\\36.13281\\-138.0544\\-163\\38.08594\\-136.8666\\-163\\40.12451\\-135.8047\\-163\\41.99219\\-134.9837\\-163\\43.94531\\-134.3631\\-163\\45.89844\\-133.4371\\-163\\47.85156\\-132.9775\\-163\\51.75781\\-132.3669\\-163\\53.71094\\-131.7891\\-163\\55.66406\\-131.3509\\-163\\59.57031\\-130.9421\\-163\\63.47656\\-130.6994\\-163\\67.38281\\-130.5829\\-163\\71.28906\\-130.6301\\-163\\73.24219\\-130.7438\\-163\\75.19531\\-131.0421\\-163\\79.10156\\-131.3788\\-163\\81.05469\\-131.6015\\-163\\84.96094\\-132.4755\\-163\\90.82031\\-133.0642\\-163\\92.77344\\-133.3533\\-163\\94.72656\\-133.7663\\-163\\96.67969\\-134.33\\-163\\100.5859\\-135.0439\\-163\\102.5391\\-135.5323\\-163\\104.4922\\-136.3022\\-163\\108.3984\\-137.3463\\-163\\110.3516\\-138.1442\\-163\\112.3047\\-138.7057\\-163\\114.2578\\-139.062\\-163\\118.1641\\-140.3851\\-163\\120.1172\\-140.811\\-163\\122.0703\\-141.4952\\-163\\124.0234\\-142.3979\\-163\\125.9766\\-143.0798\\-163\\127.9297\\-144.1725\\-163\\129.8828\\-144.9012\\-163\\131.8359\\-146.0514\\-163\\133.7891\\-146.8353\\-163\\135.7422\\-148.1039\\-163\\137.6953\\-149.1487\\-163\\139.6484\\-150.622\\-163\\140.8936\\-151.4297\\-163\\141.6016\\-152.0544\\-163\\143.5547\\-153.3743\\-163\\145.5078\\-154.8062\\-163\\148.32\\-157.2891\\-163\\151.3672\\-160.2911\\-163\\153.905\\-163.1484\\-163\\155.4255\\-165.1016\\-163\\156.6476\\-167.0547\\-163\\157.2266\\-167.7595\\-163\\159.1797\\-170.8389\\-163\\161.522\\-174.8672\\-163\\162.2354\\-176.8203\\-163\\163.8224\\-180.7266\\-163\\164.2765\\-182.6797\\-163\\165.4644\\-186.5859\\-163\\166.0004\\-190.4922\\-163\\166.4265\\-194.3984\\-163\\166.923\\-200.2578\\-163\\167.0588\\-204.1641\\-163\\167.0298\\-206.1172\\-163\\166.8181\\-210.0234\\-163\\166.3392\\-215.8828\\-163\\165.7986\\-221.7422\\-163\\165.5587\\-223.6953\\-163\\165.2135\\-225.6484\\-163\\164.7044\\-227.6016\\-163\\163.6311\\-233.4609\\-163\\162.8698\\-235.4141\\-163\\162.2962\\-237.3672\\-163\\161.9177\\-239.3203\\-163\\161.202\\-241.2734\\-163\\160.3328\\-243.2266\\-163\\159.677\\-245.1797\\-163\\158.5305\\-247.1328\\-163\\157.7919\\-249.0859\\-163\\156.6115\\-251.0391\\-163\\155.9476\\-252.9922\\-163\\154.7126\\-254.9453\\-163\\153.7685\\-256.8984\\-163\\153.3203\\-257.4483\\-163\\151.3672\\-260.3417\\-163\\150.978\\-260.8047\\-163\\149.8504\\-262.7578\\-163\\147.4609\\-266.0663\\-163\\145.5078\\-268.4753\\-163\\143.5547\\-270.7864\\-163\\142.1724\\-272.5234\\-163\\139.6484\\-275.1344\\-163\\138.2025\\-276.4297\\-163\\135.7422\\-278.7921\\-163\\133.7891\\-280.51\\-163\\131.8359\\-281.8464\\-163\\128.8354\\-284.2422\\-163\\125.9766\\-286.4272\\-163\\124.0234\\-287.6534\\-163\\122.0703\\-288.981\\-163\\118.1641\\-291.2153\\-163\\116.2109\\-292.5703\\-163\\114.2578\\-293.4524\\-163\\112.3047\\-294.5938\\-163\\110.3516\\-295.2007\\-163\\108.3984\\-296.1459\\-163\\104.4922\\-297.5247\\-163\\102.5391\\-298.5121\\-163\\100.5859\\-299.0721\\-163\\98.54562\\-299.8672\\-163\\96.67969\\-300.4929\\-163\\92.77344\\-301.2433\\-163\\88.86719\\-302.2012\\-163\\86.91406\\-302.53\\-163\\84.96094\\-302.689\\-163\\79.10156\\-303.0133\\-163\\75.19531\\-303.172\\-163\\73.24219\\-303.1958\\-163\\69.33594\\-303.0637\\-163\\63.47656\\-302.7003\\-163\\61.52344\\-302.5222\\-163" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.8682\\-161\\-81.05469\\-303.2424\\-161\\-86.91406\\-302.6466\\-161\\-88.86719\\-302.3477\\-161\\-92.77344\\-301.293\\-161\\-96.67969\\-300.465\\-161\\-102.5391\\-298.2606\\-161\\-104.4922\\-297.1845\\-161\\-106.4453\\-296.553\\-161\\-108.3984\\-295.4361\\-161\\-110.3516\\-294.7198\\-161\\-112.3047\\-293.5164\\-161\\-114.2578\\-292.492\\-161\\-117.57\\-290.1016\\-161\\-118.1641\\-289.603\\-161\\-120.1172\\-288.577\\-161\\-122.0703\\-287.0459\\-161\\-125.9766\\-283.3854\\-161\\-127.4063\\-282.2891\\-161\\-129.8828\\-279.8858\\-161\\-131.2188\\-278.3828\\-161\\-133.1357\\-276.4297\\-161\\-134.9438\\-274.4766\\-161\\-136.5819\\-272.5234\\-161\\-139.6484\\-268.538\\-161\\-142.3815\\-264.7109\\-161\\-143.4026\\-262.7578\\-161\\-144.6006\\-260.8047\\-161\\-145.9227\\-258.8516\\-161\\-146.9534\\-256.8984\\-161\\-148.1841\\-254.9453\\-161\\-148.9702\\-252.9922\\-161\\-150.1169\\-251.0391\\-161\\-150.8494\\-249.0859\\-161\\-152.031\\-247.1328\\-161\\-152.8258\\-245.1797\\-161\\-153.9208\\-243.2266\\-161\\-154.5874\\-241.2734\\-161\\-155.5304\\-239.3203\\-161\\-156.1726\\-237.3672\\-161\\-156.6992\\-235.4141\\-161\\-157.6613\\-233.4609\\-161\\-158.2391\\-231.5078\\-161\\-158.9373\\-229.5547\\-161\\-159.7744\\-227.6016\\-161\\-160.8646\\-223.6953\\-161\\-161.5982\\-221.7422\\-161\\-162.0094\\-219.7891\\-161\\-162.6143\\-215.8828\\-161\\-163.1995\\-213.9297\\-161\\-163.6431\\-211.9766\\-161\\-163.883\\-210.0234\\-161\\-164.2314\\-206.1172\\-161\\-164.5146\\-202.2109\\-161\\-164.5917\\-198.3047\\-161\\-164.3204\\-194.3984\\-161\\-163.9147\\-190.4922\\-161\\-163.568\\-188.5391\\-161\\-162.9118\\-186.5859\\-161\\-162.3706\\-184.6328\\-161\\-162.0255\\-182.6797\\-161\\-161.4746\\-180.7266\\-161\\-160.5164\\-178.7734\\-161\\-159.782\\-176.8203\\-161\\-158.5032\\-174.8672\\-161\\-157.4288\\-172.9141\\-161\\-156.1862\\-170.9609\\-161\\-154.7654\\-169.0078\\-161\\-153.4641\\-167.0547\\-161\\-150.0583\\-163.1484\\-161\\-147.4609\\-160.3988\\-161\\-145.5078\\-158.6301\\-161\\-141.6016\\-155.2817\\-161\\-137.6953\\-152.4318\\-161\\-135.7422\\-151.1174\\-161\\-133.7891\\-150.0442\\-161\\-131.8359\\-148.6964\\-161\\-127.9297\\-146.6561\\-161\\-125.9766\\-146.0142\\-161\\-124.0234\\-144.9456\\-161\\-122.0703\\-144.3131\\-161\\-120.1172\\-143.2402\\-161\\-118.1641\\-142.5279\\-161\\-114.2578\\-140.9026\\-161\\-112.3047\\-140.3808\\-161\\-108.3984\\-138.962\\-161\\-106.4453\\-138.5716\\-161\\-104.4922\\-137.9016\\-161\\-102.5391\\-137.098\\-161\\-100.5859\\-136.6141\\-161\\-96.67969\\-135.2007\\-161\\-92.77344\\-134.2805\\-161\\-90.82031\\-133.6002\\-161\\-88.86719\\-133.1408\\-161\\-84.96094\\-132.6762\\-161\\-83.00781\\-132.3705\\-161\\-81.05469\\-131.8459\\-161\\-77.14844\\-131.1823\\-161\\-73.24219\\-130.8752\\-161\\-69.33594\\-130.7158\\-161\\-63.47656\\-130.7314\\-161\\-59.57031\\-130.8845\\-161\\-55.66406\\-131.1514\\-161\\-53.71094\\-131.4043\\-161\\-49.80469\\-132.418\\-161\\-45.89844\\-133.0136\\-161\\-43.94531\\-133.4819\\-161\\-41.99219\\-134.3906\\-161\\-40.03906\\-135.0334\\-161\\-36.13281\\-136.8763\\-161\\-34.17969\\-137.9925\\-161\\-32.22656\\-138.9622\\-161\\-28.49212\\-141.6641\\-161\\-26.44231\\-143.6172\\-161\\-22.46094\\-147.7656\\-161\\-19.55645\\-151.4297\\-161\\-18.31055\\-153.3828\\-161\\-17.37723\\-155.3359\\-161\\-16.20206\\-157.2891\\-161\\-15.44596\\-159.2422\\-161\\-14.58135\\-161.1953\\-161\\-13.94087\\-163.1484\\-161\\-12.98757\\-167.0547\\-161\\-12.25322\\-169.0078\\-161\\-11.89076\\-170.9609\\-161\\-11.31766\\-176.8203\\-161\\-11.04526\\-178.7734\\-161\\-10.20397\\-182.6797\\-161\\-10.00855\\-184.6328\\-161\\-9.784138\\-188.5391\\-161\\-9.496942\\-192.4453\\-161\\-9.384246\\-196.3516\\-161\\-9.349575\\-202.2109\\-161\\-9.185987\\-208.0703\\-161\\-9.188565\\-213.9297\\-161\\-9.38707\\-217.8359\\-161\\-9.52657\\-221.7422\\-161\\-9.862439\\-225.6484\\-161\\-9.863281\\-227.6016\\-161\\-10.2285\\-231.5078\\-161\\-11.2087\\-235.4141\\-161\\-12.00701\\-241.2734\\-161\\-12.52254\\-243.2266\\-161\\-13.1638\\-245.1797\\-161\\-13.88442\\-249.0859\\-161\\-14.32512\\-251.0391\\-161\\-15.11261\\-252.9922\\-161\\-15.72414\\-254.9453\\-161\\-16.46613\\-256.8984\\-161\\-17.38178\\-258.8516\\-161\\-17.95069\\-260.8047\\-161\\-19.02636\\-262.7578\\-161\\-19.62595\\-264.7109\\-161\\-20.43915\\-266.6641\\-161\\-21.46792\\-268.6172\\-161\\-24.41406\\-273.863\\-161\\-24.89224\\-274.4766\\-161\\-25.78922\\-276.4297\\-161\\-27.07351\\-278.3828\\-161\\-28.22414\\-280.3359\\-161\\-29.65431\\-282.2891\\-161\\-32.86683\\-286.1953\\-161\\-34.17969\\-287.9343\\-161\\-36.13281\\-289.8998\\-161\\-38.08594\\-291.9821\\-161\\-40.12277\\-294.0078\\-161\\-41.99219\\-295.2423\\-161\\-43.94531\\-296.7361\\-161\\-45.89844\\-298.0638\\-161\\-49.80469\\-300.3271\\-161\\-53.71094\\-301.6041\\-161\\-55.66406\\-302.37\\-161\\-59.57031\\-303.027\\-161\\-63.47656\\-303.7961\\-161\\-65.42969\\-304.1095\\-161\\-69.33594\\-304.2871\\-161\\-73.24219\\-304.2264\\-161\\-75.19531\\-304.12\\-161" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.2369\\-161\\57.61719\\-301.5927\\-161\\53.71094\\-300.5748\\-161\\49.80469\\-298.7261\\-161\\47.85156\\-297.4852\\-161\\45.89844\\-296.5217\\-161\\43.94531\\-295.1913\\-161\\42.04413\\-294.0078\\-161\\40.03906\\-292.5462\\-161\\35.2382\\-288.1484\\-161\\33.35286\\-286.1953\\-161\\30.16076\\-282.2891\\-161\\28.32031\\-279.8561\\-161\\25.91378\\-276.4297\\-161\\24.91259\\-274.4766\\-161\\24.41406\\-273.897\\-161\\22.22909\\-270.5703\\-161\\21.29245\\-268.6172\\-161\\20.18458\\-266.6641\\-161\\19.01307\\-262.7578\\-161\\18.01934\\-260.8047\\-161\\16.98589\\-256.8984\\-161\\16.11328\\-254.9453\\-161\\15.63965\\-252.9922\\-161\\15.03276\\-251.0391\\-161\\14.15094\\-249.0859\\-161\\13.29385\\-245.1797\\-161\\12.13458\\-241.2734\\-161\\11.84353\\-239.3203\\-161\\11.43895\\-235.4141\\-161\\11.11577\\-233.4609\\-161\\10.59358\\-231.5078\\-161\\10.21205\\-229.5547\\-161\\10.02441\\-227.6016\\-161\\9.494067\\-219.7891\\-161\\9.173388\\-215.8828\\-161\\8.766352\\-211.9766\\-161\\8.640455\\-210.0234\\-161\\8.57736\\-204.1641\\-161\\8.751502\\-200.2578\\-161\\9.25948\\-194.3984\\-161\\9.539103\\-188.5391\\-161\\10.23687\\-178.7734\\-161\\10.51839\\-176.8203\\-161\\11.0338\\-174.8672\\-161\\11.41357\\-172.9141\\-161\\12.03435\\-169.0078\\-161\\13.40942\\-165.1016\\-161\\13.88239\\-163.1484\\-161\\14.64844\\-161.2671\\-161\\15.66256\\-159.2422\\-161\\16.79402\\-157.2891\\-161\\17.79812\\-155.3359\\-161\\19.1215\\-153.3828\\-161\\20.31558\\-151.4297\\-161\\21.80364\\-149.4766\\-161\\24.41406\\-146.6593\\-161\\27.6331\\-143.6172\\-161\\30.27344\\-141.4127\\-161\\34.17969\\-138.8662\\-161\\39.75866\\-135.8047\\-161\\40.03906\\-135.6053\\-161\\43.94531\\-134.1232\\-161\\45.89844\\-133.2591\\-161\\49.80469\\-132.5679\\-161\\51.75781\\-132.1261\\-161\\53.71094\\-131.537\\-161\\55.66406\\-131.1943\\-161\\59.57031\\-130.8532\\-161\\61.52344\\-130.8174\\-161\\65.42969\\-130.5647\\-161\\67.38281\\-130.5571\\-161\\71.28906\\-130.7019\\-161\\79.10156\\-131.2352\\-161\\81.05469\\-131.4399\\-161\\83.00781\\-131.8313\\-161\\84.96094\\-132.3435\\-161\\86.91406\\-132.6146\\-161\\90.82031\\-132.9709\\-161\\92.77344\\-133.2152\\-161\\94.72656\\-133.5593\\-161\\96.67969\\-134.1417\\-161\\98.63281\\-134.5782\\-161\\102.5391\\-135.3134\\-161\\104.4922\\-136.071\\-161\\106.4453\\-136.6578\\-161\\108.3984\\-137.1348\\-161\\110.3516\\-137.9051\\-161\\112.3047\\-138.5678\\-161\\114.2578\\-138.9167\\-161\\116.2109\\-139.4267\\-161\\118.1641\\-140.2026\\-161\\120.1172\\-140.6816\\-161\\122.0703\\-141.2721\\-161\\124.0234\\-142.2195\\-161\\125.9766\\-142.9173\\-161\\127.9297\\-143.945\\-161\\129.8828\\-144.7158\\-161\\131.8359\\-145.7641\\-161\\133.7891\\-146.6618\\-161\\135.7422\\-147.8245\\-161\\137.6953\\-148.877\\-161\\141.6016\\-151.7969\\-161\\143.5547\\-153.0829\\-161\\145.5078\\-154.5736\\-161\\148.5021\\-157.2891\\-161\\151.3672\\-160.1254\\-161\\154.1451\\-163.1484\\-161\\155.6858\\-165.1016\\-161\\156.8585\\-167.0547\\-161\\157.2266\\-167.4897\\-161\\159.1797\\-170.5548\\-161\\159.5123\\-170.9609\\-161\\160.4701\\-172.9141\\-161\\161.656\\-174.8672\\-161\\162.3403\\-176.8203\\-161\\163.2709\\-178.7734\\-161\\163.9192\\-180.7266\\-161\\164.3823\\-182.6797\\-161\\165.0618\\-184.6328\\-161\\165.5963\\-186.5859\\-161\\166.58\\-194.3984\\-161\\166.9843\\-198.3047\\-161\\167.1276\\-200.2578\\-161\\167.2664\\-204.1641\\-161\\167.1805\\-208.0703\\-161\\167.0869\\-210.0234\\-161\\165.7195\\-223.6953\\-161\\165.4061\\-225.6484\\-161\\164.4129\\-229.5547\\-161\\163.6847\\-233.4609\\-161\\162.3352\\-237.3672\\-161\\161.9605\\-239.3203\\-161\\161.2882\\-241.2734\\-161\\160.3933\\-243.2266\\-161\\159.715\\-245.1797\\-161\\158.565\\-247.1328\\-161\\157.8193\\-249.0859\\-161\\156.6202\\-251.0391\\-161\\155.9602\\-252.9922\\-161\\154.7486\\-254.9453\\-161\\153.792\\-256.8984\\-161\\153.3203\\-257.4911\\-161\\151.3672\\-260.4192\\-161\\151.0392\\-260.8047\\-161\\149.8956\\-262.7578\\-161\\147.4609\\-266.0951\\-161\\142.1724\\-272.5234\\-161\\139.6484\\-275.1253\\-161\\138.1797\\-276.4297\\-161\\135.7422\\-278.7951\\-161\\133.7891\\-280.5388\\-161\\131.8359\\-281.8941\\-161\\128.9063\\-284.2422\\-161\\125.9766\\-286.5231\\-161\\122.0703\\-289.0323\\-161\\118.1641\\-291.2612\\-161\\116.2109\\-292.6323\\-161\\114.2578\\-293.5227\\-161\\112.3047\\-294.6526\\-161\\110.3516\\-295.249\\-161\\108.3984\\-296.2369\\-161\\104.4922\\-297.6301\\-161\\102.5391\\-298.5848\\-161\\100.5859\\-299.1485\\-161\\98.63281\\-299.9634\\-161\\96.67969\\-300.5548\\-161\\92.77344\\-301.293\\-161\\88.86719\\-302.2611\\-161\\86.91406\\-302.5646\\-161\\83.00781\\-302.84\\-161\\75.19531\\-303.2128\\-161\\71.28906\\-303.2302\\-161\\69.33594\\-303.144\\-161\\63.47656\\-302.7522\\-161\\61.52344\\-302.5765\\-161" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "181" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.9221\\-159\\-81.05469\\-303.2914\\-159\\-83.00781\\-303.0565\\-159\\-86.91406\\-302.689\\-159\\-88.86719\\-302.4139\\-159\\-92.77344\\-301.3619\\-159\\-96.67969\\-300.5589\\-159\\-98.63281\\-299.8903\\-159\\-100.5859\\-299.0534\\-159\\-102.5391\\-298.3877\\-159\\-104.4922\\-297.269\\-159\\-106.4453\\-296.6257\\-159\\-108.3984\\-295.5277\\-159\\-110.3516\\-294.7928\\-159\\-112.3047\\-293.5874\\-159\\-114.2578\\-292.5604\\-159\\-118.1641\\-289.6621\\-159\\-120.1172\\-288.6367\\-159\\-122.0703\\-287.0894\\-159\\-125.9766\\-283.5002\\-159\\-127.493\\-282.2891\\-159\\-129.8828\\-279.9815\\-159\\-131.3194\\-278.3828\\-159\\-133.2545\\-276.4297\\-159\\-135.7422\\-273.6875\\-159\\-137.6953\\-271.1719\\-159\\-139.8161\\-268.6172\\-159\\-141.1036\\-266.6641\\-159\\-142.5093\\-264.7109\\-159\\-144.7397\\-260.8047\\-159\\-146.103\\-258.8516\\-159\\-148.3392\\-254.9453\\-159\\-149.2233\\-252.9922\\-159\\-150.2708\\-251.0391\\-159\\-151.1361\\-249.0859\\-159\\-152.237\\-247.1328\\-159\\-154.1051\\-243.2266\\-159\\-154.7985\\-241.2734\\-159\\-155.785\\-239.3203\\-159\\-156.3155\\-237.3672\\-159\\-156.9843\\-235.4141\\-159\\-157.8829\\-233.4609\\-159\\-158.4432\\-231.5078\\-159\\-159.3541\\-229.5547\\-159\\-160.5067\\-225.6484\\-159\\-161.2312\\-223.6953\\-159\\-161.7942\\-221.7422\\-159\\-162.4453\\-217.8359\\-159\\-162.9132\\-215.8828\\-159\\-163.5164\\-213.9297\\-159\\-163.8318\\-211.9766\\-159\\-164.2589\\-208.0703\\-159\\-164.8452\\-202.2109\\-159\\-164.9558\\-198.3047\\-159\\-164.3638\\-192.4453\\-159\\-163.8156\\-188.5391\\-159\\-163.3599\\-186.5859\\-159\\-162.611\\-184.6328\\-159\\-161.7479\\-180.7266\\-159\\-160.0018\\-176.8203\\-159\\-157.7272\\-172.9141\\-159\\-155.0038\\-169.0078\\-159\\-153.7598\\-167.0547\\-159\\-149.4141\\-162.2509\\-159\\-147.4609\\-160.2391\\-159\\-141.6016\\-155.0009\\-159\\-139.6484\\-153.7411\\-159\\-135.7422\\-150.9477\\-159\\-133.7891\\-149.8552\\-159\\-131.8359\\-148.5705\\-159\\-129.8828\\-147.4679\\-159\\-127.9297\\-146.565\\-159\\-125.9766\\-145.8293\\-159\\-124.0234\\-144.8277\\-159\\-122.0703\\-144.1884\\-159\\-120.1172\\-143.1035\\-159\\-118.1641\\-142.402\\-159\\-116.2109\\-141.4603\\-159\\-114.2578\\-140.7915\\-159\\-112.3047\\-140.2477\\-159\\-110.3516\\-139.4267\\-159\\-108.3984\\-138.8681\\-159\\-106.4453\\-138.4537\\-159\\-104.4922\\-137.6357\\-159\\-102.5391\\-136.9653\\-159\\-100.5859\\-136.4576\\-159\\-98.63281\\-135.6177\\-159\\-96.67969\\-135.0655\\-159\\-94.72656\\-134.6181\\-159\\-92.77344\\-134.0629\\-159\\-90.82031\\-133.4034\\-159\\-88.86719\\-133.0378\\-159\\-84.96094\\-132.5985\\-159\\-83.00781\\-132.2378\\-159\\-81.05469\\-131.6837\\-159\\-77.14844\\-131.1201\\-159\\-75.19531\\-130.9451\\-159\\-71.28906\\-130.7137\\-159\\-67.38281\\-130.6289\\-159\\-63.47656\\-130.6853\\-159\\-59.57031\\-130.8266\\-159\\-55.66406\\-131.1012\\-159\\-53.71094\\-131.3114\\-159\\-51.75781\\-131.762\\-159\\-49.80469\\-132.3244\\-159\\-45.89844\\-132.9654\\-159\\-43.94531\\-133.3836\\-159\\-41.99219\\-134.3201\\-159\\-40.03906\\-134.9826\\-159\\-38.19719\\-135.8047\\-159\\-36.13281\\-136.8432\\-159\\-34.17969\\-137.9774\\-159\\-32.22656\\-138.9464\\-159\\-28.38604\\-141.6641\\-159\\-26.25775\\-143.6172\\-159\\-22.46094\\-147.7378\\-159\\-19.55645\\-151.4297\\-159\\-18.27272\\-153.3828\\-159\\-17.35233\\-155.3359\\-159\\-16.14092\\-157.2891\\-159\\-15.41103\\-159.2422\\-159\\-14.55226\\-161.1953\\-159\\-13.92183\\-163.1484\\-159\\-12.96099\\-167.0547\\-159\\-12.22997\\-169.0078\\-159\\-11.87785\\-170.9609\\-159\\-11.25458\\-176.8203\\-159\\-10.46036\\-180.7266\\-159\\-10.12074\\-182.6797\\-159\\-9.943182\\-184.6328\\-159\\-9.703998\\-188.5391\\-159\\-9.520206\\-192.4453\\-159\\-9.463103\\-196.3516\\-159\\-9.512247\\-202.2109\\-159\\-9.309506\\-208.0703\\-159\\-9.358724\\-210.0234\\-159\\-9.265287\\-213.9297\\-159\\-9.479929\\-219.7891\\-159\\-9.90576\\-225.6484\\-159\\-9.928386\\-227.6016\\-159\\-10.36516\\-231.5078\\-159\\-10.88066\\-233.4609\\-159\\-11.29597\\-235.4141\\-159\\-11.80413\\-239.3203\\-159\\-12.10814\\-241.2734\\-159\\-12.75044\\-243.2266\\-159\\-13.28891\\-245.1797\\-159\\-13.96833\\-249.0859\\-159\\-14.44615\\-251.0391\\-159\\-15.26019\\-252.9922\\-159\\-15.84371\\-254.9453\\-159\\-16.72454\\-256.8984\\-159\\-17.49342\\-258.8516\\-159\\-18.11023\\-260.8047\\-159\\-19.16105\\-262.7578\\-159\\-19.72297\\-264.7109\\-159\\-21.58746\\-268.6172\\-159\\-22.78426\\-270.5703\\-159\\-23.74752\\-272.5234\\-159\\-25.03319\\-274.4766\\-159\\-25.90315\\-276.4297\\-159\\-28.32031\\-280.1747\\-159\\-29.77856\\-282.2891\\-159\\-32.96371\\-286.1953\\-159\\-34.17969\\-287.8201\\-159\\-36.13281\\-289.8125\\-159\\-38.08594\\-291.9498\\-159\\-40.10417\\-294.0078\\-159\\-41.99219\\-295.2625\\-159\\-43.94531\\-296.7989\\-159\\-45.89844\\-298.1548\\-159\\-47.85156\\-299.2102\\-159\\-49.80469\\-300.3835\\-159\\-51.75781\\-300.9875\\-159\\-55.66406\\-302.4315\\-159\\-59.57031\\-303.0669\\-159\\-63.47656\\-303.8682\\-159\\-65.42969\\-304.1404\\-159\\-69.33594\\-304.3196\\-159\\-73.24219\\-304.2531\\-159\\-75.19531\\-304.1404\\-159" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "163" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.3053\\-159\\57.61719\\-301.6754\\-159\\53.71094\\-300.6357\\-159\\49.80469\\-298.7956\\-159\\47.85156\\-297.6002\\-159\\45.89844\\-296.6181\\-159\\43.94531\\-295.2728\\-159\\41.99219\\-294.1528\\-159\\40.03906\\-292.6522\\-159\\35.12186\\-288.1484\\-159\\33.26095\\-286.1953\\-159\\30.03294\\-282.2891\\-159\\28.32031\\-279.9959\\-159\\25.81202\\-276.4297\\-159\\24.79186\\-274.4766\\-159\\24.41406\\-274.0453\\-159\\22.46094\\-270.9819\\-159\\22.12213\\-270.5703\\-159\\21.23442\\-268.6172\\-159\\20.10257\\-266.6641\\-159\\18.94395\\-262.7578\\-159\\17.92769\\-260.8047\\-159\\17.43214\\-258.8516\\-159\\16.75236\\-256.8984\\-159\\15.96264\\-254.9453\\-159\\15.50603\\-252.9922\\-159\\14.86314\\-251.0391\\-159\\14.06371\\-249.0859\\-159\\13.22266\\-245.1797\\-159\\12.57997\\-243.2266\\-159\\12.0503\\-241.2734\\-159\\11.34536\\-235.4141\\-159\\10.9489\\-233.4609\\-159\\10.41667\\-231.5078\\-159\\10.10665\\-229.5547\\-159\\9.253231\\-217.8359\\-159\\8.640455\\-211.9766\\-159\\8.553341\\-210.0234\\-159\\8.4851\\-204.1641\\-159\\8.627473\\-200.2578\\-159\\9.193372\\-194.3984\\-159\\10.24534\\-178.7734\\-159\\10.54275\\-176.8203\\-159\\11.13669\\-174.8672\\-159\\12.07886\\-169.0078\\-159\\13.38935\\-165.1016\\-159\\13.84523\\-163.1484\\-159\\14.62555\\-161.1953\\-159\\15.61433\\-159.2422\\-159\\17.73999\\-155.3359\\-159\\19.06389\\-153.3828\\-159\\20.21708\\-151.4297\\-159\\21.736\\-149.4766\\-159\\24.41406\\-146.5746\\-159\\28.32031\\-142.8973\\-159\\30.27344\\-141.2858\\-159\\32.631\\-139.7109\\-159\\36.13281\\-137.6485\\-159\\38.08594\\-136.6378\\-159\\40.03906\\-135.4559\\-159\\41.99219\\-134.756\\-159\\45.89844\\-133.1487\\-159\\49.80469\\-132.4317\\-159\\51.75781\\-131.8313\\-159\\53.71094\\-131.3509\\-159\\55.66406\\-131.0521\\-159\\59.57031\\-130.7574\\-159\\61.52344\\-130.7318\\-159\\65.42969\\-130.5346\\-159\\67.38281\\-130.5267\\-159\\71.28906\\-130.6945\\-159\\75.19531\\-130.9122\\-159\\79.10156\\-131.185\\-159\\81.05469\\-131.3704\\-159\\83.00781\\-131.6715\\-159\\84.96094\\-132.2005\\-159\\86.91406\\-132.5515\\-159\\92.77344\\-133.113\\-159\\94.72656\\-133.4034\\-159\\98.63281\\-134.435\\-159\\102.5391\\-135.1777\\-159\\106.4453\\-136.4944\\-159\\108.3984\\-136.9413\\-159\\110.3516\\-137.5708\\-159\\112.3047\\-138.4068\\-159\\116.2109\\-139.243\\-159\\118.1641\\-140.0317\\-159\\122.0703\\-141.114\\-159\\124.0234\\-142.0376\\-159\\125.9766\\-142.7733\\-159\\131.8359\\-145.4688\\-159\\133.7891\\-146.5667\\-159\\135.7422\\-147.4988\\-159\\137.6953\\-148.6896\\-159\\139.6484\\-150.1799\\-159\\143.5547\\-152.8521\\-159\\145.5078\\-154.4026\\-159\\148.6656\\-157.2891\\-159\\153.3203\\-161.993\\-159\\155.8676\\-165.1016\\-159\\158.352\\-169.0078\\-159\\159.7106\\-170.9609\\-159\\160.691\\-172.9141\\-159\\161.8178\\-174.8672\\-159\\162.4824\\-176.8203\\-159\\163.4318\\-178.7734\\-159\\164.4766\\-182.6797\\-159\\165.2261\\-184.6328\\-159\\165.6954\\-186.5859\\-159\\166.4622\\-192.4453\\-159\\167.1276\\-198.3047\\-159\\167.3479\\-202.2109\\-159\\167.4017\\-204.1641\\-159\\167.3479\\-208.0703\\-159\\167.1143\\-211.9766\\-159\\166.212\\-219.7891\\-159\\165.793\\-223.6953\\-159\\165.5099\\-225.6484\\-159\\164.4853\\-229.5547\\-159\\163.7351\\-233.4609\\-159\\162.3752\\-237.3672\\-159\\161.9843\\-239.3203\\-159\\161.341\\-241.2734\\-159\\160.4189\\-243.2266\\-159\\159.7319\\-245.1797\\-159\\158.5926\\-247.1328\\-159\\157.8271\\-249.0859\\-159\\156.6202\\-251.0391\\-159\\155.9683\\-252.9922\\-159\\154.7619\\-254.9453\\-159\\153.802\\-256.8984\\-159\\153.3203\\-257.513\\-159\\149.9057\\-262.7578\\-159\\147.4609\\-266.0881\\-159\\145.5078\\-268.493\\-159\\142.1487\\-272.5234\\-159\\139.6484\\-275.098\\-159\\138.149\\-276.4297\\-159\\135.7422\\-278.7573\\-159\\133.7891\\-280.5403\\-159\\131.8359\\-281.9057\\-159\\128.9524\\-284.2422\\-159\\125.9766\\-286.5769\\-159\\120.1172\\-290.2785\\-159\\118.1641\\-291.3082\\-159\\116.2109\\-292.6724\\-159\\114.2578\\-293.5774\\-159\\112.3047\\-294.7018\\-159\\110.3516\\-295.2907\\-159\\108.3984\\-296.3092\\-159\\106.4453\\-296.9637\\-159\\104.4922\\-297.7319\\-159\\102.5391\\-298.6478\\-159\\100.5859\\-299.233\\-159\\98.63281\\-300.0695\\-159\\96.67969\\-300.6039\\-159\\92.77344\\-301.3254\\-159\\88.86719\\-302.325\\-159\\84.96094\\-302.7469\\-159\\75.19531\\-303.2604\\-159\\71.28906\\-303.282\\-159\\67.38281\\-303.0898\\-159\\61.52344\\-302.6214\\-159" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "174" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.9851\\-157\\-81.05469\\-303.3633\\-157\\-83.00781\\-303.1013\\-157\\-86.91406\\-302.7239\\-157\\-88.86719\\-302.4734\\-157\\-90.82031\\-302.0497\\-157\\-92.77344\\-301.4447\\-157\\-96.67969\\-300.6312\\-157\\-98.63281\\-300.0454\\-157\\-100.5859\\-299.1348\\-157\\-102.5391\\-298.4888\\-157\\-104.4922\\-297.364\\-157\\-106.4453\\-296.6862\\-157\\-108.3984\\-295.6117\\-157\\-110.3516\\-294.8422\\-157\\-112.3047\\-293.6643\\-157\\-114.2578\\-292.6036\\-157\\-118.1641\\-289.6982\\-157\\-120.1172\\-288.6805\\-157\\-122.0703\\-287.1215\\-157\\-124.0234\\-285.2981\\-157\\-125.9766\\-283.5757\\-157\\-127.5635\\-282.2891\\-157\\-129.8828\\-280.0858\\-157\\-131.4321\\-278.3828\\-157\\-133.7891\\-275.9914\\-157\\-135.7422\\-273.8176\\-157\\-137.6953\\-271.3175\\-157\\-140.0104\\-268.6172\\-157\\-143.8802\\-262.7578\\-157\\-144.9181\\-260.8047\\-157\\-146.268\\-258.8516\\-157\\-147.469\\-256.8984\\-157\\-149.4141\\-253.1898\\-157\\-150.42\\-251.0391\\-157\\-151.4757\\-249.0859\\-157\\-152.4143\\-247.1328\\-157\\-153.4867\\-245.1797\\-157\\-155.0722\\-241.2734\\-157\\-155.9683\\-239.3203\\-157\\-156.4636\\-237.3672\\-157\\-157.3486\\-235.4141\\-157\\-158.0773\\-233.4609\\-157\\-158.6794\\-231.5078\\-157\\-159.6472\\-229.5547\\-157\\-160.7487\\-225.6484\\-157\\-161.5058\\-223.6953\\-157\\-161.9605\\-221.7422\\-157\\-162.6275\\-217.8359\\-157\\-163.2561\\-215.8828\\-157\\-163.7275\\-213.9297\\-157\\-164.6979\\-206.1172\\-157\\-165.2508\\-202.2109\\-157\\-165.332\\-198.3047\\-157\\-165.1877\\-196.3516\\-157\\-164.3273\\-190.4922\\-157\\-163.6635\\-186.5859\\-157\\-162.9542\\-184.6328\\-157\\-162.3628\\-182.6797\\-157\\-161.9374\\-180.7266\\-157\\-161.2037\\-178.7734\\-157\\-159.2024\\-174.8672\\-157\\-157.2266\\-171.8604\\-157\\-156.5337\\-170.9609\\-157\\-155.3784\\-169.0078\\-157\\-153.978\\-167.0547\\-157\\-151.3672\\-164.2597\\-157\\-149.4141\\-162.0951\\-157\\-147.4609\\-160.111\\-157\\-141.6016\\-154.8075\\-157\\-137.6953\\-152.2122\\-157\\-135.7422\\-150.8088\\-157\\-129.8828\\-147.3073\\-157\\-125.9766\\-145.6577\\-157\\-124.0234\\-144.7422\\-157\\-122.0703\\-144.0461\\-157\\-120.1172\\-142.9928\\-157\\-118.1641\\-142.2977\\-157\\-116.2109\\-141.312\\-157\\-112.3047\\-140.1457\\-157\\-110.3516\\-139.2885\\-157\\-106.4453\\-138.3326\\-157\\-104.4922\\-137.443\\-157\\-100.5859\\-136.2989\\-157\\-98.63281\\-135.4228\\-157\\-94.72656\\-134.4884\\-157\\-90.82031\\-133.2669\\-157\\-88.86719\\-132.9469\\-157\\-84.96094\\-132.5754\\-157\\-83.00781\\-132.2216\\-157\\-81.05469\\-131.6962\\-157\\-77.14844\\-131.0445\\-157\\-71.28906\\-130.6588\\-157\\-67.38281\\-130.584\\-157\\-63.47656\\-130.6294\\-157\\-59.57031\\-130.7817\\-157\\-55.66406\\-131.0527\\-157\\-53.71094\\-131.2669\\-157\\-51.75781\\-131.6715\\-157\\-49.80469\\-132.2823\\-157\\-45.89844\\-132.9229\\-157\\-43.94531\\-133.3267\\-157\\-41.99219\\-134.2759\\-157\\-40.03906\\-134.9385\\-157\\-38.0983\\-135.8047\\-157\\-32.22656\\-138.9436\\-157\\-28.36772\\-141.6641\\-157\\-26.24199\\-143.6172\\-157\\-22.46094\\-147.7833\\-157\\-19.60011\\-151.4297\\-157\\-18.33371\\-153.3828\\-157\\-17.37046\\-155.3359\\-157\\-16.15037\\-157.2891\\-157\\-15.42201\\-159.2422\\-157\\-14.55226\\-161.1953\\-157\\-13.89858\\-163.1484\\-157\\-12.94849\\-167.0547\\-157\\-12.25021\\-169.0078\\-157\\-11.88427\\-170.9609\\-157\\-11.49053\\-174.8672\\-157\\-11.23657\\-176.8203\\-157\\-10.74219\\-178.9362\\-157\\-10.09285\\-182.6797\\-157\\-9.689405\\-188.5391\\-157\\-9.563229\\-192.4453\\-157\\-9.557088\\-194.3984\\-157\\-9.658737\\-198.3047\\-157\\-9.61691\\-204.1641\\-157\\-9.412518\\-208.0703\\-157\\-9.303977\\-213.9297\\-157\\-9.39464\\-217.8359\\-157\\-9.640548\\-221.7422\\-157\\-9.941949\\-225.6484\\-157\\-10.02185\\-227.6016\\-157\\-10.22023\\-229.5547\\-157\\-10.5678\\-231.5078\\-157\\-11.08724\\-233.4609\\-157\\-11.39884\\-235.4141\\-157\\-11.86688\\-239.3203\\-157\\-12.25021\\-241.2734\\-157\\-12.93581\\-243.2266\\-157\\-13.39374\\-245.1797\\-157\\-14.07434\\-249.0859\\-157\\-14.64844\\-250.9805\\-157\\-15.43899\\-252.9922\\-157\\-15.96998\\-254.9453\\-157\\-16.93359\\-256.8984\\-157\\-18.31055\\-260.8047\\-157\\-19.28101\\-262.7578\\-157\\-19.82606\\-264.7109\\-157\\-20.84894\\-266.6641\\-157\\-21.69834\\-268.6172\\-157\\-22.95532\\-270.5703\\-157\\-23.85365\\-272.5234\\-157\\-25.15259\\-274.4766\\-157\\-26.03924\\-276.4297\\-157\\-29.93406\\-282.2891\\-157\\-33.01411\\-286.1953\\-157\\-34.17969\\-287.7394\\-157\\-36.13281\\-289.7335\\-157\\-40.08556\\-294.0078\\-157\\-41.99219\\-295.2994\\-157\\-43.94531\\-296.831\\-157\\-45.89844\\-298.2037\\-157\\-47.85156\\-299.2501\\-157\\-49.80469\\-300.4138\\-157\\-51.75781\\-301.0306\\-157\\-55.66406\\-302.4693\\-157\\-59.57031\\-303.1049\\-157\\-63.47656\\-303.9221\\-157\\-65.42969\\-304.1702\\-157\\-67.38281\\-304.2954\\-157\\-71.28906\\-304.3354\\-157\\-75.19531\\-304.1702\\-157" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "180" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.3477\\-157\\55.66406\\-301.1672\\-157\\53.71094\\-300.6819\\-157\\51.7985\\-299.8672\\-157\\49.80469\\-298.8484\\-157\\47.85156\\-297.7158\\-157\\45.89844\\-296.6903\\-157\\43.94531\\-295.3431\\-157\\41.99219\\-294.2501\\-157\\40.03906\\-292.7451\\-157\\35.03158\\-288.1484\\-157\\33.17759\\-286.1953\\-157\\29.91769\\-282.2891\\-157\\28.32031\\-280.1317\\-157\\25.72692\\-276.4297\\-157\\24.41406\\-274.1963\\-157\\22.46094\\-271.0906\\-157\\22.04333\\-270.5703\\-157\\21.16878\\-268.6172\\-157\\20.03255\\-266.6641\\-157\\18.88489\\-262.7578\\-157\\17.87324\\-260.8047\\-157\\17.34044\\-258.8516\\-157\\16.50682\\-256.8984\\-157\\15.85303\\-254.9453\\-157\\15.38732\\-252.9922\\-157\\13.99148\\-249.0859\\-157\\13.14041\\-245.1797\\-157\\12.45482\\-243.2266\\-157\\11.98774\\-241.2734\\-157\\11.54549\\-237.3672\\-157\\11.26664\\-235.4141\\-157\\10.2983\\-231.5078\\-157\\9.86649\\-227.6016\\-157\\9.487357\\-221.7422\\-157\\9.173388\\-217.8359\\-157\\8.666992\\-213.9297\\-157\\8.565267\\-211.9766\\-157\\8.44254\\-206.1172\\-157\\8.463542\\-202.2109\\-157\\8.694322\\-198.3047\\-157\\9.112384\\-194.3984\\-157\\9.372543\\-192.4453\\-157\\9.480575\\-190.4922\\-157\\9.807478\\-186.5859\\-157\\10.08606\\-180.7266\\-157\\10.28022\\-178.7734\\-157\\10.66142\\-176.8203\\-157\\11.25776\\-174.8672\\-157\\11.82666\\-170.9609\\-157\\12.17831\\-169.0078\\-157\\12.85306\\-167.0547\\-157\\13.40942\\-165.1016\\-157\\13.84995\\-163.1484\\-157\\14.62555\\-161.1953\\-157\\15.59333\\-159.2422\\-157\\17.70154\\-155.3359\\-157\\19.01802\\-153.3828\\-157\\20.12156\\-151.4297\\-157\\21.69279\\-149.4766\\-157\\24.41406\\-146.5192\\-157\\27.43936\\-143.6172\\-157\\30.27344\\-141.1554\\-157\\32.51852\\-139.7109\\-157\\36.13281\\-137.5069\\-157\\38.08594\\-136.5667\\-157\\40.03906\\-135.3563\\-157\\41.99219\\-134.65\\-157\\43.94531\\-133.7516\\-157\\45.89844\\-133.0691\\-157\\49.80469\\-132.2877\\-157\\51.75781\\-131.5904\\-157\\53.71094\\-131.1701\\-157\\55.66406\\-130.9117\\-157\\59.57031\\-130.6474\\-157\\67.38281\\-130.4796\\-157\\71.28906\\-130.6331\\-157\\75.19531\\-130.8486\\-157\\81.05469\\-131.3114\\-157\\83.00781\\-131.5904\\-157\\86.91406\\-132.5754\\-157\\88.86719\\-132.8221\\-157\\92.77344\\-133.0691\\-157\\94.72656\\-133.2835\\-157\\96.67969\\-133.7229\\-157\\98.63281\\-134.3138\\-157\\102.5391\\-135.0655\\-157\\104.4922\\-135.5809\\-157\\106.4453\\-136.3433\\-157\\108.3984\\-136.7865\\-157\\110.3516\\-137.3411\\-157\\112.3047\\-138.2299\\-157\\114.2578\\-138.7121\\-157\\116.2109\\-139.0958\\-157\\118.1641\\-139.8272\\-157\\120.1172\\-140.4524\\-157\\122.0703\\-140.9758\\-157\\127.9297\\-143.4178\\-157\\129.8828\\-144.4681\\-157\\131.8359\\-145.2401\\-157\\133.7891\\-146.4451\\-157\\135.7422\\-147.2476\\-157\\137.6953\\-148.517\\-157\\139.6484\\-149.9902\\-157\\141.6016\\-151.2528\\-157\\143.5547\\-152.7157\\-157\\146.7285\\-155.3359\\-157\\148.8193\\-157.2891\\-157\\152.7843\\-161.1953\\-157\\154.478\\-163.1484\\-157\\156.0241\\-165.1016\\-157\\157.362\\-167.0547\\-157\\158.5685\\-169.0078\\-157\\159.9136\\-170.9609\\-157\\161.1328\\-173.0981\\-157\\161.9576\\-174.8672\\-157\\162.6496\\-176.8203\\-157\\163.5898\\-178.7734\\-157\\164.534\\-182.6797\\-157\\165.2865\\-184.6328\\-157\\165.7469\\-186.5859\\-157\\166.5645\\-192.4453\\-157\\167.1691\\-198.3047\\-157\\167.4269\\-202.2109\\-157\\167.4744\\-206.1172\\-157\\167.4434\\-208.0703\\-157\\167.2531\\-211.9766\\-157\\167.0444\\-213.9297\\-157\\166.5286\\-217.8359\\-157\\165.8372\\-223.6953\\-157\\165.5692\\-225.6484\\-157\\165.1198\\-227.6016\\-157\\164.5235\\-229.5547\\-157\\163.7684\\-233.4609\\-157\\162.4036\\-237.3672\\-157\\161.9962\\-239.3203\\-157\\161.3805\\-241.2734\\-157\\160.4304\\-243.2266\\-157\\159.7402\\-245.1797\\-157\\158.6008\\-247.1328\\-157\\157.8306\\-249.0859\\-157\\156.6241\\-251.0391\\-157\\155.952\\-252.9922\\-157\\154.739\\-254.9453\\-157\\153.792\\-256.8984\\-157\\153.3203\\-257.4962\\-157\\151.3672\\-260.4565\\-157\\151.0639\\-260.8047\\-157\\149.9192\\-262.7578\\-157\\148.5072\\-264.7109\\-157\\145.5078\\-268.4613\\-157\\143.5547\\-270.7185\\-157\\142.0898\\-272.5234\\-157\\139.6484\\-275.0474\\-157\\138.0781\\-276.4297\\-157\\136.0808\\-278.3828\\-157\\133.7891\\-280.5087\\-157\\131.8359\\-281.9057\\-157\\128.9749\\-284.2422\\-157\\125.9766\\-286.6102\\-157\\120.1172\\-290.3285\\-157\\118.1641\\-291.3336\\-157\\116.2109\\-292.7076\\-157\\114.2578\\-293.6004\\-157\\112.3047\\-294.7141\\-157\\110.3516\\-295.3249\\-157\\108.3984\\-296.3556\\-157\\106.4453\\-296.9797\\-157\\102.5391\\-298.6817\\-157\\100.5859\\-299.2985\\-157\\98.63281\\-300.1199\\-157\\96.67969\\-300.6337\\-157\\92.77344\\-301.3691\\-157\\88.86719\\-302.3477\\-157\\84.96094\\-302.7638\\-157\\77.14844\\-303.1923\\-157\\73.24219\\-303.343\\-157\\69.33594\\-303.2514\\-157\\63.47656\\-302.8293\\-157\\61.52344\\-302.6533\\-157" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "179" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-303.4525\\-155\\-84.96094\\-302.9156\\-155\\-88.86719\\-302.5377\\-155\\-90.82031\\-302.1529\\-155\\-92.77344\\-301.5302\\-155\\-96.67969\\-300.7018\\-155\\-98.63281\\-300.1568\\-155\\-100.5859\\-299.2218\\-155\\-102.5391\\-298.5633\\-155\\-104.4922\\-297.4451\\-155\\-106.4453\\-296.7433\\-155\\-108.3984\\-295.7\\-155\\-110.3516\\-294.8806\\-155\\-114.2578\\-292.6464\\-155\\-118.1641\\-289.759\\-155\\-120.1172\\-288.7131\\-155\\-122.0703\\-287.1593\\-155\\-125.9766\\-283.6428\\-155\\-127.6687\\-282.2891\\-155\\-129.8828\\-280.2097\\-155\\-131.5384\\-278.3828\\-155\\-133.5178\\-276.4297\\-155\\-135.7422\\-274.0008\\-155\\-136.7835\\-272.5234\\-155\\-140.1531\\-268.6172\\-155\\-141.6016\\-266.5115\\-155\\-144.056\\-262.7578\\-155\\-145.1407\\-260.8047\\-155\\-145.5078\\-260.3384\\-155\\-147.7306\\-256.8984\\-155\\-148.6316\\-254.9453\\-155\\-149.7977\\-252.9922\\-155\\-150.5564\\-251.0391\\-155\\-151.7515\\-249.0859\\-155\\-152.595\\-247.1328\\-155\\-153.7452\\-245.1797\\-155\\-154.4457\\-243.2266\\-155\\-155.3758\\-241.2734\\-155\\-156.1114\\-239.3203\\-155\\-156.633\\-237.3672\\-155\\-157.633\\-235.4141\\-155\\-158.2591\\-233.4609\\-155\\-158.9886\\-231.5078\\-155\\-159.8578\\-229.5547\\-155\\-160.3636\\-227.6016\\-155\\-161.7188\\-223.6953\\-155\\-162.4005\\-219.7891\\-155\\-162.8698\\-217.8359\\-155\\-163.5264\\-215.8828\\-155\\-163.8787\\-213.9297\\-155\\-164.3824\\-210.0234\\-155\\-165.3539\\-204.1641\\-155\\-165.5187\\-202.2109\\-155\\-165.5692\\-198.3047\\-155\\-165.4738\\-196.3516\\-155\\-164.9857\\-192.4453\\-155\\-164.5631\\-190.4922\\-155\\-163.8683\\-186.5859\\-155\\-163.3459\\-184.6328\\-155\\-162.5682\\-182.6797\\-155\\-162.0911\\-180.7266\\-155\\-161.4911\\-178.7734\\-155\\-160.4062\\-176.8203\\-155\\-159.4966\\-174.8672\\-155\\-157.2266\\-171.5923\\-155\\-156.7108\\-170.9609\\-155\\-155.6568\\-169.0078\\-155\\-154.1471\\-167.0547\\-155\\-150.4957\\-163.1484\\-155\\-149.4141\\-161.9189\\-155\\-146.6957\\-159.2422\\-155\\-145.5078\\-158.2535\\-155\\-141.6016\\-154.6698\\-155\\-139.6484\\-153.2647\\-155\\-137.6953\\-152.131\\-155\\-135.7422\\-150.7031\\-155\\-130.3613\\-147.5234\\-155\\-129.8828\\-147.1792\\-155\\-127.9297\\-146.4309\\-155\\-124.0234\\-144.6667\\-155\\-122.0703\\-143.8912\\-155\\-120.1172\\-142.8874\\-155\\-118.1641\\-142.1829\\-155\\-116.2109\\-141.1915\\-155\\-112.3047\\-140.0294\\-155\\-110.3516\\-139.1765\\-155\\-106.4453\\-138.1867\\-155\\-104.4922\\-137.2813\\-155\\-102.5391\\-136.7761\\-155\\-100.5859\\-136.1148\\-155\\-98.63281\\-135.2673\\-155\\-94.72656\\-134.3591\\-155\\-92.77344\\-133.6418\\-155\\-90.82031\\-133.1736\\-155\\-88.86719\\-132.8929\\-155\\-84.96094\\-132.5188\\-155\\-83.00781\\-132.1764\\-155\\-81.05469\\-131.6475\\-155\\-79.10156\\-131.2562\\-155\\-77.14844\\-130.9823\\-155\\-73.24219\\-130.7098\\-155\\-69.33594\\-130.555\\-155\\-63.47656\\-130.5658\\-155\\-57.61719\\-130.8515\\-155\\-53.71094\\-131.2184\\-155\\-51.75781\\-131.5904\\-155\\-49.80469\\-132.2354\\-155\\-47.85156\\-132.6294\\-155\\-45.89844\\-132.8929\\-155\\-43.94531\\-133.2945\\-155\\-41.99219\\-134.2408\\-155\\-40.03906\\-134.9214\\-155\\-38.08594\\-135.7818\\-155\\-32.22656\\-138.936\\-155\\-28.38542\\-141.6641\\-155\\-26.24199\\-143.6172\\-155\\-22.46094\\-147.7716\\-155\\-19.61263\\-151.4297\\-155\\-18.40049\\-153.3828\\-155\\-17.39708\\-155.3359\\-155\\-16.18214\\-157.2891\\-155\\-15.43298\\-159.2422\\-155\\-14.49764\\-161.1953\\-155\\-13.87533\\-163.1484\\-155\\-12.94849\\-167.0547\\-155\\-12.27392\\-169.0078\\-155\\-11.89732\\-170.9609\\-155\\-11.49462\\-174.8672\\-155\\-11.21511\\-176.8203\\-155\\-10.35525\\-180.7266\\-155\\-10.08606\\-182.6797\\-155\\-9.820642\\-186.5859\\-155\\-9.62822\\-190.4922\\-155\\-9.633789\\-194.3984\\-155\\-9.7891\\-198.3047\\-155\\-9.770412\\-204.1641\\-155\\-9.419988\\-210.0234\\-155\\-9.346277\\-213.9297\\-155\\-9.427584\\-217.8359\\-155\\-9.665096\\-221.7422\\-155\\-10.12074\\-227.6016\\-155\\-10.3752\\-229.5547\\-155\\-11.23946\\-233.4609\\-155\\-11.94018\\-239.3203\\-155\\-12.40306\\-241.2734\\-155\\-13.0598\\-243.2266\\-155\\-13.48016\\-245.1797\\-155\\-14.18488\\-249.0859\\-155\\-15.57593\\-252.9922\\-155\\-16.08788\\-254.9453\\-155\\-17.10771\\-256.8984\\-155\\-17.70833\\-258.8516\\-155\\-19.37737\\-262.7578\\-155\\-19.94344\\-264.7109\\-155\\-21.01164\\-266.6641\\-155\\-21.81551\\-268.6172\\-155\\-23.10627\\-270.5703\\-155\\-23.98606\\-272.5234\\-155\\-25.26558\\-274.4766\\-155\\-26.21755\\-276.4297\\-155\\-27.41392\\-278.3828\\-155\\-30.11924\\-282.2891\\-155\\-31.53456\\-284.2422\\-155\\-34.17969\\-287.64\\-155\\-36.54436\\-290.1016\\-155\\-40.13853\\-294.0078\\-155\\-41.99219\\-295.3163\\-155\\-43.94531\\-296.8492\\-155\\-45.89844\\-298.2396\\-155\\-47.85156\\-299.2704\\-155\\-49.80469\\-300.4261\\-155\\-51.75781\\-301.05\\-155\\-55.66406\\-302.4978\\-155\\-59.57031\\-303.1244\\-155\\-63.47656\\-303.9729\\-155\\-65.42969\\-304.1988\\-155\\-69.33594\\-304.3658\\-155\\-73.24219\\-304.3196\\-155\\-77.14844\\-304.0664\\-155" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "185" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.37\\-155\\55.66406\\-301.1796\\-155\\53.71094\\-300.7001\\-155\\51.75781\\-299.9206\\-155\\47.9798\\-297.9141\\-155\\45.89844\\-296.7338\\-155\\43.94531\\-295.3885\\-155\\41.99219\\-294.3166\\-155\\40.03906\\-292.8026\\-155\\34.97617\\-288.1484\\-155\\33.12653\\-286.1953\\-155\\29.8055\\-282.2891\\-155\\28.32031\\-280.3264\\-155\\25.68423\\-276.4297\\-155\\24.41406\\-274.2795\\-155\\22.46094\\-271.1595\\-155\\22.00101\\-270.5703\\-155\\21.13689\\-268.6172\\-155\\20.00026\\-266.6641\\-155\\19.46654\\-264.7109\\-155\\18.83473\\-262.7578\\-155\\17.83539\\-260.8047\\-155\\17.28622\\-258.8516\\-155\\16.36584\\-256.8984\\-155\\15.7666\\-254.9453\\-155\\15.26839\\-252.9922\\-155\\14.49653\\-251.0391\\-155\\13.92917\\-249.0859\\-155\\13.07091\\-245.1797\\-155\\12.36747\\-243.2266\\-155\\11.94018\\-241.2734\\-155\\11.48802\\-237.3672\\-155\\11.17974\\-235.4141\\-155\\10.62012\\-233.4609\\-155\\10.21205\\-231.5078\\-155\\9.807083\\-227.6016\\-155\\9.571309\\-223.6953\\-155\\9.118895\\-217.8359\\-155\\8.565267\\-213.9297\\-155\\8.565267\\-211.9766\\-155\\8.432241\\-206.1172\\-155\\8.432241\\-202.2109\\-155\\8.4851\\-200.2578\\-155\\8.640455\\-198.3047\\-155\\9.07668\\-194.3984\\-155\\9.367536\\-192.4453\\-155\\9.86236\\-186.5859\\-155\\10.14985\\-180.7266\\-155\\10.38537\\-178.7734\\-155\\11.35685\\-174.8672\\-155\\11.88427\\-170.9609\\-155\\12.2635\\-169.0078\\-155\\12.94663\\-167.0547\\-155\\13.87293\\-163.1484\\-155\\14.61088\\-161.1953\\-155\\16.56371\\-157.2891\\-155\\18.55469\\-153.91\\-155\\18.9927\\-153.3828\\-155\\20.08725\\-151.4297\\-155\\21.65706\\-149.4766\\-155\\24.41406\\-146.485\\-155\\27.38473\\-143.6172\\-155\\30.27344\\-141.0768\\-155\\32.41984\\-139.7109\\-155\\34.17969\\-138.6808\\-155\\36.13281\\-137.4173\\-155\\38.08594\\-136.5039\\-155\\40.03906\\-135.2747\\-155\\41.99219\\-134.5752\\-155\\43.94531\\-133.6256\\-155\\45.89844\\-133.0206\\-155\\47.85156\\-132.6619\\-155\\49.80469\\-132.1641\\-155\\51.75781\\-131.4399\\-155\\53.71094\\-130.9991\\-155\\59.57031\\-130.5267\\-155\\61.52344\\-130.4218\\-155\\67.38281\\-130.4129\\-155\\73.24219\\-130.6608\\-155\\79.10156\\-131.0846\\-155\\83.00781\\-131.4967\\-155\\84.96094\\-131.9536\\-155\\86.91406\\-132.6881\\-155\\88.86719\\-132.9654\\-155\\90.82031\\-133.0941\\-155\\92.77344\\-133.0715\\-155\\94.72656\\-133.1779\\-155\\96.67969\\-133.6111\\-155\\98.63281\\-134.3028\\-155\\100.5859\\-134.5665\\-155\\102.5391\\-134.9792\\-155\\104.4922\\-135.5323\\-155\\106.4453\\-136.2899\\-155\\108.3984\\-136.6852\\-155\\110.3516\\-137.1956\\-155\\112.3047\\-138.1086\\-155\\116.2109\\-138.9695\\-155\\118.1641\\-139.5947\\-155\\120.1172\\-140.3432\\-155\\122.0703\\-140.8629\\-155\\124.0234\\-141.5808\\-155\\125.9766\\-142.505\\-155\\127.9297\\-143.2402\\-155\\129.8828\\-144.3408\\-155\\131.8359\\-145.069\\-155\\133.7891\\-146.2631\\-155\\135.7422\\-147.0489\\-155\\136.3604\\-147.5234\\-155\\141.6016\\-151.0403\\-155\\143.5547\\-152.5565\\-155\\146.9175\\-155.3359\\-155\\148.9709\\-157.2891\\-155\\153.3203\\-161.5555\\-155\\156.1969\\-165.1016\\-155\\157.6084\\-167.0547\\-155\\158.785\\-169.0078\\-155\\160.0978\\-170.9609\\-155\\161.2956\\-172.9141\\-155\\162.7849\\-176.8203\\-155\\163.7079\\-178.7734\\-155\\164.6352\\-182.6797\\-155\\165.3096\\-184.6328\\-155\\165.7662\\-186.5859\\-155\\166.0944\\-188.5391\\-155\\166.6277\\-192.4453\\-155\\166.7668\\-194.3984\\-155\\167.2818\\-198.3047\\-155\\167.4171\\-200.2578\\-155\\167.546\\-206.1172\\-155\\167.5166\\-208.0703\\-155\\167.335\\-211.9766\\-155\\167.1666\\-213.9297\\-155\\166.6054\\-217.8359\\-155\\165.6042\\-225.6484\\-155\\165.1611\\-227.6016\\-155\\164.5416\\-229.5547\\-155\\163.7756\\-233.4609\\-155\\162.4161\\-237.3672\\-155\\162.0028\\-239.3203\\-155\\161.3946\\-241.2734\\-155\\160.4117\\-243.2266\\-155\\159.7319\\-245.1797\\-155\\158.5845\\-247.1328\\-155\\157.8227\\-249.0859\\-155\\156.6074\\-251.0391\\-155\\155.9309\\-252.9922\\-155\\154.6901\\-254.9453\\-155\\153.7685\\-256.8984\\-155\\153.3203\\-257.4577\\-155\\151.3672\\-260.4192\\-155\\151.0392\\-260.8047\\-155\\149.8853\\-262.7578\\-155\\148.4819\\-264.7109\\-155\\146.9265\\-266.6641\\-155\\143.5547\\-270.5974\\-155\\142.0139\\-272.5234\\-155\\139.6484\\-274.979\\-155\\137.9661\\-276.4297\\-155\\136.0085\\-278.3828\\-155\\133.7891\\-280.4192\\-155\\131.8359\\-281.8828\\-155\\128.9749\\-284.2422\\-155\\125.9766\\-286.6202\\-155\\120.1172\\-290.3406\\-155\\118.1641\\-291.3596\\-155\\116.2109\\-292.7192\\-155\\114.2578\\-293.6107\\-155\\112.3047\\-294.7264\\-155\\110.3516\\-295.3466\\-155\\108.3984\\-296.3662\\-155\\106.4453\\-296.9959\\-155\\102.5391\\-298.7131\\-155\\100.5859\\-299.3351\\-155\\98.63281\\-300.1661\\-155\\96.67969\\-300.661\\-155\\92.77344\\-301.4066\\-155\\90.82031\\-301.95\\-155\\88.86719\\-302.37\\-155\\86.91406\\-302.6283\\-155\\83.00781\\-302.8881\\-155\\77.14844\\-303.2215\\-155\\73.24219\\-303.3558\\-155\\69.33594\\-303.2637\\-155\\63.47656\\-302.84\\-155\\61.52344\\-302.6648\\-155" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "175" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.882\\-153\\-81.05469\\-303.5258\\-153\\-84.96094\\-302.956\\-153\\-88.86719\\-302.591\\-153\\-90.82031\\-302.2369\\-153\\-92.77344\\-301.6339\\-153\\-96.67969\\-300.7472\\-153\\-98.63281\\-300.2253\\-153\\-100.5859\\-299.3033\\-153\\-102.5391\\-298.6208\\-153\\-104.4922\\-297.5221\\-153\\-106.4453\\-296.7738\\-153\\-108.3984\\-295.7687\\-153\\-110.3516\\-294.9107\\-153\\-114.2578\\-292.6849\\-153\\-118.1641\\-289.8108\\-153\\-120.1172\\-288.7357\\-153\\-122.0703\\-287.1845\\-153\\-125.9766\\-283.6989\\-153\\-127.7801\\-282.2891\\-153\\-129.8828\\-280.3272\\-153\\-131.6678\\-278.3828\\-153\\-133.6507\\-276.4297\\-153\\-135.7422\\-274.1568\\-153\\-136.8745\\-272.5234\\-153\\-140.2762\\-268.6172\\-153\\-141.7188\\-266.6641\\-153\\-142.8415\\-264.7109\\-153\\-144.2162\\-262.7578\\-153\\-147.4609\\-257.5223\\-153\\-147.9256\\-256.8984\\-153\\-148.7914\\-254.9453\\-153\\-149.9767\\-252.9922\\-153\\-150.7265\\-251.0391\\-153\\-151.9624\\-249.0859\\-153\\-152.795\\-247.1328\\-153\\-153.9263\\-245.1797\\-153\\-154.6161\\-243.2266\\-153\\-155.6458\\-241.2734\\-153\\-156.8569\\-237.3672\\-153\\-157.8362\\-235.4141\\-153\\-158.4446\\-233.4609\\-153\\-159.3667\\-231.5078\\-153\\-160.5756\\-227.6016\\-153\\-161.368\\-225.6484\\-153\\-161.8863\\-223.6953\\-153\\-162.5527\\-219.7891\\-153\\-163.1851\\-217.8359\\-153\\-163.7121\\-215.8828\\-153\\-164.5755\\-210.0234\\-153\\-165.3539\\-206.1172\\-153\\-165.6953\\-202.2109\\-153\\-165.7323\\-198.3047\\-153\\-165.5444\\-194.3984\\-153\\-165.332\\-192.4453\\-153\\-164.4052\\-188.5391\\-153\\-163.6258\\-184.6328\\-153\\-162.8548\\-182.6797\\-153\\-161.6899\\-178.7734\\-153\\-160.6132\\-176.8203\\-153\\-159.715\\-174.8672\\-153\\-156.9336\\-170.9609\\-153\\-155.8459\\-169.0078\\-153\\-154.2969\\-167.0547\\-153\\-150.705\\-163.1484\\-153\\-149.4141\\-161.6644\\-153\\-146.9219\\-159.2422\\-153\\-145.5078\\-158.1235\\-153\\-141.6016\\-154.561\\-153\\-139.6484\\-153.1219\\-153\\-137.6953\\-152.0697\\-153\\-135.7422\\-150.6359\\-153\\-133.7891\\-149.439\\-153\\-130.4785\\-147.5234\\-153\\-129.8828\\-147.1069\\-153\\-127.9297\\-146.3749\\-153\\-125.9766\\-145.4126\\-153\\-122.0703\\-143.7588\\-153\\-120.1172\\-142.7956\\-153\\-118.1641\\-142.0586\\-153\\-116.2109\\-141.0842\\-153\\-114.2578\\-140.5197\\-153\\-112.3047\\-139.8559\\-153\\-110.3516\\-139.0705\\-153\\-108.3984\\-138.6277\\-153\\-106.4453\\-137.9965\\-153\\-104.4922\\-137.1344\\-153\\-102.5391\\-136.638\\-153\\-98.63281\\-135.1664\\-153\\-94.72656\\-134.2381\\-153\\-92.77344\\-133.5008\\-153\\-90.82031\\-133.113\\-153\\-84.96094\\-132.3899\\-153\\-81.05469\\-131.4399\\-153\\-77.14844\\-130.9357\\-153\\-71.28906\\-130.555\\-153\\-69.33594\\-130.4978\\-153\\-63.47656\\-130.5057\\-153\\-57.61719\\-130.8128\\-153\\-53.71094\\-131.1859\\-153\\-51.75781\\-131.537\\-153\\-49.80469\\-132.2123\\-153\\-47.85156\\-132.6367\\-153\\-45.89844\\-132.8929\\-153\\-43.94531\\-133.2982\\-153\\-41.99219\\-134.2272\\-153\\-40.03906\\-134.9104\\-153\\-38.03759\\-135.8047\\-153\\-32.22656\\-138.9436\\-153\\-28.40245\\-141.6641\\-153\\-26.24199\\-143.6172\\-153\\-22.46094\\-147.7432\\-153\\-19.60589\\-151.4297\\-153\\-18.38707\\-153.3828\\-153\\-17.40106\\-155.3359\\-153\\-16.17237\\-157.2891\\-153\\-15.43511\\-159.2422\\-153\\-14.45737\\-161.1953\\-153\\-13.85679\\-163.1484\\-153\\-12.96099\\-167.0547\\-153\\-12.27392\\-169.0078\\-153\\-11.90848\\-170.9609\\-153\\-11.47729\\-174.8672\\-153\\-11.18382\\-176.8203\\-153\\-10.33579\\-180.7266\\-153\\-10.08606\\-182.6797\\-153\\-9.838982\\-186.5859\\-153\\-9.665096\\-190.4922\\-153\\-9.658737\\-192.4453\\-153\\-9.816778\\-196.3516\\-153\\-9.829812\\-200.2578\\-153\\-9.908537\\-204.1641\\-153\\-9.61691\\-208.0703\\-153\\-9.431112\\-211.9766\\-153\\-9.427374\\-215.8828\\-153\\-9.579145\\-219.7891\\-153\\-10.03689\\-225.6484\\-153\\-10.5678\\-229.5547\\-153\\-11.05656\\-231.5078\\-153\\-11.35748\\-233.4609\\-153\\-11.77154\\-237.3672\\-153\\-12.04227\\-239.3203\\-153\\-12.53756\\-241.2734\\-153\\-13.16699\\-243.2266\\-153\\-13.88889\\-247.1328\\-153\\-14.31418\\-249.0859\\-153\\-15.10976\\-251.0391\\-153\\-16.24474\\-254.9453\\-153\\-17.25443\\-256.8984\\-153\\-17.80389\\-258.8516\\-153\\-18.79519\\-260.8047\\-153\\-20.06572\\-264.7109\\-153\\-21.14922\\-266.6641\\-153\\-21.94913\\-268.6172\\-153\\-23.23676\\-270.5703\\-153\\-24.16487\\-272.5234\\-153\\-25.37893\\-274.4766\\-153\\-27.53789\\-278.3828\\-153\\-30.36296\\-282.2891\\-153\\-31.65409\\-284.2422\\-153\\-34.17969\\-287.5105\\-153\\-40.22382\\-294.0078\\-153\\-41.99219\\-295.2581\\-153\\-43.94531\\-296.8428\\-153\\-45.89844\\-298.2418\\-153\\-47.85156\\-299.274\\-153\\-49.80469\\-300.4261\\-153\\-51.75781\\-301.0621\\-153\\-55.66406\\-302.5179\\-153\\-59.57031\\-303.136\\-153\\-63.47656\\-303.9851\\-153\\-65.42969\\-304.2081\\-153\\-69.33594\\-304.3949\\-153\\-73.24219\\-304.3583\\-153\\-77.14844\\-304.12\\-153" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "181" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.3607\\-153\\55.66406\\-301.188\\-153\\53.71094\\-300.7116\\-153\\51.75781\\-299.9505\\-153\\47.90139\\-297.9141\\-153\\45.89844\\-296.7599\\-153\\43.94531\\-295.4116\\-153\\41.99219\\-294.3546\\-153\\40.03906\\-292.8149\\-153\\36.13281\\-289.1987\\-153\\34.93143\\-288.1484\\-153\\33.08823\\-286.1953\\-153\\29.73165\\-282.2891\\-153\\28.19454\\-280.3359\\-153\\26.99498\\-278.3828\\-153\\25.63794\\-276.4297\\-153\\23.33416\\-272.5234\\-153\\21.97266\\-270.5703\\-153\\21.14077\\-268.6172\\-153\\20.00026\\-266.6641\\-153\\19.46023\\-264.7109\\-153\\18.79519\\-262.7578\\-153\\17.80547\\-260.8047\\-153\\17.24718\\-258.8516\\-153\\16.28675\\-256.8984\\-153\\15.16272\\-252.9922\\-153\\14.39398\\-251.0391\\-153\\13.8707\\-249.0859\\-153\\12.99741\\-245.1797\\-153\\12.29795\\-243.2266\\-153\\11.8953\\-241.2734\\-153\\11.43895\\-237.3672\\-153\\11.0919\\-235.4141\\-153\\10.50647\\-233.4609\\-153\\10.14245\\-231.5078\\-153\\9.756369\\-227.6016\\-153\\9.520206\\-223.6953\\-153\\9.083998\\-217.8359\\-153\\8.565267\\-213.9297\\-153\\8.602061\\-211.9766\\-153\\8.47425\\-208.0703\\-153\\8.422074\\-204.1641\\-153\\8.47425\\-200.2578\\-153\\8.614676\\-198.3047\\-153\\9.542989\\-190.4922\\-153\\9.922986\\-186.5859\\-153\\10.09285\\-182.6797\\-153\\10.25391\\-180.7266\\-153\\10.54275\\-178.7734\\-153\\11.43185\\-174.8672\\-153\\11.92882\\-170.9609\\-153\\12.33082\\-169.0078\\-153\\13.01147\\-167.0547\\-153\\13.89146\\-163.1484\\-153\\14.64844\\-161.1628\\-153\\16.50611\\-157.2891\\-153\\18.55469\\-153.8581\\-153\\18.95551\\-153.3828\\-153\\20.04046\\-151.4297\\-153\\22.46094\\-148.5201\\-153\\24.41406\\-146.4575\\-153\\27.3234\\-143.6172\\-153\\30.27344\\-141.028\\-153\\32.31908\\-139.7109\\-153\\34.17969\\-138.6265\\-153\\36.13281\\-137.3437\\-153\\38.08594\\-136.4261\\-153\\40.03906\\-135.206\\-153\\41.99219\\-134.5086\\-153\\43.94531\\-133.5354\\-153\\45.89844\\-132.9654\\-153\\47.85156\\-132.6146\\-153\\51.75781\\-131.3445\\-153\\53.71094\\-130.9582\\-153\\57.61719\\-130.5653\\-153\\61.52344\\-130.2622\\-153\\67.38281\\-130.3247\\-153\\73.24219\\-130.6017\\-153\\79.10156\\-131.0049\\-153\\83.00781\\-131.3704\\-153\\84.96094\\-131.7487\\-153\\86.91406\\-132.6635\\-153\\88.86719\\-132.9286\\-153\\90.82031\\-133.0295\\-153\\94.72656\\-133.0812\\-153\\96.67969\\-133.5673\\-153\\98.63281\\-134.3364\\-153\\100.5859\\-134.435\\-153\\102.5391\\-134.8943\\-153\\104.4922\\-135.4814\\-153\\106.4453\\-136.2579\\-153\\108.3984\\-136.6256\\-153\\110.3516\\-137.1321\\-153\\112.3047\\-138.1387\\-153\\116.2109\\-138.8681\\-153\\118.1641\\-139.3642\\-153\\120.1172\\-140.2058\\-153\\124.0234\\-141.3801\\-153\\125.9766\\-142.3665\\-153\\127.9297\\-143.0944\\-153\\129.8828\\-144.213\\-153\\131.8359\\-144.9377\\-153\\133.7891\\-146.0951\\-153\\135.7422\\-146.9098\\-153\\136.599\\-147.5234\\-153\\139.639\\-149.4766\\-153\\142.3712\\-151.4297\\-153\\147.1139\\-155.3359\\-153\\149.4141\\-157.5291\\-153\\153.3203\\-161.3409\\-153\\155.2734\\-163.7462\\-153\\157.2266\\-166.2751\\-153\\159.1797\\-169.2448\\-153\\161.3957\\-172.9141\\-153\\162.9232\\-176.8203\\-153\\163.7915\\-178.7734\\-153\\164.2722\\-180.7266\\-153\\165.3959\\-184.6328\\-153\\166.1161\\-188.5391\\-153\\166.6794\\-192.4453\\-153\\166.7987\\-194.3984\\-153\\167.1573\\-196.3516\\-153\\167.4071\\-198.3047\\-153\\167.511\\-200.2578\\-153\\167.6018\\-206.1172\\-153\\167.5078\\-210.0234\\-153\\167.2279\\-213.9297\\-153\\166.9922\\-215.8286\\-153\\166.3882\\-219.7891\\-153\\165.6304\\-225.6484\\-153\\165.2007\\-227.6016\\-153\\164.5538\\-229.5547\\-153\\163.7827\\-233.4609\\-153\\162.4204\\-237.3672\\-153\\161.9962\\-239.3203\\-153\\161.368\\-241.2734\\-153\\160.3933\\-243.2266\\-153\\159.7064\\-245.1797\\-153\\158.5381\\-247.1328\\-153\\157.7838\\-249.0859\\-153\\156.5734\\-251.0391\\-153\\155.9095\\-252.9922\\-153\\154.668\\-254.9453\\-153\\153.734\\-256.8984\\-153\\153.3203\\-257.4076\\-153\\151.3672\\-260.3417\\-153\\150.9751\\-260.8047\\-153\\149.8286\\-262.7578\\-153\\148.4375\\-264.7109\\-153\\146.8555\\-266.6641\\-153\\145.104\\-268.6172\\-153\\141.9119\\-272.5234\\-153\\139.6484\\-274.8657\\-153\\137.8706\\-276.4297\\-153\\135.9175\\-278.3828\\-153\\133.78\\-280.3359\\-153\\129.8828\\-283.4195\\-153\\128.9444\\-284.2422\\-153\\125.9766\\-286.6102\\-153\\120.1172\\-290.3406\\-153\\118.1641\\-291.3711\\-153\\116.2109\\-292.7268\\-153\\114.2578\\-293.6211\\-153\\112.3047\\-294.7418\\-153\\110.3516\\-295.3555\\-153\\108.3984\\-296.3898\\-153\\106.4453\\-297.0122\\-153\\102.5391\\-298.7444\\-153\\100.5859\\-299.373\\-153\\98.63281\\-300.2014\\-153\\96.67969\\-300.6724\\-153\\92.77344\\-301.4202\\-153\\90.82031\\-301.9931\\-153\\88.86719\\-302.3793\\-153\\86.91406\\-302.6351\\-153\\84.96094\\-302.7804\\-153\\77.14844\\-303.2336\\-153\\75.19531\\-303.3135\\-153\\71.28906\\-303.333\\-153\\67.38281\\-303.1398\\-153\\61.52344\\-302.6712\\-153" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "186" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.9221\\-151\\-81.05469\\-303.5781\\-151\\-84.96094\\-303.0022\\-151\\-88.86719\\-302.6283\\-151\\-90.82031\\-302.302\\-151\\-94.72656\\-301.2006\\-151\\-98.63281\\-300.2693\\-151\\-100.5859\\-299.3611\\-151\\-102.5391\\-298.6532\\-151\\-104.4922\\-297.5908\\-151\\-106.4453\\-296.7972\\-151\\-110.3516\\-294.9294\\-151\\-114.2578\\-292.7151\\-151\\-116.2109\\-291.2234\\-151\\-118.1641\\-289.8517\\-151\\-120.1172\\-288.758\\-151\\-122.0703\\-287.1971\\-151\\-125.9766\\-283.7715\\-151\\-127.8845\\-282.2891\\-151\\-129.8828\\-280.431\\-151\\-131.7775\\-278.3828\\-151\\-133.7636\\-276.4297\\-151\\-135.7422\\-274.2884\\-151\\-136.9996\\-272.5234\\-151\\-138.6317\\-270.5703\\-151\\-140.3809\\-268.6172\\-151\\-141.8732\\-266.6641\\-151\\-142.9321\\-264.7109\\-151\\-144.3298\\-262.7578\\-151\\-145.6299\\-260.8047\\-151\\-146.7566\\-258.8516\\-151\\-148.0753\\-256.8984\\-151\\-148.9607\\-254.9453\\-151\\-150.116\\-252.9922\\-151\\-150.8955\\-251.0391\\-151\\-152.1163\\-249.0859\\-151\\-153.0016\\-247.1328\\-151\\-154.0728\\-245.1797\\-151\\-154.7985\\-243.2266\\-151\\-155.8211\\-241.2734\\-151\\-156.3436\\-239.3203\\-151\\-158.0068\\-235.4141\\-151\\-158.6391\\-233.4609\\-151\\-159.6225\\-231.5078\\-151\\-160.794\\-227.6016\\-151\\-161.5851\\-225.6484\\-151\\-162.0147\\-223.6953\\-151\\-162.3251\\-221.7422\\-151\\-162.7441\\-219.7891\\-151\\-163.4294\\-217.8359\\-151\\-163.8449\\-215.8828\\-151\\-164.4244\\-211.9766\\-151\\-164.8072\\-210.0234\\-151\\-165.2982\\-208.0703\\-151\\-165.561\\-206.1172\\-151\\-165.8331\\-202.2109\\-151\\-165.8825\\-200.2578\\-151\\-165.8273\\-196.3516\\-151\\-165.5444\\-192.4453\\-151\\-165.2007\\-190.4922\\-151\\-164.6242\\-188.5391\\-151\\-163.8128\\-184.6328\\-151\\-163.1705\\-182.6797\\-151\\-162.3628\\-180.7266\\-151\\-161.8448\\-178.7734\\-151\\-159.8925\\-174.8672\\-151\\-158.4503\\-172.9141\\-151\\-155.9947\\-169.0078\\-151\\-154.4411\\-167.0547\\-151\\-152.7613\\-165.1016\\-151\\-150.897\\-163.1484\\-151\\-149.4141\\-161.4374\\-151\\-147.1382\\-159.2422\\-151\\-145.5078\\-157.9335\\-151\\-141.6016\\-154.4908\\-151\\-139.6484\\-153.031\\-151\\-137.6953\\-152.0433\\-151\\-135.7422\\-150.613\\-151\\-133.7891\\-149.3545\\-151\\-130.5762\\-147.5234\\-151\\-129.8828\\-147.0485\\-151\\-127.9297\\-146.338\\-151\\-125.9766\\-145.3171\\-151\\-124.0234\\-144.566\\-151\\-120.1172\\-142.7122\\-151\\-118.1641\\-141.9203\\-151\\-116.2109\\-140.9834\\-151\\-114.2578\\-140.425\\-151\\-110.3516\\-138.9649\\-151\\-108.3984\\-138.5264\\-151\\-104.4922\\-137.0215\\-151\\-102.5391\\-136.4944\\-151\\-100.5859\\-135.6693\\-151\\-98.63281\\-135.0921\\-151\\-94.72656\\-134.1256\\-151\\-92.77344\\-133.4302\\-151\\-90.82031\\-133.0739\\-151\\-86.91406\\-132.625\\-151\\-84.96094\\-132.3009\\-151\\-83.00781\\-131.7345\\-151\\-81.05469\\-131.3038\\-151\\-79.10156\\-131.0823\\-151\\-75.19531\\-130.7567\\-151\\-71.28906\\-130.4978\\-151\\-67.38281\\-130.401\\-151\\-63.47656\\-130.419\\-151\\-59.57031\\-130.6258\\-151\\-55.66406\\-130.9451\\-151\\-53.71094\\-131.1537\\-151\\-51.75781\\-131.5066\\-151\\-49.80469\\-132.1984\\-151\\-47.85156\\-132.6439\\-151\\-45.89844\\-132.9109\\-151\\-43.94531\\-133.3435\\-151\\-41.99219\\-134.2381\\-151\\-40.03906\\-134.9263\\-151\\-38.08594\\-135.797\\-151\\-32.22656\\-138.9642\\-151\\-28.43896\\-141.6641\\-151\\-26.27458\\-143.6172\\-151\\-22.46094\\-147.6958\\-151\\-19.58101\\-151.4297\\-151\\-18.31055\\-153.3828\\-151\\-17.38175\\-155.3359\\-151\\-16.1438\\-157.2891\\-151\\-15.42426\\-159.2422\\-151\\-14.4322\\-161.1953\\-151\\-13.84523\\-163.1484\\-151\\-12.97331\\-167.0547\\-151\\-12.27392\\-169.0078\\-151\\-11.90848\\-170.9609\\-151\\-11.48395\\-174.8672\\-151\\-11.18382\\-176.8203\\-151\\-10.33579\\-180.7266\\-151\\-10.09971\\-182.6797\\-151\\-9.857321\\-186.5859\\-151\\-9.71398\\-190.4922\\-151\\-9.732441\\-192.4453\\-151\\-9.880786\\-196.3516\\-151\\-9.86649\\-200.2578\\-151\\-9.975228\\-204.1641\\-151\\-9.679033\\-208.0703\\-151\\-9.470016\\-213.9297\\-151\\-9.6268\\-219.7891\\-151\\-10.10665\\-225.6484\\-151\\-10.53049\\-227.6016\\-151\\-10.78033\\-229.5547\\-151\\-11.19626\\-231.5078\\-151\\-11.45583\\-233.4609\\-151\\-11.84353\\-237.3672\\-151\\-12.1563\\-239.3203\\-151\\-13.24142\\-243.2266\\-151\\-13.9608\\-247.1328\\-151\\-14.45875\\-249.0859\\-151\\-15.27544\\-251.0391\\-151\\-15.79255\\-252.9922\\-151\\-16.45296\\-254.9453\\-151\\-17.37968\\-256.8984\\-151\\-17.90926\\-258.8516\\-151\\-18.97608\\-260.8047\\-151\\-19.54309\\-262.7578\\-151\\-20.21976\\-264.7109\\-151\\-21.27041\\-266.6641\\-151\\-22.11217\\-268.6172\\-151\\-23.35394\\-270.5703\\-151\\-24.39135\\-272.5234\\-151\\-27.6753\\-278.3828\\-151\\-30.27344\\-281.9362\\-151\\-30.59156\\-282.2891\\-151\\-31.798\\-284.2422\\-151\\-33.23403\\-286.1953\\-151\\-34.84613\\-288.1484\\-151\\-40.30462\\-294.0078\\-151\\-41.99219\\-295.2254\\-151\\-43.94531\\-296.8177\\-151\\-45.89844\\-298.2171\\-151\\-47.85156\\-299.2538\\-151\\-49.80469\\-300.4261\\-151\\-51.75781\\-301.0621\\-151\\-55.66406\\-302.53\\-151\\-59.57031\\-303.1282\\-151\\-63.47656\\-303.9729\\-151\\-65.42969\\-304.2081\\-151\\-69.33594\\-304.402\\-151\\-73.24219\\-304.3732\\-151\\-77.14844\\-304.1604\\-151" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "179" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.3416\\-151\\55.66406\\-301.1837\\-151\\53.71094\\-300.7051\\-151\\51.75781\\-299.9505\\-151\\47.86163\\-297.9141\\-151\\45.89844\\-296.7718\\-151\\43.94531\\-295.4252\\-151\\41.99219\\-294.3661\\-151\\40.03906\\-292.8273\\-151\\36.13281\\-289.2054\\-151\\34.92273\\-288.1484\\-151\\33.07547\\-286.1953\\-151\\29.68618\\-282.2891\\-151\\28.125\\-280.3359\\-151\\26.95184\\-278.3828\\-151\\25.60484\\-276.4297\\-151\\23.33984\\-272.5234\\-151\\22.00396\\-270.5703\\-151\\21.17283\\-268.6172\\-151\\20.02276\\-266.6641\\-151\\19.46023\\-264.7109\\-151\\18.78231\\-262.7578\\-151\\17.78886\\-260.8047\\-151\\17.21398\\-258.8516\\-151\\16.23457\\-256.8984\\-151\\15.0791\\-252.9922\\-151\\14.30107\\-251.0391\\-151\\13.8172\\-249.0859\\-151\\12.9713\\-245.1797\\-151\\12.2635\\-243.2266\\-151\\11.87151\\-241.2734\\-151\\11.40625\\-237.3672\\-151\\11.02218\\-235.4141\\-151\\10.42737\\-233.4609\\-151\\10.09971\\-231.5078\\-151\\9.728599\\-227.6016\\-151\\9.051724\\-217.8359\\-151\\8.627473\\-213.9297\\-151\\8.614676\\-211.9766\\-151\\8.463542\\-208.0703\\-151\\8.422074\\-202.2109\\-151\\8.44254\\-200.2578\\-151\\8.565267\\-198.3047\\-151\\9.271389\\-192.4453\\-151\\9.553109\\-190.4922\\-151\\9.956287\\-186.5859\\-151\\10.14985\\-182.6797\\-151\\10.32624\\-180.7266\\-151\\10.6756\\-178.7734\\-151\\11.1341\\-176.8203\\-151\\11.48802\\-174.8672\\-151\\11.96145\\-170.9609\\-151\\12.39102\\-169.0078\\-151\\13.04854\\-167.0547\\-151\\13.90301\\-163.1484\\-151\\14.61088\\-161.1953\\-151\\16.47859\\-157.2891\\-151\\18.55469\\-153.7752\\-151\\18.89015\\-153.3828\\-151\\20.00578\\-151.4297\\-151\\22.46094\\-148.4799\\-151\\24.41406\\-146.4222\\-151\\27.26293\\-143.6172\\-151\\30.27344\\-140.9855\\-151\\32.22656\\-139.7026\\-151\\34.17969\\-138.5767\\-151\\36.13281\\-137.2521\\-151\\38.08594\\-136.33\\-151\\40.03906\\-135.1365\\-151\\41.99219\\-134.43\\-151\\43.94531\\-133.4379\\-151\\45.89844\\-132.9109\\-151\\47.85156\\-132.5515\\-151\\51.75781\\-131.2492\\-151\\53.71094\\-130.9465\\-151\\57.61719\\-130.4658\\-151\\61.52344\\-130.0683\\-151\\63.47656\\-130.0124\\-151\\67.38281\\-130.1691\\-151\\71.28906\\-130.401\\-151\\81.05469\\-131.0579\\-151\\84.96094\\-131.5166\\-151\\86.91406\\-132.4135\\-151\\88.86719\\-132.7931\\-151\\90.82031\\-132.9229\\-151\\94.72656\\-132.9948\\-151\\98.63281\\-134.2151\\-151\\100.5859\\-134.2805\\-151\\102.5391\\-134.7552\\-151\\104.4922\\-135.3288\\-151\\106.4453\\-136.0767\\-151\\108.3984\\-136.5103\\-151\\110.3516\\-137.0661\\-151\\112.3047\\-138.1554\\-151\\114.2578\\-138.5285\\-151\\116.2109\\-138.7795\\-151\\118.1641\\-139.1575\\-151\\120.1172\\-140.0032\\-151\\124.0234\\-141.1981\\-151\\125.9766\\-142.1984\\-151\\127.9297\\-142.9569\\-151\\129.8828\\-144.0664\\-151\\131.8359\\-144.8277\\-151\\133.7891\\-145.9595\\-151\\135.7422\\-146.7894\\-151\\137.6953\\-148.0842\\-151\\139.6484\\-149.2408\\-151\\142.5781\\-151.4297\\-151\\147.3832\\-155.3359\\-151\\151.3672\\-159.0991\\-151\\153.4339\\-161.1953\\-151\\157.2266\\-166.103\\-151\\159.2175\\-169.0078\\-151\\161.1328\\-172.4205\\-151\\161.4753\\-172.9141\\-151\\162.2228\\-174.8672\\-151\\163.0939\\-176.8203\\-151\\163.8595\\-178.7734\\-151\\164.3375\\-180.7266\\-151\\165.0391\\-182.7478\\-151\\165.5244\\-184.6328\\-151\\166.7589\\-192.4453\\-151\\167.3087\\-196.3516\\-151\\167.5817\\-200.2578\\-151\\167.649\\-206.1172\\-151\\167.4528\\-211.9766\\-151\\167.073\\-215.8828\\-151\\166.4317\\-219.7891\\-151\\165.6528\\-225.6484\\-151\\165.2261\\-227.6016\\-151\\164.5631\\-229.5547\\-151\\163.7897\\-233.4609\\-151\\162.4079\\-237.3672\\-151\\161.9843\\-239.3203\\-151\\161.3426\\-241.2734\\-151\\160.3751\\-243.2266\\-151\\159.6858\\-245.1797\\-151\\158.5118\\-247.1328\\-151\\157.7439\\-249.0859\\-151\\156.5524\\-251.0391\\-151\\155.8789\\-252.9922\\-151\\154.6502\\-254.9453\\-151\\153.6874\\-256.8984\\-151\\153.3203\\-257.3408\\-151\\151.3672\\-260.2549\\-151\\150.9032\\-260.8047\\-151\\149.7685\\-262.7578\\-151\\148.3931\\-264.7109\\-151\\146.7863\\-266.6641\\-151\\143.3281\\-270.5703\\-151\\141.7827\\-272.5234\\-151\\139.6484\\-274.7589\\-151\\137.7887\\-276.4297\\-151\\135.8193\\-278.3828\\-151\\133.6931\\-280.3359\\-151\\129.8828\\-283.4003\\-151\\128.9216\\-284.2422\\-151\\125.9766\\-286.6001\\-151\\120.1172\\-290.3406\\-151\\118.1641\\-291.3637\\-151\\116.2109\\-292.7232\\-151\\114.2578\\-293.6424\\-151\\112.3047\\-294.7539\\-151\\110.3516\\-295.3776\\-151\\108.3984\\-296.4201\\-151\\106.4453\\-297.0395\\-151\\102.5391\\-298.7666\\-151\\100.5859\\-299.4001\\-151\\98.63281\\-300.2229\\-151\\96.67969\\-300.6838\\-151\\92.77344\\-301.4311\\-151\\90.82031\\-301.9931\\-151\\88.86719\\-302.4012\\-151\\86.91406\\-302.6466\\-151\\81.05469\\-303.0244\\-151\\75.19531\\-303.3135\\-151\\71.28906\\-303.3135\\-151\\67.38281\\-303.1053\\-151\\61.52344\\-302.6648\\-151" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "183" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.9604\\-149\\-83.00781\\-303.3105\\-149\\-84.96094\\-303.0453\\-149\\-88.86719\\-302.6533\\-149\\-90.82031\\-302.3477\\-149\\-94.72656\\-301.2218\\-149\\-98.63281\\-300.3088\\-149\\-100.5859\\-299.4001\\-149\\-102.5391\\-298.6814\\-149\\-104.4922\\-297.6522\\-149\\-106.4453\\-296.8308\\-149\\-110.3516\\-294.9475\\-149\\-114.2578\\-292.7522\\-149\\-116.2109\\-291.2351\\-149\\-118.1641\\-289.8651\\-149\\-120.1172\\-288.7799\\-149\\-122.0703\\-287.2223\\-149\\-125.9766\\-283.8329\\-149\\-127.9297\\-282.347\\-149\\-129.8828\\-280.5279\\-149\\-131.908\\-278.3828\\-149\\-133.8833\\-276.4297\\-149\\-135.7422\\-274.3936\\-149\\-137.0908\\-272.5234\\-149\\-138.7236\\-270.5703\\-149\\-140.4757\\-268.6172\\-149\\-142.002\\-266.6641\\-149\\-143.0092\\-264.7109\\-149\\-145.8008\\-260.8047\\-149\\-146.8949\\-258.8516\\-149\\-148.1981\\-256.8984\\-149\\-149.1361\\-254.9453\\-149\\-150.222\\-252.9922\\-149\\-151.0706\\-251.0391\\-149\\-152.2455\\-249.0859\\-149\\-154.189\\-245.1797\\-149\\-154.9769\\-243.2266\\-149\\-155.952\\-241.2734\\-149\\-156.4512\\-239.3203\\-149\\-157.4136\\-237.3672\\-149\\-158.8477\\-233.4609\\-149\\-159.7991\\-231.5078\\-149\\-160.3353\\-229.5547\\-149\\-161.7362\\-225.6484\\-149\\-162.4288\\-221.7422\\-149\\-162.9552\\-219.7891\\-149\\-163.6136\\-217.8359\\-149\\-164.2439\\-213.9297\\-149\\-164.6142\\-211.9766\\-149\\-165.5099\\-208.0703\\-149\\-165.7056\\-206.1172\\-149\\-165.9614\\-202.2109\\-149\\-166.0156\\-198.3047\\-149\\-165.976\\-196.3516\\-149\\-165.6988\\-192.4453\\-149\\-165.4358\\-190.4922\\-149\\-164.3455\\-186.5859\\-149\\-163.9464\\-184.6328\\-149\\-163.4294\\-182.6797\\-149\\-162.5325\\-180.7266\\-149\\-161.9672\\-178.7734\\-149\\-160.0349\\-174.8672\\-149\\-158.6488\\-172.9141\\-149\\-157.4779\\-170.9609\\-149\\-155.2734\\-167.874\\-149\\-153.3203\\-165.5293\\-149\\-151.0827\\-163.1484\\-149\\-149.4141\\-161.2563\\-149\\-147.2938\\-159.2422\\-149\\-145.5078\\-157.8461\\-149\\-141.6016\\-154.4533\\-149\\-139.6484\\-152.9823\\-149\\-137.6953\\-152.0209\\-149\\-136.9525\\-151.4297\\-149\\-133.7891\\-149.3022\\-149\\-131.8359\\-148.2342\\-149\\-129.8828\\-146.9986\\-149\\-127.9297\\-146.3135\\-149\\-125.9766\\-145.2309\\-149\\-124.0234\\-144.5268\\-149\\-122.0703\\-143.4818\\-149\\-116.2109\\-140.8934\\-149\\-114.2578\\-140.3387\\-149\\-112.3047\\-139.4816\\-149\\-110.3516\\-138.8747\\-149\\-108.3984\\-138.4188\\-149\\-106.4453\\-137.5584\\-149\\-102.5391\\-136.3802\\-149\\-100.5859\\-135.5341\\-149\\-96.67969\\-134.6041\\-149\\-92.77344\\-133.3963\\-149\\-90.82031\\-133.0498\\-149\\-86.91406\\-132.5943\\-149\\-84.96094\\-132.2217\\-149\\-83.00781\\-131.6358\\-149\\-81.05469\\-131.2387\\-149\\-75.19531\\-130.7015\\-149\\-71.28906\\-130.4365\\-149\\-67.38281\\-130.3021\\-149\\-63.47656\\-130.3322\\-149\\-59.57031\\-130.5509\\-149\\-55.66406\\-130.8738\\-149\\-53.71094\\-131.0981\\-149\\-51.75781\\-131.4678\\-149\\-49.80469\\-132.1744\\-149\\-47.85156\\-132.651\\-149\\-45.89844\\-132.9229\\-149\\-43.94531\\-133.3767\\-149\\-41.99219\\-134.2624\\-149\\-40.03906\\-134.9495\\-149\\-38.17033\\-135.8047\\-149\\-36.13281\\-136.8439\\-149\\-34.17969\\-138.0168\\-149\\-32.22656\\-138.9801\\-149\\-28.45721\\-141.6641\\-149\\-26.32398\\-143.6172\\-149\\-22.46094\\-147.6641\\-149\\-19.54369\\-151.4297\\-149\\-18.24951\\-153.3828\\-149\\-17.34484\\-155.3359\\-149\\-16.11628\\-157.2891\\-149\\-15.40006\\-159.2422\\-149\\-14.40774\\-161.1953\\-149\\-13.83846\\-163.1484\\-149\\-12.98545\\-167.0547\\-149\\-12.29519\\-169.0078\\-149\\-11.91518\\-170.9609\\-149\\-11.51399\\-174.8672\\-149\\-11.21841\\-176.8203\\-149\\-10.39567\\-180.7266\\-149\\-10.1279\\-182.6797\\-149\\-9.990618\\-184.6328\\-149\\-9.826078\\-188.5391\\-149\\-9.79366\\-190.4922\\-149\\-9.946986\\-196.3516\\-149\\-9.928386\\-200.2578\\-149\\-9.973204\\-204.1641\\-149\\-9.727515\\-208.0703\\-149\\-9.557088\\-213.9297\\-149\\-9.6952\\-219.7891\\-149\\-9.811908\\-221.7422\\-149\\-10.17253\\-225.6484\\-149\\-11.24563\\-227.6016\\-149\\-10.94593\\-229.5547\\-149\\-11.30106\\-231.5078\\-149\\-11.92197\\-237.3672\\-149\\-12.2635\\-239.3203\\-149\\-12.86677\\-241.2734\\-149\\-13.31505\\-243.2266\\-149\\-14.03073\\-247.1328\\-149\\-14.64844\\-249.0675\\-149\\-15.39924\\-251.0391\\-149\\-15.8864\\-252.9922\\-149\\-17.49717\\-256.8984\\-149\\-18.0603\\-258.8516\\-149\\-19.11542\\-260.8047\\-149\\-19.63909\\-262.7578\\-149\\-20.4094\\-264.7109\\-149\\-22.46094\\-268.8232\\-149\\-24.41406\\-272.2278\\-149\\-24.65278\\-272.5234\\-149\\-25.56046\\-274.4766\\-149\\-26.7817\\-276.4297\\-149\\-27.80404\\-278.3828\\-149\\-30.27344\\-281.7031\\-149\\-30.78562\\-282.2891\\-149\\-31.96565\\-284.2422\\-149\\-33.32753\\-286.1953\\-149\\-34.95708\\-288.1484\\-149\\-36.79456\\-290.1016\\-149\\-40.03906\\-293.6745\\-149\\-43.94531\\-296.7798\\-149\\-45.89844\\-298.1685\\-149\\-47.85156\\-299.226\\-149\\-49.80469\\-300.4138\\-149\\-51.75781\\-301.0621\\-149\\-55.66406\\-302.5179\\-149\\-59.57031\\-303.1166\\-149\\-63.47656\\-303.9478\\-149\\-65.42969\\-304.2081\\-149\\-69.33594\\-304.409\\-149\\-73.24219\\-304.3877\\-149\\-77.14844\\-304.1988\\-149" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "179" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "28" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.3186\\-149\\55.66406\\-301.159\\-149\\53.71094\\-300.6819\\-149\\51.75781\\-299.9206\\-149\\47.85156\\-297.9217\\-149\\45.89844\\-296.7767\\-149\\43.94531\\-295.4289\\-149\\41.99219\\-294.3802\\-149\\40.03906\\-292.8198\\-149\\36.13281\\-289.211\\-149\\34.92606\\-288.1484\\-149\\33.07547\\-286.1953\\-149\\29.66391\\-282.2891\\-149\\28.08679\\-280.3359\\-149\\26.92057\\-278.3828\\-149\\25.57216\\-276.4297\\-149\\23.34449\\-272.5234\\-149\\22.04606\\-270.5703\\-149\\21.21538\\-268.6172\\-149\\20.05558\\-266.6641\\-149\\18.78231\\-262.7578\\-149\\17.78264\\-260.8047\\-149\\17.19527\\-258.8516\\-149\\16.21462\\-256.8984\\-149\\15.0303\\-252.9922\\-149\\14.24893\\-251.0391\\-149\\12.95906\\-245.1797\\-149\\12.24002\\-243.2266\\-149\\11.8606\\-241.2734\\-149\\11.38762\\-237.3672\\-149\\10.98633\\-235.4141\\-149\\10.39567\\-233.4609\\-149\\10.08606\\-231.5078\\-149\\9.709555\\-227.6016\\-149\\9.028081\\-217.8359\\-149\\8.708294\\-213.9297\\-149\\8.452972\\-208.0703\\-149\\8.402122\\-200.2578\\-149\\8.4851\\-198.3047\\-149\\9.190813\\-192.4453\\-149\\9.788877\\-188.5391\\-149\\9.956287\\-186.5859\\-149\\10.16488\\-182.6797\\-149\\10.36516\\-180.7266\\-149\\11.21511\\-176.8203\\-149\\11.53927\\-174.8672\\-149\\11.98774\\-170.9609\\-149\\12.42963\\-169.0078\\-149\\13.08457\\-167.0547\\-149\\13.89591\\-163.1484\\-149\\14.58185\\-161.1953\\-149\\15.55675\\-159.2422\\-149\\16.41323\\-157.2891\\-149\\19.96228\\-151.4297\\-149\\22.46094\\-148.4538\\-149\\24.41406\\-146.3725\\-149\\27.18991\\-143.6172\\-149\\30.27344\\-140.9395\\-149\\32.22656\\-139.6383\\-149\\34.17969\\-138.5181\\-149\\36.13281\\-137.1675\\-149\\38.08594\\-136.2251\\-149\\40.03906\\-135.0652\\-149\\41.99219\\-134.3463\\-149\\43.94531\\-133.3567\\-149\\47.85156\\-132.4645\\-149\\49.80469\\-131.6962\\-149\\51.75781\\-131.1813\\-149\\59.57031\\-130.1081\\-149\\61.52344\\-129.8645\\-149\\63.47656\\-129.7709\\-149\\67.38281\\-129.9529\\-149\\73.24219\\-130.4307\\-149\\79.10156\\-130.8353\\-149\\83.00781\\-131.1416\\-149\\84.96094\\-131.346\\-149\\86.91406\\-132.1028\\-149\\88.86719\\-132.6399\\-149\\90.82031\\-132.8158\\-149\\92.77344\\-132.8221\\-149\\94.72656\\-132.9342\\-149\\96.67969\\-133.6187\\-149\\98.63281\\-134.0677\\-149\\100.5859\\-134.1771\\-149\\102.5391\\-134.6059\\-149\\106.4453\\-135.8126\\-149\\108.3984\\-136.2867\\-149\\110.3516\\-136.9183\\-149\\112.3047\\-137.9943\\-149\\114.2578\\-138.3729\\-149\\118.1641\\-138.9968\\-149\\122.0703\\-140.4588\\-149\\124.0234\\-141.0272\\-149\\125.9766\\-141.9735\\-149\\127.9297\\-142.798\\-149\\129.8828\\-143.8685\\-149\\131.8359\\-144.7228\\-149\\133.7891\\-145.7916\\-149\\135.7422\\-146.6783\\-149\\139.6484\\-149.0432\\-149\\142.775\\-151.4297\\-149\\143.5547\\-152.1154\\-149\\147.4609\\-155.0827\\-149\\151.3672\\-158.872\\-149\\153.6628\\-161.1953\\-149\\156.5194\\-165.1016\\-149\\157.2266\\-165.9561\\-149\\159.3805\\-169.0078\\-149\\160.4167\\-170.9609\\-149\\161.6313\\-172.9141\\-149\\162.2813\\-174.8672\\-149\\163.2136\\-176.8203\\-149\\163.9238\\-178.7734\\-149\\164.4014\\-180.7266\\-149\\165.1611\\-182.6797\\-149\\165.659\\-184.6328\\-149\\166.5039\\-190.4922\\-149\\166.9922\\-192.8848\\-149\\167.4297\\-196.3516\\-149\\167.5563\\-198.3047\\-149\\167.6723\\-202.2109\\-149\\167.6988\\-206.1172\\-149\\167.5981\\-210.0234\\-149\\167.4956\\-211.9766\\-149\\167.1538\\-215.8828\\-149\\166.4686\\-219.7891\\-149\\165.6672\\-225.6484\\-149\\165.2261\\-227.6016\\-149\\164.5538\\-229.5547\\-149\\163.7827\\-233.4609\\-149\\162.3999\\-237.3672\\-149\\161.9724\\-239.3203\\-149\\161.315\\-241.2734\\-149\\160.3504\\-243.2266\\-149\\159.668\\-245.1797\\-149\\158.4861\\-247.1328\\-149\\157.7119\\-249.0859\\-149\\156.5317\\-251.0391\\-149\\155.8475\\-252.9922\\-149\\154.633\\-254.9453\\-149\\153.6505\\-256.8984\\-149\\153.3203\\-257.2874\\-149\\151.3672\\-260.1781\\-149\\150.845\\-260.8047\\-149\\149.6899\\-262.7578\\-149\\148.3367\\-264.7109\\-149\\146.716\\-266.6641\\-149\\143.2192\\-270.5703\\-149\\141.6016\\-272.5145\\-149\\139.6484\\-274.625\\-149\\137.6953\\-276.3708\\-149\\135.6671\\-278.3828\\-149\\133.5954\\-280.3359\\-149\\129.8828\\-283.3734\\-149\\128.9063\\-284.2422\\-149\\125.9766\\-286.5898\\-149\\120.1172\\-290.3525\\-149\\118.1641\\-291.3563\\-149\\116.2109\\-292.7423\\-149\\114.2578\\-293.6778\\-149\\112.3047\\-294.7734\\-149\\110.3516\\-295.4001\\-149\\108.3984\\-296.4619\\-149\\106.4453\\-297.0731\\-149\\104.4922\\-298.0226\\-149\\102.5391\\-298.7769\\-149\\100.5859\\-299.4066\\-149\\98.63281\\-300.2438\\-149\\96.67969\\-300.6953\\-149\\92.77344\\-301.4447\\-149\\90.82031\\-302.0081\\-149\\88.86719\\-302.4101\\-149\\86.91406\\-302.6533\\-149\\81.05469\\-303.0355\\-149\\77.14844\\-303.2336\\-149\\73.24219\\-303.3135\\-149\\71.28906\\-303.2852\\-149\\67.38281\\-303.0678\\-149\\61.52344\\-302.6466\\-149" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "174" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "29" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-304.0209\\-147\\-83.00781\\-303.333\\-147\\-86.91406\\-302.8559\\-147\\-88.86719\\-302.6776\\-147\\-90.82031\\-302.3884\\-147\\-94.72656\\-301.2485\\-147\\-98.63281\\-300.3524\\-147\\-100.5859\\-299.4407\\-147\\-102.5391\\-298.7155\\-147\\-104.4922\\-297.7173\\-147\\-106.4453\\-296.8628\\-147\\-110.3516\\-294.9598\\-147\\-114.2578\\-292.7816\\-147\\-116.2109\\-291.2487\\-147\\-118.1641\\-289.8669\\-147\\-120.1172\\-288.8016\\-147\\-122.0703\\-287.2533\\-147\\-125.9766\\-283.8851\\-147\\-127.9297\\-282.4251\\-147\\-129.8828\\-280.6184\\-147\\-132.0114\\-278.3828\\-147\\-133.9778\\-276.4297\\-147\\-135.7677\\-274.4766\\-147\\-137.1695\\-272.5234\\-147\\-138.8139\\-270.5703\\-147\\-140.557\\-268.6172\\-147\\-142.1102\\-266.6641\\-147\\-143.1013\\-264.7109\\-147\\-145.9246\\-260.8047\\-147\\-147.0349\\-258.8516\\-147\\-148.3077\\-256.8984\\-147\\-149.4141\\-254.7977\\-147\\-151.2798\\-251.0391\\-147\\-153.3203\\-247.34\\-147\\-156.0535\\-241.2734\\-147\\-156.5817\\-239.3203\\-147\\-157.6184\\-237.3672\\-147\\-158.2707\\-235.4141\\-147\\-159.9305\\-231.5078\\-147\\-160.4722\\-229.5547\\-147\\-161.3004\\-227.6016\\-147\\-161.8502\\-225.6484\\-147\\-162.5527\\-221.7422\\-147\\-163.1995\\-219.7891\\-147\\-163.7464\\-217.8359\\-147\\-164.36\\-213.9297\\-147\\-165.332\\-210.0234\\-147\\-165.6567\\-208.0703\\-147\\-165.976\\-204.1641\\-147\\-166.1441\\-200.2578\\-147\\-166.1067\\-196.3516\\-147\\-165.8213\\-192.4453\\-147\\-165.5963\\-190.4922\\-147\\-165.1198\\-188.5391\\-147\\-164.4939\\-186.5859\\-147\\-163.6169\\-182.6797\\-147\\-162.6883\\-180.7266\\-147\\-162.0667\\-178.7734\\-147\\-161.2181\\-176.8203\\-147\\-160.1396\\-174.8672\\-147\\-158.8329\\-172.9141\\-147\\-157.6584\\-170.9609\\-147\\-155.2734\\-167.6746\\-147\\-153.3203\\-165.3625\\-147\\-149.4141\\-161.1168\\-147\\-147.3976\\-159.2422\\-147\\-145.5078\\-157.7738\\-147\\-141.6016\\-154.4216\\-147\\-139.6484\\-152.9465\\-147\\-137.6953\\-152.0077\\-147\\-136.9691\\-151.4297\\-147\\-133.7891\\-149.2649\\-147\\-131.8359\\-148.2076\\-147\\-129.8828\\-146.9663\\-147\\-127.9297\\-146.2856\\-147\\-125.9766\\-145.1947\\-147\\-124.0234\\-144.4809\\-147\\-122.0703\\-143.3934\\-147\\-120.1172\\-142.5724\\-147\\-118.1641\\-141.6107\\-147\\-116.2109\\-140.8161\\-147\\-114.2578\\-140.2513\\-147\\-112.3047\\-139.3642\\-147\\-108.3984\\-138.3239\\-147\\-106.4453\\-137.4217\\-147\\-102.5391\\-136.305\\-147\\-100.5859\\-135.4686\\-147\\-96.67969\\-134.5854\\-147\\-92.77344\\-133.3831\\-147\\-90.82031\\-133.0308\\-147\\-86.91406\\-132.5436\\-147\\-84.96094\\-132.1227\\-147\\-83.00781\\-131.537\\-147\\-81.05469\\-131.1796\\-147\\-75.19531\\-130.6429\\-147\\-71.28906\\-130.3517\\-147\\-67.38281\\-130.181\\-147\\-63.47656\\-130.2159\\-147\\-61.52344\\-130.2964\\-147\\-55.66406\\-130.7381\\-147\\-53.71094\\-131.0054\\-147\\-51.75781\\-131.4131\\-147\\-49.80469\\-132.1114\\-147\\-47.85156\\-132.6439\\-147\\-45.89844\\-132.9349\\-147\\-43.94531\\-133.39\\-147\\-41.99219\\-134.2805\\-147\\-40.03906\\-134.9557\\-147\\-36.13281\\-136.8453\\-147\\-34.17969\\-138.0315\\-147\\-32.22656\\-138.9834\\-147\\-28.42262\\-141.6641\\-147\\-26.30722\\-143.6172\\-147\\-22.46094\\-147.6152\\-147\\-19.50637\\-151.4297\\-147\\-18.21588\\-153.3828\\-147\\-17.3133\\-155.3359\\-147\\-16.08975\\-157.2891\\-147\\-15.38224\\-159.2422\\-147\\-14.39576\\-161.1953\\-147\\-13.82698\\-163.1484\\-147\\-13.00921\\-167.0547\\-147\\-12.33082\\-169.0078\\-147\\-11.92882\\-170.9609\\-147\\-11.54307\\-174.8672\\-147\\-10.97238\\-178.7734\\-147\\-10.4947\\-180.7266\\-147\\-10.18807\\-182.6797\\-147\\-9.94873\\-186.5859\\-147\\-9.896457\\-190.4922\\-147\\-10.03689\\-196.3516\\-147\\-9.994284\\-204.1641\\-147\\-9.789328\\-208.0703\\-147\\-9.658737\\-211.9766\\-147\\-9.72296\\-217.8359\\-147\\-9.86236\\-221.7422\\-147\\-10.01827\\-223.6953\\-147\\-10.64745\\-225.6484\\-147\\-11.57003\\-227.6016\\-147\\-11.04318\\-229.5547\\-147\\-11.38006\\-231.5078\\-147\\-12.01468\\-237.3672\\-147\\-12.36747\\-239.3203\\-147\\-12.98545\\-241.2734\\-147\\-14.09466\\-247.1328\\-147\\-15.50356\\-251.0391\\-147\\-15.99855\\-252.9922\\-147\\-16.95726\\-254.9453\\-147\\-18.24951\\-258.8516\\-147\\-19.23587\\-260.8047\\-147\\-19.72535\\-262.7578\\-147\\-21.51035\\-266.6641\\-147\\-23.57328\\-270.5703\\-147\\-24.84588\\-272.5234\\-147\\-25.6633\\-274.4766\\-147\\-26.92805\\-276.4297\\-147\\-27.95493\\-278.3828\\-147\\-30.27344\\-281.497\\-147\\-30.93957\\-282.2891\\-147\\-33.42223\\-286.1953\\-147\\-35.04284\\-288.1484\\-147\\-40.51947\\-294.0078\\-147\\-43.94531\\-296.741\\-147\\-45.89844\\-298.1038\\-147\\-47.85156\\-299.1987\\-147\\-49.80469\\-300.3959\\-147\\-51.75781\\-301.0574\\-147\\-55.66406\\-302.51\\-147\\-59.57031\\-303.1166\\-147\\-63.47656\\-303.935\\-147\\-65.42969\\-304.1988\\-147\\-67.38281\\-304.3431\\-147\\-71.28906\\-304.4296\\-147\\-75.19531\\-304.3354\\-147" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "30" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.285\\-147\\57.61719\\-301.6489\\-147\\53.71094\\-300.6588\\-147\\51.75781\\-299.875\\-147\\47.86174\\-297.9141\\-147\\45.89844\\-296.7648\\-147\\43.94531\\-295.4058\\-147\\41.99219\\-294.3661\\-147\\40.03906\\-292.8073\\-147\\37.13669\\-290.1016\\-147\\34.94847\\-288.1484\\-147\\33.08823\\-286.1953\\-147\\29.6508\\-282.2891\\-147\\28.07442\\-280.3359\\-147\\26.89807\\-278.3828\\-147\\25.55751\\-276.4297\\-147\\24.5014\\-274.4766\\-147\\22.46094\\-271.0374\\-147\\22.10046\\-270.5703\\-147\\21.24168\\-268.6172\\-147\\20.076\\-266.6641\\-147\\18.78403\\-262.7578\\-147\\17.78264\\-260.8047\\-147\\17.21398\\-258.8516\\-147\\16.20483\\-256.8984\\-147\\15.01778\\-252.9922\\-147\\14.22631\\-251.0391\\-147\\12.9713\\-245.1797\\-147\\12.26054\\-243.2266\\-147\\11.8606\\-241.2734\\-147\\11.38762\\-237.3672\\-147\\10.97238\\-235.4141\\-147\\10.4061\\-233.4609\\-147\\10.08606\\-231.5078\\-147\\9.709555\\-227.6016\\-147\\9.15288\\-219.7891\\-147\\8.518528\\-210.0234\\-147\\8.422074\\-206.1172\\-147\\8.382667\\-200.2578\\-147\\8.44254\\-198.3047\\-147\\9.148186\\-192.4453\\-147\\9.779576\\-188.5391\\-147\\9.946986\\-186.5859\\-147\\10.18025\\-182.6797\\-147\\10.42737\\-180.7266\\-147\\11.28406\\-176.8203\\-147\\11.56649\\-174.8672\\-147\\12.01468\\-170.9609\\-147\\12.48076\\-169.0078\\-147\\13.10614\\-167.0547\\-147\\13.89591\\-163.1484\\-147\\14.56706\\-161.1953\\-147\\15.52998\\-159.2422\\-147\\16.35064\\-157.2891\\-147\\19.92985\\-151.4297\\-147\\22.46094\\-148.4406\\-147\\24.41406\\-146.3306\\-147\\27.13352\\-143.6172\\-147\\30.27344\\-140.8841\\-147\\32.22656\\-139.5327\\-147\\34.17969\\-138.449\\-147\\36.13281\\-137.1156\\-147\\38.08594\\-136.112\\-147\\40.03906\\-134.9955\\-147\\41.99219\\-134.2381\\-147\\43.94531\\-133.2669\\-147\\47.85156\\-132.3507\\-147\\49.80469\\-131.5474\\-147\\51.75781\\-131.1065\\-147\\55.66406\\-130.5766\\-147\\59.57031\\-129.9377\\-147\\61.52344\\-129.7215\\-147\\63.47656\\-129.6198\\-147\\67.38281\\-129.7583\\-147\\69.33594\\-129.8931\\-147\\75.19531\\-130.4733\\-147\\83.00781\\-131.054\\-147\\84.96094\\-131.2387\\-147\\86.91406\\-131.6731\\-147\\88.86719\\-132.3179\\-147\\90.82031\\-132.5889\\-147\\94.72656\\-132.8691\\-147\\96.67969\\-133.4945\\-147\\98.63281\\-133.9076\\-147\\100.5859\\-134.0903\\-147\\102.5391\\-134.4596\\-147\\108.3984\\-135.9589\\-147\\110.3516\\-136.7057\\-147\\112.3047\\-137.5796\\-147\\114.2578\\-137.9485\\-147\\118.1641\\-138.8513\\-147\\120.1172\\-139.4022\\-147\\122.0703\\-140.2773\\-147\\124.0234\\-140.8651\\-147\\125.9341\\-141.6641\\-147\\129.8828\\-143.565\\-147\\131.8359\\-144.5992\\-147\\133.7891\\-145.5303\\-147\\135.7422\\-146.5592\\-147\\139.6484\\-148.8427\\-147\\142.9798\\-151.4297\\-147\\143.5547\\-151.95\\-147\\145.5078\\-153.2779\\-147\\147.4609\\-154.8339\\-147\\151.3672\\-158.6831\\-147\\153.8295\\-161.1953\\-147\\155.3309\\-163.1484\\-147\\156.6145\\-165.1016\\-147\\157.2266\\-165.8199\\-147\\159.4966\\-169.0078\\-147\\160.5202\\-170.9609\\-147\\161.7513\\-172.9141\\-147\\162.3277\\-174.8672\\-147\\163.3085\\-176.8203\\-147\\163.9723\\-178.7734\\-147\\164.4566\\-180.7266\\-147\\165.2508\\-182.6797\\-147\\165.7441\\-184.6328\\-147\\166.6101\\-190.4922\\-147\\167.0588\\-192.4453\\-147\\167.3503\\-194.3984\\-147\\167.5232\\-196.3516\\-147\\167.7289\\-202.2109\\-147\\167.7473\\-206.1172\\-147\\167.6374\\-210.0234\\-147\\167.3891\\-213.9297\\-147\\167.1792\\-215.8828\\-147\\166.4919\\-219.7891\\-147\\165.6672\\-225.6484\\-147\\165.2007\\-227.6016\\-147\\164.5356\\-229.5547\\-147\\163.7612\\-233.4609\\-147\\162.3875\\-237.3672\\-147\\161.9605\\-239.3203\\-147\\161.287\\-241.2734\\-147\\160.3394\\-243.2266\\-147\\159.6375\\-245.1797\\-147\\158.461\\-247.1328\\-147\\157.6796\\-249.0859\\-147\\156.5158\\-251.0391\\-147\\155.8211\\-252.9922\\-147\\154.5993\\-254.9453\\-147\\153.6004\\-256.8984\\-147\\151.3672\\-260.1025\\-147\\150.7892\\-260.8047\\-147\\149.6063\\-262.7578\\-147\\148.2663\\-264.7109\\-147\\146.6585\\-266.6641\\-147\\144.882\\-268.6172\\-147\\141.4577\\-272.5234\\-147\\139.6484\\-274.4524\\-147\\137.6953\\-276.217\\-147\\133.5325\\-280.3359\\-147\\129.8828\\-283.3464\\-147\\128.8837\\-284.2422\\-147\\125.9766\\-286.5689\\-147\\120.1172\\-290.3642\\-147\\118.1641\\-291.3637\\-147\\116.2109\\-292.7498\\-147\\114.2578\\-293.6913\\-147\\112.3047\\-294.7854\\-147\\110.3516\\-295.4325\\-147\\108.3984\\-296.4897\\-147\\106.4453\\-297.1012\\-147\\104.4922\\-298.0627\\-147\\100.5859\\-299.4199\\-147\\98.63281\\-300.2641\\-147\\96.67969\\-300.7067\\-147\\92.77344\\-301.4558\\-147\\90.82031\\-302.0216\\-147\\88.86719\\-302.4227\\-147\\86.91406\\-302.6648\\-147\\81.05469\\-303.0355\\-147\\77.14844\\-303.2249\\-147\\73.24219\\-303.2945\\-147\\71.28906\\-303.2457\\-147\\67.38281\\-303.0453\\-147\\61.52344\\-302.6214\\-147" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "177" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "31" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-304.0553\\-145\\-83.00781\\-303.3633\\-145\\-90.82031\\-302.4189\\-145\\-94.72656\\-301.2835\\-145\\-98.63281\\-300.3828\\-145\\-100.5859\\-299.4703\\-145\\-102.5391\\-298.7489\\-145\\-104.4922\\-297.7863\\-145\\-108.3984\\-295.969\\-145\\-112.1553\\-294.0078\\-145\\-114.2578\\-292.7927\\-145\\-116.2109\\-291.2557\\-145\\-118.1641\\-289.8803\\-145\\-120.1172\\-288.823\\-145\\-123.38\\-286.1953\\-145\\-125.9766\\-283.9241\\-145\\-127.9297\\-282.4844\\-145\\-129.8828\\-280.7002\\-145\\-134.0393\\-276.4297\\-145\\-135.8805\\-274.4766\\-145\\-137.2419\\-272.5234\\-145\\-138.8829\\-270.5703\\-145\\-140.6312\\-268.6172\\-145\\-142.202\\-266.6641\\-145\\-143.2243\\-264.7109\\-145\\-146.0564\\-260.8047\\-145\\-148.4007\\-256.8984\\-145\\-149.4706\\-254.9453\\-145\\-150.374\\-252.9922\\-145\\-151.5046\\-251.0391\\-145\\-152.4665\\-249.0859\\-145\\-153.6501\\-247.1328\\-145\\-154.4124\\-245.1797\\-145\\-155.3601\\-243.2266\\-145\\-156.1422\\-241.2734\\-145\\-156.7253\\-239.3203\\-145\\-157.7755\\-237.3672\\-145\\-158.3739\\-235.4141\\-145\\-159.3667\\-233.4609\\-145\\-160.0438\\-231.5078\\-145\\-160.6198\\-229.5547\\-145\\-161.4898\\-227.6016\\-145\\-161.9486\\-225.6484\\-145\\-162.683\\-221.7422\\-145\\-163.4069\\-219.7891\\-145\\-163.8532\\-217.8359\\-145\\-164.5058\\-213.9297\\-145\\-165.0766\\-211.9766\\-145\\-165.5099\\-210.0234\\-145\\-165.9509\\-206.1172\\-145\\-166.2204\\-202.2109\\-145\\-166.2775\\-200.2578\\-145\\-166.2268\\-196.3516\\-145\\-166.1067\\-194.3984\\-145\\-165.7056\\-190.4922\\-145\\-165.3096\\-188.5391\\-145\\-164.6343\\-186.5859\\-145\\-163.7313\\-182.6797\\-145\\-162.827\\-180.7266\\-145\\-161.3733\\-176.8203\\-145\\-159.1797\\-173.1113\\-145\\-157.7999\\-170.9609\\-145\\-156.2912\\-169.0078\\-145\\-155.2734\\-167.4994\\-145\\-153.3203\\-165.1983\\-145\\-149.4141\\-161.0185\\-145\\-147.4609\\-159.2169\\-145\\-145.5078\\-157.7381\\-145\\-141.6016\\-154.4026\\-145\\-139.6484\\-152.9326\\-145\\-137.6953\\-151.9944\\-145\\-136.9858\\-151.4297\\-145\\-133.7891\\-149.2649\\-145\\-131.8359\\-148.2035\\-145\\-129.8828\\-146.9663\\-145\\-127.9297\\-146.2732\\-145\\-125.9766\\-145.1838\\-145\\-124.0234\\-144.4453\\-145\\-122.0703\\-143.3466\\-145\\-120.1172\\-142.5232\\-145\\-118.1641\\-141.5246\\-145\\-116.2109\\-140.7694\\-145\\-114.2578\\-140.1826\\-145\\-112.3047\\-139.2914\\-145\\-108.3984\\-138.2621\\-145\\-106.4453\\-137.3489\\-145\\-102.5391\\-136.2809\\-145\\-100.5859\\-135.4582\\-145\\-96.67969\\-134.5591\\-145\\-92.77344\\-133.3633\\-145\\-90.82031\\-133.0068\\-145\\-86.91406\\-132.4868\\-145\\-83.00781\\-131.4309\\-145\\-81.05469\\-131.1373\\-145\\-77.14844\\-130.7354\\-145\\-71.28906\\-130.2383\\-145\\-67.38281\\-130.0401\\-145\\-65.42969\\-130.0119\\-145\\-61.52344\\-130.0817\\-145\\-57.61719\\-130.3869\\-145\\-55.66406\\-130.5983\\-145\\-53.71094\\-130.9165\\-145\\-51.75781\\-131.3477\\-145\\-47.85156\\-132.5985\\-145\\-45.89844\\-132.9167\\-145\\-43.94531\\-133.3799\\-145\\-41.99219\\-134.2596\\-145\\-40.03906\\-134.9397\\-145\\-36.13281\\-136.8249\\-145\\-34.17969\\-138.0076\\-145\\-32.22656\\-138.9622\\-145\\-28.34961\\-141.6641\\-145\\-26.20994\\-143.6172\\-145\\-22.45331\\-147.5234\\-145\\-19.46239\\-151.4297\\-145\\-18.15257\\-153.3828\\-145\\-17.28795\\-155.3359\\-145\\-16.06942\\-157.2891\\-145\\-15.37531\\-159.2422\\-145\\-14.41988\\-161.1953\\-145\\-13.83846\\-163.1484\\-145\\-13.0598\\-167.0547\\-145\\-12.39102\\-169.0078\\-145\\-11.96145\\-170.9609\\-145\\-11.72394\\-172.9141\\-145\\-11.36877\\-176.8203\\-145\\-11.10026\\-178.7734\\-145\\-10.2892\\-182.6797\\-145\\-10.02441\\-186.5859\\-145\\-10.00855\\-190.4922\\-145\\-10.18025\\-196.3516\\-145\\-10.07269\\-204.1641\\-145\\-9.732441\\-211.9766\\-145\\-9.79366\\-217.8359\\-145\\-9.932242\\-221.7422\\-145\\-10.06611\\-223.6953\\-145\\-11.2274\\-225.6484\\-145\\-11.58422\\-227.6016\\-145\\-11.09789\\-229.5547\\-145\\-11.42798\\-231.5078\\-145\\-11.81481\\-235.4141\\-145\\-12.07886\\-237.3672\\-145\\-12.46939\\-239.3203\\-145\\-13.07091\\-241.2734\\-145\\-13.77467\\-245.1797\\-145\\-14.18488\\-247.1328\\-145\\-14.99815\\-249.0859\\-145\\-16.1279\\-252.9922\\-145\\-17.12514\\-254.9453\\-145\\-17.68038\\-256.8984\\-145\\-19.31818\\-260.8047\\-145\\-19.80939\\-262.7578\\-145\\-20.78978\\-264.7109\\-145\\-21.61872\\-266.6641\\-145\\-22.75459\\-268.6172\\-145\\-23.68438\\-270.5703\\-145\\-25.00124\\-272.5234\\-145\\-25.77076\\-274.4766\\-145\\-27.06653\\-276.4297\\-145\\-28.13947\\-278.3828\\-145\\-30.27344\\-281.3281\\-145\\-31.05342\\-282.2891\\-145\\-32.375\\-284.2422\\-145\\-33.5095\\-286.1953\\-145\\-35.13137\\-288.1484\\-145\\-40.64289\\-294.0078\\-145\\-43.94531\\-296.6855\\-145\\-45.89844\\-298.0226\\-145\\-49.80469\\-300.3868\\-145\\-51.75781\\-301.0574\\-145\\-55.66406\\-302.51\\-145\\-59.57031\\-303.1013\\-145\\-63.47656\\-303.9221\\-145\\-65.42969\\-304.1988\\-145\\-69.33594\\-304.4159\\-145\\-73.24219\\-304.4159\\-145\\-77.14844\\-304.2531\\-145" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "32" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.2369\\-145\\57.61719\\-301.5944\\-145\\53.71094\\-300.6126\\-145\\51.88519\\-299.8672\\-145\\47.96231\\-297.9141\\-145\\45.89844\\-296.7265\\-145\\43.94531\\-295.383\\-145\\41.99219\\-294.3166\\-145\\40.03906\\-292.7746\\-145\\37.17863\\-290.1016\\-145\\34.98186\\-288.1484\\-145\\33.11377\\-286.1953\\-145\\29.65979\\-282.2891\\-145\\28.08508\\-280.3359\\-145\\26.91118\\-278.3828\\-145\\25.58223\\-276.4297\\-145\\24.41406\\-274.3094\\-145\\22.46094\\-270.9729\\-145\\22.14656\\-270.5703\\-145\\21.26479\\-268.6172\\-145\\20.08928\\-266.6641\\-145\\18.79699\\-262.7578\\-145\\17.79914\\-260.8047\\-145\\17.23987\\-258.8516\\-145\\16.22453\\-256.8984\\-145\\15.0303\\-252.9922\\-145\\14.22631\\-251.0391\\-145\\13.799\\-249.0859\\-145\\13.07091\\-245.1797\\-145\\12.33956\\-243.2266\\-145\\11.89076\\-241.2734\\-145\\11.41357\\-237.3672\\-145\\11.04526\\-235.4141\\-145\\10.47165\\-233.4609\\-145\\10.12074\\-231.5078\\-145\\9.742373\\-227.6016\\-145\\9.170923\\-219.7891\\-145\\8.842468\\-213.9297\\-145\\8.541577\\-210.0234\\-145\\8.354373\\-202.2109\\-145\\8.432241\\-198.3047\\-145\\8.640455\\-196.3516\\-145\\8.965976\\-194.3984\\-145\\9.188286\\-192.4453\\-145\\9.788877\\-188.5391\\-145\\10.21205\\-182.6797\\-145\\10.4947\\-180.7266\\-145\\10.97238\\-178.7734\\-145\\11.59928\\-174.8672\\-145\\12.0503\\-170.9609\\-145\\12.53634\\-169.0078\\-145\\13.14041\\-167.0547\\-145\\13.91457\\-163.1484\\-145\\14.59625\\-161.1953\\-145\\15.50887\\-159.2422\\-145\\16.31394\\-157.2891\\-145\\16.60156\\-156.9108\\-145\\18.55469\\-153.587\\-145\\19.90736\\-151.4297\\-145\\22.46094\\-148.401\\-145\\24.41406\\-146.2939\\-145\\27.08424\\-143.6172\\-145\\30.27344\\-140.8207\\-145\\32.22656\\-139.433\\-145\\34.17969\\-138.3763\\-145\\36.13281\\-137.0385\\-145\\40.03906\\-134.9286\\-145\\41.99219\\-134.1153\\-145\\43.94531\\-133.1817\\-145\\47.85156\\-132.2467\\-145\\49.80469\\-131.4219\\-145\\51.75781\\-131.0457\\-145\\55.66406\\-130.4816\\-145\\59.57031\\-129.7583\\-145\\63.47656\\-129.5106\\-145\\67.38281\\-129.5885\\-145\\71.28906\\-129.8645\\-145\\75.19531\\-130.3347\\-145\\81.05469\\-130.8441\\-145\\84.96094\\-131.1438\\-145\\86.91406\\-131.3788\\-145\\88.86719\\-131.762\\-145\\90.82031\\-132.2517\\-145\\94.72656\\-132.7697\\-145\\100.5859\\-133.7818\\-145\\104.4922\\-134.7543\\-145\\108.3984\\-135.569\\-145\\110.3516\\-136.4921\\-145\\112.3047\\-137.1287\\-145\\114.2578\\-137.4217\\-145\\116.2109\\-138.1926\\-145\\120.1172\\-139.1669\\-145\\122.0703\\-140.0484\\-145\\125.9766\\-141.386\\-145\\127.9297\\-142.435\\-145\\129.8828\\-143.2807\\-145\\131.8359\\-144.4404\\-145\\133.7891\\-145.2542\\-145\\135.7422\\-146.4154\\-145\\137.6953\\-147.4063\\-145\\139.6484\\-148.6498\\-145\\143.5547\\-151.7296\\-145\\145.5078\\-152.982\\-145\\147.4609\\-154.6251\\-145\\152.0908\\-159.2422\\-145\\153.9411\\-161.1953\\-145\\155.5118\\-163.1484\\-145\\156.7034\\-165.1016\\-145\\157.2266\\-165.7069\\-145\\159.5912\\-169.0078\\-145\\160.6099\\-170.9609\\-145\\161.8158\\-172.9141\\-145\\162.384\\-174.8672\\-145\\163.3954\\-176.8203\\-145\\164.5203\\-180.7266\\-145\\165.332\\-182.6797\\-145\\165.7969\\-184.6328\\-145\\166.7668\\-190.4922\\-145\\167.1805\\-192.4453\\-145\\167.4269\\-194.3984\\-145\\167.6764\\-198.3047\\-145\\167.7632\\-202.2109\\-145\\167.7746\\-206.1172\\-145\\167.6607\\-210.0234\\-145\\167.4241\\-213.9297\\-145\\167.1916\\-215.8828\\-145\\166.51\\-219.7891\\-145\\165.6634\\-225.6484\\-145\\165.1877\\-227.6016\\-145\\164.5146\\-229.5547\\-145\\163.7538\\-233.4609\\-145\\162.3796\\-237.3672\\-145\\161.9536\\-239.3203\\-145\\161.2734\\-241.2734\\-145\\160.3172\\-243.2266\\-145\\159.6089\\-245.1797\\-145\\158.4323\\-247.1328\\-145\\157.6425\\-249.0859\\-145\\156.4957\\-251.0391\\-145\\155.7785\\-252.9922\\-145\\154.5581\\-254.9453\\-145\\153.5349\\-256.8984\\-145\\151.3672\\-260.0122\\-145\\150.7269\\-260.8047\\-145\\149.5181\\-262.7578\\-145\\148.1998\\-264.7109\\-145\\146.5949\\-266.6641\\-145\\144.8006\\-268.6172\\-145\\141.3739\\-272.5234\\-145\\139.6484\\-274.3305\\-145\\137.6953\\-276.1321\\-145\\133.7891\\-280.0326\\-145\\129.8828\\-283.3195\\-145\\128.8537\\-284.2422\\-145\\125.9766\\-286.5474\\-145\\120.1172\\-290.3642\\-145\\118.1641\\-291.3711\\-145\\116.2109\\-292.7613\\-145\\114.2578\\-293.7047\\-145\\112.3047\\-294.7903\\-145\\110.3516\\-295.4523\\-145\\108.3984\\-296.511\\-145\\106.4453\\-297.1121\\-145\\104.4922\\-298.1011\\-145\\100.5859\\-299.4423\\-145\\98.63281\\-300.2767\\-145\\96.67969\\-300.7132\\-145\\92.77344\\-301.4671\\-145\\90.82031\\-302.0216\\-145\\88.86719\\-302.4101\\-145\\86.91406\\-302.6466\\-145\\81.05469\\-303.0313\\-145\\77.14844\\-303.2128\\-145\\73.24219\\-303.2546\\-145\\67.38281\\-303.0089\\-145\\61.52344\\-302.5838\\-145" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "191" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "33" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-304.0664\\-143\\-83.00781\\-303.4081\\-143\\-86.91406\\-302.9048\\-143\\-88.86719\\-302.7239\\-143\\-90.82031\\-302.4401\\-143\\-92.77344\\-301.9357\\-143\\-94.72656\\-301.3094\\-143\\-98.63281\\-300.407\\-143\\-100.5859\\-299.5115\\-143\\-102.5391\\-298.7816\\-143\\-108.3984\\-296.0165\\-143\\-112.1798\\-294.0078\\-143\\-114.2578\\-292.8037\\-143\\-116.2109\\-291.2746\\-143\\-118.1641\\-289.9093\\-143\\-120.1172\\-288.823\\-143\\-123.4102\\-286.1953\\-143\\-125.9766\\-283.9772\\-143\\-127.9297\\-282.5428\\-143\\-129.8828\\-280.7556\\-143\\-134.125\\-276.4297\\-143\\-135.9566\\-274.4766\\-143\\-137.3528\\-272.5234\\-143\\-138.9624\\-270.5703\\-143\\-140.6987\\-268.6172\\-143\\-142.2806\\-266.6641\\-143\\-143.3454\\-264.7109\\-143\\-144.6768\\-262.7578\\-143\\-146.1843\\-260.8047\\-143\\-147.4609\\-258.7309\\-143\\-149.6185\\-254.9453\\-143\\-150.4697\\-252.9922\\-143\\-151.6837\\-251.0391\\-143\\-152.5937\\-249.0859\\-143\\-153.8025\\-247.1328\\-143\\-154.5291\\-245.1797\\-143\\-155.5324\\-243.2266\\-143\\-156.8733\\-239.3203\\-143\\-157.8904\\-237.3672\\-143\\-158.4972\\-235.4141\\-143\\-159.5388\\-233.4609\\-143\\-160.7723\\-229.5547\\-143\\-161.6147\\-227.6016\\-143\\-162.0383\\-225.6484\\-143\\-162.352\\-223.6953\\-143\\-162.8454\\-221.7422\\-143\\-163.568\\-219.7891\\-143\\-164.261\\-215.8828\\-143\\-164.668\\-213.9297\\-143\\-165.2982\\-211.9766\\-143\\-165.6528\\-210.0234\\-143\\-165.8911\\-208.0703\\-143\\-166.2332\\-204.1641\\-143\\-166.4367\\-200.2578\\-143\\-166.358\\-196.3516\\-143\\-166.2204\\-194.3984\\-143\\-165.8113\\-190.4922\\-143\\-165.4644\\-188.5391\\-143\\-164.7846\\-186.5859\\-143\\-164.2396\\-184.6328\\-143\\-163.8156\\-182.6797\\-143\\-162.2064\\-178.7734\\-143\\-161.5137\\-176.8203\\-143\\-161.1328\\-176.2778\\-143\\-159.2323\\-172.9141\\-143\\-157.9155\\-170.9609\\-143\\-156.3802\\-169.0078\\-143\\-155.2734\\-167.3169\\-143\\-153.3974\\-165.1016\\-143\\-149.4141\\-160.9268\\-143\\-147.4609\\-159.1201\\-143\\-145.5078\\-157.6869\\-143\\-141.6016\\-154.3907\\-143\\-139.6484\\-152.922\\-143\\-137.6953\\-151.9944\\-143\\-136.9858\\-151.4297\\-143\\-133.7891\\-149.2896\\-143\\-131.8359\\-148.2259\\-143\\-129.8828\\-146.9986\\-143\\-127.9297\\-146.2856\\-143\\-125.9766\\-145.1595\\-143\\-124.0234\\-144.4244\\-143\\-122.0703\\-143.3132\\-143\\-120.1172\\-142.4912\\-143\\-118.1641\\-141.4574\\-143\\-116.2109\\-140.7404\\-143\\-114.2578\\-140.1352\\-143\\-112.3047\\-139.236\\-143\\-108.3984\\-138.2299\\-143\\-106.4453\\-137.3021\\-143\\-102.5391\\-136.2531\\-143\\-100.5859\\-135.4178\\-143\\-96.67969\\-134.5085\\-143\\-92.77344\\-133.3148\\-143\\-90.82031\\-132.9579\\-143\\-86.91406\\-132.4088\\-143\\-84.96094\\-131.8164\\-143\\-83.00781\\-131.3348\\-143\\-81.05469\\-131.0714\\-143\\-75.19531\\-130.4566\\-143\\-69.33594\\-129.9377\\-143\\-65.42969\\-129.7837\\-143\\-61.52344\\-129.7967\\-143\\-59.57031\\-129.9682\\-143\\-53.71094\\-130.8054\\-143\\-51.75781\\-131.238\\-143\\-47.85156\\-132.5353\\-143\\-45.89844\\-132.881\\-143\\-43.94531\\-133.3303\\-143\\-41.99219\\-134.1909\\-143\\-40.03906\\-134.8951\\-143\\-38.08594\\-135.7813\\-143\\-36.13281\\-136.7758\\-143\\-34.17969\\-137.95\\-143\\-32.22656\\-138.9335\\-143\\-30.27344\\-140.3062\\-143\\-28.32031\\-141.5788\\-143\\-26.07579\\-143.6172\\-143\\-22.32247\\-147.5234\\-143\\-19.41076\\-151.4297\\-143\\-18.07251\\-153.3828\\-143\\-17.25447\\-155.3359\\-143\\-16.05261\\-157.2891\\-143\\-15.38495\\-159.2422\\-143\\-14.44615\\-161.1953\\-143\\-13.87293\\-163.1484\\-143\\-13.13008\\-167.0547\\-143\\-12.48238\\-169.0078\\-143\\-12.00701\\-170.9609\\-143\\-11.74472\\-172.9141\\-143\\-11.42082\\-176.8203\\-143\\-11.19626\\-178.7734\\-143\\-10.4061\\-182.6797\\-143\\-10.19597\\-184.6328\\-143\\-10.08606\\-188.5391\\-143\\-10.19597\\-192.4453\\-143\\-10.35525\\-196.3516\\-143\\-10.2983\\-200.2578\\-143\\-10.18025\\-204.1641\\-143\\-10.03062\\-206.1172\\-143\\-10.0297\\-208.0703\\-143\\-9.80788\\-211.9766\\-143\\-9.788877\\-213.9297\\-143\\-9.908424\\-219.7891\\-143\\-10.11366\\-223.6953\\-143\\-10.74219\\-225.5709\\-143\\-11.57715\\-227.6016\\-143\\-11.16161\\-229.5547\\-143\\-11.46656\\-231.5078\\-143\\-11.85438\\-235.4141\\-143\\-12.11684\\-237.3672\\-143\\-12.56662\\-239.3203\\-143\\-13.14041\\-241.2734\\-143\\-13.81382\\-245.1797\\-143\\-14.30107\\-247.1328\\-143\\-15.19165\\-249.0859\\-143\\-16.23457\\-252.9922\\-143\\-17.23214\\-254.9453\\-143\\-17.75568\\-256.8984\\-143\\-18.63994\\-258.8516\\-143\\-19.37737\\-260.8047\\-143\\-19.90539\\-262.7578\\-143\\-20.94822\\-264.7109\\-143\\-21.73504\\-266.6641\\-143\\-22.93044\\-268.6172\\-143\\-23.80732\\-270.5703\\-143\\-25.12267\\-272.5234\\-143\\-25.88232\\-274.4766\\-143\\-27.18406\\-276.4297\\-143\\-28.32031\\-278.3517\\-143\\-29.65943\\-280.3359\\-143\\-31.1561\\-282.2891\\-143\\-32.54229\\-284.2422\\-143\\-33.61328\\-286.1953\\-143\\-35.21845\\-288.1484\\-143\\-38.88768\\-292.0547\\-143\\-40.03906\\-293.3682\\-143\\-41.99219\\-295.0704\\-143\\-43.94531\\-296.6183\\-143\\-45.89844\\-297.9217\\-143\\-49.80469\\-300.3523\\-143\\-51.75781\\-301.0306\\-143\\-55.66406\\-302.4978\\-143\\-59.57031\\-303.0784\\-143\\-61.52344\\-303.4189\\-143\\-63.47656\\-303.8955\\-143\\-65.42969\\-304.1798\\-143\\-67.38281\\-304.3431\\-143\\-71.28906\\-304.4296\\-143\\-73.24219\\-304.4159\\-143\\-77.14844\\-304.2703\\-143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "34" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.1646\\-143\\57.61719\\-301.5138\\-143\\53.71094\\-300.5589\\-143\\49.80469\\-298.8175\\-143\\45.89844\\-296.675\\-143\\43.94531\\-295.3473\\-143\\41.99219\\-294.2372\\-143\\40.03906\\-292.7079\\-143\\37.22796\\-290.1016\\-143\\35.03767\\-288.1484\\-143\\33.15206\\-286.1953\\-143\\29.70489\\-282.2891\\-143\\28.12644\\-280.3359\\-143\\26.93359\\-278.3828\\-143\\25.60695\\-276.4297\\-143\\24.41406\\-274.2586\\-143\\22.46094\\-270.9525\\-143\\22.15787\\-270.5703\\-143\\21.27878\\-268.6172\\-143\\20.11045\\-266.6641\\-143\\18.82234\\-262.7578\\-143\\17.82614\\-260.8047\\-143\\17.25803\\-258.8516\\-143\\16.25504\\-256.8984\\-143\\15.06519\\-252.9922\\-143\\14.25909\\-251.0391\\-143\\13.45351\\-247.1328\\-143\\13.18027\\-245.1797\\-143\\12.45301\\-243.2266\\-143\\11.94018\\-241.2734\\-143\\11.48135\\-237.3672\\-143\\11.16706\\-235.4141\\-143\\10.59358\\-233.4609\\-143\\10.18807\\-231.5078\\-143\\9.784138\\-227.6016\\-143\\9.238401\\-219.7891\\-143\\9.185987\\-217.8359\\-143\\8.965976\\-213.9297\\-143\\8.627473\\-210.0234\\-143\\8.327096\\-202.2109\\-143\\8.44254\\-198.3047\\-143\\8.680555\\-196.3516\\-143\\9.038255\\-194.3984\\-143\\9.606996\\-190.4922\\-143\\9.83042\\-188.5391\\-143\\10.09285\\-184.6328\\-143\\10.28022\\-182.6797\\-143\\10.59358\\-180.7266\\-143\\11.04736\\-178.7734\\-143\\11.37241\\-176.8203\\-143\\12.08726\\-170.9609\\-143\\13.177\\-167.0547\\-143\\13.93769\\-163.1484\\-143\\14.62573\\-161.1953\\-143\\15.51011\\-159.2422\\-143\\16.29352\\-157.2891\\-143\\16.60156\\-156.8756\\-143\\18.55469\\-153.5197\\-143\\19.87206\\-151.4297\\-143\\22.46094\\-148.3273\\-143\\24.41406\\-146.2377\\-143\\27.01595\\-143.6172\\-143\\28.32031\\-142.406\\-143\\30.27344\\-140.7505\\-143\\32.22656\\-139.342\\-143\\34.17969\\-138.3092\\-143\\36.13281\\-136.9545\\-143\\38.16451\\-135.8047\\-143\\40.03906\\-134.8565\\-143\\43.94531\\-133.1084\\-143\\45.89844\\-132.7044\\-143\\47.85156\\-132.1227\\-143\\49.80469\\-131.3158\\-143\\53.71094\\-130.7049\\-143\\55.66406\\-130.342\\-143\\57.61719\\-129.8787\\-143\\59.57031\\-129.5885\\-143\\63.47656\\-129.3912\\-143\\67.38281\\-129.44\\-143\\71.28906\\-129.6523\\-143\\75.19531\\-130.1447\\-143\\79.10156\\-130.5433\\-143\\81.05469\\-130.8024\\-143\\83.00781\\-130.8933\\-143\\86.91406\\-131.2216\\-143\\88.86719\\-131.4773\\-143\\92.77344\\-132.4214\\-143\\98.63281\\-133.1284\\-143\\100.5859\\-133.4733\\-143\\104.4922\\-134.5363\\-143\\108.3984\\-135.3253\\-143\\110.3516\\-136.5194\\-143\\112.3047\\-136.9099\\-143\\114.2578\\-137.1675\\-143\\118.1641\\-138.5542\\-143\\120.1172\\-138.977\\-143\\124.0234\\-140.5227\\-143\\125.9766\\-141.1353\\-143\\127.9297\\-142.1996\\-143\\129.8828\\-143.0374\\-143\\131.8359\\-144.2458\\-143\\133.7891\\-145.0257\\-143\\135.7422\\-146.2368\\-143\\137.6953\\-147.137\\-143\\139.6484\\-148.4383\\-143\\141.6016\\-149.9916\\-143\\145.5078\\-152.7614\\-143\\147.4609\\-154.432\\-143\\152.2481\\-159.2422\\-143\\154.0699\\-161.1953\\-143\\155.6597\\-163.1484\\-143\\156.8287\\-165.1016\\-143\\157.2266\\-165.5529\\-143\\159.6884\\-169.0078\\-143\\160.6937\\-170.9609\\-143\\161.8778\\-172.9141\\-143\\162.4453\\-174.8672\\-143\\163.4857\\-176.8203\\-143\\164.5986\\-180.7266\\-143\\165.4185\\-182.6797\\-143\\165.8537\\-184.6328\\-143\\166.5197\\-188.5391\\-143\\167.2664\\-192.4453\\-143\\167.6334\\-196.3516\\-143\\167.8022\\-202.2109\\-143\\167.7974\\-206.1172\\-143\\167.6018\\-211.9766\\-143\\167.2296\\-215.8828\\-143\\166.5315\\-219.7891\\-143\\165.6561\\-225.6484\\-143\\165.1611\\-227.6016\\-143\\164.4853\\-229.5547\\-143\\163.7351\\-233.4609\\-143\\162.3551\\-237.3672\\-143\\161.9436\\-239.3203\\-143\\161.2455\\-241.2734\\-143\\160.2997\\-243.2266\\-143\\159.5766\\-245.1797\\-143\\158.3974\\-247.1328\\-143\\157.6135\\-249.0859\\-143\\156.4711\\-251.0391\\-143\\155.731\\-252.9922\\-143\\154.518\\-254.9453\\-143\\153.3203\\-257.0323\\-143\\151.3672\\-259.9088\\-143\\150.6587\\-260.8047\\-143\\148.1142\\-264.7109\\-143\\146.5145\\-266.6641\\-143\\144.7119\\-268.6172\\-143\\141.2714\\-272.5234\\-143\\139.6484\\-274.2455\\-143\\137.3125\\-276.4297\\-143\\133.7891\\-279.9815\\-143\\129.8828\\-283.2926\\-143\\128.8236\\-284.2422\\-143\\125.9766\\-286.5118\\-143\\120.1172\\-290.3406\\-143\\118.1641\\-291.3786\\-143\\116.2109\\-292.7697\\-143\\114.2578\\-293.7238\\-143\\112.3047\\-294.8024\\-143\\110.3516\\-295.4659\\-143\\108.3984\\-296.5286\\-143\\106.4453\\-297.1295\\-143\\104.4922\\-298.1258\\-143\\100.5859\\-299.4577\\-143\\98.63281\\-300.2767\\-143\\96.67969\\-300.7181\\-143\\92.77344\\-301.4558\\-143\\90.82031\\-302.0081\\-143\\88.86719\\-302.3884\\-143\\84.96094\\-302.7804\\-143\\81.05469\\-303.0176\\-143\\77.14844\\-303.1839\\-143\\75.19531\\-303.2128\\-143\\71.28906\\-303.1638\\-143\\63.47656\\-302.7239\\-143\\61.52344\\-302.53\\-143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "182" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "35" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-303.811\\-141\\-83.00781\\-303.4055\\-141\\-84.96094\\-303.1166\\-141\\-88.86719\\-302.7239\\-141\\-90.82031\\-302.4441\\-141\\-92.77344\\-301.9357\\-141\\-94.72656\\-301.2999\\-141\\-98.63281\\-300.4157\\-141\\-100.5859\\-299.5439\\-141\\-102.5391\\-298.8023\\-141\\-108.3984\\-296.0318\\-141\\-112.2037\\-294.0078\\-141\\-114.2578\\-292.7969\\-141\\-116.2109\\-291.2794\\-141\\-118.1641\\-289.9233\\-141\\-120.1172\\-288.8359\\-141\\-123.4207\\-286.1953\\-141\\-125.9766\\-284.0038\\-141\\-127.9297\\-282.5561\\-141\\-129.8828\\-280.7826\\-141\\-132.203\\-278.3828\\-141\\-134.2054\\-276.4297\\-141\\-136.0156\\-274.4766\\-141\\-137.4455\\-272.5234\\-141\\-139.0373\\-270.5703\\-141\\-140.7478\\-268.6172\\-141\\-142.3435\\-266.6641\\-141\\-143.4652\\-264.7109\\-141\\-144.7524\\-262.7578\\-141\\-146.2764\\-260.8047\\-141\\-147.5152\\-258.8516\\-141\\-148.5743\\-256.8984\\-141\\-149.7396\\-254.9453\\-141\\-150.5572\\-252.9922\\-141\\-151.8076\\-251.0391\\-141\\-152.7077\\-249.0859\\-141\\-153.9063\\-247.1328\\-141\\-154.6285\\-245.1797\\-141\\-155.6626\\-243.2266\\-141\\-156.2847\\-241.2734\\-141\\-157.0268\\-239.3203\\-141\\-157.9749\\-237.3672\\-141\\-158.6242\\-235.4141\\-141\\-159.6444\\-233.4609\\-141\\-160.2189\\-231.5078\\-141\\-160.915\\-229.5547\\-141\\-161.7113\\-227.6016\\-141\\-162.4246\\-223.6953\\-141\\-163.6766\\-219.7891\\-141\\-164.3566\\-215.8828\\-141\\-164.8466\\-213.9297\\-141\\-165.455\\-211.9766\\-141\\-165.9958\\-208.0703\\-141\\-166.358\\-204.1641\\-141\\-166.6028\\-200.2578\\-141\\-166.4919\\-196.3516\\-141\\-166.3319\\-194.3984\\-141\\-165.8923\\-190.4922\\-141\\-165.5723\\-188.5391\\-141\\-164.3304\\-184.6328\\-141\\-163.8767\\-182.6797\\-141\\-163.1705\\-180.7266\\-141\\-162.2813\\-178.7734\\-141\\-161.6211\\-176.8203\\-141\\-160.4252\\-174.8672\\-141\\-159.3959\\-172.9141\\-141\\-158.0067\\-170.9609\\-141\\-156.4834\\-169.0078\\-141\\-155.2734\\-167.14\\-141\\-153.5382\\-165.1016\\-141\\-149.4141\\-160.8539\\-141\\-147.4609\\-159.0741\\-141\\-145.5078\\-157.684\\-141\\-141.6016\\-154.4091\\-141\\-139.6484\\-152.9326\\-141\\-137.6953\\-152.0077\\-141\\-136.9629\\-151.4297\\-141\\-133.7891\\-149.328\\-141\\-131.8359\\-148.2672\\-141\\-129.8828\\-147.0453\\-141\\-127.9297\\-146.3182\\-141\\-125.9766\\-145.1838\\-141\\-124.0234\\-144.447\\-141\\-122.0703\\-143.3242\\-141\\-120.1172\\-142.4912\\-141\\-118.1641\\-141.4447\\-141\\-116.2109\\-140.7287\\-141\\-114.2578\\-140.1139\\-141\\-112.3047\\-139.2127\\-141\\-108.3984\\-138.207\\-141\\-106.4453\\-137.2813\\-141\\-102.5391\\-136.2016\\-141\\-100.5859\\-135.3608\\-141\\-96.67969\\-134.4436\\-141\\-94.72656\\-133.7824\\-141\\-92.77344\\-133.2278\\-141\\-88.86719\\-132.6554\\-141\\-86.91406\\-132.3009\\-141\\-84.96094\\-131.6475\\-141\\-83.00781\\-131.2387\\-141\\-75.19531\\-130.3147\\-141\\-69.33594\\-129.7096\\-141\\-65.42969\\-129.5683\\-141\\-61.52344\\-129.5783\\-141\\-59.57031\\-129.7215\\-141\\-53.71094\\-130.7074\\-141\\-51.75781\\-131.1161\\-141\\-49.80469\\-131.6594\\-141\\-47.85156\\-132.4466\\-141\\-43.94531\\-133.2412\\-141\\-41.99219\\-134.0742\\-141\\-38.08594\\-135.6371\\-141\\-34.17969\\-137.8619\\-141\\-32.22656\\-138.9003\\-141\\-30.27344\\-140.2565\\-141\\-28.32031\\-141.4462\\-141\\-25.95082\\-143.6172\\-141\\-22.18889\\-147.5234\\-141\\-20.50781\\-149.8081\\-141\\-18.02472\\-153.3828\\-141\\-17.25076\\-155.3359\\-141\\-16.06096\\-157.2891\\-141\\-15.39586\\-159.2422\\-141\\-14.47152\\-161.1953\\-141\\-13.90301\\-163.1484\\-141\\-13.1638\\-167.0547\\-141\\-12.52254\\-169.0078\\-141\\-12.02652\\-170.9609\\-141\\-11.77097\\-172.9141\\-141\\-11.24878\\-178.7734\\-141\\-10.4947\\-182.6797\\-141\\-10.26257\\-184.6328\\-141\\-10.15732\\-188.5391\\-141\\-10.31681\\-192.4453\\-141\\-10.53049\\-196.3516\\-141\\-10.53049\\-200.2578\\-141\\-10.31681\\-202.2109\\-141\\-10.07934\\-206.1172\\-141\\-9.859076\\-211.9766\\-141\\-9.84468\\-213.9297\\-141\\-9.960011\\-219.7891\\-141\\-10.16488\\-223.6953\\-141\\-10.39567\\-225.6484\\-141\\-11.57992\\-227.6016\\-141\\-11.36161\\-229.5547\\-141\\-11.49053\\-231.5078\\-141\\-11.87785\\-235.4141\\-141\\-12.14718\\-237.3672\\-141\\-13.17376\\-241.2734\\-141\\-13.82993\\-245.1797\\-141\\-14.34949\\-247.1328\\-141\\-15.24621\\-249.0859\\-141\\-15.70719\\-251.0391\\-141\\-16.30859\\-252.9922\\-141\\-17.28678\\-254.9453\\-141\\-17.80225\\-256.8984\\-141\\-18.76762\\-258.8516\\-141\\-19.42472\\-260.8047\\-141\\-19.97456\\-262.7578\\-141\\-21.05638\\-264.7109\\-141\\-21.8259\\-266.6641\\-141\\-23.06325\\-268.6172\\-141\\-23.91968\\-270.5703\\-141\\-25.20571\\-272.5234\\-141\\-25.98939\\-274.4766\\-141\\-29.74986\\-280.3359\\-141\\-32.61861\\-284.2422\\-141\\-33.68144\\-286.1953\\-141\\-35.29309\\-288.1484\\-141\\-38.92906\\-292.0547\\-141\\-40.03906\\-293.3044\\-141\\-41.99219\\-295.0212\\-141\\-43.94531\\-296.5574\\-141\\-49.80469\\-300.2976\\-141\\-55.66406\\-302.4693\\-141\\-59.57031\\-303.0524\\-141\\-61.52344\\-303.3973\\-141\\-63.47656\\-303.8542\\-141\\-65.42969\\-304.1604\\-141\\-69.33594\\-304.3877\\-141\\-73.24219\\-304.409\\-141\\-77.14844\\-304.2617\\-141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "179" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "36" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-302.088\\-141\\57.61719\\-301.4394\\-141\\53.71094\\-300.5084\\-141\\51.75781\\-299.5852\\-141\\49.80469\\-298.7653\\-141\\47.85156\\-297.6361\\-141\\45.89844\\-296.6304\\-141\\43.94531\\-295.299\\-141\\41.99219\\-294.1528\\-141\\40.03906\\-292.6522\\-141\\38.08594\\-290.8324\\-141\\35.09347\\-288.1484\\-141\\33.19036\\-286.1953\\-141\\29.75125\\-282.2891\\-141\\28.1808\\-280.3359\\-141\\26.95184\\-278.3828\\-141\\25.61455\\-276.4297\\-141\\24.41406\\-274.2411\\-141\\22.46094\\-270.9593\\-141\\22.14656\\-270.5703\\-141\\21.26736\\-268.6172\\-141\\20.12392\\-266.6641\\-141\\18.80976\\-262.7578\\-141\\17.83265\\-260.8047\\-141\\17.28301\\-258.8516\\-141\\16.28675\\-256.8984\\-141\\15.10336\\-252.9922\\-141\\14.28223\\-251.0391\\-141\\13.48016\\-247.1328\\-141\\13.19019\\-245.1797\\-141\\12.53634\\-243.2266\\-141\\12.00701\\-241.2734\\-141\\11.56039\\-237.3672\\-141\\11.28078\\-235.4141\\-141\\10.2892\\-231.5078\\-141\\9.853148\\-227.6016\\-141\\9.355918\\-219.7891\\-141\\9.309506\\-217.8359\\-141\\9.099187\\-213.9297\\-141\\8.8125\\-210.0234\\-141\\8.736879\\-208.0703\\-141\\8.412035\\-204.1641\\-141\\8.34517\\-200.2578\\-141\\8.47425\\-198.3047\\-141\\9.118895\\-194.3984\\-141\\9.88483\\-188.5391\\-141\\10.13513\\-184.6328\\-141\\10.34546\\-182.6797\\-141\\11.11577\\-178.7734\\-141\\11.40625\\-176.8203\\-141\\12.09955\\-170.9609\\-141\\13.20623\\-167.0547\\-141\\13.93769\\-163.1484\\-141\\14.62573\\-161.1953\\-141\\15.51011\\-159.2422\\-141\\16.29352\\-157.2891\\-141\\16.60156\\-156.8718\\-141\\18.55469\\-153.4842\\-141\\19.84168\\-151.4297\\-141\\22.46094\\-148.2793\\-141\\24.41406\\-146.1807\\-141\\26.96132\\-143.6172\\-141\\28.32031\\-142.3387\\-141\\30.27344\\-140.6938\\-141\\32.22656\\-139.2683\\-141\\34.17969\\-138.2186\\-141\\34.74374\\-137.7578\\-141\\38.08594\\-135.7214\\-141\\41.99219\\-133.8436\\-141\\43.94531\\-133.057\\-141\\45.89844\\-132.6501\\-141\\49.80469\\-131.2316\\-141\\53.71094\\-130.6018\\-141\\57.61719\\-129.6635\\-141\\59.57031\\-129.4316\\-141\\61.52344\\-129.3168\\-141\\65.42969\\-129.2723\\-141\\69.33594\\-129.368\\-141\\73.24219\\-129.6092\\-141\\79.10156\\-130.3733\\-141\\81.05469\\-130.6722\\-141\\83.00781\\-130.7788\\-141\\88.86719\\-131.3348\\-141\\90.82031\\-131.7215\\-141\\92.77344\\-132.2579\\-141\\94.72656\\-132.6018\\-141\\98.63281\\-132.9881\\-141\\100.5859\\-133.2835\\-141\\102.5391\\-133.7524\\-141\\104.4922\\-134.3334\\-141\\108.3984\\-135.1371\\-141\\109.7566\\-135.8047\\-141\\110.3516\\-136.2668\\-141\\114.2578\\-136.9971\\-141\\116.2109\\-137.534\\-141\\118.1641\\-138.3573\\-141\\120.1172\\-138.8257\\-141\\122.0703\\-139.4121\\-141\\124.0234\\-140.3124\\-141\\125.9766\\-140.9197\\-141\\129.8828\\-142.8213\\-141\\131.8359\\-143.959\\-141\\133.7891\\-144.8408\\-141\\135.7422\\-146.0083\\-141\\137.6953\\-146.8919\\-141\\141.4248\\-149.4766\\-141\\145.5078\\-152.5767\\-141\\147.4609\\-154.2736\\-141\\149.4141\\-156.1972\\-141\\152.3969\\-159.2422\\-141\\154.2099\\-161.1953\\-141\\155.8206\\-163.1484\\-141\\157.0139\\-165.1016\\-141\\159.7837\\-169.0078\\-141\\160.7734\\-170.9609\\-141\\161.9228\\-172.9141\\-141\\162.5141\\-174.8672\\-141\\163.568\\-176.8203\\-141\\164.687\\-180.7266\\-141\\165.4764\\-182.6797\\-141\\165.9043\\-184.6328\\-141\\166.5847\\-188.5391\\-141\\167.0298\\-190.4922\\-141\\167.335\\-192.4453\\-141\\167.6647\\-196.3516\\-141\\167.8022\\-200.2578\\-141\\167.8317\\-204.1641\\-141\\167.7723\\-208.0703\\-141\\167.6217\\-211.9766\\-141\\167.2549\\-215.8828\\-141\\166.2268\\-221.7422\\-141\\165.6561\\-225.6484\\-141\\165.1338\\-227.6016\\-141\\164.4684\\-229.5547\\-141\\163.7198\\-233.4609\\-141\\162.9697\\-235.4141\\-141\\162.3428\\-237.3672\\-141\\161.9318\\-239.3203\\-141\\161.2015\\-241.2734\\-141\\160.2919\\-243.2266\\-141\\159.5563\\-245.1797\\-141\\158.3846\\-247.1328\\-141\\157.5936\\-249.0859\\-141\\156.4514\\-251.0391\\-141\\155.685\\-252.9922\\-141\\155.2734\\-253.6051\\-141\\153.3754\\-256.8984\\-141\\151.3672\\-259.8201\\-141\\150.5922\\-260.8047\\-141\\148.0429\\-264.7109\\-141\\145.5078\\-267.73\\-141\\141.185\\-272.5234\\-141\\139.6484\\-274.1632\\-141\\137.2845\\-276.4297\\-141\\133.7891\\-279.9439\\-141\\128.8003\\-284.2422\\-141\\125.9766\\-286.5005\\-141\\120.1172\\-290.3406\\-141\\118.1641\\-291.3826\\-141\\116.2109\\-292.777\\-141\\114.2578\\-293.7377\\-141\\112.3047\\-294.8145\\-141\\110.3516\\-295.4794\\-141\\108.3984\\-296.5372\\-141\\106.4453\\-297.1405\\-141\\104.4922\\-298.1378\\-141\\100.5859\\-299.4577\\-141\\98.63281\\-300.2767\\-141\\96.67969\\-300.7132\\-141\\92.77344\\-301.4447\\-141\\90.82031\\-301.9931\\-141\\88.86719\\-302.3793\\-141\\86.91406\\-302.6214\\-141\\81.05469\\-302.9999\\-141\\77.14844\\-303.1557\\-141\\75.19531\\-303.1839\\-141\\71.28906\\-303.1282\\-141\\63.47656\\-302.689\\-141\\61.52344\\-302.4817\\-141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "182" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "37" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-303.84\\-139\\-83.00781\\-303.3922\\-139\\-84.96094\\-303.0933\\-139\\-88.86719\\-302.7239\\-139\\-90.82031\\-302.4526\\-139\\-92.77344\\-301.951\\-139\\-94.72656\\-301.3094\\-139\\-98.63281\\-300.4278\\-139\\-100.5859\\-299.5682\\-139\\-102.5391\\-298.8071\\-139\\-108.3984\\-296.0469\\-139\\-112.2261\\-294.0078\\-139\\-114.2578\\-292.7899\\-139\\-116.2109\\-291.2794\\-139\\-118.1641\\-289.9093\\-139\\-120.1172\\-288.8441\\-139\\-123.4422\\-286.1953\\-139\\-125.9766\\-283.9924\\-139\\-127.9297\\-282.5692\\-139\\-129.8828\\-280.8092\\-139\\-132.2389\\-278.3828\\-139\\-134.2473\\-276.4297\\-139\\-136.0703\\-274.4766\\-139\\-137.5299\\-272.5234\\-139\\-139.0987\\-270.5703\\-139\\-140.8191\\-268.6172\\-139\\-142.3966\\-266.6641\\-139\\-144.842\\-262.7578\\-139\\-146.3408\\-260.8047\\-139\\-147.6431\\-258.8516\\-139\\-148.6468\\-256.8984\\-139\\-149.858\\-254.9453\\-139\\-150.6392\\-252.9922\\-139\\-151.9104\\-251.0391\\-139\\-152.8256\\-249.0859\\-139\\-153.9848\\-247.1328\\-139\\-154.7181\\-245.1797\\-139\\-155.748\\-243.2266\\-139\\-156.3309\\-241.2734\\-139\\-158.0421\\-237.3672\\-139\\-158.7381\\-235.4141\\-139\\-159.7401\\-233.4609\\-139\\-160.2965\\-231.5078\\-139\\-161.794\\-227.6016\\-139\\-162.4962\\-223.6953\\-139\\-163.1995\\-221.7422\\-139\\-163.7612\\-219.7891\\-139\\-164.465\\-215.8828\\-139\\-165.5723\\-211.9766\\-139\\-166.1123\\-208.0703\\-139\\-166.4919\\-204.1641\\-139\\-166.7636\\-200.2578\\-139\\-166.7498\\-198.3047\\-139\\-166.4418\\-194.3984\\-139\\-165.9708\\-190.4922\\-139\\-165.6638\\-188.5391\\-139\\-165.1611\\-186.5859\\-139\\-164.4287\\-184.6328\\-139\\-163.9488\\-182.6797\\-139\\-163.3102\\-180.7266\\-139\\-162.3488\\-178.7734\\-139\\-161.7213\\-176.8203\\-139\\-160.5286\\-174.8672\\-139\\-159.5294\\-172.9141\\-139\\-157.2266\\-169.7813\\-139\\-156.5863\\-169.0078\\-139\\-155.3319\\-167.0547\\-139\\-153.6536\\-165.1016\\-139\\-149.4141\\-160.8031\\-139\\-147.4609\\-159.0596\\-139\\-145.5078\\-157.6984\\-139\\-141.6016\\-154.4397\\-139\\-139.6484\\-152.9683\\-139\\-137.6953\\-152.0392\\-139\\-135.7422\\-150.6427\\-139\\-133.7891\\-149.41\\-139\\-130.4726\\-147.5234\\-139\\-129.8828\\-147.1039\\-139\\-127.9297\\-146.3503\\-139\\-125.9766\\-145.2425\\-139\\-124.0234\\-144.4809\\-139\\-122.0703\\-143.3581\\-139\\-120.1172\\-142.5019\\-139\\-118.1641\\-141.4574\\-139\\-116.2109\\-140.7169\\-139\\-114.2578\\-140.0892\\-139\\-112.3047\\-139.1897\\-139\\-108.3984\\-138.1603\\-139\\-106.4453\\-137.2466\\-139\\-104.4922\\-136.7301\\-139\\-102.5391\\-136.0923\\-139\\-100.5859\\-135.2797\\-139\\-96.67969\\-134.3463\\-139\\-94.72656\\-133.6402\\-139\\-92.77344\\-133.133\\-139\\-88.86719\\-132.5672\\-139\\-86.91406\\-132.1098\\-139\\-84.96094\\-131.4773\\-139\\-83.00781\\-131.1416\\-139\\-77.14844\\-130.448\\-139\\-73.24219\\-129.8506\\-139\\-71.28906\\-129.6504\\-139\\-67.38281\\-129.3949\\-139\\-65.42969\\-129.3605\\-139\\-61.52344\\-129.4142\\-139\\-59.57031\\-129.5461\\-139\\-57.61719\\-129.8099\\-139\\-55.66406\\-130.2576\\-139\\-51.75781\\-130.9866\\-139\\-49.80469\\-131.4624\\-139\\-47.85156\\-132.2629\\-139\\-43.94531\\-133.116\\-139\\-41.99219\\-133.8436\\-139\\-40.03906\\-134.7126\\-139\\-38.08594\\-135.4526\\-139\\-36.13281\\-136.6285\\-139\\-34.17969\\-137.677\\-139\\-32.22656\\-138.8352\\-139\\-30.27344\\-140.175\\-139\\-28.32031\\-141.329\\-139\\-25.81018\\-143.6172\\-139\\-22.03954\\-147.5234\\-139\\-20.50781\\-149.5829\\-139\\-17.98405\\-153.3828\\-139\\-17.24709\\-155.3359\\-139\\-16.08112\\-157.2891\\-139\\-15.41574\\-159.2422\\-139\\-14.52546\\-161.1953\\-139\\-13.92613\\-163.1484\\-139\\-13.18687\\-167.0547\\-139\\-12.53756\\-169.0078\\-139\\-12.05426\\-170.9609\\-139\\-11.79751\\-172.9141\\-139\\-11.47056\\-176.8203\\-139\\-11.25458\\-178.7734\\-139\\-10.5678\\-182.6797\\-139\\-10.33579\\-184.6328\\-139\\-10.23687\\-188.5391\\-139\\-10.2983\\-190.4922\\-139\\-10.64745\\-194.3984\\-139\\-10.75013\\-196.3516\\-139\\-10.63368\\-200.2578\\-139\\-10.39567\\-202.2109\\-139\\-9.997914\\-208.0703\\-139\\-9.905802\\-211.9766\\-139\\-9.992074\\-219.7891\\-139\\-10.22023\\-223.6953\\-139\\-10.47165\\-225.6484\\-139\\-11.59075\\-227.6016\\-139\\-11.51816\\-231.5078\\-139\\-11.90186\\-235.4141\\-139\\-12.19733\\-237.3672\\-139\\-13.20623\\-241.2734\\-139\\-13.84788\\-245.1797\\-139\\-14.32729\\-247.1328\\-139\\-15.1784\\-249.0859\\-139\\-16.36584\\-252.9922\\-139\\-17.31806\\-254.9453\\-139\\-17.8371\\-256.8984\\-139\\-18.85679\\-258.8516\\-139\\-20.03933\\-262.7578\\-139\\-21.13767\\-264.7109\\-139\\-21.90369\\-266.6641\\-139\\-23.14397\\-268.6172\\-139\\-24.03249\\-270.5703\\-139\\-25.26004\\-272.5234\\-139\\-26.06614\\-274.4766\\-139\\-28.62762\\-278.3828\\-139\\-29.81771\\-280.3359\\-139\\-32.6629\\-284.2422\\-139\\-33.74945\\-286.1953\\-139\\-35.35031\\-288.1484\\-139\\-40.03906\\-293.2498\\-139\\-41.99219\\-294.9782\\-139\\-43.94531\\-296.4795\\-139\\-49.80469\\-300.2301\\-139\\-55.66406\\-302.4485\\-139\\-59.57031\\-303.034\\-139\\-65.42969\\-304.1302\\-139\\-69.33594\\-304.3732\\-139\\-73.24219\\-304.402\\-139\\-77.14844\\-304.2531\\-139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "170" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "38" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "59.57031\\-301.9931\\-139\\57.61719\\-301.3825\\-139\\53.71094\\-300.4483\\-139\\51.75781\\-299.4911\\-139\\49.80469\\-298.7131\\-139\\47.85156\\-297.5411\\-139\\45.89844\\-296.5728\\-139\\43.94531\\-295.2431\\-139\\41.99219\\-294.0316\\-139\\40.03906\\-292.582\\-139\\35.13532\\-288.1484\\-139\\33.2224\\-286.1953\\-139\\29.78857\\-282.2891\\-139\\28.2234\\-280.3359\\-139\\25.62225\\-276.4297\\-139\\24.41406\\-274.2586\\-139\\22.46094\\-270.9758\\-139\\22.13542\\-270.5703\\-139\\21.25594\\-268.6172\\-139\\20.12392\\-266.6641\\-139\\18.80787\\-262.7578\\-139\\17.82614\\-260.8047\\-139\\17.30745\\-258.8516\\-139\\16.31974\\-256.8984\\-139\\15.13076\\-252.9922\\-139\\14.30339\\-251.0391\\-139\\13.87533\\-249.0859\\-139\\13.19661\\-245.1797\\-139\\12.08726\\-241.2734\\-139\\11.38762\\-235.4141\\-139\\10.97238\\-233.4609\\-139\\10.43822\\-231.5078\\-139\\10.10665\\-229.5547\\-139\\9.937686\\-227.6016\\-139\\9.591239\\-221.7422\\-139\\9.243983\\-213.9297\\-139\\8.872335\\-208.0703\\-139\\8.44254\\-204.1641\\-139\\8.373119\\-200.2578\\-139\\8.507236\\-198.3047\\-139\\9.250383\\-194.3984\\-139\\9.941499\\-188.5391\\-139\\10.18025\\-184.6328\\-139\\10.39567\\-182.6797\\-139\\11.14695\\-178.7734\\-139\\11.41357\\-176.8203\\-139\\12.09106\\-170.9609\\-139\\13.21572\\-167.0547\\-139\\13.93769\\-163.1484\\-139\\14.61088\\-161.1953\\-139\\15.50424\\-159.2422\\-139\\16.29352\\-157.2891\\-139\\16.60156\\-156.868\\-139\\18.55469\\-153.4293\\-139\\19.79933\\-151.4297\\-139\\22.46094\\-148.2268\\-139\\24.41406\\-146.1273\\-139\\26.9043\\-143.6172\\-139\\28.32031\\-142.2777\\-139\\30.27344\\-140.6364\\-139\\32.22656\\-139.1888\\-139\\34.17969\\-138.1123\\-139\\34.59944\\-137.7578\\-139\\38.08594\\-135.5853\\-139\\40.03906\\-134.719\\-139\\41.99219\\-133.7088\\-139\\43.94531\\-133.0136\\-139\\45.89844\\-132.5994\\-139\\49.80469\\-131.1685\\-139\\53.71094\\-130.4764\\-139\\55.66406\\-129.9377\\-139\\57.61719\\-129.5014\\-139\\59.57031\\-129.3098\\-139\\63.47656\\-129.1459\\-139\\69.33594\\-129.2265\\-139\\73.24219\\-129.3991\\-139\\77.14844\\-129.7837\\-139\\81.05469\\-130.4426\\-139\\88.86719\\-131.2082\\-139\\90.82031\\-131.5166\\-139\\94.72656\\-132.4696\\-139\\100.5859\\-133.133\\-139\\102.5391\\-133.5008\\-139\\104.4922\\-134.0903\\-139\\108.3984\\-134.9591\\-139\\110.3516\\-135.5171\\-139\\112.3047\\-136.2283\\-139\\114.2578\\-136.8324\\-139\\116.2109\\-137.2374\\-139\\118.1641\\-138.0621\\-139\\120.1172\\-138.6666\\-139\\122.0703\\-139.1315\\-139\\124.0234\\-140.0602\\-139\\125.9766\\-140.7173\\-139\\127.9297\\-141.5235\\-139\\131.8359\\-143.5491\\-139\\135.5405\\-145.5703\\-139\\137.6953\\-146.6767\\-139\\141.6016\\-149.2307\\-139\\145.5078\\-152.4063\\-139\\147.4609\\-154.1119\\-139\\149.4141\\-156.0257\\-139\\152.5563\\-159.2422\\-139\\154.3362\\-161.1953\\-139\\155.971\\-163.1484\\-139\\158.4667\\-167.0547\\-139\\159.8804\\-169.0078\\-139\\161.9743\\-172.9141\\-139\\162.5877\\-174.8672\\-139\\163.6292\\-176.8203\\-139\\164.1372\\-178.7734\\-139\\164.7949\\-180.7266\\-139\\165.5503\\-182.6797\\-139\\165.9555\\-184.6328\\-139\\166.6534\\-188.5391\\-139\\167.0876\\-190.4922\\-139\\167.379\\-192.4453\\-139\\167.6839\\-196.3516\\-139\\167.8251\\-200.2578\\-139\\167.8545\\-204.1641\\-139\\167.786\\-208.0703\\-139\\167.6296\\-211.9766\\-139\\167.2778\\-215.8828\\-139\\166.2332\\-221.7422\\-139\\165.6454\\-225.6484\\-139\\165.1057\\-227.6016\\-139\\164.4601\\-229.5547\\-139\\163.7121\\-233.4609\\-139\\162.9552\\-235.4141\\-139\\162.3305\\-237.3672\\-139\\161.9248\\-239.3203\\-139\\161.1866\\-241.2734\\-139\\160.281\\-243.2266\\-139\\159.5459\\-245.1797\\-139\\158.3739\\-247.1328\\-139\\157.5731\\-249.0859\\-139\\156.4392\\-251.0391\\-139\\155.6485\\-252.9922\\-139\\153.3203\\-256.8673\\-139\\152.0051\\-258.8516\\-139\\150.5452\\-260.8047\\-139\\147.9731\\-264.7109\\-139\\146.3593\\-266.6641\\-139\\143.5547\\-269.834\\-139\\139.6484\\-274.1076\\-139\\135.7422\\-277.9327\\-139\\133.7891\\-279.9381\\-139\\128.7613\\-284.2422\\-139\\125.9766\\-286.5005\\-139\\120.1172\\-290.3406\\-139\\118.1641\\-291.3751\\-139\\116.2109\\-292.777\\-139\\114.2578\\-293.7516\\-139\\112.3047\\-294.8337\\-139\\110.3516\\-295.493\\-139\\108.3984\\-296.5493\\-139\\106.4453\\-297.1515\\-139\\104.4922\\-298.1378\\-139\\100.5859\\-299.4703\\-139\\98.63281\\-300.2866\\-139\\96.67969\\-300.7196\\-139\\92.77344\\-301.4558\\-139\\90.82031\\-301.9931\\-139\\88.86719\\-302.37\\-139\\86.91406\\-302.6167\\-139\\81.05469\\-302.9889\\-139\\75.19531\\-303.1638\\-139\\71.28906\\-303.1013\\-139\\63.47656\\-302.6648\\-139\\61.52344\\-302.4315\\-139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "39" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-303.8542\\-137\\-83.00781\\-303.4276\\-137\\-84.96094\\-303.1244\\-137\\-88.86719\\-302.7351\\-137\\-90.82031\\-302.4526\\-137\\-92.77344\\-301.9653\\-137\\-94.72656\\-301.3223\\-137\\-98.63281\\-300.4278\\-137\\-102.5391\\-298.8071\\-137\\-106.4453\\-296.9375\\-137\\-108.3984\\-296.0617\\-137\\-112.2261\\-294.0078\\-137\\-114.2578\\-292.7942\\-137\\-116.2109\\-291.284\\-137\\-118.1641\\-289.9233\\-137\\-120.1172\\-288.8523\\-137\\-123.4531\\-286.1953\\-137\\-125.9766\\-284.0057\\-137\\-127.9297\\-282.582\\-137\\-129.8828\\-280.8205\\-137\\-136.1224\\-274.4766\\-137\\-137.5895\\-272.5234\\-137\\-139.1635\\-270.5703\\-137\\-140.8803\\-268.6172\\-137\\-142.436\\-266.6641\\-137\\-144.9298\\-262.7578\\-137\\-145.5078\\-262.0614\\-137\\-147.7469\\-258.8516\\-137\\-148.7175\\-256.8984\\-137\\-149.9353\\-254.9453\\-137\\-150.7263\\-252.9922\\-137\\-151.9967\\-251.0391\\-137\\-152.9257\\-249.0859\\-137\\-154.0527\\-247.1328\\-137\\-154.8018\\-245.1797\\-137\\-155.8248\\-243.2266\\-137\\-156.3904\\-241.2734\\-137\\-157.3213\\-239.3203\\-137\\-158.8454\\-235.4141\\-137\\-159.8184\\-233.4609\\-137\\-160.3592\\-231.5078\\-137\\-161.8577\\-227.6016\\-137\\-162.5621\\-223.6953\\-137\\-163.3212\\-221.7422\\-137\\-163.8318\\-219.7891\\-137\\-164.5726\\-215.8828\\-137\\-165.2007\\-213.9297\\-137\\-165.66\\-211.9766\\-137\\-166.2204\\-208.0703\\-137\\-166.6448\\-204.1641\\-137\\-166.9537\\-200.2578\\-137\\-166.776\\-196.3516\\-137\\-166.0457\\-190.4922\\-137\\-165.7424\\-188.5391\\-137\\-165.2865\\-186.5859\\-137\\-164.5114\\-184.6328\\-137\\-163.4206\\-180.7266\\-137\\-162.4242\\-178.7734\\-137\\-161.807\\-176.8203\\-137\\-160.6225\\-174.8672\\-137\\-159.6426\\-172.9141\\-137\\-157.2266\\-169.6615\\-137\\-156.6714\\-169.0078\\-137\\-155.4268\\-167.0547\\-137\\-153.7335\\-165.1016\\-137\\-149.4141\\-160.7789\\-137\\-147.4609\\-159.0755\\-137\\-145.5078\\-157.7239\\-137\\-141.6016\\-154.4699\\-137\\-139.6484\\-153.0428\\-137\\-137.6953\\-152.0872\\-137\\-135.7422\\-150.7031\\-137\\-130.3474\\-147.5234\\-137\\-129.8828\\-147.1767\\-137\\-127.9297\\-146.3821\\-137\\-125.9766\\-145.3046\\-137\\-124.0234\\-144.5208\\-137\\-122.0703\\-143.4055\\-137\\-120.1172\\-142.5232\\-137\\-118.1641\\-141.4702\\-137\\-114.2578\\-140.0552\\-137\\-112.3047\\-139.1575\\-137\\-110.3516\\-138.6658\\-137\\-108.3984\\-138.0695\\-137\\-106.4453\\-137.1863\\-137\\-104.4922\\-136.6862\\-137\\-100.5859\\-135.1882\\-137\\-96.67969\\-134.2023\\-137\\-94.72656\\-133.4733\\-137\\-92.77344\\-133.0498\\-137\\-88.86719\\-132.4305\\-137\\-84.96094\\-131.3191\\-137\\-83.00781\\-131.0299\\-137\\-79.10156\\-130.5875\\-137\\-75.19531\\-129.8931\\-137\\-71.28906\\-129.4241\\-137\\-67.38281\\-129.1764\\-137\\-65.42969\\-129.1608\\-137\\-61.52344\\-129.2524\\-137\\-57.61719\\-129.5965\\-137\\-53.71094\\-130.4609\\-137\\-49.80469\\-131.2675\\-137\\-45.89844\\-132.6037\\-137\\-43.94531\\-132.9895\\-137\\-41.99219\\-133.5715\\-137\\-40.03906\\-134.5413\\-137\\-38.08594\\-135.2615\\-137\\-36.13281\\-136.4808\\-137\\-34.17969\\-137.4498\\-137\\-30.70854\\-139.7109\\-137\\-28.32031\\-141.1826\\-137\\-26.36719\\-142.9138\\-137\\-21.89453\\-147.5234\\-137\\-20.36171\\-149.4766\\-137\\-19.24214\\-151.4297\\-137\\-17.96759\\-153.3828\\-137\\-17.24709\\-155.3359\\-137\\-16.10151\\-157.2891\\-137\\-15.44356\\-159.2422\\-137\\-14.58185\\-161.1953\\-137\\-13.94924\\-163.1484\\-137\\-13.24142\\-167.0547\\-137\\-12.625\\-169.0078\\-137\\-12.10814\\-170.9609\\-137\\-11.83143\\-172.9141\\-137\\-11.49462\\-176.8203\\-137\\-11.2754\\-178.7734\\-137\\-10.66142\\-182.6797\\-137\\-10.41667\\-184.6328\\-137\\-10.31681\\-188.5391\\-137\\-10.55519\\-192.4453\\-137\\-10.86796\\-194.3984\\-137\\-10.96156\\-196.3516\\-137\\-10.69\\-200.2578\\-137\\-10.2892\\-204.1641\\-137\\-10.02798\\-208.0703\\-137\\-9.943182\\-211.9766\\-137\\-10.01578\\-219.7891\\-137\\-10.27135\\-223.6953\\-137\\-10.54275\\-225.6484\\-137\\-11.51021\\-227.6016\\-137\\-11.54119\\-231.5078\\-137\\-11.91518\\-235.4141\\-137\\-12.22997\\-237.3672\\-137\\-13.23785\\-241.2734\\-137\\-13.87747\\-245.1797\\-137\\-14.34039\\-247.1328\\-137\\-15.16025\\-249.0859\\-137\\-16.41456\\-252.9922\\-137\\-17.35476\\-254.9453\\-137\\-17.8689\\-256.8984\\-137\\-18.90542\\-258.8516\\-137\\-20.10769\\-262.7578\\-137\\-21.19814\\-264.7109\\-137\\-21.95562\\-266.6641\\-137\\-23.21\\-268.6172\\-137\\-24.12446\\-270.5703\\-137\\-25.3116\\-272.5234\\-137\\-26.14765\\-274.4766\\-137\\-27.36742\\-276.4297\\-137\\-28.707\\-278.3828\\-137\\-29.8865\\-280.3359\\-137\\-32.69777\\-284.2422\\-137\\-33.82138\\-286.1953\\-137\\-35.39088\\-288.1484\\-137\\-40.03906\\-293.1929\\-137\\-41.99219\\-294.9346\\-137\\-43.94531\\-296.4004\\-137\\-49.80469\\-300.1588\\-137\\-53.71094\\-301.6325\\-137\\-55.66406\\-302.4189\\-137\\-57.61719\\-302.7638\\-137\\-61.52344\\-303.333\\-137\\-65.42969\\-304.099\\-137\\-67.38281\\-304.2703\\-137\\-71.28906\\-304.3949\\-137\\-75.19531\\-304.3507\\-137\\-77.14844\\-304.2443\\-137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "172" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "40" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "57.61719\\-301.3026\\-137\\53.71094\\-300.377\\-137\\51.75781\\-299.4073\\-137\\49.80469\\-298.6412\\-137\\47.85156\\-297.429\\-137\\45.89844\\-296.4873\\-137\\42.12042\\-294.0078\\-137\\40.03906\\-292.51\\-137\\35.17718\\-288.1484\\-137\\33.25486\\-286.1953\\-137\\29.82325\\-282.2891\\-137\\28.2527\\-280.3359\\-137\\25.64264\\-276.4297\\-137\\24.41406\\-274.2605\\-137\\22.46094\\-271.0179\\-137\\22.10046\\-270.5703\\-137\\21.24452\\-268.6172\\-137\\20.11045\\-266.6641\\-137\\18.80787\\-262.7578\\-137\\17.82614\\-260.8047\\-137\\17.30363\\-258.8516\\-137\\16.35408\\-256.8984\\-137\\15.15719\\-252.9922\\-137\\14.34949\\-251.0391\\-137\\13.90301\\-249.0859\\-137\\13.25061\\-245.1797\\-137\\12.78057\\-243.2266\\-137\\12.18776\\-241.2734\\-137\\11.89076\\-239.3203\\-137\\11.47056\\-235.4141\\-137\\11.15437\\-233.4609\\-137\\10.22023\\-229.5547\\-137\\10.02798\\-227.6016\\-137\\9.598775\\-219.7891\\-137\\9.359195\\-213.9297\\-137\\8.901743\\-208.0703\\-137\\8.47425\\-204.1641\\-137\\8.402122\\-202.2109\\-137\\8.432241\\-200.2578\\-137\\8.589623\\-198.3047\\-137\\9.409015\\-194.3984\\-137\\9.986291\\-188.5391\\-137\\10.22023\\-184.6328\\-137\\10.41667\\-182.6797\\-137\\11.1443\\-178.7734\\-137\\11.41357\\-176.8203\\-137\\12.07886\\-170.9609\\-137\\13.20623\\-167.0547\\-137\\13.92613\\-163.1484\\-137\\14.58185\\-161.1953\\-137\\15.49831\\-159.2422\\-137\\16.28041\\-157.2891\\-137\\17.47019\\-155.3359\\-137\\18.51563\\-153.3828\\-137\\19.7532\\-151.4297\\-137\\22.46094\\-148.1676\\-137\\24.41406\\-146.0623\\-137\\28.32031\\-142.1936\\-137\\30.27344\\-140.5598\\-137\\32.22656\\-139.1014\\-137\\37.6279\\-135.8047\\-137\\38.08594\\-135.4502\\-137\\40.03906\\-134.6458\\-137\\41.99219\\-133.6002\\-137\\43.94531\\-132.9643\\-137\\45.89844\\-132.5311\\-137\\47.85156\\-131.6837\\-137\\49.80469\\-131.1065\\-137\\53.71094\\-130.3347\\-137\\55.66406\\-129.7096\\-137\\57.61719\\-129.3757\\-137\\61.52344\\-129.098\\-137\\63.47656\\-129.031\\-137\\67.38281\\-129.0219\\-137\\73.24219\\-129.2166\\-137\\77.14844\\-129.5014\\-137\\79.10156\\-129.7583\\-137\\83.00781\\-130.451\\-137\\88.86719\\-131.0662\\-137\\90.82031\\-131.3114\\-137\\92.77344\\-131.6837\\-137\\94.72656\\-132.224\\-137\\96.67969\\-132.5635\\-137\\100.5859\\-132.9762\\-137\\102.5391\\-133.2618\\-137\\104.4922\\-133.7229\\-137\\106.4453\\-134.3169\\-137\\110.3516\\-135.1517\\-137\\112.3047\\-135.7092\\-137\\114.2578\\-136.5544\\-137\\116.2109\\-136.9413\\-137\\118.1641\\-137.5822\\-137\\120.1172\\-138.4269\\-137\\122.0703\\-138.9071\\-137\\124.0234\\-139.6389\\-137\\125.9766\\-140.476\\-137\\127.9297\\-141.1402\\-137\\129.8828\\-142.2799\\-137\\131.8359\\-143.1477\\-137\\133.7891\\-144.3853\\-137\\135.7422\\-145.328\\-137\\139.4892\\-147.5234\\-137\\141.6016\\-148.9176\\-137\\145.5078\\-152.2275\\-137\\147.0058\\-153.3828\\-137\\149.4141\\-155.6875\\-137\\152.843\\-159.2422\\-137\\156.1151\\-163.1484\\-137\\157.4475\\-165.1016\\-137\\158.6153\\-167.0547\\-137\\160.0052\\-169.0078\\-137\\161.1328\\-171.0722\\-137\\162.0422\\-172.9141\\-137\\162.6912\\-174.8672\\-137\\163.6956\\-176.8203\\-137\\164.1981\\-178.7734\\-137\\165.6337\\-182.6797\\-137\\166.724\\-188.5391\\-137\\167.1419\\-190.4922\\-137\\167.6099\\-194.3984\\-137\\167.8431\\-200.2578\\-137\\167.8545\\-204.1641\\-137\\167.7974\\-208.0703\\-137\\167.6296\\-211.9766\\-137\\167.2891\\-215.8828\\-137\\166.5728\\-219.7891\\-137\\165.6337\\-225.6484\\-137\\164.4554\\-229.5547\\-137\\163.7042\\-233.4609\\-137\\162.3305\\-237.3672\\-137\\161.9057\\-239.3203\\-137\\161.1716\\-241.2734\\-137\\160.2702\\-243.2266\\-137\\159.5225\\-245.1797\\-137\\158.3632\\-247.1328\\-137\\157.5521\\-249.0859\\-137\\156.4148\\-251.0391\\-137\\155.6343\\-252.9922\\-137\\153.3203\\-256.7662\\-137\\151.9704\\-258.8516\\-137\\150.5066\\-260.8047\\-137\\149.4141\\-262.5185\\-137\\147.8834\\-264.7109\\-137\\146.2927\\-266.6641\\-137\\141.0935\\-272.5234\\-137\\139.6484\\-274.0732\\-137\\135.7422\\-277.9174\\-137\\133.7891\\-279.9091\\-137\\128.7371\\-284.2422\\-137\\125.9766\\-286.489\\-137\\120.1172\\-290.3285\\-137\\118.1641\\-291.3637\\-137\\116.2109\\-292.7813\\-137\\112.3047\\-294.8457\\-137\\110.3516\\-295.5139\\-137\\108.3984\\-296.5577\\-137\\106.4453\\-297.1515\\-137\\104.4922\\-298.1378\\-137\\100.5859\\-299.4703\\-137\\98.63281\\-300.2866\\-137\\96.67969\\-300.7196\\-137\\92.77344\\-301.4447\\-137\\90.82031\\-301.9793\\-137\\88.86719\\-302.3571\\-137\\86.91406\\-302.6097\\-137\\84.96094\\-302.7527\\-137\\79.10156\\-303.0424\\-137\\75.19531\\-303.136\\-137\\71.28906\\-303.0607\\-137\\65.42969\\-302.7638\\-137\\63.47656\\-302.6097\\-137\\61.52344\\-302.3571\\-137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "185" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "41" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-303.84\\-135\\-84.96094\\-303.1594\\-135\\-88.86719\\-302.7411\\-135\\-90.82031\\-302.461\\-135\\-92.77344\\-301.951\\-135\\-94.72656\\-301.3223\\-135\\-98.63281\\-300.4157\\-135\\-100.5859\\-299.5591\\-135\\-102.5391\\-298.8127\\-135\\-106.4453\\-296.9268\\-135\\-108.3984\\-296.0469\\-135\\-112.2037\\-294.0078\\-135\\-114.2578\\-292.8011\\-135\\-116.2109\\-291.284\\-135\\-118.1641\\-289.9375\\-135\\-120.1172\\-288.8523\\-135\\-123.4422\\-286.1953\\-135\\-125.9766\\-284.0209\\-135\\-127.9297\\-282.582\\-135\\-129.8828\\-280.8316\\-135\\-136.1607\\-274.4766\\-135\\-137.6374\\-272.5234\\-135\\-140.9225\\-268.6172\\-135\\-142.4731\\-266.6641\\-135\\-144.9992\\-262.7578\\-135\\-145.5078\\-262.1575\\-135\\-147.8229\\-258.8516\\-135\\-148.774\\-256.8984\\-135\\-150.0077\\-254.9453\\-135\\-150.7939\\-252.9922\\-135\\-152.0769\\-251.0391\\-135\\-153.0323\\-249.0859\\-135\\-154.1162\\-247.1328\\-135\\-154.8814\\-245.1797\\-135\\-155.9008\\-243.2266\\-135\\-156.4441\\-241.2734\\-135\\-157.4398\\-239.3203\\-135\\-158.9373\\-235.4141\\-135\\-159.8838\\-233.4609\\-135\\-160.4241\\-231.5078\\-135\\-161.2744\\-229.5547\\-135\\-161.901\\-227.6016\\-135\\-162.6275\\-223.6953\\-135\\-163.4294\\-221.7422\\-135\\-163.8911\\-219.7891\\-135\\-164.2226\\-217.8359\\-135\\-164.6893\\-215.8828\\-135\\-165.343\\-213.9297\\-135\\-165.746\\-211.9766\\-135\\-166.5827\\-206.1172\\-135\\-167.0298\\-202.2109\\-135\\-167.1276\\-200.2578\\-135\\-167.0869\\-198.3047\\-135\\-166.9235\\-196.3516\\-135\\-165.8074\\-188.5391\\-135\\-165.3752\\-186.5859\\-135\\-164.5821\\-184.6328\\-135\\-163.5192\\-180.7266\\-135\\-162.4987\\-178.7734\\-135\\-161.873\\-176.8203\\-135\\-160.7068\\-174.8672\\-135\\-159.7174\\-172.9141\\-135\\-156.7179\\-169.0078\\-135\\-155.4719\\-167.0547\\-135\\-153.7751\\-165.1016\\-135\\-149.4141\\-160.7789\\-135\\-147.4609\\-159.1211\\-135\\-145.5078\\-157.7704\\-135\\-141.6016\\-154.5171\\-135\\-139.6484\\-153.1499\\-135\\-137.6953\\-152.1428\\-135\\-135.7422\\-150.7767\\-135\\-130.2237\\-147.5234\\-135\\-129.8828\\-147.2518\\-135\\-127.9297\\-146.4187\\-135\\-125.9766\\-145.3706\\-135\\-124.0234\\-144.5432\\-135\\-122.0703\\-143.4556\\-135\\-120.1172\\-142.5398\\-135\\-118.1641\\-141.4558\\-135\\-114.2578\\-140.0175\\-135\\-112.3047\\-139.1085\\-135\\-110.3516\\-138.6202\\-135\\-108.3984\\-137.9428\\-135\\-106.4453\\-137.1085\\-135\\-104.4922\\-136.6022\\-135\\-102.5391\\-135.7239\\-135\\-100.5859\\-135.0736\\-135\\-98.63281\\-134.6041\\-135\\-94.72656\\-133.3018\\-135\\-90.82031\\-132.6691\\-135\\-88.86719\\-132.2467\\-135\\-86.91406\\-131.5794\\-135\\-84.96094\\-131.1915\\-135\\-79.10156\\-130.451\\-135\\-75.19531\\-129.6748\\-135\\-71.28906\\-129.2171\\-135\\-67.38281\\-129.0124\\-135\\-65.42969\\-128.9906\\-135\\-61.52344\\-129.0767\\-135\\-57.61719\\-129.431\\-135\\-55.66406\\-129.7336\\-135\\-53.71094\\-130.2597\\-135\\-49.80469\\-131.0981\\-135\\-47.85156\\-131.6015\\-135\\-45.89844\\-132.4128\\-135\\-41.99219\\-133.3303\\-135\\-40.03906\\-134.2997\\-135\\-38.08594\\-135.0636\\-135\\-36.13281\\-136.2279\\-135\\-34.17969\\-137.204\\-135\\-32.22656\\-138.5684\\-135\\-28.32031\\-141.0152\\-135\\-26.36719\\-142.7469\\-135\\-24.41406\\-144.7226\\-135\\-21.75705\\-147.5234\\-135\\-20.21123\\-149.4766\\-135\\-19.19922\\-151.4297\\-135\\-17.94362\\-153.3828\\-135\\-17.25812\\-155.3359\\-135\\-16.11032\\-157.2891\\-135\\-15.4772\\-159.2422\\-135\\-14.61088\\-161.1953\\-135\\-13.96484\\-163.1484\\-135\\-13.29385\\-167.0547\\-135\\-12.17831\\-170.9609\\-135\\-11.87785\\-172.9141\\-135\\-11.32111\\-178.7734\\-135\\-10.53049\\-184.6328\\-135\\-10.4061\\-188.5391\\-135\\-10.50647\\-190.4922\\-135\\-10.70463\\-192.4453\\-135\\-11.02218\\-194.3984\\-135\\-11.08099\\-196.3516\\-135\\-10.81085\\-200.2578\\-135\\-10.15732\\-206.1172\\-135\\-10.05959\\-208.0703\\-135\\-9.971217\\-211.9766\\-135\\-10.04676\\-219.7891\\-135\\-10.32624\\-223.6953\\-135\\-10.59358\\-225.6484\\-135\\-11.22437\\-227.6016\\-135\\-11.56012\\-229.5547\\-135\\-11.55341\\-231.5078\\-135\\-11.94018\\-235.4141\\-135\\-12.25322\\-237.3672\\-135\\-12.80975\\-239.3203\\-135\\-13.25969\\-241.2734\\-135\\-13.9074\\-245.1797\\-135\\-14.39925\\-247.1328\\-135\\-15.21382\\-249.0859\\-135\\-15.76803\\-251.0391\\-135\\-16.49306\\-252.9922\\-135\\-17.40011\\-254.9453\\-135\\-17.91295\\-256.8984\\-135\\-18.94124\\-258.8516\\-135\\-20.16844\\-262.7578\\-135\\-21.24161\\-264.7109\\-135\\-21.99897\\-266.6641\\-135\\-23.24548\\-268.6172\\-135\\-24.19936\\-270.5703\\-135\\-25.33418\\-272.5234\\-135\\-26.21993\\-274.4766\\-135\\-27.41477\\-276.4297\\-135\\-28.75077\\-278.3828\\-135\\-29.93735\\-280.3359\\-135\\-32.73519\\-284.2422\\-135\\-33.87318\\-286.1953\\-135\\-35.43709\\-288.1484\\-135\\-40.03906\\-293.1302\\-135\\-41.99219\\-294.878\\-135\\-43.94531\\-296.3271\\-135\\-45.89844\\-297.5025\\-135\\-47.85156\\-298.8906\\-135\\-49.80469\\-300.099\\-135\\-51.75781\\-300.8973\\-135\\-53.71094\\-301.578\\-135\\-55.66406\\-302.3793\\-135\\-57.61719\\-302.7411\\-135\\-61.52344\\-303.2914\\-135\\-65.42969\\-304.0553\\-135\\-67.38281\\-304.2531\\-135\\-71.28906\\-304.3805\\-135\\-75.19531\\-304.3431\\-135\\-79.10156\\-304.0774\\-135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "171" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "42" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-302.2715\\-135\\57.61719\\-301.2306\\-135\\55.66406\\-300.8267\\-135\\53.71094\\-300.3116\\-135\\51.75781\\-299.3152\\-135\\49.80469\\-298.5596\\-135\\47.85156\\-297.3269\\-135\\45.89844\\-296.4001\\-135\\42.26714\\-294.0078\\-135\\40.03906\\-292.4467\\-135\\36.13281\\-288.9827\\-135\\33.28776\\-286.1953\\-135\\29.86189\\-282.2891\\-135\\28.29742\\-280.3359\\-135\\25.65524\\-276.4297\\-135\\24.6063\\-274.4766\\-135\\22.46094\\-271.0465\\-135\\22.07937\\-270.5703\\-135\\21.2228\\-268.6172\\-135\\20.08642\\-266.6641\\-135\\18.80976\\-262.7578\\-135\\17.81581\\-260.8047\\-135\\17.29986\\-258.8516\\-135\\16.37777\\-256.8984\\-135\\15.18584\\-252.9922\\-135\\14.39576\\-251.0391\\-135\\13.93769\\-249.0859\\-135\\13.32355\\-245.1797\\-135\\12.90666\\-243.2266\\-135\\12.30876\\-241.2734\\-135\\11.973\\-239.3203\\-135\\11.55164\\-235.4141\\-135\\11.2893\\-233.4609\\-135\\10.89523\\-231.5078\\-135\\10.39567\\-229.5547\\-135\\10.12074\\-227.6016\\-135\\9.684245\\-219.7891\\-135\\9.434679\\-213.9297\\-135\\9.028081\\-210.0234\\-135\\8.496094\\-204.1641\\-135\\8.432241\\-202.2109\\-135\\8.781433\\-198.3047\\-135\\9.480575\\-194.3984\\-135\\9.997914\\-188.5391\\-135\\10.2285\\-184.6328\\-135\\10.4061\\-182.6797\\-135\\11.40625\\-176.8203\\-135\\12.0503\\-170.9609\\-135\\12.55035\\-169.0078\\-135\\13.17376\\-167.0547\\-135\\13.91457\\-163.1484\\-135\\14.55298\\-161.1953\\-135\\15.47558\\-159.2422\\-135\\16.2482\\-157.2891\\-135\\17.45412\\-155.3359\\-135\\18.47076\\-153.3828\\-135\\19.70766\\-151.4297\\-135\\22.46094\\-148.0966\\-135\\24.41406\\-146.0068\\-135\\28.32031\\-142.1131\\-135\\30.27344\\-140.4805\\-135\\32.22656\\-139.006\\-135\\36.13281\\-136.6456\\-135\\38.08594\\-135.3387\\-135\\40.03906\\-134.5535\\-135\\41.99219\\-133.4871\\-135\\43.94531\\-132.9105\\-135\\45.89844\\-132.441\\-135\\47.85156\\-131.5267\\-135\\49.80469\\-131.0267\\-135\\51.75781\\-130.6436\\-135\\55.66406\\-129.5294\\-135\\57.61719\\-129.2723\\-135\\59.57031\\-129.1131\\-135\\63.47656\\-128.9104\\-135\\69.33594\\-128.8902\\-135\\75.19531\\-129.1356\\-135\\77.14844\\-129.2684\\-135\\81.05469\\-129.6978\\-135\\84.96094\\-130.4571\\-135\\90.82031\\-131.1162\\-135\\92.77344\\-131.3842\\-135\\94.72656\\-131.7883\\-135\\96.67969\\-132.3302\\-135\\98.63281\\-132.6383\\-135\\102.5391\\-133.0498\\-135\\104.4922\\-133.39\\-135\\108.3984\\-134.454\\-135\\112.3047\\-135.2891\\-135\\114.2578\\-136.1565\\-135\\118.1641\\-137.1696\\-135\\120.1172\\-138.0255\\-135\\122.0703\\-138.6821\\-135\\124.0234\\-139.2058\\-135\\125.9766\\-140.1473\\-135\\127.9297\\-140.8279\\-135\\131.8359\\-142.8005\\-135\\133.7891\\-144.0367\\-135\\135.7422\\-144.9639\\-135\\137.6953\\-146.2147\\-135\\139.6484\\-147.2147\\-135\\141.6016\\-148.6422\\-135\\145.5078\\-151.963\\-135\\147.4609\\-153.3573\\-135\\149.4141\\-155.1916\\-135\\153.3203\\-159.3251\\-135\\155.2734\\-161.7982\\-135\\157.6717\\-165.1016\\-135\\158.8239\\-167.0547\\-135\\160.1453\\-169.0078\\-135\\161.2778\\-170.9609\\-135\\162.1155\\-172.9141\\-135\\162.8143\\-174.8672\\-135\\163.777\\-176.8203\\-135\\164.2857\\-178.7734\\-135\\165.0618\\-180.7266\\-135\\165.7127\\-182.6797\\-135\\166.4051\\-186.5859\\-135\\167.2054\\-190.4922\\-135\\167.6217\\-194.3984\\-135\\167.8022\\-198.3047\\-135\\167.8596\\-204.1641\\-135\\167.8022\\-208.0703\\-135\\167.5078\\-213.9297\\-135\\166.9922\\-217.7086\\-135\\166.5728\\-219.7891\\-135\\165.6413\\-225.6484\\-135\\164.4601\\-229.5547\\-135\\163.7121\\-233.4609\\-135\\162.9552\\-235.4141\\-135\\162.323\\-237.3672\\-135\\161.9057\\-239.3203\\-135\\161.1563\\-241.2734\\-135\\160.2485\\-243.2266\\-135\\159.4898\\-245.1797\\-135\\158.357\\-247.1328\\-135\\157.5195\\-249.0859\\-135\\156.3974\\-251.0391\\-135\\155.6085\\-252.9922\\-135\\153.3203\\-256.6892\\-135\\151.9176\\-258.8516\\-135\\150.47\\-260.8047\\-135\\149.4141\\-262.4449\\-135\\147.8192\\-264.7109\\-135\\146.2447\\-266.6641\\-135\\141.0707\\-272.5234\\-135\\139.6484\\-274.048\\-135\\133.7891\\-279.8726\\-135\\128.7063\\-284.2422\\-135\\125.9766\\-286.4412\\-135\\120.1172\\-290.3039\\-135\\118.1641\\-291.3481\\-135\\116.2109\\-292.7813\\-135\\112.3047\\-294.8457\\-135\\110.3516\\-295.5139\\-135\\108.3984\\-296.566\\-135\\106.4453\\-297.1405\\-135\\104.4922\\-298.1258\\-135\\100.5859\\-299.4603\\-135\\98.63281\\-300.2767\\-135\\96.67969\\-300.7181\\-135\\92.77344\\-301.4337\\-135\\90.82031\\-301.95\\-135\\88.86719\\-302.3381\\-135\\86.91406\\-302.591\\-135\\83.00781\\-302.84\\-135\\79.10156\\-303.0065\\-135\\75.19531\\-303.1013\\-135\\71.28906\\-303.0133\\-135\\65.42969\\-302.7299\\-135\\63.47656\\-302.5497\\-135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "183" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "43" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-303.1594\\-133\\-88.86719\\-302.7299\\-133\\-90.82031\\-302.4526\\-133\\-92.77344\\-301.951\\-133\\-94.72656\\-301.3094\\-133\\-98.63281\\-300.4037\\-133\\-100.5859\\-299.5352\\-133\\-102.5391\\-298.7966\\-133\\-104.4922\\-297.8156\\-133\\-108.3984\\-296.0161\\-133\\-112.1812\\-294.0078\\-133\\-114.2578\\-292.7899\\-133\\-116.2109\\-291.2769\\-133\\-118.1641\\-289.9519\\-133\\-120.1172\\-288.8523\\-133\\-123.4467\\-286.1953\\-133\\-125.9766\\-284.0469\\-133\\-127.9297\\-282.582\\-133\\-129.8828\\-280.8316\\-133\\-136.1867\\-274.4766\\-133\\-139.2927\\-270.5703\\-133\\-141.6016\\-267.8281\\-133\\-142.511\\-266.6641\\-133\\-145.0576\\-262.7578\\-133\\-145.5078\\-262.2289\\-133\\-147.8852\\-258.8516\\-133\\-148.8281\\-256.8984\\-133\\-150.0588\\-254.9453\\-133\\-150.8659\\-252.9922\\-133\\-152.1341\\-251.0391\\-133\\-154.179\\-247.1328\\-133\\-154.9408\\-245.1797\\-133\\-155.952\\-243.2266\\-133\\-156.4897\\-241.2734\\-133\\-157.5215\\-239.3203\\-133\\-158.2031\\-237.3672\\-133\\-159.9375\\-233.4609\\-133\\-160.503\\-231.5078\\-133\\-161.368\\-229.5547\\-133\\-161.9436\\-227.6016\\-133\\-162.7189\\-223.6953\\-133\\-163.5063\\-221.7422\\-133\\-164.2958\\-217.8359\\-133\\-164.7966\\-215.8828\\-133\\-165.455\\-213.9297\\-133\\-165.8253\\-211.9766\\-133\\-166.7277\\-206.1172\\-133\\-167.1792\\-202.2109\\-133\\-167.2531\\-200.2578\\-133\\-167.0869\\-196.3516\\-133\\-165.8627\\-188.5391\\-133\\-165.4455\\-186.5859\\-133\\-164.655\\-184.6328\\-133\\-163.5989\\-180.7266\\-133\\-162.5674\\-178.7734\\-133\\-161.9251\\-176.8203\\-133\\-160.7869\\-174.8672\\-133\\-159.7923\\-172.9141\\-133\\-156.7417\\-169.0078\\-133\\-155.5\\-167.0547\\-133\\-153.79\\-165.1016\\-133\\-149.4141\\-160.7671\\-133\\-147.4609\\-159.1519\\-133\\-145.5078\\-157.8248\\-133\\-141.6016\\-154.5805\\-133\\-139.6484\\-153.2656\\-133\\-137.6953\\-152.202\\-133\\-135.7422\\-150.8366\\-133\\-133.7891\\-149.7953\\-133\\-133.3756\\-149.4766\\-133\\-129.8828\\-147.3073\\-133\\-127.9297\\-146.4431\\-133\\-125.9766\\-145.4113\\-133\\-124.0234\\-144.5545\\-133\\-122.0703\\-143.4556\\-133\\-120.1172\\-142.5232\\-133\\-118.1641\\-141.4164\\-133\\-114.2578\\-139.9403\\-133\\-112.3047\\-139.0249\\-133\\-110.3516\\-138.5426\\-133\\-108.3984\\-137.7056\\-133\\-106.4453\\-136.9858\\-133\\-104.4922\\-136.4421\\-133\\-102.5391\\-135.4878\\-133\\-98.63281\\-134.4212\\-133\\-96.67969\\-133.6652\\-133\\-94.72656\\-133.1408\\-133\\-90.82031\\-132.5271\\-133\\-86.91406\\-131.3428\\-133\\-81.05469\\-130.5624\\-133\\-79.10156\\-130.2534\\-133\\-77.14844\\-129.7967\\-133\\-75.19531\\-129.4745\\-133\\-71.28906\\-129.0492\\-133\\-69.33594\\-128.9308\\-133\\-65.42969\\-128.8237\\-133\\-61.52344\\-128.8846\\-133\\-57.61719\\-129.251\\-133\\-55.66406\\-129.5173\\-133\\-51.75781\\-130.5289\\-133\\-47.85156\\-131.3348\\-133\\-45.89844\\-132.0997\\-133\\-43.94531\\-132.6953\\-133\\-41.99219\\-133.1238\\-133\\-38.08594\\-134.8568\\-133\\-36.19026\\-135.8047\\-133\\-34.17969\\-136.9732\\-133\\-32.22656\\-138.3665\\-133\\-30.27344\\-139.4879\\-133\\-28.32031\\-140.8427\\-133\\-26.36719\\-142.5812\\-133\\-23.4627\\-145.5703\\-133\\-21.6389\\-147.5234\\-133\\-20.12416\\-149.4766\\-133\\-19.16422\\-151.4297\\-133\\-17.90926\\-153.3828\\-133\\-17.23214\\-155.3359\\-133\\-16.11032\\-157.2891\\-133\\-15.47274\\-159.2422\\-133\\-14.58135\\-161.1953\\-133\\-13.95335\\-163.1484\\-133\\-13.30645\\-167.0547\\-133\\-12.22997\\-170.9609\\-133\\-11.92197\\-172.9141\\-133\\-11.36467\\-178.7734\\-133\\-10.63368\\-184.6328\\-133\\-10.50647\\-186.5859\\-133\\-10.50647\\-188.5391\\-133\\-10.82611\\-192.4453\\-133\\-11.0919\\-194.3984\\-133\\-11.15437\\-196.3516\\-133\\-10.9489\\-200.2578\\-133\\-10.75013\\-202.2109\\-133\\-10.20397\\-206.1172\\-133\\-10.07269\\-208.0703\\-133\\-9.980562\\-211.9766\\-133\\-9.997914\\-215.8828\\-133\\-10.07934\\-219.7891\\-133\\-10.3752\\-223.6953\\-133\\-10.64745\\-225.6484\\-133\\-11.41661\\-229.5547\\-133\\-11.56374\\-231.5078\\-133\\-11.973\\-235.4141\\-133\\-12.28448\\-237.3672\\-133\\-12.88027\\-239.3203\\-133\\-13.29001\\-241.2734\\-133\\-13.94924\\-245.1797\\-133\\-14.46144\\-247.1328\\-133\\-15.26786\\-249.0859\\-133\\-15.80529\\-251.0391\\-133\\-17.43645\\-254.9453\\-133\\-17.95504\\-256.8984\\-133\\-18.98358\\-258.8516\\-133\\-19.5372\\-260.8047\\-133\\-20.21767\\-262.7578\\-133\\-21.28364\\-264.7109\\-133\\-22.04499\\-266.6641\\-133\\-23.28643\\-268.6172\\-133\\-24.26327\\-270.5703\\-133\\-25.35088\\-272.5234\\-133\\-26.27985\\-274.4766\\-133\\-27.44498\\-276.4297\\-133\\-28.80233\\-278.3828\\-133\\-29.99161\\-280.3359\\-133\\-32.77209\\-284.2422\\-133\\-33.92651\\-286.1953\\-133\\-35.5013\\-288.1484\\-133\\-40.03906\\-293.0511\\-133\\-41.99219\\-294.8132\\-133\\-43.94531\\-296.2473\\-133\\-45.89844\\-297.4224\\-133\\-47.85156\\-298.8309\\-133\\-49.80469\\-299.993\\-133\\-51.75781\\-300.8438\\-133\\-53.71094\\-301.4995\\-133\\-55.66406\\-302.3186\\-133\\-57.61719\\-302.7127\\-133\\-61.52344\\-303.2424\\-133\\-65.42969\\-303.9851\\-133\\-67.38281\\-304.2173\\-133\\-71.28906\\-304.3583\\-133\\-75.19531\\-304.3116\\-133\\-79.10156\\-304.0664\\-133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "170" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "44" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-302.1874\\-133\\59.57031\\-301.6339\\-133\\55.66406\\-300.7699\\-133\\53.71094\\-300.2253\\-133\\51.75781\\-299.2181\\-133\\49.80469\\-298.4828\\-133\\47.85156\\-297.2293\\-133\\45.89844\\-296.3229\\-133\\43.94531\\-295.0658\\-133\\40.03906\\-292.3734\\-133\\36.13281\\-288.9492\\-133\\33.32682\\-286.1953\\-133\\29.9099\\-282.2891\\-133\\28.32031\\-280.308\\-133\\25.6633\\-276.4297\\-133\\24.41406\\-274.2432\\-133\\22.46094\\-271.0465\\-133\\22.07937\\-270.5703\\-133\\21.21964\\-268.6172\\-133\\20.05558\\-266.6641\\-133\\18.80976\\-262.7578\\-133\\17.80942\\-260.8047\\-133\\17.30363\\-258.8516\\-133\\16.38986\\-256.8984\\-133\\15.74707\\-254.9453\\-133\\15.21053\\-252.9922\\-133\\14.45875\\-251.0391\\-133\\13.96833\\-249.0859\\-133\\13.3728\\-245.1797\\-133\\12.99741\\-243.2266\\-133\\12.42963\\-241.2734\\-133\\12.0503\\-239.3203\\-133\\11.40248\\-233.4609\\-133\\11.08956\\-231.5078\\-133\\10.60675\\-229.5547\\-133\\10.25391\\-227.6016\\-133\\10.07934\\-225.6484\\-133\\9.848933\\-221.7422\\-133\\9.579373\\-215.8828\\-133\\9.294783\\-211.9766\\-133\\8.640455\\-206.1172\\-133\\8.507236\\-204.1641\\-133\\8.47425\\-202.2109\\-133\\8.812689\\-200.2578\\-133\\9.038549\\-198.3047\\-133\\9.165646\\-196.3516\\-133\\9.689405\\-192.4453\\-133\\10.00381\\-188.5391\\-133\\10.38537\\-182.6797\\-133\\10.6756\\-180.7266\\-133\\11.39509\\-176.8203\\-133\\12.01468\\-170.9609\\-133\\12.48238\\-169.0078\\-133\\13.11671\\-167.0547\\-133\\13.87747\\-163.1484\\-133\\14.48449\\-161.1953\\-133\\15.45235\\-159.2422\\-133\\16.21474\\-157.2891\\-133\\17.45279\\-155.3359\\-133\\18.48548\\-153.3828\\-133\\19.66809\\-151.4297\\-133\\22.46094\\-148.0045\\-133\\24.41406\\-145.9505\\-133\\28.32031\\-142.0385\\-133\\30.27344\\-140.4206\\-133\\32.22656\\-138.9335\\-133\\34.17969\\-137.677\\-133\\36.13281\\-136.5648\\-133\\38.08594\\-135.267\\-133\\40.03906\\-134.454\\-133\\41.99219\\-133.39\\-133\\45.89844\\-132.3198\\-133\\47.85156\\-131.3757\\-133\\51.75781\\-130.5074\\-133\\53.71094\\-129.8645\\-133\\55.66406\\-129.3834\\-133\\59.57031\\-129.0072\\-133\\63.47656\\-128.7825\\-133\\69.33594\\-128.6943\\-133\\75.19531\\-128.9393\\-133\\81.05469\\-129.3834\\-133\\83.00781\\-129.6305\\-133\\86.91406\\-130.4454\\-133\\94.72656\\-131.419\\-133\\98.63281\\-132.3867\\-133\\100.5859\\-132.6716\\-133\\104.4922\\-133.116\\-133\\106.4453\\-133.4568\\-133\\110.3516\\-134.5456\\-133\\112.3047\\-134.9523\\-133\\116.2109\\-136.28\\-133\\120.1172\\-137.4217\\-133\\122.0703\\-138.3334\\-133\\124.0234\\-138.8678\\-133\\125.9766\\-139.5928\\-133\\127.9297\\-140.5258\\-133\\129.8828\\-141.2475\\-133\\131.8359\\-142.4101\\-133\\133.7891\\-143.4428\\-133\\137.3355\\-145.5703\\-133\\139.6484\\-146.857\\-133\\141.6016\\-148.3685\\-133\\145.5078\\-151.5843\\-133\\147.4609\\-152.9997\\-133\\149.4141\\-154.84\\-133\\153.6381\\-159.2422\\-133\\155.2734\\-161.3581\\-133\\156.4077\\-163.1484\\-133\\157.8837\\-165.1016\\-133\\159.1797\\-167.1392\\-133\\161.1328\\-170.4824\\-133\\161.4771\\-170.9609\\-133\\162.9836\\-174.8672\\-133\\163.8661\\-176.8203\\-133\\164.3861\\-178.7734\\-133\\165.2135\\-180.7266\\-133\\165.774\\-182.6797\\-133\\166.4709\\-186.5859\\-133\\167.2549\\-190.4922\\-133\\167.4956\\-192.4453\\-133\\167.8136\\-198.3047\\-133\\167.8711\\-202.2109\\-133\\167.8136\\-208.0703\\-133\\167.6374\\-211.9766\\-133\\167.2911\\-215.8828\\-133\\166.9922\\-217.7935\\-133\\166.253\\-221.7422\\-133\\165.6561\\-225.6484\\-133\\165.1338\\-227.6016\\-133\\164.4768\\-229.5547\\-133\\163.7121\\-233.4609\\-133\\162.323\\-237.3672\\-133\\161.9057\\-239.3203\\-133\\161.1328\\-241.2584\\-133\\160.2268\\-243.2266\\-133\\159.4786\\-245.1797\\-133\\158.3344\\-247.1328\\-133\\157.4971\\-249.0859\\-133\\156.3782\\-251.0391\\-133\\155.5451\\-252.9922\\-133\\151.8738\\-258.8516\\-133\\150.4266\\-260.8047\\-133\\147.7817\\-264.7109\\-133\\146.2054\\-266.6641\\-133\\141.0352\\-272.5234\\-133\\139.6484\\-274.0199\\-133\\133.7891\\-279.8371\\-133\\128.666\\-284.2422\\-133\\125.9766\\-286.3629\\-133\\122.0703\\-289.0199\\-133\\120.1172\\-290.2785\\-133\\118.1641\\-291.3366\\-133\\116.2109\\-292.7697\\-133\\112.3047\\-294.8457\\-133\\110.3516\\-295.5139\\-133\\108.3984\\-296.566\\-133\\106.4453\\-297.1295\\-133\\104.4922\\-298.1135\\-133\\100.5859\\-299.4504\\-133\\98.63281\\-300.2667\\-133\\96.67969\\-300.7181\\-133\\92.77344\\-301.4202\\-133\\88.86719\\-302.325\\-133\\86.91406\\-302.572\\-133\\84.96094\\-302.7188\\-133\\79.10156\\-302.9824\\-133\\75.19531\\-303.0565\\-133\\71.28906\\-302.9715\\-133\\65.42969\\-302.689\\-133\\63.47656\\-302.5021\\-133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "186" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "45" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-304.0325\\-131\\-83.00781\\-303.4081\\-131\\-86.91406\\-302.8929\\-131\\-88.86719\\-302.7127\\-131\\-90.82031\\-302.4227\\-131\\-92.77344\\-301.9211\\-131\\-94.72656\\-301.2964\\-131\\-98.63281\\-300.3916\\-131\\-100.5859\\-299.4906\\-131\\-102.5391\\-298.7639\\-131\\-104.4922\\-297.7587\\-131\\-108.3872\\-295.9609\\-131\\-112.1571\\-294.0078\\-131\\-114.2578\\-292.7787\\-131\\-116.2109\\-291.2653\\-131\\-118.1641\\-289.9362\\-131\\-120.1172\\-288.8441\\-131\\-122.0703\\-287.3177\\-131\\-125.9766\\-284.0329\\-131\\-127.9297\\-282.597\\-131\\-129.8828\\-280.8426\\-131\\-132.2943\\-278.3828\\-131\\-134.3356\\-276.4297\\-131\\-136.1979\\-274.4766\\-131\\-139.3066\\-270.5703\\-131\\-141.6016\\-267.8533\\-131\\-142.529\\-266.6641\\-131\\-145.0823\\-262.7578\\-131\\-145.5078\\-262.2572\\-131\\-147.9091\\-258.8516\\-131\\-148.8647\\-256.8984\\-131\\-150.0796\\-254.9453\\-131\\-150.9221\\-252.9922\\-131\\-152.1692\\-251.0391\\-131\\-154.2066\\-247.1328\\-131\\-155.0038\\-245.1797\\-131\\-155.9933\\-243.2266\\-131\\-156.529\\-241.2734\\-131\\-157.5776\\-239.3203\\-131\\-158.2387\\-237.3672\\-131\\-159.9842\\-233.4609\\-131\\-160.5756\\-231.5078\\-131\\-161.4445\\-229.5547\\-131\\-161.9792\\-227.6016\\-131\\-162.3324\\-225.6484\\-131\\-162.8183\\-223.6953\\-131\\-163.5866\\-221.7422\\-131\\-164.3638\\-217.8359\\-131\\-165.5388\\-213.9297\\-131\\-166.8674\\-206.1172\\-131\\-167.1408\\-204.1641\\-131\\-167.3112\\-202.2109\\-131\\-167.3456\\-198.3047\\-131\\-167.2175\\-196.3516\\-131\\-166.9241\\-194.3984\\-131\\-165.9264\\-188.5391\\-131\\-165.5187\\-186.5859\\-131\\-164.7571\\-184.6328\\-131\\-164.1575\\-182.6797\\-131\\-163.66\\-180.7266\\-131\\-162.6496\\-178.7734\\-131\\-161.969\\-176.8203\\-131\\-159.8609\\-172.9141\\-131\\-156.7625\\-169.0078\\-131\\-155.5426\\-167.0547\\-131\\-153.827\\-165.1016\\-131\\-149.4141\\-160.7588\\-131\\-147.4609\\-159.1683\\-131\\-145.5078\\-157.8615\\-131\\-143.5547\\-156.3008\\-131\\-141.6016\\-154.6286\\-131\\-139.6484\\-153.3425\\-131\\-137.6953\\-152.2199\\-131\\-135.7422\\-150.857\\-131\\-133.7891\\-149.7953\\-131\\-129.8828\\-147.3056\\-131\\-127.9297\\-146.4377\\-131\\-125.9766\\-145.3558\\-131\\-124.0234\\-144.4972\\-131\\-122.0703\\-143.3335\\-131\\-120.1172\\-142.431\\-131\\-118.1641\\-141.2936\\-131\\-116.2109\\-140.573\\-131\\-112.3047\\-138.8815\\-131\\-110.3516\\-138.3564\\-131\\-108.3984\\-137.3659\\-131\\-104.4922\\-136.1417\\-131\\-102.5391\\-135.2475\\-131\\-98.63281\\-134.1212\\-131\\-96.67969\\-133.34\\-131\\-92.77344\\-132.6473\\-131\\-90.82031\\-132.2146\\-131\\-88.86719\\-131.5267\\-131\\-86.91406\\-131.1262\\-131\\-83.00781\\-130.6053\\-131\\-81.05469\\-130.2941\\-131\\-79.10156\\-129.836\\-131\\-77.14844\\-129.484\\-131\\-75.19531\\-129.2385\\-131\\-71.28906\\-128.8596\\-131\\-67.38281\\-128.657\\-131\\-63.47656\\-128.6136\\-131\\-61.52344\\-128.6847\\-131\\-57.61719\\-129.0417\\-131\\-55.66406\\-129.2768\\-131\\-53.71094\\-129.6484\\-131\\-51.75781\\-130.2686\\-131\\-47.85156\\-131.0863\\-131\\-45.89844\\-131.6242\\-131\\-43.94531\\-132.4882\\-131\\-41.99219\\-132.9293\\-131\\-40.03906\\-133.5819\\-131\\-38.08594\\-134.6171\\-131\\-36.13281\\-135.4361\\-131\\-32.5728\\-137.7578\\-131\\-30.27344\\-139.1676\\-131\\-28.32031\\-140.681\\-131\\-26.36719\\-142.4116\\-131\\-23.33108\\-145.5703\\-131\\-21.52123\\-147.5234\\-131\\-20.03291\\-149.4766\\-131\\-19.12875\\-151.4297\\-131\\-17.8722\\-153.3828\\-131\\-17.18176\\-155.3359\\-131\\-16.03947\\-157.2891\\-131\\-15.42222\\-159.2422\\-131\\-14.52455\\-161.1953\\-131\\-13.92613\\-163.1484\\-131\\-13.28506\\-167.0547\\-131\\-12.27101\\-170.9609\\-131\\-11.94719\\-172.9141\\-131\\-11.39884\\-178.7734\\-131\\-10.71948\\-184.6328\\-131\\-10.5678\\-186.5859\\-131\\-10.70463\\-190.4922\\-131\\-11.14695\\-194.3984\\-131\\-11.2335\\-196.3516\\-131\\-11.1263\\-200.2578\\-131\\-10.89523\\-202.2109\\-131\\-10.54275\\-204.1641\\-131\\-10.07269\\-208.0703\\-131\\-9.986291\\-211.9766\\-131\\-10.00977\\-215.8828\\-131\\-10.10665\\-219.7891\\-131\\-10.43822\\-223.6953\\-131\\-10.71948\\-225.6484\\-131\\-11.11328\\-227.6016\\-131\\-12.00701\\-235.4141\\-131\\-12.35352\\-237.3672\\-131\\-12.95906\\-239.3203\\-131\\-13.33599\\-241.2734\\-131\\-13.99158\\-245.1797\\-131\\-14.52637\\-247.1328\\-131\\-15.31948\\-249.0859\\-131\\-15.84371\\-251.0391\\-131\\-17.45669\\-254.9453\\-131\\-17.99417\\-256.8984\\-131\\-19.0268\\-258.8516\\-131\\-19.55492\\-260.8047\\-131\\-20.24407\\-262.7578\\-131\\-21.31172\\-264.7109\\-131\\-22.08391\\-266.6641\\-131\\-23.31543\\-268.6172\\-131\\-25.37359\\-272.5234\\-131\\-26.31069\\-274.4766\\-131\\-27.4688\\-276.4297\\-131\\-28.81485\\-278.3828\\-131\\-30.0029\\-280.3359\\-131\\-32.79511\\-284.2422\\-131\\-33.97993\\-286.1953\\-131\\-35.57195\\-288.1484\\-131\\-40.03906\\-292.9914\\-131\\-41.99219\\-294.7595\\-131\\-43.94531\\-296.1517\\-131\\-45.89844\\-297.3346\\-131\\-47.85156\\-298.7597\\-131\\-49.80469\\-299.875\\-131\\-51.75781\\-300.7964\\-131\\-53.71094\\-301.4174\\-131\\-55.66406\\-302.2505\\-131\\-57.61719\\-302.6826\\-131\\-61.52344\\-303.1757\\-131\\-65.42969\\-303.9221\\-131\\-67.38281\\-304.1798\\-131\\-71.28906\\-304.3275\\-131\\-75.19531\\-304.2787\\-131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "173" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "46" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-302.1003\\-131\\59.57031\\-301.5403\\-131\\55.66406\\-300.7196\\-131\\53.71094\\-300.1317\\-131\\51.75781\\-299.132\\-131\\49.80469\\-298.3811\\-131\\47.85156\\-297.1455\\-131\\45.89844\\-296.2266\\-131\\43.94531\\-295.0153\\-131\\40.03906\\-292.2865\\-131\\37.57403\\-290.1016\\-131\\36.13281\\-288.9022\\-131\\33.36042\\-286.1953\\-131\\29.94792\\-282.2891\\-131\\28.32031\\-280.253\\-131\\25.67598\\-276.4297\\-131\\24.41406\\-274.2432\\-131\\22.46094\\-271.0303\\-131\\22.08984\\-270.5703\\-131\\21.21538\\-268.6172\\-131\\20.06869\\-266.6641\\-131\\18.80787\\-262.7578\\-131\\17.8197\\-260.8047\\-131\\17.30745\\-258.8516\\-131\\16.41456\\-256.8984\\-131\\15.75684\\-254.9453\\-131\\15.24554\\-252.9922\\-131\\14.48449\\-251.0391\\-131\\13.99158\\-249.0859\\-131\\13.42163\\-245.1797\\-131\\13.08187\\-243.2266\\-131\\12.55148\\-241.2734\\-131\\12.12565\\-239.3203\\-131\\11.84353\\-237.3672\\-131\\11.49053\\-233.4609\\-131\\11.21511\\-231.5078\\-131\\10.41667\\-227.6016\\-131\\10.17253\\-225.6484\\-131\\10.04044\\-223.6953\\-131\\9.521484\\-213.9297\\-131\\9.370484\\-211.9766\\-131\\8.653626\\-206.1172\\-131\\8.518528\\-204.1641\\-131\\8.496094\\-202.2109\\-131\\8.857727\\-200.2578\\-131\\9.193372\\-196.3516\\-131\\9.859076\\-190.4922\\-131\\10.3752\\-182.6797\\-131\\10.62012\\-180.7266\\-131\\11.36877\\-176.8203\\-131\\11.98033\\-170.9609\\-131\\12.44213\\-169.0078\\-131\\13.07091\\-167.0547\\-131\\13.83653\\-163.1484\\-131\\14.44469\\-161.1953\\-131\\15.42426\\-159.2422\\-131\\16.20464\\-157.2891\\-131\\17.45737\\-155.3359\\-131\\18.48602\\-153.3828\\-131\\19.66105\\-151.4297\\-131\\22.46094\\-147.9273\\-131\\24.41406\\-145.9084\\-131\\28.32031\\-141.9846\\-131\\30.27344\\-140.3685\\-131\\32.22656\\-138.8748\\-131\\34.17969\\-137.5461\\-131\\36.13281\\-136.4768\\-131\\38.08594\\-135.1921\\-131\\40.03906\\-134.3365\\-131\\41.99219\\-133.2889\\-131\\43.94531\\-132.7619\\-131\\45.89844\\-132.1261\\-131\\47.85156\\-131.2421\\-131\\51.75781\\-130.3091\\-131\\53.71094\\-129.5988\\-131\\55.66406\\-129.2392\\-131\\59.57031\\-128.863\\-131\\63.47656\\-128.597\\-131\\69.33594\\-128.4564\\-131\\75.19531\\-128.7299\\-131\\83.00781\\-129.3282\\-131\\84.96094\\-129.5885\\-131\\88.86719\\-130.3841\\-131\\92.77344\\-130.9421\\-131\\96.67969\\-131.4131\\-131\\100.5859\\-132.3435\\-131\\106.4453\\-133.0961\\-131\\108.3984\\-133.4679\\-131\\112.3047\\-134.5885\\-131\\116.2109\\-135.5484\\-131\\118.1641\\-136.3528\\-131\\122.0703\\-137.633\\-131\\124.0234\\-138.4824\\-131\\125.9766\\-139.0836\\-131\\127.9297\\-140.0414\\-131\\129.8828\\-140.8064\\-131\\133.7891\\-142.8848\\-131\\135.7422\\-144.1801\\-131\\137.6953\\-145.2303\\-131\\141.0423\\-147.5234\\-131\\143.5547\\-149.4681\\-131\\147.4609\\-152.6843\\-131\\149.4141\\-154.4877\\-131\\150.1736\\-155.3359\\-131\\153.969\\-159.2422\\-131\\155.558\\-161.1953\\-131\\156.6752\\-163.1484\\-131\\157.2266\\-163.8472\\-131\\159.4442\\-167.0547\\-131\\160.464\\-169.0078\\-131\\161.6478\\-170.9609\\-131\\162.3059\\-172.9141\\-131\\163.2276\\-174.8672\\-131\\163.9569\\-176.8203\\-131\\164.5081\\-178.7734\\-131\\165.3539\\-180.7266\\-131\\165.8335\\-182.6797\\-131\\167.2891\\-190.4922\\-131\\167.5199\\-192.4453\\-131\\167.8251\\-198.3047\\-131\\167.8711\\-202.2109\\-131\\167.8203\\-208.0703\\-131\\167.6374\\-211.9766\\-131\\167.3133\\-215.8828\\-131\\166.9998\\-217.8359\\-131\\166.2666\\-221.7422\\-131\\165.6706\\-225.6484\\-131\\165.1877\\-227.6016\\-131\\164.5146\\-229.5547\\-131\\163.7198\\-233.4609\\-131\\162.9697\\-235.4141\\-131\\162.323\\-237.3672\\-131\\161.8984\\-239.3203\\-131\\161.1328\\-241.2284\\-131\\160.221\\-243.2266\\-131\\159.4673\\-245.1797\\-131\\158.3226\\-247.1328\\-131\\157.474\\-249.0859\\-131\\156.366\\-251.0391\\-131\\155.5045\\-252.9922\\-131\\154.315\\-254.9453\\-131\\151.8242\\-258.8516\\-131\\150.3847\\-260.8047\\-131\\147.7431\\-264.7109\\-131\\146.1568\\-266.6641\\-131\\142.7612\\-270.5703\\-131\\139.6484\\-273.9883\\-131\\133.7891\\-279.8128\\-131\\131.8359\\-281.5251\\-131\\128.625\\-284.2422\\-131\\125.9766\\-286.3221\\-131\\122.0703\\-289.0076\\-131\\120.1172\\-290.2523\\-131\\118.1641\\-291.3336\\-131\\116.2109\\-292.7623\\-131\\112.3047\\-294.8526\\-131\\110.3516\\-295.5246\\-131\\108.3984\\-296.5577\\-131\\106.4453\\-297.1405\\-131\\104.4922\\-298.0884\\-131\\102.5391\\-298.8245\\-131\\100.5859\\-299.4478\\-131\\98.63281\\-300.2767\\-131\\96.67969\\-300.7181\\-131\\92.77344\\-301.4095\\-131\\88.86719\\-302.302\\-131\\86.91406\\-302.5527\\-131\\83.00781\\-302.8023\\-131\\79.10156\\-302.9605\\-131\\75.19531\\-303.0244\\-131\\71.28906\\-302.9372\\-131\\65.42969\\-302.6582\\-131\\63.47656\\-302.461\\-131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "186" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "47" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.9729\\-129\\-83.00781\\-303.366\\-129\\-86.91406\\-302.8716\\-129\\-88.86719\\-302.6826\\-129\\-90.82031\\-302.3884\\-129\\-94.72656\\-301.265\\-129\\-98.63281\\-300.3616\\-129\\-100.5859\\-299.438\\-129\\-102.5391\\-298.7261\\-129\\-104.4922\\-297.6915\\-129\\-106.4453\\-296.8414\\-129\\-110.3516\\-294.9539\\-129\\-114.2578\\-292.7675\\-129\\-116.2109\\-291.2467\\-129\\-118.1641\\-289.9233\\-129\\-120.1172\\-288.8314\\-129\\-122.0703\\-287.3051\\-129\\-125.9766\\-284.0057\\-129\\-127.9297\\-282.597\\-129\\-129.8828\\-280.8426\\-129\\-132.3044\\-278.3828\\-129\\-134.3356\\-276.4297\\-129\\-136.1867\\-274.4766\\-129\\-139.3182\\-270.5703\\-129\\-140.9879\\-268.6172\\-129\\-142.5225\\-266.6641\\-129\\-143.8535\\-264.7109\\-129\\-145.0823\\-262.7578\\-129\\-145.5078\\-262.2614\\-129\\-147.9193\\-258.8516\\-129\\-148.8845\\-256.8984\\-129\\-150.0958\\-254.9453\\-129\\-150.9458\\-252.9922\\-129\\-152.1864\\-251.0391\\-129\\-154.2344\\-247.1328\\-129\\-155.0458\\-245.1797\\-129\\-156.0184\\-243.2266\\-129\\-156.5776\\-241.2734\\-129\\-157.6184\\-239.3203\\-129\\-158.281\\-237.3672\\-129\\-159.2319\\-235.4141\\-129\\-160.0146\\-233.4609\\-129\\-160.6353\\-231.5078\\-129\\-161.5032\\-229.5547\\-129\\-162.0265\\-227.6016\\-129\\-162.3718\\-225.6484\\-129\\-162.9132\\-223.6953\\-129\\-163.66\\-221.7422\\-129\\-164.4403\\-217.8359\\-129\\-165.6196\\-213.9297\\-129\\-166.2735\\-210.0234\\-129\\-167.0149\\-206.1172\\-129\\-167.2759\\-204.1641\\-129\\-167.4241\\-202.2109\\-129\\-167.4557\\-198.3047\\-129\\-167.322\\-196.3516\\-129\\-167.073\\-194.3984\\-129\\-165.6042\\-186.5859\\-129\\-164.2244\\-182.6797\\-129\\-163.7198\\-180.7266\\-129\\-162.7341\\-178.7734\\-129\\-162.031\\-176.8203\\-129\\-161.1328\\-175.0015\\-129\\-159.9212\\-172.9141\\-129\\-156.8316\\-169.0078\\-129\\-155.6115\\-167.0547\\-129\\-153.8834\\-165.1016\\-129\\-149.4141\\-160.7327\\-129\\-147.4609\\-159.1519\\-129\\-145.5078\\-157.8481\\-129\\-143.5547\\-156.2948\\-129\\-141.6016\\-154.6035\\-129\\-139.6484\\-153.2647\\-129\\-137.6953\\-152.1734\\-129\\-135.7422\\-150.7925\\-129\\-133.7891\\-149.6588\\-129\\-129.8828\\-147.1741\\-129\\-127.9297\\-146.3278\\-129\\-125.9766\\-145.146\\-129\\-124.0234\\-144.3191\\-129\\-122.0703\\-143.0652\\-129\\-120.1172\\-142.1803\\-129\\-118.1641\\-141.049\\-129\\-116.2109\\-140.3378\\-129\\-114.2578\\-139.2885\\-129\\-112.3047\\-138.657\\-129\\-110.3516\\-137.8917\\-129\\-108.3984\\-136.9933\\-129\\-106.4453\\-136.3707\\-129\\-104.4922\\-135.493\\-129\\-100.5859\\-134.3028\\-129\\-98.63281\\-133.5116\\-129\\-96.67969\\-133.0224\\-129\\-94.72656\\-132.671\\-129\\-92.77344\\-132.2216\\-129\\-90.82031\\-131.5751\\-129\\-88.86719\\-131.1377\\-129\\-84.96094\\-130.5208\\-129\\-81.05469\\-129.6752\\-129\\-77.14844\\-129.1453\\-129\\-71.28906\\-128.6055\\-129\\-67.38281\\-128.3947\\-129\\-63.47656\\-128.392\\-129\\-59.57031\\-128.6169\\-129\\-55.66406\\-129.0312\\-129\\-53.71094\\-129.3155\\-129\\-51.75781\\-129.7556\\-129\\-49.80469\\-130.4031\\-129\\-45.89844\\-131.2603\\-129\\-43.94531\\-132.1163\\-129\\-40.03906\\-133.242\\-129\\-38.08594\\-134.2711\\-129\\-36.13281\\-135.1046\\-129\\-34.17969\\-136.4244\\-129\\-32.22656\\-137.6024\\-129\\-30.27344\\-138.9183\\-129\\-26.89179\\-141.6641\\-129\\-24.41406\\-144.2197\\-129\\-21.41639\\-147.5234\\-129\\-19.93222\\-149.4766\\-129\\-19.06972\\-151.4297\\-129\\-17.81404\\-153.3828\\-129\\-17.08984\\-155.3359\\-129\\-15.95595\\-157.2891\\-129\\-15.34913\\-159.2422\\-129\\-14.45737\\-161.1953\\-129\\-13.88889\\-163.1484\\-129\\-13.25061\\-167.0547\\-129\\-12.24716\\-170.9609\\-129\\-11.93576\\-172.9141\\-129\\-11.39884\\-178.7734\\-129\\-10.66142\\-184.6328\\-129\\-10.54275\\-186.5859\\-129\\-10.70463\\-190.4922\\-129\\-11.17974\\-194.3984\\-129\\-11.30106\\-196.3516\\-129\\-11.28738\\-200.2578\\-129\\-10.59358\\-204.1641\\-129\\-10.07269\\-208.0703\\-129\\-10.00381\\-210.0234\\-129\\-9.992074\\-213.9297\\-129\\-10.05314\\-217.8359\\-129\\-10.15732\\-219.7891\\-129\\-10.51839\\-223.6953\\-129\\-11.19626\\-227.6016\\-129\\-11.38393\\-229.5547\\-129\\-12.05842\\-235.4141\\-129\\-12.46769\\-237.3672\\-129\\-13.05474\\-239.3203\\-129\\-14.02274\\-245.1797\\-129\\-14.58185\\-247.1328\\-129\\-15.34751\\-249.0859\\-129\\-15.86019\\-251.0391\\-129\\-16.739\\-252.9922\\-129\\-17.46235\\-254.9453\\-129\\-18.01934\\-256.8984\\-129\\-19.06224\\-258.8516\\-129\\-19.57293\\-260.8047\\-129\\-20.2691\\-262.7578\\-129\\-21.33331\\-264.7109\\-129\\-22.10412\\-266.6641\\-129\\-23.33774\\-268.6172\\-129\\-25.3792\\-272.5234\\-129\\-26.32683\\-274.4766\\-129\\-27.46212\\-276.4297\\-129\\-28.81804\\-278.3828\\-129\\-30.0029\\-280.3359\\-129\\-32.82187\\-284.2422\\-129\\-34.03585\\-286.1953\\-129\\-35.64116\\-288.1484\\-129\\-40.03906\\-292.9382\\-129\\-41.99219\\-294.7127\\-129\\-43.94531\\-296.0476\\-129\\-45.89844\\-297.2485\\-129\\-47.85156\\-298.6942\\-129\\-49.96142\\-299.8672\\-129\\-51.75781\\-300.7437\\-129\\-53.71094\\-301.3386\\-129\\-55.66406\\-302.1671\\-129\\-57.61719\\-302.6399\\-129\\-61.52344\\-303.1205\\-129\\-65.42969\\-303.8682\\-129\\-67.38281\\-304.1302\\-129\\-69.33594\\-304.2531\\-129\\-73.24219\\-304.2954\\-129\\-75.19531\\-304.2443\\-129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "169" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "48" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-302.0349\\-129\\59.57031\\-301.4646\\-129\\55.66406\\-300.6698\\-129\\53.71094\\-300.0169\\-129\\51.75781\\-299.0543\\-129\\49.80469\\-298.2674\\-129\\47.85156\\-297.0794\\-129\\45.89844\\-296.1337\\-129\\43.94531\\-294.9598\\-129\\40.03906\\-292.1786\\-129\\37.65462\\-290.1016\\-129\\36.13281\\-288.8677\\-129\\33.39448\\-286.1953\\-129\\29.98708\\-282.2891\\-129\\28.32031\\-280.2162\\-129\\25.68867\\-276.4297\\-129\\24.41406\\-274.2281\\-129\\22.46094\\-271.0142\\-129\\22.10046\\-270.5703\\-129\\21.22708\\-268.6172\\-129\\20.07892\\-266.6641\\-129\\18.82037\\-262.7578\\-129\\17.83265\\-260.8047\\-129\\17.32086\\-258.8516\\-129\\16.41456\\-256.8984\\-129\\15.7666\\-254.9453\\-129\\15.27936\\-252.9922\\-129\\14.53912\\-251.0391\\-129\\14.03073\\-249.0859\\-129\\13.49706\\-245.1797\\-129\\13.1537\\-243.2266\\-129\\12.19733\\-239.3203\\-129\\11.90396\\-237.3672\\-129\\11.55772\\-233.4609\\-129\\11.07449\\-229.5547\\-129\\10.62012\\-227.6016\\-129\\10.3075\\-225.6484\\-129\\10.12074\\-223.6953\\-129\\9.880786\\-219.7891\\-129\\9.595352\\-213.9297\\-129\\9.231852\\-210.0234\\-129\\8.694322\\-206.1172\\-129\\8.507236\\-202.2109\\-129\\9.841108\\-190.4922\\-129\\10.02798\\-188.5391\\-129\\10.21205\\-184.6328\\-129\\10.59358\\-180.7266\\-129\\11.34091\\-176.8203\\-129\\11.95427\\-170.9609\\-129\\12.40517\\-169.0078\\-129\\13.04605\\-167.0547\\-129\\13.82036\\-163.1484\\-129\\14.39576\\-161.1953\\-129\\15.39586\\-159.2422\\-129\\16.19204\\-157.2891\\-129\\17.45144\\-155.3359\\-129\\18.48548\\-153.3828\\-129\\19.65565\\-151.4297\\-129\\21.12815\\-149.4766\\-129\\22.46094\\-147.8589\\-129\\28.56237\\-141.6641\\-129\\31.01223\\-139.7109\\-129\\34.17969\\-137.4113\\-129\\36.13281\\-136.3479\\-129\\38.08594\\-135.0824\\-129\\41.99219\\-133.1692\\-129\\43.94531\\-132.664\\-129\\47.85156\\-131.0904\\-129\\49.80469\\-130.6444\\-129\\51.7759\\-129.9453\\-129\\53.71094\\-129.3583\\-129\\55.66406\\-129.0659\\-129\\59.57031\\-128.6188\\-129\\63.47656\\-128.2911\\-129\\67.38281\\-128.1296\\-129\\69.33594\\-128.1023\\-129\\75.19531\\-128.4463\\-129\\84.96094\\-129.1979\\-129\\88.86719\\-129.6733\\-129\\92.77344\\-130.4857\\-129\\98.63281\\-131.1798\\-129\\104.4922\\-132.404\\-129\\106.4453\\-132.6887\\-129\\110.3516\\-133.3633\\-129\\114.2578\\-134.5635\\-129\\116.2109\\-134.9685\\-129\\118.1641\\-135.5226\\-129\\120.1172\\-136.3581\\-129\\122.0703\\-136.944\\-129\\125.9766\\-138.6266\\-129\\127.9297\\-139.2934\\-129\\129.8828\\-140.3416\\-129\\131.8359\\-141.169\\-129\\133.7891\\-142.3714\\-129\\135.7422\\-143.4734\\-129\\139.6484\\-146.1508\\-129\\141.6016\\-147.295\\-129\\143.5547\\-148.8459\\-129\\146.537\\-151.4297\\-129\\149.4141\\-154.021\\-129\\152.5269\\-157.2891\\-129\\154.3172\\-159.2422\\-129\\155.877\\-161.1953\\-129\\158.3452\\-165.1016\\-129\\159.7524\\-167.0547\\-129\\160.7068\\-169.0078\\-129\\161.8367\\-170.9609\\-129\\162.4499\\-172.9141\\-129\\163.4404\\-174.8672\\-129\\164.6524\\-178.7734\\-129\\165.4738\\-180.7266\\-129\\165.911\\-182.6797\\-129\\167.335\\-190.4922\\-129\\167.6798\\-194.3984\\-129\\167.8317\\-198.3047\\-129\\167.8826\\-202.2109\\-129\\167.8203\\-208.0703\\-129\\167.649\\-211.9766\\-129\\167.3242\\-215.8828\\-129\\167.0298\\-217.8359\\-129\\166.2884\\-221.7422\\-129\\165.6883\\-225.6484\\-129\\165.2261\\-227.6016\\-129\\164.5356\\-229.5547\\-129\\163.7275\\-233.4609\\-129\\162.3352\\-237.3672\\-129\\161.8984\\-239.3203\\-129\\161.1328\\-241.2284\\-129\\160.221\\-243.2266\\-129\\159.4424\\-245.1797\\-129\\158.3122\\-247.1328\\-129\\157.4383\\-249.0859\\-129\\156.347\\-251.0391\\-129\\155.4627\\-252.9922\\-129\\154.2729\\-254.9453\\-129\\152.9558\\-256.8984\\-129\\151.7513\\-258.8516\\-129\\150.3433\\-260.8047\\-129\\147.6788\\-264.7109\\-129\\145.5078\\-267.3606\\-129\\142.7263\\-270.5703\\-129\\139.6484\\-273.9408\\-129\\133.7891\\-279.7691\\-129\\131.8359\\-281.4907\\-129\\128.5728\\-284.2422\\-129\\125.9766\\-286.308\\-129\\122.0703\\-289.0006\\-129\\120.1172\\-290.239\\-129\\118.1641\\-291.3223\\-129\\116.2109\\-292.7654\\-129\\112.3047\\-294.8526\\-129\\110.3516\\-295.5246\\-129\\108.3984\\-296.5577\\-129\\106.4453\\-297.1382\\-129\\104.4922\\-298.0757\\-129\\102.5391\\-298.8143\\-129\\100.5859\\-299.4478\\-129\\98.63281\\-300.2767\\-129\\96.67969\\-300.7067\\-129\\92.77344\\-301.4066\\-129\\88.86719\\-302.2818\\-129\\86.91406\\-302.5377\\-129\\83.00781\\-302.7969\\-129\\79.10156\\-302.9434\\-129\\75.19531\\-303.0065\\-129\\73.24219\\-302.9779\\-129\\67.38281\\-302.7527\\-129\\65.42969\\-302.6283\\-129\\63.47656\\-302.4012\\-129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "49" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.8955\\-127\\-83.00781\\-303.3039\\-127\\-88.86719\\-302.6648\\-127\\-90.82031\\-302.3477\\-127\\-94.72656\\-301.2306\\-127\\-98.63281\\-300.3184\\-127\\-100.5859\\-299.388\\-127\\-102.5391\\-298.6878\\-127\\-104.4922\\-297.6381\\-127\\-106.4453\\-296.8201\\-127\\-110.3516\\-294.9359\\-127\\-114.2578\\-292.7522\\-127\\-116.2109\\-291.2419\\-127\\-118.1641\\-289.9093\\-127\\-120.1172\\-288.823\\-127\\-123.4111\\-286.1953\\-127\\-125.9766\\-284.0057\\-127\\-127.9297\\-282.582\\-127\\-129.8828\\-280.8279\\-127\\-136.1979\\-274.4766\\-127\\-139.33\\-270.5703\\-127\\-141.0143\\-268.6172\\-127\\-142.5159\\-266.6641\\-127\\-143.8535\\-264.7109\\-127\\-145.0684\\-262.7578\\-127\\-145.5078\\-262.2494\\-127\\-147.9326\\-258.8516\\-127\\-148.8882\\-256.8984\\-127\\-150.1116\\-254.9453\\-127\\-150.9671\\-252.9922\\-127\\-152.2035\\-251.0391\\-127\\-154.2571\\-247.1328\\-127\\-155.0871\\-245.1797\\-127\\-156.0385\\-243.2266\\-127\\-156.6193\\-241.2734\\-127\\-157.6599\\-239.3203\\-127\\-158.3239\\-237.3672\\-127\\-159.3413\\-235.4141\\-127\\-160.7079\\-231.5078\\-127\\-161.5617\\-229.5547\\-127\\-162.062\\-227.6016\\-127\\-162.4122\\-225.6484\\-127\\-163.0151\\-223.6953\\-127\\-163.7198\\-221.7422\\-127\\-164.5058\\-217.8359\\-127\\-165.2007\\-215.8828\\-127\\-165.6884\\-213.9297\\-127\\-166.3506\\-210.0234\\-127\\-167.1408\\-206.1172\\-127\\-167.379\\-204.1641\\-127\\-167.5166\\-202.2109\\-127\\-167.5494\\-198.3047\\-127\\-167.2296\\-194.3984\\-127\\-166.4215\\-190.4922\\-127\\-165.6954\\-186.5859\\-127\\-164.3053\\-182.6797\\-127\\-163.7827\\-180.7266\\-127\\-162.838\\-178.7734\\-127\\-162.1033\\-176.8203\\-127\\-161.2031\\-174.8672\\-127\\-159.9765\\-172.9141\\-127\\-158.4188\\-170.9609\\-127\\-156.9616\\-169.0078\\-127\\-155.7034\\-167.0547\\-127\\-153.9783\\-165.1016\\-127\\-149.4141\\-160.6673\\-127\\-147.4609\\-159.0469\\-127\\-145.5078\\-157.7349\\-127\\-141.6016\\-154.4768\\-127\\-139.6484\\-153.0403\\-127\\-137.6953\\-152.0433\\-127\\-136.9124\\-151.4297\\-127\\-133.7891\\-149.2771\\-127\\-131.8359\\-148.1725\\-127\\-129.8828\\-146.9148\\-127\\-127.9297\\-146.0303\\-127\\-125.9766\\-144.8617\\-127\\-123.6842\\-143.6172\\-127\\-120.1172\\-141.5774\\-127\\-114.2578\\-138.9071\\-127\\-112.3047\\-138.1784\\-127\\-110.3516\\-137.1882\\-127\\-108.3984\\-136.487\\-127\\-106.4453\\-135.5205\\-127\\-102.5391\\-134.2974\\-127\\-100.5859\\-133.5459\\-127\\-98.63281\\-132.9899\\-127\\-96.67969\\-132.5561\\-127\\-92.77344\\-131.4041\\-127\\-88.86719\\-130.5902\\-127\\-84.96094\\-129.638\\-127\\-81.05469\\-129.0287\\-127\\-73.24219\\-128.3652\\-127\\-69.33594\\-127.868\\-127\\-65.42969\\-127.7984\\-127\\-63.47656\\-127.8561\\-127\\-59.57031\\-128.1624\\-127\\-53.71094\\-128.9517\\-127\\-51.75781\\-129.2652\\-127\\-49.80469\\-129.7321\\-127\\-47.85156\\-130.4023\\-127\\-45.89844\\-130.9003\\-127\\-43.94531\\-131.5143\\-127\\-41.99219\\-132.356\\-127\\-40.03906\\-132.9177\\-127\\-38.08594\\-133.6578\\-127\\-34.31332\\-135.8047\\-127\\-32.22656\\-137.1564\\-127\\-30.27344\\-138.6859\\-127\\-28.7866\\-139.7109\\-127\\-26.36719\\-141.7256\\-127\\-24.7521\\-143.6172\\-127\\-22.46094\\-146.1592\\-127\\-21.32265\\-147.5234\\-127\\-19.84197\\-149.4766\\-127\\-18.99858\\-151.4297\\-127\\-17.73999\\-153.3828\\-127\\-16.95963\\-155.3359\\-127\\-15.88611\\-157.2891\\-127\\-15.26731\\-159.2422\\-127\\-14.38395\\-161.1953\\-127\\-13.86604\\-163.1484\\-127\\-13.22508\\-167.0547\\-127\\-12.18776\\-170.9609\\-127\\-11.90396\\-172.9141\\-127\\-11.36467\\-178.7734\\-127\\-10.55519\\-184.6328\\-127\\-10.47165\\-186.5859\\-127\\-10.66142\\-190.4922\\-127\\-10.9489\\-192.4453\\-127\\-11.31283\\-196.3516\\-127\\-11.38762\\-198.3047\\-127\\-11.33737\\-200.2578\\-127\\-10.53049\\-204.1641\\-127\\-10.07269\\-208.0703\\-127\\-9.9769\\-211.9766\\-127\\-10.06611\\-217.8359\\-127\\-10.18025\\-219.7891\\-127\\-10.46036\\-221.7422\\-127\\-10.5678\\-223.6953\\-127\\-11.28406\\-227.6016\\-127\\-11.43506\\-229.5547\\-127\\-12.10814\\-235.4141\\-127\\-13.10333\\-239.3203\\-127\\-14.03443\\-245.1797\\-127\\-14.62573\\-247.1328\\-127\\-15.36494\\-249.0859\\-127\\-15.87685\\-251.0391\\-127\\-16.76551\\-252.9922\\-127\\-17.47241\\-254.9453\\-127\\-18.03663\\-256.8984\\-127\\-19.08102\\-258.8516\\-127\\-19.59044\\-260.8047\\-127\\-20.28189\\-262.7578\\-127\\-21.34563\\-264.7109\\-127\\-22.11442\\-266.6641\\-127\\-23.35394\\-268.6172\\-127\\-26.34277\\-274.4766\\-127\\-27.45689\\-276.4297\\-127\\-28.81485\\-278.3828\\-127\\-29.99161\\-280.3359\\-127\\-32.84439\\-284.2422\\-127\\-34.10993\\-286.1953\\-127\\-35.69955\\-288.1484\\-127\\-40.03906\\-292.8663\\-127\\-41.99219\\-294.6567\\-127\\-45.89844\\-297.1832\\-127\\-47.85156\\-298.6288\\-127\\-51.75781\\-300.6732\\-127\\-53.71094\\-301.265\\-127\\-55.66406\\-302.0773\\-127\\-57.61719\\-302.5838\\-127\\-61.52344\\-303.0864\\-127\\-65.42969\\-303.7961\\-127\\-67.38281\\-304.0774\\-127\\-71.28906\\-304.2617\\-127\\-73.24219\\-304.2617\\-127\\-77.14844\\-304.0774\\-127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "169" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "50" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-301.95\\-127\\59.57031\\-301.396\\-127\\55.66406\\-300.5925\\-127\\53.71094\\-299.8899\\-127\\51.75781\\-298.977\\-127\\49.80469\\-298.165\\-127\\47.85156\\-297.0156\\-127\\45.89844\\-296.0318\\-127\\43.94531\\-294.9172\\-127\\40.03906\\-292.0923\\-127\\37.74372\\-290.1016\\-127\\36.13281\\-288.8106\\-127\\33.41571\\-286.1953\\-127\\30.02743\\-282.2891\\-127\\28.32031\\-280.1641\\-127\\25.70544\\-276.4297\\-127\\24.66196\\-274.4766\\-127\\24.41406\\-274.1963\\-127\\22.46094\\-270.9981\\-127\\22.11122\\-270.5703\\-127\\21.23442\\-268.6172\\-127\\20.08928\\-266.6641\\-127\\18.84694\\-262.7578\\-127\\17.84589\\-260.8047\\-127\\17.32746\\-258.8516\\-127\\16.42718\\-256.8984\\-127\\15.78203\\-254.9453\\-127\\15.32616\\-252.9922\\-127\\14.59585\\-251.0391\\-127\\14.08275\\-249.0859\\-127\\13.21916\\-243.2266\\-127\\12.28448\\-239.3203\\-127\\11.96145\\-237.3672\\-127\\11.28882\\-229.5547\\-127\\10.47165\\-225.6484\\-127\\10.07269\\-221.7422\\-127\\9.775061\\-215.8828\\-127\\9.508359\\-211.9766\\-127\\9.309506\\-210.0234\\-127\\8.736879\\-206.1172\\-127\\8.57736\\-204.1641\\-127\\8.553341\\-200.2578\\-127\\8.766352\\-198.3047\\-127\\9.08801\\-196.3516\\-127\\9.822237\\-190.4922\\-127\\10.00977\\-188.5391\\-127\\10.19597\\-184.6328\\-127\\10.53049\\-180.7266\\-127\\11.3246\\-176.8203\\-127\\11.94719\\-170.9609\\-127\\12.36747\\-169.0078\\-127\\13.02316\\-167.0547\\-127\\13.81549\\-163.1484\\-127\\14.37039\\-161.1953\\-127\\15.37812\\-159.2422\\-127\\16.1532\\-157.2891\\-127\\17.44088\\-155.3359\\-127\\18.47076\\-153.3828\\-127\\19.64321\\-151.4297\\-127\\21.06855\\-149.4766\\-127\\22.46094\\-147.7219\\-127\\26.40857\\-143.6172\\-127\\28.40021\\-141.6641\\-127\\30.89334\\-139.7109\\-127\\34.17969\\-137.2936\\-127\\36.13281\\-136.2045\\-127\\38.08594\\-134.9603\\-127\\41.99219\\-133.0327\\-127\\43.94531\\-132.5267\\-127\\45.89844\\-131.5166\\-127\\49.80469\\-130.3448\\-127\\51.75781\\-129.512\\-127\\53.71094\\-129.0972\\-127\\59.57031\\-128.1959\\-127\\63.47656\\-127.7587\\-127\\67.38281\\-127.6328\\-127\\69.33594\\-127.6218\\-127\\73.24219\\-127.739\\-127\\77.14844\\-127.9999\\-127\\81.05469\\-128.4079\\-127\\88.86719\\-128.9238\\-127\\94.72656\\-129.5371\\-127\\100.5859\\-130.651\\-127\\102.5391\\-130.9219\\-127\\106.4453\\-131.7215\\-127\\108.3984\\-132.2656\\-127\\114.2578\\-133.6054\\-127\\116.2109\\-134.2701\\-127\\120.1172\\-135.32\\-127\\122.0703\\-136.214\\-127\\124.0234\\-136.8977\\-127\\129.8828\\-139.5749\\-127\\133.7891\\-141.6071\\-127\\135.7422\\-142.8398\\-127\\137.6953\\-144.2614\\-127\\139.6484\\-145.3962\\-127\\141.6016\\-146.7164\\-127\\143.5547\\-148.2626\\-127\\147.3114\\-151.4297\\-127\\149.4141\\-153.3739\\-127\\153.3203\\-157.497\\-127\\155.2734\\-159.8467\\-127\\157.6001\\-163.1484\\-127\\158.6784\\-165.1016\\-127\\160.0176\\-167.0547\\-127\\162.0123\\-170.9609\\-127\\162.6252\\-172.9141\\-127\\163.6311\\-174.8672\\-127\\164.1692\\-176.8203\\-127\\165.5884\\-180.7266\\-127\\166.317\\-184.6328\\-127\\167.1007\\-188.5391\\-127\\167.379\\-190.4922\\-127\\167.7029\\-194.3984\\-127\\167.8431\\-198.3047\\-127\\167.8941\\-202.2109\\-127\\167.8711\\-206.1172\\-127\\167.649\\-211.9766\\-127\\167.3242\\-215.8828\\-127\\167.0444\\-217.8359\\-127\\166.3174\\-221.7422\\-127\\165.6954\\-225.6484\\-127\\165.2508\\-227.6016\\-127\\164.5447\\-229.5547\\-127\\163.7426\\-233.4609\\-127\\162.3428\\-237.3672\\-127\\161.9104\\-239.3203\\-127\\161.1328\\-241.229\\-127\\160.2153\\-243.2266\\-127\\159.4187\\-245.1797\\-127\\158.2961\\-247.1328\\-127\\157.4136\\-249.0859\\-127\\156.3293\\-251.0391\\-127\\155.4195\\-252.9922\\-127\\154.237\\-254.9453\\-127\\152.8855\\-256.8984\\-127\\151.6859\\-258.8516\\-127\\149.4141\\-262.1575\\-127\\147.5938\\-264.7109\\-127\\145.5078\\-267.2789\\-127\\142.6785\\-270.5703\\-127\\139.6484\\-273.8813\\-127\\133.7891\\-279.7231\\-127\\131.8359\\-281.4567\\-127\\128.546\\-284.2422\\-127\\125.9766\\-286.2792\\-127\\122.0703\\-288.9882\\-127\\120.1172\\-290.2255\\-127\\118.1641\\-291.3294\\-127\\116.2109\\-292.7654\\-127\\112.3047\\-294.8406\\-127\\110.3516\\-295.5139\\-127\\108.3984\\-296.5577\\-127\\106.4453\\-297.1274\\-127\\104.4922\\-298.0627\\-127\\102.5391\\-298.8088\\-127\\100.5859\\-299.4311\\-127\\98.63281\\-300.254\\-127\\96.67969\\-300.7018\\-127\\92.77344\\-301.3931\\-127\\88.86719\\-302.2685\\-127\\86.91406\\-302.5179\\-127\\83.00781\\-302.7859\\-127\\79.10156\\-302.9264\\-127\\75.19531\\-302.9715\\-127\\73.24219\\-302.9417\\-127\\67.38281\\-302.7358\\-127\\65.42969\\-302.5956\\-127\\63.47656\\-302.3477\\-127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "177" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "51" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-303.811\\-125\\-81.05469\\-303.5014\\-125\\-84.96094\\-303.0133\\-125\\-88.86719\\-302.6283\\-125\\-90.82031\\-302.2952\\-125\\-92.77344\\-301.705\\-125\\-96.67969\\-300.7867\\-125\\-98.63281\\-300.2693\\-125\\-100.5859\\-299.3286\\-125\\-102.5391\\-298.6451\\-125\\-104.4922\\-297.5908\\-125\\-106.4453\\-296.808\\-125\\-108.3984\\-295.7982\\-125\\-110.3516\\-294.9237\\-125\\-114.2578\\-292.7299\\-125\\-116.2109\\-291.2351\\-125\\-118.1641\\-289.8803\\-125\\-120.1172\\-288.8102\\-125\\-122.0703\\-287.2727\\-125\\-125.7264\\-284.2422\\-125\\-127.9297\\-282.5692\\-125\\-129.8828\\-280.8168\\-125\\-136.1867\\-274.4766\\-125\\-139.3158\\-270.5703\\-125\\-141.0011\\-268.6172\\-125\\-142.5101\\-266.6641\\-125\\-143.8535\\-264.7109\\-125\\-145.0576\\-262.7578\\-125\\-145.5078\\-262.2332\\-125\\-147.9394\\-258.8516\\-125\\-148.8783\\-256.8984\\-125\\-150.1038\\-254.9453\\-125\\-150.9564\\-252.9922\\-125\\-152.2157\\-251.0391\\-125\\-153.3203\\-249.0515\\-125\\-154.2685\\-247.1328\\-125\\-156.0584\\-243.2266\\-125\\-156.6406\\-241.2734\\-125\\-157.697\\-239.3203\\-125\\-158.3509\\-237.3672\\-125\\-159.3791\\-235.4141\\-125\\-160.7617\\-231.5078\\-125\\-161.6081\\-229.5547\\-125\\-162.0857\\-227.6016\\-125\\-162.4577\\-225.6484\\-125\\-163.7756\\-221.7422\\-125\\-164.5821\\-217.8359\\-125\\-165.3209\\-215.8828\\-125\\-165.7664\\-213.9297\\-125\\-166.4384\\-210.0234\\-125\\-167.2414\\-206.1172\\-125\\-167.4866\\-204.1641\\-125\\-167.6099\\-202.2109\\-125\\-167.6413\\-198.3047\\-125\\-167.379\\-194.3984\\-125\\-165.7883\\-186.5859\\-125\\-165.2261\\-184.6328\\-125\\-164.3899\\-182.6797\\-125\\-163.8704\\-180.7266\\-125\\-162.9979\\-178.7734\\-125\\-161.3751\\-174.8672\\-125\\-160.0669\\-172.9141\\-125\\-158.5515\\-170.9609\\-125\\-155.8344\\-167.0547\\-125\\-154.1029\\-165.1016\\-125\\-149.4141\\-160.5187\\-125\\-147.4609\\-158.8329\\-125\\-145.5078\\-157.4122\\-125\\-142.9932\\-155.3359\\-125\\-139.6484\\-152.7077\\-125\\-137.6953\\-151.5978\\-125\\-135.7422\\-150.2716\\-125\\-133.7891\\-148.7905\\-125\\-128.3137\\-145.5703\\-125\\-125.9766\\-144.3021\\-125\\-124.0234\\-143.0051\\-125\\-122.0703\\-141.9846\\-125\\-120.1172\\-140.7831\\-125\\-118.1641\\-139.9866\\-125\\-116.2109\\-138.9422\\-125\\-114.2578\\-138.1317\\-125\\-112.3047\\-137.1271\\-125\\-110.3516\\-136.3113\\-125\\-108.3984\\-135.3873\\-125\\-104.4922\\-133.9592\\-125\\-102.5391\\-133.1627\\-125\\-100.5859\\-132.7983\\-125\\-96.67969\\-131.4173\\-125\\-94.72656\\-130.8803\\-125\\-92.77344\\-130.4482\\-125\\-88.86719\\-129.2771\\-125\\-86.91406\\-128.9481\\-125\\-81.05469\\-128.081\\-125\\-79.10156\\-127.7312\\-125\\-77.14844\\-127.4837\\-125\\-71.28906\\-127.1297\\-125\\-69.33594\\-127.0584\\-125\\-63.47656\\-127.0859\\-125\\-59.57031\\-127.2722\\-125\\-57.61719\\-127.4373\\-125\\-55.66406\\-127.7167\\-125\\-53.71094\\-128.3056\\-125\\-49.80469\\-129.0516\\-125\\-47.85156\\-129.4991\\-125\\-45.89844\\-130.2755\\-125\\-41.99219\\-131.5198\\-125\\-40.03906\\-132.4804\\-125\\-38.08594\\-133.1029\\-125\\-36.13281\\-134.2465\\-125\\-34.17969\\-135.2174\\-125\\-30.27344\\-138.2024\\-125\\-28.32031\\-139.5141\\-125\\-25.987\\-141.6641\\-125\\-22.46094\\-145.9068\\-125\\-19.75517\\-149.4766\\-125\\-18.90397\\-151.4297\\-125\\-17.68007\\-153.3828\\-125\\-16.80531\\-155.3359\\-125\\-15.82132\\-157.2891\\-125\\-15.18378\\-159.2422\\-125\\-14.31418\\-161.1953\\-125\\-13.8432\\-163.1484\\-125\\-13.18359\\-167.0547\\-125\\-12.16554\\-170.9609\\-125\\-11.87323\\-172.9141\\-125\\-11.31766\\-178.7734\\-125\\-11.0919\\-180.7266\\-125\\-10.46036\\-184.6328\\-125\\-10.39567\\-186.5859\\-125\\-10.59358\\-190.4922\\-125\\-10.88275\\-192.4453\\-125\\-11.2754\\-196.3516\\-125\\-11.36106\\-198.3047\\-125\\-11.24878\\-200.2578\\-125\\-10.70463\\-202.2109\\-125\\-10.21205\\-206.1172\\-125\\-9.988433\\-210.0234\\-125\\-9.9769\\-213.9297\\-125\\-10.14245\\-219.7891\\-125\\-10.5678\\-223.6953\\-125\\-11.31979\\-227.6016\\-125\\-11.8606\\-233.4609\\-125\\-12.12565\\-235.4141\\-125\\-13.11384\\-239.3203\\-125\\-14.02274\\-245.1797\\-125\\-14.61088\\-247.1328\\-125\\-15.36602\\-249.0859\\-125\\-15.87685\\-251.0391\\-125\\-16.77848\\-252.9922\\-125\\-17.48798\\-254.9453\\-125\\-18.03663\\-256.8984\\-125\\-19.09931\\-258.8516\\-125\\-19.59044\\-260.8047\\-125\\-20.2691\\-262.7578\\-125\\-21.3395\\-264.7109\\-125\\-22.13542\\-266.6641\\-125\\-23.35875\\-268.6172\\-125\\-26.3265\\-274.4766\\-125\\-27.45689\\-276.4297\\-125\\-28.80233\\-278.3828\\-125\\-29.98047\\-280.3359\\-125\\-32.85767\\-284.2422\\-125\\-34.15606\\-286.1953\\-125\\-35.74916\\-288.1484\\-125\\-40.03906\\-292.8003\\-125\\-41.99219\\-294.5897\\-125\\-45.89844\\-297.1244\\-125\\-47.85156\\-298.5522\\-125\\-49.80469\\-299.5307\\-125\\-51.75781\\-300.6188\\-125\\-53.71094\\-301.1925\\-125\\-55.66406\\-301.9805\\-125\\-57.61719\\-302.53\\-125\\-61.52344\\-303.0536\\-125\\-67.38281\\-304.0092\\-125\\-71.28906\\-304.2173\\-125\\-75.19531\\-304.1604\\-125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "170" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "52" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-301.86\\-125\\59.57031\\-301.3288\\-125\\55.66406\\-300.5317\\-125\\53.9363\\-299.8672\\-125\\49.80469\\-298.037\\-125\\43.94531\\-294.8615\\-125\\40.11418\\-292.0547\\-125\\37.82038\\-290.1016\\-125\\36.13281\\-288.7656\\-125\\33.45905\\-286.1953\\-125\\30.05559\\-282.2891\\-125\\28.32031\\-280.1317\\-125\\25.71399\\-276.4297\\-125\\24.6878\\-274.4766\\-125\\24.41406\\-274.1624\\-125\\22.46094\\-270.9658\\-125\\22.13319\\-270.5703\\-125\\21.25324\\-268.6172\\-125\\20.076\\-266.6641\\-125\\18.84909\\-262.7578\\-125\\17.84589\\-260.8047\\-125\\17.3236\\-258.8516\\-125\\16.42718\\-256.8984\\-125\\15.80166\\-254.9453\\-125\\15.34673\\-252.9922\\-125\\14.64844\\-250.9352\\-125\\14.11522\\-249.0859\\-125\\13.27237\\-243.2266\\-125\\12.89208\\-241.2734\\-125\\12.39102\\-239.3203\\-125\\12.03435\\-237.3672\\-125\\11.83745\\-235.4141\\-125\\11.36834\\-229.5547\\-125\\11.1183\\-227.6016\\-125\\10.6756\\-225.6484\\-125\\10.36516\\-223.6953\\-125\\10.17253\\-221.7422\\-125\\9.848933\\-215.8828\\-125\\9.577434\\-211.9766\\-125\\9.359195\\-210.0234\\-125\\8.766352\\-206.1172\\-125\\8.57736\\-204.1641\\-125\\8.507236\\-200.2578\\-125\\8.57736\\-198.3047\\-125\\9.80829\\-190.4922\\-125\\9.961872\\-188.5391\\-125\\10.14245\\-184.6328\\-125\\10.4831\\-180.7266\\-125\\11.31283\\-176.8203\\-125\\11.94018\\-170.9609\\-125\\12.34209\\-169.0078\\-125\\12.99741\\-167.0547\\-125\\13.804\\-163.1484\\-125\\14.35884\\-161.1953\\-125\\15.34999\\-159.2422\\-125\\16.11328\\-157.2891\\-125\\17.4136\\-155.3359\\-125\\18.41412\\-153.3828\\-125\\19.59924\\-151.4297\\-125\\22.46094\\-147.5829\\-125\\26.19485\\-143.6172\\-125\\28.32031\\-141.5202\\-125\\30.27344\\-140.1202\\-125\\34.17969\\-137.1707\\-125\\38.08594\\-134.8047\\-125\\40.03906\\-133.6761\\-125\\41.99219\\-132.8868\\-125\\43.94531\\-132.231\\-125\\45.89844\\-131.2088\\-125\\47.85156\\-130.6096\\-125\\49.80469\\-129.6926\\-125\\51.75781\\-129.1198\\-125\\57.61719\\-127.8786\\-125\\59.57031\\-127.5785\\-125\\63.47656\\-127.2769\\-125\\69.33594\\-127.0991\\-125\\77.14844\\-127.0446\\-125\\86.91406\\-127.2704\\-125\\92.77344\\-127.5845\\-125\\94.72656\\-127.7989\\-125\\96.67969\\-128.2409\\-125\\102.5391\\-129.0583\\-125\\104.4922\\-129.5101\\-125\\106.4453\\-130.1406\\-125\\108.3984\\-130.57\\-125\\110.3516\\-131.1601\\-125\\113.2813\\-131.8984\\-125\\118.1641\\-133.3894\\-125\\120.1172\\-134.2724\\-125\\122.0703\\-134.8968\\-125\\124.0234\\-135.7595\\-125\\127.9297\\-137.684\\-125\\133.7891\\-140.7831\\-125\\135.7422\\-142.0804\\-125\\137.6953\\-143.2765\\-125\\139.6484\\-144.7514\\-125\\140.9538\\-145.5703\\-125\\143.5547\\-147.413\\-125\\145.5078\\-148.9883\\-125\\148.2721\\-151.4297\\-125\\151.3672\\-154.5472\\-125\\153.8675\\-157.2891\\-125\\155.4118\\-159.2422\\-125\\156.6102\\-161.1953\\-125\\157.2266\\-161.9713\\-125\\159.1876\\-165.1016\\-125\\161.463\\-169.0078\\-125\\162.8937\\-172.9141\\-125\\163.7866\\-174.8672\\-125\\164.3192\\-176.8203\\-125\\165.0618\\-178.7734\\-125\\165.6813\\-180.7266\\-125\\167.1538\\-188.5391\\-125\\167.4241\\-190.4922\\-125\\167.7145\\-194.3984\\-125\\167.8545\\-198.3047\\-125\\167.8994\\-202.2109\\-125\\167.8251\\-208.0703\\-125\\167.6607\\-211.9766\\-125\\167.3242\\-215.8828\\-125\\167.0444\\-217.8359\\-125\\166.3356\\-221.7422\\-125\\165.7023\\-225.6484\\-125\\165.2748\\-227.6016\\-125\\164.5538\\-229.5547\\-125\\163.7464\\-233.4609\\-125\\162.3428\\-237.3672\\-125\\161.9057\\-239.3203\\-125\\161.1328\\-241.229\\-125\\160.2102\\-243.2266\\-125\\159.4187\\-245.1797\\-125\\158.2858\\-247.1328\\-125\\157.401\\-249.0859\\-125\\156.3171\\-251.0391\\-125\\155.375\\-252.9922\\-125\\154.2065\\-254.9453\\-125\\152.8288\\-256.8984\\-125\\151.6373\\-258.8516\\-125\\149.4141\\-262.0679\\-125\\147.4855\\-264.7109\\-125\\145.5078\\-267.1854\\-125\\142.6116\\-270.5703\\-125\\139.6484\\-273.8146\\-125\\133.7891\\-279.6604\\-125\\131.8359\\-281.4305\\-125\\128.514\\-284.2422\\-125\\125.9766\\-286.2344\\-125\\122.0703\\-288.9757\\-125\\120.1172\\-290.1978\\-125\\118.1641\\-291.318\\-125\\116.2109\\-292.7581\\-125\\112.3047\\-294.8286\\-125\\110.3516\\-295.4897\\-125\\108.3984\\-296.5457\\-125\\106.4453\\-297.1057\\-125\\104.4922\\-298.0361\\-125\\102.5391\\-298.793\\-125\\100.5859\\-299.4094\\-125\\98.63281\\-300.2334\\-125\\96.67969\\-300.6905\\-125\\92.77344\\-301.3691\\-125\\88.86719\\-302.2369\\-125\\86.91406\\-302.5057\\-125\\83.00781\\-302.7694\\-125\\79.10156\\-302.9036\\-125\\75.19531\\-302.9434\\-125\\73.24219\\-302.9143\\-125\\67.38281\\-302.7127\\-125\\65.42969\\-302.5572\\-125\\63.47656\\-302.292\\-125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "184" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "53" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.9221\\-123\\-81.05469\\-303.3867\\-123\\-88.86719\\-302.5765\\-123\\-90.82031\\-302.2123\\-123\\-92.77344\\-301.6058\\-123\\-96.67969\\-300.7295\\-123\\-98.63281\\-300.1905\\-123\\-100.5859\\-299.2675\\-123\\-102.5391\\-298.5922\\-123\\-104.4922\\-297.5221\\-123\\-106.4453\\-296.7802\\-123\\-108.3984\\-295.7549\\-123\\-110.3516\\-294.8994\\-123\\-114.2578\\-292.7039\\-123\\-116.2109\\-291.2102\\-123\\-118.1641\\-289.8387\\-123\\-120.1172\\-288.7887\\-123\\-122.0703\\-287.2475\\-123\\-125.9766\\-283.9621\\-123\\-127.9297\\-282.5408\\-123\\-129.8828\\-280.802\\-123\\-136.1607\\-274.4766\\-123\\-137.6703\\-272.5234\\-123\\-140.9658\\-268.6172\\-123\\-142.5044\\-266.6641\\-123\\-143.8264\\-264.7109\\-123\\-145.047\\-262.7578\\-123\\-145.5078\\-262.2215\\-123\\-147.9162\\-258.8516\\-123\\-148.8647\\-256.8984\\-123\\-150.0835\\-254.9453\\-123\\-150.9458\\-252.9922\\-123\\-152.2035\\-251.0391\\-123\\-153.3203\\-249.0292\\-123\\-154.2685\\-247.1328\\-123\\-156.0658\\-243.2266\\-123\\-156.6585\\-241.2734\\-123\\-157.7236\\-239.3203\\-123\\-158.3739\\-237.3672\\-123\\-159.4154\\-235.4141\\-123\\-160.7963\\-231.5078\\-123\\-161.6661\\-229.5547\\-123\\-162.4912\\-225.6484\\-123\\-163.2287\\-223.6953\\-123\\-163.8277\\-221.7422\\-123\\-164.2027\\-219.7891\\-123\\-164.6786\\-217.8359\\-123\\-165.3959\\-215.8828\\-123\\-165.8253\\-213.9297\\-123\\-166.5286\\-210.0234\\-123\\-167.3456\\-206.1172\\-123\\-167.5614\\-204.1641\\-123\\-167.7447\\-200.2578\\-123\\-167.6452\\-196.3516\\-123\\-167.4988\\-194.3984\\-123\\-167.2191\\-192.4453\\-123\\-166.7395\\-190.4922\\-123\\-165.8929\\-186.5859\\-123\\-165.4084\\-184.6328\\-123\\-164.5203\\-182.6797\\-123\\-163.978\\-180.7266\\-123\\-163.2146\\-178.7734\\-123\\-162.2886\\-176.8203\\-123\\-161.5553\\-174.8672\\-123\\-160.2273\\-172.9141\\-123\\-158.7796\\-170.9609\\-123\\-157.5346\\-169.0078\\-123\\-156.0172\\-167.0547\\-123\\-154.3588\\-165.1016\\-123\\-151.3672\\-162.067\\-123\\-149.4141\\-160.1828\\-123\\-143.5547\\-155.1057\\-123\\-141.3212\\-153.3828\\-123\\-135.7422\\-149.3848\\-123\\-133.7891\\-148.1953\\-123\\-131.8359\\-146.735\\-123\\-129.8828\\-145.5794\\-123\\-125.9766\\-143.0108\\-123\\-124.0234\\-141.9296\\-123\\-122.0703\\-140.6635\\-123\\-120.1172\\-139.5206\\-123\\-114.2578\\-136.4469\\-123\\-110.3516\\-134.5707\\-123\\-108.3984\\-133.8815\\-123\\-106.4453\\-132.9434\\-123\\-104.4922\\-132.2872\\-123\\-102.5391\\-131.4253\\-123\\-100.5859\\-131.0314\\-123\\-98.63281\\-130.1028\\-123\\-96.67969\\-129.6025\\-123\\-94.72656\\-128.8527\\-123\\-92.77344\\-128.4361\\-123\\-90.82031\\-128.1191\\-123\\-88.86719\\-127.4357\\-123\\-86.91406\\-127.0945\\-123\\-83.00781\\-126.6748\\-123\\-81.05469\\-126.5318\\-123\\-79.10156\\-126.221\\-123\\-77.14844\\-125.7493\\-123\\-73.24219\\-125.5813\\-123\\-69.33594\\-125.4824\\-123\\-63.47656\\-125.5906\\-123\\-61.52344\\-125.7615\\-123\\-59.57031\\-126.1042\\-123\\-55.66406\\-126.5186\\-123\\-53.71094\\-126.8893\\-123\\-51.75781\\-127.3608\\-123\\-49.77899\\-127.9922\\-123\\-45.89844\\-129.1174\\-123\\-43.94531\\-129.8485\\-123\\-40.03906\\-131.4861\\-123\\-38.08594\\-132.5186\\-123\\-36.13281\\-133.3417\\-123\\-32.43371\\-135.8047\\-123\\-30.27344\\-137.3933\\-123\\-28.32031\\-138.9939\\-123\\-26.36719\\-140.854\\-123\\-23.97075\\-143.6172\\-123\\-22.3736\\-145.5703\\-123\\-19.65256\\-149.4766\\-123\\-18.77254\\-151.4297\\-123\\-17.61014\\-153.3828\\-123\\-15.7638\\-157.2891\\-123\\-15.10336\\-159.2422\\-123\\-14.23356\\-161.1953\\-123\\-13.79251\\-163.1484\\-123\\-13.10614\\-167.0547\\-123\\-12.53634\\-169.0078\\-123\\-12.09578\\-170.9609\\-123\\-11.62109\\-174.8672\\-123\\-11.08099\\-180.7266\\-123\\-10.69\\-182.6797\\-123\\-10.41667\\-184.6328\\-123\\-10.32624\\-186.5859\\-123\\-10.4947\\-190.4922\\-123\\-11.00852\\-194.3984\\-123\\-11.20575\\-196.3516\\-123\\-11.26342\\-198.3047\\-123\\-11.03584\\-200.2578\\-123\\-10.51839\\-202.2109\\-123\\-10.13513\\-206.1172\\-123\\-10.03418\\-208.0703\\-123\\-9.932242\\-213.9297\\-123\\-10.05959\\-219.7891\\-123\\-10.22023\\-221.7422\\-123\\-10.51839\\-223.6953\\-123\\-11.33055\\-227.6016\\-123\\-11.84353\\-233.4609\\-123\\-12.08726\\-235.4141\\-123\\-13.06831\\-239.3203\\-123\\-14.00321\\-245.1797\\-123\\-14.52637\\-247.1328\\-123\\-15.33746\\-249.0859\\-123\\-15.85629\\-251.0391\\-123\\-17.46795\\-254.9453\\-123\\-18.0161\\-256.8984\\-123\\-19.09022\\-258.8516\\-123\\-19.56676\\-260.8047\\-123\\-20.24213\\-262.7578\\-123\\-21.32704\\-264.7109\\-123\\-22.10412\\-266.6641\\-123\\-23.3435\\-268.6172\\-123\\-25.36224\\-272.5234\\-123\\-26.29515\\-274.4766\\-123\\-27.44498\\-276.4297\\-123\\-28.78981\\-278.3828\\-123\\-29.98047\\-280.3359\\-123\\-32.86661\\-284.2422\\-123\\-34.17969\\-286.1663\\-123\\-35.78856\\-288.1484\\-123\\-38.08594\\-290.5975\\-123\\-39.36349\\-292.0547\\-123\\-41.99219\\-294.5099\\-123\\-43.94531\\-295.7092\\-123\\-47.85156\\-298.4648\\-123\\-49.80469\\-299.4102\\-123\\-51.75781\\-300.5284\\-123\\-53.71094\\-301.1174\\-123\\-55.66406\\-301.86\\-123\\-57.61719\\-302.4693\\-123\\-63.47656\\-303.2789\\-123\\-67.38281\\-303.9221\\-123\\-69.33594\\-304.0774\\-123\\-73.24219\\-304.1404\\-123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "169" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "54" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-302.234\\-123\\59.57031\\-301.2742\\-123\\55.66406\\-300.4731\\-123\\51.75781\\-298.8378\\-123\\47.85156\\-296.9048\\-123\\43.94531\\-294.8102\\-123\\40.19368\\-292.0547\\-123\\37.8854\\-290.1016\\-123\\36.13281\\-288.7289\\-123\\33.49474\\-286.1953\\-123\\30.09796\\-282.2891\\-123\\28.32031\\-280.116\\-123\\25.71829\\-276.4297\\-123\\24.70042\\-274.4766\\-123\\24.41406\\-274.1454\\-123\\22.46094\\-270.9365\\-123\\22.15576\\-270.5703\\-123\\21.26034\\-268.6172\\-123\\20.08928\\-266.6641\\-123\\18.82234\\-262.7578\\-123\\17.83265\\-260.8047\\-123\\17.32746\\-258.8516\\-123\\16.43997\\-256.8984\\-123\\15.82129\\-254.9453\\-123\\15.37047\\-252.9922\\-123\\14.15712\\-249.0859\\-123\\13.83653\\-247.1328\\-123\\13.31505\\-243.2266\\-123\\12.99741\\-241.2734\\-123\\12.1205\\-237.3672\\-123\\11.8953\\-235.4141\\-123\\11.43185\\-229.5547\\-123\\11.2274\\-227.6016\\-123\\10.53049\\-223.6953\\-123\\10.28022\\-221.7422\\-123\\9.924492\\-215.8828\\-123\\9.636739\\-211.9766\\-123\\9.409015\\-210.0234\\-123\\8.766352\\-206.1172\\-123\\8.553341\\-204.1641\\-123\\8.463542\\-200.2578\\-123\\8.4851\\-198.3047\\-123\\8.653626\\-196.3516\\-123\\9.449047\\-192.4453\\-123\\9.74169\\-190.4922\\-123\\10.07934\\-184.6328\\-123\\10.44922\\-180.7266\\-123\\11.26342\\-176.8203\\-123\\11.94018\\-170.9609\\-123\\12.31971\\-169.0078\\-123\\12.9996\\-167.0547\\-123\\13.79251\\-163.1484\\-123\\14.32292\\-161.1953\\-123\\15.32018\\-159.2422\\-123\\16.08351\\-157.2891\\-123\\17.3731\\-155.3359\\-123\\18.33531\\-153.3828\\-123\\20.50781\\-150.0589\\-123\\22.37894\\-147.5234\\-123\\26.00861\\-143.6172\\-123\\28.32031\\-141.3241\\-123\\32.22656\\-138.5115\\-123\\33.13961\\-137.7578\\-123\\36.13281\\-135.6937\\-123\\38.08594\\-134.5871\\-123\\40.03906\\-133.3633\\-123\\41.99219\\-132.6662\\-123\\43.94531\\-131.6048\\-123\\45.89844\\-130.8191\\-123\\47.85156\\-129.8461\\-123\\49.80469\\-129.0843\\-123\\51.75781\\-128.5994\\-123\\55.66406\\-127.5039\\-123\\61.52344\\-126.7887\\-123\\65.42969\\-126.4653\\-123\\71.28906\\-125.6813\\-123\\75.19531\\-125.3601\\-123\\79.10156\\-125.2142\\-123\\86.91406\\-125.1611\\-123\\92.77344\\-125.3092\\-123\\96.67969\\-125.5725\\-123\\98.63281\\-125.856\\-123\\100.5859\\-126.538\\-123\\104.4922\\-126.9512\\-123\\106.4453\\-127.414\\-123\\108.3984\\-128.1201\\-123\\110.3516\\-128.6025\\-123\\112.3047\\-129.3134\\-123\\114.2578\\-129.7861\\-123\\116.2109\\-130.6135\\-123\\118.1641\\-131.3246\\-123\\120.1172\\-132.4442\\-123\\122.0703\\-133.0395\\-123\\125.9766\\-135.1563\\-123\\129.8828\\-137.3625\\-123\\135.7422\\-140.8813\\-123\\141.6016\\-145.0397\\-123\\143.5547\\-146.5469\\-123\\147.086\\-149.4766\\-123\\149.1765\\-151.4297\\-123\\151.3672\\-153.668\\-123\\153.3203\\-155.8458\\-123\\155.9818\\-159.2422\\-123\\158.3582\\-163.1484\\-123\\159.7152\\-165.1016\\-123\\160.6315\\-167.0547\\-123\\161.7606\\-169.0078\\-123\\162.3614\\-170.9609\\-123\\163.2561\\-172.9141\\-123\\163.9358\\-174.8672\\-123\\164.4819\\-176.8203\\-123\\165.2748\\-178.7734\\-123\\165.7907\\-180.7266\\-123\\167.2296\\-188.5391\\-123\\167.4587\\-190.4922\\-123\\167.7376\\-194.3984\\-123\\167.8711\\-198.3047\\-123\\167.8994\\-204.1641\\-123\\167.7677\\-210.0234\\-123\\167.5494\\-213.9297\\-123\\167.073\\-217.8359\\-123\\166.6778\\-219.7891\\-123\\165.7263\\-225.6484\\-123\\165.2865\\-227.6016\\-123\\164.5726\\-229.5547\\-123\\163.7538\\-233.4609\\-123\\162.3428\\-237.3672\\-123\\161.8984\\-239.3203\\-123\\161.1328\\-241.2582\\-123\\160.2051\\-243.2266\\-123\\159.4066\\-245.1797\\-123\\158.2755\\-247.1328\\-123\\157.3752\\-249.0859\\-123\\156.2868\\-251.0391\\-123\\155.3449\\-252.9922\\-123\\154.1837\\-254.9453\\-123\\152.7894\\-256.8984\\-123\\151.3672\\-259.1148\\-123\\149.4141\\-262.0032\\-123\\145.8543\\-266.6641\\-123\\142.5307\\-270.5703\\-123\\140.7636\\-272.5234\\-123\\137.6953\\-275.6955\\-123\\133.7891\\-279.5953\\-123\\131.8359\\-281.3971\\-123\\128.466\\-284.2422\\-123\\125.9766\\-286.2032\\-123\\122.0703\\-288.9685\\-123\\118.1641\\-291.2996\\-123\\116.2109\\-292.7389\\-123\\114.2578\\-293.7121\\-123\\112.3047\\-294.8096\\-123\\110.3516\\-295.4659\\-123\\108.3984\\-296.5198\\-123\\106.4453\\-297.084\\-123\\104.4922\\-297.9948\\-123\\102.5391\\-298.7724\\-123\\100.5859\\-299.3789\\-123\\98.63281\\-300.2122\\-123\\96.67969\\-300.661\\-123\\92.77344\\-301.3588\\-123\\88.86719\\-302.2012\\-123\\86.91406\\-302.4775\\-123\\84.96094\\-302.6466\\-123\\81.05469\\-302.8185\\-123\\77.14844\\-302.9156\\-123\\73.24219\\-302.8823\\-123\\67.38281\\-302.684\\-123\\65.42969\\-302.5179\\-123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "179" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "55" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-303.7961\\-121\\-81.05469\\-303.3039\\-121\\-88.86719\\-302.5179\\-121\\-90.82031\\-302.1147\\-121\\-92.77344\\-301.4901\\-121\\-96.67969\\-300.6657\\-121\\-98.63281\\-300.0957\\-121\\-100.5859\\-299.1961\\-121\\-102.5391\\-298.5265\\-121\\-104.4922\\-297.4579\\-121\\-106.4453\\-296.7499\\-121\\-108.3984\\-295.6872\\-121\\-110.3516\\-294.8806\\-121\\-114.2578\\-292.6736\\-121\\-118.1641\\-289.7982\\-121\\-120.1172\\-288.758\\-121\\-122.0703\\-287.2223\\-121\\-125.9766\\-283.9093\\-121\\-127.9297\\-282.5138\\-121\\-129.8828\\-280.7791\\-121\\-136.1343\\-274.4766\\-121\\-137.6374\\-272.5234\\-121\\-140.944\\-268.6172\\-121\\-142.4854\\-266.6641\\-121\\-145.0229\\-262.7578\\-121\\-145.5078\\-262.1941\\-121\\-147.8957\\-258.8516\\-121\\-148.8551\\-256.8984\\-121\\-150.0672\\-254.9453\\-121\\-150.9221\\-252.9922\\-121\\-152.1801\\-251.0391\\-121\\-153.3203\\-249.0055\\-121\\-154.2512\\-247.1328\\-121\\-155.0993\\-245.1797\\-121\\-156.0584\\-243.2266\\-121\\-156.6495\\-241.2734\\-121\\-157.7323\\-239.3203\\-121\\-158.3802\\-237.3672\\-121\\-159.4388\\-235.4141\\-121\\-160.8184\\-231.5078\\-121\\-161.6972\\-229.5547\\-121\\-162.5216\\-225.6484\\-121\\-163.3212\\-223.6953\\-121\\-163.8682\\-221.7422\\-121\\-164.2589\\-219.7891\\-121\\-164.7727\\-217.8359\\-121\\-165.483\\-215.8828\\-121\\-166.2077\\-211.9766\\-121\\-167.1007\\-208.0703\\-121\\-167.4338\\-206.1172\\-121\\-167.6413\\-204.1641\\-121\\-167.8203\\-200.2578\\-121\\-167.8136\\-198.3047\\-121\\-167.6174\\-194.3984\\-121\\-167.3943\\-192.4453\\-121\\-166.4536\\-188.5391\\-121\\-165.5733\\-184.6328\\-121\\-164.7454\\-182.6797\\-121\\-163.4538\\-178.7734\\-121\\-162.4201\\-176.8203\\-121\\-161.7472\\-174.8672\\-121\\-159.1717\\-170.9609\\-121\\-157.2266\\-168.1651\\-121\\-155.2734\\-165.7098\\-121\\-152.9222\\-163.1484\\-121\\-149.4141\\-159.6146\\-121\\-146.9275\\-157.2891\\-121\\-144.6697\\-155.3359\\-121\\-143.5547\\-154.2297\\-121\\-141.6016\\-152.5535\\-121\\-140.1265\\-151.4297\\-121\\-137.6953\\-149.7544\\-121\\-135.7422\\-148.1718\\-121\\-133.7891\\-146.9422\\-121\\-131.8359\\-145.392\\-121\\-125.9766\\-141.2979\\-121\\-124.0234\\-140.1594\\-121\\-122.0703\\-138.7649\\-121\\-120.1367\\-137.7578\\-121\\-118.1641\\-136.3642\\-121\\-116.2109\\-135.193\\-121\\-114.2578\\-134.1382\\-121\\-109.6021\\-131.8984\\-121\\-108.3984\\-131.2349\\-121\\-106.4453\\-130.4953\\-121\\-104.4922\\-129.4402\\-121\\-102.5391\\-128.8511\\-121\\-100.5859\\-127.9521\\-121\\-98.63281\\-127.4468\\-121\\-94.72656\\-126.3097\\-121\\-92.77344\\-125.937\\-121\\-88.86719\\-124.9448\\-121\\-86.91406\\-124.6651\\-121\\-83.00781\\-124.2603\\-121\\-81.05469\\-123.6431\\-121\\-77.14844\\-123.3372\\-121\\-69.33594\\-123.0864\\-121\\-65.42969\\-123.2314\\-121\\-61.52344\\-123.5172\\-121\\-59.57031\\-124.1627\\-121\\-55.66406\\-124.4657\\-121\\-53.71094\\-124.8184\\-121\\-51.75781\\-125.4242\\-121\\-49.80469\\-126.212\\-121\\-47.85156\\-126.7433\\-121\\-43.94531\\-128.3315\\-121\\-41.99219\\-129.2863\\-121\\-37.1875\\-131.8984\\-121\\-34.17969\\-133.6612\\-121\\-32.22656\\-135.0162\\-121\\-28.9847\\-137.7578\\-121\\-26.91951\\-139.7109\\-121\\-24.41406\\-142.573\\-121\\-21.97944\\-145.5703\\-121\\-20.50781\\-147.7832\\-121\\-19.53125\\-149.4766\\-121\\-16.60156\\-155.1427\\-121\\-15.66984\\-157.2891\\-121\\-14.98047\\-159.2422\\-121\\-14.15094\\-161.1953\\-121\\-12.98545\\-167.0547\\-121\\-12.39102\\-169.0078\\-121\\-11.99944\\-170.9609\\-121\\-11.56811\\-174.8672\\-121\\-11.04526\\-180.7266\\-121\\-10.4061\\-184.6328\\-121\\-10.2892\\-186.5859\\-121\\-10.2983\\-188.5391\\-121\\-10.43822\\-190.4922\\-121\\-10.9489\\-194.3984\\-121\\-11.10026\\-196.3516\\-121\\-11.13669\\-198.3047\\-121\\-10.3752\\-202.2109\\-121\\-10.04963\\-206.1172\\-121\\-9.867447\\-213.9297\\-121\\-9.919085\\-217.8359\\-121\\-10.09971\\-221.7422\\-121\\-10.4061\\-223.6953\\-121\\-11.19536\\-227.6016\\-121\\-12.04227\\-235.4141\\-121\\-12.44213\\-237.3672\\-121\\-12.99526\\-239.3203\\-121\\-13.36513\\-241.2734\\-121\\-13.97996\\-245.1797\\-121\\-14.46144\\-247.1328\\-121\\-15.28653\\-249.0859\\-121\\-15.82132\\-251.0391\\-121\\-17.44792\\-254.9453\\-121\\-17.99916\\-256.8984\\-121\\-19.03654\\-258.8516\\-121\\-19.54309\\-260.8047\\-121\\-20.21767\\-262.7578\\-121\\-21.3143\\-264.7109\\-121\\-22.06421\\-266.6641\\-121\\-23.31674\\-268.6172\\-121\\-24.2513\\-270.5703\\-121\\-25.35088\\-272.5234\\-121\\-26.26397\\-274.4766\\-121\\-27.42661\\-276.4297\\-121\\-28.77055\\-278.3828\\-121\\-29.96947\\-280.3359\\-121\\-32.85767\\-284.2422\\-121\\-34.17969\\-286.1289\\-121\\-35.81437\\-288.1484\\-121\\-38.08594\\-290.5552\\-121\\-39.41761\\-292.0547\\-121\\-41.99219\\-294.4364\\-121\\-43.94531\\-295.6039\\-121\\-44.37641\\-295.9609\\-121\\-47.85156\\-298.3698\\-121\\-49.80469\\-299.3015\\-121\\-51.75781\\-300.442\\-121\\-53.71094\\-301.05\\-121\\-57.61719\\-302.4101\\-121\\-59.57031\\-302.7358\\-121\\-63.47656\\-303.2128\\-121\\-67.38281\\-303.811\\-121\\-69.33594\\-303.9851\\-121\\-73.24219\\-304.0553\\-121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "56" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-302.1646\\-121\\61.52344\\-301.6475\\-121\\55.66406\\-300.421\\-121\\51.75781\\-298.7898\\-121\\47.85156\\-296.8611\\-121\\45.89844\\-295.7397\\-121\\43.94531\\-294.7729\\-121\\40.25519\\-292.0547\\-121\\37.95155\\-290.1016\\-121\\36.13281\\-288.7055\\-121\\33.51727\\-286.1953\\-121\\30.11322\\-282.2891\\-121\\28.32031\\-280.0853\\-121\\25.72692\\-276.4297\\-121\\24.70042\\-274.4766\\-121\\24.41406\\-274.1454\\-121\\22.46094\\-270.9335\\-121\\22.15787\\-270.5703\\-121\\21.26034\\-268.6172\\-121\\20.0998\\-266.6641\\-121\\18.80976\\-262.7578\\-121\\17.82614\\-260.8047\\-121\\17.33398\\-258.8516\\-121\\16.45296\\-256.8984\\-121\\15.83708\\-254.9453\\-121\\15.38732\\-252.9922\\-121\\14.19724\\-249.0859\\-121\\13.8638\\-247.1328\\-121\\13.06831\\-241.2734\\-121\\12.20061\\-237.3672\\-121\\11.94719\\-235.4141\\-121\\11.32929\\-227.6016\\-121\\11.06994\\-225.6484\\-121\\10.4061\\-221.7422\\-121\\10.09285\\-217.8359\\-121\\9.988433\\-215.8828\\-121\\9.678171\\-211.9766\\-121\\9.459779\\-210.0234\\-121\\8.736879\\-206.1172\\-121\\8.529975\\-204.1641\\-121\\8.412035\\-200.2578\\-121\\8.541577\\-196.3516\\-121\\9.359195\\-192.4453\\-121\\9.638034\\-190.4922\\-121\\10.17253\\-182.6797\\-121\\10.36516\\-180.7266\\-121\\11.19338\\-176.8203\\-121\\11.49462\\-174.8672\\-121\\11.92197\\-170.9609\\-121\\12.29519\\-169.0078\\-121\\12.98545\\-167.0547\\-121\\13.78102\\-163.1484\\-121\\14.28796\\-161.1953\\-121\\15.29002\\-159.2422\\-121\\16.03771\\-157.2891\\-121\\17.33124\\-155.3359\\-121\\18.24951\\-153.3828\\-121\\20.50781\\-149.9464\\-121\\22.24314\\-147.5234\\-121\\24.41406\\-145.2529\\-121\\25.86806\\-143.6172\\-121\\28.32031\\-141.1688\\-121\\30.27344\\-139.6377\\-121\\32.22656\\-138.3424\\-121\\32.88535\\-137.7578\\-121\\36.13281\\-135.2784\\-121\\40.03906\\-133.0315\\-121\\41.99219\\-132.0796\\-121\\43.94531\\-130.9768\\-121\\47.85156\\-129.0251\\-121\\49.80469\\-128.3898\\-121\\51.75781\\-127.5822\\-121\\55.66406\\-126.7396\\-121\\57.61719\\-126.4063\\-121\\59.57031\\-125.9517\\-121\\61.52344\\-125.6177\\-121\\63.47656\\-125.1046\\-121\\69.33594\\-124.1765\\-121\\71.28906\\-123.5829\\-121\\73.24219\\-123.3369\\-121\\77.14844\\-122.9483\\-121\\83.00781\\-122.6428\\-121\\86.91406\\-122.6046\\-121\\92.77344\\-122.7591\\-121\\98.63281\\-123.1308\\-121\\100.5859\\-123.3899\\-121\\102.5391\\-123.7528\\-121\\104.4922\\-124.3533\\-121\\106.4453\\-124.6894\\-121\\110.3516\\-125.6064\\-121\\114.2578\\-127.099\\-121\\116.2109\\-127.6959\\-121\\118.1641\\-128.67\\-121\\120.1172\\-129.4422\\-121\\122.0703\\-130.6353\\-121\\124.0234\\-131.6514\\-121\\125.9766\\-132.9545\\-121\\127.9297\\-134.1291\\-121\\130.2472\\-135.8047\\-121\\131.8359\\-136.7813\\-121\\133.7891\\-138.2092\\-121\\135.7422\\-139.3668\\-121\\137.6953\\-140.8421\\-121\\139.6484\\-142.4438\\-121\\141.3574\\-143.6172\\-121\\143.5547\\-145.3197\\-121\\147.4609\\-148.6514\\-121\\152.1144\\-153.3828\\-121\\153.8652\\-155.3359\\-121\\155.282\\-157.2891\\-121\\156.4632\\-159.2422\\-121\\157.8186\\-161.1953\\-121\\158.8754\\-163.1484\\-121\\160.0861\\-165.1016\\-121\\161.1328\\-167.1198\\-121\\162.0069\\-169.0078\\-121\\162.5909\\-170.9609\\-121\\163.5362\\-172.9141\\-121\\164.6737\\-176.8203\\-121\\165.455\\-178.7734\\-121\\165.8998\\-180.7266\\-121\\166.5901\\-184.6328\\-121\\166.9998\\-186.5859\\-121\\167.511\\-190.4922\\-121\\167.653\\-192.4453\\-121\\167.8826\\-198.3047\\-121\\167.911\\-204.1641\\-121\\167.7746\\-210.0234\\-121\\167.5579\\-213.9297\\-121\\167.379\\-215.8828\\-121\\167.1007\\-217.8359\\-121\\166.6891\\-219.7891\\-121\\165.746\\-225.6484\\-121\\165.2982\\-227.6016\\-121\\164.5726\\-229.5547\\-121\\163.7538\\-233.4609\\-121\\162.3428\\-237.3672\\-121\\161.9104\\-239.3203\\-121\\161.1407\\-241.2734\\-121\\160.2108\\-243.2266\\-121\\159.4204\\-245.1797\\-121\\158.2548\\-247.1328\\-121\\157.362\\-249.0859\\-121\\156.2746\\-251.0391\\-121\\155.3295\\-252.9922\\-121\\154.1718\\-254.9453\\-121\\152.7706\\-256.8984\\-121\\151.3672\\-259.0676\\-121\\149.4141\\-261.9396\\-121\\145.7784\\-266.6641\\-121\\142.4644\\-270.5703\\-121\\140.6729\\-272.5234\\-121\\137.6953\\-275.63\\-121\\133.7891\\-279.5352\\-121\\131.8359\\-281.3518\\-121\\128.422\\-284.2422\\-121\\125.9481\\-286.1953\\-121\\122.0703\\-288.9612\\-121\\118.1641\\-291.2882\\-121\\116.2109\\-292.7235\\-121\\114.2578\\-293.6891\\-121\\112.3047\\-294.7903\\-121\\110.3516\\-295.4361\\-121\\108.3984\\-296.4987\\-121\\106.4453\\-297.0778\\-121\\104.4922\\-297.9662\\-121\\102.5391\\-298.7519\\-121\\100.5859\\-299.3554\\-121\\98.63281\\-300.1794\\-121\\96.67969\\-300.6518\\-121\\92.77344\\-301.3386\\-121\\88.86719\\-302.1985\\-121\\84.96094\\-302.6214\\-121\\81.05469\\-302.8023\\-121\\77.14844\\-302.8823\\-121\\73.24219\\-302.8609\\-121\\67.38281\\-302.6533\\-121\\65.42969\\-302.4775\\-121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "180" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "57" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-303.8542\\-119\\-81.05469\\-303.2162\\-119\\-86.91406\\-302.6762\\-119\\-88.86719\\-302.4401\\-119\\-90.82031\\-301.9931\\-119\\-92.77344\\-301.396\\-119\\-96.67969\\-300.5967\\-119\\-98.63281\\-299.9773\\-119\\-100.5859\\-299.1123\\-119\\-102.5391\\-298.4616\\-119\\-104.4922\\-297.3797\\-119\\-106.4453\\-296.7004\\-119\\-108.3984\\-295.5974\\-119\\-110.3516\\-294.8492\\-119\\-112.3047\\-293.6801\\-119\\-114.2578\\-292.6315\\-119\\-118.1641\\-289.7736\\-119\\-120.1172\\-288.7357\\-119\\-122.0703\\-287.1967\\-119\\-125.9766\\-283.8588\\-119\\-127.9297\\-282.4558\\-119\\-129.8828\\-280.7523\\-119\\-132.203\\-278.3828\\-119\\-134.2206\\-276.4297\\-119\\-136.0952\\-274.4766\\-119\\-139.2107\\-270.5703\\-119\\-140.918\\-268.6172\\-119\\-142.4662\\-266.6641\\-119\\-144.9992\\-262.7578\\-119\\-145.5078\\-262.1624\\-119\\-147.8718\\-258.8516\\-119\\-148.8281\\-256.8984\\-119\\-150.0588\\-254.9453\\-119\\-150.9018\\-252.9922\\-119\\-152.1627\\-251.0391\\-119\\-154.263\\-247.1328\\-119\\-155.0722\\-245.1797\\-119\\-156.046\\-243.2266\\-119\\-156.6368\\-241.2734\\-119\\-157.7408\\-239.3203\\-119\\-158.3739\\-237.3672\\-119\\-159.4502\\-235.4141\\-119\\-160.8508\\-231.5078\\-119\\-161.7099\\-229.5547\\-119\\-162.5527\\-225.6484\\-119\\-163.3838\\-223.6953\\-119\\-163.9075\\-221.7422\\-119\\-164.3066\\-219.7891\\-119\\-165.561\\-215.8828\\-119\\-166.2735\\-211.9766\\-119\\-167.2054\\-208.0703\\-119\\-167.5078\\-206.1172\\-119\\-167.7072\\-204.1641\\-119\\-167.8941\\-200.2578\\-119\\-167.8994\\-198.3047\\-119\\-167.7421\\-194.3984\\-119\\-167.5354\\-192.4453\\-119\\-167.2207\\-190.4922\\-119\\-166.6778\\-188.5391\\-119\\-165.7527\\-184.6328\\-119\\-165.0912\\-182.6797\\-119\\-164.2839\\-180.7266\\-119\\-163.6993\\-178.7734\\-119\\-162.6635\\-176.8203\\-119\\-161.9601\\-174.8672\\-119\\-159.6844\\-170.9609\\-119\\-159.1797\\-170.3594\\-119\\-157.2266\\-167.5595\\-119\\-155.366\\-165.1016\\-119\\-153.3203\\-162.6723\\-119\\-151.3672\\-160.5093\\-119\\-148.2115\\-157.2891\\-119\\-145.5078\\-154.6338\\-119\\-143.5547\\-152.833\\-119\\-141.6016\\-151.2588\\-119\\-139.6484\\-149.4863\\-119\\-135.7422\\-146.2182\\-119\\-129.8972\\-141.6641\\-119\\-124.597\\-137.7578\\-119\\-122.0703\\-136.0753\\-119\\-120.1172\\-134.6526\\-119\\-114.2578\\-130.8277\\-119\\-112.3047\\-129.7325\\-119\\-108.3984\\-127.7056\\-119\\-106.4453\\-126.8709\\-119\\-100.5859\\-124.6597\\-119\\-96.67969\\-123.5107\\-119\\-94.72656\\-122.8652\\-119\\-92.77344\\-122.3836\\-119\\-86.91406\\-121.2045\\-119\\-84.96094\\-120.9487\\-119\\-77.14844\\-120.1692\\-119\\-75.19531\\-120.0317\\-119\\-69.33594\\-119.9427\\-119\\-65.42969\\-120.0515\\-119\\-63.47656\\-120.2733\\-119\\-59.57031\\-120.5888\\-119\\-55.66406\\-121.181\\-119\\-53.71094\\-121.7357\\-119\\-49.80469\\-123.1523\\-119\\-45.89844\\-124.8881\\-119\\-43.94531\\-125.904\\-119\\-41.99219\\-127.0376\\-119\\-40.59938\\-127.9922\\-119\\-38.08594\\-129.5568\\-119\\-36.13281\\-130.8873\\-119\\-32.30424\\-133.8516\\-119\\-30.27344\\-135.4766\\-119\\-27.88382\\-137.7578\\-119\\-26.11699\\-139.7109\\-119\\-24.41406\\-141.7827\\-119\\-21.5908\\-145.5703\\-119\\-20.24489\\-147.5234\\-119\\-19.37548\\-149.4766\\-119\\-18.21356\\-151.4297\\-119\\-17.39054\\-153.3828\\-119\\-16.25504\\-155.3359\\-119\\-15.55342\\-157.2891\\-119\\-14.04333\\-161.1953\\-119\\-13.29774\\-165.1016\\-119\\-12.24308\\-169.0078\\-119\\-11.90848\\-170.9609\\-119\\-11.51816\\-174.8672\\-119\\-11.19626\\-178.7734\\-119\\-10.39567\\-184.6328\\-119\\-10.27135\\-186.5859\\-119\\-10.26257\\-188.5391\\-119\\-10.4061\\-190.4922\\-119\\-10.89523\\-194.3984\\-119\\-10.99664\\-196.3516\\-119\\-11.00028\\-198.3047\\-119\\-10.4947\\-200.2578\\-119\\-10.19597\\-202.2109\\-119\\-9.942746\\-206.1172\\-119\\-9.746571\\-213.9297\\-119\\-9.859076\\-219.7891\\-119\\-10.19597\\-223.6953\\-119\\-11.0104\\-227.6016\\-119\\-11.32581\\-229.5547\\-119\\-11.83143\\-233.4609\\-119\\-11.99525\\-235.4141\\-119\\-12.33082\\-237.3672\\-119\\-12.89208\\-239.3203\\-119\\-13.30645\\-241.2734\\-119\\-13.94187\\-245.1797\\-119\\-14.39925\\-247.1328\\-119\\-15.22524\\-249.0859\\-119\\-15.78363\\-251.0391\\-119\\-16.53498\\-252.9922\\-119\\-17.41028\\-254.9453\\-119\\-17.96301\\-256.8984\\-119\\-19.00692\\-258.8516\\-119\\-19.53125\\-260.8047\\-119\\-20.18229\\-262.7578\\-119\\-21.29017\\-264.7109\\-119\\-22.03556\\-266.6641\\-119\\-23.28808\\-268.6172\\-119\\-24.22437\\-270.5703\\-119\\-25.33953\\-272.5234\\-119\\-26.21875\\-274.4766\\-119\\-27.40294\\-276.4297\\-119\\-28.75362\\-278.3828\\-119\\-29.94792\\-280.3359\\-119\\-32.84862\\-284.2422\\-119\\-34.17969\\-286.1474\\-119\\-35.83623\\-288.1484\\-119\\-38.08594\\-290.5123\\-119\\-39.4545\\-292.0547\\-119\\-41.99219\\-294.3596\\-119\\-43.94531\\-295.5293\\-119\\-44.47719\\-295.9609\\-119\\-47.85156\\-298.281\\-119\\-49.80469\\-299.2142\\-119\\-51.75781\\-300.3682\\-119\\-55.66406\\-301.6206\\-119\\-57.61719\\-302.3381\\-119\\-59.57031\\-302.6953\\-119\\-63.47656\\-303.1477\\-119\\-69.33594\\-303.8955\\-119\\-73.24219\\-303.9478\\-119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "171" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "58" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-302.088\\-119\\61.52344\\-301.5423\\-119\\57.61719\\-300.8095\\-119\\55.66406\\-300.3764\\-119\\53.71094\\-299.4911\\-119\\51.75781\\-298.7579\\-119\\49.80469\\-297.6915\\-119\\47.85156\\-296.8188\\-119\\45.89844\\-295.683\\-119\\43.94531\\-294.748\\-119\\40.29895\\-292.0547\\-119\\37.98554\\-290.1016\\-119\\36.13281\\-288.6855\\-119\\33.53092\\-286.1953\\-119\\30.12734\\-282.2891\\-119\\28.32031\\-280.0704\\-119\\25.72692\\-276.4297\\-119\\24.70042\\-274.4766\\-119\\24.41406\\-274.1425\\-119\\22.46094\\-270.904\\-119\\22.18289\\-270.5703\\-119\\21.26736\\-268.6172\\-119\\20.0998\\-266.6641\\-119\\18.82234\\-262.7578\\-119\\17.83265\\-260.8047\\-119\\17.33011\\-258.8516\\-119\\16.47949\\-256.8984\\-119\\15.85681\\-254.9453\\-119\\15.42664\\-252.9922\\-119\\14.22902\\-249.0859\\-119\\13.88638\\-247.1328\\-119\\13.13741\\-241.2734\\-119\\12.28448\\-237.3672\\-119\\11.81959\\-233.4609\\-119\\11.40978\\-227.6016\\-119\\10.93606\\-223.6953\\-119\\10.5806\\-221.7422\\-119\\10.16488\\-217.8359\\-119\\10.04044\\-215.8828\\-119\\9.537407\\-210.0234\\-119\\8.694322\\-206.1172\\-119\\8.496094\\-204.1641\\-119\\8.382667\\-200.2578\\-119\\8.518528\\-196.3516\\-119\\8.766352\\-194.3984\\-119\\9.234619\\-192.4453\\-119\\9.538277\\-190.4922\\-119\\9.74215\\-188.5391\\-119\\10.08606\\-182.6797\\-119\\10.26257\\-180.7266\\-119\\10.62012\\-178.7734\\-119\\11.13154\\-176.8203\\-119\\11.49876\\-174.8672\\-119\\11.89076\\-170.9609\\-119\\12.27392\\-169.0078\\-119\\12.94663\\-167.0547\\-119\\13.76433\\-163.1484\\-119\\14.25653\\-161.1953\\-119\\15.23554\\-159.2422\\-119\\15.97858\\-157.2891\\-119\\17.26944\\-155.3359\\-119\\18.14993\\-153.3828\\-119\\20.50781\\-149.7925\\-119\\22.13093\\-147.5234\\-119\\24.41406\\-145.1214\\-119\\25.72761\\-143.6172\\-119\\28.32031\\-141.0338\\-119\\30.27344\\-139.3307\\-119\\32.22656\\-137.9124\\-119\\36.13281\\-134.8219\\-119\\38.08594\\-133.4299\\-119\\40.03906\\-132.383\\-119\\41.99219\\-131.0784\\-119\\44.00712\\-129.9453\\-119\\47.85156\\-127.9494\\-119\\49.80469\\-127.1561\\-119\\51.75781\\-126.5874\\-119\\53.71094\\-125.8777\\-119\\55.66406\\-125.3949\\-119\\57.61719\\-124.7787\\-119\\59.57031\\-124.2644\\-119\\63.47656\\-122.9633\\-119\\65.42969\\-122.4852\\-119\\67.38281\\-121.784\\-119\\73.24219\\-120.7331\\-119\\77.14844\\-120.0918\\-119\\79.10156\\-119.915\\-119\\83.00781\\-119.7296\\-119\\88.86719\\-119.6872\\-119\\94.72656\\-119.8048\\-119\\98.63281\\-120.1106\\-119\\100.5859\\-120.4936\\-119\\102.5391\\-120.7522\\-119\\106.4453\\-121.5105\\-119\\110.3516\\-122.6893\\-119\\112.3047\\-123.2168\\-119\\116.2109\\-124.865\\-119\\118.1641\\-125.7587\\-119\\122.0703\\-127.8029\\-119\\125.5247\\-129.9453\\-119\\127.9297\\-131.7097\\-119\\129.8828\\-133.002\\-119\\131.8359\\-134.537\\-119\\135.7422\\-137.3312\\-119\\141.6016\\-142.375\\-119\\143.236\\-143.6172\\-119\\147.4609\\-147.2815\\-119\\149.4141\\-149.2813\\-119\\153.3203\\-153.6009\\-119\\156.0126\\-157.2891\\-119\\158.2924\\-161.1953\\-119\\159.5871\\-163.1484\\-119\\160.4715\\-165.1016\\-119\\161.5798\\-167.0547\\-119\\162.9232\\-170.9609\\-119\\163.765\\-172.9141\\-119\\164.2288\\-174.8672\\-119\\165.5995\\-178.7734\\-119\\166.3136\\-182.6797\\-119\\167.1007\\-186.5859\\-119\\167.3584\\-188.5391\\-119\\167.6839\\-192.4453\\-119\\167.8941\\-198.3047\\-119\\167.9171\\-204.1641\\-119\\167.786\\-210.0234\\-119\\167.5494\\-213.9297\\-119\\167.1276\\-217.8359\\-119\\166.716\\-219.7891\\-119\\165.7626\\-225.6484\\-119\\165.3209\\-227.6016\\-119\\164.585\\-229.5547\\-119\\163.7389\\-233.4609\\-119\\162.3428\\-237.3672\\-119\\161.9104\\-239.3203\\-119\\161.1406\\-241.2734\\-119\\160.2159\\-243.2266\\-119\\159.3959\\-245.1797\\-119\\158.2499\\-247.1328\\-119\\157.3213\\-249.0859\\-119\\155.2977\\-252.9922\\-119\\154.1582\\-254.9453\\-119\\152.7485\\-256.8984\\-119\\149.4141\\-261.8849\\-119\\145.7072\\-266.6641\\-119\\143.9968\\-268.6172\\-119\\142.3895\\-270.5703\\-119\\137.6953\\-275.5451\\-119\\134.8985\\-278.3828\\-119\\131.8359\\-281.306\\-119\\128.3736\\-284.2422\\-119\\125.8422\\-286.1953\\-119\\122.0703\\-288.9284\\-119\\118.1641\\-291.2701\\-119\\116.2109\\-292.6998\\-119\\114.2578\\-293.6667\\-119\\112.3047\\-294.7734\\-119\\110.3516\\-295.4133\\-119\\108.3984\\-296.4619\\-119\\106.4453\\-297.0562\\-119\\102.5391\\-298.7313\\-119\\100.5859\\-299.3234\\-119\\98.63281\\-300.1548\\-119\\96.67969\\-300.6337\\-119\\92.77344\\-301.3156\\-119\\88.86719\\-302.1761\\-119\\84.96094\\-302.6028\\-119\\83.00781\\-302.7127\\-119\\79.10156\\-302.8344\\-119\\73.24219\\-302.8396\\-119\\67.38281\\-302.6235\\-119\\65.42969\\-302.4275\\-119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "182" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "59" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-303.7048\\-117\\-83.00781\\-302.9542\\-117\\-86.91406\\-302.6283\\-117\\-88.86719\\-302.3346\\-117\\-92.77344\\-301.293\\-117\\-96.67969\\-300.5163\\-117\\-100.5859\\-299.0191\\-117\\-102.5391\\-298.3579\\-117\\-104.4922\\-297.2926\\-117\\-106.4453\\-296.6411\\-117\\-108.3984\\-295.5139\\-117\\-110.3516\\-294.8001\\-117\\-112.3047\\-293.6211\\-117\\-114.2578\\-292.5774\\-117\\-118.1641\\-289.7238\\-117\\-120.1172\\-288.6998\\-117\\-122.0703\\-287.1719\\-117\\-125.9766\\-283.8105\\-117\\-127.9297\\-282.3793\\-117\\-129.8828\\-280.6719\\-117\\-132.1325\\-278.3828\\-117\\-134.1688\\-276.4297\\-117\\-136.0421\\-274.4766\\-117\\-139.1404\\-270.5703\\-117\\-140.8627\\-268.6172\\-117\\-142.4216\\-266.6641\\-117\\-144.9526\\-262.7578\\-117\\-146.4557\\-260.8047\\-117\\-147.7979\\-258.8516\\-117\\-148.7962\\-256.8984\\-117\\-150.0292\\-254.9453\\-117\\-150.8692\\-252.9922\\-117\\-152.1429\\-251.0391\\-117\\-154.2291\\-247.1328\\-117\\-155.0458\\-245.1797\\-117\\-156.0337\\-243.2266\\-117\\-156.6193\\-241.2734\\-117\\-157.7236\\-239.3203\\-117\\-158.3695\\-237.3672\\-117\\-159.4272\\-235.4141\\-117\\-160.8528\\-231.5078\\-117\\-161.7275\\-229.5547\\-117\\-162.5944\\-225.6484\\-117\\-163.4404\\-223.6953\\-117\\-164.375\\-219.7891\\-117\\-165.6304\\-215.8828\\-117\\-166.362\\-211.9766\\-117\\-167.3133\\-208.0703\\-117\\-167.7653\\-204.1641\\-117\\-167.9629\\-200.2578\\-117\\-167.9746\\-198.3047\\-117\\-167.8467\\-194.3984\\-117\\-167.4395\\-190.4922\\-117\\-166.3935\\-186.5859\\-117\\-165.4309\\-182.6797\\-117\\-164.5603\\-180.7266\\-117\\-163.9334\\-178.7734\\-117\\-163.1098\\-176.8203\\-117\\-161.3404\\-172.9141\\-117\\-160.1199\\-170.9609\\-117\\-158.796\\-169.0078\\-117\\-157.586\\-167.0547\\-117\\-156.136\\-165.1016\\-117\\-153.3203\\-161.5082\\-117\\-147.7318\\-155.3359\\-117\\-145.7607\\-153.3828\\-117\\-143.5547\\-150.8368\\-117\\-139.6484\\-146.9809\\-117\\-137.6953\\-145.2448\\-117\\-135.7422\\-143.7895\\-117\\-133.7891\\-141.9582\\-117\\-131.8359\\-140.3199\\-117\\-128.6501\\-137.7578\\-117\\-127.9297\\-137.3\\-117\\-125.9766\\-135.7429\\-117\\-122.0703\\-132.9669\\-117\\-118.1441\\-129.9453\\-117\\-116.2109\\-128.6297\\-117\\-114.2578\\-127.5108\\-117\\-112.3047\\-126.5921\\-117\\-110.3516\\-125.4731\\-117\\-107.6451\\-124.0859\\-117\\-104.4922\\-122.7518\\-117\\-100.5859\\-121.3763\\-117\\-96.67969\\-120.1933\\-117\\-94.72656\\-119.5251\\-117\\-92.77344\\-119.2854\\-117\\-90.82031\\-118.9292\\-117\\-88.86719\\-118.3301\\-117\\-86.91406\\-117.985\\-117\\-79.10156\\-117.355\\-117\\-77.14844\\-116.838\\-117\\-75.19531\\-116.6541\\-117\\-73.24219\\-116.661\\-117\\-71.28906\\-116.7692\\-117\\-67.38281\\-116.754\\-117\\-61.52344\\-117.033\\-117\\-57.61719\\-117.6817\\-117\\-55.66406\\-117.8422\\-117\\-54.32581\\-118.2266\\-117\\-51.75781\\-119.3199\\-117\\-49.80469\\-119.8667\\-117\\-47.85156\\-120.8187\\-117\\-43.94531\\-122.5448\\-117\\-41.44287\\-124.0859\\-117\\-38.08594\\-126.6173\\-117\\-36.13281\\-128.2863\\-117\\-34.17969\\-130.1021\\-117\\-32.44745\\-131.8984\\-117\\-30.27344\\-134.0143\\-117\\-26.77617\\-137.7578\\-117\\-25.24567\\-139.7109\\-117\\-23.60704\\-141.6641\\-117\\-22.18511\\-143.6172\\-117\\-21.06882\\-145.5703\\-117\\-19.79342\\-147.5234\\-117\\-19.04634\\-149.4766\\-117\\-17.87051\\-151.4297\\-117\\-17.10862\\-153.3828\\-117\\-15.98161\\-155.3359\\-117\\-15.34598\\-157.2891\\-117\\-14.42906\\-159.2422\\-117\\-13.87778\\-161.1953\\-117\\-13.10107\\-165.1016\\-117\\-12.50895\\-167.0547\\-117\\-12.07886\\-169.0078\\-117\\-11.81481\\-170.9609\\-117\\-11.1051\\-178.7734\\-117\\-10.5678\\-182.6797\\-117\\-10.35525\\-184.6328\\-117\\-10.2285\\-188.5391\\-117\\-10.33579\\-190.4922\\-117\\-10.93606\\-196.3516\\-117\\-10.81139\\-198.3047\\-117\\-10.28022\\-200.2578\\-117\\-10.05609\\-202.2109\\-117\\-9.808708\\-206.1172\\-117\\-9.573348\\-213.9297\\-117\\-9.569279\\-215.8828\\-117\\-9.683439\\-219.7891\\-117\\-10.0234\\-223.6953\\-117\\-10.2983\\-225.6484\\-117\\-11.18952\\-229.5547\\-117\\-11.80508\\-233.4609\\-117\\-11.92197\\-235.4141\\-117\\-12.19733\\-237.3672\\-117\\-13.22857\\-241.2734\\-117\\-13.89146\\-245.1797\\-117\\-14.30567\\-247.1328\\-117\\-15.15458\\-249.0859\\-117\\-15.7373\\-251.0391\\-117\\-16.43997\\-252.9922\\-117\\-17.37144\\-254.9453\\-117\\-17.90926\\-256.8984\\-117\\-18.9627\\-258.8516\\-117\\-19.50758\\-260.8047\\-117\\-20.15708\\-262.7578\\-117\\-21.25\\-264.7109\\-117\\-21.99897\\-266.6641\\-117\\-23.27564\\-268.6172\\-117\\-24.22437\\-270.5703\\-117\\-25.33953\\-272.5234\\-117\\-26.20443\\-274.4766\\-117\\-27.3911\\-276.4297\\-117\\-28.73047\\-278.3828\\-117\\-29.91662\\-280.3359\\-117\\-32.84862\\-284.2422\\-117\\-34.17969\\-286.1474\\-117\\-35.82405\\-288.1484\\-117\\-38.08594\\-290.4813\\-117\\-39.51214\\-292.0547\\-117\\-41.99219\\-294.3044\\-117\\-43.94531\\-295.4692\\-117\\-44.55891\\-295.9609\\-117\\-47.85156\\-298.1732\\-117\\-49.80469\\-299.132\\-117\\-51.75781\\-300.2773\\-117\\-55.66406\\-301.516\\-117\\-57.61719\\-302.2581\\-117\\-59.57031\\-302.6466\\-117\\-69.33594\\-303.7344\\-117\\-71.28906\\-303.8256\\-117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "178" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "60" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-302.0067\\-117\\61.52344\\-301.4809\\-117\\57.61719\\-300.7699\\-117\\55.66406\\-300.3372\\-117\\53.71094\\-299.4451\\-117\\51.75781\\-298.7092\\-117\\49.80469\\-297.6162\\-117\\47.85156\\-296.7802\\-117\\45.89844\\-295.6305\\-117\\43.94531\\-294.6945\\-117\\40.38509\\-292.0547\\-117\\38.03944\\-290.1016\\-117\\36.13281\\-288.6613\\-117\\33.54011\\-286.1953\\-117\\30.14168\\-282.2891\\-117\\28.32031\\-280.0656\\-117\\25.73568\\-276.4297\\-117\\24.72744\\-274.4766\\-117\\24.41406\\-274.1146\\-117\\22.46094\\-270.874\\-117\\22.20648\\-270.5703\\-117\\21.28566\\-268.6172\\-117\\20.11317\\-266.6641\\-117\\18.83473\\-262.7578\\-117\\17.84589\\-260.8047\\-117\\17.35711\\-258.8516\\-117\\16.54938\\-256.8984\\-117\\15.88907\\-254.9453\\-117\\15.46474\\-252.9922\\-117\\14.27185\\-249.0859\\-117\\13.92315\\-247.1328\\-117\\13.18359\\-241.2734\\-117\\12.36747\\-237.3672\\-117\\12.06236\\-235.4141\\-117\\11.8606\\-233.4609\\-117\\11.46376\\-227.6016\\-117\\11.0338\\-223.6953\\-117\\10.44922\\-219.7891\\-117\\9.727515\\-211.9766\\-117\\9.495856\\-210.0234\\-117\\8.653626\\-206.1172\\-117\\8.363688\\-202.2109\\-117\\8.363688\\-198.3047\\-117\\8.565267\\-194.3984\\-117\\9.441902\\-190.4922\\-117\\9.654432\\-188.5391\\-117\\10.14245\\-180.7266\\-117\\10.47165\\-178.7734\\-117\\11.05442\\-176.8203\\-117\\11.43185\\-174.8672\\-117\\11.84353\\-170.9609\\-117\\12.1844\\-169.0078\\-117\\12.82401\\-167.0547\\-117\\13.34429\\-165.1016\\-117\\14.17894\\-161.1953\\-117\\15.13365\\-159.2422\\-117\\15.89477\\-157.2891\\-117\\17.16383\\-155.3359\\-117\\18.02147\\-153.3828\\-117\\19.34735\\-151.4297\\-117\\20.50781\\-149.4872\\-117\\21.96296\\-147.5234\\-117\\26.36719\\-142.7119\\-117\\30.27344\\-138.9888\\-117\\34.17969\\-135.4219\\-117\\36.13281\\-134.0372\\-117\\38.92744\\-131.8984\\-117\\41.99219\\-129.8255\\-117\\45.18943\\-127.9922\\-117\\45.89844\\-127.4993\\-117\\47.85156\\-126.5959\\-117\\49.80469\\-125.4417\\-117\\51.75781\\-124.7151\\-117\\53.71094\\-123.7847\\-117\\55.66406\\-123.017\\-117\\61.52344\\-120.885\\-117\\63.47656\\-120.421\\-117\\65.42969\\-119.6137\\-117\\69.33594\\-118.9895\\-117\\71.28906\\-118.1698\\-117\\73.24219\\-117.8668\\-117\\77.14844\\-117.5476\\-117\\81.05469\\-116.9652\\-117\\84.96094\\-116.7823\\-117\\88.86719\\-116.7688\\-117\\94.72656\\-116.9802\\-117\\98.63281\\-117.5356\\-117\\102.5391\\-117.8541\\-117\\104.4922\\-118.1704\\-117\\106.4453\\-119.0058\\-117\\108.3984\\-119.3038\\-117\\110.3516\\-119.7595\\-117\\112.3047\\-120.595\\-117\\114.2578\\-121.1143\\-117\\116.2109\\-122.0569\\-117\\118.1641\\-123.1488\\-117\\120.1172\\-123.8906\\-117\\122.0703\\-125.2871\\-117\\123.3895\\-126.0391\\-117\\127.9297\\-129.0429\\-117\\129.8828\\-130.5724\\-117\\131.8359\\-132.2621\\-117\\133.7891\\-133.3273\\-117\\135.7422\\-135.0057\\-117\\138.6426\\-137.7578\\-117\\141.6016\\-140.4685\\-117\\145.5078\\-144.3125\\-117\\147.1804\\-145.5703\\-117\\149.4141\\-147.849\\-117\\151.3672\\-149.998\\-117\\152.4595\\-151.4297\\-117\\154.1461\\-153.3828\\-117\\155.5733\\-155.3359\\-117\\156.5686\\-157.2891\\-117\\157.8839\\-159.2422\\-117\\160.0691\\-163.1484\\-117\\161.9204\\-167.0547\\-117\\162.4455\\-169.0078\\-117\\163.3599\\-170.9609\\-117\\163.9664\\-172.9141\\-117\\164.425\\-174.8672\\-117\\165.2385\\-176.8203\\-117\\165.7374\\-178.7734\\-117\\166.4167\\-182.6797\\-117\\167.1805\\-186.5859\\-117\\167.4338\\-188.5391\\-117\\167.7145\\-192.4453\\-117\\167.8994\\-198.3047\\-117\\167.9225\\-204.1641\\-117\\167.7907\\-210.0234\\-117\\167.5698\\-213.9297\\-117\\167.1276\\-217.8359\\-117\\166.3925\\-221.7422\\-117\\165.7728\\-225.6484\\-117\\165.332\\-227.6016\\-117\\164.585\\-229.5547\\-117\\163.7464\\-233.4609\\-117\\162.3428\\-237.3672\\-117\\161.9177\\-239.3203\\-117\\161.1407\\-241.2734\\-117\\160.2159\\-243.2266\\-117\\159.3959\\-245.1797\\-117\\158.2553\\-247.1328\\-117\\157.3073\\-249.0859\\-117\\155.2734\\-252.9565\\-117\\154.1199\\-254.9453\\-117\\152.7092\\-256.8984\\-117\\149.4141\\-261.8249\\-117\\145.6163\\-266.6641\\-117\\143.8779\\-268.6172\\-117\\142.2905\\-270.5703\\-117\\140.5119\\-272.5234\\-117\\134.8382\\-278.3828\\-117\\131.8359\\-281.2399\\-117\\128.2826\\-284.2422\\-117\\125.7586\\-286.1953\\-117\\122.0703\\-288.9001\\-117\\120.1172\\-290.0142\\-117\\118.1641\\-291.2455\\-117\\116.2109\\-292.668\\-117\\114.2578\\-293.6317\\-117\\112.3047\\-294.7463\\-117\\110.3516\\-295.3776\\-117\\108.3984\\-296.4201\\-117\\106.4453\\-297.0287\\-117\\102.5391\\-298.6984\\-117\\100.5859\\-299.287\\-117\\98.63281\\-300.1079\\-117\\96.67969\\-300.6153\\-117\\92.77344\\-301.2799\\-117\\88.86719\\-302.1505\\-117\\86.91406\\-302.4101\\-117\\84.96094\\-302.5692\\-117\\81.05469\\-302.7638\\-117\\77.14844\\-302.8344\\-117\\73.24219\\-302.8185\\-117\\69.33594\\-302.7065\\-117\\65.42969\\-302.3793\\-117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "182" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "61" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-302.234\\-115\\-92.77344\\-301.2092\\-115\\-96.67969\\-300.4157\\-115\\-98.63281\\-299.6145\\-115\\-102.5391\\-298.2502\\-115\\-104.4922\\-297.2002\\-115\\-106.4453\\-296.5614\\-115\\-108.3984\\-295.4361\\-115\\-110.3516\\-294.748\\-115\\-112.3047\\-293.5419\\-115\\-114.2578\\-292.5104\\-115\\-117.6427\\-290.1016\\-115\\-118.1641\\-289.6621\\-115\\-120.1172\\-288.667\\-115\\-122.0703\\-287.1346\\-115\\-125.9766\\-283.7505\\-115\\-127.9297\\-282.2975\\-115\\-129.8828\\-280.5861\\-115\\-132.0538\\-278.3828\\-115\\-134.112\\-276.4297\\-115\\-135.9844\\-274.4766\\-115\\-137.4283\\-272.5234\\-115\\-140.8065\\-268.6172\\-115\\-142.3815\\-266.6641\\-115\\-144.9023\\-262.7578\\-115\\-146.4212\\-260.8047\\-115\\-147.731\\-258.8516\\-115\\-148.7608\\-256.8984\\-115\\-150.0077\\-254.9453\\-115\\-150.8246\\-252.9922\\-115\\-152.118\\-251.0391\\-115\\-154.1953\\-247.1328\\-115\\-155.0184\\-245.1797\\-115\\-156.0136\\-243.2266\\-115\\-156.6068\\-241.2734\\-115\\-157.697\\-239.3203\\-115\\-158.3739\\-237.3672\\-115\\-159.4272\\-235.4141\\-115\\-160.8646\\-231.5078\\-115\\-161.7314\\-229.5547\\-115\\-162.6275\\-225.6484\\-115\\-163.4961\\-223.6953\\-115\\-164.4244\\-219.7891\\-115\\-165.1476\\-217.8359\\-115\\-165.7059\\-215.8828\\-115\\-166.4709\\-211.9766\\-115\\-167.4017\\-208.0703\\-115\\-167.653\\-206.1172\\-115\\-167.9629\\-202.2109\\-115\\-168.0462\\-198.3047\\-115\\-167.9513\\-194.3984\\-115\\-167.6213\\-190.4922\\-115\\-167.2683\\-188.5391\\-115\\-166.6534\\-186.5859\\-115\\-165.721\\-182.6797\\-115\\-165.0467\\-180.7266\\-115\\-164.2158\\-178.7734\\-115\\-163.5963\\-176.8203\\-115\\-162.5502\\-174.8672\\-115\\-161.8472\\-172.9141\\-115\\-160.6761\\-170.9609\\-115\\-159.6746\\-169.0078\\-115\\-158.2344\\-167.0547\\-115\\-155.7166\\-163.1484\\-115\\-153.3203\\-159.8966\\-115\\-147.8202\\-153.3828\\-115\\-146.3137\\-151.4297\\-115\\-143.5547\\-148.1783\\-115\\-141.0656\\-145.5703\\-115\\-138.9348\\-143.6172\\-115\\-137.6953\\-142.3281\\-115\\-135.7422\\-140.5002\\-115\\-131.8359\\-137.1028\\-115\\-130.0007\\-135.8047\\-115\\-127.5984\\-133.8516\\-115\\-124.0234\\-131.1766\\-115\\-120.1172\\-127.8387\\-115\\-116.2109\\-125.3132\\-115\\-114.2578\\-124.4313\\-115\\-112.3047\\-123.1094\\-115\\-108.3984\\-121.2841\\-115\\-105.8919\\-120.1797\\-115\\-102.5391\\-118.9678\\-115\\-100.5859\\-118.4501\\-115\\-98.63281\\-117.5647\\-115\\-96.67969\\-117.145\\-115\\-94.72656\\-116.8573\\-115\\-92.77344\\-116.076\\-115\\-90.82031\\-115.7379\\-115\\-84.96094\\-114.991\\-115\\-83.00781\\-114.6012\\-115\\-80.56641\\-114.3203\\-115\\-77.14844\\-114.1339\\-115\\-71.28906\\-113.9376\\-115\\-67.38281\\-113.696\\-115\\-63.47656\\-114.0712\\-115\\-61.52344\\-114.1143\\-115\\-59.57031\\-114.2734\\-115\\-57.61719\\-114.6766\\-115\\-55.66406\\-115.2352\\-115\\-53.71094\\-115.6403\\-115\\-49.80469\\-117.0526\\-115\\-47.85156\\-117.5719\\-115\\-45.89844\\-118.4862\\-115\\-43.94531\\-119.1177\\-115\\-41.99219\\-120.1378\\-115\\-40.03906\\-121.3385\\-115\\-38.08594\\-122.7304\\-115\\-34.47896\\-126.0391\\-115\\-32.22656\\-128.5205\\-115\\-30.27344\\-130.8501\\-115\\-28.12704\\-133.8516\\-115\\-26.36719\\-136.2116\\-115\\-22.46094\\-141.8305\\-115\\-20.14923\\-145.5703\\-115\\-19.29209\\-147.5234\\-115\\-18.23815\\-149.4766\\-115\\-17.44948\\-151.4297\\-115\\-16.42336\\-153.3828\\-115\\-14.88196\\-157.2891\\-115\\-14.05374\\-159.2422\\-115\\-13.2393\\-163.1484\\-115\\-12.17491\\-167.0547\\-115\\-11.90396\\-169.0078\\-115\\-11.12888\\-176.8203\\-115\\-10.4831\\-182.6797\\-115\\-10.31681\\-184.6328\\-115\\-10.26257\\-186.5859\\-115\\-10.26257\\-190.4922\\-115\\-10.35525\\-192.4453\\-115\\-10.66142\\-196.3516\\-115\\-10.44922\\-198.3047\\-115\\-10.13513\\-200.2578\\-115\\-9.765625\\-204.1641\\-115\\-9.544614\\-210.0234\\-115\\-9.357766\\-213.9297\\-115\\-9.324407\\-215.8828\\-115\\-9.44553\\-219.7891\\-115\\-10.0591\\-225.6484\\-115\\-10.3752\\-227.6016\\-115\\-11.3445\\-231.5078\\-115\\-11.61791\\-233.4609\\-115\\-12.04227\\-237.3672\\-115\\-12.4566\\-239.3203\\-115\\-13.09543\\-241.2734\\-115\\-14.19724\\-247.1328\\-115\\-15.04536\\-249.0859\\-115\\-16.31974\\-252.9922\\-115\\-17.32086\\-254.9453\\-115\\-17.85399\\-256.8984\\-115\\-18.89167\\-258.8516\\-115\\-20.11855\\-262.7578\\-115\\-21.20937\\-264.7109\\-115\\-21.98132\\-266.6641\\-115\\-23.26931\\-268.6172\\-115\\-24.1855\\-270.5703\\-115\\-25.33953\\-272.5234\\-115\\-26.17645\\-274.4766\\-115\\-27.37926\\-276.4297\\-115\\-28.69642\\-278.3828\\-115\\-29.89641\\-280.3359\\-115\\-32.83524\\-284.2422\\-115\\-34.17969\\-286.1479\\-115\\-35.82176\\-288.1484\\-115\\-38.08594\\-290.4688\\-115\\-39.5436\\-292.0547\\-115\\-41.99219\\-294.2372\\-115\\-43.94531\\-295.4214\\-115\\-45.89844\\-296.823\\-115\\-47.85156\\-298.0757\\-115\\-49.80469\\-299.0672\\-115\\-51.75781\\-300.1859\\-115\\-53.71094\\-300.8671\\-115\\-55.66406\\-301.4066\\-115\\-57.61719\\-302.1646\\-115\\-59.57031\\-302.5838\\-115\\-67.38281\\-303.4081\\-115\\-69.33594\\-303.5796\\-115\\-73.24219\\-303.6608\\-115\\-75.19531\\-303.5541\\-115\\-84.96094\\-302.7527\\-115\\-86.91406\\-302.5646\\-115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "180" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "62" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-301.95\\-115\\61.52344\\-301.4447\\-115\\57.61719\\-300.7534\\-115\\55.66406\\-300.2964\\-115\\53.71094\\-299.3913\\-115\\51.75781\\-298.6724\\-115\\49.80469\\-297.5706\\-115\\47.85156\\-296.7345\\-115\\45.89844\\-295.5775\\-115\\43.94531\\-294.6567\\-115\\40.44028\\-292.0547\\-115\\38.07655\\-290.1016\\-115\\36.13281\\-288.6577\\-115\\33.54011\\-286.1953\\-115\\30.12734\\-282.2891\\-115\\28.32031\\-280.0808\\-115\\25.73568\\-276.4297\\-115\\24.72744\\-274.4766\\-115\\24.41406\\-274.1146\\-115\\22.46094\\-270.8458\\-115\\21.29021\\-268.6172\\-115\\20.11317\\-266.6641\\-115\\18.84694\\-262.7578\\-115\\17.85942\\-260.8047\\-115\\17.38383\\-258.8516\\-115\\15.91546\\-254.9453\\-115\\15.52586\\-252.9922\\-115\\15.02455\\-251.0391\\-115\\14.30339\\-249.0859\\-115\\13.95742\\-247.1328\\-115\\13.22857\\-241.2734\\-115\\12.44213\\-237.3672\\-115\\12.10814\\-235.4141\\-115\\11.89076\\-233.4609\\-115\\11.64165\\-229.5547\\-115\\11.3246\\-225.6484\\-115\\11.0919\\-223.6953\\-115\\10.4947\\-219.7891\\-115\\9.939341\\-213.9297\\-115\\9.45638\\-210.0234\\-115\\8.589623\\-206.1172\\-115\\8.31822\\-202.2109\\-115\\8.280793\\-198.3047\\-115\\8.452972\\-194.3984\\-115\\9.354441\\-190.4922\\-115\\9.57532\\-188.5391\\-115\\10.02081\\-180.7266\\-115\\10.33579\\-178.7734\\-115\\10.88066\\-176.8203\\-115\\11.31283\\-174.8672\\-115\\11.766\\-170.9609\\-115\\12.05842\\-169.0078\\-115\\13.22266\\-165.1016\\-115\\14.0722\\-161.1953\\-115\\15.75934\\-157.2891\\-115\\16.93157\\-155.3359\\-115\\17.84498\\-153.3828\\-115\\19.18154\\-151.4297\\-115\\20.17032\\-149.4766\\-115\\21.67844\\-147.5234\\-115\\25.30354\\-143.6172\\-115\\26.36719\\-142.2256\\-115\\30.81869\\-137.7578\\-115\\34.17969\\-134.2885\\-115\\36.13281\\-132.5465\\-115\\38.08594\\-130.9128\\-115\\39.42558\\-129.9453\\-115\\41.99219\\-127.7969\\-115\\43.94531\\-126.7227\\-115\\45.89844\\-125.1146\\-115\\47.85156\\-123.7083\\-115\\49.80469\\-122.8355\\-115\\51.75781\\-121.651\\-115\\53.71094\\-120.8352\\-115\\55.66406\\-120.1339\\-115\\57.61719\\-119.1524\\-115\\59.57031\\-118.605\\-115\\61.52344\\-117.6971\\-115\\63.47656\\-117.204\\-115\\65.42969\\-116.8616\\-115\\67.38281\\-116.0325\\-115\\69.33594\\-115.5875\\-115\\71.28906\\-115.3085\\-115\\75.19531\\-114.5609\\-115\\77.28795\\-114.3203\\-115\\81.05469\\-114.0151\\-115\\84.96094\\-113.9124\\-115\\88.86719\\-113.8931\\-115\\94.72656\\-114.0824\\-115\\98.63281\\-114.4194\\-115\\100.5859\\-114.6548\\-115\\102.5391\\-115.1341\\-115\\104.4922\\-115.4066\\-115\\108.1355\\-116.2734\\-115\\110.3516\\-117.1292\\-115\\112.3047\\-117.6136\\-115\\114.2578\\-118.5484\\-115\\116.2109\\-119.3078\\-115\\118.1641\\-120.1695\\-115\\122.0703\\-122.3308\\-115\\124.5209\\-124.0859\\-115\\125.9766\\-124.9626\\-115\\127.9297\\-126.3297\\-115\\129.8828\\-128.0038\\-115\\131.8359\\-129.2655\\-115\\134.8728\\-131.8984\\-115\\137.6953\\-134.4847\\-115\\139.6484\\-136.427\\-115\\142.8199\\-139.7109\\-115\\145.5078\\-142.3703\\-115\\149.4141\\-146.396\\-115\\151.3672\\-148.5248\\-115\\153.6856\\-151.4297\\-115\\155.2734\\-153.7331\\-115\\157.4618\\-157.2891\\-115\\158.4457\\-159.2422\\-115\\159.7457\\-161.1953\\-115\\160.552\\-163.1484\\-115\\161.5936\\-165.1016\\-115\\162.8143\\-169.0078\\-115\\163.6754\\-170.9609\\-115\\164.687\\-174.8672\\-115\\165.4671\\-176.8203\\-115\\165.8783\\-178.7734\\-115\\166.541\\-182.6797\\-115\\167.2778\\-186.5859\\-115\\167.4897\\-188.5391\\-115\\167.7492\\-192.4453\\-115\\167.911\\-198.3047\\-115\\167.9397\\-202.2109\\-115\\167.8826\\-208.0703\\-115\\167.7029\\-211.9766\\-115\\167.4017\\-215.8828\\-115\\167.1419\\-217.8359\\-115\\166.4005\\-221.7422\\-115\\165.779\\-225.6484\\-115\\165.3539\\-227.6016\\-115\\164.5946\\-229.5547\\-115\\163.7389\\-233.4609\\-115\\162.3504\\-237.3672\\-115\\161.9177\\-239.3203\\-115\\161.1407\\-241.2734\\-115\\159.4082\\-245.1797\\-115\\158.2553\\-247.1328\\-115\\157.2932\\-249.0859\\-115\\155.2734\\-252.8863\\-115\\154.0833\\-254.9453\\-115\\152.6755\\-256.8984\\-115\\150.0958\\-260.8047\\-115\\147.4609\\-264.3114\\-115\\145.5454\\-266.6641\\-115\\143.8184\\-268.6172\\-115\\142.2094\\-270.5703\\-115\\140.4381\\-272.5234\\-115\\134.7722\\-278.3828\\-115\\131.8359\\-281.1796\\-115\\127.9297\\-284.4166\\-115\\125.6767\\-286.1953\\-115\\122.0703\\-288.8663\\-115\\120.1172\\-289.9531\\-115\\118.1641\\-291.2057\\-115\\116.2109\\-292.6238\\-115\\114.2578\\-293.5645\\-115\\112.3047\\-294.7141\\-115\\110.3516\\-295.3555\\-115\\108.3984\\-296.3898\\-115\\106.4453\\-296.9959\\-115\\102.5391\\-298.6754\\-115\\100.5859\\-299.2519\\-115\\98.63281\\-300.0569\\-115\\96.67969\\-300.5852\\-115\\92.77344\\-301.2485\\-115\\88.86719\\-302.1126\\-115\\86.91406\\-302.3793\\-115\\84.96094\\-302.5453\\-115\\79.10156\\-302.7969\\-115\\75.19531\\-302.8185\\-115\\71.28906\\-302.758\\-115\\67.38281\\-302.5572\\-115\\65.42969\\-302.3381\\-115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "188" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "63" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-302.1268\\-113\\-90.82031\\-301.5527\\-113\\-94.72656\\-300.7647\\-113\\-96.67969\\-300.2991\\-113\\-98.63281\\-299.4629\\-113\\-100.5859\\-298.8311\\-113\\-102.5391\\-298.1011\\-113\\-104.4922\\-297.1095\\-113\\-106.4453\\-296.4746\\-113\\-108.3984\\-295.3418\\-113\\-110.3516\\-294.6652\\-113\\-112.3047\\-293.4472\\-113\\-114.2578\\-292.4317\\-113\\-117.5537\\-290.1016\\-113\\-118.1641\\-289.5929\\-113\\-120.1172\\-288.6092\\-113\\-122.0703\\-287.078\\-113\\-125.9766\\-283.6697\\-113\\-127.8302\\-282.2891\\-113\\-129.8828\\-280.4778\\-113\\-131.9391\\-278.3828\\-113\\-133.996\\-276.4297\\-113\\-135.8968\\-274.4766\\-113\\-137.3236\\-272.5234\\-113\\-140.7494\\-268.6172\\-113\\-142.3356\\-266.6641\\-113\\-144.813\\-262.7578\\-113\\-146.3702\\-260.8047\\-113\\-147.6692\\-258.8516\\-113\\-148.7175\\-256.8984\\-113\\-149.9859\\-254.9453\\-113\\-150.7887\\-252.9922\\-113\\-152.0883\\-251.0391\\-113\\-154.1902\\-247.1328\\-113\\-154.9913\\-245.1797\\-113\\-155.9933\\-243.2266\\-113\\-156.5859\\-241.2734\\-113\\-157.6879\\-239.3203\\-113\\-158.357\\-237.3672\\-113\\-159.4035\\-235.4141\\-113\\-160.8646\\-231.5078\\-113\\-161.7314\\-229.5547\\-113\\-162.6723\\-225.6484\\-113\\-163.5489\\-223.6953\\-113\\-164.4718\\-219.7891\\-113\\-165.2261\\-217.8359\\-113\\-165.774\\-215.8828\\-113\\-166.1179\\-213.9297\\-113\\-167.1007\\-210.0234\\-113\\-167.4774\\-208.0703\\-113\\-167.7188\\-206.1172\\-113\\-168.0335\\-202.2109\\-113\\-168.1264\\-198.3047\\-113\\-168.0516\\-194.3984\\-113\\-167.7769\\-190.4922\\-113\\-167.5232\\-188.5391\\-113\\-167.0593\\-186.5859\\-113\\-166.4701\\-184.6328\\-113\\-165.5215\\-180.7266\\-113\\-164.6102\\-178.7734\\-113\\-163.2561\\-174.8672\\-113\\-162.2957\\-172.9141\\-113\\-161.5421\\-170.9609\\-113\\-161.1328\\-170.3688\\-113\\-159.2327\\-167.0547\\-113\\-156.68\\-163.1484\\-113\\-155.6716\\-161.1953\\-113\\-153.3203\\-157.7556\\-113\\-149.9889\\-153.3828\\-113\\-149.4141\\-152.4822\\-113\\-145.5994\\-147.5234\\-113\\-143.9978\\-145.5703\\-113\\-140.4315\\-141.6641\\-113\\-138.3751\\-139.7109\\-113\\-133.7891\\-135.2342\\-113\\-131.8359\\-134.1838\\-113\\-129.2128\\-131.8984\\-113\\-127.9297\\-130.4464\\-113\\-125.9766\\-128.9168\\-113\\-122.0703\\-125.7172\\-113\\-119.8556\\-124.0859\\-113\\-116.2109\\-121.8073\\-113\\-113.1218\\-120.1797\\-113\\-108.3984\\-118.0292\\-113\\-102.5391\\-115.7899\\-113\\-100.5859\\-115.3226\\-113\\-98.63281\\-114.6101\\-113\\-96.67969\\-114.0963\\-113\\-94.72656\\-113.7612\\-113\\-92.77344\\-113.2857\\-113\\-87.10938\\-112.3672\\-113\\-84.96094\\-112.159\\-113\\-81.05469\\-111.9296\\-113\\-79.10156\\-111.584\\-113\\-73.24219\\-111.2389\\-113\\-71.28906\\-111.2279\\-113\\-69.33594\\-111.0108\\-113\\-67.38281\\-110.6648\\-113\\-63.47656\\-111.0609\\-113\\-61.52344\\-111.4536\\-113\\-59.57031\\-111.7418\\-113\\-56.10352\\-112.3672\\-113\\-53.71094\\-112.8716\\-113\\-51.75781\\-113.5479\\-113\\-49.80469\\-114.0178\\-113\\-45.89844\\-115.3579\\-113\\-43.94531\\-115.9707\\-113\\-39.38176\\-118.2266\\-113\\-36.32813\\-120.1797\\-113\\-34.17969\\-121.9169\\-113\\-32.22656\\-123.9666\\-113\\-30.27344\\-126.3245\\-113\\-28.32031\\-128.9404\\-113\\-26.36719\\-132.1091\\-113\\-25.53665\\-133.8516\\-113\\-24.41406\\-135.5924\\-113\\-22.15379\\-139.7109\\-113\\-21.26814\\-141.6641\\-113\\-20.10968\\-143.6172\\-113\\-19.34814\\-145.5703\\-113\\-18.30701\\-147.5234\\-113\\-17.51567\\-149.4766\\-113\\-15.70495\\-153.3828\\-113\\-15.03233\\-155.3359\\-113\\-14.11518\\-157.2891\\-113\\-13.26172\\-161.1953\\-113\\-12.13458\\-165.1016\\-113\\-11.87323\\-167.0547\\-113\\-11.52664\\-170.9609\\-113\\-11.0919\\-174.8672\\-113\\-10.60675\\-178.7734\\-113\\-10.46036\\-180.7266\\-113\\-10.2892\\-184.6328\\-113\\-10.2983\\-188.5391\\-113\\-10.20397\\-192.4453\\-113\\-10.25391\\-196.3516\\-113\\-9.907156\\-202.2109\\-113\\-9.667478\\-204.1641\\-113\\-9.412977\\-208.0703\\-113\\-9.357766\\-210.0234\\-113\\-9.01762\\-213.9297\\-113\\-8.930701\\-215.8828\\-113\\-9.099187\\-219.7891\\-113\\-9.625401\\-223.6953\\-113\\-10.09285\\-227.6016\\-113\\-10.46036\\-229.5547\\-113\\-11.02218\\-231.5078\\-113\\-11.41741\\-233.4609\\-113\\-11.89732\\-237.3672\\-113\\-12.22005\\-239.3203\\-113\\-12.85306\\-241.2734\\-113\\-13.33599\\-243.2266\\-113\\-14.07434\\-247.1328\\-113\\-15.57543\\-251.0391\\-113\\-16.17619\\-252.9922\\-113\\-17.23249\\-254.9453\\-113\\-17.78739\\-256.8984\\-113\\-18.7934\\-258.8516\\-113\\-20.07004\\-262.7578\\-113\\-21.16456\\-264.7109\\-113\\-21.95562\\-266.6641\\-113\\-23.23451\\-268.6172\\-113\\-24.12446\\-270.5703\\-113\\-25.32817\\-272.5234\\-113\\-26.14765\\-274.4766\\-113\\-27.34963\\-276.4297\\-113\\-29.86704\\-280.3359\\-113\\-32.8125\\-284.2422\\-113\\-34.15606\\-286.1953\\-113\\-35.80968\\-288.1484\\-113\\-39.59451\\-292.0547\\-113\\-41.99219\\-294.168\\-113\\-43.94531\\-295.3615\\-113\\-45.89844\\-296.7627\\-113\\-47.85156\\-297.9368\\-113\\-51.42558\\-299.8672\\-113\\-51.75781\\-300.1007\\-113\\-53.71094\\-300.8031\\-113\\-55.66406\\-301.3122\\-113\\-57.61719\\-302.0349\\-113\\-59.57031\\-302.5179\\-113\\-61.52344\\-302.7527\\-113\\-67.38281\\-303.3039\\-113\\-71.28906\\-303.5275\\-113\\-73.24219\\-303.5154\\-113\\-77.14844\\-303.2914\\-113\\-84.96094\\-302.7015\\-113\\-86.91406\\-302.4693\\-113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "64" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-301.9211\\-113\\61.52344\\-301.4337\\-113\\57.61719\\-300.7359\\-113\\55.66406\\-300.254\\-113\\53.71094\\-299.3516\\-113\\51.75781\\-298.6368\\-113\\49.80469\\-297.5039\\-113\\47.85156\\-296.6989\\-113\\45.89844\\-295.5293\\-113\\43.94531\\-294.631\\-113\\40.47394\\-292.0547\\-113\\38.08594\\-290.0931\\-113\\36.13281\\-288.6472\\-113\\33.54011\\-286.1953\\-113\\30.09796\\-282.2891\\-113\\28.32031\\-280.094\\-113\\25.73568\\-276.4297\\-113\\24.73958\\-274.4766\\-113\\24.41406\\-274.101\\-113\\22.46094\\-270.86\\-113\\22.21853\\-270.5703\\-113\\21.29021\\-268.6172\\-113\\20.12392\\-266.6641\\-113\\18.87084\\-262.7578\\-113\\17.88027\\-260.8047\\-113\\17.41621\\-258.8516\\-113\\15.94543\\-254.9453\\-113\\15.09766\\-251.0391\\-113\\14.33831\\-249.0859\\-113\\13.99158\\-247.1328\\-113\\13.47778\\-243.2266\\-113\\13.28506\\-241.2734\\-113\\12.94663\\-239.3203\\-113\\12.48238\\-237.3672\\-113\\11.91518\\-233.4609\\-113\\11.52449\\-227.6016\\-113\\11.12376\\-223.6953\\-113\\10.74219\\-221.4004\\-113\\10.27135\\-217.8359\\-113\\9.920561\\-213.9297\\-113\\9.41606\\-210.0234\\-113\\8.900036\\-208.0703\\-113\\8.496094\\-206.1172\\-113\\8.327096\\-204.1641\\-113\\8.22078\\-200.2578\\-113\\8.236608\\-198.3047\\-113\\8.4851\\-194.3984\\-113\\9.326461\\-190.4922\\-113\\9.506226\\-188.5391\\-113\\9.89772\\-180.7266\\-113\\10.16488\\-178.7734\\-113\\11.0919\\-174.8672\\-113\\11.40264\\-172.9141\\-113\\11.88427\\-169.0078\\-113\\12.30605\\-167.0547\\-113\\12.98757\\-165.1016\\-113\\13.88239\\-161.1953\\-113\\14.59418\\-159.2422\\-113\\16.60156\\-155.1309\\-113\\18.55469\\-151.7236\\-113\\19.78181\\-149.4766\\-113\\22.46094\\-145.9626\\-113\\24.44022\\-143.6172\\-113\\25.9011\\-141.6641\\-113\\27.66187\\-139.7109\\-113\\30.27344\\-136.5509\\-113\\34.42881\\-131.8984\\-113\\36.12132\\-129.9453\\-113\\37.9348\\-127.9922\\-113\\40.03906\\-125.8763\\-113\\41.99219\\-124.129\\-113\\44.53125\\-122.1328\\-113\\47.85156\\-120.0285\\-113\\49.80469\\-119.109\\-113\\51.75781\\-118.0736\\-113\\55.85395\\-116.2734\\-113\\59.57031\\-114.8994\\-113\\63.47656\\-113.6801\\-113\\67.38281\\-112.7043\\-113\\71.28906\\-111.9108\\-113\\73.24219\\-111.6504\\-113\\79.10156\\-111.0336\\-113\\83.00781\\-110.8656\\-113\\86.91406\\-110.8236\\-113\\90.82031\\-110.897\\-113\\96.67969\\-111.2686\\-113\\98.63281\\-111.4293\\-113\\100.5859\\-111.726\\-113\\104.4922\\-112.4682\\-113\\110.3516\\-114.0963\\-113\\112.3047\\-114.9804\\-113\\114.2578\\-115.5497\\-113\\115.9824\\-116.2734\\-113\\118.1641\\-117.3795\\-113\\122.0703\\-119.5634\\-113\\124.0234\\-120.9007\\-113\\125.9766\\-122.0221\\-113\\127.9297\\-123.4734\\-113\\131.8359\\-126.8798\\-113\\133.5192\\-127.9922\\-113\\135.7069\\-129.9453\\-113\\139.7569\\-133.8516\\-113\\141.2376\\-135.8047\\-113\\142.9543\\-137.7578\\-113\\147.4609\\-142.4119\\-113\\151.87\\-147.5234\\-113\\153.3203\\-149.4871\\-113\\155.9531\\-153.3828\\-113\\156.9595\\-155.3359\\-113\\159.2924\\-159.2422\\-113\\161.2031\\-163.1484\\-113\\161.9672\\-165.1016\\-113\\162.4715\\-167.0547\\-113\\163.2973\\-169.0078\\-113\\163.9176\\-170.9609\\-113\\164.3595\\-172.9141\\-113\\165.6371\\-176.8203\\-113\\166.3097\\-180.7266\\-113\\167.0869\\-184.6328\\-113\\167.5494\\-188.5391\\-113\\167.7907\\-192.4453\\-113\\167.922\\-198.3047\\-113\\167.9513\\-202.2109\\-113\\167.9171\\-206.1172\\-113\\167.8136\\-210.0234\\-113\\167.6099\\-213.9297\\-113\\167.155\\-217.8359\\-113\\166.4201\\-221.7422\\-113\\165.7853\\-225.6484\\-113\\165.3752\\-227.6016\\-113\\164.6369\\-229.5547\\-113\\163.7313\\-233.4609\\-113\\162.3474\\-237.3672\\-113\\161.9177\\-239.3203\\-113\\161.1716\\-241.2734\\-113\\160.2335\\-243.2266\\-113\\159.4204\\-245.1797\\-113\\158.2553\\-247.1328\\-113\\157.2787\\-249.0859\\-113\\155.2734\\-252.8446\\-113\\154.071\\-254.9453\\-113\\151.2806\\-258.8516\\-113\\150.0714\\-260.8047\\-113\\147.4609\\-264.2356\\-113\\145.5078\\-266.6216\\-113\\143.5547\\-268.8485\\-113\\142.1526\\-270.5703\\-113\\140.3748\\-272.5234\\-113\\137.6953\\-275.3229\\-113\\134.692\\-278.3828\\-113\\131.8359\\-281.1132\\-113\\129.8828\\-282.7598\\-113\\125.5676\\-286.1953\\-113\\122.0703\\-288.8235\\-113\\120.1172\\-289.882\\-113\\118.1641\\-291.1436\\-113\\116.2109\\-292.5522\\-113\\114.2578\\-293.5008\\-113\\112.3047\\-294.6609\\-113\\110.3516\\-295.312\\-113\\108.3984\\-296.3339\\-113\\106.4453\\-296.9746\\-113\\104.4922\\-297.7319\\-113\\102.5391\\-298.6334\\-113\\100.5859\\-299.1996\\-113\\98.63281\\-299.9773\\-113\\96.67969\\-300.5357\\-113\\90.82031\\-301.5671\\-113\\88.86719\\-302.0479\\-113\\86.91406\\-302.325\\-113\\83.00781\\-302.6351\\-113\\79.10156\\-302.7694\\-113\\75.19531\\-302.8023\\-113\\71.28906\\-302.7469\\-113\\67.38281\\-302.5179\\-113\\65.42969\\-302.3053\\-113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "196" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "65" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-301.9931\\-111\\-90.82031\\-301.4421\\-111\\-94.72656\\-300.6791\\-111\\-96.67969\\-300.2014\\-111\\-98.63281\\-299.3201\\-111\\-100.5859\\-298.7304\\-111\\-104.4922\\-297.0139\\-111\\-106.4453\\-296.3556\\-111\\-108.3984\\-295.2581\\-111\\-110.3516\\-294.5834\\-111\\-112.3047\\-293.3433\\-111\\-114.2578\\-292.3252\\-111\\-117.4501\\-290.1016\\-111\\-118.1641\\-289.5236\\-111\\-120.1172\\-288.4977\\-111\\-122.0703\\-287.0081\\-111\\-125.9766\\-283.5757\\-111\\-127.6768\\-282.2891\\-111\\-129.8828\\-280.3273\\-111\\-131.8359\\-278.2918\\-111\\-133.8331\\-276.4297\\-111\\-135.7507\\-274.4766\\-111\\-137.2174\\-272.5234\\-111\\-140.6683\\-268.6172\\-111\\-142.2721\\-266.6641\\-111\\-143.4186\\-264.7109\\-111\\-144.7427\\-262.7578\\-111\\-146.3063\\-260.8047\\-111\\-147.6151\\-258.8516\\-111\\-148.6703\\-256.8984\\-111\\-149.9353\\-254.9453\\-111\\-150.7385\\-252.9922\\-111\\-152.0623\\-251.0391\\-111\\-153.0343\\-249.0859\\-111\\-154.1566\\-247.1328\\-111\\-154.9527\\-245.1797\\-111\\-155.9854\\-243.2266\\-111\\-156.5571\\-241.2734\\-111\\-157.6504\\-239.3203\\-111\\-158.3464\\-237.3672\\-111\\-159.3791\\-235.4141\\-111\\-160.8412\\-231.5078\\-111\\-161.7525\\-229.5547\\-111\\-162.6967\\-225.6484\\-111\\-163.5773\\-223.6953\\-111\\-164.5178\\-219.7891\\-111\\-165.3096\\-217.8359\\-111\\-165.8316\\-215.8828\\-111\\-166.187\\-213.9297\\-111\\-167.193\\-210.0234\\-111\\-167.5442\\-208.0703\\-111\\-167.7838\\-206.1172\\-111\\-168.099\\-202.2109\\-111\\-168.2144\\-198.3047\\-111\\-168.158\\-194.3984\\-111\\-168.07\\-192.4453\\-111\\-167.7202\\-188.5391\\-111\\-167.4198\\-186.5859\\-111\\-166.3314\\-182.6797\\-111\\-165.8936\\-180.7266\\-111\\-165.3152\\-178.7734\\-111\\-164.4482\\-176.8203\\-111\\-163.8429\\-174.8672\\-111\\-163.0859\\-173.0654\\-111\\-161.236\\-169.0078\\-111\\-159.1797\\-165.231\\-111\\-157.9458\\-163.1484\\-111\\-155.7969\\-159.2422\\-111\\-153.3647\\-155.3359\\-111\\-150.6194\\-151.4297\\-111\\-149.0581\\-149.4766\\-111\\-148.0772\\-147.5234\\-111\\-146.4015\\-145.5703\\-111\\-144.5652\\-143.6172\\-111\\-143.5547\\-141.957\\-111\\-139.7461\\-137.7578\\-111\\-135.7422\\-133.7927\\-111\\-133.7891\\-132.8468\\-111\\-131.8359\\-132.2598\\-111\\-131.5044\\-131.8984\\-111\\-131.485\\-129.9453\\-111\\-129.1351\\-127.9922\\-111\\-127.9297\\-127.1155\\-111\\-124.0234\\-123.7683\\-111\\-121.6384\\-122.1328\\-111\\-120.1172\\-121.1911\\-111\\-118.1641\\-120.215\\-111\\-115.0278\\-118.2266\\-111\\-112.3047\\-116.8883\\-111\\-108.3984\\-115.1962\\-111\\-106.4453\\-114.5916\\-111\\-104.4922\\-113.7138\\-111\\-102.5391\\-113.2793\\-111\\-100.5859\\-113.0454\\-111\\-98.63281\\-111.9422\\-111\\-94.72656\\-111.5203\\-111\\-92.77344\\-110.6525\\-111\\-90.82031\\-110.3098\\-111\\-84.96094\\-109.7874\\-111\\-79.10156\\-109.0627\\-111\\-75.19531\\-108.8112\\-111\\-71.28906\\-108.8496\\-111\\-67.38281\\-108.7577\\-111\\-65.42969\\-108.7993\\-111\\-61.52344\\-109.1027\\-111\\-59.57031\\-109.3857\\-111\\-57.61719\\-109.7874\\-111\\-55.66406\\-109.9791\\-111\\-53.71094\\-110.3279\\-111\\-51.75781\\-111.1864\\-111\\-49.80469\\-111.6447\\-111\\-47.85156\\-111.9565\\-111\\-45.89844\\-112.7512\\-111\\-41.99219\\-113.9763\\-111\\-38.08594\\-115.9722\\-111\\-36.13281\\-117.492\\-111\\-34.74935\\-118.2266\\-111\\-32.22656\\-120.4727\\-111\\-30.49207\\-122.1328\\-111\\-28.32031\\-124.7429\\-111\\-27.57772\\-126.0391\\-111\\-26.05252\\-127.9922\\-111\\-25.23226\\-129.9453\\-111\\-23.89152\\-131.8984\\-111\\-23.07722\\-133.8516\\-111\\-22.46094\\-134.8754\\-111\\-21.01452\\-137.7578\\-111\\-20.19133\\-139.7109\\-111\\-19.47428\\-141.6641\\-111\\-18.94039\\-143.6172\\-111\\-17.91561\\-145.5703\\-111\\-17.26423\\-147.5234\\-111\\-16.33453\\-149.4766\\-111\\-14.85443\\-153.3828\\-111\\-14.02638\\-155.3359\\-111\\-13.05241\\-159.2422\\-111\\-12.42566\\-161.1953\\-111\\-12.01831\\-163.1484\\-111\\-11.76813\\-165.1016\\-111\\-11.17265\\-170.9609\\-111\\-10.55519\\-174.8672\\-111\\-10.34546\\-176.8203\\-111\\-10.17391\\-180.7266\\-111\\-10.08235\\-184.6328\\-111\\-10.09648\\-188.5391\\-111\\-9.944898\\-200.2578\\-111\\-9.813262\\-202.2109\\-111\\-9.045323\\-210.0234\\-111\\-8.679746\\-211.9766\\-111\\-8.478938\\-213.9297\\-111\\-8.503402\\-217.8359\\-111\\-8.600725\\-219.7891\\-111\\-9.602013\\-225.6484\\-111\\-10.08941\\-229.5547\\-111\\-10.4831\\-231.5078\\-111\\-11.08332\\-233.4609\\-111\\-11.45089\\-235.4141\\-111\\-12.03824\\-239.3203\\-111\\-12.52254\\-241.2734\\-111\\-13.19019\\-243.2266\\-111\\-13.94924\\-247.1328\\-111\\-14.58083\\-249.0859\\-111\\-15.44319\\-251.0391\\-111\\-16.02872\\-252.9922\\-111\\-17.09883\\-254.9453\\-111\\-17.6976\\-256.8984\\-111\\-18.625\\-258.8516\\-111\\-19.40104\\-260.8047\\-111\\-19.98047\\-262.7578\\-111\\-21.09375\\-264.7109\\-111\\-21.89265\\-266.6641\\-111\\-23.16655\\-268.6172\\-111\\-24.05599\\-270.5703\\-111\\-25.30031\\-272.5234\\-111\\-26.10627\\-274.4766\\-111\\-29.82045\\-280.3359\\-111\\-32.78556\\-284.2422\\-111\\-34.12456\\-286.1953\\-111\\-36.13281\\-288.5099\\-111\\-38.08594\\-290.4219\\-111\\-39.63216\\-292.0547\\-111\\-41.99219\\-294.0938\\-111\\-43.94531\\-295.3209\\-111\\-45.89844\\-296.707\\-111\\-49.80469\\-298.9333\\-111\\-51.75781\\-299.993\\-111\\-53.71094\\-300.7397\\-111\\-55.66406\\-301.2357\\-111\\-57.61719\\-301.9063\\-111\\-59.57031\\-302.4315\\-111\\-61.52344\\-302.7065\\-111\\-67.38281\\-303.2043\\-111\\-71.28906\\-303.3973\\-111\\-75.19531\\-303.3203\\-111\\-84.96094\\-302.6418\\-111\\-86.91406\\-302.3884\\-111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "184" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "66" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-301.9211\\-111\\61.52344\\-301.4337\\-111\\57.61719\\-300.7245\\-111\\55.66406\\-300.2206\\-111\\53.71094\\-299.3049\\-111\\51.75781\\-298.6076\\-111\\49.80469\\-297.4609\\-111\\47.85156\\-296.6737\\-111\\45.89844\\-295.4936\\-111\\43.94531\\-294.6003\\-111\\40.50085\\-292.0547\\-111\\38.08594\\-290.0763\\-111\\36.13281\\-288.6577\\-111\\33.53557\\-286.1953\\-111\\30.08418\\-282.2891\\-111\\28.32031\\-280.1317\\-111\\25.73568\\-276.4297\\-111\\24.72511\\-274.4766\\-111\\24.41406\\-274.1114\\-111\\22.46094\\-270.8625\\-111\\22.21853\\-270.5703\\-111\\21.27878\\-268.6172\\-111\\20.14587\\-266.6641\\-111\\18.88253\\-262.7578\\-111\\17.89455\\-260.8047\\-111\\17.41621\\-258.8516\\-111\\15.95909\\-254.9453\\-111\\15.05055\\-251.0391\\-111\\14.37231\\-249.0859\\-111\\14.00321\\-247.1328\\-111\\13.27237\\-241.2734\\-111\\12.9713\\-239.3203\\-111\\12.46939\\-237.3672\\-111\\11.92882\\-233.4609\\-111\\11.51816\\-227.6016\\-111\\11.06994\\-223.6953\\-111\\10.43822\\-219.7891\\-111\\9.660994\\-211.9766\\-111\\9.319026\\-210.0234\\-111\\8.781433\\-208.0703\\-111\\8.382667\\-206.1172\\-111\\8.244657\\-204.1641\\-111\\8.22078\\-200.2578\\-111\\8.31822\\-198.3047\\-111\\8.666992\\-194.3984\\-111\\9.234619\\-190.4922\\-111\\9.706737\\-180.7266\\-111\\10.22552\\-176.8203\\-111\\10.5678\\-174.8672\\-111\\11.37579\\-170.9609\\-111\\11.96145\\-167.0547\\-111\\12.46769\\-165.1016\\-111\\13.17022\\-163.1484\\-111\\14.13066\\-159.2422\\-111\\15.13046\\-157.2891\\-111\\15.8805\\-155.3359\\-111\\17.0318\\-153.3828\\-111\\17.95226\\-151.4297\\-111\\19.19427\\-149.4766\\-111\\20.13103\\-147.5234\\-111\\24.34957\\-141.6641\\-111\\25.9009\\-139.7109\\-111\\27.13186\\-137.7578\\-111\\30.27344\\-133.3562\\-111\\32.22656\\-130.9494\\-111\\34.17969\\-128.3566\\-111\\36.21557\\-126.0391\\-111\\38.08594\\-123.7651\\-111\\40.03906\\-121.7614\\-111\\41.99219\\-120.064\\-111\\43.94531\\-119.0811\\-111\\45.89844\\-117.5712\\-111\\47.85156\\-116.3725\\-111\\49.80469\\-115.3893\\-111\\53.71094\\-113.7203\\-111\\56.28255\\-112.3672\\-111\\57.61719\\-111.9708\\-111\\59.57031\\-111.7132\\-111\\61.52344\\-110.8955\\-111\\63.47656\\-110.3175\\-111\\65.42969\\-110.0024\\-111\\67.38281\\-109.5822\\-111\\71.28906\\-108.9212\\-111\\73.24219\\-108.7384\\-111\\79.10156\\-108.4054\\-111\\81.05469\\-108.0129\\-111\\84.96094\\-107.9499\\-111\\86.91406\\-108.0129\\-111\\88.86719\\-108.3229\\-111\\90.82031\\-108.3454\\-111\\94.72656\\-108.5395\\-111\\98.63281\\-108.8373\\-111\\100.5859\\-109.0429\\-111\\104.4922\\-109.955\\-111\\106.4453\\-110.347\\-111\\110.3516\\-111.7135\\-111\\112.3047\\-112.2587\\-111\\114.2578\\-113.2461\\-111\\116.2109\\-113.9541\\-111\\118.1641\\-114.8931\\-111\\122.0703\\-117.0489\\-111\\124.0234\\-118.5915\\-111\\125.9766\\-119.5693\\-111\\127.9297\\-121.1183\\-111\\129.8828\\-122.8118\\-111\\131.8218\\-124.0859\\-111\\133.7891\\-125.7451\\-111\\135.7422\\-127.5184\\-111\\138.1051\\-129.9453\\-111\\140.1042\\-131.8984\\-111\\141.9334\\-133.8516\\-111\\143.0966\\-135.8047\\-111\\144.8069\\-137.7578\\-111\\146.7104\\-139.7109\\-111\\148.4536\\-141.6641\\-111\\151.5732\\-145.5703\\-111\\155.6983\\-151.4297\\-111\\156.6349\\-153.3828\\-111\\157.856\\-155.3359\\-111\\158.8073\\-157.2891\\-111\\159.9573\\-159.2422\\-111\\161.7472\\-163.1484\\-111\\162.2445\\-165.1016\\-111\\162.8531\\-167.0547\\-111\\163.6635\\-169.0078\\-111\\164.6086\\-172.9141\\-111\\165.3752\\-174.8672\\-111\\165.793\\-176.8203\\-111\\166.4333\\-180.7266\\-111\\167.193\\-184.6328\\-111\\167.6099\\-188.5391\\-111\\167.8022\\-192.4453\\-111\\167.9337\\-198.3047\\-111\\167.9456\\-204.1641\\-111\\167.8888\\-208.0703\\-111\\167.6018\\-213.9297\\-111\\167.4434\\-215.8828\\-111\\167.1678\\-217.8359\\-111\\166.4283\\-221.7422\\-111\\165.7914\\-225.6484\\-111\\165.4061\\-227.6016\\-111\\164.6575\\-229.5547\\-111\\163.7538\\-233.4609\\-111\\162.9993\\-235.4141\\-111\\162.3474\\-237.3672\\-111\\161.9248\\-239.3203\\-111\\161.1407\\-241.2734\\-111\\159.3708\\-245.1797\\-111\\158.2548\\-247.1328\\-111\\156.2317\\-251.0391\\-111\\154.0588\\-254.9453\\-111\\151.207\\-258.8516\\-111\\150.0204\\-260.8047\\-111\\148.5497\\-262.7578\\-111\\145.5078\\-266.5246\\-111\\142.0934\\-270.5703\\-111\\140.3137\\-272.5234\\-111\\137.6953\\-275.2506\\-111\\134.6175\\-278.3828\\-111\\131.8359\\-281.0383\\-111\\129.8828\\-282.6725\\-111\\124.0234\\-287.2769\\-111\\122.0703\\-288.7663\\-111\\120.1172\\-289.7905\\-111\\118.1641\\-291.0727\\-111\\116.2109\\-292.4894\\-111\\114.2578\\-293.4352\\-111\\112.3047\\-294.619\\-111\\110.3516\\-295.2616\\-111\\108.3984\\-296.263\\-111\\104.4922\\-297.656\\-111\\102.5391\\-298.5881\\-111\\100.5859\\-299.1456\\-111\\98.63281\\-299.905\\-111\\96.67969\\-300.5008\\-111\\90.82031\\-301.5042\\-111\\88.86719\\-301.9781\\-111\\86.91406\\-302.292\\-111\\83.00781\\-302.6214\\-111\\79.10156\\-302.7469\\-111\\75.19531\\-302.7969\\-111\\71.28906\\-302.7239\\-111\\67.38281\\-302.51\\-111\\65.42969\\-302.2818\\-111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "193" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "67" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.82031\\-301.3386\\-109\\-94.72656\\-300.6067\\-109\\-96.67969\\-300.0569\\-109\\-98.63281\\-299.1954\\-109\\-100.5859\\-298.6312\\-109\\-102.5391\\-297.6788\\-109\\-106.4453\\-296.2122\\-109\\-108.3984\\-295.1664\\-109\\-110.3516\\-294.4795\\-109\\-112.3047\\-293.2345\\-109\\-114.2578\\-292.1494\\-109\\-117.3116\\-290.1016\\-109\\-118.1641\\-289.431\\-109\\-120.1172\\-288.3663\\-109\\-122.0703\\-286.9199\\-109\\-125.9766\\-283.406\\-109\\-127.504\\-282.2891\\-109\\-129.8828\\-280.1342\\-109\\-131.8359\\-278.125\\-109\\-133.6167\\-276.4297\\-109\\-135.7422\\-274.2935\\-109\\-137.0817\\-272.5234\\-109\\-138.7601\\-270.5703\\-109\\-140.5628\\-268.6172\\-109\\-142.1701\\-266.6641\\-109\\-143.2897\\-264.7109\\-109\\-144.6734\\-262.7578\\-109\\-146.2271\\-260.8047\\-109\\-147.5152\\-258.8516\\-109\\-148.6162\\-256.8984\\-109\\-149.882\\-254.9453\\-109\\-150.706\\-252.9922\\-109\\-152.0163\\-251.0391\\-109\\-152.9857\\-249.0859\\-109\\-154.1275\\-247.1328\\-109\\-154.9037\\-245.1797\\-109\\-155.9602\\-243.2266\\-109\\-156.529\\-241.2734\\-109\\-157.6184\\-239.3203\\-109\\-158.3252\\-237.3672\\-109\\-159.3541\\-235.4141\\-109\\-160.8412\\-231.5078\\-109\\-161.7525\\-229.5547\\-109\\-162.7189\\-225.6484\\-109\\-163.5957\\-223.6953\\-109\\-164.5538\\-219.7891\\-109\\-165.3752\\-217.8359\\-109\\-165.8638\\-215.8828\\-109\\-166.2504\\-213.9297\\-109\\-167.2664\\-210.0234\\-109\\-167.6055\\-208.0703\\-109\\-167.8366\\-206.1172\\-109\\-168.1436\\-202.2109\\-109\\-168.2795\\-198.3047\\-109\\-168.2879\\-196.3516\\-109\\-168.1946\\-192.4453\\-109\\-167.8986\\-188.5391\\-109\\-167.6728\\-186.5859\\-109\\-167.3222\\-184.6328\\-109\\-166.7427\\-182.6797\\-109\\-165.7992\\-178.7734\\-109\\-165.1898\\-176.8203\\-109\\-164.3654\\-174.8672\\-109\\-163.7634\\-172.9141\\-109\\-162.8557\\-170.9609\\-109\\-161.2067\\-167.0547\\-109\\-159.2636\\-163.1484\\-109\\-158.1114\\-161.1953\\-109\\-157.2266\\-159.3385\\-109\\-153.9688\\-153.3828\\-109\\-152.6838\\-151.4297\\-109\\-151.1816\\-149.4766\\-109\\-150.1864\\-147.5234\\-109\\-148.5707\\-145.5703\\-109\\-147.4709\\-143.6172\\-109\\-145.5078\\-141.182\\-109\\-143.5547\\-138.9373\\-109\\-141.6016\\-136.8667\\-109\\-139.6484\\-134.6934\\-109\\-136.8064\\-131.8984\\-109\\-135.2081\\-129.9453\\-109\\-133.7891\\-128.8768\\-109\\-131.8359\\-127.0034\\-109\\-128.5761\\-124.0859\\-109\\-126.2455\\-122.1328\\-109\\-124.0234\\-120.7494\\-109\\-122.0703\\-119.364\\-109\\-120.1172\\-118.4374\\-109\\-118.1641\\-117.1896\\-109\\-116.2109\\-116.0948\\-109\\-114.2578\\-115.1785\\-109\\-112.3047\\-114.1231\\-109\\-108.3984\\-112.6569\\-109\\-106.4453\\-111.7129\\-109\\-104.4922\\-111.234\\-109\\-102.3763\\-110.4141\\-109\\-100.5859\\-109.9074\\-109\\-98.63281\\-109.5079\\-109\\-94.72656\\-108.4513\\-109\\-88.86719\\-107.759\\-109\\-86.91406\\-107.5779\\-109\\-84.96094\\-107.2005\\-109\\-83.00781\\-107.0013\\-109\\-75.19531\\-106.4832\\-109\\-73.24219\\-106.4279\\-109\\-69.33594\\-106.6033\\-109\\-65.42969\\-106.6429\\-109\\-61.52344\\-106.8265\\-109\\-57.61719\\-107.2483\\-109\\-51.75781\\-108.34\\-109\\-49.80469\\-109.0627\\-109\\-45.89844\\-109.8756\\-109\\-43.94531\\-110.7777\\-109\\-41.99219\\-111.3619\\-109\\-40.03906\\-112.4009\\-109\\-36.13281\\-114.1893\\-109\\-33.08652\\-116.2734\\-109\\-30.93804\\-118.2266\\-109\\-28.9223\\-120.1797\\-109\\-27.23389\\-122.1328\\-109\\-24.41406\\-126.2275\\-109\\-23.4561\\-127.9922\\-109\\-22.18054\\-129.9453\\-109\\-21.42962\\-131.8984\\-109\\-20.37342\\-133.8516\\-109\\-19.7633\\-135.8047\\-109\\-18.55469\\-138.71\\-109\\-17.55411\\-141.6641\\-109\\-17.12295\\-143.6172\\-109\\-16.27361\\-145.5703\\-109\\-15.17078\\-149.4766\\-109\\-14.34375\\-151.4297\\-109\\-13.28823\\-155.3359\\-109\\-12.07618\\-159.2422\\-109\\-10.99537\\-167.0547\\-109\\-10.39567\\-170.9609\\-109\\-10.19464\\-172.9141\\-109\\-9.947432\\-176.8203\\-109\\-9.683331\\-184.6328\\-109\\-9.641438\\-188.5391\\-109\\-9.66957\\-192.4453\\-109\\-9.755711\\-196.3516\\-109\\-9.706737\\-200.2578\\-109\\-9.610615\\-202.2109\\-109\\-9.136431\\-206.1172\\-109\\-8.200699\\-211.9766\\-109\\-8.025568\\-213.9297\\-109\\-8.07408\\-217.8359\\-109\\-8.151666\\-219.7891\\-109\\-8.354335\\-221.7422\\-109\\-8.679746\\-223.6953\\-109\\-9.203942\\-225.6484\\-109\\-9.543919\\-227.6016\\-109\\-10.10346\\-231.5078\\-109\\-10.4831\\-233.4609\\-109\\-11.15234\\-235.4141\\-109\\-11.62163\\-237.3672\\-109\\-12.21686\\-241.2734\\-109\\-13.00182\\-243.2266\\-109\\-13.82698\\-247.1328\\-109\\-14.3319\\-249.0859\\-109\\-15.28293\\-251.0391\\-109\\-15.90835\\-252.9922\\-109\\-16.87961\\-254.9453\\-109\\-18.41412\\-258.8516\\-109\\-19.34186\\-260.8047\\-109\\-19.8927\\-262.7578\\-109\\-21.01164\\-264.7109\\-109\\-21.81168\\-266.6641\\-109\\-23.08664\\-268.6172\\-109\\-23.97933\\-270.5703\\-109\\-25.27773\\-272.5234\\-109\\-26.05381\\-274.4766\\-109\\-29.7822\\-280.3359\\-109\\-32.77972\\-284.2422\\-109\\-34.10881\\-286.1953\\-109\\-36.13281\\-288.4945\\-109\\-38.08594\\-290.3953\\-109\\-40.03906\\-292.4079\\-109\\-42.04102\\-294.0078\\-109\\-45.89844\\-296.6506\\-109\\-49.80469\\-298.8429\\-109\\-51.79908\\-299.8672\\-109\\-53.71094\\-300.6657\\-109\\-55.66406\\-301.1548\\-109\\-59.57031\\-302.3381\\-109\\-61.52344\\-302.6533\\-109\\-67.38281\\-303.1205\\-109\\-71.28906\\-303.2945\\-109\\-73.24219\\-303.2914\\-109\\-77.14844\\-303.1128\\-109\\-83.00781\\-302.7469\\-109\\-86.91406\\-302.292\\-109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "184" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "68" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "63.47656\\-301.8906\\-109\\61.52344\\-301.4095\\-109\\57.61719\\-300.7018\\-109\\55.66406\\-300.1862\\-109\\53.71094\\-299.2613\\-109\\51.75781\\-298.5632\\-109\\49.80469\\-297.4195\\-109\\47.85156\\-296.6519\\-109\\45.89844\\-295.4692\\-109\\43.94531\\-294.5649\\-109\\41.99219\\-293.154\\-109\\40.03906\\-291.553\\-109\\36.13281\\-288.6577\\-109\\33.53557\\-286.1953\\-109\\30.09796\\-282.2891\\-109\\28.32031\\-280.1336\\-109\\25.73568\\-276.4297\\-109\\24.72511\\-274.4766\\-109\\24.41406\\-274.1146\\-109\\22.46094\\-270.8625\\-109\\22.21853\\-270.5703\\-109\\21.29021\\-268.6172\\-109\\20.13482\\-266.6641\\-109\\18.88489\\-262.7578\\-109\\17.88737\\-260.8047\\-109\\17.42208\\-258.8516\\-109\\15.95909\\-254.9453\\-109\\15.06519\\-251.0391\\-109\\14.39752\\-249.0859\\-109\\14.00703\\-247.1328\\-109\\13.28125\\-241.2734\\-109\\12.94663\\-239.3203\\-109\\12.48238\\-237.3672\\-109\\12.14718\\-235.4141\\-109\\11.92197\\-233.4609\\-109\\11.66221\\-229.5547\\-109\\11.48135\\-227.6016\\-109\\10.93606\\-223.6953\\-109\\10.53049\\-221.7422\\-109\\10.31681\\-219.7891\\-109\\9.560601\\-211.9766\\-109\\9.134929\\-210.0234\\-109\\8.529975\\-208.0703\\-109\\8.251664\\-206.1172\\-109\\8.114246\\-204.1641\\-109\\8.128773\\-200.2578\\-109\\8.490115\\-194.3984\\-109\\8.827815\\-190.4922\\-109\\8.954216\\-186.5859\\-109\\8.957942\\-184.6328\\-109\\9.077113\\-182.6797\\-109\\9.63294\\-178.7734\\-109\\10.32366\\-172.9141\\-109\\11.33531\\-169.0078\\-109\\11.99434\\-165.1016\\-109\\12.48076\\-163.1484\\-109\\13.20394\\-161.1953\\-109\\14.26787\\-157.2891\\-109\\15.22786\\-155.3359\\-109\\15.97377\\-153.3828\\-109\\17.08623\\-151.4297\\-109\\17.87751\\-149.4766\\-109\\19.09375\\-147.5234\\-109\\20.04688\\-145.5703\\-109\\21.39353\\-143.6172\\-109\\22.35765\\-141.6641\\-109\\23.68164\\-139.7109\\-109\\24.87768\\-137.7578\\-109\\27.08258\\-133.8516\\-109\\28.59775\\-131.8984\\-109\\29.66049\\-129.9453\\-109\\32.79321\\-126.0391\\-109\\34.00578\\-124.0859\\-109\\36.13281\\-121.6227\\-109\\38.08594\\-119.6112\\-109\\39.53552\\-118.2266\\-109\\41.99219\\-116.0971\\-109\\43.94531\\-115.0026\\-109\\45.89844\\-113.6088\\-109\\47.85156\\-112.7499\\-109\\49.80469\\-111.6259\\-109\\51.75781\\-111.1067\\-109\\53.71094\\-110.0625\\-109\\57.61719\\-108.5883\\-109\\61.52344\\-107.7538\\-109\\63.47656\\-107.2432\\-109\\67.38281\\-106.7031\\-109\\71.28906\\-106.2604\\-109\\73.24219\\-105.7924\\-109\\75.19531\\-105.5855\\-109\\81.05469\\-105.3021\\-109\\86.91406\\-105.3652\\-109\\92.77344\\-105.6693\\-109\\94.72656\\-105.8131\\-109\\96.67969\\-106.2787\\-109\\98.87695\\-106.5078\\-109\\102.5391\\-106.991\\-109\\108.3984\\-108.612\\-109\\110.3516\\-109.4035\\-109\\112.3047\\-109.8869\\-109\\114.2578\\-111.0266\\-109\\116.2109\\-111.694\\-109\\122.0703\\-114.7512\\-109\\124.0234\\-115.8304\\-109\\125.9766\\-117.2592\\-109\\127.9297\\-118.8206\\-109\\131.8359\\-121.7403\\-109\\133.7891\\-123.5055\\-109\\137.6953\\-127.3023\\-109\\140.2911\\-129.9453\\-109\\142.0543\\-131.8984\\-109\\143.6719\\-133.8516\\-109\\144.9282\\-135.8047\\-109\\148.3729\\-139.7109\\-109\\149.8631\\-141.6641\\-109\\151.0918\\-143.6172\\-109\\152.6619\\-145.5703\\-109\\154.12\\-147.5234\\-109\\155.3314\\-149.4766\\-109\\156.3622\\-151.4297\\-109\\157.586\\-153.3828\\-109\\158.4848\\-155.3359\\-109\\159.6774\\-157.2891\\-109\\160.4461\\-159.2422\\-109\\161.4654\\-161.1953\\-109\\162.073\\-163.1484\\-109\\162.5383\\-165.1016\\-109\\163.3838\\-167.0547\\-109\\164.3447\\-170.9609\\-109\\165.5932\\-174.8672\\-109\\166.58\\-180.7266\\-109\\167.3002\\-184.6328\\-109\\167.4866\\-186.5859\\-109\\167.7376\\-190.4922\\-109\\167.8816\\-194.3984\\-109\\167.9454\\-198.3047\\-109\\167.9515\\-204.1641\\-109\\167.9002\\-208.0703\\-109\\167.7217\\-211.9766\\-109\\167.4214\\-215.8828\\-109\\167.1805\\-217.8359\\-109\\166.425\\-221.7422\\-109\\165.7914\\-225.6484\\-109\\165.4161\\-227.6016\\-109\\164.668\\-229.5547\\-109\\164.1499\\-231.5078\\-109\\163.7464\\-233.4609\\-109\\162.3474\\-237.3672\\-109\\161.9057\\-239.3203\\-109\\161.1328\\-241.229\\-109\\159.3448\\-245.1797\\-109\\158.2391\\-247.1328\\-109\\156.2195\\-251.0391\\-109\\155.0752\\-252.9922\\-109\\154.0466\\-254.9453\\-109\\152.5378\\-256.8984\\-109\\151.1493\\-258.8516\\-109\\149.9617\\-260.8047\\-109\\146.9075\\-264.7109\\-109\\143.67\\-268.6172\\-109\\139.6484\\-273.1466\\-109\\134.5232\\-278.3828\\-109\\131.8359\\-280.9259\\-109\\127.7738\\-284.2422\\-109\\124.0234\\-287.2087\\-109\\122.0703\\-288.6978\\-109\\120.1172\\-289.6791\\-109\\116.2109\\-292.378\\-109\\114.2578\\-293.3587\\-109\\112.3047\\-294.5446\\-109\\110.3516\\-295.2083\\-109\\108.3984\\-296.1869\\-109\\104.4922\\-297.5596\\-109\\102.5391\\-298.538\\-109\\100.5859\\-299.0807\\-109\\96.67969\\-300.4496\\-109\\94.72656\\-300.8212\\-109\\90.82031\\-301.4311\\-109\\86.91406\\-302.2232\\-109\\83.00781\\-302.591\\-109\\77.14844\\-302.7638\\-109\\71.28906\\-302.7127\\-109\\67.38281\\-302.4898\\-109\\65.42969\\-302.2581\\-109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "194" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "69" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-302.1761\\-107\\-90.82031\\-301.2256\\-107\\-94.72656\\-300.5239\\-107\\-96.66285\\-299.8672\\-107\\-98.63281\\-299.0934\\-107\\-100.5859\\-298.5244\\-107\\-102.5391\\-297.5116\\-107\\-104.4922\\-296.8543\\-107\\-108.3984\\-295.0989\\-107\\-110.3516\\-294.3404\\-107\\-110.7929\\-294.0078\\-107\\-114.1012\\-292.0547\\-107\\-116.2109\\-290.7467\\-107\\-118.1641\\-289.342\\-107\\-120.1172\\-288.1729\\-107\\-122.0703\\-286.7928\\-107\\-125.9766\\-283.2954\\-107\\-127.3075\\-282.2891\\-107\\-129.4688\\-280.3359\\-107\\-131.3914\\-278.3828\\-107\\-135.7422\\-274.0778\\-107\\-136.8726\\-272.5234\\-107\\-140.4685\\-268.6172\\-107\\-142.0656\\-266.6641\\-107\\-143.1372\\-264.7109\\-107\\-146.1331\\-260.8047\\-107\\-147.4609\\-258.755\\-107\\-149.8117\\-254.9453\\-107\\-150.6747\\-252.9922\\-107\\-151.9603\\-251.0391\\-107\\-152.9257\\-249.0859\\-107\\-154.0843\\-247.1328\\-107\\-154.8814\\-245.1797\\-107\\-155.9309\\-243.2266\\-107\\-156.4897\\-241.2734\\-107\\-157.588\\-239.3203\\-107\\-158.2971\\-237.3672\\-107\\-159.3541\\-235.4141\\-107\\-160.8255\\-231.5078\\-107\\-161.7225\\-229.5547\\-107\\-162.7189\\-225.6484\\-107\\-163.6224\\-223.6953\\-107\\-164.585\\-219.7891\\-107\\-165.426\\-217.8359\\-107\\-166.2954\\-213.9297\\-107\\-167.3242\\-210.0234\\-107\\-167.6607\\-208.0703\\-107\\-168.0452\\-204.1641\\-107\\-168.1824\\-202.2109\\-107\\-168.3751\\-196.3516\\-107\\-168.3093\\-192.4453\\-107\\-168.2021\\-190.4922\\-107\\-167.8583\\-186.5859\\-107\\-167.6086\\-184.6328\\-107\\-167.2567\\-182.6797\\-107\\-166.1987\\-178.7734\\-107\\-165.7538\\-176.8203\\-107\\-165.1476\\-174.8672\\-107\\-164.3261\\-172.9141\\-107\\-163.7666\\-170.9609\\-107\\-162.875\\-169.0078\\-107\\-161.325\\-165.1016\\-107\\-159.5052\\-161.1953\\-107\\-158.418\\-159.2422\\-107\\-157.5835\\-157.2891\\-107\\-156.4716\\-155.3359\\-107\\-155.7213\\-153.3828\\-107\\-152.2859\\-147.5234\\-107\\-150.6143\\-145.5703\\-107\\-149.7116\\-143.6172\\-107\\-148.1761\\-141.6641\\-107\\-145.5078\\-138.011\\-107\\-143.5547\\-135.6148\\-107\\-141.9271\\-133.8516\\-107\\-140.2902\\-131.8984\\-107\\-137.6953\\-129.1182\\-107\\-134.5378\\-126.0391\\-107\\-131.8359\\-123.5434\\-107\\-127.6449\\-120.1797\\-107\\-124.9593\\-118.2266\\-107\\-124.0234\\-117.7001\\-107\\-121.905\\-116.2734\\-107\\-118.1641\\-114.1546\\-107\\-116.2109\\-113.2928\\-107\\-114.5733\\-112.3672\\-107\\-112.3047\\-111.3359\\-107\\-108.3984\\-109.7446\\-107\\-106.4453\\-109.1934\\-107\\-104.4922\\-108.4144\\-107\\-102.5391\\-107.9018\\-107\\-100.5859\\-107.6001\\-107\\-98.63281\\-106.9155\\-107\\-96.67969\\-106.4046\\-107\\-92.77344\\-105.9033\\-107\\-90.82031\\-105.4794\\-107\\-88.86719\\-105.2641\\-107\\-84.96094\\-104.5653\\-107\\-83.00781\\-104.5025\\-107\\-79.10156\\-104.2507\\-107\\-75.19531\\-104.1387\\-107\\-73.24219\\-103.6659\\-107\\-71.28906\\-103.7246\\-107\\-69.33594\\-103.9476\\-107\\-65.42969\\-104.0475\\-107\\-63.47656\\-104.2507\\-107\\-59.22154\\-104.5547\\-107\\-57.61719\\-104.7793\\-107\\-53.71094\\-105.4528\\-107\\-51.75781\\-105.94\\-107\\-48.71545\\-106.5078\\-107\\-45.89844\\-107.3749\\-107\\-43.94531\\-107.8642\\-107\\-42.06543\\-108.4609\\-107\\-38.08594\\-110.1962\\-107\\-34.22852\\-112.3672\\-107\\-32.22656\\-113.7851\\-107\\-30.27344\\-115.3713\\-107\\-28.32031\\-117.2188\\-107\\-25.68742\\-120.1797\\-107\\-24.10419\\-122.1328\\-107\\-22.46094\\-124.7127\\-107\\-21.70139\\-126.0391\\-107\\-20.90774\\-127.9922\\-107\\-19.83964\\-129.9453\\-107\\-19.24272\\-131.8984\\-107\\-18.17057\\-133.8516\\-107\\-16.60156\\-137.9622\\-107\\-16.08297\\-139.7109\\-107\\-15.16281\\-143.6172\\-107\\-14.04693\\-147.5234\\-107\\-13.28402\\-151.4297\\-107\\-12.5921\\-153.3828\\-107\\-11.70706\\-157.2891\\-107\\-11.38286\\-159.2422\\-107\\-10.54275\\-163.1484\\-107\\-10.03928\\-167.0547\\-107\\-9.817295\\-170.9609\\-107\\-9.311124\\-178.7734\\-107\\-8.948038\\-182.6797\\-107\\-8.708294\\-184.6328\\-107\\-8.458647\\-188.5391\\-107\\-8.559718\\-190.4922\\-107\\-8.766352\\-192.4453\\-107\\-9.126045\\-194.3984\\-107\\-9.274194\\-196.3516\\-107\\-9.216707\\-200.2578\\-107\\-9.092134\\-202.2109\\-107\\-8.663293\\-204.1641\\-107\\-8.336829\\-206.1172\\-107\\-7.925638\\-210.0234\\-107\\-7.431239\\-213.9297\\-107\\-7.467049\\-215.8828\\-107\\-7.688959\\-219.7891\\-107\\-8.128447\\-223.6953\\-107\\-8.481019\\-225.6484\\-107\\-9.475447\\-229.5547\\-107\\-10.10665\\-233.4609\\-107\\-11.39904\\-237.3672\\-107\\-11.95427\\-241.2734\\-107\\-13.26712\\-245.1797\\-107\\-14.14461\\-249.0859\\-107\\-15.06255\\-251.0391\\-107\\-15.76803\\-252.9922\\-107\\-17.51677\\-256.8984\\-107\\-18.21588\\-258.8516\\-107\\-19.2752\\-260.8047\\-107\\-19.81738\\-262.7578\\-107\\-20.8945\\-264.7109\\-107\\-21.7272\\-266.6641\\-107\\-22.99194\\-268.6172\\-107\\-23.89849\\-270.5703\\-107\\-25.21255\\-272.5234\\-107\\-25.95564\\-274.4766\\-107\\-27.27096\\-276.4297\\-107\\-28.32031\\-278.1895\\-107\\-29.73485\\-280.3359\\-107\\-32.75986\\-284.2422\\-107\\-34.07813\\-286.1953\\-107\\-36.13281\\-288.5099\\-107\\-40.03906\\-292.3802\\-107\\-42.15337\\-294.0078\\-107\\-45.89844\\-296.5976\\-107\\-47.85156\\-297.5979\\-107\\-49.80469\\-298.7745\\-107\\-53.71094\\-300.601\\-107\\-57.61719\\-301.6206\\-107\\-59.57031\\-302.2476\\-107\\-61.52344\\-302.5838\\-107\\-63.47656\\-302.7804\\-107\\-69.33594\\-303.1477\\-107\\-73.24219\\-303.1958\\-107\\-75.19531\\-303.1282\\-107\\-83.00781\\-302.689\\-107\\-84.96094\\-302.4817\\-107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "183" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "70" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-301.3989\\-107\\57.61719\\-300.697\\-107\\55.66406\\-300.1509\\-107\\53.71094\\-299.2258\\-107\\51.75781\\-298.5251\\-107\\49.80469\\-297.3674\\-107\\47.85156\\-296.6255\\-107\\45.89844\\-295.4388\\-107\\43.94531\\-294.5423\\-107\\41.99219\\-293.1491\\-107\\40.03906\\-291.5238\\-107\\36.13281\\-288.6577\\-107\\33.5126\\-286.1953\\-107\\30.08418\\-282.2891\\-107\\28.32031\\-280.0984\\-107\\25.72692\\-276.4297\\-107\\24.73719\\-274.4766\\-107\\24.41406\\-274.1042\\-107\\22.46094\\-270.865\\-107\\22.21853\\-270.5703\\-107\\21.29481\\-268.6172\\-107\\20.12392\\-266.6641\\-107\\18.88489\\-262.7578\\-107\\17.88737\\-260.8047\\-107\\17.42208\\-258.8516\\-107\\15.95909\\-254.9453\\-107\\15.06786\\-251.0391\\-107\\14.38578\\-249.0859\\-107\\14.00703\\-247.1328\\-107\\13.25969\\-241.2734\\-107\\12.49556\\-237.3672\\-107\\11.91518\\-233.4609\\-107\\11.61541\\-229.5547\\-107\\11.10026\\-225.6484\\-107\\10.34546\\-221.7422\\-107\\10.04249\\-217.8359\\-107\\9.296124\\-211.9766\\-107\\8.653626\\-210.0234\\-107\\8.236839\\-208.0703\\-107\\7.868948\\-204.1641\\-107\\7.789386\\-202.2109\\-107\\7.835614\\-198.3047\\-107\\8.006636\\-194.3984\\-107\\8.140042\\-186.5859\\-107\\8.112059\\-184.6328\\-107\\8.197021\\-182.6797\\-107\\8.507097\\-180.7266\\-107\\9.341033\\-176.8203\\-107\\9.812375\\-172.9141\\-107\\10.10742\\-170.9609\\-107\\10.55519\\-169.0078\\-107\\11.12608\\-167.0547\\-107\\12.28956\\-161.1953\\-107\\12.94513\\-159.2422\\-107\\13.98625\\-155.3359\\-107\\16.3762\\-149.4766\\-107\\17.47037\\-147.5234\\-107\\18.27072\\-145.5703\\-107\\19.4556\\-143.6172\\-107\\20.20418\\-141.6641\\-107\\21.31899\\-139.7109\\-107\\22.25494\\-137.7578\\-107\\23.37957\\-135.8047\\-107\\24.34748\\-133.8516\\-107\\25.56529\\-131.8984\\-107\\26.36719\\-130.3076\\-107\\28.32031\\-127.2907\\-107\\30.27344\\-124.5045\\-107\\32.00605\\-122.1328\\-107\\34.17969\\-119.5245\\-107\\36.13281\\-117.3983\\-107\\37.27214\\-116.2734\\-107\\40.03906\\-113.8493\\-107\\41.99219\\-112.2848\\-107\\43.94531\\-110.9865\\-107\\45.89844\\-109.8965\\-107\\49.80469\\-108.032\\-107\\53.53104\\-106.5078\\-107\\55.66406\\-105.793\\-107\\57.61719\\-105.3668\\-107\\61.52344\\-104.3673\\-107\\65.42969\\-103.6942\\-107\\69.33594\\-103.2559\\-107\\71.28906\\-102.9128\\-107\\75.19531\\-102.4759\\-107\\79.10156\\-102.2731\\-107\\86.91406\\-102.5352\\-107\\90.82031\\-103.0077\\-107\\96.67969\\-103.594\\-107\\98.63281\\-104.0086\\-107\\102.1396\\-104.5547\\-107\\104.4922\\-105.1458\\-107\\106.4453\\-105.9015\\-107\\108.3984\\-106.3323\\-107\\110.3516\\-107.2031\\-107\\112.3047\\-107.7394\\-107\\114.2578\\-108.6922\\-107\\116.2109\\-109.3536\\-107\\118.1641\\-110.2081\\-107\\120.1172\\-111.3281\\-107\\122.0703\\-112.5771\\-107\\124.0234\\-113.648\\-107\\127.9833\\-116.2734\\-107\\129.8828\\-117.7508\\-107\\133.7891\\-121.25\\-107\\135.7422\\-123.1014\\-107\\138.5079\\-126.0391\\-107\\140.4973\\-127.9922\\-107\\142.2203\\-129.9453\\-107\\143.7927\\-131.8984\\-107\\145.208\\-133.8516\\-107\\148.3652\\-137.7578\\-107\\149.7857\\-139.7109\\-107\\151.3672\\-142.0528\\-107\\153.8928\\-145.5703\\-107\\155.2734\\-147.8336\\-107\\157.2266\\-151.4409\\-107\\158.2204\\-153.3828\\-107\\159.3791\\-155.3359\\-107\\160.2019\\-157.2891\\-107\\161.1328\\-159.2574\\-107\\161.908\\-161.1953\\-107\\162.3182\\-163.1484\\-107\\163.7198\\-167.0547\\-107\\164.6369\\-170.9609\\-107\\165.3539\\-172.9141\\-107\\165.7638\\-174.8672\\-107\\166.3925\\-178.7734\\-107\\167.1143\\-182.6797\\-107\\167.5408\\-186.5859\\-107\\167.8416\\-192.4453\\-107\\167.9397\\-196.3516\\-107\\167.9804\\-200.2578\\-107\\167.9002\\-208.0703\\-107\\167.6099\\-213.9297\\-107\\167.1678\\-217.8359\\-107\\166.425\\-221.7422\\-107\\165.7953\\-225.6484\\-107\\165.4161\\-227.6016\\-107\\164.655\\-229.5547\\-107\\164.1452\\-231.5078\\-107\\163.7389\\-233.4609\\-107\\162.9697\\-235.4141\\-107\\162.3277\\-237.3672\\-107\\161.8863\\-239.3203\\-107\\161.1328\\-241.1423\\-107\\159.3436\\-245.1797\\-107\\158.2135\\-247.1328\\-107\\156.1886\\-251.0391\\-107\\154.0064\\-254.9453\\-107\\151.0808\\-258.8516\\-107\\149.9256\\-260.8047\\-107\\148.431\\-262.7578\\-107\\141.9096\\-270.5703\\-107\\139.6484\\-273.0508\\-107\\137.6953\\-275.085\\-107\\134.4286\\-278.3828\\-107\\131.8359\\-280.7872\\-107\\129.8828\\-282.4263\\-107\\124.0234\\-287.135\\-107\\122.0703\\-288.6051\\-107\\120.1172\\-289.5482\\-107\\119.4196\\-290.1016\\-107\\116.2109\\-292.2417\\-107\\114.2578\\-293.2754\\-107\\112.3047\\-294.4631\\-107\\110.3516\\-295.1542\\-107\\108.3984\\-296.0906\\-107\\106.4453\\-296.8539\\-107\\104.4922\\-297.5039\\-107\\102.5391\\-298.4823\\-107\\100.5859\\-299.0338\\-107\\96.67969\\-300.3916\\-107\\94.72656\\-300.7708\\-107\\90.82031\\-301.3619\\-107\\86.91406\\-302.1735\\-107\\84.96094\\-302.4012\\-107\\81.05469\\-302.6466\\-107\\77.14844\\-302.7469\\-107\\73.24219\\-302.7411\\-107\\69.33594\\-302.6028\\-107\\67.38281\\-302.4693\\-107\\65.42969\\-302.2369\\-107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "199" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "71" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-302.0754\\-105\\-88.86719\\-301.5403\\-105\\-94.72656\\-300.4176\\-105\\-98.63281\\-298.994\\-105\\-100.5859\\-298.4194\\-105\\-102.5391\\-297.3674\\-105\\-104.4922\\-296.7615\\-105\\-106.4453\\-295.7731\\-105\\-108.3984\\-295.0203\\-105\\-110.3516\\-294.1528\\-105\\-112.3047\\-293.0152\\-105\\-114.2578\\-291.7002\\-105\\-116.2109\\-290.6146\\-105\\-118.1641\\-289.2384\\-105\\-122.0703\\-286.6435\\-105\\-124.7665\\-284.2422\\-105\\-127.077\\-282.2891\\-105\\-129.8828\\-279.7247\\-105\\-131.1604\\-278.3828\\-105\\-133.1962\\-276.4297\\-105\\-135.7422\\-273.8586\\-105\\-136.7843\\-272.5234\\-105\\-140.3359\\-268.6172\\-105\\-141.9149\\-266.6641\\-105\\-143.0226\\-264.7109\\-105\\-146.0113\\-260.8047\\-105\\-149.7129\\-254.9453\\-105\\-150.6011\\-252.9922\\-105\\-151.9138\\-251.0391\\-105\\-152.8611\\-249.0859\\-105\\-154.0456\\-247.1328\\-105\\-154.8357\\-245.1797\\-105\\-155.9095\\-243.2266\\-105\\-156.4822\\-241.2734\\-105\\-157.5346\\-239.3203\\-105\\-158.2707\\-237.3672\\-105\\-159.2744\\-235.4141\\-105\\-160.8163\\-231.5078\\-105\\-161.744\\-229.5547\\-105\\-162.7302\\-225.6484\\-105\\-163.6224\\-223.6953\\-105\\-164.6295\\-219.7891\\-105\\-165.4455\\-217.8359\\-105\\-166.3319\\-213.9297\\-105\\-167.3891\\-210.0234\\-105\\-167.6839\\-208.0703\\-105\\-168.219\\-202.2109\\-105\\-168.4669\\-196.3516\\-105\\-168.4538\\-192.4453\\-105\\-168.1974\\-188.5391\\-105\\-167.8401\\-184.6328\\-105\\-167.601\\-182.6797\\-105\\-167.2585\\-180.7266\\-105\\-166.6268\\-178.7734\\-105\\-165.7508\\-174.8672\\-105\\-165.1345\\-172.9141\\-105\\-164.3415\\-170.9609\\-105\\-163.7978\\-169.0078\\-105\\-162.2011\\-165.1016\\-105\\-161.6175\\-163.1484\\-105\\-160.623\\-161.1953\\-105\\-159.8238\\-159.2422\\-105\\-158.8058\\-157.2891\\-105\\-157.2266\\-153.8847\\-105\\-154.064\\-147.5234\\-105\\-152.5787\\-145.5703\\-105\\-151.6978\\-143.6172\\-105\\-150.1728\\-141.6641\\-105\\-148.8058\\-139.7109\\-105\\-147.6474\\-137.7578\\-105\\-144.2683\\-133.8516\\-105\\-143.5547\\-132.7471\\-105\\-141.1379\\-129.9453\\-105\\-139.6484\\-128.3597\\-105\\-133.3537\\-122.1328\\-105\\-130.9799\\-120.1797\\-105\\-129.8828\\-119.4201\\-105\\-125.8938\\-116.2734\\-105\\-124.0234\\-115.3461\\-105\\-122.0703\\-113.8953\\-105\\-120.1172\\-113.1214\\-105\\-118.1641\\-111.8038\\-105\\-116.2109\\-110.9537\\-105\\-114.2578\\-109.8193\\-105\\-112.3047\\-108.8686\\-105\\-108.3984\\-107.4504\\-105\\-106.4453\\-107.0304\\-105\\-104.4922\\-106.0953\\-105\\-100.5859\\-105.5381\\-105\\-98.63281\\-104.457\\-105\\-96.67969\\-104.0778\\-105\\-92.77344\\-103.7147\\-105\\-90.82031\\-103.1583\\-105\\-84.96094\\-102.5756\\-105\\-83.00781\\-102.5251\\-105\\-79.10156\\-102.276\\-105\\-75.19531\\-102.0995\\-105\\-73.24219\\-101.6083\\-105\\-71.28906\\-101.5213\\-105\\-67.38281\\-101.6507\\-105\\-63.47656\\-102.2007\\-105\\-59.57031\\-102.3998\\-105\\-57.61719\\-102.558\\-105\\-53.71094\\-103.0853\\-105\\-51.75781\\-103.6229\\-105\\-47.85156\\-104.2981\\-105\\-45.89844\\-105.1286\\-105\\-43.94531\\-105.6989\\-105\\-41.99219\\-106.0821\\-105\\-40.03906\\-107.1672\\-105\\-38.08594\\-107.9041\\-105\\-36.13281\\-108.7699\\-105\\-33.37191\\-110.4141\\-105\\-32.22656\\-111.2424\\-105\\-30.27344\\-112.9188\\-105\\-28.32031\\-113.9846\\-105\\-26.05509\\-116.2734\\-105\\-24.92474\\-118.2266\\-105\\-23.18464\\-120.1797\\-105\\-21.56929\\-122.1328\\-105\\-19.54713\\-126.0391\\-105\\-18.55469\\-128.1143\\-105\\-17.83258\\-129.9453\\-105\\-17.30725\\-131.8984\\-105\\-16.11328\\-133.8516\\-105\\-14.84721\\-137.7578\\-105\\-14.32554\\-139.7109\\-105\\-13.48692\\-143.6172\\-105\\-13.21051\\-145.5703\\-105\\-12.60653\\-147.5234\\-105\\-12.11958\\-149.4766\\-105\\-11.45924\\-153.3828\\-105\\-10.44339\\-157.2891\\-105\\-9.790193\\-161.1953\\-105\\-9.036959\\-167.0547\\-105\\-8.797269\\-170.9609\\-105\\-8.526142\\-172.9141\\-105\\-8.388601\\-174.8672\\-105\\-7.961107\\-178.7734\\-105\\-7.680334\\-180.7266\\-105\\-7.261619\\-184.6328\\-105\\-7.038288\\-188.5391\\-105\\-7.138412\\-190.4922\\-105\\-7.336528\\-192.4453\\-105\\-7.728577\\-194.3984\\-105\\-7.863514\\-196.3516\\-105\\-7.990057\\-200.2578\\-105\\-7.867908\\-202.2109\\-105\\-7.548167\\-204.1641\\-105\\-7.120768\\-208.0703\\-105\\-6.826073\\-210.0234\\-105\\-6.335347\\-211.9766\\-105\\-6.177819\\-215.8828\\-105\\-6.59375\\-219.7891\\-105\\-7.116037\\-221.7422\\-105\\-8.181841\\-227.6016\\-105\\-8.662333\\-229.5547\\-105\\-9.438119\\-231.5078\\-105\\-9.702958\\-233.4609\\-105\\-10.10388\\-235.4141\\-105\\-11.40671\\-239.3203\\-105\\-12.16554\\-243.2266\\-105\\-12.98757\\-245.1797\\-105\\-13.5263\\-247.1328\\-105\\-13.95597\\-249.0859\\-105\\-15.58494\\-252.9922\\-105\\-16.2976\\-254.9453\\-105\\-17.38601\\-256.8984\\-105\\-18.03024\\-258.8516\\-105\\-19.15322\\-260.8047\\-105\\-19.72779\\-262.7578\\-105\\-20.75549\\-264.7109\\-105\\-21.6306\\-266.6641\\-105\\-22.85807\\-268.6172\\-105\\-23.79209\\-270.5703\\-105\\-25.11503\\-272.5234\\-105\\-25.88232\\-274.4766\\-105\\-27.19116\\-276.4297\\-105\\-28.32031\\-278.3314\\-105\\-29.67113\\-280.3359\\-105\\-32.73216\\-284.2422\\-105\\-34.04897\\-286.1953\\-105\\-36.13281\\-288.5194\\-105\\-38.08594\\-290.375\\-105\\-40.03906\\-292.3307\\-105\\-42.2247\\-294.0078\\-105\\-45.89844\\-296.5306\\-105\\-47.85156\\-297.4852\\-105\\-49.80469\\-298.6878\\-105\\-53.71094\\-300.532\\-105\\-57.61719\\-301.4901\\-105\\-59.57031\\-302.1529\\-105\\-61.52344\\-302.51\\-105\\-63.47656\\-302.7299\\-105\\-69.33594\\-303.0607\\-105\\-71.28906\\-303.1128\\-105\\-75.19531\\-303.0607\\-105\\-81.05469\\-302.7804\\-105\\-84.96094\\-302.4012\\-105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "183" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "72" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "61.52344\\-301.3752\\-105\\57.61719\\-300.6678\\-105\\55.66406\\-300.1281\\-105\\53.71094\\-299.199\\-105\\51.75781\\-298.4977\\-105\\49.80469\\-297.3414\\-105\\47.85156\\-296.5942\\-105\\45.89844\\-295.4116\\-105\\43.94531\\-294.5326\\-105\\41.99219\\-293.1379\\-105\\40.03906\\-291.5273\\-105\\36.13281\\-288.6817\\-105\\33.49474\\-286.1953\\-105\\30.05725\\-282.2891\\-105\\28.32031\\-280.1299\\-105\\25.72692\\-276.4297\\-105\\24.75155\\-274.4766\\-105\\24.41406\\-274.0876\\-105\\22.46094\\-270.8958\\-105\\22.19273\\-270.5703\\-105\\21.28791\\-268.6172\\-105\\20.11317\\-266.6641\\-105\\18.84694\\-262.7578\\-105\\17.88027\\-260.8047\\-105\\17.41201\\-258.8516\\-105\\15.93206\\-254.9453\\-105\\15.01225\\-251.0391\\-105\\14.33831\\-249.0859\\-105\\13.7006\\-245.1797\\-105\\13.21572\\-241.2734\\-105\\12.39102\\-237.3672\\-105\\11.82548\\-233.4609\\-105\\11.48961\\-229.5547\\-105\\11.21779\\-227.6016\\-105\\10.71948\\-225.6484\\-105\\10.32366\\-223.6953\\-105\\10.06171\\-221.7422\\-105\\9.718372\\-217.8359\\-105\\9.41155\\-215.8828\\-105\\8.42712\\-211.9766\\-105\\8.032822\\-210.0234\\-105\\7.213246\\-204.1641\\-105\\6.810462\\-202.2109\\-105\\6.587795\\-200.2578\\-105\\6.534755\\-196.3516\\-105\\6.962217\\-194.3984\\-105\\7.012729\\-188.5391\\-105\\7.11158\\-184.6328\\-105\\7.475011\\-180.7266\\-105\\8.506945\\-174.8672\\-105\\9.706439\\-169.0078\\-105\\10.31195\\-165.1016\\-105\\10.91028\\-163.1484\\-105\\11.76314\\-159.2422\\-105\\12.08044\\-157.2891\\-105\\13.39814\\-153.3828\\-105\\13.94024\\-151.4297\\-105\\14.74699\\-149.4766\\-105\\16.25279\\-145.5703\\-105\\17.53065\\-143.6172\\-105\\18.11975\\-141.6641\\-105\\19.2627\\-139.7109\\-105\\19.84156\\-137.7578\\-105\\20.90424\\-135.8047\\-105\\22.46094\\-132.3664\\-105\\23.99327\\-129.9453\\-105\\25.37448\\-127.9922\\-105\\26.35634\\-126.0391\\-105\\27.47881\\-124.0859\\-105\\28.90413\\-122.1328\\-105\\30.65321\\-120.1797\\-105\\31.87779\\-118.2266\\-105\\33.5323\\-116.2734\\-105\\35.40039\\-114.3203\\-105\\38.08594\\-111.8628\\-105\\40.03906\\-110.2374\\-105\\43.94531\\-107.7722\\-105\\47.85156\\-105.8932\\-105\\50.37435\\-104.5547\\-105\\55.66406\\-102.8539\\-105\\61.52344\\-101.5197\\-105\\65.42969\\-101.113\\-105\\67.38281\\-100.4755\\-105\\69.33594\\-100.2259\\-105\\71.28906\\-100.0766\\-105\\75.19531\\-99.92843\\-105\\81.05469\\-99.92416\\-105\\86.91406\\-100.1602\\-105\\88.86719\\-100.3886\\-105\\90.82031\\-100.9769\\-105\\96.67969\\-101.4748\\-105\\98.63281\\-101.9727\\-105\\102.5391\\-102.6309\\-105\\104.4922\\-103.1558\\-105\\106.4453\\-103.8562\\-105\\108.3984\\-104.3331\\-105\\110.3516\\-105.2391\\-105\\112.3047\\-105.83\\-105\\114.2578\\-106.9725\\-105\\116.2109\\-107.4766\\-105\\120.1172\\-109.2015\\-105\\122.0703\\-110.551\\-105\\125.105\\-112.3672\\-105\\127.9297\\-114.386\\-105\\129.8828\\-115.5516\\-105\\133.7891\\-119.2557\\-105\\134.8246\\-120.1797\\-105\\137.6953\\-123.0861\\-105\\139.6484\\-125.1989\\-105\\140.5481\\-126.0391\\-105\\143.5547\\-129.5409\\-105\\146.7056\\-133.8516\\-105\\148.2407\\-135.8047\\-105\\149.6761\\-137.7578\\-105\\150.871\\-139.7109\\-105\\151.3672\\-140.3201\\-105\\153.7095\\-143.6172\\-105\\154.7815\\-145.5703\\-105\\155.9855\\-147.5234\\-105\\156.8788\\-149.4766\\-105\\158.0043\\-151.4297\\-105\\159.9963\\-155.3359\\-105\\160.7436\\-157.2891\\-105\\161.7161\\-159.2422\\-105\\162.6912\\-163.1484\\-105\\163.5164\\-165.1016\\-105\\164.3937\\-169.0078\\-105\\165.6042\\-172.9141\\-105\\166.5315\\-178.7734\\-105\\167.2054\\-182.6797\\-105\\167.5936\\-186.5859\\-105\\167.8467\\-192.4453\\-105\\167.9513\\-196.3516\\-105\\167.9746\\-202.2109\\-105\\167.8763\\-208.0703\\-105\\167.7217\\-211.9766\\-105\\167.5936\\-213.9297\\-105\\167.155\\-217.8359\\-105\\166.4086\\-221.7422\\-105\\165.7914\\-225.6484\\-105\\165.3856\\-227.6016\\-105\\164.6343\\-229.5547\\-105\\163.7198\\-233.4609\\-105\\162.9257\\-235.4141\\-105\\162.3035\\-237.3672\\-105\\161.8743\\-239.3203\\-105\\159.2751\\-245.1797\\-105\\157.1075\\-249.0859\\-105\\156.164\\-251.0391\\-105\\154.9408\\-252.9922\\-105\\153.9566\\-254.9453\\-105\\151.0036\\-258.8516\\-105\\149.8748\\-260.8047\\-105\\148.372\\-262.7578\\-105\\145.0544\\-266.6641\\-105\\141.8142\\-270.5703\\-105\\140.0428\\-272.5234\\-105\\135.7422\\-276.7968\\-105\\134.2209\\-278.3828\\-105\\131.8359\\-280.671\\-105\\125.9766\\-285.4081\\-105\\124.0234\\-287.049\\-105\\122.0703\\-288.4814\\-105\\120.1172\\-289.436\\-105\\118.1641\\-290.8497\\-105\\116.2109\\-292.0623\\-105\\112.8027\\-294.0078\\-105\\112.3047\\-294.3586\\-105\\110.3516\\-295.1003\\-105\\106.4453\\-296.8154\\-105\\104.4922\\-297.4289\\-105\\102.5391\\-298.4194\\-105\\100.5859\\-298.9716\\-105\\96.67969\\-300.3401\\-105\\94.72656\\-300.7147\\-105\\90.82031\\-301.2964\\-105\\86.91406\\-302.088\\-105\\83.00781\\-302.5179\\-105\\81.05469\\-302.6214\\-105\\77.14844\\-302.7239\\-105\\73.24219\\-302.7178\\-105\\69.33594\\-302.5838\\-105\\65.42969\\-302.2123\\-105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "203" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "73" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-301.9211\\-103\\-88.86719\\-301.4095\\-103\\-92.77344\\-300.7309\\-103\\-94.72656\\-300.3156\\-103\\-96.67969\\-299.5329\\-103\\-100.5859\\-298.281\\-103\\-102.5391\\-297.238\\-103\\-104.4922\\-296.6416\\-103\\-106.4453\\-295.6026\\-103\\-108.3984\\-294.9245\\-103\\-110.2661\\-294.0078\\-103\\-112.3047\\-292.8848\\-103\\-114.2578\\-291.5115\\-103\\-116.2109\\-290.4466\\-103\\-120.1172\\-287.7137\\-103\\-122.0703\\-286.4196\\-103\\-127.9297\\-281.3851\\-103\\-129.8828\\-279.4904\\-103\\-130.9079\\-278.3828\\-103\\-134.9542\\-274.4766\\-103\\-137.6953\\-271.3725\\-103\\-140.1961\\-268.6172\\-103\\-141.7488\\-266.6641\\-103\\-142.941\\-264.7109\\-103\\-145.8748\\-260.8047\\-103\\-148.4066\\-256.8984\\-103\\-149.6201\\-254.9453\\-103\\-150.5228\\-252.9922\\-103\\-151.8331\\-251.0391\\-103\\-152.7882\\-249.0859\\-103\\-153.9964\\-247.1328\\-103\\-154.7819\\-245.1797\\-103\\-155.8568\\-243.2266\\-103\\-156.4584\\-241.2734\\-103\\-157.4758\\-239.3203\\-103\\-158.2395\\-237.3672\\-103\\-159.2319\\-235.4141\\-103\\-160.0753\\-233.4609\\-103\\-160.8028\\-231.5078\\-103\\-161.7314\\-229.5547\\-103\\-162.7162\\-225.6484\\-103\\-163.6258\\-223.6953\\-103\\-164.6497\\-219.7891\\-103\\-165.4738\\-217.8359\\-103\\-166.3468\\-213.9297\\-103\\-167.4241\\-210.0234\\-103\\-167.7029\\-208.0703\\-103\\-168.2424\\-202.2109\\-103\\-168.5452\\-196.3516\\-103\\-168.5808\\-192.4453\\-103\\-168.2068\\-186.5859\\-103\\-167.8351\\-182.6797\\-103\\-167.5842\\-180.7266\\-103\\-166.6243\\-176.8203\\-103\\-165.7855\\-172.9141\\-103\\-165.1898\\-170.9609\\-103\\-164.4153\\-169.0078\\-103\\-163.8754\\-167.0547\\-103\\-163.1859\\-165.1016\\-103\\-162.3913\\-163.1484\\-103\\-161.8137\\-161.1953\\-103\\-160.8826\\-159.2422\\-103\\-159.2751\\-155.3359\\-103\\-158.2227\\-153.3828\\-103\\-156.4152\\-149.4766\\-103\\-155.4606\\-147.5234\\-103\\-153.3441\\-143.6172\\-103\\-152.07\\-141.6641\\-103\\-150.665\\-139.7109\\-103\\-149.4774\\-137.7578\\-103\\-148.0223\\-135.8047\\-103\\-146.4608\\-133.8516\\-103\\-145.5078\\-132.5239\\-103\\-143.5547\\-130.181\\-103\\-141.6016\\-127.9808\\-103\\-135.8716\\-122.1328\\-103\\-133.6844\\-120.1797\\-103\\-129.8828\\-116.9278\\-103\\-125.9766\\-114.0984\\-103\\-122.0703\\-111.7189\\-103\\-120.1172\\-110.9232\\-103\\-118.1641\\-109.5084\\-103\\-116.2109\\-108.5525\\-103\\-114.2578\\-107.349\\-103\\-112.3047\\-106.7715\\-103\\-108.3984\\-105.3545\\-103\\-106.4453\\-104.9364\\-103\\-104.4922\\-103.9621\\-103\\-102.5391\\-103.5858\\-103\\-100.5859\\-103.3396\\-103\\-98.63281\\-102.3313\\-103\\-96.67969\\-102.0048\\-103\\-92.77344\\-101.6776\\-103\\-90.82031\\-101.1675\\-103\\-84.96094\\-100.7182\\-103\\-79.10156\\-100.3885\\-103\\-75.19531\\-100.2832\\-103\\-73.24219\\-100.0221\\-103\\-69.33594\\-99.66373\\-103\\-67.38281\\-99.97746\\-103\\-63.47656\\-100.3229\\-103\\-61.52344\\-100.375\\-103\\-57.61719\\-100.6052\\-103\\-53.71094\\-101.0591\\-103\\-49.80469\\-101.8808\\-103\\-47.85156\\-102.1592\\-103\\-43.94531\\-103.4828\\-103\\-41.99219\\-103.9228\\-103\\-40.03906\\-105.03\\-103\\-38.08594\\-105.5934\\-103\\-36.13281\\-106.6003\\-103\\-34.17969\\-107.4844\\-103\\-32.22656\\-108.7832\\-103\\-30.27344\\-109.8496\\-103\\-27.25395\\-112.3672\\-103\\-24.41406\\-115.2636\\-103\\-22.03747\\-118.2266\\-103\\-21.0177\\-120.1797\\-103\\-19.77539\\-122.1328\\-103\\-17.68578\\-126.0391\\-103\\-16.8793\\-127.9922\\-103\\-15.8729\\-129.9453\\-103\\-15.28168\\-131.8984\\-103\\-14.31754\\-133.8516\\-103\\-13.9248\\-135.8047\\-103\\-13.29566\\-137.7578\\-103\\-12.50155\\-141.6641\\-103\\-11.8656\\-143.6172\\-103\\-11.29482\\-147.5234\\-103\\-10.64601\\-149.4766\\-103\\-10.18732\\-151.4297\\-103\\-9.651916\\-155.3359\\-103\\-8.375\\-161.1953\\-103\\-8.08071\\-163.1484\\-103\\-7.903181\\-165.1016\\-103\\-7.58886\\-167.0547\\-103\\-7.252038\\-170.9609\\-103\\-6.835938\\-174.7858\\-103\\-6.51826\\-176.8203\\-103\\-5.489309\\-180.7266\\-103\\-5.151099\\-182.6797\\-103\\-4.185268\\-184.6328\\-103\\-3.021816\\-186.5859\\-103\\-2.08554\\-188.5391\\-103\\-2.166193\\-190.4922\\-103\\-3.714425\\-192.4453\\-103\\-4.882813\\-193.7036\\-103\\-5.312965\\-194.3984\\-103\\-5.581943\\-196.3516\\-103\\-5.683813\\-198.3047\\-103\\-6.081883\\-200.2578\\-103\\-5.334342\\-204.1641\\-103\\-4.507212\\-206.1172\\-103\\-4.236356\\-208.0703\\-103\\-4.167424\\-211.9766\\-103\\-4.9467\\-213.9297\\-103\\-4.664522\\-215.8828\\-103\\-5.18645\\-217.8359\\-103\\-5.190738\\-219.7891\\-103\\-5.389519\\-221.7422\\-103\\-6.835938\\-225.7705\\-103\\-8.959221\\-233.4609\\-103\\-9.582876\\-235.4141\\-103\\-10.07045\\-237.3672\\-103\\-11.47461\\-241.2734\\-103\\-11.9015\\-243.2266\\-103\\-12.52254\\-245.1797\\-103\\-13.33165\\-247.1328\\-103\\-13.80718\\-249.0859\\-103\\-14.44172\\-251.0391\\-103\\-15.3902\\-252.9922\\-103\\-16.07354\\-254.9453\\-103\\-17.2083\\-256.8984\\-103\\-17.8833\\-258.8516\\-103\\-18.98193\\-260.8047\\-103\\-19.63373\\-262.7578\\-103\\-21.52661\\-266.6641\\-103\\-22.68191\\-268.6172\\-103\\-23.6942\\-270.5703\\-103\\-25.00498\\-272.5234\\-103\\-25.79864\\-274.4766\\-103\\-27.09173\\-276.4297\\-103\\-28.2219\\-278.3828\\-103\\-29.61658\\-280.3359\\-103\\-32.69392\\-284.2422\\-103\\-34.01947\\-286.1953\\-103\\-36.13281\\-288.5194\\-103\\-40.03906\\-292.2773\\-103\\-42.29621\\-294.0078\\-103\\-45.89844\\-296.4652\\-103\\-47.85156\\-297.3785\\-103\\-49.80469\\-298.617\\-103\\-51.75781\\-299.4701\\-103\\-53.71094\\-300.4434\\-103\\-57.61719\\-301.3931\\-103\\-59.57031\\-302.0216\\-103\\-61.52344\\-302.4315\\-103\\-63.47656\\-302.6648\\-103\\-67.38281\\-302.9048\\-103\\-71.28906\\-303.0424\\-103\\-75.19531\\-302.9933\\-103\\-81.05469\\-302.7239\\-103\\-84.96094\\-302.3152\\-103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "193" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "74" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "65.42969\\-302.1874\\-103\\61.52344\\-301.355\\-103\\57.61719\\-300.645\\-103\\55.66406\\-300.0926\\-103\\53.71094\\-299.1514\\-103\\51.75781\\-298.4612\\-103\\49.80469\\-297.2926\\-103\\47.85156\\-296.5824\\-103\\45.89844\\-295.3924\\-103\\43.94531\\-294.5326\\-103\\41.99219\\-293.1429\\-103\\40.03906\\-291.5664\\-103\\36.13281\\-288.6716\\-103\\33.48599\\-286.1953\\-103\\30.05559\\-282.2891\\-103\\28.32031\\-280.1461\\-103\\25.73568\\-276.4297\\-103\\24.72744\\-274.4766\\-103\\24.41406\\-274.1114\\-103\\22.46094\\-270.865\\-103\\22.2168\\-270.5703\\-103\\21.2693\\-268.6172\\-103\\20.0998\\-266.6641\\-103\\18.80787\\-262.7578\\-103\\17.85942\\-260.8047\\-103\\17.37767\\-258.8516\\-103\\15.90545\\-254.9453\\-103\\15.4862\\-252.9922\\-103\\14.93217\\-251.0391\\-103\\14.27185\\-249.0859\\-103\\13.65444\\-245.1797\\-103\\13.11671\\-241.2734\\-103\\12.18776\\-237.3672\\-103\\11.2069\\-229.5547\\-103\\10.20479\\-225.6484\\-103\\9.609375\\-221.7422\\-103\\8.932898\\-217.8359\\-103\\7.445371\\-211.9766\\-103\\6.835938\\-209.1515\\-103\\5.46875\\-206.1172\\-103\\5.190642\\-204.1641\\-103\\4.913015\\-200.2578\\-103\\4.171489\\-198.3047\\-103\\4.161488\\-194.3984\\-103\\3.776042\\-190.4922\\-103\\3.802083\\-188.5391\\-103\\4.310826\\-186.5859\\-103\\5.230243\\-184.6328\\-103\\5.73088\\-180.7266\\-103\\7.012729\\-176.8203\\-103\\7.750605\\-172.9141\\-103\\8.042689\\-170.9609\\-103\\9.137835\\-165.1016\\-103\\9.601727\\-163.1484\\-103\\10.10895\\-159.2422\\-103\\10.55582\\-157.2891\\-103\\11.29002\\-155.3359\\-103\\11.67111\\-153.3828\\-103\\13.04155\\-149.4766\\-103\\13.58981\\-147.5234\\-103\\14.30622\\-145.5703\\-103\\15.3021\\-143.6172\\-103\\15.87314\\-141.6641\\-103\\16.81298\\-139.7109\\-103\\17.59541\\-137.7578\\-103\\18.68693\\-135.8047\\-103\\19.40679\\-133.8516\\-103\\20.28761\\-131.8984\\-103\\23.10902\\-127.9922\\-103\\23.61591\\-126.0391\\-103\\24.41406\\-124.7215\\-103\\26.16955\\-122.1328\\-103\\27.29885\\-120.1797\\-103\\28.94737\\-118.2266\\-103\\30.05255\\-116.2734\\-103\\31.96539\\-114.3203\\-103\\33.73579\\-112.3672\\-103\\36.13281\\-110.1275\\-103\\38.08594\\-108.8841\\-103\\40.03906\\-107.31\\-103\\41.99219\\-106.3339\\-103\\44.64518\\-104.5547\\-103\\45.89844\\-103.8175\\-103\\48.39124\\-102.6016\\-103\\53.71094\\-100.813\\-103\\55.66406\\-100.3191\\-103\\57.61719\\-99.65215\\-103\\63.47656\\-98.75018\\-103\\65.42969\\-98.098\\-103\\67.38281\\-97.93377\\-103\\71.28906\\-97.72717\\-103\\75.19531\\-97.6531\\-103\\79.10156\\-97.66272\\-103\\84.96094\\-97.87754\\-103\\86.91406\\-98.047\\-103\\88.86719\\-98.31647\\-103\\90.82031\\-98.92564\\-103\\96.67969\\-99.55698\\-103\\98.63281\\-100.1025\\-103\\102.5391\\-100.8788\\-103\\104.4922\\-101.5258\\-103\\108.3984\\-102.4731\\-103\\110.3516\\-103.3438\\-103\\112.3047\\-103.9214\\-103\\114.2578\\-105.047\\-103\\116.2109\\-105.7678\\-103\\120.1172\\-107.5712\\-103\\124.0234\\-109.6668\\-103\\127.9297\\-112.4725\\-103\\129.8828\\-113.6552\\-103\\131.8359\\-115.3049\\-103\\134.8714\\-118.2266\\-103\\137.6953\\-121.0667\\-103\\140.6101\\-124.0859\\-103\\142.305\\-126.0391\\-103\\143.8469\\-127.9922\\-103\\144.9677\\-129.9453\\-103\\146.6545\\-131.8984\\-103\\148.1596\\-133.8516\\-103\\150.694\\-137.7578\\-103\\151.3672\\-138.6377\\-103\\153.4575\\-141.6641\\-103\\154.541\\-143.6172\\-103\\155.7368\\-145.5703\\-103\\156.6007\\-147.5234\\-103\\157.7378\\-149.4766\\-103\\158.6003\\-151.4297\\-103\\159.7717\\-153.3828\\-103\\160.5086\\-155.3359\\-103\\161.4272\\-157.2891\\-103\\162.0544\\-159.2422\\-103\\162.4796\\-161.1953\\-103\\163.2287\\-163.1484\\-103\\163.8239\\-165.1016\\-103\\164.6786\\-169.0078\\-103\\165.3539\\-170.9609\\-103\\165.7676\\-172.9141\\-103\\166.6365\\-178.7734\\-103\\167.0298\\-180.7266\\-103\\167.4651\\-184.6328\\-103\\167.6255\\-186.5859\\-103\\167.7838\\-190.4922\\-103\\167.9513\\-196.3516\\-103\\167.9803\\-202.2109\\-103\\167.9345\\-206.1172\\-103\\167.7175\\-211.9766\\-103\\167.3991\\-215.8828\\-103\\167.1408\\-217.8359\\-103\\166.3847\\-221.7422\\-103\\165.7914\\-225.6484\\-103\\165.3752\\-227.6016\\-103\\164.6142\\-229.5547\\-103\\163.6963\\-233.4609\\-103\\162.8981\\-235.4141\\-103\\162.2891\\-237.3672\\-103\\161.8546\\-239.3203\\-103\\160.108\\-243.2266\\-103\\159.1797\\-245.1685\\-103\\157.2266\\-248.811\\-103\\156.1272\\-251.0391\\-103\\154.9037\\-252.9922\\-103\\153.9011\\-254.9453\\-103\\150.9586\\-258.8516\\-103\\149.8145\\-260.8047\\-103\\148.3253\\-262.7578\\-103\\144.9758\\-266.6641\\-103\\141.7092\\-270.5703\\-103\\139.9474\\-272.5234\\-103\\135.7422\\-276.7241\\-103\\134.1309\\-278.3828\\-103\\131.8359\\-280.5419\\-103\\127.9297\\-283.6973\\-103\\124.0234\\-286.9308\\-103\\122.0703\\-288.3714\\-103\\120.1172\\-289.3407\\-103\\118.1641\\-290.7467\\-103\\116.2109\\-291.8549\\-103\\114.2578\\-293.0909\\-103\\112.3047\\-294.2191\\-103\\108.3984\\-295.8292\\-103\\106.4453\\-296.7693\\-103\\104.4922\\-297.3586\\-103\\102.5391\\-298.3579\\-103\\98.63281\\-299.5329\\-103\\96.67969\\-300.2667\\-103\\94.72656\\-300.6518\\-103\\88.86719\\-301.5546\\-103\\86.91406\\-301.9931\\-103\\83.00781\\-302.4693\\-103\\79.10156\\-302.6712\\-103\\75.19531\\-302.7127\\-103\\71.28906\\-302.6466\\-103\\67.38281\\-302.4275\\-103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "376" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "75" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-302.2123\\-101\\-88.86719\\-301.3094\\-101\\-92.77344\\-300.6405\\-101\\-94.72656\\-300.197\\-101\\-96.67969\\-299.3972\\-101\\-98.63281\\-298.794\\-101\\-100.5859\\-298.0884\\-101\\-102.5391\\-297.1251\\-101\\-104.4922\\-296.511\\-101\\-106.4453\\-295.4336\\-101\\-108.3984\\-294.8388\\-101\\-110.3516\\-293.7218\\-101\\-112.3047\\-292.7338\\-101\\-114.2578\\-291.3408\\-101\\-116.2109\\-290.2117\\-101\\-118.1641\\-288.9792\\-101\\-121.9918\\-286.1953\\-101\\-125.9766\\-282.9245\\-101\\-127.9297\\-281.2461\\-101\\-130.8023\\-278.3828\\-101\\-134.833\\-274.4766\\-101\\-137.6953\\-271.214\\-101\\-140.0432\\-268.6172\\-101\\-141.6016\\-266.5566\\-101\\-142.832\\-264.7109\\-101\\-145.7195\\-260.8047\\-101\\-148.3255\\-256.8984\\-101\\-149.4867\\-254.9453\\-101\\-150.4417\\-252.9922\\-101\\-151.7241\\-251.0391\\-101\\-152.7039\\-249.0859\\-101\\-153.9217\\-247.1328\\-101\\-154.7127\\-245.1797\\-101\\-155.792\\-243.2266\\-101\\-156.4088\\-241.2734\\-101\\-157.4022\\-239.3203\\-101\\-158.2083\\-237.3672\\-101\\-160.0438\\-233.4609\\-101\\-160.7831\\-231.5078\\-101\\-161.6955\\-229.5547\\-101\\-162.705\\-225.6484\\-101\\-163.6258\\-223.6953\\-101\\-164.6343\\-219.7891\\-101\\-165.4948\\-217.8359\\-101\\-166.3543\\-213.9297\\-101\\-167.4366\\-210.0234\\-101\\-167.7072\\-208.0703\\-101\\-168.1125\\-204.1641\\-101\\-168.6292\\-196.3516\\-101\\-168.7177\\-192.4453\\-101\\-168.521\\-188.5391\\-101\\-168.0398\\-182.6797\\-101\\-167.567\\-178.7734\\-101\\-167.1959\\-176.8203\\-101\\-166.2414\\-172.9141\\-101\\-165.8149\\-170.9609\\-101\\-165.2883\\-169.0078\\-101\\-164.5117\\-167.0547\\-101\\-163.4206\\-163.1484\\-101\\-162.5665\\-161.1953\\-101\\-162.0002\\-159.2422\\-101\\-161.3139\\-157.2891\\-101\\-160.402\\-155.3359\\-101\\-159.7215\\-153.3828\\-101\\-158.6451\\-151.4297\\-101\\-157.2266\\-148.3985\\-101\\-156.7082\\-147.5234\\-101\\-155.8651\\-145.5703\\-101\\-154.6631\\-143.6172\\-101\\-153.7972\\-141.6641\\-101\\-152.3438\\-139.7109\\-101\\-151.3672\\-137.9787\\-101\\-147.4609\\-132.4361\\-101\\-145.5469\\-129.9453\\-101\\-143.7484\\-127.9922\\-101\\-142.2019\\-126.0391\\-101\\-140.4987\\-124.0859\\-101\\-137.6953\\-121.3249\\-101\\-133.7891\\-118.0056\\-101\\-131.8359\\-116.2473\\-101\\-129.3945\\-114.3203\\-101\\-127.9297\\-113.4744\\-101\\-125.9766\\-111.9586\\-101\\-123.6719\\-110.4141\\-101\\-122.0703\\-109.4901\\-101\\-120.1172\\-108.1354\\-101\\-118.1641\\-107.3662\\-101\\-116.2109\\-106.1897\\-101\\-114.2578\\-105.2454\\-101\\-112.3047\\-104.5311\\-101\\-108.3984\\-103.2129\\-101\\-106.4453\\-102.6472\\-101\\-104.4922\\-101.892\\-101\\-100.5859\\-101.3116\\-101\\-98.63281\\-100.3843\\-101\\-96.67969\\-100.1035\\-101\\-92.77344\\-99.75053\\-101\\-90.82031\\-99.29078\\-101\\-84.96094\\-98.65656\\-101\\-81.05469\\-98.4037\\-101\\-77.14844\\-98.27319\\-101\\-73.24219\\-98.22534\\-101\\-69.33594\\-97.89497\\-101\\-67.38281\\-98.18917\\-101\\-63.47656\\-98.24412\\-101\\-59.57031\\-98.39224\\-101\\-55.66406\\-98.74272\\-101\\-51.75781\\-99.35429\\-101\\-49.80469\\-99.83351\\-101\\-47.85156\\-100.1035\\-101\\-45.89844\\-100.4746\\-101\\-43.94531\\-101.3072\\-101\\-41.99219\\-101.8125\\-101\\-40.03906\\-102.4217\\-101\\-35.59352\\-104.5547\\-101\\-32.22656\\-106.2694\\-101\\-30.27344\\-107.5797\\-101\\-28.32031\\-109.0418\\-101\\-26.36719\\-110.3477\\-101\\-24.36756\\-112.3672\\-101\\-22.46094\\-114.6683\\-101\\-19.98853\\-118.2266\\-101\\-19.09543\\-120.1797\\-101\\-16.60156\\-124.4905\\-101\\-15.09734\\-127.9922\\-101\\-14.0144\\-129.9453\\-101\\-13.47229\\-131.8984\\-101\\-12.68682\\-133.8516\\-101\\-12.14014\\-135.8047\\-101\\-11.80474\\-137.7578\\-101\\-10.73431\\-141.6641\\-101\\-9.832974\\-145.5703\\-101\\-9.104331\\-149.4766\\-101\\-8.154654\\-153.3828\\-101\\-7.604721\\-157.2891\\-101\\-7.270813\\-159.2422\\-101\\-6.677351\\-161.1953\\-101\\-6.155095\\-165.1016\\-101\\-5.253544\\-169.0078\\-101\\-4.74462\\-170.9609\\-101\\-3.323228\\-174.8672\\-101\\-2.929688\\-175.6205\\-101\\-1.905488\\-176.8203\\-101\\-0.9765625\\-178.1805\\-101\\0.9765625\\-179.9534\\-101\\2.929688\\-179.6472\\-101\\3.193204\\-178.7734\\-101\\4.882813\\-175.7461\\-101\\5.850656\\-172.9141\\-101\\6.739161\\-169.0078\\-101\\7.401316\\-167.0547\\-101\\8.180589\\-159.2422\\-101\\8.732567\\-157.2891\\-101\\9.635925\\-153.3828\\-101\\10.74219\\-149.9291\\-101\\11.65911\\-147.5234\\-101\\12.69531\\-144.3556\\-101\\13.75325\\-141.6641\\-101\\14.43977\\-139.7109\\-101\\15.92043\\-135.8047\\-101\\16.89265\\-133.8516\\-101\\18.55469\\-130.148\\-101\\19.72472\\-127.9922\\-101\\20.8849\\-126.0391\\-101\\22.46094\\-123.1908\\-101\\24.30664\\-120.1797\\-101\\25.74728\\-118.2266\\-101\\26.36719\\-117.1782\\-101\\28.32031\\-114.4153\\-101\\30.27344\\-112.436\\-101\\32.22656\\-110.3421\\-101\\34.17969\\-108.451\\-101\\38.08594\\-105.5001\\-101\\42.58149\\-102.6016\\-101\\46.36452\\-100.6484\\-101\\47.85156\\-100.149\\-101\\51.67863\\-98.69531\\-101\\55.66406\\-97.56319\\-101\\59.57031\\-96.73425\\-101\\61.52344\\-96.18538\\-101\\63.47656\\-95.8877\\-101\\65.42969\\-95.70959\\-101\\69.33594\\-95.50147\\-101\\75.19531\\-95.41685\\-101\\79.10156\\-95.4931\\-101\\83.00781\\-95.69108\\-101\\86.91406\\-95.98017\\-101\\88.86719\\-96.25391\\-101\\90.82031\\-96.64453\\-101\\96.67969\\-97.64642\\-101\\100.5859\\-98.5558\\-101\\104.4922\\-99.74017\\-101\\106.4453\\-100.1927\\-101\\110.3516\\-101.5965\\-101\\112.3047\\-102.1443\\-101\\114.2578\\-103.101\\-101\\116.2109\\-103.8601\\-101\\118.1641\\-104.9209\\-101\\121.3881\\-106.5078\\-101\\124.0234\\-107.8975\\-101\\129.8828\\-111.856\\-101\\131.8359\\-113.4547\\-101\\133.7891\\-115.1892\\-101\\138.6868\\-120.1797\\-101\\140.6776\\-122.1328\\-101\\142.3432\\-124.0859\\-101\\143.8117\\-126.0391\\-101\\145.046\\-127.9922\\-101\\146.6563\\-129.9453\\-101\\148.1095\\-131.8984\\-101\\149.2844\\-133.8516\\-101\\151.3672\\-136.9057\\-101\\153.3203\\-139.9018\\-101\\155.5405\\-143.6172\\-101\\156.3849\\-145.5703\\-101\\157.4989\\-147.5234\\-101\\158.3547\\-149.4766\\-101\\159.4892\\-151.4297\\-101\\160.2915\\-153.3828\\-101\\161.2037\\-155.3359\\-101\\161.9178\\-157.2891\\-101\\162.3504\\-159.2422\\-101\\163.6431\\-163.1484\\-101\\164.475\\-167.0547\\-101\\165.0912\\-169.0078\\-101\\165.5915\\-170.9609\\-101\\166.7258\\-178.7734\\-101\\167.1143\\-180.7266\\-101\\167.4988\\-184.6328\\-101\\167.7974\\-190.4922\\-101\\167.94\\-196.3516\\-101\\167.9745\\-202.2109\\-101\\167.9116\\-206.1172\\-101\\167.6946\\-211.9766\\-101\\167.3765\\-215.8828\\-101\\167.1007\\-217.8359\\-101\\166.3656\\-221.7422\\-101\\165.7752\\-225.6484\\-101\\165.3539\\-227.6016\\-101\\164.5917\\-229.5547\\-101\\163.6882\\-233.4609\\-101\\162.8714\\-235.4141\\-101\\162.2721\\-237.3672\\-101\\161.8347\\-239.3203\\-101\\160.8766\\-241.2734\\-101\\160.0758\\-243.2266\\-101\\158.1158\\-247.1328\\-101\\156.9255\\-249.0859\\-101\\156.0903\\-251.0391\\-101\\154.8677\\-252.9922\\-101\\153.8536\\-254.9453\\-101\\151.3672\\-258.2672\\-101\\150.8721\\-258.8516\\-101\\149.742\\-260.8047\\-101\\148.2703\\-262.7578\\-101\\144.8852\\-266.6641\\-101\\143.5547\\-268.3024\\-101\\139.7992\\-272.5234\\-101\\137.6953\\-274.7068\\-101\\133.9919\\-278.3828\\-101\\131.8359\\-280.377\\-101\\127.2028\\-284.2422\\-101\\124.0234\\-286.8272\\-101\\122.0703\\-288.1735\\-101\\120.1172\\-289.2471\\-101\\118.1641\\-290.6303\\-101\\116.2109\\-291.6573\\-101\\114.2578\\-293.0044\\-101\\112.3047\\-294.077\\-101\\110.3516\\-294.9601\\-101\\108.3984\\-295.7298\\-101\\106.4453\\-296.7074\\-101\\104.4922\\-297.2728\\-101\\102.5391\\-298.281\\-101\\98.63281\\-299.4504\\-101\\96.67969\\-300.1883\\-101\\94.72656\\-300.5954\\-101\\88.86719\\-301.4809\\-101\\84.96094\\-302.2232\\-101\\83.00781\\-302.4315\\-101\\79.10156\\-302.6533\\-101\\75.19531\\-302.6953\\-101\\71.28906\\-302.6214\\-101\\67.38281\\-302.4101\\-101\\65.42969\\-302.1529\\-101\\61.52344\\-301.3288\\-101\\57.61719\\-300.6153\\-101\\55.66406\\-300.0299\\-101\\53.71094\\-299.1089\\-101\\51.75781\\-298.4202\\-101\\49.80469\\-297.2572\\-101\\47.85156\\-296.5577\\-101\\45.89844\\-295.3697\\-101\\43.94531\\-294.5193\\-101\\40.53852\\-292.0547\\-101\\38.08594\\-290.0765\\-101\\36.13281\\-288.6716\\-101\\33.47736\\-286.1953\\-101\\30.06904\\-282.2891\\-101\\28.32031\\-280.114\\-101\\25.74455\\-276.4297\\-101\\24.72979\\-274.4766\\-101\\24.41406\\-274.1146\\-101\\22.46094\\-270.8765\\-101\\22.20285\\-270.5703\\-101\\21.25047\\-268.6172\\-101\\20.06271\\-266.6641\\-101\\18.80787\\-262.7578\\-101\\17.84589\\-260.8047\\-101\\17.3379\\-258.8516\\-101\\16.53498\\-256.8984\\-101\\15.8754\\-254.9453\\-101\\15.42664\\-252.9922\\-101\\14.20681\\-249.0859\\-101\\13.29385\\-243.2266\\-101\\12.90825\\-241.2734\\-101\\12.31971\\-239.3203\\-101\\11.9687\\-237.3672\\-101\\11.42919\\-233.4609\\-101\\11.07681\\-231.5078\\-101\\10.45653\\-229.5547\\-101\\9.033203\\-223.6953\\-101\\7.536301\\-219.7891\\-101\\6.835938\\-217.2635\\-101\\4.882813\\-214.6892\\-101\\0.9765625\\-214.5924\\-101\\-0.9765625\\-216.9186\\-101\\-2.390392\\-219.7891\\-101\\-2.835181\\-221.7422\\-101\\-3.801243\\-223.6953\\-101\\-5.110981\\-225.6484\\-101\\-6.050728\\-227.6016\\-101\\-6.64719\\-229.5547\\-101\\-7.480197\\-231.5078\\-101\\-8.602695\\-235.4141\\-101\\-9.461938\\-237.3672\\-101\\-10.04861\\-239.3203\\-101\\-10.96644\\-241.2734\\-101\\-11.62946\\-243.2266\\-101\\-12.12198\\-245.1797\\-101\\-13.05362\\-247.1328\\-101\\-14.1825\\-251.0391\\-101\\-15.13672\\-252.9922\\-101\\-15.86383\\-254.9453\\-101\\-16.97266\\-256.8984\\-101\\-17.73314\\-258.8516\\-101\\-18.74394\\-260.8047\\-101\\-20.29647\\-264.7109\\-101\\-20.50781\\-265.0029\\-101\\-22.42338\\-268.6172\\-101\\-24.41406\\-271.9567\\-101\\-24.84883\\-272.5234\\-101\\-25.70106\\-274.4766\\-101\\-26.98084\\-276.4297\\-101\\-28.09934\\-278.3828\\-101\\-30.27344\\-281.29\\-101\\-32.65512\\-284.2422\\-101\\-33.99043\\-286.1953\\-101\\-36.13281\\-288.5316\\-101\\-37.84795\\-290.1016\\-101\\-40.03906\\-292.2355\\-101\\-42.36638\\-294.0078\\-101\\-45.89844\\-296.403\\-101\\-47.85156\\-297.2976\\-101\\-49.80469\\-298.5596\\-101\\-51.75781\\-299.3665\\-101\\-53.71094\\-300.3647\\-101\\-57.61719\\-301.3026\\-101\\-59.57031\\-301.8754\\-101\\-61.52344\\-302.3381\\-101\\-63.47656\\-302.6097\\-101\\-65.42969\\-302.7527\\-101\\-69.33594\\-302.9264\\-101\\-73.24219\\-302.9651\\-101\\-77.14844\\-302.8659\\-101\\-81.05469\\-302.6712\\-101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "368" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "76" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-302.0754\\-99\\-86.91406\\-301.5816\\-99\\-92.77344\\-300.5433\\-99\\-94.72656\\-300.0416\\-99\\-96.67969\\-299.2675\\-99\\-98.63281\\-298.6776\\-99\\-102.5391\\-297.013\\-99\\-104.4922\\-296.369\\-99\\-106.4453\\-295.3036\\-99\\-108.3984\\-294.7027\\-99\\-110.3516\\-293.5322\\-99\\-112.3047\\-292.5824\\-99\\-114.2578\\-291.1885\\-99\\-116.2109\\-289.9204\\-99\\-118.1641\\-288.819\\-99\\-121.6781\\-286.1953\\-99\\-124.0234\\-284.2337\\-99\\-125.9766\\-282.7303\\-99\\-127.9297\\-281.0835\\-99\\-131.8359\\-277.1989\\-99\\-134.6713\\-274.4766\\-99\\-136.4435\\-272.5234\\-99\\-137.6953\\-271.007\\-99\\-139.8226\\-268.6172\\-99\\-141.6016\\-266.2863\\-99\\-145.5305\\-260.8047\\-99\\-148.2156\\-256.8984\\-99\\-149.4141\\-254.8027\\-99\\-150.3348\\-252.9922\\-99\\-151.5739\\-251.0391\\-99\\-152.5937\\-249.0859\\-99\\-153.8269\\-247.1328\\-99\\-154.6408\\-245.1797\\-99\\-155.7098\\-243.2266\\-99\\-156.3553\\-241.2734\\-99\\-157.3079\\-239.3203\\-99\\-159.0539\\-235.4141\\-99\\-160.01\\-233.4609\\-99\\-160.7592\\-231.5078\\-99\\-161.6918\\-229.5547\\-99\\-162.7276\\-225.6484\\-99\\-163.6224\\-223.6953\\-99\\-164.6446\\-219.7891\\-99\\-165.4921\\-217.8359\\-99\\-166.3697\\-213.9297\\-99\\-166.9922\\-211.9014\\-99\\-167.4557\\-210.0234\\-99\\-167.7188\\-208.0703\\-99\\-168.1414\\-204.1641\\-99\\-168.6796\\-196.3516\\-99\\-168.8446\\-192.4453\\-99\\-168.7308\\-188.5391\\-99\\-168.2222\\-182.6797\\-99\\-167.588\\-176.8203\\-99\\-167.2604\\-174.8672\\-99\\-166.2326\\-170.9609\\-99\\-165.3818\\-167.0547\\-99\\-164.5909\\-165.1016\\-99\\-164.0079\\-163.1484\\-99\\-163.5678\\-161.1953\\-99\\-162.7234\\-159.2422\\-99\\-161.6104\\-155.3359\\-99\\-160.6996\\-153.3828\\-99\\-159.9371\\-151.4297\\-99\\-158.9476\\-149.4766\\-99\\-158.0627\\-147.5234\\-99\\-156.8879\\-145.5703\\-99\\-156.0398\\-143.6172\\-99\\-154.9235\\-141.6641\\-99\\-153.9738\\-139.7109\\-99\\-151.5193\\-135.8047\\-99\\-149.4141\\-132.7529\\-99\\-147.4609\\-130.0475\\-99\\-145.5078\\-127.822\\-99\\-143.5547\\-125.3262\\-99\\-140.7035\\-122.1328\\-99\\-136.586\\-118.2266\\-99\\-135.7422\\-117.6188\\-99\\-133.7891\\-115.8961\\-99\\-131.8359\\-114.2747\\-99\\-129.4118\\-112.3672\\-99\\-127.9297\\-111.5648\\-99\\-125.9766\\-109.8755\\-99\\-122.0703\\-107.5781\\-99\\-120.1172\\-106.3411\\-99\\-118.1641\\-105.4321\\-99\\-116.2109\\-104.088\\-99\\-112.3047\\-102.5756\\-99\\-108.3984\\-101.3392\\-99\\-106.4453\\-100.9163\\-99\\-104.4922\\-100.0206\\-99\\-100.5859\\-99.51024\\-99\\-98.63281\\-98.53939\\-99\\-96.67969\\-98.21772\\-99\\-92.77344\\-97.84082\\-99\\-90.82031\\-97.40137\\-99\\-86.91406\\-96.94825\\-99\\-79.10156\\-96.39182\\-99\\-75.19531\\-96.2643\\-99\\-67.38281\\-96.21013\\-99\\-61.52344\\-96.34433\\-99\\-57.61719\\-96.61805\\-99\\-53.71094\\-97.12103\\-99\\-51.75781\\-97.4375\\-99\\-49.80469\\-97.90507\\-99\\-47.85156\\-98.1861\\-99\\-45.89844\\-98.6058\\-99\\-43.94531\\-99.46629\\-99\\-41.99219\\-99.88061\\-99\\-40.03906\\-100.5534\\-99\\-36.13281\\-102.2458\\-99\\-32.22656\\-104.1837\\-99\\-30.27344\\-105.59\\-99\\-28.32031\\-107.1293\\-99\\-26.36719\\-108.1886\\-99\\-24.41406\\-109.956\\-99\\-22.10023\\-112.3672\\-99\\-20.50781\\-114.6743\\-99\\-19.50836\\-116.2734\\-99\\-18.16559\\-118.2266\\-99\\-17.29485\\-120.1797\\-99\\-16.05603\\-122.1328\\-99\\-14.09149\\-126.0391\\-99\\-13.38959\\-127.9922\\-99\\-12.38251\\-129.9453\\-99\\-11.29056\\-133.8516\\-99\\-10.47516\\-135.8047\\-99\\-10.06662\\-137.7578\\-99\\-8.578125\\-143.6172\\-99\\-7.805102\\-147.5234\\-99\\-7.169596\\-151.4297\\-99\\-6.111145\\-155.3359\\-99\\-5.668308\\-159.2422\\-99\\-4.817082\\-161.1953\\-99\\-3.806785\\-165.1016\\-99\\-2.929688\\-166.4548\\-99\\-0.7152289\\-169.0078\\-99\\0.9765625\\-170.8278\\-99\\2.929688\\-170.5514\\-99\\3.727214\\-169.0078\\-99\\4.882813\\-167.3167\\-99\\5.748402\\-165.1016\\-99\\6.305563\\-159.2422\\-99\\6.917318\\-157.2891\\-99\\7.657877\\-153.3828\\-99\\8.780185\\-149.4766\\-99\\10.2761\\-145.5703\\-99\\10.8631\\-143.6172\\-99\\11.81075\\-141.6641\\-99\\12.46197\\-139.7109\\-99\\13.25684\\-137.7578\\-99\\13.73184\\-135.8047\\-99\\14.5678\\-133.8516\\-99\\15.25427\\-131.8984\\-99\\16.60156\\-129.0307\\-99\\17.23069\\-127.9922\\-99\\18.16239\\-126.0391\\-99\\20.61743\\-122.1328\\-99\\22.46094\\-118.6908\\-99\\24.22931\\-116.2734\\-99\\25.87426\\-114.3203\\-99\\27.29181\\-112.3672\\-99\\28.96743\\-110.4141\\-99\\30.92041\\-108.4609\\-99\\34.17969\\-105.9202\\-99\\36.13281\\-104.0743\\-99\\38.13645\\-102.6016\\-99\\40.03906\\-101.625\\-99\\41.99219\\-100.1736\\-99\\43.94531\\-99.49198\\-99\\45.89844\\-98.24866\\-99\\47.85156\\-97.91023\\-99\\49.80469\\-96.64713\\-99\\51.75781\\-96.26806\\-99\\53.71094\\-95.7408\\-99\\55.66406\\-95.33838\\-99\\59.57031\\-94.78042\\-99\\61.52344\\-94.06065\\-99\\63.47656\\-93.79712\\-99\\67.38281\\-93.62755\\-99\\71.28906\\-93.56285\\-99\\77.14844\\-93.5899\\-99\\83.00781\\-93.84232\\-99\\84.96094\\-93.97526\\-99\\88.86719\\-94.47168\\-99\\90.82031\\-94.97055\\-99\\94.72656\\-95.50418\\-99\\98.63281\\-96.33588\\-99\\100.27\\-96.74219\\-99\\102.5391\\-97.49065\\-99\\106.4453\\-98.55811\\-99\\108.3984\\-99.57422\\-99\\110.3516\\-99.94392\\-99\\112.3047\\-100.8455\\-99\\114.2578\\-101.4823\\-99\\116.2109\\-102.2314\\-99\\118.1641\\-103.2958\\-99\\120.1172\\-104.2002\\-99\\124.0234\\-106.6073\\-99\\125.9766\\-107.6666\\-99\\129.8828\\-110.2802\\-99\\131.8359\\-111.8018\\-99\\134.7399\\-114.3203\\-99\\135.7422\\-115.2886\\-99\\139.6484\\-119.3853\\-99\\140.4932\\-120.1797\\-99\\142.2043\\-122.1328\\-99\\143.7188\\-124.0859\\-99\\144.8785\\-126.0391\\-99\\146.5203\\-127.9922\\-99\\147.9943\\-129.9453\\-99\\149.1019\\-131.8984\\-99\\151.7537\\-135.8047\\-99\\155.2819\\-141.6641\\-99\\156.1996\\-143.6172\\-99\\159.1797\\-149.5376\\-99\\160.0701\\-151.4297\\-99\\160.8528\\-153.3828\\-99\\161.7647\\-155.3359\\-99\\162.6912\\-159.2422\\-99\\163.4753\\-161.1953\\-99\\164.2832\\-165.1016\\-99\\164.7551\\-167.0547\\-99\\165.4061\\-169.0078\\-99\\165.7535\\-170.9609\\-99\\166.814\\-178.7734\\-99\\167.1666\\-180.7266\\-99\\167.5254\\-184.6328\\-99\\167.7838\\-190.4922\\-99\\167.9171\\-196.3516\\-99\\167.9171\\-204.1641\\-99\\167.8382\\-208.0703\\-99\\167.649\\-211.9766\\-99\\167.3327\\-215.8828\\-99\\167.0444\\-217.8359\\-99\\166.3319\\-221.7422\\-99\\165.746\\-225.6484\\-99\\165.3209\\-227.6016\\-99\\164.5631\\-229.5547\\-99\\163.6684\\-233.4609\\-99\\162.8309\\-235.4141\\-99\\162.2582\\-237.3672\\-99\\161.7942\\-239.3203\\-99\\160.8508\\-241.2734\\-99\\160.0602\\-243.2266\\-99\\159.0157\\-245.1797\\-99\\158.0733\\-247.1328\\-99\\156.8657\\-249.0859\\-99\\156.0535\\-251.0391\\-99\\154.8055\\-252.9922\\-99\\153.8246\\-254.9453\\-99\\150.797\\-258.8516\\-99\\149.677\\-260.8047\\-99\\148.1753\\-262.7578\\-99\\144.7879\\-266.6641\\-99\\143.5547\\-268.1671\\-99\\139.6484\\-272.5152\\-99\\135.8022\\-276.4297\\-99\\131.8359\\-280.1605\\-99\\129.3861\\-282.2891\\-99\\124.5476\\-286.1953\\-99\\124.0234\\-286.687\\-99\\121.804\\-288.1484\\-99\\120.1172\\-289.1605\\-99\\118.1641\\-290.4474\\-99\\116.2109\\-291.5066\\-99\\114.2578\\-292.8649\\-99\\110.3516\\-294.8928\\-99\\108.3984\\-295.5773\\-99\\106.4453\\-296.614\\-99\\104.4922\\-297.1859\\-99\\102.5391\\-298.1732\\-99\\98.63281\\-299.3641\\-99\\96.67969\\-300.1046\\-99\\94.72656\\-300.5354\\-99\\88.86719\\-301.4095\\-99\\84.96094\\-302.1505\\-99\\83.00781\\-302.3793\\-99\\79.10156\\-302.6283\\-99\\75.19531\\-302.6776\\-99\\71.28906\\-302.6028\\-99\\67.38281\\-302.37\\-99\\65.42969\\-302.1003\\-99\\61.52344\\-301.293\\-99\\57.61719\\-300.5738\\-99\\55.66406\\-299.9198\\-99\\53.71094\\-299.0658\\-99\\51.75781\\-298.3718\\-99\\49.80469\\-297.2305\\-99\\47.85156\\-296.5286\\-99\\45.89844\\-295.3514\\-99\\43.94531\\-294.5061\\-99\\40.54954\\-292.0547\\-99\\38.08594\\-290.0598\\-99\\36.13281\\-288.6679\\-99\\33.49946\\-286.1953\\-99\\30.11196\\-282.2891\\-99\\28.32031\\-280.0482\\-99\\25.75766\\-276.4297\\-99\\24.73958\\-274.4766\\-99\\24.41406\\-274.101\\-99\\22.46094\\-270.9496\\-99\\22.1444\\-270.5703\\-99\\21.23141\\-268.6172\\-99\\20.03933\\-266.6641\\-99\\18.74249\\-262.7578\\-99\\17.81581\\-260.8047\\-99\\17.32086\\-258.8516\\-99\\16.50682\\-256.8984\\-99\\15.84145\\-254.9453\\-99\\15.37162\\-252.9922\\-99\\14.21089\\-249.0859\\-99\\13.79395\\-247.1328\\-99\\13.13308\\-243.2266\\-99\\12.52254\\-241.2734\\-99\\12.03824\\-239.3203\\-99\\11.37514\\-235.4141\\-99\\9.586907\\-229.5547\\-99\\8.789063\\-227.6473\\-99\\6.835938\\-224.6418\\-99\\4.882813\\-223.8739\\-99\\3.662109\\-223.6953\\-99\\0.9765625\\-222.9803\\-99\\-0.9765625\\-224.8136\\-99\\-3.301056\\-227.6016\\-99\\-4.882813\\-229.4129\\-99\\-6.078125\\-231.5078\\-99\\-7.06999\\-233.4609\\-99\\-7.64057\\-235.4141\\-99\\-8.351046\\-237.3672\\-99\\-9.362399\\-239.3203\\-99\\-10.13545\\-241.2734\\-99\\-11.1617\\-243.2266\\-99\\-12.54921\\-247.1328\\-99\\-13.50066\\-249.0859\\-99\\-13.9552\\-251.0391\\-99\\-15.66723\\-254.9453\\-99\\-17.57813\\-258.8516\\-99\\-18.40049\\-260.8047\\-99\\-19.39944\\-262.7578\\-99\\-20.07004\\-264.7109\\-99\\-21.24885\\-266.6641\\-99\\-22.17721\\-268.6172\\-99\\-24.62861\\-272.5234\\-99\\-25.58717\\-274.4766\\-99\\-26.84508\\-276.4297\\-99\\-27.9903\\-278.3828\\-99\\-30.27344\\-281.3791\\-99\\-32.64408\\-284.2422\\-99\\-33.9635\\-286.1953\\-99\\-36.13281\\-288.5165\\-99\\-37.87904\\-290.1016\\-99\\-40.03906\\-292.1795\\-99\\-42.44911\\-294.0078\\-99\\-45.89844\\-296.3117\\-99\\-47.85156\\-297.2293\\-99\\-49.80469\\-298.4746\\-99\\-51.75781\\-299.2415\\-99\\-53.71094\\-300.2487\\-99\\-55.66406\\-300.7986\\-99\\-57.61719\\-301.2006\\-99\\-61.52344\\-302.2123\\-99\\-63.47656\\-302.51\\-99\\-67.38281\\-302.7969\\-99\\-71.28906\\-302.8977\\-99\\-77.14844\\-302.8237\\-99\\-81.05469\\-302.6028\\-99\\-83.00781\\-302.3921\\-99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "368" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "77" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-301.9211\\-97\\-86.91406\\-301.4584\\-97\\-92.77344\\-300.4614\\-97\\-94.72656\\-299.8748\\-97\\-96.67969\\-299.1375\\-97\\-98.63281\\-298.5742\\-97\\-100.5859\\-297.6578\\-97\\-104.4922\\-296.1739\\-97\\-106.4453\\-295.2131\\-97\\-108.3984\\-294.5575\\-97\\-110.3516\\-293.3588\\-97\\-112.3047\\-292.3847\\-97\\-112.7035\\-292.0547\\-97\\-115.7398\\-290.1016\\-97\\-116.2109\\-289.7007\\-97\\-118.1641\\-288.6505\\-97\\-121.3823\\-286.1953\\-97\\-124.0234\\-283.9269\\-97\\-125.9766\\-282.5\\-97\\-127.9297\\-280.891\\-97\\-131.8359\\-277.017\\-97\\-134.4925\\-274.4766\\-97\\-136.2855\\-272.5234\\-97\\-137.6953\\-270.7518\\-97\\-139.6484\\-268.5421\\-97\\-141.1331\\-266.6641\\-97\\-144.0131\\-262.7578\\-97\\-147.4609\\-257.7561\\-97\\-148.1141\\-256.8984\\-97\\-149.1491\\-254.9453\\-97\\-152.4905\\-249.0859\\-97\\-153.7325\\-247.1328\\-97\\-154.5638\\-245.1797\\-97\\-155.6253\\-243.2266\\-97\\-156.3023\\-241.2734\\-97\\-158.9988\\-235.4141\\-97\\-159.9725\\-233.4609\\-97\\-160.7254\\-231.5078\\-97\\-161.6732\\-229.5547\\-97\\-162.7276\\-225.6484\\-97\\-163.5957\\-223.6953\\-97\\-164.6446\\-219.7891\\-97\\-165.4921\\-217.8359\\-97\\-166.3506\\-213.9297\\-97\\-167.4681\\-210.0234\\-97\\-168.1605\\-204.1641\\-97\\-168.8446\\-194.3984\\-97\\-168.9211\\-192.4453\\-97\\-168.9372\\-188.5391\\-97\\-168.703\\-186.5859\\-97\\-168.3772\\-182.6797\\-97\\-167.8217\\-176.8203\\-97\\-167.2604\\-172.9141\\-97\\-166.2188\\-169.0078\\-97\\-165.8815\\-167.0547\\-97\\-165.3602\\-165.1016\\-97\\-164.6282\\-163.1484\\-97\\-163.6306\\-159.2422\\-97\\-162.8147\\-157.2891\\-97\\-161.7077\\-153.3828\\-97\\-159.1879\\-147.5234\\-97\\-158.1633\\-145.5703\\-97\\-157.0031\\-143.6172\\-97\\-156.2072\\-141.6641\\-97\\-155.0729\\-139.7109\\-97\\-154.1174\\-137.7578\\-97\\-153.3203\\-136.3857\\-97\\-151.6113\\-133.8516\\-97\\-150.1968\\-131.8984\\-97\\-148.9049\\-129.9453\\-97\\-147.4609\\-128.0471\\-97\\-145.5078\\-125.8839\\-97\\-143.5547\\-123.4032\\-97\\-141.6016\\-121.127\\-97\\-140.6907\\-120.1797\\-97\\-137.6953\\-117.3299\\-97\\-136.5095\\-116.2734\\-97\\-134.0451\\-114.3203\\-97\\-131.7574\\-112.3672\\-97\\-129.2503\\-110.4141\\-97\\-125.9766\\-108.1066\\-97\\-122.0703\\-105.7734\\-97\\-120.1172\\-105.0109\\-97\\-118.1641\\-103.4886\\-97\\-116.2109\\-102.2874\\-97\\-114.2578\\-101.8159\\-97\\-112.3047\\-100.9131\\-97\\-110.3516\\-100.1686\\-97\\-108.3984\\-99.57503\\-97\\-106.4453\\-99.14538\\-97\\-104.4922\\-98.28531\\-97\\-102.5391\\-97.85091\\-97\\-100.5859\\-97.57619\\-97\\-98.63281\\-96.86665\\-97\\-96.67969\\-96.39703\\-97\\-92.77344\\-95.97697\\-97\\-90.82031\\-95.87177\\-97\\-86.91406\\-95.25611\\-97\\-81.05469\\-94.79893\\-97\\-73.24219\\-94.52808\\-97\\-67.38281\\-94.49693\\-97\\-61.52344\\-94.6571\\-97\\-59.57031\\-94.77994\\-97\\-55.66406\\-95.13218\\-97\\-53.71094\\-95.54688\\-97\\-51.75781\\-95.85762\\-97\\-49.80469\\-96.05415\\-97\\-47.85156\\-96.41386\\-97\\-45.89844\\-97.11461\\-97\\-43.94531\\-97.65412\\-97\\-41.99219\\-98.0625\\-97\\-40.03906\\-99.10783\\-97\\-38.08594\\-99.58841\\-97\\-34.17969\\-101.3312\\-97\\-32.22656\\-102.2789\\-97\\-30.27344\\-103.5541\\-97\\-28.32031\\-105.1423\\-97\\-26.36719\\-106.2329\\-97\\-24.41406\\-107.9358\\-97\\-21.90645\\-110.4141\\-97\\-20.25035\\-112.3672\\-97\\-19.14228\\-114.3203\\-97\\-17.74729\\-116.2734\\-97\\-16.49397\\-118.2266\\-97\\-15.49797\\-120.1797\\-97\\-14.37062\\-122.1328\\-97\\-13.52692\\-124.0859\\-97\\-12.49015\\-126.0391\\-97\\-11.71875\\-127.9922\\-97\\-11.15042\\-129.9453\\-97\\-10.04791\\-131.8984\\-97\\-9.687783\\-133.8516\\-97\\-8.416645\\-137.7578\\-97\\-7.654747\\-141.6641\\-97\\-7.106236\\-143.6172\\-97\\-6.268168\\-147.5234\\-97\\-5.793724\\-149.4766\\-97\\-5.187988\\-153.3828\\-97\\-4.192947\\-155.3359\\-97\\-3.804348\\-157.2891\\-97\\-3.135851\\-159.2422\\-97\\-2.060309\\-161.1953\\-97\\-0.9765625\\-162.8721\\-97\\0.9765625\\-164.051\\-97\\2.929688\\-162.6938\\-97\\3.854305\\-161.1953\\-97\\4.099528\\-159.2422\\-97\\4.951862\\-157.2891\\-97\\5.343967\\-155.3359\\-97\\5.633319\\-153.3828\\-97\\6.826456\\-149.4766\\-97\\8.213141\\-145.5703\\-97\\8.799235\\-143.6172\\-97\\9.726872\\-141.6641\\-97\\10.40649\\-139.7109\\-97\\11.22175\\-137.7578\\-97\\11.62284\\-135.8047\\-97\\12.30277\\-133.8516\\-97\\13.95631\\-129.9453\\-97\\15.81513\\-126.0391\\-97\\17.15829\\-124.0859\\-97\\17.96312\\-122.1328\\-97\\19.32566\\-120.1797\\-97\\20.33841\\-118.2266\\-97\\21.69709\\-116.2734\\-97\\23.30972\\-114.3203\\-97\\24.41406\\-112.5826\\-97\\26.25304\\-110.4141\\-97\\28.32031\\-108.2013\\-97\\30.27344\\-106.3626\\-97\\34.17969\\-102.8957\\-97\\36.13281\\-101.6543\\-97\\38.08594\\-100.275\\-97\\40.03906\\-99.29263\\-97\\41.99219\\-97.92616\\-97\\43.94531\\-97.25663\\-97\\45.89844\\-96.12149\\-97\\47.85156\\-95.26159\\-97\\49.80469\\-94.65216\\-97\\51.75781\\-94.34517\\-97\\53.71094\\-93.67933\\-97\\55.66406\\-93.25849\\-97\\59.57031\\-92.90231\\-97\\61.52344\\-92.16606\\-97\\63.47656\\-91.89752\\-97\\65.42969\\-91.77545\\-97\\69.33594\\-91.66846\\-97\\73.24219\\-91.66261\\-97\\77.14844\\-91.74364\\-97\\83.00781\\-92.06537\\-97\\84.96094\\-92.30264\\-97\\86.91406\\-92.88244\\-97\\92.77344\\-93.60607\\-97\\98.63281\\-94.85295\\-97\\100.5859\\-95.45805\\-97\\104.4922\\-96.38779\\-97\\108.3984\\-97.82646\\-97\\112.3047\\-99.40895\\-97\\114.2578\\-100.0996\\-97\\116.2109\\-101.0762\\-97\\118.1641\\-101.8893\\-97\\122.0703\\-103.9013\\-97\\126.0864\\-106.5078\\-97\\127.9297\\-107.6165\\-97\\129.8828\\-109.0313\\-97\\131.8359\\-110.3238\\-97\\135.7422\\-113.6834\\-97\\137.6953\\-115.6026\\-97\\140.1804\\-118.2266\\-97\\141.8176\\-120.1797\\-97\\143.2264\\-122.1328\\-97\\146.3416\\-126.0391\\-97\\147.7071\\-127.9922\\-97\\153.9418\\-137.7578\\-97\\154.8967\\-139.7109\\-97\\156.0141\\-141.6641\\-97\\156.7524\\-143.6172\\-97\\157.9155\\-145.5703\\-97\\158.7763\\-147.5234\\-97\\159.8522\\-149.4766\\-97\\160.552\\-151.4297\\-97\\161.5192\\-153.3828\\-97\\162.0913\\-155.3359\\-97\\162.4974\\-157.2891\\-97\\163.2136\\-159.2422\\-97\\163.7835\\-161.1953\\-97\\164.5081\\-165.1016\\-97\\165.5932\\-169.0078\\-97\\166.343\\-174.8672\\-97\\167.193\\-180.7266\\-97\\167.5374\\-184.6328\\-97\\167.8431\\-192.4453\\-97\\167.9056\\-200.2578\\-97\\167.8826\\-204.1641\\-97\\167.7217\\-210.0234\\-97\\167.6179\\-211.9766\\-97\\167.2664\\-215.8828\\-97\\166.2735\\-221.7422\\-97\\165.7023\\-225.6484\\-97\\165.2508\\-227.6016\\-97\\164.5267\\-229.5547\\-97\\163.66\\-233.4609\\-97\\162.7915\\-235.4141\\-97\\161.7818\\-239.3203\\-97\\160.8233\\-241.2734\\-97\\160.0483\\-243.2266\\-97\\158.9886\\-245.1797\\-97\\158.0421\\-247.1328\\-97\\156.829\\-249.0859\\-97\\156.0059\\-251.0391\\-97\\154.7619\\-252.9922\\-97\\153.7624\\-254.9453\\-97\\150.7183\\-258.8516\\-97\\149.549\\-260.8047\\-97\\148.096\\-262.7578\\-97\\144.6734\\-266.6641\\-97\\143.5547\\-268.0343\\-97\\141.276\\-270.5703\\-97\\137.6953\\-274.3734\\-97\\135.6471\\-276.4297\\-97\\131.8359\\-279.9841\\-97\\129.2074\\-282.2891\\-97\\124.3035\\-286.1953\\-97\\124.0234\\-286.4839\\-97\\120.1172\\-289.0651\\-97\\116.2109\\-291.3657\\-97\\114.2578\\-292.7585\\-97\\112.3047\\-293.7121\\-97\\110.3516\\-294.8051\\-97\\108.3984\\-295.4727\\-97\\106.4453\\-296.5321\\-97\\104.4922\\-297.1186\\-97\\102.5391\\-298.0226\\-97\\100.5859\\-298.7461\\-97\\98.63281\\-299.2904\\-97\\96.67969\\-299.9893\\-97\\94.72656\\-300.497\\-97\\88.86719\\-301.365\\-97\\84.96094\\-302.1003\\-97\\81.05469\\-302.51\\-97\\77.14844\\-302.6466\\-97\\73.24219\\-302.6351\\-97\\69.33594\\-302.4978\\-97\\65.42969\\-302.0608\\-97\\63.47656\\-301.6206\\-97\\57.61719\\-300.5317\\-97\\51.75781\\-298.3184\\-97\\49.80469\\-297.2075\\-97\\47.85156\\-296.5021\\-97\\45.89844\\-295.3164\\-97\\43.94531\\-294.4622\\-97\\41.99219\\-293.1034\\-97\\38.08594\\-290.0436\\-97\\36.13281\\-288.6577\\-97\\33.5264\\-286.1953\\-97\\30.1875\\-282.2891\\-97\\28.32031\\-279.9989\\-97\\25.76673\\-276.4297\\-97\\24.74201\\-274.4766\\-97\\24.41406\\-274.1042\\-97\\22.46094\\-270.9819\\-97\\22.11981\\-270.5703\\-97\\21.20451\\-268.6172\\-97\\20.00651\\-266.6641\\-97\\18.68541\\-262.7578\\-97\\17.78666\\-260.8047\\-97\\17.28352\\-258.8516\\-97\\16.41456\\-256.8984\\-97\\15.76949\\-254.9453\\-97\\15.28293\\-252.9922\\-97\\14.1129\\-249.0859\\-97\\13.31851\\-245.1797\\-97\\12.12198\\-241.2734\\-97\\11.73598\\-239.3203\\-97\\11.25026\\-237.3672\\-97\\9.8066\\-233.4609\\-97\\8.789063\\-231.4913\\-97\\7.428851\\-229.5547\\-97\\6.835938\\-228.8724\\-97\\4.882813\\-228.3254\\-97\\0.9765625\\-228.3899\\-97\\-0.9765625\\-229.1609\\-97\\-2.929688\\-230.8698\\-97\\-4.882813\\-232.7896\\-97\\-5.375573\\-233.4609\\-97\\-6.187855\\-235.4141\\-97\\-7.397269\\-237.3672\\-97\\-8.260995\\-239.3203\\-97\\-9.433461\\-241.2734\\-97\\-10.30442\\-243.2266\\-97\\-11.41633\\-245.1797\\-97\\-12.0627\\-247.1328\\-97\\-13.07588\\-249.0859\\-97\\-14.4043\\-252.9922\\-97\\-15.43527\\-254.9453\\-97\\-16.2225\\-256.8984\\-97\\-17.38172\\-258.8516\\-97\\-18.07877\\-260.8047\\-97\\-19.20359\\-262.7578\\-97\\-19.85887\\-264.7109\\-97\\-21.03991\\-266.6641\\-97\\-21.93649\\-268.6172\\-97\\-23.27383\\-270.5703\\-97\\-24.31861\\-272.5234\\-97\\-26.36719\\-275.9813\\-97\\-27.86113\\-278.3828\\-97\\-30.27344\\-281.4655\\-97\\-32.62149\\-284.2422\\-97\\-33.94859\\-286.1953\\-97\\-36.13281\\-288.5165\\-97\\-37.92459\\-290.1016\\-97\\-40.03906\\-292.1073\\-97\\-43.94531\\-295.0092\\-97\\-45.89844\\-296.2141\\-97\\-47.85156\\-297.1571\\-97\\-49.80469\\-298.3811\\-97\\-51.75781\\-299.1432\\-97\\-53.71094\\-300.1181\\-97\\-55.66406\\-300.7083\\-97\\-59.57031\\-301.5403\\-97\\-61.52344\\-302.088\\-97\\-63.47656\\-302.4227\\-97\\-65.42969\\-302.6145\\-97\\-69.33594\\-302.7969\\-97\\-73.24219\\-302.8503\\-97\\-77.14844\\-302.7748\\-97\\-81.05469\\-302.53\\-97\\-83.00781\\-302.285\\-97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "351" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "78" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-302.1874\\-95\\-86.91406\\-301.3486\\-95\\-92.77344\\-300.3764\\-95\\-94.72656\\-299.6509\\-95\\-98.63281\\-298.4547\\-95\\-100.5859\\-297.4541\\-95\\-102.5391\\-296.8065\\-95\\-106.4453\\-295.1178\\-95\\-108.3984\\-294.3944\\-95\\-108.9607\\-294.0078\\-95\\-112.3047\\-292.0934\\-95\\-115.4514\\-290.1016\\-95\\-116.2109\\-289.4929\\-95\\-118.1641\\-288.4392\\-95\\-120.1172\\-287.0315\\-95\\-123.4242\\-284.2422\\-95\\-124.0234\\-283.6731\\-95\\-127.9297\\-280.659\\-95\\-132.2091\\-276.4297\\-95\\-133.7891\\-274.9794\\-95\\-136.0627\\-272.5234\\-95\\-137.6043\\-270.5703\\-95\\-139.6484\\-268.2586\\-95\\-142.483\\-264.7109\\-95\\-145.0853\\-260.8047\\-95\\-145.5078\\-260.3124\\-95\\-147.966\\-256.8984\\-95\\-148.9824\\-254.9453\\-95\\-150.1965\\-252.9922\\-95\\-151.1917\\-251.0391\\-95\\-153.6415\\-247.1328\\-95\\-154.4744\\-245.1797\\-95\\-155.5472\\-243.2266\\-95\\-156.2617\\-241.2734\\-95\\-157.1242\\-239.3203\\-95\\-158.0987\\-237.3672\\-95\\-158.9478\\-235.4141\\-95\\-159.9255\\-233.4609\\-95\\-160.6995\\-231.5078\\-95\\-161.6602\\-229.5547\\-95\\-162.705\\-225.6484\\-95\\-163.5773\\-223.6953\\-95\\-164.6015\\-219.7891\\-95\\-165.4644\\-217.8359\\-95\\-166.3392\\-213.9297\\-95\\-167.4463\\-210.0234\\-95\\-167.7376\\-208.0703\\-95\\-168.1507\\-204.1641\\-95\\-168.9056\\-194.3984\\-95\\-169.0162\\-192.4453\\-95\\-169.0461\\-188.5391\\-95\\-168.5561\\-182.6797\\-95\\-168.3262\\-180.7266\\-95\\-167.8167\\-174.8672\\-95\\-167.5684\\-172.9141\\-95\\-167.2084\\-170.9609\\-95\\-166.6352\\-169.0078\\-95\\-165.3796\\-163.1484\\-95\\-164.5898\\-161.1953\\-95\\-163.6658\\-157.2891\\-95\\-162.2933\\-153.3828\\-95\\-161.8034\\-151.4297\\-95\\-160.9116\\-149.4766\\-95\\-160.1563\\-147.5234\\-95\\-159.2663\\-145.5703\\-95\\-158.2277\\-143.6172\\-95\\-157.3671\\-141.6641\\-95\\-156.2709\\-139.7109\\-95\\-155.3976\\-137.7578\\-95\\-153.3203\\-134.2767\\-95\\-151.7086\\-131.8984\\-95\\-150.2539\\-129.9453\\-95\\-149.4141\\-128.5298\\-95\\-147.507\\-126.0391\\-95\\-144.0465\\-122.1328\\-95\\-142.5442\\-120.1797\\-95\\-140.6166\\-118.2266\\-95\\-137.6953\\-115.5067\\-95\\-135.7422\\-113.928\\-95\\-134.0355\\-112.3672\\-95\\-131.5836\\-110.4141\\-95\\-128.9617\\-108.4609\\-95\\-125.9766\\-106.3622\\-95\\-122.0703\\-103.9688\\-95\\-120.1172\\-103.0156\\-95\\-118.1641\\-101.7344\\-95\\-115.9237\\-100.6484\\-95\\-112.3047\\-99.2522\\-95\\-110.3516\\-98.42567\\-95\\-106.4453\\-97.29688\\-95\\-102.5391\\-96.034\\-95\\-98.63281\\-95.38712\\-95\\-94.72656\\-94.46901\\-95\\-92.77344\\-94.23212\\-95\\-88.86719\\-93.94893\\-95\\-86.91406\\-93.7571\\-95\\-84.96094\\-93.4581\\-95\\-79.10156\\-93.05589\\-95\\-73.24219\\-92.79491\\-95\\-67.38281\\-92.7178\\-95\\-61.52344\\-92.98965\\-95\\-55.66406\\-93.53455\\-95\\-53.71094\\-93.90946\\-95\\-49.80469\\-94.35591\\-95\\-47.85156\\-94.81594\\-95\\-45.89844\\-95.41256\\-95\\-41.99219\\-96.27376\\-95\\-40.03906\\-97.11779\\-95\\-38.08594\\-97.74903\\-95\\-32.22656\\-100.4171\\-95\\-30.27344\\-101.601\\-95\\-28.32031\\-103.0007\\-95\\-26.36719\\-104.2411\\-95\\-24.41406\\-105.9533\\-95\\-21.73913\\-108.4609\\-95\\-19.96707\\-110.4141\\-95\\-18.55469\\-112.4052\\-95\\-17.42903\\-114.3203\\-95\\-15.98751\\-116.2734\\-95\\-12.69531\\-122.3653\\-95\\-11.93728\\-124.0859\\-95\\-9.902057\\-127.9922\\-95\\-9.197298\\-129.9453\\-95\\-8.3125\\-131.8984\\-95\\-7.842319\\-133.8516\\-95\\-7.489483\\-135.8047\\-95\\-6.667259\\-137.7578\\-95\\-6.25465\\-139.7109\\-95\\-5.977958\\-141.6641\\-95\\-5.336828\\-143.6172\\-95\\-4.34932\\-147.5234\\-95\\-3.127078\\-151.4297\\-95\\-1.983173\\-153.3828\\-95\\-0.9765625\\-155.3576\\-95\\0.9765625\\-155.9295\\-95\\2.929688\\-153.8489\\-95\\3.831845\\-151.4297\\-95\\4.664902\\-149.4766\\-95\\5.313649\\-147.5234\\-95\\6.069841\\-145.5703\\-95\\6.64605\\-143.6172\\-95\\7.621951\\-141.6641\\-95\\8.009454\\-139.7109\\-95\\8.780103\\-137.7578\\-95\\10.0179\\-133.8516\\-95\\11.5754\\-129.9453\\-95\\12.44469\\-127.9922\\-95\\13.51061\\-126.0391\\-95\\14.32292\\-124.0859\\-95\\15.58291\\-122.1328\\-95\\16.60156\\-120.3424\\-95\\17.95313\\-118.2266\\-95\\19.01245\\-116.2734\\-95\\23.23615\\-110.4141\\-95\\24.41406\\-109.1157\\-95\\26.93315\\-106.5078\\-95\\30.27344\\-103.3109\\-95\\32.22656\\-101.6948\\-95\\33.63121\\-100.6484\\-95\\36.4926\\-98.69531\\-95\\38.08594\\-97.97452\\-95\\41.99219\\-95.73224\\-95\\43.94531\\-95.06428\\-95\\45.89844\\-94.08814\\-95\\47.85156\\-93.27901\\-95\\49.80469\\-92.6548\\-95\\51.75781\\-92.33428\\-95\\53.71094\\-91.72311\\-95\\55.66406\\-91.22286\\-95\\59.57031\\-90.64994\\-95\\61.52344\\-90.18641\\-95\\65.42969\\-89.80498\\-95\\69.33594\\-89.7065\\-95\\73.24219\\-89.74711\\-95\\77.14844\\-89.90625\\-95\\83.00781\\-90.3482\\-95\\88.86719\\-91.45058\\-95\\90.82031\\-91.69784\\-95\\95.93099\\-92.83594\\-95\\98.63281\\-93.60472\\-95\\102.5391\\-94.4159\\-95\\104.4922\\-95.15625\\-95\\108.3984\\-96.21291\\-95\\109.6824\\-96.74219\\-95\\114.2578\\-98.87364\\-95\\118.1641\\-100.6056\\-95\\120.1172\\-101.6181\\-95\\122.0703\\-102.5238\\-95\\129.8828\\-107.6208\\-95\\131.8359\\-109.1\\-95\\135.6938\\-112.3672\\-95\\139.704\\-116.2734\\-95\\143.5547\\-120.8633\\-95\\145.5078\\-123.3205\\-95\\147.4869\\-126.0391\\-95\\148.6398\\-127.9922\\-95\\150.0269\\-129.9453\\-95\\151.1603\\-131.8984\\-95\\153.7598\\-135.8047\\-95\\154.6578\\-137.7578\\-95\\155.8245\\-139.7109\\-95\\156.5867\\-141.6641\\-95\\157.7025\\-143.6172\\-95\\158.4778\\-145.5703\\-95\\159.6172\\-147.5234\\-95\\160.3527\\-149.4766\\-95\\161.2031\\-151.4297\\-95\\161.9301\\-153.3828\\-95\\162.323\\-155.3359\\-95\\162.8698\\-157.2891\\-95\\163.608\\-159.2422\\-95\\164.3273\\-163.1484\\-95\\164.781\\-165.1016\\-95\\165.3646\\-167.0547\\-95\\165.7191\\-169.0078\\-95\\166.6756\\-176.8203\\-95\\167.2431\\-180.7266\\-95\\167.5494\\-184.6328\\-95\\167.8136\\-192.4453\\-95\\167.8596\\-198.3047\\-95\\167.8317\\-204.1641\\-95\\167.6643\\-210.0234\\-95\\167.4143\\-213.9297\\-95\\167.193\\-215.8828\\-95\\166.5222\\-219.7891\\-95\\165.6634\\-225.6484\\-95\\165.2007\\-227.6016\\-95\\164.4939\\-229.5547\\-95\\163.6516\\-233.4609\\-95\\162.7794\\-235.4141\\-95\\161.7525\\-239.3203\\-95\\160.7869\\-241.2734\\-95\\160.0253\\-243.2266\\-95\\158.9373\\-245.1797\\-95\\158.0047\\-247.1328\\-95\\156.7902\\-249.0859\\-95\\155.9564\\-251.0391\\-95\\154.7145\\-252.9922\\-95\\153.6686\\-254.9453\\-95\\150.6426\\-258.8516\\-95\\149.4141\\-260.7947\\-95\\148.016\\-262.7578\\-95\\144.5618\\-266.6641\\-95\\143.5547\\-267.9035\\-95\\141.1482\\-270.5703\\-95\\139.2289\\-272.5234\\-95\\137.6953\\-274.1986\\-95\\135.4691\\-276.4297\\-95\\131.8359\\-279.8138\\-95\\129.0333\\-282.2891\\-95\\124.0234\\-286.2199\\-95\\120.1172\\-288.9458\\-95\\118.1641\\-289.9984\\-95\\116.2109\\-291.2152\\-95\\114.2578\\-292.6201\\-95\\112.3047\\-293.5508\\-95\\110.3516\\-294.7072\\-95\\108.3984\\-295.3634\\-95\\106.4453\\-296.4232\\-95\\104.4922\\-297.0406\\-95\\100.5859\\-298.6742\\-95\\98.63281\\-299.2143\\-95\\94.72656\\-300.4496\\-95\\88.86719\\-301.332\\-95\\84.96094\\-302.0626\\-95\\81.05469\\-302.4693\\-95\\77.14844\\-302.6214\\-95\\73.24219\\-302.6167\\-95\\69.33594\\-302.461\\-95\\67.38281\\-302.2818\\-95\\65.42969\\-301.9793\\-95\\63.47656\\-301.5423\\-95\\59.57031\\-300.8669\\-95\\57.61719\\-300.4768\\-95\\51.75781\\-298.2651\\-95\\49.80469\\-297.1746\\-95\\47.85156\\-296.4713\\-95\\45.89844\\-295.2863\\-95\\43.94531\\-294.438\\-95\\41.99219\\-293.0701\\-95\\40.03906\\-291.492\\-95\\36.13281\\-288.6226\\-95\\33.5719\\-286.1953\\-95\\31.8859\\-284.2422\\-95\\28.32031\\-279.9269\\-95\\25.77993\\-276.4297\\-95\\24.74201\\-274.4766\\-95\\24.41406\\-274.1042\\-95\\22.46094\\-271.0035\\-95\\22.09803\\-270.5703\\-95\\21.17283\\-268.6172\\-95\\19.97103\\-266.6641\\-95\\19.37548\\-264.7109\\-95\\17.74004\\-260.8047\\-95\\17.20908\\-258.8516\\-95\\16.26547\\-256.8984\\-95\\15.14267\\-252.9922\\-95\\14.3821\\-251.0391\\-95\\13.47778\\-247.1328\\-95\\12.96496\\-245.1797\\-95\\12.21035\\-243.2266\\-95\\11.14265\\-239.3203\\-95\\9.146554\\-235.4141\\-95\\8.789063\\-234.8802\\-95\\6.835938\\-233.3541\\-95\\4.882813\\-232.8874\\-95\\2.929688\\-232.5658\\-95\\0.9765625\\-232.8058\\-95\\-0.9765625\\-233.2656\\-95\\-2.929688\\-234.5135\\-95\\-4.882813\\-236.3398\\-95\\-5.771396\\-237.3672\\-95\\-7.234375\\-239.3203\\-95\\-8.244871\\-241.2734\\-95\\-9.571651\\-243.2266\\-95\\-11.61874\\-247.1328\\-95\\-12.45117\\-249.0859\\-95\\-13.43246\\-251.0391\\-95\\-14.06996\\-252.9922\\-95\\-15.13357\\-254.9453\\-95\\-15.92197\\-256.8984\\-95\\-17.09295\\-258.8516\\-95\\-17.82908\\-260.8047\\-95\\-18.9439\\-262.7578\\-95\\-19.65784\\-264.7109\\-95\\-21.73139\\-268.6172\\-95\\-23.07494\\-270.5703\\-95\\-24.04472\\-272.5234\\-95\\-25.32432\\-274.4766\\-95\\-27.72561\\-278.3828\\-95\\-30.27344\\-281.544\\-95\\-32.58366\\-284.2422\\-95\\-33.92075\\-286.1953\\-95\\-36.13281\\-288.5042\\-95\\-37.97259\\-290.1016\\-95\\-40.09699\\-292.0547\\-95\\-43.94531\\-294.9475\\-95\\-45.89844\\-296.1059\\-95\\-47.85156\\-297.0778\\-95\\-49.80469\\-298.2698\\-95\\-51.75781\\-299.0371\\-95\\-53.71094\\-299.9619\\-95\\-55.66406\\-300.6292\\-95\\-59.57031\\-301.4066\\-95\\-61.52344\\-301.951\\-95\\-63.47656\\-302.3152\\-95\\-65.42969\\-302.5497\\-95\\-69.33594\\-302.7522\\-95\\-73.24219\\-302.8023\\-95\\-77.14844\\-302.7178\\-95\\-81.05469\\-302.461\\-95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "360" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "79" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-302.0349\\-93\\-86.91406\\-301.2395\\-93\\-90.82031\\-300.6405\\-93\\-92.77344\\-300.254\\-93\\-94.72656\\-299.4603\\-93\\-98.63281\\-298.3184\\-93\\-100.5859\\-297.2964\\-93\\-102.5391\\-296.7031\\-93\\-104.4922\\-295.7565\\-93\\-108.3984\\-294.1914\\-93\\-110.3516\\-293.0313\\-93\\-112.3047\\-291.759\\-93\\-114.2578\\-290.6886\\-93\\-116.2109\\-289.3089\\-93\\-118.1535\\-288.1484\\-93\\-120.1172\\-286.8523\\-93\\-123.2291\\-284.2422\\-93\\-125.9766\\-281.8558\\-93\\-127.9297\\-280.3441\\-93\\-131.913\\-276.4297\\-93\\-134.0138\\-274.4766\\-93\\-137.33\\-270.5703\\-93\\-140.7948\\-266.6641\\-93\\-142.3404\\-264.7109\\-93\\-144.8975\\-260.8047\\-93\\-146.3982\\-258.8516\\-93\\-147.7347\\-256.8984\\-93\\-148.8105\\-254.9453\\-93\\-150.1038\\-252.9922\\-93\\-151.0204\\-251.0391\\-93\\-151.3672\\-250.5919\\-93\\-153.4947\\-247.1328\\-93\\-154.3904\\-245.1797\\-93\\-155.4362\\-243.2266\\-93\\-157.0511\\-239.3203\\-93\\-158.0659\\-237.3672\\-93\\-158.884\\-235.4141\\-93\\-159.844\\-233.4609\\-93\\-160.6478\\-231.5078\\-93\\-161.6506\\-229.5547\\-93\\-162.6694\\-225.6484\\-93\\-163.568\\-223.6953\\-93\\-164.5821\\-219.7891\\-93\\-165.4161\\-217.8359\\-93\\-165.92\\-215.8828\\-93\\-166.3097\\-213.9297\\-93\\-167.4143\\-210.0234\\-93\\-167.7304\\-208.0703\\-93\\-168.1507\\-204.1641\\-93\\-168.2921\\-202.2109\\-93\\-168.8156\\-196.3516\\-93\\-169.1043\\-192.4453\\-93\\-169.1466\\-188.5391\\-93\\-168.9053\\-184.6328\\-93\\-168.4869\\-180.7266\\-93\\-167.9806\\-174.8672\\-93\\-167.5175\\-170.9609\\-93\\-166.58\\-167.0547\\-93\\-165.7623\\-163.1484\\-93\\-165.2764\\-161.1953\\-93\\-164.5572\\-159.2422\\-93\\-163.6379\\-155.3359\\-93\\-162.8783\\-153.3828\\-93\\-162.2606\\-151.4297\\-93\\-161.8034\\-149.4766\\-93\\-160.9116\\-147.5234\\-93\\-159.2781\\-143.6172\\-93\\-158.2574\\-141.6641\\-93\\-157.3543\\-139.7109\\-93\\-156.3031\\-137.7578\\-93\\-155.4129\\-135.8047\\-93\\-153.3203\\-132.3413\\-93\\-151.7648\\-129.9453\\-93\\-150.2769\\-127.9922\\-93\\-149.4141\\-126.6376\\-93\\-147.5209\\-124.0859\\-93\\-145.8054\\-122.1328\\-93\\-143.8802\\-120.1797\\-93\\-142.0743\\-118.2266\\-93\\-139.6484\\-115.7316\\-93\\-133.7784\\-110.4141\\-93\\-131.8359\\-108.9123\\-93\\-127.9297\\-106.125\\-93\\-125.6553\\-104.5547\\-93\\-124.0234\\-103.656\\-93\\-122.0703\\-102.4348\\-93\\-120.1172\\-101.4163\\-93\\-118.1641\\-100.1757\\-93\\-114.2578\\-98.37959\\-93\\-112.3047\\-97.81702\\-93\\-109.9057\\-96.74219\\-93\\-106.4453\\-95.65466\\-93\\-104.4922\\-95.18129\\-93\\-102.5391\\-94.56561\\-93\\-100.5859\\-94.11679\\-93\\-98.63281\\-93.80542\\-93\\-96.67969\\-93.59626\\-93\\-94.72656\\-93.07594\\-93\\-92.77344\\-92.67696\\-93\\-88.86719\\-92.21274\\-93\\-84.96094\\-92.00299\\-93\\-81.05469\\-91.51166\\-93\\-75.19531\\-91.20557\\-93\\-71.28906\\-91.09511\\-93\\-69.33594\\-91.09328\\-93\\-65.42969\\-91.19757\\-93\\-59.57031\\-91.57338\\-93\\-57.61719\\-91.89577\\-93\\-53.71094\\-92.24741\\-93\\-51.75781\\-92.49595\\-93\\-49.80469\\-92.89808\\-93\\-47.85156\\-93.59087\\-93\\-45.89844\\-93.8125\\-93\\-43.94531\\-94.19101\\-93\\-41.99219\\-94.96896\\-93\\-40.03906\\-95.43756\\-93\\-36.38174\\-96.74219\\-93\\-32.22656\\-98.65358\\-93\\-30.27344\\-99.81683\\-93\\-28.32031\\-101.2147\\-93\\-26.36719\\-102.3369\\-93\\-24.41406\\-103.9655\\-93\\-21.75611\\-106.5078\\-93\\-19.87056\\-108.4609\\-93\\-18.30449\\-110.4141\\-93\\-15.68963\\-114.3203\\-93\\-14.57458\\-116.2734\\-93\\-12.69531\\-119.8259\\-93\\-10.74219\\-123.1354\\-93\\-9.289253\\-126.0391\\-93\\-8.201599\\-127.9922\\-93\\-6.845064\\-131.8984\\-93\\-6.059301\\-133.8516\\-93\\-5.724921\\-135.8047\\-93\\-4.76844\\-137.7578\\-93\\-4.354745\\-139.7109\\-93\\-4.085493\\-141.6641\\-93\\-3.019372\\-143.6172\\-93\\-1.638455\\-147.5234\\-93\\-0.9765625\\-148.5331\\-93\\0.9765625\\-149.3483\\-93\\2.783203\\-147.5234\\-93\\3.922129\\-145.5703\\-93\\4.54635\\-143.6172\\-93\\5.708582\\-141.6641\\-93\\6.024761\\-139.7109\\-93\\6.790304\\-137.7578\\-93\\7.913257\\-133.8516\\-93\\8.540919\\-131.8984\\-93\\9.322555\\-129.9453\\-93\\10.26848\\-127.9922\\-93\\11.43859\\-126.0391\\-93\\12.22358\\-124.0859\\-93\\13.51046\\-122.1328\\-93\\14.51765\\-120.1797\\-93\\15.75567\\-118.2266\\-93\\16.60156\\-116.4857\\-93\\18.23493\\-114.3203\\-93\\20.83965\\-110.4141\\-93\\22.51344\\-108.4609\\-93\\24.41406\\-105.978\\-93\\26.36719\\-103.9833\\-93\\28.09896\\-102.6016\\-93\\30.27344\\-101.0591\\-93\\33.08823\\-98.69531\\-93\\34.17969\\-98.05988\\-93\\36.13281\\-96.59907\\-93\\38.08594\\-95.84461\\-93\\40.03906\\-94.87523\\-93\\41.99219\\-93.79736\\-93\\43.94531\\-93.23805\\-93\\45.89844\\-92.15687\\-93\\49.80469\\-90.625\\-93\\51.75781\\-90.28136\\-93\\55.66406\\-89.41386\\-93\\59.57031\\-88.8552\\-93\\61.52344\\-88.40625\\-93\\65.42969\\-88.15871\\-93\\69.33594\\-88.11227\\-93\\73.24219\\-88.16447\\-93\\77.14844\\-88.37706\\-93\\79.10156\\-88.67188\\-93\\84.96094\\-89.35787\\-93\\88.86719\\-89.91294\\-93\\90.82031\\-90.28328\\-93\\92.77344\\-90.55022\\-93\\94.08482\\-90.88281\\-93\\96.67969\\-91.71891\\-93\\100.5859\\-92.6277\\-93\\102.5391\\-93.28125\\-93\\104.4922\\-93.82655\\-93\\106.4453\\-94.27386\\-93\\108.3984\\-95.17188\\-93\\110.3516\\-95.70689\\-93\\112.3047\\-96.44464\\-93\\118.1641\\-99.53718\\-93\\120.1172\\-100.3332\\-93\\122.0703\\-101.4455\\-93\\124.0234\\-102.4443\\-93\\127.2045\\-104.5547\\-93\\129.8828\\-106.5169\\-93\\131.8359\\-107.7832\\-93\\133.7891\\-109.3573\\-93\\137.0254\\-112.3672\\-93\\139.6484\\-114.9793\\-93\\142.5708\\-118.2266\\-93\\145.6539\\-122.1328\\-93\\147.4609\\-124.5795\\-93\\149.7371\\-127.9922\\-93\\150.8223\\-129.9453\\-93\\153.4712\\-133.8516\\-93\\154.4262\\-135.8047\\-93\\155.5687\\-137.7578\\-93\\156.3721\\-139.7109\\-93\\157.4413\\-141.6641\\-93\\158.2536\\-143.6172\\-93\\159.2331\\-145.5703\\-93\\160.0998\\-147.5234\\-93\\160.8392\\-149.4766\\-93\\161.7084\\-151.4297\\-93\\162.5716\\-155.3359\\-93\\163.3212\\-157.2891\\-93\\163.8443\\-159.2422\\-93\\164.4853\\-163.1484\\-93\\165.0912\\-165.1016\\-93\\165.5359\\-167.0547\\-93\\165.8074\\-169.0078\\-93\\166.2422\\-172.9141\\-93\\167.2414\\-180.7266\\-93\\167.5374\\-184.6328\\-93\\167.7217\\-190.4922\\-93\\167.8088\\-194.3984\\-93\\167.8088\\-198.3047\\-93\\167.7542\\-206.1172\\-93\\167.5046\\-211.9766\\-93\\167.379\\-213.9297\\-93\\167.1276\\-215.8828\\-93\\166.4536\\-219.7891\\-93\\165.6272\\-225.6484\\-93\\165.1338\\-227.6016\\-93\\164.452\\-229.5547\\-93\\163.6136\\-233.4609\\-93\\162.7417\\-235.4141\\-93\\161.7225\\-239.3203\\-93\\160.7303\\-241.2734\\-93\\159.9926\\-243.2266\\-93\\158.8745\\-245.1797\\-93\\157.959\\-247.1328\\-93\\156.7315\\-249.0859\\-93\\155.8871\\-251.0391\\-93\\154.6537\\-252.9922\\-93\\153.5538\\-254.9453\\-93\\152.1254\\-256.8984\\-93\\150.5432\\-258.8516\\-93\\149.4141\\-260.6056\\-93\\147.8909\\-262.7578\\-93\\144.4312\\-266.6641\\-93\\143.5547\\-267.7834\\-93\\141.0011\\-270.5703\\-93\\139.0728\\-272.5234\\-93\\137.6953\\-274.0307\\-93\\135.3214\\-276.4297\\-93\\133.7891\\-277.7664\\-93\\131.8359\\-279.6569\\-93\\128.8342\\-282.2891\\-93\\123.721\\-286.1953\\-93\\120.1172\\-288.8102\\-93\\118.1641\\-289.7736\\-93\\114.2578\\-292.4514\\-93\\112.3047\\-293.41\\-93\\110.3516\\-294.6182\\-93\\108.3984\\-295.2625\\-93\\106.4453\\-296.3092\\-93\\102.5391\\-297.6788\\-93\\100.5859\\-298.5941\\-93\\98.63281\\-299.1321\\-93\\94.72656\\-300.3884\\-93\\88.86719\\-301.2906\\-93\\84.96094\\-302.0081\\-93\\81.05469\\-302.4227\\-93\\77.14844\\-302.5956\\-93\\73.24219\\-302.5765\\-93\\69.33594\\-302.4139\\-93\\67.38281\\-302.2261\\-93\\63.47656\\-301.4696\\-93\\59.57031\\-300.815\\-93\\57.61719\\-300.4329\\-93\\55.66406\\-299.6525\\-93\\51.75781\\-298.209\\-93\\49.80469\\-297.1428\\-93\\47.85156\\-296.4201\\-93\\45.89844\\-295.249\\-93\\43.94531\\-294.3775\\-93\\41.99219\\-293.0367\\-93\\38.08594\\-289.9348\\-93\\36.13281\\-288.5376\\-93\\33.62863\\-286.1953\\-93\\31.9553\\-284.2422\\-93\\28.32031\\-279.8316\\-93\\25.79864\\-276.4297\\-93\\24.74201\\-274.4766\\-93\\24.41406\\-274.1073\\-93\\22.46094\\-271.0313\\-93\\22.07425\\-270.5703\\-93\\21.14868\\-268.6172\\-93\\19.93075\\-266.6641\\-93\\19.34928\\-264.7109\\-93\\17.67932\\-260.8047\\-93\\17.10464\\-258.8516\\-93\\16.12505\\-256.8984\\-93\\15.5894\\-254.9453\\-93\\14.9111\\-252.9922\\-93\\14.12307\\-251.0391\\-93\\13.18359\\-247.1328\\-93\\12.29195\\-245.1797\\-93\\11.66168\\-243.2266\\-93\\10.86426\\-241.2734\\-93\\9.880914\\-239.3203\\-93\\8.789063\\-237.9649\\-93\\6.835938\\-236.5878\\-93\\4.882813\\-236.4004\\-93\\0.9765625\\-236.3276\\-93\\-0.9765625\\-236.509\\-93\\-2.929688\\-237.6801\\-93\\-4.882813\\-238.6064\\-93\\-5.573552\\-239.3203\\-93\\-7.135759\\-241.2734\\-93\\-8.249383\\-243.2266\\-93\\-8.789063\\-243.8881\\-93\\-10.87827\\-247.1328\\-93\\-12.69531\\-250.5281\\-93\\-13.02573\\-251.0391\\-93\\-13.7623\\-252.9922\\-93\\-14.6405\\-254.9453\\-93\\-16.54857\\-258.8516\\-93\\-17.56203\\-260.8047\\-93\\-19.45755\\-264.7109\\-93\\-20.27847\\-266.6641\\-93\\-22.81303\\-270.5703\\-93\\-23.83475\\-272.5234\\-93\\-25.17641\\-274.4766\\-93\\-26.32581\\-276.4297\\-93\\-27.58943\\-278.3828\\-93\\-30.27344\\-281.6308\\-93\\-32.52989\\-284.2422\\-93\\-33.89116\\-286.1953\\-93\\-36.13281\\-288.4891\\-93\\-40.22167\\-292.0547\\-93\\-43.94531\\-294.8861\\-93\\-47.85156\\-296.9979\\-93\\-49.80469\\-298.1038\\-93\\-53.71094\\-299.7703\\-93\\-55.66406\\-300.5317\\-93\\-59.57031\\-301.2835\\-93\\-63.47656\\-302.2012\\-93\\-65.42969\\-302.461\\-93\\-69.33594\\-302.689\\-93\\-73.24219\\-302.7522\\-93\\-77.14844\\-302.6533\\-93\\-81.05469\\-302.3571\\-93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "346" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "80" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-301.4809\\-91\\-90.82031\\-300.5508\\-91\\-92.77344\\-300.0941\\-91\\-94.72656\\-299.3234\\-91\\-96.67969\\-298.7838\\-91\\-98.63281\\-298.1378\\-91\\-100.5859\\-297.1692\\-91\\-102.5391\\-296.5942\\-91\\-104.4922\\-295.5745\\-91\\-106.4453\\-294.907\\-91\\-108.2886\\-294.0078\\-91\\-110.3516\\-292.8958\\-91\\-112.3047\\-291.5237\\-91\\-114.2578\\-290.4934\\-91\\-116.2109\\-289.1436\\-91\\-120.1172\\-286.6494\\-91\\-123.0087\\-284.2422\\-91\\-127.5724\\-280.3359\\-91\\-131.8359\\-276.1321\\-91\\-133.7891\\-274.3219\\-91\\-135.353\\-272.5234\\-91\\-140.601\\-266.6641\\-91\\-142.174\\-264.7109\\-91\\-143.3546\\-262.7578\\-91\\-144.7132\\-260.8047\\-91\\-146.2259\\-258.8516\\-91\\-147.5336\\-256.8984\\-91\\-148.6445\\-254.9453\\-91\\-149.9859\\-252.9922\\-91\\-150.8689\\-251.0391\\-91\\-152.1886\\-249.0859\\-91\\-153.3203\\-247.1216\\-91\\-155.3299\\-243.2266\\-91\\-156.9569\\-239.3203\\-91\\-158.0132\\-237.3672\\-91\\-158.8427\\-235.4141\\-91\\-159.8726\\-233.4609\\-91\\-160.6165\\-231.5078\\-91\\-161.6277\\-229.5547\\-91\\-162.6275\\-225.6484\\-91\\-163.5264\\-223.6953\\-91\\-164.5416\\-219.7891\\-91\\-165.3646\\-217.8359\\-91\\-165.8841\\-215.8828\\-91\\-166.2854\\-213.9297\\-91\\-167.3943\\-210.0234\\-91\\-167.6955\\-208.0703\\-91\\-168.1386\\-204.1641\\-91\\-168.457\\-200.2578\\-91\\-168.8594\\-196.3516\\-91\\-169.1466\\-192.4453\\-91\\-169.2254\\-188.5391\\-91\\-169.0607\\-184.6328\\-91\\-168.2505\\-176.8203\\-91\\-168.1006\\-174.8672\\-91\\-167.6965\\-170.9609\\-91\\-167.3996\\-169.0078\\-91\\-166.4075\\-165.1016\\-91\\-165.6736\\-161.1953\\-91\\-165.1338\\-159.2422\\-91\\-164.4592\\-157.2891\\-91\\-163.5711\\-153.3828\\-91\\-162.7408\\-151.4297\\-91\\-161.7147\\-147.5234\\-91\\-160.8049\\-145.5703\\-91\\-160.0407\\-143.6172\\-91\\-159.1797\\-141.7275\\-91\\-155.2734\\-133.8648\\-91\\-153.3203\\-130.5847\\-91\\-151.6586\\-127.9922\\-91\\-147.4609\\-122.3345\\-91\\-141.6016\\-116.0136\\-91\\-139.6484\\-114.1356\\-91\\-135.4731\\-110.4141\\-91\\-133.1138\\-108.4609\\-91\\-130.4104\\-106.5078\\-91\\-127.8184\\-104.5547\\-91\\-125.9766\\-103.4848\\-91\\-124.0234\\-102.1174\\-91\\-122.0703\\-101.149\\-91\\-120.1172\\-100.0094\\-91\\-116.2109\\-97.97961\\-91\\-112.3047\\-96.25391\\-91\\-110.3516\\-95.67228\\-91\\-107.8074\\-94.78906\\-91\\-104.4922\\-93.83405\\-91\\-100.5859\\-93.07392\\-91\\-98.63281\\-92.35107\\-91\\-96.67969\\-92.00755\\-91\\-92.77344\\-91.54548\\-91\\-90.82031\\-90.89239\\-91\\-88.86719\\-90.57813\\-91\\-84.96094\\-90.21963\\-91\\-83.00781\\-90.10017\\-91\\-77.14844\\-89.88618\\-91\\-75.19531\\-89.69752\\-91\\-71.28906\\-89.61405\\-91\\-67.38281\\-89.66974\\-91\\-63.47656\\-89.93924\\-91\\-59.57031\\-90.09747\\-91\\-55.66406\\-90.43961\\-91\\-53.71094\\-90.74212\\-91\\-51.75781\\-91.15826\\-91\\-49.80469\\-91.70914\\-91\\-45.89844\\-92.30132\\-91\\-43.94531\\-92.95348\\-91\\-40.03906\\-93.99076\\-91\\-38.08594\\-94.65943\\-91\\-34.17969\\-96.16547\\-91\\-32.22656\\-97.26678\\-91\\-30.27344\\-98.11573\\-91\\-28.32031\\-99.52416\\-91\\-24.41406\\-102.1086\\-91\\-21.8011\\-104.5547\\-91\\-19.89632\\-106.5078\\-91\\-18.17255\\-108.4609\\-91\\-16.60156\\-110.6847\\-91\\-14.2985\\-114.3203\\-91\\-13.26834\\-116.2734\\-91\\-12.1213\\-118.2266\\-91\\-11.10734\\-120.1797\\-91\\-8.709882\\-124.0859\\-91\\-6.863839\\-127.9922\\-91\\-5.859375\\-129.9453\\-91\\-5.115327\\-131.8984\\-91\\-4.141671\\-133.8516\\-91\\-3.706135\\-135.8047\\-91\\-2.464117\\-137.7578\\-91\\-1.983643\\-139.7109\\-91\\-0.9765625\\-141.8879\\-91\\0.9765625\\-143.0086\\-91\\2.929688\\-141.3874\\-91\\4.882813\\-137.6633\\-91\\5.916262\\-133.8516\\-91\\6.669922\\-131.8984\\-91\\7.290378\\-129.9453\\-91\\8.203125\\-127.9922\\-91\\9.312855\\-126.0391\\-91\\10.14737\\-124.0859\\-91\\11.43101\\-122.1328\\-91\\12.37305\\-120.1797\\-91\\13.66266\\-118.2266\\-91\\14.61823\\-116.2734\\-91\\16.60156\\-113.2135\\-91\\18.82102\\-110.4141\\-91\\20.07039\\-108.4609\\-91\\21.48438\\-106.5078\\-91\\24.41406\\-103.4621\\-91\\26.36719\\-101.6447\\-91\\27.98412\\-100.6484\\-91\\30.27344\\-98.97852\\-91\\32.22656\\-97.26877\\-91\\36.13281\\-94.74165\\-91\\38.08594\\-93.97246\\-91\\40.03906\\-93.08236\\-91\\41.99219\\-91.9375\\-91\\43.94531\\-91.36295\\-91\\45.89844\\-90.21875\\-91\\47.85156\\-89.87815\\-91\\49.80469\\-89.0692\\-91\\51.75781\\-88.63503\\-91\\53.71094\\-88.38374\\-91\\55.66406\\-87.93799\\-91\\57.61719\\-87.62487\\-91\\59.57031\\-87.43563\\-91\\65.42969\\-87.07334\\-91\\71.28906\\-87.10619\\-91\\73.24219\\-87.17019\\-91\\77.14844\\-87.39735\\-91\\81.05469\\-87.68475\\-91\\84.96094\\-88.08955\\-91\\88.86719\\-88.72792\\-91\\94.72656\\-89.98284\\-91\\96.67969\\-90.30385\\-91\\98.63281\\-90.85777\\-91\\100.5859\\-91.74043\\-91\\102.5391\\-92.09532\\-91\\104.4922\\-92.56194\\-91\\106.4453\\-93.38189\\-91\\110.3516\\-94.71197\\-91\\114.2578\\-96.23608\\-91\\116.2109\\-97.43022\\-91\\118.1641\\-98.29485\\-91\\120.1172\\-99.47795\\-91\\122.0703\\-100.3152\\-91\\125.9766\\-102.5583\\-91\\127.9297\\-103.9059\\-91\\129.8828\\-105.4351\\-91\\133.7891\\-108.2575\\-91\\135.7422\\-109.9184\\-91\\140.2813\\-114.3203\\-91\\141.9168\\-116.2734\\-91\\143.4091\\-118.2266\\-91\\146.603\\-122.1328\\-91\\148.026\\-124.0859\\-91\\149.4141\\-126.2523\\-91\\150.4165\\-127.9922\\-91\\151.7821\\-129.9453\\-91\\152.908\\-131.8984\\-91\\154.1715\\-133.8516\\-91\\156.1479\\-137.7578\\-91\\156.9574\\-139.7109\\-91\\157.9824\\-141.6641\\-91\\158.8126\\-143.6172\\-91\\159.8327\\-145.5703\\-91\\160.4838\\-147.5234\\-91\\161.4108\\-149.4766\\-91\\161.969\\-151.4297\\-91\\162.3504\\-153.3828\\-91\\162.8831\\-155.3359\\-91\\163.6047\\-157.2891\\-91\\164.6343\\-163.1484\\-91\\165.2508\\-165.1016\\-91\\165.6164\\-167.0547\\-91\\166.2706\\-172.9141\\-91\\167.0298\\-178.7734\\-91\\167.2296\\-180.7266\\-91\\167.5828\\-186.5859\\-91\\167.7332\\-194.3984\\-91\\167.77\\-198.3047\\-91\\167.6832\\-206.1172\\-91\\167.4241\\-211.9766\\-91\\167.0298\\-215.8828\\-91\\166.3775\\-219.7891\\-91\\165.561\\-225.6484\\-91\\164.3899\\-229.5547\\-91\\163.5773\\-233.4609\\-91\\162.6939\\-235.4141\\-91\\161.6881\\-239.3203\\-91\\160.6895\\-241.2734\\-91\\159.9576\\-243.2266\\-91\\158.7825\\-245.1797\\-91\\157.8967\\-247.1328\\-91\\156.6619\\-249.0859\\-91\\155.8286\\-251.0391\\-91\\153.4029\\-254.9453\\-91\\152.0203\\-256.8984\\-91\\150.414\\-258.8516\\-91\\149.4141\\-260.442\\-91\\147.7455\\-262.7578\\-91\\146.0925\\-264.7109\\-91\\144.2522\\-266.6641\\-91\\143.5547\\-267.6104\\-91\\140.8675\\-270.5703\\-91\\137.0321\\-274.4766\\-91\\135.1744\\-276.4297\\-91\\133.7891\\-277.6291\\-91\\131.8359\\-279.4854\\-91\\129.8828\\-281.2279\\-91\\127.9297\\-282.8537\\-91\\125.9766\\-284.2171\\-91\\123.4343\\-286.1953\\-91\\120.1172\\-288.6768\\-91\\118.1641\\-289.5794\\-91\\117.5045\\-290.1016\\-91\\114.2578\\-292.2541\\-91\\112.3047\\-293.2726\\-91\\110.3516\\-294.4928\\-91\\108.3984\\-295.1664\\-91\\106.4453\\-296.1324\\-91\\102.5391\\-297.5511\\-91\\100.5859\\-298.5064\\-91\\98.63281\\-299.0368\\-91\\94.72656\\-300.3156\\-91\\92.77344\\-300.6744\\-91\\86.91406\\-301.5546\\-91\\83.00781\\-302.2012\\-91\\81.05469\\-302.3793\\-91\\77.14844\\-302.5572\\-91\\71.28906\\-302.4734\\-91\\67.38281\\-302.1529\\-91\\63.47656\\-301.4066\\-91\\59.57031\\-300.7752\\-91\\57.61719\\-300.3916\\-91\\55.66406\\-299.593\\-91\\51.75781\\-298.1616\\-91\\49.80469\\-297.1076\\-91\\47.85156\\-296.3795\\-91\\45.89844\\-295.216\\-91\\43.94531\\-294.3143\\-91\\41.99219\\-292.9871\\-91\\38.08594\\-289.8478\\-91\\36.13281\\-288.4437\\-91\\33.71635\\-286.1953\\-91\\28.32031\\-279.7768\\-91\\25.83143\\-276.4297\\-91\\24.76591\\-274.4766\\-91\\24.41406\\-274.0778\\-91\\22.46094\\-271.0547\\-91\\22.05078\\-270.5703\\-91\\21.11117\\-268.6172\\-91\\19.90928\\-266.6641\\-91\\19.31014\\-264.7109\\-91\\18.34797\\-262.7578\\-91\\16.96538\\-258.8516\\-91\\15.98566\\-256.8984\\-91\\15.4286\\-254.9453\\-91\\14.49539\\-252.9922\\-91\\13.85161\\-251.0391\\-91\\13.32642\\-249.0859\\-91\\11.5843\\-245.1797\\-91\\10.74219\\-243.6302\\-91\\8.789063\\-241.1496\\-91\\6.835938\\-240.1203\\-91\\4.882813\\-239.9677\\-91\\0.9765625\\-239.8928\\-91\\-0.9765625\\-239.9964\\-91\\-2.929688\\-240.3538\\-91\\-4.882813\\-241.894\\-91\\-6.835938\\-243.6618\\-91\\-8.128979\\-245.1797\\-91\\-8.789063\\-245.805\\-91\\-9.847574\\-247.1328\\-91\\-11.23414\\-249.0859\\-91\\-12.24293\\-251.0391\\-91\\-13.41318\\-252.9922\\-91\\-14.11033\\-254.9453\\-91\\-15.23062\\-256.8984\\-91\\-16.02746\\-258.8516\\-91\\-17.19835\\-260.8047\\-91\\-18.01696\\-262.7578\\-91\\-19.19495\\-264.7109\\-91\\-19.9245\\-266.6641\\-91\\-21.21519\\-268.6172\\-91\\-22.46094\\-270.6914\\-91\\-24.41406\\-273.779\\-91\\-24.98653\\-274.4766\\-91\\-26.08924\\-276.4297\\-91\\-27.45972\\-278.3828\\-91\\-29.06709\\-280.3359\\-91\\-30.84664\\-282.2891\\-91\\-33.84927\\-286.1953\\-91\\-36.13281\\-288.4891\\-91\\-38.07681\\-290.1016\\-91\\-40.30819\\-292.0547\\-91\\-43.94531\\-294.8175\\-91\\-49.80469\\-297.9218\\-91\\-51.75781\\-298.8329\\-91\\-55.66406\\-300.421\\-91\\-61.52344\\-301.5944\\-91\\-63.47656\\-302.0754\\-91\\-65.42969\\-302.3571\\-91\\-69.33594\\-302.6214\\-91\\-73.24219\\-302.689\\-91\\-77.14844\\-302.5765\\-91\\-81.05469\\-302.2476\\-91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "341" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "81" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-302.1003\\-89\\-84.96094\\-301.3619\\-89\\-90.82031\\-300.4496\\-89\\-92.77344\\-299.905\\-89\\-94.72656\\-299.1924\\-89\\-96.67969\\-298.6943\\-89\\-100.5859\\-297.0702\\-89\\-102.5391\\-296.4713\\-89\\-104.4922\\-295.4459\\-89\\-106.4453\\-294.7781\\-89\\-108.3984\\-293.6869\\-89\\-110.3516\\-292.7312\\-89\\-112.3047\\-291.3378\\-89\\-114.2578\\-290.2523\\-89\\-116.2109\\-289.0006\\-89\\-120.1172\\-286.3823\\-89\\-122.7667\\-284.2422\\-89\\-127.3468\\-280.3359\\-89\\-129.8828\\-277.7679\\-89\\-133.7891\\-274.032\\-89\\-137.6953\\-269.7491\\-89\\-140.4047\\-266.6641\\-89\\-141.956\\-264.7109\\-89\\-143.1596\\-262.7578\\-89\\-146.0564\\-258.8516\\-89\\-147.4609\\-256.7237\\-89\\-149.8336\\-252.9922\\-89\\-150.7182\\-251.0391\\-89\\-152.0779\\-249.0859\\-89\\-154.2329\\-245.1797\\-89\\-156.1149\\-241.2734\\-89\\-156.8683\\-239.3203\\-89\\-157.9714\\-237.3672\\-89\\-158.7984\\-235.4141\\-89\\-159.8712\\-233.4609\\-89\\-160.5601\\-231.5078\\-89\\-161.581\\-229.5547\\-89\\-162.5846\\-225.6484\\-89\\-163.4646\\-223.6953\\-89\\-164.4802\\-219.7891\\-89\\-165.2865\\-217.8359\\-89\\-165.8418\\-215.8828\\-89\\-166.2439\\-213.9297\\-89\\-167.3503\\-210.0234\\-89\\-167.6683\\-208.0703\\-89\\-168.1125\\-204.1641\\-89\\-168.4473\\-200.2578\\-89\\-169.0313\\-194.3984\\-89\\-169.2518\\-190.4922\\-89\\-169.2755\\-188.5391\\-89\\-169.1181\\-184.6328\\-89\\-168.8004\\-180.7266\\-89\\-168.3478\\-176.8203\\-89\\-168.0343\\-172.9141\\-89\\-167.6093\\-169.0078\\-89\\-167.2466\\-167.0547\\-89\\-166.7041\\-165.1016\\-89\\-166.2699\\-163.1484\\-89\\-165.5564\\-159.2422\\-89\\-164.3473\\-155.3359\\-89\\-163.4206\\-151.4297\\-89\\-162.6219\\-149.4766\\-89\\-161.583\\-145.5703\\-89\\-160.6611\\-143.6172\\-89\\-159.934\\-141.6641\\-89\\-158.9188\\-139.7109\\-89\\-156.0927\\-133.8516\\-89\\-154.9531\\-131.8984\\-89\\-154.0093\\-129.9453\\-89\\-153.3203\\-128.8752\\-89\\-149.9941\\-124.0859\\-89\\-147.4609\\-120.8338\\-89\\-143.5547\\-116.5082\\-89\\-141.4759\\-114.3203\\-89\\-139.3573\\-112.3672\\-89\\-134.9037\\-108.4609\\-89\\-131.8359\\-106.0996\\-89\\-127.9297\\-103.351\\-89\\-125.9766\\-101.8785\\-89\\-124.0234\\-100.9599\\-89\\-122.0703\\-99.78455\\-89\\-120.1172\\-98.79209\\-89\\-118.1641\\-97.65506\\-89\\-114.2578\\-95.83392\\-89\\-112.3047\\-95.13611\\-89\\-110.3516\\-94.30451\\-89\\-108.3984\\-93.81928\\-89\\-104.4922\\-92.53935\\-89\\-102.5391\\-92.04818\\-89\\-98.63281\\-91.18508\\-89\\-96.67969\\-90.56437\\-89\\-94.72656\\-90.16711\\-89\\-86.91406\\-89.10202\\-89\\-84.96094\\-88.78899\\-89\\-81.05469\\-88.50677\\-89\\-77.14844\\-88.28588\\-89\\-73.24219\\-88.20081\\-89\\-69.33594\\-88.21122\\-89\\-63.47656\\-88.42305\\-89\\-59.57031\\-88.69563\\-89\\-57.61719\\-88.9381\\-89\\-49.80469\\-90.11112\\-89\\-46.28314\\-90.88281\\-89\\-43.94531\\-91.53625\\-89\\-41.99219\\-91.97019\\-89\\-40.03906\\-92.58994\\-89\\-38.08594\\-93.34375\\-89\\-34.17969\\-94.71128\\-89\\-30.27344\\-96.56985\\-89\\-28.32031\\-97.7575\\-89\\-26.36719\\-99.20885\\-89\\-24.41406\\-100.3287\\-89\\-22.46094\\-101.9834\\-89\\-19.86557\\-104.5547\\-89\\-18.16579\\-106.5078\\-89\\-16.60156\\-108.5177\\-89\\-15.3845\\-110.4141\\-89\\-14.02065\\-112.3672\\-89\\-11.92898\\-116.2734\\-89\\-9.707755\\-120.1797\\-89\\-8.444864\\-122.1328\\-89\\-7.458785\\-124.0859\\-89\\-6.276777\\-126.0391\\-89\\-5.33288\\-127.9922\\-89\\-3.957201\\-129.9453\\-89\\-2.95989\\-131.8984\\-89\\-0.9765625\\-134.877\\-89\\0.2335259\\-135.8047\\-89\\0.9765625\\-136.5477\\-89\\2.929688\\-135.5293\\-89\\3.590593\\-133.8516\\-89\\4.48666\\-131.8984\\-89\\5.282738\\-129.9453\\-89\\7.213665\\-126.0391\\-89\\8.019912\\-124.0859\\-89\\9.232133\\-122.1328\\-89\\10.21359\\-120.1797\\-89\\12.53568\\-116.2734\\-89\\14.98028\\-112.3672\\-89\\16.50301\\-110.4141\\-89\\17.68973\\-108.4609\\-89\\21.01452\\-104.5547\\-89\\22.46094\\-103.0215\\-89\\26.36719\\-99.51225\\-89\\28.32031\\-97.90864\\-89\\30.27344\\-96.71375\\-89\\32.22656\\-95.25452\\-89\\36.29557\\-92.83594\\-89\\38.08594\\-92.07468\\-89\\40.03906\\-91.12471\\-89\\41.99219\\-90.02069\\-89\\43.94531\\-89.43815\\-89\\45.89844\\-88.54072\\-89\\49.80469\\-87.71088\\-89\\51.75781\\-87.18076\\-89\\53.71094\\-86.78782\\-89\\59.57031\\-86.02123\\-89\\63.47656\\-85.77408\\-89\\69.33594\\-85.66691\\-89\\71.28906\\-85.70181\\-89\\75.19531\\-85.95959\\-89\\79.10156\\-86.34505\\-89\\81.05469\\-86.47453\\-89\\83.00781\\-86.80846\\-89\\84.96094\\-87.0376\\-89\\88.86719\\-87.7812\\-89\\90.82031\\-88.03507\\-89\\94.72656\\-88.70996\\-89\\96.67969\\-89.32478\\-89\\100.5859\\-90.28241\\-89\\104.4922\\-91.69994\\-89\\106.4453\\-92.2364\\-89\\108.3984\\-93.04284\\-89\\112.3047\\-94.35756\\-89\\114.2578\\-95.3648\\-89\\116.2109\\-96.18716\\-89\\118.1641\\-97.36801\\-89\\120.1172\\-98.24609\\-89\\122.0703\\-99.44705\\-89\\124.0234\\-100.4023\\-89\\125.9766\\-101.5557\\-89\\129.8828\\-104.2633\\-89\\135.2494\\-108.4609\\-89\\139.2402\\-112.3672\\-89\\141.1684\\-114.3203\\-89\\142.7225\\-116.2734\\-89\\146.0033\\-120.1797\\-89\\147.5034\\-122.1328\\-89\\148.7145\\-124.0859\\-89\\150.0767\\-126.0391\\-89\\152.4029\\-129.9453\\-89\\153.7673\\-131.8984\\-89\\154.7388\\-133.8516\\-89\\155.8913\\-135.8047\\-89\\156.5865\\-137.7578\\-89\\157.7025\\-139.7109\\-89\\158.4343\\-141.6641\\-89\\159.5117\\-143.6172\\-89\\160.9086\\-147.5234\\-89\\161.7314\\-149.4766\\-89\\162.5325\\-153.3828\\-89\\163.2276\\-155.3359\\-89\\163.7723\\-157.2891\\-89\\164.3975\\-161.1953\\-89\\164.7828\\-163.1484\\-89\\165.3539\\-165.1016\\-89\\165.888\\-169.0078\\-89\\166.51\\-174.8672\\-89\\167.0149\\-178.7734\\-89\\167.3327\\-182.6797\\-89\\167.5308\\-186.5859\\-89\\167.649\\-192.4453\\-89\\167.6988\\-198.3047\\-89\\167.6062\\-206.1172\\-89\\167.335\\-211.9766\\-89\\166.896\\-215.8828\\-89\\166.5853\\-217.8359\\-89\\165.8053\\-223.6953\\-89\\165.4738\\-225.6484\\-89\\164.3244\\-229.5547\\-89\\163.9546\\-231.5078\\-89\\163.4857\\-233.4609\\-89\\162.6244\\-235.4141\\-89\\161.6498\\-239.3203\\-89\\160.6257\\-241.2734\\-89\\159.9066\\-243.2266\\-89\\158.6699\\-245.1797\\-89\\157.8189\\-247.1328\\-89\\156.582\\-249.0859\\-89\\155.748\\-251.0391\\-89\\153.3203\\-254.84\\-89\\151.9112\\-256.8984\\-89\\150.3551\\-258.8516\\-89\\149.4141\\-260.2632\\-89\\147.583\\-262.7578\\-89\\145.9548\\-264.7109\\-89\\144.1687\\-266.6641\\-89\\143.5547\\-267.4468\\-89\\140.7399\\-270.5703\\-89\\139.6484\\-271.6272\\-89\\137.6953\\-273.7228\\-89\\135.0042\\-276.4297\\-89\\133.7891\\-277.4633\\-89\\129.8828\\-281.0733\\-89\\127.9297\\-282.6954\\-89\\125.9766\\-283.9142\\-89\\122.0703\\-287.0668\\-89\\120.1172\\-288.4859\\-89\\118.1641\\-289.4354\\-89\\116.2109\\-290.7966\\-89\\110.3516\\-294.3121\\-89\\108.3984\\-295.0693\\-89\\104.4922\\-296.7859\\-89\\102.5391\\-297.4011\\-89\\100.5859\\-298.3937\\-89\\96.67969\\-299.5352\\-89\\94.72656\\-300.2515\\-89\\92.77344\\-300.6249\\-89\\86.91406\\-301.4696\\-89\\83.00781\\-302.1147\\-89\\79.10156\\-302.4315\\-89\\75.19531\\-302.4978\\-89\\71.28906\\-302.3884\\-89\\67.38281\\-302.0349\\-89\\63.47656\\-301.3254\\-89\\59.57031\\-300.7196\\-89\\57.61719\\-300.3307\\-89\\55.66406\\-299.5138\\-89\\53.71094\\-298.8702\\-89\\51.75781\\-298.1011\\-89\\49.80469\\-297.0685\\-89\\47.85156\\-296.3229\\-89\\45.89844\\-295.1636\\-89\\43.94531\\-294.2354\\-89\\41.99219\\-292.9319\\-89\\38.08594\\-289.7512\\-89\\36.13281\\-288.3438\\-89\\33.8199\\-286.1953\\-89\\30.5625\\-282.2891\\-89\\28.32031\\-279.7237\\-89\\25.86515\\-276.4297\\-89\\24.78027\\-274.4766\\-89\\24.41406\\-274.0649\\-89\\22.46094\\-271.0701\\-89\\22.03776\\-270.5703\\-89\\21.07219\\-268.6172\\-89\\19.85051\\-266.6641\\-89\\19.24143\\-264.7109\\-89\\18.18359\\-262.7578\\-89\\17.50103\\-260.8047\\-89\\15.79392\\-256.8984\\-89\\15.13983\\-254.9453\\-89\\14.08406\\-252.9922\\-89\\13.48039\\-251.0391\\-89\\12.69531\\-249.3473\\-89\\11.49164\\-247.1328\\-89\\10.74219\\-246.0704\\-89\\8.789063\\-244.0684\\-89\\6.835938\\-243.5419\\-89\\4.882813\\-243.3264\\-89\\2.929688\\-243.2124\\-89\\0.9765625\\-243.2128\\-89\\-0.9765625\\-243.3253\\-89\\-2.929688\\-243.6507\\-89\\-4.882813\\-244.5326\\-89\\-6.835938\\-245.9444\\-89\\-8.789063\\-247.7581\\-89\\-10.74219\\-249.8765\\-89\\-11.5899\\-251.0391\\-89\\-12.7038\\-252.9922\\-89\\-14.64844\\-256.9527\\-89\\-16.60156\\-260.7721\\-89\\-18.55469\\-264.3717\\-89\\-18.80258\\-264.7109\\-89\\-19.6418\\-266.6641\\-89\\-21.93117\\-270.5703\\-89\\-23.38973\\-272.5234\\-89\\-24.72444\\-274.4766\\-89\\-25.8893\\-276.4297\\-89\\-27.32544\\-278.3828\\-89\\-28.93814\\-280.3359\\-89\\-30.78326\\-282.2891\\-89\\-33.82259\\-286.1953\\-89\\-36.13281\\-288.4865\\-89\\-38.08594\\-290.0431\\-89\\-40.38943\\-292.0547\\-89\\-43.94531\\-294.7527\\-89\\-45.89844\\-295.7092\\-89\\-47.85156\\-296.8333\\-89\\-49.80469\\-297.7058\\-89\\-51.75781\\-298.7367\\-89\\-53.71094\\-299.4325\\-89\\-55.66406\\-300.3156\\-89\\-57.61719\\-300.741\\-89\\-61.52344\\-301.4447\\-89\\-63.47656\\-301.9203\\-89\\-65.42969\\-302.234\\-89\\-69.33594\\-302.5377\\-89\\-73.24219\\-302.6028\\-89\\-77.14844\\-302.4898\\-89\\-79.10156\\-302.3442\\-89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "342" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "82" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-301.95\\-87\\-83.00781\\-301.5546\\-87\\-88.86719\\-300.6905\\-87\\-90.82031\\-300.3464\\-87\\-94.72656\\-299.0786\\-87\\-96.67969\\-298.5848\\-87\\-98.63281\\-297.6699\\-87\\-102.5391\\-296.3229\\-87\\-104.4922\\-295.3163\\-87\\-106.4453\\-294.6692\\-87\\-108.3984\\-293.5036\\-87\\-110.3516\\-292.543\\-87\\-110.973\\-292.0547\\-87\\-114.2578\\-289.9375\\-87\\-116.2109\\-288.8497\\-87\\-119.9166\\-286.1953\\-87\\-122.4828\\-284.2422\\-87\\-125.9766\\-281.3446\\-87\\-127.9297\\-279.5614\\-87\\-129.8828\\-277.5714\\-87\\-133.7891\\-273.7957\\-87\\-137.6953\\-269.518\\-87\\-140.1828\\-266.6641\\-87\\-141.6423\\-264.7109\\-87\\-142.9478\\-262.7578\\-87\\-143.5547\\-262.0254\\-87\\-145.8513\\-258.8516\\-87\\-148.4438\\-254.9453\\-87\\-149.6582\\-252.9922\\-87\\-150.5969\\-251.0391\\-87\\-151.965\\-249.0859\\-87\\-152.9833\\-247.1328\\-87\\-154.1466\\-245.1797\\-87\\-156.0903\\-241.2734\\-87\\-156.81\\-239.3203\\-87\\-157.9383\\-237.3672\\-87\\-158.7137\\-235.4141\\-87\\-159.829\\-233.4609\\-87\\-160.5195\\-231.5078\\-87\\-161.5221\\-229.5547\\-87\\-162.0854\\-227.6016\\-87\\-162.5398\\-225.6484\\-87\\-163.4294\\-223.6953\\-87\\-164.4088\\-219.7891\\-87\\-165.2007\\-217.8359\\-87\\-165.7986\\-215.8828\\-87\\-166.671\\-211.9766\\-87\\-167.2818\\-210.0234\\-87\\-167.6296\\-208.0703\\-87\\-168.07\\-204.1641\\-87\\-168.6059\\-198.3047\\-87\\-169.0313\\-194.3984\\-87\\-169.2755\\-190.4922\\-87\\-169.2518\\-186.5859\\-87\\-169.0607\\-182.6797\\-87\\-168.641\\-178.7734\\-87\\-168.1125\\-172.9141\\-87\\-167.7231\\-169.0078\\-87\\-167.4521\\-167.0547\\-87\\-167.03\\-165.1016\\-87\\-166.4975\\-163.1484\\-87\\-165.8045\\-159.2422\\-87\\-165.4084\\-157.2891\\-87\\-164.7181\\-155.3359\\-87\\-164.2012\\-153.3828\\-87\\-163.8028\\-151.4297\\-87\\-163.2146\\-149.4766\\-87\\-162.4627\\-147.5234\\-87\\-161.9725\\-145.5703\\-87\\-161.3622\\-143.6172\\-87\\-160.4553\\-141.6641\\-87\\-159.7545\\-139.7109\\-87\\-158.6393\\-137.7578\\-87\\-157.8182\\-135.8047\\-87\\-156.692\\-133.8516\\-87\\-155.8183\\-131.8984\\-87\\-154.7164\\-129.9453\\-87\\-153.7211\\-127.9922\\-87\\-150.9124\\-124.0859\\-87\\-149.6698\\-122.1328\\-87\\-148.1247\\-120.1797\\-87\\-146.3382\\-118.2266\\-87\\-144.3998\\-116.2734\\-87\\-143.5547\\-115.2896\\-87\\-140.6599\\-112.3672\\-87\\-138.463\\-110.4141\\-87\\-137.6953\\-109.5421\\-87\\-135.7422\\-107.8227\\-87\\-133.7891\\-106.2969\\-87\\-129.8828\\-103.4834\\-87\\-127.9297\\-101.8963\\-87\\-125.5412\\-100.6484\\-87\\-118.1641\\-96.42938\\-87\\-114.2578\\-94.71197\\-87\\-112.3047\\-93.97414\\-87\\-110.3516\\-93.38885\\-87\\-108.3984\\-92.5622\\-87\\-106.4453\\-92.03911\\-87\\-102.5391\\-90.79548\\-87\\-98.63281\\-89.87454\\-87\\-96.67969\\-89.53326\\-87\\-90.82031\\-88.32713\\-87\\-86.91406\\-87.91968\\-87\\-79.10156\\-87.4313\\-87\\-77.14844\\-87.19447\\-87\\-73.24219\\-87.10176\\-87\\-67.38281\\-87.23438\\-87\\-63.47656\\-87.53969\\-87\\-59.57031\\-87.72093\\-87\\-55.66406\\-88.01332\\-87\\-51.75781\\-88.48986\\-87\\-47.85156\\-89.35461\\-87\\-43.94531\\-90.12535\\-87\\-41.99219\\-90.63492\\-87\\-40.03906\\-91.4294\\-87\\-36.13281\\-92.66448\\-87\\-34.17969\\-93.61306\\-87\\-32.22656\\-94.21235\\-87\\-28.32031\\-96.25391\\-87\\-26.36719\\-97.53095\\-87\\-24.41406\\-98.68697\\-87\\-21.95351\\-100.6484\\-87\\-20.50781\\-102.0013\\-87\\-18.11801\\-104.5547\\-87\\-16.60156\\-106.5639\\-87\\-15.32219\\-108.4609\\-87\\-13.90122\\-110.4141\\-87\\-12.8768\\-112.3672\\-87\\-10.44922\\-116.2734\\-87\\-9.427584\\-118.2266\\-87\\-8.28528\\-120.1797\\-87\\-7.370722\\-122.1328\\-87\\-3.431659\\-127.9922\\-87\\-1.726974\\-129.9453\\-87\\-0.9765625\\-130.9219\\-87\\0.9765625\\-131.7129\\-87\\2.929688\\-130.2069\\-87\\4.327948\\-127.9922\\-87\\5.379512\\-126.0391\\-87\\6.11764\\-124.0859\\-87\\7.284628\\-122.1328\\-87\\8.163061\\-120.1797\\-87\\10.47138\\-116.2734\\-87\\11.84264\\-114.3203\\-87\\12.69531\\-112.8169\\-87\\14.37988\\-110.4141\\-87\\15.53858\\-108.4609\\-87\\19.09722\\-104.5547\\-87\\20.79613\\-102.6016\\-87\\22.89807\\-100.6484\\-87\\26.36719\\-97.5284\\-87\\28.32031\\-95.98264\\-87\\30.27344\\-94.81779\\-87\\33.2955\\-92.83594\\-87\\36.66992\\-90.88281\\-87\\40.03906\\-89.40142\\-87\\41.99219\\-88.44551\\-87\\45.89844\\-87.3265\\-87\\47.85156\\-86.65844\\-87\\53.71094\\-85.51563\\-87\\57.61719\\-84.88847\\-87\\61.52344\\-84.5722\\-87\\67.38281\\-84.4375\\-87\\71.28906\\-84.47174\\-87\\75.19531\\-84.80889\\-87\\79.10156\\-85.34121\\-87\\83.00781\\-85.78448\\-87\\84.96094\\-86.10654\\-87\\86.91406\\-86.30196\\-87\\88.86719\\-86.62728\\-87\\92.77344\\-87.57374\\-87\\96.67969\\-88.21631\\-87\\100.5859\\-89.39642\\-87\\102.5391\\-89.91936\\-87\\104.4922\\-90.56666\\-87\\108.3984\\-92.10775\\-87\\110.3516\\-92.72412\\-87\\112.3047\\-93.60763\\-87\\114.2578\\-94.21333\\-87\\116.2109\\-95.37069\\-87\\118.1641\\-96.22274\\-87\\120.1172\\-97.38659\\-87\\122.0703\\-98.34457\\-87\\124.0234\\-99.57627\\-87\\125.9766\\-100.6067\\-87\\127.9297\\-101.8358\\-87\\129.8828\\-103.4006\\-87\\133.7891\\-106.2731\\-87\\135.7422\\-107.8932\\-87\\137.6953\\-109.7175\\-87\\138.2948\\-110.4141\\-87\\140.3256\\-112.3672\\-87\\142.0975\\-114.3203\\-87\\143.6571\\-116.2734\\-87\\145.0763\\-118.2266\\-87\\148.2408\\-122.1328\\-87\\149.4879\\-124.0859\\-87\\150.5657\\-126.0391\\-87\\151.983\\-127.9922\\-87\\155.4243\\-133.8516\\-87\\157.1065\\-137.7578\\-87\\158.0707\\-139.7109\\-87\\158.8937\\-141.6641\\-87\\159.8764\\-143.6172\\-87\\160.4718\\-145.5703\\-87\\161.3571\\-147.5234\\-87\\161.9153\\-149.4766\\-87\\162.7276\\-153.3828\\-87\\163.4513\\-155.3359\\-87\\163.849\\-157.2891\\-87\\164.4768\\-161.1953\\-87\\164.8702\\-163.1484\\-87\\165.4061\\-165.1016\\-87\\165.6849\\-167.0547\\-87\\166.4919\\-174.8672\\-87\\166.9693\\-178.7734\\-87\\167.2871\\-182.6797\\-87\\167.5199\\-188.5391\\-87\\167.6099\\-194.3984\\-87\\167.6062\\-202.2109\\-87\\167.4338\\-208.0703\\-87\\167.2175\\-211.9766\\-87\\165.7395\\-223.6953\\-87\\165.3856\\-225.6484\\-87\\164.736\\-227.6016\\-87\\164.2589\\-229.5547\\-87\\163.9058\\-231.5078\\-87\\163.3719\\-233.4609\\-87\\162.5682\\-235.4141\\-87\\161.5617\\-239.3203\\-87\\160.536\\-241.2734\\-87\\159.8326\\-243.2266\\-87\\158.5855\\-245.1797\\-87\\157.7402\\-247.1328\\-87\\156.502\\-249.0859\\-87\\155.6279\\-251.0391\\-87\\153.3203\\-254.673\\-87\\149.4141\\-260.0723\\-87\\147.4609\\-262.6914\\-87\\143.5547\\-267.3026\\-87\\140.5995\\-270.5703\\-87\\139.6484\\-271.4685\\-87\\137.6953\\-273.5716\\-87\\134.8159\\-276.4297\\-87\\133.7891\\-277.2971\\-87\\130.4321\\-280.3359\\-87\\129.8828\\-280.905\\-87\\127.9297\\-282.4544\\-87\\125.9766\\-283.687\\-87\\122.0703\\-286.9027\\-87\\120.1172\\-288.2045\\-87\\118.1641\\-289.3014\\-87\\116.2109\\-290.6293\\-87\\114.2578\\-291.6786\\-87\\112.3047\\-292.9773\\-87\\110.3516\\-294.0938\\-87\\108.3984\\-294.9844\\-87\\106.4453\\-295.6913\\-87\\104.4922\\-296.6759\\-87\\102.5391\\-297.2688\\-87\\100.5859\\-298.2502\\-87\\96.67969\\-299.4066\\-87\\94.72656\\-300.1621\\-87\\92.77344\\-300.5582\\-87\\86.91406\\-301.3855\\-87\\83.00781\\-302.0349\\-87\\79.10156\\-302.3664\\-87\\75.19531\\-302.4189\\-87\\71.28906\\-302.302\\-87\\67.38281\\-301.9063\\-87\\65.42969\\-301.5546\\-87\\59.57031\\-300.6698\\-87\\57.61719\\-300.2462\\-87\\55.66406\\-299.4311\\-87\\53.71094\\-298.8183\\-87\\51.75781\\-298.0088\\-87\\49.80469\\-297.0297\\-87\\47.85156\\-296.2511\\-87\\45.89844\\-295.1125\\-87\\43.94531\\-294.1528\\-87\\41.99219\\-292.8612\\-87\\36.13281\\-288.1733\\-87\\34.00143\\-286.1953\\-87\\30.70665\\-282.2891\\-87\\28.32031\\-279.6927\\-87\\25.87544\\-276.4297\\-87\\24.78299\\-274.4766\\-87\\24.41406\\-274.0683\\-87\\22.46094\\-271.1273\\-87\\21.98882\\-270.5703\\-87\\20.9763\\-268.6172\\-87\\19.75994\\-266.6641\\-87\\19.11734\\-264.7109\\-87\\17.99581\\-262.7578\\-87\\17.3133\\-260.8047\\-87\\16.22498\\-258.8516\\-87\\15.51589\\-256.8984\\-87\\12.77043\\-251.0391\\-87\\11.35578\\-249.0859\\-87\\10.74219\\-248.3856\\-87\\8.789063\\-247.0694\\-87\\6.835938\\-246.2015\\-87\\4.882813\\-245.8618\\-87\\0.9765625\\-245.7929\\-87\\-0.9765625\\-245.8711\\-87\\-6.835938\\-248.1008\\-87\\-8.789063\\-249.5742\\-87\\-10.74219\\-251.4601\\-87\\-11.86294\\-252.9922\\-87\\-13.10532\\-254.9453\\-87\\-13.99075\\-256.8984\\-87\\-15.13991\\-258.8516\\-87\\-16.04269\\-260.8047\\-87\\-17.31451\\-262.7578\\-87\\-18.18427\\-264.7109\\-87\\-19.39087\\-266.6641\\-87\\-20.32955\\-268.6172\\-87\\-21.64132\\-270.5703\\-87\\-23.11779\\-272.5234\\-87\\-24.36188\\-274.4766\\-87\\-25.70522\\-276.4297\\-87\\-28.32031\\-279.7856\\-87\\-30.6866\\-282.2891\\-87\\-33.80801\\-286.1953\\-87\\-36.13281\\-288.4588\\-87\\-38.08594\\-289.9632\\-87\\-41.99219\\-293.2393\\-87\\-43.94531\\-294.6736\\-87\\-45.89844\\-295.6012\\-87\\-47.85156\\-296.7499\\-87\\-49.80469\\-297.5354\\-87\\-51.75781\\-298.6258\\-87\\-53.71094\\-299.2766\\-87\\-55.66406\\-300.1752\\-87\\-57.61719\\-300.6427\\-87\\-61.52344\\-301.319\\-87\\-65.42969\\-302.088\\-87\\-67.38281\\-302.3152\\-87\\-71.28906\\-302.4978\\-87\\-73.24219\\-302.5179\\-87\\-77.14844\\-302.3884\\-87\\-79.10156\\-302.2232\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "333" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "83" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-302.0735\\-85\\-83.00781\\-301.4202\\-85\\-86.91406\\-300.9008\\-85\\-90.82031\\-300.2229\\-85\\-92.77344\\-299.5461\\-85\\-96.67969\\-298.4503\\-85\\-98.63281\\-297.4965\\-85\\-102.5391\\-296.1337\\-85\\-104.4922\\-295.1884\\-85\\-106.4453\\-294.5411\\-85\\-108.3984\\-293.3349\\-85\\-110.3516\\-292.3109\\-85\\-113.7181\\-290.1016\\-85\\-114.2578\\-289.6652\\-85\\-116.2109\\-288.6679\\-85\\-118.1641\\-287.2744\\-85\\-120.1172\\-285.7268\\-85\\-124.0234\\-282.7558\\-85\\-125.9766\\-281.1497\\-85\\-127.9297\\-279.3659\\-85\\-129.8828\\-277.392\\-85\\-131.8359\\-275.5487\\-85\\-134.7973\\-272.5234\\-85\\-136.5412\\-270.5703\\-85\\-139.8959\\-266.6641\\-85\\-142.7532\\-262.7578\\-85\\-143.5547\\-261.756\\-85\\-146.9038\\-256.8984\\-85\\-148.3311\\-254.9453\\-85\\-150.5172\\-251.0391\\-85\\-151.8524\\-249.0859\\-85\\-152.8416\\-247.1328\\-85\\-154.0864\\-245.1797\\-85\\-154.9871\\-243.2266\\-85\\-156.0658\\-241.2734\\-85\\-156.7219\\-239.3203\\-85\\-157.887\\-237.3672\\-85\\-158.6398\\-235.4141\\-85\\-159.7634\\-233.4609\\-85\\-160.4452\\-231.5078\\-85\\-161.449\\-229.5547\\-85\\-162.0558\\-227.6016\\-85\\-162.4874\\-225.6484\\-85\\-163.3478\\-223.6953\\-85\\-163.9237\\-221.7422\\-85\\-164.3494\\-219.7891\\-85\\-165.0912\\-217.8359\\-85\\-165.7336\\-215.8828\\-85\\-166.5728\\-211.9766\\-85\\-167.1819\\-210.0234\\-85\\-167.5698\\-208.0703\\-85\\-168.0279\\-204.1641\\-85\\-168.7589\\-196.3516\\-85\\-168.9853\\-194.3984\\-85\\-169.2397\\-190.4922\\-85\\-169.2518\\-186.5859\\-85\\-169.1043\\-182.6797\\-85\\-168.5002\\-176.8203\\-85\\-167.9982\\-170.9609\\-85\\-167.589\\-167.0547\\-85\\-167.2702\\-165.1016\\-85\\-166.7517\\-163.1484\\-85\\-166.3392\\-161.1953\\-85\\-165.648\\-157.2891\\-85\\-165.1611\\-155.3359\\-85\\-164.4714\\-153.3828\\-85\\-163.6258\\-149.4766\\-85\\-162.8399\\-147.5234\\-85\\-162.2392\\-145.5703\\-85\\-161.7902\\-143.6172\\-85\\-159.4256\\-137.7578\\-85\\-158.3368\\-135.8047\\-85\\-157.4673\\-133.8516\\-85\\-156.3358\\-131.8984\\-85\\-155.5272\\-129.9453\\-85\\-153.3203\\-126.3074\\-85\\-151.8621\\-124.0859\\-85\\-150.3641\\-122.1328\\-85\\-149.4141\\-120.6781\\-85\\-147.5042\\-118.2266\\-85\\-145.8256\\-116.2734\\-85\\-142.094\\-112.3672\\-85\\-139.6484\\-109.9604\\-85\\-137.6953\\-108.241\\-85\\-135.4797\\-106.5078\\-85\\-133.7891\\-105.4083\\-85\\-131.8359\\-103.7064\\-85\\-129.8828\\-102.183\\-85\\-125.9766\\-99.79311\\-85\\-124.0234\\-98.77449\\-85\\-120.1172\\-96.40673\\-85\\-118.1641\\-95.51968\\-85\\-116.2109\\-94.50658\\-85\\-112.3047\\-93.10009\\-85\\-110.3516\\-92.19567\\-85\\-108.3984\\-91.49225\\-85\\-106.4453\\-90.68153\\-85\\-104.4922\\-90.18153\\-85\\-100.5859\\-89.34821\\-85\\-96.67969\\-88.40162\\-85\\-94.72656\\-88.06088\\-85\\-88.86719\\-87.3125\\-85\\-86.91406\\-86.85347\\-85\\-81.05469\\-86.17361\\-85\\-75.19531\\-85.96461\\-85\\-69.33594\\-85.98595\\-85\\-63.47656\\-86.20229\\-85\\-57.61719\\-86.71875\\-85\\-55.66406\\-87.1489\\-85\\-47.85156\\-88.147\\-85\\-43.94531\\-88.93841\\-85\\-41.99219\\-89.55381\\-85\\-38.08594\\-90.66844\\-85\\-36.13281\\-91.69441\\-85\\-34.17969\\-92.16885\\-85\\-32.22656\\-93.08656\\-85\\-30.27344\\-93.88593\\-85\\-26.36719\\-95.92704\\-85\\-24.41406\\-97.43646\\-85\\-22.46094\\-99.12306\\-85\\-20.50781\\-100.3781\\-85\\-18.55469\\-102.3032\\-85\\-16.60156\\-104.5666\\-85\\-15.32813\\-106.5078\\-85\\-13.88451\\-108.4609\\-85\\-12.79386\\-110.4141\\-85\\-10.23888\\-114.3203\\-85\\-8.079529\\-118.2266\\-85\\-7.106236\\-120.1797\\-85\\-5.817282\\-122.1328\\-85\\-4.27132\\-124.0859\\-85\\-2.929688\\-126.2721\\-85\\-0.9765625\\-127.7083\\-85\\0.9765625\\-128.0736\\-85\\2.929688\\-126.6759\\-85\\3.348214\\-126.0391\\-85\\4.199219\\-124.0859\\-85\\5.449567\\-122.1328\\-85\\6.338266\\-120.1797\\-85\\7.642663\\-118.2266\\-85\\8.53056\\-116.2734\\-85\\10.74219\\-112.8805\\-85\\12.55446\\-110.4141\\-85\\13.62581\\-108.4609\\-85\\15.26663\\-106.5078\\-85\\18.55469\\-102.9866\\-85\\20.82689\\-100.6484\\-85\\22.46094\\-99.21332\\-85\\24.41406\\-97.37943\\-85\\26.36719\\-95.68853\\-85\\28.32031\\-94.50133\\-85\\30.78676\\-92.83594\\-85\\34.17969\\-90.78242\\-85\\36.13281\\-89.87186\\-85\\38.08594\\-88.76549\\-85\\41.99219\\-87.35217\\-85\\43.94531\\-86.49568\\-85\\45.89844\\-86.04954\\-85\\47.85156\\-85.73179\\-85\\49.80469\\-84.92106\\-85\\51.75781\\-84.54213\\-85\\55.66406\\-84.09245\\-85\\57.61719\\-83.7636\\-85\\59.57031\\-83.61869\\-85\\67.38281\\-83.38507\\-85\\69.33594\\-83.36893\\-85\\75.19531\\-83.86872\\-85\\77.14844\\-84.12524\\-85\\81.05469\\-84.43218\\-85\\83.00781\\-84.65176\\-85\\86.91406\\-85.40022\\-85\\88.86719\\-85.89787\\-85\\92.77344\\-86.51252\\-85\\94.72656\\-86.93654\\-85\\96.67969\\-87.57807\\-85\\100.5859\\-88.30953\\-85\\104.4922\\-89.73114\\-85\\106.4453\\-90.31426\\-85\\110.3516\\-91.98917\\-85\\112.3047\\-92.59544\\-85\\114.2578\\-93.54046\\-85\\116.2109\\-94.3158\\-85\\118.1641\\-95.46568\\-85\\120.1172\\-96.34459\\-85\\125.9766\\-99.82162\\-85\\127.9297\\-101.1291\\-85\\129.8828\\-102.3214\\-85\\131.8359\\-103.8413\\-85\\134.9626\\-106.5078\\-85\\137.6953\\-108.9063\\-85\\141.0404\\-112.3672\\-85\\143.5547\\-115.3052\\-85\\145.9284\\-118.2266\\-85\\147.4609\\-120.2524\\-85\\150.0498\\-124.0859\\-85\\151.3672\\-126.3519\\-85\\153.7228\\-129.9453\\-85\\154.701\\-131.8984\\-85\\155.8821\\-133.8516\\-85\\156.5524\\-135.8047\\-85\\157.6335\\-137.7578\\-85\\158.3499\\-139.7109\\-85\\159.4154\\-141.6641\\-85\\160.7489\\-145.5703\\-85\\161.6244\\-147.5234\\-85\\162.3831\\-151.4297\\-85\\162.9118\\-153.3828\\-85\\163.5957\\-155.3359\\-85\\164.5058\\-161.1953\\-85\\165.426\\-165.1016\\-85\\165.7088\\-167.0547\\-85\\166.4568\\-174.8672\\-85\\166.8683\\-178.7734\\-85\\167.2175\\-182.6797\\-85\\167.4338\\-188.5391\\-85\\167.5374\\-194.3984\\-85\\167.5046\\-202.2109\\-85\\167.4116\\-206.1172\\-85\\167.073\\-211.9766\\-85\\165.6672\\-223.6953\\-85\\165.2629\\-225.6484\\-85\\164.6369\\-227.6016\\-85\\163.8292\\-231.5078\\-85\\163.2561\\-233.4609\\-85\\162.4962\\-235.4141\\-85\\162.0558\\-237.3672\\-85\\161.4583\\-239.3203\\-85\\160.4452\\-241.2734\\-85\\159.7301\\-243.2266\\-85\\158.4967\\-245.1797\\-85\\157.6233\\-247.1328\\-85\\156.4097\\-249.0859\\-85\\155.5213\\-251.0391\\-85\\153.3203\\-254.4661\\-85\\150.2114\\-258.8516\\-85\\148.6603\\-260.8047\\-85\\147.4609\\-262.4749\\-85\\143.5547\\-267.1406\\-85\\140.4284\\-270.5703\\-85\\138.453\\-272.5234\\-85\\137.6953\\-273.4023\\-85\\134.583\\-276.4297\\-85\\133.7891\\-277.0945\\-85\\129.8828\\-280.6793\\-85\\127.7875\\-282.2891\\-85\\125.9766\\-283.4847\\-85\\122.0703\\-286.7096\\-85\\120.1172\\-287.8828\\-85\\116.2109\\-290.4206\\-85\\114.2578\\-291.4407\\-85\\112.3047\\-292.8037\\-85\\108.3984\\-294.8562\\-85\\106.4453\\-295.486\\-85\\104.4922\\-296.5321\\-85\\102.5391\\-297.1272\\-85\\100.5859\\-298.0495\\-85\\98.63281\\-298.7329\\-85\\96.67969\\-299.2801\\-85\\94.72656\\-300.0158\\-85\\92.77344\\-300.4695\\-85\\90.82031\\-300.7927\\-85\\84.96094\\-301.5816\\-85\\83.00781\\-301.9211\\-85\\79.10156\\-302.2787\\-85\\75.19531\\-302.325\\-85\\71.28906\\-302.1985\\-85\\67.38281\\-301.7809\\-85\\65.42969\\-301.4447\\-85\\59.57031\\-300.618\\-85\\57.61719\\-300.1548\\-85\\55.66406\\-299.3404\\-85\\53.71094\\-298.7577\\-85\\51.75781\\-297.9217\\-85\\49.80469\\-296.9807\\-85\\47.85156\\-296.1607\\-85\\43.94531\\-294.032\\-85\\41.99219\\-292.7816\\-85\\38.6734\\-290.1016\\-85\\36.39379\\-288.1484\\-85\\34.23762\\-286.1953\\-85\\32.54958\\-284.2422\\-85\\28.32031\\-279.6516\\-85\\25.87544\\-276.4297\\-85\\24.73461\\-274.4766\\-85\\21.87746\\-270.5703\\-85\\19.64043\\-266.6641\\-85\\18.94947\\-264.7109\\-85\\17.79701\\-262.7578\\-85\\16.9987\\-260.8047\\-85\\15.86359\\-258.8516\\-85\\15.05927\\-256.8984\\-85\\13.91258\\-254.9453\\-85\\12.91689\\-252.9922\\-85\\10.74219\\-250.5092\\-85\\8.789063\\-249.3634\\-85\\4.882813\\-248.8981\\-85\\2.929688\\-248.8196\\-85\\-0.9765625\\-249.0447\\-85\\-2.929688\\-249.2487\\-85\\-4.882813\\-249.6457\\-85\\-6.835938\\-250.4469\\-85\\-8.789063\\-251.5826\\-85\\-10.74219\\-253.133\\-85\\-12.17004\\-254.9453\\-85\\-13.45868\\-256.8984\\-85\\-14.38752\\-258.8516\\-85\\-16.60156\\-262.5442\\-85\\-17.78615\\-264.7109\\-85\\-19.03955\\-266.6641\\-85\\-19.941\\-268.6172\\-85\\-22.77261\\-272.5234\\-85\\-24.01456\\-274.4766\\-85\\-25.5028\\-276.4297\\-85\\-28.32031\\-279.9535\\-85\\-30.56483\\-282.2891\\-85\\-33.80238\\-286.1953\\-85\\-36.13281\\-288.4176\\-85\\-38.08594\\-289.9031\\-85\\-41.99219\\-293.1554\\-85\\-43.94531\\-294.5872\\-85\\-45.89844\\-295.4796\\-85\\-47.85156\\-296.6519\\-85\\-49.80469\\-297.3853\\-85\\-51.75781\\-298.5137\\-85\\-53.71094\\-299.1444\\-85\\-55.66406\\-299.9902\\-85\\-57.61719\\-300.5433\\-85\\-59.57031\\-300.9131\\-85\\-63.47656\\-301.516\\-85\\-67.38281\\-302.1761\\-85\\-71.28906\\-302.3884\\-85\\-73.24219\\-302.4189\\-85\\-77.14844\\-302.2476\\-85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "315" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "84" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-301.9056\\-83\\-81.05469\\-301.5671\\-83\\-86.91406\\-300.8099\\-83\\-88.86719\\-300.5163\\-83\\-90.82031\\-300.0941\\-83\\-92.77344\\-299.391\\-83\\-96.67969\\-298.3108\\-83\\-98.63281\\-297.3484\\-83\\-100.5859\\-296.7561\\-83\\-104.4922\\-295.0814\\-83\\-106.4453\\-294.3672\\-83\\-106.9578\\-294.0078\\-83\\-110.3037\\-292.0547\\-83\\-113.4171\\-290.1016\\-83\\-114.2578\\-289.4655\\-83\\-116.2109\\-288.4564\\-83\\-118.1641\\-287.0826\\-83\\-122.0703\\-283.9423\\-83\\-125.9766\\-280.9538\\-83\\-128.7539\\-278.3828\\-83\\-129.8828\\-277.2124\\-83\\-131.8359\\-275.3625\\-83\\-134.6071\\-272.5234\\-83\\-136.3295\\-270.5703\\-83\\-139.5452\\-266.6641\\-83\\-141.0812\\-264.7109\\-83\\-144.0398\\-260.8047\\-83\\-145.3081\\-258.8516\\-83\\-148.2077\\-254.9453\\-83\\-149.2513\\-252.9922\\-83\\-150.4328\\-251.0391\\-83\\-151.7286\\-249.0859\\-83\\-152.7319\\-247.1328\\-83\\-154.0246\\-245.1797\\-83\\-154.8984\\-243.2266\\-83\\-156.0059\\-241.2734\\-83\\-156.6368\\-239.3203\\-83\\-157.8217\\-237.3672\\-83\\-158.562\\-235.4141\\-83\\-159.6994\\-233.4609\\-83\\-160.3777\\-231.5078\\-83\\-161.3571\\-229.5547\\-83\\-162.0135\\-227.6016\\-83\\-162.4412\\-225.6484\\-83\\-163.2561\\-223.6953\\-83\\-163.8682\\-221.7422\\-83\\-164.2891\\-219.7891\\-83\\-165.66\\-215.8828\\-83\\-166.4829\\-211.9766\\-83\\-167.0736\\-210.0234\\-83\\-167.4956\\-208.0703\\-83\\-167.9804\\-204.1641\\-83\\-168.5002\\-198.3047\\-83\\-169.076\\-192.4453\\-83\\-169.2397\\-188.5391\\-83\\-169.1876\\-184.6328\\-83\\-169.1043\\-182.6797\\-83\\-168.7725\\-178.7734\\-83\\-168.5561\\-176.8203\\-83\\-167.6998\\-167.0547\\-83\\-167.3996\\-165.1016\\-83\\-166.5323\\-161.1953\\-83\\-165.4644\\-155.3359\\-83\\-164.7772\\-153.3828\\-83\\-164.2545\\-151.4297\\-83\\-163.8661\\-149.4766\\-83\\-163.3085\\-147.5234\\-83\\-162.5065\\-145.5703\\-83\\-161.5248\\-141.6641\\-83\\-160.6158\\-139.7109\\-83\\-159.9235\\-137.7578\\-83\\-158.8518\\-135.8047\\-83\\-157.959\\-133.8516\\-83\\-156.8112\\-131.8984\\-83\\-156.0484\\-129.9453\\-83\\-153.8928\\-126.0391\\-83\\-152.4682\\-124.0859\\-83\\-149.8473\\-120.1797\\-83\\-148.3251\\-118.2266\\-83\\-145.5078\\-114.9307\\-83\\-141.1865\\-110.4141\\-83\\-139.6484\\-108.9135\\-83\\-137.6953\\-107.2303\\-83\\-134.3839\\-104.5547\\-83\\-131.7792\\-102.6016\\-83\\-127.9297\\-99.9248\\-83\\-124.0234\\-97.73802\\-83\\-122.0703\\-96.48843\\-83\\-120.1172\\-95.52827\\-83\\-118.1641\\-94.46354\\-83\\-114.2578\\-92.72743\\-83\\-110.3516\\-91.28665\\-83\\-108.3984\\-90.34706\\-83\\-102.5391\\-88.65842\\-83\\-94.72656\\-87.23856\\-83\\-90.82031\\-86.41951\\-83\\-86.91406\\-85.83724\\-83\\-83.00781\\-85.48167\\-83\\-81.05469\\-84.98241\\-83\\-79.10156\\-84.81744\\-83\\-75.19531\\-84.62865\\-83\\-71.28906\\-84.60393\\-83\\-69.33594\\-84.64838\\-83\\-63.47656\\-85.10122\\-83\\-61.52344\\-85.43034\\-83\\-57.61719\\-85.69161\\-83\\-55.66406\\-85.89385\\-83\\-53.71094\\-86.23595\\-83\\-51.75781\\-86.45998\\-83\\-48.64211\\-86.97656\\-83\\-43.94531\\-87.82481\\-83\\-40.03906\\-88.83546\\-83\\-38.08594\\-89.56409\\-83\\-36.13281\\-90.13978\\-83\\-34.30176\\-90.88281\\-83\\-30.27344\\-92.63417\\-83\\-26.36719\\-94.57677\\-83\\-24.41406\\-95.74237\\-83\\-23.12859\\-96.74219\\-83\\-20.82376\\-98.69531\\-83\\-18.55469\\-100.9207\\-83\\-16.60156\\-103.0047\\-83\\-15.30198\\-104.5547\\-83\\-13.8718\\-106.5078\\-83\\-11.3801\\-110.4141\\-83\\-10.06944\\-112.3672\\-83\\-5.530895\\-120.1797\\-83\\-2.929688\\-123.1405\\-83\\-0.9765625\\-124.9315\\-83\\0.9765625\\-124.8909\\-83\\2.929688\\-122.7348\\-83\\3.352239\\-122.1328\\-83\\4.347581\\-120.1797\\-83\\6.526067\\-116.2734\\-83\\8.789063\\-112.8027\\-83\\10.5523\\-110.4141\\-83\\11.71875\\-108.4609\\-83\\13.29985\\-106.5078\\-83\\14.983\\-104.5547\\-83\\16.60156\\-102.8066\\-83\\20.79102\\-98.69531\\-83\\24.41406\\-95.47691\\-83\\26.36719\\-94.0629\\-83\\32.22656\\-90.26563\\-83\\34.17969\\-89.32198\\-83\\36.13281\\-88.23328\\-83\\41.99219\\-85.97813\\-83\\43.94531\\-85.45313\\-83\\45.89844\\-84.70289\\-83\\47.85156\\-84.21642\\-83\\49.80469\\-83.8987\\-83\\53.71094\\-83.13028\\-83\\55.66406\\-82.7995\\-83\\57.61719\\-82.62018\\-83\\61.52344\\-82.45908\\-83\\65.42969\\-82.39893\\-83\\69.33594\\-82.39423\\-83\\71.28906\\-82.50349\\-83\\75.19531\\-82.83563\\-83\\79.10156\\-83.36105\\-83\\83.00781\\-83.83429\\-83\\88.86719\\-84.75775\\-83\\90.82031\\-85.33382\\-83\\92.77344\\-85.77927\\-83\\96.67969\\-86.55904\\-83\\100.5859\\-87.71902\\-83\\102.5391\\-88.16048\\-83\\106.4453\\-89.59165\\-83\\108.3984\\-90.19986\\-83\\112.3047\\-91.88457\\-83\\114.2578\\-92.58276\\-83\\116.2109\\-93.63811\\-83\\118.1641\\-94.54294\\-83\\120.1172\\-95.63962\\-83\\122.0703\\-96.56671\\-83\\125.9766\\-99.1729\\-83\\127.9297\\-100.1817\\-83\\131.2328\\-102.6016\\-83\\133.7412\\-104.5547\\-83\\137.6953\\-108.0625\\-83\\140.0905\\-110.4141\\-83\\141.8067\\-112.3672\\-83\\143.5547\\-114.5138\\-83\\144.8775\\-116.2734\\-83\\148.03\\-120.1797\\-83\\149.4141\\-122.3582\\-83\\150.3906\\-124.0859\\-83\\151.7454\\-126.0391\\-83\\154.127\\-129.9453\\-83\\156.1707\\-133.8516\\-83\\156.9132\\-135.8047\\-83\\157.9549\\-137.7578\\-83\\158.6882\\-139.7109\\-83\\159.7385\\-141.6641\\-83\\160.2997\\-143.6172\\-83\\161.8065\\-147.5234\\-83\\162.4835\\-151.4297\\-83\\163.6766\\-155.3359\\-83\\164.5146\\-161.1953\\-83\\165.426\\-165.1016\\-83\\165.6986\\-167.0547\\-83\\166.2585\\-172.9141\\-83\\166.9388\\-180.7266\\-83\\167.2054\\-184.6328\\-83\\167.2871\\-186.5859\\-83\\167.4434\\-194.3984\\-83\\167.4241\\-200.2578\\-83\\167.2982\\-206.1172\\-83\\167.073\\-210.0234\\-83\\166.7026\\-213.9297\\-83\\165.857\\-221.7422\\-83\\165.5853\\-223.6953\\-83\\165.1198\\-225.6484\\-83\\164.5058\\-227.6016\\-83\\163.7612\\-231.5078\\-83\\162.4165\\-235.4141\\-83\\161.9962\\-237.3672\\-83\\161.3164\\-239.3203\\-83\\160.3504\\-241.2734\\-83\\159.6089\\-243.2266\\-83\\158.3951\\-245.1797\\-83\\157.4857\\-247.1328\\-83\\156.3228\\-249.0859\\-83\\155.3615\\-251.0391\\-83\\154.1969\\-252.9922\\-83\\152.7894\\-254.9453\\-83\\150.1098\\-258.8516\\-83\\147.4609\\-262.3038\\-83\\145.3897\\-264.7109\\-83\\142.1606\\-268.6172\\-83\\140.2927\\-270.5703\\-83\\139.6484\\-271.1129\\-83\\137.6953\\-273.221\\-83\\134.4132\\-276.4297\\-83\\129.8828\\-280.4117\\-83\\127.4371\\-282.2891\\-83\\125.9766\\-283.3078\\-83\\122.0703\\-286.4673\\-83\\120.1172\\-287.6117\\-83\\118.1641\\-288.999\\-83\\114.2578\\-291.2527\\-83\\112.3047\\-292.6204\\-83\\110.3516\\-293.5486\\-83\\108.3984\\-294.7231\\-83\\106.4453\\-295.3246\\-83\\104.4922\\-296.3556\\-83\\102.5391\\-297.003\\-83\\98.63281\\-298.6199\\-83\\96.67969\\-299.1485\\-83\\94.57465\\-299.8672\\-83\\92.77344\\-300.3675\\-83\\88.86719\\-300.9908\\-83\\84.96094\\-301.4646\\-83\\81.05469\\-302.0201\\-83\\79.10156\\-302.1505\\-83\\75.19531\\-302.2123\\-83\\71.28906\\-302.0608\\-83\\69.33594\\-301.8906\\-83\\59.57031\\-300.5468\\-83\\57.61719\\-300.0569\\-83\\55.66406\\-299.2597\\-83\\53.71094\\-298.7004\\-83\\47.85156\\-296.0617\\-83\\44.09124\\-294.0078\\-83\\41.99219\\-292.6926\\-83\\38.78021\\-290.1016\\-83\\34.3623\\-286.1953\\-83\\32.63041\\-284.2422\\-83\\28.32031\\-279.6128\\-83\\25.83764\\-276.4297\\-83\\24.625\\-274.4766\\-83\\23.2433\\-272.5234\\-83\\21.72998\\-270.5703\\-83\\20.50781\\-268.6051\\-83\\19.53125\\-266.6641\\-83\\18.6579\\-264.7109\\-83\\14.64844\\-257.4864\\-83\\12.69531\\-254.6587\\-83\\10.74219\\-252.786\\-83\\8.789063\\-252.0156\\-83\\6.835938\\-251.5844\\-83\\2.929688\\-251.3899\\-83\\0.9765625\\-251.4968\\-83\\-0.9765625\\-251.7201\\-83\\-2.929688\\-252.1444\\-83\\-6.835938\\-252.8312\\-83\\-10.74219\\-254.6893\\-83\\-12.69531\\-257.1426\\-83\\-15.02623\\-260.8047\\-83\\-16.07771\\-262.7578\\-83\\-17.42608\\-264.7109\\-83\\-18.47076\\-266.6641\\-83\\-19.63337\\-268.6172\\-83\\-22.2853\\-272.5234\\-83\\-24.41406\\-275.3035\\-83\\-28.32031\\-280.1218\\-83\\-32.22656\\-284.3381\\-83\\-33.80238\\-286.1953\\-83\\-36.13281\\-288.3594\\-83\\-38.08594\\-289.817\\-83\\-41.99219\\-293.0818\\-83\\-43.94531\\-294.4995\\-83\\-45.89844\\-295.3656\\-83\\-47.85156\\-296.5541\\-83\\-49.80469\\-297.2572\\-83\\-51.75781\\-298.3782\\-83\\-53.71094\\-299.0233\\-83\\-55.89489\\-299.8672\\-83\\-57.61719\\-300.4413\\-83\\-59.57031\\-300.8154\\-83\\-63.47656\\-301.3722\\-83\\-67.38281\\-301.9931\\-83\\-71.28906\\-302.2581\\-83\\-73.24219\\-302.2818\\-83\\-77.14844\\-302.1003\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "311" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "85" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-301.9211\\-81\\-81.05469\\-301.4229\\-81\\-84.96094\\-300.9774\\-81\\-88.86719\\-300.4176\\-81\\-90.82031\\-299.9198\\-81\\-92.77344\\-299.2366\\-81\\-94.72656\\-298.7561\\-81\\-96.67969\\-298.1258\\-81\\-98.63281\\-297.2157\\-81\\-100.5859\\-296.6665\\-81\\-102.5391\\-295.702\\-81\\-104.4922\\-294.9722\\-81\\-106.4453\\-294.1205\\-81\\-108.3984\\-293.0094\\-81\\-110.3516\\-291.7292\\-81\\-112.3047\\-290.657\\-81\\-114.2578\\-289.2898\\-81\\-116.2109\\-288.2223\\-81\\-118.1641\\-286.8937\\-81\\-122.0703\\-283.6973\\-81\\-125.9766\\-280.7336\\-81\\-128.52\\-278.3828\\-81\\-131.8359\\-275.168\\-81\\-134.3994\\-272.5234\\-81\\-136.0802\\-270.5703\\-81\\-142.4154\\-262.7578\\-81\\-143.8427\\-260.8047\\-81\\-145.0806\\-258.8516\\-81\\-148.0705\\-254.9453\\-81\\-149.0505\\-252.9922\\-81\\-151.5789\\-249.0859\\-81\\-152.617\\-247.1328\\-81\\-153.9246\\-245.1797\\-81\\-154.7919\\-243.2266\\-81\\-155.9309\\-241.2734\\-81\\-156.5448\\-239.3203\\-81\\-157.7269\\-237.3672\\-81\\-158.4813\\-235.4141\\-81\\-159.6354\\-233.4609\\-81\\-160.3154\\-231.5078\\-81\\-161.232\\-229.5547\\-81\\-161.9656\\-227.6016\\-81\\-162.4079\\-225.6484\\-81\\-163.8143\\-221.7422\\-81\\-164.2376\\-219.7891\\-81\\-164.8324\\-217.8359\\-81\\-165.5773\\-215.8828\\-81\\-166.3925\\-211.9766\\-81\\-167.4116\\-208.0703\\-81\\-167.9281\\-204.1641\\-81\\-168.4275\\-198.3047\\-81\\-169.0009\\-192.4453\\-81\\-169.2004\\-188.5391\\-81\\-169.1599\\-184.6328\\-81\\-169.076\\-182.6797\\-81\\-168.7725\\-178.7734\\-81\\-168.3992\\-174.8672\\-81\\-167.7511\\-167.0547\\-81\\-167.1945\\-163.1484\\-81\\-166.324\\-159.2422\\-81\\-165.6454\\-155.3359\\-81\\-165.1198\\-153.3828\\-81\\-164.4531\\-151.4297\\-81\\-163.6169\\-147.5234\\-81\\-162.8017\\-145.5703\\-81\\-162.2375\\-143.6172\\-81\\-161.8277\\-141.6641\\-81\\-159.4289\\-135.8047\\-81\\-158.3047\\-133.8516\\-81\\-157.4428\\-131.8984\\-81\\-156.3459\\-129.9453\\-81\\-155.5535\\-127.9922\\-81\\-153.3203\\-124.3542\\-81\\-151.871\\-122.1328\\-81\\-148.9444\\-118.2266\\-81\\-147.5483\\-116.2734\\-81\\-145.9615\\-114.3203\\-81\\-141.6016\\-109.6635\\-81\\-139.6484\\-107.7711\\-81\\-137.6953\\-106.1369\\-81\\-135.7422\\-104.7688\\-81\\-131.8359\\-101.6896\\-81\\-127.4414\\-98.69531\\-81\\-125.9766\\-97.94458\\-81\\-120.1172\\-94.48679\\-81\\-118.1641\\-93.67997\\-81\\-116.2109\\-92.69747\\-81\\-114.2578\\-92.02117\\-81\\-110.3516\\-90.23841\\-81\\-108.3984\\-89.64409\\-81\\-106.4453\\-88.88831\\-81\\-104.4922\\-88.25787\\-81\\-100.5859\\-87.61167\\-81\\-96.67969\\-86.60686\\-81\\-92.77344\\-85.97512\\-81\\-86.91406\\-84.70531\\-81\\-83.00781\\-84.31712\\-81\\-81.05469\\-84.02625\\-81\\-79.10156\\-83.8987\\-81\\-75.19531\\-83.77866\\-81\\-69.33594\\-83.72843\\-81\\-63.47656\\-84.07345\\-81\\-61.52344\\-84.27178\\-81\\-57.61719\\-84.48897\\-81\\-55.66406\\-84.72011\\-81\\-51.75781\\-85.52629\\-81\\-49.80469\\-85.75586\\-81\\-47.85156\\-86.1244\\-81\\-45.89844\\-86.31013\\-81\\-43.94531\\-86.68583\\-81\\-41.99219\\-87.47942\\-81\\-38.08594\\-88.32025\\-81\\-36.13281\\-89.08693\\-81\\-32.22656\\-90.49656\\-81\\-30.27344\\-91.47173\\-81\\-28.32031\\-92.31375\\-81\\-26.36719\\-93.42802\\-81\\-24.41406\\-94.34517\\-81\\-22.46094\\-95.72807\\-81\\-20.50781\\-97.31322\\-81\\-19.07723\\-98.69531\\-81\\-16.60156\\-101.2395\\-81\\-15.36923\\-102.6016\\-81\\-13.8747\\-104.5547\\-81\\-12.69531\\-106.4955\\-81\\-10.74219\\-109.2358\\-81\\-8.725767\\-112.3672\\-81\\-7.615613\\-114.3203\\-81\\-6.260016\\-116.2734\\-81\\-5.334165\\-118.2266\\-81\\-2.929688\\-120.9169\\-81\\-0.9765625\\-122.3632\\-81\\0.9765625\\-121.8732\\-81\\2.238724\\-120.1797\\-81\\4.649475\\-116.2734\\-81\\6.034045\\-114.3203\\-81\\6.835938\\-112.9692\\-81\\9.896415\\-108.4609\\-81\\11.50077\\-106.5078\\-81\\14.80962\\-102.6016\\-81\\20.88867\\-96.74219\\-81\\22.46094\\-95.375\\-81\\24.41406\\-93.82078\\-81\\25.79753\\-92.83594\\-81\\30.27344\\-89.87449\\-81\\32.22656\\-88.79405\\-81\\34.17969\\-87.86086\\-81\\36.13281\\-86.80846\\-81\\40.03906\\-85.45119\\-81\\41.99219\\-84.63133\\-81\\45.89844\\-83.61038\\-81\\48.15463\\-83.07031\\-81\\51.75781\\-82.29334\\-81\\57.61719\\-81.80862\\-81\\61.52344\\-81.70454\\-81\\69.33594\\-81.7101\\-81\\73.24219\\-82.00439\\-81\\75.19531\\-82.09375\\-81\\81.05469\\-82.54613\\-81\\84.96094\\-83.35884\\-81\\90.82031\\-84.35731\\-81\\94.72656\\-85.37115\\-81\\98.63281\\-86.26693\\-81\\100.5859\\-86.8138\\-81\\102.5391\\-87.60239\\-81\\104.4922\\-88.06683\\-81\\106.4453\\-88.72369\\-81\\108.3984\\-89.54333\\-81\\110.3516\\-90.19607\\-81\\112.3047\\-91.13458\\-81\\114.2578\\-91.88525\\-81\\118.1641\\-93.87893\\-81\\120.1172\\-94.95054\\-81\\122.0703\\-95.862\\-81\\124.0234\\-97.13135\\-81\\125.9766\\-98.25201\\-81\\131.8359\\-102.2037\\-81\\133.7891\\-103.8071\\-81\\137.6953\\-107.3896\\-81\\139.6484\\-109.2873\\-81\\142.4437\\-112.3672\\-81\\145.546\\-116.2734\\-81\\147.4609\\-118.807\\-81\\149.7919\\-122.1328\\-81\\150.7853\\-124.0859\\-81\\153.4769\\-127.9922\\-81\\154.4495\\-129.9453\\-81\\155.6279\\-131.8984\\-81\\156.3904\\-133.8516\\-81\\157.362\\-135.8047\\-81\\159.0243\\-139.7109\\-81\\159.941\\-141.6641\\-81\\160.4798\\-143.6172\\-81\\161.3164\\-145.5703\\-81\\161.8984\\-147.5234\\-81\\162.5527\\-151.4297\\-81\\163.1705\\-153.3828\\-81\\163.6847\\-155.3359\\-81\\164.5267\\-161.1953\\-81\\165.4061\\-165.1016\\-81\\165.8471\\-169.0078\\-81\\166.1955\\-172.9141\\-81\\167.073\\-184.6328\\-81\\167.2296\\-188.5391\\-81\\167.322\\-196.3516\\-81\\167.2759\\-202.2109\\-81\\167.1143\\-206.1172\\-81\\166.7046\\-211.9766\\-81\\166.1706\\-217.8359\\-81\\165.7589\\-221.7422\\-81\\165.4738\\-223.6953\\-81\\164.3824\\-227.6016\\-81\\163.6684\\-231.5078\\-81\\162.9132\\-233.4609\\-81\\162.3204\\-235.4141\\-81\\161.9225\\-237.3672\\-81\\159.4406\\-243.2266\\-81\\158.277\\-245.1797\\-81\\157.3073\\-247.1328\\-81\\155.2734\\-250.9142\\-81\\154.1051\\-252.9922\\-81\\152.6423\\-254.9453\\-81\\149.996\\-258.8516\\-81\\147.4609\\-262.1414\\-81\\145.1944\\-264.7109\\-81\\142.0495\\-268.6172\\-81\\139.6484\\-270.9647\\-81\\137.6953\\-273.0409\\-81\\135.7422\\-275.0126\\-81\\134.1973\\-276.4297\\-81\\131.8773\\-278.3828\\-81\\129.6609\\-280.3359\\-81\\127.9297\\-281.614\\-81\\124.0234\\-284.6997\\-81\\122.0058\\-286.1953\\-81\\120.1172\\-287.4311\\-81\\118.1641\\-288.819\\-81\\116.2109\\-289.8215\\-81\\115.8854\\-290.1016\\-81\\112.7102\\-292.0547\\-81\\112.3047\\-292.3824\\-81\\110.3516\\-293.3428\\-81\\108.3984\\-294.5575\\-81\\106.4453\\-295.1932\\-81\\104.4922\\-296.1324\\-81\\102.5391\\-296.8829\\-81\\100.5859\\-297.5325\\-81\\98.63281\\-298.4875\\-81\\96.67969\\-299.0009\\-81\\92.77344\\-300.2641\\-81\\88.86719\\-300.9008\\-81\\84.96094\\-301.3454\\-81\\81.05469\\-301.8597\\-81\\77.14844\\-302.0608\\-81\\73.24219\\-302.0201\\-81\\69.33594\\-301.7344\\-81\\63.47656\\-301.0261\\-81\\59.57031\\-300.4695\\-81\\57.61719\\-299.9343\\-81\\55.66406\\-299.182\\-81\\53.71094\\-298.6257\\-81\\51.75781\\-297.6646\\-81\\49.80469\\-296.857\\-81\\45.89844\\-294.9411\\-81\\41.99219\\-292.5751\\-81\\38.92624\\-290.1016\\-81\\34.50521\\-286.1953\\-81\\28.32031\\-279.609\\-81\\25.77718\\-276.4297\\-81\\23.08618\\-272.5234\\-81\\21.57054\\-270.5703\\-81\\20.2469\\-268.6172\\-81\\19.39087\\-266.6641\\-81\\18.22684\\-264.7109\\-81\\17.22935\\-262.7578\\-81\\15.85662\\-260.8047\\-81\\14.64844\\-258.8616\\-81\\12.69531\\-256.5297\\-81\\10.74219\\-255.0517\\-81\\8.789063\\-254.4778\\-81\\6.835938\\-254.3531\\-81\\2.929688\\-254.2459\\-81\\0.9765625\\-254.3228\\-81\\-6.835938\\-255.1459\\-81\\-10.74219\\-256.5698\\-81\\-13.02621\\-258.8516\\-81\\-14.18235\\-260.8047\\-81\\-14.64844\\-261.3851\\-81\\-16.88368\\-264.7109\\-81\\-17.9579\\-266.6641\\-81\\-19.31866\\-268.6172\\-81\\-20.50781\\-270.5594\\-81\\-21.89867\\-272.5234\\-81\\-25.21307\\-276.4297\\-81\\-28.32031\\-280.2907\\-81\\-32.22656\\-284.3707\\-81\\-33.82662\\-286.1953\\-81\\-36.13281\\-288.3138\\-81\\-38.08594\\-289.7363\\-81\\-41.99219\\-292.9981\\-81\\-43.94531\\-294.4054\\-81\\-45.89844\\-295.2735\\-81\\-47.85156\\-296.4428\\-81\\-49.80469\\-297.1428\\-81\\-51.75781\\-298.2201\\-81\\-55.66406\\-299.5891\\-81\\-57.61719\\-300.3278\\-81\\-59.57031\\-300.7309\\-81\\-67.38281\\-301.7806\\-81\\-71.28906\\-302.088\\-81\\-75.19531\\-302.086\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "325" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "86" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-301.9056\\-79\\-81.05469\\-301.3223\\-79\\-86.91406\\-300.6405\\-79\\-88.86719\\-300.325\\-79\\-92.77344\\-299.1188\\-79\\-94.72656\\-298.6414\\-79\\-98.63281\\-297.0948\\-79\\-100.5859\\-296.5541\\-79\\-102.5391\\-295.5277\\-79\\-104.4922\\-294.8631\\-79\\-108.3984\\-292.8522\\-79\\-110.3516\\-291.4922\\-79\\-112.3047\\-290.4339\\-79\\-114.2578\\-289.1429\\-79\\-115.9566\\-288.1484\\-79\\-118.1641\\-286.6836\\-79\\-118.6844\\-286.1953\\-79\\-121.2553\\-284.2422\\-79\\-122.0703\\-283.4997\\-79\\-125.9766\\-280.4646\\-79\\-128.2552\\-278.3828\\-79\\-131.8359\\-274.9048\\-79\\-134.181\\-272.5234\\-79\\-138.9911\\-266.6641\\-79\\-140.6786\\-264.7109\\-79\\-142.2549\\-262.7578\\-79\\-144.8841\\-258.8516\\-79\\-147.9458\\-254.9453\\-79\\-148.8664\\-252.9922\\-79\\-150.2485\\-251.0391\\-79\\-151.4338\\-249.0859\\-79\\-152.5065\\-247.1328\\-79\\-153.8366\\-245.1797\\-79\\-154.694\\-243.2266\\-79\\-155.8568\\-241.2734\\-79\\-156.4777\\-239.3203\\-79\\-157.6361\\-237.3672\\-79\\-158.4104\\-235.4141\\-79\\-159.5691\\-233.4609\\-79\\-160.2689\\-231.5078\\-79\\-161.1407\\-229.5547\\-79\\-161.9104\\-227.6016\\-79\\-162.352\\-225.6484\\-79\\-162.9993\\-223.6953\\-79\\-163.7612\\-221.7422\\-79\\-164.1565\\-219.7891\\-79\\-164.7135\\-217.8359\\-79\\-165.4738\\-215.8828\\-79\\-166.2775\\-211.9766\\-79\\-166.7359\\-210.0234\\-79\\-167.3242\\-208.0703\\-79\\-167.6217\\-206.1172\\-79\\-168.0623\\-202.2109\\-79\\-168.3607\\-198.3047\\-79\\-168.9056\\-192.4453\\-79\\-169.1181\\-188.5391\\-79\\-169.0903\\-184.6328\\-79\\-168.9056\\-180.7266\\-79\\-168.4028\\-174.8672\\-79\\-167.9571\\-169.0078\\-79\\-167.5927\\-165.1016\\-79\\-167.3503\\-163.1484\\-79\\-166.4557\\-159.2422\\-79\\-165.7804\\-155.3359\\-79\\-165.343\\-153.3828\\-79\\-164.6446\\-151.4297\\-79\\-163.7835\\-147.5234\\-79\\-163.1406\\-145.5703\\-79\\-162.3831\\-143.6172\\-79\\-162.0056\\-141.6641\\-79\\-161.3879\\-139.7109\\-79\\-160.4522\\-137.7578\\-79\\-159.7724\\-135.8047\\-79\\-158.6225\\-133.8516\\-79\\-157.8125\\-131.8984\\-79\\-156.6471\\-129.9453\\-79\\-155.9135\\-127.9922\\-79\\-154.7164\\-126.0391\\-79\\-153.6933\\-124.0859\\-79\\-151.3672\\-120.8111\\-79\\-150.8246\\-120.1797\\-79\\-149.6425\\-118.2266\\-79\\-148.2267\\-116.2734\\-79\\-146.5339\\-114.3203\\-79\\-141.2161\\-108.4609\\-79\\-139.0714\\-106.5078\\-79\\-136.7904\\-104.5547\\-79\\-133.7891\\-102.2153\\-79\\-131.8359\\-100.9333\\-79\\-128.7258\\-98.69531\\-79\\-125.9766\\-97.08083\\-79\\-122.0703\\-94.67867\\-79\\-120.1172\\-93.84505\\-79\\-118.1499\\-92.83594\\-79\\-116.2109\\-91.99976\\-79\\-114.1113\\-90.88281\\-79\\-112.3047\\-90.15039\\-79\\-106.4453\\-88.03507\\-79\\-104.4922\\-87.69362\\-79\\-102.5391\\-87.20681\\-79\\-100.5859\\-86.60764\\-79\\-96.67969\\-85.9118\\-79\\-92.77344\\-84.8796\\-79\\-88.86719\\-84.24342\\-79\\-86.91406\\-83.79723\\-79\\-83.00781\\-83.35047\\-79\\-79.10156\\-83.01238\\-79\\-75.19531\\-82.81854\\-79\\-69.33594\\-82.76467\\-79\\-65.42969\\-83.01189\\-79\\-57.61719\\-83.64178\\-79\\-55.66406\\-83.8391\\-79\\-53.71094\\-84.23113\\-79\\-49.80469\\-84.74544\\-79\\-43.94531\\-85.90234\\-79\\-41.99219\\-86.23736\\-79\\-40.03906\\-86.81118\\-79\\-38.08594\\-87.53566\\-79\\-36.13281\\-88.02985\\-79\\-34.17969\\-88.65842\\-79\\-30.27344\\-90.22469\\-79\\-26.36719\\-92.22028\\-79\\-22.46094\\-94.53678\\-79\\-20.50781\\-95.89951\\-79\\-18.55469\\-97.76348\\-79\\-15.72738\\-100.6484\\-79\\-14.05927\\-102.6016\\-79\\-12.81072\\-104.5547\\-79\\-10.74219\\-107.3701\\-79\\-8.610734\\-110.4141\\-79\\-6.835938\\-113.3685\\-79\\-4.704484\\-116.2734\\-79\\-3.503632\\-118.2266\\-79\\-2.929688\\-118.8618\\-79\\-0.9765625\\-120.2565\\-79\\0.9765625\\-119.2599\\-79\\1.756099\\-118.2266\\-79\\2.821181\\-116.2734\\-79\\4.39021\\-114.3203\\-79\\5.648909\\-112.3672\\-79\\8.292644\\-108.4609\\-79\\9.722794\\-106.5078\\-79\\12.69531\\-103.0699\\-79\\14.99924\\-100.6484\\-79\\16.60156\\-99.20073\\-79\\18.55469\\-97.2476\\-79\\20.50781\\-95.39612\\-79\\24.41406\\-92.38929\\-79\\26.36719\\-91.12471\\-79\\28.32031\\-89.69641\\-79\\30.27344\\-88.53401\\-79\\32.22656\\-87.61967\\-79\\34.17969\\-86.50285\\-79\\36.13281\\-85.80894\\-79\\38.08594\\-84.72589\\-79\\40.03906\\-84.17622\\-79\\43.94531\\-82.88314\\-79\\45.89844\\-82.41187\\-79\\47.85156\\-82.04349\\-79\\49.80469\\-81.82806\\-79\\51.75781\\-81.51247\\-79\\55.66406\\-81.17663\\-79\\57.61719\\-80.85016\\-79\\61.52344\\-80.72225\\-79\\65.42969\\-80.73662\\-79\\69.33594\\-80.82866\\-79\\71.28906\\-80.98222\\-79\\73.24219\\-81.31567\\-79\\77.14844\\-81.59829\\-79\\83.00781\\-82.20297\\-79\\86.91406\\-82.83563\\-79\\88.86719\\-83.32013\\-79\\92.77344\\-84.1373\\-79\\94.72656\\-84.46257\\-79\\96.67969\\-84.91076\\-79\\102.5391\\-86.66319\\-79\\104.4922\\-87.46484\\-79\\106.4453\\-88.00555\\-79\\108.3984\\-88.72369\\-79\\110.3516\\-89.58293\\-79\\112.3047\\-90.28136\\-79\\116.2109\\-92.19932\\-79\\118.1641\\-93.3314\\-79\\120.1172\\-94.11349\\-79\\122.0703\\-95.27016\\-79\\124.0234\\-96.26088\\-79\\125.9766\\-97.70131\\-79\\127.63\\-98.69531\\-79\\131.8359\\-101.6115\\-79\\133.7891\\-103.202\\-79\\139.6484\\-108.6771\\-79\\141.2785\\-110.4141\\-79\\144.4774\\-114.3203\\-79\\145.5078\\-115.5156\\-79\\147.5948\\-118.2266\\-79\\150.1294\\-122.1328\\-79\\152.4212\\-126.0391\\-79\\153.8346\\-127.9922\\-79\\154.7032\\-129.9453\\-79\\155.8919\\-131.8984\\-79\\156.5564\\-133.8516\\-79\\157.6425\\-135.8047\\-79\\158.3542\\-137.7578\\-79\\159.3425\\-139.7109\\-79\\160.0623\\-141.6641\\-79\\160.6257\\-143.6172\\-79\\161.4445\\-145.5703\\-79\\161.9274\\-147.5234\\-79\\162.6042\\-151.4297\\-79\\163.2276\\-153.3828\\-79\\163.6927\\-155.3359\\-79\\164.5091\\-161.1953\\-79\\165.3539\\-165.1016\\-79\\165.7914\\-169.0078\\-79\\166.1113\\-172.9141\\-79\\166.882\\-184.6328\\-79\\167.0444\\-188.5391\\-79\\167.1143\\-192.4453\\-79\\167.1276\\-198.3047\\-79\\167.073\\-202.2109\\-79\\166.7636\\-208.0703\\-79\\166.3656\\-213.9297\\-79\\166.0505\\-217.8359\\-79\\165.6388\\-221.7422\\-79\\165.3096\\-223.6953\\-79\\164.7003\\-225.6484\\-79\\164.2718\\-227.6016\\-79\\163.5459\\-231.5078\\-79\\162.7441\\-233.4609\\-79\\162.2344\\-235.4141\\-79\\161.8268\\-237.3672\\-79\\160.1563\\-241.2734\\-79\\159.2173\\-243.2266\\-79\\157.2266\\-246.9454\\-79\\156.1408\\-249.0859\\-79\\155.0236\\-251.0391\\-79\\154.0045\\-252.9922\\-79\\151.1134\\-256.8984\\-79\\149.8814\\-258.8516\\-79\\148.4185\\-260.8047\\-79\\145.0195\\-264.7109\\-79\\141.8772\\-268.6172\\-79\\139.6484\\-270.7866\\-79\\135.7422\\-274.8281\\-79\\133.7891\\-276.5614\\-79\\131.8359\\-278.1199\\-79\\129.333\\-280.3359\\-79\\125.9766\\-283.0056\\-79\\122.0703\\-285.8061\\-79\\121.619\\-286.1953\\-79\\118.1641\\-288.6263\\-79\\116.2109\\-289.572\\-79\\115.5455\\-290.1016\\-79\\112.2947\\-292.0547\\-79\\108.8469\\-294.0078\\-79\\108.3984\\-294.324\\-79\\104.4922\\-295.8281\\-79\\102.5391\\-296.7499\\-79\\100.5859\\-297.3199\\-79\\98.63281\\-298.2959\\-79\\94.72656\\-299.4094\\-79\\92.77344\\-300.1062\\-79\\90.82031\\-300.5317\\-79\\88.86719\\-300.8099\\-79\\83.00781\\-301.4671\\-79\\79.10156\\-301.8123\\-79\\77.14844\\-301.8754\\-79\\73.24219\\-301.8123\\-79\\69.33594\\-301.5546\\-79\\65.42969\\-301.1672\\-79\\61.52344\\-300.6922\\-79\\59.57031\\-300.3764\\-79\\55.66406\\-299.0954\\-79\\53.71094\\-298.5311\\-79\\51.75781\\-297.5116\\-79\\49.80469\\-296.794\\-79\\47.85156\\-295.7281\\-79\\45.89844\\-294.8669\\-79\\41.99219\\-292.4317\\-79\\39.0625\\-290.1016\\-79\\34.63882\\-286.1953\\-79\\28.32031\\-279.629\\-79\\25.66867\\-276.4297\\-79\\24.16314\\-274.4766\\-79\\22.84483\\-272.5234\\-79\\19.99563\\-268.6172\\-79\\19.15111\\-266.6641\\-79\\16.60156\\-262.844\\-79\\14.64844\\-260.2058\\-79\\12.69531\\-258.3485\\-79\\10.74219\\-257.0139\\-79\\8.789063\\-256.6302\\-79\\2.929688\\-256.5838\\-79\\-0.9765625\\-256.714\\-79\\-4.882813\\-256.9386\\-79\\-6.835938\\-256.8886\\-79\\-8.789063\\-257.7717\\-79\\-10.74219\\-258.4126\\-79\\-12.69531\\-260.0611\\-79\\-14.91757\\-262.7578\\-79\\-16.12338\\-264.7109\\-79\\-16.60156\\-265.3087\\-79\\-18.55469\\-268.2319\\-79\\-18.88533\\-268.6172\\-79\\-20.03368\\-270.5703\\-79\\-21.56085\\-272.5234\\-79\\-26.68531\\-278.3828\\-79\\-28.2219\\-280.3359\\-79\\-32.22656\\-284.3853\\-79\\-33.85417\\-286.1953\\-79\\-36.13281\\-288.2534\\-79\\-38.08594\\-289.6603\\-79\\-41.99219\\-292.916\\-79\\-43.94531\\-294.2775\\-79\\-45.89844\\-295.1784\\-79\\-47.85156\\-296.3339\\-79\\-49.80469\\-297.0514\\-79\\-51.75781\\-298.0361\\-79\\-53.71094\\-298.8042\\-79\\-55.66406\\-299.416\\-79\\-57.61719\\-300.2122\\-79\\-59.57031\\-300.6292\\-79\\-61.52344\\-300.907\\-79\\-67.38281\\-301.5798\\-79\\-71.28906\\-301.9063\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "318" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "87" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-300.197\\-77\\-90.82031\\-299.5461\\-77\\-94.72656\\-298.5388\\-77\\-96.67969\\-297.6788\\-77\\-100.5859\\-296.4102\\-77\\-102.5391\\-295.3634\\-77\\-104.4922\\-294.7585\\-77\\-106.4453\\-293.6004\\-77\\-108.3984\\-292.6813\\-77\\-110.3516\\-291.2951\\-77\\-114.2578\\-289.028\\-77\\-118.1641\\-286.4149\\-77\\-120.9961\\-284.2422\\-77\\-125.8079\\-280.3359\\-77\\-127.9543\\-278.3828\\-77\\-131.8359\\-274.6115\\-77\\-133.9265\\-272.5234\\-77\\-137.1779\\-268.6172\\-77\\-140.5015\\-264.7109\\-77\\-142.0898\\-262.7578\\-77\\-143.3421\\-260.8047\\-77\\-144.735\\-258.8516\\-77\\-147.8102\\-254.9453\\-77\\-148.7909\\-252.9922\\-77\\-150.1433\\-251.0391\\-77\\-152.4041\\-247.1328\\-77\\-153.7407\\-245.1797\\-77\\-154.5993\\-243.2266\\-77\\-155.7685\\-241.2734\\-77\\-156.4276\\-239.3203\\-77\\-157.5435\\-237.3672\\-77\\-158.3419\\-235.4141\\-77\\-159.4634\\-233.4609\\-77\\-160.1985\\-231.5078\\-77\\-161.8667\\-227.6016\\-77\\-162.2962\\-225.6484\\-77\\-162.8698\\-223.6953\\-77\\-163.6963\\-221.7422\\-77\\-164.5755\\-217.8359\\-77\\-165.3539\\-215.8828\\-77\\-165.8113\\-213.9297\\-77\\-166.6003\\-210.0234\\-77\\-167.2054\\-208.0703\\-77\\-167.5408\\-206.1172\\-77\\-167.9978\\-202.2109\\-77\\-168.6151\\-194.3984\\-77\\-168.8015\\-192.4453\\-77\\-169.0004\\-188.5391\\-77\\-169.0162\\-184.6328\\-77\\-168.8454\\-180.7266\\-77\\-167.9864\\-169.0078\\-77\\-167.6492\\-165.1016\\-77\\-167.4241\\-163.1484\\-77\\-167.0588\\-161.1953\\-77\\-166.5575\\-159.2422\\-77\\-165.483\\-153.3828\\-77\\-164.8072\\-151.4297\\-77\\-164.2698\\-149.4766\\-77\\-163.898\\-147.5234\\-77\\-163.3719\\-145.5703\\-77\\-162.5179\\-143.6172\\-77\\-162.1094\\-141.6641\\-77\\-161.5943\\-139.7109\\-77\\-160.6638\\-137.7578\\-77\\-160.0006\\-135.8047\\-77\\-158.9284\\-133.8516\\-77\\-158.0305\\-131.8984\\-77\\-156.9676\\-129.9453\\-77\\-156.1202\\-127.9922\\-77\\-154.0064\\-124.0859\\-77\\-151.3077\\-120.1797\\-77\\-150.0355\\-118.2266\\-77\\-147.4609\\-114.7453\\-77\\-145.5078\\-112.377\\-77\\-142.128\\-108.4609\\-77\\-140.1486\\-106.5078\\-77\\-137.6953\\-104.3906\\-77\\-131.8359\\-100.0711\\-77\\-127.9297\\-97.51916\\-77\\-125.9766\\-96.03815\\-77\\-122.0703\\-93.98689\\-77\\-120.1172\\-93.21905\\-77\\-119.5171\\-92.83594\\-77\\-115.8719\\-90.88281\\-77\\-114.2578\\-90.1282\\-77\\-112.3047\\-89.39302\\-77\\-110.3516\\-88.5015\\-77\\-108.3984\\-87.9325\\-77\\-106.4453\\-87.47942\\-77\\-104.4922\\-86.89063\\-77\\-100.5859\\-85.91537\\-77\\-98.63281\\-85.50454\\-77\\-96.67969\\-84.9081\\-77\\-94.72656\\-84.63405\\-77\\-92.77344\\-84.12448\\-77\\-88.86719\\-83.45657\\-77\\-86.91406\\-82.92305\\-77\\-84.96094\\-82.6371\\-77\\-79.10156\\-82.23617\\-77\\-75.19531\\-82.10035\\-77\\-69.33594\\-82.10668\\-77\\-65.42969\\-82.22084\\-77\\-59.57031\\-82.5611\\-77\\-57.61719\\-82.71725\\-77\\-55.66406\\-82.99767\\-77\\-53.71094\\-83.40323\\-77\\-49.80469\\-84.022\\-77\\-47.85156\\-84.25346\\-77\\-43.94531\\-84.95531\\-77\\-38.08594\\-86.44326\\-77\\-36.13281\\-87.21256\\-77\\-32.22656\\-88.32025\\-77\\-28.32031\\-90.04095\\-77\\-26.64812\\-90.88281\\-77\\-24.41406\\-92.15876\\-77\\-20.50781\\-94.78011\\-77\\-18.55469\\-96.50967\\-77\\-14.49033\\-100.6484\\-77\\-12.69531\\-102.9481\\-77\\-8.671514\\-108.4609\\-77\\-6.835938\\-111.2627\\-77\\-4.351021\\-114.3203\\-77\\-2.929688\\-116.4939\\-77\\-0.9765625\\-117.604\\-77\\0.9765625\\-116.2386\\-77\\2.929688\\-113.9032\\-77\\4.046816\\-112.3672\\-77\\4.882813\\-110.9878\\-77\\8.079594\\-106.5078\\-77\\9.598691\\-104.5547\\-77\\12.69531\\-101.1942\\-77\\15.17704\\-98.69531\\-77\\18.55469\\-95.48907\\-77\\20.50781\\-93.86258\\-77\\22.46094\\-92.5438\\-77\\26.36719\\-89.65397\\-77\\28.32031\\-88.36136\\-77\\30.83376\\-86.97656\\-77\\32.22656\\-86.2914\\-77\\34.17969\\-85.46875\\-77\\36.13281\\-84.44699\\-77\\38.08594\\-83.78119\\-77\\40.03906\\-83.00873\\-77\\43.94531\\-81.95119\\-77\\47.85156\\-81.14358\\-77\\51.75781\\-80.51362\\-77\\55.66406\\-80.26599\\-77\\59.57031\\-80.16582\\-77\\65.42969\\-80.18389\\-77\\71.28906\\-80.29713\\-77\\77.14844\\-80.75098\\-77\\79.10156\\-81.04395\\-77\\83.00781\\-81.73924\\-77\\86.91406\\-82.19141\\-77\\90.82031\\-82.87807\\-77\\92.77344\\-83.39826\\-77\\98.63281\\-84.67021\\-77\\100.5859\\-85.37924\\-77\\104.4922\\-86.65104\\-77\\106.4453\\-87.479\\-77\\108.3984\\-88.08078\\-77\\110.3516\\-88.79472\\-77\\112.3047\\-89.69698\\-77\\114.2578\\-90.42364\\-77\\116.2109\\-91.59721\\-77\\118.1641\\-92.47899\\-77\\120.1172\\-93.60555\\-77\\122.0703\\-94.47868\\-77\\127.9297\\-98.1669\\-77\\129.8828\\-99.68535\\-77\\133.7891\\-102.4655\\-77\\135.7422\\-104.2633\\-77\\138.0313\\-106.5078\\-77\\140.1331\\-108.4609\\-77\\141.9345\\-110.4141\\-77\\143.3809\\-112.3672\\-77\\145.5078\\-114.974\\-77\\148.0469\\-118.2266\\-77\\150.3967\\-122.1328\\-77\\151.6927\\-124.0859\\-77\\152.7239\\-126.0391\\-77\\154.0588\\-127.9922\\-77\\154.9503\\-129.9453\\-77\\156.0584\\-131.8984\\-77\\156.7215\\-133.8516\\-77\\157.7962\\-135.8047\\-77\\158.4967\\-137.7578\\-77\\159.5435\\-139.7109\\-77\\160.7567\\-143.6172\\-77\\161.5194\\-145.5703\\-77\\161.9446\\-147.5234\\-77\\162.6347\\-151.4297\\-77\\163.2548\\-153.3828\\-77\\163.7042\\-155.3359\\-77\\164.4636\\-161.1953\\-77\\165.2629\\-165.1016\\-77\\165.5444\\-167.0547\\-77\\165.8923\\-170.9609\\-77\\166.2824\\-176.8203\\-77\\166.6932\\-184.6328\\-77\\166.8127\\-188.5391\\-77\\166.9096\\-194.3984\\-77\\166.776\\-202.2109\\-77\\166.5438\\-208.0703\\-77\\166.3467\\-211.9766\\-77\\166.0804\\-215.8828\\-77\\165.7424\\-219.7891\\-77\\165.501\\-221.7422\\-77\\165.0766\\-223.6953\\-77\\164.5235\\-225.6484\\-77\\163.8555\\-229.5547\\-77\\163.3699\\-231.5078\\-77\\162.5846\\-233.4609\\-77\\161.6881\\-237.3672\\-77\\160.7567\\-239.3203\\-77\\160.0296\\-241.2734\\-77\\158.9603\\-243.2266\\-77\\158.0299\\-245.1797\\-77\\156.8773\\-247.1328\\-77\\156.0434\\-249.0859\\-77\\154.873\\-251.0391\\-77\\153.8844\\-252.9922\\-77\\151.3672\\-256.4061\\-77\\150.9292\\-256.8984\\-77\\149.7445\\-258.8516\\-77\\148.3154\\-260.8047\\-77\\144.8458\\-264.7109\\-77\\143.1894\\-266.6641\\-77\\141.6444\\-268.6172\\-77\\139.6484\\-270.5446\\-77\\135.7422\\-274.6028\\-77\\131.8359\\-277.8533\\-77\\127.9297\\-281.2669\\-77\\125.9766\\-282.8048\\-77\\124.0234\\-284.0453\\-77\\120.1172\\-287.0627\\-77\\118.1641\\-288.3697\\-77\\116.2109\\-289.3756\\-77\\114.2578\\-290.6909\\-77\\112.3047\\-291.6918\\-77\\110.3516\\-292.9702\\-77\\108.3984\\-294.0313\\-77\\106.4453\\-294.9245\\-77\\104.4922\\-295.5745\\-77\\102.5391\\-296.61\\-77\\100.5859\\-297.1582\\-77\\98.63281\\-298.0361\\-77\\96.67969\\-298.7313\\-77\\94.72656\\-299.2254\\-77\\92.77344\\-299.8749\\-77\\90.82031\\-300.4004\\-77\\88.86719\\-300.7147\\-77\\84.96094\\-301.1385\\-77\\81.05469\\-301.4925\\-77\\79.10156\\-301.6074\\-77\\75.19531\\-301.6765\\-77\\73.24219\\-301.6206\\-77\\69.33594\\-301.4095\\-77\\65.42969\\-301.0742\\-77\\61.52344\\-300.618\\-77\\59.57031\\-300.2741\\-77\\57.61719\\-299.5891\\-77\\53.71094\\-298.4223\\-77\\51.75781\\-297.382\\-77\\49.80469\\-296.7091\\-77\\47.85156\\-295.5745\\-77\\45.89844\\-294.7778\\-77\\41.99219\\-292.2664\\-77\\39.21875\\-290.1016\\-77\\36.13281\\-287.4694\\-77\\34.73874\\-286.1953\\-77\\28.32031\\-279.6674\\-77\\24.41406\\-275.0929\\-77\\22.46094\\-272.5143\\-77\\19.75114\\-268.6172\\-77\\18.62917\\-266.6641\\-77\\17.30496\\-264.7109\\-77\\16.60156\\-263.8363\\-77\\14.64844\\-261.6917\\-77\\12.69531\\-260.1865\\-77\\10.74219\\-259.2403\\-77\\8.789063\\-258.9441\\-77\\2.929688\\-258.9451\\-77\\0.9765625\\-258.9958\\-77\\-0.9765625\\-259.477\\-77\\-2.929688\\-259.7295\\-77\\-4.882813\\-259.7988\\-77\\-6.835938\\-259.7623\\-77\\-8.789063\\-260.0417\\-77\\-10.74219\\-260.5324\\-77\\-12.69531\\-261.6624\\-77\\-14.64844\\-263.5306\\-77\\-17.0379\\-266.6641\\-77\\-18.28704\\-268.6172\\-77\\-19.67544\\-270.5703\\-77\\-22.46094\\-273.9661\\-77\\-24.80316\\-276.4297\\-77\\-28.07242\\-280.3359\\-77\\-32.22656\\-284.416\\-77\\-33.89292\\-286.1953\\-77\\-36.14239\\-288.1484\\-77\\-38.08594\\-289.5955\\-77\\-41.99219\\-292.8326\\-77\\-43.94531\\-294.1385\\-77\\-45.89844\\-295.0949\\-77\\-47.85156\\-296.1869\\-77\\-49.80469\\-296.9588\\-77\\-53.71094\\-298.7046\\-77\\-55.66406\\-299.264\\-77\\-57.61719\\-300.0569\\-77\\-59.57031\\-300.5278\\-77\\-61.52344\\-300.8099\\-77\\-65.42969\\-301.2395\\-77\\-69.33594\\-301.5944\\-77\\-73.24219\\-301.735\\-77\\-75.19531\\-301.705\\-77\\-81.05469\\-301.2256\\-77\\-86.91406\\-300.5542\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "308" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "88" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-300.0666\\-75\\-90.82031\\-299.3819\\-75\\-94.72656\\-298.4194\\-75\\-96.67969\\-297.4937\\-75\\-100.5859\\-296.2122\\-75\\-102.5391\\-295.23\\-75\\-104.4922\\-294.6102\\-75\\-106.4453\\-293.4183\\-75\\-108.3984\\-292.488\\-75\\-112.3047\\-289.8387\\-75\\-114.2578\\-288.8934\\-75\\-120.1172\\-284.6861\\-75\\-123.1876\\-282.2891\\-75\\-125.9766\\-279.9184\\-75\\-127.6719\\-278.3828\\-75\\-131.8359\\-274.3892\\-75\\-133.6719\\-272.5234\\-75\\-135.7422\\-270.1814\\-75\\-137.0047\\-268.6172\\-75\\-140.357\\-264.7109\\-75\\-141.9396\\-262.7578\\-75\\-143.131\\-260.8047\\-75\\-144.5769\\-258.8516\\-75\\-146.178\\-256.8984\\-75\\-147.6224\\-254.9453\\-75\\-148.7021\\-252.9922\\-75\\-150.0456\\-251.0391\\-75\\-151.0538\\-249.0859\\-75\\-151.3672\\-248.7007\\-75\\-153.3203\\-245.534\\-75\\-153.6063\\-245.1797\\-75\\-154.5132\\-243.2266\\-75\\-155.6599\\-241.2734\\-75\\-156.3735\\-239.3203\\-75\\-157.426\\-237.3672\\-75\\-158.2504\\-235.4141\\-75\\-159.3161\\-233.4609\\-75\\-160.8869\\-229.5547\\-75\\-161.7981\\-227.6016\\-75\\-162.7417\\-223.6953\\-75\\-163.5957\\-221.7422\\-75\\-164.4484\\-217.8359\\-75\\-165.2007\\-215.8828\\-75\\-165.7191\\-213.9297\\-75\\-166.4798\\-210.0234\\-75\\-167.0444\\-208.0703\\-75\\-167.4557\\-206.1172\\-75\\-167.7145\\-204.1641\\-75\\-168.0938\\-200.2578\\-75\\-168.6673\\-192.4453\\-75\\-168.8594\\-188.5391\\-75\\-168.9056\\-184.6328\\-75\\-168.6531\\-178.7734\\-75\\-167.9982\\-169.0078\\-75\\-167.4557\\-163.1484\\-75\\-167.1143\\-161.1953\\-75\\-166.6236\\-159.2422\\-75\\-166.2314\\-157.2891\\-75\\-165.5527\\-153.3828\\-75\\-164.3415\\-149.4766\\-75\\-163.5063\\-145.5703\\-75\\-162.6482\\-143.6172\\-75\\-161.7264\\-139.7109\\-75\\-160.8448\\-137.7578\\-75\\-160.1246\\-135.8047\\-75\\-159.2173\\-133.8516\\-75\\-158.1874\\-131.8984\\-75\\-157.2932\\-129.9453\\-75\\-156.262\\-127.9922\\-75\\-155.3304\\-126.0391\\-75\\-154.213\\-124.0859\\-75\\-151.6974\\-120.1797\\-75\\-148.857\\-116.2734\\-75\\-147.6497\\-114.3203\\-75\\-145.9997\\-112.3672\\-75\\-144.2077\\-110.4141\\-75\\-143.5547\\-109.5256\\-75\\-140.6691\\-106.5078\\-75\\-135.7422\\-102.194\\-75\\-133.5685\\-100.6484\\-75\\-131.8359\\-99.54478\\-75\\-127.9297\\-96.60611\\-75\\-124.0234\\-94.16378\\-75\\-122.0703\\-93.3908\\-75\\-118.1641\\-91.35607\\-75\\-116.2109\\-90.23396\\-75\\-114.2578\\-89.54256\\-75\\-112.3047\\-88.53758\\-75\\-106.4453\\-86.69444\\-75\\-102.5391\\-85.78516\\-75\\-98.63281\\-84.55608\\-75\\-96.67969\\-84.20731\\-75\\-94.72656\\-84.25946\\-75\\-92.77344\\-83.42025\\-75\\-90.82031\\-82.90755\\-75\\-86.91406\\-82.25105\\-75\\-84.96094\\-82.0612\\-75\\-81.05469\\-81.86588\\-75\\-79.10156\\-81.66606\\-75\\-75.19531\\-81.53571\\-75\\-71.28906\\-81.53259\\-75\\-65.42969\\-81.68031\\-75\\-61.52344\\-81.93099\\-75\\-57.61719\\-82.08724\\-75\\-53.71094\\-82.48869\\-75\\-47.85156\\-83.5825\\-75\\-41.99219\\-84.54499\\-75\\-38.08594\\-85.72195\\-75\\-34.17969\\-86.81635\\-75\\-32.22656\\-87.5625\\-75\\-30.27344\\-88.18331\\-75\\-26.36719\\-89.9266\\-75\\-24.57894\\-90.88281\\-75\\-22.46094\\-92.22907\\-75\\-19.05777\\-94.78906\\-75\\-16.88449\\-96.74219\\-75\\-14.97105\\-98.69531\\-75\\-12.69531\\-101.3759\\-75\\-11.83116\\-102.6016\\-75\\-10.23171\\-104.5547\\-75\\-8.888527\\-106.5078\\-75\\-5.948893\\-110.4141\\-75\\-4.882813\\-111.6683\\-75\\-2.929688\\-113.758\\-75\\-0.9765625\\-115.1228\\-75\\0.9765625\\-114.0839\\-75\\2.459162\\-112.3672\\-75\\3.79357\\-110.4141\\-75\\5.246804\\-108.4609\\-75\\8.02234\\-104.5547\\-75\\9.740797\\-102.6016\\-75\\14.64844\\-97.61859\\-75\\16.60156\\-95.75775\\-75\\18.55469\\-94.08244\\-75\\20.50781\\-92.52376\\-75\\22.69666\\-90.88281\\-75\\26.36719\\-88.40326\\-75\\28.70302\\-86.97656\\-75\\34.17969\\-84.14815\\-75\\36.13281\\-83.50182\\-75\\38.08594\\-82.64539\\-75\\41.99219\\-81.64246\\-75\\43.94531\\-80.99512\\-75\\47.85156\\-80.28677\\-75\\51.75781\\-79.93607\\-75\\55.66406\\-79.52834\\-75\\59.57031\\-79.46395\\-75\\65.42969\\-79.55032\\-75\\73.24219\\-79.87489\\-75\\75.19531\\-80.15247\\-75\\79.10156\\-80.43484\\-75\\81.05469\\-80.64598\\-75\\84.96094\\-81.39729\\-75\\86.91406\\-81.72076\\-75\\92.77344\\-82.53177\\-75\\96.67969\\-83.62347\\-75\\98.63281\\-84.04053\\-75\\100.5859\\-84.60976\\-75\\102.5391\\-85.41837\\-75\\106.4453\\-86.68216\\-75\\108.3984\\-87.62537\\-75\\110.3516\\-88.14193\\-75\\112.2887\\-88.92969\\-75\\116.2109\\-90.78363\\-75\\118.1641\\-91.90006\\-75\\122.0703\\-93.94358\\-75\\124.0234\\-95.12711\\-75\\125.9766\\-96.2113\\-75\\129.3774\\-98.69531\\-75\\129.8828\\-99.14545\\-75\\131.8359\\-100.4341\\-75\\133.7891\\-101.8895\\-75\\135.7422\\-103.6765\\-75\\138.5749\\-106.5078\\-75\\140.6389\\-108.4609\\-75\\142.3788\\-110.4141\\-75\\145.5078\\-114.3482\\-75\\148.3797\\-118.2266\\-75\\149.5938\\-120.1797\\-75\\150.6587\\-122.1328\\-75\\151.9747\\-124.0859\\-75\\153.0215\\-126.0391\\-75\\154.225\\-127.9922\\-75\\155.2734\\-129.9844\\-75\\156.1707\\-131.8984\\-75\\156.8915\\-133.8516\\-75\\157.9034\\-135.8047\\-75\\158.614\\-137.7578\\-75\\159.6559\\-139.7109\\-75\\160.8276\\-143.6172\\-75\\161.5646\\-145.5703\\-75\\162.6557\\-151.4297\\-75\\163.7042\\-155.3359\\-75\\164.4088\\-161.1953\\-75\\165.1611\\-165.1016\\-75\\165.4644\\-167.0547\\-75\\165.8213\\-170.9609\\-75\\166.1792\\-176.8203\\-75\\166.516\\-184.6328\\-75\\166.6841\\-194.3984\\-75\\166.5315\\-202.2109\\-75\\166.358\\-208.0703\\-75\\166.1852\\-211.9766\\-75\\165.8074\\-217.8359\\-75\\165.3096\\-221.7422\\-75\\164.375\\-225.6484\\-75\\163.7351\\-229.5547\\-75\\162.437\\-233.4609\\-75\\162.0495\\-235.4141\\-75\\161.5302\\-237.3672\\-75\\160.5722\\-239.3203\\-75\\159.8726\\-241.2734\\-75\\158.7364\\-243.2266\\-75\\157.8979\\-245.1797\\-75\\156.6957\\-247.1328\\-75\\155.948\\-249.0859\\-75\\154.7163\\-251.0391\\-75\\153.7424\\-252.9922\\-75\\151.3672\\-256.1776\\-75\\150.7451\\-256.8984\\-75\\149.5781\\-258.8516\\-75\\148.2016\\-260.8047\\-75\\144.6681\\-264.7109\\-75\\141.6016\\-268.3859\\-75\\139.6484\\-270.2575\\-75\\137.3954\\-272.5234\\-75\\135.7422\\-274.318\\-75\\133.273\\-276.4297\\-75\\131.8359\\-277.5775\\-75\\127.9297\\-281.0866\\-75\\125.9766\\-282.5256\\-75\\124.0234\\-283.7434\\-75\\123.4597\\-284.2422\\-75\\120.1172\\-286.8483\\-75\\116.2109\\-289.1806\\-75\\114.2578\\-290.4526\\-75\\112.3047\\-291.4173\\-75\\110.3516\\-292.777\\-75\\108.3984\\-293.7121\\-75\\106.4453\\-294.7585\\-75\\104.4922\\-295.3869\\-75\\102.5391\\-296.4102\\-75\\98.63281\\-297.6931\\-75\\96.67969\\-298.5669\\-75\\92.77344\\-299.593\\-75\\90.82031\\-300.2229\\-75\\88.86719\\-300.5841\\-75\\84.96094\\-301.0026\\-75\\81.05469\\-301.3288\\-75\\79.10156\\-301.4311\\-75\\75.19531\\-301.4925\\-75\\69.33594\\-301.287\\-75\\65.42969\\-300.9841\\-75\\61.52344\\-300.5315\\-75\\59.57031\\-300.1396\\-75\\57.61719\\-299.4352\\-75\\53.71094\\-298.2911\\-75\\51.75781\\-297.2571\\-75\\49.80469\\-296.614\\-75\\47.85156\\-295.4494\\-75\\45.89844\\-294.6696\\-75\\41.99219\\-292.0623\\-75\\39.36919\\-290.1016\\-75\\36.13281\\-287.391\\-75\\34.79092\\-286.1953\\-75\\32.22656\\-283.6234\\-75\\28.8669\\-280.3359\\-75\\27.17653\\-278.3828\\-75\\24.41406\\-275.3774\\-75\\22.06643\\-272.5234\\-75\\19.4443\\-268.6172\\-75\\16.60156\\-265.1064\\-75\\14.64844\\-263.285\\-75\\12.69531\\-262.1158\\-75\\10.74219\\-261.3351\\-75\\8.789063\\-261.159\\-75\\2.929688\\-261.2038\\-75\\0.9765625\\-261.3766\\-75\\-0.9765625\\-261.7905\\-75\\-2.929688\\-261.9249\\-75\\-6.835938\\-262.0645\\-75\\-10.74219\\-262.4292\\-75\\-12.69531\\-263.1676\\-75\\-14.64844\\-264.7725\\-75\\-16.60156\\-267.1192\\-75\\-22.42156\\-274.4766\\-75\\-24.41406\\-276.4566\\-75\\-26.12106\\-278.3828\\-75\\-28.32031\\-280.7161\\-75\\-32.22656\\-284.4294\\-75\\-34.17969\\-286.4376\\-75\\-38.08594\\-289.5425\\-75\\-41.99219\\-292.7338\\-75\\-44.00344\\-294.0078\\-75\\-47.85156\\-296.0161\\-75\\-51.75781\\-297.6068\\-75\\-53.71094\\-298.595\\-75\\-55.66406\\-299.128\\-75\\-57.63842\\-299.8672\\-75\\-59.57031\\-300.4124\\-75\\-61.52344\\-300.7098\\-75\\-65.42969\\-301.1263\\-75\\-69.33594\\-301.4447\\-75\\-73.24219\\-301.5546\\-75\\-75.19531\\-301.5302\\-75\\-81.05469\\-301.1306\\-75\\-84.96094\\-300.7371\\-75\\-86.91406\\-300.4739\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "315" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "89" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-299.8748\\-73\\-90.82031\\-299.233\\-73\\-94.72656\\-298.2606\\-73\\-96.67969\\-297.3329\\-73\\-98.63281\\-296.8065\\-73\\-102.5391\\-295.123\\-73\\-104.4922\\-294.4351\\-73\\-106.4453\\-293.2433\\-73\\-108.3984\\-292.2541\\-73\\-111.6793\\-290.1016\\-73\\-112.3047\\-289.6065\\-73\\-114.2578\\-288.7264\\-73\\-118.1641\\-285.7845\\-73\\-120.1172\\-284.4539\\-73\\-124.0234\\-281.4128\\-73\\-127.4161\\-278.3828\\-73\\-129.5226\\-276.4297\\-73\\-133.4372\\-272.5234\\-73\\-135.2434\\-270.5703\\-73\\-136.8612\\-268.6172\\-73\\-137.6953\\-267.7404\\-73\\-141.7842\\-262.7578\\-73\\-142.9879\\-260.8047\\-73\\-144.4319\\-258.8516\\-73\\-146.03\\-256.8984\\-73\\-147.4609\\-254.8945\\-73\\-148.6167\\-252.9922\\-73\\-149.9326\\-251.0391\\-73\\-150.8823\\-249.0859\\-73\\-151.3672\\-248.483\\-73\\-153.448\\-245.1797\\-73\\-154.4303\\-243.2266\\-73\\-155.5598\\-241.2734\\-73\\-156.3147\\-239.3203\\-73\\-160.0414\\-231.5078\\-73\\-160.7567\\-229.5547\\-73\\-161.6935\\-227.6016\\-73\\-162.6347\\-223.6953\\-73\\-163.4753\\-221.7422\\-73\\-164.3487\\-217.8359\\-73\\-165.6272\\-213.9297\\-73\\-166.362\\-210.0234\\-73\\-167.3479\\-206.1172\\-73\\-167.6413\\-204.1641\\-73\\-168.1776\\-198.3047\\-73\\-168.5452\\-192.4453\\-73\\-168.7177\\-188.5391\\-73\\-168.7725\\-184.6328\\-73\\-168.7456\\-182.6797\\-73\\-168.5671\\-178.7734\\-73\\-167.9862\\-169.0078\\-73\\-167.4463\\-163.1484\\-73\\-167.0869\\-161.1953\\-73\\-166.253\\-157.2891\\-73\\-165.5773\\-153.3828\\-73\\-164.3673\\-149.4766\\-73\\-163.5585\\-145.5703\\-73\\-162.7276\\-143.6172\\-73\\-161.7944\\-139.7109\\-73\\-159.3541\\-133.8516\\-73\\-158.2876\\-131.8984\\-73\\-157.474\\-129.9453\\-73\\-156.3525\\-127.9922\\-73\\-155.5099\\-126.0391\\-73\\-153.3203\\-122.3261\\-73\\-151.9112\\-120.1797\\-73\\-150.4149\\-118.2266\\-73\\-149.4141\\-116.5654\\-73\\-147.9201\\-114.3203\\-73\\-146.3005\\-112.3672\\-73\\-144.5555\\-110.4141\\-73\\-143.5547\\-108.9358\\-73\\-141.2564\\-106.5078\\-73\\-139.1134\\-104.5547\\-73\\-137.6953\\-103.4528\\-73\\-135.7422\\-101.6738\\-73\\-133.7891\\-100.1811\\-73\\-129.8828\\-97.49393\\-73\\-127.9297\\-95.90614\\-73\\-125.9766\\-94.69803\\-73\\-122.0703\\-92.67939\\-73\\-120.1172\\-91.88277\\-73\\-118.1641\\-90.58623\\-73\\-114.2578\\-88.82477\\-73\\-112.3047\\-88.0495\\-73\\-110.3516\\-87.43915\\-73\\-108.3984\\-86.55408\\-73\\-106.4453\\-86.11894\\-73\\-98.63281\\-83.8758\\-73\\-94.72656\\-83.18967\\-73\\-92.77344\\-82.58554\\-73\\-90.82031\\-82.23047\\-73\\-88.86719\\-82.10009\\-73\\-84.96094\\-81.57291\\-73\\-81.05469\\-81.28392\\-73\\-79.10156\\-80.86737\\-73\\-75.19531\\-80.71382\\-73\\-71.28906\\-80.72514\\-73\\-65.42969\\-80.8942\\-73\\-63.47656\\-81.19105\\-73\\-59.57031\\-81.50929\\-73\\-57.61719\\-81.60547\\-73\\-53.71094\\-81.95518\\-73\\-49.80469\\-82.4305\\-73\\-47.85156\\-82.74954\\-73\\-43.94531\\-83.56196\\-73\\-41.99219\\-83.90472\\-73\\-38.08594\\-84.80889\\-73\\-36.13281\\-85.51528\\-73\\-32.22656\\-86.62728\\-73\\-30.27344\\-87.48704\\-73\\-28.32031\\-88.1055\\-73\\-26.38346\\-88.92969\\-73\\-22.71412\\-90.88281\\-73\\-20.50781\\-92.47166\\-73\\-18.55469\\-94.08814\\-73\\-16.60156\\-95.86735\\-73\\-13.82097\\-98.69531\\-73\\-10.6083\\-102.6016\\-73\\-7.720226\\-106.5078\\-73\\-4.882813\\-109.7784\\-73\\-2.929688\\-111.8699\\-73\\-0.9765625\\-113.1763\\-73\\0.9765625\\-112.2376\\-73\\2.372742\\-110.4141\\-73\\4.023162\\-108.4609\\-73\\4.882813\\-107.1046\\-73\\6.754557\\-104.5547\\-73\\8.370536\\-102.6016\\-73\\12.69531\\-98.3346\\-73\\14.64844\\-96.28312\\-73\\16.60156\\-94.48924\\-73\\21.01089\\-90.88281\\-73\\22.46094\\-89.76999\\-73\\24.41406\\-88.51228\\-73\\26.36719\\-87.52251\\-73\\28.32031\\-86.19959\\-73\\30.31921\\-85.02344\\-73\\34.17969\\-83.19769\\-73\\38.08594\\-81.87751\\-73\\40.03906\\-81.38134\\-73\\41.99219\\-80.68552\\-73\\43.94531\\-80.30878\\-73\\45.89844\\-80.04425\\-73\\49.80469\\-79.38019\\-73\\53.71094\\-78.93222\\-73\\55.66406\\-78.79048\\-73\\59.57031\\-78.71383\\-73\\65.42969\\-78.79048\\-73\\69.33594\\-78.99644\\-73\\71.28906\\-79.15643\\-73\\73.24219\\-79.17255\\-73\\75.19531\\-79.632\\-73\\77.14844\\-79.87486\\-73\\83.00781\\-80.42675\\-73\\84.96094\\-80.65642\\-73\\86.91406\\-81.02841\\-73\\88.86719\\-81.50924\\-73\\92.77344\\-82.07472\\-73\\94.72656\\-82.41249\\-73\\96.67969\\-82.92535\\-73\\98.63281\\-83.53825\\-73\\100.5859\\-84.00907\\-73\\102.5391\\-84.66769\\-73\\104.4922\\-85.50475\\-73\\106.4453\\-86.13181\\-73\\110.3516\\-87.69579\\-73\\112.3047\\-88.18723\\-73\\114.2578\\-89.20342\\-73\\116.2109\\-90.11723\\-73\\118.1641\\-91.29436\\-73\\120.1172\\-92.25231\\-73\\122.0703\\-93.46122\\-73\\124.0234\\-94.43326\\-73\\125.9766\\-95.71456\\-73\\129.8828\\-98.42567\\-73\\133.7891\\-101.5113\\-73\\135.7422\\-103.2257\\-73\\139.6484\\-107.1426\\-73\\141.0362\\-108.4609\\-73\\142.6345\\-110.4141\\-73\\145.9612\\-114.3203\\-73\\147.4609\\-116.4428\\-73\\149.9126\\-120.1797\\-73\\150.9032\\-122.1328\\-73\\151.3672\\-122.7331\\-73\\153.3203\\-126.0119\\-73\\155.4913\\-129.9453\\-73\\157.0358\\-133.8516\\-73\\158.0088\\-135.8047\\-73\\158.6945\\-137.7578\\-73\\159.6946\\-139.7109\\-73\\160.8528\\-143.6172\\-73\\161.581\\-145.5703\\-73\\161.969\\-147.5234\\-73\\162.6347\\-151.4297\\-73\\163.66\\-155.3359\\-73\\164.3313\\-161.1953\\-73\\164.6396\\-163.1484\\-73\\165.3539\\-167.0547\\-73\\165.7159\\-170.9609\\-73\\166.06\\-176.8203\\-73\\166.3504\\-184.6328\\-73\\166.4201\\-188.5391\\-73\\166.4717\\-194.3984\\-73\\166.3393\\-202.2109\\-73\\166.1994\\-208.0703\\-73\\166.0454\\-211.9766\\-73\\165.6743\\-217.8359\\-73\\165.4455\\-219.7891\\-73\\164.585\\-223.6953\\-73\\163.9512\\-227.6016\\-73\\163.5773\\-229.5547\\-73\\162.8309\\-231.5078\\-73\\161.9416\\-235.4141\\-73\\161.3164\\-237.3672\\-73\\160.3948\\-239.3203\\-73\\159.7055\\-241.2734\\-73\\158.5502\\-243.2266\\-73\\157.7358\\-245.1797\\-73\\156.5529\\-247.1328\\-73\\155.819\\-249.0859\\-73\\154.583\\-251.0391\\-73\\153.5226\\-252.9922\\-73\\152.1588\\-254.9453\\-73\\150.6185\\-256.8984\\-73\\148.083\\-260.8047\\-73\\146.3515\\-262.7578\\-73\\144.4953\\-264.7109\\-73\\141.6016\\-268.1406\\-73\\139.6484\\-270.0035\\-73\\137.1245\\-272.5234\\-73\\135.2699\\-274.4766\\-73\\131.8359\\-277.3577\\-73\\127.9297\\-280.8554\\-73\\124.0234\\-283.5181\\-73\\120.1172\\-286.6174\\-73\\118.1641\\-287.7369\\-73\\116.2109\\-289.0199\\-73\\112.3047\\-291.2029\\-73\\110.3516\\-292.5461\\-73\\108.3984\\-293.4577\\-73\\106.4453\\-294.5759\\-73\\104.4922\\-295.216\\-73\\102.5391\\-296.1473\\-73\\100.5859\\-296.8482\\-73\\98.63281\\-297.4227\\-73\\96.67969\\-298.3698\\-73\\92.77344\\-299.3641\\-73\\90.82031\\-300.0036\\-73\\88.86719\\-300.4261\\-73\\86.91406\\-300.6791\\-73\\83.00781\\-301.0475\\-73\\79.10156\\-301.2706\\-73\\75.19531\\-301.332\\-73\\69.33594\\-301.1796\\-73\\65.42969\\-300.9008\\-73\\61.52344\\-300.4393\\-73\\59.57031\\-299.9619\\-73\\57.61719\\-299.2951\\-73\\55.66406\\-298.7816\\-73\\53.71094\\-298.1378\\-73\\51.75781\\-297.1476\\-73\\49.80469\\-296.5056\\-73\\47.85156\\-295.3205\\-73\\45.89844\\-294.5592\\-73\\40.03906\\-290.4831\\-73\\38.08594\\-288.9656\\-73\\34.82365\\-286.1953\\-73\\30.81939\\-282.2891\\-73\\28.72467\\-280.3359\\-73\\27.02986\\-278.3828\\-73\\24.41406\\-275.6529\\-73\\21.71947\\-272.5234\\-73\\20.19004\\-270.5703\\-73\\18.81343\\-268.6172\\-73\\16.60156\\-266.3295\\-73\\14.64844\\-264.8528\\-73\\12.69531\\-263.8927\\-73\\10.74219\\-263.2092\\-73\\8.789063\\-263.0647\\-73\\2.929688\\-263.0987\\-73\\0.9765625\\-263.2879\\-73\\-0.9765625\\-263.6883\\-73\\-4.882813\\-263.9315\\-73\\-6.835938\\-263.9966\\-73\\-10.74219\\-264.2271\\-73\\-12.69531\\-264.856\\-73\\-14.64844\\-266.0624\\-73\\-16.60156\\-267.9375\\-73\\-18.91327\\-270.5703\\-73\\-20.35938\\-272.5234\\-73\\-21.9585\\-274.4766\\-73\\-23.97576\\-276.4297\\-73\\-28.32031\\-280.8458\\-73\\-32.22656\\-284.4423\\-73\\-34.17969\\-286.4082\\-73\\-38.08594\\-289.4851\\-73\\-38.7703\\-290.1016\\-73\\-41.99219\\-292.6349\\-73\\-45.89844\\-294.9287\\-73\\-49.80469\\-296.772\\-73\\-51.75781\\-297.4385\\-73\\-53.71094\\-298.4554\\-73\\-55.66406\\-299.0043\\-73\\-59.57031\\-300.2767\\-73\\-61.52344\\-300.6094\\-73\\-63.47656\\-300.8438\\-73\\-67.38281\\-301.188\\-73\\-69.33594\\-301.3094\\-73\\-73.24219\\-301.4095\\-73\\-75.19531\\-301.396\\-73\\-81.05469\\-301.0475\\-73\\-84.96094\\-300.6585\\-73\\-86.91406\\-300.3733\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "320" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "90" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-300.2515\\-71\\-90.82031\\-299.1123\\-71\\-92.77344\\-298.6882\\-71\\-94.72656\\-298.0757\\-71\\-96.67969\\-297.2043\\-71\\-98.63281\\-296.7091\\-71\\-100.5859\\-295.7464\\-71\\-104.4922\\-294.2224\\-71\\-104.7726\\-294.0078\\-71\\-108.2403\\-292.0547\\-71\\-110.3516\\-290.8091\\-71\\-112.3047\\-289.4442\\-71\\-114.2578\\-288.5405\\-71\\-116.2109\\-287.1221\\-71\\-118.1641\\-285.5671\\-71\\-122.0703\\-282.767\\-71\\-124.0234\\-281.2339\\-71\\-129.317\\-276.4297\\-71\\-131.8359\\-273.971\\-71\\-135.08\\-270.5703\\-71\\-136.7188\\-268.6172\\-71\\-137.6953\\-267.5769\\-71\\-139.6484\\-265.1622\\-71\\-140.0997\\-264.7109\\-71\\-141.6016\\-262.7477\\-71\\-142.8497\\-260.8047\\-71\\-143.5547\\-259.9531\\-71\\-145.5078\\-257.2937\\-71\\-145.874\\-256.8984\\-71\\-147.4609\\-254.6542\\-71\\-149.8005\\-251.0391\\-71\\-150.7577\\-249.0859\\-71\\-152.1255\\-247.1328\\-71\\-153.3203\\-245.1029\\-71\\-155.4349\\-241.2734\\-71\\-157.0651\\-237.3672\\-71\\-158.0836\\-235.4141\\-71\\-158.9133\\-233.4609\\-71\\-159.9599\\-231.5078\\-71\\-160.6322\\-229.5547\\-71\\-161.5749\\-227.6016\\-71\\-162.1153\\-225.6484\\-71\\-162.5325\\-223.6953\\-71\\-163.3336\\-221.7422\\-71\\-163.8661\\-219.7891\\-71\\-164.2503\\-217.8359\\-71\\-164.7949\\-215.8828\\-71\\-165.5038\\-213.9297\\-71\\-166.2381\\-210.0234\\-71\\-167.2191\\-206.1172\\-71\\-167.7677\\-202.2109\\-71\\-168.0938\\-198.3047\\-71\\-168.521\\-190.4922\\-71\\-168.6035\\-186.5859\\-71\\-168.6175\\-182.6797\\-71\\-168.2798\\-174.8672\\-71\\-168.0753\\-170.9609\\-71\\-167.6255\\-165.1016\\-71\\-167.3917\\-163.1484\\-71\\-166.6028\\-159.2422\\-71\\-165.5527\\-153.3828\\-71\\-164.3638\\-149.4766\\-71\\-163.568\\-145.5703\\-71\\-162.7533\\-143.6172\\-71\\-162.236\\-141.6641\\-71\\-161.8195\\-139.7109\\-71\\-161.1328\\-137.9659\\-71\\-159.4035\\-133.8516\\-71\\-158.3205\\-131.8984\\-71\\-157.5305\\-129.9453\\-71\\-156.3834\\-127.9922\\-71\\-155.5892\\-126.0391\\-71\\-155.2734\\-125.5875\\-71\\-153.3279\\-122.1328\\-71\\-152.0287\\-120.1797\\-71\\-150.5241\\-118.2266\\-71\\-149.4141\\-116.284\\-71\\-148.0824\\-114.3203\\-71\\-145.5078\\-110.9808\\-71\\-143.5547\\-108.6312\\-71\\-141.6282\\-106.5078\\-71\\-139.6213\\-104.5547\\-71\\-137.4489\\-102.6016\\-71\\-135.1004\\-100.6484\\-71\\-133.7891\\-99.74847\\-71\\-129.8828\\-96.7001\\-71\\-127.9297\\-95.44244\\-71\\-125.9766\\-94.07201\\-71\\-124.0234\\-93.21571\\-71\\-123.4253\\-92.83594\\-71\\-118.1641\\-90.0524\\-71\\-114.2578\\-88.21263\\-71\\-112.3047\\-87.63898\\-71\\-110.3516\\-86.76363\\-71\\-108.3984\\-86.05782\\-71\\-106.4453\\-85.55036\\-71\\-104.4922\\-84.88287\\-71\\-100.5859\\-83.90646\\-71\\-96.67969\\-82.75751\\-71\\-92.77344\\-82.06788\\-71\\-88.86719\\-81.69363\\-71\\-84.96094\\-80.86737\\-71\\-81.05469\\-80.56009\\-71\\-75.19531\\-80.26111\\-71\\-71.28906\\-80.27209\\-71\\-67.38281\\-80.35764\\-71\\-61.52344\\-80.62212\\-71\\-57.61719\\-80.92342\\-71\\-51.75781\\-81.77938\\-71\\-45.89844\\-82.42578\\-71\\-43.94531\\-82.75459\\-71\\-40.03906\\-83.70142\\-71\\-38.08594\\-84.09727\\-71\\-36.13281\\-84.60686\\-71\\-34.17969\\-85.36148\\-71\\-32.22656\\-85.98756\\-71\\-30.27344\\-86.49179\\-71\\-28.32031\\-87.40807\\-71\\-26.36719\\-88.07004\\-71\\-24.48918\\-88.92969\\-71\\-22.46094\\-90.04095\\-71\\-21.2279\\-90.88281\\-71\\-18.68557\\-92.83594\\-71\\-16.60156\\-94.62772\\-71\\-14.64844\\-96.44497\\-71\\-12.61684\\-98.69531\\-71\\-9.606482\\-102.6016\\-71\\-6.835938\\-105.9777\\-71\\-4.647391\\-108.4609\\-71\\-2.929688\\-110.0776\\-71\\-0.9765625\\-111.3645\\-71\\0.9765625\\-110.4459\\-71\\2.929688\\-108.0723\\-71\\4.882813\\-105.4104\\-71\\6.835938\\-102.9105\\-71\\8.789063\\-100.8096\\-71\\10.9375\\-98.69531\\-71\\12.80063\\-96.74219\\-71\\14.77798\\-94.78906\\-71\\17.04102\\-92.83594\\-71\\20.50781\\-90.06307\\-71\\22.46094\\-88.67741\\-71\\24.41406\\-87.62512\\-71\\28.54773\\-85.02344\\-71\\32.43132\\-83.07031\\-71\\34.17969\\-82.29604\\-71\\36.13281\\-81.76115\\-71\\38.08594\\-81.05926\\-71\\40.03906\\-80.47737\\-71\\41.99219\\-80.15941\\-71\\45.89844\\-79.33355\\-71\\49.80469\\-78.71183\\-71\\53.71094\\-78.39373\\-71\\57.61719\\-78.21727\\-71\\61.52344\\-78.19949\\-71\\65.42969\\-78.26398\\-71\\69.33594\\-78.41055\\-71\\71.28906\\-78.56175\\-71\\73.24219\\-78.58166\\-71\\75.19531\\-78.78846\\-71\\79.10156\\-79.5943\\-71\\81.05469\\-79.87817\\-71\\84.96094\\-80.21432\\-71\\88.86719\\-80.7797\\-71\\92.77344\\-81.6665\\-71\\96.67969\\-82.36068\\-71\\98.63281\\-82.86749\\-71\\102.5391\\-84.10829\\-71\\104.4922\\-84.7916\\-71\\106.4453\\-85.65533\\-71\\108.3984\\-86.28333\\-71\\110.3516\\-87.0676\\-71\\114.2578\\-88.43423\\-71\\116.2109\\-89.64048\\-71\\118.1641\\-90.49355\\-71\\120.1172\\-91.77847\\-71\\124.0234\\-93.90679\\-71\\125.9766\\-95.24904\\-71\\127.9297\\-96.40717\\-71\\131.8359\\-99.5612\\-71\\133.2921\\-100.6484\\-71\\135.714\\-102.6016\\-71\\141.6016\\-108.5463\\-71\\142.8841\\-110.4141\\-71\\146.2645\\-114.3203\\-71\\147.7266\\-116.2734\\-71\\148.8105\\-118.2266\\-71\\150.1225\\-120.1797\\-71\\151.3672\\-122.3839\\-71\\153.3203\\-125.6798\\-71\\153.5983\\-126.0391\\-71\\154.4935\\-127.9922\\-71\\155.6458\\-129.9453\\-71\\156.3219\\-131.8984\\-71\\157.1392\\-133.8516\\-71\\158.0556\\-135.8047\\-71\\158.7256\\-137.7578\\-71\\159.7033\\-139.7109\\-71\\160.8392\\-143.6172\\-71\\161.5975\\-145.5703\\-71\\161.9759\\-147.5234\\-71\\162.5877\\-151.4297\\-71\\163.5957\\-155.3359\\-71\\163.8555\\-157.2891\\-71\\164.2631\\-161.1953\\-71\\164.7984\\-165.1016\\-71\\165.1611\\-167.0547\\-71\\165.5963\\-170.9609\\-71\\165.9379\\-176.8203\\-71\\166.1472\\-182.6797\\-71\\166.2651\\-188.5391\\-71\\166.2651\\-196.3516\\-71\\166.1767\\-202.2109\\-71\\166.0457\\-208.0703\\-71\\165.9033\\-211.9766\\-71\\165.6884\\-215.8828\\-71\\165.5187\\-217.8359\\-71\\165.2135\\-219.7891\\-71\\164.7551\\-221.7422\\-71\\164.4088\\-223.6953\\-71\\163.8449\\-227.6016\\-71\\163.3719\\-229.5547\\-71\\162.6174\\-231.5078\\-71\\161.8189\\-235.4141\\-71\\160.2253\\-239.3203\\-71\\159.5052\\-241.2734\\-71\\158.3668\\-243.2266\\-71\\157.5586\\-245.1797\\-71\\156.4276\\-247.1328\\-71\\155.6396\\-249.0859\\-71\\153.3203\\-252.8826\\-71\\152.0084\\-254.9453\\-71\\149.0622\\-258.8516\\-71\\147.9143\\-260.8047\\-71\\145.5078\\-263.4533\\-71\\140.911\\-268.6172\\-71\\139.6484\\-269.7502\\-71\\134.9654\\-274.4766\\-71\\127.9297\\-280.5403\\-71\\125.9766\\-281.8389\\-71\\122.9016\\-284.2422\\-71\\120.1172\\-286.29\\-71\\118.1641\\-287.491\\-71\\116.2109\\-288.8534\\-71\\114.2578\\-289.7407\\-71\\113.805\\-290.1016\\-71\\110.3516\\-292.2055\\-71\\106.9388\\-294.0078\\-71\\106.4453\\-294.3333\\-71\\102.5391\\-295.8137\\-71\\100.5859\\-296.6947\\-71\\98.63281\\-297.2116\\-71\\96.67969\\-298.1011\\-71\\94.72656\\-298.7085\\-71\\92.77344\\-299.1565\\-71\\88.86719\\-300.2413\\-71\\86.91406\\-300.5278\\-71\\83.00781\\-300.907\\-71\\81.05469\\-301.0403\\-71\\75.19531\\-301.2006\\-71\\71.28906\\-301.1342\\-71\\67.38281\\-300.9593\\-71\\63.47656\\-300.5954\\-71\\61.52344\\-300.3314\\-71\\57.61719\\-299.1673\\-71\\55.66406\\-298.6742\\-71\\53.71094\\-297.9217\\-71\\51.75781\\-297.0417\\-71\\49.80469\\-296.369\\-71\\47.85156\\-295.2178\\-71\\45.89844\\-294.4273\\-71\\41.99219\\-291.6418\\-71\\40.03906\\-290.3406\\-71\\38.08594\\-288.8809\\-71\\34.85243\\-286.1953\\-71\\32.22656\\-283.6621\\-71\\28.32031\\-280.1621\\-71\\26.36719\\-278.0135\\-71\\22.46094\\-273.8378\\-71\\20.50781\\-271.5081\\-71\\18.55469\\-269.3311\\-71\\16.60156\\-267.6558\\-71\\14.64844\\-266.248\\-71\\12.69531\\-265.7755\\-71\\10.74219\\-265.1898\\-71\\8.789063\\-265.0997\\-71\\2.929688\\-265.1147\\-71\\0.9765625\\-265.3224\\-71\\-0.9765625\\-265.6786\\-71\\-4.882813\\-265.9497\\-71\\-8.789063\\-266.1487\\-71\\-10.74219\\-266.3047\\-71\\-12.69531\\-266.7538\\-71\\-14.64844\\-267.5771\\-71\\-16.60156\\-269.0031\\-71\\-18.55469\\-270.9793\\-71\\-19.8093\\-272.5234\\-71\\-21.58134\\-274.4766\\-71\\-23.63709\\-276.4297\\-71\\-28.32031\\-280.9755\\-71\\-31.99926\\-284.2422\\-71\\-34.17969\\-286.3531\\-71\\-38.08594\\-289.4255\\-71\\-38.85938\\-290.1016\\-71\\-41.99219\\-292.5132\\-71\\-45.89844\\-294.8475\\-71\\-47.85156\\-295.6354\\-71\\-49.80469\\-296.6717\\-71\\-51.75781\\-297.2926\\-71\\-53.71094\\-298.3205\\-71\\-57.61719\\-299.455\\-71\\-59.57031\\-300.1414\\-71\\-61.52344\\-300.5201\\-71\\-63.47656\\-300.7545\\-71\\-69.33594\\-301.1966\\-71\\-73.24219\\-301.2964\\-71\\-75.19531\\-301.2835\\-71\\-79.10156\\-301.0954\\-71\\-83.00781\\-300.7873\\-71\\-84.96094\\-300.5769\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "317" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "91" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-300.1164\\-69\\-88.86719\\-299.4703\\-69\\-92.77344\\-298.5845\\-69\\-96.67969\\-297.0948\\-69\\-98.63281\\-296.5942\\-69\\-100.5859\\-295.5689\\-69\\-102.5391\\-294.9181\\-69\\-104.4541\\-294.0078\\-69\\-106.4453\\-292.9468\\-69\\-108.3984\\-291.6418\\-69\\-110.3516\\-290.6482\\-69\\-112.3047\\-289.3116\\-69\\-114.2578\\-288.2969\\-69\\-116.2109\\-286.9577\\-69\\-120.1172\\-283.876\\-69\\-122.0703\\-282.5692\\-69\\-124.0234\\-281.0468\\-69\\-129.1299\\-276.4297\\-69\\-131.8359\\-273.801\\-69\\-134.9306\\-270.5703\\-69\\-137.6953\\-267.4037\\-69\\-139.9472\\-264.7109\\-69\\-141.6016\\-262.5568\\-69\\-142.7327\\-260.8047\\-69\\-144.2901\\-258.8516\\-69\\-147.4609\\-254.4798\\-69\\-149.6469\\-251.0391\\-69\\-150.6633\\-249.0859\\-69\\-152.02\\-247.1328\\-69\\-153.0851\\-245.1797\\-69\\-154.2495\\-243.2266\\-69\\-155.2816\\-241.2734\\-69\\-156.1716\\-239.3203\\-69\\-156.9034\\-237.3672\\-69\\-157.9942\\-235.4141\\-69\\-158.7477\\-233.4609\\-69\\-159.8726\\-231.5078\\-69\\-160.4992\\-229.5547\\-69\\-161.4306\\-227.6016\\-69\\-162.032\\-225.6484\\-69\\-162.437\\-223.6953\\-69\\-163.7795\\-219.7891\\-69\\-164.6169\\-215.8828\\-69\\-165.332\\-213.9297\\-69\\-165.7804\\-211.9766\\-69\\-166.5193\\-208.0703\\-69\\-167.0448\\-206.1172\\-69\\-167.4143\\-204.1641\\-69\\-167.6647\\-202.2109\\-69\\-168.1195\\-196.3516\\-69\\-168.3262\\-192.4453\\-69\\-168.4504\\-188.5391\\-69\\-168.4768\\-182.6797\\-69\\-168.288\\-176.8203\\-69\\-168.1176\\-172.9141\\-69\\-167.8878\\-169.0078\\-69\\-167.5614\\-165.1016\\-69\\-167.3023\\-163.1484\\-69\\-166.51\\-159.2422\\-69\\-165.8711\\-155.3359\\-69\\-165.501\\-153.3828\\-69\\-164.8582\\-151.4297\\-69\\-164.3384\\-149.4766\\-69\\-163.5391\\-145.5703\\-69\\-162.7189\\-143.6172\\-69\\-161.8108\\-139.7109\\-69\\-159.3667\\-133.8516\\-69\\-158.2992\\-131.8984\\-69\\-157.4857\\-129.9453\\-69\\-156.3766\\-127.9922\\-69\\-155.6039\\-126.0391\\-69\\-154.4167\\-124.0859\\-69\\-153.3579\\-122.1328\\-69\\-152.0735\\-120.1797\\-69\\-150.6145\\-118.2266\\-69\\-149.5332\\-116.2734\\-69\\-148.2034\\-114.3203\\-69\\-143.6554\\-108.4609\\-69\\-141.9601\\-106.5078\\-69\\-140.0876\\-104.5547\\-69\\-137.6953\\-102.2735\\-69\\-135.7422\\-100.6232\\-69\\-133.7891\\-99.2727\\-69\\-130.5938\\-96.74219\\-69\\-129.8828\\-96.11192\\-69\\-127.8701\\-94.78906\\-69\\-125.9766\\-93.7873\\-69\\-124.0234\\-92.63311\\-69\\-122.0703\\-91.62389\\-69\\-120.1172\\-90.45258\\-69\\-118.1641\\-89.63932\\-69\\-116.2109\\-88.5625\\-69\\-114.2578\\-87.90206\\-69\\-112.2233\\-86.97656\\-69\\-110.3516\\-86.25666\\-69\\-106.4453\\-84.85828\\-69\\-104.4922\\-84.27369\\-69\\-102.5391\\-83.89947\\-69\\-100.5859\\-83.41706\\-69\\-98.63281\\-82.68406\\-69\\-96.67969\\-82.21667\\-69\\-88.86719\\-81.10891\\-69\\-86.91406\\-80.72798\\-69\\-83.00781\\-80.28991\\-69\\-79.10156\\-80.0921\\-69\\-75.19531\\-79.81735\\-69\\-73.24219\\-79.78989\\-69\\-67.38281\\-79.93089\\-69\\-65.42969\\-80.085\\-69\\-61.52344\\-80.23334\\-69\\-55.66406\\-80.63901\\-69\\-53.71094\\-80.88251\\-69\\-49.80469\\-81.52648\\-69\\-43.94531\\-82.20864\\-69\\-41.99219\\-82.4709\\-69\\-40.03906\\-82.89346\\-69\\-34.17969\\-84.47174\\-69\\-32.22656\\-85.20605\\-69\\-28.32031\\-86.52734\\-69\\-26.36719\\-87.38092\\-69\\-24.41406\\-88.1113\\-69\\-22.86458\\-88.92969\\-69\\-20.50781\\-90.32372\\-69\\-18.55469\\-91.90343\\-69\\-14.64844\\-95.43197\\-69\\-11.6442\\-98.69531\\-69\\-8.292906\\-102.6016\\-69\\-6.863318\\-104.5547\\-69\\-5.117563\\-106.5078\\-69\\-2.929688\\-108.6689\\-69\\-0.9765625\\-109.7357\\-69\\0.9765625\\-108.8835\\-69\\1.365459\\-108.4609\\-69\\4.336229\\-104.5547\\-69\\6.008469\\-102.6016\\-69\\7.788874\\-100.6484\\-69\\11.68981\\-96.74219\\-69\\12.69531\\-95.6386\\-69\\15.67508\\-92.83594\\-69\\18.55469\\-90.46429\\-69\\20.67814\\-88.92969\\-69\\24.41406\\-86.59031\\-69\\26.36719\\-85.51172\\-69\\28.32031\\-84.22126\\-69\\32.22656\\-82.33262\\-69\\34.17969\\-81.7187\\-69\\36.13281\\-80.95181\\-69\\38.08594\\-80.40404\\-69\\41.99219\\-79.57639\\-69\\43.94531\\-79.05556\\-69\\45.89844\\-78.69195\\-69\\49.80469\\-78.17522\\-69\\53.71094\\-77.89838\\-69\\57.61719\\-77.68584\\-69\\61.52344\\-77.64117\\-69\\67.38281\\-77.79946\\-69\\71.28906\\-78.10847\\-69\\75.19531\\-78.21146\\-69\\77.14844\\-78.51505\\-69\\83.00781\\-79.59733\\-69\\84.96094\\-79.7686\\-69\\90.82031\\-80.62554\\-69\\92.77344\\-81.06022\\-69\\94.72656\\-81.61244\\-69\\98.63281\\-82.34106\\-69\\100.5859\\-82.88536\\-69\\102.5391\\-83.65497\\-69\\104.4922\\-84.25278\\-69\\108.3984\\-85.84423\\-69\\110.3516\\-86.42318\\-69\\114.2578\\-88.05393\\-69\\118.1641\\-89.97903\\-69\\120.1172\\-91.17722\\-69\\122.0703\\-92.26991\\-69\\124.0234\\-93.53934\\-69\\125.9766\\-94.58894\\-69\\127.9297\\-95.95964\\-69\\131.8359\\-99.11384\\-69\\133.7891\\-100.4964\\-69\\135.7422\\-102.1398\\-69\\140.1032\\-106.5078\\-69\\141.9449\\-108.4609\\-69\\143.2746\\-110.4141\\-69\\146.4781\\-114.3203\\-69\\147.999\\-116.2734\\-69\\148.9715\\-118.2266\\-69\\150.2717\\-120.1797\\-69\\151.4338\\-122.1328\\-69\\152.4936\\-124.0859\\-69\\153.7417\\-126.0391\\-69\\154.5944\\-127.9922\\-69\\155.7414\\-129.9453\\-69\\156.3578\\-131.8984\\-69\\158.0672\\-135.8047\\-69\\158.7161\\-137.7578\\-69\\159.6889\\-139.7109\\-69\\160.7783\\-143.6172\\-69\\161.583\\-145.5703\\-69\\161.969\\-147.5234\\-69\\162.5013\\-151.4297\\-69\\162.927\\-153.3828\\-69\\163.4961\\-155.3359\\-69\\163.7827\\-157.2891\\-69\\164.6099\\-165.1016\\-69\\165.2261\\-169.0078\\-69\\165.4455\\-170.9609\\-69\\165.8035\\-176.8203\\-69\\165.9619\\-180.7266\\-69\\166.0904\\-186.5859\\-69\\166.1326\\-192.4453\\-69\\166.0811\\-198.3047\\-69\\165.9958\\-204.1641\\-69\\165.7552\\-211.9766\\-69\\165.5187\\-215.8828\\-69\\165.2982\\-217.8359\\-69\\164.5235\\-221.7422\\-69\\163.7042\\-227.6016\\-69\\162.4748\\-231.5078\\-69\\162.1212\\-233.4609\\-69\\161.6626\\-235.4141\\-69\\160.7783\\-237.3672\\-69\\160.0576\\-239.3203\\-69\\159.2024\\-241.2734\\-69\\158.1926\\-243.2266\\-69\\157.2937\\-245.1797\\-69\\156.2968\\-247.1328\\-69\\155.4219\\-249.0859\\-69\\154.2618\\-251.0391\\-69\\152.9584\\-252.9922\\-69\\151.7991\\-254.9453\\-69\\148.882\\-258.8516\\-69\\147.6653\\-260.8047\\-69\\145.9961\\-262.7578\\-69\\140.6986\\-268.6172\\-69\\138.6148\\-270.5703\\-69\\135.7422\\-273.5269\\-69\\133.7891\\-275.3294\\-69\\129.8828\\-278.6058\\-69\\127.7255\\-280.3359\\-69\\125.9766\\-281.6185\\-69\\122.0703\\-284.6133\\-69\\116.847\\-288.1484\\-69\\116.2109\\-288.6402\\-69\\114.2578\\-289.4738\\-69\\112.3047\\-290.7991\\-69\\110.3516\\-291.7947\\-69\\108.3984\\-292.9985\\-69\\104.4922\\-294.906\\-69\\102.5391\\-295.5171\\-69\\100.5859\\-296.4987\\-69\\98.63281\\-297.0287\\-69\\96.67969\\-297.7188\\-69\\94.72656\\-298.5129\\-69\\90.82031\\-299.4066\\-69\\88.86719\\-299.9765\\-69\\86.91406\\-300.3555\\-69\\83.00781\\-300.7656\\-69\\79.10156\\-300.9791\\-69\\75.19531\\-301.0522\\-69\\71.28906\\-301.0095\\-69\\67.38281\\-300.8438\\-69\\63.47656\\-300.4933\\-69\\61.52344\\-300.1841\\-69\\59.57031\\-299.5641\\-69\\55.66406\\-298.5668\\-69\\53.71094\\-297.6788\\-69\\49.80469\\-296.1739\\-69\\47.85156\\-295.1248\\-69\\45.89844\\-294.292\\-69\\41.99219\\-291.4785\\-69\\38.08594\\-288.8061\\-69\\34.87203\\-286.1953\\-69\\32.22656\\-283.7209\\-69\\28.32031\\-280.4987\\-69\\22.46094\\-274.4509\\-69\\20.50781\\-272.266\\-69\\18.55469\\-270.2624\\-69\\16.60156\\-269.0127\\-69\\14.64844\\-268.09\\-69\\12.69531\\-267.5511\\-69\\10.74219\\-267.1821\\-69\\8.789063\\-267.1523\\-69\\2.929688\\-267.1776\\-69\\0.9765625\\-267.284\\-69\\-0.9765625\\-267.5217\\-69\\-2.929688\\-267.5897\\-69\\-4.882813\\-267.9284\\-69\\-6.835938\\-268.1057\\-69\\-10.74219\\-268.3395\\-69\\-12.69531\\-268.5488\\-69\\-14.64844\\-269.0938\\-69\\-16.60156\\-269.9954\\-69\\-18.55469\\-271.7022\\-69\\-21.121\\-274.4766\\-69\\-24.41406\\-277.4718\\-69\\-28.32031\\-281.1104\\-69\\-31.99527\\-284.2422\\-69\\-34.17969\\-286.2786\\-69\\-36.13281\\-287.7966\\-69\\-38.96012\\-290.1016\\-69\\-41.99219\\-292.4012\\-69\\-43.94531\\-293.4975\\-69\\-45.89844\\-294.7498\\-69\\-47.85156\\-295.4693\\-69\\-49.80469\\-296.5736\\-69\\-51.75781\\-297.1703\\-69\\-53.71094\\-298.1498\\-69\\-55.66406\\-298.7717\\-69\\-57.61719\\-299.2883\\-69\\-59.57031\\-299.9619\\-69\\-61.52344\\-300.4227\\-69\\-65.42969\\-300.8381\\-69\\-71.28906\\-301.1672\\-69\\-75.19531\\-301.1796\\-69\\-79.10156\\-301.0026\\-69\\-83.00781\\-300.7034\\-69\\-84.96094\\-300.4739\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "308" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "92" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-299.9338\\-67\\-88.86719\\-299.3318\\-67\\-92.77344\\-298.4697\\-67\\-94.72656\\-297.6068\\-67\\-98.63281\\-296.4524\\-67\\-100.5859\\-295.4148\\-67\\-102.5391\\-294.8074\\-67\\-106.4453\\-292.7939\\-67\\-108.3984\\-291.4332\\-67\\-110.3516\\-290.4293\\-67\\-112.3047\\-289.1806\\-67\\-116.2109\\-286.7878\\-67\\-116.8791\\-286.1953\\-67\\-120.1172\\-283.6497\\-67\\-122.0703\\-282.3793\\-67\\-124.0234\\-280.8488\\-67\\-124.5326\\-280.3359\\-67\\-128.9503\\-276.4297\\-67\\-131.8359\\-273.6293\\-67\\-134.7656\\-270.5703\\-67\\-137.6953\\-267.2232\\-67\\-141.6016\\-262.3985\\-67\\-142.6708\\-260.8047\\-67\\-144.2037\\-258.8516\\-67\\-145.6241\\-256.8984\\-67\\-148.3647\\-252.9922\\-67\\-150.5822\\-249.0859\\-67\\-151.9134\\-247.1328\\-67\\-152.9417\\-245.1797\\-67\\-154.1599\\-243.2266\\-67\\-156.0974\\-239.3203\\-67\\-156.7722\\-237.3672\\-67\\-157.9006\\-235.4141\\-67\\-158.5926\\-233.4609\\-67\\-159.7484\\-231.5078\\-67\\-160.3683\\-229.5547\\-67\\-161.2734\\-227.6016\\-67\\-161.9416\\-225.6484\\-67\\-162.3399\\-223.6953\\-67\\-162.8981\\-221.7422\\-67\\-163.6719\\-219.7891\\-67\\-164.452\\-215.8828\\-67\\-165.6669\\-211.9766\\-67\\-166.3504\\-208.0703\\-67\\-167.2431\\-204.1641\\-67\\-167.5408\\-202.2109\\-67\\-167.7376\\-200.2578\\-67\\-168.0038\\-196.3516\\-67\\-168.2144\\-192.4453\\-67\\-168.3302\\-188.5391\\-67\\-168.3556\\-182.6797\\-67\\-168.2144\\-176.8203\\-67\\-167.9515\\-170.9609\\-67\\-167.4774\\-165.1016\\-67\\-167.193\\-163.1484\\-67\\-166.4005\\-159.2422\\-67\\-165.8053\\-155.3359\\-67\\-165.4161\\-153.3828\\-67\\-164.761\\-151.4297\\-67\\-164.2849\\-149.4766\\-67\\-163.4538\\-145.5703\\-67\\-162.6378\\-143.6172\\-67\\-161.7691\\-139.7109\\-67\\-160.8833\\-137.7578\\-67\\-159.2605\\-133.8516\\-67\\-158.2504\\-131.8984\\-67\\-157.362\\-129.9453\\-67\\-156.321\\-127.9922\\-67\\-155.5233\\-126.0391\\-67\\-155.2734\\-125.6888\\-67\\-153.3203\\-122.1437\\-67\\-152.0691\\-120.1797\\-67\\-150.6394\\-118.2266\\-67\\-149.5768\\-116.2734\\-67\\-148.2933\\-114.3203\\-67\\-143.8427\\-108.4609\\-67\\-142.2455\\-106.5078\\-67\\-140.4486\\-104.5547\\-67\\-137.6953\\-101.8868\\-67\\-135.7422\\-100.2185\\-67\\-131.2924\\-96.74219\\-67\\-127.9297\\-94.28993\\-67\\-125.9766\\-93.43426\\-67\\-124.0234\\-92.18708\\-67\\-120.1172\\-90.01405\\-67\\-118.1641\\-89.20973\\-67\\-116.2109\\-88.16864\\-67\\-114.2578\\-87.52544\\-67\\-112.3047\\-86.53146\\-67\\-110.3516\\-85.86328\\-67\\-106.4453\\-84.34437\\-67\\-104.4922\\-83.79782\\-67\\-102.5391\\-83.46231\\-67\\-98.63281\\-82.21172\\-67\\-94.72656\\-81.52103\\-67\\-92.77344\\-81.07581\\-67\\-84.96094\\-80.1823\\-67\\-83.00781\\-79.92361\\-67\\-81.05469\\-79.76763\\-67\\-73.24219\\-79.28513\\-67\\-67.38281\\-79.48461\\-67\\-61.52344\\-79.82188\\-67\\-59.57031\\-80.03555\\-67\\-55.66406\\-80.31046\\-67\\-49.80469\\-80.85628\\-67\\-45.89844\\-81.51212\\-67\\-40.03906\\-82.25651\\-67\\-38.08594\\-82.62124\\-67\\-34.17969\\-83.85281\\-67\\-32.22656\\-84.39868\\-67\\-30.36386\\-85.02344\\-67\\-28.32031\\-85.95148\\-67\\-26.36719\\-86.53575\\-67\\-24.41406\\-87.50183\\-67\\-22.46094\\-88.28097\\-67\\-18.55469\\-90.82388\\-67\\-16.60156\\-92.6692\\-67\\-14.64844\\-94.35239\\-67\\-12.69531\\-96.296\\-67\\-10.52782\\-98.69531\\-67\\-9.078721\\-100.6484\\-67\\-5.59677\\-104.5547\\-67\\-2.929688\\-107.2054\\-67\\-0.9765625\\-108.2656\\-67\\0.9765625\\-107.398\\-67\\4.882813\\-102.7597\\-67\\8.536784\\-98.69531\\-67\\10.74219\\-96.42442\\-67\\14.47976\\-92.83594\\-67\\16.71464\\-90.88281\\-67\\18.55469\\-89.64307\\-67\\20.50781\\-88.14984\\-67\\22.46094\\-86.875\\-67\\24.41406\\-85.84183\\-67\\26.36719\\-84.53169\\-67\\30.27344\\-82.48984\\-67\\32.22656\\-81.77985\\-67\\34.17969\\-80.95181\\-67\\36.13281\\-80.38794\\-67\\38.08594\\-79.92287\\-67\\41.99219\\-78.87041\\-67\\45.89844\\-78.18124\\-67\\47.85156\\-77.89453\\-67\\53.71094\\-77.34375\\-67\\57.61719\\-77.11253\\-67\\61.52344\\-77.01563\\-67\\63.47656\\-77.04206\\-67\\67.38281\\-77.21888\\-67\\71.28906\\-77.67995\\-67\\73.24219\\-77.7993\\-67\\75.19531\\-77.80185\\-67\\77.14844\\-78.02271\\-67\\79.10156\\-78.38167\\-67\\84.47266\\-79.16406\\-67\\88.86719\\-80.02749\\-67\\92.77344\\-80.54313\\-67\\94.72656\\-80.98331\\-67\\96.67969\\-81.59508\\-67\\100.5859\\-82.40012\\-67\\104.4922\\-83.82851\\-67\\106.4453\\-84.45581\\-67\\108.3984\\-85.34421\\-67\\112.3047\\-86.63719\\-67\\114.2578\\-87.77896\\-67\\116.2109\\-88.43443\\-67\\118.1641\\-89.56573\\-67\\120.1172\\-90.5199\\-67\\124.0234\\-93.06618\\-67\\125.9766\\-94.07336\\-67\\127.9297\\-95.60066\\-67\\131.8359\\-98.54805\\-67\\133.7891\\-100.1127\\-67\\135.7422\\-101.8217\\-67\\137.6953\\-103.7279\\-67\\139.6484\\-105.8188\\-67\\140.4176\\-106.5078\\-67\\142.2084\\-108.4609\\-67\\143.7124\\-110.4141\\-67\\145.0903\\-112.3672\\-67\\148.1729\\-116.2734\\-67\\149.1382\\-118.2266\\-67\\151.591\\-122.1328\\-67\\152.5908\\-124.0859\\-67\\153.815\\-126.0391\\-67\\154.6639\\-127.9922\\-67\\155.785\\-129.9453\\-67\\156.3766\\-131.8984\\-67\\158.0487\\-135.8047\\-67\\158.6465\\-137.7578\\-67\\159.6252\\-139.7109\\-67\\160.7023\\-143.6172\\-67\\161.499\\-145.5703\\-67\\161.9178\\-147.5234\\-67\\162.4042\\-151.4297\\-67\\162.7581\\-153.3828\\-67\\163.3336\\-155.3359\\-67\\163.6927\\-157.2891\\-67\\163.9075\\-159.2422\\-67\\164.4474\\-165.1016\\-67\\164.6704\\-167.0547\\-67\\165.2385\\-170.9609\\-67\\165.561\\-174.8672\\-67\\165.8273\\-180.7266\\-67\\165.9175\\-184.6328\\-67\\165.966\\-192.4453\\-67\\165.8948\\-202.2109\\-67\\165.7589\\-208.0703\\-67\\165.483\\-213.9297\\-67\\165.2865\\-215.8828\\-67\\164.3423\\-221.7422\\-67\\163.8661\\-225.6484\\-67\\163.5063\\-227.6016\\-67\\162.7794\\-229.5547\\-67\\161.9962\\-233.4609\\-67\\161.4698\\-235.4141\\-67\\160.5481\\-237.3672\\-67\\159.8894\\-239.3203\\-67\\158.8881\\-241.2734\\-67\\158.0324\\-243.2266\\-67\\156.9569\\-245.1797\\-67\\156.1726\\-247.1328\\-67\\154.0838\\-251.0391\\-67\\152.7294\\-252.9922\\-67\\151.5416\\-254.9453\\-67\\150.1888\\-256.8984\\-67\\147.4609\\-260.6652\\-67\\145.7291\\-262.7578\\-67\\142.3124\\-266.6641\\-67\\140.4903\\-268.6172\\-67\\137.6953\\-271.2737\\-67\\135.7422\\-273.3281\\-67\\133.7891\\-275.1253\\-67\\129.8828\\-278.2133\\-67\\127.3682\\-280.3359\\-67\\124.0234\\-282.8969\\-67\\120.1172\\-285.575\\-67\\118.1641\\-287.0468\\-67\\116.2109\\-288.356\\-67\\114.2578\\-289.2757\\-67\\112.3047\\-290.5711\\-67\\110.3516\\-291.4958\\-67\\108.3984\\-292.7746\\-67\\106.4453\\-293.6557\\-67\\104.4922\\-294.7186\\-67\\102.5391\\-295.2868\\-67\\100.5859\\-296.2247\\-67\\98.63281\\-296.8677\\-67\\96.67969\\-297.3978\\-67\\94.72656\\-298.2606\\-67\\92.77344\\-298.7648\\-67\\90.82031\\-299.1595\\-67\\86.91406\\-300.1281\\-67\\83.00781\\-300.6136\\-67\\79.10156\\-300.8438\\-67\\75.19531\\-300.9184\\-67\\71.28906\\-300.8894\\-67\\67.38281\\-300.7321\\-67\\63.47656\\-300.3644\\-67\\61.52344\\-300.0026\\-67\\59.57031\\-299.3759\\-67\\55.66406\\-298.4421\\-67\\53.71094\\-297.4807\\-67\\51.75781\\-296.8543\\-67\\45.89844\\-294.1102\\-67\\43.02979\\-292.0547\\-67\\38.08594\\-288.7705\\-67\\34.85292\\-286.1953\\-67\\32.22656\\-283.841\\-67\\30.27344\\-282.3793\\-67\\28.32031\\-280.7993\\-67\\23.89172\\-276.4297\\-67\\21.79747\\-274.4766\\-67\\18.55469\\-271.3501\\-67\\16.60156\\-270.1317\\-67\\12.69531\\-269.2213\\-67\\10.74219\\-269.0369\\-67\\6.835938\\-268.9634\\-67\\2.929688\\-269.0131\\-67\\-2.929688\\-269.1764\\-67\\-4.882813\\-269.7092\\-67\\-8.789063\\-269.9633\\-67\\-10.74219\\-269.5865\\-67\\-12.69531\\-269.8536\\-67\\-14.64844\\-270.3839\\-67\\-16.60156\\-271.3243\\-67\\-18.55469\\-272.6717\\-67\\-20.50781\\-274.5869\\-67\\-24.41406\\-277.8662\\-67\\-27.19411\\-280.3359\\-67\\-30.27344\\-282.9105\\-67\\-31.95866\\-284.2422\\-67\\-34.17969\\-286.2029\\-67\\-39.0705\\-290.1016\\-67\\-41.99219\\-292.2417\\-67\\-43.94531\\-293.3668\\-67\\-45.89844\\-294.6393\\-67\\-47.85156\\-295.3418\\-67\\-49.80469\\-296.446\\-67\\-51.75781\\-297.0637\\-67\\-55.66406\\-298.6641\\-67\\-57.61719\\-299.1456\\-67\\-61.52344\\-300.3005\\-67\\-63.47656\\-300.5615\\-67\\-67.38281\\-300.8894\\-67\\-71.28906\\-301.0594\\-67\\-75.19531\\-301.0879\\-67\\-81.05469\\-300.7938\\-67\\-84.96094\\-300.3644\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "298" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "93" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-300.2413\\-65\\-88.86719\\-299.1924\\-65\\-92.77344\\-298.3133\\-65\\-94.72656\\-297.4227\\-65\\-96.67969\\-296.8953\\-65\\-98.63281\\-296.263\\-65\\-100.5859\\-295.2792\\-65\\-102.5391\\-294.6858\\-65\\-104.4922\\-293.5322\\-65\\-106.4453\\-292.6152\\-65\\-108.3984\\-291.2679\\-65\\-112.3047\\-289.0446\\-65\\-114.2578\\-287.7537\\-65\\-116.2109\\-286.5873\\-65\\-120.1172\\-283.4383\\-65\\-121.8787\\-282.2891\\-65\\-124.0234\\-280.6487\\-65\\-128.7095\\-276.4297\\-65\\-131.8359\\-273.4312\\-65\\-133.7891\\-271.338\\-65\\-134.6029\\-270.5703\\-65\\-137.6953\\-267.0434\\-65\\-141.6016\\-262.2259\\-65\\-144.1136\\-258.8516\\-65\\-145.4671\\-256.8984\\-65\\-148.2798\\-252.9922\\-65\\-150.4877\\-249.0859\\-65\\-151.8291\\-247.1328\\-65\\-152.832\\-245.1797\\-65\\-154.0766\\-243.2266\\-65\\-154.9408\\-241.2734\\-65\\-156.0136\\-239.3203\\-65\\-156.651\\-237.3672\\-65\\-157.787\\-235.4141\\-65\\-158.4473\\-233.4609\\-65\\-159.5741\\-231.5078\\-65\\-160.2367\\-229.5547\\-65\\-161.8425\\-225.6484\\-65\\-162.6967\\-221.7422\\-65\\-163.5164\\-219.7891\\-65\\-164.3094\\-215.8828\\-65\\-164.8324\\-213.9297\\-65\\-165.5215\\-211.9766\\-65\\-166.5534\\-206.1172\\-65\\-167.3712\\-202.2109\\-65\\-167.6099\\-200.2578\\-65\\-167.9982\\-194.3984\\-65\\-168.2235\\-188.5391\\-65\\-168.239\\-182.6797\\-65\\-168.175\\-178.7734\\-65\\-168.057\\-174.8672\\-65\\-167.866\\-170.9609\\-65\\-167.5698\\-167.0547\\-65\\-167.3712\\-165.1016\\-65\\-167.0588\\-163.1484\\-65\\-166.2884\\-159.2422\\-65\\-165.7124\\-155.3359\\-65\\-165.2982\\-153.3828\\-65\\-164.6396\\-151.4297\\-65\\-163.8359\\-147.5234\\-65\\-163.3212\\-145.5703\\-65\\-162.5179\\-143.6172\\-65\\-161.6825\\-139.7109\\-65\\-160.7276\\-137.7578\\-65\\-160.0236\\-135.8047\\-65\\-156.25\\-127.9922\\-65\\-155.3615\\-126.0391\\-65\\-153.3203\\-122.3302\\-65\\-152.0244\\-120.1797\\-65\\-150.6165\\-118.2266\\-65\\-149.5625\\-116.2734\\-65\\-148.3211\\-114.3203\\-65\\-146.8645\\-112.3672\\-65\\-145.5154\\-110.4141\\-65\\-142.5068\\-106.5078\\-65\\-139.6484\\-103.3814\\-65\\-137.6953\\-101.5303\\-65\\-134.421\\-98.69531\\-65\\-131.8359\\-96.63898\\-65\\-127.9297\\-93.92026\\-65\\-125.9766\\-92.79779\\-65\\-124.0234\\-91.83481\\-65\\-122.0703\\-90.63692\\-65\\-120.1172\\-89.70483\\-65\\-118.1641\\-88.64518\\-65\\-116.2109\\-87.88758\\-65\\-114.2578\\-86.90569\\-65\\-112.3047\\-86.23223\\-65\\-109.375\\-85.02344\\-65\\-106.4453\\-83.94515\\-65\\-104.4922\\-83.45952\\-65\\-100.5859\\-82.36068\\-65\\-96.67969\\-81.4402\\-65\\-94.72656\\-80.92342\\-65\\-92.77344\\-80.69169\\-65\\-86.91406\\-80.13467\\-65\\-83.00781\\-79.57037\\-65\\-77.14844\\-79.05556\\-65\\-73.24219\\-78.8601\\-65\\-67.38281\\-78.96462\\-65\\-61.52344\\-79.36418\\-65\\-53.71094\\-80.14063\\-65\\-51.75781\\-80.25957\\-65\\-47.85156\\-80.59592\\-65\\-45.89844\\-80.82866\\-65\\-40.03906\\-81.82802\\-65\\-38.08594\\-82.10651\\-65\\-36.13281\\-82.48839\\-65\\-32.22656\\-83.80746\\-65\\-30.27344\\-84.30354\\-65\\-26.36719\\-85.98122\\-65\\-24.41406\\-86.67776\\-65\\-22.46094\\-87.74289\\-65\\-20.50781\\-88.61442\\-65\\-18.55469\\-89.95579\\-65\\-15.41516\\-92.83594\\-65\\-12.69531\\-95.43197\\-65\\-9.5628\\-98.69531\\-65\\-6.068638\\-102.6016\\-65\\-2.929688\\-105.8898\\-65\\-0.9765625\\-107.0576\\-65\\0.9765625\\-105.9368\\-65\\2.193622\\-104.5547\\-65\\7.704791\\-98.69531\\-65\\10.74219\\-95.60047\\-65\\13.60212\\-92.83594\\-65\\16.60156\\-90.04867\\-65\\18.55469\\-88.53092\\-65\\20.50781\\-87.40625\\-65\\24.41406\\-84.90625\\-65\\28.32031\\-82.67821\\-65\\32.22656\\-81.07545\\-65\\34.17969\\-80.39453\\-65\\36.13281\\-79.95431\\-65\\40.03906\\-78.7336\\-65\\45.89844\\-77.68546\\-65\\49.80469\\-77.15491\\-65\\53.71094\\-76.72607\\-65\\59.57031\\-76.52276\\-65\\63.47656\\-76.54037\\-65\\67.38281\\-76.66327\\-65\\69.33594\\-76.79642\\-65\\73.24219\\-77.32275\\-65\\75.19531\\-77.37856\\-65\\77.14844\\-77.60558\\-65\\79.10156\\-77.9816\\-65\\83.00781\\-78.43164\\-65\\86.91406\\-79.11188\\-65\\88.86719\\-79.6004\\-65\\94.72656\\-80.51968\\-65\\96.67969\\-80.96875\\-65\\98.63281\\-81.68574\\-65\\102.5391\\-82.5322\\-65\\104.4922\\-83.38421\\-65\\108.3984\\-84.69569\\-65\\110.3516\\-85.60287\\-65\\112.3047\\-86.28757\\-65\\114.2578\\-87.42997\\-65\\116.2109\\-88.06093\\-65\\120.1172\\-90.05183\\-65\\122.0703\\-91.36758\\-65\\124.0234\\-92.45501\\-65\\127.4884\\-94.78906\\-65\\129.8828\\-96.55958\\-65\\134.8208\\-100.6484\\-65\\137.6953\\-103.3975\\-65\\140.6767\\-106.5078\\-65\\142.4132\\-108.4609\\-65\\143.9807\\-110.4141\\-65\\145.3438\\-112.3672\\-65\\148.2706\\-116.2734\\-65\\150.4339\\-120.1797\\-65\\151.682\\-122.1328\\-65\\152.6633\\-124.0859\\-65\\153.8739\\-126.0391\\-65\\154.6862\\-127.9922\\-65\\155.7983\\-129.9453\\-65\\156.3525\\-131.8984\\-65\\158.0028\\-135.8047\\-65\\158.5535\\-137.7578\\-65\\159.518\\-139.7109\\-65\\160.5842\\-143.6172\\-65\\161.3235\\-145.5703\\-65\\161.8357\\-147.5234\\-65\\162.6107\\-153.3828\\-65\\163.5554\\-157.2891\\-65\\163.8075\\-159.2422\\-65\\164.304\\-165.1016\\-65\\164.681\\-169.0078\\-65\\164.9571\\-170.9609\\-65\\165.3752\\-174.8672\\-65\\165.6196\\-178.7734\\-65\\165.8014\\-186.5859\\-65\\165.8074\\-194.3984\\-65\\165.7424\\-200.2578\\-65\\165.7552\\-202.2109\\-65\\165.5963\\-208.0703\\-65\\165.3959\\-211.9766\\-65\\165.2385\\-213.9297\\-65\\164.668\\-217.8359\\-65\\163.7121\\-225.6484\\-65\\163.2425\\-227.6016\\-65\\162.5813\\-229.5547\\-65\\161.8546\\-233.4609\\-65\\161.1871\\-235.4141\\-65\\160.3527\\-237.3672\\-65\\159.7087\\-239.3203\\-65\\158.6225\\-241.2734\\-65\\157.8568\\-243.2266\\-65\\156.6862\\-245.1797\\-65\\156.0184\\-247.1328\\-65\\154.8479\\-249.0859\\-65\\153.8936\\-251.0391\\-65\\151.3672\\-254.7273\\-65\\150.0041\\-256.8984\\-65\\147.4609\\-260.308\\-65\\145.3369\\-262.7578\\-65\\142.0827\\-266.6641\\-65\\140.2358\\-268.6172\\-65\\138.142\\-270.5703\\-65\\135.7422\\-273.0723\\-65\\133.7891\\-274.8539\\-65\\131.8359\\-276.2925\\-65\\129.8828\\-277.8482\\-65\\127.9297\\-279.5891\\-65\\125.9766\\-281.1865\\-65\\124.0234\\-282.6072\\-65\\122.0703\\-283.8559\\-65\\118.1641\\-286.8191\\-65\\116.0048\\-288.1484\\-65\\112.5064\\-290.1016\\-65\\110.3516\\-291.2409\\-65\\108.3984\\-292.5309\\-65\\106.4453\\-293.3783\\-65\\104.4922\\-294.4928\\-65\\100.5859\\-295.8148\\-65\\98.63281\\-296.6833\\-65\\96.67969\\-297.1496\\-65\\92.77344\\-298.5633\\-65\\88.86719\\-299.3351\\-65\\84.96094\\-300.1992\\-65\\81.05469\\-300.6067\\-65\\77.14844\\-300.7534\\-65\\73.24219\\-300.7932\\-65\\67.38281\\-300.618\\-65\\63.47656\\-300.197\\-65\\55.66406\\-298.2523\\-65\\53.71094\\-297.3044\\-65\\51.75781\\-296.7501\\-65\\49.80469\\-295.7298\\-65\\47.85156\\-294.9417\\-65\\46.02944\\-294.0078\\-65\\43.94531\\-292.6956\\-65\\40.03906\\-289.9632\\-65\\38.08594\\-288.7478\\-65\\36.13281\\-287.2623\\-65\\32.22656\\-284.0534\\-65\\30.27344\\-282.6297\\-65\\28.32031\\-281.0566\\-65\\24.41406\\-277.3452\\-65\\22.46094\\-275.5609\\-65\\20.50781\\-273.9152\\-65\\18.55469\\-272.4774\\-65\\16.60156\\-271.6349\\-65\\14.64844\\-271.1817\\-65\\12.69531\\-270.8897\\-65\\8.789063\\-270.8051\\-65\\4.882813\\-270.8239\\-65\\-2.929688\\-271.0764\\-65\\-4.882813\\-271.4879\\-65\\-6.835938\\-271.6732\\-65\\-8.789063\\-271.7574\\-65\\-10.74219\\-270.7534\\-65\\-14.64844\\-272.0941\\-65\\-16.60156\\-272.7033\\-65\\-18.55469\\-273.6277\\-65\\-21.93377\\-276.4297\\-65\\-24.37233\\-278.3828\\-65\\-26.69271\\-280.3359\\-65\\-28.32031\\-281.4985\\-65\\-31.79721\\-284.2422\\-65\\-34.17969\\-286.2182\\-65\\-36.13281\\-287.6534\\-65\\-39.21022\\-290.1016\\-65\\-42.05668\\-292.0547\\-65\\-45.20089\\-294.0078\\-65\\-45.89844\\-294.5095\\-65\\-47.85156\\-295.2378\\-65\\-49.80469\\-296.2888\\-65\\-53.71094\\-297.6682\\-65\\-55.66406\\-298.5457\\-65\\-59.57031\\-299.5461\\-65\\-61.52344\\-300.1621\\-65\\-63.47656\\-300.4624\\-65\\-67.38281\\-300.8045\\-65\\-71.28906\\-300.9542\\-65\\-75.19531\\-300.9709\\-65\\-81.05469\\-300.6987\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "316" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "94" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-300.0666\\-63\\-86.91406\\-299.5138\\-63\\-90.82031\\-298.6759\\-63\\-92.77344\\-298.1011\\-63\\-94.72656\\-297.2649\\-63\\-96.67969\\-296.7802\\-63\\-98.63281\\-296.0313\\-63\\-100.5859\\-295.1664\\-63\\-102.5391\\-294.5317\\-63\\-104.4922\\-293.343\\-63\\-106.4453\\-292.3889\\-63\\-110.3516\\-289.8786\\-63\\-112.3047\\-288.8904\\-63\\-114.2578\\-287.5509\\-63\\-116.2109\\-286.3369\\-63\\-120.1172\\-283.2713\\-63\\-121.5863\\-282.2891\\-63\\-124.0234\\-280.378\\-63\\-128.4888\\-276.4297\\-63\\-131.8359\\-273.2228\\-63\\-133.7891\\-271.1492\\-63\\-134.4467\\-270.5703\\-63\\-136.234\\-268.6172\\-63\\-139.3828\\-264.7109\\-63\\-141.6016\\-262.065\\-63\\-144.0264\\-258.8516\\-63\\-145.5078\\-256.6522\\-63\\-148.1995\\-252.9922\\-63\\-149.2188\\-251.0391\\-63\\-150.4087\\-249.0859\\-63\\-151.7137\\-247.1328\\-63\\-152.7077\\-245.1797\\-63\\-153.9815\\-243.2266\\-63\\-154.7953\\-241.2734\\-63\\-155.9181\\-239.3203\\-63\\-156.5442\\-237.3672\\-63\\-157.6425\\-235.4141\\-63\\-158.3168\\-233.4609\\-63\\-159.3667\\-231.5078\\-63\\-160.8412\\-227.6016\\-63\\-161.7188\\-225.6484\\-63\\-162.5398\\-221.7422\\-63\\-163.3085\\-219.7891\\-63\\-163.8359\\-217.8359\\-63\\-164.5917\\-213.9297\\-63\\-165.3209\\-211.9766\\-63\\-165.7263\\-210.0234\\-63\\-166.3355\\-206.1172\\-63\\-167.1419\\-202.2109\\-63\\-167.4338\\-200.2578\\-63\\-167.8711\\-194.3984\\-63\\-168.0923\\-188.5391\\-63\\-168.1176\\-184.6328\\-63\\-168.0634\\-178.7734\\-63\\-167.963\\-174.8672\\-63\\-167.7677\\-170.9609\\-63\\-167.4651\\-167.0547\\-63\\-167.2312\\-165.1016\\-63\\-166.5009\\-161.1953\\-63\\-165.6164\\-155.3359\\-63\\-165.1338\\-153.3828\\-63\\-164.4886\\-151.4297\\-63\\-163.7464\\-147.5234\\-63\\-162.4122\\-143.6172\\-63\\-162.0495\\-141.6641\\-63\\-161.5357\\-139.7109\\-63\\-160.5668\\-137.7578\\-63\\-159.8973\\-135.8047\\-63\\-158.8565\\-133.8516\\-63\\-158.0174\\-131.8984\\-63\\-156.9569\\-129.9453\\-63\\-156.153\\-127.9922\\-63\\-154.2033\\-124.0859\\-63\\-153.0116\\-122.1328\\-63\\-151.9279\\-120.1797\\-63\\-150.5395\\-118.2266\\-63\\-149.4861\\-116.2734\\-63\\-148.3008\\-114.3203\\-63\\-146.9523\\-112.3672\\-63\\-145.7087\\-110.4141\\-63\\-143.5547\\-107.5724\\-63\\-142.6527\\-106.5078\\-63\\-139.6484\\-103.2251\\-63\\-137.6953\\-101.3217\\-63\\-134.8522\\-98.69531\\-63\\-131.8359\\-96.23975\\-63\\-129.7862\\-94.78906\\-63\\-127.9297\\-93.57363\\-63\\-125.9766\\-92.404\\-63\\-124.0234\\-91.41235\\-63\\-122.0703\\-90.25055\\-63\\-120.1172\\-89.38093\\-63\\-118.1641\\-88.2583\\-63\\-116.2109\\-87.55395\\-63\\-114.2578\\-86.53744\\-63\\-112.3047\\-85.83724\\-63\\-110.3516\\-84.86185\\-63\\-108.3984\\-84.38604\\-63\\-104.47\\-83.07031\\-63\\-102.5391\\-82.47618\\-63\\-98.63281\\-81.65294\\-63\\-96.67969\\-80.95045\\-63\\-94.72656\\-80.60215\\-63\\-90.82031\\-80.2431\\-63\\-88.86719\\-79.98\\-63\\-86.91406\\-79.81726\\-63\\-84.96094\\-79.4548\\-63\\-81.05469\\-78.91658\\-63\\-75.19531\\-78.53583\\-63\\-69.33594\\-78.50252\\-63\\-67.38281\\-78.53627\\-63\\-65.42969\\-78.72937\\-63\\-61.52344\\-78.90498\\-63\\-57.61719\\-79.17263\\-63\\-53.71094\\-79.6899\\-63\\-49.80469\\-80.06322\\-63\\-43.94531\\-80.5732\\-63\\-41.99219\\-80.82866\\-63\\-38.08594\\-81.72173\\-63\\-34.17969\\-82.42578\\-63\\-28.32031\\-84.39918\\-63\\-26.36719\\-85.31868\\-63\\-24.41406\\-86.05708\\-63\\-20.50781\\-87.93927\\-63\\-18.97322\\-88.92969\\-63\\-16.60156\\-90.68893\\-63\\-10.74219\\-96.25787\\-63\\-8.3903\\-98.69531\\-63\\-5.023663\\-102.6016\\-63\\-2.929688\\-104.7666\\-63\\-0.9765625\\-105.7594\\-63\\0.9765625\\-104.8145\\-63\\2.929688\\-102.717\\-63\\4.947917\\-100.6484\\-63\\8.486794\\-96.74219\\-63\\14.64844\\-90.82285\\-63\\16.60156\\-89.22723\\-63\\20.50781\\-86.47371\\-63\\22.46094\\-85.43344\\-63\\24.41406\\-84.17224\\-63\\26.36719\\-83.02822\\-63\\28.32031\\-82.12674\\-63\\30.27344\\-81.37094\\-63\\32.22656\\-80.46838\\-63\\36.13281\\-79.36095\\-63\\38.08594\\-78.69756\\-63\\43.94531\\-77.45694\\-63\\47.85156\\-76.81048\\-63\\49.80469\\-76.61262\\-63\\53.71094\\-76.3295\\-63\\57.61719\\-76.17655\\-63\\61.52344\\-76.14502\\-63\\69.33594\\-76.40854\\-63\\73.24219\\-76.76884\\-63\\77.14844\\-77.06821\\-63\\79.10156\\-77.52261\\-63\\81.05469\\-77.83184\\-63\\86.91406\\-78.59226\\-63\\90.82031\\-79.53912\\-63\\94.72656\\-80.15323\\-63\\96.67969\\-80.55078\\-63\\100.5859\\-81.82913\\-63\\102.5391\\-82.19751\\-63\\104.4922\\-82.80067\\-63\\106.4453\\-83.67542\\-63\\108.3984\\-84.26389\\-63\\110.3516\\-85.07993\\-63\\114.2578\\-86.90625\\-63\\118.1641\\-88.55801\\-63\\122.0703\\-90.79618\\-63\\125.9766\\-93.48019\\-63\\127.9297\\-94.61673\\-63\\129.8828\\-96.17311\\-63\\130.4731\\-96.74219\\-63\\135.2043\\-100.6484\\-63\\137.6953\\-103.0529\\-63\\140.9437\\-106.5078\\-63\\143.5547\\-109.6056\\-63\\147.4609\\-114.9683\\-63\\148.3392\\-116.2734\\-63\\150.4643\\-120.1797\\-63\\151.724\\-122.1328\\-63\\152.6832\\-124.0859\\-63\\153.8792\\-126.0391\\-63\\154.6419\\-127.9922\\-63\\155.7617\\-129.9453\\-63\\156.2979\\-131.8984\\-63\\156.9955\\-133.8516\\-63\\157.9102\\-135.8047\\-63\\158.4432\\-137.7578\\-63\\159.3283\\-139.7109\\-63\\159.9682\\-141.6641\\-63\\160.4458\\-143.6172\\-63\\161.7084\\-147.5234\\-63\\162.0147\\-149.4766\\-63\\162.474\\-153.3828\\-63\\162.8203\\-155.3359\\-63\\163.3459\\-157.2891\\-63\\163.66\\-159.2422\\-63\\163.8703\\-161.1953\\-63\\164.4752\\-169.0078\\-63\\165.0766\\-174.8672\\-63\\165.4358\\-178.7734\\-63\\165.6042\\-184.6328\\-63\\165.6567\\-192.4453\\-63\\165.5692\\-200.2578\\-63\\165.5853\\-202.2109\\-63\\165.3752\\-208.0703\\-63\\165.1057\\-211.9766\\-63\\164.6369\\-215.8828\\-63\\163.8318\\-223.6953\\-63\\163.5063\\-225.6484\\-63\\162.9132\\-227.6016\\-63\\162.4204\\-229.5547\\-63\\162.1094\\-231.5078\\-63\\161.681\\-233.4609\\-63\\160.8508\\-235.4141\\-63\\159.4766\\-239.3203\\-63\\158.3822\\-241.2734\\-63\\157.6504\\-243.2266\\-63\\156.488\\-245.1797\\-63\\155.8152\\-247.1328\\-63\\154.6032\\-249.0859\\-63\\153.6365\\-251.0391\\-63\\151.3672\\-254.34\\-63\\150.855\\-254.9453\\-63\\149.7566\\-256.8984\\-63\\148.3745\\-258.8516\\-63\\146.7859\\-260.8047\\-63\\143.2989\\-264.7109\\-63\\141.7984\\-266.6641\\-63\\139.6484\\-268.873\\-63\\137.7887\\-270.5703\\-63\\135.7422\\-272.7482\\-63\\133.7891\\-274.4847\\-63\\131.8359\\-275.9414\\-63\\129.0283\\-278.3828\\-63\\125.9766\\-280.9455\\-63\\122.0703\\-283.5712\\-63\\121.2749\\-284.2422\\-63\\118.5092\\-286.1953\\-63\\118.1641\\-286.5255\\-63\\116.2109\\-287.6567\\-63\\114.2578\\-288.9384\\-63\\112.3047\\-289.8152\\-63\\111.9385\\-290.1016\\-63\\108.5612\\-292.0547\\-63\\104.7727\\-294.0078\\-63\\102.5391\\-294.9364\\-63\\100.5859\\-295.476\\-63\\98.63281\\-296.433\\-63\\94.72656\\-297.4609\\-63\\92.77344\\-298.2834\\-63\\90.82031\\-298.7329\\-63\\86.91406\\-299.438\\-63\\83.00781\\-300.2182\\-63\\79.10156\\-300.5615\\-63\\73.24219\\-300.654\\-63\\67.38281\\-300.4855\\-63\\65.42969\\-300.2937\\-63\\63.47656\\-299.9893\\-63\\61.52344\\-299.4703\\-63\\57.61719\\-298.6361\\-63\\55.66406\\-297.9807\\-63\\53.71094\\-297.1607\\-63\\51.75781\\-296.6179\\-63\\49.80469\\-295.5662\\-63\\47.85156\\-294.837\\-63\\43.94531\\-292.6799\\-63\\41.99219\\-291.2344\\-63\\40.03906\\-289.9031\\-63\\38.08594\\-288.7478\\-63\\34.65586\\-286.1953\\-63\\32.16019\\-284.2422\\-63\\30.27344\\-282.8736\\-63\\27.16261\\-280.3359\\-63\\24.41406\\-277.7813\\-63\\22.46094\\-276.1795\\-63\\20.50781\\-274.9114\\-63\\18.55469\\-273.8017\\-63\\16.60156\\-273.1719\\-63\\14.64844\\-272.8218\\-63\\10.74219\\-272.5918\\-63\\4.882813\\-272.6671\\-63\\-0.9765625\\-272.8828\\-63\\-2.929688\\-272.9897\\-63\\-6.835938\\-273.3799\\-63\\-8.789063\\-273.4916\\-63\\-10.74219\\-273.2452\\-63\\-12.69531\\-273.4332\\-63\\-14.64844\\-273.8122\\-63\\-16.60156\\-274.0203\\-63\\-18.55469\\-274.7752\\-63\\-20.50781\\-275.8468\\-63\\-22.46094\\-277.3326\\-63\\-26.36719\\-280.5897\\-63\\-28.32031\\-281.8223\\-63\\-30.27344\\-283.2408\\-63\\-34.17969\\-286.3762\\-63\\-36.13281\\-287.6534\\-63\\-40.03906\\-290.5745\\-63\\-41.99219\\-291.7807\\-63\\-45.89844\\-294.3661\\-63\\-47.85156\\-295.1441\\-63\\-49.80469\\-296.0906\\-63\\-51.75781\\-296.872\\-63\\-53.71094\\-297.4836\\-63\\-55.66406\\-297.7172\\-63\\-57.61719\\-298.8857\\-63\\-59.57031\\-299.3699\\-63\\-61.52344\\-299.9619\\-63\\-63.47656\\-300.3525\\-63\\-67.38281\\-300.705\\-63\\-73.24219\\-300.884\\-63\\-77.14844\\-300.8157\\-63\\-81.05469\\-300.5954\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "300" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "95" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-300.2389\\-61\\-84.86643\\-299.8672\\-61\\-86.91406\\-299.3436\\-61\\-90.82031\\-298.5453\\-61\\-94.72656\\-297.1274\\-61\\-96.67969\\-296.6593\\-61\\-98.63281\\-295.7581\\-61\\-102.5391\\-294.3472\\-61\\-103.0273\\-294.0078\\-61\\-106.4453\\-292.0928\\-61\\-109.7621\\-290.1016\\-61\\-110.3516\\-289.6342\\-61\\-112.3047\\-288.7131\\-61\\-116.0049\\-286.1953\\-61\\-118.5918\\-284.2422\\-61\\-121.3359\\-282.2891\\-61\\-123.7382\\-280.3359\\-61\\-127.9297\\-276.7623\\-61\\-129.8828\\-274.9794\\-61\\-133.7891\\-271.0131\\-61\\-134.3056\\-270.5703\\-61\\-136.1103\\-268.6172\\-61\\-139.2182\\-264.7109\\-61\\-140.9354\\-262.7578\\-61\\-142.483\\-260.8047\\-61\\-143.9244\\-258.8516\\-61\\-145.156\\-256.8984\\-61\\-145.5078\\-256.4997\\-61\\-148.1223\\-252.9922\\-61\\-149.1084\\-251.0391\\-61\\-151.5416\\-247.1328\\-61\\-152.5894\\-245.1797\\-61\\-153.8775\\-243.2266\\-61\\-154.6849\\-241.2734\\-61\\-155.8079\\-239.3203\\-61\\-156.4392\\-237.3672\\-61\\-157.4504\\-235.4141\\-61\\-158.193\\-233.4609\\-61\\-159.9792\\-229.5547\\-61\\-160.6384\\-227.6016\\-61\\-161.5408\\-225.6484\\-61\\-162.0495\\-223.6953\\-61\\-162.4084\\-221.7422\\-61\\-163.6927\\-217.8359\\-61\\-164.3975\\-213.9297\\-61\\-165.5557\\-210.0234\\-61\\-166.459\\-204.1641\\-61\\-167.2054\\-200.2578\\-61\\-167.6018\\-196.3516\\-61\\-167.7332\\-194.3984\\-61\\-167.8932\\-190.4922\\-61\\-167.9919\\-186.5859\\-61\\-167.9862\\-182.6797\\-61\\-167.8671\\-174.8672\\-61\\-167.6647\\-170.9609\\-61\\-167.3242\\-167.0547\\-61\\-167.0444\\-165.1016\\-61\\-166.358\\-161.1953\\-61\\-165.8193\\-157.2891\\-61\\-165.501\\-155.3359\\-61\\-164.3527\\-151.4297\\-61\\-163.6345\\-147.5234\\-61\\-162.8831\\-145.5703\\-61\\-162.3305\\-143.6172\\-61\\-161.9517\\-141.6641\\-61\\-161.3311\\-139.7109\\-61\\-160.4105\\-137.7578\\-61\\-159.7418\\-135.8047\\-61\\-158.6331\\-133.8516\\-61\\-157.8605\\-131.8984\\-61\\-156.7416\\-129.9453\\-61\\-156.0309\\-127.9922\\-61\\-154.9553\\-126.0391\\-61\\-154.0838\\-124.0859\\-61\\-152.8156\\-122.1328\\-61\\-151.7932\\-120.1797\\-61\\-150.4498\\-118.2266\\-61\\-149.4141\\-116.2845\\-61\\-148.2671\\-114.3203\\-61\\-145.7452\\-110.4141\\-61\\-144.3374\\-108.4609\\-61\\-142.6974\\-106.5078\\-61\\-139.6484\\-103.0975\\-61\\-135.125\\-98.69531\\-61\\-131.8359\\-95.918\\-61\\-129.8828\\-94.48917\\-61\\-127.318\\-92.83594\\-61\\-125.9766\\-92.14236\\-61\\-123.894\\-90.88281\\-61\\-120.1172\\-88.87225\\-61\\-116.2109\\-87.20869\\-61\\-112.3047\\-85.34121\\-61\\-110.3516\\-84.57719\\-61\\-108.3984\\-84.08907\\-61\\-106.4453\\-83.4103\\-61\\-104.4922\\-82.55984\\-61\\-102.5391\\-82.15929\\-61\\-100.5859\\-81.89717\\-61\\-96.67969\\-80.667\\-61\\-88.86719\\-79.64537\\-61\\-86.91406\\-79.49201\\-61\\-84.96094\\-79.04199\\-61\\-83.00781\\-78.75716\\-61\\-81.05469\\-78.62666\\-61\\-77.14844\\-78.26587\\-61\\-75.19531\\-78.13774\\-61\\-67.38281\\-78.12283\\-61\\-65.42969\\-78.31771\\-61\\-61.52344\\-78.44966\\-61\\-59.57031\\-78.65747\\-61\\-57.61719\\-78.7336\\-61\\-53.71094\\-79.11188\\-61\\-49.80469\\-79.69495\\-61\\-41.99219\\-80.42675\\-61\\-40.03906\\-80.67017\\-61\\-38.08594\\-81.07616\\-61\\-36.13281\\-81.58052\\-61\\-32.22656\\-82.41276\\-61\\-26.36719\\-84.52213\\-61\\-22.46094\\-86.3195\\-61\\-18.55469\\-88.40442\\-61\\-15.55525\\-90.88281\\-61\\-9.40625\\-96.74219\\-61\\-7.564603\\-98.69531\\-61\\-4.024833\\-102.6016\\-61\\-2.929688\\-103.6889\\-61\\-0.9765625\\-104.6506\\-61\\0.9765625\\-103.7103\\-61\\4.882813\\-99.80157\\-61\\8.789063\\-95.63985\\-61\\12.69531\\-91.90891\\-61\\14.64844\\-89.97858\\-61\\16.60156\\-88.34375\\-61\\18.55469\\-87.17019\\-61\\22.46094\\-84.50764\\-61\\24.41406\\-83.51157\\-61\\26.36719\\-82.3718\\-61\\28.32031\\-81.63754\\-61\\30.27344\\-80.667\\-61\\32.22656\\-80.06403\\-61\\36.13281\\-78.70708\\-61\\38.08594\\-78.21727\\-61\\43.94531\\-76.911\\-61\\45.89844\\-76.57583\\-61\\47.85156\\-76.37294\\-61\\53.71094\\-76.04777\\-61\\57.61719\\-75.91524\\-61\\61.52344\\-75.92764\\-61\\69.33594\\-76.18645\\-61\\77.14844\\-76.67057\\-61\\79.10156\\-76.95284\\-61\\81.05469\\-77.43031\\-61\\83.00781\\-77.74866\\-61\\86.91406\\-78.15018\\-61\\90.82031\\-79.09748\\-61\\94.72656\\-79.79041\\-61\\98.63281\\-80.75365\\-61\\100.5859\\-81.46904\\-61\\104.4922\\-82.40877\\-61\\106.4453\\-83.24982\\-61\\110.3516\\-84.62363\\-61\\112.3047\\-85.72534\\-61\\114.2578\\-86.49786\\-61\\116.2109\\-87.48577\\-61\\118.1641\\-88.20218\\-61\\120.1172\\-89.43134\\-61\\122.0703\\-90.37721\\-61\\124.0234\\-91.87151\\-61\\127.9297\\-94.28296\\-61\\135.5202\\-100.6484\\-61\\137.6953\\-102.7536\\-61\\139.6484\\-104.7781\\-61\\141.6016\\-106.9961\\-61\\143.5547\\-109.3815\\-61\\145.5078\\-112.0787\\-61\\145.792\\-112.3672\\-61\\148.3704\\-116.2734\\-61\\150.4578\\-120.1797\\-61\\151.7033\\-122.1328\\-61\\152.6402\\-124.0859\\-61\\153.8399\\-126.0391\\-61\\154.5741\\-127.9922\\-61\\155.6343\\-129.9453\\-61\\156.8071\\-133.8516\\-61\\157.7807\\-135.8047\\-61\\158.3065\\-137.7578\\-61\\159.8252\\-141.6641\\-61\\160.8329\\-145.5703\\-61\\161.5111\\-147.5234\\-61\\161.8937\\-149.4766\\-61\\162.6174\\-155.3359\\-61\\163.4513\\-159.2422\\-61\\163.75\\-161.1953\\-61\\164.7454\\-174.8672\\-61\\165.1611\\-178.7734\\-61\\165.343\\-182.6797\\-61\\165.4358\\-186.5859\\-61\\165.455\\-192.4453\\-61\\165.3959\\-198.3047\\-61\\165.2865\\-204.1641\\-61\\165.0618\\-208.0703\\-61\\164.7571\\-211.9766\\-61\\163.9075\\-221.7422\\-61\\163.6684\\-223.6953\\-61\\163.2276\\-225.6484\\-61\\162.6306\\-227.6016\\-61\\161.9724\\-231.5078\\-61\\161.4538\\-233.4609\\-61\\160.6018\\-235.4141\\-61\\159.9917\\-237.3672\\-61\\158.1877\\-241.2734\\-61\\157.362\\-243.2266\\-61\\156.3404\\-245.1797\\-61\\155.5598\\-247.1328\\-61\\153.3203\\-250.9435\\-61\\152.0569\\-252.9922\\-61\\150.6174\\-254.9453\\-61\\148.1612\\-258.8516\\-61\\146.5414\\-260.8047\\-61\\142.9976\\-264.7109\\-61\\141.3687\\-266.6641\\-61\\139.6484\\-268.4112\\-61\\137.3465\\-270.5703\\-61\\135.4731\\-272.5234\\-61\\133.7891\\-274.096\\-61\\129.8828\\-277.3389\\-61\\128.7273\\-278.3828\\-61\\125.9766\\-280.6402\\-61\\124.0234\\-281.9117\\-61\\120.8577\\-284.2422\\-61\\118.0176\\-286.1953\\-61\\114.2578\\-288.7036\\-61\\112.3047\\-289.513\\-61\\110.3516\\-290.7966\\-61\\108.3984\\-291.7136\\-61\\106.4453\\-292.891\\-61\\102.5391\\-294.7341\\-61\\100.5859\\-295.2513\\-61\\98.63281\\-296.0763\\-61\\96.67969\\-296.7433\\-61\\94.72656\\-297.1872\\-61\\90.82031\\-298.4967\\-61\\84.96094\\-299.4881\\-61\\83.00781\\-299.9048\\-61\\81.05469\\-300.197\\-61\\79.10156\\-300.3853\\-61\\75.19531\\-300.497\\-61\\69.33594\\-300.4227\\-61\\67.38281\\-300.325\\-61\\65.42969\\-300.0804\\-61\\57.61719\\-298.4697\\-61\\55.66406\\-297.6699\\-61\\51.75781\\-296.4619\\-61\\49.80469\\-295.4133\\-61\\47.85156\\-294.7557\\-61\\45.89844\\-293.6348\\-61\\43.94531\\-292.6188\\-61\\41.99219\\-291.1872\\-61\\40.03906\\-289.875\\-61\\38.08594\\-288.7705\\-61\\34.45242\\-286.1953\\-61\\30.27344\\-283.0869\\-61\\28.32031\\-281.56\\-61\\26.6183\\-280.3359\\-61\\24.33559\\-278.3828\\-61\\22.46094\\-276.9737\\-61\\20.50781\\-275.7175\\-61\\18.55469\\-275.04\\-61\\16.60156\\-274.4854\\-61\\10.74219\\-274.2526\\-61\\8.789063\\-274.2526\\-61\\4.882813\\-274.3733\\-61\\0.9765625\\-274.5952\\-61\\-4.882813\\-274.8417\\-61\\-8.789063\\-275.0403\\-61\\-12.69531\\-275.0938\\-61\\-16.60156\\-275.3705\\-61\\-18.55469\\-275.7028\\-61\\-20.50781\\-276.7576\\-61\\-22.46094\\-277.9383\\-61\\-26.36719\\-280.9892\\-61\\-28.32031\\-282.2975\\-61\\-30.27344\\-283.4749\\-61\\-34.17969\\-286.5766\\-61\\-36.13281\\-287.748\\-61\\-40.03906\\-290.4733\\-61\\-41.99219\\-291.6315\\-61\\-43.94531\\-293.0146\\-61\\-45.89844\\-294.224\\-61\\-49.80469\\-295.8586\\-61\\-51.75781\\-296.7766\\-61\\-53.71094\\-297.183\\-61\\-55.66406\\-297.0258\\-61\\-57.61719\\-298.763\\-61\\-63.47656\\-300.2077\\-61\\-67.38281\\-300.6024\\-61\\-71.28906\\-300.7656\\-61\\-73.24219\\-300.7879\\-61\\-77.14844\\-300.7161\\-61\\-81.05469\\-300.4818\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "304" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "96" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-300.0789\\-59\\-86.91406\\-299.1852\\-59\\-90.82031\\-298.3877\\-59\\-92.77344\\-297.584\\-59\\-96.67969\\-296.4987\\-59\\-98.63281\\-295.5307\\-59\\-100.5859\\-294.9252\\-59\\-102.5391\\-294.107\\-59\\-104.4922\\-293.0092\\-59\\-106.4453\\-291.7516\\-59\\-108.3984\\-290.7471\\-59\\-110.3516\\-289.4396\\-59\\-112.3047\\-288.5146\\-59\\-114.2578\\-287.2013\\-59\\-118.2838\\-284.2422\\-59\\-120.1172\\-283.0276\\-59\\-123.4551\\-280.3359\\-59\\-125.9766\\-278.107\\-59\\-127.9297\\-276.5758\\-59\\-129.8828\\-274.8125\\-59\\-135.9724\\-268.6172\\-59\\-137.4688\\-266.6641\\-59\\-139.082\\-264.7109\\-59\\-140.8266\\-262.7578\\-59\\-142.397\\-260.8047\\-59\\-143.7988\\-258.8516\\-59\\-145.0263\\-256.8984\\-59\\-146.5869\\-254.9453\\-59\\-148.038\\-252.9922\\-59\\-149.0107\\-251.0391\\-59\\-150.252\\-249.0859\\-59\\-152.4728\\-245.1797\\-59\\-153.7463\\-243.2266\\-59\\-154.5671\\-241.2734\\-59\\-155.6821\\-239.3203\\-59\\-156.3393\\-237.3672\\-59\\-158.0571\\-233.4609\\-59\\-158.8477\\-231.5078\\-59\\-159.8435\\-229.5547\\-59\\-160.4572\\-227.6016\\-59\\-161.315\\-225.6484\\-59\\-161.908\\-223.6953\\-59\\-162.7441\\-219.7891\\-59\\-163.5164\\-217.8359\\-59\\-163.9223\\-215.8828\\-59\\-164.227\\-213.9297\\-59\\-164.6575\\-211.9766\\-59\\-165.2982\\-210.0234\\-59\\-165.6988\\-208.0703\\-59\\-166.5381\\-202.2109\\-59\\-167.1805\\-198.3047\\-59\\-167.4143\\-196.3516\\-59\\-167.6914\\-192.4453\\-59\\-167.8545\\-186.5859\\-59\\-167.8532\\-180.7266\\-59\\-167.7587\\-174.8672\\-59\\-167.5408\\-170.9609\\-59\\-167.1408\\-167.0547\\-59\\-166.4949\\-163.1484\\-59\\-165.7092\\-157.2891\\-59\\-165.3209\\-155.3359\\-59\\-164.6655\\-153.3828\\-59\\-164.227\\-151.4297\\-59\\-163.4753\\-147.5234\\-59\\-162.6802\\-145.5703\\-59\\-161.8312\\-141.6641\\-59\\-160.2435\\-137.7578\\-59\\-159.5262\\-135.8047\\-59\\-158.4152\\-133.8516\\-59\\-157.6585\\-131.8984\\-59\\-156.5369\\-129.9453\\-59\\-155.8961\\-127.9922\\-59\\-154.7513\\-126.0391\\-59\\-153.9208\\-124.0859\\-59\\-152.6228\\-122.1328\\-59\\-151.5957\\-120.1797\\-59\\-150.3667\\-118.2266\\-59\\-149.4141\\-116.4211\\-59\\-148.1966\\-114.3203\\-59\\-145.5744\\-110.4141\\-59\\-143.5547\\-107.59\\-59\\-141.0251\\-104.5547\\-59\\-139.6484\\-102.9937\\-59\\-135.309\\-98.69531\\-59\\-131.8359\\-95.66866\\-59\\-129.8828\\-94.17699\\-59\\-127.7917\\-92.83594\\-59\\-125.9766\\-91.82386\\-59\\-124.0234\\-90.58841\\-59\\-122.0703\\-89.67162\\-59\\-120.1172\\-88.4131\\-59\\-118.1641\\-87.77204\\-59\\-116.2109\\-86.80379\\-59\\-114.2578\\-85.95443\\-59\\-112.3047\\-85.00072\\-59\\-108.3984\\-83.82493\\-59\\-106.4453\\-82.91823\\-59\\-104.4922\\-82.17686\\-59\\-100.5859\\-81.60893\\-59\\-98.63281\\-80.90957\\-59\\-96.67969\\-80.45988\\-59\\-90.82031\\-79.52657\\-59\\-86.91406\\-79.06932\\-59\\-83.00781\\-78.37671\\-59\\-81.05469\\-78.30587\\-59\\-77.14844\\-77.96167\\-59\\-75.19531\\-77.8556\\-59\\-67.38281\\-77.7889\\-59\\-61.52344\\-77.90647\\-59\\-59.57031\\-78.10778\\-59\\-57.61719\\-78.16657\\-59\\-55.66406\\-78.45877\\-59\\-53.71094\\-78.61047\\-59\\-47.85156\\-79.48959\\-59\\-43.94531\\-79.91952\\-59\\-38.08594\\-80.51083\\-59\\-36.13281\\-80.88068\\-59\\-34.17969\\-81.50344\\-59\\-30.27344\\-82.44347\\-59\\-24.41406\\-84.67918\\-59\\-22.46094\\-85.81846\\-59\\-20.50781\\-86.61946\\-59\\-18.55469\\-87.84997\\-59\\-16.60156\\-89.23683\\-59\\-12.69531\\-92.79491\\-59\\-10.74219\\-94.48795\\-59\\-8.393787\\-96.74219\\-59\\-6.835938\\-98.46402\\-59\\-2.929688\\-102.628\\-59\\-0.9765625\\-103.6313\\-59\\0.9765625\\-102.812\\-59\\3.288595\\-100.6484\\-59\\5.229856\\-98.69531\\-59\\8.789063\\-94.79819\\-59\\10.74219\\-92.9987\\-59\\15.04836\\-88.92969\\-59\\18.55469\\-86.42154\\-59\\22.46094\\-83.89304\\-59\\24.41406\\-82.7374\\-59\\26.36719\\-81.91315\\-59\\28.32031\\-80.95181\\-59\\32.22656\\-79.63478\\-59\\34.17969\\-78.78017\\-59\\36.13281\\-78.22389\\-59\\41.99219\\-76.84052\\-59\\45.89844\\-76.2599\\-59\\47.85156\\-76.12096\\-59\\53.71094\\-75.8112\\-59\\55.66406\\-75.60709\\-59\\61.52344\\-75.62751\\-59\\63.47656\\-75.77822\\-59\\67.38281\\-75.89443\\-59\\71.28906\\-76.09058\\-59\\79.10156\\-76.5368\\-59\\83.00781\\-77.37609\\-59\\84.96094\\-77.69614\\-59\\86.91406\\-77.88794\\-59\\88.86719\\-78.27367\\-59\\96.67969\\-79.92287\\-59\\100.5859\\-80.98331\\-59\\102.5391\\-81.72754\\-59\\104.4922\\-82.15925\\-59\\106.4453\\-82.77037\\-59\\108.3984\\-83.66608\\-59\\110.3516\\-84.32674\\-59\\112.3047\\-85.44774\\-59\\114.2578\\-86.23279\\-59\\116.2109\\-87.17188\\-59\\118.1641\\-87.99093\\-59\\122.0703\\-90.10786\\-59\\124.0234\\-91.5405\\-59\\127.9297\\-94.06984\\-59\\129.8828\\-95.52676\\-59\\135.7422\\-100.5574\\-59\\137.6953\\-102.4144\\-59\\139.7638\\-104.5547\\-59\\141.6016\\-106.7403\\-59\\143.5547\\-109.2115\\-59\\145.5078\\-111.9751\\-59\\145.8775\\-112.3672\\-59\\148.3647\\-116.2734\\-59\\150.4333\\-120.1797\\-59\\151.6377\\-122.1328\\-59\\152.5558\\-124.0859\\-59\\153.7332\\-126.0391\\-59\\154.4717\\-127.9922\\-59\\155.4195\\-129.9453\\-59\\156.1355\\-131.8984\\-59\\156.6291\\-133.8516\\-59\\157.5936\\-135.8047\\-59\\158.7722\\-139.7109\\-59\\159.6467\\-141.6641\\-59\\160.6041\\-145.5703\\-59\\161.2312\\-147.5234\\-59\\161.7323\\-149.4766\\-59\\162.0211\\-151.4297\\-59\\162.4493\\-155.3359\\-59\\162.7557\\-157.2891\\-59\\163.5649\\-161.1953\\-59\\163.9135\\-165.1016\\-59\\165.0467\\-182.6797\\-59\\165.2135\\-188.5391\\-59\\165.1338\\-196.3516\\-59\\165.0154\\-202.2109\\-59\\164.736\\-208.0703\\-59\\164.0929\\-217.8359\\-59\\163.75\\-221.7422\\-59\\163.4294\\-223.6953\\-59\\162.8583\\-225.6484\\-59\\162.4288\\-227.6016\\-59\\161.8103\\-231.5078\\-59\\160.3795\\-235.4141\\-59\\159.7872\\-237.3672\\-59\\158.7352\\-239.3203\\-59\\157.9964\\-241.2734\\-59\\156.9528\\-243.2266\\-59\\156.1707\\-245.1797\\-59\\154.1877\\-249.0859\\-59\\152.8841\\-251.0391\\-59\\151.7979\\-252.9922\\-59\\149.0734\\-256.8984\\-59\\147.8696\\-258.8516\\-59\\146.2751\\-260.8047\\-59\\141.0156\\-266.6641\\-59\\133.7891\\-273.7705\\-59\\131.8359\\-275.4664\\-59\\127.9297\\-278.7128\\-59\\125.8343\\-280.3359\\-59\\120.1172\\-284.4292\\-59\\118.1641\\-285.6749\\-59\\116.2109\\-287.0991\\-59\\114.2578\\-288.368\\-59\\112.3047\\-289.2847\\-59\\110.3516\\-290.5063\\-59\\108.3984\\-291.3711\\-59\\106.4453\\-292.6185\\-59\\104.4922\\-293.4352\\-59\\102.5391\\-294.4863\\-59\\98.63281\\-295.6378\\-59\\96.67969\\-296.511\\-59\\92.77344\\-297.4351\\-59\\90.82031\\-298.1378\\-59\\88.86719\\-298.6086\\-59\\84.96094\\-299.1814\\-59\\81.05469\\-299.8595\\-59\\79.10156\\-300.1164\\-59\\77.14844\\-300.2515\\-59\\73.24219\\-300.3342\\-59\\69.33594\\-300.2515\\-59\\67.38281\\-300.1046\\-59\\59.57031\\-298.7461\\-59\\57.61719\\-298.2606\\-59\\55.66406\\-297.4166\\-59\\53.71094\\-296.9004\\-59\\51.75781\\-296.2865\\-59\\49.80469\\-295.2824\\-59\\47.85156\\-294.6734\\-59\\45.89844\\-293.5131\\-59\\43.94531\\-292.5492\\-59\\41.99219\\-291.1577\\-59\\40.03906\\-289.8906\\-59\\38.08594\\-288.819\\-59\\36.13281\\-287.4536\\-59\\34.18936\\-286.1953\\-59\\32.22656\\-284.7956\\-59\\30.27344\\-283.3025\\-59\\28.32031\\-281.9484\\-59\\26.36719\\-280.7012\\-59\\24.41406\\-279.0937\\-59\\22.46094\\-277.5898\\-59\\18.55469\\-276.0242\\-59\\16.60156\\-275.5661\\-59\\14.64844\\-275.6913\\-59\\8.789063\\-275.7202\\-59\\4.882813\\-275.809\\-59\\2.929688\\-275.9716\\-59\\-0.9765625\\-276.165\\-59\\-2.929688\\-276.3435\\-59\\-10.74219\\-276.6826\\-59\\-16.60156\\-276.7439\\-59\\-18.55469\\-276.9714\\-59\\-20.50781\\-277.5275\\-59\\-24.41406\\-280.0005\\-59\\-28.32031\\-282.7207\\-59\\-30.27344\\-283.7748\\-59\\-34.17969\\-286.7686\\-59\\-36.13281\\-287.9043\\-59\\-40.03906\\-290.4314\\-59\\-41.99219\\-291.5293\\-59\\-43.94531\\-292.9147\\-59\\-45.89844\\-294.0634\\-59\\-47.85156\\-294.9844\\-59\\-49.80469\\-295.6643\\-59\\-51.75781\\-296.6675\\-59\\-53.71094\\-297.0925\\-59\\-55.66406\\-297.1888\\-59\\-57.61719\\-298.6426\\-59\\-61.52344\\-299.5138\\-59\\-63.47656\\-300.0288\\-59\\-67.38281\\-300.4818\\-59\\-71.28906\\-300.6606\\-59\\-73.24219\\-300.6893\\-59\\-77.14844\\-300.6024\\-59\\-81.05469\\-300.3614\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "300" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "97" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-299.8748\\-57\\-84.96094\\-299.4123\\-57\\-88.86719\\-298.6742\\-57\\-90.82031\\-298.1846\\-57\\-92.77344\\-297.3776\\-57\\-96.67969\\-296.2979\\-57\\-98.63281\\-295.3506\\-57\\-100.5859\\-294.7927\\-57\\-104.4922\\-292.8257\\-57\\-106.4453\\-291.4855\\-57\\-108.3984\\-290.5443\\-57\\-110.3516\\-289.2636\\-57\\-112.3047\\-288.2358\\-57\\-114.2578\\-287.0248\\-57\\-118.1641\\-284.0484\\-57\\-120.1172\\-282.8593\\-57\\-122.0703\\-281.3189\\-57\\-124.0234\\-279.6478\\-57\\-125.9766\\-277.867\\-57\\-127.8153\\-276.4297\\-57\\-129.8828\\-274.6039\\-57\\-133.9143\\-270.5703\\-57\\-135.7847\\-268.6172\\-57\\-137.3062\\-266.6641\\-57\\-138.958\\-264.7109\\-57\\-140.7245\\-262.7578\\-57\\-142.3208\\-260.8047\\-57\\-144.9245\\-256.8984\\-57\\-146.4844\\-254.9453\\-57\\-147.9394\\-252.9922\\-57\\-148.912\\-251.0391\\-57\\-150.1601\\-249.0859\\-57\\-151.3672\\-246.8631\\-57\\-153.5924\\-243.2266\\-57\\-154.4577\\-241.2734\\-57\\-155.5176\\-239.3203\\-57\\-156.9322\\-235.4141\\-57\\-157.927\\-233.4609\\-57\\-158.6242\\-231.5078\\-57\\-159.6767\\-229.5547\\-57\\-160.2843\\-227.6016\\-57\\-161.7651\\-223.6953\\-57\\-162.5398\\-219.7891\\-57\\-163.2413\\-217.8359\\-57\\-163.7723\\-215.8828\\-57\\-164.4202\\-211.9766\\-57\\-165.501\\-208.0703\\-57\\-165.7992\\-206.1172\\-57\\-166.5381\\-200.2578\\-57\\-167.1805\\-196.3516\\-57\\-167.5254\\-192.4453\\-57\\-167.6607\\-188.5391\\-57\\-167.7376\\-180.7266\\-57\\-167.6179\\-174.8672\\-57\\-167.3815\\-170.9609\\-57\\-167.2054\\-169.0078\\-57\\-166.3246\\-163.1484\\-57\\-165.5473\\-157.2891\\-57\\-164.4684\\-153.3828\\-57\\-163.7684\\-149.4766\\-57\\-163.2276\\-147.5234\\-57\\-162.5103\\-145.5703\\-57\\-161.6602\\-141.6641\\-57\\-160.7516\\-139.7109\\-57\\-160.0709\\-137.7578\\-57\\-159.2024\\-135.8047\\-57\\-158.219\\-133.8516\\-57\\-157.3763\\-131.8984\\-57\\-156.3735\\-129.9453\\-57\\-155.7129\\-127.9922\\-57\\-154.5522\\-126.0391\\-57\\-153.7148\\-124.0859\\-57\\-152.4478\\-122.1328\\-57\\-148.1142\\-114.3203\\-57\\-145.3617\\-110.4141\\-57\\-143.5547\\-107.6994\\-57\\-141.0369\\-104.5547\\-57\\-139.6484\\-102.9348\\-57\\-137.6953\\-100.9148\\-57\\-133.3766\\-96.74219\\-57\\-129.8828\\-93.92941\\-57\\-127.9297\\-92.61214\\-57\\-124.0234\\-90.29429\\-57\\-122.0703\\-89.33015\\-57\\-120.1172\\-88.20703\\-57\\-118.1641\\-87.55704\\-57\\-116.2109\\-86.48828\\-57\\-112.3047\\-84.73383\\-57\\-108.3984\\-83.5825\\-57\\-106.4453\\-82.46184\\-57\\-104.4922\\-81.98888\\-57\\-102.5391\\-81.77474\\-57\\-100.5068\\-81.11719\\-57\\-98.63281\\-80.63569\\-57\\-94.72656\\-79.78934\\-57\\-92.77344\\-79.54137\\-57\\-88.86719\\-78.89353\\-57\\-86.91406\\-78.71472\\-57\\-83.00781\\-78.02897\\-57\\-79.10156\\-77.90498\\-57\\-75.19531\\-77.52938\\-57\\-73.24219\\-77.46412\\-57\\-65.42969\\-77.42548\\-57\\-63.47656\\-77.50534\\-57\\-57.61719\\-77.6241\\-57\\-55.66406\\-78.0036\\-57\\-53.71094\\-78.18132\\-57\\-47.85156\\-78.94027\\-57\\-43.94531\\-79.51591\\-57\\-38.08594\\-80.17702\\-57\\-34.17969\\-80.82866\\-57\\-32.22656\\-81.45264\\-57\\-28.32031\\-82.48839\\-57\\-24.41406\\-84.10908\\-57\\-20.50781\\-86.09055\\-57\\-16.60156\\-88.44514\\-57\\-14.64844\\-90.18224\\-57\\-12.69531\\-92.06425\\-57\\-8.789063\\-95.64173\\-57\\-2.929688\\-101.75\\-57\\-0.9765625\\-102.6605\\-57\\0.9765625\\-101.9092\\-57\\2.929688\\-100.1532\\-57\\4.387556\\-98.69531\\-57\\8.071437\\-94.78906\\-57\\12.12351\\-90.88281\\-57\\12.69531\\-90.24374\\-57\\14.64844\\-88.49818\\-57\\18.55469\\-85.84183\\-57\\20.50781\\-84.40199\\-57\\24.41406\\-82.21745\\-57\\26.36719\\-81.41708\\-57\\28.32031\\-80.4894\\-57\\30.27344\\-79.83082\\-57\\32.22656\\-79.04199\\-57\\34.17969\\-78.35652\\-57\\36.13281\\-77.79425\\-57\\40.03906\\-76.77767\\-57\\43.94531\\-76.2095\\-57\\49.80469\\-75.74946\\-57\\51.75781\\-75.4375\\-57\\53.71094\\-75.36102\\-57\\55.66406\\-75.05091\\-57\\61.52344\\-75.03809\\-57\\63.47656\\-75.31384\\-57\\65.42969\\-75.40508\\-57\\67.38281\\-75.66864\\-57\\75.19531\\-76.12784\\-57\\79.10156\\-76.26452\\-57\\81.05469\\-76.52419\\-57\\84.96094\\-77.36173\\-57\\88.86719\\-77.94035\\-57\\92.77344\\-78.76714\\-57\\96.67969\\-79.64883\\-57\\100.5859\\-80.64925\\-57\\102.5391\\-81.41824\\-57\\106.4453\\-82.46696\\-57\\108.3984\\-83.36813\\-57\\110.3516\\-84.11462\\-57\\114.2578\\-86\\-57\\116.2109\\-86.80511\\-57\\118.1641\\-87.80536\\-57\\120.1172\\-88.6474\\-57\\123.5968\\-90.88281\\-57\\127.9297\\-93.85182\\-57\\129.3694\\-94.78906\\-57\\131.8078\\-96.74219\\-57\\137.6953\\-102.1492\\-57\\140.0404\\-104.5547\\-57\\141.6605\\-106.5078\\-57\\143.0058\\-108.4609\\-57\\143.5547\\-109.0876\\-57\\145.5078\\-111.9305\\-57\\145.8861\\-112.3672\\-57\\148.3471\\-116.2734\\-57\\149.2959\\-118.2266\\-57\\151.5026\\-122.1328\\-57\\152.436\\-124.0859\\-57\\153.5413\\-126.0391\\-57\\155.1132\\-129.9453\\-57\\156.0012\\-131.8984\\-57\\156.4636\\-133.8516\\-57\\157.2932\\-135.8047\\-57\\158.0089\\-137.7578\\-57\\158.554\\-139.7109\\-57\\159.405\\-141.6641\\-57\\160.0018\\-143.6172\\-57\\160.4004\\-145.5703\\-57\\160.9026\\-147.5234\\-57\\161.5248\\-149.4766\\-57\\161.8697\\-151.4297\\-57\\162.5216\\-157.2891\\-57\\162.8454\\-159.2422\\-57\\163.2813\\-161.1953\\-57\\163.7756\\-165.1016\\-57\\164.1443\\-170.9609\\-57\\164.4623\\-176.8203\\-57\\164.8494\\-186.5859\\-57\\164.8072\\-196.3516\\-57\\164.6979\\-202.2109\\-57\\164.492\\-208.0703\\-57\\164.191\\-213.9297\\-57\\163.9398\\-217.8359\\-57\\163.5264\\-221.7422\\-57\\162.5846\\-225.6484\\-57\\162.0135\\-229.5547\\-57\\161.5851\\-231.5078\\-57\\160.8028\\-233.4609\\-57\\159.5225\\-237.3672\\-57\\158.4569\\-239.3203\\-57\\157.779\\-241.2734\\-57\\156.6564\\-243.2266\\-57\\155.9773\\-245.1797\\-57\\154.8569\\-247.1328\\-57\\153.9651\\-249.0859\\-57\\152.6042\\-251.0391\\-57\\151.4486\\-252.9922\\-57\\149.4141\\-256.0969\\-57\\147.485\\-258.8516\\-57\\145.957\\-260.8047\\-57\\142.5442\\-264.7109\\-57\\140.7271\\-266.6641\\-57\\136.7834\\-270.5703\\-57\\133.7891\\-273.4617\\-57\\131.8359\\-275.18\\-57\\124.0234\\-281.3384\\-57\\122.0703\\-282.8012\\-57\\120.1172\\-283.9167\\-57\\118.1641\\-285.3123\\-57\\116.2109\\-286.8104\\-57\\112.3047\\-289.057\\-57\\108.3984\\-291.0995\\-57\\106.4453\\-292.2316\\-57\\102.5391\\-294.107\\-57\\100.5859\\-294.8646\\-57\\98.63281\\-295.3377\\-57\\96.67969\\-296.1324\\-57\\94.72656\\-296.7455\\-57\\90.82031\\-297.6162\\-57\\88.86719\\-298.281\\-57\\86.91406\\-298.653\\-57\\81.05469\\-299.4531\\-57\\77.14844\\-299.9338\\-57\\73.24219\\-300.0926\\-57\\69.33594\\-299.9893\\-57\\67.38281\\-299.7717\\-57\\59.57031\\-298.5669\\-57\\57.61719\\-297.9516\\-57\\55.66406\\-297.2165\\-57\\53.71094\\-296.7802\\-57\\51.75781\\-296.0462\\-57\\49.80469\\-295.1784\\-57\\47.85156\\-294.5722\\-57\\45.89844\\-293.412\\-57\\43.94531\\-292.4751\\-57\\43.41634\\-292.0547\\-57\\40.03906\\-289.9063\\-57\\38.08594\\-288.8824\\-57\\36.13281\\-287.569\\-57\\34.17969\\-286.4516\\-57\\30.27344\\-283.551\\-57\\28.32031\\-282.4828\\-57\\26.36719\\-281.1158\\-57\\24.41406\\-279.651\\-57\\22.46094\\-278.6157\\-57\\20.50781\\-277.7641\\-57\\18.55469\\-277.3447\\-57\\16.60156\\-277.1345\\-57\\10.74219\\-277.2157\\-57\\4.882813\\-277.3417\\-57\\-0.9765625\\-277.5809\\-57\\-2.929688\\-277.8038\\-57\\-6.835938\\-277.9976\\-57\\-12.69531\\-278.1341\\-57\\-16.60156\\-278.1206\\-57\\-18.55469\\-278.2291\\-57\\-20.50781\\-278.6861\\-57\\-22.46094\\-279.4499\\-57\\-24.41406\\-280.7222\\-57\\-26.36719\\-281.761\\-57\\-27.10978\\-282.2891\\-57\\-30.27344\\-284.2008\\-57\\-32.22656\\-285.4676\\-57\\-34.17969\\-286.9414\\-57\\-36.16688\\-288.1484\\-57\\-38.08594\\-289.2064\\-57\\-40.03906\\-290.4526\\-57\\-41.99219\\-291.4652\\-57\\-43.94531\\-292.8304\\-57\\-46.05914\\-294.0078\\-57\\-47.85156\\-294.8928\\-57\\-49.80469\\-295.4893\\-57\\-51.75781\\-296.5408\\-57\\-55.66406\\-297.5274\\-57\\-57.61719\\-298.5044\\-57\\-65.42969\\-300.1396\\-57\\-69.33594\\-300.4739\\-57\\-73.24219\\-300.583\\-57\\-77.14844\\-300.4974\\-57\\-81.05469\\-300.216\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "313" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "98" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-300.0158\\-55\\-84.96094\\-299.2216\\-55\\-88.86719\\-298.5422\\-55\\-92.77344\\-297.1983\\-55\\-94.72656\\-296.7433\\-55\\-98.63281\\-295.2007\\-55\\-100.5859\\-294.6321\\-55\\-102.5391\\-293.5195\\-55\\-104.4922\\-292.6188\\-55\\-106.4453\\-291.2636\\-55\\-108.3984\\-290.2772\\-55\\-114.2578\\-286.8283\\-55\\-117.6717\\-284.2422\\-55\\-118.1641\\-283.8105\\-55\\-120.1172\\-282.6526\\-55\\-122.0703\\-281.1497\\-55\\-125.9766\\-277.6732\\-55\\-127.5573\\-276.4297\\-55\\-129.8828\\-274.369\\-55\\-135.7422\\-268.45\\-55\\-137.1582\\-266.6641\\-55\\-138.8296\\-264.7109\\-55\\-140.6188\\-262.7578\\-55\\-142.237\\-260.8047\\-55\\-143.4498\\-258.8516\\-55\\-144.813\\-256.8984\\-55\\-146.3831\\-254.9453\\-55\\-147.8092\\-252.9922\\-55\\-148.8054\\-251.0391\\-55\\-150.0672\\-249.0859\\-55\\-150.9975\\-247.1328\\-55\\-151.3672\\-246.6536\\-55\\-153.3884\\-243.2266\\-55\\-155.2816\\-239.3203\\-55\\-156.1302\\-237.3672\\-55\\-156.735\\-235.4141\\-55\\-157.7917\\-233.4609\\-55\\-158.4446\\-231.5078\\-55\\-159.4727\\-229.5547\\-55\\-160.7963\\-225.6484\\-55\\-161.5982\\-223.6953\\-55\\-162.062\\-221.7422\\-55\\-162.3962\\-219.7891\\-55\\-162.8847\\-217.8359\\-55\\-163.5773\\-215.8828\\-55\\-164.2358\\-211.9766\\-55\\-164.6269\\-210.0234\\-55\\-165.2007\\-208.0703\\-55\\-165.6228\\-206.1172\\-55\\-166.3102\\-200.2578\\-55\\-167.1152\\-194.3984\\-55\\-167.3002\\-192.4453\\-55\\-167.4956\\-188.5391\\-55\\-167.5781\\-180.7266\\-55\\-167.4338\\-174.8672\\-55\\-167.1678\\-170.9609\\-55\\-166.3847\\-165.1016\\-55\\-165.6778\\-159.2422\\-55\\-165.3209\\-157.2891\\-55\\-164.7247\\-155.3359\\-55\\-164.3094\\-153.3828\\-55\\-163.6047\\-149.4766\\-55\\-162.8981\\-147.5234\\-55\\-162.3551\\-145.5703\\-55\\-161.9828\\-143.6172\\-55\\-161.4349\\-141.6641\\-55\\-160.5119\\-139.7109\\-55\\-159.8764\\-137.7578\\-55\\-158.8227\\-135.8047\\-55\\-158.0368\\-133.8516\\-55\\-156.9937\\-131.8984\\-55\\-155.4503\\-127.9922\\-55\\-154.3649\\-126.0391\\-55\\-153.4172\\-124.0859\\-55\\-151.125\\-120.1797\\-55\\-150.1687\\-118.2266\\-55\\-148.8845\\-116.2734\\-55\\-148.0141\\-114.3203\\-55\\-145.1991\\-110.4141\\-55\\-143.9909\\-108.4609\\-55\\-142.5849\\-106.5078\\-55\\-139.6484\\-102.9348\\-55\\-137.6953\\-100.8372\\-55\\-133.5867\\-96.74219\\-55\\-129.8828\\-93.76296\\-55\\-128.6286\\-92.83594\\-55\\-125.5047\\-90.88281\\-55\\-121.9779\\-88.92969\\-55\\-118.1641\\-87.19447\\-55\\-116.2109\\-86.15944\\-55\\-113.7022\\-85.02344\\-55\\-112.3047\\-84.51685\\-55\\-108.3984\\-83.31631\\-55\\-106.4453\\-82.17929\\-55\\-102.5391\\-81.47697\\-55\\-100.5859\\-80.79906\\-55\\-94.72656\\-79.58576\\-55\\-92.77344\\-79.28413\\-55\\-90.82031\\-78.88223\\-55\\-84.96094\\-78.13391\\-55\\-83.00781\\-77.80453\\-55\\-79.10156\\-77.62177\\-55\\-75.19531\\-77.11476\\-55\\-73.24219\\-77.03403\\-55\\-69.33594\\-77.03403\\-55\\-65.42969\\-76.98399\\-55\\-59.57031\\-77.3559\\-55\\-57.61719\\-77.43686\\-55\\-55.66406\\-77.69922\\-55\\-47.85156\\-78.48706\\-55\\-43.94531\\-78.96321\\-55\\-40.03906\\-79.60796\\-55\\-36.13281\\-80.10423\\-55\\-32.22656\\-80.78924\\-55\\-30.27344\\-81.48886\\-55\\-26.36719\\-82.61365\\-55\\-24.41406\\-83.5889\\-55\\-22.46094\\-84.39117\\-55\\-20.50781\\-85.55805\\-55\\-18.55469\\-86.55291\\-55\\-16.60156\\-87.95982\\-55\\-14.64844\\-89.59287\\-55\\-10.74219\\-93.17734\\-55\\-8.836013\\-94.78906\\-55\\-6.835938\\-96.82433\\-55\\-5.110116\\-98.69531\\-55\\-2.929688\\-100.8022\\-55\\-0.9765625\\-101.8352\\-55\\0.9765625\\-101.2773\\-55\\2.929688\\-99.56872\\-55\\5.69894\\-96.74219\\-55\\6.835938\\-95.46875\\-55\\9.4846\\-92.83594\\-55\\11.55379\\-90.88281\\-55\\12.69531\\-89.64964\\-55\\16.60156\\-86.45529\\-55\\22.46094\\-82.63864\\-55\\24.41406\\-81.81474\\-55\\26.36719\\-80.77466\\-55\\30.27344\\-79.34375\\-55\\32.22656\\-78.55602\\-55\\38.08594\\-76.83794\\-55\\40.03906\\-76.41546\\-55\\41.99219\\-76.19055\\-55\\47.85156\\-75.63605\\-55\\49.80469\\-75.13153\\-55\\51.75781\\-74.79603\\-55\\55.66406\\-74.69054\\-55\\61.52344\\-74.67468\\-55\\65.42969\\-74.88397\\-55\\69.33594\\-75.36019\\-55\\71.28906\\-75.68506\\-55\\77.14844\\-76.04978\\-55\\79.10156\\-76.10933\\-55\\81.05469\\-76.27605\\-55\\84.96094\\-76.92897\\-55\\94.72656\\-78.8601\\-55\\96.67969\\-79.32682\\-55\\98.63281\\-79.98093\\-55\\100.5859\\-80.41964\\-55\\102.5391\\-80.99905\\-55\\104.4922\\-81.7487\\-55\\106.4453\\-82.26151\\-55\\108.3984\\-82.97035\\-55\\110.3516\\-83.91629\\-55\\112.3047\\-84.70907\\-55\\114.2578\\-85.78693\\-55\\116.2109\\-86.56087\\-55\\118.1641\\-87.643\\-55\\120.1172\\-88.36468\\-55\\120.8852\\-88.92969\\-55\\123.9149\\-90.88281\\-55\\127.9297\\-93.64528\\-55\\129.806\\-94.78906\\-55\\131.8359\\-96.29829\\-55\\133.7891\\-98.32832\\-55\\134.25\\-98.69531\\-55\\137.6953\\-101.897\\-55\\140.3334\\-104.5547\\-55\\141.9144\\-106.5078\\-55\\143.0956\\-108.4609\\-55\\143.5547\\-108.9959\\-55\\145.5078\\-111.9451\\-55\\145.8586\\-112.3672\\-55\\147.0034\\-114.3203\\-55\\148.2989\\-116.2734\\-55\\149.1255\\-118.2266\\-55\\150.2991\\-120.1797\\-55\\152.2847\\-124.0859\\-55\\154.1263\\-127.9922\\-55\\154.851\\-129.9453\\-55\\155.8211\\-131.8984\\-55\\156.3029\\-133.8516\\-55\\156.92\\-135.8047\\-55\\157.8068\\-137.7578\\-55\\158.3686\\-139.7109\\-55\\159.7872\\-143.6172\\-55\\160.6325\\-147.5234\\-55\\161.2297\\-149.4766\\-55\\161.69\\-151.4297\\-55\\161.9673\\-153.3828\\-55\\162.5846\\-159.2422\\-55\\163.2957\\-163.1484\\-55\\163.5866\\-165.1016\\-55\\164.0024\\-170.9609\\-55\\164.2883\\-176.8203\\-55\\164.603\\-186.5859\\-55\\164.5784\\-196.3516\\-55\\164.521\\-200.2578\\-55\\164.2932\\-208.0703\\-55\\164.0425\\-213.9297\\-55\\163.7684\\-217.8359\\-55\\163.5362\\-219.7891\\-55\\163.1851\\-221.7422\\-55\\162.7215\\-223.6953\\-55\\162.3919\\-225.6484\\-55\\161.8469\\-229.5547\\-55\\161.287\\-231.5078\\-55\\160.535\\-233.4609\\-55\\159.962\\-235.4141\\-55\\158.2391\\-239.3203\\-55\\157.4971\\-241.2734\\-55\\156.4392\\-243.2266\\-55\\155.7685\\-245.1797\\-55\\154.6036\\-247.1328\\-55\\153.6933\\-249.0859\\-55\\151.3672\\-252.5553\\-55\\151.0036\\-252.9922\\-55\\149.9389\\-254.9453\\-55\\147.4609\\-258.3455\\-55\\145.5307\\-260.8047\\-55\\142.2502\\-264.7109\\-55\\139.6484\\-267.4648\\-55\\133.7891\\-273.133\\-55\\131.8359\\-274.7971\\-55\\129.8828\\-276.2724\\-55\\127.3468\\-278.3828\\-55\\124.0234\\-281.0288\\-55\\122.0703\\-282.4251\\-55\\120.1172\\-283.5473\\-55\\116.2109\\-286.4212\\-55\\114.2578\\-287.5333\\-55\\112.3047\\-288.793\\-55\\110.3516\\-289.6133\\-55\\108.3984\\-290.8083\\-55\\106.4453\\-291.6942\\-55\\104.4922\\-292.837\\-55\\102.5391\\-293.6292\\-55\\100.5859\\-294.615\\-55\\96.67969\\-295.6378\\-55\\94.72656\\-296.4713\\-55\\90.82031\\-297.2572\\-55\\86.91406\\-298.3326\\-55\\84.96094\\-298.6593\\-55\\81.05469\\-299.1401\\-55\\77.14844\\-299.5115\\-55\\73.24219\\-299.7175\\-55\\69.33594\\-299.6265\\-55\\65.42969\\-299.2402\\-55\\61.52344\\-298.7063\\-55\\59.57031\\-298.3579\\-55\\57.61719\\-297.6089\\-55\\55.66406\\-297.0702\\-55\\53.71094\\-296.6519\\-55\\51.75781\\-295.7855\\-55\\47.85156\\-294.4396\\-55\\45.89844\\-293.3195\\-55\\43.94531\\-292.4176\\-55\\43.48624\\-292.0547\\-55\\40.03906\\-289.9362\\-55\\38.08594\\-288.9685\\-55\\36.13281\\-287.7121\\-55\\34.17969\\-286.6963\\-55\\30.27344\\-283.9047\\-55\\28.32031\\-282.8855\\-55\\26.36719\\-281.5341\\-55\\24.20775\\-280.3359\\-55\\22.46094\\-279.4865\\-55\\20.50781\\-279.0503\\-55\\18.55469\\-278.8211\\-55\\14.64844\\-278.618\\-55\\10.74219\\-278.6785\\-55\\8.789063\\-278.8281\\-55\\-0.9765625\\-279.2016\\-55\\-2.929688\\-279.3015\\-55\\-6.835938\\-279.3947\\-55\\-12.69531\\-279.4718\\-55\\-16.60156\\-279.4296\\-55\\-18.55469\\-279.4858\\-55\\-20.50781\\-279.7219\\-55\\-22.46094\\-280.4254\\-55\\-24.41406\\-281.2663\\-55\\-28.32031\\-283.3328\\-55\\-30.27344\\-284.6496\\-55\\-32.22656\\-285.7514\\-55\\-32.80892\\-286.1953\\-55\\-36.13281\\-288.3513\\-55\\-38.08594\\-289.2636\\-55\\-40.03906\\-290.4834\\-55\\-41.99219\\-291.437\\-55\\-43.94531\\-292.7716\\-55\\-47.85156\\-294.8001\\-55\\-49.80469\\-295.3634\\-55\\-51.75781\\-296.3898\\-55\\-55.66406\\-297.5274\\-55\\-57.61719\\-298.3421\\-55\\-59.57031\\-298.7905\\-55\\-63.47656\\-299.501\\-55\\-65.42969\\-299.9194\\-55\\-67.38281\\-300.1841\\-55\\-69.33594\\-300.3342\\-55\\-73.24219\\-300.4589\\-55\\-77.14844\\-300.3703\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "308" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "99" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-300.0288\\-53\\-86.91406\\-298.7434\\-53\\-88.86719\\-298.3579\\-53\\-90.82031\\-297.5818\\-53\\-94.72656\\-296.5983\\-53\\-96.67969\\-295.7168\\-53\\-100.5859\\-294.4158\\-53\\-102.5391\\-293.2898\\-53\\-104.4922\\-292.3599\\-53\\-104.871\\-292.0547\\-53\\-108.3984\\-289.9093\\-53\\-110.3516\\-288.9435\\-53\\-112.3047\\-287.6869\\-53\\-114.2578\\-286.6102\\-53\\-118.1641\\-283.6107\\-53\\-120.1172\\-282.4072\\-53\\-122.0703\\-280.9892\\-53\\-125.9766\\-277.479\\-53\\-127.3281\\-276.4297\\-53\\-129.8828\\-274.1588\\-53\\-131.4557\\-272.5234\\-53\\-135.7422\\-268.2888\\-53\\-137.0157\\-266.6641\\-53\\-138.6953\\-264.7109\\-53\\-140.5242\\-262.7578\\-53\\-142.1411\\-260.8047\\-53\\-143.3182\\-258.8516\\-53\\-144.7083\\-256.8984\\-53\\-146.295\\-254.9453\\-53\\-147.6405\\-252.9922\\-53\\-148.7044\\-251.0391\\-53\\-149.9675\\-249.0859\\-53\\-150.8494\\-247.1328\\-53\\-152.1322\\-245.1797\\-53\\-154.2222\\-241.2734\\-53\\-155.0458\\-239.3203\\-53\\-156.0136\\-237.3672\\-53\\-156.5859\\-235.4141\\-53\\-157.616\\-233.4609\\-53\\-158.2952\\-231.5078\\-53\\-159.9824\\-227.6016\\-53\\-160.5539\\-225.6484\\-53\\-161.3946\\-223.6953\\-53\\-161.9367\\-221.7422\\-53\\-162.6143\\-217.8359\\-53\\-163.3085\\-215.8828\\-53\\-163.7827\\-213.9297\\-53\\-164.4012\\-210.0234\\-53\\-164.8213\\-208.0703\\-53\\-165.3856\\-206.1172\\-53\\-165.6883\\-204.1641\\-53\\-166.3208\\-198.3047\\-53\\-166.7913\\-194.3984\\-53\\-167.1678\\-190.4922\\-53\\-167.3456\\-186.5859\\-53\\-167.4017\\-180.7266\\-53\\-167.3023\\-176.8203\\-53\\-167.073\\-172.9141\\-53\\-165.9756\\-163.1484\\-53\\-165.4921\\-159.2422\\-53\\-164.4972\\-155.3359\\-53\\-163.8425\\-151.4297\\-53\\-163.3954\\-149.4766\\-53\\-162.6451\\-147.5234\\-53\\-161.8391\\-143.6172\\-53\\-160.2902\\-139.7109\\-53\\-159.6559\\-137.7578\\-53\\-158.5383\\-135.8047\\-53\\-157.8306\\-133.8516\\-53\\-156.7053\\-131.8984\\-53\\-156.078\\-129.9453\\-53\\-154.1756\\-126.0391\\-53\\-153.0546\\-124.0859\\-53\\-152.0769\\-122.1328\\-53\\-150.8896\\-120.1797\\-53\\-150\\-118.2266\\-53\\-148.6962\\-116.2734\\-53\\-147.8354\\-114.3203\\-53\\-147.4609\\-113.8675\\-53\\-145.0296\\-110.4141\\-53\\-143.8664\\-108.4609\\-53\\-142.525\\-106.5078\\-53\\-139.6484\\-102.9844\\-53\\-135.6658\\-98.69531\\-53\\-133.7069\\-96.74219\\-53\\-128.843\\-92.83594\\-53\\-125.8517\\-90.88281\\-53\\-122.0703\\-88.70313\\-53\\-120.1172\\-87.93481\\-53\\-116.2109\\-85.86555\\-53\\-114.2578\\-84.9287\\-53\\-112.3047\\-84.29851\\-53\\-110.3516\\-83.76604\\-53\\-106.4453\\-82.03912\\-53\\-104.4922\\-81.69363\\-53\\-100.5859\\-80.65642\\-53\\-92.77344\\-78.98968\\-53\\-88.86719\\-78.34634\\-53\\-84.96094\\-77.96983\\-53\\-81.05469\\-77.31169\\-53\\-79.10156\\-77.25031\\-53\\-75.19531\\-76.76075\\-53\\-67.38281\\-76.62628\\-53\\-63.47656\\-76.73603\\-53\\-59.57031\\-77.05903\\-53\\-57.61719\\-77.15875\\-53\\-53.71094\\-77.62663\\-53\\-47.85156\\-78.12279\\-53\\-41.99219\\-78.78703\\-53\\-38.08594\\-79.46286\\-53\\-32.22656\\-80.40981\\-53\\-30.27344\\-80.86929\\-53\\-28.32031\\-81.68007\\-53\\-26.36719\\-82.19456\\-53\\-24.19562\\-83.07031\\-53\\-20.50781\\-84.84124\\-53\\-18.55469\\-86.06467\\-53\\-14.64844\\-88.83708\\-53\\-7.990761\\-94.78906\\-53\\-4.173224\\-98.69531\\-53\\-2.929688\\-99.91257\\-53\\-0.9765625\\-101.2242\\-53\\0.9765625\\-100.574\\-53\\2.929688\\-98.8261\\-53\\8.745466\\-92.83594\\-53\\12.69531\\-89.00611\\-53\\15.19775\\-86.97656\\-53\\18.55469\\-84.50125\\-53\\22.46094\\-82.17838\\-53\\24.41406\\-81.35556\\-53\\26.36719\\-80.35484\\-53\\28.32031\\-79.64883\\-53\\30.27344\\-78.79543\\-53\\32.22656\\-78.12608\\-53\\36.13281\\-76.93694\\-53\\38.08594\\-76.46416\\-53\\40.03906\\-76.13925\\-53\\43.94531\\-75.76935\\-53\\45.89844\\-75.36102\\-53\\49.80469\\-74.67046\\-53\\51.75781\\-74.54211\\-53\\55.66406\\-74.49609\\-53\\61.52344\\-74.50114\\-53\\65.42969\\-74.63636\\-53\\69.33594\\-74.89641\\-53\\71.43555\\-75.25781\\-53\\75.19531\\-75.77822\\-53\\81.05469\\-76.14082\\-53\\83.00781\\-76.33438\\-53\\86.91406\\-76.95284\\-53\\88.86719\\-77.45335\\-53\\94.72656\\-78.58997\\-53\\96.67969\\-79.04199\\-53\\98.63281\\-79.76552\\-53\\102.5391\\-80.68392\\-53\\104.4922\\-81.48611\\-53\\108.3984\\-82.6558\\-53\\110.3516\\-83.72335\\-53\\112.3047\\-84.41919\\-53\\114.2578\\-85.56954\\-53\\116.2109\\-86.38452\\-53\\118.1641\\-87.44728\\-53\\120.1172\\-88.19401\\-53\\122.0703\\-89.53922\\-53\\124.0234\\-90.70313\\-53\\125.9766\\-92.17938\\-53\\127.9297\\-93.51202\\-53\\129.8828\\-94.63943\\-53\\131.8359\\-96.04646\\-53\\133.7891\\-98.12615\\-53\\134.5196\\-98.69531\\-53\\137.6953\\-101.6887\\-53\\140.5472\\-104.5547\\-53\\142.1875\\-106.5078\\-53\\143.1478\\-108.4609\\-53\\144.3971\\-110.4141\\-53\\145.7591\\-112.3672\\-53\\146.9001\\-114.3203\\-53\\148.2117\\-116.2734\\-53\\148.9966\\-118.2266\\-53\\150.1743\\-120.1797\\-53\\150.9724\\-122.1328\\-53\\152.0956\\-124.0859\\-53\\152.9257\\-126.0391\\-53\\153.9533\\-127.9922\\-53\\154.6245\\-129.9453\\-53\\155.5722\\-131.8984\\-53\\156.6368\\-135.8047\\-53\\157.5671\\-137.7578\\-53\\158.7227\\-141.6641\\-53\\159.518\\-143.6172\\-53\\160.0056\\-145.5703\\-53\\160.3854\\-147.5234\\-53\\161.4423\\-151.4297\\-53\\162.0502\\-155.3359\\-53\\162.5977\\-161.1953\\-53\\163.2957\\-165.1016\\-53\\163.5554\\-167.0547\\-53\\163.8641\\-170.9609\\-53\\164.1226\\-176.8203\\-53\\164.3935\\-186.5859\\-53\\164.3936\\-196.3516\\-53\\164.3392\\-200.2578\\-53\\164.1388\\-208.0703\\-53\\163.8972\\-213.9297\\-53\\163.5554\\-217.8359\\-53\\163.2413\\-219.7891\\-53\\162.8079\\-221.7422\\-53\\162.4962\\-223.6953\\-53\\162.0147\\-227.6016\\-53\\161.6308\\-229.5547\\-53\\160.9291\\-231.5078\\-53\\159.7191\\-235.4141\\-53\\158.7132\\-237.3672\\-53\\158.0455\\-239.3203\\-53\\157.0938\\-241.2734\\-53\\155.4778\\-245.1797\\-53\\153.3436\\-249.0859\\-53\\152.1312\\-251.0391\\-53\\150.6848\\-252.9922\\-53\\149.6353\\-254.9453\\-53\\148.2693\\-256.8984\\-53\\146.7364\\-258.8516\\-53\\145.0376\\-260.8047\\-53\\141.8438\\-264.7109\\-53\\140.0378\\-266.6641\\-53\\137.6953\\-268.9632\\-53\\133.7891\\-272.7056\\-53\\131.6793\\-274.4766\\-53\\127.9297\\-277.5155\\-53\\126.9233\\-278.3828\\-53\\124.3887\\-280.3359\\-53\\124.0234\\-280.6957\\-53\\120.1172\\-283.2656\\-53\\118.1641\\-284.677\\-53\\116.2109\\-285.8745\\-53\\114.2578\\-287.231\\-53\\112.3047\\-288.4348\\-53\\110.3516\\-289.294\\-53\\108.3984\\-290.4733\\-53\\106.4453\\-291.314\\-53\\104.4922\\-292.4823\\-53\\102.5391\\-293.2668\\-53\\100.5859\\-294.243\\-53\\98.63281\\-294.8765\\-53\\96.67969\\-295.3078\\-53\\92.77344\\-296.6411\\-53\\88.86719\\-297.34\\-53\\84.96094\\-298.3514\\-53\\83.00781\\-298.653\\-53\\79.10156\\-299.0353\\-53\\75.19531\\-299.31\\-53\\71.28906\\-299.3641\\-53\\67.38281\\-299.2033\\-53\\63.47656\\-298.8023\\-53\\61.52344\\-298.535\\-53\\59.57031\\-298.0627\\-53\\57.61719\\-297.3776\\-53\\53.71094\\-296.4987\\-53\\51.75781\\-295.5773\\-53\\49.80469\\-294.9964\\-53\\47.85156\\-294.3173\\-53\\45.89844\\-293.2345\\-53\\43.94531\\-292.3578\\-53\\41.99219\\-291.1091\\-53\\40.03906\\-290.0128\\-53\\38.08594\\-289.0636\\-53\\36.13281\\-287.9191\\-53\\34.17969\\-286.9158\\-53\\32.22656\\-285.5675\\-53\\30.27344\\-284.4375\\-53\\28.32031\\-283.1993\\-53\\26.36719\\-282.1019\\-53\\24.41406\\-281.1871\\-53\\22.46094\\-280.6072\\-53\\20.50781\\-280.1903\\-53\\16.60156\\-279.8255\\-53\\10.74219\\-279.7789\\-53\\6.835938\\-280.2903\\-53\\-0.9765625\\-280.7408\\-53\\-4.882813\\-280.8511\\-53\\-14.64844\\-280.9307\\-53\\-18.55469\\-280.9262\\-53\\-20.50781\\-281.0174\\-53\\-22.46094\\-281.3329\\-53\\-24.41406\\-281.8759\\-53\\-26.36719\\-282.9069\\-53\\-28.32031\\-283.73\\-53\\-29.0314\\-284.2422\\-53\\-34.17969\\-287.2744\\-53\\-36.13281\\-288.5235\\-53\\-38.08594\\-289.3343\\-53\\-40.03906\\-290.5322\\-53\\-41.99219\\-291.4488\\-53\\-43.94531\\-292.7229\\-53\\-45.89844\\-293.6374\\-53\\-47.85156\\-294.7107\\-53\\-49.80469\\-295.2697\\-53\\-51.75781\\-296.2141\\-53\\-53.71094\\-296.8636\\-53\\-55.66406\\-297.3449\\-53\\-57.61719\\-298.1378\\-53\\-59.57031\\-298.6554\\-53\\-63.47656\\-299.2951\\-53\\-67.38281\\-299.9893\\-53\\-69.33594\\-300.1732\\-53\\-73.24219\\-300.31\\-53\\-77.14844\\-300.2055\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "301" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "100" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-299.9893\\-51\\-81.05469\\-299.493\\-51\\-86.91406\\-298.5874\\-51\\-88.86719\\-298.0884\\-51\\-90.82031\\-297.3535\\-51\\-94.72656\\-296.4102\\-51\\-96.67969\\-295.493\\-51\\-98.63281\\-294.937\\-51\\-100.5859\\-294.1336\\-51\\-106.4453\\-290.8987\\-51\\-108.3984\\-289.6408\\-51\\-110.3516\\-288.7753\\-51\\-112.3047\\-287.458\\-51\\-114.2578\\-286.345\\-51\\-118.1641\\-283.442\\-51\\-122.0703\\-280.8101\\-51\\-125.9766\\-277.301\\-51\\-127.0873\\-276.4297\\-51\\-129.8828\\-273.9485\\-51\\-131.257\\-272.5234\\-51\\-135.7422\\-268.1087\\-51\\-136.8556\\-266.6641\\-51\\-139.6484\\-263.5046\\-51\\-140.4102\\-262.7578\\-51\\-142.0332\\-260.8047\\-51\\-143.1858\\-258.8516\\-51\\-144.604\\-256.8984\\-51\\-146.1848\\-254.9453\\-51\\-147.4838\\-252.9922\\-51\\-149.8473\\-249.0859\\-51\\-150.7182\\-247.1328\\-51\\-152.0201\\-245.1797\\-51\\-152.9696\\-243.2266\\-51\\-154.0889\\-241.2734\\-51\\-154.8733\\-239.3203\\-51\\-155.8878\\-237.3672\\-51\\-156.4465\\-235.4141\\-51\\-157.3882\\-233.4609\\-51\\-158.8631\\-229.5547\\-51\\-159.8147\\-227.6016\\-51\\-160.3461\\-225.6484\\-51\\-161.7571\\-221.7422\\-51\\-162.4246\\-217.8359\\-51\\-162.941\\-215.8828\\-51\\-163.5866\\-213.9297\\-51\\-163.9326\\-211.9766\\-51\\-164.5178\\-208.0703\\-51\\-165.4644\\-204.1641\\-51\\-165.7395\\-202.2109\\-51\\-166.6602\\-192.4453\\-51\\-167.0869\\-186.5859\\-51\\-167.155\\-182.6797\\-51\\-167.1152\\-178.7734\\-51\\-166.7636\\-172.9141\\-51\\-166.0256\\-165.1016\\-51\\-165.5915\\-161.1953\\-51\\-165.2135\\-159.2422\\-51\\-164.7025\\-157.2891\\-51\\-164.3066\\-155.3359\\-51\\-163.6684\\-151.4297\\-51\\-162.4286\\-147.5234\\-51\\-161.6532\\-143.6172\\-51\\-160.7759\\-141.6641\\-51\\-159.3294\\-137.7578\\-51\\-158.3029\\-135.8047\\-51\\-157.5648\\-133.8516\\-51\\-156.491\\-131.8984\\-51\\-155.8789\\-129.9453\\-51\\-154.7818\\-127.9922\\-51\\-153.9526\\-126.0391\\-51\\-152.7835\\-124.0859\\-51\\-151.8405\\-122.1328\\-51\\-150.6397\\-120.1797\\-51\\-149.7566\\-118.2266\\-51\\-148.5635\\-116.2734\\-51\\-147.5667\\-114.3203\\-51\\-144.8759\\-110.4141\\-51\\-142.4264\\-106.5078\\-51\\-139.6484\\-103.086\\-51\\-137.6953\\-100.8571\\-51\\-135.6994\\-98.69531\\-51\\-133.7891\\-96.73456\\-51\\-127.9297\\-92.05605\\-51\\-125.9766\\-90.79954\\-51\\-124.0234\\-89.7381\\-51\\-122.0703\\-88.52886\\-51\\-120.1172\\-87.83181\\-51\\-118.1641\\-86.71088\\-51\\-114.2578\\-84.69791\\-51\\-112.3047\\-84.0059\\-51\\-110.3516\\-83.57543\\-51\\-108.3984\\-82.61303\\-51\\-106.4453\\-81.98746\\-51\\-104.4922\\-81.54716\\-51\\-102.5391\\-80.95045\\-51\\-98.63281\\-80.08637\\-51\\-96.67969\\-79.55015\\-51\\-94.72656\\-79.22199\\-51\\-90.82031\\-78.42303\\-51\\-88.86719\\-78.10815\\-51\\-84.96094\\-77.79077\\-51\\-81.05469\\-76.99774\\-51\\-77.14844\\-76.64806\\-51\\-73.24219\\-76.44922\\-51\\-69.33594\\-76.41827\\-51\\-63.47656\\-76.48639\\-51\\-55.66406\\-76.93294\\-51\\-51.75781\\-77.48298\\-51\\-43.94531\\-78.19892\\-51\\-40.03906\\-78.61743\\-51\\-38.08594\\-78.92834\\-51\\-36.13281\\-79.3548\\-51\\-30.27344\\-80.4894\\-51\\-26.36719\\-81.83641\\-51\\-24.41406\\-82.41263\\-51\\-22.46094\\-83.44001\\-51\\-20.50781\\-84.32771\\-51\\-16.60156\\-86.80109\\-51\\-14.64844\\-88.23415\\-51\\-12.69531\\-89.90625\\-51\\-10.74219\\-91.79637\\-51\\-9.432164\\-92.83594\\-51\\-7.340771\\-94.78906\\-51\\-2.929688\\-99.20722\\-51\\-0.9765625\\-100.3555\\-51\\0.9765625\\-99.98135\\-51\\2.929688\\-98.1669\\-51\\6.283309\\-94.78906\\-51\\8.130787\\-92.83594\\-51\\10.74219\\-90.25699\\-51\\12.69531\\-88.42638\\-51\\14.64844\\-86.81759\\-51\\17.04102\\-85.02344\\-51\\20.50781\\-82.7226\\-51\\22.46094\\-81.87386\\-51\\24.41406\\-80.75098\\-51\\26.36719\\-80.01297\\-51\\28.32031\\-79.1265\\-51\\30.27344\\-78.35026\\-51\\34.17969\\-77.05196\\-51\\36.13281\\-76.53634\\-51\\38.08594\\-76.18462\\-51\\41.99219\\-75.75947\\-51\\45.89844\\-74.82631\\-51\\47.85156\\-74.61823\\-51\\51.75781\\-74.39321\\-51\\61.52344\\-74.36723\\-51\\67.38281\\-74.57355\\-51\\71.28906\\-74.84465\\-51\\73.24219\\-75.07064\\-51\\77.14844\\-75.73949\\-51\\83.00781\\-76.1597\\-51\\86.91406\\-76.67193\\-51\\90.82031\\-77.60024\\-51\\94.72656\\-78.30733\\-51\\96.67969\\-78.78703\\-51\\98.63281\\-79.50155\\-51\\102.5391\\-80.48085\\-51\\104.4358\\-81.11719\\-51\\106.4453\\-81.89471\\-51\\108.3984\\-82.4388\\-51\\110.3516\\-83.46767\\-51\\112.3047\\-84.1533\\-51\\114.2578\\-85.30556\\-51\\117.8869\\-86.97656\\-51\\120.1172\\-88.06654\\-51\\122.0703\\-89.36295\\-51\\124.0234\\-90.50776\\-51\\124.4247\\-90.88281\\-51\\127.2593\\-92.83594\\-51\\127.9297\\-93.40095\\-51\\129.8828\\-94.55069\\-51\\131.8359\\-95.92953\\-51\\133.7891\\-97.89222\\-51\\134.7281\\-98.69531\\-51\\137.6953\\-101.5663\\-51\\140.564\\-104.5547\\-51\\142.1296\\-106.5078\\-51\\143.1101\\-108.4609\\-51\\146.7786\\-114.3203\\-51\\148.0807\\-116.2734\\-51\\148.8551\\-118.2266\\-51\\150.0116\\-120.1797\\-51\\150.7349\\-122.1328\\-51\\151.8876\\-124.0859\\-51\\152.6712\\-126.0391\\-51\\153.7579\\-127.9922\\-51\\154.4204\\-129.9453\\-51\\155.9854\\-133.8516\\-51\\156.4324\\-135.8047\\-51\\157.9333\\-139.7109\\-51\\158.4256\\-141.6641\\-51\\159.7734\\-145.5703\\-51\\160.5636\\-149.4766\\-51\\161.592\\-153.3828\\-51\\161.8891\\-155.3359\\-51\\162.6075\\-163.1484\\-51\\163.2548\\-167.0547\\-51\\163.5063\\-169.0078\\-51\\163.8035\\-172.9141\\-51\\164.0376\\-178.7734\\-51\\164.2218\\-186.5859\\-51\\164.2131\\-196.3516\\-51\\164.1435\\-202.2109\\-51\\163.9193\\-210.0234\\-51\\163.7351\\-213.9297\\-51\\163.2681\\-217.8359\\-51\\162.5434\\-221.7422\\-51\\161.8502\\-227.6016\\-51\\161.3554\\-229.5547\\-51\\160.6172\\-231.5078\\-51\\160.0847\\-233.4609\\-51\\159.4154\\-235.4141\\-51\\158.4323\\-237.3672\\-51\\157.8203\\-239.3203\\-51\\156.7619\\-241.2734\\-51\\156.0903\\-243.2266\\-51\\155.0842\\-245.1797\\-51\\154.1929\\-247.1328\\-51\\152.9421\\-249.0859\\-51\\151.8619\\-251.0391\\-51\\150.4257\\-252.9922\\-51\\149.4141\\-254.7339\\-51\\147.9942\\-256.8984\\-51\\144.6717\\-260.8047\\-51\\143.5547\\-262.2171\\-51\\139.6484\\-266.5591\\-51\\137.6953\\-268.4789\\-51\\133.394\\-272.5234\\-51\\131.8359\\-273.9408\\-51\\128.8578\\-276.4297\\-51\\125.9766\\-278.7589\\-51\\123.8591\\-280.3359\\-51\\120.1172\\-283.0077\\-51\\118.1641\\-284.1689\\-51\\116.2109\\-285.4598\\-51\\114.2578\\-286.8963\\-51\\112.3047\\-287.9043\\-51\\110.3516\\-289.0255\\-51\\108.3984\\-289.9247\\-51\\106.4453\\-290.9898\\-51\\104.4922\\-291.9141\\-51\\102.5391\\-292.939\\-51\\100.5859\\-293.7047\\-51\\98.63281\\-294.5849\\-51\\94.72656\\-295.4994\\-51\\92.77344\\-296.2748\\-51\\90.82031\\-296.7254\\-51\\86.91406\\-297.3569\\-51\\83.00781\\-298.323\\-51\\81.05469\\-298.5982\\-51\\75.19531\\-299.0178\\-51\\71.28906\\-299.0995\\-51\\67.38281\\-298.9817\\-51\\63.47656\\-298.6145\\-51\\61.52344\\-298.301\\-51\\59.57031\\-297.6822\\-51\\57.61719\\-297.1844\\-51\\55.66406\\-296.8108\\-51\\53.71094\\-296.3229\\-51\\51.75781\\-295.4301\\-51\\49.80469\\-294.9197\\-51\\47.85156\\-294.1887\\-51\\45.89844\\-293.1684\\-51\\43.94531\\-292.2971\\-51\\41.99219\\-291.1244\\-51\\36.13281\\-288.2199\\-51\\30.27344\\-284.8374\\-51\\28.32031\\-283.5547\\-51\\24.41406\\-281.903\\-51\\22.46094\\-281.5119\\-51\\20.50781\\-281.2709\\-51\\18.55469\\-281.2064\\-51\\12.69531\\-281.2032\\-51\\10.74219\\-281.0991\\-51\\8.789063\\-281.4326\\-51\\6.835938\\-281.6197\\-51\\-0.9765625\\-281.9579\\-51\\-8.789063\\-282.0406\\-51\\-18.55469\\-282.0136\\-51\\-20.50781\\-282.0637\\-51\\-22.46094\\-282.348\\-51\\-24.41406\\-282.7983\\-51\\-26.36719\\-283.3748\\-51\\-30.27344\\-285.3279\\-51\\-32.22656\\-286.5792\\-51\\-34.17969\\-287.4655\\-51\\-36.13281\\-288.6866\\-51\\-38.08594\\-289.4013\\-51\\-40.03906\\-290.5986\\-51\\-41.99219\\-291.4806\\-51\\-43.94531\\-292.7076\\-51\\-45.89844\\-293.5357\\-51\\-47.85156\\-294.6229\\-51\\-49.80469\\-295.1884\\-51\\-53.71094\\-296.7476\\-51\\-55.66406\\-297.1913\\-51\\-59.57031\\-298.4823\\-51\\-61.52344\\-298.8317\\-51\\-69.33594\\-299.9757\\-51\\-73.24219\\-300.1377\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "315" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "101" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-73.24219\\-299.8899\\-49\\-77.14844\\-299.7044\\-49\\-81.05469\\-299.2904\\-49\\-84.96094\\-298.749\\-49\\-86.91406\\-298.4194\\-49\\-88.86719\\-297.7359\\-49\\-90.82031\\-297.1761\\-49\\-92.77344\\-296.7802\\-49\\-94.72656\\-296.1592\\-49\\-96.67969\\-295.2994\\-49\\-98.63281\\-294.7807\\-49\\-100.5859\\-293.79\\-49\\-102.5391\\-292.9078\\-49\\-104.4922\\-291.6371\\-49\\-106.4453\\-290.7012\\-49\\-108.3984\\-289.4104\\-49\\-110.3516\\-288.5518\\-49\\-110.8817\\-288.1484\\-49\\-113.9695\\-286.1953\\-49\\-116.2109\\-284.7112\\-49\\-120.1172\\-281.8211\\-49\\-122.0703\\-280.5838\\-49\\-124.5226\\-278.3828\\-49\\-126.8569\\-276.4297\\-49\\-129.8828\\-273.6993\\-49\\-135.1031\\-268.6172\\-49\\-136.7309\\-266.6641\\-49\\-139.6484\\-263.3847\\-49\\-140.2927\\-262.7578\\-49\\-141.9049\\-260.8047\\-49\\-143.0129\\-258.8516\\-49\\-146.0544\\-254.9453\\-49\\-147.4609\\-252.8193\\-49\\-149.7274\\-249.0859\\-49\\-150.6109\\-247.1328\\-49\\-151.886\\-245.1797\\-49\\-152.794\\-243.2266\\-49\\-153.9615\\-241.2734\\-49\\-154.7181\\-239.3203\\-49\\-155.7549\\-237.3672\\-49\\-156.3202\\-235.4141\\-49\\-157.0958\\-233.4609\\-49\\-158.0027\\-231.5078\\-49\\-158.6208\\-229.5547\\-49\\-159.6327\\-227.6016\\-49\\-160.7723\\-223.6953\\-49\\-161.5381\\-221.7422\\-49\\-161.9976\\-219.7891\\-49\\-162.2771\\-217.8359\\-49\\-162.6587\\-215.8828\\-49\\-163.3085\\-213.9297\\-49\\-163.765\\-211.9766\\-49\\-164.2932\\-208.0703\\-49\\-164.655\\-206.1172\\-49\\-165.5444\\-202.2109\\-49\\-165.9264\\-198.3047\\-49\\-166.2571\\-194.3984\\-49\\-166.7548\\-186.5859\\-49\\-166.827\\-182.6797\\-49\\-166.7652\\-178.7734\\-49\\-166.4891\\-172.9141\\-49\\-165.8529\\-165.1016\\-49\\-165.6494\\-163.1484\\-49\\-165.343\\-161.1953\\-49\\-164.8452\\-159.2422\\-49\\-164.1396\\-155.3359\\-49\\-163.849\\-153.3828\\-49\\-163.4182\\-151.4297\\-49\\-162.7327\\-149.4766\\-49\\-162.2742\\-147.5234\\-49\\-161.9274\\-145.5703\\-49\\-161.3946\\-143.6172\\-49\\-160.4957\\-141.6641\\-49\\-159.87\\-139.7109\\-49\\-158.8881\\-137.7578\\-49\\-158.0906\\-135.8047\\-49\\-156.3163\\-131.8984\\-49\\-155.6227\\-129.9453\\-49\\-154.541\\-127.9922\\-49\\-153.6933\\-126.0391\\-49\\-152.5677\\-124.0859\\-49\\-151.5666\\-122.1328\\-49\\-150.4477\\-120.1797\\-49\\-148.4187\\-116.2734\\-49\\-146.0539\\-112.3672\\-49\\-143.4471\\-108.4609\\-49\\-142.3222\\-106.5078\\-49\\-139.6484\\-103.195\\-49\\-137.6953\\-100.9215\\-49\\-135.7422\\-98.7592\\-49\\-133.7891\\-96.70463\\-49\\-127.9297\\-91.95137\\-49\\-125.9766\\-90.63867\\-49\\-124.0234\\-89.6263\\-49\\-122.0703\\-88.41024\\-49\\-120.1172\\-87.7443\\-49\\-118.1641\\-86.55054\\-49\\-116.2109\\-85.61819\\-49\\-114.2578\\-84.54977\\-49\\-112.3047\\-83.80991\\-49\\-110.3516\\-83.40533\\-49\\-108.3984\\-82.45465\\-49\\-104.4922\\-81.44525\\-49\\-102.5391\\-80.74826\\-49\\-100.5859\\-80.39538\\-49\\-98.63281\\-79.76447\\-49\\-96.67969\\-79.30476\\-49\\-92.77344\\-78.64601\\-49\\-90.82031\\-78.20558\\-49\\-84.96094\\-77.57632\\-49\\-81.05469\\-76.70483\\-49\\-79.10156\\-76.51141\\-49\\-73.24219\\-76.26528\\-49\\-63.47656\\-76.32907\\-49\\-55.66406\\-76.57904\\-49\\-51.75781\\-77.06233\\-49\\-45.89844\\-77.70241\\-49\\-40.03906\\-78.21691\\-49\\-36.13281\\-78.8601\\-49\\-30.27344\\-80.23418\\-49\\-28.32031\\-80.62212\\-49\\-26.36719\\-81.42757\\-49\\-22.46094\\-82.77958\\-49\\-18.55469\\-84.98275\\-49\\-15.65213\\-86.97656\\-49\\-13.14252\\-88.92969\\-49\\-10.74219\\-91.05371\\-49\\-8.580396\\-92.83594\\-49\\-4.882813\\-96.38638\\-49\\-2.929688\\-98.34654\\-49\\-0.9765625\\-99.75326\\-49\\0.9765625\\-99.51804\\-49\\5.836839\\-94.78906\\-49\\7.686038\\-92.83594\\-49\\8.789063\\-91.79999\\-49\\10.74219\\-89.78667\\-49\\12.69531\\-87.95313\\-49\\14.64844\\-86.26318\\-49\\16.60156\\-84.75895\\-49\\20.50781\\-82.27435\\-49\\22.46094\\-81.38632\\-49\\24.41406\\-80.36051\\-49\\27.13341\\-79.16406\\-49\\30.27344\\-77.96069\\-49\\34.17969\\-76.65384\\-49\\36.13281\\-76.25269\\-49\\40.03906\\-75.74609\\-49\\41.99219\\-75.2146\\-49\\43.94531\\-74.79173\\-49\\45.89844\\-74.56026\\-49\\49.80469\\-74.34839\\-49\\51.75781\\-74.29324\\-49\\57.61719\\-74.2339\\-49\\63.47656\\-74.29309\\-49\\69.33594\\-74.54341\\-49\\73.24219\\-74.79868\\-49\\75.19531\\-74.99792\\-49\\79.10156\\-75.74286\\-49\\83.00781\\-76.04024\\-49\\86.91406\\-76.47852\\-49\\88.86719\\-76.77181\\-49\\92.77344\\-77.77339\\-49\\94.72656\\-78.07297\\-49\\96.67969\\-78.53931\\-49\\100.5859\\-79.77274\\-49\\104.4922\\-80.81614\\-49\\106.4453\\-81.74039\\-49\\108.3984\\-82.28036\\-49\\112.3047\\-83.98546\\-49\\116.2109\\-86.07741\\-49\\118.1641\\-86.92143\\-49\\121.7413\\-88.92969\\-49\\124.0234\\-90.34834\\-49\\124.6665\\-90.88281\\-49\\127.4619\\-92.83594\\-49\\127.9297\\-93.25446\\-49\\129.8828\\-94.44135\\-49\\131.8359\\-95.95164\\-49\\134.8524\\-98.69531\\-49\\137.6953\\-101.5424\\-49\\140.5128\\-104.5547\\-49\\141.9519\\-106.5078\\-49\\143.0486\\-108.4609\\-49\\143.5547\\-109.1684\\-49\\145.3501\\-112.3672\\-49\\147.903\\-116.2734\\-49\\148.6962\\-118.2266\\-49\\149.8256\\-120.1797\\-49\\150.5445\\-122.1328\\-49\\151.6317\\-124.0859\\-49\\152.433\\-126.0391\\-49\\153.4577\\-127.9922\\-49\\154.9064\\-131.8984\\-49\\155.7885\\-133.8516\\-49\\156.765\\-137.7578\\-49\\157.6666\\-139.7109\\-49\\158.6853\\-143.6172\\-49\\159.4746\\-145.5703\\-49\\159.9496\\-147.5234\\-49\\160.7281\\-151.4297\\-49\\161.3004\\-153.3828\\-49\\161.6953\\-155.3359\\-49\\161.9177\\-157.2891\\-49\\162.4042\\-163.1484\\-49\\162.86\\-167.0547\\-49\\163.1705\\-169.0078\\-49\\163.6047\\-172.9141\\-49\\163.8929\\-178.7734\\-49\\164.0724\\-186.5859\\-49\\164.0877\\-192.4453\\-49\\164.0224\\-200.2578\\-49\\163.9091\\-206.1172\\-49\\163.7684\\-210.0234\\-49\\163.5164\\-213.9297\\-49\\162.6009\\-219.7891\\-49\\162.1813\\-223.6953\\-49\\161.6371\\-227.6016\\-49\\160.3636\\-231.5078\\-49\\159.8638\\-233.4609\\-49\\158.9745\\-235.4141\\-49\\157.5235\\-239.3203\\-49\\156.5125\\-241.2734\\-49\\155.8871\\-243.2266\\-49\\154.7786\\-245.1797\\-49\\153.9733\\-247.1328\\-49\\152.6184\\-249.0859\\-49\\151.3672\\-251.1799\\-49\\149.4141\\-254.2598\\-49\\147.6435\\-256.8984\\-49\\146.0341\\-258.8516\\-49\\144.3207\\-260.8047\\-49\\143.5547\\-261.8281\\-49\\139.6484\\-266.0699\\-49\\137.6953\\-268.0398\\-49\\135.0644\\-270.5703\\-49\\133.7891\\-271.6873\\-49\\131.8359\\-273.5698\\-49\\129.8828\\-275.2725\\-49\\127.9297\\-276.8106\\-49\\125.7951\\-278.3828\\-49\\122.0703\\-281.2608\\-49\\120.1172\\-282.6641\\-49\\118.1641\\-283.6967\\-49\\117.4762\\-284.2422\\-49\\114.2578\\-286.4984\\-49\\112.3047\\-287.4869\\-49\\110.3516\\-288.7303\\-49\\108.3984\\-289.4655\\-49\\106.4453\\-290.6571\\-49\\104.4922\\-291.4173\\-49\\102.5391\\-292.5783\\-49\\100.5859\\-293.274\\-49\\98.63281\\-294.1644\\-49\\96.67969\\-294.7903\\-49\\94.72656\\-295.198\\-49\\92.77344\\-295.7298\\-49\\90.82031\\-296.4001\\-49\\88.86719\\-296.791\\-49\\84.96094\\-297.3365\\-49\\81.05469\\-298.2502\\-49\\79.10156\\-298.4978\\-49\\75.19531\\-298.774\\-49\\71.28906\\-298.871\\-49\\67.38281\\-298.7617\\-49\\63.47656\\-298.3877\\-49\\61.52344\\-297.9662\\-49\\59.57031\\-297.3985\\-49\\55.66406\\-296.6737\\-49\\53.71094\\-296.0763\\-49\\51.75781\\-295.3036\\-49\\49.80469\\-294.8355\\-49\\47.85156\\-294.0463\\-49\\43.94531\\-292.257\\-49\\41.99219\\-291.1599\\-49\\40.03906\\-290.2913\\-49\\38.08594\\-289.2532\\-49\\36.13281\\-288.474\\-49\\34.17969\\-287.2756\\-49\\32.22656\\-286.3921\\-49\\30.27344\\-285.1799\\-49\\28.32031\\-284.1061\\-49\\26.36719\\-283.2594\\-49\\24.41406\\-282.8248\\-49\\20.50781\\-282.4101\\-49\\16.60156\\-282.3636\\-49\\10.74219\\-282.6297\\-49\\6.835938\\-282.9245\\-49\\2.929688\\-283.0279\\-49\\0.9765625\\-283.2161\\-49\\-4.882813\\-283.3084\\-49\\-8.789063\\-283.3152\\-49\\-14.64844\\-283.2379\\-49\\-20.50781\\-283.2317\\-49\\-22.46094\\-283.3188\\-49\\-24.41406\\-283.5131\\-49\\-26.36719\\-284.0437\\-49\\-26.69711\\-284.2422\\-49\\-30.27344\\-285.7605\\-49\\-32.22656\\-286.9006\\-49\\-34.17969\\-287.7398\\-49\\-36.13281\\-288.827\\-49\\-38.08594\\-289.4742\\-49\\-40.03906\\-290.675\\-49\\-41.99219\\-291.4924\\-49\\-43.94531\\-292.7039\\-49\\-45.89844\\-293.4757\\-49\\-47.85156\\-294.5317\\-49\\-49.80469\\-295.1057\\-49\\-51.75781\\-295.7855\\-49\\-53.71094\\-296.6331\\-49\\-57.61719\\-297.562\\-49\\-59.57031\\-298.2709\\-49\\-61.52344\\-298.6687\\-49\\-63.47656\\-298.9654\\-49\\-69.33594\\-299.689\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "302" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "102" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-298.1959\\-47\\-88.86719\\-297.4765\\-47\\-92.77344\\-296.6294\\-47\\-94.72656\\-295.8148\\-47\\-96.67969\\-295.137\\-47\\-98.63281\\-294.5849\\-47\\-100.5859\\-293.5226\\-47\\-102.5391\\-292.6964\\-47\\-104.4922\\-291.3711\\-47\\-106.4453\\-290.4489\\-47\\-108.3984\\-289.2089\\-47\\-110.3516\\-288.2675\\-47\\-112.3047\\-287.0563\\-47\\-114.2578\\-285.6563\\-47\\-118.1641\\-283.1198\\-47\\-120.1172\\-281.6105\\-47\\-122.0229\\-280.3359\\-47\\-124.2575\\-278.3828\\-47\\-127.9297\\-275.3555\\-47\\-129.8828\\-273.5393\\-47\\-130.823\\-272.5234\\-47\\-132.8929\\-270.5703\\-47\\-135.7422\\-267.7196\\-47\\-139.6484\\-263.2874\\-47\\-140.178\\-262.7578\\-47\\-141.7512\\-260.8047\\-47\\-142.9102\\-258.8516\\-47\\-145.9227\\-254.9453\\-47\\-148.4254\\-251.0391\\-47\\-149.5909\\-249.0859\\-47\\-150.4946\\-247.1328\\-47\\-151.7193\\-245.1797\\-47\\-152.6355\\-243.2266\\-47\\-153.8269\\-241.2734\\-47\\-154.5715\\-239.3203\\-47\\-155.5822\\-237.3672\\-47\\-156.8129\\-233.4609\\-47\\-157.8348\\-231.5078\\-47\\-158.4273\\-229.5547\\-47\\-159.3541\\-227.6016\\-47\\-159.9969\\-225.6484\\-47\\-160.5269\\-223.6953\\-47\\-161.2859\\-221.7422\\-47\\-161.8304\\-219.7891\\-47\\-162.4493\\-215.8828\\-47\\-162.927\\-213.9297\\-47\\-163.5391\\-211.9766\\-47\\-163.8892\\-210.0234\\-47\\-164.3899\\-206.1172\\-47\\-164.7475\\-204.1641\\-47\\-165.2261\\-202.2109\\-47\\-165.7395\\-198.3047\\-47\\-166.0557\\-194.3984\\-47\\-166.4568\\-186.5859\\-47\\-166.5193\\-182.6797\\-47\\-166.4005\\-176.8203\\-47\\-166.2332\\-172.9141\\-47\\-165.9958\\-169.0078\\-47\\-165.4358\\-163.1484\\-47\\-164.5508\\-159.2422\\-47\\-163.6766\\-153.3828\\-47\\-162.4912\\-149.4766\\-47\\-161.7352\\-145.5703\\-47\\-160.2654\\-141.6641\\-47\\-159.6089\\-139.7109\\-47\\-158.5577\\-137.7578\\-47\\-157.8544\\-135.8047\\-47\\-156.7795\\-133.8516\\-47\\-156.1149\\-131.8984\\-47\\-154.315\\-127.9922\\-47\\-152.3198\\-124.0859\\-47\\-151.1875\\-122.1328\\-47\\-150.2557\\-120.1797\\-47\\-149.069\\-118.2266\\-47\\-148.2685\\-116.2734\\-47\\-146.9289\\-114.3203\\-47\\-145.861\\-112.3672\\-47\\-145.5078\\-111.9144\\-47\\-143.5547\\-108.8423\\-47\\-143.2419\\-108.4609\\-47\\-142.1666\\-106.5078\\-47\\-139.6484\\-103.2905\\-47\\-137.6953\\-101.0116\\-47\\-133.7891\\-96.69\\-47\\-127.9297\\-91.91401\\-47\\-125.9766\\-90.55506\\-47\\-124.0234\\-89.52611\\-47\\-122.0703\\-88.31255\\-47\\-120.1172\\-87.62542\\-47\\-118.1641\\-86.374\\-47\\-115.8114\\-85.02344\\-47\\-114.2578\\-84.2407\\-47\\-110.3516\\-83.23307\\-47\\-108.3984\\-82.31448\\-47\\-106.4453\\-81.89458\\-47\\-102.5391\\-80.57539\\-47\\-100.5859\\-80.30436\\-47\\-98.63281\\-79.56571\\-47\\-96.67969\\-79.14135\\-47\\-92.77344\\-78.53748\\-47\\-90.82031\\-78.07832\\-47\\-86.91406\\-77.59505\\-47\\-83.00781\\-76.90576\\-47\\-81.05469\\-76.49756\\-47\\-75.19531\\-76.16068\\-47\\-63.47656\\-76.20565\\-47\\-55.66406\\-76.35275\\-47\\-53.71094\\-76.47074\\-47\\-47.85156\\-77.04456\\-47\\-43.94531\\-77.56544\\-47\\-40.03906\\-77.91954\\-47\\-34.17969\\-78.79785\\-47\\-30.27344\\-79.89957\\-47\\-28.32031\\-80.30338\\-47\\-26.36719\\-80.85628\\-47\\-24.41406\\-81.7487\\-47\\-22.46094\\-82.3363\\-47\\-18.55469\\-84.37891\\-47\\-16.60156\\-85.80338\\-47\\-14.85352\\-86.97656\\-47\\-12.69531\\-88.60679\\-47\\-7.842319\\-92.83594\\-47\\-4.882813\\-95.72347\\-47\\-2.929688\\-97.70547\\-47\\-0.9765625\\-99.27579\\-47\\0.9765625\\-98.91144\\-47\\2.929688\\-97.15535\\-47\\5.419121\\-94.78906\\-47\\10.74219\\-89.35648\\-47\\13.29304\\-86.97656\\-47\\15.625\\-85.02344\\-47\\18.55469\\-83.01238\\-47\\22.46094\\-80.80146\\-47\\24.41406\\-80.06403\\-47\\26.36719\\-79.05556\\-47\\32.22656\\-76.88541\\-47\\34.17969\\-76.38366\\-47\\38.08594\\-75.74609\\-47\\41.99219\\-74.72974\\-47\\45.89844\\-74.39868\\-47\\49.80469\\-74.23905\\-47\\51.75781\\-74.04389\\-47\\55.66406\\-73.98553\\-47\\57.61719\\-73.29706\\-47\\59.57031\\-73.83397\\-47\\63.47656\\-74.08723\\-47\\65.42969\\-74.28125\\-47\\73.24219\\-74.618\\-47\\77.14844\\-74.99792\\-47\\79.10156\\-75.43059\\-47\\81.05469\\-75.76205\\-47\\88.86719\\-76.56196\\-47\\90.82031\\-77.00719\\-47\\92.77344\\-77.56544\\-47\\96.67969\\-78.35123\\-47\\98.63281\\-78.92834\\-47\\100.5859\\-79.61108\\-47\\104.4922\\-80.65248\\-47\\106.4453\\-81.59869\\-47\\108.3984\\-82.16089\\-47\\110.653\\-83.07031\\-47\\114.2578\\-84.81174\\-47\\116.2109\\-85.96449\\-47\\118.1641\\-86.83273\\-47\\122.0129\\-88.92969\\-47\\124.0234\\-90.21299\\-47\\127.9297\\-93.04858\\-47\\129.8828\\-94.3478\\-47\\131.8359\\-95.90054\\-47\\134.9224\\-98.69531\\-47\\139.6484\\-103.6825\\-47\\140.4001\\-104.5547\\-47\\141.8281\\-106.5078\\-47\\142.9478\\-108.4609\\-47\\144.1767\\-110.4141\\-47\\145.1546\\-112.3672\\-47\\145.5078\\-112.82\\-47\\147.6962\\-116.2734\\-47\\148.537\\-118.2266\\-47\\149.5469\\-120.1797\\-47\\151.2199\\-124.0859\\-47\\152.2113\\-126.0391\\-47\\153.9851\\-129.9453\\-47\\154.6203\\-131.8984\\-47\\155.5063\\-133.8516\\-47\\156.1044\\-135.8047\\-47\\156.5092\\-137.7578\\-47\\157.3073\\-139.7109\\-47\\157.9577\\-141.6641\\-47\\158.3932\\-143.6172\\-47\\159.7077\\-147.5234\\-47\\160.4576\\-151.4297\\-47\\161.4265\\-155.3359\\-47\\161.9555\\-159.2422\\-47\\162.5655\\-167.0547\\-47\\162.7698\\-169.0078\\-47\\163.3085\\-172.9141\\-47\\163.5164\\-174.8672\\-47\\163.7275\\-178.7734\\-47\\163.9252\\-186.5859\\-47\\163.9353\\-196.3516\\-47\\163.821\\-204.1641\\-47\\163.6882\\-208.0703\\-47\\163.4069\\-211.9766\\-47\\163.1995\\-213.9297\\-47\\162.6237\\-217.8359\\-47\\162.2532\\-221.7422\\-47\\161.7777\\-225.6484\\-47\\161.3787\\-227.6016\\-47\\160.6572\\-229.5547\\-47\\159.6144\\-233.4609\\-47\\158.6345\\-235.4141\\-47\\158.0067\\-237.3672\\-47\\157.0805\\-239.3203\\-47\\155.6396\\-243.2266\\-47\\154.5516\\-245.1797\\-47\\153.7019\\-247.1328\\-47\\151.3672\\-250.6359\\-47\\151.0392\\-251.0391\\-47\\150.0116\\-252.9922\\-47\\147.4609\\-256.5207\\-47\\143.5547\\-261.3843\\-47\\140.5679\\-264.7109\\-47\\137.6953\\-267.6406\\-47\\134.6354\\-270.5703\\-47\\133.7891\\-271.2464\\-47\\131.8359\\-273.1413\\-47\\129.8828\\-274.8983\\-47\\125.9766\\-277.7513\\-47\\122.0703\\-280.9405\\-47\\120.1172\\-282.0983\\-47\\118.1641\\-283.372\\-47\\116.2109\\-284.7558\\-47\\110.3516\\-288.2823\\-47\\108.3984\\-289.1614\\-47\\102.5391\\-292.0159\\-47\\100.5859\\-292.9279\\-47\\98.63281\\-293.6031\\-47\\96.67969\\-294.4529\\-47\\94.72656\\-294.9484\\-47\\92.77344\\-295.3418\\-47\\90.82031\\-295.8594\\-47\\88.86719\\-296.493\\-47\\86.91406\\-296.8319\\-47\\83.00781\\-297.34\\-47\\79.10156\\-298.1011\\-47\\77.14844\\-298.367\\-47\\75.19531\\-298.5277\\-47\\71.28906\\-298.6275\\-47\\67.38281\\-298.5384\\-47\\65.42969\\-298.376\\-47\\63.47656\\-298.0361\\-47\\59.57031\\-297.1776\\-47\\55.66406\\-296.511\\-47\\53.71094\\-295.7731\\-47\\51.75781\\-295.1906\\-47\\49.80469\\-294.7493\\-47\\43.94531\\-292.2303\\-47\\41.99219\\-291.1804\\-47\\40.03906\\-290.4314\\-47\\38.08594\\-289.3584\\-47\\36.13281\\-288.6606\\-47\\34.17969\\-287.411\\-47\\32.22656\\-286.7825\\-47\\30.27344\\-285.571\\-47\\27.06262\\-284.2422\\-47\\26.36719\\-283.8945\\-47\\24.41406\\-283.4935\\-47\\20.50781\\-283.3443\\-47\\16.60156\\-283.3673\\-47\\4.882813\\-284.2333\\-47\\2.929688\\-284.3167\\-47\\0.9765625\\-284.5201\\-47\\-2.929688\\-284.62\\-47\\-6.835938\\-284.6314\\-47\\-14.64844\\-284.4901\\-47\\-20.50781\\-284.419\\-47\\-24.41406\\-284.6152\\-47\\-26.36719\\-284.927\\-47\\-28.32031\\-285.4225\\-47\\-30.27344\\-286.4147\\-47\\-32.22656\\-287.1839\\-47\\-36.13281\\-288.9407\\-47\\-38.08594\\-289.5576\\-47\\-40.03906\\-290.7435\\-47\\-41.99219\\-291.5043\\-47\\-43.94531\\-292.6889\\-47\\-45.89844\\-293.4194\\-47\\-47.85156\\-294.4499\\-47\\-49.80469\\-294.9489\\-47\\-51.75781\\-295.6026\\-47\\-53.71094\\-296.5021\\-47\\-57.61719\\-297.3449\\-47\\-59.57031\\-297.9948\\-47\\-61.52344\\-298.5244\\-47\\-63.47656\\-298.8121\\-47\\-67.38281\\-299.2632\\-47\\-71.28906\\-299.5461\\-47\\-73.24219\\-299.6027\\-47\\-77.14844\\-299.4434\\-47\\-81.05469\\-299.1036\\-47\\-84.96094\\-298.6109\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "308" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "103" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-298.439\\-45\\-88.86719\\-297.2687\\-45\\-92.77344\\-296.4299\\-45\\-94.72656\\-295.5337\\-45\\-98.63281\\-294.3586\\-45\\-100.5859\\-293.2809\\-45\\-102.5391\\-292.4264\\-45\\-104.4922\\-291.1436\\-45\\-108.3984\\-289.0587\\-45\\-112.3047\\-286.8444\\-45\\-116.2109\\-284.0469\\-45\\-118.1641\\-282.9069\\-45\\-121.6446\\-280.3359\\-45\\-124.0234\\-278.3083\\-45\\-127.9297\\-275.219\\-45\\-129.8828\\-273.3922\\-45\\-130.6702\\-272.5234\\-45\\-134.7587\\-268.6172\\-45\\-135.7422\\-267.5904\\-45\\-139.6484\\-263.1323\\-45\\-141.6016\\-260.7549\\-45\\-142.8287\\-258.8516\\-45\\-145.7802\\-254.9453\\-45\\-147.0018\\-252.9922\\-45\\-148.3215\\-251.0391\\-45\\-149.4141\\-249.0523\\-45\\-150.3683\\-247.1328\\-45\\-151.5336\\-245.1797\\-45\\-152.5018\\-243.2266\\-45\\-153.6631\\-241.2734\\-45\\-154.4372\\-239.3203\\-45\\-155.3601\\-237.3672\\-45\\-156.1302\\-235.4141\\-45\\-156.6147\\-233.4609\\-45\\-157.6381\\-231.5078\\-45\\-158.2489\\-229.5547\\-45\\-158.9886\\-227.6016\\-45\\-159.8433\\-225.6484\\-45\\-160.3308\\-223.6953\\-45\\-161.6371\\-219.7891\\-45\\-162.0081\\-217.8359\\-45\\-162.6206\\-213.9297\\-45\\-163.2425\\-211.9766\\-45\\-163.7042\\-210.0234\\-45\\-164.452\\-204.1641\\-45\\-164.7727\\-202.2109\\-45\\-165.2261\\-200.2578\\-45\\-165.7092\\-196.3516\\-45\\-165.9655\\-192.4453\\-45\\-166.1486\\-188.5391\\-45\\-166.2439\\-184.6328\\-45\\-166.2638\\-180.7266\\-45\\-166.1123\\-174.8672\\-45\\-165.921\\-170.9609\\-45\\-165.638\\-167.0547\\-45\\-165.426\\-165.1016\\-45\\-164.6343\\-161.1953\\-45\\-164.3273\\-159.2422\\-45\\-163.8184\\-155.3359\\-45\\-163.4069\\-153.3828\\-45\\-162.7417\\-151.4297\\-45\\-161.9828\\-147.5234\\-45\\-161.4722\\-145.5703\\-45\\-160.6477\\-143.6172\\-45\\-160.0388\\-141.6641\\-45\\-159.2323\\-139.7109\\-45\\-158.3029\\-137.7578\\-45\\-157.5731\\-135.8047\\-45\\-156.5192\\-133.8516\\-45\\-155.905\\-131.8984\\-45\\-154.8462\\-129.9453\\-45\\-154.1004\\-127.9922\\-45\\-152.9803\\-126.0391\\-45\\-152.024\\-124.0859\\-45\\-150.8082\\-122.1328\\-45\\-150.0105\\-120.1797\\-45\\-148.8321\\-118.2266\\-45\\-148.0614\\-116.2734\\-45\\-146.6809\\-114.3203\\-45\\-145.5917\\-112.3672\\-45\\-143.5547\\-109.1213\\-45\\-143.0486\\-108.4609\\-45\\-141.9493\\-106.5078\\-45\\-140.5291\\-104.5547\\-45\\-137.6953\\-101.1288\\-45\\-133.7801\\-96.74219\\-45\\-129.1101\\-92.83594\\-45\\-125.9766\\-90.5331\\-45\\-122.0703\\-88.19228\\-45\\-120.1172\\-87.38346\\-45\\-118.1641\\-86.29014\\-45\\-116.2109\\-85.0695\\-45\\-114.2578\\-84.1048\\-45\\-112.3047\\-83.80599\\-45\\-108.3984\\-82.20151\\-45\\-106.4453\\-81.78816\\-45\\-104.4922\\-80.8349\\-45\\-102.5391\\-80.45564\\-45\\-100.5859\\-80.22481\\-45\\-98.63281\\-79.51283\\-45\\-96.67969\\-79.02863\\-45\\-88.86719\\-77.69598\\-45\\-86.5009\\-77.21094\\-45\\-83.00781\\-76.6014\\-45\\-81.05469\\-76.37666\\-45\\-75.19531\\-76.08367\\-45\\-65.42969\\-76.04498\\-45\\-61.52344\\-76.07064\\-45\\-55.66406\\-76.21126\\-45\\-51.75781\\-76.35181\\-45\\-45.89844\\-76.84644\\-45\\-41.99219\\-77.39314\\-45\\-38.08594\\-77.87209\\-45\\-34.17969\\-78.43451\\-45\\-32.22656\\-78.87109\\-45\\-30.27344\\-79.51081\\-45\\-26.36719\\-80.4894\\-45\\-24.41406\\-81.35187\\-45\\-20.50781\\-82.8094\\-45\\-18.55469\\-83.97127\\-45\\-14.64844\\-86.49179\\-45\\-12.69531\\-88.06084\\-45\\-9.447675\\-90.88281\\-45\\-7.284841\\-92.83594\\-45\\-5.271709\\-94.78906\\-45\\-2.929688\\-96.95824\\-45\\-0.9765625\\-98.53372\\-45\\0.9765625\\-98.18498\\-45\\2.824768\\-96.74219\\-45\\4.882813\\-94.88412\\-45\\6.835938\\-92.98686\\-45\\8.708294\\-90.88281\\-45\\10.74219\\-88.92148\\-45\\15.14089\\-85.02344\\-45\\18.55469\\-82.54716\\-45\\20.50781\\-81.58739\\-45\\22.46094\\-80.4894\\-45\\24.41406\\-79.68442\\-45\\26.36719\\-78.69505\\-45\\32.22656\\-76.60059\\-45\\36.13281\\-75.86024\\-45\\40.03906\\-74.78817\\-45\\41.99219\\-74.5303\\-45\\47.85156\\-74.20568\\-45\\51.75781\\-73.11768\\-45\\55.66406\\-73.06896\\-45\\57.61719\\-72.87\\-45\\63.47656\\-73.26713\\-45\\65.42969\\-74.05338\\-45\\67.38281\\-74.2636\\-45\\73.24219\\-74.51103\\-45\\77.14844\\-74.78761\\-45\\79.10156\\-75.02757\\-45\\83.00781\\-75.83487\\-45\\88.86719\\-76.39515\\-45\\90.82031\\-76.77181\\-45\\92.77344\\-77.3515\\-45\\96.67969\\-78.1992\\-45\\98.63281\\-78.75188\\-45\\102.5391\\-79.99322\\-45\\104.4922\\-80.52359\\-45\\106.4453\\-81.40355\\-45\\110.3516\\-82.70941\\-45\\112.3047\\-83.76701\\-45\\114.2578\\-84.67692\\-45\\116.2109\\-85.86979\\-45\\118.1641\\-86.73785\\-45\\120.1172\\-87.86157\\-45\\122.0703\\-88.81155\\-45\\124.0234\\-90.11466\\-45\\125.9766\\-91.5603\\-45\\127.9297\\-92.82831\\-45\\129.8828\\-94.23404\\-45\\131.8359\\-95.79733\\-45\\134.9567\\-98.69531\\-45\\137.6953\\-101.625\\-45\\139.6484\\-103.8125\\-45\\141.66\\-106.5078\\-45\\142.78\\-108.4609\\-45\\144.043\\-110.4141\\-45\\144.9653\\-112.3672\\-45\\146.2995\\-114.3203\\-45\\147.4609\\-116.3847\\-45\\148.3704\\-118.2266\\-45\\149.2048\\-120.1797\\-45\\150.1749\\-122.1328\\-45\\150.8625\\-124.0859\\-45\\151.9686\\-126.0391\\-45\\152.7123\\-127.9922\\-45\\153.7352\\-129.9453\\-45\\154.3969\\-131.8984\\-45\\155.9181\\-135.8047\\-45\\156.3329\\-137.7578\\-45\\156.8823\\-139.7109\\-45\\157.7002\\-141.6641\\-45\\158.6275\\-145.5703\\-45\\159.3667\\-147.5234\\-45\\159.8809\\-149.4766\\-45\\160.5756\\-153.3828\\-45\\161.4898\\-157.2891\\-45\\161.7859\\-159.2422\\-45\\162.2702\\-165.1016\\-45\\162.5216\\-169.0078\\-45\\162.9145\\-172.9141\\-45\\163.2136\\-174.8672\\-45\\163.4961\\-178.7734\\-45\\163.6684\\-182.6797\\-45\\163.7684\\-186.5859\\-45\\163.821\\-192.4453\\-45\\163.7897\\-196.3516\\-45\\163.6431\\-204.1641\\-45\\163.4857\\-208.0703\\-45\\163.2957\\-210.0234\\-45\\162.6009\\-215.8828\\-45\\162.127\\-221.7422\\-45\\161.569\\-225.6484\\-45\\160.3933\\-229.5547\\-45\\159.9345\\-231.5078\\-45\\159.2319\\-233.4609\\-45\\158.3677\\-235.4141\\-45\\157.7919\\-237.3672\\-45\\156.735\\-239.3203\\-45\\156.1541\\-241.2734\\-45\\155.3141\\-243.2266\\-45\\153.3203\\-247.1218\\-45\\152.1403\\-249.0859\\-45\\150.714\\-251.0391\\-45\\149.7026\\-252.9922\\-45\\148.3398\\-254.9453\\-45\\145.0872\\-258.8516\\-45\\143.6406\\-260.8047\\-45\\141.9658\\-262.7578\\-45\\140.1367\\-264.7109\\-45\\137.6953\\-267.2106\\-45\\135.7422\\-269.1238\\-45\\129.742\\-274.4766\\-45\\124.7025\\-278.3828\\-45\\122.0703\\-280.5388\\-45\\120.1172\\-281.6617\\-45\\118.1641\\-283.0716\\-45\\114.2578\\-285.451\\-45\\112.3047\\-286.7996\\-45\\110.3516\\-287.7121\\-45\\108.3984\\-288.865\\-45\\106.4453\\-289.5352\\-45\\104.4922\\-290.7119\\-45\\102.5391\\-291.4413\\-45\\100.5859\\-292.5604\\-45\\98.63281\\-293.2013\\-45\\94.72656\\-294.6692\\-45\\90.82031\\-295.4265\\-45\\86.91406\\-296.5743\\-45\\79.10156\\-297.5753\\-45\\75.19531\\-298.1959\\-45\\73.24219\\-298.301\\-45\\69.33594\\-298.3488\\-45\\67.38281\\-298.2396\\-45\\59.57031\\-297.0002\\-45\\57.61719\\-296.527\\-45\\55.66406\\-295.9165\\-45\\53.71094\\-295.5552\\-45\\49.80469\\-294.6444\\-45\\47.85156\\-293.7916\\-45\\43.94531\\-292.2174\\-45\\41.99219\\-291.2256\\-45\\40.03906\\-290.5509\\-45\\38.08594\\-289.4652\\-45\\36.13281\\-288.8777\\-45\\34.17969\\-287.7981\\-45\\32.22656\\-287.0666\\-45\\28.32031\\-285.2655\\-45\\26.36719\\-284.8417\\-45\\24.41406\\-284.5724\\-45\\22.46094\\-284.4292\\-45\\18.55469\\-284.5993\\-45\\16.60156\\-284.4305\\-45\\14.64844\\-284.7768\\-45\\6.835938\\-285.3593\\-45\\0.9765625\\-285.6384\\-45\\-2.929688\\-285.707\\-45\\-6.835938\\-285.7188\\-45\\-10.74219\\-285.666\\-45\\-16.60156\\-285.537\\-45\\-22.46094\\-285.4594\\-45\\-24.41406\\-285.4845\\-45\\-26.36719\\-285.6558\\-45\\-28.2959\\-286.1953\\-45\\-32.22656\\-287.5258\\-45\\-34.17969\\-288.474\\-45\\-36.13281\\-288.9644\\-45\\-38.08594\\-289.6514\\-45\\-40.03906\\-290.8006\\-45\\-41.99219\\-291.5161\\-45\\-43.94531\\-292.6736\\-45\\-45.89844\\-293.3826\\-45\\-47.85156\\-294.3015\\-45\\-49.80469\\-294.6726\\-45\\-53.71094\\-296.3229\\-45\\-55.66406\\-296.8108\\-45\\-57.61719\\-297.1803\\-45\\-59.57031\\-297.6699\\-45\\-61.52344\\-298.3205\\-45\\-63.47656\\-298.654\\-45\\-67.38281\\-299.0724\\-45\\-69.33594\\-299.2216\\-45\\-73.24219\\-299.3554\\-45\\-77.14844\\-299.218\\-45\\-81.05469\\-298.9397\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "306" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "104" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-298.1846\\-43\\-86.91406\\-297.5325\\-43\\-90.82031\\-296.752\\-43\\-92.77344\\-296.1607\\-43\\-94.72656\\-295.3203\\-43\\-96.67969\\-294.8388\\-43\\-98.63281\\-294.0621\\-43\\-102.4892\\-292.0547\\-43\\-104.4922\\-290.9394\\-43\\-106.4453\\-289.6821\\-43\\-108.3984\\-288.8934\\-43\\-110.3516\\-287.6236\\-43\\-112.3047\\-286.5873\\-43\\-112.7809\\-286.1953\\-43\\-115.6494\\-284.2422\\-43\\-116.2109\\-283.7609\\-43\\-118.1641\\-282.6696\\-43\\-120.1172\\-281.2882\\-43\\-124.0234\\-278.0324\\-43\\-127.9297\\-275.0555\\-43\\-129.8828\\-273.228\\-43\\-131.8359\\-271.257\\-43\\-134.6251\\-268.6172\\-43\\-136.4388\\-266.6641\\-43\\-139.6484\\-262.9419\\-43\\-141.6016\\-260.535\\-43\\-142.7493\\-258.8516\\-43\\-145.6026\\-254.9453\\-43\\-148.2212\\-251.0391\\-43\\-151.2806\\-245.1797\\-43\\-153.4819\\-241.2734\\-43\\-155.1285\\-237.3672\\-43\\-156.009\\-235.4141\\-43\\-156.4605\\-233.4609\\-43\\-157.4136\\-231.5078\\-43\\-158.7126\\-227.6016\\-43\\-159.641\\-225.6484\\-43\\-160.6924\\-221.7422\\-43\\-161.4285\\-219.7891\\-43\\-161.8622\\-217.8359\\-43\\-162.4122\\-213.9297\\-43\\-162.8454\\-211.9766\\-43\\-163.4404\\-210.0234\\-43\\-163.7967\\-208.0703\\-43\\-164.467\\-202.2109\\-43\\-165.1745\\-198.3047\\-43\\-165.4738\\-196.3516\\-43\\-165.7728\\-192.4453\\-43\\-165.9371\\-188.5391\\-43\\-166.0405\\-184.6328\\-43\\-166.0509\\-180.7266\\-43\\-165.9712\\-176.8203\\-43\\-165.8313\\-172.9141\\-43\\-165.5884\\-169.0078\\-43\\-165.0912\\-165.1016\\-43\\-164.668\\-163.1484\\-43\\-163.9058\\-157.2891\\-43\\-163.5866\\-155.3359\\-43\\-162.4796\\-151.4297\\-43\\-161.7942\\-147.5234\\-43\\-160.3639\\-143.6172\\-43\\-159.7802\\-141.6641\\-43\\-158.7904\\-139.7109\\-43\\-158.0585\\-137.7578\\-43\\-156.3099\\-133.8516\\-43\\-155.6396\\-131.8984\\-43\\-154.5954\\-129.9453\\-43\\-153.9112\\-127.9922\\-43\\-152.7158\\-126.0391\\-43\\-151.7488\\-124.0859\\-43\\-150.5503\\-122.1328\\-43\\-149.7659\\-120.1797\\-43\\-148.6574\\-118.2266\\-43\\-147.7841\\-116.2734\\-43\\-147.4609\\-115.8589\\-43\\-145.29\\-112.3672\\-43\\-143.5547\\-109.4375\\-43\\-142.8657\\-108.4609\\-43\\-141.7376\\-106.5078\\-43\\-140.384\\-104.5547\\-43\\-137.6953\\-101.2813\\-43\\-137.0915\\-100.6484\\-43\\-133.7891\\-96.8381\\-43\\-131.8359\\-95.10187\\-43\\-129.1167\\-92.83594\\-43\\-125.9766\\-90.51172\\-43\\-122.0703\\-88.13128\\-43\\-120.1172\\-87.28937\\-43\\-118.1641\\-86.25809\\-43\\-116.2109\\-85.05057\\-43\\-114.2578\\-84.14536\\-43\\-112.3047\\-83.79156\\-43\\-110.3516\\-82.89503\\-43\\-108.3984\\-82.14763\\-43\\-106.4453\\-81.69205\\-43\\-104.4922\\-80.63588\\-43\\-102.5391\\-80.36367\\-43\\-98.63281\\-79.46395\\-43\\-96.67969\\-78.95236\\-43\\-92.77344\\-78.20536\\-43\\-90.82031\\-77.89268\\-43\\-86.91406\\-77.00865\\-43\\-83.00781\\-76.40854\\-43\\-81.05469\\-76.25269\\-43\\-79.10156\\-76.21011\\-43\\-75.19531\\-75.99634\\-43\\-69.33594\\-75.90271\\-43\\-63.47656\\-75.85635\\-43\\-51.75781\\-76.17519\\-43\\-47.85156\\-76.36584\\-43\\-43.94531\\-76.70286\\-43\\-40.19326\\-77.21094\\-43\\-34.17969\\-78.14822\\-43\\-32.22656\\-78.52619\\-43\\-30.27344\\-79.00247\\-43\\-28.32031\\-79.6756\\-43\\-24.41406\\-80.84345\\-43\\-22.46094\\-81.80014\\-43\\-20.50781\\-82.40835\\-43\\-16.60156\\-84.67838\\-43\\-13.42989\\-86.97656\\-43\\-8.789063\\-90.77431\\-43\\-2.339377\\-96.74219\\-43\\-0.9765625\\-97.90536\\-43\\0.9765625\\-97.74681\\-43\\2.342224\\-96.74219\\-43\\4.451308\\-94.78906\\-43\\6.835938\\-92.47343\\-43\\8.283944\\-90.88281\\-43\\10.74219\\-88.42305\\-43\\14.64844\\-84.91493\\-43\\18.55469\\-82.21745\\-43\\20.62196\\-81.11719\\-43\\22.46094\\-80.28424\\-43\\24.59039\\-79.16406\\-43\\26.36719\\-78.38873\\-43\\30.27344\\-76.94273\\-43\\32.22656\\-76.35569\\-43\\36.13281\\-75.67921\\-43\\38.08594\\-74.86565\\-43\\40.03906\\-74.59106\\-43\\43.94531\\-74.31102\\-43\\47.94922\\-73.30469\\-43\\49.80469\\-72.94787\\-43\\51.75781\\-72.84272\\-43\\57.61719\\-72.81641\\-43\\63.47656\\-72.88874\\-43\\67.38281\\-73.41319\\-43\\69.33594\\-74.24616\\-43\\77.14844\\-74.65002\\-43\\81.05469\\-75.10057\\-43\\83.00781\\-75.71004\\-43\\86.91406\\-76.116\\-43\\88.86719\\-76.26379\\-43\\90.82031\\-76.56641\\-43\\94.72656\\-77.66412\\-43\\96.67969\\-78.05054\\-43\\100.4519\\-79.16406\\-43\\102.5391\\-79.93693\\-43\\104.4922\\-80.42749\\-43\\108.3984\\-81.96395\\-43\\110.3516\\-82.59213\\-43\\112.3047\\-83.65379\\-43\\114.2578\\-84.54382\\-43\\116.2109\\-85.78693\\-43\\118.1641\\-86.62828\\-43\\120.1172\\-87.79343\\-43\\122.0703\\-88.67987\\-43\\125.9766\\-91.465\\-43\\127.9297\\-92.7005\\-43\\129.8828\\-94.15395\\-43\\131.8359\\-95.72065\\-43\\134.94\\-98.69531\\-43\\138.5102\\-102.6016\\-43\\140.1054\\-104.5547\\-43\\141.6016\\-106.7883\\-43\\143.806\\-110.4141\\-43\\144.7873\\-112.3672\\-43\\146.1009\\-114.3203\\-43\\147.0744\\-116.2734\\-43\\148.2117\\-118.2266\\-43\\148.9223\\-120.1797\\-43\\149.9767\\-122.1328\\-43\\150.6037\\-124.0859\\-43\\151.6433\\-126.0391\\-43\\152.4442\\-127.9922\\-43\\153.3874\\-129.9453\\-43\\154.1969\\-131.8984\\-43\\154.7584\\-133.8516\\-43\\155.7098\\-135.8047\\-43\\156.561\\-139.7109\\-43\\157.3351\\-141.6641\\-43\\157.9307\\-143.6172\\-43\\158.3522\\-145.5703\\-43\\158.8787\\-147.5234\\-43\\159.6354\\-149.4766\\-43\\160.6633\\-155.3359\\-43\\161.5457\\-159.2422\\-43\\161.9792\\-163.1484\\-43\\162.127\\-165.1016\\-43\\162.6107\\-172.9141\\-43\\163.0014\\-176.8203\\-43\\163.4294\\-182.6797\\-43\\163.6047\\-188.5391\\-43\\163.6345\\-194.3984\\-43\\163.5264\\-200.2578\\-43\\163.3954\\-204.1641\\-43\\163.1557\\-208.0703\\-43\\162.9132\\-210.0234\\-43\\162.5562\\-213.9297\\-43\\162.1449\\-219.7891\\-43\\161.7076\\-223.6953\\-43\\161.2723\\-225.6484\\-43\\160.6912\\-227.6016\\-43\\159.7139\\-231.5078\\-43\\158.7978\\-233.4609\\-43\\157.4989\\-237.3672\\-43\\156.5016\\-239.3203\\-43\\155.9773\\-241.2734\\-43\\154.9624\\-243.2266\\-43\\154.1303\\-245.1797\\-43\\152.9123\\-247.1328\\-43\\151.8586\\-249.0859\\-43\\150.4833\\-251.0391\\-43\\148.0781\\-254.9453\\-43\\144.7178\\-258.8516\\-43\\143.5547\\-260.3484\\-43\\141.6016\\-262.6403\\-43\\139.6484\\-264.5857\\-43\\135.7422\\-268.6772\\-43\\131.8359\\-272.0214\\-43\\129.8828\\-273.837\\-43\\125.9766\\-277.0616\\-43\\124.1388\\-278.3828\\-43\\121.6175\\-280.3359\\-43\\118.1641\\-282.6869\\-43\\116.2109\\-283.6989\\-43\\115.5282\\-284.2422\\-43\\112.3047\\-286.3369\\-43\\110.3516\\-287.3226\\-43\\108.3984\\-288.5003\\-43\\106.4453\\-289.2288\\-43\\104.4922\\-290.2255\\-43\\98.63281\\-292.8478\\-43\\96.67969\\-293.4472\\-43\\94.72656\\-294.3035\\-43\\92.77344\\-294.8096\\-43\\88.86719\\-295.5444\\-43\\86.91406\\-296.1852\\-43\\84.96094\\-296.5862\\-43\\83.00781\\-296.8482\\-43\\79.10156\\-297.2205\\-43\\75.19531\\-297.6822\\-43\\73.24219\\-297.8598\\-43\\69.33594\\-297.9368\\-43\\59.57031\\-296.8492\\-43\\55.66406\\-295.3227\\-43\\53.71094\\-295.3801\\-43\\49.80469\\-294.5341\\-43\\47.85156\\-293.6604\\-43\\43.94531\\-292.2291\\-43\\41.99219\\-291.2603\\-43\\40.03906\\-290.6572\\-43\\38.08594\\-289.6003\\-43\\36.13281\\-289.0411\\-43\\34.17969\\-288.3225\\-43\\32.22656\\-287.3561\\-43\\30.27344\\-286.733\\-43\\28.32031\\-285.9758\\-43\\26.36719\\-285.5379\\-43\\22.46094\\-285.317\\-43\\18.55469\\-285.5555\\-43\\16.60156\\-285.5321\\-43\\14.64844\\-285.8281\\-43\\10.74219\\-286.218\\-43\\8.789063\\-286.4795\\-43\\4.882813\\-286.7311\\-43\\0.9765625\\-286.8919\\-43\\-2.929688\\-286.9622\\-43\\-6.835938\\-286.9831\\-43\\-16.60156\\-286.8396\\-43\\-24.41406\\-286.6698\\-43\\-26.36719\\-286.7131\\-43\\-28.32031\\-286.9609\\-43\\-30.27344\\-287.3387\\-43\\-32.22656\\-287.8875\\-43\\-34.17969\\-288.6509\\-43\\-36.13281\\-288.9449\\-43\\-38.08594\\-289.7912\\-43\\-40.03906\\-290.8692\\-43\\-41.99219\\-291.5398\\-43\\-43.94531\\-292.67\\-43\\-45.89844\\-293.3587\\-43\\-47.85156\\-294.1834\\-43\\-49.80469\\-294.5616\\-43\\-53.71094\\-296.1048\\-43\\-55.66406\\-296.6849\\-43\\-59.57031\\-297.4197\\-43\\-61.52344\\-298.0495\\-43\\-63.47656\\-298.4792\\-43\\-67.38281\\-298.9102\\-43\\-69.33594\\-299.0323\\-43\\-73.24219\\-299.1401\\-43\\-77.14844\\-299.0323\\-43\\-81.05469\\-298.7752\\-43\\-83.00781\\-298.5634\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "313" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "105" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-298.3579\\-41\\-86.91406\\-297.3037\\-41\\-90.82031\\-296.5743\\-41\\-92.77344\\-295.802\\-41\\-94.72656\\-295.1736\\-41\\-96.67969\\-294.6692\\-41\\-98.63281\\-293.6755\\-41\\-100.5859\\-292.8224\\-41\\-102.5391\\-291.6214\\-41\\-104.4922\\-290.731\\-41\\-106.4453\\-289.4155\\-41\\-108.3984\\-288.6902\\-41\\-110.3516\\-287.3635\\-41\\-112.3047\\-286.2033\\-41\\-115.3164\\-284.2422\\-41\\-116.2109\\-283.5326\\-41\\-118.1641\\-282.3617\\-41\\-120.1172\\-281.0838\\-41\\-122.0703\\-279.4854\\-41\\-124.0234\\-277.7699\\-41\\-125.9766\\-276.2344\\-41\\-127.9297\\-274.8539\\-41\\-129.8828\\-273.0448\\-41\\-131.8359\\-271.0825\\-41\\-134.4712\\-268.6172\\-41\\-136.2893\\-266.6641\\-41\\-139.6484\\-262.715\\-41\\-141.6016\\-260.3077\\-41\\-144.1002\\-256.8984\\-41\\-148.1182\\-251.0391\\-41\\-149.0451\\-249.0859\\-41\\-150.1988\\-247.1328\\-41\\-151.0728\\-245.1797\\-41\\-152.2615\\-243.2266\\-41\\-154.2127\\-239.3203\\-41\\-154.955\\-237.3672\\-41\\-155.8878\\-235.4141\\-41\\-156.3656\\-233.4609\\-41\\-157.9654\\-229.5547\\-41\\-158.5195\\-227.6016\\-41\\-159.3914\\-225.6484\\-41\\-159.9866\\-223.6953\\-41\\-160.4532\\-221.7422\\-41\\-161.7025\\-217.8359\\-41\\-162.0447\\-215.8828\\-41\\-162.5621\\-211.9766\\-41\\-163.568\\-208.0703\\-41\\-163.8384\\-206.1172\\-41\\-164.2296\\-202.2109\\-41\\-164.7454\\-198.3047\\-41\\-165.1198\\-196.3516\\-41\\-165.5723\\-192.4453\\-41\\-165.8053\\-186.5859\\-41\\-165.8627\\-180.7266\\-41\\-165.7752\\-176.8203\\-41\\-165.6119\\-172.9141\\-41\\-165.3209\\-169.0078\\-41\\-164.3936\\-163.1484\\-41\\-163.7042\\-157.2891\\-41\\-163.2561\\-155.3359\\-41\\-162.6587\\-153.3828\\-41\\-162.0147\\-149.4766\\-41\\-161.5275\\-147.5234\\-41\\-160.7357\\-145.5703\\-41\\-159.4746\\-141.6641\\-41\\-158.4586\\-139.7109\\-41\\-157.8114\\-137.7578\\-41\\-156.7722\\-135.8047\\-41\\-156.1202\\-133.8516\\-41\\-154.3981\\-129.9453\\-41\\-153.6797\\-127.9922\\-41\\-152.4752\\-126.0391\\-41\\-150.3489\\-122.1328\\-41\\-148.4563\\-118.2266\\-41\\-146.3117\\-114.3203\\-41\\-145.0162\\-112.3672\\-41\\-143.9807\\-110.4141\\-41\\-142.6595\\-108.4609\\-41\\-141.6016\\-106.7052\\-41\\-140.1738\\-104.5547\\-41\\-137.6953\\-101.4688\\-41\\-135.2611\\-98.69531\\-41\\-133.7891\\-96.90785\\-41\\-131.8359\\-95.17217\\-41\\-129.0899\\-92.83594\\-41\\-125.9766\\-90.5331\\-41\\-122.0703\\-88.13664\\-41\\-120.1172\\-87.27411\\-41\\-118.1641\\-86.24934\\-41\\-116.2109\\-85.08558\\-41\\-114.2578\\-84.22856\\-41\\-112.3047\\-83.74938\\-41\\-110.3516\\-82.88314\\-41\\-108.3984\\-82.12032\\-41\\-106.4453\\-81.616\\-41\\-104.4922\\-80.595\\-41\\-102.5391\\-80.31123\\-41\\-100.5859\\-79.70413\\-41\\-98.63281\\-79.39063\\-41\\-94.72656\\-78.40382\\-41\\-90.82031\\-77.72871\\-41\\-88.86719\\-77.17338\\-41\\-84.96094\\-76.50245\\-41\\-81.05469\\-76.16335\\-41\\-79.10156\\-76.11455\\-41\\-75.19531\\-75.8736\\-41\\-71.28906\\-75.82047\\-41\\-65.42969\\-75.63874\\-41\\-63.47656\\-75.62231\\-41\\-61.52344\\-75.7263\\-41\\-51.75781\\-76.01869\\-41\\-47.85156\\-76.18079\\-41\\-43.94531\\-76.41863\\-41\\-40.03906\\-76.84052\\-41\\-38.08594\\-77.14384\\-41\\-32.22656\\-78.19866\\-41\\-30.27344\\-78.64362\\-41\\-26.36719\\-79.98292\\-41\\-24.41406\\-80.49399\\-41\\-20.50781\\-82.13155\\-41\\-18.6181\\-83.07031\\-41\\-16.60156\\-84.22388\\-41\\-12.69531\\-87.12093\\-41\\-10.74219\\-88.49818\\-41\\-8.789063\\-90.22062\\-41\\-6.835938\\-92.1123\\-41\\-2.929688\\-95.6427\\-41\\-0.9765625\\-97.19009\\-41\\0.9765625\\-97.30981\\-41\\2.929688\\-95.81877\\-41\\4.076408\\-94.78906\\-41\\6.835938\\-92.1404\\-41\\8.789063\\-90.04867\\-41\\10.74219\\-88.09164\\-41\\14.64844\\-84.51057\\-41\\16.71832\\-83.07031\\-41\\20.50781\\-80.75098\\-41\\22.46094\\-79.94661\\-41\\24.41406\\-78.91457\\-41\\26.36719\\-78.09818\\-41\\28.32031\\-77.41917\\-41\\30.27344\\-76.59654\\-41\\34.17969\\-75.84756\\-41\\36.13281\\-75.13153\\-41\\38.08594\\-74.64574\\-41\\41.99219\\-74.3355\\-41\\43.94531\\-74.06573\\-41\\45.89844\\-72.98988\\-41\\51.75781\\-72.77455\\-41\\61.52344\\-72.78273\\-41\\67.38281\\-72.91775\\-41\\68.84766\\-73.30469\\-41\\71.28906\\-74.25184\\-41\\77.14844\\-74.55653\\-41\\81.05469\\-74.94254\\-41\\83.00781\\-75.41803\\-41\\84.96094\\-75.77822\\-41\\90.82031\\-76.45139\\-41\\92.77344\\-76.92897\\-41\\94.72656\\-77.51825\\-41\\98.63281\\-78.47373\\-41\\100.5859\\-79.09748\\-41\\102.5391\\-79.86503\\-41\\104.4922\\-80.34686\\-41\\106.4453\\-81.04514\\-41\\108.3984\\-81.89969\\-41\\110.3516\\-82.49235\\-41\\112.3047\\-83.56486\\-41\\114.2578\\-84.39774\\-41\\116.2109\\-85.66822\\-41\\118.1641\\-86.51504\\-41\\120.1172\\-87.72729\\-41\\122.0703\\-88.52886\\-41\\125.9766\\-91.37109\\-41\\127.9297\\-92.62424\\-41\\131.8359\\-95.59608\\-41\\134.9432\\-98.69531\\-41\\137.6953\\-101.7679\\-41\\139.9421\\-104.5547\\-41\\142.4689\\-108.4609\\-41\\144.5877\\-112.3672\\-41\\145.8443\\-114.3203\\-41\\146.8039\\-116.2734\\-41\\147.9848\\-118.2266\\-41\\148.6848\\-120.1797\\-41\\149.6857\\-122.1328\\-41\\150.3849\\-124.0859\\-41\\151.2199\\-126.0391\\-41\\152.2003\\-127.9922\\-41\\152.9499\\-129.9453\\-41\\153.961\\-131.8984\\-41\\154.5274\\-133.8516\\-41\\155.4243\\-135.8047\\-41\\156.0106\\-137.7578\\-41\\156.35\\-139.7109\\-41\\156.8483\\-141.6641\\-41\\157.6732\\-143.6172\\-41\\158.5342\\-147.5234\\-41\\159.2319\\-149.4766\\-41\\159.759\\-151.4297\\-41\\160.3812\\-155.3359\\-41\\160.7461\\-157.2891\\-41\\161.2154\\-159.2422\\-41\\161.5588\\-161.1953\\-41\\161.9858\\-165.1016\\-41\\162.4165\\-172.9141\\-41\\162.9282\\-180.7266\\-41\\163.2136\\-184.6328\\-41\\163.3336\\-188.5391\\-41\\163.3719\\-192.4453\\-41\\163.3459\\-196.3516\\-41\\163.2425\\-200.2578\\-41\\163.0466\\-204.1641\\-41\\162.495\\-211.9766\\-41\\162.2771\\-215.8828\\-41\\161.9962\\-219.7891\\-41\\161.794\\-221.7422\\-41\\161.4873\\-223.6953\\-41\\160.4141\\-227.6016\\-41\\159.9866\\-229.5547\\-41\\159.4035\\-231.5078\\-41\\158.4982\\-233.4609\\-41\\157.9564\\-235.4141\\-41\\157.0948\\-237.3672\\-41\\156.35\\-239.3203\\-41\\155.7685\\-241.2734\\-41\\154.6671\\-243.2266\\-41\\153.8844\\-245.1797\\-41\\152.5967\\-247.1328\\-41\\151.4902\\-249.0859\\-41\\150.2646\\-251.0391\\-41\\148.8627\\-252.9922\\-41\\147.7389\\-254.9453\\-41\\145.5078\\-257.5141\\-41\\143.5547\\-259.8571\\-41\\141.0404\\-262.7578\\-41\\139.6484\\-264.0442\\-41\\135.2379\\-268.6172\\-41\\131.8359\\-271.5352\\-41\\129.8828\\-273.4607\\-41\\127.9297\\-275.1479\\-41\\125.9766\\-276.6219\\-41\\124.0234\\-277.9294\\-41\\120.1172\\-281.0512\\-41\\118.1641\\-282.1263\\-41\\116.2109\\-283.3345\\-41\\114.2578\\-284.6687\\-41\\112.3047\\-285.7263\\-41\\110.3516\\-286.9754\\-41\\106.4453\\-288.9458\\-41\\104.4922\\-289.6336\\-41\\102.5391\\-290.7433\\-41\\100.5859\\-291.3906\\-41\\98.63281\\-292.4415\\-41\\94.72656\\-293.7415\\-41\\92.77344\\-294.4929\\-41\\90.82031\\-294.9245\\-41\\86.91406\\-295.6566\\-41\\84.96094\\-296.2122\\-41\\83.00781\\-296.61\\-41\\81.05469\\-296.8445\\-41\\77.14844\\-297.1641\\-41\\73.24219\\-297.4258\\-41\\71.28906\\-297.4793\\-41\\67.38281\\-297.3928\\-41\\63.47656\\-297.0778\\-41\\59.57031\\-296.6849\\-41\\57.61719\\-295.952\\-41\\55.66406\\-295.4554\\-41\\53.71094\\-295.2468\\-41\\51.75781\\-294.9015\\-41\\49.80469\\-294.4103\\-41\\47.85156\\-293.5349\\-41\\45.89844\\-292.9244\\-41\\43.94531\\-292.2033\\-41\\41.99219\\-291.2867\\-41\\40.03906\\-290.7544\\-41\\38.08594\\-289.769\\-41\\36.13281\\-289.1667\\-41\\34.17969\\-288.6635\\-41\\32.22656\\-287.7849\\-41\\30.27344\\-287.1837\\-41\\26.36719\\-286.5341\\-41\\24.41406\\-286.4163\\-41\\22.46094\\-286.4553\\-41\\10.74219\\-287.1719\\-41\\8.789063\\-287.3378\\-41\\4.882813\\-287.5501\\-41\\-0.9765625\\-287.8051\\-41\\-6.835938\\-287.9547\\-41\\-10.74219\\-287.8835\\-41\\-26.36719\\-287.4775\\-41\\-28.32031\\-287.597\\-41\\-30.27344\\-287.9424\\-41\\-32.22656\\-288.1393\\-41\\-34.17969\\-288.6288\\-41\\-36.13281\\-289.3191\\-41\\-40.03906\\-290.9438\\-41\\-41.99219\\-291.5969\\-41\\-43.94531\\-292.6587\\-41\\-45.89844\\-293.3168\\-41\\-47.85156\\-294.2003\\-41\\-49.80469\\-294.6218\\-41\\-53.71094\\-295.802\\-41\\-55.66406\\-296.5408\\-41\\-59.57031\\-297.2388\\-41\\-61.52344\\-297.6947\\-41\\-63.47656\\-298.2606\\-41\\-65.42969\\-298.553\\-41\\-69.33594\\-298.8564\\-41\\-73.24219\\-298.9554\\-41\\-77.14844\\-298.8665\\-41\\-81.05469\\-298.6037\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "321" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "106" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-298.0757\\-39\\-84.96094\\-297.5066\\-39\\-88.86719\\-296.8108\\-39\\-90.82031\\-296.3448\\-39\\-92.77344\\-295.5232\\-39\\-96.67969\\-294.4529\\-39\\-98.63281\\-293.3745\\-39\\-100.5859\\-292.5744\\-39\\-102.5391\\-291.3265\\-39\\-104.4922\\-290.4404\\-39\\-106.4453\\-289.2395\\-39\\-108.3984\\-288.3944\\-39\\-112.3047\\-285.8274\\-39\\-114.2578\\-284.7097\\-39\\-118.1641\\-282.0111\\-39\\-120.1172\\-280.8598\\-39\\-122.0703\\-279.2734\\-39\\-124.0234\\-277.554\\-39\\-125.9766\\-275.9484\\-39\\-127.9297\\-274.5966\\-39\\-129.8828\\-272.7991\\-39\\-131.8359\\-270.8633\\-39\\-134.2995\\-268.6172\\-39\\-136.1047\\-266.6641\\-39\\-137.6701\\-264.7109\\-39\\-141.0407\\-260.8047\\-39\\-142.5529\\-258.8516\\-39\\-143.9495\\-256.8984\\-39\\-145.1823\\-254.9453\\-39\\-145.5078\\-254.5851\\-39\\-147.9883\\-251.0391\\-39\\-148.912\\-249.0859\\-39\\-150.1038\\-247.1328\\-39\\-150.9088\\-245.1797\\-39\\-152.1317\\-243.2266\\-39\\-154.0868\\-239.3203\\-39\\-154.7885\\-237.3672\\-39\\-155.7651\\-235.4141\\-39\\-156.8964\\-231.5078\\-39\\-157.8103\\-229.5547\\-39\\-158.3448\\-227.6016\\-39\\-159.8217\\-223.6953\\-39\\-160.2665\\-221.7422\\-39\\-160.8095\\-219.7891\\-39\\-161.4763\\-217.8359\\-39\\-161.8743\\-215.8828\\-39\\-162.384\\-211.9766\\-39\\-162.7077\\-210.0234\\-39\\-163.2146\\-208.0703\\-39\\-163.6169\\-206.1172\\-39\\-163.8597\\-204.1641\\-39\\-164.4323\\-198.3047\\-39\\-165.2261\\-192.4453\\-39\\-165.3959\\-190.4922\\-39\\-165.5804\\-186.5859\\-39\\-165.6567\\-182.6797\\-39\\-165.564\\-176.8203\\-39\\-165.332\\-172.9141\\-39\\-165.1476\\-170.9609\\-39\\-164.6071\\-167.0547\\-39\\-163.7684\\-159.2422\\-39\\-163.4069\\-157.2891\\-39\\-162.8183\\-155.3359\\-39\\-162.4122\\-153.3828\\-39\\-161.7776\\-149.4766\\-39\\-161.1866\\-147.5234\\-39\\-160.4221\\-145.5703\\-39\\-159.8687\\-143.6172\\-39\\-158.9715\\-141.6641\\-39\\-157.4892\\-137.7578\\-39\\-156.4851\\-135.8047\\-39\\-155.9092\\-133.8516\\-39\\-154.9099\\-131.8984\\-39\\-154.2076\\-129.9453\\-39\\-153.3203\\-127.9818\\-39\\-151.3672\\-124.5742\\-39\\-151.0272\\-124.0859\\-39\\-150.148\\-122.1328\\-39\\-149.091\\-120.1797\\-39\\-148.2737\\-118.2266\\-39\\-147.0414\\-116.2734\\-39\\-146.1014\\-114.3203\\-39\\-144.7132\\-112.3672\\-39\\-143.7396\\-110.4141\\-39\\-141.6016\\-107.0701\\-39\\-139.9065\\-104.5547\\-39\\-137.6953\\-101.6875\\-39\\-133.5112\\-96.74219\\-39\\-129.0376\\-92.83594\\-39\\-127.9297\\-91.95113\\-39\\-125.9766\\-90.56627\\-39\\-122.0703\\-88.14975\\-39\\-120.1172\\-87.24783\\-39\\-115.9882\\-85.02344\\-39\\-112.3047\\-83.72356\\-39\\-108.3984\\-82.08064\\-39\\-106.4453\\-81.62279\\-39\\-104.4922\\-80.61866\\-39\\-102.5391\\-80.29757\\-39\\-100.5859\\-79.59034\\-39\\-98.63281\\-79.27074\\-39\\-94.72656\\-78.32067\\-39\\-92.77344\\-78.04043\\-39\\-90.82031\\-77.63524\\-39\\-88.86719\\-77.03655\\-39\\-86.91406\\-76.59806\\-39\\-84.96094\\-76.3961\\-39\\-81.05469\\-76.1226\\-39\\-77.14844\\-75.92337\\-39\\-75.19531\\-75.74937\\-39\\-73.24219\\-75.69862\\-39\\-69.33594\\-75.43329\\-39\\-67.38281\\-75.40508\\-39\\-65.42969\\-75.21498\\-39\\-63.47656\\-75.23212\\-39\\-61.52344\\-75.43193\\-39\\-55.66406\\-75.73949\\-39\\-53.71094\\-75.77908\\-39\\-49.80469\\-75.99928\\-39\\-45.89844\\-76.12124\\-39\\-43.94531\\-76.23438\\-39\\-40.03906\\-76.57026\\-39\\-36.13281\\-77.08796\\-39\\-34.17969\\-77.56303\\-39\\-30.27344\\-78.36855\\-39\\-28.32031\\-78.90498\\-39\\-26.36719\\-79.68888\\-39\\-22.46094\\-80.86929\\-39\\-20.50781\\-81.86281\\-39\\-18.55469\\-82.65279\\-39\\-14.79492\\-85.02344\\-39\\-12.69531\\-86.51323\\-39\\-10.74219\\-88.06394\\-39\\-8.789063\\-89.80789\\-39\\-6.835938\\-91.75475\\-39\\-4.882813\\-93.43519\\-39\\-2.929688\\-95.00879\\-39\\-0.9765625\\-96.32366\\-39\\0.9765625\\-96.65955\\-39\\2.929688\\-95.53152\\-39\\4.882813\\-93.8323\\-39\\6.248191\\-92.83594\\-39\\6.835938\\-92.2427\\-39\\7.780793\\-90.88281\\-39\\10.74219\\-87.87231\\-39\\14.64844\\-84.22443\\-39\\16.60156\\-82.73529\\-39\\18.55469\\-81.67819\\-39\\20.50781\\-80.51573\\-39\\22.46094\\-79.67986\\-39\\24.41406\\-78.657\\-39\\28.32031\\-77.08887\\-39\\30.27344\\-76.39407\\-39\\34.17969\\-75.59041\\-39\\36.13281\\-74.82963\\-39\\38.08594\\-74.52701\\-39\\41.99219\\-74.24616\\-39\\44.30213\\-73.30469\\-39\\45.89844\\-72.81641\\-39\\51.75781\\-72.73502\\-39\\61.52344\\-72.74275\\-39\\67.38281\\-72.84272\\-39\\69.33594\\-73.03416\\-39\\71.28906\\-74.03377\\-39\\73.24219\\-74.26955\\-39\\79.10156\\-74.59138\\-39\\81.05469\\-74.79868\\-39\\83.00781\\-75.13261\\-39\\84.96094\\-75.65793\\-39\\88.86719\\-76.17659\\-39\\90.82031\\-76.3695\\-39\\92.77344\\-76.75255\\-39\\94.72656\\-77.35045\\-39\\98.63281\\-78.35026\\-39\\100.5859\\-78.97706\\-39\\102.5391\\-79.78832\\-39\\106.4453\\-80.91279\\-39\\108.3984\\-81.86213\\-39\\110.3516\\-82.43456\\-39\\112.3047\\-83.48792\\-39\\114.2578\\-84.33926\\-39\\116.2109\\-85.57682\\-39\\118.1641\\-86.44568\\-39\\120.1172\\-87.61261\\-39\\122.0703\\-88.4131\\-39\\122.6957\\-88.92969\\-39\\125.9766\\-91.28017\\-39\\127.9297\\-92.57685\\-39\\131.8359\\-95.46624\\-39\\133.191\\-96.74219\\-39\\134.9958\\-98.69531\\-39\\137.6953\\-101.9312\\-39\\139.6719\\-104.5547\\-39\\142.3029\\-108.4609\\-39\\143.2028\\-110.4141\\-39\\143.5547\\-110.8974\\-39\\145.5155\\-114.3203\\-39\\147.6835\\-118.2266\\-39\\149.3109\\-122.1328\\-39\\150.2131\\-124.0859\\-39\\150.8557\\-126.0391\\-39\\151.9294\\-127.9922\\-39\\152.6593\\-129.9453\\-39\\153.6549\\-131.8984\\-39\\154.9746\\-135.8047\\-39\\155.7856\\-137.7578\\-39\\156.5376\\-141.6641\\-39\\157.897\\-145.5703\\-39\\158.7656\\-149.4766\\-39\\159.4388\\-151.4297\\-39\\159.878\\-153.3828\\-39\\160.4572\\-157.2891\\-39\\161.2576\\-161.1953\\-39\\161.592\\-163.1484\\-39\\161.9555\\-167.0547\\-39\\162.1868\\-170.9609\\-39\\162.8327\\-184.6328\\-39\\162.9572\\-188.5391\\-39\\163.0007\\-192.4453\\-39\\162.9715\\-196.3516\\-39\\162.873\\-200.2578\\-39\\162.6206\\-206.1172\\-39\\162.2514\\-213.9297\\-39\\161.9843\\-217.8359\\-39\\161.5588\\-221.7422\\-39\\160.5963\\-225.6484\\-39\\159.77\\-229.5547\\-39\\158.965\\-231.5078\\-39\\158.2585\\-233.4609\\-39\\157.7002\\-235.4141\\-39\\156.7317\\-237.3672\\-39\\156.1726\\-239.3203\\-39\\155.4627\\-241.2734\\-39\\154.4355\\-243.2266\\-39\\153.5301\\-245.1797\\-39\\151.3672\\-248.6469\\-39\\151.0127\\-249.0859\\-39\\149.9865\\-251.0391\\-39\\147.4609\\-254.6597\\-39\\145.6889\\-256.8984\\-39\\142.4187\\-260.8047\\-39\\140.6181\\-262.7578\\-39\\139.6484\\-263.6293\\-39\\134.7656\\-268.6172\\-39\\131.8359\\-271.2022\\-39\\129.8828\\-273.062\\-39\\127.9297\\-274.7323\\-39\\125.9766\\-276.0204\\-39\\124.0234\\-277.5155\\-39\\122.0703\\-279.1403\\-39\\120.1172\\-280.5978\\-39\\118.1641\\-281.7072\\-39\\116.2109\\-282.9848\\-39\\114.2578\\-284.0484\\-39\\110.8221\\-286.1953\\-39\\110.3516\\-286.5573\\-39\\108.3984\\-287.4655\\-39\\106.4453\\-288.5848\\-39\\104.4922\\-289.2724\\-39\\102.5391\\-290.2523\\-39\\98.63281\\-291.7786\\-39\\96.67969\\-292.7372\\-39\\94.72656\\-293.292\\-39\\90.82031\\-294.6609\\-39\\86.91406\\-295.3246\\-39\\84.96094\\-295.7059\\-39\\83.00781\\-296.2609\\-39\\81.05469\\-296.5904\\-39\\77.14844\\-296.9427\\-39\\73.24219\\-297.1533\\-39\\71.28906\\-297.1953\\-39\\67.38281\\-297.1403\\-39\\61.52344\\-296.7368\\-39\\59.57031\\-296.4713\\-39\\55.66406\\-295.4242\\-39\\51.75781\\-294.795\\-39\\49.80469\\-294.2779\\-39\\47.85156\\-293.4337\\-39\\45.89844\\-292.8779\\-39\\43.94531\\-292.1901\\-39\\41.99219\\-291.3354\\-39\\40.03906\\-290.8263\\-39\\36.13281\\-289.2907\\-39\\34.17969\\-288.9184\\-39\\32.22656\\-288.3795\\-39\\30.27344\\-287.7046\\-39\\28.32031\\-287.3387\\-39\\26.36719\\-287.1597\\-39\\24.41406\\-287.1476\\-39\\18.55469\\-287.3947\\-39\\14.64844\\-287.6885\\-39\\10.74219\\-288.0426\\-39\\8.789063\\-288.2845\\-39\\4.882813\\-288.5865\\-39\\0.9765625\\-288.6716\\-39\\-0.9765625\\-288.7883\\-39\\-4.882813\\-288.8677\\-39\\-8.789063\\-288.8677\\-39\\-14.64844\\-288.8061\\-39\\-22.46094\\-288.6613\\-39\\-26.36719\\-288.5435\\-39\\-28.32031\\-288.5752\\-39\\-32.22656\\-288.8556\\-39\\-34.17969\\-289.1317\\-39\\-36.13281\\-289.6713\\-39\\-38.08594\\-290.4227\\-39\\-41.99219\\-291.6966\\-39\\-43.94531\\-292.6781\\-39\\-45.89844\\-293.2656\\-39\\-47.85156\\-294.1463\\-39\\-49.80469\\-294.7402\\-39\\-53.71094\\-295.6052\\-39\\-55.66406\\-296.3556\\-39\\-57.61719\\-296.7881\\-39\\-61.52344\\-297.4289\\-39\\-65.42969\\-298.3579\\-39\\-67.38281\\-298.5599\\-39\\-71.28906\\-298.7838\\-39\\-75.19531\\-298.7721\\-39\\-79.10156\\-298.5905\\-39\\-81.05469\\-298.4109\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "327" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "107" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-298.1011\\-37\\-84.96094\\-297.2611\\-37\\-88.86719\\-296.6445\\-37\\-92.77344\\-295.3205\\-37\\-94.72656\\-294.8712\\-37\\-96.67969\\-294.1365\\-37\\-98.63281\\-293.1392\\-37\\-100.5859\\-292.2417\\-37\\-102.5391\\-291.0941\\-37\\-106.4453\\-289.0886\\-37\\-110.3516\\-286.9414\\-37\\-112.3047\\-285.5384\\-37\\-114.2578\\-284.4038\\-37\\-118.1641\\-281.7595\\-37\\-120.1172\\-280.5783\\-37\\-122.0703\\-279.0401\\-37\\-125.9766\\-275.7461\\-37\\-127.6618\\-274.4766\\-37\\-129.8239\\-272.5234\\-37\\-131.8449\\-270.5703\\-37\\-133.7891\\-268.9017\\-37\\-135.8794\\-266.6641\\-37\\-137.3849\\-264.7109\\-37\\-139.072\\-262.7578\\-37\\-140.8803\\-260.8047\\-37\\-142.4647\\-258.8516\\-37\\-145.0027\\-254.9453\\-37\\-145.5078\\-254.3731\\-37\\-147.8419\\-251.0391\\-37\\-148.7872\\-249.0859\\-37\\-149.9859\\-247.1328\\-37\\-150.76\\-245.1797\\-37\\-152.0048\\-243.2266\\-37\\-152.8799\\-241.2734\\-37\\-153.9502\\-239.3203\\-37\\-154.6161\\-237.3672\\-37\\-155.6085\\-235.4141\\-37\\-156.2032\\-233.4609\\-37\\-156.6749\\-231.5078\\-37\\-157.6233\\-229.5547\\-37\\-158.7629\\-225.6484\\-37\\-159.6263\\-223.6953\\-37\\-160.5457\\-219.7891\\-37\\-161.1862\\-217.8359\\-37\\-161.6989\\-215.8828\\-37\\-162.0094\\-213.9297\\-37\\-162.4577\\-210.0234\\-37\\-162.8079\\-208.0703\\-37\\-163.3212\\-206.1172\\-37\\-163.6516\\-204.1641\\-37\\-163.8787\\-202.2109\\-37\\-164.2087\\-198.3047\\-37\\-164.9699\\-190.4922\\-37\\-165.2982\\-186.5859\\-37\\-165.3752\\-182.6797\\-37\\-165.3209\\-178.7734\\-37\\-165.2385\\-176.8203\\-37\\-164.7289\\-170.9609\\-37\\-164.3175\\-167.0547\\-37\\-163.8143\\-161.1953\\-37\\-163.5164\\-159.2422\\-37\\-162.9697\\-157.2891\\-37\\-162.5216\\-155.3359\\-37\\-161.9416\\-151.4297\\-37\\-161.5167\\-149.4766\\-37\\-160.7759\\-147.5234\\-37\\-159.5938\\-143.6172\\-37\\-158.5891\\-141.6641\\-37\\-157.9765\\-139.7109\\-37\\-157.0087\\-137.7578\\-37\\-155.6512\\-133.8516\\-37\\-154.6374\\-131.8984\\-37\\-153.9898\\-129.9453\\-37\\-152.9339\\-127.9922\\-37\\-151.9783\\-126.0391\\-37\\-150.7399\\-124.0859\\-37\\-149.9485\\-122.1328\\-37\\-148.857\\-120.1797\\-37\\-148.0562\\-118.2266\\-37\\-146.7829\\-116.2734\\-37\\-145.8244\\-114.3203\\-37\\-144.5018\\-112.3672\\-37\\-142.3112\\-108.4609\\-37\\-139.6484\\-104.6192\\-37\\-137.6953\\-101.9312\\-37\\-133.7891\\-97.16787\\-37\\-131.8359\\-95.3648\\-37\\-128.9469\\-92.83594\\-37\\-125.9766\\-90.60085\\-37\\-122.0703\\-88.15768\\-37\\-120.1172\\-87.20681\\-37\\-115.9494\\-85.02344\\-37\\-114.2578\\-84.48522\\-37\\-112.3047\\-83.70606\\-37\\-110.3516\\-82.77892\\-37\\-108.3984\\-82.04132\\-37\\-106.4453\\-81.6264\\-37\\-104.4922\\-80.65314\\-37\\-102.5391\\-80.29086\\-37\\-100.5859\\-79.57484\\-37\\-98.63281\\-79.20652\\-37\\-94.72656\\-78.18099\\-37\\-92.77344\\-77.90417\\-37\\-90.82031\\-77.52483\\-37\\-86.91406\\-76.48186\\-37\\-84.96094\\-76.30151\\-37\\-77.14844\\-75.82961\\-37\\-75.19531\\-75.63605\\-37\\-73.24219\\-75.29816\\-37\\-69.33594\\-75.02757\\-37\\-65.42969\\-74.96875\\-37\\-61.52344\\-75\\-37\\-53.71094\\-75.39063\\-37\\-51.75781\\-75.72252\\-37\\-49.80469\\-75.84\\-37\\-45.89844\\-75.96749\\-37\\-41.99219\\-76.21098\\-37\\-38.08594\\-76.53345\\-37\\-36.13281\\-76.76172\\-37\\-34.17969\\-77.17338\\-37\\-28.32031\\-78.56264\\-37\\-26.36719\\-79.32554\\-37\\-22.46094\\-80.56009\\-37\\-20.50781\\-81.54398\\-37\\-18.55469\\-82.31862\\-37\\-16.60156\\-83.52786\\-37\\-14.64844\\-84.62007\\-37\\-12.69531\\-86.12885\\-37\\-9.343552\\-88.92969\\-37\\-4.882813\\-92.84489\\-37\\-0.9765625\\-95.76563\\-37\\0.9765625\\-96.11845\\-37\\2.929688\\-95.11701\\-37\\4.882813\\-93.92446\\-37\\6.240234\\-94.78906\\-37\\6.835938\\-95.36185\\-37\\7.768111\\-96.74219\\-37\\8.209229\\-98.69531\\-37\\8.310355\\-102.6016\\-37\\9.350586\\-104.5547\\-37\\10.74219\\-105.6754\\-37\\12.69531\\-105.6487\\-37\\14.64844\\-104.3634\\-37\\15.61945\\-102.6016\\-37\\15.55287\\-100.6484\\-37\\14.67226\\-98.69531\\-37\\12.41757\\-96.74219\\-37\\8.789063\\-93.44176\\-37\\7.960839\\-92.83594\\-37\\7.618481\\-90.88281\\-37\\9.413775\\-88.92969\\-37\\11.51316\\-86.97656\\-37\\14.64844\\-83.95387\\-37\\16.60156\\-82.41263\\-37\\18.55469\\-81.45972\\-37\\20.50781\\-80.28104\\-37\\22.46094\\-79.45042\\-37\\24.41406\\-78.46974\\-37\\26.36719\\-77.67942\\-37\\28.32031\\-76.79143\\-37\\30.27344\\-76.25224\\-37\\32.22656\\-75.87756\\-37\\34.17969\\-75.2146\\-37\\36.13281\\-74.68874\\-37\\38.08594\\-74.43053\\-37\\40.03906\\-74.29309\\-37\\42.06731\\-73.30469\\-37\\43.94531\\-72.86079\\-37\\45.89844\\-72.77455\\-37\\53.71094\\-72.67616\\-37\\61.52344\\-72.69763\\-37\\65.42969\\-72.74275\\-37\\69.33594\\-72.87\\-37\\71.28906\\-73.16925\\-37\\73.24219\\-74.10484\\-37\\75.19531\\-74.3172\\-37\\79.10156\\-74.49052\\-37\\83.00781\\-74.91179\\-37\\84.96094\\-75.48891\\-37\\86.91406\\-75.84872\\-37\\90.82031\\-76.29832\\-37\\92.77344\\-76.60547\\-37\\96.67969\\-77.75415\\-37\\98.63281\\-78.20494\\-37\\100.5859\\-78.87109\\-37\\102.5391\\-79.73213\\-37\\106.4453\\-80.84551\\-37\\108.3984\\-81.81205\\-37\\110.3516\\-82.38357\\-37\\112.3047\\-83.43323\\-37\\114.2578\\-84.29388\\-37\\116.2109\\-85.52811\\-37\\118.1641\\-86.39573\\-37\\120.1172\\-87.54124\\-37\\122.0703\\-88.37263\\-37\\125.9766\\-91.24476\\-37\\127.9297\\-92.47912\\-37\\131.8359\\-95.45225\\-37\\133.2645\\-96.74219\\-37\\135.026\\-98.69531\\-37\\138.0208\\-102.6016\\-37\\142.1336\\-108.4609\\-37\\142.9228\\-110.4141\\-37\\144.2119\\-112.3672\\-37\\145.1381\\-114.3203\\-37\\146.3487\\-116.2734\\-37\\148.2706\\-120.1797\\-37\\148.9996\\-122.1328\\-37\\150.0038\\-124.0859\\-37\\150.5896\\-126.0391\\-37\\151.6164\\-127.9922\\-37\\154.091\\-133.8516\\-37\\154.6287\\-135.8047\\-37\\155.4794\\-137.7578\\-37\\156.0059\\-139.7109\\-37\\156.7948\\-143.6172\\-37\\157.606\\-145.5703\\-37\\158.4565\\-149.4766\\-37\\158.9774\\-151.4297\\-37\\159.6354\\-153.3828\\-37\\160.5305\\-159.2422\\-37\\161.2992\\-163.1484\\-37\\161.7859\\-167.0547\\-37\\162.0564\\-170.9609\\-37\\162.4005\\-178.7734\\-37\\162.6541\\-188.5391\\-37\\162.6886\\-192.4453\\-37\\162.6438\\-198.3047\\-37\\162.4329\\-206.1172\\-37\\162.2172\\-211.9766\\-37\\161.9792\\-215.8828\\-37\\161.6018\\-219.7891\\-37\\161.2297\\-221.7422\\-37\\160.7357\\-223.6953\\-37\\159.97\\-227.6016\\-37\\159.4945\\-229.5547\\-37\\158.6042\\-231.5078\\-37\\158.0445\\-233.4609\\-37\\157.3752\\-235.4141\\-37\\156.5048\\-237.3672\\-37\\155.9854\\-239.3203\\-37\\154.2022\\-243.2266\\-37\\152.0091\\-247.1328\\-37\\150.6797\\-249.0859\\-37\\149.6353\\-251.0391\\-37\\148.3629\\-252.9922\\-37\\145.1698\\-256.8984\\-37\\142.1044\\-260.8047\\-37\\140.2533\\-262.7578\\-37\\138.2082\\-264.7109\\-37\\135.7422\\-267.3175\\-37\\133.7891\\-269.1722\\-37\\132.0693\\-270.5703\\-37\\129.8828\\-272.532\\-37\\127.5866\\-274.4766\\-37\\125.9766\\-275.6523\\-37\\122.0703\\-278.6785\\-37\\118.1641\\-281.3313\\-37\\116.2109\\-282.5798\\-37\\114.2578\\-283.5383\\-37\\112.3047\\-284.8636\\-37\\110.3516\\-285.903\\-37\\108.3984\\-287.089\\-37\\104.4922\\-288.9757\\-37\\102.5391\\-289.6099\\-37\\100.5859\\-290.6637\\-37\\98.63281\\-291.3006\\-37\\96.67969\\-292.2679\\-37\\94.72656\\-292.9429\\-37\\92.77344\\-293.5012\\-37\\90.82031\\-294.3195\\-37\\88.86719\\-294.7879\\-37\\84.96094\\-295.3585\\-37\\83.00781\\-295.7186\\-37\\81.05469\\-296.2122\\-37\\79.10156\\-296.5286\\-37\\77.14844\\-296.7345\\-37\\73.24219\\-296.9324\\-37\\67.38281\\-296.9273\\-37\\63.47656\\-296.7235\\-37\\61.52344\\-296.5286\\-37\\59.57031\\-296.1607\\-37\\57.61719\\-295.6448\\-37\\53.71094\\-294.9346\\-37\\51.75781\\-294.669\\-37\\49.80469\\-294.0898\\-37\\47.85156\\-293.3248\\-37\\45.89844\\-292.8308\\-37\\43.94531\\-292.1768\\-37\\41.99219\\-291.3587\\-37\\40.03906\\-290.9037\\-37\\38.08594\\-290.2913\\-37\\36.13281\\-289.4773\\-37\\32.22656\\-288.7799\\-37\\28.32031\\-288.0012\\-37\\26.36719\\-287.8134\\-37\\24.41406\\-287.8017\\-37\\14.64844\\-288.6297\\-37\\10.74219\\-288.8792\\-37\\4.882813\\-289.1813\\-37\\2.929688\\-289.2314\\-37\\0.9765625\\-289.1443\\-37\\-0.9765625\\-289.3907\\-37\\-4.882813\\-289.4929\\-37\\-8.789063\\-289.5022\\-37\\-14.64844\\-289.4351\\-37\\-20.50781\\-289.3037\\-37\\-28.32031\\-289.1987\\-37\\-32.22656\\-289.3116\\-37\\-34.17969\\-289.5732\\-37\\-38.08594\\-290.7472\\-37\\-40.03906\\-291.1906\\-37\\-41.99219\\-291.848\\-37\\-43.94531\\-292.7147\\-37\\-45.89844\\-293.2299\\-37\\-47.85156\\-294.0457\\-37\\-49.80469\\-294.7054\\-37\\-53.71094\\-295.4563\\-37\\-55.66406\\-296.1175\\-37\\-57.61719\\-296.6445\\-37\\-61.52344\\-297.2244\\-37\\-63.47656\\-297.5885\\-37\\-65.42969\\-298.0757\\-37\\-67.38281\\-298.376\\-37\\-71.28906\\-298.6073\\-37\\-75.19531\\-298.6102\\-37\\-79.10156\\-298.3849\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "321" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "108" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-79.10156\\-298.0757\\-35\\-81.05469\\-297.642\\-35\\-86.91406\\-296.818\\-35\\-88.86719\\-296.4201\\-35\\-90.82031\\-295.6425\\-35\\-94.72656\\-294.6568\\-35\\-96.67969\\-293.7377\\-35\\-98.63281\\-292.921\\-35\\-100.5859\\-291.7766\\-35\\-102.5391\\-290.8924\\-35\\-104.4922\\-289.6761\\-35\\-106.4453\\-288.9135\\-35\\-108.3984\\-287.6805\\-35\\-110.3516\\-286.7192\\-35\\-111.0053\\-286.1953\\-35\\-114.2578\\-283.9684\\-35\\-116.2109\\-282.9034\\-35\\-119.9544\\-280.3359\\-35\\-122.0703\\-278.7853\\-35\\-127.3548\\-274.4766\\-35\\-129.4728\\-272.5234\\-35\\-131.8359\\-270.2448\\-35\\-133.7891\\-268.5754\\-35\\-135.7422\\-266.4793\\-35\\-137.0959\\-264.7109\\-35\\-140.7439\\-260.8047\\-35\\-142.3404\\-258.8516\\-35\\-144.8632\\-254.9453\\-35\\-146.363\\-252.9922\\-35\\-147.6755\\-251.0391\\-35\\-148.6391\\-249.0859\\-35\\-149.8336\\-247.1328\\-35\\-150.6257\\-245.1797\\-35\\-151.8585\\-243.2266\\-35\\-152.6908\\-241.2734\\-35\\-153.8086\\-239.3203\\-35\\-154.4766\\-237.3672\\-35\\-155.3897\\-235.4141\\-35\\-156.1062\\-233.4609\\-35\\-156.5256\\-231.5078\\-35\\-157.362\\-229.5547\\-35\\-158.0363\\-227.6016\\-35\\-158.5414\\-225.6484\\-35\\-159.3541\\-223.6953\\-35\\-159.907\\-221.7422\\-35\\-160.8297\\-217.8359\\-35\\-161.4873\\-215.8828\\-35\\-161.8381\\-213.9297\\-35\\-162.5252\\-208.0703\\-35\\-163.3699\\-204.1641\\-35\\-163.6801\\-202.2109\\-35\\-164.1865\\-196.3516\\-35\\-164.8353\\-186.5859\\-35\\-164.9429\\-182.6797\\-35\\-164.8883\\-178.7734\\-35\\-164.4238\\-170.9609\\-35\\-163.8143\\-163.1484\\-35\\-163.5489\\-161.1953\\-35\\-162.6075\\-157.2891\\-35\\-162.0739\\-153.3828\\-35\\-161.74\\-151.4297\\-35\\-161.1559\\-149.4766\\-35\\-160.4411\\-147.5234\\-35\\-159.9255\\-145.5703\\-35\\-158.3134\\-141.6641\\-35\\-157.6941\\-139.7109\\-35\\-156.633\\-137.7578\\-35\\-156.1166\\-135.8047\\-35\\-155.298\\-133.8516\\-35\\-154.3818\\-131.8984\\-35\\-153.6969\\-129.9453\\-35\\-152.6062\\-127.9922\\-35\\-151.6811\\-126.0391\\-35\\-150.4369\\-124.0859\\-35\\-149.6878\\-122.1328\\-35\\-148.6087\\-120.1797\\-35\\-147.7286\\-118.2266\\-35\\-146.5428\\-116.2734\\-35\\-144.3224\\-112.3672\\-35\\-143.0325\\-110.4141\\-35\\-142.1274\\-108.4609\\-35\\-139.2865\\-104.5547\\-35\\-137.9428\\-102.6016\\-35\\-134.9273\\-98.69531\\-35\\-133.7891\\-97.33135\\-35\\-131.8359\\-95.46683\\-35\\-128.8152\\-92.83594\\-35\\-125.9766\\-90.6875\\-35\\-122.0703\\-88.17386\\-35\\-115.8447\\-85.02344\\-35\\-114.2578\\-84.50976\\-35\\-110.3516\\-82.70891\\-35\\-108.3984\\-82.02116\\-35\\-106.4453\\-81.63006\\-35\\-104.4922\\-80.68552\\-35\\-102.5391\\-80.29086\\-35\\-100.5859\\-79.64471\\-35\\-96.67969\\-78.61011\\-35\\-94.72656\\-77.98263\\-35\\-90.82031\\-77.3125\\-35\\-86.91406\\-76.38959\\-35\\-77.14844\\-75.71934\\-35\\-75.19531\\-75.18204\\-35\\-73.24219\\-74.95554\\-35\\-65.42969\\-74.80209\\-35\\-61.52344\\-74.79108\\-35\\-55.66406\\-74.97105\\-35\\-53.71094\\-74.95067\\-35\\-49.80469\\-75.64707\\-35\\-47.85156\\-75.77559\\-35\\-43.94531\\-75.93069\\-35\\-40.03906\\-76.18268\\-35\\-36.13281\\-76.53766\\-35\\-34.17969\\-76.82163\\-35\\-28.32031\\-78.31026\\-35\\-26.36719\\-78.95236\\-35\\-24.41406\\-79.75651\\-35\\-22.46094\\-80.35369\\-35\\-18.55469\\-82.09375\\-35\\-14.64844\\-84.2797\\-35\\-12.69531\\-85.84056\\-35\\-10.74219\\-87.54564\\-35\\-8.789063\\-88.90421\\-35\\-6.835938\\-90.45284\\-35\\-4.882813\\-92.3064\\-35\\-2.929688\\-93.88226\\-35\\-0.9765625\\-95.16528\\-35\\0.9765625\\-95.73975\\-35\\2.929688\\-94.57813\\-35\\4.882813\\-93.73689\\-35\\6.177145\\-94.78906\\-35\\6.835938\\-95.52364\\-35\\7.665427\\-96.74219\\-35\\8.215616\\-98.69531\\-35\\8.195466\\-100.6484\\-35\\7.8125\\-102.6016\\-35\\8.375\\-104.5547\\-35\\8.789063\\-105.0048\\-35\\10.74219\\-106.2934\\-35\\12.69531\\-106.062\\-35\\14.51994\\-104.5547\\-35\\15.44009\\-102.6016\\-35\\15.45367\\-100.6484\\-35\\14.62296\\-98.69531\\-35\\12.69531\\-96.71375\\-35\\11.18201\\-94.78906\\-35\\7.521609\\-90.88281\\-35\\9.190286\\-88.92969\\-35\\14.64844\\-83.7417\\-35\\16.60156\\-82.19456\\-35\\18.55469\\-81.09236\\-35\\24.41406\\-78.1814\\-35\\26.36719\\-77.44965\\-35\\28.32031\\-76.57489\\-35\\32.22656\\-75.63017\\-35\\34.17969\\-74.87173\\-35\\36.13281\\-74.54818\\-35\\40.03906\\-74.15841\\-35\\41.99219\\-72.89829\\-35\\43.94531\\-72.74275\\-35\\47.85156\\-72.62606\\-35\\49.80469\\-72.65191\\-35\\51.75781\\-72.3691\\-35\\55.66406\\-72.59789\\-35\\57.61719\\-72.65535\\-35\\63.47656\\-72.67616\\-35\\67.38281\\-72.75057\\-35\\71.28906\\-72.90796\\-35\\73.24219\\-73.92035\\-35\\75.19531\\-74.25786\\-35\\79.10156\\-74.44297\\-35\\83.00781\\-74.80991\\-35\\84.96094\\-75.38957\\-35\\86.91406\\-75.80595\\-35\\92.77344\\-76.5205\\-35\\96.67969\\-77.69922\\-35\\98.63281\\-78.14681\\-35\\100.5859\\-78.82797\\-35\\102.5391\\-79.7066\\-35\\106.4453\\-80.80842\\-35\\108.3984\\-81.77873\\-35\\110.3516\\-82.35171\\-35\\112.3047\\-83.38686\\-35\\114.2578\\-84.25246\\-35\\116.2109\\-85.51832\\-35\\118.1641\\-86.3523\\-35\\120.1172\\-87.54677\\-35\\122.0703\\-88.34375\\-35\\125.9766\\-91.21302\\-35\\128.6669\\-92.83594\\-35\\129.8828\\-93.75463\\-35\\131.8359\\-95.43756\\-35\\133.7891\\-97.34126\\-35\\134.9915\\-98.69531\\-35\\137.8439\\-102.6016\\-35\\139.1314\\-104.5547\\-35\\140.5956\\-106.5078\\-35\\141.9271\\-108.4609\\-35\\142.7624\\-110.4141\\-35\\143.9386\\-112.3672\\-35\\144.8025\\-114.3203\\-35\\146.104\\-116.2734\\-35\\146.9322\\-118.2266\\-35\\148.0456\\-120.1797\\-35\\148.7311\\-122.1328\\-35\\149.6983\\-124.0859\\-35\\150.4025\\-126.0391\\-35\\151.207\\-127.9922\\-35\\152.2132\\-129.9453\\-35\\152.8971\\-131.8984\\-35\\153.8847\\-133.8516\\-35\\155.0058\\-137.7578\\-35\\155.7549\\-139.7109\\-35\\156.2032\\-141.6641\\-35\\156.5222\\-143.6172\\-35\\157.8475\\-147.5234\\-35\\158.6143\\-151.4297\\-35\\159.2463\\-153.3828\\-35\\159.7448\\-155.3359\\-35\\160.2875\\-159.2422\\-35\\160.9043\\-163.1484\\-35\\161.3123\\-165.1016\\-35\\161.586\\-167.0547\\-35\\161.927\\-170.9609\\-35\\162.2652\\-178.7734\\-35\\162.4005\\-184.6328\\-35\\162.4656\\-190.4922\\-35\\162.4533\\-196.3516\\-35\\162.4005\\-202.2109\\-35\\162.2463\\-208.0703\\-35\\162.08\\-211.9766\\-35\\161.814\\-215.8828\\-35\\161.3253\\-219.7891\\-35\\160.8276\\-221.7422\\-35\\160.4385\\-223.6953\\-35\\159.7602\\-227.6016\\-35\\158.3538\\-231.5078\\-35\\157.8547\\-233.4609\\-35\\156.9589\\-235.4141\\-35\\155.7651\\-239.3203\\-35\\154.739\\-241.2734\\-35\\153.9612\\-243.2266\\-35\\152.7491\\-245.1797\\-35\\151.7263\\-247.1328\\-35\\149.1623\\-251.0391\\-35\\148.0841\\-252.9922\\-35\\146.5093\\-254.9453\\-35\\144.7511\\-256.8984\\-35\\143.1393\\-258.8516\\-35\\141.66\\-260.8047\\-35\\139.7736\\-262.7578\\-35\\137.7537\\-264.7109\\-35\\135.9724\\-266.6641\\-35\\133.7891\\-268.7393\\-35\\131.8359\\-270.2173\\-35\\129.8828\\-271.8971\\-35\\127.9297\\-273.7753\\-35\\125.9766\\-275.3382\\-35\\124.0234\\-276.7408\\-35\\122.0703\\-278.0139\\-35\\121.6654\\-278.3828\\-35\\118.1641\\-280.9455\\-35\\110.3516\\-285.4059\\-35\\108.3984\\-286.696\\-35\\106.4453\\-287.5287\\-35\\104.4922\\-288.6401\\-35\\102.5391\\-289.2448\\-35\\98.63281\\-290.9599\\-35\\96.67969\\-291.5882\\-35\\94.72656\\-292.5774\\-35\\92.77344\\-293.1263\\-35\\88.86719\\-294.5088\\-35\\86.91406\\-294.866\\-35\\83.00781\\-295.3624\\-35\\81.05469\\-295.6953\\-35\\79.10156\\-296.1324\\-35\\77.14844\\-296.4619\\-35\\73.24219\\-296.7302\\-35\\69.33594\\-296.7711\\-35\\65.42969\\-296.6519\\-35\\61.52344\\-296.2122\\-35\\57.61719\\-295.4056\\-35\\53.71094\\-294.7674\\-35\\51.75781\\-294.5307\\-35\\47.85156\\-293.2363\\-35\\45.89844\\-292.7936\\-35\\43.94531\\-292.1768\\-35\\41.99219\\-291.3946\\-35\\38.08594\\-290.5033\\-35\\36.13281\\-289.7484\\-35\\34.17969\\-289.2907\\-35\\30.27344\\-288.8441\\-35\\28.32031\\-288.6902\\-35\\24.41406\\-288.6158\\-35\\18.55469\\-288.9633\\-35\\14.64844\\-289.1436\\-35\\10.74219\\-289.3908\\-35\\2.929688\\-290.0436\\-35\\0.9765625\\-290.14\\-35\\-0.9765625\\-290.356\\-35\\-4.882813\\-290.4806\\-35\\-8.789063\\-290.5308\\-35\\-12.69531\\-290.4138\\-35\\-14.64844\\-290.4138\\-35\\-20.50781\\-290.2255\\-35\\-26.36719\\-289.9975\\-35\\-30.27344\\-289.9093\\-35\\-32.22656\\-289.9975\\-35\\-34.17969\\-290.2785\\-35\\-40.03906\\-291.344\\-35\\-43.94531\\-292.7597\\-35\\-45.89844\\-293.2277\\-35\\-49.80469\\-294.6281\\-35\\-53.71094\\-295.3287\\-35\\-55.66406\\-295.8447\\-35\\-57.61719\\-296.4619\\-35\\-59.57031\\-296.7836\\-35\\-63.47656\\-297.3235\\-35\\-67.38281\\-298.0884\\-35\\-71.28906\\-298.4023\\-35\\-75.19531\\-298.4023\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "305" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "109" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-75.19531\\-298.0757\\-33\\-77.14844\\-297.8906\\-33\\-81.05469\\-297.3484\\-33\\-86.91406\\-296.6519\\-33\\-88.86719\\-296.0896\\-33\\-90.82031\\-295.3983\\-33\\-92.77344\\-294.9665\\-33\\-94.72656\\-294.4025\\-33\\-96.67969\\-293.4147\\-33\\-98.63281\\-292.6886\\-33\\-100.5859\\-291.4472\\-33\\-102.5391\\-290.6588\\-33\\-104.4922\\-289.4442\\-33\\-106.4453\\-288.6961\\-33\\-108.3984\\-287.4465\\-33\\-110.3516\\-286.4323\\-33\\-113.5274\\-284.2422\\-33\\-114.2578\\-283.6589\\-33\\-116.2109\\-282.6435\\-33\\-118.1641\\-281.3311\\-33\\-122.0703\\-278.4642\\-33\\-125.9766\\-275.4214\\-33\\-127.9297\\-273.7441\\-33\\-131.8359\\-269.9574\\-33\\-133.3308\\-268.6172\\-33\\-135.2574\\-266.6641\\-33\\-136.9529\\-264.7109\\-33\\-140.5882\\-260.8047\\-33\\-142.1701\\-258.8516\\-33\\-143.3144\\-256.8984\\-33\\-144.696\\-254.9453\\-33\\-146.2085\\-252.9922\\-33\\-147.4609\\-250.9622\\-33\\-149.6452\\-247.1328\\-33\\-150.4894\\-245.1797\\-33\\-151.6509\\-243.2266\\-33\\-152.5093\\-241.2734\\-33\\-153.6193\\-239.3203\\-33\\-155.0993\\-235.4141\\-33\\-155.9683\\-233.4609\\-33\\-156.3971\\-231.5078\\-33\\-157.0402\\-229.5547\\-33\\-157.8585\\-227.6016\\-33\\-158.3303\\-225.6484\\-33\\-159.7129\\-221.7422\\-33\\-160.5504\\-217.8359\\-33\\-161.6465\\-213.9297\\-33\\-161.9367\\-211.9766\\-33\\-162.5977\\-206.1172\\-33\\-163.3699\\-202.2109\\-33\\-163.6684\\-200.2578\\-33\\-163.9862\\-196.3516\\-33\\-164.2192\\-192.4453\\-33\\-164.4868\\-186.5859\\-33\\-164.5387\\-184.6328\\-33\\-164.5329\\-178.7734\\-33\\-164.2131\\-170.9609\\-33\\-163.8006\\-165.1016\\-33\\-163.5649\\-163.1484\\-33\\-162.7215\\-159.2422\\-33\\-162.3919\\-157.2891\\-33\\-161.8937\\-153.3828\\-33\\-161.4674\\-151.4297\\-33\\-160.7357\\-149.4766\\-33\\-159.662\\-145.5703\\-33\\-158.7068\\-143.6172\\-33\\-158.0791\\-141.6641\\-33\\-157.3351\\-139.7109\\-33\\-156.4077\\-137.7578\\-33\\-155.8878\\-135.8047\\-33\\-154.9241\\-133.8516\\-33\\-153.3203\\-129.8694\\-33\\-150.2906\\-124.0859\\-33\\-148.4312\\-120.1797\\-33\\-146.3323\\-116.2734\\-33\\-145.1129\\-114.3203\\-33\\-144.0965\\-112.3672\\-33\\-142.7772\\-110.4141\\-33\\-141.9173\\-108.4609\\-33\\-140.5485\\-106.5078\\-33\\-139.0365\\-104.5547\\-33\\-136.3212\\-100.6484\\-33\\-134.7724\\-98.69531\\-33\\-133.0511\\-96.74219\\-33\\-131.8359\\-95.56308\\-33\\-128.6534\\-92.83594\\-33\\-127.9297\\-92.34766\\-33\\-125.9766\\-90.75511\\-33\\-122.0703\\-88.22252\\-33\\-115.8673\\-85.02344\\-33\\-114.2578\\-84.51812\\-33\\-110.3516\\-82.73704\\-33\\-108.3984\\-82.06076\\-33\\-106.4453\\-81.66048\\-33\\-104.4922\\-80.6393\\-33\\-102.5391\\-80.25484\\-33\\-100.5859\\-79.60236\\-33\\-94.72656\\-77.8304\\-33\\-88.86719\\-76.64367\\-33\\-86.91406\\-76.30599\\-33\\-84.96094\\-76.13485\\-33\\-83.00781\\-76.06454\\-33\\-79.10156\\-75.78166\\-33\\-77.14844\\-75.5544\\-33\\-75.19531\\-74.96405\\-33\\-73.24219\\-74.77315\\-33\\-65.42969\\-74.66368\\-33\\-59.57031\\-74.67734\\-33\\-53.71094\\-74.76235\\-33\\-51.75781\\-74.85659\\-33\\-49.80469\\-75.10057\\-33\\-47.85156\\-75.51675\\-33\\-45.89844\\-75.69258\\-33\\-40.03906\\-76.03787\\-33\\-36.13281\\-76.37472\\-33\\-34.17969\\-76.61517\\-33\\-32.22656\\-77.03273\\-33\\-26.36719\\-78.69114\\-33\\-24.41406\\-79.54771\\-33\\-20.50781\\-80.90957\\-33\\-16.60156\\-82.82617\\-33\\-13.15542\\-85.02344\\-33\\-8.789063\\-88.5015\\-33\\-6.835938\\-90.13004\\-33\\-4.882813\\-91.90851\\-33\\-2.929688\\-93.49376\\-33\\-0.9765625\\-94.56068\\-33\\0.9765625\\-95.23925\\-33\\5.223474\\-92.83594\\-33\\6.835938\\-91.64049\\-33\\7.17926\\-90.88281\\-33\\8.789063\\-88.9389\\-33\\12.81178\\-85.02344\\-33\\15.15447\\-83.07031\\-33\\16.60156\\-82.03667\\-33\\18.55469\\-80.80146\\-33\\20.50781\\-79.94405\\-33\\22.46094\\-78.87109\\-33\\26.36719\\-77.14173\\-33\\28.32031\\-76.40421\\-33\\30.27344\\-76.01869\\-33\\32.22656\\-75.44561\\-33\\34.17969\\-74.71684\\-33\\38.08594\\-74.15755\\-33\\40.03906\\-73.20995\\-33\\41.99219\\-72.79937\\-33\\45.89844\\-72.55756\\-33\\47.85156\\-71.9504\\-33\\49.80469\\-72.34847\\-33\\51.75781\\-71.75673\\-33\\55.66406\\-71.91644\\-33\\57.61719\\-72.51304\\-33\\59.57031\\-72.63519\\-33\\63.47656\\-72.64856\\-33\\67.38281\\-72.71235\\-33\\71.28906\\-72.85171\\-33\\73.24219\\-72.98988\\-33\\75.19531\\-74.22894\\-33\\77.14844\\-74.30492\\-33\\81.05469\\-74.5612\\-33\\83.00781\\-74.76597\\-33\\86.91406\\-75.70703\\-33\\92.77344\\-76.46777\\-33\\94.72656\\-77.02393\\-33\\96.67969\\-77.69614\\-33\\98.63281\\-78.10754\\-33\\100.5859\\-78.78703\\-33\\102.5391\\-79.69383\\-33\\106.4453\\-80.8206\\-33\\108.3984\\-81.77034\\-33\\110.3516\\-82.35171\\-33\\112.3047\\-83.37762\\-33\\114.2578\\-84.25893\\-33\\116.2109\\-85.50512\\-33\\118.1641\\-86.33569\\-33\\120.1172\\-87.52795\\-33\\122.0703\\-88.34375\\-33\\125.9766\\-91.20126\\-33\\128.8035\\-92.83594\\-33\\129.8828\\-93.64333\\-33\\131.8359\\-95.5\\-33\\134.8604\\-98.69531\\-33\\136.3636\\-100.6484\\-33\\137.5722\\-102.6016\\-33\\138.9013\\-104.5547\\-33\\140.3973\\-106.5078\\-33\\141.6098\\-108.4609\\-33\\144.6006\\-114.3203\\-33\\145.7915\\-116.2734\\-33\\146.6604\\-118.2266\\-33\\147.7771\\-120.1797\\-33\\149.3117\\-124.0859\\-33\\150.2087\\-126.0391\\-33\\150.8304\\-127.9922\\-33\\151.8759\\-129.9453\\-33\\152.5678\\-131.8984\\-33\\153.4931\\-133.8516\\-33\\154.2076\\-135.8047\\-33\\154.7054\\-137.7578\\-33\\155.4195\\-139.7109\\-33\\156.0289\\-141.6641\\-33\\156.3488\\-143.6172\\-33\\156.7815\\-145.5703\\-33\\157.5521\\-147.5234\\-33\\158.0166\\-149.4766\\-33\\158.3549\\-151.4297\\-33\\158.7929\\-153.3828\\-33\\159.4615\\-155.3359\\-33\\159.8255\\-157.2891\\-33\\160.6061\\-163.1484\\-33\\161.2859\\-167.0547\\-33\\161.7576\\-170.9609\\-33\\161.9741\\-174.8672\\-33\\162.1922\\-180.7266\\-33\\162.2821\\-184.6328\\-33\\162.3204\\-190.4922\\-33\\162.3204\\-196.3516\\-33\\162.2532\\-202.2109\\-33\\162.0977\\-208.0703\\-33\\161.8019\\-213.9297\\-33\\161.3253\\-217.8359\\-33\\160.5103\\-221.7422\\-33\\159.9006\\-225.6484\\-33\\159.4727\\-227.6016\\-33\\158.6616\\-229.5547\\-33\\157.5834\\-233.4609\\-33\\156.6319\\-235.4141\\-33\\156.1671\\-237.3672\\-33\\155.4627\\-239.3203\\-33\\154.4788\\-241.2734\\-33\\153.6638\\-243.2266\\-33\\153.3203\\-243.7148\\-33\\150.1543\\-249.0859\\-33\\148.8472\\-251.0391\\-33\\147.6607\\-252.9922\\-33\\146.1736\\-254.9453\\-33\\141.6016\\-260.2389\\-33\\139.6484\\-262.2876\\-33\\137.2034\\-264.7109\\-33\\135.3683\\-266.6641\\-33\\133.2571\\-268.6172\\-33\\129.8828\\-271.56\\-33\\127.9297\\-273.3936\\-33\\125.9766\\-274.9718\\-33\\124.0234\\-276.1739\\-33\\122.0703\\-277.5901\\-33\\120.1172\\-279.111\\-33\\118.1641\\-280.4541\\-33\\116.2109\\-281.5782\\-33\\114.2578\\-282.8593\\-33\\112.3047\\-283.7471\\-33\\110.3516\\-285.0407\\-33\\108.275\\-286.1953\\-33\\104.3972\\-288.1484\\-33\\102.5391\\-288.9846\\-33\\100.5859\\-289.5518\\-33\\98.63281\\-290.5988\\-33\\96.67969\\-291.1896\\-33\\92.77344\\-292.8071\\-33\\90.82031\\-293.3317\\-33\\88.86719\\-294.0156\\-33\\86.91406\\-294.5987\\-33\\84.96094\\-294.9079\\-33\\81.05469\\-295.3585\\-33\\79.10156\\-295.6331\\-33\\75.19531\\-296.3117\\-33\\71.28906\\-296.5198\\-33\\67.38281\\-296.4839\\-33\\65.42969\\-296.369\\-33\\63.47656\\-296.1187\\-33\\59.57031\\-295.4694\\-33\\55.66406\\-295.0199\\-33\\51.75781\\-294.3732\\-33\\49.80469\\-293.7068\\-33\\47.85156\\-293.1611\\-33\\45.89844\\-292.7522\\-33\\43.94531\\-292.2033\\-33\\41.99219\\-291.4688\\-33\\38.08594\\-290.7072\\-33\\34.17969\\-289.5372\\-33\\30.27344\\-289.101\\-33\\24.41406\\-289.0636\\-33\\18.55469\\-289.3863\\-33\\14.64844\\-289.7565\\-33\\10.74219\\-290.2913\\-33\\6.835938\\-290.6792\\-33\\-0.9765625\\-291.0558\\-33\\-8.789063\\-291.1735\\-33\\-16.60156\\-291.0454\\-33\\-20.50781\\-290.9287\\-33\\-26.36719\\-290.8174\\-33\\-32.22656\\-290.7768\\-33\\-36.13281\\-290.968\\-33\\-38.08594\\-291.1748\\-33\\-40.03906\\-291.5391\\-33\\-41.99219\\-292.3022\\-33\\-45.89844\\-293.2545\\-33\\-49.80469\\-294.5614\\-33\\-53.71094\\-295.2131\\-33\\-55.66406\\-295.6307\\-33\\-57.61719\\-296.2369\\-33\\-59.57031\\-296.6405\\-33\\-65.42969\\-297.3689\\-33\\-69.33594\\-297.9061\\-33\\-73.24219\\-298.1378\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "299" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "110" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-296.3971\\-31\\-88.86719\\-295.6913\\-31\\-92.77344\\-294.7879\\-31\\-94.72656\\-294.0765\\-31\\-96.67969\\-293.1526\\-31\\-98.63281\\-292.3912\\-31\\-100.5859\\-291.2066\\-31\\-102.5391\\-290.3642\\-31\\-104.4922\\-289.2532\\-31\\-106.4453\\-288.4326\\-31\\-112.3047\\-284.8269\\-31\\-114.2578\\-283.4284\\-31\\-116.2109\\-282.346\\-31\\-118.1641\\-281.1135\\-31\\-121.7317\\-278.3828\\-31\\-122.0703\\-278.0623\\-31\\-125.9766\\-275.2172\\-31\\-127.9297\\-273.5193\\-31\\-129.8828\\-271.6315\\-31\\-133.7891\\-267.9776\\-31\\-135.0666\\-266.6641\\-31\\-136.7996\\-264.7109\\-31\\-140.4039\\-260.8047\\-31\\-141.956\\-258.8516\\-31\\-143.1362\\-256.8984\\-31\\-146.0337\\-252.9922\\-31\\-148.4007\\-249.0859\\-31\\-151.4048\\-243.2266\\-31\\-153.3434\\-239.3203\\-31\\-154.2066\\-237.3672\\-31\\-154.8733\\-235.4141\\-31\\-155.8079\\-233.4609\\-31\\-156.7815\\-229.5547\\-31\\-157.6613\\-227.6016\\-31\\-158.6616\\-223.6953\\-31\\-159.4502\\-221.7422\\-31\\-159.952\\-219.7891\\-31\\-160.7783\\-215.8828\\-31\\-161.3909\\-213.9297\\-31\\-161.7694\\-211.9766\\-31\\-162.0265\\-210.0234\\-31\\-162.4127\\-206.1172\\-31\\-162.9562\\-202.2109\\-31\\-163.3817\\-200.2578\\-31\\-163.6311\\-198.3047\\-31\\-163.9411\\-194.3984\\-31\\-164.1333\\-190.4922\\-31\\-164.2948\\-184.6328\\-31\\-164.3013\\-180.7266\\-31\\-164.191\\-174.8672\\-31\\-164.0172\\-170.9609\\-31\\-163.7612\\-167.0547\\-31\\-163.5459\\-165.1016\\-31\\-163.2276\\-163.1484\\-31\\-162.7675\\-161.1953\\-31\\-162.4577\\-159.2422\\-31\\-161.9707\\-155.3359\\-31\\-161.6684\\-153.3828\\-31\\-160.4353\\-149.4766\\-31\\-159.9515\\-147.5234\\-31\\-159.2882\\-145.5703\\-31\\-158.4017\\-143.6172\\-31\\-157.8212\\-141.6641\\-31\\-156.8915\\-139.7109\\-31\\-155.5966\\-135.8047\\-31\\-154.616\\-133.8516\\-31\\-153.9329\\-131.8984\\-31\\-152.0981\\-127.9922\\-31\\-150.9386\\-126.0391\\-31\\-150.1496\\-124.0859\\-31\\-149.057\\-122.1328\\-31\\-148.2305\\-120.1797\\-31\\-147.0501\\-118.2266\\-31\\-146.088\\-116.2734\\-31\\-144.7833\\-114.3203\\-31\\-143.797\\-112.3672\\-31\\-142.6453\\-110.4141\\-31\\-141.6262\\-108.4609\\-31\\-140.3625\\-106.5078\\-31\\-138.8288\\-104.5547\\-31\\-136.1103\\-100.6484\\-31\\-134.5607\\-98.69531\\-31\\-131.8359\\-95.72089\\-31\\-129.8828\\-94.01194\\-31\\-127.9297\\-92.48942\\-31\\-125.9766\\-90.85918\\-31\\-122.0703\\-88.29899\\-31\\-119.6696\\-86.97656\\-31\\-115.7588\\-85.02344\\-31\\-114.2578\\-84.54382\\-31\\-110.3516\\-82.75\\-31\\-108.3984\\-82.08082\\-31\\-106.4453\\-81.67236\\-31\\-104.4922\\-80.61515\\-31\\-102.5391\\-80.25484\\-31\\-100.5859\\-79.54996\\-31\\-94.72656\\-77.78241\\-31\\-88.86719\\-76.45465\\-31\\-86.91406\\-76.2078\\-31\\-83.00781\\-75.97771\\-31\\-79.10156\\-75.68805\\-31\\-75.19531\\-74.79173\\-31\\-73.24219\\-74.65525\\-31\\-69.33594\\-74.63576\\-31\\-63.47656\\-74.54818\\-31\\-57.61719\\-74.55288\\-31\\-53.71094\\-74.60013\\-31\\-49.80469\\-74.82132\\-31\\-43.94531\\-75.5621\\-31\\-36.13281\\-76.23438\\-31\\-34.17969\\-76.44945\\-31\\-32.22656\\-76.79333\\-31\\-28.32031\\-77.93755\\-31\\-26.36719\\-78.45331\\-31\\-22.46094\\-79.97583\\-31\\-20.50781\\-80.62554\\-31\\-18.55469\\-81.69363\\-31\\-16.60156\\-82.45318\\-31\\-12.69531\\-84.96501\\-31\\-10.74219\\-86.54977\\-31\\-4.882813\\-91.51856\\-31\\-2.929688\\-93.08206\\-31\\-0.9765625\\-94.20313\\-31\\0.9765625\\-94.67372\\-31\\2.929688\\-93.92034\\-31\\4.453462\\-92.83594\\-31\\6.623299\\-90.88281\\-31\\8.789063\\-88.62005\\-31\\12.69531\\-84.80186\\-31\\14.74095\\-83.07031\\-31\\18.55469\\-80.61207\\-31\\20.50781\\-79.79091\\-31\\22.46094\\-78.69322\\-31\\24.41406\\-77.85141\\-31\\26.36719\\-76.89756\\-31\\28.32031\\-76.26989\\-31\\30.27344\\-75.90271\\-31\\34.17969\\-74.62238\\-31\\36.13281\\-74.3728\\-31\\38.08594\\-73.90394\\-31\\40.03906\\-72.85171\\-31\\43.94531\\-72.58971\\-31\\45.89844\\-71.9747\\-31\\47.85156\\-71.6944\\-31\\51.75781\\-71.65284\\-31\\55.66406\\-71.69079\\-31\\59.57031\\-72.17849\\-31\\61.52344\\-72.16933\\-31\\63.47656\\-72.34198\\-31\\65.42969\\-72.64184\\-31\\73.24219\\-72.88874\\-31\\75.19531\\-74.19405\\-31\\77.14844\\-74.26955\\-31\\83.00781\\-74.7207\\-31\\84.96094\\-74.99792\\-31\\86.91406\\-75.63908\\-31\\88.86719\\-75.95788\\-31\\92.77344\\-76.43834\\-31\\96.67969\\-77.68386\\-31\\98.63281\\-78.11369\\-31\\100.5859\\-78.79707\\-31\\102.5391\\-79.68107\\-31\\106.4453\\-80.8206\\-31\\108.3984\\-81.75323\\-31\\110.3516\\-82.34716\\-31\\112.3047\\-83.35428\\-31\\114.2578\\-84.2455\\-31\\116.2109\\-85.47159\\-31\\118.1641\\-86.32349\\-31\\120.1172\\-87.53366\\-31\\122.0703\\-88.34375\\-31\\125.9766\\-91.1871\\-31\\128.7802\\-92.83594\\-31\\129.8828\\-93.67642\\-31\\131.8359\\-95.56551\\-31\\134.7222\\-98.69531\\-31\\136.1576\\-100.6484\\-31\\137.318\\-102.6016\\-31\\137.6953\\-103.0236\\-31\\139.6484\\-105.8645\\-31\\140.1817\\-106.5078\\-31\\141.2483\\-108.4609\\-31\\142.4622\\-110.4141\\-31\\143.2789\\-112.3672\\-31\\144.3991\\-114.3203\\-31\\145.3065\\-116.2734\\-31\\146.435\\-118.2266\\-31\\148.3162\\-122.1328\\-31\\148.9533\\-124.0859\\-31\\149.9581\\-126.0391\\-31\\150.5969\\-127.9922\\-31\\151.5158\\-129.9453\\-31\\152.9744\\-133.8516\\-31\\153.9329\\-135.8047\\-31\\155.0573\\-139.7109\\-31\\155.8079\\-141.6641\\-31\\156.5376\\-145.5703\\-31\\157.7917\\-149.4766\\-31\\158.5053\\-153.3828\\-31\\159.5764\\-157.2891\\-31\\159.9006\\-159.2422\\-31\\160.3632\\-163.1484\\-31\\160.915\\-167.0547\\-31\\161.5326\\-170.9609\\-31\\161.826\\-174.8672\\-31\\162.0626\\-180.7266\\-31\\162.1506\\-184.6328\\-31\\162.1987\\-190.4922\\-31\\162.1933\\-196.3516\\-31\\162.1212\\-202.2109\\-31\\162.0265\\-206.1172\\-31\\161.8726\\-210.0234\\-31\\161.5988\\-213.9297\\-31\\161.2992\\-215.8828\\-31\\160.579\\-219.7891\\-31\\159.6622\\-225.6484\\-31\\158.3849\\-229.5547\\-31\\157.9316\\-231.5078\\-31\\156.4254\\-235.4141\\-31\\155.9808\\-237.3672\\-31\\155.0589\\-239.3203\\-31\\154.2622\\-241.2734\\-31\\153.3203\\-243.1461\\-31\\152.1473\\-245.1797\\-31\\150.8557\\-247.1328\\-31\\149.8643\\-249.0859\\-31\\148.5596\\-251.0391\\-31\\145.7779\\-254.9453\\-31\\142.4984\\-258.8516\\-31\\140.7357\\-260.8047\\-31\\138.7475\\-262.7578\\-31\\134.9376\\-266.6641\\-31\\131.8359\\-269.5264\\-31\\127.9297\\-272.9438\\-31\\125.9464\\-274.4766\\-31\\124.0234\\-275.7901\\-31\\120.1172\\-278.6888\\-31\\118.1641\\-279.9012\\-31\\116.2109\\-281.2369\\-31\\114.2578\\-282.4081\\-31\\112.3047\\-283.3681\\-31\\110.3516\\-284.6237\\-31\\108.3984\\-285.5667\\-31\\106.4453\\-286.7895\\-31\\104.4922\\-287.5987\\-31\\102.5391\\-288.6635\\-31\\100.5859\\-289.2434\\-31\\98.63281\\-289.9853\\-31\\96.67969\\-290.8711\\-31\\94.72656\\-291.455\\-31\\92.77344\\-292.4161\\-31\\88.86719\\-293.5165\\-31\\86.91406\\-294.213\\-31\\84.96094\\-294.6487\\-31\\83.00781\\-294.9134\\-31\\73.24219\\-295.985\\-31\\69.33594\\-296.1723\\-31\\67.38281\\-296.1048\\-31\\61.52344\\-295.45\\-31\\55.66406\\-294.8844\\-31\\53.71094\\-294.6121\\-31\\51.75781\\-294.173\\-31\\49.80469\\-293.5349\\-31\\45.89844\\-292.7075\\-31\\43.94531\\-292.1768\\-31\\41.99219\\-291.5288\\-31\\40.03906\\-291.1318\\-31\\36.13281\\-290.4421\\-31\\34.17969\\-289.8722\\-31\\32.22656\\-289.5245\\-31\\30.27344\\-289.3119\\-31\\24.41406\\-289.4443\\-31\\20.50781\\-289.8278\\-31\\16.60156\\-290.4206\\-31\\12.69531\\-290.8312\\-31\\2.929688\\-291.5471\\-31\\-0.9765625\\-291.7482\\-31\\-6.835938\\-291.9523\\-31\\-10.74219\\-291.9673\\-31\\-16.60156\\-291.6902\\-31\\-18.55469\\-291.5273\\-31\\-22.46094\\-291.4749\\-31\\-30.27344\\-291.2858\\-31\\-34.17969\\-291.2552\\-31\\-36.13281\\-291.3088\\-31\\-38.08594\\-291.463\\-31\\-40.03906\\-291.8228\\-31\\-41.99219\\-292.4611\\-31\\-45.89844\\-293.2796\\-31\\-49.80469\\-294.5056\\-31\\-51.75781\\-294.8474\\-31\\-55.66406\\-295.4277\\-31\\-59.57031\\-296.4587\\-31\\-61.52344\\-296.7368\\-31\\-67.38281\\-297.3317\\-31\\-71.28906\\-297.6321\\-31\\-75.19531\\-297.6321\\-31\\-79.10156\\-297.3235\\-31\\-84.96094\\-296.7476\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "303" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "111" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-295.3891\\-29\\-90.82031\\-295.0435\\-29\\-92.77344\\-294.5739\\-29\\-94.72656\\-293.6961\\-29\\-96.67969\\-292.9198\\-29\\-100.5859\\-290.9996\\-29\\-102.5391\\-289.9261\\-29\\-104.4922\\-289.0707\\-29\\-108.3984\\-287.012\\-29\\-110.3516\\-285.6906\\-29\\-112.3047\\-284.54\\-29\\-114.2578\\-283.2092\\-29\\-118.1641\\-280.844\\-29\\-118.747\\-280.3359\\-29\\-121.3882\\-278.3828\\-29\\-122.0703\\-277.7517\\-29\\-124.0234\\-276.2456\\-29\\-125.9766\\-274.9683\\-29\\-127.9297\\-273.2907\\-29\\-133.7891\\-267.7868\\-29\\-134.882\\-266.6641\\-29\\-140.2001\\-260.8047\\-29\\-141.6567\\-258.8516\\-29\\-142.9618\\-256.8984\\-29\\-143.5547\\-256.1766\\-29\\-145.8047\\-252.9922\\-29\\-146.9632\\-251.0391\\-29\\-148.2633\\-249.0859\\-29\\-149.1699\\-247.1328\\-29\\-150.2418\\-245.1797\\-29\\-151.083\\-243.2266\\-29\\-152.1915\\-241.2734\\-29\\-153.054\\-239.3203\\-29\\-154.0684\\-237.3672\\-29\\-154.6798\\-235.4141\\-29\\-155.6036\\-233.4609\\-29\\-156.1607\\-231.5078\\-29\\-156.5694\\-229.5547\\-29\\-157.401\\-227.6016\\-29\\-157.9988\\-225.6484\\-29\\-158.4379\\-223.6953\\-29\\-159.7786\\-219.7891\\-29\\-160.5108\\-215.8828\\-29\\-161.5791\\-211.9766\\-29\\-161.8963\\-210.0234\\-29\\-162.6408\\-202.2109\\-29\\-163.0308\\-200.2578\\-29\\-163.6136\\-196.3516\\-29\\-163.8929\\-192.4453\\-29\\-164.1026\\-184.6328\\-29\\-164.1121\\-180.7266\\-29\\-164.0228\\-174.8672\\-29\\-163.8449\\-170.9609\\-29\\-163.5063\\-167.0547\\-29\\-162.4874\\-161.1953\\-29\\-162.0614\\-157.2891\\-29\\-161.7942\\-155.3359\\-29\\-161.3787\\-153.3828\\-29\\-160.7096\\-151.4297\\-29\\-159.7129\\-147.5234\\-29\\-158.8135\\-145.5703\\-29\\-157.5084\\-141.6641\\-29\\-156.5818\\-139.7109\\-29\\-156.0509\\-137.7578\\-29\\-154.3752\\-133.8516\\-29\\-153.6503\\-131.8984\\-29\\-152.6515\\-129.9453\\-29\\-151.8138\\-127.9922\\-29\\-150.6145\\-126.0391\\-29\\-149.9581\\-124.0859\\-29\\-148.7608\\-122.1328\\-29\\-147.999\\-120.1797\\-29\\-146.7677\\-118.2266\\-29\\-145.8748\\-116.2734\\-29\\-144.561\\-114.3203\\-29\\-143.4346\\-112.3672\\-29\\-142.511\\-110.4141\\-29\\-140.1565\\-106.5078\\-29\\-139.6484\\-105.9294\\-29\\-137.6953\\-103.2129\\-29\\-137.1582\\-102.6016\\-29\\-135.8955\\-100.6484\\-29\\-133.7891\\-98.07462\\-29\\-131.8359\\-95.88188\\-29\\-130.669\\-94.78906\\-29\\-125.8329\\-90.88281\\-29\\-122.0703\\-88.32612\\-29\\-119.7007\\-86.97656\\-29\\-115.6006\\-85.02344\\-29\\-114.2578\\-84.57046\\-29\\-110.3516\\-82.76317\\-29\\-108.3984\\-82.08733\\-29\\-106.4453\\-81.70571\\-29\\-104.4922\\-80.68552\\-29\\-102.5391\\-80.29086\\-29\\-99.46646\\-79.16406\\-29\\-94.72656\\-77.77595\\-29\\-92.77344\\-77.34375\\-29\\-90.82031\\-76.77444\\-29\\-88.86719\\-76.37905\\-29\\-86.91406\\-76.12951\\-29\\-81.05469\\-75.74268\\-29\\-79.10156\\-75.37691\\-29\\-77.14844\\-74.90054\\-29\\-75.19531\\-74.6563\\-29\\-73.24219\\-74.56498\\-29\\-67.38281\\-74.50035\\-29\\-65.42969\\-74.51588\\-29\\-57.61719\\-74.43577\\-29\\-53.71094\\-74.49546\\-29\\-49.80469\\-74.67325\\-29\\-43.94531\\-75.05933\\-29\\-41.99219\\-75.57878\\-29\\-38.08594\\-75.91878\\-29\\-34.17969\\-76.32469\\-29\\-32.22656\\-76.5857\\-29\\-30.27344\\-77.03403\\-29\\-28.32031\\-77.733\\-29\\-24.41406\\-78.94027\\-29\\-22.46094\\-79.83389\\-29\\-20.50781\\-80.42315\\-29\\-18.55469\\-81.45972\\-29\\-16.60156\\-82.21582\\-29\\-14.64844\\-83.4505\\-29\\-12.69531\\-84.57554\\-29\\-8.789063\\-87.99354\\-29\\-6.835938\\-89.44256\\-29\\-4.882813\\-91.0797\\-29\\-2.929688\\-92.60021\\-29\\-0.9765625\\-93.80022\\-29\\0.9765625\\-94.09863\\-29\\2.929688\\-93.7316\\-29\\4.882813\\-92.19989\\-29\\6.312779\\-90.88281\\-29\\8.789063\\-88.35395\\-29\\12.69531\\-84.51296\\-29\\14.64844\\-82.85419\\-29\\16.60156\\-81.78332\\-29\\18.55469\\-80.40149\\-29\\21.06081\\-79.16406\\-29\\24.41406\\-77.6487\\-29\\26.36719\\-76.70286\\-29\\28.32031\\-76.16966\\-29\\30.27344\\-75.73949\\-29\\32.22656\\-74.91449\\-29\\34.17969\\-74.53181\\-29\\36.13281\\-74.30492\\-29\\38.08594\\-73.81516\\-29\\40.03906\\-72.78273\\-29\\41.99219\\-72.6904\\-29\\43.94531\\-72.48389\\-29\\45.89844\\-71.70185\\-29\\47.85156\\-71.63816\\-29\\57.61719\\-71.69079\\-29\\63.47656\\-71.80933\\-29\\65.42969\\-72.44154\\-29\\67.38281\\-72.68324\\-29\\73.24219\\-72.87\\-29\\75.19531\\-73.06896\\-29\\77.14844\\-74.24056\\-29\\83.00781\\-74.66781\\-29\\84.96094\\-74.94004\\-29\\86.91406\\-75.61476\\-29\\88.86719\\-75.93845\\-29\\92.77344\\-76.42358\\-29\\96.67969\\-77.66792\\-29\\98.63281\\-78.17066\\-29\\100.5859\\-78.84925\\-29\\102.5391\\-79.687\\-29\\106.4453\\-80.83296\\-29\\108.3984\\-81.75766\\-29\\110.3516\\-82.35171\\-29\\112.3047\\-83.35228\\-29\\114.2578\\-84.24987\\-29\\116.2109\\-85.44774\\-29\\118.1641\\-86.30743\\-29\\120.1172\\-87.53366\\-29\\122.0703\\-88.36287\\-29\\124.0234\\-89.73209\\-29\\125.9766\\-91.23355\\-29\\128.5979\\-92.83594\\-29\\129.8828\\-93.8125\\-29\\132.8443\\-96.74219\\-29\\134.6229\\-98.69531\\-29\\135.9825\\-100.6484\\-29\\137.1285\\-102.6016\\-29\\139.8979\\-106.5078\\-29\\140.9943\\-108.4609\\-29\\142.2674\\-110.4141\\-29\\142.9957\\-112.3672\\-29\\144.1876\\-114.3203\\-29\\144.9815\\-116.2734\\-29\\146.1719\\-118.2266\\-29\\147.0056\\-120.1797\\-29\\148.1099\\-122.1328\\-29\\148.7311\\-124.0859\\-29\\149.6582\\-126.0391\\-29\\150.4149\\-127.9922\\-29\\151.0728\\-129.9453\\-29\\152.0275\\-131.8984\\-29\\152.6518\\-133.8516\\-29\\153.6263\\-135.8047\\-29\\154.7625\\-139.7109\\-29\\155.5157\\-141.6641\\-29\\156.0412\\-143.6172\\-29\\156.7845\\-147.5234\\-29\\157.5305\\-149.4766\\-29\\157.9565\\-151.4297\\-29\\158.6507\\-155.3359\\-29\\159.2173\\-157.2891\\-29\\159.685\\-159.2422\\-29\\160.3911\\-165.1016\\-29\\161.4494\\-172.9141\\-29\\161.7697\\-176.8203\\-29\\161.9924\\-182.6797\\-29\\162.0502\\-188.5391\\-29\\162.0743\\-194.3984\\-29\\162.0158\\-200.2578\\-29\\161.8771\\-206.1172\\-29\\161.53\\-211.9766\\-29\\161.2702\\-213.9297\\-29\\160.6084\\-217.8359\\-29\\159.7827\\-223.6953\\-29\\159.3018\\-225.6484\\-29\\158.6192\\-227.6016\\-29\\157.6796\\-231.5078\\-29\\156.7513\\-233.4609\\-29\\155.7205\\-237.3672\\-29\\154.7496\\-239.3203\\-29\\154.0396\\-241.2734\\-29\\152.8223\\-243.2266\\-29\\151.8428\\-245.1797\\-29\\150.5427\\-247.1328\\-29\\149.4867\\-249.0859\\-29\\148.281\\-251.0391\\-29\\145.5078\\-254.625\\-29\\143.5547\\-257.0182\\-29\\142.1566\\-258.8516\\-29\\140.3792\\-260.8047\\-29\\138.3817\\-262.7578\\-29\\133.7891\\-267.3833\\-29\\131.8359\\-269.1518\\-29\\130.0197\\-270.5703\\-29\\125.9766\\-273.9305\\-29\\122.0703\\-276.854\\-29\\120.1172\\-278.041\\-29\\116.2109\\-280.9062\\-29\\114.2578\\-281.8558\\-29\\112.3047\\-283.0814\\-29\\110.0518\\-284.2422\\-29\\106.6272\\-286.1953\\-29\\102.5391\\-288.204\\-29\\100.5859\\-288.9846\\-29\\98.63281\\-289.4982\\-29\\96.67969\\-290.4959\\-29\\92.77344\\-291.814\\-29\\90.82031\\-292.6603\\-29\\88.86719\\-293.1299\\-29\\84.96094\\-294.2779\\-29\\81.05469\\-294.9259\\-29\\79.10156\\-295.1094\\-29\\73.24219\\-295.5396\\-29\\69.33594\\-295.6953\\-29\\67.38281\\-295.6331\\-29\\61.52344\\-295.2468\\-29\\55.66406\\-294.7358\\-29\\53.71094\\-294.4482\\-29\\49.80469\\-293.3702\\-29\\45.89844\\-292.6396\\-29\\41.99219\\-291.5574\\-29\\40.03906\\-291.207\\-29\\36.13281\\-290.6886\\-29\\32.22656\\-289.9709\\-29\\30.27344\\-289.795\\-29\\28.32031\\-289.8093\\-29\\24.41406\\-290.1093\\-29\\22.46094\\-290.4206\\-29\\18.55469\\-290.8531\\-29\\10.74219\\-291.5602\\-29\\6.835938\\-292.1494\\-29\\2.929688\\-292.5104\\-29\\-0.9765625\\-292.6637\\-29\\-6.835938\\-292.7606\\-29\\-10.74219\\-292.7606\\-29\\-16.60156\\-292.5879\\-29\\-18.55469\\-292.393\\-29\\-22.46094\\-292.3824\\-29\\-34.17969\\-291.8353\\-29\\-38.08594\\-291.9162\\-29\\-45.89844\\-293.312\\-29\\-49.80469\\-294.461\\-29\\-51.75781\\-294.7807\\-29\\-55.66406\\-295.2907\\-29\\-57.61719\\-295.6448\\-29\\-59.57031\\-296.1723\\-29\\-61.52344\\-296.5541\\-29\\-63.47656\\-296.7836\\-29\\-67.38281\\-297.0853\\-29\\-71.28906\\-297.3109\\-29\\-73.24219\\-297.3317\\-29\\-77.14844\\-297.2033\\-29\\-83.00781\\-296.7897\\-29\\-84.96094\\-296.5372\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "308" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "112" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.96094\\-296.1459\\-27\\-86.91406\\-295.5717\\-27\\-90.82031\\-294.8145\\-27\\-92.77344\\-294.2537\\-27\\-94.72656\\-293.3433\\-27\\-96.67969\\-292.6736\\-27\\-98.63281\\-291.5366\\-27\\-100.5859\\-290.7716\\-27\\-102.5391\\-289.5999\\-27\\-104.4922\\-288.8809\\-27\\-106.4453\\-287.7195\\-27\\-108.3984\\-286.7967\\-27\\-110.3516\\-285.3893\\-27\\-112.3047\\-284.1241\\-27\\-114.2578\\-283.0426\\-27\\-116.2109\\-281.7183\\-27\\-118.1641\\-280.5267\\-27\\-121.0497\\-278.3828\\-27\\-124.0234\\-275.9818\\-27\\-125.9766\\-274.638\\-27\\-127.9297\\-273.0412\\-27\\-131.8359\\-269.4378\\-27\\-134.6739\\-266.6641\\-27\\-139.965\\-260.8047\\-27\\-143.5547\\-255.9219\\-27\\-145.5155\\-252.9922\\-27\\-146.748\\-251.0391\\-27\\-148.1014\\-249.0859\\-27\\-148.9359\\-247.1328\\-27\\-150.1045\\-245.1797\\-27\\-150.8557\\-243.2266\\-27\\-152.0128\\-241.2734\\-27\\-152.8169\\-239.3203\\-27\\-153.8602\\-237.3672\\-27\\-154.4958\\-235.4141\\-27\\-155.3438\\-233.4609\\-27\\-156.0213\\-231.5078\\-27\\-156.4186\\-229.5547\\-27\\-157.0416\\-227.6016\\-27\\-157.8212\\-225.6484\\-27\\-158.7436\\-221.7422\\-27\\-159.5262\\-219.7891\\-27\\-160.2935\\-215.8828\\-27\\-160.7281\\-213.9297\\-27\\-161.338\\-211.9766\\-27\\-161.7076\\-210.0234\\-27\\-162.1506\\-206.1172\\-27\\-162.4533\\-202.2109\\-27\\-162.6751\\-200.2578\\-27\\-163.3212\\-196.3516\\-27\\-163.6766\\-192.4453\\-27\\-163.7897\\-190.4922\\-27\\-163.9353\\-184.6328\\-27\\-163.8887\\-176.8203\\-27\\-163.7426\\-172.9141\\-27\\-163.4069\\-169.0078\\-27\\-162.7466\\-165.1016\\-27\\-162.5\\-163.1484\\-27\\-162.1094\\-159.2422\\-27\\-161.5485\\-155.3359\\-27\\-160.3837\\-151.4297\\-27\\-159.9681\\-149.4766\\-27\\-159.3541\\-147.5234\\-27\\-158.475\\-145.5703\\-27\\-157.9241\\-143.6172\\-27\\-157.0805\\-141.6641\\-27\\-156.3631\\-139.7109\\-27\\-155.8436\\-137.7578\\-27\\-154.8598\\-135.8047\\-27\\-154.1616\\-133.8516\\-27\\-153.3203\\-131.912\\-27\\-151.5026\\-127.9922\\-27\\-150.4456\\-126.0391\\-27\\-149.6857\\-124.0859\\-27\\-148.6013\\-122.1328\\-27\\-147.7841\\-120.1797\\-27\\-146.5599\\-118.2266\\-27\\-145.5454\\-116.2734\\-27\\-143.5547\\-112.9492\\-27\\-143.1372\\-112.3672\\-27\\-142.3494\\-110.4141\\-27\\-141.0445\\-108.4609\\-27\\-139.8778\\-106.5078\\-27\\-136.993\\-102.6016\\-27\\-135.7422\\-100.7569\\-27\\-134.1122\\-98.69531\\-27\\-131.8359\\-96.24366\\-27\\-129.8828\\-94.35909\\-27\\-127.9297\\-92.67435\\-27\\-125.6206\\-90.88281\\-27\\-122.0703\\-88.37466\\-27\\-120.1172\\-87.40148\\-27\\-118.1641\\-86.286\\-27\\-115.5543\\-85.02344\\-27\\-114.2578\\-84.57046\\-27\\-110.3516\\-82.77655\\-27\\-108.3984\\-82.1263\\-27\\-106.4453\\-81.73502\\-27\\-104.4922\\-80.67136\\-27\\-102.5391\\-80.30242\\-27\\-100.5859\\-79.54028\\-27\\-96.67969\\-78.25393\\-27\\-94.72656\\-77.69204\\-27\\-90.82031\\-76.71568\\-27\\-88.86719\\-76.31749\\-27\\-86.91406\\-76.12515\\-27\\-83.00781\\-75.87694\\-27\\-81.05469\\-75.67149\\-27\\-79.10156\\-74.82813\\-27\\-77.14844\\-74.75835\\-27\\-73.24219\\-74.44506\\-27\\-71.28906\\-74.49052\\-27\\-67.38281\\-74.42866\\-27\\-57.61719\\-74.35962\\-27\\-53.71094\\-74.41637\\-27\\-45.89844\\-74.73466\\-27\\-43.94531\\-74.85397\\-27\\-41.99219\\-75.08971\\-27\\-40.03906\\-75.57171\\-27\\-32.22656\\-76.43783\\-27\\-30.27344\\-76.81643\\-27\\-28.32031\\-77.50666\\-27\\-24.41406\\-78.70708\\-27\\-22.46094\\-79.62877\\-27\\-20.50781\\-80.26722\\-27\\-18.55469\\-81.04333\\-27\\-14.64844\\-83.0463\\-27\\-12.69531\\-84.29932\\-27\\-8.789063\\-87.7002\\-27\\-6.970994\\-88.92969\\-27\\-2.929688\\-92.25231\\-27\\-0.9765625\\-93.55381\\-27\\0.9765625\\-93.85418\\-27\\2.929688\\-93.34627\\-27\\4.882813\\-92.03206\\-27\\12.69531\\-84.33287\\-27\\14.64844\\-82.64539\\-27\\16.60156\\-81.6553\\-27\\18.55469\\-80.24549\\-27\\22.46094\\-78.24741\\-27\\26.36719\\-76.56604\\-27\\30.27344\\-75.62231\\-27\\32.22656\\-74.77671\\-27\\36.13281\\-74.24574\\-27\\38.39518\\-73.30469\\-27\\40.03906\\-72.75057\\-27\\41.99219\\-72.66914\\-27\\43.94531\\-71.71909\\-27\\45.89844\\-71.63816\\-27\\47.85156\\-71.69682\\-27\\53.71094\\-71.63196\\-27\\61.52344\\-71.73242\\-27\\63.47656\\-72.02295\\-27\\65.42969\\-72.56403\\-27\\67.38281\\-72.66914\\-27\\73.24219\\-72.84272\\-27\\75.19531\\-73.00072\\-27\\77.14844\\-74.22894\\-27\\79.10156\\-74.3286\\-27\\83.00781\\-74.64068\\-27\\84.96094\\-74.92454\\-27\\86.91406\\-75.60368\\-27\\88.86719\\-75.91085\\-27\\92.77344\\-76.42125\\-27\\94.72656\\-76.97521\\-27\\96.67969\\-77.65826\\-27\\100.5859\\-78.84925\\-27\\102.5391\\-79.70869\\-27\\104.4922\\-80.23418\\-27\\106.4453\\-80.8602\\-27\\108.3984\\-81.77873\\-27\\110.3516\\-82.37189\\-27\\112.3047\\-83.37338\\-27\\114.2578\\-84.2455\\-27\\116.2109\\-85.44483\\-27\\118.1641\\-86.31541\\-27\\120.1172\\-87.55215\\-27\\122.0703\\-88.37653\\-27\\124.0234\\-89.76409\\-27\\125.9766\\-91.26148\\-27\\127.9297\\-92.62424\\-27\\129.8828\\-94.11724\\-27\\131.8359\\-95.96245\\-27\\134.3068\\-98.69531\\-27\\135.7843\\-100.6484\\-27\\136.9308\\-102.6016\\-27\\137.6953\\-103.621\\-27\\141.6016\\-109.83\\-27\\142.0181\\-110.4141\\-27\\142.793\\-112.3672\\-27\\143.9359\\-114.3203\\-27\\144.7254\\-116.2734\\-27\\145.8997\\-118.2266\\-27\\146.7166\\-120.1797\\-27\\147.8422\\-122.1328\\-27\\149.2959\\-126.0391\\-27\\150.1703\\-127.9922\\-27\\150.7648\\-129.9453\\-27\\151.7358\\-131.8984\\-27\\152.4041\\-133.8516\\-27\\154.0259\\-137.7578\\-27\\154.5006\\-139.7109\\-27\\155.849\\-143.6172\\-27\\156.5496\\-147.5234\\-27\\157.0838\\-149.4766\\-27\\157.7319\\-151.4297\\-27\\158.3995\\-155.3359\\-27\\158.8003\\-157.2891\\-27\\159.3667\\-159.2422\\-27\\159.7416\\-161.1953\\-27\\160.614\\-169.0078\\-27\\161.3752\\-174.8672\\-27\\161.6649\\-178.7734\\-27\\161.8098\\-182.6797\\-27\\161.8891\\-188.5391\\-27\\161.9152\\-194.3984\\-27\\161.849\\-200.2578\\-27\\161.7658\\-204.1641\\-27\\161.5761\\-208.0703\\-27\\161.1854\\-211.9766\\-27\\160.8568\\-213.9297\\-27\\159.8394\\-221.7422\\-27\\159.4727\\-223.6953\\-27\\158.8369\\-225.6484\\-27\\157.941\\-229.5547\\-27\\157.2787\\-231.5078\\-27\\156.5104\\-233.4609\\-27\\156.0923\\-235.4141\\-27\\155.375\\-237.3672\\-27\\154.4675\\-239.3203\\-27\\153.7379\\-241.2734\\-27\\152.4841\\-243.2266\\-27\\151.4206\\-245.1797\\-27\\147.9388\\-251.0391\\-27\\145.5078\\-254.1655\\-27\\144.7921\\-254.9453\\-27\\139.8907\\-260.8047\\-27\\137.8764\\-262.7578\\-27\\133.9688\\-266.6641\\-27\\131.7336\\-268.6172\\-27\\127.9297\\-271.7846\\-27\\125.9766\\-273.4821\\-27\\124.0234\\-275.0316\\-27\\120.1172\\-277.5838\\-27\\118.1641\\-279.0958\\-27\\116.2109\\-280.4068\\-27\\114.2578\\-281.4917\\-27\\112.3047\\-282.7036\\-27\\110.3516\\-283.5383\\-27\\108.3984\\-284.8094\\-27\\106.4453\\-285.7039\\-27\\104.4922\\-286.8878\\-27\\102.5391\\-287.6536\\-27\\100.5859\\-288.6866\\-27\\98.63281\\-289.2328\\-27\\96.67969\\-289.9108\\-27\\94.72656\\-290.8036\\-27\\92.77344\\-291.34\\-27\\90.82031\\-292.1768\\-27\\88.86719\\-292.8079\\-27\\84.96094\\-293.7637\\-27\\83.00781\\-294.3378\\-27\\81.05469\\-294.6848\\-27\\79.10156\\-294.8961\\-27\\73.24219\\-295.2669\\-27\\69.33594\\-295.3585\\-27\\65.42969\\-295.2625\\-27\\61.52344\\-295.0682\\-27\\57.61719\\-294.764\\-27\\53.71094\\-294.2256\\-27\\51.75781\\-293.6643\\-27\\49.80469\\-293.2211\\-27\\45.89844\\-292.5848\\-27\\43.94531\\-292.1355\\-27\\41.99219\\-291.5695\\-27\\38.08594\\-291.0346\\-27\\32.22656\\-290.5131\\-27\\30.27344\\-290.4834\\-27\\26.36719\\-290.6189\\-27\\24.41406\\-290.7654\\-27\\18.55469\\-291.3366\\-27\\14.64844\\-291.8683\\-27\\12.69531\\-292.2303\\-27\\10.74219\\-292.4866\\-27\\6.835938\\-292.8392\\-27\\2.929688\\-293.0593\\-27\\-2.929688\\-293.2325\\-27\\-8.789063\\-293.2798\\-27\\-12.69531\\-293.214\\-27\\-16.60156\\-293.0754\\-27\\-18.55469\\-292.9471\\-27\\-22.46094\\-292.9138\\-27\\-30.27344\\-292.6747\\-27\\-32.22656\\-292.5889\\-27\\-38.08594\\-292.5077\\-27\\-41.99219\\-292.7846\\-27\\-45.89844\\-293.3707\\-27\\-49.80469\\-294.4049\\-27\\-51.75781\\-294.7054\\-27\\-57.61719\\-295.4112\\-27\\-61.52344\\-296.263\\-27\\-63.47656\\-296.566\\-27\\-67.38281\\-296.8853\\-27\\-71.28906\\-297.0524\\-27\\-73.24219\\-297.0762\\-27\\-77.14844\\-296.9886\\-27\\-81.05469\\-296.7497\\-27\\-83.00781\\-296.5457\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "289" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "113" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-296.1869\\-25\\-84.96094\\-295.6566\\-25\\-88.86719\\-294.9783\\-25\\-90.82031\\-294.5595\\-25\\-96.67969\\-292.3607\\-25\\-98.63281\\-291.2639\\-25\\-100.5859\\-290.5131\\-25\\-102.5391\\-289.3434\\-25\\-104.4922\\-288.6571\\-25\\-106.4453\\-287.4714\\-25\\-108.3984\\-286.5054\\-25\\-111.7188\\-284.2422\\-25\\-112.3047\\-283.7743\\-25\\-114.2578\\-282.8272\\-25\\-117.8416\\-280.3359\\-25\\-120.1172\\-278.8175\\-25\\-124.0234\\-275.74\\-25\\-127.9297\\-272.7145\\-25\\-131.8359\\-269.1887\\-25\\-133.7891\\-267.3219\\-25\\-136.2267\\-264.7109\\-25\\-139.6484\\-260.7629\\-25\\-142.6237\\-256.8984\\-25\\-144.0398\\-254.9453\\-25\\-145.1939\\-252.9922\\-25\\-147.9256\\-249.0859\\-25\\-148.7399\\-247.1328\\-25\\-149.9353\\-245.1797\\-25\\-150.6531\\-243.2266\\-25\\-151.8291\\-241.2734\\-25\\-152.5865\\-239.3203\\-25\\-153.6591\\-237.3672\\-25\\-155.0202\\-233.4609\\-25\\-155.862\\-231.5078\\-25\\-156.7415\\-227.6016\\-25\\-157.5834\\-225.6484\\-25\\-158.0897\\-223.6953\\-25\\-158.4806\\-221.7422\\-25\\-159.7667\\-217.8359\\-25\\-160.4912\\-213.9297\\-25\\-161.4873\\-210.0234\\-25\\-161.814\\-208.0703\\-25\\-162.1804\\-204.1641\\-25\\-162.4656\\-200.2578\\-25\\-162.6646\\-198.3047\\-25\\-163.3954\\-192.4453\\-25\\-163.5459\\-190.4922\\-25\\-163.7426\\-184.6328\\-25\\-163.75\\-180.7266\\-25\\-163.7042\\-176.8203\\-25\\-163.6136\\-174.8672\\-25\\-163.2957\\-170.9609\\-25\\-162.6994\\-167.0547\\-25\\-162.4826\\-165.1016\\-25\\-161.9486\\-159.2422\\-25\\-161.6498\\-157.2891\\-25\\-161.2009\\-155.3359\\-25\\-160.5808\\-153.3828\\-25\\-159.7129\\-149.4766\\-25\\-158.8653\\-147.5234\\-25\\-157.6666\\-143.6172\\-25\\-156.6992\\-141.6641\\-25\\-155.5577\\-137.7578\\-25\\-154.5911\\-135.8047\\-25\\-153.9292\\-133.8516\\-25\\-152.9391\\-131.8984\\-25\\-152.1846\\-129.9453\\-25\\-151.1193\\-127.9922\\-25\\-150.2924\\-126.0391\\-25\\-148.456\\-122.1328\\-25\\-147.4609\\-120.1917\\-25\\-145.5078\\-116.7859\\-25\\-145.1407\\-116.2734\\-25\\-144.1794\\-114.3203\\-25\\-142.946\\-112.3672\\-25\\-142.1862\\-110.4141\\-25\\-140.8386\\-108.4609\\-25\\-137.6953\\-103.7409\\-25\\-135.7422\\-101.0298\\-25\\-133.9072\\-98.69531\\-25\\-131.8359\\-96.39447\\-25\\-129.8828\\-94.47379\\-25\\-127.9206\\-92.83594\\-25\\-124.0234\\-89.82047\\-25\\-122.0703\\-88.44859\\-25\\-120.1172\\-87.7292\\-25\\-118.1641\\-86.41946\\-25\\-116.2109\\-85.58845\\-25\\-115.1968\\-85.02344\\-25\\-110.3516\\-82.80831\\-25\\-108.3984\\-82.17838\\-25\\-106.4453\\-81.75262\\-25\\-104.4922\\-80.68552\\-25\\-102.5391\\-80.31606\\-25\\-100.5859\\-79.49772\\-25\\-94.72656\\-77.63586\\-25\\-90.82031\\-76.69875\\-25\\-88.86719\\-76.29457\\-25\\-83.00781\\-75.84247\\-25\\-81.05469\\-75.61104\\-25\\-79.10156\\-74.76575\\-25\\-73.24219\\-74.37396\\-25\\-71.28906\\-74.44813\\-25\\-63.47656\\-74.33484\\-25\\-55.66406\\-74.30492\\-25\\-53.71094\\-74.32293\\-25\\-45.89844\\-74.60457\\-25\\-41.99219\\-74.90744\\-25\\-40.03906\\-75.18204\\-25\\-38.08594\\-75.62231\\-25\\-32.22656\\-76.31856\\-25\\-30.27344\\-76.63612\\-25\\-24.41406\\-78.53015\\-25\\-22.46094\\-79.36846\\-25\\-18.55469\\-80.81614\\-25\\-16.60156\\-81.8512\\-25\\-14.64844\\-82.6872\\-25\\-14.19975\\-83.07031\\-25\\-11.37251\\-85.02344\\-25\\-8.789063\\-87.15489\\-25\\-6.835938\\-88.66769\\-25\\-4.26794\\-90.88281\\-25\\-2.929688\\-91.93318\\-25\\-0.9765625\\-93.28723\\-25\\0.9765625\\-93.63982\\-25\\2.929688\\-92.95892\\-25\\4.882813\\-91.79717\\-25\\11.87525\\-85.02344\\-25\\12.69531\\-84.17057\\-25\\14.64844\\-82.4688\\-25\\18.55469\\-80.14697\\-25\\20.50781\\-79.04199\\-25\\22.46094\\-78.11472\\-25\\26.36719\\-76.4583\\-25\\30.27344\\-75.52155\\-25\\32.22656\\-74.687\\-25\\36.13281\\-74.16672\\-25\\38.08594\\-72.83385\\-25\\41.99219\\-72.64184\\-25\\43.94531\\-71.67709\\-25\\45.89844\\-71.62911\\-25\\47.85156\\-71.69336\\-25\\53.71094\\-71.64548\\-25\\63.47656\\-71.74829\\-25\\65.42969\\-72.3988\\-25\\67.38281\\-72.65535\\-25\\73.24219\\-72.83385\\-25\\75.19531\\-72.97916\\-25\\77.14844\\-74.22894\\-25\\81.05469\\-74.44297\\-25\\83.00781\\-74.609\\-25\\84.96094\\-74.88397\\-25\\86.91406\\-75.61476\\-25\\92.77344\\-76.45742\\-25\\94.72656\\-76.98714\\-25\\96.67969\\-77.67449\\-25\\100.5859\\-78.87109\\-25\\102.5391\\-79.76456\\-25\\104.4922\\-80.24464\\-25\\106.4453\\-80.88784\\-25\\108.3984\\-81.80393\\-25\\110.3516\\-82.38425\\-25\\112.3047\\-83.39584\\-25\\114.2578\\-84.26757\\-25\\116.2109\\-85.45525\\-25\\118.1641\\-86.33167\\-25\\120.1172\\-87.58292\\-25\\122.0703\\-88.38037\\-25\\124.0234\\-89.79569\\-25\\125.9766\\-91.33504\\-25\\127.9297\\-92.71387\\-25\\129.8828\\-94.35909\\-25\\131.8359\\-96.24366\\-25\\134.1266\\-98.69531\\-25\\135.7422\\-100.8523\\-25\\136.7371\\-102.6016\\-25\\138.0847\\-104.5547\\-25\\139.1763\\-106.5078\\-25\\140.5686\\-108.4609\\-25\\141.7015\\-110.4141\\-25\\142.5969\\-112.3672\\-25\\146.4563\\-120.1797\\-25\\147.4687\\-122.1328\\-25\\148.3191\\-124.0859\\-25\\148.9639\\-126.0391\\-25\\149.9449\\-127.9922\\-25\\150.5177\\-129.9453\\-25\\152.1692\\-133.8516\\-25\\152.8383\\-135.8047\\-25\\153.7781\\-137.7578\\-25\\154.8357\\-141.6641\\-25\\155.58\\-143.6172\\-25\\156.068\\-145.5703\\-25\\156.7223\\-149.4766\\-25\\157.4136\\-151.4297\\-25\\157.8863\\-153.3828\\-25\\158.4987\\-157.2891\\-25\\158.9054\\-159.2422\\-25\\159.4727\\-161.1953\\-25\\159.7827\\-163.1484\\-25\\160.7723\\-172.9141\\-25\\161.229\\-176.8203\\-25\\161.401\\-178.7734\\-25\\161.6084\\-182.6797\\-25\\161.6953\\-186.5859\\-25\\161.72\\-194.3984\\-25\\161.6615\\-200.2578\\-25\\161.53\\-204.1641\\-25\\161.2968\\-208.0703\\-25\\160.5504\\-213.9297\\-25\\160.1214\\-217.8359\\-25\\159.6051\\-221.7422\\-25\\158.5053\\-225.6484\\-25\\157.6885\\-229.5547\\-25\\156.8483\\-231.5078\\-25\\155.8789\\-235.4141\\-25\\154.9769\\-237.3672\\-25\\154.2239\\-239.3203\\-25\\153.3203\\-241.2614\\-25\\151.3672\\-244.5957\\-25\\150.9447\\-245.1797\\-25\\150.0165\\-247.1328\\-25\\148.6914\\-249.0859\\-25\\147.4693\\-251.0391\\-25\\146.0785\\-252.9922\\-25\\143.5547\\-256.0648\\-25\\139.6484\\-260.4366\\-25\\135.3441\\-264.7109\\-25\\131.8359\\-268.0481\\-25\\128.9597\\-270.5703\\-25\\125.9766\\-273.0498\\-25\\124.0234\\-274.5186\\-25\\122.0703\\-275.8271\\-25\\118.1641\\-278.6379\\-25\\116.2109\\-279.8409\\-25\\114.2578\\-281.1827\\-25\\112.0914\\-282.2891\\-25\\106.4453\\-285.306\\-25\\104.4922\\-286.4793\\-25\\102.5391\\-287.2939\\-25\\100.5859\\-288.2188\\-25\\98.63281\\-288.9794\\-25\\96.67969\\-289.4652\\-25\\94.72656\\-290.4206\\-25\\90.82031\\-291.5725\\-25\\88.86719\\-292.4706\\-25\\86.91406\\-292.9665\\-25\\84.96094\\-293.3511\\-25\\81.05469\\-294.3707\\-25\\79.10156\\-294.6447\\-25\\75.19531\\-294.9725\\-25\\73.24219\\-295.0499\\-25\\67.38281\\-295.123\\-25\\63.47656\\-295.0022\\-25\\59.57031\\-294.7713\\-25\\55.66406\\-294.3243\\-25\\51.75781\\-293.4472\\-25\\47.85156\\-292.7254\\-25\\45.89844\\-292.543\\-25\\43.94531\\-292.1494\\-25\\41.99219\\-291.6398\\-25\\38.08594\\-291.137\\-25\\34.17969\\-290.9032\\-25\\30.27344\\-290.8778\\-25\\26.36719\\-291.0527\\-25\\22.46094\\-291.437\\-25\\20.50781\\-291.7408\\-25\\16.60156\\-292.4636\\-25\\10.74219\\-293.0424\\-25\\6.835938\\-293.3712\\-25\\0.9765625\\-293.811\\-25\\-0.9765625\\-293.8951\\-25\\-6.835938\\-293.9999\\-25\\-12.69531\\-293.8672\\-25\\-18.55469\\-293.5361\\-25\\-32.22656\\-292.9692\\-25\\-36.13281\\-292.8693\\-25\\-40.03906\\-292.8768\\-25\\-41.99219\\-292.9764\\-25\\-45.89844\\-293.4701\\-25\\-49.80469\\-294.3513\\-25\\-51.75781\\-294.6321\\-25\\-57.61719\\-295.241\\-25\\-61.52344\\-295.8447\\-25\\-63.47656\\-296.263\\-25\\-67.38281\\-296.6737\\-25\\-73.24219\\-296.8596\\-25\\-77.14844\\-296.7774\\-25\\-81.05469\\-296.4897\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "301" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "114" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-81.05469\\-296.1187\\-23\\-83.00781\\-295.683\\-23\\-88.86719\\-294.7807\\-23\\-90.82031\\-294.2659\\-23\\-92.77344\\-293.4337\\-23\\-94.72656\\-292.843\\-23\\-98.63281\\-291.0425\\-23\\-102.5391\\-289.1779\\-23\\-104.4922\\-288.3926\\-23\\-104.8244\\-288.1484\\-23\\-108.328\\-286.1953\\-23\\-110.3516\\-284.9389\\-23\\-112.3047\\-283.5113\\-23\\-114.2578\\-282.5776\\-23\\-116.2109\\-281.2621\\-23\\-118.1641\\-279.7878\\-23\\-120.2098\\-278.3828\\-23\\-122.8896\\-276.4297\\-23\\-125.9766\\-273.9492\\-23\\-127.6474\\-272.5234\\-23\\-129.8828\\-270.4932\\-23\\-131.8359\\-268.8885\\-23\\-133.7891\\-267.0475\\-23\\-135.9566\\-264.7109\\-23\\-137.5394\\-262.7578\\-23\\-139.6484\\-260.4245\\-23\\-142.445\\-256.8984\\-23\\-143.8042\\-254.9453\\-23\\-144.9418\\-252.9922\\-23\\-147.7141\\-249.0859\\-23\\-148.6145\\-247.1328\\-23\\-149.7372\\-245.1797\\-23\\-150.5024\\-243.2266\\-23\\-151.6029\\-241.2734\\-23\\-152.3965\\-239.3203\\-23\\-153.4442\\-237.3672\\-23\\-154.1741\\-235.4141\\-23\\-154.8049\\-233.4609\\-23\\-155.6792\\-231.5078\\-23\\-156.179\\-229.5547\\-23\\-156.5341\\-227.6016\\-23\\-157.2932\\-225.6484\\-23\\-157.9174\\-223.6953\\-23\\-158.3003\\-221.7422\\-23\\-158.8056\\-219.7891\\-23\\-159.5567\\-217.8359\\-23\\-160.295\\-213.9297\\-23\\-160.7134\\-211.9766\\-23\\-161.2438\\-210.0234\\-23\\-161.6431\\-208.0703\\-23\\-162.0564\\-204.1641\\-23\\-162.4451\\-198.3047\\-23\\-163.1851\\-190.4922\\-23\\-163.4513\\-186.5859\\-23\\-163.5264\\-180.7266\\-23\\-163.4294\\-176.8203\\-23\\-163.3085\\-174.8672\\-23\\-162.4451\\-167.0547\\-23\\-161.991\\-161.1953\\-23\\-161.7615\\-159.2422\\-23\\-161.3909\\-157.2891\\-23\\-160.8028\\-155.3359\\-23\\-159.9375\\-151.4297\\-23\\-159.3914\\-149.4766\\-23\\-158.5342\\-147.5234\\-23\\-158.0191\\-145.5703\\-23\\-156.4559\\-141.6641\\-23\\-155.9933\\-139.7109\\-23\\-154.3893\\-135.8047\\-23\\-153.7044\\-133.8516\\-23\\-152.6712\\-131.8984\\-23\\-151.9355\\-129.9453\\-23\\-150.797\\-127.9922\\-23\\-150.0796\\-126.0391\\-23\\-148.9808\\-124.0859\\-23\\-148.2919\\-122.1328\\-23\\-147.0886\\-120.1797\\-23\\-146.1298\\-118.2266\\-23\\-144.892\\-116.2734\\-23\\-143.9779\\-114.3203\\-23\\-142.7901\\-112.3672\\-23\\-141.9573\\-110.4141\\-23\\-138.045\\-104.5547\\-23\\-135.7422\\-101.2788\\-23\\-133.7891\\-98.81622\\-23\\-131.8359\\-96.55808\\-23\\-129.8828\\-94.57115\\-23\\-125.24\\-90.88281\\-23\\-122.0703\\-88.55238\\-23\\-120.1172\\-87.78625\\-23\\-118.1641\\-86.52734\\-23\\-116.2109\\-85.69441\\-23\\-114.2578\\-84.57954\\-23\\-110.6934\\-83.07031\\-23\\-108.3984\\-82.19012\\-23\\-106.4453\\-81.72587\\-23\\-104.4922\\-80.70789\\-23\\-102.5391\\-80.33002\\-23\\-100.5859\\-79.41032\\-23\\-98.63281\\-78.88223\\-23\\-94.72656\\-77.63586\\-23\\-88.86719\\-76.28901\\-23\\-83.00781\\-75.72252\\-23\\-81.05469\\-74.97059\\-23\\-79.10156\\-74.7218\\-23\\-73.24219\\-74.3419\\-23\\-71.28906\\-74.39722\\-23\\-67.38281\\-74.32293\\-23\\-59.57031\\-74.23502\\-23\\-53.71094\\-74.24616\\-23\\-45.89844\\-74.53656\\-23\\-41.99219\\-74.76256\\-23\\-40.03906\\-74.94501\\-23\\-38.08594\\-75.44561\\-23\\-36.13281\\-75.77822\\-23\\-32.22656\\-76.22308\\-23\\-30.27344\\-76.5303\\-23\\-28.32031\\-77.03655\\-23\\-22.46094\\-79.06932\\-23\\-20.50781\\-79.95673\\-23\\-18.55469\\-80.67017\\-23\\-16.60156\\-81.73158\\-23\\-14.64844\\-82.47199\\-23\\-10.9933\\-85.02344\\-23\\-8.789063\\-86.8316\\-23\\-6.389293\\-88.92969\\-23\\-2.929688\\-91.72069\\-23\\-0.9765625\\-92.91303\\-23\\0.9765625\\-93.32107\\-23\\2.929688\\-92.52113\\-23\\4.882813\\-91.45528\\-23\\8.789063\\-87.88151\\-23\\11.74852\\-85.02344\\-23\\12.69531\\-84.02809\\-23\\14.64844\\-82.30927\\-23\\16.60156\\-81.02767\\-23\\18.55469\\-80.07264\\-23\\20.50781\\-78.92834\\-23\\24.41406\\-77.11098\\-23\\26.36719\\-76.36038\\-23\\28.32031\\-75.93956\\-23\\30.27344\\-75.10057\\-23\\32.22656\\-74.61341\\-23\\36.13281\\-74.11349\\-23\\38.08594\\-72.79101\\-23\\41.99219\\-71.74009\\-23\\43.94531\\-71.63816\\-23\\47.85156\\-71.62061\\-23\\49.80469\\-71.66751\\-23\\53.71094\\-71.62921\\-23\\55.66406\\-71.68997\\-23\\61.52344\\-71.72865\\-23\\65.42969\\-71.78898\\-23\\67.38281\\-72.58311\\-23\\73.24219\\-72.82507\\-23\\75.19531\\-72.95817\\-23\\77.14844\\-74.24056\\-23\\81.05469\\-74.41637\\-23\\84.96094\\-74.87173\\-23\\86.91406\\-75.59244\\-23\\92.77344\\-76.48153\\-23\\94.72656\\-77.02393\\-23\\98.63281\\-78.23688\\-23\\100.5859\\-78.92834\\-23\\102.5391\\-79.79702\\-23\\104.4922\\-80.26126\\-23\\106.4453\\-80.92793\\-23\\108.3984\\-81.81205\\-23\\110.3516\\-82.39703\\-23\\112.3047\\-83.42482\\-23\\114.2578\\-84.29376\\-23\\116.2109\\-85.49192\\-23\\118.1641\\-86.34395\\-23\\120.1172\\-87.60435\\-23\\122.0703\\-88.4175\\-23\\124.0234\\-89.85712\\-23\\125.9766\\-91.42182\\-23\\127.9297\\-92.79838\\-23\\129.8828\\-94.47379\\-23\\131.8359\\-96.37051\\-23\\133.8778\\-98.69531\\-23\\135.7422\\-101.163\\-23\\137.8338\\-104.5547\\-23\\138.9292\\-106.5078\\-23\\140.3623\\-108.4609\\-23\\141.3156\\-110.4141\\-23\\142.443\\-112.3672\\-23\\143.2147\\-114.3203\\-23\\144.2734\\-116.2734\\-23\\145.1239\\-118.2266\\-23\\146.2402\\-120.1797\\-23\\147.1102\\-122.1328\\-23\\148.11\\-124.0859\\-23\\148.7229\\-126.0391\\-23\\149.6452\\-127.9922\\-23\\150.9221\\-131.8984\\-23\\151.931\\-133.8516\\-23\\152.5934\\-135.8047\\-23\\153.4433\\-137.7578\\-23\\154.096\\-139.7109\\-23\\154.5917\\-141.6641\\-23\\155.8838\\-145.5703\\-23\\156.4927\\-149.4766\\-23\\156.9896\\-151.4297\\-23\\157.6613\\-153.3828\\-23\\158.0164\\-155.3359\\-23\\158.5904\\-159.2422\\-23\\159.5262\\-163.1484\\-23\\159.8045\\-165.1016\\-23\\160.6599\\-174.8672\\-23\\161.0508\\-178.7734\\-23\\161.349\\-182.6797\\-23\\161.4849\\-188.5391\\-23\\161.4957\\-196.3516\\-23\\161.4128\\-200.2578\\-23\\161.2283\\-204.1641\\-23\\160.9276\\-208.0703\\-23\\160.1313\\-215.8828\\-23\\159.6593\\-219.7891\\-23\\159.2605\\-221.7422\\-23\\158.6561\\-223.6953\\-23\\157.9061\\-227.6016\\-23\\157.3073\\-229.5547\\-23\\156.5496\\-231.5078\\-23\\156.1671\\-233.4609\\-23\\155.606\\-235.4141\\-23\\154.6497\\-237.3672\\-23\\153.996\\-239.3203\\-23\\152.8611\\-241.2734\\-23\\151.9104\\-243.2266\\-23\\150.5896\\-245.1797\\-23\\149.6601\\-247.1328\\-23\\148.4058\\-249.0859\\-23\\145.6586\\-252.9922\\-23\\143.5547\\-255.6208\\-23\\140.6864\\-258.8516\\-23\\137.6953\\-261.9723\\-23\\134.918\\-264.7109\\-23\\131.8359\\-267.6342\\-23\\128.3897\\-270.5703\\-23\\124.0234\\-274.0016\\-23\\120.1172\\-276.8511\\-23\\118.1641\\-278.0072\\-23\\114.2578\\-280.8176\\-23\\112.3047\\-281.7414\\-23\\110.3516\\-282.9337\\-23\\108.3984\\-283.7375\\-23\\106.4453\\-284.9236\\-23\\104.4922\\-285.8653\\-23\\102.5391\\-286.9777\\-23\\100.5859\\-287.6831\\-23\\98.63281\\-288.6829\\-23\\96.67969\\-289.1897\\-23\\94.72656\\-289.8093\\-23\\92.77344\\-290.7325\\-23\\90.82031\\-291.2213\\-23\\86.91406\\-292.6757\\-23\\83.00781\\-293.4161\\-23\\79.10156\\-294.3333\\-23\\77.14844\\-294.5962\\-23\\75.19531\\-294.7595\\-23\\71.28906\\-294.9259\\-23\\65.42969\\-294.9079\\-23\\61.52344\\-294.7358\\-23\\57.61719\\-294.3599\\-23\\53.71094\\-293.6132\\-23\\49.80469\\-293.0012\\-23\\47.85156\\-292.6009\\-23\\45.89844\\-292.5255\\-23\\43.94531\\-292.1768\\-23\\41.99219\\-291.7159\\-23\\40.03906\\-291.4317\\-23\\38.08594\\-291.2683\\-23\\34.17969\\-291.117\\-23\\30.27344\\-291.1763\\-23\\26.36719\\-291.4958\\-23\\22.46094\\-292.2904\\-23\\20.50781\\-292.5797\\-23\\12.69531\\-293.3869\\-23\\8.789063\\-293.9834\\-23\\6.835938\\-294.2256\\-23\\2.929688\\-294.4865\\-23\\-0.9765625\\-294.6159\\-23\\-8.789063\\-294.6447\\-23\\-10.74219\\-294.6074\\-23\\-18.55469\\-294.3489\\-23\\-24.41406\\-293.9846\\-23\\-28.32031\\-293.6186\\-23\\-32.22656\\-293.351\\-23\\-38.08594\\-293.1279\\-23\\-41.99219\\-293.194\\-23\\-43.94531\\-293.3399\\-23\\-45.89844\\-293.5977\\-23\\-49.80469\\-294.3265\\-23\\-51.75781\\-294.5739\\-23\\-57.61719\\-295.1033\\-23\\-61.52344\\-295.5262\\-23\\-67.38281\\-296.4201\\-23\\-73.24219\\-296.6445\\-23\\-77.14844\\-296.5372\\-23\\-79.10156\\-296.387\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "285" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "115" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-77.14844\\-296.1187\\-21\\-83.00781\\-295.3458\\-21\\-86.91406\\-294.8897\\-21\\-88.86719\\-294.5248\\-21\\-92.77344\\-293.1357\\-21\\-94.72656\\-292.5684\\-21\\-96.67969\\-291.5215\\-21\\-98.63281\\-290.8203\\-21\\-100.5859\\-289.6907\\-21\\-102.5391\\-289.0212\\-21\\-106.4453\\-287.0025\\-21\\-108.3984\\-285.7361\\-21\\-110.3516\\-284.6523\\-21\\-112.3047\\-283.302\\-21\\-114.1168\\-282.2891\\-21\\-116.2109\\-281.011\\-21\\-117.0221\\-280.3359\\-21\\-120.1172\\-278.0157\\-21\\-122.0703\\-276.7481\\-21\\-124.0234\\-275.2773\\-21\\-127.3095\\-272.5234\\-21\\-133.7967\\-266.6641\\-21\\-137.2878\\-262.7578\\-21\\-140.7175\\-258.8516\\-21\\-142.2637\\-256.8984\\-21\\-144.7393\\-252.9922\\-21\\-146.189\\-251.0391\\-21\\-147.4609\\-249.0311\\-21\\-148.4911\\-247.1328\\-21\\-152.2111\\-239.3203\\-21\\-154.0154\\-235.4141\\-21\\-154.6123\\-233.4609\\-21\\-155.4184\\-231.5078\\-21\\-156.0535\\-229.5547\\-21\\-156.3985\\-227.6016\\-21\\-156.9245\\-225.6484\\-21\\-157.7234\\-223.6953\\-21\\-158.5673\\-219.7891\\-21\\-159.7786\\-215.8828\\-21\\-160.4949\\-211.9766\\-21\\-161.3909\\-208.0703\\-21\\-161.7163\\-206.1172\\-21\\-161.92\\-204.1641\\-21\\-162.3204\\-198.3047\\-21\\-162.8862\\-188.5391\\-21\\-163.0466\\-186.5859\\-21\\-163.1995\\-180.7266\\-21\\-162.9024\\-174.8672\\-21\\-162.5784\\-170.9609\\-21\\-162.1804\\-165.1016\\-21\\-161.8103\\-161.1953\\-21\\-161.5115\\-159.2422\\-21\\-160.4875\\-155.3359\\-21\\-159.7024\\-151.4297\\-21\\-158.917\\-149.4766\\-21\\-158.2905\\-147.5234\\-21\\-157.7691\\-145.5703\\-21\\-156.8346\\-143.6172\\-21\\-155.7342\\-139.7109\\-21\\-154.8462\\-137.7578\\-21\\-154.1776\\-135.8047\\-21\\-153.3579\\-133.8516\\-21\\-152.427\\-131.8984\\-21\\-151.6281\\-129.9453\\-21\\-150.5726\\-127.9922\\-21\\-149.8473\\-126.0391\\-21\\-148.778\\-124.0859\\-21\\-148.0801\\-122.1328\\-21\\-146.8418\\-120.1797\\-21\\-145.8839\\-118.2266\\-21\\-144.6649\\-116.2734\\-21\\-143.7124\\-114.3203\\-21\\-141.6254\\-110.4141\\-21\\-140.473\\-108.4609\\-21\\-139.0118\\-106.5078\\-21\\-136.5145\\-102.6016\\-21\\-135.0338\\-100.6484\\-21\\-131.8359\\-96.78658\\-21\\-129.8828\\-94.78027\\-21\\-125.0895\\-90.88281\\-21\\-122.0703\\-88.6875\\-21\\-120.1172\\-87.83181\\-21\\-118.1641\\-86.61462\\-21\\-116.2109\\-85.73784\\-21\\-114.2578\\-84.6365\\-21\\-108.3984\\-82.15314\\-21\\-106.4453\\-81.68965\\-21\\-104.4922\\-80.68552\\-21\\-102.5391\\-80.31123\\-21\\-100.5859\\-79.37822\\-21\\-94.72656\\-77.68853\\-21\\-92.77344\\-77.25096\\-21\\-90.82031\\-76.6851\\-21\\-88.86719\\-76.24785\\-21\\-83.00781\\-75.68506\\-21\\-81.05469\\-74.8816\\-21\\-77.14844\\-74.52539\\-21\\-73.24219\\-74.32977\\-21\\-69.33594\\-74.26955\\-21\\-65.42969\\-74.2636\\-21\\-59.57031\\-74.18359\\-21\\-51.75781\\-74.24574\\-21\\-43.94531\\-74.52856\\-21\\-40.03906\\-74.79448\\-21\\-38.08594\\-75.05605\\-21\\-36.13281\\-75.64707\\-21\\-30.27344\\-76.4057\\-21\\-28.32031\\-76.85523\\-21\\-24.41406\\-78.16466\\-21\\-22.46094\\-78.87109\\-21\\-20.50781\\-79.83019\\-21\\-18.55469\\-80.53776\\-21\\-16.60156\\-81.6553\\-21\\-14.64844\\-82.35244\\-21\\-10.74219\\-84.83707\\-21\\-6.835938\\-88.21122\\-21\\-4.882813\\-90.00185\\-21\\-2.929688\\-91.68066\\-21\\-0.9765625\\-92.41056\\-21\\0.9940011\\-92.83594\\-21\\2.929688\\-92.23036\\-21\\4.882813\\-91.01051\\-21\\6.835938\\-89.26296\\-21\\11.15829\\-85.02344\\-21\\13.4639\\-83.07031\\-21\\16.60156\\-80.84136\\-21\\18.55469\\-79.99664\\-21\\20.50781\\-78.77467\\-21\\24.41406\\-76.93694\\-21\\26.36719\\-76.25269\\-21\\28.32031\\-75.85252\\-21\\30.27344\\-74.94004\\-21\\32.22656\\-74.5238\\-21\\34.17969\\-74.28125\\-21\\36.13281\\-72.87\\-21\\40.03906\\-72.66914\\-21\\41.99219\\-71.76109\\-21\\43.94531\\-71.66691\\-21\\47.85156\\-71.60069\\-21\\55.66406\\-71.68666\\-21\\57.61719\\-71.66444\\-21\\61.52344\\-71.76733\\-21\\67.38281\\-71.72717\\-21\\69.33594\\-72.68324\\-21\\73.24219\\-72.82507\\-21\\75.19531\\-72.9686\\-21\\77.14844\\-74.22894\\-21\\81.05469\\-74.41637\\-21\\84.96094\\-74.85659\\-21\\86.91406\\-75.60609\\-21\\90.82031\\-76.17119\\-21\\92.77344\\-76.50806\\-21\\98.63281\\-78.28681\\-21\\102.5391\\-79.83694\\-21\\104.4922\\-80.30436\\-21\\106.4453\\-80.97108\\-21\\108.3984\\-81.84495\\-21\\110.3516\\-82.4377\\-21\\112.3047\\-83.47012\\-21\\114.2578\\-84.32668\\-21\\116.2109\\-85.52474\\-21\\118.1641\\-86.36077\\-21\\120.1172\\-87.64212\\-21\\122.0703\\-88.46233\\-21\\124.0234\\-89.89426\\-21\\125.9766\\-91.48235\\-21\\127.8363\\-92.83594\\-21\\129.8828\\-94.60189\\-21\\131.8359\\-96.63368\\-21\\133.7891\\-98.95753\\-21\\135.0935\\-100.6484\\-21\\136.473\\-102.6016\\-21\\137.4741\\-104.5547\\-21\\138.7165\\-106.5078\\-21\\140.0832\\-108.4609\\-21\\141.0391\\-110.4141\\-21\\142.2505\\-112.3672\\-21\\142.9542\\-114.3203\\-21\\144.0677\\-116.2734\\-21\\144.8272\\-118.2266\\-21\\145.9837\\-120.1797\\-21\\146.7881\\-122.1328\\-21\\147.8529\\-124.0859\\-21\\148.5103\\-126.0391\\-21\\150.116\\-129.9453\\-21\\150.6553\\-131.8984\\-21\\151.6029\\-133.8516\\-21\\153.0287\\-137.7578\\-21\\153.8826\\-139.7109\\-21\\154.8952\\-143.6172\\-21\\155.6085\\-145.5703\\-21\\156.0584\\-147.5234\\-21\\156.673\\-151.4297\\-21\\157.2932\\-153.3828\\-21\\157.8039\\-155.3359\\-21\\158.339\\-159.2422\\-21\\158.6709\\-161.1953\\-21\\159.5365\\-165.1016\\-21\\159.772\\-167.0547\\-21\\160.1166\\-170.9609\\-21\\160.9134\\-182.6797\\-21\\161.1097\\-188.5391\\-21\\161.1251\\-192.4453\\-21\\160.9809\\-200.2578\\-21\\160.5656\\-208.0703\\-21\\160.1072\\-213.9297\\-21\\159.6934\\-217.8359\\-21\\159.3018\\-219.7891\\-21\\158.7656\\-221.7422\\-21\\158.0404\\-225.6484\\-21\\157.6135\\-227.6016\\-21\\156.8185\\-229.5547\\-21\\155.9602\\-233.4609\\-21\\154.3916\\-237.3672\\-21\\153.6654\\-239.3203\\-21\\152.5018\\-241.2734\\-21\\151.3672\\-243.3808\\-21\\148.0455\\-249.0859\\-21\\143.6406\\-254.9453\\-21\\141.9847\\-256.8984\\-21\\137.6953\\-261.5156\\-21\\134.4329\\-264.7109\\-21\\131.8359\\-267.1523\\-21\\129.8828\\-268.8493\\-21\\125.9766\\-271.8579\\-21\\124.0234\\-273.5369\\-21\\122.0703\\-275.0937\\-21\\120.1172\\-276.2514\\-21\\118.1641\\-277.564\\-21\\116.2109\\-279.0359\\-21\\114.1385\\-280.3359\\-21\\110.3516\\-282.5103\\-21\\108.3984\\-283.3722\\-21\\106.4453\\-284.5298\\-21\\104.4922\\-285.4313\\-21\\102.5391\\-286.5948\\-21\\100.5859\\-287.3155\\-21\\98.63281\\-288.2344\\-21\\96.67969\\-288.9602\\-21\\94.72656\\-289.4161\\-21\\92.77344\\-290.2785\\-21\\90.82031\\-290.935\\-21\\88.86719\\-291.4245\\-21\\86.91406\\-292.2033\\-21\\84.96094\\-292.732\\-21\\81.05469\\-293.4011\\-21\\77.14844\\-294.2003\\-21\\75.19531\\-294.4541\\-21\\71.28906\\-294.6968\\-21\\67.38281\\-294.7521\\-21\\61.52344\\-294.5274\\-21\\57.61719\\-294.0608\\-21\\53.71094\\-293.3901\\-21\\47.85156\\-292.697\\-21\\45.89844\\-292.5255\\-21\\43.94531\\-292.2291\\-21\\41.99219\\-291.8123\\-21\\40.03906\\-291.5941\\-21\\36.13281\\-291.3946\\-21\\32.22656\\-291.4745\\-21\\30.27344\\-291.5818\\-21\\28.32031\\-291.8579\\-21\\24.41406\\-292.6168\\-21\\18.55469\\-293.2652\\-21\\14.64844\\-293.805\\-21\\12.69531\\-294.1484\\-21\\8.789063\\-294.5849\\-21\\4.882813\\-294.8145\\-21\\-0.9765625\\-294.9663\\-21\\-8.789063\\-294.9904\\-21\\-16.60156\\-294.8196\\-21\\-24.41406\\-294.5341\\-21\\-30.27344\\-294.046\\-21\\-32.22656\\-293.8096\\-21\\-36.13281\\-293.5133\\-21\\-40.03906\\-293.4126\\-21\\-41.99219\\-293.4472\\-21\\-45.89844\\-293.7852\\-21\\-49.80469\\-294.3466\\-21\\-53.71094\\-294.7054\\-21\\-61.52344\\-295.2911\\-21\\-65.42969\\-295.7059\\-21\\-67.38281\\-295.969\\-21\\-71.28906\\-296.2389\\-21\\-75.19531\\-296.263\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "298" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "116" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.86719\\-294.2017\\-19\\-90.82031\\-293.4387\\-19\\-92.77344\\-292.8896\\-19\\-94.72656\\-292.1768\\-19\\-96.67969\\-291.2365\\-19\\-98.63281\\-290.5432\\-19\\-100.5859\\-289.4006\\-19\\-102.5391\\-288.8186\\-19\\-104.4922\\-287.6536\\-19\\-106.4453\\-286.761\\-19\\-108.3984\\-285.4243\\-19\\-112.3047\\-283.1163\\-19\\-114.2578\\-281.794\\-19\\-116.2109\\-280.7534\\-19\\-120.1172\\-277.6931\\-19\\-124.0234\\-275.0434\\-19\\-125.9766\\-273.4161\\-19\\-129.2641\\-270.5703\\-19\\-133.421\\-266.6641\\-19\\-137.6953\\-262.1043\\-19\\-138.7579\\-260.8047\\-19\\-140.5094\\-258.8516\\-19\\-142.0506\\-256.8984\\-19\\-143.2166\\-254.9453\\-19\\-144.5368\\-252.9922\\-19\\-145.9863\\-251.0391\\-19\\-147.1052\\-249.0859\\-19\\-148.3244\\-247.1328\\-19\\-149.1277\\-245.1797\\-19\\-150.2179\\-243.2266\\-19\\-150.9698\\-241.2734\\-19\\-152.0594\\-239.3203\\-19\\-152.8289\\-237.3672\\-19\\-153.8503\\-235.4141\\-19\\-154.4356\\-233.4609\\-19\\-155.8966\\-229.5547\\-19\\-156.691\\-225.6484\\-19\\-157.474\\-223.6953\\-19\\-157.9949\\-221.7422\\-19\\-158.8607\\-217.8359\\-19\\-159.5861\\-215.8828\\-19\\-160.6476\\-210.0234\\-19\\-161.5221\\-206.1172\\-19\\-161.7658\\-204.1641\\-19\\-162.0564\\-200.2578\\-19\\-162.2842\\-196.3516\\-19\\-162.495\\-190.4922\\-19\\-162.6779\\-186.5859\\-19\\-162.772\\-180.7266\\-19\\-162.6107\\-174.8672\\-19\\-162.3011\\-169.0078\\-19\\-162.0265\\-165.1016\\-19\\-161.589\\-161.1953\\-19\\-161.1713\\-159.2422\\-19\\-160.6383\\-157.2891\\-19\\-159.8712\\-153.3828\\-19\\-159.3541\\-151.4297\\-19\\-158.5644\\-149.4766\\-19\\-158.0702\\-147.5234\\-19\\-157.4383\\-145.5703\\-19\\-156.5491\\-143.6172\\-19\\-156.1166\\-141.6641\\-19\\-155.4349\\-139.7109\\-19\\-154.5786\\-137.7578\\-19\\-153.9498\\-135.8047\\-19\\-152.9833\\-133.8516\\-19\\-152.1801\\-131.8984\\-19\\-151.2211\\-129.9453\\-19\\-149.5625\\-126.0391\\-19\\-148.6044\\-124.0859\\-19\\-147.8392\\-122.1328\\-19\\-145.5078\\-118.2165\\-19\\-143.3893\\-114.3203\\-19\\-142.4731\\-112.3672\\-19\\-141.3215\\-110.4141\\-19\\-140.2856\\-108.4609\\-19\\-138.7707\\-106.5078\\-19\\-137.5016\\-104.5547\\-19\\-136.3551\\-102.6016\\-19\\-133.7891\\-99.37139\\-19\\-131.8359\\-97.05368\\-19\\-129.8828\\-95.01834\\-19\\-127.3519\\-92.83594\\-19\\-124.0234\\-90.17543\\-19\\-122.0703\\-88.85326\\-19\\-120.1172\\-87.88599\\-19\\-118.1641\\-86.69856\\-19\\-116.2109\\-85.78225\\-19\\-114.2578\\-84.75291\\-19\\-112.3047\\-83.83664\\-19\\-108.3984\\-82.15479\\-19\\-106.4453\\-81.68401\\-19\\-104.4922\\-80.64983\\-19\\-102.5391\\-80.29757\\-19\\-100.5859\\-79.37822\\-19\\-96.67969\\-78.28648\\-19\\-92.77344\\-77.31332\\-19\\-90.82031\\-76.66541\\-19\\-88.86719\\-76.23438\\-19\\-83.00781\\-75.68211\\-19\\-81.05469\\-74.84041\\-19\\-79.10156\\-74.59515\\-19\\-77.14844\\-74.4494\\-19\\-71.28906\\-74.33484\\-19\\-67.38281\\-74.22346\\-19\\-61.52344\\-74.20035\\-19\\-59.57031\\-74.01432\\-19\\-57.61719\\-74.00701\\-19\\-55.66406\\-74.16672\\-19\\-51.75781\\-73.99525\\-19\\-49.80469\\-74.29309\\-19\\-43.94531\\-74.44813\\-19\\-40.03906\\-74.68137\\-19\\-38.08594\\-74.90201\\-19\\-34.17969\\-75.78758\\-19\\-30.27344\\-76.31856\\-19\\-28.32031\\-76.68461\\-19\\-22.46094\\-78.72017\\-19\\-20.50781\\-79.67269\\-19\\-18.55469\\-80.38004\\-19\\-16.60156\\-81.43291\\-19\\-14.64844\\-82.21269\\-19\\-13.09275\\-83.07031\\-19\\-10.74219\\-84.57719\\-19\\-8.789063\\-86.3196\\-19\\-7.900551\\-86.97656\\-19\\-5.801505\\-88.92969\\-19\\-4.266401\\-90.88281\\-19\\-2.929688\\-92.05347\\-19\\-0.9765625\\-92.15449\\-19\\0.9765625\\-92.46895\\-19\\2.929688\\-91.9707\\-19\\4.596044\\-90.88281\\-19\\8.789063\\-87.17533\\-19\\10.74219\\-85.15082\\-19\\13.16445\\-83.07031\\-19\\16.60156\\-80.72798\\-19\\18.55469\\-79.906\\-19\\20.50781\\-78.61944\\-19\\22.46094\\-77.78653\\-19\\24.41406\\-76.80843\\-19\\26.36719\\-76.17446\\-19\\28.32031\\-75.77482\\-19\\30.27344\\-74.83611\\-19\\32.22656\\-74.47531\\-19\\34.17969\\-74.25218\\-19\\36.13281\\-72.85171\\-19\\40.03906\\-72.66249\\-19\\41.99219\\-71.77303\\-19\\45.89844\\-71.6513\\-19\\49.80469\\-71.60755\\-19\\51.75781\\-71.671\\-19\\57.61719\\-71.67064\\-19\\61.52344\\-71.76733\\-19\\65.42969\\-71.77303\\-19\\67.38281\\-71.72308\\-19\\69.33594\\-72.67616\\-19\\73.24219\\-72.81641\\-19\\75.19531\\-72.98988\\-19\\77.14844\\-74.21191\\-19\\79.10156\\-74.29295\\-19\\83.00781\\-74.60013\\-19\\84.96094\\-74.85659\\-19\\86.91406\\-75.63081\\-19\\90.82031\\-76.20565\\-19\\92.77344\\-76.55363\\-19\\94.72656\\-77.26352\\-19\\98.63281\\-78.40331\\-19\\102.5391\\-79.9023\\-19\\104.4922\\-80.36095\\-19\\108.3984\\-81.86506\\-19\\110.3516\\-82.46696\\-19\\112.3047\\-83.53323\\-19\\114.2578\\-84.37424\\-19\\116.2109\\-85.57513\\-19\\118.1641\\-86.41219\\-19\\120.1172\\-87.69517\\-19\\122.0703\\-88.52338\\-19\\124.0234\\-89.96616\\-19\\127.6495\\-92.83594\\-19\\129.8372\\-94.78906\\-19\\131.8359\\-96.91898\\-19\\133.7891\\-99.28639\\-19\\136.2953\\-102.6016\\-19\\137.1535\\-104.5547\\-19\\137.6953\\-105.2486\\-19\\139.7578\\-108.4609\\-19\\140.8031\\-110.4141\\-19\\141.9992\\-112.3672\\-19\\142.7471\\-114.3203\\-19\\143.7789\\-116.2734\\-19\\144.6145\\-118.2266\\-19\\145.6575\\-120.1797\\-19\\147.5143\\-124.0859\\-19\\148.335\\-126.0391\\-19\\148.9639\\-127.9922\\-19\\149.9023\\-129.9453\\-19\\150.4592\\-131.8984\\-19\\151.1659\\-133.8516\\-19\\152.0916\\-135.8047\\-19\\152.7063\\-137.7578\\-19\\153.5965\\-139.7109\\-19\\154.1741\\-141.6641\\-19\\154.6452\\-143.6172\\-19\\155.862\\-147.5234\\-19\\156.2088\\-149.4766\\-19\\156.4534\\-151.4297\\-19\\156.8427\\-153.3828\\-19\\157.4857\\-155.3359\\-19\\157.8863\\-157.2891\\-19\\158.6914\\-163.1484\\-19\\159.5158\\-167.0547\\-19\\159.9134\\-170.9609\\-19\\160.3829\\-178.7734\\-19\\160.6599\\-184.6328\\-19\\160.7281\\-192.4453\\-19\\160.6172\\-200.2578\\-19\\160.298\\-208.0703\\-19\\159.8931\\-213.9297\\-19\\159.685\\-215.8828\\-19\\159.3541\\-217.8359\\-19\\158.8286\\-219.7891\\-19\\158.4499\\-221.7422\\-19\\157.8026\\-225.6484\\-19\\156.529\\-229.5547\\-19\\156.1607\\-231.5078\\-19\\155.6792\\-233.4609\\-19\\154.7885\\-235.4141\\-19\\154.1516\\-237.3672\\-19\\152.2066\\-241.2734\\-19\\150.9638\\-243.2266\\-19\\150.0543\\-245.1797\\-19\\148.7523\\-247.1328\\-19\\147.6263\\-249.0859\\-19\\146.2387\\-251.0391\\-19\\144.6337\\-252.9922\\-19\\143.5547\\-254.4489\\-19\\141.6016\\-256.7961\\-19\\137.6953\\-260.9151\\-19\\135.8685\\-262.7578\\-19\\133.815\\-264.7109\\-19\\129.473\\-268.6172\\-19\\127.1045\\-270.5703\\-19\\124.6303\\-272.5234\\-19\\124.0234\\-273.1053\\-19\\122.0703\\-274.6274\\-19\\120.1172\\-275.7595\\-19\\118.1641\\-277.2122\\-19\\116.2109\\-278.5382\\-19\\114.2578\\-279.7287\\-19\\112.3047\\-281.0353\\-19\\110.3516\\-281.9834\\-19\\108.3984\\-283.0979\\-19\\106.4453\\-283.8929\\-19\\104.4922\\-285.0737\\-19\\100.5859\\-287.0063\\-19\\98.63281\\-287.7212\\-19\\96.67969\\-288.6732\\-19\\92.77344\\-289.7123\\-19\\90.82031\\-290.6046\\-19\\86.91406\\-291.5847\\-19\\84.96094\\-292.3365\\-19\\83.00781\\-292.756\\-19\\73.24219\\-294.2256\\-19\\69.33594\\-294.4738\\-19\\65.42969\\-294.4834\\-19\\61.52344\\-294.2641\\-19\\59.57031\\-294.0307\\-19\\53.71094\\-293.2255\\-19\\45.89844\\-292.5077\\-19\\41.99219\\-291.9578\\-19\\40.03906\\-291.802\\-19\\36.13281\\-291.7182\\-19\\32.22656\\-292.0013\\-19\\28.32031\\-292.5574\\-19\\22.46094\\-293.2501\\-19\\20.50781\\-293.5261\\-19\\16.60156\\-294.2798\\-19\\10.74219\\-294.8247\\-19\\4.882813\\-295.1265\\-19\\0.9765625\\-295.2378\\-19\\-2.929688\\-295.2868\\-19\\-8.789063\\-295.2994\\-19\\-16.60156\\-295.1003\\-19\\-24.41406\\-294.8236\\-19\\-30.27344\\-294.4961\\-19\\-36.13281\\-293.9544\\-19\\-40.03906\\-293.7377\\-19\\-43.94531\\-293.8256\\-19\\-47.85156\\-294.2101\\-19\\-55.66406\\-294.7781\\-19\\-61.52344\\-295.123\\-19\\-69.33594\\-295.6643\\-19\\-71.28906\\-295.7316\\-19\\-75.19531\\-295.7448\\-19\\-81.05469\\-295.3078\\-19\\-84.96094\\-294.9314\\-19\\-86.91406\\-294.6649\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "295" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "117" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-294.3814\\-17\\-90.82031\\-293.1252\\-17\\-92.77344\\-292.6295\\-17\\-94.72656\\-291.6478\\-17\\-96.67969\\-290.9908\\-17\\-100.5859\\-289.2238\\-17\\-102.5391\\-288.5349\\-17\\-104.4922\\-287.3803\\-17\\-106.4453\\-286.4498\\-17\\-109.8501\\-284.2422\\-17\\-110.3516\\-283.8388\\-17\\-112.3047\\-282.8803\\-17\\-114.2578\\-281.5364\\-17\\-116.2109\\-280.4068\\-17\\-118.1641\\-278.9852\\-17\\-120.1172\\-277.4233\\-17\\-122.0703\\-276.0376\\-17\\-124.0234\\-274.7567\\-17\\-128.958\\-270.5703\\-17\\-131.8359\\-267.9283\\-17\\-135.0215\\-264.7109\\-17\\-137.6953\\-261.8253\\-17\\-140.2618\\-258.8516\\-17\\-141.7683\\-256.8984\\-17\\-142.9606\\-254.9453\\-17\\-143.5547\\-254.2129\\-17\\-145.5078\\-251.2425\\-17\\-146.8372\\-249.0859\\-17\\-148.1506\\-247.1328\\-17\\-148.9155\\-245.1797\\-17\\-150.0588\\-243.2266\\-17\\-150.7429\\-241.2734\\-17\\-151.8703\\-239.3203\\-17\\-152.622\\-237.3672\\-17\\-153.648\\-235.4141\\-17\\-154.8705\\-231.5078\\-17\\-155.6929\\-229.5547\\-17\\-156.1798\\-227.6016\\-17\\-156.5073\\-225.6484\\-17\\-157.1121\\-223.6953\\-17\\-157.8296\\-221.7422\\-17\\-158.6062\\-217.8359\\-17\\-159.3283\\-215.8828\\-17\\-159.8007\\-213.9297\\-17\\-160.7917\\-208.0703\\-17\\-161.243\\-206.1172\\-17\\-161.583\\-204.1641\\-17\\-161.9339\\-200.2578\\-17\\-162.1511\\-196.3516\\-17\\-162.4127\\-188.5391\\-17\\-162.5038\\-180.7266\\-17\\-162.4127\\-174.8672\\-17\\-162.1567\\-169.0078\\-17\\-161.8652\\-165.1016\\-17\\-161.6524\\-163.1484\\-17\\-161.2992\\-161.1953\\-17\\-160.3702\\-157.2891\\-17\\-159.6263\\-153.3828\\-17\\-158.8716\\-151.4297\\-17\\-157.8179\\-147.5234\\-17\\-156.9972\\-145.5703\\-17\\-156.367\\-143.6172\\-17\\-155.9393\\-141.6641\\-17\\-155.098\\-139.7109\\-17\\-153.6944\\-135.8047\\-17\\-152.6994\\-133.8516\\-17\\-151.9413\\-131.8984\\-17\\-150.8855\\-129.9453\\-17\\-150.1894\\-127.9922\\-17\\-149.1911\\-126.0391\\-17\\-148.4194\\-124.0859\\-17\\-147.5\\-122.1328\\-17\\-146.3712\\-120.1797\\-17\\-145.1348\\-118.2266\\-17\\-144.2562\\-116.2734\\-17\\-143.1089\\-114.3203\\-17\\-142.3215\\-112.3672\\-17\\-141.0973\\-110.4141\\-17\\-140.0706\\-108.4609\\-17\\-138.6041\\-106.5078\\-17\\-137.286\\-104.5547\\-17\\-136.2055\\-102.6016\\-17\\-133.7891\\-99.56608\\-17\\-131.8359\\-97.29688\\-17\\-129.8828\\-95.23296\\-17\\-127.1891\\-92.83594\\-17\\-125.9766\\-92.03645\\-17\\-124.0234\\-90.29556\\-17\\-121.9644\\-88.92969\\-17\\-120.1172\\-87.9593\\-17\\-118.1641\\-86.77681\\-17\\-116.2109\\-85.85183\\-17\\-112.3047\\-83.83611\\-17\\-108.3984\\-82.10741\\-17\\-106.4453\\-81.71551\\-17\\-104.4922\\-80.61159\\-17\\-102.5391\\-80.27931\\-17\\-100.5859\\-79.43717\\-17\\-92.77344\\-77.28358\\-17\\-90.82031\\-76.64806\\-17\\-88.86719\\-76.22768\\-17\\-83.00781\\-75.68805\\-17\\-81.05469\\-74.78876\\-17\\-77.14844\\-74.4882\\-17\\-71.28906\\-74.31066\\-17\\-63.47656\\-74.19405\\-17\\-61.52344\\-74.11437\\-17\\-59.57031\\-73.1303\\-17\\-55.66406\\-73.1431\\-17\\-53.71094\\-73.09299\\-17\\-49.80469\\-74.2283\\-17\\-43.94531\\-74.40257\\-17\\-40.03906\\-74.60457\\-17\\-36.13281\\-75.00967\\-17\\-34.17969\\-75.67634\\-17\\-28.32031\\-76.58618\\-17\\-26.36719\\-77.20331\\-17\\-22.46094\\-78.60995\\-17\\-20.50781\\-79.5276\\-17\\-18.55469\\-80.26347\\-17\\-16.61551\\-81.11719\\-17\\-12.69531\\-83.02893\\-17\\-9.790453\\-85.02344\\-17\\-7.473186\\-86.97656\\-17\\-5.366991\\-88.92969\\-17\\-2.929688\\-91.5542\\-17\\-0.9765625\\-91.94205\\-17\\0.9765625\\-92.15285\\-17\\2.929688\\-91.74593\\-17\\4.254482\\-90.88281\\-17\\6.571785\\-88.92969\\-17\\8.789063\\-86.86031\\-17\\10.74219\\-84.86196\\-17\\12.88859\\-83.07031\\-17\\16.60156\\-80.61866\\-17\\18.55469\\-79.64133\\-17\\20.50781\\-78.46834\\-17\\22.46094\\-77.69262\\-17\\24.41406\\-76.72581\\-17\\26.36719\\-76.11984\\-17\\28.32031\\-75.7162\\-17\\30.27344\\-74.75538\\-17\\34.17969\\-74.23502\\-17\\36.13281\\-72.82507\\-17\\38.08594\\-72.71983\\-17\\40.03906\\-72.29057\\-17\\41.99219\\-71.71135\\-17\\43.94531\\-71.75195\\-17\\45.89844\\-71.68666\\-17\\49.80469\\-71.66143\\-17\\51.75781\\-71.74038\\-17\\53.71094\\-71.68306\\-17\\59.57031\\-71.70033\\-17\\61.52344\\-71.806\\-17\\65.42969\\-71.90269\\-17\\67.38281\\-71.79359\\-17\\69.33594\\-72.66914\\-17\\73.24219\\-72.81641\\-17\\75.19531\\-72.98988\\-17\\77.14844\\-74.20657\\-17\\79.10156\\-74.29295\\-17\\83.00781\\-74.61341\\-17\\84.96094\\-74.84465\\-17\\86.91406\\-75.65517\\-17\\90.82031\\-76.22863\\-17\\92.77344\\-76.56615\\-17\\94.72656\\-77.36063\\-17\\98.63281\\-78.46974\\-17\\102.5391\\-79.95106\\-17\\104.4922\\-80.42749\\-17\\106.4453\\-81.23344\\-17\\110.3516\\-82.54398\\-17\\112.3047\\-83.58589\\-17\\114.2578\\-84.4229\\-17\\116.2109\\-85.61814\\-17\\118.1641\\-86.45615\\-17\\120.1172\\-87.7292\\-17\\122.0703\\-88.61156\\-17\\124.0234\\-90.03646\\-17\\127.476\\-92.83594\\-17\\129.6196\\-94.78906\\-17\\131.8359\\-97.21062\\-17\\134.6198\\-100.6484\\-17\\136.0478\\-102.6016\\-17\\136.8958\\-104.5547\\-17\\138.3124\\-106.5078\\-17\\139.3441\\-108.4609\\-17\\140.5814\\-110.4141\\-17\\141.673\\-112.3672\\-17\\142.5842\\-114.3203\\-17\\143.3919\\-116.2734\\-17\\144.3925\\-118.2266\\-17\\145.2421\\-120.1797\\-17\\146.327\\-122.1328\\-17\\147.14\\-124.0859\\-17\\148.1181\\-126.0391\\-17\\148.7056\\-127.9922\\-17\\149.6033\\-129.9453\\-17\\150.2789\\-131.8984\\-17\\150.8304\\-133.8516\\-17\\151.8584\\-135.8047\\-17\\152.434\\-137.7578\\-17\\153.9542\\-141.6641\\-17\\154.9316\\-145.5703\\-17\\155.6177\\-147.5234\\-17\\156.0631\\-149.4766\\-17\\156.5735\\-153.3828\\-17\\157.0168\\-155.3359\\-17\\157.6425\\-157.2891\\-17\\157.9652\\-159.2422\\-17\\158.4218\\-163.1484\\-17\\158.7003\\-165.1016\\-17\\159.4388\\-169.0078\\-17\\159.6593\\-170.9609\\-17\\160.0688\\-176.8203\\-17\\160.3845\\-184.6328\\-17\\160.4368\\-192.4453\\-17\\160.3505\\-200.2578\\-17\\160.0777\\-208.0703\\-17\\159.668\\-213.9297\\-17\\159.3667\\-215.8828\\-17\\158.8607\\-217.8359\\-17\\158.4913\\-219.7891\\-17\\157.9204\\-223.6953\\-17\\157.4623\\-225.6484\\-17\\156.7319\\-227.6016\\-17\\155.9476\\-231.5078\\-17\\154.5079\\-235.4141\\-17\\153.8635\\-237.3672\\-17\\152.7511\\-239.3203\\-17\\151.8642\\-241.2734\\-17\\150.6145\\-243.2266\\-17\\149.7004\\-245.1797\\-17\\147.4609\\-248.7162\\-17\\145.8571\\-251.0391\\-17\\143.5547\\-253.9455\\-17\\140.9895\\-256.8984\\-17\\139.0084\\-258.8516\\-17\\135.2896\\-262.7578\\-17\\129.8828\\-267.7484\\-17\\127.9297\\-269.4385\\-17\\125.9766\\-271.0136\\-17\\121.4913\\-274.4766\\-17\\118.1641\\-276.7623\\-17\\116.2109\\-277.867\\-17\\115.6106\\-278.3828\\-17\\112.3047\\-280.6119\\-17\\110.3516\\-281.5678\\-17\\108.3984\\-282.7841\\-17\\106.4453\\-283.486\\-17\\104.4922\\-284.6963\\-17\\102.5391\\-285.5268\\-17\\100.5859\\-286.6474\\-17\\98.63281\\-287.3473\\-17\\96.67969\\-288.2638\\-17\\94.72656\\-288.9673\\-17\\92.77344\\-289.3572\\-17\\88.86719\\-290.7924\\-17\\84.96094\\-291.6653\\-17\\83.00781\\-292.3586\\-17\\81.05469\\-292.7347\\-17\\71.28906\\-293.9086\\-17\\69.33594\\-294.0898\\-17\\65.42969\\-294.1597\\-17\\63.47656\\-294.0604\\-17\\59.57031\\-293.6983\\-17\\55.66406\\-293.2578\\-17\\47.85156\\-292.6009\\-17\\45.89844\\-292.4801\\-17\\41.99219\\-292.0923\\-17\\38.08594\\-292.1069\\-17\\32.22656\\-292.5372\\-17\\26.36719\\-293.1622\\-17\\22.46094\\-293.7965\\-17\\20.50781\\-294.2145\\-17\\18.55469\\-294.5215\\-17\\14.64844\\-294.8765\\-17\\8.789063\\-295.241\\-17\\0.9765625\\-295.6566\\-17\\-4.882813\\-295.748\\-17\\-8.789063\\-295.7464\\-17\\-12.69531\\-295.5939\\-17\\-16.60156\\-295.375\\-17\\-24.41406\\-295.045\\-17\\-32.22656\\-294.6281\\-17\\-40.03906\\-294.0886\\-17\\-43.94531\\-294.0604\\-17\\-55.66406\\-294.7054\\-17\\-63.47656\\-295.1018\\-17\\-69.33594\\-295.3412\\-17\\-71.28906\\-295.3839\\-17\\-75.19531\\-295.3662\\-17\\-79.10156\\-295.1959\\-17\\-83.00781\\-294.9134\\-17\\-84.96094\\-294.7045\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "298" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "118" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-296.0313\\-15\\-16.60156\\-295.8171\\-15\\-20.50781\\-295.5026\\-15\\-24.41406\\-295.2536\\-15\\-36.13281\\-294.6083\\-15\\-41.99219\\-294.2605\\-15\\-43.94531\\-294.2605\\-15\\-49.80469\\-294.4023\\-15\\-57.61719\\-294.701\\-15\\-61.52344\\-294.8765\\-15\\-69.33594\\-295.1195\\-15\\-75.19531\\-295.1248\\-15\\-79.10156\\-294.9964\\-15\\-81.05469\\-294.8712\\-15\\-84.96094\\-294.4076\\-15\\-88.86719\\-293.3214\\-15\\-90.82031\\-292.8574\\-15\\-92.77344\\-292.1901\\-15\\-94.72656\\-291.2893\\-15\\-96.67969\\-290.7285\\-15\\-98.63281\\-289.64\\-15\\-100.5859\\-289.0411\\-15\\-102.5005\\-288.1484\\-15\\-104.4922\\-287.1025\\-15\\-108.3984\\-284.8683\\-15\\-110.3516\\-283.5256\\-15\\-112.3047\\-282.5754\\-15\\-115.7272\\-280.3359\\-15\\-118.4082\\-278.3828\\-15\\-121.22\\-276.4297\\-15\\-125.9766\\-272.8329\\-15\\-128.624\\-270.5703\\-15\\-131.8359\\-267.6472\\-15\\-134.7656\\-264.7109\\-15\\-137.6953\\-261.4936\\-15\\-139.974\\-258.8516\\-15\\-141.6016\\-256.6567\\-15\\-142.7313\\-254.9453\\-15\\-144.1515\\-252.9922\\-15\\-145.5078\\-250.7792\\-15\\-147.9362\\-247.1328\\-15\\-148.7523\\-245.1797\\-15\\-149.8684\\-243.2266\\-15\\-150.5777\\-241.2734\\-15\\-151.6181\\-239.3203\\-15\\-152.4201\\-237.3672\\-15\\-153.4011\\-235.4141\\-15\\-154.1049\\-233.4609\\-15\\-154.6623\\-231.5078\\-15\\-155.4612\\-229.5547\\-15\\-156.0486\\-227.6016\\-15\\-156.3771\\-225.6484\\-15\\-156.8264\\-223.6953\\-15\\-157.6036\\-221.7422\\-15\\-158.4201\\-217.8359\\-15\\-158.9423\\-215.8828\\-15\\-159.5956\\-213.9297\\-15\\-159.9398\\-211.9766\\-15\\-160.5188\\-208.0703\\-15\\-161.3253\\-204.1641\\-15\\-161.7697\\-200.2578\\-15\\-162.0975\\-194.3984\\-15\\-162.2344\\-190.4922\\-15\\-162.337\\-184.6328\\-15\\-162.337\\-178.7734\\-15\\-162.2041\\-172.9141\\-15\\-162.0028\\-169.0078\\-15\\-161.6649\\-165.1016\\-15\\-161.3647\\-163.1484\\-15\\-160.8851\\-161.1953\\-15\\-159.8079\\-155.3359\\-15\\-159.2605\\-153.3828\\-15\\-158.5379\\-151.4297\\-15\\-158.0908\\-149.4766\\-15\\-157.5414\\-147.5234\\-15\\-156.6805\\-145.5703\\-15\\-155.7067\\-141.6641\\-15\\-154.7953\\-139.7109\\-15\\-154.1549\\-137.7578\\-15\\-153.3579\\-135.8047\\-15\\-152.432\\-133.8516\\-15\\-151.6905\\-131.8984\\-15\\-150.6378\\-129.9453\\-15\\-149.9987\\-127.9922\\-15\\-148.9467\\-126.0391\\-15\\-148.2384\\-124.0859\\-15\\-147.0965\\-122.1328\\-15\\-146.1568\\-120.1797\\-15\\-144.8709\\-118.2266\\-15\\-144.0979\\-116.2734\\-15\\-142.9058\\-114.3203\\-15\\-142.136\\-112.3672\\-15\\-140.894\\-110.4141\\-15\\-139.797\\-108.4609\\-15\\-137.0733\\-104.5547\\-15\\-136.0397\\-102.6016\\-15\\-134.4819\\-100.6484\\-15\\-131.8359\\-97.54958\\-15\\-129.8828\\-95.43756\\-15\\-126.961\\-92.83594\\-15\\-125.9766\\-92.14628\\-15\\-124.0234\\-90.46225\\-15\\-121.6863\\-88.92969\\-15\\-118.1641\\-86.84584\\-15\\-116.2109\\-85.93171\\-15\\-114.2578\\-84.87483\\-15\\-112.3047\\-83.66578\\-15\\-108.3984\\-82.14915\\-15\\-106.4453\\-81.7523\\-15\\-104.4922\\-80.66811\\-15\\-102.5391\\-80.31818\\-15\\-100.5859\\-79.57567\\-15\\-98.63281\\-79.06932\\-15\\-94.72656\\-77.73022\\-15\\-90.82031\\-76.65591\\-15\\-88.86719\\-76.23438\\-15\\-83.00781\\-75.72252\\-15\\-81.05469\\-74.79688\\-15\\-77.14844\\-74.51897\\-15\\-73.24219\\-74.31102\\-15\\-67.38281\\-74.21107\\-15\\-63.47656\\-73.98026\\-15\\-61.52344\\-73.02286\\-15\\-55.66406\\-72.98988\\-15\\-51.75781\\-72.92766\\-15\\-49.80469\\-74.09493\\-15\\-47.85156\\-74.25218\\-15\\-41.99219\\-74.44813\\-15\\-38.08594\\-74.70076\\-15\\-36.13281\\-74.89923\\-15\\-34.17969\\-75.32986\\-15\\-32.22656\\-75.91089\\-15\\-28.32031\\-76.5303\\-15\\-26.36719\\-77.07349\\-15\\-24.41406\\-77.84001\\-15\\-22.46094\\-78.5076\\-15\\-20.50781\\-79.41196\\-15\\-16.60156\\-80.96875\\-15\\-14.64844\\-81.95691\\-15\\-12.69531\\-82.76926\\-15\\-10.74219\\-84.01517\\-15\\-9.380139\\-85.02344\\-15\\-4.882813\\-89.06048\\-15\\-2.929688\\-90.63362\\-15\\-0.9765625\\-91.70027\\-15\\0.9765625\\-91.86411\\-15\\2.929688\\-91.49316\\-15\\4.882813\\-90.14567\\-15\\6.332632\\-88.92969\\-15\\8.789063\\-86.63719\\-15\\10.74219\\-84.70499\\-15\\12.70581\\-83.07031\\-15\\14.64844\\-81.84961\\-15\\16.60156\\-80.50279\\-15\\18.55469\\-79.5679\\-15\\20.50781\\-78.38911\\-15\\22.46094\\-77.5975\\-15\\24.41406\\-76.64127\\-15\\26.36719\\-76.08367\\-15\\28.32031\\-75.68211\\-15\\30.27344\\-74.74494\\-15\\32.22656\\-74.44094\\-15\\34.17969\\-74.24056\\-15\\36.13281\\-72.84272\\-15\\38.08594\\-72.71983\\-15\\41.99219\\-71.71909\\-15\\45.89844\\-71.67709\\-15\\53.71094\\-71.69899\\-15\\61.52344\\-71.78005\\-15\\63.47656\\-71.93931\\-15\\65.42969\\-72.47699\\-15\\67.38281\\-72.04039\\-15\\69.33594\\-72.67616\\-15\\73.24219\\-72.80784\\-15\\75.19531\\-72.97916\\-15\\77.14844\\-74.21806\\-15\\81.05469\\-74.44094\\-15\\84.96094\\-74.90904\\-15\\86.91406\\-75.68671\\-15\\92.77344\\-76.62119\\-15\\94.72656\\-77.41179\\-15\\98.63281\\-78.53046\\-15\\100.5859\\-79.37384\\-15\\102.5391\\-79.99868\\-15\\104.4922\\-80.48492\\-15\\106.4453\\-81.31847\\-15\\110.3516\\-82.61114\\-15\\112.3047\\-83.67173\\-15\\114.2578\\-84.47903\\-15\\116.2109\\-85.67651\\-15\\118.1641\\-86.50808\\-15\\120.1172\\-87.76887\\-15\\122.0703\\-88.69318\\-15\\124.0234\\-90.10767\\-15\\127.3003\\-92.83594\\-15\\129.8828\\-95.25749\\-15\\131.8359\\-97.45731\\-15\\134.4159\\-100.6484\\-15\\135.7422\\-102.6129\\-15\\136.773\\-104.5547\\-15\\138.0253\\-106.5078\\-15\\139.0281\\-108.4609\\-15\\140.3562\\-110.4141\\-15\\141.3156\\-112.3672\\-15\\142.3966\\-114.3203\\-15\\143.063\\-116.2734\\-15\\144.1918\\-118.2266\\-15\\144.9169\\-120.1797\\-15\\146.065\\-122.1328\\-15\\146.8315\\-124.0859\\-15\\147.8556\\-126.0391\\-15\\149.2112\\-129.9453\\-15\\150.0921\\-131.8984\\-15\\150.6037\\-133.8516\\-15\\151.5026\\-135.8047\\-15\\152.2094\\-137.7578\\-15\\152.8073\\-139.7109\\-15\\153.692\\-141.6641\\-15\\154.2146\\-143.6172\\-15\\154.6368\\-145.5703\\-15\\155.8452\\-149.4766\\-15\\156.6819\\-155.3359\\-15\\157.7062\\-159.2422\\-15\\157.9812\\-161.1953\\-15\\158.6796\\-167.0547\\-15\\159.5764\\-172.9141\\-15\\159.8562\\-176.8203\\-15\\160.0329\\-180.7266\\-15\\160.1313\\-184.6328\\-15\\160.1959\\-190.4922\\-15\\160.1166\\-200.2578\\-15\\159.942\\-206.1172\\-15\\159.7259\\-210.0234\\-15\\159.5365\\-211.9766\\-15\\158.9073\\-215.8828\\-15\\158.5305\\-217.8359\\-15\\157.997\\-221.7422\\-15\\157.633\\-223.6953\\-15\\156.9609\\-225.6484\\-15\\156.4534\\-227.6016\\-15\\156.1355\\-229.5547\\-15\\155.6792\\-231.5078\\-15\\154.8462\\-233.4609\\-15\\154.2398\\-235.4141\\-15\\153.3203\\-237.5733\\-15\\151.4048\\-241.2734\\-15\\148.1981\\-247.1328\\-15\\145.5078\\-250.7513\\-15\\143.9054\\-252.9922\\-15\\142.3001\\-254.9453\\-15\\140.5158\\-256.8984\\-15\\139.6484\\-257.6518\\-15\\135.7422\\-261.7338\\-15\\130.5013\\-266.6641\\-15\\129.8828\\-267.3267\\-15\\127.9297\\-269.0504\\-15\\125.9766\\-270.3718\\-15\\124.0234\\-271.8961\\-15\\122.0703\\-273.5804\\-15\\120.1172\\-275.0861\\-15\\118.1641\\-276.1913\\-15\\116.2109\\-277.5002\\-15\\114.2578\\-278.9485\\-15\\110.3516\\-281.2254\\-15\\108.3862\\-282.2891\\-15\\104.4922\\-284.139\\-15\\100.5859\\-286.1419\\-15\\98.63281\\-287.0364\\-15\\96.67969\\-287.7212\\-15\\94.72656\\-288.6367\\-15\\90.82031\\-289.5426\\-15\\88.86719\\-290.3525\\-15\\86.91406\\-290.912\\-15\\83.00781\\-291.6653\\-15\\81.05469\\-292.3138\\-15\\79.10156\\-292.6569\\-15\\73.24219\\-293.2781\\-15\\69.33594\\-293.5949\\-15\\65.42969\\-293.6869\\-15\\63.47656\\-293.6317\\-15\\59.57031\\-293.4064\\-15\\51.75781\\-292.827\\-15\\49.80469\\-292.2679\\-15\\47.85156\\-292.4611\\-15\\45.89844\\-292.4611\\-15\\41.99219\\-292.2785\\-15\\40.03906\\-292.3365\\-15\\34.17969\\-292.704\\-15\\30.27344\\-293.0626\\-15\\26.36719\\-293.6104\\-15\\22.46094\\-294.4103\\-15\\18.55469\\-294.8406\\-15\\8.789063\\-295.6307\\-15\\4.882813\\-296.0161\\-15\\0.9765625\\-296.2865\\-15\\-4.882813\\-296.3898\\-15\\-8.789063\\-296.3556\\-15\\-10.74219\\-296.2865\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "293" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "119" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-296.1869\\-13\\-24.41406\\-295.4925\\-13\\-30.27344\\-295.0949\\-13\\-34.17969\\-294.8897\\-13\\-40.03906\\-294.5241\\-13\\-43.94531\\-294.3894\\-13\\-49.80469\\-294.4153\\-13\\-55.66406\\-294.5365\\-13\\-65.42969\\-294.8526\\-13\\-71.28906\\-294.9542\\-13\\-75.19531\\-294.9245\\-13\\-79.10156\\-294.7687\\-13\\-81.05469\\-294.6326\\-13\\-83.00781\\-294.3839\\-13\\-86.91406\\-293.4055\\-13\\-90.82031\\-292.5341\\-13\\-92.77344\\-291.6158\\-13\\-96.67969\\-290.3525\\-13\\-98.63281\\-289.363\\-13\\-100.5859\\-288.8226\\-13\\-102.5391\\-287.7046\\-13\\-104.4922\\-286.8403\\-13\\-106.4453\\-285.5502\\-13\\-108.3984\\-284.524\\-13\\-112.3047\\-282.1108\\-13\\-114.2578\\-281.0668\\-13\\-118.1641\\-278.1387\\-13\\-120.1172\\-276.9433\\-13\\-123.392\\-274.4766\\-13\\-128.2193\\-270.5703\\-13\\-129.8828\\-269.1375\\-13\\-131.8359\\-267.335\\-13\\-134.4558\\-264.7109\\-13\\-137.6953\\-261.1356\\-13\\-141.6016\\-256.2738\\-13\\-143.8917\\-252.9922\\-13\\-144.971\\-251.0391\\-13\\-146.4088\\-249.0859\\-13\\-147.6819\\-247.1328\\-13\\-148.5797\\-245.1797\\-13\\-149.6048\\-243.2266\\-13\\-150.4019\\-241.2734\\-13\\-152.2418\\-237.3672\\-13\\-153.9657\\-233.4609\\-13\\-154.4696\\-231.5078\\-13\\-155.8926\\-227.6016\\-13\\-156.6185\\-223.6953\\-13\\-157.8863\\-219.7891\\-13\\-158.6538\\-215.8828\\-13\\-159.3018\\-213.9297\\-13\\-159.759\\-211.9766\\-13\\-160.6445\\-206.1172\\-13\\-161.338\\-202.2109\\-13\\-161.7576\\-198.3047\\-13\\-162.0447\\-192.4453\\-13\\-162.1388\\-188.5391\\-13\\-162.2106\\-182.6797\\-13\\-162.1868\\-178.7734\\-13\\-162.1094\\-174.8672\\-13\\-161.9623\\-170.9609\\-13\\-161.6338\\-167.0547\\-13\\-161.377\\-165.1016\\-13\\-160.5636\\-161.1953\\-13\\-159.925\\-157.2891\\-13\\-159.5365\\-155.3359\\-13\\-158.7981\\-153.3828\\-13\\-158.274\\-151.4297\\-13\\-157.8724\\-149.4766\\-13\\-157.1094\\-147.5234\\-13\\-156.4584\\-145.5703\\-13\\-156.0535\\-143.6172\\-13\\-155.3897\\-141.6641\\-13\\-154.5548\\-139.7109\\-13\\-153.9498\\-137.7578\\-13\\-152.9744\\-135.8047\\-13\\-152.2096\\-133.8516\\-13\\-150.4132\\-129.9453\\-13\\-149.7516\\-127.9922\\-13\\-148.7221\\-126.0391\\-13\\-148.0049\\-124.0859\\-13\\-146.8159\\-122.1328\\-13\\-145.931\\-120.1797\\-13\\-144.6931\\-118.2266\\-13\\-143.8546\\-116.2734\\-13\\-142.7274\\-114.3203\\-13\\-141.8981\\-112.3672\\-13\\-141.6016\\-111.9822\\-13\\-139.6484\\-108.6913\\-13\\-138.2825\\-106.5078\\-13\\-136.8293\\-104.5547\\-13\\-135.7677\\-102.6016\\-13\\-134.3122\\-100.6484\\-13\\-129.8828\\-95.72285\\-13\\-126.6731\\-92.83594\\-13\\-124.0234\\-90.63669\\-13\\-122.0703\\-89.43212\\-13\\-120.1172\\-88.08247\\-13\\-116.2109\\-86.03487\\-13\\-114.2578\\-84.90137\\-13\\-112.3047\\-83.62014\\-13\\-110.3516\\-83.07866\\-13\\-108.3984\\-82.23033\\-13\\-106.4453\\-81.77938\\-13\\-104.4922\\-80.76947\\-13\\-102.5391\\-80.39858\\-13\\-98.63281\\-79.14135\\-13\\-94.72656\\-77.69922\\-13\\-92.77344\\-77.25303\\-13\\-90.82031\\-76.7043\\-13\\-88.86719\\-76.27136\\-13\\-83.00781\\-75.71219\\-13\\-81.05469\\-74.72724\\-13\\-77.14844\\-74.45472\\-13\\-73.24219\\-74.25758\\-13\\-69.33594\\-74.20035\\-13\\-67.38281\\-74.07198\\-13\\-65.42969\\-73.33458\\-13\\-63.47656\\-72.97916\\-13\\-61.52344\\-72.94787\\-13\\-51.75781\\-72.90796\\-13\\-49.80469\\-73.97607\\-13\\-47.85156\\-74.21191\\-13\\-41.99219\\-74.40257\\-13\\-38.08594\\-74.63576\\-13\\-36.13281\\-74.83611\\-13\\-34.17969\\-75.24917\\-13\\-32.22656\\-75.85735\\-13\\-28.32031\\-76.43783\\-13\\-26.36719\\-76.92697\\-13\\-24.41406\\-77.733\\-13\\-22.46094\\-78.32619\\-13\\-20.50781\\-79.26644\\-13\\-18.55469\\-80.0927\\-13\\-16.60156\\-80.80614\\-13\\-14.64844\\-81.86983\\-13\\-12.69531\\-82.57867\\-13\\-10.74219\\-83.8503\\-13\\-9.143391\\-85.02344\\-13\\-4.658048\\-88.92969\\-13\\-2.929688\\-90.27397\\-13\\-0.9765625\\-91.42182\\-13\\0.9765625\\-91.61015\\-13\\2.929688\\-91.19762\\-13\\4.882813\\-89.92632\\-13\\8.789063\\-86.4756\\-13\\10.74219\\-84.57834\\-13\\12.69531\\-82.91439\\-13\\16.60156\\-80.41876\\-13\\18.55469\\-79.49698\\-13\\20.50781\\-78.31567\\-13\\22.46094\\-77.48494\\-13\\24.41406\\-76.50011\\-13\\28.32031\\-75.60456\\-13\\30.27344\\-74.72451\\-13\\32.22656\\-74.42683\\-13\\34.17969\\-74.22955\\-13\\36.13281\\-72.82507\\-13\\38.08594\\-72.72738\\-13\\41.99219\\-71.75673\\-13\\43.94531\\-71.7076\\-13\\55.66406\\-71.72133\\-13\\61.52344\\-71.79546\\-13\\65.42969\\-72.5815\\-13\\67.38281\\-72.4245\\-13\\69.33594\\-72.6904\\-13\\73.24219\\-72.83385\\-13\\75.19531\\-73.00072\\-13\\77.14844\\-74.22346\\-13\\79.10156\\-74.31066\\-13\\83.00781\\-74.64494\\-13\\84.96094\\-74.96642\\-13\\86.91406\\-75.69401\\-13\\90.82031\\-76.30994\\-13\\92.77344\\-76.67415\\-13\\94.72656\\-77.47543\\-13\\98.63281\\-78.60688\\-13\\100.5859\\-79.45211\\-13\\104.4922\\-80.53635\\-13\\106.4453\\-81.43563\\-13\\110.3516\\-82.66781\\-13\\112.3047\\-83.73911\\-13\\114.2578\\-84.54382\\-13\\116.2109\\-85.73527\\-13\\118.1641\\-86.5873\\-13\\120.1172\\-87.80054\\-13\\122.0703\\-88.79581\\-13\\124.0234\\-90.18346\\-13\\127.1217\\-92.83594\\-13\\129.8828\\-95.47343\\-13\\134.2036\\-100.6484\\-13\\136.6328\\-104.5547\\-13\\137.6374\\-106.5078\\-13\\138.7848\\-108.4609\\-13\\140.1098\\-110.4141\\-13\\140.9973\\-112.3672\\-13\\142.1795\\-114.3203\\-13\\142.8145\\-116.2734\\-13\\143.9141\\-118.2266\\-13\\144.6667\\-120.1797\\-13\\145.7316\\-122.1328\\-13\\147.5152\\-126.0391\\-13\\148.3109\\-127.9922\\-13\\148.8928\\-129.9453\\-13\\149.8443\\-131.8984\\-13\\151.051\\-135.8047\\-13\\151.9686\\-137.7578\\-13\\152.5248\\-139.7109\\-13\\153.3203\\-141.6803\\-13\\153.9844\\-143.6172\\-13\\154.8952\\-147.5234\\-13\\155.5657\\-149.4766\\-13\\155.9602\\-151.4297\\-13\\156.451\\-155.3359\\-13\\156.7948\\-157.2891\\-13\\157.3351\\-159.2422\\-13\\157.7402\\-161.1953\\-13\\158.0029\\-163.1484\\-13\\158.8499\\-170.9609\\-13\\159.4388\\-174.8672\\-13\\159.6327\\-176.8203\\-13\\159.8255\\-180.7266\\-13\\159.9459\\-186.5859\\-13\\159.9796\\-190.4922\\-13\\159.9381\\-196.3516\\-13\\159.8597\\-202.2109\\-13\\159.7016\\-206.1172\\-13\\159.3791\\-210.0234\\-13\\158.7656\\-213.9297\\-13\\158.0436\\-219.7891\\-13\\157.7402\\-221.7422\\-13\\156.5979\\-225.6484\\-13\\155.9053\\-229.5547\\-13\\154.5485\\-233.4609\\-13\\153.9615\\-235.4141\\-13\\152.9284\\-237.3672\\-13\\152.101\\-239.3203\\-13\\150.8992\\-241.2734\\-13\\150.046\\-243.2266\\-13\\148.8095\\-245.1797\\-13\\147.8167\\-247.1328\\-13\\146.3917\\-249.0859\\-13\\144.7707\\-251.0391\\-13\\141.8906\\-254.9453\\-13\\140.0681\\-256.8984\\-13\\138.109\\-258.8516\\-13\\135.7422\\-261.3681\\-13\\134.2969\\-262.7578\\-13\\129.8828\\-266.7893\\-13\\127.7513\\-268.6172\\-13\\125.9766\\-269.8643\\-13\\122.0703\\-273.1508\\-13\\120.1172\\-274.5765\\-13\\118.1641\\-275.7675\\-13\\116.2109\\-277.1463\\-13\\112.3047\\-279.5678\\-13\\110.3516\\-280.8873\\-13\\108.3984\\-281.7473\\-13\\106.4453\\-282.9337\\-13\\104.4922\\-283.6318\\-13\\102.5391\\-284.7977\\-13\\100.5859\\-285.6011\\-13\\98.63281\\-286.6836\\-13\\96.67969\\-287.3189\\-13\\92.77344\\-288.8558\\-13\\88.86719\\-289.7096\\-13\\86.91406\\-290.5157\\-13\\84.96094\\-290.9365\\-13\\81.05469\\-291.6091\\-13\\79.10156\\-292.1632\\-13\\77.14844\\-292.5574\\-13\\73.24219\\-292.9705\\-13\\69.33594\\-293.2386\\-13\\67.38281\\-293.2879\\-13\\63.47656\\-293.2838\\-13\\59.57031\\-293.1639\\-13\\55.66406\\-292.9671\\-13\\51.75781\\-292.7212\\-13\\50.32626\\-292.0547\\-13\\49.80469\\-291.6297\\-13\\47.85156\\-292.4416\\-13\\41.99219\\-292.4115\\-13\\34.17969\\-292.9356\\-13\\30.27344\\-293.3982\\-13\\28.32031\\-293.7318\\-13\\26.36719\\-294.1742\\-13\\22.46094\\-294.7493\\-13\\14.64844\\-295.4529\\-13\\10.74219\\-296.0006\\-13\\6.835938\\-296.4001\\-13\\2.929688\\-296.6022\\-13\\-0.9765625\\-296.71\\-13\\-8.789063\\-296.71\\-13\\-14.64844\\-296.511\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "299" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "120" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-296.1473\\-11\\-24.41406\\-295.8456\\-11\\-28.32031\\-295.3965\\-11\\-30.27344\\-295.2456\\-11\\-40.03906\\-294.6609\\-11\\-43.94531\\-294.4992\\-11\\-49.80469\\-294.4153\\-11\\-55.66406\\-294.458\\-11\\-63.47656\\-294.6197\\-11\\-67.38281\\-294.7296\\-11\\-73.24219\\-294.7372\\-11\\-77.14844\\-294.6159\\-11\\-79.10156\\-294.5056\\-11\\-81.05469\\-294.2878\\-11\\-84.96094\\-293.4626\\-11\\-88.86719\\-292.7145\\-11\\-92.77344\\-291.2766\\-11\\-94.72656\\-290.7473\\-11\\-96.67969\\-289.805\\-11\\-100.5859\\-288.5155\\-11\\-102.5391\\-287.3781\\-11\\-104.4922\\-286.5163\\-11\\-104.9057\\-286.1953\\-11\\-108.1473\\-284.2422\\-11\\-110.3516\\-283.0465\\-11\\-112.3047\\-281.7533\\-11\\-114.2578\\-280.778\\-11\\-116.2109\\-279.3413\\-11\\-118.1641\\-277.7725\\-11\\-120.1172\\-276.6161\\-11\\-122.0703\\-275.2513\\-11\\-124.0234\\-273.682\\-11\\-125.9766\\-271.9831\\-11\\-129.8828\\-268.8474\\-11\\-131.8359\\-267.0066\\-11\\-134.1368\\-264.7109\\-11\\-136.0021\\-262.7578\\-11\\-137.6953\\-260.7121\\-11\\-139.1341\\-258.8516\\-11\\-140.8165\\-256.8984\\-11\\-142.3689\\-254.9453\\-11\\-144.7206\\-251.0391\\-11\\-146.1848\\-249.0859\\-11\\-147.4609\\-246.9375\\-11\\-148.3948\\-245.1797\\-11\\-150.26\\-241.2734\\-11\\-150.9752\\-239.3203\\-11\\-152.0759\\-237.3672\\-11\\-152.7926\\-235.4141\\-11\\-153.7816\\-233.4609\\-11\\-154.9177\\-229.5547\\-11\\-155.69\\-227.6016\\-11\\-156.1302\\-225.6484\\-11\\-156.4605\\-223.6953\\-11\\-156.9465\\-221.7422\\-11\\-157.7348\\-219.7891\\-11\\-158.4806\\-215.8828\\-11\\-158.968\\-213.9297\\-11\\-159.5861\\-211.9766\\-11\\-159.9459\\-210.0234\\-11\\-160.4724\\-206.1172\\-11\\-161.1405\\-202.2109\\-11\\-161.6399\\-198.3047\\-11\\-161.8726\\-194.3984\\-11\\-162.0509\\-186.5859\\-11\\-162.0502\\-178.7734\\-11\\-161.9623\\-174.8672\\-11\\-161.7818\\-170.9609\\-11\\-161.377\\-167.0547\\-11\\-160.593\\-163.1484\\-11\\-159.688\\-157.2891\\-11\\-158.4977\\-153.3828\\-11\\-157.5936\\-149.4766\\-11\\-156.7513\\-147.5234\\-11\\-155.862\\-143.6172\\-11\\-155.0078\\-141.6641\\-11\\-153.7122\\-137.7578\\-11\\-152.6673\\-135.8047\\-11\\-151.9897\\-133.8516\\-11\\-150.9752\\-131.8984\\-11\\-149.4385\\-127.9922\\-11\\-148.4938\\-126.0391\\-11\\-147.731\\-124.0859\\-11\\-146.628\\-122.1328\\-11\\-145.6586\\-120.1797\\-11\\-144.5038\\-118.2266\\-11\\-141.6098\\-112.3672\\-11\\-140.4832\\-110.4141\\-11\\-139.1438\\-108.4609\\-11\\-138.0846\\-106.5078\\-11\\-136.7188\\-104.5547\\-11\\-135.7422\\-102.9942\\-11\\-134.0736\\-100.6484\\-11\\-132.4219\\-98.69531\\-11\\-129.8828\\-95.95669\\-11\\-127.9297\\-94.10012\\-11\\-125.9766\\-92.44663\\-11\\-123.9355\\-90.88281\\-11\\-122.0703\\-89.60526\\-11\\-120.1172\\-88.16336\\-11\\-118.1641\\-87.39509\\-11\\-112.3047\\-83.7507\\-11\\-110.3516\\-83.33527\\-11\\-108.3984\\-82.36196\\-11\\-106.4453\\-81.83641\\-11\\-104.4922\\-80.97999\\-11\\-102.5391\\-80.48529\\-11\\-100.5859\\-79.8555\\-11\\-96.67969\\-78.42637\\-11\\-94.72656\\-77.7984\\-11\\-92.77344\\-77.36428\\-11\\-90.82031\\-76.80972\\-11\\-88.86719\\-76.3555\\-11\\-86.91406\\-76.09391\\-11\\-83.00781\\-75.68805\\-11\\-81.05469\\-74.67035\\-11\\-79.10156\\-74.47523\\-11\\-69.33594\\-74.09224\\-11\\-67.38281\\-73.16925\\-11\\-65.42969\\-72.92766\\-11\\-57.61719\\-72.85171\\-11\\-53.71094\\-72.90796\\-11\\-51.75781\\-72.87931\\-11\\-49.80469\\-73.15608\\-11\\-47.85156\\-74.19405\\-11\\-41.99219\\-74.35314\\-11\\-38.08594\\-74.59138\\-11\\-36.13281\\-74.78761\\-11\\-34.17969\\-75.19837\\-11\\-32.22656\\-75.80244\\-11\\-28.32031\\-76.36496\\-11\\-26.36719\\-76.82967\\-11\\-24.41406\\-77.6358\\-11\\-22.46094\\-78.25524\\-11\\-20.50781\\-79.06932\\-11\\-18.55469\\-80.01041\\-11\\-16.60156\\-80.66281\\-11\\-14.64844\\-81.7487\\-11\\-12.69531\\-82.35109\\-11\\-8.889457\\-85.02344\\-11\\-2.929688\\-89.9422\\-11\\-0.9765625\\-90.98199\\-11\\0.9765625\\-91.31081\\-11\\2.929688\\-90.73421\\-11\\4.882813\\-89.72092\\-11\\8.789063\\-86.32349\\-11\\10.74219\\-84.46629\\-11\\12.69531\\-82.75751\\-11\\15.21721\\-81.11719\\-11\\18.55469\\-79.38705\\-11\\20.50781\\-78.27682\\-11\\24.41406\\-76.45426\\-11\\26.36719\\-76.02339\\-11\\30.27344\\-74.69099\\-11\\32.22656\\-74.40257\\-11\\34.17969\\-74.21806\\-11\\36.13281\\-72.81641\\-11\\38.08594\\-72.71983\\-11\\40.03906\\-72.32813\\-11\\41.99219\\-71.75246\\-11\\49.80469\\-71.71777\\-11\\53.71094\\-71.67383\\-11\\55.66406\\-71.7441\\-11\\59.57031\\-71.756\\-11\\63.47656\\-71.91095\\-11\\65.42969\\-72.20313\\-11\\67.38281\\-72.61317\\-11\\73.24219\\-72.82507\\-11\\75.19531\\-73.00072\\-11\\77.14844\\-74.23502\\-11\\79.10156\\-74.3286\\-11\\83.00781\\-74.66368\\-11\\84.96094\\-75.00762\\-11\\86.91406\\-75.72375\\-11\\90.82031\\-76.31625\\-11\\92.77344\\-76.7607\\-11\\94.72656\\-77.56065\\-11\\98.63281\\-78.67886\\-11\\100.5859\\-79.50105\\-11\\104.4922\\-80.60911\\-11\\106.4453\\-81.52294\\-11\\110.3516\\-82.73569\\-11\\112.3047\\-83.79987\\-11\\114.2578\\-84.60749\\-11\\116.2109\\-85.79894\\-11\\118.1641\\-86.66267\\-11\\120.1172\\-87.83181\\-11\\122.0703\\-88.889\\-11\\124.0234\\-90.28639\\-11\\124.5968\\-90.88281\\-11\\126.9393\\-92.83594\\-11\\129.014\\-94.78906\\-11\\129.8828\\-95.70506\\-11\\132.3785\\-98.69531\\-11\\133.9063\\-100.6484\\-11\\136.4425\\-104.5547\\-11\\137.289\\-106.5078\\-11\\137.6953\\-107.0232\\-11\\139.7839\\-110.4141\\-11\\140.7429\\-112.3672\\-11\\141.9126\\-114.3203\\-11\\142.6331\\-116.2734\\-11\\143.5785\\-118.2266\\-11\\145.2933\\-122.1328\\-11\\146.3456\\-124.0859\\-11\\147.1286\\-126.0391\\-11\\148.1099\\-127.9922\\-11\\148.6739\\-129.9453\\-11\\149.5007\\-131.8984\\-11\\150.22\\-133.8516\\-11\\150.7303\\-135.8047\\-11\\151.6641\\-137.7578\\-11\\152.9009\\-141.6641\\-11\\153.7246\\-143.6172\\-11\\154.6123\\-147.5234\\-11\\155.735\\-151.4297\\-11\\156.0752\\-153.3828\\-11\\156.5265\\-157.2891\\-11\\156.8646\\-159.2422\\-11\\157.3882\\-161.1953\\-11\\157.7728\\-163.1484\\-11\\157.997\\-165.1016\\-11\\158.5449\\-170.9609\\-11\\158.9788\\-174.8672\\-11\\159.2605\\-176.8203\\-11\\159.4272\\-178.7734\\-11\\159.6505\\-182.6797\\-11\\159.7678\\-190.4922\\-11\\159.7338\\-196.3516\\-11\\159.6327\\-202.2109\\-11\\159.5365\\-204.1641\\-11\\159.1873\\-208.0703\\-11\\158.6914\\-211.9766\\-11\\158.295\\-215.8828\\-11\\157.8442\\-219.7891\\-11\\157.401\\-221.7422\\-11\\156.7415\\-223.6953\\-11\\156.0872\\-227.6016\\-11\\155.6085\\-229.5547\\-11\\154.8253\\-231.5078\\-11\\153.6193\\-235.4141\\-11\\152.5678\\-237.3672\\-11\\151.7334\\-239.3203\\-11\\150.5584\\-241.2734\\-11\\149.662\\-243.2266\\-11\\147.4609\\-246.8964\\-11\\146.0125\\-249.0859\\-11\\142.8158\\-252.9922\\-11\\141.6016\\-254.5972\\-11\\137.4333\\-258.8516\\-11\\135.7508\\-260.8047\\-11\\133.6559\\-262.7578\\-11\\131.8359\\-264.2744\\-11\\129.3645\\-266.6641\\-11\\127.1052\\-268.6172\\-11\\122.0703\\-272.6061\\-11\\118.1641\\-275.4276\\-11\\116.2109\\-276.7139\\-11\\114.2578\\-277.7677\\-11\\112.3047\\-279.1813\\-11\\110.3516\\-280.4068\\-11\\106.4453\\-282.4798\\-11\\104.4922\\-283.3073\\-11\\102.5391\\-284.3088\\-11\\98.56771\\-286.1953\\-11\\96.67969\\-287.0091\\-11\\94.72656\\-287.6187\\-11\\92.77344\\-288.455\\-11\\90.82031\\-288.9915\\-11\\88.86719\\-289.3309\\-11\\86.91406\\-289.8359\\-11\\84.96094\\-290.5749\\-11\\83.00781\\-290.9336\\-11\\79.10156\\-291.5398\\-11\\75.19531\\-292.4317\\-11\\73.24219\\-292.679\\-11\\69.33594\\-292.9311\\-11\\63.47656\\-293.0061\\-11\\59.57031\\-292.9612\\-11\\55.66406\\-292.8009\\-11\\49.80469\\-292.4986\\-11\\47.85156\\-292.4416\\-11\\43.94531\\-292.4611\\-11\\41.99219\\-292.5343\\-11\\38.08594\\-292.8153\\-11\\34.17969\\-293.179\\-11\\32.22656\\-293.4506\\-11\\28.32031\\-294.2623\\-11\\26.36719\\-294.5703\\-11\\20.50781\\-295.1636\\-11\\16.60156\\-295.6052\\-11\\12.69531\\-296.263\\-11\\10.74219\\-296.4897\\-11\\6.835938\\-296.7455\\-11\\-0.9765625\\-296.9843\\-11\\-6.835938\\-296.9897\\-11\\-10.74219\\-296.9219\\-11\\-14.64844\\-296.7774\\-11\\-18.55469\\-296.5493\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "300" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "121" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-296.2511\\-9\\-28.32031\\-295.6216\\-9\\-30.27344\\-295.3876\\-9\\-36.13281\\-294.9784\\-9\\-41.99219\\-294.6489\\-9\\-45.89844\\-294.5176\\-9\\-53.71094\\-294.3356\\-9\\-63.47656\\-294.4207\\-9\\-65.42969\\-294.4898\\-9\\-69.33594\\-294.5182\\-9\\-73.24219\\-294.464\\-9\\-77.14844\\-294.2779\\-9\\-79.10156\\-294.0754\\-9\\-86.91406\\-292.7897\\-9\\-88.86719\\-292.3138\\-9\\-90.82031\\-291.4991\\-9\\-92.77344\\-291.0034\\-9\\-94.72656\\-290.3872\\-9\\-96.67969\\-289.4443\\-9\\-98.63281\\-288.9087\\-9\\-102.5391\\-287.0963\\-9\\-106.4453\\-284.9539\\-9\\-108.3984\\-283.6537\\-9\\-110.3516\\-282.7603\\-9\\-112.3047\\-281.494\\-9\\-114.2578\\-280.3744\\-9\\-116.2109\\-279.0443\\-9\\-118.1641\\-277.5021\\-9\\-120.1172\\-276.1411\\-9\\-122.0703\\-274.9858\\-9\\-124.0234\\-273.414\\-9\\-125.9766\\-271.6771\\-9\\-129.7291\\-268.6172\\-9\\-133.7158\\-264.7109\\-9\\-135.7422\\-262.6055\\-9\\-138.8425\\-258.8516\\-9\\-140.5628\\-256.8984\\-9\\-142.1311\\-254.9453\\-9\\-143.1626\\-252.9922\\-9\\-145.905\\-249.0859\\-9\\-147.0048\\-247.1328\\-9\\-148.2088\\-245.1797\\-9\\-149.057\\-243.2266\\-9\\-150.1194\\-241.2734\\-9\\-150.7346\\-239.3203\\-9\\-151.8585\\-237.3672\\-9\\-152.5534\\-235.4141\\-9\\-153.5335\\-233.4609\\-9\\-154.1534\\-231.5078\\-9\\-154.671\\-229.5547\\-9\\-155.4312\\-227.6016\\-9\\-155.9842\\-225.6484\\-9\\-156.7383\\-221.7422\\-9\\-157.5414\\-219.7891\\-9\\-157.9949\\-217.8359\\-9\\-158.7369\\-213.9297\\-9\\-159.3791\\-211.9766\\-9\\-159.8113\\-210.0234\\-9\\-160.8921\\-202.2109\\-9\\-161.229\\-200.2578\\-9\\-161.6491\\-196.3516\\-9\\-161.7454\\-194.3984\\-9\\-161.9152\\-186.5859\\-9\\-161.9129\\-180.7266\\-9\\-161.7899\\-174.8672\\-9\\-161.5326\\-170.9609\\-9\\-161.311\\-169.0078\\-9\\-160.3119\\-163.1484\\-9\\-159.7744\\-159.2422\\-9\\-159.3283\\-157.2891\\-9\\-158.6766\\-155.3359\\-9\\-157.8578\\-151.4297\\-9\\-156.506\\-147.5234\\-9\\-156.1166\\-145.5703\\-9\\-155.5942\\-143.6172\\-9\\-154.7108\\-141.6641\\-9\\-154.1255\\-139.7109\\-9\\-153.3879\\-137.7578\\-9\\-152.4251\\-135.8047\\-9\\-151.6927\\-133.8516\\-9\\-150.6854\\-131.8984\\-9\\-150.0878\\-129.9453\\-9\\-149.1107\\-127.9922\\-9\\-148.3436\\-126.0391\\-9\\-147.4688\\-124.0859\\-9\\-145.3605\\-120.1797\\-9\\-144.3666\\-118.2266\\-9\\-143.2292\\-116.2734\\-9\\-142.4537\\-114.3203\\-9\\-140.2902\\-110.4141\\-9\\-138.8922\\-108.4609\\-9\\-137.8697\\-106.5078\\-9\\-136.5838\\-104.5547\\-9\\-135.1335\\-102.6016\\-9\\-133.7976\\-100.6484\\-9\\-132.2417\\-98.69531\\-9\\-129.8828\\-96.15327\\-9\\-127.9297\\-94.28993\\-9\\-120.9001\\-88.92969\\-9\\-120.1172\\-88.24326\\-9\\-118.1641\\-87.55704\\-9\\-116.2109\\-86.43884\\-9\\-114.0839\\-85.02344\\-9\\-112.3047\\-84.01659\\-9\\-110.3516\\-83.53365\\-9\\-108.3984\\-82.50916\\-9\\-104.4922\\-81.31567\\-9\\-102.5391\\-80.48529\\-9\\-100.5859\\-80.19056\\-9\\-98.37891\\-79.16406\\-9\\-96.67969\\-78.66721\\-9\\-94.72656\\-77.97049\\-9\\-90.82031\\-77.06233\\-9\\-88.86719\\-76.47662\\-9\\-86.91406\\-76.13265\\-9\\-83.00781\\-75.70483\\-9\\-81.05469\\-74.69648\\-9\\-79.10156\\-74.46436\\-9\\-75.19531\\-74.32397\\-9\\-71.28906\\-73.92997\\-9\\-69.33594\\-73.00776\\-9\\-67.38281\\-72.86079\\-9\\-61.52344\\-72.79937\\-9\\-57.61719\\-72.81641\\-9\\-53.71094\\-72.89829\\-9\\-51.75781\\-72.84272\\-9\\-49.80469\\-72.9377\\-9\\-47.85156\\-73.96688\\-9\\-43.94531\\-74.24056\\-9\\-38.08594\\-74.55288\\-9\\-36.13281\\-74.74123\\-9\\-34.17969\\-75.15022\\-9\\-32.22656\\-75.77146\\-9\\-28.32031\\-76.32979\\-9\\-26.36719\\-76.75478\\-9\\-24.41406\\-77.52748\\-9\\-20.50781\\-78.91658\\-9\\-18.55469\\-79.92964\\-9\\-16.60156\\-80.53253\\-9\\-14.64844\\-81.48886\\-9\\-12.69531\\-82.21745\\-9\\-8.511413\\-85.02344\\-9\\-6.835938\\-86.33804\\-9\\-3.882998\\-88.92969\\-9\\-2.929688\\-89.6666\\-9\\-0.9765625\\-90.5638\\-9\\0.9765625\\-90.8601\\-9\\2.929688\\-90.35697\\-9\\4.882813\\-89.39642\\-9\\6.835938\\-87.71088\\-9\\9.83538\\-85.02344\\-9\\12.26049\\-83.07031\\-9\\12.69531\\-82.62576\\-9\\15.01465\\-81.11719\\-9\\20.50781\\-78.21089\\-9\\24.41406\\-76.42586\\-9\\26.36719\\-76.00214\\-9\\30.27344\\-74.64494\\-9\\34.17969\\-74.21806\\-9\\36.13281\\-72.81641\\-9\\40.03906\\-72.64856\\-9\\41.99219\\-71.8046\\-9\\47.85156\\-71.70931\\-9\\49.80469\\-71.75533\\-9\\55.66406\\-71.71289\\-9\\61.52344\\-71.79999\\-9\\63.47656\\-71.98767\\-9\\65.42969\\-72.50294\\-9\\67.38281\\-72.66221\\-9\\73.24219\\-72.82507\\-9\\75.19531\\-73.00072\\-9\\77.14844\\-74.25786\\-9\\81.05469\\-74.5032\\-9\\83.00781\\-74.71066\\-9\\84.96094\\-75.10189\\-9\\86.91406\\-75.78414\\-9\\90.82031\\-76.35133\\-9\\92.77344\\-76.80882\\-9\\94.72656\\-77.6414\\-9\\98.63281\\-78.76714\\-9\\100.5859\\-79.53967\\-9\\104.4922\\-80.68695\\-9\\106.4453\\-81.61543\\-9\\108.3984\\-82.15294\\-9\\110.3516\\-82.83508\\-9\\112.3047\\-83.87289\\-9\\114.2578\\-84.67692\\-9\\116.2109\\-85.85806\\-9\\118.1641\\-86.72524\\-9\\121.9161\\-88.92969\\-9\\124.0234\\-90.42941\\-9\\124.4523\\-90.88281\\-9\\126.7241\\-92.83594\\-9\\128.7618\\-94.78906\\-9\\129.8828\\-95.99497\\-9\\132.1303\\-98.69531\\-9\\133.7891\\-100.9709\\-9\\136.2062\\-104.5547\\-9\\137.0465\\-106.5078\\-9\\138.3369\\-108.4609\\-9\\139.2963\\-110.4141\\-9\\140.5268\\-112.3672\\-9\\142.4676\\-116.2734\\-9\\143.1796\\-118.2266\\-9\\144.2506\\-120.1797\\-9\\144.9597\\-122.1328\\-9\\146.0859\\-124.0859\\-9\\146.8119\\-126.0391\\-9\\147.8396\\-127.9922\\-9\\149.1277\\-131.8984\\-9\\150.0165\\-133.8516\\-9\\150.486\\-135.8047\\-9\\151.1957\\-137.7578\\-9\\152.0348\\-139.7109\\-9\\152.5662\\-141.6641\\-9\\153.9465\\-145.5703\\-9\\154.7619\\-149.4766\\-9\\155.3734\\-151.4297\\-9\\155.8581\\-153.3828\\-9\\156.1369\\-155.3359\\-9\\156.5615\\-159.2422\\-9\\156.901\\-161.1953\\-9\\157.4136\\-163.1484\\-9\\157.7648\\-165.1016\\-9\\158.1454\\-169.0078\\-9\\158.4433\\-172.9141\\-9\\158.7954\\-176.8203\\-9\\159.2605\\-182.6797\\-9\\159.3914\\-186.5859\\-9\\159.4388\\-190.4922\\-9\\159.4272\\-194.3984\\-9\\159.4837\\-196.3516\\-9\\159.3151\\-202.2109\\-9\\159.172\\-204.1641\\-9\\158.1122\\-215.8828\\-9\\157.6036\\-219.7891\\-9\\156.9734\\-221.7422\\-9\\156.4794\\-223.6953\\-9\\155.8268\\-227.6016\\-9\\154.5053\\-231.5078\\-9\\154.0033\\-233.4609\\-9\\152.2433\\-237.3672\\-9\\151.1659\\-239.3203\\-9\\150.2722\\-241.2734\\-9\\149.134\\-243.2266\\-9\\148.1855\\-245.1797\\-9\\145.5078\\-249.0226\\-9\\144.0499\\-251.0391\\-9\\142.4888\\-252.9922\\-9\\140.8001\\-254.9453\\-9\\138.7708\\-256.8984\\-9\\135.7422\\-260.09\\-9\\132.9655\\-262.7578\\-9\\131.8359\\-263.7737\\-9\\127.9297\\-267.5169\\-9\\125.9766\\-269.1233\\-9\\122.0703\\-271.9401\\-9\\120.1172\\-273.5571\\-9\\118.1641\\-275.0394\\-9\\116.2109\\-276.1193\\-9\\112.3047\\-278.7174\\-9\\110.3516\\-279.8051\\-9\\108.3984\\-281.0714\\-9\\106.4453\\-281.8943\\-9\\104.4922\\-282.9964\\-9\\102.5391\\-283.7018\\-9\\100.5859\\-284.815\\-9\\98.63281\\-285.562\\-9\\96.67969\\-286.6102\\-9\\92.77344\\-287.8441\\-9\\90.82031\\-288.6635\\-9\\88.86719\\-289.0833\\-9\\86.91406\\-289.3886\\-9\\84.96094\\-289.9152\\-9\\83.00781\\-290.5416\\-9\\81.05469\\-290.8938\\-9\\77.14844\\-291.4358\\-9\\73.24219\\-292.2417\\-9\\71.28906\\-292.4801\\-9\\69.33594\\-292.6009\\-9\\65.42969\\-292.711\\-9\\59.57031\\-292.7248\\-9\\53.71094\\-292.5167\\-9\\47.85156\\-292.3695\\-9\\43.94531\\-292.5077\\-9\\38.08594\\-292.9535\\-9\\34.17969\\-293.4242\\-9\\32.22656\\-293.7868\\-9\\30.27344\\-294.2502\\-9\\28.32031\\-294.5754\\-9\\20.50781\\-295.3945\\-9\\16.60156\\-296.1048\\-9\\14.64844\\-296.4102\\-9\\10.74219\\-296.7972\\-9\\6.835938\\-297.0058\\-9\\0.9765625\\-297.2459\\-9\\-2.929688\\-297.3246\\-9\\-10.74219\\-297.1942\\-9\\-14.64844\\-296.9477\\-9\\-20.50781\\-296.6519\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "286" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "122" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-26.36719\\-296.2511\\-7\\-30.27344\\-295.5636\\-7\\-34.17969\\-295.198\\-7\\-40.03906\\-294.802\\-7\\-45.89844\\-294.5299\\-7\\-47.85156\\-294.4868\\-7\\-53.71094\\-294.2256\\-7\\-55.66406\\-294.1975\\-7\\-63.47656\\-294.186\\-7\\-67.38281\\-294.213\\-7\\-73.24219\\-294.0608\\-7\\-79.10156\\-293.5605\\-7\\-84.96094\\-292.8142\\-7\\-86.91406\\-292.424\\-7\\-88.86719\\-291.6909\\-7\\-92.77344\\-290.6987\\-7\\-94.72656\\-289.8072\\-7\\-98.63281\\-288.6164\\-7\\-100.5859\\-287.584\\-7\\-102.5391\\-286.8042\\-7\\-104.4922\\-285.5623\\-7\\-106.4453\\-284.6084\\-7\\-108.3984\\-283.3735\\-7\\-110.3516\\-282.3623\\-7\\-112.3047\\-281.2332\\-7\\-116.2109\\-278.6568\\-7\\-120.1172\\-275.7894\\-7\\-122.0703\\-274.6406\\-7\\-124.0234\\-273.1147\\-7\\-124.627\\-272.5234\\-7\\-127.0119\\-270.5703\\-7\\-129.8828\\-268.1028\\-7\\-135.2278\\-262.7578\\-7\\-137.6953\\-259.9279\\-7\\-139.6484\\-257.5606\\-7\\-140.293\\-256.8984\\-7\\-141.8108\\-254.9453\\-7\\-142.8805\\-252.9922\\-7\\-144.2979\\-251.0391\\-7\\-147.4609\\-245.9628\\-7\\-148.007\\-245.1797\\-7\\-148.8188\\-243.2266\\-7\\-149.9256\\-241.2734\\-7\\-150.5572\\-239.3203\\-7\\-151.5819\\-237.3672\\-7\\-153.9808\\-231.5078\\-7\\-154.4792\\-229.5547\\-7\\-155.7947\\-225.6484\\-7\\-156.5574\\-221.7422\\-7\\-157.8179\\-217.8359\\-7\\-158.5161\\-213.9297\\-7\\-159.03\\-211.9766\\-7\\-159.6416\\-210.0234\\-7\\-159.9381\\-208.0703\\-7\\-160.6294\\-202.2109\\-7\\-161.2004\\-198.3047\\-7\\-161.556\\-194.3984\\-7\\-161.556\\-192.4453\\-7\\-161.7286\\-186.5859\\-7\\-161.6989\\-178.7734\\-7\\-161.5532\\-174.8672\\-7\\-161.4148\\-172.9141\\-7\\-160.6028\\-167.0547\\-7\\-159.8498\\-161.1953\\-7\\-159.4837\\-159.2422\\-7\\-158.8477\\-157.2891\\-7\\-157.5753\\-151.4297\\-7\\-156.7513\\-149.4766\\-7\\-155.9309\\-145.5703\\-7\\-154.4717\\-141.6641\\-7\\-153.9063\\-139.7109\\-7\\-152.9574\\-137.7578\\-7\\-152.2005\\-135.8047\\-7\\-150.4725\\-131.8984\\-7\\-149.882\\-129.9453\\-7\\-148.8589\\-127.9922\\-7\\-148.1648\\-126.0391\\-7\\-147.161\\-124.0859\\-7\\-146.2693\\-122.1328\\-7\\-145.0534\\-120.1797\\-7\\-144.2238\\-118.2266\\-7\\-143.0361\\-116.2734\\-7\\-142.2852\\-114.3203\\-7\\-141.0499\\-112.3672\\-7\\-140.0764\\-110.4141\\-7\\-138.7121\\-108.4609\\-7\\-136.4397\\-104.5547\\-7\\-133.7891\\-100.9861\\-7\\-131.955\\-98.69531\\-7\\-129.8828\\-96.40853\\-7\\-127.9297\\-94.54294\\-7\\-125.9766\\-93.17926\\-7\\-124.0234\\-91.68066\\-7\\-122.0703\\-90.01547\\-7\\-120.1172\\-88.51891\\-7\\-118.1641\\-87.71902\\-7\\-113.732\\-85.02344\\-7\\-110.3516\\-83.68238\\-7\\-108.3984\\-82.69054\\-7\\-104.4922\\-81.36133\\-7\\-102.5391\\-80.54313\\-7\\-100.5859\\-80.23094\\-7\\-98.07751\\-79.16406\\-7\\-94.72656\\-78.06361\\-7\\-92.77344\\-77.69204\\-7\\-90.82031\\-77.15875\\-7\\-88.86719\\-76.5\\-7\\-86.91406\\-76.17897\\-7\\-83.00781\\-75.74268\\-7\\-81.05469\\-74.87533\\-7\\-79.10156\\-74.52539\\-7\\-75.19531\\-74.33038\\-7\\-73.24219\\-73.52867\\-7\\-71.28906\\-72.41624\\-7\\-69.33594\\-72.73059\\-7\\-67.38281\\-72.76647\\-7\\-59.57031\\-72.77455\\-7\\-55.66406\\-72.86079\\-7\\-51.75781\\-72.82507\\-7\\-47.85156\\-72.91775\\-7\\-43.94531\\-74.21731\\-7\\-41.99219\\-74.28713\\-7\\-38.08594\\-74.55288\\-7\\-36.13281\\-74.73466\\-7\\-34.17969\\-75.15202\\-7\\-32.22656\\-75.7558\\-7\\-28.32031\\-76.3125\\-7\\-26.36719\\-76.69793\\-7\\-20.50781\\-78.82797\\-7\\-18.55469\\-79.76953\\-7\\-16.60156\\-80.41087\\-7\\-14.64844\\-81.32645\\-7\\-12.69531\\-82.11962\\-7\\-11.11779\\-83.07031\\-7\\-8.176492\\-85.02344\\-7\\-5.8922\\-86.97656\\-7\\-2.929688\\-89.39324\\-7\\-0.9765625\\-90.2489\\-7\\0.9765625\\-90.45481\\-7\\2.929688\\-90.10265\\-7\\4.882813\\-89.10938\\-7\\6.835938\\-87.51563\\-7\\9.640625\\-85.02344\\-7\\12.69531\\-82.48575\\-7\\14.86171\\-81.11719\\-7\\20.50781\\-78.17006\\-7\\24.41406\\-76.40854\\-7\\26.36719\\-75.98274\\-7\\28.32031\\-75.23142\\-7\\30.27344\\-74.62238\\-7\\34.17969\\-74.22955\\-7\\36.13281\\-72.83385\\-7\\40.03906\\-72.65535\\-7\\41.99219\\-72.00559\\-7\\43.94531\\-71.7442\\-7\\45.89844\\-71.72027\\-7\\49.80469\\-71.77412\\-7\\55.66406\\-71.70393\\-7\\61.52344\\-71.83008\\-7\\63.47656\\-72.47028\\-7\\65.42969\\-72.64856\\-7\\69.33594\\-72.71235\\-7\\73.24219\\-72.84272\\-7\\75.19531\\-73.15608\\-7\\77.14844\\-74.2636\\-7\\81.05469\\-74.51588\\-7\\83.00781\\-74.74494\\-7\\84.96094\\-75.35938\\-7\\86.91406\\-75.86117\\-7\\90.82031\\-76.39515\\-7\\92.77344\\-76.89657\\-7\\94.72656\\-77.69312\\-7\\96.67969\\-78.32184\\-7\\98.63281\\-78.80724\\-7\\100.5859\\-79.57774\\-7\\104.4922\\-80.75629\\-7\\106.4453\\-81.66118\\-7\\108.3984\\-82.21212\\-7\\110.3516\\-82.94358\\-7\\112.3047\\-83.94263\\-7\\114.2578\\-84.76435\\-7\\116.2109\\-85.8972\\-7\\118.1641\\-86.81881\\-7\\121.7415\\-88.92969\\-7\\124.0234\\-90.57717\\-7\\126.5625\\-92.83594\\-7\\128.6069\\-94.78906\\-7\\130.3573\\-96.74219\\-7\\133.2031\\-100.6484\\-7\\134.6928\\-102.6016\\-7\\135.8895\\-104.5547\\-7\\136.8502\\-106.5078\\-7\\138.0521\\-108.4609\\-7\\138.9574\\-110.4141\\-7\\140.2937\\-112.3672\\-7\\141.1727\\-114.3203\\-7\\142.2674\\-116.2734\\-7\\142.9228\\-118.2266\\-7\\143.9779\\-120.1797\\-7\\144.6959\\-122.1328\\-7\\145.7705\\-124.0859\\-7\\146.5506\\-126.0391\\-7\\147.4687\\-127.9922\\-7\\148.2648\\-129.9453\\-7\\148.8268\\-131.8984\\-7\\149.7372\\-133.8516\\-7\\150.7924\\-137.7578\\-7\\151.7286\\-139.7109\\-7\\152.8568\\-143.6172\\-7\\153.6501\\-145.5703\\-7\\154.1158\\-147.5234\\-7\\154.9432\\-151.4297\\-7\\155.5411\\-153.3828\\-7\\155.935\\-155.3359\\-7\\156.5936\\-161.1953\\-7\\156.9127\\-163.1484\\-7\\157.4136\\-165.1016\\-7\\157.7234\\-167.0547\\-7\\158.0835\\-170.9609\\-7\\158.3534\\-174.8672\\-7\\158.7093\\-180.7266\\-7\\158.9073\\-186.5859\\-7\\158.9152\\-192.4453\\-7\\159.0558\\-196.3516\\-7\\158.8607\\-202.2109\\-7\\158.6709\\-206.1172\\-7\\158.0919\\-213.9297\\-7\\157.633\\-217.8359\\-7\\156.6147\\-221.7422\\-7\\155.9966\\-225.6484\\-7\\155.5011\\-227.6016\\-7\\154.7591\\-229.5547\\-7\\153.6841\\-233.4609\\-7\\152.6912\\-235.4141\\-7\\151.9104\\-237.3672\\-7\\150.7265\\-239.3203\\-7\\149.9581\\-241.2734\\-7\\148.7564\\-243.2266\\-7\\147.796\\-245.1797\\-7\\145.5078\\-248.3906\\-7\\144.9084\\-249.0859\\-7\\142.0934\\-252.9922\\-7\\140.3876\\-254.9453\\-7\\138.3867\\-256.8984\\-7\\134.6331\\-260.8047\\-7\\127.9297\\-267.0446\\-7\\124.0234\\-269.9731\\-7\\120.1172\\-273.1411\\-7\\118.1641\\-274.4849\\-7\\114.2578\\-277.0132\\-7\\112.3047\\-278.062\\-7\\108.3984\\-280.6521\\-7\\106.4453\\-281.5213\\-7\\104.4922\\-282.5901\\-7\\102.5391\\-283.3549\\-7\\100.5859\\-284.2798\\-7\\94.72656\\-286.8823\\-7\\92.77344\\-287.4086\\-7\\90.79996\\-288.1484\\-7\\88.86719\\-288.7628\\-7\\84.96094\\-289.4363\\-7\\83.00781\\-289.9003\\-7\\81.05469\\-290.5033\\-7\\79.10156\\-290.8634\\-7\\69.33594\\-292.0923\\-7\\67.38281\\-292.2417\\-7\\63.47656\\-292.3908\\-7\\59.57031\\-292.4217\\-7\\53.71094\\-292.2785\\-7\\47.85156\\-292.2904\\-7\\43.94531\\-292.5515\\-7\\38.08594\\-293.0913\\-7\\36.13281\\-293.3474\\-7\\30.27344\\-294.5182\\-7\\28.32031\\-294.7713\\-7\\24.41406\\-295.1686\\-7\\20.50781\\-295.7186\\-7\\18.55469\\-296.1607\\-7\\16.60156\\-296.4897\\-7\\10.74219\\-297.0442\\-7\\0.9765625\\-297.6281\\-7\\-2.929688\\-297.7439\\-7\\-10.74219\\-297.4965\\-7\\-14.64844\\-297.1253\\-7\\-20.50781\\-296.8167\\-7\\-24.41406\\-296.5021\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "288" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "123" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-297.9061\\-5\\-14.64844\\-297.3365\\-5\\-24.41406\\-296.6737\\-5\\-26.36719\\-296.4805\\-5\\-28.32031\\-296.1869\\-5\\-30.27344\\-295.776\\-5\\-34.17969\\-295.2872\\-5\\-40.03906\\-294.866\\-5\\-47.85156\\-294.4677\\-5\\-49.80469\\-294.3997\\-5\\-53.71094\\-294.118\\-5\\-57.61719\\-293.9544\\-5\\-61.52344\\-293.9102\\-5\\-67.38281\\-293.79\\-5\\-73.24219\\-293.6057\\-5\\-77.14844\\-293.3511\\-5\\-81.05469\\-293.0061\\-5\\-84.96094\\-292.4732\\-5\\-86.91406\\-291.8002\\-5\\-88.86719\\-291.287\\-5\\-90.82031\\-290.8879\\-5\\-92.77344\\-290.2655\\-5\\-94.72656\\-289.4161\\-5\\-96.67969\\-288.953\\-5\\-98.63281\\-288.1726\\-5\\-102.5391\\-286.4223\\-5\\-106.2207\\-284.2422\\-5\\-108.3984\\-283.1149\\-5\\-110.3516\\-281.9293\\-5\\-112.3047\\-280.9423\\-5\\-115.9307\\-278.3828\\-5\\-118.1641\\-276.9678\\-5\\-121.6996\\-274.4766\\-5\\-124.0234\\-272.731\\-5\\-128.9288\\-268.6172\\-5\\-129.8828\\-267.7559\\-5\\-135.7422\\-261.8188\\-5\\-139.6484\\-257.2192\\-5\\-139.9764\\-256.8984\\-5\\-141.6016\\-254.6893\\-5\\-144.0296\\-251.0391\\-5\\-145.1355\\-249.0859\\-5\\-145.5078\\-248.6319\\-5\\-147.749\\-245.1797\\-5\\-148.6013\\-243.2266\\-5\\-149.6601\\-241.2734\\-5\\-151.2082\\-237.3672\\-5\\-152.1667\\-235.4141\\-5\\-152.8568\\-233.4609\\-5\\-153.781\\-231.5078\\-5\\-154.8253\\-227.6016\\-5\\-155.5411\\-225.6484\\-5\\-156.0535\\-223.6953\\-5\\-156.8427\\-219.7891\\-5\\-157.5521\\-217.8359\\-5\\-157.9949\\-215.8828\\-5\\-158.3177\\-213.9297\\-5\\-158.7463\\-211.9766\\-5\\-159.4154\\-210.0234\\-5\\-159.8045\\-208.0703\\-5\\-160.2585\\-204.1641\\-5\\-160.6353\\-200.2578\\-5\\-160.8904\\-198.3047\\-5\\-161.2713\\-194.3984\\-5\\-161.2847\\-192.4453\\-5\\-161.4739\\-186.5859\\-5\\-161.5089\\-182.6797\\-5\\-161.4494\\-178.7734\\-5\\-161.2148\\-174.8672\\-5\\-160.1114\\-165.1016\\-5\\-159.5956\\-161.1953\\-5\\-159.0028\\-159.2422\\-5\\-158.5086\\-157.2891\\-5\\-157.787\\-153.3828\\-5\\-156.503\\-149.4766\\-5\\-156.1661\\-147.5234\\-5\\-155.6959\\-145.5703\\-5\\-154.8952\\-143.6172\\-5\\-153.6347\\-139.7109\\-5\\-152.6482\\-137.7578\\-5\\-151.9575\\-135.8047\\-5\\-150.9399\\-133.8516\\-5\\-149.5909\\-129.9453\\-5\\-148.6566\\-127.9922\\-5\\-147.9426\\-126.0391\\-5\\-146.8825\\-124.0859\\-5\\-146.0667\\-122.1328\\-5\\-144.8094\\-120.1797\\-5\\-144.0397\\-118.2266\\-5\\-142.859\\-116.2734\\-5\\-142.0864\\-114.3203\\-5\\-140.8099\\-112.3672\\-5\\-139.797\\-110.4141\\-5\\-137.6953\\-107.1136\\-5\\-137.2142\\-106.5078\\-5\\-136.2588\\-104.5547\\-5\\-133.7891\\-101.3135\\-5\\-129.8828\\-96.69739\\-5\\-127.8606\\-94.78906\\-5\\-125.9766\\-93.54557\\-5\\-122.8009\\-90.88281\\-5\\-122.0703\\-90.20258\\-5\\-120.0584\\-88.92969\\-5\\-116.5757\\-86.97656\\-5\\-114.2578\\-85.51172\\-5\\-108.7607\\-83.07031\\-5\\-106.4453\\-82.08724\\-5\\-104.4922\\-81.47025\\-5\\-102.5391\\-80.6393\\-5\\-100.5859\\-80.29266\\-5\\-97.65625\\-79.16406\\-5\\-94.72656\\-78.14277\\-5\\-92.77344\\-77.78241\\-5\\-88.86719\\-76.55721\\-5\\-86.91406\\-76.21314\\-5\\-83.00781\\-75.78987\\-5\\-81.05469\\-75.40508\\-5\\-79.10156\\-74.59954\\-5\\-75.19531\\-74.34924\\-5\\-73.24219\\-73.76934\\-5\\-71.28906\\-72.44147\\-5\\-69.33594\\-72.67561\\-5\\-67.38281\\-72.74275\\-5\\-63.47656\\-72.73502\\-5\\-57.61719\\-72.79101\\-5\\-55.66406\\-72.87931\\-5\\-51.75781\\-72.82507\\-5\\-47.85156\\-72.95817\\-5\\-45.89844\\-73.77747\\-5\\-43.94531\\-74.20035\\-5\\-38.08594\\-74.54466\\-5\\-36.13281\\-74.72451\\-5\\-34.17969\\-75.15113\\-5\\-32.22656\\-75.72993\\-5\\-28.32031\\-76.28489\\-5\\-26.36719\\-76.65376\\-5\\-24.41406\\-77.39045\\-5\\-20.50781\\-78.74812\\-5\\-18.55469\\-79.6791\\-5\\-16.60156\\-80.32522\\-5\\-12.69531\\-81.99027\\-5\\-10.74219\\-83.06224\\-5\\-8.789063\\-84.24632\\-5\\-4.882813\\-87.58863\\-5\\-2.929688\\-89.11938\\-5\\-0.9765625\\-90.02018\\-5\\0.9765625\\-90.21918\\-5\\2.929688\\-89.91187\\-5\\4.638672\\-88.92969\\-5\\6.835938\\-87.30475\\-5\\10.74219\\-83.90446\\-5\\12.69531\\-82.3396\\-5\\14.70727\\-81.11719\\-5\\16.60156\\-80.20308\\-5\\18.55469\\-79.0833\\-5\\22.50402\\-77.21094\\-5\\24.41406\\-76.39407\\-5\\26.36719\\-75.9631\\-5\\28.32031\\-75.18072\\-5\\30.27344\\-74.6267\\-5\\34.17969\\-74.23502\\-5\\36.13281\\-72.82507\\-5\\40.03906\\-72.66914\\-5\\41.99219\\-72.51995\\-5\\43.94531\\-71.7442\\-5\\47.85156\\-71.78667\\-5\\55.66406\\-71.7442\\-5\\59.57031\\-71.83984\\-5\\61.52344\\-72.15057\\-5\\63.47656\\-72.64184\\-5\\67.38281\\-72.67616\\-5\\73.24219\\-72.84272\\-5\\75.19531\\-73.99838\\-5\\77.14844\\-74.26955\\-5\\81.05469\\-74.55752\\-5\\83.00781\\-74.81326\\-5\\84.96094\\-75.45909\\-5\\86.91406\\-75.91896\\-5\\90.82031\\-76.4432\\-5\\92.77344\\-77.00422\\-5\\94.72656\\-77.76981\\-5\\96.67969\\-78.38176\\-5\\98.63281\\-78.83854\\-5\\100.5859\\-79.6153\\-5\\104.4922\\-80.81839\\-5\\106.4453\\-81.72355\\-5\\108.3984\\-82.27131\\-5\\110.3516\\-83.04688\\-5\\114.2578\\-84.87483\\-5\\116.2109\\-85.96026\\-5\\120.1172\\-88.00875\\-5\\121.5163\\-88.92969\\-5\\124.0234\\-90.77876\\-5\\127.9297\\-94.29711\\-5\\130.1193\\-96.74219\\-5\\131.4525\\-98.69531\\-5\\134.4875\\-102.6016\\-5\\135.4943\\-104.5547\\-5\\136.6441\\-106.5078\\-5\\138.7036\\-110.4141\\-5\\139.9694\\-112.3672\\-5\\140.881\\-114.3203\\-5\\142.0288\\-116.2734\\-5\\142.7255\\-118.2266\\-5\\143.6546\\-120.1797\\-5\\145.2996\\-124.0859\\-5\\146.3098\\-126.0391\\-5\\147.0557\\-127.9922\\-5\\148.053\\-129.9453\\-5\\148.5779\\-131.8984\\-5\\150.0712\\-135.8047\\-5\\150.5261\\-137.7578\\-5\\152.0236\\-141.6641\\-5\\152.5232\\-143.6172\\-5\\153.8609\\-147.5234\\-5\\154.6245\\-151.4297\\-5\\155.6431\\-155.3359\\-5\\156.2149\\-159.2422\\-5\\156.5855\\-163.1484\\-5\\157.3351\\-167.0547\\-5\\157.8689\\-170.9609\\-5\\158.1364\\-174.8672\\-5\\158.4258\\-180.7266\\-5\\158.5597\\-186.5859\\-5\\158.5414\\-192.4453\\-5\\158.6592\\-196.3516\\-5\\158.5562\\-202.2109\\-5\\158.3209\\-208.0703\\-5\\157.8689\\-213.9297\\-5\\157.5936\\-215.8828\\-5\\156.7129\\-219.7891\\-5\\156.0993\\-223.6953\\-5\\155.7381\\-225.6484\\-5\\154.4723\\-229.5547\\-5\\153.9999\\-231.5078\\-5\\153.3203\\-233.2423\\-5\\151.4773\\-237.3672\\-5\\150.4249\\-239.3203\\-5\\149.5613\\-241.2734\\-5\\148.4438\\-243.2266\\-5\\146.0549\\-247.1328\\-5\\143.5547\\-250.4192\\-5\\141.6016\\-252.8899\\-5\\139.8831\\-254.9453\\-5\\137.8794\\-256.8984\\-5\\133.7891\\-261.1672\\-5\\129.8828\\-264.5986\\-5\\127.6359\\-266.6641\\-5\\122.8335\\-270.5703\\-5\\120.1172\\-272.6042\\-5\\116.2109\\-275.3568\\-5\\114.2578\\-276.546\\-5\\112.3047\\-277.5956\\-5\\110.3516\\-278.9525\\-5\\106.4453\\-281.1927\\-5\\104.4922\\-282.0262\\-5\\102.5391\\-283.052\\-5\\100.5859\\-283.6689\\-5\\98.63281\\-284.7808\\-5\\96.67969\\-285.4742\\-5\\94.72656\\-286.4343\\-5\\92.77344\\-287.0676\\-5\\90.82031\\-287.6023\\-5\\88.86719\\-288.3497\\-5\\86.91406\\-288.8637\\-5\\83.00781\\-289.4404\\-5\\81.05469\\-289.8484\\-5\\79.10156\\-290.4757\\-5\\75.19531\\-291.0487\\-5\\71.28906\\-291.3836\\-5\\65.42969\\-291.7314\\-5\\61.52344\\-291.8907\\-5\\51.75781\\-291.9865\\-5\\47.85156\\-292.1901\\-5\\41.99219\\-292.7859\\-5\\38.08594\\-293.2488\\-5\\36.13281\\-293.5731\\-5\\32.22656\\-294.418\\-5\\30.27344\\-294.7131\\-5\\24.41406\\-295.3673\\-5\\22.46094\\-295.7078\\-5\\20.50781\\-296.1723\\-5\\18.55469\\-296.4987\\-5\\16.60156\\-296.7235\\-5\\8.789063\\-297.4415\\-5\\2.929688\\-298.0226\\-5\\-0.9765625\\-298.2709\\-5\\-4.882813\\-298.2396\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "285" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "124" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-297.6301\\-3\\-18.55469\\-297.2384\\-3\\-26.36719\\-296.6331\\-3\\-28.32031\\-296.4001\\-3\\-32.22656\\-295.6708\\-3\\-34.17969\\-295.3965\\-3\\-38.08594\\-295.0869\\-3\\-49.80469\\-294.3659\\-3\\-55.66406\\-293.8402\\-3\\-59.57031\\-293.6604\\-3\\-71.28906\\-293.3474\\-3\\-77.14844\\-293.0364\\-3\\-81.05469\\-292.7005\\-3\\-83.00781\\-292.4317\\-3\\-86.91406\\-291.3518\\-3\\-90.82031\\-290.5416\\-3\\-92.77344\\-289.6565\\-3\\-96.67969\\-288.6536\\-3\\-98.63281\\-287.6931\\-3\\-100.5859\\-286.9666\\-3\\-102.5391\\-285.8698\\-3\\-104.4922\\-284.9147\\-3\\-106.4453\\-283.6144\\-3\\-108.3984\\-282.8462\\-3\\-110.3516\\-281.5915\\-3\\-112.3047\\-280.5489\\-3\\-114.2578\\-279.2401\\-3\\-116.2109\\-277.7339\\-3\\-120.1172\\-275.3287\\-3\\-124.0234\\-272.2101\\-3\\-127.9297\\-269.2059\\-3\\-129.8828\\-267.4521\\-3\\-131.8359\\-265.4103\\-3\\-134.5799\\-262.7578\\-3\\-136.382\\-260.8047\\-3\\-137.6953\\-259.1044\\-3\\-139.6484\\-256.7385\\-3\\-142.4921\\-252.9922\\-3\\-144.8217\\-249.0859\\-3\\-146.2586\\-247.1328\\-3\\-147.4609\\-245.0503\\-3\\-148.4129\\-243.2266\\-3\\-150.2386\\-239.3203\\-3\\-150.8756\\-237.3672\\-3\\-151.952\\-235.4141\\-3\\-152.6086\\-233.4609\\-3\\-153.4972\\-231.5078\\-3\\-154.1183\\-229.5547\\-3\\-154.5959\\-227.6016\\-3\\-155.8838\\-223.6953\\-3\\-156.5936\\-219.7891\\-3\\-157.7962\\-215.8828\\-3\\-158.5414\\-211.9766\\-3\\-159.7001\\-208.0703\\-3\\-160.0012\\-206.1172\\-3\\-160.429\\-200.2578\\-3\\-160.901\\-194.3984\\-3\\-161.0652\\-188.5391\\-3\\-161.1707\\-182.6797\\-3\\-161.0798\\-178.7734\\-3\\-160.6633\\-172.9141\\-3\\-159.8995\\-165.1016\\-3\\-159.6236\\-163.1484\\-3\\-158.6225\\-159.2422\\-3\\-157.9464\\-155.3359\\-3\\-157.4504\\-153.3828\\-3\\-156.735\\-151.4297\\-3\\-155.9966\\-147.5234\\-3\\-155.3594\\-145.5703\\-3\\-154.6163\\-143.6172\\-3\\-154.0754\\-141.6641\\-3\\-152.3864\\-137.7578\\-3\\-151.682\\-135.8047\\-3\\-150.6696\\-133.8516\\-3\\-150.0921\\-131.8984\\-3\\-149.1962\\-129.9453\\-3\\-147.7014\\-126.0391\\-3\\-146.6481\\-124.0859\\-3\\-145.8118\\-122.1328\\-3\\-144.6077\\-120.1797\\-3\\-143.7789\\-118.2266\\-3\\-142.6819\\-116.2734\\-3\\-141.8495\\-114.3203\\-3\\-141.6016\\-114.0163\\-3\\-138.3405\\-108.4609\\-3\\-137.0016\\-106.5078\\-3\\-136\\-104.5547\\-3\\-134.5952\\-102.6016\\-3\\-131.8359\\-99.32767\\-3\\-129.5732\\-96.74219\\-3\\-127.5124\\-94.78906\\-3\\-125.9766\\-93.71297\\-3\\-122.0703\\-90.43826\\-3\\-119.7374\\-88.92969\\-3\\-118.1641\\-87.9981\\-3\\-116.2109\\-87.06837\\-3\\-114.2578\\-85.76304\\-3\\-110.3516\\-83.81877\\-3\\-108.3984\\-83.11066\\-3\\-106.4453\\-82.15395\\-3\\-104.4922\\-81.59829\\-3\\-102.5391\\-80.74826\\-3\\-100.5859\\-80.34186\\-3\\-97.22222\\-79.16406\\-3\\-94.72656\\-78.35943\\-3\\-90.82031\\-77.31415\\-3\\-88.86719\\-76.71478\\-3\\-86.91406\\-76.27778\\-3\\-81.05469\\-75.60456\\-3\\-79.10156\\-74.64376\\-3\\-77.14844\\-74.46185\\-3\\-73.24219\\-74.21107\\-3\\-69.33594\\-72.79642\\-3\\-63.47656\\-72.71235\\-3\\-61.52344\\-72.75057\\-3\\-59.57031\\-72.6894\\-3\\-55.66406\\-72.85171\\-3\\-51.75781\\-72.81641\\-3\\-47.85156\\-73.02286\\-3\\-45.89844\\-74.04662\\-3\\-43.94531\\-74.21191\\-3\\-40.03906\\-74.38909\\-3\\-36.13281\\-74.7486\\-3\\-34.17969\\-75.15202\\-3\\-32.22656\\-75.7131\\-3\\-28.32031\\-76.2567\\-3\\-26.36719\\-76.62979\\-3\\-24.41406\\-77.34838\\-3\\-20.50781\\-78.65531\\-3\\-18.55469\\-79.58064\\-3\\-14.64844\\-80.94033\\-3\\-10.74219\\-82.82801\\-3\\-8.789063\\-83.96903\\-3\\-4.882813\\-87.43229\\-3\\-2.625168\\-88.92969\\-3\\-0.9765625\\-89.82108\\-3\\0.9765625\\-90.10051\\-3\\2.929688\\-89.73565\\-3\\6.835938\\-87.05434\\-3\\9.19805\\-85.02344\\-3\\12.69531\\-82.24192\\-3\\14.64844\\-81.05975\\-3\\16.60156\\-80.17991\\-3\\18.55469\\-79.02863\\-3\\22.50402\\-77.21094\\-3\\24.41406\\-76.38889\\-3\\26.36719\\-75.95185\\-3\\28.32031\\-75.11592\\-3\\30.27344\\-74.61777\\-3\\34.17969\\-74.22346\\-3\\36.13281\\-72.83385\\-3\\40.03906\\-72.66914\\-3\\41.99219\\-72.64184\\-3\\43.94531\\-71.8046\\-3\\45.89844\\-71.77303\\-3\\55.66406\\-71.81519\\-3\\57.61719\\-71.88335\\-3\\59.57031\\-72.06886\\-3\\61.52344\\-72.62781\\-3\\67.38281\\-72.6904\\-3\\71.28906\\-72.79937\\-3\\73.24219\\-72.92766\\-3\\75.19531\\-74.20657\\-3\\77.14844\\-74.2989\\-3\\81.05469\\-74.6267\\-3\\83.00781\\-74.91715\\-3\\84.96094\\-75.58802\\-3\\86.91406\\-75.97832\\-3\\90.82031\\-76.50356\\-3\\92.77344\\-77.11328\\-3\\94.72656\\-77.84454\\-3\\96.67969\\-78.43695\\-3\\98.63281\\-78.88223\\-3\\100.5859\\-79.65571\\-3\\104.4922\\-80.89765\\-3\\106.4453\\-81.78303\\-3\\108.3984\\-82.31407\\-3\\110.3516\\-83.15424\\-3\\114.2578\\-85.00072\\-3\\120.1172\\-88.08825\\-3\\121.3117\\-88.92969\\-3\\123.8148\\-90.88281\\-3\\128.2211\\-94.78906\\-3\\129.8828\\-96.88038\\-3\\131.174\\-98.69531\\-3\\134.2209\\-102.6016\\-3\\135.2041\\-104.5547\\-3\\136.4425\\-106.5078\\-3\\137.2559\\-108.4609\\-3\\137.6953\\-109.0469\\-3\\140.6306\\-114.3203\\-3\\141.6563\\-116.2734\\-3\\142.5296\\-118.2266\\-3\\143.2413\\-120.1797\\-3\\144.2716\\-122.1328\\-3\\144.9402\\-124.0859\\-3\\146.041\\-126.0391\\-3\\146.7576\\-127.9922\\-3\\147.7661\\-129.9453\\-3\\148.967\\-133.8516\\-3\\149.8088\\-135.8047\\-3\\150.8316\\-139.7109\\-3\\151.7033\\-141.6641\\-3\\152.7631\\-145.5703\\-3\\153.532\\-147.5234\\-3\\154.032\\-149.4766\\-3\\154.7402\\-153.3828\\-3\\155.7142\\-157.2891\\-3\\156.0166\\-159.2422\\-3\\156.5855\\-165.1016\\-3\\156.84\\-167.0547\\-3\\157.5834\\-170.9609\\-3\\157.9162\\-174.8672\\-3\\158.1936\\-180.7266\\-3\\158.2968\\-186.5859\\-3\\158.2906\\-192.4453\\-3\\158.3793\\-196.3516\\-3\\158.332\\-202.2109\\-3\\158.2711\\-204.1641\\-3\\158.4063\\-208.0703\\-3\\158.0529\\-210.0234\\-3\\157.5936\\-213.9297\\-3\\156.7545\\-217.8359\\-3\\155.8926\\-223.6953\\-3\\155.3734\\-225.6484\\-3\\154.7309\\-227.6016\\-3\\153.7198\\-231.5078\\-3\\152.7737\\-233.4609\\-3\\152.0888\\-235.4141\\-3\\150.9586\\-237.3672\\-3\\150.1989\\-239.3203\\-3\\149.0451\\-241.2734\\-3\\148.1315\\-243.2266\\-3\\145.5305\\-247.1328\\-3\\144.1779\\-249.0859\\-3\\141.0445\\-252.9922\\-3\\139.6484\\-254.5105\\-3\\137.2416\\-256.8984\\-3\\133.7891\\-260.5334\\-3\\129.8828\\-264.0525\\-3\\129.2193\\-264.7109\\-3\\125.9766\\-267.6161\\-3\\122.0703\\-270.5934\\-3\\120.1172\\-271.9375\\-3\\118.1641\\-273.5237\\-3\\116.2109\\-274.9579\\-3\\114.2578\\-275.9276\\-3\\112.3047\\-277.2357\\-3\\108.3984\\-279.53\\-3\\106.4453\\-280.8013\\-3\\104.4922\\-281.5841\\-3\\102.5391\\-282.6526\\-3\\100.5859\\-283.3227\\-3\\96.67969\\-285.0967\\-3\\94.72656\\-285.7906\\-3\\92.77344\\-286.7189\\-3\\88.86719\\-287.7755\\-3\\86.91406\\-288.5042\\-3\\84.96094\\-288.9162\\-3\\81.05469\\-289.4126\\-3\\79.10156\\-289.8236\\-3\\77.14844\\-290.3985\\-3\\75.19531\\-290.7259\\-3\\71.28906\\-291.0633\\-3\\67.38281\\-291.2538\\-3\\61.52344\\-291.4464\\-3\\53.71094\\-291.6406\\-3\\49.80469\\-291.8778\\-3\\43.94531\\-292.6617\\-3\\40.03906\\-293.0907\\-3\\38.08594\\-293.4003\\-3\\34.17969\\-294.2741\\-3\\32.22656\\-294.6121\\-3\\26.36719\\-295.3036\\-3\\24.41406\\-295.6307\\-3\\22.46094\\-296.1187\\-3\\20.50781\\-296.4897\\-3\\18.55469\\-296.7345\\-3\\14.64844\\-297.0869\\-3\\6.835938\\-298.1011\\-3\\4.882813\\-298.3108\\-3\\0.9765625\\-298.5558\\-3\\-0.9765625\\-298.6268\\-3\\-4.882813\\-298.5388\\-3\\-10.74219\\-298.281\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "300" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "125" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-297.9516\\-1\\-18.55469\\-297.432\\-1\\-20.50781\\-297.2277\\-1\\-28.32031\\-296.5493\\-1\\-30.27344\\-296.2511\\-1\\-34.17969\\-295.5087\\-1\\-36.13281\\-295.2996\\-1\\-43.94531\\-294.7809\\-1\\-49.80469\\-294.3443\\-1\\-55.66406\\-293.6935\\-1\\-59.57031\\-293.444\\-1\\-67.38281\\-293.2213\\-1\\-75.19531\\-292.9054\\-1\\-79.10156\\-292.5879\\-1\\-81.05469\\-292.3138\\-1\\-84.96094\\-291.3761\\-1\\-88.86719\\-290.6875\\-1\\-92.77344\\-289.3334\\-1\\-94.72656\\-288.948\\-1\\-96.67969\\-288.2045\\-1\\-98.63281\\-287.3356\\-1\\-100.5859\\-286.6022\\-1\\-102.5391\\-285.4383\\-1\\-104.4922\\-284.5104\\-1\\-106.4453\\-283.3303\\-1\\-108.3984\\-282.4375\\-1\\-110.3516\\-281.2873\\-1\\-112.3047\\-280.036\\-1\\-114.2578\\-278.8984\\-1\\-118.1641\\-276.1091\\-1\\-120.1172\\-275.0506\\-1\\-122.0703\\-273.5062\\-1\\-125.9766\\-270.2349\\-1\\-127.9297\\-268.875\\-1\\-129.8828\\-267.1302\\-1\\-131.8359\\-265.0854\\-1\\-134.266\\-262.7578\\-1\\-136.0802\\-260.8047\\-1\\-137.4688\\-258.8516\\-1\\-140.7724\\-254.9453\\-1\\-142.2677\\-252.9922\\-1\\-143.2897\\-251.0391\\-1\\-145.9961\\-247.1328\\-1\\-147.0247\\-245.1797\\-1\\-148.2212\\-243.2266\\-1\\-149.0136\\-241.2734\\-1\\-150.0588\\-239.3203\\-1\\-150.6542\\-237.3672\\-1\\-151.6712\\-235.4141\\-1\\-153.1041\\-231.5078\\-1\\-153.919\\-229.5547\\-1\\-154.9341\\-225.6484\\-1\\-155.671\\-223.6953\\-1\\-156.1422\\-221.7422\\-1\\-156.4328\\-219.7891\\-1\\-156.8758\\-217.8359\\-1\\-157.5731\\-215.8828\\-1\\-158.0322\\-213.9297\\-1\\-158.3667\\-211.9766\\-1\\-158.824\\-210.0234\\-1\\-160.0157\\-208.0703\\-1\\-160.5596\\-206.1172\\-1\\-160.0985\\-204.1641\\-1\\-160.1214\\-202.2109\\-1\\-160.6116\\-194.3984\\-1\\-160.8073\\-182.6797\\-1\\-160.7179\\-178.7734\\-1\\-160.5067\\-174.8672\\-1\\-160.2381\\-170.9609\\-1\\-159.8969\\-167.0547\\-1\\-159.668\\-165.1016\\-1\\-158.7155\\-161.1953\\-1\\-157.6705\\-155.3359\\-1\\-156.9734\\-153.3828\\-1\\-156.4777\\-151.4297\\-1\\-155.7617\\-147.5234\\-1\\-154.9669\\-145.5703\\-1\\-153.8448\\-141.6641\\-1\\-152.8841\\-139.7109\\-1\\-152.1686\\-137.7578\\-1\\-150.4768\\-133.8516\\-1\\-149.8336\\-131.8984\\-1\\-148.8892\\-129.9453\\-1\\-148.3024\\-127.9922\\-1\\-145.5078\\-122.1446\\-1\\-143.4197\\-118.2266\\-1\\-142.5658\\-116.2734\\-1\\-141.6016\\-114.4262\\-1\\-140.4218\\-112.3672\\-1\\-139.0772\\-110.4141\\-1\\-138.1017\\-108.4609\\-1\\-135.5913\\-104.5547\\-1\\-134.4105\\-102.6016\\-1\\-132.7732\\-100.6484\\-1\\-129.1707\\-96.74219\\-1\\-127.1439\\-94.78906\\-1\\-124.0234\\-92.19567\\-1\\-122.0703\\-90.73438\\-1\\-119.4901\\-88.92969\\-1\\-118.1641\\-88.08421\\-1\\-116.2109\\-87.23646\\-1\\-112.3047\\-84.92426\\-1\\-110.3516\\-83.99373\\-1\\-108.3984\\-83.27471\\-1\\-106.4453\\-82.21233\\-1\\-104.4922\\-81.7523\\-1\\-102.5391\\-80.92188\\-1\\-98.63281\\-79.87976\\-1\\-96.48862\\-79.16406\\-1\\-94.72656\\-78.68445\\-1\\-92.77344\\-77.94863\\-1\\-88.86719\\-76.96346\\-1\\-86.91406\\-76.33203\\-1\\-81.05469\\-75.6526\\-1\\-79.10156\\-74.66889\\-1\\-77.14844\\-74.4833\\-1\\-73.24219\\-74.2283\\-1\\-71.28906\\-73.6273\\-1\\-69.33594\\-72.87\\-1\\-61.52344\\-72.61221\\-1\\-59.57031\\-72.34999\\-1\\-57.61719\\-72.6199\\-1\\-55.66406\\-72.78273\\-1\\-51.75781\\-72.77455\\-1\\-47.85156\\-72.85171\\-1\\-46.0612\\-73.30469\\-1\\-43.94531\\-74.16811\\-1\\-40.03906\\-74.36513\\-1\\-36.13281\\-74.72451\\-1\\-34.17969\\-75.12173\\-1\\-32.22656\\-75.71004\\-1\\-28.32031\\-76.25102\\-1\\-26.36719\\-76.62143\\-1\\-22.46094\\-77.96861\\-1\\-20.50781\\-78.55895\\-1\\-18.55469\\-79.48483\\-1\\-16.60156\\-80.22579\\-1\\-14.64844\\-80.79166\\-1\\-10.74219\\-82.5966\\-1\\-8.789063\\-83.87495\\-1\\-4.882813\\-87.19269\\-1\\-2.302632\\-88.92969\\-1\\-0.9765625\\-89.67072\\-1\\0.9765625\\-90.08115\\-1\\2.929688\\-89.54159\\-1\\6.835938\\-86.74894\\-1\\11.49269\\-83.07031\\-1\\12.69531\\-82.1807\\-1\\14.64844\\-80.98222\\-1\\16.60156\\-80.16295\\-1\\18.55469\\-79.01546\\-1\\24.41406\\-76.4034\\-1\\26.36719\\-75.95972\\-1\\28.32031\\-75.13153\\-1\\30.27344\\-74.63576\\-1\\34.17969\\-74.22346\\-1\\36.13281\\-72.85171\\-1\\41.99219\\-72.64184\\-1\\43.94531\\-71.88867\\-1\\45.89844\\-71.90269\\-1\\49.80469\\-71.77573\\-1\\55.66406\\-71.89729\\-1\\57.61719\\-72.26154\\-1\\59.57031\\-72.51525\\-1\\61.52344\\-72.66221\\-1\\69.33594\\-72.73502\\-1\\71.28906\\-72.80784\\-1\\73.02296\\-73.30469\\-1\\75.19531\\-74.23502\\-1\\77.14844\\-74.3286\\-1\\81.05469\\-74.69681\\-1\\83.00781\\-75.10319\\-1\\84.96094\\-75.7558\\-1\\90.82031\\-76.5998\\-1\\94.72656\\-77.91013\\-1\\98.63281\\-79.02863\\-1\\104.4922\\-80.99905\\-1\\106.4453\\-81.84495\\-1\\108.3984\\-82.36935\\-1\\112.3047\\-84.1608\\-1\\116.2109\\-86.13213\\-1\\118.1641\\-87.27761\\-1\\120.1172\\-88.17705\\-1\\122.0703\\-89.65094\\-1\\123.5428\\-90.88281\\-1\\125.9766\\-93.1227\\-1\\127.9297\\-94.79828\\-1\\129.8828\\-97.24321\\-1\\130.9265\\-98.69531\\-1\\132.4848\\-100.6484\\-1\\133.8577\\-102.6016\\-1\\134.967\\-104.5547\\-1\\136.1989\\-106.5078\\-1\\137.0079\\-108.4609\\-1\\138.2285\\-110.4141\\-1\\139.1197\\-112.3672\\-1\\140.3966\\-114.3203\\-1\\141.2421\\-116.2734\\-1\\142.3418\\-118.2266\\-1\\142.9583\\-120.1797\\-1\\143.998\\-122.1328\\-1\\144.6763\\-124.0859\\-1\\145.6975\\-126.0391\\-1\\148.1673\\-131.8984\\-1\\148.7067\\-133.8516\\-1\\150.151\\-137.7578\\-1\\150.5755\\-139.7109\\-1\\151.2385\\-141.6641\\-1\\152.0092\\-143.6172\\-1\\152.487\\-145.5703\\-1\\153.7816\\-149.4766\\-1\\154.8842\\-155.3359\\-1\\155.7815\\-159.2422\\-1\\156.0486\\-161.1953\\-1\\156.5537\\-167.0547\\-1\\156.7874\\-169.0078\\-1\\157.426\\-172.9141\\-1\\157.6233\\-174.8672\\-1\\157.8896\\-178.7734\\-1\\158.0185\\-182.6797\\-1\\158.0615\\-186.5859\\-1\\158.0726\\-192.4453\\-1\\158.1505\\-196.3516\\-1\\158.1555\\-200.2578\\-1\\158.0853\\-204.1641\\-1\\158.8364\\-206.1172\\-1\\159.8106\\-208.0703\\-1\\158.1569\\-210.0234\\-1\\157.5521\\-211.9766\\-1\\156.7743\\-215.8828\\-1\\156.3078\\-219.7891\\-1\\156.0213\\-221.7422\\-1\\155.6202\\-223.6953\\-1\\154.9713\\-225.6484\\-1\\154.0187\\-229.5547\\-1\\153.3203\\-231.4921\\-1\\152.448\\-233.4609\\-1\\151.7389\\-235.4141\\-1\\150.6117\\-237.3672\\-1\\149.8922\\-239.3203\\-1\\148.6881\\-241.2734\\-1\\147.7597\\-243.2266\\-1\\146.437\\-245.1797\\-1\\144.9544\\-247.1328\\-1\\143.7544\\-249.0859\\-1\\142.3099\\-251.0391\\-1\\139.6484\\-254.0545\\-1\\133.7891\\-260.0467\\-1\\131.8359\\-261.8965\\-1\\128.746\\-264.7109\\-1\\125.9766\\-267.1523\\-1\\122.0703\\-269.9887\\-1\\118.1641\\-273.0861\\-1\\116.1133\\-274.4766\\-1\\114.2578\\-275.5402\\-1\\112.3047\\-276.8273\\-1\\110.3516\\-277.7916\\-1\\108.3984\\-279.1443\\-1\\104.4922\\-281.2332\\-1\\102.5391\\-282.0678\\-1\\100.5859\\-283.05\\-1\\98.63281\\-283.6486\\-1\\96.67969\\-284.7122\\-1\\94.72656\\-285.3575\\-1\\92.72694\\-286.1953\\-1\\90.82031\\-286.8978\\-1\\88.86719\\-287.3637\\-1\\84.96094\\-288.5787\\-1\\83.00781\\-288.948\\-1\\79.10156\\-289.4161\\-1\\77.14844\\-289.7598\\-1\\75.19531\\-290.239\\-1\\73.24219\\-290.5601\\-1\\69.33594\\-290.8696\\-1\\65.42969\\-291.0286\\-1\\57.61719\\-291.2745\\-1\\51.75781\\-291.549\\-1\\49.80469\\-291.7142\\-1\\45.89844\\-292.4012\\-1\\40.03906\\-293.1906\\-1\\38.08594\\-293.5537\\-1\\36.13281\\-294.0749\\-1\\34.17969\\-294.4707\\-1\\32.22656\\-294.764\\-1\\28.32031\\-295.23\\-1\\26.36719\\-295.5128\\-1\\22.46094\\-296.4492\\-1\\20.50781\\-296.7031\\-1\\16.60156\\-297.0628\\-1\\14.64844\\-297.3\\-1\\10.74219\\-298.0226\\-1\\8.789063\\-298.2709\\-1\\4.882813\\-298.5909\\-1\\2.929688\\-298.668\\-1\\0.9765625\\-299.0438\\-1\\-0.9765625\\-299.5279\\-1\\-2.929688\\-298.8224\\-1\\-6.835938\\-298.6884\\-1\\-10.74219\\-298.5022\\-1\\-12.69531\\-298.2911\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "307" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "126" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.9765625\\-301.1765\\1\\-2.116935\\-299.8672\\1\\-2.929688\\-299.1037\\1\\-4.882813\\-298.9106\\1\\-6.835938\\-298.866\\1\\-10.74219\\-298.6588\\1\\-12.69531\\-298.4946\\1\\-16.60156\\-297.9948\\1\\-20.50781\\-297.3864\\1\\-28.32031\\-296.6593\\1\\-30.27344\\-296.4201\\1\\-34.17969\\-295.647\\1\\-36.13281\\-295.3876\\1\\-40.03906\\-295.0682\\1\\-47.85156\\-294.4961\\1\\-49.80469\\-294.2974\\1\\-53.71094\\-293.7671\\1\\-59.57031\\-293.2009\\1\\-67.38281\\-293.0063\\1\\-75.19531\\-292.6417\\1\\-79.10156\\-292.1355\\1\\-81.05469\\-291.6966\\1\\-86.91406\\-290.7756\\1\\-88.86719\\-290.2117\\1\\-90.82031\\-289.503\\1\\-94.72656\\-288.6164\\1\\-96.67969\\-287.7003\\1\\-98.63281\\-287.0072\\1\\-102.5391\\-285.1096\\1\\-104.4922\\-283.9434\\1\\-106.4453\\-283.0836\\1\\-108.3984\\-281.9491\\1\\-110.3516\\-280.9891\\1\\-112.3047\\-279.6393\\1\\-114.2578\\-278.4494\\1\\-117.287\\-276.4297\\1\\-118.1641\\-275.7764\\1\\-120.1172\\-274.6494\\1\\-122.0703\\-273.2139\\1\\-125.9766\\-269.8618\\1\\-127.6618\\-268.6172\\1\\-129.8739\\-266.6641\\1\\-131.8359\\-264.5868\\1\\-133.8501\\-262.7578\\1\\-135.7422\\-260.7202\\1\\-137.0917\\-258.8516\\1\\-138.7522\\-256.8984\\1\\-140.5105\\-254.9453\\1\\-141.9766\\-252.9922\\1\\-143.0054\\-251.0391\\1\\-143.5547\\-250.32\\1\\-145.6694\\-247.1328\\1\\-146.7417\\-245.1797\\1\\-148.0107\\-243.2266\\1\\-148.7609\\-241.2734\\1\\-149.8117\\-239.3203\\1\\-150.4662\\-237.3672\\1\\-152.1723\\-233.4609\\1\\-152.8015\\-231.5078\\1\\-153.6841\\-229.5547\\1\\-154.6825\\-225.6484\\1\\-155.3897\\-223.6953\\1\\-155.9888\\-221.7422\\1\\-156.6357\\-217.8359\\1\\-157.8828\\-213.9297\\1\\-158.6242\\-210.0234\\1\\-159.1797\\-209.3463\\1\\-161.1006\\-208.0703\\1\\-161.6375\\-206.1172\\1\\-160.1563\\-204.1641\\1\\-159.9539\\-202.2109\\1\\-160.0915\\-200.2578\\1\\-160.3697\\-194.3984\\1\\-160.5261\\-182.6797\\1\\-160.4392\\-178.7734\\1\\-160.2699\\-174.8672\\1\\-159.8633\\-169.0078\\1\\-159.6505\\-167.0547\\1\\-159.2744\\-165.1016\\1\\-158.7603\\-163.1484\\1\\-157.8103\\-157.2891\\1\\-156.6223\\-153.3828\\1\\-155.9683\\-149.4766\\1\\-155.4184\\-147.5234\\1\\-154.6662\\-145.5703\\1\\-154.1453\\-143.6172\\1\\-153.5212\\-141.6641\\1\\-152.5722\\-139.7109\\1\\-151.9326\\-137.7578\\1\\-150.9119\\-135.8047\\1\\-150.2918\\-133.8516\\1\\-148.6538\\-129.9453\\1\\-148.1014\\-127.9922\\1\\-147.0501\\-126.0391\\1\\-146.2505\\-124.0859\\1\\-145.1242\\-122.1328\\1\\-144.2242\\-120.1797\\1\\-143.1013\\-118.2266\\1\\-142.4269\\-116.2734\\1\\-141.2014\\-114.3203\\1\\-140.2161\\-112.3672\\1\\-138.8328\\-110.4141\\1\\-137.8174\\-108.4609\\1\\-136.6471\\-106.5078\\1\\-135.2681\\-104.5547\\1\\-134.2096\\-102.6016\\1\\-132.6102\\-100.6484\\1\\-129.0351\\-96.74219\\1\\-127.9297\\-95.65933\\1\\-125.9766\\-93.93787\\1\\-124.0234\\-92.36858\\1\\-120.1172\\-89.51969\\1\\-118.1641\\-88.17386\\1\\-116.2109\\-87.38657\\1\\-114.2578\\-86.33515\\1\\-112.3047\\-84.95686\\1\\-108.3984\\-83.41284\\1\\-106.4453\\-82.34882\\1\\-104.4922\\-81.90743\\1\\-100.5859\\-80.56009\\1\\-98.63281\\-80.1346\\1\\-96.67969\\-79.52385\\1\\-92.77344\\-78.17474\\1\\-86.91406\\-76.50402\\1\\-84.96094\\-76.16179\\1\\-81.05469\\-75.69108\\1\\-79.10156\\-74.70087\\1\\-75.19531\\-74.45703\\1\\-73.24219\\-74.25148\\1\\-71.28906\\-73.64173\\1\\-69.33594\\-72.88874\\1\\-65.42969\\-72.73502\\1\\-63.47656\\-72.59174\\1\\-59.57031\\-71.52805\\1\\-57.61719\\-72.45349\\1\\-55.66406\\-72.72738\\1\\-47.85156\\-72.79937\\1\\-45.89844\\-72.94787\\1\\-43.94531\\-74.02391\\1\\-41.99219\\-74.23502\\1\\-38.08594\\-74.46515\\1\\-36.13281\\-74.66781\\1\\-34.17969\\-75.08971\\1\\-32.22656\\-75.72315\\1\\-28.32031\\-76.26244\\1\\-26.36719\\-76.62621\\1\\-24.41406\\-77.30711\\1\\-20.50781\\-78.5031\\1\\-18.55469\\-79.41914\\1\\-16.60156\\-80.17947\\1\\-14.64844\\-80.75365\\1\\-12.69531\\-81.66825\\1\\-10.74219\\-82.41187\\1\\-8.789063\\-83.87249\\1\\-6.835938\\-85.52629\\1\\-4.820097\\-86.97656\\1\\-0.9765625\\-89.49731\\1\\0.9765625\\-89.93693\\1\\2.929688\\-89.29676\\1\\4.882813\\-87.9325\\1\\11.35254\\-83.07031\\1\\12.69531\\-82.12674\\1\\14.64844\\-80.95313\\1\\16.60156\\-80.15179\\1\\18.55469\\-79.01546\\1\\22.50671\\-77.21094\\1\\24.41406\\-76.41827\\1\\26.36719\\-75.97962\\1\\28.32031\\-75.19678\\1\\30.27344\\-74.66781\\1\\34.17969\\-74.24658\\1\\36.13281\\-72.86079\\1\\41.99219\\-72.65535\\1\\43.94531\\-72.28407\\1\\45.89844\\-72.1875\\1\\47.85156\\-71.83984\\1\\49.80469\\-71.78447\\1\\53.71094\\-71.8046\\1\\55.66406\\-71.94313\\1\\57.61719\\-72.60178\\1\\61.52344\\-72.67616\\1\\63.47656\\-72.66221\\1\\71.28906\\-72.82507\\1\\73.24219\\-73.99363\\1\\75.19531\\-74.27544\\1\\79.10156\\-74.5032\\1\\81.05469\\-74.7841\\1\\83.00781\\-75.24909\\1\\84.96094\\-75.84129\\1\\88.86719\\-76.34995\\1\\90.82031\\-76.73568\\1\\92.77344\\-77.40063\\1\\100.5859\\-79.79476\\1\\102.5391\\-80.45584\\1\\106.4453\\-81.91402\\1\\108.3984\\-82.44165\\1\\110.3516\\-83.44331\\1\\112.3047\\-84.2651\\1\\114.2578\\-85.3693\\1\\116.2109\\-86.23833\\1\\118.1641\\-87.42997\\1\\120.1172\\-88.31934\\1\\122.0703\\-89.80798\\1\\123.2824\\-90.88281\\1\\127.9297\\-95.20067\\1\\130.7586\\-98.69531\\1\\132.2004\\-100.6484\\1\\134.7362\\-104.5547\\1\\135.8918\\-106.5078\\1\\136.7915\\-108.4609\\1\\137.9428\\-110.4141\\1\\138.8459\\-112.3672\\1\\140.1459\\-114.3203\\1\\140.9564\\-116.2734\\1\\142.1096\\-118.2266\\1\\142.745\\-120.1797\\1\\143.6399\\-122.1328\\1\\145.2298\\-126.0391\\1\\146.2728\\-127.9922\\1\\146.9389\\-129.9453\\1\\147.906\\-131.8984\\1\\149.0673\\-135.8047\\1\\149.9221\\-137.7578\\1\\150.8757\\-141.6641\\1\\151.7263\\-143.6172\\1\\152.7614\\-147.5234\\1\\153.4424\\-149.4766\\1\\153.9278\\-151.4297\\1\\154.9691\\-157.2891\\1\\155.4732\\-159.2422\\1\\155.8268\\-161.1953\\1\\156.068\\-163.1484\\1\\156.691\\-170.9609\\1\\157.4136\\-176.8203\\1\\157.5834\\-178.7734\\1\\157.7648\\-182.6797\\1\\157.8369\\-188.5391\\1\\157.8369\\-192.4453\\1\\157.9327\\-196.3516\\1\\157.959\\-200.2578\\1\\157.8653\\-204.1641\\1\\159.1797\\-206.2709\\1\\160.0878\\-208.0703\\1\\159.1797\\-209.2849\\1\\158.1432\\-210.0234\\1\\157.1399\\-211.9766\\1\\156.5222\\-215.8828\\1\\156.1607\\-219.7891\\1\\155.8079\\-221.7422\\1\\154.6787\\-225.6484\\1\\153.7715\\-229.5547\\1\\152.8701\\-231.5078\\1\\152.1623\\-233.4609\\1\\151.2199\\-235.4141\\1\\149.4387\\-239.3203\\1\\148.4062\\-241.2734\\1\\146.0631\\-245.1797\\1\\144.5655\\-247.1328\\1\\143.5547\\-248.69\\1\\141.8438\\-251.0391\\1\\140.1772\\-252.9922\\1\\137.6953\\-255.6481\\1\\135.7422\\-257.5712\\1\\134.5418\\-258.8516\\1\\131.8359\\-261.4855\\1\\128.1438\\-264.7109\\1\\125.7918\\-266.6641\\1\\120.1172\\-271.0891\\1\\118.1641\\-272.4081\\1\\114.2578\\-275.2312\\1\\112.3047\\-276.2067\\1\\108.3984\\-278.6724\\1\\106.4453\\-279.6589\\1\\104.4922\\-280.8633\\1\\102.5391\\-281.61\\1\\100.5859\\-282.6641\\1\\98.63281\\-283.3186\\1\\96.67969\\-284.0807\\1\\94.72656\\-285.0012\\1\\92.77344\\-285.5966\\1\\90.82031\\-286.4714\\1\\86.91406\\-287.4714\\1\\83.00781\\-288.6132\\1\\81.05469\\-288.948\\1\\75.19531\\-289.6036\\1\\71.28906\\-290.3039\\1\\69.33594\\-290.5033\\1\\65.42969\\-290.7328\\1\\53.71094\\-291.2644\\1\\49.80469\\-291.5843\\1\\47.85156\\-291.9326\\1\\45.89844\\-292.4012\\1\\40.03906\\-293.2834\\1\\38.08594\\-293.7026\\1\\36.13281\\-294.2741\\1\\34.17969\\-294.6121\\1\\28.32031\\-295.3624\\1\\26.36719\\-295.7731\\1\\24.41406\\-296.2979\\1\\22.46094\\-296.6445\\1\\16.60156\\-297.235\\1\\14.64844\\-297.5462\\1\\12.69531\\-298.0757\\1\\8.789063\\-298.5317\\1\\4.882813\\-298.7915\\1\\2.929688\\-298.8652\\1\\0.9864268\\-299.8672\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "307" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "127" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.9765625\\-300.7607\\3\\-2.929688\\-299.2102\\3\\-10.74219\\-298.7891\\3\\-16.60156\\-298.2396\\3\\-20.50781\\-297.562\\3\\-24.41406\\-297.102\\3\\-30.27344\\-296.5372\\3\\-32.22656\\-296.2247\\3\\-34.17969\\-295.7895\\3\\-36.13281\\-295.4956\\3\\-40.03906\\-295.1057\\3\\-43.94531\\-294.8206\\3\\-47.85156\\-294.4868\\3\\-49.80469\\-294.2485\\3\\-53.71094\\-293.6312\\3\\-57.61719\\-293.1686\\3\\-59.57031\\-292.6358\\3\\-61.52344\\-292.9155\\3\\-63.47656\\-292.9331\\3\\-67.38281\\-292.7946\\3\\-71.28906\\-292.596\\3\\-75.19531\\-292.2541\\3\\-79.10156\\-291.5694\\3\\-84.96094\\-290.7825\\3\\-86.91406\\-290.3285\\3\\-88.86719\\-289.6231\\3\\-92.77344\\-288.8352\\3\\-96.67969\\-287.3221\\3\\-98.63281\\-286.6648\\3\\-100.5859\\-285.5347\\3\\-102.5391\\-284.7425\\3\\-104.4922\\-283.5428\\3\\-106.4453\\-282.7706\\3\\-108.3984\\-281.5771\\3\\-110.3516\\-280.6076\\3\\-113.6719\\-278.3828\\3\\-114.2578\\-277.9149\\3\\-116.2109\\-276.8326\\3\\-122.0703\\-272.7974\\3\\-127.1779\\-268.6172\\3\\-129.3279\\-266.6641\\3\\-131.8359\\-264.1236\\3\\-133.7891\\-262.2996\\3\\-135.7422\\-260.2155\\3\\-136.8139\\-258.8516\\3\\-140.2092\\-254.9453\\3\\-141.6016\\-252.9195\\3\\-142.78\\-251.0391\\3\\-144.1154\\-249.0859\\3\\-147.4609\\-243.5859\\3\\-147.741\\-243.2266\\3\\-149.4855\\-239.3203\\3\\-150.2906\\-237.3672\\3\\-150.9324\\-235.4141\\3\\-151.9355\\-233.4609\\3\\-152.5534\\-231.5078\\3\\-153.3725\\-229.5547\\3\\-154.0146\\-227.6016\\3\\-154.4771\\-225.6484\\3\\-155.0441\\-223.6953\\3\\-155.8043\\-221.7422\\3\\-156.1853\\-219.7891\\3\\-156.4534\\-217.8359\\3\\-156.8987\\-215.8828\\3\\-157.6705\\-213.9297\\3\\-158.3685\\-210.0234\\3\\-159.1797\\-208.7241\\3\\-160.144\\-208.0703\\3\\-160.6717\\-206.1172\\3\\-159.7669\\-204.1641\\3\\-159.7525\\-202.2109\\3\\-159.8969\\-200.2578\\3\\-160.1662\\-194.3984\\3\\-160.2745\\-184.6328\\3\\-160.2596\\-180.7266\\3\\-160.1513\\-176.8203\\3\\-159.948\\-172.9141\\3\\-159.6144\\-169.0078\\3\\-159.2744\\-167.0547\\3\\-158.7954\\-165.1016\\3\\-158.4565\\-163.1484\\3\\-157.9002\\-159.2422\\3\\-157.474\\-157.2891\\3\\-156.7743\\-155.3359\\3\\-156.1182\\-151.4297\\3\\-155.7142\\-149.4766\\3\\-154.9934\\-147.5234\\3\\-153.919\\-143.6172\\3\\-153.0762\\-141.6641\\3\\-151.6181\\-137.7578\\3\\-150.6245\\-135.8047\\3\\-150.0672\\-133.8516\\3\\-149.1551\\-131.8984\\3\\-147.8392\\-127.9922\\3\\-146.7712\\-126.0391\\3\\-145.9778\\-124.0859\\3\\-144.8423\\-122.1328\\3\\-143.9599\\-120.1797\\3\\-142.8672\\-118.2266\\3\\-142.2194\\-116.2734\\3\\-140.9075\\-114.3203\\3\\-139.9442\\-112.3672\\3\\-137.4001\\-108.4609\\3\\-136.4265\\-106.5078\\3\\-135.08\\-104.5547\\3\\-133.8992\\-102.6016\\3\\-132.3776\\-100.6484\\3\\-128.8508\\-96.74219\\3\\-125.9766\\-94.0985\\3\\-124.0234\\-92.6437\\3\\-122.0703\\-91.28971\\3\\-120.1172\\-89.70695\\3\\-118.1641\\-88.33251\\3\\-116.2109\\-87.50463\\3\\-114.2578\\-86.42114\\3\\-112.3047\\-85.06865\\3\\-108.3984\\-83.54051\\3\\-106.4453\\-82.51768\\3\\-102.5391\\-81.41473\\3\\-100.5859\\-80.72798\\3\\-96.67969\\-79.74051\\3\\-94.72656\\-78.96462\\3\\-92.77344\\-78.42458\\3\\-90.82031\\-77.74424\\3\\-86.91406\\-76.77763\\3\\-84.96094\\-76.24107\\3\\-81.05469\\-75.75947\\3\\-79.10156\\-74.9516\\3\\-77.14844\\-74.58064\\3\\-75.19531\\-74.50198\\3\\-73.24219\\-74.28728\\3\\-71.28906\\-73.68682\\3\\-69.33594\\-72.87931\\3\\-65.42969\\-72.75848\\3\\-61.52344\\-72.17527\\3\\-59.57031\\-72.16817\\3\\-57.61719\\-72.54923\\3\\-55.66406\\-72.74275\\3\\-51.75781\\-72.74275\\3\\-45.89844\\-72.82507\\3\\-43.94531\\-73.96735\\3\\-41.99219\\-74.26381\\3\\-38.08594\\-74.42523\\3\\-36.13281\\-74.63636\\3\\-34.17969\\-75.05605\\3\\-32.22656\\-75.73307\\3\\-28.32031\\-76.25722\\3\\-26.36719\\-76.6189\\3\\-24.41406\\-77.29357\\3\\-20.50781\\-78.49119\\3\\-18.55469\\-79.39169\\3\\-16.60156\\-80.11224\\3\\-14.64844\\-80.73078\\3\\-12.69531\\-81.73006\\3\\-10.74219\\-82.48296\\3\\-7.220929\\-85.02344\\3\\-4.412957\\-86.97656\\3\\-0.9765625\\-89.1684\\3\\0.9765625\\-89.54943\\3\\2.929688\\-88.88966\\3\\4.882813\\-87.78922\\3\\8.453967\\-85.02344\\3\\12.69531\\-82.08715\\3\\14.64844\\-80.92495\\3\\16.60156\\-80.15166\\3\\18.55469\\-79.05556\\3\\22.56775\\-77.21094\\3\\24.41406\\-76.43862\\3\\26.36719\\-76.00671\\3\\30.27344\\-74.7207\\3\\32.22656\\-74.44813\\3\\34.17969\\-74.27544\\3\\36.13281\\-73.28197\\3\\38.08594\\-72.78273\\3\\43.94531\\-72.6274\\3\\45.89844\\-72.34198\\3\\47.85156\\-72.21187\\3\\49.80469\\-72.1875\\3\\53.71094\\-71.99356\\3\\55.66406\\-72.26849\\3\\57.61719\\-72.65535\\3\\63.47656\\-72.68324\\3\\69.33594\\-72.79937\\3\\71.28906\\-73.0456\\3\\73.24219\\-74.08977\\3\\75.19531\\-74.30464\\3\\79.10156\\-74.55288\\3\\81.05469\\-74.85967\\3\\83.00781\\-75.48544\\3\\84.96094\\-75.92258\\3\\88.86719\\-76.45659\\3\\90.82031\\-76.90363\\3\\92.77344\\-77.56303\\3\\96.67969\\-78.6904\\3\\98.63281\\-79.36382\\3\\102.5391\\-80.53253\\3\\104.4922\\-81.38886\\3\\108.3984\\-82.54738\\3\\110.3516\\-83.59664\\3\\112.3047\\-84.37801\\3\\114.2578\\-85.53377\\3\\116.2109\\-86.35566\\3\\118.1641\\-87.57186\\3\\120.1172\\-88.48579\\3\\122.0703\\-89.97903\\3\\127.2252\\-94.78906\\3\\128.9828\\-96.74219\\3\\130.5538\\-98.69531\\3\\133.1275\\-102.6016\\3\\134.502\\-104.5547\\3\\136.6082\\-108.4609\\3\\137.5046\\-110.4141\\3\\139.7714\\-114.3203\\3\\140.7123\\-116.2734\\3\\141.8013\\-118.2266\\3\\143.2683\\-122.1328\\3\\144.2457\\-124.0859\\3\\144.8831\\-126.0391\\3\\146.0109\\-127.9922\\3\\146.657\\-129.9453\\3\\147.5745\\-131.8984\\3\\148.3073\\-133.8516\\3\\148.7949\\-135.8047\\3\\149.6169\\-137.7578\\3\\150.2104\\-139.7109\\3\\150.6261\\-141.6641\\3\\152.0237\\-145.5703\\3\\153.0081\\-149.4766\\3\\153.6818\\-151.4297\\3\\154.0786\\-153.3828\\3\\154.6701\\-157.2891\\3\\155.5391\\-161.1953\\3\\155.8581\\-163.1484\\3\\156.068\\-165.1016\\3\\156.5815\\-172.9141\\3\\157.2641\\-180.7266\\3\\157.3882\\-182.6797\\3\\157.5195\\-188.5391\\3\\157.5731\\-194.3984\\3\\157.6705\\-196.3516\\3\\157.7402\\-200.2578\\3\\157.5627\\-204.1641\\3\\157.685\\-206.1172\\3\\159.0332\\-208.0703\\3\\157.2266\\-210.006\\3\\156.7096\\-211.9766\\3\\155.9639\\-219.7891\\3\\155.5285\\-221.7422\\3\\154.8842\\-223.6953\\3\\154.025\\-227.6016\\3\\153.3874\\-229.5547\\3\\152.5558\\-231.5078\\3\\151.8642\\-233.4609\\3\\150.7954\\-235.4141\\3\\150.0964\\-237.3672\\3\\148.9886\\-239.3203\\3\\148.1355\\-241.2734\\3\\145.5634\\-245.1797\\3\\143.5547\\-248.1508\\3\\141.6016\\-250.6538\\3\\139.6484\\-252.9494\\3\\137.6953\\-255.1039\\3\\134.037\\-258.8516\\3\\131.8359\\-260.9714\\3\\129.7815\\-262.7578\\3\\124.0234\\-267.6279\\3\\122.0703\\-269.2018\\3\\118.1641\\-271.8417\\3\\116.2109\\-273.4254\\3\\114.2578\\-274.8021\\3\\112.3047\\-275.7677\\3\\110.3516\\-277.0488\\3\\108.3984\\-277.988\\3\\106.4453\\-279.2352\\3\\104.4551\\-280.3359\\3\\102.5391\\-281.2761\\3\\100.5859\\-282.058\\3\\98.63281\\-283.0122\\3\\96.67969\\-283.5685\\3\\94.72656\\-284.5699\\3\\90.82031\\-285.8167\\3\\88.86719\\-286.6381\\3\\84.96094\\-287.5327\\3\\81.05469\\-288.6201\\3\\79.10156\\-288.9162\\3\\73.24219\\-289.4689\\3\\67.38281\\-290.0616\\3\\65.42969\\-290.3039\\3\\61.52344\\-290.6572\\3\\53.71094\\-291.1258\\3\\49.80469\\-291.4958\\3\\47.85156\\-291.8931\\3\\45.89844\\-292.4115\\3\\40.03906\\-293.3776\\3\\36.13281\\-294.4227\\3\\28.32031\\-295.5367\\3\\26.36719\\-296.0763\\3\\24.41406\\-296.511\\3\\22.46094\\-296.773\\3\\18.55469\\-297.1803\\3\\16.60156\\-297.4541\\3\\14.64844\\-297.8438\\3\\12.69531\\-298.3579\\3\\10.74219\\-298.553\\3\\4.882813\\-298.9607\\3\\2.929688\\-299.0368\\3\\0.9765625\\-299.7176\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "298" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "128" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-298.1846\\5\\-22.46094\\-297.4381\\5\\-26.36719\\-297.0043\\5\\-30.27344\\-296.6405\\5\\-32.22656\\-296.3556\\5\\-36.13281\\-295.5853\\5\\-38.08594\\-295.3203\\5\\-45.89844\\-294.6648\\5\\-49.80469\\-294.1975\\5\\-53.71094\\-293.5225\\5\\-57.61719\\-293.0265\\5\\-58.87988\\-292.0547\\5\\-59.57031\\-291.0954\\5\\-60.4968\\-292.0547\\5\\-61.52344\\-292.6902\\5\\-63.47656\\-292.7515\\5\\-67.38281\\-292.5684\\5\\-71.28906\\-292.2291\\5\\-73.24219\\-291.9299\\5\\-83.00781\\-290.7686\\5\\-84.96094\\-290.3758\\5\\-86.91406\\-289.7123\\5\\-90.82031\\-288.9846\\5\\-92.77344\\-288.4572\\5\\-94.72656\\-287.6059\\5\\-96.67969\\-287.0025\\5\\-98.4933\\-286.1953\\5\\-102.5069\\-284.2422\\5\\-108.3984\\-281.2942\\5\\-110.3516\\-280.0663\\5\\-112.3047\\-278.9382\\5\\-114.2578\\-277.5432\\5\\-118.1641\\-275.2041\\5\\-121.75\\-272.5234\\5\\-122.0703\\-272.2201\\5\\-125.9766\\-269.3195\\5\\-127.9297\\-267.6472\\5\\-134.8599\\-260.8047\\5\\-136.5746\\-258.8516\\5\\-139.8409\\-254.9453\\5\\-141.1393\\-252.9922\\5\\-142.5529\\-251.0391\\5\\-143.7934\\-249.0859\\5\\-144.8629\\-247.1328\\5\\-146.2301\\-245.1797\\5\\-148.3839\\-241.2734\\5\\-149.1153\\-239.3203\\5\\-150.1081\\-237.3672\\5\\-150.674\\-235.4141\\5\\-151.6621\\-233.4609\\5\\-152.9815\\-229.5547\\5\\-153.8056\\-227.6016\\5\\-154.7688\\-223.6953\\5\\-155.5678\\-221.7422\\5\\-156.0438\\-219.7891\\5\\-156.6481\\-215.8828\\5\\-157.401\\-213.9297\\5\\-157.8653\\-211.9766\\5\\-158.1596\\-210.0234\\5\\-159.052\\-206.1172\\5\\-159.1873\\-204.1641\\5\\-159.4837\\-202.2109\\5\\-159.8045\\-198.3047\\5\\-160.0231\\-192.4453\\5\\-160.0132\\-188.5391\\5\\-160.0625\\-184.6328\\5\\-160.0472\\-180.7266\\5\\-159.9459\\-176.8203\\5\\-159.7259\\-172.9141\\5\\-159.5365\\-170.9609\\5\\-158.4699\\-165.1016\\5\\-157.9627\\-161.1953\\5\\-157.5936\\-159.2422\\5\\-156.9734\\-157.2891\\5\\-156.503\\-155.3359\\5\\-155.9139\\-151.4297\\5\\-155.3587\\-149.4766\\5\\-154.6583\\-147.5234\\5\\-154.184\\-145.5703\\5\\-153.606\\-143.6172\\5\\-152.7261\\-141.6641\\5\\-152.0719\\-139.7109\\5\\-151.1378\\-137.7578\\5\\-150.4187\\-135.8047\\5\\-149.8227\\-133.8516\\5\\-148.8857\\-131.8984\\5\\-148.2648\\-129.9453\\5\\-146.5018\\-126.0391\\5\\-145.6718\\-124.0859\\5\\-144.6195\\-122.1328\\5\\-142.6971\\-118.2266\\5\\-141.932\\-116.2734\\5\\-141.6016\\-115.8426\\5\\-137.6953\\-109.2333\\5\\-137.1094\\-108.4609\\5\\-136.2089\\-106.5078\\5\\-133.7891\\-102.882\\5\\-132.0216\\-100.6484\\5\\-130.3861\\-98.69531\\5\\-127.9297\\-96.0365\\5\\-125.9766\\-94.32728\\5\\-124.0234\\-93.01122\\5\\-122.0703\\-91.58884\\5\\-120.1172\\-89.94505\\5\\-118.1641\\-88.60162\\5\\-116.2109\\-87.61564\\5\\-112.3047\\-85.30613\\5\\-108.3984\\-83.74213\\5\\-106.4453\\-82.77042\\5\\-104.4922\\-82.09375\\5\\-102.5391\\-81.63006\\5\\-100.5859\\-80.83924\\5\\-96.67969\\-79.8569\\5\\-94.72656\\-79.06932\\5\\-92.77344\\-78.52283\\5\\-90.82031\\-77.83109\\5\\-88.86719\\-77.42712\\5\\-84.96094\\-76.29627\\5\\-81.05469\\-75.85026\\5\\-79.10156\\-75.46381\\5\\-77.14844\\-74.71613\\5\\-73.24219\\-74.33038\\5\\-71.28906\\-73.9919\\5\\-69.33594\\-73.16925\\5\\-67.38281\\-73.03416\\5\\-65.42969\\-72.79101\\5\\-61.52344\\-72.74275\\5\\-53.71094\\-72.79937\\5\\-51.75781\\-72.77455\\5\\-45.89844\\-72.84272\\5\\-43.94531\\-73.97651\\5\\-41.99219\\-74.28125\\5\\-38.08594\\-74.43246\\5\\-36.13281\\-74.63199\\5\\-34.17969\\-75.02181\\5\\-32.22656\\-75.73967\\5\\-28.32031\\-76.22842\\5\\-26.36719\\-76.61623\\5\\-24.41406\\-77.29357\\5\\-20.50781\\-78.47928\\5\\-18.55469\\-79.35186\\5\\-14.64844\\-80.6947\\5\\-12.69531\\-81.73006\\5\\-10.74219\\-82.49545\\5\\-6.835938\\-85.21061\\5\\-4.882813\\-86.40012\\5\\-2.929688\\-87.73402\\5\\-0.9765625\\-88.64292\\5\\0.9765625\\-89.32705\\5\\4.882813\\-87.67609\\5\\8.268838\\-85.02344\\5\\11.08502\\-83.07031\\5\\14.64844\\-80.91119\\5\\16.60156\\-80.15727\\5\\18.55469\\-79.06932\\5\\24.41406\\-76.43599\\5\\28.32031\\-75.65793\\5\\30.27344\\-74.76597\\5\\32.22656\\-74.48286\\5\\36.13281\\-74.12548\\5\\38.08594\\-72.79101\\5\\43.94531\\-72.68324\\5\\45.89844\\-72.515\\5\\47.85156\\-72.62373\\5\\49.80469\\-72.60942\\5\\53.71094\\-72.4502\\5\\55.66406\\-72.64184\\5\\65.42969\\-72.73502\\5\\69.33594\\-72.85171\\5\\71.28906\\-73.74136\\5\\73.24219\\-74.25218\\5\\75.19531\\-74.34675\\5\\79.10156\\-74.65424\\5\\81.05469\\-74.97765\\5\\83.00781\\-75.73967\\5\\88.86719\\-76.58186\\5\\90.82031\\-77.06233\\5\\92.77344\\-77.718\\5\\96.67969\\-78.79707\\5\\98.63281\\-79.53114\\5\\102.5391\\-80.65248\\5\\104.4922\\-81.52582\\5\\108.3984\\-82.68101\\5\\110.3516\\-83.73534\\5\\112.3047\\-84.5022\\5\\114.2578\\-85.6844\\5\\116.2109\\-86.51062\\5\\118.1641\\-87.7203\\5\\120.1172\\-88.75691\\5\\122.0703\\-90.18439\\5\\127.0085\\-94.78906\\5\\128.7898\\-96.74219\\5\\130.2807\\-98.69531\\5\\131.4438\\-100.6484\\5\\131.8359\\-101.1065\\5\\134.2353\\-104.5547\\5\\135.22\\-106.5078\\5\\136.4128\\-108.4609\\5\\137.1644\\-110.4141\\5\\138.3856\\-112.3672\\5\\139.3229\\-114.3203\\5\\140.4969\\-116.2734\\5\\142.3791\\-120.1797\\5\\142.9845\\-122.1328\\5\\144.0009\\-124.0859\\5\\144.6478\\-126.0391\\5\\145.6432\\-127.9922\\5\\147.1652\\-131.8984\\5\\148.0976\\-133.8516\\5\\148.6123\\-135.8047\\5\\149.2248\\-137.7578\\5\\150.0126\\-139.7109\\5\\150.9149\\-143.6172\\5\\151.7466\\-145.5703\\5\\152.6824\\-149.4766\\5\\153.8408\\-153.3828\\5\\154.4405\\-157.2891\\5\\155.159\\-161.1953\\5\\155.58\\-163.1484\\5\\155.8581\\-165.1016\\5\\156.1853\\-169.0078\\5\\156.5735\\-176.8203\\5\\156.8896\\-182.6797\\5\\157.0979\\-190.4922\\5\\157.1274\\-194.3984\\5\\157.2932\\-196.3516\\5\\157.4383\\-200.2578\\5\\156.9734\\-206.1172\\5\\156.9058\\-208.0703\\5\\156.6394\\-210.0234\\5\\155.9966\\-217.8359\\5\\155.7247\\-219.7891\\5\\154.6043\\-223.6953\\5\\153.7845\\-227.6016\\5\\152.9442\\-229.5547\\5\\152.2854\\-231.5078\\5\\151.4486\\-233.4609\\5\\150.4959\\-235.4141\\5\\149.7634\\-237.3672\\5\\148.6769\\-239.3203\\5\\147.7794\\-241.2734\\5\\146.4722\\-243.2266\\5\\145.0361\\-245.1797\\5\\143.9141\\-247.1328\\5\\142.4544\\-249.0859\\5\\140.8578\\-251.0391\\5\\139.0169\\-252.9922\\5\\137.6953\\-254.5171\\5\\135.4274\\-256.8984\\5\\131.8359\\-260.3634\\5\\129.2234\\-262.7578\\5\\127.9297\\-263.7806\\5\\124.0234\\-267.2211\\5\\122.0703\\-268.7544\\5\\120.1172\\-269.9128\\5\\116.2109\\-272.9778\\5\\112.3047\\-275.4405\\5\\110.3516\\-276.5758\\5\\108.3984\\-277.5483\\5\\106.4453\\-278.7923\\5\\104.4922\\-279.7423\\5\\102.5391\\-280.9257\\5\\100.5859\\-281.6023\\5\\98.63281\\-282.6024\\5\\94.72656\\-283.912\\5\\92.77344\\-284.8304\\5\\90.82031\\-285.3669\\5\\86.91406\\-286.7789\\5\\83.00781\\-287.5751\\5\\79.10156\\-288.5892\\5\\77.14844\\-288.8762\\5\\73.24219\\-289.2069\\5\\67.38281\\-289.5846\\5\\63.47656\\-289.9862\\5\\61.52344\\-290.3039\\5\\57.61719\\-290.7186\\5\\53.71094\\-291.0171\\5\\49.80469\\-291.445\\5\\47.85156\\-291.8677\\5\\45.89844\\-292.4217\\5\\41.99219\\-293.0808\\5\\40.03906\\-293.4778\\5\\36.13281\\-294.5421\\5\\30.27344\\-295.3498\\5\\28.32031\\-295.7597\\5\\26.36719\\-296.3204\\5\\24.41406\\-296.6737\\5\\18.55469\\-297.3449\\5\\14.64844\\-298.1846\\5\\12.69531\\-298.5388\\5\\10.74219\\-298.7174\\5\\4.882813\\-299.1188\\5\\2.929688\\-299.1996\\5\\-0.9765625\\-299.5932\\5\\-2.929688\\-299.273\\5\\-6.835938\\-299.1814\\5\\-10.74219\\-298.9198\\5\\-16.60156\\-298.4194\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "294" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "129" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-297.6089\\7\\-26.36719\\-297.0837\\7\\-30.27344\\-296.7368\\7\\-32.22656\\-296.4897\\7\\-34.17969\\-296.1324\\7\\-36.13281\\-295.6708\\7\\-38.08594\\-295.375\\7\\-45.89844\\-294.6844\\7\\-49.80469\\-294.1575\\7\\-51.75781\\-293.7354\\7\\-53.71094\\-293.4264\\7\\-57.61719\\-292.9735\\7\\-59.22515\\-292.0547\\7\\-59.57031\\-291.6147\\7\\-60.1423\\-292.0547\\7\\-61.52344\\-292.6009\\7\\-63.47656\\-292.56\\7\\-67.38281\\-292.2541\\7\\-71.28906\\-291.7204\\7\\-79.10156\\-290.9745\\7\\-81.05469\\-290.7579\\7\\-83.00781\\-290.3758\\7\\-84.96094\\-289.7622\\7\\-86.91406\\-289.3691\\7\\-88.86719\\-289.0952\\7\\-90.82031\\-288.6961\\7\\-92.77344\\-287.9355\\7\\-96.67969\\-286.6523\\7\\-98.63281\\-285.5975\\7\\-100.5859\\-284.8581\\7\\-102.5391\\-283.6982\\7\\-104.4922\\-282.9593\\7\\-106.4453\\-281.8109\\7\\-108.3984\\-280.9849\\7\\-110.3516\\-279.6331\\7\\-115.5384\\-276.4297\\7\\-116.2109\\-275.9168\\7\\-118.1641\\-274.8336\\7\\-120.1172\\-273.4168\\7\\-124.0234\\-270.237\\7\\-125.9766\\-268.9102\\7\\-127.9297\\-267.3039\\7\\-133.7891\\-261.6208\\7\\-136.3012\\-258.8516\\7\\-137.6953\\-257.0017\\7\\-139.6484\\-254.6067\\7\\-142.3276\\-251.0391\\7\\-143.4026\\-249.0859\\7\\-144.599\\-247.1328\\7\\-145.944\\-245.1797\\7\\-146.976\\-243.2266\\7\\-148.1827\\-241.2734\\7\\-148.8532\\-239.3203\\7\\-149.889\\-237.3672\\7\\-150.4706\\-235.4141\\7\\-152.1196\\-231.5078\\7\\-152.6978\\-229.5547\\7\\-153.5457\\-227.6016\\7\\-154.1093\\-225.6484\\7\\-154.5561\\-223.6953\\7\\-155.2734\\-221.7214\\7\\-155.8709\\-219.7891\\7\\-156.4651\\-215.8828\\7\\-157.6796\\-211.9766\\7\\-158.0068\\-210.0234\\7\\-158.4499\\-206.1172\\7\\-159.3413\\-200.2578\\7\\-159.7016\\-196.3516\\7\\-159.853\\-192.4453\\7\\-159.815\\-188.5391\\7\\-159.8699\\-184.6328\\7\\-159.8007\\-178.7734\\7\\-159.6144\\-174.8672\\7\\-159.4272\\-172.9141\\7\\-158.7463\\-169.0078\\7\\-158.0108\\-163.1484\\7\\-157.7148\\-161.1953\\7\\-156.6308\\-157.2891\\7\\-156.0608\\-153.3828\\7\\-155.6571\\-151.4297\\7\\-154.9573\\-149.4766\\7\\-153.9343\\-145.5703\\7\\-153.1264\\-143.6172\\7\\-151.7937\\-139.7109\\7\\-150.7813\\-137.7578\\7\\-150.2337\\-135.8047\\7\\-148.649\\-131.8984\\7\\-148.0358\\-129.9453\\7\\-147.0025\\-127.9922\\7\\-146.2271\\-126.0391\\7\\-145.2421\\-124.0859\\7\\-144.3859\\-122.1328\\7\\-143.2594\\-120.1797\\7\\-142.5159\\-118.2266\\7\\-140.4584\\-114.3203\\7\\-139.1537\\-112.3672\\7\\-138.1778\\-110.4141\\7\\-136.8752\\-108.4609\\7\\-135.9233\\-106.5078\\7\\-134.7852\\-104.5547\\7\\-133.7891\\-103.2086\\7\\-131.5487\\-100.6484\\7\\-130.007\\-98.69531\\7\\-127.9297\\-96.33529\\7\\-125.9766\\-94.71264\\7\\-124.0234\\-93.34258\\7\\-123.4524\\-92.83594\\7\\-120.1172\\-90.22539\\7\\-118.1292\\-88.92969\\7\\-116.2109\\-87.81071\\7\\-114.2578\\-86.56855\\7\\-106.4453\\-83.09514\\7\\-104.4922\\-82.19691\\7\\-102.5391\\-81.84799\\7\\-100.5859\\-80.93458\\7\\-96.67969\\-79.86359\\7\\-94.72656\\-79.15643\\7\\-90.82031\\-78.04508\\7\\-86.91406\\-77.04456\\7\\-84.96094\\-76.4283\\7\\-83.00781\\-76.1309\\7\\-81.05469\\-75.94901\\7\\-79.10156\\-75.66936\\7\\-77.14844\\-74.97059\\7\\-75.19531\\-74.62341\\7\\-73.24219\\-74.39466\\7\\-71.28906\\-74.29933\\7\\-67.38281\\-73.80084\\7\\-65.42969\\-72.80784\\7\\-59.57031\\-72.78273\\7\\-55.66406\\-72.82507\\7\\-51.75781\\-72.79101\\7\\-45.89844\\-72.84272\\7\\-43.94531\\-73.97212\\7\\-41.99219\\-74.26381\\7\\-38.08594\\-74.45247\\7\\-36.13281\\-74.64658\\7\\-34.17969\\-75.01781\\7\\-32.22656\\-75.7558\\7\\-28.32031\\-76.20981\\7\\-26.36719\\-76.63151\\7\\-24.41406\\-77.32108\\7\\-20.50781\\-78.47576\\7\\-18.55469\\-79.33684\\7\\-14.64844\\-80.63901\\7\\-12.69531\\-81.67424\\7\\-10.74219\\-82.45744\\7\\-8.789063\\-83.84263\\7\\-6.835938\\-85.08237\\7\\-2.929688\\-87.40654\\7\\0.9765625\\-89.15394\\7\\4.882813\\-87.59297\\7\\8.129223\\-85.02344\\7\\11.00756\\-83.07031\\7\\14.64844\\-80.91119\\7\\16.60156\\-80.16869\\7\\18.55469\\-79.09748\\7\\22.46094\\-77.37731\\7\\24.41406\\-76.466\\7\\28.32031\\-75.68211\\7\\30.27344\\-74.82132\\7\\32.22656\\-74.53181\\7\\36.13281\\-74.14944\\7\\38.08594\\-72.81641\\7\\45.89844\\-72.68324\\7\\55.66406\\-72.66914\\7\\65.42969\\-72.76647\\7\\67.38281\\-72.81641\\7\\69.33594\\-72.97916\\7\\71.28906\\-74.08723\\7\\73.24219\\-74.2989\\7\\75.19531\\-74.39722\\7\\79.10156\\-74.77315\\7\\83.00781\\-75.82027\\7\\88.86719\\-76.6628\\7\\92.77344\\-77.84001\\7\\96.67969\\-78.91658\\7\\98.63281\\-79.67214\\7\\102.5391\\-80.80614\\7\\104.4922\\-81.6553\\7\\106.4453\\-82.18095\\7\\108.3984\\-82.85094\\7\\110.3516\\-83.86413\\7\\112.3047\\-84.67607\\7\\114.2578\\-85.82399\\7\\116.2109\\-86.70058\\7\\119.8832\\-88.92969\\7\\122.0703\\-90.41747\\7\\126.7705\\-94.78906\\7\\128.5468\\-96.74219\\7\\129.9076\\-98.69531\\7\\131.1384\\-100.6484\\7\\132.6184\\-102.6016\\7\\133.8867\\-104.5547\\7\\134.9597\\-106.5078\\7\\136.1848\\-108.4609\\7\\136.9177\\-110.4141\\7\\138.1202\\-112.3672\\7\\138.9875\\-114.3203\\7\\140.2754\\-116.2734\\7\\141.0853\\-118.2266\\7\\142.1624\\-120.1797\\7\\142.7624\\-122.1328\\7\\143.6691\\-124.0859\\7\\145.1939\\-127.9922\\7\\146.1855\\-129.9453\\7\\146.8558\\-131.8984\\7\\147.8529\\-133.8516\\7\\148.9224\\-137.7578\\7\\149.7491\\-139.7109\\7\\150.2714\\-141.6641\\7\\150.6522\\-143.6172\\7\\152.0272\\-147.5234\\7\\152.9036\\-151.4297\\7\\153.5335\\-153.3828\\7\\153.9509\\-155.3359\\7\\154.8212\\-161.1953\\7\\155.5777\\-165.1016\\7\\155.9966\\-169.0078\\7\\156.33\\-174.8672\\7\\156.6345\\-184.6328\\7\\156.7351\\-190.4922\\7\\156.7576\\-194.3984\\7\\156.8671\\-196.3516\\7\\156.9752\\-200.2578\\7\\156.6139\\-206.1172\\7\\156.3078\\-211.9766\\7\\156.0043\\-215.8828\\7\\155.7717\\-217.8359\\7\\155.4021\\-219.7891\\7\\154.8491\\-221.7422\\7\\154.0067\\-225.6484\\7\\153.4424\\-227.6016\\7\\152.6293\\-229.5547\\7\\152.0126\\-231.5078\\7\\150.9487\\-233.4609\\7\\150.262\\-235.4141\\7\\148.3948\\-239.3203\\7\\146.1315\\-243.2266\\7\\144.6563\\-245.1797\\7\\142.1465\\-249.0859\\7\\140.4644\\-251.0391\\7\\138.5719\\-252.9922\\7\\137.6953\\-254.0315\\7\\134.9308\\-256.8984\\7\\133.7891\\-257.9476\\7\\129.8828\\-261.7464\\7\\123.9953\\-266.6641\\7\\121.5059\\-268.6172\\7\\120.1172\\-269.5573\\7\\118.1641\\-271.0185\\7\\113.0914\\-274.4766\\7\\112.3047\\-275.0545\\7\\110.3516\\-275.9997\\7\\108.3984\\-277.205\\7\\106.0929\\-278.3828\\7\\102.5391\\-280.4205\\7\\100.5859\\-281.2827\\7\\98.63281\\-282.0281\\7\\96.67969\\-282.9589\\7\\94.72656\\-283.4715\\7\\90.82031\\-284.9963\\7\\88.86719\\-285.5083\\7\\86.91406\\-286.2479\\7\\84.96094\\-286.8445\\7\\81.05469\\-287.5913\\7\\77.14844\\-288.4927\\7\\73.24219\\-288.9743\\7\\63.47656\\-289.566\\7\\61.52344\\-289.8236\\7\\57.61719\\-290.4733\\7\\55.66406\\-290.7332\\7\\51.75781\\-291.1397\\7\\49.80469\\-291.3984\\7\\47.85156\\-291.8293\\7\\45.89844\\-292.4217\\7\\41.99219\\-293.1314\\7\\40.03906\\-293.5662\\7\\38.08594\\-294.173\\7\\36.13281\\-294.6369\\7\\30.27344\\-295.4596\\7\\26.36719\\-296.4987\\7\\24.41406\\-296.7957\\7\\20.50781\\-297.2462\\7\\18.55469\\-297.5487\\7\\16.60156\\-298.0361\\7\\14.64844\\-298.4109\\7\\10.74219\\-298.862\\7\\4.882813\\-299.2597\\7\\0.9765625\\-299.438\\7\\-0.9765625\\-299.4778\\7\\-4.882813\\-299.4496\\7\\-6.835938\\-299.3669\\7\\-18.55469\\-298.3488\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "291" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "130" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-298.1846\\9\\-24.41406\\-297.4411\\9\\-26.36719\\-297.1682\\9\\-32.22656\\-296.5824\\9\\-34.17969\\-296.249\\9\\-36.13281\\-295.7895\\9\\-38.08594\\-295.4405\\9\\-45.89844\\-294.692\\9\\-49.80469\\-294.1033\\9\\-51.75781\\-293.659\\9\\-53.71094\\-293.3371\\9\\-57.61719\\-292.9062\\9\\-59.57031\\-292.5714\\9\\-61.52344\\-292.5255\\9\\-63.47656\\-292.3365\\9\\-67.38281\\-291.7956\\9\\-71.28906\\-291.3836\\9\\-75.19531\\-291.0831\\9\\-79.10156\\-290.6919\\9\\-81.05469\\-290.3642\\9\\-83.00781\\-289.795\\9\\-84.96094\\-289.4083\\9\\-88.86719\\-288.8308\\9\\-90.82031\\-288.2638\\9\\-92.77344\\-287.4994\\9\\-94.72656\\-286.9487\\9\\-100.5859\\-284.4038\\9\\-102.5391\\-283.3722\\9\\-104.4922\\-282.5901\\9\\-106.4453\\-281.4968\\9\\-108.3984\\-280.5729\\9\\-112.3047\\-277.9244\\9\\-114.2578\\-276.9147\\9\\-116.2109\\-275.5825\\9\\-120.1172\\-273.0447\\9\\-123.228\\-270.5703\\9\\-124.0234\\-269.8708\\9\\-127.9297\\-266.8382\\9\\-131.8359\\-263.1406\\9\\-134.2381\\-260.8047\\9\\-135.8643\\-258.8516\\9\\-137.3367\\-256.8984\\9\\-140.5853\\-252.9922\\9\\-142.041\\-251.0391\\9\\-143.0806\\-249.0859\\9\\-143.5547\\-248.4744\\9\\-146.6881\\-243.2266\\9\\-147.9394\\-241.2734\\9\\-148.6415\\-239.3203\\9\\-149.5895\\-237.3672\\9\\-150.905\\-233.4609\\9\\-151.8821\\-231.5078\\9\\-152.4764\\-229.5547\\9\\-153.92\\-225.6484\\9\\-154.3707\\-223.6953\\9\\-154.9432\\-221.7422\\9\\-155.6431\\-219.7891\\9\\-156.0559\\-217.8359\\9\\-156.3247\\-215.8828\\9\\-156.719\\-213.9297\\9\\-157.3882\\-211.9766\\9\\-157.8147\\-210.0234\\9\\-158.6423\\-202.2109\\9\\-159.4272\\-196.3516\\9\\-159.6505\\-192.4453\\9\\-159.5956\\-188.5391\\9\\-159.6505\\-184.6328\\9\\-159.5365\\-178.7734\\9\\-159.2173\\-174.8672\\9\\-158.6944\\-170.9609\\9\\-158.0322\\-165.1016\\9\\-157.7679\\-163.1484\\9\\-157.3486\\-161.1953\\9\\-156.7612\\-159.2422\\9\\-156.4234\\-157.2891\\9\\-156.1908\\-155.3359\\9\\-155.8398\\-153.3828\\9\\-155.2975\\-151.4297\\9\\-154.6492\\-149.4766\\9\\-154.1964\\-147.5234\\9\\-153.6436\\-145.5703\\9\\-152.7462\\-143.6172\\9\\-152.1827\\-141.6641\\9\\-150.5228\\-137.7578\\9\\-150.0338\\-135.8047\\9\\-149.1255\\-133.8516\\9\\-147.7409\\-129.9453\\9\\-146.7066\\-127.9922\\9\\-145.9383\\-126.0391\\9\\-144.8927\\-124.0859\\9\\-144.1048\\-122.1328\\9\\-142.9879\\-120.1797\\9\\-142.3276\\-118.2266\\9\\-141.1393\\-116.2734\\9\\-140.2109\\-114.3203\\9\\-138.8941\\-112.3672\\9\\-137.8823\\-110.4141\\9\\-136.6882\\-108.4609\\9\\-134.6444\\-104.5547\\9\\-133.0809\\-102.6016\\9\\-131.2275\\-100.6484\\9\\-127.9208\\-96.74219\\9\\-123.1921\\-92.83594\\9\\-120.1172\\-90.5166\\9\\-114.2578\\-86.76202\\9\\-112.3047\\-86.04168\\9\\-110.337\\-85.02344\\9\\-108.3984\\-84.12769\\9\\-106.4453\\-83.37364\\9\\-104.4922\\-82.43555\\9\\-102.5391\\-81.97327\\9\\-100.5859\\-81.34375\\9\\-98.63281\\-80.56009\\9\\-94.11621\\-79.16406\\9\\-86.91406\\-77.23495\\9\\-84.96094\\-76.63449\\9\\-83.00781\\-76.20139\\9\\-79.10156\\-75.82422\\9\\-77.14844\\-75.39169\\9\\-75.19531\\-74.73254\\9\\-73.24219\\-74.4858\\9\\-67.38281\\-74.17618\\9\\-65.42969\\-73.11768\\9\\-63.47656\\-72.81641\\9\\-59.57031\\-72.79937\\9\\-57.61719\\-72.85171\\9\\-51.75781\\-72.79937\\9\\-45.89844\\-72.87931\\9\\-43.94531\\-73.98131\\9\\-41.99219\\-74.25218\\9\\-38.08594\\-74.48042\\9\\-36.13281\\-74.69054\\9\\-34.17969\\-75.06419\\9\\-32.22656\\-75.7946\\9\\-28.32031\\-76.24055\\9\\-26.36719\\-76.67647\\9\\-24.41406\\-77.39045\\9\\-20.50781\\-78.49526\\9\\-18.55469\\-79.31017\\9\\-14.64844\\-80.5863\\9\\-12.69531\\-81.61244\\9\\-10.74219\\-82.41263\\9\\-8.789063\\-83.79631\\9\\-6.835938\\-84.90137\\9\\-4.882813\\-86.14379\\9\\-2.997504\\-86.97656\\9\\-0.9765625\\-88.0566\\9\\0.9765625\\-88.7328\\9\\2.929688\\-88.26293\\9\\4.882813\\-87.53561\\9\\8.06536\\-85.02344\\9\\10.96755\\-83.07031\\9\\14.64844\\-80.91119\\9\\16.60156\\-80.17991\\9\\20.50781\\-78.23428\\9\\22.46094\\-77.44278\\9\\24.41406\\-76.50705\\9\\28.32031\\-75.70291\\9\\30.27344\\-74.85967\\9\\32.22656\\-74.5612\\9\\36.13281\\-74.19839\\9\\38.08594\\-73.16925\\9\\40.03906\\-72.79101\\9\\41.99219\\-72.75057\\9\\51.75781\\-72.6904\\9\\55.66406\\-72.69763\\9\\65.42969\\-72.79101\\9\\67.38281\\-72.88874\\9\\69.33594\\-73.68353\\9\\71.28906\\-74.2636\\9\\75.19531\\-74.47783\\9\\79.10156\\-74.9375\\9\\81.05469\\-75.61976\\9\\86.91406\\-76.44279\\9\\88.86719\\-76.81113\\9\\96.67969\\-79.06932\\9\\98.63281\\-79.80011\\9\\100.5859\\-80.35829\\9\\102.5391\\-81.01481\\9\\104.4922\\-81.78303\\9\\106.4453\\-82.28789\\9\\108.3554\\-83.07031\\9\\112.4657\\-85.02344\\9\\118.1641\\-88.00352\\9\\122.0703\\-90.67609\\9\\125.9766\\-94.26774\\9\\128.2722\\-96.74219\\9\\129.5111\\-98.69531\\9\\132.3425\\-102.6016\\9\\133.4612\\-104.5547\\9\\135.9063\\-108.4609\\9\\136.7364\\-110.4141\\9\\138.7432\\-114.3203\\9\\139.9972\\-116.2734\\9\\140.8237\\-118.2266\\9\\141.896\\-120.1797\\9\\143.283\\-124.0859\\9\\144.2654\\-126.0391\\9\\144.8952\\-127.9922\\9\\145.9263\\-129.9453\\9\\146.5996\\-131.8984\\9\\147.4994\\-133.8516\\9\\148.2244\\-135.8047\\9\\148.7021\\-137.7578\\9\\150.0835\\-141.6641\\9\\150.4568\\-143.6172\\9\\150.9487\\-145.5703\\9\\151.7566\\-147.5234\\9\\152.6027\\-151.4297\\9\\153.6997\\-155.3359\\9\\154.021\\-157.2891\\9\\154.8283\\-163.1484\\9\\155.5266\\-167.0547\\9\\155.9433\\-170.9609\\9\\156.1853\\-174.8672\\9\\156.3071\\-178.7734\\9\\156.497\\-188.5391\\9\\156.5232\\-194.3984\\9\\156.5975\\-196.3516\\9\\156.5695\\-202.2109\\9\\156.3414\\-208.0703\\9\\156.1435\\-211.9766\\9\\155.7912\\-215.8828\\9\\155.4732\\-217.8359\\9\\154.5837\\-221.7422\\9\\153.7564\\-225.6484\\9\\152.9838\\-227.6016\\9\\151.6773\\-231.5078\\9\\150.6245\\-233.4609\\9\\150.0077\\-235.4141\\9\\148.9223\\-237.3672\\9\\148.1014\\-239.3203\\9\\145.6914\\-243.2266\\9\\143.5547\\-246.2921\\9\\142.9014\\-247.1328\\9\\141.66\\-249.0859\\9\\139.9891\\-251.0391\\9\\137.6953\\-253.5406\\9\\134.4763\\-256.8984\\9\\133.7891\\-257.5048\\9\\129.8828\\-261.3152\\9\\127.9297\\-262.9826\\9\\125.9766\\-264.3579\\9\\122.0703\\-267.6938\\9\\120.1172\\-269.235\\9\\118.1641\\-270.3577\\9\\114.2578\\-273.2823\\9\\112.3047\\-274.4848\\9\\110.3516\\-275.5825\\9\\108.3984\\-276.7854\\9\\106.4453\\-277.6266\\9\\104.4922\\-278.8871\\9\\102.5391\\-279.7898\\9\\100.5859\\-280.9144\\9\\98.63281\\-281.5852\\9\\96.67969\\-282.5069\\9\\94.72656\\-283.1668\\9\\92.77344\\-283.6436\\9\\90.82031\\-284.5279\\9\\86.91406\\-285.6058\\9\\84.96094\\-286.3722\\9\\83.00781\\-286.8558\\9\\79.10156\\-287.5118\\9\\75.19531\\-288.3348\\9\\73.24219\\-288.6565\\9\\69.33594\\-288.9915\\9\\63.47656\\-289.3355\\9\\59.57031\\-289.7311\\9\\55.66406\\-290.5509\\9\\49.80469\\-291.344\\9\\47.85156\\-291.7598\\9\\45.89844\\-292.4217\\9\\41.99219\\-293.1729\\9\\40.03906\\-293.6288\\9\\38.08594\\-294.2878\\9\\36.13281\\-294.7121\\9\\32.22656\\-295.2423\\9\\30.27344\\-295.5827\\9\\28.32031\\-296.1996\\9\\26.36719\\-296.6331\\9\\20.50781\\-297.3809\\9\\16.60156\\-298.2709\\9\\12.69531\\-298.8084\\9\\10.74219\\-298.9898\\9\\4.882813\\-299.4066\\9\\0.9765625\\-299.6127\\9\\-2.929688\\-299.6704\\9\\-4.882813\\-299.6462\\9\\-6.835938\\-299.5198\\9\\-12.69531\\-298.9397\\9\\-18.55469\\-298.4682\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "295" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "131" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-297.5325\\11\\-26.36719\\-297.25\\11\\-32.22656\\-296.6479\\11\\-34.17969\\-296.3422\\11\\-38.08594\\-295.4825\\11\\-40.03906\\-295.2468\\11\\-45.89844\\-294.6844\\11\\-47.85156\\-294.4126\\11\\-51.75781\\-293.5771\\11\\-55.66406\\-293.0122\\11\\-59.57031\\-292.6009\\11\\-65.42969\\-291.6956\\11\\-69.33594\\-291.3055\\11\\-75.19531\\-290.8429\\11\\-77.14844\\-290.6073\\11\\-79.10156\\-290.2655\\11\\-81.05469\\-289.7737\\11\\-83.00781\\-289.4161\\11\\-86.91406\\-288.9114\\11\\-88.86719\\-288.455\\11\\-90.82031\\-287.7166\\11\\-94.72656\\-286.5797\\11\\-96.67969\\-285.5939\\11\\-98.63281\\-284.8914\\11\\-100.5859\\-283.8044\\11\\-102.5391\\-283.1029\\11\\-104.4922\\-282.0831\\11\\-106.4453\\-281.2047\\11\\-108.3984\\-280.022\\11\\-110.3516\\-278.9472\\11\\-112.3047\\-277.5551\\11\\-116.2109\\-275.2925\\11\\-120.1172\\-272.5311\\11\\-122.7572\\-270.5703\\11\\-125.9766\\-267.9683\\11\\-127.5068\\-266.6641\\11\\-133.7891\\-260.7785\\11\\-137.0089\\-256.8984\\11\\-137.6953\\-256.1641\\11\\-140.2858\\-252.9922\\11\\-141.6585\\-251.0391\\11\\-142.806\\-249.0859\\11\\-144.1323\\-247.1328\\11\\-145.1239\\-245.1797\\11\\-146.4442\\-243.2266\\11\\-147.6163\\-241.2734\\11\\-149.2097\\-237.3672\\11\\-150.1116\\-235.4141\\11\\-150.6449\\-233.4609\\11\\-151.568\\-231.5078\\11\\-152.2714\\-229.5547\\11\\-152.8444\\-227.6016\\11\\-153.6944\\-225.6484\\11\\-154.6662\\-221.7422\\11\\-155.3286\\-219.7891\\11\\-155.8709\\-217.8359\\11\\-156.4605\\-213.9297\\11\\-156.8964\\-211.9766\\11\\-157.4623\\-210.0234\\11\\-158.0363\\-206.1172\\11\\-158.5638\\-200.2578\\11\\-159.2024\\-194.3984\\11\\-159.3283\\-192.4453\\11\\-159.2882\\-188.5391\\11\\-159.3018\\-184.6328\\11\\-159.2024\\-180.7266\\11\\-159.0989\\-178.7734\\11\\-158.7779\\-174.8672\\11\\-158.0533\\-167.0547\\11\\-157.8071\\-165.1016\\11\\-157.4504\\-163.1484\\11\\-156.901\\-161.1953\\11\\-156.5222\\-159.2422\\11\\-156.009\\-155.3359\\11\\-155.5678\\-153.3828\\11\\-154.9037\\-151.4297\\11\\-153.9694\\-147.5234\\11\\-152.4599\\-143.6172\\11\\-151.9179\\-141.6641\\11\\-150.9535\\-139.7109\\11\\-149.7608\\-135.8047\\11\\-148.84\\-133.8516\\11\\-148.2458\\-131.8984\\11\\-146.4679\\-127.9922\\11\\-144.589\\-124.0859\\11\\-143.7529\\-122.1328\\11\\-142.762\\-120.1797\\11\\-142.0689\\-118.2266\\11\\-140.8472\\-116.2734\\11\\-139.9065\\-114.3203\\11\\-137.4324\\-110.4141\\11\\-136.5349\\-108.4609\\11\\-134.3559\\-104.5547\\11\\-132.8501\\-102.6016\\11\\-131.0124\\-100.6484\\11\\-127.9297\\-97.1443\\11\\-125.9766\\-95.36392\\11\\-122.9467\\-92.83594\\11\\-120.1172\\-90.78807\\11\\-116.2109\\-88.19382\\11\\-113.9109\\-86.97656\\11\\-109.9459\\-85.02344\\11\\-108.3984\\-84.32492\\11\\-106.4453\\-83.62931\\11\\-104.4922\\-82.76926\\11\\-102.5391\\-82.13814\\11\\-100.5859\\-81.74451\\11\\-98.63281\\-80.7394\\11\\-96.67969\\-80.18501\\11\\-88.86719\\-77.81451\\11\\-86.91406\\-77.3559\\11\\-83.00781\\-76.2553\\11\\-81.05469\\-76.11694\\11\\-77.14844\\-75.70596\\11\\-75.19531\\-74.85938\\11\\-73.24219\\-74.58599\\11\\-71.28906\\-74.43443\\11\\-67.38281\\-74.25184\\11\\-65.42969\\-74.00809\\11\\-63.47656\\-73.1431\\11\\-61.52344\\-72.81641\\11\\-55.66406\\-72.86079\\11\\-51.75781\\-72.81641\\11\\-47.85156\\-72.87\\11\\-45.89844\\-73.1431\\11\\-43.94531\\-74.08977\\11\\-38.08594\\-74.50912\\11\\-36.13281\\-74.72581\\11\\-34.17969\\-75.19678\\11\\-32.22656\\-75.83487\\11\\-28.32031\\-76.31274\\11\\-26.36719\\-76.7597\\11\\-24.41406\\-77.47915\\11\\-20.50781\\-78.49904\\11\\-18.55469\\-79.28032\\11\\-14.64844\\-80.55453\\11\\-12.69531\\-81.58791\\11\\-10.74219\\-82.36903\\11\\-8.789063\\-83.70221\\11\\-6.835938\\-84.7047\\11\\-4.882813\\-86.00626\\11\\-2.929688\\-86.86031\\11\\-0.9765625\\-88.01251\\11\\0.9765625\\-88.35649\\11\\2.929688\\-88.14193\\11\\4.882813\\-87.41639\\11\\8.047921\\-85.02344\\11\\11.01047\\-83.07031\\11\\14.64844\\-80.93893\\11\\16.60156\\-80.17991\\11\\20.50781\\-78.26307\\11\\22.46094\\-77.50459\\11\\24.41406\\-76.58361\\11\\28.32031\\-75.74286\\11\\30.27344\\-74.89641\\11\\32.22656\\-74.57818\\11\\36.13281\\-74.25218\\11\\38.08594\\-73.81906\\11\\40.03906\\-72.80784\\11\\43.94531\\-72.74275\\11\\55.66406\\-72.71235\\11\\61.52344\\-72.75057\\11\\65.42969\\-72.82507\\11\\66.95902\\-73.30469\\11\\69.33594\\-74.22894\\11\\73.24219\\-74.40257\\11\\77.14844\\-74.76235\\11\\81.05469\\-75.76814\\11\\86.91406\\-76.53766\\11\\88.86719\\-76.99924\\11\\92.77344\\-78.03056\\11\\96.40842\\-79.16406\\11\\98.63281\\-79.96362\\11\\100.5859\\-80.46821\\11\\102.5391\\-81.25\\11\\104.4922\\-81.92178\\11\\106.4453\\-82.40529\\11\\108.3984\\-83.3463\\11\\110.3516\\-84.14732\\11\\112.3047\\-85.18119\\11\\114.2578\\-86.09032\\11\\116.2109\\-87.22833\\11\\118.1641\\-88.17014\\11\\121.9076\\-90.88281\\11\\125.9766\\-94.63182\\11\\127.9297\\-96.77148\\11\\130.6912\\-100.6484\\11\\132.0103\\-102.6016\\11\\133.1279\\-104.5547\\11\\134.4758\\-106.5078\\11\\136.5784\\-110.4141\\11\\137.3819\\-112.3672\\11\\137.6953\\-112.7914\\11\\139.6484\\-116.37\\11\\141.6016\\-120.3001\\11\\142.4326\\-122.1328\\11\\142.9883\\-124.0859\\11\\144.0139\\-126.0391\\11\\144.6589\\-127.9922\\11\\145.5744\\-129.9453\\11\\147.1015\\-133.8516\\11\\148.0056\\-135.8047\\11\\149.039\\-139.7109\\11\\149.8336\\-141.6641\\11\\150.6789\\-145.5703\\11\\151.9769\\-149.4766\\11\\152.7497\\-153.3828\\11\\153.3279\\-155.3359\\11\\153.7997\\-157.2891\\11\\154.0939\\-159.2422\\11\\154.5725\\-163.1484\\11\\155.1437\\-167.0547\\11\\155.5121\\-169.0078\\11\\155.8798\\-172.9141\\11\\156.1062\\-176.8203\\11\\156.2326\\-180.7266\\11\\156.3528\\-188.5391\\11\\156.3642\\-194.3984\\11\\156.4213\\-196.3516\\11\\156.3985\\-200.2578\\11\\156.3132\\-204.1641\\11\\156.0872\\-210.0234\\11\\155.7584\\-213.9297\\11\\155.4864\\-215.8828\\11\\155.0605\\-217.8359\\11\\153.9617\\-223.6953\\11\\153.3729\\-225.6484\\11\\152.6451\\-227.6016\\11\\152.0916\\-229.5547\\11\\151.1944\\-231.5078\\11\\149.673\\-235.4141\\11\\148.6214\\-237.3672\\11\\147.7389\\-239.3203\\11\\146.5075\\-241.2734\\11\\145.13\\-243.2266\\11\\143.9986\\-245.1797\\11\\141.0991\\-249.0859\\11\\137.5868\\-252.9922\\11\\135.9743\\-254.9453\\11\\133.9674\\-256.8984\\11\\131.8359\\-258.8256\\11\\129.8183\\-260.8047\\11\\127.4889\\-262.7578\\11\\125.9766\\-263.8896\\11\\122.0703\\-267.2904\\11\\120.1172\\-268.706\\11\\118.1641\\-269.8814\\11\\117.3188\\-270.5703\\11\\114.2578\\-272.7898\\11\\112.3047\\-273.9213\\11\\110.3516\\-275.2253\\11\\108.3984\\-276.1367\\11\\106.4453\\-277.2726\\11\\104.4922\\-278.2511\\11\\100.5859\\-280.3744\\11\\98.63281\\-281.2221\\11\\96.67969\\-281.897\\11\\94.72656\\-282.8139\\11\\90.82031\\-283.8364\\11\\88.86719\\-284.6943\\11\\84.96094\\-285.6915\\11\\83.00781\\-286.3962\\11\\81.05469\\-286.8482\\11\\77.14844\\-287.4115\\11\\71.28906\\-288.4786\\11\\69.33594\\-288.7148\\11\\65.42969\\-289.0411\\11\\59.57031\\-289.4768\\11\\57.61719\\-289.7995\\11\\55.66406\\-290.3406\\11\\53.71094\\-290.7259\\11\\49.80469\\-291.2824\\11\\47.85156\\-291.7059\\11\\45.89844\\-292.4217\\11\\41.99219\\-293.2069\\11\\40.03906\\-293.7089\\11\\38.08594\\-294.3707\\11\\36.13281\\-294.7739\\11\\32.22656\\-295.3036\\11\\30.27344\\-295.7078\\11\\28.32031\\-296.3448\\11\\26.36719\\-296.7126\\11\\22.46094\\-297.1994\\11\\20.50781\\-297.5405\\11\\18.55469\\-298.0627\\11\\16.60156\\-298.4277\\11\\10.74219\\-299.11\\11\\4.882813\\-299.5641\\11\\0.9765625\\-299.7266\\11\\-2.929688\\-299.7974\\11\\-4.882813\\-299.7266\\11\\-10.74219\\-299.2363\\11\\-14.64844\\-298.8525\\11\\-18.55469\\-298.5496\\11\\-20.50781\\-298.301\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "296" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "132" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-297.636\\13\\-28.32031\\-297.0778\\13\\-32.22656\\-296.6947\\13\\-34.17969\\-296.4171\\13\\-38.08594\\-295.5158\\13\\-40.03906\\-295.2712\\13\\-45.89844\\-294.6726\\13\\-47.85156\\-294.3683\\13\\-51.75781\\-293.4991\\13\\-53.71094\\-293.1758\\13\\-59.57031\\-292.4514\\13\\-63.47656\\-291.6853\\13\\-67.38281\\-291.2584\\13\\-73.24219\\-290.7789\\13\\-75.19531\\-290.5443\\13\\-79.10156\\-289.7014\\13\\-81.05469\\-289.4006\\13\\-84.96094\\-288.9285\\13\\-86.91406\\-288.5542\\13\\-88.86719\\-287.8788\\13\\-92.77344\\-286.8482\\13\\-98.63281\\-284.4333\\13\\-100.5859\\-283.4342\\13\\-102.5391\\-282.7942\\13\\-104.4922\\-281.6795\\13\\-106.4453\\-280.8657\\13\\-108.3984\\-279.6035\\13\\-112.3047\\-277.2625\\13\\-114.2578\\-275.9276\\13\\-116.2109\\-274.9613\\13\\-118.1641\\-273.5117\\13\\-120.1172\\-271.9627\\13\\-124.0234\\-269.2101\\13\\-127.0672\\-266.6641\\13\\-129.205\\-264.7109\\13\\-133.7891\\-260.2794\\13\\-137.6953\\-255.8211\\13\\-139.9361\\-252.9922\\13\\-141.6016\\-250.5699\\13\\-143.8427\\-247.1328\\13\\-144.8308\\-245.1797\\13\\-146.1926\\-243.2266\\13\\-148.2338\\-239.3203\\13\\-148.9292\\-237.3672\\13\\-149.8922\\-235.4141\\13\\-150.4517\\-233.4609\\13\\-151.1413\\-231.5078\\13\\-152.0453\\-229.5547\\13\\-152.5797\\-227.6016\\13\\-153.328\\-225.6484\\13\\-153.9771\\-223.6953\\13\\-154.9316\\-219.7891\\13\\-155.58\\-217.8359\\13\\-156.0043\\-215.8828\\13\\-156.5412\\-211.9766\\13\\-156.8872\\-210.0234\\13\\-157.426\\-208.0703\\13\\-157.7838\\-206.1172\\13\\-157.997\\-204.1641\\13\\-158.4642\\-198.3047\\13\\-158.8369\\-192.4453\\13\\-158.896\\-188.5391\\13\\-158.7878\\-180.7266\\13\\-158.495\\-174.8672\\13\\-158.0436\\-169.0078\\13\\-157.8547\\-167.0547\\13\\-157.5195\\-165.1016\\13\\-156.6018\\-161.1953\\13\\-156.125\\-157.2891\\13\\-155.7815\\-155.3359\\13\\-154.6121\\-151.4297\\13\\-153.6969\\-147.5234\\13\\-152.8105\\-145.5703\\13\\-151.5416\\-141.6641\\13\\-150.6662\\-139.7109\\13\\-150.1703\\-137.7578\\13\\-148.6167\\-133.8516\\13\\-148.0181\\-131.8984\\13\\-146.9727\\-129.9453\\13\\-146.2277\\-127.9922\\13\\-145.097\\-126.0391\\13\\-144.3232\\-124.0859\\13\\-143.2938\\-122.1328\\13\\-142.5413\\-120.1797\\13\\-141.6576\\-118.2266\\13\\-139.6484\\-114.5339\\13\\-138.4092\\-112.3672\\13\\-137.1251\\-110.4141\\13\\-136.3322\\-108.4609\\13\\-134.01\\-104.5547\\13\\-132.4894\\-102.6016\\13\\-129.1145\\-98.69531\\13\\-127.2364\\-96.74219\\13\\-125.9766\\-95.57994\\13\\-124.0234\\-93.94503\\13\\-122.0703\\-92.4388\\13\\-120.1172\\-91.14175\\13\\-116.2109\\-88.43056\\13\\-114.2578\\-87.62985\\13\\-112.3047\\-86.39713\\13\\-108.3984\\-84.61543\\13\\-102.5391\\-82.30302\\13\\-100.5859\\-81.86983\\13\\-98.63281\\-80.96634\\13\\-90.82031\\-78.58847\\13\\-88.86719\\-77.93304\\13\\-86.91406\\-77.48261\\13\\-83.00781\\-76.38298\\13\\-79.10156\\-76.03068\\13\\-77.14844\\-75.80392\\13\\-75.19531\\-75.16441\\13\\-73.24219\\-74.68634\\13\\-71.28906\\-74.50409\\13\\-67.38281\\-74.27537\\13\\-65.42969\\-74.22894\\13\\-63.47656\\-73.97178\\13\\-61.52344\\-72.86079\\13\\-55.66406\\-72.90796\\13\\-51.75781\\-72.85171\\13\\-47.85156\\-72.87\\13\\-43.94531\\-74.21731\\13\\-41.99219\\-74.28125\\13\\-38.08594\\-74.53369\\13\\-36.13281\\-74.73649\\13\\-34.17969\\-75.50011\\13\\-32.22656\\-75.87814\\13\\-28.32031\\-76.38508\\13\\-26.36719\\-76.82729\\13\\-24.41406\\-77.54974\\13\\-20.50781\\-78.52319\\13\\-18.55469\\-79.32182\\13\\-14.64844\\-80.53253\\13\\-12.69531\\-81.57385\\13\\-10.74219\\-82.33951\\13\\-8.789063\\-83.61068\\13\\-6.835938\\-84.58567\\13\\-4.882813\\-85.75764\\13\\-2.929688\\-86.73607\\13\\-0.9765625\\-88.08529\\13\\0.9765625\\-88.21886\\13\\2.929688\\-88.01613\\13\\4.882813\\-87.11968\\13\\6.835938\\-85.93533\\13\\8.789063\\-84.54382\\13\\12.69531\\-82.08724\\13\\14.64844\\-80.99809\\13\\16.60156\\-80.20236\\13\\20.50781\\-78.31463\\13\\22.46094\\-77.57632\\13\\24.41406\\-76.69393\\13\\26.36719\\-76.16966\\13\\28.32031\\-75.80244\\13\\30.27344\\-74.94817\\13\\32.22656\\-74.60452\\13\\36.13281\\-74.28125\\13\\38.08594\\-73.98077\\13\\40.03906\\-72.95817\\13\\41.99219\\-72.79937\\13\\43.94531\\-72.76647\\13\\51.75781\\-72.73502\\13\\59.57031\\-72.75848\\13\\63.47656\\-72.82507\\13\\65.42969\\-73.06896\\13\\67.38281\\-74.13055\\13\\73.24219\\-74.46279\\13\\75.19531\\-74.63146\\13\\77.14844\\-74.94004\\13\\79.10156\\-75.57171\\13\\81.05469\\-75.86665\\13\\86.91406\\-76.63246\\13\\90.82031\\-77.68654\\13\\92.77344\\-78.14072\\13\\94.72656\\-78.75767\\13\\98.63281\\-80.09384\\13\\100.5859\\-80.5863\\13\\102.5391\\-81.44271\\13\\106.4453\\-82.53477\\13\\108.3984\\-83.53255\\13\\110.3516\\-84.29388\\13\\112.3047\\-85.39904\\13\\114.2578\\-86.25128\\13\\116.2109\\-87.41138\\13\\118.1641\\-88.32515\\13\\121.5328\\-90.88281\\13\\123.6979\\-92.83594\\13\\125.9766\\-95.08895\\13\\127.5204\\-96.74219\\13\\129.0485\\-98.69531\\13\\130.4321\\-100.6484\\13\\133.7891\\-105.9634\\13\\134.2163\\-106.5078\\13\\135.1681\\-108.4609\\13\\136.3824\\-110.4141\\13\\137.1029\\-112.3672\\13\\138.31\\-114.3203\\13\\139.1855\\-116.2734\\13\\140.3642\\-118.2266\\13\\141.183\\-120.1797\\13\\142.2463\\-122.1328\\13\\142.804\\-124.0859\\13\\143.6834\\-126.0391\\13\\145.1509\\-129.9453\\13\\146.1457\\-131.8984\\13\\146.804\\-133.8516\\13\\147.7291\\-135.8047\\13\\148.331\\-137.7578\\13\\148.7997\\-139.7109\\13\\149.5164\\-141.6641\\13\\150.127\\-143.6172\\13\\150.9251\\-147.5234\\13\\151.6927\\-149.4766\\13\\152.1657\\-151.4297\\13\\152.5004\\-153.3828\\13\\152.9335\\-155.3359\\13\\153.5087\\-157.2891\\13\\153.8857\\-159.2422\\13\\154.1504\\-161.1953\\13\\154.8387\\-167.0547\\13\\155.1882\\-169.0078\\13\\155.6517\\-172.9141\\13\\155.9514\\-176.8203\\13\\156.0942\\-180.7266\\13\\156.2149\\-186.5859\\13\\156.2787\\-196.3516\\13\\156.25\\-200.2578\\13\\156.1553\\-204.1641\\13\\155.992\\-208.0703\\13\\155.6764\\-211.9766\\13\\155.4031\\-213.9297\\13\\154.7001\\-217.8359\\13\\154.1158\\-221.7422\\13\\153.6865\\-223.6953\\13\\152.9284\\-225.6484\\13\\151.791\\-229.5547\\13\\150.8065\\-231.5078\\13\\150.2035\\-233.4609\\13\\148.3638\\-237.3672\\13\\146.1879\\-241.2734\\13\\144.7427\\-243.2266\\13\\143.4652\\-245.1797\\13\\142.2897\\-247.1328\\13\\140.6966\\-249.0859\\13\\137.0331\\-252.9922\\13\\135.7422\\-254.5499\\13\\133.3008\\-256.8984\\13\\131.8359\\-258.2168\\13\\129.1985\\-260.8047\\13\\126.9372\\-262.7578\\13\\124.4996\\-264.7109\\13\\122.0703\\-266.7361\\13\\116.2109\\-270.9073\\13\\114.2578\\-272.0992\\13\\110.3516\\-274.7845\\13\\108.3984\\-275.6908\\13\\106.4453\\-276.8881\\13\\104.4922\\-277.6967\\13\\102.5391\\-278.9348\\13\\100.5859\\-279.7719\\13\\98.63281\\-280.8469\\13\\96.67969\\-281.4867\\13\\92.77344\\-282.9714\\13\\90.82031\\-283.4145\\13\\88.86719\\-284.0128\\13\\86.91406\\-284.8109\\13\\83.00781\\-285.7102\\13\\81.05469\\-286.3318\\13\\79.10156\\-286.7708\\13\\73.24219\\-287.6059\\13\\69.33594\\-288.3062\\13\\67.38281\\-288.5997\\13\\63.47656\\-289.0119\\13\\59.57031\\-289.3238\\13\\57.61719\\-289.5786\\13\\53.71094\\-290.6158\\13\\49.80469\\-291.2352\\13\\47.85156\\-291.6853\\13\\45.89844\\-292.4115\\13\\41.99219\\-293.2424\\13\\38.08594\\-294.4383\\13\\36.13281\\-294.8206\\13\\32.22656\\-295.3673\\13\\30.27344\\-295.8602\\13\\28.32031\\-296.4619\\13\\26.36719\\-296.7897\\13\\22.46094\\-297.2994\\13\\20.50781\\-297.7058\\13\\18.55469\\-298.2502\\13\\16.60156\\-298.5426\\13\\10.74219\\-299.1999\\13\\4.882813\\-299.6877\\13\\2.929688\\-299.798\\13\\-0.9765625\\-299.8436\\13\\-4.882813\\-299.7277\\13\\-10.74219\\-299.2779\\13\\-18.55469\\-298.6066\\13\\-20.50781\\-298.4023\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "288" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "133" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.9765625\\-299.9338\\15\\-4.882813\\-299.7695\\15\\-8.789063\\-299.4881\\15\\-18.55469\\-298.6709\\15\\-22.46094\\-298.1846\\15\\-26.36719\\-297.3896\\15\\-28.32031\\-297.1275\\15\\-32.22656\\-296.739\\15\\-34.17969\\-296.4772\\15\\-38.08594\\-295.5608\\15\\-40.03906\\-295.2996\\15\\-45.89844\\-294.6648\\15\\-47.85156\\-294.3333\\15\\-51.75781\\-293.423\\15\\-53.71094\\-293.1196\\15\\-57.61719\\-292.6244\\15\\-59.57031\\-292.2664\\15\\-61.52344\\-291.7729\\15\\-63.47656\\-291.4643\\15\\-71.28906\\-290.7509\\15\\-73.24219\\-290.4859\\15\\-77.14844\\-289.6595\\15\\-79.10156\\-289.3886\\15\\-83.00781\\-288.9622\\15\\-84.96094\\-288.6234\\15\\-88.86719\\-287.4006\\15\\-90.82031\\-287.0128\\15\\-92.77344\\-286.4343\\15\\-94.72656\\-285.5236\\15\\-96.67969\\-284.8839\\15\\-98.63281\\-283.8285\\15\\-100.5859\\-283.1784\\15\\-102.6503\\-282.2891\\15\\-106.4453\\-280.4199\\15\\-108.3984\\-279.268\\15\\-110.3516\\-277.922\\15\\-112.3047\\-276.9313\\15\\-114.2578\\-275.6024\\15\\-116.2109\\-274.5014\\15\\-118.1641\\-273.1598\\15\\-122.0703\\-270.0749\\15\\-124.0234\\-268.7705\\15\\-125.9766\\-267.2321\\15\\-128.8328\\-264.7109\\15\\-131.8359\\-261.8905\\15\\-134.772\\-258.8516\\15\\-138.0381\\-254.9453\\15\\-142.3533\\-249.0859\\15\\-144.5818\\-245.1797\\15\\-145.8971\\-243.2266\\15\\-146.8689\\-241.2734\\15\\-147.9907\\-239.3203\\15\\-148.6895\\-237.3672\\15\\-149.5895\\-235.4141\\15\\-150.289\\-233.4609\\15\\-150.81\\-231.5078\\15\\-151.7591\\-229.5547\\15\\-152.9208\\-225.6484\\15\\-153.7298\\-223.6953\\15\\-154.6285\\-219.7891\\15\\-155.7483\\-215.8828\\15\\-156.1062\\-213.9297\\15\\-156.5656\\-210.0234\\15\\-156.9245\\-208.0703\\15\\-157.4504\\-206.1172\\15\\-157.7679\\-204.1641\\15\\-157.9652\\-202.2109\\15\\-158.2416\\-198.3047\\15\\-158.4447\\-194.3984\\15\\-158.5749\\-190.4922\\15\\-158.586\\-188.5391\\15\\-158.5056\\-180.7266\\15\\-158.2853\\-174.8672\\15\\-157.8513\\-169.0078\\15\\-157.5834\\-167.0547\\15\\-156.6819\\-163.1484\\15\\-155.935\\-157.2891\\15\\-155.4747\\-155.3359\\15\\-154.8491\\-153.3828\\15\\-153.92\\-149.4766\\15\\-153.3203\\-147.6455\\15\\-152.5228\\-145.5703\\15\\-151.9643\\-143.6172\\15\\-151.0651\\-141.6641\\15\\-149.9449\\-137.7578\\15\\-149.0331\\-135.8047\\15\\-147.7349\\-131.8984\\15\\-146.6989\\-129.9453\\15\\-145.9343\\-127.9922\\15\\-144.7917\\-126.0391\\15\\-144.065\\-124.0859\\15\\-142.9714\\-122.1328\\15\\-142.3181\\-120.1797\\15\\-141.2421\\-118.2266\\15\\-140.3939\\-116.2734\\15\\-139.1211\\-114.3203\\15\\-138.1416\\-112.3672\\15\\-136.8764\\-110.4141\\15\\-136.0502\\-108.4609\\15\\-133.7891\\-104.7586\\15\\-129.8828\\-99.79504\\15\\-128.958\\-98.69531\\15\\-125.9766\\-95.81445\\15\\-124.0234\\-94.15466\\15\\-116.2109\\-88.66769\\15\\-114.2578\\-87.8467\\15\\-112.3047\\-86.62081\\15\\-110.3516\\-85.87399\\15\\-106.4453\\-84.0533\\15\\-104.4922\\-83.37908\\15\\-102.5391\\-82.46986\\15\\-100.5859\\-81.98319\\15\\-98.63281\\-81.32813\\15\\-96.67969\\-80.49806\\15\\-94.72656\\-80.0342\\15\\-92.19752\\-79.16406\\15\\-90.82031\\-78.80599\\15\\-88.86719\\-78.0981\\15\\-83.00781\\-76.56227\\15\\-81.05469\\-76.27218\\15\\-77.14844\\-75.89849\\15\\-75.19531\\-75.5621\\15\\-73.24219\\-74.78088\\15\\-71.28906\\-74.57758\\15\\-67.38281\\-74.31102\\15\\-63.47656\\-74.20035\\15\\-61.52344\\-72.9377\\15\\-55.66406\\-72.9686\\15\\-47.85156\\-72.84272\\15\\-43.94531\\-74.22894\\15\\-41.99219\\-74.30492\\15\\-38.08594\\-74.56807\\15\\-36.13281\\-74.78876\\15\\-34.17969\\-75.66864\\15\\-28.32031\\-76.46021\\15\\-26.36719\\-76.9389\\15\\-24.41406\\-77.60545\\15\\-20.50781\\-78.59342\\15\\-18.55469\\-79.3754\\15\\-14.64844\\-80.5416\\15\\-12.69531\\-81.56301\\15\\-10.74219\\-82.32353\\15\\-8.789063\\-83.55527\\15\\-5.872938\\-85.02344\\15\\-2.282715\\-86.97656\\15\\-0.9765625\\-87.80586\\15\\0.9765625\\-88.09354\\15\\2.929688\\-87.9158\\15\\6.835938\\-85.8922\\15\\8.789063\\-84.53516\\15\\10.74219\\-83.38876\\15\\12.69531\\-82.11962\\15\\14.64844\\-81.07616\\15\\18.55469\\-79.3836\\15\\20.50781\\-78.36293\\15\\22.46094\\-77.6414\\15\\24.41406\\-76.79057\\15\\26.36719\\-76.22253\\15\\28.32031\\-75.87044\\15\\32.22656\\-74.65525\\15\\34.17969\\-74.45027\\15\\38.08594\\-74.18539\\15\\40.03906\\-73.23811\\15\\41.99219\\-72.83385\\15\\47.85156\\-72.78273\\15\\55.66406\\-72.76647\\15\\61.52344\\-72.81641\\15\\63.47656\\-73.01172\\15\\65.42969\\-73.89632\\15\\67.38281\\-74.20568\\15\\71.28906\\-74.40409\\15\\75.19531\\-74.72707\\15\\77.14844\\-75.166\\15\\79.10156\\-75.71699\\15\\84.96094\\-76.42394\\15\\86.91406\\-76.78329\\15\\88.86719\\-77.37609\\15\\92.77344\\-78.33904\\15\\94.72656\\-78.91658\\15\\96.67969\\-79.64556\\15\\100.5859\\-80.70856\\15\\102.5391\\-81.56738\\15\\106.4453\\-82.73801\\15\\108.3984\\-83.71532\\15\\110.3516\\-84.46452\\15\\112.3047\\-85.59677\\15\\114.2578\\-86.41246\\15\\116.2109\\-87.59862\\15\\118.1641\\-88.56348\\15\\120.1172\\-89.97559\\15\\123.4345\\-92.83594\\15\\125.9766\\-95.40922\\15\\127.2022\\-96.74219\\15\\128.8099\\-98.69531\\15\\130.1058\\-100.6484\\15\\131.2406\\-102.6016\\15\\131.8359\\-103.3707\\15\\133.7891\\-106.4119\\15\\134.9253\\-108.4609\\15\\136.1314\\-110.4141\\15\\136.898\\-112.3672\\15\\138.0358\\-114.3203\\15\\138.8926\\-116.2734\\15\\140.1149\\-118.2266\\15\\140.9091\\-120.1797\\15\\142.0045\\-122.1328\\15\\143.2957\\-126.0391\\15\\144.2603\\-127.9922\\15\\144.8357\\-129.9453\\15\\145.8635\\-131.8984\\15\\146.5441\\-133.8516\\15\\148.1262\\-137.7578\\15\\149.1444\\-141.6641\\15\\149.899\\-143.6172\\15\\150.6564\\-147.5234\\15\\151.9228\\-151.4297\\15\\152.6455\\-155.3359\\15\\153.0901\\-157.2891\\15\\153.6372\\-159.2422\\15\\153.9433\\-161.1953\\15\\155.0752\\-170.9609\\15\\155.5896\\-174.8672\\15\\155.7451\\-176.8203\\15\\155.9307\\-180.7266\\15\\156.0872\\-186.5859\\15\\156.1369\\-192.4453\\15\\156.0822\\-200.2578\\15\\155.9639\\-204.1641\\15\\155.7451\\-208.0703\\15\\155.3125\\-211.9766\\15\\154.9812\\-213.9297\\15\\154.1938\\-219.7891\\15\\153.8609\\-221.7422\\15\\152.6196\\-225.6484\\15\\152.125\\-227.6016\\15\\150.5457\\-231.5078\\15\\149.9544\\-233.4609\\15\\148.8685\\-235.4141\\15\\148.0928\\-237.3672\\15\\146.8406\\-239.3203\\15\\145.8068\\-241.2734\\15\\143.5547\\-244.4909\\15\\143.0114\\-245.1797\\15\\141.8795\\-247.1328\\15\\140.324\\-249.0859\\15\\137.6953\\-251.8361\\15\\134.8842\\-254.9453\\15\\131.8359\\-257.7892\\15\\129.8828\\-259.7173\\15\\127.9297\\-261.5354\\15\\125.9766\\-263.1231\\15\\124.0234\\-264.4688\\15\\121.4371\\-266.6641\\15\\118.1641\\-269.1441\\15\\116.2109\\-270.268\\15\\112.3047\\-273.0716\\15\\110.3516\\-274.1558\\15\\108.3984\\-275.366\\15\\106.2296\\-276.4297\\15\\100.5859\\-279.3378\\15\\96.67969\\-281.1328\\15\\94.72656\\-281.6955\\15\\92.77344\\-282.5219\\15\\90.82031\\-283.1029\\15\\88.86719\\-283.5053\\15\\84.96094\\-284.8575\\15\\81.05469\\-285.6347\\15\\77.14844\\-286.6745\\15\\69.33594\\-287.7865\\15\\65.42969\\-288.5757\\15\\61.52344\\-289.0421\\15\\57.61719\\-289.4287\\15\\55.66406\\-289.8539\\15\\53.71094\\-290.5131\\15\\49.80469\\-291.21\\15\\47.85156\\-291.6777\\15\\45.89844\\-292.4012\\15\\41.99219\\-293.2727\\15\\38.08594\\-294.493\\15\\36.13281\\-294.8557\\15\\32.22656\\-295.4466\\15\\28.32031\\-296.5457\\15\\22.46094\\-297.4106\\15\\18.55469\\-298.3937\\15\\16.60156\\-298.6416\\15\\10.74219\\-299.2624\\15\\4.882813\\-299.7688\\15\\2.929688\\-299.9048\\15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "134" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.882813\\-299.9048\\17\\-6.835938\\-299.7562\\17\\-18.55469\\-298.7327\\17\\-22.46094\\-298.2911\\17\\-26.36719\\-297.46\\17\\-28.32031\\-297.179\\17\\-34.17969\\-296.5372\\17\\-36.13281\\-296.1324\\17\\-38.08594\\-295.6102\\17\\-40.03906\\-295.3203\\17\\-45.89844\\-294.645\\17\\-47.85156\\-294.3068\\17\\-49.80469\\-293.7671\\17\\-51.75781\\-293.3549\\17\\-57.61719\\-292.5167\\17\\-61.52344\\-291.5693\\17\\-63.47656\\-291.2985\\17\\-67.38281\\-290.9406\\17\\-71.28906\\-290.4834\\17\\-75.19531\\-289.6165\\17\\-81.05469\\-288.9864\\17\\-83.00781\\-288.6852\\17\\-84.96094\\-288.1722\\17\\-86.91406\\-287.5039\\17\\-90.82031\\-286.6715\\17\\-92.77344\\-285.8138\\17\\-94.72656\\-285.1828\\17\\-96.67969\\-284.4539\\17\\-98.63281\\-283.486\\17\\-100.5859\\-282.9254\\17\\-102.5391\\-281.8998\\17\\-104.4922\\-281.1037\\17\\-106.4453\\-279.923\\17\\-108.3984\\-278.928\\17\\-110.3516\\-277.5659\\17\\-114.2578\\-275.3604\\17\\-118.1641\\-272.6849\\17\\-121.0469\\-270.5703\\17\\-122.0703\\-269.7117\\17\\-125.9766\\-266.7918\\17\\-128.3906\\-264.7109\\17\\-131.8359\\-261.5596\\17\\-134.4206\\-258.8516\\17\\-136.098\\-256.8984\\17\\-137.6953\\-254.8853\\17\\-139.0788\\-252.9922\\17\\-140.6544\\-251.0391\\17\\-142.1137\\-249.0859\\17\\-143.0698\\-247.1328\\17\\-143.5547\\-246.4848\\17\\-145.5155\\-243.2266\\17\\-147.6819\\-239.3203\\17\\-149.2233\\-235.4141\\17\\-150.1073\\-233.4609\\17\\-150.5802\\-231.5078\\17\\-152.1244\\-227.6016\\17\\-152.6306\\-225.6484\\17\\-153.3869\\-223.6953\\17\\-153.9994\\-221.7422\\17\\-154.8387\\-217.8359\\17\\-155.4462\\-215.8828\\17\\-155.9182\\-213.9297\\17\\-156.1977\\-211.9766\\17\\-156.6431\\-208.0703\\17\\-157.0152\\-206.1172\\17\\-157.4857\\-204.1641\\17\\-157.7648\\-202.2109\\17\\-158.0643\\-198.3047\\17\\-158.2508\\-194.3984\\17\\-158.3775\\-188.5391\\17\\-158.3003\\-180.7266\\17\\-158.1036\\-174.8672\\17\\-157.8189\\-170.9609\\17\\-157.6036\\-169.0078\\17\\-156.7319\\-165.1016\\17\\-156.0289\\-159.2422\\17\\-155.6792\\-157.2891\\17\\-155.0737\\-155.3359\\17\\-154.5681\\-153.3828\\17\\-153.6586\\-149.4766\\17\\-152.8633\\-147.5234\\17\\-151.6732\\-143.6172\\17\\-150.7507\\-141.6641\\17\\-150.27\\-139.7109\\17\\-149.6452\\-137.7578\\17\\-148.7736\\-135.8047\\17\\-148.2191\\-133.8516\\17\\-147.4609\\-132.1077\\17\\-145.56\\-127.9922\\17\\-144.5483\\-126.0391\\17\\-143.7396\\-124.0859\\17\\-142.7378\\-122.1328\\17\\-142.0831\\-120.1797\\17\\-140.9525\\-118.2266\\17\\-140.1149\\-116.2734\\17\\-138.8307\\-114.3203\\17\\-136.6766\\-110.4141\\17\\-135.7422\\-108.522\\17\\-134.5952\\-106.5078\\17\\-133.2505\\-104.5547\\17\\-130.2517\\-100.6484\\17\\-128.5685\\-98.69531\\17\\-125.9766\\-96.14806\\17\\-124.0234\\-94.45579\\17\\-118.1641\\-90.22147\\17\\-116.1244\\-88.92969\\17\\-112.3047\\-86.90569\\17\\-108.3984\\-85.33681\\17\\-106.4453\\-84.34544\\17\\-104.4922\\-83.60237\\17\\-102.5391\\-82.68111\\17\\-98.63281\\-81.60196\\17\\-96.67969\\-80.65642\\17\\-94.72656\\-80.25986\\17\\-92.77344\\-79.49471\\17\\-90.82031\\-78.96462\\17\\-88.86719\\-78.28783\\17\\-86.91406\\-77.74424\\17\\-81.05469\\-76.395\\17\\-77.14844\\-75.99175\\17\\-75.19531\\-75.7263\\17\\-73.24219\\-74.9592\\17\\-71.28906\\-74.66064\\17\\-67.38281\\-74.3783\\17\\-63.47656\\-74.22894\\17\\-59.57031\\-73.16925\\17\\-57.61719\\-73.0456\\17\\-55.66406\\-73.19618\\17\\-53.71094\\-73.10525\\17\\-51.75781\\-72.90796\\17\\-47.85156\\-72.87\\17\\-45.89844\\-73.69698\\17\\-43.94531\\-74.25786\\17\\-40.03906\\-74.45247\\17\\-38.08594\\-74.63253\\17\\-36.13281\\-74.9567\\17\\-34.17969\\-75.73626\\17\\-28.32031\\-76.52487\\17\\-24.41406\\-77.66117\\17\\-20.50781\\-78.67578\\17\\-18.55469\\-79.42975\\17\\-14.64844\\-80.5638\\17\\-12.69531\\-81.56626\\17\\-10.74219\\-82.298\\17\\-8.789063\\-83.49461\\17\\-5.769428\\-85.02344\\17\\-2.929688\\-86.53744\\17\\-0.9765625\\-87.44982\\17\\0.9765625\\-87.95313\\17\\2.929688\\-87.81628\\17\\6.835938\\-85.85602\\17\\8.789063\\-84.53516\\17\\10.74219\\-83.43481\\17\\12.69531\\-82.17034\\17\\14.76258\\-81.11719\\17\\18.55469\\-79.45259\\17\\20.50781\\-78.4226\\17\\22.46094\\-77.72721\\17\\24.41406\\-76.85643\\17\\26.36719\\-76.27605\\17\\30.27344\\-75.54586\\17\\32.22656\\-74.73363\\17\\34.17969\\-74.51897\\17\\38.08594\\-74.26969\\17\\40.03906\\-73.90958\\17\\41.99219\\-73.06896\\17\\45.89844\\-72.84272\\17\\53.71094\\-72.79937\\17\\57.61719\\-72.83385\\17\\61.52344\\-73.02286\\17\\63.47656\\-73.4628\\17\\65.42969\\-74.21191\\17\\67.38281\\-74.26381\\17\\71.28906\\-74.48286\\17\\75.19531\\-74.84465\\17\\77.14844\\-75.38853\\17\\79.10156\\-75.82027\\17\\84.96094\\-76.52615\\17\\86.91406\\-76.96001\\17\\88.86719\\-77.5583\\17\\90.82031\\-77.97948\\17\\94.72656\\-79.11188\\17\\96.67969\\-79.82149\\17\\98.63281\\-80.28949\\17\\100.5859\\-80.85825\\17\\102.5391\\-81.72266\\17\\104.4922\\-82.24445\\17\\106.4453\\-82.98831\\17\\108.3984\\-83.90493\\17\\110.3516\\-84.69791\\17\\112.3047\\-85.77968\\17\\114.2578\\-86.5953\\17\\118.1641\\-88.85705\\17\\120.1172\\-90.18694\\17\\123.2084\\-92.83594\\17\\125.9766\\-95.68132\\17\\128.5384\\-98.69531\\17\\130.9838\\-102.6016\\17\\132.354\\-104.5547\\17\\133.4683\\-106.5078\\17\\134.7114\\-108.4609\\17\\135.7822\\-110.4141\\17\\137.6703\\-114.3203\\17\\139.7453\\-118.2266\\17\\141.6409\\-122.1328\\17\\142.4515\\-124.0859\\17\\143.0166\\-126.0391\\17\\144.0176\\-127.9922\\17\\144.6109\\-129.9453\\17\\146.3117\\-133.8516\\17\\146.9727\\-135.8047\\17\\147.8738\\-137.7578\\17\\148.8664\\-141.6641\\17\\149.5882\\-143.6172\\17\\150.1346\\-145.5703\\17\\150.8853\\-149.4766\\17\\151.6147\\-151.4297\\17\\152.0919\\-153.3828\\17\\152.7581\\-157.2891\\17\\153.7195\\-161.1953\\17\\153.9951\\-163.1484\\17\\155.0221\\-172.9141\\17\\155.2813\\-174.8672\\17\\155.6242\\-178.7734\\17\\155.8846\\-184.6328\\17\\155.9719\\-192.4453\\17\\155.8846\\-200.2578\\17\\155.7419\\-204.1641\\17\\155.457\\-208.0703\\17\\153.9695\\-219.7891\\17\\153.556\\-221.7422\\17\\152.8662\\-223.6953\\17\\151.8555\\-227.6016\\17\\150.9221\\-229.5547\\17\\150.3389\\-231.5078\\17\\149.5895\\-233.4609\\17\\148.594\\-235.4141\\17\\147.7553\\-237.3672\\17\\147.4609\\-237.7559\\17\\144.1136\\-243.2266\\17\\141.6016\\-246.7551\\17\\139.7945\\-249.0859\\17\\137.6953\\-251.3591\\17\\136.317\\-252.9922\\17\\134.4896\\-254.9453\\17\\132.3594\\-256.8984\\17\\127.9297\\-261.0738\\17\\125.9766\\-262.4929\\17\\124.0234\\-264.0124\\17\\120.1172\\-267.2798\\17\\116.2109\\-269.8227\\17\\114.2578\\-271.2424\\17\\110.3516\\-273.6843\\17\\108.3984\\-275.0183\\17\\106.4453\\-275.8024\\17\\104.4922\\-276.9701\\17\\102.5391\\-277.7505\\17\\100.5859\\-278.9266\\17\\98.63281\\-279.679\\17\\96.67969\\-280.7172\\17\\92.77344\\-281.8998\\17\\90.82031\\-282.7006\\17\\86.91406\\-283.585\\17\\83.00781\\-284.8462\\17\\79.10156\\-285.5658\\17\\75.19531\\-286.5996\\17\\69.33594\\-287.4175\\17\\67.38281\\-287.7299\\17\\63.47656\\-288.6037\\17\\61.52344\\-288.8824\\17\\57.61719\\-289.3285\\17\\55.66406\\-289.6755\\17\\53.71094\\-290.3758\\17\\51.75781\\-290.8539\\17\\49.80469\\-291.1797\\17\\47.85156\\-291.6555\\17\\45.89844\\-292.4217\\17\\41.99219\\-293.301\\17\\38.08594\\-294.5365\\17\\32.22656\\-295.5158\\17\\30.27344\\-296.1324\\17\\28.32031\\-296.6178\\17\\24.41406\\-297.1682\\17\\22.46094\\-297.5325\\17\\20.50781\\-298.1135\\17\\18.55469\\-298.4989\\17\\16.60156\\-298.7342\\17\\6.835938\\-299.7266\\17\\2.929688\\-300.0288\\17\\-0.9765625\\-300.0542\\17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "300" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "135" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-299.8899\\19\\-16.60156\\-298.9535\\19\\-20.50781\\-298.6037\\19\\-22.46094\\-298.367\\19\\-24.41406\\-297.9948\\19\\-26.36719\\-297.5247\\19\\-28.32031\\-297.2283\\19\\-34.17969\\-296.5743\\19\\-36.13281\\-296.1996\\19\\-38.08594\\-295.6588\\19\\-40.03906\\-295.3287\\19\\-45.89844\\-294.6249\\19\\-47.85156\\-294.2705\\19\\-49.80469\\-293.7109\\19\\-51.75781\\-293.3019\\19\\-57.61719\\-292.4012\\19\\-59.57031\\-291.8309\\19\\-61.52344\\-291.4196\\19\\-63.47656\\-291.1734\\19\\-67.38281\\-290.7852\\19\\-69.33594\\-290.4934\\19\\-73.24219\\-289.6295\\19\\-75.19531\\-289.3662\\19\\-79.10156\\-288.9999\\19\\-81.05469\\-288.7331\\19\\-83.00781\\-288.2771\\19\\-84.96094\\-287.6763\\19\\-88.86719\\-286.8183\\19\\-92.77344\\-285.4066\\19\\-94.72656\\-284.8546\\19\\-96.67969\\-283.8613\\19\\-100.5859\\-282.5607\\19\\-102.5391\\-281.5519\\19\\-104.4922\\-280.7872\\19\\-106.4453\\-279.5468\\19\\-108.3984\\-278.4775\\19\\-111.7149\\-276.4297\\19\\-112.3047\\-276.0011\\19\\-114.2578\\-275.0638\\19\\-118.1641\\-272.1154\\19\\-122.0703\\-269.418\\19\\-124.0234\\-267.8584\\19\\-127.8212\\-264.7109\\19\\-131.8359\\-261.1454\\19\\-134.0296\\-258.8516\\19\\-135.7422\\-256.8697\\19\\-138.7684\\-252.9922\\19\\-140.414\\-251.0391\\19\\-141.8092\\-249.0859\\19\\-142.8192\\-247.1328\\19\\-144.158\\-245.1797\\19\\-145.1021\\-243.2266\\19\\-146.3692\\-241.2734\\19\\-148.2937\\-237.3672\\19\\-148.9224\\-235.4141\\19\\-149.8857\\-233.4609\\19\\-150.9564\\-229.5547\\19\\-151.8869\\-227.6016\\19\\-152.9926\\-223.6953\\19\\-153.7724\\-221.7422\\19\\-154.5964\\-217.8359\\19\\-155.0885\\-215.8828\\19\\-155.7007\\-213.9297\\19\\-156.0438\\-211.9766\\19\\-156.6945\\-206.1172\\19\\-157.4623\\-202.2109\\19\\-157.7234\\-200.2578\\19\\-158.0049\\-196.3516\\19\\-158.0805\\-194.3984\\19\\-158.2079\\-188.5391\\19\\-158.1699\\-182.6797\\19\\-158.0697\\-178.7734\\19\\-157.9198\\-174.8672\\19\\-157.5627\\-170.9609\\19\\-156.7874\\-167.0547\\19\\-156.5073\\-165.1016\\19\\-156.1114\\-161.1953\\19\\-155.8174\\-159.2422\\19\\-154.7625\\-155.3359\\19\\-153.935\\-151.4297\\19\\-152.5687\\-147.5234\\19\\-152.0491\\-145.5703\\19\\-150.5374\\-141.6641\\19\\-150.0835\\-139.7109\\19\\-149.2668\\-137.7578\\19\\-147.9965\\-133.8516\\19\\-146.9884\\-131.8984\\19\\-146.2185\\-129.9453\\19\\-145.1239\\-127.9922\\19\\-144.3394\\-126.0391\\19\\-143.3087\\-124.0859\\19\\-141.7757\\-120.1797\\19\\-139.7569\\-116.2734\\19\\-137.6953\\-112.7871\\19\\-137.3796\\-112.3672\\19\\-136.5122\\-110.4141\\19\\-135.3443\\-108.4609\\19\\-134.3076\\-106.5078\\19\\-131.8359\\-103.0989\\19\\-129.9079\\-100.6484\\19\\-128.1795\\-98.69531\\19\\-125.9766\\-96.48035\\19\\-123.9551\\-94.78906\\19\\-121.4164\\-92.83594\\19\\-120.1172\\-91.95407\\19\\-118.1641\\-90.44955\\19\\-116.2109\\-89.34721\\19\\-114.2578\\-88.09541\\19\\-112.3047\\-87.28694\\19\\-110.3516\\-86.29804\\19\\-108.3984\\-85.60809\\19\\-106.4453\\-84.62393\\19\\-100.5859\\-82.24496\\19\\-98.63281\\-81.77487\\19\\-96.67969\\-80.88251\\19\\-94.72656\\-80.34186\\19\\-92.77344\\-79.64133\\19\\-90.82031\\-79.1265\\19\\-86.91406\\-77.87336\\19\\-84.96094\\-77.53878\\19\\-83.00781\\-77.08887\\19\\-81.05469\\-76.5313\\19\\-75.19531\\-75.80951\\19\\-71.28906\\-74.73649\\19\\-65.42969\\-74.3355\\19\\-61.52344\\-74.20035\\19\\-57.61719\\-73.67397\\19\\-55.66406\\-73.9255\\19\\-53.71094\\-73.82301\\19\\-51.75781\\-73.09299\\19\\-49.80469\\-72.89829\\19\\-48.127\\-73.30469\\19\\-45.89844\\-74.06866\\19\\-43.94531\\-74.2872\\19\\-40.03906\\-74.50409\\19\\-38.08594\\-74.70712\\19\\-36.13281\\-75.37407\\19\\-34.17969\\-75.79107\\19\\-28.32031\\-76.56203\\19\\-24.41406\\-77.71477\\19\\-22.46094\\-78.16543\\19\\-20.50781\\-78.72017\\19\\-18.55469\\-79.48251\\19\\-14.64844\\-80.59592\\19\\-12.69531\\-81.57385\\19\\-10.74219\\-82.29033\\19\\-8.789063\\-83.43481\\19\\-5.529626\\-85.02344\\19\\-2.929688\\-86.46623\\19\\-0.9765625\\-87.29183\\19\\0.9765625\\-87.80192\\19\\2.929688\\-87.67318\\19\\6.835938\\-85.83828\\19\\8.789063\\-84.53516\\19\\10.74219\\-83.47323\\19\\12.69531\\-82.21423\\19\\16.60156\\-80.33234\\19\\18.55469\\-79.49448\\19\\20.50781\\-78.48232\\19\\22.46094\\-77.79077\\19\\24.41406\\-76.9389\\19\\26.36719\\-76.32369\\19\\30.27344\\-75.60855\\19\\32.22656\\-74.81799\\19\\34.17969\\-74.57818\\19\\38.08594\\-74.30464\\19\\40.03906\\-74.22955\\19\\43.94531\\-73.6469\\19\\45.89844\\-72.87931\\19\\53.71094\\-72.82507\\19\\57.61719\\-72.86079\\19\\59.57031\\-73.57259\\19\\61.52344\\-73.88631\\19\\63.47656\\-74.01676\\19\\65.42969\\-74.26381\\19\\67.38281\\-74.3286\\19\\71.28906\\-74.5612\\19\\75.19531\\-74.97765\\19\\77.14844\\-75.63081\\19\\79.10156\\-75.91878\\19\\83.00781\\-76.3665\\19\\84.96094\\-76.65734\\19\\88.86719\\-77.70844\\19\\90.82031\\-78.08349\\19\\92.77344\\-78.64848\\19\\96.67969\\-79.95142\\19\\98.63281\\-80.40751\\19\\100.5859\\-81.06069\\19\\102.5391\\-81.8527\\19\\104.4922\\-82.36399\\19\\108.3984\\-84.09625\\19\\112.3047\\-85.96574\\19\\114.2578\\-86.83273\\19\\117.842\\-88.92969\\19\\120.1172\\-90.43162\\19\\122.9425\\-92.83594\\19\\125.9766\\-95.98264\\19\\128.2307\\-98.69531\\19\\129.4383\\-100.6484\\19\\132.0537\\-104.5547\\19\\133.1568\\-106.5078\\19\\134.4831\\-108.4609\\19\\135.4072\\-110.4141\\19\\136.5247\\-112.3672\\19\\137.2808\\-114.3203\\19\\138.433\\-116.2734\\19\\139.305\\-118.2266\\19\\140.453\\-120.1797\\19\\141.2446\\-122.1328\\19\\142.2589\\-124.0859\\19\\142.8145\\-126.0391\\19\\143.6834\\-127.9922\\19\\144.4198\\-129.9453\\19\\145.0291\\-131.8984\\19\\146.0432\\-133.8516\\19\\146.692\\-135.8047\\19\\147.5143\\-137.7578\\19\\148.1978\\-139.7109\\19\\148.6366\\-141.6641\\19\\149.183\\-143.6172\\19\\149.9089\\-145.5703\\19\\150.6376\\-149.4766\\19\\151.1704\\-151.4297\\19\\151.8409\\-153.3828\\19\\152.8884\\-159.2422\\19\\153.4151\\-161.1953\\19\\153.7879\\-163.1484\\19\\154.4211\\-169.0078\\19\\154.7659\\-172.9141\\19\\155.3426\\-178.7734\\19\\155.6013\\-182.6797\\19\\155.735\\-186.5859\\19\\155.7912\\-190.4922\\19\\155.7815\\-194.3984\\19\\155.6627\\-200.2578\\19\\155.4717\\-204.1641\\19\\155.102\\-208.0703\\19\\154.2694\\-215.8828\\19\\153.7122\\-219.7891\\19\\152.577\\-223.6953\\19\\152.1371\\-225.6484\\19\\151.4893\\-227.6016\\19\\150.6392\\-229.5547\\19\\150.1237\\-231.5078\\19\\149.1298\\-233.4609\\19\\148.3515\\-235.4141\\19\\146.207\\-239.3203\\19\\144.8217\\-241.2734\\19\\143.6844\\-243.2266\\19\\142.4208\\-245.1797\\19\\139.6484\\-248.5755\\19\\137.4151\\-251.0391\\19\\135.7507\\-252.9922\\19\\133.7891\\-255.1134\\19\\131.8359\\-256.7743\\19\\127.5276\\-260.8047\\19\\125.0895\\-262.7578\\19\\122.7679\\-264.7109\\19\\120.1172\\-266.7473\\19\\118.1641\\-268.0259\\19\\114.2578\\-270.7973\\19\\112.3047\\-271.8784\\19\\110.3516\\-273.3108\\19\\108.3984\\-274.4847\\19\\106.4453\\-275.484\\19\\100.5859\\-278.2828\\19\\98.63281\\-279.2661\\19\\96.67969\\-280.058\\19\\94.72656\\-280.9646\\19\\92.77344\\-281.467\\19\\90.82031\\-282.0695\\19\\88.86719\\-282.8139\\19\\84.96094\\-283.5974\\19\\81.05469\\-284.7911\\19\\77.14844\\-285.5002\\19\\73.24219\\-286.4922\\19\\71.28906\\-286.8369\\19\\67.38281\\-287.403\\19\\65.42969\\-287.778\\19\\63.47656\\-288.2901\\19\\59.57031\\-289.0052\\19\\55.66406\\-289.5217\\19\\53.71094\\-290.2109\\19\\51.75781\\-290.7991\\19\\49.80469\\-291.1455\\19\\47.85156\\-291.6146\\19\\45.89844\\-292.4115\\19\\41.99219\\-293.322\\19\\38.08594\\-294.5703\\19\\32.22656\\-295.5717\\19\\30.27344\\-296.2266\\19\\28.32031\\-296.6778\\19\\24.41406\\-297.2354\\19\\22.46094\\-297.656\\19\\20.50781\\-298.2396\\19\\18.55469\\-298.5804\\19\\6.835938\\-299.8748\\19\\2.929688\\-300.1377\\19\\-0.9765625\\-300.1602\\19\\-4.882813\\-300.0288\\19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "316" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "136" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-299.8436\\21\\-12.69531\\-299.403\\21\\-20.50781\\-298.6453\\21\\-22.46094\\-298.4194\\21\\-24.41406\\-298.0757\\21\\-26.36719\\-297.5775\\21\\-28.32031\\-297.2538\\21\\-34.17969\\-296.6022\\21\\-36.13281\\-296.2369\\21\\-38.08594\\-295.685\\21\\-40.03906\\-295.3246\\21\\-45.89844\\-294.6046\\21\\-47.85156\\-294.2225\\21\\-49.80469\\-293.6568\\21\\-51.75781\\-293.2506\\21\\-55.66406\\-292.6617\\21\\-57.61719\\-292.2417\\21\\-59.57031\\-291.6458\\21\\-61.52344\\-291.3023\\21\\-67.38281\\-290.5691\\21\\-71.28906\\-289.6727\\21\\-73.24219\\-289.3929\\21\\-77.14844\\-289.0105\\21\\-79.10156\\-288.7635\\21\\-81.05469\\-288.3744\\21\\-83.00781\\-287.7755\\21\\-86.91406\\-286.9345\\21\\-88.86719\\-286.4445\\21\\-90.82031\\-285.6212\\21\\-92.77344\\-285.0785\\21\\-94.72656\\-284.3908\\21\\-96.67969\\-283.4979\\21\\-98.63281\\-282.9714\\21\\-100.5859\\-282.0321\\21\\-102.5391\\-281.2703\\21\\-104.4551\\-280.3359\\21\\-107.8161\\-278.3828\\21\\-108.3984\\-277.942\\21\\-110.3516\\-276.9737\\21\\-112.3047\\-275.6829\\21\\-114.2578\\-274.6343\\21\\-116.2109\\-273.296\\21\\-118.1641\\-271.6872\\21\\-120.1172\\-270.2159\\21\\-122.0703\\-269.0839\\21\\-129.5776\\-262.7578\\21\\-131.8359\\-260.6221\\21\\-135.7422\\-256.4231\\21\\-137.6953\\-254.0284\\21\\-139.6484\\-251.4998\\21\\-140.106\\-251.0391\\21\\-141.6016\\-248.8196\\21\\-143.8448\\-245.1797\\21\\-144.7905\\-243.2266\\21\\-146.088\\-241.2734\\21\\-146.9727\\-239.3203\\21\\-148.0767\\-237.3672\\21\\-148.6816\\-235.4141\\21\\-149.5602\\-233.4609\\21\\-150.2337\\-231.5078\\21\\-150.6824\\-229.5547\\21\\-151.5542\\-227.6016\\21\\-152.1741\\-225.6484\\21\\-152.6827\\-223.6953\\21\\-153.4557\\-221.7422\\21\\-153.9955\\-219.7891\\21\\-154.7852\\-215.8828\\21\\-155.3879\\-213.9297\\21\\-155.8581\\-211.9766\\21\\-156.125\\-210.0234\\21\\-156.4883\\-206.1172\\21\\-157.043\\-202.2109\\21\\-157.426\\-200.2578\\21\\-157.8189\\-196.3516\\21\\-157.9097\\-194.3984\\21\\-158.0412\\-188.5391\\21\\-158.0049\\-182.6797\\21\\-157.8963\\-178.7734\\21\\-157.6885\\-174.8672\\21\\-157.4857\\-172.9141\\21\\-156.7977\\-169.0078\\21\\-156.5341\\-167.0547\\21\\-156.1607\\-163.1484\\21\\-155.9139\\-161.1953\\21\\-155.5411\\-159.2422\\21\\-154.9292\\-157.2891\\21\\-154.1249\\-153.3828\\21\\-153.6523\\-151.4297\\21\\-152.8911\\-149.4766\\21\\-151.791\\-145.5703\\21\\-150.8853\\-143.6172\\21\\-149.8336\\-139.7109\\21\\-148.9533\\-137.7578\\21\\-148.3963\\-135.8047\\21\\-147.7209\\-133.8516\\21\\-146.7172\\-131.8984\\21\\-145.9506\\-129.9453\\21\\-144.8195\\-127.9922\\21\\-144.0993\\-126.0391\\21\\-142.9938\\-124.0859\\21\\-142.3791\\-122.1328\\21\\-141.3902\\-120.1797\\21\\-140.5234\\-118.2266\\21\\-139.3345\\-116.2734\\21\\-138.3523\\-114.3203\\21\\-137.0949\\-112.3672\\21\\-136.3107\\-110.4141\\21\\-135.0579\\-108.4609\\21\\-133.9844\\-106.5078\\21\\-131.8359\\-103.5244\\21\\-129.8828\\-100.9613\\21\\-127.8869\\-98.69531\\21\\-125.9766\\-96.81796\\21\\-123.6273\\-94.78906\\21\\-121.0586\\-92.83594\\21\\-120.1172\\-92.23193\\21\\-118.1641\\-90.72134\\21\\-116.2109\\-89.60876\\21\\-114.2578\\-88.23599\\21\\-112.3047\\-87.54903\\21\\-110.3516\\-86.53146\\21\\-108.3984\\-85.82732\\21\\-106.4453\\-84.9133\\21\\-104.4922\\-84.09798\\21\\-102.5391\\-83.39584\\21\\-100.5859\\-82.4388\\21\\-98.63281\\-81.94977\\21\\-94.72656\\-80.45163\\21\\-92.77344\\-79.94146\\21\\-88.86719\\-78.72017\\21\\-86.91406\\-78.00742\\21\\-84.96094\\-77.71224\\21\\-83.00781\\-77.29486\\21\\-81.05469\\-76.72908\\21\\-79.10156\\-76.36459\\21\\-75.19531\\-75.88207\\21\\-73.24219\\-75.55222\\21\\-71.28906\\-74.83154\\21\\-69.33594\\-74.64658\\21\\-65.42969\\-74.39868\\21\\-57.61719\\-74.14087\\21\\-55.66406\\-74.21191\\21\\-53.71094\\-74.16288\\21\\-51.75781\\-73.87616\\21\\-49.80469\\-73.70016\\21\\-47.85156\\-74.08977\\21\\-45.89844\\-74.2636\\21\\-41.99219\\-74.41986\\21\\-38.08594\\-74.79242\\21\\-36.13281\\-75.60855\\21\\-30.27344\\-76.31825\\21\\-28.32031\\-76.61452\\21\\-24.41406\\-77.77155\\21\\-22.46094\\-78.2206\\21\\-20.50781\\-78.76733\\21\\-18.55469\\-79.53967\\21\\-14.64844\\-80.62891\\21\\-12.69531\\-81.59508\\21\\-10.74219\\-82.28036\\21\\-8.789063\\-83.3746\\21\\-5.234375\\-85.02344\\21\\-2.929688\\-86.33515\\21\\-0.9765625\\-87.00204\\21\\0.9765625\\-87.50349\\21\\2.929688\\-87.42894\\21\\6.835938\\-85.82803\\21\\8.789063\\-84.54382\\21\\10.74219\\-83.50213\\21\\12.69531\\-82.27247\\21\\14.64844\\-81.39729\\21\\16.60156\\-80.37866\\21\\18.55469\\-79.55032\\21\\20.50781\\-78.53627\\21\\22.46094\\-77.85595\\21\\24.41406\\-77.01417\\21\\26.36719\\-76.37302\\21\\30.27344\\-75.67921\\21\\32.22656\\-74.90625\\21\\34.17969\\-74.63636\\21\\38.08594\\-74.33484\\21\\41.99219\\-74.22346\\21\\43.94531\\-74.09464\\21\\45.89844\\-73.67711\\21\\47.85156\\-72.9686\\21\\49.80469\\-72.87\\21\\53.71094\\-72.86079\\21\\55.66406\\-73.644\\21\\57.61719\\-73.6636\\21\\59.57031\\-74.0593\\21\\61.52344\\-74.21272\\21\\65.42969\\-74.31066\\21\\69.33594\\-74.49826\\21\\73.24219\\-74.85967\\21\\77.14844\\-75.81496\\21\\83.00781\\-76.46661\\21\\84.96094\\-76.83227\\21\\86.91406\\-77.40063\\21\\90.82031\\-78.25524\\21\\92.77344\\-78.80836\\21\\94.72656\\-79.51334\\21\\98.63281\\-80.53253\\21\\100.5859\\-81.32159\\21\\104.4922\\-82.5313\\21\\106.4453\\-83.51362\\21\\108.3984\\-84.2786\\21\\110.3516\\-85.34188\\21\\112.3047\\-86.14848\\21\\116.2109\\-88.08804\\21\\120.1172\\-90.76074\\21\\122.5701\\-92.83594\\21\\124.0234\\-94.27789\\21\\126.2999\\-96.74219\\21\\127.9297\\-98.8418\\21\\130.5147\\-102.6016\\21\\131.8359\\-104.8403\\21\\134.2076\\-108.4609\\21\\135.1318\\-110.4141\\21\\136.2974\\-112.3672\\21\\137.0124\\-114.3203\\21\\138.1718\\-116.2734\\21\\138.9878\\-118.2266\\21\\140.2141\\-120.1797\\21\\140.9683\\-122.1328\\21\\142.0259\\-124.0859\\21\\143.281\\-127.9922\\21\\144.2153\\-129.9453\\21\\144.7458\\-131.8984\\21\\145.6706\\-133.8516\\21\\146.4472\\-135.8047\\21\\147.1112\\-137.7578\\21\\147.9524\\-139.7109\\21\\148.8857\\-143.6172\\21\\149.6033\\-145.5703\\21\\150.1465\\-147.5234\\21\\150.8295\\-151.4297\\21\\151.5026\\-153.3828\\21\\151.9843\\-155.3359\\21\\152.6204\\-159.2422\\21\\153.0193\\-161.1953\\21\\153.532\\-163.1484\\21\\153.8346\\-165.1016\\21\\154.2429\\-169.0078\\21\\154.7253\\-174.8672\\21\\155.1735\\-180.7266\\21\\155.43\\-184.6328\\21\\155.5657\\-190.4922\\21\\155.4994\\-196.3516\\21\\155.3726\\-200.2578\\21\\155.1157\\-204.1641\\21\\154.6326\\-210.0234\\21\\154.0677\\-215.8828\\21\\153.7907\\-217.8359\\21\\153.3725\\-219.7891\\21\\152.7903\\-221.7422\\21\\151.8899\\-225.6484\\21\\151.0302\\-227.6016\\21\\149.8443\\-231.5078\\21\\148.8126\\-233.4609\\21\\148.1014\\-235.4141\\21\\146.8966\\-237.3672\\21\\145.8378\\-239.3203\\21\\142.0364\\-245.1797\\21\\140.5105\\-247.1328\\21\\137.6953\\-250.2954\\21\\133.7891\\-254.4906\\21\\131.1406\\-256.8984\\21\\129.1344\\-258.8516\\21\\125.9766\\-261.6836\\21\\122.0703\\-264.7187\\21\\120.1172\\-266.1332\\21\\116.2109\\-269.0729\\21\\114.2578\\-270.1869\\21\\113.7873\\-270.5703\\21\\110.7641\\-272.5234\\21\\110.3516\\-272.8628\\21\\108.3984\\-273.9249\\21\\106.4453\\-275.1468\\21\\104.4922\\-275.8939\\21\\102.5391\\-276.9941\\21\\100.5859\\-277.698\\21\\98.63281\\-278.7977\\21\\96.67969\\-279.5096\\21\\94.72656\\-280.4186\\21\\92.77344\\-281.0894\\21\\90.82031\\-281.5771\\21\\86.91406\\-282.8405\\21\\83.00781\\-283.5727\\21\\79.10156\\-284.7184\\21\\73.24219\\-285.8456\\21\\71.28906\\-286.4223\\21\\69.33594\\-286.8259\\21\\65.42969\\-287.4601\\21\\63.47656\\-287.8971\\21\\61.52344\\-288.474\\21\\59.57031\\-288.8748\\21\\55.66406\\-289.4057\\21\\53.71094\\-290.0163\\21\\51.75781\\-290.7293\\21\\47.85156\\-291.5664\\21\\45.89844\\-292.4012\\21\\41.99219\\-293.3292\\21\\38.08594\\-294.579\\21\\34.17969\\-295.2254\\21\\32.22656\\-295.6216\\21\\30.27344\\-296.2865\\21\\28.32031\\-296.7168\\21\\24.41406\\-297.303\\21\\22.46094\\-297.7735\\21\\20.50781\\-298.3579\\21\\18.55469\\-298.6514\\21\\12.69531\\-299.315\\21\\6.835938\\-300.0288\\21\\4.882813\\-300.149\\21\\0.9765625\\-300.2342\\21\\-2.929688\\-300.2033\\21\\-4.882813\\-300.1377\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "293" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "137" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-299.9619\\23\\-12.69531\\-299.4828\\23\\-22.46094\\-298.4603\\23\\-24.41406\\-298.1258\\23\\-26.36719\\-297.6224\\23\\-28.32031\\-297.2798\\23\\-34.17969\\-296.6178\\23\\-36.13281\\-296.249\\23\\-38.08594\\-295.7096\\23\\-40.03906\\-295.3287\\23\\-45.89844\\-294.584\\23\\-47.85156\\-294.1706\\23\\-49.80469\\-293.584\\23\\-51.75781\\-293.1949\\23\\-55.66406\\-292.5766\\23\\-59.57031\\-291.4991\\23\\-61.52344\\-291.1924\\23\\-65.42969\\-290.6929\\23\\-67.38281\\-290.2772\\23\\-69.33594\\-289.7421\\23\\-71.28906\\-289.4366\\23\\-75.19531\\-289.054\\23\\-79.10156\\-288.4505\\23\\-83.00781\\-287.4175\\23\\-86.91406\\-286.6094\\23\\-88.86719\\-285.8588\\23\\-92.77344\\-284.7334\\23\\-94.72656\\-283.8001\\23\\-98.63281\\-282.6266\\23\\-100.5859\\-281.674\\23\\-102.5391\\-280.9931\\23\\-104.4922\\-279.8509\\23\\-106.4453\\-278.8889\\23\\-108.3984\\-277.5909\\23\\-110.3516\\-276.5746\\23\\-112.3047\\-275.4218\\23\\-116.2109\\-272.9017\\23\\-120.1172\\-269.8101\\23\\-122.0703\\-268.6256\\23\\-124.0234\\-267.1274\\23\\-124.4834\\-266.6641\\23\\-126.8584\\-264.7109\\23\\-129.8828\\-262.0655\\23\\-131.8359\\-260.1469\\23\\-134.9788\\-256.8984\\23\\-137.6953\\-253.6143\\23\\-139.6484\\-251.0299\\23\\-142.436\\-247.1328\\23\\-143.4051\\-245.1797\\23\\-145.7669\\-241.2734\\23\\-146.6944\\-239.3203\\23\\-147.7979\\-237.3672\\23\\-149.1718\\-233.4609\\23\\-150.0423\\-231.5078\\23\\-150.4922\\-229.5547\\23\\-151.1054\\-227.6016\\23\\-151.9531\\-225.6484\\23\\-152.433\\-223.6953\\23\\-153.0307\\-221.7422\\23\\-153.7537\\-219.7891\\23\\-154.5529\\-215.8828\\23\\-155.0184\\-213.9297\\23\\-155.5919\\-211.9766\\23\\-155.9639\\-210.0234\\23\\-156.1853\\-208.0703\\23\\-156.7162\\-202.2109\\23\\-157.5834\\-196.3516\\23\\-157.7807\\-192.4453\\23\\-157.8621\\-188.5391\\23\\-157.8621\\-184.6328\\23\\-157.7648\\-180.7266\\23\\-157.5521\\-176.8203\\23\\-157.3486\\-174.8672\\23\\-156.5341\\-169.0078\\23\\-156.1971\\-165.1016\\23\\-155.9763\\-163.1484\\23\\-155.6544\\-161.1953\\23\\-154.6537\\-157.2891\\23\\-153.9074\\-153.3828\\23\\-152.5987\\-149.4766\\23\\-152.118\\-147.5234\\23\\-151.4338\\-145.5703\\23\\-150.6261\\-143.6172\\23\\-150.1918\\-141.6641\\23\\-148.7229\\-137.7578\\23\\-148.2053\\-135.8047\\23\\-146.4789\\-131.8984\\23\\-144.5975\\-127.9922\\23\\-143.8184\\-126.0391\\23\\-142.7896\\-124.0859\\23\\-142.181\\-122.1328\\23\\-141.0812\\-120.1797\\23\\-140.2779\\-118.2266\\23\\-139.0198\\-116.2734\\23\\-138.0744\\-114.3203\\23\\-136.8878\\-112.3672\\23\\-136.0556\\-110.4141\\23\\-133.7891\\-106.8059\\23\\-132.2331\\-104.5547\\23\\-129.8828\\-101.3394\\23\\-127.5595\\-98.69531\\23\\-124.0234\\-95.3985\\23\\-123.2798\\-94.78906\\23\\-118.0099\\-90.88281\\23\\-116.2109\\-89.79429\\23\\-114.2578\\-88.3831\\23\\-112.3047\\-87.70737\\23\\-110.3516\\-86.76363\\23\\-106.4453\\-85.26215\\23\\-104.4922\\-84.30654\\23\\-102.5391\\-83.63634\\23\\-100.5859\\-82.65663\\23\\-96.67969\\-81.46229\\23\\-94.72656\\-80.59592\\23\\-92.77344\\-80.15247\\23\\-88.86719\\-78.88223\\23\\-84.96094\\-77.83006\\23\\-83.00781\\-77.46903\\23\\-81.05469\\-76.89404\\23\\-79.10156\\-76.46487\\23\\-73.24219\\-75.69558\\23\\-71.28906\\-75.09923\\23\\-69.33594\\-74.73649\\23\\-65.42969\\-74.46515\\23\\-59.57031\\-74.25786\\23\\-49.80469\\-74.20384\\23\\-43.94531\\-74.3728\\23\\-40.03906\\-74.63253\\23\\-38.08594\\-75.10057\\23\\-36.13281\\-75.70703\\23\\-30.27344\\-76.3695\\23\\-28.32031\\-76.72266\\23\\-24.41406\\-77.84834\\23\\-22.46094\\-78.28183\\23\\-20.50781\\-78.83854\\23\\-18.55469\\-79.59588\\23\\-14.64844\\-80.67329\\23\\-12.69531\\-81.62937\\23\\-10.74219\\-82.28781\\23\\-8.789063\\-83.32163\\23\\-5.080764\\-85.02344\\23\\-2.929688\\-86.18311\\23\\0.9765625\\-87.11491\\23\\2.929688\\-87.14466\\23\\4.882813\\-86.52734\\23\\6.835938\\-85.79858\\23\\8.789063\\-84.56147\\23\\10.74219\\-83.55217\\23\\12.69531\\-82.33147\\23\\14.64844\\-81.45264\\23\\16.60156\\-80.42675\\23\\18.55469\\-79.6274\\23\\20.50781\\-78.65747\\23\\24.41406\\-77.11098\\23\\26.36719\\-76.42598\\23\\30.27344\\-75.78414\\23\\32.22656\\-75.18139\\23\\34.17969\\-74.69877\\23\\38.08594\\-74.38501\\23\\41.99219\\-74.25813\\23\\45.89844\\-74.18124\\23\\47.85156\\-73.87006\\23\\49.80469\\-73.77747\\23\\53.71094\\-73.77747\\23\\55.66406\\-74.15771\\23\\59.57031\\-74.20657\\23\\65.42969\\-74.3783\\23\\69.33594\\-74.59562\\23\\71.28906\\-74.79523\\23\\75.19531\\-75.69991\\23\\81.05469\\-76.32575\\23\\83.00781\\-76.59904\\23\\86.91406\\-77.63306\\23\\90.82031\\-78.446\\23\\94.72656\\-79.67269\\23\\98.63281\\-80.6947\\23\\100.5859\\-81.58512\\23\\102.5391\\-82.10574\\23\\104.4922\\-82.75642\\23\\106.4453\\-83.75042\\23\\108.3984\\-84.47121\\23\\110.3516\\-85.58781\\23\\112.3047\\-86.3195\\23\\114.2578\\-87.43323\\23\\116.2109\\-88.28529\\23\\119.7917\\-90.88281\\23\\122.1637\\-92.83594\\23\\124.0234\\-94.64837\\23\\125.9766\\-96.81928\\23\\128.9192\\-100.6484\\23\\130.272\\-102.6016\\23\\131.2657\\-104.5547\\23\\132.6439\\-106.5078\\23\\133.8711\\-108.4609\\23\\135.7422\\-111.9788\\23\\136.0031\\-112.3672\\23\\136.7971\\-114.3203\\23\\137.8439\\-116.2734\\23\\138.7458\\-118.2266\\23\\139.8875\\-120.1797\\23\\140.7341\\-122.1328\\23\\141.6855\\-124.0859\\23\\142.4568\\-126.0391\\23\\142.9938\\-127.9922\\23\\143.9676\\-129.9453\\23\\144.5473\\-131.8984\\23\\145.2421\\-133.8516\\23\\146.2176\\-135.8047\\23\\146.8003\\-137.7578\\23\\147.6548\\-139.7109\\23\\148.2669\\-141.6641\\23\\148.6662\\-143.6172\\23\\149.2248\\-145.5703\\23\\149.9318\\-147.5234\\23\\150.5983\\-151.4297\\23\\151.0694\\-153.3828\\23\\151.7137\\-155.3359\\23\\152.1022\\-157.2891\\23\\152.7207\\-161.1953\\23\\153.6021\\-165.1016\\23\\154.0744\\-169.0078\\23\\154.6814\\-176.8203\\23\\155.1307\\-184.6328\\23\\155.2814\\-190.4922\\23\\155.2813\\-192.4453\\23\\155.1735\\-196.3516\\23\\154.9456\\-202.2109\\23\\154.4324\\-210.0234\\23\\153.8577\\-215.8828\\23\\153.5073\\-217.8359\\23\\152.9517\\-219.7891\\23\\152.114\\-223.6953\\23\\151.5416\\-225.6484\\23\\150.7141\\-227.6016\\23\\150.2337\\-229.5547\\23\\149.4701\\-231.5078\\23\\148.5831\\-233.4609\\23\\147.8027\\-235.4141\\23\\145.3214\\-239.3203\\23\\144.2312\\-241.2734\\23\\141.6016\\-245.1085\\23\\140.1084\\-247.1328\\23\\137.6953\\-249.887\\23\\133.7891\\-254.0434\\23\\131.8359\\-255.9151\\23\\129.8828\\-257.6811\\23\\128.7124\\-258.8516\\23\\125.9766\\-261.241\\23\\124.0136\\-262.7578\\23\\122.0703\\-264.1519\\23\\118.1641\\-267.3215\\23\\116.2109\\-268.6593\\23\\114.2578\\-269.7804\\23\\112.3047\\-271.1671\\23\\110.3516\\-272.2455\\23\\108.3984\\-273.5343\\23\\106.4453\\-274.6895\\23\\100.5859\\-277.3119\\23\\98.63281\\-278.0689\\23\\96.67969\\-279.082\\23\\94.72656\\-279.7525\\23\\92.77344\\-280.6219\\23\\90.82031\\-281.1927\\23\\88.86719\\-281.6317\\23\\84.96094\\-282.8462\\23\\81.05469\\-283.549\\23\\79.10156\\-284.026\\23\\77.14844\\-284.6687\\23\\73.24219\\-285.4022\\23\\71.28906\\-285.8348\\23\\69.33594\\-286.4677\\23\\67.38281\\-286.8843\\23\\63.47656\\-287.6038\\23\\59.57031\\-288.7344\\23\\55.66406\\-289.3376\\23\\53.71094\\-289.8646\\23\\51.75781\\-290.654\\23\\47.85156\\-291.532\\23\\45.89844\\-292.3802\\23\\41.99219\\-293.322\\23\\38.08594\\-294.5876\\23\\34.17969\\-295.2502\\23\\32.22656\\-295.6708\\23\\30.27344\\-296.3448\\23\\28.32031\\-296.7541\\23\\24.41406\\-297.3669\\23\\20.50781\\-298.4523\\23\\14.64844\\-299.1535\\23\\8.789063\\-299.9619\\23\\4.882813\\-300.2365\\23\\0.9765625\\-300.3045\\23\\-2.929688\\-300.2761\\23\\-6.835938\\-300.1147\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "138" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-300.0542\\25\\-10.74219\\-299.8594\\25\\-12.69531\\-299.555\\25\\-16.60156\\-299.1116\\25\\-22.46094\\-298.4989\\25\\-24.41406\\-298.1732\\25\\-26.36719\\-297.6596\\25\\-28.32031\\-297.3065\\25\\-34.17969\\-296.6331\\25\\-36.13281\\-296.2609\\25\\-38.08594\\-295.7096\\25\\-40.03906\\-295.3287\\25\\-45.89844\\-294.5632\\25\\-47.85156\\-294.1033\\25\\-49.80469\\-293.5225\\25\\-51.75781\\-293.1414\\25\\-55.66406\\-292.4801\\25\\-57.61719\\-291.8415\\25\\-59.57031\\-291.3638\\25\\-63.47656\\-290.8277\\25\\-65.42969\\-290.4834\\25\\-67.38281\\-289.9048\\25\\-69.33594\\-289.4807\\25\\-75.19531\\-288.8592\\25\\-77.14844\\-288.5267\\25\\-81.05469\\-287.5313\\25\\-84.96094\\-286.7475\\25\\-88.86719\\-285.4453\\25\\-90.82031\\-284.9693\\25\\-94.72656\\-283.4484\\25\\-96.67969\\-283.0032\\25\\-98.63281\\-282.1573\\25\\-102.5391\\-280.6706\\25\\-103.0324\\-280.3359\\25\\-106.5549\\-278.3828\\25\\-109.9471\\-276.4297\\25\\-110.3516\\-276.1193\\25\\-112.3047\\-275.1341\\25\\-118.1641\\-271.0111\\25\\-121.4985\\-268.6172\\25\\-123.9958\\-266.6641\\25\\-127.9297\\-263.446\\25\\-129.8828\\-261.7056\\25\\-133.7891\\-257.6958\\25\\-134.646\\-256.8984\\25\\-136.3363\\-254.9453\\25\\-139.1869\\-251.0391\\25\\-140.7654\\-249.0859\\25\\-142.198\\-247.1328\\25\\-143.0698\\-245.1797\\25\\-144.3371\\-243.2266\\25\\-145.3229\\-241.2734\\25\\-146.4412\\-239.3203\\25\\-147.4609\\-237.3003\\25\\-148.3057\\-235.4141\\25\\-148.8928\\-233.4609\\25\\-149.8061\\-231.5078\\25\\-150.7996\\-227.6016\\25\\-151.6509\\-225.6484\\25\\-152.7057\\-221.7422\\25\\-153.4288\\-219.7891\\25\\-153.9656\\-217.8359\\25\\-154.7366\\-213.9297\\25\\-155.7451\\-210.0234\\25\\-156.2209\\-206.1172\\25\\-156.5043\\-202.2109\\25\\-156.9149\\-198.3047\\25\\-157.2027\\-196.3516\\25\\-157.5305\\-192.4453\\25\\-157.6425\\-188.5391\\25\\-157.633\\-184.6328\\25\\-157.5084\\-180.7266\\25\\-157.1723\\-176.8203\\25\\-156.7351\\-172.9141\\25\\-156.0364\\-165.1016\\25\\-155.7483\\-163.1484\\25\\-155.3281\\-161.1953\\25\\-154.8018\\-159.2422\\25\\-154.0719\\-155.3359\\25\\-153.6284\\-153.3828\\25\\-152.8662\\-151.4297\\25\\-151.8784\\-147.5234\\25\\-151.0254\\-145.5703\\25\\-150.4295\\-143.6172\\25\\-149.9949\\-141.6641\\25\\-149.1277\\-139.7109\\25\\-147.9619\\-135.8047\\25\\-146.9695\\-133.8516\\25\\-146.2527\\-131.8984\\25\\-145.1399\\-129.9453\\25\\-144.3988\\-127.9922\\25\\-143.4208\\-126.0391\\25\\-142.6208\\-124.0859\\25\\-141.92\\-122.1328\\25\\-140.8309\\-120.1797\\25\\-139.9672\\-118.2266\\25\\-138.7735\\-116.2734\\25\\-135.7422\\-110.5435\\25\\-134.5591\\-108.4609\\25\\-133.7891\\-107.2717\\25\\-130.4792\\-102.6016\\25\\-128.9278\\-100.6484\\25\\-127.1332\\-98.69531\\25\\-124.0234\\-95.71748\\25\\-122.0703\\-94.14925\\25\\-117.6465\\-90.88281\\25\\-114.2578\\-88.68356\\25\\-110.3516\\-87.09763\\25\\-108.3984\\-86.1802\\25\\-106.4453\\-85.49555\\25\\-104.4922\\-84.49243\\25\\-102.5391\\-83.81744\\25\\-100.5859\\-82.90394\\25\\-98.63281\\-82.20828\\25\\-96.67969\\-81.64925\\25\\-94.72656\\-80.7797\\25\\-92.77344\\-80.26194\\25\\-86.91406\\-78.5558\\25\\-84.96094\\-77.94336\\25\\-83.00781\\-77.61074\\25\\-81.05469\\-77.03655\\25\\-79.10156\\-76.562\\25\\-77.14844\\-76.27506\\25\\-73.24219\\-75.83115\\25\\-69.33594\\-74.83489\\25\\-65.42969\\-74.50612\\25\\-59.57031\\-74.31676\\25\\-47.85156\\-74.2989\\25\\-43.94531\\-74.42523\\25\\-40.03906\\-74.71123\\25\\-38.08594\\-75.35938\\25\\-36.13281\\-75.79335\\25\\-32.22656\\-76.1927\\25\\-30.27344\\-76.44364\\25\\-28.32031\\-76.87213\\25\\-26.36719\\-77.44112\\25\\-22.46094\\-78.32944\\25\\-20.50781\\-78.91658\\25\\-18.55469\\-79.64251\\25\\-14.64844\\-80.71959\\25\\-12.69531\\-81.67619\\25\\-10.74219\\-82.30033\\25\\-8.789063\\-83.32163\\25\\-2.929688\\-85.90047\\25\\-0.9765625\\-86.42114\\25\\0.9765625\\-86.71282\\25\\2.929688\\-86.7902\\25\\4.882813\\-86.33994\\25\\6.835938\\-85.64608\\25\\7.902299\\-85.02344\\25\\10.74219\\-83.59664\\25\\12.69531\\-82.38213\\25\\14.64844\\-81.51801\\25\\16.60156\\-80.48529\\25\\18.55469\\-79.71121\\25\\20.50781\\-78.76733\\25\\22.46094\\-77.97443\\25\\26.36719\\-76.51608\\25\\30.27344\\-75.86206\\25\\32.22656\\-75.38853\\25\\34.17969\\-74.75496\\25\\38.08594\\-74.43775\\25\\41.99219\\-74.29295\\25\\49.80469\\-74.20657\\25\\53.71094\\-74.20657\\25\\59.57031\\-74.26381\\25\\65.42969\\-74.47026\\25\\69.33594\\-74.7232\\25\\71.28906\\-75.02376\\25\\73.24219\\-75.62231\\25\\81.05469\\-76.44744\\25\\83.00781\\-76.79803\\25\\84.96094\\-77.37609\\25\\86.91406\\-77.85235\\25\\90.82031\\-78.63635\\25\\92.77344\\-79.26644\\25\\96.67969\\-80.32259\\25\\98.63281\\-80.92645\\25\\100.5859\\-81.79571\\25\\102.5391\\-82.27801\\25\\106.4453\\-83.95361\\25\\108.3984\\-84.70654\\25\\110.3516\\-85.78693\\25\\112.3047\\-86.53447\\25\\114.2578\\-87.69313\\25\\116.2109\\-88.50912\\25\\118.1641\\-89.91228\\25\\121.7835\\-92.83594\\25\\124.0234\\-95.02907\\25\\125.9766\\-97.27276\\25\\128.6703\\-100.6484\\25\\129.9398\\-102.6016\\25\\130.998\\-104.5547\\25\\132.3876\\-106.5078\\25\\133.4706\\-108.4609\\25\\134.6784\\-110.4141\\25\\136.6217\\-114.3203\\25\\137.4236\\-116.2734\\25\\138.5152\\-118.2266\\25\\139.4371\\-120.1797\\25\\140.5063\\-122.1328\\25\\141.2806\\-124.0859\\25\\142.2547\\-126.0391\\25\\142.787\\-127.9922\\25\\144.3768\\-131.8984\\25\\144.9366\\-133.8516\\25\\145.9754\\-135.8047\\25\\146.564\\-137.7578\\25\\148.0614\\-141.6641\\25\\148.9429\\-145.5703\\25\\149.6434\\-147.5234\\25\\150.142\\-149.4766\\25\\150.7704\\-153.3828\\25\\151.8755\\-157.2891\\25\\152.8291\\-163.1484\\25\\153.6458\\-167.0547\\25\\153.8824\\-169.0078\\25\\154.2222\\-172.9141\\25\\154.5069\\-176.8203\\25\\154.795\\-182.6797\\25\\154.9341\\-186.5859\\25\\154.9854\\-192.4453\\25\\154.7787\\-200.2578\\25\\154.4887\\-206.1172\\25\\154.2429\\-210.0234\\25\\153.8824\\-213.9297\\25\\153.604\\-215.8828\\25\\152.6527\\-219.7891\\25\\151.8729\\-223.6953\\25\\151.0912\\-225.6484\\25\\150.485\\-227.6016\\25\\150.0165\\-229.5547\\25\\149.0766\\-231.5078\\25\\148.3783\\-233.4609\\25\\146.3226\\-237.3672\\25\\144.9169\\-239.3203\\25\\143.903\\-241.2734\\25\\142.5523\\-243.2266\\25\\139.6484\\-247.0557\\25\\136.2231\\-251.0391\\25\\134.3844\\-252.9922\\25\\131.8359\\-255.5023\\25\\127.9297\\-259.0613\\25\\125.8752\\-260.8047\\25\\123.4444\\-262.7578\\25\\118.1641\\-266.8836\\25\\114.2578\\-269.5078\\25\\110.3516\\-271.7718\\25\\108.3984\\-273.1449\\25\\106.4453\\-274.0819\\25\\104.4922\\-275.2215\\25\\102.5391\\-275.8842\\25\\100.5859\\-276.9339\\25\\98.63281\\-277.5681\\25\\96.67969\\-278.5076\\25\\94.72656\\-279.2721\\25\\92.77344\\-279.9202\\25\\90.82031\\-280.7516\\25\\86.91406\\-281.6747\\25\\83.00781\\-282.8462\\25\\79.10156\\-283.4979\\25\\77.14844\\-283.9389\\25\\75.19531\\-284.644\\25\\71.28906\\-285.4173\\25\\69.33594\\-285.9173\\25\\67.38281\\-286.5971\\25\\63.47656\\-287.3706\\25\\61.52344\\-287.8725\\25\\59.57031\\-288.5593\\25\\57.61719\\-288.9743\\25\\55.66406\\-289.282\\25\\53.71094\\-289.7286\\25\\51.75781\\-290.5781\\25\\47.85156\\-291.4799\\25\\45.89844\\-292.3365\\25\\41.99219\\-293.308\\25\\40.01872\\-294.0078\\25\\38.08594\\-294.5913\\25\\34.17969\\-295.2749\\25\\32.22656\\-295.7222\\25\\30.27344\\-296.4001\\25\\28.32031\\-296.7957\\25\\24.41406\\-297.4289\\25\\22.46094\\-298.0361\\25\\20.50781\\-298.5284\\25\\14.64844\\-299.2291\\25\\8.789063\\-300.091\\25\\4.882813\\-300.2979\\25\\0.9765625\\-300.3729\\25\\-4.882813\\-300.2761\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "309" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "139" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-299.948\\27\\-12.69531\\-299.637\\27\\-16.60156\\-299.1584\\27\\-22.46094\\-298.5355\\27\\-24.41406\\-298.207\\27\\-26.36719\\-297.6855\\27\\-28.32031\\-297.3224\\27\\-34.17969\\-296.6405\\27\\-36.13281\\-296.2726\\27\\-38.08594\\-295.683\\27\\-40.03906\\-295.3243\\27\\-43.94531\\-294.8274\\27\\-45.89844\\-294.5241\\27\\-49.80469\\-293.4621\\27\\-53.71094\\-292.7645\\27\\-55.66406\\-292.3477\\27\\-57.61719\\-291.6628\\27\\-59.57031\\-291.2508\\27\\-63.47656\\-290.6776\\27\\-67.38281\\-289.6101\\27\\-69.33594\\-289.3285\\27\\-73.24219\\-288.9114\\27\\-75.19531\\-288.6169\\27\\-79.10156\\-287.6221\\27\\-83.00781\\-286.8811\\27\\-84.96094\\-286.3581\\27\\-86.91406\\-285.6348\\27\\-90.82031\\-284.6036\\27\\-92.77344\\-283.7067\\27\\-96.67969\\-282.7086\\27\\-98.63281\\-281.7908\\27\\-100.5859\\-281.1788\\27\\-102.3784\\-280.3359\\27\\-104.4922\\-279.2239\\27\\-106.4453\\-277.9748\\27\\-108.3984\\-277.0827\\27\\-110.3516\\-275.7946\\27\\-112.3047\\-274.7876\\27\\-114.2578\\-273.4598\\27\\-116.2109\\-271.9131\\27\\-118.1641\\-270.5453\\27\\-120.1172\\-269.3303\\27\\-122.0703\\-267.8088\\27\\-125.9766\\-264.5899\\27\\-127.9297\\-263.1323\\27\\-129.8828\\-261.3863\\27\\-133.7891\\-257.39\\27\\-134.3276\\-256.8984\\27\\-136.0421\\-254.9453\\27\\-137.3528\\-252.9922\\27\\-138.8307\\-251.0391\\27\\-140.5119\\-249.0859\\27\\-141.8732\\-247.1328\\27\\-142.8462\\-245.1797\\27\\-144.0717\\-243.2266\\27\\-144.9507\\-241.2734\\27\\-146.183\\-239.3203\\27\\-147.0584\\-237.3672\\27\\-148.114\\-235.4141\\27\\-148.6863\\-233.4609\\27\\-149.5007\\-231.5078\\27\\-150.1657\\-229.5547\\27\\-150.5871\\-227.6016\\27\\-151.2375\\-225.6484\\27\\-151.9981\\-223.6953\\27\\-152.4586\\-221.7422\\27\\-153.0172\\-219.7891\\27\\-153.7371\\-217.8359\\27\\-154.9364\\-211.9766\\27\\-155.4598\\-210.0234\\27\\-155.8581\\-208.0703\\27\\-156.2442\\-204.1641\\27\\-156.497\\-200.2578\\27\\-157.1568\\-192.4453\\27\\-157.3351\\-188.5391\\27\\-157.2641\\-182.6797\\27\\-157.142\\-180.7266\\27\\-156.6554\\-174.8672\\27\\-156.2266\\-169.0078\\27\\-155.8268\\-165.1016\\27\\-154.5485\\-159.2422\\27\\-153.8493\\-155.3359\\27\\-152.5879\\-151.4297\\27\\-151.5542\\-147.5234\\27\\-150.7263\\-145.5703\\27\\-150.265\\-143.6172\\27\\-149.6983\\-141.6641\\27\\-148.8532\\-139.7109\\27\\-148.3244\\-137.7578\\27\\-147.6534\\-135.8047\\27\\-146.674\\-133.8516\\27\\-145.9619\\-131.8984\\27\\-144.8393\\-129.9453\\27\\-144.1643\\-127.9922\\27\\-143.1013\\-126.0391\\27\\-142.4377\\-124.0859\\27\\-140.6024\\-120.1797\\27\\-139.5068\\-118.2266\\27\\-137.6953\\-114.8037\\27\\-137.3382\\-114.3203\\27\\-136.5171\\-112.3672\\27\\-135.2952\\-110.4141\\27\\-134.3175\\-108.4609\\27\\-131.4499\\-104.5547\\27\\-130.2279\\-102.6016\\27\\-128.5926\\-100.6484\\27\\-126.7616\\-98.69531\\27\\-124.6807\\-96.74219\\27\\-124.0234\\-96.02008\\27\\-122.0703\\-94.37366\\27\\-120.1172\\-93.06432\\27\\-118.1641\\-91.51263\\27\\-116.2109\\-90.14397\\27\\-112.3047\\-88.06654\\27\\-110.3516\\-87.40022\\27\\-108.3984\\-86.35947\\27\\-106.4453\\-85.6805\\27\\-104.4922\\-84.7112\\27\\-102.5391\\-83.99043\\27\\-98.63281\\-82.33012\\27\\-96.67969\\-81.81654\\27\\-94.72656\\-80.99905\\27\\-92.77344\\-80.38168\\27\\-88.86719\\-79.43574\\27\\-86.91406\\-78.69409\\27\\-84.96094\\-78.05433\\27\\-83.00781\\-77.73052\\27\\-79.10156\\-76.69393\\27\\-77.14844\\-76.3356\\27\\-73.24219\\-75.91896\\27\\-71.28906\\-75.57626\\27\\-69.33594\\-74.98926\\27\\-67.38281\\-74.70894\\27\\-63.47656\\-74.46515\\27\\-57.61719\\-74.33484\\27\\-53.71094\\-74.37711\\27\\-47.85156\\-74.34756\\27\\-43.94531\\-74.47527\\27\\-40.03906\\-74.7506\\27\\-38.08594\\-75.43329\\27\\-36.13281\\-75.84872\\27\\-32.22656\\-76.25246\\27\\-30.27344\\-76.5181\\27\\-26.36719\\-77.57141\\27\\-22.46094\\-78.4673\\27\\-20.50781\\-79.02863\\27\\-18.55469\\-79.71017\\27\\-14.64844\\-80.78217\\27\\-12.69531\\-81.73083\\27\\-10.74219\\-82.32056\\27\\-8.789063\\-83.33405\\27\\-6.835938\\-84.15213\\27\\-2.929688\\-85.608\\27\\-0.9765625\\-86.12865\\27\\0.9765625\\-86.38344\\27\\2.929688\\-86.44785\\27\\4.882813\\-86.1618\\27\\6.835938\\-85.46605\\27\\7.667336\\-85.02344\\27\\10.74219\\-83.63998\\27\\12.69531\\-82.47389\\27\\14.64844\\-81.68007\\27\\16.60156\\-80.5732\\27\\18.55469\\-79.87721\\27\\20.50781\\-78.84925\\27\\22.46094\\-78.04546\\27\\26.36719\\-76.6124\\27\\28.32031\\-76.19971\\27\\30.27344\\-75.91085\\27\\32.22656\\-75.45909\\27\\34.17969\\-74.81461\\27\\36.13281\\-74.6227\\27\\40.03906\\-74.39722\\27\\45.89844\\-74.28713\\27\\51.75781\\-74.24658\\27\\59.57031\\-74.31676\\27\\63.47656\\-74.47026\\27\\67.38281\\-74.70279\\27\\69.33594\\-74.92454\\27\\71.28906\\-75.47236\\27\\73.24219\\-75.79682\\27\\77.14844\\-76.13672\\27\\81.05469\\-76.6124\\27\\83.00781\\-77.05903\\27\\84.96094\\-77.62312\\27\\88.86719\\-78.38839\\27\\90.82031\\-78.85602\\27\\92.77344\\-79.47744\\27\\94.72656\\-79.90968\\27\\96.67969\\-80.49345\\27\\98.63281\\-81.27866\\27\\100.5859\\-81.94817\\27\\102.5391\\-82.45918\\27\\104.4922\\-83.39354\\27\\106.4453\\-84.14508\\27\\110.3516\\-85.97128\\27\\112.3047\\-86.79161\\27\\114.2578\\-87.85485\\27\\116.2109\\-88.77884\\27\\118.1641\\-90.13208\\27\\121.4554\\-92.83594\\27\\124.0234\\-95.36578\\27\\126.8281\\-98.69531\\27\\128.4038\\-100.6484\\27\\129.5499\\-102.6016\\27\\132.0569\\-106.5078\\27\\133.1401\\-108.4609\\27\\134.4538\\-110.4141\\27\\135.3277\\-112.3672\\27\\136.4379\\-114.3203\\27\\137.1107\\-116.2734\\27\\138.3028\\-118.2266\\27\\139.0983\\-120.1797\\27\\140.2602\\-122.1328\\27\\140.9763\\-124.0859\\27\\142.0152\\-126.0391\\27\\143.2221\\-129.9453\\27\\144.1515\\-131.8984\\27\\144.6893\\-133.8516\\27\\145.6299\\-135.8047\\27\\146.35\\-137.7578\\27\\146.9603\\-139.7109\\27\\147.8214\\-141.6641\\27\\148.7273\\-145.5703\\27\\149.268\\-147.5234\\27\\149.9318\\-149.4766\\27\\150.5692\\-153.3828\\27\\150.944\\-155.3359\\27\\151.591\\-157.2891\\27\\152.0165\\-159.2422\\27\\152.9108\\-165.1016\\27\\153.6794\\-169.0078\\27\\153.9063\\-170.9609\\27\\154.3349\\-176.8203\\27\\154.6043\\-182.6797\\27\\154.7038\\-186.5859\\27\\154.7471\\-192.4453\\27\\154.5498\\-200.2578\\27\\154.3985\\-204.1641\\27\\154.189\\-208.0703\\27\\153.8824\\-211.9766\\27\\153.6351\\-213.9297\\27\\152.7817\\-217.8359\\27\\152.0751\\-221.7422\\27\\151.5416\\-223.6953\\27\\150.7629\\-225.6484\\27\\150.3125\\-227.6016\\27\\149.7251\\-229.5547\\27\\148.7997\\-231.5078\\27\\148.1384\\-233.4609\\27\\146.9791\\-235.4141\\27\\146.0215\\-237.3672\\27\\144.593\\-239.3203\\27\\142.2549\\-243.2266\\27\\140.7463\\-245.1797\\27\\137.6953\\-248.8196\\27\\135.7167\\-251.0391\\27\\133.8743\\-252.9922\\27\\131.8359\\-254.9539\\27\\129.7141\\-256.8984\\27\\125.9766\\-260.2282\\27\\124.0234\\-261.889\\27\\120.1172\\-264.9226\\27\\114.2578\\-269.2217\\27\\112.3047\\-270.0958\\27\\111.6808\\-270.5703\\27\\108.3984\\-272.6196\\27\\104.9389\\-274.4766\\27\\104.4922\\-274.7876\\27\\100.5859\\-276.2969\\27\\98.63281\\-277.2003\\27\\96.67969\\-277.8095\\27\\94.72656\\-278.7897\\27\\90.82031\\-280.05\\27\\88.86719\\-280.8178\\27\\84.96094\\-281.6926\\27\\81.05469\\-282.8555\\27\\79.10156\\-283.1721\\27\\77.14844\\-283.3816\\27\\75.19531\\-283.9411\\27\\73.24219\\-284.6755\\27\\69.33594\\-285.4986\\27\\65.42969\\-286.7688\\27\\61.52344\\-287.6255\\27\\59.57031\\-288.3598\\27\\57.61719\\-288.887\\27\\53.71094\\-289.6165\\27\\51.75781\\-290.4733\\27\\47.85156\\-291.4238\\27\\45.89844\\-292.2664\\27\\43.94531\\-292.845\\27\\41.99219\\-293.2971\\27\\40.03906\\-294.0156\\27\\38.08594\\-294.5999\\27\\34.17969\\-295.2911\\27\\32.22656\\-295.7746\\27\\30.27344\\-296.4524\\27\\28.32031\\-296.8342\\27\\26.36719\\-297.1064\\27\\24.41406\\-297.4892\\27\\22.46094\\-298.1616\\27\\20.50781\\-298.5736\\27\\14.64844\\-299.2985\\27\\10.74219\\-299.9338\\27\\8.789063\\-300.1602\\27\\6.835938\\-300.2857\\27\\0.9765625\\-300.4211\\27\\-4.882813\\-300.3257\\27\\-8.789063\\-300.1377\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "302" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "140" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-300.0026\\29\\-16.60156\\-299.2072\\29\\-22.46094\\-298.5702\\29\\-24.41406\\-298.2502\\29\\-26.36719\\-297.723\\29\\-28.32031\\-297.3304\\29\\-34.17969\\-296.6405\\29\\-36.13281\\-296.2609\\29\\-38.08594\\-295.6588\\29\\-40.03906\\-295.312\\29\\-43.94531\\-294.8042\\29\\-45.89844\\-294.4803\\29\\-49.80469\\-293.3919\\29\\-53.71094\\-292.6829\\29\\-57.61719\\-291.532\\29\\-59.57031\\-291.1448\\29\\-61.52344\\-290.8584\\29\\-63.47656\\-290.463\\29\\-65.42969\\-289.8236\\29\\-67.38281\\-289.4209\\29\\-71.28906\\-288.9999\\29\\-73.24219\\-288.7255\\29\\-77.14844\\-287.7355\\29\\-79.10156\\-287.317\\29\\-81.05469\\-287.003\\29\\-83.00781\\-286.5772\\29\\-84.96094\\-285.8396\\29\\-88.86719\\-284.8661\\29\\-90.82031\\-284.0844\\29\\-92.77344\\-283.4237\\29\\-94.72656\\-283.023\\29\\-98.63281\\-281.5261\\29\\-100.5859\\-280.9086\\29\\-102.5391\\-279.8096\\29\\-104.4922\\-278.9469\\29\\-106.4453\\-277.6562\\29\\-108.3984\\-276.7942\\29\\-110.3516\\-275.5356\\29\\-114.2578\\-273.1647\\29\\-118.1641\\-270.1355\\29\\-120.1172\\-269.0235\\29\\-122.0703\\-267.5398\\29\\-124.0234\\-265.8049\\29\\-125.9766\\-264.1714\\29\\-127.8658\\-262.7578\\29\\-129.8828\\-261.0099\\29\\-133.9297\\-256.8984\\29\\-135.7422\\-254.8255\\29\\-137.0124\\-252.9922\\29\\-140.2306\\-249.0859\\29\\-142.6338\\-245.1797\\29\\-143.7529\\-243.2266\\29\\-144.6959\\-241.2734\\29\\-145.9173\\-239.3203\\29\\-146.7768\\-237.3672\\29\\-147.8795\\-235.4141\\29\\-149.1298\\-231.5078\\29\\-149.973\\-229.5547\\29\\-150.8951\\-225.6484\\29\\-151.7365\\-223.6953\\29\\-152.7092\\-219.7891\\29\\-153.4433\\-217.8359\\29\\-153.9621\\-215.8828\\29\\-154.6863\\-211.9766\\29\\-155.6405\\-208.0703\\29\\-156.1182\\-204.1641\\29\\-156.3806\\-200.2578\\29\\-156.5775\\-196.3516\\29\\-156.8453\\-192.4453\\29\\-156.9526\\-188.5391\\29\\-156.9033\\-182.6797\\29\\-156.7036\\-178.7734\\29\\-156.2442\\-170.9609\\29\\-155.867\\-167.0547\\29\\-155.5535\\-165.1016\\29\\-155.0475\\-163.1484\\29\\-154.0028\\-157.2891\\29\\-153.556\\-155.3359\\29\\-152.8568\\-153.3828\\29\\-151.8755\\-149.4766\\29\\-151.0791\\-147.5234\\29\\-150.5099\\-145.5703\\29\\-150.0754\\-143.6172\\29\\-148.6241\\-139.7109\\29\\-148.0976\\-137.7578\\29\\-146.424\\-133.8516\\29\\-144.596\\-129.9453\\29\\-143.8779\\-127.9922\\29\\-142.8672\\-126.0391\\29\\-142.2463\\-124.0859\\29\\-141.2096\\-122.1328\\29\\-140.3677\\-120.1797\\29\\-139.1197\\-118.2266\\29\\-138.2478\\-116.2734\\29\\-137.0465\\-114.3203\\29\\-136.2877\\-112.3672\\29\\-135.0473\\-110.4141\\29\\-133.9713\\-108.4609\\29\\-132.6005\\-106.5078\\29\\-130.998\\-104.5547\\29\\-129.8828\\-102.6341\\29\\-128.294\\-100.6484\\29\\-126.4648\\-98.69531\\29\\-124.0234\\-96.32257\\29\\-122.0703\\-94.65072\\29\\-120.1172\\-93.36286\\29\\-116.2109\\-90.37721\\29\\-114.2578\\-89.46416\\29\\-112.3047\\-88.272\\29\\-110.3516\\-87.612\\29\\-108.3984\\-86.55054\\29\\-106.4453\\-85.84976\\29\\-102.5391\\-84.15977\\29\\-100.5859\\-83.43819\\29\\-98.63281\\-82.48179\\29\\-96.67969\\-81.95159\\29\\-92.77344\\-80.51968\\29\\-88.86719\\-79.65894\\29\\-86.91406\\-78.86713\\29\\-84.96094\\-78.29276\\29\\-81.05469\\-77.39178\\29\\-79.10156\\-76.83227\\29\\-77.14844\\-76.40635\\29\\-73.24219\\-75.99763\\29\\-69.33594\\-75.45757\\29\\-67.38281\\-74.77326\\29\\-61.52344\\-74.43775\\29\\-57.61719\\-74.39043\\29\\-51.75781\\-74.38501\\29\\-47.85156\\-74.41809\\29\\-43.94531\\-74.56412\\29\\-41.99219\\-74.70295\\29\\-40.03906\\-75.01781\\29\\-38.08594\\-75.66357\\29\\-32.22656\\-76.3339\\29\\-30.27344\\-76.62223\\29\\-26.36719\\-77.71753\\29\\-24.41406\\-78.1052\\29\\-22.46094\\-78.59578\\29\\-18.55469\\-79.7923\\29\\-16.60156\\-80.23094\\29\\-14.64844\\-80.87119\\29\\-12.69531\\-81.78776\\29\\-10.74219\\-82.37096\\29\\-8.789063\\-83.3463\\29\\-2.929688\\-85.39849\\29\\-0.9765625\\-85.76058\\29\\0.9765625\\-85.95087\\29\\2.929688\\-86.03639\\29\\4.882813\\-85.88547\\29\\6.835938\\-85.33681\\29\\10.74219\\-83.66122\\29\\12.69531\\-82.56223\\29\\14.64844\\-81.79571\\29\\16.60156\\-80.67329\\29\\18.55469\\-80.01245\\29\\20.50781\\-78.96462\\29\\22.46094\\-78.14015\\29\\24.41406\\-77.4949\\29\\26.36719\\-76.69662\\29\\28.32031\\-76.24019\\29\\32.22656\\-75.66306\\29\\34.17969\\-74.97765\\29\\36.13281\\-74.70894\\29\\38.08594\\-74.56026\\29\\41.99219\\-74.39181\\29\\49.80469\\-74.29295\\29\\55.66406\\-74.31066\\29\\59.57031\\-74.39043\\29\\63.47656\\-74.55653\\29\\67.38281\\-74.86871\\29\\69.33594\\-75.44276\\29\\71.28906\\-75.73967\\29\\77.14844\\-76.25161\\29\\79.10156\\-76.49358\\29\\81.05469\\-76.85046\\29\\84.96094\\-77.8256\\29\\88.86719\\-78.6151\\29\\90.84744\\-79.16406\\29\\96.67969\\-80.68392\\29\\98.63281\\-81.53967\\29\\102.5391\\-82.6623\\29\\104.4922\\-83.63634\\29\\106.4453\\-84.36315\\29\\108.3984\\-85.35128\\29\\110.3516\\-86.13021\\29\\114.2578\\-87.97769\\29\\115.9397\\-88.92969\\29\\118.1641\\-90.39117\\29\\118.6523\\-90.88281\\29\\121.1448\\-92.83594\\29\\124.0234\\-95.69801\\29\\124.8314\\-96.74219\\29\\126.5536\\-98.69531\\29\\128.0658\\-100.6484\\29\\129.2251\\-102.6016\\29\\130.574\\-104.5547\\29\\131.6112\\-106.5078\\29\\134.1656\\-110.4141\\29\\135.0555\\-112.3672\\29\\136.2095\\-114.3203\\29\\136.8776\\-116.2734\\29\\138.0296\\-118.2266\\29\\138.8264\\-120.1797\\29\\139.9867\\-122.1328\\29\\140.7243\\-124.0859\\29\\141.7015\\-126.0391\\29\\142.4568\\-127.9922\\29\\142.9523\\-129.9453\\29\\143.8546\\-131.8984\\29\\145.1868\\-135.8047\\29\\146.1348\\-137.7578\\29\\146.7008\\-139.7109\\29\\147.5135\\-141.6641\\29\\148.1416\\-143.6172\\29\\148.9975\\-147.5234\\29\\149.6691\\-149.4766\\29\\150.1346\\-151.4297\\29\\150.7064\\-155.3359\\29\\151.7831\\-159.2422\\29\\152.1149\\-161.1953\\29\\152.6638\\-165.1016\\29\\153.4011\\-169.0078\\29\\153.6997\\-170.9609\\29\\154.0595\\-174.8672\\29\\154.2753\\-178.7734\\29\\154.4796\\-184.6328\\29\\154.5352\\-188.5391\\29\\154.5352\\-192.4453\\29\\154.3631\\-200.2578\\29\\154.2106\\-204.1641\\29\\153.9951\\-208.0703\\29\\153.648\\-211.9766\\29\\152.8503\\-215.8828\\29\\152.2092\\-219.7891\\29\\151.8046\\-221.7422\\29\\151.0791\\-223.6953\\29\\150.5357\\-225.6484\\29\\150.1346\\-227.6016\\29\\148.5779\\-231.5078\\29\\147.8556\\-233.4609\\29\\147.4609\\-234.0429\\29\\145.5078\\-237.4676\\29\\143.5547\\-240.5657\\29\\143.0114\\-241.2734\\29\\141.9119\\-243.2266\\29\\140.402\\-245.1797\\29\\138.6895\\-247.1328\\29\\137.6953\\-248.3927\\29\\135.2355\\-251.0391\\29\\131.8359\\-254.4605\\29\\129.2504\\-256.8984\\29\\127.9297\\-258.0021\\29\\125.9766\\-259.8219\\29\\124.0234\\-261.5253\\29\\122.0703\\-263.0933\\29\\120.1172\\-264.3684\\29\\116.2109\\-267.444\\29\\114.2578\\-268.8094\\29\\112.3047\\-269.7679\\29\\110.3516\\-271.0235\\29\\108.3984\\-271.9879\\29\\106.4453\\-273.2614\\29\\104.4922\\-274.1533\\29\\102.5391\\-275.1965\\29\\100.5859\\-275.7808\\29\\98.63281\\-276.7481\\29\\94.72656\\-278.055\\29\\92.77344\\-278.9569\\29\\90.82031\\-279.5013\\29\\86.91406\\-280.8529\\29\\83.00781\\-281.7057\\29\\79.10156\\-282.8517\\29\\75.19531\\-283.4979\\29\\73.24219\\-284.0694\\29\\71.28906\\-284.768\\29\\67.38281\\-285.7191\\29\\65.42969\\-286.5013\\29\\61.52344\\-287.4334\\29\\57.61719\\-288.7848\\29\\53.71094\\-289.5058\\29\\51.75781\\-290.3642\\29\\49.80469\\-290.9379\\29\\47.85156\\-291.3663\\29\\45.89844\\-292.2033\\29\\43.94531\\-292.8249\\29\\41.99219\\-293.2834\\29\\40.01953\\-294.0078\\29\\38.08594\\-294.6121\\29\\34.17969\\-295.312\\29\\32.22656\\-295.8312\\29\\30.27344\\-296.5021\\29\\26.36719\\-297.1468\\29\\24.41406\\-297.5644\\29\\22.46094\\-298.2502\\29\\20.50781\\-298.6102\\29\\14.64844\\-299.373\\29\\10.74219\\-300.0158\\29\\6.835938\\-300.3376\\29\\0.9765625\\-300.4712\\29\\-0.9765625\\-300.4599\\29\\-6.835938\\-300.3073\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "287" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "141" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-300.0666\\31\\-16.60156\\-299.2437\\31\\-22.46094\\-298.5901\\31\\-24.41406\\-298.2911\\31\\-26.36719\\-297.761\\31\\-28.32031\\-297.3304\\31\\-34.17969\\-296.6331\\31\\-36.13281\\-296.2247\\31\\-38.08594\\-295.6331\\31\\-40.03906\\-295.2915\\31\\-43.94531\\-294.7809\\31\\-45.89844\\-294.4254\\31\\-49.80469\\-293.3156\\31\\-53.71094\\-292.596\\31\\-57.61719\\-291.3913\\31\\-61.52344\\-290.7403\\31\\-65.42969\\-289.5879\\31\\-71.28906\\-288.8345\\31\\-73.24219\\-288.4623\\31\\-75.19531\\-287.8745\\31\\-77.14844\\-287.4377\\31\\-81.05469\\-286.7429\\31\\-84.96094\\-285.4846\\31\\-86.91406\\-285.0585\\31\\-88.86719\\-284.4897\\31\\-90.82031\\-283.6674\\31\\-94.72656\\-282.7538\\31\\-96.67969\\-281.8804\\31\\-98.63281\\-281.2891\\31\\-100.5859\\-280.5886\\31\\-102.5391\\-279.4997\\31\\-104.4922\\-278.5753\\31\\-106.4453\\-277.4229\\31\\-110.3516\\-275.3199\\31\\-112.3047\\-274.0106\\31\\-114.2578\\-272.8336\\31\\-118.1641\\-269.8775\\31\\-122.0703\\-267.2565\\31\\-125.9766\\-263.8394\\31\\-127.3774\\-262.7578\\31\\-129.5766\\-260.8047\\31\\-133.7891\\-256.5125\\31\\-135.7422\\-254.3512\\31\\-136.7615\\-252.9922\\31\\-139.8803\\-249.0859\\31\\-141.0718\\-247.1328\\31\\-142.4164\\-245.1797\\31\\-143.5547\\-242.9749\\31\\-145.5309\\-239.3203\\31\\-147.4609\\-235.5536\\31\\-148.3257\\-233.4609\\31\\-148.8796\\-231.5078\\31\\-149.7106\\-229.5547\\31\\-150.2664\\-227.6016\\31\\-150.6755\\-225.6484\\31\\-152.0481\\-221.7422\\31\\-152.484\\-219.7891\\31\\-153.0676\\-217.8359\\31\\-153.7631\\-215.8828\\31\\-154.8387\\-210.0234\\31\\-155.3281\\-208.0703\\31\\-155.6977\\-206.1172\\31\\-155.9639\\-204.1641\\31\\-156.2672\\-200.2578\\31\\-156.5975\\-192.4453\\31\\-156.6888\\-186.5859\\31\\-156.6554\\-182.6797\\31\\-156.3414\\-174.8672\\31\\-156.1011\\-170.9609\\31\\-155.6267\\-167.0547\\31\\-154.7659\\-163.1484\\31\\-153.7659\\-157.2891\\31\\-152.5662\\-153.3828\\31\\-152.1267\\-151.4297\\31\\-151.5542\\-149.4766\\31\\-150.7463\\-147.5234\\31\\-149.8198\\-143.6172\\31\\-148.9808\\-141.6641\\31\\-147.8068\\-137.7578\\31\\-146.8762\\-135.8047\\31\\-146.1721\\-133.8516\\31\\-145.0949\\-131.8984\\31\\-144.3586\\-129.9453\\31\\-143.4515\\-127.9922\\31\\-142.6575\\-126.0391\\31\\-141.9908\\-124.0859\\31\\-140.9168\\-122.1328\\31\\-140.0773\\-120.1797\\31\\-138.8281\\-118.2266\\31\\-137.9544\\-116.2734\\31\\-136.8225\\-114.3203\\31\\-135.9769\\-112.3672\\31\\-133.7891\\-108.7273\\31\\-132.3135\\-106.5078\\31\\-130.7488\\-104.5547\\31\\-129.8828\\-103.2307\\31\\-127.9297\\-100.6968\\31\\-126.0517\\-98.69531\\31\\-124.0143\\-96.74219\\31\\-121.7954\\-94.78906\\31\\-120.1172\\-93.6881\\31\\-118.1641\\-92.12856\\31\\-116.2109\\-90.6875\\31\\-114.2578\\-89.68233\\31\\-112.3047\\-88.50912\\31\\-110.3516\\-87.77966\\31\\-108.3984\\-86.83273\\31\\-104.4922\\-85.32554\\31\\-102.5391\\-84.3317\\31\\-100.5859\\-83.63794\\31\\-98.63281\\-82.70582\\31\\-94.72656\\-81.46904\\31\\-92.77344\\-80.66281\\31\\-88.86719\\-79.77917\\31\\-84.96094\\-78.44791\\31\\-83.00781\\-77.92625\\31\\-81.05469\\-77.53191\\31\\-79.10156\\-76.96504\\31\\-77.14844\\-76.51608\\31\\-75.19531\\-76.25805\\31\\-69.33594\\-75.66306\\31\\-67.38281\\-74.85938\\31\\-65.42969\\-74.68462\\31\\-59.57031\\-74.46515\\31\\-53.71094\\-74.43577\\31\\-49.80469\\-74.47531\\31\\-43.94531\\-74.67046\\31\\-41.99219\\-74.87191\\31\\-40.03906\\-75.52746\\31\\-38.08594\\-75.81311\\31\\-32.22656\\-76.42069\\31\\-30.27344\\-76.80293\\31\\-26.36719\\-77.84834\\31\\-24.41406\\-78.21494\\31\\-22.46094\\-78.71108\\31\\-20.50781\\-79.40636\\31\\-18.55469\\-79.86597\\31\\-16.60156\\-80.1463\\31\\-12.69531\\-81.88717\\31\\-10.74219\\-82.42984\\31\\-8.789063\\-83.38421\\31\\-2.929688\\-85.14063\\31\\-0.9765625\\-85.38698\\31\\2.929688\\-85.61069\\31\\4.882813\\-85.54826\\31\\6.835938\\-85.14063\\31\\10.74219\\-83.6861\\31\\12.69531\\-82.6295\\31\\14.64844\\-81.86213\\31\\16.60156\\-80.79166\\31\\18.55469\\-80.08569\\31\\22.46094\\-78.25381\\31\\24.41406\\-77.62385\\31\\26.36719\\-76.79436\\31\\28.32031\\-76.32262\\31\\32.22656\\-75.82027\\31\\36.13281\\-74.82631\\31\\40.03906\\-74.54341\\31\\45.89844\\-74.39043\\31\\49.80469\\-74.34675\\31\\55.66406\\-74.37167\\31\\59.57031\\-74.47026\\31\\65.42969\\-74.82963\\31\\67.38281\\-75.18139\\31\\69.33594\\-75.70112\\31\\73.24219\\-76.00947\\31\\77.14844\\-76.39321\\31\\79.10156\\-76.68117\\31\\83.00781\\-77.60786\\31\\86.91406\\-78.37299\\31\\88.86719\\-78.8601\\31\\90.82031\\-79.46065\\31\\94.72656\\-80.35369\\31\\96.67969\\-80.94033\\31\\98.63281\\-81.74451\\31\\100.5859\\-82.22906\\31\\102.5391\\-82.91495\\31\\104.4922\\-83.82921\\31\\106.4453\\-84.56852\\31\\108.3984\\-85.58781\\31\\110.3516\\-86.31522\\31\\112.3047\\-87.36861\\31\\114.2578\\-88.12954\\31\\118.1641\\-90.73438\\31\\120.7854\\-92.83594\\31\\122.8275\\-94.78906\\31\\124.0234\\-96.05859\\31\\126.2059\\-98.69531\\31\\127.9297\\-101.0255\\31\\130.2973\\-104.5547\\31\\131.25\\-106.5078\\31\\132.6344\\-108.4609\\31\\133.7891\\-110.4252\\31\\135.7422\\-114.0846\\31\\137.6953\\-118.3446\\31\\139.6484\\-122.2142\\31\\141.3176\\-126.0391\\31\\142.2631\\-127.9922\\31\\142.7601\\-129.9453\\31\\143.4673\\-131.8984\\31\\144.2914\\-133.8516\\31\\144.8864\\-135.8047\\31\\145.8589\\-137.7578\\31\\147.14\\-141.6641\\31\\147.9523\\-143.6172\\31\\148.7903\\-147.5234\\31\\149.9509\\-151.4297\\31\\150.5388\\-155.3359\\31\\150.9012\\-157.2891\\31\\151.4893\\-159.2422\\31\\151.9165\\-161.1953\\31\\152.7207\\-167.0547\\31\\153.7292\\-172.9141\\31\\154.0232\\-176.8203\\31\\154.2115\\-180.7266\\31\\154.324\\-184.6328\\31\\154.3741\\-188.5391\\31\\154.3521\\-192.4453\\31\\154.1842\\-200.2578\\31\\153.9362\\-206.1172\\31\\153.8057\\-208.0703\\31\\153.2974\\-211.9766\\31\\152.9108\\-213.9297\\31\\151.9843\\-219.7891\\31\\150.7583\\-223.6953\\31\\149.9089\\-227.6016\\31\\149.0054\\-229.5547\\31\\148.3783\\-231.5078\\31\\147.4842\\-233.4609\\31\\146.4063\\-235.4141\\31\\145.1269\\-237.3672\\31\\144.0845\\-239.3203\\31\\142.7221\\-241.2734\\31\\141.6016\\-243.0391\\31\\140.0542\\-245.1797\\31\\139.6484\\-245.5743\\31\\137.6953\\-247.9688\\31\\134.8465\\-251.0391\\31\\133.7891\\-252.0219\\31\\131.8359\\-254.0453\\31\\129.8828\\-255.9219\\31\\127.9297\\-257.5978\\31\\124.0234\\-261.1577\\31\\121.9295\\-262.7578\\31\\120.1172\\-263.9583\\31\\116.2109\\-267.0727\\31\\114.2578\\-268.2308\\31\\112.3047\\-269.4873\\31\\110.3516\\-270.4645\\31\\106.4453\\-272.7898\\31\\104.4922\\-273.6666\\31\\102.5391\\-274.7587\\31\\98.63281\\-276.0779\\31\\96.67969\\-277.003\\31\\94.72656\\-277.5304\\31\\90.82031\\-279.0624\\31\\88.86719\\-279.5695\\31\\84.96094\\-280.9144\\31\\81.05469\\-281.7451\\31\\77.14844\\-282.8866\\31\\73.24219\\-283.6053\\31\\69.33594\\-284.9472\\31\\67.38281\\-285.4363\\31\\63.47656\\-286.8298\\31\\61.52344\\-287.281\\31\\59.57031\\-287.9115\\31\\57.61719\\-288.6758\\31\\53.71094\\-289.4445\\31\\51.75781\\-290.2523\\31\\49.80469\\-290.8877\\31\\47.85156\\-291.3392\\31\\45.89844\\-292.1632\\31\\43.94531\\-292.8148\\31\\41.99219\\-293.2767\\31\\38.08594\\-294.6326\\31\\34.17969\\-295.3332\\31\\30.27344\\-296.5493\\31\\26.36719\\-297.1884\\31\\24.41406\\-297.6578\\31\\22.46094\\-298.301\\31\\20.50781\\-298.6391\\31\\14.64844\\-299.4478\\31\\10.74219\\-300.091\\31\\6.835938\\-300.3759\\31\\4.882813\\-300.4474\\31\\-0.9765625\\-300.5014\\31\\-6.835938\\-300.3555\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "297" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "142" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-12.69531\\-299.8899\\33\\-16.60156\\-299.2937\\33\\-22.46094\\-298.6256\\33\\-24.41406\\-298.3394\\33\\-28.32031\\-297.342\\33\\-34.17969\\-296.6139\\33\\-36.13281\\-296.1979\\33\\-38.08594\\-295.6102\\33\\-40.03906\\-295.2669\\33\\-43.94531\\-294.7388\\33\\-45.89844\\-294.3575\\33\\-47.85156\\-293.7354\\33\\-49.80469\\-293.2379\\33\\-53.71094\\-292.5077\\33\\-55.66406\\-291.7729\\33\\-57.61719\\-291.2784\\33\\-61.52344\\-290.5781\\33\\-63.47656\\-289.8773\\33\\-65.42969\\-289.4366\\33\\-69.33594\\-288.9622\\33\\-71.28906\\-288.6301\\33\\-75.19531\\-287.5686\\33\\-79.10156\\-286.8409\\33\\-81.05469\\-286.3947\\33\\-83.00781\\-285.6804\\33\\-86.91406\\-284.7897\\33\\-88.86719\\-283.9803\\33\\-90.82031\\-283.4189\\33\\-92.77344\\-283.0305\\33\\-96.67969\\-281.5986\\33\\-98.63281\\-281.0478\\33\\-102.5391\\-279.2393\\33\\-104.4922\\-278.1028\\33\\-106.4453\\-277.1982\\33\\-108.3984\\-276.0122\\33\\-110.3516\\-275.0944\\33\\-111.1698\\-274.4766\\33\\-116.2109\\-271.0866\\33\\-120.1172\\-268.2171\\33\\-122.0703\\-266.9154\\33\\-124.6109\\-264.7109\\33\\-126.9757\\-262.7578\\33\\-129.8828\\-260.0811\\33\\-131.0298\\-258.8516\\33\\-133.0119\\-256.8984\\33\\-134.8852\\-254.9453\\33\\-136.5222\\-252.9922\\33\\-139.6484\\-248.8057\\33\\-142.194\\-245.1797\\33\\-143.0491\\-243.2266\\33\\-144.2686\\-241.2734\\33\\-145.1185\\-239.3203\\33\\-146.2992\\-237.3672\\33\\-148.1379\\-233.4609\\33\\-148.6709\\-231.5078\\33\\-150.1194\\-227.6016\\33\\-150.501\\-225.6484\\33\\-151.0302\\-223.6953\\33\\-151.8409\\-221.7422\\33\\-152.7817\\-217.8359\\33\\-153.4947\\-215.8828\\33\\-153.9621\\-213.9297\\33\\-154.6244\\-210.0234\\33\\-155.4312\\-206.1172\\33\\-155.7584\\-204.1641\\33\\-156.1435\\-200.2578\\33\\-156.2442\\-198.3047\\33\\-156.4442\\-192.4453\\33\\-156.497\\-188.5391\\33\\-156.497\\-184.6328\\33\\-156.4374\\-180.7266\\33\\-156.3017\\-176.8203\\33\\-156.0872\\-172.9141\\33\\-155.6764\\-169.0078\\33\\-154.8626\\-165.1016\\33\\-153.9039\\-159.2422\\33\\-153.4158\\-157.2891\\33\\-152.7751\\-155.3359\\33\\-151.8729\\-151.4297\\33\\-151.0771\\-149.4766\\33\\-150.5309\\-147.5234\\33\\-150.1237\\-145.5703\\33\\-148.7317\\-141.6641\\33\\-148.1995\\-139.7109\\33\\-146.5766\\-135.8047\\33\\-145.8506\\-133.8516\\33\\-144.7783\\-131.8984\\33\\-144.1239\\-129.9453\\33\\-143.0835\\-127.9922\\33\\-142.4744\\-126.0391\\33\\-141.6095\\-124.0859\\33\\-139.6563\\-120.1797\\33\\-137.5184\\-116.2734\\33\\-136.6205\\-114.3203\\33\\-134.5667\\-110.4141\\33\\-133.1712\\-108.4609\\33\\-131.9074\\-106.5078\\33\\-130.5272\\-104.5547\\33\\-127.9297\\-101.1929\\33\\-125.5383\\-98.69531\\33\\-123.5672\\-96.74219\\33\\-121.3503\\-94.78906\\33\\-118.1641\\-92.3726\\33\\-116.0265\\-90.88281\\33\\-112.3047\\-88.84235\\33\\-110.3516\\-87.94052\\33\\-108.3984\\-87.17188\\33\\-106.4453\\-86.23553\\33\\-104.4922\\-85.56245\\33\\-102.5391\\-84.53212\\33\\-100.5859\\-83.80855\\33\\-96.67969\\-82.20155\\33\\-94.72656\\-81.70571\\33\\-92.77344\\-80.84345\\33\\-88.86719\\-79.87601\\33\\-86.91406\\-79.29688\\33\\-84.96094\\-78.59837\\33\\-83.00781\\-78.05405\\33\\-81.05469\\-77.66016\\33\\-77.14844\\-76.64453\\33\\-75.19531\\-76.33685\\33\\-69.33594\\-75.72993\\33\\-65.42969\\-74.78455\\33\\-59.57031\\-74.54341\\33\\-51.75781\\-74.53994\\33\\-49.80469\\-74.57422\\33\\-43.94531\\-74.81116\\33\\-40.03906\\-75.75912\\33\\-34.17969\\-76.3054\\33\\-32.22656\\-76.57047\\33\\-30.27344\\-76.99623\\33\\-28.32031\\-77.54745\\33\\-24.41406\\-78.36208\\33\\-22.46094\\-78.8601\\33\\-20.50781\\-79.5423\\33\\-18.55469\\-79.99355\\33\\-16.60156\\-80.23714\\33\\-14.64844\\-81.18983\\33\\-12.69531\\-81.95863\\33\\-10.74219\\-82.48179\\33\\-8.789063\\-83.43226\\33\\-6.835938\\-83.98909\\33\\-4.882813\\-84.43981\\33\\-2.929688\\-84.74161\\33\\2.929688\\-84.98588\\33\\4.882813\\-85.00072\\33\\6.835938\\-84.77596\\33\\10.74219\\-83.70693\\33\\12.69531\\-82.70061\\33\\14.64844\\-81.93725\\33\\16.60156\\-80.95313\\33\\18.55469\\-80.17153\\33\\22.46094\\-78.45435\\33\\24.41406\\-77.76453\\33\\26.36719\\-76.97571\\33\\28.32031\\-76.4333\\33\\34.17969\\-75.65517\\33\\38.08594\\-74.81461\\33\\41.99219\\-74.55653\\33\\49.80469\\-74.41637\\33\\53.71094\\-74.42866\\33\\59.57031\\-74.58684\\33\\63.47656\\-74.85659\\33\\65.42969\\-75.16521\\33\\67.38281\\-75.58334\\33\\69.33594\\-75.82544\\33\\73.24219\\-76.12016\\33\\77.14844\\-76.56192\\33\\79.10156\\-76.94273\\33\\81.05469\\-77.45164\\33\\84.96094\\-78.17123\\33\\86.91406\\-78.58727\\33\\90.82031\\-79.6791\\33\\94.72656\\-80.50208\\33\\96.67969\\-81.26682\\33\\98.63281\\-81.90949\\33\\100.5859\\-82.37708\\33\\102.5391\\-83.23919\\33\\106.4453\\-84.8072\\33\\108.3984\\-85.79877\\33\\110.3516\\-86.52433\\33\\112.3047\\-87.60807\\33\\114.2578\\-88.32923\\33\\117.8414\\-90.88281\\33\\120.1172\\-92.57685\\33\\122.5698\\-94.78906\\33\\124.3014\\-96.74219\\33\\125.7176\\-98.69531\\33\\127.2943\\-100.6484\\33\\128.7456\\-102.6016\\33\\129.9235\\-104.5547\\33\\130.9854\\-106.5078\\33\\132.3515\\-108.4609\\33\\133.3866\\-110.4141\\33\\134.6068\\-112.3672\\33\\135.5362\\-114.3203\\33\\136.5662\\-116.2734\\33\\137.2514\\-118.2266\\33\\138.4\\-120.1797\\33\\139.2109\\-122.1328\\33\\140.3013\\-124.0859\\33\\141.0168\\-126.0391\\33\\142.0393\\-127.9922\\33\\143.1599\\-131.8984\\33\\144.1013\\-133.8516\\33\\144.6715\\-135.8047\\33\\146.2816\\-139.7109\\33\\146.8632\\-141.6641\\33\\147.7016\\-143.6172\\33\\148.2387\\-145.5703\\33\\149.047\\-149.4766\\33\\149.7206\\-151.4297\\33\\150.1465\\-153.3828\\33\\150.6987\\-157.2891\\33\\151.132\\-159.2422\\33\\151.682\\-161.1953\\33\\152.0508\\-163.1484\\33\\152.7207\\-169.0078\\33\\153.4819\\-172.9141\\33\\153.7195\\-174.8672\\33\\153.9805\\-178.7734\\33\\154.1748\\-184.6328\\33\\154.2057\\-188.5391\\33\\154.1842\\-192.4453\\33\\154.0093\\-200.2578\\33\\153.7195\\-206.1172\\33\\153.532\\-208.0703\\33\\152.9208\\-211.9766\\33\\152.0957\\-217.8359\\33\\151.6927\\-219.7891\\33\\150.9859\\-221.7422\\33\\150.1965\\-225.6484\\33\\149.6033\\-227.6016\\33\\148.7609\\-229.5547\\33\\148.1706\\-231.5078\\33\\147.0848\\-233.4609\\33\\146.1298\\-235.4141\\33\\144.7815\\-237.3672\\33\\143.7137\\-239.3203\\33\\142.4967\\-241.2734\\33\\141.6016\\-242.5203\\33\\137.6953\\-247.5153\\33\\136.3196\\-249.0859\\33\\134.4788\\-251.0391\\33\\133.7891\\-251.6405\\33\\131.8359\\-253.6712\\33\\129.8828\\-255.5655\\33\\123.8683\\-260.8047\\33\\121.3884\\-262.7578\\33\\118.1641\\-265.1725\\33\\116.0498\\-266.6641\\33\\112.3047\\-269.143\\33\\110.3516\\-269.9709\\33\\108.3984\\-271.2195\\33\\106.4453\\-272.0958\\33\\104.4922\\-273.276\\33\\102.5391\\-274.0927\\33\\100.5859\\-275.0917\\33\\98.63281\\-275.6472\\33\\94.72656\\-277.1635\\33\\92.77344\\-277.6623\\33\\90.82031\\-278.4648\\33\\88.86719\\-279.1166\\33\\86.91406\\-279.6326\\33\\83.00781\\-280.9768\\33\\79.10156\\-281.8109\\33\\77.14844\\-282.4645\\33\\75.19531\\-283.0032\\33\\73.24219\\-283.3508\\33\\71.28906\\-283.8208\\33\\69.33594\\-284.6607\\33\\65.42969\\-285.7759\\33\\63.47656\\-286.6538\\33\\59.57031\\-287.7432\\33\\57.61719\\-288.5593\\33\\55.66406\\-289.0357\\33\\53.71094\\-289.3929\\33\\49.80469\\-290.8562\\33\\47.85156\\-291.33\\33\\45.89844\\-292.1355\\33\\43.94531\\-292.8125\\33\\41.99219\\-293.2874\\33\\40.03906\\-294.0311\\33\\38.08594\\-294.6447\\33\\34.17969\\-295.3673\\33\\30.27344\\-296.5824\\33\\26.36719\\-297.2316\\33\\24.41406\\-297.7346\\33\\22.46094\\-298.3579\\33\\20.50781\\-298.6768\\33\\16.60156\\-299.2071\\33\\10.74219\\-300.1602\\33\\6.835938\\-300.4326\\33\\4.882813\\-300.5051\\33\\-0.9765625\\-300.5536\\33\\-4.882813\\-300.4747\\33\\-8.789063\\-300.2952\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "293" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "143" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-12.69531\\-300.0026\\35\\-16.60156\\-299.3641\\35\\-24.41406\\-298.3849\\35\\-28.32031\\-297.3585\\35\\-34.17969\\-296.5983\\35\\-36.13281\\-296.1723\\35\\-38.08594\\-295.5853\\35\\-40.03906\\-295.2546\\35\\-43.94531\\-294.7003\\35\\-45.89844\\-294.2859\\35\\-47.85156\\-293.6361\\35\\-49.80469\\-293.1658\\35\\-53.71094\\-292.3802\\35\\-55.66406\\-291.599\\35\\-59.57031\\-290.8415\\35\\-61.52344\\-290.3642\\35\\-63.47656\\-289.6523\\35\\-65.42969\\-289.3285\\35\\-69.33594\\-288.8179\\35\\-71.28906\\-288.3727\\35\\-73.24219\\-287.7646\\35\\-75.19531\\-287.3264\\35\\-79.10156\\-286.5647\\35\\-81.05469\\-285.9096\\35\\-83.00781\\-285.3798\\35\\-84.96094\\-284.9746\\35\\-86.91406\\-284.4038\\35\\-88.86719\\-283.6295\\35\\-92.77344\\-282.774\\35\\-94.72656\\-281.9359\\35\\-98.63281\\-280.7763\\35\\-100.5859\\-279.7453\\35\\-102.5391\\-278.9755\\35\\-104.4922\\-277.767\\35\\-106.4453\\-276.9594\\35\\-108.3984\\-275.7303\\35\\-110.3516\\-274.8284\\35\\-112.3047\\-273.4887\\35\\-114.2578\\-272.0159\\35\\-116.2109\\-270.7866\\35\\-118.1641\\-269.4385\\35\\-121.8783\\-266.6641\\35\\-124.1921\\-264.7109\\35\\-125.9766\\-263.3286\\35\\-127.9297\\-261.6274\\35\\-134.6062\\-254.9453\\35\\-136.241\\-252.9922\\35\\-137.5732\\-251.0391\\35\\-140.546\\-247.1328\\35\\-141.8837\\-245.1797\\35\\-142.8158\\-243.2266\\35\\-144.0303\\-241.2734\\35\\-144.8353\\-239.3203\\35\\-146.077\\-237.3672\\35\\-146.8798\\-235.4141\\35\\-147.9239\\-233.4609\\35\\-149.0673\\-229.5547\\35\\-149.9414\\-227.6016\\35\\-150.796\\-223.6953\\35\\-151.5789\\-221.7422\\35\\-152.1434\\-219.7891\\35\\-152.5704\\-217.8359\\35\\-153.7724\\-213.9297\\35\\-154.7402\\-208.0703\\35\\-155.5139\\-204.1641\\35\\-155.992\\-200.2578\\35\\-156.2731\\-194.3984\\35\\-156.3579\\-190.4922\\35\\-156.3806\\-184.6328\\35\\-156.3193\\-180.7266\\35\\-156.1735\\-176.8203\\35\\-155.9098\\-172.9141\\35\\-155.387\\-169.0078\\35\\-154.9341\\-167.0547\\35\\-154.0139\\-161.1953\\35\\-153.6284\\-159.2422\\35\\-152.9729\\-157.2891\\35\\-152.481\\-155.3359\\35\\-152.0996\\-153.3828\\35\\-151.5158\\-151.4297\\35\\-150.7501\\-149.4766\\35\\-149.889\\-145.5703\\35\\-149.0698\\-143.6172\\35\\-147.9556\\-139.7109\\35\\-146.998\\-137.7578\\35\\-146.3092\\-135.8047\\35\\-145.3651\\-133.8516\\35\\-143.7916\\-129.9453\\35\\-142.8269\\-127.9922\\35\\-142.2547\\-126.0391\\35\\-141.2229\\-124.0859\\35\\-140.433\\-122.1328\\35\\-139.2195\\-120.1797\\35\\-138.3445\\-118.2266\\35\\-137.1644\\-116.2734\\35\\-136.4212\\-114.3203\\35\\-135.2573\\-112.3672\\35\\-134.2431\\-110.4141\\35\\-131.8359\\-106.9699\\35\\-131.4438\\-106.5078\\35\\-130.2426\\-104.5547\\35\\-128.7658\\-102.6016\\35\\-127.0487\\-100.6484\\35\\-122.0703\\-95.69827\\35\\-120.1172\\-94.06306\\35\\-116.2109\\-91.50487\\35\\-114.2578\\-90.07006\\35\\-112.3047\\-89.17199\\35\\-110.3516\\-88.09898\\35\\-108.3984\\-87.41138\\35\\-106.4453\\-86.40175\\35\\-104.4922\\-85.72099\\35\\-102.5391\\-84.7285\\35\\-98.63281\\-83.26277\\35\\-96.67969\\-82.35244\\35\\-94.72656\\-81.84808\\35\\-92.77344\\-81.0765\\35\\-90.82031\\-80.46407\\35\\-86.91406\\-79.42497\\35\\-84.96094\\-78.73341\\35\\-83.00781\\-78.1875\\35\\-81.05469\\-77.76808\\35\\-77.14844\\-76.7746\\35\\-75.19531\\-76.3961\\35\\-73.24219\\-76.17043\\35\\-69.33594\\-75.81855\\35\\-67.38281\\-75.5621\\35\\-65.42969\\-74.91361\\35\\-63.47656\\-74.79173\\35\\-59.57031\\-74.65002\\35\\-51.75781\\-74.63146\\35\\-45.89844\\-74.85345\\35\\-43.94531\\-75.00126\\35\\-41.99219\\-75.64707\\35\\-40.03906\\-75.86895\\35\\-34.17969\\-76.41411\\35\\-32.22656\\-76.73568\\35\\-28.32031\\-77.69922\\35\\-24.41406\\-78.5\\35\\-20.50781\\-79.63573\\35\\-16.60156\\-80.50605\\35\\-14.64844\\-81.35006\\35\\-12.69531\\-82.00777\\35\\-10.74219\\-82.5322\\35\\-8.789063\\-83.45687\\35\\-6.835938\\-83.94643\\35\\-4.882813\\-84.22962\\35\\-2.929688\\-84.31815\\35\\0.9765625\\-84.29712\\35\\6.835938\\-84.36626\\35\\8.789063\\-84.13304\\35\\10.74219\\-83.70293\\35\\12.69531\\-82.74718\\35\\14.64844\\-82.00667\\35\\18.55469\\-80.25259\\35\\20.50781\\-79.51591\\35\\22.46094\\-78.61651\\35\\24.41406\\-77.88843\\35\\28.32031\\-76.55779\\35\\30.27344\\-76.24607\\35\\36.13281\\-75.58104\\35\\38.08594\\-74.94563\\35\\40.03906\\-74.76953\\35\\43.94531\\-74.59562\\35\\49.80469\\-74.49052\\35\\57.61719\\-74.63636\\35\\61.52344\\-74.82963\\35\\63.47656\\-75.13261\\35\\65.42969\\-75.5948\\35\\67.38281\\-75.79335\\35\\73.24219\\-76.2458\\35\\75.19531\\-76.43807\\35\\77.14844\\-76.7487\\35\\81.05469\\-77.70532\\35\\84.96094\\-78.38174\\35\\86.91406\\-78.81529\\35\\88.86719\\-79.43574\\35\\92.77344\\-80.24716\\35\\94.72656\\-80.70856\\35\\96.67969\\-81.52055\\35\\100.5859\\-82.54398\\35\\102.5391\\-83.49633\\35\\104.4922\\-84.21888\\35\\108.3984\\-85.97688\\35\\110.3516\\-86.76363\\35\\112.3047\\-87.77896\\35\\114.2578\\-88.57784\\35\\116.2109\\-89.93021\\35\\119.969\\-92.83594\\35\\122.3063\\-94.78906\\35\\124.0234\\-96.85866\\35\\125.3581\\-98.69531\\35\\126.9904\\-100.6484\\35\\128.5077\\-102.6016\\35\\129.4936\\-104.5547\\35\\132.0243\\-108.4609\\35\\133.0857\\-110.4141\\35\\134.3675\\-112.3672\\35\\135.2405\\-114.3203\\35\\136.3782\\-116.2734\\35\\137.0049\\-118.2266\\35\\138.1566\\-120.1797\\35\\138.9286\\-122.1328\\35\\140.0328\\-124.0859\\35\\140.7813\\-126.0391\\35\\141.7593\\-127.9922\\35\\142.4583\\-129.9453\\35\\142.9572\\-131.8984\\35\\143.8779\\-133.8516\\35\\145.1317\\-137.7578\\35\\146.0732\\-139.7109\\35\\146.64\\-141.6641\\35\\148.0736\\-145.5703\\35\\148.8607\\-149.4766\\35\\149.9911\\-153.3828\\35\\150.5325\\-157.2891\\35\\150.882\\-159.2422\\35\\151.8755\\-163.1484\\35\\152.1295\\-165.1016\\35\\152.5236\\-169.0078\\35\\153.4947\\-174.8672\\35\\153.823\\-178.7734\\35\\154.0125\\-184.6328\\35\\154.0232\\-192.4453\\35\\153.823\\-200.2578\\35\\153.6021\\-204.1641\\35\\153.4151\\-206.1172\\35\\152.6345\\-211.9766\\35\\152.1752\\-215.8828\\35\\151.867\\-217.8359\\35\\150.7103\\-221.7422\\35\\149.9949\\-225.6484\\35\\149.2248\\-227.6016\\35\\147.9201\\-231.5078\\35\\146.7733\\-233.4609\\35\\145.7935\\-235.4141\\35\\143.5547\\-238.9505\\35\\143.264\\-239.3203\\35\\142.2721\\-241.2734\\35\\140.7314\\-243.2266\\35\\139.0728\\-245.1797\\35\\135.9883\\-249.0859\\35\\129.8828\\-255.1794\\35\\127.9031\\-256.8984\\35\\125.9766\\-258.4566\\35\\123.3225\\-260.8047\\35\\120.1172\\-263.3851\\35\\118.1641\\-264.6207\\35\\114.2578\\-267.4799\\35\\112.3047\\-268.6254\\35\\110.3516\\-269.6247\\35\\108.3984\\-270.7355\\35\\106.4453\\-271.6477\\35\\104.4922\\-272.7658\\35\\100.5859\\-274.5452\\35\\98.63281\\-275.3057\\35\\96.67969\\-275.8333\\35\\94.72656\\-276.6829\\35\\92.77344\\-277.287\\35\\90.82031\\-277.7833\\35\\88.86719\\-278.6098\\35\\84.96094\\-279.7226\\35\\83.00781\\-280.4879\\35\\81.05469\\-281.0478\\35\\77.14844\\-281.9423\\35\\75.19531\\-282.6727\\35\\71.28906\\-283.5229\\35\\67.38281\\-285\\35\\65.42969\\-285.5424\\35\\63.47656\\-286.431\\35\\59.57031\\-287.5824\\35\\57.61719\\-288.4264\\35\\55.66406\\-288.9692\\35\\53.71094\\-289.3407\\35\\49.80469\\-290.8277\\35\\47.85156\\-291.3133\\35\\45.89844\\-292.1213\\35\\43.94531\\-292.8063\\35\\41.99219\\-293.304\\35\\40.03906\\-294.0612\\35\\38.08594\\-294.6728\\35\\34.17969\\-295.3929\\35\\30.27344\\-296.6255\\35\\26.36719\\-297.2612\\35\\22.46094\\-298.4109\\35\\16.60156\\-299.2589\\35\\12.69531\\-299.9619\\35\\10.74219\\-300.224\\35\\8.789063\\-300.3759\\35\\4.882813\\-300.5389\\35\\0.9765625\\-300.601\\35\\-4.882813\\-300.5313\\35\\-8.789063\\-300.3555\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "303" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "144" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-12.69531\\-300.091\\37\\-16.60156\\-299.4311\\37\\-24.41406\\-298.4109\\37\\-28.32031\\-297.3873\\37\\-34.17969\\-296.5904\\37\\-36.13281\\-296.1324\\37\\-38.08594\\-295.5636\\37\\-43.94531\\-294.6648\\37\\-45.89844\\-294.2115\\37\\-47.85156\\-293.5436\\37\\-49.80469\\-293.0947\\37\\-51.75781\\-292.7449\\37\\-53.71094\\-292.1901\\37\\-55.66406\\-291.4567\\37\\-59.57031\\-290.722\\37\\-63.47656\\-289.4935\\37\\-67.38281\\-288.988\\37\\-69.33594\\-288.6269\\37\\-73.24219\\-287.5034\\37\\-77.14844\\-286.7379\\37\\-81.05469\\-285.5608\\37\\-84.96094\\-284.6795\\37\\-86.91406\\-283.8963\\37\\-88.86719\\-283.3947\\37\\-90.82031\\-283.0305\\37\\-92.77344\\-282.4198\\37\\-94.72656\\-281.6568\\37\\-96.67969\\-281.1507\\37\\-98.63281\\-280.3893\\37\\-100.5859\\-279.4534\\37\\-102.5391\\-278.6437\\37\\-104.4922\\-277.5039\\37\\-106.7096\\-276.4297\\37\\-110.3403\\-274.4766\\37\\-112.3047\\-273.2415\\37\\-114.2578\\-271.7365\\37\\-116.2109\\-270.4022\\37\\-118.1641\\-269.2166\\37\\-121.441\\-266.6641\\37\\-124.0234\\-264.411\\37\\-125.9766\\-262.9547\\37\\-128.4846\\-260.8047\\37\\-134.2879\\-254.9453\\37\\-135.8154\\-252.9922\\37\\-137.1824\\-251.0391\\37\\-140.3052\\-247.1328\\37\\-141.6016\\-245.0132\\37\\-143.7262\\-241.2734\\37\\-144.6076\\-239.3203\\37\\-145.7859\\-237.3672\\37\\-146.6453\\-235.4141\\37\\-147.6506\\-233.4609\\37\\-148.3191\\-231.5078\\37\\-148.8477\\-229.5547\\37\\-149.7085\\-227.6016\\37\\-150.2355\\-225.6484\\37\\-150.6076\\-223.6953\\37\\-151.9619\\-219.7891\\37\\-152.8719\\-215.8828\\37\\-153.532\\-213.9297\\37\\-153.9621\\-211.9766\\37\\-154.8626\\-206.1172\\37\\-155.5777\\-202.2109\\37\\-155.9639\\-198.3047\\37\\-156.1488\\-194.3984\\37\\-156.25\\-190.4922\\37\\-156.2847\\-186.5859\\37\\-156.2558\\-182.6797\\37\\-156.0364\\-176.8203\\37\\-155.7112\\-172.9141\\37\\-154.6913\\-167.0547\\37\\-154.1242\\-163.1484\\37\\-153.7816\\-161.1953\\37\\-152.6599\\-157.2891\\37\\-151.8409\\-153.3828\\37\\-151.0533\\-151.4297\\37\\-150.5168\\-149.4766\\37\\-150.1801\\-147.5234\\37\\-149.5602\\-145.5703\\37\\-148.7997\\-143.6172\\37\\-148.3191\\-141.6641\\37\\-147.6163\\-139.7109\\37\\-146.692\\-137.7578\\37\\-146.0049\\-135.8047\\37\\-144.9577\\-133.8516\\37\\-144.3028\\-131.8984\\37\\-143.3368\\-129.9453\\37\\-141.9936\\-126.0391\\37\\-140.925\\-124.0859\\37\\-140.1602\\-122.1328\\37\\-138.9146\\-120.1797\\37\\-138.0744\\-118.2266\\37\\-136.9105\\-116.2734\\37\\-136.1597\\-114.3203\\37\\-134.9696\\-112.3672\\37\\-133.9111\\-110.4141\\37\\-132.6015\\-108.4609\\37\\-131.1035\\-106.5078\\37\\-128.5087\\-102.6016\\37\\-126.7424\\-100.6484\\37\\-122.0703\\-95.9596\\37\\-120.1172\\-94.35424\\37\\-118.1641\\-93.20403\\37\\-114.2578\\-90.31813\\37\\-112.3047\\-89.42793\\37\\-110.3516\\-88.31186\\37\\-108.3984\\-87.61661\\37\\-106.4453\\-86.59267\\37\\-104.4922\\-85.92004\\37\\-100.5859\\-84.15475\\37\\-98.63281\\-83.53625\\37\\-96.67969\\-82.56866\\37\\-92.77344\\-81.33844\\37\\-90.82031\\-80.5863\\37\\-86.91406\\-79.559\\37\\-84.96094\\-78.87109\\37\\-83.00781\\-78.29534\\37\\-79.10156\\-77.4479\\37\\-75.19531\\-76.49437\\37\\-73.24219\\-76.24593\\37\\-67.38281\\-75.73307\\37\\-63.47656\\-74.97993\\37\\-59.57031\\-74.77315\\37\\-57.61719\\-74.73089\\37\\-51.75781\\-74.70279\\37\\-47.85156\\-74.85345\\37\\-45.89844\\-75.03436\\37\\-43.94531\\-75.47566\\37\\-41.99219\\-75.77822\\37\\-34.17969\\-76.52919\\37\\-32.22656\\-76.90147\\37\\-30.27344\\-77.41917\\37\\-26.36719\\-78.19318\\37\\-24.41406\\-78.63731\\37\\-20.50781\\-79.75766\\37\\-16.60156\\-80.70856\\37\\-14.64844\\-81.49498\\37\\-10.74219\\-82.58881\\37\\-8.789063\\-83.43226\\37\\-6.835938\\-83.83433\\37\\-4.882813\\-83.98369\\37\\-2.929688\\-83.9767\\37\\0.9765625\\-83.85767\\37\\2.929688\\-83.85767\\37\\6.835938\\-83.97498\\37\\8.789063\\-83.93266\\37\\10.74219\\-83.63998\\37\\12.69531\\-82.77151\\37\\14.64844\\-82.08131\\37\\16.60156\\-81.28125\\37\\18.55469\\-80.36257\\37\\20.50781\\-79.69612\\37\\22.46094\\-78.76733\\37\\24.41406\\-78.01766\\37\\26.36719\\-77.45683\\37\\28.32031\\-76.71606\\37\\30.27344\\-76.33685\\37\\36.13281\\-75.73967\\37\\38.08594\\-75.41679\\37\\40.03906\\-74.9375\\37\\43.94531\\-74.70279\\37\\49.80469\\-74.59562\\37\\51.75781\\-74.609\\37\\57.61719\\-74.79523\\37\\59.57031\\-74.89354\\37\\61.52344\\-75.13261\\37\\63.47656\\-75.58334\\37\\65.42969\\-75.7774\\37\\73.24219\\-76.36968\\37\\75.19531\\-76.63246\\37\\77.14844\\-76.9947\\37\\79.10156\\-77.50255\\37\\84.96094\\-78.58387\\37\\88.86719\\-79.65234\\37\\92.77344\\-80.41087\\37\\94.72656\\-80.96875\\37\\96.67969\\-81.74908\\37\\98.63281\\-82.16477\\37\\100.5859\\-82.76084\\37\\102.5391\\-83.71937\\37\\104.4922\\-84.39774\\37\\106.4453\\-85.42355\\37\\108.3984\\-86.1551\\37\\110.3516\\-87.11264\\37\\112.3047\\-87.95313\\37\\114.2456\\-88.92969\\37\\116.2109\\-90.13494\\37\\119.5938\\-92.83594\\37\\121.9383\\-94.78906\\37\\124.0234\\-97.29907\\37\\125.0473\\-98.69531\\37\\126.7641\\-100.6484\\37\\128.2263\\-102.6016\\37\\129.2471\\-104.5547\\37\\130.5703\\-106.5078\\37\\131.573\\-108.4609\\37\\131.8359\\-108.7745\\37\\133.7891\\-111.9965\\37\\134.0771\\-112.3672\\37\\135.0098\\-114.3203\\37\\136.1647\\-116.2734\\37\\136.8401\\-118.2266\\37\\137.8569\\-120.1797\\37\\138.7036\\-122.1328\\37\\139.7155\\-124.0859\\37\\141.3933\\-127.9922\\37\\142.3035\\-129.9453\\37\\142.7821\\-131.8984\\37\\144.3327\\-135.8047\\37\\144.8821\\-137.7578\\37\\145.8247\\-139.7109\\37\\147.0488\\-143.6172\\37\\147.8684\\-145.5703\\37\\148.3387\\-147.5234\\37\\148.6987\\-149.4766\\37\\149.1718\\-151.4297\\37\\149.8061\\-153.3828\\37\\150.1872\\-155.3359\\37\\150.6911\\-159.2422\\37\\151.0832\\-161.1953\\37\\151.649\\-163.1484\\37\\151.9809\\-165.1016\\37\\152.4131\\-169.0078\\37\\152.8965\\-172.9141\\37\\153.4288\\-176.8203\\37\\153.6243\\-178.7734\\37\\153.8028\\-182.6797\\37\\153.8728\\-188.5391\\37\\153.8483\\-192.4453\\37\\153.7457\\-196.3516\\37\\153.5794\\-200.2578\\37\\153.4288\\-202.2109\\37\\152.2174\\-213.9297\\37\\151.9661\\-215.8828\\37\\151.5416\\-217.8359\\37\\150.8916\\-219.7891\\37\\150.2173\\-223.6953\\37\\149.7228\\-225.6484\\37\\148.906\\-227.6016\\37\\148.372\\-229.5547\\37\\147.5886\\-231.5078\\37\\144.2932\\-237.3672\\37\\142.9452\\-239.3203\\37\\141.9705\\-241.2734\\37\\140.4665\\-243.2266\\37\\137.0157\\-247.1328\\37\\135.7422\\-248.8156\\37\\131.5207\\-252.9922\\37\\129.8828\\-254.6833\\37\\127.3837\\-256.8984\\37\\125.9766\\-258.0514\\37\\122.0703\\-261.5421\\37\\120.1172\\-262.9791\\37\\118.1641\\-264.1345\\37\\117.4837\\-264.7109\\37\\114.2578\\-267.0844\\37\\112.3047\\-268.1155\\37\\110.3516\\-269.3303\\37\\108.3984\\-270.1095\\37\\106.4453\\-271.278\\37\\104.4922\\-272.0575\\37\\102.5391\\-273.1991\\37\\100.5859\\-273.9089\\37\\98.63281\\-274.8931\\37\\94.72656\\-276.0181\\37\\92.77344\\-276.8748\\37\\88.86719\\-277.8978\\37\\86.91406\\-278.7672\\37\\83.00781\\-279.8572\\37\\81.05469\\-280.6503\\37\\77.14844\\-281.5986\\37\\75.19531\\-282.2024\\37\\73.24219\\-282.9128\\37\\71.28906\\-283.3281\\37\\69.33594\\-283.8583\\37\\67.38281\\-284.7897\\37\\65.42969\\-285.3545\\37\\61.52344\\-286.9185\\37\\59.57031\\-287.4518\\37\\57.61719\\-288.2771\\37\\55.66406\\-288.9114\\37\\53.71094\\-289.2907\\37\\51.75781\\-289.9275\\37\\49.80469\\-290.7948\\37\\47.85156\\-291.2827\\37\\43.94531\\-292.8187\\37\\41.99219\\-293.322\\37\\40.03906\\-294.1047\\37\\38.08594\\-294.7045\\37\\34.17969\\-295.4312\\37\\32.22656\\-296.1048\\37\\30.27344\\-296.6665\\37\\26.36719\\-297.2952\\37\\22.46094\\-298.4682\\37\\18.55469\\-299.0152\\37\\14.64844\\-299.6494\\37\\12.69531\\-300.0542\\37\\10.74219\\-300.2883\\37\\6.835938\\-300.5126\\37\\2.929688\\-300.6136\\37\\-0.9765625\\-300.6385\\37\\-4.882813\\-300.5647\\37\\-8.789063\\-300.4244\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "287" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "145" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-299.9048\\39\\-18.55469\\-299.2071\\39\\-24.41406\\-298.436\\39\\-28.32031\\-297.4048\\39\\-30.27344\\-297.0909\\39\\-34.17969\\-296.5983\\39\\-38.08594\\-295.5396\\39\\-43.94531\\-294.6331\\39\\-45.89844\\-294.1317\\39\\-47.85156\\-293.4506\\39\\-51.75781\\-292.6503\\39\\-53.71094\\-291.9462\\39\\-55.66406\\-291.3402\\39\\-59.57031\\-290.5691\\39\\-61.52344\\-289.7484\\39\\-63.47656\\-289.3238\\39\\-67.38281\\-288.8425\\39\\-69.33594\\-288.3854\\39\\-71.28906\\-287.7432\\39\\-73.24219\\-287.2871\\39\\-75.19531\\-286.929\\39\\-77.14844\\-286.4428\\39\\-79.10156\\-285.7311\\39\\-83.00781\\-284.8879\\39\\-86.91406\\-283.5734\\39\\-90.82031\\-282.7773\\39\\-92.77344\\-281.9925\\39\\-96.67969\\-280.8914\\39\\-98.63281\\-279.9285\\39\\-100.5859\\-279.1855\\39\\-102.5391\\-278.1569\\39\\-104.4922\\-277.2842\\39\\-106.4453\\-276.1837\\39\\-108.3984\\-275.3426\\39\\-110.3516\\-274.0956\\39\\-112.3047\\-272.9596\\39\\-112.824\\-272.5234\\39\\-115.6494\\-270.5703\\39\\-116.2109\\-270.082\\39\\-118.1641\\-268.9228\\39\\-121.0938\\-266.6641\\39\\-124.0234\\-264.0668\\39\\-127.9297\\-260.8612\\39\\-131.776\\-256.8984\\39\\-133.7972\\-254.9453\\39\\-137.6953\\-250.1176\\39\\-140.0099\\-247.1328\\39\\-141.1393\\-245.1797\\39\\-142.4143\\-243.2266\\39\\-145.3662\\-237.3672\\39\\-146.4304\\-235.4141\\39\\-148.1695\\-231.5078\\39\\-148.6832\\-229.5547\\39\\-150.0712\\-225.6484\\39\\-150.9543\\-221.7422\\39\\-151.7342\\-219.7891\\39\\-152.6345\\-215.8828\\39\\-153.7631\\-211.9766\\39\\-154.0896\\-210.0234\\39\\-154.9341\\-204.1641\\39\\-155.5873\\-200.2578\\39\\-155.7781\\-198.3047\\39\\-155.9966\\-194.3984\\39\\-156.125\\-190.4922\\39\\-156.1553\\-186.5859\\39\\-156.125\\-182.6797\\39\\-155.9842\\-178.7734\\39\\-155.6871\\-174.8672\\39\\-155.4436\\-172.9141\\39\\-155.0605\\-170.9609\\39\\-154.4655\\-167.0547\\39\\-153.9243\\-163.1484\\39\\-153.4947\\-161.1953\\39\\-152.8474\\-159.2422\\39\\-152.027\\-155.3359\\39\\-151.448\\-153.3828\\39\\-150.7463\\-151.4297\\39\\-149.9414\\-147.5234\\39\\-149.1681\\-145.5703\\39\\-148.069\\-141.6641\\39\\-147.1749\\-139.7109\\39\\-145.6026\\-135.8047\\39\\-144.6763\\-133.8516\\39\\-144.0365\\-131.8984\\39\\-143.0143\\-129.9453\\39\\-142.4744\\-127.9922\\39\\-141.6567\\-126.0391\\39\\-139.797\\-122.1328\\39\\-138.6773\\-120.1797\\39\\-136.7247\\-116.2734\\39\\-135.8613\\-114.3203\\39\\-134.7239\\-112.3672\\39\\-132.3085\\-108.4609\\39\\-129.3772\\-104.5547\\39\\-128.1834\\-102.6016\\39\\-126.3873\\-100.6484\\39\\-122.0703\\-96.28981\\39\\-120.0266\\-94.78906\\39\\-118.1641\\-93.52568\\39\\-116.2109\\-91.98872\\39\\-114.2578\\-90.67759\\39\\-112.3047\\-89.68514\\39\\-110.3516\\-88.5897\\39\\-108.3984\\-87.83569\\39\\-106.4453\\-86.84686\\39\\-102.5391\\-85.27662\\39\\-100.5859\\-84.36678\\39\\-98.63281\\-83.73911\\39\\-96.67969\\-82.80067\\39\\-94.72656\\-82.10574\\39\\-92.77344\\-81.59508\\39\\-90.82031\\-80.73078\\39\\-86.91406\\-79.73261\\39\\-83.00781\\-78.51497\\39\\-81.05469\\-78.03056\\39\\-79.10156\\-77.64713\\39\\-75.19531\\-76.61849\\39\\-71.28906\\-76.1597\\39\\-65.42969\\-75.67634\\39\\-63.47656\\-75.41679\\39\\-61.52344\\-75.02181\\39\\-59.57031\\-74.89923\\39\\-55.66406\\-74.7841\\39\\-51.75781\\-74.78055\\39\\-47.85156\\-75.00341\\39\\-45.89844\\-75.49068\\39\\-43.94531\\-75.73599\\39\\-36.13281\\-76.44744\\39\\-34.17969\\-76.68709\\39\\-30.27344\\-77.61838\\39\\-26.36719\\-78.36149\\39\\-24.41406\\-78.81529\\39\\-22.46094\\-79.44206\\39\\-18.55469\\-80.3275\\39\\-16.60156\\-80.85825\\39\\-14.64844\\-81.68187\\39\\-10.74219\\-82.62642\\39\\-8.789063\\-83.39354\\39\\-6.835938\\-83.70327\\39\\-4.882813\\-83.72738\\39\\0.9765625\\-83.39826\\39\\4.882813\\-83.42477\\39\\8.789063\\-83.62003\\39\\10.74219\\-83.44855\\39\\12.69531\\-82.73283\\39\\16.60156\\-81.51212\\39\\18.55469\\-80.49399\\39\\20.50781\\-79.86795\\39\\22.46094\\-78.94027\\39\\24.41406\\-78.16324\\39\\26.36719\\-77.64713\\39\\28.32031\\-76.94645\\39\\30.27344\\-76.44096\\39\\32.22656\\-76.21098\\39\\38.08594\\-75.67634\\39\\40.03906\\-75.19785\\39\\41.99219\\-74.90625\\39\\47.85156\\-74.75868\\39\\51.75781\\-74.75868\\39\\55.66406\\-74.89641\\39\\57.61719\\-75.07064\\39\\61.52344\\-75.61724\\39\\69.33594\\-76.18327\\39\\73.24219\\-76.55779\\39\\76.71067\\-77.21094\\39\\79.10156\\-77.73631\\39\\83.00781\\-78.37943\\39\\84.96094\\-78.82578\\39\\86.91406\\-79.44411\\39\\92.77344\\-80.5732\\39\\96.67969\\-81.89233\\39\\98.63281\\-82.32424\\39\\102.5391\\-83.90493\\39\\104.4922\\-84.616\\39\\106.4453\\-85.66431\\39\\108.3984\\-86.36772\\39\\110.3516\\-87.41138\\39\\112.3047\\-88.12215\\39\\114.2578\\-89.31895\\39\\116.2109\\-90.40791\\39\\119.2062\\-92.83594\\39\\121.5025\\-94.78906\\39\\122.0703\\-95.36578\\39\\125.9766\\-100.0744\\39\\126.4951\\-100.6484\\39\\127.9297\\-102.6951\\39\\130.3223\\-106.5078\\39\\131.2713\\-108.4609\\39\\131.8359\\-109.1955\\39\\133.7891\\-112.4865\\39\\135.8739\\-116.2734\\39\\137.4758\\-120.1797\\39\\138.5135\\-122.1328\\39\\139.3704\\-124.0859\\39\\140.4001\\-126.0391\\39\\141.1133\\-127.9922\\39\\142.1186\\-129.9453\\39\\143.2172\\-133.8516\\39\\144.1525\\-135.8047\\39\\144.6886\\-137.7578\\39\\146.2668\\-141.6641\\39\\146.808\\-143.6172\\39\\147.614\\-145.5703\\39\\148.1771\\-147.5234\\39\\148.9597\\-151.4297\\39\\149.5743\\-153.3828\\39\\150.0423\\-155.3359\\39\\150.5497\\-159.2422\\39\\150.8634\\-161.1953\\39\\151.8111\\-165.1016\\39\\152.0934\\-167.0547\\39\\152.6894\\-172.9141\\39\\153.343\\-178.7734\\39\\153.4947\\-180.7266\\39\\153.6351\\-184.6328\\39\\153.6668\\-188.5391\\39\\153.6243\\-192.4453\\39\\153.4689\\-196.3516\\39\\153.2241\\-200.2578\\39\\152.5866\\-208.0703\\39\\152.0165\\-213.9297\\39\\151.6927\\-215.8828\\39\\151.1195\\-217.8359\\39\\150.6606\\-219.7891\\39\\150.0213\\-223.6953\\39\\148.6863\\-227.6016\\39\\148.1506\\-229.5547\\39\\146.2294\\-233.4609\\39\\144.978\\-235.4141\\39\\144.0364\\-237.3672\\39\\141.6016\\-241.1819\\39\\140.1505\\-243.2266\\39\\139.6484\\-243.7469\\39\\135.0222\\-249.0859\\39\\130.9998\\-252.9922\\39\\129.8828\\-254.2129\\39\\126.9458\\-256.8984\\39\\124.6533\\-258.8516\\39\\122.0703\\-261.1764\\39\\120.1172\\-262.3969\\39\\116.2109\\-265.2843\\39\\114.0685\\-266.6641\\39\\110.7845\\-268.6172\\39\\110.3516\\-268.9353\\39\\108.3984\\-269.7289\\39\\106.4453\\-270.7628\\39\\104.4922\\-271.6072\\39\\102.5391\\-272.6336\\39\\98.63281\\-274.2289\\39\\96.67969\\-275.1212\\39\\94.72656\\-275.6148\\39\\92.77344\\-276.2237\\39\\90.82031\\-277.0255\\39\\88.86719\\-277.4844\\39\\86.91406\\-278.0785\\39\\84.96094\\-278.9096\\39\\81.05469\\-280.0423\\39\\79.10156\\-280.8211\\39\\75.19531\\-281.7908\\39\\73.24219\\-282.5857\\39\\69.33594\\-283.6092\\39\\67.38281\\-284.5371\\39\\63.47656\\-285.8922\\39\\61.52344\\-286.7933\\39\\59.57031\\-287.3365\\39\\55.66406\\-288.8389\\39\\53.71094\\-289.2552\\39\\51.75781\\-289.8319\\39\\49.80469\\-290.7613\\39\\47.85156\\-291.2663\\39\\43.94531\\-292.8165\\39\\41.99219\\-293.333\\39\\40.03906\\-294.1326\\39\\38.08594\\-294.7121\\39\\34.17969\\-295.45\\39\\32.22656\\-296.1459\\39\\30.27344\\-296.692\\39\\26.36719\\-297.3386\\39\\22.46094\\-298.4914\\39\\16.60156\\-299.3523\\39\\12.69531\\-300.1029\\39\\10.74219\\-300.3376\\39\\4.882813\\-300.6136\\39\\-0.9765625\\-300.6782\\39\\-4.882813\\-300.6094\\39\\-8.789063\\-300.4633\\39\\-12.69531\\-300.182\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "146" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-299.9893\\41\\-18.55469\\-299.2478\\41\\-24.41406\\-298.476\\41\\-28.32031\\-297.4168\\41\\-30.27344\\-297.0968\\41\\-34.17969\\-296.5824\\41\\-38.08594\\-295.5158\\41\\-43.94531\\-294.601\\41\\-47.85156\\-293.3733\\41\\-51.75781\\-292.5515\\41\\-53.71094\\-291.7598\\41\\-55.66406\\-291.2393\\41\\-57.61719\\-290.8699\\41\\-59.57031\\-290.3758\\41\\-61.52344\\-289.5355\\41\\-63.47656\\-289.2186\\41\\-65.42969\\-289.0185\\41\\-67.38281\\-288.6817\\41\\-71.28906\\-287.4875\\41\\-75.19531\\-286.7233\\41\\-77.14844\\-286.0184\\41\\-79.10156\\-285.4445\\41\\-83.00781\\-284.5677\\41\\-84.96094\\-283.8001\\41\\-86.91406\\-283.3549\\41\\-88.86719\\-283.023\\41\\-90.82031\\-282.4198\\41\\-92.77344\\-281.6916\\41\\-94.72656\\-281.1869\\41\\-96.67969\\-280.5645\\41\\-98.63281\\-279.5938\\41\\-100.5859\\-278.9191\\41\\-102.5391\\-277.7702\\41\\-104.4922\\-277.0416\\41\\-106.4453\\-275.8633\\41\\-108.3984\\-275.1039\\41\\-115.2836\\-270.5703\\41\\-116.2109\\-269.8247\\41\\-118.0725\\-268.6172\\41\\-120.1172\\-267.1494\\41\\-123.0395\\-264.7109\\41\\-127.5034\\-260.8047\\41\\-131.3365\\-256.8984\\41\\-133.7891\\-254.4532\\41\\-136.6726\\-251.0391\\41\\-138.1805\\-249.0859\\41\\-139.6484\\-246.9984\\41\\-141.6016\\-244.0239\\41\\-142.1928\\-243.2266\\41\\-143.0129\\-241.2734\\41\\-144.2195\\-239.3203\\41\\-145.0357\\-237.3672\\41\\-146.2195\\-235.4141\\41\\-146.9789\\-233.4609\\41\\-147.9839\\-231.5078\\41\\-149.0839\\-227.6016\\41\\-149.889\\-225.6484\\41\\-150.7221\\-221.7422\\41\\-151.4338\\-219.7891\\41\\-152.0412\\-217.8359\\41\\-152.8719\\-213.9297\\41\\-153.5073\\-211.9766\\41\\-153.9397\\-210.0234\\41\\-154.7181\\-204.1641\\41\\-155.5494\\-198.3047\\41\\-155.8415\\-194.3984\\41\\-156.0195\\-188.5391\\41\\-155.9719\\-182.6797\\41\\-155.8008\\-178.7734\\41\\-155.4436\\-174.8672\\41\\-154.7917\\-170.9609\\41\\-154.0132\\-165.1016\\41\\-153.6691\\-163.1484\\41\\-152.5745\\-159.2422\\41\\-151.7639\\-155.3359\\41\\-151.0189\\-153.3828\\41\\-150.5182\\-151.4297\\41\\-150.173\\-149.4766\\41\\-149.6169\\-147.5234\\41\\-148.8664\\-145.5703\\41\\-148.3665\\-143.6172\\41\\-147.7567\\-141.6641\\41\\-146.804\\-139.7109\\41\\-146.1457\\-137.7578\\41\\-145.1317\\-135.8047\\41\\-144.4658\\-133.8516\\41\\-143.6974\\-131.8984\\41\\-142.7917\\-129.9453\\41\\-142.2714\\-127.9922\\41\\-141.2669\\-126.0391\\41\\-140.4455\\-124.0859\\41\\-139.3527\\-122.1328\\41\\-138.4666\\-120.1797\\41\\-137.3175\\-118.2266\\41\\-136.5714\\-116.2734\\41\\-134.4954\\-112.3672\\41\\-133.132\\-110.4141\\41\\-131.9453\\-108.4609\\41\\-130.6253\\-106.5078\\41\\-127.9297\\-102.9271\\41\\-125.9766\\-100.71\\41\\-122.0703\\-96.71875\\41\\-120.1172\\-95.28413\\41\\-116.2109\\-92.24303\\41\\-112.3047\\-89.92456\\41\\-110.3516\\-88.87225\\41\\-106.4453\\-87.15625\\41\\-104.4922\\-86.21836\\41\\-102.5391\\-85.51172\\41\\-100.5859\\-84.57684\\41\\-98.63281\\-83.91629\\41\\-94.72656\\-82.2324\\41\\-92.77344\\-81.74039\\41\\-90.82031\\-80.91279\\41\\-88.86719\\-80.35369\\41\\-84.96094\\-79.36689\\41\\-83.00781\\-78.70555\\41\\-81.05469\\-78.17594\\41\\-79.10156\\-77.82356\\41\\-75.19531\\-76.82159\\41\\-73.24219\\-76.44536\\41\\-71.28906\\-76.24005\\41\\-63.47656\\-75.65245\\41\\-61.52344\\-75.46915\\41\\-59.57031\\-75.02181\\41\\-53.71094\\-74.875\\41\\-49.80469\\-75.00126\\41\\-47.85156\\-75.56658\\41\\-41.99219\\-76.00214\\41\\-36.13281\\-76.57047\\41\\-34.17969\\-76.92133\\41\\-32.22656\\-77.4034\\41\\-26.36719\\-78.51106\\41\\-22.46094\\-79.60916\\41\\-18.55469\\-80.46407\\41\\-16.60156\\-81.02985\\41\\-14.64844\\-81.81291\\41\\-10.74219\\-82.66456\\41\\-8.789063\\-83.28165\\41\\-6.835938\\-83.49921\\41\\-4.882813\\-83.38421\\41\\-0.9765625\\-82.87807\\41\\0.9765625\\-82.73283\\41\\4.882813\\-82.74718\\41\\8.789063\\-83.15836\\41\\10.74219\\-83.111\\41\\16.60156\\-81.65294\\41\\18.55469\\-80.59237\\41\\20.50781\\-79.97375\\41\\24.41406\\-78.40201\\41\\30.27344\\-76.56208\\41\\32.22656\\-76.31625\\41\\40.03906\\-75.60609\\41\\43.94531\\-75.32869\\41\\45.89844\\-74.97533\\41\\51.75781\\-74.93491\\41\\53.71094\\-75.00553\\41\\55.66406\\-75.44276\\41\\65.42969\\-76.06102\\41\\69.33594\\-76.34352\\41\\71.28906\\-76.54111\\41\\73.24219\\-76.85399\\41\\77.14844\\-77.62582\\41\\81.05469\\-78.23801\\41\\83.00781\\-78.62666\\41\\86.91406\\-79.69141\\41\\90.82031\\-80.35631\\41\\92.77344\\-80.7797\\41\\94.72656\\-81.60547\\41\\98.63281\\-82.50224\\41\\100.5859\\-83.40912\\41\\102.5391\\-84.09625\\41\\104.4922\\-84.90046\\41\\106.4453\\-85.85638\\41\\108.3984\\-86.58192\\41\\110.3516\\-87.62981\\41\\112.3047\\-88.30284\\41\\114.2578\\-89.59103\\41\\116.2109\\-90.77184\\41\\118.1641\\-92.2077\\41\\121.1999\\-94.78906\\41\\123.0341\\-96.74219\\41\\126.1644\\-100.6484\\41\\128.8635\\-104.5547\\41\\130.0469\\-106.5078\\41\\131.046\\-108.4609\\41\\132.3556\\-110.4141\\41\\133.3782\\-112.3672\\41\\134.6048\\-114.3203\\41\\136.5519\\-118.2266\\41\\137.2171\\-120.1797\\41\\138.3158\\-122.1328\\41\\139.0778\\-124.0859\\41\\140.2157\\-126.0391\\41\\140.895\\-127.9922\\41\\141.8973\\-129.9453\\41\\142.5062\\-131.8984\\41\\142.9938\\-133.8516\\41\\143.9466\\-135.8047\\41\\145.1317\\-139.7109\\41\\146.0634\\-141.6641\\41\\146.6201\\-143.6172\\41\\148.0076\\-147.5234\\41\\148.799\\-151.4297\\41\\149.2844\\-153.3828\\41\\149.8756\\-155.3359\\41\\150.2307\\-157.2891\\41\\150.6951\\-161.1953\\41\\151.0599\\-163.1484\\41\\151.6029\\-165.1016\\41\\151.94\\-167.0547\\41\\152.3582\\-170.9609\\41\\153.0461\\-178.7734\\41\\153.3579\\-184.6328\\41\\153.3725\\-188.5391\\41\\153.3279\\-192.4453\\41\\153.1964\\-194.3984\\41\\152.9062\\-200.2578\\41\\152.6638\\-204.1641\\41\\152.2326\\-210.0234\\41\\151.7736\\-213.9297\\41\\150.8206\\-217.8359\\41\\150.2057\\-221.7422\\41\\149.7608\\-223.6953\\41\\149.0193\\-225.6484\\41\\147.9102\\-229.5547\\41\\146.8395\\-231.5078\\41\\145.9782\\-233.4609\\41\\144.7115\\-235.4141\\41\\143.7124\\-237.3672\\41\\142.5472\\-239.3203\\41\\139.7199\\-243.2266\\41\\136.4648\\-247.1328\\41\\134.6762\\-249.0859\\41\\130.6728\\-252.9922\\41\\129.8828\\-253.8595\\41\\127.9297\\-255.7033\\41\\121.8985\\-260.8047\\41\\120.1172\\-262.0379\\41\\118.1641\\-263.5115\\41\\114.2578\\-266.0234\\41\\112.3047\\-267.3599\\41\\110.3516\\-268.3455\\41\\108.3984\\-269.4373\\41\\106.4453\\-270.0754\\41\\104.4922\\-271.2155\\41\\102.5391\\-271.9594\\41\\100.5859\\-273.0608\\41\\98.63281\\-273.717\\41\\96.67969\\-274.6355\\41\\94.72656\\-275.3076\\41\\92.77344\\-275.7679\\41\\88.86719\\-277.1707\\41\\86.91406\\-277.6188\\41\\83.00781\\-279.0866\\41\\81.05469\\-279.6021\\41\\77.14844\\-281.0403\\41\\75.19531\\-281.5187\\41\\73.24219\\-282.1441\\41\\71.28906\\-282.9464\\41\\69.33594\\-283.4141\\41\\67.38281\\-284.1724\\41\\65.42969\\-285.0308\\41\\63.47656\\-285.6829\\41\\61.52344\\-286.669\\41\\59.57031\\-287.2329\\41\\57.61719\\-287.9487\\41\\55.66406\\-288.7762\\41\\53.71094\\-289.2197\\41\\51.75781\\-289.7831\\41\\49.80469\\-290.7259\\41\\47.85156\\-291.2502\\41\\43.94531\\-292.8125\\41\\41.99219\\-293.333\\41\\40.03906\\-294.1326\\41\\38.08594\\-294.724\\41\\34.17969\\-295.45\\41\\32.22656\\-296.1739\\41\\30.27344\\-296.7126\\41\\26.36719\\-297.3636\\41\\24.41406\\-298.0226\\41\\22.46094\\-298.5284\\41\\16.60156\\-299.4066\\41\\12.69531\\-300.1602\\41\\10.74219\\-300.3672\\41\\6.835938\\-300.5871\\41\\2.929688\\-300.6987\\41\\-2.929688\\-300.6987\\41\\-8.789063\\-300.5051\\41\\-12.69531\\-300.2365\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "286" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "147" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-300.0542\\43\\-18.55469\\-299.31\\43\\-24.41406\\-298.5138\\43\\-26.36719\\-298.0361\\43\\-28.32031\\-297.4441\\43\\-30.27344\\-297.1132\\43\\-34.17969\\-296.5824\\43\\-38.08594\\-295.4956\\43\\-43.94531\\-294.5632\\43\\-47.85156\\-293.3264\\43\\-51.75781\\-292.4514\\43\\-53.71094\\-291.624\\43\\-57.61719\\-290.7648\\43\\-61.52344\\-289.4287\\43\\-65.42969\\-288.8945\\43\\-67.38281\\-288.4854\\43\\-69.33594\\-287.778\\43\\-71.28906\\-287.2981\\43\\-75.19531\\-286.4544\\43\\-77.14844\\-285.6717\\43\\-81.05469\\-284.7915\\43\\-83.00781\\-284.0856\\43\\-84.96094\\-283.5156\\43\\-88.86719\\-282.774\\43\\-90.82031\\-282.007\\43\\-94.72656\\-280.9616\\43\\-96.67969\\-280.1041\\43\\-100.5859\\-278.5444\\43\\-102.5391\\-277.4945\\43\\-104.4922\\-276.734\\43\\-106.4453\\-275.6522\\43\\-108.3984\\-274.8349\\43\\-110.3516\\-273.5407\\43\\-112.3047\\-272.1473\\43\\-114.2578\\-270.9941\\43\\-120.1172\\-266.8127\\43\\-122.7031\\-264.7109\\43\\-125.9766\\-261.8589\\43\\-127.9297\\-260.0603\\43\\-131.8359\\-256.1158\\43\\-134.753\\-252.9922\\43\\-136.368\\-251.0391\\43\\-137.7908\\-249.0859\\43\\-139.0788\\-247.1328\\43\\-140.5793\\-245.1797\\43\\-141.9149\\-243.2266\\43\\-142.7795\\-241.2734\\43\\-143.9938\\-239.3203\\43\\-144.7885\\-237.3672\\43\\-145.9872\\-235.4141\\43\\-146.7411\\-233.4609\\43\\-147.7449\\-231.5078\\43\\-148.3846\\-229.5547\\43\\-148.857\\-227.6016\\43\\-149.6582\\-225.6484\\43\\-150.2057\\-223.6953\\43\\-150.5692\\-221.7422\\43\\-151.0812\\-219.7891\\43\\-151.8497\\-217.8359\\43\\-152.6274\\-213.9297\\43\\-153.7604\\-210.0234\\43\\-154.0661\\-208.0703\\43\\-154.7688\\-202.2109\\43\\-155.5104\\-196.3516\\43\\-155.7216\\-192.4453\\43\\-155.8415\\-188.5391\\43\\-155.7878\\-182.6797\\43\\-155.5636\\-178.7734\\43\\-155.387\\-176.8203\\43\\-154.8181\\-172.9141\\43\\-154.3353\\-169.0078\\43\\-153.7997\\-165.1016\\43\\-152.7401\\-161.1953\\43\\-151.9694\\-157.2891\\43\\-150.7181\\-153.3828\\43\\-149.9509\\-149.4766\\43\\-149.2112\\-147.5234\\43\\-148.6291\\-145.5703\\43\\-148.1542\\-143.6172\\43\\-146.528\\-139.7109\\43\\-145.8506\\-137.7578\\43\\-144.8357\\-135.8047\\43\\-144.2644\\-133.8516\\43\\-143.2957\\-131.8984\\43\\-142.0288\\-127.9922\\43\\-140.9605\\-126.0391\\43\\-140.2057\\-124.0859\\43\\-139.0072\\-122.1328\\43\\-138.2285\\-120.1797\\43\\-137.0727\\-118.2266\\43\\-136.3911\\-116.2734\\43\\-135.2004\\-114.3203\\43\\-134.2475\\-112.3672\\43\\-133.7891\\-111.7962\\43\\-131.8359\\-108.8959\\43\\-131.4497\\-108.4609\\43\\-130.2921\\-106.5078\\43\\-128.8935\\-104.5547\\43\\-127.2626\\-102.6016\\43\\-123.5098\\-98.69531\\43\\-121.4919\\-96.74219\\43\\-118.1641\\-93.99818\\43\\-116.2109\\-92.64206\\43\\-112.3047\\-90.22977\\43\\-108.3984\\-88.13184\\43\\-106.4453\\-87.44728\\43\\-104.4922\\-86.43194\\43\\-102.5391\\-85.7588\\43\\-100.5859\\-84.84905\\43\\-96.67969\\-83.32349\\43\\-94.72656\\-82.37189\\43\\-92.77344\\-81.86983\\43\\-88.86719\\-80.46407\\43\\-84.96094\\-79.54771\\43\\-83.00781\\-78.88223\\43\\-81.05469\\-78.35409\\43\\-77.14844\\-77.55206\\43\\-73.24219\\-76.54111\\43\\-71.28906\\-76.30994\\43\\-63.47656\\-75.77146\\43\\-59.57031\\-75.5621\\43\\-55.66406\\-75.18003\\43\\-51.75781\\-75.34515\\43\\-47.85156\\-75.79107\\43\\-43.94531\\-75.96749\\43\\-40.03906\\-76.30455\\43\\-36.13281\\-76.72926\\43\\-32.22656\\-77.6157\\43\\-28.32031\\-78.27782\\43\\-26.36719\\-78.71195\\43\\-24.41406\\-79.29478\\43\\-22.46094\\-79.77129\\43\\-18.55469\\-80.57682\\43\\-14.64844\\-81.89721\\43\\-12.69531\\-82.26857\\43\\-8.789063\\-83.12544\\43\\-6.835938\\-83.17027\\43\\-2.929688\\-82.63255\\43\\-0.9765625\\-82.44711\\43\\0.9765625\\-82.37096\\43\\4.882813\\-82.37189\\43\\8.789063\\-82.59213\\43\\10.74219\\-82.6508\\43\\12.69531\\-82.44826\\43\\16.60156\\-81.67424\\43\\18.55469\\-80.67017\\43\\22.46094\\-79.41006\\43\\24.41406\\-78.5949\\43\\30.27344\\-76.8035\\43\\32.22656\\-76.42125\\43\\38.08594\\-75.9231\\43\\41.99219\\-75.71004\\43\\47.85156\\-75.5338\\43\\51.75781\\-75.5338\\43\\61.52344\\-75.95788\\43\\65.42969\\-76.19971\\43\\69.33594\\-76.52552\\43\\71.28906\\-76.79803\\43\\75.19531\\-77.57715\\43\\79.10156\\-78.1544\\43\\83.00781\\-78.90498\\43\\84.96094\\-79.49666\\43\\88.86719\\-80.232\\43\\90.82031\\-80.51083\\43\\92.77344\\-81.06022\\43\\94.72656\\-81.78701\\43\\96.67969\\-82.18961\\43\\98.63281\\-82.74709\\43\\100.5859\\-83.65982\\43\\102.5391\\-84.28821\\43\\104.4922\\-85.28718\\43\\108.3984\\-86.8913\\43\\110.3516\\-87.80914\\43\\112.3047\\-88.57784\\43\\114.2578\\-89.79581\\43\\118.1641\\-92.50092\\43\\120.9491\\-94.78906\\43\\122.8476\\-96.74219\\43\\124.3896\\-98.69531\\43\\125.9766\\-100.9117\\43\\128.6776\\-104.5547\\43\\129.7017\\-106.5078\\43\\132.1065\\-110.4141\\43\\133.1043\\-112.3672\\43\\134.4257\\-114.3203\\43\\135.2705\\-116.2734\\43\\136.3911\\-118.2266\\43\\137.0295\\-120.1797\\43\\138.1392\\-122.1328\\43\\138.847\\-124.0859\\43\\139.9805\\-126.0391\\43\\140.7221\\-127.9922\\43\\142.3719\\-131.8984\\43\\142.7772\\-133.8516\\43\\143.6393\\-135.8047\\43\\144.3925\\-137.7578\\43\\144.8982\\-139.7109\\43\\145.8333\\-141.6641\\43\\147.0588\\-145.5703\\43\\147.832\\-147.5234\\43\\148.2873\\-149.4766\\43\\149.0558\\-153.3828\\43\\149.6817\\-155.3359\\43\\150.0995\\-157.2891\\43\\150.5543\\-161.1953\\43\\150.8451\\-163.1484\\43\\151.7541\\-167.0547\\43\\152.0335\\-169.0078\\43\\152.3826\\-172.9141\\43\\152.7967\\-178.7734\\43\\152.9775\\-182.6797\\43\\153.0442\\-186.5859\\43\\152.9883\\-192.4453\\43\\152.6675\\-200.2578\\43\\152.4627\\-204.1641\\43\\152.0503\\-210.0234\\43\\151.8202\\-211.9766\\43\\151.448\\-213.9297\\43\\150.9468\\-215.8828\\43\\150.0126\\-221.7422\\43\\148.7651\\-225.6484\\43\\148.2971\\-227.6016\\43\\147.4609\\-229.7412\\43\\145.6171\\-233.4609\\43\\143.5547\\-237.0321\\43\\143.2897\\-237.3672\\43\\142.3261\\-239.3203\\43\\140.877\\-241.2734\\43\\137.6035\\-245.1797\\43\\136.1576\\-247.1328\\43\\134.3563\\-249.0859\\43\\131.8359\\-251.4881\\43\\129.8828\\-253.5066\\43\\127.9297\\-255.3785\\43\\125.9766\\-256.84\\43\\124.0234\\-258.4595\\43\\121.334\\-260.8047\\43\\120.1172\\-261.7629\\43\\118.1641\\-263.1295\\43\\116.2109\\-264.2121\\43\\115.6283\\-264.7109\\43\\112.3047\\-266.948\\43\\110.3516\\-267.8909\\43\\108.3984\\-269.0566\\43\\106.4453\\-269.7375\\43\\104.4922\\-270.6951\\43\\100.5859\\-272.3986\\43\\98.63281\\-273.3299\\43\\96.67969\\-274.0174\\43\\94.72656\\-274.9419\\43\\90.82031\\-275.9482\\43\\88.86719\\-276.7691\\43\\84.96094\\-277.8066\\43\\83.00781\\-278.6888\\43\\79.10156\\-279.863\\43\\77.14844\\-280.7535\\43\\73.24219\\-281.8452\\43\\71.28906\\-282.7223\\43\\67.38281\\-283.8718\\43\\65.42969\\-284.8877\\43\\63.47656\\-285.5089\\43\\61.52344\\-286.5208\\43\\57.61719\\-287.8345\\43\\55.66406\\-288.7202\\43\\51.75781\\-289.7233\\43\\49.80469\\-290.6962\\43\\47.85156\\-291.2241\\43\\43.94531\\-292.8148\\43\\41.99219\\-293.3297\\43\\40.03906\\-294.1326\\43\\38.08594\\-294.7196\\43\\34.17969\\-295.4727\\43\\32.22656\\-296.2247\\43\\30.27344\\-296.7259\\43\\26.36719\\-297.3841\\43\\24.41406\\-298.0757\\43\\22.46094\\-298.5565\\43\\18.55469\\-299.1309\\43\\14.64844\\-299.9048\\43\\12.69531\\-300.216\\43\\10.74219\\-300.4078\\43\\6.835938\\-300.6273\\43\\0.9765625\\-300.7656\\43\\-2.929688\\-300.7433\\43\\-6.835938\\-300.6317\\43\\-10.74219\\-300.444\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "148" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-300.1029\\45\\-18.55469\\-299.3404\\45\\-24.41406\\-298.5426\\45\\-26.36719\\-298.0757\\45\\-28.32031\\-297.4629\\45\\-30.27344\\-297.1297\\45\\-34.17969\\-296.5824\\45\\-38.08594\\-295.4596\\45\\-43.94531\\-294.5332\\45\\-47.85156\\-293.2741\\45\\-51.75781\\-292.3365\\45\\-53.71094\\-291.5204\\45\\-57.61719\\-290.646\\45\\-59.57031\\-289.8503\\45\\-61.52344\\-289.3446\\45\\-65.42969\\-288.7382\\45\\-69.33594\\-287.5516\\45\\-73.24219\\-286.7126\\45\\-75.19531\\-285.993\\45\\-77.14844\\-285.413\\45\\-81.05469\\-284.466\\45\\-83.00781\\-283.6976\\45\\-86.91406\\-282.991\\45\\-88.86719\\-282.4198\\45\\-90.82031\\-281.7044\\45\\-94.72656\\-280.668\\45\\-96.67969\\-279.7382\\45\\-98.63281\\-279.0827\\45\\-100.5859\\-278.0174\\45\\-102.5391\\-277.291\\45\\-106.4453\\-275.447\\45\\-108.3161\\-274.4766\\45\\-110.3516\\-273.2869\\45\\-112.3047\\-271.8358\\45\\-116.2109\\-269.3868\\45\\-122.0703\\-264.8484\\45\\-125.9766\\-261.5687\\45\\-128.8231\\-258.8516\\45\\-131.8359\\-255.7998\\45\\-134.3963\\-252.9922\\45\\-135.9844\\-251.0391\\45\\-137.3122\\-249.0859\\45\\-138.7561\\-247.1328\\45\\-140.3213\\-245.1797\\45\\-141.6016\\-243.1267\\45\\-143.67\\-239.3203\\45\\-144.593\\-237.3672\\45\\-145.7072\\-235.4141\\45\\-147.4609\\-231.4338\\45\\-148.2172\\-229.5547\\45\\-148.6987\\-227.6016\\45\\-150.0547\\-223.6953\\45\\-150.8418\\-219.7891\\45\\-151.6029\\-217.8359\\45\\-152.1086\\-215.8828\\45\\-152.4709\\-213.9297\\45\\-152.9335\\-211.9766\\45\\-153.532\\-210.0234\\45\\-153.9096\\-208.0703\\45\\-154.3801\\-204.1641\\45\\-154.9975\\-198.3047\\45\\-155.3726\\-194.3984\\45\\-155.6267\\-188.5391\\45\\-155.5372\\-182.6797\\45\\-155.4162\\-180.7266\\45\\-154.8313\\-174.8672\\45\\-154.3801\\-170.9609\\45\\-153.8693\\-167.0547\\45\\-153.4819\\-165.1016\\45\\-152.9009\\-163.1484\\45\\-152.1227\\-159.2422\\45\\-151.6712\\-157.2891\\45\\-150.9209\\-155.3359\\45\\-150.173\\-151.4297\\45\\-149.6302\\-149.4766\\45\\-148.9025\\-147.5234\\45\\-147.8841\\-143.6172\\45\\-146.9447\\-141.6641\\45\\-146.2814\\-139.7109\\45\\-145.3943\\-137.7578\\45\\-144.6166\\-135.8047\\45\\-144.0108\\-133.8516\\45\\-143.007\\-131.8984\\45\\-142.4942\\-129.9453\\45\\-141.6719\\-127.9922\\45\\-140.7133\\-126.0391\\45\\-139.8754\\-124.0859\\45\\-138.7416\\-122.1328\\45\\-137.9207\\-120.1797\\45\\-136.8733\\-118.2266\\45\\-136.1707\\-116.2734\\45\\-134.9368\\-114.3203\\45\\-133.7891\\-112.2596\\45\\-131.8359\\-109.3014\\45\\-131.1478\\-108.4609\\45\\-128.6053\\-104.5547\\45\\-125.9766\\-101.533\\45\\-123.1752\\-98.69531\\45\\-120.1172\\-95.8763\\45\\-118.1641\\-94.31535\\45\\-116.2109\\-93.14558\\45\\-114.2578\\-91.74297\\45\\-112.3047\\-90.50982\\45\\-110.3516\\-89.50215\\45\\-108.3984\\-88.31255\\45\\-106.4453\\-87.70256\\45\\-104.4922\\-86.65104\\45\\-100.5859\\-85.13699\\45\\-96.67969\\-83.56519\\45\\-94.72656\\-82.51321\\45\\-90.82031\\-81.43056\\45\\-88.86719\\-80.59592\\45\\-84.96094\\-79.71173\\45\\-83.00781\\-79.06932\\45\\-79.10156\\-78.07962\\45\\-77.14844\\-77.71158\\45\\-73.24219\\-76.71295\\45\\-71.28906\\-76.40213\\45\\-65.42969\\-75.99763\\45\\-61.52344\\-75.80244\\45\\-55.66406\\-75.62231\\45\\-51.75781\\-75.68211\\45\\-43.94531\\-76.08367\\45\\-40.03906\\-76.42125\\45\\-36.13281\\-76.95826\\45\\-32.22656\\-77.78503\\45\\-30.27344\\-78.07962\\45\\-26.36719\\-78.91658\\45\\-24.41406\\-79.51729\\45\\-18.55469\\-80.73078\\45\\-16.60156\\-81.49224\\45\\-14.64844\\-81.96716\\45\\-10.74219\\-82.6674\\45\\-8.789063\\-82.91611\\45\\-6.835938\\-82.79027\\45\\-2.929688\\-82.3348\\45\\0.9765625\\-82.14227\\45\\4.882813\\-82.13595\\45\\10.74219\\-82.35837\\45\\12.69531\\-82.29536\\45\\14.64844\\-82.06855\\45\\16.60156\\-81.68965\\45\\18.55469\\-80.76534\\45\\22.46094\\-79.60796\\45\\24.41406\\-78.80599\\45\\28.32031\\-77.63412\\45\\30.27344\\-76.99314\\45\\32.22656\\-76.54075\\45\\34.17969\\-76.33438\\45\\40.03906\\-75.92284\\45\\43.94531\\-75.79335\\45\\47.85156\\-75.73652\\45\\51.75781\\-75.77146\\45\\57.61719\\-75.92661\\45\\61.52344\\-76.10725\\45\\65.42969\\-76.34615\\45\\69.33594\\-76.76763\\45\\71.28906\\-77.07451\\45\\75.19531\\-77.80155\\45\\79.10156\\-78.37061\\45\\81.05469\\-78.76733\\45\\84.96094\\-79.72672\\45\\90.82031\\-80.69169\\45\\92.77344\\-81.41824\\45\\94.72656\\-81.94817\\45\\96.67969\\-82.35171\\45\\100.5859\\-83.86377\\45\\102.5391\\-84.50539\\45\\104.4922\\-85.53099\\45\\106.4453\\-86.23011\\45\\108.3984\\-87.19781\\45\\110.3516\\-87.9593\\45\\112.3047\\-88.90567\\45\\114.2578\\-90.00507\\45\\116.2109\\-91.51432\\45\\120.1172\\-94.29025\\45\\122.6294\\-96.74219\\45\\124.0799\\-98.69531\\45\\125.4097\\-100.6484\\45\\127.0138\\-102.6016\\45\\128.47\\-104.5547\\45\\129.4448\\-106.5078\\45\\130.6846\\-108.4609\\45\\131.7493\\-110.4141\\45\\132.9141\\-112.3672\\45\\134.2151\\-114.3203\\45\\135.0724\\-116.2734\\45\\136.1785\\-118.2266\\45\\136.8713\\-120.1797\\45\\137.907\\-122.1328\\45\\138.677\\-124.0859\\45\\139.6711\\-126.0391\\45\\140.5511\\-127.9922\\45\\141.3196\\-129.9453\\45\\142.2088\\-131.8984\\45\\142.6273\\-133.8516\\45\\143.3105\\-135.8047\\45\\144.2343\\-137.7578\\45\\144.7299\\-139.7109\\45\\146.2758\\-143.6172\\45\\146.827\\-145.5703\\45\\147.5848\\-147.5234\\45\\148.1527\\-149.4766\\45\\148.8773\\-153.3828\\45\\149.9414\\-157.2891\\45\\150.2487\\-159.2422\\45\\150.7066\\-163.1484\\45\\151.0462\\-165.1016\\45\\151.5416\\-167.0547\\45\\151.8891\\-169.0078\\45\\152.2519\\-172.9141\\45\\152.5057\\-176.8203\\45\\152.7389\\-182.6797\\45\\152.7882\\-186.5859\\45\\152.7829\\-190.4922\\45\\152.5567\\-198.3047\\45\\152.2854\\-204.1641\\45\\151.8291\\-210.0234\\45\\151.5026\\-211.9766\\45\\150.6836\\-215.8828\\45\\150.173\\-219.7891\\45\\149.7724\\-221.7422\\45\\149.0558\\-223.6953\\45\\148.0939\\-227.6016\\45\\146.3362\\-231.5078\\45\\145.1667\\-233.4609\\45\\144.2728\\-235.4141\\45\\143.0075\\-237.3672\\45\\142.0518\\-239.3203\\45\\140.5949\\-241.2734\\45\\137.1646\\-245.1797\\45\\135.7422\\-246.9972\\45\\133.9274\\-249.0859\\45\\131.8359\\-251.0129\\45\\129.8828\\-253.0172\\45\\127.8132\\-254.9453\\45\\125.9766\\-256.3356\\45\\122.0703\\-259.8155\\45\\120.1172\\-261.415\\45\\116.2109\\-263.8493\\45\\114.2578\\-265.2495\\45\\112.3047\\-266.2775\\45\\110.3516\\-267.5104\\45\\106.4453\\-269.4586\\45\\104.4922\\-270.0888\\45\\102.5391\\-271.1735\\45\\100.5859\\-271.8331\\45\\98.63281\\-272.8839\\45\\96.67969\\-273.573\\45\\92.77344\\-275.1507\\45\\90.82031\\-275.6148\\45\\88.86719\\-276.1968\\45\\86.91406\\-277.0132\\45\\84.96094\\-277.4835\\45\\83.00781\\-278.1068\\45\\81.05469\\-278.9576\\45\\79.10156\\-279.532\\45\\75.19531\\-281.1045\\45\\73.24219\\-281.6192\\45\\71.28906\\-282.4505\\45\\69.33594\\-283.1501\\45\\67.38281\\-283.6674\\45\\65.42969\\-284.7364\\45\\63.47656\\-285.3895\\45\\61.52344\\-286.3947\\45\\57.61719\\-287.7299\\45\\55.66406\\-288.6628\\45\\51.75781\\-289.6668\\45\\49.80469\\-290.6652\\45\\47.85156\\-291.2027\\45\\43.94531\\-292.8148\\45\\41.99219\\-293.3149\\45\\40.03906\\-294.1473\\45\\38.08594\\-294.724\\45\\34.17969\\-295.4857\\45\\32.22656\\-296.2369\\45\\30.27344\\-296.7368\\45\\26.36719\\-297.4197\\45\\24.41406\\-298.1378\\45\\22.46094\\-298.587\\45\\18.55469\\-299.1613\\45\\16.60156\\-299.5091\\45\\14.64844\\-299.9619\\45\\12.69531\\-300.2566\\45\\10.74219\\-300.444\\45\\6.835938\\-300.654\\45\\0.9765625\\-300.8103\\45\\-2.929688\\-300.776\\45\\-6.835938\\-300.6652\\45\\-10.74219\\-300.4747\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "293" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "149" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-300.1602\\47\\-18.55469\\-299.388\\47\\-20.50781\\-299.0788\\47\\-24.41406\\-298.5634\\47\\-26.36719\\-298.1258\\47\\-28.32031\\-297.4821\\47\\-30.27344\\-297.1464\\47\\-34.17969\\-296.5824\\47\\-38.08594\\-295.4596\\47\\-41.99219\\-294.8507\\47\\-43.94531\\-294.4898\\47\\-45.89844\\-293.8055\\47\\-47.85156\\-293.2338\\47\\-49.80469\\-292.7933\\47\\-51.75781\\-292.2163\\47\\-53.71094\\-291.4273\\47\\-57.61719\\-290.5131\\47\\-59.57031\\-289.6595\\47\\-63.47656\\-288.9984\\47\\-65.42969\\-288.5727\\47\\-67.38281\\-287.8725\\47\\-69.33594\\-287.355\\47\\-71.28906\\-286.9543\\47\\-73.24219\\-286.4544\\47\\-75.19531\\-285.6464\\47\\-79.10156\\-284.7363\\47\\-81.05469\\-283.9682\\47\\-83.00781\\-283.4598\\47\\-86.91406\\-282.7299\\47\\-88.86719\\-281.9968\\47\\-92.77344\\-280.9929\\47\\-96.67969\\-279.4438\\47\\-98.63281\\-278.7672\\47\\-100.5859\\-277.6958\\47\\-102.5391\\-277.0748\\47\\-104.4922\\-275.9795\\47\\-106.4453\\-275.2443\\47\\-108.3984\\-274.0374\\47\\-110.3516\\-272.9955\\47\\-110.9407\\-272.5234\\47\\-113.8229\\-270.5703\\47\\-114.2578\\-270.1897\\47\\-116.2109\\-269.1366\\47\\-118.1641\\-267.6283\\47\\-125.9766\\-261.1744\\47\\-128.3937\\-258.8516\\47\\-129.8828\\-257.2365\\47\\-131.8359\\-255.3255\\47\\-134.0069\\-252.9922\\47\\-135.7422\\-250.7855\\47\\-136.9612\\-249.0859\\47\\-137.6953\\-248.2478\\47\\-139.6484\\-245.5478\\47\\-139.9878\\-245.1797\\47\\-141.1534\\-243.2266\\47\\-142.436\\-241.2734\\47\\-143.2683\\-239.3203\\47\\-144.4184\\-237.3672\\47\\-146.319\\-233.4609\\47\\-147.093\\-231.5078\\47\\-148.0408\\-229.5547\\47\\-149.0956\\-225.6484\\47\\-149.8788\\-223.6953\\47\\-150.6533\\-219.7891\\47\\-151.9355\\-215.8828\\47\\-152.7163\\-211.9766\\47\\-153.7388\\-208.0703\\47\\-154.2263\\-204.1641\\47\\-154.6043\\-200.2578\\47\\-155.1743\\-192.4453\\47\\-155.3281\\-188.5391\\47\\-155.2813\\-184.6328\\47\\-155.2037\\-182.6797\\47\\-154.9364\\-178.7734\\47\\-154.5964\\-174.8672\\47\\-154.1829\\-170.9609\\47\\-153.6152\\-167.0547\\47\\-153.0442\\-165.1016\\47\\-152.6135\\-163.1484\\47\\-151.8784\\-159.2422\\47\\-151.197\\-157.2891\\47\\-150.6491\\-155.3359\\47\\-149.9509\\-151.4297\\47\\-149.1864\\-149.4766\\47\\-148.1859\\-145.5703\\47\\-147.5143\\-143.6172\\47\\-146.6654\\-141.6641\\47\\-146.0314\\-139.7109\\47\\-145.004\\-137.7578\\47\\-144.4151\\-135.8047\\47\\-142.802\\-131.8984\\47\\-142.3112\\-129.9453\\47\\-141.2533\\-127.9922\\47\\-140.4769\\-126.0391\\47\\-139.3922\\-124.0859\\47\\-138.5196\\-122.1328\\47\\-137.5156\\-120.1797\\47\\-135.8623\\-116.2734\\47\\-132.3213\\-110.4141\\47\\-130.9026\\-108.4609\\47\\-128.1993\\-104.5547\\47\\-125.9766\\-101.8655\\47\\-122.814\\-98.69531\\47\\-120.6436\\-96.74219\\47\\-118.1641\\-94.76359\\47\\-115.4278\\-92.83594\\47\\-109.0035\\-88.92969\\47\\-108.3984\\-88.50799\\47\\-106.4453\\-87.81995\\47\\-104.4922\\-86.83273\\47\\-102.5391\\-86.04327\\47\\-100.5859\\-85.39386\\47\\-98.63281\\-84.47147\\47\\-96.67969\\-83.79212\\47\\-94.72656\\-82.74479\\47\\-92.77344\\-82.12389\\47\\-90.82031\\-81.60205\\47\\-88.86719\\-80.78217\\47\\-84.96094\\-79.86694\\47\\-81.05469\\-78.66429\\47\\-79.10156\\-78.20415\\47\\-75.19531\\-77.45164\\47\\-73.24219\\-76.90576\\47\\-71.28906\\-76.55351\\47\\-65.42969\\-76.0873\\47\\-59.57031\\-75.84985\\47\\-55.66406\\-75.77822\\47\\-51.75781\\-75.81311\\47\\-43.94531\\-76.22253\\47\\-40.03906\\-76.54939\\47\\-38.08594\\-76.82424\\47\\-34.17969\\-77.6414\\47\\-30.27344\\-78.24461\\47\\-28.32031\\-78.68159\\47\\-24.41406\\-79.68791\\47\\-20.50781\\-80.42749\\47\\-18.55469\\-80.91279\\47\\-16.60156\\-81.66858\\47\\-12.69531\\-82.3485\\47\\-10.74219\\-82.59864\\47\\-8.789063\\-82.6702\\47\\-2.929688\\-82.14227\\47\\0.9765625\\-81.96935\\47\\6.835938\\-81.96395\\47\\10.74219\\-82.11206\\47\\12.69531\\-82.12466\\47\\14.64844\\-82.00667\\47\\16.60156\\-81.70444\\47\\18.55469\\-80.84345\\47\\22.46094\\-79.74349\\47\\26.36719\\-78.37025\\47\\32.22656\\-76.73927\\47\\34.17969\\-76.42598\\47\\36.13281\\-76.27506\\47\\41.99219\\-75.99318\\47\\47.85156\\-75.89077\\47\\53.71094\\-75.95788\\47\\57.61719\\-76.06779\\47\\61.52344\\-76.24005\\47\\65.42969\\-76.50014\\47\\69.33594\\-77.01009\\47\\73.24219\\-77.72974\\47\\77.14844\\-78.27383\\47\\79.10156\\-78.61333\\47\\83.00781\\-79.58064\\47\\86.91406\\-80.25758\\47\\88.86719\\-80.53253\\47\\90.82031\\-80.92495\\47\\92.77344\\-81.67805\\47\\96.67969\\-82.57233\\47\\98.63281\\-83.40032\\47\\102.5391\\-84.75106\\47\\104.4922\\-85.71667\\47\\106.4453\\-86.37607\\47\\108.3984\\-87.38287\\47\\110.3516\\-88.09711\\47\\114.2578\\-90.24194\\47\\117.6162\\-92.83594\\47\\118.1641\\-93.32422\\47\\120.1172\\-94.60645\\47\\122.346\\-96.74219\\47\\123.6256\\-98.69531\\47\\126.8145\\-102.6016\\47\\128.1915\\-104.5547\\47\\129.2657\\-106.5078\\47\\130.5318\\-108.4609\\47\\131.4302\\-110.4141\\47\\131.8359\\-110.9331\\47\\133.9567\\-114.3203\\47\\134.9094\\-116.2734\\47\\135.96\\-118.2266\\47\\137.5772\\-122.1328\\47\\138.5345\\-124.0859\\47\\139.3548\\-126.0391\\47\\140.3943\\-127.9922\\47\\141.0672\\-129.9453\\47\\142.0569\\-131.8984\\47\\143.1003\\-135.8047\\47\\144.0677\\-137.7578\\47\\144.5739\\-139.7109\\47\\145.2358\\-141.6641\\47\\146.1168\\-143.6172\\47\\146.64\\-145.5703\\47\\148.0095\\-149.4766\\47\\148.7361\\-153.3828\\47\\149.1847\\-155.3359\\47\\149.7811\\-157.2891\\47\\150.142\\-159.2422\\47\\150.6003\\-163.1484\\47\\150.882\\-165.1016\\47\\151.7137\\-169.0078\\47\\152.1218\\-172.9141\\47\\152.3582\\-176.8203\\47\\152.5567\\-182.6797\\47\\152.6038\\-186.5859\\47\\152.584\\-190.4922\\47\\152.383\\-198.3047\\47\\152.2229\\-202.2109\\47\\151.9848\\-206.1172\\47\\151.8019\\-208.0703\\47\\151.5158\\-210.0234\\47\\150.7658\\-213.9297\\47\\150.284\\-217.8359\\47\\149.9821\\-219.7891\\47\\148.8077\\-223.6953\\47\\148.3907\\-225.6484\\47\\147.8554\\-227.6016\\47\\146.8567\\-229.5547\\47\\146.0854\\-231.5078\\47\\144.847\\-233.4609\\47\\144.0108\\-235.4141\\47\\142.7539\\-237.3672\\47\\141.6256\\-239.3203\\47\\140.2933\\-241.2734\\47\\135.189\\-247.1328\\47\\133.7891\\-248.6494\\47\\131.8359\\-250.4902\\47\\127.9297\\-254.3903\\47\\122.0703\\-259.4401\\47\\120.1172\\-260.9577\\47\\118.1641\\-262.187\\47\\116.2109\\-263.5478\\47\\112.3047\\-265.8181\\47\\110.3516\\-267.1232\\47\\108.3984\\-267.9599\\47\\106.4453\\-269.0884\\47\\104.4922\\-269.7341\\47\\100.5859\\-271.476\\47\\98.63281\\-272.2204\\47\\96.67969\\-273.2065\\47\\94.72656\\-273.8471\\47\\92.77344\\-274.726\\47\\90.82031\\-275.3372\\47\\88.86719\\-275.785\\47\\86.91406\\-276.5594\\47\\84.96094\\-277.2189\\47\\83.00781\\-277.7103\\47\\81.05469\\-278.5444\\47\\77.14844\\-279.9706\\47\\75.19531\\-280.9135\\47\\73.24219\\-281.4427\\47\\71.28906\\-282.1859\\47\\69.33594\\-283.0426\\47\\67.38281\\-283.5304\\47\\65.42969\\-284.5887\\47\\63.47656\\-285.2911\\47\\61.52344\\-286.2329\\47\\59.57031\\-287.027\\47\\57.61719\\-287.6537\\47\\55.66406\\-288.6068\\47\\51.75781\\-289.6362\\47\\49.80469\\-290.6378\\47\\47.85156\\-291.1916\\47\\43.94531\\-292.8047\\47\\41.99219\\-293.3259\\47\\40.03906\\-294.1742\\47\\38.08594\\-294.7358\\47\\34.17969\\-295.5087\\47\\32.22656\\-296.2748\\47\\30.27344\\-296.7624\\47\\28.32031\\-297.0718\\47\\26.36719\\-297.4793\\47\\24.41406\\-298.1959\\47\\22.46094\\-298.6194\\47\\18.55469\\-299.2071\\47\\14.64844\\-300.0288\\47\\12.69531\\-300.3073\\47\\10.74219\\-300.4747\\47\\6.835938\\-300.6987\\47\\0.9765625\\-300.8438\\47\\-4.882813\\-300.7708\\47\\-8.789063\\-300.6205\\47\\-12.69531\\-300.3642\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "284" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "150" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-300.2055\\49\\-18.55469\\-299.438\\49\\-20.50781\\-299.114\\49\\-24.41406\\-298.5901\\49\\-26.36719\\-298.1846\\49\\-28.32031\\-297.5222\\49\\-30.27344\\-297.1528\\49\\-34.17969\\-296.5824\\49\\-38.08594\\-295.45\\49\\-41.99219\\-294.8457\\49\\-43.94531\\-294.4355\\49\\-45.89844\\-293.7451\\49\\-47.85156\\-293.1889\\49\\-49.80469\\-292.7443\\49\\-51.75781\\-292.1069\\49\\-53.71094\\-291.343\\49\\-55.66406\\-290.9049\\49\\-57.61719\\-290.3406\\49\\-59.57031\\-289.5444\\49\\-63.47656\\-288.887\\49\\-65.42969\\-288.3598\\49\\-67.38281\\-287.6537\\49\\-71.28906\\-286.7958\\49\\-75.19531\\-285.4192\\49\\-77.14844\\-284.9797\\49\\-79.10156\\-284.3643\\49\\-81.05469\\-283.6288\\49\\-84.96094\\-282.9338\\49\\-86.91406\\-282.36\\49\\-88.86719\\-281.674\\49\\-92.77344\\-280.7253\\49\\-94.72656\\-279.8325\\49\\-96.67969\\-279.1966\\49\\-100.5859\\-277.4585\\49\\-102.5391\\-276.7804\\49\\-104.4922\\-275.7303\\49\\-106.4453\\-275.0004\\49\\-108.3984\\-273.7412\\49\\-110.3516\\-272.6204\\49\\-112.3047\\-271.3348\\49\\-114.2578\\-269.8755\\49\\-116.2109\\-268.8556\\49\\-118.1641\\-267.3714\\49\\-121.3504\\-264.7109\\49\\-122.0703\\-264.0163\\49\\-123.6518\\-262.7578\\49\\-125.9766\\-260.7482\\49\\-127.9862\\-258.8516\\49\\-131.7255\\-254.9453\\49\\-135.1657\\-251.0391\\49\\-138.1894\\-247.1328\\49\\-141.6016\\-242.1268\\49\\-142.2289\\-241.2734\\49\\-143.0107\\-239.3203\\49\\-144.2276\\-237.3672\\49\\-145.0007\\-235.4141\\49\\-146.1175\\-233.4609\\49\\-146.8395\\-231.5078\\49\\-147.8503\\-229.5547\\49\\-148.906\\-225.6484\\49\\-149.6564\\-223.6953\\49\\-150.1872\\-221.7422\\49\\-150.5046\\-219.7891\\49\\-150.9725\\-217.8359\\49\\-151.724\\-215.8828\\49\\-152.1671\\-213.9297\\49\\-152.9335\\-210.0234\\49\\-153.532\\-208.0703\\49\\-153.8514\\-206.1172\\49\\-154.4436\\-200.2578\\49\\-154.815\\-194.3984\\49\\-155.0097\\-188.5391\\49\\-154.9735\\-184.6328\\49\\-154.8283\\-180.7266\\49\\-154.5659\\-176.8203\\49\\-153.9914\\-170.9609\\49\\-153.7267\\-169.0078\\49\\-152.7321\\-165.1016\\49\\-152.0095\\-161.1953\\49\\-151.5416\\-159.2422\\49\\-150.8385\\-157.2891\\49\\-150.4389\\-155.3359\\49\\-150.139\\-153.3828\\49\\-149.6169\\-151.4297\\49\\-148.8532\\-149.4766\\49\\-147.9461\\-145.5703\\49\\-147.0768\\-143.6172\\49\\-145.6694\\-139.7109\\49\\-144.7452\\-137.7578\\49\\-144.2038\\-135.8047\\49\\-143.2316\\-133.8516\\49\\-142.0407\\-129.9453\\49\\-140.9845\\-127.9922\\49\\-140.2344\\-126.0391\\49\\-139.0223\\-124.0859\\49\\-138.2867\\-122.1328\\49\\-137.1867\\-120.1797\\49\\-136.5045\\-118.2266\\49\\-135.353\\-116.2734\\49\\-134.4337\\-114.3203\\49\\-133.0994\\-112.3672\\49\\-131.9714\\-110.4141\\49\\-129.8828\\-107.3335\\49\\-127.9297\\-104.75\\49\\-125.9766\\-102.3029\\49\\-124.0234\\-100.2722\\49\\-122.3931\\-98.69531\\49\\-120.1172\\-96.68961\\49\\-116.2109\\-93.68183\\49\\-114.9053\\-92.83594\\49\\-112.3047\\-91.35075\\49\\-110.3516\\-90.04137\\49\\-108.3984\\-88.85326\\49\\-104.4922\\-87.06917\\49\\-102.5391\\-86.28893\\49\\-100.5859\\-85.61435\\49\\-98.63281\\-84.68463\\49\\-96.67969\\-83.9884\\49\\-92.77344\\-82.30796\\49\\-90.82031\\-81.83376\\49\\-86.91406\\-80.44348\\49\\-83.00781\\-79.55606\\49\\-81.05469\\-78.87109\\49\\-77.14844\\-78.01351\\49\\-75.19531\\-77.65257\\49\\-71.28906\\-76.77474\\49\\-69.33594\\-76.51521\\49\\-65.42969\\-76.18815\\49\\-61.52344\\-76.02635\\49\\-55.66406\\-75.90679\\49\\-49.80469\\-76.00494\\49\\-41.99219\\-76.50356\\49\\-38.08594\\-77.07451\\49\\-36.13281\\-77.50459\\49\\-32.22656\\-78.12129\\49\\-28.32031\\-78.89353\\49\\-26.36719\\-79.46616\\49\\-22.46094\\-80.24977\\49\\-20.50781\\-80.55824\\49\\-16.60156\\-81.78332\\49\\-12.69531\\-82.35296\\49\\-10.74219\\-82.52421\\49\\-8.789063\\-82.47177\\49\\-4.882813\\-82.13014\\49\\-0.9765625\\-81.87674\\49\\2.929688\\-81.75723\\49\\6.835938\\-81.75294\\49\\12.69531\\-81.94634\\49\\14.64844\\-81.90215\\49\\16.60156\\-81.67429\\49\\18.55469\\-80.87119\\49\\22.46094\\-79.82581\\49\\26.36719\\-78.53883\\49\\34.17969\\-76.59729\\49\\36.13281\\-76.39407\\49\\40.03906\\-76.18268\\49\\47.85156\\-76.03092\\49\\53.71094\\-76.11514\\49\\61.52344\\-76.37642\\49\\65.42969\\-76.74802\\49\\67.38281\\-77.01009\\49\\71.28906\\-77.66501\\49\\75.19531\\-78.16543\\49\\77.14844\\-78.46974\\49\\79.10156\\-78.89353\\49\\81.05469\\-79.42975\\49\\84.96094\\-80.13481\\49\\88.86719\\-80.74213\\49\\90.82031\\-81.36508\\49\\94.72656\\-82.27612\\49\\96.67969\\-82.82263\\49\\98.63281\\-83.64791\\49\\100.5859\\-84.22998\\49\\104.4922\\-85.89599\\49\\106.4453\\-86.55804\\49\\108.3984\\-87.5811\\49\\110.3516\\-88.27644\\49\\112.3047\\-89.45946\\49\\114.2578\\-90.5423\\49\\117.3281\\-92.83594\\49\\119.7117\\-94.78906\\49\\121.875\\-96.74219\\49\\123.4063\\-98.69531\\49\\126.6092\\-102.6016\\49\\127.9376\\-104.5547\\49\\130.3404\\-108.4609\\49\\131.2162\\-110.4141\\49\\132.554\\-112.3672\\49\\134.7425\\-116.2734\\49\\136.6028\\-120.1797\\49\\137.2867\\-122.1328\\49\\138.3831\\-124.0859\\49\\139.1066\\-126.0391\\49\\140.2024\\-127.9922\\49\\140.8847\\-129.9453\\49\\141.851\\-131.8984\\49\\142.4689\\-133.8516\\49\\142.914\\-135.8047\\49\\143.8525\\-137.7578\\49\\144.9857\\-141.6641\\49\\145.9096\\-143.6172\\49\\147.0535\\-147.5234\\49\\147.8604\\-149.4766\\49\\148.2824\\-151.4297\\49\\148.9793\\-155.3359\\49\\149.573\\-157.2891\\49\\150.0299\\-159.2422\\49\\150.7415\\-165.1016\\49\\151.0577\\-167.0547\\49\\151.5026\\-169.0078\\49\\151.9886\\-172.9141\\49\\152.3053\\-178.7734\\49\\152.4118\\-182.6797\\49\\152.4484\\-186.5859\\49\\152.4276\\-190.4922\\49\\152.3535\\-194.3984\\49\\152.0503\\-202.2109\\49\\151.7639\\-206.1172\\49\\151.5026\\-208.0703\\49\\151.1054\\-210.0234\\49\\150.5672\\-213.9297\\49\\150.127\\-217.8359\\49\\149.7228\\-219.7891\\49\\149.0583\\-221.7422\\49\\148.2108\\-225.6484\\49\\147.5135\\-227.6016\\49\\145.7623\\-231.5078\\49\\144.5909\\-233.4609\\49\\143.6244\\-235.4141\\49\\142.5218\\-237.3672\\49\\139.9227\\-241.2734\\49\\136.617\\-245.1797\\49\\133.7891\\-248.3088\\49\\129.8828\\-252.0695\\49\\127.9297\\-254.0413\\49\\125.9766\\-255.7965\\49\\122.0703\\-258.9617\\49\\118.1641\\-261.8376\\49\\116.2109\\-263.1784\\49\\114.2578\\-264.1134\\49\\112.3047\\-265.4308\\49\\108.3984\\-267.5774\\49\\104.4922\\-269.432\\49\\102.5391\\-270.0226\\49\\100.5859\\-271.1077\\49\\98.63281\\-271.7389\\49\\96.67969\\-272.7488\\49\\92.77344\\-274.1578\\49\\90.82031\\-275.0392\\49\\86.91406\\-276.0102\\49\\84.96094\\-276.8919\\49\\81.05469\\-278.0174\\49\\79.10156\\-279.0246\\49\\77.14844\\-279.683\\49\\75.19531\\-280.6787\\49\\71.28906\\-281.9635\\49\\69.33594\\-282.9254\\49\\67.38281\\-283.4255\\49\\65.42969\\-284.4166\\49\\63.47656\\-285.2188\\49\\59.57031\\-286.9669\\49\\57.61719\\-287.5877\\49\\55.66406\\-288.5514\\49\\51.75781\\-289.6133\\49\\49.80469\\-290.6128\\49\\47.85156\\-291.1861\\49\\43.94531\\-292.7946\\49\\41.99219\\-293.344\\49\\40.03906\\-294.1873\\49\\38.08594\\-294.7476\\49\\34.17969\\-295.5291\\49\\32.22656\\-296.3314\\49\\30.27344\\-296.7852\\49\\28.32031\\-297.0942\\49\\26.36719\\-297.543\\49\\24.41406\\-298.2502\\49\\22.46094\\-298.6537\\49\\18.55469\\-299.2554\\49\\14.64844\\-300.0789\\49\\12.69531\\-300.3376\\49\\6.835938\\-300.7147\\49\\2.929688\\-300.8438\\49\\-2.929688\\-300.8495\\49\\-8.789063\\-300.6473\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "292" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "151" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-299.948\\51\\-18.55469\\-299.4906\\51\\-20.50781\\-299.1507\\51\\-24.41406\\-298.6158\\51\\-26.36719\\-298.2289\\51\\-28.32031\\-297.5667\\51\\-30.27344\\-297.1423\\51\\-34.17969\\-296.5824\\51\\-38.08594\\-295.4371\\51\\-41.99219\\-294.8274\\51\\-43.94531\\-294.4254\\51\\-45.89844\\-293.7109\\51\\-47.85156\\-293.1514\\51\\-49.80469\\-292.7006\\51\\-53.71094\\-291.2744\\51\\-55.66406\\-290.8365\\51\\-59.57031\\-289.4445\\51\\-63.47656\\-288.747\\51\\-67.38281\\-287.4601\\51\\-71.28906\\-286.5544\\51\\-73.24219\\-285.7469\\51\\-77.14844\\-284.739\\51\\-79.10156\\-283.9401\\51\\-81.05469\\-283.4028\\51\\-83.00781\\-283.1019\\51\\-84.96094\\-282.6588\\51\\-86.91406\\-281.9423\\51\\-90.82031\\-280.9969\\51\\-94.72656\\-279.5257\\51\\-96.67969\\-278.9033\\51\\-98.63281\\-277.8541\\51\\-100.5859\\-277.2381\\51\\-102.5391\\-276.3416\\51\\-106.4453\\-274.6601\\51\\-108.3984\\-273.4832\\51\\-110.3516\\-272.1452\\51\\-112.3047\\-271.049\\51\\-114.2578\\-269.6473\\51\\-115.9473\\-268.6172\\51\\-118.1641\\-267.0185\\51\\-120.9635\\-264.7109\\51\\-124.0234\\-262.0949\\51\\-127.5228\\-258.8516\\51\\-129.8828\\-256.4671\\51\\-131.8359\\-254.3822\\51\\-134.8295\\-251.0391\\51\\-136.3955\\-249.0859\\51\\-137.8174\\-247.1328\\51\\-139.0736\\-245.1797\\51\\-140.5833\\-243.2266\\51\\-141.9391\\-241.2734\\51\\-142.802\\-239.3203\\51\\-143.9704\\-237.3672\\51\\-144.7597\\-235.4141\\51\\-145.8972\\-233.4609\\51\\-146.62\\-231.5078\\51\\-147.5571\\-229.5547\\51\\-148.2621\\-227.6016\\51\\-148.7361\\-225.6484\\51\\-150.0423\\-221.7422\\51\\-150.7621\\-217.8359\\51\\-151.4338\\-215.8828\\51\\-151.992\\-213.9297\\51\\-152.7009\\-210.0234\\51\\-153.6564\\-206.1172\\51\\-153.9051\\-204.1641\\51\\-154.258\\-200.2578\\51\\-154.5731\\-194.3984\\51\\-154.72\\-190.4922\\51\\-154.7659\\-186.5859\\51\\-154.6043\\-180.7266\\51\\-154.3682\\-176.8203\\51\\-154.0132\\-172.9141\\51\\-153.7577\\-170.9609\\51\\-153.3869\\-169.0078\\51\\-152.8474\\-167.0547\\51\\-151.7442\\-161.1953\\51\\-151.0791\\-159.2422\\51\\-150.5871\\-157.2891\\51\\-149.8857\\-153.3828\\51\\-149.1699\\-151.4297\\51\\-148.6415\\-149.4766\\51\\-148.2126\\-147.5234\\51\\-147.614\\-145.5703\\51\\-146.7452\\-143.6172\\51\\-146.1387\\-141.6641\\51\\-145.1983\\-139.7109\\51\\-143.9226\\-135.8047\\51\\-142.9572\\-133.8516\\51\\-142.4377\\-131.8984\\51\\-141.6697\\-129.9453\\51\\-140.7292\\-127.9922\\51\\-139.8891\\-126.0391\\51\\-138.7706\\-124.0859\\51\\-138.0101\\-122.1328\\51\\-136.9613\\-120.1797\\51\\-136.2339\\-118.2266\\51\\-135.0547\\-116.2734\\51\\-134.1217\\-114.3203\\51\\-133.7891\\-113.9031\\51\\-131.8359\\-110.8326\\51\\-130.4014\\-108.4609\\51\\-128.9648\\-106.5078\\51\\-125.9766\\-102.8497\\51\\-124.0234\\-100.7769\\51\\-121.8363\\-98.69531\\51\\-118.1641\\-95.47473\\51\\-116.2109\\-94.00912\\51\\-114.2578\\-92.89538\\51\\-110.3516\\-90.29688\\51\\-108.3984\\-89.33832\\51\\-106.4453\\-88.16286\\51\\-104.4922\\-87.49315\\51\\-102.5391\\-86.44785\\51\\-100.5859\\-85.74334\\51\\-96.67969\\-84.2182\\51\\-94.72656\\-83.54557\\51\\-92.77344\\-82.58545\\51\\-88.86719\\-81.41016\\51\\-86.91406\\-80.63901\\51\\-83.00781\\-79.75651\\51\\-79.10156\\-78.62347\\51\\-77.14844\\-78.20454\\51\\-73.24219\\-77.51401\\51\\-71.28906\\-77.07451\\51\\-67.38281\\-76.47692\\51\\-63.47656\\-76.23438\\51\\-55.66406\\-76.02596\\51\\-49.80469\\-76.13672\\51\\-45.89844\\-76.36968\\51\\-41.99219\\-76.71947\\51\\-40.03906\\-77.01009\\51\\-36.13281\\-77.75415\\51\\-32.22656\\-78.31026\\51\\-30.27344\\-78.68466\\51\\-26.36719\\-79.67838\\51\\-22.46094\\-80.37286\\51\\-20.50781\\-80.77044\\51\\-18.55469\\-81.42052\\51\\-16.60156\\-81.89214\\51\\-14.64844\\-82.17763\\51\\-12.69531\\-82.35296\\51\\-10.74219\\-82.42553\\51\\-8.789063\\-82.31958\\51\\-2.929688\\-81.84319\\51\\2.929688\\-81.45467\\51\\6.835938\\-81.39301\\51\\12.69531\\-81.75745\\51\\14.64844\\-81.74451\\51\\16.60156\\-81.51479\\51\\18.55469\\-80.87119\\51\\24.41406\\-79.39516\\51\\26.36719\\-78.73606\\51\\28.32031\\-78.21556\\51\\32.22656\\-77.37609\\51\\34.17969\\-76.86914\\51\\36.13281\\-76.53634\\51\\38.08594\\-76.38178\\51\\41.99219\\-76.25182\\51\\47.85156\\-76.1597\\51\\51.75781\\-76.19463\\51\\57.61719\\-76.35792\\51\\61.52344\\-76.5451\\51\\65.42969\\-77.0226\\51\\67.38281\\-77.33576\\51\\73.24219\\-78.10847\\51\\77.14844\\-78.74554\\51\\81.05469\\-79.68184\\51\\86.91406\\-80.61894\\51\\88.86719\\-81.06022\\51\\90.82031\\-81.66858\\51\\94.72656\\-82.44165\\51\\98.63281\\-83.88596\\51\\100.5859\\-84.50677\\51\\102.5391\\-85.43145\\51\\106.4453\\-86.84787\\51\\108.3984\\-87.81097\\51\\110.3516\\-88.52039\\51\\110.9437\\-88.92969\\51\\114.2578\\-90.8601\\51\\116.2109\\-92.20404\\51\\118.1641\\-93.74607\\51\\120.1172\\-95.40271\\51\\121.5642\\-96.74219\\51\\123.2676\\-98.69531\\51\\126.3887\\-102.6016\\51\\127.9297\\-104.8904\\51\\130.1307\\-108.4609\\51\\131.0417\\-110.4141\\51\\132.3771\\-112.3672\\51\\133.3861\\-114.3203\\51\\134.5923\\-116.2734\\51\\135.4237\\-118.2266\\51\\136.4746\\-120.1797\\51\\137.0716\\-122.1328\\51\\138.2379\\-124.0859\\51\\138.9257\\-126.0391\\51\\140.0154\\-127.9922\\51\\140.7377\\-129.9453\\51\\142.3523\\-133.8516\\51\\142.7917\\-135.8047\\51\\144.3283\\-139.7109\\51\\144.8135\\-141.6641\\51\\145.6694\\-143.6172\\51\\146.3353\\-145.5703\\51\\146.855\\-147.5234\\51\\147.6618\\-149.4766\\51\\148.1643\\-151.4297\\51\\148.8514\\-155.3359\\51\\149.8857\\-159.2422\\51\\150.2125\\-161.1953\\51\\150.8727\\-167.0547\\51\\151.6263\\-170.9609\\51\\151.9886\\-174.8672\\51\\152.1842\\-178.7734\\51\\152.2815\\-182.6797\\51\\152.3102\\-188.5391\\51\\152.1994\\-194.3984\\51\\152.0669\\-198.3047\\51\\151.864\\-202.2109\\51\\151.4757\\-206.1172\\51\\150.8362\\-210.0234\\51\\150.2193\\-215.8828\\51\\149.9187\\-217.8359\\51\\148.8077\\-221.7422\\51\\147.9953\\-225.6484\\51\\146.3596\\-229.5547\\51\\145.2836\\-231.5078\\51\\144.3676\\-233.4609\\51\\143.2096\\-235.4141\\51\\142.2897\\-237.3672\\51\\139.6484\\-240.9613\\51\\136.3053\\-245.1797\\51\\134.5898\\-247.1328\\51\\131.8359\\-249.9021\\51\\127.9297\\-253.6804\\51\\125.9766\\-255.4372\\51\\122.0703\\-258.3491\\51\\121.5328\\-258.8516\\51\\118.1641\\-261.4708\\51\\116.0482\\-262.7578\\51\\114.2578\\-263.7403\\51\\112.3047\\-264.9568\\51\\110.3516\\-265.9588\\51\\108.3984\\-267.1951\\51\\106.4453\\-268.006\\51\\104.4922\\-269.0674\\51\\102.5391\\-269.6787\\51\\98.63281\\-271.3958\\51\\96.67969\\-272.0801\\51\\94.72656\\-273.1049\\51\\92.77344\\-273.7145\\51\\90.82031\\-274.5618\\51\\88.86719\\-275.2469\\51\\86.91406\\-275.6895\\51\\83.00781\\-277.1917\\51\\81.05469\\-277.7032\\51\\79.10156\\-278.7362\\51\\77.14844\\-279.4457\\51\\75.19531\\-280.3881\\51\\73.24219\\-281.1672\\51\\71.28906\\-281.8178\\51\\69.33594\\-282.8103\\51\\67.38281\\-283.3386\\51\\63.47656\\-285.1561\\51\\61.52344\\-285.9775\\51\\59.57031\\-286.907\\51\\57.61719\\-287.5489\\51\\55.66406\\-288.5267\\51\\51.75781\\-289.6003\\51\\49.80469\\-290.6128\\51\\47.85156\\-291.1916\\51\\43.94531\\-292.8086\\51\\41.99219\\-293.3697\\51\\40.03906\\-294.213\\51\\38.08594\\-294.764\\51\\34.17969\\-295.5636\\51\\32.22656\\-296.387\\51\\30.27344\\-296.8193\\51\\28.32031\\-297.1318\\51\\26.36719\\-297.6089\\51\\24.41406\\-298.3205\\51\\22.46094\\-298.6944\\51\\18.55469\\-299.315\\51\\14.64844\\-300.1263\\51\\12.69531\\-300.3584\\51\\8.789063\\-300.6429\\51\\2.929688\\-300.8721\\51\\-2.929688\\-300.8784\\51\\-6.835938\\-300.7534\\51\\-10.74219\\-300.5647\\51\\-14.64844\\-300.2466\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "292" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "152" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-300.0288\\53\\-18.55469\\-299.555\\53\\-20.50781\\-299.1999\\53\\-24.41406\\-298.638\\53\\-26.36719\\-298.2709\\53\\-28.32031\\-297.5798\\53\\-30.27344\\-297.1763\\53\\-34.17969\\-296.5904\\53\\-38.08594\\-295.45\\53\\-41.99219\\-294.8158\\53\\-43.94531\\-294.4153\\53\\-45.89844\\-293.6867\\53\\-47.85156\\-293.1259\\53\\-49.80469\\-292.669\\53\\-51.75781\\-291.8778\\53\\-53.71094\\-291.2169\\53\\-55.66406\\-290.7816\\53\\-57.61719\\-290.017\\53\\-59.57031\\-289.3766\\53\\-61.52344\\-289.054\\53\\-63.47656\\-288.6169\\53\\-65.42969\\-287.899\\53\\-67.38281\\-287.3106\\53\\-69.33594\\-286.8768\\53\\-71.28906\\-286.2619\\53\\-73.24219\\-285.5172\\53\\-75.19531\\-285.0543\\53\\-77.14844\\-284.4539\\53\\-79.10156\\-283.6379\\53\\-83.00781\\-282.9128\\53\\-86.91406\\-281.6444\\53\\-88.86719\\-281.2378\\53\\-90.82031\\-280.7304\\53\\-92.77344\\-279.8753\\53\\-94.72656\\-279.2664\\53\\-96.67969\\-278.4913\\53\\-98.63281\\-277.5672\\53\\-100.5859\\-277.0009\\53\\-102.5391\\-275.9585\\53\\-104.4922\\-275.2934\\53\\-108.3984\\-273.2218\\53\\-110.3516\\-271.8105\\53\\-114.2578\\-269.4569\\53\\-115.4349\\-268.6172\\53\\-120.1172\\-265.0149\\53\\-124.0234\\-261.7612\\53\\-127.1203\\-258.8516\\53\\-129.1233\\-256.8984\\53\\-131.8359\\-254.0097\\53\\-134.4857\\-251.0391\\53\\-136.0802\\-249.0859\\53\\-137.3119\\-247.1328\\53\\-140.3345\\-243.2266\\53\\-141.6016\\-241.239\\53\\-143.6546\\-237.3672\\53\\-145.5744\\-233.4609\\53\\-148.1061\\-227.6016\\53\\-149.103\\-223.6953\\53\\-149.8518\\-221.7422\\53\\-150.2728\\-219.7891\\53\\-150.5938\\-217.8359\\53\\-151.1054\\-215.8828\\53\\-151.8019\\-213.9297\\53\\-152.8815\\-208.0703\\53\\-153.3869\\-206.1172\\53\\-153.7483\\-204.1641\\53\\-154.1134\\-200.2578\\53\\-154.2146\\-198.3047\\53\\-154.5426\\-188.5391\\53\\-154.5425\\-184.6328\\53\\-154.4196\\-180.7266\\53\\-154.0719\\-176.8203\\53\\-153.9951\\-174.8672\\53\\-153.8057\\-172.9141\\53\\-153.4689\\-170.9609\\53\\-152.9541\\-169.0078\\53\\-152.5745\\-167.0547\\53\\-151.9165\\-163.1484\\53\\-150.7463\\-159.2422\\53\\-150.0952\\-155.3359\\53\\-148.8796\\-151.4297\\53\\-147.968\\-147.5234\\53\\-147.177\\-145.5703\\53\\-145.8439\\-141.6641\\53\\-144.8783\\-139.7109\\53\\-144.3283\\-137.7578\\53\\-142.7429\\-133.8516\\53\\-142.2294\\-131.8984\\53\\-141.2604\\-129.9453\\53\\-140.4894\\-127.9922\\53\\-139.4166\\-126.0391\\53\\-137.6227\\-122.1328\\53\\-135.8906\\-118.2266\\53\\-133.7891\\-114.4614\\53\\-132.5326\\-112.3672\\53\\-131.1574\\-110.4141\\53\\-130.0904\\-108.4609\\53\\-128.7227\\-106.5078\\53\\-125.9766\\-103.2356\\53\\-124.0234\\-101.125\\53\\-121.4563\\-98.69531\\53\\-118.1641\\-95.77891\\53\\-116.2109\\-94.32573\\53\\-114.2578\\-93.29166\\53\\-110.3516\\-90.71394\\53\\-108.3984\\-89.66988\\53\\-106.4453\\-88.42725\\53\\-104.4922\\-87.70728\\53\\-102.5391\\-86.69856\\53\\-100.5859\\-86.08828\\53\\-96.67969\\-84.42767\\53\\-94.72656\\-83.73146\\53\\-92.77344\\-82.83508\\53\\-90.82031\\-82.12505\\53\\-88.86719\\-81.66271\\53\\-86.91406\\-80.81839\\53\\-83.00781\\-79.91868\\53\\-79.10156\\-78.84925\\53\\-75.19531\\-78.03726\\53\\-73.24219\\-77.75757\\53\\-69.33594\\-77.03655\\53\\-65.42969\\-76.44586\\53\\-55.66406\\-76.14718\\53\\-51.75781\\-76.18206\\53\\-45.89844\\-76.51251\\53\\-41.99219\\-76.96346\\53\\-38.08594\\-77.63858\\53\\-34.17969\\-78.17066\\53\\-30.27344\\-78.92834\\53\\-28.32031\\-79.48251\\53\\-22.46094\\-80.53635\\53\\-20.50781\\-81.01398\\53\\-18.55469\\-81.64673\\53\\-16.60156\\-81.99548\\53\\-14.64844\\-82.20553\\53\\-12.69531\\-82.31407\\53\\-10.74219\\-82.30943\\53\\-8.789063\\-82.19498\\53\\-2.929688\\-81.71249\\53\\0.9765625\\-81.33504\\53\\4.882813\\-81.17322\\53\\6.835938\\-81.14181\\53\\10.74219\\-81.25107\\53\\12.69531\\-81.39301\\53\\14.64844\\-81.43056\\53\\16.60156\\-81.23532\\53\\20.50781\\-80.41964\\53\\24.41406\\-79.51334\\53\\26.36719\\-78.87109\\53\\28.32031\\-78.3493\\53\\32.22656\\-77.58452\\53\\34.17969\\-77.13017\\53\\38.08594\\-76.49306\\53\\43.94531\\-76.32793\\53\\51.75781\\-76.32262\\53\\59.57031\\-76.61452\\53\\61.52344\\-76.81643\\53\\65.42969\\-77.33576\\53\\67.38281\\-77.67087\\53\\71.28906\\-78.08705\\53\\75.19531\\-78.69931\\53\\77.14844\\-79.06932\\53\\79.10156\\-79.55332\\53\\83.00781\\-80.2153\\53\\84.96094\\-80.46821\\53\\86.91406\\-80.83296\\53\\90.82031\\-81.89721\\53\\92.77344\\-82.22396\\53\\94.72656\\-82.67836\\53\\96.67969\\-83.48047\\53\\100.5859\\-84.76435\\53\\102.5391\\-85.65639\\53\\104.4922\\-86.26796\\53\\106.4453\\-87.22446\\53\\108.3984\\-87.94702\\53\\110.3516\\-88.85705\\53\\112.3047\\-89.93497\\53\\114.2578\\-91.26646\\53\\116.2109\\-92.49713\\53\\118.1641\\-93.9472\\53\\121.304\\-96.74219\\53\\123.1\\-98.69531\\53\\126.1636\\-102.6016\\53\\128.7802\\-106.5078\\53\\129.9235\\-108.4609\\53\\130.9105\\-110.4141\\53\\132.1929\\-112.3672\\53\\133.1772\\-114.3203\\53\\134.4342\\-116.2734\\53\\135.2572\\-118.2266\\53\\136.3294\\-120.1797\\53\\136.9153\\-122.1328\\53\\138.0568\\-124.0859\\53\\138.7775\\-126.0391\\53\\139.81\\-127.9922\\53\\141.3591\\-131.8984\\53\\142.2422\\-133.8516\\53\\142.7047\\-135.8047\\53\\143.3519\\-137.7578\\53\\144.2038\\-139.7109\\53\\144.6761\\-141.6641\\53\\146.2137\\-145.5703\\53\\146.7026\\-147.5234\\53\\147.4609\\-149.5723\\53\\148.0421\\-151.4297\\53\\148.7317\\-155.3359\\53\\149.1484\\-157.2891\\53\\149.7206\\-159.2422\\53\\150.1073\\-161.1953\\53\\150.7415\\-167.0547\\53\\151.6602\\-172.9141\\53\\151.8468\\-174.8672\\53\\152.0533\\-178.7734\\53\\152.1802\\-184.6328\\53\\152.1762\\-188.5391\\53\\152.0533\\-194.3984\\53\\151.9054\\-198.3047\\53\\151.6263\\-202.2109\\53\\150.6503\\-210.0234\\53\\150.3024\\-213.9297\\53\\150.0507\\-215.8828\\53\\149.6564\\-217.8359\\53\\149.047\\-219.7891\\53\\148.2738\\-223.6953\\53\\147.739\\-225.6484\\53\\146.8348\\-227.6016\\53\\146.1189\\-229.5547\\53\\144.928\\-231.5078\\53\\144.1274\\-233.4609\\53\\142.8885\\-235.4141\\53\\141.956\\-237.3672\\53\\140.5625\\-239.3203\\53\\137.3567\\-243.2266\\53\\135.8325\\-245.1797\\53\\133.7891\\-247.5628\\53\\131.8359\\-249.5242\\53\\128.232\\-252.9922\\53\\125.9669\\-254.9453\\53\\122.0703\\-257.9516\\53\\121.0272\\-258.8516\\53\\118.1641\\-261.0107\\53\\116.2109\\-262.1449\\53\\114.2578\\-263.4363\\53\\112.3047\\-264.3023\\53\\110.3516\\-265.5619\\53\\108.3644\\-266.6641\\53\\106.4453\\-267.618\\53\\102.5391\\-269.4047\\53\\100.5859\\-269.9552\\53\\98.63281\\-271.0119\\53\\96.67969\\-271.6656\\53\\94.72656\\-272.6042\\53\\92.77344\\-273.3719\\53\\90.82031\\-274.0204\\53\\88.86719\\-274.9419\\53\\84.96094\\-276.0042\\53\\83.00781\\-276.9433\\53\\81.05469\\-277.4859\\53\\77.14844\\-279.2701\\53\\75.19531\\-280.1057\\53\\73.24219\\-281.0435\\53\\71.28906\\-281.6787\\53\\69.33594\\-282.6727\\53\\67.38281\\-283.2827\\53\\65.42969\\-284.1259\\53\\63.47656\\-285.0993\\53\\61.52344\\-285.8831\\53\\59.57031\\-286.8705\\53\\57.61719\\-287.5158\\53\\55.66406\\-288.5155\\53\\53.71094\\-289.1074\\53\\51.75781\\-289.5906\\53\\49.80469\\-290.6128\\53\\47.85156\\-291.2027\\53\\43.94531\\-292.8289\\53\\41.99219\\-293.3961\\53\\40.03906\\-294.2641\\53\\38.08594\\-294.795\\53\\34.17969\\-295.6354\\53\\32.22656\\-296.4396\\53\\30.27344\\-296.8557\\53\\28.32031\\-297.1723\\53\\26.36719\\-297.6947\\53\\24.41406\\-298.3937\\53\\18.55469\\-299.3699\\53\\16.42072\\-299.8672\\53\\14.64844\\-300.182\\53\\10.74219\\-300.5608\\53\\2.929688\\-300.8954\\53\\-0.9765625\\-300.9373\\53\\-6.835938\\-300.782\\53\\-12.69531\\-300.4825\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "289" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "153" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-300.091\\55\\-18.55469\\-299.6127\\55\\-20.50781\\-299.2442\\55\\-24.41406\\-298.6671\\55\\-26.36719\\-298.301\\55\\-28.32031\\-297.6224\\55\\-30.27344\\-297.1897\\55\\-34.17969\\-296.6178\\55\\-38.08594\\-295.4694\\55\\-41.99219\\-294.8158\\55\\-43.94531\\-294.4049\\55\\-45.89844\\-293.6673\\55\\-49.80469\\-292.6396\\55\\-51.75781\\-291.792\\55\\-53.71094\\-291.1763\\55\\-55.66406\\-290.7186\\55\\-57.61719\\-289.8773\\55\\-59.57031\\-289.3096\\55\\-61.52344\\-288.9761\\55\\-63.47656\\-288.474\\55\\-65.42969\\-287.7022\\55\\-69.33594\\-286.7066\\55\\-71.28906\\-285.9096\\55\\-73.24219\\-285.3289\\55\\-75.19531\\-284.8492\\55\\-77.14844\\-284.0439\\55\\-79.10156\\-283.4284\\55\\-81.05469\\-283.1019\\55\\-83.00781\\-282.6358\\55\\-84.96094\\-281.9308\\55\\-86.91406\\-281.4125\\55\\-88.86719\\-281.012\\55\\-92.77344\\-279.5515\\55\\-94.72656\\-278.9784\\55\\-96.67969\\-277.9908\\55\\-100.5859\\-276.6684\\55\\-102.5391\\-275.6715\\55\\-104.4922\\-275.0484\\55\\-106.4453\\-273.8942\\55\\-108.3984\\-272.9324\\55\\-112.3047\\-270.1839\\55\\-114.2578\\-269.2031\\55\\-116.2109\\-267.7288\\55\\-120.1172\\-264.5187\\55\\-122.0703\\-263.0933\\55\\-124.0234\\-261.4125\\55\\-127.9297\\-257.5713\\55\\-128.6804\\-256.8984\\55\\-131.8359\\-253.5794\\55\\-134.1271\\-251.0391\\55\\-135.7422\\-248.9806\\55\\-136.9504\\-247.1328\\55\\-139.6484\\-243.6304\\55\\-140.024\\-243.2266\\55\\-142.4377\\-239.3203\\55\\-143.2683\\-237.3672\\55\\-144.3768\\-235.4141\\55\\-145.1801\\-233.4609\\55\\-146.247\\-231.5078\\55\\-146.9389\\-229.5547\\55\\-147.8985\\-227.6016\\55\\-148.8796\\-223.6953\\55\\-149.6153\\-221.7422\\55\\-150.142\\-219.7891\\55\\-150.8328\\-215.8828\\55\\-151.5416\\-213.9297\\55\\-152.0235\\-211.9766\\55\\-152.6384\\-208.0703\\55\\-153.5197\\-204.1641\\55\\-153.9659\\-200.2578\\55\\-154.1795\\-196.3516\\55\\-154.3135\\-192.4453\\55\\-154.2908\\-188.5391\\55\\-154.3674\\-184.6328\\55\\-154.1971\\-180.7266\\55\\-153.3203\\-179.244\\55\\-152.4431\\-178.7734\\55\\-151.6062\\-176.8203\\55\\-153.6873\\-174.8672\\55\\-153.4288\\-172.9141\\55\\-152.6493\\-169.0078\\55\\-152.0235\\-165.1016\\55\\-151.591\\-163.1484\\55\\-150.9209\\-161.1953\\55\\-150.512\\-159.2422\\55\\-150.224\\-157.2891\\55\\-149.817\\-155.3359\\55\\-149.1298\\-153.3828\\55\\-148.6217\\-151.4297\\55\\-148.2457\\-149.4766\\55\\-147.6647\\-147.5234\\55\\-146.839\\-145.5703\\55\\-146.2467\\-143.6172\\55\\-144.6332\\-139.7109\\55\\-144.0979\\-137.7578\\55\\-143.1245\\-135.8047\\55\\-141.9523\\-131.8984\\55\\-140.9486\\-129.9453\\55\\-140.2252\\-127.9922\\55\\-139.0425\\-126.0391\\55\\-138.3118\\-124.0859\\55\\-137.2621\\-122.1328\\55\\-136.5297\\-120.1797\\55\\-135.4047\\-118.2266\\55\\-134.5691\\-116.2734\\55\\-133.284\\-114.3203\\55\\-132.2198\\-112.3672\\55\\-130.821\\-110.4141\\55\\-129.8828\\-108.6746\\55\\-128.4317\\-106.5078\\55\\-125.9766\\-103.5851\\55\\-124.0234\\-101.4488\\55\\-121.1291\\-98.69531\\55\\-118.1641\\-96.11486\\55\\-116.2109\\-94.63572\\55\\-112.3047\\-92.34447\\55\\-110.3516\\-91.27202\\55\\-108.3984\\-89.9866\\55\\-104.4922\\-87.99695\\55\\-98.63281\\-85.55919\\55\\-96.67969\\-84.66662\\55\\-90.82031\\-82.19456\\55\\-88.86719\\-81.76185\\55\\-86.91406\\-80.99905\\55\\-84.96094\\-80.45584\\55\\-81.05469\\-79.58655\\55\\-79.10156\\-79.01546\\55\\-75.19531\\-78.19892\\55\\-71.28906\\-77.62385\\55\\-65.42969\\-76.61681\\55\\-61.52344\\-76.42847\\55\\-55.66406\\-76.26452\\55\\-51.75781\\-76.29429\\55\\-49.80469\\-76.40706\\55\\-45.89844\\-76.73882\\55\\-42.04102\\-77.21094\\55\\-40.03906\\-77.56065\\55\\-34.17969\\-78.37486\\55\\-32.22656\\-78.74812\\55\\-28.32031\\-79.71745\\55\\-22.46094\\-80.74483\\55\\-20.50781\\-81.367\\55\\-18.55469\\-81.84319\\55\\-16.60156\\-82.05824\\55\\-12.69531\\-82.25947\\55\\-8.789063\\-82.06398\\55\\-4.882813\\-81.72173\\55\\-2.929688\\-81.41599\\55\\2.929688\\-81.02985\\55\\6.835938\\-80.94171\\55\\10.74219\\-80.95443\\55\\14.64844\\-81.1254\\55\\16.60156\\-80.99905\\55\\20.50781\\-80.41964\\55\\24.41406\\-79.63527\\55\\26.36719\\-79.02863\\55\\30.27344\\-78.12505\\55\\32.22656\\-77.79567\\55\\36.13281\\-77.02393\\55\\40.03906\\-76.57983\\55\\41.99219\\-76.47852\\55\\51.75781\\-76.48779\\55\\55.66406\\-76.62628\\55\\61.52344\\-77.14436\\55\\67.38281\\-77.92371\\55\\69.33594\\-78.12347\\55\\73.24219\\-78.64211\\55\\77.14844\\-79.44206\\55\\81.05469\\-80.17336\\55\\84.96094\\-80.65248\\55\\86.83268\\-81.11719\\55\\88.86719\\-81.73631\\55\\92.77344\\-82.41724\\55\\96.67969\\-83.73484\\55\\98.63281\\-84.30585\\55\\102.5391\\-85.86758\\55\\104.4922\\-86.47883\\55\\106.4453\\-87.50497\\55\\108.3984\\-88.12215\\55\\110.3516\\-89.21983\\55\\112.3047\\-90.21107\\55\\116.2109\\-92.96114\\55\\118.1641\\-94.21825\\55\\120.1172\\-95.84806\\55\\122.9162\\-98.69531\\55\\124.4801\\-100.6484\\55\\125.9766\\-102.7139\\55\\128.63\\-106.5078\\55\\130.7752\\-110.4141\\55\\131.9627\\-112.3672\\55\\133.0205\\-114.3203\\55\\134.2364\\-116.2734\\55\\135.0932\\-118.2266\\55\\136.1677\\-120.1797\\55\\136.8049\\-122.1328\\55\\137.8046\\-124.0859\\55\\139.4821\\-127.9922\\55\\140.4657\\-129.9453\\55\\141.1513\\-131.8984\\55\\142.1348\\-133.8516\\55\\143.1518\\-137.7578\\55\\144.0677\\-139.7109\\55\\144.5726\\-141.6641\\55\\145.1801\\-143.6172\\55\\146.0779\\-145.5703\\55\\146.5727\\-147.5234\\55\\147.8929\\-151.4297\\55\\148.3004\\-153.3828\\55\\148.9898\\-157.2891\\55\\149.9821\\-161.1953\\55\\150.2551\\-163.1484\\55\\150.824\\-169.0078\\55\\151.4048\\-172.9141\\55\\151.8019\\-176.8203\\55\\151.9742\\-180.7266\\55\\152.0433\\-184.6328\\55\\152.03\\-188.5391\\55\\151.8809\\-194.3984\\55\\151.6712\\-198.3047\\55\\151.3134\\-202.2109\\55\\150.8665\\-206.1172\\55\\150.1684\\-213.9297\\55\\149.8306\\-215.8828\\55\\148.8255\\-219.7891\\55\\148.0862\\-223.6953\\55\\147.4609\\-225.4333\\55\\145.7896\\-229.5547\\55\\144.6574\\-231.5078\\55\\143.7789\\-233.4609\\55\\141.6016\\-237.2491\\55\\140.2391\\-239.3203\\55\\137.6953\\-242.4979\\55\\133.7891\\-246.9756\\55\\129.6794\\-251.0391\\55\\125.9766\\-254.4806\\55\\123.014\\-256.8984\\55\\120.1172\\-259.1221\\55\\116.2109\\-261.7686\\55\\114.2578\\-263.0316\\55\\112.3047\\-263.8747\\55\\110.3516\\-265.1358\\55\\108.3984\\-266.047\\55\\106.4453\\-267.2523\\55\\104.4922\\-268.0053\\55\\102.5391\\-269.0535\\55\\100.5859\\-269.6411\\55\\98.63281\\-270.4231\\55\\96.67969\\-271.3548\\55\\94.72656\\-271.9849\\55\\92.77344\\-272.9997\\55\\90.82031\\-273.6573\\55\\86.91406\\-275.2301\\55\\84.96094\\-275.7223\\55\\83.00781\\-276.5874\\55\\79.10156\\-277.9727\\55\\77.14844\\-279.1044\\55\\75.19531\\-279.8724\\55\\73.24219\\-280.9243\\55\\71.28906\\-281.5783\\55\\69.33594\\-282.5733\\55\\67.38281\\-283.2484\\55\\65.42969\\-284.0409\\55\\63.47656\\-285.0516\\55\\61.52344\\-285.8291\\55\\59.57031\\-286.8558\\55\\57.61719\\-287.5118\\55\\55.66406\\-288.5267\\55\\53.71094\\-289.1074\\55\\51.75781\\-289.5777\\55\\49.80469\\-290.6296\\55\\47.85156\\-291.2226\\55\\43.94531\\-292.8592\\55\\41.99219\\-293.464\\55\\40.03906\\-294.3109\\55\\38.08594\\-294.8323\\55\\36.13281\\-295.1932\\55\\34.17969\\-295.7222\\55\\32.22656\\-296.4897\\55\\28.32031\\-297.2033\\55\\24.41406\\-298.4603\\55\\18.55469\\-299.4188\\55\\16.60156\\-299.9048\\55\\14.64844\\-300.2263\\55\\10.74219\\-300.5759\\55\\6.835938\\-300.7699\\55\\0.9765625\\-300.9503\\55\\-2.929688\\-300.932\\55\\-6.835938\\-300.8154\\55\\-12.69531\\-300.5275\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "299" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "154" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-300.1377\\57\\-20.50781\\-299.2951\\57\\-24.41406\\-298.7001\\57\\-26.36719\\-298.3488\\57\\-28.32031\\-297.6822\\57\\-30.27344\\-297.2142\\57\\-34.17969\\-296.6405\\57\\-36.13281\\-296.1175\\57\\-38.08594\\-295.4825\\57\\-41.99219\\-294.8341\\57\\-43.94531\\-294.4023\\57\\-45.89844\\-293.6521\\57\\-49.80469\\-292.6396\\57\\-51.75781\\-291.7357\\57\\-53.71094\\-291.1216\\57\\-55.66406\\-290.6572\\57\\-57.61719\\-289.7286\\57\\-59.57031\\-289.2537\\57\\-61.52344\\-288.8945\\57\\-63.47656\\-288.3186\\57\\-65.42969\\-287.5479\\57\\-69.33594\\-286.5418\\57\\-71.28906\\-285.6804\\57\\-75.19531\\-284.6291\\57\\-77.14844\\-283.7603\\57\\-81.05469\\-282.9254\\57\\-84.96094\\-281.6486\\57\\-88.86719\\-280.7581\\57\\-90.82031\\-279.8955\\57\\-94.72656\\-278.6066\\57\\-96.67969\\-277.649\\57\\-98.63281\\-277.118\\57\\-100.5859\\-276.16\\57\\-104.4922\\-274.7153\\57\\-104.8177\\-274.4766\\57\\-108.3139\\-272.5234\\57\\-110.3516\\-271.2896\\57\\-112.3047\\-269.8746\\57\\-114.2578\\-268.867\\57\\-116.2109\\-267.4364\\57\\-120.1172\\-264.1055\\57\\-122.0064\\-262.7578\\57\\-124.2247\\-260.8047\\57\\-128.3763\\-256.8984\\57\\-130.2279\\-254.9453\\57\\-133.7891\\-250.823\\57\\-135.7422\\-248.5017\\57\\-136.6828\\-247.1328\\57\\-138.19\\-245.1797\\57\\-139.6484\\-243.1271\\57\\-142.216\\-239.3203\\57\\-143.0092\\-237.3672\\57\\-144.1606\\-235.4141\\57\\-144.8938\\-233.4609\\57\\-146.0202\\-231.5078\\57\\-146.6964\\-229.5547\\57\\-147.6249\\-227.6016\\57\\-148.2689\\-225.6484\\57\\-148.6955\\-223.6953\\57\\-149.9821\\-219.7891\\57\\-150.6575\\-215.8828\\57\\-151.1574\\-213.9297\\57\\-151.8019\\-211.9766\\57\\-152.1752\\-210.0234\\57\\-152.7861\\-206.1172\\57\\-153.556\\-202.2109\\57\\-153.7823\\-200.2578\\57\\-154.031\\-196.3516\\57\\-154.1998\\-190.4922\\57\\-154.1901\\-184.6328\\57\\-154.1491\\-182.6797\\57\\-153.755\\-180.7266\\57\\-153.3203\\-180.2919\\57\\-151.3672\\-179.8018\\57\\-149.4141\\-181.1705\\57\\-147.4609\\-181.0335\\57\\-145.5078\\-180.0368\\57\\-143.5547\\-179.474\\57\\-142.4037\\-178.7734\\57\\-143.5547\\-177.6992\\57\\-144.2871\\-176.8203\\57\\-145.2456\\-174.8672\\57\\-145.5078\\-174.5627\\57\\-147.4609\\-173.087\\57\\-149.4141\\-173.3349\\57\\-151.3672\\-173.9317\\57\\-151.9134\\-172.9141\\57\\-152.491\\-170.9609\\57\\-152.4193\\-169.0078\\57\\-152.1474\\-167.0547\\57\\-151.7639\\-165.1016\\57\\-151.1302\\-163.1484\\57\\-150.6564\\-161.1953\\57\\-150.0423\\-157.2891\\57\\-148.8607\\-153.3828\\57\\-148.0493\\-149.4766\\57\\-147.24\\-147.5234\\57\\-145.9872\\-143.6172\\57\\-145.0133\\-141.6641\\57\\-144.439\\-139.7109\\57\\-143.7645\\-137.7578\\57\\-142.881\\-135.8047\\57\\-142.3816\\-133.8516\\57\\-140.6883\\-129.9453\\57\\-139.9075\\-127.9922\\57\\-138.7906\\-126.0391\\57\\-138.0143\\-124.0859\\57\\-137.0124\\-122.1328\\57\\-136.2953\\-120.1797\\57\\-135.1149\\-118.2266\\57\\-134.3061\\-116.2734\\57\\-132.9773\\-114.3203\\57\\-130.6839\\-110.4141\\57\\-128.1389\\-106.5078\\57\\-126.4986\\-104.5547\\57\\-124.0234\\-101.778\\57\\-120.785\\-98.69531\\57\\-118.4346\\-96.74219\\57\\-118.1641\\-96.4342\\57\\-115.9668\\-94.78906\\57\\-114.2578\\-93.82449\\57\\-112.3047\\-92.59004\\57\\-110.3516\\-91.6725\\57\\-108.3984\\-90.34956\\57\\-106.4453\\-89.43436\\57\\-104.4922\\-88.23599\\57\\-102.5391\\-87.60291\\57\\-100.5859\\-86.61713\\57\\-98.63281\\-85.82076\\57\\-94.72656\\-84.02403\\57\\-92.77344\\-83.27855\\57\\-90.82031\\-82.38287\\57\\-86.91406\\-81.39092\\57\\-84.96094\\-80.65248\\57\\-83.00781\\-80.26481\\57\\-79.10156\\-79.35043\\57\\-77.14844\\-78.80724\\57\\-73.24219\\-78.07589\\57\\-65.42969\\-76.95467\\57\\-61.52344\\-76.61734\\57\\-55.66406\\-76.395\\57\\-53.71094\\-76.37666\\57\\-49.80469\\-76.56208\\57\\-43.94531\\-77.24879\\57\\-40.03906\\-77.81236\\57\\-36.13281\\-78.26307\\57\\-32.22656\\-79.06932\\57\\-30.27344\\-79.58836\\57\\-24.41406\\-80.5863\\57\\-20.50781\\-81.64925\\57\\-18.55469\\-81.94634\\57\\-16.60156\\-82.12352\\57\\-12.69531\\-82.18961\\57\\-8.789063\\-81.95159\\57\\-4.882813\\-81.50924\\57\\-0.9765625\\-81.1254\\57\\2.929688\\-80.91436\\57\\4.882813\\-80.85825\\57\\10.74219\\-80.80614\\57\\14.64844\\-80.88609\\57\\16.60156\\-80.83296\\57\\18.55469\\-80.66281\\57\\22.46094\\-80.21276\\57\\26.36719\\-79.29688\\57\\28.32031\\-78.73869\\57\\32.22656\\-77.97443\\57\\36.13281\\-77.32191\\57\\40.03906\\-76.83794\\57\\41.99219\\-76.71606\\57\\51.75781\\-76.72266\\57\\55.66406\\-76.92911\\57\\59.57031\\-77.24879\\57\\69.33594\\-78.29058\\57\\73.24219\\-78.90498\\57\\75.19531\\-79.36382\\57\\77.14844\\-79.71017\\57\\81.05469\\-80.28257\\57\\83.00781\\-80.51476\\57\\84.96094\\-80.88432\\57\\86.91406\\-81.45467\\57\\88.86719\\-81.89233\\57\\92.77344\\-82.61808\\57\\94.72656\\-83.34431\\57\\98.63281\\-84.50539\\57\\100.5859\\-85.44662\\57\\102.5391\\-86.04414\\57\\104.4922\\-86.76522\\57\\106.4453\\-87.72631\\57\\108.3984\\-88.36501\\57\\110.3516\\-89.54479\\57\\112.3047\\-90.48301\\57\\115.7227\\-92.83594\\57\\116.2109\\-93.26412\\57\\118.1641\\-94.53329\\57\\120.1172\\-96.15244\\57\\122.6232\\-98.69531\\57\\124.1962\\-100.6484\\57\\128.4849\\-106.5078\\57\\129.4994\\-108.4609\\57\\130.677\\-110.4141\\57\\131.6745\\-112.3672\\57\\134.086\\-116.2734\\57\\134.9383\\-118.2266\\57\\135.9751\\-120.1797\\57\\137.5351\\-124.0859\\57\\138.5091\\-126.0391\\57\\139.2513\\-127.9922\\57\\140.3393\\-129.9453\\57\\141.0074\\-131.8984\\57\\141.9881\\-133.8516\\57\\142.5484\\-135.8047\\57\\143.0086\\-137.7578\\57\\143.9116\\-139.7109\\57\\145.0103\\-143.6172\\57\\145.9358\\-145.5703\\57\\146.9974\\-149.4766\\57\\147.739\\-151.4297\\57\\148.1992\\-153.3828\\57\\148.8643\\-157.2891\\57\\149.8413\\-161.1953\\57\\150.1539\\-163.1484\\57\\150.8852\\-170.9609\\57\\151.591\\-176.8203\\57\\151.724\\-178.7734\\57\\151.864\\-182.6797\\57\\151.864\\-188.5391\\57\\151.7442\\-192.4453\\57\\151.5542\\-196.3516\\57\\150.824\\-204.1641\\57\\150.2125\\-211.9766\\57\\149.9602\\-213.9297\\57\\149.559\\-215.8828\\57\\149.0111\\-217.8359\\57\\148.3104\\-221.7422\\57\\147.8581\\-223.6953\\57\\146.9974\\-225.6484\\57\\146.3397\\-227.6016\\57\\144.4246\\-231.5078\\57\\143.2957\\-233.4609\\57\\142.4216\\-235.4141\\57\\139.8186\\-239.3203\\57\\137.6953\\-242.0625\\57\\135.035\\-245.1797\\57\\131.8359\\-248.5474\\57\\129.2894\\-251.0391\\57\\125.9766\\-254.0932\\57\\124.0234\\-255.7173\\57\\122.0703\\-257.1928\\57\\120.1172\\-258.4568\\57\\116.2109\\-261.3919\\57\\114.2578\\-262.3916\\57\\112.3047\\-263.587\\57\\110.0426\\-264.7109\\57\\106.4453\\-266.6718\\57\\100.5859\\-269.3898\\57\\98.63281\\-269.9257\\57\\96.67969\\-270.9341\\57\\94.72656\\-271.6151\\57\\92.77344\\-272.4258\\57\\90.82031\\-273.3472\\57\\88.86719\\-274.004\\57\\86.91406\\-274.9616\\57\\84.96094\\-275.5194\\57\\83.00781\\-276.1855\\57\\81.05469\\-277.1321\\57\\79.10156\\-277.7695\\57\\77.14844\\-278.9064\\57\\75.19531\\-279.7098\\57\\73.24219\\-280.8085\\57\\71.28906\\-281.4945\\57\\69.33594\\-282.4645\\57\\65.42969\\-283.9745\\57\\63.47656\\-285.0308\\57\\61.52344\\-285.806\\57\\59.57031\\-286.8558\\57\\57.61719\\-287.5118\\57\\55.66406\\-288.5155\\57\\51.75781\\-289.6432\\57\\49.80469\\-290.6809\\57\\47.85156\\-291.2442\\57\\45.89844\\-292.1494\\57\\43.94531\\-292.9067\\57\\41.99219\\-293.5136\\57\\40.03906\\-294.3814\\57\\38.08594\\-294.8674\\57\\36.13281\\-295.2423\\57\\34.17969\\-295.8032\\57\\32.22656\\-296.5372\\57\\28.32031\\-297.2612\\57\\24.41406\\-298.5138\\57\\20.50781\\-299.144\\57\\16.60156\\-300.0026\\57\\14.64844\\-300.2787\\57\\10.74219\\-300.5982\\57\\6.835938\\-300.804\\57\\0.9765625\\-300.9908\\57\\-0.9765625\\-300.9976\\57\\-6.835938\\-300.8438\\57\\-12.69531\\-300.5569\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "301" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "155" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-300.1711\\59\\-20.50781\\-299.3404\\59\\-26.36719\\-298.3937\\59\\-28.32031\\-297.7477\\59\\-30.27344\\-297.2465\\59\\-34.17969\\-296.6593\\59\\-36.13281\\-296.1723\\59\\-38.08594\\-295.4956\\59\\-41.99219\\-294.8391\\59\\-43.94531\\-294.4049\\59\\-45.89844\\-293.6392\\59\\-49.80469\\-292.6166\\59\\-51.75781\\-291.6909\\59\\-53.71094\\-291.0877\\59\\-55.66406\\-290.5956\\59\\-57.61719\\-289.6393\\59\\-61.52344\\-288.8098\\59\\-65.42969\\-287.4218\\59\\-67.38281\\-286.9502\\59\\-69.33594\\-286.3174\\59\\-71.28906\\-285.4846\\59\\-73.24219\\-284.9938\\59\\-77.14844\\-283.5463\\59\\-81.05469\\-282.6838\\59\\-83.00781\\-281.9333\\59\\-86.91406\\-281.0044\\59\\-88.86719\\-280.3588\\59\\-90.82031\\-279.5536\\59\\-92.77344\\-278.9987\\59\\-94.72656\\-278.0596\\59\\-98.63281\\-276.7804\\59\\-100.5859\\-275.8146\\59\\-102.5391\\-275.2517\\59\\-106.4453\\-273.3015\\59\\-108.3984\\-271.9698\\59\\-110.3516\\-270.9648\\59\\-116.2109\\-267.0756\\59\\-120.1172\\-263.7461\\59\\-121.5041\\-262.7578\\59\\-123.7146\\-260.8047\\59\\-125.9766\\-258.625\\59\\-127.8865\\-256.8984\\59\\-129.8828\\-254.8477\\59\\-131.3726\\-252.9922\\59\\-134.8778\\-249.0859\\59\\-136.4553\\-247.1328\\59\\-139.1236\\-243.2266\\59\\-140.6136\\-241.2734\\59\\-141.9103\\-239.3203\\59\\-142.7847\\-237.3672\\59\\-143.9006\\-235.4141\\59\\-144.6607\\-233.4609\\59\\-145.721\\-231.5078\\59\\-147.2572\\-227.6016\\59\\-148.0818\\-225.6484\\59\\-149.0331\\-221.7422\\59\\-149.7467\\-219.7891\\59\\-150.1988\\-217.8359\\59\\-150.8634\\-213.9297\\59\\-151.5158\\-211.9766\\59\\-151.9954\\-210.0234\\59\\-152.8503\\-204.1641\\59\\-153.5441\\-200.2578\\59\\-153.8597\\-196.3516\\59\\-153.9477\\-194.3984\\59\\-154.0514\\-188.5391\\59\\-154.0232\\-184.6328\\59\\-153.9368\\-182.6797\\59\\-153.3203\\-181.8437\\59\\-151.3672\\-180.7744\\59\\-149.4141\\-182.2689\\59\\-147.4609\\-182.3821\\59\\-145.0331\\-180.7266\\59\\-143.5547\\-179.9874\\59\\-141.6016\\-179.6632\\59\\-140.479\\-178.7734\\59\\-143.0249\\-174.8672\\59\\-143.5547\\-173.7353\\59\\-144.1569\\-172.9141\\59\\-145.5078\\-171.7221\\59\\-147.4609\\-171.1296\\59\\-149.4141\\-172.0051\\59\\-151.3672\\-171.6743\\59\\-151.9695\\-170.9609\\59\\-152.2021\\-169.0078\\59\\-151.9165\\-167.0547\\59\\-150.8031\\-163.1484\\59\\-150.1918\\-159.2422\\59\\-149.7724\\-157.2891\\59\\-149.0583\\-155.3359\\59\\-148.2457\\-151.4297\\59\\-147.739\\-149.4766\\59\\-146.8918\\-147.5234\\59\\-146.3486\\-145.5703\\59\\-145.6442\\-143.6172\\59\\-144.7477\\-141.6641\\59\\-144.2115\\-139.7109\\59\\-143.2977\\-137.7578\\59\\-142.1513\\-133.8516\\59\\-141.1611\\-131.8984\\59\\-140.4224\\-129.9453\\59\\-139.4149\\-127.9922\\59\\-137.5781\\-124.0859\\59\\-135.9652\\-120.1797\\59\\-134.8748\\-118.2266\\59\\-133.9673\\-116.2734\\59\\-131.8359\\-112.9292\\59\\-131.4135\\-112.3672\\59\\-130.4803\\-110.4141\\59\\-127.9297\\-106.7302\\59\\-126.2008\\-104.5547\\59\\-124.0234\\-102.1133\\59\\-122.5586\\-100.6484\\59\\-120.1172\\-98.44783\\59\\-117.9874\\-96.74219\\59\\-115.4199\\-94.78906\\59\\-114.2578\\-94.02951\\59\\-112.3047\\-93.06432\\59\\-110.3516\\-91.98356\\59\\-108.3984\\-90.78807\\59\\-106.4453\\-89.76421\\59\\-104.4922\\-88.59423\\59\\-102.5391\\-87.86041\\59\\-100.5859\\-86.87581\\59\\-96.67969\\-85.22784\\59\\-94.72656\\-84.21061\\59\\-92.77344\\-83.53625\\59\\-90.82031\\-82.64008\\59\\-88.86719\\-82.09978\\59\\-86.91406\\-81.7005\\59\\-84.96094\\-80.89934\\59\\-83.00781\\-80.40751\\59\\-79.10156\\-79.66537\\59\\-77.14844\\-79.11188\\59\\-73.24219\\-78.27267\\59\\-63.47656\\-77.04935\\59\\-61.52344\\-76.90576\\59\\-57.61719\\-76.79057\\59\\-55.66406\\-76.63197\\59\\-53.71094\\-76.60059\\59\\-49.80469\\-76.87395\\59\\-45.89844\\-77.37856\\59\\-38.08594\\-78.24995\\59\\-36.13281\\-78.56175\\59\\-32.22656\\-79.48959\\59\\-26.36719\\-80.44348\\59\\-24.41406\\-80.87119\\59\\-22.46094\\-81.41824\\59\\-20.50781\\-81.86213\\59\\-16.60156\\-82.15925\\59\\-14.64844\\-82.19498\\59\\-12.69531\\-82.12389\\59\\-8.789063\\-81.83844\\59\\-4.882813\\-81.36319\\59\\-0.9765625\\-81\\59\\2.929688\\-80.84754\\59\\10.74219\\-80.68392\\59\\14.64844\\-80.70856\\59\\18.55469\\-80.59592\\59\\22.46094\\-80.24223\\59\\24.41406\\-79.81726\\59\\26.36719\\-79.49908\\59\\28.32031\\-78.98968\\59\\32.22656\\-78.1875\\59\\36.13281\\-77.62109\\59\\40.03906\\-77.15875\\59\\41.99219\\-77.06233\\59\\45.89844\\-77.02393\\59\\51.75781\\-77.0755\\59\\55.66406\\-77.23419\\59\\59.57031\\-77.55599\\59\\67.38281\\-78.25964\\59\\71.28906\\-78.79707\\59\\75.19531\\-79.61221\\59\\79.10156\\-80.18741\\59\\83.00781\\-80.70856\\59\\86.91406\\-81.72832\\59\\90.82031\\-82.37276\\59\\92.77344\\-82.88947\\59\\94.72656\\-83.59902\\59\\96.67969\\-84.13809\\59\\98.63281\\-84.78442\\59\\100.5859\\-85.68821\\59\\102.5391\\-86.25128\\59\\104.4922\\-87.14063\\59\\108.3984\\-88.63089\\59\\112.2735\\-90.88281\\59\\115.3129\\-92.83594\\59\\117.998\\-94.78906\\59\\120.1172\\-96.51839\\59\\122.2486\\-98.69531\\59\\124.0234\\-100.8349\\59\\125.9766\\-103.3224\\59\\128.3075\\-106.5078\\59\\129.3335\\-108.4609\\59\\130.5565\\-110.4141\\59\\131.4439\\-112.3672\\59\\131.8359\\-112.8923\\59\\133.8412\\-116.2734\\59\\135.7422\\-120.1448\\59\\136.6349\\-122.1328\\59\\137.3033\\-124.0859\\59\\138.3921\\-126.0391\\59\\139.0947\\-127.9922\\59\\140.2213\\-129.9453\\59\\140.8705\\-131.8984\\59\\141.8258\\-133.8516\\59\\142.4583\\-135.8047\\59\\142.9224\\-137.7578\\59\\143.7383\\-139.7109\\59\\144.379\\-141.6641\\59\\144.8817\\-143.6172\\59\\145.7553\\-145.5703\\59\\146.3629\\-147.5234\\59\\146.8307\\-149.4766\\59\\147.5571\\-151.4297\\59\\148.1022\\-153.3828\\59\\149.0979\\-159.2422\\59\\149.6434\\-161.1953\\59\\150.0299\\-163.1484\\59\\150.2615\\-165.1016\\59\\150.7142\\-170.9609\\59\\151.448\\-178.7734\\59\\151.649\\-182.6797\\59\\151.6377\\-188.5391\\59\\151.4893\\-192.4453\\59\\151.0237\\-198.3047\\59\\150.2355\\-210.0234\\59\\150.0338\\-211.9766\\59\\149.7206\\-213.9297\\59\\149.1995\\-215.8828\\59\\148.7903\\-217.8359\\59\\148.1297\\-221.7422\\59\\147.5285\\-223.6953\\59\\146.7203\\-225.6484\\59\\146.0714\\-227.6016\\59\\144.9542\\-229.5547\\59\\144.1833\\-231.5078\\59\\142.9269\\-233.4609\\59\\142.1274\\-235.4141\\59\\139.2645\\-239.3203\\59\\137.8823\\-241.2734\\59\\136.3253\\-243.2266\\59\\134.6608\\-245.1797\\59\\131.8359\\-248.1975\\59\\128.9135\\-251.0391\\59\\125.9766\\-253.6613\\59\\124.0234\\-255.3255\\59\\121.8284\\-256.8984\\59\\120.1172\\-258.0289\\59\\118.1641\\-259.5456\\59\\116.2109\\-260.8761\\59\\114.2578\\-261.9628\\59\\112.3047\\-263.2004\\59\\110.3516\\-264.0024\\59\\108.3984\\-265.2082\\59\\106.4453\\-266.0432\\59\\104.4922\\-267.2087\\59\\102.5391\\-267.9767\\59\\100.5859\\-268.9895\\59\\96.67969\\-270.3374\\59\\94.72656\\-271.2868\\59\\92.77344\\-271.9375\\59\\90.82031\\-272.9934\\59\\88.86719\\-273.6655\\59\\86.91406\\-274.5742\\59\\84.96094\\-275.3197\\59\\83.00781\\-275.9049\\59\\81.05469\\-276.9339\\59\\79.10156\\-277.5848\\59\\77.14844\\-278.7105\\59\\75.19531\\-279.5558\\59\\73.24219\\-280.6771\\59\\71.28906\\-281.4217\\59\\69.33594\\-282.3764\\59\\65.42969\\-283.9237\\59\\63.47656\\-285.014\\59\\61.52344\\-285.7732\\59\\59.57031\\-286.8558\\59\\57.61719\\-287.5242\\59\\55.66406\\-288.5377\\59\\51.75781\\-289.6773\\59\\49.80469\\-290.7259\\59\\47.85156\\-291.2951\\59\\45.89844\\-292.2664\\59\\41.99219\\-293.5786\\59\\40.03906\\-294.4482\\59\\36.13281\\-295.2915\\59\\34.17969\\-295.8906\\59\\32.22656\\-296.5983\\59\\28.32031\\-297.3304\\59\\26.36719\\-298.0226\\59\\24.41406\\-298.5634\\59\\20.50781\\-299.2033\\59\\16.60156\\-300.0789\\59\\12.69531\\-300.5051\\59\\6.835938\\-300.838\\59\\0.9765625\\-301.0095\\59\\-2.929688\\-300.9875\\59\\-8.789063\\-300.7927\\59\\-14.64844\\-300.4244\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "156" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-299.8748\\61\\-20.50781\\-299.385\\61\\-26.36719\\-298.4442\\61\\-30.27344\\-297.2798\\61\\-34.17969\\-296.6878\\61\\-36.13281\\-296.1979\\61\\-38.08594\\-295.5396\\61\\-41.99219\\-294.8457\\61\\-43.94531\\-294.4049\\61\\-45.89844\\-293.621\\61\\-49.80469\\-292.5848\\61\\-51.75781\\-291.6478\\61\\-55.66406\\-290.5227\\61\\-57.61719\\-289.5752\\61\\-61.52344\\-288.7255\\61\\-63.47656\\-287.9387\\61\\-65.42969\\-287.2946\\61\\-67.38281\\-286.8118\\61\\-71.28906\\-285.337\\61\\-73.24219\\-284.817\\61\\-75.19531\\-283.9305\\61\\-77.14844\\-283.3723\\61\\-79.10156\\-283.0109\\61\\-83.00781\\-281.6693\\61\\-86.91406\\-280.7554\\61\\-88.86719\\-279.9138\\61\\-92.77344\\-278.6202\\61\\-94.72656\\-277.6659\\61\\-96.67969\\-277.155\\61\\-98.63281\\-276.2695\\61\\-102.5391\\-274.9745\\61\\-104.4922\\-273.8513\\61\\-106.4453\\-272.9718\\61\\-108.3984\\-271.6283\\61\\-110.3516\\-270.4645\\61\\-112.3047\\-269.4047\\61\\-116.128\\-266.6641\\61\\-121.0556\\-262.7578\\61\\-124.0234\\-260.115\\61\\-125.9766\\-258.1634\\61\\-127.3831\\-256.8984\\61\\-129.8828\\-254.3795\\61\\-131.0179\\-252.9922\\61\\-133.7891\\-249.9031\\61\\-134.5952\\-249.0859\\61\\-136.1515\\-247.1328\\61\\-137.3004\\-245.1797\\61\\-140.3402\\-241.2734\\61\\-141.6016\\-239.1539\\61\\-142.5721\\-237.3672\\61\\-144.4581\\-233.4609\\61\\-145.2743\\-231.5078\\61\\-146.2709\\-229.5547\\61\\-146.931\\-227.6016\\61\\-147.8554\\-225.6484\\61\\-148.8116\\-221.7422\\61\\-150.0547\\-217.8359\\61\\-150.6575\\-213.9297\\61\\-151.1446\\-211.9766\\61\\-151.7736\\-210.0234\\61\\-152.1317\\-208.0703\\61\\-152.6096\\-204.1641\\61\\-153.4557\\-198.3047\\61\\-153.6564\\-196.3516\\61\\-153.8616\\-190.4922\\61\\-153.8696\\-186.5859\\61\\-153.8201\\-184.6328\\61\\-153.6668\\-182.6797\\61\\-153.3203\\-182.3332\\61\\-151.3672\\-181.3812\\61\\-150.1855\\-182.6797\\61\\-149.4141\\-183.2307\\61\\-147.4609\\-183.5457\\61\\-145.6956\\-182.6797\\61\\-143.5547\\-181.1632\\61\\-141.6016\\-180.3197\\61\\-139.474\\-178.7734\\61\\-139.6564\\-176.8203\\61\\-139.513\\-172.9141\\61\\-140.4188\\-170.9609\\61\\-141.6016\\-169.7232\\61\\-143.5547\\-169.1693\\61\\-145.5078\\-170.128\\61\\-147.4609\\-171.3153\\61\\-149.4141\\-171.888\\61\\-151.3672\\-171.2713\\61\\-151.6377\\-170.9609\\61\\-151.9815\\-169.0078\\61\\-151.591\\-167.0547\\61\\-150.9647\\-165.1016\\61\\-150.5737\\-163.1484\\61\\-149.9821\\-159.2422\\61\\-148.8037\\-155.3359\\61\\-148.0336\\-151.4297\\61\\-146.6293\\-147.5234\\61\\-146.1118\\-145.5703\\61\\-145.1755\\-143.6172\\61\\-143.9572\\-139.7109\\61\\-142.992\\-137.7578\\61\\-142.5126\\-135.8047\\61\\-141.8653\\-133.8516\\61\\-140.8636\\-131.8984\\61\\-140.1567\\-129.9453\\61\\-139.0265\\-127.9922\\61\\-138.3064\\-126.0391\\61\\-137.2104\\-124.0859\\61\\-136.5591\\-122.1328\\61\\-134.6656\\-118.2266\\61\\-132.4811\\-114.3203\\61\\-131.1128\\-112.3672\\61\\-130.1962\\-110.4141\\61\\-128.887\\-108.4609\\61\\-127.4414\\-106.5078\\61\\-124.0234\\-102.4063\\61\\-122.0703\\-100.4516\\61\\-116.2109\\-95.67622\\61\\-114.2578\\-94.26591\\61\\-112.3047\\-93.54788\\61\\-110.3516\\-92.23544\\61\\-108.3984\\-91.29082\\61\\-106.4453\\-90.0232\\61\\-102.5391\\-87.99045\\61\\-100.5859\\-87.21494\\61\\-98.63281\\-86.25024\\61\\-96.67969\\-85.49464\\61\\-94.72656\\-84.49847\\61\\-90.82031\\-82.94061\\61\\-88.86719\\-82.27348\\61\\-86.91406\\-81.86983\\61\\-83.00781\\-80.5863\\61\\-81.05469\\-80.25352\\61\\-77.14844\\-79.47796\\61\\-75.19531\\-78.91658\\61\\-71.28906\\-78.20415\\61\\-67.38281\\-77.75209\\61\\-61.52344\\-77.27855\\61\\-57.61719\\-77.10243\\61\\-53.71094\\-77.06125\\61\\-51.75781\\-77.10162\\61\\-49.80469\\-77.24938\\61\\-47.85156\\-77.50875\\61\\-40.03906\\-78.25603\\61\\-36.13281\\-78.90498\\61\\-34.17969\\-79.377\\61\\-26.36719\\-80.64925\\61\\-22.46094\\-81.77915\\61\\-20.50781\\-82.00883\\61\\-16.60156\\-82.18961\\61\\-14.64844\\-82.18307\\61\\-8.789063\\-81.71764\\61\\-6.835938\\-81.41824\\61\\-2.929688\\-81.02985\\61\\0.9765625\\-80.87305\\61\\10.74219\\-80.59592\\61\\12.69531\\-80.61894\\61\\18.55469\\-80.54539\\61\\22.46094\\-80.27769\\61\\26.36719\\-79.64902\\61\\32.22656\\-78.45845\\61\\34.17969\\-78.11193\\61\\38.08594\\-77.66412\\61\\40.03906\\-77.52317\\61\\45.89844\\-77.402\\61\\47.85156\\-77.46539\\61\\51.75781\\-77.47727\\61\\59.57031\\-77.82494\\61\\63.47656\\-78.09209\\61\\65.42969\\-78.28291\\61\\69.33594\\-78.78703\\61\\73.24219\\-79.51729\\61\\79.10156\\-80.36095\\61\\81.05469\\-80.59941\\61\\83.00781\\-80.96992\\61\\84.96094\\-81.56108\\61\\88.86719\\-82.19901\\61\\90.82031\\-82.58527\\61\\92.77344\\-83.28655\\61\\96.67969\\-84.34779\\61\\98.63281\\-85.23016\\61\\102.5391\\-86.48828\\61\\104.4922\\-87.47509\\61\\106.4453\\-88.06909\\61\\108.2571\\-88.92969\\61\\110.3516\\-90.04331\\61\\112.3047\\-91.3381\\61\\114.2578\\-92.42954\\61\\116.2109\\-93.75935\\61\\118.1641\\-95.24144\\61\\119.9236\\-96.74219\\61\\121.9636\\-98.69531\\61\\124.0234\\-101.0853\\61\\125.9766\\-103.5935\\61\\128.108\\-106.5078\\61\\129.1311\\-108.4609\\61\\130.4268\\-110.4141\\61\\131.2825\\-112.3672\\61\\132.5726\\-114.3203\\61\\134.6628\\-118.2266\\61\\136.5345\\-122.1328\\61\\137.1094\\-124.0859\\61\\138.2674\\-126.0391\\61\\138.9732\\-127.9922\\61\\140.1014\\-129.9453\\61\\140.7424\\-131.8984\\61\\141.625\\-133.8516\\61\\142.3523\\-135.8047\\61\\142.8238\\-137.7578\\61\\144.2734\\-141.6641\\61\\144.7822\\-143.6172\\61\\146.2506\\-147.5234\\61\\146.6936\\-149.4766\\61\\148.0008\\-153.3828\\61\\148.9324\\-159.2422\\61\\149.8756\\-163.1484\\61\\150.3361\\-167.0547\\61\\150.5652\\-170.9609\\61\\150.8758\\-174.8672\\61\\151.3438\\-182.6797\\61\\151.3593\\-186.5859\\61\\151.2688\\-190.4922\\61\\150.2728\\-208.0703\\61\\149.8088\\-211.9766\\61\\148.9324\\-215.8828\\61\\148.3054\\-219.7891\\61\\147.9245\\-221.7422\\61\\147.1444\\-223.6953\\61\\145.7669\\-227.6016\\61\\144.678\\-229.5547\\61\\143.8184\\-231.5078\\61\\142.7237\\-233.4609\\61\\141.7908\\-235.4141\\61\\140.4474\\-237.3672\\61\\137.33\\-241.2734\\61\\136\\-243.2266\\61\\134.2564\\-245.1797\\61\\133.7891\\-245.5912\\61\\131.8359\\-247.7691\\61\\130.3986\\-249.0859\\61\\128.4433\\-251.0391\\61\\125.9766\\-253.1904\\61\\123.8281\\-254.9453\\61\\121.251\\-256.8984\\61\\114.2578\\-261.6375\\61\\112.3047\\-262.5963\\61\\110.3516\\-263.6616\\61\\108.1848\\-264.7109\\61\\104.4573\\-266.6641\\61\\102.5391\\-267.6009\\61\\100.5859\\-268.3785\\61\\98.63281\\-269.3417\\61\\96.67969\\-269.8962\\61\\94.72656\\-270.9237\\61\\92.77344\\-271.5985\\61\\88.86719\\-273.3863\\61\\86.91406\\-274.14\\61\\84.96094\\-275.1338\\61\\83.00781\\-275.6912\\61\\81.05469\\-276.7198\\61\\79.10156\\-277.4499\\61\\77.14844\\-278.4913\\61\\75.19531\\-279.4333\\61\\73.24219\\-280.5427\\61\\71.28906\\-281.361\\61\\67.38281\\-283.1721\\61\\65.42969\\-283.9004\\61\\63.47656\\-284.9839\\61\\61.52344\\-285.7634\\61\\59.57031\\-286.8744\\61\\57.61719\\-287.5537\\61\\55.66406\\-288.5862\\61\\51.75781\\-289.7598\\61\\49.80469\\-290.7852\\61\\47.85156\\-291.3526\\61\\45.89844\\-292.3695\\61\\41.99219\\-293.7068\\61\\40.03906\\-294.5241\\61\\36.13281\\-295.3367\\61\\32.22656\\-296.6593\\61\\28.32031\\-297.4228\\61\\26.36719\\-298.1498\\61\\24.41406\\-298.6229\\61\\20.50781\\-299.2836\\61\\16.60156\\-300.1602\\61\\14.64844\\-300.379\\61\\10.74219\\-300.6893\\61\\2.929688\\-301.0115\\61\\-0.9765625\\-301.0257\\61\\-4.882813\\-300.9673\\61\\-8.789063\\-300.8209\\61\\-14.64844\\-300.452\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "310" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "157" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-299.948\\63\\-20.50781\\-299.4677\\63\\-22.46094\\-299.0911\\63\\-26.36719\\-298.4989\\63\\-30.27344\\-297.3386\\63\\-34.17969\\-296.7235\\63\\-36.13281\\-296.2726\\63\\-38.08594\\-295.5501\\63\\-41.99219\\-294.8507\\63\\-43.94531\\-294.4254\\63\\-45.89844\\-293.6312\\63\\-49.80469\\-292.543\\63\\-51.75781\\-291.6091\\63\\-55.66406\\-290.4733\\63\\-57.61719\\-289.5194\\63\\-61.52344\\-288.64\\63\\-63.47656\\-287.7728\\63\\-65.42969\\-287.1829\\63\\-67.38281\\-286.701\\63\\-69.33594\\-285.811\\63\\-73.24219\\-284.591\\63\\-75.19531\\-283.6797\\63\\-79.10156\\-282.7873\\63\\-81.05469\\-282.009\\63\\-84.96094\\-281.036\\63\\-86.91406\\-280.3885\\63\\-88.86719\\-279.5801\\63\\-90.82031\\-279.0134\\63\\-92.77344\\-278.085\\63\\-96.67969\\-276.8377\\63\\-98.63281\\-275.8952\\63\\-100.5859\\-275.3519\\63\\-102.5391\\-274.5313\\63\\-104.4922\\-273.5056\\63\\-108.3984\\-271.3505\\63\\-110.3516\\-270.0132\\63\\-112.3047\\-269.0598\\63\\-114.2578\\-267.6649\\63\\-118.1641\\-264.5313\\63\\-120.1172\\-263.208\\63\\-122.0703\\-261.5873\\63\\-124.8208\\-258.8516\\63\\-126.9464\\-256.8984\\63\\-129.8828\\-253.9185\\63\\-131.8359\\-251.6833\\63\\-134.2632\\-249.0859\\63\\-135.7422\\-247.0638\\63\\-136.9774\\-245.1797\\63\\-140.0065\\-241.2734\\63\\-141.1101\\-239.3203\\63\\-142.3765\\-237.3672\\63\\-143.1542\\-235.4141\\63\\-144.2562\\-233.4609\\63\\-144.9316\\-231.5078\\63\\-146.0283\\-229.5547\\63\\-146.6829\\-227.6016\\63\\-147.5436\\-225.6484\\63\\-148.2008\\-223.6953\\63\\-149.1218\\-219.7891\\63\\-149.8198\\-217.8359\\63\\-150.2307\\-215.8828\\63\\-150.4997\\-213.9297\\63\\-150.8695\\-211.9766\\63\\-151.4757\\-210.0234\\63\\-151.9291\\-208.0703\\63\\-152.1924\\-206.1172\\63\\-153.343\\-196.3516\\63\\-153.6021\\-192.4453\\63\\-153.6668\\-188.5391\\63\\-153.6243\\-186.5859\\63\\-153.2643\\-184.6328\\63\\-151.7729\\-182.6797\\63\\-151.3672\\-182.3127\\63\\-149.4141\\-183.4155\\63\\-147.4609\\-184.017\\63\\-145.5078\\-183.8333\\63\\-143.5547\\-182.3019\\63\\-141.6016\\-181.3258\\63\\-140.7128\\-180.7266\\63\\-139.6484\\-179.5121\\63\\-139.2814\\-178.7734\\63\\-139.7446\\-176.8203\\63\\-139.3019\\-174.8672\\63\\-139.1348\\-172.9141\\63\\-139.6484\\-171.8169\\63\\-140.5854\\-170.9609\\63\\-141.6016\\-170.3446\\63\\-143.5547\\-170.5316\\63\\-145.5078\\-171.4957\\63\\-147.4609\\-171.9102\\63\\-149.4141\\-173.1192\\63\\-151.3672\\-172.871\\63\\-152.0402\\-170.9609\\63\\-151.724\\-169.0078\\63\\-151.1177\\-167.0547\\63\\-150.7024\\-165.1016\\63\\-150.142\\-161.1953\\63\\-149.7085\\-159.2422\\63\\-149.0558\\-157.2891\\63\\-148.2434\\-153.3828\\63\\-147.764\\-151.4297\\63\\-146.9454\\-149.4766\\63\\-145.7802\\-145.5703\\63\\-144.8587\\-143.6172\\63\\-144.3197\\-141.6641\\63\\-142.8068\\-137.7578\\63\\-142.3079\\-135.8047\\63\\-141.4314\\-133.8516\\63\\-139.7839\\-129.9453\\63\\-138.7466\\-127.9922\\63\\-137.981\\-126.0391\\63\\-136.9492\\-124.0859\\63\\-136.3517\\-122.1328\\63\\-135.2336\\-120.1797\\63\\-134.4259\\-118.2266\\63\\-133.1886\\-116.2734\\63\\-132.1964\\-114.3203\\63\\-130.9136\\-112.3672\\63\\-128.6942\\-108.4609\\63\\-127.1601\\-106.5078\\63\\-125.4507\\-104.5547\\63\\-124.0234\\-102.7952\\63\\-121.9207\\-100.6484\\63\\-117.0379\\-96.74219\\63\\-116.2109\\-96.03011\\63\\-114.2578\\-94.64955\\63\\-112.3047\\-93.73689\\63\\-110.3516\\-92.56541\\63\\-108.3984\\-91.6443\\63\\-106.4453\\-90.36476\\63\\-104.4922\\-89.3705\\63\\-102.5391\\-88.18407\\63\\-100.5859\\-87.51606\\63\\-98.63281\\-86.48492\\63\\-96.67969\\-85.7809\\63\\-94.72656\\-84.824\\63\\-92.77344\\-84.01746\\63\\-90.82031\\-83.30903\\63\\-88.86719\\-82.45918\\63\\-84.96094\\-81.58512\\63\\-83.00781\\-80.8602\\63\\-81.05469\\-80.42395\\63\\-77.14844\\-79.7636\\63\\-73.24219\\-78.82797\\63\\-69.33594\\-78.19318\\63\\-65.42969\\-77.84808\\63\\-59.57031\\-77.56303\\63\\-55.66406\\-77.47727\\63\\-51.75781\\-77.52968\\63\\-49.80469\\-77.62109\\63\\-43.94531\\-78.09505\\63\\-40.03906\\-78.54261\\63\\-38.08594\\-78.87109\\63\\-36.13281\\-79.33818\\63\\-34.17969\\-79.68447\\63\\-28.32031\\-80.52744\\63\\-26.36719\\-80.95443\\63\\-24.41406\\-81.60893\\63\\-22.46094\\-81.93725\\63\\-20.50781\\-82.10574\\63\\-16.60156\\-82.20553\\63\\-14.64844\\-82.13543\\63\\-8.789063\\-81.65294\\63\\-6.835938\\-81.30943\\63\\-2.929688\\-80.95571\\63\\0.9765625\\-80.8206\\63\\6.835938\\-80.69768\\63\\10.74219\\-80.57682\\63\\18.55469\\-80.51865\\63\\22.46094\\-80.31398\\63\\24.41406\\-80.12907\\63\\28.32031\\-79.51081\\63\\32.22656\\-78.71108\\63\\36.13281\\-78.12902\\63\\38.08594\\-77.95076\\63\\41.99219\\-77.7801\\63\\45.89844\\-77.72974\\63\\49.80469\\-77.74194\\63\\53.71094\\-77.84079\\63\\59.57031\\-78.06474\\63\\63.47656\\-78.31808\\63\\67.38281\\-78.78703\\63\\71.28906\\-79.48022\\63\\79.10156\\-80.52359\\63\\81.05469\\-80.84551\\63\\84.96094\\-81.77034\\63\\88.86719\\-82.38062\\63\\90.82031\\-82.87354\\63\\92.77344\\-83.58589\\63\\96.67969\\-84.60402\\63\\98.63281\\-85.51491\\63\\100.5859\\-86.09433\\63\\102.5391\\-86.81881\\63\\104.4922\\-87.70581\\63\\106.4453\\-88.29364\\63\\108.3984\\-89.42125\\63\\110.3516\\-90.32207\\63\\112.3047\\-91.68182\\63\\114.2578\\-92.79838\\63\\116.2109\\-94.04845\\63\\118.1641\\-95.54183\\63\\121.593\\-98.69531\\63\\124.0234\\-101.3353\\63\\126.4741\\-104.5547\\63\\127.9297\\-106.7052\\63\\130.2464\\-110.4141\\63\\131.1051\\-112.3672\\63\\132.4171\\-114.3203\\63\\133.3659\\-116.2734\\63\\134.5345\\-118.2266\\63\\135.3698\\-120.1797\\63\\136.4251\\-122.1328\\63\\136.978\\-124.0859\\63\\138.1218\\-126.0391\\63\\138.8258\\-127.9922\\63\\139.919\\-129.9453\\63\\140.6302\\-131.8984\\63\\142.2629\\-135.8047\\63\\142.7358\\-137.7578\\63\\143.3253\\-139.7109\\63\\144.1845\\-141.6641\\63\\144.652\\-143.6172\\63\\145.276\\-145.5703\\63\\146.1317\\-147.5234\\63\\147.1182\\-151.4297\\63\\147.8425\\-153.3828\\63\\148.2135\\-155.3359\\63\\148.7863\\-159.2422\\63\\149.6711\\-163.1484\\63\\150.2193\\-167.0547\\63\\150.6802\\-174.8672\\63\\150.957\\-180.7266\\63\\151.0372\\-186.5859\\63\\150.97\\-190.4922\\63\\150.5371\\-200.2578\\63\\150.2373\\-206.1172\\63\\149.8518\\-210.0234\\63\\149.0583\\-213.9297\\63\\148.1334\\-219.7891\\63\\147.6378\\-221.7422\\63\\146.8273\\-223.6953\\63\\146.231\\-225.6484\\63\\145.2601\\-227.6016\\63\\144.4308\\-229.5547\\63\\143.3906\\-231.5078\\63\\142.5044\\-233.4609\\63\\140.0892\\-237.3672\\63\\139.6484\\-237.8517\\63\\137.6953\\-240.4396\\63\\136.9629\\-241.2734\\63\\135.7422\\-242.9619\\63\\131.8359\\-247.2995\\63\\129.8828\\-249.2445\\63\\127.9208\\-251.0391\\63\\125.9766\\-252.5888\\63\\124.0234\\-254.2831\\63\\122.0703\\-255.8572\\63\\120.1172\\-257.2877\\63\\118.1641\\-258.4045\\63\\117.6169\\-258.8516\\63\\114.2578\\-261.1993\\63\\112.3047\\-262.1003\\63\\110.3516\\-263.2764\\63\\108.3984\\-264.0161\\63\\106.4453\\-265.1962\\63\\104.4922\\-266.0232\\63\\102.5391\\-267.2107\\63\\100.5859\\-267.936\\63\\98.63281\\-268.9547\\63\\94.72656\\-270.3392\\63\\92.77344\\-271.3014\\63\\90.82031\\-272.0014\\63\\88.86719\\-273.0936\\63\\86.91406\\-273.8236\\63\\84.96094\\-274.8979\\63\\83.00781\\-275.549\\63\\81.05469\\-276.3897\\63\\77.14844\\-278.2521\\63\\73.24219\\-280.4344\\63\\67.38281\\-283.1604\\63\\65.42969\\-283.8751\\63\\63.47656\\-284.9905\\63\\61.52344\\-285.8242\\63\\59.57031\\-286.907\\63\\57.61719\\-287.6094\\63\\55.66406\\-288.6334\\63\\53.71094\\-289.1905\\63\\51.75781\\-289.8722\\63\\49.80469\\-290.844\\63\\47.85156\\-291.4238\\63\\45.89844\\-292.4706\\63\\43.94531\\-293.0818\\63\\40.03906\\-294.5962\\63\\36.13281\\-295.3913\\63\\34.17969\\-296.1459\\63\\32.22656\\-296.7193\\63\\30.27344\\-297.057\\63\\28.32031\\-297.5247\\63\\26.36719\\-298.2606\\63\\24.41406\\-298.6904\\63\\20.50781\\-299.385\\63\\16.60156\\-300.2342\\63\\14.64844\\-300.452\\63\\10.74219\\-300.7321\\63\\6.835938\\-300.9202\\63\\2.929688\\-301.05\\63\\-2.929688\\-301.0427\\63\\-6.835938\\-300.9256\\63\\-12.69531\\-300.6273\\63\\-16.60156\\-300.2566\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "290" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "158" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-300.0158\\65\\-22.46094\\-299.144\\65\\-26.36719\\-298.546\\65\\-28.32031\\-298.0495\\65\\-30.27344\\-297.4048\\65\\-34.17969\\-296.7541\\65\\-36.13281\\-296.3204\\65\\-38.08594\\-295.5964\\65\\-43.94531\\-294.4383\\65\\-45.89844\\-293.6235\\65\\-49.80469\\-292.5077\\65\\-51.75781\\-291.5724\\65\\-55.66406\\-290.4096\\65\\-57.61719\\-289.4773\\65\\-61.52344\\-288.5593\\65\\-63.47656\\-287.6602\\65\\-67.38281\\-286.5568\\65\\-69.33594\\-285.6151\\65\\-71.28906\\-285.0449\\65\\-75.19531\\-283.5126\\65\\-77.14844\\-283.1019\\65\\-79.10156\\-282.5441\\65\\-81.05469\\-281.7487\\65\\-84.96094\\-280.7929\\65\\-86.91406\\-279.9414\\65\\-90.82031\\-278.6665\\65\\-92.77344\\-277.718\\65\\-94.72656\\-277.1942\\65\\-98.63281\\-275.6324\\65\\-100.5859\\-275.0885\\65\\-102.5391\\-274.0505\\65\\-104.4922\\-273.1919\\65\\-106.4453\\-271.8973\\65\\-108.3984\\-270.9995\\65\\-110.3516\\-269.6945\\65\\-114.2578\\-267.3373\\65\\-118.1641\\-264.0981\\65\\-120.1074\\-262.7578\\65\\-122.0703\\-261.2714\\65\\-124.5153\\-258.8516\\65\\-126.6154\\-256.8984\\65\\-128.6161\\-254.9453\\65\\-130.3848\\-252.9922\\65\\-133.7891\\-249.077\\65\\-138.2286\\-243.2266\\65\\-139.6484\\-241.1897\\65\\-141.6016\\-238.0882\\65\\-142.1336\\-237.3672\\65\\-142.8723\\-235.4141\\65\\-144.0108\\-233.4609\\65\\-144.6857\\-231.5078\\65\\-145.7072\\-229.5547\\65\\-147.1579\\-225.6484\\65\\-148.0076\\-223.6953\\65\\-148.8997\\-219.7891\\65\\-150.0712\\-215.8828\\65\\-150.6721\\-211.9766\\65\\-151.0932\\-210.0234\\65\\-151.682\\-208.0703\\65\\-152.0165\\-206.1172\\65\\-152.251\\-204.1641\\65\\-152.8172\\-198.3047\\65\\-153.2389\\-192.4453\\65\\-153.3279\\-188.5391\\65\\-153.2673\\-186.5859\\65\\-152.6133\\-184.6328\\65\\-151.3672\\-183.2498\\65\\-149.4141\\-182.9912\\65\\-147.4609\\-183.8879\\65\\-145.5078\\-183.7641\\65\\-143.5547\\-182.414\\65\\-141.6016\\-181.3325\\65\\-140.709\\-180.7266\\65\\-139.6484\\-179.3937\\65\\-139.3445\\-178.7734\\65\\-139.7363\\-176.8203\\65\\-139.4367\\-174.8672\\65\\-139.449\\-172.9141\\65\\-139.6484\\-172.6062\\65\\-141.6016\\-171.1728\\65\\-143.5547\\-171.8167\\65\\-145.5078\\-172.6556\\65\\-147.4609\\-172.9226\\65\\-149.4141\\-173.8383\\65\\-151.3672\\-173.0952\\65\\-151.5288\\-172.9141\\65\\-151.8468\\-170.9609\\65\\-150.8083\\-167.0547\\65\\-149.9089\\-161.1953\\65\\-148.8176\\-157.2891\\65\\-148.0408\\-153.3828\\65\\-146.6808\\-149.4766\\65\\-146.1678\\-147.5234\\65\\-145.311\\-145.5703\\65\\-144.6273\\-143.6172\\65\\-144.0979\\-141.6641\\65\\-143.1683\\-139.7109\\65\\-142.0701\\-135.8047\\65\\-141.0604\\-133.8516\\65\\-140.374\\-131.8984\\65\\-139.3011\\-129.9453\\65\\-138.5073\\-127.9922\\65\\-137.5772\\-126.0391\\65\\-136.7604\\-124.0859\\65\\-136.0556\\-122.1328\\65\\-134.9696\\-120.1797\\65\\-134.1436\\-118.2266\\65\\-132.9229\\-116.2734\\65\\-130.7296\\-112.3672\\65\\-129.4465\\-110.4141\\65\\-128.4849\\-108.4609\\65\\-126.8968\\-106.5078\\65\\-124.0234\\-103.18\\65\\-121.55\\-100.6484\\65\\-120.1172\\-99.5954\\65\\-116.2109\\-96.35593\\65\\-114.2578\\-95.21272\\65\\-112.3047\\-93.94185\\65\\-108.3984\\-91.89324\\65\\-104.4922\\-89.68233\\65\\-102.5391\\-88.4131\\65\\-100.5859\\-87.79662\\65\\-98.63281\\-86.76363\\65\\-94.72656\\-85.26574\\65\\-92.77344\\-84.2683\\65\\-90.82031\\-83.61642\\65\\-88.86719\\-82.72606\\65\\-86.91406\\-82.20029\\65\\-84.96094\\-81.80393\\65\\-81.05469\\-80.64228\\65\\-75.19531\\-79.6683\\65\\-71.28906\\-78.75767\\65\\-67.38281\\-78.29928\\65\\-63.47656\\-78.00014\\65\\-57.61719\\-77.80511\\65\\-55.66406\\-77.78503\\65\\-49.80469\\-77.91429\\65\\-45.89844\\-78.15843\\65\\-40.03906\\-78.8601\\65\\-36.13281\\-79.64574\\65\\-30.27344\\-80.45584\\65\\-28.32031\\-80.78217\\65\\-26.36719\\-81.38011\\65\\-24.41406\\-81.83034\\65\\-22.46094\\-82.06949\\65\\-20.50781\\-82.16393\\65\\-16.60156\\-82.17661\\65\\-10.74219\\-81.78362\\65\\-6.835938\\-81.20524\\65\\-2.929688\\-80.89934\\65\\0.9765625\\-80.78217\\65\\6.835938\\-80.68392\\65\\10.74219\\-80.5638\\65\\18.55469\\-80.50605\\65\\20.50781\\-80.45584\\65\\24.41406\\-80.19294\\65\\28.32031\\-79.71745\\65\\32.22656\\-79.00247\\65\\38.08594\\-78.20494\\65\\43.94531\\-77.96346\\65\\49.80469\\-77.97049\\65\\53.71094\\-78.04719\\65\\59.57031\\-78.32781\\65\\63.47656\\-78.62872\\65\\65.42969\\-78.83854\\65\\69.33594\\-79.45847\\65\\77.14844\\-80.41964\\65\\79.10156\\-80.73354\\65\\83.00781\\-81.6456\\65\\86.91406\\-82.25651\\65\\88.86719\\-82.61808\\65\\92.77344\\-83.84158\\65\\94.72656\\-84.29656\\65\\96.67969\\-84.98588\\65\\98.63281\\-85.77779\\65\\100.5859\\-86.34296\\65\\102.5391\\-87.25239\\65\\106.4453\\-88.61631\\65\\108.3984\\-89.72166\\65\\110.3516\\-90.69925\\65\\114.2578\\-93.24826\\65\\116.2109\\-94.35909\\65\\118.1641\\-95.86596\\65\\121.2542\\-98.69531\\65\\124.0234\\-101.6578\\65\\126.2347\\-104.5547\\65\\128.8624\\-108.4609\\65\\130.0009\\-110.4141\\65\\130.9552\\-112.3672\\65\\132.2228\\-114.3203\\65\\133.172\\-116.2734\\65\\134.3786\\-118.2266\\65\\135.1851\\-120.1797\\65\\136.2936\\-122.1328\\65\\136.8776\\-124.0859\\65\\137.931\\-126.0391\\65\\138.7079\\-127.9922\\65\\139.686\\-129.9453\\65\\140.5217\\-131.8984\\65\\141.2254\\-133.8516\\65\\142.1749\\-135.8047\\65\\143.1738\\-139.7109\\65\\144.0585\\-141.6641\\65\\145.0902\\-145.5703\\65\\145.9726\\-147.5234\\65\\146.9223\\-151.4297\\65\\147.6249\\-153.3828\\65\\148.0866\\-155.3359\\65\\148.9868\\-161.1953\\65\\149.7923\\-165.1016\\65\\150.0671\\-167.0547\\65\\150.2373\\-169.0078\\65\\150.607\\-176.8203\\65\\150.8031\\-182.6797\\65\\150.7415\\-190.4922\\65\\150.4867\\-198.3047\\65\\150.2125\\-204.1641\\65\\150.0793\\-206.1172\\65\\149.5448\\-210.0234\\65\\148.8116\\-213.9297\\65\\148.2689\\-217.8359\\65\\147.9054\\-219.7891\\65\\147.2202\\-221.7422\\65\\145.9627\\-225.6484\\65\\144.8982\\-227.6016\\65\\144.188\\-229.5547\\65\\143.0325\\-231.5078\\65\\142.2505\\-233.4609\\65\\139.6484\\-237.285\\65\\138.196\\-239.3203\\65\\135.7422\\-242.4837\\65\\135.1031\\-243.2266\\65\\131.8359\\-246.7111\\65\\129.8828\\-248.7315\\65\\127.3362\\-251.0391\\65\\125.9766\\-252.1369\\65\\124.0234\\-253.899\\65\\122.0703\\-255.5161\\65\\120.1172\\-256.6772\\65\\118.1641\\-257.9775\\65\\116.2109\\-259.4413\\65\\112.3047\\-261.7448\\65\\110.314\\-262.7578\\65\\106.4453\\-264.5792\\65\\102.5272\\-266.6641\\65\\98.63281\\-268.4043\\65\\96.67969\\-269.3464\\65\\94.72656\\-269.913\\65\\92.77344\\-270.9724\\65\\90.82031\\-271.681\\65\\88.86719\\-272.7472\\65\\86.91406\\-273.5698\\65\\84.96094\\-274.5618\\65\\83.00781\\-275.4172\\65\\81.05469\\-276.1089\\65\\79.10156\\-277.2329\\65\\77.14844\\-278.0785\\65\\76.75228\\-278.3828\\65\\73.22998\\-280.3359\\65\\67.38281\\-283.1604\\65\\65.42969\\-283.8864\\65\\63.47656\\-285.0245\\65\\61.52344\\-285.8964\\65\\59.57031\\-286.9427\\65\\57.61719\\-287.6732\\65\\55.66406\\-288.6982\\65\\53.71094\\-289.2381\\65\\51.75781\\-290\\65\\49.80469\\-290.9096\\65\\47.85156\\-291.5288\\65\\45.89844\\-292.569\\65\\43.94531\\-293.1611\\65\\40.03906\\-294.6728\\65\\36.13281\\-295.4727\\65\\34.17969\\-296.2865\\65\\32.22656\\-296.7774\\65\\30.27344\\-297.1275\\65\\28.32031\\-297.6458\\65\\26.36719\\-298.367\\65\\20.50781\\-299.4856\\65\\18.55469\\-299.9757\\65\\16.60156\\-300.3073\\65\\14.64844\\-300.5126\\65\\10.74219\\-300.782\\65\\6.835938\\-300.9688\\65\\2.929688\\-301.0926\\65\\-2.929688\\-301.0818\\65\\-8.789063\\-300.8666\\65\\-12.69531\\-300.6562\\65\\-16.60156\\-300.3165\\65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "305" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "159" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-300.091\\67\\-22.46094\\-299.2144\\67\\-26.36719\\-298.5941\\67\\-28.32031\\-298.1258\\67\\-30.27344\\-297.4849\\67\\-32.22656\\-297.0778\\67\\-34.17969\\-296.7897\\67\\-36.13281\\-296.3766\\67\\-38.08594\\-295.6448\\67\\-40.03906\\-295.2074\\67\\-43.94531\\-294.4482\\67\\-45.89844\\-293.6109\\67\\-49.80469\\-292.5077\\67\\-51.75781\\-291.5429\\67\\-53.71094\\-290.9907\\67\\-55.66406\\-290.3406\\67\\-57.61719\\-289.4525\\67\\-59.57031\\-289.0238\\67\\-61.52344\\-288.4878\\67\\-63.47656\\-287.5824\\67\\-67.38281\\-286.3709\\67\\-69.33594\\-285.4709\\67\\-71.28906\\-284.9022\\67\\-73.24219\\-283.9927\\67\\-75.19531\\-283.3539\\67\\-77.14844\\-282.9422\\67\\-81.05469\\-281.5505\\67\\-83.00781\\-281.0885\\67\\-84.96094\\-280.4608\\67\\-86.91406\\-279.6172\\67\\-88.86719\\-279.0643\\67\\-90.82031\\-278.1476\\67\\-92.77344\\-277.4551\\67\\-94.72656\\-276.9307\\67\\-96.67969\\-275.9515\\67\\-98.63281\\-275.3995\\67\\-100.5859\\-274.7101\\67\\-104.7852\\-272.5234\\67\\-108.3984\\-270.4353\\67\\-110.3516\\-269.3972\\67\\-112.3047\\-268.0863\\67\\-114.2578\\-266.9031\\67\\-116.2109\\-265.4138\\67\\-120.1172\\-262.2365\\67\\-122.0437\\-260.8047\\67\\-124.0494\\-258.8516\\67\\-128.273\\-254.9453\\67\\-131.4979\\-251.0391\\67\\-133.7891\\-248.5015\\67\\-136.4929\\-245.1797\\67\\-137.8461\\-243.2266\\67\\-139.0967\\-241.2734\\67\\-140.5698\\-239.3203\\67\\-141.8194\\-237.3672\\67\\-142.6752\\-235.4141\\67\\-143.6546\\-233.4609\\67\\-145.2601\\-229.5547\\67\\-146.2233\\-227.6016\\67\\-146.8668\\-225.6484\\67\\-147.7661\\-223.6953\\67\\-148.3038\\-221.7422\\67\\-149.2128\\-217.8359\\67\\-149.8653\\-215.8828\\67\\-150.2487\\-213.9297\\67\\-150.8118\\-210.0234\\67\\-151.8202\\-206.1172\\67\\-152.087\\-204.1641\\67\\-152.4484\\-200.2578\\67\\-152.7121\\-196.3516\\67\\-152.9088\\-192.4453\\67\\-152.9565\\-190.4922\\67\\-152.9208\\-186.5859\\67\\-152.7945\\-184.6328\\67\\-152.2833\\-182.6797\\67\\-151.3672\\-181.5546\\67\\-149.4141\\-181.5181\\67\\-148.1879\\-182.6797\\67\\-147.4609\\-183.183\\67\\-145.5078\\-183.1046\\67\\-143.5547\\-181.867\\67\\-141.94\\-180.7266\\67\\-140.7538\\-178.7734\\67\\-141.8669\\-176.8203\\67\\-143.5547\\-175.3692\\67\\-145.5078\\-174.5446\\67\\-147.4609\\-174.391\\67\\-149.4141\\-174.4487\\67\\-150.9698\\-172.9141\\67\\-151.5158\\-170.9609\\67\\-150.9885\\-169.0078\\67\\-150.6138\\-167.0547\\67\\-150.3632\\-165.1016\\67\\-149.5829\\-163.1484\\67\\-148.9314\\-161.1953\\67\\-148.7706\\-159.2422\\67\\-148.2551\\-155.3359\\67\\-147.8107\\-153.3828\\67\\-147.0588\\-151.4297\\67\\-145.9142\\-147.5234\\67\\-144.9558\\-145.5703\\67\\-144.4477\\-143.6172\\67\\-143.7789\\-141.6641\\67\\-142.9228\\-139.7109\\67\\-142.4515\\-137.7578\\67\\-141.7432\\-135.8047\\67\\-140.8081\\-133.8516\\67\\-140.1184\\-131.8984\\67\\-138.9732\\-129.9453\\67\\-138.2701\\-127.9922\\67\\-137.2378\\-126.0391\\67\\-136.5974\\-124.0859\\67\\-135.7422\\-122.1997\\67\\-133.7891\\-118.2383\\67\\-131.8359\\-114.8489\\67\\-131.4184\\-114.3203\\67\\-130.5317\\-112.3672\\67\\-129.1954\\-110.4141\\67\\-128.2014\\-108.4609\\67\\-126.643\\-106.5078\\67\\-125.9766\\-105.8322\\67\\-124.0234\\-103.5512\\67\\-121.1231\\-100.6484\\67\\-118.1641\\-98.20367\\67\\-116.1397\\-96.74219\\67\\-114.2578\\-95.56138\\67\\-112.3047\\-94.2045\\67\\-110.3516\\-93.36286\\67\\-108.3984\\-92.14764\\67\\-106.4453\\-91.28532\\67\\-104.4922\\-89.94264\\67\\-102.5391\\-88.70996\\67\\-98.63281\\-87.12865\\67\\-96.67969\\-86.24567\\67\\-94.72656\\-85.54471\\67\\-92.77344\\-84.5231\\67\\-90.82031\\-83.8998\\67\\-86.91406\\-82.38425\\67\\-83.00781\\-81.57156\\67\\-81.05469\\-80.92939\\67\\-79.10156\\-80.46821\\67\\-75.19531\\-79.89648\\67\\-71.28906\\-79.14135\\67\\-69.33594\\-78.8601\\67\\-63.47656\\-78.27267\\67\\-57.61719\\-78.05656\\67\\-53.71094\\-78.04878\\67\\-49.80469\\-78.16543\\67\\-45.89844\\-78.44175\\67\\-41.99219\\-78.89353\\67\\-38.08594\\-79.63255\\67\\-34.17969\\-80.11121\\67\\-30.27344\\-80.68695\\67\\-26.36719\\-81.7487\\67\\-24.41406\\-82.0144\\67\\-22.46094\\-82.16477\\67\\-18.55469\\-82.2188\\67\\-14.64844\\-82.03233\\67\\-10.74219\\-81.73006\\67\\-8.789063\\-81.35006\\67\\-4.882813\\-80.96875\\67\\-0.9765625\\-80.84551\\67\\4.882813\\-80.74483\\67\\10.74219\\-80.56747\\67\\14.64844\\-80.50605\\67\\18.55469\\-80.51865\\67\\24.41406\\-80.28424\\67\\26.36719\\-80.11695\\67\\32.22656\\-79.36689\\67\\34.17969\\-79.01546\\67\\38.08594\\-78.52643\\67\\40.03906\\-78.37463\\67\\43.94531\\-78.2386\\67\\49.80469\\-78.20434\\67\\53.71094\\-78.30172\\67\\59.57031\\-78.63295\\67\\63.47656\\-78.95236\\67\\67.38281\\-79.50832\\67\\75.19531\\-80.36553\\67\\77.14844\\-80.63223\\67\\83.00781\\-81.85738\\67\\86.91406\\-82.45057\\67\\88.86719\\-82.95763\\67\\90.82031\\-83.61887\\67\\94.72656\\-84.61193\\67\\96.67969\\-85.43145\\67\\100.5859\\-86.65334\\67\\102.5391\\-87.55453\\67\\104.4922\\-88.13973\\67\\106.4453\\-89.13792\\67\\108.3984\\-90.01413\\67\\110.3516\\-91.23209\\67\\112.3047\\-92.29272\\67\\114.2578\\-93.60049\\67\\116.2109\\-94.74697\\67\\118.1641\\-96.24693\\67\\118.6057\\-96.74219\\67\\120.8221\\-98.69531\\67\\122.7649\\-100.6484\\67\\124.4727\\-102.6016\\67\\127.2512\\-106.5078\\67\\128.692\\-108.4609\\67\\129.7059\\-110.4141\\67\\131.9975\\-114.3203\\67\\133.0112\\-116.2734\\67\\134.2067\\-118.2266\\67\\135.0269\\-120.1797\\67\\136.1286\\-122.1328\\67\\136.7898\\-124.0859\\67\\138.6003\\-127.9922\\67\\139.4337\\-129.9453\\67\\140.4097\\-131.8984\\67\\141.0762\\-133.8516\\67\\142.0334\\-135.8047\\67\\143.0334\\-139.7109\\67\\143.9116\\-141.6641\\67\\144.9386\\-145.5703\\67\\145.7896\\-147.5234\\67\\146.3399\\-149.4766\\67\\146.7572\\-151.4297\\67\\147.9431\\-155.3359\\67\\148.2776\\-157.2891\\67\\149.0956\\-163.1484\\67\\149.8756\\-167.0547\\67\\150.0793\\-169.0078\\67\\150.3083\\-172.9141\\67\\150.4604\\-176.8203\\67\\150.607\\-182.6797\\67\\150.5717\\-190.4922\\67\\150.3526\\-198.3047\\67\\150.1801\\-202.2109\\67\\149.8725\\-206.1172\\67\\148.8773\\-211.9766\\67\\148.3918\\-215.8828\\67\\148.0743\\-217.8359\\67\\147.5984\\-219.7891\\67\\146.8855\\-221.7422\\67\\146.3321\\-223.6953\\67\\145.5454\\-225.6484\\67\\144.6284\\-227.6016\\67\\143.8664\\-229.5547\\67\\142.7847\\-231.5078\\67\\141.8837\\-233.4609\\67\\140.6133\\-235.4141\\67\\139.0728\\-237.3672\\67\\136.391\\-241.2734\\67\\134.7117\\-243.2266\\67\\129.8828\\-248.3004\\67\\126.8248\\-251.0391\\67\\124.5185\\-252.9922\\67\\124.0234\\-253.5014\\67\\122.0703\\-255.0341\\67\\120.1172\\-256.1911\\67\\118.1641\\-257.615\\67\\114.2578\\-260.0558\\67\\112.3047\\-261.36\\67\\110.3516\\-262.1988\\67\\108.3984\\-263.328\\67\\106.4453\\-264.0249\\67\\104.4922\\-265.2055\\67\\102.5391\\-266.056\\67\\100.5859\\-267.2196\\67\\98.63281\\-267.9519\\67\\96.67969\\-269.0176\\67\\94.72656\\-269.6529\\67\\92.77344\\-270.4386\\67\\90.82031\\-271.4235\\67\\88.86719\\-272.2571\\67\\86.91406\\-273.3433\\67\\84.96094\\-274.2065\\67\\83.00781\\-275.2639\\67\\81.05469\\-275.9216\\67\\79.10156\\-277.135\\67\\77.14844\\-277.948\\67\\75.19531\\-279.2071\\67\\71.28906\\-281.264\\67\\67.38281\\-283.1721\\67\\65.42969\\-283.9237\\67\\63.47656\\-285.071\\67\\61.52344\\-285.9668\\67\\59.57031\\-286.9973\\67\\57.61719\\-287.7511\\67\\55.66406\\-288.7548\\67\\53.71094\\-289.2808\\67\\49.80469\\-290.9647\\67\\47.85156\\-291.6282\\67\\45.89844\\-292.6671\\67\\43.94531\\-293.2513\\67\\41.99219\\-294.1171\\67\\40.03906\\-294.7402\\67\\36.13281\\-295.5853\\67\\34.17969\\-296.3971\\67\\32.22656\\-296.8539\\67\\30.27344\\-297.1994\\67\\26.36719\\-298.4603\\67\\22.46094\\-299.175\\67\\18.55469\\-300.0789\\67\\16.60156\\-300.3759\\67\\14.64844\\-300.5719\\67\\10.74219\\-300.8267\\67\\6.835938\\-301.0186\\67\\2.929688\\-301.138\\67\\-0.9765625\\-301.1336\\67\\-4.882813\\-301.0621\\67\\-10.74219\\-300.804\\67\\-14.64844\\-300.5463\\67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "289" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "160" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-300.1602\\69\\-22.46094\\-299.2779\\69\\-26.36719\\-298.6465\\69\\-28.32031\\-298.2289\\69\\-30.27344\\-297.556\\69\\-32.22656\\-297.1275\\69\\-36.13281\\-296.4396\\69\\-38.08594\\-295.6953\\69\\-40.03906\\-295.2102\\69\\-41.99219\\-294.8804\\69\\-43.94531\\-294.4282\\69\\-45.89844\\-293.6083\\69\\-49.80469\\-292.4986\\69\\-51.75781\\-291.5226\\69\\-53.71094\\-290.9669\\69\\-55.66406\\-290.2785\\69\\-57.61719\\-289.4126\\69\\-59.57031\\-288.9932\\69\\-61.52344\\-288.3979\\69\\-63.47656\\-287.5034\\69\\-65.42969\\-286.9453\\69\\-69.33594\\-285.3312\\69\\-71.28906\\-284.7305\\69\\-73.24219\\-283.7635\\69\\-77.14844\\-282.7434\\69\\-79.10156\\-281.9194\\69\\-83.00781\\-280.858\\69\\-84.96094\\-280.0126\\69\\-88.86719\\-278.7189\\69\\-90.82031\\-277.7538\\69\\-92.77344\\-277.2277\\69\\-96.67969\\-275.662\\69\\-98.63281\\-275.1297\\69\\-100.5859\\-274.1245\\69\\-102.5391\\-273.328\\69\\-104.4922\\-272.1105\\69\\-106.4453\\-271.1856\\69\\-108.3984\\-269.9086\\69\\-110.3516\\-269.0378\\69\\-116.2109\\-264.9849\\69\\-118.1641\\-263.5054\\69\\-121.4468\\-260.8047\\69\\-125.9766\\-256.5211\\69\\-127.9297\\-254.7533\\69\\-129.3314\\-252.9922\\69\\-134.6606\\-247.1328\\69\\-136.1515\\-245.1797\\69\\-137.3423\\-243.2266\\69\\-140.2779\\-239.3203\\69\\-142.4799\\-235.4141\\69\\-143.2079\\-233.4609\\69\\-144.277\\-231.5078\\69\\-144.9231\\-229.5547\\69\\-145.9698\\-227.6016\\69\\-146.6018\\-225.6484\\69\\-148.1179\\-221.7422\\69\\-148.9659\\-217.8359\\69\\-149.6019\\-215.8828\\69\\-150.0873\\-213.9297\\69\\-150.6095\\-210.0234\\69\\-150.9779\\-208.0703\\69\\-151.5026\\-206.1172\\69\\-151.8809\\-204.1641\\69\\-152.0971\\-202.2109\\69\\-152.3928\\-198.3047\\69\\-152.6493\\-192.4453\\69\\-152.6422\\-186.5859\\69\\-152.5116\\-182.6797\\69\\-152.2656\\-180.7266\\69\\-152.1658\\-178.7734\\69\\-151.3672\\-177.0645\\69\\-151.1047\\-176.8203\\69\\-150.8409\\-174.8672\\69\\-151.6029\\-172.9141\\69\\-151.1195\\-170.9609\\69\\-150.7377\\-169.0078\\69\\-150.1465\\-165.1016\\69\\-149.4141\\-163.81\\69\\-148.5938\\-163.1484\\69\\-147.4609\\-161.5751\\69\\-146.8124\\-163.1484\\69\\-145.5078\\-164.6345\\69\\-143.5547\\-165.2123\\69\\-141.6016\\-164.8614\\69\\-140.1702\\-163.1484\\69\\-140.8452\\-161.1953\\69\\-142.4576\\-159.2422\\69\\-143.5547\\-158.4694\\69\\-145.5078\\-158.8844\\69\\-146.4587\\-159.2422\\69\\-147.4609\\-160.5117\\69\\-148.0992\\-157.2891\\69\\-148.0818\\-155.3359\\69\\-147.4991\\-153.3828\\69\\-146.7746\\-151.4297\\69\\-146.2531\\-149.4766\\69\\-144.7299\\-145.5703\\69\\-144.2417\\-143.6172\\69\\-143.3792\\-141.6641\\69\\-142.7358\\-139.7109\\69\\-142.2629\\-137.7578\\69\\-141.3416\\-135.8047\\69\\-139.7439\\-131.8984\\69\\-138.7326\\-129.9453\\69\\-138.0208\\-127.9922\\69\\-136.98\\-126.0391\\69\\-136.4124\\-124.0859\\69\\-135.3725\\-122.1328\\69\\-134.5691\\-120.1797\\69\\-133.4078\\-118.2266\\69\\-132.4629\\-116.2734\\69\\-131.1356\\-114.3203\\69\\-130.2347\\-112.3672\\69\\-127.9297\\-108.6151\\69\\-126.3391\\-106.5078\\69\\-124.0234\\-103.8241\\69\\-122.0703\\-101.7715\\69\\-120.1172\\-100.0651\\69\\-116.2109\\-97.27549\\69\\-114.2578\\-95.82863\\69\\-112.3047\\-94.5625\\69\\-110.3516\\-93.62898\\69\\-108.3984\\-92.48942\\69\\-106.4453\\-91.6493\\69\\-104.4922\\-90.29816\\69\\-100.5859\\-88.09354\\69\\-98.63281\\-87.54511\\69\\-96.67969\\-86.51739\\69\\-94.72656\\-85.74799\\69\\-92.77344\\-84.83237\\69\\-88.86719\\-83.54243\\69\\-86.91406\\-82.65663\\69\\-84.96094\\-82.18417\\69\\-83.00781\\-81.82798\\69\\-79.10156\\-80.73354\\69\\-73.24219\\-79.82962\\69\\-65.42969\\-78.80724\\69\\-61.52344\\-78.45435\\69\\-55.66406\\-78.29911\\69\\-53.71094\\-78.3004\\69\\-49.80469\\-78.43451\\69\\-45.89844\\-78.77712\\69\\-38.08594\\-79.87038\\69\\-36.13281\\-80.07591\\69\\-32.22656\\-80.60565\\69\\-28.32031\\-81.56738\\69\\-26.36719\\-81.92178\\69\\-24.41406\\-82.12926\\69\\-22.46094\\-82.22745\\69\\-18.55469\\-82.2272\\69\\-14.64844\\-81.99985\\69\\-10.74219\\-81.70719\\69\\-8.789063\\-81.33672\\69\\-4.882813\\-81.01398\\69\\-0.9765625\\-80.88609\\69\\4.882813\\-80.79406\\69\\12.69531\\-80.55824\\69\\18.55469\\-80.52744\\69\\22.46094\\-80.42749\\69\\26.36719\\-80.25986\\69\\32.22656\\-79.61844\\69\\38.08594\\-78.8601\\69\\41.99219\\-78.63393\\69\\47.85156\\-78.49119\\69\\51.75781\\-78.55299\\69\\57.61719\\-78.83854\\69\\59.57031\\-78.97706\\69\\67.38281\\-79.7878\\69\\73.24219\\-80.36553\\69\\77.14844\\-80.92793\\69\\81.05469\\-81.79953\\69\\84.96094\\-82.32244\\69\\86.91406\\-82.71957\\69\\88.86719\\-83.39584\\69\\92.77344\\-84.32589\\69\\96.67969\\-85.73959\\69\\98.63281\\-86.2765\\69\\100.5859\\-87.07894\\69\\104.4922\\-88.43116\\69\\106.4453\\-89.52173\\69\\108.3984\\-90.35744\\69\\110.3516\\-91.64839\\69\\112.3047\\-92.68174\\69\\115.6078\\-94.78906\\69\\118.1641\\-96.70045\\69\\120.4325\\-98.69531\\69\\122.4985\\-100.6484\\69\\124.1684\\-102.6016\\69\\128.5038\\-108.4609\\69\\129.4603\\-110.4141\\69\\130.712\\-112.3672\\69\\131.8359\\-114.5022\\69\\133.7891\\-117.9489\\69\\134.8735\\-120.1797\\69\\135.9177\\-122.1328\\69\\137.4236\\-126.0391\\69\\138.4734\\-127.9922\\69\\139.2001\\-129.9453\\69\\140.2902\\-131.8984\\69\\140.9295\\-133.8516\\69\\141.8615\\-135.8047\\69\\142.4834\\-137.7578\\69\\142.9057\\-139.7109\\69\\143.7249\\-141.6641\\69\\144.3498\\-143.6172\\69\\144.795\\-145.5703\\69\\145.5454\\-147.5234\\69\\146.1878\\-149.4766\\69\\146.5935\\-151.4297\\69\\147.1052\\-153.3828\\69\\147.7466\\-155.3359\\69\\148.1334\\-157.2891\\69\\148.8997\\-163.1484\\69\\149.6153\\-167.0547\\69\\150.0423\\-170.9609\\69\\150.2615\\-174.8672\\69\\150.4226\\-180.7266\\69\\150.4653\\-184.6328\\69\\150.4282\\-190.4922\\69\\150.2125\\-198.3047\\69\\149.9821\\-202.2109\\69\\149.559\\-206.1172\\69\\148.9192\\-210.0234\\69\\148.1948\\-215.8828\\69\\147.819\\-217.8359\\69\\147.1829\\-219.7891\\69\\146.0683\\-223.6953\\69\\145.0674\\-225.6484\\69\\144.3971\\-227.6016\\69\\143.3906\\-229.5547\\69\\142.529\\-231.5078\\69\\140.2895\\-235.4141\\69\\137.2386\\-239.3203\\69\\136.0652\\-241.2734\\69\\134.3851\\-243.2266\\69\\130.5486\\-247.1328\\69\\129.8828\\-247.8705\\69\\127.9297\\-249.7393\\69\\121.4338\\-254.9453\\69\\118.1641\\-257.1331\\69\\116.2109\\-258.2295\\69\\114.2578\\-259.618\\69\\112.2444\\-260.8047\\69\\108.4828\\-262.7578\\69\\104.4922\\-264.5919\\69\\100.5859\\-266.7162\\69\\94.72656\\-269.4145\\69\\92.77344\\-270.0263\\69\\90.82031\\-271.1645\\69\\88.86719\\-271.9247\\69\\86.91406\\-273.124\\69\\84.96094\\-273.9512\\69\\83.00781\\-275.1255\\69\\81.05469\\-275.7974\\69\\79.10156\\-277.0408\\69\\77.14844\\-277.8815\\69\\75.19531\\-279.163\\69\\71.28906\\-281.2454\\69\\67.38281\\-283.1721\\69\\65.42969\\-283.9871\\69\\63.47656\\-285.1179\\69\\61.52344\\-286.0302\\69\\59.57031\\-287.0409\\69\\57.61719\\-287.8441\\69\\55.66406\\-288.8057\\69\\53.71094\\-289.3239\\69\\51.75781\\-290.2655\\69\\47.85156\\-291.7557\\69\\45.89844\\-292.7712\\69\\43.94531\\-293.3586\\69\\41.99219\\-294.2485\\69\\40.03906\\-294.8117\\69\\38.08594\\-295.2027\\69\\36.13281\\-295.7204\\69\\34.17969\\-296.4987\\69\\30.27344\\-297.2762\\69\\28.32031\\-297.9662\\69\\26.36719\\-298.5493\\69\\22.46094\\-299.2554\\69\\18.55469\\-300.1711\\69\\16.60156\\-300.4359\\69\\12.69531\\-300.7484\\69\\8.789063\\-300.9807\\69\\4.882813\\-301.138\\69\\0.9765625\\-301.1884\\69\\-2.929688\\-301.1418\\69\\-6.835938\\-301.0186\\69\\-10.74219\\-300.8323\\69\\-14.64844\\-300.5871\\69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "277" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "161" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-300.2365\\71\\-22.46094\\-299.3499\\71\\-26.36719\\-298.706\\71\\-28.32031\\-298.33\\71\\-30.27344\\-297.6717\\71\\-32.22656\\-297.1723\\71\\-36.13281\\-296.4805\\71\\-38.08594\\-295.748\\71\\-40.03906\\-295.2546\\71\\-43.94531\\-294.458\\71\\-45.89844\\-293.6497\\71\\-49.80469\\-292.4801\\71\\-51.75781\\-291.4975\\71\\-53.71094\\-290.9309\\71\\-57.61719\\-289.3691\\71\\-59.57031\\-288.9502\\71\\-61.52344\\-288.2762\\71\\-63.47656\\-287.4102\\71\\-65.42969\\-286.8556\\71\\-67.38281\\-285.9362\\71\\-71.28906\\-284.524\\71\\-73.24219\\-283.5852\\71\\-75.19531\\-283.1335\\71\\-77.14844\\-282.4919\\71\\-79.10156\\-281.6955\\71\\-81.05469\\-281.1883\\71\\-83.00781\\-280.5645\\71\\-84.96094\\-279.6792\\71\\-86.91406\\-279.0819\\71\\-88.86719\\-278.1992\\71\\-90.82031\\-277.4784\\71\\-92.77344\\-276.956\\71\\-94.72656\\-275.9964\\71\\-98.63281\\-274.7525\\71\\-100.5859\\-273.7232\\71\\-102.5391\\-272.9128\\71\\-104.4922\\-271.6745\\71\\-106.634\\-270.5703\\71\\-110.2056\\-268.6172\\71\\-112.3047\\-267.3495\\71\\-116.2109\\-264.3932\\71\\-118.1641\\-263.0985\\71\\-120.1172\\-261.5922\\71\\-122.0703\\-259.868\\71\\-125.1283\\-256.8984\\71\\-127.9297\\-254.2775\\71\\-129.8828\\-252.0532\\71\\-131.8359\\-249.9303\\71\\-134.3164\\-247.1328\\71\\-137.0056\\-243.2266\\71\\-137.6953\\-242.4114\\71\\-139.9065\\-239.3203\\71\\-140.9943\\-237.3672\\71\\-142.2331\\-235.4141\\71\\-142.8974\\-233.4609\\71\\-143.9938\\-231.5078\\71\\-144.6747\\-229.5547\\71\\-145.6163\\-227.6016\\71\\-146.3707\\-225.6484\\71\\-147.0205\\-223.6953\\71\\-147.8785\\-221.7422\\71\\-148.3736\\-219.7891\\71\\-148.7568\\-217.8359\\71\\-149.8756\\-213.9297\\71\\-150.2307\\-211.9766\\71\\-150.7298\\-208.0703\\71\\-151.1091\\-206.1172\\71\\-151.6029\\-204.1641\\71\\-151.9054\\-202.2109\\71\\-152.2021\\-198.3047\\71\\-152.4339\\-192.4453\\71\\-152.4239\\-186.5859\\71\\-152.2021\\-180.7266\\71\\-151.8891\\-176.8203\\71\\-151.649\\-174.8672\\71\\-150.8206\\-170.9609\\71\\-150.3361\\-167.0547\\71\\-149.8033\\-165.1016\\71\\-147.9604\\-163.1484\\71\\-147.9221\\-161.1953\\71\\-147.6979\\-159.2422\\71\\-148.2091\\-157.2891\\71\\-147.8858\\-155.3359\\71\\-147.1309\\-153.3828\\71\\-146.0328\\-149.4766\\71\\-145.1342\\-147.5234\\71\\-144.0079\\-143.6172\\71\\-143.0798\\-141.6641\\71\\-142.0437\\-137.7578\\71\\-141.0672\\-135.8047\\71\\-140.3959\\-133.8516\\71\\-139.3474\\-131.8984\\71\\-138.543\\-129.9453\\71\\-136.8347\\-126.0391\\71\\-136.2134\\-124.0859\\71\\-135.1103\\-122.1328\\71\\-134.3498\\-120.1797\\71\\-133.1279\\-118.2266\\71\\-132.1928\\-116.2734\\71\\-130.9521\\-114.3203\\71\\-128.8213\\-110.4141\\71\\-127.9297\\-109.097\\71\\-124.3514\\-104.5547\\71\\-122.0703\\-102.0615\\71\\-120.1172\\-100.3986\\71\\-118.1641\\-99.11072\\71\\-114.2578\\-96.13265\\71\\-112.3047\\-95.11948\\71\\-110.3516\\-93.88317\\71\\-106.4453\\-91.92913\\71\\-102.5391\\-89.63358\\71\\-100.5859\\-88.35483\\71\\-98.63281\\-87.74111\\71\\-94.72656\\-85.9622\\71\\-92.77344\\-85.23798\\71\\-90.82031\\-84.40573\\71\\-88.86719\\-83.82729\\71\\-84.96094\\-82.41301\\71\\-81.05469\\-81.66118\\71\\-77.14844\\-80.65248\\71\\-73.24219\\-80.10554\\71\\-67.38281\\-79.47057\\71\\-63.47656\\-78.94027\\71\\-59.57031\\-78.71108\\71\\-55.66406\\-78.59684\\71\\-53.71094\\-78.61364\\71\\-49.80469\\-78.76733\\71\\-47.85156\\-78.94027\\71\\-43.94531\\-79.45847\\71\\-40.03906\\-79.85892\\71\\-34.17969\\-80.51083\\71\\-32.22656\\-80.87119\\71\\-30.27344\\-81.45972\\71\\-28.32031\\-81.83709\\71\\-24.41406\\-82.2107\\71\\-22.46094\\-82.27612\\71\\-18.55469\\-82.20159\\71\\-10.74219\\-81.70313\\71\\-8.789063\\-81.39092\\71\\-6.835938\\-81.20524\\71\\-0.9765625\\-80.99905\\71\\0.9765625\\-80.98543\\71\\10.74219\\-80.62891\\71\\22.46094\\-80.4724\\71\\28.32031\\-80.23495\\71\\32.22656\\-79.81297\\71\\40.03906\\-79.09748\\71\\41.99219\\-78.96462\\71\\45.89844\\-78.84925\\71\\51.75781\\-78.89353\\71\\59.57031\\-79.41538\\71\\65.42969\\-79.84206\\71\\71.28906\\-80.35829\\71\\73.24219\\-80.56747\\71\\79.10156\\-81.69662\\71\\83.00781\\-82.23754\\71\\84.96094\\-82.56223\\71\\88.86719\\-83.71172\\71\\92.77344\\-84.65171\\71\\94.72656\\-85.46968\\71\\98.63281\\-86.57406\\71\\100.5859\\-87.45806\\71\\102.5391\\-88.01454\\71\\104.6381\\-88.92969\\71\\108.3984\\-90.81623\\71\\111.8262\\-92.83594\\71\\112.3047\\-93.19572\\71\\114.2578\\-94.16271\\71\\117.6196\\-96.74219\\71\\122.0969\\-100.6484\\71\\124.0234\\-102.8743\\71\\125.2346\\-104.5547\\71\\126.8024\\-106.5078\\71\\128.2647\\-108.4609\\71\\129.2426\\-110.4141\\71\\130.5402\\-112.3672\\71\\131.3996\\-114.3203\\71\\132.6614\\-116.2734\\71\\134.7244\\-120.1797\\71\\136.5922\\-124.0859\\71\\137.1971\\-126.0391\\71\\138.3301\\-127.9922\\71\\139.0029\\-129.9453\\71\\140.1155\\-131.8984\\71\\140.7795\\-133.8516\\71\\141.655\\-135.8047\\71\\142.3792\\-137.7578\\71\\142.7965\\-139.7109\\71\\144.2303\\-143.6172\\71\\144.6533\\-145.5703\\71\\145.2637\\-147.5234\\71\\146.054\\-149.4766\\71\\146.8889\\-153.3828\\71\\147.4836\\-155.3359\\71\\147.9675\\-157.2891\\71\\148.2573\\-159.2422\\71\\148.9525\\-165.1016\\71\\149.573\\-169.0078\\71\\149.9911\\-172.9141\\71\\150.1872\\-176.8203\\71\\150.2902\\-180.7266\\71\\150.3418\\-184.6328\\71\\150.3251\\-188.5391\\71\\150.2551\\-192.4453\\71\\150.1346\\-196.3516\\71\\149.899\\-200.2578\\71\\149.7206\\-202.2109\\71\\148.9094\\-208.0703\\71\\148.4904\\-211.9766\\71\\147.9675\\-215.8828\\71\\146.8385\\-219.7891\\71\\146.3617\\-221.7422\\71\\145.6962\\-223.6953\\71\\144.7477\\-225.6484\\71\\144.1406\\-227.6016\\71\\143.0189\\-229.5547\\71\\142.2461\\-231.5078\\71\\140.9889\\-233.4609\\71\\139.8786\\-235.4141\\71\\136.9078\\-239.3203\\71\\135.7422\\-241.0575\\71\\133.9614\\-243.2266\\71\\131.8359\\-245.3638\\71\\129.8828\\-247.4583\\71\\127.9297\\-249.3458\\71\\125.9766\\-250.7036\\71\\122.0703\\-253.9814\\71\\120.1172\\-255.4967\\71\\118.1641\\-256.5359\\71\\114.2578\\-259.1334\\71\\112.3047\\-260.1769\\71\\110.3516\\-261.4232\\71\\108.3984\\-262.2558\\71\\106.4453\\-263.3673\\71\\104.4922\\-264.0836\\71\\102.5391\\-265.2816\\71\\100.5859\\-266.1229\\71\\98.63281\\-267.2767\\71\\96.67969\\-268.0545\\71\\94.72656\\-269.1553\\71\\92.77344\\-269.7757\\71\\90.82031\\-270.8248\\71\\88.86719\\-271.6963\\71\\86.91406\\-272.9\\71\\84.96094\\-273.7658\\71\\83.00781\\-274.9943\\71\\81.05469\\-275.7234\\71\\79.10156\\-276.957\\71\\77.14844\\-277.8184\\71\\75.19531\\-279.1436\\71\\71.28906\\-281.2454\\71\\65.16602\\-284.2422\\71\\61.48897\\-286.1953\\71\\55.66406\\-288.8793\\71\\53.71094\\-289.3798\\71\\51.75781\\-290.4096\\71\\49.80469\\-291.1126\\71\\45.89844\\-292.8556\\71\\43.94531\\-293.4866\\71\\41.99219\\-294.3707\\71\\40.03906\\-294.8778\\71\\38.08594\\-295.259\\71\\36.13281\\-295.8757\\71\\34.17969\\-296.5904\\71\\30.27344\\-297.3669\\71\\28.32031\\-298.1135\\71\\26.36719\\-298.6312\\71\\22.46094\\-299.3467\\71\\18.55469\\-300.2466\\71\\16.60156\\-300.4938\\71\\10.74219\\-300.9256\\71\\4.882813\\-301.1798\\71\\0.9765625\\-301.2279\\71\\-2.929688\\-301.1884\\71\\-6.835938\\-301.0621\\71\\-10.74219\\-300.878\\71\\-14.64844\\-300.6205\\71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "281" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "162" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-299.9338\\73\\-22.46094\\-299.4338\\73\\-28.32031\\-298.4194\\73\\-32.22656\\-297.2212\\73\\-36.13281\\-296.5372\\73\\-38.08594\\-295.8032\\73\\-40.03906\\-295.2792\\73\\-43.94531\\-294.4992\\73\\-45.89844\\-293.6758\\73\\-49.80469\\-292.4706\\73\\-51.75781\\-291.4908\\73\\-53.71094\\-290.8839\\73\\-57.61719\\-289.3309\\73\\-59.57031\\-288.9114\\73\\-63.47656\\-287.3412\\73\\-65.42969\\-286.7755\\73\\-67.38281\\-285.7812\\73\\-69.33594\\-285.0986\\73\\-73.24219\\-283.4484\\73\\-75.19531\\-283.0109\\73\\-77.14844\\-282.2024\\73\\-79.10156\\-281.4994\\73\\-81.05469\\-280.9928\\73\\-84.96094\\-279.4071\\73\\-86.91406\\-278.7647\\73\\-88.86719\\-277.786\\73\\-90.82031\\-277.2435\\73\\-92.77344\\-276.5156\\73\\-94.72656\\-275.6818\\73\\-96.67969\\-275.1464\\73\\-98.63281\\-274.1966\\73\\-100.5859\\-273.3792\\73\\-102.5391\\-272.2616\\73\\-104.4922\\-271.3324\\73\\-106.4453\\-270.0921\\73\\-108.3984\\-269.3138\\73\\-110.3516\\-268.0208\\73\\-112.3047\\-266.9154\\73\\-115.3151\\-264.7109\\73\\-116.2109\\-263.9582\\73\\-120.1172\\-261.1967\\73\\-122.7532\\-258.8516\\73\\-125.9766\\-255.8349\\73\\-127.9297\\-253.9069\\73\\-131.8359\\-249.5209\\73\\-133.8567\\-247.1328\\73\\-138.1747\\-241.2734\\73\\-139.3506\\-239.3203\\73\\-140.6882\\-237.3672\\73\\-141.9247\\-235.4141\\73\\-142.7047\\-233.4609\\73\\-144.4607\\-229.5547\\73\\-145.1557\\-227.6016\\73\\-146.157\\-225.6484\\73\\-146.7369\\-223.6953\\73\\-147.5848\\-221.7422\\73\\-148.1802\\-219.7891\\73\\-148.9868\\-215.8828\\73\\-149.5882\\-213.9297\\73\\-150.063\\-211.9766\\73\\-150.8118\\-206.1172\\73\\-151.6263\\-202.2109\\73\\-152.0025\\-198.3047\\73\\-152.1671\\-194.3984\\73\\-152.2466\\-190.4922\\73\\-152.2217\\-186.5859\\73\\-152.087\\-182.6797\\73\\-151.8291\\-178.7734\\73\\-151.591\\-176.8203\\73\\-150.8634\\-172.9141\\73\\-150.5959\\-170.9609\\73\\-150.1988\\-167.0547\\73\\-149.8413\\-165.1016\\73\\-148.8997\\-163.1484\\73\\-148.7742\\-161.1953\\73\\-148.3907\\-159.2422\\73\\-148.1257\\-157.2891\\73\\-147.6366\\-155.3359\\73\\-146.855\\-153.3828\\73\\-146.3514\\-151.4297\\73\\-145.7316\\-149.4766\\73\\-144.8742\\-147.5234\\73\\-144.3802\\-145.5703\\73\\-143.7249\\-143.6172\\73\\-142.8686\\-141.6641\\73\\-142.4447\\-139.7109\\73\\-141.7969\\-137.7578\\73\\-140.8594\\-135.8047\\73\\-140.2007\\-133.8516\\73\\-139.0533\\-131.8984\\73\\-138.3686\\-129.9453\\73\\-137.3486\\-127.9922\\73\\-135.96\\-124.0859\\73\\-134.9182\\-122.1328\\73\\-134.1284\\-120.1797\\73\\-132.8987\\-118.2266\\73\\-131.8586\\-116.2734\\73\\-129.8828\\-112.7977\\73\\-128.6201\\-110.4141\\73\\-127.1497\\-108.4609\\73\\-122.2098\\-102.6016\\73\\-119.816\\-100.6484\\73\\-118.1641\\-99.47786\\73\\-116.2109\\-97.8869\\73\\-114.2578\\-96.52281\\73\\-112.3047\\-95.42911\\73\\-110.3516\\-94.14925\\73\\-108.3984\\-93.34515\\73\\-106.4453\\-92.20174\\73\\-104.4922\\-91.25842\\73\\-102.5391\\-89.94264\\73\\-100.5859\\-88.76159\\73\\-98.63281\\-87.95939\\73\\-96.67969\\-87.27411\\73\\-94.72656\\-86.29956\\73\\-90.82031\\-84.71539\\73\\-86.91406\\-83.50362\\73\\-84.96094\\-82.69989\\73\\-83.00781\\-82.24261\\73\\-79.10156\\-81.58123\\73\\-77.14844\\-81.02985\\73\\-75.19531\\-80.62231\\73\\-71.28906\\-80.14063\\73\\-65.42969\\-79.62559\\73\\-63.47656\\-79.41914\\73\\-59.57031\\-79.11188\\73\\-55.66406\\-78.96462\\73\\-53.71094\\-78.98968\\73\\-49.80469\\-79.18828\\73\\-45.89844\\-79.56982\\73\\-41.99219\\-79.898\\73\\-38.08594\\-80.31818\\73\\-36.13281\\-80.4724\\73\\-34.17969\\-80.76534\\73\\-30.27344\\-81.75723\\73\\-28.32031\\-82.00883\\73\\-24.41406\\-82.27131\\73\\-20.50781\\-82.25452\\73\\-16.60156\\-82.08772\\73\\-14.64844\\-81.93406\\73\\-10.74219\\-81.73502\\73\\-8.789063\\-81.48073\\73\\-4.882813\\-81.25\\73\\0.9765625\\-81.15754\\73\\6.835938\\-80.88432\\73\\8.789063\\-80.71959\\73\\14.64844\\-80.64228\\73\\18.55469\\-80.52359\\73\\22.46094\\-80.51476\\73\\28.32031\\-80.32554\\73\\30.27344\\-80.20837\\73\\32.22656\\-79.9789\\73\\36.13281\\-79.70217\\73\\41.99219\\-79.38025\\73\\45.89844\\-79.3079\\73\\51.75781\\-79.33684\\73\\59.57031\\-79.71576\\73\\63.47656\\-79.93693\\73\\71.28906\\-80.54539\\73\\73.24219\\-80.80842\\73\\75.19531\\-81.26329\\73\\77.14844\\-81.61225\\73\\83.00781\\-82.43805\\73\\84.96094\\-82.91376\\73\\86.91406\\-83.53682\\73\\90.82031\\-84.42027\\73\\94.72656\\-85.76886\\73\\96.67969\\-86.23391\\73\\100.5859\\-87.74916\\73\\102.5391\\-88.24673\\73\\104.4922\\-89.26667\\73\\106.4453\\-90.11391\\73\\108.3984\\-91.32491\\73\\110.3516\\-92.26474\\73\\112.3047\\-93.57967\\73\\114.2578\\-94.53729\\73\\116.2109\\-95.97018\\73\\118.1641\\-97.63297\\73\\121.5665\\-100.6484\\73\\124.0234\\-103.3096\\73\\124.9075\\-104.5547\\73\\126.5638\\-106.5078\\73\\127.9691\\-108.4609\\73\\130.3298\\-112.3672\\73\\131.187\\-114.3203\\73\\132.4815\\-116.2734\\73\\133.4212\\-118.2266\\73\\134.5762\\-120.1797\\73\\135.4214\\-122.1328\\73\\136.4621\\-124.0859\\73\\137.0422\\-126.0391\\73\\138.1601\\-127.9922\\73\\138.8372\\-129.9453\\73\\139.9111\\-131.8984\\73\\141.3949\\-135.8047\\73\\142.2587\\-137.7578\\73\\142.686\\-139.7109\\73\\143.2482\\-141.6641\\73\\144.0768\\-143.6172\\73\\145.0413\\-147.5234\\73\\145.8748\\-149.4766\\73\\146.6978\\-153.3828\\73\\147.1673\\-155.3359\\73\\147.7486\\-157.2891\\73\\148.3398\\-161.1953\\73\\148.7525\\-165.1016\\73\\149.2143\\-169.0078\\73\\149.7467\\-172.9141\\73\\150.0213\\-176.8203\\73\\150.1801\\-182.6797\\73\\150.1465\\-190.4922\\73\\150.0126\\-194.3984\\73\\149.7838\\-198.3047\\73\\149.5882\\-200.2578\\73\\148.8867\\-206.1172\\73\\148.3054\\-211.9766\\73\\148.0504\\-213.9297\\73\\147.6506\\-215.8828\\73\\147.0388\\-217.8359\\73\\146.0761\\-221.7422\\73\\145.1868\\-223.6953\\73\\143.766\\-227.6016\\73\\142.7346\\-229.5547\\73\\141.8732\\-231.5078\\73\\140.6691\\-233.4609\\73\\139.3042\\-235.4141\\73\\138.0573\\-237.3672\\73\\135.7422\\-240.5003\\73\\133.7891\\-242.8183\\73\\131.4259\\-245.1797\\73\\129.6072\\-247.1328\\73\\127.5645\\-249.0859\\73\\125.9766\\-250.2718\\73\\122.0703\\-253.5548\\73\\120.0853\\-254.9453\\73\\118.1641\\-256.1237\\73\\116.2109\\-257.4388\\73\\114.2578\\-258.4429\\73\\113.7091\\-258.8516\\73\\110.3516\\-260.921\\73\\106.4453\\-262.9206\\73\\104.4922\\-263.7586\\73\\100.5859\\-265.7307\\73\\98.63281\\-266.8579\\73\\96.67969\\-267.7225\\73\\94.72656\\-268.7774\\73\\90.82031\\-270.4076\\73\\90.61726\\-270.5703\\73\\84.96094\\-273.6291\\73\\83.00781\\-274.9038\\73\\81.05469\\-275.6667\\73\\79.10156\\-276.8912\\73\\77.14844\\-277.7843\\73\\75.19531\\-279.122\\73\\71.28906\\-281.2761\\73\\69.29977\\-282.2891\\73\\65.42969\\-284.1104\\73\\61.66847\\-286.1953\\73\\55.66406\\-288.943\\73\\53.71094\\-289.4485\\73\\51.75781\\-290.5416\\73\\49.80469\\-291.1939\\73\\47.85156\\-292.1768\\73\\43.94531\\-293.6263\\73\\41.99219\\-294.5023\\73\\38.08594\\-295.3203\\73\\34.17969\\-296.6634\\73\\30.27344\\-297.4724\\73\\28.32031\\-298.2502\\73\\26.36719\\-298.6983\\73\\22.46094\\-299.4434\\73\\20.50781\\-299.948\\73\\18.55469\\-300.3257\\73\\14.64844\\-300.7034\\73\\8.789063\\-301.0818\\73\\4.882813\\-301.2279\\73\\-0.9765625\\-301.2595\\73\\-4.882813\\-301.184\\73\\-10.74219\\-300.9351\\73\\-16.60156\\-300.4974\\73\\-18.55469\\-300.2883\\73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "272" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "163" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-300.0416\\75\\-22.46094\\-299.5374\\75\\-24.41406\\-299.1401\\75\\-28.32031\\-298.4946\\75\\-32.22656\\-297.2798\\75\\-36.13281\\-296.5983\\75\\-38.08594\\-295.861\\75\\-40.03906\\-295.2994\\75\\-43.94531\\-294.5208\\75\\-45.89844\\-293.6845\\75\\-49.80469\\-292.4894\\75\\-51.75781\\-291.4758\\75\\-53.71094\\-290.8287\\75\\-55.66406\\-289.9555\\75\\-57.61719\\-289.3074\\75\\-59.57031\\-288.8716\\75\\-63.47656\\-287.2835\\75\\-65.42969\\-286.6836\\75\\-67.38281\\-285.6431\\75\\-69.33594\\-284.9938\\75\\-71.28906\\-284.0572\\75\\-73.24219\\-283.3386\\75\\-75.19531\\-282.8517\\75\\-77.14844\\-281.9565\\75\\-81.05469\\-280.7581\\75\\-83.00781\\-279.8171\\75\\-84.96094\\-279.1566\\75\\-86.91406\\-278.2844\\75\\-88.86719\\-277.5117\\75\\-90.82031\\-276.9433\\75\\-92.77344\\-276.0211\\75\\-96.67969\\-274.7688\\75\\-98.63281\\-273.7441\\75\\-100.5859\\-272.9819\\75\\-102.5391\\-271.7867\\75\\-104.4922\\-270.9224\\75\\-106.4453\\-269.7393\\75\\-108.3984\\-268.8801\\75\\-110.3516\\-267.6223\\75\\-112.3047\\-266.2532\\75\\-114.2578\\-265.0365\\75\\-117.3459\\-262.7578\\75\\-119.8621\\-260.8047\\75\\-122.1837\\-258.8516\\75\\-125.9766\\-255.419\\75\\-128.3864\\-252.9922\\75\\-133.7891\\-246.6285\\75\\-136.4435\\-243.2266\\75\\-138.956\\-239.3203\\75\\-140.4099\\-237.3672\\75\\-142.5126\\-233.4609\\75\\-143.1683\\-231.5078\\75\\-144.2268\\-229.5547\\75\\-144.8282\\-227.6016\\75\\-145.8795\\-225.6484\\75\\-146.495\\-223.6953\\75\\-147.9707\\-219.7891\\75\\-148.7568\\-215.8828\\75\\-149.2413\\-213.9297\\75\\-149.8413\\-211.9766\\75\\-150.173\\-210.0234\\75\\-150.6027\\-206.1172\\75\\-151.5158\\-200.2578\\75\\-151.8809\\-196.3516\\75\\-152.0199\\-192.4453\\75\\-152.0165\\-186.5859\\75\\-151.8725\\-182.6797\\75\\-151.4757\\-178.7734\\75\\-150.8601\\-174.8672\\75\\-150.2664\\-169.0078\\75\\-150.0126\\-167.0547\\75\\-149.6169\\-165.1016\\75\\-149.047\\-163.1484\\75\\-147.9886\\-157.2891\\75\\-146.6462\\-153.3828\\75\\-146.1643\\-151.4297\\75\\-145.3402\\-149.4766\\75\\-144.6823\\-147.5234\\75\\-144.2077\\-145.5703\\75\\-143.3806\\-143.6172\\75\\-142.7409\\-141.6641\\75\\-142.292\\-139.7109\\75\\-140.6883\\-135.8047\\75\\-139.9633\\-133.8516\\75\\-138.8576\\-131.8984\\75\\-138.212\\-129.9453\\75\\-137.1107\\-127.9922\\75\\-136.5446\\-126.0391\\75\\-133.8281\\-120.1797\\75\\-131.8359\\-116.7279\\75\\-131.4984\\-116.2734\\75\\-130.5768\\-114.3203\\75\\-129.3395\\-112.3672\\75\\-128.3881\\-110.4141\\75\\-126.904\\-108.4609\\75\\-121.6474\\-102.6016\\75\\-118.1641\\-99.73126\\75\\-116.2109\\-98.22118\\75\\-113.9803\\-96.74219\\75\\-110.3516\\-94.47626\\75\\-108.3984\\-93.63378\\75\\-106.4453\\-92.50391\\75\\-104.4922\\-91.61818\\75\\-102.5391\\-90.23803\\75\\-100.5859\\-89.3615\\75\\-98.63281\\-88.21886\\75\\-96.67969\\-87.56527\\75\\-94.72656\\-86.55054\\75\\-90.82031\\-85.13969\\75\\-88.86719\\-84.32508\\75\\-86.91406\\-83.80701\\75\\-83.00781\\-82.49698\\75\\-79.10156\\-81.88226\\75\\-77.14844\\-81.50639\\75\\-75.19531\\-81.01481\\75\\-73.24219\\-80.62891\\75\\-71.28906\\-80.40751\\75\\-63.47656\\-79.76649\\75\\-59.57031\\-79.53376\\75\\-55.66406\\-79.44618\\75\\-53.71094\\-79.45847\\75\\-47.85156\\-79.70443\\75\\-41.99219\\-80.12864\\75\\-36.13281\\-80.76791\\75\\-32.22656\\-81.66271\\75\\-30.27344\\-81.95863\\75\\-26.36719\\-82.26151\\75\\-22.46094\\-82.30216\\75\\-16.60156\\-82.08176\\75\\-10.74219\\-81.78776\\75\\-6.835938\\-81.46647\\75\\-4.882813\\-81.39092\\75\\0.9765625\\-81.34828\\75\\6.835938\\-81.02914\\75\\8.789063\\-80.80381\\75\\10.74219\\-80.71959\\75\\14.64844\\-80.68695\\75\\18.55469\\-80.5863\\75\\24.41406\\-80.53253\\75\\30.27344\\-80.32775\\75\\36.13281\\-79.91381\\75\\41.99219\\-79.66918\\75\\47.85156\\-79.62559\\75\\51.75781\\-79.6756\\75\\61.52344\\-80.0394\\75\\69.33594\\-80.59941\\75\\73.24219\\-81.17322\\75\\75.19531\\-81.58512\\75\\81.05469\\-82.33179\\75\\83.00781\\-82.71957\\75\\84.96094\\-83.3503\\75\\88.86719\\-84.22395\\75\\90.82031\\-84.76435\\75\\92.77344\\-85.51491\\75\\96.67969\\-86.55054\\75\\98.63281\\-87.39108\\75\\102.5391\\-88.56879\\75\\104.4922\\-89.63065\\75\\106.4453\\-90.45362\\75\\108.3984\\-91.69279\\75\\110.3516\\-92.7005\\75\\113.8942\\-94.78906\\75\\116.2109\\-96.32162\\75\\118.8263\\-98.69531\\75\\121.0869\\-100.6484\\75\\123.0007\\-102.6016\\75\\124.6806\\-104.5547\\75\\126.2395\\-106.5078\\75\\127.9297\\-108.8939\\75\\128.9243\\-110.4141\\75\\130.075\\-112.3672\\75\\131.0139\\-114.3203\\75\\132.2706\\-116.2734\\75\\133.1764\\-118.2266\\75\\134.3971\\-120.1797\\75\\135.1851\\-122.1328\\75\\136.2899\\-124.0859\\75\\136.908\\-126.0391\\75\\137.931\\-127.9922\\75\\138.6769\\-129.9453\\75\\140.5029\\-133.8516\\75\\141.1683\\-135.8047\\75\\142.0995\\-137.7578\\75\\143.0369\\-141.6641\\75\\143.8525\\-143.6172\\75\\144.4092\\-145.5703\\75\\144.8474\\-147.5234\\75\\145.5744\\-149.4766\\75\\146.1356\\-151.4297\\75\\146.8952\\-155.3359\\75\\147.8957\\-159.2422\\75\\148.1717\\-161.1953\\75\\148.7903\\-167.0547\\75\\149.1464\\-170.9609\\75\\149.6169\\-174.8672\\75\\149.7698\\-176.8203\\75\\149.9694\\-182.6797\\75\\149.9784\\-186.5859\\75\\149.9187\\-190.4922\\75\\149.6019\\-196.3516\\75\\149.1864\\-200.2578\\75\\148.3296\\-210.0234\\75\\147.7505\\-213.9297\\75\\147.1848\\-215.8828\\75\\146.2777\\-219.7891\\75\\145.6822\\-221.7422\\75\\144.8161\\-223.6953\\75\\144.2613\\-225.6484\\75\\143.2316\\-227.6016\\75\\142.491\\-229.5547\\75\\140.3315\\-233.4609\\75\\138.8636\\-235.4141\\75\\137.5407\\-237.3672\\75\\136.35\\-239.3203\\75\\134.7591\\-241.2734\\75\\132.9278\\-243.2266\\75\\127.9297\\-248.271\\75\\125.9766\\-249.9661\\75\\122.0255\\-252.9922\\75\\118.1641\\-255.7613\\75\\114.2578\\-257.9881\\75\\112.3047\\-259.2747\\75\\110.3516\\-260.2825\\75\\108.3984\\-261.5324\\75\\106.4453\\-262.3574\\75\\104.4922\\-263.4535\\75\\102.5391\\-264.2124\\75\\100.5859\\-265.3929\\75\\98.63281\\-266.3096\\75\\96.67969\\-267.4488\\75\\94.72656\\-268.3151\\75\\92.77344\\-269.4022\\75\\90.82031\\-270.1095\\75\\88.86719\\-271.3548\\75\\86.91406\\-272.3182\\75\\83.41098\\-274.4766\\75\\83.00781\\-274.7973\\75\\81.05469\\-275.6279\\75\\79.10156\\-276.8434\\75\\77.14844\\-277.7546\\75\\75.19531\\-279.1084\\75\\71.28906\\-281.3004\\75\\69.33594\\-282.3135\\75\\65.42969\\-284.2015\\75\\63.47656\\-285.2508\\75\\61.52344\\-286.4085\\75\\59.57031\\-287.2218\\75\\57.61719\\-288.2036\\75\\55.66406\\-289.0172\\75\\53.71094\\-289.5319\\75\\51.75781\\-290.6637\\75\\49.80469\\-291.2911\\75\\47.85156\\-292.3496\\75\\43.94531\\-293.7654\\75\\41.99219\\-294.584\\75\\38.08594\\-295.4148\\75\\36.13281\\-296.1979\\75\\34.17969\\-296.7455\\75\\32.22656\\-297.0959\\75\\30.27344\\-297.6224\\75\\28.32031\\-298.3579\\75\\24.41406\\-299.1204\\75\\20.50781\\-300.0789\\75\\18.55469\\-300.3961\\75\\14.64844\\-300.7596\\75\\10.74219\\-301.0208\\75\\4.882813\\-301.2858\\75\\0.9765625\\-301.3221\\75\\-4.882813\\-301.2357\\75\\-10.74219\\-300.9774\\75\\-16.60156\\-300.5463\\75\\-18.55469\\-300.3555\\75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "271" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "164" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-300.1377\\77\\-24.41406\\-299.2071\\77\\-28.32031\\-298.5599\\77\\-30.27344\\-298.0088\\77\\-32.22656\\-297.3351\\77\\-36.13281\\-296.6405\\77\\-40.03906\\-295.3332\\77\\-43.94531\\-294.5332\\77\\-45.89844\\-293.7182\\77\\-49.80469\\-292.4986\\77\\-51.75781\\-291.4711\\77\\-53.71094\\-290.8419\\77\\-55.66406\\-289.9426\\77\\-57.61719\\-289.2887\\77\\-59.57031\\-288.8469\\77\\-61.52344\\-287.9531\\77\\-65.42969\\-286.5821\\77\\-67.38281\\-285.5239\\77\\-69.33594\\-284.8915\\77\\-71.28906\\-283.8583\\77\\-75.19531\\-282.6727\\77\\-77.14844\\-281.7357\\77\\-79.10156\\-281.1804\\77\\-81.05469\\-280.4724\\77\\-83.00781\\-279.5449\\77\\-84.96094\\-278.8889\\77\\-86.91406\\-277.8665\\77\\-88.86719\\-277.2738\\77\\-90.82031\\-276.546\\77\\-92.77344\\-275.7098\\77\\-94.72656\\-275.1794\\77\\-96.67969\\-274.2026\\77\\-98.63281\\-273.3969\\77\\-100.5859\\-272.3571\\77\\-102.5391\\-271.4282\\77\\-104.4922\\-270.3074\\77\\-106.4453\\-269.464\\77\\-108.3984\\-268.2797\\77\\-110.3516\\-267.2305\\77\\-114.2578\\-264.4157\\77\\-116.2109\\-263.2145\\77\\-118.1641\\-261.7424\\77\\-121.5567\\-258.8516\\77\\-125.9766\\-254.8125\\77\\-127.8265\\-252.9922\\77\\-131.2355\\-249.0859\\77\\-131.8359\\-248.4765\\77\\-134.6325\\-245.1797\\77\\-136.1195\\-243.2266\\77\\-137.2462\\-241.2734\\77\\-137.6953\\-240.7476\\77\\-139.6484\\-237.8715\\77\\-140.067\\-237.3672\\77\\-141.066\\-235.4141\\77\\-142.2714\\-233.4609\\77\\-142.8973\\-231.5078\\77\\-143.944\\-229.5547\\77\\-144.5946\\-227.6016\\77\\-146.2794\\-223.6953\\77\\-146.8833\\-221.7422\\77\\-147.7136\\-219.7891\\77\\-148.227\\-217.8359\\77\\-148.9763\\-213.9297\\77\\-149.5448\\-211.9766\\77\\-149.9821\\-210.0234\\77\\-150.2551\\-208.0703\\77\\-151.0715\\-200.2578\\77\\-151.5789\\-196.3516\\77\\-151.7639\\-192.4453\\77\\-151.8019\\-190.4922\\77\\-151.7639\\-186.5859\\77\\-151.5542\\-182.6797\\77\\-151.0462\\-178.7734\\77\\-150.6138\\-174.8672\\77\\-150.3074\\-170.9609\\77\\-149.7811\\-167.0547\\77\\-149.2551\\-165.1016\\77\\-148.8268\\-163.1484\\77\\-148.1963\\-159.2422\\77\\-147.7732\\-157.2891\\77\\-147.0165\\-155.3359\\77\\-145.9572\\-151.4297\\77\\-145.0508\\-149.4766\\77\\-144.0079\\-145.5703\\77\\-143.1169\\-143.6172\\77\\-142.1477\\-139.7109\\77\\-141.2542\\-137.7578\\77\\-140.532\\-135.8047\\77\\-138.7128\\-131.8984\\77\\-137.9883\\-129.9453\\77\\-136.98\\-127.9922\\77\\-136.4296\\-126.0391\\77\\-135.3725\\-124.0859\\77\\-134.6168\\-122.1328\\77\\-133.509\\-120.1797\\77\\-132.5335\\-118.2266\\77\\-131.2657\\-116.2734\\77\\-130.3745\\-114.3203\\77\\-129.1311\\-112.3672\\77\\-128.0136\\-110.4141\\77\\-126.617\\-108.4609\\77\\-123.174\\-104.5547\\77\\-121.2993\\-102.6016\\77\\-118.1641\\-100.0186\\77\\-112.3047\\-95.94378\\77\\-110.2189\\-94.78906\\77\\-104.4922\\-91.89286\\77\\-102.5391\\-90.62286\\77\\-100.5859\\-89.69318\\77\\-98.63281\\-88.58197\\77\\-96.67969\\-87.83672\\77\\-94.72656\\-86.8913\\77\\-92.77344\\-86.08932\\77\\-90.82031\\-85.53152\\77\\-88.86719\\-84.65723\\77\\-84.96094\\-83.58064\\77\\-83.00781\\-82.85897\\77\\-81.05469\\-82.38062\\77\\-77.14844\\-81.82568\\77\\-73.24219\\-81.03056\\77\\-71.28906\\-80.70856\\77\\-69.33594\\-80.49345\\77\\-63.47656\\-80.05131\\77\\-59.57031\\-79.86249\\77\\-55.66406\\-79.77917\\77\\-53.71094\\-79.79185\\77\\-47.85156\\-79.98292\\77\\-43.94531\\-80.25107\\77\\-40.03906\\-80.59592\\77\\-38.08594\\-80.84345\\77\\-34.17969\\-81.62937\\77\\-32.22656\\-81.91221\\77\\-28.32031\\-82.25947\\77\\-26.36719\\-82.3409\\77\\-22.46094\\-82.31407\\77\\-10.74219\\-81.86694\\77\\-4.882813\\-81.61225\\77\\0.9765625\\-81.58839\\77\\4.882813\\-81.38886\\77\\6.835938\\-81.20524\\77\\8.789063\\-80.91119\\77\\10.74219\\-80.80381\\77\\12.69531\\-80.81839\\77\\16.60156\\-80.70061\\77\\26.36719\\-80.57682\\77\\34.17969\\-80.28911\\77\\36.13281\\-80.15261\\77\\41.99219\\-79.92914\\77\\47.85156\\-79.89957\\77\\53.71094\\-79.98292\\77\\61.52344\\-80.29572\\77\\65.42969\\-80.50996\\77\\69.33594\\-80.91591\\77\\75.19531\\-81.8325\\77\\79.10156\\-82.25947\\77\\81.05469\\-82.55939\\77\\84.96094\\-83.66809\\77\\88.86719\\-84.50852\\77\\90.82031\\-85.23478\\77\\94.72656\\-86.30092\\77\\96.67969\\-86.93687\\77\\98.63281\\-87.68045\\77\\100.5859\\-88.15217\\77\\104.4922\\-89.92348\\77\\108.3984\\-91.99485\\77\\110.3516\\-93.21325\\77\\112.3047\\-94.10943\\77\\116.1056\\-96.74219\\77\\120.1172\\-100.0933\\77\\122.7426\\-102.6016\\77\\124.3985\\-104.5547\\77\\128.7364\\-110.4141\\77\\129.732\\-112.3672\\77\\132.0103\\-116.2734\\77\\132.9753\\-118.2266\\77\\134.1943\\-120.1797\\77\\135.019\\-122.1328\\77\\136.0653\\-124.0859\\77\\136.773\\-126.0391\\77\\138.5174\\-129.9453\\77\\139.2927\\-131.8984\\77\\140.3491\\-133.8516\\77\\140.9642\\-135.8047\\77\\141.8896\\-137.7578\\77\\142.4689\\-139.7109\\77\\142.8686\\-141.6641\\77\\144.2746\\-145.5703\\77\\144.679\\-147.5234\\77\\145.2258\\-149.4766\\77\\145.9358\\-151.4297\\77\\146.6551\\-155.3359\\77\\147.0898\\-157.2891\\77\\147.6237\\-159.2422\\77\\147.9797\\-161.1953\\77\\148.6053\\-167.0547\\77\\148.8867\\-170.9609\\77\\149.39\\-176.8203\\77\\149.6691\\-182.6797\\77\\149.6691\\-188.5391\\77\\149.4696\\-192.4453\\77\\148.4843\\-206.1172\\77\\148.11\\-210.0234\\77\\147.7975\\-211.9766\\77\\146.8194\\-215.8828\\77\\145.9754\\-219.7891\\77\\145.1185\\-221.7422\\77\\143.9251\\-225.6484\\77\\142.8889\\-227.6016\\77\\142.202\\-229.5547\\77\\140.9485\\-231.5078\\77\\139.8994\\-233.4609\\77\\137.6953\\-236.6348\\77\\137.097\\-237.3672\\77\\135.9089\\-239.3203\\77\\134.4154\\-241.2734\\77\\130.671\\-245.1797\\77\\127.9297\\-247.8939\\77\\125.9766\\-249.5635\\77\\124.0234\\-250.8696\\77\\122.0703\\-252.3302\\77\\120.1172\\-253.8941\\77\\118.1641\\-255.317\\77\\116.2109\\-256.3294\\77\\114.2578\\-257.6048\\77\\112.3047\\-258.6205\\77\\108.3984\\-261.097\\77\\106.4453\\-261.9679\\77\\104.4922\\-263.0611\\77\\102.5391\\-263.8625\\77\\100.5859\\-265.0039\\77\\98.63281\\-265.9071\\77\\96.67969\\-267.1523\\77\\94.72656\\-268.0014\\77\\92.77344\\-269.2005\\77\\90.82031\\-269.9301\\77\\88.86719\\-271.1786\\77\\86.91406\\-272.1086\\77\\83.00781\\-274.6644\\77\\81.05469\\-275.5918\\77\\79.10156\\-276.7942\\77\\77.14844\\-277.7133\\77\\75.19531\\-279.1056\\77\\73.07381\\-280.3359\\77\\69.33594\\-282.3764\\77\\67.38281\\-283.2599\\77\\63.47656\\-285.3051\\77\\61.52344\\-286.523\\77\\59.57031\\-287.2848\\77\\57.61719\\-288.3087\\77\\55.66406\\-289.0833\\77\\53.71094\\-289.6463\\77\\51.75781\\-290.7726\\77\\49.80469\\-291.4128\\77\\47.85156\\-292.504\\77\\45.89844\\-293.1403\\77\\41.99219\\-294.6728\\77\\38.08594\\-295.5367\\77\\36.13281\\-296.3556\\77\\34.17969\\-296.8272\\77\\32.22656\\-297.1844\\77\\28.32031\\-298.4792\\77\\24.41406\\-299.218\\77\\20.50781\\-300.1949\\77\\16.60156\\-300.654\\77\\12.69531\\-300.9542\\77\\6.835938\\-301.2763\\77\\0.9765625\\-301.3752\\77\\-2.929688\\-301.3386\\77\\-8.789063\\-301.114\\77\\-12.69531\\-300.878\\77\\-18.55469\\-300.4078\\77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "267" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "165" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-300.216\\79\\-24.41406\\-299.2632\\79\\-28.32031\\-298.6102\\79\\-30.27344\\-298.1378\\79\\-32.22656\\-297.3985\\79\\-36.13281\\-296.6737\\79\\-40.03906\\-295.3634\\79\\-43.94531\\-294.5579\\79\\-45.89844\\-293.7551\\79\\-49.80469\\-292.5167\\79\\-51.75781\\-291.4826\\79\\-53.71094\\-290.8919\\79\\-55.66406\\-290.0156\\79\\-57.61719\\-289.2887\\79\\-59.57031\\-288.8389\\79\\-61.52344\\-287.9132\\79\\-65.42969\\-286.4714\\79\\-67.38281\\-285.4299\\79\\-69.33594\\-284.7835\\79\\-71.28906\\-283.7159\\79\\-73.24219\\-283.1616\\79\\-75.19531\\-282.4783\\79\\-77.14844\\-281.5627\\79\\-79.10156\\-281.0084\\79\\-81.05469\\-280.1057\\79\\-84.96094\\-278.5325\\79\\-86.91406\\-277.5782\\79\\-88.86719\\-277.0265\\79\\-90.82031\\-276.0752\\79\\-94.72656\\-274.8159\\79\\-96.67969\\-273.769\\79\\-98.63281\\-273.0178\\79\\-100.5859\\-271.8331\\79\\-102.5391\\-271.0495\\79\\-104.4922\\-269.87\\79\\-106.4453\\-269.1122\\79\\-108.3984\\-267.8372\\79\\-110.3516\\-266.6721\\79\\-112.3047\\-265.3838\\79\\-114.2578\\-263.9108\\79\\-116.1194\\-262.7578\\79\\-118.1641\\-261.3305\\79\\-121.1007\\-258.8516\\79\\-123.3068\\-256.8984\\79\\-125.9766\\-254.3648\\79\\-129.1681\\-251.0391\\79\\-131.8359\\-248.0584\\79\\-134.2739\\-245.1797\\79\\-135.7422\\-243.135\\79\\-136.8952\\-241.2734\\79\\-138.3329\\-239.3203\\79\\-141.9548\\-233.4609\\79\\-142.6575\\-231.5078\\79\\-144.3818\\-227.6016\\79\\-145.0258\\-225.6484\\79\\-146.0314\\-223.6953\\79\\-146.6064\\-221.7422\\79\\-148.0164\\-217.8359\\79\\-149.1718\\-211.9766\\79\\-149.7206\\-210.0234\\79\\-150.0873\\-208.0703\\79\\-150.3024\\-206.1172\\79\\-150.9339\\-198.3047\\79\\-151.1195\\-196.3516\\79\\-151.3593\\-192.4453\\79\\-151.4194\\-188.5391\\79\\-151.3593\\-186.5859\\79\\-151.1072\\-182.6797\\79\\-150.7621\\-178.7734\\79\\-150.1465\\-170.9609\\79\\-149.8653\\-169.0078\\79\\-148.9975\\-165.1016\\79\\-148.629\\-163.1484\\79\\-148.0164\\-159.2422\\79\\-147.4686\\-157.2891\\79\\-146.7779\\-155.3359\\79\\-146.3087\\-153.3828\\79\\-145.6822\\-151.4297\\79\\-144.8399\\-149.4766\\79\\-144.388\\-147.5234\\79\\-143.7773\\-145.5703\\79\\-142.9396\\-143.6172\\79\\-142.5308\\-141.6641\\79\\-141.9772\\-139.7109\\79\\-141.0444\\-137.7578\\79\\-140.3809\\-135.8047\\79\\-139.3885\\-133.8516\\79\\-136.8835\\-127.9922\\79\\-136.3051\\-126.0391\\79\\-135.2113\\-124.0859\\79\\-134.4666\\-122.1328\\79\\-133.2617\\-120.1797\\79\\-132.3547\\-118.2266\\79\\-131.0757\\-116.2734\\79\\-130.1041\\-114.3203\\79\\-128.9185\\-112.3672\\79\\-126.3089\\-108.4609\\79\\-122.9162\\-104.5547\\79\\-120.1172\\-101.8609\\79\\-118.1641\\-100.3927\\79\\-116.2109\\-99.12023\\79\\-114.2578\\-97.58588\\79\\-112.3047\\-96.25054\\79\\-110.3516\\-95.21904\\79\\-108.3984\\-94.04228\\79\\-106.4453\\-93.26761\\79\\-105.7978\\-92.83594\\79\\-102.5391\\-91.1323\\79\\-100.5859\\-89.95193\\79\\-96.67969\\-88.06802\\79\\-92.77344\\-86.37231\\79\\-90.82031\\-85.83627\\79\\-86.91406\\-84.38535\\79\\-83.00781\\-83.36397\\79\\-81.05469\\-82.71957\\79\\-79.10156\\-82.3485\\79\\-73.24219\\-81.51479\\79\\-69.33594\\-80.83296\\79\\-63.47656\\-80.33234\\79\\-57.61719\\-80.10511\\79\\-53.71094\\-80.08768\\79\\-49.80469\\-80.16374\\79\\-43.94531\\-80.49345\\79\\-40.03906\\-80.92645\\79\\-36.13281\\-81.66271\\79\\-34.17969\\-81.89969\\79\\-30.27344\\-82.25452\\79\\-26.36719\\-82.39703\\79\\-22.46094\\-82.32598\\79\\-14.64844\\-82.05736\\79\\-6.835938\\-81.83709\\79\\0.9765625\\-81.80393\\79\\4.882813\\-81.63223\\79\\6.835938\\-81.45718\\79\\8.789063\\-81.09236\\79\\10.74219\\-80.98222\\79\\14.64844\\-80.91279\\79\\18.55469\\-80.75888\\79\\22.46094\\-80.75888\\79\\30.27344\\-80.60565\\79\\38.08594\\-80.30242\\79\\45.89844\\-80.18084\\79\\53.71094\\-80.23944\\79\\61.52344\\-80.49744\\79\\65.42969\\-80.79642\\79\\71.28906\\-81.59537\\79\\77.14844\\-82.20689\\79\\79.10156\\-82.45452\\79\\81.05469\\-82.8908\\79\\83.00781\\-83.48322\\79\\86.91406\\-84.34148\\79\\88.86719\\-84.90137\\79\\90.82031\\-85.60327\\79\\92.77344\\-86.02806\\79\\94.72656\\-86.57406\\79\\96.67969\\-87.37993\\79\\100.5859\\-88.40487\\79\\102.5391\\-89.45354\\79\\104.4922\\-90.22977\\79\\106.4453\\-91.43478\\79\\108.3984\\-92.31236\\79\\110.3516\\-93.56006\\79\\112.3047\\-94.50896\\79\\114.2578\\-95.79693\\79\\115.4665\\-96.74219\\79\\118.1641\\-99.04134\\79\\120.1172\\-100.591\\79\\122.3281\\-102.6016\\79\\125.4075\\-106.5078\\79\\125.9766\\-107.1406\\79\\128.5105\\-110.4141\\79\\129.456\\-112.3672\\79\\130.6824\\-114.3203\\79\\131.6452\\-116.2734\\79\\133.9296\\-120.1797\\79\\135.7982\\-124.0859\\79\\136.6404\\-126.0391\\79\\137.3117\\-127.9922\\79\\138.355\\-129.9453\\79\\139.0374\\-131.8984\\79\\140.1602\\-133.8516\\79\\140.7823\\-135.8047\\79\\141.625\\-137.7578\\79\\142.3401\\-139.7109\\79\\142.7288\\-141.6641\\79\\143.287\\-143.6172\\79\\144.0979\\-145.5703\\79\\144.9626\\-149.4766\\79\\145.6299\\-151.4297\\79\\146.1356\\-153.3828\\79\\146.8231\\-157.2891\\79\\147.7119\\-161.1953\\79\\148.0061\\-163.1484\\79\\148.4318\\-167.0547\\79\\148.9356\\-174.8672\\79\\149.2143\\-180.7266\\79\\149.2691\\-188.5391\\79\\148.8029\\-198.3047\\79\\148.2776\\-206.1172\\79\\147.806\\-210.0234\\79\\146.8971\\-213.9297\\79\\146.1461\\-217.8359\\79\\144.7519\\-221.7422\\79\\144.2829\\-223.6953\\79\\143.3932\\-225.6484\\79\\141.8044\\-229.5547\\79\\140.6193\\-231.5078\\79\\139.289\\-233.4609\\79\\137.6953\\-236.1398\\79\\133.9505\\-241.2734\\79\\130.179\\-245.1797\\79\\127.9297\\-247.3937\\79\\125.7999\\-249.0859\\79\\124.0234\\-250.3995\\79\\120.1172\\-253.4338\\79\\114.2578\\-257.1407\\79\\112.3047\\-258.0934\\79\\110.3516\\-259.4249\\79\\108.3984\\-260.4721\\79\\106.4453\\-261.6478\\79\\104.4922\\-262.5231\\79\\102.5391\\-263.5767\\79\\100.5859\\-264.4393\\79\\100.221\\-264.7109\\79\\96.67969\\-266.761\\79\\94.72656\\-267.7678\\79\\92.77344\\-268.9781\\79\\90.82031\\-269.7679\\79\\88.86719\\-271.0037\\79\\86.91406\\-271.9612\\79\\84.96094\\-273.324\\79\\83.00781\\-274.5317\\79\\81.05469\\-275.5435\\79\\79.10156\\-276.7458\\79\\77.14844\\-277.7133\\79\\75.19531\\-279.1056\\79\\73.09792\\-280.3359\\79\\69.52898\\-282.2891\\79\\67.38281\\-283.2829\\79\\65.42969\\-284.4049\\79\\63.47656\\-285.3606\\79\\61.52344\\-286.6233\\79\\59.57031\\-287.3683\\79\\57.61719\\-288.445\\79\\53.71094\\-289.7973\\79\\51.75781\\-290.8839\\79\\49.80469\\-291.5429\\79\\47.85156\\-292.6373\\79\\45.89844\\-293.2537\\79\\43.94531\\-294.1196\\79\\41.99219\\-294.7713\\79\\40.03906\\-295.1785\\79\\38.08594\\-295.6933\\79\\36.13281\\-296.4987\\79\\32.22656\\-297.2958\\79\\30.27344\\-298.0088\\79\\28.32031\\-298.5839\\79\\24.41406\\-299.3298\\79\\20.50781\\-300.2787\\79\\16.60156\\-300.7098\\79\\10.74219\\-301.1255\\79\\6.835938\\-301.3221\\79\\0.9765625\\-301.4123\\79\\-4.882813\\-301.3386\\79\\-8.789063\\-301.1588\\79\\-14.64844\\-300.7873\\79\\-18.55469\\-300.4474\\79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "264" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "166" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-299.8748\\81\\-24.41406\\-299.3351\\81\\-28.32031\\-298.6611\\81\\-30.27344\\-298.2396\\81\\-32.22656\\-297.4793\\81\\-34.17969\\-297.0443\\81\\-36.13281\\-296.7126\\81\\-38.08594\\-296.1324\\81\\-40.03906\\-295.4076\\81\\-43.94531\\-294.5999\\81\\-47.85156\\-293.116\\81\\-49.80469\\-292.56\\81\\-51.75781\\-291.5109\\81\\-53.71094\\-290.9252\\81\\-57.61719\\-289.282\\81\\-59.57031\\-288.8264\\81\\-61.52344\\-287.8745\\81\\-65.42969\\-286.3722\\81\\-67.38281\\-285.3473\\81\\-69.33594\\-284.6769\\81\\-71.28906\\-283.5972\\81\\-73.24219\\-283.0644\\81\\-77.14844\\-281.4256\\81\\-79.10156\\-280.818\\81\\-81.05469\\-279.7974\\81\\-83.00781\\-279.1044\\81\\-84.96094\\-278.0711\\81\\-88.86719\\-276.681\\81\\-90.82031\\-275.7551\\81\\-92.77344\\-275.1952\\81\\-94.72656\\-274.2588\\81\\-96.67969\\-273.4338\\81\\-98.63281\\-272.3977\\81\\-106.3368\\-268.6172\\81\\-108.3984\\-267.4631\\81\\-110.3516\\-266.0716\\81\\-112.5127\\-264.7109\\81\\-115.4423\\-262.7578\\81\\-118.1152\\-260.8047\\81\\-120.5673\\-258.8516\\81\\-124.0234\\-255.8095\\81\\-125.9766\\-253.9057\\81\\-128.7697\\-251.0391\\81\\-131.8359\\-247.566\\81\\-133.7891\\-245.1327\\81\\-135.7422\\-242.5724\\81\\-137.9516\\-239.3203\\81\\-139.0412\\-237.3672\\81\\-140.4469\\-235.4141\\81\\-142.4255\\-231.5078\\81\\-143.1077\\-229.5547\\81\\-144.1323\\-227.6016\\81\\-144.7188\\-225.6484\\81\\-145.6432\\-223.6953\\81\\-146.3649\\-221.7422\\81\\-146.9397\\-219.7891\\81\\-147.7409\\-217.8359\\81\\-148.2153\\-215.8828\\81\\-148.8832\\-211.9766\\81\\-149.8413\\-208.0703\\81\\-150.1346\\-206.1172\\81\\-150.4503\\-202.2109\\81\\-150.8852\\-194.3984\\81\\-150.9752\\-190.4922\\81\\-150.957\\-186.5859\\81\\-150.7945\\-182.6797\\81\\-150.3024\\-174.8672\\81\\-149.9187\\-170.9609\\81\\-149.1075\\-167.0547\\81\\-148.4558\\-163.1484\\81\\-148.1919\\-161.1953\\81\\-147.7865\\-159.2422\\81\\-146.5794\\-155.3359\\81\\-146.1278\\-153.3828\\81\\-145.3256\\-151.4297\\81\\-144.6852\\-149.4766\\81\\-144.2411\\-147.5234\\81\\-142.8068\\-143.6172\\81\\-142.4173\\-141.6641\\81\\-141.7717\\-139.7109\\81\\-140.8663\\-137.7578\\81\\-140.2322\\-135.8047\\81\\-139.1539\\-133.8516\\81\\-138.4461\\-131.8984\\81\\-137.4153\\-129.9453\\81\\-136.1256\\-126.0391\\81\\-135.0393\\-124.0859\\81\\-134.2741\\-122.1328\\81\\-133.0582\\-120.1797\\81\\-132.0818\\-118.2266\\81\\-130.8833\\-116.2734\\81\\-128.7122\\-112.3672\\81\\-125.9766\\-108.5723\\81\\-124.3057\\-106.5078\\81\\-122.5956\\-104.5547\\81\\-120.1172\\-102.2152\\81\\-118.1641\\-100.8906\\81\\-115.34\\-98.69531\\81\\-112.3047\\-96.55582\\81\\-110.3516\\-95.53976\\81\\-108.3984\\-94.29381\\81\\-106.4453\\-93.55251\\81\\-104.4922\\-92.41107\\81\\-102.5391\\-91.51996\\81\\-100.5859\\-90.24158\\81\\-98.63281\\-89.4018\\81\\-96.67969\\-88.30334\\81\\-94.72656\\-87.57912\\81\\-92.77344\\-86.66267\\81\\-88.86719\\-85.55898\\81\\-86.91406\\-84.7285\\81\\-84.96094\\-84.17166\\81\\-81.05469\\-83.23793\\81\\-79.10156\\-82.6385\\81\\-75.19531\\-82.06398\\81\\-71.28906\\-81.62231\\81\\-69.33594\\-81.29404\\81\\-65.42969\\-80.80614\\81\\-61.52344\\-80.52359\\81\\-55.66406\\-80.36095\\81\\-49.80469\\-80.41528\\81\\-43.94531\\-80.80614\\81\\-38.08594\\-81.70844\\81\\-36.13281\\-81.93923\\81\\-30.27344\\-82.38062\\81\\-26.36719\\-82.44998\\81\\-16.60156\\-82.17116\\81\\-6.835938\\-81.98319\\81\\2.929688\\-81.94116\\81\\6.835938\\-81.7487\\81\\8.789063\\-81.47429\\81\\14.64844\\-81.14181\\81\\18.55469\\-80.87119\\81\\28.32031\\-80.83296\\81\\32.22656\\-80.75629\\81\\38.08594\\-80.49345\\81\\45.89844\\-80.40424\\81\\55.66406\\-80.51865\\81\\61.52344\\-80.80842\\81\\63.47656\\-80.98543\\81\\71.28906\\-81.84808\\81\\75.19531\\-82.18731\\81\\77.14844\\-82.41313\\81\\79.10156\\-82.75642\\81\\81.05469\\-83.31799\\81\\84.96094\\-84.15955\\81\\86.91406\\-84.63157\\81\\88.86719\\-85.38882\\81\\92.77344\\-86.28893\\81\\96.67969\\-87.68045\\81\\98.63281\\-88.10571\\81\\100.5859\\-88.81435\\81\\102.5391\\-89.77912\\81\\104.4922\\-90.62286\\81\\106.4453\\-91.76505\\81\\108.3984\\-92.72743\\81\\110.3516\\-93.83177\\81\\112.3047\\-95.06701\\81\\114.2578\\-96.14173\\81\\116.2109\\-97.74462\\81\\121.6935\\-102.6016\\81\\126.7541\\-108.4609\\81\\128.2037\\-110.4141\\81\\129.2251\\-112.3672\\81\\130.4713\\-114.3203\\81\\131.3343\\-116.2734\\81\\132.5684\\-118.2266\\81\\134.6784\\-122.1328\\81\\135.5017\\-124.0859\\81\\136.4948\\-126.0391\\81\\137.0716\\-127.9922\\81\\138.1778\\-129.9453\\81\\138.8408\\-131.8984\\81\\139.919\\-133.8516\\81\\141.3216\\-137.7578\\81\\142.1749\\-139.7109\\81\\143.0404\\-143.6172\\81\\143.8407\\-145.5703\\81\\144.3623\\-147.5234\\81\\145.2026\\-151.4297\\81\\145.8748\\-153.3828\\81\\146.2719\\-155.3359\\81\\146.8987\\-159.2422\\81\\147.7599\\-163.1484\\81\\148.0301\\-165.1016\\81\\148.3804\\-169.0078\\81\\148.7044\\-174.8672\\81\\148.8773\\-180.7266\\81\\148.9324\\-188.5391\\81\\148.7442\\-194.3984\\81\\148.5745\\-198.3047\\81\\148.2064\\-204.1641\\81\\147.7486\\-208.0703\\81\\146.9191\\-211.9766\\81\\146.2298\\-215.8828\\81\\145.7435\\-217.8359\\81\\144.9626\\-219.7891\\81\\143.944\\-223.6953\\81\\142.9791\\-225.6484\\81\\142.4062\\-227.6016\\81\\141.2737\\-229.5547\\81\\140.2814\\-231.5078\\81\\138.8504\\-233.4609\\81\\136.4663\\-237.3672\\81\\133.7891\\-240.7656\\81\\129.5185\\-245.1797\\81\\127.5156\\-247.1328\\81\\124.0234\\-250.0163\\81\\122.0703\\-251.4853\\81\\116.9976\\-254.9453\\81\\116.2109\\-255.5394\\81\\114.2578\\-256.5122\\81\\113.713\\-256.8984\\81\\108.3984\\-259.9959\\81\\106.4453\\-261.2498\\81\\104.4922\\-262.1267\\81\\102.5391\\-263.2764\\81\\100.5859\\-264.0454\\81\\98.63281\\-265.3077\\81\\96.67969\\-266.3223\\81\\96.21957\\-266.6641\\81\\92.77344\\-268.6886\\81\\90.82031\\-269.6365\\81\\88.86719\\-270.823\\81\\86.91406\\-271.8517\\81\\84.96094\\-273.2617\\81\\82.93269\\-274.4766\\81\\77.14844\\-277.7215\\81\\75.19531\\-279.1344\\81\\73.16451\\-280.3359\\81\\69.33594\\-282.4951\\81\\67.38281\\-283.3173\\81\\65.42969\\-284.5183\\81\\63.47656\\-285.4376\\81\\61.52344\\-286.7066\\81\\59.57031\\-287.4637\\81\\57.61719\\-288.5787\\81\\55.66406\\-289.2015\\81\\53.71094\\-290.0008\\81\\51.75781\\-290.9759\\81\\49.80469\\-291.7119\\81\\47.85156\\-292.7589\\81\\45.89844\\-293.3776\\81\\43.94531\\-294.3015\\81\\41.99219\\-294.8608\\81\\40.03906\\-295.2749\\81\\38.08594\\-295.875\\81\\36.13281\\-296.61\\81\\32.22656\\-297.4166\\81\\30.27344\\-298.207\\81\\28.32031\\-298.6709\\81\\24.41406\\-299.4504\\81\\22.46094\\-300.0026\\81\\20.50781\\-300.3584\\81\\18.55469\\-300.5941\\81\\12.69531\\-301.0355\\81\\8.789063\\-301.2669\\81\\2.929688\\-301.4696\\81\\-0.9765625\\-301.4809\\81\\-4.882813\\-301.3989\\81\\-10.74219\\-301.0972\\81\\-14.64844\\-300.8209\\81\\-18.55469\\-300.4938\\81\\-20.50781\\-300.2664\\81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "259" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "167" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-299.9619\\83\\-24.41406\\-299.4123\\83\\-30.27344\\-298.33\\83\\-32.22656\\-297.5644\\83\\-34.17969\\-297.0822\\83\\-36.13281\\-296.7624\\83\\-38.08594\\-296.2369\\83\\-40.03906\\-295.4694\\83\\-43.94531\\-294.6489\\83\\-47.85156\\-293.1426\\83\\-49.80469\\-292.5929\\83\\-51.75781\\-291.5574\\83\\-53.71094\\-290.9407\\83\\-57.61719\\-289.2887\\83\\-59.57031\\-288.8264\\83\\-61.52344\\-287.8604\\83\\-65.42969\\-286.3183\\83\\-67.38281\\-285.2896\\83\\-69.33594\\-284.5783\\83\\-71.28906\\-283.5142\\83\\-73.24219\\-282.9628\\83\\-75.19531\\-282.0214\\83\\-79.10156\\-280.6179\\83\\-81.05469\\-279.5968\\83\\-83.00781\\-278.8622\\83\\-84.96094\\-277.7378\\83\\-86.91406\\-277.1331\\83\\-88.86719\\-276.1968\\83\\-92.77344\\-274.8658\\83\\-94.72656\\-273.8351\\83\\-96.67969\\-273.072\\83\\-98.63281\\-271.8782\\83\\-100.5859\\-271.1211\\83\\-102.5391\\-269.9648\\83\\-104.4922\\-269.2308\\83\\-106.4453\\-268.006\\83\\-108.3984\\-267.0294\\83\\-111.7205\\-264.7109\\83\\-112.3047\\-264.2436\\83\\-114.2578\\-263.1973\\83\\-116.2109\\-261.7617\\83\\-122.0703\\-257.0739\\83\\-124.0234\\-255.3434\\83\\-128.3218\\-251.0391\\83\\-130.0639\\-249.0859\\83\\-131.6216\\-247.1328\\83\\-134.8705\\-243.2266\\83\\-136.3416\\-241.2734\\83\\-137.4046\\-239.3203\\83\\-140.0761\\-235.4141\\83\\-141.0289\\-233.4609\\83\\-142.1587\\-231.5078\\83\\-142.8097\\-229.5547\\83\\-143.7789\\-227.6016\\83\\-145.1266\\-223.6953\\83\\-146.0859\\-221.7422\\83\\-146.657\\-219.7891\\83\\-147.9953\\-215.8828\\83\\-149.0083\\-210.0234\\83\\-149.8958\\-206.1172\\83\\-150.2852\\-202.2109\\83\\-150.4828\\-198.3047\\83\\-150.6721\\-192.4453\\83\\-150.6721\\-186.5859\\83\\-150.5561\\-182.6797\\83\\-150.3688\\-178.7734\\83\\-150.115\\-174.8672\\83\\-149.9089\\-172.9141\\83\\-149.6019\\-170.9609\\83\\-148.8514\\-167.0547\\83\\-148.0129\\-161.1953\\83\\-146.882\\-157.2891\\83\\-145.9167\\-153.3828\\83\\-145.0479\\-151.4297\\83\\-144.0768\\-147.5234\\83\\-143.2339\\-145.5703\\83\\-142.2791\\-141.6641\\83\\-140.7104\\-137.7578\\83\\-140.0548\\-135.8047\\83\\-138.9541\\-133.8516\\83\\-138.2835\\-131.8984\\83\\-137.2236\\-129.9453\\83\\-136.6652\\-127.9922\\83\\-135.8918\\-126.0391\\83\\-134.8855\\-124.0859\\83\\-134.0209\\-122.1328\\83\\-131.8359\\-118.424\\83\\-128.4944\\-112.3672\\83\\-125.9766\\-108.9984\\83\\-124.0234\\-106.675\\83\\-122.1454\\-104.5547\\83\\-120.0149\\-102.6016\\83\\-116.2109\\-99.63749\\83\\-114.9368\\-98.69531\\83\\-112.0016\\-96.74219\\83\\-108.3984\\-94.60645\\83\\-106.4453\\-93.77655\\83\\-102.5391\\-91.79903\\83\\-100.5859\\-90.61228\\83\\-98.63281\\-89.70743\\83\\-96.67969\\-88.62405\\83\\-94.72656\\-87.89171\\83\\-92.58823\\-86.97656\\83\\-90.82031\\-86.33968\\83\\-88.86719\\-85.82457\\83\\-84.96094\\-84.48485\\83\\-81.05469\\-83.63947\\83\\-77.14844\\-82.63119\\83\\-75.19531\\-82.32424\\83\\-69.33594\\-81.69515\\83\\-67.38281\\-81.5317\\83\\-63.47656\\-81.06069\\83\\-61.52344\\-80.89934\\83\\-57.61719\\-80.70856\\83\\-55.66406\\-80.66281\\83\\-49.80469\\-80.71959\\83\\-47.85156\\-80.84345\\83\\-43.94531\\-81.28257\\83\\-40.03906\\-81.81748\\83\\-36.13281\\-82.14227\\83\\-30.27344\\-82.50224\\83\\-26.36719\\-82.50065\\83\\-16.60156\\-82.24952\\83\\-4.882813\\-82.11183\\83\\0.9765625\\-82.15846\\83\\2.929688\\-82.11771\\83\\10.74219\\-81.71764\\83\\16.60156\\-81.29404\\83\\18.55469\\-81.04455\\83\\22.46094\\-80.99905\\83\\28.32031\\-81.02985\\83\\32.22656\\-81.01398\\83\\36.13281\\-80.8206\\83\\40.03906\\-80.71959\\83\\45.89844\\-80.66281\\83\\49.80469\\-80.69768\\83\\55.66406\\-80.84551\\83\\59.57031\\-81.09277\\83\\67.38281\\-81.75323\\83\\71.28906\\-82.02904\\83\\75.19531\\-82.39282\\83\\77.14844\\-82.69989\\83\\79.10156\\-83.22568\\83\\84.96094\\-84.41237\\83\\88.86719\\-85.67253\\83\\92.77344\\-86.60614\\83\\94.72656\\-87.39905\\83\\98.63281\\-88.3541\\83\\100.5859\\-89.31095\\83\\102.5391\\-90.05955\\83\\104.4922\\-91.1485\\83\\106.4453\\-92.08949\\83\\108.3984\\-93.25959\\83\\110.3516\\-94.14466\\83\\112.3047\\-95.4245\\83\\114.2578\\-96.59723\\83\\116.2109\\-98.10938\\83\\118.1641\\-99.76748\\83\\121.3686\\-102.6016\\83\\122.0703\\-103.3247\\83\\124.8328\\-106.5078\\83\\126.455\\-108.4609\\83\\127.9297\\-110.648\\83\\130.2108\\-114.3203\\83\\131.0974\\-116.2734\\83\\132.3636\\-118.2266\\83\\133.3174\\-120.1797\\83\\134.5009\\-122.1328\\83\\135.2505\\-124.0859\\83\\136.3294\\-126.0391\\83\\136.9034\\-127.9922\\83\\137.9191\\-129.9453\\83\\138.6719\\-131.8984\\83\\140.4286\\-135.8047\\83\\141.0651\\-137.7578\\83\\141.9635\\-139.7109\\83\\142.4888\\-141.6641\\83\\142.8643\\-143.6172\\83\\144.1767\\-147.5234\\83\\144.8895\\-151.4297\\83\\146.041\\-155.3359\\83\\146.9485\\-161.1953\\83\\147.7486\\-165.1016\\83\\148.179\\-169.0078\\83\\148.4898\\-174.8672\\83\\148.6123\\-178.7734\\83\\148.6709\\-182.6797\\83\\148.6832\\-188.5391\\83\\148.5204\\-194.3984\\83\\148.3566\\-198.3047\\83\\147.9399\\-204.1641\\83\\147.652\\-206.1172\\83\\147.2307\\-208.0703\\83\\146.2799\\-213.9297\\83\\145.9045\\-215.8828\\83\\145.1778\\-217.8359\\83\\144.6487\\-219.7891\\83\\144.2303\\-221.7422\\83\\143.4366\\-223.6953\\83\\142.0998\\-227.6016\\83\\139.6484\\-231.6966\\83\\137.6953\\-234.7602\\83\\137.162\\-235.4141\\83\\136.0652\\-237.3672\\83\\134.6071\\-239.3203\\83\\131.8359\\-242.4152\\83\\129.103\\-245.1797\\83\\126.9747\\-247.1328\\83\\124.0234\\-249.6129\\83\\120.1172\\-252.1937\\83\\118.1641\\-253.7324\\83\\116.2109\\-255.0186\\83\\114.2578\\-256.0931\\83\\112.3047\\-257.3209\\83\\110.3516\\-258.2511\\83\\108.3984\\-259.6222\\83\\102.5391\\-262.8769\\83\\100.5859\\-263.7806\\83\\96.67969\\-266.0151\\83\\94.72656\\-267.3706\\83\\92.4193\\-268.6172\\83\\86.91406\\-271.7522\\83\\84.96094\\-273.2004\\83\\79.50246\\-276.4297\\83\\77.14844\\-277.7255\\83\\75.19531\\-279.1718\\83\\73.24219\\-280.3596\\83\\71.28906\\-281.4108\\83\\69.33594\\-282.5628\\83\\67.38281\\-283.3863\\83\\65.42969\\-284.6237\\83\\63.47656\\-285.5384\\83\\61.52344\\-286.789\\83\\59.57031\\-287.5751\\83\\57.61719\\-288.6961\\83\\55.66406\\-289.2654\\83\\53.71094\\-290.2523\\83\\49.80469\\-291.9308\\83\\47.85156\\-292.8627\\83\\45.89844\\-293.5256\\83\\43.94531\\-294.4511\\83\\40.03906\\-295.3673\\83\\38.08594\\-296.1048\\83\\36.13281\\-296.7058\\83\\34.17969\\-297.0733\\83\\32.22656\\-297.5753\\83\\30.27344\\-298.3579\\83\\26.36719\\-299.11\\83\\22.46094\\-300.1377\\83\\20.50781\\-300.4277\\83\\16.60156\\-300.804\\83\\12.69531\\-301.0771\\83\\6.835938\\-301.3989\\83\\2.929688\\-301.5302\\83\\-0.9765625\\-301.569\\83\\-4.882813\\-301.4584\\83\\-10.74219\\-301.1462\\83\\-14.64844\\-300.8666\\83\\-20.50781\\-300.3165\\83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "270" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "168" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-300.0542\\85\\-24.41406\\-299.493\\85\\-26.36719\\-299.0973\\85\\-30.27344\\-298.4194\\85\\-32.22656\\-297.6822\\85\\-34.17969\\-297.1445\\85\\-36.13281\\-296.8193\\85\\-38.08594\\-296.3339\\85\\-40.03906\\-295.5262\\85\\-43.94531\\-294.6884\\85\\-45.8816\\-294.0078\\85\\-47.85156\\-293.1966\\85\\-49.80469\\-292.6244\\85\\-51.75781\\-291.6158\\85\\-53.71094\\-290.9713\\85\\-57.61719\\-289.3074\\85\\-59.57031\\-288.8264\\85\\-61.52344\\-287.8625\\85\\-63.47656\\-287.1173\\85\\-65.42969\\-286.2619\\85\\-67.38281\\-285.254\\85\\-69.33594\\-284.466\\85\\-71.28906\\-283.4458\\85\\-73.24219\\-282.8737\\85\\-75.19531\\-281.8409\\85\\-77.14844\\-281.2021\\85\\-79.10156\\-280.3592\\85\\-81.05469\\-279.4056\\85\\-83.00781\\-278.5572\\85\\-84.96094\\-277.5016\\85\\-86.91406\\-276.8718\\85\\-88.86719\\-275.8595\\85\\-90.82031\\-275.2812\\85\\-96.67969\\-272.576\\85\\-98.63281\\-271.5361\\85\\-102.5391\\-269.6423\\85\\-104.4922\\-268.7511\\85\\-108.0097\\-266.6641\\85\\-110.3516\\-265.2185\\85\\-112.3047\\-263.8339\\85\\-116.2109\\-261.3657\\85\\-118.1641\\-259.7667\\85\\-120.1172\\-258.0448\\85\\-121.6426\\-256.8984\\85\\-124.0234\\-254.7758\\85\\-127.7328\\-251.0391\\85\\-129.8828\\-248.7347\\85\\-131.0922\\-247.1328\\85\\-134.5048\\-243.2266\\85\\-135.9233\\-241.2734\\85\\-136.995\\-239.3203\\85\\-138.3836\\-237.3672\\85\\-140.6905\\-233.4609\\85\\-141.7605\\-231.5078\\85\\-142.5721\\-229.5547\\85\\-143.2559\\-227.6016\\85\\-144.2308\\-225.6484\\85\\-144.7754\\-223.6953\\85\\-145.7072\\-221.7422\\85\\-146.3867\\-219.7891\\85\\-146.9124\\-217.8359\\85\\-147.6772\\-215.8828\\85\\-148.1375\\-213.9297\\85\\-149.0815\\-208.0703\\85\\-149.5303\\-206.1172\\85\\-149.8756\\-204.1641\\85\\-150.2307\\-200.2578\\85\\-150.3798\\-196.3516\\85\\-150.472\\-192.4453\\85\\-150.4877\\-188.5391\\85\\-150.3688\\-182.6797\\85\\-150.1872\\-178.7734\\85\\-149.8518\\-174.8672\\85\\-149.1847\\-170.9609\\85\\-148.3846\\-165.1016\\85\\-147.7732\\-161.1953\\85\\-147.1332\\-159.2422\\85\\-146.2325\\-155.3359\\85\\-145.6432\\-153.3828\\85\\-144.8435\\-151.4297\\85\\-144.4279\\-149.4766\\85\\-143.8757\\-147.5234\\85\\-143.0369\\-145.5703\\85\\-142.1279\\-141.6641\\85\\-141.2604\\-139.7109\\85\\-139.8354\\-135.8047\\85\\-138.7716\\-133.8516\\85\\-138.0796\\-131.8984\\85\\-137.0889\\-129.9453\\85\\-136.5591\\-127.9922\\85\\-135.5794\\-126.0391\\85\\-134.7239\\-124.0859\\85\\-132.6231\\-120.1797\\85\\-131.368\\-118.2266\\85\\-130.5191\\-116.2734\\85\\-129.2657\\-114.3203\\85\\-128.216\\-112.3672\\85\\-125.9766\\-109.3265\\85\\-124.0234\\-107.0441\\85\\-121.6986\\-104.5547\\85\\-120.1172\\-103.0831\\85\\-118.1641\\-101.4283\\85\\-116.2109\\-99.95089\\85\\-114.2578\\-98.57324\\85\\-110.3516\\-96.05793\\85\\-106.4453\\-93.96178\\85\\-104.4922\\-93.19304\\85\\-102.5391\\-92.04282\\85\\-100.5859\\-91.11137\\85\\-98.63281\\-89.97921\\85\\-94.72656\\-88.10631\\85\\-92.77344\\-87.53362\\85\\-90.82031\\-86.67446\\85\\-86.91406\\-85.59464\\85\\-83.00781\\-84.35938\\85\\-79.10156\\-83.57414\\85\\-75.19531\\-82.66507\\85\\-73.24219\\-82.39232\\85\\-69.33594\\-82.00777\\85\\-63.47656\\-81.56738\\85\\-57.61719\\-81.20524\\85\\-55.66406\\-81.12547\\85\\-49.80469\\-81.18923\\85\\-45.89844\\-81.56626\\85\\-36.13281\\-82.34716\\85\\-32.22656\\-82.57875\\85\\-30.27344\\-82.62216\\85\\-26.36719\\-82.58203\\85\\-20.50781\\-82.40085\\85\\-4.882813\\-82.27075\\85\\0.9765625\\-82.39661\\85\\12.69531\\-81.80463\\85\\16.60156\\-81.58839\\85\\18.55469\\-81.34018\\85\\22.46094\\-81.18983\\85\\28.32031\\-81.2204\\85\\32.22656\\-81.27995\\85\\40.03906\\-81.0765\\85\\47.85156\\-81.06116\\85\\53.71094\\-81.23438\\85\\59.57031\\-81.51479\\85\\69.33594\\-82.08205\\85\\73.24219\\-82.40085\\85\\75.19531\\-82.68642\\85\\79.10156\\-83.59902\\85\\81.05469\\-83.90179\\85\\84.96094\\-84.77251\\85\\86.91406\\-85.48938\\85\\90.82031\\-86.35947\\85\\94.72656\\-87.69188\\85\\96.67969\\-88.09351\\85\\98.63281\\-88.72686\\85\\100.5859\\-89.66355\\85\\102.5391\\-90.38217\\85\\104.4922\\-91.56888\\85\\106.4453\\-92.44659\\85\\108.3984\\-93.62102\\85\\110.3516\\-94.52203\\85\\113.7376\\-96.74219\\85\\118.1641\\-100.1232\\85\\120.9925\\-102.6016\\85\\122.8966\\-104.5547\\85\\126.0447\\-108.4609\\85\\128.7748\\-112.3672\\85\\130.8884\\-116.2734\\85\\132.0818\\-118.2266\\85\\133.0717\\-120.1797\\85\\134.2929\\-122.1328\\85\\135.0598\\-124.0859\\85\\136.1172\\-126.0391\\85\\136.7655\\-127.9922\\85\\137.5504\\-129.9453\\85\\138.4943\\-131.8984\\85\\139.1982\\-133.8516\\85\\140.2278\\-135.8047\\85\\140.839\\-137.7578\\85\\141.6406\\-139.7109\\85\\142.3157\\-141.6641\\85\\143.1489\\-145.5703\\85\\143.8893\\-147.5234\\85\\144.3455\\-149.4766\\85\\144.652\\-151.4297\\85\\145.0703\\-153.3828\\85\\145.6948\\-155.3359\\85\\146.1025\\-157.2891\\85\\146.6533\\-161.1953\\85\\147.6772\\-167.0547\\85\\147.915\\-169.0078\\85\\148.2776\\-174.8672\\85\\148.4433\\-180.7266\\85\\148.4666\\-186.5859\\85\\148.3503\\-192.4453\\85\\148.1061\\-198.3047\\85\\147.7843\\-202.2109\\85\\147.4988\\-204.1641\\85\\146.8155\\-208.0703\\85\\146.3022\\-211.9766\\85\\145.9635\\-213.9297\\85\\144.7991\\-217.8359\\85\\144.3864\\-219.7891\\85\\143.8642\\-221.7422\\85\\143.0107\\-223.6953\\85\\142.4877\\-225.6484\\85\\141.6409\\-227.6016\\85\\140.5611\\-229.5547\\85\\139.2327\\-231.5078\\85\\138.1718\\-233.4609\\85\\136.807\\-235.4141\\85\\135.7422\\-237.0811\\85\\134.1384\\-239.3203\\85\\131.8359\\-241.9269\\85\\128.6029\\-245.1797\\85\\125.9766\\-247.5137\\85\\123.9926\\-249.0859\\85\\122.0703\\-250.363\\85\\121.251\\-251.0391\\85\\118.4043\\-252.9922\\85\\114.2578\\-255.7559\\85\\112.3047\\-256.7188\\85\\110.3516\\-257.8689\\85\\108.3984\\-259.1659\\85\\106.4453\\-260.1804\\85\\104.4922\\-261.4793\\85\\102.5391\\-262.4127\\85\\100.5859\\-263.5617\\85\\98.63281\\-264.5202\\85\\96.67969\\-265.78\\85\\94.72656\\-267.1584\\85\\92.77344\\-268.1721\\85\\90.82031\\-269.4196\\85\\88.86719\\-270.4815\\85\\86.91406\\-271.6572\\85\\84.96094\\-273.1353\\85\\82.79639\\-274.4766\\85\\79.49829\\-276.4297\\85\\77.14844\\-277.7465\\85\\75.19531\\-279.2112\\85\\73.24219\\-280.4495\\85\\71.28906\\-281.4547\\85\\69.33594\\-282.6641\\85\\67.38281\\-283.4644\\85\\65.42969\\-284.7397\\85\\63.47656\\-285.6632\\85\\61.52344\\-286.8913\\85\\59.57031\\-287.7137\\85\\57.61719\\-288.8058\\85\\55.66406\\-289.3472\\85\\53.71094\\-290.4678\\85\\51.75781\\-291.1849\\85\\49.80469\\-292.2163\\85\\45.89844\\-293.6845\\85\\43.94531\\-294.5703\\85\\40.03906\\-295.4661\\85\\38.08594\\-296.2748\\85\\36.13281\\-296.7852\\85\\34.17969\\-297.1575\\85\\32.22656\\-297.7599\\85\\30.27344\\-298.4837\\85\\26.36719\\-299.2033\\85\\22.46094\\-300.224\\85\\20.50781\\-300.4938\\85\\16.60156\\-300.8438\\85\\10.74219\\-301.2409\\85\\6.835938\\-301.4584\\85\\2.929688\\-301.5944\\85\\-0.9765625\\-301.6489\\85\\-6.835938\\-301.4337\\85\\-10.74219\\-301.21\\85\\-16.60156\\-300.7484\\85\\-20.50781\\-300.3759\\85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "267" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "169" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-300.1377\\87\\-24.41406\\-299.6009\\87\\-26.36719\\-299.1719\\87\\-30.27344\\-298.4989\\87\\-34.17969\\-297.2244\\87\\-38.08594\\-296.4428\\87\\-40.03906\\-295.6216\\87\\-43.94531\\-294.7476\\87\\-45.89844\\-294.1196\\87\\-47.85156\\-293.2635\\87\\-49.80469\\-292.6795\\87\\-51.75781\\-291.6885\\87\\-55.66406\\-290.2655\\87\\-57.61719\\-289.3381\\87\\-59.57031\\-288.8389\\87\\-61.52344\\-287.8866\\87\\-63.47656\\-287.1064\\87\\-65.42969\\-286.218\\87\\-67.38281\\-285.2238\\87\\-69.33594\\-284.3776\\87\\-71.28906\\-283.3993\\87\\-73.24219\\-282.7971\\87\\-75.19531\\-281.7135\\87\\-77.14844\\-281.0903\\87\\-79.10156\\-280.1057\\87\\-81.05469\\-279.2354\\87\\-83.00781\\-278.1831\\87\\-86.91406\\-276.515\\87\\-88.86719\\-275.623\\87\\-90.82031\\-275.0169\\87\\-92.77344\\-273.9456\\87\\-94.72656\\-273.18\\87\\-96.67969\\-272.0164\\87\\-98.63281\\-271.196\\87\\-100.5859\\-270.0206\\87\\-102.5391\\-269.3512\\87\\-104.4922\\-268.1764\\87\\-106.4453\\-267.2317\\87\\-108.3984\\-265.8463\\87\\-110.3516\\-264.6051\\87\\-112.3047\\-263.4805\\87\\-114.2578\\-262.0696\\87\\-116.2009\\-260.8047\\87\\-118.1641\\-259.3156\\87\\-118.6382\\-258.8516\\87\\-121.0861\\-256.8984\\87\\-124.0234\\-254.2129\\87\\-125.126\\-252.9922\\87\\-127.1605\\-251.0391\\87\\-129.8828\\-248.2016\\87\\-130.7055\\-247.1328\\87\\-134.0714\\-243.2266\\87\\-135.7422\\-240.7852\\87\\-137.989\\-237.3672\\87\\-139.0118\\-235.4141\\87\\-140.3531\\-233.4609\\87\\-141.2495\\-231.5078\\87\\-142.3135\\-229.5547\\87\\-142.8805\\-227.6016\\87\\-143.8546\\-225.6484\\87\\-145.1643\\-221.7422\\87\\-146.0938\\-219.7891\\87\\-146.5971\\-217.8359\\87\\-147.8657\\-213.9297\\87\\-148.2641\\-211.9766\\87\\-148.7949\\-208.0703\\87\\-149.5\\-204.1641\\87\\-149.9949\\-200.2578\\87\\-150.2125\\-196.3516\\87\\-150.2963\\-192.4453\\87\\-150.3074\\-188.5391\\87\\-150.173\\-182.6797\\87\\-149.9221\\-178.7734\\87\\-149.7206\\-176.8203\\87\\-148.8701\\-170.9609\\87\\-148.2081\\-165.1016\\87\\-147.8758\\-163.1484\\87\\-147.4609\\-161.3348\\87\\-146.8622\\-159.2422\\87\\-146.041\\-155.3359\\87\\-145.2884\\-153.3828\\87\\-144.6896\\-151.4297\\87\\-144.2803\\-149.4766\\87\\-142.9099\\-145.5703\\87\\-142.4953\\-143.6172\\87\\-141.9585\\-141.6641\\87\\-141.0496\\-139.7109\\87\\-140.4202\\-137.7578\\87\\-138.631\\-133.8516\\87\\-137.8569\\-131.8984\\87\\-136.9371\\-129.9453\\87\\-136.3867\\-127.9922\\87\\-135.3277\\-126.0391\\87\\-134.5305\\-124.0859\\87\\-133.3971\\-122.1328\\87\\-132.4219\\-120.1797\\87\\-131.1455\\-118.2266\\87\\-130.3161\\-116.2734\\87\\-127.9297\\-112.4415\\87\\-125.9766\\-109.7004\\87\\-124.0234\\-107.3505\\87\\-121.3718\\-104.5547\\87\\-118.1641\\-101.7047\\87\\-116.2109\\-100.2535\\87\\-110.3516\\-96.34725\\87\\-108.3984\\-95.38151\\87\\-106.4453\\-94.18452\\87\\-104.4922\\-93.48914\\87\\-102.5391\\-92.30379\\87\\-100.5859\\-91.50896\\87\\-98.63281\\-90.27687\\87\\-96.67969\\-89.51686\\87\\-94.72656\\-88.39258\\87\\-92.77344\\-87.81451\\87\\-88.86719\\-86.37978\\87\\-84.96094\\-85.46256\\87\\-83.00781\\-84.76257\\87\\-81.05469\\-84.27181\\87\\-77.14844\\-83.57738\\87\\-73.24219\\-82.77037\\87\\-71.28906\\-82.47672\\87\\-69.33594\\-82.28535\\87\\-65.42969\\-82.02661\\87\\-61.52344\\-81.83376\\87\\-55.66406\\-81.61572\\87\\-49.80469\\-81.62582\\87\\-45.89844\\-81.92028\\87\\-40.03906\\-82.25344\\87\\-34.17969\\-82.71456\\87\\-32.22656\\-82.80848\\87\\-28.32031\\-82.78635\\87\\-22.46094\\-82.53352\\87\\-20.50781\\-82.48948\\87\\-14.64844\\-82.50391\\87\\-8.789063\\-82.45521\\87\\-4.882813\\-82.50391\\87\\-0.9765625\\-82.74247\\87\\0.9765625\\-82.78017\\87\\2.929688\\-82.68105\\87\\4.882813\\-82.45248\\87\\10.74219\\-82.08147\\87\\16.60156\\-81.78303\\87\\20.50781\\-81.52055\\87\\26.36719\\-81.38011\\87\\32.22656\\-81.54269\\87\\38.08594\\-81.50639\\87\\45.89844\\-81.49498\\87\\53.71094\\-81.60883\\87\\65.42969\\-82.0761\\87\\71.28906\\-82.45057\\87\\73.24219\\-82.71957\\87\\77.14844\\-83.54591\\87\\81.05469\\-84.15977\\87\\83.00781\\-84.62421\\87\\84.96094\\-85.28339\\87\\86.91406\\-85.78549\\87\\88.86719\\-86.16741\\87\\90.82031\\-86.67662\\87\\92.77344\\-87.4445\\87\\96.67969\\-88.33218\\87\\98.63281\\-89.25291\\87\\100.5859\\-89.96021\\87\\102.572\\-90.88281\\87\\110.045\\-94.78906\\87\\112.3047\\-96.10644\\87\\114.2578\\-97.56557\\87\\116.2109\\-99.19478\\87\\118.1641\\-100.6399\\87\\120.1172\\-102.2182\\87\\122.4685\\-104.5547\\87\\125.9766\\-108.9413\\87\\128.5077\\-112.3672\\87\\131.8359\\-118.4159\\87\\134.0176\\-122.1328\\87\\134.8709\\-124.0859\\87\\135.8446\\-126.0391\\87\\136.6283\\-127.9922\\87\\137.2369\\-129.9453\\87\\138.2915\\-131.8984\\87\\138.9327\\-133.8516\\87\\139.9524\\-135.8047\\87\\141.2495\\-139.7109\\87\\142.0866\\-141.6641\\87\\142.8931\\-145.5703\\87\\144.1033\\-149.4766\\87\\144.7672\\-153.3828\\87\\145.2026\\-155.3359\\87\\145.7784\\-157.2891\\87\\146.1283\\-159.2422\\87\\146.9105\\-165.1016\\87\\147.528\\-169.0078\\87\\147.9179\\-172.9141\\87\\148.0504\\-174.8672\\87\\148.2179\\-180.7266\\87\\148.2108\\-188.5391\\87\\148.0336\\-194.3984\\87\\147.9274\\-196.3516\\87\\147.5423\\-200.2578\\87\\146.9757\\-204.1641\\87\\146.2736\\-210.0234\\87\\145.9815\\-211.9766\\87\\144.8938\\-215.8828\\87\\144.1101\\-219.7891\\87\\143.3253\\-221.7422\\87\\142.2167\\-225.6484\\87\\141.1197\\-227.6016\\87\\140.2074\\-229.5547\\87\\138.8318\\-231.5078\\87\\136.4859\\-235.4141\\87\\133.7891\\-238.966\\87\\131.8359\\-241.2646\\87\\129.8828\\-243.32\\87\\127.9561\\-245.1797\\87\\124.0234\\-248.4834\\87\\122.0703\\-249.972\\87\\120.1172\\-251.3513\\87\\118.1641\\-252.5514\\87\\114.2578\\-255.3402\\87\\112.3047\\-256.2584\\87\\110.3516\\-257.5169\\87\\108.3984\\-258.5236\\87\\107.9839\\-258.8516\\87\\104.8664\\-260.8047\\87\\104.4922\\-261.1035\\87\\102.5391\\-262.0612\\87\\100.5859\\-263.328\\87\\98.63281\\-264.1959\\87\\97.97894\\-264.7109\\87\\94.72656\\-266.9249\\87\\92.77344\\-268.01\\87\\90.82031\\-269.3257\\87\\88.86719\\-270.3224\\87\\86.91406\\-271.5848\\87\\84.96094\\-273.0878\\87\\79.10156\\-276.7623\\87\\77.14844\\-277.8072\\87\\76.45313\\-278.3828\\87\\73.24219\\-280.5457\\87\\71.28906\\-281.5191\\87\\69.33594\\-282.7466\\87\\67.38281\\-283.5532\\87\\65.42969\\-284.8436\\87\\63.47656\\-285.8141\\87\\61.52344\\-286.9967\\87\\59.57031\\-287.8684\\87\\57.61719\\-288.9135\\87\\55.66406\\-289.4565\\87\\53.71094\\-290.6252\\87\\51.75781\\-291.3022\\87\\49.80469\\-292.4115\\87\\47.85156\\-293.0866\\87\\43.94531\\-294.669\\87\\40.03906\\-295.5608\\87\\38.08594\\-296.4201\\87\\34.17969\\-297.25\\87\\30.27344\\-298.5668\\87\\26.36719\\-299.3067\\87\\22.46094\\-300.2979\\87\\18.55469\\-300.721\\87\\10.74219\\-301.299\\87\\6.835938\\-301.5302\\87\\0.9765625\\-301.735\\87\\-2.929688\\-301.6906\\87\\-6.835938\\-301.5064\\87\\-10.74219\\-301.2669\\87\\-16.60156\\-300.7986\\87\\-20.50781\\-300.4359\\87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "275" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "170" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.9765625\\-301.8441\\89\\-4.882813\\-301.705\\89\\-10.74219\\-301.3254\\89\\-14.64844\\-301.0186\\89\\-20.50781\\-300.4897\\89\\-22.46094\\-300.224\\89\\-26.36719\\-299.2667\\89\\-30.27344\\-298.5804\\89\\-32.22656\\-298.0226\\89\\-34.17969\\-297.3189\\89\\-38.08594\\-296.5577\\89\\-40.03906\\-295.7746\\89\\-41.99219\\-295.2149\\89\\-43.94531\\-294.8138\\89\\-45.89844\\-294.2537\\89\\-47.85156\\-293.3475\\89\\-49.80469\\-292.7552\\89\\-51.75781\\-291.7902\\89\\-55.66406\\-290.3525\\89\\-57.61719\\-289.3647\\89\\-59.57031\\-288.8716\\89\\-61.52344\\-287.9258\\89\\-63.47656\\-287.1167\\89\\-67.38281\\-285.2137\\89\\-71.28906\\-283.3644\\89\\-73.24219\\-282.7086\\89\\-75.19531\\-281.6318\\89\\-77.14844\\-280.981\\89\\-79.10156\\-279.8886\\89\\-81.05469\\-279.0743\\89\\-83.00781\\-277.9107\\89\\-84.96094\\-277.1577\\89\\-86.91406\\-276.1331\\89\\-90.82031\\-274.6763\\89\\-92.77344\\-273.6152\\89\\-94.72656\\-272.7709\\89\\-96.67969\\-271.6352\\89\\-98.63281\\-270.7379\\89\\-100.5859\\-269.7003\\89\\-102.5391\\-268.9834\\89\\-103.0525\\-268.6172\\89\\-106.4347\\-266.6641\\89\\-109.5133\\-264.7109\\89\\-110.3516\\-264.0576\\89\\-112.3047\\-263.0096\\89\\-114.2578\\-261.7182\\89\\-118.1641\\-258.6406\\89\\-120.1172\\-257.231\\89\\-122.0703\\-255.608\\89\\-124.0234\\-253.7194\\89\\-124.6564\\-252.9922\\89\\-126.6972\\-251.0391\\89\\-128.6303\\-249.0859\\89\\-130.3779\\-247.1328\\89\\-131.8359\\-245.2413\\89\\-133.7891\\-242.8411\\89\\-136.3866\\-239.3203\\89\\-137.4283\\-237.3672\\89\\-139.9227\\-233.4609\\89\\-140.849\\-231.5078\\89\\-141.9599\\-229.5547\\89\\-143.3218\\-225.6484\\89\\-144.2423\\-223.6953\\89\\-144.7939\\-221.7422\\89\\-145.6835\\-219.7891\\89\\-146.3092\\-217.8359\\89\\-146.8042\\-215.8828\\89\\-148.0076\\-211.9766\\89\\-148.3271\\-210.0234\\89\\-149.0532\\-204.1641\\89\\-149.6302\\-200.2578\\89\\-149.9602\\-196.3516\\89\\-150.0916\\-192.4453\\89\\-150.0873\\-188.5391\\89\\-149.9821\\-184.6328\\89\\-149.7348\\-180.7266\\89\\-149.0221\\-174.8672\\89\\-148.4726\\-169.0078\\89\\-148.0008\\-165.1016\\89\\-147.5974\\-163.1484\\89\\-147.0588\\-161.1953\\89\\-146.2634\\-157.2891\\89\\-145.7784\\-155.3359\\89\\-145.0195\\-153.3828\\89\\-144.1239\\-149.4766\\89\\-143.3519\\-147.5234\\89\\-142.7844\\-145.5703\\89\\-142.3816\\-143.6172\\89\\-141.7558\\-141.6641\\89\\-140.8734\\-139.7109\\89\\-140.2794\\-137.7578\\89\\-139.2263\\-135.8047\\89\\-138.5065\\-133.8516\\89\\-137.5492\\-131.8984\\89\\-136.7772\\-129.9453\\89\\-136.1677\\-127.9922\\89\\-135.1061\\-126.0391\\89\\-134.3515\\-124.0859\\89\\-133.1648\\-122.1328\\89\\-132.2253\\-120.1797\\89\\-130.9606\\-118.2266\\89\\-130.0456\\-116.2734\\89\\-128.875\\-114.3203\\89\\-126.2139\\-110.4141\\89\\-124.0234\\-107.7067\\89\\-122.9626\\-106.5078\\89\\-121.008\\-104.5547\\89\\-118.1641\\-102.0074\\89\\-116.2109\\-100.6234\\89\\-114.2578\\-99.3624\\89\\-113.3807\\-98.69531\\89\\-110.3516\\-96.68569\\89\\-108.3984\\-95.62347\\89\\-106.4453\\-94.44135\\89\\-104.4922\\-93.68104\\89\\-102.5391\\-92.6365\\89\\-100.5859\\-91.79671\\89\\-98.63281\\-90.66344\\89\\-96.67969\\-89.82629\\89\\-94.72656\\-88.80762\\89\\-92.77344\\-88.04021\\89\\-90.82031\\-87.57186\\89\\-88.86719\\-86.73785\\89\\-86.91406\\-86.17601\\89\\-84.96094\\-85.79198\\89\\-83.00781\\-85.30144\\89\\-81.05469\\-84.66431\\89\\-79.10156\\-84.22289\\89\\-73.24219\\-83.31445\\89\\-71.28906\\-82.90144\\89\\-69.33594\\-82.61502\\89\\-65.42969\\-82.30737\\89\\-59.57031\\-82.0331\\89\\-53.71094\\-81.93725\\89\\-49.80469\\-81.96774\\89\\-43.94531\\-82.23591\\89\\-40.03906\\-82.48566\\89\\-34.17969\\-83.00165\\89\\-32.22656\\-83.07813\\89\\-30.27344\\-83.0476\\89\\-22.46094\\-82.68375\\89\\-18.55469\\-82.6623\\89\\-16.60156\\-82.71456\\89\\-8.789063\\-82.7401\\89\\-4.882813\\-82.91256\\89\\-0.9765625\\-83.33405\\89\\0.9765625\\-83.4073\\89\\2.929688\\-83.27007\\89\\6.835938\\-82.67826\\89\\8.789063\\-82.45667\\89\\12.69531\\-82.13647\\89\\18.55469\\-81.83376\\89\\26.36719\\-81.61225\\89\\28.32031\\-81.69662\\89\\34.17969\\-81.79953\\89\\40.03906\\-81.79518\\89\\51.75781\\-81.88493\\89\\55.66406\\-81.93798\\89\\65.42969\\-82.28062\\89\\67.38281\\-82.40897\\89\\71.28906\\-82.80657\\89\\75.19531\\-83.58659\\89\\79.10156\\-84.13515\\89\\81.05469\\-84.49807\\89\\84.96094\\-85.64053\\89\\88.86719\\-86.45119\\89\\90.82031\\-87.13932\\89\\92.77344\\-87.7292\\89\\94.72656\\-88.11282\\89\\96.67969\\-88.70034\\89\\98.63281\\-89.62638\\89\\100.5859\\-90.25259\\89\\102.5391\\-91.39982\\89\\104.4922\\-92.20647\\89\\106.4453\\-93.39111\\89\\108.3984\\-94.16222\\89\\110.3516\\-95.40113\\89\\112.3047\\-96.52764\\89\\115.2182\\-98.69531\\89\\120.1172\\-102.7683\\89\\121.875\\-104.5547\\89\\124.0234\\-107.0003\\89\\125.9766\\-109.3688\\89\\128.1626\\-112.3672\\89\\129.243\\-114.3203\\89\\130.5106\\-116.2734\\89\\131.3712\\-118.2266\\89\\132.6319\\-120.1797\\89\\134.6866\\-124.0859\\89\\135.5128\\-126.0391\\89\\136.4588\\-127.9922\\89\\137.0099\\-129.9453\\89\\138.0251\\-131.8984\\89\\138.6976\\-133.8516\\89\\140.3835\\-137.7578\\89\\140.9486\\-139.7109\\89\\141.7569\\-141.6641\\89\\142.343\\-143.6172\\89\\143.0697\\-147.5234\\89\\143.7515\\-149.4766\\89\\144.2303\\-151.4297\\89\\144.8474\\-155.3359\\89\\145.2516\\-157.2891\\89\\145.7896\\-159.2422\\89\\146.1317\\-161.1953\\89\\147.528\\-172.9141\\89\\147.832\\-176.8203\\89\\147.9492\\-180.7266\\89\\147.9616\\-184.6328\\89\\147.9179\\-188.5391\\89\\147.6632\\-194.3984\\89\\146.2061\\-208.0703\\89\\145.9358\\-210.0234\\89\\144.9421\\-213.9297\\89\\144.2603\\-217.8359\\89\\143.6546\\-219.7891\\89\\142.9396\\-221.7422\\89\\142.4988\\-223.6953\\89\\141.8275\\-225.6484\\89\\139.6866\\-229.5547\\89\\138.4938\\-231.5078\\89\\137.1173\\-233.4609\\89\\136.0899\\-235.4141\\89\\134.6214\\-237.3672\\89\\131.8359\\-240.5906\\89\\129.8828\\-242.7031\\89\\127.2714\\-245.1797\\89\\124.0234\\-248.0378\\89\\122.0703\\-249.592\\89\\120.1172\\-250.682\\89\\118.1641\\-252.0811\\89\\116.2109\\-253.5858\\89\\114.2578\\-254.7048\\89\\112.3047\\-255.9409\\89\\110.3516\\-257.0739\\89\\108.3984\\-258.0913\\89\\106.4453\\-259.4687\\89\\100.9663\\-262.7578\\89\\98.63281\\-263.9785\\89\\96.67969\\-265.4076\\89\\92.77344\\-267.8954\\89\\90.82031\\-269.235\\89\\88.86719\\-270.2424\\89\\86.91406\\-271.5631\\89\\84.96094\\-273.0695\\89\\82.81653\\-274.4766\\89\\77.14844\\-277.9116\\89\\76.5822\\-278.3828\\89\\73.24219\\-280.6592\\89\\71.28906\\-281.6145\\89\\69.33594\\-282.8462\\89\\67.38281\\-283.66\\89\\65.42969\\-284.9561\\89\\63.47656\\-285.9727\\89\\61.52344\\-287.1078\\89\\57.61719\\-289.0037\\89\\55.66406\\-289.6133\\89\\53.71094\\-290.7654\\89\\51.75781\\-291.44\\89\\49.80469\\-292.5684\\89\\47.85156\\-293.2088\\89\\45.89844\\-294.0765\\89\\43.94531\\-294.7713\\89\\41.99219\\-295.1785\\89\\40.03906\\-295.7078\\89\\38.08594\\-296.5372\\89\\34.17969\\-297.3603\\89\\32.22656\\-298.1378\\89\\30.27344\\-298.6626\\89\\26.36719\\-299.4094\\89\\24.41406\\-299.9619\\89\\22.46094\\-300.3759\\89\\18.55469\\-300.7656\\89\\10.74219\\-301.3619\\89\\2.929688\\-301.8123\\89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "262" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "171" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.882813\\-301.8123\\91\\-12.69531\\-301.2539\\91\\-20.50781\\-300.5575\\91\\-22.46094\\-300.3165\\91\\-24.41406\\-299.9194\\91\\-26.36719\\-299.391\\91\\-30.27344\\-298.6626\\91\\-32.22656\\-298.1959\\91\\-34.17969\\-297.4411\\91\\-38.08594\\-296.6405\\91\\-41.99219\\-295.2872\\91\\-43.94531\\-294.8961\\91\\-45.89844\\-294.3732\\91\\-47.85156\\-293.444\\91\\-49.80469\\-292.839\\91\\-51.75781\\-291.9039\\91\\-53.71094\\-291.1123\\91\\-55.66406\\-290.4421\\91\\-57.61719\\-289.404\\91\\-59.57031\\-288.9114\\91\\-65.42969\\-286.2479\\91\\-67.38281\\-285.2137\\91\\-69.33594\\-284.323\\91\\-71.28906\\-283.3296\\91\\-73.24219\\-282.6122\\91\\-75.19531\\-281.5673\\91\\-77.14844\\-280.8771\\91\\-79.10156\\-279.7219\\91\\-81.05469\\-278.9108\\91\\-83.00781\\-277.7022\\91\\-84.96094\\-276.9652\\91\\-86.91406\\-275.8726\\91\\-88.86719\\-275.2663\\91\\-92.77344\\-273.3363\\91\\-94.72656\\-272.2069\\91\\-96.67969\\-271.3305\\91\\-98.63281\\-270.1588\\91\\-100.5859\\-269.4603\\91\\-104.4922\\-267.398\\91\\-106.4453\\-266.0393\\91\\-108.3984\\-264.9986\\91\\-112.3047\\-262.3744\\91\\-114.2578\\-261.2829\\91\\-116.2109\\-259.7457\\91\\-120.1172\\-256.5387\\91\\-122.0703\\-255.0999\\91\\-125.9766\\-251.2005\\91\\-128.1494\\-249.0859\\91\\-131.2849\\-245.1797\\91\\-134.6071\\-241.2734\\91\\-135.9359\\-239.3203\\91\\-136.9978\\-237.3672\\91\\-138.3057\\-235.4141\\91\\-139.2831\\-233.4609\\91\\-140.5022\\-231.5078\\91\\-142.3693\\-227.6016\\91\\-142.9274\\-225.6484\\91\\-143.8779\\-223.6953\\91\\-145.0977\\-219.7891\\91\\-145.9811\\-217.8359\\91\\-146.988\\-213.9297\\91\\-147.6391\\-211.9766\\91\\-148.0614\\-210.0234\\91\\-148.345\\-208.0703\\91\\-149.1464\\-200.2578\\91\\-149.573\\-196.3516\\91\\-149.7838\\-192.4453\\91\\-149.7583\\-188.5391\\91\\-149.6019\\-184.6328\\91\\-149.0583\\-178.7734\\91\\-148.2641\\-169.0078\\91\\-147.7254\\-165.1016\\91\\-146.7823\\-161.1953\\91\\-146.0522\\-157.2891\\91\\-144.8103\\-153.3828\\91\\-144.4105\\-151.4297\\91\\-143.9116\\-149.4766\\91\\-143.1245\\-147.5234\\91\\-142.2546\\-143.6172\\91\\-140.7162\\-139.7109\\91\\-140.1217\\-137.7578\\91\\-139.0106\\-135.8047\\91\\-138.3805\\-133.8516\\91\\-137.3005\\-131.8984\\91\\-135.9882\\-127.9922\\91\\-134.9696\\-126.0391\\91\\-134.1836\\-124.0859\\91\\-132.9695\\-122.1328\\91\\-131.9598\\-120.1797\\91\\-129.7059\\-116.2734\\91\\-128.6814\\-114.3203\\91\\-124.3136\\-108.4609\\91\\-122.6273\\-106.5078\\91\\-120.6192\\-104.5547\\91\\-118.1641\\-102.3786\\91\\-115.767\\-100.6484\\91\\-114.2578\\-99.70872\\91\\-112.3047\\-98.28448\\91\\-108.3984\\-95.86267\\91\\-104.4922\\-93.8747\\91\\-102.5391\\-93.08383\\91\\-100.5859\\-92.04539\\91\\-98.63281\\-91.19012\\91\\-96.67969\\-90.10042\\91\\-94.72656\\-89.32705\\91\\-92.77344\\-88.27644\\91\\-90.82031\\-87.82872\\91\\-88.86719\\-87.23949\\91\\-86.91406\\-86.48828\\91\\-83.00781\\-85.69672\\91\\-81.05469\\-85.2098\\91\\-79.10156\\-84.58588\\91\\-77.14844\\-84.2389\\91\\-71.28906\\-83.45962\\91\\-67.38281\\-82.84606\\91\\-63.47656\\-82.49326\\91\\-59.57031\\-82.29998\\91\\-53.71094\\-82.17973\\91\\-49.80469\\-82.23236\\91\\-43.94531\\-82.49235\\91\\-41.99219\\-82.63554\\91\\-36.13281\\-83.16797\\91\\-32.22656\\-83.28811\\91\\-22.46094\\-82.90394\\91\\-18.55469\\-82.91727\\91\\-16.60156\\-83.03156\\91\\-10.74219\\-83.06244\\91\\-4.882813\\-83.46495\\91\\-2.929688\\-83.66235\\91\\0.9765625\\-83.85041\\91\\4.882813\\-83.54876\\91\\8.789063\\-82.87807\\91\\12.69531\\-82.32537\\91\\16.60156\\-82.05736\\91\\22.46094\\-81.84961\\91\\26.36719\\-81.81205\\91\\30.27344\\-81.84034\\91\\34.17969\\-81.94996\\91\\40.03906\\-81.95844\\91\\55.66406\\-82.15223\\91\\63.47656\\-82.42553\\91\\67.38281\\-82.74709\\91\\73.24219\\-83.64791\\91\\77.14844\\-84.14883\\91\\79.10156\\-84.46117\\91\\83.00781\\-85.56116\\91\\86.91406\\-86.30446\\91\\88.86719\\-86.83383\\91\\90.82031\\-87.52795\\91\\94.72656\\-88.3763\\91\\96.67969\\-89.21568\\91\\100.5859\\-90.66811\\91\\102.5391\\-91.76286\\91\\104.4922\\-92.58326\\91\\106.4453\\-93.68966\\91\\108.3984\\-94.5241\\91\\111.8503\\-96.74219\\91\\114.2578\\-98.40234\\91\\118.1641\\-101.5021\\91\\120.1172\\-103.2363\\91\\121.445\\-104.5547\\91\\124.0234\\-107.3933\\91\\126.421\\-110.4141\\91\\127.9297\\-112.6591\\91\\130.2464\\-116.2734\\91\\131.1051\\-118.2266\\91\\132.4086\\-120.1797\\91\\133.3307\\-122.1328\\91\\134.4883\\-124.0859\\91\\135.2209\\-126.0391\\91\\136.2508\\-127.9922\\91\\136.8343\\-129.9453\\91\\138.4797\\-133.8516\\91\\139.1304\\-135.8047\\91\\140.1034\\-137.7578\\91\\141.3196\\-141.6641\\91\\142.0963\\-143.6172\\91\\142.8162\\-147.5234\\91\\143.2482\\-149.4766\\91\\143.9006\\-151.4297\\91\\144.3021\\-153.3828\\91\\144.8702\\-157.2891\\91\\145.2516\\-159.2422\\91\\145.7784\\-161.1953\\91\\146.3225\\-165.1016\\91\\146.8727\\-170.9609\\91\\147.35\\-176.8203\\91\\147.5285\\-180.7266\\91\\147.5429\\-184.6328\\91\\147.4532\\-188.5391\\91\\147.1136\\-194.3984\\91\\146.5046\\-202.2109\\91\\146.1168\\-206.1172\\91\\145.8543\\-208.0703\\91\\144.9746\\-211.9766\\91\\144.3478\\-215.8828\\91\\143.9006\\-217.8359\\91\\143.1381\\-219.7891\\91\\142.2119\\-223.6953\\91\\140.4153\\-227.6016\\91\\139.0931\\-229.5547\\91\\138.0951\\-231.5078\\91\\136.7679\\-233.4609\\91\\135.7422\\-235.1776\\91\\134.1812\\-237.3672\\91\\132.4764\\-239.3203\\91\\129.8828\\-242.1777\\91\\126.7108\\-245.1797\\91\\124.0234\\-247.5596\\91\\121.9991\\-249.0859\\91\\120.1172\\-250.2367\\91\\118.1641\\-251.6838\\91\\116.2109\\-253.0156\\91\\114.2578\\-254.2345\\91\\112.3047\\-255.603\\91\\110.3516\\-256.5481\\91\\106.4453\\-259.0583\\91\\104.4922\\-260.1896\\91\\102.5391\\-261.5747\\91\\98.63281\\-263.8326\\91\\96.67969\\-265.2305\\91\\91.55054\\-268.6172\\91\\90.82031\\-269.184\\91\\88.86719\\-270.2159\\91\\86.91406\\-271.5631\\91\\84.96094\\-273.0952\\91\\82.89591\\-274.4766\\91\\81.05469\\-275.5813\\91\\79.10156\\-276.9009\\91\\77.14844\\-278.031\\91\\76.73592\\-278.3828\\91\\73.7894\\-280.3359\\91\\73.24219\\-280.7648\\91\\71.28906\\-281.7205\\91\\69.33594\\-282.938\\91\\67.38281\\-283.7838\\91\\65.42969\\-285.0643\\91\\63.46628\\-286.1953\\91\\59.57031\\-288.2638\\91\\57.61719\\-289.0952\\91\\55.66406\\-289.8093\\91\\53.71094\\-290.8879\\91\\51.75781\\-291.6102\\91\\49.80469\\-292.7005\\91\\47.85156\\-293.3364\\91\\45.89844\\-294.2659\\91\\43.94531\\-294.8608\\91\\41.99219\\-295.2625\\91\\38.08594\\-296.6479\\91\\36.13281\\-297.0202\\91\\34.17969\\-297.5093\\91\\32.22656\\-298.301\\91\\30.27344\\-298.763\\91\\28.32031\\-299.0932\\91\\24.41406\\-300.0789\\91\\22.46094\\-300.4359\\91\\18.55469\\-300.8157\\91\\14.64844\\-301.1423\\91\\8.789063\\-301.5423\\91\\6.835938\\-301.7203\\91\\2.929688\\-301.9203\\91\\0.9765625\\-301.9641\\91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "269" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "172" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-301.7965\\93\\-12.69531\\-301.3254\\93\\-18.55469\\-300.8154\\93\\-22.46094\\-300.4161\\93\\-24.41406\\-300.091\\93\\-26.36719\\-299.5352\\93\\-28.32031\\-299.0932\\93\\-32.22656\\-298.3394\\93\\-34.17969\\-297.5775\\93\\-36.13281\\-297.0985\\93\\-38.08594\\-296.7193\\93\\-40.03906\\-296.1459\\93\\-41.99219\\-295.3576\\93\\-45.89844\\-294.4961\\93\\-47.85156\\-293.569\\93\\-49.80469\\-292.9266\\93\\-53.71094\\-291.1817\\93\\-55.66406\\-290.5416\\93\\-57.61719\\-289.4693\\93\\-59.57031\\-288.9572\\93\\-65.42969\\-286.3046\\93\\-67.38281\\-285.2239\\93\\-71.28906\\-283.3124\\93\\-73.24219\\-282.5351\\93\\-75.19531\\-281.5162\\93\\-77.14844\\-280.7822\\93\\-79.10156\\-279.5869\\93\\-81.05469\\-278.7316\\93\\-83.00781\\-277.5482\\93\\-84.96094\\-276.7575\\93\\-86.91406\\-275.6973\\93\\-88.86719\\-275.0625\\93\\-90.82031\\-273.923\\93\\-92.77344\\-273.0599\\93\\-94.72656\\-271.8291\\93\\-96.67969\\-270.9924\\93\\-98.63281\\-269.8301\\93\\-100.5859\\-269.1456\\93\\-102.5391\\-267.926\\93\\-104.4922\\-266.9542\\93\\-108.3984\\-264.3539\\93\\-110.3516\\-263.2973\\93\\-114.0704\\-260.8047\\93\\-116.2109\\-259.2681\\93\\-121.518\\-254.9453\\93\\-125.9766\\-250.4862\\93\\-127.9297\\-248.6175\\93\\-132.5503\\-243.2266\\93\\-134.1673\\-241.2734\\93\\-135.353\\-239.3203\\93\\-136.6549\\-237.3672\\93\\-137.8581\\-235.4141\\93\\-138.8264\\-233.4609\\93\\-140.1144\\-231.5078\\93\\-140.9565\\-229.5547\\93\\-142.0181\\-227.6016\\93\\-143.32\\-223.6953\\93\\-144.1883\\-221.7422\\93\\-144.7188\\-219.7891\\93\\-146.168\\-215.8828\\93\\-147.1029\\-211.9766\\93\\-147.6787\\-210.0234\\93\\-148.0698\\-208.0703\\93\\-148.4904\\-204.1641\\93\\-148.8077\\-200.2578\\93\\-149.2128\\-194.3984\\93\\-149.2833\\-192.4453\\93\\-149.2551\\-188.5391\\93\\-149.1075\\-184.6328\\93\\-148.6292\\-176.8203\\93\\-148.2224\\-170.9609\\93\\-147.7619\\-167.0547\\93\\-146.882\\-163.1484\\93\\-146.2195\\-159.2422\\93\\-145.7784\\-157.2891\\93\\-145.0576\\-155.3359\\93\\-144.2562\\-151.4297\\93\\-142.9396\\-147.5234\\93\\-142.0866\\-143.6172\\93\\-141.2254\\-141.6641\\93\\-139.8976\\-137.7578\\93\\-138.8683\\-135.8047\\93\\-138.2379\\-133.8516\\93\\-137.1838\\-131.8984\\93\\-136.6096\\-129.9453\\93\\-135.8603\\-127.9922\\93\\-134.844\\-126.0391\\93\\-133.9686\\-124.0859\\93\\-131.8359\\-120.4487\\93\\-130.6603\\-118.2266\\93\\-129.3979\\-116.2734\\93\\-128.4419\\-114.3203\\93\\-127.9297\\-113.72\\93\\-124.0234\\-108.5743\\93\\-122.2591\\-106.5078\\93\\-120.1172\\-104.5025\\93\\-117.8757\\-102.6016\\93\\-115.2625\\-100.6484\\93\\-110.3516\\-97.48103\\93\\-108.3984\\-96.1144\\93\\-106.4453\\-95.2254\\93\\-104.4922\\-94.07591\\93\\-102.5391\\-93.41925\\93\\-100.5859\\-92.31319\\93\\-98.63281\\-91.55889\\93\\-96.67969\\-90.4199\\93\\-94.72656\\-89.67955\\93\\-92.77344\\-88.67987\\93\\-90.82031\\-88.04021\\93\\-88.86719\\-87.61683\\93\\-86.91406\\-86.92143\\93\\-84.96094\\-86.3882\\93\\-81.05469\\-85.63534\\93\\-77.14844\\-84.62906\\93\\-73.24219\\-84.06297\\93\\-61.52344\\-82.78226\\93\\-57.61719\\-82.54297\\93\\-53.71094\\-82.46886\\93\\-49.80469\\-82.54447\\93\\-47.85156\\-82.69207\\93\\-41.99219\\-83.03217\\93\\-40.03906\\-83.21088\\93\\-36.13281\\-83.43079\\93\\-32.22656\\-83.43895\\93\\-26.36719\\-83.22222\\93\\-22.46094\\-83.12414\\93\\-20.50781\\-83.12457\\93\\-16.60156\\-83.31799\\93\\-10.74219\\-83.40262\\93\\-6.835938\\-83.64151\\93\\-0.9765625\\-84.15977\\93\\0.9765625\\-84.25893\\93\\4.882813\\-83.94806\\93\\8.789063\\-83.47323\\93\\12.69531\\-82.61907\\93\\14.64844\\-82.37189\\93\\18.55469\\-82.09978\\93\\22.46094\\-81.96716\\93\\28.32031\\-81.91893\\93\\34.17969\\-82.06468\\93\\45.89844\\-82.20553\\93\\49.80469\\-82.29745\\93\\55.66406\\-82.37276\\93\\61.52344\\-82.63554\\93\\65.42969\\-82.98639\\93\\69.33594\\-83.52055\\93\\75.19531\\-84.17636\\93\\77.14844\\-84.47633\\93\\79.10156\\-84.90046\\93\\81.05469\\-85.50529\\93\\84.96094\\-86.19643\\93\\86.91406\\-86.61713\\93\\88.86719\\-87.32841\\93\\92.77344\\-88.18949\\93\\94.72656\\-88.80099\\93\\96.67969\\-89.61447\\93\\98.63281\\-90.23759\\93\\100.5859\\-91.24573\\93\\102.5391\\-92.0513\\93\\104.4922\\-93.11604\\93\\106.4453\\-93.93144\\93\\108.3984\\-95.0798\\93\\110.3516\\-96.11954\\93\\116.2109\\-100.313\\93\\118.1641\\-101.8932\\93\\120.9733\\-104.5547\\93\\122.833\\-106.5078\\93\\124.4685\\-108.4609\\93\\125.9766\\-110.4589\\93\\128.7381\\-114.3203\\93\\129.891\\-116.2734\\93\\130.8891\\-118.2266\\93\\132.0904\\-120.1797\\93\\133.0537\\-122.1328\\93\\134.2431\\-124.0859\\93\\134.9745\\-126.0391\\93\\135.9751\\-127.9922\\93\\136.6776\\-129.9453\\93\\137.2338\\-131.8984\\93\\138.2212\\-133.8516\\93\\138.8346\\-135.8047\\93\\140.435\\-139.7109\\93\\140.9409\\-141.6641\\93\\141.6855\\-143.6172\\93\\142.2422\\-145.5703\\93\\142.9099\\-149.4766\\93\\143.3806\\-151.4297\\93\\143.998\\-153.3828\\93\\144.3498\\-155.3359\\93\\144.8587\\-159.2422\\93\\145.2142\\-161.1953\\93\\145.6948\\-163.1484\\93\\146.0191\\-165.1016\\93\\146.5505\\-170.9609\\93\\146.7969\\-174.8672\\93\\146.9974\\-180.7266\\93\\146.9818\\-186.5859\\93\\146.7896\\-192.4453\\93\\146.4693\\-198.3047\\93\\146.2061\\-202.2109\\93\\146.0161\\-204.1641\\93\\145.7072\\-206.1172\\93\\144.9289\\-210.0234\\93\\144.394\\-213.9297\\93\\144.0206\\-215.8828\\93\\143.3253\\-217.8359\\93\\142.8284\\-219.7891\\93\\142.4395\\-221.7422\\93\\141.8013\\-223.6953\\93\\140.842\\-225.6484\\93\\140.0018\\-227.6016\\93\\138.6999\\-229.5547\\93\\137.5\\-231.5078\\93\\136.4682\\-233.4609\\93\\135.0754\\-235.4141\\93\\133.7891\\-237.0795\\93\\130.2545\\-241.2734\\93\\127.9297\\-243.642\\93\\123.7382\\-247.1328\\93\\121.2908\\-249.0859\\93\\120.1172\\-249.9381\\93\\116.2109\\-252.3958\\93\\114.2578\\-253.8635\\93\\112.3047\\-255.1513\\93\\110.3516\\-256.1913\\93\\108.3984\\-257.4893\\93\\106.4453\\-258.545\\93\\104.4922\\-259.8991\\93\\102.5391\\-261.3581\\93\\100.5859\\-262.363\\93\\91.47418\\-268.6172\\93\\90.82031\\-269.1505\\93\\88.86719\\-270.2014\\93\\86.91406\\-271.5905\\93\\84.96094\\-273.1385\\93\\83.00781\\-274.4847\\93\\81.05469\\-275.6179\\93\\79.10156\\-276.9944\\93\\76.89558\\-278.3828\\93\\73.24219\\-280.8749\\93\\71.28906\\-281.8324\\93\\69.33594\\-283.0351\\93\\67.38281\\-283.9357\\93\\66.99036\\-284.2422\\93\\63.47656\\-286.4191\\93\\61.52344\\-287.3479\\93\\59.57031\\-288.455\\93\\57.61719\\-289.1779\\93\\53.71094\\-290.9988\\93\\51.75781\\-291.8123\\93\\49.80469\\-292.8227\\93\\47.85156\\-293.4692\\93\\45.89844\\-294.431\\93\\43.94531\\-294.9432\\93\\41.99219\\-295.3537\\93\\40.03906\\-296.1459\\93\\38.08594\\-296.7476\\93\\36.13281\\-297.1189\\93\\34.17969\\-297.6822\\93\\32.22656\\-298.4442\\93\\28.32031\\-299.1999\\93\\24.41406\\-300.216\\93\\22.46094\\-300.4974\\93\\18.55469\\-300.884\\93\\14.64844\\-301.2179\\93\\8.789063\\-301.6489\\93\\6.835938\\-301.8441\\93\\0.9765625\\-302.0462\\93\\-2.929688\\-301.9918\\93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "257" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "173" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-301.9203\\95\\-18.55469\\-300.8954\\95\\-22.46094\\-300.5014\\95\\-24.41406\\-300.2263\\95\\-28.32031\\-299.2106\\95\\-32.22656\\-298.4682\\95\\-34.17969\\-297.7746\\95\\-36.13281\\-297.1897\\95\\-38.08594\\-296.7988\\95\\-40.03906\\-296.2979\\95\\-41.99219\\-295.4405\\95\\-45.89844\\-294.5913\\95\\-47.85156\\-293.7298\\95\\-51.75781\\-292.2904\\95\\-53.71094\\-291.2663\\95\\-55.66406\\-290.646\\95\\-57.61719\\-289.5555\\95\\-59.57031\\-288.9932\\95\\-61.52344\\-288.1563\\95\\-65.42969\\-286.3593\\95\\-67.38281\\-285.2392\\95\\-71.28906\\-283.3007\\95\\-73.24219\\-282.4798\\95\\-75.19531\\-281.4614\\95\\-77.14844\\-280.6818\\95\\-79.10156\\-279.4733\\95\\-81.05469\\-278.5049\\95\\-83.00781\\-277.4174\\95\\-86.91406\\-275.5623\\95\\-88.86719\\-274.8273\\95\\-90.82031\\-273.6646\\95\\-96.67969\\-270.4971\\95\\-100.5859\\-268.6572\\95\\-102.5391\\-267.5696\\95\\-104.4922\\-266.3133\\95\\-106.4453\\-265.2202\\95\\-108.3984\\-263.8909\\95\\-110.3516\\-262.7831\\95\\-112.3047\\-261.5642\\95\\-118.1641\\-257.1676\\95\\-120.1172\\-255.6645\\95\\-122.0703\\-253.9283\\95\\-124.0234\\-251.9275\\95\\-126.9601\\-249.0859\\95\\-128.8132\\-247.1328\\95\\-132.0237\\-243.2266\\95\\-133.7891\\-240.9419\\95\\-136.2755\\-237.3672\\95\\-137.2353\\-235.4141\\95\\-137.6953\\-234.7917\\95\\-140.5798\\-229.5547\\95\\-142.3618\\-225.6484\\95\\-142.9015\\-223.6953\\95\\-143.766\\-221.7422\\95\\-144.4221\\-219.7891\\95\\-144.9351\\-217.8359\\95\\-145.7435\\-215.8828\\95\\-146.288\\-213.9297\\95\\-147.1005\\-210.0234\\95\\-147.6534\\-208.0703\\95\\-148.0042\\-206.1172\\95\\-148.227\\-204.1641\\95\\-148.5387\\-200.2578\\95\\-148.7442\\-196.3516\\95\\-148.8832\\-192.4453\\95\\-148.8607\\-188.5391\\95\\-148.7609\\-184.6328\\95\\-148.3852\\-176.8203\\95\\-147.9523\\-170.9609\\95\\-147.6772\\-169.0078\\95\\-146.9124\\-165.1016\\95\\-146.3369\\-161.1953\\95\\-145.9726\\-159.2422\\95\\-144.8248\\-155.3359\\95\\-144.0677\\-151.4297\\95\\-143.3271\\-149.4766\\95\\-142.7965\\-147.5234\\95\\-142.4274\\-145.5703\\95\\-141.8615\\-143.6172\\95\\-141.024\\-141.6641\\95\\-140.4412\\-139.7109\\95\\-138.749\\-135.8047\\95\\-138.092\\-133.8516\\95\\-137.0939\\-131.8984\\95\\-136.5247\\-129.9453\\95\\-135.7422\\-128.1762\\95\\-133.7891\\-124.2603\\95\\-132.6138\\-122.1328\\95\\-131.358\\-120.1797\\95\\-130.4701\\-118.2266\\95\\-129.1743\\-116.2734\\95\\-128.1357\\-114.3203\\95\\-126.6589\\-112.3672\\95\\-125.0529\\-110.4141\\95\\-124.0234\\-109.0133\\95\\-121.7924\\-106.5078\\95\\-118.1641\\-103.237\\95\\-116.2109\\-101.6649\\95\\-114.2578\\-100.2679\\95\\-112.3047\\-99.21476\\95\\-108.3984\\-96.44009\\95\\-106.4453\\-95.50438\\95\\-104.4922\\-94.34645\\95\\-102.5391\\-93.65991\\95\\-100.5859\\-92.68625\\95\\-98.63281\\-91.83803\\95\\-94.72656\\-89.94509\\95\\-92.77344\\-89.2275\\95\\-90.82031\\-88.30334\\95\\-86.91406\\-87.39713\\95\\-84.96094\\-86.73785\\95\\-83.00781\\-86.28409\\95\\-79.10156\\-85.62769\\95\\-75.19531\\-84.70863\\95\\-73.24219\\-84.41237\\95\\-69.33594\\-83.9872\\95\\-63.47656\\-83.53625\\95\\-57.61719\\-83.03125\\95\\-53.71094\\-82.92648\\95\\-49.80469\\-83.0461\\95\\-45.89844\\-83.34042\\95\\-36.13281\\-83.61218\\95\\-32.22656\\-83.59155\\95\\-26.36719\\-83.37338\\95\\-22.46094\\-83.3005\\95\\-20.50781\\-83.31621\\95\\-16.60156\\-83.51072\\95\\-10.74219\\-83.66344\\95\\-6.835938\\-83.9114\\95\\-0.9765625\\-84.56646\\95\\0.9765625\\-84.69791\\95\\4.882813\\-84.36247\\95\\8.789063\\-83.87627\\95\\10.74219\\-83.56519\\95\\14.64844\\-82.6674\\95\\18.55469\\-82.24116\\95\\22.46094\\-82.0878\\95\\26.36719\\-82.02825\\95\\30.27344\\-82.0761\\95\\40.03906\\-82.31866\\95\\45.89844\\-82.39661\\95\\49.80469\\-82.5313\\95\\55.66406\\-82.6702\\95\\59.57031\\-82.94261\\95\\71.28906\\-84.04145\\95\\75.19531\\-84.51419\\95\\79.10156\\-85.42868\\95\\81.05469\\-85.82601\\95\\84.96094\\-86.50755\\95\\88.86719\\-87.66776\\95\\90.82031\\-88.01943\\95\\92.77344\\-88.47845\\95\\94.72656\\-89.30836\\95\\98.63281\\-90.65097\\95\\100.5859\\-91.63358\\95\\102.5391\\-92.38187\\95\\104.4922\\-93.4979\\95\\106.4453\\-94.22618\\95\\108.3984\\-95.49035\\95\\110.3516\\-96.54995\\95\\112.3047\\-97.91779\\95\\114.2578\\-99.42095\\95\\116.0432\\-100.6484\\95\\118.1641\\-102.3574\\95\\120.5252\\-104.5547\\95\\122.3881\\-106.5078\\95\\124.0234\\-108.4702\\95\\125.431\\-110.4141\\95\\128.4455\\-114.3203\\95\\129.4653\\-116.2734\\95\\130.6728\\-118.2266\\95\\131.8359\\-120.446\\95\\133.8852\\-124.0859\\95\\136.4699\\-129.9453\\95\\136.9614\\-131.8984\\95\\137.8439\\-133.8516\\95\\138.5651\\-135.8047\\95\\139.1509\\-137.7578\\95\\140.1217\\-139.7109\\95\\141.1968\\-143.6172\\95\\141.9271\\-145.5703\\95\\142.3792\\-147.5234\\95\\142.992\\-151.4297\\95\\144.0398\\-155.3359\\95\\144.337\\-157.2891\\95\\144.8103\\-161.1953\\95\\145.1133\\-163.1484\\95\\145.8646\\-167.0547\\95\\146.2402\\-170.9609\\95\\146.5355\\-176.8203\\95\\146.6097\\-180.7266\\95\\146.5981\\-186.5859\\95\\146.454\\-192.4453\\95\\146.1712\\-198.3047\\95\\145.8333\\-202.2109\\95\\145.1367\\-206.1172\\95\\144.4092\\-211.9766\\95\\144.1067\\-213.9297\\95\\142.9396\\-217.8359\\95\\142.59\\-219.7891\\95\\142.1384\\-221.7422\\95\\141.2311\\-223.6953\\95\\140.4926\\-225.6484\\95\\139.339\\-227.6016\\95\\138.3522\\-229.5547\\95\\137.0421\\-231.5078\\95\\136.0603\\-233.4609\\95\\134.6821\\-235.4141\\95\\129.8828\\-241.0102\\95\\127.7097\\-243.2266\\95\\125.9766\\-244.6007\\95\\122.0703\\-248.0117\\95\\120.1172\\-249.5285\\95\\118.1641\\-250.5723\\95\\114.2578\\-253.4647\\95\\112.3047\\-254.5946\\95\\108.3984\\-257.1407\\95\\106.4453\\-258.1902\\95\\102.5391\\-261.1112\\95\\100.5859\\-262.1603\\95\\98.63281\\-263.5885\\95\\94.72656\\-266.2322\\95\\91.45171\\-268.6172\\95\\90.82031\\-269.1366\\95\\88.86719\\-270.2374\\95\\86.91406\\-271.6352\\95\\84.96094\\-273.2058\\95\\83.00781\\-274.5938\\95\\81.05469\\-275.6571\\95\\79.10156\\-277.0914\\95\\75.19531\\-279.6006\\95\\73.24219\\-280.9766\\95\\71.28906\\-281.9586\\95\\69.33594\\-283.1186\\95\\67.38281\\-284.1259\\95\\65.42969\\-285.2901\\95\\63.47656\\-286.6022\\95\\61.52344\\-287.4756\\95\\59.57031\\-288.6132\\95\\57.61719\\-289.2671\\95\\55.66406\\-290.3148\\95\\53.71094\\-291.1126\\95\\49.80469\\-292.9301\\95\\47.85156\\-293.6392\\95\\45.89844\\-294.5524\\95\\41.99219\\-295.4727\\95\\40.03906\\-296.3422\\95\\38.08594\\-296.8377\\95\\36.13281\\-297.2205\\95\\32.22656\\-298.5598\\95\\28.32031\\-299.3298\\95\\26.36719\\-299.9048\\95\\24.41406\\-300.3285\\95\\18.55469\\-300.9607\\95\\6.835938\\-301.95\\95\\2.929688\\-302.1003\\95\\-0.9765625\\-302.1246\\95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "265" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "174" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-301.8906\\97\\-16.60156\\-301.1714\\97\\-22.46094\\-300.5941\\97\\-24.41406\\-300.3405\\97\\-26.36719\\-299.9194\\97\\-28.32031\\-299.3404\\97\\-32.22656\\-298.5841\\97\\-34.17969\\-298.0088\\97\\-36.13281\\-297.2988\\97\\-40.03906\\-296.4299\\97\\-41.99219\\-295.5853\\97\\-45.89844\\-294.689\\97\\-49.80469\\-293.1186\\97\\-51.75781\\-292.4636\\97\\-53.71094\\-291.377\\97\\-55.66406\\-290.7473\\97\\-57.61719\\-289.6534\\97\\-59.57031\\-289.0476\\97\\-61.52344\\-288.262\\97\\-63.47656\\-287.2673\\97\\-65.42969\\-286.4377\\97\\-67.38281\\-285.265\\97\\-71.28906\\-283.3011\\97\\-73.24219\\-282.4352\\97\\-75.19531\\-281.4137\\97\\-77.14844\\-280.5695\\97\\-77.44962\\-280.3359\\97\\-81.05469\\-278.2286\\97\\-83.00781\\-277.2835\\97\\-84.96094\\-276.2101\\97\\-86.91406\\-275.4233\\97\\-88.86719\\-274.5\\97\\-90.82031\\-273.433\\97\\-92.77344\\-272.1869\\97\\-94.72656\\-271.2771\\97\\-96.67969\\-270.0581\\97\\-98.63281\\-269.3257\\97\\-100.5859\\-268.1355\\97\\-102.5391\\-267.2087\\97\\-104.4922\\-265.8395\\97\\-108.3984\\-263.5478\\97\\-110.3516\\-262.2207\\97\\-112.3047\\-261.0784\\97\\-114.2578\\-259.6269\\97\\-118.1641\\-256.4972\\97\\-120.1172\\-255.0803\\97\\-122.0703\\-253.3547\\97\\-124.0234\\-251.3594\\97\\-125.9766\\-249.5023\\97\\-128.3014\\-247.1328\\97\\-131.3365\\-243.2266\\97\\-131.8359\\-242.6902\\97\\-134.493\\-239.3203\\97\\-135.7422\\-237.3331\\97\\-136.807\\-235.4141\\97\\-137.9902\\-233.4609\\97\\-138.9146\\-231.5078\\97\\-140.1614\\-229.5547\\97\\-140.9644\\-227.6016\\97\\-141.9825\\-225.6484\\97\\-143.1683\\-221.7422\\97\\-144.0618\\-219.7891\\97\\-145.0977\\-215.8828\\97\\-145.8589\\-213.9297\\97\\-146.3155\\-211.9766\\97\\-147.0535\\-208.0703\\97\\-147.5571\\-206.1172\\97\\-147.8886\\-204.1641\\97\\-148.11\\-202.2109\\97\\-148.379\\-198.3047\\97\\-148.5641\\-192.4453\\97\\-148.5387\\-186.5859\\97\\-148.4259\\-182.6797\\97\\-148.11\\-176.8203\\97\\-147.7865\\-172.9141\\97\\-147.5285\\-170.9609\\97\\-147.1713\\-169.0078\\97\\-146.0871\\-161.1953\\97\\-145.6163\\-159.2422\\97\\-144.998\\-157.2891\\97\\-144.3088\\-153.3828\\97\\-143.8024\\-151.4297\\97\\-143.0534\\-149.4766\\97\\-142.2833\\-145.5703\\97\\-140.8457\\-141.6641\\97\\-140.2903\\-139.7109\\97\\-139.3011\\-137.7578\\97\\-137.907\\-133.8516\\97\\-136.9504\\-131.8984\\97\\-136.3954\\-129.9453\\97\\-135.3644\\-127.9922\\97\\-134.5426\\-126.0391\\97\\-133.381\\-124.0859\\97\\-132.4066\\-122.1328\\97\\-131.1275\\-120.1797\\97\\-130.2228\\-118.2266\\97\\-127.9297\\-114.5894\\97\\-126.3401\\-112.3672\\97\\-124.0234\\-109.4453\\97\\-121.3414\\-106.5078\\97\\-120.1172\\-105.4585\\97\\-118.1641\\-103.6037\\97\\-116.2109\\-101.9574\\97\\-114.2036\\-100.6484\\97\\-112.3047\\-99.55293\\97\\-110.3516\\-98.11066\\97\\-108.1414\\-96.74219\\97\\-104.4922\\-94.73209\\97\\-102.5391\\-93.86743\\97\\-100.5859\\-93.15671\\97\\-98.63281\\-92.09267\\97\\-96.67969\\-91.37109\\97\\-94.72656\\-90.25711\\97\\-92.77344\\-89.58273\\97\\-90.82031\\-88.71875\\97\\-88.86719\\-88.08997\\97\\-86.91406\\-87.7185\\97\\-84.96094\\-87.24152\\97\\-83.00781\\-86.61713\\97\\-81.05469\\-86.23279\\97\\-77.14844\\-85.65605\\97\\-73.24219\\-84.888\\97\\-69.33594\\-84.34434\\97\\-61.52344\\-83.78838\\97\\-59.57031\\-83.68294\\97\\-53.71094\\-83.47556\\97\\-49.80469\\-83.55233\\97\\-47.85156\\-83.65146\\97\\-40.03906\\-83.73849\\97\\-32.22656\\-83.71564\\97\\-24.41406\\-83.47775\\97\\-20.50781\\-83.49068\\97\\-16.60156\\-83.67625\\97\\-12.69531\\-83.79559\\97\\-8.789063\\-83.99107\\97\\-6.835938\\-84.16473\\97\\-2.929688\\-84.74161\\97\\-0.9765625\\-85.13969\\97\\0.9765625\\-85.3157\\97\\2.929688\\-85.22626\\97\\6.835938\\-84.48571\\97\\8.789063\\-84.2456\\97\\12.69531\\-83.58123\\97\\16.60156\\-82.70324\\97\\18.55469\\-82.42578\\97\\22.46094\\-82.21358\\97\\28.32031\\-82.17023\\97\\34.17969\\-82.30216\\97\\47.85156\\-82.74479\\97\\53.71094\\-83.07806\\97\\55.66406\\-83.15295\\97\\63.47656\\-83.71554\\97\\67.38281\\-83.9705\\97\\73.24219\\-84.58736\\97\\77.14844\\-85.42868\\97\\83.00781\\-86.40033\\97\\86.91406\\-87.52423\\97\\90.82031\\-88.26385\\97\\94.72656\\-89.66639\\97\\96.67969\\-90.24921\\97\\98.63281\\-91.2263\\97\\100.5859\\-91.97205\\97\\106.4453\\-94.66997\\97\\108.3984\\-95.81001\\97\\112.3047\\-98.34209\\97\\115.4494\\-100.6484\\97\\118.1641\\-102.9168\\97\\119.9268\\-104.5547\\97\\121.8669\\-106.5078\\97\\124.0234\\-109.0081\\97\\125.0179\\-110.4141\\97\\126.6255\\-112.3672\\97\\128.0329\\-114.3203\\97\\129.1488\\-116.2734\\97\\130.3914\\-118.2266\\97\\131.2447\\-120.1797\\97\\132.5077\\-122.1328\\97\\133.4078\\-124.0859\\97\\134.4977\\-126.0391\\97\\135.2077\\-127.9922\\97\\136.1861\\-129.9453\\97\\137.346\\-133.8516\\97\\138.2857\\-135.8047\\97\\138.8152\\-137.7578\\97\\140.3689\\-141.6641\\97\\140.8347\\-143.6172\\97\\142.0898\\-147.5234\\97\\142.4515\\-149.4766\\97\\143.0466\\-153.3828\\97\\144.0272\\-157.2891\\97\\144.3239\\-159.2422\\97\\144.9746\\-165.1016\\97\\145.5744\\-169.0078\\97\\146.0221\\-172.9141\\97\\146.2166\\-176.8203\\97\\146.2942\\-180.7266\\97\\146.2839\\-186.5859\\97\\146.1243\\-192.4453\\97\\145.9142\\-196.3516\\97\\145.7553\\-198.3047\\97\\145.2278\\-202.2109\\97\\144.7645\\-206.1172\\97\\144.3773\\-210.0234\\97\\144.089\\-211.9766\\97\\143.6094\\-213.9297\\97\\143.0202\\-215.8828\\97\\142.3279\\-219.7891\\97\\141.6558\\-221.7422\\97\\140.8031\\-223.6953\\97\\140.0761\\-225.6484\\97\\138.8504\\-227.6016\\97\\137.8976\\-229.5547\\97\\134.2564\\-235.4141\\97\\129.8828\\-240.4226\\97\\127.0828\\-243.2266\\97\\122.0703\\-247.5473\\97\\118.1641\\-250.2067\\97\\116.2109\\-251.6338\\97\\114.2578\\-252.875\\97\\111.2225\\-254.9453\\97\\110.3516\\-255.6075\\97\\108.3984\\-256.6875\\97\\106.4453\\-257.9328\\97\\104.4922\\-259.4401\\97\\102.5391\\-260.8283\\97\\100.5859\\-262.0379\\97\\98.63281\\-263.4853\\97\\94.72656\\-266.1824\\97\\90.82031\\-269.1743\\97\\88.86719\\-270.3319\\97\\86.91406\\-271.7115\\97\\84.96094\\-273.2864\\97\\83.00781\\-274.7375\\97\\81.05469\\-275.7268\\97\\79.10156\\-277.1948\\97\\77.14844\\-278.5203\\97\\75.19531\\-279.7364\\97\\73.24219\\-281.0941\\97\\69.33594\\-283.2139\\97\\67.38281\\-284.3806\\97\\65.42969\\-285.4288\\97\\63.47656\\-286.7694\\97\\61.52344\\-287.6221\\97\\59.57031\\-288.7716\\97\\57.61719\\-289.3875\\97\\55.66406\\-290.5227\\97\\53.71094\\-291.2315\\97\\51.75781\\-292.3138\\97\\49.80469\\-293.0569\\97\\45.89844\\-294.6811\\97\\41.99219\\-295.6588\\97\\40.03906\\-296.4987\\97\\36.13281\\-297.3434\\97\\34.17969\\-298.1378\\97\\32.22656\\-298.6742\\97\\28.32031\\-299.4828\\97\\26.36719\\-300.0681\\97\\24.41406\\-300.431\\97\\22.46094\\-300.6606\\97\\16.60156\\-301.2228\\97\\8.789063\\-301.9203\\97\\6.835938\\-302.0608\\97\\2.929688\\-302.1985\\97\\-0.9765625\\-302.2123\\97\\-6.835938\\-302.0332\\97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "258" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "175" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-300.6782\\99\\-24.41406\\-300.4359\\99\\-26.36719\\-300.0926\\99\\-28.32031\\-299.501\\99\\-32.22656\\-298.6943\\99\\-34.17969\\-298.218\\99\\-36.13281\\-297.4228\\99\\-40.03906\\-296.5623\\99\\-41.99219\\-295.7746\\99\\-43.94531\\-295.1858\\99\\-45.89844\\-294.776\\99\\-47.85156\\-294.1326\\99\\-49.80469\\-293.2471\\99\\-51.75781\\-292.6086\\99\\-53.71094\\-291.5121\\99\\-55.66406\\-290.8377\\99\\-57.61719\\-289.7714\\99\\-61.52344\\-288.3744\\99\\-63.47656\\-287.3105\\99\\-65.42969\\-286.4984\\99\\-67.38281\\-285.2967\\99\\-71.28906\\-283.3068\\99\\-73.24219\\-282.4063\\99\\-77.30359\\-280.3359\\99\\-80.59776\\-278.3828\\99\\-81.05469\\-278.0417\\99\\-83.00781\\-277.1735\\99\\-84.96094\\-276.0292\\99\\-86.91406\\-275.2904\\99\\-88.86719\\-274.1556\\99\\-90.82031\\-273.2\\99\\-92.77344\\-271.863\\99\\-94.72656\\-270.9871\\99\\-96.67969\\-269.7679\\99\\-98.63281\\-268.9834\\99\\-99.14102\\-268.6172\\99\\-102.5391\\-266.7025\\99\\-104.4922\\-265.4672\\99\\-106.4453\\-264.0966\\99\\-108.3984\\-263.1641\\99\\-112.3047\\-260.3961\\99\\-114.2578\\-259.094\\99\\-118.1641\\-256.0311\\99\\-120.1172\\-254.3751\\99\\-122.0703\\-252.5539\\99\\-125.9766\\-248.7579\\99\\-127.9297\\-246.7238\\99\\-131.8359\\-242.0659\\99\\-133.9198\\-239.3203\\99\\-135.1115\\-237.3672\\99\\-136.4304\\-235.4141\\99\\-137.2808\\-233.4609\\99\\-138.5091\\-231.5078\\99\\-140.5545\\-227.6016\\99\\-142.2674\\-223.6953\\99\\-142.7747\\-221.7422\\99\\-143.4523\\-219.7891\\99\\-144.2348\\-217.8359\\99\\-145.1868\\-213.9297\\99\\-145.8795\\-211.9766\\99\\-146.2838\\-210.0234\\99\\-146.9575\\-206.1172\\99\\-147.7034\\-202.2109\\99\\-147.9399\\-200.2578\\99\\-148.1728\\-196.3516\\99\\-148.2669\\-192.4453\\99\\-148.2573\\-186.5859\\99\\-148.025\\-180.7266\\99\\-147.7273\\-176.8203\\99\\-146.7673\\-169.0078\\99\\-146.0871\\-163.1484\\99\\-145.7072\\-161.1953\\99\\-145.1317\\-159.2422\\99\\-144.7363\\-157.2891\\99\\-144.0768\\-153.3828\\99\\-143.3957\\-151.4297\\99\\-142.8528\\-149.4766\\99\\-142.1091\\-145.5703\\99\\-141.2828\\-143.6172\\99\\-140.0885\\-139.7109\\99\\-139.0896\\-137.7578\\99\\-138.5091\\-135.8047\\99\\-137.6073\\-133.8516\\99\\-136.8037\\-131.8984\\99\\-136.2134\\-129.9453\\99\\-135.1327\\-127.9922\\99\\-134.3444\\-126.0391\\99\\-133.1199\\-124.0859\\99\\-132.1528\\-122.1328\\99\\-130.9387\\-120.1797\\99\\-128.7818\\-116.2734\\99\\-124.4287\\-110.4141\\99\\-122.8337\\-108.4609\\99\\-120.9168\\-106.5078\\99\\-118.7022\\-104.5547\\99\\-118.1641\\-103.9937\\99\\-116.2109\\-102.3438\\99\\-114.2578\\-101.1473\\99\\-110.3516\\-98.5\\99\\-108.3984\\-97.37042\\99\\-106.4453\\-96.06519\\99\\-104.4922\\-95.16412\\99\\-102.5391\\-94.08057\\99\\-100.5859\\-93.48905\\99\\-98.63281\\-92.39038\\99\\-96.67969\\-91.70027\\99\\-94.72656\\-90.66811\\99\\-92.77344\\-89.87786\\99\\-90.82031\\-89.25066\\99\\-88.86719\\-88.38037\\99\\-84.96094\\-87.60807\\99\\-81.05469\\-86.57406\\99\\-79.10156\\-86.25128\\99\\-71.28906\\-85.207\\99\\-69.33594\\-84.82115\\99\\-67.38281\\-84.59696\\99\\-61.52344\\-84.12917\\99\\-53.71094\\-83.85041\\99\\-47.85156\\-83.93295\\99\\-40.03906\\-83.90659\\99\\-32.22656\\-83.82618\\99\\-24.41406\\-83.63093\\99\\-20.50781\\-83.68364\\99\\-14.64844\\-83.88596\\99\\-8.789063\\-84.21152\\99\\-4.882813\\-84.79808\\99\\-2.929688\\-85.30348\\99\\-0.9765625\\-85.63457\\99\\0.9765625\\-85.76035\\99\\2.929688\\-85.70143\\99\\4.882813\\-85.46854\\99\\8.789063\\-84.65723\\99\\12.69531\\-83.90992\\99\\14.64844\\-83.58732\\99\\18.55469\\-82.74479\\99\\20.50781\\-82.48438\\99\\22.46094\\-82.37911\\99\\28.32031\\-82.29998\\99\\36.13281\\-82.52421\\99\\45.89844\\-83.09357\\99\\47.85156\\-83.16649\\99\\51.75781\\-83.43079\\99\\59.57031\\-83.78721\\99\\67.38281\\-84.28017\\99\\71.28906\\-84.75106\\99\\75.19531\\-85.47266\\99\\81.05469\\-86.36324\\99\\83.00781\\-86.793\\99\\84.96094\\-87.42358\\99\\88.86719\\-88.1251\\99\\90.82031\\-88.60892\\99\\92.77344\\-89.40529\\99\\94.72656\\-89.98179\\99\\96.67969\\-90.67907\\99\\98.63281\\-91.62823\\99\\100.5859\\-92.31549\\99\\102.5391\\-93.35812\\99\\104.4922\\-94.05022\\99\\106.4453\\-95.20061\\99\\108.3984\\-96.16422\\99\\112.3047\\-98.92556\\99\\114.2578\\-100.1739\\99\\116.2109\\-101.7081\\99\\118.1641\\-103.4851\\99\\120.1172\\-105.4633\\99\\121.2877\\-106.5078\\99\\124.0234\\-109.5505\\99\\126.1534\\-112.3672\\99\\128.8689\\-116.2734\\99\\130.9465\\-120.1797\\99\\132.155\\-122.1328\\99\\133.0321\\-124.0859\\99\\134.1916\\-126.0391\\99\\134.9094\\-127.9922\\99\\136.5345\\-131.8984\\99\\137.0049\\-133.8516\\99\\137.8823\\-135.8047\\99\\139.1152\\-139.7109\\99\\140.0076\\-141.6641\\99\\140.9801\\-145.5703\\99\\141.625\\-147.5234\\99\\142.1659\\-149.4766\\99\\142.5126\\-151.4297\\99\\143.0404\\-155.3359\\99\\143.988\\-159.2422\\99\\144.2705\\-161.1953\\99\\144.8287\\-167.0547\\99\\144.9713\\-169.0078\\99\\145.6822\\-174.8672\\99\\145.9167\\-180.7266\\99\\145.907\\-186.5859\\99\\145.7784\\-190.4922\\99\\145.5154\\-194.3984\\99\\145.1262\\-198.3047\\99\\144.3197\\-208.0703\\99\\144.0585\\-210.0234\\99\\143.073\\-213.9297\\99\\142.4223\\-217.8359\\99\\141.9498\\-219.7891\\99\\141.0977\\-221.7422\\99\\140.4464\\-223.6953\\99\\139.3885\\-225.6484\\99\\138.4713\\-227.6016\\99\\137.283\\-229.5547\\99\\136.3642\\-231.5078\\99\\133.7891\\-235.208\\99\\130.4277\\-239.3203\\99\\127.9297\\-241.974\\99\\125.9766\\-243.7327\\99\\121.7731\\-247.1328\\99\\118.1641\\-249.879\\99\\114.2578\\-252.3685\\99\\110.7405\\-254.9453\\99\\110.3516\\-255.293\\99\\108.3984\\-256.3651\\99\\104.4922\\-259.2125\\99\\100.5859\\-261.9481\\99\\98.63281\\-263.4155\\99\\96.74737\\-264.7109\\99\\91.53427\\-268.6172\\99\\90.82031\\-269.2113\\99\\86.91406\\-271.7968\\99\\83.00781\\-274.8829\\99\\81.05469\\-275.8633\\99\\77.14844\\-278.7216\\99\\75.19531\\-279.907\\99\\73.24219\\-281.2166\\99\\71.28906\\-282.3301\\99\\69.33594\\-283.3296\\99\\67.38281\\-284.6212\\99\\65.42969\\-285.6069\\99\\63.47656\\-286.9277\\99\\61.52344\\-287.7839\\99\\59.57031\\-288.8963\\99\\57.61719\\-289.5389\\99\\55.66406\\-290.6886\\99\\53.71094\\-291.3657\\99\\51.75781\\-292.5251\\99\\49.80469\\-293.1976\\99\\47.85156\\-294.1047\\99\\45.89844\\-294.7998\\99\\43.94531\\-295.2224\\99\\41.99219\\-295.8757\\99\\40.03906\\-296.6331\\99\\38.08594\\-297.0154\\99\\36.13281\\-297.5196\\99\\34.17969\\-298.3421\\99\\30.27344\\-299.1643\\99\\26.36719\\-300.2077\\99\\24.41406\\-300.5201\\99\\20.50781\\-300.9362\\99\\14.64844\\-301.4833\\99\\10.74219\\-301.9056\\99\\6.835938\\-302.1505\\99\\2.929688\\-302.2818\\99\\-0.9765625\\-302.292\\99\\-4.882813\\-302.2123\\99\\-8.789063\\-302.0201\\99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "252" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "176" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-302.0201\\101\\-14.64844\\-301.5566\\101\\-22.46094\\-300.7596\\101\\-26.36719\\-300.2413\\101\\-30.27344\\-299.1961\\101\\-34.17969\\-298.3788\\101\\-36.13281\\-297.5997\\101\\-38.08594\\-297.0688\\101\\-40.03906\\-296.6778\\101\\-43.94531\\-295.2872\\101\\-45.89844\\-294.8778\\101\\-47.85156\\-294.313\\101\\-49.80469\\-293.3853\\101\\-51.75781\\-292.7399\\101\\-53.71094\\-291.683\\101\\-55.66406\\-290.9309\\101\\-57.61719\\-289.9413\\101\\-61.52344\\-288.5016\\101\\-63.47656\\-287.3803\\101\\-65.42969\\-286.5898\\101\\-67.38281\\-285.3454\\101\\-69.33594\\-284.3908\\101\\-71.28906\\-283.3186\\101\\-73.24219\\-282.4063\\101\\-77.14844\\-280.3747\\101\\-79.10156\\-279.2066\\101\\-81.05469\\-277.9103\\101\\-83.00781\\-277.0668\\101\\-84.96094\\-275.8879\\101\\-86.91406\\-275.1213\\101\\-88.86719\\-273.9054\\101\\-90.82031\\-272.9206\\101\\-92.77344\\-271.6265\\101\\-94.72656\\-270.5621\\101\\-98.47986\\-268.6172\\101\\-100.5859\\-267.4646\\101\\-102.5391\\-266.1367\\101\\-104.4922\\-265.0365\\101\\-106.4453\\-263.7464\\101\\-110.3516\\-261.4176\\101\\-114.2578\\-258.346\\101\\-116.2109\\-257.0166\\101\\-118.1641\\-255.5557\\101\\-120.1172\\-253.8474\\101\\-123.0839\\-251.0391\\101\\-125.9766\\-248.164\\101\\-128.7206\\-245.1797\\101\\-131.8359\\-241.2274\\101\\-134.6507\\-237.3672\\101\\-135.9089\\-235.4141\\101\\-136.8347\\-233.4609\\101\\-138.0231\\-231.5078\\101\\-138.8941\\-229.5547\\101\\-140.0901\\-227.6016\\101\\-140.8517\\-225.6484\\101\\-141.7894\\-223.6953\\101\\-142.4636\\-221.7422\\101\\-142.9274\\-219.7891\\101\\-143.7262\\-217.8359\\101\\-144.3124\\-215.8828\\101\\-145.1732\\-211.9766\\101\\-145.8247\\-210.0234\\101\\-146.2415\\-208.0703\\101\\-147.0768\\-202.2109\\101\\-147.3928\\-200.2578\\101\\-147.7887\\-196.3516\\101\\-147.9555\\-190.4922\\101\\-147.9112\\-186.5859\\101\\-147.5858\\-180.7266\\101\\-147.3361\\-178.7734\\101\\-146.4439\\-169.0078\\101\\-146.0191\\-165.1016\\101\\-145.6694\\-163.1484\\101\\-145.1557\\-161.1953\\101\\-144.7879\\-159.2422\\101\\-144.2076\\-155.3359\\101\\-143.7112\\-153.3828\\101\\-143.0598\\-151.4297\\101\\-142.3551\\-147.5234\\101\\-141.851\\-145.5703\\101\\-141.0324\\-143.6172\\101\\-140.4907\\-141.6641\\101\\-139.797\\-139.7109\\101\\-138.9469\\-137.7578\\101\\-138.3409\\-135.8047\\101\\-137.3089\\-133.8516\\101\\-135.9751\\-129.9453\\101\\-134.9472\\-127.9922\\101\\-134.0835\\-126.0391\\101\\-132.8636\\-124.0859\\101\\-130.7419\\-120.1797\\101\\-129.5139\\-118.2266\\101\\-128.5392\\-116.2734\\101\\-123.9014\\-110.4141\\101\\-122.4835\\-108.4609\\101\\-120.4234\\-106.5078\\101\\-115.8332\\-102.6016\\101\\-112.3047\\-100.0914\\101\\-110.3516\\-99.00812\\101\\-109.9808\\-98.69531\\101\\-106.4453\\-96.43488\\101\\-104.4922\\-95.51361\\101\\-102.5391\\-94.37154\\101\\-100.5859\\-93.72862\\101\\-96.67969\\-91.96495\\101\\-94.72656\\-91.21056\\101\\-92.77344\\-90.19518\\101\\-90.82031\\-89.60256\\101\\-88.86719\\-88.79581\\101\\-86.91406\\-88.20844\\101\\-83.00781\\-87.52795\\101\\-79.10156\\-86.61713\\101\\-77.14844\\-86.30003\\101\\-71.28906\\-85.67249\\101\\-67.38281\\-85.1684\\101\\-61.52344\\-84.51105\\101\\-57.61719\\-84.31876\\101\\-53.71094\\-84.17596\\101\\-47.85156\\-84.18716\\101\\-38.08594\\-84.00372\\101\\-34.17969\\-83.97217\\101\\-26.36719\\-83.80134\\101\\-22.46094\\-83.81676\\101\\-14.64844\\-84.05791\\101\\-8.789063\\-84.50786\\101\\-6.835938\\-84.79964\\101\\-4.882813\\-85.29108\\101\\-0.9765625\\-86.00574\\101\\0.9765625\\-86.13706\\101\\2.929688\\-86.11557\\101\\6.835938\\-85.60049\\101\\8.789063\\-85.25453\\101\\10.74219\\-84.71331\\101\\14.64844\\-83.91975\\101\\20.50781\\-82.88251\\101\\22.46094\\-82.66168\\101\\26.36719\\-82.47672\\101\\28.32031\\-82.47281\\101\\34.17969\\-82.62216\\101\\36.13281\\-82.74247\\101\\40.03906\\-83.10816\\101\\43.94531\\-83.36192\\101\\51.75781\\-83.7346\\101\\59.57031\\-84.06822\\101\\63.47656\\-84.31171\\101\\67.38281\\-84.6541\\101\\71.28906\\-85.3074\\101\\77.14844\\-86.0511\\101\\81.05469\\-86.76522\\101\\83.00781\\-87.31405\\101\\84.96094\\-87.7215\\101\\88.86719\\-88.42161\\101\\90.82031\\-89.14906\\101\\94.72656\\-90.31075\\101\\96.67969\\-91.25842\\101\\98.63281\\-91.96972\\101\\102.5391\\-93.67566\\101\\104.4922\\-94.40567\\101\\108.3984\\-96.62775\\101\\110.3516\\-97.9613\\101\\112.3047\\-99.45412\\101\\114.1851\\-100.6484\\101\\116.2109\\-102.1283\\101\\118.7212\\-104.5547\\101\\120.8357\\-106.5078\\101\\122.7001\\-108.4609\\101\\124.2511\\-110.4141\\101\\125.548\\-112.3672\\101\\128.5441\\-116.2734\\101\\129.4765\\-118.2266\\101\\130.6653\\-120.1797\\101\\133.7891\\-126.1998\\101\\134.6319\\-127.9922\\101\\135.294\\-129.9453\\101\\136.2271\\-131.8984\\101\\137.3033\\-135.8047\\101\\138.2041\\-137.7578\\101\\139.406\\-141.6641\\101\\140.1992\\-143.6172\\101\\141.1009\\-147.5234\\101\\141.7569\\-149.4766\\101\\142.2298\\-151.4297\\101\\143.0179\\-157.2891\\101\\143.8893\\-161.1953\\101\\144.1525\\-163.1484\\101\\144.5104\\-167.0547\\101\\144.7495\\-170.9609\\101\\145.0413\\-174.8672\\101\\145.3154\\-182.6797\\101\\145.2884\\-186.5859\\101\\145.1604\\-190.4922\\101\\144.6461\\-200.2578\\101\\144.219\\-206.1172\\101\\143.9572\\-208.0703\\101\\143.05\\-211.9766\\101\\142.4583\\-215.8828\\101\\142.08\\-217.8359\\101\\141.3435\\-219.7891\\101\\140.0171\\-223.6953\\101\\138.8683\\-225.6484\\101\\138.0623\\-227.6016\\101\\136.8646\\-229.5547\\101\\135.8772\\-231.5078\\101\\134.613\\-233.4609\\101\\131.8359\\-236.8906\\101\\127.9297\\-241.3622\\101\\123.48\\-245.1797\\101\\120.1172\\-247.9948\\101\\118.1641\\-249.4983\\101\\116.2109\\-250.6174\\101\\112.3047\\-253.5582\\101\\110.3002\\-254.9453\\101\\108.3984\\-256.1339\\101\\104.6404\\-258.8516\\101\\98.63281\\-263.3842\\101\\94.72656\\-266.2057\\101\\90.82031\\-269.2705\\101\\88.86719\\-270.6523\\101\\86.91406\\-271.9192\\101\\83.00781\\-275.0356\\101\\81.05469\\-276.0662\\101\\79.10156\\-277.4299\\101\\77.14844\\-278.9115\\101\\71.28906\\-282.5649\\101\\69.33594\\-283.4813\\101\\67.38281\\-284.819\\101\\65.42969\\-285.8249\\101\\63.47656\\-287.0703\\101\\59.57031\\-289.0225\\101\\57.61719\\-289.7179\\101\\55.66406\\-290.8391\\101\\53.71094\\-291.5574\\101\\51.75781\\-292.7039\\101\\49.80469\\-293.378\\101\\47.85156\\-294.3265\\101\\45.89844\\-294.9134\\101\\43.94531\\-295.3498\\101\\41.99219\\-296.1324\\101\\40.03906\\-296.7585\\101\\38.08594\\-297.1253\\101\\36.13281\\-297.7464\\101\\34.17969\\-298.5011\\101\\30.27344\\-299.31\\101\\28.32031\\-299.8899\\101\\26.36719\\-300.325\\101\\24.41406\\-300.6052\\101\\14.64844\\-301.609\\101\\10.74219\\-302.0332\\101\\6.835938\\-302.2581\\101\\2.929688\\-302.37\\101\\-2.929688\\-302.3571\\101\\-6.835938\\-302.2369\\101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "255" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "177" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-301.4584\\103\\-24.41406\\-300.6429\\103\\-26.36719\\-300.3733\\103\\-28.32031\\-299.9194\\103\\-30.27344\\-299.3351\\103\\-34.17969\\-298.5163\\103\\-38.08594\\-297.1776\\103\\-40.03906\\-296.7864\\103\\-41.99219\\-296.2247\\103\\-43.94531\\-295.402\\103\\-47.85156\\-294.4738\\103\\-49.80469\\-293.5319\\103\\-51.75781\\-292.8598\\103\\-53.71094\\-291.8803\\103\\-57.61719\\-290.1692\\103\\-59.57031\\-289.2568\\103\\-61.52344\\-288.6201\\103\\-63.47656\\-287.4709\\103\\-65.42969\\-286.6773\\103\\-67.38281\\-285.413\\103\\-69.33594\\-284.4897\\103\\-71.28906\\-283.3366\\103\\-73.43301\\-282.2891\\103\\-77.13721\\-280.3359\\103\\-79.10156\\-279.1517\\103\\-81.05469\\-277.8102\\103\\-83.00781\\-276.9652\\103\\-84.96094\\-275.7591\\103\\-86.91406\\-274.945\\103\\-87.58076\\-274.4766\\103\\-94.17499\\-270.5703\\103\\-94.72656\\-270.1478\\103\\-96.67969\\-269.3384\\103\\-98.63281\\-268.0959\\103\\-100.5859\\-267.1085\\103\\-104.4922\\-264.4202\\103\\-106.4453\\-263.424\\103\\-108.3984\\-262.0735\\103\\-110.3516\\-260.8621\\103\\-112.3047\\-259.418\\103\\-114.2578\\-257.8445\\103\\-118.0396\\-254.9453\\103\\-120.1172\\-253.2274\\103\\-122.4365\\-251.0391\\103\\-125.9766\\-247.513\\103\\-128.0704\\-245.1797\\103\\-129.8828\\-242.9041\\103\\-131.0587\\-241.2734\\103\\-132.658\\-239.3203\\103\\-134.1316\\-237.3672\\103\\-135.2293\\-235.4141\\103\\-136.4634\\-233.4609\\103\\-137.3004\\-231.5078\\103\\-138.4487\\-229.5547\\103\\-139.3138\\-227.6016\\103\\-140.4054\\-225.6484\\103\\-141.1133\\-223.6953\\103\\-142.0424\\-221.7422\\103\\-143.0596\\-217.8359\\103\\-143.8165\\-215.8828\\103\\-144.3304\\-213.9297\\103\\-145.0846\\-210.0234\\103\\-145.7316\\-208.0703\\103\\-146.1196\\-206.1172\\103\\-146.8118\\-200.2578\\103\\-147.1579\\-196.3516\\103\\-147.3928\\-190.4922\\103\\-147.3214\\-186.5859\\103\\-146.985\\-180.7266\\103\\-146.8156\\-178.7734\\103\\-146.4278\\-172.9141\\103\\-146.1243\\-169.0078\\103\\-145.8669\\-167.0547\\103\\-145.0802\\-163.1484\\103\\-144.2562\\-157.2891\\103\\-143.8525\\-155.3359\\103\\-143.2197\\-153.3828\\103\\-142.8238\\-151.4297\\103\\-142.1313\\-147.5234\\103\\-140.7806\\-143.6172\\103\\-140.2609\\-141.6641\\103\\-139.3802\\-139.7109\\103\\-138.092\\-135.8047\\103\\-137.0721\\-133.8516\\103\\-136.4919\\-131.8984\\103\\-134.7414\\-127.9922\\103\\-133.7891\\-126.1884\\103\\-131.8359\\-122.748\\103\\-131.3996\\-122.1328\\103\\-130.5013\\-120.1797\\103\\-129.2206\\-118.2266\\103\\-128.159\\-116.2734\\103\\-126.6897\\-114.3203\\103\\-123.3746\\-110.4141\\103\\-121.8767\\-108.4609\\103\\-116.2109\\-103.395\\103\\-114.2578\\-101.8008\\103\\-112.3047\\-100.5435\\103\\-110.3516\\-99.40134\\103\\-108.3984\\-98.02321\\103\\-104.4922\\-95.81988\\103\\-102.4978\\-94.78906\\103\\-100.5859\\-93.94067\\103\\-98.63281\\-93.30714\\103\\-96.67969\\-92.25574\\103\\-94.72656\\-91.59252\\103\\-92.77344\\-90.58182\\103\\-88.86719\\-89.31095\\103\\-86.91406\\-88.5922\\103\\-84.96094\\-88.12954\\103\\-81.05469\\-87.55062\\103\\-77.14844\\-86.70058\\103\\-75.19531\\-86.4074\\103\\-69.33594\\-85.80828\\103\\-63.47656\\-85.32554\\103\\-61.52344\\-85.04707\\103\\-57.61719\\-84.71539\\103\\-53.71094\\-84.53212\\103\\-47.85156\\-84.48284\\103\\-38.08594\\-84.13416\\103\\-34.17969\\-84.09966\\103\\-26.36719\\-83.94492\\103\\-22.46094\\-83.98141\\103\\-16.60156\\-84.18235\\103\\-12.69531\\-84.42471\\103\\-8.789063\\-84.90137\\103\\-2.929688\\-86.02941\\103\\0.9765625\\-86.52041\\103\\2.929688\\-86.51062\\103\\8.789063\\-85.71018\\103\\10.74219\\-85.28237\\103\\14.64844\\-84.27531\\103\\16.60156\\-83.90326\\103\\22.46094\\-83.09357\\103\\26.36719\\-82.79027\\103\\28.32031\\-82.75416\\103\\34.17969\\-82.90144\\103\\38.08594\\-83.28811\\103\\41.99219\\-83.54623\\103\\49.80469\\-83.89907\\103\\53.71094\\-84.04688\\103\\59.57031\\-84.35584\\103\\63.47656\\-84.67239\\103\\69.33594\\-85.46674\\103\\73.24219\\-85.85152\\103\\77.14844\\-86.3808\\103\\79.10156\\-86.76522\\103\\81.05469\\-87.29733\\103\\86.91406\\-88.29779\\103\\90.82031\\-89.57878\\103\\92.77344\\-90.08083\\103\\94.72656\\-90.81623\\103\\96.67969\\-91.68805\\103\\98.63281\\-92.32036\\103\\100.5859\\-93.29349\\103\\102.5391\\-93.94396\\103\\106.4453\\-95.90778\\103\\108.3984\\-97.21291\\103\\110.3516\\-98.39651\\103\\113.435\\-100.6484\\103\\116.001\\-102.6016\\103\\120.3125\\-106.5078\\103\\122.2276\\-108.4609\\103\\123.5822\\-110.4141\\103\\126.6851\\-114.3203\\103\\128.0735\\-116.2734\\103\\129.1261\\-118.2266\\103\\130.3223\\-120.1797\\103\\131.1492\\-122.1328\\103\\132.3692\\-124.0859\\103\\133.1818\\-126.0391\\103\\134.2961\\-127.9922\\103\\134.9383\\-129.9453\\103\\136.4996\\-133.8516\\103\\136.9418\\-135.8047\\103\\138.4436\\-139.7109\\103\\138.9337\\-141.6641\\103\\140.3233\\-145.5703\\103\\141.184\\-149.4766\\103\\141.8258\\-151.4297\\103\\142.2213\\-153.3828\\103\\142.9662\\-159.2422\\103\\143.6244\\-163.1484\\103\\144.1883\\-167.0547\\103\\144.3478\\-169.0078\\103\\144.6487\\-174.8672\\103\\144.8287\\-182.6797\\103\\144.8175\\-186.5859\\103\\144.6913\\-192.4453\\103\\144.5519\\-196.3516\\103\\144.245\\-202.2109\\103\\143.7899\\-206.1172\\103\\143.3385\\-208.0703\\103\\143.005\\-210.0234\\103\\142.4888\\-213.9297\\103\\142.1477\\-215.8828\\103\\140.8395\\-219.7891\\103\\140.3051\\-221.7422\\103\\139.3138\\-223.6953\\103\\138.4733\\-225.6484\\103\\137.3943\\-227.6016\\103\\136.5196\\-229.5547\\103\\134.1261\\-233.4609\\103\\131.8359\\-236.3604\\103\\129.1794\\-239.3203\\103\\127.3304\\-241.2734\\103\\122.9616\\-245.1797\\103\\120.1172\\-247.5633\\103\\118.0115\\-249.0859\\103\\116.2109\\-250.2699\\103\\115.2751\\-251.0391\\103\\110.3516\\-254.5561\\103\\106.4453\\-257.4329\\103\\104.4922\\-258.7783\\103\\101.9641\\-260.8047\\103\\98.63281\\-263.3793\\103\\94.72656\\-266.2748\\103\\90.82031\\-269.3529\\103\\88.86719\\-270.811\\103\\86.91406\\-272.0974\\103\\83.00781\\-275.1647\\103\\81.05469\\-276.3106\\103\\79.10156\\-277.567\\103\\77.14844\\-279.1033\\103\\75.19531\\-280.4035\\103\\73.24219\\-281.524\\103\\71.28906\\-282.7841\\103\\69.33594\\-283.6666\\103\\68.58016\\-284.2422\\103\\65.35619\\-286.1953\\103\\61.52344\\-288.3348\\103\\57.61719\\-289.9698\\103\\55.66406\\-290.979\\103\\53.71094\\-291.8157\\103\\51.75781\\-292.8561\\103\\49.80469\\-293.5731\\103\\47.85156\\-294.5182\\103\\43.94531\\-295.5128\\103\\41.99219\\-296.3556\\103\\40.03906\\-296.8692\\103\\38.08594\\-297.2611\\103\\36.13281\\-298.0361\\103\\34.17969\\-298.6312\\103\\30.27344\\-299.4629\\103\\28.32031\\-300.0804\\103\\26.36719\\-300.4344\\103\\24.41406\\-300.6875\\103\\16.60156\\-301.5182\\103\\12.69531\\-301.9931\\103\\10.74219\\-302.1505\\103\\6.835938\\-302.3571\\103\\2.929688\\-302.4526\\103\\-2.929688\\-302.4485\\103\\-6.835938\\-302.3477\\103\\-10.74219\\-302.1505\\103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "255" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "178" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-301.9056\\105\\-16.60156\\-301.5944\\105\\-26.36719\\-300.4818\\105\\-28.32031\\-300.1046\\105\\-30.27344\\-299.501\\105\\-34.17969\\-298.6312\\105\\-36.13281\\-298.0627\\105\\-38.08594\\-297.2958\\105\\-41.99219\\-296.4102\\105\\-43.94531\\-295.5444\\105\\-47.85156\\-294.6121\\105\\-49.80469\\-293.7162\\105\\-51.75781\\-292.9699\\105\\-53.71094\\-292.1213\\105\\-55.66406\\-291.1521\\105\\-57.61719\\-290.3642\\105\\-59.57031\\-289.3386\\105\\-61.52344\\-288.7293\\105\\-63.47656\\-287.5714\\105\\-65.42969\\-286.7715\\105\\-67.38281\\-285.4978\\105\\-69.33594\\-284.5677\\105\\-71.28906\\-283.3669\\105\\-73.47523\\-282.2891\\105\\-77.09418\\-280.3359\\105\\-79.10156\\-279.1195\\105\\-81.05469\\-277.726\\105\\-83.00781\\-276.8511\\105\\-84.96094\\-275.6472\\105\\-86.91406\\-274.7525\\105\\-90.42794\\-272.5234\\105\\-90.82031\\-272.2118\\105\\-92.77344\\-271.188\\105\\-94.72656\\-269.8674\\105\\-96.67969\\-269.0598\\105\\-97.277\\-268.6172\\105\\-102.5391\\-265.3875\\105\\-104.4922\\-263.9801\\105\\-106.4453\\-262.9375\\105\\-108.3984\\-261.6735\\105\\-112.3047\\-258.7166\\105\\-114.2578\\-257.3766\\105\\-116.2109\\-255.8276\\105\\-118.1641\\-254.1733\\105\\-121.6202\\-251.0391\\105\\-124.0234\\-248.7197\\105\\-127.281\\-245.1797\\105\\-128.969\\-243.2266\\105\\-130.5493\\-241.2734\\105\\-132.0101\\-239.3203\\105\\-134.7086\\-235.4141\\105\\-135.8302\\-233.4609\\105\\-137.8864\\-229.5547\\105\\-138.7432\\-227.6016\\105\\-139.7611\\-225.6484\\105\\-140.6022\\-223.6953\\105\\-141.3135\\-221.7422\\105\\-142.1718\\-219.7891\\105\\-143.0939\\-215.8828\\105\\-143.7916\\-213.9297\\105\\-144.2654\\-211.9766\\105\\-144.9667\\-208.0703\\105\\-145.9246\\-204.1641\\105\\-146.3682\\-200.2578\\105\\-146.6417\\-196.3516\\105\\-146.7666\\-192.4453\\105\\-146.808\\-188.5391\\105\\-146.5372\\-180.7266\\105\\-146.0699\\-172.9141\\105\\-145.6163\\-169.0078\\105\\-145.2121\\-167.0547\\105\\-144.6931\\-163.1484\\105\\-144.2343\\-159.2422\\105\\-143.8779\\-157.2891\\105\\-143.2996\\-155.3359\\105\\-142.8849\\-153.3828\\105\\-142.2913\\-149.4766\\105\\-141.7704\\-147.5234\\105\\-141.0253\\-145.5703\\105\\-140.5227\\-143.6172\\105\\-139.919\\-141.6641\\105\\-139.0265\\-139.7109\\105\\-138.4948\\-137.7578\\105\\-136.8401\\-133.8516\\105\\-136.2742\\-131.8984\\105\\-135.2539\\-129.9453\\105\\-134.4954\\-127.9922\\105\\-133.2942\\-126.0391\\105\\-132.3303\\-124.0859\\105\\-131.0833\\-122.1328\\105\\-130.1437\\-120.1797\\105\\-128.938\\-118.2266\\105\\-126.2403\\-114.3203\\105\\-124.6585\\-112.3672\\105\\-122.0703\\-109.2925\\105\\-121.2818\\-108.4609\\105\\-116.2109\\-103.8103\\105\\-114.2578\\-102.184\\105\\-112.3047\\-101.0608\\105\\-108.3984\\-98.43082\\105\\-106.4453\\-97.40721\\105\\-104.4922\\-96.12244\\105\\-102.5391\\-95.28759\\105\\-100.5859\\-94.2111\\105\\-98.63281\\-93.61346\\105\\-96.67969\\-92.6476\\105\\-92.77344\\-91.14091\\105\\-90.82031\\-90.24175\\105\\-86.91406\\-89.17558\\105\\-84.96094\\-88.45516\\105\\-83.00781\\-88.08825\\105\\-79.10156\\-87.60807\\105\\-77.14844\\-87.28994\\105\\-73.24219\\-86.55054\\105\\-71.28906\\-86.33144\\105\\-65.42969\\-85.82664\\105\\-63.47656\\-85.73527\\105\\-53.71094\\-85.00072\\105\\-47.85156\\-84.83643\\105\\-43.94531\\-84.58065\\105\\-36.13281\\-84.25217\\105\\-30.27344\\-84.14399\\105\\-26.36719\\-84.11091\\105\\-22.46094\\-84.16209\\105\\-16.60156\\-84.42471\\105\\-12.69531\\-84.72651\\105\\-8.789063\\-85.36523\\105\\-6.835938\\-85.60809\\105\\-2.929688\\-86.38565\\105\\0.9765625\\-87.06534\\105\\2.929688\\-87.034\\105\\4.882813\\-86.67446\\105\\8.789063\\-86.13021\\105\\12.69531\\-85.3157\\105\\14.64844\\-84.67007\\105\\18.55469\\-83.90155\\105\\20.50781\\-83.66985\\105\\24.41406\\-83.35228\\105\\28.32031\\-83.19704\\105\\32.22656\\-83.19514\\105\\36.13281\\-83.37131\\105\\40.03906\\-83.65741\\105\\51.75781\\-84.1669\\105\\59.57031\\-84.6936\\105\\61.52344\\-84.90137\\105\\65.42969\\-85.44381\\105\\73.24219\\-86.14677\\105\\77.14844\\-86.80511\\105\\79.10156\\-87.31158\\105\\81.05469\\-87.6507\\105\\84.96094\\-88.22231\\105\\86.91406\\-88.72993\\105\\88.86719\\-89.43352\\105\\92.77344\\-90.45087\\105\\94.72656\\-91.38345\\105\\96.67969\\-92.02029\\105\\100.5859\\-93.65281\\105\\102.5391\\-94.27327\\105\\104.4922\\-95.39774\\105\\106.4453\\-96.32851\\105\\109.8861\\-98.69531\\105\\110.3516\\-99.08748\\105\\112.3047\\-100.2415\\105\\114.2578\\-101.6781\\105\\116.2109\\-103.3587\\105\\121.5598\\-108.4609\\105\\122.0703\\-109.032\\105\\124.7116\\-112.3672\\105\\126.2008\\-114.3203\\105\\128.7928\\-118.2266\\105\\131.8437\\-124.0859\\105\\133.7891\\-128.0056\\105\\134.6269\\-129.9453\\105\\135.2439\\-131.8984\\105\\136.1427\\-133.8516\\105\\136.689\\-135.8047\\105\\137.1364\\-137.7578\\105\\138.0358\\-139.7109\\105\\139.066\\-143.6172\\105\\139.8631\\-145.5703\\105\\140.3795\\-147.5234\\105\\141.2149\\-151.4297\\105\\141.7851\\-153.3828\\105\\142.1786\\-155.3359\\105\\142.4583\\-157.2891\\105\\143.2459\\-165.1016\\105\\143.6824\\-167.0547\\105\\143.9545\\-169.0078\\105\\144.3148\\-174.8672\\105\\144.4304\\-178.7734\\105\\144.4895\\-182.6797\\105\\144.4949\\-186.5859\\105\\144.442\\-190.4922\\105\\144.2634\\-196.3516\\105\\144.1606\\-198.3047\\105\\143.7899\\-202.2109\\105\\143.1518\\-206.1172\\105\\142.4703\\-211.9766\\105\\142.1348\\-213.9297\\105\\141.6016\\-215.8596\\105\\140.9368\\-217.8359\\105\\140.4351\\-219.7891\\105\\139.7298\\-221.7422\\105\\138.7933\\-223.6953\\105\\138.0076\\-225.6484\\105\\136.903\\-227.6016\\105\\136.0899\\-229.5547\\105\\134.847\\-231.5078\\105\\132.0426\\-235.4141\\105\\128.7179\\-239.3203\\105\\125.9766\\-242.0724\\105\\122.3232\\-245.1797\\105\\117.4229\\-249.0859\\105\\114.2578\\-251.4412\\105\\112.3047\\-252.7663\\105\\108.3984\\-255.8394\\105\\106.4453\\-257.2989\\105\\104.4922\\-258.6423\\105\\100.5859\\-261.8606\\105\\88.86719\\-270.9547\\105\\86.65751\\-272.5234\\105\\83.00781\\-275.2979\\105\\81.05469\\-276.6025\\105\\79.10156\\-277.7338\\105\\77.14844\\-279.2829\\105\\75.19531\\-280.6794\\105\\73.24219\\-281.7018\\105\\71.28906\\-282.9632\\105\\69.33594\\-283.9072\\105\\68.92613\\-284.2422\\105\\65.77485\\-286.1953\\105\\65.42969\\-286.4813\\105\\63.47656\\-287.4099\\105\\61.52344\\-288.5892\\105\\59.57031\\-289.2878\\105\\57.61719\\-290.3039\\105\\55.66406\\-291.1287\\105\\53.71094\\-292.164\\105\\49.80469\\-293.7916\\105\\47.85156\\-294.6769\\105\\45.89844\\-295.1401\\105\\43.94531\\-295.7059\\105\\41.99219\\-296.5372\\105\\38.08594\\-297.4166\\105\\36.13281\\-298.2606\\105\\32.22656\\-299.1321\\105\\28.32031\\-300.2182\\105\\26.36719\\-300.5389\\105\\16.60156\\-301.6489\\105\\12.69531\\-302.1388\\105\\8.789063\\-302.3793\\105\\4.882813\\-302.51\\105\\-0.9765625\\-302.5497\\105\\-6.835938\\-302.461\\105\\-10.74219\\-302.2685\\105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "249" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "179" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-302.0608\\107\\-18.55469\\-301.4925\\107\\-26.36719\\-300.5728\\107\\-28.32031\\-300.2389\\107\\-32.22656\\-299.1468\\107\\-36.13281\\-298.2606\\107\\-38.08594\\-297.4351\\107\\-41.99219\\-296.566\\107\\-43.94531\\-295.7186\\107\\-45.89844\\-295.1421\\107\\-47.85156\\-294.724\\107\\-51.75781\\-293.0884\\107\\-53.71094\\-292.3516\\107\\-55.66406\\-291.2561\\107\\-57.61719\\-290.5349\\107\\-59.57031\\-289.4236\\107\\-61.52344\\-288.81\\107\\-63.47656\\-287.68\\107\\-65.42969\\-286.8601\\107\\-67.38281\\-285.577\\107\\-69.33594\\-284.6389\\107\\-71.28906\\-283.4163\\107\\-73.57124\\-282.2891\\107\\-77.03168\\-280.3359\\107\\-79.10156\\-279.0862\\107\\-81.05469\\-277.6689\\107\\-83.00781\\-276.7575\\107\\-84.96094\\-275.5514\\107\\-86.91406\\-274.5156\\107\\-88.86719\\-273.3519\\107\\-90.82031\\-271.94\\107\\-92.77344\\-270.9138\\107\\-94.72656\\-269.6712\\107\\-96.67969\\-268.6746\\107\\-98.63281\\-267.4679\\107\\-100.5859\\-266.0552\\107\\-102.5391\\-264.9162\\107\\-106.4453\\-262.3044\\107\\-108.3984\\-261.2272\\107\\-112.3047\\-258.1048\\107\\-116.2109\\-255.3039\\107\\-118.1641\\-253.5894\\107\\-118.7326\\-252.9922\\107\\-120.9322\\-251.0391\\107\\-124.0234\\-248.005\\107\\-128.3993\\-243.2266\\107\\-129.8912\\-241.2734\\107\\-131.2008\\-239.3203\\107\\-134.15\\-235.4141\\107\\-135.1497\\-233.4609\\107\\-136.3458\\-231.5078\\107\\-137.1189\\-229.5547\\107\\-138.2457\\-227.6016\\107\\-138.956\\-225.6484\\107\\-140.0482\\-223.6953\\107\\-140.7392\\-221.7422\\107\\-142.2289\\-217.8359\\107\\-143.0397\\-213.9297\\107\\-143.6691\\-211.9766\\107\\-144.1838\\-210.0234\\107\\-145.1159\\-204.1641\\107\\-145.8398\\-200.2578\\107\\-146.1936\\-196.3516\\107\\-146.3216\\-192.4453\\107\\-146.3741\\-188.5391\\107\\-146.1348\\-180.7266\\107\\-145.8772\\-176.8203\\107\\-145.5078\\-173.4311\\107\\-145.1643\\-170.9609\\107\\-144.7409\\-167.0547\\107\\-144.1767\\-161.1953\\107\\-143.7916\\-159.2422\\107\\-143.2705\\-157.2891\\107\\-142.8974\\-155.3359\\107\\-142.3598\\-151.4297\\107\\-141.9498\\-149.4766\\107\\-141.2362\\-147.5234\\107\\-140.2186\\-143.6172\\107\\-139.3684\\-141.6641\\107\\-138.1806\\-137.7578\\107\\-137.1872\\-135.8047\\107\\-136.6272\\-133.8516\\107\\-135.9634\\-131.8984\\107\\-134.967\\-129.9453\\107\\-134.173\\-127.9922\\107\\-132.9614\\-126.0391\\107\\-131.9328\\-124.0859\\107\\-130.7883\\-122.1328\\107\\-128.6048\\-118.2266\\107\\-125.9766\\-114.7842\\107\\-125.5516\\-114.3203\\107\\-122.5972\\-110.4141\\107\\-120.1172\\-107.8541\\107\\-116.2109\\-104.3385\\107\\-114.0185\\-102.6016\\107\\-110.3516\\-100.0531\\107\\-108.3984\\-99.02326\\107\\-107.9839\\-98.69531\\107\\-104.7247\\-96.74219\\107\\-100.5859\\-94.59833\\107\\-96.67969\\-93.19948\\107\\-94.72656\\-92.22768\\107\\-92.77344\\-91.56292\\107\\-90.82031\\-90.7033\\107\\-88.86719\\-90.04819\\107\\-86.91406\\-89.60979\\107\\-83.00781\\-88.40487\\107\\-81.05469\\-88.12\\107\\-75.19531\\-87.40983\\107\\-71.28906\\-86.73785\\107\\-67.38281\\-86.28555\\107\\-61.52344\\-85.90567\\107\\-53.71094\\-85.46854\\107\\-47.85156\\-85.2797\\107\\-43.94531\\-84.888\\107\\-40.03906\\-84.63405\\107\\-36.13281\\-84.45473\\107\\-30.27344\\-84.30067\\107\\-26.36719\\-84.30067\\107\\-20.50781\\-84.46293\\107\\-16.60156\\-84.68515\\107\\-12.69531\\-85.1234\\107\\-6.835938\\-85.95265\\107\\-4.882813\\-86.3156\\107\\-0.9765625\\-87.31909\\107\\0.9765625\\-87.59021\\107\\2.929688\\-87.5811\\107\\4.882813\\-87.2673\\107\\8.789063\\-86.53744\\107\\12.69531\\-85.72534\\107\\16.60156\\-84.58338\\107\\18.55469\\-84.19574\\107\\22.46094\\-83.78957\\107\\24.41406\\-83.66344\\107\\28.32031\\-83.55233\\107\\32.22656\\-83.51477\\107\\36.13281\\-83.60682\\107\\40.03906\\-83.82865\\107\\45.89844\\-84.08485\\107\\49.80469\\-84.28963\\107\\53.71094\\-84.55587\\107\\57.61719\\-84.9287\\107\\63.47656\\-85.58754\\107\\69.33594\\-86.05968\\107\\73.24219\\-86.46623\\107\\77.14844\\-87.29969\\107\\79.10156\\-87.6507\\107\\83.00781\\-88.16675\\107\\84.96094\\-88.55999\\107\\86.91406\\-89.2926\\107\\90.82031\\-90.26815\\107\\92.77344\\-91.06102\\107\\96.67969\\-92.3971\\107\\98.63281\\-93.3208\\107\\100.5859\\-93.92306\\107\\102.5391\\-94.73209\\107\\104.4922\\-95.75945\\107\\108.3984\\-98.1364\\107\\112.3047\\-100.9197\\107\\114.2578\\-102.1061\\107\\116.2109\\-103.7804\\107\\121.0801\\-108.4609\\107\\122.7944\\-110.4141\\107\\125.5132\\-114.3203\\107\\125.9766\\-114.8493\\107\\128.3736\\-118.2266\\107\\129.312\\-120.1797\\107\\130.5191\\-122.1328\\107\\131.2695\\-124.0859\\107\\132.4327\\-126.0391\\107\\133.2069\\-127.9922\\107\\134.2711\\-129.9453\\107\\134.8943\\-131.8984\\107\\136.408\\-135.8047\\107\\136.8266\\-137.7578\\107\\137.4111\\-139.7109\\107\\138.2041\\-141.6641\\107\\139.1849\\-145.5703\\107\\139.9208\\-147.5234\\107\\140.4097\\-149.4766\\107\\141.1668\\-153.3828\\107\\141.6855\\-155.3359\\107\\142.08\\-157.2891\\107\\142.3598\\-159.2422\\107\\143.05\\-167.0547\\107\\143.6974\\-172.9141\\107\\143.9909\\-176.8203\\107\\144.1606\\-182.6797\\107\\144.1153\\-190.4922\\107\\143.8042\\-196.3516\\107\\142.9523\\-204.1641\\107\\142.6079\\-208.0703\\107\\142.1029\\-211.9766\\107\\140.9875\\-215.8828\\107\\140.5289\\-217.8359\\107\\139.9565\\-219.7891\\107\\139.0381\\-221.7422\\107\\138.3929\\-223.6953\\107\\137.3175\\-225.6484\\107\\136.5642\\-227.6016\\107\\134.3763\\-231.5078\\107\\131.8359\\-234.8234\\107\\129.8828\\-237.2451\\107\\128.0692\\-239.3203\\107\\125.9766\\-241.4402\\107\\122.0703\\-244.7534\\107\\118.1641\\-248.1411\\107\\116.2109\\-249.7166\\107\\112.3047\\-252.4461\\107\\108.3984\\-255.7279\\107\\104.4922\\-258.5586\\107\\101.8905\\-260.8047\\107\\94.59577\\-266.6641\\107\\89.58549\\-270.5703\\107\\83.00781\\-275.4341\\107\\81.05469\\-276.8405\\107\\79.10156\\-277.9556\\107\\75.19531\\-280.9181\\107\\73.24219\\-281.8998\\107\\72.68847\\-282.2891\\107\\69.33594\\-284.2798\\107\\67.38281\\-285.3732\\107\\65.42969\\-286.7274\\107\\63.47656\\-287.6176\\107\\61.52344\\-288.8016\\107\\59.57031\\-289.4274\\107\\57.61719\\-290.5629\\107\\55.66406\\-291.2957\\107\\53.71094\\-292.4516\\107\\51.75781\\-293.1654\\107\\49.80469\\-294.0765\\107\\47.85156\\-294.8138\\107\\45.89844\\-295.2546\\107\\41.99219\\-296.6737\\107\\40.03906\\-297.0642\\107\\38.08594\\-297.6089\\107\\36.13281\\-298.4277\\107\\32.22656\\-299.2519\\107\\30.20198\\-299.8672\\107\\28.32031\\-300.3405\\107\\26.36719\\-300.6136\\107\\18.55469\\-301.5302\\107\\14.64844\\-302.0735\\107\\12.69531\\-302.2581\\107\\8.789063\\-302.4734\\107\\4.882813\\-302.5956\\107\\-2.929688\\-302.6145\\107\\-6.835938\\-302.5497\\107\\-10.74219\\-302.3921\\107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "245" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "180" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-301.9931\\109\\-20.50781\\-301.3722\\109\\-26.36719\\-300.654\\109\\-28.32031\\-300.3525\\109\\-30.27344\\-299.8748\\109\\-32.22656\\-299.264\\109\\-36.13281\\-298.4277\\109\\-38.08594\\-297.6068\\109\\-40.03906\\-297.0628\\109\\-41.99219\\-296.6808\\109\\-45.89844\\-295.2456\\109\\-47.85156\\-294.8187\\109\\-49.80469\\-294.1473\\109\\-51.75781\\-293.2103\\109\\-53.71094\\-292.528\\109\\-55.66406\\-291.3803\\109\\-57.61719\\-290.6797\\109\\-59.57031\\-289.5207\\109\\-61.52344\\-288.8963\\109\\-63.47656\\-287.8323\\109\\-65.42969\\-286.9363\\109\\-67.38281\\-285.6709\\109\\-69.33594\\-284.7334\\109\\-71.28906\\-283.4622\\109\\-73.24219\\-282.5754\\109\\-73.64309\\-282.2891\\109\\-77.0529\\-280.3359\\109\\-79.10156\\-279.0753\\109\\-81.05469\\-277.632\\109\\-83.32987\\-276.4297\\109\\-88.86719\\-273.2025\\109\\-90.82031\\-271.7365\\109\\-92.77344\\-270.562\\109\\-94.72656\\-269.5088\\109\\-96.67969\\-268.2537\\109\\-98.63281\\-267.1458\\109\\-99.20313\\-266.6641\\109\\-102.0713\\-264.7109\\109\\-102.5391\\-264.3016\\109\\-104.4922\\-263.2531\\109\\-108.0698\\-260.8047\\109\\-110.3516\\-259.1649\\109\\-116.2109\\-254.5138\\109\\-120.1172\\-250.8534\\109\\-122.0703\\-249.3057\\109\\-124.0234\\-247.2142\\109\\-127.9297\\-242.7993\\109\\-129.8828\\-240.3321\\109\\-132.0555\\-237.3672\\109\\-134.6079\\-233.4609\\109\\-136.6166\\-229.5547\\109\\-137.4152\\-227.6016\\109\\-138.4277\\-225.6484\\109\\-139.1569\\-223.6953\\109\\-140.2039\\-221.7422\\109\\-140.7936\\-219.7891\\109\\-142.194\\-215.8828\\109\\-142.941\\-211.9766\\109\\-143.9909\\-208.0703\\109\\-144.3257\\-206.1172\\109\\-145.6835\\-194.3984\\109\\-145.8268\\-190.4922\\109\\-145.8047\\-186.5859\\109\\-145.6163\\-182.6797\\109\\-145.1185\\-176.8203\\109\\-144.2192\\-165.1016\\109\\-143.988\\-163.1484\\109\\-143.1461\\-159.2422\\109\\-142.3523\\-153.3828\\109\\-141.9772\\-151.4297\\109\\-140.797\\-147.5234\\109\\-140.3562\\-145.5703\\109\\-138.9216\\-141.6641\\109\\-138.4318\\-139.7109\\109\\-136.8695\\-135.8047\\109\\-136.369\\-133.8516\\109\\-135.4411\\-131.8984\\109\\-134.6763\\-129.9453\\109\\-132.616\\-126.0391\\109\\-131.392\\-124.0859\\109\\-130.5106\\-122.1328\\109\\-129.2477\\-120.1797\\109\\-128.1357\\-118.2266\\109\\-126.6819\\-116.2734\\109\\-121.8921\\-110.4141\\109\\-120.1172\\-108.581\\109\\-115.7148\\-104.5547\\109\\-112.3047\\-101.8008\\109\\-110.3516\\-100.5284\\109\\-108.3984\\-99.45766\\109\\-106.4453\\-98.12962\\109\\-104.4922\\-97.1451\\109\\-102.5391\\-95.95972\\109\\-100.5859\\-95.13581\\109\\-98.63281\\-94.11446\\109\\-96.67969\\-93.57145\\109\\-94.72656\\-92.64893\\109\\-92.77344\\-91.92484\\109\\-90.82031\\-91.29851\\109\\-88.86719\\-90.43258\\109\\-84.96094\\-89.52173\\109\\-81.05469\\-88.45151\\109\\-79.10156\\-88.15217\\109\\-73.24219\\-87.54511\\109\\-71.28906\\-87.30451\\109\\-67.38281\\-86.66267\\109\\-61.52344\\-86.20766\\109\\-55.66406\\-85.93226\\109\\-53.71094\\-85.78164\\109\\-47.85156\\-85.59753\\109\\-40.03906\\-84.94267\\109\\-36.13281\\-84.69791\\109\\-30.27344\\-84.5322\\109\\-26.36719\\-84.5322\\109\\-22.46094\\-84.6365\\109\\-16.60156\\-85.01581\\109\\-10.74219\\-85.68062\\109\\-6.835938\\-86.29178\\109\\-4.882813\\-86.70058\\109\\-2.929688\\-87.38287\\109\\-0.9765625\\-87.73611\\109\\0.9765625\\-87.90399\\109\\2.929688\\-87.88599\\109\\6.835938\\-87.47182\\109\\8.789063\\-87.08148\\109\\10.74219\\-86.52734\\109\\14.64844\\-85.62679\\109\\18.55469\\-84.616\\109\\22.46094\\-84.07594\\109\\24.41406\\-83.939\\109\\32.22656\\-83.76786\\109\\36.13281\\-83.80979\\109\\45.89844\\-84.25653\\109\\51.75781\\-84.69791\\109\\57.61719\\-85.37553\\109\\69.33594\\-86.33533\\109\\71.28906\\-86.57132\\109\\75.19531\\-87.32584\\109\\77.14844\\-87.6424\\109\\81.05469\\-88.11588\\109\\83.00781\\-88.49492\\109\\86.91406\\-89.68131\\109\\88.86719\\-90.10262\\109\\90.82031\\-90.71886\\109\\92.77344\\-91.54734\\109\\94.72656\\-92.07334\\109\\96.67969\\-92.92471\\109\\98.63281\\-93.66509\\109\\100.5859\\-94.23389\\109\\102.5391\\-95.26695\\109\\104.4922\\-96.15887\\109\\106.4453\\-97.49194\\109\\110.3516\\-100.0042\\109\\114.0527\\-102.6016\\109\\116.2109\\-104.3691\\109\\120.1172\\-108.0509\\109\\122.2796\\-110.4141\\109\\123.5574\\-112.3672\\109\\126.5892\\-116.2734\\109\\127.9297\\-118.4374\\109\\130.075\\-122.1328\\109\\130.8945\\-124.0859\\109\\131.9328\\-126.0391\\109\\133.7891\\-130.0945\\109\\134.5576\\-131.8984\\109\\135.1318\\-133.8516\\109\\135.9863\\-135.8047\\109\\136.5519\\-137.7578\\109\\136.9644\\-139.7109\\109\\137.5625\\-141.6641\\109\\138.3188\\-143.6172\\109\\139.1944\\-147.5234\\109\\139.9208\\-149.4766\\109\\140.3902\\-151.4297\\109\\141.0461\\-155.3359\\109\\141.9155\\-159.2422\\109\\142.4033\\-163.1484\\109\\142.56\\-165.1016\\109\\143.285\\-176.8203\\109\\143.5785\\-182.6797\\109\\143.5785\\-186.5859\\109\\143.4991\\-190.4922\\109\\143.2339\\-194.3984\\109\\143.0238\\-198.3047\\109\\142.4888\\-206.1172\\109\\142.2956\\-208.0703\\109\\141.9772\\-210.0234\\109\\140.9563\\-213.9297\\109\\140.0776\\-217.8359\\109\\139.1982\\-219.7891\\109\\138.5874\\-221.7422\\109\\137.8192\\-223.6953\\109\\136.8556\\-225.6484\\109\\136.1228\\-227.6016\\109\\133.7891\\-231.3145\\109\\132.3369\\-233.4609\\109\\129.8828\\-236.4982\\109\\127.314\\-239.3203\\109\\124.0234\\-242.578\\109\\122.0703\\-244.2506\\109\\121.1215\\-245.1797\\109\\118.8217\\-247.1328\\109\\118.1641\\-247.7861\\109\\116.2109\\-249.3987\\109\\114.2578\\-250.6646\\109\\112.3047\\-252.2193\\109\\108.3984\\-255.6209\\109\\104.4922\\-258.5285\\109\\101.9149\\-260.8047\\109\\94.72656\\-266.7448\\109\\90.82031\\-269.6927\\109\\89.79762\\-270.5703\\109\\86.91406\\-272.8213\\109\\81.05469\\-277.0423\\109\\79.10156\\-278.2665\\109\\75.19531\\-281.1184\\109\\71.28906\\-283.3083\\109\\69.33594\\-284.6241\\109\\67.38281\\-285.6227\\109\\65.42969\\-286.938\\109\\63.47656\\-287.8914\\109\\61.52344\\-288.9673\\109\\59.57031\\-289.6033\\109\\57.61719\\-290.7835\\109\\55.66406\\-291.5109\\109\\53.71094\\-292.6664\\109\\51.75781\\-293.3549\\109\\49.80469\\-294.3401\\109\\47.85156\\-294.9432\\109\\45.89844\\-295.3983\\109\\43.94531\\-296.2369\\109\\41.99219\\-296.7836\\109\\40.03906\\-297.1953\\109\\36.13281\\-298.5599\\109\\32.22656\\-299.3972\\109\\30.27344\\-300.0416\\109\\28.32031\\-300.4474\\109\\20.50781\\-301.4066\\109\\16.60156\\-301.9931\\109\\12.69531\\-302.37\\109\\6.835938\\-302.6263\\109\\0.9765625\\-302.7003\\109\\-4.882813\\-302.6697\\109\\-10.74219\\-302.5021\\109\\-14.64844\\-302.2232\\109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "181" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-301.4925\\111\\-28.32031\\-300.4589\\111\\-30.27344\\-300.0666\\111\\-32.22656\\-299.4227\\111\\-36.13281\\-298.5668\\111\\-40.03906\\-297.1857\\111\\-41.99219\\-296.7791\\111\\-43.94531\\-296.1723\\111\\-45.89844\\-295.3724\\111\\-47.85156\\-294.9134\\111\\-49.80469\\-294.3265\\111\\-51.75781\\-293.3357\\111\\-53.71094\\-292.6629\\111\\-55.66406\\-291.5141\\111\\-57.61719\\-290.8045\\111\\-59.57031\\-289.6331\\111\\-61.52344\\-288.9984\\111\\-65.42969\\-287.0299\\111\\-67.38281\\-285.8008\\111\\-69.33594\\-284.817\\111\\-71.28906\\-283.5067\\111\\-73.24219\\-282.6146\\111\\-75.19531\\-281.4029\\111\\-77.09478\\-280.3359\\111\\-79.10156\\-279.0598\\111\\-81.05469\\-277.6095\\111\\-83.00781\\-276.5746\\111\\-84.96094\\-275.404\\111\\-86.91406\\-274.1354\\111\\-88.86719\\-273.0384\\111\\-90.82031\\-271.5807\\111\\-92.77344\\-270.221\\111\\-94.72656\\-269.3257\\111\\-96.67969\\-267.9381\\111\\-98.63281\\-266.6883\\111\\-101.5302\\-264.7109\\111\\-102.5391\\-263.9131\\111\\-106.4453\\-261.4967\\111\\-112.3047\\-256.89\\111\\-114.2578\\-255.5617\\111\\-116.2109\\-253.8641\\111\\-120.1172\\-250.1471\\111\\-122.0703\\-248.4273\\111\\-126.847\\-243.2266\\111\\-128.5453\\-241.2734\\111\\-131.1826\\-237.3672\\111\\-131.8359\\-236.5184\\111\\-133.8882\\-233.4609\\111\\-136.0092\\-229.5547\\111\\-136.8001\\-227.6016\\111\\-138.5448\\-223.6953\\111\\-139.284\\-221.7422\\111\\-140.2196\\-219.7891\\111\\-141.3756\\-215.8828\\111\\-142.0591\\-213.9297\\111\\-142.4786\\-211.9766\\111\\-143.1183\\-208.0703\\111\\-144.0397\\-204.1641\\111\\-144.2929\\-202.2109\\111\\-144.6094\\-198.3047\\111\\-144.8468\\-194.3984\\111\\-144.9632\\-190.4922\\111\\-144.9667\\-186.5859\\111\\-144.7052\\-178.7734\\111\\-144.3988\\-172.9141\\111\\-144.1048\\-169.0078\\111\\-143.5941\\-165.1016\\111\\-142.9532\\-161.1953\\111\\-142.2796\\-155.3359\\111\\-141.8796\\-153.3828\\111\\-141.3058\\-151.4297\\111\\-140.4026\\-147.5234\\111\\-139.8253\\-145.5703\\111\\-139.019\\-143.6172\\111\\-138.0034\\-139.7109\\111\\-137.0939\\-137.7578\\111\\-136.589\\-135.8047\\111\\-135.9219\\-133.8516\\111\\-134.9847\\-131.8984\\111\\-134.2678\\-129.9453\\111\\-133.0906\\-127.9922\\111\\-132.1706\\-126.0391\\111\\-130.9792\\-124.0859\\111\\-130.0904\\-122.1328\\111\\-128.8737\\-120.1797\\111\\-126.1561\\-116.2734\\111\\-123.0259\\-112.3672\\111\\-121.2773\\-110.4141\\111\\-118.1641\\-107.2963\\111\\-115.1199\\-104.5547\\111\\-112.3047\\-102.2834\\111\\-109.7636\\-100.6484\\111\\-106.4453\\-98.6277\\111\\-104.4922\\-97.61349\\111\\-102.5391\\-96.32366\\111\\-100.5859\\-95.52759\\111\\-98.63281\\-94.47569\\111\\-94.72656\\-93.23354\\111\\-92.77344\\-92.3147\\111\\-90.82031\\-91.75893\\111\\-86.91406\\-90.31217\\111\\-83.00781\\-89.49731\\111\\-79.10156\\-88.51517\\111\\-75.19531\\-87.98952\\111\\-71.28906\\-87.67591\\111\\-65.42969\\-87.03306\\111\\-61.52344\\-86.54037\\111\\-59.57031\\-86.40033\\111\\-55.66406\\-86.21889\\111\\-49.80469\\-85.88214\\111\\-47.85156\\-85.82345\\111\\-41.99219\\-85.46384\\111\\-36.13281\\-85.01581\\111\\-32.22656\\-84.90137\\111\\-26.36719\\-84.79964\\111\\-22.46094\\-84.98588\\111\\-16.60156\\-85.37553\\111\\-12.69531\\-85.72013\\111\\-8.789063\\-86.30003\\111\\-6.835938\\-86.63958\\111\\-2.929688\\-87.73891\\111\\0.9765625\\-88.15971\\111\\2.929688\\-88.12729\\111\\6.835938\\-87.84116\\111\\8.789063\\-87.60341\\111\\12.69531\\-86.44102\\111\\14.64844\\-85.93529\\111\\20.50781\\-84.71331\\111\\22.46094\\-84.43871\\111\\26.36719\\-84.11901\\111\\32.22656\\-83.97635\\111\\38.08594\\-84.04688\\111\\45.89844\\-84.46948\\111\\49.80469\\-84.81174\\111\\53.71094\\-85.31709\\111\\55.66406\\-85.51172\\111\\61.52344\\-85.94032\\111\\67.38281\\-86.42993\\111\\69.33594\\-86.67662\\111\\73.24219\\-87.37416\\111\\75.19531\\-87.65508\\111\\79.10156\\-88.09692\\111\\81.05469\\-88.3929\\111\\84.96094\\-89.55539\\111\\88.86719\\-90.4687\\111\\90.82031\\-91.32322\\111\\94.72656\\-92.49317\\111\\96.67969\\-93.4139\\111\\98.63281\\-93.94934\\111\\102.5391\\-95.69676\\111\\104.4806\\-96.74219\\111\\107.5627\\-98.69531\\111\\108.3984\\-99.32059\\111\\112.3047\\-101.7969\\111\\115.6586\\-104.5547\\111\\120.1172\\-108.789\\111\\121.582\\-110.4141\\111\\124.6378\\-114.3203\\111\\125.9996\\-116.2734\\111\\128.5608\\-120.1797\\111\\129.448\\-122.1328\\111\\130.5857\\-124.0859\\111\\131.3039\\-126.0391\\111\\132.4016\\-127.9922\\111\\133.1281\\-129.9453\\111\\134.1302\\-131.8984\\111\\135.3698\\-135.8047\\111\\136.1677\\-137.7578\\111\\136.646\\-139.7109\\111\\137.0136\\-141.6641\\111\\138.3334\\-145.5703\\111\\139.1478\\-149.4766\\111\\139.8241\\-151.4297\\111\\140.275\\-153.3828\\111\\140.8395\\-157.2891\\111\\141.9409\\-163.1484\\111\\142.1913\\-165.1016\\111\\142.4756\\-169.0078\\111\\142.686\\-172.9141\\111\\142.97\\-182.6797\\111\\142.9572\\-188.5391\\111\\142.8889\\-192.4453\\111\\142.5781\\-200.2578\\111\\142.3\\-204.1641\\111\\142.0931\\-206.1172\\111\\141.7581\\-208.0703\\111\\141.2581\\-210.0234\\111\\140.5029\\-213.9297\\111\\140.0679\\-215.8828\\111\\139.2723\\-217.8359\\111\\138.1022\\-221.7422\\111\\137.1041\\-223.6953\\111\\136.4841\\-225.6484\\111\\135.3903\\-227.6016\\111\\134.4069\\-229.5547\\111\\133.7891\\-230.3376\\111\\130.1804\\-235.4141\\111\\128.5335\\-237.3672\\111\\124.0234\\-242.0475\\111\\120.6167\\-245.1797\\111\\118.1641\\-247.3594\\111\\116.1066\\-249.0859\\111\\114.2578\\-250.3902\\111\\112.3047\\-252.0099\\111\\110.3516\\-253.819\\111\\108.3984\\-255.5243\\111\\104.4922\\-258.5412\\111\\101.9546\\-260.8047\\111\\99.57862\\-262.7578\\111\\94.72656\\-266.9557\\111\\90.82031\\-269.8532\\111\\86.91406\\-273.0422\\111\\84.96094\\-274.5504\\111\\83.00781\\-275.8033\\111\\82.23815\\-276.4297\\111\\79.40383\\-278.3828\\111\\79.10156\\-278.667\\111\\75.19531\\-281.3125\\111\\73.24219\\-282.5237\\111\\71.28906\\-283.505\\111\\69.33594\\-284.8801\\111\\63.47656\\-288.25\\111\\59.57031\\-289.8854\\111\\57.61719\\-290.9586\\111\\55.66406\\-291.814\\111\\53.71094\\-292.8537\\111\\51.75781\\-293.5802\\111\\49.80469\\-294.5468\\111\\45.89844\\-295.5689\\111\\43.94531\\-296.4396\\111\\40.03906\\-297.3434\\111\\38.08594\\-298.1616\\111\\36.13281\\-298.6904\\111\\34.17969\\-299.0808\\111\\32.22656\\-299.5891\\111\\30.27344\\-300.216\\111\\28.32031\\-300.5463\\111\\20.50781\\-301.5423\\111\\16.60156\\-302.1621\\111\\12.69531\\-302.4817\\111\\6.835938\\-302.7003\\111\\0.9765625\\-302.7748\\111\\-4.882813\\-302.7411\\111\\-10.74219\\-302.5956\\111\\-14.64844\\-302.3477\\111\\-16.60156\\-302.1505\\111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "252" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "182" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-302.0201\\113\\-20.50781\\-301.6353\\113\\-24.41406\\-301.0594\\113\\-28.32031\\-300.5575\\113\\-30.27344\\-300.216\\113\\-32.22656\\-299.599\\113\\-36.13281\\-298.6807\\113\\-38.08594\\-298.1258\\113\\-40.03906\\-297.3144\\113\\-43.94531\\-296.3662\\113\\-45.89844\\-295.5097\\113\\-49.80469\\-294.4865\\113\\-51.75781\\-293.4857\\113\\-53.71094\\-292.7712\\113\\-55.66406\\-291.6703\\113\\-57.61719\\-290.9128\\113\\-59.57031\\-289.7831\\113\\-61.52344\\-289.0895\\113\\-63.47656\\-288.2036\\113\\-69.33594\\-284.9023\\113\\-71.28906\\-283.5555\\113\\-73.24219\\-282.6755\\113\\-75.19531\\-281.4391\\113\\-77.14844\\-280.3439\\113\\-79.10156\\-279.0676\\113\\-81.05469\\-277.5869\\113\\-83.00781\\-276.5305\\113\\-84.96094\\-275.3412\\113\\-86.91406\\-274.0106\\113\\-88.86719\\-272.8722\\113\\-92.06543\\-270.5703\\113\\-92.77344\\-270.0001\\113\\-94.72656\\-269.0845\\113\\-98.63281\\-266.2018\\113\\-100.5859\\-264.9833\\113\\-104.4922\\-262.2309\\113\\-106.4453\\-260.9788\\113\\-108.3984\\-259.5005\\113\\-112.3047\\-256.2726\\113\\-114.0498\\-254.9453\\113\\-116.2109\\-253.125\\113\\-118.4372\\-251.0391\\113\\-120.1172\\-249.592\\113\\-122.6519\\-247.1328\\113\\-126.0173\\-243.2266\\113\\-127.9297\\-240.9326\\113\\-130.5496\\-237.3672\\113\\-133.7891\\-232.2136\\113\\-134.2876\\-231.5078\\113\\-135.1617\\-229.5547\\113\\-136.2817\\-227.6016\\113\\-136.9128\\-225.6484\\113\\-137.8762\\-223.6953\\113\\-139.2755\\-219.7891\\113\\-140.1772\\-217.8359\\113\\-141.183\\-213.9297\\113\\-141.8566\\-211.9766\\113\\-142.31\\-210.0234\\113\\-143.1655\\-204.1641\\113\\-143.8802\\-200.2578\\113\\-144.1083\\-198.3047\\113\\-144.3325\\-194.3984\\113\\-144.427\\-190.4922\\113\\-144.439\\-186.5859\\113\\-144.3894\\-182.6797\\113\\-144.1799\\-176.8203\\113\\-143.8802\\-172.9141\\113\\-143.6546\\-170.9609\\113\\-143.1003\\-167.0547\\113\\-142.5781\\-161.1953\\113\\-142.1193\\-157.2891\\113\\-141.716\\-155.3359\\113\\-141.1553\\-153.3828\\113\\-140.3795\\-149.4766\\113\\-139.8507\\-147.5234\\113\\-139.0553\\-145.5703\\113\\-138.0772\\-141.6641\\113\\-137.3119\\-139.7109\\113\\-136.188\\-135.8047\\113\\-135.2782\\-133.8516\\113\\-134.6029\\-131.8984\\113\\-132.6788\\-127.9922\\113\\-131.5178\\-126.0391\\113\\-130.6431\\-124.0859\\113\\-129.4592\\-122.1328\\113\\-128.463\\-120.1797\\113\\-127.0203\\-118.2266\\113\\-125.4433\\-116.2734\\113\\-124.0316\\-114.3203\\113\\-122.4594\\-112.3672\\113\\-120.7092\\-110.4141\\113\\-118.1641\\-107.8793\\113\\-114.2578\\-104.4445\\113\\-111.8738\\-102.6016\\113\\-108.3984\\-100.2058\\113\\-106.4453\\-99.23711\\113\\-104.4922\\-97.96733\\113\\-100.5859\\-95.83943\\113\\-96.67969\\-94.09334\\113\\-94.72656\\-93.62078\\113\\-90.82031\\-92.10491\\113\\-88.86719\\-91.5676\\113\\-86.91406\\-90.83023\\113\\-84.96094\\-90.23748\\113\\-81.05469\\-89.55059\\113\\-77.14844\\-88.64116\\113\\-75.19531\\-88.27649\\113\\-69.33594\\-87.76887\\113\\-65.42969\\-87.52423\\113\\-61.52344\\-87.03306\\113\\-57.61719\\-86.61713\\113\\-45.89844\\-85.92276\\113\\-41.99219\\-85.72179\\113\\-36.13281\\-85.35574\\113\\-30.27344\\-85.30343\\113\\-26.36719\\-85.17999\\113\\-16.60156\\-85.62855\\113\\-14.64844\\-85.79441\\113\\-10.74219\\-86.25967\\113\\-8.789063\\-86.60614\\113\\-4.882813\\-87.61683\\113\\-2.929688\\-87.96526\\113\\0.9765625\\-88.46892\\113\\2.929688\\-88.45516\\113\\8.789063\\-87.89819\\113\\10.74219\\-87.5811\\113\\14.64844\\-86.29178\\113\\16.60156\\-85.86787\\113\\18.55469\\-85.58418\\113\\22.46094\\-84.84779\\113\\26.36719\\-84.43522\\113\\30.27344\\-84.23447\\113\\34.17969\\-84.16964\\113\\38.08594\\-84.24331\\113\\45.89844\\-84.67692\\113\\47.85156\\-84.824\\113\\51.75781\\-85.37315\\113\\55.66406\\-85.73214\\113\\59.57031\\-85.9839\\113\\63.47656\\-86.31595\\113\\67.38281\\-86.77979\\113\\71.28906\\-87.43094\\113\\73.24219\\-87.69188\\113\\77.14844\\-88.07295\\113\\79.10156\\-88.33115\\113\\81.05469\\-88.78696\\113\\83.00781\\-89.43352\\113\\86.91406\\-90.28571\\113\\88.86719\\-91.06232\\113\\90.82031\\-91.71289\\113\\92.77344\\-92.23978\\113\\94.72656\\-93.10967\\113\\96.67969\\-93.75185\\113\\98.63281\\-94.29053\\113\\100.5859\\-95.31033\\113\\102.5391\\-96.08476\\113\\104.4922\\-97.38223\\113\\106.4453\\-98.5\\113\\112.3047\\-102.3613\\113\\115.0625\\-104.5547\\113\\118.1641\\-107.4042\\113\\120.1172\\-109.3887\\113\\122.7144\\-112.3672\\113\\124.1101\\-114.3203\\113\\125.3451\\-116.2734\\113\\126.7913\\-118.2266\\113\\128.0625\\-120.1797\\113\\129.0394\\-122.1328\\113\\130.1437\\-124.0859\\113\\130.92\\-126.0391\\113\\132.7046\\-129.9453\\113\\133.4383\\-131.8984\\113\\134.3858\\-133.8516\\113\\135.5378\\-137.7578\\113\\136.284\\-139.7109\\113\\137.0546\\-143.6172\\113\\138.3036\\-147.5234\\113\\139.0417\\-151.4297\\113\\140.1155\\-155.3359\\113\\141.2018\\-163.1484\\113\\141.5482\\-165.1016\\113\\142.0569\\-169.0078\\113\\142.3355\\-172.9141\\113\\142.5302\\-178.7734\\113\\142.6079\\-182.6797\\113\\142.5901\\-188.5391\\113\\142.5359\\-192.4453\\113\\142.4223\\-196.3516\\113\\142.2127\\-200.2578\\113\\141.7581\\-204.1641\\113\\141.0304\\-208.0703\\113\\140.4026\\-211.9766\\113\\139.9696\\-213.9297\\113\\139.2437\\-215.8828\\113\\138.2102\\-219.7891\\113\\137.3061\\-221.7422\\113\\136.6819\\-223.6953\\113\\135.9205\\-225.6484\\113\\133.7891\\-229.3988\\113\\132.3836\\-231.5078\\113\\130.8281\\-233.4609\\113\\129.8828\\-234.8138\\113\\127.9297\\-237.1592\\113\\125.9014\\-239.3203\\113\\124.0234\\-241.4203\\113\\122.0703\\-243.3661\\113\\120.1172\\-245.0263\\113\\115.673\\-249.0859\\113\\114.2578\\-250.1496\\113\\111.0397\\-252.9922\\113\\108.3984\\-255.4408\\113\\104.4922\\-258.554\\113\\102.0358\\-260.8047\\113\\99.6933\\-262.7578\\113\\94.72656\\-267.1555\\113\\90.82031\\-270.0357\\113\\86.91406\\-273.2804\\113\\84.96094\\-274.8363\\113\\81.05469\\-277.4173\\113\\79.10156\\-278.9764\\113\\77.14844\\-280.3753\\113\\75.19531\\-281.509\\113\\73.24219\\-282.8211\\113\\71.28906\\-283.7677\\113\\70.69798\\-284.2422\\113\\67.38281\\-286.3735\\113\\65.42969\\-287.3565\\113\\63.47656\\-288.5571\\113\\61.52344\\-289.2368\\113\\59.57031\\-290.2523\\113\\57.61719\\-291.1194\\113\\55.66406\\-292.2033\\113\\49.80469\\-294.7054\\113\\47.85156\\-295.1736\\113\\45.89844\\-295.802\\113\\43.94531\\-296.5983\\113\\41.99219\\-297.0043\\113\\40.03906\\-297.5247\\113\\38.08594\\-298.367\\113\\34.17969\\-299.2253\\113\\30.27344\\-300.3525\\113\\28.32031\\-300.6429\\113\\22.46094\\-301.3855\\113\\18.55469\\-302.0349\\113\\16.60156\\-302.302\\113\\12.69531\\-302.5765\\113\\6.835938\\-302.7638\\113\\0.9765625\\-302.8344\\113\\-4.882813\\-302.8023\\113\\-8.789063\\-302.7291\\113\\-12.69531\\-302.5838\\113\\-16.60156\\-302.2818\\113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "183" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-302.1505\\115\\-22.46094\\-301.4337\\115\\-28.32031\\-300.6495\\115\\-30.27344\\-300.3434\\115\\-32.11031\\-299.8672\\115\\-34.17969\\-299.2216\\115\\-38.08594\\-298.3205\\115\\-40.03906\\-297.4793\\115\\-43.94531\\-296.5457\\115\\-45.89844\\-295.6665\\115\\-49.80469\\-294.6036\\115\\-51.75781\\-293.6473\\115\\-53.71094\\-292.8736\\115\\-55.66406\\-291.8538\\115\\-57.61719\\-291.0065\\115\\-59.57031\\-289.9853\\115\\-63.47656\\-288.3778\\115\\-69.33594\\-284.9987\\115\\-71.28906\\-283.623\\115\\-73.24219\\-282.7329\\115\\-75.19531\\-281.4651\\115\\-77.14844\\-280.375\\115\\-79.10156\\-279.0718\\115\\-81.05469\\-277.5802\\115\\-83.00781\\-276.5006\\115\\-84.96094\\-275.3163\\115\\-86.91406\\-273.9177\\115\\-88.86719\\-272.7104\\115\\-92.77344\\-269.8664\\115\\-94.72656\\-268.7954\\115\\-96.67969\\-267.4318\\115\\-98.63281\\-265.8512\\115\\-100.5859\\-264.45\\115\\-102.5391\\-263.28\\115\\-108.3984\\-258.8594\\115\\-112.3047\\-255.793\\115\\-114.2578\\-254.0867\\115\\-120.1172\\-248.6674\\115\\-121.6872\\-247.1328\\115\\-125.1157\\-243.2266\\115\\-125.9766\\-242.3115\\115\\-128.4539\\-239.3203\\115\\-130.938\\-235.4141\\115\\-132.3178\\-233.4609\\115\\-133.2705\\-231.5078\\115\\-134.5408\\-229.5547\\115\\-135.3616\\-227.6016\\115\\-136.3685\\-225.6484\\115\\-136.9893\\-223.6953\\115\\-137.9005\\-221.7422\\115\\-139.17\\-217.8359\\115\\-139.9896\\-215.8828\\115\\-140.9444\\-211.9766\\115\\-142.0379\\-208.0703\\115\\-142.3562\\-206.1172\\115\\-143.2096\\-198.3047\\115\\-143.5941\\-194.3984\\115\\-143.8042\\-190.4922\\115\\-143.8525\\-186.5859\\115\\-143.7916\\-182.6797\\115\\-143.5627\\-178.7734\\115\\-143.2002\\-174.8672\\115\\-142.6575\\-167.0547\\115\\-142.1456\\-161.1953\\115\\-140.9525\\-155.3359\\115\\-140.2552\\-151.4297\\115\\-139.7155\\-149.4766\\115\\-139.0033\\-147.5234\\115\\-138.0591\\-143.6172\\115\\-137.3147\\-141.6641\\115\\-136.3281\\-137.7578\\115\\-135.4813\\-135.8047\\115\\-134.0792\\-131.8984\\115\\-133.0042\\-129.9453\\115\\-132.1637\\-127.9922\\115\\-131.0106\\-126.0391\\115\\-130.1586\\-124.0859\\115\\-127.9297\\-120.3424\\115\\-126.5206\\-118.2266\\115\\-124.0234\\-115.0671\\115\\-121.7599\\-112.3672\\115\\-120.1172\\-110.5403\\115\\-118.1641\\-108.5189\\115\\-115.9712\\-106.5078\\115\\-113.5938\\-104.5547\\115\\-110.3516\\-101.9757\\115\\-108.214\\-100.6484\\115\\-106.4453\\-99.66585\\115\\-104.4922\\-98.40932\\115\\-102.5391\\-97.40747\\115\\-100.5859\\-96.19022\\115\\-98.63281\\-95.4632\\115\\-96.67969\\-94.48801\\115\\-94.72656\\-93.86609\\115\\-92.77344\\-93.39304\\115\\-90.82031\\-92.51479\\115\\-86.91406\\-91.43823\\115\\-84.96094\\-90.7059\\115\\-83.00781\\-90.2489\\115\\-77.14844\\-89.26431\\115\\-75.19531\\-88.75283\\115\\-73.24219\\-88.4111\\115\\-69.33594\\-88.02591\\115\\-65.42969\\-87.818\\115\\-59.57031\\-87.3401\\115\\-55.66406\\-86.84787\\115\\-49.80469\\-86.39896\\115\\-45.89844\\-86.18105\\115\\-38.08594\\-85.69592\\115\\-36.13281\\-85.62022\\115\\-30.27344\\-85.5857\\115\\-26.36719\\-85.52117\\115\\-20.50781\\-85.68423\\115\\-16.60156\\-85.8467\\115\\-12.69531\\-86.25256\\115\\-10.74219\\-86.54037\\115\\-6.835938\\-87.55849\\115\\-2.929688\\-88.20979\\115\\0.9765625\\-89.04237\\115\\2.929688\\-89.05838\\115\\8.789063\\-88.13973\\115\\10.74219\\-87.89092\\115\\12.69531\\-87.44728\\115\\14.64844\\-86.64194\\115\\16.60156\\-86.18521\\115\\24.56826\\-85.02344\\115\\26.36719\\-84.78771\\115\\30.27344\\-84.51469\\115\\36.13281\\-84.39359\\115\\40.03906\\-84.53226\\115\\45.89844\\-84.86185\\115\\47.85156\\-85.04688\\115\\51.75781\\-85.58062\\115\\59.57031\\-86.18105\\115\\63.47656\\-86.56365\\115\\67.38281\\-87.19275\\115\\71.28906\\-87.69971\\115\\77.14844\\-88.28071\\115\\79.10156\\-88.67837\\115\\81.05469\\-89.30327\\115\\84.96094\\-90.15314\\115\\86.91406\\-90.75983\\115\\88.86719\\-91.54343\\115\\90.82031\\-92.03645\\115\\92.77344\\-92.69951\\115\\94.72656\\-93.54332\\115\\96.67969\\-94.01411\\115\\100.5859\\-95.6946\\115\\102.5391\\-96.64063\\115\\104.4922\\-97.87327\\115\\106.4453\\-99.22861\\115\\108.3984\\-100.2421\\115\\111.7374\\-102.6016\\115\\114.2578\\-104.5171\\115\\118.1641\\-108.0108\\115\\120.4542\\-110.4141\\115\\122.096\\-112.3672\\115\\126.3248\\-118.2266\\115\\127.4111\\-120.1797\\115\\128.6716\\-122.1328\\115\\129.5022\\-124.0859\\115\\130.5446\\-126.0391\\115\\131.2086\\-127.9922\\115\\132.2428\\-129.9453\\115\\132.9129\\-131.8984\\115\\133.7968\\-133.8516\\115\\134.5127\\-135.8047\\115\\135.019\\-137.7578\\115\\136.3386\\-141.6641\\115\\137.038\\-145.5703\\115\\138.2127\\-149.4766\\115\\138.8683\\-153.3828\\115\\139.2723\\-155.3359\\115\\139.8112\\-157.2891\\115\\140.1838\\-159.2422\\115\\141.0762\\-167.0547\\115\\141.7717\\-172.9141\\115\\142.0229\\-176.8203\\115\\142.1605\\-180.7266\\115\\142.2079\\-186.5859\\115\\142.1642\\-190.4922\\115\\141.9294\\-196.3516\\115\\141.7717\\-198.3047\\115\\140.7731\\-206.1172\\115\\140.2321\\-210.0234\\115\\139.7586\\-211.9766\\115\\139.0999\\-213.9297\\115\\138.2166\\-217.8359\\115\\137.409\\-219.7891\\115\\136.1989\\-223.6953\\115\\135.1509\\-225.6484\\115\\134.2839\\-227.6016\\115\\131.4468\\-231.5078\\115\\128.7458\\-235.4141\\115\\125.1518\\-239.3203\\115\\124.0234\\-240.6148\\115\\121.5439\\-243.2266\\115\\120.1172\\-244.4522\\115\\116.2109\\-248.2654\\115\\112.3047\\-251.7176\\115\\108.3984\\-255.4155\\115\\104.4922\\-258.6094\\115\\102.1949\\-260.8047\\115\\100.5859\\-262.1046\\115\\98.63281\\-263.8069\\115\\94.72656\\-267.3378\\115\\92.77344\\-268.8973\\115\\90.82031\\-270.268\\115\\86.91406\\-273.5229\\115\\84.96094\\-275.0894\\115\\82.99842\\-276.4297\\115\\81.05469\\-277.6475\\115\\79.10156\\-279.2307\\115\\77.14844\\-280.7083\\115\\75.19531\\-281.7227\\115\\73.24219\\-283.0591\\115\\71.28906\\-284.1221\\115\\69.33594\\-285.3415\\115\\67.38281\\-286.6805\\115\\65.42969\\-287.5895\\115\\63.47656\\-288.7758\\115\\61.52344\\-289.3766\\115\\59.57031\\-290.5432\\115\\57.61719\\-291.2964\\115\\55.66406\\-292.4706\\115\\53.71094\\-293.202\\115\\51.75781\\-294.1494\\115\\49.80469\\-294.8423\\115\\47.85156\\-295.3036\\115\\45.89844\\-296.0754\\115\\43.94531\\-296.7302\\115\\41.99219\\-297.1296\\115\\40.03906\\-297.761\\115\\38.08594\\-298.5171\\115\\34.17969\\-299.403\\115\\32.22656\\-300.0428\\115\\30.27344\\-300.4624\\115\\22.46094\\-301.5182\\115\\18.55469\\-302.1985\\115\\16.60156\\-302.4101\\115\\12.69531\\-302.6648\\115\\4.882813\\-302.8503\\115\\-0.9765625\\-302.8929\\115\\-4.882813\\-302.8716\\115\\-12.69531\\-302.6648\\115\\-16.60156\\-302.3884\\115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "184" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-301.9781\\117\\-22.46094\\-301.5566\\117\\-30.27344\\-300.4427\\117\\-32.22656\\-300.0428\\117\\-34.17969\\-299.3611\\117\\-38.08594\\-298.4792\\117\\-40.03906\\-297.6699\\117\\-41.99219\\-297.0628\\117\\-43.94531\\-296.6737\\117\\-45.89844\\-295.8594\\117\\-47.85156\\-295.198\\117\\-49.80469\\-294.7131\\117\\-55.66406\\-292.1069\\117\\-57.61719\\-291.0988\\117\\-61.52344\\-289.2303\\117\\-63.47656\\-288.5208\\117\\-65.42969\\-287.3356\\117\\-67.54701\\-286.1953\\117\\-70.63526\\-284.2422\\117\\-71.28906\\-283.7174\\117\\-73.24219\\-282.8139\\117\\-75.19531\\-281.5115\\117\\-77.14844\\-280.4504\\117\\-79.10156\\-279.0914\\117\\-81.05469\\-277.5936\\117\\-84.96094\\-275.2841\\117\\-86.91406\\-273.8557\\117\\-88.86719\\-272.561\\117\\-92.77344\\-269.7555\\117\\-96.67969\\-267.1853\\117\\-97.26414\\-266.6641\\117\\-100.5859\\-264.0451\\117\\-102.5391\\-262.8317\\117\\-104.4922\\-261.4398\\117\\-105.16\\-260.8047\\117\\-107.6547\\-258.8516\\117\\-108.3984\\-258.1755\\117\\-112.3047\\-255.1614\\117\\-114.2578\\-253.4285\\117\\-118.1641\\-249.7394\\117\\-120.8512\\-247.1328\\117\\-122.6651\\-245.1797\\117\\-126.0006\\-241.2734\\117\\-128.9272\\-237.3672\\117\\-130.2749\\-235.4141\\117\\-131.2002\\-233.4609\\117\\-132.5479\\-231.5078\\117\\-134.6717\\-227.6016\\117\\-135.4772\\-225.6484\\117\\-136.3955\\-223.6953\\117\\-136.9645\\-221.7422\\117\\-137.7792\\-219.7891\\117\\-138.4452\\-217.8359\\117\\-138.9266\\-215.8828\\117\\-140.2565\\-211.9766\\117\\-141.0683\\-208.0703\\117\\-141.9794\\-204.1641\\117\\-142.4467\\-200.2578\\117\\-142.715\\-196.3516\\117\\-142.8841\\-192.4453\\117\\-142.9728\\-186.5859\\117\\-142.9321\\-182.6797\\117\\-142.8207\\-178.7734\\117\\-142.572\\-172.9141\\117\\-142.3418\\-169.0078\\117\\-141.9599\\-165.1016\\117\\-140.9525\\-159.2422\\117\\-140.3906\\-155.3359\\117\\-140.03\\-153.3828\\117\\-139.3885\\-151.4297\\117\\-137.948\\-145.5703\\117\\-137.2208\\-143.6172\\117\\-136.3642\\-139.7109\\117\\-135.5781\\-137.7578\\117\\-134.2773\\-133.8516\\117\\-133.274\\-131.8984\\117\\-132.4811\\-129.9453\\117\\-131.376\\-127.9922\\117\\-130.571\\-126.0391\\117\\-129.4511\\-124.0859\\117\\-128.5517\\-122.1328\\117\\-124.4154\\-116.2734\\117\\-122.8612\\-114.3203\\117\\-121.1462\\-112.3672\\117\\-118.1641\\-109.1424\\117\\-115.282\\-106.5078\\117\\-112.3047\\-104.0129\\117\\-110.3516\\-102.5271\\117\\-106.4453\\-100.0258\\117\\-104.4922\\-99.0551\\117\\-102.5391\\-97.80392\\117\\-100.5859\\-96.7345\\117\\-98.63281\\-95.80631\\117\\-96.67969\\-95.04605\\117\\-94.72656\\-94.1488\\117\\-92.77344\\-93.69118\\117\\-90.82031\\-93.06881\\117\\-88.86719\\-92.31859\\117\\-84.96094\\-91.34274\\117\\-81.05469\\-90.2922\\117\\-75.19531\\-89.36588\\117\\-71.28906\\-88.58543\\117\\-67.38281\\-88.16195\\117\\-65.42969\\-88.06368\\117\\-57.61719\\-87.52795\\117\\-55.66406\\-87.27989\\117\\-49.80469\\-86.72707\\117\\-43.94531\\-86.29297\\117\\-38.08594\\-85.92188\\117\\-36.13281\\-85.8467\\117\\-32.22656\\-85.797\\117\\-26.36719\\-85.77156\\117\\-20.50781\\-85.88214\\117\\-16.60156\\-86.09327\\117\\-12.69531\\-86.53032\\117\\-10.74219\\-86.95255\\117\\-8.789063\\-87.54511\\117\\-4.882813\\-88.15971\\117\\-2.929688\\-88.57523\\117\\-0.9765625\\-89.237\\117\\0.9765625\\-89.55492\\117\\2.929688\\-89.55059\\117\\4.882813\\-89.37593\\117\\6.835938\\-89.04503\\117\\8.789063\\-88.47628\\117\\12.69531\\-87.78191\\117\\16.60156\\-86.50096\\117\\22.46094\\-85.63148\\117\\30.27344\\-84.83643\\117\\36.13281\\-84.63157\\117\\40.03906\\-84.71947\\117\\45.89844\\-85.07769\\117\\49.80469\\-85.51172\\117\\53.71094\\-85.87193\\117\\55.66406\\-86\\117\\61.52344\\-86.57406\\117\\65.42969\\-87.21886\\117\\69.33594\\-87.69971\\117\\75.19531\\-88.25598\\117\\77.14844\\-88.57895\\117\\79.10156\\-89.17737\\117\\81.05469\\-89.66492\\117\\84.96094\\-90.52945\\117\\86.91406\\-91.35873\\117\\90.82031\\-92.40675\\117\\92.77344\\-93.27227\\117\\96.67969\\-94.39413\\117\\98.63281\\-95.36312\\117\\100.5859\\-96.06419\\117\\102.5391\\-97.32411\\117\\104.4922\\-98.38142\\117\\106.4453\\-99.69644\\117\\108.1461\\-100.6484\\117\\110.3516\\-102.0425\\117\\113.5274\\-104.5547\\117\\115.8255\\-106.5078\\117\\118.1641\\-108.7111\\117\\121.4126\\-112.3672\\117\\122.9858\\-114.3203\\117\\124.4236\\-116.2734\\117\\125.5732\\-118.2266\\117\\126.9348\\-120.1797\\117\\128.1684\\-122.1328\\117\\130.0167\\-126.0391\\117\\131.5226\\-129.9453\\117\\132.4654\\-131.8984\\117\\133.1001\\-133.8516\\117\\133.9554\\-135.8047\\117\\134.5833\\-137.7578\\117\\135.0555\\-139.7109\\117\\136.3163\\-143.6172\\117\\136.9845\\-147.5234\\117\\137.4111\\-149.4766\\117\\138.0165\\-151.4297\\117\\138.3882\\-153.3828\\117\\139.3073\\-159.2422\\117\\139.7723\\-161.1953\\117\\140.1184\\-163.1484\\117\\140.5268\\-167.0547\\117\\140.9686\\-172.9141\\117\\141.3176\\-178.7734\\117\\141.4327\\-182.6797\\117\\141.4588\\-186.5859\\117\\141.3156\\-192.4453\\117\\140.9725\\-198.3047\\117\\140.663\\-202.2109\\117\\140.2588\\-206.1172\\117\\139.877\\-208.0703\\117\\139.3411\\-210.0234\\117\\138.1147\\-215.8828\\117\\137.3796\\-217.8359\\117\\136.3147\\-221.7422\\117\\135.3559\\-223.6953\\117\\134.5262\\-225.6484\\117\\132.0858\\-229.5547\\117\\130.7189\\-231.5078\\117\\129.2341\\-233.4609\\117\\127.9382\\-235.4141\\117\\122.8966\\-241.2734\\117\\121.0375\\-243.2266\\117\\120.1172\\-244.0466\\117\\115.0836\\-249.0859\\117\\112.3047\\-251.5884\\117\\108.3984\\-255.419\\117\\104.4922\\-258.7132\\117\\102.3934\\-260.8047\\117\\100.5859\\-262.2064\\117\\98.63281\\-263.9283\\117\\94.72656\\-267.5232\\117\\92.77344\\-269.1682\\117\\90.86772\\-270.5703\\117\\84.96094\\-275.3294\\117\\83.00781\\-276.7715\\117\\81.05469\\-277.945\\117\\77.14844\\-280.972\\117\\75.19531\\-282.0431\\117\\71.28906\\-284.5222\\117\\69.33594\\-285.5911\\117\\67.38281\\-286.9164\\117\\65.42969\\-287.854\\117\\63.47656\\-288.9384\\117\\61.52344\\-289.5777\\117\\59.57031\\-290.7694\\117\\57.61719\\-291.5182\\117\\55.66406\\-292.6718\\117\\53.71094\\-293.3895\\117\\51.75781\\-294.3917\\117\\49.80469\\-294.9665\\117\\47.85156\\-295.4371\\117\\45.89844\\-296.3204\\117\\41.99219\\-297.2725\\117\\40.03906\\-298.0627\\117\\38.08594\\-298.6516\\117\\34.17969\\-299.6063\\117\\32.22656\\-300.231\\117\\30.27344\\-300.58\\117\\24.41406\\-301.3619\\117\\20.50781\\-302.0735\\117\\16.60156\\-302.5179\\117\\10.74219\\-302.7969\\117\\2.929688\\-302.9479\\117\\-0.9765625\\-302.9803\\117\\-6.835938\\-302.9036\\117\\-12.69531\\-302.7239\\117\\-16.60156\\-302.4817\\117\\-18.55469\\-302.2818\\117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "244" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "185" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-302.1365\\119\\-24.41406\\-301.3619\\119\\-30.27344\\-300.5468\\119\\-32.22656\\-300.1992\\119\\-34.17969\\-299.5352\\119\\-36.13281\\-299.0165\\119\\-38.08594\\-298.6182\\119\\-41.99219\\-297.1749\\119\\-43.94531\\-296.7667\\119\\-45.89844\\-296.1048\\119\\-47.85156\\-295.2911\\119\\-49.80469\\-294.8046\\119\\-51.75781\\-294.0314\\119\\-53.71094\\-293.0988\\119\\-55.66406\\-292.3477\\119\\-57.61719\\-291.2048\\119\\-59.57031\\-290.4249\\119\\-61.52344\\-289.3052\\119\\-63.47656\\-288.6401\\119\\-65.42969\\-287.4431\\119\\-67.38281\\-286.4869\\119\\-70.80503\\-284.2422\\119\\-71.28906\\-283.8417\\119\\-73.24219\\-282.9034\\119\\-75.19531\\-281.5771\\119\\-77.14844\\-280.5357\\119\\-79.10156\\-279.1372\\119\\-81.05469\\-277.6258\\119\\-83.00781\\-276.5163\\119\\-84.96094\\-275.2565\\119\\-88.78941\\-272.5234\\119\\-94.18688\\-268.6172\\119\\-96.67969\\-266.9172\\119\\-99.33143\\-264.7109\\119\\-100.5859\\-263.7459\\119\\-104.4922\\-260.9888\\119\\-108.3984\\-257.6713\\119\\-109.4396\\-256.8984\\119\\-112.3047\\-254.3982\\119\\-115.9769\\-251.0391\\119\\-118.1641\\-248.9618\\119\\-120.1172\\-246.9921\\119\\-121.7751\\-245.1797\\119\\-124.0234\\-242.5952\\119\\-128.1758\\-237.3672\\119\\-129.2813\\-235.4141\\119\\-130.6074\\-233.4609\\119\\-131.8359\\-231.1966\\119\\-133.8736\\-227.6016\\119\\-136.3866\\-221.7422\\119\\-136.8826\\-219.7891\\119\\-137.5156\\-217.8359\\119\\-138.2491\\-215.8828\\119\\-139.1862\\-211.9766\\119\\-139.9185\\-210.0234\\119\\-140.3795\\-208.0703\\119\\-141.0181\\-204.1641\\119\\-141.716\\-200.2578\\119\\-141.9992\\-198.3047\\119\\-142.2928\\-194.3984\\119\\-142.4112\\-190.4922\\119\\-142.4553\\-184.6328\\119\\-142.3915\\-180.7266\\119\\-142.2547\\-176.8203\\119\\-141.8917\\-170.9609\\119\\-140.8534\\-163.1484\\119\\-140.6411\\-161.1953\\119\\-140.0929\\-157.2891\\119\\-139.0758\\-153.3828\\119\\-138.3259\\-149.4766\\119\\-137.7624\\-147.5234\\119\\-137.0809\\-145.5703\\119\\-136.3426\\-141.6641\\119\\-134.9325\\-137.7578\\119\\-134.4088\\-135.8047\\119\\-133.4706\\-133.8516\\119\\-132.6819\\-131.8984\\119\\-131.7479\\-129.9453\\119\\-129.9869\\-126.0391\\119\\-127.9297\\-122.1669\\119\\-126.6556\\-120.1797\\119\\-125.0719\\-118.2266\\119\\-122.3617\\-114.3203\\119\\-120.1172\\-111.9281\\119\\-118.1641\\-109.7418\\119\\-116.2109\\-107.8461\\119\\-114.2578\\-106.187\\119\\-109.6259\\-102.6016\\119\\-108.3984\\-101.7214\\119\\-106.4453\\-100.5284\\119\\-104.4922\\-99.51334\\119\\-102.5391\\-98.23467\\119\\-100.5859\\-97.32567\\119\\-98.63281\\-96.1454\\119\\-96.67969\\-95.46706\\119\\-94.72656\\-94.54492\\119\\-92.77344\\-93.93534\\119\\-90.82031\\-93.49748\\119\\-86.91406\\-92.18674\\119\\-83.00781\\-91.40161\\119\\-79.10156\\-90.34959\\119\\-77.14844\\-90.02901\\119\\-71.28906\\-89.20369\\119\\-67.38281\\-88.51311\\119\\-63.47656\\-88.14233\\119\\-55.66406\\-87.66331\\119\\-53.71094\\-87.44777\\119\\-47.85156\\-86.98463\\119\\-41.99219\\-86.41246\\119\\-34.17969\\-86.02774\\119\\-28.32031\\-85.95586\\119\\-22.46094\\-86.03274\\119\\-16.60156\\-86.33134\\119\\-14.64844\\-86.53032\\119\\-12.69531\\-86.90625\\119\\-8.789063\\-87.818\\119\\-4.882813\\-88.46892\\119\\-2.929688\\-89.19343\\119\\-0.9765625\\-89.66917\\119\\0.9765625\\-89.88467\\119\\2.929688\\-89.88443\\119\\4.882813\\-89.77863\\119\\6.835938\\-89.53773\\119\\8.789063\\-89.11325\\119\\10.74219\\-88.44141\\119\\14.64844\\-87.53944\\119\\16.60156\\-86.92143\\119\\18.55469\\-86.48828\\119\\22.46094\\-85.89474\\119\\30.27344\\-85.24281\\119\\36.13281\\-84.9287\\119\\41.99219\\-85.04688\\119\\47.85156\\-85.42057\\119\\51.75781\\-85.80138\\119\\57.61719\\-86.31981\\119\\59.57031\\-86.54037\\119\\63.47656\\-87.21886\\119\\67.38281\\-87.69067\\119\\73.24219\\-88.22778\\119\\75.19531\\-88.51601\\119\\79.10156\\-89.54739\\119\\83.00781\\-90.371\\119\\84.96094\\-91.12522\\119\\86.91406\\-91.73269\\119\\88.86719\\-92.21599\\119\\92.77344\\-93.64562\\119\\94.72656\\-94.11446\\119\\98.63281\\-95.74731\\119\\100.5859\\-96.64453\\119\\102.5391\\-97.7547\\119\\104.4922\\-99.03597\\119\\106.4453\\-100.0625\\119\\108.3984\\-101.3909\\119\\110.3408\\-102.6016\\119\\112.3047\\-104.1077\\119\\115.1002\\-106.5078\\119\\118.1641\\-109.4573\\119\\120.1172\\-111.668\\119\\120.8895\\-112.3672\\119\\122.5294\\-114.3203\\119\\123.7131\\-116.2734\\119\\125.0234\\-118.2266\\119\\126.4381\\-120.1797\\119\\127.4827\\-122.1328\\119\\128.6371\\-124.0859\\119\\129.4049\\-126.0391\\119\\130.3914\\-127.9922\\119\\131.0152\\-129.9453\\119\\132.6072\\-133.8516\\119\\133.1959\\-135.8047\\119\\134.071\\-137.7578\\119\\135.0518\\-141.6641\\119\\136.2338\\-145.5703\\119\\136.6028\\-147.5234\\119\\137.168\\-151.4297\\119\\138.1806\\-155.3359\\119\\139.2137\\-163.1484\\119\\139.9129\\-167.0547\\119\\140.1457\\-169.0078\\119\\140.5263\\-174.8672\\119\\140.679\\-178.7734\\119\\140.7559\\-182.6797\\119\\140.7292\\-190.4922\\119\\140.625\\-194.3984\\119\\140.435\\-198.3047\\119\\140.1276\\-202.2109\\119\\139.7992\\-204.1641\\119\\138.9732\\-208.0703\\119\\138.3882\\-211.9766\\119\\137.958\\-213.9297\\119\\137.2204\\-215.8828\\119\\136.3997\\-219.7891\\119\\135.4685\\-221.7422\\119\\134.7034\\-223.6953\\119\\133.7891\\-225.4676\\119\\131.8359\\-228.658\\119\\131.1364\\-229.5547\\119\\128.6654\\-233.4609\\119\\127.1282\\-235.4141\\119\\125.374\\-237.3672\\119\\123.8393\\-239.3203\\119\\122.4261\\-241.2734\\119\\120.5754\\-243.2266\\119\\118.6207\\-245.1797\\119\\116.2109\\-247.7957\\119\\114.2578\\-249.698\\119\\112.3047\\-251.4627\\119\\108.3984\\-255.4226\\119\\104.5009\\-258.8516\\119\\102.5391\\-260.8773\\119\\98.63281\\-264.0576\\119\\95.9109\\-266.6641\\119\\92.77344\\-269.4024\\119\\88.86719\\-272.5756\\119\\83.83875\\-276.4297\\119\\79.10156\\-279.7487\\119\\77.14844\\-281.213\\119\\75.19531\\-282.4518\\119\\73.24219\\-283.3958\\119\\71.28906\\-284.8046\\119\\67.38281\\-287.1161\\119\\65.42969\\-288.1726\\119\\63.47656\\-289.0891\\119\\61.52344\\-289.8611\\119\\59.57031\\-290.9496\\119\\57.61719\\-291.7984\\119\\55.66406\\-292.8532\\119\\53.71094\\-293.6004\\119\\51.75781\\-294.5811\\119\\47.85156\\-295.6191\\119\\45.89844\\-296.4987\\119\\41.99219\\-297.4411\\119\\40.03906\\-298.3108\\119\\36.13281\\-299.2513\\119\\32.22656\\-300.3733\\119\\26.36719\\-301.2092\\119\\20.50781\\-302.234\\119\\18.55469\\-302.4526\\119\\14.64844\\-302.7065\\119\\6.835938\\-302.9695\\119\\-0.9765625\\-303.0791\\119\\-6.835938\\-302.9651\\119\\-12.69531\\-302.7859\\119\\-16.60156\\-302.5765\\119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "249" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "186" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-301.9203\\121\\-24.41406\\-301.4785\\121\\-30.27344\\-300.6473\\121\\-32.22656\\-300.3342\\121\\-36.13281\\-299.144\\121\\-38.08594\\-298.7362\\121\\-40.03906\\-298.1616\\121\\-41.99219\\-297.303\\121\\-43.94531\\-296.8587\\121\\-45.89844\\-296.2865\\121\\-47.85156\\-295.3929\\121\\-49.80469\\-294.907\\121\\-51.75781\\-294.243\\121\\-53.71094\\-293.2428\\121\\-55.66406\\-292.5255\\121\\-57.61719\\-291.3291\\121\\-59.57031\\-290.6019\\121\\-61.52344\\-289.3854\\121\\-63.47656\\-288.758\\121\\-65.42969\\-287.5804\\121\\-67.38281\\-286.6369\\121\\-71.28906\\-283.9943\\121\\-73.24219\\-283.001\\121\\-75.19531\\-281.6659\\121\\-77.14844\\-280.6282\\121\\-81.05469\\-277.6938\\121\\-83.00781\\-276.546\\121\\-84.96094\\-275.2692\\121\\-85.96978\\-274.4766\\121\\-92.77344\\-269.5493\\121\\-94.72656\\-268.0157\\121\\-96.58203\\-266.6641\\121\\-98.98868\\-264.7109\\121\\-101.6101\\-262.7578\\121\\-104.0761\\-260.8047\\121\\-106.4453\\-258.8267\\121\\-108.3984\\-257.2767\\121\\-110.3516\\-255.6127\\121\\-114.2578\\-251.9542\\121\\-115.3122\\-251.0391\\121\\-118.1641\\-248.174\\121\\-119.0956\\-247.1328\\121\\-121.0273\\-245.1797\\121\\-122.7481\\-243.2266\\121\\-124.2993\\-241.2734\\121\\-125.6021\\-239.3203\\121\\-127.1821\\-237.3672\\121\\-128.6331\\-235.4141\\121\\-131.8359\\-229.704\\121\\-133.934\\-225.6484\\121\\-134.7404\\-223.6953\\121\\-135.4389\\-221.7422\\121\\-136.2478\\-219.7891\\121\\-137.2246\\-215.8828\\121\\-137.9849\\-213.9297\\121\\-138.8568\\-210.0234\\121\\-139.9304\\-206.1172\\121\\-140.3209\\-204.1641\\121\\-140.5804\\-202.2109\\121\\-141.2233\\-196.3516\\121\\-141.517\\-192.4453\\121\\-141.7031\\-188.5391\\121\\-141.7188\\-184.6328\\121\\-141.6096\\-180.7266\\121\\-141.2533\\-174.8672\\121\\-140.9763\\-170.9609\\121\\-140.4769\\-165.1016\\121\\-139.9935\\-161.1953\\121\\-139.086\\-157.2891\\121\\-138.4603\\-153.3828\\121\\-138.0615\\-151.4297\\121\\-137.4344\\-149.4766\\121\\-136.9708\\-147.5234\\121\\-136.2271\\-143.6172\\121\\-135.5362\\-141.6641\\121\\-134.3954\\-137.7578\\121\\-132.7951\\-133.8516\\121\\-132.0522\\-131.8984\\121\\-131.051\\-129.9453\\121\\-130.3468\\-127.9922\\121\\-129.2707\\-126.0391\\121\\-128.4678\\-124.0859\\121\\-124.6068\\-118.2266\\121\\-122.0703\\-114.857\\121\\-119.7018\\-112.3672\\121\\-116.2109\\-108.5733\\121\\-113.7821\\-106.5078\\121\\-110.3516\\-103.6961\\121\\-108.3984\\-102.1982\\121\\-106.4453\\-101.1679\\121\\-104.4922\\-99.86845\\121\\-98.78229\\-96.74219\\121\\-96.67969\\-95.81185\\121\\-94.72656\\-95.10751\\121\\-92.77344\\-94.23767\\121\\-88.86719\\-93.35371\\121\\-86.91406\\-92.6476\\121\\-84.96094\\-92.13216\\121\\-81.05469\\-91.41932\\121\\-77.14844\\-90.44808\\121\\-75.19531\\-90.12265\\121\\-69.33594\\-89.41482\\121\\-63.47656\\-88.44801\\121\\-61.52344\\-88.24734\\121\\-55.66406\\-87.87378\\121\\-45.89844\\-87.21706\\121\\-41.99219\\-86.75231\\121\\-40.03906\\-86.58461\\121\\-34.17969\\-86.28893\\121\\-28.32031\\-86.21397\\121\\-22.46094\\-86.27821\\121\\-16.60156\\-86.5953\\121\\-14.64844\\-86.90625\\121\\-10.74219\\-87.73402\\121\\-6.835938\\-88.39394\\121\\-2.929688\\-89.62975\\121\\-0.9765625\\-90.00446\\121\\0.9765625\\-90.19581\\121\\2.929688\\-90.21828\\121\\6.835938\\-89.90063\\121\\8.789063\\-89.60256\\121\\10.74219\\-89.03044\\121\\12.69531\\-88.29858\\121\\16.60156\\-87.37993\\121\\18.55469\\-86.84686\\121\\20.50781\\-86.47883\\121\\24.41406\\-85.95377\\121\\28.32031\\-85.65251\\121\\30.27344\\-85.5926\\121\\36.13281\\-85.24603\\121\\40.03906\\-85.25528\\121\\43.94531\\-85.33075\\121\\47.85156\\-85.5305\\121\\51.75781\\-85.86128\\121\\57.61719\\-86.4545\\121\\59.57031\\-86.75231\\121\\61.52344\\-87.14934\\121\\65.42969\\-87.667\\121\\69.33594\\-88.02415\\121\\73.24219\\-88.4713\\121\\77.14844\\-89.45506\\121\\81.05469\\-90.21522\\121\\83.00781\\-90.83063\\121\\84.96094\\-91.56191\\121\\86.91406\\-92.0204\\121\\88.86719\\-92.62424\\121\\90.82031\\-93.46326\\121\\92.77344\\-93.92993\\121\\94.72656\\-94.52815\\121\\96.67969\\-95.45519\\121\\98.63281\\-96.12708\\121\\100.5859\\-97.28472\\121\\102.5391\\-98.21687\\121\\104.4922\\-99.5539\\121\\108.3984\\-101.7922\\121\\112.0269\\-104.5547\\121\\114.2578\\-106.3065\\121\\116.2109\\-107.9955\\121\\118.1641\\-110.067\\121\\120.2239\\-112.3672\\121\\122.0703\\-114.649\\121\\124.5768\\-118.2266\\121\\125.6584\\-120.1797\\121\\126.9472\\-122.1328\\121\\128.0713\\-124.0859\\121\\128.9315\\-126.0391\\121\\129.6859\\-127.9922\\121\\130.5981\\-129.9453\\121\\131.1331\\-131.8984\\121\\131.9999\\-133.8516\\121\\132.6769\\-135.8047\\121\\133.2355\\-137.7578\\121\\134.0332\\-139.7109\\121\\134.5622\\-141.6641\\121\\135.4685\\-145.5703\\121\\136.0677\\-147.5234\\121\\136.4415\\-149.4766\\121\\136.9446\\-153.3828\\121\\137.2758\\-155.3359\\121\\138.1595\\-159.2422\\121\\138.6099\\-163.1484\\121\\139.1789\\-169.0078\\121\\139.8631\\-174.8672\\121\\140.0776\\-178.7734\\121\\140.1923\\-184.6328\\121\\140.189\\-188.5391\\121\\140.0146\\-194.3984\\121\\139.6713\\-198.3047\\121\\138.8994\\-204.1641\\121\\138.4436\\-208.0703\\121\\138.1314\\-210.0234\\121\\137.0762\\-213.9297\\121\\136.3107\\-217.8359\\121\\134.7842\\-221.7422\\121\\133.9208\\-223.6953\\121\\132.7876\\-225.6484\\121\\131.536\\-227.6016\\121\\130.4633\\-229.5547\\121\\127.9297\\-233.3083\\121\\126.4511\\-235.4141\\121\\123.2646\\-239.3203\\121\\122.0703\\-240.8573\\121\\120.1172\\-243.1014\\121\\118.1641\\-245.1888\\121\\116.6001\\-247.1328\\121\\114.7239\\-249.0859\\121\\112.3047\\-251.3797\\121\\108.3984\\-255.4734\\121\\106.7818\\-256.8984\\121\\104.7066\\-258.8516\\121\\102.5391\\-261.087\\121\\98.63281\\-264.3188\\121\\96.17683\\-266.6641\\121\\94.72656\\-267.951\\121\\90.82031\\-271.2409\\121\\88.86719\\-272.9568\\121\\86.86474\\-274.4766\\121\\84.96094\\-275.8039\\121\\81.05469\\-278.7917\\121\\75.19531\\-282.7706\\121\\73.24219\\-283.6486\\121\\71.28906\\-285.0522\\121\\69.33594\\-286.29\\121\\65.89227\\-288.1484\\121\\65.42969\\-288.474\\121\\63.47656\\-289.2133\\121\\61.52344\\-290.239\\121\\59.57031\\-291.1035\\121\\57.61719\\-292.1768\\121\\51.75781\\-294.7219\\121\\49.80469\\-295.2027\\121\\45.89844\\-296.6445\\121\\43.94531\\-297.0702\\121\\41.99219\\-297.6839\\121\\40.03906\\-298.4823\\121\\36.13281\\-299.4216\\121\\34.17969\\-300.0804\\121\\32.22656\\-300.4933\\121\\26.36719\\-301.3386\\121\\22.46094\\-302.0735\\121\\20.50781\\-302.3664\\121\\16.60156\\-302.6776\\121\\10.74219\\-302.925\\121\\2.929688\\-303.1638\\121\\-0.9765625\\-303.1923\\121\\-4.882813\\-303.1243\\121\\-10.74219\\-302.925\\121\\-16.60156\\-302.6582\\121\\-20.50781\\-302.2581\\121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "251" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "187" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-302.088\\123\\-26.36719\\-301.293\\123\\-32.22656\\-300.4344\\123\\-34.17969\\-299.9765\\123\\-36.13281\\-299.2824\\123\\-40.03906\\-298.3326\\123\\-41.99219\\-297.4629\\123\\-45.89844\\-296.4619\\123\\-47.85156\\-295.5337\\123\\-51.75781\\-294.4131\\123\\-53.71094\\-293.3853\\123\\-55.66406\\-292.6718\\123\\-57.61719\\-291.489\\123\\-59.57031\\-290.7545\\123\\-61.52344\\-289.5282\\123\\-63.47656\\-288.8809\\123\\-65.42969\\-287.7212\\123\\-67.38281\\-286.7542\\123\\-69.33594\\-285.404\\123\\-73.24219\\-283.0864\\123\\-75.19531\\-281.7874\\123\\-77.14844\\-280.7417\\123\\-81.05469\\-277.7664\\123\\-83.00781\\-276.5899\\123\\-84.96094\\-275.2966\\123\\-88.86719\\-272.3089\\123\\-92.77344\\-269.4717\\123\\-96.30036\\-266.6641\\123\\-98.63281\\-264.7026\\123\\-100.5859\\-263.3319\\123\\-102.5391\\-261.7491\\123\\-106.4453\\-258.2848\\123\\-108.1997\\-256.8984\\123\\-110.3516\\-255.0884\\123\\-116.5938\\-249.0859\\123\\-120.1766\\-245.1797\\123\\-122.0703\\-242.9872\\123\\-126.36\\-237.3672\\123\\-128.9195\\-233.4609\\123\\-130.0349\\-231.5078\\123\\-130.9429\\-229.5547\\123\\-132.094\\-227.6016\\123\\-132.8964\\-225.6484\\123\\-133.8914\\-223.6953\\123\\-134.6648\\-221.7422\\123\\-135.2366\\-219.7891\\123\\-136.0502\\-217.8359\\123\\-136.5729\\-215.8828\\123\\-136.9904\\-213.9297\\123\\-137.5127\\-211.9766\\123\\-138.1582\\-210.0234\\123\\-139.2348\\-204.1641\\123\\-139.7171\\-202.2109\\123\\-140.3015\\-198.3047\\123\\-140.6541\\-192.4453\\123\\-140.7907\\-186.5859\\123\\-140.7406\\-180.7266\\123\\-140.552\\-174.8672\\123\\-140.3245\\-170.9609\\123\\-139.965\\-167.0547\\123\\-139.2672\\-163.1484\\123\\-138.4555\\-157.2891\\123\\-137.6953\\-153.469\\123\\-137.1268\\-151.4297\\123\\-136.4968\\-147.5234\\123\\-136.0051\\-145.5703\\123\\-135.3671\\-143.6172\\123\\-134.3609\\-139.7109\\123\\-133.5321\\-137.7578\\123\\-132.1729\\-133.8516\\123\\-131.1695\\-131.8984\\123\\-130.5446\\-129.9453\\123\\-129.5573\\-127.9922\\123\\-128.7435\\-126.0391\\123\\-126.5924\\-122.1328\\123\\-123.8091\\-118.2266\\123\\-122.6294\\-116.2734\\123\\-120.9845\\-114.3203\\123\\-117.213\\-110.4141\\123\\-116.2109\\-109.2867\\123\\-114.2578\\-107.4778\\123\\-110.3516\\-104.2581\\123\\-106.4453\\-101.5543\\123\\-104.4922\\-100.3033\\123\\-102.5391\\-99.38731\\123\\-100.5859\\-98.11983\\123\\-98.63281\\-97.25919\\123\\-96.67969\\-96.15382\\123\\-94.72656\\-95.51087\\123\\-90.82031\\-94.05192\\123\\-86.91406\\-93.23885\\123\\-84.96094\\-92.57507\\123\\-83.00781\\-92.13216\\123\\-79.10156\\-91.46875\\123\\-75.19531\\-90.57477\\123\\-73.24219\\-90.23365\\123\\-65.42969\\-89.32949\\123\\-61.52344\\-88.57394\\123\\-59.57031\\-88.36328\\123\\-53.71094\\-87.92336\\123\\-45.89844\\-87.54463\\123\\-41.99219\\-87.21706\\123\\-38.08594\\-86.83383\\123\\-34.17969\\-86.5953\\123\\-30.27344\\-86.48202\\123\\-26.36719\\-86.46029\\123\\-22.46094\\-86.55054\\123\\-18.55469\\-86.80511\\123\\-16.60156\\-87.00098\\123\\-12.69531\\-87.68045\\123\\-8.789063\\-88.27649\\123\\-4.882813\\-89.49935\\123\\-0.9765625\\-90.37357\\123\\0.9765625\\-90.64379\\123\\2.929688\\-90.71886\\123\\6.835938\\-90.29688\\123\\8.789063\\-89.95141\\123\\10.74219\\-89.50674\\123\\12.69531\\-88.69318\\123\\14.64844\\-88.09898\\123\\18.55469\\-87.34277\\123\\20.50781\\-86.86122\\123\\22.46094\\-86.50096\\123\\24.41406\\-86.25425\\123\\28.32031\\-85.89839\\123\\30.27344\\-85.828\\123\\36.13281\\-85.50214\\123\\41.99219\\-85.47662\\123\\45.89844\\-85.55554\\123\\47.85156\\-85.65639\\123\\51.75781\\-85.95586\\123\\57.61719\\-86.60868\\123\\61.52344\\-87.32082\\123\\65.42969\\-87.80054\\123\\67.38281\\-87.95908\\123\\71.28906\\-88.45124\\123\\73.24219\\-88.81613\\123\\75.19531\\-89.33984\\123\\79.10156\\-90.07078\\123\\81.05469\\-90.56592\\123\\83.00781\\-91.34274\\123\\86.91406\\-92.34766\\123\\88.86719\\-93.19948\\123\\92.77344\\-94.22438\\123\\94.72656\\-95.12408\\123\\96.67969\\-95.84399\\123\\98.63281\\-96.70313\\123\\102.5391\\-98.9237\\123\\104.4922\\-99.9556\\123\\106.4453\\-101.2468\\123\\108.3984\\-102.2512\\123\\110.3516\\-103.7721\\123\\113.6147\\-106.5078\\123\\116.2109\\-108.8341\\123\\117.5795\\-110.4141\\123\\121.2\\-114.3203\\123\\122.7726\\-116.2734\\123\\123.8393\\-118.2266\\123\\126.4026\\-122.1328\\123\\127.3322\\-124.0859\\123\\128.4383\\-126.0391\\123\\129.0926\\-127.9922\\123\\130.0019\\-129.9453\\123\\130.6874\\-131.8984\\123\\131.1913\\-133.8516\\123\\132.0522\\-135.8047\\123\\133.1818\\-139.7109\\123\\133.9148\\-141.6641\\123\\134.4421\\-143.6172\\123\\135.2236\\-147.5234\\123\\136.1707\\-151.4297\\123\\136.4968\\-153.3828\\123\\137.2003\\-159.2422\\123\\137.948\\-163.1484\\123\\138.1866\\-165.1016\\123\\138.527\\-169.0078\\123\\138.8844\\-174.8672\\123\\139.0564\\-178.7734\\123\\139.1794\\-184.6328\\123\\139.1794\\-188.5391\\123\\139.0895\\-192.4453\\123\\138.6932\\-200.2578\\123\\138.3332\\-204.1641\\123\\138.0694\\-206.1172\\123\\137.2003\\-210.0234\\123\\136.5748\\-213.9297\\123\\136.1597\\-215.8828\\123\\135.3997\\-217.8359\\123\\134.7782\\-219.7891\\123\\134.0069\\-221.7422\\123\\131.8763\\-225.6484\\123\\130.7357\\-227.6016\\123\\129.4847\\-229.5547\\123\\128.4746\\-231.5078\\123\\125.9766\\-234.913\\123\\125.5466\\-235.4141\\123\\122.8555\\-239.3203\\123\\121.2523\\-241.2734\\123\\117.726\\-245.1797\\123\\116.3167\\-247.1328\\123\\114.5784\\-249.0859\\123\\112.3047\\-251.3147\\123\\110.3516\\-253.492\\123\\108.3984\\-255.5269\\123\\104.896\\-258.8516\\123\\102.5391\\-261.293\\123\\100.5859\\-263.0508\\123\\98.63281\\-264.6689\\123\\96.60326\\-266.6641\\123\\94.29348\\-268.6172\\123\\92.77344\\-269.7983\\123\\88.86719\\-273.2589\\123\\86.91406\\-274.8401\\123\\84.96094\\-276.0766\\123\\83.00781\\-277.5252\\123\\81.99426\\-278.3828\\123\\79.10156\\-280.5252\\123\\77.14844\\-281.667\\123\\75.19531\\-282.9998\\123\\73.24219\\-283.958\\123\\72.89907\\-284.2422\\123\\69.33594\\-286.5922\\123\\67.38281\\-287.5158\\123\\65.42969\\-288.6998\\123\\63.47656\\-289.3601\\123\\61.52344\\-290.5254\\123\\59.57031\\-291.2851\\123\\57.61719\\-292.4565\\123\\55.66406\\-293.1869\\123\\53.71094\\-294.19\\123\\51.75781\\-294.8593\\123\\49.80469\\-295.3203\\123\\47.85156\\-296.1473\\123\\45.89844\\-296.7847\\123\\43.94531\\-297.1983\\123\\41.99219\\-297.9948\\123\\40.03906\\-298.6219\\123\\38.08594\\-299.0542\\123\\36.13281\\-299.593\\123\\34.17969\\-300.2515\\123\\32.22656\\-300.6024\\123\\26.36719\\-301.4671\\123\\22.46094\\-302.234\\123\\20.50781\\-302.4693\\123\\16.60156\\-302.7469\\123\\6.835938\\-303.1675\\123\\2.929688\\-303.3105\\123\\-0.9765625\\-303.3301\\123\\-6.835938\\-303.1757\\123\\-16.60156\\-302.7351\\123\\-20.50781\\-302.37\\123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "245" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "188" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-302.2232\\125\\-26.36719\\-301.4066\\125\\-32.22656\\-300.5428\\125\\-34.17969\\-300.1396\\125\\-36.13281\\-299.4531\\125\\-40.03906\\-298.4934\\125\\-41.99219\\-297.6458\\125\\-43.94531\\-297.0419\\125\\-45.89844\\-296.6022\\125\\-47.85156\\-295.7186\\125\\-51.75781\\-294.5595\\125\\-53.71094\\-293.5662\\125\\-55.66406\\-292.8165\\125\\-57.61719\\-291.6918\\125\\-59.57031\\-290.8881\\125\\-61.52344\\-289.7123\\125\\-63.47656\\-288.9968\\125\\-67.38281\\-286.8823\\125\\-69.33594\\-285.5152\\125\\-71.5332\\-284.2422\\125\\-75.19531\\-281.9282\\125\\-77.14844\\-280.8607\\125\\-77.76563\\-280.3359\\125\\-81.05469\\-277.8599\\125\\-83.00781\\-276.659\\125\\-84.96094\\-275.3145\\125\\-88.86719\\-272.2664\\125\\-92.77344\\-269.384\\125\\-94.72656\\-267.788\\125\\-98.63281\\-264.3928\\125\\-100.5859\\-263.0858\\125\\-102.5391\\-261.5118\\125\\-106.4453\\-257.875\\125\\-110.3516\\-254.4716\\125\\-111.7986\\-252.9922\\125\\-116.2109\\-248.7135\\125\\-118.1641\\-246.4744\\125\\-119.1998\\-245.1797\\125\\-121.1267\\-243.2266\\125\\-122.7601\\-241.2734\\125\\-124.1108\\-239.3203\\125\\-125.3101\\-237.3672\\125\\-126.8467\\-235.4141\\125\\-128.1573\\-233.4609\\125\\-129.1587\\-231.5078\\125\\-130.3034\\-229.5547\\125\\-131.0813\\-227.6016\\125\\-132.1411\\-225.6484\\125\\-132.8881\\-223.6953\\125\\-133.8127\\-221.7422\\125\\-134.5546\\-219.7891\\125\\-135.1019\\-217.8359\\125\\-135.8302\\-215.8828\\125\\-136.4042\\-213.9297\\125\\-137.112\\-210.0234\\125\\-138.1712\\-206.1172\\125\\-138.4776\\-204.1641\\125\\-139.6719\\-194.3984\\125\\-139.965\\-190.4922\\125\\-140.0761\\-186.5859\\125\\-140.066\\-182.6797\\125\\-139.9762\\-178.7734\\125\\-139.7594\\-174.8672\\125\\-139.1174\\-169.0078\\125\\-138.5732\\-163.1484\\125\\-138.0744\\-159.2422\\125\\-137.1419\\-155.3359\\125\\-136.3386\\-149.4766\\125\\-135.8446\\-147.5234\\125\\-135.187\\-145.5703\\125\\-134.2961\\-141.6641\\125\\-133.487\\-139.7109\\125\\-132.2304\\-135.8047\\125\\-131.2487\\-133.8516\\125\\-130.6479\\-131.8984\\125\\-128.1189\\-126.0391\\125\\-124.6545\\-120.1797\\125\\-122.0703\\-116.5645\\125\\-120.3419\\-114.3203\\125\\-118.1641\\-112.007\\125\\-116.2109\\-109.8251\\125\\-114.2578\\-107.9019\\125\\-110.3516\\-105.075\\125\\-108.3984\\-103.4323\\125\\-106.4453\\-101.9483\\125\\-100.5753\\-98.69531\\125\\-96.83891\\-96.74219\\125\\-94.72656\\-95.84375\\125\\-92.77344\\-95.22987\\125\\-90.82031\\-94.40266\\125\\-88.86719\\-93.93382\\125\\-86.91406\\-93.61127\\125\\-84.96094\\-93.15438\\125\\-83.00781\\-92.55221\\125\\-81.05469\\-92.16888\\125\\-75.19531\\-91.21056\\125\\-73.24219\\-90.65746\\125\\-71.28906\\-90.34857\\125\\-65.42969\\-89.68555\\125\\-63.47656\\-89.42407\\125\\-59.57031\\-88.71514\\125\\-57.61719\\-88.45478\\125\\-53.71094\\-88.09692\\125\\-43.94531\\-87.65831\\125\\-34.17969\\-87.03214\\125\\-30.27344\\-86.86212\\125\\-26.36719\\-86.81881\\125\\-24.41406\\-86.8766\\125\\-16.60156\\-87.37702\\125\\-10.74219\\-88.18652\\125\\-8.789063\\-88.60416\\125\\-6.835938\\-89.3377\\125\\-2.929688\\-90.33385\\125\\-0.9765625\\-90.93707\\125\\0.9765625\\-91.26693\\125\\2.929688\\-91.35534\\125\\4.882813\\-91.18799\\125\\6.835938\\-90.80143\\125\\10.74219\\-89.84846\\125\\12.69531\\-89.28291\\125\\14.64844\\-88.43116\\125\\16.60156\\-87.97739\\125\\20.50781\\-87.31655\\125\\24.41406\\-86.56087\\125\\30.27344\\-86.01116\\125\\34.17969\\-85.79198\\125\\38.08594\\-85.69592\\125\\43.94531\\-85.64489\\125\\45.89844\\-85.68846\\125\\51.75781\\-86.07554\\125\\55.66406\\-86.47273\\125\\57.61719\\-86.75231\\125\\59.57031\\-87.17939\\125\\63.47656\\-87.72263\\125\\67.38281\\-88.08334\\125\\69.33594\\-88.34375\\125\\71.28906\\-88.73438\\125\\75.19531\\-89.61607\\125\\79.10156\\-90.34222\\125\\81.05469\\-91.07669\\125\\83.00781\\-91.66297\\125\\84.96094\\-92.14307\\125\\88.86719\\-93.54673\\125\\90.82031\\-93.99911\\125\\92.77344\\-94.66997\\125\\94.72656\\-95.53223\\125\\96.67969\\-96.19965\\125\\98.63281\\-97.30114\\125\\100.5859\\-98.23114\\125\\102.5391\\-99.44904\\125\\104.4922\\-100.4101\\125\\107.9699\\-102.6016\\125\\110.3516\\-104.3009\\125\\114.2578\\-107.558\\125\\116.2109\\-109.4163\\125\\118.1641\\-111.6132\\125\\120.6782\\-114.3203\\125\\122.1591\\-116.2734\\125\\123.2993\\-118.2266\\125\\124.6094\\-120.1797\\125\\125.579\\-122.1328\\125\\126.7998\\-124.0859\\125\\128.6621\\-127.9922\\125\\129.2602\\-129.9453\\125\\130.1437\\-131.8984\\125\\130.7292\\-133.8516\\125\\131.1786\\-135.8047\\125\\131.9867\\-137.7578\\125\\132.5824\\-139.7109\\125\\133.0625\\-141.6641\\125\\134.252\\-145.5703\\125\\135.3227\\-151.4297\\125\\136.203\\-155.3359\\125\\136.676\\-159.2422\\125\\136.9934\\-163.1484\\125\\137.207\\-165.1016\\125\\137.9943\\-170.9609\\125\\138.2508\\-174.8672\\125\\138.4421\\-180.7266\\125\\138.4837\\-188.5391\\125\\138.3805\\-194.3984\\125\\138.2015\\-198.3047\\125\\138.0615\\-200.2578\\125\\137.7773\\-202.2109\\125\\137.1017\\-206.1172\\125\\136.6638\\-210.0234\\125\\136.3824\\-211.9766\\125\\135.9037\\-213.9297\\125\\135.2336\\-215.8828\\125\\134.7114\\-217.8359\\125\\134.0278\\-219.7891\\125\\132.9845\\-221.7422\\125\\132.0854\\-223.6953\\125\\130.9291\\-225.6484\\125\\129.9561\\-227.6016\\125\\128.8545\\-229.5547\\125\\126.3997\\-233.4609\\125\\123.5532\\-237.3672\\125\\122.376\\-239.3203\\125\\120.902\\-241.2734\\125\\117.4844\\-245.1797\\125\\116.2109\\-246.9248\\125\\114.4501\\-249.0859\\125\\112.3047\\-251.2731\\125\\109.0566\\-254.9453\\125\\105.0453\\-258.8516\\125\\102.5391\\-261.5042\\125\\98.96609\\-264.7109\\125\\96.67969\\-266.972\\125\\94.72656\\-268.6589\\125\\92.77344\\-270.0332\\125\\90.82031\\-271.7233\\125\\88.86719\\-273.5309\\125\\86.91406\\-275.1427\\125\\83.00781\\-277.7969\\125\\82.36417\\-278.3828\\125\\79.69365\\-280.3359\\125\\79.10156\\-280.8475\\125\\71.28906\\-285.5063\\125\\69.33594\\-286.8289\\125\\67.38281\\-287.7376\\125\\65.42969\\-288.8809\\125\\63.47656\\-289.5426\\125\\61.52344\\-290.7293\\125\\59.57031\\-291.4826\\125\\57.61719\\-292.6622\\125\\55.66406\\-293.3858\\125\\53.71094\\-294.4103\\125\\49.80469\\-295.4893\\125\\47.85156\\-296.3795\\125\\43.94531\\-297.3689\\125\\41.99219\\-298.2396\\125\\38.08594\\-299.189\\125\\36.02184\\-299.8672\\125\\34.17969\\-300.3644\\125\\28.32031\\-301.2577\\125\\26.36719\\-301.609\\125\\24.41406\\-302.0608\\125\\22.46094\\-302.3477\\125\\18.55469\\-302.7065\\125\\4.882813\\-303.3973\\125\\0.9765625\\-303.5033\\125\\-2.929688\\-303.4661\\125\\-10.74219\\-303.1053\\125\\-18.55469\\-302.6648\\125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "243" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "189" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-302.0067\\127\\-26.36719\\-301.5423\\127\\-28.32031\\-301.1966\\127\\-32.22656\\-300.6249\\127\\-34.17969\\-300.2616\\127\\-38.08594\\-299.05\\127\\-40.03906\\-298.6086\\127\\-43.94531\\-297.1491\\127\\-45.89844\\-296.7143\\127\\-49.80469\\-295.1906\\127\\-51.75781\\-294.6975\\127\\-53.71094\\-293.7551\\127\\-55.66406\\-292.955\\127\\-59.57031\\-291.0018\\127\\-61.52344\\-289.9152\\127\\-63.47656\\-289.0771\\127\\-65.34529\\-288.1484\\127\\-67.38281\\-287.0268\\127\\-69.33594\\-285.6943\\127\\-71.28906\\-284.5919\\127\\-75.19531\\-282.0712\\127\\-77.14844\\-280.9633\\127\\-77.90024\\-280.3359\\127\\-81.05469\\-277.9643\\127\\-83.00781\\-276.7481\\127\\-84.96094\\-275.3453\\127\\-88.86719\\-272.2268\\127\\-92.77344\\-269.31\\127\\-94.72656\\-267.7013\\127\\-98.63281\\-264.1814\\127\\-100.5859\\-262.7662\\127\\-102.5391\\-261.2427\\127\\-105.067\\-258.8516\\127\\-108.3984\\-255.8625\\127\\-110.3516\\-253.9824\\127\\-111.2421\\-252.9922\\127\\-116.2109\\-248.0359\\127\\-120.477\\-243.2266\\127\\-122.0703\\-241.1255\\127\\-123.2778\\-239.3203\\127\\-124.6985\\-237.3672\\127\\-127.9297\\-232.3379\\127\\-128.5022\\-231.5078\\127\\-129.3521\\-229.5547\\127\\-130.4342\\-227.6016\\127\\-131.1147\\-225.6484\\127\\-132.1482\\-223.6953\\127\\-132.8522\\-221.7422\\127\\-134.438\\-217.8359\\127\\-135.4852\\-213.9297\\127\\-136.1342\\-211.9766\\127\\-136.5222\\-210.0234\\127\\-137.0989\\-206.1172\\127\\-137.936\\-202.2109\\127\\-138.2392\\-200.2578\\127\\-138.4386\\-198.3047\\127\\-138.688\\-194.3984\\127\\-138.9608\\-186.5859\\127\\-138.946\\-180.7266\\127\\-138.7798\\-174.8672\\127\\-138.4649\\-169.0078\\127\\-138.1121\\-165.1016\\127\\-137.8461\\-163.1484\\127\\-137.3965\\-161.1953\\127\\-136.8506\\-157.2891\\127\\-136.4334\\-153.3828\\127\\-136.0677\\-151.4297\\127\\-135.0348\\-147.5234\\127\\-134.1706\\-143.6172\\127\\-133.3866\\-141.6641\\127\\-132.2095\\-137.7578\\127\\-131.3147\\-135.8047\\127\\-130.7419\\-133.8516\\127\\-130.0019\\-131.8984\\127\\-129.0953\\-129.9453\\127\\-128.3976\\-127.9922\\127\\-127.2599\\-126.0391\\127\\-126.32\\-124.0859\\127\\-123.8675\\-120.1797\\127\\-122.7371\\-118.2266\\127\\-121.2086\\-116.2734\\127\\-115.878\\-110.4141\\127\\-114.2578\\-108.7301\\127\\-108.3984\\-103.8974\\127\\-106.4453\\-102.5318\\127\\-104.4922\\-101.3941\\127\\-102.5391\\-100.1263\\127\\-100.5859\\-99.28891\\127\\-98.63281\\-98.07386\\127\\-96.67969\\-97.25584\\127\\-94.72656\\-96.2036\\127\\-92.77344\\-95.6203\\127\\-88.86719\\-94.2282\\127\\-84.96094\\-93.53436\\127\\-83.00781\\-93.1282\\127\\-81.05469\\-92.55411\\127\\-79.10156\\-92.17596\\127\\-75.19531\\-91.64592\\127\\-73.24219\\-91.30494\\127\\-69.33594\\-90.47388\\127\\-67.38281\\-90.17693\\127\\-63.47656\\-89.75064\\127\\-59.57031\\-89.2213\\127\\-57.61719\\-88.87543\\127\\-53.71094\\-88.34503\\127\\-51.75781\\-88.20654\\127\\-34.17969\\-87.41737\\127\\-32.22656\\-87.31158\\127\\-28.32031\\-87.24621\\127\\-24.41406\\-87.28761\\127\\-18.55469\\-87.54677\\127\\-14.64844\\-87.84937\\127\\-12.69531\\-88.07444\\127\\-10.74219\\-88.43144\\127\\-8.789063\\-89.125\\127\\-4.882813\\-90.14745\\127\\-2.872243\\-90.88281\\127\\-0.9765625\\-91.47232\\127\\0.9765625\\-91.66517\\127\\2.929688\\-91.72989\\127\\4.882813\\-91.625\\127\\6.835938\\-91.36794\\127\\10.74219\\-90.21779\\127\\12.69531\\-89.70035\\127\\16.60156\\-88.20514\\127\\20.50781\\-87.65952\\127\\24.41406\\-86.95274\\127\\28.32031\\-86.42114\\127\\34.17969\\-86.02839\\127\\40.03906\\-85.82399\\127\\45.89844\\-85.84976\\127\\53.71094\\-86.32744\\127\\55.66406\\-86.57406\\127\\59.57031\\-87.33487\\127\\63.47656\\-87.82132\\127\\67.38281\\-88.22001\\127\\69.33594\\-88.54313\\127\\73.24219\\-89.47825\\127\\77.14844\\-90.18295\\127\\79.10156\\-90.69581\\127\\81.05469\\-91.45691\\127\\84.96094\\-92.47681\\127\\86.91406\\-93.28718\\127\\90.82031\\-94.29053\\127\\92.77344\\-95.19482\\127\\94.72656\\-95.86032\\127\\96.66666\\-96.74219\\127\\98.63281\\-97.73661\\127\\100.5859\\-98.88755\\127\\102.5391\\-99.8807\\127\\104.4922\\-101.0286\\127\\106.4453\\-102.0445\\127\\109.829\\-104.5547\\127\\114.2578\\-108.09\\127\\116.5613\\-110.4141\\127\\118.1384\\-112.3672\\127\\120.1172\\-114.5889\\127\\122.8711\\-118.2266\\127\\123.9168\\-120.1797\\127\\126.169\\-124.0859\\127\\127.0414\\-126.0391\\127\\128.0441\\-127.9922\\127\\128.7971\\-129.9453\\127\\129.3433\\-131.8984\\127\\130.2083\\-133.8516\\127\\131.1252\\-137.7578\\127\\132.4542\\-141.6641\\127\\133.2976\\-145.5703\\127\\133.9139\\-147.5234\\127\\134.3738\\-149.4766\\127\\135.294\\-155.3359\\127\\136.0556\\-159.2422\\127\\136.5197\\-163.1484\\127\\137.1159\\-172.9141\\127\\137.4364\\-178.7734\\127\\137.608\\-182.6797\\127\\137.6546\\-188.5391\\127\\137.5031\\-192.4453\\127\\137.1705\\-198.3047\\127\\136.5836\\-206.1172\\127\\136.0285\\-210.0234\\127\\135.4705\\-211.9766\\127\\134.5572\\-215.8828\\127\\133.8882\\-217.8359\\127\\132.9733\\-219.7891\\127\\132.1637\\-221.7422\\127\\131.0585\\-223.6953\\127\\130.2399\\-225.6484\\127\\129.1183\\-227.6016\\127\\128.1906\\-229.5547\\127\\126.9234\\-231.5078\\127\\125.5388\\-233.4609\\127\\124.4888\\-235.4141\\127\\121.7963\\-239.3203\\127\\120.5448\\-241.2734\\127\\118.8996\\-243.2266\\127\\115.8023\\-247.1328\\127\\114.3438\\-249.0859\\127\\112.3047\\-251.2893\\127\\109.1648\\-254.9453\\127\\105.2007\\-258.8516\\127\\102.5391\\-261.6856\\127\\99.25426\\-264.7109\\127\\96.67969\\-267.2709\\127\\94.72656\\-269.018\\127\\92.77344\\-270.4022\\127\\88.86719\\-273.806\\127\\86.91406\\-275.3775\\127\\80.07813\\-280.3359\\127\\79.10156\\-281.0934\\127\\77.13783\\-282.2891\\127\\75.19531\\-283.3592\\127\\73.24219\\-284.7117\\127\\71.28906\\-285.7635\\127\\69.33594\\-287.0428\\127\\65.42969\\-289.0346\\127\\63.47656\\-289.7784\\127\\61.52344\\-290.9037\\127\\59.57031\\-291.7336\\127\\57.61719\\-292.8649\\127\\55.66406\\-293.5929\\127\\53.71094\\-294.5739\\127\\49.80469\\-295.6933\\127\\47.85156\\-296.5577\\127\\45.89844\\-296.9952\\127\\43.94531\\-297.5536\\127\\41.99219\\-298.4109\\127\\38.08594\\-299.3234\\127\\36.13281\\-300.0416\\127\\34.17969\\-300.4704\\127\\28.32031\\-301.3588\\127\\24.41406\\-302.2012\\127\\22.46094\\-302.4441\\127\\18.55469\\-302.7804\\127\\14.64844\\-302.9651\\127\\10.74219\\-303.2162\\127\\2.929688\\-303.6599\\127\\-0.9765625\\-303.7042\\127\\-4.882813\\-303.5767\\127\\-10.74219\\-303.2249\\127\\-14.64844\\-302.9542\\127\\-18.55469\\-302.7351\\127\\-22.46094\\-302.3381\\127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "253" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "190" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.882813\\-303.8256\\129\\-12.69531\\-303.1875\\129\\-20.50781\\-302.6516\\129\\-24.41406\\-302.1761\\129\\-26.36719\\-301.6916\\129\\-28.32031\\-301.3156\\129\\-34.17969\\-300.394\\129\\-36.06912\\-299.8672\\129\\-38.08594\\-299.1852\\129\\-40.03906\\-298.7221\\129\\-41.99219\\-298.1378\\129\\-43.94531\\-297.2802\\129\\-45.89844\\-296.808\\129\\-47.85156\\-296.1607\\129\\-49.80469\\-295.2915\\129\\-51.75781\\-294.8096\\129\\-53.69636\\-294.0078\\129\\-57.61719\\-292.2417\\129\\-59.57031\\-291.119\\129\\-63.47656\\-289.1605\\129\\-65.42969\\-288.2813\\129\\-71.28906\\-284.7709\\129\\-73.24219\\-283.3669\\129\\-75.16347\\-282.2891\\129\\-77.14844\\-281.0572\\129\\-81.05469\\-278.0927\\129\\-83.00781\\-276.8615\\129\\-84.96094\\-275.4148\\129\\-91.0443\\-270.5703\\129\\-92.77344\\-269.2794\\129\\-94.72656\\-267.6345\\129\\-98.63281\\-264.0533\\129\\-100.5859\\-262.4467\\129\\-102.5391\\-260.9984\\129\\-104.7678\\-258.8516\\129\\-108.3984\\-255.594\\129\\-110.3516\\-253.6062\\129\\-112.3047\\-251.4948\\129\\-114.7498\\-249.0859\\129\\-116.5213\\-247.1328\\129\\-117.9497\\-245.1797\\129\\-121.245\\-241.2734\\129\\-122.7553\\-239.3203\\129\\-123.8839\\-237.3672\\129\\-125.1134\\-235.4141\\129\\-126.4812\\-233.4609\\129\\-127.5152\\-231.5078\\129\\-128.6834\\-229.5547\\129\\-129.4735\\-227.6016\\129\\-130.4874\\-225.6484\\129\\-131.1478\\-223.6953\\129\\-132.0886\\-221.7422\\129\\-133.4194\\-217.8359\\129\\-134.2238\\-215.8828\\129\\-134.7355\\-213.9297\\129\\-135.1376\\-211.9766\\129\\-136.1707\\-208.0703\\129\\-136.5017\\-206.1172\\129\\-137.1596\\-200.2578\\129\\-137.4435\\-198.3047\\129\\-137.91\\-194.3984\\129\\-138.0487\\-192.4453\\129\\-138.2694\\-186.5859\\129\\-138.2859\\-180.7266\\129\\-138.1686\\-176.8203\\129\\-137.981\\-172.9141\\129\\-137.8183\\-170.9609\\129\\-137.3291\\-167.0547\\129\\-136.3911\\-157.2891\\129\\-136.1057\\-155.3359\\129\\-135.2041\\-151.4297\\129\\-134.4702\\-147.5234\\129\\-133.9567\\-145.5703\\129\\-133.2409\\-143.6172\\129\\-132.1857\\-139.7109\\129\\-131.2941\\-137.7578\\129\\-130.1193\\-133.8516\\129\\-129.2164\\-131.8984\\129\\-128.5786\\-129.9453\\129\\-127.5405\\-127.9922\\129\\-126.6297\\-126.0391\\129\\-125.4157\\-124.0859\\129\\-124.4888\\-122.1328\\129\\-122.0703\\-118.3646\\129\\-120.5716\\-116.2734\\129\\-117.1162\\-112.3672\\129\\-114.2578\\-109.3282\\129\\-112.3047\\-107.539\\129\\-110.3516\\-105.9745\\129\\-108.3984\\-104.5316\\129\\-104.4922\\-101.7802\\129\\-102.5042\\-100.6484\\129\\-98.63281\\-98.64191\\129\\-94.71241\\-96.74219\\129\\-92.77344\\-95.95979\\129\\-90.82031\\-95.4002\\129\\-88.86719\\-94.6573\\129\\-86.91406\\-94.12322\\129\\-83.00781\\-93.51393\\129\\-81.05469\\-93.13034\\129\\-79.10156\\-92.57685\\129\\-77.14844\\-92.21599\\129\\-71.28906\\-91.45488\\129\\-69.33594\\-91.07388\\129\\-67.38281\\-90.5638\\129\\-65.42969\\-90.25983\\129\\-57.61719\\-89.36724\\129\\-51.75781\\-88.49335\\129\\-49.80469\\-88.33609\\129\\-41.99219\\-87.94128\\129\\-32.22656\\-87.62547\\129\\-28.32031\\-87.58691\\129\\-24.41406\\-87.62122\\129\\-16.60156\\-87.89321\\129\\-14.64844\\-88.03247\\129\\-12.69531\\-88.3112\\129\\-10.74219\\-88.87366\\129\\-8.789063\\-89.54231\\129\\-6.835938\\-90.00277\\129\\-4.882813\\-90.57974\\129\\-2.929688\\-91.45197\\129\\-0.9765625\\-91.84882\\129\\0.9765625\\-92.04717\\129\\2.929688\\-92.11317\\129\\4.882813\\-92.00586\\129\\8.789063\\-91.41492\\129\\10.74219\\-90.70461\\129\\14.64844\\-89.44669\\129\\16.60156\\-88.56348\\129\\18.55469\\-88.14967\\129\\22.46094\\-87.74164\\129\\26.36719\\-87.0639\\129\\28.32031\\-86.77979\\129\\32.22656\\-86.41246\\129\\38.08594\\-86.13242\\129\\40.03906\\-86.07554\\129\\45.89844\\-86.08828\\129\\51.75781\\-86.33515\\129\\53.71094\\-86.48202\\129\\55.66406\\-86.75231\\129\\59.57031\\-87.45147\\129\\61.52344\\-87.71509\\129\\65.42969\\-88.10199\\129\\67.38281\\-88.37439\\129\\71.28906\\-89.34187\\129\\75.19531\\-90.03751\\129\\77.14844\\-90.4687\\129\\79.10156\\-91.19718\\129\\83.00781\\-92.20536\\129\\84.96094\\-92.9677\\129\\86.91406\\-93.60627\\129\\88.86719\\-94.02399\\129\\90.82031\\-94.70101\\129\\92.77344\\-95.5493\\129\\94.72656\\-96.23186\\129\\96.67969\\-97.30859\\129\\98.63281\\-98.21687\\129\\100.5859\\-99.43848\\129\\102.5391\\-100.2706\\129\\106.2861\\-102.6016\\129\\108.3984\\-104.005\\129\\110.3516\\-105.5859\\129\\113.7494\\-108.4609\\129\\115.7048\\-110.4141\\129\\118.1641\\-113.1438\\129\\120.8972\\-116.2734\\129\\122.237\\-118.2266\\129\\123.2778\\-120.1797\\129\\124.4857\\-122.1328\\129\\125.3443\\-124.0859\\129\\126.4743\\-126.0391\\129\\127.2234\\-127.9922\\129\\128.2077\\-129.9453\\129\\128.8499\\-131.8984\\129\\129.3876\\-133.8516\\129\\130.1157\\-135.8047\\129\\130.6106\\-137.7578\\129\\131.0049\\-139.7109\\129\\131.5104\\-141.6641\\129\\132.2021\\-143.6172\\129\\133.4246\\-149.4766\\129\\133.9815\\-151.4297\\129\\134.3725\\-153.3828\\129\\134.6539\\-155.3359\\129\\135.1149\\-159.2422\\129\\135.9482\\-165.1016\\129\\136.3334\\-169.0078\\129\\136.5423\\-172.9141\\129\\136.7373\\-178.7734\\129\\136.817\\-182.6797\\129\\136.8195\\-188.5391\\129\\136.7496\\-192.4453\\129\\136.5497\\-198.3047\\129\\136.3051\\-202.2109\\129\\135.7422\\-206.1579\\129\\134.7355\\-211.9766\\129\\134.3281\\-213.9297\\129\\133.7891\\-215.4959\\129\\132.1771\\-219.7891\\129\\131.1393\\-221.7422\\129\\130.438\\-223.6953\\129\\129.3395\\-225.6484\\129\\128.5786\\-227.6016\\129\\127.3541\\-229.5547\\129\\126.3323\\-231.5078\\129\\125\\-233.4609\\129\\122.793\\-237.3672\\129\\122.0703\\-238.3438\\129\\120.1172\\-241.2644\\129\\117.2319\\-245.1797\\129\\114.2658\\-249.0859\\129\\112.3047\\-251.3377\\129\\109.2613\\-254.9453\\129\\107.3694\\-256.8984\\129\\106.4453\\-257.7484\\129\\101.6507\\-262.7578\\129\\100.5859\\-263.665\\129\\96.67969\\-267.5329\\129\\94.72656\\-269.2881\\129\\93.10176\\-270.5703\\129\\88.47128\\-274.4766\\129\\86.91406\\-275.599\\129\\83.00781\\-278.6006\\129\\79.10156\\-281.3248\\129\\77.14844\\-282.617\\129\\75.19531\\-283.5932\\129\\73.24219\\-284.965\\129\\71.19846\\-286.1953\\129\\67.38281\\-288.3646\\129\\65.42969\\-289.1793\\129\\61.52344\\-291.0781\\129\\59.57031\\-292.1069\\129\\57.61719\\-293.026\\129\\53.71094\\-294.7447\\129\\51.75781\\-295.2178\\129\\47.85156\\-296.7074\\129\\45.89844\\-297.123\\129\\43.94531\\-297.7883\\129\\41.99219\\-298.553\\129\\40.03906\\-298.9661\\129\\38.08594\\-299.5034\\129\\36.13281\\-300.1949\\129\\34.17969\\-300.5759\\129\\28.32031\\-301.4809\\129\\26.36719\\-301.95\\129\\24.41406\\-302.3152\\129\\22.46094\\-302.5421\\129\\18.55469\\-302.8293\\129\\16.60156\\-302.9189\\129\\8.789063\\-303.4756\\129\\4.882813\\-303.811\\129\\0.9765625\\-303.9478\\129\\-2.929688\\-303.9221\\129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "255" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "191" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-303.9221\\131\\-12.69531\\-303.3039\\131\\-16.60156\\-302.9759\\131\\-20.50781\\-302.7239\\131\\-24.41406\\-302.3152\\131\\-28.32031\\-301.4447\\131\\-34.17969\\-300.5086\\131\\-36.13281\\-300.0542\\131\\-38.08594\\-299.3234\\131\\-41.99219\\-298.33\\131\\-43.94531\\-297.4289\\131\\-47.85156\\-296.3556\\131\\-49.80469\\-295.4184\\131\\-51.75781\\-294.9181\\131\\-53.71094\\-294.2537\\131\\-55.66406\\-293.2363\\131\\-57.61719\\-292.4441\\131\\-59.57031\\-291.2409\\131\\-61.52344\\-290.3872\\131\\-63.47656\\-289.2485\\131\\-65.42969\\-288.4618\\131\\-65.85385\\-288.1484\\131\\-69.22743\\-286.1953\\131\\-71.28906\\-284.9151\\131\\-73.24219\\-283.4766\\131\\-75.19531\\-282.4813\\131\\-77.14844\\-281.1793\\131\\-80.94524\\-278.3828\\131\\-83.00781\\-276.9652\\131\\-84.96094\\-275.5117\\131\\-92.77344\\-269.2928\\131\\-94.72656\\-267.6223\\131\\-98.63281\\-263.9868\\131\\-100.5859\\-262.2562\\131\\-102.5124\\-260.8047\\131\\-104.4922\\-258.7926\\131\\-106.5421\\-256.8984\\131\\-108.3984\\-255.2886\\131\\-110.5183\\-252.9922\\131\\-112.2289\\-251.0391\\131\\-114.2578\\-249.0254\\131\\-117.4216\\-245.1797\\131\\-120.7205\\-241.2734\\131\\-122.0703\\-239.2667\\131\\-123.2382\\-237.3672\\131\\-124.5473\\-235.4141\\131\\-125.5049\\-233.4609\\131\\-126.8043\\-231.5078\\131\\-128.8757\\-227.6016\\131\\-129.5965\\-225.6484\\131\\-130.5658\\-223.6953\\131\\-131.1286\\-221.7422\\131\\-132.0141\\-219.7891\\131\\-133.2409\\-215.8828\\131\\-134.0209\\-213.9297\\131\\-134.4858\\-211.9766\\131\\-135.2174\\-208.0703\\131\\-136.0822\\-204.1641\\131\\-136.3954\\-202.2109\\131\\-136.7249\\-198.3047\\131\\-137.0216\\-192.4453\\131\\-137.2204\\-186.5859\\131\\-137.2681\\-180.7266\\131\\-137.0929\\-174.8672\\131\\-136.8266\\-169.0078\\131\\-136.615\\-165.1016\\131\\-136.4588\\-163.1484\\131\\-135.9992\\-159.2422\\131\\-135.2439\\-155.3359\\131\\-134.3168\\-149.4766\\131\\-133.109\\-145.5703\\131\\-132.0766\\-141.6641\\131\\-131.2641\\-139.7109\\131\\-130.7635\\-137.7578\\131\\-130.1565\\-135.8047\\131\\-129.2834\\-133.8516\\131\\-128.7197\\-131.8984\\131\\-126.9124\\-127.9922\\131\\-125.8138\\-126.0391\\131\\-124.8498\\-124.0859\\131\\-123.6757\\-122.1328\\131\\-122.7327\\-120.1797\\131\\-121.2928\\-118.2266\\131\\-118.1641\\-114.4171\\131\\-116.4288\\-112.3672\\131\\-114.6603\\-110.4141\\131\\-112.3047\\-108.1657\\131\\-110.2283\\-106.5078\\131\\-108.3984\\-105.1989\\131\\-106.4453\\-103.661\\131\\-104.4922\\-102.2445\\131\\-102.5391\\-101.2249\\131\\-100.5859\\-100.0206\\131\\-98.63281\\-99.2709\\131\\-96.67969\\-98.08496\\131\\-94.72656\\-97.33531\\131\\-92.77344\\-96.32006\\131\\-88.86719\\-95.21336\\131\\-86.91406\\-94.47801\\131\\-84.96094\\-94.04887\\131\\-81.05469\\-93.52563\\131\\-79.10156\\-93.15907\\131\\-77.14844\\-92.64893\\131\\-75.19531\\-92.26765\\131\\-69.33594\\-91.52455\\131\\-65.42969\\-90.68196\\131\\-61.52344\\-90.0814\\131\\-53.71094\\-89.30078\\131\\-51.75781\\-89.05451\\131\\-49.80469\\-88.69859\\131\\-47.85156\\-88.50829\\131\\-43.94531\\-88.23214\\131\\-40.03906\\-88.03599\\131\\-32.22656\\-87.85727\\131\\-26.36719\\-87.82132\\131\\-22.46094\\-87.88763\\131\\-16.60156\\-88.08493\\131\\-14.64844\\-88.2595\\131\\-12.69531\\-88.70034\\131\\-10.74219\\-89.3987\\131\\-6.835938\\-90.3541\\131\\-4.882813\\-91.21282\\131\\-2.929688\\-91.82902\\131\\-0.9765625\\-92.21202\\131\\0.9765625\\-92.45651\\131\\2.929688\\-92.58675\\131\\4.882813\\-92.46421\\131\\6.835938\\-92.19785\\131\\10.74219\\-91.33504\\131\\12.69531\\-90.44662\\131\\16.60156\\-89.16322\\131\\18.55469\\-88.44819\\131\\20.50781\\-88.15709\\131\\26.36719\\-87.49783\\131\\32.22656\\-86.71473\\131\\36.13281\\-86.4545\\131\\40.03906\\-86.32359\\131\\43.94531\\-86.27501\\131\\47.85156\\-86.34671\\131\\51.75781\\-86.52041\\131\\53.71094\\-86.71473\\131\\59.57031\\-87.59167\\131\\65.42969\\-88.20788\\131\\67.38281\\-88.54313\\131\\69.33594\\-89.13343\\131\\71.28906\\-89.54004\\131\\75.19531\\-90.23738\\131\\79.10156\\-91.51266\\131\\81.05469\\-91.95161\\131\\83.00781\\-92.52113\\131\\84.96094\\-93.33418\\131\\88.86719\\-94.28043\\131\\90.82031\\-95.18385\\131\\92.77344\\-95.85387\\131\\94.72656\\-96.70434\\131\\96.67969\\-97.73045\\131\\98.63281\\-98.87079\\131\\100.5859\\-99.77713\\131\\104.4922\\-101.8591\\131\\110.3516\\-106.1416\\131\\112.3047\\-107.6756\\131\\115.2018\\-110.4141\\131\\118.1641\\-113.7658\\131\\120.2005\\-116.2734\\131\\122.832\\-120.1797\\131\\123.7178\\-122.1328\\131\\124.8151\\-124.0859\\131\\125.6183\\-126.0391\\131\\126.6716\\-127.9922\\131\\127.36\\-129.9453\\131\\128.2942\\-131.8984\\131\\128.8689\\-133.8516\\131\\129.3009\\-135.8047\\131\\130.506\\-139.7109\\131\\131.25\\-143.6172\\131\\132.383\\-147.5234\\131\\133.4321\\-153.3828\\131\\133.9286\\-155.3359\\131\\134.268\\-157.2891\\131\\134.7078\\-161.1953\\131\\135.905\\-174.8672\\131\\136.094\\-178.7734\\131\\136.2271\\-182.6797\\131\\136.2062\\-188.5391\\131\\136.1084\\-192.4453\\131\\135.905\\-196.3516\\131\\135.3306\\-202.2109\\131\\134.6954\\-208.0703\\131\\134.41\\-210.0234\\131\\133.9958\\-211.9766\\131\\133.3201\\-213.9297\\131\\132.7673\\-215.8828\\131\\132.106\\-217.8359\\131\\131.1618\\-219.7891\\131\\130.5658\\-221.7422\\131\\129.6049\\-223.6953\\131\\128.8203\\-225.6484\\131\\126.8402\\-229.5547\\131\\125.5552\\-231.5078\\131\\124.6405\\-233.4609\\131\\123.3617\\-235.4141\\131\\122.4958\\-237.3672\\131\\119.7225\\-241.2734\\131\\118.5162\\-243.2266\\131\\117.1245\\-245.1797\\131\\115.6276\\-247.1328\\131\\114.2578\\-249.0766\\131\\111.0383\\-252.9922\\131\\109.3684\\-254.9453\\131\\107.5604\\-256.8984\\131\\105.618\\-258.8516\\131\\104.4922\\-260.1232\\131\\101.98\\-262.7578\\131\\100.5859\\-263.936\\131\\95.7459\\-268.6172\\131\\91.26157\\-272.5234\\131\\88.86719\\-274.5653\\131\\86.91406\\-275.7939\\131\\83.00781\\-278.9489\\131\\81.02448\\-280.3359\\131\\79.10156\\-281.5551\\131\\77.14844\\-282.8945\\131\\75.19531\\-283.8698\\131\\74.74525\\-284.2422\\131\\71.64797\\-286.1953\\131\\71.28906\\-286.491\\131\\69.33594\\-287.4475\\131\\67.38281\\-288.6401\\131\\65.42969\\-289.3489\\131\\63.47656\\-290.4834\\131\\61.52344\\-291.2557\\131\\59.57031\\-292.4313\\131\\57.61719\\-293.1886\\131\\55.66406\\-294.1742\\131\\53.71094\\-294.8726\\131\\51.75781\\-295.3673\\131\\49.80469\\-296.2247\\131\\47.85156\\-296.8154\\131\\45.89844\\-297.2687\\131\\43.94531\\-298.0757\\131\\41.99219\\-298.6709\\131\\40.03906\\-299.0954\\131\\36.13281\\-300.31\\131\\34.17969\\-300.6718\\131\\30.27344\\-301.2614\\131\\28.32031\\-301.6353\\131\\26.36719\\-302.1126\\131\\24.41406\\-302.4101\\131\\20.50781\\-302.7748\\131\\16.60156\\-303.0042\\131\\12.69531\\-303.3232\\131\\6.835938\\-303.882\\131\\4.882813\\-304.0325\\131\\0.9765625\\-304.1404\\131\\-2.929688\\-304.12\\131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "252" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "192" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-303.9221\\133\\-14.64844\\-303.2336\\133\\-18.55469\\-302.9036\\133\\-22.46094\\-302.6466\\133\\-24.41406\\-302.4315\\133\\-26.36719\\-302.0754\\133\\-30.27344\\-301.214\\133\\-34.17969\\-300.6136\\133\\-36.13281\\-300.216\\133\\-38.08594\\-299.4804\\133\\-41.99219\\-298.4713\\133\\-43.94531\\-297.5975\\133\\-45.89844\\-297.0002\\133\\-47.85156\\-296.5021\\133\\-49.80469\\-295.5827\\133\\-53.71094\\-294.4235\\133\\-55.66406\\-293.3812\\133\\-57.61719\\-292.6201\\133\\-59.57031\\-291.3689\\133\\-61.52344\\-290.5629\\133\\-63.47656\\-289.3508\\133\\-65.42969\\-288.6333\\133\\-67.38281\\-287.3896\\133\\-69.33594\\-286.3439\\133\\-71.28906\\-285.0569\\133\\-73.24219\\-283.6224\\133\\-75.19531\\-282.6641\\133\\-79.10156\\-279.8541\\133\\-83.94299\\-276.4297\\133\\-88.86719\\-272.561\\133\\-92.77344\\-269.3243\\133\\-94.72656\\-267.6406\\133\\-98.63281\\-263.9633\\133\\-100.5859\\-262.2007\\133\\-102.25\\-260.8047\\133\\-104.4922\\-258.5055\\133\\-108.3984\\-254.9028\\133\\-111.7881\\-251.0391\\133\\-114.2578\\-248.4607\\133\\-117.0753\\-245.1797\\133\\-120.1172\\-241.195\\133\\-122.7716\\-237.3672\\133\\-123.7697\\-235.4141\\133\\-126.0901\\-231.5078\\133\\-127.1101\\-229.5547\\133\\-128.2552\\-227.6016\\133\\-129.7489\\-223.6953\\133\\-130.5812\\-221.7422\\133\\-131.1306\\-219.7891\\133\\-131.903\\-217.8359\\133\\-132.5546\\-215.8828\\133\\-133.0202\\-213.9297\\133\\-134.1912\\-210.0234\\133\\-134.5783\\-208.0703\\133\\-135.1486\\-204.1641\\133\\-135.8288\\-200.2578\\133\\-136.3216\\-196.3516\\133\\-136.5345\\-192.4453\\133\\-136.6828\\-186.5859\\133\\-136.7069\\-182.6797\\133\\-136.6469\\-176.8203\\133\\-136.5345\\-172.9141\\133\\-136.2101\\-167.0547\\133\\-135.9992\\-165.1016\\133\\-135.3777\\-161.1953\\133\\-134.4267\\-153.3828\\133\\-134.0281\\-151.4297\\133\\-133.437\\-149.4766\\133\\-132.5457\\-145.5703\\133\\-131.958\\-143.6172\\133\\-131.2117\\-141.6641\\133\\-130.7594\\-139.7109\\133\\-130.2083\\-137.7578\\133\\-129.3678\\-135.8047\\133\\-128.7818\\-133.8516\\133\\-128.0851\\-131.8984\\133\\-127.0951\\-129.9453\\133\\-126.2489\\-127.9922\\133\\-125.1131\\-126.0391\\133\\-124.2511\\-124.0859\\133\\-123.0907\\-122.1328\\133\\-122.0703\\-120.2378\\133\\-120.6853\\-118.2266\\133\\-118.1641\\-115.1541\\133\\-115.7011\\-112.3672\\133\\-112.3047\\-108.8826\\133\\-109.5133\\-106.5078\\133\\-106.4453\\-104.1576\\133\\-102.5391\\-101.6438\\133\\-100.5859\\-100.5156\\133\\-98.63281\\-99.65401\\133\\-96.67969\\-98.64313\\133\\-94.72656\\-97.73987\\133\\-90.82031\\-96.08922\\133\\-86.91406\\-95.05871\\133\\-84.96094\\-94.36658\\133\\-83.00781\\-94.01646\\133\\-79.10156\\-93.54889\\133\\-77.14844\\-93.23605\\133\\-75.19531\\-92.7005\\133\\-73.24219\\-92.3058\\133\\-67.38281\\-91.56426\\133\\-65.42969\\-91.26963\\133\\-61.52344\\-90.41806\\133\\-55.66406\\-89.79357\\133\\-51.75781\\-89.4768\\133\\-47.85156\\-89.0266\\133\\-43.94531\\-88.48344\\133\\-40.03906\\-88.23999\\133\\-36.13281\\-88.10199\\133\\-28.32031\\-87.9948\\133\\-24.41406\\-88.02415\\133\\-18.55469\\-88.18822\\133\\-16.60156\\-88.30994\\133\\-14.64844\\-88.59709\\133\\-12.69531\\-89.22334\\133\\-8.789063\\-90.16005\\133\\-4.882813\\-91.64972\\133\\-0.9765625\\-92.67435\\133\\0.9765625\\-93.1282\\133\\2.929688\\-93.27071\\133\\4.882813\\-93.14245\\133\\8.789063\\-92.26309\\133\\10.74219\\-91.76505\\133\\12.69531\\-91.10873\\133\\14.64844\\-90.17946\\133\\16.60156\\-89.63726\\133\\20.50781\\-88.41465\\133\\22.46094\\-88.10383\\133\\30.27344\\-87.40983\\133\\32.22656\\-87.12383\\133\\36.13281\\-86.793\\133\\41.99219\\-86.55338\\133\\45.89844\\-86.55338\\133\\49.80469\\-86.67662\\133\\51.75781\\-86.82001\\133\\59.57031\\-87.72729\\133\\63.47656\\-88.09517\\133\\65.42969\\-88.33878\\133\\67.38281\\-88.77314\\133\\69.33594\\-89.35181\\133\\73.24219\\-90.02832\\133\\75.19531\\-90.47642\\133\\77.14844\\-91.26438\\133\\81.05469\\-92.24458\\133\\84.96094\\-93.58667\\133\\86.91406\\-94.00171\\133\\88.86719\\-94.64296\\133\\90.82031\\-95.52759\\133\\92.77344\\-96.15128\\133\\94.72656\\-97.23689\\133\\96.67969\\-98.1044\\133\\98.63281\\-99.36087\\133\\100.5859\\-100.1044\\133\\102.5391\\-101.2928\\133\\104.4922\\-102.3517\\133\\106.4453\\-103.7307\\133\\112.3047\\-108.3418\\133\\114.5339\\-110.4141\\133\\116.2694\\-112.3672\\133\\118.1641\\-114.6265\\133\\120.9449\\-118.2266\\133\\122.25\\-120.1797\\133\\123.1408\\-122.1328\\133\\124.2098\\-124.0859\\133\\125\\-126.0391\\133\\126.7785\\-129.9453\\133\\127.4034\\-131.8984\\133\\128.2691\\-133.8516\\133\\128.7834\\-135.8047\\133\\129.6768\\-139.7109\\133\\130.3267\\-141.6641\\133\\130.7257\\-143.6172\\133\\131.3982\\-147.5234\\133\\131.9589\\-149.4766\\133\\132.4013\\-151.4297\\133\\133.2637\\-157.2891\\133\\133.9647\\-161.1953\\133\\134.2403\\-163.1484\\133\\134.5669\\-167.0547\\133\\134.8943\\-172.9141\\133\\135.1537\\-180.7266\\133\\135.1982\\-184.6328\\133\\135.1888\\-188.5391\\133\\134.9573\\-196.3516\\133\\134.7366\\-200.2578\\133\\134.4342\\-204.1641\\133\\134.2238\\-206.1172\\133\\133.8984\\-208.0703\\133\\133.3997\\-210.0234\\133\\132.5967\\-213.9297\\133\\131.9589\\-215.8828\\133\\131.1375\\-217.8359\\133\\130.6213\\-219.7891\\133\\128.999\\-223.6953\\133\\128.3027\\-225.6484\\133\\127.2116\\-227.6016\\133\\126.3735\\-229.5547\\133\\125.1371\\-231.5078\\133\\124.2084\\-233.4609\\133\\123.1197\\-235.4141\\133\\122.1576\\-237.3672\\133\\120.9581\\-239.3203\\133\\119.492\\-241.2734\\133\\118.3257\\-243.2266\\133\\117.0489\\-245.1797\\133\\115.5918\\-247.1328\\133\\114.2578\\-249.0583\\133\\110.3516\\-253.9764\\133\\107.777\\-256.8984\\133\\105.8824\\-258.8516\\133\\104.4922\\-260.4404\\133\\102.3339\\-262.7578\\133\\100.5859\\-264.2761\\133\\96.17486\\-268.6172\\133\\94.72656\\-269.692\\133\\91.55599\\-272.5234\\133\\90.82031\\-273.264\\133\\88.86719\\-274.9256\\133\\86.91406\\-276.1668\\133\\84.96094\\-277.6003\\133\\83.00781\\-279.2292\\133\\81.05469\\-280.7172\\133\\79.10156\\-281.8076\\133\\77.14844\\-283.0836\\133\\73.24219\\-285.3953\\133\\71.28906\\-286.765\\133\\69.33594\\-287.6862\\133\\67.38281\\-288.8352\\133\\65.42969\\-289.526\\133\\63.47656\\-290.7105\\133\\61.52344\\-291.462\\133\\59.57031\\-292.6736\\133\\57.61719\\-293.3901\\133\\55.66406\\-294.4207\\133\\51.75781\\-295.5201\\133\\49.80469\\-296.4299\\133\\45.89844\\-297.4197\\133\\43.94531\\-298.2911\\133\\40.03906\\-299.2402\\133\\38.08594\\-299.9338\\133\\36.13281\\-300.4393\\133\\30.27344\\-301.3752\\133\\26.36719\\-302.2476\\133\\22.46094\\-302.7127\\133\\16.60156\\-303.1053\\133\\12.69531\\-303.4777\\133\\10.74219\\-303.75\\133\\6.835938\\-304.0883\\133\\2.929688\\-304.2531\\133\\-2.929688\\-304.2617\\133\\-6.835938\\-304.0883\\133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "193" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.74219\\-303.9089\\135\\-14.64844\\-303.366\\135\\-18.55469\\-302.9824\\135\\-24.41406\\-302.5377\\135\\-26.36719\\-302.2232\\135\\-30.27344\\-301.3288\\135\\-34.17969\\-300.705\\135\\-36.13281\\-300.3405\\135\\-40.03906\\-299.0645\\135\\-41.99219\\-298.5905\\135\\-45.89844\\-297.0976\\135\\-47.85156\\-296.637\\135\\-49.80469\\-295.7597\\135\\-51.75781\\-295.111\\135\\-53.71094\\-294.5649\\135\\-55.66406\\-293.5413\\135\\-57.61719\\-292.7624\\135\\-59.57031\\-291.5193\\135\\-61.52344\\-290.7146\\135\\-63.47656\\-289.4865\\135\\-65.42969\\-288.7758\\135\\-67.38281\\-287.5242\\135\\-69.33594\\-286.5591\\135\\-72.69498\\-284.2422\\135\\-73.24219\\-283.8014\\135\\-75.19531\\-282.8367\\135\\-79.10156\\-280.0722\\135\\-81.05469\\-278.7622\\135\\-88.86719\\-272.7351\\135\\-90.82031\\-271.0173\\135\\-94.72656\\-267.7036\\135\\-99.92767\\-262.7578\\135\\-102.1589\\-260.8047\\135\\-103.9254\\-258.8516\\135\\-106.4453\\-256.3627\\135\\-108.3984\\-254.5441\\135\\-111.5274\\-251.0391\\135\\-114.2578\\-248.1375\\135\\-116.7134\\-245.1797\\135\\-118.0081\\-243.2266\\135\\-119.4231\\-241.2734\\135\\-120.947\\-239.3203\\135\\-122.2344\\-237.3672\\135\\-123.2256\\-235.4141\\135\\-124.4523\\-233.4609\\135\\-125.3152\\-231.5078\\135\\-126.5613\\-229.5547\\135\\-127.3999\\-227.6016\\135\\-128.457\\-225.6484\\135\\-129.1155\\-223.6953\\135\\-130.6243\\-219.7891\\135\\-131.0608\\-217.8359\\135\\-131.6757\\-215.8828\\135\\-132.3897\\-213.9297\\135\\-133.2056\\-210.0234\\135\\-133.7891\\-208.0446\\135\\-134.2586\\-206.1172\\135\\-134.5434\\-204.1641\\135\\-135.4096\\-196.3516\\135\\-135.9314\\-190.4922\\135\\-136.1031\\-186.5859\\135\\-136.1286\\-180.7266\\135\\-135.9466\\-174.8672\\135\\-135.3044\\-167.0547\\135\\-134.597\\-159.2422\\135\\-134.0901\\-155.3359\\135\\-133.1439\\-151.4297\\135\\-132.4161\\-147.5234\\135\\-131.1584\\-143.6172\\135\\-130.2437\\-139.7109\\135\\-129.4188\\-137.7578\\135\\-128.8879\\-135.8047\\135\\-128.2436\\-133.8516\\135\\-127.2766\\-131.8984\\135\\-126.5542\\-129.9453\\135\\-125.3971\\-127.9922\\135\\-124.622\\-126.0391\\135\\-123.4606\\-124.0859\\135\\-122.6428\\-122.1328\\135\\-121.2801\\-120.1797\\135\\-118.3879\\-116.2734\\135\\-116.8038\\-114.3203\\135\\-115.1055\\-112.3672\\135\\-114.2578\\-111.5796\\135\\-112.3047\\-109.5233\\135\\-110.3516\\-107.7614\\135\\-108.3984\\-106.2421\\135\\-102.5391\\-102.0658\\135\\-100.5859\\-101.1435\\135\\-98.63281\\-100.0082\\135\\-96.67969\\-99.27474\\135\\-94.72656\\-98.12994\\135\\-92.77344\\-97.44463\\135\\-90.82031\\-96.52439\\135\\-88.86719\\-95.89621\\135\\-86.91406\\-95.45462\\135\\-83.00781\\-94.33151\\135\\-81.05469\\-93.99676\\135\\-77.14844\\-93.59029\\135\\-75.19531\\-93.27803\\135\\-71.28906\\-92.35632\\135\\-69.33594\\-92.0859\\135\\-65.42969\\-91.64822\\135\\-63.47656\\-91.33401\\135\\-59.57031\\-90.56166\\135\\-55.66406\\-90.06358\\135\\-47.85156\\-89.45644\\135\\-41.99219\\-88.71835\\135\\-40.03906\\-88.53233\\135\\-36.13281\\-88.33498\\135\\-30.27344\\-88.20337\\135\\-24.41406\\-88.23999\\135\\-20.50781\\-88.36162\\135\\-18.55469\\-88.48154\\135\\-16.60156\\-88.74474\\135\\-10.74219\\-90.0023\\135\\-8.789063\\-90.54672\\135\\-6.835938\\-91.39582\\135\\-2.929688\\-92.57685\\135\\-0.9765625\\-93.30442\\135\\0.9765625\\-93.56535\\135\\2.929688\\-93.63494\\135\\4.882813\\-93.56226\\135\\6.835938\\-93.31084\\135\\8.660567\\-92.83594\\135\\12.69531\\-91.60207\\135\\14.64844\\-90.68337\\135\\16.60156\\-89.99242\\135\\18.55469\\-89.54231\\135\\22.46094\\-88.38789\\135\\24.41406\\-88.1251\\135\\30.27344\\-87.72443\\135\\34.17969\\-87.3401\\135\\40.03906\\-87.00078\\135\\45.89844\\-86.95274\\135\\49.80469\\-87.06319\\135\\61.52344\\-88.00047\\135\\65.42969\\-88.49787\\135\\67.38281\\-89.06713\\135\\69.33594\\-89.52386\\135\\73.24219\\-90.21522\\135\\75.19531\\-90.76074\\135\\77.14844\\-91.48875\\135\\81.05469\\-92.49985\\135\\83.00781\\-93.29031\\135\\86.91406\\-94.215\\135\\88.86719\\-95.09783\\135\\92.77344\\-96.53547\\135\\94.72656\\-97.62223\\135\\98.63281\\-99.66592\\135\\100.5859\\-100.5604\\135\\102.5391\\-101.6694\\135\\106.4453\\-104.259\\135\\109.3427\\-106.5078\\135\\112.3047\\-109.0278\\135\\113.7517\\-110.4141\\135\\115.625\\-112.3672\\135\\118.1641\\-115.3594\\135\\120.3169\\-118.2266\\135\\122.7192\\-122.1328\\135\\123.4189\\-124.0859\\135\\124.485\\-126.0391\\135\\125.1489\\-127.9922\\135\\126.0431\\-129.9453\\135\\126.7818\\-131.8984\\135\\127.3489\\-133.8516\\135\\128.1279\\-135.8047\\135\\128.6621\\-137.7578\\135\\129.4511\\-141.6641\\135\\130.0872\\-143.6172\\135\\130.5151\\-145.5703\\135\\131.0559\\-149.4766\\135\\131.4273\\-151.4297\\135\\132.3089\\-155.3359\\135\\132.585\\-157.2891\\135\\132.9859\\-161.1953\\135\\134.0827\\-170.9609\\135\\134.2838\\-174.8672\\135\\134.434\\-180.7266\\135\\134.4543\\-186.5859\\135\\134.38\\-192.4453\\135\\134.2282\\-196.3516\\135\\133.9017\\-200.2578\\135\\132.6534\\-210.0234\\135\\132.3059\\-211.9766\\135\\131.0608\\-215.8828\\135\\130.6183\\-217.8359\\135\\129.9393\\-219.7891\\135\\129.1426\\-221.7422\\135\\128.562\\-223.6953\\135\\127.5997\\-225.6484\\135\\126.7849\\-227.6016\\135\\125.7378\\-229.5547\\135\\124.8629\\-231.5078\\135\\123.7518\\-233.4609\\135\\122.9431\\-235.4141\\135\\120.7886\\-239.3203\\135\\119.3438\\-241.2734\\135\\116.9909\\-245.1797\\135\\115.5746\\-247.1328\\135\\114.2656\\-249.0859\\135\\112.3047\\-251.5502\\135\\110.3516\\-254.1406\\135\\108.3984\\-256.4671\\135\\106.1695\\-258.8516\\135\\104.5003\\-260.8047\\135\\102.7129\\-262.7578\\135\\100.5859\\-264.7488\\135\\96.59677\\-268.6172\\135\\94.72656\\-270.0749\\135\\90.82031\\-273.545\\135\\88.86719\\-275.1958\\135\\86.91406\\-276.6065\\135\\84.96094\\-277.8945\\135\\81.05469\\-280.9931\\135\\79.10156\\-282.0695\\135\\75.19531\\-284.6192\\135\\73.24219\\-285.6433\\135\\71.28906\\-286.966\\135\\67.38281\\-289.0037\\135\\65.42969\\-289.7548\\135\\63.47656\\-290.9067\\135\\61.52344\\-291.7446\\135\\59.57031\\-292.858\\135\\57.61719\\-293.6107\\135\\55.66406\\-294.6074\\135\\51.75781\\-295.7039\\135\\49.80469\\-296.5904\\135\\47.85156\\-297.0315\\135\\45.89844\\-297.6341\\135\\43.94531\\-298.4713\\135\\40.03906\\-299.4283\\135\\38.08594\\-300.1396\\135\\36.13281\\-300.5615\\135\\32.22656\\-301.1548\\135\\30.27344\\-301.516\\135\\28.32031\\-302.0067\\135\\26.36719\\-302.3571\\135\\24.41406\\-302.6097\\135\\18.55469\\-303.0286\\135\\14.64844\\-303.3948\\135\\10.74219\\-303.9729\\135\\6.835938\\-304.2531\\135\\2.929688\\-304.3805\\135\\-2.929688\\-304.3877\\135\\-6.835938\\-304.2443\\135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "257" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "194" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-303.5014\\137\\-18.55469\\-303.0678\\137\\-24.41406\\-302.6097\\137\\-26.36719\\-302.3477\\137\\-28.32031\\-301.95\\137\\-30.27344\\-301.4447\\137\\-36.13281\\-300.4393\\137\\-38.08594\\-299.8748\\137\\-40.03906\\-299.1788\\137\\-41.99219\\-298.7041\\137\\-43.94531\\-298.0495\\137\\-45.89844\\-297.1983\\137\\-47.85156\\-296.7455\\137\\-51.75781\\-295.1906\\137\\-53.71094\\-294.6811\\137\\-55.66406\\-293.7142\\137\\-57.61719\\-292.8694\\137\\-59.57031\\-291.7096\\137\\-61.52344\\-290.8315\\137\\-63.47656\\-289.6472\\137\\-65.42969\\-288.8934\\137\\-67.38281\\-287.6931\\137\\-69.33594\\-286.7405\\137\\-73.24219\\-283.998\\137\\-75.19531\\-282.9795\\137\\-77.14844\\-281.5962\\137\\-79.09139\\-280.3359\\137\\-81.05469\\-278.9272\\137\\-84.96094\\-275.8706\\137\\-86.86572\\-274.4766\\137\\-88.86719\\-272.897\\137\\-90.82031\\-271.1428\\137\\-94.72656\\-267.7792\\137\\-98.63281\\-263.9853\\137\\-102.1205\\-260.8047\\137\\-103.8886\\-258.8516\\137\\-105.8057\\-256.8984\\137\\-108.3984\\-254.3757\\137\\-110.3516\\-252.1395\\137\\-112.3047\\-250.0266\\137\\-114.8776\\-247.1328\\137\\-116.2836\\-245.1797\\137\\-117.5851\\-243.2266\\137\\-118.1641\\-242.5567\\137\\-120.5039\\-239.3203\\137\\-121.6355\\-237.3672\\137\\-122.8831\\-235.4141\\137\\-123.7645\\-233.4609\\137\\-124.9023\\-231.5078\\137\\-126.85\\-227.6016\\137\\-128.6483\\-223.6953\\137\\-129.2087\\-221.7422\\137\\-129.9702\\-219.7891\\137\\-130.5857\\-217.8359\\137\\-131.4494\\-213.9297\\137\\-132.1658\\-211.9766\\137\\-132.599\\-210.0234\\137\\-133.335\\-206.1172\\137\\-134.1886\\-202.2109\\137\\-134.4305\\-200.2578\\137\\-134.7656\\-196.3516\\137\\-135.1096\\-190.4922\\137\\-135.2539\\-186.5859\\137\\-135.2737\\-180.7266\\137\\-135.1303\\-174.8672\\137\\-134.7433\\-167.0547\\137\\-134.442\\-163.1484\\137\\-133.9928\\-159.2422\\137\\-133.2234\\-155.3359\\137\\-132.2377\\-149.4766\\137\\-131.5703\\-147.5234\\137\\-131.0816\\-145.5703\\137\\-130.7373\\-143.6172\\137\\-130.2437\\-141.6641\\137\\-129.4852\\-139.7109\\137\\-128.4277\\-135.8047\\137\\-127.4805\\-133.8516\\137\\-126.7499\\-131.8984\\137\\-125.7215\\-129.9453\\137\\-124.9075\\-127.9922\\137\\-123.9034\\-126.0391\\137\\-123.0283\\-124.0859\\137\\-122.0703\\-122.3051\\137\\-120.7357\\-120.1797\\137\\-119.0828\\-118.2266\\137\\-117.5795\\-116.2734\\137\\-116.2109\\-114.3682\\137\\-114.4287\\-112.3672\\137\\-112.3047\\-110.1738\\137\\-110.3516\\-108.319\\137\\-104.4922\\-103.9144\\137\\-102.5278\\-102.6016\\137\\-98.63281\\-100.4577\\137\\-96.67969\\-99.63069\\137\\-92.77344\\-97.80801\\137\\-90.82031\\-97.11007\\137\\-88.86719\\-96.20784\\137\\-84.96094\\-95.33517\\137\\-81.05469\\-94.26779\\137\\-79.10156\\-93.97021\\137\\-75.19531\\-93.58136\\137\\-73.24219\\-93.29818\\137\\-69.33594\\-92.38296\\137\\-63.47656\\-91.65239\\137\\-59.57031\\-91.09905\\137\\-55.66406\\-90.38277\\137\\-53.71094\\-90.17602\\137\\-45.89844\\-89.58624\\137\\-40.03906\\-89.02586\\137\\-38.08594\\-88.80199\\137\\-34.17969\\-88.56519\\137\\-30.27344\\-88.45802\\137\\-24.41406\\-88.50539\\137\\-22.46094\\-88.56261\\137\\-20.50781\\-88.71835\\137\\-16.60156\\-89.2597\\137\\-12.69531\\-89.87971\\137\\-10.74219\\-90.2901\\137\\-6.835938\\-91.75026\\137\\-4.882813\\-92.34766\\137\\-2.929688\\-93.20301\\137\\-0.9765625\\-93.64877\\137\\2.929688\\-93.87241\\137\\4.882813\\-93.83036\\137\\6.835938\\-93.68229\\137\\8.789063\\-93.40927\\137\\12.69531\\-91.98745\\137\\14.64844\\-91.36483\\137\\16.60156\\-90.40063\\137\\18.55469\\-89.8896\\137\\20.50781\\-89.50089\\137\\24.41406\\-88.44819\\137\\28.32031\\-88.03804\\137\\34.17969\\-87.69188\\137\\36.13281\\-87.6255\\137\\38.08594\\-87.45474\\137\\41.99219\\-87.33487\\137\\45.89844\\-87.33487\\137\\51.75781\\-87.48123\\137\\57.61719\\-87.81617\\137\\61.52344\\-88.1139\\137\\63.47656\\-88.34375\\137\\65.42969\\-88.71991\\137\\67.38281\\-89.32159\\137\\71.28906\\-89.98981\\137\\73.24219\\-90.39453\\137\\75.19531\\-91.11465\\137\\77.14844\\-91.67178\\137\\79.10156\\-92.13005\\137\\83.00781\\-93.51768\\137\\84.96094\\-93.90292\\137\\86.91406\\-94.47569\\137\\88.86719\\-95.4254\\137\\90.82031\\-96.04122\\137\\92.77344\\-97.05386\\137\\94.72656\\-97.92641\\137\\96.67969\\-99.13921\\137\\98.63281\\-99.92068\\137\\100.5859\\-101.1333\\137\\102.5391\\-102.0196\\137\\106.4453\\-104.9495\\137\\108.3984\\-106.2278\\137\\110.3516\\-107.8168\\137\\112.3047\\-109.619\\137\\114.2578\\-111.6871\\137\\115.0351\\-112.3672\\137\\116.7417\\-114.3203\\137\\118.2306\\-116.2734\\137\\119.4765\\-118.2266\\137\\120.95\\-120.1797\\137\\122.0703\\-122.1714\\137\\122.9855\\-124.0859\\137\\123.6637\\-126.0391\\137\\124.6399\\-127.9922\\137\\125.2125\\-129.9453\\137\\126.0442\\-131.8984\\137\\126.7455\\-133.8516\\137\\127.2727\\-135.8047\\137\\127.9533\\-137.7578\\137\\128.5282\\-139.7109\\137\\129.6768\\-145.5703\\137\\130.2203\\-147.5234\\137\\130.5768\\-149.4766\\137\\131.3155\\-155.3359\\137\\132.075\\-159.2422\\137\\132.3452\\-161.1953\\137\\132.701\\-165.1016\\137\\133.0752\\-170.9609\\137\\133.2881\\-176.8203\\137\\133.3866\\-180.7266\\137\\133.4104\\-188.5391\\137\\133.2728\\-194.3984\\137\\132.8125\\-202.2109\\137\\132.4998\\-206.1172\\137\\132.2554\\-208.0703\\137\\131.8586\\-210.0234\\137\\131.338\\-211.9766\\137\\130.6091\\-215.8828\\137\\130\\-217.8359\\137\\129.2892\\-219.7891\\137\\128.776\\-221.7422\\137\\128.0703\\-223.6953\\137\\127.1342\\-225.6484\\137\\126.4166\\-227.6016\\137\\125.3196\\-229.5547\\137\\124.6192\\-231.5078\\137\\123.4426\\-233.4609\\137\\122.8058\\-235.4141\\137\\121.6241\\-237.3672\\137\\120.6727\\-239.3203\\137\\119.2558\\-241.2734\\137\\118.028\\-243.2266\\137\\116.9782\\-245.1797\\137\\115.5831\\-247.1328\\137\\114.3265\\-249.0859\\137\\112.8673\\-251.0391\\137\\111.283\\-252.9922\\137\\110.3516\\-254.335\\137\\108.3984\\-256.7628\\137\\104.4922\\-261.1906\\137\\103.0087\\-262.7578\\137\\98.63281\\-267.0858\\137\\96.67969\\-268.9063\\137\\92.77344\\-272.0932\\137\\90.82031\\-273.8545\\137\\86.91406\\-276.9412\\137\\84.96094\\-278.2787\\137\\81.05469\\-281.2113\\137\\79.10156\\-282.4229\\137\\77.14844\\-283.4924\\137\\75.19531\\-284.8731\\137\\69.33594\\-288.3087\\137\\67.38281\\-289.1552\\137\\63.47656\\-291.073\\137\\61.52344\\-292.1355\\137\\55.66406\\-294.7447\\137\\53.71094\\-295.2378\\137\\49.80469\\-296.7126\\137\\47.85156\\-297.136\\137\\43.94531\\-298.6182\\137\\41.99219\\-299.0542\\137\\40.03906\\-299.6265\\137\\38.08594\\-300.3127\\137\\36.13281\\-300.6652\\137\\32.22656\\-301.265\\137\\28.32031\\-302.1646\\137\\26.36719\\-302.4817\\137\\24.41406\\-302.6762\\137\\18.55469\\-303.1205\\137\\14.64844\\-303.5767\\137\\12.69531\\-303.9221\\137\\10.74219\\-304.1404\\137\\6.835938\\-304.3732\\137\\2.929688\\-304.4752\\137\\-2.929688\\-304.4752\\137\\-6.835938\\-304.3583\\137\\-10.74219\\-304.0664\\137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "255" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "195" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-303.6735\\139\\-20.50781\\-302.9739\\139\\-24.41406\\-302.6826\\139\\-26.36719\\-302.461\\139\\-28.32031\\-302.1003\\139\\-30.27344\\-301.5816\\139\\-32.22656\\-301.1796\\139\\-36.13281\\-300.5164\\139\\-38.08594\\-300.0666\\139\\-40.03906\\-299.31\\139\\-43.94531\\-298.2606\\139\\-45.89844\\-297.3281\\139\\-47.85156\\-296.8272\\139\\-49.80469\\-296.1996\\139\\-51.75781\\-295.3036\\139\\-53.71094\\-294.7879\\139\\-57.61719\\-292.9941\\139\\-63.18547\\-290.1016\\139\\-63.47656\\-289.8687\\139\\-65.42969\\-289.0037\\139\\-67.38281\\-287.9061\\139\\-69.33594\\-286.9103\\139\\-71.28906\\-285.53\\139\\-76.4695\\-282.2891\\139\\-77.14844\\-281.7798\\139\\-79.10156\\-280.6201\\139\\-81.05469\\-279.1362\\139\\-84.96094\\-276.0228\\139\\-86.91406\\-274.6331\\139\\-88.86719\\-273.0878\\139\\-90.82031\\-271.2847\\139\\-94.72656\\-267.8959\\139\\-96.0264\\-266.6641\\139\\-98.63281\\-264.0349\\139\\-102.1237\\-260.8047\\139\\-103.8744\\-258.8516\\139\\-105.7556\\-256.8984\\139\\-108.3984\\-254.2918\\139\\-110.3516\\-252.0156\\139\\-112.3047\\-249.8447\\139\\-114.6123\\-247.1328\\139\\-115.9144\\-245.1797\\139\\-118.1641\\-242.1259\\139\\-119.9105\\-239.3203\\139\\-122.5518\\-235.4141\\139\\-123.3003\\-233.4609\\139\\-124.5085\\-231.5078\\139\\-125.2573\\-229.5547\\139\\-126.3733\\-227.6016\\139\\-127.1451\\-225.6484\\139\\-128.0851\\-223.6953\\139\\-128.7827\\-221.7422\\139\\-129.2509\\-219.7891\\139\\-129.9543\\-217.8359\\139\\-130.5523\\-215.8828\\139\\-131.2699\\-211.9766\\139\\-132.4132\\-208.0703\\139\\-133.2856\\-202.2109\\139\\-134.0008\\-198.3047\\139\\-134.2291\\-196.3516\\139\\-134.5801\\-190.4922\\139\\-134.7053\\-186.5859\\139\\-134.7492\\-182.6797\\139\\-134.7053\\-178.7734\\139\\-134.5606\\-172.9141\\139\\-134.3659\\-169.0078\\139\\-134.0365\\-165.1016\\139\\-133.418\\-161.1953\\139\\-132.6867\\-155.3359\\139\\-132.4075\\-153.3828\\139\\-131.9845\\-151.4297\\139\\-131.3837\\-149.4766\\139\\-130.9821\\-147.5234\\139\\-130.686\\-145.5703\\139\\-130.2552\\-143.6172\\139\\-129.5361\\-141.6641\\139\\-128.5666\\-137.7578\\139\\-127.7199\\-135.8047\\139\\-126.1676\\-131.8984\\139\\-125.1468\\-129.9453\\139\\-124.4181\\-127.9922\\139\\-123.3222\\-126.0391\\139\\-122.5586\\-124.0859\\139\\-120.1172\\-120.3696\\139\\-118.5959\\-118.2266\\139\\-116.2109\\-115.2248\\139\\-113.6407\\-112.3672\\139\\-110.3516\\-109.0138\\139\\-109.7301\\-108.4609\\139\\-106.4453\\-105.8671\\139\\-104.4922\\-104.4832\\139\\-100.5859\\-101.8908\\139\\-98.63281\\-101.0434\\139\\-96.67969\\-99.94212\\139\\-94.72656\\-99.28125\\139\\-92.77344\\-98.1804\\139\\-90.82031\\-97.52682\\139\\-88.86719\\-96.67561\\139\\-86.91406\\-96.01987\\139\\-83.00781\\-95.25377\\139\\-81.05469\\-94.64523\\139\\-79.10156\\-94.22266\\139\\-77.14844\\-93.95115\\139\\-73.24219\\-93.5858\\139\\-71.28906\\-93.29818\\139\\-67.38281\\-92.43921\\139\\-63.47656\\-91.92073\\139\\-57.61719\\-91.22333\\139\\-53.71094\\-90.49587\\139\\-49.80469\\-90.11445\\139\\-41.99219\\-89.59728\\139\\-36.13281\\-89.18237\\139\\-32.22656\\-88.9973\\139\\-28.32031\\-88.93732\\139\\-26.36719\\-89.04066\\139\\-24.41406\\-89.02734\\139\\-20.50781\\-89.24406\\139\\-16.60156\\-89.60491\\139\\-12.69531\\-90.13286\\139\\-10.74219\\-90.66962\\139\\-8.789063\\-91.50052\\139\\-6.835938\\-92.0776\\139\\-4.882813\\-92.89197\\139\\-2.929688\\-93.59743\\139\\0.9765625\\-94.06916\\139\\2.929688\\-94.13176\\139\\4.882813\\-94.08619\\139\\8.789063\\-93.71484\\139\\10.74219\\-93.29433\\139\\12.69531\\-92.35971\\139\\14.64844\\-91.76068\\139\\18.55469\\-90.28665\\139\\24.41406\\-89.0816\\139\\26.36719\\-88.56615\\139\\28.32031\\-88.29779\\139\\30.27344\\-88.14967\\139\\38.08594\\-87.77339\\139\\43.94531\\-87.66626\\139\\47.85156\\-87.65831\\139\\51.75781\\-87.71803\\139\\57.61719\\-87.94128\\139\\61.52344\\-88.24427\\139\\63.47656\\-88.52168\\139\\67.38281\\-89.52933\\139\\71.28906\\-90.16124\\139\\73.24219\\-90.63362\\139\\75.19531\\-91.37109\\139\\79.10156\\-92.3298\\139\\81.05469\\-93.14023\\139\\83.00781\\-93.66871\\139\\84.96094\\-94.08517\\139\\88.86719\\-95.66562\\139\\90.82031\\-96.35563\\139\\92.77344\\-97.4519\\139\\94.72656\\-98.31828\\139\\96.67969\\-99.50412\\139\\98.63281\\-100.262\\139\\100.5859\\-101.4685\\139\\102.5391\\-102.4992\\139\\104.4922\\-103.8762\\139\\106.4453\\-105.43\\139\\108.0095\\-106.5078\\139\\110.3516\\-108.3347\\139\\112.3047\\-110.1738\\139\\114.445\\-112.3672\\139\\116.2109\\-114.388\\139\\120.3649\\-120.1797\\139\\121.3379\\-122.1328\\139\\122.5318\\-124.0859\\139\\123.8594\\-127.9922\\139\\124.725\\-129.9453\\139\\125.2214\\-131.8984\\139\\126.0287\\-133.8516\\139\\126.6902\\-135.8047\\139\\127.1652\\-137.7578\\139\\128.373\\-141.6641\\139\\128.771\\-143.6172\\139\\129.3747\\-147.5234\\139\\130.2804\\-151.4297\\139\\130.5682\\-153.3828\\139\\131.1435\\-159.2422\\139\\131.9307\\-165.1016\\139\\132.2889\\-169.0078\\139\\132.4564\\-172.9141\\139\\132.6119\\-180.7266\\139\\132.6392\\-188.5391\\139\\132.5552\\-194.3984\\139\\132.3901\\-198.3047\\139\\132.1289\\-202.2109\\139\\131.8881\\-204.1641\\139\\131.2858\\-208.0703\\139\\130.5804\\-213.9297\\139\\130.0583\\-215.8828\\139\\129.3713\\-217.8359\\139\\128.4211\\-221.7422\\139\\127.5249\\-223.6953\\139\\126.8246\\-225.6484\\139\\125.0483\\-229.5547\\139\\124.3234\\-231.5078\\139\\123.3003\\-233.4609\\139\\122.6601\\-235.4141\\139\\121.4489\\-237.3672\\139\\120.575\\-239.3203\\139\\119.1996\\-241.2734\\139\\117.9844\\-243.2266\\139\\116.9733\\-245.1797\\139\\115.6173\\-247.1328\\139\\114.4531\\-249.0859\\139\\112.9702\\-251.0391\\139\\111.3504\\-252.9922\\139\\110.3516\\-254.5529\\139\\108.5825\\-256.8984\\139\\106.8945\\-258.8516\\139\\104.4922\\-261.4676\\139\\101.3338\\-264.7109\\139\\99.26022\\-266.6641\\139\\98.63281\\-267.4029\\139\\95.15625\\-270.5703\\139\\90.50674\\-274.4766\\139\\88.86719\\-275.637\\139\\84.96094\\-278.6939\\139\\82.69794\\-280.3359\\139\\79.10156\\-282.7466\\139\\77.14844\\-283.7236\\139\\76.51654\\-284.2422\\139\\73.45448\\-286.1953\\139\\71.28906\\-287.3803\\139\\69.33594\\-288.5817\\139\\67.38281\\-289.3047\\139\\65.42969\\-290.4549\\139\\63.47656\\-291.2576\\139\\61.52344\\-292.4636\\139\\59.57031\\-293.217\\139\\57.61719\\-294.2031\\139\\55.66406\\-294.8712\\139\\53.71094\\-295.3891\\139\\51.75781\\-296.263\\139\\49.80469\\-296.8388\\139\\47.85156\\-297.303\\139\\45.89844\\-298.1959\\139\\43.94531\\-298.7617\\139\\41.99219\\-299.2216\\139\\40.03906\\-299.9194\\139\\38.08594\\-300.4427\\139\\32.22656\\-301.4066\\139\\28.32031\\-302.325\\139\\26.36719\\-302.591\\139\\22.46094\\-302.8813\\139\\18.55469\\-303.2514\\139\\12.69531\\-304.1505\\139\\8.789063\\-304.4159\\139\\0.9765625\\-304.5951\\139\\-4.882813\\-304.525\\139\\-8.789063\\-304.3658\\139\\-10.74219\\-304.2354\\139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "245" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "196" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-303.5781\\141\\-20.50781\\-303.0607\\141\\-26.36719\\-302.5527\\141\\-28.32031\\-302.234\\141\\-32.22656\\-301.2835\\141\\-36.13281\\-300.6136\\141\\-38.08594\\-300.2286\\141\\-40.03906\\-299.4703\\141\\-43.94531\\-298.4194\\141\\-45.89844\\-297.4965\\141\\-49.80469\\-296.3766\\141\\-51.75781\\-295.4265\\141\\-53.71094\\-294.8897\\141\\-55.66406\\-294.1336\\141\\-57.61719\\-293.138\\141\\-59.57031\\-292.257\\141\\-61.52344\\-291.1178\\141\\-67.38281\\-288.2036\\141\\-69.33594\\-287.0857\\141\\-71.28906\\-285.7605\\141\\-73.24219\\-284.6101\\141\\-75.19531\\-283.2369\\141\\-79.10156\\-280.8607\\141\\-79.69501\\-280.3359\\141\\-82.27361\\-278.3828\\141\\-83.00781\\-277.7122\\141\\-84.96094\\-276.217\\141\\-86.91406\\-274.9224\\141\\-88.86719\\-273.2837\\141\\-90.82031\\-271.4563\\141\\-94.72656\\-268.0259\\141\\-98.63281\\-264.166\\141\\-102.2461\\-260.8047\\141\\-103.9103\\-258.8516\\141\\-105.7651\\-256.8984\\141\\-108.3984\\-254.2771\\141\\-112.8415\\-249.0859\\141\\-114.3932\\-247.1328\\141\\-115.6994\\-245.1797\\141\\-118.4789\\-241.2734\\141\\-119.5076\\-239.3203\\141\\-120.9551\\-237.3672\\141\\-122.1563\\-235.4141\\141\\-124.939\\-229.5547\\141\\-125.7026\\-227.6016\\141\\-126.7324\\-225.6484\\141\\-127.3885\\-223.6953\\141\\-128.3322\\-221.7422\\141\\-129.2864\\-217.8359\\141\\-130.494\\-213.9297\\141\\-131.1427\\-210.0234\\141\\-132.1742\\-206.1172\\141\\-132.4961\\-204.1641\\141\\-133.405\\-196.3516\\141\\-133.8838\\-192.4453\\141\\-134.1529\\-188.5391\\141\\-134.2279\\-186.5859\\141\\-134.2804\\-180.7266\\141\\-134.1986\\-176.8203\\141\\-133.9899\\-172.9141\\141\\-133.6506\\-169.0078\\141\\-133.2115\\-165.1016\\141\\-132.6663\\-159.2422\\141\\-132.1508\\-155.3359\\141\\-131.2488\\-151.4297\\141\\-130.6463\\-147.5234\\141\\-130.2411\\-145.5703\\141\\-129.5597\\-143.6172\\141\\-128.6438\\-139.7109\\141\\-127.9529\\-137.7578\\141\\-127.1405\\-135.8047\\141\\-126.4921\\-133.8516\\141\\-125.4213\\-131.8984\\141\\-124.7104\\-129.9453\\141\\-123.6905\\-127.9922\\141\\-122.9137\\-126.0391\\141\\-121.7923\\-124.0859\\141\\-120.7785\\-122.1328\\141\\-117.7572\\-118.2266\\141\\-116.539\\-116.2734\\141\\-114.9018\\-114.3203\\141\\-111.0715\\-110.4141\\141\\-110.3516\\-109.6176\\141\\-108.3984\\-107.803\\141\\-106.4453\\-106.4054\\141\\-104.4922\\-105.153\\141\\-102.5391\\-103.65\\141\\-100.5859\\-102.3521\\141\\-98.63281\\-101.4234\\141\\-96.67969\\-100.3351\\141\\-94.72656\\-99.62018\\141\\-90.82031\\-97.84151\\141\\-88.86719\\-97.18843\\141\\-86.91406\\-96.35549\\141\\-84.96094\\-95.88626\\141\\-81.05469\\-95.09335\\141\\-79.10156\\-94.54676\\141\\-77.14844\\-94.19156\\141\\-75.19531\\-93.93909\\141\\-71.28906\\-93.54562\\141\\-67.38281\\-92.92188\\141\\-65.42969\\-92.51041\\141\\-61.52344\\-91.93249\\141\\-57.61719\\-91.55041\\141\\-55.66406\\-91.3066\\141\\-51.75781\\-90.63533\\141\\-47.85156\\-90.21602\\141\\-38.08594\\-89.61935\\141\\-34.17969\\-89.46828\\141\\-28.32031\\-89.39324\\141\\-22.46094\\-89.50378\\141\\-16.60156\\-89.86402\\141\\-14.64844\\-90.10262\\141\\-12.69531\\-90.47591\\141\\-10.74219\\-91.21512\\141\\-6.835938\\-92.49985\\141\\-4.882813\\-93.38566\\141\\-2.929688\\-93.82449\\141\\0.9765625\\-94.41936\\141\\2.929688\\-94.52338\\141\\4.882813\\-94.44727\\141\\8.789063\\-93.95991\\141\\10.74219\\-93.62791\\141\\12.69531\\-92.93915\\141\\14.64844\\-92.08916\\141\\16.60156\\-91.53947\\141\\18.55469\\-90.78664\\141\\20.50781\\-90.21107\\141\\24.41406\\-89.55539\\141\\28.32031\\-88.78473\\141\\30.27344\\-88.49642\\141\\32.22656\\-88.31056\\141\\38.08594\\-88.00105\\141\\43.94531\\-87.86381\\141\\49.80469\\-87.85727\\141\\55.66406\\-87.99431\\141\\57.61719\\-88.08843\\141\\61.52344\\-88.4317\\141\\63.47656\\-88.81613\\141\\65.42969\\-89.34457\\141\\71.28906\\-90.36476\\141\\75.19531\\-91.55455\\141\\79.10156\\-92.57685\\141\\81.05469\\-93.35721\\141\\84.96094\\-94.30078\\141\\86.91406\\-95.27402\\141\\88.86719\\-95.88258\\141\\90.73154\\-96.74219\\141\\96.67969\\-99.7429\\141\\100.5859\\-101.769\\141\\104.4922\\-104.364\\141\\107.3649\\-106.5078\\141\\110.3516\\-108.9642\\141\\113.6947\\-112.3672\\141\\115.5104\\-114.3203\\141\\117.0489\\-116.2734\\141\\118.401\\-118.2266\\141\\119.5378\\-120.1797\\141\\120.8643\\-122.1328\\141\\122.7409\\-126.0391\\141\\123.2767\\-127.9922\\141\\124.0786\\-129.9453\\141\\124.753\\-131.8984\\141\\125.2339\\-133.8516\\141\\126.6142\\-137.7578\\141\\127.5112\\-141.6641\\141\\128.1523\\-143.6172\\141\\128.5828\\-145.5703\\141\\129.1177\\-149.4766\\141\\129.4465\\-151.4297\\141\\130.2321\\-155.3359\\141\\130.4979\\-157.2891\\141\\130.8363\\-161.1953\\141\\131.3244\\-169.0078\\141\\131.4776\\-172.9141\\141\\131.7042\\-182.6797\\141\\131.7486\\-186.5859\\141\\131.7344\\-190.4922\\141\\131.6467\\-194.3984\\141\\131.4715\\-198.3047\\141\\130.8481\\-208.0703\\141\\130.4455\\-211.9766\\141\\130.0569\\-213.9297\\141\\129.4526\\-215.8828\\141\\128.6373\\-219.7891\\141\\128.0117\\-221.7422\\141\\127.1738\\-223.6953\\141\\126.5848\\-225.6484\\141\\125.539\\-227.6016\\141\\124.8921\\-229.5547\\141\\123.2146\\-233.4609\\141\\122.5619\\-235.4141\\141\\121.3833\\-237.3672\\141\\120.504\\-239.3203\\141\\119.1833\\-241.2734\\141\\117.9858\\-243.2266\\141\\116.9934\\-245.1797\\141\\115.7096\\-247.1328\\141\\114.6061\\-249.0859\\141\\111.5271\\-252.9922\\141\\110.3516\\-254.8058\\141\\108.8365\\-256.8984\\141\\104.4922\\-261.8106\\141\\101.6846\\-264.7109\\141\\98.63281\\-267.7182\\141\\95.53205\\-270.5703\\141\\90.82031\\-274.5997\\141\\86.91406\\-277.4005\\141\\84.96094\\-279.0231\\141\\83.00781\\-280.5223\\141\\81.05469\\-281.6232\\141\\79.10156\\-283.0103\\141\\77.14844\\-284.1061\\141\\75.19531\\-285.3353\\141\\73.24219\\-286.6992\\141\\71.28906\\-287.6369\\141\\69.33594\\-288.8314\\141\\67.38281\\-289.4733\\141\\65.42969\\-290.7119\\141\\63.47656\\-291.5128\\141\\61.52344\\-292.6897\\141\\59.57031\\-293.4254\\141\\57.61719\\-294.4396\\141\\53.71094\\-295.558\\141\\51.75781\\-296.4713\\141\\47.85156\\-297.512\\141\\45.89844\\-298.4052\\141\\41.99219\\-299.4001\\141\\40.03906\\-300.1529\\141\\38.08594\\-300.5769\\141\\34.17969\\-301.1966\\141\\32.22656\\-301.5798\\141\\30.27344\\-302.1003\\141\\28.32031\\-302.4693\\141\\26.36719\\-302.689\\141\\22.46094\\-302.9824\\141\\18.55469\\-303.4189\\141\\14.64844\\-304.0774\\141\\12.69531\\-304.2954\\141\\8.789063\\-304.5287\\141\\4.882813\\-304.642\\141\\0.9765625\\-304.7033\\141\\-4.882813\\-304.6232\\141\\-8.789063\\-304.4625\\141\\-12.69531\\-304.1798\\141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "241" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "197" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-303.1557\\143\\-26.36719\\-302.6283\\143\\-28.32031\\-302.3477\\143\\-30.27344\\-301.9203\\143\\-32.22656\\-301.3825\\143\\-38.08594\\-300.3405\\143\\-41.99219\\-299.0424\\143\\-43.94531\\-298.5528\\143\\-45.89844\\-297.6682\\143\\-47.85156\\-297.0258\\143\\-49.80469\\-296.511\\143\\-51.75781\\-295.5523\\143\\-55.66406\\-294.3513\\143\\-57.61719\\-293.2838\\143\\-59.57031\\-292.5059\\143\\-61.52344\\-291.2703\\143\\-63.47656\\-290.4421\\143\\-65.42969\\-289.2948\\143\\-67.38281\\-288.5208\\143\\-67.89526\\-288.1484\\143\\-73.24219\\-284.8717\\143\\-75.19531\\-283.4195\\143\\-77.14844\\-282.3301\\143\\-79.10156\\-281.0838\\143\\-82.53817\\-278.3828\\143\\-83.00781\\-277.9402\\143\\-86.91406\\-275.1516\\143\\-88.86719\\-273.4938\\143\\-92.77344\\-269.8595\\143\\-94.25813\\-268.6172\\143\\-96.42392\\-266.6641\\143\\-98.63281\\-264.3829\\143\\-102.5391\\-260.742\\143\\-103.98\\-258.8516\\143\\-105.8282\\-256.8984\\143\\-108.3984\\-254.2918\\143\\-112.7539\\-249.0859\\143\\-114.2578\\-247.1049\\143\\-116.9577\\-243.2266\\143\\-118.1717\\-241.2734\\143\\-119.2871\\-239.3203\\143\\-120.7252\\-237.3672\\143\\-121.7471\\-235.4141\\143\\-122.8962\\-233.4609\\143\\-123.5871\\-231.5078\\143\\-124.6647\\-229.5547\\143\\-125.271\\-227.6016\\143\\-126.2888\\-225.6484\\143\\-127.6855\\-221.7422\\143\\-128.4973\\-219.7891\\143\\-129.3351\\-215.8828\\143\\-130.4852\\-211.9766\\143\\-131.3997\\-206.1172\\143\\-132.276\\-202.2109\\143\\-132.5312\\-200.2578\\143\\-133.0473\\-194.3984\\143\\-133.5014\\-186.5859\\143\\-133.5713\\-180.7266\\143\\-133.4635\\-176.8203\\143\\-133.0432\\-169.0078\\143\\-132.6018\\-163.1484\\143\\-132.1951\\-159.2422\\143\\-131.3968\\-155.3359\\143\\-131.1093\\-153.3828\\143\\-130.6345\\-149.4766\\143\\-130.2296\\-147.5234\\143\\-129.5965\\-145.5703\\143\\-128.7287\\-141.6641\\143\\-128.1896\\-139.7109\\143\\-127.3246\\-137.7578\\143\\-126.7265\\-135.8047\\143\\-124.9943\\-131.8984\\143\\-124.2604\\-129.9453\\143\\-123.2308\\-127.9922\\143\\-122.4624\\-126.0391\\143\\-122.0703\\-125.4796\\143\\-120.1172\\-122.2005\\143\\-118.7397\\-120.1797\\143\\-116.2109\\-116.8697\\143\\-114.2578\\-114.4009\\143\\-112.2615\\-112.3672\\143\\-110.3516\\-110.2403\\143\\-108.3984\\-108.3691\\143\\-106.4453\\-107.0786\\143\\-102.5391\\-104.0632\\143\\-98.63281\\-101.7516\\143\\-96.67969\\-100.8714\\143\\-94.72656\\-99.88494\\143\\-92.77344\\-99.23785\\143\\-90.82031\\-98.17651\\143\\-88.86719\\-97.54675\\143\\-84.96094\\-96.16951\\143\\-81.05469\\-95.42133\\143\\-77.14844\\-94.50694\\143\\-75.19531\\-94.15717\\143\\-67.38281\\-93.31762\\143\\-65.42969\\-93.00871\\143\\-63.47656\\-92.56541\\143\\-61.52344\\-92.23113\\143\\-53.71094\\-91.39462\\143\\-49.80469\\-90.77431\\143\\-45.89844\\-90.3335\\143\\-41.99219\\-90.05074\\143\\-38.08594\\-89.86577\\143\\-34.17969\\-89.75561\\143\\-26.36719\\-89.69926\\143\\-20.50781\\-89.85899\\143\\-16.60156\\-90.13286\\143\\-14.64844\\-90.40341\\143\\-8.789063\\-92.19041\\143\\-6.835938\\-93.06703\\143\\-4.882813\\-93.66871\\143\\-2.929688\\-94.05192\\143\\0.9765625\\-94.96184\\143\\2.929688\\-95.09557\\143\\4.882813\\-95.00361\\143\\6.835938\\-94.67462\\143\\10.74219\\-93.87315\\143\\12.69531\\-93.40774\\143\\14.64844\\-92.449\\143\\18.55469\\-91.30768\\143\\20.50781\\-90.59715\\143\\22.46094\\-90.15594\\143\\30.27344\\-89.05642\\143\\32.22656\\-88.68739\\143\\36.13281\\-88.35635\\143\\40.03906\\-88.15936\\143\\43.94531\\-88.06097\\143\\49.80469\\-88.03599\\143\\55.66406\\-88.18079\\143\\59.57031\\-88.46745\\143\\61.52344\\-88.73292\\143\\63.47656\\-89.21165\\143\\65.42969\\-89.59013\\143\\69.33594\\-90.18994\\143\\71.28906\\-90.62015\\143\\73.24219\\-91.27216\\143\\77.14844\\-92.21945\\143\\81.05469\\-93.56226\\143\\83.00781\\-93.97729\\143\\84.96094\\-94.58307\\143\\86.91406\\-95.49874\\143\\88.86719\\-96.11311\\143\\90.82031\\-97.2112\\143\\92.77344\\-98.03487\\143\\94.72656\\-99.21916\\143\\96.67969\\-99.98689\\143\\98.63281\\-101.1743\\143\\100.5859\\-102.0969\\143\\103.9997\\-104.5547\\143\\104.4922\\-104.9753\\143\\106.4453\\-106.2361\\143\\108.3984\\-107.7051\\143\\110.3516\\-109.4652\\143\\115.0377\\-114.3203\\143\\116.649\\-116.2734\\143\\117.6793\\-118.2266\\143\\118.1641\\-118.8391\\143\\120.2691\\-122.1328\\143\\122.1719\\-126.0391\\143\\122.9171\\-127.9922\\143\\123.3874\\-129.9453\\143\\124.1936\\-131.8984\\143\\124.7991\\-133.8516\\143\\125.2258\\-135.8047\\143\\126.5321\\-139.7109\\143\\127.3621\\-143.6172\\143\\128.4084\\-147.5234\\143\\128.6978\\-149.4766\\143\\129.4556\\-155.3359\\143\\130.1139\\-159.2422\\143\\130.361\\-161.1953\\143\\130.6391\\-165.1016\\143\\130.8247\\-170.9609\\143\\130.9685\\-182.6797\\143\\131.0096\\-188.5391\\143\\130.9548\\-196.3516\\143\\130.8142\\-202.2109\\143\\130.6345\\-206.1172\\143\\130.2637\\-210.0234\\143\\129.4526\\-213.9297\\143\\128.7726\\-217.8359\\143\\128.3713\\-219.7891\\143\\127.58\\-221.7422\\143\\126.3171\\-225.6484\\143\\125.3084\\-227.6016\\143\\124.7614\\-229.5547\\143\\123.8222\\-231.5078\\143\\122.4783\\-235.4141\\143\\121.3421\\-237.3672\\143\\120.4514\\-239.3203\\143\\119.1879\\-241.2734\\143\\118.0753\\-243.2266\\143\\117.0647\\-245.1797\\143\\115.7973\\-247.1328\\143\\114.7263\\-249.0859\\143\\111.6599\\-252.9922\\143\\110.4707\\-254.9453\\143\\109.0205\\-256.8984\\143\\104.4922\\-262.084\\143\\101.9744\\-264.7109\\143\\98.63281\\-267.9865\\143\\95.86828\\-270.5703\\143\\94.72656\\-271.4946\\143\\92.77344\\-273.2789\\143\\90.82031\\-274.9323\\143\\86.91406\\-277.6642\\143\\83.00781\\-280.8411\\143\\81.05469\\-281.8943\\143\\77.14844\\-284.5146\\143\\75.19531\\-285.5948\\143\\73.24219\\-286.9363\\143\\69.33594\\-289.0158\\143\\67.38281\\-289.7345\\143\\65.42969\\-290.9225\\143\\63.47656\\-291.8353\\143\\61.52344\\-292.891\\143\\59.57031\\-293.6736\\143\\57.61719\\-294.636\\143\\55.66406\\-295.1421\\143\\53.71094\\-295.816\\143\\51.75781\\-296.6445\\143\\49.80469\\-297.102\\143\\47.85156\\-297.7883\\143\\45.89844\\-298.5848\\143\\41.99219\\-299.6525\\143\\40.03906\\-300.325\\143\\34.17969\\-301.3518\\143\\30.27344\\-302.2818\\143\\28.32031\\-302.5838\\143\\22.46094\\-303.0938\\143\\18.55469\\-303.6467\\143\\16.60156\\-304.0325\\143\\12.69531\\-304.4228\\143\\8.789063\\-304.6326\\143\\4.882813\\-304.75\\143\\0.9765625\\-304.7927\\143\\-4.882813\\-304.7077\\143\\-10.74219\\-304.456\\143\\-12.69531\\-304.3275\\143\\-14.64844\\-304.099\\143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "247" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "198" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-304.0092\\145\\-20.50781\\-303.282\\145\\-22.46094\\-303.0466\\145\\-26.36719\\-302.6826\\145\\-28.32031\\-302.4401\\145\\-30.27344\\-302.0735\\145\\-32.22656\\-301.5115\\145\\-34.17969\\-301.1184\\145\\-38.08594\\-300.4543\\145\\-40.01991\\-299.8672\\145\\-41.99219\\-299.1681\\145\\-43.94531\\-298.6554\\145\\-47.85156\\-297.1233\\145\\-49.80469\\-296.6255\\145\\-51.75781\\-295.7168\\145\\-55.66406\\-294.5121\\145\\-57.61719\\-293.4472\\145\\-59.57031\\-292.6926\\145\\-61.52344\\-291.4464\\145\\-63.47656\\-290.6572\\145\\-65.42969\\-289.4569\\145\\-67.38281\\-288.7279\\145\\-69.33594\\-287.479\\145\\-71.28906\\-286.443\\145\\-74.44473\\-284.2422\\145\\-75.19531\\-283.6486\\145\\-77.14844\\-282.6048\\145\\-79.10156\\-281.2761\\145\\-81.05469\\-279.7663\\145\\-86.91406\\-275.3649\\145\\-88.86719\\-273.6915\\145\\-92.77344\\-270.021\\145\\-94.64518\\-268.6172\\145\\-96.78728\\-266.6641\\145\\-98.57388\\-264.7109\\145\\-100.5859\\-262.8636\\145\\-102.7072\\-260.8047\\145\\-104.2519\\-258.8516\\145\\-108.3984\\-254.3564\\145\\-112.7045\\-249.0859\\145\\-114.2578\\-246.9777\\145\\-116.8729\\-243.2266\\145\\-117.8903\\-241.2734\\145\\-119.1406\\-239.3203\\145\\-120.5143\\-237.3672\\145\\-121.4955\\-235.4141\\145\\-122.7193\\-233.4609\\145\\-123.3576\\-231.5078\\145\\-124.3604\\-229.5547\\145\\-125.6946\\-225.6484\\145\\-126.6694\\-223.6953\\145\\-127.225\\-221.7422\\145\\-128.0398\\-219.7891\\145\\-128.6256\\-217.8359\\145\\-129.3815\\-213.9297\\145\\-129.9844\\-211.9766\\145\\-130.4852\\-210.0234\\145\\-130.7761\\-208.0703\\145\\-131.2145\\-204.1641\\145\\-131.5619\\-202.2109\\145\\-132.0229\\-200.2578\\145\\-132.3242\\-198.3047\\145\\-132.6555\\-194.3984\\145\\-132.8621\\-190.4922\\145\\-133.0027\\-186.5859\\145\\-133.0553\\-182.6797\\145\\-132.9702\\-176.8203\\145\\-132.8323\\-172.9141\\145\\-132.6399\\-169.0078\\145\\-132.3442\\-165.1016\\145\\-132.1399\\-163.1484\\145\\-131.1947\\-157.2891\\145\\-130.6002\\-151.4297\\145\\-130.2411\\-149.4766\\145\\-129.6258\\-147.5234\\145\\-129.1629\\-145.5703\\145\\-128.3799\\-141.6641\\145\\-127.5536\\-139.7109\\145\\-126.2471\\-135.8047\\145\\-125.2959\\-133.8516\\145\\-124.6438\\-131.8984\\145\\-123.6119\\-129.9453\\145\\-122.8957\\-127.9922\\145\\-120.8089\\-124.0859\\145\\-119.3683\\-122.1328\\145\\-116.7759\\-118.2266\\145\\-114.2578\\-115.1971\\145\\-108.3984\\-109.0455\\145\\-106.4453\\-107.4333\\145\\-104.4922\\-105.9547\\145\\-98.63281\\-102.0648\\145\\-96.67969\\-101.2437\\145\\-94.72656\\-100.1602\\145\\-92.77344\\-99.54623\\145\\-90.82031\\-98.62873\\145\\-88.86719\\-97.84216\\145\\-86.91406\\-97.29075\\145\\-84.96094\\-96.53696\\145\\-83.00781\\-96.01691\\145\\-79.10156\\-95.34245\\145\\-77.14844\\-94.94804\\145\\-75.19531\\-94.44231\\145\\-73.24219\\-94.13591\\145\\-65.42969\\-93.37148\\145\\-63.47656\\-93.03569\\145\\-61.52344\\-92.57685\\145\\-57.61719\\-92.02213\\145\\-49.80469\\-91.23963\\145\\-45.89844\\-90.67111\\145\\-41.99219\\-90.3023\\145\\-38.08594\\-90.08654\\145\\-34.17969\\-89.99548\\145\\-26.36719\\-89.93661\\145\\-20.50781\\-90.10051\\145\\-16.60156\\-90.45481\\145\\-14.64844\\-90.87518\\145\\-12.69531\\-91.44169\\145\\-10.74219\\-91.90302\\145\\-8.789063\\-92.60021\\145\\-6.835938\\-93.48905\\145\\-2.929688\\-94.36955\\145\\-0.9765625\\-95.06911\\145\\0.9765625\\-95.42568\\145\\2.929688\\-95.52148\\145\\4.882813\\-95.45435\\145\\6.835938\\-95.21631\\145\\10.74219\\-94.12731\\145\\12.69531\\-93.68433\\145\\16.60156\\-92.15234\\145\\20.50781\\-91.11465\\145\\22.46094\\-90.53404\\145\\24.41406\\-90.14216\\145\\30.27344\\-89.51083\\145\\36.13281\\-88.70377\\145\\40.03906\\-88.41877\\145\\43.94531\\-88.28075\\145\\47.85156\\-88.23214\\145\\51.75781\\-88.27251\\145\\55.66406\\-88.39992\\145\\59.57031\\-88.81701\\145\\63.47656\\-89.50729\\145\\67.38281\\-90.07951\\145\\69.33594\\-90.42983\\145\\73.24219\\-91.50939\\145\\77.14844\\-92.41999\\145\\79.10156\\-93.20564\\145\\81.05469\\-93.73693\\145\\83.00781\\-94.11054\\145\\84.96094\\-94.93402\\145\\88.86719\\-96.37109\\145\\90.82031\\-97.50174\\145\\92.77344\\-98.32668\\145\\94.72656\\-99.49644\\145\\96.67969\\-100.2966\\145\\100.5859\\-102.5787\\145\\102.5391\\-103.8417\\145\\104.4922\\-105.4123\\145\\106.4453\\-106.8308\\145\\108.3984\\-108.1106\\145\\110.3516\\-109.9371\\145\\114.5531\\-114.3203\\145\\116.2109\\-116.5957\\145\\118.5974\\-120.1797\\145\\119.5337\\-122.1328\\145\\120.7738\\-124.0859\\145\\121.5006\\-126.0391\\145\\122.5185\\-127.9922\\145\\123.5119\\-131.8984\\145\\124.3467\\-133.8516\\145\\124.8461\\-135.8047\\145\\125.2413\\-137.7578\\145\\125.7813\\-139.7109\\145\\126.459\\-141.6641\\145\\127.254\\-145.5703\\145\\128.253\\-149.4766\\145\\128.563\\-151.4297\\145\\129.0298\\-155.3359\\145\\129.3846\\-159.2422\\145\\129.8909\\-163.1484\\145\\130.0841\\-165.1016\\145\\130.3267\\-170.9609\\145\\130.3811\\-174.8672\\145\\130.5804\\-182.6797\\145\\130.6345\\-188.5391\\145\\130.6152\\-196.3516\\145\\130.4546\\-202.2109\\145\\130.2271\\-206.1172\\145\\129.3815\\-211.9766\\145\\128.8947\\-215.8828\\145\\128.5671\\-217.8359\\145\\128.0794\\-219.7891\\145\\127.3035\\-221.7422\\145\\126.7609\\-223.6953\\145\\126.0287\\-225.6484\\145\\125.1708\\-227.6016\\145\\124.6802\\-229.5547\\145\\123.7169\\-231.5078\\145\\122.4542\\-235.4141\\145\\121.3408\\-237.3672\\145\\120.4834\\-239.3203\\145\\119.2415\\-241.2734\\145\\117.1448\\-245.1797\\145\\114.8425\\-249.0859\\145\\111.8164\\-252.9922\\145\\110.6916\\-254.9453\\145\\109.2122\\-256.8984\\145\\106.4453\\-260.1466\\145\\104.4922\\-262.3496\\145\\100.5859\\-266.4462\\145\\96.13962\\-270.5703\\145\\94.72656\\-271.7434\\145\\92.77344\\-273.5359\\145\\90.82031\\-275.1972\\145\\88.86719\\-276.6829\\145\\86.91406\\-277.9496\\145\\83.00781\\-281.0748\\145\\79.10156\\-283.4253\\145\\77.14844\\-284.8233\\145\\71.28906\\-288.3112\\145\\69.33594\\-289.1724\\145\\65.42969\\-291.1095\\145\\63.47656\\-292.2417\\145\\59.55574\\-294.0078\\145\\57.61719\\-294.8046\\145\\55.66406\\-295.2705\\145\\53.71094\\-296.1324\\145\\51.75781\\-296.8019\\145\\49.80469\\-297.2649\\145\\47.85156\\-298.1258\\145\\45.89844\\-298.7446\\145\\43.94531\\-299.2406\\145\\41.99219\\-299.9619\\145\\40.03906\\-300.4739\\145\\34.17969\\-301.528\\145\\32.22656\\-302.0754\\145\\30.27344\\-302.4526\\145\\28.32031\\-302.7003\\145\\24.41406\\-303.0244\\145\\22.46094\\-303.2514\\145\\16.60156\\-304.2173\\145\\14.64844\\-304.3877\\145\\8.789063\\-304.7265\\145\\4.882813\\-304.8366\\145\\-0.9765625\\-304.8666\\145\\-4.882813\\-304.7927\\145\\-10.74219\\-304.5461\\145\\-14.64844\\-304.2531\\145" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "241" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "199" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-303.4165\\147\\-24.41406\\-302.9264\\147\\-28.32031\\-302.5421\\147\\-30.27344\\-302.2012\\147\\-34.17969\\-301.2344\\147\\-38.08594\\-300.5656\\147\\-40.03906\\-300.0819\\147\\-41.99219\\-299.31\\147\\-43.94531\\-298.7805\\147\\-45.89844\\-298.1498\\147\\-47.85156\\-297.2388\\147\\-49.80469\\-296.7368\\147\\-53.71094\\-295.2055\\147\\-55.66406\\-294.6609\\147\\-57.61719\\-293.6667\\147\\-59.57031\\-292.8561\\147\\-61.52344\\-291.6909\\147\\-63.47656\\-290.8499\\147\\-65.42969\\-289.644\\147\\-67.38281\\-288.921\\147\\-69.33594\\-287.7107\\147\\-71.28906\\-286.7286\\147\\-71.95345\\-286.1953\\147\\-75.19531\\-283.9434\\147\\-77.14844\\-282.8763\\147\\-80.73821\\-280.3359\\147\\-83.00781\\-278.6744\\147\\-88.23438\\-274.4766\\147\\-92.77344\\-270.3577\\147\\-94.72656\\-268.8863\\147\\-96.67969\\-267.0501\\147\\-98.89063\\-264.7109\\147\\-100.9627\\-262.7578\\147\\-102.9072\\-260.8047\\147\\-104.4669\\-258.8516\\147\\-108.3984\\-254.4807\\147\\-112.7148\\-249.0859\\147\\-116.8155\\-243.2266\\147\\-117.7749\\-241.2734\\147\\-118.1641\\-240.7981\\147\\-120.1172\\-237.6072\\147\\-121.3321\\-235.4141\\147\\-122.5456\\-233.4609\\147\\-123.2096\\-231.5078\\147\\-124.8311\\-227.6016\\147\\-125.3706\\-225.6484\\147\\-126.3507\\-223.6953\\147\\-127.5378\\-219.7891\\147\\-128.3138\\-217.8359\\147\\-128.7493\\-215.8828\\147\\-129.4908\\-211.9766\\147\\-130.0841\\-210.0234\\147\\-130.5025\\-208.0703\\147\\-131.3997\\-200.2578\\147\\-132.0597\\-196.3516\\147\\-132.2889\\-194.3984\\147\\-132.5531\\-190.4922\\147\\-132.6793\\-186.5859\\147\\-132.7242\\-182.6797\\147\\-132.6892\\-178.7734\\147\\-132.5027\\-172.9141\\147\\-132.2613\\-169.0078\\147\\-132.0717\\-167.0547\\147\\-131.4901\\-163.1484\\147\\-131.2647\\-161.1953\\147\\-130.5442\\-153.3828\\147\\-130.2059\\-151.4297\\147\\-129.6535\\-149.4766\\147\\-129.213\\-147.5234\\147\\-128.4886\\-143.6172\\147\\-127.1076\\-139.7109\\147\\-126.55\\-137.7578\\147\\-125.5713\\-135.8047\\147\\-124.9107\\-133.8516\\147\\-123.182\\-129.9453\\147\\-122.4958\\-127.9922\\147\\-121.3\\-126.0391\\147\\-120.229\\-124.0859\\147\\-118.1641\\-121.0818\\147\\-117.4091\\-120.1797\\147\\-116.2109\\-118.4013\\147\\-114.6415\\-116.2734\\147\\-112.8976\\-114.3203\\147\\-109.2687\\-110.4141\\147\\-108.3984\\-109.5378\\147\\-106.4453\\-107.8351\\147\\-102.5391\\-105.1991\\147\\-100.5859\\-103.7362\\147\\-98.63281\\-102.5163\\147\\-94.72656\\-100.577\\147\\-92.77344\\-99.75907\\147\\-90.82031\\-99.12555\\147\\-88.86719\\-98.14489\\147\\-84.96094\\-96.98633\\147\\-83.00781\\-96.29773\\147\\-81.05469\\-95.9011\\147\\-77.14844\\-95.32232\\147\\-73.24219\\-94.39146\\147\\-69.33594\\-93.93233\\147\\-65.42969\\-93.60198\\147\\-63.47656\\-93.38056\\147\\-61.52344\\-93.03419\\147\\-59.57031\\-92.57685\\147\\-55.66406\\-92.03783\\147\\-51.75781\\-91.67336\\147\\-47.85156\\-91.36514\\147\\-40.03906\\-90.43892\\147\\-36.13281\\-90.26913\\147\\-28.32031\\-90.16917\\147\\-26.36719\\-90.18681\\147\\-20.50781\\-90.40048\\147\\-18.55469\\-90.58984\\147\\-16.60156\\-90.92066\\147\\-12.69531\\-91.7313\\147\\-10.74219\\-92.25\\147\\-8.789063\\-93.15671\\147\\-6.835938\\-93.73509\\147\\-4.882813\\-94.17467\\147\\-2.929688\\-94.89144\\147\\-0.9765625\\-95.49538\\147\\0.9765625\\-95.76008\\147\\2.929688\\-95.86987\\147\\4.882813\\-95.80976\\147\\6.835938\\-95.61359\\147\\8.789063\\-95.21336\\147\\10.74219\\-94.46354\\147\\14.64844\\-93.28176\\147\\16.60156\\-92.44407\\147\\18.55469\\-91.91905\\147\\20.50781\\-91.54734\\147\\24.41406\\-90.5638\\147\\26.36719\\-90.22237\\147\\28.32031\\-90.0082\\147\\34.17969\\-89.49538\\147\\38.08594\\-89.06815\\147\\41.99219\\-88.78473\\147\\47.85156\\-88.56261\\147\\51.75781\\-88.58543\\147\\55.66406\\-88.81525\\147\\59.57031\\-89.31638\\147\\65.42969\\-90.01651\\147\\67.38281\\-90.29801\\147\\69.33594\\-90.73421\\147\\71.28906\\-91.312\\147\\75.19531\\-92.11664\\147\\77.14844\\-92.67435\\147\\79.10156\\-93.42059\\147\\83.00781\\-94.27402\\147\\84.96094\\-95.19198\\147\\86.91406\\-95.84558\\147\\88.86719\\-96.73456\\147\\96.57749\\-100.6484\\147\\98.63281\\-101.7342\\147\\100.5859\\-103.0631\\147\\102.5391\\-104.2359\\147\\106.4453\\-107.2724\\147\\108.1181\\-108.4609\\147\\110.1406\\-110.4141\\147\\114.2578\\-114.7516\\147\\116.9302\\-118.2266\\147\\120.1172\\-123.9963\\147\\121.0769\\-126.0391\\147\\122.7564\\-129.9453\\147\\123.1873\\-131.8984\\147\\123.7246\\-133.8516\\147\\124.4894\\-135.8047\\147\\125.2741\\-139.7109\\147\\125.82\\-141.6641\\147\\126.4963\\-143.6172\\147\\127.1671\\-147.5234\\147\\128.0816\\-151.4297\\147\\128.4395\\-153.3828\\147\\128.8834\\-157.2891\\147\\129.3239\\-163.1484\\147\\129.5741\\-169.0078\\147\\129.7238\\-174.8672\\147\\129.9228\\-178.7734\\147\\130.099\\-184.6328\\147\\130.1649\\-188.5391\\147\\130.1398\\-196.3516\\147\\129.9384\\-202.2109\\147\\129.6552\\-206.1172\\147\\128.9353\\-213.9297\\147\\128.3997\\-217.8359\\147\\127.1389\\-221.7422\\147\\126.6473\\-223.6953\\147\\125.1149\\-227.6016\\147\\124.6454\\-229.5547\\147\\123.6792\\-231.5078\\147\\122.5124\\-235.4141\\147\\121.4058\\-237.3672\\147\\120.6203\\-239.3203\\147\\119.3217\\-241.2734\\147\\118.3758\\-243.2266\\147\\116.2109\\-247.056\\147\\114.9764\\-249.0859\\147\\112.0458\\-252.9922\\147\\110.88\\-254.9453\\147\\109.3814\\-256.8984\\147\\106.4453\\-260.4461\\147\\102.6293\\-264.7109\\147\\100.5859\\-266.841\\147\\96.67969\\-270.3469\\147\\92.77344\\-273.7817\\147\\88.86719\\-276.9594\\147\\84.96094\\-279.8111\\147\\83.00781\\-281.3125\\147\\81.05469\\-282.6669\\147\\79.10156\\-283.6497\\147\\78.35478\\-284.2422\\147\\75.19531\\-286.3962\\147\\73.24219\\-287.3995\\147\\71.28906\\-288.623\\147\\69.33594\\-289.336\\147\\67.38281\\-290.5308\\147\\65.42969\\-291.3278\\147\\63.47656\\-292.5517\\147\\61.52344\\-293.3001\\147\\59.57031\\-294.3311\\147\\57.61719\\-294.9665\\147\\55.66406\\-295.4596\\147\\53.71094\\-296.4102\\147\\49.80469\\-297.4864\\147\\47.85156\\-298.4081\\147\\43.94531\\-299.4753\\147\\41.99219\\-300.2286\\147\\40.03906\\-300.6337\\147\\36.13281\\-301.3094\\147\\32.22656\\-302.285\\147\\30.27344\\-302.5956\\147\\24.41406\\-303.1638\\147\\22.46094\\-303.4661\\147\\18.55469\\-304.1702\\147\\14.64844\\-304.5071\\147\\8.789063\\-304.827\\147\\2.929688\\-304.9813\\147\\-0.9765625\\-304.9687\\147\\-4.882813\\-304.8888\\147\\-10.74219\\-304.6378\\147\\-14.64844\\-304.3732\\147\\-16.60156\\-304.1604\\147" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "249" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "200" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-18.55469\\-304.044\\149\\-20.50781\\-303.6181\\149\\-24.41406\\-302.9999\\149\\-28.32031\\-302.6399\\149\\-30.27344\\-302.3284\\149\\-32.22656\\-301.9056\\149\\-34.17969\\-301.3619\\149\\-38.08594\\-300.6631\\149\\-40.03906\\-300.231\\149\\-41.99219\\-299.4906\\149\\-45.89844\\-298.3514\\149\\-47.85156\\-297.3809\\149\\-49.80469\\-296.8482\\149\\-51.75781\\-296.2122\\149\\-53.71094\\-295.3205\\149\\-55.66406\\-294.7903\\149\\-57.48981\\-294.0078\\149\\-61.53311\\-292.0547\\149\\-65.2073\\-290.1016\\149\\-67.38281\\-289.0891\\149\\-71.28906\\-286.9609\\149\\-73.24219\\-285.5582\\149\\-75.19531\\-284.3908\\149\\-81.05469\\-280.4744\\149\\-83.00781\\-278.9814\\149\\-86.91406\\-275.7248\\149\\-88.61205\\-274.4766\\149\\-92.95654\\-270.5703\\149\\-94.72656\\-269.1543\\149\\-96.67969\\-267.2888\\149\\-99.13163\\-264.7109\\149\\-101.2106\\-262.7578\\149\\-103.0941\\-260.8047\\149\\-106.3874\\-256.8984\\149\\-108.3984\\-254.6947\\149\\-109.6477\\-252.9922\\149\\-112.7608\\-249.0859\\149\\-114.2578\\-246.9747\\149\\-116.2109\\-244.0132\\149\\-116.7969\\-243.2266\\149\\-117.717\\-241.2734\\149\\-118.1641\\-240.7067\\149\\-120.1698\\-237.3672\\149\\-122.0703\\-233.9094\\149\\-122.3798\\-233.4609\\149\\-123.7684\\-229.5547\\149\\-124.6991\\-227.6016\\149\\-125.1771\\-225.6484\\149\\-126.709\\-221.7422\\149\\-127.2439\\-219.7891\\149\\-128.5275\\-215.8828\\149\\-129.2173\\-211.9766\\149\\-129.6152\\-210.0234\\149\\-130.1649\\-208.0703\\149\\-130.5151\\-206.1172\\149\\-130.7401\\-204.1641\\149\\-131.0714\\-200.2578\\149\\-131.5036\\-196.3516\\149\\-132.0476\\-192.4453\\149\\-132.213\\-190.4922\\149\\-132.401\\-186.5859\\149\\-132.4496\\-182.6797\\149\\-132.4088\\-178.7734\\149\\-132.2613\\-174.8672\\149\\-131.9845\\-170.9609\\149\\-131.7224\\-169.0078\\149\\-131.1294\\-163.1484\\149\\-130.6976\\-157.2891\\149\\-130.1794\\-153.3828\\149\\-129.2764\\-149.4766\\149\\-128.5666\\-145.5703\\149\\-128.0407\\-143.6172\\149\\-127.3035\\-141.6641\\149\\-126.7761\\-139.7109\\149\\-126.0437\\-137.7578\\149\\-125.172\\-135.8047\\149\\-124.5859\\-133.8516\\149\\-123.5455\\-131.8984\\149\\-122.9118\\-129.9453\\149\\-120.9211\\-126.0391\\149\\-119.535\\-124.0859\\149\\-118.3998\\-122.1328\\149\\-115.5001\\-118.2266\\149\\-114.2578\\-116.6523\\149\\-112.3047\\-114.3974\\149\\-108.7216\\-110.4141\\149\\-106.4453\\-108.3883\\149\\-100.5859\\-104.1159\\149\\-98.63281\\-103.0407\\149\\-96.67969\\-101.824\\149\\-94.72656\\-101.0093\\149\\-92.77344\\-99.9995\\149\\-90.82031\\-99.42925\\149\\-88.86719\\-98.52093\\149\\-86.91406\\-97.84082\\149\\-84.96094\\-97.33636\\149\\-81.05469\\-96.13258\\149\\-77.14844\\-95.56916\\149\\-75.19531\\-95.23416\\149\\-73.24219\\-94.74937\\149\\-71.28906\\-94.36955\\149\\-67.38281\\-93.90182\\149\\-63.47656\\-93.59743\\149\\-61.52344\\-93.36804\\149\\-59.57031\\-93.03419\\149\\-57.61719\\-92.57685\\149\\-55.66406\\-92.28182\\149\\-51.75781\\-91.86949\\149\\-43.94531\\-91.33854\\149\\-41.99219\\-91.15334\\149\\-40.03906\\-90.84525\\149\\-36.13281\\-90.57885\\149\\-30.27344\\-90.45744\\149\\-26.36719\\-90.51109\\149\\-22.46094\\-90.69581\\149\\-20.50781\\-90.87518\\149\\-16.60156\\-91.35904\\149\\-12.69531\\-92.0239\\149\\-10.74219\\-92.63365\\149\\-8.789063\\-93.50964\\149\\-6.835938\\-93.95991\\149\\-4.882813\\-94.53207\\149\\-2.929688\\-95.35547\\149\\-0.9765625\\-95.81614\\149\\0.9765625\\-96.06356\\149\\2.929688\\-96.16874\\149\\4.882813\\-96.11161\\149\\6.835938\\-95.92011\\149\\8.789063\\-95.58807\\149\\10.74219\\-94.9798\\149\\12.69531\\-94.14021\\149\\14.64844\\-93.57967\\149\\18.55469\\-92.25786\\149\\24.41406\\-91.12871\\149\\26.36719\\-90.64379\\149\\30.27344\\-90.12265\\149\\34.17969\\-89.79232\\149\\41.99219\\-89.35733\\149\\47.85156\\-89.13491\\149\\53.71094\\-89.21929\\149\\57.61719\\-89.48687\\149\\61.52344\\-89.81123\\149\\65.42969\\-90.26339\\149\\67.38281\\-90.59908\\149\\69.33594\\-91.15705\\149\\75.19531\\-92.31398\\149\\77.14844\\-93.02519\\149\\79.10156\\-93.58945\\149\\81.05469\\-93.94431\\149\\83.00781\\-94.50484\\149\\84.96094\\-95.4128\\149\\86.91406\\-96.04212\\149\\88.86719\\-97.11007\\149\\90.82031\\-97.93945\\149\\92.77344\\-99.11671\\149\\94.72656\\-99.9145\\149\\96.67969\\-101.0833\\149\\98.63281\\-102.026\\149\\99.38859\\-102.6016\\149\\104.4922\\-106.073\\149\\106.4453\\-107.5422\\149\\108.3984\\-109.19\\149\\112.3047\\-113.1833\\149\\115.0904\\-116.2734\\149\\116.4889\\-118.2266\\149\\117.4628\\-120.1797\\149\\118.7079\\-122.1328\\149\\119.5277\\-124.0859\\149\\120.7031\\-126.0391\\149\\121.4134\\-127.9922\\149\\122.382\\-129.9453\\149\\122.939\\-131.8984\\149\\123.3619\\-133.8516\\149\\124.633\\-137.7578\\149\\125.3546\\-141.6641\\149\\126.5241\\-145.5703\\149\\127.5302\\-151.4297\\149\\128.3518\\-155.3359\\149\\128.5865\\-157.2891\\149\\129.018\\-163.1484\\149\\129.2091\\-169.0078\\149\\129.2637\\-172.9141\\149\\129.541\\-184.6328\\149\\129.5906\\-192.4453\\149\\129.5157\\-200.2578\\149\\129.2982\\-206.1172\\149\\129.074\\-210.0234\\149\\128.7708\\-213.9297\\149\\128.5517\\-215.8828\\149\\128.2266\\-217.8359\\149\\127.574\\-219.7891\\149\\126.5821\\-223.6953\\149\\125.7464\\-225.6484\\149\\125.093\\-227.6016\\149\\124.6374\\-229.5547\\149\\123.705\\-231.5078\\149\\122.5779\\-235.4141\\149\\121.5131\\-237.3672\\149\\120.7406\\-239.3203\\149\\119.4642\\-241.2734\\149\\118.5509\\-243.2266\\149\\117.3331\\-245.1797\\149\\116.4017\\-247.1328\\149\\115.1078\\-249.0859\\149\\113.6545\\-251.0391\\149\\112.3718\\-252.9922\\149\\110.3516\\-255.8873\\149\\108.3984\\-258.3885\\149\\106.4453\\-260.7792\\149\\102.9914\\-264.7109\\149\\100.5859\\-267.1491\\149\\98.63281\\-268.9702\\149\\94.63629\\-272.5234\\149\\89.90832\\-276.4297\\149\\86.91406\\-278.7826\\149\\84.79656\\-280.3359\\149\\81.05469\\-282.9506\\149\\79.10156\\-283.9962\\149\\75.19531\\-286.7166\\149\\73.24219\\-287.6602\\149\\71.28906\\-288.8697\\149\\69.33594\\-289.59\\149\\67.38281\\-290.7937\\149\\65.42969\\-291.6006\\149\\63.47656\\-292.8005\\149\\61.52344\\-293.5759\\149\\59.57031\\-294.59\\149\\57.61719\\-295.1162\\149\\55.66406\\-295.7612\\149\\53.71094\\-296.6411\\149\\51.75781\\-297.1076\\149\\47.85156\\-298.6182\\149\\45.89844\\-299.1106\\149\\41.99219\\-300.4427\\149\\36.13281\\-301.5182\\149\\34.17969\\-302.0626\\149\\32.22656\\-302.461\\149\\30.27344\\-302.7239\\149\\28.32031\\-302.8724\\149\\24.41406\\-303.3633\\149\\20.50781\\-304.1095\\149\\18.55469\\-304.3507\\149\\10.74219\\-304.8462\\149\\6.835938\\-305.0045\\149\\2.929688\\-305.1031\\149\\-0.9765625\\-305.1031\\149\\-6.835938\\-304.9185\\149\\-10.74219\\-304.7311\\149\\-14.64844\\-304.4912\\149" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "243" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "201" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-303.882\\151\\-22.46094\\-303.4214\\151\\-24.41406\\-303.0938\\151\\-28.32031\\-302.7239\\151\\-32.22656\\-302.088\\151\\-34.17969\\-301.5302\\151\\-40.03906\\-300.3853\\151\\-43.94531\\-299.0413\\151\\-45.89844\\-298.5154\\151\\-47.85156\\-297.5975\\151\\-51.75781\\-296.4232\\151\\-53.71094\\-295.4661\\151\\-55.66406\\-294.9308\\151\\-57.61719\\-294.2573\\151\\-59.57031\\-293.1976\\151\\-61.52344\\-292.424\\151\\-63.47656\\-291.2094\\151\\-65.42969\\-290.3178\\151\\-67.38281\\-289.2328\\151\\-69.33594\\-288.4074\\151\\-73.24219\\-285.888\\151\\-75.19531\\-284.7392\\151\\-77.14844\\-283.3154\\151\\-79.10156\\-281.9983\\151\\-81.05469\\-280.8242\\151\\-83.00781\\-279.2488\\151\\-86.91406\\-275.9414\\151\\-88.86719\\-274.6719\\151\\-90.82031\\-272.9155\\151\\-93.31939\\-270.5703\\151\\-94.72656\\-269.3709\\151\\-96.67969\\-267.5314\\151\\-99.34938\\-264.7109\\151\\-101.4259\\-262.7578\\151\\-103.2815\\-260.8047\\151\\-106.4453\\-257.1163\\151\\-108.4227\\-254.9453\\151\\-109.7591\\-252.9922\\151\\-112.8493\\-249.0859\\151\\-114.2578\\-247.1231\\151\\-115.477\\-245.1797\\151\\-116.8246\\-243.2266\\151\\-117.7097\\-241.2734\\151\\-118.1641\\-240.6732\\151\\-120.1172\\-237.3573\\151\\-122.2642\\-233.4609\\151\\-123.029\\-231.5078\\151\\-123.6177\\-229.5547\\151\\-124.5841\\-227.6016\\151\\-125.0565\\-225.6484\\151\\-125.6714\\-223.6953\\151\\-126.5259\\-221.7422\\151\\-127.5954\\-217.8359\\151\\-128.3063\\-215.8828\\151\\-128.7256\\-213.9297\\151\\-129.3367\\-210.0234\\151\\-130.2525\\-206.1172\\151\\-130.7701\\-202.2109\\151\\-131.034\\-198.3047\\151\\-131.3539\\-194.3984\\151\\-131.752\\-190.4922\\151\\-132.0717\\-186.5859\\151\\-132.1399\\-184.6328\\151\\-132.1289\\-180.7266\\151\\-131.9714\\-176.8203\\151\\-131.6392\\-172.9141\\151\\-130.9077\\-163.1484\\151\\-130.6629\\-159.2422\\151\\-130.1649\\-155.3359\\151\\-129.6964\\-153.3828\\151\\-129.3257\\-151.4297\\151\\-128.6937\\-147.5234\\151\\-128.2441\\-145.5703\\151\\-127.5148\\-143.6172\\151\\-126.4259\\-139.7109\\151\\-125.4636\\-137.7578\\151\\-124.8873\\-135.8047\\151\\-124.1379\\-133.8516\\151\\-123.221\\-131.8984\\151\\-122.5784\\-129.9453\\151\\-121.4461\\-127.9922\\151\\-120.4791\\-126.0391\\151\\-120.1172\\-125.6004\\151\\-118.1641\\-122.6254\\151\\-117.7455\\-122.1328\\151\\-116.5213\\-120.1797\\151\\-115.0632\\-118.2266\\151\\-112.3047\\-114.9935\\151\\-109.9266\\-112.3672\\151\\-108.0604\\-110.4141\\151\\-106.4453\\-108.9458\\151\\-104.4922\\-107.342\\151\\-102.5391\\-105.8673\\151\\-97.38394\\-102.6016\\151\\-96.67969\\-102.1033\\151\\-94.72656\\-101.3143\\151\\-92.77344\\-100.2761\\151\\-88.86719\\-98.97536\\151\\-86.91406\\-98.11723\\151\\-83.00781\\-97.11328\\151\\-81.05469\\-96.43414\\151\\-79.10156\\-96.03658\\151\\-75.19531\\-95.49337\\151\\-71.28906\\-94.67372\\151\\-67.38281\\-94.05817\\151\\-61.52344\\-93.57417\\151\\-59.57031\\-93.34959\\151\\-57.61719\\-93.00739\\151\\-55.66406\\-92.56541\\151\\-53.71094\\-92.28662\\151\\-49.80469\\-91.92481\\151\\-41.99219\\-91.49588\\151\\-38.08594\\-91.1473\\151\\-34.17969\\-90.96481\\151\\-30.27344\\-90.87518\\151\\-26.36719\\-90.99463\\151\\-18.55469\\-91.44666\\151\\-14.64844\\-91.9201\\151\\-12.69531\\-92.33321\\151\\-10.74219\\-93.15671\\151\\-8.789063\\-93.74779\\151\\-6.835938\\-94.20181\\151\\-4.882813\\-95.0086\\151\\-2.929688\\-95.67317\\151\\0.9765625\\-96.41453\\151\\2.929688\\-96.5678\\151\\4.882813\\-96.49471\\151\\8.789063\\-95.88215\\151\\10.74219\\-95.39052\\151\\12.69531\\-94.43196\\151\\16.60156\\-93.331\\151\\18.55469\\-92.64893\\151\\20.50781\\-92.16029\\151\\22.46094\\-91.81\\151\\26.36719\\-91.22162\\151\\30.27344\\-90.50095\\151\\34.17969\\-90.09827\\151\\36.13281\\-89.97601\\151\\41.99219\\-89.70985\\151\\47.85156\\-89.59422\\151\\53.71094\\-89.62401\\151\\57.61719\\-89.78755\\151\\61.52344\\-90.06461\\151\\65.42969\\-90.58788\\151\\69.33594\\-91.42341\\151\\73.24219\\-92.11123\\151\\75.19531\\-92.55411\\151\\77.14844\\-93.27675\\151\\81.05469\\-94.07375\\151\\83.00781\\-94.76485\\151\\84.96094\\-95.59294\\151\\86.91406\\-96.26324\\151\\88.86719\\-97.36789\\151\\90.82031\\-98.15344\\151\\92.77344\\-99.3765\\151\\94.72656\\-100.1334\\151\\96.67969\\-101.3581\\151\\98.63281\\-102.3722\\151\\101.7624\\-104.5547\\151\\102.5391\\-105.2167\\151\\106.4453\\-107.8481\\151\\108.3984\\-109.5467\\151\\112.3047\\-113.5405\\151\\114.6926\\-116.2734\\151\\116.2109\\-118.611\\151\\118.2162\\-122.1328\\151\\120.1698\\-126.0391\\151\\121.0724\\-127.9922\\151\\122.6901\\-131.8984\\151\\123.5518\\-135.8047\\151\\124.2974\\-137.7578\\151\\124.7993\\-139.7109\\151\\125.4944\\-143.6172\\151\\126.1636\\-145.5703\\151\\126.6119\\-147.5234\\151\\127.5228\\-153.3828\\151\\127.9672\\-155.3359\\151\\128.3038\\-157.2891\\151\\128.5203\\-159.2422\\151\\128.7984\\-163.1484\\151\\128.9756\\-167.0547\\151\\129.1642\\-178.7734\\151\\129.2421\\-184.6328\\151\\129.2843\\-192.4453\\151\\129.238\\-200.2578\\151\\129.1489\\-204.1641\\151\\128.9998\\-208.0703\\151\\128.7772\\-211.9766\\151\\128.4059\\-215.8828\\151\\128.0651\\-217.8359\\151\\127.4535\\-219.7891\\151\\126.5526\\-223.6953\\151\\125.7324\\-225.6484\\151\\125.1195\\-227.6016\\151\\124.6726\\-229.5547\\151\\123.7558\\-231.5078\\151\\122.6525\\-235.4141\\151\\121.6527\\-237.3672\\151\\120.864\\-239.3203\\151\\119.6382\\-241.2734\\151\\118.7263\\-243.2266\\151\\117.4409\\-245.1797\\151\\116.6225\\-247.1328\\151\\113.8632\\-251.0391\\151\\112.6452\\-252.9922\\151\\110.3516\\-256.1506\\151\\108.3984\\-258.7295\\151\\106.4453\\-261.1535\\151\\103.2612\\-264.7109\\151\\101.3555\\-266.6641\\151\\98.63281\\-269.2753\\151\\94.72656\\-272.8224\\151\\92.68811\\-274.4766\\151\\88.86719\\-277.4548\\151\\84.96094\\-280.6139\\151\\82.40897\\-282.2891\\151\\77.14844\\-285.6131\\151\\75.19531\\-286.9912\\151\\71.28906\\-289.0643\\151\\69.15039\\-290.1016\\151\\63.47656\\-293.0419\\151\\59.57031\\-294.795\\151\\57.61719\\-295.2872\\151\\55.66406\\-296.1607\\151\\53.71094\\-296.8188\\151\\51.75781\\-297.3127\\151\\49.80469\\-298.2289\\151\\45.89844\\-299.3491\\151\\43.94531\\-300.1164\\151\\41.99219\\-300.5996\\151\\38.08594\\-301.2964\\151\\34.17969\\-302.2818\\151\\32.22656\\-302.5956\\151\\28.32031\\-302.9824\\151\\26.36719\\-303.2604\\151\\22.46094\\-304.044\\151\\18.55469\\-304.4912\\151\\12.69531\\-304.8612\\151\\4.882813\\-305.2148\\151\\-0.9765625\\-305.2533\\151\\-8.789063\\-304.9463\\151\\-14.64844\\-304.5965\\151\\-18.55469\\-304.2264\\151" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "238" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "202" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-304.1095\\153\\-24.41406\\-303.2424\\153\\-26.36719\\-302.9715\\153\\-30.27344\\-302.5838\\153\\-32.22656\\-302.2715\\153\\-36.13281\\-301.2614\\153\\-40.03906\\-300.5278\\153\\-41.99219\\-300.0026\\153\\-43.94531\\-299.1958\\153\\-45.89844\\-298.6776\\153\\-49.80469\\-297.1209\\153\\-51.75781\\-296.6022\\153\\-53.71094\\-295.7059\\153\\-57.61719\\-294.4961\\153\\-59.57031\\-293.4254\\153\\-61.52344\\-292.6825\\153\\-63.47656\\-291.4479\\153\\-65.42969\\-290.6293\\153\\-67.38281\\-289.3997\\153\\-69.33594\\-288.6902\\153\\-71.28906\\-287.4331\\153\\-73.24219\\-286.3519\\153\\-76.32396\\-284.2422\\153\\-77.14844\\-283.5671\\153\\-79.10156\\-282.3931\\153\\-81.05469\\-281.116\\153\\-83.00781\\-279.5253\\153\\-84.96094\\-277.8009\\153\\-88.86719\\-274.979\\153\\-90.82031\\-273.2355\\153\\-91.50849\\-272.5234\\153\\-96.67969\\-267.7635\\153\\-97.68113\\-266.6641\\153\\-100.5859\\-263.6932\\153\\-101.6422\\-262.7578\\153\\-103.444\\-260.8047\\153\\-106.4453\\-257.3721\\153\\-108.6593\\-254.9453\\153\\-109.9152\\-252.9922\\153\\-112.9859\\-249.0859\\153\\-114.4064\\-247.1328\\153\\-115.5536\\-245.1797\\153\\-116.8729\\-243.2266\\153\\-117.7416\\-241.2734\\153\\-118.1641\\-240.7269\\153\\-120.1172\\-237.3379\\153\\-122.2234\\-233.4609\\153\\-122.9814\\-231.5078\\153\\-123.5385\\-229.5547\\153\\-124.4894\\-227.6016\\153\\-125.5292\\-223.6953\\153\\-126.4113\\-221.7422\\153\\-127.3708\\-217.8359\\153\\-128.0794\\-215.8828\\153\\-128.5749\\-213.9297\\153\\-129.5183\\-208.0703\\153\\-130.3678\\-204.1641\\153\\-130.6345\\-202.2109\\153\\-131.2668\\-192.4453\\153\\-131.6806\\-186.5859\\153\\-131.7817\\-182.6797\\153\\-131.6954\\-178.7734\\153\\-131.4814\\-174.8672\\153\\-130.6417\\-161.1953\\153\\-130.1649\\-157.2891\\153\\-129.3979\\-153.3828\\153\\-128.8086\\-149.4766\\153\\-128.4485\\-147.5234\\153\\-127.1932\\-143.6172\\153\\-126.6997\\-141.6641\\153\\-125.1481\\-137.7578\\153\\-124.6046\\-135.8047\\153\\-123.6342\\-133.8516\\153\\-122.9806\\-131.8984\\153\\-122.125\\-129.9453\\153\\-121.0767\\-127.9922\\153\\-119.833\\-126.0391\\153\\-118.7027\\-124.0859\\153\\-116.2109\\-120.4629\\153\\-114.5809\\-118.2266\\153\\-112.3047\\-115.5056\\153\\-109.5215\\-112.3672\\153\\-106.4453\\-109.3436\\153\\-104.4922\\-107.673\\153\\-102.5391\\-106.2177\\153\\-100.5859\\-105.0879\\153\\-98.63281\\-103.6695\\153\\-96.67969\\-102.4166\\153\\-90.82031\\-99.82576\\153\\-88.86719\\-99.28622\\153\\-86.91406\\-98.41158\\153\\-84.96094\\-97.83823\\153\\-83.00781\\-97.41006\\153\\-79.10156\\-96.26596\\153\\-73.24219\\-95.40552\\153\\-71.28906\\-95.06706\\153\\-69.33594\\-94.6027\\153\\-67.38281\\-94.25227\\153\\-65.42969\\-94.03086\\153\\-59.57031\\-93.54777\\153\\-57.61719\\-93.3369\\153\\-53.71094\\-92.62424\\153\\-49.80469\\-92.16151\\153\\-45.89844\\-91.92673\\153\\-41.99219\\-91.75785\\153\\-40.03906\\-91.61655\\153\\-36.13281\\-91.45152\\153\\-30.27344\\-91.34637\\153\\-26.36719\\-91.43324\\153\\-20.50781\\-91.61523\\153\\-16.60156\\-91.90028\\153\\-14.64844\\-92.18307\\153\\-12.69531\\-92.72743\\153\\-10.74219\\-93.50964\\153\\-8.789063\\-93.92703\\153\\-6.835938\\-94.54492\\153\\-4.882813\\-95.40819\\153\\0.9765625\\-96.98808\\153\\2.929688\\-97.1598\\153\\4.882813\\-97.08099\\153\\6.835938\\-96.67561\\153\\10.74219\\-95.68915\\153\\14.64844\\-94.05981\\153\\18.55469\\-93.14699\\153\\20.50781\\-92.53197\\153\\22.46094\\-92.11904\\153\\24.41406\\-91.82664\\153\\28.32031\\-91.34274\\153\\32.22656\\-90.70843\\153\\36.13281\\-90.29572\\153\\40.03906\\-90.09174\\153\\43.94531\\-89.97028\\153\\47.85156\\-89.92235\\153\\53.71094\\-89.9276\\153\\57.61719\\-90.06811\\153\\61.52344\\-90.38554\\153\\63.47656\\-90.68337\\153\\67.38281\\-91.38895\\153\\71.28906\\-91.94584\\153\\73.24219\\-92.31625\\153\\77.14844\\-93.45968\\153\\81.05469\\-94.21886\\153\\83.00781\\-95.04414\\153\\86.91406\\-96.48951\\153\\88.86719\\-97.5769\\153\\90.82031\\-98.43265\\153\\92.77344\\-99.57942\\153\\94.72656\\-100.4156\\153\\98.3347\\-102.6016\\153\\100.5859\\-104.038\\153\\104.4922\\-106.9443\\153\\106.4453\\-108.2533\\153\\108.8797\\-110.4141\\153\\112.5636\\-114.3203\\153\\114.2578\\-116.3392\\153\\116.8815\\-120.1797\\153\\117.7033\\-122.1328\\153\\118.8519\\-124.0859\\153\\119.6512\\-126.0391\\153\\120.803\\-127.9922\\153\\121.4761\\-129.9453\\153\\122.4211\\-131.8984\\153\\122.963\\-133.8516\\153\\123.3337\\-135.8047\\153\\124.6212\\-139.7109\\153\\125.2869\\-143.6172\\153\\125.7827\\-145.5703\\153\\126.4113\\-147.5234\\153\\127.2768\\-153.3828\\153\\128.0382\\-157.2891\\153\\128.5203\\-161.1953\\153\\128.8498\\-167.0547\\153\\128.9119\\-169.0078\\153\\129.0583\\-182.6797\\153\\129.1028\\-190.4922\\153\\129.0601\\-200.2578\\153\\128.9291\\-206.1172\\153\\128.6537\\-211.9766\\153\\128.2807\\-215.8828\\153\\127.9297\\-217.6154\\153\\127.3692\\-219.7891\\153\\126.5448\\-223.6953\\153\\125.7713\\-225.6484\\153\\125.1418\\-227.6016\\153\\124.7025\\-229.5547\\153\\123.8632\\-231.5078\\153\\123.2217\\-233.4609\\153\\122.7398\\-235.4141\\153\\120.9755\\-239.3203\\153\\119.8471\\-241.2734\\153\\118.8881\\-243.2266\\153\\117.5666\\-245.1797\\153\\116.785\\-247.1328\\153\\115.4284\\-249.0859\\153\\112.8305\\-252.9922\\153\\111.3404\\-254.9453\\153\\108.5848\\-258.8516\\153\\106.4453\\-261.4288\\153\\103.4617\\-264.7109\\153\\101.5818\\-266.6641\\153\\98.63281\\-269.4968\\153\\94.72656\\-273.1094\\153\\92.77344\\-274.7673\\153\\90.82031\\-276.1836\\153\\84.96094\\-280.8988\\153\\82.85985\\-282.2891\\153\\81.05469\\-283.3342\\153\\79.10156\\-284.7812\\153\\73.24219\\-288.4222\\153\\71.28906\\-289.2532\\153\\69.33594\\-290.3872\\153\\67.38281\\-291.2348\\153\\65.42969\\-292.4362\\153\\63.47656\\-293.2683\\153\\61.52344\\-294.3035\\153\\59.57031\\-294.9607\\153\\57.61719\\-295.5066\\153\\55.66406\\-296.4619\\153\\53.71094\\-296.9692\\153\\51.75781\\-297.6068\\153\\49.80469\\-298.4934\\153\\47.85156\\-299.0101\\153\\43.94531\\-300.3616\\153\\40.03906\\-301.094\\153\\38.08594\\-301.516\\153\\36.13281\\-302.1003\\153\\32.22656\\-302.7127\\153\\28.32031\\-303.132\\153\\26.36719\\-303.4777\\153\\24.41406\\-303.9972\\153\\22.46094\\-304.2787\\153\\18.55469\\-304.6232\\153\\6.835938\\-305.317\\153\\2.929688\\-305.4122\\153\\-0.9765625\\-305.4143\\153\\-6.835938\\-305.1726\\153\\-12.69531\\-304.827\\153\\-18.55469\\-304.3805\\153" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "241" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "203" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-303.9221\\155\\-24.41406\\-303.43\\155\\-26.36719\\-303.0824\\155\\-30.27344\\-302.689\\155\\-32.22656\\-302.4227\\155\\-34.17969\\-301.9931\\155\\-36.13281\\-301.4174\\155\\-40.03906\\-300.6631\\155\\-41.99219\\-300.2182\\155\\-43.94531\\-299.388\\155\\-47.85156\\-298.207\\155\\-49.80469\\-297.2764\\155\\-51.75781\\-296.772\\155\\-55.66406\\-295.227\\155\\-57.61719\\-294.6896\\155\\-59.57031\\-293.6956\\155\\-61.52344\\-292.8795\\155\\-63.47656\\-291.7631\\155\\-65.42969\\-290.8617\\155\\-67.38281\\-289.6299\\155\\-69.33594\\-288.9059\\155\\-71.28906\\-287.7182\\155\\-73.24219\\-286.7057\\155\\-77.14844\\-283.8824\\155\\-79.10156\\-282.7564\\155\\-82.42516\\-280.3359\\155\\-84.96094\\-278.232\\155\\-86.91406\\-276.7841\\155\\-88.86719\\-275.2354\\155\\-90.82031\\-273.4869\\155\\-91.77734\\-272.5234\\155\\-94.72656\\-269.8007\\155\\-96.11192\\-268.6172\\155\\-97.94387\\-266.6641\\155\\-100.5859\\-263.9612\\155\\-101.8903\\-262.7578\\155\\-106.4453\\-257.5781\\155\\-108.8797\\-254.9453\\155\\-111.5374\\-251.0391\\155\\-113.1205\\-249.0859\\155\\-114.579\\-247.1328\\155\\-115.6741\\-245.1797\\155\\-116.945\\-243.2266\\155\\-117.8266\\-241.2734\\155\\-118.1641\\-240.8524\\155\\-120.1694\\-237.3672\\155\\-122.0703\\-233.6999\\155\\-122.9576\\-231.5078\\155\\-123.4831\\-229.5547\\155\\-124.4154\\-227.6016\\155\\-125.4521\\-223.6953\\155\\-126.3127\\-221.7422\\155\\-127.2329\\-217.8359\\155\\-128.4421\\-213.9297\\155\\-129.3367\\-208.0703\\155\\-130.1893\\-204.1641\\155\\-130.4986\\-202.2109\\155\\-130.8048\\-198.3047\\155\\-130.9921\\-194.3984\\155\\-131.4285\\-186.5859\\155\\-131.5059\\-182.6797\\155\\-131.4285\\-178.7734\\155\\-131.0801\\-170.9609\\155\\-130.7701\\-165.1016\\155\\-130.4509\\-161.1953\\155\\-130.1893\\-159.2422\\155\\-129.445\\-155.3359\\155\\-128.6098\\-149.4766\\155\\-128.1566\\-147.5234\\155\\-127.4414\\-145.5703\\155\\-126.4139\\-141.6641\\155\\-125.504\\-139.7109\\155\\-124.9302\\-137.7578\\155\\-124.2477\\-135.8047\\155\\-123.3322\\-133.8516\\155\\-122.7362\\-131.8984\\155\\-121.6443\\-129.9453\\155\\-120.7429\\-127.9922\\155\\-119.3683\\-126.0391\\155\\-118.2467\\-124.0859\\155\\-116.2109\\-121.0408\\155\\-112.4663\\-116.2734\\155\\-110.8434\\-114.3203\\155\\-109.098\\-112.3672\\155\\-106.4453\\-109.7323\\155\\-104.4922\\-108.0164\\155\\-102.4009\\-106.5078\\155\\-100.5859\\-105.3558\\155\\-98.63281\\-103.9016\\155\\-94.72656\\-101.7154\\155\\-92.77344\\-100.9835\\155\\-90.82031\\-100.0121\\155\\-88.86719\\-99.4938\\155\\-84.96094\\-98.06438\\155\\-81.05469\\-97.18382\\155\\-79.10156\\-96.53049\\155\\-77.14844\\-96.15289\\155\\-71.28906\\-95.312\\155\\-67.38281\\-94.48696\\155\\-65.42969\\-94.20823\\155\\-61.52344\\-93.8242\\155\\-55.66406\\-93.34018\\155\\-49.80469\\-92.46895\\155\\-45.89844\\-92.14873\\155\\-40.03906\\-91.85938\\155\\-36.13281\\-91.72346\\155\\-30.27344\\-91.64779\\155\\-24.41406\\-91.75029\\155\\-18.55469\\-91.97759\\155\\-16.60156\\-92.17231\\155\\-14.64844\\-92.52113\\155\\-12.69531\\-93.20564\\155\\-8.789063\\-94.15717\\155\\-6.835938\\-95.00691\\155\\-4.882813\\-95.71331\\155\\-2.929688\\-96.2569\\155\\-0.9765625\\-97.00214\\155\\0.9765625\\-97.42522\\155\\2.929688\\-97.54983\\155\\4.882813\\-97.48135\\155\\6.835938\\-97.22114\\155\\8.789063\\-96.5399\\155\\12.69531\\-95.27734\\155\\14.64844\\-94.34645\\155\\18.55469\\-93.50613\\155\\22.46094\\-92.49985\\155\\24.41406\\-92.13839\\155\\26.36719\\-91.8862\\155\\34.17969\\-91.04919\\155\\36.13281\\-90.74738\\155\\41.99219\\-90.37357\\155\\49.80469\\-90.21143\\155\\53.71094\\-90.21494\\155\\57.61719\\-90.37974\\155\\59.57031\\-90.5638\\155\\63.47656\\-91.20396\\155\\69.33594\\-91.88507\\155\\71.28906\\-92.14754\\155\\73.24219\\-92.54297\\155\\75.19531\\-93.15438\\155\\77.14844\\-93.60627\\155\\79.10156\\-93.93909\\155\\81.05469\\-94.41401\\155\\83.00781\\-95.31641\\155\\84.96094\\-95.93961\\155\\86.82291\\-96.74219\\155\\92.77344\\-99.72482\\155\\96.67969\\-101.7888\\155\\98.63281\\-103.1533\\155\\100.5859\\-104.3538\\155\\103.6099\\-106.5078\\155\\106.0846\\-108.4609\\155\\108.373\\-110.4141\\155\\112.3047\\-114.596\\155\\114.2578\\-116.8848\\155\\115.2893\\-118.2266\\155\\116.5915\\-120.1797\\155\\117.4286\\-122.1328\\155\\118.6096\\-124.0859\\155\\119.3638\\-126.0391\\155\\120.5287\\-127.9922\\155\\121.2477\\-129.9453\\155\\122.0939\\-131.8984\\155\\122.8164\\-133.8516\\155\\123.6816\\-137.7578\\155\\124.4596\\-139.7109\\155\\125.1628\\-143.6172\\155\\125.5644\\-145.5703\\155\\126.2123\\-147.5234\\155\\126.598\\-149.4766\\155\\127.4474\\-155.3359\\155\\128.155\\-159.2422\\155\\128.3967\\-161.1953\\155\\128.6692\\-165.1016\\155\\128.8272\\-169.0078\\155\\128.8834\\-172.9141\\155\\128.946\\-182.6797\\155\\128.9756\\-190.4922\\155\\128.9291\\-200.2578\\155\\128.8221\\-206.1172\\155\\128.5522\\-211.9766\\155\\128.415\\-213.9297\\155\\128.1654\\-215.8828\\155\\127.3103\\-219.7891\\155\\126.5603\\-223.6953\\155\\125.1795\\-227.6016\\155\\124.7709\\-229.5547\\155\\123.2774\\-233.4609\\155\\122.8285\\-235.4141\\155\\122.0703\\-237.236\\155\\120.1248\\-241.2734\\155\\118.1641\\-244.6777\\155\\117.7777\\-245.1797\\155\\116.9355\\-247.1328\\155\\115.5973\\-249.0859\\155\\114.4319\\-251.0391\\155\\112.3047\\-253.9765\\155\\111.512\\-254.9453\\155\\108.815\\-258.8516\\155\\106.4453\\-261.6548\\155\\105.3731\\-262.7578\\155\\101.7953\\-266.6641\\155\\97.71412\\-270.5703\\155\\94.72656\\-273.3649\\155\\92.77344\\-275.0844\\155\\88.86719\\-277.9966\\155\\88.45313\\-278.3828\\155\\84.96094\\-281.1465\\155\\83.00781\\-282.5256\\155\\81.05469\\-283.5766\\155\\77.14844\\-286.402\\155\\75.19531\\-287.4465\\155\\73.24219\\-288.7225\\155\\71.28906\\-289.4742\\155\\69.33594\\-290.6875\\155\\67.38281\\-291.5076\\155\\65.42969\\-292.7343\\155\\63.47656\\-293.5353\\155\\61.52344\\-294.5775\\155\\59.57031\\-295.1178\\155\\57.61719\\-295.7995\\155\\55.66406\\-296.6665\\155\\53.71094\\-297.1405\\155\\51.75781\\-297.9948\\155\\49.80469\\-298.6964\\155\\47.85156\\-299.2293\\155\\45.89844\\-300.0046\\155\\43.94531\\-300.5433\\155\\40.03906\\-301.2706\\155\\36.13281\\-302.325\\155\\34.17969\\-302.6097\\155\\30.27344\\-303.0382\\155\\28.32031\\-303.343\\155\\24.41406\\-304.2354\\155\\20.50781\\-304.6071\\155\\6.835938\\-305.5355\\155\\2.929688\\-305.6281\\155\\-2.929688\\-305.5484\\155\\-6.835938\\-305.3322\\155\\-16.60156\\-304.6745\\155\\-20.50781\\-304.2787\\155" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "237" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "204" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.929688\\-305.8073\\157\\-6.835938\\-305.5614\\157\\-12.69531\\-305.0666\\157\\-18.55469\\-304.622\\157\\-22.46094\\-304.1604\\157\\-26.36719\\-303.2391\\157\\-28.32031\\-302.9651\\157\\-32.22656\\-302.5572\\157\\-34.17969\\-302.1874\\157\\-38.08594\\-301.1505\\157\\-41.99219\\-300.3764\\157\\-45.89844\\-298.9951\\157\\-47.85156\\-298.4534\\157\\-49.80469\\-297.4937\\157\\-53.71094\\-296.3339\\157\\-55.66406\\-295.3839\\157\\-57.61719\\-294.8526\\157\\-59.57031\\-294.0469\\157\\-63.47656\\-292.1901\\157\\-67.38281\\-290\\157\\-71.18317\\-288.1484\\157\\-73.24219\\-286.9708\\157\\-75.19531\\-285.5544\\157\\-79.10156\\-283.0328\\157\\-81.05469\\-281.5806\\157\\-82.92165\\-280.3359\\157\\-86.91406\\-277.0912\\157\\-90.03751\\-274.4766\\157\\-94.72656\\-270.1603\\157\\-96.54772\\-268.6172\\157\\-100.5859\\-264.3428\\157\\-102.2084\\-262.7578\\157\\-104.4922\\-260.1263\\157\\-105.4921\\-258.8516\\157\\-107.3453\\-256.8984\\157\\-109.0694\\-254.9453\\157\\-110.4854\\-252.9922\\157\\-111.7042\\-251.0391\\157\\-112.3047\\-250.3393\\157\\-114.7585\\-247.1328\\157\\-115.8189\\-245.1797\\157\\-117.033\\-243.2266\\157\\-117.9872\\-241.2734\\157\\-120.3195\\-237.3672\\157\\-121.2356\\-235.4141\\157\\-122.2897\\-233.4609\\157\\-122.9759\\-231.5078\\157\\-123.4608\\-229.5547\\157\\-124.3804\\-227.6016\\157\\-125.4025\\-223.6953\\157\\-126.224\\-221.7422\\157\\-127.1537\\-217.8359\\157\\-128.334\\-213.9297\\157\\-128.6778\\-211.9766\\157\\-129.555\\-206.1172\\157\\-130.0266\\-204.1641\\157\\-130.3645\\-202.2109\\157\\-130.7352\\-198.3047\\157\\-130.9116\\-194.3984\\157\\-131.2256\\-188.5391\\157\\-131.3321\\-184.6328\\157\\-131.3262\\-180.7266\\157\\-131.1489\\-174.8672\\157\\-130.7821\\-167.0547\\157\\-130.49\\-163.1484\\157\\-130.2748\\-161.1953\\157\\-129.5296\\-157.2891\\157\\-128.7529\\-151.4297\\157\\-128.4119\\-149.4766\\157\\-127.1671\\-145.5703\\157\\-126.7051\\-143.6172\\157\\-126.0431\\-141.6641\\157\\-125.2275\\-139.7109\\157\\-124.7185\\-137.7578\\157\\-123.819\\-135.8047\\157\\-122.4512\\-131.8984\\157\\-121.3265\\-129.9453\\157\\-120.3425\\-127.9922\\157\\-118.1641\\-124.6701\\157\\-117.7\\-124.0859\\157\\-116.6922\\-122.1328\\157\\-115.2018\\-120.1797\\157\\-112.3047\\-116.6563\\157\\-110.4574\\-114.3203\\157\\-108.724\\-112.3672\\157\\-106.4453\\-110.1141\\157\\-104.4922\\-108.4015\\157\\-102.0255\\-106.5078\\157\\-99.12109\\-104.5547\\157\\-98.63281\\-104.1467\\157\\-96.67969\\-103.0832\\157\\-94.72656\\-101.8919\\157\\-92.77344\\-101.1961\\157\\-90.82031\\-100.2045\\157\\-86.91406\\-99.15449\\157\\-84.96094\\-98.30592\\157\\-81.05469\\-97.43819\\157\\-77.14844\\-96.3528\\157\\-75.19531\\-96.03928\\157\\-71.28906\\-95.51138\\157\\-69.33594\\-95.19707\\157\\-65.42969\\-94.4025\\157\\-61.52344\\-93.95629\\157\\-53.71094\\-93.37709\\157\\-51.75781\\-93.18668\\157\\-47.85156\\-92.6365\\157\\-43.94531\\-92.3058\\157\\-38.08594\\-92.0238\\157\\-30.27344\\-91.88563\\157\\-22.46094\\-92.06196\\157\\-18.55469\\-92.2489\\157\\-16.60156\\-92.48942\\157\\-12.69531\\-93.5015\\157\\-10.74219\\-93.88991\\157\\-8.789063\\-94.46593\\157\\-6.835938\\-95.37759\\157\\-2.929688\\-96.64745\\157\\-0.9765625\\-97.42178\\157\\0.9765625\\-97.74392\\157\\2.929688\\-97.85755\\157\\4.882813\\-97.79273\\157\\6.835938\\-97.55599\\157\\8.789063\\-97.0495\\157\\10.74219\\-96.20103\\157\\12.69531\\-95.58862\\157\\14.64844\\-94.78078\\157\\16.60156\\-94.10232\\157\\20.50781\\-93.41537\\157\\24.41406\\-92.52995\\157\\26.36719\\-92.23455\\157\\30.27344\\-91.77799\\157\\36.13281\\-91.33688\\157\\38.08594\\-91.25391\\157\\43.94531\\-90.83063\\157\\49.80469\\-90.55515\\157\\53.71094\\-90.59908\\157\\57.61719\\-90.84525\\157\\61.52344\\-91.36221\\157\\65.42969\\-91.68182\\157\\69.33594\\-92.09564\\157\\71.28906\\-92.38021\\157\\75.19531\\-93.37273\\157\\79.10156\\-94.06916\\157\\81.05469\\-94.68585\\157\\83.00781\\-95.53619\\157\\84.96094\\-96.10828\\157\\86.91406\\-97.10026\\157\\88.86719\\-97.91086\\157\\90.82031\\-99.05621\\157\\92.77344\\-99.87329\\157\\94.72656\\-101.06\\157\\96.67969\\-101.9742\\157\\97.51062\\-102.6016\\157\\102.5391\\-106.0036\\157\\104.4922\\-107.4582\\157\\107.9317\\-110.4141\\157\\109.8968\\-112.3672\\157\\112.3047\\-114.9352\\157\\115.033\\-118.2266\\157\\116.2842\\-120.1797\\157\\118.3138\\-124.0859\\157\\119.1774\\-126.0391\\157\\120.2526\\-127.9922\\157\\121.8401\\-131.8984\\157\\122.7069\\-133.8516\\157\\123.5418\\-137.7578\\157\\124.3115\\-139.7109\\157\\124.7972\\-141.6641\\157\\125.4762\\-145.5703\\157\\126.0851\\-147.5234\\157\\126.5385\\-149.4766\\157\\127.3562\\-155.3359\\157\\128.0382\\-159.2422\\157\\128.3241\\-161.1953\\157\\128.6127\\-165.1016\\157\\128.7884\\-169.0078\\157\\128.8445\\-172.9141\\157\\128.8894\\-182.6797\\157\\128.8779\\-196.3516\\157\\128.8221\\-202.2109\\157\\128.7453\\-206.1172\\157\\128.594\\-210.0234\\157\\128.3535\\-213.9297\\157\\128.0651\\-215.8828\\157\\127.2731\\-219.7891\\157\\126.5902\\-223.6953\\157\\125.2441\\-227.6016\\157\\124.8355\\-229.5547\\157\\124.1949\\-231.5078\\157\\123.3497\\-233.4609\\157\\122.927\\-235.4141\\157\\122.2269\\-237.3672\\157\\121.231\\-239.3203\\157\\120.399\\-241.2734\\157\\119.1567\\-243.2266\\157\\118.0459\\-245.1797\\157\\117.0662\\-247.1328\\157\\115.8046\\-249.0859\\157\\114.6715\\-251.0391\\157\\114.2578\\-251.5045\\157\\112.3047\\-254.2358\\157\\111.6869\\-254.9453\\157\\109.0299\\-258.8516\\157\\107.3727\\-260.8047\\157\\105.5434\\-262.7578\\157\\102.0033\\-266.6641\\157\\94.72656\\-273.6189\\157\\92.77344\\-275.3424\\157\\88.86719\\-278.4204\\157\\83.00781\\-282.8211\\157\\81.05469\\-283.8954\\157\\77.14844\\-286.7379\\157\\75.19531\\-287.7564\\157\\73.24219\\-288.9581\\157\\71.28906\\-289.776\\157\\69.33594\\-290.9424\\157\\67.38281\\-291.8907\\157\\65.42969\\-292.9722\\157\\61.52344\\-294.776\\157\\59.57031\\-295.2742\\157\\57.61719\\-296.1739\\157\\55.66406\\-296.8272\\157\\53.71094\\-297.3655\\157\\51.75781\\-298.3352\\157\\47.85156\\-299.4986\\157\\45.89844\\-300.2991\\157\\40.03906\\-301.4901\\157\\38.08594\\-302.0773\\157\\36.13281\\-302.51\\157\\32.22656\\-302.9514\\157\\30.27344\\-303.2302\\157\\26.36719\\-304.12\\157\\24.41406\\-304.4262\\157\\12.69531\\-305.3524\\157\\10.74219\\-305.5484\\157\\6.835938\\-305.8213\\157\\0.9765625\\-305.9009\\157" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "236" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "205" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-305.862\\159\\-12.69531\\-305.2561\\159\\-18.55469\\-304.7595\\159\\-22.46094\\-304.3507\\159\\-24.41406\\-304.0092\\159\\-26.36719\\-303.4756\\159\\-28.32031\\-303.0938\\159\\-32.22656\\-302.6648\\159\\-34.17969\\-302.37\\159\\-38.08594\\-301.3156\\159\\-41.99219\\-300.5468\\159\\-43.94531\\-299.9765\\159\\-45.89844\\-299.1881\\159\\-47.85156\\-298.649\\159\\-51.75781\\-297.0731\\159\\-53.71094\\-296.5698\\159\\-55.66406\\-295.6167\\159\\-59.57031\\-294.3808\\159\\-61.52344\\-293.3142\\159\\-63.47656\\-292.5251\\159\\-65.42969\\-291.2657\\159\\-67.38281\\-290.4249\\159\\-69.33594\\-289.2501\\159\\-71.28906\\-288.4518\\159\\-71.6816\\-288.1484\\159\\-77.14844\\-284.7178\\159\\-81.05469\\-281.8496\\159\\-83.00781\\-280.6639\\159\\-85.64661\\-278.3828\\159\\-88.86719\\-275.7056\\159\\-90.46599\\-274.4766\\159\\-92.77344\\-272.3222\\159\\-96.67969\\-268.8792\\159\\-100.5859\\-264.7923\\159\\-102.599\\-262.7578\\159\\-105.8275\\-258.8516\\159\\-109.2715\\-254.9453\\159\\-110.7661\\-252.9922\\159\\-111.9358\\-251.0391\\159\\-114.9503\\-247.1328\\159\\-118.1641\\-241.4129\\159\\-119.2336\\-239.3203\\159\\-120.4962\\-237.3672\\159\\-121.3351\\-235.4141\\159\\-122.3776\\-233.4609\\159\\-122.9995\\-231.5078\\159\\-123.4961\\-229.5547\\159\\-124.4127\\-227.6016\\159\\-125.4059\\-223.6953\\159\\-126.2004\\-221.7422\\159\\-126.7251\\-219.7891\\159\\-127.6536\\-215.8828\\159\\-128.2911\\-213.9297\\159\\-128.6436\\-211.9766\\159\\-129.4855\\-206.1172\\159\\-130.2965\\-202.2109\\159\\-130.5318\\-200.2578\\159\\-130.81\\-196.3516\\159\\-131.1603\\-188.5391\\159\\-131.25\\-184.6328\\159\\-131.25\\-180.7266\\159\\-131.0801\\-174.8672\\159\\-130.7174\\-167.0547\\159\\-130.3971\\-163.1484\\159\\-130.1233\\-161.1953\\159\\-129.3879\\-157.2891\\159\\-128.6173\\-151.4297\\159\\-128.2021\\-149.4766\\159\\-127.4852\\-147.5234\\159\\-126.5046\\-143.6172\\159\\-125.6466\\-141.6641\\159\\-124.4924\\-137.7578\\159\\-123.5057\\-135.8047\\159\\-122.9553\\-133.8516\\159\\-122.1097\\-131.8984\\159\\-121.0562\\-129.9453\\159\\-119.8392\\-127.9922\\159\\-118.7729\\-126.0391\\159\\-117.3941\\-124.0859\\159\\-116.3005\\-122.1328\\159\\-114.9022\\-120.1797\\159\\-111.5987\\-116.2734\\159\\-110.3516\\-114.6255\\159\\-108.2935\\-112.3672\\159\\-104.4922\\-108.7239\\159\\-101.7197\\-106.5078\\159\\-98.80371\\-104.5547\\159\\-94.72656\\-102.0569\\159\\-92.77344\\-101.3558\\159\\-90.82031\\-100.444\\159\\-88.86719\\-99.78609\\159\\-86.91406\\-99.36008\\159\\-84.96094\\-98.57324\\159\\-83.00781\\-97.98743\\159\\-79.10156\\-97.22437\\159\\-77.14844\\-96.60675\\159\\-75.19531\\-96.19463\\159\\-69.33594\\-95.39711\\159\\-63.47656\\-94.34396\\159\\-59.57031\\-93.94946\\159\\-55.66406\\-93.6788\\159\\-49.80469\\-93.32422\\159\\-43.94531\\-92.67435\\159\\-41.99219\\-92.51041\\159\\-38.08594\\-92.3058\\159\\-30.27344\\-92.14628\\159\\-22.46094\\-92.35632\\159\\-18.55469\\-92.60021\\159\\-16.60156\\-92.92188\\159\\-10.74219\\-94.0942\\159\\-6.835938\\-95.64208\\159\\-4.882813\\-96.2298\\159\\-2.929688\\-97.16256\\159\\-0.9765625\\-97.72389\\159\\0.9765625\\-98.02852\\159\\2.929688\\-98.1491\\159\\4.882813\\-98.06715\\159\\6.835938\\-97.81995\\159\\8.789063\\-97.41036\\159\\10.74219\\-96.55112\\159\\12.69531\\-95.81921\\159\\14.64844\\-95.18666\\159\\16.60156\\-94.3886\\159\\18.55469\\-93.98447\\159\\22.46094\\-93.40614\\159\\26.36719\\-92.64893\\159\\30.27344\\-92.10491\\159\\34.17969\\-91.82301\\159\\40.03906\\-91.55762\\159\\45.89844\\-91.21484\\159\\49.80469\\-91.08656\\159\\53.71094\\-91.13549\\159\\55.66406\\-91.21707\\159\\61.52344\\-91.65486\\159\\63.47656\\-91.72952\\159\\67.38281\\-92.09213\\159\\71.28906\\-92.7005\\159\\73.24219\\-93.20301\\159\\79.10156\\-94.26065\\159\\83.00781\\-95.71569\\159\\84.96094\\-96.30056\\159\\86.91406\\-97.3328\\159\\88.86719\\-98.09821\\159\\90.82031\\-99.27997\\159\\92.77344\\-100.034\\159\\94.72656\\-101.2799\\159\\96.67969\\-102.1683\\159\\100.0176\\-104.5547\\159\\100.5859\\-105.0329\\159\\102.5391\\-106.2691\\159\\104.4922\\-107.6941\\159\\106.4453\\-109.3526\\159\\109.6316\\-112.3672\\159\\112.3047\\-115.219\\159\\114.8039\\-118.2266\\159\\116.2109\\-120.454\\159\\117.1332\\-122.1328\\159\\120.9666\\-129.9453\\159\\121.6682\\-131.8984\\159\\122.6184\\-133.8516\\159\\123.4681\\-137.7578\\159\\124.2217\\-139.7109\\159\\124.7531\\-141.6641\\159\\125.438\\-145.5703\\159\\126.0431\\-147.5234\\159\\126.5228\\-149.4766\\159\\127.0677\\-153.3828\\159\\127.667\\-157.2891\\159\\128.0382\\-159.2422\\159\\128.4819\\-163.1484\\159\\128.7835\\-169.0078\\159\\128.8445\\-174.8672\\159\\128.8837\\-184.6328\\159\\128.8724\\-190.4922\\159\\128.7946\\-202.2109\\159\\128.5826\\-210.0234\\159\\128.3314\\-213.9297\\159\\128.0518\\-215.8828\\159\\127.2842\\-219.7891\\159\\126.6398\\-223.6953\\159\\126.0713\\-225.6484\\159\\125.335\\-227.6016\\159\\124.9164\\-229.5547\\159\\124.3717\\-231.5078\\159\\123.4591\\-233.4609\\159\\123.0171\\-235.4141\\159\\122.4297\\-237.3672\\159\\121.38\\-239.3203\\159\\120.5997\\-241.2734\\159\\119.3126\\-243.2266\\159\\118.1641\\-245.3956\\159\\116.2109\\-248.8234\\159\\114.8564\\-251.0391\\159\\114.2578\\-251.7527\\159\\112.3047\\-254.4807\\159\\111.881\\-254.9453\\159\\110.6145\\-256.8984\\159\\109.1835\\-258.8516\\159\\107.5393\\-260.8047\\159\\103.9411\\-264.7109\\159\\102.238\\-266.6641\\159\\98.63281\\-270.082\\159\\94.72656\\-273.8629\\159\\92.77344\\-275.5521\\159\\88.86719\\-278.795\\159\\83.00781\\-283.0541\\159\\79.10156\\-285.5627\\159\\77.14844\\-287.0091\\159\\75.19531\\-288.1884\\159\\71.28906\\-290.2117\\159\\69.33594\\-291.1684\\159\\67.38281\\-292.3648\\159\\65.42969\\-293.1857\\159\\63.47656\\-294.2176\\159\\61.52344\\-294.937\\159\\59.57031\\-295.4727\\159\\57.61719\\-296.4619\\159\\55.66406\\-297.0009\\159\\53.71094\\-297.656\\159\\51.75781\\-298.5814\\159\\49.80469\\-299.1064\\159\\47.83381\\-299.8672\\159\\45.89844\\-300.5008\\159\\41.99219\\-301.2447\\159\\38.08594\\-302.3186\\159\\36.13281\\-302.6516\\159\\32.22656\\-303.1049\\159\\30.27344\\-303.5014\\159\\28.32031\\-304.0209\\159\\26.36719\\-304.3615\\159\\24.41406\\-304.5825\\159\\14.64844\\-305.4409\\159\\10.74219\\-305.9009\\159\\6.835938\\-306.0731\\159\\0.9765625\\-306.1233\\159\\-4.882813\\-305.9741\\159" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "241" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "206" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-305.2782\\161\\-22.46094\\-304.5144\\161\\-24.41406\\-304.2703\\161\\-28.32031\\-303.3009\\161\\-30.27344\\-302.9889\\161\\-34.17969\\-302.53\\161\\-36.13281\\-302.1388\\161\\-38.08594\\-301.516\\161\\-43.94531\\-300.2438\\161\\-45.89844\\-299.4325\\161\\-49.80469\\-298.2289\\161\\-51.75781\\-297.2767\\161\\-53.71094\\-296.7655\\161\\-57.61719\\-295.1421\\161\\-59.57031\\-294.6236\\161\\-61.52344\\-293.5983\\161\\-63.47656\\-292.7694\\161\\-65.42969\\-291.5359\\161\\-67.38281\\-290.7245\\161\\-69.33594\\-289.4738\\161\\-71.28906\\-288.7397\\161\\-73.24219\\-287.4587\\161\\-75.19531\\-286.385\\161\\-77.14844\\-285.0057\\161\\-79.10156\\-283.5082\\161\\-83.00781\\-280.9981\\161\\-86.91406\\-277.5882\\161\\-88.50828\\-276.4297\\161\\-90.82031\\-274.586\\161\\-93.03793\\-272.5234\\161\\-95.24094\\-270.5703\\161\\-98.63281\\-267.2656\\161\\-99.1452\\-266.6641\\161\\-102.9554\\-262.7578\\161\\-104.6229\\-260.8047\\161\\-106.1695\\-258.8516\\161\\-108.3984\\-256.3044\\161\\-110.9962\\-252.9922\\161\\-112.3047\\-251.0485\\161\\-115.1461\\-247.1328\\161\\-116.3291\\-245.1797\\161\\-117.2926\\-243.2266\\161\\-118.5209\\-241.2734\\161\\-119.3875\\-239.3203\\161\\-120.671\\-237.3672\\161\\-121.4644\\-235.4141\\161\\-122.5065\\-233.4609\\161\\-123.5722\\-229.5547\\161\\-124.4894\\-227.6016\\161\\-125.4731\\-223.6953\\161\\-126.2805\\-221.7422\\161\\-127.1813\\-217.8359\\161\\-128.3241\\-213.9297\\161\\-128.6621\\-211.9766\\161\\-129.4827\\-206.1172\\161\\-130.2857\\-202.2109\\161\\-130.686\\-198.3047\\161\\-130.8911\\-194.3984\\161\\-131.1344\\-188.5391\\161\\-131.214\\-184.6328\\161\\-131.214\\-180.7266\\161\\-131.1232\\-176.8203\\161\\-130.799\\-169.0078\\161\\-130.5318\\-165.1016\\161\\-130.334\\-163.1484\\161\\-129.5927\\-159.2422\\161\\-129.2982\\-157.2891\\161\\-128.8097\\-153.3828\\161\\-128.5073\\-151.4297\\161\\-128.0105\\-149.4766\\161\\-127.3108\\-147.5234\\161\\-126.2826\\-143.6172\\161\\-125.399\\-141.6641\\161\\-124.8933\\-139.7109\\161\\-124.2217\\-137.7578\\161\\-123.3206\\-135.8047\\161\\-122.7777\\-133.8516\\161\\-121.7403\\-131.8984\\161\\-120.8348\\-129.9453\\161\\-119.5007\\-127.9922\\161\\-118.4441\\-126.0391\\161\\-116.2109\\-122.5486\\161\\-114.624\\-120.1797\\161\\-111.3281\\-116.2734\\161\\-110.3516\\-114.9469\\161\\-107.9636\\-112.3672\\161\\-104.4922\\-108.9701\\161\\-101.4657\\-106.5078\\161\\-100.5859\\-105.8704\\161\\-94.72656\\-102.2255\\161\\-88.86719\\-99.91152\\161\\-86.91406\\-99.50912\\161\\-84.96094\\-98.90825\\161\\-83.00781\\-98.16213\\161\\-79.10156\\-97.44992\\161\\-75.19531\\-96.39567\\161\\-73.24219\\-96.06776\\161\\-67.38281\\-95.30271\\161\\-65.42969\\-95.0004\\161\\-63.47656\\-94.59081\\161\\-59.57031\\-94.09502\\161\\-53.71094\\-93.70724\\161\\-47.85156\\-93.42798\\161\\-40.03906\\-92.79838\\161\\-36.13281\\-92.55411\\161\\-32.22656\\-92.45891\\161\\-28.32031\\-92.45891\\161\\-22.46094\\-92.68733\\161\\-20.50781\\-92.82831\\161\\-16.60156\\-93.28409\\161\\-12.69531\\-93.89638\\161\\-10.74219\\-94.35883\\161\\-8.789063\\-95.22683\\161\\-4.882813\\-96.56398\\161\\-2.929688\\-97.49805\\161\\-0.9765625\\-97.98943\\161\\0.9765625\\-98.3805\\161\\2.929688\\-98.57324\\161\\4.882813\\-98.44783\\161\\8.789063\\-97.6925\\161\\10.74219\\-97.00214\\161\\12.69531\\-96.06891\\161\\14.64844\\-95.51221\\161\\16.66667\\-94.78906\\161\\18.55469\\-94.215\\161\\20.50781\\-93.93382\\161\\26.36719\\-93.20564\\161\\30.27344\\-92.54297\\161\\34.17969\\-92.15073\\161\\41.99219\\-91.71607\\161\\47.85156\\-91.51304\\161\\51.75781\\-91.49033\\161\\55.66406\\-91.5686\\161\\61.52344\\-91.89355\\161\\63.47656\\-91.94205\\161\\67.38281\\-92.34476\\161\\69.33594\\-92.67435\\161\\73.24219\\-93.45173\\161\\77.14844\\-94.02132\\161\\79.10156\\-94.50484\\161\\81.05469\\-95.32232\\161\\83.00781\\-95.86987\\161\\84.96094\\-96.5399\\161\\86.91406\\-97.53326\\161\\88.86719\\-98.29858\\161\\90.82031\\-99.43848\\161\\92.77344\\-100.1805\\161\\94.72656\\-101.3982\\161\\96.67969\\-102.3574\\161\\98.63281\\-103.7185\\161\\100.5859\\-105.2408\\161\\104.4922\\-107.8764\\161\\106.4453\\-109.5864\\161\\109.3959\\-112.3672\\161\\112.3047\\-115.4791\\161\\114.574\\-118.2266\\161\\116.2109\\-120.7245\\161\\117.0524\\-122.1328\\161\\117.8315\\-124.0859\\161\\118.9761\\-126.0391\\161\\119.8215\\-127.9922\\161\\120.883\\-129.9453\\161\\121.5759\\-131.8984\\161\\122.5424\\-133.8516\\161\\123.4464\\-137.7578\\161\\124.2084\\-139.7109\\161\\124.749\\-141.6641\\161\\125.4642\\-145.5703\\161\\126.112\\-147.5234\\161\\126.5462\\-149.4766\\161\\127.1006\\-153.3828\\161\\127.7274\\-157.2891\\161\\128.0913\\-159.2422\\161\\128.5052\\-163.1484\\161\\128.7996\\-169.0078\\161\\128.8557\\-172.9141\\161\\128.9177\\-184.6328\\161\\128.9006\\-190.4922\\161\\128.7884\\-202.2109\\161\\128.575\\-210.0234\\161\\128.3216\\-213.9297\\161\\128.0651\\-215.8828\\161\\127.6652\\-217.8359\\161\\126.6937\\-223.6953\\161\\126.2004\\-225.6484\\161\\125.4261\\-227.6016\\161\\124.5212\\-231.5078\\161\\123.6233\\-233.4609\\161\\122.5716\\-237.3672\\161\\121.5371\\-239.3203\\161\\120.7555\\-241.2734\\161\\119.4681\\-243.2266\\161\\118.5245\\-245.1797\\161\\117.2577\\-247.1328\\161\\116.2358\\-249.0859\\161\\114.9918\\-251.0391\\161\\112.0644\\-254.9453\\161\\110.7942\\-256.8984\\161\\109.3179\\-258.8516\\161\\107.6981\\-260.8047\\161\\104.1059\\-264.7109\\161\\102.5472\\-266.6641\\161\\100.5859\\-268.5772\\161\\98.63281\\-270.3281\\161\\96.44501\\-272.5234\\161\\94.72656\\-274.1298\\161\\90.82031\\-277.38\\161\\88.86719\\-279.0682\\161\\86.91406\\-280.6119\\161\\84.96094\\-281.8737\\161\\81.05469\\-284.6795\\161\\79.10156\\-285.9073\\161\\75.19531\\-288.56\\161\\73.24219\\-289.3537\\161\\71.28906\\-290.5745\\161\\69.33594\\-291.4094\\161\\67.38281\\-292.6552\\161\\65.42969\\-293.41\\161\\63.47656\\-294.4929\\161\\59.57031\\-295.7448\\161\\57.61719\\-296.6675\\161\\55.66406\\-297.1942\\161\\53.71094\\-298.0897\\161\\51.75781\\-298.7827\\161\\49.80469\\-299.3637\\161\\47.85156\\-300.1992\\161\\45.89844\\-300.6631\\161\\41.99219\\-301.4506\\161\\40.03906\\-302.088\\161\\38.08594\\-302.51\\161\\34.17969\\-302.9955\\161\\32.22656\\-303.3203\\161\\28.32031\\-304.2954\\161\\26.36719\\-304.54\\161\\20.50781\\-305.1176\\161\\14.64844\\-305.8073\\161\\10.74219\\-306.1425\\161\\4.882813\\-306.2838\\161\\0.9765625\\-306.2759\\161\\-4.882813\\-306.1795\\161\\-8.789063\\-305.9503\\161" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "242" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "207" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-12.69531\\-305.8351\\163\\-18.55469\\-305.0737\\163\\-24.41406\\-304.4695\\163\\-26.36719\\-304.1505\\163\\-30.27344\\-303.1638\\163\\-34.17969\\-302.6648\\163\\-36.13281\\-302.3477\\163\\-40.03906\\-301.2539\\163\\-43.94531\\-300.465\\163\\-47.85156\\-299.0517\\163\\-49.80469\\-298.4934\\163\\-51.75781\\-297.5354\\163\\-55.66406\\-296.2266\\163\\-57.61719\\-295.2824\\163\\-59.57031\\-294.8236\\163\\-61.42849\\-294.0078\\163\\-63.47656\\-292.9937\\163\\-65.42969\\-291.9152\\163\\-68.92825\\-290.1016\\163\\-69.33594\\-289.7905\\163\\-71.28906\\-288.9508\\163\\-73.24219\\-287.7455\\163\\-75.19531\\-286.723\\163\\-78.55631\\-284.2422\\163\\-79.10156\\-283.7814\\163\\-81.05469\\-282.7146\\163\\-83.00781\\-281.2547\\163\\-86.91406\\-277.9543\\163\\-88.86719\\-276.5313\\163\\-90.82031\\-274.9279\\163\\-92.77344\\-273.1723\\163\\-94.72656\\-271.2646\\163\\-95.57846\\-270.5703\\163\\-98.63281\\-267.614\\163\\-99.46903\\-266.6641\\163\\-101.408\\-264.7109\\163\\-104.4922\\-261.3705\\163\\-108.3984\\-256.7418\\163\\-110.3516\\-254.2107\\163\\-111.1861\\-252.9922\\163\\-112.7104\\-251.0391\\163\\-114.2578\\-248.8188\\163\\-116.6395\\-245.1797\\163\\-117.4721\\-243.2266\\163\\-118.7356\\-241.2734\\163\\-119.6106\\-239.3203\\163\\-120.851\\-237.3672\\163\\-121.6328\\-235.4141\\163\\-122.6488\\-233.4609\\163\\-123.7147\\-229.5547\\163\\-124.6129\\-227.6016\\163\\-125.0571\\-225.6484\\163\\-125.6161\\-223.6953\\163\\-126.4205\\-221.7422\\163\\-127.2694\\-217.8359\\163\\-128.3967\\-213.9297\\163\\-129.5321\\-206.1172\\163\\-130.3206\\-202.2109\\163\\-130.7109\\-198.3047\\163\\-130.9828\\-192.4453\\163\\-131.2219\\-184.6328\\163\\-131.2182\\-180.7266\\163\\-131.1529\\-176.8203\\163\\-130.8048\\-169.0078\\163\\-130.5359\\-165.1016\\163\\-130.2994\\-163.1484\\163\\-129.5321\\-159.2422\\163\\-128.7463\\-153.3828\\163\\-128.4149\\-151.4297\\163\\-127.1839\\-147.5234\\163\\-126.709\\-145.5703\\163\\-126.0287\\-143.6172\\163\\-125.2497\\-141.6641\\163\\-124.7656\\-139.7109\\163\\-123.9219\\-137.7578\\163\\-123.1995\\-135.8047\\163\\-122.6107\\-133.8516\\163\\-121.4905\\-131.8984\\163\\-120.6284\\-129.9453\\163\\-119.2809\\-127.9922\\163\\-118.0745\\-126.0391\\163\\-117.0382\\-124.0859\\163\\-115.6424\\-122.1328\\163\\-114.3451\\-120.1797\\163\\-112.8094\\-118.2266\\163\\-111.1624\\-116.2734\\163\\-110.3516\\-115.1945\\163\\-107.7584\\-112.3672\\163\\-104.4922\\-109.1319\\163\\-102.5391\\-107.4973\\163\\-100.5859\\-105.9975\\163\\-98.63281\\-104.8989\\163\\-96.67969\\-103.5724\\163\\-94.72656\\-102.3978\\163\\-92.77344\\-101.6016\\163\\-90.82031\\-100.9181\\163\\-88.86719\\-100.046\\163\\-84.96094\\-99.16065\\163\\-83.00781\\-98.3805\\163\\-81.05469\\-97.95056\\163\\-77.14844\\-97.23047\\163\\-75.19531\\-96.67561\\163\\-73.24219\\-96.23946\\163\\-65.42969\\-95.2513\\163\\-61.52344\\-94.5521\\163\\-59.57031\\-94.27474\\163\\-53.71094\\-93.84801\\163\\-43.94531\\-93.43643\\163\\-38.08594\\-93.12399\\163\\-34.17969\\-92.86015\\163\\-28.32031\\-92.81322\\163\\-26.36719\\-92.87563\\163\\-20.50781\\-93.21418\\163\\-16.60156\\-93.55454\\163\\-12.69531\\-94.0942\\163\\-10.74219\\-94.7038\\163\\-8.789063\\-95.50767\\163\\-6.835938\\-96.09309\\163\\-4.882813\\-97.0495\\163\\-2.929688\\-97.75965\\163\\0.9765625\\-98.90825\\163\\2.929688\\-99.10332\\163\\4.882813\\-98.98336\\163\\8.789063\\-97.94697\\163\\10.74219\\-97.3473\\163\\12.69531\\-96.36352\\163\\14.64844\\-95.74839\\163\\16.60156\\-95.26751\\163\\18.55469\\-94.58466\\163\\20.50781\\-94.17057\\163\\22.46094\\-93.92034\\163\\30.27344\\-93.16615\\163\\34.17969\\-92.56541\\163\\36.13281\\-92.36837\\163\\40.03906\\-92.08598\\163\\47.85156\\-91.81262\\163\\51.75781\\-91.77012\\163\\55.66406\\-91.83395\\163\\63.47656\\-92.21202\\163\\65.42969\\-92.3866\\163\\67.38281\\-92.67435\\163\\69.33594\\-93.08912\\163\\71.28906\\-93.39124\\163\\75.19531\\-93.87169\\163\\77.14844\\-94.18761\\163\\81.05469\\-95.52148\\163\\83.00781\\-96.02232\\163\\84.80748\\-96.74219\\163\\88.86719\\-98.52093\\163\\90.82031\\-99.5694\\163\\92.77344\\-100.3496\\163\\96.67969\\-102.5773\\163\\98.63281\\-103.8894\\163\\100.5859\\-105.4026\\163\\104.4922\\-108.0836\\163\\106.4453\\-109.8052\\163\\109.1588\\-112.3672\\163\\112.3047\\-115.7334\\163\\114.3444\\-118.2266\\163\\116.9934\\-122.1328\\163\\117.7338\\-124.0859\\163\\118.914\\-126.0391\\163\\119.7305\\-127.9922\\163\\120.8288\\-129.9453\\163\\121.5338\\-131.8984\\163\\122.5094\\-133.8516\\163\\123.4554\\-137.7578\\163\\124.2217\\-139.7109\\163\\124.7734\\-141.6641\\163\\125.5321\\-145.5703\\163\\126.224\\-147.5234\\163\\126.6121\\-149.4766\\163\\127.1684\\-153.3828\\163\\128.1772\\-159.2422\\163\\128.5558\\-163.1484\\163\\128.8333\\-169.0078\\163\\128.9288\\-174.8672\\163\\128.9818\\-180.7266\\163\\128.964\\-188.5391\\163\\128.8159\\-202.2109\\163\\128.6053\\-210.0234\\163\\128.3535\\-213.9297\\163\\128.1167\\-215.8828\\163\\127.3775\\-219.7891\\163\\126.7488\\-223.6953\\163\\126.3231\\-225.6484\\163\\125.5517\\-227.6016\\163\\124.6491\\-231.5078\\163\\123.7958\\-233.4609\\163\\122.6814\\-237.3672\\163\\121.7017\\-239.3203\\163\\120.8826\\-241.2734\\163\\119.6226\\-243.2266\\163\\118.6796\\-245.1797\\163\\117.3602\\-247.1328\\163\\116.4186\\-249.0859\\163\\115.116\\-251.0391\\163\\113.6407\\-252.9922\\163\\110.9416\\-256.8984\\163\\107.8566\\-260.8047\\163\\104.355\\-264.7109\\163\\102.8343\\-266.6641\\163\\100.5859\\-268.9526\\163\\98.74321\\-270.5703\\163\\96.86379\\-272.5234\\163\\94.69866\\-274.4766\\163\\92.77344\\-275.9205\\163\\88.86719\\-279.3051\\163\\86.91406\\-280.893\\163\\83.00781\\-283.4699\\163\\82.0625\\-284.2422\\163\\79.10156\\-286.3681\\163\\77.14844\\-287.4995\\163\\75.19531\\-288.8058\\163\\73.24219\\-289.5612\\163\\71.28906\\-290.8256\\163\\69.33594\\-291.705\\163\\67.38281\\-292.8702\\163\\65.42969\\-293.6913\\163\\63.47656\\-294.7097\\163\\61.52344\\-295.2224\\163\\59.57031\\-296.1048\\163\\57.61719\\-296.8393\\163\\55.66406\\-297.4166\\163\\53.71094\\-298.4023\\163\\51.75781\\-298.9789\\163\\47.85156\\-300.4176\\163\\43.94531\\-301.1925\\163\\40.03906\\-302.3152\\163\\38.08594\\-302.6648\\163\\34.17969\\-303.1638\\163\\32.22656\\-303.6181\\163\\30.27344\\-304.1702\\163\\28.32031\\-304.4796\\163\\20.50781\\-305.3755\\163\\16.60156\\-305.926\\163\\12.69531\\-306.2234\\163\\8.789063\\-306.3616\\163\\4.882813\\-306.4144\\163\\0.9765625\\-306.4144\\163\\-4.882813\\-306.3288\\163\\-8.789063\\-306.1704\\163" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "242" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "208" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-305.926\\165\\-18.55469\\-305.3223\\165\\-26.36719\\-304.3944\\165\\-28.32031\\-304.0325\\165\\-30.27344\\-303.4165\\165\\-32.22656\\-303.034\\165\\-36.13281\\-302.5377\\165\\-38.08594\\-302.1169\\165\\-40.03906\\-301.4877\\165\\-43.94531\\-300.6427\\165\\-45.89844\\-300.1216\\165\\-47.85156\\-299.287\\165\\-49.80469\\-298.7168\\165\\-53.71094\\-297.0994\\165\\-55.66406\\-296.4839\\165\\-57.61719\\-295.5075\\165\\-59.57031\\-294.9844\\165\\-61.52344\\-294.3401\\165\\-63.47656\\-293.2232\\165\\-65.42969\\-292.3557\\165\\-67.38281\\-291.1617\\165\\-69.33594\\-290.238\\165\\-75.19531\\-286.9823\\165\\-77.14844\\-285.5255\\165\\-79.10156\\-284.1696\\165\\-81.05469\\-282.9795\\165\\-84.51087\\-280.3359\\165\\-88.86719\\-276.8511\\165\\-92.77344\\-273.4631\\165\\-94.72656\\-271.5891\\165\\-95.89705\\-270.5703\\165\\-98.63281\\-267.91\\165\\-101.7464\\-264.7109\\165\\-104.4922\\-261.7431\\165\\-105.2291\\-260.8047\\165\\-108.6983\\-256.8984\\165\\-110.3516\\-254.6413\\165\\-111.3921\\-252.9922\\165\\-112.9908\\-251.0391\\165\\-114.4546\\-249.0859\\165\\-115.5831\\-247.1328\\165\\-116.8855\\-245.1797\\165\\-117.7107\\-243.2266\\165\\-118.9506\\-241.2734\\165\\-119.9247\\-239.3203\\165\\-121.0133\\-237.3672\\165\\-122.7877\\-233.4609\\165\\-123.2652\\-231.5078\\165\\-123.9368\\-229.5547\\165\\-124.7352\\-227.6016\\165\\-125.1708\\-225.6484\\165\\-126.5754\\-221.7422\\165\\-127.4294\\-217.8359\\165\\-128.0382\\-215.8828\\165\\-128.5003\\-213.9297\\165\\-129.3275\\-208.0703\\165\\-129.6441\\-206.1172\\165\\-130.0974\\-204.1641\\165\\-130.3971\\-202.2109\\165\\-130.7589\\-198.3047\\165\\-131.0911\\-190.4922\\165\\-131.2176\\-186.5859\\165\\-131.2788\\-182.6797\\165\\-131.1983\\-176.8203\\165\\-130.8214\\-169.0078\\165\\-130.5603\\-165.1016\\165\\-130.2965\\-163.1484\\165\\-129.5296\\-159.2422\\165\\-128.7052\\-153.3828\\165\\-128.3392\\-151.4297\\165\\-127.0875\\-147.5234\\165\\-126.6186\\-145.5703\\165\\-125.8102\\-143.6172\\165\\-125.1341\\-141.6641\\165\\-124.6491\\-139.7109\\165\\-123.7027\\-137.7578\\165\\-122.4486\\-133.8516\\165\\-121.297\\-131.8984\\165\\-120.3896\\-129.9453\\165\\-118.1641\\-126.4625\\165\\-117.8096\\-126.0391\\165\\-116.8984\\-124.0859\\165\\-114.2578\\-120.3348\\165\\-112.6718\\-118.2266\\165\\-110.3516\\-115.3584\\165\\-107.6497\\-112.3672\\165\\-104.4922\\-109.2016\\165\\-102.5391\\-107.549\\165\\-100.5859\\-106.1105\\165\\-98.63281\\-105.0364\\165\\-96.67969\\-103.6735\\165\\-94.72656\\-102.5788\\165\\-92.77344\\-101.7122\\165\\-90.82031\\-101.0923\\165\\-88.86719\\-100.2045\\165\\-84.96094\\-99.35628\\165\\-81.05469\\-98.11045\\165\\-77.14844\\-97.43121\\165\\-75.19531\\-97.00668\\165\\-73.24219\\-96.44922\\165\\-69.33594\\-95.89548\\165\\-63.47656\\-95.19707\\165\\-59.57031\\-94.52338\\165\\-57.61719\\-94.28776\\165\\-53.71094\\-93.98732\\165\\-49.80469\\-93.8008\\165\\-38.08594\\-93.43643\\165\\-34.17969\\-93.24962\\165\\-26.36719\\-93.21418\\165\\-22.46094\\-93.36328\\165\\-18.55469\\-93.59414\\165\\-14.64844\\-93.97729\\165\\-12.69531\\-94.33782\\165\\-10.74219\\-95.10751\\165\\-6.835938\\-96.36062\\165\\-4.882813\\-97.39516\\165\\-2.929688\\-98.01066\\165\\-0.9765625\\-98.76677\\165\\0.9765625\\-99.29108\\165\\2.929688\\-99.42192\\165\\4.882813\\-99.32827\\165\\6.835938\\-98.97331\\165\\8.789063\\-98.24233\\165\\10.74219\\-97.63737\\165\\14.64844\\-96.00549\\165\\18.55469\\-95.10983\\165\\20.50781\\-94.51942\\165\\22.46094\\-94.16994\\165\\24.41406\\-93.93909\\165\\30.27344\\-93.52493\\165\\34.17969\\-93.16378\\165\\36.13281\\-92.89152\\165\\40.03906\\-92.48717\\165\\47.85156\\-92.11835\\165\\51.75781\\-92.06216\\165\\55.66406\\-92.10883\\165\\63.47656\\-92.51041\\165\\65.42969\\-92.71387\\165\\67.38281\\-93.06528\\165\\71.28906\\-93.58945\\165\\75.19531\\-94.00171\\165\\77.14844\\-94.4167\\165\\79.10156\\-95.15614\\165\\83.00781\\-96.18666\\165\\84.96094\\-97.08567\\165\\86.91406\\-97.83745\\165\\88.86719\\-98.79769\\165\\92.77344\\-100.5452\\165\\96.37841\\-102.6016\\165\\98.63281\\-104.0369\\165\\100.5859\\-105.5759\\165\\104.4922\\-108.2915\\165\\106.4453\\-110.0012\\165\\108.9254\\-112.3672\\165\\112.5865\\-116.2734\\165\\115.5981\\-120.1797\\165\\116.9194\\-122.1328\\165\\117.6892\\-124.0859\\165\\118.8687\\-126.0391\\165\\119.6699\\-127.9922\\165\\120.8147\\-129.9453\\165\\121.5251\\-131.8984\\165\\122.5124\\-133.8516\\165\\123.4773\\-137.7578\\165\\124.2853\\-139.7109\\165\\124.8162\\-141.6641\\165\\125.1795\\-143.6172\\165\\125.6622\\-145.5703\\165\\126.3536\\-147.5234\\165\\126.7053\\-149.4766\\165\\127.2805\\-153.3828\\165\\128.0244\\-157.2891\\165\\128.2807\\-159.2422\\165\\128.6394\\-163.1484\\165\\128.964\\-170.9609\\165\\129.072\\-178.7734\\165\\129.0483\\-188.5391\\165\\128.8837\\-202.2109\\165\\128.7884\\-206.1172\\165\\128.575\\-211.9766\\165\\128.2246\\-215.8828\\165\\127.4785\\-219.7891\\165\\126.4562\\-225.6484\\165\\125.7084\\-227.6016\\165\\125.1601\\-229.5547\\165\\124.7614\\-231.5078\\165\\123.2774\\-235.4141\\165\\122.7766\\-237.3672\\165\\120.9893\\-241.2734\\165\\119.7984\\-243.2266\\165\\118.798\\-245.1797\\165\\117.47\\-247.1328\\165\\116.5654\\-249.0859\\165\\113.7888\\-252.9922\\165\\112.5041\\-254.9453\\165\\111.084\\-256.8984\\165\\108.3984\\-260.3753\\165\\104.4922\\-264.8924\\165\\103.0415\\-266.6641\\165\\101.1691\\-268.6172\\165\\99.05243\\-270.5703\\165\\96.67969\\-272.9976\\165\\94.72656\\-274.7971\\165\\92.77344\\-276.1779\\165\\90.82031\\-277.808\\165\\88.86719\\-279.556\\165\\86.91406\\-281.1487\\165\\84.96094\\-282.5256\\165\\83.00781\\-283.7366\\165\\82.4375\\-284.2422\\165\\79.69962\\-286.1953\\165\\79.10156\\-286.7062\\165\\77.14844\\-287.7992\\165\\75.19531\\-288.9899\\165\\73.24219\\-289.8574\\165\\72.92624\\-290.1016\\165\\69.4423\\-292.0547\\165\\65.42969\\-294.0472\\165\\63.47656\\-294.8831\\165\\61.52344\\-295.4148\\165\\59.57031\\-296.4232\\165\\57.61719\\-297.008\\165\\55.66406\\-297.7332\\165\\53.71094\\-298.6267\\165\\51.75781\\-299.1847\\165\\49.80469\\-300.0036\\165\\47.85156\\-300.5925\\165\\43.94531\\-301.396\\165\\41.99219\\-302.0479\\165\\40.03906\\-302.5222\\165\\36.13281\\-303.0201\\165\\34.17969\\-303.3948\\165\\32.22656\\-304.0092\\165\\30.27344\\-304.3911\\165\\24.41406\\-305.0992\\165\\18.55469\\-306.0084\\165\\16.60156\\-306.1795\\165\\12.69531\\-306.3864\\165\\8.789063\\-306.5068\\165\\2.929688\\-306.5882\\165\\-4.882813\\-306.4774\\165\\-8.789063\\-306.347\\165" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "229" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "209" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-305.9971\\167\\-22.46094\\-305.0737\\167\\-28.32031\\-304.3147\\167\\-32.22656\\-303.2757\\167\\-38.08594\\-302.383\\167\\-41.99219\\-301.2267\\167\\-45.89844\\-300.386\\167\\-47.85156\\-299.5911\\167\\-51.75781\\-298.3256\\167\\-53.71094\\-297.3163\\167\\-55.66406\\-296.7322\\167\\-59.57031\\-295.1664\\167\\-61.52344\\-294.5987\\167\\-63.47656\\-293.4882\\167\\-65.42969\\-292.6687\\167\\-67.38281\\-291.4131\\167\\-69.33594\\-290.5657\\167\\-71.28906\\-289.3266\\167\\-73.24219\\-288.4618\\167\\-75.19531\\-287.2126\\167\\-79.10156\\-284.584\\167\\-82.33696\\-282.2891\\167\\-84.96094\\-280.3612\\167\\-89.72749\\-276.4297\\167\\-92.77344\\-273.7394\\167\\-94.72656\\-271.8789\\167\\-96.2136\\-270.5703\\167\\-98.63281\\-268.2049\\167\\-102.0542\\-264.7109\\167\\-104.4922\\-262.0888\\167\\-105.5376\\-260.8047\\167\\-109.0062\\-256.8984\\167\\-110.4865\\-254.9453\\167\\-111.6815\\-252.9922\\167\\-114.7852\\-249.0859\\167\\-115.8642\\-247.1328\\167\\-117.0959\\-245.1797\\167\\-118.0591\\-243.2266\\167\\-120.1172\\-239.6059\\167\\-122.198\\-235.4141\\167\\-122.9337\\-233.4609\\167\\-123.4083\\-231.5078\\167\\-124.2477\\-229.5547\\167\\-124.8582\\-227.6016\\167\\-125.3274\\-225.6484\\167\\-126.1509\\-223.6953\\167\\-126.7384\\-221.7422\\167\\-127.1495\\-219.7891\\167\\-128.2508\\-215.8828\\167\\-128.6248\\-213.9297\\167\\-129.448\\-208.0703\\167\\-130.2411\\-204.1641\\167\\-130.511\\-202.2109\\167\\-130.8157\\-198.3047\\167\\-131.0801\\-192.4453\\167\\-131.2994\\-186.5859\\167\\-131.373\\-182.6797\\167\\-131.2702\\-176.8203\\167\\-130.7527\\-167.0547\\167\\-130.3645\\-163.1484\\167\\-129.5785\\-159.2422\\167\\-128.6723\\-153.3828\\167\\-128.2854\\-151.4297\\167\\-127.5954\\-149.4766\\167\\-126.5592\\-145.5703\\167\\-125.6966\\-143.6172\\167\\-125.0633\\-141.6641\\167\\-124.5488\\-139.7109\\167\\-123.5722\\-137.7578\\167\\-123.0229\\-135.8047\\167\\-122.2832\\-133.8516\\167\\-122.0703\\-133.5596\\167\\-120.1399\\-129.9453\\167\\-118.1641\\-126.6581\\167\\-117.6723\\-126.0391\\167\\-116.7889\\-124.0859\\167\\-114.2578\\-120.4549\\167\\-112.6112\\-118.2266\\167\\-110.3516\\-115.4219\\167\\-107.6054\\-112.3672\\167\\-104.4922\\-109.2487\\167\\-102.5391\\-107.5951\\167\\-100.5859\\-106.1917\\167\\-98.63281\\-105.1369\\167\\-96.67969\\-103.7609\\167\\-92.77344\\-101.8238\\167\\-90.82031\\-101.2279\\167\\-88.86719\\-100.3914\\167\\-86.91406\\-99.84731\\167\\-84.96094\\-99.50253\\167\\-83.00781\\-99.00921\\167\\-81.05469\\-98.29858\\167\\-79.10156\\-97.9031\\167\\-75.19531\\-97.24526\\167\\-71.28906\\-96.32366\\167\\-69.33594\\-96.06074\\167\\-63.47656\\-95.41772\\167\\-61.52344\\-95.16467\\167\\-57.61719\\-94.52338\\167\\-53.71094\\-94.14428\\167\\-49.80469\\-93.93233\\167\\-45.89844\\-93.78911\\167\\-40.03906\\-93.64117\\167\\-32.22656\\-93.48083\\167\\-26.36719\\-93.47227\\167\\-22.46094\\-93.57446\\167\\-16.60156\\-93.93909\\167\\-14.64844\\-94.1827\\167\\-12.69531\\-94.65936\\167\\-10.74219\\-95.38377\\167\\-8.789063\\-95.94218\\167\\-4.882813\\-97.64899\\167\\-2.929688\\-98.30837\\167\\-0.9765625\\-99.18359\\167\\0.9765625\\-99.52511\\167\\2.929688\\-99.62194\\167\\4.882813\\-99.55402\\167\\6.835938\\-99.32007\\167\\8.69864\\-98.69531\\167\\12.69531\\-97.23047\\167\\14.64844\\-96.29099\\167\\18.55469\\-95.43396\\167\\22.46094\\-94.46829\\167\\24.41406\\-94.14859\\167\\28.32031\\-93.83015\\167\\34.17969\\-93.51712\\167\\40.03906\\-93.08912\\167\\43.94531\\-92.72743\\167\\47.85156\\-92.52113\\167\\53.71094\\-92.40125\\167\\55.66406\\-92.45891\\167\\61.52344\\-92.84401\\167\\63.47656\\-92.92257\\167\\75.19531\\-94.17871\\167\\79.10156\\-95.37881\\167\\83.00781\\-96.36805\\167\\84.96094\\-97.2709\\167\\86.91406\\-97.99461\\167\\88.86719\\-99.02791\\167\\90.82031\\-99.79319\\167\\94.72656\\-101.741\\167\\98.63281\\-104.2104\\167\\100.5859\\-105.719\\167\\104.4245\\-108.4609\\167\\106.4453\\-110.1753\\167\\108.7815\\-112.3672\\167\\110.6721\\-114.3203\\167\\112.4401\\-116.2734\\167\\115.5313\\-120.1797\\167\\116.8771\\-122.1328\\167\\117.6463\\-124.0859\\167\\118.8576\\-126.0391\\167\\119.6699\\-127.9922\\167\\120.8354\\-129.9453\\167\\121.5579\\-131.8984\\167\\122.5488\\-133.8516\\167\\123.5221\\-137.7578\\167\\124.3804\\-139.7109\\167\\124.8805\\-141.6641\\167\\125.2688\\-143.6172\\167\\126.4902\\-147.5234\\167\\127.4444\\-153.3828\\167\\128.1906\\-157.2891\\167\\128.4089\\-159.2422\\167\\128.7323\\-163.1484\\167\\129.067\\-170.9609\\167\\129.1765\\-176.8203\\167\\129.1931\\-182.6797\\167\\129.0909\\-194.3984\\167\\128.9764\\-200.2578\\167\\128.9756\\-202.2109\\167\\128.8159\\-208.0703\\167\\128.6466\\-211.9766\\167\\128.3438\\-215.8828\\167\\128.0651\\-217.8359\\167\\127.2337\\-221.7422\\167\\126.5679\\-225.6484\\167\\125.275\\-229.5547\\167\\124.8613\\-231.5078\\167\\124.2348\\-233.4609\\167\\123.3621\\-235.4141\\167\\122.8721\\-237.3672\\167\\122.0703\\-239.2772\\167\\121.0938\\-241.2734\\167\\118.9006\\-245.1797\\167\\117.5705\\-247.1328\\167\\116.6922\\-249.0859\\167\\116.2109\\-249.7099\\167\\112.6661\\-254.9453\\167\\109.6765\\-258.8516\\167\\108.3984\\-260.6313\\167\\103.2146\\-266.6641\\167\\101.3849\\-268.6172\\167\\99.30463\\-270.5703\\167\\96.67969\\-273.2542\\167\\94.72656\\-275.0707\\167\\90.82031\\-278.1387\\167\\88.27311\\-280.3359\\167\\84.96094\\-282.8559\\167\\81.05469\\-285.4835\\167\\79.10156\\-286.9635\\167\\77.14844\\-288.1567\\167\\75.19531\\-289.1548\\167\\73.24219\\-290.2546\\167\\71.28906\\-291.2279\\167\\69.33594\\-292.4854\\167\\67.38281\\-293.295\\167\\65.42969\\-294.3834\\167\\61.52344\\-295.7059\\167\\59.57031\\-296.6527\\167\\57.61719\\-297.193\\167\\55.66406\\-298.1378\\167\\51.75781\\-299.4352\\167\\49.80469\\-300.2667\\167\\47.85156\\-300.7534\\167\\45.89844\\-301.1423\\167\\41.99219\\-302.3053\\167\\40.03906\\-302.6648\\167\\36.13281\\-303.2008\\167\\32.22656\\-304.2703\\167\\24.41406\\-305.3447\\167\\20.50781\\-306.0414\\167\\16.60156\\-306.3509\\167\\10.74219\\-306.6196\\167\\6.835938\\-306.7031\\167\\0.9765625\\-306.7463\\167\\-4.882813\\-306.6447\\167\\-8.789063\\-306.5089\\167\\-14.64844\\-306.1885\\167" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "230" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "210" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-305.7932\\169\\-22.46094\\-305.3708\\169\\-24.41406\\-305.0522\\169\\-30.27344\\-304.2264\\169\\-34.17969\\-303.1601\\169\\-38.08594\\-302.5956\\169\\-40.03906\\-302.1646\\169\\-41.99219\\-301.4901\\169\\-45.89844\\-300.5938\\169\\-47.85156\\-300.0046\\169\\-49.80469\\-299.1555\\169\\-51.75781\\-298.5885\\169\\-53.71094\\-297.6301\\169\\-57.61719\\-296.3229\\169\\-59.57031\\-295.3634\\169\\-61.52344\\-294.7998\\169\\-65.42969\\-292.9112\\169\\-67.38281\\-291.7336\\169\\-69.33594\\-290.8014\\169\\-71.28906\\-289.5464\\169\\-73.24219\\-288.7449\\169\\-75.19531\\-287.4343\\169\\-77.14844\\-286.293\\169\\-79.10156\\-284.8994\\169\\-81.05469\\-283.3892\\169\\-82.76139\\-282.2891\\169\\-84.96094\\-280.7104\\169\\-88.86719\\-277.3513\\169\\-90.04688\\-276.4297\\169\\-92.77344\\-274.0358\\169\\-96.5721\\-270.5703\\169\\-100.6381\\-266.6641\\169\\-104.1613\\-262.7578\\169\\-107.6109\\-258.8516\\169\\-109.2773\\-256.8984\\169\\-110.8156\\-254.9453\\169\\-112.0438\\-252.9922\\169\\-115.0551\\-249.0859\\169\\-116.2516\\-247.1328\\169\\-117.2858\\-245.1797\\169\\-118.461\\-243.2266\\169\\-119.3777\\-241.2734\\169\\-120.6493\\-239.3203\\169\\-121.4173\\-237.3672\\169\\-122.4811\\-235.4141\\169\\-123.5932\\-231.5078\\169\\-124.499\\-229.5547\\169\\-125.5489\\-225.6484\\169\\-126.4232\\-223.6953\\169\\-127.3508\\-219.7891\\169\\-127.9823\\-217.8359\\169\\-128.4574\\-215.8828\\169\\-129.302\\-210.0234\\169\\-130.4102\\-204.1641\\169\\-130.6299\\-202.2109\\169\\-130.9996\\-196.3516\\169\\-131.4285\\-186.5859\\169\\-131.4838\\-180.7266\\169\\-131.376\\-176.8203\\169\\-130.7932\\-167.0547\\169\\-130.4599\\-163.1484\\169\\-130.0974\\-161.1953\\169\\-129.6296\\-159.2422\\169\\-128.684\\-153.3828\\169\\-128.2854\\-151.4297\\169\\-127.5823\\-149.4766\\169\\-126.5241\\-145.5703\\169\\-125.6378\\-143.6172\\169\\-124.4796\\-139.7109\\169\\-123.4961\\-137.7578\\169\\-122.9806\\-135.8047\\169\\-122.1556\\-133.8516\\169\\-118.8992\\-127.9922\\169\\-117.5916\\-126.0391\\169\\-116.7295\\-124.0859\\169\\-114.2578\\-120.4904\\169\\-112.5969\\-118.2266\\169\\-110.3516\\-115.4375\\169\\-107.5868\\-112.3672\\169\\-104.4922\\-109.2617\\169\\-102.5391\\-107.6155\\169\\-100.5859\\-106.2421\\169\\-98.63281\\-105.2037\\169\\-96.67969\\-103.8324\\169\\-92.77344\\-101.9246\\169\\-90.82031\\-101.3433\\169\\-86.91406\\-99.95874\\169\\-83.00781\\-99.21825\\169\\-81.05469\\-98.54671\\169\\-79.10156\\-98.05659\\169\\-75.19531\\-97.43059\\169\\-73.24219\\-97.0612\\169\\-71.28906\\-96.55518\\169\\-69.33594\\-96.21416\\169\\-61.52344\\-95.37997\\169\\-55.66406\\-94.52338\\169\\-53.71094\\-94.34091\\169\\-49.80469\\-94.07827\\169\\-45.89844\\-93.91373\\169\\-40.03906\\-93.76019\\169\\-28.32031\\-93.65862\\169\\-22.46094\\-93.75891\\169\\-18.55469\\-93.95808\\169\\-16.60156\\-94.13176\\169\\-14.64844\\-94.44727\\169\\-10.74219\\-95.62856\\169\\-8.789063\\-96.16199\\169\\-6.835938\\-97.14469\\169\\-4.882813\\-97.87885\\169\\-2.929688\\-98.75089\\169\\-0.9765625\\-99.44966\\169\\0.9765625\\-99.71116\\169\\2.929688\\-99.78609\\169\\4.882813\\-99.73962\\169\\6.835938\\-99.54129\\169\\8.789063\\-99.10614\\169\\10.74219\\-98.1835\\169\\12.69531\\-97.50174\\169\\14.64844\\-96.61921\\169\\16.60156\\-96.01691\\169\\20.50781\\-95.30684\\169\\24.41406\\-94.39428\\169\\26.36719\\-94.15717\\169\\30.27344\\-93.85985\\169\\38.08594\\-93.54025\\169\\45.89844\\-93.14023\\169\\53.71094\\-92.81322\\169\\57.61719\\-93.11192\\169\\65.42969\\-93.39859\\169\\71.28906\\-93.88352\\169\\73.24219\\-94.08619\\169\\75.19531\\-94.42199\\169\\77.14844\\-95.05475\\169\\79.10156\\-95.56439\\169\\81.05469\\-95.95755\\169\\83.00781\\-96.55385\\169\\84.96094\\-97.41919\\169\\86.91406\\-98.15472\\169\\88.86719\\-99.19998\\169\\90.82031\\-99.90527\\169\\92.77344\\-100.9884\\169\\94.72656\\-101.8365\\169\\98.8023\\-104.5547\\169\\101.6195\\-106.5078\\169\\104.2434\\-108.4609\\169\\106.4453\\-110.3432\\169\\108.6604\\-112.3672\\169\\110.5781\\-114.3203\\169\\112.3047\\-116.2819\\169\\115.4801\\-120.1797\\169\\116.8555\\-122.1328\\169\\117.6367\\-124.0859\\169\\118.8687\\-126.0391\\169\\119.7097\\-127.9922\\169\\120.8704\\-129.9453\\169\\121.6162\\-131.8984\\169\\122.6071\\-133.8516\\169\\123.6205\\-137.7578\\169\\124.499\\-139.7109\\169\\125.3698\\-143.6172\\169\\126.0986\\-145.5703\\169\\126.6224\\-147.5234\\169\\127.2583\\-151.4297\\169\\128.0783\\-155.3359\\169\\128.3562\\-157.2891\\169\\128.703\\-161.1953\\169\\129.0415\\-167.0547\\169\\129.1844\\-170.9609\\169\\129.3147\\-176.8203\\169\\129.3367\\-182.6797\\169\\129.2091\\-194.3984\\169\\128.9987\\-206.1172\\169\\128.6167\\-213.9297\\169\\128.2246\\-217.8359\\169\\127.3658\\-221.7422\\169\\126.6807\\-225.6484\\169\\126.176\\-227.6016\\169\\125.4109\\-229.5547\\169\\124.4154\\-233.4609\\169\\123.4645\\-235.4141\\169\\122.951\\-237.3672\\169\\122.0703\\-239.522\\169\\120.1838\\-243.2266\\169\\118.1641\\-246.5299\\169\\117.6859\\-247.1328\\169\\116.7929\\-249.0859\\169\\112.8113\\-254.9453\\169\\109.8022\\-258.8516\\169\\108.4984\\-260.8047\\169\\104.4922\\-265.3594\\169\\103.3936\\-266.6641\\169\\101.5693\\-268.6172\\169\\99.50725\\-270.5703\\169\\96.67969\\-273.4661\\169\\94.72656\\-275.285\\169\\88.69538\\-280.3359\\169\\86.91406\\-281.6185\\169\\83.00781\\-284.5544\\169\\81.05469\\-285.8141\\169\\77.14844\\-288.4789\\169\\75.19531\\-289.3096\\169\\73.24219\\-290.5805\\169\\71.28906\\-291.4785\\169\\69.33594\\-292.7405\\169\\67.38281\\-293.5703\\169\\65.42969\\-294.6316\\169\\63.47656\\-295.2131\\169\\61.52344\\-296.1048\\169\\59.57031\\-296.8333\\169\\57.61719\\-297.4385\\169\\55.66406\\-298.439\\169\\53.71094\\-299.0279\\169\\49.80469\\-300.4731\\169\\45.89844\\-301.3354\\169\\43.94531\\-302.0067\\169\\41.99219\\-302.51\\169\\38.08594\\-303.0524\\169\\36.13281\\-303.4547\\169\\34.17969\\-304.0774\\169\\32.22656\\-304.4601\\169\\26.36719\\-305.2716\\169\\22.46094\\-306.0305\\169\\18.55469\\-306.39\\169\\12.69531\\-306.6979\\169\\6.835938\\-306.8838\\169\\0.9765625\\-306.9415\\169\\-2.929688\\-306.8791\\169\\-8.789063\\-306.6818\\169\\-14.64844\\-306.39\\169\\-18.55469\\-306.0731\\169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "234" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "211" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-305.8073\\171\\-24.41406\\-305.3627\\171\\-26.36719\\-305.0237\\171\\-30.27344\\-304.4804\\171\\-32.22656\\-304.099\\171\\-34.17969\\-303.4618\\171\\-36.13281\\-303.041\\171\\-40.03906\\-302.4354\\171\\-43.94531\\-301.2228\\171\\-47.85156\\-300.3213\\171\\-49.80469\\-299.4624\\171\\-53.71094\\-298.0768\\171\\-55.66406\\-297.1539\\171\\-57.61719\\-296.5981\\171\\-59.57031\\-295.6142\\171\\-61.52344\\-294.9784\\171\\-63.47656\\-294.2191\\171\\-67.53943\\-292.0547\\171\\-70.96041\\-290.1016\\171\\-71.28906\\-289.8387\\171\\-73.24219\\-288.9581\\171\\-75.19531\\-287.6869\\171\\-77.14844\\-286.6476\\171\\-81.05469\\-283.6358\\171\\-83.00781\\-282.4544\\171\\-84.96094\\-280.9758\\171\\-88.03923\\-278.3828\\171\\-88.86719\\-277.616\\171\\-92.77344\\-274.3913\\171\\-94.72656\\-272.7131\\171\\-97.00259\\-270.5703\\171\\-101.0322\\-266.6641\\171\\-102.8519\\-264.7109\\171\\-108.3984\\-258.3063\\171\\-110.3516\\-255.9135\\171\\-112.5194\\-252.9922\\171\\-115.29\\-249.0859\\171\\-116.6255\\-247.1328\\171\\-117.4855\\-245.1797\\171\\-118.7547\\-243.2266\\171\\-119.6709\\-241.2734\\171\\-120.8868\\-239.3203\\171\\-121.6942\\-237.3672\\171\\-122.7066\\-235.4141\\171\\-123.2337\\-233.4609\\171\\-123.9063\\-231.5078\\171\\-124.7218\\-229.5547\\171\\-125.1964\\-227.6016\\171\\-126.6473\\-223.6953\\171\\-127.6266\\-219.7891\\171\\-128.2747\\-217.8359\\171\\-128.6447\\-215.8828\\171\\-129.4936\\-210.0234\\171\\-130.3101\\-206.1172\\171\\-130.7465\\-202.2109\\171\\-131.1232\\-196.3516\\171\\-131.5402\\-188.5391\\171\\-131.6671\\-182.6797\\171\\-131.6683\\-180.7266\\171\\-131.5172\\-176.8203\\171\\-130.5481\\-163.1484\\171\\-130.213\\-161.1953\\171\\-129.739\\-159.2422\\171\\-129.0838\\-155.3359\\171\\-128.3518\\-151.4297\\171\\-127.6175\\-149.4766\\171\\-126.5191\\-145.5703\\171\\-125.6268\\-143.6172\\171\\-124.4596\\-139.7109\\171\\-123.4737\\-137.7578\\171\\-122.9565\\-135.8047\\171\\-122.0941\\-133.8516\\171\\-121.0455\\-131.8984\\171\\-119.873\\-129.9453\\171\\-118.8816\\-127.9922\\171\\-117.5781\\-126.0391\\171\\-116.7295\\-124.0859\\171\\-114.2578\\-120.4753\\171\\-112.5969\\-118.2266\\171\\-110.3516\\-115.4045\\171\\-107.6212\\-112.3672\\171\\-104.4922\\-109.254\\171\\-102.5391\\-107.6211\\171\\-100.5859\\-106.2949\\171\\-98.63281\\-105.2665\\171\\-96.67969\\-103.9173\\171\\-94.72656\\-103.042\\171\\-92.77344\\-102.0132\\171\\-88.86719\\-100.8087\\171\\-86.91406\\-100.0766\\171\\-83.00781\\-99.38295\\171\\-81.05469\\-98.86547\\171\\-79.10156\\-98.23056\\171\\-77.14844\\-97.87738\\171\\-73.24219\\-97.28791\\171\\-69.33594\\-96.4061\\171\\-67.38281\\-96.15515\\171\\-61.52344\\-95.57146\\171\\-57.61719\\-95.1398\\171\\-55.66406\\-94.82844\\171\\-51.75781\\-94.38895\\171\\-47.85156\\-94.14428\\171\\-41.99219\\-93.93087\\171\\-36.13281\\-93.84191\\171\\-28.32031\\-93.82434\\171\\-24.41406\\-93.86609\\171\\-20.50781\\-93.99447\\171\\-16.60156\\-94.37538\\171\\-14.73999\\-94.78906\\171\\-10.74219\\-95.8539\\171\\-8.789063\\-96.44725\\171\\-6.835938\\-97.45294\\171\\-4.882813\\-98.13979\\171\\-2.929688\\-99.1638\\171\\-0.9765625\\-99.64929\\171\\0.9765625\\-99.8922\\171\\2.929688\\-99.99532\\171\\4.882813\\-99.91903\\171\\6.835938\\-99.71756\\171\\8.789063\\-99.3606\\171\\12.69531\\-97.72991\\171\\16.60156\\-96.24469\\171\\18.55469\\-95.84558\\171\\22.46094\\-95.24983\\171\\26.36719\\-94.40266\\171\\30.27344\\-94.02882\\171\\41.99219\\-93.58307\\171\\43.94531\\-93.55209\\171\\53.71094\\-93.23885\\171\\57.61719\\-93.44019\\171\\61.52344\\-93.50507\\171\\65.42969\\-93.63277\\171\\71.28906\\-94.03361\\171\\73.24219\\-94.29082\\171\\75.19531\\-94.73438\\171\\77.14844\\-95.29037\\171\\81.05469\\-96.061\\171\\86.91406\\-98.29581\\171\\88.86719\\-99.31444\\171\\90.82031\\-99.9995\\171\\92.77344\\-101.1367\\171\\94.72656\\-101.9357\\171\\96.67969\\-103.3\\171\\100.5859\\-105.8745\\171\\104.4922\\-108.7743\\171\\108.557\\-112.3672\\171\\110.4899\\-114.3203\\171\\112.3047\\-116.3637\\171\\115.4413\\-120.1797\\171\\116.8555\\-122.1328\\171\\117.6658\\-124.0859\\171\\118.9047\\-126.0391\\171\\119.7962\\-127.9922\\171\\120.9284\\-129.9453\\171\\121.7206\\-131.8984\\171\\122.6854\\-133.8516\\171\\123.1682\\-135.8047\\171\\123.7538\\-137.7578\\171\\124.5961\\-139.7109\\171\\125.5101\\-143.6172\\171\\126.3021\\-145.5703\\171\\126.7608\\-147.5234\\171\\127.4505\\-151.4297\\171\\127.9297\\-153.4165\\171\\128.2935\\-155.3359\\171\\128.5121\\-157.2891\\171\\128.9525\\-163.1484\\171\\129.2677\\-169.0078\\171\\129.4011\\-172.9141\\171\\129.5157\\-178.7734\\171\\129.5183\\-182.6797\\171\\129.472\\-186.5859\\171\\129.1219\\-206.1172\\171\\128.7143\\-213.9297\\171\\128.3535\\-217.8359\\171\\128.0244\\-219.7891\\171\\127.5302\\-221.7422\\171\\126.7987\\-225.6484\\171\\126.3733\\-227.6016\\171\\125.5691\\-229.5547\\171\\124.5488\\-233.4609\\171\\123.5722\\-235.4141\\171\\123.029\\-237.3672\\171\\122.3424\\-239.3203\\171\\121.2748\\-241.2734\\171\\120.3545\\-243.2266\\171\\118.1641\\-246.6959\\171\\117.8032\\-247.1328\\171\\116.8729\\-249.0859\\171\\115.5286\\-251.0391\\171\\114.3392\\-252.9922\\171\\112.9338\\-254.9453\\171\\109.9121\\-258.8516\\171\\108.6972\\-260.8047\\171\\104.4922\\-265.5573\\171\\102.5391\\-267.8117\\171\\100.5859\\-269.6665\\171\\97.71767\\-272.5234\\171\\95.83144\\-274.4766\\171\\88.86719\\-280.5949\\171\\86.91406\\-281.8527\\171\\83.00781\\-284.8593\\171\\81.05469\\-286.2332\\171\\79.10156\\-287.4298\\171\\77.14844\\-288.7344\\171\\75.19531\\-289.5298\\171\\73.24219\\-290.8284\\171\\71.28906\\-291.807\\171\\69.33594\\-292.9779\\171\\65.42969\\-294.8267\\171\\63.47656\\-295.4169\\171\\61.52344\\-296.4201\\171\\59.57031\\-297.0023\\171\\55.66406\\-298.6554\\171\\53.71094\\-299.264\\171\\51.75781\\-300.1079\\171\\49.80469\\-300.6564\\171\\45.89844\\-301.578\\171\\43.94531\\-302.2715\\171\\41.99219\\-302.6582\\171\\40.03906\\-302.9011\\171\\38.08594\\-303.2481\\171\\34.17969\\-304.3228\\171\\28.32031\\-305.179\\171\\24.41406\\-306.0084\\171\\22.46094\\-306.2485\\171\\18.55469\\-306.5421\\171\\10.74219\\-306.9647\\171\\6.835938\\-307.1012\\171\\2.929688\\-307.1721\\171\\-2.929688\\-307.11\\171\\-8.789063\\-306.8859\\171\\-16.60156\\-306.4564\\171\\-20.50781\\-306.1425\\171" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "232" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "212" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-305.7787\\173\\-26.36719\\-305.3028\\173\\-28.32031\\-304.963\\173\\-32.22656\\-304.3905\\173\\-34.17969\\-303.9221\\173\\-36.13281\\-303.2852\\173\\-40.03906\\-302.6399\\173\\-41.99219\\-302.2039\\173\\-43.94531\\-301.4995\\173\\-47.85156\\-300.5623\\173\\-49.80469\\-299.8749\\173\\-51.75781\\-299.048\\173\\-53.71094\\-298.4345\\173\\-55.66406\\-297.4195\\173\\-57.61719\\-296.8113\\173\\-61.52344\\-295.1521\\173\\-63.47656\\-294.5125\\173\\-65.42969\\-293.3666\\173\\-67.38281\\-292.5309\\173\\-69.33594\\-291.2547\\173\\-71.56033\\-290.1016\\173\\-75.05267\\-288.1484\\173\\-77.14844\\-286.9216\\173\\-81.05469\\-283.9434\\173\\-83.00781\\-282.7317\\173\\-84.96094\\-281.209\\173\\-88.38264\\-278.3828\\173\\-88.86719\\-277.9161\\173\\-92.77344\\-274.812\\173\\-95.33435\\-272.5234\\173\\-101.381\\-266.6641\\173\\-103.2157\\-264.7109\\173\\-104.9045\\-262.7578\\173\\-106.7016\\-260.8047\\173\\-108.3984\\-258.7858\\173\\-112.3047\\-253.75\\173\\-114.2982\\-251.0391\\173\\-116.9067\\-247.1328\\173\\-117.7636\\-245.1797\\173\\-118.1641\\-244.6546\\173\\-120.1248\\-241.2734\\173\\-122.0783\\-237.3672\\173\\-122.9013\\-235.4141\\173\\-123.421\\-233.4609\\173\\-124.3234\\-231.5078\\173\\-125.4401\\-227.6016\\173\\-126.3148\\-225.6484\\173\\-127.3391\\-221.7422\\173\\-127.9968\\-219.7891\\173\\-128.4989\\-217.8359\\173\\-129.3815\\-211.9766\\173\\-130.2154\\-208.0703\\173\\-130.7109\\-204.1641\\173\\-131.2927\\-196.3516\\173\\-131.8123\\-188.5391\\173\\-131.9444\\-182.6797\\173\\-131.9167\\-180.7266\\173\\-131.7375\\-176.8203\\173\\-131.058\\-169.0078\\173\\-130.6299\\-163.1484\\173\\-130.3545\\-161.1953\\173\\-129.4691\\-157.2891\\173\\-128.8138\\-153.3828\\173\\-128.4241\\-151.4297\\173\\-127.0739\\-147.5234\\173\\-126.5659\\-145.5703\\173\\-125.6714\\-143.6172\\173\\-124.4894\\-139.7109\\173\\-123.4961\\-137.7578\\173\\-122.9685\\-135.8047\\173\\-122.1406\\-133.8516\\173\\-118.9248\\-127.9922\\173\\-117.6147\\-126.0391\\173\\-116.7756\\-124.0859\\173\\-114.2578\\-120.375\\173\\-112.6604\\-118.2266\\173\\-110.3516\\-115.335\\173\\-107.6827\\-112.3672\\173\\-104.4922\\-109.2278\\173\\-102.5391\\-107.6211\\173\\-100.5859\\-106.335\\173\\-98.63281\\-105.3117\\173\\-96.67969\\-103.9975\\173\\-94.72656\\-103.1359\\173\\-92.77344\\-102.0886\\173\\-88.86719\\-100.981\\173\\-86.91406\\-100.2076\\173\\-84.96094\\-99.79752\\173\\-83.00781\\-99.50636\\173\\-81.05469\\-99.11101\\173\\-79.10156\\-98.43623\\173\\-77.14844\\-98.01843\\173\\-71.28906\\-97.13657\\173\\-69.33594\\-96.66142\\173\\-67.38281\\-96.32366\\173\\-65.42969\\-96.09293\\173\\-57.61719\\-95.37125\\173\\-53.71094\\-94.93179\\173\\-51.75781\\-94.66037\\173\\-47.85156\\-94.32058\\173\\-41.99219\\-94.07495\\173\\-36.13281\\-93.98026\\173\\-24.41406\\-94.01392\\173\\-20.50781\\-94.19662\\173\\-18.55469\\-94.39706\\173\\-16.60156\\-94.70448\\173\\-10.74219\\-96.08174\\173\\-9.036847\\-96.74219\\173\\-4.882813\\-98.49303\\173\\-2.929688\\-99.43068\\173\\0.9765625\\-100.1307\\173\\2.929688\\-100.2787\\173\\4.882813\\-100.1602\\173\\6.835938\\-99.90697\\173\\8.789063\\-99.5535\\173\\10.74219\\-98.88605\\173\\12.69531\\-97.96576\\173\\14.64844\\-97.31842\\173\\16.60156\\-96.56654\\173\\18.55469\\-96.0574\\173\\24.41406\\-95.2193\\173\\28.32031\\-94.46354\\173\\32.22656\\-94.13164\\173\\41.99219\\-93.74316\\173\\53.71094\\-93.51343\\173\\55.66406\\-93.57859\\173\\63.47656\\-93.71894\\173\\69.33594\\-93.9895\\173\\71.28906\\-94.19156\\173\\73.24219\\-94.53588\\173\\77.14844\\-95.46234\\173\\81.05469\\-96.21586\\173\\83.00781\\-97.00028\\173\\84.96094\\-97.67197\\173\\86.91406\\-98.4529\\173\\88.86719\\-99.39466\\173\\90.82031\\-100.1008\\173\\92.77344\\-101.2357\\173\\94.72656\\-102.0445\\173\\98.63281\\-104.7952\\173\\100.5859\\-105.9366\\173\\104.4922\\-108.8672\\173\\106.4453\\-110.6319\\173\\108.4927\\-112.3672\\173\\110.4267\\-114.3203\\173\\112.3047\\-116.4095\\173\\115.4441\\-120.1797\\173\\116.89\\-122.1328\\173\\117.7308\\-124.0859\\173\\118.9616\\-126.0391\\173\\121.0054\\-129.9453\\173\\122.7607\\-133.8516\\173\\123.2311\\-135.8047\\173\\124.6955\\-139.7109\\173\\125.1281\\-141.6641\\173\\125.6946\\-143.6172\\173\\126.4793\\-145.5703\\173\\127.2583\\-149.4766\\173\\128.1924\\-153.3828\\173\\128.4629\\-155.3359\\173\\128.8272\\-159.2422\\173\\129.098\\-163.1484\\173\\129.5296\\-170.9609\\173\\129.7531\\-176.8203\\173\\129.7675\\-182.6797\\173\\129.71\\-186.5859\\173\\129.541\\-190.4922\\173\\129.555\\-192.4453\\173\\129.2465\\-206.1172\\173\\129.0551\\-210.0234\\173\\128.8097\\-213.9297\\173\\128.4768\\-217.8359\\173\\128.1906\\-219.7891\\173\\127.2879\\-223.6953\\173\\126.5228\\-227.6016\\173\\125.7556\\-229.5547\\173\\125.1267\\-231.5078\\173\\124.6491\\-233.4609\\173\\123.6884\\-235.4141\\173\\122.465\\-239.3203\\173\\121.3679\\-241.2734\\173\\120.4834\\-243.2266\\173\\119.1617\\-245.1797\\173\\117.9445\\-247.1328\\173\\116.945\\-249.0859\\173\\115.6315\\-251.0391\\173\\114.4968\\-252.9922\\173\\110.0757\\-258.8516\\173\\108.8625\\-260.8047\\173\\103.6794\\-266.6641\\173\\102.011\\-268.6172\\173\\100.5859\\-269.8912\\173\\97.94081\\-272.5234\\173\\96.08624\\-274.4766\\173\\92.77344\\-277.3448\\173\\90.82031\\-279.1734\\173\\88.86719\\-280.8891\\173\\84.96094\\-283.5493\\173\\84.14713\\-284.2422\\173\\81.05469\\-286.5821\\173\\79.10156\\-287.6735\\173\\77.14844\\-288.9234\\173\\75.19531\\-289.8174\\173\\74.84267\\-290.1016\\173\\71.28906\\-292.2055\\173\\67.80876\\-294.0078\\173\\67.38281\\-294.2918\\173\\63.47656\\-295.6767\\173\\61.52344\\-296.6445\\173\\59.57031\\-297.1859\\173\\57.61719\\-298.1846\\173\\53.71094\\-299.5329\\173\\51.75781\\-300.3555\\173\\47.85156\\-301.2485\\173\\43.94531\\-302.4651\\173\\40.03906\\-303.034\\173\\38.08594\\-303.4995\\173\\36.13281\\-304.1302\\173\\34.17969\\-304.4996\\173\\30.27344\\-305.0451\\173\\28.32031\\-305.4097\\173\\26.36719\\-305.9009\\173\\24.41406\\-306.2062\\173\\18.55469\\-306.6926\\173\\10.74219\\-307.1754\\173\\6.835938\\-307.3427\\173\\2.929688\\-307.441\\173\\-2.929688\\-307.3776\\173\\-8.789063\\-307.128\\173\\-14.64844\\-306.7787\\173\\-20.50781\\-306.3651\\173\\-22.46094\\-306.1425\\173" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "233" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "213" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.882813\\-307.6246\\175\\-8.789063\\-307.414\\175\\-14.64844\\-306.9991\\175\\-20.50781\\-306.5481\\175\\-24.41406\\-306.1135\\175\\-28.32031\\-305.2235\\175\\-34.17969\\-304.2817\\175\\-38.08594\\-303.1087\\175\\-41.99219\\-302.4651\\175\\-45.89844\\-301.2052\\175\\-49.80469\\-300.2358\\175\\-51.75781\\-299.3362\\175\\-53.71094\\-298.6922\\175\\-57.61719\\-297.0088\\175\\-59.57031\\-296.3583\\175\\-61.52344\\-295.3287\\175\\-63.47656\\-294.731\\175\\-65.42969\\-293.6643\\175\\-67.38281\\-292.7831\\175\\-69.33594\\-291.5326\\175\\-71.28906\\-290.6113\\175\\-73.24219\\-289.329\\175\\-75.19531\\-288.4472\\175\\-77.14844\\-287.1417\\175\\-79.10156\\-285.6472\\175\\-81.05469\\-284.3515\\175\\-83.00781\\-282.9465\\175\\-84.96094\\-281.4436\\175\\-92.77344\\-275.139\\175\\-94.72656\\-273.3772\\175\\-101.6576\\-266.6641\\175\\-106.4453\\-261.5064\\175\\-108.7708\\-258.8516\\175\\-111.611\\-254.9453\\175\\-112.3047\\-254.1595\\175\\-114.2578\\-251.5385\\175\\-114.7122\\-251.0391\\175\\-117.1091\\-247.1328\\175\\-119.2522\\-243.2266\\175\\-120.5627\\-241.2734\\175\\-121.3637\\-239.3203\\175\\-122.4623\\-237.3672\\175\\-123.7027\\-233.4609\\175\\-124.6202\\-231.5078\\175\\-125.1079\\-229.5547\\175\\-125.8089\\-227.6016\\175\\-126.6149\\-225.6484\\175\\-127.0919\\-223.6953\\175\\-128.319\\-219.7891\\175\\-128.6982\\-217.8359\\175\\-129.2717\\-213.9297\\175\\-129.6405\\-211.9766\\175\\-130.1122\\-210.0234\\175\\-130.4599\\-208.0703\\175\\-130.6792\\-206.1172\\175\\-131.0075\\-202.2109\\175\\-131.5499\\-196.3516\\175\\-132.0354\\-190.4922\\175\\-132.1825\\-186.5859\\175\\-132.2229\\-182.6797\\175\\-132.1508\\-178.7734\\175\\-131.8735\\-174.8672\\175\\-131.1868\\-169.0078\\175\\-130.7239\\-163.1484\\175\\-130.49\\-161.1953\\175\\-130.1251\\-159.2422\\175\\-129.6152\\-157.2891\\175\\-128.5073\\-151.4297\\175\\-127.1474\\-147.5234\\175\\-126.6402\\-145.5703\\175\\-125.7957\\-143.6172\\175\\-125.0893\\-141.6641\\175\\-124.5488\\-139.7109\\175\\-123.5619\\-137.7578\\175\\-122.9984\\-135.8047\\175\\-122.0703\\-133.6176\\175\\-120.1399\\-129.9453\\175\\-118.1641\\-126.6161\\175\\-117.7107\\-126.0391\\175\\-116.8512\\-124.0859\\175\\-114.2578\\-120.209\\175\\-110.3516\\-115.2188\\175\\-107.7542\\-112.3672\\175\\-104.4922\\-109.1934\\175\\-102.5391\\-107.6081\\175\\-100.5859\\-106.3781\\175\\-98.63281\\-105.3485\\175\\-96.67969\\-104.0603\\175\\-94.72656\\-103.2193\\175\\-92.77344\\-102.1739\\175\\-88.86719\\-101.1201\\175\\-86.91406\\-100.3663\\175\\-84.96094\\-99.8922\\175\\-81.05469\\-99.27155\\175\\-77.14844\\-98.16213\\175\\-71.28906\\-97.33149\\175\\-67.38281\\-96.53049\\175\\-65.42969\\-96.24242\\175\\-53.71094\\-95.20476\\175\\-47.85156\\-94.53588\\175\\-41.99219\\-94.25227\\175\\-36.13281\\-94.14428\\175\\-28.32031\\-94.17396\\175\\-24.41406\\-94.21347\\175\\-20.50781\\-94.45404\\175\\-18.55469\\-94.74969\\175\\-12.69531\\-95.8539\\175\\-10.74219\\-96.32808\\175\\-8.789063\\-97.23047\\175\\-6.835938\\-97.92606\\175\\-4.882813\\-98.93761\\175\\-2.929688\\-99.63259\\175\\0.9765625\\-100.4456\\175\\2.929688\\-100.6242\\175\\4.882813\\-100.4882\\175\\8.789063\\-99.76657\\175\\10.74219\\-99.15608\\175\\12.69531\\-98.21636\\175\\16.60156\\-97.0123\\175\\18.55469\\-96.34768\\175\\20.50781\\-95.99232\\175\\26.36719\\-95.25059\\175\\30.27344\\-94.58307\\175\\32.22656\\-94.39986\\175\\36.13281\\-94.21347\\175\\41.99219\\-93.88352\\175\\51.75781\\-93.70596\\175\\57.61719\\-93.73693\\175\\63.47656\\-93.83015\\175\\69.33594\\-94.11924\\175\\71.28906\\-94.38331\\175\\75.19531\\-95.25755\\175\\79.10156\\-95.91411\\175\\81.05469\\-96.42782\\175\\83.00781\\-97.21471\\175\\84.96094\\-97.84784\\175\\88.86719\\-99.49263\\175\\90.82031\\-100.2121\\175\\92.77344\\-101.3186\\175\\94.72656\\-102.14\\175\\98.63281\\-104.9104\\175\\100.5859\\-106.0069\\175\\103.8959\\-108.4609\\175\\108.4073\\-112.3672\\175\\110.3937\\-114.3203\\175\\112.3047\\-116.4546\\175\\115.4735\\-120.1797\\175\\116.9241\\-122.1328\\175\\117.8148\\-124.0859\\175\\118.1641\\-124.5417\\175\\120.1399\\-127.9922\\175\\122.0703\\-132.0277\\175\\122.8455\\-133.8516\\175\\123.3048\\-135.8047\\175\\124.1379\\-137.7578\\175\\124.8014\\-139.7109\\175\\125.2497\\-141.6641\\175\\126.6365\\-145.5703\\175\\127.469\\-149.4766\\175\\128.0105\\-151.4297\\175\\128.4026\\-153.3828\\175\\128.9818\\-159.2422\\175\\129.8125\\-170.9609\\175\\130.0692\\-176.8203\\175\\130.0974\\-178.7734\\175\\130.0125\\-186.5859\\175\\129.7969\\-190.4922\\175\\129.8119\\-192.4453\\175\\129.71\\-196.3516\\175\\129.5526\\-200.2578\\175\\129.4585\\-204.1641\\175\\129.2804\\-208.0703\\175\\128.9235\\-213.9297\\175\\128.5903\\-217.8359\\175\\128.3562\\-219.7891\\175\\127.9819\\-221.7422\\175\\127.4384\\-223.6953\\175\\126.6396\\-227.6016\\175\\125.9993\\-229.5547\\175\\125.2116\\-231.5078\\175\\124.7321\\-233.4609\\175\\123.8206\\-235.4141\\175\\122.565\\-239.3203\\175\\121.4644\\-241.2734\\175\\120.5901\\-243.2266\\175\\119.2367\\-245.1797\\175\\117.0258\\-249.0859\\175\\115.7294\\-251.0391\\175\\114.632\\-252.9922\\175\\112.3047\\-256.0668\\175\\111.5951\\-256.8984\\175\\109.0071\\-260.8047\\175\\107.3255\\-262.7578\\175\\105.5415\\-264.7109\\175\\103.8793\\-266.6641\\175\\102.5391\\-268.3688\\175\\100.5859\\-270.2173\\175\\98.26753\\-272.5234\\175\\96.67969\\-274.2568\\175\\94.17628\\-276.4297\\175\\92.77344\\-277.5627\\175\\90.82031\\-279.4044\\175\\88.86719\\-281.1367\\175\\86.91406\\-282.5947\\175\\84.96094\\-283.8154\\175\\84.48476\\-284.2422\\175\\81.05469\\-286.8289\\175\\75.35629\\-290.1016\\175\\73.24219\\-291.2292\\175\\71.28906\\-292.5242\\175\\69.33594\\-293.4158\\175\\67.38281\\-294.5559\\175\\65.42969\\-295.1686\\175\\63.47656\\-296.0462\\175\\61.52344\\-296.8141\\175\\59.57031\\-297.4289\\175\\57.61719\\-298.4648\\175\\55.66406\\-299.0551\\175\\53.6941\\-299.8672\\175\\51.75781\\-300.5357\\175\\47.85156\\-301.4532\\175\\45.89844\\-302.1529\\175\\43.94531\\-302.6145\\175\\40.03906\\-303.218\\175\\38.08594\\-303.84\\175\\36.13281\\-304.3507\\175\\30.27344\\-305.2533\\175\\26.36719\\-306.133\\175\\22.46094\\-306.5438\\175\\18.55469\\-306.8529\\175\\8.789063\\-307.537\\175\\2.929688\\-307.7484\\175\\-0.9765625\\-307.7484\\175" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "243" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "214" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-307.7636\\177\\-20.50781\\-306.7191\\177\\-24.41406\\-306.3396\\177\\-26.36719\\-306.0627\\177\\-30.27344\\-305.1418\\177\\-34.17969\\-304.5196\\177\\-36.13281\\-304.12\\177\\-38.08594\\-303.3922\\177\\-40.03906\\-302.9596\\177\\-41.99219\\-302.6582\\177\\-43.94531\\-302.2261\\177\\-45.89844\\-301.4646\\177\\-49.80469\\-300.4924\\177\\-53.71094\\-298.927\\177\\-55.66406\\-298.2523\\177\\-57.61719\\-297.2339\\177\\-59.57031\\-296.6338\\177\\-61.52344\\-295.5912\\177\\-63.47656\\-294.9237\\177\\-65.42969\\-294.0475\\177\\-71.28906\\-290.8636\\177\\-73.24219\\-289.5313\\177\\-75.19531\\-288.717\\177\\-81.05469\\-284.6729\\177\\-84.22636\\-282.2891\\177\\-89.21712\\-278.3828\\177\\-92.77344\\-275.3867\\177\\-94.72656\\-273.6386\\177\\-101.9304\\-266.6641\\177\\-105.5242\\-262.7578\\177\\-106.4453\\-261.8301\\177\\-109.0913\\-258.8516\\177\\-110.5763\\-256.8984\\177\\-111.9366\\-254.9453\\177\\-114.998\\-251.0391\\177\\-116.2848\\-249.0859\\177\\-117.3073\\-247.1328\\177\\-118.6336\\-245.1797\\177\\-119.5636\\-243.2266\\177\\-120.862\\-241.2734\\177\\-121.6916\\-239.3203\\177\\-122.7445\\-237.3672\\177\\-123.2879\\-235.4141\\177\\-124.1234\\-233.4609\\177\\-124.8455\\-231.5078\\177\\-125.3551\\-229.5547\\177\\-126.2695\\-227.6016\\177\\-127.364\\-223.6953\\177\\-128.0805\\-221.7422\\177\\-128.5549\\-219.7891\\177\\-129.5046\\-213.9297\\177\\-130.0135\\-211.9766\\177\\-130.4006\\-210.0234\\177\\-130.6676\\-208.0703\\177\\-131.2188\\-202.2109\\177\\-131.7368\\-198.3047\\177\\-132.1289\\-194.3984\\177\\-132.3932\\-188.5391\\177\\-132.4463\\-182.6797\\177\\-132.3853\\-178.7734\\177\\-132.1928\\-174.8672\\177\\-131.9975\\-172.9141\\177\\-131.4026\\-169.0078\\177\\-130.9781\\-165.1016\\177\\-130.6345\\-161.1953\\177\\-130.3236\\-159.2422\\177\\-129.3425\\-155.3359\\177\\-128.6139\\-151.4297\\177\\-128.039\\-149.4766\\177\\-127.2579\\-147.5234\\177\\-126.7338\\-145.5703\\177\\-125.179\\-141.6641\\177\\-124.6449\\-139.7109\\177\\-123.6792\\-137.7578\\177\\-122.3888\\-133.8516\\177\\-121.2658\\-131.8984\\177\\-120.3664\\-129.9453\\177\\-118.1641\\-126.395\\177\\-117.8733\\-126.0391\\177\\-116.9529\\-124.0859\\177\\-115.6237\\-122.1328\\177\\-114.4333\\-120.1797\\177\\-112.8956\\-118.2266\\177\\-111.2241\\-116.2734\\177\\-110.3516\\-115.0647\\177\\-107.8575\\-112.3672\\177\\-104.4922\\-109.1406\\177\\-102.5391\\-107.5807\\177\\-100.5859\\-106.3925\\177\\-98.63281\\-105.3845\\177\\-96.67969\\-104.1255\\177\\-94.72656\\-103.2817\\177\\-92.77344\\-102.2542\\177\\-90.82031\\-101.6835\\177\\-88.86719\\-101.2331\\177\\-86.91406\\-100.5177\\177\\-84.96094\\-99.97897\\177\\-81.05469\\-99.3904\\177\\-79.10156\\-98.93227\\177\\-77.14844\\-98.32832\\177\\-75.19531\\-97.98282\\177\\-69.33594\\-97.19711\\177\\-65.42969\\-96.41666\\177\\-63.47656\\-96.20592\\177\\-53.71094\\-95.40169\\177\\-49.80469\\-95.05475\\177\\-45.89844\\-94.64633\\177\\-41.99219\\-94.43584\\177\\-38.08594\\-94.34091\\177\\-34.17969\\-94.33377\\177\\-28.32031\\-94.37823\\177\\-24.41406\\-94.47062\\177\\-22.46094\\-94.58624\\177\\-20.50781\\-94.82876\\177\\-14.64844\\-95.71511\\177\\-12.69531\\-96.06696\\177\\-10.74219\\-96.67561\\177\\-8.789063\\-97.49805\\177\\-6.835938\\-98.16856\\177\\-4.882813\\-99.25969\\177\\0.9765625\\-100.8362\\177\\2.929688\\-100.9927\\177\\4.882813\\-100.8646\\177\\8.789063\\-99.97473\\177\\10.74219\\-99.39561\\177\\12.69531\\-98.54562\\177\\14.64844\\-97.82909\\177\\16.60156\\-97.34361\\177\\18.55469\\-96.73456\\177\\20.50781\\-96.23512\\177\\22.46094\\-95.9342\\177\\26.36719\\-95.53339\\177\\30.27344\\-95.06706\\177\\38.08594\\-94.28098\\177\\41.99219\\-94.0613\\177\\49.80469\\-93.87169\\177\\53.71094\\-93.84191\\177\\59.57031\\-93.86609\\177\\65.42969\\-94.01873\\177\\69.33594\\-94.3041\\177\\71.28906\\-94.6027\\177\\75.19531\\-95.42168\\177\\79.10156\\-96.04971\\177\\81.05469\\-96.66142\\177\\83.00781\\-97.41067\\177\\84.96094\\-97.99696\\177\\86.91406\\-98.88311\\177\\90.82031\\-100.3351\\177\\92.77344\\-101.4059\\177\\94.72656\\-102.2533\\177\\98.07832\\-104.5547\\177\\98.63281\\-105.0028\\177\\100.5859\\-106.0818\\177\\104.4922\\-108.9967\\177\\108.3567\\-112.3672\\177\\110.377\\-114.3203\\177\\114.2578\\-118.695\\177\\115.5086\\-120.1797\\177\\116.9577\\-122.1328\\177\\117.9181\\-124.0859\\177\\120.3166\\-127.9922\\177\\122.1549\\-131.8984\\177\\122.9377\\-133.8516\\177\\123.4037\\-135.8047\\177\\124.3234\\-137.7578\\177\\125.4025\\-141.6641\\177\\126.2374\\-143.6172\\177\\127.219\\-147.5234\\177\\128.2725\\-151.4297\\177\\128.5749\\-153.3828\\177\\129.1367\\-159.2422\\177\\129.4347\\-163.1484\\177\\129.9991\\-169.0078\\177\\130.1379\\-170.9609\\177\\130.331\\-176.8203\\177\\130.331\\-182.6797\\177\\130.2748\\-186.5859\\177\\130.1525\\-190.4922\\177\\130.0841\\-194.3984\\177\\129.8125\\-200.2578\\177\\129.6699\\-204.1641\\177\\129.0415\\-213.9297\\177\\128.5003\\-219.7891\\177\\128.2021\\-221.7422\\177\\127.6287\\-223.6953\\177\\126.7488\\-227.6016\\177\\126.2004\\-229.5547\\177\\125.2975\\-231.5078\\177\\124.8079\\-233.4609\\177\\123.2167\\-237.3672\\177\\122.665\\-239.3203\\177\\121.5728\\-241.2734\\177\\120.7031\\-243.2266\\177\\119.3305\\-245.1797\\177\\118.2726\\-247.1328\\177\\114.7702\\-252.9922\\177\\112.3047\\-256.2347\\177\\111.7188\\-256.8984\\177\\110.5453\\-258.8516\\177\\109.1551\\-260.8047\\177\\105.7414\\-264.7109\\177\\104.1297\\-266.6641\\177\\102.6476\\-268.6172\\177\\100.5859\\-270.5936\\177\\98.67126\\-272.5234\\177\\96.67969\\-274.6489\\177\\92.77344\\-277.8772\\177\\90.82031\\-279.6737\\177\\88.86719\\-281.3575\\177\\86.91406\\-282.875\\177\\84.96094\\-284.1519\\177\\81.05469\\-287.0413\\177\\79.10156\\-288.2823\\177\\77.14844\\-289.2601\\177\\75.19531\\-290.5227\\177\\73.24219\\-291.4605\\177\\71.28906\\-292.7842\\177\\69.33594\\-293.71\\177\\67.38281\\-294.7613\\177\\65.42969\\-295.3685\\177\\63.47656\\-296.3795\\177\\61.52344\\-297.0015\\177\\59.57031\\-297.7873\\177\\57.61719\\-298.6859\\177\\55.66406\\-299.2965\\177\\53.71094\\-300.1794\\177\\49.80469\\-301.1428\\177\\47.85156\\-301.705\\177\\45.89844\\-302.37\\177\\43.94531\\-302.7411\\177\\41.99219\\-303.0022\\177\\40.03906\\-303.4661\\177\\38.08594\\-304.1404\\177\\36.13281\\-304.5182\\177\\32.22656\\-305.0953\\177\\28.32031\\-306.0084\\177\\26.36719\\-306.2948\\177\\22.46094\\-306.6823\\177\\12.69531\\-307.5231\\177\\10.74219\\-307.7184\\177\\6.835938\\-307.9274\\177\\0.9765625\\-308.0416\\177\\-4.882813\\-307.9557\\177" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "244" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "215" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-12.69531\\-307.7484\\179\\-20.50781\\-306.9019\\179\\-26.36719\\-306.3059\\179\\-28.32031\\-305.9971\\179\\-30.27344\\-305.4739\\179\\-32.22656\\-305.0484\\179\\-36.13281\\-304.4158\\179\\-40.03906\\-303.1851\\179\\-43.94531\\-302.4898\\179\\-47.85156\\-301.163\\179\\-49.80469\\-300.7282\\179\\-51.75781\\-300.1472\\179\\-53.71094\\-299.2029\\179\\-55.66406\\-298.5669\\179\\-57.61719\\-297.5546\\179\\-59.57031\\-296.8492\\179\\-63.47656\\-295.1072\\179\\-65.42969\\-294.3998\\179\\-67.38281\\-293.2614\\179\\-69.33594\\-292.3607\\179\\-72.88954\\-290.1016\\179\\-73.24219\\-289.8152\\179\\-75.19531\\-288.926\\179\\-77.14844\\-287.6164\\179\\-79.10156\\-286.4247\\179\\-82.00097\\-284.2422\\179\\-83.00781\\-283.3988\\179\\-86.91406\\-280.6139\\179\\-89.59029\\-278.3828\\179\\-94.72656\\-273.908\\179\\-96.2021\\-272.5234\\179\\-98.63281\\-270.1077\\179\\-102.2611\\-266.6641\\179\\-103.9931\\-264.7109\\179\\-107.666\\-260.8047\\179\\-109.3686\\-258.8516\\179\\-112.4148\\-254.9453\\179\\-115.2649\\-251.0391\\179\\-116.6346\\-249.0859\\179\\-117.5626\\-247.1328\\179\\-118.9242\\-245.1797\\179\\-121.1379\\-241.2734\\179\\-122.1401\\-239.3203\\179\\-122.9741\\-237.3672\\179\\-123.5453\\-235.4141\\179\\-124.5021\\-233.4609\\179\\-125.0647\\-231.5078\\179\\-125.7289\\-229.5547\\179\\-126.5855\\-227.6016\\179\\-127.1042\\-225.6484\\179\\-128.4056\\-221.7422\\179\\-129.3945\\-215.8828\\179\\-130.3443\\-211.9766\\179\\-130.6345\\-210.0234\\179\\-131.2476\\-204.1641\\179\\-131.9167\\-200.2578\\179\\-132.172\\-198.3047\\179\\-132.4348\\-194.3984\\179\\-132.6082\\-188.5391\\179\\-132.6201\\-180.7266\\179\\-132.4496\\-174.8672\\179\\-132.1178\\-170.9609\\179\\-131.7368\\-169.0078\\179\\-131.1335\\-165.1016\\179\\-130.7527\\-161.1953\\179\\-130.494\\-159.2422\\179\\-130.0841\\-157.2891\\179\\-129.5046\\-155.3359\\179\\-128.726\\-151.4297\\179\\-128.2286\\-149.4766\\179\\-127.4231\\-147.5234\\179\\-126.2374\\-143.6172\\179\\-125.3045\\-141.6641\\179\\-124.7672\\-139.7109\\179\\-123.8632\\-137.7578\\179\\-123.1439\\-135.8047\\179\\-122.5318\\-133.8516\\179\\-121.4095\\-131.8984\\179\\-120.5665\\-129.9453\\179\\-119.246\\-127.9922\\179\\-117.0631\\-124.0859\\179\\-115.7964\\-122.1328\\179\\-114.6356\\-120.1797\\179\\-111.3641\\-116.2734\\179\\-110.3516\\-114.9095\\179\\-107.9685\\-112.3672\\179\\-104.4922\\-109.083\\179\\-102.5391\\-107.5541\\179\\-100.5859\\-106.3781\\179\\-98.63281\\-105.3845\\179\\-96.67969\\-104.1603\\179\\-94.72656\\-103.3268\\179\\-92.77344\\-102.3254\\179\\-90.82031\\-101.7354\\179\\-88.86719\\-101.2974\\179\\-84.96094\\-100.046\\179\\-81.05469\\-99.47767\\179\\-79.10156\\-99.08727\\179\\-77.14844\\-98.49587\\179\\-75.19531\\-98.10297\\179\\-69.33594\\-97.36919\\179\\-65.42969\\-96.63368\\179\\-61.52344\\-96.14418\\179\\-49.80469\\-95.27734\\179\\-45.89844\\-94.9329\\179\\-41.99219\\-94.65936\\179\\-38.08594\\-94.53774\\179\\-32.22656\\-94.56481\\179\\-28.32031\\-94.61761\\179\\-24.41406\\-94.79707\\179\\-22.46094\\-94.96052\\179\\-16.60156\\-95.63801\\179\\-12.69531\\-96.30611\\179\\-10.74219\\-97.08099\\179\\-8.789063\\-97.71875\\179\\-6.835938\\-98.45795\\179\\-4.882813\\-99.47305\\179\\-2.929688\\-99.98288\\179\\-0.9494357\\-100.6484\\179\\0.9765625\\-101.1266\\179\\2.929688\\-101.2548\\179\\4.882813\\-101.16\\179\\6.835938\\-100.8239\\179\\10.74219\\-99.65974\\179\\12.69531\\-98.95824\\179\\14.64844\\-98.10822\\179\\18.55469\\-97.13932\\179\\20.50781\\-96.56268\\179\\22.46094\\-96.16737\\179\\24.41406\\-95.92936\\179\\28.32031\\-95.57149\\179\\34.17969\\-95.10522\\179\\38.08594\\-94.53399\\179\\40.03906\\-94.35883\\179\\45.89844\\-94.1235\\179\\49.80469\\-94.0066\\179\\59.57031\\-93.95115\\179\\65.42969\\-94.14012\\179\\69.33594\\-94.52338\\179\\73.24219\\-95.24435\\179\\77.14844\\-95.82666\\179\\79.10156\\-96.22012\\179\\83.00781\\-97.55965\\179\\84.96094\\-98.11291\\179\\86.91406\\-99.03957\\179\\88.86719\\-99.68372\\179\\90.82031\\-100.4562\\179\\92.77344\\-101.4776\\179\\94.72656\\-102.3334\\179\\96.67969\\-103.6188\\179\\98.63281\\-105.0594\\179\\100.5859\\-106.1348\\179\\102.5391\\-107.5227\\179\\104.4922\\-109.0161\\179\\108.3246\\-112.3672\\179\\110.377\\-114.3203\\179\\114.2578\\-118.6508\\179\\115.5354\\-120.1797\\179\\116.9859\\-122.1328\\179\\119.1782\\-126.0391\\179\\120.4533\\-127.9922\\179\\121.2792\\-129.9453\\179\\122.309\\-131.8984\\179\\123.0167\\-133.8516\\179\\123.5188\\-135.8047\\179\\124.4796\\-137.7578\\179\\125.5691\\-141.6641\\179\\126.4531\\-143.6172\\179\\127.4116\\-147.5234\\179\\128.039\\-149.4766\\179\\128.4629\\-151.4297\\179\\128.7302\\-153.3828\\179\\129.1246\\-157.2891\\179\\129.4691\\-161.1953\\179\\129.9537\\-165.1016\\179\\130.1379\\-167.0547\\179\\130.4509\\-172.9141\\179\\130.54\\-178.7734\\179\\130.4814\\-186.5859\\179\\130.3777\\-192.4453\\179\\130.213\\-198.3047\\179\\129.9531\\-204.1641\\179\\129.6048\\-208.0703\\179\\129.1565\\-213.9297\\179\\128.6207\\-219.7891\\179\\128.3464\\-221.7422\\179\\127.2916\\-225.6484\\179\\126.3436\\-229.5547\\179\\125.3976\\-231.5078\\179\\124.8657\\-233.4609\\179\\124.1379\\-235.4141\\179\\123.2879\\-237.3672\\179\\122.7521\\-239.3203\\179\\121.6758\\-241.2734\\179\\120.8082\\-243.2266\\179\\119.4269\\-245.1797\\179\\118.4115\\-247.1328\\179\\115.9948\\-251.0391\\179\\114.8952\\-252.9922\\179\\112.3047\\-256.4338\\179\\111.8841\\-256.8984\\179\\110.7465\\-258.8516\\179\\109.2926\\-260.8047\\179\\105.9502\\-264.7109\\179\\102.9251\\-268.6172\\179\\100.5859\\-270.9284\\179\\96.67969\\-274.9462\\179\\94.72656\\-276.672\\179\\92.77344\\-278.2628\\179\\90.45516\\-280.3359\\179\\87.97269\\-282.2891\\179\\84.96094\\-284.5079\\179\\82.57473\\-286.1953\\179\\79.62536\\-288.1484\\179\\79.10156\\-288.563\\179\\77.14844\\-289.457\\179\\75.19531\\-290.7508\\179\\73.24219\\-291.7516\\179\\71.28906\\-292.9924\\179\\69.33594\\-294.107\\179\\67.38281\\-294.9427\\179\\65.42969\\-295.6117\\179\\63.47656\\-296.614\\179\\61.52344\\-297.2085\\179\\59.57031\\-298.1997\\179\\55.66406\\-299.5891\\179\\53.71094\\-300.4037\\179\\49.80469\\-301.3288\\179\\47.85156\\-302.0216\\179\\45.89844\\-302.5497\\179\\41.99219\\-303.1757\\179\\38.08594\\-304.3539\\179\\34.17969\\-304.9423\\179\\32.22656\\-305.2986\\179\\30.27344\\-305.8213\\179\\28.32031\\-306.2002\\179\\26.36719\\-306.4278\\179\\14.64844\\-307.6105\\179\\10.74219\\-307.9796\\179\\4.882813\\-308.1906\\179\\0.9765625\\-308.253\\179\\-2.929688\\-308.2222\\179\\-6.835938\\-308.1319\\179\\-10.74219\\-307.9149\\179" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "248" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "216" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-14.64844\\-307.8619\\181\\-20.50781\\-307.1261\\181\\-28.32031\\-306.2628\\181\\-30.27344\\-305.9009\\181\\-32.22656\\-305.35\\181\\-34.17969\\-304.9402\\181\\-38.08594\\-304.2354\\181\\-40.03906\\-303.524\\181\\-41.99219\\-303.0001\\181\\-43.94531\\-302.6826\\181\\-45.89844\\-302.2179\\181\\-47.85156\\-301.4506\\181\\-51.75781\\-300.447\\181\\-53.71094\\-299.5528\\181\\-57.61719\\-298.0361\\181\\-59.57031\\-297.0527\\181\\-61.52344\\-296.3898\\181\\-63.47656\\-295.312\\181\\-65.42969\\-294.6693\\181\\-67.38281\\-293.5479\\181\\-69.33594\\-292.6587\\181\\-71.28906\\-291.3022\\181\\-76.86492\\-288.1484\\181\\-79.10156\\-286.745\\181\\-79.72569\\-286.1953\\181\\-82.37457\\-284.2422\\181\\-83.00781\\-283.6714\\181\\-86.91406\\-280.9503\\181\\-89.90077\\-278.3828\\181\\-92.77344\\-275.8314\\181\\-94.46101\\-274.4766\\181\\-96.60645\\-272.5234\\181\\-98.63281\\-270.4627\\181\\-100.5859\\-268.768\\181\\-102.7202\\-266.6641\\181\\-104.3691\\-264.7109\\181\\-108.3984\\-260.3571\\181\\-112.3047\\-255.5829\\181\\-114.2578\\-252.9824\\181\\-116.9159\\-249.0859\\181\\-117.9445\\-247.1328\\181\\-119.179\\-245.1797\\181\\-120.5246\\-243.2266\\181\\-121.4293\\-241.2734\\181\\-122.542\\-239.3203\\181\\-123.1873\\-237.3672\\181\\-124.7836\\-233.4609\\181\\-125.3275\\-231.5078\\181\\-126.2489\\-229.5547\\181\\-127.402\\-225.6484\\181\\-128.1738\\-223.6953\\181\\-128.6563\\-221.7422\\181\\-129.3072\\-217.8359\\181\\-129.7511\\-215.8828\\181\\-130.2994\\-213.9297\\181\\-130.6077\\-211.9766\\181\\-131.0379\\-208.0703\\181\\-131.6246\\-204.1641\\181\\-132.0476\\-202.2109\\181\\-132.3184\\-200.2578\\181\\-132.4888\\-198.3047\\181\\-132.6695\\-194.3984\\181\\-132.847\\-186.5859\\181\\-132.8273\\-180.7266\\181\\-132.7295\\-176.8203\\181\\-132.5504\\-172.9141\\181\\-132.4088\\-170.9609\\181\\-132.1399\\-169.0078\\181\\-131.37\\-165.1016\\181\\-131.0852\\-163.1484\\181\\-130.6417\\-159.2422\\181\\-130.3101\\-157.2891\\181\\-129.2591\\-153.3828\\181\\-128.4395\\-149.4766\\181\\-127.6615\\-147.5234\\181\\-126.4531\\-143.6172\\181\\-125.4945\\-141.6641\\181\\-124.9007\\-139.7109\\181\\-124.1521\\-137.7578\\181\\-123.241\\-135.8047\\181\\-122.6894\\-133.8516\\181\\-121.5978\\-131.8984\\181\\-120.7406\\-129.9453\\181\\-119.4171\\-127.9922\\181\\-118.3803\\-126.0391\\181\\-116.2109\\-122.3582\\181\\-114.8358\\-120.1797\\181\\-114.2578\\-119.555\\181\\-110.3516\\-114.7424\\181\\-108.1139\\-112.3672\\181\\-104.4922\\-109.0238\\181\\-102.5391\\-107.5288\\181\\-100.5859\\-106.3501\\181\\-98.63281\\-105.3958\\181\\-96.67969\\-104.183\\181\\-94.72656\\-103.3636\\181\\-92.77344\\-102.3853\\181\\-90.82031\\-101.7819\\181\\-88.86719\\-101.3389\\181\\-84.96094\\-100.1176\\181\\-83.00781\\-99.77348\\181\\-81.05469\\-99.54239\\181\\-79.10156\\-99.21159\\181\\-75.19531\\-98.22447\\181\\-73.24219\\-97.95056\\181\\-67.38281\\-97.24526\\181\\-63.47656\\-96.53049\\181\\-59.57031\\-96.10387\\181\\-45.89844\\-95.18918\\181\\-41.99219\\-94.94682\\181\\-38.08594\\-94.82813\\181\\-32.22656\\-94.84332\\181\\-28.32031\\-94.9329\\181\\-24.41406\\-95.12843\\181\\-18.55469\\-95.63015\\181\\-14.64844\\-96.13818\\181\\-12.69531\\-96.64745\\181\\-10.74219\\-97.38377\\181\\-8.789063\\-97.93172\\181\\-6.835938\\-98.84027\\181\\-4.882813\\-99.63721\\181\\-2.929688\\-100.1837\\181\\-0.9765625\\-100.9572\\181\\0.9765625\\-101.3396\\181\\2.929688\\-101.448\\181\\4.882813\\-101.3886\\181\\6.835938\\-101.1401\\181\\8.789063\\-100.487\\181\\12.69531\\-99.30971\\181\\14.64844\\-98.42478\\181\\16.60156\\-97.86523\\181\\22.46094\\-96.48773\\181\\26.36719\\-95.93898\\181\\32.22656\\-95.55055\\181\\36.13281\\-95.17562\\181\\40.03906\\-94.70243\\181\\43.94531\\-94.41936\\181\\47.85156\\-94.21726\\181\\57.61719\\-94.05355\\181\\59.57031\\-94.05355\\181\\63.47656\\-94.16127\\181\\67.38281\\-94.45885\\181\\69.33594\\-94.73481\\181\\73.24219\\-95.39242\\181\\77.14844\\-95.95536\\181\\79.10156\\-96.38412\\181\\81.05469\\-97.12376\\181\\84.96094\\-98.24696\\181\\86.91406\\-99.16698\\181\\88.86719\\-99.78883\\181\\90.82031\\-100.5919\\181\\94.72656\\-102.4105\\181\\96.67969\\-103.6537\\181\\98.63281\\-105.1044\\181\\100.5859\\-106.1708\\181\\102.5391\\-107.5354\\181\\104.4922\\-109.0482\\181\\108.3405\\-112.3672\\181\\110.3516\\-114.2598\\181\\114.2578\\-118.5928\\181\\115.5802\\-120.1797\\181\\117.0185\\-122.1328\\181\\119.262\\-126.0391\\181\\120.5665\\-127.9922\\181\\121.3793\\-129.9453\\181\\122.4459\\-131.8984\\181\\123.6651\\-135.8047\\181\\124.6166\\-137.7578\\181\\125.1248\\-139.7109\\181\\125.7957\\-141.6641\\181\\126.6151\\-143.6172\\181\\127.0812\\-145.5703\\181\\128.2831\\-149.4766\\181\\128.8775\\-153.3828\\181\\129.5046\\-159.2422\\181\\130.0418\\-163.1484\\181\\130.3875\\-167.0547\\181\\130.5603\\-170.9609\\181\\130.6676\\-176.8203\\181\\130.6745\\-182.6797\\181\\130.5958\\-190.4922\\181\\130.4289\\-198.3047\\181\\130.2857\\-202.2109\\181\\130.0556\\-206.1172\\181\\129.4585\\-211.9766\\181\\128.7369\\-219.7891\\181\\128.4801\\-221.7422\\181\\128.0527\\-223.6953\\181\\127.4235\\-225.6484\\181\\126.459\\-229.5547\\181\\125.5006\\-231.5078\\181\\124.2872\\-235.4141\\181\\123.3788\\-237.3672\\181\\122.8285\\-239.3203\\181\\121.814\\-241.2734\\181\\120.8995\\-243.2266\\181\\119.5431\\-245.1797\\181\\118.551\\-247.1328\\181\\117.2668\\-249.0859\\181\\115.0264\\-252.9922\\181\\112.1094\\-256.8984\\181\\110.9106\\-258.8516\\181\\108.3984\\-262.1475\\181\\106.2124\\-264.7109\\181\\104.7823\\-266.6641\\181\\103.1599\\-268.6172\\181\\101.2968\\-270.5703\\181\\100.5859\\-271.1674\\181\\98.63281\\-273.2509\\181\\95.33039\\-276.4297\\181\\93.04926\\-278.3828\\181\\90.82031\\-280.3944\\181\\86.91406\\-283.2478\\181\\84.96094\\-284.7731\\181\\82.97937\\-286.1953\\181\\81.05469\\-287.419\\181\\79.10156\\-288.7799\\181\\77.14844\\-289.6953\\181\\76.64696\\-290.1016\\181\\73.37182\\-292.0547\\181\\71.28906\\-293.2093\\181\\69.33594\\-294.4321\\181\\67.38281\\-295.111\\181\\63.47656\\-296.8065\\181\\61.52344\\-297.4638\\181\\59.57031\\-298.4828\\181\\57.61719\\-299.0849\\181\\55.66406\\-299.9338\\181\\53.71094\\-300.5895\\181\\51.75781\\-301.0235\\181\\49.80469\\-301.5652\\181\\47.85156\\-302.2818\\181\\45.89844\\-302.6826\\181\\43.94531\\-302.9734\\181\\41.99219\\-303.3867\\181\\40.03906\\-304.099\\181\\38.08594\\-304.5059\\181\\34.17969\\-305.1066\\181\\30.27344\\-306.0521\\181\\28.32031\\-306.3362\\181\\20.50781\\-307.1946\\181\\16.60156\\-307.6875\\181\\12.69531\\-308.0501\\181\\6.835938\\-308.312\\181\\0.9765625\\-308.406\\181\\-2.929688\\-308.3983\\181\\-6.835938\\-308.312\\181\\-10.74219\\-308.1581\\181" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "247" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "217" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.60156\\-307.9292\\183\\-20.50781\\-307.3937\\183\\-30.27344\\-306.1974\\183\\-32.22656\\-305.7641\\183\\-34.17969\\-305.203\\183\\-38.08594\\-304.497\\183\\-40.03906\\-303.9851\\183\\-41.99219\\-303.2447\\183\\-45.89844\\-302.494\\183\\-49.80469\\-301.1505\\183\\-51.75781\\-300.6683\\183\\-53.71094\\-300.0191\\183\\-55.66406\\-299.0826\\183\\-57.61719\\-298.4228\\183\\-59.57031\\-297.309\\183\\-61.52344\\-296.6519\\183\\-63.47656\\-295.5859\\183\\-65.42969\\-294.8752\\183\\-69.33594\\-292.8848\\183\\-71.28906\\-291.5664\\183\\-73.24219\\-290.5547\\183\\-75.19531\\-289.262\\183\\-77.14844\\-288.2981\\183\\-79.10156\\-286.9992\\183\\-83.00781\\-283.9864\\183\\-84.96094\\-282.684\\183\\-86.91406\\-281.2117\\183\\-88.86719\\-279.5585\\183\\-90.82031\\-277.7526\\183\\-92.77344\\-276.1217\\183\\-94.72656\\-274.6978\\183\\-96.67969\\-272.8738\\183\\-98.961\\-270.5703\\183\\-100.5859\\-269.1543\\183\\-103.1081\\-266.6641\\183\\-104.4922\\-265.0609\\183\\-108.4699\\-260.8047\\183\\-109.8737\\-258.8516\\183\\-112.3047\\-255.9673\\183\\-114.6782\\-252.9922\\183\\-118.4346\\-247.1328\\183\\-119.4761\\-245.1797\\183\\-120.8511\\-243.2266\\183\\-121.7863\\-241.2734\\183\\-122.8381\\-239.3203\\183\\-123.427\\-237.3672\\183\\-124.4154\\-235.4141\\183\\-125.7045\\-231.5078\\183\\-126.6071\\-229.5547\\183\\-127.1517\\-227.6016\\183\\-128.5009\\-223.6953\\183\\-129.213\\-219.7891\\183\\-129.6535\\-217.8359\\183\\-130.2178\\-215.8828\\183\\-130.5958\\-213.9297\\183\\-131.3382\\-208.0703\\183\\-132.1615\\-204.1641\\183\\-132.4273\\-202.2109\\183\\-132.7431\\-198.3047\\183\\-132.9283\\-194.3984\\183\\-133.0686\\-188.5391\\183\\-133.0862\\-182.6797\\183\\-132.9542\\-176.8203\\183\\-132.63\\-170.9609\\183\\-132.172\\-167.0547\\183\\-131.2982\\-163.1484\\183\\-130.5065\\-157.2891\\183\\-130.0278\\-155.3359\\183\\-129.4316\\-153.3828\\183\\-128.6139\\-149.4766\\183\\-128.0117\\-147.5234\\183\\-127.2015\\-145.5703\\183\\-126.6506\\-143.6172\\183\\-125.7668\\-141.6641\\183\\-125.038\\-139.7109\\183\\-124.4154\\-137.7578\\183\\-123.3871\\-135.8047\\183\\-122.8503\\-133.8516\\183\\-120.923\\-129.9453\\183\\-119.665\\-127.9922\\183\\-118.6586\\-126.0391\\183\\-117.3279\\-124.0859\\183\\-116.3618\\-122.1328\\183\\-115.0076\\-120.1797\\183\\-110.3516\\-114.5383\\183\\-108.2601\\-112.3672\\183\\-104.4922\\-108.9595\\183\\-102.5391\\-107.5096\\183\\-100.5859\\-106.3081\\183\\-98.63281\\-105.3893\\183\\-96.67969\\-104.1728\\183\\-94.72656\\-103.3905\\183\\-92.77344\\-102.4376\\183\\-90.82031\\-101.8168\\183\\-86.91406\\-100.8497\\183\\-84.96094\\-100.1941\\183\\-83.00781\\-99.82882\\183\\-79.10156\\-99.31302\\183\\-77.14844\\-98.89208\\183\\-75.19531\\-98.36979\\183\\-73.24219\\-98.04256\\183\\-67.38281\\-97.39141\\183\\-65.42969\\-97.1084\\183\\-61.52344\\-96.43822\\183\\-59.57031\\-96.2225\\183\\-55.66406\\-95.94939\\183\\-47.85156\\-95.47324\\183\\-41.99219\\-95.19989\\183\\-38.08594\\-95.11459\\183\\-32.22656\\-95.10296\\183\\-26.36719\\-95.27411\\183\\-22.46094\\-95.51266\\183\\-18.55469\\-95.82465\\183\\-16.60156\\-96.05001\\183\\-14.64844\\-96.38306\\183\\-12.69531\\-97.07645\\183\\-8.789063\\-98.15905\\183\\-6.835938\\-99.17376\\183\\-2.929688\\-100.4606\\183\\-0.9765625\\-101.1998\\183\\0.9765625\\-101.5172\\183\\2.929688\\-101.6191\\183\\4.882813\\-101.5833\\183\\6.835938\\-101.373\\183\\8.789063\\-100.8407\\183\\10.74219\\-100.069\\183\\12.69531\\-99.5437\\183\\16.60156\\-98.11389\\183\\18.55469\\-97.64063\\183\\20.50781\\-97.28882\\183\\24.41406\\-96.4777\\183\\26.36719\\-96.18677\\183\\30.27344\\-95.90126\\183\\41.99219\\-94.94928\\183\\43.94531\\-94.70313\\183\\47.85156\\-94.42457\\183\\53.71094\\-94.23934\\183\\57.61719\\-94.17871\\183\\61.52344\\-94.22266\\183\\65.42969\\-94.43331\\183\\67.38281\\-94.61629\\183\\71.28906\\-95.27411\\183\\77.14844\\-96.08543\\183\\79.10156\\-96.57703\\183\\81.05469\\-97.29441\\183\\83.00781\\-97.7765\\183\\84.96094\\-98.38932\\183\\86.91406\\-99.28125\\183\\88.86719\\-99.86127\\183\\90.69653\\-100.6484\\183\\94.72656\\-102.5202\\183\\96.67969\\-103.6937\\183\\98.63281\\-105.1532\\183\\100.5859\\-106.2177\\183\\102.5391\\-107.5482\\183\\104.4922\\-109.0664\\183\\108.34\\-112.3672\\183\\110.3516\\-114.2109\\183\\114.2578\\-118.5354\\183\\116.2109\\-120.9165\\183\\118.3025\\-124.0859\\183\\119.3326\\-126.0391\\183\\120.6727\\-127.9922\\183\\121.4844\\-129.9453\\183\\122.575\\-131.8984\\183\\123.1439\\-133.8516\\183\\123.848\\-135.8047\\183\\124.7403\\-137.7578\\183\\125.2484\\-139.7109\\183\\126.0851\\-141.6641\\183\\126.7588\\-143.6172\\183\\127.2427\\-145.5703\\183\\127.9373\\-147.5234\\183\\128.4716\\-149.4766\\183\\129.0128\\-153.3828\\183\\129.4585\\-157.2891\\183\\130.099\\-161.1953\\183\\130.3236\\-163.1484\\183\\130.5804\\-167.0547\\183\\130.7043\\-170.9609\\183\\130.7932\\-176.8203\\183\\130.799\\-182.6797\\183\\130.7527\\-188.5391\\183\\130.6417\\-196.3516\\183\\130.4814\\-202.2109\\183\\130.2748\\-206.1172\\183\\130.1104\\-208.0703\\183\\129.4244\\-213.9297\\183\\128.8491\\-219.7891\\183\\128.2508\\-223.6953\\183\\127.5823\\-225.6484\\183\\126.5669\\-229.5547\\183\\125.6378\\-231.5078\\183\\124.4363\\-235.4141\\183\\123.4663\\-237.3672\\183\\122.9082\\-239.3203\\183\\122.0703\\-241.1798\\183\\120.9834\\-243.2266\\183\\119.6699\\-245.1797\\183\\118.686\\-247.1328\\183\\117.3816\\-249.0859\\183\\116.4032\\-251.0391\\183\\115.1482\\-252.9922\\183\\113.7174\\-254.9453\\183\\111.0647\\-258.8516\\183\\108.3984\\-262.4622\\183\\104.4922\\-267.3177\\183\\101.5562\\-270.5703\\183\\100.5859\\-271.439\\183\\98.63281\\-273.5255\\183\\95.62296\\-276.4297\\183\\94.72656\\-277.1321\\183\\90.82031\\-280.7161\\183\\88.65327\\-282.2891\\183\\86.91406\\-283.4304\\183\\83.00781\\-286.5026\\183\\81.05469\\-287.6375\\183\\79.10156\\-288.9757\\183\\77.14844\\-290.0121\\183\\75.19531\\-291.1763\\183\\73.24219\\-292.5272\\183\\71.28906\\-293.4723\\183\\69.33594\\-294.6651\\183\\67.38281\\-295.2786\\183\\65.42969\\-296.3092\\183\\63.47656\\-296.9807\\183\\59.57031\\-298.6922\\183\\57.61719\\-299.3134\\183\\55.66406\\-300.21\\183\\53.71094\\-300.7524\\183\\51.75781\\-301.188\\183\\47.85156\\-302.4734\\183\\43.94531\\-303.136\\183\\40.03906\\-304.2984\\183\\36.13281\\-304.9303\\183\\34.17969\\-305.308\\183\\32.22656\\-305.8213\\183\\30.27344\\-306.2148\\183\\28.32031\\-306.4694\\183\\20.50781\\-307.3776\\183\\16.60156\\-307.9274\\183\\12.69531\\-308.2222\\183\\6.835938\\-308.45\\183\\-0.9765625\\-308.5417\\183\\-6.835938\\-308.4622\\183\\-10.74219\\-308.341\\183\\-14.64844\\-308.1115\\183" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "218" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-20.50781\\-307.7181\\185\\-24.41406\\-307.1261\\185\\-30.27344\\-306.3936\\185\\-32.22656\\-306.106\\185\\-36.13281\\-305.0701\\185\\-40.03906\\-304.3178\\185\\-41.99219\\-303.6033\\185\\-43.94531\\-303.0183\\185\\-45.89844\\-302.6813\\185\\-47.85156\\-302.2012\\185\\-49.80469\\-301.4146\\185\\-53.71094\\-300.3586\\185\\-55.66406\\-299.3977\\185\\-57.61719\\-298.6814\\185\\-59.57031\\-297.6281\\185\\-61.52344\\-296.8521\\185\\-65.42969\\-295.0637\\185\\-67.38281\\-294.2838\\185\\-67.7562\\-294.0078\\185\\-73.24219\\-290.8214\\185\\-75.19531\\-289.4738\\185\\-77.14844\\-288.5801\\185\\-79.10156\\-287.2192\\185\\-81.05469\\-285.7361\\185\\-83.00781\\-284.4061\\185\\-84.96094\\-282.96\\185\\-88.29886\\-280.3359\\185\\-90.82031\\-278.1072\\185\\-92.87383\\-276.4297\\185\\-94.72656\\-275.0237\\185\\-96.67969\\-273.1861\\185\\-99.29574\\-270.5703\\185\\-101.4579\\-268.6172\\185\\-108.876\\-260.8047\\185\\-111.7497\\-256.8984\\185\\-112.3047\\-256.2957\\185\\-114.9947\\-252.9922\\185\\-116.2523\\-251.0391\\185\\-117.4074\\-249.0859\\185\\-118.7654\\-247.1328\\185\\-119.882\\-245.1797\\185\\-121.1221\\-243.2266\\185\\-122.2567\\-241.2734\\185\\-123.0589\\-239.3203\\185\\-123.7497\\-237.3672\\185\\-124.7145\\-235.4141\\185\\-125.2741\\-233.4609\\185\\-126.2275\\-231.5078\\185\\-127.4852\\-227.6016\\185\\-128.2574\\-225.6484\\185\\-128.7474\\-223.6953\\185\\-129.5245\\-219.7891\\185\\-130.1398\\-217.8359\\185\\-130.5603\\-215.8828\\185\\-131.065\\-211.9766\\185\\-131.37\\-210.0234\\185\\-132.2545\\-206.1172\\185\\-132.5063\\-204.1641\\185\\-132.8779\\-200.2578\\185\\-133.2401\\-194.3984\\185\\-133.4022\\-188.5391\\185\\-133.4022\\-182.6797\\185\\-133.3067\\-178.7734\\185\\-133.1109\\-174.8672\\185\\-132.8273\\-170.9609\\185\\-132.4348\\-167.0547\\185\\-132.1178\\-165.1016\\185\\-131.5741\\-163.1484\\185\\-131.1908\\-161.1953\\185\\-130.6535\\-157.2891\\185\\-130.2776\\-155.3359\\185\\-129.6405\\-153.3828\\185\\-129.1519\\-151.4297\\185\\-128.3033\\-147.5234\\185\\-127.4351\\-145.5703\\185\\-126.8452\\-143.6172\\185\\-126.1382\\-141.6641\\185\\-125.2032\\-139.7109\\185\\-124.6405\\-137.7578\\185\\-123.6258\\-135.8047\\185\\-123.0105\\-133.8516\\185\\-122.2141\\-131.8984\\185\\-120.1172\\-128.1007\\185\\-118.8833\\-126.0391\\185\\-117.5194\\-124.0859\\185\\-116.6426\\-122.1328\\185\\-115.1966\\-120.1797\\185\\-110.3516\\-114.3295\\185\\-108.4589\\-112.3672\\185\\-106.273\\-110.4141\\185\\-104.4922\\-108.9111\\185\\-102.5391\\-107.4906\\185\\-100.5859\\-106.2691\\185\\-98.63281\\-105.3713\\185\\-96.67969\\-104.1653\\185\\-94.72656\\-103.4145\\185\\-92.77344\\-102.4914\\185\\-90.82031\\-101.8401\\185\\-86.91406\\-100.9035\\185\\-84.96094\\-100.2427\\185\\-83.00781\\-99.86601\\185\\-79.10156\\-99.39367\\185\\-77.14844\\-99.04118\\185\\-75.19531\\-98.49587\\185\\-73.24219\\-98.13338\\185\\-65.42969\\-97.26263\\185\\-61.52344\\-96.63368\\185\\-57.61719\\-96.19778\\185\\-53.71094\\-95.94743\\185\\-47.85156\\-95.62691\\185\\-41.99219\\-95.37997\\185\\-34.17969\\-95.2933\\185\\-30.27344\\-95.34266\\185\\-24.41406\\-95.57826\\185\\-20.50781\\-95.83388\\185\\-16.60156\\-96.26567\\185\\-14.71819\\-96.74219\\185\\-12.69531\\-97.38006\\185\\-10.74219\\-97.83219\\185\\-8.789063\\-98.43623\\185\\-6.835938\\-99.40826\\185\\-4.882813\\-99.97044\\185\\-2.929688\\-100.8074\\185\\-0.9765625\\-101.3934\\185\\0.9765625\\-101.6828\\185\\2.929688\\-101.7868\\185\\4.882813\\-101.7471\\185\\6.835938\\-101.5707\\185\\8.789063\\-101.1706\\185\\10.74219\\-100.2992\\185\\14.64844\\-99.12858\\185\\16.60156\\-98.38932\\185\\18.55469\\-97.90424\\185\\26.36719\\-96.51363\\185\\32.22656\\-95.90747\\185\\34.17969\\-95.75446\\185\\41.99219\\-95.26397\\185\\47.85156\\-94.71986\\185\\53.71094\\-94.37249\\185\\55.66406\\-94.31786\\185\\61.52344\\-94.36182\\185\\65.42969\\-94.61629\\185\\67.38281\\-94.82844\\185\\71.28906\\-95.42202\\185\\75.19531\\-95.90279\\185\\77.14844\\-96.22095\\185\\81.05469\\-97.43121\\185\\83.00781\\-97.89201\\185\\84.96094\\-98.53372\\185\\86.91406\\-99.3765\\185\\88.86719\\-99.92663\\185\\92.77344\\-101.6429\\185\\94.71451\\-102.6016\\185\\96.67969\\-103.7399\\185\\98.63281\\-105.1913\\185\\100.5859\\-106.2441\\185\\102.5391\\-107.5679\\185\\104.4922\\-109.0624\\185\\108.3732\\-112.3672\\185\\110.3516\\-114.1784\\185\\112.3047\\-116.2647\\185\\114.2578\\-118.4579\\185\\116.2109\\-120.8516\\185\\118.3942\\-124.0859\\185\\119.4096\\-126.0391\\185\\120.7548\\-127.9922\\185\\121.6038\\-129.9453\\185\\122.6639\\-131.8984\\185\\123.2239\\-133.8516\\185\\124.8318\\-137.7578\\185\\125.3715\\-139.7109\\185\\126.3231\\-141.6641\\185\\127.4322\\-145.5703\\185\\128.1924\\-147.5234\\185\\128.6321\\-149.4766\\185\\129.4111\\-155.3359\\185\\130.0974\\-159.2422\\185\\130.5318\\-163.1484\\185\\130.7174\\-167.0547\\185\\130.8266\\-170.9609\\185\\130.9133\\-176.8203\\185\\130.9077\\-182.6797\\185\\130.8594\\-188.5391\\185\\130.7589\\-196.3516\\185\\130.6226\\-202.2109\\185\\130.3206\\-208.0703\\185\\129.9225\\-211.9766\\185\\129.6048\\-213.9297\\185\\128.9702\\-219.7891\\185\\128.3997\\-223.6953\\185\\127.1666\\-227.6016\\185\\126.6892\\-229.5547\\185\\125.836\\-231.5078\\185\\125.094\\-233.4609\\185\\124.5754\\-235.4141\\185\\123.5764\\-237.3672\\185\\122.987\\-239.3203\\185\\122.2257\\-241.2734\\185\\120.1172\\-244.7944\\185\\118.8064\\-247.1328\\185\\117.5109\\-249.0859\\185\\116.603\\-251.0391\\185\\112.6489\\-256.8984\\185\\109.7887\\-260.8047\\185\\108.488\\-262.7578\\185\\104.4922\\-267.6181\\185\\101.8212\\-270.5703\\185\\99.841\\-272.5234\\185\\98.63281\\-273.8233\\185\\95.94167\\-276.4297\\185\\94.72656\\-277.3944\\185\\92.77344\\-279.2207\\185\\90.82031\\-280.948\\185\\88.86719\\-282.4544\\185\\86.91406\\-283.6589\\185\\83.00781\\-286.7724\\185\\79.10156\\-289.1499\\185\\77.14844\\-290.3892\\185\\75.19531\\-291.4294\\185\\73.24219\\-292.7969\\185\\69.33594\\-294.8562\\185\\67.38281\\-295.5066\\185\\65.42969\\-296.5652\\185\\63.47656\\-297.1703\\185\\61.52344\\-298.207\\185\\57.61719\\-299.5756\\185\\55.66406\\-300.4157\\185\\51.75781\\-301.3795\\185\\49.80469\\-302.1529\\185\\47.85156\\-302.6214\\185\\45.89844\\-302.9023\\185\\43.94531\\-303.3203\\185\\41.99219\\-303.9851\\185\\40.03906\\-304.4535\\185\\36.13281\\-305.0845\\185\\32.22656\\-306.0627\\185\\30.27344\\-306.3616\\185\\24.41406\\-307.0588\\185\\18.55469\\-307.9007\\185\\14.64844\\-308.2441\\185\\8.789063\\-308.5176\\185\\2.929688\\-308.6384\\185\\-2.929688\\-308.6503\\185\\-6.835938\\-308.5963\\185\\-12.69531\\-308.4106\\185\\-16.60156\\-308.145\\185" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "246" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "219" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-22.46094\\-307.7484\\187\\-26.36719\\-307.0876\\187\\-32.22656\\-306.3169\\187\\-34.17969\\-305.9857\\187\\-36.13281\\-305.3651\\187\\-40.03906\\-304.5497\\187\\-41.99219\\-304.044\\187\\-43.94531\\-303.2505\\187\\-47.85156\\-302.461\\187\\-51.75781\\-301.0848\\187\\-53.71094\\-300.5981\\187\\-55.53288\\-299.8672\\187\\-59.57031\\-298.078\\187\\-61.52344\\-297.0562\\187\\-63.47656\\-296.3229\\187\\-65.42969\\-295.2697\\187\\-67.38281\\-294.5539\\187\\-69.33594\\-293.339\\187\\-71.28906\\-292.3347\\187\\-71.63128\\-292.0547\\187\\-74.79581\\-290.1016\\187\\-75.19531\\-289.7736\\187\\-77.14844\\-288.819\\187\\-83.00781\\-284.7525\\187\\-86.91406\\-281.6622\\187\\-88.71488\\-280.3359\\187\\-93.25761\\-276.4297\\187\\-94.72656\\-275.2565\\187\\-96.67969\\-273.4596\\187\\-98.63281\\-271.4655\\187\\-102.5391\\-267.793\\187\\-105.3863\\-264.7109\\187\\-107.3276\\-262.7578\\187\\-109.1595\\-260.8047\\187\\-110.7407\\-258.8516\\187\\-112.1501\\-256.8984\\187\\-114.2578\\-254.3232\\187\\-116.6458\\-251.0391\\187\\-117.726\\-249.0859\\187\\-118.1641\\-248.5634\\187\\-120.1172\\-245.5106\\187\\-120.4012\\-245.1797\\187\\-121.4012\\-243.2266\\187\\-122.6048\\-241.2734\\187\\-123.2605\\-239.3203\\187\\-124.2084\\-237.3672\\187\\-125.6087\\-233.4609\\187\\-126.5841\\-231.5078\\187\\-127.154\\-229.5547\\187\\-127.9297\\-227.5835\\187\\-128.5747\\-225.6484\\187\\-129.3846\\-221.7422\\187\\-130.0146\\-219.7891\\187\\-130.5025\\-217.8359\\187\\-131.0535\\-213.9297\\187\\-131.3968\\-211.9766\\187\\-132.3184\\-208.0703\\187\\-132.5852\\-206.1172\\187\\-133.1894\\-200.2578\\187\\-133.6929\\-194.3984\\187\\-133.8698\\-190.4922\\187\\-133.9245\\-186.5859\\187\\-133.8976\\-182.6797\\187\\-133.722\\-178.7734\\187\\-133.4252\\-174.8672\\187\\-133.062\\-170.9609\\187\\-132.6481\\-167.0547\\187\\-132.3853\\-165.1016\\187\\-131.9714\\-163.1484\\187\\-131.4202\\-161.1953\\187\\-131.0513\\-159.2422\\187\\-130.4764\\-155.3359\\187\\-129.3257\\-151.4297\\187\\-128.5181\\-147.5234\\187\\-127.054\\-143.6172\\187\\-126.447\\-141.6641\\187\\-125.4502\\-139.7109\\187\\-124.8485\\-137.7578\\187\\-123.189\\-133.8516\\187\\-122.5382\\-131.8984\\187\\-121.3938\\-129.9453\\187\\-120.4622\\-127.9922\\187\\-118.1641\\-124.5249\\187\\-117.8096\\-124.0859\\187\\-116.8553\\-122.1328\\187\\-115.4125\\-120.1797\\187\\-112.3047\\-116.3668\\187\\-110.5197\\-114.3203\\187\\-108.6446\\-112.3672\\187\\-106.4189\\-110.4141\\187\\-103.9855\\-108.4609\\187\\-100.5859\\-106.2298\\187\\-98.63281\\-105.3394\\187\\-96.67969\\-104.1555\\187\\-94.72656\\-103.4316\\187\\-92.77344\\-102.5196\\187\\-90.82031\\-101.8706\\187\\-86.91406\\-100.9646\\187\\-84.96094\\-100.2901\\187\\-83.00781\\-99.88494\\187\\-79.10156\\-99.44176\\187\\-77.14844\\-99.10822\\187\\-75.19531\\-98.60057\\187\\-73.24219\\-98.2157\\187\\-69.33594\\-97.76226\\187\\-65.42969\\-97.37668\\187\\-59.57031\\-96.54275\\187\\-57.61719\\-96.31681\\187\\-53.71094\\-96.05067\\187\\-45.89844\\-95.66138\\187\\-41.99219\\-95.53448\\187\\-38.08594\\-95.4697\\187\\-34.17969\\-95.46194\\187\\-28.32031\\-95.5737\\187\\-24.41406\\-95.74953\\187\\-20.50781\\-95.99789\\187\\-18.55469\\-96.21944\\187\\-16.60156\\-96.55518\\187\\-14.64844\\-97.16705\\187\\-10.74219\\-98.01802\\187\\-6.835938\\-99.57942\\187\\-4.882813\\-100.1703\\187\\-2.929688\\-101.0955\\187\\-0.9765625\\-101.5771\\187\\0.9765625\\-101.849\\187\\2.929688\\-101.9563\\187\\4.882813\\-101.9098\\187\\6.835938\\-101.7354\\187\\8.789063\\-101.4059\\187\\12.69531\\-99.89298\\187\\14.64844\\-99.35686\\187\\18.55469\\-98.15472\\187\\20.50781\\-97.77331\\187\\26.36719\\-96.95998\\187\\28.32031\\-96.60675\\187\\32.22656\\-96.06208\\187\\34.17969\\-95.9011\\187\\41.99219\\-95.47448\\187\\49.80469\\-94.90262\\187\\53.71094\\-94.54492\\187\\57.61719\\-94.49248\\187\\61.52344\\-94.56314\\187\\65.42969\\-94.81288\\187\\71.28906\\-95.55308\\187\\75.19531\\-96.00422\\187\\77.14844\\-96.36313\\187\\79.10156\\-97.02981\\187\\83.00781\\-98.00691\\187\\86.91406\\-99.45421\\187\\88.86719\\-99.98288\\187\\90.82031\\-100.9093\\187\\92.77344\\-101.696\\187\\94.59556\\-102.6016\\187\\96.67969\\-103.7932\\187\\98.63281\\-105.228\\187\\100.5859\\-106.2691\\187\\102.5391\\-107.5807\\187\\104.4922\\-109.0534\\187\\108.4428\\-112.3672\\187\\110.3516\\-114.1465\\187\\112.3047\\-116.1816\\187\\114.2578\\-118.3761\\187\\116.2109\\-120.7674\\187\\118.4784\\-124.0859\\187\\119.5001\\-126.0391\\187\\120.8412\\-127.9922\\187\\121.7098\\-129.9453\\187\\122.7445\\-131.8984\\187\\123.3206\\-133.8516\\187\\124.2604\\-135.8047\\187\\125.5333\\-139.7109\\187\\126.5015\\-141.6641\\187\\127.0255\\-143.6172\\187\\127.6516\\-145.5703\\187\\128.3838\\-147.5234\\187\\128.7578\\-149.4766\\187\\129.3202\\-153.3828\\187\\130.0569\\-157.2891\\187\\130.3545\\-159.2422\\187\\130.686\\-163.1484\\187\\130.7761\\-165.1016\\187\\130.9903\\-172.9141\\187\\131.047\\-176.8203\\187\\131.0359\\-182.6797\\187\\130.9842\\-188.5391\\187\\130.854\\-196.3516\\187\\130.7288\\-202.2109\\187\\130.4986\\-208.0703\\187\\130.1772\\-211.9766\\187\\129.5667\\-215.8828\\187\\129.086\\-219.7891\\187\\128.5239\\-223.6953\\187\\128.039\\-225.6484\\187\\127.3072\\-227.6016\\187\\126.7997\\-229.5547\\187\\126.0851\\-231.5078\\187\\125.2116\\-233.4609\\187\\124.7065\\-235.4141\\187\\123.7392\\-237.3672\\187\\122.3724\\-241.2734\\187\\122.0703\\-241.6811\\187\\118.1641\\-248.4263\\187\\117.6419\\-249.0859\\187\\116.7661\\-251.0391\\187\\114.2578\\-254.8608\\187\\112.8673\\-256.8984\\187\\111.3641\\-258.8516\\187\\108.7963\\-262.7578\\187\\105.4511\\-266.6641\\187\\104.4922\\-267.9077\\187\\102.1027\\-270.5703\\187\\98.63281\\-274.1315\\187\\96.24301\\-276.4297\\187\\90.82031\\-281.1552\\187\\88.86719\\-282.7317\\187\\86.91406\\-283.9664\\187\\84.96094\\-285.4324\\187\\83.00781\\-287.0122\\187\\81.05469\\-288.3377\\187\\79.10156\\-289.342\\187\\77.14844\\-290.6792\\187\\71.28906\\-294.1956\\187\\67.38281\\-295.8438\\187\\65.42969\\-296.7682\\187\\63.47656\\-297.4131\\187\\61.52344\\-298.4713\\187\\59.57031\\-299.0658\\187\\57.61719\\-299.9202\\187\\55.66406\\-300.601\\187\\51.75781\\-301.591\\187\\49.80469\\-302.3607\\187\\45.89844\\-303.0227\\187\\43.94531\\-303.5525\\187\\41.99219\\-304.2173\\187\\36.13281\\-305.2681\\187\\34.17969\\-305.8351\\187\\32.22656\\-306.2348\\187\\24.41406\\-307.2205\\187\\20.50781\\-307.8619\\187\\18.55469\\-308.0982\\187\\14.64844\\-308.3894\\187\\8.789063\\-308.6207\\187\\0.9765625\\-308.7551\\187\\-6.835938\\-308.6974\\187\\-12.69531\\-308.5484\\187\\-18.55469\\-308.2001\\187" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "248" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "220" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-26.36719\\-307.3427\\189\\-30.27344\\-306.7463\\189\\-34.17969\\-306.2546\\189\\-36.13281\\-305.7932\\189\\-38.08594\\-305.1579\\189\\-41.99219\\-304.3307\\189\\-43.94531\\-303.5752\\189\\-45.89844\\-303.0025\\189\\-47.85156\\-302.6582\\189\\-49.80469\\-302.1553\\189\\-51.75781\\-301.332\\189\\-55.66406\\-300.1905\\189\\-57.61719\\-299.1392\\189\\-59.57031\\-298.3806\\189\\-61.52344\\-297.2805\\189\\-63.47656\\-296.5942\\189\\-65.42969\\-295.4897\\189\\-67.38281\\-294.7708\\189\\-69.33594\\-293.6185\\189\\-71.28906\\-292.6515\\189\\-73.24219\\-291.2636\\189\\-75.19531\\-290.1978\\189\\-77.14844\\-289.0199\\189\\-79.10156\\-287.7289\\189\\-81.05469\\-286.5534\\189\\-86.91406\\-281.9491\\189\\-88.86719\\-280.6097\\189\\-96.67969\\-273.686\\189\\-100.5859\\-269.8737\\189\\-102.5391\\-268.1403\\189\\-105.6706\\-264.7109\\189\\-107.6213\\-262.7578\\189\\-109.4012\\-260.8047\\189\\-111.0528\\-258.8516\\189\\-114.2578\\-254.8624\\189\\-116.9727\\-251.0391\\189\\-119.3438\\-247.1328\\189\\-120.7546\\-245.1797\\189\\-121.7542\\-243.2266\\189\\-122.8676\\-241.2734\\189\\-123.4986\\-239.3203\\189\\-124.577\\-237.3672\\189\\-125.1919\\-235.4141\\189\\-126.113\\-233.4609\\189\\-126.8523\\-231.5078\\189\\-127.4893\\-229.5547\\189\\-128.3268\\-227.6016\\189\\-129.2468\\-223.6953\\189\\-130.4232\\-219.7891\\189\\-131.0354\\-215.8828\\189\\-131.3968\\-213.9297\\189\\-131.9444\\-211.9766\\189\\-132.3753\\-210.0234\\189\\-132.6447\\-208.0703\\189\\-133.3407\\-202.2109\\189\\-133.8976\\-198.3047\\189\\-134.0709\\-196.3516\\189\\-134.2891\\-190.4922\\189\\-134.318\\-186.5859\\189\\-134.2861\\-182.6797\\189\\-134.1584\\-178.7734\\189\\-133.8838\\-174.8672\\189\\-133.0754\\-169.0078\\189\\-132.5899\\-165.1016\\189\\-132.2825\\-163.1484\\189\\-131.2354\\-159.2422\\189\\-130.6463\\-155.3359\\189\\-130.2178\\-153.3828\\189\\-129.562\\-151.4297\\189\\-129.0782\\-149.4766\\189\\-128.7121\\-147.5234\\189\\-128.1105\\-145.5703\\189\\-127.2961\\-143.6172\\189\\-126.7198\\-141.6641\\189\\-125.8176\\-139.7109\\189\\-125.0721\\-137.7578\\189\\-124.4495\\-135.8047\\189\\-123.4455\\-133.8516\\189\\-122.8201\\-131.8984\\189\\-121.7244\\-129.9453\\189\\-120.782\\-127.9922\\189\\-119.4042\\-126.0391\\189\\-117.0435\\-122.1328\\189\\-116.2109\\-120.9075\\189\\-114.2578\\-118.3984\\189\\-112.3047\\-116.0451\\189\\-108.7935\\-112.3672\\189\\-106.4453\\-110.3005\\189\\-103.9855\\-108.4609\\189\\-100.5859\\-106.2057\\189\\-98.63281\\-105.3162\\189\\-96.67969\\-104.1458\\189\\-94.72656\\-103.4208\\189\\-92.77344\\-102.534\\189\\-90.82031\\-101.894\\189\\-86.91406\\-100.9902\\189\\-84.96094\\-100.3158\\189\\-83.00781\\-99.90411\\189\\-79.10156\\-99.47099\\189\\-77.14844\\-99.15147\\189\\-73.24219\\-98.26994\\189\\-71.28906\\-98.01884\\189\\-63.47656\\-97.2571\\189\\-57.61719\\-96.46036\\189\\-53.71094\\-96.14752\\189\\-49.80469\\-95.93274\\189\\-45.89844\\-95.77094\\189\\-41.99219\\-95.66138\\189\\-34.17969\\-95.60287\\189\\-28.32031\\-95.7388\\189\\-24.41406\\-95.90739\\189\\-20.50781\\-96.18655\\189\\-18.55469\\-96.4831\\189\\-14.64844\\-97.43895\\189\\-10.74219\\-98.23959\\189\\-8.789063\\-99.1506\\189\\-4.882813\\-100.4173\\189\\-2.929688\\-101.3146\\189\\-0.9765625\\-101.7368\\189\\0.9765625\\-102.0156\\189\\2.929688\\-102.1409\\189\\4.882813\\-102.0771\\189\\6.835938\\-101.8823\\189\\8.789063\\-101.5707\\189\\10.74219\\-100.9789\\189\\12.69531\\-100.082\\189\\16.60156\\-99.05106\\189\\18.55469\\-98.42294\\189\\22.46094\\-97.70808\\189\\26.36719\\-97.29441\\189\\28.32031\\-96.99487\\189\\30.27344\\-96.56654\\189\\32.22656\\-96.25706\\189\\34.17969\\-96.05389\\189\\41.99219\\-95.63654\\189\\49.80469\\-95.10751\\189\\53.71094\\-94.79707\\189\\55.66406\\-94.71761\\189\\61.52344\\-94.78112\\189\\65.42969\\-95.01498\\189\\73.24219\\-95.87354\\189\\75.19531\\-96.1197\\189\\77.14844\\-96.5525\\189\\79.10156\\-97.19711\\189\\83.00781\\-98.1349\\189\\84.96094\\-98.90825\\189\\86.91406\\-99.52826\\189\\88.86719\\-100.0421\\189\\90.82031\\-101.0003\\189\\92.77344\\-101.7315\\189\\94.48242\\-102.6016\\189\\96.67969\\-103.8397\\189\\98.63281\\-105.2633\\189\\100.5859\\-106.3081\\189\\102.5391\\-107.5936\\189\\104.4922\\-109.0443\\189\\108.5108\\-112.3672\\189\\110.3516\\-114.0863\\189\\112.3047\\-116.0893\\189\\114.2578\\-118.2899\\189\\116.2109\\-120.677\\189\\118.556\\-124.0859\\189\\119.5851\\-126.0391\\189\\120.9062\\-127.9922\\189\\122.8258\\-131.8984\\189\\123.431\\-133.8516\\189\\124.4259\\-135.8047\\189\\125.0159\\-137.7578\\189\\125.7147\\-139.7109\\189\\126.6436\\-141.6641\\189\\127.1647\\-143.6172\\189\\127.9297\\-145.6642\\189\\128.5228\\-147.5234\\189\\128.889\\-149.4766\\189\\129.5157\\-153.3828\\189\\130.3206\\-157.2891\\189\\130.6995\\-161.1953\\189\\130.8862\\-165.1016\\189\\131.0965\\-170.9609\\189\\131.2102\\-176.8203\\189\\131.2182\\-180.7266\\189\\131.1303\\-188.5391\\189\\130.9184\\-198.3047\\189\\130.7174\\-206.1172\\189\\130.3875\\-211.9766\\189\\130.1505\\-213.9297\\189\\129.4691\\-217.8359\\189\\128.6404\\-223.6953\\189\\128.2266\\-225.6484\\189\\127.469\\-227.6016\\189\\126.3148\\-231.5078\\189\\125.3662\\-233.4609\\189\\124.8273\\-235.4141\\189\\123.1667\\-239.3203\\189\\122.484\\-241.2734\\189\\121.2925\\-243.2266\\189\\120.1172\\-245.3938\\189\\118.1641\\-248.6798\\189\\117.8215\\-249.0859\\189\\116.9194\\-251.0391\\189\\115.6212\\-252.9922\\189\\114.4913\\-254.9453\\189\\113.0703\\-256.8984\\189\\111.5369\\-258.8516\\189\\110.3599\\-260.8047\\189\\109.0113\\-262.7578\\189\\105.6802\\-266.6641\\189\\104.4922\\-268.1929\\189\\102.4228\\-270.5703\\189\\100.609\\-272.5234\\189\\98.63281\\-274.4853\\189\\96.56634\\-276.4297\\189\\90.82031\\-281.3851\\189\\88.86719\\-282.9465\\189\\84.96094\\-285.7274\\189\\81.05469\\-288.6571\\189\\79.10156\\-289.533\\189\\78.37975\\-290.1016\\189\\75.19531\\-292.2163\\189\\73.24219\\-293.2855\\189\\71.28906\\-294.5095\\189\\69.33594\\-295.2055\\189\\67.38281\\-296.2266\\189\\63.47656\\-297.7439\\189\\61.52344\\-298.668\\189\\59.57031\\-299.2883\\189\\57.61719\\-300.2169\\189\\53.71094\\-301.2131\\189\\49.80469\\-302.51\\189\\45.89844\\-303.172\\189\\41.99219\\-304.3877\\189\\38.08594\\-305.0351\\189\\36.13281\\-305.4908\\189\\34.17969\\-306.0731\\189\\32.22656\\-306.3794\\189\\28.32031\\-306.8576\\189\\24.41406\\-307.4178\\189\\22.46094\\-307.7915\\189\\18.55469\\-308.2441\\189\\14.64844\\-308.5005\\189\\8.789063\\-308.7154\\189\\4.882813\\-308.8065\\189\\0.9765625\\-308.8458\\189\\-4.882813\\-308.8296\\189\\-12.69531\\-308.6621\\189\\-16.60156\\-308.4814\\189\\-20.50781\\-308.2222\\189\\-22.46094\\-308.028\\189" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "241" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "221" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-24.41406\\-307.9914\\191\\-30.27344\\-306.9487\\191\\-34.17969\\-306.4459\\191\\-36.13281\\-306.133\\191\\-38.08594\\-305.4639\\191\\-40.03906\\-304.9402\\191\\-41.99219\\-304.5319\\191\\-43.94531\\-304.0092\\191\\-45.89844\\-303.2234\\191\\-49.80469\\-302.4227\\191\\-51.75781\\-301.619\\191\\-55.66406\\-300.4483\\191\\-57.61719\\-299.1766\\191\\-59.57031\\-298.4283\\191\\-61.52344\\-297.5596\\191\\-63.47656\\-296.8004\\191\\-65.42969\\-295.7687\\191\\-67.38281\\-294.9604\\191\\-69.29977\\-294.0078\\191\\-71.28906\\-292.8893\\191\\-73.24219\\-291.5215\\191\\-75.19531\\-290.5322\\191\\-77.14844\\-289.2054\\191\\-79.00391\\-288.1484\\191\\-81.05469\\-286.8483\\191\\-84.31244\\-284.2422\\191\\-84.96094\\-283.6617\\191\\-86.91406\\-282.3623\\191\\-88.86719\\-280.9259\\191\\-92.77344\\-277.3624\\191\\-96.19928\\-274.4766\\191\\-100.5859\\-270.2473\\191\\-102.478\\-268.6172\\191\\-106.0217\\-264.7109\\191\\-108.3984\\-262.3015\\191\\-112.3047\\-257.6547\\191\\-114.6361\\-254.9453\\191\\-115.8526\\-252.9922\\191\\-118.5988\\-249.0859\\191\\-119.7043\\-247.1328\\191\\-121.0438\\-245.1797\\191\\-122.2176\\-243.2266\\191\\-123.8906\\-239.3203\\191\\-124.8372\\-237.3672\\191\\-125.4979\\-235.4141\\191\\-126.5077\\-233.4609\\191\\-127.1277\\-231.5078\\191\\-128.6222\\-227.6016\\191\\-129.584\\-223.6953\\191\\-130.2886\\-221.7422\\191\\-130.6908\\-219.7891\\191\\-131.3445\\-215.8828\\191\\-131.958\\-213.9297\\191\\-132.3996\\-211.9766\\191\\-133.2101\\-206.1172\\191\\-133.8698\\-202.2109\\191\\-134.1482\\-200.2578\\191\\-134.4085\\-196.3516\\191\\-134.5735\\-190.4922\\191\\-134.5949\\-186.5859\\191\\-134.5147\\-180.7266\\191\\-134.2448\\-174.8672\\191\\-134.0709\\-172.9141\\191\\-133.054\\-167.0547\\191\\-132.4992\\-163.1484\\191\\-132.1289\\-161.1953\\191\\-131.5104\\-159.2422\\191\\-131.067\\-157.2891\\191\\-130.4764\\-153.3828\\191\\-129.2637\\-149.4766\\191\\-128.8944\\-147.5234\\191\\-128.4084\\-145.5703\\191\\-127.6381\\-143.6172\\191\\-126.3193\\-139.7109\\191\\-125.3355\\-137.7578\\191\\-124.7403\\-135.8047\\191\\-123.8158\\-133.8516\\191\\-122.2141\\-129.9453\\191\\-121.0706\\-127.9922\\191\\-119.7527\\-126.0391\\191\\-118.5889\\-124.0859\\191\\-116.2109\\-120.5374\\191\\-114.4907\\-118.2266\\191\\-112.3047\\-115.7958\\191\\-108.9331\\-112.3672\\191\\-106.4453\\-110.2319\\191\\-104.4922\\-108.9277\\191\\-102.5391\\-107.478\\191\\-100.5859\\-106.1823\\191\\-98.63281\\-105.2973\\191\\-96.67969\\-104.124\\191\\-94.72656\\-103.4163\\191\\-92.77344\\-102.534\\191\\-90.82031\\-101.894\\191\\-86.91406\\-101.0267\\191\\-84.96094\\-100.3419\\191\\-83.00781\\-99.93108\\191\\-79.10156\\-99.48877\\191\\-77.14844\\-99.19305\\191\\-73.24219\\-98.31828\\191\\-71.28906\\-98.05977\\191\\-63.47656\\-97.34619\\191\\-59.57031\\-96.89079\\191\\-57.61719\\-96.60675\\191\\-53.71094\\-96.24242\\191\\-49.80469\\-96.019\\191\\-43.94531\\-95.8074\\191\\-38.08594\\-95.73325\\191\\-32.22656\\-95.76031\\191\\-26.36719\\-95.95988\\191\\-22.46094\\-96.18974\\191\\-20.50781\\-96.4061\\191\\-16.60156\\-97.30756\\191\\-12.69531\\-98.0038\\191\\-10.74219\\-98.54671\\191\\-8.789063\\-99.37231\\191\\-6.835938\\-99.88756\\191\\-4.882813\\-100.7358\\191\\-2.929688\\-101.4724\\191\\-0.9765625\\-101.8973\\191\\0.9765625\\-102.192\\191\\2.929688\\-102.3762\\191\\4.882813\\-102.2804\\191\\6.835938\\-102.053\\191\\8.789063\\-101.725\\191\\10.74219\\-101.2036\\191\\12.69531\\-100.2849\\191\\20.50781\\-98.24871\\191\\22.46094\\-97.91949\\191\\26.36719\\-97.5203\\191\\28.32031\\-97.24833\\191\\32.22656\\-96.50317\\191\\36.13281\\-96.09706\\191\\40.03906\\-95.88904\\191\\47.85156\\-95.39242\\191\\53.71094\\-95.0528\\191\\57.61719\\-94.94561\\191\\61.52344\\-94.98731\\191\\65.42969\\-95.22088\\191\\69.33594\\-95.57146\\191\\73.24219\\-95.98807\\191\\75.19531\\-96.2569\\191\\79.10156\\-97.31696\\191\\83.00781\\-98.26994\\191\\84.96094\\-99.05726\\191\\88.86719\\-100.0951\\191\\90.82031\\-101.0739\\191\\92.77344\\-101.7789\\191\\96.67969\\-103.8822\\191\\98.63281\\-105.2973\\191\\100.5859\\-106.364\\191\\102.5391\\-107.5936\\191\\104.4922\\-109.0534\\191\\108.5598\\-112.3672\\191\\110.3516\\-114.0289\\191\\112.3047\\-116.0177\\191\\114.2662\\-118.2266\\191\\116.2109\\-120.5758\\191\\118.6276\\-124.0859\\191\\119.6781\\-126.0391\\191\\120.9772\\-127.9922\\191\\122.9065\\-131.8984\\191\\123.5522\\-133.8516\\191\\124.5667\\-135.8047\\191\\125.1309\\-137.7578\\191\\126.7671\\-141.6641\\191\\127.3193\\-143.6172\\191\\128.1334\\-145.5703\\191\\128.649\\-147.5234\\191\\129.3164\\-151.4297\\191\\130.2013\\-155.3359\\191\\130.511\\-157.2891\\191\\130.6928\\-159.2422\\191\\131.0167\\-165.1016\\191\\131.2805\\-170.9609\\191\\131.4361\\-176.8203\\191\\131.4573\\-180.7266\\191\\131.4026\\-184.6328\\191\\131.0404\\-198.3047\\191\\130.8157\\-206.1172\\191\\130.6629\\-210.0234\\191\\130.3678\\-213.9297\\191\\130.1104\\-215.8828\\191\\129.3331\\-219.7891\\191\\128.7511\\-223.6953\\191\\128.3809\\-225.6484\\191\\127.0358\\-229.5547\\191\\126.5024\\-231.5078\\191\\125.5418\\-233.4609\\191\\124.936\\-235.4141\\191\\124.1936\\-237.3672\\191\\123.2557\\-239.3203\\191\\122.6071\\-241.2734\\191\\121.4252\\-243.2266\\191\\120.5117\\-245.1797\\191\\119.2082\\-247.1328\\191\\118.0753\\-249.0859\\191\\117.0755\\-251.0391\\191\\115.808\\-252.9922\\191\\114.7494\\-254.9453\\191\\111.7763\\-258.8516\\191\\110.6649\\-260.8047\\191\\109.21\\-262.7578\\191\\102.7517\\-270.5703\\191\\100.9498\\-272.5234\\191\\98.63281\\-274.8021\\191\\94.6841\\-278.3828\\191\\90.00788\\-282.2891\\191\\86.91406\\-284.6826\\191\\81.05469\\-288.8777\\191\\79.10156\\-289.813\\191\\77.14844\\-291.1406\\191\\75.19531\\-292.5665\\191\\73.24219\\-293.5645\\191\\71.28906\\-294.7402\\191\\69.33594\\-295.4169\\191\\67.38281\\-296.493\\191\\65.42969\\-297.1095\\191\\63.47656\\-298.1258\\191\\59.57031\\-299.5439\\191\\57.61719\\-300.4192\\191\\53.71094\\-301.3722\\191\\51.75781\\-302.1147\\191\\49.80469\\-302.6214\\191\\47.85156\\-302.9156\\191\\45.89844\\-303.3401\\191\\43.94531\\-304.0553\\191\\41.99219\\-304.5168\\191\\38.08594\\-305.2007\\191\\36.13281\\-305.7787\\191\\34.17969\\-306.2515\\191\\28.32031\\-306.9991\\191\\22.46094\\-307.9892\\191\\18.55469\\-308.3615\\191\\14.64844\\-308.5916\\191\\8.789063\\-308.8065\\191\\4.882813\\-308.8847\\191\\-0.9765625\\-308.9452\\191\\-6.835938\\-308.8918\\191\\-12.69531\\-308.7667\\191\\-20.50781\\-308.3938\\191" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "239" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "222" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-26.36719\\-307.9292\\193\\-28.32031\\-307.4829\\193\\-30.27344\\-307.1688\\193\\-36.13281\\-306.3322\\193\\-38.08594\\-305.8486\\193\\-40.03906\\-305.1497\\193\\-43.94531\\-304.2984\\193\\-45.89844\\-303.5116\\193\\-47.85156\\-302.9403\\193\\-49.80469\\-302.591\\193\\-51.75781\\-301.9375\\193\\-53.71094\\-301.1714\\193\\-55.66406\\-300.6427\\193\\-56.91964\\-299.8672\\193\\-57.61719\\-299.1953\\193\\-59.57031\\-298.4194\\193\\-61.52344\\-297.9368\\193\\-63.47656\\-296.9702\\193\\-65.42969\\-296.1473\\193\\-67.38281\\-295.1299\\193\\-69.33594\\-294.338\\193\\-72.99107\\-292.0547\\193\\-75.19531\\-290.7868\\193\\-77.14844\\-289.431\\193\\-79.10156\\-288.4518\\193\\-82.24655\\-286.1953\\193\\-84.96094\\-283.9884\\193\\-86.91406\\-282.6984\\193\\-88.86719\\-281.1758\\193\\-92.77344\\-277.6311\\193\\-94.72656\\-275.9884\\193\\-96.67039\\-274.4766\\193\\-98.60689\\-272.5234\\193\\-102.5391\\-268.9375\\193\\-104.4922\\-266.8894\\193\\-106.437\\-264.7109\\193\\-108.3984\\-262.7486\\193\\-110.3516\\-260.4395\\193\\-111.553\\-258.8516\\193\\-114.9369\\-254.9453\\193\\-116.299\\-252.9922\\193\\-117.4759\\-251.0391\\193\\-118.1641\\-250.1551\\193\\-120.2257\\-247.1328\\193\\-122.0703\\-243.959\\193\\-122.5789\\-243.2266\\193\\-123.2879\\-241.2734\\193\\-124.349\\-239.3203\\193\\-125.0603\\-237.3672\\193\\-126.7965\\-233.4609\\193\\-127.4507\\-231.5078\\193\\-128.3529\\-229.5547\\193\\-129.3351\\-225.6484\\193\\-130.0721\\-223.6953\\193\\-130.6033\\-221.7422\\193\\-131.2913\\-217.8359\\193\\-132.4107\\-213.9297\\193\\-133.0046\\-210.0234\\193\\-134.0614\\-204.1641\\193\\-134.4604\\-200.2578\\193\\-134.7332\\-194.3984\\193\\-134.8489\\-186.5859\\193\\-134.7547\\-180.7266\\193\\-134.4889\\-174.8672\\193\\-134.1167\\-170.9609\\193\\-133.3069\\-167.0547\\193\\-132.401\\-161.1953\\193\\-131.9167\\-159.2422\\193\\-131.2982\\-157.2891\\193\\-130.6723\\-153.3828\\193\\-130.2296\\-151.4297\\193\\-129.5131\\-149.4766\\193\\-128.6621\\-145.5703\\193\\-128.1092\\-143.6172\\193\\-127.2846\\-141.6641\\193\\-126.6781\\-139.7109\\193\\-125.7506\\-137.7578\\193\\-124.3115\\-133.8516\\193\\-123.2926\\-131.8984\\193\\-122.618\\-129.9453\\193\\-121.3763\\-127.9922\\193\\-120.2325\\-126.0391\\193\\-117.4497\\-122.1328\\193\\-116.2195\\-120.1797\\193\\-114.7629\\-118.2266\\193\\-112.3047\\-115.5101\\193\\-109.1291\\-112.3672\\193\\-106.4453\\-110.1682\\193\\-100.5859\\-106.1348\\193\\-98.63281\\-105.2739\\193\\-96.67969\\-104.1026\\193\\-94.72656\\-103.4055\\193\\-92.77344\\-102.534\\193\\-90.82031\\-101.894\\193\\-86.91406\\-101.0486\\193\\-84.96094\\-100.3934\\193\\-83.00781\\-99.95089\\193\\-77.14844\\-99.23853\\193\\-73.24219\\-98.36979\\193\\-71.28906\\-98.10297\\193\\-63.47656\\-97.41661\\193\\-59.57031\\-97.01456\\193\\-55.66406\\-96.49471\\193\\-53.71094\\-96.32624\\193\\-49.80469\\-96.10367\\193\\-43.94531\\-95.89548\\193\\-38.08594\\-95.83874\\193\\-34.17969\\-95.84354\\193\\-28.32031\\-96.00845\\193\\-24.41406\\-96.21722\\193\\-22.46094\\-96.39567\\193\\-20.50781\\-96.73456\\193\\-18.55469\\-97.19054\\193\\-14.64844\\-97.83894\\193\\-12.69531\\-98.23056\\193\\-10.74219\\-98.95905\\193\\-6.835938\\-100.0509\\193\\-4.882813\\-101.029\\193\\-2.929688\\-101.6309\\193\\0.9765625\\-102.4247\\193\\2.929688\\-102.6713\\193\\4.882813\\-102.5494\\193\\8.789063\\-101.8472\\193\\10.74219\\-101.3523\\193\\12.69531\\-100.5156\\193\\14.64844\\-99.8922\\193\\18.55469\\-99.04854\\193\\20.50781\\-98.52093\\193\\22.46094\\-98.15278\\193\\28.32031\\-97.43506\\193\\34.17969\\-96.52748\\193\\38.08594\\-96.14948\\193\\49.80469\\-95.40485\\193\\53.71094\\-95.21796\\193\\57.61719\\-95.13086\\193\\61.52344\\-95.18106\\193\\67.38281\\-95.50521\\193\\73.24219\\-96.07459\\193\\75.19531\\-96.39342\\193\\77.14844\\-96.94304\\193\\81.05469\\-97.7848\\193\\83.00781\\-98.39135\\193\\84.96094\\-99.19002\\193\\88.86719\\-100.1703\\193\\90.82031\\-101.147\\193\\92.77344\\-101.8334\\193\\96.67969\\-103.9295\\193\\98.63281\\-105.3394\\193\\100.5859\\-106.4071\\193\\102.5391\\-107.6064\\193\\106.2073\\-110.4141\\193\\108.5904\\-112.3672\\193\\110.3516\\-114.0025\\193\\112.3047\\-115.9631\\193\\114.3627\\-118.2266\\193\\116.2109\\-120.4896\\193\\118.6908\\-124.0859\\193\\119.7664\\-126.0391\\193\\121.0438\\-127.9922\\193\\122.1542\\-129.9453\\193\\122.9797\\-131.8984\\193\\123.6834\\-133.8516\\193\\124.6802\\-135.8047\\193\\125.2441\\-137.7578\\193\\126.2356\\-139.7109\\193\\127.4921\\-143.6172\\193\\128.3008\\-145.5703\\193\\128.7676\\-147.5234\\193\\129.4992\\-151.4297\\193\\130.0278\\-153.3828\\193\\130.4196\\-155.3359\\193\\130.6676\\-157.2891\\193\\131.183\\-165.1016\\193\\131.6406\\-172.9141\\193\\131.828\\-178.7734\\193\\131.7082\\-184.6328\\193\\131.2382\\-196.3516\\193\\130.7761\\-210.0234\\193\\130.5442\\-213.9297\\193\\130.3443\\-215.8828\\193\\129.9688\\-217.8359\\193\\129.4936\\-219.7891\\193\\128.5156\\-225.6484\\193\\127.9297\\-227.5441\\193\\127.1797\\-229.5547\\193\\126.651\\-231.5078\\193\\125.7324\\-233.4609\\193\\124.3581\\-237.3672\\193\\123.3454\\-239.3203\\193\\122.7193\\-241.2734\\193\\121.5758\\-243.2266\\193\\120.6913\\-245.1797\\193\\119.3656\\-247.1328\\193\\118.3758\\-249.0859\\193\\116.2109\\-252.8912\\193\\114.981\\-254.9453\\193\\112.0718\\-258.8516\\193\\110.8897\\-260.8047\\193\\109.3945\\-262.7578\\193\\103.0238\\-270.5703\\193\\101.1955\\-272.5234\\193\\98.63281\\-275.0597\\193\\95.03455\\-278.3828\\193\\90.31042\\-282.2891\\193\\88.86719\\-283.3278\\193\\84.96094\\-286.5087\\193\\81.05469\\-289.0522\\193\\77.14844\\-291.4098\\193\\75.19531\\-292.8458\\193\\71.28906\\-294.9294\\193\\69.33594\\-295.6872\\193\\67.38281\\-296.6862\\193\\65.42969\\-297.297\\193\\63.47656\\-298.3788\\193\\61.52344\\-299.0101\\193\\59.52229\\-299.8672\\193\\57.61719\\-300.563\\193\\53.71094\\-301.5671\\193\\51.75781\\-302.3186\\193\\49.80469\\-302.7239\\193\\47.85156\\-303.0133\\193\\45.89844\\-303.524\\193\\43.94531\\-304.2443\\193\\40.03906\\-304.9852\\193\\38.08594\\-305.4076\\193\\36.13281\\-306.0414\\193\\34.17969\\-306.39\\193\\30.27344\\-306.8817\\193\\26.36719\\-307.4961\\193\\24.41406\\-307.875\\193\\22.46094\\-308.145\\193\\18.55469\\-308.4573\\193\\12.69531\\-308.7498\\193\\4.882813\\-308.9916\\193\\-0.9765625\\-309.0862\\193\\-4.882813\\-309.0481\\193\\-12.69531\\-308.8458\\193\\-20.50781\\-308.5193\\193\\-24.41406\\-308.1906\\193" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "238" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "223" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-28.32031\\-307.7344\\195\\-36.13281\\-306.5047\\195\\-38.08594\\-306.133\\195\\-40.03906\\-305.4256\\195\\-41.99219\\-304.8917\\195\\-43.94531\\-304.5046\\195\\-45.89844\\-303.882\\195\\-47.85156\\-303.1087\\195\\-49.80469\\-302.7127\\195\\-51.75781\\-302.2039\\195\\-53.71094\\-301.3659\\195\\-55.66406\\-300.8035\\195\\-57.60528\\-299.8672\\195\\-59.57031\\-298.7537\\195\\-61.52344\\-298.2834\\195\\-63.47656\\-297.1362\\195\\-65.42969\\-296.4263\\195\\-67.38281\\-295.2824\\195\\-69.33594\\-294.5925\\195\\-71.28906\\-293.3345\\195\\-73.55368\\-292.0547\\195\\-76.69442\\-290.1016\\195\\-77.14844\\-289.7153\\195\\-79.10156\\-288.7397\\195\\-82.6656\\-286.1953\\195\\-85.15083\\-284.2422\\195\\-86.91406\\-282.9727\\195\\-90.13052\\-280.3359\\195\\-92.77344\\-277.9402\\195\\-96.67969\\-274.8504\\195\\-99.00145\\-272.5234\\195\\-101.1429\\-270.5703\\195\\-104.4922\\-267.2294\\195\\-106.4453\\-265.0892\\195\\-108.7752\\-262.7578\\195\\-110.4574\\-260.8047\\195\\-111.8699\\-258.8516\\195\\-115.1966\\-254.9453\\195\\-116.6676\\-252.9922\\195\\-117.7215\\-251.0391\\195\\-120.6352\\-247.1328\\195\\-121.6784\\-245.1797\\195\\-122.8453\\-243.2266\\195\\-123.5318\\-241.2734\\195\\-124.6487\\-239.3203\\195\\-125.3078\\-237.3672\\195\\-126.3977\\-235.4141\\195\\-127.0752\\-233.4609\\195\\-128.6426\\-229.5547\\195\\-129.1274\\-227.6016\\195\\-129.7226\\-225.6484\\195\\-130.4362\\-223.6953\\195\\-131.175\\-219.7891\\195\\-132.3442\\-215.8828\\195\\-133.3696\\-210.0234\\195\\-133.8412\\-208.0703\\195\\-134.4079\\-204.1641\\195\\-134.8386\\-198.3047\\195\\-134.9995\\-194.3984\\195\\-135.1427\\-186.5859\\195\\-135.0068\\-180.7266\\195\\-134.8311\\-176.8203\\195\\-134.3592\\-170.9609\\195\\-134.1146\\-169.0078\\195\\-133.2368\\-165.1016\\195\\-132.2798\\-159.2422\\195\\-131.6658\\-157.2891\\195\\-131.1594\\-155.3359\\195\\-130.4803\\-151.4297\\195\\-129.8421\\-149.4766\\195\\-129.3351\\-147.5234\\195\\-128.4618\\-143.6172\\195\\-127.6659\\-141.6641\\195\\-126.2999\\-137.7578\\195\\-125.269\\-135.8047\\195\\-124.6525\\-133.8516\\195\\-123.57\\-131.8984\\195\\-122.9047\\-129.9453\\195\\-120.6481\\-126.0391\\195\\-119.096\\-124.0859\\195\\-117.7228\\-122.1328\\195\\-116.4932\\-120.1797\\195\\-115.0145\\-118.2266\\195\\-112.3047\\-115.2765\\195\\-109.2948\\-112.3672\\195\\-106.4453\\-110.0511\\195\\-104.1379\\-108.4609\\195\\-100.5859\\-106.1026\\195\\-98.63281\\-105.2623\\195\\-96.67969\\-104.0905\\195\\-94.72656\\-103.3991\\195\\-92.77344\\-102.5486\\195\\-90.82031\\-101.9057\\195\\-86.91406\\-101.0698\\195\\-84.96094\\-100.4191\\195\\-83.00781\\-99.96669\\195\\-77.14844\\-99.26799\\195\\-75.19531\\-98.90509\\195\\-73.24219\\-98.43623\\195\\-71.28906\\-98.1412\\195\\-59.57031\\-97.09324\\195\\-55.66406\\-96.59358\\195\\-51.75781\\-96.28022\\195\\-43.94531\\-95.98899\\195\\-38.08594\\-95.92063\\195\\-34.17969\\-95.94743\\195\\-30.27344\\-96.06123\\195\\-26.36719\\-96.24242\\195\\-24.41406\\-96.4061\\195\\-22.46094\\-96.69\\195\\-20.50781\\-97.106\\195\\-14.64844\\-98.03902\\195\\-12.69531\\-98.54671\\195\\-10.74219\\-99.27013\\195\\-8.789063\\-99.71703\\195\\-6.835938\\-100.2734\\195\\-4.882813\\-101.2489\\195\\-2.929688\\-101.7887\\195\\0.9765625\\-102.7421\\195\\2.929688\\-102.9669\\195\\4.882813\\-102.8615\\195\\6.835938\\-102.4388\\195\\10.74219\\-101.4794\\195\\14.64844\\-100.0247\\195\\20.50781\\-98.85186\\195\\22.46094\\-98.36979\\195\\24.41406\\-98.06715\\195\\32.22656\\-97.12376\\195\\36.13281\\-96.52899\\195\\38.08594\\-96.29559\\195\\45.89844\\-95.72765\\195\\53.71094\\-95.3498\\195\\59.57031\\-95.27734\\195\\61.52344\\-95.32585\\195\\67.38281\\-95.61581\\195\\73.24219\\-96.16077\\195\\75.19531\\-96.50646\\195\\77.14844\\-97.09324\\195\\79.10156\\-97.42175\\195\\81.05469\\-97.84834\\195\\83.00781\\-98.50831\\195\\84.96094\\-99.28735\\195\\86.91406\\-99.71116\\195\\88.86719\\-100.2398\\195\\90.82031\\-101.2036\\195\\92.77344\\-101.8886\\195\\94.72656\\-102.9857\\195\\96.67969\\-103.9616\\195\\98.63281\\-105.3695\\195\\100.5859\\-106.4375\\195\\102.5391\\-107.6321\\195\\106.2073\\-110.4141\\195\\108.6053\\-112.3672\\195\\110.3516\\-113.977\\195\\112.3047\\-115.9137\\195\\114.4516\\-118.2266\\195\\116.2109\\-120.3999\\195\\117.344\\-122.1328\\195\\118.7443\\-124.0859\\195\\122.2929\\-129.9453\\195\\123.8312\\-133.8516\\195\\124.7667\\-135.8047\\195\\125.3834\\-137.7578\\195\\126.4287\\-139.7109\\195\\127.0109\\-141.6641\\195\\128.4335\\-145.5703\\195\\129.2509\\-149.4766\\195\\130.2637\\-153.3828\\195\\130.5804\\-155.3359\\195\\130.7872\\-157.2891\\195\\131.2226\\-163.1484\\195\\131.9167\\-170.9609\\195\\132.1178\\-174.8672\\195\\132.2029\\-178.7734\\195\\132.1399\\-182.6797\\195\\131.9167\\-188.5391\\195\\131.5381\\-194.3984\\195\\131.2718\\-200.2578\\195\\130.7932\\-211.9766\\195\\130.5194\\-215.8828\\195\\130.2154\\-217.8359\\195\\129.302\\-221.7422\\195\\128.633\\-225.6484\\195\\128.1305\\-227.6016\\195\\127.3345\\-229.5547\\195\\126.7568\\-231.5078\\195\\125.102\\-235.4141\\195\\124.4894\\-237.3672\\195\\123.421\\-239.3203\\195\\122.8333\\-241.2734\\195\\121.7493\\-243.2266\\195\\120.8469\\-245.1797\\195\\119.5348\\-247.1328\\195\\118.6096\\-249.0859\\195\\117.3765\\-251.0391\\195\\116.4952\\-252.9922\\195\\115.1801\\-254.9453\\195\\113.7463\\-256.8984\\195\\112.4453\\-258.8516\\195\\110.3516\\-261.7898\\195\\106.5119\\-266.6641\\195\\103.2597\\-270.5703\\195\\101.4359\\-272.5234\\195\\98.63281\\-275.3008\\195\\95.32374\\-278.3828\\195\\92.77344\\-280.6223\\195\\90.66068\\-282.2891\\195\\88.86719\\-283.5844\\195\\88.13852\\-284.2422\\195\\84.96094\\-286.8097\\195\\82.93431\\-288.1484\\195\\81.05469\\-289.2015\\195\\79.10156\\-290.6186\\195\\73.24219\\-294.3001\\195\\71.28906\\-295.1003\\195\\67.38281\\-296.8355\\195\\65.42969\\-297.5116\\195\\63.47656\\-298.5597\\195\\61.52344\\-299.1847\\195\\59.57031\\-300.1199\\195\\57.61719\\-300.6887\\195\\55.66406\\-301.1505\\195\\51.75781\\-302.4651\\195\\47.85156\\-303.1282\\195\\43.94531\\-304.3805\\195\\40.03906\\-305.1218\\195\\36.13281\\-306.2234\\195\\30.27344\\-307.0306\\195\\28.32031\\-307.3403\\195\\26.36719\\-307.7484\\195\\22.46094\\-308.2744\\195\\16.60156\\-308.6739\\195\\4.882813\\-309.1445\\195\\-0.9765625\\-309.2982\\195\\-4.882813\\-309.2408\\195\\-20.50781\\-308.6326\\195\\-24.41406\\-308.3658\\195\\-26.36719\\-308.1381\\195" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "247" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "224" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-30.27344\\-307.763\\197\\-32.22656\\-307.3451\\197\\-38.08594\\-306.3169\\197\\-40.03906\\-305.7932\\197\\-41.99219\\-305.0996\\197\\-45.89844\\-304.1604\\197\\-47.85156\\-303.2979\\197\\-51.75781\\-302.405\\197\\-53.71094\\-301.5927\\197\\-57.61719\\-300.2932\\197\\-59.57031\\-299.1782\\197\\-61.52344\\-298.5054\\197\\-63.47656\\-297.3516\\197\\-65.42969\\-296.6338\\197\\-67.38281\\-295.4828\\197\\-69.33594\\-294.7952\\197\\-71.28906\\-293.6132\\197\\-73.24219\\-292.6323\\197\\-75.19531\\-291.2572\\197\\-79.10156\\-288.9738\\197\\-81.05469\\-287.5751\\197\\-83.00781\\-286.3221\\197\\-85.5625\\-284.2422\\197\\-90.50336\\-280.3359\\197\\-92.77344\\-278.3258\\197\\-94.72656\\-276.7715\\197\\-96.67969\\-275.1159\\197\\-98.63281\\-273.2721\\197\\-99.27455\\-272.5234\\197\\-101.4202\\-270.5703\\197\\-104.4922\\-267.4711\\197\\-105.1839\\-266.6641\\197\\-109.0518\\-262.7578\\197\\-110.7942\\-260.8047\\197\\-112.2963\\-258.8516\\197\\-115.4413\\-254.9453\\197\\-116.9241\\-252.9922\\197\\-118.1227\\-251.0391\\197\\-119.4558\\-249.0859\\197\\-120.9375\\-247.1328\\197\\-122.11\\-245.1797\\197\\-123.059\\-243.2266\\197\\-123.9053\\-241.2734\\197\\-124.8644\\-239.3203\\197\\-125.6533\\-237.3672\\197\\-126.6981\\-235.4141\\197\\-127.3878\\-233.4609\\197\\-128.3322\\-231.5078\\197\\-129.4181\\-227.6016\\197\\-130.2178\\-225.6484\\197\\-130.7091\\-223.6953\\197\\-131.0467\\-221.7422\\197\\-131.5458\\-219.7891\\197\\-132.2733\\-217.8359\\197\\-133.3921\\-211.9766\\197\\-133.9111\\-210.0234\\197\\-134.4898\\-206.1172\\197\\-134.8447\\-202.2109\\197\\-135.1303\\-198.3047\\197\\-135.3074\\-194.3984\\197\\-135.5052\\-186.5859\\197\\-135.3001\\-180.7266\\197\\-135.0812\\-176.8203\\197\\-134.5564\\-170.9609\\197\\-134.3479\\-169.0078\\197\\-134.0248\\-167.0547\\197\\-133.1473\\-163.1484\\197\\-132.5409\\-159.2422\\197\\-132.1289\\-157.2891\\197\\-131.4765\\-155.3359\\197\\-130.7123\\-151.4297\\197\\-130.272\\-149.4766\\197\\-129.1551\\-145.5703\\197\\-128.7356\\-143.6172\\197\\-128.1615\\-141.6641\\197\\-127.3049\\-139.7109\\197\\-126.6629\\-137.7578\\197\\-125.6745\\-135.8047\\197\\-124.9158\\-133.8516\\197\\-122.2331\\-127.9922\\197\\-120.938\\-126.0391\\197\\-119.4196\\-124.0859\\197\\-116.7817\\-120.1797\\197\\-115.2536\\-118.2266\\197\\-112.3047\\-115.0527\\197\\-109.4416\\-112.3672\\197\\-106.4453\\-109.9166\\197\\-104.3586\\-108.4609\\197\\-100.5859\\-106.0687\\197\\-98.63281\\-105.2472\\197\\-96.67969\\-104.0724\\197\\-94.72656\\-103.4055\\197\\-92.77344\\-102.5785\\197\\-90.82031\\-101.9209\\197\\-86.91406\\-101.0935\\197\\-84.96094\\-100.4456\\197\\-83.00781\\-99.98709\\197\\-77.14844\\-99.29673\\197\\-73.24219\\-98.49587\\197\\-71.28906\\-98.18163\\197\\-67.38281\\-97.80534\\197\\-59.57031\\-97.15171\\197\\-55.66406\\-96.69\\197\\-51.75781\\-96.34546\\197\\-45.89844\\-96.12513\\197\\-38.08594\\-96.01239\\197\\-34.17969\\-96.04012\\197\\-30.27344\\-96.18494\\197\\-26.36719\\-96.43822\\197\\-24.41406\\-96.69\\197\\-22.46094\\-97.06334\\197\\-16.60156\\-97.89941\\197\\-14.64844\\-98.26994\\197\\-12.69531\\-98.961\\197\\-10.74219\\-99.49586\\197\\-8.789063\\-99.8922\\197\\-6.835938\\-100.6081\\197\\-4.882813\\-101.4384\\197\\0.9765625\\-103.0363\\197\\2.929688\\-103.2003\\197\\4.882813\\-103.093\\197\\6.835938\\-102.6855\\197\\12.69531\\-101.0003\\197\\14.64844\\-100.1735\\197\\16.60156\\-99.74568\\197\\20.50781\\-99.09782\\197\\22.46094\\-98.61455\\197\\24.41406\\-98.23335\\197\\28.32031\\-97.72384\\197\\32.22656\\-97.33835\\197\\36.13281\\-96.78063\\197\\38.08594\\-96.44922\\197\\43.94531\\-95.9427\\197\\51.75781\\-95.5273\\197\\53.71094\\-95.45409\\197\\59.57031\\-95.3886\\197\\61.52344\\-95.43396\\197\\67.38281\\-95.71167\\197\\71.28906\\-96.0363\\197\\73.24219\\-96.24809\\197\\75.19531\\-96.64745\\197\\77.14844\\-97.21841\\197\\81.05469\\-98.00275\\197\\84.96094\\-99.36411\\197\\86.91406\\-99.76325\\197\\88.86719\\-100.3158\\197\\90.82031\\-101.2758\\197\\92.77344\\-101.9324\\197\\94.72656\\-103.0449\\197\\96.67969\\-104.0237\\197\\98.63281\\-105.4056\\197\\102.5391\\-107.6503\\197\\104.4922\\-109.0801\\197\\108.3984\\-112.1788\\197\\110.3516\\-113.9401\\197\\112.3047\\-115.8756\\197\\114.5187\\-118.2266\\197\\116.2109\\-120.3247\\197\\117.3816\\-122.1328\\197\\118.8022\\-124.0859\\197\\122.3958\\-129.9453\\197\\123.1384\\-131.8984\\197\\124.8826\\-135.8047\\197\\125.5562\\-137.7578\\197\\126.5806\\-139.7109\\197\\127.1561\\-141.6641\\197\\127.9374\\-143.6172\\197\\128.5588\\-145.5703\\197\\129.3913\\-149.4766\\197\\130.4325\\-153.3828\\197\\130.7158\\-155.3359\\197\\131.0404\\-159.2422\\197\\131.4598\\-163.1484\\197\\131.9714\\-167.0547\\197\\132.1508\\-169.0078\\197\\132.3496\\-172.9141\\197\\132.4463\\-176.8203\\197\\132.3979\\-182.6797\\197\\132.2229\\-188.5391\\197\\132.0229\\-192.4453\\197\\131.6007\\-198.3047\\197\\131.284\\-204.1641\\197\\131.0012\\-210.0234\\197\\130.6606\\-215.8828\\197\\130.4196\\-217.8359\\197\\129.9982\\-219.7891\\197\\129.4585\\-221.7422\\197\\128.7511\\-225.6484\\197\\128.2935\\-227.6016\\197\\127.4881\\-229.5547\\197\\126.1382\\-233.4609\\197\\125.1746\\-235.4141\\197\\124.5961\\-237.3672\\197\\123.5057\\-239.3203\\197\\122.9323\\-241.2734\\197\\120.9823\\-245.1797\\197\\119.7486\\-247.1328\\197\\118.8019\\-249.0859\\197\\117.5152\\-251.0391\\197\\116.726\\-252.9922\\197\\116.2109\\-253.6949\\197\\112.7223\\-258.8516\\197\\111.2203\\-260.8047\\197\\108.3984\\-264.6621\\197\\106.7814\\-266.6641\\197\\103.4483\\-270.5703\\197\\101.6474\\-272.5234\\197\\98.63281\\-275.4875\\197\\96.67969\\-277.2697\\197\\95.57427\\-278.3828\\197\\92.77344\\-280.9084\\197\\90.82031\\-282.4558\\197\\88.86719\\-283.8864\\197\\84.96094\\-287.0506\\197\\83.00781\\-288.4564\\197\\81.05469\\-289.4236\\197\\79.10156\\-290.8954\\197\\77.14844\\-292.2444\\197\\75.19531\\-293.347\\197\\73.24219\\-294.5796\\197\\71.28906\\-295.2697\\197\\69.33594\\-296.3092\\197\\67.38281\\-296.9692\\197\\63.47656\\-298.7192\\197\\61.52344\\-299.3789\\197\\59.57031\\-300.2991\\197\\55.66406\\-301.2706\\197\\53.71094\\-302.0349\\197\\51.75781\\-302.5646\\197\\47.85156\\-303.2391\\197\\45.89844\\-303.9729\\197\\43.94531\\-304.4959\\197\\40.03906\\-305.2932\\197\\38.08594\\-305.9623\\197\\36.13281\\-306.3582\\197\\30.27344\\-307.185\\197\\26.36719\\-307.9537\\197\\24.41406\\-308.2222\\197\\18.55469\\-308.6739\\197\\12.69531\\-308.9262\\197\\10.74219\\-309.0602\\197\\2.929688\\-309.436\\197\\-0.9765625\\-309.5938\\197\\-6.835938\\-309.4102\\197\\-14.64844\\-308.9527\\197\\-22.46094\\-308.6386\\197\\-26.36719\\-308.3245\\197" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "239" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "225" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.835938\\-309.6707\\199\\-10.74219\\-309.3608\\199\\-16.60156\\-308.976\\199\\-22.46094\\-308.7381\\199\\-28.32031\\-308.2908\\199\\-30.27344\\-308.0167\\199\\-34.17969\\-307.185\\199\\-40.03906\\-306.0753\\199\\-41.99219\\-305.3297\\199\\-45.89844\\-304.3715\\199\\-47.85156\\-303.5492\\199\\-49.80469\\-302.9293\\199\\-51.75781\\-302.5497\\199\\-55.66406\\-301.0668\\199\\-57.61719\\-300.463\\199\\-59.57031\\-299.4296\\199\\-61.52344\\-298.6719\\199\\-63.47656\\-297.5885\\199\\-65.42969\\-296.802\\199\\-67.38281\\-295.7298\\199\\-69.33594\\-294.9542\\199\\-73.24219\\-292.8567\\199\\-75.19531\\-291.489\\199\\-77.14844\\-290.4781\\199\\-80.6776\\-288.1484\\199\\-83.00781\\-286.667\\199\\-86.91406\\-283.3869\\199\\-88.46457\\-282.2891\\199\\-90.82031\\-280.459\\199\\-93.12529\\-278.3828\\199\\-95.47244\\-276.4297\\199\\-98.63281\\-273.5578\\199\\-99.5857\\-272.5234\\199\\-101.7198\\-270.5703\\199\\-104.4922\\-267.8034\\199\\-105.5001\\-266.6641\\199\\-107.4345\\-264.7109\\199\\-110.3516\\-261.6172\\199\\-114.2578\\-256.8891\\199\\-116.2109\\-254.3092\\199\\-122.5036\\-245.1797\\199\\-123.2767\\-243.2266\\199\\-124.3234\\-241.2734\\199\\-125.0933\\-239.3203\\199\\-126.1535\\-237.3672\\199\\-128.6272\\-231.5078\\199\\-129.1675\\-229.5547\\199\\-130.5442\\-225.6484\\199\\-131.3737\\-221.7422\\199\\-132.1197\\-219.7891\\199\\-132.5995\\-217.8359\\199\\-133.3769\\-213.9297\\199\\-133.9388\\-211.9766\\199\\-134.3095\\-210.0234\\199\\-134.9574\\-204.1641\\199\\-135.4765\\-198.3047\\199\\-135.7342\\-194.3984\\199\\-135.8849\\-190.4922\\199\\-135.9404\\-186.5859\\199\\-135.7969\\-182.6797\\199\\-135.5035\\-178.7734\\199\\-134.7281\\-170.9609\\199\\-134.2918\\-167.0547\\199\\-133.9377\\-165.1016\\199\\-133.0853\\-161.1953\\199\\-132.4599\\-157.2891\\199\\-131.9714\\-155.3359\\199\\-131.3223\\-153.3828\\199\\-130.6002\\-149.4766\\199\\-130.1398\\-147.5234\\199\\-129.4284\\-145.5703\\199\\-128.5082\\-141.6641\\199\\-127.7054\\-139.7109\\199\\-126.224\\-135.8047\\199\\-125.1754\\-133.8516\\199\\-124.4236\\-131.8984\\199\\-123.3241\\-129.9453\\199\\-122.5825\\-127.9922\\199\\-118.4896\\-122.1328\\199\\-115.4521\\-118.2266\\199\\-113.7028\\-116.2734\\199\\-112.3047\\-114.8652\\199\\-109.5963\\-112.3672\\199\\-106.4453\\-109.7688\\199\\-104.4922\\-108.3871\\199\\-102.5391\\-107.2801\\199\\-100.5859\\-106.0163\\199\\-98.63281\\-105.2353\\199\\-96.67969\\-104.0694\\199\\-94.72656\\-103.4099\\199\\-92.77344\\-102.5785\\199\\-90.82031\\-101.9328\\199\\-86.91406\\-101.1201\\199\\-84.96094\\-100.4606\\199\\-83.00781\\-100.0078\\199\\-77.14844\\-99.30492\\199\\-75.19531\\-98.96735\\199\\-73.24219\\-98.52093\\199\\-71.28906\\-98.20703\\199\\-67.38281\\-97.82458\\199\\-59.57031\\-97.20924\\199\\-53.71094\\-96.55518\\199\\-51.75781\\-96.39567\\199\\-45.89844\\-96.19598\\199\\-40.03906\\-96.10014\\199\\-34.17969\\-96.13998\\199\\-30.27344\\-96.31681\\199\\-28.32031\\-96.49471\\199\\-22.46094\\-97.33041\\199\\-18.55469\\-97.81061\\199\\-16.60156\\-98.09972\\199\\-14.64844\\-98.64313\\199\\-12.69531\\-99.29108\\199\\-8.789063\\-100.1369\\199\\-6.835938\\-100.9884\\199\\-4.882813\\-101.613\\199\\-2.929688\\-102.1226\\199\\-0.9765625\\-102.8083\\199\\0.9765625\\-103.2618\\199\\2.929688\\-103.3963\\199\\4.882813\\-103.284\\199\\6.835938\\-102.911\\199\\8.789063\\-102.2122\\199\\12.69531\\-101.1768\\199\\14.64844\\-100.3788\\199\\16.60156\\-99.86601\\199\\20.50781\\-99.28004\\199\\24.41406\\-98.42478\\199\\28.32031\\-97.86043\\199\\32.22656\\-97.50174\\199\\36.13281\\-97.00668\\199\\40.03906\\-96.36516\\199\\43.94531\\-96.0246\\199\\49.80469\\-95.70595\\199\\55.66406\\-95.50832\\199\\59.57031\\-95.48494\\199\\63.47656\\-95.60287\\199\\67.38281\\-95.81339\\199\\71.28906\\-96.10014\\199\\73.24219\\-96.32624\\199\\75.11393\\-96.74219\\199\\77.14844\\-97.30604\\199\\81.05469\\-98.08102\\199\\84.96094\\-99.43635\\199\\86.91406\\-99.79752\\199\\88.86719\\-100.4043\\199\\90.82031\\-101.327\\199\\92.77344\\-101.9686\\199\\94.72656\\-103.1025\\199\\96.67969\\-104.0788\\199\\98.63281\\-105.4234\\199\\102.5391\\-107.6578\\199\\104.4922\\-109.0928\\199\\108.6219\\-112.3672\\199\\110.3516\\-113.9372\\199\\112.3047\\-115.8418\\199\\114.5712\\-118.2266\\199\\116.2109\\-120.2487\\199\\117.43\\-122.1328\\199\\118.1641\\-123.061\\199\\120.1172\\-126.0678\\199\\122.5021\\-129.9453\\199\\123.2159\\-131.8984\\199\\124.2084\\-133.8516\\199\\125.754\\-137.7578\\199\\126.709\\-139.7109\\199\\127.304\\-141.6641\\199\\128.1704\\-143.6172\\199\\128.6932\\-145.5703\\199\\129.5644\\-149.4766\\199\\130.1629\\-151.4297\\199\\130.5603\\-153.3828\\199\\131.1791\\-159.2422\\199\\131.4466\\-161.1953\\199\\132.0834\\-165.1016\\199\\132.4208\\-169.0078\\199\\132.5658\\-172.9141\\199\\132.6358\\-176.8203\\199\\132.5783\\-182.6797\\199\\132.4208\\-188.5391\\199\\132.0717\\-196.3516\\199\\131.8436\\-200.2578\\199\\131.4055\\-206.1172\\199\\130.7761\\-215.8828\\199\\130.576\\-217.8359\\199\\130.2386\\-219.7891\\199\\129.6831\\-221.7422\\199\\129.2255\\-223.6953\\199\\128.4241\\-227.6016\\199\\127.6401\\-229.5547\\199\\126.2826\\-233.4609\\199\\125.2526\\-235.4141\\199\\124.6725\\-237.3672\\199\\123.6177\\-239.3203\\199\\122.9989\\-241.2734\\199\\122.1556\\-243.2266\\199\\118.9528\\-249.0859\\199\\117.6758\\-251.0391\\199\\116.8727\\-252.9922\\199\\115.5363\\-254.9453\\199\\114.3138\\-256.8984\\199\\112.9034\\-258.8516\\199\\111.3645\\-260.8047\\199\\108.6554\\-264.7109\\199\\106.4453\\-267.3462\\199\\103.6173\\-270.5703\\199\\101.8317\\-272.5234\\199\\98.63281\\-275.6554\\199\\95.78394\\-278.3828\\199\\92.77344\\-281.1421\\199\\90.82031\\-282.7349\\199\\83.00781\\-288.7478\\199\\81.05469\\-289.7523\\199\\77.14844\\-292.58\\199\\73.24219\\-294.7755\\199\\71.28906\\-295.4558\\199\\69.33594\\-296.4987\\199\\67.38281\\-297.1057\\199\\65.42969\\-298.1135\\199\\61.52344\\-299.5796\\199\\59.57031\\-300.421\\199\\55.66406\\-301.4066\\199\\53.71094\\-302.1874\\199\\51.75781\\-302.6418\\199\\49.80469\\-302.9278\\199\\47.85156\\-303.3633\\199\\45.89844\\-304.1302\\199\\43.94531\\-304.6001\\199\\41.99219\\-304.9687\\199\\40.03906\\-305.4892\\199\\38.08594\\-306.1425\\199\\30.27344\\-307.3658\\199\\26.36719\\-308.1086\\199\\24.41406\\-308.3492\\199\\18.55469\\-308.7615\\199\\12.69531\\-309.0481\\199\\6.835938\\-309.4912\\199\\0.9765625\\-309.7956\\199\\-2.929688\\-309.8337\\199" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "243" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "226" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.789063\\-309.6854\\201\\-10.74219\\-309.5021\\201\\-16.60156\\-309.0739\\201\\-22.46094\\-308.7949\\201\\-28.32031\\-308.3983\\201\\-32.22656\\-307.8486\\201\\-36.13281\\-306.9415\\201\\-40.03906\\-306.2323\\201\\-43.94531\\-304.9443\\201\\-45.89844\\-304.502\\201\\-49.80469\\-303.0297\\201\\-51.75781\\-302.6399\\201\\-53.71094\\-302.0081\\201\\-55.66406\\-301.1588\\201\\-57.61719\\-300.552\\201\\-59.57031\\-299.5971\\201\\-61.52344\\-298.7748\\201\\-63.47656\\-297.8141\\201\\-67.38281\\-296.0161\\201\\-69.33594\\-295.0627\\201\\-71.28906\\-294.2372\\201\\-71.58015\\-294.0078\\201\\-77.14844\\-290.7198\\201\\-79.10156\\-289.3499\\201\\-81.05469\\-288.2508\\201\\-83.00781\\-286.9199\\201\\-86.91406\\-283.6327\\201\\-88.86719\\-282.3304\\201\\-90.82031\\-280.7951\\201\\-91.27269\\-280.3359\\201\\-94.72656\\-277.276\\201\\-95.79258\\-276.4297\\201\\-98.63281\\-273.8233\\201\\-100.5859\\-271.8411\\201\\-102.0121\\-270.5703\\201\\-104.4922\\-268.1139\\201\\-105.8102\\-266.6641\\201\\-107.7275\\-264.7109\\201\\-110.3516\\-261.9262\\201\\-114.2578\\-257.2335\\201\\-114.6055\\-256.8984\\201\\-116.2109\\-254.6842\\201\\-117.2467\\-252.9922\\201\\-120.1992\\-249.0859\\201\\-122.7533\\-245.1797\\201\\-123.5214\\-243.2266\\201\\-124.6212\\-241.2734\\201\\-125.3595\\-239.3203\\201\\-126.5251\\-237.3672\\201\\-127.2609\\-235.4141\\201\\-128.2708\\-233.4609\\201\\-129.4936\\-229.5547\\201\\-130.3236\\-227.6016\\201\\-131.1991\\-223.6953\\201\\-131.9025\\-221.7422\\201\\-132.503\\-219.7891\\201\\-133.3131\\-215.8828\\201\\-133.8976\\-213.9297\\201\\-134.3297\\-211.9766\\201\\-135.5163\\-202.2109\\201\\-135.9271\\-198.3047\\201\\-136.0583\\-196.3516\\201\\-136.26\\-190.4922\\201\\-136.2731\\-186.5859\\201\\-136.1451\\-182.6797\\201\\-135.8699\\-178.7734\\201\\-135.3475\\-174.8672\\201\\-134.2566\\-165.1016\\201\\-133.9111\\-163.1484\\201\\-133.4022\\-161.1953\\201\\-132.3496\\-155.3359\\201\\-131.1909\\-151.4297\\201\\-130.494\\-147.5234\\201\\-129.2254\\-143.6172\\201\\-128.7812\\-141.6641\\201\\-128.2017\\-139.7109\\201\\-127.3049\\-137.7578\\201\\-126.6257\\-135.8047\\201\\-125.5253\\-133.8516\\201\\-124.7484\\-131.8984\\201\\-123.6484\\-129.9453\\201\\-122.827\\-127.9922\\201\\-120.2848\\-124.0859\\201\\-118.1641\\-121.3015\\201\\-114.2578\\-116.6336\\201\\-112.3047\\-114.6856\\201\\-109.7656\\-112.3672\\201\\-106.4453\\-109.6061\\201\\-104.4922\\-108.2244\\201\\-102.5391\\-107.2127\\201\\-100.5859\\-105.9701\\201\\-98.63281\\-105.2195\\201\\-96.67969\\-104.0905\\201\\-94.72656\\-103.4099\\201\\-92.77344\\-102.5938\\201\\-90.82031\\-101.9406\\201\\-86.91406\\-101.1367\\201\\-84.96094\\-100.4882\\201\\-83.00781\\-100.0247\\201\\-81.05469\\-99.75606\\201\\-77.14844\\-99.3286\\201\\-75.19531\\-98.98131\\201\\-73.24219\\-98.53372\\201\\-71.28906\\-98.22447\\201\\-67.38281\\-97.84383\\201\\-59.57031\\-97.28278\\201\\-51.75781\\-96.49471\\201\\-45.89844\\-96.26257\\201\\-41.99219\\-96.20397\\201\\-36.13281\\-96.22552\\201\\-32.22656\\-96.36516\\201\\-30.27344\\-96.51839\\201\\-26.36719\\-97.1084\\201\\-18.55469\\-98.02877\\201\\-16.60156\\-98.41348\\201\\-14.64844\\-99.09543\\201\\-12.69531\\-99.54129\\201\\-10.74219\\-99.88756\\201\\-8.789063\\-100.5167\\201\\-6.835938\\-101.306\\201\\-2.929688\\-102.3869\\201\\-0.9765625\\-103.1171\\201\\0.9765625\\-103.4702\\201\\2.929688\\-103.5732\\201\\4.882813\\-103.4805\\201\\6.835938\\-103.1501\\201\\8.789063\\-102.4388\\201\\10.74219\\-101.8517\\201\\12.69531\\-101.373\\201\\16.60156\\-100.0078\\201\\20.50781\\-99.45045\\201\\22.46094\\-99.11568\\201\\26.36719\\-98.26731\\201\\28.32031\\-98.00507\\201\\34.17969\\-97.41661\\201\\36.13281\\-97.17826\\201\\40.03906\\-96.50646\\201\\41.99219\\-96.27462\\201\\47.85156\\-95.8877\\201\\51.75781\\-95.71167\\201\\55.66406\\-95.60287\\201\\59.57031\\-95.59164\\201\\63.47656\\-95.71625\\201\\69.33594\\-96.02569\\201\\73.24219\\-96.4061\\201\\77.14844\\-97.38028\\201\\81.05469\\-98.1491\\201\\83.00781\\-98.92123\\201\\84.96094\\-99.47995\\201\\86.91406\\-99.84731\\201\\88.86719\\-100.4882\\201\\90.82031\\-101.3683\\201\\92.77344\\-102.0095\\201\\94.72656\\-103.164\\201\\96.67969\\-104.1227\\201\\98.63281\\-105.4635\\201\\102.5391\\-107.6655\\201\\104.4922\\-109.1099\\201\\108.3984\\-112.154\\201\\110.3516\\-113.9134\\201\\112.3047\\-115.7989\\201\\114.6214\\-118.2266\\201\\116.2195\\-120.1797\\201\\117.4805\\-122.1328\\201\\118.1641\\-122.9873\\201\\120.1172\\-125.9359\\201\\122.575\\-129.9453\\201\\123.2894\\-131.8984\\201\\124.3717\\-133.8516\\201\\125.0755\\-135.8047\\201\\126.8144\\-139.7109\\201\\127.4572\\-141.6641\\201\\128.319\\-143.6172\\201\\129.2087\\-147.5234\\201\\130.3101\\-151.4297\\201\\130.6676\\-153.3828\\201\\131.3382\\-159.2422\\201\\132.095\\-163.1484\\201\\132.3496\\-165.1016\\201\\132.5057\\-167.0547\\201\\132.6959\\-170.9609\\201\\132.8125\\-176.8203\\201\\132.7787\\-180.7266\\201\\132.6959\\-184.6328\\201\\132.1825\\-200.2578\\201\\131.9025\\-204.1641\\201\\131.7082\\-206.1172\\201\\130.6995\\-217.8359\\201\\130.4102\\-219.7891\\201\\129.3202\\-223.6953\\201\\128.5156\\-227.6016\\201\\127.0207\\-231.5078\\201\\126.3758\\-233.4609\\201\\125.3236\\-235.4141\\201\\124.7373\\-237.3672\\201\\123.729\\-239.3203\\201\\122.3108\\-243.2266\\201\\122.0703\\-243.5623\\201\\120.1172\\-247.2865\\201\\118.1641\\-250.6284\\201\\117.8409\\-251.0391\\201\\116.9835\\-252.9922\\201\\115.6924\\-254.9453\\201\\114.5399\\-256.8984\\201\\111.4898\\-260.8047\\201\\108.8455\\-264.7109\\201\\106.4453\\-267.5575\\201\\101.9744\\-272.5234\\201\\100.5859\\-273.9214\\201\\96.67969\\-277.6343\\201\\95.95758\\-278.3828\\201\\92.77344\\-281.2863\\201\\88.86719\\-284.524\\201\\86.69411\\-286.1953\\201\\83.00781\\-288.9258\\201\\79.10156\\-291.3281\\201\\77.14844\\-292.7945\\201\\75.00989\\-294.0078\\201\\73.24219\\-294.8861\\201\\71.28906\\-295.5804\\201\\69.33594\\-296.6022\\201\\67.38281\\-297.193\\201\\65.42969\\-298.218\\201\\61.52344\\-299.6053\\201\\59.57031\\-300.4398\\201\\55.66406\\-301.4532\\201\\53.71094\\-302.1927\\201\\51.75781\\-302.6123\\201\\49.80469\\-302.9245\\201\\47.85156\\-303.3788\\201\\45.89844\\-304.1404\\201\\41.99219\\-304.9807\\201\\38.08594\\-306.1613\\201\\32.22656\\-307.1041\\201\\28.32031\\-307.8765\\201\\26.36719\\-308.1614\\201\\22.46094\\-308.5281\\201\\18.55469\\-308.8016\\201\\16.60156\\-308.8803\\201\\12.69531\\-309.1381\\201\\6.835938\\-309.6557\\201\\0.9765625\\-309.8937\\201\\-2.929688\\-309.9277\\201" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "271" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "227" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-32.22656\\-307.4844\\203\\-34.17969\\-306.6061\\203\\-38.08594\\-306.3246\\203\\-40.03906\\-306.0857\\203\\-41.99219\\-304.6846\\203\\-43.94531\\-304.5751\\203\\-47.85156\\-302.925\\203\\-49.80469\\-302.7671\\203\\-51.75781\\-302.2629\\203\\-53.71094\\-301.4862\\203\\-55.66406\\-300.5088\\203\\-57.61719\\-300.2839\\203\\-59.57031\\-299.0259\\203\\-61.52344\\-298.5941\\203\\-63.47656\\-296.9858\\203\\-65.42969\\-296.3446\\203\\-67.38281\\-295.4615\\203\\-71.28906\\-293.4809\\203\\-73.24219\\-292.8369\\203\\-75.19531\\-291.0544\\203\\-77.14844\\-290.5085\\203\\-79.10156\\-288.8061\\203\\-81.05469\\-288.1211\\203\\-83.31948\\-286.1953\\203\\-86.04677\\-284.2422\\203\\-86.91406\\-283.4522\\203\\-88.86719\\-281.9794\\203\\-90.82031\\-280.8991\\203\\-91.36746\\-280.3359\\203\\-94.72656\\-277.4311\\203\\-95.9744\\-276.4297\\203\\-98.63281\\-274.0024\\203\\-100.5859\\-272.0284\\203\\-102.201\\-270.5703\\203\\-104.4922\\-268.305\\203\\-110.3516\\-262.1147\\203\\-114.2578\\-257.4031\\203\\-114.7911\\-256.8984\\203\\-116.2684\\-254.9453\\203\\-117.3937\\-252.9922\\203\\-120.4826\\-249.0859\\203\\-121.6211\\-247.1328\\203\\-122.9309\\-245.1797\\203\\-123.7755\\-243.2266\\203\\-124.8519\\-241.2734\\203\\-125.6419\\-239.3203\\203\\-126.7545\\-237.3672\\203\\-127.5618\\-235.4141\\203\\-128.5707\\-233.4609\\203\\-129.1302\\-231.5078\\203\\-129.9232\\-229.5547\\203\\-130.6122\\-227.6016\\203\\-130.9933\\-225.6484\\203\\-131.56\\-223.6953\\203\\-132.3412\\-221.7422\\203\\-133.202\\-217.8359\\203\\-133.8412\\-215.8828\\203\\-134.2861\\-213.9297\\203\\-134.5993\\-211.9766\\203\\-135.3692\\-206.1172\\203\\-135.9535\\-202.2109\\203\\-136.2565\\-198.3047\\203\\-136.4159\\-194.3984\\203\\-136.5004\\-190.4922\\203\\-136.5125\\-186.5859\\203\\-136.3011\\-180.7266\\203\\-135.9535\\-176.8203\\203\\-135.3369\\-172.9141\\203\\-135.0812\\-170.9609\\203\\-134.4851\\-165.1016\\203\\-134.2448\\-163.1484\\203\\-133.8557\\-161.1953\\203\\-133.3313\\-159.2422\\203\\-132.2706\\-153.3828\\203\\-131.5499\\-151.4297\\203\\-131.0379\\-149.4766\\203\\-130.7465\\-147.5234\\203\\-130.313\\-145.5703\\203\\-129.5386\\-143.6172\\203\\-128.5539\\-139.7109\\203\\-127.6945\\-137.7578\\203\\-126.9585\\-135.8047\\203\\-124.9777\\-131.8984\\203\\-124.0938\\-129.9453\\203\\-123.0217\\-127.9922\\203\\-120.6055\\-124.0859\\203\\-114.2578\\-116.4031\\203\\-112.3047\\-114.5029\\203\\-109.9466\\-112.3672\\203\\-106.4453\\-109.4492\\203\\-104.4922\\-108.0689\\203\\-102.5391\\-107.1523\\203\\-100.5859\\-105.9316\\203\\-98.63281\\-105.2195\\203\\-96.67969\\-104.1026\\203\\-94.72656\\-103.4208\\203\\-92.756\\-102.6016\\203\\-90.82031\\-101.9446\\203\\-86.91406\\-101.1367\\203\\-84.96094\\-100.5035\\203\\-83.00781\\-100.0373\\203\\-77.14844\\-99.33655\\203\\-73.24219\\-98.54671\\203\\-71.28906\\-98.22447\\203\\-69.33594\\-98.03246\\203\\-57.61719\\-97.20924\\203\\-51.75781\\-96.63368\\203\\-47.85156\\-96.41666\\203\\-41.99219\\-96.29829\\203\\-36.13281\\-96.35525\\203\\-32.22656\\-96.5806\\203\\-26.36719\\-97.36919\\203\\-22.46094\\-97.75259\\203\\-18.55469\\-98.30837\\203\\-14.64844\\-99.38361\\203\\-10.74219\\-100.1602\\203\\-8.789063\\-100.945\\203\\-6.835938\\-101.5643\\203\\-4.882813\\-102.0426\\203\\-2.929688\\-102.8334\\203\\-0.9765625\\-103.386\\203\\0.9765625\\-103.6674\\203\\2.929688\\-103.7764\\203\\4.882813\\-103.6674\\203\\6.835938\\-103.3817\\203\\8.789063\\-102.7983\\203\\10.74219\\-102.0253\\203\\12.69531\\-101.5579\\203\\14.64844\\-100.9595\\203\\16.60156\\-100.1735\\203\\18.55469\\-99.79752\\203\\22.46094\\-99.30125\\203\\24.41406\\-98.95526\\203\\26.36719\\-98.43623\\203\\30.27344\\-97.90337\\203\\36.13281\\-97.30428\\203\\41.99219\\-96.42738\\203\\43.94531\\-96.21416\\203\\47.85156\\-95.96622\\203\\51.75781\\-95.80278\\203\\55.66406\\-95.7066\\203\\59.57031\\-95.68514\\203\\63.47656\\-95.81899\\203\\69.33594\\-96.10742\\203\\73.24219\\-96.50646\\203\\77.14844\\-97.45869\\203\\81.05469\\-98.23335\\203\\83.00781\\-99.01854\\203\\84.96094\\-99.52679\\203\\86.91406\\-99.88494\\203\\88.86719\\-100.5618\\203\\90.82031\\-101.4135\\203\\92.77344\\-102.0604\\203\\94.72656\\-103.218\\203\\96.67969\\-104.1653\\203\\98.63281\\-105.4974\\203\\100.5859\\-106.6563\\203\\102.5391\\-107.6759\\203\\104.4922\\-109.1351\\203\\106.4453\\-110.7042\\203\\108.3984\\-112.154\\203\\110.3516\\-113.9018\\203\\112.3047\\-115.7648\\203\\114.6554\\-118.2266\\203\\116.2694\\-120.1797\\203\\117.5197\\-122.1328\\203\\120.327\\-126.0391\\203\\121.4012\\-127.9922\\203\\122.6367\\-129.9453\\203\\123.3573\\-131.8984\\203\\124.4796\\-133.8516\\203\\125.1563\\-135.8047\\203\\126.1405\\-137.7578\\203\\127.6131\\-141.6641\\203\\128.4363\\-143.6172\\203\\129.311\\-147.5234\\203\\130.4232\\-151.4297\\203\\130.7465\\-153.3828\\203\\131.1907\\-157.2891\\203\\131.515\\-159.2422\\203\\131.9975\\-161.1953\\203\\132.3242\\-163.1484\\203\\132.5291\\-165.1016\\203\\132.7883\\-169.0078\\203\\132.9371\\-172.9141\\203\\132.9845\\-176.8203\\203\\132.9216\\-182.6797\\203\\132.5671\\-192.4453\\203\\132.3901\\-200.2578\\203\\132.172\\-204.1641\\203\\131.8359\\-208.0006\\203\\131.3664\\-211.9766\\203\\130.7761\\-217.8359\\203\\130.5151\\-219.7891\\203\\130.0289\\-221.7422\\203\\129.3912\\-223.6953\\203\\128.5592\\-227.6016\\203\\127.9297\\-229.3431\\203\\127.0336\\-231.5078\\203\\126.3758\\-233.4609\\203\\125.3196\\-235.4141\\203\\124.7342\\-237.3672\\203\\123.7497\\-239.3203\\203\\122.3524\\-243.2266\\203\\121.2357\\-245.1797\\203\\120.1172\\-247.3281\\203\\118.1641\\-250.6848\\203\\117.8861\\-251.0391\\203\\116.9705\\-252.9922\\203\\114.5442\\-256.8984\\203\\112.9729\\-258.8516\\203\\109.5332\\-262.7578\\203\\108.6629\\-264.7109\\203\\106.4453\\-267.3049\\203\\105.0548\\-268.6172\\203\\103.2715\\-270.5703\\203\\102.5391\\-271.2273\\203\\101.4367\\-272.5234\\203\\99.28191\\-274.4766\\203\\98.63281\\-275.214\\203\\96.67969\\-277.0342\\203\\95.47822\\-278.3828\\203\\93.33062\\-280.3359\\203\\92.77344\\-280.9455\\203\\90.82031\\-282.6043\\203\\88.86719\\-283.395\\203\\88.01997\\-284.2422\\203\\85.80405\\-286.1953\\203\\84.96094\\-287.1251\\203\\81.05469\\-289.3565\\203\\80.26886\\-290.1016\\203\\77.20686\\-292.0547\\203\\75.19531\\-293.6079\\203\\73.24219\\-294.3265\\203\\71.28906\\-294.8228\\203\\69.33594\\-295.4371\\203\\68.75394\\-295.9609\\203\\67.38281\\-296.7642\\203\\65.42969\\-297.2329\\203\\64.50861\\-297.9141\\203\\63.47656\\-298.4514\\203\\61.52344\\-298.7007\\203\\59.57031\\-299.9348\\203\\57.61719\\-300.2876\\203\\55.66406\\-300.9439\\203\\53.71094\\-301.3079\\203\\51.75781\\-301.4839\\203\\49.80469\\-302.4272\\203\\47.85156\\-302.6891\\203\\45.89844\\-302.8178\\203\\43.94531\\-303.9881\\203\\41.99219\\-304.4516\\203\\40.03906\\-304.5427\\203\\38.08594\\-305.1461\\203\\36.13281\\-306.1109\\203\\32.22656\\-306.3443\\203\\30.27344\\-306.8688\\203\\28.32031\\-307.2518\\203\\26.36719\\-307.4506\\203\\22.46094\\-307.6659\\203\\20.50781\\-307.6878\\203\\18.55469\\-308.202\\203\\16.60156\\-308.4886\\203\\14.64844\\-308.5761\\203\\6.835938\\-308.7249\\203\\-2.929688\\-308.7946\\203\\-8.789063\\-308.7884\\203\\-16.60156\\-308.7051\\203\\-22.46094\\-308.547\\203\\-24.41406\\-307.8235\\203\\-28.32031\\-307.8064\\203" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002199" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "280" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "228" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.91406\\-280.4469\\205\\-88.86719\\-279.2467\\205\\-90.82031\\-278.8235\\205\\-92.77344\\-276.9073\\205\\-94.6841\\-276.4297\\205\\-96.77124\\-274.4766\\205\\-98.63281\\-272.8665\\205\\-100.9994\\-270.5703\\205\\-102.5391\\-268.9271\\205\\-104.4922\\-267.121\\205\\-106.9137\\-264.7109\\205\\-110.6663\\-260.8047\\205\\-111.259\\-258.8516\\205\\-115.2433\\-254.9453\\205\\-116.8887\\-252.9922\\205\\-117.6227\\-251.0391\\205\\-119.4949\\-249.0859\\205\\-120.1172\\-248.2164\\205\\-120.6275\\-247.1328\\205\\-122.2237\\-245.1797\\205\\-123.0844\\-243.2266\\205\\-124.4343\\-241.2734\\205\\-124.7816\\-239.3203\\205\\-125.4198\\-237.3672\\205\\-125.9766\\-236.6317\\205\\-126.578\\-235.4141\\205\\-127.9835\\-233.4609\\205\\-129.0248\\-231.5078\\205\\-129.9072\\-229.5547\\205\\-131.4745\\-223.6953\\205\\-132.4185\\-221.7422\\205\\-133.148\\-217.8359\\205\\-134.0008\\-215.8828\\205\\-134.4161\\-213.9297\\205\\-135.0281\\-208.0703\\205\\-135.6211\\-206.1172\\205\\-135.8838\\-204.1641\\205\\-136.1873\\-200.2578\\205\\-136.387\\-194.3984\\205\\-136.4731\\-188.5391\\205\\-136.453\\-186.5859\\205\\-136.5247\\-182.6797\\205\\-136.323\\-178.7734\\205\\-135.9258\\-174.8672\\205\\-135.2637\\-170.9609\\205\\-134.4601\\-163.1484\\205\\-134.1883\\-161.1953\\205\\-133.2335\\-157.2891\\205\\-132.558\\-153.3828\\205\\-132.0476\\-151.4297\\205\\-131.335\\-149.4766\\205\\-130.5925\\-145.5703\\205\\-129.2555\\-141.6641\\205\\-128.7984\\-139.7109\\205\\-128.1756\\-137.7578\\205\\-127.233\\-135.8047\\205\\-126.4335\\-133.8516\\205\\-125.2294\\-131.8984\\205\\-124.4181\\-129.9453\\205\\-123.1658\\-127.9922\\205\\-122.0787\\-126.0391\\205\\-120.7702\\-124.0859\\205\\-118.1641\\-120.8794\\205\\-117.5106\\-120.1797\\205\\-114.3244\\-116.2734\\205\\-112.3047\\-114.362\\205\\-107.7946\\-110.4141\\205\\-106.4453\\-109.3682\\205\\-104.4922\\-108.0043\\205\\-102.5391\\-107.1305\\205\\-100.5859\\-105.9316\\205\\-98.63281\\-105.2506\\205\\-96.67969\\-104.124\\205\\-94.72656\\-103.4486\\205\\-92.72112\\-102.6016\\205\\-90.82031\\-101.9564\\205\\-86.91406\\-101.16\\205\\-84.96094\\-100.5322\\205\\-83.00781\\-100.0587\\205\\-81.05469\\-99.77975\\205\\-77.14844\\-99.35217\\205\\-75.19531\\-99.02762\\205\\-71.28906\\-98.26994\\205\\-69.33594\\-98.06678\\205\\-57.61719\\-97.30428\\205\\-49.80469\\-96.64745\\205\\-45.89844\\-96.46036\\205\\-41.99219\\-96.42738\\205\\-36.13281\\-96.55518\\205\\-34.17969\\-96.67561\\205\\-26.36719\\-97.57277\\205\\-22.46094\\-97.96541\\205\\-20.50781\\-98.24233\\205\\-16.60156\\-99.26651\\205\\-12.69531\\-99.96237\\205\\-8.789063\\-101.327\\205\\-6.835938\\-101.8119\\205\\-4.882813\\-102.4485\\205\\-2.929688\\-103.2352\\205\\-0.9765625\\-103.6287\\205\\0.9765625\\-103.8879\\205\\2.929688\\-104.0054\\205\\4.882813\\-103.8983\\205\\6.835938\\-103.6095\\205\\8.789063\\-103.1113\\205\\10.74219\\-102.2581\\205\\14.64844\\-101.1829\\205\\16.60156\\-100.4061\\205\\18.55469\\-99.91152\\205\\24.41406\\-99.14849\\205\\28.32031\\-98.29858\\205\\30.27344\\-98.022\\205\\38.08594\\-97.16333\\205\\41.99219\\-96.55518\\205\\43.94531\\-96.31681\\205\\47.85156\\-96.05001\\205\\53.71094\\-95.83874\\205\\57.61719\\-95.79188\\205\\63.47656\\-95.91788\\205\\69.33594\\-96.24242\\205\\71.28906\\-96.4061\\205\\73.24219\\-96.71947\\205\\75.19531\\-97.17826\\205\\79.10156\\-97.89542\\205\\81.05469\\-98.33849\\205\\83.00781\\-99.10056\\205\\84.96094\\-99.58769\\205\\86.91406\\-99.93108\\205\\90.82031\\-101.4653\\205\\92.77344\\-102.126\\205\\94.72656\\-103.274\\205\\96.67969\\-104.1861\\205\\98.63281\\-105.5029\\205\\100.5859\\-106.6563\\205\\102.5391\\-107.6759\\205\\104.4922\\-109.1225\\205\\106.4453\\-110.6778\\205\\108.3984\\-112.1298\\205\\112.3047\\-115.7353\\205\\114.6803\\-118.2266\\205\\116.2694\\-120.1797\\205\\117.5197\\-122.1328\\205\\118.1641\\-122.9093\\205\\120.1172\\-125.7674\\205\\120.379\\-126.0391\\205\\121.4377\\-127.9922\\205\\122.6807\\-129.9453\\205\\123.409\\-131.8984\\205\\124.5212\\-133.8516\\205\\125.2009\\-135.8047\\205\\126.2642\\-137.7578\\205\\126.9745\\-139.7109\\205\\128.5192\\-143.6172\\205\\129.3519\\-147.5234\\205\\129.9688\\-149.4766\\205\\130.4102\\-151.4297\\205\\130.9673\\-155.3359\\205\\131.4361\\-159.2422\\205\\131.7368\\-161.1953\\205\\132.6201\\-165.1016\\205\\132.8316\\-169.0078\\205\\132.9643\\-174.8672\\205\\132.9036\\-182.6797\\205\\132.5092\\-194.3984\\205\\132.3822\\-200.2578\\205\\131.8359\\-202.1914\\205\\130.8335\\-204.1641\\205\\130.7189\\-211.9766\\205\\130.5664\\-215.8828\\205\\129.2646\\-219.7891\\205\\129.1297\\-221.7422\\205\\128.0296\\-225.6484\\205\\127.7061\\-227.6016\\205\\126.937\\-229.5547\\205\\126.3043\\-231.5078\\205\\124.6721\\-233.4609\\205\\124.5117\\-235.4141\\205\\124.0234\\-236.6305\\205\\123.4482\\-237.3672\\205\\122.794\\-239.3203\\205\\122.0703\\-240.7423\\205\\121.6185\\-241.2734\\205\\120.8283\\-243.2266\\205\\120.3021\\-245.1797\\205\\118.5238\\-247.1328\\205\\118.1641\\-248.3921\\205\\117.657\\-249.0859\\205\\116.2109\\-251.8235\\205\\115.1778\\-252.9922\\205\\114.5591\\-254.9453\\205\\112.3047\\-257.1378\\205\\110.3516\\-257.0538\\205\\108.3984\\-258.6074\\205\\106.4453\\-258.2656\\205\\104.4922\\-259.0957\\205\\102.5391\\-259.0469\\205\\100.5859\\-259.0957\\205\\98.63281\\-260.0723\\205\\94.72656\\-260.0723\\205\\92.77344\\-261.0488\\205\\90.82031\\-260.9674\\205\\88.86719\\-261.0488\\205\\86.91406\\-261.3906\\205\\84.96094\\-261.5371\\205\\83.00781\\-262.0254\\205\\81.05469\\-262.0254\\205\\79.10156\\-262.1719\\205\\77.14844\\-262.4323\\205\\75.19531\\-262.5625\\205\\73.24219\\-263.002\\205\\69.33594\\-263.002\\205\\67.38281\\-263.7344\\205\\65.42969\\-263.3438\\205\\63.47656\\-263.4902\\205\\61.52344\\-264.3854\\205\\59.57031\\-263.7344\\205\\55.66406\\-264.2227\\205\\55.17578\\-264.7109\\205\\53.71094\\-265.1992\\205\\51.75781\\-265.2969\\205\\49.80469\\-265.0365\\205\\47.85156\\-265.6875\\205\\45.89844\\-265.6875\\205\\43.94531\\-266.2979\\205\\41.99219\\-266.5664\\205\\39.55078\\-266.6641\\205\\36.13281\\-268.1289\\205\\32.22656\\-267.6406\\205\\30.27344\\-268.9427\\205\\26.36719\\-268.9427\\205\\24.41406\\-269.8379\\205\\22.46094\\-269.8379\\205\\20.50781\\-270.2448\\205\\18.55469\\-270.8145\\205\\16.60156\\-271.1563\\205\\14.64844\\-270.8958\\205\\12.69531\\-271.0586\\205\\10.74219\\-271.5469\\205\\8.789063\\-272.3281\\205\\6.835938\\-272.3839\\205\\4.882813\\-272.7188\\205\\2.929688\\-272.2793\\205\\0.9765625\\-272.7676\\205\\-0.9765625\\-273.1094\\205\\-2.929688\\-273.2559\\205\\-4.882813\\-273.5\\205\\-6.835938\\-273.8906\\205\\-8.789063\\-273.6628\\205\\-10.74219\\-274.2324\\205\\-14.64844\\-274.151\\205\\-16.60156\\-274.7207\\205\\-18.55469\\-274.7207\\205\\-20.50781\\-275.4531\\205\\-28.32031\\-275.4531\\205\\-32.22656\\-276.7552\\205\\-34.17969\\-276.918\\205\\-36.13281\\-277.4063\\205\\-38.08594\\-276.7552\\205\\-40.03906\\-278.0573\\205\\-41.99219\\-278.0573\\205\\-43.94531\\-278.7083\\205\\-47.85156\\-278.7083\\205\\-49.80469\\-279.3594\\205\\-51.75781\\-279.3594\\205\\-53.71094\\-279.6035\\205\\-55.66406\\-280.5313\\205\\-57.61719\\-280.5313\\205\\-59.57031\\-280.9219\\205\\-60.30273\\-280.3359\\205\\-61.52344\\-279.7934\\205\\-63.15104\\-280.3359\\205\\-63.47656\\-280.5801\\205\\-65.42969\\-280.1406\\205\\-69.33594\\-280.1964\\205\\-71.28906\\-280.5801\\205\\-77.14844\\-280.5801\\205\\-79.10156\\-280.1964\\205\\-81.05469\\-280.9219\\205\\-83.00781\\-281.3125\\205\\-84.96094\\-281.8008\\205" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002198" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "282" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "229" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-126.6741\\-227.6016\\207\\-127.9297\\-226.9738\\207\\-128.5482\\-225.6484\\207\\-128.9063\\-223.6953\\207\\-129.8828\\-222.7861\\207\\-130.3415\\-221.7422\\207\\-130.7828\\-219.7891\\207\\-130.9204\\-217.8359\\207\\-131.8359\\-216.7896\\207\\-132.2368\\-215.8828\\207\\-132.6238\\-213.9297\\207\\-132.872\\-208.0703\\207\\-133.7891\\-207.1304\\207\\-134.476\\-206.1172\\207\\-134.6393\\-200.2578\\207\\-134.7892\\-188.5391\\207\\-134.7969\\-186.5859\\207\\-135.7422\\-183.7999\\207\\-136.0307\\-182.6797\\207\\-135.9435\\-178.7734\\207\\-135.7107\\-174.8672\\207\\-135.4465\\-172.9141\\207\\-134.8763\\-170.9609\\207\\-134.6866\\-169.0078\\207\\-134.4125\\-163.1484\\207\\-134.0728\\-161.1953\\207\\-133.0357\\-159.2422\\207\\-132.803\\-155.3359\\207\\-132.5966\\-153.3828\\207\\-131.7274\\-151.4297\\207\\-131.1512\\-149.4766\\207\\-130.6956\\-145.5703\\207\\-130.2059\\-143.6172\\207\\-129.4358\\-141.6641\\207\\-128.4018\\-137.7578\\207\\-127.4515\\-135.8047\\207\\-126.6413\\-133.8516\\207\\-125.4085\\-131.8984\\207\\-124.543\\-129.9453\\207\\-123.2747\\-127.9922\\207\\-122.2199\\-126.0391\\207\\-120.8761\\-124.0859\\207\\-118.1641\\-120.7434\\207\\-117.6348\\-120.1797\\207\\-114.4695\\-116.2734\\207\\-112.3047\\-114.2633\\207\\-107.8525\\-110.4141\\207\\-104.4922\\-107.983\\207\\-102.5391\\-107.1347\\207\\-100.5859\\-105.9701\\207\\-98.63281\\-105.2665\\207\\-96.67969\\-104.1529\\207\\-94.72656\\-103.4702\\207\\-92.65351\\-102.6016\\207\\-90.82031\\-101.9605\\207\\-86.91406\\-101.1733\\207\\-84.96094\\-100.5776\\207\\-83.00781\\-100.0895\\207\\-81.05469\\-99.79752\\207\\-77.14844\\-99.40189\\207\\-75.19531\\-99.14156\\207\\-71.28906\\-98.40234\\207\\-69.33594\\-98.17336\\207\\-65.42969\\-97.91505\\207\\-55.66406\\-97.31898\\207\\-49.80469\\-96.87963\\207\\-45.89844\\-96.64745\\207\\-43.94531\\-96.62012\\207\\-38.08594\\-96.8098\\207\\-34.17969\\-97.07422\\207\\-28.32031\\-97.59159\\207\\-24.41406\\-97.98088\\207\\-22.46094\\-98.26062\\207\\-18.55469\\-99.20896\\207\\-14.64844\\-99.84943\\207\\-12.69531\\-100.4005\\207\\-10.74219\\-101.2344\\207\\-6.835938\\-102.2233\\207\\-4.882813\\-103.0964\\207\\-2.929688\\-103.5999\\207\\0.9765625\\-104.2507\\207\\2.929688\\-104.4599\\207\\4.882813\\-104.2956\\207\\6.835938\\-103.9353\\207\\8.789063\\-103.4362\\207\\12.69531\\-101.9075\\207\\14.64844\\-101.426\\207\\18.55469\\-100.1176\\207\\20.50781\\-99.81549\\207\\26.36719\\-99.02994\\207\\28.32031\\-98.55988\\207\\30.27344\\-98.19846\\207\\32.22656\\-97.93976\\207\\38.08594\\-97.31898\\207\\40.03906\\-97.07422\\207\\43.94531\\-96.47166\\207\\47.85156\\-96.1801\\207\\53.71094\\-95.97908\\207\\57.61719\\-95.9451\\207\\63.47656\\-96.07487\\207\\69.33594\\-96.47166\\207\\71.28906\\-96.70463\\207\\73.24219\\-97.06994\\207\\79.10156\\-98.02164\\207\\81.05469\\-98.55988\\207\\83.00781\\-99.25246\\207\\86.91406\\-100.0333\\207\\88.86719\\-100.8544\\207\\92.77344\\-102.2716\\207\\94.72656\\-103.4048\\207\\96.67969\\-104.3415\\207\\100.5859\\-106.7836\\207\\102.5391\\-107.7767\\207\\104.4922\\-109.2126\\207\\108.3984\\-112.2442\\207\\110.6491\\-114.3203\\207\\111.8601\\-116.2734\\207\\115.6734\\-120.1797\\207\\117.2406\\-122.1328\\207\\118.248\\-124.0859\\207\\120.1172\\-126.4878\\207\\122.0703\\-129.5432\\207\\122.4073\\-129.9453\\207\\122.9452\\-131.8984\\207\\123.83\\-133.8516\\207\\124.9012\\-135.8047\\207\\125.4391\\-137.7578\\207\\126.7034\\-139.7109\\207\\127.0116\\-141.6641\\207\\128.2097\\-143.6172\\207\\128.5015\\-145.5703\\207\\129.3855\\-149.4766\\207\\129.351\\-151.4297\\207\\129.4899\\-153.3828\\207\\130.1651\\-155.3359\\207\\130.2299\\-161.1953\\207\\130.3275\\-163.1484\\207\\131.3065\\-165.1016\\207\\131.4314\\-169.0078\\207\\131.4364\\-170.9609\\207\\131.3477\\-174.8672\\207\\131.121\\-180.7266\\207\\130.9136\\-184.6328\\207\\130.4139\\-192.4453\\207\\130.2426\\-196.3516\\207\\130.0746\\-198.3047\\207\\129.8828\\-198.7523\\207\\127.9297\\-198.5091\\207\\125.9766\\-198.4675\\207\\124.0234\\-198.5488\\207\\118.1641\\-198.5488\\207\\116.2109\\-198.9395\\207\\114.7461\\-200.2578\\207\\114.2578\\-200.4301\\207\\108.3984\\-200.502\\207\\106.4453\\-201.1646\\207\\104.4922\\-200.6205\\207\\102.5391\\-200.5675\\207\\100.5859\\-201.4514\\207\\98.63281\\-201.5895\\207\\97.26563\\-202.2109\\207\\94.72656\\-202.7188\\207\\90.82031\\-202.7188\\207\\88.86719\\-202.2342\\207\\86.91406\\-201.9446\\207\\84.96094\\-201.9668\\207\\83.00781\\-202.1133\\207\\81.05469\\-202.7399\\207\\79.10156\\-202.7399\\207\\75.19531\\-202.875\\207\\73.24219\\-203.0015\\207\\71.95724\\-204.1641\\207\\71.28906\\-204.4814\\207\\70.58377\\-204.1641\\207\\69.33594\\-203.0945\\207\\67.38281\\-202.9855\\207\\65.42969\\-203.3503\\207\\64.45313\\-204.1641\\207\\63.47656\\-204.5213\\207\\59.57031\\-204.5213\\207\\57.61719\\-205.2555\\207\\56.57087\\-206.1172\\207\\55.66406\\-206.3523\\207\\54.25347\\-206.1172\\207\\53.71094\\-205.7103\\207\\51.75781\\-204.641\\207\\49.80469\\-206.177\\207\\45.89844\\-206.6473\\207\\43.94531\\-208.2426\\207\\41.99219\\-208.1313\\207\\40.03906\\-206.4485\\207\\38.08594\\-206.9375\\207\\36.59539\\-208.0703\\207\\36.13281\\-208.2426\\207\\30.27344\\-208.2769\\207\\28.32031\\-208.6563\\207\\26.36719\\-208.4558\\207\\24.41406\\-209.0469\\207\\23.38867\\-210.0234\\207\\22.46094\\-210.5249\\207\\20.50781\\-210.8122\\207\\19.19158\\-211.9766\\207\\18.55469\\-212.2583\\207\\14.64844\\-212.3202\\207\\12.69531\\-212.8404\\207\\10.74219\\-214.8656\\207\\9.632458\\-215.8828\\207\\8.789063\\-216.4451\\207\\6.835938\\-216.9082\\207\\5.67627\\-217.8359\\207\\4.882813\\-218.1119\\207\\2.929688\\-218.1544\\207\\1.464844\\-217.8359\\207\\0.9765625\\-217.4603\\207\\-0.9765625\\-216.5634\\207\\-2.476283\\-217.8359\\207\\-2.792969\\-219.7891\\207\\-3.78418\\-219.7891\\207\\-4.882813\\-219.1613\\207\\-8.789063\\-218.3583\\207\\-12.69531\\-218.2225\\207\\-14.64844\\-219.1613\\207\\-15.38086\\-219.7891\\207\\-16.60156\\-220.0554\\207\\-20.50781\\-220.0909\\207\\-22.46094\\-218.3242\\207\\-24.41406\\-218.427\\207\\-25.85178\\-219.7891\\207\\-26.36719\\-220.1146\\207\\-32.22656\\-220.0909\\207\\-34.17969\\-220.6726\\207\\-36.13281\\-220.1688\\207\\-38.08594\\-221.7625\\207\\-40.03906\\-221.6608\\207\\-41.99219\\-222.4049\\207\\-43.94531\\-222.4746\\207\\-47.85156\\-222.3807\\207\\-51.75781\\-222.5167\\207\\-53.71094\\-222.5017\\207\\-55.17578\\-223.6953\\207\\-55.66406\\-223.9573\\207\\-57.61719\\-222.5167\\207\\-59.57031\\-222.6141\\207\\-60.94638\\-223.6953\\207\\-61.52344\\-224.005\\207\\-63.47656\\-224.0814\\207\\-64.58334\\-223.6953\\207\\-65.42969\\-222.99\\207\\-66.48763\\-223.6953\\207\\-67.38281\\-223.9573\\207\\-69.33594\\-223.8479\\207\\-71.28906\\-222.5444\\207\\-72.9852\\-223.6953\\207\\-73.52941\\-223.6953\\207\\-75.19531\\-222.6061\\207\\-77.14844\\-223.47\\207\\-81.05469\\-224.0906\\207\\-83.00781\\-224.0441\\207\\-84.05413\\-223.6953\\207\\-84.96094\\-223.0271\\207\\-86.01888\\-223.6953\\207\\-86.91406\\-225.4857\\207\\-88.86719\\-224.0906\\207\\-90.82031\\-224.4684\\207\\-92.77344\\-224.1836\\207\\-94.72656\\-224.0912\\207\\-96.67969\\-224.557\\207\\-98.63281\\-224.0906\\207\\-100.5859\\-224.1614\\207\\-102.5391\\-225.8835\\207\\-104.4922\\-225.8835\\207\\-106.4453\\-224.2568\\207\\-108.3984\\-225.5597\\207\\-110.3516\\-224.5498\\207\\-112.3047\\-224.3024\\207\\-114.2578\\-224.2908\\207\\-116.2109\\-225.9449\\207\\-118.1641\\-225.9449\\207\\-120.1172\\-227.6602\\207\\-122.0703\\-226.3809\\207\\-124.0234\\-226.3356\\207\\-125.7324\\-227.6016\\207" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "263" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "230" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-131.8359\\-171.1004\\209\\-132.0539\\-167.0547\\209\\-132.1875\\-163.1484\\209\\-132.0247\\-161.1953\\209\\-130.4726\\-159.2422\\209\\-130.6424\\-153.3828\\209\\-129.862\\-151.4297\\209\\-129.289\\-149.4766\\209\\-129.7689\\-147.5234\\209\\-129.9253\\-145.5703\\209\\-129.2623\\-143.6172\\209\\-128.8806\\-141.6641\\209\\-128.3138\\-139.7109\\209\\-128.0671\\-137.7578\\209\\-126.7183\\-135.8047\\209\\-125.9844\\-133.8516\\209\\-124.0234\\-130.5744\\209\\-123.4444\\-129.9453\\209\\-122.8793\\-127.9922\\209\\-121.2713\\-126.0391\\209\\-120.6172\\-124.0859\\209\\-118.1641\\-121.3917\\209\\-116.2109\\-119.4688\\209\\-115.1808\\-118.2266\\209\\-114.2578\\-117.4084\\209\\-112.3047\\-115.3205\\209\\-111.1424\\-114.3203\\209\\-109.2832\\-112.3672\\209\\-108.3984\\-111.6388\\209\\-106.4453\\-109.6491\\209\\-104.4922\\-108.3361\\209\\-102.5391\\-107.4777\\209\\-100.5859\\-106.9095\\209\\-100.1332\\-106.5078\\209\\-98.63281\\-105.6109\\209\\-94.72656\\-103.7609\\209\\-92.77344\\-103.4784\\209\\-90.82031\\-102.1804\\209\\-86.91406\\-101.8259\\209\\-84.96094\\-100.9606\\209\\-83.00781\\-100.7106\\209\\-81.05469\\-100.5645\\209\\-79.10156\\-99.71162\\209\\-73.24219\\-99.02552\\209\\-69.33594\\-98.40234\\209\\-63.47656\\-97.95643\\209\\-47.85156\\-97.0487\\209\\-45.89844\\-97.01386\\209\\-43.94531\\-97.58422\\209\\-41.99219\\-97.71875\\209\\-32.22656\\-97.79561\\209\\-28.32031\\-97.9567\\209\\-26.36719\\-98.116\\209\\-24.41406\\-99.1729\\209\\-22.46094\\-99.47305\\209\\-18.55469\\-99.67776\\209\\-16.60156\\-99.9035\\209\\-14.64844\\-100.8187\\209\\-12.69531\\-101.2523\\209\\-10.74219\\-101.9525\\209\\-8.789063\\-102.31\\209\\-6.835938\\-103.3208\\209\\-4.882813\\-103.8055\\209\\-2.929688\\-104.1379\\209\\-0.9765625\\-105.5084\\209\\2.929688\\-105.6174\\209\\6.835938\\-105.5371\\209\\8.789063\\-104.1227\\209\\10.74219\\-103.6436\\209\\12.69531\\-102.3978\\209\\14.64844\\-102.0545\\209\\16.60156\\-101.317\\209\\18.55469\\-100.9362\\209\\20.50781\\-100.7161\\209\\22.46094\\-99.89098\\209\\26.36719\\-99.6134\\209\\30.27344\\-99.485\\209\\32.22656\\-98.88697\\209\\34.17969\\-98.04603\\209\\40.03906\\-97.80795\\209\\43.94531\\-97.77141\\209\\45.89844\\-97.30946\\209\\47.85156\\-96.51839\\209\\53.71094\\-96.31153\\209\\57.61719\\-96.28368\\209\\63.47656\\-96.4362\\209\\65.42969\\-96.5806\\209\\67.38281\\-97.703\\209\\69.33594\\-97.78677\\209\\73.24219\\-97.83308\\209\\77.14844\\-98.03548\\209\\78.48987\\-98.69531\\209\\79.10156\\-99.17518\\209\\81.05469\\-99.59724\\209\\83.00781\\-99.7275\\209\\88.86719\\-101.4531\\209\\90.82031\\-102.1475\\209\\92.77344\\-103.56\\209\\94.72656\\-103.9665\\209\\96.67969\\-105.6141\\209\\100.5859\\-107.4283\\209\\102.5391\\-108.8961\\209\\104.4922\\-109.8518\\209\\107.3242\\-112.3672\\209\\108.3984\\-113.5711\\209\\109.2262\\-114.3203\\209\\109.7841\\-116.2734\\209\\111.414\\-118.2266\\209\\113.3827\\-120.1797\\209\\115.2344\\-122.1328\\209\\115.6561\\-124.0859\\209\\117.207\\-126.0391\\209\\118.1641\\-127.0572\\209\\118.5272\\-127.9922\\209\\120.3906\\-129.9453\\209\\120.3451\\-131.8984\\209\\120.4007\\-133.8516\\209\\120.1172\\-134.6506\\209\\118.1641\\-134.5276\\209\\116.5039\\-135.8047\\209\\116.2109\\-136.3906\\209\\114.2578\\-136.7813\\209\\110.3516\\-136.7813\\209\\108.3984\\-137.5137\\209\\104.4922\\-137.5625\\209\\102.5391\\-137.9531\\209\\98.63281\\-137.9531\\209\\96.67969\\-138.4902\\209\\92.77344\\-138.4902\\209\\90.82031\\-138.3438\\209\\88.86719\\-137.9206\\209\\86.91406\\-138.9785\\209\\84.96094\\-138.7344\\209\\83.00781\\-139.0134\\209\\81.05469\\-138.7344\\209\\78.125\\-139.7109\\209\\77.14844\\-139.9551\\209\\75.19531\\-139.9063\\209\\73.24219\\-139.5156\\209\\71.28906\\-140.2969\\209\\69.33594\\-140.0365\\209\\67.38281\\-140.4434\\209\\65.42969\\-141.3385\\209\\63.47656\\-141.4199\\209\\61.52344\\-141.9896\\209\\59.57031\\-143.1289\\209\\57.61719\\-143.373\\209\\55.66406\\-143.4219\\209\\53.71094\\-143.8613\\209\\51.75781\\-143.9427\\209\\49.80469\\-143.8613\\209\\47.85156\\-144.5938\\209\\43.94531\\-145.3262\\209\\41.99219\\-145.082\\209\\39.0625\\-145.5703\\209\\38.08594\\-145.8958\\209\\36.13281\\-145.9365\\209\\34.17969\\-146.5469\\209\\30.27344\\-147.2793\\209\\28.32031\\-147.849\\209\\27.83203\\-147.5234\\209\\26.36719\\-147.1049\\209\\23.92578\\-147.5234\\209\\22.46094\\-148.9883\\209\\20.50781\\-149.151\\209\\18.55469\\-148.221\\209\\16.60156\\-147.4014\\209\\16.40625\\-147.5234\\209\\15.25879\\-149.4766\\209\\17.57813\\-151.4297\\209\\18.35938\\-153.3828\\209\\18.55469\\-153.5223\\209\\19.22286\\-155.3359\\209\\18.55469\\-156.7465\\209\\18.14779\\-157.2891\\209\\16.60156\\-160.6319\\209\\16.11328\\-161.1953\\209\\14.64844\\-162.2173\\209\\13.49198\\-161.1953\\209\\13.73106\\-159.2422\\209\\14.64844\\-158.0313\\209\\15.625\\-157.2891\\209\\15.93339\\-155.3359\\209\\15.80256\\-153.3828\\209\\15.23438\\-151.4297\\209\\14.64844\\-150.6973\\209\\12.69531\\-150.6973\\209\\11.71875\\-147.5234\\209\\10.74219\\-146.73\\209\\9.684245\\-147.5234\\209\\8.789063\\-151.1042\\209\\5.859377\\-151.4297\\209\\4.882813\\-152.4063\\209\\2.929688\\-152.8945\\209\\0.9765625\\-152.4063\\209\\-0.9765625\\-152.4063\\209\\-3.906252\\-151.4297\\209\\-6.835938\\-150.8193\\209\\-8.789063\\-150.7321\\209\\-8.957436\\-151.4297\\209\\-8.789063\\-152.2435\\209\\-8.029513\\-153.3828\\209\\-7.93457\\-155.3359\\209\\-8.32648\\-157.2891\\209\\-8.789063\\-158.7539\\209\\-12.36979\\-157.2891\\209\\-12.69531\\-157.228\\209\\-14.07138\\-155.3359\\209\\-14.64844\\-154.278\\209\\-15.31982\\-153.3828\\209\\-16.60156\\-150.9414\\209\\-20.50781\\-152.1272\\209\\-22.46094\\-152.8945\\209\\-24.41406\\-153.5223\\209\\-26.36719\\-153.9688\\209\\-28.32031\\-155.4754\\209\\-30.27344\\-155.8242\\209\\-32.22656\\-157.0449\\209\\-34.17969\\-157.5332\\209\\-36.13281\\-157.5332\\209\\-40.03906\\-158.998\\209\\-41.01562\\-159.2422\\209\\-40.85286\\-161.1953\\209\\-40.03906\\-162.416\\209\\-38.57422\\-165.1016\\209\\-40.03906\\-165.6875\\209\\-41.99219\\-166.0781\\209\\-43.94531\\-166.7292\\209\\-47.85156\\-166.8105\\209\\-51.75781\\-167.8685\\209\\-53.71094\\-167.8685\\209\\-55.66406\\-168.4219\\209\\-59.57031\\-169.2031\\209\\-65.42969\\-169.9844\\209\\-65.84821\\-169.0078\\209\\-66.16211\\-167.0547\\209\\-67.38281\\-165.4271\\209\\-69.33594\\-165.6875\\209\\-71.28906\\-165.6875\\209\\-73.24219\\-165.9154\\209\\-79.10156\\-165.834\\209\\-81.05469\\-165.6875\\209\\-83.00781\\-164.9063\\209\\-88.86719\\-166.0781\\209\\-90.82031\\-166.3223\\209\\-92.77344\\-166.4688\\209\\-94.72656\\-166.4688\\209\\-96.67969\\-167.2175\\209\\-98.63281\\-167.6406\\209\\-100.5859\\-167.6406\\209\\-102.5391\\-168.0313\\209\\-104.4922\\-168.0313\\209\\-106.4453\\-168.2754\\209\\-108.3984\\-168.4219\\209\\-110.3516\\-168.4219\\209\\-112.3047\\-168.6823\\209\\-114.2578\\-169.1473\\209\\-118.1641\\-169.2031\\209\\-120.1172\\-168.5195\\209\\-122.0703\\-169.1706\\209\\-124.0234\\-169.7054\\209\\-125.9766\\-169.5938\\209\\-129.8828\\-170.4727\\209" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "231" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "51.75781\\-192.8374\\209\\47.85156\\-191.9751\\209\\45.89844\\-191.3626\\209\\43.94531\\-189.9756\\209\\41.99219\\-188.0658\\209\\40.6562\\-186.5859\\209\\39.25341\\-184.6328\\209\\38.76101\\-182.6797\\209\\38.01957\\-180.7266\\209\\37.71973\\-178.7734\\209\\37.64416\\-176.8203\\209\\37.83308\\-174.8672\\209\\39.07697\\-170.9609\\209\\40.4077\\-169.0078\\209\\41.99219\\-167.0938\\209\\43.94531\\-165.3\\209\\45.89844\\-163.7719\\209\\47.85156\\-162.8125\\209\\51.75781\\-161.8297\\209\\53.71094\\-161.7799\\209\\55.66406\\-161.8635\\209\\57.61719\\-162.2324\\209\\61.52344\\-163.3738\\209\\63.47656\\-165.071\\209\\65.42969\\-167.1659\\209\\66.8288\\-169.0078\\209\\67.50036\\-170.9609\\209\\68.29279\\-172.9141\\209\\68.82983\\-174.8672\\209\\69.01041\\-176.8203\\209\\68.90412\\-178.7734\\209\\68.52979\\-180.7266\\209\\67.87456\\-182.6797\\209\\65.75801\\-186.5859\\209\\64.19906\\-188.5391\\209\\63.47656\\-189.2616\\209\\61.52344\\-190.8434\\209\\59.57031\\-191.5836\\209\\57.61719\\-192.0448\\209\\55.66406\\-192.721\\209\\53.71094\\-192.9473\\209" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "232" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-83.00781\\-104.6361\\211\\-83.00781\\-104.4937\\211\\-81.05469\\-104.4896\\211\\-79.92188\\-102.6016\\211\\-79.10156\\-102.0473\\211\\-78.125\\-100.6484\\211\\-77.14844\\-100.2377\\211\\-73.24219\\-100.1109\\211\\-65.42969\\-100.105\\211\\-63.47656\\-99.59558\\211\\-61.55599\\-98.69531\\211\\-55.66406\\-98.38308\\211\\-45.89844\\-98.39959\\211\\-45.37354\\-98.69531\\211\\-43.94531\\-100.3512\\211\\-41.99219\\-100.5539\\211\\-39.0625\\-100.6484\\211\\-40.03906\\-100.7569\\211\\-43.94531\\-102.1133\\211\\-45.89844\\-102.5625\\211\\-47.85156\\-102.8269\\211\\-49.80469\\-103.5171\\211\\-51.75781\\-103.8385\\211\\-53.71094\\-104.3594\\211\\-55.66406\\-104.4849\\211\\-59.57031\\-104.4937\\211\\-61.52344\\-104.7988\\211\\-63.47656\\-104.4462\\211\\-67.38281\\-104.4896\\211\\-69.33594\\-104.78\\211\\-71.28906\\-105.1761\\211\\-73.24219\\-105.165\\211\\-77.14844\\-104.4896\\211\\-79.10156\\-104.4659\\211\\-81.05469\\-104.6435\\211" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "233" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "45.89844\\-191.2246\\211\\43.94531\\-189.441\\211\\43.23557\\-188.5391\\211\\41.29895\\-186.5859\\211\\40.03906\\-184.5932\\211\\39.17034\\-182.6797\\211\\38.04656\\-178.7734\\211\\38.06212\\-176.8203\\211\\38.71783\\-174.8672\\211\\39.1344\\-172.9141\\211\\39.90834\\-170.9609\\211\\41.09792\\-169.0078\\211\\43.94531\\-165.7084\\211\\45.89844\\-164.3343\\211\\51.75781\\-162.8821\\211\\53.71094\\-162.8119\\211\\55.66406\\-163.0798\\211\\57.61719\\-163.2176\\211\\59.57031\\-163.7488\\211\\61.52344\\-164.6063\\211\\62.06092\\-165.1016\\211\\63.73312\\-167.0547\\211\\65.42969\\-169.2883\\211\\66.36002\\-170.9609\\211\\67.10085\\-172.9141\\211\\68.543\\-174.8672\\211\\69.14247\\-176.8203\\211\\68.88458\\-178.7734\\211\\67.82362\\-180.7266\\211\\66.90079\\-182.6797\\211\\66.20002\\-184.6328\\211\\64.85324\\-186.5859\\211\\63.47656\\-189.0774\\211\\62.42559\\-190.4922\\211\\61.52344\\-191.2623\\211\\59.57031\\-191.6682\\211\\57.61719\\-191.6891\\211\\53.71094\\-192.2084\\211\\49.80469\\-191.8809\\211\\47.85156\\-191.8428\\211" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002195" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "234" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "45.89844\\-191.5885\\213\\43.94531\\-189.3946\\213\\42.22552\\-186.5859\\213\\40.52734\\-184.6328\\213\\39.52474\\-182.6797\\213\\38.42298\\-180.7266\\213\\38.04688\\-178.7734\\213\\38.09524\\-176.8203\\213\\38.88434\\-174.8672\\213\\39.47303\\-172.9141\\213\\40.57943\\-170.9609\\213\\41.3769\\-169.0078\\213\\43.09824\\-167.0547\\213\\43.94531\\-165.9517\\213\\45.89844\\-164.2711\\213\\47.85156\\-164.0427\\213\\51.75781\\-163.7856\\213\\53.71094\\-163.7527\\213\\55.66406\\-163.8592\\213\\59.57031\\-163.6367\\213\\61.52344\\-164.8556\\213\\64.68461\\-169.0078\\213\\65.85217\\-170.9609\\213\\66.52222\\-172.9141\\213\\68.27126\\-174.8672\\213\\69.87601\\-176.8203\\213\\68.8829\\-178.7734\\213\\66.91108\\-180.7266\\213\\66.41228\\-182.6797\\213\\65.77897\\-184.6328\\213\\64.27361\\-186.5859\\213\\63.60427\\-188.5391\\213\\62.11605\\-190.4922\\213\\61.52344\\-191.0425\\213\\59.57031\\-191.7453\\213\\57.61719\\-191.4547\\213\\53.71094\\-191.7867\\213\\49.80469\\-191.6541\\213\\47.85156\\-192.1294\\213" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "1" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "255\\128\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.822617\\-185.532\\-53\\-3.217159\\-185.016\\-53\\-4.008816\\-184.5845\\-53\\-5.647892\\-183.1425\\-53\\-6.398726\\-182.0491\\-53\\-7.210587\\-180.1176\\-53\\-7.346458\\-179.2563\\-53\\-7.377643\\-177.2732\\-53\\-7.126414\\-176.1662\\-53\\-6.619712\\-174.8111\\-53\\-5.605105\\-173.2615\\-53\\-4.617378\\-172.2797\\-53\\-2.766951\\-171.1722\\-53\\-1.271545\\-170.6588\\-53\\-0.0942254\\-170.4699\\-53\\2.401256\\-170.6252\\-53\\4.452537\\-171.345\\-53\\5.834437\\-172.2258\\-53\\6.781363\\-173.1533\\-53\\7.660157\\-174.3542\\-53\\8.380367\\-175.9948\\-53\\8.713982\\-178.0575\\-53\\8.469196\\-180.1765\\-53\\7.653542\\-182.0623\\-53\\6.902081\\-183.148\\-53\\5.191735\\-184.6208\\-53\\4.422974\\-185.0313\\-53\\3.000576\\-185.5425\\-53\\1.200459\\-185.8655\\-53\\0.01856305\\-185.8689\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.341555\\-188.6337\\-51\\-3.535146\\-188.3137\\-51\\-5.369791\\-187.5508\\-51\\-7.173401\\-186.3121\\-51\\-8.14281\\-185.3723\\-51\\-8.990662\\-184.2822\\-51\\-9.847253\\-182.7528\\-51\\-10.39609\\-181.203\\-51\\-10.71813\\-179.6096\\-51\\-10.77989\\-177.9484\\-51\\-10.54996\\-176.1485\\-51\\-10.1444\\-174.7373\\-51\\-9.088316\\-172.5497\\-51\\-8.272603\\-171.4671\\-51\\-7.298368\\-170.4557\\-51\\-6.209515\\-169.5924\\-51\\-4.749192\\-168.7345\\-51\\-2.19852\\-167.8273\\-51\\-0.6399968\\-167.5823\\-51\\1.771882\\-167.5708\\-51\\4.245574\\-168.0636\\-51\\5.91089\\-168.708\\-51\\7.559203\\-169.6802\\-51\\8.420381\\-170.3498\\-51\\9.505224\\-171.4484\\-51\\10.31162\\-172.5158\\-51\\11.35321\\-174.6068\\-51\\11.81211\\-176.1853\\-51\\11.97659\\-177.2013\\-51\\11.94348\\-179.7251\\-51\\11.63167\\-181.2601\\-51\\10.85321\\-183.1923\\-51\\10.08713\\-184.4571\\-51\\8.580834\\-186.1377\\-51\\6.968125\\-187.3102\\-51\\4.756684\\-188.2898\\-51\\3.254199\\-188.6678\\-51\\1.365167\\-188.914\\-51\\-0.09017476\\-188.9274\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.608414\\-190.8814\\-49\\-2.645632\\-190.735\\-49\\-4.589392\\-190.2724\\-49\\-7.0136\\-189.2481\\-49\\-8.287686\\-188.4489\\-49\\-9.628903\\-187.2869\\-49\\-10.3438\\-186.5149\\-49\\-11.82217\\-184.2494\\-49\\-12.70732\\-181.9412\\-49\\-12.98179\\-180.6998\\-49\\-13.16898\\-178.4189\\-49\\-13.05518\\-176.7242\\-49\\-12.85543\\-175.5786\\-49\\-12.08132\\-173.2456\\-49\\-11.03628\\-171.3663\\-49\\-9.825652\\-169.8201\\-49\\-8.695223\\-168.7595\\-49\\-7.077835\\-167.6154\\-49\\-5.095147\\-166.6542\\-49\\-3.767403\\-166.1914\\-49\\-2.059778\\-165.8097\\-49\\-0.6657854\\-165.6538\\-49\\1.859423\\-165.656\\-49\\3.165309\\-165.8142\\-49\\4.951316\\-166.2173\\-49\\6.370563\\-166.7074\\-49\\8.303261\\-167.6476\\-49\\9.938641\\-168.799\\-49\\11.07829\\-169.8779\\-49\\12.73386\\-172.1206\\-49\\13.48909\\-173.6905\\-49\\14.06981\\-175.5351\\-49\\14.36629\\-177.6962\\-49\\14.37679\\-179.1843\\-49\\13.92681\\-181.9256\\-49\\13.02016\\-184.2536\\-49\\11.53705\\-186.488\\-49\\10.66682\\-187.4052\\-49\\8.596537\\-188.9759\\-49\\7.012528\\-189.7673\\-49\\5.771133\\-190.215\\-49\\3.820653\\-190.6934\\-49\\0.915529\\-190.9782\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.766109\\-192.449\\-47\\-4.545334\\-192.0033\\-47\\-6.383731\\-191.4537\\-47\\-8.912426\\-190.2184\\-47\\-10.74276\\-188.8016\\-47\\-11.76466\\-187.7107\\-47\\-12.85325\\-186.2136\\-47\\-13.4939\\-185.0675\\-47\\-14.16497\\-183.4894\\-47\\-14.80652\\-181.0453\\-47\\-14.9981\\-178.2717\\-47\\-14.73243\\-175.6446\\-47\\-14.22203\\-173.7833\\-47\\-13.71214\\-172.5214\\-47\\-12.9784\\-171.1141\\-47\\-12.20102\\-169.9789\\-47\\-11.17459\\-168.7754\\-47\\-9.609863\\-167.3787\\-47\\-7.623668\\-166.1301\\-47\\-5.717514\\-165.303\\-47\\-3.140729\\-164.6207\\-47\\-0.2983212\\-164.2986\\-47\\1.37434\\-164.3013\\-47\\4.332889\\-164.6626\\-47\\6.884155\\-165.3468\\-47\\8.175083\\-165.8712\\-47\\9.766849\\-166.7243\\-47\\11.6268\\-168.0956\\-47\\13.3617\\-169.9562\\-47\\14.39541\\-171.511\\-47\\15.38894\\-173.6825\\-47\\15.94131\\-175.6663\\-47\\16.11355\\-176.7408\\-47\\16.20782\\-178.5872\\-47\\16.01542\\-181.0023\\-47\\15.35206\\-183.5091\\-47\\14.85419\\-184.6912\\-47\\13.86121\\-186.4645\\-47\\12.95067\\-187.6651\\-47\\11.65571\\-188.9811\\-47\\10.10412\\-190.1278\\-47\\7.54406\\-191.3674\\-47\\5.612908\\-191.9473\\-47\\2.955307\\-192.4017\\-47\\0.9817407\\-192.5283\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.140761\\-193.7074\\-45\\-4.687198\\-193.3627\\-45\\-6.623366\\-192.8527\\-45\\-8.896114\\-191.9043\\-45\\-10.65378\\-190.7969\\-45\\-11.66073\\-189.9634\\-45\\-12.79229\\-188.8113\\-45\\-13.77693\\-187.5283\\-45\\-14.69869\\-185.9812\\-45\\-15.44591\\-184.3086\\-45\\-16.02585\\-182.3833\\-45\\-16.37223\\-180.4318\\-45\\-16.45874\\-179.1066\\-45\\-16.41418\\-177.2073\\-45\\-16.11909\\-175.2643\\-45\\-15.4728\\-173.0481\\-45\\-14.9034\\-171.7483\\-45\\-13.86018\\-169.9272\\-45\\-12.73055\\-168.4862\\-45\\-11.96184\\-167.6871\\-45\\-10.60552\\-166.5473\\-45\\-9.521469\\-165.8239\\-45\\-7.886041\\-164.9711\\-45\\-6.418256\\-164.3974\\-45\\-4.860384\\-163.9617\\-45\\-2.930271\\-163.5989\\-45\\-0.72114\\-163.4032\\-45\\1.8841\\-163.4224\\-45\\3.771169\\-163.6114\\-45\\5.364509\\-163.879\\-45\\7.559484\\-164.4669\\-45\\9.085904\\-165.0659\\-45\\10.46447\\-165.765\\-45\\11.71759\\-166.56\\-45\\13.49652\\-168.0904\\-45\\15.06668\\-169.9921\\-45\\15.72351\\-171.0691\\-45\\16.67154\\-173.0784\\-45\\17.31111\\-175.2739\\-45\\17.6105\\-177.2485\\-45\\17.65084\\-179.2095\\-45\\17.33424\\-181.8578\\-45\\16.62098\\-184.3224\\-45\\15.88099\\-185.9563\\-45\\14.61162\\-187.969\\-45\\12.93161\\-189.8138\\-45\\11.82021\\-190.7118\\-45\\10.06631\\-191.7967\\-45\\7.79474\\-192.7375\\-45\\5.85596\\-193.2606\\-45\\2.902209\\-193.6915\\-45\\0.6107318\\-193.8097\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.947727\\-194.6507\\-43\\-6.683777\\-194.0739\\-43\\-8.366441\\-193.4799\\-43\\-10.49791\\-192.3744\\-43\\-11.74501\\-191.4837\\-43\\-12.83203\\-190.5254\\-43\\-14.53089\\-188.5235\\-43\\-15.66893\\-186.6947\\-43\\-16.35616\\-185.2073\\-43\\-16.88515\\-183.6866\\-43\\-17.36\\-181.7038\\-43\\-17.58575\\-179.8169\\-43\\-17.60777\\-177.949\\-43\\-17.42749\\-176.0556\\-43\\-16.99187\\-174.0566\\-43\\-16.29703\\-172.1052\\-43\\-15.68627\\-170.8136\\-43\\-14.61173\\-169.1167\\-43\\-13.76594\\-168.0586\\-43\\-12.5461\\-166.8405\\-43\\-10.72443\\-165.4708\\-43\\-9.581362\\-164.8218\\-43\\-8.044\\-164.128\\-43\\-6.546018\\-163.6264\\-43\\-3.792288\\-163.0456\\-43\\-2.35171\\-162.8714\\-43\\0.1365536\\-162.7499\\-43\\3.502366\\-162.9258\\-43\\5.039333\\-163.1376\\-43\\7.561336\\-163.6948\\-43\\9.051079\\-164.1841\\-43\\10.7699\\-164.9427\\-43\\12.85463\\-166.232\\-43\\14.07534\\-167.2561\\-43\\15.80034\\-169.1895\\-43\\16.66054\\-170.4831\\-43\\17.49128\\-172.1681\\-43\\18.18336\\-174.1126\\-43\\18.61912\\-176.1209\\-43\\18.7822\\-177.8264\\-43\\18.76648\\-179.8252\\-43\\18.54255\\-181.6972\\-43\\18.06285\\-183.6877\\-43\\17.53193\\-185.1978\\-43\\16.81882\\-186.7126\\-43\\16.17732\\-187.8007\\-43\\14.8746\\-189.5352\\-43\\13.99732\\-190.4683\\-43\\12.89922\\-191.4061\\-43\\11.12269\\-192.5905\\-43\\9.515988\\-193.361\\-43\\7.735961\\-193.9766\\-43\\5.124373\\-194.5478\\-43\\2.327199\\-194.8432\\-43\\0.5318326\\-194.9219\\-43\\-1.1571\\-194.8876\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.27534\\-195.8569\\-41\\-4.335244\\-195.623\\-41\\-5.918368\\-195.3287\\-41\\-8.253383\\-194.6237\\-41\\-9.518801\\-194.0752\\-41\\-11.41795\\-192.9626\\-41\\-12.81964\\-191.8723\\-41\\-14.07298\\-190.6338\\-41\\-14.98739\\-189.5319\\-41\\-16.48104\\-187.1359\\-41\\-17.2977\\-185.3021\\-41\\-18.10059\\-182.599\\-41\\-18.4371\\-180.3407\\-41\\-18.50148\\-178.2657\\-41\\-18.35611\\-176.4015\\-41\\-17.94641\\-174.1963\\-41\\-17.14885\\-171.8785\\-41\\-16.44548\\-170.4306\\-41\\-15.30129\\-168.6468\\-41\\-13.39483\\-166.5619\\-41\\-11.68497\\-165.2527\\-41\\-9.149891\\-163.9167\\-41\\-6.475635\\-163.0583\\-41\\-4.695973\\-162.7053\\-41\\-2.095681\\-162.4253\\-41\\0.1862088\\-162.355\\-41\\3.279232\\-162.4901\\-41\\6.518366\\-162.9473\\-41\\8.719695\\-163.4903\\-41\\11.35423\\-164.5342\\-41\\12.86096\\-165.3879\\-41\\14.68143\\-166.7743\\-41\\15.8761\\-168.0039\\-41\\16.82797\\-169.203\\-41\\17.62696\\-170.5009\\-41\\18.75608\\-173.0168\\-41\\19.35952\\-175.256\\-41\\19.67778\\-178.2775\\-41\\19.61115\\-180.3702\\-41\\19.05021\\-183.5517\\-41\\18.46996\\-185.3001\\-41\\17.93382\\-186.5632\\-41\\17.15242\\-188.0015\\-41\\16.15121\\-189.4989\\-41\\15.2311\\-190.5983\\-41\\13.99592\\-191.7868\\-41\\12.5863\\-192.862\\-41\\10.68986\\-193.9503\\-41\\8.988591\\-194.651\\-41\\7.111657\\-195.1968\\-41\\5.070956\\-195.5813\\-41\\3.444153\\-195.7864\\-41\\0.9071178\\-195.934\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "6.883477\\-196.1855\\-39\\3.31687\\-196.7449\\-39\\0.1840343\\-196.8911\\-39\\-2.168188\\-196.8065\\-39\\-5.131364\\-196.4182\\-39\\-6.865339\\-196.0183\\-39\\-8.391089\\-195.5025\\-39\\-10.35013\\-194.5941\\-39\\-12.31495\\-193.3082\\-39\\-14.41963\\-191.373\\-39\\-15.44767\\-190.1358\\-39\\-17.01392\\-187.6382\\-39\\-17.95422\\-185.5337\\-39\\-18.60554\\-183.4256\\-39\\-18.94471\\-181.7539\\-39\\-19.14719\\-179.9703\\-39\\-19.15868\\-177.733\\-39\\-18.9477\\-175.797\\-39\\-18.21297\\-172.8511\\-39\\-17.34949\\-170.792\\-39\\-16.36503\\-169.1001\\-39\\-14.84135\\-167.176\\-39\\-13.37627\\-165.8261\\-39\\-11.26581\\-164.4245\\-39\\-9.478131\\-163.5988\\-39\\-7.785415\\-163.0387\\-39\\-5.800844\\-162.5915\\-39\\-2.845564\\-162.2306\\-39\\-0.296187\\-162.1483\\-39\\2.879539\\-162.2264\\-39\\5.571328\\-162.5124\\-39\\7.021233\\-162.7483\\-39\\8.998903\\-163.2188\\-39\\10.64914\\-163.7668\\-39\\12.47289\\-164.611\\-39\\14.57109\\-165.9861\\-39\\16.06158\\-167.3453\\-39\\16.83329\\-168.2302\\-39\\17.80139\\-169.6003\\-39\\18.5317\\-170.8773\\-39\\19.2148\\-172.4211\\-39\\19.70044\\-173.9077\\-39\\20.11936\\-175.8158\\-39\\20.33403\\-177.7819\\-39\\20.32064\\-179.9968\\-39\\20.11448\\-181.7866\\-39\\19.77521\\-183.4439\\-39\\19.11833\\-185.5512\\-39\\18.17838\\-187.6401\\-39\\16.6192\\-190.1019\\-39\\15.58879\\-191.3326\\-39\\14.57395\\-192.329\\-39\\12.9265\\-193.6254\\-39\\11.5263\\-194.4823\\-39\\9.278243\\-195.4815\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "58" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.3652583\\-197.7523\\-37\\-2.84042\\-197.6062\\-37\\-5.249024\\-197.2277\\-37\\-7.959698\\-196.4566\\-37\\-9.176228\\-195.9621\\-37\\-10.75031\\-195.1422\\-37\\-12.37077\\-194.0488\\-37\\-14.18201\\-192.4338\\-37\\-15.01975\\-191.5288\\-37\\-16.36035\\-189.7464\\-37\\-17.25987\\-188.2488\\-37\\-18.20497\\-186.2015\\-37\\-18.99448\\-183.8128\\-37\\-19.40045\\-181.9088\\-37\\-19.62643\\-179.4507\\-37\\-19.59429\\-177.4891\\-37\\-19.37653\\-175.6184\\-37\\-19.02017\\-174.0032\\-37\\-18.41396\\-172.151\\-37\\-17.85656\\-170.8487\\-37\\-16.68548\\-168.8338\\-37\\-14.89802\\-166.6857\\-37\\-13.4893\\-165.4794\\-37\\-12.39336\\-164.7149\\-37\\-10.0785\\-163.5587\\-37\\-8.660318\\-163.0602\\-37\\-7.077616\\-162.6559\\-37\\-5.030459\\-162.3145\\-37\\-2.545675\\-162.0878\\-37\\-0.6050572\\-162.0288\\-37\\1.834189\\-162.0677\\-37\\4.870774\\-162.2885\\-37\\7.004755\\-162.5879\\-37\\9.824748\\-163.2504\\-37\\11.28433\\-163.7707\\-37\\13.48506\\-164.8479\\-37\\14.67924\\-165.6614\\-37\\16.14462\\-166.9021\\-37\\17.85059\\-168.9353\\-37\\19.03722\\-170.9476\\-37\\19.58371\\-172.214\\-37\\20.18371\\-174.0237\\-37\\20.55072\\-175.665\\-37\\20.76628\\-177.5179\\-37\\20.79492\\-179.6206\\-37\\20.55993\\-181.9842\\-37\\20.1623\\-183.8388\\-37\\19.37411\\-186.2137\\-37\\18.41123\\-188.2842\\-37\\16.8483\\-190.6992\\-37\\15.76595\\-191.9756\\-37\\13.64206\\-193.9089\\-37\\11.95624\\-195.0376\\-37\\9.522807\\-196.2016\\-37\\7.614946\\-196.8369\\-37\\6.393201\\-197.1375\\-37\\4.028552\\-197.5366\\-37\\1.585741\\-197.7315\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.011054\\-198.45\\-35\\-3.515336\\-198.2757\\-35\\-5.820865\\-197.8132\\-35\\-8.492883\\-196.9121\\-35\\-10.33341\\-195.9786\\-35\\-11.73128\\-195.1129\\-35\\-12.78396\\-194.3101\\-35\\-15.02464\\-192.1009\\-35\\-16.20895\\-190.5655\\-35\\-17.17096\\-189.049\\-35\\-18.33889\\-186.6698\\-35\\-19.16713\\-184.2496\\-35\\-19.6025\\-182.3057\\-35\\-19.795\\-180.8852\\-35\\-19.87189\\-178.8853\\-35\\-19.79253\\-176.8255\\-35\\-19.60343\\-175.46\\-35\\-19.16522\\-173.5886\\-35\\-18.36777\\-171.3731\\-35\\-16.93981\\-168.8086\\-35\\-15.47414\\-166.9951\\-35\\-14.23786\\-165.8372\\-35\\-12.23188\\-164.456\\-35\\-10.69007\\-163.6889\\-35\\-9.492958\\-163.2328\\-35\\-7.84963\\-162.7676\\-35\\-5.719952\\-162.3644\\-35\\-4.173187\\-162.184\\-35\\-1.681149\\-162.0459\\-35\\0.144162\\-162.037\\-35\\3.238762\\-162.1386\\-35\\6.88022\\-162.5323\\-35\\9.023931\\-162.9675\\-35\\10.75736\\-163.476\\-35\\13.31658\\-164.6056\\-35\\15.37676\\-165.9858\\-35\\16.63979\\-167.1398\\-35\\18.14849\\-168.9837\\-35\\19.53145\\-171.4421\\-35\\20.56552\\-174.5061\\-35\\20.96635\\-176.8945\\-35\\21.0423\\-179.024\\-35\\20.97064\\-180.8634\\-35\\20.77291\\-182.3294\\-35\\20.33835\\-184.2698\\-35\\19.50653\\-186.6964\\-35\\18.34611\\-189.0515\\-35\\16.86303\\-191.2905\\-35\\15.80127\\-192.5407\\-35\\13.99531\\-194.2418\\-35\\12.40674\\-195.3945\\-35\\9.707335\\-196.8209\\-35\\6.990014\\-197.741\\-35\\4.667814\\-198.2197\\-35\\3.190203\\-198.4089\\-35\\0.5833686\\-198.547\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.9237666\\-199.18\\-33\\2.717184\\-199.114\\-33\\4.315667\\-198.9167\\-33\\6.102829\\-198.5715\\-33\\9.199105\\-197.5732\\-33\\11.28817\\-196.5405\\-33\\12.50523\\-195.7674\\-33\\13.84302\\-194.7506\\-33\\14.92268\\-193.7848\\-33\\16.81388\\-191.6602\\-33\\18.52025\\-189.0442\\-33\\19.76457\\-186.3371\\-33\\20.14809\\-185.2369\\-33\\20.77979\\-182.741\\-33\\21.00422\\-181.1959\\-33\\21.12359\\-179.018\\-33\\20.98653\\-176.5416\\-33\\20.55878\\-174.2877\\-33\\19.96604\\-172.3991\\-33\\19.5264\\-171.3693\\-33\\18.52998\\-169.5264\\-33\\17.69972\\-168.3344\\-33\\16.80214\\-167.3034\\-33\\14.96535\\-165.6799\\-33\\13.39843\\-164.6786\\-33\\10.90186\\-163.5725\\-33\\8.356034\\-162.8876\\-33\\5.223742\\-162.3858\\-33\\2.483041\\-162.1695\\-33\\-1.293987\\-162.1078\\-33\\-4.056855\\-162.244\\-33\\-6.059783\\-162.4789\\-33\\-9.004567\\-163.121\\-33\\-10.69523\\-163.7302\\-33\\-12.17222\\-164.4402\\-33\\-14.42947\\-165.9964\\-33\\-15.65638\\-167.1688\\-33\\-16.65851\\-168.3688\\-33\\-17.57818\\-169.775\\-33\\-18.79206\\-172.3076\\-33\\-19.40941\\-174.2853\\-33\\-19.81692\\-176.4846\\-33\\-19.95404\\-178.8181\\-33\\-19.83517\\-181.1443\\-33\\-19.61795\\-182.6488\\-33\\-19.2083\\-184.4238\\-33\\-18.59839\\-186.2833\\-33\\-17.35473\\-188.9958\\-33\\-15.65456\\-191.6227\\-33\\-13.85898\\-193.6727\\-33\\-11.72565\\-195.4899\\-33\\-9.805804\\-196.7376\\-33\\-7.863381\\-197.6676\\-33\\-4.901328\\-198.6204\\-33\\-1.986058\\-199.0976\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "57" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "2.660912\\-199.6445\\-31\\4.226826\\-199.4462\\-31\\6.097453\\-199.0435\\-31\\7.896241\\-198.4689\\-31\\9.824241\\-197.6435\\-31\\10.8982\\-197.066\\-31\\12.3295\\-196.118\\-31\\14.01524\\-194.7723\\-31\\16.01427\\-192.7027\\-31\\17.05584\\-191.3518\\-31\\18.34218\\-189.2645\\-31\\19.24446\\-187.4211\\-31\\20.12814\\-184.9806\\-31\\20.54638\\-183.3534\\-31\\20.95838\\-180.4412\\-31\\20.9555\\-177.5709\\-31\\20.55608\\-174.8552\\-31\\19.94983\\-172.7844\\-31\\18.795\\-170.2538\\-31\\17.86502\\-168.8378\\-31\\16.46647\\-167.1849\\-31\\15.38389\\-166.2226\\-31\\13.51335\\-164.9364\\-31\\12.64582\\-164.4844\\-31\\10.32381\\-163.5727\\-31\\8.893404\\-163.1776\\-31\\6.505832\\-162.7141\\-31\\5.050382\\-162.527\\-31\\2.347314\\-162.3247\\-31\\-0.4595994\\-162.2558\\-31\\-3.967167\\-162.3983\\-31\\-7.341415\\-162.8928\\-31\\-9.122101\\-163.3443\\-31\\-11.0698\\-164.0863\\-31\\-12.28379\\-164.6953\\-31\\-13.70665\\-165.6371\\-31\\-15.32403\\-167.0487\\-31\\-16.68543\\-168.6904\\-31\\-17.64228\\-170.1695\\-31\\-18.78241\\-172.7049\\-31\\-19.38939\\-174.796\\-31\\-19.78473\\-177.5036\\-31\\-19.78773\\-180.3918\\-31\\-19.37545\\-183.3009\\-31\\-18.95291\\-184.9476\\-31\\-18.09381\\-187.3181\\-31\\-17.18\\-189.1844\\-31\\-15.88642\\-191.2932\\-31\\-14.81701\\-192.6714\\-31\\-12.63814\\-194.9186\\-31\\-11.07162\\-196.1511\\-31\\-9.025517\\-197.4393\\-31\\-7.531065\\-198.1386\\-31\\-4.926319\\-199.056\\-31\\-3.031982\\-199.4621\\-31\\-1.515858\\-199.6529\\-31\\0.7690603\\-199.7182\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "58" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "1.412349\\-200.0875\\-29\\3.219846\\-199.9358\\-29\\4.670805\\-199.6858\\-29\\6.861041\\-199.0859\\-29\\8.47685\\-198.4476\\-29\\10.25429\\-197.5354\\-29\\12.7034\\-195.8563\\-29\\14.17598\\-194.5401\\-29\\15.33043\\-193.2992\\-29\\16.49088\\-191.8359\\-29\\17.56162\\-190.1828\\-29\\18.38729\\-188.6836\\-29\\19.47412\\-186.0897\\-29\\20.10225\\-183.965\\-29\\20.55823\\-181.4346\\-29\\20.65493\\-178.4025\\-29\\20.54999\\-176.7789\\-29\\20.19482\\-174.8399\\-29\\19.77271\\-173.3128\\-29\\19.15315\\-171.7258\\-29\\18.3006\\-170.0972\\-29\\16.83395\\-168.0862\\-29\\15.78183\\-167.0124\\-29\\13.85394\\-165.5461\\-29\\12.41315\\-164.7274\\-29\\11.27372\\-164.2252\\-29\\8.254211\\-163.3058\\-29\\6.320167\\-162.9473\\-29\\3.673314\\-162.647\\-29\\-0.3223828\\-162.4922\\-29\\-2.568819\\-162.5553\\-29\\-5.216539\\-162.7949\\-29\\-7.057449\\-163.1081\\-29\\-8.775189\\-163.5559\\-29\\-11.27512\\-164.5356\\-29\\-12.69376\\-165.3564\\-29\\-14.61176\\-166.8408\\-29\\-15.66345\\-167.9321\\-29\\-17.1428\\-169.9929\\-29\\-17.98554\\-171.6288\\-29\\-18.60535\\-173.2359\\-29\\-19.0226\\-174.7456\\-29\\-19.3792\\-176.7111\\-29\\-19.47831\\-179.7989\\-29\\-19.3891\\-181.3425\\-29\\-18.92397\\-183.9145\\-29\\-18.26879\\-186.1048\\-29\\-17.17722\\-188.6788\\-29\\-15.81327\\-191.0266\\-29\\-14.4059\\-192.9133\\-29\\-13.07098\\-194.3863\\-29\\-11.61316\\-195.7147\\-29\\-10.07028\\-196.856\\-29\\-8.101531\\-198.0305\\-29\\-5.634142\\-199.0816\\-29\\-3.475472\\-199.68\\-29\\-2.032731\\-199.9321\\-29\\-0.2768756\\-200.085\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.481232\\-199.746\\-27\\-5.013044\\-199.3006\\-27\\-7.25056\\-198.3716\\-27\\-8.585252\\-197.6228\\-27\\-11.1061\\-195.8249\\-27\\-13.23437\\-193.7473\\-27\\-14.42582\\-192.315\\-27\\-15.43683\\-190.8579\\-27\\-16.57709\\-188.8754\\-27\\-17.785\\-186.0533\\-27\\-18.49081\\-183.6031\\-27\\-18.79461\\-181.9119\\-27\\-18.9603\\-180.2495\\-27\\-18.93498\\-177.6739\\-27\\-18.7735\\-176.2413\\-27\\-18.40058\\-174.4273\\-27\\-17.72743\\-172.4099\\-27\\-16.46043\\-169.93\\-27\\-14.82731\\-167.8201\\-27\\-13.49565\\-166.5749\\-27\\-11.70075\\-165.3324\\-27\\-10.14801\\-164.5412\\-27\\-7.98289\\-163.7732\\-27\\-5.466483\\-163.2217\\-27\\-3.201627\\-162.9633\\-27\\0.7001616\\-162.8449\\-27\\4.365788\\-163.0684\\-27\\6.65586\\-163.3797\\-27\\9.191432\\-163.975\\-27\\11.30018\\-164.7283\\-27\\12.86595\\-165.5231\\-27\\14.7683\\-166.832\\-27\\15.99012\\-167.9712\\-27\\17.62197\\-170.0456\\-27\\18.37139\\-171.3631\\-27\\19.12995\\-173.1078\\-27\\19.56762\\-174.4957\\-27\\19.94318\\-176.3027\\-27\\20.10716\\-177.7353\\-27\\20.13619\\-180.2916\\-27\\19.96795\\-181.9967\\-27\\19.67255\\-183.6552\\-27\\18.95786\\-186.1509\\-27\\17.99604\\-188.4773\\-27\\17.21602\\-189.968\\-27\\15.59781\\-192.4395\\-27\\13.60563\\-194.7172\\-27\\12.31807\\-195.9032\\-27\\9.974627\\-197.5729\\-27\\8.451646\\-198.4279\\-27\\6.240468\\-199.333\\-27\\4.03852\\-199.9206\\-27\\1.516819\\-200.2208\\-27\\-0.3991877\\-200.2114\\-27\\-1.633978\\-200.0908\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.185663\\-200.1234\\-25\\3.256205\\-199.9214\\-25\\5.832376\\-199.2668\\-25\\7.611921\\-198.543\\-25\\9.582726\\-197.4335\\-25\\11.26943\\-196.23\\-25\\13.54712\\-194.0715\\-25\\14.58444\\-192.8494\\-25\\16.24645\\-190.4324\\-25\\17.27654\\-188.506\\-25\\18.34132\\-185.8458\\-25\\18.95859\\-183.5814\\-25\\19.33558\\-181.1944\\-25\\19.4011\\-178.3316\\-25\\19.10145\\-175.8849\\-25\\18.66952\\-174.1868\\-25\\18.18242\\-172.7807\\-25\\17.34504\\-171.055\\-25\\16.17856\\-169.3289\\-25\\15.37545\\-168.4019\\-25\\13.35405\\-166.6551\\-25\\11.90313\\-165.7527\\-25\\10.7535\\-165.1932\\-25\\8.61746\\-164.4069\\-25\\5.583602\\-163.7381\\-25\\3.198856\\-163.44\\-25\\-0.4785639\\-163.3213\\-25\\-2.008536\\-163.3704\\-25\\-4.400415\\-163.6136\\-25\\-6.264466\\-163.9456\\-25\\-8.370073\\-164.5317\\-25\\-10.745\\-165.5811\\-25\\-12.508\\-166.7241\\-25\\-14.22305\\-168.2729\\-25\\-15.58332\\-169.9987\\-25\\-16.36557\\-171.3024\\-25\\-17.02022\\-172.7041\\-25\\-17.50209\\-174.1138\\-25\\-17.93183\\-175.8206\\-25\\-18.22518\\-178.2495\\-25\\-18.15415\\-181.1573\\-25\\-17.76797\\-183.5519\\-25\\-17.16986\\-185.7233\\-25\\-16.08179\\-188.4207\\-25\\-15.03626\\-190.3443\\-25\\-13.43329\\-192.6635\\-25\\-12.3151\\-193.9789\\-25\\-10.12761\\-196.0521\\-25\\-8.417209\\-197.3008\\-25\\-6.853009\\-198.2316\\-25\\-5.414006\\-198.8908\\-25\\-3.802698\\-199.4691\\-25\\-2.132722\\-199.8714\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.07837604\\-199.6779\\-23\\2.431958\\-199.5861\\-23\\3.436413\\-199.4285\\-23\\5.20365\\-198.9564\\-23\\7.654629\\-197.9007\\-23\\9.649947\\-196.6496\\-23\\11.49915\\-195.1177\\-23\\13.54391\\-192.9075\\-23\\15.02104\\-190.8191\\-23\\15.83574\\-189.4024\\-23\\16.74062\\-187.5359\\-23\\17.30989\\-186.0417\\-23\\18.07808\\-183.1658\\-23\\18.38577\\-180.8733\\-23\\18.4127\\-178.3936\\-23\\18.31808\\-177.3272\\-23\\17.8785\\-175.0415\\-23\\17.33068\\-173.4198\\-23\\16.54432\\-171.714\\-23\\15.48916\\-170.0771\\-23\\14.27016\\-168.6671\\-23\\13.16352\\-167.6805\\-23\\11.8863\\-166.7685\\-23\\9.741194\\-165.6643\\-23\\7.9375\\-165.0112\\-23\\5.268491\\-164.3885\\-23\\3.180732\\-164.1257\\-23\\1.261507\\-163.9848\\-23\\-1.996709\\-164.0643\\-23\\-4.110225\\-164.2878\\-23\\-5.502007\\-164.5465\\-23\\-7.774304\\-165.1954\\-23\\-9.37663\\-165.8759\\-23\\-11.09252\\-166.86\\-23\\-12.16324\\-167.671\\-23\\-13.86175\\-169.3726\\-23\\-14.94153\\-170.859\\-23\\-16.12964\\-173.227\\-23\\-16.70781\\-174.972\\-23\\-17.14531\\-177.2835\\-23\\-17.23403\\-178.3416\\-23\\-17.20185\\-180.8079\\-23\\-16.88508\\-183.0977\\-23\\-16.4387\\-184.8998\\-23\\-15.76538\\-186.8796\\-23\\-14.99123\\-188.5945\\-23\\-13.77763\\-190.7324\\-23\\-12.35614\\-192.7228\\-23\\-10.27783\\-194.9755\\-23\\-8.84327\\-196.1978\\-23\\-7.384455\\-197.2179\\-23\\-5.427882\\-198.2863\\-23\\-3.656532\\-198.9833\\-23\\-2.284822\\-199.3635\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "3.98182\\-198.4269\\-21\\6.29082\\-197.5728\\-21\\8.083325\\-196.583\\-21\\10.44217\\-194.7254\\-21\\11.96358\\-193.1431\\-21\\12.87122\\-192.0051\\-21\\14.05624\\-190.2481\\-21\\14.88011\\-188.7763\\-21\\15.85204\\-186.5755\\-21\\16.48686\\-184.6488\\-21\\16.99897\\-182.1364\\-21\\17.16245\\-179.1668\\-21\\17.01657\\-177.2991\\-21\\16.78024\\-176.0205\\-21\\16.03852\\-173.6517\\-21\\15.37458\\-172.2917\\-21\\14.54147\\-170.9638\\-21\\12.82453\\-169.0054\\-21\\11.20515\\-167.7301\\-21\\9.962468\\-166.9923\\-21\\8.206527\\-166.1958\\-21\\6.75092\\-165.7118\\-21\\3.521514\\-165.0587\\-21\\1.543854\\-164.8992\\-21\\-1.192336\\-164.9101\\-21\\-3.46555\\-165.1579\\-21\\-5.75534\\-165.6519\\-21\\-6.99636\\-166.0598\\-21\\-8.731181\\-166.8276\\-21\\-10.02547\\-167.5912\\-21\\-11.61092\\-168.8404\\-21\\-13.01537\\-170.375\\-21\\-13.91475\\-171.6831\\-21\\-14.86979\\-173.5788\\-21\\-15.60217\\-175.9473\\-21\\-15.8355\\-177.2316\\-21\\-15.97555\\-179.0813\\-21\\-15.79508\\-182.1241\\-21\\-15.27197\\-184.5975\\-21\\-14.67615\\-186.379\\-21\\-13.42753\\-189.0896\\-21\\-12.10266\\-191.2193\\-21\\-10.72468\\-192.9962\\-21\\-9.042567\\-194.7226\\-21\\-7.785137\\-195.7792\\-21\\-6.413276\\-196.7185\\-21\\-4.173418\\-197.8622\\-21\\-2.440898\\-198.4348\\-21\\-1.164569\\-198.7136\\-21\\0.6191094\\-198.8593\\-21\\2.335062\\-198.7626\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.5889828\\-197.5246\\-19\\2.835643\\-197.332\\-19\\4.30677\\-196.9336\\-19\\5.709937\\-196.3677\\-19\\6.881927\\-195.7212\\-19\\8.124926\\-194.8623\\-19\\9.839561\\-193.3575\\-19\\11.40593\\-191.5383\\-19\\12.70374\\-189.6326\\-19\\13.74795\\-187.6603\\-19\\14.58252\\-185.5632\\-19\\15.29049\\-182.7444\\-19\\15.53867\\-180.3367\\-19\\15.42756\\-177.9723\\-19\\15.19261\\-176.5847\\-19\\14.69539\\-174.8309\\-19\\14.00282\\-173.2608\\-19\\13.13703\\-171.8342\\-19\\12.05496\\-170.5098\\-19\\10.70214\\-169.2813\\-19\\8.479903\\-167.8711\\-19\\6.386815\\-167.0245\\-19\\4.919351\\-166.608\\-19\\3.045448\\-166.272\\-19\\0.8626077\\-166.1093\\-19\\-2.075699\\-166.2534\\-19\\-3.758297\\-166.5414\\-19\\-5.2565\\-166.9532\\-19\\-6.887741\\-167.5745\\-19\\-8.371519\\-168.3612\\-19\\-9.530785\\-169.1743\\-19\\-10.88979\\-170.4183\\-19\\-11.98201\\-171.7669\\-19\\-12.83368\\-173.1905\\-19\\-13.52013\\-174.7657\\-19\\-14.02571\\-176.6176\\-19\\-14.24492\\-177.9435\\-19\\-14.33936\\-180.3024\\-19\\-14.20106\\-181.9133\\-19\\-13.86696\\-183.7047\\-19\\-13.20319\\-185.8977\\-19\\-12.73275\\-187.054\\-19\\-11.75172\\-188.9993\\-19\\-10.82458\\-190.48\\-19\\-9.554393\\-192.1282\\-19\\-8.637105\\-193.1485\\-19\\-7.039917\\-194.587\\-19\\-5.717835\\-195.5364\\-19\\-4.517857\\-196.2186\\-19\\-3.186833\\-196.7988\\-19\\-1.669466\\-197.257\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.1235377\\-195.474\\-17\\1.804056\\-195.4358\\-17\\3.193761\\-195.1728\\-17\\4.936379\\-194.5104\\-17\\7.081278\\-193.1535\\-17\\8.424042\\-191.9718\\-17\\9.772861\\-190.4307\\-17\\10.66149\\-189.1545\\-17\\11.48567\\-187.7544\\-17\\12.26737\\-185.9685\\-17\\12.8173\\-184.3466\\-17\\13.29074\\-182.0984\\-17\\13.40055\\-179.3775\\-17\\13.07205\\-176.968\\-17\\12.53151\\-175.2713\\-17\\11.47048\\-173.2201\\-17\\10.42338\\-171.8802\\-17\\8.871119\\-170.4704\\-17\\7.842943\\-169.7776\\-17\\6.013384\\-168.8929\\-17\\4.277493\\-168.3248\\-17\\1.7721\\-167.9162\\-17\\-0.6045735\\-167.9008\\-17\\-3.11303\\-168.2811\\-17\\-4.849556\\-168.8343\\-17\\-6.437299\\-169.5556\\-17\\-7.709316\\-170.4028\\-17\\-9.257141\\-171.8151\\-17\\-10.29888\\-173.159\\-17\\-11.35214\\-175.2177\\-17\\-11.87741\\-176.882\\-17\\-12.19843\\-179.3271\\-17\\-12.07064\\-182.0387\\-17\\-11.39801\\-184.8957\\-17\\-10.33594\\-187.4394\\-17\\-9.433351\\-188.9828\\-17\\-8.49837\\-190.3111\\-17\\-7.219549\\-191.7679\\-17\\-5.795415\\-193.0425\\-17\\-3.744724\\-194.3721\\-17\\-1.994946\\-195.0855\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.7068194\\-192.3193\\-15\\1.778206\\-192.2554\\-15\\3.278348\\-191.8488\\-15\\5.270322\\-190.8209\\-15\\6.444961\\-189.8547\\-15\\7.695644\\-188.4697\\-15\\9.096697\\-186.2276\\-15\\9.615885\\-185.0309\\-15\\10.12963\\-183.4464\\-15\\10.33149\\-182.4313\\-15\\10.51023\\-180.2237\\-15\\10.3229\\-178.3365\\-15\\9.868426\\-176.6739\\-15\\8.912128\\-174.7967\\-15\\7.811391\\-173.4004\\-15\\6.810744\\-172.5222\\-15\\5.713912\\-171.8099\\-15\\3.66125\\-170.9448\\-15\\1.180124\\-170.5237\\-15\\-1.314152\\-170.6611\\-15\\-2.488662\\-170.9164\\-15\\-4.607367\\-171.8135\\-15\\-6.15391\\-172.9093\\-15\\-6.968218\\-173.7279\\-15\\-7.729516\\-174.7539\\-15\\-8.665351\\-176.588\\-15\\-9.117551\\-178.2786\\-15\\-9.292521\\-180.2088\\-15\\-9.125008\\-182.1612\\-15\\-8.899356\\-183.3273\\-15\\-8.361764\\-184.9581\\-15\\-7.812262\\-186.1729\\-15\\-6.460924\\-188.2952\\-15\\-5.798864\\-189.1324\\-15\\-4.021014\\-190.7058\\-15\\-3.00817\\-191.3242\\-15\\-1.225947\\-192.0618\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.09172209\\-186.5479\\-13\\1.081909\\-186.5705\\-13\\2.730814\\-186.019\\-13\\4.171261\\-184.7574\\-13\\5.077491\\-183.1443\\-13\\5.434966\\-181.8303\\-13\\5.467434\\-179.6536\\-13\\5.072665\\-178.4028\\-13\\4.113387\\-177.0428\\-13\\3.520375\\-176.4499\\-13\\2.286752\\-175.7327\\-13\\1.468056\\-175.5158\\-13\\-0.2742291\\-175.5056\\-13\\-1.488022\\-175.9041\\-13\\-2.364897\\-176.4514\\-13\\-3.28625\\-177.5044\\-13\\-4.115311\\-178.9828\\-13\\-4.307397\\-180.078\\-13\\-4.283947\\-181.0146\\-13\\-3.822874\\-183.088\\-13\\-2.927249\\-184.6766\\-13\\-1.546395\\-185.9364\\-13" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "2" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "0\\0\\255" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.0846473\\-179.8274\\-61\\-1.105887\\-178.6369\\-61\\-1.105887\\-177.6369\\-61\\0.0846473\\-176.4464\\-61\\1.084647\\-176.4464\\-61\\2.275181\\-177.6369\\-61\\2.275181\\-178.6369\\-61\\1.084647\\-179.8274\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.415353\\-186.8274\\-59\\-2.915353\\-186.3274\\-59\\-3.415353\\-186.3274\\-59\\-3.915353\\-185.8274\\-59\\-4.415353\\-185.8274\\-59\\-7.605886\\-182.6369\\-59\\-7.605886\\-182.1369\\-59\\-8.105886\\-181.6369\\-59\\-8.105886\\-180.1369\\-59\\-8.605886\\-179.6369\\-59\\-8.605886\\-177.1369\\-59\\-8.105886\\-176.6369\\-59\\-8.105886\\-175.1369\\-59\\-7.605886\\-174.6369\\-59\\-7.605886\\-174.1369\\-59\\-4.915353\\-171.4464\\-59\\-4.415353\\-171.4464\\-59\\-3.915353\\-170.9464\\-59\\-3.415353\\-170.9464\\-59\\-2.915353\\-170.4464\\-59\\-2.415353\\-170.4464\\-59\\-1.915353\\-169.9464\\-59\\3.084647\\-169.9464\\-59\\3.584647\\-170.4464\\-59\\4.084647\\-170.4464\\-59\\4.584647\\-170.9464\\-59\\5.084647\\-170.9464\\-59\\5.584647\\-171.4464\\-59\\6.084647\\-171.4464\\-59\\8.775181\\-174.1369\\-59\\8.775181\\-174.6369\\-59\\9.275181\\-175.1369\\-59\\9.275181\\-176.1369\\-59\\9.775181\\-176.6369\\-59\\9.775181\\-180.6369\\-59\\9.275181\\-181.1369\\-59\\9.275181\\-181.6369\\-59\\8.775181\\-182.1369\\-59\\8.775181\\-182.6369\\-59\\5.084647\\-186.3274\\-59\\4.084647\\-186.3274\\-59\\3.584647\\-186.8274\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "74" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.415353\\-190.8274\\-57\\-1.915353\\-190.3274\\-57\\-3.915353\\-190.3274\\-57\\-4.415353\\-189.8274\\-57\\-4.915353\\-189.8274\\-57\\-5.415353\\-189.3274\\-57\\-5.915353\\-189.3274\\-57\\-6.415353\\-188.8274\\-57\\-6.915353\\-188.8274\\-57\\-7.915353\\-187.8274\\-57\\-8.415353\\-187.8274\\-57\\-9.605886\\-186.6369\\-57\\-9.605886\\-186.1369\\-57\\-10.60589\\-185.1369\\-57\\-10.60589\\-184.6369\\-57\\-11.10589\\-184.1369\\-57\\-11.10589\\-183.6369\\-57\\-11.60589\\-183.1369\\-57\\-11.60589\\-182.6369\\-57\\-12.10589\\-182.1369\\-57\\-12.10589\\-175.1369\\-57\\-11.60589\\-174.6369\\-57\\-11.60589\\-173.6369\\-57\\-10.60589\\-172.6369\\-57\\-10.60589\\-172.1369\\-57\\-7.415353\\-168.9464\\-57\\-6.915353\\-168.9464\\-57\\-6.415353\\-168.4464\\-57\\-5.915353\\-168.4464\\-57\\-5.415353\\-167.9464\\-57\\-4.915353\\-167.9464\\-57\\-4.415353\\-167.4464\\-57\\-3.915353\\-167.4464\\-57\\-3.415353\\-166.9464\\-57\\-1.415353\\-166.9464\\-57\\-0.9153527\\-166.4464\\-57\\2.084647\\-166.4464\\-57\\2.584647\\-166.9464\\-57\\4.584647\\-166.9464\\-57\\5.084647\\-167.4464\\-57\\5.584647\\-167.4464\\-57\\6.084647\\-167.9464\\-57\\6.584647\\-167.9464\\-57\\7.084647\\-168.4464\\-57\\7.584647\\-168.4464\\-57\\8.084647\\-168.9464\\-57\\8.584647\\-168.9464\\-57\\12.27518\\-172.6369\\-57\\12.27518\\-173.1369\\-57\\12.77518\\-173.6369\\-57\\12.77518\\-174.6369\\-57\\13.27518\\-175.1369\\-57\\13.27518\\-176.6369\\-57\\13.77518\\-177.1369\\-57\\13.77518\\-180.1369\\-57\\13.27518\\-180.6369\\-57\\13.27518\\-182.1369\\-57\\12.77518\\-182.6369\\-57\\12.77518\\-183.6369\\-57\\12.27518\\-184.1369\\-57\\12.27518\\-184.6369\\-57\\11.27518\\-185.6369\\-57\\11.27518\\-186.1369\\-57\\9.584647\\-187.8274\\-57\\9.084647\\-187.8274\\-57\\8.084647\\-188.8274\\-57\\7.584647\\-188.8274\\-57\\7.084647\\-189.3274\\-57\\6.584647\\-189.3274\\-57\\6.084647\\-189.8274\\-57\\5.584647\\-189.8274\\-57\\5.084647\\-190.3274\\-57\\3.084647\\-190.3274\\-57\\2.584647\\-190.8274\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.415353\\-192.8274\\-55\\-4.915353\\-192.3274\\-55\\-5.915353\\-192.3274\\-55\\-6.415353\\-191.8274\\-55\\-6.915353\\-191.8274\\-55\\-7.415353\\-191.3274\\-55\\-7.915353\\-191.3274\\-55\\-8.415353\\-190.8274\\-55\\-8.915353\\-190.8274\\-55\\-9.915353\\-189.8274\\-55\\-10.41535\\-189.8274\\-55\\-12.10589\\-188.1369\\-55\\-12.10589\\-187.6369\\-55\\-13.10589\\-186.6369\\-55\\-13.10589\\-186.1369\\-55\\-13.60589\\-185.6369\\-55\\-13.60589\\-185.1369\\-55\\-14.10589\\-184.6369\\-55\\-14.10589\\-184.1369\\-55\\-14.60589\\-183.6369\\-55\\-14.60589\\-182.1369\\-55\\-15.10589\\-181.6369\\-55\\-15.10589\\-175.6369\\-55\\-14.60589\\-175.1369\\-55\\-14.60589\\-174.1369\\-55\\-14.10589\\-173.6369\\-55\\-14.10589\\-172.6369\\-55\\-13.60589\\-172.1369\\-55\\-13.60589\\-171.6369\\-55\\-12.60589\\-170.6369\\-55\\-12.60589\\-170.1369\\-55\\-10.41535\\-167.9464\\-55\\-9.915353\\-167.9464\\-55\\-8.415353\\-166.4464\\-55\\-7.915353\\-166.4464\\-55\\-7.415353\\-165.9464\\-55\\-6.415353\\-165.9464\\-55\\-5.915353\\-165.4464\\-55\\-5.415353\\-165.4464\\-55\\-4.915353\\-164.9464\\-55\\-3.415353\\-164.9464\\-55\\-2.915353\\-164.4464\\-55\\4.084647\\-164.4464\\-55\\4.584647\\-164.9464\\-55\\6.084647\\-164.9464\\-55\\6.584647\\-165.4464\\-55\\7.084647\\-165.4464\\-55\\7.584647\\-165.9464\\-55\\8.584647\\-165.9464\\-55\\9.084647\\-166.4464\\-55\\9.584647\\-166.4464\\-55\\10.58465\\-167.4464\\-55\\11.08465\\-167.4464\\-55\\13.77518\\-170.1369\\-55\\13.77518\\-170.6369\\-55\\14.77518\\-171.6369\\-55\\14.77518\\-172.1369\\-55\\15.27518\\-172.6369\\-55\\15.27518\\-173.1369\\-55\\15.77518\\-173.6369\\-55\\15.77518\\-175.1369\\-55\\16.27518\\-175.6369\\-55\\16.27518\\-182.1369\\-55\\15.77518\\-182.6369\\-55\\15.77518\\-183.6369\\-55\\15.27518\\-184.1369\\-55\\15.27518\\-184.6369\\-55\\14.77518\\-185.1369\\-55\\14.77518\\-185.6369\\-55\\14.27518\\-186.1369\\-55\\14.27518\\-186.6369\\-55\\12.77518\\-188.1369\\-55\\12.77518\\-188.6369\\-55\\11.58465\\-189.8274\\-55\\11.08465\\-189.8274\\-55\\10.08465\\-190.8274\\-55\\9.584647\\-190.8274\\-55\\8.584647\\-191.8274\\-55\\7.584647\\-191.8274\\-55\\7.084647\\-192.3274\\-55\\6.084647\\-192.3274\\-55\\5.584647\\-192.8274\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "80" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.915353\\-194.8274\\-53\\-5.415353\\-194.3869\\-53\\-6.915353\\-194.3274\\-53\\-7.415353\\-193.8274\\-53\\-7.915353\\-193.8274\\-53\\-8.415353\\-193.3274\\-53\\-8.915353\\-193.3274\\-53\\-9.415353\\-192.8274\\-53\\-9.915353\\-192.8274\\-53\\-10.91535\\-191.8274\\-53\\-11.41535\\-191.8274\\-53\\-14.10589\\-189.1369\\-53\\-14.10589\\-188.6369\\-53\\-15.10589\\-187.6369\\-53\\-15.10589\\-187.1369\\-53\\-16.10589\\-186.1369\\-53\\-16.10589\\-185.1369\\-53\\-16.60589\\-184.6369\\-53\\-16.60589\\-183.6369\\-53\\-17.10589\\-183.1369\\-53\\-17.10589\\-174.6369\\-53\\-16.60589\\-174.1369\\-53\\-16.60589\\-173.1369\\-53\\-16.10589\\-172.6369\\-53\\-16.10589\\-172.1369\\-53\\-15.60589\\-171.6369\\-53\\-15.60589\\-171.1369\\-53\\-15.10589\\-170.6369\\-53\\-15.10589\\-170.1369\\-53\\-10.41535\\-165.4464\\-53\\-9.915353\\-165.4464\\-53\\-9.415353\\-164.9464\\-53\\-8.915353\\-164.9464\\-53\\-8.415353\\-164.4464\\-53\\-7.915353\\-164.4464\\-53\\-7.415353\\-163.9464\\-53\\-6.415353\\-163.9464\\-53\\-5.915353\\-163.4464\\-53\\-4.415353\\-163.3869\\-53\\-3.915353\\-162.9464\\-53\\-1.915353\\-162.8869\\-53\\3.084647\\-162.8869\\-53\\5.084647\\-162.9464\\-53\\5.584647\\-163.3869\\-53\\7.084647\\-163.4464\\-53\\7.584647\\-163.9464\\-53\\8.584647\\-163.9464\\-53\\9.084647\\-164.4464\\-53\\9.584647\\-164.4464\\-53\\10.08465\\-164.9464\\-53\\10.58465\\-164.9464\\-53\\11.08465\\-165.4464\\-53\\11.58465\\-165.4464\\-53\\16.27518\\-170.1369\\-53\\16.27518\\-170.6369\\-53\\17.27518\\-171.6369\\-53\\17.27518\\-172.6369\\-53\\17.77518\\-173.1369\\-53\\17.77518\\-174.1369\\-53\\18.27518\\-174.6369\\-53\\18.27518\\-183.1369\\-53\\17.77518\\-183.6369\\-53\\17.77518\\-185.1369\\-53\\17.27518\\-185.6369\\-53\\17.27518\\-186.1369\\-53\\16.27518\\-187.1369\\-53\\16.27518\\-187.6369\\-53\\15.27518\\-188.6369\\-53\\15.27518\\-189.1369\\-53\\13.08465\\-191.3274\\-53\\12.58465\\-191.3274\\-53\\11.08465\\-192.8274\\-53\\10.58465\\-192.8274\\-53\\10.08465\\-193.3274\\-53\\9.584647\\-193.3274\\-53\\9.084647\\-193.8274\\-53\\8.584647\\-193.8274\\-53\\8.084647\\-194.3274\\-53\\6.584647\\-194.3274\\-53\\6.084647\\-194.8274\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "93" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.415353\\-196.8274\\-51\\-3.915353\\-196.3869\\-51\\-5.915353\\-196.3274\\-51\\-6.415353\\-195.8869\\-51\\-7.915353\\-195.8274\\-51\\-8.415353\\-195.3274\\-51\\-8.915353\\-195.3274\\-51\\-9.415353\\-194.8274\\-51\\-9.915353\\-194.8274\\-51\\-10.41535\\-194.3274\\-51\\-10.91535\\-194.3274\\-51\\-12.41535\\-192.8274\\-51\\-12.91535\\-192.8274\\-51\\-15.60589\\-190.1369\\-51\\-15.60589\\-189.6369\\-51\\-17.10589\\-188.1369\\-51\\-17.10589\\-187.6369\\-51\\-17.60589\\-187.1369\\-51\\-17.60589\\-186.6369\\-51\\-18.10589\\-186.1369\\-51\\-18.16535\\-185.1369\\-51\\-18.60589\\-184.6369\\-51\\-18.66535\\-183.1369\\-51\\-19.10589\\-182.6369\\-51\\-19.10589\\-175.1369\\-51\\-18.66535\\-174.6369\\-51\\-18.60589\\-173.1369\\-51\\-18.10589\\-172.6369\\-51\\-18.10589\\-172.1369\\-51\\-17.60589\\-171.6369\\-51\\-17.60589\\-171.1369\\-51\\-17.10589\\-170.6369\\-51\\-17.10589\\-170.1369\\-51\\-16.10589\\-169.1369\\-51\\-16.10589\\-168.6369\\-51\\-12.41535\\-164.9464\\-51\\-11.91535\\-164.9464\\-51\\-11.41535\\-164.4464\\-51\\-10.91535\\-164.3869\\-51\\-9.915353\\-163.4464\\-51\\-8.915353\\-163.3869\\-51\\-8.415353\\-162.9464\\-51\\-7.415353\\-162.8869\\-51\\-6.915353\\-162.4464\\-51\\-5.915353\\-162.3869\\-51\\-5.415353\\-161.9464\\-51\\-3.415353\\-161.8869\\-51\\-2.915353\\-161.4464\\-51\\3.584647\\-161.4464\\-51\\4.084647\\-161.8869\\-51\\6.584647\\-161.9464\\-51\\7.084647\\-162.3869\\-51\\8.084647\\-162.4464\\-51\\8.584647\\-162.8869\\-51\\9.584647\\-162.9464\\-51\\11.08465\\-163.8869\\-51\\12.58465\\-164.4464\\-51\\13.58465\\-165.3869\\-51\\14.08465\\-165.4464\\-51\\17.27518\\-168.6369\\-51\\17.27518\\-169.1369\\-51\\18.27518\\-170.1369\\-51\\18.27518\\-170.6369\\-51\\18.77518\\-171.1369\\-51\\19.27518\\-172.1369\\-51\\19.27518\\-172.6369\\-51\\19.77518\\-173.1369\\-51\\19.77518\\-174.1369\\-51\\20.27518\\-174.6369\\-51\\20.27518\\-182.6369\\-51\\19.83465\\-183.1369\\-51\\19.77518\\-184.6369\\-51\\19.33465\\-185.1369\\-51\\19.27518\\-186.1369\\-51\\18.77518\\-186.6369\\-51\\18.77518\\-187.1369\\-51\\18.27518\\-187.6369\\-51\\18.27518\\-188.1369\\-51\\15.77518\\-190.6369\\-51\\15.77518\\-191.1369\\-51\\14.58465\\-192.3274\\-51\\14.08465\\-192.3274\\-51\\12.08465\\-194.3274\\-51\\11.58465\\-194.3274\\-51\\11.08465\\-194.8274\\-51\\10.58465\\-194.8274\\-51\\10.08465\\-195.3274\\-51\\9.084647\\-195.3869\\-51\\8.584647\\-195.8274\\-51\\7.084647\\-195.8869\\-51\\6.584647\\-196.3274\\-51\\5.084647\\-196.3869\\-51\\4.584647\\-196.8274\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "87" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.915353\\-198.3274\\-49\\-3.415353\\-197.8869\\-49\\-5.915353\\-197.8274\\-49\\-6.415353\\-197.3869\\-49\\-7.415353\\-197.3274\\-49\\-7.915353\\-196.8869\\-49\\-8.915353\\-196.8274\\-49\\-9.415353\\-196.3869\\-49\\-10.41535\\-196.3274\\-49\\-10.91535\\-195.8274\\-49\\-11.41535\\-195.8274\\-49\\-12.41535\\-194.8274\\-49\\-12.91535\\-194.8274\\-49\\-17.10589\\-190.6369\\-49\\-17.16535\\-190.1369\\-49\\-18.10589\\-189.1369\\-49\\-19.60589\\-186.1369\\-49\\-19.66535\\-185.1369\\-49\\-20.10589\\-184.6369\\-49\\-20.16535\\-183.1369\\-49\\-20.60589\\-182.6369\\-49\\-20.66535\\-177.6369\\-49\\-20.60589\\-174.6369\\-49\\-20.16535\\-174.1369\\-49\\-20.10589\\-173.1369\\-49\\-19.66535\\-172.6369\\-49\\-19.60589\\-171.6369\\-49\\-19.10589\\-170.6369\\-49\\-18.60589\\-170.1369\\-49\\-18.60589\\-169.6369\\-49\\-17.16535\\-168.1369\\-49\\-17.10589\\-167.6369\\-49\\-13.91535\\-164.4464\\-49\\-13.41535\\-164.3869\\-49\\-12.41535\\-163.4464\\-49\\-9.915353\\-162.3869\\-49\\-9.415353\\-161.9464\\-49\\-8.415353\\-161.8869\\-49\\-7.915353\\-161.4464\\-49\\-6.415353\\-161.3869\\-49\\-5.915353\\-160.9464\\-49\\-3.415353\\-160.8869\\-49\\-2.915353\\-160.4464\\-49\\4.084647\\-160.4464\\-49\\4.584647\\-160.8869\\-49\\7.084647\\-160.9464\\-49\\7.584647\\-161.3869\\-49\\9.084647\\-161.4464\\-49\\10.58465\\-162.3869\\-49\\11.58465\\-162.4464\\-49\\12.08465\\-162.9464\\-49\\12.58465\\-162.9464\\-49\\13.58465\\-163.4464\\-49\\15.08465\\-164.8869\\-49\\15.58465\\-164.9464\\-49\\18.27518\\-167.6369\\-49\\18.33465\\-168.1369\\-49\\19.77518\\-169.6369\\-49\\19.77518\\-170.1369\\-49\\20.27518\\-170.6369\\-49\\20.77518\\-171.6369\\-49\\20.83465\\-172.6369\\-49\\21.27518\\-173.1369\\-49\\21.33465\\-174.1369\\-49\\21.77518\\-174.6369\\-49\\21.83465\\-176.6369\\-49\\21.83465\\-180.6369\\-49\\21.77518\\-183.1369\\-49\\21.33465\\-183.6369\\-49\\21.27518\\-184.6369\\-49\\20.83465\\-185.1369\\-49\\20.77518\\-186.1369\\-49\\20.33465\\-186.6369\\-49\\19.27518\\-189.1369\\-49\\18.27518\\-190.1369\\-49\\18.27518\\-190.6369\\-49\\14.58465\\-194.3274\\-49\\14.08465\\-194.3274\\-49\\13.08465\\-195.3274\\-49\\11.58465\\-195.8869\\-49\\10.08465\\-196.8274\\-49\\9.084647\\-196.8869\\-49\\8.584647\\-197.3274\\-49\\7.084647\\-197.3869\\-49\\6.584647\\-197.8274\\-49\\4.084647\\-197.8869\\-49\\3.584647\\-198.3274\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "85" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.415353\\-199.3274\\-47\\-4.915353\\-198.8869\\-47\\-6.915353\\-198.8274\\-47\\-7.415353\\-198.3869\\-47\\-8.415353\\-198.3274\\-47\\-8.915353\\-197.8869\\-47\\-9.915353\\-197.8274\\-47\\-11.41535\\-196.8869\\-47\\-12.91535\\-196.3274\\-47\\-13.91535\\-195.3869\\-47\\-14.41535\\-195.3274\\-47\\-17.60589\\-192.1369\\-47\\-17.66535\\-191.6369\\-47\\-19.10589\\-190.1369\\-47\\-19.16535\\-189.6369\\-47\\-20.60589\\-187.1369\\-47\\-20.66535\\-186.1369\\-47\\-21.10589\\-185.6369\\-47\\-21.16535\\-184.6369\\-47\\-21.60589\\-184.1369\\-47\\-21.66535\\-182.1369\\-47\\-22.10589\\-181.6369\\-47\\-22.10589\\-176.1369\\-47\\-21.66535\\-175.6369\\-47\\-21.60589\\-173.6369\\-47\\-21.16535\\-173.1369\\-47\\-21.10589\\-172.1369\\-47\\-19.66535\\-169.6369\\-47\\-19.60589\\-169.1369\\-47\\-18.66535\\-168.1369\\-47\\-18.60589\\-167.6369\\-47\\-16.41535\\-165.3869\\-47\\-14.41535\\-163.4464\\-47\\-13.91535\\-163.3869\\-47\\-12.41535\\-162.4464\\-47\\-9.915353\\-161.3869\\-47\\-9.415353\\-160.9464\\-47\\-7.915353\\-160.8869\\-47\\-7.415353\\-160.4464\\-47\\-5.915353\\-160.3869\\-47\\-5.415353\\-159.9464\\-47\\-4.415353\\-159.8869\\-47\\5.584647\\-159.8869\\-47\\6.584647\\-160.3869\\-47\\8.584647\\-160.4464\\-47\\9.084647\\-160.8869\\-47\\10.08465\\-160.9464\\-47\\10.58465\\-161.3869\\-47\\11.58465\\-161.4464\\-47\\12.08465\\-161.8869\\-47\\14.58465\\-162.9464\\-47\\15.58465\\-163.8869\\-47\\16.08465\\-163.9464\\-47\\19.77518\\-167.6369\\-47\\19.83465\\-168.1369\\-47\\20.77518\\-169.1369\\-47\\20.83465\\-169.6369\\-47\\22.27518\\-172.1369\\-47\\22.33465\\-173.1369\\-47\\22.77518\\-173.6369\\-47\\22.83465\\-175.6369\\-47\\23.27518\\-176.1369\\-47\\23.27518\\-182.1369\\-47\\22.83465\\-182.6369\\-47\\22.77518\\-184.1369\\-47\\22.33465\\-184.6369\\-47\\22.27518\\-185.6369\\-47\\21.83465\\-186.1369\\-47\\21.77518\\-187.1369\\-47\\21.33465\\-187.6369\\-47\\20.27518\\-190.1369\\-47\\18.33465\\-192.1369\\-47\\18.27518\\-192.6369\\-47\\16.08465\\-194.8274\\-47\\15.58465\\-194.8869\\-47\\14.08465\\-196.3274\\-47\\13.58465\\-196.3274\\-47\\13.08465\\-196.8274\\-47\\12.08465\\-197.3274\\-47\\11.08465\\-197.3869\\-47\\9.584647\\-198.3274\\-47\\8.084647\\-198.3869\\-47\\7.584647\\-198.8274\\-47\\5.584647\\-198.8869\\-47\\5.084647\\-199.3274\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "96" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.415353\\-200.3274\\-45\\-5.915353\\-199.8869\\-45\\-7.415353\\-199.8274\\-45\\-7.915353\\-199.3869\\-45\\-8.915353\\-199.3274\\-45\\-9.415353\\-198.8869\\-45\\-10.41535\\-198.8274\\-45\\-10.91535\\-198.3869\\-45\\-13.41535\\-197.3274\\-45\\-14.41535\\-196.3869\\-45\\-14.91535\\-196.3274\\-45\\-19.10589\\-192.1369\\-45\\-19.16535\\-191.6369\\-45\\-20.10589\\-190.6369\\-45\\-21.60589\\-187.6369\\-45\\-21.66535\\-186.6369\\-45\\-22.10589\\-186.1369\\-45\\-22.16535\\-185.1369\\-45\\-22.60589\\-184.6369\\-45\\-22.66535\\-182.6369\\-45\\-23.10589\\-182.1369\\-45\\-23.10589\\-175.6369\\-45\\-22.66535\\-175.1369\\-45\\-22.60589\\-173.6369\\-45\\-22.16535\\-173.1369\\-45\\-22.10589\\-172.1369\\-45\\-20.66535\\-169.6369\\-45\\-20.60589\\-169.1369\\-45\\-19.66535\\-167.6369\\-45\\-19.60589\\-167.1369\\-45\\-16.41535\\-163.9464\\-45\\-15.91535\\-163.8869\\-45\\-14.91535\\-162.9464\\-45\\-14.41535\\-162.8869\\-45\\-13.41535\\-161.9464\\-45\\-12.91535\\-161.8869\\-45\\-11.41535\\-160.9464\\-45\\-10.41535\\-160.8869\\-45\\-9.915353\\-160.4464\\-45\\-8.915353\\-160.3869\\-45\\-8.415353\\-159.9464\\-45\\-6.915353\\-159.8869\\-45\\-6.415353\\-159.4464\\-45\\-5.415353\\-159.3869\\-45\\-1.915353\\-159.3869\\-45\\-1.415353\\-158.9464\\-45\\1.584647\\-158.9464\\-45\\2.084647\\-159.3869\\-45\\6.084647\\-159.3869\\-45\\7.084647\\-159.4464\\-45\\7.584647\\-159.8869\\-45\\9.084647\\-159.9464\\-45\\9.584647\\-160.3869\\-45\\10.58465\\-160.4464\\-45\\11.08465\\-160.8869\\-45\\12.08465\\-160.9464\\-45\\12.58465\\-161.3869\\-45\\13.08465\\-161.3869\\-45\\13.58465\\-161.8869\\-45\\14.08465\\-161.8869\\-45\\14.58465\\-162.3869\\-45\\16.08465\\-162.9464\\-45\\17.58465\\-164.3869\\-45\\18.08465\\-164.4464\\-45\\20.27518\\-166.6369\\-45\\20.33465\\-167.1369\\-45\\21.27518\\-168.1369\\-45\\21.83465\\-169.6369\\-45\\23.27518\\-172.1369\\-45\\23.33465\\-173.1369\\-45\\23.77518\\-173.6369\\-45\\23.83465\\-175.1369\\-45\\24.27518\\-175.6369\\-45\\24.27518\\-182.6369\\-45\\23.83465\\-183.1369\\-45\\23.77518\\-184.6369\\-45\\23.33465\\-185.1369\\-45\\23.27518\\-186.1369\\-45\\22.83465\\-186.6369\\-45\\22.77518\\-187.6369\\-45\\21.27518\\-190.6369\\-45\\19.83465\\-192.1369\\-45\\19.77518\\-192.6369\\-45\\16.58465\\-195.8274\\-45\\16.08465\\-195.8869\\-45\\14.58465\\-197.3274\\-45\\12.08465\\-198.3869\\-45\\11.58465\\-198.8274\\-45\\10.58465\\-198.8869\\-45\\10.08465\\-199.3274\\-45\\8.584647\\-199.3869\\-45\\8.084647\\-199.8274\\-45\\6.084647\\-199.8869\\-45\\5.584647\\-200.3274\\-45\\3.084647\\-200.3869\\-45\\-2.915353\\-200.3869\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "103" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.415353\\-201.3274\\-43\\-5.915353\\-200.8869\\-43\\-7.415353\\-200.8274\\-43\\-7.915353\\-200.3869\\-43\\-9.415353\\-200.3274\\-43\\-10.91535\\-199.3869\\-43\\-11.91535\\-199.3274\\-43\\-12.91535\\-198.8274\\-43\\-13.91535\\-197.8869\\-43\\-14.41535\\-197.8274\\-43\\-15.41535\\-196.8869\\-43\\-15.91535\\-196.8274\\-43\\-19.10589\\-193.6369\\-43\\-19.16535\\-193.1369\\-43\\-20.10589\\-192.1369\\-43\\-20.16535\\-191.6369\\-43\\-21.10589\\-190.6369\\-43\\-21.66535\\-189.1369\\-43\\-22.10589\\-188.6369\\-43\\-22.16535\\-187.6369\\-43\\-22.60589\\-187.1369\\-43\\-22.66535\\-186.1369\\-43\\-23.10589\\-185.6369\\-43\\-23.16535\\-184.6369\\-43\\-23.60589\\-184.1369\\-43\\-23.66535\\-182.1369\\-43\\-24.10589\\-181.6369\\-43\\-24.10589\\-176.6369\\-43\\-23.66535\\-176.1369\\-43\\-23.60589\\-173.6369\\-43\\-23.16535\\-173.1369\\-43\\-23.10589\\-172.1369\\-43\\-21.66535\\-169.6369\\-43\\-21.10589\\-168.1369\\-43\\-20.16535\\-167.1369\\-43\\-20.10589\\-166.6369\\-43\\-16.91535\\-163.4464\\-43\\-16.41535\\-163.3869\\-43\\-15.41535\\-162.4464\\-43\\-14.91535\\-162.3869\\-43\\-14.41535\\-161.8869\\-43\\-13.91535\\-161.8869\\-43\\-12.91535\\-160.9464\\-43\\-11.91535\\-160.8869\\-43\\-11.41535\\-160.3869\\-43\\-10.91535\\-160.3869\\-43\\-10.41535\\-159.9464\\-43\\-8.915353\\-159.8869\\-43\\-8.415353\\-159.4464\\-43\\-6.415353\\-159.3869\\-43\\-5.415353\\-158.8869\\-43\\6.084647\\-158.8869\\-43\\7.084647\\-159.3869\\-43\\9.084647\\-159.4464\\-43\\9.584647\\-159.8869\\-43\\11.08465\\-159.9464\\-43\\11.58465\\-160.3869\\-43\\12.58465\\-160.4464\\-43\\15.08465\\-161.8869\\-43\\15.58465\\-161.9464\\-43\\16.58465\\-162.8869\\-43\\17.08465\\-162.9464\\-43\\18.08465\\-163.8869\\-43\\18.58465\\-163.9464\\-43\\21.27518\\-166.6369\\-43\\21.33465\\-167.1369\\-43\\22.27518\\-168.1369\\-43\\22.83465\\-169.6369\\-43\\24.27518\\-172.1369\\-43\\24.33465\\-173.1369\\-43\\24.77518\\-173.6369\\-43\\24.83465\\-176.1369\\-43\\25.27518\\-176.6369\\-43\\25.27518\\-181.6369\\-43\\24.83465\\-182.1369\\-43\\24.77518\\-184.1369\\-43\\24.33465\\-184.6369\\-43\\24.27518\\-185.6369\\-43\\23.83465\\-186.1369\\-43\\23.77518\\-187.1369\\-43\\23.33465\\-187.6369\\-43\\23.27518\\-188.6369\\-43\\22.83465\\-189.1369\\-43\\22.27518\\-190.6369\\-43\\21.33465\\-191.6369\\-43\\21.27518\\-192.1369\\-43\\19.83465\\-193.6369\\-43\\19.77518\\-194.1369\\-43\\17.58465\\-196.3274\\-43\\17.08465\\-196.3869\\-43\\15.58465\\-197.8274\\-43\\14.08465\\-198.3869\\-43\\13.58465\\-198.8274\\-43\\12.08465\\-199.3869\\-43\\11.58465\\-199.8274\\-43\\10.58465\\-199.8869\\-43\\10.08465\\-200.3274\\-43\\8.584647\\-200.3869\\-43\\8.084647\\-200.8274\\-43\\6.084647\\-200.8869\\-43\\5.584647\\-201.3274\\-43\\3.084647\\-201.3869\\-43\\-3.415353\\-201.3869\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "109" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.915353\\-202.3274\\-41\\-5.415353\\-201.8869\\-41\\-7.415353\\-201.8274\\-41\\-7.915353\\-201.3869\\-41\\-8.915353\\-201.3274\\-41\\-9.415353\\-200.8869\\-41\\-10.41535\\-200.8274\\-41\\-12.91535\\-199.3869\\-41\\-14.41535\\-198.8274\\-41\\-15.91535\\-197.3869\\-41\\-16.41535\\-197.3274\\-41\\-19.60589\\-194.1369\\-41\\-19.66535\\-193.6369\\-41\\-20.60589\\-192.6369\\-41\\-20.66535\\-192.1369\\-41\\-21.60589\\-191.1369\\-41\\-22.16535\\-189.6369\\-41\\-23.10589\\-188.1369\\-41\\-23.16535\\-187.1369\\-41\\-23.60589\\-186.6369\\-41\\-23.66535\\-185.6369\\-41\\-24.10589\\-185.1369\\-41\\-24.16535\\-183.1369\\-41\\-24.60589\\-182.6369\\-41\\-24.66535\\-181.6369\\-41\\-24.66535\\-176.6369\\-41\\-24.60589\\-175.1369\\-41\\-24.16535\\-174.6369\\-41\\-24.10589\\-173.1369\\-41\\-23.66535\\-172.6369\\-41\\-23.60589\\-171.6369\\-41\\-22.66535\\-170.1369\\-41\\-22.66535\\-169.6369\\-41\\-22.16535\\-169.1369\\-41\\-22.10589\\-168.6369\\-41\\-21.16535\\-167.6369\\-41\\-21.10589\\-167.1369\\-41\\-20.16535\\-166.1369\\-41\\-20.10589\\-165.6369\\-41\\-18.41535\\-163.9464\\-41\\-17.91535\\-163.8869\\-41\\-16.41535\\-162.4464\\-41\\-15.91535\\-162.3869\\-41\\-15.41535\\-161.8869\\-41\\-14.91535\\-161.8869\\-41\\-13.91535\\-160.9464\\-41\\-12.91535\\-160.4464\\-41\\-11.91535\\-160.3869\\-41\\-11.41535\\-159.8869\\-41\\-10.41535\\-159.8869\\-41\\-9.915353\\-159.3869\\-41\\-8.415353\\-159.3869\\-41\\-7.915353\\-158.9464\\-41\\-4.415353\\-158.8869\\-41\\-3.915353\\-158.4464\\-41\\-2.915353\\-158.3869\\-41\\3.584647\\-158.3869\\-41\\4.584647\\-158.4464\\-41\\5.084647\\-158.8869\\-41\\8.084647\\-158.9464\\-41\\8.584647\\-159.3869\\-41\\10.58465\\-159.3869\\-41\\11.08465\\-159.8869\\-41\\12.08465\\-159.8869\\-41\\12.58465\\-160.3869\\-41\\13.58465\\-160.4464\\-41\\16.58465\\-161.9464\\-41\\17.58465\\-162.8869\\-41\\18.58465\\-163.3869\\-41\\21.83465\\-166.6369\\-41\\22.33465\\-167.6369\\-41\\23.27518\\-168.6369\\-41\\23.83465\\-170.1369\\-41\\24.77518\\-171.6369\\-41\\24.83465\\-172.6369\\-41\\25.27518\\-173.1369\\-41\\25.33465\\-174.6369\\-41\\25.77518\\-175.1369\\-41\\25.83465\\-176.1369\\-41\\25.83465\\-181.6369\\-41\\25.77518\\-182.6369\\-41\\25.33465\\-183.1369\\-41\\25.27518\\-185.1369\\-41\\24.83465\\-185.6369\\-41\\24.77518\\-186.6369\\-41\\24.33465\\-187.1369\\-41\\24.27518\\-188.1369\\-41\\23.33465\\-189.6369\\-41\\22.77518\\-191.1369\\-41\\21.83465\\-192.1369\\-41\\21.77518\\-192.6369\\-41\\20.83465\\-193.6369\\-41\\20.77518\\-194.1369\\-41\\18.08465\\-196.8274\\-41\\17.58465\\-196.8869\\-41\\16.08465\\-198.3274\\-41\\15.58465\\-198.3869\\-41\\14.58465\\-199.3274\\-41\\12.58465\\-200.3274\\-41\\11.58465\\-200.3869\\-41\\11.08465\\-200.8274\\-41\\10.08465\\-200.8869\\-41\\9.584647\\-201.3274\\-41\\8.584647\\-201.3869\\-41\\8.084647\\-201.8274\\-41\\5.584647\\-201.8869\\-41\\5.084647\\-202.3274\\-41\\3.084647\\-202.3869\\-41\\-2.415353\\-202.3869\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "135" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.415353\\-203.3274\\-39\\-3.915353\\-202.8869\\-39\\-6.415353\\-202.8274\\-39\\-6.915353\\-202.3869\\-39\\-8.415353\\-202.3274\\-39\\-8.915353\\-201.8869\\-39\\-9.915353\\-201.8274\\-39\\-11.41535\\-200.8869\\-39\\-11.91535\\-200.8869\\-39\\-12.41535\\-200.3869\\-39\\-12.91535\\-200.3869\\-39\\-13.41535\\-199.8869\\-39\\-13.91535\\-199.8274\\-39\\-14.91535\\-198.8869\\-39\\-15.41535\\-198.8274\\-39\\-16.91535\\-197.3869\\-39\\-17.41535\\-197.3274\\-39\\-19.10589\\-195.6369\\-39\\-19.16535\\-195.1369\\-39\\-20.60589\\-193.6369\\-39\\-20.66535\\-193.1369\\-39\\-21.60589\\-192.1369\\-39\\-21.66535\\-191.6369\\-39\\-22.16535\\-191.1369\\-39\\-22.16535\\-190.6369\\-39\\-22.66535\\-190.1369\\-39\\-22.66535\\-189.6369\\-39\\-23.16535\\-189.1369\\-39\\-23.16535\\-188.6369\\-39\\-23.60589\\-188.1369\\-39\\-23.66535\\-187.1369\\-39\\-24.16535\\-186.6369\\-39\\-24.16535\\-185.6369\\-39\\-24.60589\\-185.1369\\-39\\-24.66535\\-183.1369\\-39\\-25.10589\\-182.6369\\-39\\-25.16535\\-181.6369\\-39\\-25.16535\\-176.6369\\-39\\-25.10589\\-175.6369\\-39\\-24.66535\\-175.1369\\-39\\-24.60589\\-173.1369\\-39\\-24.16535\\-172.6369\\-39\\-24.10589\\-171.6369\\-39\\-23.66535\\-171.1369\\-39\\-23.66535\\-170.6369\\-39\\-23.16535\\-170.1369\\-39\\-23.10589\\-169.1369\\-39\\-22.16535\\-168.1369\\-39\\-22.10589\\-167.6369\\-39\\-21.16535\\-166.6369\\-39\\-21.10589\\-166.1369\\-39\\-17.91535\\-162.9464\\-39\\-17.41535\\-162.8869\\-39\\-16.41535\\-161.9464\\-39\\-15.91535\\-161.8869\\-39\\-15.41535\\-161.3869\\-39\\-14.91535\\-161.3869\\-39\\-14.41535\\-160.8869\\-39\\-13.91535\\-160.8869\\-39\\-13.41535\\-160.3869\\-39\\-12.91535\\-160.3869\\-39\\-12.41535\\-159.8869\\-39\\-11.41535\\-159.8869\\-39\\-10.91535\\-159.3869\\-39\\-9.415353\\-159.3869\\-39\\-8.915353\\-158.8869\\-39\\-6.415353\\-158.8869\\-39\\-5.415353\\-158.3869\\-39\\5.584647\\-158.3869\\-39\\6.584647\\-158.8869\\-39\\9.084647\\-158.8869\\-39\\9.584647\\-159.3869\\-39\\11.58465\\-159.4464\\-39\\12.08465\\-159.8869\\-39\\13.08465\\-159.8869\\-39\\13.58465\\-160.3869\\-39\\14.08465\\-160.3869\\-39\\14.58465\\-160.8869\\-39\\15.08465\\-160.8869\\-39\\15.58465\\-161.3869\\-39\\16.08465\\-161.3869\\-39\\16.58465\\-161.8869\\-39\\17.08465\\-161.8869\\-39\\17.58465\\-162.3869\\-39\\18.08465\\-162.4464\\-39\\19.58465\\-163.8869\\-39\\20.08465\\-163.9464\\-39\\21.77518\\-165.6369\\-39\\21.83465\\-166.1369\\-39\\23.27518\\-167.6369\\-39\\23.33465\\-168.1369\\-39\\23.83465\\-168.6369\\-39\\23.83465\\-169.1369\\-39\\24.33465\\-169.6369\\-39\\24.33465\\-170.1369\\-39\\24.83465\\-170.6369\\-39\\24.83465\\-171.1369\\-39\\25.27518\\-171.6369\\-39\\25.33465\\-172.6369\\-39\\25.77518\\-173.1369\\-39\\25.83465\\-175.1369\\-39\\26.33465\\-176.1369\\-39\\26.33465\\-181.6369\\-39\\26.27518\\-182.6369\\-39\\25.83465\\-183.1369\\-39\\25.77518\\-185.1369\\-39\\25.33465\\-185.6369\\-39\\25.33465\\-186.6369\\-39\\24.83465\\-187.1369\\-39\\24.77518\\-188.1369\\-39\\23.83465\\-189.6369\\-39\\23.83465\\-190.1369\\-39\\23.33465\\-190.6369\\-39\\23.33465\\-191.1369\\-39\\22.83465\\-191.6369\\-39\\22.77518\\-192.1369\\-39\\21.83465\\-193.1369\\-39\\21.77518\\-193.6369\\-39\\19.83465\\-195.6369\\-39\\19.77518\\-196.1369\\-39\\19.08465\\-196.8274\\-39\\18.58465\\-196.8869\\-39\\16.58465\\-198.8274\\-39\\16.08465\\-198.8869\\-39\\15.08465\\-199.8274\\-39\\12.58465\\-200.8869\\-39\\12.08465\\-201.3274\\-39\\11.08465\\-201.3869\\-39\\10.58465\\-201.8274\\-39\\9.584647\\-201.8869\\-39\\9.084647\\-202.3274\\-39\\7.584647\\-202.3869\\-39\\7.084647\\-202.8274\\-39\\4.584647\\-202.8869\\-39\\4.084647\\-203.3274\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "134" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.915353\\-203.8274\\-37\\-5.415353\\-203.3869\\-37\\-6.915353\\-203.3274\\-37\\-7.415353\\-202.8869\\-37\\-8.915353\\-202.8274\\-37\\-9.415353\\-202.3869\\-37\\-10.41535\\-202.3274\\-37\\-12.91535\\-200.8869\\-37\\-13.41535\\-200.8274\\-37\\-14.41535\\-199.8869\\-37\\-14.91535\\-199.8274\\-37\\-16.41535\\-198.3869\\-37\\-16.91535\\-198.3274\\-37\\-19.10589\\-196.1369\\-37\\-19.16535\\-195.6369\\-37\\-21.10589\\-193.6369\\-37\\-21.16535\\-193.1369\\-37\\-22.10589\\-192.1369\\-37\\-22.66535\\-190.6369\\-37\\-23.16535\\-190.1369\\-37\\-23.16535\\-189.6369\\-37\\-23.66535\\-189.1369\\-37\\-23.66535\\-188.1369\\-37\\-24.16535\\-187.6369\\-37\\-24.16535\\-187.1369\\-37\\-24.60589\\-186.6369\\-37\\-24.66535\\-185.1369\\-37\\-25.10589\\-184.6369\\-37\\-25.16535\\-182.1369\\-37\\-25.60589\\-181.6369\\-37\\-25.66535\\-180.6369\\-37\\-25.66535\\-177.1369\\-37\\-25.60589\\-176.1369\\-37\\-25.16535\\-175.6369\\-37\\-25.10589\\-173.6369\\-37\\-24.66535\\-173.1369\\-37\\-24.66535\\-172.1369\\-37\\-24.16535\\-171.6369\\-37\\-24.10589\\-170.6369\\-37\\-23.66535\\-170.1369\\-37\\-23.66535\\-169.6369\\-37\\-23.16535\\-169.1369\\-37\\-23.16535\\-168.6369\\-37\\-22.66535\\-168.1369\\-37\\-22.60589\\-167.6369\\-37\\-21.16535\\-166.1369\\-37\\-21.10589\\-165.6369\\-37\\-18.91535\\-163.4464\\-37\\-18.41535\\-163.3869\\-37\\-17.41535\\-162.3869\\-37\\-16.91535\\-162.3869\\-37\\-15.91535\\-161.4464\\-37\\-15.41535\\-161.3869\\-37\\-14.91535\\-160.8869\\-37\\-14.41535\\-160.8869\\-37\\-13.91535\\-160.3869\\-37\\-13.41535\\-160.3869\\-37\\-12.91535\\-159.9464\\-37\\-11.91535\\-159.8869\\-37\\-11.41535\\-159.3869\\-37\\-9.915353\\-159.3869\\-37\\-9.415353\\-158.8869\\-37\\-7.415353\\-158.8869\\-37\\-6.415353\\-158.3869\\-37\\-2.915353\\-158.3869\\-37\\-2.415353\\-157.8869\\-37\\2.584647\\-157.8869\\-37\\3.084647\\-158.3869\\-37\\6.584647\\-158.3869\\-37\\7.584647\\-158.8869\\-37\\9.584647\\-158.8869\\-37\\10.08465\\-159.3869\\-37\\11.58465\\-159.3869\\-37\\12.08465\\-159.8869\\-37\\13.58465\\-159.8869\\-37\\14.08465\\-160.3869\\-37\\14.58465\\-160.3869\\-37\\15.08465\\-160.8869\\-37\\15.58465\\-160.8869\\-37\\16.08465\\-161.3869\\-37\\16.58465\\-161.3869\\-37\\17.08465\\-161.8869\\-37\\17.58465\\-161.8869\\-37\\18.58465\\-162.8869\\-37\\19.08465\\-162.8869\\-37\\23.33465\\-167.1369\\-37\\23.33465\\-167.6369\\-37\\24.33465\\-168.6369\\-37\\24.33465\\-169.1369\\-37\\24.83465\\-169.6369\\-37\\24.83465\\-170.1369\\-37\\25.27518\\-170.6369\\-37\\25.33465\\-171.6369\\-37\\25.77518\\-172.1369\\-37\\25.83465\\-173.6369\\-37\\26.33465\\-174.1369\\-37\\26.33465\\-175.6369\\-37\\26.83465\\-176.6369\\-37\\26.83465\\-180.6369\\-37\\26.77518\\-181.6369\\-37\\26.33465\\-182.1369\\-37\\26.27518\\-184.6369\\-37\\25.83465\\-185.1369\\-37\\25.77518\\-186.6369\\-37\\25.33465\\-187.1369\\-37\\25.33465\\-187.6369\\-37\\24.83465\\-188.1369\\-37\\24.77518\\-189.1369\\-37\\24.33465\\-189.6369\\-37\\24.33465\\-190.1369\\-37\\23.83465\\-190.6369\\-37\\23.83465\\-191.1369\\-37\\23.33465\\-191.6369\\-37\\23.27518\\-192.1369\\-37\\22.33465\\-193.1369\\-37\\22.27518\\-193.6369\\-37\\20.33465\\-195.6369\\-37\\20.27518\\-196.1369\\-37\\18.08465\\-198.3274\\-37\\17.58465\\-198.3869\\-37\\16.08465\\-199.8274\\-37\\14.58465\\-200.3869\\-37\\13.58465\\-201.3274\\-37\\12.58465\\-201.8274\\-37\\11.58465\\-201.8869\\-37\\11.08465\\-202.3274\\-37\\10.08465\\-202.3869\\-37\\9.584647\\-202.8274\\-37\\8.584647\\-202.8869\\-37\\8.084647\\-203.3274\\-37\\6.584647\\-203.3869\\-37\\6.084647\\-203.8274\\-37\\4.584647\\-203.8869\\-37\\-3.915353\\-203.8869\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "128" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.415353\\-204.8274\\-35\\-2.915353\\-204.3869\\-35\\-5.415353\\-204.3274\\-35\\-5.915353\\-203.8869\\-35\\-7.415353\\-203.8274\\-35\\-7.915353\\-203.3869\\-35\\-8.915353\\-203.3274\\-35\\-9.415353\\-202.8869\\-35\\-10.41535\\-202.8274\\-35\\-12.91535\\-201.3869\\-35\\-13.41535\\-201.3274\\-35\\-14.41535\\-200.3869\\-35\\-15.41535\\-199.8869\\-35\\-20.66535\\-194.6369\\-35\\-21.16535\\-193.6369\\-35\\-22.10589\\-192.6369\\-35\\-22.16535\\-192.1369\\-35\\-22.66535\\-191.6369\\-35\\-22.66535\\-191.1369\\-35\\-23.16535\\-190.6369\\-35\\-23.16535\\-190.1369\\-35\\-23.66535\\-189.6369\\-35\\-23.66535\\-188.6369\\-35\\-24.16535\\-188.1369\\-35\\-24.16535\\-187.6369\\-35\\-24.66535\\-187.1369\\-35\\-24.66535\\-185.6369\\-35\\-25.16535\\-185.1369\\-35\\-25.16535\\-183.6369\\-35\\-25.66535\\-182.6369\\-35\\-25.66535\\-175.1369\\-35\\-25.16535\\-174.1369\\-35\\-25.16535\\-173.1369\\-35\\-24.66535\\-172.6369\\-35\\-24.66535\\-171.6369\\-35\\-24.16535\\-171.1369\\-35\\-24.16535\\-170.1369\\-35\\-23.66535\\-169.6369\\-35\\-23.66535\\-169.1369\\-35\\-23.16535\\-168.6369\\-35\\-23.16535\\-168.1369\\-35\\-22.16535\\-167.1369\\-35\\-21.66535\\-166.1369\\-35\\-18.41535\\-162.8869\\-35\\-17.91535\\-162.8869\\-35\\-16.91535\\-161.8869\\-35\\-16.41535\\-161.8869\\-35\\-15.91535\\-161.3869\\-35\\-15.41535\\-161.3869\\-35\\-14.91535\\-160.8869\\-35\\-14.41535\\-160.8869\\-35\\-13.91535\\-160.3869\\-35\\-13.41535\\-160.3869\\-35\\-12.91535\\-159.8869\\-35\\-11.91535\\-159.8869\\-35\\-11.41535\\-159.3869\\-35\\-9.915353\\-159.3869\\-35\\-9.415353\\-158.8869\\-35\\-7.415353\\-158.8869\\-35\\-6.915353\\-158.3869\\-35\\-3.415353\\-158.3869\\-35\\-2.915353\\-157.8869\\-35\\3.084647\\-157.8869\\-35\\3.584647\\-158.3869\\-35\\7.084647\\-158.3869\\-35\\7.584647\\-158.8869\\-35\\9.584647\\-158.8869\\-35\\10.08465\\-159.3869\\-35\\11.58465\\-159.3869\\-35\\12.08465\\-159.8869\\-35\\13.58465\\-159.8869\\-35\\14.08465\\-160.3869\\-35\\14.58465\\-160.3869\\-35\\15.08465\\-160.8869\\-35\\15.58465\\-160.8869\\-35\\16.08465\\-161.3869\\-35\\16.58465\\-161.3869\\-35\\17.08465\\-161.8869\\-35\\17.58465\\-161.8869\\-35\\18.08465\\-162.3869\\-35\\18.58465\\-162.3869\\-35\\20.08465\\-163.8869\\-35\\20.58465\\-163.8869\\-35\\22.77518\\-166.1369\\-35\\22.83465\\-166.6369\\-35\\23.83465\\-167.6369\\-35\\23.83465\\-168.1369\\-35\\24.83465\\-169.1369\\-35\\24.83465\\-169.6369\\-35\\25.27518\\-170.1369\\-35\\25.33465\\-171.1369\\-35\\25.83465\\-171.6369\\-35\\25.83465\\-172.6369\\-35\\26.33465\\-173.1369\\-35\\26.33465\\-174.1369\\-35\\26.83465\\-175.1369\\-35\\26.83465\\-182.6369\\-35\\26.33465\\-183.6369\\-35\\26.33465\\-185.1369\\-35\\25.83465\\-185.6369\\-35\\25.83465\\-187.1369\\-35\\25.33465\\-187.6369\\-35\\25.27518\\-188.6369\\-35\\24.83465\\-189.1369\\-35\\24.83465\\-189.6369\\-35\\24.33465\\-190.1369\\-35\\24.33465\\-190.6369\\-35\\23.83465\\-191.1369\\-35\\23.83465\\-191.6369\\-35\\23.33465\\-192.1369\\-35\\23.27518\\-192.6369\\-35\\22.33465\\-193.6369\\-35\\21.83465\\-194.6369\\-35\\16.58465\\-199.8869\\-35\\15.58465\\-200.3869\\-35\\15.08465\\-200.8869\\-35\\14.58465\\-200.8869\\-35\\13.58465\\-201.8274\\-35\\12.08465\\-202.3869\\-35\\11.58465\\-202.8274\\-35\\10.58465\\-202.8869\\-35\\10.08465\\-203.3274\\-35\\9.084647\\-203.3869\\-35\\8.584647\\-203.8274\\-35\\7.084647\\-203.8869\\-35\\6.584647\\-204.3274\\-35\\4.084647\\-204.3869\\-35\\3.584647\\-204.8274\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "151" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.415353\\-205.3274\\-33\\-2.915353\\-204.8869\\-33\\-5.415353\\-204.8274\\-33\\-5.915353\\-204.3869\\-33\\-7.415353\\-204.3274\\-33\\-7.915353\\-203.8869\\-33\\-8.915353\\-203.8274\\-33\\-9.415353\\-203.3869\\-33\\-9.915353\\-203.3869\\-33\\-10.41535\\-202.8869\\-33\\-10.91535\\-202.8869\\-33\\-11.41535\\-202.3869\\-33\\-11.91535\\-202.3869\\-33\\-12.41535\\-201.8869\\-33\\-12.91535\\-201.8869\\-33\\-13.41535\\-201.3869\\-33\\-13.91535\\-201.3274\\-33\\-15.91535\\-199.3869\\-33\\-16.41535\\-199.3869\\-33\\-19.10589\\-196.6369\\-33\\-19.16535\\-196.1369\\-33\\-21.16535\\-194.1369\\-33\\-21.16535\\-193.6369\\-33\\-22.16535\\-192.6369\\-33\\-22.16535\\-192.1369\\-33\\-22.66535\\-191.6369\\-33\\-22.66535\\-191.1369\\-33\\-23.16535\\-190.6369\\-33\\-23.16535\\-190.1369\\-33\\-23.66535\\-189.6369\\-33\\-23.66535\\-189.1369\\-33\\-24.16535\\-188.6369\\-33\\-24.16535\\-187.6369\\-33\\-24.66535\\-187.1369\\-33\\-24.66535\\-185.6369\\-33\\-25.16535\\-185.1369\\-33\\-25.16535\\-183.6369\\-33\\-25.66535\\-183.1369\\-33\\-25.66535\\-179.6369\\-33\\-26.16535\\-179.1369\\-33\\-26.16535\\-178.6369\\-33\\-25.66535\\-178.1369\\-33\\-25.66535\\-174.6369\\-33\\-25.16535\\-174.1369\\-33\\-25.16535\\-173.1369\\-33\\-24.66535\\-172.6369\\-33\\-24.66535\\-171.6369\\-33\\-24.16535\\-171.1369\\-33\\-24.16535\\-170.1369\\-33\\-23.66535\\-169.6369\\-33\\-23.66535\\-169.1369\\-33\\-23.16535\\-168.6369\\-33\\-23.16535\\-168.1369\\-33\\-22.16535\\-167.1369\\-33\\-22.16535\\-166.6369\\-33\\-18.41535\\-162.8869\\-33\\-17.91535\\-162.8869\\-33\\-16.91535\\-161.8869\\-33\\-16.41535\\-161.8869\\-33\\-15.91535\\-161.3869\\-33\\-15.41535\\-161.3869\\-33\\-14.91535\\-160.8869\\-33\\-14.41535\\-160.8869\\-33\\-13.91535\\-160.3869\\-33\\-13.41535\\-160.3869\\-33\\-12.91535\\-159.8869\\-33\\-11.91535\\-159.8869\\-33\\-11.41535\\-159.3869\\-33\\-9.915353\\-159.3869\\-33\\-9.415353\\-158.8869\\-33\\-6.915353\\-158.8274\\-33\\-6.415353\\-158.3869\\-33\\-2.415353\\-158.3869\\-33\\-1.415353\\-157.8869\\-33\\0.0846473\\-157.8869\\-33\\0.5846473\\-158.3274\\-33\\1.584647\\-158.3869\\-33\\6.584647\\-158.3869\\-33\\7.084647\\-158.8869\\-33\\9.584647\\-158.8869\\-33\\10.08465\\-159.3869\\-33\\11.58465\\-159.3869\\-33\\12.08465\\-159.8869\\-33\\13.58465\\-159.8869\\-33\\14.08465\\-160.3869\\-33\\14.58465\\-160.3869\\-33\\15.08465\\-160.8869\\-33\\15.58465\\-160.8869\\-33\\16.08465\\-161.3869\\-33\\16.58465\\-161.3869\\-33\\17.08465\\-161.8869\\-33\\17.58465\\-161.8869\\-33\\18.08465\\-162.3869\\-33\\18.58465\\-162.3869\\-33\\20.08465\\-163.8869\\-33\\20.58465\\-163.8869\\-33\\22.83465\\-166.1369\\-33\\22.83465\\-166.6369\\-33\\23.83465\\-167.6369\\-33\\23.89411\\-168.1369\\-33\\24.83465\\-169.1369\\-33\\24.83465\\-169.6369\\-33\\25.33465\\-170.1369\\-33\\25.33465\\-171.1369\\-33\\25.83465\\-171.6369\\-33\\25.83465\\-172.6369\\-33\\26.33465\\-173.1369\\-33\\26.33465\\-174.1369\\-33\\26.83465\\-174.6369\\-33\\26.83465\\-177.6369\\-33\\27.33465\\-178.1369\\-33\\27.33465\\-179.1369\\-33\\26.83465\\-179.6369\\-33\\26.83465\\-183.1369\\-33\\26.33465\\-183.6369\\-33\\26.33465\\-185.1369\\-33\\25.83465\\-185.6369\\-33\\25.83465\\-187.1369\\-33\\25.33465\\-187.6369\\-33\\25.33465\\-188.6369\\-33\\24.83465\\-189.1369\\-33\\24.83465\\-189.6369\\-33\\24.33465\\-190.1369\\-33\\24.33465\\-190.6369\\-33\\23.83465\\-191.1369\\-33\\23.83465\\-191.6369\\-33\\23.33465\\-192.1369\\-33\\23.33465\\-192.6369\\-33\\22.33465\\-193.6369\\-33\\22.33465\\-194.1369\\-33\\20.83465\\-195.6369\\-33\\20.77518\\-196.1369\\-33\\17.58465\\-199.3869\\-33\\17.08465\\-199.3869\\-33\\15.08465\\-201.3274\\-33\\14.58465\\-201.3869\\-33\\14.08465\\-201.8869\\-33\\13.58465\\-201.8869\\-33\\13.08465\\-202.3869\\-33\\12.58465\\-202.3869\\-33\\12.08465\\-202.8869\\-33\\11.58465\\-202.8869\\-33\\11.08465\\-203.3869\\-33\\10.58465\\-203.3869\\-33\\10.08465\\-203.8274\\-33\\9.084647\\-203.8869\\-33\\8.584647\\-204.3274\\-33\\7.084647\\-204.3869\\-33\\6.584647\\-204.8274\\-33\\4.084647\\-204.8869\\-33\\3.584647\\-205.3274\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "136" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.415353\\-205.8274\\-31\\-1.915353\\-205.3869\\-31\\-4.915353\\-205.3274\\-31\\-5.415353\\-204.8869\\-31\\-6.915353\\-204.8274\\-31\\-7.415353\\-204.3869\\-31\\-8.415353\\-204.3869\\-31\\-8.915353\\-203.8869\\-31\\-9.415353\\-203.8869\\-31\\-9.915353\\-203.3869\\-31\\-10.41535\\-203.3869\\-31\\-10.91535\\-202.8869\\-31\\-11.41535\\-202.8869\\-31\\-11.91535\\-202.3869\\-31\\-12.41535\\-202.3869\\-31\\-13.41535\\-201.3869\\-31\\-13.91535\\-201.3869\\-31\\-15.91535\\-199.3869\\-31\\-16.41535\\-199.3869\\-31\\-19.16535\\-196.6369\\-31\\-19.16535\\-196.1369\\-31\\-21.16535\\-194.1369\\-31\\-21.16535\\-193.6369\\-31\\-22.16535\\-192.6369\\-31\\-22.16535\\-192.1369\\-31\\-22.66535\\-191.6369\\-31\\-22.66535\\-191.1369\\-31\\-23.16535\\-190.6369\\-31\\-23.16535\\-190.1369\\-31\\-23.66535\\-189.6369\\-31\\-23.72482\\-188.6369\\-31\\-24.16535\\-188.1369\\-31\\-24.16535\\-187.6369\\-31\\-24.66535\\-187.1369\\-31\\-24.66535\\-185.6369\\-31\\-25.16535\\-185.1369\\-31\\-25.22482\\-183.1369\\-31\\-25.66535\\-182.6369\\-31\\-25.66535\\-175.1369\\-31\\-25.16535\\-174.6369\\-31\\-25.16535\\-173.6369\\-31\\-24.72482\\-173.1369\\-31\\-24.66535\\-171.6369\\-31\\-24.16535\\-171.1369\\-31\\-24.16535\\-170.6369\\-31\\-23.72482\\-170.1369\\-31\\-23.16535\\-168.6369\\-31\\-22.66535\\-168.1369\\-31\\-22.66535\\-167.6369\\-31\\-21.22482\\-166.1369\\-31\\-21.16535\\-165.6369\\-31\\-18.91535\\-163.3869\\-31\\-18.41535\\-163.3869\\-31\\-17.41535\\-162.3869\\-31\\-16.91535\\-162.3274\\-31\\-15.91535\\-161.3869\\-31\\-15.41535\\-161.3869\\-31\\-14.91535\\-160.8869\\-31\\-14.41535\\-160.8869\\-31\\-13.91535\\-160.3869\\-31\\-12.91535\\-160.3869\\-31\\-12.41535\\-159.8869\\-31\\-11.41535\\-159.8274\\-31\\-10.91535\\-159.3869\\-31\\-9.415353\\-159.3869\\-31\\-8.915353\\-158.8869\\-31\\-5.915353\\-158.8274\\-31\\-5.415353\\-158.3869\\-31\\5.584647\\-158.3869\\-31\\6.084647\\-158.8869\\-31\\9.084647\\-158.8869\\-31\\9.584647\\-159.3869\\-31\\11.58465\\-159.3869\\-31\\12.08465\\-159.8869\\-31\\13.08465\\-159.8869\\-31\\13.58465\\-160.3869\\-31\\14.58465\\-160.3869\\-31\\15.08465\\-160.8869\\-31\\15.58465\\-160.8869\\-31\\16.08465\\-161.3869\\-31\\16.58465\\-161.3869\\-31\\17.08465\\-161.8869\\-31\\17.58465\\-161.8869\\-31\\18.58465\\-162.8869\\-31\\19.08465\\-162.8869\\-31\\23.83465\\-167.6369\\-31\\23.83465\\-168.1369\\-31\\24.33465\\-168.6369\\-31\\24.33465\\-169.1369\\-31\\24.83465\\-169.6369\\-31\\24.83465\\-170.1369\\-31\\25.33465\\-170.6369\\-31\\25.33465\\-171.1369\\-31\\25.83465\\-171.6369\\-31\\25.89411\\-173.1369\\-31\\26.33465\\-173.6369\\-31\\26.33465\\-174.6369\\-31\\26.83465\\-175.1369\\-31\\26.83465\\-182.6369\\-31\\26.39411\\-183.1369\\-31\\26.33465\\-185.1369\\-31\\25.83465\\-185.6369\\-31\\25.83465\\-187.1369\\-31\\25.33465\\-187.6369\\-31\\25.33465\\-188.6369\\-31\\24.83465\\-189.1369\\-31\\24.83465\\-189.6369\\-31\\24.33465\\-190.1369\\-31\\24.33465\\-190.6369\\-31\\23.83465\\-191.1369\\-31\\23.83465\\-191.6369\\-31\\23.33465\\-192.1369\\-31\\23.33465\\-192.6369\\-31\\22.33465\\-193.6369\\-31\\22.33465\\-194.1369\\-31\\20.83465\\-195.6369\\-31\\20.83465\\-196.1369\\-31\\17.08465\\-199.8869\\-31\\16.58465\\-199.8869\\-31\\14.58465\\-201.8869\\-31\\14.08465\\-201.8869\\-31\\13.58465\\-202.3869\\-31\\13.08465\\-202.3869\\-31\\12.58465\\-202.8869\\-31\\12.08465\\-202.8869\\-31\\11.58465\\-203.3869\\-31\\11.08465\\-203.3869\\-31\\10.58465\\-203.8869\\-31\\10.08465\\-203.8869\\-31\\9.584647\\-204.3274\\-31\\8.584647\\-204.3869\\-31\\8.084647\\-204.8274\\-31\\6.584647\\-204.8869\\-31\\6.084647\\-205.3274\\-31\\3.084647\\-205.3869\\-31\\2.584647\\-205.8274\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.415353\\-205.8869\\-29\\-3.915353\\-205.3869\\-29\\-5.415353\\-205.3869\\-29\\-5.915353\\-204.8869\\-29\\-7.415353\\-204.8869\\-29\\-7.915353\\-204.3869\\-29\\-8.415353\\-204.3869\\-29\\-8.915353\\-203.8869\\-29\\-9.415353\\-203.8869\\-29\\-9.915353\\-203.3869\\-29\\-10.41535\\-203.3869\\-29\\-10.91535\\-202.8869\\-29\\-11.41535\\-202.8869\\-29\\-11.91535\\-202.3869\\-29\\-12.41535\\-202.3869\\-29\\-13.41535\\-201.3869\\-29\\-13.91535\\-201.3869\\-29\\-16.41535\\-198.9464\\-29\\-16.91535\\-198.8869\\-29\\-18.16535\\-197.6369\\-29\\-18.22482\\-197.1369\\-29\\-20.66535\\-194.6369\\-29\\-20.66535\\-194.1369\\-29\\-21.66535\\-193.1369\\-29\\-21.66535\\-192.6369\\-29\\-22.16535\\-192.1369\\-29\\-22.16535\\-191.6369\\-29\\-22.66535\\-191.1369\\-29\\-22.66535\\-190.6369\\-29\\-23.16535\\-190.1369\\-29\\-23.16535\\-189.6369\\-29\\-23.66535\\-189.1369\\-29\\-23.72482\\-188.1369\\-29\\-24.16535\\-187.6369\\-29\\-24.22482\\-186.6369\\-29\\-24.66535\\-186.1369\\-29\\-24.72482\\-184.6369\\-29\\-25.16535\\-184.1369\\-29\\-25.22482\\-180.6369\\-29\\-25.66535\\-180.1369\\-29\\-25.66535\\-178.1369\\-29\\-25.22482\\-177.6369\\-29\\-25.16535\\-174.6369\\-29\\-24.72482\\-174.1369\\-29\\-24.66535\\-172.6369\\-29\\-24.16535\\-172.1369\\-29\\-24.16535\\-171.1369\\-29\\-23.66535\\-170.6369\\-29\\-23.66535\\-170.1369\\-29\\-23.16535\\-169.1369\\-29\\-22.66535\\-168.6369\\-29\\-22.66535\\-168.1369\\-29\\-21.22482\\-166.6369\\-29\\-21.16535\\-166.1369\\-29\\-18.41535\\-163.3869\\-29\\-17.91535\\-163.3274\\-29\\-16.91535\\-162.3869\\-29\\-16.41535\\-162.3274\\-29\\-15.41535\\-161.3869\\-29\\-14.91535\\-161.3869\\-29\\-14.41535\\-160.8869\\-29\\-13.41535\\-160.8274\\-29\\-11.91535\\-159.8869\\-29\\-10.91535\\-159.8869\\-29\\-10.41535\\-159.3869\\-29\\-7.915353\\-159.3274\\-29\\-7.415353\\-158.8869\\-29\\-3.415353\\-158.8274\\-29\\-2.915353\\-158.3869\\-29\\2.584647\\-158.3869\\-29\\3.084647\\-158.8274\\-29\\4.084647\\-158.8869\\-29\\7.584647\\-158.8869\\-29\\8.084647\\-159.3274\\-29\\10.58465\\-159.3869\\-29\\11.08465\\-159.8274\\-29\\12.58465\\-159.8869\\-29\\13.08465\\-160.3869\\-29\\14.08465\\-160.3869\\-29\\14.58465\\-160.8869\\-29\\15.08465\\-160.8869\\-29\\15.58465\\-161.3869\\-29\\16.08465\\-161.3869\\-29\\16.58465\\-161.8869\\-29\\17.08465\\-161.8869\\-29\\18.08465\\-162.8274\\-29\\18.58465\\-162.8869\\-29\\20.08465\\-164.3274\\-29\\20.58465\\-164.3869\\-29\\21.83465\\-165.6369\\-29\\21.89411\\-166.1369\\-29\\23.33465\\-167.6369\\-29\\23.39411\\-168.1369\\-29\\24.33465\\-169.1369\\-29\\24.33465\\-169.6369\\-29\\24.83465\\-170.1369\\-29\\24.89411\\-171.1369\\-29\\25.33465\\-171.6369\\-29\\25.33465\\-172.1369\\-29\\25.83465\\-172.6369\\-29\\25.89411\\-174.1369\\-29\\26.33465\\-174.6369\\-29\\26.39411\\-177.1369\\-29\\26.83465\\-177.6369\\-29\\26.83465\\-180.1369\\-29\\26.39411\\-180.6369\\-29\\26.33465\\-184.1369\\-29\\25.89411\\-184.6369\\-29\\25.83465\\-186.1369\\-29\\25.39411\\-186.6369\\-29\\25.33465\\-188.1369\\-29\\24.83465\\-188.6369\\-29\\24.83465\\-189.1369\\-29\\24.33465\\-189.6369\\-29\\24.33465\\-190.1369\\-29\\23.83465\\-190.6369\\-29\\23.83465\\-191.1369\\-29\\23.33465\\-191.6369\\-29\\23.33465\\-192.1369\\-29\\22.83465\\-192.6369\\-29\\22.83465\\-193.1369\\-29\\21.89411\\-194.1369\\-29\\21.83465\\-194.6369\\-29\\20.39411\\-196.1369\\-29\\20.33465\\-196.6369\\-29\\17.08465\\-199.8869\\-29\\16.58465\\-199.8869\\-29\\14.58465\\-201.8869\\-29\\14.08465\\-201.8869\\-29\\13.58465\\-202.3869\\-29\\13.08465\\-202.3869\\-29\\12.58465\\-202.8869\\-29\\12.08465\\-202.8869\\-29\\11.58465\\-203.3869\\-29\\11.08465\\-203.3869\\-29\\10.58465\\-203.8869\\-29\\10.08465\\-203.8869\\-29\\9.584647\\-204.3869\\-29\\9.084647\\-204.3869\\-29\\8.584647\\-204.8869\\-29\\7.084647\\-204.8869\\-29\\6.584647\\-205.3869\\-29\\5.084647\\-205.3869\\-29\\4.584647\\-205.8869\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "128" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.4153527\\-206.3869\\-27\\-0.9153527\\-205.8869\\-27\\-3.415353\\-205.8869\\-27\\-3.915353\\-205.3869\\-27\\-5.415353\\-205.3869\\-27\\-5.915353\\-204.8869\\-27\\-7.415353\\-204.8869\\-27\\-7.915353\\-204.3869\\-27\\-8.415353\\-204.3869\\-27\\-8.915353\\-203.8869\\-27\\-9.415353\\-203.8869\\-27\\-9.915353\\-203.3869\\-27\\-10.41535\\-203.3869\\-27\\-10.91535\\-202.8869\\-27\\-11.41535\\-202.8869\\-27\\-11.91535\\-202.3869\\-27\\-12.41535\\-202.3869\\-27\\-13.91535\\-200.9464\\-27\\-14.41535\\-200.8869\\-27\\-19.16535\\-196.1369\\-27\\-19.22482\\-195.6369\\-27\\-20.66535\\-194.1369\\-27\\-21.22482\\-192.6369\\-27\\-22.16535\\-191.6369\\-27\\-22.16535\\-191.1369\\-27\\-22.66535\\-190.6369\\-27\\-22.72482\\-189.6369\\-27\\-23.66535\\-188.1369\\-27\\-23.72482\\-187.1369\\-27\\-24.16535\\-186.6369\\-27\\-24.22482\\-185.1369\\-27\\-24.66535\\-184.6369\\-27\\-24.72482\\-181.6369\\-27\\-25.16535\\-181.1369\\-27\\-25.16535\\-177.6369\\-27\\-24.72482\\-177.1369\\-27\\-24.66535\\-174.1369\\-27\\-24.22482\\-173.6369\\-27\\-24.16535\\-172.6369\\-27\\-23.72482\\-172.1369\\-27\\-23.66535\\-171.1369\\-27\\-22.72482\\-169.6369\\-27\\-22.66535\\-169.1369\\-27\\-21.72482\\-168.1369\\-27\\-21.66535\\-167.6369\\-27\\-20.72482\\-166.6369\\-27\\-20.66535\\-166.1369\\-27\\-18.41535\\-163.8869\\-27\\-17.91535\\-163.8274\\-27\\-16.91535\\-162.8869\\-27\\-16.41535\\-162.8274\\-27\\-15.41535\\-161.8869\\-27\\-14.91535\\-161.8869\\-27\\-14.41535\\-161.3869\\-27\\-13.91535\\-161.3869\\-27\\-13.41535\\-160.8869\\-27\\-12.91535\\-160.8869\\-27\\-12.41535\\-160.3869\\-27\\-11.41535\\-160.3869\\-27\\-10.91535\\-159.8869\\-27\\-9.415353\\-159.8274\\-27\\-8.915353\\-159.3869\\-27\\-5.915353\\-159.3274\\-27\\-5.415353\\-158.8869\\-27\\5.084647\\-158.8869\\-27\\5.584647\\-159.3274\\-27\\9.084647\\-159.3869\\-27\\9.584647\\-159.8274\\-27\\11.08465\\-159.8869\\-27\\11.58465\\-160.3274\\-27\\13.08465\\-160.3869\\-27\\13.58465\\-160.8869\\-27\\14.08465\\-160.8869\\-27\\17.08465\\-162.3869\\-27\\18.08465\\-163.3274\\-27\\18.58465\\-163.3869\\-27\\19.39411\\-164.1369\\-27\\22.83465\\-167.6369\\-27\\22.89411\\-168.1369\\-27\\23.83465\\-169.1369\\-27\\23.83465\\-169.6369\\-27\\24.33465\\-170.1369\\-27\\24.33465\\-170.6369\\-27\\24.83465\\-171.1369\\-27\\24.89411\\-172.1369\\-27\\25.33465\\-172.6369\\-27\\25.39411\\-173.6369\\-27\\25.83465\\-174.1369\\-27\\25.89411\\-176.6369\\-27\\26.33465\\-177.1369\\-27\\26.33465\\-181.1369\\-27\\25.89411\\-181.6369\\-27\\25.83465\\-184.6369\\-27\\25.39411\\-185.1369\\-27\\25.33465\\-186.6369\\-27\\24.89411\\-187.1369\\-27\\24.83465\\-188.1369\\-27\\24.39411\\-188.6369\\-27\\24.33465\\-189.6369\\-27\\23.83465\\-190.1369\\-27\\23.83465\\-190.6369\\-27\\23.33465\\-191.1369\\-27\\23.33465\\-191.6369\\-27\\22.83465\\-192.1369\\-27\\22.83465\\-192.6369\\-27\\21.89411\\-193.6369\\-27\\21.83465\\-194.1369\\-27\\20.89411\\-195.1369\\-27\\20.83465\\-195.6369\\-27\\15.08465\\-201.3869\\-27\\14.58465\\-201.3869\\-27\\13.58465\\-202.3869\\-27\\13.08465\\-202.3869\\-27\\12.58465\\-202.8869\\-27\\12.08465\\-202.8869\\-27\\11.58465\\-203.3869\\-27\\11.08465\\-203.3869\\-27\\10.58465\\-203.8869\\-27\\10.08465\\-203.8869\\-27\\9.584647\\-204.3869\\-27\\9.084647\\-204.3869\\-27\\8.584647\\-204.8869\\-27\\7.584647\\-204.8869\\-27\\7.084647\\-205.3869\\-27\\5.584647\\-205.3869\\-27\\5.084647\\-205.8869\\-27\\2.584647\\-205.8869\\-27\\2.084647\\-206.3869\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "118" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.915353\\-205.8869\\-25\\-3.415353\\-205.3869\\-25\\-5.415353\\-205.3869\\-25\\-5.915353\\-204.8869\\-25\\-6.915353\\-204.8869\\-25\\-7.415353\\-204.3869\\-25\\-7.915353\\-204.3869\\-25\\-10.41535\\-202.9464\\-25\\-10.91535\\-202.8869\\-25\\-11.41535\\-202.3869\\-25\\-11.91535\\-202.3869\\-25\\-13.41535\\-200.9464\\-25\\-13.91535\\-200.8869\\-25\\-17.41535\\-197.4464\\-25\\-18.66535\\-196.1369\\-25\\-18.72482\\-195.6369\\-25\\-19.66535\\-194.6369\\-25\\-19.72482\\-194.1369\\-25\\-20.66535\\-193.1369\\-25\\-21.22482\\-191.6369\\-25\\-21.66535\\-191.1369\\-25\\-22.22482\\-189.6369\\-25\\-22.66535\\-189.1369\\-25\\-22.72482\\-188.1369\\-25\\-23.16535\\-187.6369\\-25\\-23.22482\\-186.6369\\-25\\-23.66535\\-186.1369\\-25\\-23.72482\\-185.1369\\-25\\-24.16535\\-184.6369\\-25\\-24.22482\\-181.1369\\-25\\-24.66535\\-180.6369\\-25\\-24.66535\\-178.1369\\-25\\-24.22482\\-177.6369\\-25\\-24.16535\\-174.6369\\-25\\-23.72482\\-174.1369\\-25\\-23.66535\\-172.6369\\-25\\-22.66535\\-170.6369\\-25\\-22.22482\\-170.1369\\-25\\-21.66535\\-168.6369\\-25\\-20.72482\\-167.6369\\-25\\-20.66535\\-167.1369\\-25\\-19.91535\\-166.3274\\-25\\-17.41535\\-163.8869\\-25\\-16.91535\\-163.8274\\-25\\-15.91535\\-162.8869\\-25\\-15.41535\\-162.8274\\-25\\-14.41535\\-161.8869\\-25\\-13.91535\\-161.8869\\-25\\-13.41535\\-161.3869\\-25\\-12.41535\\-161.3274\\-25\\-10.91535\\-160.3869\\-25\\-9.415353\\-160.3274\\-25\\-8.915353\\-159.8869\\-25\\-6.915353\\-159.8274\\-25\\-6.415353\\-159.3869\\-25\\6.584647\\-159.3869\\-25\\7.084647\\-159.8274\\-25\\9.584647\\-159.8869\\-25\\10.08465\\-160.3274\\-25\\11.58465\\-160.3869\\-25\\12.08465\\-160.8869\\-25\\12.58465\\-160.8869\\-25\\13.08465\\-161.3274\\-25\\14.08465\\-161.3869\\-25\\14.58465\\-161.8869\\-25\\15.08465\\-161.8869\\-25\\16.08465\\-162.3869\\-25\\17.08465\\-163.3274\\-25\\17.58465\\-163.3869\\-25\\18.58465\\-164.3274\\-25\\19.08465\\-164.3869\\-25\\21.33465\\-166.6369\\-25\\21.39411\\-167.1369\\-25\\22.83465\\-168.6369\\-25\\23.39411\\-170.1369\\-25\\24.33465\\-171.6369\\-25\\24.39411\\-172.6369\\-25\\24.83465\\-173.1369\\-25\\24.89411\\-174.1369\\-25\\25.33465\\-174.6369\\-25\\25.39411\\-177.6369\\-25\\25.83465\\-178.1369\\-25\\25.83465\\-181.1369\\-25\\25.39411\\-181.6369\\-25\\25.33465\\-184.6369\\-25\\24.89411\\-185.1369\\-25\\24.83465\\-186.6369\\-25\\24.39411\\-187.1369\\-25\\24.33465\\-188.1369\\-25\\23.83465\\-188.6369\\-25\\23.83465\\-189.1369\\-25\\23.39411\\-189.6369\\-25\\23.33465\\-190.6369\\-25\\22.83465\\-191.1369\\-25\\22.83465\\-191.6369\\-25\\21.89411\\-192.6369\\-25\\21.33465\\-194.1369\\-25\\20.39411\\-195.1369\\-25\\20.33465\\-195.6369\\-25\\18.39411\\-197.6369\\-25\\18.33465\\-198.1369\\-25\\17.08465\\-199.3869\\-25\\16.58465\\-199.4464\\-25\\14.58465\\-201.3869\\-25\\14.08465\\-201.4464\\-25\\13.08465\\-202.3869\\-25\\12.58465\\-202.4464\\-25\\11.58465\\-203.3869\\-25\\11.08465\\-203.3869\\-25\\10.58465\\-203.8869\\-25\\10.08465\\-203.8869\\-25\\9.584647\\-204.3869\\-25\\8.584647\\-204.4464\\-25\\8.084647\\-204.8869\\-25\\7.084647\\-204.8869\\-25\\6.584647\\-205.3869\\-25\\4.584647\\-205.4464\\-25\\4.084647\\-205.8869\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "102" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.915353\\-205.3869\\-23\\-4.415353\\-204.9464\\-23\\-5.915353\\-204.8869\\-23\\-6.415353\\-204.3869\\-23\\-6.915353\\-204.3869\\-23\\-8.415353\\-203.4464\\-23\\-9.415353\\-203.3869\\-23\\-10.41535\\-202.4464\\-23\\-10.91535\\-202.3869\\-23\\-11.91535\\-201.4464\\-23\\-12.41535\\-201.3869\\-23\\-13.41535\\-200.4464\\-23\\-13.91535\\-200.3869\\-23\\-17.16535\\-197.1369\\-23\\-17.22482\\-196.6369\\-23\\-18.66535\\-195.1369\\-23\\-18.72482\\-194.6369\\-23\\-19.66535\\-193.6369\\-23\\-20.22482\\-192.1369\\-23\\-21.16535\\-191.1369\\-23\\-21.22482\\-190.1369\\-23\\-22.16535\\-188.6369\\-23\\-22.22482\\-187.6369\\-23\\-22.66535\\-187.1369\\-23\\-22.72482\\-186.1369\\-23\\-23.16535\\-185.6369\\-23\\-23.22482\\-183.6369\\-23\\-23.66535\\-183.1369\\-23\\-23.66535\\-175.6369\\-23\\-23.22482\\-175.1369\\-23\\-23.16535\\-173.6369\\-23\\-22.72482\\-173.1369\\-23\\-22.66535\\-172.1369\\-23\\-21.22482\\-169.6369\\-23\\-21.16535\\-169.1369\\-23\\-20.22482\\-168.1369\\-23\\-20.16535\\-167.6369\\-23\\-19.41535\\-166.8274\\-23\\-16.41535\\-163.8869\\-23\\-15.91535\\-163.8274\\-23\\-14.91535\\-162.8869\\-23\\-11.91535\\-161.3869\\-23\\-10.91535\\-161.3274\\-23\\-10.41535\\-160.8869\\-23\\-9.415353\\-160.8274\\-23\\-8.915353\\-160.3869\\-23\\-6.915353\\-160.3274\\-23\\-6.415353\\-159.8869\\-23\\-2.915353\\-159.8274\\-23\\2.584647\\-159.8274\\-23\\3.084647\\-159.8869\\-23\\7.084647\\-159.8869\\-23\\7.584647\\-160.3274\\-23\\9.084647\\-160.3869\\-23\\9.584647\\-160.8274\\-23\\11.08465\\-160.8869\\-23\\11.58465\\-161.3274\\-23\\12.58465\\-161.3869\\-23\\15.08465\\-162.8274\\-23\\16.58465\\-163.3869\\-23\\18.08465\\-164.8274\\-23\\18.58465\\-164.8869\\-23\\20.83465\\-167.1369\\-23\\20.89411\\-167.6369\\-23\\21.83465\\-168.6369\\-23\\22.39411\\-170.1369\\-23\\22.83465\\-170.6369\\-23\\23.89411\\-173.1369\\-23\\24.33465\\-173.6369\\-23\\24.39411\\-175.6369\\-23\\24.83465\\-176.1369\\-23\\24.83465\\-183.1369\\-23\\24.39411\\-183.6369\\-23\\24.33465\\-185.6369\\-23\\23.89411\\-186.1369\\-23\\23.83465\\-187.1369\\-23\\23.39411\\-187.6369\\-23\\23.33465\\-188.6369\\-23\\22.39411\\-190.1369\\-23\\22.33465\\-191.1369\\-23\\21.83465\\-192.1369\\-23\\20.89411\\-193.1369\\-23\\20.33465\\-194.6369\\-23\\18.89411\\-196.1369\\-23\\18.83465\\-196.6369\\-23\\16.39411\\-199.1369\\-23\\14.58465\\-200.8869\\-23\\14.08465\\-200.9464\\-23\\13.08465\\-201.8869\\-23\\12.58465\\-201.9464\\-23\\11.58465\\-202.8869\\-23\\11.08465\\-202.8869\\-23\\10.58465\\-203.3869\\-23\\10.08465\\-203.3869\\-23\\9.584647\\-203.8869\\-23\\9.084647\\-203.8869\\-23\\8.584647\\-204.3869\\-23\\7.584647\\-204.4464\\-23\\7.084647\\-204.8869\\-23\\5.584647\\-204.9464\\-23\\5.084647\\-205.3869\\-23\\-0.9153527\\-205.4464\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "99" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.415353\\-204.8869\\-21\\-3.915353\\-204.4464\\-21\\-5.415353\\-204.3869\\-21\\-5.915353\\-203.9464\\-21\\-6.915353\\-203.8869\\-21\\-8.415353\\-202.9464\\-21\\-9.915353\\-202.3869\\-21\\-10.91535\\-201.4464\\-21\\-11.41535\\-201.3869\\-21\\-13.41535\\-199.4464\\-21\\-13.91535\\-199.3869\\-21\\-16.16535\\-197.1369\\-21\\-16.22482\\-196.6369\\-21\\-17.66535\\-195.1369\\-21\\-17.72482\\-194.6369\\-21\\-18.66535\\-193.6369\\-21\\-19.22482\\-192.1369\\-21\\-20.16535\\-191.1369\\-21\\-20.66535\\-190.1369\\-21\\-20.72482\\-189.1369\\-21\\-21.16535\\-188.6369\\-21\\-21.22482\\-187.6369\\-21\\-21.66535\\-187.1369\\-21\\-21.72482\\-186.1369\\-21\\-22.16535\\-185.6369\\-21\\-22.22482\\-184.1369\\-21\\-22.66535\\-183.6369\\-21\\-22.72482\\-181.1369\\-21\\-22.72482\\-177.6369\\-21\\-22.66535\\-175.6369\\-21\\-22.22482\\-175.1369\\-21\\-22.16535\\-173.6369\\-21\\-21.22482\\-172.1369\\-21\\-21.16535\\-171.1369\\-21\\-20.66535\\-170.1369\\-21\\-19.72482\\-169.1369\\-21\\-19.66535\\-168.6369\\-21\\-18.72482\\-167.6369\\-21\\-18.66535\\-167.1369\\-21\\-17.41535\\-165.8869\\-21\\-16.91535\\-165.8274\\-21\\-14.91535\\-163.8869\\-21\\-10.91535\\-161.8869\\-21\\-9.915353\\-161.8274\\-21\\-9.415353\\-161.3869\\-21\\-8.415353\\-161.3274\\-21\\-7.915353\\-160.8869\\-21\\-5.915353\\-160.8274\\-21\\-5.415353\\-160.3869\\-21\\5.584647\\-160.3869\\-21\\6.084647\\-160.8274\\-21\\8.584647\\-160.8869\\-21\\9.084647\\-161.3274\\-21\\10.08465\\-161.3869\\-21\\10.58465\\-161.8274\\-21\\11.58465\\-161.8869\\-21\\12.08465\\-162.3274\\-21\\13.08465\\-162.3869\\-21\\14.58465\\-163.3274\\-21\\15.08465\\-163.3869\\-21\\16.08465\\-164.3274\\-21\\16.58465\\-164.3869\\-21\\20.58465\\-168.3274\\-21\\21.39411\\-170.1369\\-21\\21.83465\\-170.6369\\-21\\22.39411\\-172.1369\\-21\\22.83465\\-172.6369\\-21\\22.89411\\-173.6369\\-21\\23.33465\\-174.1369\\-21\\23.39411\\-175.1369\\-21\\23.83465\\-175.6369\\-21\\23.89411\\-177.6369\\-21\\23.89411\\-181.6369\\-21\\23.83465\\-183.6369\\-21\\23.39411\\-184.1369\\-21\\23.33465\\-185.6369\\-21\\22.89411\\-186.1369\\-21\\22.83465\\-187.6369\\-21\\21.89411\\-189.1369\\-21\\21.83465\\-190.1369\\-21\\20.39411\\-192.6369\\-21\\20.33465\\-193.1369\\-21\\19.39411\\-194.1369\\-21\\19.33465\\-194.6369\\-21\\17.89411\\-196.1369\\-21\\17.83465\\-196.6369\\-21\\17.08465\\-197.4464\\-21\\14.08465\\-200.3869\\-21\\13.58465\\-200.4464\\-21\\12.08465\\-201.8869\\-21\\10.08465\\-202.8869\\-21\\9.584647\\-202.9464\\-21\\8.084647\\-203.8869\\-21\\7.084647\\-203.9464\\-21\\6.584647\\-204.3869\\-21\\5.584647\\-204.4464\\-21\\5.084647\\-204.8869\\-21\\3.084647\\-204.9464\\-21\\-1.915353\\-204.9464\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "100" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.915353\\-204.3869\\-19\\-2.415353\\-203.9464\\-19\\-4.415353\\-203.8869\\-19\\-4.915353\\-203.4464\\-19\\-5.915353\\-203.3869\\-19\\-6.415353\\-202.9464\\-19\\-8.915353\\-201.8869\\-19\\-9.915353\\-200.9464\\-19\\-10.41535\\-200.8869\\-19\\-11.91535\\-199.4464\\-19\\-12.41535\\-199.3869\\-19\\-15.16535\\-196.6369\\-19\\-15.22482\\-196.1369\\-19\\-17.16535\\-194.1369\\-19\\-17.22482\\-193.6369\\-19\\-18.16535\\-192.6369\\-19\\-18.22482\\-192.1369\\-19\\-19.66535\\-189.6369\\-19\\-19.72482\\-188.6369\\-19\\-20.16535\\-188.1369\\-19\\-20.22482\\-187.1369\\-19\\-20.66535\\-186.6369\\-19\\-20.72482\\-185.6369\\-19\\-21.16535\\-185.1369\\-19\\-21.22482\\-183.1369\\-19\\-21.66535\\-182.6369\\-19\\-21.66535\\-176.6369\\-19\\-21.22482\\-176.1369\\-19\\-21.16535\\-174.6369\\-19\\-20.72482\\-174.1369\\-19\\-20.66535\\-173.1369\\-19\\-20.22482\\-172.6369\\-19\\-20.16535\\-171.6369\\-19\\-19.66535\\-170.6369\\-19\\-18.72482\\-169.6369\\-19\\-18.41535\\-168.8274\\-19\\-14.72482\\-165.1369\\-19\\-13.91535\\-164.8274\\-19\\-12.91535\\-163.8869\\-19\\-12.41535\\-163.8274\\-19\\-10.91535\\-162.8869\\-19\\-9.915353\\-162.8274\\-19\\-9.415353\\-162.3869\\-19\\-8.415353\\-162.3274\\-19\\-7.915353\\-161.8869\\-19\\-6.415353\\-161.8274\\-19\\-5.915353\\-161.3869\\-19\\-3.915353\\-161.3274\\-19\\5.084647\\-161.3274\\-19\\6.584647\\-161.3869\\-19\\7.084647\\-161.8274\\-19\\8.584647\\-161.8869\\-19\\9.084647\\-162.3274\\-19\\10.08465\\-162.3869\\-19\\10.58465\\-162.8274\\-19\\11.58465\\-162.8869\\-19\\13.08465\\-163.8274\\-19\\13.58465\\-163.8274\\-19\\14.08465\\-164.3274\\-19\\14.58465\\-164.3869\\-19\\15.58465\\-165.3274\\-19\\16.39411\\-165.6369\\-19\\19.08465\\-168.3274\\-19\\19.39411\\-169.1369\\-19\\20.39411\\-170.1369\\-19\\20.39411\\-170.6369\\-19\\20.89411\\-171.1369\\-19\\20.89411\\-171.6369\\-19\\21.39411\\-172.1369\\-19\\21.39411\\-172.6369\\-19\\21.83465\\-173.1369\\-19\\21.89411\\-174.1369\\-19\\22.33465\\-174.6369\\-19\\22.39411\\-176.1369\\-19\\22.83465\\-176.6369\\-19\\22.83465\\-182.6369\\-19\\22.39411\\-183.1369\\-19\\22.33465\\-185.1369\\-19\\21.89411\\-185.6369\\-19\\21.83465\\-187.1369\\-19\\21.39411\\-187.6369\\-19\\21.33465\\-188.6369\\-19\\19.89411\\-191.1369\\-19\\19.89411\\-191.6369\\-19\\19.39411\\-192.1369\\-19\\18.83465\\-193.6369\\-19\\17.39411\\-195.1369\\-19\\17.08465\\-195.9464\\-19\\12.89411\\-200.1369\\-19\\12.08465\\-200.4464\\-19\\11.08465\\-201.3869\\-19\\10.58465\\-201.4464\\-19\\9.584647\\-202.3869\\-19\\8.584647\\-202.8869\\-19\\7.584647\\-202.9464\\-19\\7.084647\\-203.3869\\-19\\6.084647\\-203.4464\\-19\\5.584647\\-203.8869\\-19\\3.584647\\-203.9464\\-19\\3.084647\\-204.3869\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "104" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.9153527\\-203.3869\\-17\\-1.415353\\-202.9464\\-17\\-3.415353\\-202.8869\\-17\\-3.915353\\-202.4464\\-17\\-4.915353\\-202.3869\\-17\\-5.415353\\-201.9464\\-17\\-6.415353\\-201.8869\\-17\\-7.915353\\-200.9464\\-17\\-8.415353\\-200.8869\\-17\\-9.915353\\-199.4464\\-17\\-10.41535\\-199.4464\\-17\\-14.91535\\-194.9464\\-17\\-15.22482\\-194.1369\\-17\\-16.22482\\-193.1369\\-17\\-16.22482\\-192.6369\\-17\\-17.22482\\-191.6369\\-17\\-17.22482\\-191.1369\\-17\\-17.72482\\-190.6369\\-17\\-17.72482\\-190.1369\\-17\\-18.66535\\-188.6369\\-17\\-18.72482\\-187.6369\\-17\\-19.16535\\-187.1369\\-17\\-19.22482\\-185.6369\\-17\\-19.66535\\-185.1369\\-17\\-19.72482\\-183.6369\\-17\\-20.16535\\-183.1369\\-17\\-20.22482\\-182.1369\\-17\\-20.22482\\-177.6369\\-17\\-20.16535\\-176.6369\\-17\\-19.72482\\-176.1369\\-17\\-19.72482\\-174.6369\\-17\\-19.22482\\-174.1369\\-17\\-19.22482\\-173.1369\\-17\\-18.72482\\-172.6369\\-17\\-18.72482\\-172.1369\\-17\\-18.22482\\-171.6369\\-17\\-18.22482\\-171.1369\\-17\\-17.72482\\-170.6369\\-17\\-17.72482\\-170.1369\\-17\\-12.91535\\-165.3274\\-17\\-12.41535\\-165.3274\\-17\\-11.91535\\-164.8274\\-17\\-11.41535\\-164.8274\\-17\\-10.91535\\-164.3274\\-17\\-10.41535\\-164.3274\\-17\\-9.915353\\-163.8274\\-17\\-9.415353\\-163.8274\\-17\\-8.915353\\-163.3869\\-17\\-7.915353\\-163.3274\\-17\\-7.415353\\-162.8869\\-17\\-5.915353\\-162.8274\\-17\\-5.415353\\-162.3869\\-17\\-3.915353\\-162.3274\\-17\\4.584647\\-162.3274\\-17\\6.084647\\-162.3869\\-17\\6.584647\\-162.8274\\-17\\8.084647\\-162.8869\\-17\\8.584647\\-163.3274\\-17\\9.584647\\-163.3869\\-17\\10.08465\\-163.8274\\-17\\11.08465\\-163.8869\\-17\\12.58465\\-164.8274\\-17\\13.08465\\-164.8869\\-17\\14.08465\\-165.8274\\-17\\14.89411\\-166.1369\\-17\\18.39411\\-169.6369\\-17\\18.39411\\-170.1369\\-17\\19.39411\\-171.1369\\-17\\19.39411\\-171.6369\\-17\\19.89411\\-172.1369\\-17\\19.89411\\-172.6369\\-17\\20.39411\\-173.1369\\-17\\20.39411\\-174.1369\\-17\\20.89411\\-174.6369\\-17\\20.89411\\-176.1369\\-17\\21.33465\\-176.6369\\-17\\21.39411\\-177.6369\\-17\\21.39411\\-182.6369\\-17\\20.89411\\-183.6369\\-17\\20.83465\\-185.6369\\-17\\20.39411\\-186.1369\\-17\\20.39411\\-187.1369\\-17\\19.89411\\-187.6369\\-17\\19.89411\\-188.6369\\-17\\19.39411\\-189.1369\\-17\\19.33465\\-190.1369\\-17\\18.83465\\-191.1369\\-17\\17.89411\\-192.1369\\-17\\17.89411\\-192.6369\\-17\\16.89411\\-193.6369\\-17\\16.89411\\-194.1369\\-17\\10.89411\\-200.1369\\-17\\10.08465\\-200.4464\\-17\\9.584647\\-200.9464\\-17\\9.084647\\-200.9464\\-17\\8.584647\\-201.4464\\-17\\8.084647\\-201.4464\\-17\\7.584647\\-201.9464\\-17\\7.084647\\-201.9464\\-17\\6.584647\\-202.3869\\-17\\5.584647\\-202.4464\\-17\\5.084647\\-202.8869\\-17\\3.084647\\-202.9464\\-17\\2.584647\\-203.3869\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "93" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.915353\\-200.9464\\-15\\-4.915353\\-200.9464\\-15\\-5.415353\\-200.4464\\-15\\-6.415353\\-200.3869\\-15\\-7.415353\\-199.4464\\-15\\-7.915353\\-199.4464\\-15\\-9.415353\\-197.9464\\-15\\-9.915353\\-197.9464\\-15\\-13.22482\\-194.6369\\-15\\-13.22482\\-194.1369\\-15\\-15.22482\\-192.1369\\-15\\-15.22482\\-191.6369\\-15\\-15.72482\\-191.1369\\-15\\-15.72482\\-190.6369\\-15\\-16.22482\\-190.1369\\-15\\-16.22482\\-189.6369\\-15\\-16.72482\\-189.1369\\-15\\-16.72482\\-188.6369\\-15\\-17.22482\\-188.1369\\-15\\-17.22482\\-187.1369\\-15\\-17.72482\\-186.6369\\-15\\-17.72482\\-185.1369\\-15\\-18.22482\\-184.6369\\-15\\-18.22482\\-176.1369\\-15\\-17.72482\\-175.6369\\-15\\-17.72482\\-174.1369\\-15\\-17.22482\\-173.6369\\-15\\-17.22482\\-172.6369\\-15\\-16.22482\\-171.6369\\-15\\-16.22482\\-171.1369\\-15\\-15.72482\\-170.6369\\-15\\-15.72482\\-170.1369\\-15\\-12.41535\\-166.8274\\-15\\-11.91535\\-166.8274\\-15\\-10.91535\\-165.8274\\-15\\-10.41535\\-165.8274\\-15\\-9.915353\\-165.3274\\-15\\-9.415353\\-165.3274\\-15\\-8.915353\\-164.8869\\-15\\-7.915353\\-164.8274\\-15\\-7.415353\\-164.3869\\-15\\-6.415353\\-164.3274\\-15\\-5.915353\\-163.8869\\-15\\-4.415353\\-163.8274\\-15\\-3.915353\\-163.3869\\-15\\-2.915353\\-163.3274\\-15\\3.584647\\-163.3274\\-15\\4.584647\\-163.3869\\-15\\5.084647\\-163.8274\\-15\\6.584647\\-163.8869\\-15\\7.084647\\-164.3274\\-15\\8.084647\\-164.3274\\-15\\8.584647\\-164.8274\\-15\\9.584647\\-164.8274\\-15\\10.08465\\-165.3274\\-15\\11.08465\\-165.3869\\-15\\12.08465\\-165.8869\\-15\\13.58465\\-167.3274\\-15\\14.08465\\-167.3274\\-15\\16.39411\\-169.6369\\-15\\16.39411\\-170.1369\\-15\\17.39411\\-171.1369\\-15\\17.39411\\-171.6369\\-15\\17.89411\\-172.1369\\-15\\17.89411\\-172.6369\\-15\\18.39411\\-173.1369\\-15\\18.39411\\-173.6369\\-15\\18.89411\\-174.1369\\-15\\18.89411\\-175.1369\\-15\\19.39411\\-175.6369\\-15\\19.39411\\-184.6369\\-15\\18.89411\\-185.6369\\-15\\18.83465\\-187.1369\\-15\\18.39411\\-187.6369\\-15\\18.39411\\-188.1369\\-15\\17.89411\\-188.6369\\-15\\17.89411\\-189.6369\\-15\\17.39411\\-190.1369\\-15\\17.39411\\-190.6369\\-15\\16.39411\\-191.6369\\-15\\16.39411\\-192.1369\\-15\\15.39411\\-193.1369\\-15\\15.39411\\-193.6369\\-15\\10.08465\\-198.9464\\-15\\9.584647\\-198.9464\\-15\\8.584647\\-199.9464\\-15\\8.084647\\-199.9464\\-15\\7.584647\\-200.4464\\-15\\7.084647\\-200.4464\\-15\\6.584647\\-200.9464\\-15\\5.584647\\-200.9464\\-15\\4.584647\\-201.4464\\-15\\-2.915353\\-201.4464\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "90" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.915353\\-199.4464\\-13\\-3.415353\\-198.9464\\-13\\-4.415353\\-198.9464\\-13\\-4.915353\\-198.4464\\-13\\-5.415353\\-198.4464\\-13\\-5.915353\\-197.9464\\-13\\-6.415353\\-197.9464\\-13\\-6.915353\\-197.4464\\-13\\-7.415353\\-197.4464\\-13\\-8.915353\\-195.9464\\-13\\-9.415353\\-195.9464\\-13\\-11.22482\\-194.1369\\-13\\-11.22482\\-193.6369\\-13\\-12.72482\\-192.1369\\-13\\-12.72482\\-191.6369\\-13\\-13.72482\\-190.6369\\-13\\-13.72482\\-190.1369\\-13\\-14.22482\\-189.6369\\-13\\-14.22482\\-189.1369\\-13\\-14.72482\\-188.6369\\-13\\-14.72482\\-188.1369\\-13\\-15.22482\\-187.6369\\-13\\-15.22482\\-186.6369\\-13\\-15.72482\\-186.1369\\-13\\-15.72482\\-184.6369\\-13\\-16.22482\\-184.1369\\-13\\-16.22482\\-176.6369\\-13\\-15.72482\\-176.1369\\-13\\-15.72482\\-174.6369\\-13\\-15.22482\\-174.1369\\-13\\-15.22482\\-173.6369\\-13\\-14.72482\\-173.1369\\-13\\-14.72482\\-172.6369\\-13\\-14.22482\\-172.1369\\-13\\-14.22482\\-171.6369\\-13\\-10.41535\\-167.8274\\-13\\-9.915353\\-167.8274\\-13\\-8.915353\\-166.8274\\-13\\-8.415353\\-166.8274\\-13\\-7.915353\\-166.3274\\-13\\-6.915353\\-166.3274\\-13\\-6.415353\\-165.8274\\-13\\-5.415353\\-165.8274\\-13\\-4.915353\\-165.3274\\-13\\-2.915353\\-165.3274\\-13\\-2.415353\\-164.8274\\-13\\3.084647\\-164.8274\\-13\\4.084647\\-165.3274\\-13\\6.084647\\-165.3274\\-13\\6.584647\\-165.8274\\-13\\7.584647\\-165.8274\\-13\\8.084647\\-166.3274\\-13\\8.584647\\-166.3274\\-13\\9.084647\\-166.8274\\-13\\9.584647\\-166.8274\\-13\\10.08465\\-167.3274\\-13\\10.58465\\-167.3274\\-13\\11.08465\\-167.8274\\-13\\11.58465\\-167.8274\\-13\\15.39411\\-171.6369\\-13\\15.39411\\-172.1369\\-13\\15.89411\\-172.6369\\-13\\15.89411\\-173.1369\\-13\\16.39411\\-173.6369\\-13\\16.39411\\-174.1369\\-13\\16.89411\\-174.6369\\-13\\16.89411\\-176.1369\\-13\\17.39411\\-176.6369\\-13\\17.39411\\-184.1369\\-13\\16.89411\\-184.6369\\-13\\16.89411\\-186.1369\\-13\\16.39411\\-186.6369\\-13\\16.39411\\-187.6369\\-13\\15.89411\\-188.1369\\-13\\15.89411\\-189.1369\\-13\\15.39411\\-189.6369\\-13\\15.39411\\-190.1369\\-13\\14.39411\\-191.1369\\-13\\14.39411\\-191.6369\\-13\\13.39411\\-192.6369\\-13\\13.39411\\-193.1369\\-13\\9.584647\\-196.9464\\-13\\9.084647\\-196.9464\\-13\\8.084647\\-197.9464\\-13\\7.584647\\-197.9464\\-13\\7.084647\\-198.4464\\-13\\6.584647\\-198.4464\\-13\\6.084647\\-198.9464\\-13\\5.084647\\-198.9464\\-13\\4.584647\\-199.4464\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.915353\\-196.9464\\-11\\-2.415353\\-196.4464\\-11\\-3.415353\\-196.4464\\-11\\-3.915353\\-195.9464\\-11\\-4.415353\\-195.9464\\-11\\-4.915353\\-195.4464\\-11\\-5.415353\\-195.4464\\-11\\-5.915353\\-194.9464\\-11\\-6.415353\\-194.9464\\-11\\-10.72482\\-190.6369\\-11\\-10.72482\\-190.1369\\-11\\-11.22482\\-189.6369\\-11\\-11.22482\\-189.1369\\-11\\-11.72482\\-188.6369\\-11\\-11.72482\\-188.1369\\-11\\-12.22482\\-187.6369\\-11\\-12.22482\\-187.1369\\-11\\-12.72482\\-186.6369\\-11\\-12.72482\\-186.1369\\-11\\-13.22482\\-185.6369\\-11\\-13.22482\\-184.1369\\-11\\-13.72482\\-183.6369\\-11\\-13.72482\\-177.1369\\-11\\-13.22482\\-176.6369\\-11\\-13.22482\\-175.6369\\-11\\-12.72482\\-175.1369\\-11\\-12.72482\\-174.6369\\-11\\-12.22482\\-174.1369\\-11\\-12.22482\\-173.6369\\-11\\-10.72482\\-172.1369\\-11\\-10.72482\\-171.6369\\-11\\-9.415353\\-170.3274\\-11\\-8.915353\\-170.3274\\-11\\-7.915353\\-169.3274\\-11\\-7.415353\\-169.3274\\-11\\-6.915353\\-168.8274\\-11\\-6.415353\\-168.8274\\-11\\-5.915353\\-168.3274\\-11\\-5.415353\\-168.3274\\-11\\-4.915353\\-167.8274\\-11\\-4.415353\\-167.8274\\-11\\-3.915353\\-167.3274\\-11\\-1.415353\\-167.3274\\-11\\-0.9153527\\-166.8274\\-11\\2.084647\\-166.8274\\-11\\2.584647\\-167.3274\\-11\\4.584647\\-167.3274\\-11\\5.084647\\-167.8274\\-11\\6.084647\\-167.8274\\-11\\6.584647\\-168.3274\\-11\\7.084647\\-168.3274\\-11\\7.584647\\-168.8274\\-11\\8.084647\\-168.8274\\-11\\8.584647\\-169.3274\\-11\\9.084647\\-169.3274\\-11\\13.39411\\-173.6369\\-11\\13.39411\\-174.1369\\-11\\13.89411\\-174.6369\\-11\\13.89411\\-175.1369\\-11\\14.39411\\-175.6369\\-11\\14.39411\\-176.6369\\-11\\14.89411\\-177.1369\\-11\\14.89411\\-184.1369\\-11\\14.39411\\-184.6369\\-11\\14.39411\\-185.6369\\-11\\13.89411\\-186.1369\\-11\\13.89411\\-187.1369\\-11\\13.39411\\-187.6369\\-11\\13.39411\\-188.1369\\-11\\12.89411\\-188.6369\\-11\\12.89411\\-189.1369\\-11\\12.39411\\-189.6369\\-11\\12.39411\\-190.1369\\-11\\10.89411\\-191.6369\\-11\\10.89411\\-192.1369\\-11\\9.084647\\-193.9464\\-11\\8.584647\\-193.9464\\-11\\7.084647\\-195.4464\\-11\\6.584647\\-195.4464\\-11\\6.084647\\-195.9464\\-11\\5.584647\\-195.9464\\-11\\5.084647\\-196.4464\\-11\\4.084647\\-196.4464\\-11\\3.584647\\-196.9464\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.915353\\-192.9464\\-9\\-2.415353\\-192.4464\\-9\\-3.415353\\-192.4464\\-9\\-4.415353\\-191.4464\\-9\\-4.915353\\-191.4464\\-9\\-7.724819\\-188.6369\\-9\\-7.724819\\-188.1369\\-9\\-8.724819\\-187.1369\\-9\\-8.724819\\-186.6369\\-9\\-9.224819\\-186.1369\\-9\\-9.224819\\-185.6369\\-9\\-9.724819\\-185.1369\\-9\\-9.724819\\-183.6369\\-9\\-10.22482\\-183.1369\\-9\\-10.22482\\-178.1369\\-9\\-9.724819\\-177.6369\\-9\\-9.724819\\-176.6369\\-9\\-9.224819\\-176.1369\\-9\\-9.224819\\-175.6369\\-9\\-8.724819\\-175.1369\\-9\\-8.724819\\-174.6369\\-9\\-5.915353\\-171.8274\\-9\\-5.415353\\-171.8274\\-9\\-4.915353\\-171.3274\\-9\\-4.415353\\-171.3274\\-9\\-3.915353\\-170.8274\\-9\\-2.915353\\-170.8274\\-9\\-2.415353\\-170.3274\\-9\\-0.4153527\\-170.3274\\-9\\0.0846473\\-169.8274\\-9\\1.084647\\-169.8274\\-9\\1.584647\\-170.3274\\-9\\3.584647\\-170.3274\\-9\\4.084647\\-170.8274\\-9\\5.084647\\-170.8274\\-9\\5.584647\\-171.3274\\-9\\6.084647\\-171.3274\\-9\\6.584647\\-171.8274\\-9\\7.084647\\-171.8274\\-9\\9.894114\\-174.6369\\-9\\9.894114\\-175.1369\\-9\\10.39411\\-175.6369\\-9\\10.39411\\-176.1369\\-9\\10.89411\\-176.6369\\-9\\10.89411\\-177.6369\\-9\\11.39411\\-178.1369\\-9\\11.39411\\-183.6369\\-9\\10.89411\\-184.1369\\-9\\10.89411\\-185.1369\\-9\\10.39411\\-185.6369\\-9\\10.39411\\-186.1369\\-9\\9.894114\\-186.6369\\-9\\9.894114\\-187.1369\\-9\\9.394114\\-187.6369\\-9\\9.394114\\-188.1369\\-9\\5.584647\\-191.9464\\-9\\5.084647\\-191.9464\\-9\\4.584647\\-192.4464\\-9\\4.084647\\-192.4464\\-9\\3.584647\\-192.9464\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.4153527\\-185.9464\\-7\\-0.9153527\\-185.4464\\-7\\-1.415353\\-185.4464\\-7\\-2.724819\\-184.1369\\-7\\-2.724819\\-183.6369\\-7\\-3.224819\\-183.1369\\-7\\-3.224819\\-182.6369\\-7\\-3.724819\\-182.1369\\-7\\-3.724819\\-179.1369\\-7\\-3.224819\\-178.6369\\-7\\-3.224819\\-178.1369\\-7\\-1.415353\\-176.3274\\-7\\-0.4153527\\-176.3274\\-7\\0.0846473\\-175.8274\\-7\\1.084647\\-175.8274\\-7\\1.584647\\-176.3274\\-7\\2.584647\\-176.3274\\-7\\4.394114\\-178.1369\\-7\\4.394114\\-178.6369\\-7\\4.894114\\-179.1369\\-7\\4.894114\\-182.6369\\-7\\4.394114\\-183.1369\\-7\\4.394114\\-183.6369\\-7\\2.584647\\-185.4464\\-7\\2.084647\\-185.4464\\-7\\1.584647\\-185.9464\\-7" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "3" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "0\\255\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.915353\\-179.8274\\-61\\-6.105886\\-178.6369\\-61\\-6.105886\\-177.6369\\-61\\-4.915353\\-176.4464\\-61\\6.084647\\-176.4464\\-61\\7.275181\\-177.6369\\-61\\7.275181\\-178.6369\\-61\\6.084647\\-179.8274\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.415353\\-186.8274\\-59\\-7.915353\\-186.3274\\-59\\-8.415353\\-186.3274\\-59\\-8.915353\\-185.8274\\-59\\-9.415353\\-185.8274\\-59\\-12.60589\\-182.6369\\-59\\-12.60589\\-182.1369\\-59\\-13.10589\\-181.6369\\-59\\-13.10589\\-180.1369\\-59\\-13.60589\\-179.6369\\-59\\-13.60589\\-177.1369\\-59\\-13.10589\\-176.6369\\-59\\-13.10589\\-175.1369\\-59\\-12.60589\\-174.6369\\-59\\-12.60589\\-174.1369\\-59\\-9.915353\\-171.4464\\-59\\-9.415353\\-171.4464\\-59\\-8.915353\\-170.9464\\-59\\-8.415353\\-170.9464\\-59\\-7.915353\\-170.4464\\-59\\-7.415353\\-170.4464\\-59\\-6.915353\\-169.9464\\-59\\8.084647\\-169.9464\\-59\\8.584647\\-170.4464\\-59\\9.084647\\-170.4464\\-59\\9.584647\\-170.9464\\-59\\10.08465\\-170.9464\\-59\\10.58465\\-171.4464\\-59\\11.08465\\-171.4464\\-59\\13.77518\\-174.1369\\-59\\13.77518\\-174.6369\\-59\\14.27518\\-175.1369\\-59\\14.27518\\-176.1369\\-59\\14.77518\\-176.6369\\-59\\14.77518\\-180.6369\\-59\\14.27518\\-181.1369\\-59\\14.27518\\-181.6369\\-59\\13.77518\\-182.1369\\-59\\13.77518\\-182.6369\\-59\\10.08465\\-186.3274\\-59\\9.084647\\-186.3274\\-59\\8.584647\\-186.8274\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "74" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.415353\\-190.8274\\-57\\-6.915353\\-190.3274\\-57\\-8.915353\\-190.3274\\-57\\-9.415353\\-189.8274\\-57\\-9.915353\\-189.8274\\-57\\-10.41535\\-189.3274\\-57\\-10.91535\\-189.3274\\-57\\-11.41535\\-188.8274\\-57\\-11.91535\\-188.8274\\-57\\-12.91535\\-187.8274\\-57\\-13.41535\\-187.8274\\-57\\-14.60589\\-186.6369\\-57\\-14.60589\\-186.1369\\-57\\-15.60589\\-185.1369\\-57\\-15.60589\\-184.6369\\-57\\-16.10589\\-184.1369\\-57\\-16.10589\\-183.6369\\-57\\-16.60589\\-183.1369\\-57\\-16.60589\\-182.6369\\-57\\-17.10589\\-182.1369\\-57\\-17.10589\\-175.1369\\-57\\-16.60589\\-174.6369\\-57\\-16.60589\\-173.6369\\-57\\-15.60589\\-172.6369\\-57\\-15.60589\\-172.1369\\-57\\-12.41535\\-168.9464\\-57\\-11.91535\\-168.9464\\-57\\-11.41535\\-168.4464\\-57\\-10.91535\\-168.4464\\-57\\-10.41535\\-167.9464\\-57\\-9.915353\\-167.9464\\-57\\-9.415353\\-167.4464\\-57\\-8.915353\\-167.4464\\-57\\-8.415353\\-166.9464\\-57\\-6.415353\\-166.9464\\-57\\-5.915353\\-166.4464\\-57\\7.084647\\-166.4464\\-57\\7.584647\\-166.9464\\-57\\9.584647\\-166.9464\\-57\\10.08465\\-167.4464\\-57\\10.58465\\-167.4464\\-57\\11.08465\\-167.9464\\-57\\11.58465\\-167.9464\\-57\\12.08465\\-168.4464\\-57\\12.58465\\-168.4464\\-57\\13.08465\\-168.9464\\-57\\13.58465\\-168.9464\\-57\\17.27518\\-172.6369\\-57\\17.27518\\-173.1369\\-57\\17.77518\\-173.6369\\-57\\17.77518\\-174.6369\\-57\\18.27518\\-175.1369\\-57\\18.27518\\-176.6369\\-57\\18.77518\\-177.1369\\-57\\18.77518\\-180.1369\\-57\\18.27518\\-180.6369\\-57\\18.27518\\-182.1369\\-57\\17.77518\\-182.6369\\-57\\17.77518\\-183.6369\\-57\\17.27518\\-184.1369\\-57\\17.27518\\-184.6369\\-57\\16.27518\\-185.6369\\-57\\16.27518\\-186.1369\\-57\\14.58465\\-187.8274\\-57\\14.08465\\-187.8274\\-57\\13.08465\\-188.8274\\-57\\12.58465\\-188.8274\\-57\\12.08465\\-189.3274\\-57\\11.58465\\-189.3274\\-57\\11.08465\\-189.8274\\-57\\10.58465\\-189.8274\\-57\\10.08465\\-190.3274\\-57\\8.084647\\-190.3274\\-57\\7.584647\\-190.8274\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-9.415353\\-192.8274\\-55\\-9.915353\\-192.3274\\-55\\-10.91535\\-192.3274\\-55\\-11.41535\\-191.8274\\-55\\-11.91535\\-191.8274\\-55\\-12.41535\\-191.3274\\-55\\-12.91535\\-191.3274\\-55\\-13.41535\\-190.8274\\-55\\-13.91535\\-190.8274\\-55\\-14.91535\\-189.8274\\-55\\-15.41535\\-189.8274\\-55\\-17.10589\\-188.1369\\-55\\-17.10589\\-187.6369\\-55\\-18.10589\\-186.6369\\-55\\-18.10589\\-186.1369\\-55\\-18.60589\\-185.6369\\-55\\-18.60589\\-185.1369\\-55\\-19.10589\\-184.6369\\-55\\-19.10589\\-184.1369\\-55\\-19.60589\\-183.6369\\-55\\-19.60589\\-182.1369\\-55\\-20.10589\\-181.6369\\-55\\-20.10589\\-175.6369\\-55\\-19.60589\\-175.1369\\-55\\-19.60589\\-174.1369\\-55\\-19.10589\\-173.6369\\-55\\-19.10589\\-172.6369\\-55\\-18.60589\\-172.1369\\-55\\-18.60589\\-171.6369\\-55\\-17.60589\\-170.6369\\-55\\-17.60589\\-170.1369\\-55\\-15.41535\\-167.9464\\-55\\-14.91535\\-167.9464\\-55\\-13.41535\\-166.4464\\-55\\-12.91535\\-166.4464\\-55\\-12.41535\\-165.9464\\-55\\-11.41535\\-165.9464\\-55\\-10.91535\\-165.4464\\-55\\-10.41535\\-165.4464\\-55\\-9.915353\\-164.9464\\-55\\-8.415353\\-164.9464\\-55\\-7.915353\\-164.4464\\-55\\9.084647\\-164.4464\\-55\\9.584647\\-164.9464\\-55\\11.08465\\-164.9464\\-55\\11.58465\\-165.4464\\-55\\12.08465\\-165.4464\\-55\\12.58465\\-165.9464\\-55\\13.58465\\-165.9464\\-55\\14.08465\\-166.4464\\-55\\14.58465\\-166.4464\\-55\\15.58465\\-167.4464\\-55\\16.08465\\-167.4464\\-55\\18.77518\\-170.1369\\-55\\18.77518\\-170.6369\\-55\\19.77518\\-171.6369\\-55\\19.77518\\-172.1369\\-55\\20.27518\\-172.6369\\-55\\20.27518\\-173.1369\\-55\\20.77518\\-173.6369\\-55\\20.77518\\-175.1369\\-55\\21.27518\\-175.6369\\-55\\21.27518\\-182.1369\\-55\\20.77518\\-182.6369\\-55\\20.77518\\-183.6369\\-55\\20.27518\\-184.1369\\-55\\20.27518\\-184.6369\\-55\\19.77518\\-185.1369\\-55\\19.77518\\-185.6369\\-55\\19.27518\\-186.1369\\-55\\19.27518\\-186.6369\\-55\\17.77518\\-188.1369\\-55\\17.77518\\-188.6369\\-55\\16.58465\\-189.8274\\-55\\16.08465\\-189.8274\\-55\\15.08465\\-190.8274\\-55\\14.58465\\-190.8274\\-55\\13.58465\\-191.8274\\-55\\12.58465\\-191.8274\\-55\\12.08465\\-192.3274\\-55\\11.08465\\-192.3274\\-55\\10.58465\\-192.8274\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "80" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-9.915353\\-194.8274\\-53\\-10.41535\\-194.3869\\-53\\-11.91535\\-194.3274\\-53\\-12.41535\\-193.8274\\-53\\-12.91535\\-193.8274\\-53\\-13.41535\\-193.3274\\-53\\-13.91535\\-193.3274\\-53\\-14.41535\\-192.8274\\-53\\-14.91535\\-192.8274\\-53\\-15.91535\\-191.8274\\-53\\-16.41535\\-191.8274\\-53\\-19.10589\\-189.1369\\-53\\-19.10589\\-188.6369\\-53\\-20.10589\\-187.6369\\-53\\-20.10589\\-187.1369\\-53\\-21.10589\\-186.1369\\-53\\-21.10589\\-185.1369\\-53\\-21.60589\\-184.6369\\-53\\-21.60589\\-183.6369\\-53\\-22.10589\\-183.1369\\-53\\-22.10589\\-174.6369\\-53\\-21.60589\\-174.1369\\-53\\-21.60589\\-173.1369\\-53\\-21.10589\\-172.6369\\-53\\-21.10589\\-172.1369\\-53\\-20.60589\\-171.6369\\-53\\-20.60589\\-171.1369\\-53\\-20.10589\\-170.6369\\-53\\-20.10589\\-170.1369\\-53\\-15.41535\\-165.4464\\-53\\-14.91535\\-165.4464\\-53\\-14.41535\\-164.9464\\-53\\-13.91535\\-164.9464\\-53\\-13.41535\\-164.4464\\-53\\-12.91535\\-164.4464\\-53\\-12.41535\\-163.9464\\-53\\-11.41535\\-163.9464\\-53\\-10.91535\\-163.4464\\-53\\-9.415353\\-163.3869\\-53\\-8.915353\\-162.9464\\-53\\-6.915353\\-162.8869\\-53\\8.084647\\-162.8869\\-53\\10.08465\\-162.9464\\-53\\10.58465\\-163.3869\\-53\\12.08465\\-163.4464\\-53\\12.58465\\-163.9464\\-53\\13.58465\\-163.9464\\-53\\14.08465\\-164.4464\\-53\\14.58465\\-164.4464\\-53\\15.08465\\-164.9464\\-53\\15.58465\\-164.9464\\-53\\16.08465\\-165.4464\\-53\\16.58465\\-165.4464\\-53\\21.27518\\-170.1369\\-53\\21.27518\\-170.6369\\-53\\22.27518\\-171.6369\\-53\\22.27518\\-172.6369\\-53\\22.77518\\-173.1369\\-53\\22.77518\\-174.1369\\-53\\23.27518\\-174.6369\\-53\\23.27518\\-183.1369\\-53\\22.77518\\-183.6369\\-53\\22.77518\\-185.1369\\-53\\22.27518\\-185.6369\\-53\\22.27518\\-186.1369\\-53\\21.27518\\-187.1369\\-53\\21.27518\\-187.6369\\-53\\20.27518\\-188.6369\\-53\\20.27518\\-189.1369\\-53\\18.08465\\-191.3274\\-53\\17.58465\\-191.3274\\-53\\16.08465\\-192.8274\\-53\\15.58465\\-192.8274\\-53\\15.08465\\-193.3274\\-53\\14.58465\\-193.3274\\-53\\14.08465\\-193.8274\\-53\\13.58465\\-193.8274\\-53\\13.08465\\-194.3274\\-53\\11.58465\\-194.3274\\-53\\11.08465\\-194.8274\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "92" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.415353\\-196.8274\\-51\\-8.915353\\-196.3869\\-51\\-10.91535\\-196.3274\\-51\\-11.41535\\-195.8869\\-51\\-12.91535\\-195.8274\\-51\\-13.41535\\-195.3274\\-51\\-13.91535\\-195.3274\\-51\\-14.41535\\-194.8274\\-51\\-14.91535\\-194.8274\\-51\\-15.41535\\-194.3274\\-51\\-15.91535\\-194.3274\\-51\\-17.41535\\-192.8274\\-51\\-17.91535\\-192.8274\\-51\\-20.60589\\-190.1369\\-51\\-20.60589\\-189.6369\\-51\\-22.10589\\-188.1369\\-51\\-22.10589\\-187.6369\\-51\\-22.60589\\-187.1369\\-51\\-22.60589\\-186.6369\\-51\\-23.10589\\-186.1369\\-51\\-23.16535\\-185.1369\\-51\\-23.60589\\-184.6369\\-51\\-23.66535\\-183.1369\\-51\\-24.10589\\-182.6369\\-51\\-24.10589\\-175.1369\\-51\\-23.66535\\-174.6369\\-51\\-23.60589\\-173.1369\\-51\\-23.10589\\-172.6369\\-51\\-23.10589\\-172.1369\\-51\\-22.60589\\-171.6369\\-51\\-22.60589\\-171.1369\\-51\\-22.10589\\-170.6369\\-51\\-22.10589\\-170.1369\\-51\\-21.10589\\-169.1369\\-51\\-21.10589\\-168.6369\\-51\\-17.41535\\-164.9464\\-51\\-16.91535\\-164.9464\\-51\\-16.41535\\-164.4464\\-51\\-15.91535\\-164.3869\\-51\\-14.91535\\-163.4464\\-51\\-13.91535\\-163.3869\\-51\\-13.41535\\-162.9464\\-51\\-12.41535\\-162.8869\\-51\\-11.91535\\-162.4464\\-51\\-10.91535\\-162.3869\\-51\\-10.41535\\-161.9464\\-51\\-8.415353\\-161.8869\\-51\\-7.915353\\-161.4464\\-51\\8.584647\\-161.4464\\-51\\9.084647\\-161.8869\\-51\\11.58465\\-161.9464\\-51\\12.08465\\-162.3869\\-51\\13.08465\\-162.4464\\-51\\13.58465\\-162.8869\\-51\\14.58465\\-162.9464\\-51\\17.58465\\-164.4464\\-51\\18.58465\\-165.3869\\-51\\19.08465\\-165.4464\\-51\\22.27518\\-168.6369\\-51\\22.27518\\-169.1369\\-51\\23.27518\\-170.1369\\-51\\23.27518\\-170.6369\\-51\\23.77518\\-171.1369\\-51\\24.27518\\-172.1369\\-51\\24.27518\\-172.6369\\-51\\24.77518\\-173.1369\\-51\\24.77518\\-174.1369\\-51\\25.27518\\-174.6369\\-51\\25.27518\\-182.6369\\-51\\24.83465\\-183.1369\\-51\\24.77518\\-184.6369\\-51\\24.33465\\-185.1369\\-51\\24.27518\\-186.1369\\-51\\23.77518\\-186.6369\\-51\\23.77518\\-187.1369\\-51\\23.27518\\-187.6369\\-51\\23.27518\\-188.1369\\-51\\20.77518\\-190.6369\\-51\\20.77518\\-191.1369\\-51\\19.58465\\-192.3274\\-51\\19.08465\\-192.3274\\-51\\17.08465\\-194.3274\\-51\\16.58465\\-194.3274\\-51\\16.08465\\-194.8274\\-51\\15.58465\\-194.8274\\-51\\15.08465\\-195.3274\\-51\\14.08465\\-195.3869\\-51\\13.58465\\-195.8274\\-51\\12.08465\\-195.8869\\-51\\11.58465\\-196.3274\\-51\\10.08465\\-196.3869\\-51\\9.584647\\-196.8274\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "88" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.915353\\-198.3274\\-49\\-8.415353\\-197.8869\\-49\\-10.91535\\-197.8274\\-49\\-11.41535\\-197.3869\\-49\\-12.41535\\-197.3274\\-49\\-12.91535\\-196.8869\\-49\\-13.91535\\-196.8274\\-49\\-14.41535\\-196.3869\\-49\\-15.41535\\-196.3274\\-49\\-15.91535\\-195.8274\\-49\\-16.41535\\-195.8274\\-49\\-17.41535\\-194.8274\\-49\\-17.91535\\-194.8274\\-49\\-22.10589\\-190.6369\\-49\\-22.16535\\-190.1369\\-49\\-23.10589\\-189.1369\\-49\\-23.66535\\-187.6369\\-49\\-24.60589\\-186.1369\\-49\\-24.66535\\-185.1369\\-49\\-25.10589\\-184.6369\\-49\\-25.16535\\-183.1369\\-49\\-25.60589\\-182.6369\\-49\\-25.66535\\-177.6369\\-49\\-25.60589\\-174.6369\\-49\\-25.16535\\-174.1369\\-49\\-25.10589\\-173.1369\\-49\\-24.66535\\-172.6369\\-49\\-24.60589\\-171.6369\\-49\\-24.10589\\-170.6369\\-49\\-23.60589\\-170.1369\\-49\\-23.60589\\-169.6369\\-49\\-22.16535\\-168.1369\\-49\\-22.10589\\-167.6369\\-49\\-18.91535\\-164.4464\\-49\\-18.41535\\-164.3869\\-49\\-17.41535\\-163.4464\\-49\\-16.91535\\-163.3869\\-49\\-14.41535\\-161.9464\\-49\\-13.41535\\-161.8869\\-49\\-12.91535\\-161.4464\\-49\\-11.41535\\-161.3869\\-49\\-10.91535\\-160.9464\\-49\\-8.415353\\-160.8869\\-49\\-7.915353\\-160.4464\\-49\\9.084647\\-160.4464\\-49\\9.584647\\-160.8869\\-49\\12.08465\\-160.9464\\-49\\12.58465\\-161.3869\\-49\\14.08465\\-161.4464\\-49\\15.58465\\-162.3869\\-49\\16.58465\\-162.4464\\-49\\17.08465\\-162.9464\\-49\\17.58465\\-162.9464\\-49\\18.58465\\-163.4464\\-49\\20.08465\\-164.8869\\-49\\20.58465\\-164.9464\\-49\\23.27518\\-167.6369\\-49\\23.33465\\-168.1369\\-49\\24.77518\\-169.6369\\-49\\24.77518\\-170.1369\\-49\\25.27518\\-170.6369\\-49\\25.77518\\-171.6369\\-49\\25.83465\\-172.6369\\-49\\26.27518\\-173.1369\\-49\\26.33465\\-174.1369\\-49\\26.77518\\-174.6369\\-49\\26.83465\\-176.6369\\-49\\26.83465\\-180.6369\\-49\\26.77518\\-183.1369\\-49\\26.33465\\-183.6369\\-49\\26.27518\\-184.6369\\-49\\25.83465\\-185.1369\\-49\\25.77518\\-186.1369\\-49\\25.33465\\-186.6369\\-49\\24.27518\\-189.1369\\-49\\23.27518\\-190.1369\\-49\\23.27518\\-190.6369\\-49\\19.58465\\-194.3274\\-49\\19.08465\\-194.3274\\-49\\18.08465\\-195.3274\\-49\\16.58465\\-195.8869\\-49\\15.08465\\-196.8274\\-49\\14.08465\\-196.8869\\-49\\13.58465\\-197.3274\\-49\\12.08465\\-197.3869\\-49\\11.58465\\-197.8274\\-49\\9.084647\\-197.8869\\-49\\8.584647\\-198.3274\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-9.415353\\-199.3274\\-47\\-9.915353\\-198.8869\\-47\\-11.91535\\-198.8274\\-47\\-12.41535\\-198.3869\\-47\\-13.41535\\-198.3274\\-47\\-13.91535\\-197.8869\\-47\\-14.91535\\-197.8274\\-47\\-15.41535\\-197.3869\\-47\\-17.91535\\-196.3274\\-47\\-18.91535\\-195.3869\\-47\\-19.41535\\-195.3274\\-47\\-22.60589\\-192.1369\\-47\\-22.66535\\-191.6369\\-47\\-24.10589\\-190.1369\\-47\\-24.16535\\-189.6369\\-47\\-25.60589\\-187.1369\\-47\\-25.66535\\-186.1369\\-47\\-26.10589\\-185.6369\\-47\\-26.16535\\-184.6369\\-47\\-26.60589\\-184.1369\\-47\\-26.66535\\-182.1369\\-47\\-27.10589\\-181.6369\\-47\\-27.10589\\-176.1369\\-47\\-26.66535\\-175.6369\\-47\\-26.60589\\-173.6369\\-47\\-26.16535\\-173.1369\\-47\\-26.10589\\-172.1369\\-47\\-24.66535\\-169.6369\\-47\\-24.60589\\-169.1369\\-47\\-23.66535\\-168.1369\\-47\\-23.60589\\-167.6369\\-47\\-21.41535\\-165.3869\\-47\\-19.41535\\-163.4464\\-47\\-15.91535\\-161.8869\\-47\\-14.41535\\-160.9464\\-47\\-12.91535\\-160.8869\\-47\\-12.41535\\-160.4464\\-47\\-10.91535\\-160.3869\\-47\\-10.41535\\-159.9464\\-47\\-9.415353\\-159.8869\\-47\\10.58465\\-159.8869\\-47\\11.58465\\-160.3869\\-47\\13.58465\\-160.4464\\-47\\14.08465\\-160.8869\\-47\\15.08465\\-160.9464\\-47\\15.58465\\-161.3869\\-47\\16.58465\\-161.4464\\-47\\17.08465\\-161.8869\\-47\\19.08465\\-162.8869\\-47\\19.58465\\-162.9464\\-47\\20.58465\\-163.8869\\-47\\21.08465\\-163.9464\\-47\\24.77518\\-167.6369\\-47\\24.83465\\-168.1369\\-47\\25.77518\\-169.1369\\-47\\25.83465\\-169.6369\\-47\\27.27518\\-172.1369\\-47\\27.33465\\-173.1369\\-47\\27.77518\\-173.6369\\-47\\27.83465\\-175.6369\\-47\\28.27518\\-176.1369\\-47\\28.27518\\-182.1369\\-47\\27.83465\\-182.6369\\-47\\27.77518\\-184.1369\\-47\\27.33465\\-184.6369\\-47\\27.27518\\-185.6369\\-47\\26.83465\\-186.1369\\-47\\26.77518\\-187.1369\\-47\\25.33465\\-189.6369\\-47\\25.27518\\-190.1369\\-47\\23.33465\\-192.1369\\-47\\23.27518\\-192.6369\\-47\\21.08465\\-194.8274\\-47\\20.58465\\-194.8869\\-47\\19.08465\\-196.3274\\-47\\18.58465\\-196.3274\\-47\\18.08465\\-196.8274\\-47\\17.08465\\-197.3274\\-47\\16.08465\\-197.3869\\-47\\14.58465\\-198.3274\\-47\\13.08465\\-198.3869\\-47\\12.58465\\-198.8274\\-47\\10.58465\\-198.8869\\-47\\10.08465\\-199.3274\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "97" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.41535\\-200.3274\\-45\\-10.91535\\-199.8869\\-45\\-12.41535\\-199.8274\\-45\\-12.91535\\-199.3869\\-45\\-13.91535\\-199.3274\\-45\\-14.41535\\-198.8869\\-45\\-15.41535\\-198.8274\\-45\\-15.91535\\-198.3869\\-45\\-18.41535\\-197.3274\\-45\\-19.41535\\-196.3869\\-45\\-19.91535\\-196.3274\\-45\\-24.10589\\-192.1369\\-45\\-24.16535\\-191.6369\\-45\\-25.10589\\-190.6369\\-45\\-26.60589\\-187.6369\\-45\\-26.66535\\-186.6369\\-45\\-27.10589\\-186.1369\\-45\\-27.16535\\-185.1369\\-45\\-27.60589\\-184.6369\\-45\\-27.66535\\-182.6369\\-45\\-28.10589\\-182.1369\\-45\\-28.10589\\-175.6369\\-45\\-27.66535\\-175.1369\\-45\\-27.60589\\-173.6369\\-45\\-27.16535\\-173.1369\\-45\\-27.10589\\-172.1369\\-45\\-25.66535\\-169.6369\\-45\\-25.60589\\-169.1369\\-45\\-24.66535\\-167.6369\\-45\\-24.60589\\-167.1369\\-45\\-21.41535\\-163.9464\\-45\\-20.91535\\-163.8869\\-45\\-19.91535\\-162.9464\\-45\\-19.41535\\-162.8869\\-45\\-18.41535\\-161.9464\\-45\\-16.91535\\-161.3869\\-45\\-16.41535\\-160.9464\\-45\\-15.41535\\-160.8869\\-45\\-14.91535\\-160.4464\\-45\\-13.91535\\-160.3869\\-45\\-13.41535\\-159.9464\\-45\\-11.91535\\-159.8869\\-45\\-11.41535\\-159.4464\\-45\\-10.41535\\-159.3869\\-45\\-6.915353\\-159.3869\\-45\\-6.415353\\-158.9464\\-45\\6.584647\\-158.9464\\-45\\7.084647\\-159.3869\\-45\\11.08465\\-159.3869\\-45\\12.08465\\-159.4464\\-45\\12.58465\\-159.8869\\-45\\14.08465\\-159.9464\\-45\\14.58465\\-160.3869\\-45\\15.58465\\-160.4464\\-45\\16.08465\\-160.8869\\-45\\17.08465\\-160.9464\\-45\\17.58465\\-161.3869\\-45\\18.08465\\-161.3869\\-45\\18.58465\\-161.8869\\-45\\19.08465\\-161.8869\\-45\\19.58465\\-162.3869\\-45\\21.08465\\-162.9464\\-45\\22.58465\\-164.3869\\-45\\23.08465\\-164.4464\\-45\\25.27518\\-166.6369\\-45\\25.33465\\-167.1369\\-45\\26.27518\\-168.1369\\-45\\26.83465\\-169.6369\\-45\\28.27518\\-172.1369\\-45\\28.33465\\-173.1369\\-45\\28.77518\\-173.6369\\-45\\28.83465\\-175.1369\\-45\\29.27518\\-175.6369\\-45\\29.27518\\-182.6369\\-45\\28.83465\\-183.1369\\-45\\28.77518\\-184.6369\\-45\\28.33465\\-185.1369\\-45\\28.27518\\-186.1369\\-45\\27.83465\\-186.6369\\-45\\27.77518\\-187.6369\\-45\\26.83465\\-189.1369\\-45\\26.27518\\-190.6369\\-45\\24.83465\\-192.1369\\-45\\24.77518\\-192.6369\\-45\\21.58465\\-195.8274\\-45\\21.08465\\-195.8869\\-45\\19.58465\\-197.3274\\-45\\17.08465\\-198.3869\\-45\\16.58465\\-198.8274\\-45\\15.58465\\-198.8869\\-45\\15.08465\\-199.3274\\-45\\13.58465\\-199.3869\\-45\\13.08465\\-199.8274\\-45\\11.08465\\-199.8869\\-45\\10.58465\\-200.3274\\-45\\8.084647\\-200.3869\\-45\\-7.915353\\-200.3869\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "102" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.41535\\-201.3274\\-43\\-10.91535\\-200.8869\\-43\\-12.41535\\-200.8274\\-43\\-12.91535\\-200.3869\\-43\\-14.41535\\-200.3274\\-43\\-15.91535\\-199.3869\\-43\\-16.91535\\-199.3274\\-43\\-17.91535\\-198.8274\\-43\\-18.91535\\-197.8869\\-43\\-19.41535\\-197.8274\\-43\\-20.41535\\-196.8869\\-43\\-20.91535\\-196.8274\\-43\\-24.10589\\-193.6369\\-43\\-24.16535\\-193.1369\\-43\\-25.10589\\-192.1369\\-43\\-25.16535\\-191.6369\\-43\\-26.10589\\-190.6369\\-43\\-26.66535\\-189.1369\\-43\\-27.10589\\-188.6369\\-43\\-27.16535\\-187.6369\\-43\\-27.60589\\-187.1369\\-43\\-27.66535\\-186.1369\\-43\\-28.10589\\-185.6369\\-43\\-28.16535\\-184.6369\\-43\\-28.60589\\-184.1369\\-43\\-28.66535\\-182.1369\\-43\\-29.10589\\-181.6369\\-43\\-29.10589\\-176.6369\\-43\\-28.66535\\-176.1369\\-43\\-28.60589\\-173.6369\\-43\\-28.16535\\-173.1369\\-43\\-28.10589\\-172.1369\\-43\\-26.66535\\-169.6369\\-43\\-26.10589\\-168.1369\\-43\\-25.16535\\-167.1369\\-43\\-25.10589\\-166.6369\\-43\\-21.91535\\-163.4464\\-43\\-21.41535\\-163.3869\\-43\\-20.41535\\-162.4464\\-43\\-19.91535\\-162.3869\\-43\\-19.41535\\-161.8869\\-43\\-18.91535\\-161.8869\\-43\\-17.91535\\-160.9464\\-43\\-16.91535\\-160.8869\\-43\\-16.41535\\-160.3869\\-43\\-15.91535\\-160.3869\\-43\\-15.41535\\-159.9464\\-43\\-13.91535\\-159.8869\\-43\\-13.41535\\-159.4464\\-43\\-11.41535\\-159.3869\\-43\\-10.41535\\-158.8869\\-43\\11.08465\\-158.8869\\-43\\12.08465\\-159.3869\\-43\\14.08465\\-159.4464\\-43\\14.58465\\-159.8869\\-43\\16.08465\\-159.9464\\-43\\16.58465\\-160.3869\\-43\\17.58465\\-160.4464\\-43\\20.08465\\-161.8869\\-43\\20.58465\\-161.9464\\-43\\21.58465\\-162.8869\\-43\\22.08465\\-162.9464\\-43\\23.08465\\-163.8869\\-43\\23.58465\\-163.9464\\-43\\26.27518\\-166.6369\\-43\\26.33465\\-167.1369\\-43\\27.27518\\-168.1369\\-43\\27.83465\\-169.6369\\-43\\29.27518\\-172.1369\\-43\\29.33465\\-173.1369\\-43\\29.77518\\-173.6369\\-43\\29.83465\\-176.1369\\-43\\30.27518\\-176.6369\\-43\\30.27518\\-181.6369\\-43\\29.83465\\-182.1369\\-43\\29.77518\\-184.1369\\-43\\29.33465\\-184.6369\\-43\\29.27518\\-185.6369\\-43\\28.83465\\-186.1369\\-43\\28.77518\\-187.1369\\-43\\28.33465\\-187.6369\\-43\\28.27518\\-188.6369\\-43\\27.27518\\-190.6369\\-43\\26.33465\\-191.6369\\-43\\26.27518\\-192.1369\\-43\\24.83465\\-193.6369\\-43\\24.77518\\-194.1369\\-43\\22.58465\\-196.3274\\-43\\22.08465\\-196.3869\\-43\\20.58465\\-197.8274\\-43\\19.08465\\-198.3869\\-43\\18.58465\\-198.8274\\-43\\17.08465\\-199.3869\\-43\\16.58465\\-199.8274\\-43\\15.58465\\-199.8869\\-43\\15.08465\\-200.3274\\-43\\13.58465\\-200.3869\\-43\\13.08465\\-200.8274\\-43\\11.08465\\-200.8869\\-43\\10.58465\\-201.3274\\-43\\8.084647\\-201.3869\\-43\\-8.415353\\-201.3869\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "109" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-9.915353\\-202.3274\\-41\\-10.41535\\-201.8869\\-41\\-12.41535\\-201.8274\\-41\\-12.91535\\-201.3869\\-41\\-13.91535\\-201.3274\\-41\\-14.41535\\-200.8869\\-41\\-15.41535\\-200.8274\\-41\\-16.91535\\-199.8869\\-41\\-19.41535\\-198.8274\\-41\\-20.91535\\-197.3869\\-41\\-21.41535\\-197.3274\\-41\\-24.60589\\-194.1369\\-41\\-24.66535\\-193.6369\\-41\\-25.60589\\-192.6369\\-41\\-25.66535\\-192.1369\\-41\\-26.60589\\-191.1369\\-41\\-27.16535\\-189.6369\\-41\\-28.10589\\-188.1369\\-41\\-28.16535\\-187.1369\\-41\\-28.60589\\-186.6369\\-41\\-28.66535\\-185.6369\\-41\\-29.10589\\-185.1369\\-41\\-29.16535\\-183.1369\\-41\\-29.60589\\-182.6369\\-41\\-29.66535\\-181.6369\\-41\\-29.66535\\-176.6369\\-41\\-29.60589\\-175.1369\\-41\\-29.16535\\-174.6369\\-41\\-29.10589\\-173.1369\\-41\\-28.66535\\-172.6369\\-41\\-28.60589\\-171.6369\\-41\\-27.66535\\-170.1369\\-41\\-27.66535\\-169.6369\\-41\\-27.16535\\-169.1369\\-41\\-27.10589\\-168.6369\\-41\\-26.16535\\-167.6369\\-41\\-26.10589\\-167.1369\\-41\\-25.16535\\-166.1369\\-41\\-25.10589\\-165.6369\\-41\\-23.41535\\-163.9464\\-41\\-22.91535\\-163.8869\\-41\\-21.41535\\-162.4464\\-41\\-20.91535\\-162.3869\\-41\\-20.41535\\-161.8869\\-41\\-19.91535\\-161.8869\\-41\\-18.91535\\-160.9464\\-41\\-17.91535\\-160.4464\\-41\\-16.91535\\-160.3869\\-41\\-16.41535\\-159.8869\\-41\\-15.41535\\-159.8869\\-41\\-14.91535\\-159.3869\\-41\\-13.41535\\-159.3869\\-41\\-12.91535\\-158.9464\\-41\\-9.415353\\-158.8869\\-41\\-8.915353\\-158.4464\\-41\\-7.915353\\-158.3869\\-41\\8.584647\\-158.3869\\-41\\9.584647\\-158.4464\\-41\\10.08465\\-158.8869\\-41\\13.08465\\-158.9464\\-41\\13.58465\\-159.3869\\-41\\15.58465\\-159.3869\\-41\\16.08465\\-159.8869\\-41\\17.08465\\-159.8869\\-41\\17.58465\\-160.3869\\-41\\18.58465\\-160.4464\\-41\\21.58465\\-161.9464\\-41\\22.58465\\-162.8869\\-41\\23.58465\\-163.3869\\-41\\26.83465\\-166.6369\\-41\\27.33465\\-167.6369\\-41\\28.27518\\-168.6369\\-41\\28.83465\\-170.1369\\-41\\29.77518\\-171.6369\\-41\\29.83465\\-172.6369\\-41\\30.27518\\-173.1369\\-41\\30.33465\\-174.6369\\-41\\30.77518\\-175.1369\\-41\\30.83465\\-176.1369\\-41\\30.83465\\-181.6369\\-41\\30.77518\\-182.6369\\-41\\30.33465\\-183.1369\\-41\\30.27518\\-185.1369\\-41\\29.83465\\-185.6369\\-41\\29.77518\\-186.6369\\-41\\29.33465\\-187.1369\\-41\\29.27518\\-188.1369\\-41\\28.33465\\-189.6369\\-41\\27.77518\\-191.1369\\-41\\26.83465\\-192.1369\\-41\\26.77518\\-192.6369\\-41\\25.83465\\-193.6369\\-41\\25.77518\\-194.1369\\-41\\23.08465\\-196.8274\\-41\\22.58465\\-196.8869\\-41\\21.08465\\-198.3274\\-41\\20.58465\\-198.3869\\-41\\19.58465\\-199.3274\\-41\\17.58465\\-200.3274\\-41\\16.58465\\-200.3869\\-41\\16.08465\\-200.8274\\-41\\15.08465\\-200.8869\\-41\\14.58465\\-201.3274\\-41\\13.58465\\-201.3869\\-41\\13.08465\\-201.8274\\-41\\10.58465\\-201.8869\\-41\\10.08465\\-202.3274\\-41\\8.084647\\-202.3869\\-41\\-7.415353\\-202.3869\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "135" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.415353\\-203.3274\\-39\\-8.915353\\-202.8869\\-39\\-11.41535\\-202.8274\\-39\\-11.91535\\-202.3869\\-39\\-13.41535\\-202.3274\\-39\\-13.91535\\-201.8869\\-39\\-14.91535\\-201.8274\\-39\\-16.41535\\-200.8869\\-39\\-16.91535\\-200.8869\\-39\\-17.41535\\-200.3869\\-39\\-17.91535\\-200.3869\\-39\\-18.41535\\-199.8869\\-39\\-18.91535\\-199.8274\\-39\\-19.91535\\-198.8869\\-39\\-20.41535\\-198.8274\\-39\\-21.91535\\-197.3869\\-39\\-22.41535\\-197.3274\\-39\\-24.10589\\-195.6369\\-39\\-24.16535\\-195.1369\\-39\\-25.60589\\-193.6369\\-39\\-25.66535\\-193.1369\\-39\\-26.60589\\-192.1369\\-39\\-26.66535\\-191.6369\\-39\\-27.16535\\-191.1369\\-39\\-27.16535\\-190.6369\\-39\\-27.66535\\-190.1369\\-39\\-27.66535\\-189.6369\\-39\\-28.16535\\-189.1369\\-39\\-28.16535\\-188.6369\\-39\\-28.60589\\-188.1369\\-39\\-28.66535\\-187.1369\\-39\\-29.16535\\-186.6369\\-39\\-29.16535\\-185.6369\\-39\\-29.60589\\-185.1369\\-39\\-29.66535\\-183.1369\\-39\\-30.10589\\-182.6369\\-39\\-30.16535\\-181.6369\\-39\\-30.16535\\-176.6369\\-39\\-30.10589\\-175.6369\\-39\\-29.66535\\-175.1369\\-39\\-29.60589\\-173.1369\\-39\\-29.16535\\-172.6369\\-39\\-29.10589\\-171.6369\\-39\\-28.66535\\-171.1369\\-39\\-28.66535\\-170.6369\\-39\\-28.16535\\-170.1369\\-39\\-28.10589\\-169.1369\\-39\\-27.16535\\-168.1369\\-39\\-27.10589\\-167.6369\\-39\\-26.16535\\-166.6369\\-39\\-26.10589\\-166.1369\\-39\\-22.91535\\-162.9464\\-39\\-22.41535\\-162.8869\\-39\\-21.41535\\-161.9464\\-39\\-20.91535\\-161.8869\\-39\\-20.41535\\-161.3869\\-39\\-19.91535\\-161.3869\\-39\\-19.41535\\-160.8869\\-39\\-18.91535\\-160.8869\\-39\\-18.41535\\-160.3869\\-39\\-17.91535\\-160.3869\\-39\\-17.41535\\-159.8869\\-39\\-16.41535\\-159.8869\\-39\\-15.91535\\-159.3869\\-39\\-14.41535\\-159.3869\\-39\\-13.91535\\-158.8869\\-39\\-11.41535\\-158.8869\\-39\\-10.41535\\-158.3869\\-39\\10.58465\\-158.3869\\-39\\11.58465\\-158.8869\\-39\\14.08465\\-158.8869\\-39\\14.58465\\-159.3869\\-39\\16.58465\\-159.4464\\-39\\17.08465\\-159.8869\\-39\\18.08465\\-159.8869\\-39\\18.58465\\-160.3869\\-39\\19.08465\\-160.3869\\-39\\19.58465\\-160.8869\\-39\\20.08465\\-160.8869\\-39\\20.58465\\-161.3869\\-39\\21.08465\\-161.3869\\-39\\21.58465\\-161.8869\\-39\\22.08465\\-161.8869\\-39\\22.58465\\-162.3869\\-39\\23.08465\\-162.4464\\-39\\24.58465\\-163.8869\\-39\\25.08465\\-163.9464\\-39\\26.77518\\-165.6369\\-39\\26.83465\\-166.1369\\-39\\28.27518\\-167.6369\\-39\\28.33465\\-168.1369\\-39\\28.83465\\-168.6369\\-39\\28.83465\\-169.1369\\-39\\29.33465\\-169.6369\\-39\\29.33465\\-170.1369\\-39\\29.83465\\-170.6369\\-39\\29.83465\\-171.1369\\-39\\30.27518\\-171.6369\\-39\\30.33465\\-172.6369\\-39\\30.77518\\-173.1369\\-39\\30.83465\\-175.1369\\-39\\31.33465\\-176.1369\\-39\\31.33465\\-181.6369\\-39\\31.27518\\-182.6369\\-39\\30.83465\\-183.1369\\-39\\30.77518\\-185.1369\\-39\\30.33465\\-185.6369\\-39\\30.33465\\-186.6369\\-39\\29.83465\\-187.1369\\-39\\29.77518\\-188.1369\\-39\\28.83465\\-189.6369\\-39\\28.83465\\-190.1369\\-39\\28.33465\\-190.6369\\-39\\28.33465\\-191.1369\\-39\\27.83465\\-191.6369\\-39\\27.77518\\-192.1369\\-39\\26.83465\\-193.1369\\-39\\26.77518\\-193.6369\\-39\\24.83465\\-195.6369\\-39\\24.77518\\-196.1369\\-39\\24.08465\\-196.8274\\-39\\23.58465\\-196.8869\\-39\\21.58465\\-198.8274\\-39\\21.08465\\-198.8869\\-39\\20.08465\\-199.8274\\-39\\17.58465\\-200.8869\\-39\\17.08465\\-201.3274\\-39\\16.08465\\-201.3869\\-39\\15.58465\\-201.8274\\-39\\14.58465\\-201.8869\\-39\\14.08465\\-202.3274\\-39\\12.58465\\-202.3869\\-39\\12.08465\\-202.8274\\-39\\9.584647\\-202.8869\\-39\\9.084647\\-203.3274\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "134" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-9.915353\\-203.8274\\-37\\-10.41535\\-203.3869\\-37\\-11.91535\\-203.3274\\-37\\-12.41535\\-202.8869\\-37\\-13.91535\\-202.8274\\-37\\-14.41535\\-202.3869\\-37\\-15.41535\\-202.3274\\-37\\-17.91535\\-200.8869\\-37\\-18.41535\\-200.8274\\-37\\-19.41535\\-199.8869\\-37\\-19.91535\\-199.8274\\-37\\-21.41535\\-198.3869\\-37\\-21.91535\\-198.3274\\-37\\-24.10589\\-196.1369\\-37\\-24.16535\\-195.6369\\-37\\-26.10589\\-193.6369\\-37\\-26.16535\\-193.1369\\-37\\-27.10589\\-192.1369\\-37\\-27.66535\\-190.6369\\-37\\-28.16535\\-190.1369\\-37\\-28.16535\\-189.6369\\-37\\-28.66535\\-189.1369\\-37\\-28.66535\\-188.1369\\-37\\-29.16535\\-187.6369\\-37\\-29.16535\\-187.1369\\-37\\-29.60589\\-186.6369\\-37\\-29.66535\\-185.1369\\-37\\-30.10589\\-184.6369\\-37\\-30.16535\\-182.1369\\-37\\-30.60589\\-181.6369\\-37\\-30.66535\\-180.6369\\-37\\-30.66535\\-177.1369\\-37\\-30.60589\\-176.1369\\-37\\-30.16535\\-175.6369\\-37\\-30.10589\\-173.6369\\-37\\-29.66535\\-173.1369\\-37\\-29.66535\\-172.1369\\-37\\-29.16535\\-171.6369\\-37\\-29.10589\\-170.6369\\-37\\-28.66535\\-170.1369\\-37\\-28.66535\\-169.6369\\-37\\-28.16535\\-169.1369\\-37\\-28.16535\\-168.6369\\-37\\-27.66535\\-168.1369\\-37\\-27.60589\\-167.6369\\-37\\-26.16535\\-166.1369\\-37\\-26.10589\\-165.6369\\-37\\-23.91535\\-163.4464\\-37\\-23.41535\\-163.3869\\-37\\-22.41535\\-162.3869\\-37\\-21.91535\\-162.3869\\-37\\-20.91535\\-161.4464\\-37\\-20.41535\\-161.3869\\-37\\-19.91535\\-160.8869\\-37\\-19.41535\\-160.8869\\-37\\-18.91535\\-160.3869\\-37\\-18.41535\\-160.3869\\-37\\-17.91535\\-159.9464\\-37\\-16.91535\\-159.8869\\-37\\-16.41535\\-159.3869\\-37\\-14.91535\\-159.3869\\-37\\-14.41535\\-158.8869\\-37\\-12.41535\\-158.8869\\-37\\-11.41535\\-158.3869\\-37\\-7.915353\\-158.3869\\-37\\-7.415353\\-157.8869\\-37\\7.584647\\-157.8869\\-37\\8.084647\\-158.3869\\-37\\11.58465\\-158.3869\\-37\\12.58465\\-158.8869\\-37\\14.58465\\-158.8869\\-37\\15.08465\\-159.3869\\-37\\16.58465\\-159.3869\\-37\\17.08465\\-159.8869\\-37\\18.58465\\-159.8869\\-37\\19.08465\\-160.3869\\-37\\19.58465\\-160.3869\\-37\\20.08465\\-160.8869\\-37\\20.58465\\-160.8869\\-37\\21.08465\\-161.3869\\-37\\21.58465\\-161.3869\\-37\\22.08465\\-161.8869\\-37\\22.58465\\-161.8869\\-37\\23.58465\\-162.8869\\-37\\24.08465\\-162.8869\\-37\\28.33465\\-167.1369\\-37\\28.33465\\-167.6369\\-37\\29.33465\\-168.6369\\-37\\29.33465\\-169.1369\\-37\\29.83465\\-169.6369\\-37\\29.83465\\-170.1369\\-37\\30.27518\\-170.6369\\-37\\30.33465\\-171.6369\\-37\\30.77518\\-172.1369\\-37\\30.83465\\-173.6369\\-37\\31.33465\\-174.1369\\-37\\31.33465\\-175.6369\\-37\\31.83465\\-176.6369\\-37\\31.83465\\-180.6369\\-37\\31.77518\\-181.6369\\-37\\31.33465\\-182.1369\\-37\\31.27518\\-184.6369\\-37\\30.83465\\-185.1369\\-37\\30.77518\\-186.6369\\-37\\30.33465\\-187.1369\\-37\\30.33465\\-187.6369\\-37\\29.83465\\-188.1369\\-37\\29.77518\\-189.1369\\-37\\29.33465\\-189.6369\\-37\\29.33465\\-190.1369\\-37\\28.83465\\-190.6369\\-37\\28.83465\\-191.1369\\-37\\28.33465\\-191.6369\\-37\\28.27518\\-192.1369\\-37\\27.33465\\-193.1369\\-37\\27.27518\\-193.6369\\-37\\25.33465\\-195.6369\\-37\\25.27518\\-196.1369\\-37\\23.08465\\-198.3274\\-37\\22.58465\\-198.3869\\-37\\21.08465\\-199.8274\\-37\\19.58465\\-200.3869\\-37\\18.58465\\-201.3274\\-37\\17.58465\\-201.8274\\-37\\16.58465\\-201.8869\\-37\\16.08465\\-202.3274\\-37\\15.08465\\-202.3869\\-37\\14.58465\\-202.8274\\-37\\13.58465\\-202.8869\\-37\\13.08465\\-203.3274\\-37\\11.58465\\-203.3869\\-37\\11.08465\\-203.8274\\-37\\9.584647\\-203.8869\\-37\\-8.915353\\-203.8869\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "128" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.415353\\-204.8274\\-35\\-7.915353\\-204.3869\\-35\\-10.41535\\-204.3274\\-35\\-10.91535\\-203.8869\\-35\\-12.41535\\-203.8274\\-35\\-12.91535\\-203.3869\\-35\\-13.91535\\-203.3274\\-35\\-14.41535\\-202.8869\\-35\\-15.41535\\-202.8274\\-35\\-16.91535\\-201.8869\\-35\\-18.41535\\-201.3274\\-35\\-19.41535\\-200.3869\\-35\\-20.41535\\-199.8869\\-35\\-25.66535\\-194.6369\\-35\\-26.16535\\-193.6369\\-35\\-27.10589\\-192.6369\\-35\\-27.16535\\-192.1369\\-35\\-27.66535\\-191.6369\\-35\\-27.66535\\-191.1369\\-35\\-28.16535\\-190.6369\\-35\\-28.16535\\-190.1369\\-35\\-28.66535\\-189.6369\\-35\\-28.66535\\-188.6369\\-35\\-29.16535\\-188.1369\\-35\\-29.16535\\-187.6369\\-35\\-29.66535\\-187.1369\\-35\\-29.66535\\-185.6369\\-35\\-30.16535\\-185.1369\\-35\\-30.16535\\-183.6369\\-35\\-30.66535\\-182.6369\\-35\\-30.66535\\-175.1369\\-35\\-30.16535\\-174.1369\\-35\\-30.16535\\-173.1369\\-35\\-29.66535\\-172.6369\\-35\\-29.66535\\-171.6369\\-35\\-29.16535\\-171.1369\\-35\\-29.16535\\-170.1369\\-35\\-28.66535\\-169.6369\\-35\\-28.66535\\-169.1369\\-35\\-28.16535\\-168.6369\\-35\\-28.16535\\-168.1369\\-35\\-27.16535\\-167.1369\\-35\\-26.66535\\-166.1369\\-35\\-23.41535\\-162.8869\\-35\\-22.91535\\-162.8869\\-35\\-21.91535\\-161.8869\\-35\\-21.41535\\-161.8869\\-35\\-20.91535\\-161.3869\\-35\\-20.41535\\-161.3869\\-35\\-19.91535\\-160.8869\\-35\\-19.41535\\-160.8869\\-35\\-18.91535\\-160.3869\\-35\\-18.41535\\-160.3869\\-35\\-17.91535\\-159.8869\\-35\\-16.91535\\-159.8869\\-35\\-16.41535\\-159.3869\\-35\\-14.91535\\-159.3869\\-35\\-14.41535\\-158.8869\\-35\\-12.41535\\-158.8869\\-35\\-11.91535\\-158.3869\\-35\\-8.415353\\-158.3869\\-35\\-7.915353\\-157.8869\\-35\\8.084647\\-157.8869\\-35\\8.584647\\-158.3869\\-35\\12.08465\\-158.3869\\-35\\12.58465\\-158.8869\\-35\\14.58465\\-158.8869\\-35\\15.08465\\-159.3869\\-35\\16.58465\\-159.3869\\-35\\17.08465\\-159.8869\\-35\\18.58465\\-159.8869\\-35\\19.08465\\-160.3869\\-35\\19.58465\\-160.3869\\-35\\20.08465\\-160.8869\\-35\\20.58465\\-160.8869\\-35\\21.08465\\-161.3869\\-35\\21.58465\\-161.3869\\-35\\22.08465\\-161.8869\\-35\\22.58465\\-161.8869\\-35\\23.08465\\-162.3869\\-35\\23.58465\\-162.3869\\-35\\25.08465\\-163.8869\\-35\\25.58465\\-163.8869\\-35\\27.77518\\-166.1369\\-35\\27.83465\\-166.6369\\-35\\28.83465\\-167.6369\\-35\\28.83465\\-168.1369\\-35\\29.83465\\-169.1369\\-35\\29.83465\\-169.6369\\-35\\30.27518\\-170.1369\\-35\\30.33465\\-171.1369\\-35\\30.83465\\-171.6369\\-35\\30.83465\\-172.6369\\-35\\31.33465\\-173.1369\\-35\\31.33465\\-174.1369\\-35\\31.83465\\-175.1369\\-35\\31.83465\\-182.6369\\-35\\31.33465\\-183.6369\\-35\\31.33465\\-185.1369\\-35\\30.83465\\-185.6369\\-35\\30.83465\\-187.1369\\-35\\30.33465\\-187.6369\\-35\\30.27518\\-188.6369\\-35\\29.83465\\-189.1369\\-35\\29.83465\\-189.6369\\-35\\29.33465\\-190.1369\\-35\\29.33465\\-190.6369\\-35\\28.83465\\-191.1369\\-35\\28.83465\\-191.6369\\-35\\28.33465\\-192.1369\\-35\\28.27518\\-192.6369\\-35\\27.33465\\-193.6369\\-35\\26.83465\\-194.6369\\-35\\21.58465\\-199.8869\\-35\\20.58465\\-200.3869\\-35\\20.08465\\-200.8869\\-35\\19.58465\\-200.8869\\-35\\18.58465\\-201.8274\\-35\\17.08465\\-202.3869\\-35\\16.58465\\-202.8274\\-35\\15.58465\\-202.8869\\-35\\15.08465\\-203.3274\\-35\\14.08465\\-203.3869\\-35\\13.58465\\-203.8274\\-35\\12.08465\\-203.8869\\-35\\11.58465\\-204.3274\\-35\\9.084647\\-204.3869\\-35\\8.584647\\-204.8274\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "151" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.415353\\-205.3274\\-33\\-7.915353\\-204.8869\\-33\\-10.41535\\-204.8274\\-33\\-10.91535\\-204.3869\\-33\\-12.41535\\-204.3274\\-33\\-12.91535\\-203.8869\\-33\\-13.91535\\-203.8274\\-33\\-14.41535\\-203.3869\\-33\\-14.91535\\-203.3869\\-33\\-15.41535\\-202.8869\\-33\\-15.91535\\-202.8869\\-33\\-16.41535\\-202.3869\\-33\\-16.91535\\-202.3869\\-33\\-17.41535\\-201.8869\\-33\\-17.91535\\-201.8869\\-33\\-18.41535\\-201.3869\\-33\\-18.91535\\-201.3274\\-33\\-20.91535\\-199.3869\\-33\\-21.41535\\-199.3869\\-33\\-24.10589\\-196.6369\\-33\\-24.16535\\-196.1369\\-33\\-26.16535\\-194.1369\\-33\\-26.16535\\-193.6369\\-33\\-27.16535\\-192.6369\\-33\\-27.16535\\-192.1369\\-33\\-27.66535\\-191.6369\\-33\\-27.66535\\-191.1369\\-33\\-28.16535\\-190.6369\\-33\\-28.16535\\-190.1369\\-33\\-28.66535\\-189.6369\\-33\\-28.66535\\-189.1369\\-33\\-29.16535\\-188.6369\\-33\\-29.16535\\-187.6369\\-33\\-29.66535\\-187.1369\\-33\\-29.66535\\-185.6369\\-33\\-30.16535\\-185.1369\\-33\\-30.16535\\-183.6369\\-33\\-30.66535\\-183.1369\\-33\\-30.66535\\-179.6369\\-33\\-31.16535\\-179.1369\\-33\\-31.16535\\-178.6369\\-33\\-30.66535\\-178.1369\\-33\\-30.66535\\-174.6369\\-33\\-30.16535\\-174.1369\\-33\\-30.16535\\-173.1369\\-33\\-29.66535\\-172.6369\\-33\\-29.66535\\-171.6369\\-33\\-29.16535\\-171.1369\\-33\\-29.16535\\-170.1369\\-33\\-28.66535\\-169.6369\\-33\\-28.66535\\-169.1369\\-33\\-28.16535\\-168.6369\\-33\\-28.16535\\-168.1369\\-33\\-27.16535\\-167.1369\\-33\\-27.16535\\-166.6369\\-33\\-23.41535\\-162.8869\\-33\\-22.91535\\-162.8869\\-33\\-21.91535\\-161.8869\\-33\\-21.41535\\-161.8869\\-33\\-20.91535\\-161.3869\\-33\\-20.41535\\-161.3869\\-33\\-19.91535\\-160.8869\\-33\\-19.41535\\-160.8869\\-33\\-18.91535\\-160.3869\\-33\\-18.41535\\-160.3869\\-33\\-17.91535\\-159.8869\\-33\\-16.91535\\-159.8869\\-33\\-16.41535\\-159.3869\\-33\\-14.91535\\-159.3869\\-33\\-14.41535\\-158.8869\\-33\\-11.91535\\-158.8274\\-33\\-11.41535\\-158.3869\\-33\\-7.415353\\-158.3869\\-33\\-6.415353\\-157.8869\\-33\\5.084647\\-157.8869\\-33\\5.584647\\-158.3274\\-33\\6.584647\\-158.3869\\-33\\11.58465\\-158.3869\\-33\\12.08465\\-158.8869\\-33\\14.58465\\-158.8869\\-33\\15.08465\\-159.3869\\-33\\16.58465\\-159.3869\\-33\\17.08465\\-159.8869\\-33\\18.58465\\-159.8869\\-33\\19.08465\\-160.3869\\-33\\19.58465\\-160.3869\\-33\\20.08465\\-160.8869\\-33\\20.58465\\-160.8869\\-33\\21.08465\\-161.3869\\-33\\21.58465\\-161.3869\\-33\\22.08465\\-161.8869\\-33\\22.58465\\-161.8869\\-33\\23.08465\\-162.3869\\-33\\23.58465\\-162.3869\\-33\\25.08465\\-163.8869\\-33\\25.58465\\-163.8869\\-33\\27.83465\\-166.1369\\-33\\27.83465\\-166.6369\\-33\\28.83465\\-167.6369\\-33\\28.89411\\-168.1369\\-33\\29.83465\\-169.1369\\-33\\29.83465\\-169.6369\\-33\\30.33465\\-170.1369\\-33\\30.33465\\-171.1369\\-33\\30.83465\\-171.6369\\-33\\30.83465\\-172.6369\\-33\\31.33465\\-173.1369\\-33\\31.33465\\-174.1369\\-33\\31.83465\\-174.6369\\-33\\31.83465\\-177.6369\\-33\\32.33465\\-178.1369\\-33\\32.33465\\-179.1369\\-33\\31.83465\\-179.6369\\-33\\31.83465\\-183.1369\\-33\\31.33465\\-183.6369\\-33\\31.33465\\-185.1369\\-33\\30.83465\\-185.6369\\-33\\30.83465\\-187.1369\\-33\\30.33465\\-187.6369\\-33\\30.33465\\-188.6369\\-33\\29.83465\\-189.1369\\-33\\29.83465\\-189.6369\\-33\\29.33465\\-190.1369\\-33\\29.33465\\-190.6369\\-33\\28.83465\\-191.1369\\-33\\28.83465\\-191.6369\\-33\\28.33465\\-192.1369\\-33\\28.33465\\-192.6369\\-33\\27.33465\\-193.6369\\-33\\27.33465\\-194.1369\\-33\\25.83465\\-195.6369\\-33\\25.77518\\-196.1369\\-33\\22.58465\\-199.3869\\-33\\22.08465\\-199.3869\\-33\\20.08465\\-201.3274\\-33\\19.58465\\-201.3869\\-33\\19.08465\\-201.8869\\-33\\18.58465\\-201.8869\\-33\\18.08465\\-202.3869\\-33\\17.58465\\-202.3869\\-33\\17.08465\\-202.8869\\-33\\16.58465\\-202.8869\\-33\\16.08465\\-203.3869\\-33\\15.58465\\-203.3869\\-33\\15.08465\\-203.8274\\-33\\14.08465\\-203.8869\\-33\\13.58465\\-204.3274\\-33\\12.08465\\-204.3869\\-33\\11.58465\\-204.8274\\-33\\9.084647\\-204.8869\\-33\\8.584647\\-205.3274\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "135" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.415353\\-205.8274\\-31\\-6.915353\\-205.3869\\-31\\-9.915353\\-205.3274\\-31\\-10.41535\\-204.8869\\-31\\-11.91535\\-204.8274\\-31\\-12.41535\\-204.3869\\-31\\-13.41535\\-204.3869\\-31\\-13.91535\\-203.8869\\-31\\-14.41535\\-203.8869\\-31\\-14.91535\\-203.3869\\-31\\-15.41535\\-203.3869\\-31\\-15.91535\\-202.8869\\-31\\-16.41535\\-202.8869\\-31\\-16.91535\\-202.3869\\-31\\-17.41535\\-202.3869\\-31\\-18.41535\\-201.3869\\-31\\-18.91535\\-201.3869\\-31\\-20.91535\\-199.3869\\-31\\-21.41535\\-199.3869\\-31\\-24.16535\\-196.6369\\-31\\-24.16535\\-196.1369\\-31\\-26.16535\\-194.1369\\-31\\-26.16535\\-193.6369\\-31\\-27.16535\\-192.6369\\-31\\-27.16535\\-192.1369\\-31\\-27.66535\\-191.6369\\-31\\-27.66535\\-191.1369\\-31\\-28.16535\\-190.6369\\-31\\-28.16535\\-190.1369\\-31\\-28.66535\\-189.6369\\-31\\-28.72482\\-188.6369\\-31\\-29.16535\\-188.1369\\-31\\-29.16535\\-187.6369\\-31\\-29.66535\\-187.1369\\-31\\-29.66535\\-185.6369\\-31\\-30.16535\\-185.1369\\-31\\-30.22482\\-183.1369\\-31\\-30.66535\\-182.6369\\-31\\-30.66535\\-175.1369\\-31\\-30.16535\\-174.6369\\-31\\-30.16535\\-173.6369\\-31\\-29.72482\\-173.1369\\-31\\-29.66535\\-171.6369\\-31\\-29.16535\\-171.1369\\-31\\-29.16535\\-170.6369\\-31\\-28.16535\\-168.6369\\-31\\-27.66535\\-168.1369\\-31\\-27.66535\\-167.6369\\-31\\-26.22482\\-166.1369\\-31\\-26.16535\\-165.6369\\-31\\-23.91535\\-163.3869\\-31\\-23.41535\\-163.3869\\-31\\-22.41535\\-162.3869\\-31\\-21.91535\\-162.3274\\-31\\-20.91535\\-161.3869\\-31\\-20.41535\\-161.3869\\-31\\-19.91535\\-160.8869\\-31\\-19.41535\\-160.8869\\-31\\-18.91535\\-160.3869\\-31\\-17.91535\\-160.3869\\-31\\-17.41535\\-159.8869\\-31\\-16.41535\\-159.8274\\-31\\-15.91535\\-159.3869\\-31\\-14.41535\\-159.3869\\-31\\-13.91535\\-158.8869\\-31\\-10.91535\\-158.8274\\-31\\-10.41535\\-158.3869\\-31\\10.58465\\-158.3869\\-31\\11.08465\\-158.8869\\-31\\14.08465\\-158.8869\\-31\\14.58465\\-159.3869\\-31\\16.58465\\-159.3869\\-31\\17.08465\\-159.8869\\-31\\18.08465\\-159.8869\\-31\\18.58465\\-160.3869\\-31\\19.58465\\-160.3869\\-31\\20.08465\\-160.8869\\-31\\20.58465\\-160.8869\\-31\\21.08465\\-161.3869\\-31\\21.58465\\-161.3869\\-31\\22.08465\\-161.8869\\-31\\22.58465\\-161.8869\\-31\\23.58465\\-162.8869\\-31\\24.08465\\-162.8869\\-31\\28.83465\\-167.6369\\-31\\28.83465\\-168.1369\\-31\\29.33465\\-168.6369\\-31\\29.33465\\-169.1369\\-31\\29.83465\\-169.6369\\-31\\29.83465\\-170.1369\\-31\\30.33465\\-170.6369\\-31\\30.33465\\-171.1369\\-31\\30.83465\\-171.6369\\-31\\30.89411\\-173.1369\\-31\\31.33465\\-173.6369\\-31\\31.33465\\-174.6369\\-31\\31.83465\\-175.1369\\-31\\31.83465\\-182.6369\\-31\\31.39411\\-183.1369\\-31\\31.33465\\-185.1369\\-31\\30.83465\\-185.6369\\-31\\30.83465\\-187.1369\\-31\\30.33465\\-187.6369\\-31\\30.33465\\-188.6369\\-31\\29.83465\\-189.1369\\-31\\29.83465\\-189.6369\\-31\\29.33465\\-190.1369\\-31\\29.33465\\-190.6369\\-31\\28.83465\\-191.1369\\-31\\28.83465\\-191.6369\\-31\\28.33465\\-192.1369\\-31\\28.33465\\-192.6369\\-31\\27.33465\\-193.6369\\-31\\27.33465\\-194.1369\\-31\\25.83465\\-195.6369\\-31\\25.83465\\-196.1369\\-31\\22.08465\\-199.8869\\-31\\21.58465\\-199.8869\\-31\\19.58465\\-201.8869\\-31\\19.08465\\-201.8869\\-31\\18.58465\\-202.3869\\-31\\18.08465\\-202.3869\\-31\\17.58465\\-202.8869\\-31\\17.08465\\-202.8869\\-31\\16.58465\\-203.3869\\-31\\16.08465\\-203.3869\\-31\\15.58465\\-203.8869\\-31\\15.08465\\-203.8869\\-31\\14.58465\\-204.3274\\-31\\13.58465\\-204.3869\\-31\\13.08465\\-204.8274\\-31\\11.58465\\-204.8869\\-31\\11.08465\\-205.3274\\-31\\8.084647\\-205.3869\\-31\\7.584647\\-205.8274\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.415353\\-205.8869\\-29\\-8.915353\\-205.3869\\-29\\-10.41535\\-205.3869\\-29\\-10.91535\\-204.8869\\-29\\-12.41535\\-204.8869\\-29\\-12.91535\\-204.3869\\-29\\-13.41535\\-204.3869\\-29\\-13.91535\\-203.8869\\-29\\-14.41535\\-203.8869\\-29\\-14.91535\\-203.3869\\-29\\-15.41535\\-203.3869\\-29\\-15.91535\\-202.8869\\-29\\-16.41535\\-202.8869\\-29\\-16.91535\\-202.3869\\-29\\-17.41535\\-202.3869\\-29\\-18.41535\\-201.3869\\-29\\-18.91535\\-201.3869\\-29\\-21.41535\\-198.9464\\-29\\-21.91535\\-198.8869\\-29\\-23.16535\\-197.6369\\-29\\-23.22482\\-197.1369\\-29\\-25.66535\\-194.6369\\-29\\-25.66535\\-194.1369\\-29\\-26.66535\\-193.1369\\-29\\-26.66535\\-192.6369\\-29\\-27.16535\\-192.1369\\-29\\-27.16535\\-191.6369\\-29\\-27.66535\\-191.1369\\-29\\-27.66535\\-190.6369\\-29\\-28.16535\\-190.1369\\-29\\-28.16535\\-189.6369\\-29\\-28.66535\\-189.1369\\-29\\-28.72482\\-188.1369\\-29\\-29.16535\\-187.6369\\-29\\-29.22482\\-186.6369\\-29\\-29.66535\\-186.1369\\-29\\-29.72482\\-184.6369\\-29\\-30.16535\\-184.1369\\-29\\-30.22482\\-180.6369\\-29\\-30.66535\\-180.1369\\-29\\-30.66535\\-178.1369\\-29\\-30.22482\\-177.6369\\-29\\-30.16535\\-174.6369\\-29\\-29.72482\\-174.1369\\-29\\-29.66535\\-172.6369\\-29\\-29.16535\\-172.1369\\-29\\-29.16535\\-171.1369\\-29\\-28.66535\\-170.6369\\-29\\-28.66535\\-170.1369\\-29\\-28.16535\\-169.1369\\-29\\-27.66535\\-168.6369\\-29\\-27.66535\\-168.1369\\-29\\-26.22482\\-166.6369\\-29\\-26.16535\\-166.1369\\-29\\-23.41535\\-163.3869\\-29\\-22.91535\\-163.3274\\-29\\-21.91535\\-162.3869\\-29\\-21.41535\\-162.3274\\-29\\-20.41535\\-161.3869\\-29\\-19.91535\\-161.3869\\-29\\-19.41535\\-160.8869\\-29\\-18.41535\\-160.8274\\-29\\-16.91535\\-159.8869\\-29\\-15.91535\\-159.8869\\-29\\-15.41535\\-159.3869\\-29\\-12.91535\\-159.3274\\-29\\-12.41535\\-158.8869\\-29\\-8.415353\\-158.8274\\-29\\-7.915353\\-158.3869\\-29\\7.584647\\-158.3869\\-29\\8.084647\\-158.8274\\-29\\9.084647\\-158.8869\\-29\\12.58465\\-158.8869\\-29\\13.08465\\-159.3274\\-29\\15.58465\\-159.3869\\-29\\16.08465\\-159.8274\\-29\\17.58465\\-159.8869\\-29\\18.08465\\-160.3869\\-29\\19.08465\\-160.3869\\-29\\19.58465\\-160.8869\\-29\\20.08465\\-160.8869\\-29\\20.58465\\-161.3869\\-29\\21.08465\\-161.3869\\-29\\21.58465\\-161.8869\\-29\\22.08465\\-161.8869\\-29\\23.08465\\-162.8274\\-29\\23.58465\\-162.8869\\-29\\25.08465\\-164.3274\\-29\\25.58465\\-164.3869\\-29\\26.83465\\-165.6369\\-29\\26.89411\\-166.1369\\-29\\28.33465\\-167.6369\\-29\\28.39411\\-168.1369\\-29\\29.33465\\-169.1369\\-29\\29.33465\\-169.6369\\-29\\29.83465\\-170.1369\\-29\\29.89411\\-171.1369\\-29\\30.33465\\-171.6369\\-29\\30.33465\\-172.1369\\-29\\30.83465\\-172.6369\\-29\\30.89411\\-174.1369\\-29\\31.33465\\-174.6369\\-29\\31.39411\\-177.1369\\-29\\31.83465\\-177.6369\\-29\\31.83465\\-180.1369\\-29\\31.39411\\-180.6369\\-29\\31.33465\\-184.1369\\-29\\30.89411\\-184.6369\\-29\\30.83465\\-186.1369\\-29\\30.39411\\-186.6369\\-29\\30.33465\\-188.1369\\-29\\29.83465\\-188.6369\\-29\\29.83465\\-189.1369\\-29\\29.33465\\-189.6369\\-29\\29.33465\\-190.1369\\-29\\28.83465\\-190.6369\\-29\\28.83465\\-191.1369\\-29\\28.33465\\-191.6369\\-29\\28.33465\\-192.1369\\-29\\27.83465\\-192.6369\\-29\\27.83465\\-193.1369\\-29\\26.89411\\-194.1369\\-29\\26.83465\\-194.6369\\-29\\25.39411\\-196.1369\\-29\\25.33465\\-196.6369\\-29\\22.08465\\-199.8869\\-29\\21.58465\\-199.8869\\-29\\19.58465\\-201.8869\\-29\\19.08465\\-201.8869\\-29\\18.58465\\-202.3869\\-29\\18.08465\\-202.3869\\-29\\17.58465\\-202.8869\\-29\\17.08465\\-202.8869\\-29\\16.58465\\-203.3869\\-29\\16.08465\\-203.3869\\-29\\15.58465\\-203.8869\\-29\\15.08465\\-203.8869\\-29\\14.58465\\-204.3869\\-29\\14.08465\\-204.3869\\-29\\13.58465\\-204.8869\\-29\\12.08465\\-204.8869\\-29\\11.58465\\-205.3869\\-29\\10.08465\\-205.3869\\-29\\9.584647\\-205.8869\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "128" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.415353\\-206.3869\\-27\\-5.915353\\-205.8869\\-27\\-8.415353\\-205.8869\\-27\\-8.915353\\-205.3869\\-27\\-10.41535\\-205.3869\\-27\\-10.91535\\-204.8869\\-27\\-12.41535\\-204.8869\\-27\\-12.91535\\-204.3869\\-27\\-13.41535\\-204.3869\\-27\\-13.91535\\-203.8869\\-27\\-14.41535\\-203.8869\\-27\\-14.91535\\-203.3869\\-27\\-15.41535\\-203.3869\\-27\\-15.91535\\-202.8869\\-27\\-16.41535\\-202.8869\\-27\\-16.91535\\-202.3869\\-27\\-17.41535\\-202.3869\\-27\\-18.91535\\-200.9464\\-27\\-19.41535\\-200.8869\\-27\\-24.16535\\-196.1369\\-27\\-24.22482\\-195.6369\\-27\\-25.66535\\-194.1369\\-27\\-26.22482\\-192.6369\\-27\\-27.16535\\-191.6369\\-27\\-27.16535\\-191.1369\\-27\\-27.66535\\-190.6369\\-27\\-27.72482\\-189.6369\\-27\\-28.66535\\-188.1369\\-27\\-28.72482\\-187.1369\\-27\\-29.16535\\-186.6369\\-27\\-29.22482\\-185.1369\\-27\\-29.66535\\-184.6369\\-27\\-29.72482\\-181.6369\\-27\\-30.16535\\-181.1369\\-27\\-30.16535\\-177.6369\\-27\\-29.72482\\-177.1369\\-27\\-29.66535\\-174.1369\\-27\\-29.22482\\-173.6369\\-27\\-29.16535\\-172.6369\\-27\\-28.72482\\-172.1369\\-27\\-28.66535\\-171.1369\\-27\\-27.72482\\-169.6369\\-27\\-27.66535\\-169.1369\\-27\\-26.72482\\-168.1369\\-27\\-26.66535\\-167.6369\\-27\\-25.72482\\-166.6369\\-27\\-25.66535\\-166.1369\\-27\\-23.41535\\-163.8869\\-27\\-22.91535\\-163.8274\\-27\\-21.91535\\-162.8869\\-27\\-21.41535\\-162.8274\\-27\\-20.41535\\-161.8869\\-27\\-19.91535\\-161.8869\\-27\\-19.41535\\-161.3869\\-27\\-18.91535\\-161.3869\\-27\\-18.41535\\-160.8869\\-27\\-17.91535\\-160.8869\\-27\\-17.41535\\-160.3869\\-27\\-16.41535\\-160.3869\\-27\\-15.91535\\-159.8869\\-27\\-14.41535\\-159.8274\\-27\\-13.91535\\-159.3869\\-27\\-10.91535\\-159.3274\\-27\\-10.41535\\-158.8869\\-27\\10.08465\\-158.8869\\-27\\10.58465\\-159.3274\\-27\\14.08465\\-159.3869\\-27\\14.58465\\-159.8274\\-27\\16.08465\\-159.8869\\-27\\16.58465\\-160.3274\\-27\\18.08465\\-160.3869\\-27\\18.58465\\-160.8869\\-27\\19.08465\\-160.8869\\-27\\22.08465\\-162.3869\\-27\\23.08465\\-163.3274\\-27\\23.58465\\-163.3869\\-27\\24.39411\\-164.1369\\-27\\27.83465\\-167.6369\\-27\\27.89411\\-168.1369\\-27\\28.83465\\-169.1369\\-27\\28.83465\\-169.6369\\-27\\29.33465\\-170.1369\\-27\\29.33465\\-170.6369\\-27\\29.83465\\-171.1369\\-27\\29.89411\\-172.1369\\-27\\30.33465\\-172.6369\\-27\\30.39411\\-173.6369\\-27\\30.83465\\-174.1369\\-27\\30.89411\\-176.6369\\-27\\31.33465\\-177.1369\\-27\\31.33465\\-181.1369\\-27\\30.89411\\-181.6369\\-27\\30.83465\\-184.6369\\-27\\30.39411\\-185.1369\\-27\\30.33465\\-186.6369\\-27\\29.89411\\-187.1369\\-27\\29.83465\\-188.1369\\-27\\29.39411\\-188.6369\\-27\\29.33465\\-189.6369\\-27\\28.83465\\-190.1369\\-27\\28.83465\\-190.6369\\-27\\28.33465\\-191.1369\\-27\\28.33465\\-191.6369\\-27\\27.83465\\-192.1369\\-27\\27.83465\\-192.6369\\-27\\26.89411\\-193.6369\\-27\\26.83465\\-194.1369\\-27\\25.89411\\-195.1369\\-27\\25.83465\\-195.6369\\-27\\20.08465\\-201.3869\\-27\\19.58465\\-201.3869\\-27\\18.58465\\-202.3869\\-27\\18.08465\\-202.3869\\-27\\17.58465\\-202.8869\\-27\\17.08465\\-202.8869\\-27\\16.58465\\-203.3869\\-27\\16.08465\\-203.3869\\-27\\15.58465\\-203.8869\\-27\\15.08465\\-203.8869\\-27\\14.58465\\-204.3869\\-27\\14.08465\\-204.3869\\-27\\13.58465\\-204.8869\\-27\\12.58465\\-204.8869\\-27\\12.08465\\-205.3869\\-27\\10.58465\\-205.3869\\-27\\10.08465\\-205.8869\\-27\\7.584647\\-205.8869\\-27\\7.084647\\-206.3869\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "120" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.915353\\-205.8869\\-25\\-8.415353\\-205.3869\\-25\\-10.41535\\-205.3869\\-25\\-10.91535\\-204.8869\\-25\\-11.91535\\-204.8869\\-25\\-12.41535\\-204.3869\\-25\\-12.91535\\-204.3869\\-25\\-14.41535\\-203.4464\\-25\\-15.91535\\-202.8869\\-25\\-16.41535\\-202.3869\\-25\\-16.91535\\-202.3869\\-25\\-18.41535\\-200.9464\\-25\\-18.91535\\-200.8869\\-25\\-22.41535\\-197.4464\\-25\\-23.66535\\-196.1369\\-25\\-23.72482\\-195.6369\\-25\\-24.66535\\-194.6369\\-25\\-24.72482\\-194.1369\\-25\\-25.66535\\-193.1369\\-25\\-26.22482\\-191.6369\\-25\\-26.66535\\-191.1369\\-25\\-27.22482\\-189.6369\\-25\\-27.66535\\-189.1369\\-25\\-27.72482\\-188.1369\\-25\\-28.16535\\-187.6369\\-25\\-28.22482\\-186.6369\\-25\\-28.66535\\-186.1369\\-25\\-28.72482\\-185.1369\\-25\\-29.16535\\-184.6369\\-25\\-29.22482\\-181.1369\\-25\\-29.66535\\-180.6369\\-25\\-29.66535\\-178.1369\\-25\\-29.22482\\-177.6369\\-25\\-29.16535\\-174.6369\\-25\\-28.72482\\-174.1369\\-25\\-28.66535\\-172.6369\\-25\\-27.66535\\-170.6369\\-25\\-27.22482\\-170.1369\\-25\\-26.66535\\-168.6369\\-25\\-25.72482\\-167.6369\\-25\\-25.66535\\-167.1369\\-25\\-23.22482\\-164.6369\\-25\\-22.41535\\-163.8869\\-25\\-21.91535\\-163.8274\\-25\\-20.91535\\-162.8869\\-25\\-20.41535\\-162.8274\\-25\\-19.41535\\-161.8869\\-25\\-18.91535\\-161.8869\\-25\\-18.41535\\-161.3869\\-25\\-17.41535\\-161.3274\\-25\\-15.91535\\-160.3869\\-25\\-14.41535\\-160.3274\\-25\\-13.91535\\-159.8869\\-25\\-11.91535\\-159.8274\\-25\\-11.41535\\-159.3869\\-25\\11.58465\\-159.3869\\-25\\12.08465\\-159.8274\\-25\\14.58465\\-159.8869\\-25\\15.08465\\-160.3274\\-25\\16.58465\\-160.3869\\-25\\17.08465\\-160.8869\\-25\\17.58465\\-160.8869\\-25\\18.08465\\-161.3274\\-25\\19.08465\\-161.3869\\-25\\19.58465\\-161.8869\\-25\\20.08465\\-161.8869\\-25\\21.08465\\-162.3869\\-25\\22.08465\\-163.3274\\-25\\22.58465\\-163.3869\\-25\\23.58465\\-164.3274\\-25\\24.08465\\-164.3869\\-25\\26.33465\\-166.6369\\-25\\26.39411\\-167.1369\\-25\\27.83465\\-168.6369\\-25\\29.33465\\-171.6369\\-25\\29.39411\\-172.6369\\-25\\29.83465\\-173.1369\\-25\\29.89411\\-174.1369\\-25\\30.33465\\-174.6369\\-25\\30.39411\\-177.6369\\-25\\30.83465\\-178.1369\\-25\\30.83465\\-181.1369\\-25\\30.39411\\-181.6369\\-25\\30.33465\\-184.6369\\-25\\29.89411\\-185.1369\\-25\\29.83465\\-186.6369\\-25\\29.39411\\-187.1369\\-25\\29.33465\\-188.1369\\-25\\28.83465\\-188.6369\\-25\\28.83465\\-189.1369\\-25\\28.39411\\-189.6369\\-25\\28.33465\\-190.6369\\-25\\27.83465\\-191.1369\\-25\\27.83465\\-191.6369\\-25\\26.89411\\-192.6369\\-25\\26.33465\\-194.1369\\-25\\25.39411\\-195.1369\\-25\\25.33465\\-195.6369\\-25\\23.39411\\-197.6369\\-25\\23.33465\\-198.1369\\-25\\22.08465\\-199.3869\\-25\\21.58465\\-199.4464\\-25\\19.58465\\-201.3869\\-25\\19.08465\\-201.4464\\-25\\18.08465\\-202.3869\\-25\\17.58465\\-202.4464\\-25\\16.58465\\-203.3869\\-25\\16.08465\\-203.3869\\-25\\15.58465\\-203.8869\\-25\\15.08465\\-203.8869\\-25\\14.58465\\-204.3869\\-25\\13.58465\\-204.4464\\-25\\13.08465\\-204.8869\\-25\\12.08465\\-204.8869\\-25\\11.58465\\-205.3869\\-25\\9.584647\\-205.4464\\-25\\9.084647\\-205.8869\\-25\\5.584647\\-205.8869\\-25\\5.084647\\-205.9464\\-25\\-4.915353\\-205.9464\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "103" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.915353\\-205.3869\\-23\\-9.415353\\-204.9464\\-23\\-10.91535\\-204.8869\\-23\\-11.41535\\-204.3869\\-23\\-11.91535\\-204.3869\\-23\\-13.41535\\-203.4464\\-23\\-14.41535\\-203.3869\\-23\\-15.41535\\-202.4464\\-23\\-15.91535\\-202.3869\\-23\\-16.91535\\-201.4464\\-23\\-17.41535\\-201.3869\\-23\\-18.41535\\-200.4464\\-23\\-18.91535\\-200.3869\\-23\\-22.16535\\-197.1369\\-23\\-22.22482\\-196.6369\\-23\\-23.66535\\-195.1369\\-23\\-23.72482\\-194.6369\\-23\\-24.66535\\-193.6369\\-23\\-25.22482\\-192.1369\\-23\\-26.16535\\-191.1369\\-23\\-26.22482\\-190.1369\\-23\\-27.16535\\-188.6369\\-23\\-27.22482\\-187.6369\\-23\\-27.66535\\-187.1369\\-23\\-27.72482\\-186.1369\\-23\\-28.16535\\-185.6369\\-23\\-28.22482\\-183.6369\\-23\\-28.66535\\-183.1369\\-23\\-28.66535\\-175.6369\\-23\\-28.22482\\-175.1369\\-23\\-28.16535\\-173.6369\\-23\\-27.72482\\-173.1369\\-23\\-27.66535\\-172.1369\\-23\\-26.22482\\-169.6369\\-23\\-26.16535\\-169.1369\\-23\\-25.22482\\-168.1369\\-23\\-25.16535\\-167.6369\\-23\\-24.41535\\-166.8274\\-23\\-21.41535\\-163.8869\\-23\\-20.91535\\-163.8274\\-23\\-19.91535\\-162.8869\\-23\\-19.41535\\-162.8274\\-23\\-16.91535\\-161.3869\\-23\\-15.91535\\-161.3274\\-23\\-15.41535\\-160.8869\\-23\\-14.41535\\-160.8274\\-23\\-13.91535\\-160.3869\\-23\\-11.91535\\-160.3274\\-23\\-11.41535\\-159.8869\\-23\\-7.915353\\-159.8274\\-23\\7.584647\\-159.8274\\-23\\8.084647\\-159.8869\\-23\\12.08465\\-159.8869\\-23\\12.58465\\-160.3274\\-23\\14.08465\\-160.3869\\-23\\14.58465\\-160.8274\\-23\\16.08465\\-160.8869\\-23\\16.58465\\-161.3274\\-23\\17.58465\\-161.3869\\-23\\21.58465\\-163.3869\\-23\\23.08465\\-164.8274\\-23\\23.58465\\-164.8869\\-23\\25.83465\\-167.1369\\-23\\25.89411\\-167.6369\\-23\\26.83465\\-168.6369\\-23\\27.39411\\-170.1369\\-23\\27.83465\\-170.6369\\-23\\28.39411\\-172.1369\\-23\\29.33465\\-173.6369\\-23\\29.39411\\-175.6369\\-23\\29.83465\\-176.1369\\-23\\29.83465\\-183.1369\\-23\\29.39411\\-183.6369\\-23\\29.33465\\-185.6369\\-23\\28.89411\\-186.1369\\-23\\28.83465\\-187.1369\\-23\\28.39411\\-187.6369\\-23\\28.33465\\-188.6369\\-23\\27.39411\\-190.1369\\-23\\27.33465\\-191.1369\\-23\\26.83465\\-192.1369\\-23\\25.89411\\-193.1369\\-23\\25.33465\\-194.6369\\-23\\23.89411\\-196.1369\\-23\\23.83465\\-196.6369\\-23\\22.58465\\-197.9464\\-23\\19.58465\\-200.8869\\-23\\19.08465\\-200.9464\\-23\\18.08465\\-201.8869\\-23\\17.58465\\-201.9464\\-23\\16.58465\\-202.8869\\-23\\16.08465\\-202.8869\\-23\\15.58465\\-203.3869\\-23\\15.08465\\-203.3869\\-23\\14.58465\\-203.8869\\-23\\14.08465\\-203.8869\\-23\\13.58465\\-204.3869\\-23\\12.58465\\-204.4464\\-23\\12.08465\\-204.8869\\-23\\10.58465\\-204.9464\\-23\\10.08465\\-205.3869\\-23\\7.084647\\-205.4464\\-23\\-5.915353\\-205.4464\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "99" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.415353\\-204.8869\\-21\\-8.915353\\-204.4464\\-21\\-10.41535\\-204.3869\\-21\\-10.91535\\-203.9464\\-21\\-11.91535\\-203.8869\\-21\\-12.41535\\-203.4464\\-21\\-14.91535\\-202.3869\\-21\\-15.91535\\-201.4464\\-21\\-16.41535\\-201.3869\\-21\\-18.41535\\-199.4464\\-21\\-18.91535\\-199.3869\\-21\\-21.16535\\-197.1369\\-21\\-21.22482\\-196.6369\\-21\\-22.66535\\-195.1369\\-21\\-22.72482\\-194.6369\\-21\\-23.66535\\-193.6369\\-21\\-24.22482\\-192.1369\\-21\\-25.16535\\-191.1369\\-21\\-25.66535\\-190.1369\\-21\\-25.72482\\-189.1369\\-21\\-26.16535\\-188.6369\\-21\\-26.22482\\-187.6369\\-21\\-26.66535\\-187.1369\\-21\\-26.72482\\-186.1369\\-21\\-27.16535\\-185.6369\\-21\\-27.22482\\-184.1369\\-21\\-27.66535\\-183.6369\\-21\\-27.72482\\-181.1369\\-21\\-27.72482\\-177.6369\\-21\\-27.66535\\-175.6369\\-21\\-27.22482\\-175.1369\\-21\\-27.16535\\-173.6369\\-21\\-26.22482\\-172.1369\\-21\\-26.16535\\-171.1369\\-21\\-25.66535\\-170.1369\\-21\\-24.72482\\-169.1369\\-21\\-24.66535\\-168.6369\\-21\\-23.72482\\-167.6369\\-21\\-23.66535\\-167.1369\\-21\\-22.41535\\-165.8869\\-21\\-21.91535\\-165.8274\\-21\\-19.91535\\-163.8869\\-21\\-19.41535\\-163.8274\\-21\\-17.91535\\-162.8869\\-21\\-15.91535\\-161.8869\\-21\\-14.91535\\-161.8274\\-21\\-14.41535\\-161.3869\\-21\\-13.41535\\-161.3274\\-21\\-12.91535\\-160.8869\\-21\\-10.91535\\-160.8274\\-21\\-10.41535\\-160.3869\\-21\\10.58465\\-160.3869\\-21\\11.08465\\-160.8274\\-21\\13.58465\\-160.8869\\-21\\14.08465\\-161.3274\\-21\\15.08465\\-161.3869\\-21\\15.58465\\-161.8274\\-21\\16.58465\\-161.8869\\-21\\17.08465\\-162.3274\\-21\\18.08465\\-162.3869\\-21\\19.58465\\-163.3274\\-21\\20.08465\\-163.3869\\-21\\21.08465\\-164.3274\\-21\\21.58465\\-164.3869\\-21\\25.58465\\-168.3274\\-21\\26.39411\\-170.1369\\-21\\27.83465\\-172.6369\\-21\\27.89411\\-173.6369\\-21\\28.33465\\-174.1369\\-21\\28.39411\\-175.1369\\-21\\28.83465\\-175.6369\\-21\\28.89411\\-177.6369\\-21\\28.89411\\-181.6369\\-21\\28.83465\\-183.6369\\-21\\28.39411\\-184.1369\\-21\\28.33465\\-185.6369\\-21\\27.89411\\-186.1369\\-21\\27.83465\\-187.6369\\-21\\26.89411\\-189.1369\\-21\\26.83465\\-190.1369\\-21\\25.33465\\-193.1369\\-21\\24.39411\\-194.1369\\-21\\24.33465\\-194.6369\\-21\\22.89411\\-196.1369\\-21\\22.83465\\-196.6369\\-21\\22.08465\\-197.4464\\-21\\19.08465\\-200.3869\\-21\\18.58465\\-200.4464\\-21\\17.08465\\-201.8869\\-21\\16.58465\\-201.9464\\-21\\15.08465\\-202.8869\\-21\\13.58465\\-203.4464\\-21\\13.08465\\-203.8869\\-21\\12.08465\\-203.9464\\-21\\11.58465\\-204.3869\\-21\\10.58465\\-204.4464\\-21\\10.08465\\-204.8869\\-21\\8.084647\\-204.9464\\-21\\-6.915353\\-204.9464\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "101" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.915353\\-204.3869\\-19\\-7.415353\\-203.9464\\-19\\-9.415353\\-203.8869\\-19\\-9.915353\\-203.4464\\-19\\-10.91535\\-203.3869\\-19\\-13.41535\\-201.9464\\-19\\-13.91535\\-201.8869\\-19\\-14.91535\\-200.9464\\-19\\-15.41535\\-200.8869\\-19\\-16.91535\\-199.4464\\-19\\-17.41535\\-199.3869\\-19\\-20.16535\\-196.6369\\-19\\-20.22482\\-196.1369\\-19\\-22.16535\\-194.1369\\-19\\-22.22482\\-193.6369\\-19\\-23.16535\\-192.6369\\-19\\-23.22482\\-192.1369\\-19\\-24.66535\\-189.6369\\-19\\-24.72482\\-188.6369\\-19\\-25.16535\\-188.1369\\-19\\-25.22482\\-187.1369\\-19\\-25.66535\\-186.6369\\-19\\-25.72482\\-185.6369\\-19\\-26.16535\\-185.1369\\-19\\-26.22482\\-183.1369\\-19\\-26.66535\\-182.6369\\-19\\-26.66535\\-176.6369\\-19\\-26.22482\\-176.1369\\-19\\-26.16535\\-174.6369\\-19\\-25.72482\\-174.1369\\-19\\-25.66535\\-173.1369\\-19\\-25.22482\\-172.6369\\-19\\-25.16535\\-171.6369\\-19\\-24.66535\\-170.6369\\-19\\-23.72482\\-169.6369\\-19\\-23.41535\\-168.8274\\-19\\-19.72482\\-165.1369\\-19\\-18.91535\\-164.8274\\-19\\-17.91535\\-163.8869\\-19\\-17.41535\\-163.8274\\-19\\-15.91535\\-162.8869\\-19\\-14.91535\\-162.8274\\-19\\-14.41535\\-162.3869\\-19\\-13.41535\\-162.3274\\-19\\-12.91535\\-161.8869\\-19\\-11.41535\\-161.8274\\-19\\-10.91535\\-161.3869\\-19\\-8.915353\\-161.3274\\-19\\10.08465\\-161.3274\\-19\\11.58465\\-161.3869\\-19\\12.08465\\-161.8274\\-19\\13.58465\\-161.8869\\-19\\14.08465\\-162.3274\\-19\\15.08465\\-162.3869\\-19\\15.58465\\-162.8274\\-19\\16.58465\\-162.8869\\-19\\18.08465\\-163.8274\\-19\\18.58465\\-163.8274\\-19\\19.08465\\-164.3274\\-19\\19.58465\\-164.3869\\-19\\20.58465\\-165.3274\\-19\\21.39411\\-165.6369\\-19\\24.08465\\-168.3274\\-19\\24.39411\\-169.1369\\-19\\25.39411\\-170.1369\\-19\\25.39411\\-170.6369\\-19\\25.89411\\-171.1369\\-19\\25.89411\\-171.6369\\-19\\26.39411\\-172.1369\\-19\\26.39411\\-172.6369\\-19\\26.83465\\-173.1369\\-19\\26.89411\\-174.1369\\-19\\27.33465\\-174.6369\\-19\\27.39411\\-176.1369\\-19\\27.83465\\-176.6369\\-19\\27.83465\\-182.6369\\-19\\27.39411\\-183.1369\\-19\\27.33465\\-185.1369\\-19\\26.89411\\-185.6369\\-19\\26.83465\\-187.1369\\-19\\26.39411\\-187.6369\\-19\\26.33465\\-188.6369\\-19\\25.33465\\-190.6369\\-19\\24.89411\\-191.1369\\-19\\24.89411\\-191.6369\\-19\\24.39411\\-192.1369\\-19\\23.83465\\-193.6369\\-19\\22.39411\\-195.1369\\-19\\22.08465\\-195.9464\\-19\\17.89411\\-200.1369\\-19\\17.08465\\-200.4464\\-19\\16.08465\\-201.3869\\-19\\15.58465\\-201.4464\\-19\\14.58465\\-202.3869\\-19\\13.58465\\-202.8869\\-19\\12.58465\\-202.9464\\-19\\12.08465\\-203.3869\\-19\\11.08465\\-203.4464\\-19\\10.58465\\-203.8869\\-19\\8.584647\\-203.9464\\-19\\8.084647\\-204.3869\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "103" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.915353\\-203.3869\\-17\\-6.415353\\-202.9464\\-17\\-8.415353\\-202.8869\\-17\\-8.915353\\-202.4464\\-17\\-9.915353\\-202.3869\\-17\\-10.41535\\-201.9464\\-17\\-11.41535\\-201.8869\\-17\\-13.41535\\-200.8869\\-17\\-14.91535\\-199.4464\\-17\\-15.41535\\-199.4464\\-17\\-19.91535\\-194.9464\\-17\\-20.22482\\-194.1369\\-17\\-21.22482\\-193.1369\\-17\\-21.22482\\-192.6369\\-17\\-22.22482\\-191.6369\\-17\\-22.22482\\-191.1369\\-17\\-22.72482\\-190.6369\\-17\\-22.72482\\-190.1369\\-17\\-23.66535\\-188.6369\\-17\\-23.72482\\-187.6369\\-17\\-24.16535\\-187.1369\\-17\\-24.22482\\-185.6369\\-17\\-24.66535\\-185.1369\\-17\\-24.72482\\-183.6369\\-17\\-25.16535\\-183.1369\\-17\\-25.22482\\-182.1369\\-17\\-25.22482\\-177.6369\\-17\\-25.16535\\-176.6369\\-17\\-24.72482\\-176.1369\\-17\\-24.72482\\-174.6369\\-17\\-24.22482\\-174.1369\\-17\\-24.22482\\-173.1369\\-17\\-23.72482\\-172.6369\\-17\\-23.72482\\-172.1369\\-17\\-23.22482\\-171.6369\\-17\\-23.22482\\-171.1369\\-17\\-22.72482\\-170.6369\\-17\\-22.72482\\-170.1369\\-17\\-17.91535\\-165.3274\\-17\\-17.41535\\-165.3274\\-17\\-16.91535\\-164.8274\\-17\\-16.41535\\-164.8274\\-17\\-15.91535\\-164.3274\\-17\\-15.41535\\-164.3274\\-17\\-14.91535\\-163.8274\\-17\\-14.41535\\-163.8274\\-17\\-13.91535\\-163.3869\\-17\\-12.91535\\-163.3274\\-17\\-12.41535\\-162.8869\\-17\\-10.91535\\-162.8274\\-17\\-10.41535\\-162.3869\\-17\\-8.915353\\-162.3274\\-17\\9.584647\\-162.3274\\-17\\11.08465\\-162.3869\\-17\\11.58465\\-162.8274\\-17\\13.08465\\-162.8869\\-17\\13.58465\\-163.3274\\-17\\14.58465\\-163.3869\\-17\\15.08465\\-163.8274\\-17\\16.08465\\-163.8869\\-17\\17.58465\\-164.8274\\-17\\18.08465\\-164.8869\\-17\\19.08465\\-165.8274\\-17\\19.89411\\-166.1369\\-17\\23.39411\\-169.6369\\-17\\23.39411\\-170.1369\\-17\\24.39411\\-171.1369\\-17\\24.39411\\-171.6369\\-17\\24.89411\\-172.1369\\-17\\24.89411\\-172.6369\\-17\\25.39411\\-173.1369\\-17\\25.39411\\-174.1369\\-17\\25.89411\\-174.6369\\-17\\25.89411\\-176.1369\\-17\\26.33465\\-176.6369\\-17\\26.39411\\-177.6369\\-17\\26.39411\\-182.6369\\-17\\25.89411\\-183.6369\\-17\\25.83465\\-185.6369\\-17\\25.39411\\-186.1369\\-17\\25.39411\\-187.1369\\-17\\24.89411\\-187.6369\\-17\\24.89411\\-188.6369\\-17\\24.39411\\-189.1369\\-17\\24.33465\\-190.1369\\-17\\23.83465\\-191.1369\\-17\\22.89411\\-192.1369\\-17\\22.89411\\-192.6369\\-17\\21.89411\\-193.6369\\-17\\21.89411\\-194.1369\\-17\\15.89411\\-200.1369\\-17\\15.08465\\-200.4464\\-17\\14.58465\\-200.9464\\-17\\14.08465\\-200.9464\\-17\\13.58465\\-201.4464\\-17\\13.08465\\-201.4464\\-17\\12.58465\\-201.9464\\-17\\12.08465\\-201.9464\\-17\\11.58465\\-202.3869\\-17\\10.58465\\-202.4464\\-17\\10.08465\\-202.8869\\-17\\8.084647\\-202.9464\\-17\\7.584647\\-203.3869\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "93" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.915353\\-200.9464\\-15\\-9.915353\\-200.9464\\-15\\-10.41535\\-200.4464\\-15\\-11.41535\\-200.3869\\-15\\-12.41535\\-199.4464\\-15\\-12.91535\\-199.4464\\-15\\-14.41535\\-197.9464\\-15\\-14.91535\\-197.9464\\-15\\-18.22482\\-194.6369\\-15\\-18.22482\\-194.1369\\-15\\-20.22482\\-192.1369\\-15\\-20.22482\\-191.6369\\-15\\-20.72482\\-191.1369\\-15\\-20.72482\\-190.6369\\-15\\-21.22482\\-190.1369\\-15\\-21.22482\\-189.6369\\-15\\-21.72482\\-189.1369\\-15\\-21.72482\\-188.6369\\-15\\-22.22482\\-188.1369\\-15\\-22.22482\\-187.1369\\-15\\-22.72482\\-186.6369\\-15\\-22.72482\\-185.1369\\-15\\-23.22482\\-184.6369\\-15\\-23.22482\\-176.1369\\-15\\-22.72482\\-175.6369\\-15\\-22.72482\\-174.1369\\-15\\-22.22482\\-173.6369\\-15\\-22.22482\\-172.6369\\-15\\-21.22482\\-171.6369\\-15\\-21.22482\\-171.1369\\-15\\-20.72482\\-170.6369\\-15\\-20.72482\\-170.1369\\-15\\-17.41535\\-166.8274\\-15\\-16.91535\\-166.8274\\-15\\-15.91535\\-165.8274\\-15\\-15.41535\\-165.8274\\-15\\-14.91535\\-165.3274\\-15\\-14.41535\\-165.3274\\-15\\-13.91535\\-164.8869\\-15\\-12.91535\\-164.8274\\-15\\-12.41535\\-164.3869\\-15\\-11.41535\\-164.3274\\-15\\-10.91535\\-163.8869\\-15\\-9.415353\\-163.8274\\-15\\-8.915353\\-163.3869\\-15\\-7.915353\\-163.3274\\-15\\8.584647\\-163.3274\\-15\\9.584647\\-163.3869\\-15\\10.08465\\-163.8274\\-15\\11.58465\\-163.8869\\-15\\12.08465\\-164.3274\\-15\\13.08465\\-164.3274\\-15\\13.58465\\-164.8274\\-15\\14.58465\\-164.8274\\-15\\15.08465\\-165.3274\\-15\\16.08465\\-165.3869\\-15\\17.08465\\-165.8869\\-15\\18.58465\\-167.3274\\-15\\19.08465\\-167.3274\\-15\\21.39411\\-169.6369\\-15\\21.39411\\-170.1369\\-15\\22.39411\\-171.1369\\-15\\22.39411\\-171.6369\\-15\\22.89411\\-172.1369\\-15\\22.89411\\-172.6369\\-15\\23.39411\\-173.1369\\-15\\23.39411\\-173.6369\\-15\\23.89411\\-174.1369\\-15\\23.89411\\-175.1369\\-15\\24.39411\\-175.6369\\-15\\24.39411\\-184.6369\\-15\\23.89411\\-185.6369\\-15\\23.83465\\-187.1369\\-15\\23.39411\\-187.6369\\-15\\23.39411\\-188.1369\\-15\\22.89411\\-188.6369\\-15\\22.89411\\-189.6369\\-15\\22.39411\\-190.1369\\-15\\22.39411\\-190.6369\\-15\\21.39411\\-191.6369\\-15\\21.39411\\-192.1369\\-15\\20.39411\\-193.1369\\-15\\20.39411\\-193.6369\\-15\\15.08465\\-198.9464\\-15\\14.58465\\-198.9464\\-15\\13.58465\\-199.9464\\-15\\13.08465\\-199.9464\\-15\\12.58465\\-200.4464\\-15\\12.08465\\-200.4464\\-15\\11.58465\\-200.9464\\-15\\10.58465\\-200.9464\\-15\\9.584647\\-201.4464\\-15\\-7.915353\\-201.4464\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "90" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.915353\\-199.4464\\-13\\-8.415353\\-198.9464\\-13\\-9.415353\\-198.9464\\-13\\-9.915353\\-198.4464\\-13\\-10.41535\\-198.4464\\-13\\-10.91535\\-197.9464\\-13\\-11.41535\\-197.9464\\-13\\-11.91535\\-197.4464\\-13\\-12.41535\\-197.4464\\-13\\-13.91535\\-195.9464\\-13\\-14.41535\\-195.9464\\-13\\-16.22482\\-194.1369\\-13\\-16.22482\\-193.6369\\-13\\-17.72482\\-192.1369\\-13\\-17.72482\\-191.6369\\-13\\-18.72482\\-190.6369\\-13\\-18.72482\\-190.1369\\-13\\-19.22482\\-189.6369\\-13\\-19.22482\\-189.1369\\-13\\-19.72482\\-188.6369\\-13\\-19.72482\\-188.1369\\-13\\-20.22482\\-187.6369\\-13\\-20.22482\\-186.6369\\-13\\-20.72482\\-186.1369\\-13\\-20.72482\\-184.6369\\-13\\-21.22482\\-184.1369\\-13\\-21.22482\\-176.6369\\-13\\-20.72482\\-176.1369\\-13\\-20.72482\\-174.6369\\-13\\-20.22482\\-174.1369\\-13\\-20.22482\\-173.6369\\-13\\-19.72482\\-173.1369\\-13\\-19.72482\\-172.6369\\-13\\-19.22482\\-172.1369\\-13\\-19.22482\\-171.6369\\-13\\-15.41535\\-167.8274\\-13\\-14.91535\\-167.8274\\-13\\-13.91535\\-166.8274\\-13\\-13.41535\\-166.8274\\-13\\-12.91535\\-166.3274\\-13\\-11.91535\\-166.3274\\-13\\-11.41535\\-165.8274\\-13\\-10.41535\\-165.8274\\-13\\-9.915353\\-165.3274\\-13\\-7.915353\\-165.3274\\-13\\-7.415353\\-164.8274\\-13\\8.084647\\-164.8274\\-13\\9.084647\\-165.3274\\-13\\11.08465\\-165.3274\\-13\\11.58465\\-165.8274\\-13\\12.58465\\-165.8274\\-13\\13.08465\\-166.3274\\-13\\13.58465\\-166.3274\\-13\\14.08465\\-166.8274\\-13\\14.58465\\-166.8274\\-13\\15.08465\\-167.3274\\-13\\15.58465\\-167.3274\\-13\\16.08465\\-167.8274\\-13\\16.58465\\-167.8274\\-13\\20.39411\\-171.6369\\-13\\20.39411\\-172.1369\\-13\\20.89411\\-172.6369\\-13\\20.89411\\-173.1369\\-13\\21.39411\\-173.6369\\-13\\21.39411\\-174.1369\\-13\\21.89411\\-174.6369\\-13\\21.89411\\-176.1369\\-13\\22.39411\\-176.6369\\-13\\22.39411\\-184.1369\\-13\\21.89411\\-184.6369\\-13\\21.89411\\-186.1369\\-13\\21.39411\\-186.6369\\-13\\21.39411\\-187.6369\\-13\\20.89411\\-188.1369\\-13\\20.89411\\-189.1369\\-13\\20.39411\\-189.6369\\-13\\20.39411\\-190.1369\\-13\\19.39411\\-191.1369\\-13\\19.39411\\-191.6369\\-13\\18.39411\\-192.6369\\-13\\18.39411\\-193.1369\\-13\\14.58465\\-196.9464\\-13\\14.08465\\-196.9464\\-13\\13.08465\\-197.9464\\-13\\12.58465\\-197.9464\\-13\\12.08465\\-198.4464\\-13\\11.58465\\-198.4464\\-13\\11.08465\\-198.9464\\-13\\10.08465\\-198.9464\\-13\\9.584647\\-199.4464\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.915353\\-196.9464\\-11\\-7.415353\\-196.4464\\-11\\-8.415353\\-196.4464\\-11\\-8.915353\\-195.9464\\-11\\-9.415353\\-195.9464\\-11\\-9.915353\\-195.4464\\-11\\-10.41535\\-195.4464\\-11\\-10.91535\\-194.9464\\-11\\-11.41535\\-194.9464\\-11\\-15.72482\\-190.6369\\-11\\-15.72482\\-190.1369\\-11\\-16.22482\\-189.6369\\-11\\-16.22482\\-189.1369\\-11\\-16.72482\\-188.6369\\-11\\-16.72482\\-188.1369\\-11\\-17.22482\\-187.6369\\-11\\-17.22482\\-187.1369\\-11\\-17.72482\\-186.6369\\-11\\-17.72482\\-186.1369\\-11\\-18.22482\\-185.6369\\-11\\-18.22482\\-184.1369\\-11\\-18.72482\\-183.6369\\-11\\-18.72482\\-177.1369\\-11\\-18.22482\\-176.6369\\-11\\-18.22482\\-175.6369\\-11\\-17.72482\\-175.1369\\-11\\-17.72482\\-174.6369\\-11\\-17.22482\\-174.1369\\-11\\-17.22482\\-173.6369\\-11\\-15.72482\\-172.1369\\-11\\-15.72482\\-171.6369\\-11\\-14.41535\\-170.3274\\-11\\-13.91535\\-170.3274\\-11\\-12.91535\\-169.3274\\-11\\-12.41535\\-169.3274\\-11\\-11.91535\\-168.8274\\-11\\-11.41535\\-168.8274\\-11\\-10.91535\\-168.3274\\-11\\-10.41535\\-168.3274\\-11\\-9.915353\\-167.8274\\-11\\-9.415353\\-167.8274\\-11\\-8.915353\\-167.3274\\-11\\-6.415353\\-167.3274\\-11\\-5.915353\\-166.8274\\-11\\7.084647\\-166.8274\\-11\\7.584647\\-167.3274\\-11\\9.584647\\-167.3274\\-11\\10.08465\\-167.8274\\-11\\11.08465\\-167.8274\\-11\\11.58465\\-168.3274\\-11\\12.08465\\-168.3274\\-11\\12.58465\\-168.8274\\-11\\13.08465\\-168.8274\\-11\\13.58465\\-169.3274\\-11\\14.08465\\-169.3274\\-11\\18.39411\\-173.6369\\-11\\18.39411\\-174.1369\\-11\\18.89411\\-174.6369\\-11\\18.89411\\-175.1369\\-11\\19.39411\\-175.6369\\-11\\19.39411\\-176.6369\\-11\\19.89411\\-177.1369\\-11\\19.89411\\-184.1369\\-11\\19.39411\\-184.6369\\-11\\19.39411\\-185.6369\\-11\\18.89411\\-186.1369\\-11\\18.89411\\-187.1369\\-11\\18.39411\\-187.6369\\-11\\18.39411\\-188.1369\\-11\\17.89411\\-188.6369\\-11\\17.89411\\-189.1369\\-11\\17.39411\\-189.6369\\-11\\17.39411\\-190.1369\\-11\\15.89411\\-191.6369\\-11\\15.89411\\-192.1369\\-11\\14.08465\\-193.9464\\-11\\13.58465\\-193.9464\\-11\\12.08465\\-195.4464\\-11\\11.58465\\-195.4464\\-11\\11.08465\\-195.9464\\-11\\10.58465\\-195.9464\\-11\\10.08465\\-196.4464\\-11\\9.084647\\-196.4464\\-11\\8.584647\\-196.9464\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.915353\\-192.9464\\-9\\-7.415353\\-192.4464\\-9\\-8.415353\\-192.4464\\-9\\-9.415353\\-191.4464\\-9\\-9.915353\\-191.4464\\-9\\-12.72482\\-188.6369\\-9\\-12.72482\\-188.1369\\-9\\-13.72482\\-187.1369\\-9\\-13.72482\\-186.6369\\-9\\-14.22482\\-186.1369\\-9\\-14.22482\\-185.6369\\-9\\-14.72482\\-185.1369\\-9\\-14.72482\\-183.6369\\-9\\-15.22482\\-183.1369\\-9\\-15.22482\\-178.1369\\-9\\-14.72482\\-177.6369\\-9\\-14.72482\\-176.6369\\-9\\-14.22482\\-176.1369\\-9\\-14.22482\\-175.6369\\-9\\-13.72482\\-175.1369\\-9\\-13.72482\\-174.6369\\-9\\-10.91535\\-171.8274\\-9\\-10.41535\\-171.8274\\-9\\-9.915353\\-171.3274\\-9\\-9.415353\\-171.3274\\-9\\-8.915353\\-170.8274\\-9\\-7.915353\\-170.8274\\-9\\-7.415353\\-170.3274\\-9\\-5.415353\\-170.3274\\-9\\-4.915353\\-169.8274\\-9\\6.084647\\-169.8274\\-9\\6.584647\\-170.3274\\-9\\8.584647\\-170.3274\\-9\\9.084647\\-170.8274\\-9\\10.08465\\-170.8274\\-9\\10.58465\\-171.3274\\-9\\11.08465\\-171.3274\\-9\\11.58465\\-171.8274\\-9\\12.08465\\-171.8274\\-9\\14.89411\\-174.6369\\-9\\14.89411\\-175.1369\\-9\\15.39411\\-175.6369\\-9\\15.39411\\-176.1369\\-9\\15.89411\\-176.6369\\-9\\15.89411\\-177.6369\\-9\\16.39411\\-178.1369\\-9\\16.39411\\-183.6369\\-9\\15.89411\\-184.1369\\-9\\15.89411\\-185.1369\\-9\\15.39411\\-185.6369\\-9\\15.39411\\-186.1369\\-9\\14.89411\\-186.6369\\-9\\14.89411\\-187.1369\\-9\\14.39411\\-187.6369\\-9\\14.39411\\-188.1369\\-9\\10.58465\\-191.9464\\-9\\10.08465\\-191.9464\\-9\\9.584647\\-192.4464\\-9\\9.084647\\-192.4464\\-9\\8.584647\\-192.9464\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.415353\\-185.9464\\-7\\-5.915353\\-185.4464\\-7\\-6.415353\\-185.4464\\-7\\-7.724819\\-184.1369\\-7\\-7.724819\\-183.6369\\-7\\-8.224819\\-183.1369\\-7\\-8.224819\\-182.6369\\-7\\-8.724819\\-182.1369\\-7\\-8.724819\\-179.1369\\-7\\-8.224819\\-178.6369\\-7\\-8.224819\\-178.1369\\-7\\-6.415353\\-176.3274\\-7\\-5.415353\\-176.3274\\-7\\-4.915353\\-175.8274\\-7\\6.084647\\-175.8274\\-7\\6.584647\\-176.3274\\-7\\7.584647\\-176.3274\\-7\\9.394114\\-178.1369\\-7\\9.394114\\-178.6369\\-7\\9.894114\\-179.1369\\-7\\9.894114\\-182.6369\\-7\\9.394114\\-183.1369\\-7\\9.394114\\-183.6369\\-7\\7.584647\\-185.4464\\-7\\7.084647\\-185.4464\\-7\\6.584647\\-185.9464\\-7" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "4" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "255\\255\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "58" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "2.118783\\-200.688\\-7\\3.688119\\-200.4978\\-7\\5.064636\\-200.0758\\-7\\6.460264\\-200.0264\\-7\\7.564238\\-199.5488\\-7\\8.963009\\-199.3706\\-7\\9.836956\\-198.8362\\-7\\10.55657\\-198.8968\\-7\\11.28211\\-198.4411\\-7\\12.275\\-198.3316\\-7\\14.16791\\-197.7549\\-7\\15.50114\\-197.832\\-7\\16.29665\\-197.6216\\-7\\17.00278\\-197.7832\\-7\\17.45366\\-198.2698\\-7\\18.59054\\-199.0016\\-7\\19.21973\\-200.6346\\-7\\19.49258\\-202.3157\\-7\\18.92627\\-204.8141\\-7\\18.22073\\-206.092\\-7\\17.54166\\-207.0491\\-7\\15.64322\\-209.0824\\-7\\12.91953\\-210.7655\\-7\\10.07212\\-212.0289\\-7\\8.292524\\-212.4787\\-7\\5.70048\\-212.8561\\-7\\4.445841\\-213.1447\\-7\\3.398423\\-213.1118\\-7\\1.34725\\-213.295\\-7\\-0.371215\\-213.2948\\-7\\-2.35529\\-213.1097\\-7\\-3.460436\\-213.138\\-7\\-4.730655\\-212.8487\\-7\\-7.296126\\-212.4844\\-7\\-9.096278\\-212.0284\\-7\\-11.94889\\-210.7569\\-7\\-14.66847\\-209.0861\\-7\\-16.56054\\-207.0503\\-7\\-17.24433\\-206.0919\\-7\\-17.94979\\-204.8142\\-7\\-18.51423\\-202.3195\\-7\\-18.27359\\-200.6581\\-7\\-17.40776\\-198.7672\\-7\\-16.49381\\-198.2694\\-7\\-16.00928\\-197.7922\\-7\\-15.31869\\-197.6215\\-7\\-14.52699\\-197.8338\\-7\\-13.31736\\-197.6794\\-7\\-12.22724\\-198.1126\\-7\\-10.58196\\-198.3851\\-7\\-9.658433\\-198.8586\\-7\\-8.861181\\-198.8359\\-7\\-7.989448\\-199.3696\\-7\\-6.621591\\-199.5406\\-7\\-5.501807\\-200.0241\\-7\\-4.076972\\-200.0788\\-7\\-2.811528\\-200.4866\\-7\\-1.550765\\-200.6176\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "2.638206\\-193.8351\\-5\\4.27789\\-193.5854\\-5\\9.087528\\-191.5363\\-5\\9.707728\\-190.9396\\-5\\10.19323\\-190.836\\-5\\12.97652\\-189.1775\\-5\\14.22778\\-188.5783\\-5\\16.42825\\-188.1113\\-5\\17.89869\\-188.0158\\-5\\20.06059\\-188.6115\\-5\\21.94577\\-189.9909\\-5\\23.19127\\-191.2707\\-5\\24.221\\-193.0529\\-5\\24.8614\\-194.5046\\-5\\25.38822\\-196.4797\\-5\\25.65618\\-199.9844\\-5\\25.18298\\-203.4908\\-5\\24.5757\\-205.3404\\-5\\23.86917\\-206.8904\\-5\\22.57464\\-209.1143\\-5\\20.08956\\-211.9573\\-5\\18.50864\\-213.2627\\-5\\16.59299\\-214.5708\\-5\\14.02119\\-215.888\\-5\\12.57855\\-216.4844\\-5\\9.800355\\-217.3315\\-5\\6.525309\\-217.9846\\-5\\2.20525\\-218.3889\\-5\\0.6021065\\-218.4633\\-5\\-1.300326\\-218.398\\-5\\-5.548341\\-217.9847\\-5\\-8.823057\\-217.3318\\-5\\-11.60107\\-216.4846\\-5\\-13.04884\\-215.8828\\-5\\-15.23056\\-214.7541\\-5\\-17.54913\\-213.2539\\-5\\-19.11278\\-211.9575\\-5\\-21.59816\\-209.1141\\-5\\-22.92257\\-206.836\\-5\\-23.62809\\-205.2501\\-5\\-24.20657\\-203.4767\\-5\\-24.67878\\-199.9896\\-5\\-24.41169\\-196.4795\\-5\\-23.8864\\-194.508\\-5\\-23.25277\\-193.0608\\-5\\-22.21377\\-191.2699\\-5\\-20.96932\\-189.9909\\-5\\-19.08403\\-188.6115\\-5\\-16.92213\\-188.0158\\-5\\-14.26493\\-188.3163\\-5\\-12.09743\\-189.1377\\-5\\-11.23366\\-189.693\\-5\\-8.731774\\-190.9395\\-5\\-8.110901\\-191.5363\\-5\\-3.304572\\-193.5722\\-5\\-0.8416062\\-193.8936\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.864589\\-221.8821\\-3\\-4.262839\\-221.705\\-3\\-6.966069\\-221.2908\\-3\\-10.64893\\-220.3757\\-3\\-14.25606\\-219.1237\\-3\\-17.98728\\-217.0966\\-3\\-19.8985\\-215.6573\\-3\\-21.56731\\-214.2381\\-3\\-23.44175\\-212.1059\\-3\\-24.59382\\-210.5732\\-3\\-26.01821\\-207.9047\\-3\\-26.77742\\-206.1993\\-3\\-27.35131\\-204.3581\\-3\\-27.84531\\-201.8294\\-3\\-27.98084\\-200.0783\\-3\\-28.03899\\-197.6873\\-3\\-27.82421\\-195.3723\\-3\\-27.39288\\-193.1793\\-3\\-26.38541\\-190.2343\\-3\\-25.9979\\-189.3203\\-3\\-24.23606\\-186.2188\\-3\\-23.11403\\-184.7514\\-3\\-22.14576\\-183.6978\\-3\\-20.29444\\-181.9018\\-3\\-17.92085\\-180.2553\\-3\\-14.91576\\-178.7754\\-3\\-12.09181\\-178.0114\\-3\\-10.41864\\-177.6524\\-3\\-8.380567\\-177.7356\\-3\\-7.821159\\-177.5995\\-3\\-6.256923\\-177.9025\\-3\\-5.568405\\-177.6836\\-3\\-3.728723\\-178.3027\\-3\\-2.461752\\-178.4334\\-3\\-1.873984\\-178.2949\\-3\\-1.278085\\-178.617\\-3\\-0.6892607\\-178.5616\\-3\\0.915863\\-178.7556\\-3\\1.413679\\-178.5143\\-3\\2.260312\\-178.6259\\-3\\2.849585\\-178.2998\\-3\\3.442821\\-178.436\\-3\\5.749365\\-178.0533\\-3\\6.584952\\-177.6623\\-3\\7.209674\\-177.8984\\-3\\8.797851\\-177.5999\\-3\\9.35713\\-177.7356\\-3\\11.3952\\-177.6524\\-3\\13.06837\\-178.0114\\-3\\15.89232\\-178.7754\\-3\\16.71202\\-179.1062\\-3\\19.12932\\-180.402\\-3\\20.75851\\-181.5704\\-3\\22.18242\\-182.7463\\-3\\24.09221\\-184.7533\\-3\\25.21266\\-186.2189\\-3\\26.97704\\-189.3233\\-3\\27.36121\\-190.2331\\-3\\28.37042\\-193.1835\\-3\\28.76588\\-195.0818\\-3\\29.0182\\-197.6763\\-3\\28.96166\\-200.9124\\-3\\28.38528\\-204.1257\\-3\\27.75371\\-206.1993\\-3\\26.99477\\-207.9047\\-3\\25.57038\\-210.5732\\-3\\24.41832\\-212.1058\\-3\\22.54387\\-214.2381\\-3\\19.49674\\-216.7331\\-3\\17.89876\\-217.7106\\-3\\15.2332\\-219.1235\\-3\\11.62549\\-220.3757\\-3\\7.942632\\-221.2908\\-3\\5.239401\\-221.705\\-3\\2.843655\\-221.8819\\-3\\0.4587926\\-221.9557\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "69" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.505893\\-224.659\\-1\\-3.872592\\-224.5329\\-1\\-6.075192\\-224.2514\\-1\\-10.10377\\-223.4046\\-1\\-12.09372\\-222.8099\\-1\\-15.40204\\-221.5276\\-1\\-17.30988\\-220.5775\\-1\\-19.52165\\-219.2113\\-1\\-21.64827\\-217.6772\\-1\\-24.03179\\-215.3864\\-1\\-25.01208\\-214.2589\\-1\\-27.05294\\-211.3666\\-1\\-28.61117\\-208.2582\\-1\\-29.29426\\-206.4117\\-1\\-29.91546\\-204.106\\-1\\-30.2992\\-201.8872\\-1\\-30.53119\\-198.9491\\-1\\-30.3863\\-195.7051\\-1\\-29.95169\\-192.8636\\-1\\-29.52408\\-191.1825\\-1\\-28.35457\\-187.8148\\-1\\-27.50398\\-185.9839\\-1\\-26.57295\\-184.29\\-1\\-25.47632\\-182.5485\\-1\\-24.10098\\-180.6762\\-1\\-22.8449\\-179.206\\-1\\-21.20982\\-177.5157\\-1\\-18.44579\\-175.1434\\-1\\-15.26518\\-172.9597\\-1\\-13.75686\\-172.1249\\-1\\-10.84213\\-170.7385\\-1\\-7.96404\\-169.6793\\-1\\-5.895551\\-169.0958\\-1\\-2.046023\\-168.4893\\-1\\-0.101065\\-168.4183\\-1\\2.370644\\-168.4714\\-1\\4.407464\\-168.665\\-1\\6.877327\\-169.0973\\-1\\8.940471\\-169.6793\\-1\\11.81951\\-170.7388\\-1\\14.7207\\-172.1159\\-1\\17.70461\\-173.9061\\-1\\20.25886\\-175.7929\\-1\\22.28488\\-177.589\\-1\\24.25022\\-179.6929\\-1\\26.49762\\-182.5952\\-1\\27.66922\\-184.4665\\-1\\29.33005\\-187.8129\\-1\\30.50064\\-191.1825\\-1\\30.92746\\-192.861\\-1\\31.27184\\-194.9045\\-1\\31.47488\\-197.6931\\-1\\31.41817\\-200.4838\\-1\\31.26016\\-201.9663\\-1\\30.82529\\-204.4017\\-1\\30.27291\\-206.4079\\-1\\29.58772\\-208.2582\\-1\\28.02929\\-211.3663\\-1\\25.97207\\-214.2774\\-1\\24.95238\\-215.4348\\-1\\22.62433\\-217.678\\-1\\20.50612\\-219.2063\\-1\\18.28639\\-220.5776\\-1\\16.3786\\-221.5276\\-1\\13.07029\\-222.8099\\-1\\11.08033\\-223.4046\\-1\\7.05121\\-224.2515\\-1\\4.857371\\-224.5319\\-1\\0.9292888\\-224.704\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "74" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.230072\\-226.988\\1\\1.617026\\-227.0116\\1\\5.893857\\-226.7186\\1\\9.422059\\-226.1311\\1\\12.82796\\-225.243\\1\\16.03768\\-224.1147\\1\\19.40093\\-222.4731\\1\\21.62452\\-221.1039\\1\\22.9313\\-220.1671\\1\\25.06567\\-218.3331\\1\\27.12967\\-216.1705\\1\\28.78583\\-213.9369\\1\\29.86313\\-212.229\\1\\30.97235\\-210.1181\\1\\32.10492\\-207.151\\1\\32.72127\\-205.0031\\1\\33.13824\\-202.708\\1\\33.44806\\-199.6716\\1\\33.46246\\-198.0082\\1\\33.29013\\-195.2014\\1\\33.01165\\-193.3288\\1\\32.51138\\-190.9886\\1\\31.80636\\-188.4967\\1\\30.6123\\-185.512\\1\\29.06974\\-182.4883\\1\\27.56436\\-180.0939\\1\\26.32525\\-178.4071\\1\\24.40985\\-176.106\\1\\22.75132\\-174.4283\\1\\21.24067\\-173.0551\\1\\19.72177\\-171.8311\\1\\17.56783\\-170.317\\1\\15.52231\\-169.1041\\1\\12.61545\\-167.7029\\1\\10.1143\\-166.806\\1\\7.618216\\-166.143\\1\\5.625355\\-165.7783\\1\\1.528728\\-165.3489\\1\\-0.7995239\\-165.3682\\1\\-4.667117\\-165.7833\\1\\-6.629262\\-166.138\\1\\-9.138115\\-166.8062\\1\\-11.63889\\-167.7029\\1\\-14.54575\\-169.1041\\1\\-16.59123\\-170.317\\1\\-18.74592\\-171.832\\1\\-20.28835\\-173.0799\\1\\-22.52108\\-175.159\\1\\-24.25586\\-177.0566\\1\\-25.41307\\-178.4684\\1\\-26.59302\\-180.0987\\1\\-28.58984\\-183.391\\1\\-29.63597\\-185.512\\1\\-30.8298\\-188.4967\\1\\-31.53481\\-190.9886\\1\\-32.0358\\-193.3289\\1\\-32.30801\\-195.136\\1\\-32.47206\\-199.6432\\1\\-32.34568\\-201.3506\\1\\-31.75202\\-204.9769\\1\\-31.12837\\-207.1509\\1\\-29.99633\\-210.1172\\1\\-29.05882\\-211.905\\1\\-27.81673\\-213.929\\1\\-25.93152\\-216.4034\\1\\-24.09339\\-218.3303\\1\\-21.59067\\-220.4518\\1\\-19.56627\\-221.7962\\1\\-17.17303\\-223.1198\\1\\-15.05823\\-224.1127\\1\\-12.72814\\-224.9722\\1\\-10.90476\\-225.5172\\1\\-8.454619\\-226.1279\\1\\-4.813118\\-226.7221\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.3135906\\-228.9314\\3\\1.290305\\-228.9303\\3\\4.793899\\-228.7583\\3\\7.307244\\-228.4516\\3\\10.98056\\-227.7123\\3\\13.59094\\-226.9913\\3\\15.95373\\-226.1736\\3\\19.26485\\-224.678\\3\\20.92691\\-223.7265\\3\\22.81876\\-222.4889\\3\\24.3543\\-221.3317\\3\\26.22543\\-219.7086\\3\\27.37218\\-218.5479\\3\\29.24239\\-216.3239\\3\\30.38726\\-214.6923\\3\\31.41593\\-213.0145\\3\\32.74849\\-210.2846\\3\\33.9155\\-206.9134\\3\\34.60811\\-204.0022\\3\\35.0148\\-200.3019\\3\\35.01503\\-196.413\\3\\34.80304\\-194.4035\\3\\34.45737\\-192.2376\\3\\34.00693\\-190.1625\\3\\33.21647\\-187.5761\\3\\32.32428\\-185.2765\\3\\31.40952\\-183.2593\\3\\30.05162\\-180.7046\\3\\28.06799\\-177.6877\\3\\25.71058\\-174.7955\\3\\23.80749\\-172.8204\\3\\22.07121\\-171.2518\\3\\19.2796\\-169.1515\\3\\17.22806\\-167.8832\\3\\15.05452\\-166.7691\\3\\11.73059\\-165.5063\\3\\8.736152\\-164.6779\\3\\5.936163\\-164.1722\\3\\2.654293\\-163.8878\\3\\-1.301358\\-163.8856\\3\\-4.962992\\-164.1727\\3\\-7.758486\\-164.6777\\3\\-9.65784\\-165.1808\\3\\-12.71687\\-166.1844\\3\\-14.08671\\-166.7715\\3\\-16.24262\\-167.8787\\3\\-18.67115\\-169.4019\\3\\-20.83492\\-171.025\\3\\-22.69699\\-172.6715\\3\\-24.68094\\-174.731\\3\\-27.11776\\-177.7423\\3\\-29.0754\\-180.7054\\3\\-30.43284\\-183.2591\\3\\-31.34771\\-185.2765\\3\\-32.23991\\-187.5761\\3\\-33.03045\\-190.1627\\3\\-33.55018\\-192.5997\\3\\-34.03828\\-196.4082\\3\\-34.04025\\-200.2078\\3\\-33.79142\\-202.9676\\3\\-33.52932\\-204.4788\\3\\-32.93048\\-206.9364\\3\\-31.77195\\-210.2846\\3\\-30.43933\\-213.0145\\3\\-29.41279\\-214.6913\\3\\-28.21924\\-216.381\\3\\-25.89614\\-219.083\\3\\-23.44763\\-221.2687\\3\\-21.03433\\-223.0565\\3\\-18.62058\\-224.47\\3\\-17.00047\\-225.3025\\3\\-14.29901\\-226.427\\3\\-12.64971\\-226.9758\\3\\-10.00135\\-227.7132\\3\\-6.330335\\-228.4518\\3\\-3.812125\\-228.7596\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "79" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.252691\\-230.4623\\5\\-6.212992\\-230.1293\\5\\-9.146994\\-229.5928\\5\\-12.73069\\-228.6603\\5\\-16.33685\\-227.3569\\5\\-18.70528\\-226.2385\\5\\-21.84462\\-224.3979\\5\\-23.28526\\-223.3784\\5\\-25.33088\\-221.7136\\5\\-26.99786\\-220.1182\\5\\-28.97999\\-217.8698\\5\\-30.75214\\-215.3696\\5\\-31.29977\\-214.4659\\5\\-32.71239\\-211.6962\\5\\-33.4382\\-209.9144\\5\\-34.49167\\-206.6018\\5\\-34.82876\\-205.0423\\5\\-35.27651\\-202.1661\\5\\-35.44458\\-199.6658\\5\\-35.37939\\-196.1625\\5\\-34.99789\\-192.9438\\5\\-34.52095\\-190.5999\\5\\-33.75994\\-187.8714\\5\\-32.98402\\-185.629\\5\\-32.15805\\-183.6363\\5\\-31.00288\\-181.3047\\5\\-29.33825\\-178.5006\\5\\-26.90814\\-175.1217\\5\\-24.91504\\-172.884\\5\\-22.77211\\-170.8369\\5\\-20.66631\\-169.1362\\5\\-18.51003\\-167.6791\\5\\-17.01823\\-166.8163\\5\\-15.51472\\-166.0764\\5\\-13.59794\\-165.2959\\5\\-12.13263\\-164.8016\\5\\-9.508026\\-164.0994\\5\\-7.533429\\-163.7547\\5\\-4.755338\\-163.3887\\5\\0.6029193\\-163.1679\\5\\5.724001\\-163.3857\\5\\9.877586\\-163.9805\\5\\11.77233\\-164.418\\5\\14.50093\\-165.2692\\5\\16.44098\\-166.0604\\5\\19.38646\\-167.6241\\5\\21.63471\\-169.1293\\5\\23.75167\\-170.84\\5\\26.22358\\-173.2368\\5\\27.8851\\-175.1225\\5\\29.46671\\-177.2436\\5\\31.12628\\-179.8239\\5\\31.9417\\-181.2482\\5\\33.13614\\-183.6406\\5\\33.96057\\-185.6289\\5\\34.7365\\-187.8714\\5\\35.49983\\-190.6069\\5\\35.93556\\-192.8452\\5\\36.35567\\-196.16\\5\\36.42181\\-199.6032\\5\\36.25412\\-202.1605\\5\\35.66015\\-205.7325\\5\\35.12953\\-207.7594\\5\\34.41796\\-209.9017\\5\\33.69498\\-211.6962\\5\\32.27636\\-214.4658\\5\\31.7289\\-215.3694\\5\\29.95662\\-217.8699\\5\\28.03683\\-220.076\\5\\26.30546\\-221.7157\\5\\24.27489\\-223.3727\\5\\21.71678\\-225.0882\\5\\19.68466\\-226.2368\\5\\17.31322\\-227.357\\5\\13.70726\\-228.6603\\5\\10.12356\\-229.5928\\5\\7.206679\\-230.1255\\5\\4.211326\\-230.461\\5\\0.4916681\\-230.5871\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "79" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.113355\\-231.9815\\7\\1.78387\\-231.9958\\7\\5.839989\\-231.6794\\7\\7.611424\\-231.4675\\7\\9.987147\\-231.0579\\7\\12.91806\\-230.3536\\7\\15.50904\\-229.5385\\7\\17.72618\\-228.6717\\7\\20.56344\\-227.3343\\7\\23.81407\\-225.377\\7\\26.31833\\-223.4626\\7\\27.75669\\-222.2016\\7\\29.74725\\-220.1285\\7\\31.10832\\-218.4566\\7\\32.34916\\-216.7125\\7\\33.77028\\-214.3543\\7\\34.78714\\-212.3056\\7\\35.90201\\-209.4008\\7\\36.51296\\-207.3902\\7\\36.98742\\-205.3055\\7\\37.47757\\-201.6117\\7\\37.56797\\-197.5989\\7\\37.3562\\-194.4153\\7\\36.79647\\-191.0921\\7\\36.2218\\-188.8031\\7\\35.06652\\-185.2823\\7\\33.42091\\-181.5529\\7\\31.93871\\-178.8714\\7\\29.70436\\-175.5734\\7\\28.22831\\-173.7659\\7\\26.38695\\-171.7636\\7\\24.68287\\-170.174\\7\\22.94795\\-168.7995\\7\\21.15678\\-167.5496\\7\\18.40044\\-166.0376\\7\\15.17508\\-164.7411\\7\\12.34891\\-163.9888\\7\\9.686124\\-163.5579\\7\\6.619918\\-163.267\\7\\2.036601\\-163.1488\\7\\-3.364203\\-163.1777\\7\\-5.648504\\-163.267\\7\\-10.16484\\-163.7568\\7\\-12.99839\\-164.3995\\7\\-14.20547\\-164.7418\\7\\-16.97895\\-165.8251\\7\\-18.19831\\-166.4128\\7\\-20.17971\\-167.5494\\7\\-21.97139\\-168.7995\\7\\-23.70631\\-170.174\\7\\-25.41785\\-171.7746\\7\\-27.25049\\-173.7628\\7\\-28.72779\\-175.5734\\7\\-30.96593\\-178.8796\\7\\-32.72195\\-182.1051\\7\\-34.08269\\-185.2576\\7\\-35.24524\\-188.8031\\7\\-35.82001\\-191.0926\\7\\-36.37973\\-194.4156\\7\\-36.62768\\-198.1999\\7\\-36.50275\\-201.6698\\7\\-36.01051\\-205.3088\\7\\-35.53661\\-207.3902\\7\\-34.92545\\-209.401\\7\\-33.70901\\-212.5259\\7\\-32.53335\\-214.8377\\7\\-30.92758\\-217.3744\\7\\-28.79788\\-220.1051\\7\\-26.66315\\-222.302\\7\\-25.34836\\-223.4622\\7\\-22.82267\\-225.3763\\7\\-20.65603\\-226.7433\\7\\-18.55426\\-227.8498\\7\\-16.74965\\-228.6716\\7\\-14.53247\\-229.5385\\7\\-11.94139\\-230.3536\\7\\-9.010533\\-231.0579\\7\\-6.634991\\-231.4674\\7\\-4.863411\\-231.6793\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "83" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.4003342\\-233.2461\\9\\4.02504\\-233.0949\\9\\6.533574\\-232.8296\\9\\9.712001\\-232.3584\\9\\11.8706\\-231.8688\\9\\15.03886\\-230.9707\\9\\18.33954\\-229.7097\\9\\20.95532\\-228.458\\9\\24.30868\\-226.4386\\9\\26.23126\\-225.0348\\9\\28.40893\\-223.133\\9\\29.68939\\-221.8814\\9\\31.66967\\-219.5752\\9\\33.24977\\-217.3623\\9\\34.16417\\-215.841\\9\\35.29821\\-213.738\\9\\36.0014\\-212.1932\\9\\37.10344\\-209.0577\\9\\37.45719\\-207.8224\\9\\38.05902\\-205.1721\\9\\38.5475\\-201.1462\\9\\38.59718\\-197.9972\\9\\38.44669\\-195.317\\9\\38.12399\\-192.9546\\9\\37.68431\\-190.6108\\9\\36.4941\\-186.3636\\9\\35.53729\\-183.8625\\9\\34.36541\\-181.2518\\9\\32.9718\\-178.722\\9\\32.24244\\-177.5356\\9\\30.71769\\-175.3617\\9\\28.87608\\-173.0675\\9\\26.74139\\-170.8697\\9\\25.37294\\-169.6574\\9\\23.92429\\-168.5262\\9\\21.80225\\-167.1184\\9\\19.61738\\-165.9521\\9\\18.3121\\-165.3829\\9\\16.36147\\-164.7129\\9\\14.34965\\-164.2001\\9\\11.1674\\-163.7356\\9\\7.199081\\-163.5224\\9\\1.372858\\-163.5936\\9\\-4.748299\\-163.5675\\9\\-6.222456\\-163.5224\\9\\-10.19083\\-163.7356\\9\\-13.36962\\-164.1991\\9\\-15.38274\\-164.7125\\9\\-17.3416\\-165.3844\\9\\-19.30886\\-166.2719\\9\\-20.82355\\-167.1171\\9\\-22.94773\\-168.5262\\9\\-24.39638\\-169.6574\\9\\-25.76461\\-170.8695\\9\\-27.89928\\-173.0672\\9\\-29.74113\\-175.3617\\9\\-31.26588\\-177.5356\\9\\-33.38591\\-181.2446\\9\\-34.55597\\-183.8606\\9\\-35.51778\\-186.3646\\9\\-36.7073\\-190.5943\\9\\-37.14925\\-192.93\\9\\-37.47027\\-195.3165\\9\\-37.62305\\-197.996\\9\\-37.55172\\-201.3841\\9\\-37.08222\\-205.1741\\9\\-36.47828\\-207.8301\\9\\-36.1259\\-209.0615\\9\\-35.02481\\-212.1933\\9\\-33.73475\\-214.8871\\9\\-32.56988\\-216.9276\\9\\-30.68651\\-219.584\\9\\-28.7129\\-221.8813\\9\\-26.32982\\-224.1456\\9\\-24.95306\\-225.2711\\9\\-22.80794\\-226.7836\\9\\-20.11026\\-228.3863\\9\\-17.95666\\-229.4615\\9\\-13.97597\\-231.0012\\9\\-10.92568\\-231.8589\\9\\-8.734808\\-232.3585\\9\\-5.55708\\-232.8296\\9\\-3.048317\\-233.0951\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "86" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.347774\\-234.2774\\11\\2.076297\\-234.2512\\11\\5.315486\\-234.076\\11\\8.891184\\-233.5704\\11\\12.76923\\-232.7454\\11\\15.01874\\-232.092\\11\\18.17616\\-230.8951\\11\\19.70145\\-230.2389\\11\\22.5713\\-228.7495\\11\\24.2843\\-227.6906\\11\\26.40683\\-226.1659\\11\\27.72368\\-225.0999\\11\\29.91719\\-223.0515\\11\\31.85921\\-220.8909\\11\\32.75888\\-219.7371\\11\\34.06079\\-217.8211\\11\\35.67154\\-215.0535\\11\\36.85835\\-212.443\\11\\38.08195\\-208.9933\\11\\38.54485\\-207.0529\\11\\39.00657\\-204.5316\\11\\39.21459\\-202.9322\\11\\39.45261\\-199.6305\\11\\39.32095\\-195.9739\\11\\38.9065\\-192.5048\\11\\38.4711\\-190.3198\\11\\37.71616\\-187.4484\\11\\37.20184\\-185.9004\\11\\35.70038\\-182.1832\\11\\34.86518\\-180.4969\\11\\33.22965\\-177.6419\\11\\31.78922\\-175.481\\11\\29.46731\\-172.6306\\11\\27.50459\\-170.6222\\11\\25.57172\\-168.9939\\11\\23.93461\\-167.8008\\11\\22.10848\\-166.709\\11\\18.96548\\-165.3339\\11\\17.47947\\-164.8615\\11\\15.0394\\-164.3373\\11\\12.10361\\-164.052\\11\\9.684925\\-164.0091\\11\\5.773968\\-164.1576\\11\\3.828449\\-164.3023\\11\\-2.873777\\-164.3022\\11\\-4.768305\\-164.1588\\11\\-8.708386\\-164.0091\\11\\-11.12704\\-164.052\\11\\-14.12973\\-164.3563\\11\\-16.50329\\-164.8615\\11\\-17.98896\\-165.3339\\11\\-21.13229\\-166.7092\\11\\-22.95804\\-167.8008\\11\\-24.59516\\-168.9939\\11\\-26.52803\\-170.6222\\11\\-28.49075\\-172.6306\\11\\-30.81266\\-175.481\\11\\-32.25309\\-177.6419\\11\\-33.88862\\-180.4969\\11\\-34.72403\\-182.1839\\11\\-36.22878\\-185.9097\\11\\-36.74054\\-187.4451\\11\\-37.49325\\-190.3164\\11\\-37.92682\\-192.4971\\11\\-38.34434\\-195.973\\11\\-38.47602\\-199.6328\\11\\-38.2383\\-202.9321\\11\\-38.03004\\-204.5313\\11\\-37.56659\\-207.1261\\11\\-37.10224\\-209.0008\\11\\-35.87864\\-212.4493\\11\\-34.08095\\-216.1853\\11\\-33.06963\\-217.8515\\11\\-31.78241\\-219.737\\11\\-30.88265\\-220.8909\\11\\-28.94056\\-223.0516\\11\\-27.72459\\-224.2173\\11\\-25.42918\\-226.166\\11\\-23.30767\\-227.6906\\11\\-21.59467\\-228.7496\\11\\-18.74289\\-230.2425\\11\\-15.78055\\-231.4655\\11\\-14.02753\\-232.0893\\11\\-11.78584\\-232.7469\\11\\-7.914277\\-233.5708\\11\\-4.331664\\-234.077\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "85" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "8.493884\\-234.5764\\13\\11.79889\\-233.9312\\13\\14.11177\\-233.2976\\13\\17.48217\\-232.1583\\13\\21.00282\\-230.5951\\13\\23.41281\\-229.274\\13\\26.76602\\-226.9787\\13\\28.83936\\-225.2561\\13\\30.94899\\-223.165\\13\\32.75066\\-221.0801\\13\\34.07261\\-219.2731\\13\\35.24554\\-217.4447\\13\\36.50222\\-215.1296\\13\\37.28791\\-213.442\\13\\38.0702\\-211.4309\\13\\38.88156\\-208.9017\\13\\39.72481\\-205.0045\\13\\40.0441\\-202.2794\\13\\40.19049\\-199.5818\\13\\40.13769\\-197.0911\\13\\39.80278\\-193.6548\\13\\39.22738\\-190.4314\\13\\38.45135\\-187.5511\\13\\37.5313\\-184.8195\\13\\36.23561\\-181.7441\\13\\35.25876\\-179.8088\\13\\34.27408\\-178.0789\\13\\32.52323\\-175.4213\\13\\30.94167\\-173.3975\\13\\29.6861\\-172.0036\\13\\27.91198\\-170.2863\\13\\25.3169\\-168.2355\\13\\23.68431\\-167.2091\\13\\21.5541\\-166.1696\\13\\19.30247\\-165.3401\\13\\16.11502\\-164.7093\\13\\13.49307\\-164.5035\\13\\11.23911\\-164.5566\\13\\6.408697\\-165.0268\\13\\3.100249\\-165.2863\\13\\-0.7164387\\-165.3562\\13\\-5.432432\\-165.0266\\13\\-10.26396\\-164.5568\\13\\-12.51007\\-164.5049\\13\\-15.12665\\-164.7087\\13\\-16.3662\\-164.8919\\13\\-18.32609\\-165.3402\\13\\-20.57754\\-166.1696\\13\\-22.70788\\-167.2092\\13\\-24.3404\\-168.2355\\13\\-26.93542\\-170.2863\\13\\-28.70954\\-172.0036\\13\\-29.96511\\-173.3975\\13\\-31.54667\\-175.4213\\13\\-33.29752\\-178.0789\\13\\-34.2822\\-179.8088\\13\\-35.25905\\-181.7441\\13\\-36.81007\\-185.4838\\13\\-37.62061\\-188.0353\\13\\-38.25008\\-190.4274\\13\\-38.82615\\-193.6542\\13\\-39.16125\\-197.0911\\13\\-39.21392\\-199.5818\\13\\-39.06759\\-202.2792\\13\\-38.7482\\-205.0048\\13\\-37.90586\\-208.8992\\13\\-36.99252\\-211.729\\13\\-36.31318\\-213.4341\\13\\-35.52634\\-215.1275\\13\\-34.27116\\-217.4413\\13\\-33.09589\\-219.2734\\13\\-31.7741\\-221.0801\\13\\-29.97243\\-223.165\\13\\-27.86122\\-225.2573\\13\\-25.7893\\-226.9787\\13\\-22.43624\\-229.274\\13\\-20.01815\\-230.5973\\13\\-17.40203\\-231.8029\\13\\-15.30777\\-232.6044\\13\\-10.82813\\-233.929\\13\\-7.524759\\-234.5817\\13\\-5.269984\\-234.904\\13\\-2.816839\\-235.1104\\13\\0.9473966\\-235.236\\13\\6.244745\\-234.9043\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "91" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.352428\\-235.8766\\15\\-0.2751435\\-236.0274\\15\\4.346042\\-235.8818\\15\\8.495686\\-235.379\\15\\11.06613\\-234.9151\\15\\14.32617\\-234.0538\\15\\16.99848\\-233.1746\\15\\19.38593\\-232.2192\\15\\21.40554\\-231.223\\15\\24.18315\\-229.6686\\15\\25.36932\\-228.9052\\15\\27.42297\\-227.392\\15\\28.83851\\-226.2276\\15\\30.91222\\-224.2525\\15\\33.00831\\-221.88\\15\\35.25417\\-218.7149\\15\\36.24412\\-217.0504\\15\\37.27632\\-215.0163\\15\\38.14688\\-213.0815\\15\\39.25492\\-209.8866\\15\\40.14484\\-206.1315\\15\\40.53278\\-203.5353\\15\\40.65158\\-202.2302\\15\\40.73747\\-199.5977\\15\\40.61519\\-195.4557\\15\\40.04453\\-191.5536\\15\\39.27789\\-188.2651\\15\\38.71294\\-186.3867\\15\\38.02491\\-184.4544\\15\\36.27225\\-180.55\\15\\35.15323\\-178.4959\\15\\33.48592\\-175.8985\\15\\31.2849\\-173.0847\\15\\29.07742\\-170.8158\\15\\27.71301\\-169.6174\\15\\25.43394\\-167.971\\15\\23.93298\\-167.1358\\15\\22.13282\\-166.3177\\15\\20.29844\\-165.7189\\15\\18.72643\\-165.3374\\15\\16.12563\\-165.0569\\15\\14.06328\\-165.0467\\15\\11.78314\\-165.1992\\15\\10.041\\-165.4037\\15\\6.943377\\-165.9\\15\\3.907112\\-166.2342\\15\\0.8798413\\-166.412\\15\\-0.6704234\\-166.3927\\15\\-3.197479\\-166.2017\\15\\-5.896914\\-165.9104\\15\\-9.107254\\-165.3954\\15\\-10.80505\\-165.199\\15\\-13.10921\\-165.0527\\15\\-15.15511\\-165.0575\\15\\-17.74988\\-165.3374\\15\\-19.32188\\-165.719\\15\\-21.15606\\-166.3176\\15\\-22.4703\\-166.8992\\15\\-24.35965\\-167.9235\\15\\-26.73643\\-169.6174\\15\\-28.10086\\-170.8158\\15\\-30.30834\\-173.0847\\15\\-32.50935\\-175.8985\\15\\-34.17667\\-178.4959\\15\\-35.29569\\-180.55\\15\\-37.04974\\-184.456\\15\\-37.73783\\-186.3914\\15\\-38.29824\\-188.2576\\15\\-39.0706\\-191.5646\\15\\-39.6387\\-195.4538\\15\\-39.74317\\-197.4321\\15\\-39.76262\\-199.6461\\15\\-39.67511\\-202.2437\\15\\-39.1681\\-206.1319\\15\\-38.27806\\-209.8794\\15\\-37.17265\\-213.073\\15\\-36.29976\\-215.0163\\15\\-35.26755\\-217.0504\\15\\-34.27761\\-218.7149\\15\\-32.03175\\-221.88\\15\\-29.93566\\-224.2525\\15\\-27.86196\\-226.2276\\15\\-26.44641\\-227.392\\15\\-24.39276\\-228.9052\\15\\-23.2063\\-229.6688\\15\\-20.88731\\-230.9883\\15\\-19.11937\\-231.8959\\15\\-16.00317\\-233.187\\15\\-13.31468\\-234.0595\\15\\-10.09784\\-234.9124\\15\\-7.404643\\-235.3997\\15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "91" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.029942\\-236.6653\\17\\2.010749\\-236.6631\\17\\4.446617\\-236.5433\\17\\7.80014\\-236.192\\17\\11.24284\\-235.5591\\17\\14.3904\\-234.7445\\17\\16.36345\\-234.1138\\17\\18.94065\\-233.0963\\17\\22.1008\\-231.612\\17\\24.14786\\-230.4455\\17\\25.90031\\-229.2962\\17\\28.79989\\-227.0577\\17\\30.52427\\-225.4877\\17\\32.30814\\-223.6189\\17\\33.45079\\-222.2632\\17\\34.81234\\-220.4238\\17\\36.2802\\-218.109\\17\\37.21424\\-216.3908\\17\\38.1212\\-214.5175\\17\\39.37437\\-211.2721\\17\\40.25782\\-208.0095\\17\\40.97256\\-204.1384\\17\\41.16975\\-201.4004\\17\\41.194\\-197.9985\\17\\40.995\\-194.4936\\17\\40.12784\\-189.6766\\17\\38.99094\\-185.823\\17\\37.74787\\-182.6521\\17\\36.88046\\-180.7916\\17\\35.49171\\-178.2528\\17\\34.59517\\-176.8215\\17\\33.08762\\-174.694\\17\\31.4337\\-172.7147\\17\\29.65073\\-170.9631\\17\\28.23744\\-169.74\\17\\26.13827\\-168.256\\17\\23.89013\\-167.0711\\17\\21.29716\\-166.1405\\17\\19.91508\\-165.8356\\17\\17.64164\\-165.5893\\17\\16.16661\\-165.5578\\17\\13.18897\\-165.7594\\17\\9.827169\\-166.2907\\17\\9.030597\\-166.4862\\17\\5.331411\\-167.0857\\17\\2.805104\\-167.2884\\17\\0.5181172\\-167.3798\\17\\-2.145707\\-167.2692\\17\\-4.359952\\-167.0851\\17\\-8.052878\\-166.4862\\17\\-8.839521\\-166.2936\\17\\-12.21871\\-165.7586\\17\\-14.4383\\-165.5712\\17\\-16.64768\\-165.5859\\17\\-18.93849\\-165.8356\\17\\-20.32041\\-166.1404\\17\\-22.96261\\-167.1066\\17\\-25.16241\\-168.2557\\17\\-27.26087\\-169.74\\17\\-28.67417\\-170.9631\\17\\-30.45713\\-172.7147\\17\\-32.11098\\-174.694\\17\\-33.61861\\-176.8215\\17\\-34.51515\\-178.2528\\17\\-35.90389\\-180.7916\\17\\-36.77374\\-182.6609\\17\\-38.05385\\-185.9387\\17\\-39.1563\\-189.6925\\17\\-40.01937\\-194.4906\\17\\-40.22412\\-197.8868\\17\\-40.25567\\-200.0251\\17\\-39.99991\\-204.1131\\17\\-39.27728\\-208.04\\17\\-38.3979\\-211.2717\\17\\-37.14464\\-214.5175\\17\\-36.23768\\-216.3908\\17\\-35.30364\\-218.109\\17\\-33.83577\\-220.4238\\17\\-32.47423\\-222.2632\\17\\-31.33158\\-223.6189\\17\\-29.5477\\-225.4877\\17\\-27.82333\\-227.0577\\17\\-24.92375\\-229.2962\\17\\-23.1713\\-230.4455\\17\\-21.11721\\-231.6143\\17\\-17.96264\\-233.0968\\17\\-15.38684\\-234.1138\\17\\-12.07484\\-235.1296\\17\\-8.607195\\-235.8893\\17\\-6.823508\\-236.192\\17\\-3.461445\\-236.5527\\17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "91" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.683462\\-237.1808\\19\\-0.3255929\\-237.2869\\19\\1.98873\\-237.2744\\19\\6.102846\\-236.9748\\19\\8.808264\\-236.6017\\19\\11.8226\\-236.0039\\19\\15.15961\\-235.084\\19\\17.59692\\-234.2435\\19\\21.17103\\-232.6884\\19\\23.70801\\-231.3148\\19\\25.63118\\-230.0909\\19\\27.22925\\-228.9643\\19\\29.64411\\-226.9581\\19\\31.27211\\-225.3938\\19\\32.6134\\-223.9785\\19\\33.65456\\-222.7374\\19\\34.92638\\-221.0197\\19\\36.92345\\-217.8707\\19\\37.80421\\-216.1634\\19\\39.01139\\-213.4186\\19\\40.21777\\-209.8514\\19\\40.93425\\-206.8082\\19\\41.44651\\-203.388\\19\\41.53868\\-201.9218\\19\\41.58962\\-198.2017\\19\\41.47086\\-195.6101\\19\\40.99016\\-192.0179\\19\\40.49805\\-189.7695\\19\\39.78902\\-187.1465\\19\\38.0587\\-182.4983\\19\\37.23079\\-180.7453\\19\\35.86929\\-178.3167\\19\\34.26572\\-175.836\\19\\33.18003\\-174.382\\19\\31.90347\\-172.8926\\19\\29.2744\\-170.4186\\19\\27.71636\\-169.2266\\19\\26.30185\\-168.3265\\19\\24.7761\\-167.5538\\19\\23.44883\\-167.0246\\19\\21.57928\\-166.4988\\19\\19.73483\\-166.2275\\19\\17.51628\\-166.082\\19\\13.82242\\-166.4349\\19\\11.24808\\-166.8884\\19\\6.648745\\-167.8427\\19\\2.705294\\-168.2977\\19\\-0.3347399\\-168.3679\\19\\-2.307163\\-168.2352\\19\\-5.671096\\-167.8429\\19\\-10.26944\\-166.8886\\19\\-14.32032\\-166.2309\\19\\-16.49104\\-166.0875\\19\\-19.59993\\-166.3339\\19\\-21.13187\\-166.6263\\19\\-23.80653\\-167.5589\\19\\-25.32434\\-168.3261\\19\\-26.7399\\-169.2267\\19\\-28.29752\\-170.4184\\19\\-30.92687\\-172.8926\\19\\-32.10453\\-174.2648\\19\\-33.28954\\-175.8364\\19\\-34.89272\\-178.3167\\19\\-36.25507\\-180.7468\\19\\-37.08184\\-182.4977\\19\\-38.81234\\-187.1461\\19\\-39.53094\\-189.7971\\19\\-39.99321\\-191.935\\19\\-40.49356\\-195.5714\\19\\-40.61342\\-198.1896\\19\\-40.60046\\-200.9537\\19\\-40.46983\\-203.3885\\19\\-39.96544\\-206.7779\\19\\-39.24426\\-209.8392\\19\\-38.03483\\-213.4186\\19\\-36.82764\\-216.1634\\19\\-35.94689\\-217.8707\\19\\-33.94993\\-221.0195\\19\\-32.68019\\-222.7339\\19\\-31.6368\\-223.9785\\19\\-30.29556\\-225.3937\\19\\-28.66755\\-226.958\\19\\-26.25268\\-228.9643\\19\\-24.65469\\-230.0906\\19\\-22.73081\\-231.3152\\19\\-20.19467\\-232.6883\\19\\-16.62036\\-234.2435\\19\\-14.18234\\-235.0842\\19\\-10.84966\\-236.0035\\19\\-7.831686\\-236.6017\\19\\-5.126106\\-236.9749\\19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "89" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-7.395645\\-237.1539\\21\\-5.306133\\-237.4465\\21\\-1.839133\\-237.7328\\21\\-0.2842809\\-237.7869\\21\\2.888096\\-237.7201\\21\\6.287021\\-237.4457\\21\\8.372333\\-237.1539\\21\\12.0181\\-236.4454\\21\\15.61547\\-235.4113\\21\\19.22269\\-234.0662\\21\\21.98839\\-232.7559\\21\\25.03997\\-231.0009\\21\\26.98458\\-229.6644\\21\\29.05565\\-227.992\\21\\31.54506\\-225.6577\\21\\32.48167\\-224.6909\\21\\34.09058\\-222.7743\\21\\35.60046\\-220.6714\\21\\37.31148\\-217.8795\\21\\38.7951\\-214.7482\\21\\39.74943\\-212.3699\\21\\40.51642\\-209.866\\21\\40.99348\\-208.0448\\21\\41.45464\\-205.5703\\21\\41.80071\\-202.592\\21\\41.88151\\-201.3297\\21\\41.88874\\-197.8653\\21\\41.81102\\-196.4728\\21\\41.45572\\-193.2742\\21\\40.96309\\-190.6114\\21\\40.59074\\-189.0445\\21\\39.74879\\-186.2077\\21\\38.86715\\-183.821\\21\\37.84655\\-181.5504\\21\\36.43913\\-178.8346\\21\\34.43165\\-175.7988\\21\\33.05247\\-174.0063\\21\\31.33508\\-172.1742\\21\\29.6805\\-170.6856\\21\\27.39972\\-169.0863\\21\\24.77579\\-167.7686\\21\\22.22219\\-166.998\\21\\20.05033\\-166.6939\\21\\17.04919\\-166.7386\\21\\13.51682\\-167.2449\\21\\6.849967\\-168.7165\\21\\4.290162\\-169.1081\\21\\1.848251\\-169.3105\\21\\-1.52107\\-169.2661\\21\\-4.729115\\-168.9312\\21\\-8.234799\\-168.2235\\21\\-12.55383\\-167.2427\\21\\-16.22912\\-166.7331\\21\\-19.07346\\-166.6938\\21\\-21.30426\\-167.0212\\21\\-23.31525\\-167.5782\\21\\-24.7057\\-168.1694\\21\\-26.43823\\-169.0961\\21\\-28.71857\\-170.7057\\21\\-30.35854\\-172.1742\\21\\-32.07625\\-174.0068\\21\\-33.45519\\-175.7989\\21\\-35.46249\\-178.8344\\21\\-37.13916\\-182.1024\\21\\-37.89063\\-183.8214\\21\\-38.77219\\-186.2077\\21\\-39.61443\\-189.0458\\21\\-39.98876\\-190.6182\\21\\-40.47935\\-193.2755\\21\\-40.83527\\-196.4711\\21\\-40.92815\\-199.0401\\21\\-40.82614\\-202.5875\\21\\-40.47823\\-205.5696\\21\\-40.01206\\-208.064\\21\\-39.53767\\-209.8693\\21\\-38.77287\\-212.3699\\21\\-37.81854\\-214.7482\\21\\-36.33566\\-217.8782\\21\\-34.62394\\-220.6713\\21\\-32.88985\\-223.0571\\21\\-31.49877\\-224.6991\\21\\-30.56858\\-225.6576\\21\\-28.07457\\-227.9989\\21\\-26.00935\\-229.6635\\21\\-24.12276\\-230.9619\\21\\-21.01183\\-232.7559\\21\\-18.24613\\-234.0662\\21\\-14.63894\\-235.4113\\21\\-11.04153\\-236.4454\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "87" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.753596\\-237.9068\\23\\-7.798041\\-237.4943\\23\\-12.49881\\-236.4653\\23\\-14.92717\\-235.7205\\23\\-17.91876\\-234.5966\\23\\-20.97709\\-233.1124\\23\\-23.39151\\-231.7868\\23\\-24.52939\\-231.0763\\23\\-26.46242\\-229.6994\\23\\-28.32055\\-228.1715\\23\\-30.59839\\-226.0416\\23\\-32.9426\\-223.4142\\23\\-34.19903\\-221.718\\23\\-35.41452\\-219.9157\\23\\-37.05581\\-216.9329\\23\\-37.93576\\-215.1135\\23\\-39.16697\\-211.8353\\23\\-40.049\\-208.7443\\23\\-40.48323\\-206.6258\\23\\-40.93272\\-203.2229\\23\\-41.04909\\-198.6833\\23\\-40.91858\\-195.6227\\23\\-40.51166\\-192.5473\\23\\-40.11248\\-190.5581\\23\\-39.25061\\-187.2482\\23\\-38.19663\\-184.3367\\23\\-37.45996\\-182.5188\\23\\-35.485\\-178.6937\\23\\-33.64775\\-175.9321\\23\\-32.37863\\-174.3356\\23\\-30.103\\-171.9627\\23\\-27.50261\\-169.9239\\23\\-24.99735\\-168.5609\\23\\-23.94234\\-168.1558\\23\\-22.20877\\-167.6713\\23\\-20.17484\\-167.3306\\23\\-17.85983\\-167.2667\\23\\-15.82807\\-167.4507\\23\\-12.94633\\-167.9768\\23\\-7.278864\\-169.34\\23\\-5.3747\\-169.7353\\23\\-2.782075\\-170.1234\\23\\-0.1803772\\-170.3169\\23\\1.211557\\-170.3144\\23\\3.757592\\-170.1218\\23\\6.351666\\-169.7354\\23\\8.256512\\-169.3402\\23\\13.90996\\-167.9789\\23\\16.61414\\-167.4835\\23\\18.83676\\-167.2667\\23\\21.15127\\-167.3306\\23\\23.17904\\-167.6704\\23\\25.95107\\-168.5521\\23\\28.50536\\-169.9458\\23\\30.09743\\-171.1355\\23\\31.61209\\-172.4674\\23\\33.33221\\-174.3126\\23\\34.67731\\-175.9927\\23\\36.46438\\-178.6976\\23\\38.05774\\-181.6987\\23\\38.93901\\-183.6968\\23\\40.22915\\-187.2592\\23\\41.07985\\-190.5024\\23\\41.47528\\-192.4789\\23\\41.89619\\-195.6398\\23\\42.01239\\-198.1642\\23\\42.0208\\-200.5878\\23\\41.90052\\-203.3836\\23\\41.46058\\-206.6285\\23\\41.02722\\-208.7396\\23\\40.14355\\-211.8357\\23\\38.91092\\-215.1169\\23\\38.04168\\-216.9199\\23\\36.39198\\-219.9142\\23\\35.17476\\-221.7196\\23\\33.90102\\-223.4383\\23\\31.57782\\-226.0384\\23\\28.89132\\-228.5272\\23\\27.4328\\-229.703\\23\\24.36909\\-231.7857\\23\\21.95364\\-233.1124\\23\\18.89659\\-234.5961\\23\\15.90339\\-235.7207\\23\\13.48157\\-236.4646\\23\\8.774865\\-237.4942\\23\\5.767869\\-237.9031\\23\\0.4896935\\-238.1725\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "88" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "4.048399\\-238.3469\\25\\7.277422\\-238.0141\\25\\9.884943\\-237.5736\\25\\13.97069\\-236.601\\25\\16.38051\\-235.8169\\25\\19.9451\\-234.3963\\25\\21.37597\\-233.7215\\25\\24.86881\\-231.7308\\25\\26.40133\\-230.7061\\25\\28.8117\\-228.8449\\25\\31.13347\\-226.7313\\25\\33.31998\\-224.3756\\25\\35.48628\\-221.5382\\25\\36.58189\\-219.8341\\25\\38.12429\\-217.0754\\25\\38.92406\\-215.3398\\25\\39.79585\\-213.1714\\25\\40.99886\\-209.2183\\25\\41.42735\\-207.3092\\25\\41.85594\\-204.6539\\25\\42.12229\\-200.6738\\25\\42.12553\\-198.9667\\25\\41.89124\\-194.9655\\25\\41.41027\\-191.7418\\25\\40.62634\\-188.4188\\25\\39.39574\\-184.7328\\25\\38.24226\\-182.1304\\25\\36.95335\\-179.5813\\25\\35.21127\\-176.7896\\25\\33.375\\-174.4627\\25\\32.22188\\-173.2283\\25\\29.96692\\-171.2278\\25\\27.81486\\-169.8414\\25\\25.13781\\-168.6561\\25\\23.87956\\-168.305\\25\\21.90726\\-167.9758\\25\\19.20375\\-167.9256\\25\\17.32254\\-168.1313\\25\\14.95999\\-168.5373\\25\\12.37971\\-169.1585\\25\\8.008792\\-170.3103\\25\\4.971269\\-170.8907\\25\\2.334427\\-171.2197\\25\\0.4871397\\-171.2889\\25\\-1.371287\\-171.2183\\25\\-4.08017\\-170.8727\\25\\-7.032401\\-170.3103\\25\\-11.41537\\-169.1541\\25\\-15.55213\\-168.2392\\25\\-18.22731\\-167.9256\\25\\-20.93111\\-167.9758\\25\\-22.83704\\-168.2807\\25\\-24.13958\\-168.6436\\25\\-25.78547\\-169.3058\\25\\-27.90437\\-170.4867\\25\\-29.13807\\-171.3391\\25\\-31.32607\\-173.3061\\25\\-32.48741\\-174.5445\\25\\-34.35188\\-176.9543\\25\\-35.94552\\-179.5131\\25\\-37.20418\\-181.9399\\25\\-38.41994\\-184.7355\\25\\-39.65216\\-188.4303\\25\\-40.46104\\-191.8705\\25\\-40.91464\\-194.9659\\25\\-41.14793\\-198.68\\25\\-41.16267\\-199.9126\\25\\-40.88074\\-204.6442\\25\\-40.42034\\-207.4778\\25\\-40.06873\\-209.0601\\25\\-38.82009\\-213.1691\\25\\-38.15368\\-214.8128\\25\\-36.54058\\-218.1881\\25\\-35.60959\\-219.8293\\25\\-34.50632\\-221.5435\\25\\-32.34322\\-224.3759\\25\\-30.18397\\-226.7013\\25\\-27.83978\\-228.8404\\25\\-25.41993\\-230.7106\\25\\-23.88605\\-231.7353\\25\\-20.39869\\-233.722\\25\\-18.95782\\-234.4007\\25\\-15.40254\\-235.8178\\25\\-12.97344\\-236.5978\\25\\-10.60687\\-237.2122\\25\\-6.377011\\-238.0053\\25\\-2.883398\\-238.3622\\25\\0.4586823\\-238.4255\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "93" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.03459688\\-238.6139\\27\\4.904679\\-238.4729\\27\\7.818363\\-238.1249\\27\\9.986352\\-237.7584\\27\\13.27563\\-236.9786\\27\\16.60685\\-235.917\\27\\18.22424\\-235.2912\\27\\22.26905\\-233.4154\\27\\24.6817\\-231.9871\\27\\25.95901\\-231.1438\\27\\28.17739\\-229.4771\\27\\29.45213\\-228.4237\\27\\31.67609\\-226.2693\\27\\33.61864\\-224.0833\\27\\35.45016\\-221.6339\\27\\36.9472\\-219.2343\\27\\38.94528\\-215.2966\\27\\39.83692\\-213.0724\\27\\40.61589\\-210.6761\\27\\41.40452\\-207.3687\\27\\41.89172\\-204.0721\\27\\42.06532\\-200.765\\27\\42.08072\\-198.9393\\27\\41.88657\\-195.2258\\27\\41.48308\\-192.4421\\27\\41.03865\\-190.2398\\27\\40.21426\\-187.2357\\27\\39.06013\\-184.1378\\27\\38.06069\\-181.8863\\27\\36.43656\\-178.8604\\27\\35.03962\\-176.8033\\27\\33.86467\\-175.2868\\27\\32.52273\\-173.8039\\27\\31.52626\\-172.8636\\27\\29.41476\\-171.2155\\27\\27.92555\\-170.3192\\27\\26.40118\\-169.5958\\27\\24.98025\\-169.1189\\27\\22.60722\\-168.6688\\27\\20.19957\\-168.5711\\27\\17.88089\\-168.7913\\27\\16.07779\\-169.0979\\27\\14.02724\\-169.5716\\27\\9.145086\\-170.916\\27\\6.601874\\-171.5438\\27\\2.729523\\-172.1479\\27\\0.1094743\\-172.2408\\27\\-1.757627\\-172.1476\\27\\-5.622898\\-171.5443\\27\\-8.136178\\-170.9295\\27\\-13.40357\\-169.4913\\27\\-15.09846\\-169.0974\\27\\-16.90388\\-168.7914\\27\\-19.22301\\-168.5711\\27\\-21.63097\\-168.6688\\27\\-23.58984\\-169.0176\\27\\-25.42688\\-169.5959\\27\\-26.93791\\-170.3158\\27\\-28.22816\\-171.0692\\27\\-29.96432\\-172.3705\\27\\-31.69272\\-173.9609\\27\\-32.89073\\-175.2887\\27\\-34.87782\\-177.9464\\27\\-36.23392\\-180.1901\\27\\-37.38808\\-182.5407\\27\\-38.08374\\-184.1379\\27\\-39.23799\\-187.2373\\27\\-40.11014\\-190.525\\27\\-40.51105\\-192.4794\\27\\-40.91004\\-195.2247\\27\\-41.02796\\-197.2805\\27\\-41.10802\\-200.3053\\27\\-40.91162\\-204.097\\27\\-40.4935\\-206.9815\\27\\-39.98569\\-209.3535\\27\\-38.86222\\-213.0662\\27\\-37.98161\\-215.2875\\27\\-37.17999\\-217.013\\27\\-35.96891\\-219.2391\\27\\-34.90492\\-220.9825\\27\\-33.97001\\-222.3341\\27\\-32.40631\\-224.3739\\27\\-30.68747\\-226.2804\\27\\-28.80373\\-228.136\\27\\-27.8726\\-228.9475\\27\\-25.56764\\-230.7291\\27\\-23.38526\\-232.1795\\27\\-21.05225\\-233.5269\\27\\-16.71018\\-235.533\\27\\-13.36723\\-236.6658\\27\\-8.980839\\-237.7621\\27\\-6.912771\\-238.1162\\27\\-3.682885\\-238.4816\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "86" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.413155\\-238.7541\\29\\5.023041\\-238.5659\\29\\8.150431\\-238.1874\\29\\10.27469\\-237.7945\\29\\13.26938\\-237.0727\\29\\17.56068\\-235.6528\\29\\21.21932\\-233.993\\29\\22.79973\\-233.1467\\29\\26.12589\\-231.0507\\29\\28.66479\\-229.0784\\29\\30.45506\\-227.4759\\29\\33.03888\\-224.7294\\29\\33.99401\\-223.5474\\29\\36.15505\\-220.4792\\29\\37.20221\\-218.6946\\29\\38.90091\\-215.2383\\29\\39.80353\\-212.8287\\29\\41.01338\\-208.7018\\29\\41.45699\\-206.4105\\29\\41.84095\\-203.4432\\29\\41.95745\\-200.293\\29\\41.83922\\-196.0952\\29\\41.4432\\-193.0125\\29\\40.96298\\-190.5797\\29\\40.09978\\-187.421\\29\\38.52546\\-183.272\\29\\37.61929\\-181.3711\\29\\35.48587\\-177.8592\\29\\34.25529\\-176.1794\\29\\32.52202\\-174.2382\\29\\30.02571\\-172.1448\\29\\28.87105\\-171.3671\\29\\26.30465\\-170.1524\\29\\23.79359\\-169.4824\\29\\22.00226\\-169.2916\\29\\20.29381\\-169.3234\\29\\18.33458\\-169.5027\\29\\14.76035\\-170.2191\\29\\11.33772\\-171.2109\\29\\7.438661\\-172.2641\\29\\5.378239\\-172.7119\\29\\3.424526\\-172.9936\\29\\0.4580991\\-173.1884\\29\\-2.457453\\-172.9929\\29\\-4.401687\\-172.7118\\29\\-6.824599\\-172.1784\\29\\-11.68959\\-170.7874\\29\\-15.42822\\-169.8439\\29\\-17.35658\\-169.503\\29\\-19.31737\\-169.3233\\29\\-21.02546\\-169.2916\\29\\-22.81627\\-169.4822\\29\\-25.33453\\-170.1537\\29\\-27.89765\\-171.3699\\29\\-29.0554\\-172.1488\\29\\-31.54563\\-174.2385\\29\\-33.27873\\-176.1794\\29\\-34.50931\\-177.8592\\29\\-36.64312\\-181.3722\\29\\-37.54911\\-183.2725\\29\\-39.12331\\-187.4211\\29\\-39.98946\\-190.5872\\29\\-40.46658\\-193.0122\\29\\-40.86082\\-196.0722\\29\\-40.97685\\-198.9644\\29\\-40.93272\\-202.2657\\29\\-40.85752\\-203.4983\\29\\-40.4788\\-206.4231\\29\\-40.03172\\-208.7132\\29\\-38.82713\\-212.8279\\29\\-37.92532\\-215.2365\\29\\-36.22628\\-218.6937\\29\\-35.17873\\-220.4788\\29\\-33.01707\\-223.5479\\29\\-32.06234\\-224.7295\\29\\-29.65695\\-227.3036\\29\\-27.79914\\-228.9852\\29\\-26.26655\\-230.21\\29\\-24.12762\\-231.7298\\29\\-22.121\\-232.9879\\29\\-20.16258\\-234.0261\\29\\-16.4124\\-235.7099\\29\\-12.28331\\-237.077\\29\\-9.271958\\-237.7982\\29\\-7.467124\\-238.1452\\29\\-4.080799\\-238.5643\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.4901226\\-238.7366\\31\\4.307921\\-238.6424\\31\\7.446903\\-238.2924\\31\\9.917973\\-237.8726\\31\\13.9465\\-236.8512\\31\\17.67932\\-235.5356\\31\\21.27737\\-233.9167\\31\\25.13845\\-231.6337\\31\\27.64256\\-229.787\\31\\28.9626\\-228.6737\\31\\31.36633\\-226.3819\\31\\33.49854\\-223.9586\\31\\35.39708\\-221.2745\\31\\37.55659\\-217.6499\\31\\38.74607\\-215.0237\\31\\39.73824\\-212.4469\\31\\40.47105\\-209.8965\\31\\40.98198\\-207.8148\\31\\41.40693\\-205.2838\\31\\41.68865\\-201.8148\\31\\41.75964\\-199.5409\\31\\41.41822\\-194.4963\\31\\40.99544\\-191.8885\\31\\40.09607\\-188.3015\\31\\39.31947\\-186.007\\31\\37.98592\\-182.7767\\31\\37.09343\\-181.0414\\31\\35.54602\\-178.4887\\31\\33.86545\\-176.2896\\31\\32.62204\\-174.9317\\31\\31.27496\\-173.7163\\31\\29.66087\\-172.4931\\31\\28.41368\\-171.7478\\31\\26.78667\\-171.0172\\31\\24.1816\\-170.2549\\31\\21.31641\\-170.0368\\31\\19.59637\\-170.1471\\31\\17.39042\\-170.4745\\31\\15.19672\\-170.9739\\31\\7.979877\\-173.0299\\31\\4.596751\\-173.7646\\31\\1.916388\\-174.0483\\31\\-0.6310761\\-174.0825\\31\\-3.613085\\-173.7657\\31\\-7.004896\\-173.0296\\31\\-12.193\\-171.526\\31\\-16.41236\\-170.4641\\31\\-18.61145\\-170.1465\\31\\-20.35093\\-170.0359\\31\\-23.20504\\-170.2549\\31\\-25.8102\\-171.0172\\31\\-27.43696\\-171.7478\\31\\-28.6843\\-172.4931\\31\\-30.2984\\-173.7163\\31\\-31.64548\\-174.9317\\31\\-32.88889\\-176.2896\\31\\-34.56945\\-178.4887\\31\\-36.11686\\-181.0414\\31\\-37.00936\\-182.7767\\31\\-38.34291\\-186.007\\31\\-39.11985\\-188.3023\\31\\-39.98562\\-191.7552\\31\\-40.4445\\-194.524\\31\\-40.76713\\-198.9238\\31\\-40.70885\\-201.8533\\31\\-40.46113\\-205.0827\\31\\-40.02164\\-207.7572\\31\\-39.20723\\-210.9518\\31\\-38.76167\\-212.4469\\31\\-37.76955\\-215.0235\\31\\-36.58002\\-217.6499\\31\\-34.42748\\-221.2671\\31\\-32.52197\\-223.9586\\31\\-30.99468\\-225.7379\\31\\-28.32024\\-228.3686\\31\\-26.19358\\-230.1669\\31\\-24.15025\\-231.641\\31\\-20.29691\\-233.9186\\31\\-17.91772\\-235.0095\\31\\-15.4289\\-236.0352\\31\\-12.9876\\-236.8521\\31\\-8.942101\\-237.8723\\31\\-6.478204\\-238.292\\31\\-3.542845\\-238.6289\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "90" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.4953977\\-238.7004\\33\\2.750556\\-238.6575\\33\\6.656632\\-238.3173\\33\\9.024737\\-237.942\\33\\13.48291\\-236.8813\\33\\16.08524\\-236.0259\\33\\19.23837\\-234.7399\\33\\21.7297\\-233.4525\\33\\24.23479\\-231.9745\\33\\26.6918\\-230.2872\\33\\29.07076\\-228.273\\33\\32.02996\\-225.3131\\33\\33.16754\\-223.9576\\33\\35.50502\\-220.6669\\33\\37.07004\\-217.9509\\33\\37.89184\\-216.2903\\33\\39.45831\\-212.2763\\33\\40.24522\\-209.568\\33\\40.99987\\-205.9013\\33\\41.36486\\-202.1829\\33\\41.44279\\-200.4987\\33\\41.33272\\-197.2349\\33\\40.95243\\-193.6895\\33\\40.10103\\-189.631\\33\\39.23831\\-186.8839\\33\\38.54536\\-184.9983\\33\\37.7583\\-183.2423\\33\\36.59358\\-180.9804\\33\\35.20951\\-178.8038\\33\\33.4445\\-176.5375\\33\\32.18155\\-175.2398\\33\\30.51949\\-173.8254\\33\\28.40141\\-172.493\\33\\26.19894\\-171.5501\\33\\25.01247\\-171.2166\\33\\23.32162\\-170.953\\33\\20.72319\\-170.8793\\33\\18.1765\\-171.1597\\33\\16.3128\\-171.5532\\33\\12.56025\\-172.5728\\33\\9.754065\\-173.4435\\33\\7.603109\\-174.0198\\33\\5.220454\\-174.5403\\33\\3.43474\\-174.8145\\33\\1.153885\\-174.9719\\33\\-0.3174352\\-174.9824\\33\\-2.459932\\-174.8144\\33\\-4.238948\\-174.5412\\33\\-6.626546\\-174.0198\\33\\-8.777449\\-173.4435\\33\\-13.63095\\-171.9926\\33\\-16.07005\\-171.3863\\33\\-18.26521\\-171.0082\\33\\-19.89178\\-170.8556\\33\\-22.34499\\-170.953\\33\\-24.03591\\-171.2166\\33\\-25.73358\\-171.7285\\33\\-28.26204\\-172.9639\\33\\-29.54293\\-173.8254\\33\\-31.20499\\-175.2398\\33\\-32.46794\\-176.5375\\33\\-34.23293\\-178.8041\\33\\-35.61702\\-180.9804\\33\\-36.78174\\-183.2423\\33\\-37.56881\\-184.9983\\33\\-38.26184\\-186.884\\33\\-39.12965\\-189.6468\\33\\-40.01433\\-193.8777\\33\\-40.3143\\-196.8376\\33\\-40.4475\\-198.8009\\33\\-40.38829\\-202.2036\\33\\-40.04157\\-205.8176\\33\\-39.26876\\-209.5669\\33\\-38.48176\\-212.2762\\33\\-36.91528\\-216.2903\\33\\-36.09344\\-217.9508\\33\\-34.97908\\-219.9547\\33\\-33.6489\\-221.9684\\33\\-32.19098\\-223.9576\\33\\-30.47704\\-225.9456\\33\\-28.08905\\-228.2809\\33\\-25.72135\\-230.283\\33\\-23.94052\\-231.5493\\33\\-21.15728\\-233.2631\\33\\-18.26126\\-234.7402\\33\\-15.10819\\-236.0256\\33\\-12.51236\\-236.8809\\33\\-8.047938\\-237.9421\\33\\-5.483054\\-238.3414\\33\\-2.218568\\-238.6264\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "85" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.000859\\-238.4568\\35\\2.036119\\-238.4849\\35\\4.143352\\-238.3752\\35\\6.613834\\-238.1095\\35\\9.514951\\-237.627\\35\\12.33269\\-236.9785\\35\\15.53581\\-235.954\\35\\19.42916\\-234.3671\\35\\22.94777\\-232.4604\\35\\25.02822\\-231.1092\\35\\27.5958\\-229.1517\\35\\29.03459\\-227.8704\\35\\31.28551\\-225.6089\\35\\32.91689\\-223.6862\\35\\35.34478\\-220.2166\\35\\36.57921\\-218.0723\\35\\37.74644\\-215.6492\\35\\38.42889\\-213.9913\\35\\39.35489\\-211.3383\\35\\40.40844\\-206.7554\\35\\40.92302\\-202.2714\\35\\41.00206\\-199.7695\\35\\40.93535\\-197.9866\\35\\40.66289\\-195.0022\\35\\40.07468\\-191.502\\35\\39.24739\\-188.4096\\35\\38.50623\\-186.2061\\35\\36.90047\\-182.6232\\35\\36.08315\\-181.1808\\35\\34.83999\\-179.2665\\35\\32.98299\\-176.9483\\35\\30.91133\\-174.9926\\35\\29.24399\\-173.817\\35\\26.68323\\-172.5698\\35\\25.37802\\-172.1649\\35\\23.34433\\-171.7898\\35\\20.98104\\-171.7251\\35\\19.32048\\-171.8611\\35\\16.92815\\-172.2928\\35\\14.67541\\-172.8482\\35\\10.65421\\-174.0508\\35\\8.156789\\-174.7474\\35\\4.922141\\-175.4625\\35\\2.723269\\-175.7374\\35\\0.4495099\\-175.8301\\35\\-1.732899\\-175.7384\\35\\-3.945446\\-175.4625\\35\\-7.180226\\-174.7474\\35\\-12.94566\\-173.0651\\35\\-15.53978\\-172.3788\\35\\-18.24297\\-171.8915\\35\\-20.00237\\-171.7255\\35\\-22.36777\\-171.7898\\35\\-24.40134\\-172.1649\\35\\-25.7159\\-172.5713\\35\\-28.26852\\-173.8174\\35\\-29.93477\\-174.9926\\35\\-32.00647\\-176.9484\\35\\-33.86517\\-179.27\\35\\-35.10661\\-181.1808\\35\\-35.92391\\-182.6232\\35\\-37.53215\\-186.2058\\35\\-38.27248\\-188.4124\\35\\-39.10156\\-191.5144\\35\\-39.68585\\-194.9945\\35\\-39.97252\\-198.107\\35\\-40.01736\\-201.139\\35\\-39.59502\\-205.6914\\35\\-39.2518\\-207.7293\\35\\-38.3785\\-211.3382\\35\\-37.45229\\-213.9914\\35\\-36.76987\\-215.6492\\35\\-35.60251\\-218.0725\\35\\-34.37028\\-220.2115\\35\\-31.94033\\-223.6862\\35\\-30.30895\\-225.6089\\35\\-28.05807\\-227.8703\\35\\-26.61924\\-229.1517\\35\\-24.0249\\-231.129\\35\\-21.98286\\-232.4527\\35\\-18.45258\\-234.3672\\35\\-14.5715\\-235.9517\\35\\-11.35603\\-236.9786\\35\\-8.538386\\-237.627\\35\\-5.602347\\-238.1122\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "87" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.61614\\-237.6672\\37\\-10.98535\\-236.7354\\37\\-14.51257\\-235.6436\\37\\-17.65323\\-234.3289\\37\\-21.22044\\-232.4753\\37\\-23.51953\\-231.0013\\37\\-24.98857\\-229.9255\\37\\-27.8242\\-227.5122\\37\\-29.54052\\-225.7867\\37\\-30.79133\\-224.3732\\37\\-32.45856\\-222.2233\\37\\-33.85873\\-220.1125\\37\\-35.11557\\-217.9072\\37\\-35.85318\\-216.4401\\37\\-37.16885\\-213.3141\\37\\-38.003\\-210.7243\\37\\-38.43382\\-209.0325\\37\\-39.0409\\-205.897\\37\\-39.43265\\-202.0462\\37\\-39.37213\\-197.2073\\37\\-38.91679\\-193.5749\\37\\-38.23898\\-190.3668\\37\\-37.60628\\-188.2453\\37\\-36.71917\\-185.776\\37\\-35.76009\\-183.722\\37\\-34.08898\\-180.7492\\37\\-33.02569\\-179.2651\\37\\-31.76208\\-177.7688\\37\\-30.65273\\-176.6622\\37\\-29.07246\\-175.3406\\37\\-27.88852\\-174.5473\\37\\-26.47118\\-173.8304\\37\\-25.22582\\-173.3481\\37\\-23.84299\\-172.9659\\37\\-21.62577\\-172.6531\\37\\-20.26233\\-172.6532\\37\\-17.86761\\-172.8491\\37\\-14.26632\\-173.589\\37\\-8.348366\\-175.2729\\37\\-4.379842\\-176.2158\\37\\-2.388492\\-176.495\\37\\0.1449418\\-176.6609\\37\\1.875269\\-176.6272\\37\\5.358457\\-176.2152\\37\\9.324851\\-175.2729\\37\\15.23803\\-173.5915\\37\\18.02307\\-172.979\\37\\21.24292\\-172.6531\\37\\22.60233\\-172.6531\\37\\24.81956\\-172.9659\\37\\26.86782\\-173.5768\\37\\28.85266\\-174.5411\\37\\30.04928\\-175.3407\\37\\31.6293\\-176.6622\\37\\32.73854\\-177.7687\\37\\33.68728\\-178.8876\\37\\35.07052\\-180.757\\37\\36.73661\\-183.7219\\37\\37.72141\\-185.852\\37\\38.25498\\-187.2657\\37\\39.2155\\-190.3667\\37\\39.89351\\-193.5759\\37\\40.34883\\-197.2083\\37\\40.40963\\-202.048\\37\\40.01748\\-205.8969\\37\\39.41037\\-209.0326\\37\\38.99327\\-210.6581\\37\\37.94262\\-213.8319\\37\\36.82975\\-216.4401\\37\\36.09213\\-217.9072\\37\\34.83552\\-220.1121\\37\\33.43513\\-222.2233\\37\\31.76789\\-224.3732\\37\\30.51708\\-225.7867\\37\\28.80077\\-227.5122\\37\\25.96513\\-229.9255\\37\\24.49606\\-231.0013\\37\\22.19667\\-232.4754\\37\\18.62989\\-234.3289\\37\\16.48496\\-235.2552\\37\\14.84352\\-235.8546\\37\\11.9587\\-236.7358\\37\\7.592703\\-237.6672\\37\\5.001103\\-237.9932\\37\\2.409481\\-238.1873\\37\\-1.532403\\-238.1847\\37\\-4.024491\\-237.9932\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "83" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.702011\\-237.6129\\39\\-1.211487\\-237.7944\\39\\2.181149\\-237.7945\\39\\4.685203\\-237.6135\\39\\7.860736\\-237.1998\\39\\11.88129\\-236.3153\\39\\14.14131\\-235.6363\\39\\16.36092\\-234.8151\\39\\18.63998\\-233.816\\39\\20.80708\\-232.6991\\39\\23.50611\\-231.068\\39\\26.56095\\-228.7745\\39\\28.37767\\-227.1652\\39\\30.90448\\-224.5071\\39\\32.53694\\-222.4393\\39\\33.87878\\-220.5102\\39\\35.12926\\-218.4678\\39\\36.53879\\-215.611\\39\\37.93586\\-211.9901\\39\\38.7508\\-209.0889\\39\\39.34272\\-205.9254\\39\\39.67249\\-203.3363\\39\\39.78941\\-200.5734\\39\\39.75761\\-198.8169\\39\\39.51723\\-195.7409\\39\\39.00574\\-192.5483\\39\\38.46976\\-190.2929\\39\\37.64039\\-187.6277\\39\\36.67556\\-185.2806\\39\\35.34\\-182.7097\\39\\33.48629\\-179.905\\39\\32.07675\\-178.2744\\39\\29.92944\\-176.3831\\39\\28.30461\\-175.3548\\39\\26.20537\\-174.3951\\39\\23.68919\\-173.7934\\39\\22.16423\\-173.6378\\39\\19.27844\\-173.7463\\39\\15.70568\\-174.3975\\39\\8.223543\\-176.3965\\39\\5.378874\\-177.0056\\39\\3.461764\\-177.2816\\39\\1.472076\\-177.4337\\39\\-0.4933432\\-177.4327\\39\\-2.466461\\-177.2858\\39\\-4.045619\\-177.0645\\39\\-7.23469\\-176.3978\\39\\-14.72956\\-174.3975\\39\\-18.29946\\-173.7507\\39\\-21.1878\\-173.6378\\39\\-22.71219\\-173.7935\\39\\-24.21482\\-174.0921\\39\\-26.08353\\-174.7365\\39\\-27.50921\\-175.4565\\39\\-28.95288\\-176.3831\\39\\-31.10019\\-178.2744\\39\\-32.50885\\-179.9039\\39\\-34.01783\\-182.1251\\39\\-35.48392\\-184.8132\\39\\-36.6627\\-187.6236\\39\\-37.48743\\-190.283\\39\\-38.03294\\-192.571\\39\\-38.54067\\-195.7409\\39\\-38.78103\\-198.8165\\39\\-38.81285\\-200.5735\\39\\-38.69593\\-203.3363\\39\\-38.36618\\-205.9219\\39\\-37.77484\\-209.0889\\39\\-36.61217\\-212.9868\\39\\-35.56226\\-215.6108\\39\\-34.15272\\-218.4678\\39\\-32.90222\\-220.5102\\39\\-31.56038\\-222.4393\\39\\-29.92792\\-224.5071\\39\\-27.40102\\-227.1654\\39\\-25.58439\\-228.7745\\39\\-22.52944\\-231.0681\\39\\-19.83947\\-232.6957\\39\\-17.66599\\-233.815\\39\\-15.3811\\-234.8158\\39\\-13.51527\\-235.513\\39\\-10.39749\\-236.4391\\39\\-6.884175\\-237.1998\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.3400956\\-237.2985\\41\\-3.233385\\-237.1493\\41\\-7.737672\\-236.492\\41\\-10.04799\\-235.9853\\41\\-14.54029\\-234.5463\\41\\-17.77674\\-233.0933\\41\\-19.93046\\-231.9582\\41\\-21.18027\\-231.2044\\41\\-24.37808\\-228.9078\\41\\-25.76576\\-227.7526\\41\\-27.87546\\-225.7523\\41\\-28.98915\\-224.5288\\41\\-30.57085\\-222.6016\\41\\-32.3194\\-220.1352\\41\\-33.69656\\-217.7817\\41\\-35.36361\\-214.1454\\41\\-36.01065\\-212.458\\41\\-36.9594\\-209.23\\41\\-37.35035\\-207.4368\\41\\-37.71606\\-205.0721\\41\\-37.97752\\-202.5728\\41\\-38.0004\\-198.8415\\41\\-37.85862\\-196.5713\\41\\-37.44385\\-193.8403\\41\\-36.6803\\-190.4399\\41\\-35.73935\\-187.5616\\41\\-34.26327\\-184.3181\\41\\-33.04035\\-182.2709\\41\\-32.26568\\-181.1462\\41\\-30.9919\\-179.5856\\41\\-29.96336\\-178.5467\\41\\-28.67622\\-177.472\\41\\-26.37898\\-176.059\\41\\-24.77358\\-175.3962\\41\\-22.06712\\-174.7763\\41\\-20.15941\\-174.6766\\41\\-18.57177\\-174.7414\\41\\-16.59039\\-174.9821\\41\\-14.53618\\-175.3825\\41\\-7.747453\\-177.0903\\41\\-6.204718\\-177.444\\41\\-3.500894\\-177.9178\\41\\-0.8682781\\-178.1636\\41\\1.530129\\-178.186\\41\\4.511961\\-177.9179\\41\\8.733384\\-177.0879\\41\\15.51274\\-175.3825\\41\\17.56694\\-174.9821\\41\\19.54817\\-174.7414\\41\\21.12675\\-174.676\\41\\23.05467\\-174.777\\41\\25.82758\\-175.4239\\41\\27.34306\\-176.0523\\41\\29.65279\\-177.472\\41\\30.93995\\-178.5467\\41\\31.96724\\-179.5837\\41\\33.43142\\-181.3729\\41\\34.50909\\-182.9986\\41\\35.295\\-184.4318\\41\\36.3792\\-186.71\\41\\37.36567\\-189.5115\\41\\37.84663\\-191.1509\\41\\38.42079\\-193.8375\\41\\38.83489\\-196.5692\\41\\38.97879\\-198.8264\\41\\38.95415\\-202.5714\\41\\38.69285\\-205.0701\\41\\38.26485\\-207.6837\\41\\37.50433\\-210.8386\\41\\36.33387\\-214.1667\\41\\34.67833\\-217.7717\\41\\33.29601\\-220.1352\\41\\31.54742\\-222.6016\\41\\29.96554\\-224.5292\\41\\28.83795\\-225.7647\\41\\26.74392\\-227.7472\\41\\25.35453\\-228.9079\\41\\22.14914\\-231.209\\41\\18.73229\\-233.1064\\41\\15.43164\\-234.5793\\41\\11.00961\\-235.9893\\41\\8.710009\\-236.4923\\41\\4.328912\\-237.12\\41\\1.313616\\-237.2967\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.955154\\-236.2846\\43\\-2.707301\\-236.501\\43\\1.202072\\-236.6001\\43\\4.107514\\-236.4532\\43\\5.930137\\-236.2856\\43\\8.445067\\-235.865\\43\\10.48218\\-235.4241\\43\\14.03991\\-234.3177\\43\\16.11947\\-233.5263\\43\\19.04493\\-232.1423\\43\\20.98556\\-231.0457\\43\\22.73697\\-229.8897\\43\\24.68273\\-228.4667\\43\\27.00895\\-226.4374\\43\\29.76091\\-223.5387\\43\\30.65047\\-222.4255\\43\\32.23809\\-220.2175\\43\\33.41503\\-218.2785\\43\\34.36595\\-216.4765\\43\\36.01795\\-212.5974\\43\\36.93511\\-209.5831\\43\\37.32171\\-207.9585\\43\\37.70532\\-205.8017\\43\\37.97639\\-203.3611\\43\\38.06329\\-201.6431\\43\\38.00877\\-197.9967\\43\\37.66869\\-194.8309\\43\\36.87068\\-191.1074\\43\\35.73542\\-187.7982\\43\\34.77942\\-185.6406\\43\\33.44427\\-183.2631\\43\\32.25814\\-181.6049\\43\\30.33052\\-179.5509\\43\\28.85168\\-178.3182\\43\\27.01671\\-177.2258\\43\\25.64424\\-176.63\\43\\23.84089\\-176.1033\\43\\21.49493\\-175.8133\\43\\19.59134\\-175.8229\\43\\17.38559\\-176.0377\\43\\13.4158\\-176.8141\\43\\10.13593\\-177.6155\\43\\6.292988\\-178.4255\\43\\2.716954\\-178.8667\\43\\0.65814\\-178.9406\\43\\-1.74198\\-178.8663\\43\\-5.316413\\-178.4255\\43\\-9.159284\\-177.6155\\43\\-12.43955\\-176.814\\43\\-16.40882\\-176.0378\\43\\-18.61486\\-175.8229\\43\\-20.53669\\-175.8165\\43\\-23.13804\\-176.1575\\43\\-25.36633\\-176.8953\\43\\-27.03267\\-177.7669\\43\\-28.30706\\-178.6481\\43\\-29.3285\\-179.5227\\43\\-31.2833\\-181.6073\\43\\-32.51058\\-183.3202\\43\\-33.80414\\-185.6419\\43\\-34.75871\\-187.798\\43\\-35.8939\\-191.1069\\43\\-36.69219\\-194.8313\\43\\-36.99111\\-197.5941\\43\\-37.11143\\-201.0014\\43\\-36.99994\\-203.3603\\43\\-36.72874\\-205.8024\\43\\-36.33923\\-207.9854\\43\\-35.95862\\-209.5827\\43\\-35.04138\\-212.5974\\43\\-33.80167\\-215.5842\\43\\-32.58022\\-218.0595\\43\\-31.28763\\-220.1815\\43\\-29.67391\\-222.4255\\43\\-28.78436\\-223.5386\\43\\-26.7344\\-225.7667\\43\\-25.59165\\-226.8523\\43\\-23.70625\\-228.4667\\43\\-21.76042\\-229.8897\\43\\-18.66968\\-231.825\\43\\-15.93942\\-233.1724\\43\\-13.06401\\-234.3177\\43\\-10.81817\\-235.0614\\43\\-7.545309\\-235.8298\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.100227\\-235.7332\\45\\1.437713\\-235.8003\\45\\5.294383\\-235.5499\\45\\6.804339\\-235.3395\\45\\10.51384\\-234.5422\\45\\12.7683\\-233.8944\\45\\15.00934\\-233.0731\\45\\17.38166\\-232.0212\\45\\19.0458\\-231.1523\\45\\21.10321\\-229.9139\\45\\22.53\\-228.9478\\45\\25.12174\\-226.8947\\45\\26.87385\\-225.2957\\45\\28.26976\\-223.7979\\45\\30.55404\\-220.9503\\45\\32.14964\\-218.4886\\45\\33.48821\\-216.0404\\45\\34.92249\\-212.6543\\45\\35.88692\\-209.5876\\45\\36.32925\\-207.7695\\45\\36.75126\\-205.1409\\45\\37.04799\\-201.5114\\45\\36.95938\\-197.8098\\45\\36.60044\\-195.1116\\45\\35.8653\\-191.5822\\45\\35.50805\\-190.383\\45\\34.59135\\-187.9586\\45\\33.69322\\-186.0481\\45\\32.8547\\-184.5539\\45\\31.87257\\-183.0983\\45\\30.4122\\-181.36\\45\\28.13129\\-179.4048\\45\\26.90944\\-178.656\\45\\25.15255\\-177.8439\\45\\22.8357\\-177.2106\\45\\21.33761\\-177.023\\45\\19.37333\\-176.983\\45\\17.72774\\-177.0813\\45\\14.55401\\-177.5571\\45\\8.662991\\-178.7782\\45\\6.573238\\-179.168\\45\\3.933375\\-179.5311\\45\\1.705158\\-179.6717\\45\\-0.7371299\\-179.6709\\45\\-2.78506\\-179.5449\\45\\-5.572783\\-179.1703\\45\\-9.201396\\-178.4734\\45\\-11.53369\\-177.9544\\45\\-14.97319\\-177.3044\\45\\-17.92788\\-176.9971\\45\\-19.54189\\-176.9788\\45\\-22.29094\\-177.2938\\45\\-23.63145\\-177.659\\45\\-25.80092\\-178.5809\\45\\-27.11061\\-179.3631\\45\\-28.40954\\-180.3949\\45\\-29.43712\\-181.3611\\45\\-30.89596\\-183.0981\\45\\-31.87783\\-184.5536\\45\\-32.71107\\-186.0414\\45\\-33.5854\\-187.8715\\45\\-34.5313\\-190.3825\\45\\-34.88872\\-191.5822\\45\\-35.62388\\-195.1116\\45\\-35.9823\\-197.8023\\45\\-36.07149\\-201.5149\\45\\-35.77505\\-205.1384\\45\\-35.35269\\-207.7695\\45\\-34.91042\\-209.5873\\45\\-33.94565\\-212.6538\\45\\-33.03407\\-214.8826\\45\\-31.68403\\-217.6209\\45\\-29.57736\\-220.9505\\45\\-27.29504\\-223.796\\45\\-25.75001\\-225.4355\\45\\-24.14528\\-226.8943\\45\\-21.55342\\-228.9478\\45\\-18.6119\\-230.8521\\45\\-15.63765\\-232.3666\\45\\-11.795\\-233.8934\\45\\-9.539515\\-234.5415\\45\\-5.827325\\-235.3395\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.352002\\-234.8572\\47\\2.327949\\-234.8578\\47\\6.529886\\-234.396\\47\\9.582994\\-233.7909\\47\\12.01802\\-233.087\\47\\15.29542\\-231.8733\\47\\17.26853\\-230.9367\\47\\19.22566\\-229.8668\\47\\21.95089\\-228.0791\\47\\24.28699\\-226.2204\\47\\26.61855\\-223.9811\\47\\28.56215\\-221.7475\\47\\30.8011\\-218.5682\\47\\31.86789\\-216.702\\47\\32.7491\\-214.9375\\47\\33.90556\\-212.0882\\47\\34.85136\\-208.8762\\47\\35.32409\\-206.7744\\47\\35.58638\\-205.0795\\47\\35.87545\\-200.8659\\47\\35.82267\\-198.8716\\47\\35.271\\-194.4814\\47\\34.67645\\-191.9465\\47\\34.05193\\-189.9698\\47\\33.10344\\-187.7412\\47\\31.68133\\-185.2255\\47\\30.37927\\-183.4487\\47\\28.38676\\-181.4048\\47\\26.35579\\-179.9827\\47\\24.27835\\-179.0401\\47\\21.92644\\-178.4214\\47\\20.46898\\-178.2515\\47\\17.62013\\-178.2567\\47\\15.58224\\-178.4631\\47\\12.7661\\-178.8753\\47\\6.619486\\-179.9942\\47\\4.355937\\-180.2575\\47\\2.18924\\-180.4008\\47\\-0.1275444\\-180.4426\\47\\-2.663076\\-180.3201\\47\\-5.576665\\-179.9965\\47\\-13.10967\\-178.669\\47\\-16.73705\\-178.2459\\47\\-19.49224\\-178.2496\\47\\-20.9081\\-178.4081\\47\\-22.83438\\-178.8881\\47\\-23.87511\\-179.2603\\47\\-25.36547\\-179.9907\\47\\-27.41222\\-181.4064\\47\\-29.4066\\-183.4528\\47\\-30.70476\\-185.2254\\47\\-32.12716\\-187.7414\\47\\-33.07545\\-189.9703\\47\\-33.69988\\-191.9465\\47\\-34.29444\\-194.4814\\47\\-34.77962\\-198.0478\\47\\-34.90196\\-200.4547\\47\\-34.76553\\-203.2309\\47\\-34.6021\\-205.0937\\47\\-34.34883\\-206.7671\\47\\-33.87418\\-208.8779\\47\\-32.91704\\-212.0867\\47\\-31.77262\\-214.9375\\47\\-30.89486\\-216.6933\\47\\-29.81977\\-218.5779\\47\\-28.30831\\-220.8152\\47\\-27.15636\\-222.2609\\47\\-25.6508\\-223.9763\\47\\-23.54604\\-225.994\\47\\-21.40775\\-227.7592\\47\\-18.25686\\-229.8614\\47\\-16.29125\\-230.9366\\47\\-14.3218\\-231.8719\\47\\-11.04131\\-233.0871\\47\\-8.609464\\-233.7895\\47\\-5.532891\\-234.4047\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "78" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "28" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.586367\\-233.7692\\49\\-4.514985\\-233.403\\49\\-6.729055\\-233.0348\\49\\-9.032927\\-232.5018\\49\\-11.84868\\-231.6054\\49\\-14.23164\\-230.625\\49\\-16.59274\\-229.4488\\49\\-18.94414\\-227.9973\\49\\-20.4453\\-226.9577\\49\\-22.41385\\-225.3631\\49\\-23.49748\\-224.362\\49\\-25.29828\\-222.4891\\49\\-26.95232\\-220.4763\\49\\-28.30385\\-218.5452\\49\\-29.14141\\-217.1767\\49\\-30.57886\\-214.3882\\49\\-31.96657\\-210.8574\\49\\-32.92613\\-207.0903\\49\\-33.33209\\-204.6764\\49\\-33.51704\\-201.9398\\49\\-33.51541\\-199.7307\\49\\-33.34029\\-197.3005\\49\\-32.72715\\-193.7449\\49\\-32.17788\\-191.8219\\49\\-31.63612\\-190.2728\\49\\-30.92518\\-188.6159\\49\\-29.47046\\-186.1052\\49\\-28.73272\\-185.0459\\49\\-27.46505\\-183.6122\\49\\-26.28099\\-182.5291\\49\\-24.96325\\-181.5919\\49\\-23.78745\\-180.9234\\49\\-21.21263\\-179.9911\\49\\-19.43706\\-179.6503\\49\\-17.06289\\-179.5035\\49\\-15.2568\\-179.5542\\49\\-10.79308\\-180.0697\\49\\-5.359003\\-180.8951\\49\\-1.9823\\-181.1865\\49\\0.4868818\\-181.2394\\49\\2.957352\\-181.1866\\49\\6.328884\\-180.896\\49\\11.76956\\-180.0697\\49\\16.23252\\-179.5542\\49\\18.03996\\-179.5037\\49\\20.36407\\-179.6425\\49\\21.90669\\-179.9239\\49\\23.59489\\-180.4357\\49\\25.01028\\-181.059\\49\\27.27857\\-182.5436\\49\\29.04501\\-184.2726\\49\\30.44515\\-186.1025\\49\\31.90175\\-188.6159\\49\\32.61268\\-190.2728\\49\\33.15444\\-191.8219\\49\\33.70371\\-193.7449\\49\\34.31683\\-197.3083\\49\\34.47989\\-199.67\\49\\34.49369\\-201.9434\\49\\34.28286\\-204.7752\\49\\33.90208\\-207.0959\\49\\32.94308\\-210.8574\\49\\31.5554\\-214.3883\\49\\30.11962\\-217.1731\\49\\29.28031\\-218.5453\\49\\27.86812\\-220.5497\\49\\26.73426\\-221.9643\\49\\25.34393\\-223.4911\\49\\23.36901\\-225.3817\\49\\21.38063\\-226.9917\\49\\20.11714\\-227.8702\\49\\17.56931\\-229.4488\\49\\15.2082\\-230.625\\49\\12.82524\\-231.6054\\49\\10.00915\\-232.502\\49\\8.02219\\-232.9743\\49\\5.513772\\-233.3979\\49\\1.782654\\-233.7549\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "29" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.4788265\\-232.4674\\51\\2.913418\\-232.3855\\51\\6.284549\\-231.978\\51\\8.513913\\-231.5119\\51\\11.24444\\-230.7303\\51\\13.76363\\-229.7963\\51\\15.26823\\-229.0834\\51\\17.53312\\-227.8738\\51\\18.91449\\-227.01\\51\\21.63127\\-224.9897\\51\\23.28301\\-223.5265\\51\\25.27138\\-221.4612\\51\\26.79997\\-219.5609\\51\\28.04951\\-217.7491\\51\\29.70911\\-214.8422\\51\\30.93\\-212.0411\\51\\31.59792\\-210.1046\\51\\32.29706\\-207.4125\\51\\32.70765\\-205.1378\\51\\32.94046\\-202.5233\\51\\32.93384\\-200.3055\\51\\32.72424\\-197.1287\\51\\32.5313\\-195.9349\\51\\31.93222\\-193.2978\\51\\31.28674\\-191.4237\\51\\30.51685\\-189.5914\\51\\29.52436\\-187.8418\\51\\28.43461\\-186.2404\\51\\27.58209\\-185.2284\\51\\26.11936\\-183.8802\\51\\24.04256\\-182.4999\\51\\22.06322\\-181.6479\\51\\20.61372\\-181.2627\\51\\18.3985\\-180.9224\\51\\15.66515\\-180.8663\\51\\12.95305\\-181.0412\\51\\9.919917\\-181.4013\\51\\4.926303\\-181.9264\\51\\1.477127\\-182.1143\\51\\-0.5807838\\-182.1148\\51\\-3.949467\\-181.9264\\51\\-8.943355\\-181.4013\\51\\-11.97649\\-181.0412\\51\\-14.68858\\-180.8663\\51\\-17.42187\\-180.9224\\51\\-19.65405\\-181.2605\\51\\-21.64181\\-181.8331\\51\\-23.06819\\-182.5018\\51\\-24.66653\\-183.5275\\51\\-26.08599\\-184.7231\\51\\-27.03238\\-185.7309\\51\\-27.99373\\-186.9772\\51\\-29.54024\\-189.5913\\51\\-30.31016\\-191.4237\\51\\-30.95569\\-193.298\\51\\-31.53636\\-195.8363\\51\\-31.81158\\-197.7394\\51\\-31.94215\\-199.3501\\51\\-31.99932\\-201.6339\\51\\-31.73083\\-205.139\\51\\-31.32049\\-207.4125\\51\\-30.62136\\-210.1046\\51\\-29.95344\\-212.0411\\51\\-28.74346\\-214.8272\\51\\-27.77425\\-216.5827\\51\\-25.86349\\-219.496\\51\\-24.07564\\-221.6938\\51\\-22.29071\\-223.5446\\51\\-19.51143\\-225.896\\51\\-16.55571\\-227.8749\\51\\-14.29134\\-229.0836\\51\\-12.78707\\-229.7963\\51\\-10.26788\\-230.7303\\51\\-7.537351\\-231.5119\\51\\-5.307986\\-231.978\\51\\-1.734085\\-232.4022\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "74" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "30" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.9877779\\-230.9355\\53\\4.486869\\-230.7041\\53\\7.022734\\-230.2955\\53\\8.944558\\-229.8163\\53\\10.94564\\-229.1848\\53\\13.6383\\-228.0975\\53\\15.52082\\-227.1861\\53\\17.23051\\-226.1865\\53\\18.89039\\-225.078\\53\\21.45873\\-222.9931\\53\\23.6603\\-220.7808\\53\\25.06766\\-219.0926\\53\\26.45644\\-217.1164\\53\\27.6746\\-215.0903\\53\\28.86301\\-212.6291\\53\\29.64749\\-210.5279\\53\\30.28515\\-208.4486\\53\\30.71211\\-206.6179\\53\\31.02842\\-204.5966\\53\\31.20989\\-201.864\\53\\31.16084\\-199.3531\\53\\30.97486\\-197.6067\\53\\30.34172\\-194.4462\\53\\29.17732\\-191.1388\\53\\28.60739\\-189.9997\\53\\27.51967\\-188.2268\\53\\25.83354\\-186.2561\\53\\24.35108\\-184.9746\\53\\22.45431\\-183.8206\\53\\21.29148\\-183.3188\\53\\18.45971\\-182.5389\\53\\15.78529\\-182.2691\\53\\12.69964\\-182.2955\\53\\10.08759\\-182.4671\\53\\7.137596\\-182.7626\\53\\4.822176\\-182.9205\\53\\0.9723852\\-183.0581\\53\\-2.462666\\-182.9866\\53\\-6.189179\\-182.7598\\53\\-9.111023\\-182.4671\\53\\-11.72274\\-182.2956\\53\\-14.80881\\-182.269\\53\\-17.48314\\-182.5389\\53\\-20.3146\\-183.3187\\53\\-21.47771\\-183.8207\\53\\-23.37465\\-184.9749\\53\\-24.86145\\-186.2602\\53\\-26.54256\\-188.2262\\53\\-27.63078\\-189.9996\\53\\-28.20084\\-191.1387\\53\\-28.92394\\-193.0278\\53\\-29.51733\\-195.0057\\53\\-30.0009\\-197.6103\\53\\-30.18413\\-199.3416\\53\\-30.23373\\-201.8548\\53\\-30.08429\\-204.2943\\53\\-29.73396\\-206.6251\\53\\-29.30851\\-208.4488\\53\\-28.67107\\-210.5275\\53\\-27.88404\\-212.6292\\53\\-26.69554\\-215.0875\\53\\-25.48743\\-217.1053\\53\\-24.0894\\-219.0945\\53\\-22.66061\\-220.8107\\53\\-21.50497\\-222.0081\\53\\-19.70906\\-223.6477\\53\\-17.32664\\-225.4926\\53\\-14.55236\\-227.1779\\53\\-12.72484\\-228.0808\\53\\-9.971407\\-229.1838\\53\\-7.967996\\-229.8163\\53\\-6.046172\\-230.2955\\53\\-3.510362\\-230.704\\53\\-1.326811\\-230.8918\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "69" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "31" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.931477\\-229.067\\55\\0.5037407\\-229.1619\\55\\2.909452\\-229.0665\\55\\5.040643\\-228.8164\\55\\7.295846\\-228.3616\\55\\9.425772\\-227.8119\\55\\10.72097\\-227.3606\\55\\13.64646\\-226.1012\\55\\15.88495\\-224.8573\\55\\17.84682\\-223.5394\\55\\18.95674\\-222.6789\\55\\20.60209\\-221.2146\\55\\22.42559\\-219.3141\\55\\23.7379\\-217.6922\\55\\25.53761\\-214.9379\\55\\27.12781\\-211.6854\\55\\28.24475\\-208.4618\\55\\28.70173\\-206.5608\\55\\28.94021\\-205.0969\\55\\29.18653\\-202.0917\\55\\29.12651\\-199.624\\55\\28.92341\\-197.6218\\55\\28.32661\\-194.9262\\55\\27.77718\\-193.2782\\55\\27.01268\\-191.6519\\55\\25.54392\\-189.1922\\55\\24.37959\\-187.8965\\55\\22.95992\\-186.6362\\55\\21.97119\\-185.944\\55\\20.49822\\-185.1757\\55\\19.20589\\-184.6393\\55\\17.796\\-184.2572\\55\\15.15539\\-183.8459\\55\\13.55124\\-183.7513\\55\\10.2443\\-183.7425\\55\\6.348239\\-183.9617\\55\\2.780094\\-184.0823\\55\\-1.817295\\-184.082\\55\\-5.387124\\-183.9629\\55\\-9.268621\\-183.7425\\55\\-13.67699\\-183.7912\\55\\-16.81925\\-184.2571\\55\\-18.22933\\-184.6393\\55\\-19.52166\\-185.1757\\55\\-20.99463\\-185.944\\55\\-21.98336\\-186.6362\\55\\-23.40302\\-187.8965\\55\\-24.56736\\-189.1922\\55\\-26.03612\\-191.6519\\55\\-26.80019\\-193.2778\\55\\-27.45898\\-195.3237\\55\\-27.97836\\-197.8177\\55\\-28.14787\\-199.8485\\55\\-28.2149\\-202.0984\\55\\-28.04641\\-204.4785\\55\\-27.72893\\-206.5652\\55\\-27.26824\\-208.4617\\55\\-26.16336\\-211.6632\\55\\-24.561\\-214.9381\\55\\-22.76068\\-217.6932\\55\\-21.01845\\-219.8008\\55\\-18.59926\\-222.1508\\55\\-16.87041\\-223.5393\\55\\-14.90805\\-224.8582\\55\\-12.66214\\-226.1062\\55\\-10.89876\\-226.896\\55\\-8.444405\\-227.8139\\55\\-6.309231\\-228.363\\55\\-4.051909\\-228.8174\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "32" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.793279\\-226.9717\\57\\-4.598895\\-226.615\\57\\-6.08763\\-226.2953\\57\\-7.991784\\-225.7051\\57\\-10.11324\\-224.9261\\57\\-12.81841\\-223.5908\\57\\-15.02908\\-222.19\\57\\-17.59372\\-220.1392\\57\\-19.75173\\-217.8914\\57\\-21.63069\\-215.4707\\57\\-23.34215\\-212.4236\\57\\-24.35789\\-210.0593\\57\\-25.18137\\-207.4173\\57\\-25.57248\\-205.6027\\57\\-25.89632\\-202.1783\\57\\-25.83419\\-200.2823\\57\\-25.43758\\-197.2175\\57\\-24.93854\\-195.3036\\57\\-24.36317\\-193.7866\\57\\-23.64673\\-192.3625\\57\\-22.72882\\-190.9226\\57\\-21.80332\\-189.8069\\57\\-20.65436\\-188.7135\\57\\-19.54524\\-187.8382\\57\\-17.39332\\-186.6967\\57\\-15.7959\\-186.1086\\57\\-13.6237\\-185.6334\\57\\-11.70106\\-185.3875\\57\\-7.609021\\-185.2267\\57\\-2.400037\\-185.3348\\57\\3.371206\\-185.3348\\57\\8.579274\\-185.2257\\57\\12.67692\\-185.3876\\57\\14.59939\\-185.6335\\57\\16.77251\\-186.1086\\57\\18.36988\\-186.6967\\57\\20.5218\\-187.8382\\57\\21.63092\\-188.7135\\57\\22.77989\\-189.8069\\57\\23.70539\\-190.9226\\57\\24.62329\\-192.3625\\57\\25.33991\\-193.7872\\57\\25.94422\\-195.4058\\57\\26.41677\\-197.2344\\57\\26.81017\\-200.1715\\57\\26.86265\\-201.6363\\57\\26.79383\\-203.5401\\57\\26.54897\\-205.6027\\57\\26.15793\\-207.4173\\57\\25.33446\\-210.0593\\57\\24.31871\\-212.4236\\57\\22.60739\\-215.4704\\57\\21.03864\\-217.5256\\57\\18.57056\\-220.1393\\57\\16.00564\\-222.19\\57\\13.79497\\-223.5908\\57\\11.0898\\-224.9261\\57\\8.967829\\-225.7052\\57\\7.060122\\-226.2962\\57\\4.792458\\-226.7433\\57\\1.316508\\-227.0675\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "57" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "33" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.007898\\-224.1842\\59\\-5.633465\\-223.823\\59\\-7.388333\\-223.2772\\59\\-9.525916\\-222.4253\\59\\-12.24367\\-220.9544\\59\\-13.77391\\-219.9508\\59\\-15.91024\\-218.1614\\59\\-17.46073\\-216.5652\\59\\-19.10684\\-214.4567\\59\\-20.66047\\-211.8987\\59\\-21.75287\\-209.5192\\59\\-22.54363\\-206.882\\59\\-23.04093\\-204.2319\\59\\-23.13367\\-202.0268\\59\\-22.94877\\-199.426\\59\\-22.45282\\-196.7966\\59\\-21.77791\\-195.0977\\59\\-20.90553\\-193.3357\\59\\-20.24132\\-192.3807\\59\\-18.98284\\-190.9573\\59\\-18.16468\\-190.2555\\59\\-15.7657\\-188.727\\59\\-14.14937\\-188.0709\\59\\-11.10525\\-187.3542\\59\\-8.265779\\-187.0049\\59\\-5.726636\\-186.851\\59\\-3.29828\\-186.8177\\59\\6.715771\\-186.8536\\59\\9.642008\\-187.0367\\59\\12.08205\\-187.3533\\59\\15.13399\\-188.0757\\59\\16.74223\\-188.727\\59\\19.14125\\-190.2555\\59\\19.9594\\-190.9573\\59\\21.21788\\-192.3807\\59\\21.88209\\-193.3357\\59\\22.75447\\-195.0977\\59\\23.42877\\-196.7948\\59\\23.92281\\-199.4456\\59\\24.06277\\-200.9095\\59\\24.08795\\-202.9561\\59\\24.00546\\-204.2538\\59\\23.47472\\-207.0727\\59\\22.7294\\-209.5192\\59\\21.63708\\-211.8987\\59\\20.11054\\-214.439\\59\\18.78767\\-216.1893\\59\\16.33028\\-218.6924\\59\\14.76846\\-219.9596\\59\\13.21276\\-220.966\\59\\10.50257\\-222.4254\\59\\8.364835\\-223.2772\\59\\6.610652\\-223.823\\59\\4.977284\\-224.1879\\59\\2.007368\\-224.5406\\59\\0.4325693\\-224.6072\\59\\-1.004857\\-224.5432\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "34" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "1.764367\\-221.4984\\61\\3.654794\\-221.3179\\61\\7.203878\\-220.4183\\61\\9.339288\\-219.5722\\61\\11.9681\\-218.0688\\61\\13.79902\\-216.7584\\61\\16.1487\\-214.3184\\61\\17.52622\\-212.6309\\61\\18.7694\\-210.4807\\61\\19.94951\\-207.6994\\61\\20.42612\\-205.7367\\61\\20.73337\\-203.3174\\61\\20.80488\\-201.5498\\61\\20.64866\\-200.0113\\61\\20.26042\\-198.1714\\61\\19.07385\\-195.3121\\61\\17.64525\\-193.3923\\61\\15.65859\\-191.6211\\61\\13.04623\\-190.3073\\61\\10.32528\\-189.4553\\61\\8.439642\\-189.1374\\61\\5.345034\\-188.8738\\61\\0.4571372\\-188.6552\\61\\-4.352931\\-188.8738\\61\\-7.530559\\-189.145\\61\\-9.348761\\-189.4554\\61\\-10.60953\\-189.7913\\61\\-12.46985\\-190.4942\\61\\-14.68204\\-191.6211\\61\\-16.66868\\-193.3923\\61\\-18.09729\\-195.3121\\61\\-19.2845\\-198.1844\\61\\-19.66375\\-199.9591\\61\\-19.83198\\-201.5849\\61\\-19.75667\\-203.3159\\61\\-19.45048\\-205.7354\\61\\-18.97295\\-207.6994\\61\\-17.77633\\-210.5106\\61\\-16.50928\\-212.6572\\61\\-15.1487\\-214.3571\\61\\-12.88452\\-216.7218\\61\\-11.55351\\-217.7256\\61\\-9.578808\\-218.9419\\61\\-7.648614\\-219.8824\\61\\-5.095757\\-220.774\\61\\-2.682042\\-221.3173\\61\\-0.5944416\\-221.5246\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "35" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.116315\\-217.5211\\63\\2.525019\\-217.4579\\63\\4.246804\\-217.1772\\63\\6.333959\\-216.5989\\63\\8.590102\\-215.5211\\63\\10.15074\\-214.5676\\63\\11.27054\\-213.6739\\63\\13.19327\\-211.6382\\63\\14.96154\\-208.9368\\63\\15.64968\\-207.4078\\63\\16.21769\\-205.4836\\63\\16.57324\\-202.9722\\63\\16.40019\\-202.2493\\63\\16.41231\\-200.831\\63\\15.95592\\-199.0985\\63\\14.74458\\-196.5793\\63\\13.62659\\-195.1967\\63\\12.09371\\-194.0262\\63\\10.4419\\-193.0549\\63\\8.833938\\-192.4071\\63\\7.166197\\-191.9658\\63\\4.288877\\-191.4669\\63\\2.13356\\-191.2932\\63\\-0.7566112\\-191.2767\\63\\-3.418837\\-191.4973\\63\\-6.217521\\-191.9706\\63\\-7.865997\\-192.4099\\63\\-9.935484\\-193.2915\\63\\-11.92157\\-194.5695\\63\\-12.6587\\-195.2066\\63\\-13.77571\\-196.5776\\63\\-14.97968\\-199.098\\63\\-15.43575\\-200.8311\\63\\-15.42365\\-202.2478\\63\\-15.59671\\-202.9725\\63\\-15.24105\\-205.483\\63\\-14.67312\\-207.4078\\63\\-13.985\\-208.9368\\63\\-12.4394\\-211.3325\\63\\-10.295\\-213.6731\\63\\-9.101588\\-214.6196\\63\\-8.217945\\-215.14\\63\\-5.360232\\-216.5986\\63\\-3.26926\\-217.1783\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "36" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.5933019\\-211.6764\\65\\1.5833\\-211.6789\\65\\2.160541\\-211.4577\\65\\2.975951\\-211.5574\\65\\5.119955\\-210.6432\\65\\6.759023\\-209.634\\65\\7.755369\\-208.6972\\65\\8.492185\\-207.7591\\65\\9.450212\\-205.9687\\65\\9.887464\\-204.6694\\65\\10.13643\\-203.2983\\65\\9.873201\\-201.1\\65\\8.385763\\-198.5388\\65\\7.587423\\-197.7187\\65\\6.257915\\-197.046\\65\\3.591137\\-196.0411\\65\\2.492168\\-195.7818\\65\\0.6393334\\-195.6101\\65\\-1.485472\\-195.7764\\65\\-2.646059\\-196.0535\\65\\-4.571265\\-196.7523\\65\\-6.576953\\-197.6478\\65\\-7.758991\\-199.0457\\65\\-8.613137\\-200.4699\\65\\-9.128022\\-201.8906\\65\\-9.161495\\-203.2404\\65\\-8.908936\\-204.6779\\65\\-8.082075\\-206.8487\\65\\-6.786169\\-208.657\\65\\-5.777151\\-209.6353\\65\\-4.145667\\-210.6442\\65\\-1.99099\\-211.5607\\65\\-1.183566\\-211.4585\\65" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "5" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "128\\64\\64" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "13.69339\\-153.7846\\-71\\13.55374\\-151.832\\-71\\13.13763\\-149.9193\\-71\\12.45355\\-148.0851\\-71\\11.5154\\-146.3671\\-71\\10.34229\\-144.8\\-71\\8.958109\\-143.4158\\-71\\7.391023\\-142.2427\\-71\\5.672937\\-141.3045\\-71\\3.838827\\-140.6204\\-71\\1.92603\\-140.2043\\-71\\-0.02651533\\-140.0647\\-71\\-1.979061\\-140.2043\\-71\\-3.891858\\-140.6204\\-71\\-5.725968\\-141.3045\\-71\\-7.444054\\-142.2427\\-71\\-9.01114\\-143.4158\\-71\\-10.39532\\-144.8\\-71\\-11.56843\\-146.3671\\-71\\-12.50658\\-148.0851\\-71\\-13.19066\\-149.9193\\-71\\-13.60677\\-151.832\\-71\\-13.74642\\-153.7846\\-71\\-13.60677\\-155.7371\\-71\\-13.19066\\-157.6499\\-71\\-12.50658\\-159.484\\-71\\-11.56843\\-161.2021\\-71\\-10.39532\\-162.7692\\-71\\-9.01114\\-164.1534\\-71\\-7.444054\\-165.3265\\-71\\-5.725968\\-166.2646\\-71\\-3.891858\\-166.9487\\-71\\-1.979061\\-167.3648\\-71\\-0.02651533\\-167.5045\\-71\\1.92603\\-167.3648\\-71\\3.838827\\-166.9487\\-71\\5.672937\\-166.2646\\-71\\7.391023\\-165.3265\\-71\\8.958109\\-164.1534\\-71\\10.34229\\-162.7692\\-71\\11.5154\\-161.2021\\-71\\12.45355\\-159.484\\-71\\13.13763\\-157.6499\\-71\\13.55374\\-155.7371\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-5.148041\\-165.9794\\-69\\-5.15705\\-165.9716\\-69\\-7.148041\\-164.7573\\-69\\-8.215205\\-163.9716\\-69\\-9.148041\\-163.2319\\-69\\-10.30565\\-161.9716\\-69\\-11.14804\\-160.8723\\-69\\-11.81296\\-159.9716\\-69\\-12.55688\\-157.9716\\-69\\-13.14804\\-156.3745\\-69\\-13.33953\\-155.9716\\-69\\-13.65681\\-153.9716\\-69\\-13.60259\\-151.9716\\-69\\-13.14804\\-150.3049\\-69\\-13.03693\\-149.9716\\-69\\-12.3037\\-147.9716\\-69\\-11.47041\\-145.9716\\-69\\-11.14804\\-145.6113\\-69\\-9.866431\\-143.9716\\-69\\-9.148041\\-143.2319\\-69\\-7.387711\\-141.9716\\-69\\-7.148041\\-141.7673\\-69\\-5.148041\\-140.745\\-69\\-3.148041\\-140.1884\\-69\\-2.488467\\-139.9716\\-69\\-1.148041\\-139.5753\\-69\\0.8519591\\-139.5077\\-69\\2.851959\\-139.9034\\-69\\2.99712\\-139.9716\\-69\\4.851959\\-140.5932\\-69\\6.851959\\-141.3352\\-69\\7.781647\\-141.9716\\-69\\8.851959\\-142.7456\\-69\\10.12097\\-143.9716\\-69\\10.85196\\-144.7939\\-69\\11.71669\\-145.9716\\-69\\12.59853\\-147.9716\\-69\\12.85196\\-148.4069\\-69\\13.53753\\-149.9716\\-69\\13.78946\\-151.9716\\-69\\13.81931\\-153.9716\\-69\\13.66591\\-155.9716\\-69\\13.09334\\-157.9716\\-69\\12.85196\\-158.3018\\-69\\11.97572\\-159.9716\\-69\\10.85196\\-161.759\\-69\\10.66047\\-161.9716\\-69\\8.851959\\-163.8889\\-69\\8.764658\\-163.9716\\-69\\6.851959\\-165.1415\\-69\\5.351959\\-165.9716\\-69\\4.851959\\-166.3369\\-69\\2.851959\\-166.7397\\-69\\0.8519591\\-166.9805\\-69\\-1.148041\\-166.9536\\-69\\-3.148041\\-166.6639\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.148041\\-166.1237\\-67\\-3.431825\\-165.9716\\-67\\-5.148041\\-165.3066\\-67\\-7.148041\\-164.225\\-67\\-7.434863\\-163.9716\\-67\\-9.148041\\-162.6639\\-67\\-9.816612\\-161.9716\\-67\\-11.14804\\-160.2064\\-67\\-11.36482\\-159.9716\\-67\\-12.2759\\-157.9716\\-67\\-12.84804\\-155.9716\\-67\\-13.14804\\-154.8466\\-67\\-13.38942\\-153.9716\\-67\\-13.40147\\-151.9716\\-67\\-13.14804\\-150.9438\\-67\\-12.90666\\-149.9716\\-67\\-12.30225\\-147.9716\\-67\\-11.58362\\-145.9716\\-67\\-11.14804\\-145.4571\\-67\\-10.01544\\-143.9716\\-67\\-9.148041\\-143.0314\\-67\\-7.83693\\-141.9716\\-67\\-7.148041\\-141.4371\\-67\\-5.148041\\-140.4261\\-67\\-4.0451\\-139.9716\\-67\\-3.148041\\-139.5855\\-67\\-1.148041\\-139.1744\\-67\\0.8519591\\-139.11\\-67\\2.851959\\-139.2997\\-67\\4.851959\\-139.9637\\-67\\4.86206\\-139.9716\\-67\\6.851959\\-140.9232\\-67\\8.587959\\-141.9716\\-67\\8.851959\\-142.2007\\-67\\10.66047\\-143.9716\\-67\\10.85196\\-144.1746\\-67\\12.02353\\-145.9716\\-67\\12.85196\\-147.522\\-67\\13.17433\\-147.9716\\-67\\13.73354\\-149.9716\\-67\\13.90175\\-151.9716\\-67\\13.89704\\-153.9716\\-67\\13.70846\\-155.9716\\-67\\13.08113\\-157.9716\\-67\\12.85196\\-158.2662\\-67\\11.89696\\-159.9716\\-67\\10.85196\\-161.4538\\-67\\10.40684\\-161.9716\\-67\\8.851959\\-163.5077\\-67\\8.281589\\-163.9716\\-67\\6.851959\\-164.8777\\-67\\4.851959\\-165.7181\\-67\\4.140421\\-165.9716\\-67\\2.851959\\-166.3877\\-67\\0.8519591\\-166.6966\\-67\\-1.148041\\-166.6365\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.148041\\-166.0397\\-65\\-1.321118\\-165.9716\\-65\\-3.148041\\-165.4287\\-65\\-5.148041\\-164.9246\\-65\\-6.640688\\-163.9716\\-65\\-7.148041\\-163.5456\\-65\\-9.148041\\-162.025\\-65\\-9.201476\\-161.9716\\-65\\-10.73189\\-159.9716\\-65\\-11.14804\\-159.4678\\-65\\-12.04444\\-157.9716\\-65\\-12.52642\\-155.9716\\-65\\-13.00935\\-153.9716\\-65\\-13.14804\\-152.0716\\-65\\-13.15585\\-151.9716\\-65\\-13.14804\\-151.9345\\-65\\-12.80389\\-149.9716\\-65\\-12.30082\\-147.9716\\-65\\-11.6909\\-145.9716\\-65\\-11.14804\\-145.293\\-65\\-10.164\\-143.9716\\-65\\-9.148041\\-142.8279\\-65\\-8.18831\\-141.9716\\-65\\-7.148041\\-141.1767\\-65\\-5.221811\\-139.9716\\-65\\-5.148041\\-139.9034\\-65\\-3.148041\\-139.2216\\-65\\-1.148041\\-138.9093\\-65\\0.8519591\\-138.8471\\-65\\2.851959\\-138.9716\\-65\\4.851959\\-139.3425\\-65\\6.070709\\-139.9716\\-65\\6.851959\\-140.4261\\-65\\8.851959\\-141.5456\\-65\\9.302939\\-141.9716\\-65\\10.85196\\-143.5105\\-65\\11.28754\\-143.9716\\-65\\12.42603\\-145.9716\\-65\\12.85196\\-146.648\\-65\\13.54427\\-147.9716\\-65\\13.89451\\-149.9716\\-65\\14.03251\\-151.9716\\-65\\13.98028\\-153.9716\\-65\\13.74326\\-155.9716\\-65\\13.08113\\-157.9716\\-65\\12.85196\\-158.2512\\-65\\11.81625\\-159.9716\\-65\\10.85196\\-161.1988\\-65\\10.16805\\-161.9716\\-65\\8.851959\\-163.2094\\-65\\7.791809\\-163.9716\\-65\\6.851959\\-164.6295\\-65\\4.851959\\-165.2928\\-65\\2.851959\\-165.7801\\-65\\1.951959\\-165.9716\\-65\\0.8519591\\-166.2007\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "14.39637\\-151.9821\\-63\\14.25672\\-150.0296\\-63\\13.84062\\-148.1168\\-63\\13.15653\\-146.2827\\-63\\12.21838\\-144.5646\\-63\\11.04528\\-142.9975\\-63\\9.661092\\-141.6133\\-63\\8.094006\\-140.4402\\-63\\6.37592\\-139.5021\\-63\\4.54181\\-138.818\\-63\\2.629012\\-138.4019\\-63\\0.6764669\\-138.2622\\-63\\-1.276079\\-138.4019\\-63\\-3.188876\\-138.818\\-63\\-5.022986\\-139.5021\\-63\\-6.741072\\-140.4402\\-63\\-8.308158\\-141.6133\\-63\\-9.692343\\-142.9975\\-63\\-10.86545\\-144.5646\\-63\\-11.80359\\-146.2827\\-63\\-12.48768\\-148.1168\\-63\\-12.90379\\-150.0296\\-63\\-13.04343\\-151.9821\\-63\\-12.90379\\-153.9347\\-63\\-12.48768\\-155.8475\\-63\\-11.80359\\-157.6816\\-63\\-10.86545\\-159.3997\\-63\\-9.692343\\-160.9668\\-63\\-8.308158\\-162.351\\-63\\-6.741072\\-163.524\\-63\\-5.022986\\-164.4622\\-63\\-3.188876\\-165.1463\\-63\\-1.276079\\-165.5624\\-63\\0.6764669\\-165.702\\-63\\2.629012\\-165.5624\\-63\\4.54181\\-165.1463\\-63\\6.37592\\-164.4622\\-63\\8.094006\\-163.524\\-63\\9.661092\\-162.351\\-63\\11.04528\\-160.9668\\-63\\12.21838\\-159.3997\\-63\\13.15653\\-157.6816\\-63\\13.84062\\-155.8475\\-63\\14.25672\\-153.9347\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.148041\\-164.6571\\-61\\-4.969959\\-163.9716\\-61\\-5.148041\\-163.8745\\-61\\-7.148041\\-162.5874\\-61\\-7.833576\\-161.9716\\-61\\-9.148041\\-160.7201\\-61\\-9.838649\\-159.9716\\-61\\-11.14804\\-158.1054\\-61\\-11.27304\\-157.9716\\-61\\-12.02598\\-155.9716\\-61\\-12.46928\\-153.9716\\-61\\-12.6306\\-151.9716\\-61\\-12.52642\\-149.9716\\-61\\-12.24496\\-147.9716\\-61\\-11.77707\\-145.9716\\-61\\-11.14804\\-145.1358\\-61\\-10.32063\\-143.9716\\-61\\-9.148041\\-142.4618\\-61\\-8.679291\\-141.9716\\-61\\-7.148041\\-140.6614\\-61\\-6.170768\\-139.9716\\-61\\-5.148041\\-139.2793\\-61\\-3.148041\\-138.6705\\-61\\-1.148041\\-138.2129\\-61\\0.6940643\\-137.9716\\-61\\0.8519591\\-137.9483\\-61\\1.001959\\-137.9716\\-61\\2.851959\\-138.225\\-61\\4.851959\\-138.6772\\-61\\6.851959\\-139.3499\\-61\\7.771959\\-139.9716\\-61\\8.851959\\-140.7093\\-61\\10.2605\\-141.9716\\-61\\10.85196\\-142.6314\\-61\\11.90543\\-143.9716\\-61\\12.85196\\-145.4344\\-61\\13.25821\\-145.9716\\-61\\13.83077\\-147.9716\\-61\\14.03251\\-149.9716\\-61\\14.09586\\-151.9716\\-61\\14.00061\\-153.9716\\-61\\13.68758\\-155.9716\\-61\\12.85196\\-157.6818\\-61\\12.63518\\-157.9716\\-61\\11.36073\\-159.9716\\-61\\10.85196\\-160.5119\\-61\\9.33583\\-161.9716\\-61\\8.851959\\-162.4261\\-61\\6.851959\\-163.7063\\-61\\6.393136\\-163.9716\\-61\\4.851959\\-164.6503\\-61\\2.851959\\-164.9941\\-61\\0.8519591\\-165.1151\\-61\\-1.148041\\-165.0168\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.148041\\-164.1102\\-59\\-3.415647\\-163.9716\\-59\\-5.148041\\-163.3031\\-59\\-7.139911\\-161.9716\\-59\\-7.148041\\-161.9637\\-59\\-9.148041\\-160.1237\\-59\\-9.300215\\-159.9716\\-59\\-10.63927\\-157.9716\\-59\\-11.14804\\-157.143\\-59\\-11.79883\\-155.9716\\-59\\-12.29669\\-153.9716\\-59\\-12.42945\\-151.9716\\-59\\-12.39194\\-149.9716\\-59\\-12.19465\\-147.9716\\-59\\-11.7844\\-145.9716\\-59\\-11.14804\\-145.1216\\-59\\-10.34304\\-143.9716\\-59\\-9.148041\\-142.2765\\-59\\-8.85945\\-141.9716\\-59\\-7.148041\\-140.4537\\-59\\-6.520134\\-139.9716\\-59\\-5.148041\\-139.1406\\-59\\-3.148041\\-138.3474\\-59\\-1.991178\\-137.9716\\-59\\-1.148041\\-137.683\\-59\\0.8519591\\-137.4541\\-59\\2.851959\\-137.6274\\-59\\3.891175\\-137.9716\\-59\\4.851959\\-138.2939\\-59\\6.851959\\-139.111\\-59\\8.356161\\-139.9716\\-59\\8.851959\\-140.3474\\-59\\10.64773\\-141.9716\\-59\\10.85196\\-142.1999\\-59\\12.09505\\-143.9716\\-59\\12.85196\\-145.1132\\-59\\13.42738\\-145.9716\\-59\\13.85196\\-147.9716\\-59\\13.99546\\-149.9716\\-59\\14.01105\\-151.9716\\-59\\13.92004\\-153.9716\\-59\\13.57055\\-155.9716\\-59\\12.85196\\-157.1732\\-59\\12.3091\\-157.9716\\-59\\10.87521\\-159.9716\\-59\\10.85196\\-159.9948\\-59\\8.851959\\-161.8061\\-59\\8.677716\\-161.9716\\-59\\6.851959\\-163.2535\\-59\\5.143098\\-163.9716\\-59\\4.851959\\-164.137\\-59\\2.851959\\-164.6902\\-59\\0.8519591\\-164.8609\\-59\\-1.148041\\-164.7154\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.271281\\-164.1144\\-57\\-3.771281\\-163.4351\\-57\\-5.271281\\-162.8887\\-57\\-7.271281\\-161.4484\\-57\\-8.981404\\-159.8185\\-57\\-9.903447\\-158.8185\\-57\\-11.98291\\-154.8185\\-57\\-12.37776\\-152.3185\\-57\\-12.43219\\-150.3185\\-57\\-12.01284\\-146.8185\\-57\\-11.32857\\-145.3185\\-57\\-9.486599\\-142.3185\\-57\\-7.271281\\-140.0635\\-57\\-5.271281\\-139.0502\\-57\\-3.771281\\-138.1114\\-57\\-2.771281\\-137.7305\\-57\\0.7287188\\-137.2339\\-57\\2.728719\\-137.3661\\-57\\4.728719\\-137.7029\\-57\\6.728719\\-138.6215\\-57\\8.728719\\-139.7457\\-57\\9.228719\\-140.1428\\-57\\11.37872\\-142.3185\\-57\\12.43545\\-143.8185\\-57\\13.40675\\-145.8185\\-57\\13.82006\\-147.3185\\-57\\14.01332\\-148.8185\\-57\\14.06249\\-150.8185\\-57\\13.93082\\-153.3185\\-57\\13.4018\\-155.8185\\-57\\12.34539\\-157.8185\\-57\\10.72872\\-159.8165\\-57\\8.228719\\-161.9943\\-57\\6.728719\\-163.0251\\-57\\5.728719\\-163.4045\\-57\\3.728719\\-163.957\\-57\\0.7287188\\-164.4045\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.7712812\\-162.3907\\-55\\-2.771281\\-161.903\\-55\\-5.271281\\-160.9637\\-55\\-7.271281\\-159.5261\\-55\\-9.465337\\-157.3185\\-55\\-10.46659\\-155.8185\\-55\\-11.481\\-153.8185\\-55\\-11.95412\\-152.3185\\-55\\-12.15075\\-150.3185\\-55\\-12.18795\\-148.8185\\-55\\-12.09488\\-146.8185\\-55\\-11.85187\\-145.3185\\-55\\-11.49982\\-144.3185\\-55\\-10.3678\\-142.3185\\-55\\-9.396281\\-140.8185\\-55\\-7.771281\\-138.9171\\-55\\-6.771281\\-138.0685\\-55\\-4.771281\\-137.0019\\-55\\-3.271281\\-136.0665\\-55\\-1.271281\\-135.5645\\-55\\0.7287188\\-135.3013\\-55\\2.728719\\-135.3946\\-55\\4.728719\\-135.7281\\-55\\6.296901\\-136.3185\\-55\\8.728719\\-137.673\\-55\\10.72872\\-139.5331\\-55\\11.93449\\-140.8185\\-55\\12.9705\\-142.3185\\-55\\13.44804\\-143.3185\\-55\\13.92794\\-144.8185\\-55\\14.32267\\-146.8185\\-55\\14.48337\\-148.3185\\-55\\14.39841\\-150.3185\\-55\\13.92515\\-152.8185\\-55\\13.32778\\-154.8185\\-55\\12.44833\\-156.3185\\-55\\11.34338\\-157.8185\\-55\\10.22872\\-158.9868\\-55\\6.728719\\-161.3464\\-55\\4.728719\\-161.9753\\-55\\2.728719\\-162.3988\\-55\\0.7287188\\-162.5742\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.771281\\-160.4794\\-53\\-3.271281\\-160.0187\\-53\\-5.271281\\-159.106\\-53\\-6.271281\\-158.4856\\-53\\-7.67889\\-157.3185\\-53\\-8.771281\\-156.216\\-53\\-9.921006\\-154.8185\\-53\\-10.53123\\-153.8185\\-53\\-11.45093\\-151.8185\\-53\\-11.91314\\-150.3185\\-53\\-12.10858\\-148.8185\\-53\\-12.22991\\-146.8185\\-53\\-11.97614\\-144.3185\\-53\\-11.38256\\-142.3185\\-53\\-10.95748\\-141.3185\\-53\\-9.791958\\-139.3185\\-53\\-8.771281\\-138.0747\\-53\\-7.271281\\-136.6074\\-53\\-5.271281\\-135.212\\-53\\-3.271281\\-134.2706\\-53\\-1.271281\\-133.6957\\-53\\1.228719\\-133.4974\\-53\\3.228719\\-133.5724\\-53\\4.228719\\-133.7169\\-53\\5.728719\\-134.1446\\-53\\7.228719\\-134.7095\\-53\\8.228719\\-135.2521\\-53\\9.728719\\-136.2738\\-53\\11.39702\\-137.8185\\-53\\12.27336\\-138.8185\\-53\\13.30653\\-140.3185\\-53\\13.8515\\-141.3185\\-53\\14.40837\\-142.8185\\-53\\14.82524\\-144.3185\\-53\\15.06075\\-146.8185\\-53\\14.99249\\-148.8185\\-53\\14.8515\\-149.8185\\-53\\13.90512\\-152.8185\\-53\\12.42455\\-155.3185\\-53\\11.72872\\-156.1313\\-53\\9.728719\\-158.0586\\-53\\7.228719\\-159.5793\\-53\\4.728719\\-160.4521\\-53\\1.228719\\-160.8757\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.7287188\\-160.9344\\-51\\-1.271281\\-160.5247\\-51\\-3.771281\\-159.6612\\-51\\-4.771281\\-159.4098\\-51\\-6.271281\\-158.4668\\-51\\-8.125693\\-156.8185\\-51\\-9.964287\\-154.8185\\-51\\-11.27128\\-152.3339\\-51\\-11.95253\\-150.8185\\-51\\-12.24703\\-148.3185\\-51\\-12.30253\\-146.8185\\-51\\-11.91314\\-143.3185\\-51\\-11.51654\\-142.3185\\-51\\-10.61775\\-140.8185\\-51\\-9.846281\\-139.3185\\-51\\-9.099493\\-138.3185\\-51\\-7.624832\\-136.8185\\-51\\-6.771281\\-136.1162\\-51\\-4.771281\\-135.0282\\-51\\-3.271281\\-134.1122\\-51\\-1.271281\\-133.6372\\-51\\0.7287188\\-133.5338\\-51\\2.728719\\-133.5591\\-51\\4.728719\\-133.7492\\-51\\6.228719\\-134.2942\\-51\\8.728719\\-135.6202\\-51\\10.72872\\-137.3014\\-51\\11.72872\\-138.4046\\-51\\13.27978\\-140.3185\\-51\\13.9018\\-141.8185\\-51\\14.16837\\-142.8185\\-51\\14.92515\\-144.8185\\-51\\15.12716\\-146.8185\\-51\\14.91313\\-149.3185\\-51\\13.94546\\-152.3185\\-51\\13.2565\\-153.8185\\-51\\12.34769\\-155.3185\\-51\\11.22872\\-156.6797\\-51\\9.728719\\-157.9801\\-51\\8.228719\\-158.9643\\-51\\7.228719\\-159.4562\\-51\\4.228719\\-160.4297\\-51\\2.228719\\-160.8631\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.771281\\-160.5362\\-49\\-2.771281\\-160.126\\-49\\-4.771281\\-159.5163\\-49\\-5.771281\\-158.9917\\-49\\-7.211929\\-157.8185\\-49\\-8.849406\\-156.3185\\-49\\-10.43012\\-154.3185\\-49\\-11.48175\\-152.3185\\-49\\-12.01805\\-150.8185\\-49\\-12.32234\\-148.8185\\-49\\-12.37034\\-146.3185\\-49\\-11.85732\\-142.8185\\-49\\-9.880177\\-139.3185\\-49\\-9.118665\\-138.3185\\-49\\-7.771281\\-136.9865\\-49\\-6.771281\\-136.1436\\-49\\-3.771281\\-134.5172\\-49\\-3.271281\\-134.1488\\-49\\-1.271281\\-133.6807\\-49\\0.7287188\\-133.5674\\-49\\2.728719\\-133.5993\\-49\\4.728719\\-133.9018\\-49\\6.728719\\-134.6891\\-49\\8.728719\\-135.7245\\-49\\10.53541\\-137.3185\\-49\\12.38943\\-139.3185\\-49\\13.43509\\-140.8185\\-49\\14.43647\\-143.8185\\-49\\14.85372\\-145.3185\\-49\\15.01849\\-146.8185\\-49\\14.93082\\-148.8185\\-49\\14.57146\\-149.8185\\-49\\13.91313\\-152.3185\\-49\\12.94924\\-154.3185\\-49\\11.22872\\-156.6811\\-49\\9.728719\\-157.9994\\-49\\8.228719\\-159.0063\\-49\\6.228719\\-159.8848\\-49\\2.728719\\-160.9662\\-49\\0.7287188\\-161.0388\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.771281\\-160.4273\\-47\\-5.271281\\-159.399\\-47\\-6.771281\\-158.4478\\-47\\-8.083393\\-157.3185\\-47\\-9.921006\\-155.3185\\-47\\-11.39847\\-152.8185\\-47\\-11.96031\\-151.3185\\-47\\-12.41907\\-149.3185\\-47\\-12.5203\\-147.3185\\-47\\-12.42292\\-145.3185\\-47\\-11.97885\\-143.3185\\-47\\-11.42669\\-141.8185\\-47\\-10.32234\\-139.8185\\-47\\-9.271281\\-138.4354\\-47\\-7.643116\\-136.8185\\-47\\-6.271281\\-135.7706\\-47\\-4.271281\\-134.6848\\-47\\-2.771281\\-134.1192\\-47\\-0.7712812\\-133.6766\\-47\\1.228719\\-133.5776\\-47\\3.228719\\-133.6957\\-47\\5.228719\\-134.1505\\-47\\6.728719\\-134.7169\\-47\\9.228719\\-136.1891\\-47\\10.22872\\-137.0286\\-47\\11.50725\\-138.3185\\-47\\12.32524\\-139.3185\\-47\\13.50587\\-141.3185\\-47\\14.31205\\-143.3185\\-47\\14.83276\\-145.8185\\-47\\14.92659\\-147.3185\\-47\\14.82524\\-148.8185\\-47\\14.42075\\-150.8185\\-47\\13.92515\\-152.3185\\-47\\12.93467\\-154.3185\\-47\\11.90026\\-155.8185\\-47\\10.22872\\-157.5495\\-47\\8.228719\\-159.0278\\-47\\6.68751\\-159.8185\\-47\\4.728719\\-160.5219\\-47\\2.728719\\-160.9249\\-47\\1.228719\\-161.0191\\-47\\-0.2712812\\-160.9273\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.271281\\-159.9757\\-45\\-3.771281\\-159.5566\\-45\\-5.271281\\-158.9994\\-45\\-7.271281\\-157.4532\\-45\\-9.347207\\-155.3185\\-45\\-10.43747\\-153.8185\\-45\\-11.92669\\-150.8185\\-45\\-12.27323\\-148.3185\\-45\\-12.34628\\-146.8185\\-45\\-11.90907\\-142.8185\\-45\\-9.771281\\-138.8207\\-45\\-9.434689\\-138.3185\\-45\\-7.271281\\-136.186\\-45\\-3.771281\\-134.1264\\-45\\-1.771281\\-133.5841\\-45\\0.7287188\\-133.3391\\-45\\4.728719\\-133.6122\\-45\\6.728719\\-134.2219\\-45\\8.228719\\-135.0745\\-45\\9.728719\\-136.1583\\-45\\10.93011\\-137.3185\\-45\\12.29208\\-138.8185\\-45\\13.36414\\-140.3185\\-45\\13.92369\\-141.8185\\-45\\14.89841\\-144.8185\\-45\\15.05232\\-146.8185\\-45\\14.91468\\-148.8185\\-45\\14.05397\\-151.3185\\-45\\13.82778\\-152.3185\\-45\\13.3352\\-153.3185\\-45\\12.36054\\-154.8185\\-45\\10.72872\\-156.8978\\-45\\9.228719\\-158.0096\\-45\\7.728719\\-158.9456\\-45\\6.728719\\-159.4321\\-45\\4.728719\\-160.0075\\-45\\2.728719\\-160.4175\\-45\\0.7287188\\-160.512\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.771281\\-159.4847\\-43\\-4.271281\\-158.9249\\-43\\-5.271281\\-158.3877\\-43\\-7.271281\\-156.9082\\-43\\-9.271281\\-154.7764\\-43\\-9.98719\\-153.8185\\-43\\-11.37284\\-151.3185\\-43\\-11.90907\\-149.8185\\-43\\-12.18524\\-146.8185\\-43\\-12.11402\\-144.8185\\-43\\-11.89628\\-142.8185\\-43\\-10.0982\\-139.3185\\-43\\-9.946152\\-138.8185\\-43\\-9.271281\\-137.9948\\-43\\-7.636188\\-136.3185\\-43\\-5.271281\\-134.5922\\-43\\-3.271281\\-133.6026\\-43\\-1.271281\\-133.154\\-43\\0.7287188\\-132.9175\\-43\\2.728719\\-132.9981\\-43\\4.228719\\-133.1668\\-43\\6.228719\\-133.6325\\-43\\7.728719\\-134.2674\\-43\\9.228719\\-135.2188\\-43\\10.50267\\-136.3185\\-43\\12.3939\\-138.3185\\-43\\13.36443\\-139.8185\\-43\\13.87455\\-140.8185\\-43\\14.14001\\-141.8185\\-43\\14.90512\\-143.8185\\-43\\15.10372\\-144.8185\\-43\\15.27336\\-146.8185\\-43\\14.97543\\-148.8185\\-43\\13.49547\\-152.8185\\-43\\12.9028\\-153.8185\\-43\\10.87266\\-156.3185\\-43\\8.728719\\-158.0166\\-43\\6.728719\\-159.0696\\-43\\5.228719\\-159.5479\\-43\\2.728719\\-159.9478\\-43\\0.7287188\\-159.9829\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.271281\\-159.4829\\-41\\-3.271281\\-158.8726\\-41\\-5.271281\\-157.8497\\-41\\-7.170254\\-156.3185\\-41\\-9.271281\\-154.1263\\-41\\-10.52356\\-152.3185\\-41\\-11.41514\\-150.3185\\-41\\-12\\-148.3185\\-41\\-12.06371\\-144.8185\\-41\\-11.85187\\-142.8185\\-41\\-11.44603\\-141.8185\\-41\\-10.63766\\-140.3185\\-41\\-10.02244\\-138.8185\\-41\\-9.346281\\-137.8185\\-41\\-8.45844\\-136.8185\\-41\\-7.271281\\-135.6967\\-41\\-5.271281\\-134.136\\-41\\-4.271281\\-133.6913\\-41\\-1.271281\\-132.634\\-41\\0.7287188\\-132.2002\\-41\\2.728719\\-132.2521\\-41\\4.228719\\-132.5902\\-41\\6.228719\\-133.2351\\-41\\8.728719\\-134.2072\\-41\\11.22872\\-136.4643\\-41\\12.93227\\-138.3185\\-41\\13.27336\\-138.8185\\-41\\14.95854\\-142.8185\\-41\\15.38781\\-144.8185\\-41\\15.35591\\-147.3185\\-41\\14.89841\\-149.3185\\-41\\14.60818\\-149.8185\\-41\\13.44638\\-152.8185\\-41\\12.36761\\-154.3185\\-41\\10.72872\\-156.067\\-41\\9.728719\\-156.979\\-41\\8.228719\\-157.9997\\-41\\6.228719\\-158.8818\\-41\\4.728719\\-159.42\\-41\\2.728719\\-159.5921\\-41\\0.7287188\\-159.5993\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.771281\\-158.5638\\-39\\-4.271281\\-157.9542\\-39\\-5.271281\\-157.4098\\-39\\-7.271281\\-155.9649\\-39\\-8.426606\\-154.8185\\-39\\-9.965292\\-152.8185\\-39\\-10.96479\\-150.8185\\-39\\-11.49531\\-149.3185\\-39\\-11.92669\\-147.3185\\-39\\-12.00115\\-145.3185\\-39\\-11.91711\\-143.8185\\-39\\-11.48019\\-141.8185\\-39\\-10.93575\\-140.3185\\-39\\-9.924596\\-138.3185\\-39\\-8.367061\\-136.3185\\-39\\-7.271281\\-135.2373\\-39\\-5.771281\\-134.128\\-39\\-4.271281\\-133.2804\\-39\\-2.771281\\-132.6462\\-39\\-0.7712812\\-132.1057\\-39\\1.728719\\-131.9249\\-39\\4.728719\\-132.2144\\-39\\6.228719\\-132.6575\\-39\\7.728719\\-133.2907\\-39\\9.228719\\-134.136\\-39\\10.72872\\-135.2581\\-39\\11.79798\\-136.3185\\-39\\13.37057\\-138.3185\\-39\\14.37844\\-140.3185\\-39\\14.91622\\-141.8185\\-39\\15.35591\\-143.8185\\-39\\15.45033\\-145.3185\\-39\\15.36855\\-147.3185\\-39\\14.93494\\-149.3185\\-39\\14.39841\\-150.8185\\-39\\13.40526\\-152.8185\\-39\\11.86842\\-154.8185\\-39\\10.72872\\-155.9523\\-39\\8.728719\\-157.3934\\-39\\7.728719\\-157.9435\\-39\\6.228719\\-158.5452\\-39\\4.728719\\-159.0044\\-39\\1.728719\\-159.3126\\-39\\-0.7712812\\-159.0847\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.7287188\\-159.3848\\-37\\-1.771281\\-158.9603\\-37\\-3.271281\\-158.2324\\-37\\-5.271281\\-157.495\\-37\\-7.271281\\-155.9742\\-37\\-8.921281\\-154.3185\\-37\\-10.37284\\-152.3185\\-37\\-11.50318\\-149.8185\\-37\\-11.98151\\-148.3185\\-37\\-12.13145\\-146.3185\\-37\\-12.13145\\-144.8185\\-37\\-11.98019\\-142.8185\\-37\\-11.50073\\-141.3185\\-37\\-10.35461\\-138.8185\\-37\\-8.905896\\-136.8185\\-37\\-7.271281\\-135.195\\-37\\-5.271281\\-133.6869\\-37\\-3.271281\\-132.899\\-37\\-1.771281\\-132.1869\\-37\\0.7287188\\-131.8088\\-37\\2.728719\\-131.8531\\-37\\4.728719\\-132.115\\-37\\9.228719\\-134.2643\\-37\\10.72872\\-135.5533\\-37\\12.39024\\-137.3185\\-37\\13.45081\\-138.8185\\-37\\14.88598\\-142.3185\\-37\\15.37257\\-144.8185\\-37\\15.32006\\-146.8185\\-37\\14.89319\\-148.8185\\-37\\13.22872\\-152.718\\-37\\12.41455\\-153.8185\\-37\\10.72872\\-155.604\\-37\\9.228719\\-156.9263\\-37\\8.228719\\-157.5148\\-37\\6.228719\\-158.2907\\-37\\4.728719\\-159.0273\\-37\\2.728719\\-159.3427\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.771281\\-159.0158\\-35\\-5.271281\\-157.5469\\-35\\-6.271281\\-156.92\\-35\\-8.624831\\-154.8185\\-35\\-9.88938\\-153.3185\\-35\\-11.4067\\-150.8185\\-35\\-12.0138\\-148.8185\\-35\\-12.33163\\-146.3185\\-35\\-12.33163\\-144.8185\\-35\\-11.90907\\-141.8185\\-35\\-11.39551\\-140.3185\\-35\\-9.870337\\-137.8185\\-35\\-9.08514\\-136.8185\\-35\\-7.271281\\-135.0657\\-35\\-5.271281\\-133.6168\\-35\\-3.271281\\-132.7297\\-35\\-1.271281\\-132.0256\\-35\\0.7287188\\-131.7838\\-35\\2.228719\\-131.8318\\-35\\4.728719\\-132.163\\-35\\5.228719\\-132.4882\\-35\\8.728719\\-134.0483\\-35\\10.72872\\-135.6626\\-35\\11.83157\\-136.8185\\-35\\13.27336\\-138.8185\\-35\\13.90837\\-140.3185\\-35\\14.93358\\-143.8185\\-35\\15.04747\\-144.8185\\-35\\14.93762\\-147.3185\\-35\\13.91653\\-150.8185\\-35\\13.27009\\-152.3185\\-35\\11.40592\\-154.8185\\-35\\10.22872\\-155.9404\\-35\\8.728719\\-157.1197\\-35\\5.228719\\-158.637\\-35\\4.728719\\-158.9682\\-35\\2.228719\\-159.3631\\-35\\0.7287188\\-159.4045\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.271281\\-159.154\\-33\\-2.271281\\-158.8963\\-33\\-4.771281\\-157.8877\\-33\\-6.271281\\-157.0421\\-33\\-7.249963\\-156.3185\\-33\\-9.418083\\-154.3185\\-33\\-10.43271\\-152.8185\\-33\\-11.88725\\-150.3185\\-33\\-12.46331\\-146.8185\\-33\\-12.4049\\-143.8185\\-33\\-11.90064\\-140.8185\\-33\\-10.41773\\-138.3185\\-33\\-9.417235\\-136.8185\\-33\\-7.224985\\-134.8185\\-33\\-6.271281\\-134.1172\\-33\\-4.771281\\-133.2907\\-33\\-3.271281\\-132.608\\-33\\-1.271281\\-132.0029\\-33\\0.7287188\\-131.7838\\-33\\2.728719\\-131.9018\\-33\\4.728719\\-132.2521\\-33\\7.228719\\-133.5129\\-33\\8.728719\\-134.1408\\-33\\11.22872\\-136.3506\\-33\\12.36761\\-137.8185\\-33\\13.25297\\-139.3185\\-33\\13.91925\\-140.8185\\-33\\14.77978\\-144.8185\\-33\\14.76339\\-146.3185\\-33\\14.39495\\-148.3185\\-33\\13.92369\\-150.3185\\-33\\13.2494\\-151.8185\\-33\\12.37586\\-153.3185\\-33\\11.23067\\-154.8185\\-33\\8.728719\\-157.0105\\-33\\7.228719\\-157.6488\\-33\\4.728719\\-158.8663\\-33\\2.228719\\-159.3243\\-33\\0.7287188\\-159.4045\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.271281\\-158.9682\\-31\\-4.771281\\-158.0707\\-31\\-6.771281\\-156.9828\\-31\\-8.207413\\-155.8185\\-31\\-9.271281\\-154.7684\\-31\\-10.4375\\-153.3185\\-31\\-11.31592\\-151.8185\\-31\\-11.98703\\-150.3185\\-31\\-12.44267\\-148.8185\\-31\\-12.79196\\-145.8185\\-31\\-12.42669\\-142.3185\\-31\\-11.97057\\-140.8185\\-31\\-11.50733\\-139.8185\\-31\\-10.38256\\-137.8185\\-31\\-9.271281\\-136.4691\\-31\\-8.108529\\-135.3185\\-31\\-6.771281\\-134.2297\\-31\\-4.771281\\-133.1206\\-31\\-3.771281\\-132.7169\\-31\\-1.771281\\-132.142\\-31\\0.7287188\\-131.9273\\-31\\3.728719\\-132.1786\\-31\\5.228719\\-132.6087\\-31\\6.728719\\-133.1848\\-31\\9.228719\\-134.7156\\-31\\10.95849\\-136.3185\\-31\\11.80931\\-137.3185\\-31\\13.3515\\-139.8185\\-31\\13.92262\\-141.3185\\-31\\14.41468\\-143.3185\\-31\\14.54431\\-145.8185\\-31\\14.4777\\-147.3185\\-31\\13.94017\\-149.8185\\-31\\13.38225\\-151.3185\\-31\\11.88404\\-153.8185\\-31\\11.02568\\-154.8185\\-31\\9.228719\\-156.5063\\-31\\7.728719\\-157.4932\\-31\\5.728719\\-158.439\\-31\\4.228719\\-158.9367\\-31\\2.728719\\-159.1575\\-31\\0.7287188\\-159.3165\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.271281\\-159.3757\\-29\\-3.771281\\-158.9072\\-29\\-7.271281\\-156.9045\\-29\\-9.034212\\-155.3185\\-29\\-9.911112\\-154.3185\\-29\\-10.66724\\-152.8185\\-29\\-11.93037\\-150.8185\\-29\\-12.41111\\-148.3185\\-29\\-12.51099\\-146.8185\\-29\\-12.40064\\-143.8185\\-29\\-11.92292\\-141.3185\\-29\\-11.49616\\-140.3185\\-29\\-8.98694\\-136.8185\\-29\\-7.271281\\-135.1918\\-29\\-5.771281\\-134.1362\\-29\\-4.771281\\-133.6505\\-29\\-1.771281\\-132.6557\\-29\\0.7287188\\-132.2219\\-29\\2.728719\\-132.4542\\-29\\3.728719\\-132.6766\\-29\\6.728719\\-133.7219\\-29\\7.728719\\-134.2144\\-29\\9.228719\\-135.1466\\-29\\10.72872\\-136.3355\\-29\\12.88855\\-139.3185\\-29\\13.43467\\-140.3185\\-29\\13.90346\\-141.8185\\-29\\14.47372\\-144.8185\\-29\\14.50832\\-146.8185\\-29\\14.33276\\-148.3185\\-29\\13.94284\\-150.3185\\-29\\12.92477\\-152.8185\\-29\\11.72872\\-154.6072\\-29\\10.56778\\-155.8185\\-29\\8.728719\\-157.3243\\-29\\5.728719\\-158.8726\\-29\\4.228719\\-159.4175\\-29\\3.228719\\-159.5526\\-29\\0.7287188\\-159.6249\\-29\\-1.271281\\-159.5563\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.271281\\-159.506\\-27\\-5.271281\\-158.516\\-27\\-6.771281\\-157.5182\\-27\\-8.271281\\-156.361\\-27\\-9.371599\\-155.3185\\-27\\-10.33163\\-153.8185\\-27\\-11.96123\\-150.8185\\-27\\-12.3491\\-148.3185\\-27\\-12.44603\\-146.8185\\-27\\-12.39182\\-144.8185\\-27\\-11.92101\\-142.3185\\-27\\-11.38492\\-140.8185\\-27\\-10.37532\\-139.3185\\-27\\-8.444246\\-136.8185\\-27\\-7.271281\\-135.6999\\-27\\-5.771281\\-134.6592\\-27\\-4.771281\\-134.0937\\-27\\-3.271281\\-133.5775\\-27\\-1.271281\\-133.1454\\-27\\0.7287188\\-132.9997\\-27\\2.728719\\-133.073\\-27\\3.728719\\-133.2095\\-27\\5.728719\\-133.7351\\-27\\6.728719\\-134.1015\\-27\\8.728719\\-135.2194\\-27\\10.72872\\-136.7478\\-27\\12.35372\\-138.8185\\-27\\13.3515\\-140.3185\\-27\\13.84925\\-141.8185\\-27\\14.46155\\-144.3185\\-27\\14.71167\\-146.8185\\-27\\14.36022\\-149.3185\\-27\\13.84468\\-151.3185\\-27\\13.22872\\-152.8884\\-27\\12.4242\\-154.3185\\-27\\10.57499\\-156.3185\\-27\\9.228719\\-157.42\\-27\\7.228719\\-158.6128\\-27\\6.728719\\-159.0187\\-27\\5.228719\\-159.5343\\-27\\2.728719\\-159.972\\-27\\0.7287188\\-160.0351\\-27\\-0.7712812\\-159.9249\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.7712812\\-160.42\\-25\\-2.771281\\-159.9478\\-25\\-5.271281\\-159.0036\\-25\\-7.271281\\-157.4827\\-25\\-8.612997\\-156.3185\\-25\\-9.927359\\-154.8185\\-25\\-11.28464\\-152.3185\\-25\\-11.98175\\-150.8185\\-25\\-12.28464\\-148.3185\\-25\\-12.3678\\-146.3185\\-25\\-12.22991\\-144.8185\\-25\\-11.84628\\-142.8185\\-25\\-10.96144\\-140.8185\\-25\\-9.932618\\-139.3185\\-25\\-7.271281\\-136.2379\\-25\\-4.771281\\-134.6192\\-25\\-3.771281\\-134.1612\\-25\\-1.271281\\-133.5674\\-25\\0.7287188\\-133.4603\\-25\\2.728719\\-133.509\\-25\\4.728719\\-133.6979\\-25\\6.728719\\-134.5803\\-25\\8.728719\\-135.5917\\-25\\10.22872\\-136.6485\\-25\\11.34035\\-137.8185\\-25\\12.88855\\-139.8185\\-25\\13.4633\\-140.8185\\-25\\14.39495\\-143.8185\\-25\\14.84698\\-145.8185\\-25\\14.94911\\-146.8185\\-25\\14.85591\\-148.3185\\-25\\14.38412\\-150.3185\\-25\\13.92515\\-151.8185\\-25\\12.87651\\-154.3185\\-25\\10.67515\\-156.8185\\-25\\7.728719\\-158.9521\\-25\\6.728719\\-159.509\\-25\\5.228719\\-159.9542\\-25\\2.728719\\-160.5299\\-25\\0.7287188\\-160.6023\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.271281\\-160.9965\\-23\\-3.271281\\-160.126\\-23\\-5.271281\\-159.3818\\-23\\-7.271281\\-157.8565\\-23\\-9.432798\\-155.8185\\-23\\-10.39628\\-154.3185\\-23\\-11.44267\\-152.3185\\-23\\-11.99461\\-150.8185\\-23\\-12.23324\\-148.3185\\-23\\-12.26933\\-146.8185\\-23\\-12.08845\\-144.8185\\-23\\-11.90064\\-143.8185\\-23\\-10.8491\\-141.3185\\-23\\-9.915627\\-139.8185\\-23\\-9.054068\\-138.8185\\-23\\-7.103042\\-136.8185\\-23\\-5.771281\\-135.7379\\-23\\-4.771281\\-135.1522\\-23\\-2.271281\\-134.1766\\-23\\-0.2712812\\-133.7738\\-23\\0.7287188\\-133.6746\\-23\\2.728719\\-133.7245\\-23\\4.728719\\-134.0765\\-23\\9.228719\\-136.2086\\-23\\10.72872\\-137.5296\\-23\\12.33653\\-139.3185\\-23\\13.40512\\-140.8185\\-23\\14.42369\\-143.8185\\-23\\14.86443\\-145.3185\\-23\\15.05069\\-146.8185\\-23\\14.92515\\-149.3185\\-23\\14.37455\\-151.3185\\-23\\13.28601\\-154.3185\\-23\\12.95635\\-154.8185\\-23\\11.22872\\-156.7847\\-23\\8.728719\\-158.9846\\-23\\5.228719\\-160.5397\\-23\\3.728719\\-160.9997\\-23\\2.728719\\-161.131\\-23\\0.7287188\\-161.1848\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.771281\\-160.9757\\-21\\-4.271281\\-160.3818\\-21\\-5.771281\\-159.5609\\-21\\-7.271281\\-158.5038\\-21\\-8.97267\\-156.8185\\-21\\-10.39847\\-154.8185\\-21\\-11.36523\\-152.8185\\-21\\-11.96771\\-150.8185\\-21\\-12.24003\\-147.8185\\-21\\-11.93575\\-144.8185\\-21\\-11.47738\\-143.3185\\-21\\-10.82857\\-141.8185\\-21\\-9.974161\\-140.3185\\-21\\-8.81017\\-138.8185\\-21\\-7.771281\\-137.7722\\-21\\-5.771281\\-136.2324\\-21\\-3.771281\\-135.2169\\-21\\-2.271281\\-134.6827\\-21\\-0.2712812\\-134.3355\\-21\\1.228719\\-134.1807\\-21\\2.728719\\-134.2771\\-21\\4.728719\\-134.5972\\-21\\6.728719\\-135.2907\\-21\\7.728719\\-135.7492\\-21\\9.228719\\-136.6324\\-21\\10.65908\\-137.8185\\-21\\11.6509\\-138.8185\\-21\\12.87137\\-140.3185\\-21\\13.93647\\-142.3185\\-21\\14.34\\-143.3185\\-21\\14.89841\\-145.3185\\-21\\15.09936\\-147.8185\\-21\\14.99106\\-149.8185\\-21\\14.40512\\-152.3185\\-21\\13.82267\\-153.8185\\-21\\13.27978\\-154.8185\\-21\\11.86333\\-156.8185\\-21\\10.22872\\-158.4379\\-21\\8.728719\\-159.5296\\-21\\6.728719\\-160.556\\-21\\5.728719\\-160.9456\\-21\\3.228719\\-161.5219\\-21\\1.228719\\-161.5954\\-21\\-0.7712812\\-161.472\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.271281\\-161.5534\\-19\\-4.771281\\-160.8663\\-19\\-6.271281\\-159.9966\\-19\\-7.735567\\-158.8185\\-19\\-9.957422\\-156.3185\\-19\\-11.92669\\-152.3185\\-19\\-12.13978\\-150.3185\\-19\\-12.20202\\-148.8185\\-19\\-12.12156\\-146.8185\\-19\\-11.82234\\-144.8185\\-19\\-10.01287\\-141.3185\\-19\\-9.386007\\-140.3185\\-19\\-7.271281\\-138.1688\\-19\\-5.771281\\-137.0964\\-19\\-4.271281\\-136.212\\-19\\-3.271281\\-135.7674\\-19\\-0.2712812\\-135.2581\\-19\\0.7287188\\-135.1522\\-19\\2.728719\\-135.2095\\-19\\5.228719\\-135.6612\\-19\\6.728719\\-136.2492\\-19\\9.228719\\-137.6523\\-19\\10.72872\\-138.99\\-19\\11.95741\\-140.3185\\-19\\12.95755\\-141.8185\\-19\\13.87844\\-143.8185\\-19\\14.38036\\-145.3185\\-19\\14.84468\\-147.3185\\-19\\14.9691\\-148.8185\\-19\\14.79798\\-150.3185\\-19\\14.04122\\-152.8185\\-19\\13.86234\\-153.8185\\-19\\13.4655\\-154.8185\\-19\\12.8352\\-155.8185\\-19\\10.72872\\-158.3604\\-19\\8.728719\\-160.0485\\-19\\7.228719\\-161.0219\\-19\\6.228719\\-161.4297\\-19\\4.228719\\-161.9045\\-19\\0.7287188\\-162.2838\\-19\\-1.271281\\-162.0142\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.7287188\\-163.3243\\-17\\-1.271281\\-163.0501\\-17\\-3.271281\\-162.1979\\-17\\-5.271281\\-161.5221\\-17\\-6.771281\\-160.4306\\-17\\-8.50683\\-158.8185\\-17\\-9.446281\\-157.8185\\-17\\-10.45298\\-156.3185\\-17\\-11.50469\\-154.3185\\-17\\-12.0158\\-152.8185\\-17\\-12.26933\\-150.3185\\-17\\-12.2435\\-148.8185\\-17\\-12.08075\\-146.8185\\-17\\-11.52916\\-144.8185\\-17\\-10.47753\\-142.8185\\-17\\-9.4785\\-141.3185\\-17\\-8.542588\\-140.3185\\-17\\-6.771281\\-138.6381\\-17\\-5.271281\\-137.5829\\-17\\-3.271281\\-136.6444\\-17\\-1.771281\\-136.1133\\-17\\0.7287188\\-135.7907\\-17\\2.728719\\-135.9098\\-17\\4.728719\\-136.2706\\-17\\7.228719\\-137.5503\\-17\\8.728719\\-138.1269\\-17\\10.63472\\-139.8185\\-17\\11.9027\\-141.3185\\-17\\13.34235\\-143.8185\\-17\\13.82006\\-144.8185\\-17\\14.47193\\-147.8185\\-17\\14.55733\\-148.8185\\-17\\14.47661\\-150.8185\\-17\\14.04431\\-152.8185\\-17\\13.83276\\-154.3185\\-17\\12.77009\\-156.3185\\-17\\10.93237\\-158.8185\\-17\\8.702775\\-160.8185\\-17\\6.228719\\-162.039\\-17\\3.728719\\-162.9273\\-17\\2.728719\\-163.1253\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "28" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-2.771281\\-163.415\\-15\\-3.771281\\-163.0526\\-15\\-5.771281\\-162.0211\\-15\\-7.271281\\-161.0078\\-15\\-9.487383\\-158.8185\\-15\\-9.865231\\-158.3185\\-15\\-10.55003\\-156.8185\\-15\\-11.49003\\-155.3185\\-15\\-11.96479\\-154.3185\\-15\\-12.29196\\-152.3185\\-15\\-12.40064\\-150.8185\\-15\\-12.30253\\-148.8185\\-15\\-11.94436\\-146.3185\\-15\\-10.41907\\-143.3185\\-15\\-9.365459\\-141.8185\\-15\\-7.271281\\-139.6763\\-15\\-5.271281\\-138.2872\\-15\\-3.771281\\-137.642\\-15\\-1.771281\\-137.1167\\-15\\0.7287188\\-136.7095\\-15\\4.228719\\-137.1707\\-15\\5.728719\\-137.6113\\-15\\7.228719\\-138.2463\\-15\\9.228719\\-139.5954\\-15\\10.72872\\-141.0194\\-15\\11.40098\\-141.8185\\-15\\13.44035\\-144.8185\\-15\\13.85808\\-146.3185\\-15\\14.33028\\-148.8185\\-15\\14.34\\-150.8185\\-15\\13.91155\\-154.3185\\-15\\13.3515\\-155.8185\\-15\\12.84496\\-156.8185\\-15\\11.8352\\-158.3185\\-15\\10.48431\\-159.8185\\-15\\8.728719\\-161.4933\\-15\\6.228719\\-162.8427\\-15\\4.728719\\-163.4562\\-15\\1.728719\\-163.8757\\-15\\0.2287188\\-163.9072\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "29" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.2287188\\-164.9321\\-13\\-1.771281\\-164.4738\\-13\\-3.771281\\-163.7219\\-13\\-5.271281\\-163.3877\\-13\\-8.271281\\-160.965\\-13\\-9.417254\\-159.8185\\-13\\-10.50711\\-158.3185\\-13\\-11.94267\\-155.3185\\-13\\-12.39406\\-153.3185\\-13\\-12.47885\\-150.3185\\-13\\-12.35461\\-148.8185\\-13\\-12.00426\\-146.8185\\-13\\-10.96429\\-144.8185\\-13\\-9.271281\\-142.3204\\-13\\-7.230683\\-140.3185\\-13\\-5.271281\\-139.1205\\-13\\-3.271281\\-138.0825\\-13\\-1.271281\\-137.647\\-13\\0.7287188\\-137.5495\\-13\\2.728719\\-137.6101\\-13\\5.228719\\-138.1193\\-13\\6.728719\\-139.0432\\-13\\8.228719\\-139.663\\-13\\9.119103\\-140.3185\\-13\\10.72872\\-141.954\\-13\\11.8889\\-143.3185\\-13\\12.88036\\-144.8185\\-13\\13.3352\\-145.8185\\-13\\13.82267\\-147.3185\\-13\\14.03229\\-148.8185\\-13\\14.13477\\-150.8185\\-13\\13.95154\\-154.3185\\-13\\13.41925\\-156.3185\\-13\\11.9081\\-158.8185\\-13\\10.72872\\-160.2131\\-13\\8.228719\\-162.4987\\-13\\6.728719\\-163.4898\\-13\\4.228719\\-164.1097\\-13\\3.228719\\-164.5408\\-13\\1.228719\\-164.9478\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "30" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-3.271281\\-164.9709\\-11\\-5.771281\\-163.9072\\-11\\-7.271281\\-162.9867\\-11\\-9.974498\\-160.3185\\-11\\-10.99843\\-158.8185\\-11\\-11.91907\\-156.8185\\-11\\-12.46479\\-154.8185\\-11\\-12.60681\\-152.8185\\-11\\-12.58378\\-150.8185\\-11\\-12.41111\\-148.8185\\-11\\-11.95093\\-146.8185\\-11\\-10.35999\\-144.3185\\-11\\-9.271281\\-142.9763\\-11\\-6.771281\\-140.6415\\-11\\-5.271281\\-139.6891\\-11\\-2.271281\\-138.6746\\-11\\0.7287188\\-138.1454\\-11\\3.728719\\-138.6207\\-11\\6.728719\\-139.6786\\-11\\8.228719\\-140.5795\\-11\\10.72872\\-142.9246\\-11\\11.92113\\-144.3185\\-11\\12.89775\\-145.8185\\-11\\13.40837\\-146.8185\\-11\\13.92515\\-148.8185\\-11\\14.06075\\-152.8185\\-11\\13.94156\\-154.8185\\-11\\13.44924\\-156.8185\\-11\\12.40628\\-158.8185\\-11\\11.41015\\-160.3185\\-11\\8.728719\\-162.9957\\-11\\7.228719\\-163.8848\\-11\\4.728719\\-165.0337\\-11\\2.728719\\-165.5326\\-11\\0.7287188\\-165.6231\\-11\\-1.271281\\-165.5318\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "31" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.271281\\-166.4273\\-9\\-3.271281\\-165.9847\\-9\\-5.771281\\-164.939\\-9\\-7.271281\\-164.0142\\-9\\-8.676523\\-162.8185\\-9\\-9.771281\\-161.6935\\-9\\-10.87478\\-160.3185\\-9\\-11.96709\\-158.3185\\-9\\-12.48344\\-156.8185\\-9\\-12.95724\\-154.8185\\-9\\-13.04846\\-152.8185\\-9\\-12.96479\\-150.8185\\-9\\-12.34343\\-148.3185\\-9\\-11.9691\\-147.3185\\-9\\-10.89628\\-145.3185\\-9\\-9.690689\\-143.8185\\-9\\-8.715526\\-142.8185\\-9\\-6.771281\\-141.2406\\-9\\-4.771281\\-140.1786\\-9\\-3.271281\\-139.63\\-9\\-1.271281\\-139.1786\\-9\\0.7287188\\-139.0809\\-9\\2.228719\\-139.154\\-9\\4.728719\\-139.7072\\-9\\5.728719\\-140.0908\\-9\\7.728719\\-141.0915\\-9\\9.228719\\-142.1443\\-9\\11.36866\\-144.3185\\-9\\12.40709\\-145.8185\\-9\\13.37844\\-147.8185\\-9\\13.87057\\-149.3185\\-9\\14.30931\\-152.8185\\-9\\13.86443\\-156.3185\\-9\\13.36443\\-157.8185\\-9\\12.39588\\-159.8185\\-9\\10.92024\\-161.8185\\-9\\9.228719\\-163.4804\\-9\\7.728719\\-164.5341\\-9\\5.728719\\-165.5333\\-9\\4.228719\\-166.0497\\-9\\2.228719\\-166.4542\\-9\\0.7287188\\-166.5329\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "32" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.7712812\\-167.3848\\-7\\-2.771281\\-166.9757\\-7\\-5.271281\\-165.8391\\-7\\-6.771281\\-165.0282\\-7\\-9.377184\\-162.8185\\-7\\-11.43931\\-159.8185\\-7\\-11.97152\\-158.8185\\-7\\-12.35732\\-157.3185\\-7\\-12.6648\\-154.3185\\-7\\-12.66\\-152.8185\\-7\\-12.45093\\-150.3185\\-7\\-11.84343\\-148.3185\\-7\\-11.01359\\-146.8185\\-7\\-9.969198\\-145.3185\\-7\\-9.271281\\-144.5486\\-7\\-7.271281\\-142.6365\\-7\\-4.771281\\-141.212\\-7\\-3.271281\\-140.5793\\-7\\-1.771281\\-140.1044\\-7\\0.7287188\\-139.9124\\-7\\3.228719\\-140.0975\\-7\\5.228719\\-140.7643\\-7\\7.228719\\-141.7025\\-7\\8.728719\\-142.6048\\-7\\10.72872\\-144.4036\\-7\\11.83761\\-145.8185\\-7\\12.8665\\-147.3185\\-7\\13.41432\\-148.3185\\-7\\13.93221\\-150.3185\\-7\\14.27336\\-152.8185\\-7\\14.28601\\-154.3185\\-7\\13.88036\\-157.3185\\-7\\13.4552\\-158.8185\\-7\\12.39896\\-160.8185\\-7\\10.91778\\-162.8185\\-7\\9.728719\\-163.9124\\-7\\8.228719\\-165.0588\\-7\\6.728719\\-165.8906\\-7\\4.228719\\-166.9775\\-7\\2.728719\\-167.3391\\-7\\0.7287188\\-167.4811\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "33" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-1.771281\\-167.9542\\-5\\-3.271281\\-167.5379\\-5\\-4.771281\\-166.9847\\-5\\-7.271281\\-165.4656\\-5\\-8.271281\\-164.5796\\-5\\-9.94198\\-162.8185\\-5\\-10.94446\\-161.3185\\-5\\-11.89406\\-159.3185\\-5\\-12.46626\\-157.3185\\-5\\-12.71399\\-154.3185\\-5\\-12.38018\\-151.3185\\-5\\-11.51171\\-148.8185\\-5\\-10.39793\\-146.8185\\-5\\-9.271281\\-145.478\\-5\\-8.107374\\-144.3185\\-5\\-6.771281\\-143.1866\\-5\\-4.771281\\-142.0776\\-5\\-2.271281\\-141.2072\\-5\\0.7287188\\-140.8663\\-5\\2.728719\\-140.9959\\-5\\4.228719\\-141.2169\\-5\\6.728719\\-142.0831\\-5\\8.728719\\-143.2324\\-5\\10.04348\\-144.3185\\-5\\11.22872\\-145.5048\\-5\\12.29798\\-146.8185\\-5\\13.44351\\-148.8185\\-5\\13.84\\-149.8185\\-5\\14.39669\\-151.8185\\-5\\14.59722\\-154.3185\\-5\\14.37455\\-157.3185\\-5\\13.95258\\-158.8185\\-5\\13.39582\\-160.3185\\-5\\11.85145\\-162.8185\\-5\\10.22872\\-164.5365\\-5\\9.228719\\-165.4269\\-5\\6.728719\\-166.9591\\-5\\5.228719\\-167.5221\\-5\\3.728719\\-167.939\\-5\\2.728719\\-168.0805\\-5\\0.7287188\\-168.1593\\-5" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "6" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "0\\0\\255" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4995\\-203.5678\\-165\\-120.5937\\-201.6146\\-165\\-120.5044\\-199.6615\\-165\\-119.4168\\-198.4154\\-165\\-117.7781\\-199.6615\\-165\\-117.4883\\-201.6146\\-165\\-119.3273\\-203.5678\\-165" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-204.4669\\-163\\-120.5383\\-203.5678\\-163\\-120.7776\\-201.6146\\-163\\-119.8859\\-199.6615\\-163\\-119.4168\\-199.1956\\-163\\-118.7628\\-199.6615\\-163\\-117.4637\\-201.0101\\-163\\-117.067\\-201.6146\\-163\\-118.4403\\-203.5678\\-163" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-204.5322\\-161\\-120.6583\\-203.5678\\-161\\-120.7851\\-201.6146\\-161\\-119.4168\\-199.7137\\-161\\-117.4637\\-200.5271\\-161\\-116.7459\\-201.6146\\-161\\-118.3749\\-203.5678\\-161" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "6" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-204.3647\\-159\\-120.2877\\-203.5678\\-159\\-120.7776\\-201.6146\\-159\\-119.4168\\-199.7281\\-159\\-117.4637\\-199.9097\\-159\\-116.4779\\-201.6146\\-159" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "6" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-203.5156\\-157\\-120.993\\-201.6146\\-157\\-119.4168\\-199.7281\\-157\\-117.4637\\-199.6877\\-157\\-116.4161\\-201.6146\\-157\\-117.4637\\-202.5824\\-157" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-202.397\\-155\\-122.0797\\-201.6146\\-155\\-121.37\\-200.5042\\-155\\-119.4168\\-199.6994\\-155\\-117.4637\\-199.8824\\-155\\-116.637\\-201.6146\\-155\\-117.4637\\-202.3495\\-155\\-119.4168\\-202.8882\\-155" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-203.1456\\-153\\-122.5448\\-201.6146\\-153\\-122.4594\\-199.6615\\-153\\-123.3231\\-198.3154\\-153\\-125.2762\\-197.9441\\-153\\-127.2293\\-198.8704\\-153\\-128.3016\\-197.7084\\-153\\-127.2293\\-196.5592\\-153\\-125.2762\\-196.9653\\-153\\-123.3231\\-196.9339\\-153\\-121.37\\-197.3683\\-153\\-119.6871\\-199.6615\\-153\\-118.0209\\-201.6146\\-153\\-119.4168\\-202.6304\\-153" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-203.344\\-151\\-122.6089\\-201.6146\\-151\\-122.4269\\-199.6615\\-151\\-121.37\\-198.3038\\-151\\-120.3819\\-199.6615\\-151\\-118.5777\\-201.6146\\-151\\-119.4168\\-202.4454\\-151" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-171.2091\\-149\\-43.15147\\-170.3646\\-149\\-45.1981\\-168.3139\\-149\\-46.11063\\-166.4584\\-149\\-45.1981\\-165.2122\\-149\\-42.53649\\-162.5521\\-149\\-41.29185\\-161.6277\\-149\\-39.33873\\-161.7262\\-149\\-37.3856\\-163.6955\\-149\\-36.4542\\-164.5053\\-149\\-34.88807\\-166.4584\\-149\\-36.44037\\-168.4115\\-149\\-38.3279\\-170.3646\\-149\\-39.33873\\-171.1723\\-149" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-173.0039\\-147\\-46.62139\\-172.3178\\-147\\-47.15123\\-171.9095\\-147\\-49.10435\\-171.6348\\-147\\-51.05748\\-170.9334\\-147\\-51.39357\\-170.3646\\-147\\-50.16919\\-168.4115\\-147\\-49.36344\\-166.4584\\-147\\-49.10435\\-166.172\\-147\\-46.74353\\-164.5053\\-147\\-45.1981\\-163.6972\\-147\\-43.24498\\-161.7185\\-147\\-41.29185\\-161.0959\\-147\\-39.33873\\-161.5796\\-147\\-37.3856\\-163.5331\\-147\\-35.54006\\-164.5053\\-147\\-34.40963\\-166.4584\\-147\\-38.14181\\-170.3646\\-147\\-39.33873\\-171.3974\\-147\\-41.29185\\-172.114\\-147\\-43.24498\\-173.6062\\-147" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "10" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-172.2589\\-145\\-51.88936\\-170.3646\\-145\\-49.9113\\-166.4584\\-145\\-49.10435\\-165.6514\\-145\\-45.1981\\-163.6128\\-145\\-43.24498\\-161.6333\\-145\\-41.29185\\-161.015\\-145\\-39.33873\\-161.5001\\-145\\-37.3856\\-162.8581\\-145\\-35.43248\\-163.8162\\-145\\-34.65681\\-164.5053\\-145\\-34.33782\\-166.4584\\-145\\-37.3856\\-169.495\\-145\\-39.33873\\-170.5286\\-145\\-41.29185\\-170.5388\\-145\\-45.1981\\-169.2225\\-145\\-47.15123\\-169.6139\\-145\\-49.10435\\-171.4739\\-145" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "11" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-204.958\\-143\\-124.2414\\-203.5678\\-143\\-123.3231\\-202.4856\\-143\\-121.37\\-201.0149\\-143\\-119.4168\\-200.6575\\-143\\-117.4637\\-200.6332\\-143\\-116.4622\\-201.6146\\-143\\-117.4637\\-202.5912\\-143\\-119.4168\\-202.5718\\-143\\-120.4331\\-203.5678\\-143\\-121.37\\-204.7359\\-143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "12" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-172.1929\\-143\\-51.86792\\-170.3646\\-143\\-51.05748\\-168.578\\-143\\-49.93924\\-166.4584\\-143\\-49.10435\\-165.6278\\-143\\-45.1981\\-163.6128\\-143\\-43.24498\\-161.6333\\-143\\-41.29185\\-161.0054\\-143\\-39.33873\\-161.0699\\-143\\-37.3856\\-161.6558\\-143\\-34.47985\\-164.5053\\-143\\-34.13548\\-166.4584\\-143\\-36.05906\\-168.4115\\-143\\-37.3856\\-169.4889\\-143\\-39.33873\\-170.3873\\-143\\-41.29185\\-170.3873\\-143\\-45.1981\\-168.52\\-143\\-47.15123\\-169.4972\\-143\\-49.10435\\-171.4468\\-143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "13" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-206.564\\-141\\-124.4056\\-205.5209\\-141\\-124.8603\\-203.5678\\-141\\-123.4396\\-201.6146\\-141\\-123.1701\\-201.6146\\-141\\-121.37\\-202.3617\\-141\\-119.4168\\-201.3438\\-141\\-117.4637\\-200.4936\\-141\\-116.4512\\-201.6146\\-141\\-117.4637\\-202.6\\-141\\-119.4168\\-203.9364\\-141\\-120.4755\\-205.5209\\-141\\-121.37\\-206.4524\\-141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "14" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-171.144\\-141\\-51.53709\\-170.3646\\-141\\-50.94897\\-168.4115\\-141\\-49.93924\\-166.4584\\-141\\-49.10435\\-165.6278\\-141\\-45.1981\\-163.6128\\-141\\-43.24498\\-161.6333\\-141\\-41.29185\\-161.0054\\-141\\-39.33873\\-161.0054\\-141\\-37.3856\\-161.782\\-141\\-35.43248\\-163.8127\\-141\\-34.65681\\-164.5053\\-141\\-33.71507\\-166.4584\\-141\\-35.50452\\-168.4115\\-141\\-37.3856\\-169.4889\\-141\\-39.33873\\-170.3873\\-141\\-41.29185\\-170.3873\\-141\\-45.06961\\-168.4115\\-141\\-45.335\\-168.4115\\-141\\-47.15123\\-169.4397\\-141\\-49.10435\\-171.4324\\-141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "15" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-208.2524\\-139\\-124.6333\\-207.474\\-139\\-125.2762\\-206.9345\\-139\\-126.2388\\-205.5209\\-139\\-126.9103\\-203.5678\\-139\\-127.987\\-201.6146\\-139\\-129.8008\\-199.6615\\-139\\-129.9937\\-197.7084\\-139\\-129.1825\\-196.8613\\-139\\-127.2293\\-195.7637\\-139\\-126.0461\\-197.7084\\-139\\-126.0514\\-199.6615\\-139\\-125.2762\\-200.3583\\-139\\-123.3231\\-200.6518\\-139\\-120.1878\\-203.5678\\-139\\-120.3096\\-205.5209\\-139\\-121.37\\-206.5723\\-139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "16" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.06511\\-170.3646\\-139\\-50.9465\\-168.4115\\-139\\-49.93924\\-166.4584\\-139\\-49.10435\\-165.6278\\-139\\-45.1981\\-163.6128\\-139\\-43.24498\\-161.6333\\-139\\-41.29185\\-161.0054\\-139\\-39.33873\\-161.0054\\-139\\-37.3856\\-162.4204\\-139\\-35.33741\\-164.5053\\-139\\-33.62796\\-166.4584\\-139\\-35.38265\\-168.4115\\-139\\-37.3856\\-169.4889\\-139\\-39.33873\\-170.3873\\-139\\-41.29185\\-170.3873\\-139\\-43.24498\\-169.3976\\-139\\-45.1981\\-167.7354\\-139\\-47.15123\\-168.4348\\-139\\-49.10435\\-171.2141\\-139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "17" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-125.2762\\-208.1304\\-137\\-125.9399\\-207.474\\-137\\-127.3648\\-205.5209\\-137\\-129.1825\\-202.1513\\-137\\-129.5619\\-201.6146\\-137\\-130.3909\\-199.6615\\-137\\-130.0337\\-197.7084\\-137\\-129.1825\\-196.8433\\-137\\-127.2293\\-195.7629\\-137\\-125.2762\\-196.6599\\-137\\-124.2997\\-197.7084\\-137\\-122.2621\\-199.6615\\-137\\-121.0577\\-201.6146\\-137\\-120.2314\\-203.5678\\-137\\-119.9222\\-205.5209\\-137\\-121.37\\-206.7067\\-137\\-123.3231\\-208.4724\\-137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "18" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-170.5765\\-137\\-50.00279\\-170.3646\\-137\\-50.9301\\-168.4115\\-137\\-49.93924\\-166.4584\\-137\\-49.10435\\-165.6278\\-137\\-47.15123\\-164.4677\\-137\\-45.1981\\-163.5647\\-137\\-43.24498\\-161.6333\\-137\\-41.29185\\-161.0054\\-137\\-39.33873\\-161.0054\\-137\\-37.39323\\-162.5521\\-137\\-33.62796\\-166.4584\\-137\\-35.38265\\-168.4115\\-137\\-37.3856\\-169.4889\\-137\\-39.33873\\-170.3873\\-137\\-41.29185\\-170.3873\\-137\\-43.24498\\-169.3929\\-137\\-45.1981\\-167.5378\\-137\\-47.15123\\-167.6395\\-137\\-47.95702\\-168.4115\\-137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "19" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-125.2762\\-207.7558\\-135\\-127.2293\\-206.295\\-135\\-127.9764\\-205.5209\\-135\\-129.4864\\-203.5678\\-135\\-130.3591\\-201.6146\\-135\\-130.6917\\-199.6615\\-135\\-130.0337\\-197.7084\\-135\\-129.1825\\-196.8433\\-135\\-127.2293\\-195.8907\\-135\\-125.2762\\-196.606\\-135\\-123.3231\\-197.1559\\-135\\-121.37\\-198.1381\\-135\\-119.4268\\-199.6615\\-135\\-118.9955\\-201.6146\\-135\\-119.7529\\-203.5678\\-135\\-119.2814\\-205.5209\\-135\\-121.37\\-206.9043\\-135\\-123.3231\\-208.0513\\-135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "20" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-170.3873\\-135\\-43.24498\\-169.3881\\-135\\-45.1981\\-167.478\\-135\\-47.15123\\-167.5463\\-135\\-48.03013\\-168.4115\\-135\\-49.10435\\-169.7198\\-135\\-50.92669\\-168.4115\\-135\\-49.93924\\-166.4584\\-135\\-47.15123\\-163.8424\\-135\\-45.1981\\-163.3728\\-135\\-43.24498\\-161.624\\-135\\-41.29185\\-161.0054\\-135\\-39.33873\\-161.0054\\-135\\-37.3856\\-162.3643\\-135\\-35.28936\\-164.5053\\-135\\-33.62796\\-166.4584\\-135\\-35.38265\\-168.4115\\-135\\-37.3856\\-169.4064\\-135\\-39.33873\\-170.2561\\-135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "21" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-206.3476\\-133\\-129.9039\\-203.5678\\-133\\-130.6826\\-201.6146\\-133\\-130.7586\\-199.6615\\-133\\-130.0337\\-197.7084\\-133\\-129.1825\\-196.8433\\-133\\-127.2293\\-196.3109\\-133\\-125.2762\\-197.0659\\-133\\-121.37\\-196.7771\\-133\\-119.4168\\-198.278\\-133\\-117.4864\\-199.6615\\-133\\-118.4003\\-201.6146\\-133\\-119.06\\-203.5678\\-133\\-120.1311\\-205.5209\\-133\\-121.37\\-206.6685\\-133\\-123.3231\\-207.17\\-133\\-125.2762\\-207.1172\\-133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "22" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.32029\\-170.3646\\-133\\-43.24498\\-169.3881\\-133\\-45.1981\\-167.478\\-133\\-47.15123\\-167.5463\\-133\\-49.10435\\-169.5208\\-133\\-50.92669\\-168.4115\\-133\\-49.93924\\-166.4584\\-133\\-47.15123\\-163.7041\\-133\\-45.1981\\-162.9292\\-133\\-43.24498\\-161.624\\-133\\-41.29185\\-161.0054\\-133\\-39.33873\\-161.0054\\-133\\-37.3856\\-161.7295\\-133\\-35.43248\\-163.7582\\-133\\-34.61152\\-164.5053\\-133\\-33.62796\\-166.4584\\-133\\-35.43248\\-168.2761\\-133\\-37.3856\\-168.9142\\-133\\-39.33873\\-169.7291\\-133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "23" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-206.4227\\-131\\-129.9608\\-203.5678\\-131\\-130.7389\\-201.6146\\-131\\-130.7586\\-199.6615\\-131\\-130.0337\\-197.7084\\-131\\-129.1825\\-196.8433\\-131\\-127.2293\\-196.497\\-131\\-125.2762\\-197.4609\\-131\\-123.3231\\-197.1387\\-131\\-121.37\\-197.1465\\-131\\-119.4168\\-197.8169\\-131\\-118.1332\\-199.6615\\-131\\-118.973\\-203.5678\\-131\\-119.4168\\-204.0694\\-131\\-120.3186\\-205.5209\\-131\\-121.37\\-206.5767\\-131\\-123.3231\\-207.0393\\-131\\-125.2762\\-207.0393\\-131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "24" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.30143\\-170.3646\\-131\\-43.24498\\-169.3881\\-131\\-45.1981\\-167.478\\-131\\-47.15123\\-167.5463\\-131\\-49.10435\\-169.4972\\-131\\-50.92669\\-168.4115\\-131\\-49.93924\\-166.4584\\-131\\-47.15123\\-163.6592\\-131\\-45.15527\\-162.5521\\-131\\-43.24498\\-161.5885\\-131\\-41.29185\\-161.0054\\-131\\-39.33873\\-161.0054\\-131\\-37.3856\\-161.5968\\-131\\-34.46535\\-164.5053\\-131\\-33.63014\\-166.4584\\-131\\-35.43248\\-167.7284\\-131\\-37.3856\\-167.776\\-131\\-39.33873\\-169.5411\\-131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "25" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-206.6955\\-129\\-128.4934\\-205.5209\\-129\\-129.9666\\-203.5678\\-129\\-130.7389\\-201.6146\\-129\\-130.7586\\-199.6615\\-129\\-130.128\\-197.7084\\-129\\-129.1825\\-196.7371\\-129\\-127.2293\\-196.4582\\-129\\-125.2762\\-196.9323\\-129\\-123.3231\\-196.8128\\-129\\-121.37\\-197.6276\\-129\\-119.4168\\-197.7471\\-129\\-118.2459\\-199.6615\\-129\\-118.7921\\-201.6146\\-129\\-118.973\\-203.5678\\-129\\-120.262\\-205.5209\\-129\\-121.37\\-206.7145\\-129\\-123.3231\\-207.2035\\-129\\-125.2762\\-207.0486\\-129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "26" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.30143\\-170.3646\\-129\\-43.24498\\-169.3881\\-129\\-45.1981\\-167.478\\-129\\-47.15123\\-167.5463\\-129\\-49.10435\\-169.4972\\-129\\-50.92669\\-168.4115\\-129\\-49.93924\\-166.4584\\-129\\-48.09834\\-164.5053\\-129\\-45.1981\\-161.8307\\-129\\-41.29185\\-161.0054\\-129\\-39.33873\\-161.0054\\-129\\-37.3856\\-161.584\\-129\\-34.45126\\-164.5053\\-129\\-33.64341\\-166.4584\\-129\\-35.43248\\-167.5284\\-129\\-37.3856\\-167.6038\\-129\\-39.33873\\-169.5001\\-129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "27" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-208.1576\\-127\\-125.2762\\-207.3932\\-127\\-127.2293\\-207.097\\-127\\-128.6942\\-205.5209\\-127\\-129.9666\\-203.5678\\-127\\-130.7389\\-201.6146\\-127\\-130.7586\\-199.6615\\-127\\-130.5285\\-197.7084\\-127\\-129.1825\\-196.2082\\-127\\-127.2293\\-196.0701\\-127\\-123.3231\\-196.5014\\-127\\-121.37\\-197.5201\\-127\\-119.4168\\-197.7459\\-127\\-117.7998\\-199.6615\\-127\\-118.4891\\-201.6146\\-127\\-118.9639\\-203.5678\\-127\\-119.6406\\-205.5209\\-127\\-120.7763\\-207.474\\-127\\-121.37\\-208.0513\\-127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "28" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-115.5106\\-206.2984\\-127\\-116.1531\\-205.5209\\-127\\-115.2401\\-203.5678\\-127\\-113.5575\\-201.7094\\-127\\-111.6043\\-203.2542\\-127\\-111.3686\\-203.5678\\-127\\-112.5125\\-205.5209\\-127\\-113.5575\\-206.5467\\-127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "29" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.30143\\-170.3646\\-127\\-43.24498\\-169.3881\\-127\\-45.1981\\-167.478\\-127\\-47.15123\\-167.5463\\-127\\-49.10435\\-169.4972\\-127\\-50.92669\\-168.4115\\-127\\-49.95071\\-166.4584\\-127\\-48.54872\\-164.5053\\-127\\-45.1981\\-161.6746\\-127\\-43.24498\\-161.0873\\-127\\-39.33873\\-161.0054\\-127\\-37.3856\\-161.584\\-127\\-34.45126\\-164.5053\\-127\\-33.64745\\-166.4584\\-127\\-35.43248\\-167.5004\\-127\\-37.3856\\-167.5673\\-127\\-39.33873\\-169.5001\\-127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "30" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.0329\\-125\\-127.8083\\-207.474\\-125\\-128.8464\\-205.5209\\-125\\-130.0424\\-203.5678\\-125\\-130.7389\\-201.6146\\-125\\-130.7292\\-197.7084\\-125\\-129.1825\\-195.8907\\-125\\-127.2293\\-195.7928\\-125\\-125.2762\\-195.8218\\-125\\-123.3231\\-196.0701\\-125\\-119.4168\\-197.5075\\-125\\-117.4637\\-199.5872\\-125\\-118.3749\\-201.6146\\-125\\-118.8051\\-203.5678\\-125\\-118.8259\\-205.5209\\-125\\-121.37\\-207.9114\\-125\\-123.3231\\-208.5313\\-125\\-125.2762\\-208.6126\\-125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "31" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-115.5106\\-206.6492\\-125\\-116.367\\-205.5209\\-125\\-115.2515\\-203.5678\\-125\\-113.5575\\-201.6223\\-125\\-111.6043\\-203.1936\\-125\\-111.3338\\-203.5678\\-125\\-112.5125\\-205.5209\\-125\\-113.5575\\-206.5515\\-125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "32" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.30143\\-170.3646\\-125\\-43.24498\\-169.3321\\-125\\-45.1981\\-167.4105\\-125\\-47.15123\\-167.5463\\-125\\-49.10435\\-169.4972\\-125\\-50.92669\\-168.4115\\-125\\-49.95635\\-166.4584\\-125\\-48.84526\\-164.5053\\-125\\-46.73161\\-162.5521\\-125\\-45.1981\\-161.6434\\-125\\-43.24498\\-161.0054\\-125\\-39.33873\\-161.0054\\-125\\-37.3856\\-161.584\\-125\\-34.45126\\-164.5053\\-125\\-33.64745\\-166.4584\\-125\\-35.43248\\-167.5004\\-125\\-37.3856\\-167.5673\\-125\\-39.33873\\-169.5001\\-125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "33" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2358\\-123\\-127.9872\\-207.474\\-123\\-129.6649\\-205.5209\\-123\\-130.5003\\-203.5678\\-123\\-130.7487\\-201.6146\\-123\\-130.7586\\-197.7084\\-123\\-129.1825\\-195.7928\\-123\\-125.2762\\-195.7476\\-123\\-123.3231\\-195.7928\\-123\\-121.37\\-196.152\\-123\\-119.4168\\-196.8409\\-123\\-118.4508\\-197.7084\\-123\\-118.2183\\-199.6615\\-123\\-118.3101\\-201.6146\\-123\\-118.1062\\-203.5678\\-123\\-117.6253\\-205.5209\\-123\\-119.9837\\-207.474\\-123\\-121.37\\-208.3961\\-123\\-123.3231\\-208.7068\\-123\\-125.2762\\-208.873\\-123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "34" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-115.5106\\-205.8584\\-123\\-116.822\\-205.5209\\-123\\-115.5106\\-204.4777\\-123\\-115.2401\\-203.5678\\-123\\-113.5575\\-201.6223\\-123\\-111.6043\\-203.1936\\-123\\-111.3338\\-203.5678\\-123\\-112.4254\\-205.5209\\-123\\-113.5575\\-206.5646\\-123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "35" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.30133\\-170.3646\\-123\\-43.24498\\-168.7758\\-123\\-45.1981\\-166.9525\\-123\\-47.15123\\-167.5463\\-123\\-49.10435\\-169.4972\\-123\\-50.92669\\-168.4115\\-123\\-49.10435\\-164.8212\\-123\\-48.88055\\-164.5053\\-123\\-46.83384\\-162.5521\\-123\\-45.1981\\-161.6434\\-123\\-43.24498\\-161.0054\\-123\\-39.33873\\-161.0054\\-123\\-37.3856\\-161.584\\-123\\-34.45126\\-164.5053\\-123\\-33.64745\\-166.4584\\-123\\-35.43248\\-167.5004\\-123\\-37.3856\\-167.5673\\-123\\-39.33873\\-169.5001\\-123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "36" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-121\\-129.9137\\-205.5209\\-121\\-130.7197\\-203.5678\\-121\\-130.7586\\-197.7084\\-121\\-129.1825\\-195.7928\\-121\\-127.2293\\-195.7476\\-121\\-125.2762\\-195.5669\\-121\\-123.3231\\-195.5026\\-121\\-121.37\\-195.7928\\-121\\-119.4168\\-196.8074\\-121\\-118.6712\\-197.7084\\-121\\-118.6107\\-199.6615\\-121\\-118.2693\\-201.6146\\-121\\-117.4637\\-203.2483\\-121\\-116.5873\\-203.5678\\-121\\-116.3163\\-205.5209\\-121\\-117.4637\\-206.4771\\-121\\-117.7984\\-207.474\\-121\\-119.4168\\-208.5975\\-121\\-123.3231\\-208.9218\\-121\\-125.2762\\-208.9652\\-121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "37" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-206.7537\\-121\\-115.2868\\-205.5209\\-121\\-115.2288\\-203.5678\\-121\\-113.5575\\-201.6223\\-121\\-111.6043\\-203.1646\\-121\\-111.3114\\-203.5678\\-121\\-111.8038\\-205.5209\\-121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "38" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.4972\\-121\\-50.92669\\-168.4115\\-121\\-49.10435\\-164.8212\\-121\\-48.88055\\-164.5053\\-121\\-46.83384\\-162.5521\\-121\\-45.1981\\-161.6434\\-121\\-43.24498\\-161.0054\\-121\\-41.29185\\-160.7476\\-121\\-39.33873\\-160.7211\\-121\\-37.3856\\-161.584\\-121\\-34.45126\\-164.5053\\-121\\-33.64745\\-166.4584\\-121\\-35.43248\\-167.5004\\-121\\-37.3856\\-167.5673\\-121\\-39.33873\\-169.5001\\-121\\-41.29185\\-170.1529\\-121\\-43.24498\\-167.9797\\-121\\-45.1981\\-166.5805\\-121\\-47.15123\\-167.5463\\-121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "39" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-119\\-129.9453\\-205.5209\\-119\\-130.7487\\-203.5678\\-119\\-130.7586\\-197.7084\\-119\\-129.1825\\-195.7928\\-119\\-127.2293\\-195.7476\\-119\\-125.2762\\-195.0465\\-119\\-123.3231\\-194.7631\\-119\\-121.37\\-195.4791\\-119\\-119.4168\\-197.0306\\-119\\-118.8949\\-197.7084\\-119\\-118.7468\\-199.6615\\-119\\-118.1528\\-201.6146\\-119\\-117.4637\\-202.9998\\-119\\-116.6329\\-203.5678\\-119\\-116.3504\\-205.5209\\-119\\-117.1308\\-207.474\\-119\\-117.4637\\-207.8147\\-119\\-119.4168\\-208.8809\\-119\\-125.2762\\-208.9652\\-119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "40" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-207.2149\\-119\\-115.2288\\-205.5209\\-119\\-115.0493\\-203.5678\\-119\\-113.5575\\-201.8908\\-119\\-111.6043\\-203.1683\\-119\\-111.3114\\-203.5678\\-119\\-111.3453\\-205.5209\\-119\\-111.6043\\-205.828\\-119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "41" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.4972\\-119\\-50.92669\\-168.4115\\-119\\-50.07069\\-166.4584\\-119\\-49.11198\\-164.5053\\-119\\-46.83384\\-162.5521\\-119\\-45.1981\\-161.6434\\-119\\-43.24498\\-160.9957\\-119\\-41.29185\\-159.8112\\-119\\-39.33873\\-159.76\\-119\\-37.3856\\-161.5756\\-119\\-34.45126\\-164.5053\\-119\\-33.64745\\-166.4584\\-119\\-35.43248\\-167.5004\\-119\\-37.3856\\-167.5673\\-119\\-39.33873\\-169.5001\\-119\\-41.29185\\-169.5997\\-119\\-43.24498\\-167.5473\\-119\\-45.1981\\-166.5106\\-119\\-47.15123\\-167.5463\\-119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "42" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-117\\-129.9453\\-205.5209\\-117\\-130.7487\\-203.5678\\-117\\-131.1759\\-199.6615\\-117\\-130.7718\\-197.7084\\-117\\-129.1825\\-196.0314\\-117\\-127.2293\\-195.553\\-117\\-125.2762\\-194.7524\\-117\\-123.3231\\-194.0859\\-117\\-121.37\\-194.8409\\-117\\-120.3395\\-195.7553\\-117\\-118.7856\\-197.7084\\-117\\-118.3291\\-199.6615\\-117\\-117.5159\\-201.6146\\-117\\-117.0219\\-203.5678\\-117\\-116.3504\\-205.5209\\-117\\-117.4095\\-207.474\\-117\\-119.4168\\-208.8575\\-117\\-121.37\\-208.9652\\-117\\-125.2762\\-208.9652\\-117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "43" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-208.0864\\-117\\-114.3155\\-207.474\\-117\\-115.2288\\-205.5209\\-117\\-114.5537\\-203.5678\\-117\\-113.5575\\-202.5511\\-117\\-111.5522\\-203.5678\\-117\\-111.3114\\-205.5209\\-117\\-112.867\\-207.474\\-117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "44" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.4972\\-117\\-50.95982\\-168.4115\\-117\\-50.57807\\-166.4584\\-117\\-49.75014\\-164.5053\\-117\\-49.10435\\-163.8304\\-117\\-47.15123\\-162.8112\\-117\\-45.1981\\-161.6434\\-117\\-43.24498\\-160.9859\\-117\\-41.29185\\-159.6522\\-117\\-39.33873\\-159.6019\\-117\\-34.45126\\-164.5053\\-117\\-33.64745\\-166.4584\\-117\\-35.43248\\-167.5004\\-117\\-37.3856\\-167.5673\\-117\\-39.33873\\-169.5001\\-117\\-41.29185\\-169.4247\\-117\\-43.24498\\-167.5004\\-117\\-45.1981\\-166.5106\\-117\\-47.15123\\-167.5463\\-117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "45" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-115\\-129.9453\\-205.5209\\-115\\-130.7487\\-203.5678\\-115\\-131.7007\\-201.6146\\-115\\-132.2463\\-199.6615\\-115\\-130.8465\\-197.7084\\-115\\-129.1825\\-196.596\\-115\\-127.2293\\-195.0877\\-115\\-125.2762\\-194.1382\\-115\\-123.3231\\-193.7355\\-115\\-121.37\\-194.6252\\-115\\-120.121\\-195.7553\\-115\\-118.3182\\-197.7084\\-115\\-117.3951\\-199.6615\\-115\\-116.941\\-201.6146\\-115\\-117.0851\\-203.5678\\-115\\-116.3504\\-205.5209\\-115\\-117.4637\\-206.0411\\-115\\-118.2116\\-207.474\\-115\\-119.4168\\-208.6022\\-115\\-121.37\\-208.9652\\-115\\-125.2762\\-208.9652\\-115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "46" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.4972\\-115\\-50.95982\\-168.4115\\-115\\-50.90887\\-166.4584\\-115\\-49.92955\\-164.5053\\-115\\-49.10435\\-163.6801\\-115\\-47.15123\\-162.8112\\-115\\-45.1981\\-161.6434\\-115\\-43.24498\\-160.9859\\-115\\-41.29185\\-159.6437\\-115\\-39.33873\\-159.5937\\-115\\-34.45126\\-164.5053\\-115\\-33.95162\\-166.4584\\-115\\-35.43248\\-167.3662\\-115\\-37.3856\\-167.5621\\-115\\-39.33873\\-169.3595\\-115\\-41.29185\\-169.2801\\-115\\-43.24498\\-167.4954\\-115\\-45.1981\\-166.5106\\-115\\-47.15123\\-167.5463\\-115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "47" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-113\\-129.9453\\-205.5209\\-113\\-130.7487\\-203.5678\\-113\\-131.8924\\-201.6146\\-113\\-132.6823\\-199.6615\\-113\\-131.1356\\-197.5845\\-113\\-129.1825\\-196.6416\\-113\\-127.2293\\-194.9086\\-113\\-125.2762\\-193.7945\\-113\\-123.3231\\-193.7074\\-113\\-121.37\\-194.4888\\-113\\-119.582\\-195.7553\\-113\\-117.4637\\-198.2539\\-113\\-116.4872\\-199.6615\\-113\\-116.5007\\-201.6146\\-113\\-117.0718\\-203.5678\\-113\\-115.5106\\-205.3607\\-113\\-113.5575\\-203.3808\\-113\\-111.6043\\-205.1102\\-113\\-111.3114\\-205.5209\\-113\\-111.6043\\-205.8753\\-113\\-113.5575\\-207.4218\\-113\\-115.5106\\-205.7301\\-113\\-117.4637\\-206.4975\\-113\\-118.0847\\-207.474\\-113\\-119.4168\\-208.5933\\-113\\-121.37\\-208.9652\\-113\\-125.2762\\-208.9652\\-113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "48" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.4972\\-113\\-50.95982\\-168.4115\\-113\\-50.68089\\-166.4584\\-113\\-49.79962\\-164.5053\\-113\\-49.10435\\-163.7985\\-113\\-47.15123\\-162.8112\\-113\\-45.1981\\-161.6434\\-113\\-41.29185\\-159.5836\\-113\\-39.33873\\-159.5937\\-113\\-34.45126\\-164.5053\\-113\\-34.84488\\-166.4584\\-113\\-35.43248\\-166.8838\\-113\\-37.3856\\-167.557\\-113\\-39.33873\\-168.8179\\-113\\-41.29185\\-168.7909\\-113\\-43.24498\\-167.4905\\-113\\-45.1981\\-166.5106\\-113\\-47.15123\\-167.5463\\-113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "29" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "49" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-111\\-129.9453\\-205.5209\\-111\\-130.7487\\-203.5678\\-111\\-131.9022\\-201.6146\\-111\\-132.7319\\-199.6615\\-111\\-131.8204\\-197.7084\\-111\\-131.1356\\-197.0592\\-111\\-129.1825\\-195.967\\-111\\-127.2293\\-194.7032\\-111\\-125.2762\\-193.7355\\-111\\-123.3231\\-193.6936\\-111\\-121.37\\-194.0379\\-111\\-119.4168\\-195.0982\\-111\\-118.8086\\-195.7553\\-111\\-117.9774\\-197.7084\\-111\\-116.2356\\-199.6615\\-111\\-115.7705\\-201.6146\\-111\\-116.1515\\-203.5678\\-111\\-115.5106\\-204.0484\\-111\\-113.5575\\-202.8835\\-111\\-112.7051\\-203.5678\\-111\\-111.3225\\-205.5209\\-111\\-112.6888\\-207.474\\-111\\-113.5575\\-208.2721\\-111\\-115.5106\\-207.8906\\-111\\-117.4637\\-207.9017\\-111\\-119.4168\\-208.6526\\-111\\-121.37\\-208.9652\\-111\\-125.2762\\-208.9652\\-111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "50" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-169.3309\\-111\\-50.62059\\-168.4115\\-111\\-50.16104\\-166.4584\\-111\\-49.25296\\-164.5053\\-111\\-46.83384\\-162.5521\\-111\\-45.1981\\-161.6434\\-111\\-43.24498\\-159.8717\\-111\\-41.29185\\-159.3601\\-111\\-39.33873\\-159.5937\\-111\\-37.3856\\-161.567\\-111\\-34.35008\\-164.5053\\-111\\-35.27732\\-166.4584\\-111\\-37.3856\\-167.552\\-111\\-39.33873\\-168.4491\\-111\\-41.29185\\-168.4342\\-111\\-43.24498\\-167.4856\\-111\\-45.1981\\-166.1635\\-111\\-47.15123\\-167.4729\\-111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "27" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "51" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-109\\-129.9453\\-205.5209\\-109\\-130.7487\\-203.5678\\-109\\-131.9022\\-201.6146\\-109\\-132.7319\\-199.6615\\-109\\-131.9704\\-197.7084\\-109\\-131.1356\\-196.8599\\-109\\-129.1825\\-195.125\\-109\\-127.2293\\-194.159\\-109\\-125.2762\\-193.6936\\-109\\-121.37\\-193.7074\\-109\\-119.4168\\-194.6904\\-109\\-118.4125\\-195.7553\\-109\\-117.5445\\-197.7084\\-109\\-116.0821\\-199.6615\\-109\\-115.5106\\-200.2234\\-109\\-113.5575\\-201.53\\-109\\-111.7398\\-203.5678\\-109\\-111.6991\\-205.5209\\-109\\-112.6791\\-207.474\\-109\\-113.5575\\-208.3844\\-109\\-115.5106\\-208.7021\\-109\\-117.4637\\-207.7397\\-109\\-119.4168\\-208.0972\\-109\\-121.37\\-208.8129\\-109\\-123.3231\\-208.9652\\-109\\-125.2762\\-208.9652\\-109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "52" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-54.96373\\-192.6368\\-109\\-55.80775\\-191.849\\-109\\-54.17596\\-189.8959\\-109\\-53.0106\\-188.7382\\-109\\-51.05748\\-187.0464\\-109\\-50.31601\\-187.9428\\-109\\-51.71575\\-189.8959\\-109\\-53.0106\\-191.1812\\-109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "53" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.8554\\-109\\-49.75251\\-168.4115\\-109\\-49.97186\\-166.4584\\-109\\-48.88175\\-164.5053\\-109\\-46.83384\\-162.5521\\-109\\-45.1981\\-161.6392\\-109\\-43.24498\\-159.7\\-109\\-41.29185\\-159.1512\\-109\\-39.33873\\-159.5937\\-109\\-37.3856\\-161.567\\-109\\-36.10386\\-162.5521\\-109\\-33.99061\\-164.5053\\-109\\-35.32818\\-166.4584\\-109\\-37.3856\\-167.552\\-109\\-39.33873\\-168.4039\\-109\\-41.29185\\-168.4039\\-109\\-43.24498\\-167.4768\\-109\\-45.1981\\-165.68\\-109\\-46.38026\\-166.4584\\-109\\-48.51841\\-168.4115\\-109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "27" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "54" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-107\\-129.9453\\-205.5209\\-107\\-130.7487\\-203.5678\\-107\\-131.9022\\-201.6146\\-107\\-132.7319\\-199.6615\\-107\\-131.9764\\-197.7084\\-107\\-129.1825\\-194.9174\\-107\\-127.2293\\-193.8098\\-107\\-125.2762\\-193.6936\\-107\\-121.37\\-193.6936\\-107\\-119.4168\\-194.6292\\-107\\-118.2575\\-195.7553\\-107\\-116.8657\\-197.7084\\-107\\-116.2258\\-199.6615\\-107\\-115.5106\\-200.6055\\-107\\-113.5575\\-201.0835\\-107\\-112.8797\\-201.6146\\-107\\-111.3453\\-203.5678\\-107\\-112.3242\\-205.5209\\-107\\-113.0408\\-207.474\\-107\\-113.5575\\-208.0827\\-107\\-115.5106\\-208.9052\\-107\\-117.4637\\-207.0967\\-107\\-119.4168\\-206.8859\\-107\\-121.37\\-208.6377\\-107\\-123.3231\\-208.9652\\-107\\-125.2762\\-208.9652\\-107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "55" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-56.91685\\-192.1797\\-107\\-57.38867\\-191.849\\-107\\-56.91685\\-191.3772\\-107\\-55.89487\\-189.8959\\-107\\-51.96428\\-185.9896\\-107\\-51.05748\\-185.2972\\-107\\-49.10435\\-183.5184\\-107\\-48.11643\\-184.0365\\-107\\-48.47075\\-185.9896\\-107\\-53.0106\\-190.5408\\-107\\-55.64436\\-191.849\\-107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "56" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.11422\\-168.4115\\-107\\-49.95635\\-166.4584\\-107\\-48.85258\\-164.5053\\-107\\-46.83384\\-162.5521\\-107\\-45.1981\\-161.6349\\-107\\-43.24498\\-159.6909\\-107\\-41.29185\\-159.1255\\-107\\-39.33873\\-159.5937\\-107\\-37.3856\\-161.567\\-107\\-35.70213\\-162.5521\\-107\\-33.64094\\-164.5053\\-107\\-35.32716\\-166.4584\\-107\\-37.3856\\-167.552\\-107\\-39.33873\\-168.4039\\-107\\-41.29185\\-168.4039\\-107\\-43.24498\\-167.4678\\-107\\-45.1981\\-165.5566\\-107\\-46.73043\\-166.4584\\-107\\-47.15123\\-166.9124\\-107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "29" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "57" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-105\\-129.9453\\-205.5209\\-105\\-131.1356\\-203.4433\\-105\\-132.0776\\-201.6146\\-105\\-132.7319\\-199.6615\\-105\\-132.1379\\-197.7084\\-105\\-131.1356\\-196.5612\\-105\\-129.1825\\-194.7032\\-105\\-127.2293\\-193.7646\\-105\\-125.2762\\-193.6936\\-105\\-121.37\\-193.6936\\-105\\-119.4168\\-194.6198\\-105\\-118.1341\\-195.7553\\-105\\-116.36\\-197.7084\\-105\\-115.9417\\-201.6146\\-105\\-115.5106\\-202.1463\\-105\\-114.7388\\-201.6146\\-105\\-113.5575\\-201.1625\\-105\\-112.962\\-201.6146\\-105\\-111.3338\\-203.5678\\-105\\-112.3467\\-205.5209\\-105\\-113.0634\\-207.474\\-105\\-113.5575\\-208.0504\\-105\\-115.5106\\-208.9074\\-105\\-116.9113\\-207.474\\-105\\-117.4637\\-206.4344\\-105\\-119.4168\\-206.9057\\-105\\-121.37\\-208.6487\\-105\\-125.2762\\-208.8498\\-105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "58" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-196.3584\\-105\\-61.56079\\-195.7553\\-105\\-61.42183\\-193.8021\\-105\\-53.0106\\-185.4116\\-105\\-51.05748\\-184.5899\\-105\\-49.10435\\-183.4166\\-105\\-48.51028\\-184.0365\\-105\\-50.05766\\-185.9896\\-105\\-53.99479\\-189.8959\\-105\\-56.91685\\-192.4655\\-105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "59" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.4001\\-105\\-49.95635\\-166.4584\\-105\\-49.10435\\-164.8212\\-105\\-46.83384\\-162.5521\\-105\\-45.1981\\-161.6349\\-105\\-43.24498\\-159.6909\\-105\\-41.29185\\-159.1255\\-105\\-39.33873\\-159.5937\\-105\\-37.3856\\-161.5102\\-105\\-35.43248\\-162.3404\\-105\\-33.62796\\-164.5053\\-105\\-35.73611\\-166.4584\\-105\\-37.3856\\-167.4548\\-105\\-39.33873\\-168.4039\\-105\\-41.29185\\-168.4039\\-105\\-43.24498\\-167.4633\\-105\\-45.1981\\-165.5472\\-105\\-46.74631\\-166.4584\\-105\\-47.15123\\-166.8991\\-105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "60" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2563\\-103\\-129.9453\\-205.5209\\-103\\-131.6929\\-203.5678\\-103\\-132.4907\\-201.6146\\-103\\-132.7422\\-199.6615\\-103\\-132.5094\\-197.7084\\-103\\-131.4611\\-195.7553\\-103\\-131.1356\\-195.4274\\-103\\-129.1825\\-194.1965\\-103\\-127.2293\\-193.6936\\-103\\-123.3231\\-193.6667\\-103\\-121.37\\-193.4453\\-103\\-119.4168\\-194.4794\\-103\\-115.5106\\-197.454\\-103\\-115.2912\\-197.7084\\-103\\-114.7308\\-199.6615\\-103\\-113.5575\\-200.5302\\-103\\-112.4907\\-201.6146\\-103\\-111.3225\\-203.5678\\-103\\-112.8672\\-207.474\\-103\\-113.5575\\-208.2587\\-103\\-115.5106\\-208.9013\\-103\\-117.3107\\-207.474\\-103\\-117.4637\\-206.6852\\-103\\-119.4168\\-207.4069\\-103\\-121.37\\-208.5536\\-103\\-123.3231\\-208.3438\\-103\\-125.2762\\-208.6277\\-103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "61" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-195.0559\\-103\\-62.08502\\-193.8021\\-103\\-53.0106\\-184.7531\\-103\\-51.05748\\-183.0235\\-103\\-49.67312\\-182.0834\\-103\\-49.10435\\-181.5269\\-103\\-48.71519\\-182.0834\\-103\\-50.10823\\-184.0365\\-103\\-51.74948\\-185.9896\\-103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "62" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.4001\\-103\\-49.95635\\-166.4584\\-103\\-49.10435\\-164.8212\\-103\\-46.85012\\-162.5521\\-103\\-45.1981\\-161.6301\\-103\\-43.24498\\-159.6909\\-103\\-41.29185\\-159.1255\\-103\\-39.33873\\-159.5937\\-103\\-37.3856\\-161.2653\\-103\\-35.43248\\-161.7527\\-103\\-34.58307\\-162.5521\\-103\\-33.63471\\-164.5053\\-103\\-36.67002\\-166.4584\\-103\\-39.33873\\-168.4039\\-103\\-41.29185\\-168.4039\\-103\\-43.24498\\-167.4633\\-103\\-45.1981\\-165.5472\\-103\\-46.74631\\-166.4584\\-103\\-47.15123\\-166.8991\\-103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "24" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "63" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2624\\-101\\-131.8849\\-203.5678\\-101\\-132.7319\\-201.6146\\-101\\-132.7526\\-197.7084\\-101\\-131.9734\\-195.7553\\-101\\-131.1356\\-194.9128\\-101\\-129.1825\\-193.7945\\-101\\-127.2293\\-193.6801\\-101\\-123.3231\\-193.1769\\-101\\-121.37\\-192.8527\\-101\\-119.4168\\-193.4477\\-101\\-117.4637\\-195.3288\\-101\\-115.5106\\-196.5167\\-101\\-114.4045\\-197.7084\\-101\\-113.6395\\-199.6615\\-101\\-112.3942\\-201.6146\\-101\\-111.3225\\-203.5678\\-101\\-113.3678\\-207.474\\-101\\-113.5575\\-207.685\\-101\\-115.5106\\-208.7848\\-101\\-117.4637\\-208.6312\\-101\\-121.37\\-208.5206\\-101\\-123.3231\\-208.156\\-101\\-125.2762\\-208.6141\\-101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "64" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-194.7142\\-101\\-63.36574\\-193.8021\\-101\\-59.63448\\-189.8959\\-101\\-58.86998\\-188.8507\\-101\\-53.0106\\-183.0145\\-101\\-49.10435\\-179.2079\\-101\\-47.96503\\-180.1303\\-101\\-48.494\\-182.0834\\-101\\-60.8231\\-194.3927\\-101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "65" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.4001\\-101\\-49.95635\\-166.4584\\-101\\-49.10435\\-164.8212\\-101\\-47.15123\\-162.3651\\-101\\-45.1981\\-161.5396\\-101\\-43.24498\\-159.6812\\-101\\-41.29185\\-159.1255\\-101\\-39.33873\\-159.5937\\-101\\-37.77495\\-160.599\\-101\\-37.3856\\-160.976\\-101\\-35.43248\\-161.5799\\-101\\-34.43372\\-162.5521\\-101\\-33.99295\\-164.5053\\-101\\-35.43248\\-165.4307\\-101\\-37.293\\-166.4584\\-101\\-39.33873\\-168.4039\\-101\\-41.29185\\-168.4039\\-101\\-43.24498\\-167.4586\\-101\\-45.1981\\-165.5423\\-101\\-46.74958\\-166.4584\\-101\\-47.15123\\-166.8991\\-101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "66" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.2803\\-99\\-130.1688\\-205.5209\\-99\\-131.8909\\-203.5678\\-99\\-132.7319\\-201.6146\\-99\\-132.7526\\-197.7084\\-99\\-132.1435\\-195.7553\\-99\\-131.1356\\-194.613\\-99\\-129.1825\\-193.381\\-99\\-127.2293\\-193.4304\\-99\\-125.2762\\-192.8424\\-99\\-123.3231\\-192.3532\\-99\\-121.37\\-192.1117\\-99\\-119.4168\\-192.7555\\-99\\-117.4637\\-194.8091\\-99\\-115.8185\\-195.7553\\-99\\-113.6522\\-197.7084\\-99\\-113.2535\\-199.6615\\-99\\-112.3999\\-201.6146\\-99\\-111.3453\\-203.5678\\-99\\-112.5082\\-205.5209\\-99\\-113.5575\\-206.7403\\-99\\-115.5106\\-208.4259\\-99\\-117.4637\\-208.7847\\-99\\-119.4168\\-208.9475\\-99\\-123.3231\\-208.6553\\-99\\-125.2762\\-208.839\\-99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "67" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-194.5872\\-99\\-63.49121\\-193.8021\\-99\\-62.77623\\-192.7485\\-99\\-60.8231\\-190.4311\\-99\\-60.17585\\-189.8959\\-99\\-59.65918\\-187.9428\\-99\\-58.86998\\-186.8823\\-99\\-54.96373\\-182.9913\\-99\\-51.05748\\-179.1537\\-99\\-49.10435\\-177.7188\\-99\\-48.43719\\-178.1771\\-99\\-48.30838\\-180.1303\\-99\\-49.10435\\-181.0674\\-99\\-58.86998\\-190.7943\\-99\\-60.8231\\-192.9747\\-99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "68" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.4003\\-99\\-49.96194\\-166.4584\\-99\\-48.86409\\-164.5053\\-99\\-47.88497\\-162.5521\\-99\\-47.15123\\-161.8377\\-99\\-45.1981\\-161.262\\-99\\-43.24498\\-159.667\\-99\\-41.29185\\-159.1255\\-99\\-39.33873\\-159.5898\\-99\\-37.75181\\-160.599\\-99\\-37.3856\\-160.9558\\-99\\-35.43248\\-161.5799\\-99\\-34.42916\\-162.5521\\-99\\-34.7133\\-164.5053\\-99\\-37.30297\\-166.4584\\-99\\-39.33873\\-168.4039\\-99\\-41.29185\\-168.4039\\-99\\-43.24498\\-167.3163\\-99\\-45.1981\\-165.4048\\-99\\-46.7823\\-166.4584\\-99\\-47.15123\\-166.8991\\-99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "27" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "69" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.4694\\-97\\-129.1825\\-207.0796\\-97\\-130.5641\\-205.5209\\-97\\-131.9121\\-203.5678\\-97\\-132.7319\\-201.6146\\-97\\-132.7526\\-197.7084\\-97\\-132.5153\\-195.7553\\-97\\-131.1356\\-193.6792\\-97\\-129.1825\\-192.9335\\-97\\-127.2293\\-192.8198\\-97\\-125.2762\\-192.0154\\-97\\-123.3231\\-191.6133\\-97\\-121.37\\-191.6496\\-97\\-119.4168\\-192.6976\\-97\\-117.4637\\-194.4226\\-97\\-115.5106\\-195.3097\\-97\\-113.5575\\-196.9853\\-97\\-113.0067\\-197.7084\\-97\\-112.9671\\-199.6615\\-97\\-112.5857\\-201.6146\\-97\\-111.6991\\-203.5678\\-97\\-112.3305\\-205.5209\\-97\\-113.5575\\-206.8959\\-97\\-115.5106\\-208.2563\\-97\\-117.4637\\-208.5615\\-97\\-121.37\\-208.9652\\-97\\-125.2762\\-208.9652\\-97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "70" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-193.2986\\-97\\-63.35246\\-191.849\\-97\\-61.40206\\-189.8959\\-97\\-60.8231\\-188.3665\\-97\\-60.50223\\-187.9428\\-97\\-59.94572\\-185.9896\\-97\\-58.86998\\-185.0267\\-97\\-53.93615\\-180.1303\\-97\\-52.02604\\-178.1771\\-97\\-51.05748\\-177.4293\\-97\\-49.10435\\-178.0053\\-97\\-48.94843\\-178.1771\\-97\\-50.15179\\-180.1303\\-97\\-51.05748\\-181.0287\\-97\\-51.90258\\-182.0834\\-97\\-53.74945\\-184.0365\\-97\\-54.96373\\-185.1758\\-97\\-56.01004\\-185.9896\\-97\\-58.86998\\-188.8354\\-97\\-60.09288\\-189.8959\\-97\\-60.8231\\-191.6205\\-97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "71" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.3654\\-97\\-50.15721\\-166.4584\\-97\\-49.23979\\-164.5053\\-97\\-48.00927\\-162.5521\\-97\\-47.15123\\-161.6899\\-97\\-45.1981\\-160.9957\\-97\\-43.24498\\-159.6578\\-97\\-41.29185\\-159.0989\\-97\\-39.33873\\-159.5058\\-97\\-37.3856\\-160.4221\\-97\\-35.43248\\-161.4912\\-97\\-34.16401\\-162.5521\\-97\\-35.16996\\-164.5053\\-97\\-35.43248\\-164.6796\\-97\\-39.33873\\-168.4039\\-97\\-41.29185\\-168.4039\\-97\\-43.24498\\-167.103\\-97\\-45.1981\\-165.2288\\-97\\-46.83469\\-166.4584\\-97\\-47.15123\\-166.8646\\-97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "72" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.0542\\-95\\-129.7661\\-207.474\\-95\\-131.1356\\-205.4564\\-95\\-132.1169\\-203.5678\\-95\\-132.7422\\-201.6146\\-95\\-132.8069\\-197.7084\\-95\\-132.7848\\-195.7553\\-95\\-131.9804\\-193.8021\\-95\\-131.1356\\-193.0497\\-95\\-129.1825\\-192.6535\\-95\\-127.2293\\-191.7676\\-95\\-125.2762\\-191.1773\\-95\\-123.3231\\-191.3522\\-95\\-121.37\\-191.6746\\-95\\-119.4168\\-192.7123\\-95\\-117.4637\\-193.9507\\-95\\-115.5106\\-194.8503\\-95\\-113.5575\\-196.658\\-95\\-112.6116\\-197.7084\\-95\\-112.4406\\-199.6615\\-95\\-112.8113\\-201.6146\\-95\\-112.2396\\-203.5678\\-95\\-111.7659\\-205.5209\\-95\\-112.9203\\-207.474\\-95\\-113.5575\\-208.1073\\-95\\-115.5106\\-208.6448\\-95\\-117.4637\\-208.5421\\-95\\-119.4168\\-208.6712\\-95\\-121.37\\-208.9652\\-95\\-125.2762\\-208.9652\\-95\\-127.2293\\-208.7847\\-95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "73" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-189.7594\\-95\\-62.74294\\-187.9428\\-95\\-61.8286\\-185.9896\\-95\\-58.86998\\-183.4462\\-95\\-55.50892\\-180.1303\\-95\\-53.0106\\-177.4369\\-95\\-51.05748\\-177.3568\\-95\\-50.34042\\-178.1771\\-95\\-51.9435\\-180.1303\\-95\\-53.12157\\-182.0834\\-95\\-55.0764\\-184.0365\\-95\\-56.91685\\-185.3731\\-95\\-58.86998\\-187.3188\\-95\\-59.64987\\-187.9428\\-95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "74" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-168.0558\\-95\\-50.6214\\-166.4584\\-95\\-49.76434\\-164.5053\\-95\\-47.15123\\-161.6794\\-95\\-45.1981\\-160.9558\\-95\\-43.24498\\-159.6357\\-95\\-41.29185\\-158.5933\\-95\\-39.33873\\-158.4476\\-95\\-37.3856\\-159.5415\\-95\\-35.43248\\-160.7746\\-95\\-33.47935\\-161.8704\\-95\\-32.62582\\-162.5521\\-95\\-33.47935\\-163.9784\\-95\\-34.45591\\-164.5053\\-95\\-35.43248\\-164.7758\\-95\\-39.33873\\-168.4039\\-95\\-41.29185\\-168.4039\\-95\\-43.24498\\-167.3163\\-95\\-45.1981\\-165.3988\\-95\\-47.15123\\-166.3658\\-95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "75" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.2248\\-93\\-131.688\\-205.5209\\-93\\-132.5172\\-203.5678\\-93\\-132.7848\\-201.6146\\-93\\-133.4882\\-197.7084\\-93\\-133.1263\\-195.7553\\-93\\-132.4845\\-193.8021\\-93\\-131.1356\\-192.334\\-93\\-129.1825\\-191.8723\\-93\\-127.2293\\-190.9495\\-93\\-125.2762\\-190.3471\\-93\\-123.3231\\-190.9319\\-93\\-121.37\\-192.0106\\-93\\-119.4168\\-192.9018\\-93\\-117.4637\\-193.6277\\-93\\-115.5106\\-194.6485\\-93\\-112.4275\\-197.7084\\-93\\-111.7137\\-199.6615\\-93\\-112.6352\\-201.6146\\-93\\-112.6331\\-203.5678\\-93\\-111.7398\\-205.5209\\-93\\-112.5382\\-207.474\\-93\\-113.5575\\-208.4834\\-93\\-115.5106\\-208.9563\\-93\\-117.4637\\-208.7847\\-93\\-119.4168\\-208.8201\\-93\\-121.37\\-208.9652\\-93\\-127.2293\\-208.9563\\-93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "76" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-190.9084\\-93\\-63.79619\\-189.8959\\-93\\-64.03902\\-187.9428\\-93\\-63.5418\\-185.9896\\-93\\-62.77623\\-185.247\\-93\\-60.8231\\-183.7641\\-93\\-58.86998\\-182.6535\\-93\\-56.91685\\-180.4785\\-93\\-56.50862\\-180.1303\\-93\\-54.96373\\-178.1414\\-93\\-53.0106\\-177.1517\\-93\\-52.19029\\-178.1771\\-93\\-53.44375\\-180.1303\\-93\\-54.25634\\-182.0834\\-93\\-56.91685\\-184.6781\\-93\\-60.17767\\-187.9428\\-93\\-61.95661\\-189.8959\\-93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "77" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-168.5063\\-93\\-43.24498\\-167.4916\\-93\\-45.1981\\-165.5616\\-93\\-47.15123\\-165.7385\\-93\\-49.10435\\-167.6698\\-93\\-50.98299\\-166.4584\\-93\\-49.96546\\-164.5053\\-93\\-48.23468\\-162.5521\\-93\\-47.15123\\-161.5249\\-93\\-45.1981\\-160.3858\\-93\\-43.24498\\-159.3859\\-93\\-42.35884\\-158.6459\\-93\\-41.29185\\-157.4286\\-93\\-39.33873\\-156.562\\-93\\-37.3856\\-157.5049\\-93\\-36.12515\\-158.6459\\-93\\-33.47935\\-160.6804\\-93\\-31.52623\\-161.8348\\-93\\-30.62537\\-162.5521\\-93\\-31.52623\\-163.9868\\-93\\-32.10945\\-164.5053\\-93\\-33.47935\\-165.0689\\-93\\-35.43248\\-165.3591\\-93\\-36.77838\\-166.4584\\-93\\-37.3856\\-167.1208\\-93\\-39.33873\\-168.5063\\-93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "78" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.2248\\-91\\-131.8729\\-205.5209\\-91\\-132.7739\\-203.5678\\-91\\-133.2503\\-201.6146\\-91\\-133.9235\\-199.6615\\-91\\-134.2849\\-197.7084\\-91\\-133.7454\\-195.7553\\-91\\-132.8069\\-193.8021\\-91\\-131.1356\\-191.662\\-91\\-129.1825\\-191.2717\\-91\\-127.2293\\-190.5699\\-91\\-125.2762\\-189.6484\\-91\\-123.3231\\-190.7419\\-91\\-121.37\\-192.3373\\-91\\-119.4168\\-193.1257\\-91\\-117.4637\\-193.3957\\-91\\-115.5106\\-194.4589\\-91\\-112.401\\-197.7084\\-91\\-111.3004\\-199.6615\\-91\\-112.4751\\-201.6146\\-91\\-113.4345\\-203.5678\\-91\\-112.3213\\-205.5209\\-91\\-112.5432\\-207.474\\-91\\-113.5575\\-208.4834\\-91\\-115.5106\\-208.9652\\-91\\-119.4168\\-208.9218\\-91\\-123.3231\\-208.9652\\-91\\-127.2293\\-208.9563\\-91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "79" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-190.1274\\-91\\-64.89211\\-189.8959\\-91\\-65.32645\\-187.9428\\-91\\-65.17381\\-185.9896\\-91\\-64.72935\\-184.9991\\-91\\-63.81877\\-184.0365\\-91\\-62.77623\\-183.2329\\-91\\-60.64872\\-182.0834\\-91\\-59.31023\\-180.1303\\-91\\-58.86998\\-179.2777\\-91\\-57.92017\\-178.1771\\-91\\-55.45201\\-176.224\\-91\\-54.96373\\-175.987\\-91\\-54.58008\\-176.224\\-91\\-54.11892\\-178.1771\\-91\\-54.96373\\-180.0446\\-91\\-56.04308\\-182.0834\\-91\\-58.86998\\-184.9236\\-91\\-59.72149\\-185.9896\\-91\\-61.476\\-187.9428\\-91\\-61.98135\\-189.8959\\-91\\-62.77623\\-191.2522\\-91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "29" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "80" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-169.2568\\-91\\-43.24498\\-167.7991\\-91\\-45.1981\\-165.6988\\-91\\-47.15123\\-165.4679\\-91\\-49.10435\\-167.3957\\-91\\-51.05748\\-166.9141\\-91\\-51.37229\\-166.4584\\-91\\-51.05748\\-166.0349\\-91\\-49.10435\\-162.6928\\-91\\-47.15123\\-160.7874\\-91\\-45.1981\\-159.5259\\-91\\-44.07686\\-158.6459\\-91\\-43.51702\\-156.6928\\-91\\-43.24498\\-156.3081\\-91\\-41.29185\\-154.7006\\-91\\-37.3856\\-154.6704\\-91\\-35.43248\\-155.4899\\-91\\-34.00301\\-156.6928\\-91\\-33.47935\\-157.5331\\-91\\-33.14473\\-158.6459\\-91\\-31.52623\\-160.5746\\-91\\-29.5731\\-161.8005\\-91\\-28.62636\\-162.5521\\-91\\-28.72675\\-164.5053\\-91\\-31.52623\\-164.769\\-91\\-33.47935\\-166.1177\\-91\\-35.43248\\-167.1242\\-91\\-37.3856\\-168.843\\-91\\-39.33873\\-169.3881\\-91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "81" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.2248\\-89\\-131.8729\\-205.5209\\-89\\-133.1553\\-203.5678\\-89\\-133.9641\\-201.6146\\-89\\-134.4482\\-199.6615\\-89\\-134.6953\\-197.7084\\-89\\-134.0749\\-195.7553\\-89\\-133.2108\\-193.8021\\-89\\-131.7747\\-191.849\\-89\\-131.1356\\-191.3407\\-89\\-129.1825\\-191.2871\\-89\\-127.2293\\-190.5764\\-89\\-125.2762\\-189.5598\\-89\\-123.3231\\-190.7252\\-89\\-121.37\\-192.2837\\-89\\-119.4168\\-193.0469\\-89\\-117.4637\\-193.0139\\-89\\-115.5106\\-193.2997\\-89\\-115.0745\\-193.8021\\-89\\-113.9156\\-195.7553\\-89\\-112.1745\\-197.7084\\-89\\-111.0315\\-199.6615\\-89\\-112.2177\\-201.6146\\-89\\-113.5575\\-202.759\\-89\\-115.5106\\-203.4448\\-89\\-117.4637\\-203.168\\-89\\-118.7048\\-203.5678\\-89\\-119.4168\\-204.4915\\-89\\-119.6777\\-205.5209\\-89\\-119.4168\\-205.864\\-89\\-117.4637\\-205.9586\\-89\\-116.7884\\-205.5209\\-89\\-115.5106\\-203.8049\\-89\\-113.5575\\-204.7265\\-89\\-112.7127\\-205.5209\\-89\\-112.5382\\-207.474\\-89\\-113.5575\\-208.4834\\-89\\-115.5106\\-208.9652\\-89\\-117.4637\\-208.8473\\-89\\-119.4168\\-208.5378\\-89\\-123.3231\\-208.9303\\-89\\-127.2293\\-208.9563\\-89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "82" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-192.9191\\-89\\-66.3895\\-189.8959\\-89\\-67.20176\\-187.9428\\-89\\-67.21145\\-184.0365\\-89\\-66.68247\\-182.6259\\-89\\-66.21297\\-182.0834\\-89\\-67.30222\\-180.1303\\-89\\-67.51163\\-178.1771\\-89\\-66.68247\\-177.742\\-89\\-64.72935\\-179.6383\\-89\\-62.77623\\-180.8028\\-89\\-60.8231\\-180.4755\\-89\\-58.86998\\-178.6086\\-89\\-56.95053\\-178.1771\\-89\\-57.11739\\-180.1303\\-89\\-57.88578\\-182.0834\\-89\\-58.86998\\-183.0235\\-89\\-60.8231\\-183.8326\\-89\\-60.96261\\-184.0365\\-89\\-61.8792\\-187.9428\\-89\\-61.9398\\-189.8959\\-89\\-62.14433\\-191.849\\-89\\-62.77623\\-192.6421\\-89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "83" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-172.592\\-89\\-43.24498\\-169.8198\\-89\\-45.75188\\-166.4584\\-89\\-47.15123\\-165.3223\\-89\\-49.10435\\-166.551\\-89\\-51.05748\\-167.6263\\-89\\-51.96246\\-166.4584\\-89\\-50.05957\\-162.5521\\-89\\-45.96318\\-158.6459\\-89\\-43.70415\\-154.7396\\-89\\-43.24498\\-154.2865\\-89\\-41.29185\\-153.5093\\-89\\-37.3856\\-153.5093\\-89\\-35.43248\\-153.7893\\-89\\-33.47935\\-155.4951\\-89\\-32.43875\\-156.6928\\-89\\-31.69385\\-158.6459\\-89\\-29.5731\\-160.6219\\-89\\-27.61998\\-161.9449\\-89\\-27.05613\\-162.5521\\-89\\-27.61998\\-164.3738\\-89\\-29.5731\\-163.9172\\-89\\-30.63755\\-164.5053\\-89\\-31.52623\\-165.589\\-89\\-32.06223\\-166.4584\\-89\\-32.80389\\-168.4115\\-89\\-33.47935\\-169.2386\\-89\\-35.43248\\-171.1522\\-89\\-36.8222\\-172.3178\\-89\\-37.3856\\-172.6167\\-89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "84" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.2312\\-87\\-131.1356\\-206.319\\-87\\-133.6917\\-203.5678\\-87\\-134.4548\\-201.6146\\-87\\-134.6953\\-199.6615\\-87\\-134.7058\\-197.7084\\-87\\-134.4559\\-195.7553\\-87\\-133.931\\-193.8021\\-87\\-133.0887\\-192.1611\\-87\\-132.8058\\-191.849\\-87\\-131.1356\\-190.8984\\-87\\-129.1825\\-191.1179\\-87\\-127.2293\\-189.8583\\-87\\-125.2762\\-189.1465\\-87\\-123.3231\\-190.3842\\-87\\-121.37\\-192.311\\-87\\-119.4168\\-192.9202\\-87\\-117.4637\\-192.6685\\-87\\-115.5106\\-192.7573\\-87\\-112.7466\\-195.7553\\-87\\-111.5668\\-197.7084\\-87\\-110.6376\\-199.6615\\-87\\-110.196\\-201.6146\\-87\\-111.6043\\-203.1012\\-87\\-113.5575\\-202.6755\\-87\\-115.5106\\-202.5357\\-87\\-117.4637\\-201.5475\\-87\\-119.4168\\-201.1874\\-87\\-120.8817\\-201.6146\\-87\\-120.8671\\-203.5678\\-87\\-120.6791\\-205.5209\\-87\\-121.0684\\-207.474\\-87\\-123.3231\\-208.7778\\-87\\-125.2762\\-208.9652\\-87\\-127.2293\\-208.9563\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "85" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-188.7396\\-87\\-122.7666\\-187.9428\\-87\\-122.1597\\-185.9896\\-87\\-121.37\\-185.4677\\-87\\-119.4168\\-185.8676\\-87\\-118.4684\\-187.9428\\-87\\-119.4168\\-189.1095\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "86" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-117.4637\\-208.4865\\-87\\-118.626\\-207.474\\-87\\-115.7982\\-205.5209\\-87\\-115.5106\\-205.2052\\-87\\-113.5575\\-205.0111\\-87\\-111.6043\\-204.3045\\-87\\-111.1359\\-205.5209\\-87\\-112.5333\\-207.474\\-87\\-113.5575\\-208.4834\\-87\\-115.5106\\-208.9563\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "87" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-196.2396\\-87\\-66.11471\\-195.7553\\-87\\-66.34738\\-193.8021\\-87\\-66.68247\\-192.9685\\-87\\-67.80195\\-191.849\\-87\\-70.29349\\-189.8959\\-87\\-70.58872\\-189.5432\\-87\\-71.07291\\-187.9428\\-87\\-71.10316\\-184.0365\\-87\\-71.62538\\-182.0834\\-87\\-71.92943\\-180.1303\\-87\\-71.94951\\-178.1771\\-87\\-72.54185\\-176.6716\\-87\\-72.54185\\-176.1085\\-87\\-70.58872\\-175.5968\\-87\\-69.88737\\-176.224\\-87\\-69.48196\\-178.1771\\-87\\-68.6356\\-178.7995\\-87\\-66.68247\\-179.3808\\-87\\-66.12685\\-180.1303\\-87\\-66.77637\\-182.0834\\-87\\-63.25056\\-184.0365\\-87\\-62.77623\\-184.1821\\-87\\-61.74595\\-185.9896\\-87\\-60.8231\\-188.9193\\-87\\-59.91312\\-187.9428\\-87\\-59.01359\\-185.9896\\-87\\-58.42608\\-185.9896\\-87\\-56.91685\\-186.8338\\-87\\-54.16853\\-187.9428\\-87\\-53.81932\\-189.8959\\-87\\-56.15433\\-191.849\\-87\\-58.86998\\-193.7716\\-87\\-60.8231\\-193.5186\\-87\\-62.77623\\-197.0927\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "88" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-174.5184\\-87\\-39.33873\\-174.1701\\-87\\-41.29185\\-173.2812\\-87\\-43.24498\\-172.6167\\-87\\-43.64448\\-172.3178\\-87\\-45.1981\\-170.0705\\-87\\-46.04807\\-168.4115\\-87\\-46.57315\\-166.4584\\-87\\-47.15123\\-165.7923\\-87\\-49.10435\\-165.4072\\-87\\-51.05748\\-167.1669\\-87\\-51.84871\\-166.4584\\-87\\-51.90926\\-164.5053\\-87\\-51.31656\\-162.5521\\-87\\-47.02916\\-158.6459\\-87\\-45.9049\\-156.6928\\-87\\-43.24498\\-153.8864\\-87\\-41.29185\\-153.1832\\-87\\-37.3856\\-153.1832\\-87\\-35.43248\\-153.3247\\-87\\-33.47935\\-154.195\\-87\\-32.92405\\-154.7396\\-87\\-31.37762\\-156.6928\\-87\\-30.47495\\-158.6459\\-87\\-29.5731\\-159.6167\\-87\\-28.32689\\-160.599\\-87\\-26.81325\\-162.5521\\-87\\-27.61998\\-163.192\\-87\\-29.5731\\-163.7615\\-87\\-30.38875\\-164.5053\\-87\\-31.2444\\-168.4115\\-87\\-32.49636\\-170.3646\\-87\\-33.47935\\-171.5319\\-87\\-35.43248\\-173.4851\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "89" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.20655\\-189.8959\\-87\\58.02259\\-187.9428\\-87\\59.41157\\-185.9896\\-87\\60.00053\\-184.0365\\-87\\60.27065\\-183.7757\\-87\\62.22377\\-183.7757\\-87\\62.49389\\-184.0365\\-87\\62.80058\\-185.9896\\-87\\62.79063\\-187.9428\\-87\\62.22377\\-189.2237\\-87\\61.54275\\-189.8959\\-87\\60.27065\\-190.5001\\-87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "90" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-208.2827\\-85\\-131.1356\\-206.5541\\-85\\-132.1589\\-205.5209\\-85\\-133.8307\\-203.5678\\-85\\-134.6749\\-201.6146\\-85\\-134.7058\\-195.7553\\-85\\-134.4638\\-193.8021\\-85\\-133.7707\\-191.849\\-85\\-133.0887\\-191.1351\\-85\\-131.1356\\-190.7262\\-85\\-129.1825\\-190.9919\\-85\\-127.2293\\-189.0407\\-85\\-125.8004\\-187.9428\\-85\\-124.026\\-185.9896\\-85\\-123.3231\\-185.3697\\-85\\-121.37\\-183.9557\\-85\\-119.4168\\-183.7045\\-85\\-118.8444\\-184.0365\\-85\\-117.6764\\-185.9896\\-85\\-117.2399\\-187.9428\\-85\\-118.2866\\-189.8959\\-85\\-116.6546\\-191.849\\-85\\-115.5106\\-192.5474\\-85\\-112.4242\\-195.7553\\-85\\-111.2374\\-197.7084\\-85\\-110.4394\\-199.6615\\-85\\-109.2842\\-201.6146\\-85\\-109.3151\\-203.5678\\-85\\-110.6422\\-205.5209\\-85\\-113.5575\\-208.4834\\-85\\-115.5106\\-208.9218\\-85\\-117.5722\\-207.474\\-85\\-115.5106\\-205.2372\\-85\\-113.5575\\-203.9157\\-85\\-113.2772\\-203.5678\\-85\\-115.5106\\-202.3856\\-85\\-117.4637\\-200.5849\\-85\\-118.796\\-199.6615\\-85\\-118.9535\\-197.7084\\-85\\-119.4168\\-196.1602\\-85\\-119.9051\\-195.7553\\-85\\-121.37\\-195.4232\\-85\\-122.2923\\-195.7553\\-85\\-123.3231\\-196.9922\\-85\\-123.5654\\-197.7084\\-85\\-123.3231\\-198.4578\\-85\\-122.6141\\-199.6615\\-85\\-122.4686\\-201.6146\\-85\\-122.0193\\-205.5209\\-85\\-122.3811\\-207.474\\-85\\-123.3231\\-208.4609\\-85\\-125.2762\\-209.0501\\-85\\-127.2293\\-209.0112\\-85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "91" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-200.1789\\-85\\-63.93182\\-199.6615\\-85\\-64.72935\\-199.0986\\-85\\-67.31564\\-197.7084\\-85\\-69.4494\\-195.7553\\-85\\-71.3535\\-193.8021\\-85\\-72.54185\\-192.33\\-85\\-74.49497\\-188.6034\\-85\\-74.65656\\-187.9428\\-85\\-74.61704\\-185.9896\\-85\\-73.571\\-182.0834\\-85\\-72.75703\\-180.1303\\-85\\-72.5576\\-178.1771\\-85\\-73.53934\\-176.224\\-85\\-72.54185\\-174.6189\\-85\\-70.58872\\-175.3977\\-85\\-69.77938\\-176.224\\-85\\-70.58872\\-177.7586\\-85\\-72.48441\\-178.1771\\-85\\-71.98988\\-180.1303\\-85\\-70.58872\\-180.4493\\-85\\-68.6356\\-181.1068\\-85\\-68.05533\\-180.1303\\-85\\-67.44541\\-178.1771\\-85\\-66.68247\\-176.7123\\-85\\-64.72935\\-176.383\\-85\\-62.39588\\-178.1771\\-85\\-60.60991\\-180.1303\\-85\\-60.45522\\-182.0834\\-85\\-58.44318\\-184.0365\\-85\\-57.31445\\-185.9896\\-85\\-55.26031\\-187.9428\\-85\\-54.15371\\-189.8959\\-85\\-54.51583\\-193.8021\\-85\\-53.51923\\-195.7553\\-85\\-53.062\\-197.7084\\-85\\-54.96373\\-197.9683\\-85\\-56.91685\\-197.857\\-85\\-58.86998\\-196.4682\\-85\\-60.8231\\-196.7683\\-85\\-61.61045\\-197.7084\\-85\\-62.27012\\-199.6615\\-85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "92" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-174.836\\-85\\-43.24498\\-174.2\\-85\\-45.36086\\-172.3178\\-85\\-46.26588\\-170.3646\\-85\\-46.7921\\-168.4115\\-85\\-47.51505\\-166.4584\\-85\\-49.10435\\-164.2151\\-85\\-51.05748\\-164.6861\\-85\\-52.45744\\-162.5521\\-85\\-51.68159\\-160.599\\-85\\-51.05748\\-160.0959\\-85\\-49.10435\\-159.6415\\-85\\-47.91771\\-158.6459\\-85\\-46.06449\\-156.6928\\-85\\-43.24498\\-153.8864\\-85\\-41.29185\\-153.1832\\-85\\-35.43248\\-153.1832\\-85\\-33.47935\\-153.7925\\-85\\-32.40846\\-154.7396\\-85\\-30.45743\\-156.6928\\-85\\-29.3584\\-158.6459\\-85\\-27.61998\\-160.1497\\-85\\-26.65626\\-160.599\\-85\\-25.66685\\-161.4734\\-85\\-23.71373\\-162.5761\\-85\\-25.66685\\-163.0915\\-85\\-27.61998\\-162.9292\\-85\\-29.63968\\-164.5053\\-85\\-30.42159\\-168.4115\\-85\\-31.18571\\-170.3646\\-85\\-32.46399\\-172.3178\\-85\\-34.22523\\-174.2709\\-85\\-35.43248\\-175.273\\-85\\-37.3856\\-175.9339\\-85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "93" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-196.7531\\-85\\52.82857\\-195.7553\\-85\\54.04394\\-193.8021\\-85\\54.41127\\-192.0613\\-85\\55.88823\\-189.8959\\-85\\55.92752\\-185.9896\\-85\\56.3644\\-185.0499\\-85\\57.10017\\-184.0365\\-85\\58.12075\\-182.0834\\-85\\60.27065\\-180.014\\-85\\64.1769\\-179.7319\\-85\\66.13003\\-179.8174\\-85\\66.74976\\-180.1303\\-85\\68.08315\\-181.5453\\-85\\68.27015\\-182.0834\\-85\\66.68667\\-184.0365\\-85\\66.13003\\-185.0486\\-85\\65.33375\\-185.9896\\-85\\64.56055\\-187.9428\\-85\\64.49564\\-189.8959\\-85\\62.6981\\-191.849\\-85\\62.22377\\-192.1901\\-85\\60.27065\\-192.6464\\-85\\58.31752\\-194.102\\-85\\56.3644\\-195.8627\\-85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "94" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-209.4498\\-83\\-129.1825\\-208.4828\\-83\\-130.7785\\-207.474\\-83\\-132.6034\\-205.5209\\-83\\-133.869\\-203.5678\\-83\\-134.6749\\-201.6146\\-83\\-134.8548\\-195.7553\\-83\\-134.8548\\-193.8021\\-83\\-134.1254\\-191.849\\-83\\-133.0887\\-190.8123\\-83\\-131.1356\\-190.7395\\-83\\-129.1825\\-190.8499\\-83\\-128.3447\\-189.8959\\-83\\-127.2293\\-188.152\\-83\\-125.2762\\-185.841\\-83\\-123.3231\\-184.7318\\-83\\-121.37\\-183.0988\\-83\\-119.4168\\-182.622\\-83\\-117.4637\\-183.0668\\-83\\-116.6902\\-184.0365\\-83\\-116.5641\\-185.9896\\-83\\-116.4494\\-189.8959\\-83\\-115.551\\-191.849\\-83\\-114.3584\\-193.8021\\-83\\-112.4182\\-195.7553\\-83\\-110.9622\\-197.7084\\-83\\-110.1906\\-199.6615\\-83\\-109.2742\\-201.6146\\-83\\-109.3257\\-203.5678\\-83\\-110.6324\\-205.5209\\-83\\-113.5575\\-208.4506\\-83\\-115.5106\\-208.873\\-83\\-117.0384\\-207.474\\-83\\-115.6614\\-205.5209\\-83\\-113.9143\\-203.5678\\-83\\-115.5106\\-202.3589\\-83\\-118.0031\\-199.6615\\-83\\-118.3705\\-195.7553\\-83\\-119.4168\\-194.7983\\-83\\-121.37\\-194.2591\\-83\\-123.3231\\-194.4555\\-83\\-125.2762\\-195.122\\-83\\-126.357\\-195.7553\\-83\\-126.6735\\-197.7084\\-83\\-125.2762\\-198.459\\-83\\-124.3997\\-199.6615\\-83\\-123.3231\\-201.7774\\-83\\-122.6912\\-203.5678\\-83\\-122.6322\\-205.5209\\-83\\-123.4178\\-207.474\\-83\\-124.8329\\-209.4271\\-83\\-125.2762\\-209.8457\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "95" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-53.0106\\-201.7632\\-83\\-54.96373\\-200.4173\\-83\\-56.91685\\-199.8972\\-83\\-58.86998\\-198.7744\\-83\\-60.8231\\-197.214\\-83\\-62.77623\\-196.9594\\-83\\-63.90371\\-195.7553\\-83\\-64.72935\\-194.5758\\-83\\-66.24302\\-195.7553\\-83\\-66.68247\\-196.7318\\-83\\-68.6356\\-197.5066\\-83\\-70.58872\\-196.5803\\-83\\-71.71024\\-195.7553\\-83\\-73.64672\\-193.8021\\-83\\-74.99562\\-191.849\\-83\\-76.06877\\-189.8959\\-83\\-76.64754\\-187.9428\\-83\\-76.18176\\-185.9896\\-83\\-74.49497\\-184.3167\\-83\\-72.54185\\-183.9297\\-83\\-71.45778\\-182.0834\\-83\\-71.66675\\-180.1303\\-83\\-71.29819\\-178.1771\\-83\\-71.60017\\-176.224\\-83\\-70.58872\\-175.0033\\-83\\-68.6356\\-173.9363\\-83\\-64.72935\\-173.9047\\-83\\-62.77623\\-175.1421\\-83\\-60.8231\\-177.2901\\-83\\-60.235\\-178.1771\\-83\\-59.48398\\-180.1303\\-83\\-58.05363\\-182.0834\\-83\\-57.25434\\-184.0365\\-83\\-56.89414\\-185.9896\\-83\\-55.79869\\-187.9428\\-83\\-54.31802\\-189.8959\\-83\\-53.75125\\-191.849\\-83\\-51.06705\\-195.7553\\-83\\-50.68137\\-197.7084\\-83\\-50.72488\\-199.6615\\-83\\-51.05748\\-200.7047\\-83\\-52.34906\\-201.6146\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "96" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-176.5601\\-83\\-41.29185\\-175.8917\\-83\\-43.24498\\-175.3425\\-83\\-44.59356\\-174.2709\\-83\\-46.23733\\-172.3178\\-83\\-47.24597\\-170.3646\\-83\\-47.84209\\-168.4115\\-83\\-48.2009\\-166.4584\\-83\\-48.82253\\-164.5053\\-83\\-49.10435\\-164.1942\\-83\\-51.05748\\-163.624\\-83\\-53.0106\\-163.1879\\-83\\-53.54882\\-162.5521\\-83\\-53.18499\\-160.599\\-83\\-51.05748\\-159.3758\\-83\\-49.10435\\-159.2031\\-83\\-47.15123\\-157.7373\\-83\\-43.24498\\-153.8864\\-83\\-41.29185\\-153.1832\\-83\\-37.3856\\-153.1832\\-83\\-35.43248\\-153.133\\-83\\-33.47935\\-153.5905\\-83\\-31.52623\\-154.7018\\-83\\-29.33574\\-156.6928\\-83\\-28.29412\\-158.6459\\-83\\-27.61998\\-159.299\\-83\\-25.66685\\-159.8874\\-83\\-23.71373\\-160.0616\\-83\\-23.03087\\-160.599\\-83\\-22.73716\\-162.5521\\-83\\-23.71373\\-163.3007\\-83\\-25.66685\\-162.9895\\-83\\-27.61998\\-163.291\\-83\\-28.79086\\-164.5053\\-83\\-29.06779\\-166.4584\\-83\\-29.5731\\-168.1967\\-83\\-30.34645\\-170.3646\\-83\\-31.1545\\-172.3178\\-83\\-32.43212\\-174.2709\\-83\\-33.47935\\-175.3113\\-83\\-35.43248\\-176.6207\\-83\\-37.3856\\-176.9683\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "97" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "32.9269\\-201.9917\\-83\\32.45412\\-201.6146\\-83\\32.30545\\-199.6615\\-83\\33.9982\\-197.7084\\-83\\34.88002\\-196.8331\\-83\\36.83315\\-195.3577\\-83\\38.47033\\-195.7553\\-83\\37.98462\\-197.7084\\-83\\36.83315\\-198.512\\-83\\35.96424\\-199.6615\\-83\\34.88002\\-200.6521\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "98" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-199.8684\\-83\\48.37751\\-199.6615\\-83\\47.7168\\-197.7084\\-83\\48.5519\\-196.2787\\-83\\49.11595\\-195.7553\\-83\\50.50502\\-194.0591\\-83\\50.83494\\-193.8021\\-83\\51.98537\\-191.849\\-83\\52.71585\\-189.8959\\-83\\53.32094\\-187.9428\\-83\\53.13131\\-185.9896\\-83\\54.20611\\-184.0365\\-83\\56.09991\\-182.0834\\-83\\56.21579\\-180.1303\\-83\\56.07587\\-178.1771\\-83\\56.3644\\-177.6482\\-83\\58.31752\\-175.5232\\-83\\60.27065\\-174.0622\\-83\\62.22377\\-173.9562\\-83\\64.1769\\-173.9728\\-83\\64.96358\\-174.2709\\-83\\66.13003\\-175.0208\\-83\\68.08315\\-176.9643\\-83\\68.65281\\-178.1771\\-83\\69.21423\\-180.1303\\-83\\69.32159\\-182.0834\\-83\\68.91592\\-184.0365\\-83\\67.72424\\-185.9896\\-83\\66.79269\\-187.9428\\-83\\66.48325\\-189.8959\\-83\\64.1769\\-192.6319\\-83\\62.22377\\-194.25\\-83\\60.27065\\-195.1848\\-83\\59.52237\\-195.7553\\-83\\58.31752\\-196.4179\\-83\\56.3644\\-197.87\\-83\\54.41127\\-198.8713\\-83\\52.45815\\-199.6282\\-83\\50.50502\\-199.8869\\-83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "99" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-210.0347\\-81\\-129.1825\\-208.6141\\-81\\-131.1356\\-207.7577\\-81\\-133.1695\\-205.5209\\-81\\-134.0745\\-203.5678\\-81\\-134.76\\-201.6146\\-81\\-134.7944\\-199.6615\\-81\\-135.2656\\-197.7084\\-81\\-135.5881\\-195.7553\\-81\\-135.596\\-193.8021\\-81\\-134.9586\\-191.849\\-81\\-133.0887\\-190.4466\\-81\\-131.1356\\-190.8396\\-81\\-129.1825\\-189.9716\\-81\\-128.19\\-187.9428\\-81\\-126.2583\\-185.9896\\-81\\-123.9723\\-184.0365\\-81\\-123.3231\\-183.3945\\-81\\-119.4168\\-181.5029\\-81\\-117.4637\\-181.4127\\-81\\-115.5261\\-182.0834\\-81\\-115.0678\\-184.0365\\-81\\-115.6758\\-185.9896\\-81\\-115.7633\\-187.9428\\-81\\-115.2401\\-191.849\\-81\\-114.3584\\-193.8021\\-81\\-112.412\\-195.7553\\-81\\-110.6476\\-197.7084\\-81\\-109.6589\\-199.6615\\-81\\-109.2742\\-201.6146\\-81\\-109.6512\\-203.033\\-81\\-109.9507\\-203.5678\\-81\\-111.6043\\-205.3395\\-81\\-112.5658\\-203.5678\\-81\\-113.5575\\-202.8836\\-81\\-115.5106\\-202.0493\\-81\\-115.948\\-201.6146\\-81\\-117.2893\\-199.6615\\-81\\-117.6754\\-197.7084\\-81\\-118.3098\\-195.7553\\-81\\-119.4168\\-194.6697\\-81\\-121.37\\-193.8248\\-81\\-123.3231\\-194.3403\\-81\\-125.2762\\-193.7794\\-81\\-127.2293\\-193.8918\\-81\\-128.8313\\-195.7553\\-81\\-129.4284\\-197.7084\\-81\\-129.3876\\-199.6615\\-81\\-129.1825\\-200.131\\-81\\-127.2293\\-200.9004\\-81\\-125.2762\\-201.1527\\-81\\-123.9408\\-203.5678\\-81\\-123.9067\\-205.5209\\-81\\-124.2997\\-207.474\\-81\\-124.5015\\-209.4271\\-81\\-125.2762\\-210.375\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "100" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-201.5572\\-81\\-60.8231\\-201.2977\\-81\\-59.75113\\-199.6615\\-81\\-60.8231\\-198.4735\\-81\\-66.68247\\-194.9925\\-81\\-68.6356\\-194.2346\\-81\\-69.42997\\-195.7553\\-81\\-70.58872\\-196.757\\-81\\-72.54185\\-196.2496\\-81\\-73.03623\\-195.7553\\-81\\-74.31528\\-193.8021\\-81\\-72.1246\\-191.849\\-81\\-71.94786\\-189.8959\\-81\\-71.45998\\-187.9428\\-81\\-71.25248\\-185.9896\\-81\\-72.10472\\-184.0365\\-81\\-74.70424\\-180.1303\\-81\\-73.45385\\-178.1771\\-81\\-72.43947\\-176.224\\-81\\-71.53477\\-174.2709\\-81\\-70.58872\\-173.1328\\-81\\-68.6356\\-171.9412\\-81\\-66.68247\\-171.8859\\-81\\-64.72935\\-170.844\\-81\\-64.28245\\-170.3646\\-81\\-64.72935\\-169.9825\\-81\\-65.70591\\-168.4115\\-81\\-64.72935\\-167.7991\\-81\\-62.77623\\-168.2499\\-81\\-62.61464\\-168.4115\\-81\\-62.21378\\-170.3646\\-81\\-62.77623\\-171.1242\\-81\\-64.01205\\-172.3178\\-81\\-62.77623\\-173.3012\\-81\\-60.8231\\-175.3719\\-81\\-60.12989\\-176.224\\-81\\-59.72098\\-178.1771\\-81\\-58.04842\\-180.1303\\-81\\-56.52746\\-182.0834\\-81\\-56.07909\\-184.0365\\-81\\-55.98298\\-185.9896\\-81\\-54.96373\\-187.8005\\-81\\-53.19321\\-189.8959\\-81\\-52.26085\\-191.849\\-81\\-50.98827\\-193.8021\\-81\\-49.84701\\-195.7553\\-81\\-48.92997\\-199.6615\\-81\\-48.70699\\-201.6146\\-81\\-49.10435\\-202.174\\-81\\-51.05748\\-202.9323\\-81\\-53.0106\\-202.8313\\-81\\-54.96373\\-202.1608\\-81\\-56.91685\\-201.0769\\-81\\-58.86998\\-202.0731\\-81\\-60.8231\\-202.0348\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "101" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-43.24498\\-176.2316\\-81\\-45.1981\\-175.0004\\-81\\-45.94076\\-174.2709\\-81\\-46.75936\\-172.3178\\-81\\-48.01753\\-170.3646\\-81\\-48.54882\\-168.4115\\-81\\-48.72492\\-166.4584\\-81\\-49.48592\\-164.5053\\-81\\-51.05748\\-163.4066\\-81\\-53.0106\\-163.5333\\-81\\-54.39732\\-162.5521\\-81\\-53.98716\\-160.599\\-81\\-53.0106\\-159.6274\\-81\\-51.05748\\-159.1512\\-81\\-49.55896\\-158.6459\\-81\\-47.15123\\-157.5346\\-81\\-45.1981\\-155.7849\\-81\\-43.24498\\-153.8864\\-81\\-41.29185\\-153.1832\\-81\\-37.3856\\-153.057\\-81\\-35.43248\\-152.6249\\-81\\-33.47935\\-152.7638\\-81\\-31.52623\\-153.7027\\-81\\-29.5731\\-155.3201\\-81\\-27.61998\\-157.4725\\-81\\-25.62035\\-158.6459\\-81\\-23.71373\\-159.3095\\-81\\-21.7606\\-160.1295\\-81\\-21.31671\\-160.599\\-81\\-21.7606\\-161.253\\-81\\-23.71373\\-162.1868\\-81\\-25.66685\\-162.1868\\-81\\-27.86587\\-164.5053\\-81\\-28.43645\\-166.4584\\-81\\-29.18616\\-170.3646\\-81\\-30.32123\\-172.3178\\-81\\-31.1419\\-174.2709\\-81\\-33.00609\\-176.224\\-81\\-33.47935\\-176.6109\\-81\\-35.43248\\-177.3291\\-81\\-37.3856\\-177.8118\\-81\\-41.29185\\-176.8163\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "102" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "34.88002\\-202.0114\\-81\\34.12435\\-201.6146\\-81\\34.19485\\-199.6615\\-81\\35.43225\\-197.7084\\-81\\36.04395\\-195.7553\\-81\\36.83315\\-194.8681\\-81\\38.78627\\-193.75\\-81\\40.7394\\-193.7214\\-81\\41.58379\\-195.7553\\-81\\41.54834\\-197.7084\\-81\\40.7394\\-198.8145\\-81\\38.78627\\-199.6122\\-81\\36.83315\\-200.5883\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "103" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-204.0421\\-81\\46.25997\\-203.5678\\-81\\46.66327\\-199.6615\\-81\\48.5519\\-194.2567\\-81\\50.84096\\-189.8959\\-81\\51.96987\\-185.9896\\-81\\53.19732\\-184.0365\\-81\\54.90598\\-182.0834\\-81\\55.1587\\-180.1303\\-81\\54.80864\\-178.1771\\-81\\55.37571\\-176.224\\-81\\56.3644\\-174.5659\\-81\\58.31752\\-172.6827\\-81\\60.27065\\-171.2191\\-81\\62.22377\\-170.6389\\-81\\64.1769\\-170.995\\-81\\66.13003\\-171.6546\\-81\\66.9379\\-172.3178\\-81\\68.90415\\-174.2709\\-81\\70.30865\\-176.224\\-81\\69.74331\\-180.1303\\-81\\69.75445\\-182.0834\\-81\\69.99813\\-184.0365\\-81\\68.60355\\-187.9428\\-81\\68.46408\\-189.8959\\-81\\66.99706\\-191.849\\-81\\66.13003\\-192.7001\\-81\\65.24026\\-193.8021\\-81\\64.1769\\-195.4334\\-81\\63.77802\\-195.7553\\-81\\62.22377\\-196.4672\\-81\\58.31752\\-197.9078\\-81\\56.3644\\-198.8767\\-81\\54.41127\\-200.6451\\-81\\52.45815\\-202.141\\-81\\49.87207\\-203.5678\\-81\\48.5519\\-204.0368\\-81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "104" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-210.1278\\-79\\-129.1825\\-208.3059\\-79\\-131.1356\\-207.1275\\-79\\-133.0887\\-206.1664\\-79\\-133.7063\\-205.5209\\-79\\-135.3237\\-201.6146\\-79\\-135.3779\\-199.6615\\-79\\-136.3014\\-195.7553\\-79\\-136.3086\\-193.8021\\-79\\-135.7573\\-191.849\\-79\\-135.0419\\-191.1057\\-79\\-133.0887\\-190.6644\\-79\\-131.1356\\-191.1408\\-79\\-130.2142\\-189.8959\\-79\\-129.1825\\-188.205\\-79\\-127.2293\\-185.7305\\-79\\-125.2762\\-184.9163\\-79\\-123.3231\\-183.0816\\-79\\-121.37\\-181.5105\\-79\\-119.4168\\-181.0426\\-79\\-117.4637\\-180.0073\\-79\\-115.5106\\-179.6673\\-79\\-113.9264\\-180.1303\\-79\\-113.5575\\-180.5559\\-79\\-113.1681\\-182.0834\\-79\\-114.2067\\-184.0365\\-79\\-114.75\\-185.9896\\-79\\-115.0759\\-187.9428\\-79\\-115.2288\\-191.849\\-79\\-114.3356\\-193.8021\\-79\\-112.4582\\-195.7553\\-79\\-111.0086\\-197.7084\\-79\\-110.7374\\-199.6615\\-79\\-110.694\\-201.6146\\-79\\-111.6043\\-202.1985\\-79\\-113.3947\\-201.6146\\-79\\-115.5106\\-200.6686\\-79\\-116.8423\\-199.6615\\-79\\-117.4637\\-198.9243\\-79\\-118.1131\\-197.7084\\-79\\-118.7678\\-195.7553\\-79\\-119.4168\\-195.0228\\-79\\-121.37\\-194.4018\\-79\\-123.3231\\-195.3082\\-79\\-124.6515\\-193.8021\\-79\\-125.2762\\-192.7321\\-79\\-127.2293\\-192.6432\\-79\\-128.9023\\-193.8021\\-79\\-130.7986\\-195.7553\\-79\\-131.1356\\-196.6208\\-79\\-132.0376\\-199.6615\\-79\\-131.7443\\-201.6146\\-79\\-131.1356\\-202.3199\\-79\\-129.1825\\-203.2748\\-79\\-127.2293\\-202.8803\\-79\\-126.288\\-203.5678\\-79\\-124.9623\\-205.5209\\-79\\-125.371\\-207.474\\-79\\-124.9944\\-209.4271\\-79\\-125.2762\\-209.8089\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "105" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-203.9958\\-79\\-53.0106\\-202.8427\\-79\\-54.96373\\-202.2775\\-79\\-56.91685\\-201.4152\\-79\\-58.86998\\-202.2605\\-79\\-60.8231\\-202.6199\\-79\\-61.88458\\-201.6146\\-79\\-60.8231\\-199.6532\\-79\\-63.33072\\-197.7084\\-79\\-64.72935\\-196.8577\\-79\\-66.68247\\-195.8907\\-79\\-68.6356\\-194.7728\\-79\\-70.58872\\-195.2975\\-79\\-72.25797\\-193.8021\\-79\\-71.48299\\-191.849\\-79\\-72.25462\\-189.8959\\-79\\-73.41774\\-187.9428\\-79\\-73.21502\\-185.9896\\-79\\-73.94266\\-184.0365\\-79\\-75.04393\\-182.0834\\-79\\-75.19252\\-180.1303\\-79\\-74.79708\\-178.1771\\-79\\-73.58245\\-176.224\\-79\\-72.63659\\-174.2709\\-79\\-71.50681\\-172.3178\\-79\\-70.58872\\-171.3713\\-79\\-68.6356\\-170.3569\\-79\\-66.68247\\-169.9184\\-79\\-64.72935\\-168.59\\-79\\-62.77623\\-168.164\\-79\\-62.52874\\-168.4115\\-79\\-61.99596\\-170.3646\\-79\\-62.62762\\-172.3178\\-79\\-61.58008\\-174.2709\\-79\\-60.8231\\-174.9587\\-79\\-59.81733\\-176.224\\-79\\-59.44282\\-178.1771\\-79\\-57.78831\\-180.1303\\-79\\-55.94937\\-182.0834\\-79\\-54.78934\\-184.0365\\-79\\-54.02016\\-185.9896\\-79\\-52.42334\\-187.9428\\-79\\-51.57035\\-189.8959\\-79\\-50.3869\\-191.849\\-79\\-49.10435\\-194.502\\-79\\-48.64862\\-195.7553\\-79\\-48.29313\\-197.7084\\-79\\-47.83186\\-199.6615\\-79\\-46.88069\\-201.6146\\-79\\-46.72475\\-203.5678\\-79\\-47.15123\\-204.0525\\-79\\-49.10435\\-204.348\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "106" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-178.4246\\-79\\-39.33873\\-178.0957\\-79\\-41.29185\\-177.2997\\-79\\-43.24498\\-176.8013\\-79\\-45.1981\\-175.4757\\-79\\-46.37101\\-174.2709\\-79\\-47.45721\\-172.3178\\-79\\-48.35908\\-170.3646\\-79\\-48.89265\\-168.4115\\-79\\-49.02358\\-166.4584\\-79\\-50.00079\\-164.5053\\-79\\-51.05748\\-163.4952\\-79\\-53.0106\\-163.4462\\-79\\-54.96373\\-162.7444\\-79\\-55.13811\\-162.5521\\-79\\-54.72471\\-160.599\\-79\\-53.0106\\-159.2596\\-79\\-51.05748\\-159.1167\\-79\\-50.34485\\-158.6459\\-79\\-45.1981\\-155.5607\\-79\\-43.24498\\-153.8311\\-79\\-41.29185\\-153.0456\\-79\\-37.3856\\-152.1489\\-79\\-35.43248\\-151.7496\\-79\\-33.47935\\-151.7227\\-79\\-31.52623\\-152.2602\\-79\\-29.5731\\-153.5517\\-79\\-26.41407\\-156.6928\\-79\\-25.66685\\-157.3332\\-79\\-23.50575\\-158.6459\\-79\\-21.7606\\-159.5564\\-79\\-20.7796\\-160.599\\-79\\-21.7606\\-161.7409\\-79\\-23.71373\\-161.571\\-79\\-25.66685\\-161.9719\\-79\\-26.23371\\-162.5521\\-79\\-27.03946\\-164.5053\\-79\\-27.59727\\-166.4584\\-79\\-27.92729\\-168.4115\\-79\\-28.4131\\-170.3646\\-79\\-29.22433\\-172.3178\\-79\\-30.37311\\-174.2709\\-79\\-32.30362\\-176.224\\-79\\-33.47935\\-177.1312\\-79\\-35.43248\\-178.1393\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "107" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "36.83315\\-200.1202\\-79\\36.52736\\-199.6615\\-79\\37.28888\\-197.7084\\-79\\37.48234\\-195.7553\\-79\\38.78627\\-194.1726\\-79\\40.7394\\-193.6801\\-79\\42.27658\\-195.7553\\-79\\42.32553\\-197.7084\\-79\\41.12875\\-199.6615\\-79\\40.7394\\-200.0385\\-79\\38.78627\\-200.3446\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "108" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "44.64565\\-206.2478\\-79\\44.07695\\-205.5209\\-79\\44.08056\\-203.5678\\-79\\45.00275\\-201.6146\\-79\\45.74487\\-199.6615\\-79\\46.06864\\-197.7084\\-79\\47.3462\\-195.7553\\-79\\47.94485\\-193.8021\\-79\\49.15864\\-191.849\\-79\\49.95091\\-189.8959\\-79\\50.51271\\-187.9428\\-79\\51.52553\\-185.9896\\-79\\52.89284\\-184.0365\\-79\\53.76894\\-182.0834\\-79\\54.50602\\-180.1303\\-79\\54.33051\\-178.1771\\-79\\54.8511\\-174.2709\\-79\\55.79193\\-172.3178\\-79\\56.3644\\-171.7569\\-79\\58.41306\\-170.3646\\-79\\60.27065\\-169.3936\\-79\\62.22377\\-169.3076\\-79\\64.1769\\-169.6403\\-79\\66.13003\\-170.1529\\-79\\68.08315\\-171.379\\-79\\70.03628\\-173.2674\\-79\\70.90758\\-174.2709\\-79\\71.37539\\-176.224\\-79\\70.65973\\-180.1303\\-79\\70.66685\\-182.0834\\-79\\71.28091\\-184.0365\\-79\\71.18975\\-185.9896\\-79\\70.45876\\-187.9428\\-79\\70.42017\\-189.8959\\-79\\70.72195\\-191.849\\-79\\70.03628\\-193.0885\\-79\\68.08315\\-192.8511\\-79\\65.07786\\-195.7553\\-79\\64.1769\\-196.4826\\-79\\62.22377\\-197.4208\\-79\\60.27065\\-198.1431\\-79\\58.31752\\-198.7206\\-79\\56.3644\\-200.2893\\-79\\54.41127\\-202.1366\\-79\\52.45815\\-202.9741\\-79\\50.50502\\-204.3039\\-79\\48.5519\\-205.0116\\-79\\46.59877\\-206.2034\\-79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "109" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-208.5668\\-77\\-128.2271\\-207.474\\-77\\-129.1825\\-206.2184\\-77\\-131.1356\\-206.6456\\-77\\-133.0887\\-206.281\\-77\\-133.8224\\-205.5209\\-77\\-135.2034\\-203.5678\\-77\\-135.9283\\-201.6146\\-77\\-136.2015\\-199.6615\\-77\\-136.5517\\-195.7553\\-77\\-136.6341\\-193.8021\\-77\\-136.1186\\-191.849\\-77\\-135.0419\\-190.7381\\-77\\-133.0887\\-190.7433\\-77\\-132.0353\\-191.849\\-77\\-133.5369\\-193.8021\\-77\\-133.5016\\-195.7553\\-77\\-133.6109\\-197.7084\\-77\\-133.9916\\-199.6615\\-77\\-133.0887\\-201.4559\\-77\\-131.6354\\-203.5678\\-77\\-131.1356\\-204.1497\\-77\\-129.1825\\-205.2692\\-77\\-127.2293\\-204.7572\\-77\\-126.764\\-205.5209\\-77\\-126.8708\\-207.474\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "32" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "110" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-117.4637\\-198.8086\\-77\\-119.3181\\-197.7084\\-77\\-121.37\\-195.8224\\-77\\-123.3231\\-196.4303\\-77\\-124.0027\\-195.7553\\-77\\-124.5931\\-193.8021\\-77\\-123.3805\\-191.849\\-77\\-125.2762\\-190.2377\\-77\\-129.1825\\-192.1664\\-77\\-129.6708\\-191.849\\-77\\-130.9848\\-189.8959\\-77\\-129.8644\\-187.9428\\-77\\-127.2293\\-185.2153\\-77\\-125.2762\\-183.7416\\-77\\-123.3231\\-182.7904\\-77\\-121.37\\-181.0335\\-77\\-119.4168\\-179.8222\\-77\\-117.4637\\-179.085\\-77\\-115.5106\\-178.5846\\-77\\-113.5575\\-178.6262\\-77\\-111.6043\\-179.3191\\-77\\-110.9637\\-180.1303\\-77\\-113.0408\\-184.0365\\-77\\-114.2384\\-185.9896\\-77\\-114.5714\\-187.9428\\-77\\-114.7658\\-189.8959\\-77\\-115.1111\\-191.849\\-77\\-114.2106\\-193.8021\\-77\\-113.1712\\-195.7553\\-77\\-113.5575\\-196.3178\\-77\\-115.5106\\-196.9991\\-77\\-116.0768\\-197.7084\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "111" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-47.15123\\-205.7356\\-77\\-51.05748\\-204.3519\\-77\\-53.0106\\-202.5313\\-77\\-56.91685\\-200.9793\\-77\\-58.86998\\-200.8426\\-77\\-60.8231\\-200.9506\\-77\\-61.05005\\-199.6615\\-77\\-62.77623\\-198.2025\\-77\\-66.68247\\-196.5188\\-77\\-68.6356\\-195.5642\\-77\\-70.58872\\-194.711\\-77\\-71.51359\\-193.8021\\-77\\-73.09895\\-191.849\\-77\\-75.00531\\-189.8959\\-77\\-75.77381\\-187.9428\\-77\\-75.79456\\-185.9896\\-77\\-75.94746\\-182.0834\\-77\\-75.94746\\-180.1303\\-77\\-75.50069\\-178.1771\\-77\\-74.69441\\-176.224\\-77\\-73.29428\\-174.2709\\-77\\-72.2207\\-172.3178\\-77\\-70.58872\\-170.2561\\-77\\-68.6356\\-169.2667\\-77\\-66.68247\\-168.7485\\-77\\-64.72935\\-168.5077\\-77\\-62.77623\\-169.7219\\-77\\-62.3205\\-170.3646\\-77\\-62.46141\\-172.3178\\-77\\-61.86571\\-174.2709\\-77\\-60.26101\\-176.224\\-77\\-59.23932\\-178.1771\\-77\\-57.68977\\-180.1303\\-77\\-54.00111\\-184.0365\\-77\\-53.22379\\-185.9896\\-77\\-51.9593\\-187.9428\\-77\\-51.05748\\-189.864\\-77\\-49.99645\\-191.849\\-77\\-48.56809\\-193.8021\\-77\\-47.86094\\-195.7553\\-77\\-46.81294\\-197.7084\\-77\\-46.42155\\-199.6615\\-77\\-45.1981\\-203.6073\\-77\\-46.80721\\-205.5209\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "112" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-178.4477\\-77\\-41.29185\\-178.1543\\-77\\-43.24498\\-177.0851\\-77\\-45.1981\\-176.2616\\-77\\-47.15123\\-173.7783\\-77\\-48.04818\\-172.3178\\-77\\-48.75558\\-170.3646\\-77\\-48.91735\\-168.4115\\-77\\-49.49622\\-166.4584\\-77\\-50.31509\\-164.5053\\-77\\-51.05748\\-163.5221\\-77\\-53.0106\\-162.2798\\-77\\-54.96373\\-163.4174\\-77\\-55.79869\\-162.5521\\-77\\-55.48568\\-160.599\\-77\\-54.96373\\-160.0384\\-77\\-53.0106\\-159.0644\\-77\\-51.05748\\-159.0328\\-77\\-49.10435\\-157.7348\\-77\\-47.15123\\-155.8996\\-77\\-45.25969\\-154.7396\\-77\\-41.29185\\-152.1374\\-77\\-39.33873\\-151.5475\\-77\\-37.3856\\-150.4254\\-77\\-35.43248\\-150.3071\\-77\\-33.47935\\-150.2979\\-77\\-31.52623\\-150.4016\\-77\\-29.5731\\-151.5603\\-77\\-25.66685\\-155.4519\\-77\\-24.66661\\-156.6928\\-77\\-23.71373\\-157.6286\\-77\\-21.7606\\-159.1376\\-77\\-20.56261\\-160.599\\-77\\-21.7606\\-161.5399\\-77\\-23.71373\\-161.2309\\-77\\-25.55754\\-162.5521\\-77\\-26.44915\\-164.5053\\-77\\-27.02109\\-166.4584\\-77\\-27.65783\\-170.3646\\-77\\-29.5731\\-174.1413\\-77\\-31.33808\\-176.224\\-77\\-33.47935\\-177.2595\\-77\\-35.43248\\-178.459\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "113" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "44.64565\\-208.097\\-77\\43.35519\\-207.474\\-77\\42.69252\\-206.8818\\-77\\42.01205\\-205.5209\\-77\\42.08616\\-203.5678\\-77\\43.51398\\-201.6146\\-77\\43.88173\\-199.6615\\-77\\42.69252\\-198.4626\\-77\\40.7394\\-200.1639\\-77\\40.03904\\-199.6615\\-77\\39.32449\\-197.7084\\-77\\39.46862\\-195.7553\\-77\\40.7394\\-194.5891\\-77\\42.39142\\-195.7553\\-77\\43.58458\\-197.7084\\-77\\44.64565\\-198.7594\\-77\\45.33535\\-197.7084\\-77\\46.29073\\-195.7553\\-77\\47.55489\\-193.8021\\-77\\48.29281\\-191.849\\-77\\49.54891\\-189.8959\\-77\\50.25754\\-187.9428\\-77\\51.40537\\-185.9896\\-77\\52.96642\\-184.0365\\-77\\53.7383\\-182.0834\\-77\\54.2892\\-180.1303\\-77\\54.49204\\-176.224\\-77\\54.4189\\-174.2709\\-77\\55.36158\\-172.3178\\-77\\56.3644\\-171.3661\\-77\\58.31752\\-169.8504\\-77\\60.27065\\-168.6839\\-77\\62.22377\\-167.8896\\-77\\64.1769\\-167.9407\\-77\\66.13003\\-169.1019\\-77\\68.08315\\-169.8008\\-77\\68.76958\\-170.3646\\-77\\70.65273\\-172.3178\\-77\\71.59502\\-174.2709\\-77\\71.82781\\-176.224\\-77\\71.54315\\-180.1303\\-77\\71.93243\\-182.0834\\-77\\73.31968\\-184.0365\\-77\\73.1822\\-185.9896\\-77\\72.43271\\-187.9428\\-77\\71.94802\\-189.8959\\-77\\71.59248\\-191.849\\-77\\70.03628\\-193.7634\\-77\\68.08315\\-194.3646\\-77\\65.80138\\-195.7553\\-77\\64.1769\\-196.5834\\-77\\62.22377\\-197.7459\\-77\\60.27065\\-198.4716\\-77\\58.31752\\-199.8485\\-77\\56.3644\\-200.6561\\-77\\54.41127\\-202.2841\\-77\\52.45815\\-202.8207\\-77\\50.50502\\-204.4176\\-77\\48.5519\\-205.88\\-77\\46.59877\\-206.7899\\-77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "114" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-206.281\\-75\\-135.7113\\-203.5678\\-75\\-136.4182\\-201.6146\\-75\\-136.1452\\-199.6615\\-75\\-136.4872\\-197.7084\\-75\\-136.5141\\-195.7553\\-75\\-137.2541\\-193.8021\\-75\\-137.4918\\-191.849\\-75\\-136.995\\-191.2197\\-75\\-135.0419\\-189.5704\\-75\\-133.0887\\-189.7738\\-75\\-131.1356\\-189.5288\\-75\\-130.0004\\-187.9428\\-75\\-128.1431\\-185.9896\\-75\\-125.2762\\-183.1492\\-75\\-123.3231\\-181.3216\\-75\\-121.37\\-179.9433\\-75\\-119.4168\\-179.0627\\-75\\-117.4637\\-177.9163\\-75\\-115.5106\\-177.4091\\-75\\-113.5575\\-177.3659\\-75\\-111.6043\\-177.4365\\-75\\-110.0349\\-178.1771\\-75\\-109.6512\\-178.7425\\-75\\-109.1776\\-180.1303\\-75\\-110.5958\\-182.0834\\-75\\-112.4655\\-184.0365\\-75\\-113.3705\\-185.9896\\-75\\-113.6395\\-187.9428\\-75\\-114.2352\\-189.8959\\-75\\-114.4514\\-191.849\\-75\\-113.4627\\-193.8021\\-75\\-113.5575\\-193.967\\-75\\-115.5106\\-193.8835\\-75\\-116.2885\\-191.849\\-75\\-117.4637\\-190.8037\\-75\\-119.4168\\-189.6602\\-75\\-125.2762\\-189.6602\\-75\\-127.2293\\-191.0068\\-75\\-129.1825\\-191.6496\\-75\\-131.1356\\-190.4295\\-75\\-132.447\\-191.849\\-75\\-133.0887\\-192.3202\\-75\\-134.1326\\-193.8021\\-75\\-134.1519\\-197.7084\\-75\\-134.5361\\-199.6615\\-75\\-133.7966\\-201.6146\\-75\\-131.9486\\-203.5678\\-75\\-131.1356\\-204.8881\\-75\\-130.5938\\-205.5209\\-75\\-131.1356\\-206.0819\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "115" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-198.4368\\-75\\-121.37\\-196.9922\\-75\\-122.7679\\-195.7553\\-75\\-123.8397\\-193.8021\\-75\\-123.3231\\-193.3036\\-75\\-121.37\\-194.1731\\-75\\-119.4168\\-194.8215\\-75\\-118.5807\\-195.7553\\-75\\-118.5013\\-197.7084\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "116" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-208.8291\\-75\\-114.8337\\-207.474\\-75\\-113.5575\\-206.1414\\-75\\-111.6043\\-204.7806\\-75\\-109.6512\\-203.0729\\-75\\-109.1496\\-203.5678\\-75\\-109.6512\\-205.4458\\-75\\-110.7531\\-207.474\\-75\\-111.6043\\-208.3344\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "117" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-205.857\\-75\\-51.05748\\-204.4188\\-75\\-53.0106\\-202.4576\\-75\\-54.96373\\-201.3789\\-75\\-56.91685\\-200.5598\\-75\\-58.86998\\-199.8652\\-75\\-60.8231\\-198.69\\-75\\-62.77623\\-197.2618\\-75\\-66.68247\\-196.6046\\-75\\-68.6356\\-196.0592\\-75\\-70.58872\\-194.696\\-75\\-73.88613\\-191.849\\-75\\-75.57207\\-189.8959\\-75\\-76.36733\\-187.9428\\-75\\-76.39592\\-184.0365\\-75\\-76.51469\\-182.0834\\-75\\-76.38152\\-180.1303\\-75\\-76.10759\\-178.1771\\-75\\-75.31549\\-176.224\\-75\\-73.44608\\-174.2709\\-75\\-72.54185\\-172.3929\\-75\\-71.35563\\-170.3646\\-75\\-70.58872\\-169.5\\-75\\-68.6356\\-167.8342\\-75\\-66.68247\\-167.9147\\-75\\-64.72935\\-168.5217\\-75\\-63.18773\\-170.3646\\-75\\-63.16809\\-172.3178\\-75\\-61.98853\\-174.2709\\-75\\-60.8231\\-175.7683\\-75\\-58.24606\\-178.1771\\-75\\-57.58635\\-180.1303\\-75\\-55.84002\\-182.0834\\-75\\-53.91997\\-184.0365\\-75\\-53.11911\\-185.9896\\-75\\-51.94481\\-187.9428\\-75\\-51.05748\\-189.8224\\-75\\-49.99069\\-191.849\\-75\\-48.14371\\-193.8021\\-75\\-46.66006\\-195.7553\\-75\\-45.93727\\-197.7084\\-75\\-44.77273\\-199.6615\\-75\\-44.4538\\-201.6146\\-75\\-44.32273\\-203.5678\\-75\\-44.44733\\-205.5209\\-75\\-45.1981\\-206.4044\\-75\\-47.15123\\-206.5244\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "118" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-178.459\\-75\\-43.24498\\-177.1534\\-75\\-45.1981\\-176.517\\-75\\-47.42176\\-174.2709\\-75\\-48.33207\\-172.3178\\-75\\-48.90491\\-170.3646\\-75\\-49.02358\\-168.4115\\-75\\-50.0202\\-166.4584\\-75\\-50.80999\\-164.5053\\-75\\-51.23127\\-162.5521\\-75\\-53.0106\\-161.5846\\-75\\-54.96373\\-163.1827\\-75\\-55.78114\\-162.5521\\-75\\-55.94494\\-160.599\\-75\\-54.96373\\-159.3349\\-75\\-53.0106\\-158.2247\\-75\\-51.05748\\-158.3054\\-75\\-49.10435\\-157.3493\\-75\\-45.1981\\-153.4683\\-75\\-43.24498\\-151.5841\\-75\\-41.29185\\-150.3549\\-75\\-39.33873\\-149.634\\-75\\-37.3856\\-148.4211\\-75\\-31.52623\\-148.3984\\-75\\-29.5731\\-149.356\\-75\\-27.61998\\-151.2834\\-75\\-25.66685\\-153.3997\\-75\\-23.17185\\-156.6928\\-75\\-21.7606\\-157.9173\\-75\\-20.64113\\-158.6459\\-75\\-20.9038\\-160.599\\-75\\-21.7606\\-161.124\\-75\\-23.71373\\-161.412\\-75\\-25.01754\\-162.5521\\-75\\-25.54478\\-164.5053\\-75\\-26.42171\\-166.4584\\-75\\-27.01365\\-168.4115\\-75\\-27.36089\\-170.3646\\-75\\-29.09063\\-174.2709\\-75\\-30.78185\\-176.224\\-75\\-31.52623\\-176.8089\\-75\\-33.47935\\-177.4589\\-75\\-35.43248\\-178.459\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "119" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-212.6675\\-75\\-38.97663\\-211.3803\\-75\\-38.77942\\-209.4271\\-75\\-40.71965\\-207.474\\-75\\-39.99188\\-205.5209\\-75\\-39.33873\\-204.9461\\-75\\-37.3856\\-206.485\\-75\\-35.76817\\-207.474\\-75\\-35.43248\\-207.8872\\-75\\-34.73412\\-209.4271\\-75\\-35.43248\\-210.7768\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "120" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-210.2787\\-75\\39.44636\\-209.4271\\-75\\39.17891\\-207.474\\-75\\40.13042\\-205.5209\\-75\\40.04552\\-203.5678\\-75\\41.91685\\-201.6146\\-75\\41.77662\\-199.6615\\-75\\40.50755\\-197.7084\\-75\\40.7394\\-197.3105\\-75\\42.69252\\-195.9748\\-75\\44.64565\\-196.6708\\-75\\45.67855\\-195.7553\\-75\\47.21819\\-193.8021\\-75\\47.93761\\-191.849\\-75\\49.44199\\-189.8959\\-75\\50.25754\\-187.9428\\-75\\50.50502\\-187.6201\\-75\\52.52473\\-184.0365\\-75\\54.34469\\-180.1303\\-75\\54.88212\\-178.1771\\-75\\55.18678\\-176.224\\-75\\55.18501\\-174.2709\\-75\\55.9753\\-172.3178\\-75\\56.3644\\-171.9719\\-75\\58.31752\\-171.2158\\-75\\60.91588\\-168.4115\\-75\\62.22377\\-167.2961\\-75\\64.1769\\-166.9086\\-75\\66.13003\\-167.4933\\-75\\68.08315\\-168.2121\\-75\\70.03628\\-170.4572\\-75\\71.14304\\-172.3178\\-75\\72.1764\\-174.2709\\-75\\72.61331\\-176.224\\-75\\72.73133\\-180.1303\\-75\\74.74574\\-182.0834\\-75\\75.35311\\-184.0365\\-75\\74.87685\\-185.9896\\-75\\74.0646\\-187.9428\\-75\\73.04388\\-189.8959\\-75\\72.15099\\-191.849\\-75\\70.03628\\-193.7214\\-75\\68.08315\\-194.6264\\-75\\66.13003\\-195.7629\\-75\\64.1769\\-196.5529\\-75\\62.10826\\-197.7084\\-75\\60.27065\\-198.5107\\-75\\58.31752\\-200.0775\\-75\\56.3644\\-200.7502\\-75\\52.45815\\-202.5106\\-75\\48.5519\\-206.3289\\-75\\46.59877\\-208.1492\\-75\\44.64565\\-209.3419\\-75\\42.69252\\-209.969\\-75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "121" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-206.315\\-73\\-135.8035\\-203.5678\\-73\\-136.5796\\-201.6146\\-73\\-136.2788\\-199.6615\\-73\\-136.1555\\-197.7084\\-73\\-135.9191\\-195.7553\\-73\\-136.995\\-195.1449\\-73\\-137.7261\\-193.8021\\-73\\-138.2989\\-191.849\\-73\\-136.995\\-189.9205\\-73\\-135.0419\\-189.0748\\-73\\-133.47\\-189.8959\\-73\\-134.6401\\-193.8021\\-73\\-134.6991\\-195.7553\\-73\\-134.6401\\-197.7084\\-73\\-134.685\\-199.6615\\-73\\-134.0835\\-201.6146\\-73\\-132.3589\\-203.5678\\-73\\-131.3221\\-205.5209\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "122" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-206.4117\\-73\\-122.2831\\-205.5209\\-73\\-122.5685\\-203.5678\\-73\\-121.37\\-201.8966\\-73\\-119.4168\\-201.8141\\-73\\-117.4637\\-203.5045\\-73\\-118.4046\\-205.5209\\-73\\-119.4168\\-206.4975\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "123" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-208.5717\\-73\\-114.3147\\-207.474\\-73\\-112.2386\\-205.5209\\-73\\-109.6512\\-202.6777\\-73\\-108.7274\\-203.5678\\-73\\-109.1893\\-205.5209\\-73\\-110.6229\\-207.474\\-73\\-111.6043\\-208.4313\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "29" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "124" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-193.957\\-73\\-115.5106\\-193.2341\\-73\\-116.2483\\-191.849\\-73\\-117.4637\\-190.7419\\-73\\-119.4168\\-189.6484\\-73\\-121.37\\-189.6484\\-73\\-125.2762\\-189.5289\\-73\\-127.2293\\-190.9589\\-73\\-129.1825\\-191.5279\\-73\\-130.5259\\-189.8959\\-73\\-130.015\\-187.9428\\-73\\-128.5678\\-185.9896\\-73\\-124.6165\\-182.0834\\-73\\-121.37\\-179.2264\\-73\\-119.4168\\-177.8915\\-73\\-117.4637\\-177.0816\\-73\\-115.5106\\-176.0357\\-73\\-113.5575\\-175.5675\\-73\\-111.6043\\-175.5675\\-73\\-109.6512\\-175.892\\-73\\-109.2181\\-176.224\\-73\\-107.5627\\-178.1771\\-73\\-108.3004\\-180.1303\\-73\\-109.6512\\-181.9643\\-73\\-111.7671\\-184.0365\\-73\\-112.8151\\-185.9896\\-73\\-113.1607\\-187.9428\\-73\\-113.5053\\-191.849\\-73\\-113.4627\\-193.8021\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "125" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-208.1927\\-73\\-47.15123\\-206.6477\\-73\\-49.10435\\-206.1272\\-73\\-51.05748\\-204.3919\\-73\\-53.0106\\-202.43\\-73\\-54.96373\\-200.9085\\-73\\-56.91685\\-200.2612\\-73\\-58.86998\\-198.961\\-73\\-60.8231\\-198.3403\\-73\\-62.77623\\-196.6874\\-73\\-64.72935\\-196.0352\\-73\\-66.68247\\-196.4542\\-73\\-68.6356\\-196.2772\\-73\\-70.58872\\-194.9567\\-73\\-72.54185\\-193.9765\\-73\\-74.49497\\-192.5546\\-73\\-75.19653\\-191.849\\-73\\-76.4481\\-189.3857\\-73\\-76.99432\\-187.9428\\-73\\-76.97005\\-184.0365\\-73\\-77.19821\\-182.0834\\-73\\-76.99432\\-180.1303\\-73\\-76.4481\\-178.3061\\-73\\-75.57109\\-176.224\\-73\\-73.91025\\-174.2709\\-73\\-72.95779\\-172.3178\\-73\\-71.49218\\-170.3646\\-73\\-70.35177\\-168.4115\\-73\\-68.6356\\-166.8019\\-73\\-66.68247\\-167.5251\\-73\\-65.40209\\-168.4115\\-73\\-64.72935\\-169.0602\\-73\\-63.84714\\-170.3646\\-73\\-63.66721\\-172.3178\\-73\\-60.02756\\-176.224\\-73\\-59.35244\\-178.1771\\-73\\-57.75454\\-180.1303\\-73\\-55.8448\\-182.0834\\-73\\-54.12996\\-184.0365\\-73\\-53.52428\\-185.9896\\-73\\-51.97979\\-187.9428\\-73\\-51.08018\\-189.8959\\-73\\-49.99069\\-191.849\\-73\\-46.17466\\-195.7553\\-73\\-44.93901\\-197.7084\\-73\\-44.2021\\-199.6615\\-73\\-42.69086\\-201.6146\\-73\\-42.52568\\-203.5678\\-73\\-42.47607\\-205.5209\\-73\\-41.29185\\-207.3941\\-73\\-41.29185\\-207.7182\\-73\\-43.24498\\-209.4158\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "126" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-178.459\\-73\\-43.24498\\-177.1534\\-73\\-45.1981\\-176.4357\\-73\\-47.15123\\-174.8887\\-73\\-47.67925\\-174.2709\\-73\\-48.49067\\-172.3178\\-73\\-48.91735\\-170.3646\\-73\\-49.52549\\-168.4115\\-73\\-50.32877\\-166.4584\\-73\\-50.97671\\-164.5053\\-73\\-51.00529\\-162.5521\\-73\\-53.0106\\-161.1483\\-73\\-54.96373\\-161.7758\\-73\\-56.51209\\-160.599\\-73\\-55.86871\\-158.6459\\-73\\-54.96373\\-157.7313\\-73\\-53.0106\\-157.5801\\-73\\-51.05748\\-157.5989\\-73\\-49.8256\\-156.6928\\-73\\-47.85458\\-154.7396\\-73\\-45.1981\\-151.6358\\-73\\-43.24498\\-149.6111\\-73\\-41.29185\\-148.3336\\-73\\-39.33873\\-147.6403\\-73\\-37.3856\\-146.3819\\-73\\-29.5731\\-146.3786\\-73\\-27.61998\\-147.5417\\-73\\-25.66685\\-149.6718\\-73\\-25.0434\\-150.8334\\-73\\-24.58868\\-152.7865\\-73\\-21.7606\\-156.6257\\-73\\-19.80748\\-157.6793\\-73\\-18.83091\\-158.6459\\-73\\-18.958\\-160.599\\-73\\-19.80748\\-161.2552\\-73\\-21.7606\\-160.9245\\-73\\-23.71373\\-161.774\\-73\\-24.47158\\-162.5521\\-73\\-25.50526\\-166.4584\\-73\\-26.39004\\-168.4115\\-73\\-27.03622\\-170.3646\\-73\\-27.58242\\-172.3178\\-73\\-28.61788\\-174.2709\\-73\\-31.52623\\-177.1702\\-73\\-33.47935\\-178.2579\\-73\\-35.43248\\-178.459\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "127" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-215.6929\\-73\\-39.48958\\-213.3334\\-73\\-39.92275\\-211.3803\\-73\\-39.33873\\-210.9454\\-73\\-37.3856\\-210.1075\\-73\\-36.88252\\-209.4271\\-73\\-37.61021\\-207.474\\-73\\-37.21633\\-205.5209\\-73\\-35.43248\\-204.8167\\-73\\-34.41892\\-205.5209\\-73\\-33.02159\\-207.474\\-73\\-32.69705\\-209.4271\\-73\\-32.70338\\-211.3803\\-73\\-33.47935\\-212.7877\\-73\\-35.43248\\-214.6752\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "128" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-210.8636\\-73\\38.83886\\-209.4271\\-73\\37.76113\\-207.474\\-73\\38.74813\\-205.5209\\-73\\39.84422\\-203.5678\\-73\\41.64118\\-201.6146\\-73\\41.79734\\-199.6615\\-73\\41.66924\\-197.7084\\-73\\42.69252\\-196.5461\\-73\\44.64565\\-196.2935\\-73\\45.27298\\-195.7553\\-73\\47.6057\\-191.849\\-73\\49.44199\\-189.8959\\-73\\50.31802\\-187.9428\\-73\\51.45243\\-185.9896\\-73\\52.85737\\-184.0365\\-73\\53.66274\\-182.0834\\-73\\54.86426\\-180.1303\\-73\\55.85287\\-178.1771\\-73\\57.25677\\-176.224\\-73\\58.9395\\-174.2709\\-73\\59.77006\\-172.3178\\-73\\60.27065\\-171.5128\\-73\\61.6511\\-168.4115\\-73\\62.22377\\-167.8492\\-73\\64.1769\\-167.0344\\-73\\66.13003\\-166.6223\\-73\\68.08315\\-167.3594\\-73\\69.1746\\-168.4115\\-73\\70.8186\\-170.3646\\-73\\71.62794\\-172.3178\\-73\\72.77173\\-174.2709\\-73\\73.49921\\-176.224\\-73\\74.03726\\-178.1771\\-73\\74.84856\\-180.1303\\-73\\75.54688\\-182.0834\\-73\\75.70865\\-184.0365\\-73\\75.54688\\-185.9896\\-73\\74.97739\\-187.9428\\-73\\74.09113\\-189.8959\\-73\\72.71759\\-191.849\\-73\\71.9894\\-192.5857\\-73\\69.76799\\-193.8021\\-73\\68.08315\\-194.6264\\-73\\66.13003\\-195.7629\\-73\\64.1769\\-196.3466\\-73\\62.22377\\-197.1203\\-73\\60.27065\\-198.3509\\-73\\58.31752\\-198.7817\\-73\\56.3644\\-199.9688\\-73\\54.41127\\-200.8502\\-73\\52.45815\\-202.3851\\-73\\46.59877\\-208.3534\\-73\\44.64565\\-210.2114\\-73\\42.69252\\-211.2375\\-73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "129" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-136.995\\-195.3323\\-71\\-137.9204\\-193.8021\\-71\\-138.4512\\-191.849\\-71\\-137.5271\\-189.8959\\-71\\-136.995\\-189.3822\\-71\\-135.0419\\-188.8947\\-71\\-133.9586\\-189.8959\\-71\\-134.65\\-191.849\\-71\\-135.5115\\-193.8021\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "130" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-131.1356\\-208.3379\\-71\\-133.0887\\-206.7127\\-71\\-135.0419\\-204.7114\\-71\\-136.0366\\-203.5678\\-71\\-137.4109\\-201.6146\\-71\\-137.6967\\-199.6615\\-71\\-137.4014\\-197.7084\\-71\\-136.995\\-196.6358\\-71\\-135.0419\\-198.8692\\-71\\-134.76\\-199.6615\\-71\\-134.5653\\-201.6146\\-71\\-133.7457\\-203.5678\\-71\\-131.8905\\-205.5209\\-71\\-130.1651\\-207.474\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "131" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-191.1576\\-71\\-130.0827\\-189.8959\\-71\\-129.8677\\-185.9896\\-71\\-125.2762\\-181.3496\\-71\\-123.3231\\-179.8134\\-71\\-121.37\\-178.8333\\-71\\-119.4168\\-177.099\\-71\\-117.4637\\-176.0246\\-71\\-115.5106\\-175.1328\\-71\\-113.5575\\-174.7001\\-71\\-111.6043\\-174.6804\\-71\\-109.6512\\-175.0007\\-71\\-108.2722\\-176.224\\-71\\-107.2098\\-178.1771\\-71\\-107.362\\-180.1303\\-71\\-108.6896\\-182.0834\\-71\\-110.6179\\-184.0365\\-71\\-112.1892\\-185.9896\\-71\\-112.5809\\-187.9428\\-71\\-112.8325\\-189.8959\\-71\\-113.5575\\-191.3314\\-71\\-115.5106\\-191.8109\\-71\\-117.4637\\-190.5022\\-71\\-119.4168\\-189.6484\\-71\\-121.37\\-189.6484\\-71\\-123.3231\\-189.2264\\-71\\-125.2762\\-189.0859\\-71\\-127.2293\\-190.4581\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "132" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-205.8242\\-71\\-123.5955\\-205.5209\\-71\\-122.4817\\-203.5678\\-71\\-121.37\\-202.3226\\-71\\-119.4168\\-202.1448\\-71\\-117.969\\-203.5678\\-71\\-118.3928\\-205.5209\\-71\\-119.4168\\-206.5272\\-71\\-121.37\\-206.8315\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "133" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-121.37\\-198.1614\\-71\\-121.8489\\-197.7084\\-71\\-122.0953\\-195.7553\\-71\\-121.37\\-195.1025\\-71\\-119.4168\\-194.4584\\-71\\-117.4637\\-194.6383\\-71\\-116.0995\\-195.7553\\-71\\-117.4637\\-197.3093\\-71\\-117.9573\\-197.7084\\-71\\-119.4168\\-198.4191\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "134" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.8104\\-207.474\\-71\\-111.4073\\-205.5209\\-71\\-110.7921\\-203.5678\\-71\\-109.6512\\-202.4214\\-71\\-108.2874\\-203.5678\\-71\\-108.7494\\-205.5209\\-71\\-109.6512\\-206.6209\\-71\\-111.3575\\-207.474\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "135" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-212.4209\\-71\\-44.08998\\-209.4271\\-71\\-47.15123\\-206.4649\\-71\\-49.10435\\-205.2061\\-71\\-51.05748\\-204.1185\\-71\\-53.63406\\-201.6146\\-71\\-54.96373\\-200.4886\\-71\\-56.91685\\-199.0052\\-71\\-60.8231\\-197.775\\-71\\-62.77623\\-196.5764\\-71\\-64.72935\\-195.7629\\-71\\-66.68247\\-195.8907\\-71\\-68.6356\\-195.8638\\-71\\-70.58872\\-195.5796\\-71\\-72.54185\\-194.5866\\-71\\-75.35576\\-191.849\\-71\\-76.95341\\-189.8959\\-71\\-77.45631\\-187.9428\\-71\\-77.29089\\-185.9896\\-71\\-77.29594\\-184.0365\\-71\\-77.93417\\-182.0834\\-71\\-76.95341\\-178.1771\\-71\\-76.4481\\-176.8799\\-71\\-75.25808\\-174.2709\\-71\\-72.10854\\-170.3646\\-71\\-71.29661\\-168.4115\\-71\\-70.58872\\-167.5647\\-71\\-68.6356\\-166.5938\\-71\\-66.68247\\-167.5341\\-71\\-65.76791\\-168.4115\\-71\\-64.31341\\-170.3646\\-71\\-63.76729\\-172.3178\\-71\\-61.84233\\-174.2709\\-71\\-60.45611\\-176.224\\-71\\-59.74255\\-178.1771\\-71\\-55.86683\\-182.0834\\-71\\-53.87813\\-185.9896\\-71\\-52.26585\\-187.9428\\-71\\-51.49483\\-189.8959\\-71\\-49.99069\\-191.849\\-71\\-46.09674\\-195.7553\\-71\\-44.49281\\-197.7084\\-71\\-43.86203\\-199.6615\\-71\\-43.24498\\-200.33\\-71\\-40.57408\\-203.5678\\-71\\-40.49991\\-205.5209\\-71\\-40.09035\\-207.474\\-71\\-39.19489\\-209.4271\\-71\\-38.83542\\-211.3803\\-71\\-39.33873\\-211.9395\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "136" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-178.3641\\-71\\-44.66209\\-176.224\\-71\\-46.6485\\-174.2709\\-71\\-48.18058\\-172.3178\\-71\\-48.92997\\-170.3646\\-71\\-50.00858\\-168.4115\\-71\\-50.84577\\-166.4584\\-71\\-50.97671\\-164.5053\\-71\\-51.00529\\-162.5521\\-71\\-53.0106\\-160.9245\\-71\\-54.96373\\-161.4695\\-71\\-56.13679\\-160.599\\-71\\-56.64448\\-158.6459\\-71\\-54.96373\\-157.2177\\-71\\-51.05748\\-157.181\\-71\\-49.10435\\-155.6864\\-71\\-48.32798\\-154.7396\\-71\\-47.40042\\-152.7865\\-71\\-45.90886\\-150.8334\\-71\\-43.24498\\-147.6437\\-71\\-41.29185\\-146.3445\\-71\\-39.33873\\-145.6769\\-71\\-37.3856\\-144.3643\\-71\\-35.43248\\-144.3248\\-71\\-29.5731\\-144.3569\\-71\\-27.61998\\-145.4807\\-71\\-25.66685\\-147.4154\\-71\\-24.57868\\-148.8803\\-71\\-23.56512\\-150.8334\\-71\\-23.13642\\-152.7865\\-71\\-22.57853\\-154.7396\\-71\\-21.7606\\-155.625\\-71\\-20.32108\\-156.6928\\-71\\-17.96367\\-158.6459\\-71\\-19.80748\\-160.0823\\-71\\-21.7606\\-160.1194\\-71\\-22.28018\\-160.599\\-71\\-23.71373\\-162.7498\\-71\\-24.47383\\-164.5053\\-71\\-25.54478\\-168.4115\\-71\\-26.62252\\-170.3646\\-71\\-27.34944\\-172.3178\\-71\\-28.53319\\-174.2709\\-71\\-31.52623\\-177.2358\\-71\\-33.47935\\-178.459\\-71\\-39.33873\\-178.459\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "137" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-217.6743\\-71\\-35.86716\\-217.2396\\-71\\-36.3024\\-215.2865\\-71\\-36.41446\\-213.3334\\-71\\-36.38306\\-211.3803\\-71\\-36.12399\\-209.4271\\-71\\-35.57317\\-207.474\\-71\\-34.42262\\-205.5209\\-71\\-33.47935\\-205.0208\\-71\\-32.92963\\-205.5209\\-71\\-31.4862\\-207.474\\-71\\-30.72405\\-209.4271\\-71\\-30.75418\\-213.3334\\-71\\-31.52623\\-214.7378\\-71\\-33.47935\\-216.6264\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "138" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-211.8422\\-71\\38.78627\\-210.515\\-71\\37.81871\\-209.4271\\-71\\37.88586\\-207.474\\-71\\38.65084\\-205.5209\\-71\\39.66735\\-203.5678\\-71\\41.57061\\-201.6146\\-71\\42.12286\\-199.6615\\-71\\43.38929\\-197.7084\\-71\\45.48643\\-195.7553\\-71\\46.93706\\-193.8021\\-71\\47.80107\\-191.849\\-71\\49.50249\\-189.8959\\-71\\50.89441\\-187.9428\\-71\\51.93771\\-185.9896\\-71\\53.83504\\-184.0365\\-71\\55.05\\-182.0834\\-71\\55.47879\\-180.1303\\-71\\57.12844\\-178.1771\\-71\\58.00063\\-176.224\\-71\\59.2135\\-174.2709\\-71\\60.84795\\-172.3178\\-71\\61.29649\\-170.3646\\-71\\62.22377\\-169.3172\\-71\\64.1769\\-167.4163\\-71\\66.13003\\-165.8513\\-71\\68.08315\\-166.0237\\-71\\68.5748\\-166.4584\\-71\\70.19904\\-168.4115\\-71\\71.18723\\-170.3646\\-71\\72.34622\\-172.3178\\-71\\73.80709\\-176.224\\-71\\74.74107\\-178.1771\\-71\\75.56799\\-180.1303\\-71\\75.78714\\-182.0834\\-71\\75.78714\\-184.0365\\-71\\75.56799\\-187.9428\\-71\\74.7121\\-189.8959\\-71\\73.94253\\-190.6959\\-71\\71.9894\\-192.4126\\-71\\70.03628\\-193.2032\\-71\\68.08315\\-194.6054\\-71\\66.13003\\-195.6605\\-71\\64.1769\\-195.8773\\-71\\62.22377\\-196.6207\\-71\\60.27065\\-197.6418\\-71\\58.31752\\-197.8828\\-71\\56.3644\\-198.6242\\-71\\54.41127\\-200.3036\\-71\\52.5279\\-201.6146\\-71\\50.49733\\-203.5678\\-71\\49.04599\\-205.5209\\-71\\47.39098\\-207.474\\-71\\44.64565\\-210.2193\\-71\\42.69252\\-211.7268\\-71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "139" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-208.1307\\-69\\-135.7049\\-205.5209\\-69\\-137.2425\\-203.5678\\-69\\-137.9537\\-201.6146\\-69\\-138.4024\\-199.6615\\-69\\-138.2607\\-197.7084\\-69\\-137.5646\\-195.7553\\-69\\-138.2992\\-193.8021\\-69\\-138.5711\\-191.849\\-69\\-137.7673\\-189.8959\\-69\\-136.995\\-189.1575\\-69\\-135.0419\\-188.8344\\-69\\-134.2122\\-189.8959\\-69\\-135.4189\\-191.849\\-69\\-136.665\\-195.7553\\-69\\-135.4414\\-199.6615\\-69\\-133.8381\\-203.5678\\-69\\-132.195\\-205.5209\\-69\\-131.1356\\-206.5947\\-69\\-130.0678\\-207.474\\-69\\-131.1356\\-208.7696\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "140" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-190.8336\\-69\\-129.987\\-189.8959\\-69\\-130.002\\-185.9896\\-69\\-125.2762\\-181.2064\\-69\\-121.37\\-177.4358\\-69\\-119.4168\\-176.6134\\-69\\-117.4637\\-175.4358\\-69\\-115.5106\\-174.7175\\-69\\-113.5575\\-174.4947\\-69\\-111.6043\\-174.4947\\-69\\-109.6512\\-174.6277\\-69\\-107.6981\\-175.862\\-69\\-107.4163\\-176.224\\-69\\-107.2098\\-178.1771\\-69\\-107.2917\\-180.1303\\-69\\-108.6191\\-182.0834\\-69\\-110.5075\\-184.0365\\-69\\-111.3806\\-185.9896\\-69\\-111.5378\\-187.9428\\-69\\-112.2243\\-189.8959\\-69\\-113.5575\\-191.207\\-69\\-115.5106\\-190.8518\\-69\\-117.4637\\-189.7605\\-69\\-119.4168\\-189.6484\\-69\\-121.37\\-189.6484\\-69\\-123.3231\\-188.8677\\-69\\-125.2762\\-187.9506\\-69\\-127.2293\\-189.1635\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "141" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-206.3011\\-69\\-124.0755\\-205.5209\\-69\\-121.37\\-202.8622\\-69\\-119.4168\\-202.3113\\-69\\-118.476\\-203.5678\\-69\\-119.2258\\-205.5209\\-69\\-119.4168\\-205.7106\\-69\\-121.37\\-206.5426\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "142" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-200.5468\\-69\\-119.9875\\-199.6615\\-69\\-122.3289\\-197.7084\\-69\\-122.1838\\-195.7553\\-69\\-121.37\\-195.4623\\-69\\-119.4168\\-195.882\\-69\\-117.4637\\-194.7918\\-69\\-116.3846\\-195.7553\\-69\\-116.7832\\-197.7084\\-69\\-118.8173\\-199.6615\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "143" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-109.6512\\-207.9681\\-69\\-110.3261\\-207.474\\-69\\-111.2638\\-205.5209\\-69\\-111.1335\\-203.5678\\-69\\-109.6512\\-201.7501\\-69\\-107.6981\\-202.9767\\-69\\-107.2822\\-203.5678\\-69\\-107.4163\\-205.5209\\-69\\-109.0941\\-207.474\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "144" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-213.5204\\-69\\-41.50111\\-213.3334\\-69\\-43.24498\\-210.8343\\-69\\-44.12101\\-209.4271\\-69\\-46.01353\\-207.474\\-69\\-48.06578\\-205.5209\\-69\\-50.41875\\-203.5678\\-69\\-52.10506\\-201.6146\\-69\\-53.0106\\-200.8638\\-69\\-54.96373\\-199.7281\\-69\\-56.91685\\-198.3788\\-69\\-58.86998\\-197.6708\\-69\\-62.77623\\-196.3656\\-69\\-64.72935\\-195.7629\\-69\\-68.6356\\-195.6067\\-69\\-70.58872\\-195.5937\\-69\\-72.54185\\-194.6177\\-69\\-74.49497\\-192.7188\\-69\\-77.29414\\-189.8959\\-69\\-78.002\\-187.9428\\-69\\-77.34256\\-185.9896\\-69\\-77.33937\\-184.0365\\-69\\-78.1194\\-182.0834\\-69\\-78.0218\\-180.1303\\-69\\-77.32793\\-178.1771\\-69\\-75.60079\\-174.2709\\-69\\-74.95694\\-172.3178\\-69\\-73.58523\\-170.3646\\-69\\-72.85667\\-168.4115\\-69\\-72.54185\\-168.0571\\-69\\-70.58872\\-166.5861\\-69\\-68.6356\\-167.1181\\-69\\-66.68247\\-168.1035\\-69\\-66.37235\\-168.4115\\-69\\-65.20876\\-170.3646\\-69\\-63.93415\\-172.3178\\-69\\-62.3919\\-174.2709\\-69\\-61.45839\\-176.224\\-69\\-59.77108\\-178.1771\\-69\\-57.81529\\-180.1303\\-69\\-56.08044\\-182.0834\\-69\\-55.62658\\-184.0365\\-69\\-54.14993\\-185.9896\\-69\\-53.44529\\-187.9428\\-69\\-51.9261\\-189.8959\\-69\\-50.02813\\-191.849\\-69\\-45.1981\\-196.6483\\-69\\-42.53697\\-199.6615\\-69\\-41.4558\\-201.6146\\-69\\-40.10569\\-203.5678\\-69\\-38.50617\\-205.5209\\-69\\-38.35792\\-209.4271\\-69\\-38.37479\\-211.3803\\-69\\-39.33873\\-212.9441\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "145" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-178.3766\\-69\\-41.29185\\-177.5486\\-69\\-43.24498\\-176.9071\\-69\\-45.1981\\-175.2525\\-69\\-48.12254\\-172.3178\\-69\\-48.92997\\-170.3646\\-69\\-50.07079\\-168.4115\\-69\\-50.97671\\-166.4584\\-69\\-51.00529\\-162.5521\\-69\\-52.28399\\-160.599\\-69\\-53.0106\\-159.9531\\-69\\-54.96373\\-160.146\\-69\\-56.80835\\-158.6459\\-69\\-55.34197\\-156.6928\\-69\\-54.96373\\-156.3462\\-69\\-53.0106\\-156.2045\\-69\\-51.05748\\-156.2768\\-69\\-49.36344\\-154.7396\\-69\\-48.27501\\-152.7865\\-69\\-46.63631\\-150.8334\\-69\\-45.53419\\-148.8803\\-69\\-44.24221\\-146.9271\\-69\\-43.24498\\-145.9556\\-69\\-41.29185\\-144.5301\\-69\\-39.33873\\-143.9975\\-69\\-37.3856\\-142.5413\\-69\\-35.43248\\-142.3031\\-69\\-31.52623\\-142.3129\\-69\\-29.5731\\-142.5862\\-69\\-29.03303\\-143.0209\\-69\\-26.05595\\-144.974\\-69\\-25.66685\\-145.3631\\-69\\-23.12886\\-148.8803\\-69\\-22.61865\\-152.7865\\-69\\-21.15839\\-154.7396\\-69\\-19.80748\\-155.8108\\-69\\-18.48168\\-156.6928\\-69\\-17.85435\\-157.3842\\-69\\-17.03901\\-158.6459\\-69\\-17.85435\\-159.4498\\-69\\-21.7606\\-159.6849\\-69\\-22.68316\\-160.599\\-69\\-23.37764\\-162.5521\\-69\\-23.57829\\-164.5053\\-69\\-24.68067\\-166.4584\\-69\\-25.32033\\-168.4115\\-69\\-26.32655\\-170.3646\\-69\\-27.01292\\-172.3178\\-69\\-28.53319\\-174.2709\\-69\\-31.52623\\-177.2056\\-69\\-33.47935\\-178.3888\\-69\\-37.3856\\-178.459\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "146" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-31.52623\\-219.8064\\-69\\-33.47935\\-218.4551\\-69\\-34.37799\\-217.2396\\-69\\-33.96763\\-215.2865\\-69\\-33.47935\\-214.7827\\-69\\-32.58854\\-213.3334\\-69\\-32.58417\\-211.3803\\-69\\-34.43372\\-207.474\\-69\\-33.66291\\-205.5209\\-69\\-31.52623\\-204.455\\-69\\-29.5731\\-204.5255\\-69\\-28.81935\\-205.5209\\-69\\-28.78344\\-213.3334\\-69\\-28.69089\\-217.2396\\-69\\-29.5731\\-218.9624\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "147" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "36.83315\\-210.2154\\-69\\36.22009\\-209.4271\\-69\\37.74612\\-207.474\\-69\\38.80898\\-205.5209\\-69\\39.5479\\-203.5678\\-69\\41.02313\\-201.6146\\-69\\41.89561\\-199.6615\\-69\\43.63098\\-197.7084\\-69\\47.47339\\-193.8021\\-69\\48.88799\\-191.849\\-69\\50.01974\\-189.8959\\-69\\50.50502\\-189.3888\\-69\\53.26329\\-185.9896\\-69\\55.17788\\-184.0365\\-69\\56.10631\\-182.0834\\-69\\56.29731\\-180.1303\\-69\\58.22278\\-176.224\\-69\\59.26122\\-174.2709\\-69\\61.10706\\-172.3178\\-69\\61.68248\\-170.3646\\-69\\63.24141\\-168.4115\\-69\\66.13003\\-165.5566\\-69\\68.08315\\-165.436\\-69\\69.44424\\-166.4584\\-69\\71.12982\\-168.4115\\-69\\72.28237\\-170.3646\\-69\\73.06313\\-172.3178\\-69\\73.62563\\-174.2709\\-69\\76.40096\\-182.0834\\-69\\76.43387\\-184.0365\\-69\\75.78714\\-185.9896\\-69\\75.63656\\-187.9428\\-69\\74.74341\\-189.8959\\-69\\73.94253\\-190.7276\\-69\\70.03628\\-192.7354\\-69\\68.08315\\-194.3134\\-69\\66.13003\\-195.0858\\-69\\64.1769\\-195.6745\\-69\\62.22377\\-196.3696\\-69\\58.31752\\-197.0523\\-69\\56.3644\\-198.3403\\-69\\54.41127\\-198.9517\\-69\\52.45815\\-200.5127\\-69\\49.41714\\-203.5678\\-69\\46.59877\\-207.0846\\-69\\44.23671\\-209.4271\\-69\\42.69252\\-210.6813\\-69\\40.7394\\-210.9183\\-69\\38.78627\\-210.834\\-69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "148" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-208.5296\\-67\\-135.0419\\-206.7921\\-67\\-139.3735\\-201.6146\\-67\\-139.4189\\-199.6615\\-67\\-138.9481\\-198.7626\\-67\\-137.9505\\-197.7084\\-67\\-137.4395\\-195.7553\\-67\\-137.912\\-193.8021\\-67\\-138.9481\\-193.1486\\-67\\-139.7376\\-191.849\\-67\\-138.9481\\-190.8493\\-67\\-136.995\\-189.2816\\-67\\-135.8637\\-189.8959\\-67\\-135.9193\\-191.849\\-67\\-136.5392\\-193.8021\\-67\\-136.618\\-195.7553\\-67\\-136.4783\\-197.7084\\-67\\-135.7606\\-199.6615\\-67\\-134.598\\-201.6146\\-67\\-133.8091\\-203.5678\\-67\\-133.0887\\-204.8786\\-67\\-131.3965\\-207.474\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "149" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-190.9792\\-67\\-130.6509\\-189.8959\\-67\\-130.002\\-185.9896\\-67\\-126.23\\-182.0834\\-67\\-121.37\\-177.354\\-67\\-119.4168\\-176.6109\\-67\\-117.4637\\-175.6589\\-67\\-115.5106\\-175.0058\\-67\\-113.5575\\-174.5964\\-67\\-111.6043\\-174.5414\\-67\\-109.6512\\-174.8923\\-67\\-108.1689\\-176.224\\-67\\-107.3413\\-178.1771\\-67\\-108.8451\\-182.0834\\-67\\-110.4589\\-184.0365\\-67\\-111.1697\\-185.9896\\-67\\-111.1884\\-187.9428\\-67\\-111.3686\\-189.8959\\-67\\-111.6043\\-190.2183\\-67\\-113.5575\\-191.556\\-67\\-115.5106\\-190.7634\\-67\\-117.4637\\-189.6484\\-67\\-121.37\\-189.6484\\-67\\-123.3231\\-188.8259\\-67\\-125.2762\\-187.6953\\-67\\-127.2293\\-189.0711\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "150" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-119.4168\\-201.3056\\-67\\-120.4992\\-199.6615\\-67\\-121.37\\-198.9458\\-67\\-123.3231\\-198.4348\\-67\\-124.1515\\-197.7084\\-67\\-125.1355\\-195.7553\\-67\\-123.3231\\-194.5046\\-67\\-121.8379\\-195.7553\\-67\\-119.7712\\-197.7084\\-67\\-119.4168\\-198.1686\\-67\\-118.7333\\-199.6615\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "151" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-109.6512\\-208.4313\\-67\\-111.1814\\-207.474\\-67\\-110.6529\\-203.5678\\-67\\-109.6512\\-201.5608\\-67\\-107.6981\\-201.3003\\-67\\-107.3941\\-201.6146\\-67\\-106.9538\\-203.5678\\-67\\-107.1761\\-205.5209\\-67\\-108.6939\\-207.474\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "152" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-214.1275\\-67\\-42.11936\\-213.3334\\-67\\-42.89845\\-211.3803\\-67\\-43.83964\\-209.4271\\-67\\-44.90513\\-207.474\\-67\\-47.15123\\-205.27\\-67\\-48.99421\\-203.5678\\-67\\-51.05748\\-201.3445\\-67\\-53.0106\\-200.2931\\-67\\-54.96373\\-198.5604\\-67\\-56.91685\\-197.0453\\-67\\-60.8231\\-196.4221\\-67\\-62.77623\\-195.8638\\-67\\-64.72935\\-195.6468\\-67\\-66.68247\\-195.0662\\-67\\-68.6356\\-194.8169\\-67\\-70.58872\\-194.8003\\-67\\-72.54185\\-194.3465\\-67\\-74.49497\\-192.7188\\-67\\-77.32939\\-189.8959\\-67\\-78.1194\\-187.9428\\-67\\-77.5021\\-185.9896\\-67\\-77.4929\\-184.0365\\-67\\-78.13069\\-182.0834\\-67\\-78.14214\\-180.1303\\-67\\-77.5042\\-178.1771\\-67\\-77.26413\\-176.224\\-67\\-76.89199\\-174.2709\\-67\\-75.51739\\-172.3178\\-67\\-75.20918\\-170.3646\\-67\\-74.17421\\-168.4115\\-67\\-72.54185\\-166.7301\\-67\\-70.58872\\-165.8586\\-67\\-68.6356\\-167.3949\\-67\\-65.64996\\-170.3646\\-67\\-64.00902\\-172.3178\\-67\\-63.34132\\-174.2709\\-67\\-61.73425\\-176.224\\-67\\-59.77584\\-178.1771\\-67\\-57.98976\\-180.1303\\-67\\-57.54538\\-182.0834\\-67\\-56.02463\\-184.0365\\-67\\-55.47741\\-185.9896\\-67\\-52.244\\-189.8959\\-67\\-51.05748\\-191.5325\\-67\\-48.7766\\-193.8021\\-67\\-47.15123\\-195.0381\\-67\\-45.1981\\-196.6563\\-67\\-43.24498\\-198.5966\\-67\\-38.5166\\-203.5678\\-67\\-38.0998\\-205.5209\\-67\\-36.61515\\-207.474\\-67\\-36.48756\\-209.4271\\-67\\-36.75057\\-211.3803\\-67\\-38.23501\\-213.3334\\-67\\-39.33873\\-214.4201\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "153" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-178.2293\\-67\\-39.33873\\-177.4945\\-67\\-41.29185\\-176.9786\\-67\\-43.24498\\-175.6621\\-67\\-45.1981\\-174.9442\\-67\\-47.15123\\-173.2372\\-67\\-48.08054\\-172.3178\\-67\\-48.86863\\-170.3646\\-67\\-50.03561\\-168.4115\\-67\\-50.90887\\-166.4584\\-67\\-50.99089\\-162.5521\\-67\\-51.73477\\-160.599\\-67\\-53.0106\\-159.5004\\-67\\-54.96373\\-159.6801\\-67\\-56.67455\\-158.6459\\-67\\-55.9969\\-156.6928\\-67\\-54.96373\\-155.634\\-67\\-51.05748\\-155.5678\\-67\\-50.00813\\-154.7396\\-67\\-48.88055\\-152.7865\\-67\\-48.24146\\-150.8334\\-67\\-46.6474\\-148.8803\\-67\\-45.57513\\-146.9271\\-67\\-43.24498\\-144.4857\\-67\\-41.29185\\-143.5881\\-67\\-39.33873\\-142.2708\\-67\\-37.3856\\-141.5277\\-67\\-35.43248\\-140.3281\\-67\\-33.47935\\-140.3221\\-67\\-31.52623\\-140.6331\\-67\\-29.5731\\-141.9855\\-67\\-27.61998\\-142.2708\\-67\\-25.66685\\-143.2711\\-67\\-23.12139\\-146.9271\\-67\\-22.62394\\-148.8803\\-67\\-21.61199\\-150.8334\\-67\\-21.47878\\-152.7865\\-67\\-20.39213\\-154.7396\\-67\\-19.80748\\-155.2563\\-67\\-17.85435\\-155.8328\\-67\\-16.98136\\-156.6928\\-67\\-16.3178\\-158.6459\\-67\\-17.85435\\-159.5889\\-67\\-19.80748\\-159.0523\\-67\\-21.7606\\-159.8023\\-67\\-22.50625\\-160.599\\-67\\-23.3672\\-164.5053\\-67\\-24.40037\\-166.4584\\-67\\-25.53142\\-170.3646\\-67\\-26.64861\\-172.3178\\-67\\-29.5731\\-175.2997\\-67\\-31.52623\\-176.9711\\-67\\-33.47935\\-177.5278\\-67\\-35.43248\\-178.2437\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "154" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-31.52623\\-222.677\\-67\\-32.17556\\-221.1459\\-67\\-32.41527\\-219.1928\\-67\\-32.48144\\-217.2396\\-67\\-31.60332\\-215.2865\\-67\\-30.62365\\-213.3334\\-67\\-30.62818\\-211.3803\\-67\\-31.47364\\-209.4271\\-67\\-32.54763\\-207.474\\-67\\-32.24493\\-205.5209\\-67\\-31.52623\\-204.8062\\-67\\-29.5731\\-203.8304\\-67\\-27.73011\\-205.5209\\-67\\-27.61235\\-207.474\\-67\\-27.07376\\-209.4271\\-67\\-26.82652\\-211.3803\\-67\\-26.32018\\-213.3334\\-67\\-25.17857\\-215.2865\\-67\\-25.004\\-217.2396\\-67\\-25.66685\\-218.819\\-67\\-27.75086\\-221.1459\\-67\\-29.5731\\-222.7675\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "155" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "38.78627\\-210.4719\\-67\\37.05252\\-209.4271\\-67\\38.78627\\-207.3505\\-67\\39.5479\\-205.5209\\-67\\39.59183\\-203.5678\\-67\\40.57545\\-201.6146\\-67\\42.34147\\-199.6615\\-67\\48.5519\\-193.4048\\-67\\52.80467\\-187.9428\\-67\\53.62342\\-185.9896\\-67\\56.89453\\-182.0834\\-67\\57.45505\\-178.1771\\-67\\58.92458\\-176.224\\-67\\59.39807\\-174.2709\\-67\\61.00065\\-172.3178\\-67\\61.37712\\-170.3646\\-67\\64.1769\\-167.4536\\-67\\66.13003\\-165.5049\\-67\\68.08315\\-164.789\\-67\\70.03628\\-165.7116\\-67\\70.80782\\-166.4584\\-67\\72.28237\\-168.4115\\-67\\73.07716\\-170.3646\\-67\\73.61486\\-172.3178\\-67\\73.73082\\-174.2709\\-67\\74.7185\\-176.224\\-67\\75.57875\\-178.1771\\-67\\75.73406\\-180.1303\\-67\\76.70015\\-182.0834\\-67\\76.87222\\-184.0365\\-67\\76.29238\\-185.9896\\-67\\75.07949\\-187.9428\\-67\\74.38258\\-189.8959\\-67\\73.94253\\-190.3842\\-67\\71.27325\\-191.849\\-67\\68.08315\\-193.2098\\-67\\66.13003\\-194.4331\\-67\\64.1769\\-195.0991\\-67\\62.22377\\-195.8773\\-67\\60.27065\\-195.979\\-67\\58.31752\\-196.601\\-67\\56.3644\\-197.716\\-67\\54.41127\\-198.3506\\-67\\52.45815\\-199.3204\\-67\\46.11049\\-205.5209\\-67\\44.64565\\-206.8967\\-67\\42.69252\\-208.8809\\-67\\40.7394\\-210.3455\\-67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "156" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-136.995\\-197.4864\\-65\\-137.2558\\-195.7553\\-65\\-137.3706\\-193.8021\\-65\\-138.9481\\-193.2228\\-65\\-140.1579\\-191.849\\-65\\-138.9481\\-189.9037\\-65\\-136.995\\-190.7138\\-65\\-136.4479\\-191.849\\-65\\-136.7458\\-193.8021\\-65\\-136.5572\\-195.7553\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "157" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-131.1356\\-210.0249\\-65\\-133.0887\\-208.8885\\-65\\-135.0419\\-208.1378\\-65\\-137.5087\\-205.5209\\-65\\-138.4128\\-203.5678\\-65\\-138.9481\\-203.0053\\-65\\-139.8952\\-201.6146\\-65\\-139.8087\\-199.6615\\-65\\-138.9481\\-198.685\\-65\\-136.995\\-197.7481\\-65\\-135.8003\\-199.6615\\-65\\-134.1702\\-201.6146\\-65\\-132.7526\\-205.5209\\-65\\-131.8203\\-207.474\\-65\\-131.1356\\-208.5695\\-65\\-129.1825\\-209.3324\\-65\\-129.1825\\-209.5942\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "158" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-199.2377\\-65\\-124.521\\-197.7084\\-65\\-124.4706\\-195.7553\\-65\\-123.3231\\-194.7215\\-65\\-121.7619\\-195.7553\\-65\\-120.6426\\-197.7084\\-65\\-121.2922\\-199.6615\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "159" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-192.2359\\-65\\-115.5106\\-190.7634\\-65\\-117.4637\\-189.6484\\-65\\-121.37\\-189.5391\\-65\\-123.3231\\-188.723\\-65\\-125.2762\\-187.4291\\-65\\-127.2293\\-188.9525\\-65\\-129.1825\\-190.2261\\-65\\-129.8996\\-189.8959\\-65\\-130.2623\\-187.9428\\-65\\-129.7052\\-185.9896\\-65\\-127.2293\\-182.5447\\-65\\-125.2762\\-180.9743\\-65\\-123.3231\\-179.2833\\-65\\-121.37\\-177.8389\\-65\\-119.4168\\-177.0024\\-65\\-117.4637\\-176.517\\-65\\-115.5106\\-175.6075\\-65\\-113.5575\\-175.0337\\-65\\-111.6043\\-174.927\\-65\\-109.6512\\-175.9603\\-65\\-109.3855\\-176.224\\-65\\-108.6068\\-178.1771\\-65\\-108.8014\\-180.1303\\-65\\-109.1982\\-182.0834\\-65\\-110.1042\\-184.0365\\-65\\-110.5453\\-185.9896\\-65\\-110.5502\\-187.9428\\-65\\-110.8298\\-189.8959\\-65\\-111.6043\\-191.2397\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "160" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-208.0998\\-65\\-112.118\\-207.474\\-65\\-110.9349\\-205.5209\\-65\\-110.5918\\-203.5678\\-65\\-110.5882\\-201.6146\\-65\\-109.6512\\-199.5338\\-65\\-107.6981\\-200.234\\-65\\-106.707\\-201.6146\\-65\\-106.3835\\-203.5678\\-65\\-106.9621\\-205.5209\\-65\\-108.6606\\-207.474\\-65\\-109.6512\\-208.4841\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "59" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "161" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-214.1861\\-65\\-42.17027\\-213.3334\\-65\\-42.89845\\-211.3803\\-65\\-43.16421\\-209.4271\\-65\\-44.32954\\-207.474\\-65\\-48.06494\\-203.5678\\-65\\-49.59574\\-201.6146\\-65\\-50.5419\\-199.6615\\-65\\-51.05748\\-199.089\\-65\\-53.0106\\-198.5322\\-65\\-54.96373\\-197.2695\\-65\\-56.91685\\-196.4045\\-65\\-58.86998\\-195.991\\-65\\-60.8231\\-195.8773\\-65\\-62.77623\\-195.6332\\-65\\-66.68247\\-194.4295\\-65\\-68.6356\\-193.9765\\-65\\-70.58872\\-193.8543\\-65\\-72.54185\\-193.5904\\-65\\-74.49497\\-192.5998\\-65\\-77.21042\\-189.8959\\-65\\-77.89591\\-187.9428\\-65\\-77.90438\\-185.9896\\-65\\-78.14214\\-182.0834\\-65\\-78.14214\\-180.1303\\-65\\-77.88997\\-176.224\\-65\\-77.327\\-174.2709\\-65\\-76.41025\\-172.3178\\-65\\-76.24435\\-170.3646\\-65\\-75.52061\\-168.4115\\-65\\-74.49497\\-166.8535\\-65\\-74.10287\\-166.4584\\-65\\-72.54185\\-165.4677\\-65\\-70.58872\\-165.5147\\-65\\-69.57169\\-166.4584\\-65\\-63.7963\\-172.3178\\-65\\-62.50569\\-174.2709\\-65\\-61.76228\\-176.224\\-65\\-59.78056\\-178.1771\\-65\\-58.48304\\-180.1303\\-65\\-57.79107\\-182.0834\\-65\\-56.65776\\-184.0365\\-65\\-55.81591\\-185.9896\\-65\\-53.92886\\-187.9428\\-65\\-52.94402\\-189.8959\\-65\\-52.1772\\-191.849\\-65\\-51.05748\\-193.6769\\-65\\-49.10435\\-195.5131\\-65\\-47.15123\\-196.4248\\-65\\-45.1981\\-197.0591\\-65\\-43.24498\\-198.6138\\-65\\-38.28736\\-203.5678\\-65\\-36.58275\\-205.5209\\-65\\-35.40885\\-207.474\\-65\\-34.54149\\-209.4271\\-65\\-35.25163\\-211.3803\\-65\\-36.4379\\-213.3334\\-65\\-37.3856\\-214.3904\\-65\\-39.33873\\-214.8996\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "162" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-176.9589\\-65\\-41.29185\\-175.6243\\-65\\-43.24498\\-174.9788\\-65\\-45.1981\\-173.7012\\-65\\-47.15123\\-172.3101\\-65\\-49.68696\\-168.4115\\-65\\-50.36843\\-166.4584\\-65\\-50.89589\\-164.5053\\-65\\-51.13824\\-160.599\\-65\\-52.39147\\-158.6459\\-65\\-53.0106\\-158.0983\\-65\\-54.96373\\-159.1044\\-65\\-55.61196\\-158.6459\\-65\\-56.64448\\-156.6928\\-65\\-54.96373\\-155.2308\\-65\\-53.0106\\-155.1035\\-65\\-51.05748\\-154.2847\\-65\\-49.6131\\-152.7865\\-65\\-48.85686\\-150.8334\\-65\\-48.246\\-148.8803\\-65\\-47.15123\\-147.4842\\-65\\-45.1981\\-145.4102\\-65\\-41.29185\\-141.6411\\-65\\-40.63358\\-141.0678\\-65\\-39.33873\\-140.2432\\-65\\-37.3856\\-139.7242\\-65\\-33.47935\\-139.659\\-65\\-31.52623\\-140.0157\\-65\\-29.5731\\-140.2509\\-65\\-27.61998\\-140.3341\\-65\\-25.66685\\-141.3195\\-65\\-23.71373\\-143.2556\\-65\\-22.89769\\-144.974\\-65\\-22.51681\\-146.9271\\-65\\-21.13207\\-148.8803\\-65\\-20.86715\\-150.8334\\-65\\-20.85053\\-152.7865\\-65\\-19.80748\\-154.1636\\-65\\-17.85435\\-155.5008\\-65\\-16.71274\\-156.6928\\-65\\-16.32115\\-158.6459\\-65\\-17.85435\\-159.4012\\-65\\-19.80748\\-157.7135\\-65\\-20.82755\\-158.6459\\-65\\-21.7606\\-160.6571\\-65\\-22.54474\\-162.5521\\-65\\-22.96945\\-164.5053\\-65\\-23.59166\\-166.4584\\-65\\-24.69517\\-168.4115\\-65\\-25.38503\\-170.3646\\-65\\-26.59119\\-172.3178\\-65\\-29.5731\\-175.2475\\-65\\-31.52623\\-176.5058\\-65\\-33.47935\\-176.9906\\-65\\-35.43248\\-177.2006\\-65\\-37.3856\\-177.1961\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "163" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-225.3561\\-65\\-33.79158\\-225.0521\\-65\\-34.0205\\-223.099\\-65\\-31.56437\\-221.1459\\-65\\-29.5731\\-219.0097\\-65\\-28.76395\\-217.2396\\-65\\-28.64767\\-213.3334\\-65\\-28.65308\\-211.3803\\-65\\-29.1574\\-209.4271\\-65\\-30.40928\\-207.474\\-65\\-29.83408\\-205.5209\\-65\\-29.18989\\-205.5209\\-65\\-27.61998\\-206.9464\\-65\\-27.31601\\-207.474\\-65\\-25.66685\\-209.5023\\-65\\-24.87197\\-211.3803\\-65\\-24.7754\\-213.3334\\-65\\-24.23496\\-215.2865\\-65\\-23.51429\\-217.2396\\-65\\-24.40804\\-219.1928\\-65\\-24.91832\\-221.1459\\-65\\-25.66685\\-222.0342\\-65\\-27.36645\\-223.099\\-65\\-30.28925\\-225.0521\\-65\\-31.52623\\-225.7251\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "164" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-200.9465\\-65\\45.63759\\-199.6615\\-65\\46.59877\\-198.6\\-65\\48.77726\\-195.7553\\-65\\49.72486\\-193.8021\\-65\\50.90175\\-191.849\\-65\\51.754\\-189.8959\\-65\\53.30886\\-187.9428\\-65\\54.24968\\-185.9896\\-65\\55.31516\\-184.0365\\-65\\56.92633\\-182.0834\\-65\\57.39815\\-180.1303\\-65\\57.98986\\-178.1771\\-65\\59.15923\\-176.224\\-65\\59.86171\\-174.2709\\-65\\60.20406\\-172.3178\\-65\\61.25177\\-170.3646\\-65\\63.22274\\-168.4115\\-65\\64.85419\\-166.4584\\-65\\66.13003\\-165.312\\-65\\68.08315\\-164.6407\\-65\\70.03628\\-165.3749\\-65\\71.5737\\-166.4584\\-65\\73.07827\\-168.4115\\-65\\73.61486\\-170.3646\\-65\\73.95016\\-174.2709\\-65\\75.70865\\-178.1771\\-65\\75.73406\\-180.1303\\-65\\76.70177\\-182.0834\\-65\\76.8599\\-184.0365\\-65\\75.68394\\-185.9896\\-65\\73.12958\\-189.8959\\-65\\71.9894\\-191.0301\\-65\\70.03628\\-191.2871\\-65\\68.96621\\-191.849\\-65\\65.99915\\-193.8021\\-65\\62.22377\\-195.5436\\-65\\60.27065\\-195.6332\\-65\\56.3644\\-196.9339\\-65\\54.41127\\-197.0243\\-65\\52.45815\\-197.2708\\-65\\50.50502\\-198.8909\\-65\\49.44775\\-199.6615\\-65\\48.5519\\-200.5084\\-65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "165" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-136.995\\-194.1552\\-63\\-138.9481\\-193.2639\\-63\\-140.2798\\-191.849\\-63\\-138.9481\\-189.6964\\-63\\-136.995\\-190.7995\\-63\\-136.1376\\-191.849\\-63\\-136.5014\\-193.8021\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "166" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-209.953\\-63\\-135.0419\\-208.5647\\-63\\-136.4148\\-207.474\\-63\\-138.9481\\-204.825\\-63\\-139.873\\-203.5678\\-63\\-140.2909\\-201.6146\\-63\\-139.9626\\-199.6615\\-63\\-138.9481\\-198.5868\\-63\\-136.995\\-198.7759\\-63\\-135.0419\\-200.4841\\-63\\-133.8944\\-201.6146\\-63\\-132.6633\\-203.5678\\-63\\-132.575\\-205.5209\\-63\\-131.799\\-207.474\\-63\\-131.1356\\-208.1837\\-63\\-129.563\\-209.4271\\-63\\-131.1356\\-210.5018\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "167" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-198.7583\\-63\\-124.3633\\-197.7084\\-63\\-124.2078\\-195.7553\\-63\\-123.3231\\-194.8792\\-63\\-121.37\\-194.8143\\-63\\-120.4482\\-195.7553\\-63\\-120.4755\\-197.7084\\-63\\-121.37\\-198.7612\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "168" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-192.5405\\-63\\-115.5106\\-190.7634\\-63\\-117.4637\\-189.6484\\-63\\-119.4168\\-189.6254\\-63\\-121.37\\-189.1458\\-63\\-123.3231\\-187.4045\\-63\\-125.1276\\-185.9896\\-63\\-127.2293\\-184.1166\\-63\\-126.6176\\-182.0834\\-63\\-125.2762\\-181.0273\\-63\\-123.3231\\-180.6011\\-63\\-121.37\\-180.4558\\-63\\-119.4168\\-179.1293\\-63\\-118.7244\\-178.1771\\-63\\-117.4637\\-177.1575\\-63\\-115.5106\\-176.686\\-63\\-113.5575\\-175.8372\\-63\\-111.6043\\-176.1096\\-63\\-110.0182\\-178.1771\\-63\\-109.2448\\-180.1303\\-63\\-109.2742\\-182.0834\\-63\\-109.5026\\-185.9896\\-63\\-109.5026\\-187.9428\\-63\\-110.8668\\-191.849\\-63\\-111.6043\\-193.3396\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "169" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-208.8154\\-63\\-112.7265\\-207.474\\-63\\-112.1012\\-205.5209\\-63\\-111.8281\\-203.5678\\-63\\-113.5575\\-200.5985\\-63\\-113.9828\\-199.6615\\-63\\-114.5232\\-197.7084\\-63\\-113.5575\\-196.6485\\-63\\-112.2496\\-195.7553\\-63\\-111.6043\\-194.874\\-63\\-111.0308\\-195.7553\\-63\\-109.6512\\-196.4736\\-63\\-107.2542\\-199.6615\\-63\\-106.5506\\-201.6146\\-63\\-105.3386\\-203.5678\\-63\\-106.717\\-205.5209\\-63\\-107.6981\\-206.6021\\-63\\-109.6512\\-208.5304\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "170" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-194.3968\\-63\\-66.68247\\-193.6936\\-63\\-68.6356\\-193.5092\\-63\\-70.58872\\-193.0219\\-63\\-72.54185\\-192.7645\\-63\\-74.49497\\-191.3125\\-63\\-76.4481\\-189.2644\\-63\\-77.33311\\-187.9428\\-63\\-77.50824\\-185.9896\\-63\\-78.14214\\-184.0365\\-63\\-78.13069\\-176.224\\-63\\-77.55184\\-174.2709\\-63\\-77.31379\\-172.3178\\-63\\-77.30902\\-170.3646\\-63\\-76.95341\\-168.4115\\-63\\-75.3062\\-166.4584\\-63\\-74.49497\\-165.6879\\-63\\-72.54185\\-164.854\\-63\\-70.58872\\-165.2757\\-63\\-69.16235\\-166.4584\\-63\\-67.57723\\-168.4115\\-63\\-63.74297\\-172.3178\\-63\\-62.35085\\-174.2709\\-63\\-61.76228\\-176.224\\-63\\-59.8205\\-178.1771\\-63\\-58.77523\\-180.1303\\-63\\-57.83474\\-182.0834\\-63\\-56.99762\\-184.0365\\-63\\-55.85853\\-185.9896\\-63\\-54.17959\\-187.9428\\-63\\-52.94402\\-191.849\\-63\\-53.46467\\-193.8021\\-63\\-54.96373\\-195.203\\-63\\-56.91685\\-195.6198\\-63\\-60.8231\\-195.5078\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "171" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-214.1077\\-63\\-42.08626\\-213.3334\\-63\\-42.78301\\-211.3803\\-63\\-43.75325\\-209.4271\\-63\\-44.41962\\-207.474\\-63\\-46.03582\\-205.5209\\-63\\-47.4236\\-203.5678\\-63\\-47.96593\\-201.6146\\-63\\-46.98685\\-199.6615\\-63\\-45.1981\\-198.7254\\-63\\-43.24498\\-199.0195\\-63\\-41.29185\\-200.5626\\-63\\-39.33873\\-202.4944\\-63\\-34.40828\\-207.474\\-63\\-33.83847\\-209.4271\\-63\\-32.92382\\-211.3803\\-63\\-32.80878\\-213.3334\\-63\\-33.47935\\-213.943\\-63\\-37.3856\\-214.9071\\-63\\-39.33873\\-214.9095\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "172" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-176.4357\\-63\\-39.33873\\-175.5612\\-63\\-41.29185\\-174.9341\\-63\\-45.1981\\-172.3575\\-63\\-47.19093\\-170.3646\\-63\\-49.70145\\-166.4584\\-63\\-50.33714\\-164.5053\\-63\\-50.87048\\-162.5521\\-63\\-50.97671\\-160.599\\-63\\-51.67794\\-158.6459\\-63\\-53.0106\\-157.5027\\-63\\-54.96373\\-157.8656\\-63\\-56.81364\\-156.6928\\-63\\-55.37741\\-154.7396\\-63\\-54.96373\\-154.3626\\-63\\-51.05748\\-153.2377\\-63\\-50.59153\\-152.7865\\-63\\-49.53904\\-150.8334\\-63\\-48.77669\\-148.8803\\-63\\-47.89039\\-146.9271\\-63\\-45.1981\\-143.5726\\-63\\-42.6472\\-141.0678\\-63\\-39.90595\\-139.1146\\-63\\-39.33873\\-138.5764\\-63\\-37.3856\\-138.1852\\-63\\-33.47935\\-138.1719\\-63\\-31.52623\\-138.2371\\-63\\-29.5731\\-138.7129\\-63\\-27.61998\\-139.7844\\-63\\-25.66685\\-140.0955\\-63\\-24.0271\\-141.0678\\-63\\-23.71373\\-141.3859\\-63\\-21.7606\\-144.2775\\-63\\-21.22238\\-144.974\\-63\\-20.89019\\-146.9271\\-63\\-20.7045\\-148.8803\\-63\\-20.02067\\-150.8334\\-63\\-19.14778\\-152.7865\\-63\\-17.44067\\-154.7396\\-63\\-16.26065\\-156.6928\\-63\\-17.85435\\-157.9607\\-63\\-19.80748\\-157.3853\\-63\\-21.24393\\-158.6459\\-63\\-21.72304\\-162.5521\\-63\\-22.75936\\-164.5053\\-63\\-23.40976\\-166.4584\\-63\\-24.64072\\-168.4115\\-63\\-25.49246\\-170.3646\\-63\\-26.70816\\-172.3178\\-63\\-27.61998\\-173.2346\\-63\\-29.5731\\-174.8698\\-63\\-31.52623\\-175.5161\\-63\\-33.47935\\-176.3325\\-63\\-35.43248\\-176.4478\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "173" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-225.9411\\-63\\-34.43244\\-225.0521\\-63\\-33.7769\\-223.099\\-63\\-33.47935\\-222.8399\\-63\\-31.52623\\-222.5658\\-63\\-30.12439\\-223.099\\-63\\-29.5731\\-223.7826\\-63\\-29.17637\\-225.0521\\-63\\-29.5731\\-225.4643\\-63\\-31.52623\\-226.2046\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "174" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-25.66685\\-223.7275\\-63\\-26.86043\\-223.099\\-63\\-27.5238\\-221.1459\\-63\\-26.73169\\-219.1928\\-63\\-26.64866\\-217.2396\\-63\\-26.70689\\-211.3803\\-63\\-25.92125\\-209.4271\\-63\\-25.66685\\-209.2154\\-63\\-23.71373\\-210.5843\\-63\\-23.09228\\-211.3803\\-63\\-22.8773\\-213.3334\\-63\\-22.79019\\-219.1928\\-63\\-22.90291\\-221.1459\\-63\\-23.71373\\-222.3734\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "175" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-196.3028\\-63\\52.45815\\-195.1457\\-63\\51.44193\\-193.8021\\-63\\51.66188\\-191.849\\-63\\52.84509\\-189.8959\\-63\\53.66889\\-187.9428\\-63\\54.95749\\-185.9896\\-63\\55.57655\\-184.0365\\-63\\57.22897\\-180.1303\\-63\\57.992\\-178.1771\\-63\\59.20152\\-176.224\\-63\\60.00011\\-174.2709\\-63\\60.01156\\-172.3178\\-63\\61.18242\\-170.3646\\-63\\63.182\\-168.4115\\-63\\63.89507\\-166.4584\\-63\\64.1769\\-166.1606\\-63\\66.13003\\-164.7982\\-63\\68.08315\\-164.6273\\-63\\70.03628\\-164.7982\\-63\\71.9894\\-165.7364\\-63\\72.71919\\-166.4584\\-63\\73.5834\\-168.4115\\-63\\73.82046\\-170.3646\\-63\\74.48874\\-172.3178\\-63\\75.09058\\-176.224\\-63\\75.70865\\-178.1771\\-63\\75.72126\\-180.1303\\-63\\76.42578\\-182.0834\\-63\\76.46531\\-184.0365\\-63\\74.90414\\-185.9896\\-63\\73.23837\\-187.9428\\-63\\71.9894\\-189.7006\\-63\\70.03628\\-190.6475\\-63\\68.08315\\-191.039\\-63\\66.13003\\-193.0896\\-63\\64.1769\\-194.2933\\-63\\62.22377\\-194.7333\\-63\\60.27065\\-194.9806\\-63\\58.23476\\-195.7553\\-63\\56.3644\\-196.3616\\-63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "176" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-209.8563\\-61\\-136.995\\-208.1972\\-61\\-139.696\\-205.5209\\-61\\-140.4482\\-203.5678\\-61\\-141.5843\\-201.6146\\-61\\-141.4817\\-199.6615\\-61\\-140.9012\\-199.0204\\-61\\-138.9481\\-198.278\\-61\\-136.995\\-199.1403\\-61\\-136.4705\\-199.6615\\-61\\-133.7684\\-201.6146\\-61\\-133.0887\\-202.1861\\-61\\-131.9083\\-203.5678\\-61\\-131.8909\\-205.5209\\-61\\-131.3473\\-207.474\\-61\\-129.8577\\-209.4271\\-61\\-131.1356\\-210.7908\\-61\\-133.0887\\-210.5557\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "177" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-198.126\\-61\\-123.7223\\-197.7084\\-61\\-123.7346\\-195.7553\\-61\\-123.3231\\-195.3161\\-61\\-121.37\\-194.7133\\-61\\-119.713\\-195.7553\\-61\\-119.954\\-197.7084\\-61\\-121.37\\-198.6479\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "178" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-208.8274\\-61\\-113.0866\\-207.474\\-61\\-112.7475\\-205.5209\\-61\\-112.6849\\-203.5678\\-61\\-114.2471\\-201.6146\\-61\\-114.9712\\-199.6615\\-61\\-116.1857\\-197.7084\\-61\\-115.5106\\-196.794\\-61\\-114.4719\\-195.7553\\-61\\-113.5575\\-195.1837\\-61\\-112.2777\\-193.8021\\-61\\-113.5575\\-192.2333\\-61\\-115.5106\\-190.7634\\-61\\-117.4637\\-189.6368\\-61\\-119.4168\\-189.4895\\-61\\-121.37\\-188.4341\\-61\\-121.8404\\-187.9428\\-61\\-122.3095\\-185.9896\\-61\\-121.37\\-184.3779\\-61\\-121.034\\-184.0365\\-61\\-119.4168\\-182.9837\\-61\\-117.4637\\-182.4726\\-61\\-116.7931\\-182.0834\\-61\\-115.5106\\-179.743\\-61\\-113.5575\\-178.1998\\-61\\-111.6043\\-178.7567\\-61\\-110.5804\\-180.1303\\-61\\-109.9218\\-182.0834\\-61\\-109.5846\\-184.0365\\-61\\-109.3473\\-185.9896\\-61\\-109.2742\\-187.9428\\-61\\-109.3694\\-189.8959\\-61\\-110.1525\\-191.849\\-61\\-110.1829\\-193.8021\\-61\\-109.6512\\-194.2452\\-61\\-108.8358\\-195.7553\\-61\\-106.8551\\-199.6615\\-61\\-105.1988\\-203.5678\\-61\\-106.1916\\-205.5209\\-61\\-107.3992\\-207.474\\-61\\-107.6981\\-207.7771\\-61\\-109.6512\\-208.6851\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "179" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-193.8248\\-61\\-66.68247\\-193.0722\\-61\\-68.6356\\-192.7758\\-61\\-70.58872\\-192.3138\\-61\\-72.54185\\-191.1676\\-61\\-74.49497\\-189.5959\\-61\\-77.32656\\-185.9896\\-61\\-78.00449\\-184.0365\\-61\\-78.13069\\-182.0834\\-61\\-78.13069\\-174.2709\\-61\\-77.85191\\-170.3646\\-61\\-77.4639\\-168.4115\\-61\\-76.39297\\-166.4584\\-61\\-74.49497\\-165.3586\\-61\\-72.54185\\-164.6539\\-61\\-70.58872\\-164.7758\\-61\\-68.6356\\-165.8092\\-61\\-68.03587\\-166.4584\\-61\\-66.5604\\-168.4115\\-61\\-65.22359\\-170.3646\\-61\\-63.69448\\-172.3178\\-61\\-62.35085\\-174.2709\\-61\\-61.76711\\-176.224\\-61\\-59.99055\\-178.1771\\-61\\-59.62952\\-180.1303\\-61\\-58.0083\\-182.0834\\-61\\-57.63719\\-184.0365\\-61\\-55.88152\\-185.9896\\-61\\-54.96373\\-187.8958\\-61\\-53.88462\\-189.8959\\-61\\-53.68668\\-191.849\\-61\\-54.96373\\-193.9123\\-61\\-56.91685\\-194.6969\\-61\\-60.8231\\-194.6928\\-61\\-62.77623\\-194.3434\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "180" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-174.9132\\-61\\-43.23722\\-172.3178\\-61\\-45.34536\\-170.3646\\-61\\-47.15123\\-168.3884\\-61\\-49.67913\\-164.5053\\-61\\-50.87048\\-160.599\\-61\\-51.15222\\-158.6459\\-61\\-52.43921\\-156.6928\\-61\\-53.0106\\-156.3394\\-61\\-54.96373\\-157.7391\\-61\\-56.81017\\-156.6928\\-61\\-55.74394\\-154.7396\\-61\\-54.96373\\-153.9676\\-61\\-53.0106\\-153.3176\\-61\\-51.05748\\-152.114\\-61\\-49.9138\\-150.8334\\-61\\-48.99585\\-148.8803\\-61\\-48.36438\\-146.9271\\-61\\-47.48732\\-144.974\\-61\\-45.98239\\-143.0209\\-61\\-43.24498\\-140.2451\\-61\\-41.29185\\-138.5574\\-61\\-39.33873\\-138.0671\\-61\\-37.3856\\-137.831\\-61\\-35.43248\\-137.7077\\-61\\-33.47935\\-137.7077\\-61\\-31.52623\\-137.8278\\-61\\-29.5731\\-138.0481\\-61\\-27.61998\\-138.4549\\-61\\-25.66685\\-139.7144\\-61\\-23.71373\\-140.2418\\-61\\-22.87996\\-141.0678\\-61\\-21.16826\\-143.0209\\-61\\-20.69566\\-144.974\\-61\\-20.01918\\-146.9271\\-61\\-18.98535\\-150.8334\\-61\\-18.60369\\-152.7865\\-61\\-16.86397\\-154.7396\\-61\\-16.08685\\-156.6928\\-61\\-17.85435\\-157.6738\\-61\\-19.80748\\-157.4983\\-61\\-20.91919\\-158.6459\\-61\\-21.52488\\-160.599\\-61\\-21.52488\\-162.5521\\-61\\-22.72372\\-164.5053\\-61\\-23.39891\\-166.4584\\-61\\-24.64072\\-168.4115\\-61\\-26.24163\\-170.3646\\-61\\-27.61998\\-172.2943\\-61\\-29.5731\\-173.6974\\-61\\-31.52623\\-174.9132\\-61\\-33.47935\\-175.1986\\-61\\-37.3856\\-175.1897\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "181" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-215.5795\\-61\\-37.3856\\-214.8996\\-61\\-39.33873\\-214.4772\\-61\\-41.29185\\-212.9664\\-61\\-42.44474\\-211.3803\\-61\\-43.68887\\-209.4271\\-61\\-44.36167\\-207.474\\-61\\-45.39754\\-205.5209\\-61\\-46.0315\\-203.5678\\-61\\-45.25555\\-201.6146\\-61\\-43.24498\\-200.5646\\-61\\-41.29185\\-200.8343\\-61\\-39.33873\\-202.5956\\-61\\-38.38377\\-203.5678\\-61\\-37.3856\\-204.8568\\-61\\-34.73739\\-207.474\\-61\\-33.92324\\-209.4271\\-61\\-33.47935\\-209.9617\\-61\\-31.09154\\-213.3334\\-61\\-31.52623\\-213.9037\\-61\\-33.47935\\-215.4481\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "182" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-23.71373\\-221.5727\\-61\\-24.18216\\-221.1459\\-61\\-24.54181\\-219.1928\\-61\\-24.6098\\-217.2396\\-61\\-24.4793\\-215.2865\\-61\\-24.52407\\-213.3334\\-61\\-23.71373\\-211.4905\\-61\\-22.92027\\-213.3334\\-61\\-22.49781\\-215.2865\\-61\\-21.7606\\-216.0166\\-61\\-21.10447\\-217.2396\\-61\\-20.86286\\-219.1928\\-61\\-21.7606\\-220.7816\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "183" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-195.0069\\-61\\53.05957\\-193.8021\\-61\\52.45815\\-191.8149\\-61\\54.17555\\-187.9428\\-61\\55.23944\\-185.9896\\-61\\56.11691\\-184.0365\\-61\\56.25589\\-182.0834\\-61\\56.93406\\-180.1303\\-61\\57.48114\\-178.1771\\-61\\59.14207\\-176.224\\-61\\59.85471\\-174.2709\\-61\\60.01156\\-172.3178\\-61\\60.93021\\-170.3646\\-61\\62.80618\\-168.4115\\-61\\63.64677\\-166.4584\\-61\\64.1769\\-165.8927\\-61\\66.13003\\-164.6407\\-61\\70.03628\\-164.6407\\-61\\71.9894\\-165.3403\\-61\\73.15832\\-166.4584\\-61\\74.51983\\-170.3646\\-61\\75.06605\\-172.3178\\-61\\75.46765\\-174.2709\\-61\\75.58083\\-176.224\\-61\\75.81488\\-178.1771\\-61\\75.82906\\-182.0834\\-61\\75.69621\\-184.0365\\-61\\74.7208\\-185.9896\\-61\\71.9894\\-188.8699\\-61\\68.08315\\-190.7841\\-61\\66.13003\\-192.7209\\-61\\64.1769\\-193.6667\\-61\\62.22377\\-193.9376\\-61\\60.27065\\-194.3672\\-61\\56.3644\\-195.5683\\-61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "184" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-210.5507\\-59\\-136.5067\\-209.4271\\-59\\-138.5876\\-207.474\\-59\\-140.9012\\-205.1264\\-59\\-141.8737\\-203.5678\\-59\\-142.0104\\-201.6146\\-59\\-142.027\\-199.6615\\-59\\-141.6536\\-197.7084\\-59\\-140.9012\\-196.88\\-59\\-138.9481\\-197.3807\\-59\\-136.995\\-199.1112\\-59\\-135.0419\\-201.2681\\-59\\-133.0887\\-201.6522\\-59\\-131.1356\\-203.2313\\-59\\-130.8651\\-203.5678\\-59\\-130.8101\\-207.474\\-59\\-129.8893\\-209.4271\\-59\\-131.1356\\-211.1492\\-59\\-133.0887\\-210.9094\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "185" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-208.5122\\-59\\-112.6179\\-207.474\\-59\\-113.1045\\-205.5209\\-59\\-113.1805\\-203.5678\\-59\\-114.2911\\-201.6146\\-59\\-115.0759\\-199.6615\\-59\\-115.3362\\-197.7084\\-59\\-114.4863\\-195.7553\\-59\\-112.5298\\-193.8021\\-59\\-113.433\\-191.849\\-59\\-115.5106\\-190.7578\\-59\\-117.4637\\-189.5089\\-59\\-119.4168\\-188.8539\\-59\\-120.2364\\-187.9428\\-59\\-119.9936\\-185.9896\\-59\\-119.4168\\-185.5403\\-59\\-117.4637\\-185.1927\\-59\\-115.5106\\-184.9526\\-59\\-113.5575\\-183.9033\\-59\\-111.6043\\-183.9601\\-59\\-110.202\\-185.9896\\-59\\-109.3364\\-187.9428\\-59\\-109.2742\\-189.8959\\-59\\-109.3473\\-191.849\\-59\\-108.8611\\-193.8021\\-59\\-107.9799\\-195.7553\\-59\\-106.8631\\-197.7084\\-59\\-105.1753\\-201.6146\\-59\\-105.0956\\-203.5678\\-59\\-105.2313\\-205.5209\\-59\\-106.7826\\-207.474\\-59\\-107.6981\\-208.4214\\-59\\-109.6512\\-208.8809\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "186" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-193.9242\\-59\\-64.72935\\-193.4766\\-59\\-68.73325\\-191.849\\-59\\-72.54185\\-190.45\\-59\\-74.49497\\-188.8944\\-59\\-75.40043\\-187.9428\\-59\\-77.04784\\-185.9896\\-59\\-77.4935\\-184.0365\\-59\\-78.13069\\-182.0834\\-59\\-78.14214\\-176.224\\-59\\-79.05056\\-174.2709\\-59\\-79.00096\\-172.3178\\-59\\-78.13069\\-170.3646\\-59\\-77.95734\\-168.4115\\-59\\-77.23978\\-166.4584\\-59\\-76.4481\\-165.6628\\-59\\-74.49497\\-164.8518\\-59\\-72.54185\\-164.6407\\-59\\-70.58872\\-164.6273\\-59\\-68.6356\\-165.5319\\-59\\-65.85463\\-168.4115\\-59\\-64.05327\\-170.3646\\-59\\-63.37089\\-172.3178\\-59\\-62.26254\\-174.2709\\-59\\-61.74464\\-176.224\\-59\\-60.33482\\-178.1771\\-59\\-59.78285\\-180.1303\\-59\\-58.48304\\-182.0834\\-59\\-57.80425\\-184.0365\\-59\\-56.11235\\-185.9896\\-59\\-55.61985\\-187.9428\\-59\\-54.21898\\-189.8959\\-59\\-54.29005\\-191.849\\-59\\-54.96373\\-192.6463\\-59\\-56.91685\\-193.6801\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "187" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-174.393\\-59\\-39.33873\\-173.5712\\-59\\-43.24498\\-170.9994\\-59\\-44.00669\\-170.3646\\-59\\-45.79081\\-168.4115\\-59\\-47.18998\\-166.4584\\-59\\-49.64565\\-162.5521\\-59\\-50.30957\\-160.599\\-59\\-50.87048\\-158.6459\\-59\\-51.20861\\-156.6928\\-59\\-53.0106\\-155.8919\\-59\\-54.96373\\-157.7391\\-59\\-56.64103\\-156.6928\\-59\\-55.73209\\-154.7396\\-59\\-54.96373\\-153.9345\\-59\\-53.0106\\-153.1384\\-59\\-51.05748\\-151.692\\-59\\-50.36968\\-150.8334\\-59\\-49.10435\\-147.6386\\-59\\-47.89891\\-144.974\\-59\\-45.1981\\-141.4942\\-59\\-42.75381\\-139.1146\\-59\\-41.29185\\-138.0542\\-59\\-39.33873\\-137.804\\-59\\-37.3856\\-136.5122\\-59\\-35.43248\\-136.1602\\-59\\-33.47935\\-136.1602\\-59\\-31.52623\\-136.6472\\-59\\-29.5731\\-137.8757\\-59\\-27.61998\\-138.0357\\-59\\-25.66685\\-138.4346\\-59\\-23.71373\\-139.9702\\-59\\-22.46759\\-141.0678\\-59\\-20.87084\\-143.0209\\-59\\-19.80748\\-145.0895\\-59\\-19.00135\\-146.9271\\-59\\-18.6689\\-150.8334\\-59\\-17.21932\\-152.7865\\-59\\-16.66077\\-154.7396\\-59\\-16.37376\\-156.6928\\-59\\-17.85435\\-157.4137\\-59\\-19.80748\\-157.5443\\-59\\-20.77979\\-158.6459\\-59\\-21.38357\\-160.599\\-59\\-21.52488\\-162.5521\\-59\\-22.72372\\-164.5053\\-59\\-23.53934\\-166.4584\\-59\\-24.70992\\-168.4115\\-59\\-27.61998\\-171.4285\\-59\\-29.5731\\-172.9459\\-59\\-31.52623\\-173.6109\\-59\\-33.47935\\-174.393\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "188" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-215.557\\-59\\-37.3856\\-214.482\\-59\\-39.33873\\-213.7588\\-59\\-41.29185\\-212.2712\\-59\\-42.16484\\-211.3803\\-59\\-43.80222\\-207.474\\-59\\-44.28257\\-205.5209\\-59\\-44.20285\\-203.5678\\-59\\-43.24498\\-202.2593\\-59\\-41.29185\\-202.282\\-59\\-39.33873\\-204.9941\\-59\\-37.3856\\-207.0719\\-59\\-35.06138\\-209.4271\\-59\\-33.47935\\-211.3564\\-59\\-31.65593\\-213.3334\\-59\\-33.1634\\-215.2865\\-59\\-33.47935\\-215.5103\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "189" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-222.3654\\-59\\-19.80748\\-219.9523\\-59\\-21.21487\\-219.1928\\-59\\-21.7606\\-218.5301\\-59\\-22.40201\\-217.2396\\-59\\-21.7606\\-216.5663\\-59\\-20.3343\\-217.2396\\-59\\-19.80748\\-217.6656\\-59\\-19.0675\\-219.1928\\-59\\-17.85435\\-220.1495\\-59\\-16.87779\\-221.1459\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "190" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-11.99498\\-231.8804\\-59\\-14.91694\\-228.9584\\-59\\-12.96382\\-227.0053\\-59\\-12.96382\\-225.0521\\-59\\-11.99498\\-224.0833\\-59\\-10.04185\\-224.0833\\-59\\-7.119884\\-227.0053\\-59\\-9.073009\\-228.9584\\-59\\-9.073009\\-230.9115\\-59\\-10.04185\\-231.8804\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "191" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-194.655\\-59\\54.41127\\-193.7432\\-59\\53.42152\\-191.849\\-59\\53.72223\\-189.8959\\-59\\54.41127\\-188.0106\\-59\\56.25589\\-184.0365\\-59\\56.25589\\-182.0834\\-59\\56.51301\\-180.1303\\-59\\57.34096\\-178.1771\\-59\\58.90239\\-176.224\\-59\\59.3246\\-174.2709\\-59\\59.87392\\-172.3178\\-59\\60.20406\\-170.3646\\-59\\61.46481\\-168.4115\\-59\\62.22377\\-167.7098\\-59\\64.1769\\-165.5836\\-59\\66.13003\\-164.6407\\-59\\68.08315\\-164.4387\\-59\\70.03628\\-164.4825\\-59\\71.9894\\-164.8092\\-59\\73.596\\-166.4584\\-59\\74.45621\\-168.4115\\-59\\75.08105\\-170.3646\\-59\\75.58083\\-172.3178\\-59\\75.82906\\-176.224\\-59\\76.44977\\-178.1771\\-59\\76.44977\\-180.1303\\-59\\75.70865\\-182.0834\\-59\\75.0711\\-184.0365\\-59\\73.48476\\-185.9896\\-59\\72.35638\\-187.9428\\-59\\71.9894\\-188.3696\\-59\\69.67355\\-189.8959\\-59\\68.08315\\-190.7702\\-59\\66.13003\\-192.2864\\-59\\62.22377\\-193.5783\\-59\\60.27065\\-193.7794\\-59\\58.31752\\-194.3323\\-59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "192" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-133.0887\\-211.9092\\-57\\-135.0419\\-210.8749\\-57\\-136.995\\-210.166\\-57\\-138.9481\\-208.6972\\-57\\-140.9012\\-206.9713\\-57\\-141.9532\\-205.5209\\-57\\-142.2188\\-203.5678\\-57\\-143.4291\\-201.6146\\-57\\-143.8433\\-199.6615\\-57\\-143.2487\\-197.7084\\-57\\-141.9858\\-195.7553\\-57\\-141.8613\\-193.8021\\-57\\-141.5331\\-191.849\\-57\\-139.8363\\-189.8959\\-57\\-138.9481\\-189.0502\\-57\\-136.995\\-189.5729\\-57\\-136.7132\\-189.8959\\-57\\-137.7153\\-191.849\\-57\\-139.0207\\-193.8021\\-57\\-138.5238\\-195.7553\\-57\\-137.4297\\-197.7084\\-57\\-136.5696\\-199.6615\\-57\\-135.0419\\-201.4402\\-57\\-133.0887\\-201.5339\\-57\\-131.1356\\-202.4664\\-57\\-130.2049\\-203.5678\\-57\\-130.2901\\-205.5209\\-57\\-130.6917\\-207.474\\-57\\-129.8893\\-209.4271\\-57\\-129.3593\\-211.3803\\-57\\-131.1356\\-212.3873\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "193" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-207.8464\\-57\\-111.9404\\-207.474\\-57\\-112.6306\\-205.5209\\-57\\-113.1705\\-203.5678\\-57\\-114.0194\\-201.6146\\-57\\-115.2176\\-197.7084\\-57\\-114.7207\\-195.7553\\-57\\-113.5575\\-193.8568\\-57\\-114.0943\\-191.849\\-57\\-116.2735\\-189.8959\\-57\\-116.9594\\-187.9428\\-57\\-113.5575\\-185.6126\\-57\\-111.6043\\-186.1474\\-57\\-110.2068\\-187.9428\\-57\\-109.3473\\-189.8959\\-57\\-109.1982\\-191.849\\-57\\-108.4826\\-193.8021\\-57\\-106.8947\\-195.7553\\-57\\-105.9807\\-197.7084\\-57\\-104.8865\\-199.6615\\-57\\-104.6564\\-201.6146\\-57\\-104.6654\\-203.5678\\-57\\-104.941\\-205.5209\\-57\\-106.6504\\-207.474\\-57\\-107.6981\\-208.5217\\-57\\-109.6512\\-208.9475\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "194" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-66.68247\\-192.265\\-57\\-70.58872\\-190.7634\\-57\\-72.54185\\-189.7089\\-57\\-74.49497\\-188.8446\\-57\\-75.36571\\-187.9428\\-57\\-76.47081\\-185.9896\\-57\\-77.34399\\-184.0365\\-57\\-78.1194\\-182.0834\\-57\\-78.14214\\-176.224\\-57\\-79.20678\\-174.2709\\-57\\-79.16853\\-172.3178\\-57\\-78.14214\\-170.3646\\-57\\-78.1194\\-168.4115\\-57\\-77.57001\\-166.4584\\-57\\-76.4481\\-165.2931\\-57\\-74.49497\\-164.6539\\-57\\-70.58872\\-164.4387\\-57\\-68.6356\\-165.4673\\-57\\-64.72935\\-169.3261\\-57\\-63.77649\\-170.3646\\-57\\-62.50569\\-172.3178\\-57\\-61.47931\\-176.224\\-57\\-60.43616\\-178.1771\\-57\\-59.79536\\-180.1303\\-57\\-58.63425\\-182.0834\\-57\\-57.83081\\-184.0365\\-57\\-55.8323\\-187.9428\\-57\\-54.97136\\-189.8959\\-57\\-55.83376\\-191.849\\-57\\-56.91685\\-192.692\\-57\\-58.86998\\-193.0844\\-57\\-60.8231\\-193.5904\\-57\\-62.77623\\-193.0551\\-57\\-64.72935\\-192.7195\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "195" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-173.1018\\-57\\-39.08441\\-172.3178\\-57\\-43.24498\\-169.6426\\-57\\-46.21432\\-166.4584\\-57\\-47.65395\\-164.5053\\-57\\-48.46881\\-162.5521\\-57\\-49.65056\\-160.599\\-57\\-50.32877\\-158.6459\\-57\\-50.88309\\-156.6928\\-57\\-51.05748\\-156.4786\\-57\\-53.0106\\-155.855\\-57\\-54.96373\\-157.6985\\-57\\-55.98468\\-156.6928\\-57\\-55.47741\\-154.7396\\-57\\-53.0106\\-152.3706\\-57\\-51.05748\\-150.4149\\-57\\-49.85114\\-148.8803\\-57\\-47.96167\\-144.974\\-57\\-46.70733\\-143.0209\\-57\\-45.89492\\-141.0678\\-57\\-43.24498\\-138.3847\\-57\\-41.29185\\-137.8819\\-57\\-39.33873\\-136.6819\\-57\\-37.3856\\-136.0562\\-57\\-35.43248\\-135.9348\\-57\\-33.47935\\-135.9348\\-57\\-31.52623\\-136.2604\\-57\\-29.5731\\-137.6997\\-57\\-25.66685\\-138.0366\\-57\\-23.71373\\-138.6149\\-57\\-21.13207\\-141.0678\\-57\\-20.57646\\-143.0209\\-57\\-19.05372\\-144.974\\-57\\-18.70448\\-146.9271\\-57\\-18.23138\\-148.8803\\-57\\-17.94909\\-150.8334\\-57\\-16.88687\\-152.7865\\-57\\-16.23353\\-154.7396\\-57\\-17.85435\\-155.9745\\-57\\-19.34602\\-156.6928\\-57\\-19.80748\\-157.2049\\-57\\-20.43937\\-158.6459\\-57\\-20.89491\\-160.599\\-57\\-21.67983\\-162.5521\\-57\\-22.76392\\-164.5053\\-57\\-24.35952\\-166.4584\\-57\\-25.66685\\-168.2596\\-57\\-27.77652\\-170.3646\\-57\\-29.5731\\-171.7172\\-57\\-31.52623\\-172.806\\-57\\-33.47935\\-173.1794\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "196" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-11.99498\\-231.8881\\-57\\-12.97154\\-230.9115\\-57\\-12.95598\\-228.9584\\-57\\-11.00285\\-227.0053\\-57\\-11.00285\\-225.0521\\-57\\-12.97154\\-223.099\\-57\\-11.99498\\-222.1225\\-57\\-7.127726\\-227.0053\\-57\\-7.127726\\-228.9584\\-57\\-10.04185\\-231.8725\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "197" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-192.1346\\-57\\54.19957\\-191.849\\-57\\54.18748\\-189.8959\\-57\\54.98734\\-187.9428\\-57\\55.68832\\-185.9896\\-57\\56.25589\\-184.0365\\-57\\56.25589\\-182.0834\\-57\\57.0339\\-180.1303\\-57\\57.5925\\-178.1771\\-57\\58.94606\\-174.2709\\-57\\59.39807\\-172.3178\\-57\\60.02316\\-170.3646\\-57\\61.25656\\-168.4115\\-57\\64.1769\\-165.4953\\-57\\66.13003\\-164.4387\\-57\\68.08315\\-163.6944\\-57\\70.03628\\-163.8628\\-57\\71.9894\\-164.8308\\-57\\73.5857\\-166.4584\\-57\\74.67495\\-168.4115\\-57\\75.58083\\-170.3646\\-57\\75.70865\\-172.3178\\-57\\75.70865\\-174.2709\\-57\\76.39249\\-176.224\\-57\\76.67413\\-178.1771\\-57\\76.32102\\-180.1303\\-57\\75.69621\\-182.0834\\-57\\74.82825\\-184.0365\\-57\\72.92631\\-185.9896\\-57\\71.78996\\-187.9428\\-57\\70.03628\\-189.7473\\-57\\68.08315\\-190.8575\\-57\\66.13003\\-191.7405\\-57\\64.1769\\-192.2508\\-57\\62.22377\\-193.0542\\-57\\60.27065\\-193.6801\\-57\\56.3644\\-193.7945\\-57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "198" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-211.7721\\-55\\-136.995\\-210.6419\\-55\\-138.9481\\-210.4731\\-55\\-140.9012\\-208.9244\\-55\\-143.3514\\-205.5209\\-55\\-143.9109\\-203.5678\\-55\\-144.2455\\-199.6615\\-55\\-144.0126\\-197.7084\\-55\\-143.3855\\-195.7553\\-55\\-142.1279\\-193.8021\\-55\\-141.9487\\-191.849\\-55\\-140.9826\\-189.8959\\-55\\-138.9481\\-188.5815\\-55\\-136.995\\-189.4312\\-55\\-136.628\\-189.8959\\-55\\-137.4297\\-191.849\\-55\\-137.7392\\-193.8021\\-55\\-137.4833\\-195.7553\\-55\\-136.8595\\-197.7084\\-55\\-136.8206\\-199.6615\\-55\\-135.0419\\-201.3328\\-55\\-133.0887\\-201.3328\\-55\\-131.1356\\-202.1366\\-55\\-129.1443\\-203.5678\\-55\\-129.4182\\-205.5209\\-55\\-130.3496\\-207.474\\-55\\-129.8893\\-209.4271\\-55\\-128.2376\\-211.3803\\-55\\-129.1825\\-212.4937\\-55\\-131.1356\\-212.8365\\-55\\-133.0887\\-212.5855\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "199" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-109.6512\\-208.9475\\-55\\-111.3686\\-207.474\\-55\\-111.9509\\-205.5209\\-55\\-112.6709\\-203.5678\\-55\\-114.1099\\-201.6146\\-55\\-114.8138\\-199.6615\\-55\\-115.2288\\-197.7084\\-55\\-115.1436\\-195.7553\\-55\\-114.3043\\-193.8021\\-55\\-114.2643\\-191.849\\-55\\-114.6088\\-189.8959\\-55\\-113.5575\\-187.9701\\-55\\-111.6043\\-188.1116\\-55\\-109.6512\\-190.4975\\-55\\-107.7057\\-193.8021\\-55\\-106.4648\\-195.7553\\-55\\-104.8693\\-197.7084\\-55\\-103.2836\\-201.6146\\-55\\-103.348\\-203.5678\\-55\\-104.7596\\-205.5209\\-55\\-105.932\\-207.474\\-55\\-107.6981\\-208.7129\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "200" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-64.72935\\-191.8566\\-55\\-66.68247\\-191.7405\\-55\\-68.6356\\-191.1536\\-55\\-74.49497\\-188.8446\\-55\\-75.36571\\-187.9428\\-55\\-77.33002\\-184.0365\\-55\\-78.1194\\-182.0834\\-55\\-78.14214\\-176.224\\-55\\-79.00096\\-174.2709\\-55\\-78.94744\\-172.3178\\-55\\-78.33464\\-170.3646\\-55\\-78.26579\\-168.4115\\-55\\-77.85993\\-166.4584\\-55\\-76.4481\\-164.961\\-55\\-74.49497\\-164.6407\\-55\\-72.54185\\-163.8838\\-55\\-70.58872\\-163.7176\\-55\\-68.6356\\-165.1108\\-55\\-66.68247\\-166.1635\\-55\\-64.42538\\-168.4115\\-55\\-63.29897\\-170.3646\\-55\\-62.36028\\-172.3178\\-55\\-61.80431\\-174.2709\\-55\\-60.6114\\-176.224\\-55\\-60.44608\\-178.1771\\-55\\-59.82948\\-180.1303\\-55\\-58.83242\\-182.0834\\-55\\-58.02214\\-184.0365\\-55\\-57.6706\\-185.9896\\-55\\-55.94029\\-187.9428\\-55\\-55.7153\\-189.8959\\-55\\-56.91685\\-191.228\\-55\\-58.86998\\-192.4141\\-55\\-60.8231\\-193.0672\\-55\\-62.77623\\-192.7284\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "201" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-171.2701\\-55\\-39.33873\\-170.2398\\-55\\-41.29185\\-169.3176\\-55\\-43.24498\\-168.1295\\-55\\-45.1981\\-166.0771\\-55\\-46.39963\\-164.5053\\-55\\-48.1137\\-162.5521\\-55\\-49.10435\\-160.1422\\-55\\-50.33656\\-156.6928\\-55\\-51.05748\\-155.8731\\-55\\-53.0106\\-155.855\\-55\\-54.96373\\-157.5639\\-55\\-55.75813\\-156.6928\\-55\\-55.07223\\-154.7396\\-55\\-53.77135\\-152.7865\\-55\\-49.90144\\-148.8803\\-55\\-48.86863\\-146.9271\\-55\\-47.96753\\-144.974\\-55\\-46.8047\\-143.0209\\-55\\-46.0111\\-141.0678\\-55\\-43.24498\\-138.2742\\-55\\-41.29185\\-137.6997\\-55\\-39.33873\\-136.2556\\-55\\-37.3856\\-135.9287\\-55\\-33.47935\\-135.8645\\-55\\-31.52623\\-136.0033\\-55\\-29.5731\\-136.5712\\-55\\-27.61998\\-137.6997\\-55\\-25.66685\\-137.8757\\-55\\-23.71373\\-138.2636\\-55\\-20.91425\\-141.0678\\-55\\-19.96906\\-143.0209\\-55\\-18.90974\\-144.974\\-55\\-18.15831\\-146.9271\\-55\\-17.75961\\-148.8803\\-55\\-17.06633\\-150.8334\\-55\\-16.59027\\-152.7865\\-55\\-16.24263\\-154.7396\\-55\\-19.68438\\-156.6928\\-55\\-20.03127\\-158.6459\\-55\\-20.85379\\-160.599\\-55\\-22.49791\\-162.5521\\-55\\-23.0576\\-164.5053\\-55\\-24.7002\\-166.4584\\-55\\-27.61998\\-169.4426\\-55\\-29.5731\\-170.8355\\-55\\-33.47935\\-171.7261\\-55\\-35.43248\\-171.713\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "202" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-25.66685\\-222.1225\\-55\\-26.64341\\-221.1459\\-55\\-26.59939\\-217.2396\\-55\\-25.66685\\-216.3071\\-55\\-23.71373\\-216.3071\\-55\\-20.74001\\-219.1928\\-55\\-20.74001\\-221.1459\\-55\\-21.7606\\-222.1665\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "203" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-193.1212\\-55\\55.10583\\-191.849\\-55\\54.61071\\-189.8959\\-55\\55.29066\\-187.9428\\-55\\56.1406\\-185.9896\\-55\\56.37203\\-182.0834\\-55\\57.25096\\-180.1303\\-55\\58.02456\\-178.1771\\-55\\58.15593\\-176.224\\-55\\58.10582\\-174.2709\\-55\\59.18838\\-172.3178\\-55\\60.01156\\-170.3646\\-55\\61.16964\\-168.4115\\-55\\62.22377\\-166.9561\\-55\\64.1769\\-165.1041\\-55\\66.13003\\-163.6855\\-55\\68.08315\\-163.4792\\-55\\70.03628\\-163.7728\\-55\\73.06748\\-166.4584\\-55\\74.7248\\-168.4115\\-55\\75.68394\\-170.3646\\-55\\75.70865\\-172.3178\\-55\\75.84347\\-174.2709\\-55\\76.39249\\-176.224\\-55\\76.36649\\-178.1771\\-55\\75.81488\\-180.1303\\-55\\75.69621\\-182.0834\\-55\\74.79071\\-184.0365\\-55\\72.92245\\-185.9896\\-55\\71.9894\\-187.7348\\-55\\70.67695\\-189.8959\\-55\\70.03628\\-190.4707\\-55\\68.08315\\-191.2347\\-55\\66.13003\\-191.6373\\-55\\64.1769\\-191.2171\\-55\\60.27065\\-193.543\\-55\\58.31752\\-193.6936\\-55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "204" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-212.2074\\-53\\-136.995\\-211.1097\\-53\\-138.9481\\-211.0442\\-53\\-140.9012\\-210.745\\-53\\-142.0854\\-209.4271\\-53\\-143.3547\\-207.474\\-53\\-144.0995\\-205.5209\\-53\\-145.1816\\-203.5678\\-53\\-145.8219\\-201.6146\\-53\\-145.8672\\-199.6615\\-53\\-145.2313\\-197.7084\\-53\\-143.9711\\-195.7553\\-53\\-143.4674\\-193.8021\\-53\\-142.2258\\-191.849\\-53\\-141.6968\\-189.8959\\-53\\-140.9012\\-189.123\\-53\\-138.9481\\-188.0521\\-53\\-136.9142\\-189.8959\\-53\\-137.1447\\-193.8021\\-53\\-137.0325\\-195.7553\\-53\\-137.6545\\-197.7084\\-53\\-137.9715\\-199.6615\\-53\\-136.995\\-200.9616\\-53\\-135.0419\\-200.9085\\-53\\-133.0887\\-200.6605\\-53\\-131.1356\\-201.2935\\-53\\-129.1825\\-202.1144\\-53\\-128.0279\\-203.5678\\-53\\-128.4525\\-205.5209\\-53\\-130.1544\\-207.474\\-53\\-129.8316\\-209.4271\\-53\\-129.1825\\-210.0801\\-53\\-127.2293\\-210.9375\\-53\\-125.2762\\-210.9402\\-53\\-123.3231\\-210.6441\\-53\\-121.37\\-210.7017\\-53\\-120.6958\\-211.3803\\-53\\-121.37\\-212.0135\\-53\\-123.3231\\-212.4358\\-53\\-125.2762\\-212.3061\\-53\\-127.2293\\-212.3061\\-53\\-129.1825\\-212.8811\\-53\\-133.0887\\-212.9869\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "205" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-109.6512\\-208.9475\\-53\\-111.3806\\-207.474\\-53\\-111.6271\\-205.5209\\-53\\-112.5428\\-203.5678\\-53\\-113.5575\\-202.4956\\-53\\-114.6672\\-201.6146\\-53\\-116.0944\\-199.6615\\-53\\-115.5632\\-197.7084\\-53\\-115.503\\-195.7553\\-53\\-114.4487\\-193.8021\\-53\\-113.5575\\-191.3711\\-53\\-112.7871\\-189.8959\\-53\\-111.6043\\-189.311\\-53\\-109.6512\\-190.7088\\-53\\-107.6981\\-192.7965\\-53\\-105.745\\-195.1208\\-53\\-105.1141\\-195.7553\\-53\\-102.872\\-199.6615\\-53\\-102.7245\\-201.6146\\-53\\-102.9021\\-203.5678\\-53\\-104.9426\\-207.474\\-53\\-105.745\\-208.3641\\-53\\-107.6981\\-208.9052\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "206" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-192.2058\\-53\\-64.72935\\-191.6496\\-53\\-66.68247\\-191.6496\\-53\\-68.6356\\-191.2871\\-53\\-70.58872\\-190.6373\\-53\\-74.49497\\-188.8446\\-53\\-75.36571\\-187.9428\\-53\\-77.33002\\-184.0365\\-53\\-78.1194\\-182.0834\\-53\\-78.15374\\-176.224\\-53\\-78.26579\\-174.2709\\-53\\-78.25262\\-172.3178\\-53\\-79.1396\\-170.3646\\-53\\-79.02975\\-168.4115\\-53\\-77.45142\\-166.4584\\-53\\-76.4481\\-165.4411\\-53\\-72.54185\\-163.665\\-53\\-70.58872\\-163.3898\\-53\\-68.6356\\-163.7537\\-53\\-66.68247\\-165.5366\\-53\\-63.89027\\-168.4115\\-53\\-62.48326\\-170.3646\\-53\\-62.27091\\-172.3178\\-53\\-61.73804\\-174.2709\\-53\\-60.46628\\-176.224\\-53\\-60.45611\\-178.1771\\-53\\-59.65215\\-182.0834\\-53\\-58.53389\\-184.0365\\-53\\-57.98806\\-185.9896\\-53\\-57.23586\\-187.9428\\-53\\-56.19908\\-189.8959\\-53\\-56.91685\\-190.7403\\-53\\-58.86998\\-191.7543\\-53\\-60.8231\\-192.371\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "207" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-170.7806\\-53\\-37.3856\\-169.6648\\-53\\-39.33873\\-168.8998\\-53\\-41.29185\\-167.7045\\-53\\-43.07736\\-166.4584\\-53\\-45.1981\\-164.2936\\-53\\-47.15123\\-162.2086\\-53\\-48.34203\\-160.599\\-53\\-48.90491\\-158.6459\\-53\\-49.59263\\-156.6928\\-53\\-51.05748\\-155.3539\\-53\\-53.0106\\-155.8491\\-53\\-54.96373\\-157.2903\\-53\\-55.51415\\-156.6928\\-53\\-54.95477\\-154.7396\\-53\\-53.8034\\-152.7865\\-53\\-49.90144\\-148.8803\\-53\\-48.86863\\-146.9271\\-53\\-47.96753\\-144.974\\-53\\-46.8047\\-143.0209\\-53\\-46.0111\\-141.0678\\-53\\-43.24498\\-138.2702\\-53\\-41.29185\\-136.6617\\-53\\-39.33873\\-136.0139\\-53\\-37.3856\\-135.8577\\-53\\-31.52623\\-135.8974\\-53\\-29.5731\\-136.0192\\-53\\-27.61998\\-136.5559\\-53\\-25.66685\\-137.7156\\-53\\-23.71373\\-138.2011\\-53\\-20.86933\\-141.0678\\-53\\-19.64589\\-143.0209\\-53\\-18.85291\\-144.974\\-53\\-17.12565\\-148.8803\\-53\\-16.59027\\-150.8334\\-53\\-15.9091\\-152.7865\\-53\\-18.06577\\-154.7396\\-53\\-19.80748\\-156.8503\\-53\\-20.60268\\-158.6459\\-53\\-21.0464\\-160.599\\-53\\-22.77823\\-162.5521\\-53\\-23.71373\\-163.7438\\-53\\-25.66685\\-166.0102\\-53\\-28.16072\\-168.4115\\-53\\-29.5731\\-169.2493\\-53\\-31.52623\\-169.7077\\-53\\-33.47935\\-170.7806\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "208" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-23.71373\\-224.0756\\-53\\-26.57366\\-221.1459\\-53\\-23.71373\\-218.2162\\-53\\-19.80748\\-218.2162\\-53\\-16.80803\\-221.1459\\-53\\-16.80803\\-223.099\\-53\\-17.85435\\-224.1453\\-53\\-21.7606\\-224.1453\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "209" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-192.6763\\-53\\55.6949\\-191.849\\-53\\55.41756\\-189.8959\\-53\\55.70827\\-187.9428\\-53\\56.25589\\-185.9896\\-53\\56.38711\\-184.0365\\-53\\57.62789\\-180.1303\\-53\\58.15593\\-178.1771\\-53\\58.15593\\-176.224\\-53\\57.45399\\-174.2709\\-53\\57.55581\\-172.3178\\-53\\59.70627\\-170.3646\\-53\\60.74149\\-168.4115\\-53\\61.29929\\-166.4584\\-53\\62.22377\\-165.4679\\-53\\64.1769\\-163.7901\\-53\\66.13003\\-163.3757\\-53\\68.08315\\-163.5503\\-53\\70.03628\\-164.2462\\-53\\71.9894\\-165.7525\\-53\\74.67361\\-168.4115\\-53\\75.68394\\-170.3646\\-53\\75.82906\\-172.3178\\-53\\76.53417\\-174.2709\\-53\\76.62685\\-176.224\\-53\\75.94783\\-178.1771\\-53\\75.70865\\-180.1303\\-53\\75.69621\\-182.0834\\-53\\74.85429\\-184.0365\\-53\\73.3884\\-185.9896\\-53\\72.60182\\-187.9428\\-53\\71.0018\\-189.8959\\-53\\70.03628\\-190.8001\\-53\\68.08315\\-191.5235\\-53\\66.13003\\-191.6252\\-53\\64.1769\\-191.0073\\-53\\62.22377\\-190.96\\-53\\60.27065\\-193.0219\\-53\\58.31752\\-193.6667\\-53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "210" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-213.4621\\-51\\-136.995\\-212.6192\\-51\\-140.9012\\-212.5855\\-51\\-142.8544\\-210.9456\\-51\\-143.9466\\-209.4271\\-51\\-144.4405\\-207.474\\-51\\-145.8763\\-205.5209\\-51\\-146.0845\\-201.6146\\-51\\-146.0845\\-199.6615\\-51\\-145.6966\\-197.7084\\-51\\-144.186\\-195.7553\\-51\\-143.9711\\-193.8021\\-51\\-143.3656\\-191.849\\-51\\-140.9012\\-189.2783\\-51\\-138.9481\\-188.8579\\-51\\-138.1103\\-189.8959\\-51\\-137.9847\\-195.7553\\-51\\-138.0536\\-197.7084\\-51\\-139.2842\\-199.6615\\-51\\-138.3048\\-201.6146\\-51\\-136.995\\-202.3931\\-51\\-135.7056\\-201.6146\\-51\\-135.0419\\-200.9509\\-51\\-133.0887\\-200.1668\\-51\\-129.1825\\-200.6931\\-51\\-128.2108\\-201.6146\\-51\\-127.9027\\-203.5678\\-51\\-128.5331\\-205.5209\\-51\\-130.037\\-207.474\\-51\\-129.1825\\-209.2729\\-51\\-127.2293\\-210.1714\\-51\\-125.2762\\-210.2166\\-51\\-123.3231\\-209.898\\-51\\-121.37\\-209.1123\\-51\\-119.0275\\-211.3803\\-51\\-119.4168\\-211.8535\\-51\\-121.37\\-212.9973\\-51\\-123.3231\\-213.1339\\-51\\-131.1356\\-213.198\\-51\\-133.0887\\-214.0516\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "211" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-208.052\\-51\\-112.1131\\-207.474\\-51\\-112.6101\\-205.5209\\-51\\-113.6607\\-203.5678\\-51\\-115.5106\\-202.5954\\-51\\-116.549\\-201.6146\\-51\\-116.6635\\-199.6615\\-51\\-116.5232\\-195.7553\\-51\\-115.5106\\-194.3557\\-51\\-113.5575\\-192.8479\\-51\\-111.6043\\-190.7035\\-51\\-109.6512\\-190.7993\\-51\\-108.4898\\-191.849\\-51\\-105.745\\-194.529\\-51\\-103.7918\\-196.5691\\-51\\-102.9171\\-197.7084\\-51\\-101.404\\-201.6146\\-51\\-102.2257\\-203.5678\\-51\\-102.8901\\-205.5209\\-51\\-105.745\\-208.4792\\-51\\-107.6981\\-208.9652\\-51\\-109.6512\\-209.0806\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "212" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-191.8566\\-51\\-62.77623\\-191.7136\\-51\\-68.6356\\-191.5785\\-51\\-70.58872\\-191.2276\\-51\\-72.54185\\-190.5129\\-51\\-74.49497\\-188.8896\\-51\\-75.45644\\-187.9428\\-51\\-76.59671\\-185.9896\\-51\\-78.1194\\-182.0834\\-51\\-78.14214\\-180.1303\\-51\\-78.42393\\-176.224\\-51\\-78.14214\\-172.3178\\-51\\-79.26781\\-170.3646\\-51\\-79.18523\\-168.4115\\-51\\-76.4481\\-165.6338\\-51\\-74.49497\\-163.9279\\-51\\-70.58872\\-162.909\\-51\\-68.6356\\-163.3583\\-51\\-66.68247\\-164.0893\\-51\\-66.26395\\-164.5053\\-51\\-65.10349\\-166.4584\\-51\\-64.72935\\-166.905\\-51\\-62.77623\\-169.908\\-51\\-62.3795\\-170.3646\\-51\\-61.94886\\-172.3178\\-51\\-61.33678\\-174.2709\\-51\\-60.46628\\-176.224\\-51\\-60.46628\\-178.1771\\-51\\-60.36113\\-180.1303\\-51\\-59.79667\\-182.0834\\-51\\-58.67054\\-184.0365\\-51\\-58.54446\\-185.9896\\-51\\-57.81436\\-187.9428\\-51\\-56.91685\\-189.9428\\-51\\-58.86998\\-191.7968\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "213" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-169.2139\\-51\\-37.3856\\-168.0648\\-51\\-39.33873\\-167.3146\\-51\\-41.29185\\-166.9552\\-51\\-43.24498\\-165.5245\\-51\\-46.20753\\-162.5521\\-51\\-47.51822\\-160.599\\-51\\-48.3465\\-158.6459\\-51\\-48.79212\\-156.6928\\-51\\-49.10435\\-155.9403\\-51\\-50.15067\\-154.7396\\-51\\-51.05748\\-154.3353\\-51\\-53.0106\\-155.8833\\-51\\-54.76361\\-154.7396\\-51\\-53.75236\\-152.7865\\-51\\-49.90144\\-148.8803\\-51\\-48.77669\\-146.9271\\-51\\-47.90443\\-144.974\\-51\\-46.8047\\-143.0209\\-51\\-46.0111\\-141.0678\\-51\\-43.24498\\-138.1816\\-51\\-41.29185\\-136.2768\\-51\\-39.33873\\-135.7466\\-51\\-37.3856\\-135.6614\\-51\\-31.52623\\-135.6614\\-51\\-27.61998\\-136.0139\\-51\\-25.66685\\-136.5932\\-51\\-23.71373\\-138.0176\\-51\\-21.7606\\-138.8197\\-51\\-21.46763\\-139.1146\\-51\\-20.54351\\-141.0678\\-51\\-19.0253\\-143.0209\\-51\\-18.55331\\-144.974\\-51\\-17.94909\\-146.9271\\-51\\-16.94127\\-148.8803\\-51\\-15.23051\\-150.8334\\-51\\-14.79014\\-152.7865\\-51\\-15.90123\\-154.1915\\-51\\-17.85435\\-153.4819\\-51\\-19.55999\\-154.7396\\-51\\-19.87406\\-156.6928\\-51\\-20.78404\\-158.6459\\-51\\-22.47309\\-160.599\\-51\\-23.71373\\-162.2201\\-51\\-28.10038\\-166.4584\\-51\\-29.5731\\-167.3449\\-51\\-31.52623\\-167.9436\\-51\\-32.06964\\-168.4115\\-51\\-33.47935\\-169.2245\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "5" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "214" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-27.61998\\-229.8381\\-51\\-28.49972\\-228.9584\\-51\\-28.49972\\-225.0521\\-51\\-27.61998\\-224.1724\\-51\\-24.7871\\-227.0053\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "215" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-19.80748\\-227.9818\\-51\\-24.69029\\-223.099\\-51\\-24.59347\\-219.1928\\-51\\-23.71373\\-218.313\\-51\\-19.80748\\-218.2162\\-51\\-17.85435\\-220.1693\\-51\\-15.90123\\-220.1693\\-51\\-12.87472\\-223.099\\-51\\-12.87472\\-225.0521\\-51\\-15.90123\\-228.0786\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "216" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.1774\\-191.849\\-51\\56.08257\\-189.8959\\-51\\56.28363\\-185.9896\\-51\\57.00687\\-184.0365\\-51\\58.05844\\-180.1303\\-51\\58.15593\\-176.224\\-51\\57.13308\\-172.3178\\-51\\57.65618\\-170.3646\\-51\\59.43569\\-168.4115\\-51\\60.83258\\-166.4584\\-51\\61.63674\\-164.5053\\-51\\62.22377\\-163.9279\\-51\\64.1769\\-163.3614\\-51\\66.13003\\-163.0434\\-51\\70.03628\\-165.8811\\-51\\71.9894\\-167.241\\-51\\73.94253\\-168.2121\\-51\\75.55913\\-170.3646\\-51\\76.4794\\-172.3178\\-51\\77.08388\\-174.2709\\-51\\77.07806\\-176.224\\-51\\76.59247\\-178.1771\\-51\\75.84347\\-180.1303\\-51\\75.81488\\-182.0834\\-51\\75.33372\\-184.0365\\-51\\74.49974\\-185.9896\\-51\\72.21037\\-189.8959\\-51\\70.03628\\-191.2793\\-51\\68.08315\\-191.6496\\-51\\66.13003\\-191.6133\\-51\\64.1769\\-191.0099\\-51\\62.22377\\-190.9005\\-51\\60.27065\\-192.8404\\-51\\58.31752\\-193.7945\\-51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "217" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-140.9012\\-214.4141\\-49\\-142.4306\\-213.3334\\-49\\-144.0143\\-211.3803\\-49\\-145.144\\-209.4271\\-49\\-145.9674\\-207.474\\-49\\-146.0911\\-205.5209\\-49\\-146.1181\\-199.6615\\-49\\-146.0105\\-197.7084\\-49\\-145.3449\\-195.7553\\-49\\-144.0933\\-193.8021\\-49\\-143.2545\\-191.849\\-49\\-142.8544\\-191.482\\-49\\-140.9012\\-191.543\\-49\\-140.5847\\-191.849\\-49\\-139.3545\\-195.7553\\-49\\-138.3062\\-197.7084\\-49\\-136.995\\-199.5038\\-49\\-135.0419\\-198.5107\\-49\\-133.0887\\-198.7993\\-49\\-131.1356\\-199.8231\\-49\\-129.1825\\-200.5269\\-49\\-128.0783\\-201.6146\\-49\\-128.052\\-203.5678\\-49\\-129.0701\\-207.474\\-49\\-127.2293\\-208.9185\\-49\\-123.3231\\-209.1342\\-49\\-121.37\\-209.1566\\-49\\-119.4168\\-210.3402\\-49\\-118.3663\\-211.3803\\-49\\-119.4168\\-212.8451\\-49\\-121.37\\-214.1057\\-49\\-123.3231\\-214.4616\\-49\\-131.1356\\-214.472\\-49\\-133.0887\\-214.7016\\-49\\-135.0419\\-214.6372\\-49\\-136.995\\-214.4375\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "218" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-209.451\\-49\\-112.8397\\-207.474\\-49\\-113.2645\\-205.5209\\-49\\-114.909\\-203.5678\\-49\\-115.5106\\-203.1093\\-49\\-116.9275\\-201.6146\\-49\\-117.9939\\-199.6615\\-49\\-118.3699\\-197.7084\\-49\\-118.0019\\-195.7553\\-49\\-117.4637\\-195.1914\\-49\\-115.3938\\-193.8021\\-49\\-113.5575\\-192.9176\\-49\\-111.6043\\-191.4051\\-49\\-109.6512\\-191.2793\\-49\\-108.1864\\-191.849\\-49\\-105.745\\-193.1353\\-49\\-103.1083\\-195.7553\\-49\\-101.8387\\-198.1536\\-49\\-101.2594\\-199.6615\\-49\\-100.8795\\-201.6146\\-49\\-100.8792\\-203.5678\\-49\\-102.1748\\-205.5209\\-49\\-105.745\\-208.5122\\-49\\-107.6981\\-209.091\\-49\\-109.6512\\-210.1992\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "219" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-60.8231\\-192.5511\\-49\\-62.77623\\-191.7543\\-49\\-64.72935\\-191.6496\\-49\\-68.6356\\-191.6496\\-49\\-70.58872\\-191.5235\\-49\\-72.54185\\-190.8153\\-49\\-74.49497\\-189.3906\\-49\\-76.4481\\-188.42\\-49\\-76.89199\\-187.9428\\-49\\-77.51467\\-185.9896\\-49\\-77.75189\\-184.0365\\-49\\-78.33464\\-182.0834\\-49\\-78.27915\\-180.1303\\-49\\-79.11543\\-178.1771\\-49\\-79.38596\\-176.224\\-49\\-79.1409\\-174.2709\\-49\\-78.40122\\-172.5335\\-49\\-78.40122\\-172.1393\\-49\\-79.27597\\-170.3646\\-49\\-79.17394\\-168.4115\\-49\\-76.4481\\-165.6577\\-49\\-74.49497\\-164.1383\\-49\\-70.58872\\-162.834\\-49\\-68.6356\\-162.7759\\-49\\-66.68247\\-163.5287\\-49\\-65.77196\\-164.5053\\-49\\-64.40383\\-166.4584\\-49\\-63.74791\\-168.4115\\-49\\-62.28213\\-170.3646\\-49\\-61.76648\\-172.3178\\-49\\-60.56401\\-174.2709\\-49\\-60.46628\\-176.224\\-49\\-60.46628\\-178.1771\\-49\\-60.36113\\-180.1303\\-49\\-59.76978\\-182.0834\\-49\\-58.67054\\-184.0365\\-49\\-58.65827\\-185.9896\\-49\\-58.10835\\-187.9428\\-49\\-57.69136\\-189.8959\\-49\\-58.05433\\-191.849\\-49\\-58.86998\\-192.574\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "220" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-167.3151\\-49\\-37.3856\\-166.0563\\-49\\-39.33873\\-165.4334\\-49\\-41.29185\\-165.3846\\-49\\-42.62292\\-164.5053\\-49\\-45.1981\\-161.9878\\-49\\-46.34792\\-160.599\\-49\\-47.41031\\-158.6459\\-49\\-47.80398\\-156.6928\\-49\\-48.38117\\-154.7396\\-49\\-49.10435\\-153.9337\\-49\\-51.05748\\-154.4191\\-49\\-53.0106\\-156.5533\\-49\\-54.07902\\-154.7396\\-49\\-53.37759\\-152.7865\\-49\\-51.83551\\-150.8334\\-49\\-49.8888\\-148.8803\\-49\\-48.25538\\-146.9271\\-49\\-47.32561\\-144.974\\-49\\-46.8047\\-143.0209\\-49\\-46.07939\\-141.0678\\-49\\-44.56957\\-139.1146\\-49\\-43.25311\\-137.1615\\-49\\-41.2841\\-135.2084\\-49\\-39.33873\\-134.0736\\-49\\-35.43248\\-134.009\\-49\\-31.52623\\-134.1152\\-49\\-29.5731\\-134.6349\\-49\\-27.61998\\-135.8227\\-49\\-25.66685\\-136.2821\\-49\\-23.71373\\-137.7686\\-49\\-21.7606\\-138.2191\\-49\\-20.87322\\-139.1146\\-49\\-19.74089\\-141.0678\\-49\\-18.09007\\-144.974\\-49\\-17.90653\\-146.9271\\-49\\-16.60252\\-148.8803\\-49\\-15.90123\\-149.4576\\-49\\-14.63715\\-150.8334\\-49\\-14.44017\\-152.7865\\-49\\-15.90123\\-154.548\\-49\\-17.85435\\-153.205\\-49\\-19.55828\\-154.7396\\-49\\-20.60648\\-156.6928\\-49\\-20.9933\\-158.6459\\-49\\-23.71373\\-161.6262\\-49\\-25.66685\\-163.3074\\-49\\-27.61998\\-164.1438\\-49\\-29.5731\\-165.4776\\-49\\-31.52623\\-165.9884\\-49\\-33.47935\\-167.3338\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "221" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-230.0652\\-49\\-19.80748\\-228.112\\-49\\-20.78404\\-227.0053\\-49\\-24.69029\\-223.099\\-49\\-24.69029\\-221.1459\\-49\\-21.7606\\-218.3464\\-49\\-19.80748\\-218.3464\\-49\\-17.85435\\-220.1693\\-49\\-15.90123\\-220.1693\\-49\\-13.9481\\-222.1225\\-49\\-11.99498\\-222.1225\\-49\\-11.01841\\-223.099\\-49\\-10.88821\\-225.0521\\-49\\-15.90123\\-230.0652\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "222" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-233.2251\\-49\\18.75305\\-232.8646\\-49\\18.07058\\-230.9115\\-49\\17.81223\\-227.0053\\-49\\19.25502\\-226.0536\\-49\\20.80803\\-227.0053\\-49\\21.60002\\-228.9584\\-49\\20.3627\\-230.9115\\-49\\19.63595\\-232.8646\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "223" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.31752\\-194.5622\\-49\\57.41286\\-193.8021\\-49\\56.25589\\-191.849\\-49\\56.25589\\-187.9428\\-49\\56.40196\\-185.9896\\-49\\58.07004\\-182.0834\\-49\\58.15593\\-180.1303\\-49\\58.15593\\-176.224\\-49\\58.0818\\-174.2709\\-49\\57.61577\\-172.3178\\-49\\57.72518\\-170.3646\\-49\\58.87164\\-168.4115\\-49\\59.42592\\-166.4584\\-49\\61.12089\\-164.5053\\-49\\62.22377\\-163.5579\\-49\\64.1769\\-162.8987\\-49\\66.13003\\-163.83\\-49\\66.76192\\-164.5053\\-49\\66.96124\\-166.4584\\-49\\67.93011\\-168.4115\\-49\\70.03628\\-170.3262\\-49\\71.9894\\-170.2545\\-49\\73.94253\\-169.7119\\-49\\75.89565\\-171.4604\\-49\\76.67176\\-172.3178\\-49\\77.55581\\-174.2709\\-49\\77.55581\\-176.224\\-49\\77.17546\\-178.1771\\-49\\76.64561\\-180.1303\\-49\\76.49274\\-184.0365\\-49\\75.34943\\-185.9896\\-49\\74.58279\\-187.9428\\-49\\73.43426\\-189.8959\\-49\\71.9894\\-191.3754\\-49\\70.03628\\-191.7136\\-49\\66.13003\\-191.6373\\-49\\64.1769\\-191.3522\\-49\\62.22377\\-192.0607\\-49\\60.27065\\-194.0016\\-49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "224" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-142.8544\\-213.9684\\-47\\-143.5072\\-213.3334\\-47\\-145.1064\\-211.3803\\-47\\-145.9692\\-209.4271\\-47\\-146.2144\\-205.5209\\-47\\-146.2305\\-203.5678\\-47\\-146.1181\\-201.6146\\-47\\-146.0977\\-197.7084\\-47\\-145.5835\\-195.7553\\-47\\-142.8544\\-192.5765\\-47\\-140.9012\\-194.3389\\-47\\-139.7873\\-195.7553\\-47\\-138.9481\\-196.6263\\-47\\-136.995\\-198.3187\\-47\\-135.0419\\-198.4646\\-47\\-129.1825\\-200.4978\\-47\\-128.1327\\-201.6146\\-47\\-127.3648\\-203.5678\\-47\\-127.6337\\-205.5209\\-47\\-126.4914\\-207.474\\-47\\-125.2762\\-208.4924\\-47\\-123.3231\\-209.9583\\-47\\-121.37\\-210.5641\\-47\\-119.4168\\-210.6977\\-47\\-117.4637\\-210.7174\\-47\\-116.4236\\-211.3803\\-47\\-116.2162\\-213.3334\\-47\\-117.4637\\-214.3965\\-47\\-119.4168\\-214.5451\\-47\\-121.37\\-214.8996\\-47\\-123.3231\\-214.9935\\-47\\-125.2762\\-214.9095\\-47\\-131.1356\\-214.9195\\-47\\-133.0887\\-215.0995\\-47\\-135.0419\\-215.1644\\-47\\-136.995\\-214.9935\\-47\\-140.9012\\-214.8996\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "225" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-210.7452\\-47\\-112.9906\\-209.4271\\-47\\-113.358\\-207.474\\-47\\-114.0014\\-205.5209\\-47\\-115.0194\\-203.5678\\-47\\-116.4782\\-201.6146\\-47\\-118.2196\\-199.6615\\-47\\-118.4106\\-197.7084\\-47\\-117.7567\\-195.7553\\-47\\-115.4994\\-193.8021\\-47\\-113.5575\\-192.9268\\-47\\-111.6043\\-191.6496\\-47\\-109.6512\\-191.5899\\-47\\-107.6981\\-191.6874\\-47\\-105.745\\-192.7222\\-47\\-102.5953\\-195.7553\\-47\\-100.8938\\-197.7084\\-47\\-100.5909\\-199.6615\\-47\\-100.1447\\-201.6146\\-47\\-100.3593\\-203.5678\\-47\\-100.9313\\-205.5209\\-47\\-103.7918\\-208.2445\\-47\\-105.745\\-208.7511\\-47\\-107.6981\\-210.1827\\-47\\-109.6512\\-210.7073\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "226" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-76.4481\\-192.0105\\-47\\-76.62959\\-191.849\\-47\\-77.47892\\-189.8959\\-47\\-78.40122\\-188.4465\\-47\\-78.97308\\-187.9428\\-47\\-80.34634\\-185.9896\\-47\\-79.50335\\-184.0365\\-47\\-79.51012\\-182.0834\\-47\\-79.24345\\-180.1303\\-47\\-79.29966\\-178.1771\\-47\\-79.79242\\-176.224\\-47\\-79.10923\\-172.3178\\-47\\-78.62502\\-168.4115\\-47\\-77.20924\\-166.4584\\-47\\-76.4481\\-165.6972\\-47\\-74.33746\\-164.5053\\-47\\-72.54185\\-163.6985\\-47\\-70.58872\\-162.9733\\-47\\-68.6356\\-161.837\\-47\\-66.68247\\-161.5712\\-47\\-65.4269\\-162.5521\\-47\\-64.96671\\-164.5053\\-47\\-64.2293\\-166.4584\\-47\\-63.13203\\-168.4115\\-47\\-62.77623\\-168.7237\\-47\\-61.64907\\-170.3646\\-47\\-61.23204\\-172.3178\\-47\\-60.46628\\-174.2709\\-47\\-60.44608\\-178.1771\\-47\\-59.43191\\-182.0834\\-47\\-58.65827\\-184.0365\\-47\\-58.65827\\-185.9896\\-47\\-58.55516\\-187.9428\\-47\\-58.1184\\-189.8959\\-47\\-58.21041\\-191.849\\-47\\-58.86998\\-192.5857\\-47\\-60.8231\\-193.1529\\-47\\-62.77623\\-192.3284\\-47\\-64.72935\\-191.6496\\-47\\-68.6356\\-191.9041\\-47\\-70.58872\\-191.7682\\-47\\-72.54185\\-191.3933\\-47\\-74.49497\\-191.2408\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "227" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-165.0415\\-47\\-39.33873\\-163.7946\\-47\\-41.29185\\-163.4651\\-47\\-42.71424\\-162.5521\\-47\\-44.69606\\-160.599\\-47\\-45.86153\\-158.6459\\-47\\-46.47791\\-156.6928\\-47\\-47.53309\\-154.7396\\-47\\-49.10435\\-153.3854\\-47\\-51.03441\\-154.7396\\-47\\-52.46077\\-156.6928\\-47\\-53.0106\\-157.0992\\-47\\-53.4917\\-156.6928\\-47\\-53.87811\\-154.7396\\-47\\-53.04816\\-152.7865\\-47\\-51.83551\\-150.8334\\-47\\-49.88238\\-148.8803\\-47\\-48.08731\\-146.9271\\-47\\-47.02916\\-144.974\\-47\\-46.83641\\-143.0209\\-47\\-46.53362\\-141.0678\\-47\\-45.73436\\-139.1146\\-47\\-43.24498\\-135.3735\\-47\\-41.29185\\-133.955\\-47\\-39.33873\\-132.8108\\-47\\-37.3856\\-132.2275\\-47\\-35.43248\\-132.2096\\-47\\-33.47935\\-132.7887\\-47\\-31.52623\\-133.6992\\-47\\-29.5731\\-133.9317\\-47\\-27.61998\\-134.6122\\-47\\-25.66685\\-135.8403\\-47\\-23.71373\\-136.4476\\-47\\-21.7606\\-137.9268\\-47\\-20.40307\\-139.1146\\-47\\-18.9605\\-141.0678\\-47\\-18.54691\\-143.0209\\-47\\-17.94909\\-144.974\\-47\\-17.74504\\-146.9271\\-47\\-16.10177\\-148.8803\\-47\\-14.04966\\-150.8334\\-47\\-15.90123\\-152.4748\\-47\\-17.85435\\-153.0108\\-47\\-18.91045\\-154.7396\\-47\\-20.69234\\-156.6928\\-47\\-21.33523\\-158.6459\\-47\\-22.86349\\-160.599\\-47\\-23.71373\\-161.3976\\-47\\-25.66685\\-161.8396\\-47\\-27.61998\\-163.6109\\-47\\-29.5731\\-164.6669\\-47\\-31.52623\\-165.1683\\-47\\-33.47935\\-165.4565\\-47\\-35.43248\\-165.4016\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "228" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-232.0486\\-47\\-18.83091\\-230.9115\\-47\\-20.78404\\-228.9584\\-47\\-20.78404\\-227.0053\\-47\\-23.71373\\-224.0756\\-47\\-24.85082\\-223.099\\-47\\-24.52976\\-221.1459\\-47\\-23.71373\\-220.3298\\-47\\-21.7606\\-220.1693\\-47\\-19.80748\\-220.1693\\-47\\-17.85435\\-220.3298\\-47\\-15.90123\\-220.3298\\-47\\-13.9481\\-222.1225\\-47\\-11.99498\\-222.283\\-47\\-9.065289\\-225.0521\\-47\\-10.85788\\-227.0053\\-47\\-10.85788\\-230.9115\\-47\\-11.99498\\-232.0486\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "229" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-234.0953\\-47\\17.56823\\-232.8646\\-47\\17.46087\\-227.0053\\-47\\19.25502\\-226.0162\\-47\\21.20815\\-227.8363\\-47\\22.19295\\-228.9584\\-47\\22.2507\\-230.9115\\-47\\21.2314\\-232.8646\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "230" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.31752\\-195.2386\\-47\\56.82915\\-193.8021\\-47\\56.25589\\-191.849\\-47\\56.28363\\-187.9428\\-47\\57.70717\\-184.0365\\-47\\58.01154\\-182.0834\\-47\\58.01154\\-180.1303\\-47\\58.15593\\-178.1771\\-47\\58.15593\\-174.2709\\-47\\57.9458\\-170.3646\\-47\\58.12919\\-168.4115\\-47\\58.83121\\-166.4584\\-47\\57.72034\\-164.5053\\-47\\56.3644\\-163.4523\\-47\\55.48389\\-162.5521\\-47\\56.3644\\-161.6668\\-47\\58.31752\\-161.5954\\-47\\60.36972\\-162.5521\\-47\\62.22377\\-163.2184\\-47\\64.1769\\-162.8227\\-47\\65.42828\\-164.5053\\-47\\65.48069\\-166.4584\\-47\\67.14334\\-168.4115\\-47\\70.03628\\-171.4226\\-47\\71.9894\\-171.3196\\-47\\73.94253\\-170.4601\\-47\\75.89565\\-171.5207\\-47\\76.68421\\-172.3178\\-47\\77.75404\\-174.2709\\-47\\77.90874\\-176.224\\-47\\78.61651\\-178.1771\\-47\\78.25369\\-180.1303\\-47\\77.26945\\-182.0834\\-47\\77.21005\\-184.0365\\-47\\76.8479\\-185.9896\\-47\\76.72197\\-187.9428\\-47\\75.89565\\-189.7689\\-47\\74.80606\\-191.849\\-47\\73.94253\\-192.8256\\-47\\71.9894\\-193.0971\\-47\\70.03628\\-192.7562\\-47\\68.08315\\-191.9432\\-47\\64.1769\\-191.6252\\-47\\62.22377\\-192.6102\\-47\\60.27065\\-194.5308\\-47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "231" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-136.995\\-215.7574\\-45\\-138.9481\\-215.0047\\-45\\-140.9012\\-214.9935\\-45\\-142.8544\\-214.0375\\-45\\-145.4927\\-211.3803\\-45\\-146.1987\\-209.4271\\-45\\-146.3447\\-207.474\\-45\\-147.2874\\-205.5209\\-45\\-147.3476\\-203.5678\\-45\\-146.1321\\-201.6146\\-45\\-146.1181\\-197.7084\\-45\\-145.2138\\-195.7553\\-45\\-144.8075\\-195.3938\\-45\\-142.8544\\-194.9912\\-45\\-141.3784\\-195.7553\\-45\\-136.995\\-198.3577\\-45\\-135.0419\\-198.9842\\-45\\-133.0887\\-200.2388\\-45\\-131.1356\\-200.4993\\-45\\-129.1825\\-200.8805\\-45\\-128.5911\\-201.6146\\-45\\-127.7706\\-203.5678\\-45\\-126.3638\\-205.5209\\-45\\-124.0407\\-209.4271\\-45\\-123.3231\\-210.118\\-45\\-121.37\\-210.7805\\-45\\-119.4168\\-210.8749\\-45\\-117.4637\\-210.7588\\-45\\-115.5106\\-210.2021\\-45\\-114.8242\\-209.4271\\-45\\-113.9237\\-205.5209\\-45\\-114.6131\\-203.5678\\-45\\-116.3058\\-201.6146\\-45\\-118.229\\-199.6615\\-45\\-118.3634\\-197.7084\\-45\\-117.4637\\-196.2249\\-45\\-115.5106\\-193.979\\-45\\-113.5575\\-192.9268\\-45\\-111.6043\\-191.6746\\-45\\-107.6981\\-191.6496\\-45\\-105.745\\-192.6056\\-45\\-103.7918\\-193.9386\\-45\\-101.8387\\-195.054\\-45\\-101.1337\\-195.7553\\-45\\-98.94222\\-199.6615\\-45\\-98.90456\\-201.6146\\-45\\-99.37321\\-203.5678\\-45\\-100.1916\\-205.5209\\-45\\-102.4447\\-207.474\\-45\\-103.7918\\-208.519\\-45\\-105.745\\-209.091\\-45\\-107.6981\\-210.4579\\-45\\-109.6512\\-210.9007\\-45\\-111.6043\\-212.0517\\-45\\-113.5575\\-212.5196\\-45\\-115.5106\\-214.2445\\-45\\-119.4168\\-216.0081\\-45\\-121.37\\-216.4019\\-45\\-125.2762\\-215.2945\\-45\\-131.1356\\-215.3103\\-45\\-133.0887\\-216.0538\\-45\\-135.0419\\-216.3777\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "232" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.2606\\-202.4949\\-45\\-85.56919\\-201.6146\\-45\\-85.19905\\-199.6615\\-45\\-82.30747\\-196.8648\\-45\\-81.41229\\-197.7084\\-45\\-81.85449\\-199.6615\\-45\\-83.37642\\-201.6146\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "233" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-78.40122\\-192.1607\\-45\\-78.69419\\-191.849\\-45\\-79.20146\\-189.8959\\-45\\-80.35435\\-188.3587\\-45\\-82.43137\\-185.9896\\-45\\-83.16133\\-184.0365\\-45\\-82.5045\\-182.0834\\-45\\-80.86704\\-180.1303\\-45\\-80.35435\\-179.38\\-45\\-79.7971\\-178.1771\\-45\\-80.25961\\-176.224\\-45\\-80.01826\\-174.2709\\-45\\-79.21117\\-172.3178\\-45\\-78.06071\\-170.3646\\-45\\-77.43903\\-168.4115\\-45\\-76.64754\\-166.4584\\-45\\-74.49497\\-164.8586\\-45\\-72.54185\\-164.0893\\-45\\-70.58872\\-163.5065\\-45\\-68.6356\\-161.7344\\-45\\-66.68247\\-161.0054\\-45\\-64.72935\\-161.4458\\-45\\-63.91251\\-162.5521\\-45\\-64.25605\\-164.5053\\-45\\-63.57355\\-166.4584\\-45\\-61.29522\\-168.4115\\-45\\-60.64872\\-170.3646\\-45\\-60.46628\\-174.2709\\-45\\-60.45611\\-178.1771\\-45\\-59.70385\\-182.0834\\-45\\-58.65827\\-184.0365\\-45\\-58.65827\\-187.9428\\-45\\-58.42338\\-189.8959\\-45\\-58.3669\\-191.849\\-45\\-58.86998\\-192.4594\\-45\\-60.8231\\-192.719\\-45\\-62.77623\\-191.1998\\-45\\-64.72935\\-191.8263\\-45\\-66.68247\\-192.714\\-45\\-68.6356\\-193.2197\\-45\\-70.58872\\-192.6744\\-45\\-72.54185\\-192.7509\\-45\\-74.49497\\-193.1304\\-45\\-76.4481\\-193.2016\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "234" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-164.7871\\-45\\-35.43248\\-163.8222\\-45\\-37.3856\\-163.4992\\-45\\-39.33873\\-163.3015\\-45\\-41.29185\\-161.8596\\-45\\-42.81697\\-160.599\\-45\\-46.263\\-156.6928\\-45\\-46.90374\\-154.7396\\-45\\-47.15123\\-154.4141\\-45\\-49.10435\\-152.9609\\-45\\-51.16337\\-154.7396\\-45\\-52.58714\\-156.6928\\-45\\-53.0106\\-157.0076\\-45\\-53.38739\\-156.6928\\-45\\-53.82182\\-154.7396\\-45\\-53.0106\\-152.8231\\-45\\-51.83551\\-150.8334\\-45\\-49.98486\\-148.8803\\-45\\-48.61607\\-146.9271\\-45\\-46.98964\\-143.0209\\-45\\-46.7742\\-141.0678\\-45\\-46.08281\\-139.1146\\-45\\-44.90513\\-137.1615\\-45\\-44.06221\\-135.2084\\-45\\-43.24498\\-134.3457\\-45\\-41.29185\\-132.7546\\-45\\-39.33873\\-132.0297\\-45\\-37.3856\\-131.746\\-45\\-35.43248\\-131.6382\\-45\\-31.52623\\-132.1686\\-45\\-29.5731\\-132.7243\\-45\\-27.61998\\-133.8235\\-45\\-25.66685\\-134.0682\\-45\\-23.71373\\-134.9465\\-45\\-21.7606\\-136.4845\\-45\\-19.07384\\-139.1146\\-45\\-18.04135\\-143.0209\\-45\\-17.73138\\-144.974\\-45\\-16.98452\\-146.9271\\-45\\-15.90123\\-148.1584\\-45\\-13.9481\\-149.4212\\-45\\-12.80689\\-150.8334\\-45\\-13.9481\\-152.3669\\-45\\-15.90123\\-151.4897\\-45\\-17.84648\\-152.7865\\-45\\-18.78984\\-154.7396\\-45\\-20.27223\\-156.6928\\-45\\-20.90666\\-158.6459\\-45\\-21.7606\\-159.5484\\-45\\-23.71373\\-161.061\\-45\\-25.66685\\-161.6482\\-45\\-27.61998\\-163.2673\\-45\\-29.5731\\-163.7839\\-45\\-31.52623\\-164.729\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "24" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "235" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-233.8412\\-45\\-18.83091\\-232.8646\\-45\\-18.83091\\-230.9115\\-45\\-20.78404\\-228.9584\\-45\\-20.9766\\-227.0053\\-45\\-23.71373\\-224.2681\\-45\\-25.66685\\-224.0756\\-45\\-26.64341\\-223.099\\-45\\-25.66685\\-222.1225\\-45\\-23.71373\\-221.9299\\-45\\-21.7606\\-220.1693\\-45\\-19.80748\\-220.3619\\-45\\-19.02348\\-221.1459\\-45\\-18.83091\\-223.099\\-45\\-17.85435\\-224.0756\\-45\\-15.90123\\-224.2681\\-45\\-13.9481\\-222.315\\-45\\-11.99498\\-224.0756\\-45\\-10.04185\\-224.0756\\-45\\-9.065289\\-225.0521\\-45\\-8.872726\\-227.0053\\-45\\-8.872726\\-232.8646\\-45\\-10.04185\\-234.0338\\-45\\-15.90123\\-234.0338\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "236" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-234.2876\\-45\\17.38267\\-232.8646\\-45\\17.38267\\-230.9115\\-45\\17.20716\\-228.9584\\-45\\17.26405\\-227.0053\\-45\\19.25502\\-226.0201\\-45\\22.28464\\-228.9584\\-45\\22.97427\\-230.9115\\-45\\22.09071\\-232.8646\\-45\\21.20815\\-233.6898\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "237" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.28636\\-195.7553\\-45\\56.35677\\-193.8021\\-45\\56.25589\\-191.849\\-45\\56.25589\\-189.8959\\-45\\56.44517\\-187.9428\\-45\\57.26985\\-185.9896\\-45\\57.92813\\-184.0365\\-45\\57.369\\-182.0834\\-45\\57.42686\\-180.1303\\-45\\58.14314\\-178.1771\\-45\\58.15593\\-172.3178\\-45\\57.46362\\-170.3646\\-45\\57.46064\\-168.4115\\-45\\58.05666\\-166.4584\\-45\\56.3644\\-164.513\\-45\\54.41127\\-162.6858\\-45\\54.41127\\-162.4454\\-45\\55.62523\\-160.599\\-45\\56.3644\\-159.8985\\-45\\58.31752\\-160.0466\\-45\\60.27065\\-161.6943\\-45\\62.22377\\-162.8987\\-45\\64.1769\\-162.8227\\-45\\66.13003\\-164.055\\-45\\66.58025\\-164.5053\\-45\\67.36084\\-166.4584\\-45\\69.62216\\-170.3646\\-45\\70.03628\\-170.9191\\-45\\71.9894\\-171.6057\\-45\\73.94253\\-170.9283\\-45\\75.89565\\-171.4362\\-45\\76.82757\\-172.3178\\-45\\78.5942\\-174.2709\\-45\\80.02726\\-176.224\\-45\\80.68081\\-178.1771\\-45\\80.61118\\-180.1303\\-45\\79.8019\\-181.691\\-45\\78.23571\\-184.0365\\-45\\76.83553\\-185.9896\\-45\\75.87103\\-189.8959\\-45\\74.82407\\-191.849\\-45\\73.94253\\-192.7704\\-45\\71.9894\\-194.2064\\-45\\70.03628\\-194.9661\\-45\\68.08315\\-194.1326\\-45\\66.13003\\-192.6234\\-45\\64.1769\\-191.6496\\-45\\62.22377\\-192.1081\\-45\\60.27065\\-194.1834\\-45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "238" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-138.4763\\-215.2865\\-43\\-138.9481\\-215.0047\\-43\\-140.9012\\-214.8437\\-43\\-142.8544\\-213.8187\\-43\\-145.4336\\-211.3803\\-43\\-147.1163\\-209.4271\\-43\\-147.8309\\-207.474\\-43\\-147.9813\\-205.5209\\-43\\-147.6239\\-203.5678\\-43\\-146.1391\\-201.6146\\-43\\-146.1181\\-197.7084\\-43\\-145.1813\\-195.7553\\-43\\-144.8075\\-195.4183\\-43\\-142.8544\\-196.0409\\-43\\-140.9012\\-197.0884\\-43\\-138.9481\\-197.6418\\-43\\-136.995\\-198.4621\\-43\\-134.7736\\-199.6615\\-43\\-133.0887\\-200.4168\\-43\\-131.1356\\-201.0386\\-43\\-129.1825\\-202.0168\\-43\\-126.1653\\-205.5209\\-43\\-123.3231\\-209.4348\\-43\\-121.37\\-210.4913\\-43\\-119.4168\\-210.9183\\-43\\-117.4637\\-210.8001\\-43\\-116.1224\\-209.4271\\-43\\-115.9291\\-207.474\\-43\\-114.6537\\-205.5209\\-43\\-114.9774\\-203.5678\\-43\\-116.4414\\-201.6146\\-43\\-118.3001\\-199.6615\\-43\\-118.3333\\-197.7084\\-43\\-115.5106\\-194.634\\-43\\-113.5575\\-192.938\\-43\\-111.6043\\-191.6746\\-43\\-107.6981\\-191.6496\\-43\\-105.745\\-192.0744\\-43\\-103.7918\\-192.9728\\-43\\-101.8387\\-194.6002\\-43\\-100.5885\\-195.7553\\-43\\-98.88557\\-197.7084\\-43\\-98.13191\\-199.6615\\-43\\-98.13191\\-201.6146\\-43\\-98.47869\\-203.5678\\-43\\-98.9419\\-205.5209\\-43\\-101.8387\\-208.2641\\-43\\-103.7918\\-208.9135\\-43\\-105.745\\-210.2427\\-43\\-107.6981\\-210.766\\-43\\-109.6512\\-211.1328\\-43\\-111.6043\\-212.5288\\-43\\-113.5575\\-214.0772\\-43\\-115.5106\\-214.7897\\-43\\-117.4637\\-216.0215\\-43\\-119.4168\\-216.7095\\-43\\-121.37\\-216.9141\\-43\\-123.3231\\-216.5764\\-43\\-125.2762\\-216.4369\\-43\\-131.1356\\-216.4471\\-43\\-135.0419\\-216.8626\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "239" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.2606\\-202.3638\\-43\\-85.32527\\-201.6146\\-43\\-85.09549\\-199.6615\\-43\\-82.30747\\-196.789\\-43\\-80.99861\\-197.7084\\-43\\-81.48116\\-199.6615\\-43\\-82.30747\\-200.5395\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "240" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-74.49497\\-194.0016\\-43\\-76.4481\\-192.493\\-43\\-76.99667\\-191.849\\-43\\-77.74773\\-189.8959\\-43\\-79.44796\\-187.9428\\-43\\-82.30747\\-185.1096\\-43\\-83.22574\\-184.0365\\-43\\-84.56864\\-182.0834\\-43\\-84.43607\\-180.1303\\-43\\-82.30747\\-177.8852\\-43\\-81.54018\\-176.224\\-43\\-81.07419\\-174.2709\\-43\\-79.24163\\-172.3178\\-43\\-77.51636\\-170.3646\\-43\\-76.97005\\-168.4115\\-43\\-75.51041\\-166.4584\\-43\\-74.49497\\-165.4771\\-43\\-72.54185\\-164.3698\\-43\\-70.58872\\-163.5897\\-43\\-66.68247\\-159.9118\\-43\\-64.72935\\-159.8781\\-43\\-64.01591\\-160.599\\-43\\-63.65513\\-162.5521\\-43\\-63.59584\\-164.5053\\-43\\-62.77623\\-165.2456\\-43\\-60.8231\\-165.8923\\-43\\-60.30035\\-166.4584\\-43\\-60.53013\\-168.4115\\-43\\-60.46628\\-170.3646\\-43\\-60.46628\\-178.1771\\-43\\-60.26585\\-180.1303\\-43\\-59.72777\\-182.0834\\-43\\-58.67054\\-184.0365\\-43\\-58.65827\\-187.9428\\-43\\-57.95642\\-189.8959\\-43\\-57.66113\\-191.849\\-43\\-58.86998\\-193.5904\\-43\\-61.26456\\-191.849\\-43\\-62.77623\\-191.1133\\-43\\-63.58764\\-191.849\\-43\\-66.19761\\-193.8021\\-43\\-66.68247\\-194.2495\\-43\\-68.6356\\-195.0943\\-43\\-70.58872\\-195.0797\\-43\\-72.54185\\-194.8329\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "241" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-162.8882\\-43\\-41.29185\\-161.6211\\-43\\-46.23355\\-156.6928\\-43\\-46.82571\\-154.7396\\-43\\-47.53462\\-152.7865\\-43\\-49.10435\\-151.6533\\-43\\-50.46278\\-152.7865\\-43\\-51.83429\\-154.7396\\-43\\-53.0106\\-155.8813\\-43\\-53.86847\\-154.7396\\-43\\-53.14703\\-152.7865\\-43\\-50.61192\\-148.8803\\-43\\-49.63238\\-146.9271\\-43\\-48.52504\\-144.974\\-43\\-47.84799\\-143.0209\\-43\\-47.02916\\-141.0678\\-43\\-46.55149\\-139.1146\\-43\\-45.76496\\-137.1615\\-43\\-43.24498\\-133.2014\\-43\\-41.29185\\-132.0235\\-43\\-39.33873\\-131.6891\\-43\\-37.3856\\-130.715\\-43\\-35.43248\\-130.2409\\-43\\-33.47935\\-130.7825\\-43\\-31.52623\\-131.584\\-43\\-27.61998\\-132.1105\\-43\\-25.66685\\-132.7332\\-43\\-21.7606\\-134.8345\\-43\\-21.42123\\-135.2084\\-43\\-20.3102\\-137.1615\\-43\\-18.82659\\-139.1146\\-43\\-18.06605\\-141.0678\\-43\\-17.69159\\-143.0209\\-43\\-17.03069\\-144.974\\-43\\-15.90123\\-146.6429\\-43\\-13.25238\\-148.8803\\-43\\-12.34269\\-150.8334\\-43\\-13.34956\\-152.7865\\-43\\-14.08354\\-152.7865\\-43\\-15.90123\\-151.1902\\-43\\-17.89191\\-152.7865\\-43\\-18.76673\\-154.7396\\-43\\-20.81008\\-158.6459\\-43\\-21.7606\\-159.6049\\-43\\-23.71373\\-160.9859\\-43\\-25.66685\\-161.6253\\-43\\-27.61998\\-162.8987\\-43\\-29.5731\\-163.5853\\-43\\-31.52623\\-164.3968\\-43\\-33.47935\\-164.3698\\-43\\-35.43248\\-163.5377\\-43\\-37.3856\\-162.9775\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "242" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-15.90123\\-235.7943\\-43\\-16.87779\\-234.8178\\-43\\-18.59863\\-232.8646\\-43\\-18.83091\\-230.9115\\-43\\-26.64341\\-223.099\\-43\\-23.71373\\-220.1693\\-43\\-21.7606\\-220.1693\\-43\\-20.78404\\-221.1459\\-43\\-19.80748\\-222.3547\\-43\\-17.11008\\-225.0521\\-43\\-15.90123\\-226.0287\\-43\\-13.9481\\-224.3079\\-43\\-11.99498\\-224.0756\\-43\\-10.04185\\-224.0756\\-43\\-7.112164\\-227.0053\\-43\\-7.112164\\-232.8646\\-43\\-8.088726\\-234.0735\\-43\\-10.04185\\-236.0266\\-43\\-13.9481\\-236.0266\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "243" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-234.4712\\-43\\17.38267\\-232.8646\\-43\\17.16547\\-230.9115\\-43\\16.48725\\-228.9584\\-43\\16.6683\\-227.0053\\-43\\17.3019\\-226.4106\\-43\\19.25502\\-226.1186\\-43\\21.20815\\-227.9859\\-43\\23.29491\\-228.9584\\-43\\24.37201\\-230.9115\\-43\\23.40358\\-232.8646\\-43\\23.16127\\-233.1288\\-43\\21.20815\\-234.3441\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "244" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.31752\\-196.3834\\-43\\57.11947\\-195.7553\\-43\\56.26966\\-193.8021\\-43\\56.26966\\-189.8959\\-43\\56.94815\\-187.9428\\-43\\57.49542\\-185.9896\\-43\\57.36467\\-184.0365\\-43\\56.9417\\-182.0834\\-43\\57.34096\\-180.1303\\-43\\58.14314\\-178.1771\\-43\\58.15593\\-172.3178\\-43\\57.59396\\-170.3646\\-43\\57.17744\\-168.4115\\-43\\57.45419\\-166.4584\\-43\\56.42282\\-164.5053\\-43\\54.41127\\-163.5574\\-43\\53.83843\\-162.5521\\-43\\55.43998\\-160.599\\-43\\56.3644\\-159.6965\\-43\\58.31752\\-159.7428\\-43\\60.27065\\-161.6609\\-43\\62.22377\\-162.8227\\-43\\64.1769\\-162.8227\\-43\\66.13003\\-163.6042\\-43\\68.08315\\-165.1179\\-43\\70.03628\\-166.3703\\-43\\72.07154\\-168.4115\\-43\\73.94253\\-169.7115\\-43\\75.89565\\-170.6769\\-43\\77.84878\\-171.7888\\-43\\79.8019\\-173.745\\-43\\80.57095\\-174.2709\\-43\\81.75503\\-175.3986\\-43\\82.19949\\-176.224\\-43\\81.33908\\-178.1771\\-43\\80.69708\\-180.1303\\-43\\79.8019\\-181.2217\\-43\\78.85406\\-182.0834\\-43\\76.94238\\-184.0365\\-43\\76.03108\\-185.9896\\-43\\75.01514\\-187.9428\\-43\\74.43081\\-189.8959\\-43\\73.1654\\-191.849\\-43\\70.34965\\-195.7553\\-43\\70.03628\\-196.039\\-43\\68.08315\\-195.2746\\-43\\67.1015\\-193.8021\\-43\\66.13003\\-192.8742\\-43\\64.1769\\-191.6496\\-43\\62.22377\\-191.6874\\-43\\60.07121\\-193.8021\\-43\\58.97408\\-195.7553\\-43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "64" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "245" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-217.2952\\-41\\-125.2762\\-217.0402\\-41\\-127.2293\\-216.9141\\-41\\-135.0419\\-216.9578\\-41\\-136.995\\-216\\-41\\-138.9481\\-214.8132\\-41\\-140.9012\\-214.2431\\-41\\-142.8544\\-212.4783\\-41\\-144.7132\\-211.3803\\-41\\-146.7606\\-209.9826\\-41\\-147.2992\\-209.4271\\-41\\-147.9679\\-207.474\\-41\\-148.0679\\-205.5209\\-41\\-147.7277\\-203.5678\\-41\\-146.3259\\-201.6146\\-41\\-146.1181\\-199.6615\\-41\\-146.1181\\-197.7084\\-41\\-145.9722\\-195.7553\\-41\\-144.8075\\-194.47\\-41\\-142.8544\\-195.3955\\-41\\-140.9012\\-197.6418\\-41\\-138.9481\\-197.7459\\-41\\-136.995\\-198.4906\\-41\\-134.9169\\-199.6615\\-41\\-133.0887\\-200.4399\\-41\\-131.1356\\-201.4152\\-41\\-129.1825\\-201.9294\\-41\\-127.0299\\-203.5678\\-41\\-126.126\\-205.5209\\-41\\-125.2762\\-206.6467\\-41\\-123.3231\\-208.8284\\-41\\-121.37\\-210.0873\\-41\\-119.4168\\-210.7349\\-41\\-117.4637\\-210.1612\\-41\\-116.8589\\-209.4271\\-41\\-116.4224\\-207.474\\-41\\-115.5106\\-205.6062\\-41\\-116.201\\-203.5678\\-41\\-117.8859\\-201.6146\\-41\\-118.6423\\-199.6615\\-41\\-118.3365\\-197.7084\\-41\\-115.5106\\-194.8542\\-41\\-113.5575\\-192.9496\\-41\\-111.6043\\-191.6746\\-41\\-107.6981\\-191.6496\\-41\\-105.745\\-191.6874\\-41\\-103.7918\\-192.6354\\-41\\-101.8387\\-193.8687\\-41\\-99.8856\\-194.9568\\-41\\-98.99256\\-195.7553\\-41\\-96.82784\\-199.6615\\-41\\-96.39086\\-201.6146\\-41\\-96.93359\\-203.5678\\-41\\-98.09406\\-205.5209\\-41\\-100.3232\\-207.474\\-41\\-103.7918\\-210.2453\\-41\\-107.6981\\-211.1097\\-41\\-109.6512\\-212.1848\\-41\\-111.6043\\-213.878\\-41\\-113.5575\\-214.7324\\-41\\-115.5106\\-215.2489\\-41\\-117.4637\\-216.3226\\-41\\-119.4168\\-217.2169\\-41\\-121.37\\-217.3835\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "246" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-70.58872\\-196.7539\\-41\\-71.84233\\-195.7553\\-41\\-73.05276\\-193.8021\\-41\\-74.10594\\-191.849\\-41\\-75.64347\\-189.8959\\-41\\-77.50365\\-187.9428\\-41\\-78.97456\\-185.9896\\-41\\-80.35435\\-184.636\\-41\\-82.30747\\-183.2341\\-41\\-84.4484\\-182.0834\\-41\\-85.43736\\-180.1303\\-41\\-84.74504\\-178.1771\\-41\\-84.2606\\-177.6889\\-41\\-81.47768\\-174.2709\\-41\\-79.41415\\-172.3178\\-41\\-77.88154\\-170.3646\\-41\\-77.16587\\-168.4115\\-41\\-74.49497\\-165.6477\\-41\\-72.54185\\-163.8127\\-41\\-70.58872\\-163.2418\\-41\\-68.6356\\-161.7036\\-41\\-66.68247\\-159.7517\\-41\\-64.72935\\-159.6584\\-41\\-63.82223\\-160.599\\-41\\-61.95633\\-164.5053\\-41\\-60.16354\\-166.4584\\-41\\-60.67449\\-168.4115\\-41\\-60.74233\\-170.3646\\-41\\-60.46628\\-172.3178\\-41\\-60.44608\\-178.1771\\-41\\-59.91661\\-180.1303\\-41\\-59.2268\\-182.0834\\-41\\-58.65827\\-184.0365\\-41\\-58.65827\\-185.9896\\-41\\-58.44883\\-187.9428\\-41\\-57.02536\\-191.849\\-41\\-57.2374\\-193.8021\\-41\\-58.86998\\-195.0173\\-41\\-60.8231\\-194.2064\\-41\\-62.77623\\-193.0381\\-41\\-64.72935\\-193.2075\\-41\\-66.68247\\-194.719\\-41\\-68.6356\\-196.466\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "247" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-162.8227\\-41\\-39.33873\\-162.5294\\-41\\-41.29185\\-161.5542\\-41\\-46.23355\\-156.6928\\-41\\-46.82571\\-154.7396\\-41\\-46.9155\\-152.7865\\-41\\-47.15123\\-152.5017\\-41\\-49.10435\\-151.2104\\-41\\-50.90887\\-152.7865\\-41\\-51.9084\\-154.7396\\-41\\-53.0106\\-155.7316\\-41\\-54.1669\\-154.7396\\-41\\-53.64912\\-152.7865\\-41\\-52.40424\\-150.8334\\-41\\-51.60001\\-148.8803\\-41\\-49.87423\\-146.9271\\-41\\-48.84526\\-144.974\\-41\\-48.53607\\-143.0209\\-41\\-47.77602\\-141.0678\\-41\\-46.79441\\-139.1146\\-41\\-46.08452\\-137.1615\\-41\\-44.96238\\-135.2084\\-41\\-43.96256\\-133.2553\\-41\\-43.24498\\-132.5494\\-41\\-41.29185\\-131.8241\\-41\\-39.33873\\-130.7772\\-41\\-37.3856\\-130.0255\\-41\\-35.43248\\-129.8543\\-41\\-31.52623\\-130.2142\\-41\\-29.5731\\-130.2525\\-41\\-27.61998\\-130.7432\\-41\\-25.66685\\-131.8815\\-41\\-23.71373\\-132.1969\\-41\\-21.7606\\-133.0406\\-41\\-21.5459\\-133.2553\\-41\\-18.97963\\-137.1615\\-41\\-17.92093\\-141.0678\\-41\\-17.05491\\-143.0209\\-41\\-16.55056\\-144.974\\-41\\-15.90123\\-145.8008\\-41\\-12.57178\\-148.8803\\-41\\-12.21896\\-150.8334\\-41\\-12.85886\\-152.7865\\-41\\-13.9481\\-153.1277\\-41\\-14.14754\\-152.7865\\-41\\-15.90123\\-150.9555\\-41\\-17.89191\\-152.7865\\-41\\-19.71273\\-156.6928\\-41\\-20.79712\\-158.6459\\-41\\-21.7606\\-159.6094\\-41\\-23.71373\\-160.9859\\-41\\-25.66685\\-161.6253\\-41\\-27.61998\\-162.8112\\-41\\-31.52623\\-163.6786\\-41\\-33.47935\\-163.6634\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "24" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "248" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-13.9481\\-237.7475\\-41\\-14.92466\\-236.7709\\-41\\-16.60923\\-234.8178\\-41\\-16.60923\\-232.8646\\-41\\-18.56236\\-230.9115\\-41\\-21.05259\\-228.9584\\-41\\-23.71373\\-226.2973\\-41\\-25.66685\\-223.807\\-41\\-26.37486\\-223.099\\-41\\-24.69029\\-221.1459\\-41\\-23.71373\\-220.1693\\-41\\-21.7606\\-220.1693\\-41\\-20.78404\\-221.1459\\-41\\-20.78404\\-223.099\\-41\\-17.85435\\-226.0287\\-41\\-15.90123\\-226.2973\\-41\\-13.9481\\-226.2973\\-41\\-11.99498\\-224.3441\\-41\\-10.04185\\-224.3441\\-41\\-8.088726\\-226.0287\\-41\\-7.112164\\-227.0053\\-41\\-7.112164\\-234.8178\\-41\\-8.088726\\-236.0629\\-41\\-10.04185\\-237.7475\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "249" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-235.4552\\-41\\18.56828\\-234.8178\\-41\\16.90622\\-232.8646\\-41\\15.61931\\-228.9584\\-41\\16.16167\\-227.0053\\-41\\17.3019\\-226.0941\\-41\\19.25502\\-226.0663\\-41\\21.20815\\-227.8738\\-41\\23.16127\\-228.2988\\-41\\25.1144\\-228.3159\\-41\\26.15774\\-228.9584\\-41\\25.81728\\-230.9115\\-41\\25.1144\\-231.8628\\-41\\23.33813\\-234.8178\\-41\\21.20815\\-235.9657\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "250" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-196.1773\\-41\\56.01611\\-195.7553\\-41\\56.04325\\-193.8021\\-41\\56.25589\\-191.849\\-41\\56.26966\\-189.8959\\-41\\56.66836\\-187.9428\\-41\\56.96413\\-185.9896\\-41\\56.78977\\-184.0365\\-41\\57.05983\\-182.0834\\-41\\58.15593\\-178.1771\\-41\\58.15593\\-172.3178\\-41\\57.43103\\-170.3646\\-41\\56.88636\\-168.4115\\-41\\57.29911\\-166.4584\\-41\\57.55415\\-164.5053\\-41\\55.19648\\-162.5521\\-41\\55.88193\\-160.599\\-41\\56.3644\\-160.0692\\-41\\58.31752\\-159.7284\\-41\\60.27065\\-161.6609\\-41\\62.22377\\-162.8227\\-41\\64.1769\\-162.8227\\-41\\68.08315\\-163.7728\\-41\\70.03628\\-165.0257\\-41\\71.9894\\-166.0939\\-41\\73.94253\\-167.9649\\-41\\75.89565\\-168.9722\\-41\\77.84878\\-169.1811\\-41\\79.8019\\-170.2728\\-41\\81.75503\\-172.361\\-41\\82.81818\\-174.2709\\-41\\82.83186\\-176.224\\-41\\82.16653\\-178.1771\\-41\\79.8019\\-180.5172\\-41\\77.84878\\-181.3992\\-41\\77.04977\\-182.0834\\-41\\75.12396\\-184.0365\\-41\\74.31666\\-185.9896\\-41\\73.90079\\-187.9428\\-41\\72.95398\\-189.8959\\-41\\71.22108\\-191.849\\-41\\70.03628\\-194.2793\\-41\\68.08315\\-194.6795\\-41\\67.36784\\-193.8021\\-41\\66.13003\\-192.7847\\-41\\64.1769\\-191.5107\\-41\\62.22377\\-191.4797\\-41\\61.76649\\-191.849\\-41\\60.00011\\-193.8021\\-41\\59.11742\\-195.7553\\-41\\58.31752\\-196.5512\\-41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "64" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "251" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-129.1825\\-217.4098\\-39\\-133.0887\\-217.0158\\-39\\-135.0419\\-216.7605\\-39\\-136.995\\-215.8845\\-39\\-138.9481\\-214.3147\\-39\\-140.9012\\-213.341\\-39\\-144.2215\\-211.3803\\-39\\-144.8075\\-210.9643\\-39\\-146.4566\\-209.4271\\-39\\-147.1575\\-207.474\\-39\\-147.636\\-205.5209\\-39\\-147.9468\\-203.5678\\-39\\-147.3954\\-201.6146\\-39\\-146.1321\\-199.6615\\-39\\-146.101\\-195.7553\\-39\\-144.8075\\-194.0275\\-39\\-142.8544\\-195.1795\\-39\\-140.9012\\-197.7311\\-39\\-138.9481\\-197.7606\\-39\\-136.995\\-198.4906\\-39\\-135.0419\\-199.797\\-39\\-133.0887\\-200.5453\\-39\\-131.1356\\-201.4926\\-39\\-129.1825\\-201.8356\\-39\\-127.2293\\-203.3517\\-39\\-126.1513\\-205.5209\\-39\\-125.2762\\-206.432\\-39\\-123.3231\\-208.0622\\-39\\-121.37\\-208.5245\\-39\\-119.4168\\-209.7229\\-39\\-117.4637\\-207.9297\\-39\\-117.1447\\-207.474\\-39\\-116.8385\\-205.5209\\-39\\-118.5913\\-201.6146\\-39\\-118.8949\\-199.6615\\-39\\-118.3355\\-197.7084\\-39\\-113.5575\\-192.9496\\-39\\-111.6043\\-191.6746\\-39\\-107.6981\\-191.3765\\-39\\-105.745\\-191.4647\\-39\\-103.7918\\-192.0622\\-39\\-101.8387\\-192.8515\\-39\\-100.0151\\-193.8021\\-39\\-97.93247\\-195.0103\\-39\\-96.98767\\-195.7553\\-39\\-96.26118\\-197.7084\\-39\\-94.94582\\-199.6615\\-39\\-94.37728\\-201.6146\\-39\\-95.05374\\-203.5678\\-39\\-95.97935\\-204.9324\\-39\\-97.19562\\-207.474\\-39\\-97.93247\\-208.0108\\-39\\-99.8856\\-208.7882\\-39\\-101.8387\\-210.1113\\-39\\-103.7918\\-210.7378\\-39\\-105.745\\-210.9007\\-39\\-107.6981\\-212.1277\\-39\\-109.6512\\-212.927\\-39\\-111.6043\\-214.3944\\-39\\-117.4637\\-216.9805\\-39\\-119.4168\\-218.0877\\-39\\-121.37\\-218.3851\\-39\\-123.3231\\-218.3807\\-39\\-127.2293\\-217.4232\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "252" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-70.58872\\-196.0238\\-39\\-70.81567\\-195.7553\\-39\\-71.52361\\-193.8021\\-39\\-72.72885\\-191.849\\-39\\-73.77373\\-189.8959\\-39\\-75.14374\\-187.9428\\-39\\-78.62978\\-184.0365\\-39\\-80.35435\\-182.6856\\-39\\-82.30747\\-181.4669\\-39\\-84.2606\\-180.714\\-39\\-84.93913\\-180.1303\\-39\\-86.41197\\-178.1771\\-39\\-86.47072\\-176.224\\-39\\-86.21372\\-175.9915\\-39\\-84.2606\\-175.4361\\-39\\-83.54852\\-174.2709\\-39\\-82.30747\\-173.1539\\-39\\-80.35435\\-171.9586\\-39\\-79.04015\\-170.3646\\-39\\-76.4481\\-167.435\\-39\\-73.52367\\-164.5053\\-39\\-72.54185\\-163.6188\\-39\\-70.58872\\-162.6742\\-39\\-68.6356\\-161.6227\\-39\\-66.68247\\-159.8248\\-39\\-64.72935\\-159.7325\\-39\\-63.89164\\-160.599\\-39\\-62.4297\\-162.5521\\-39\\-61.85584\\-164.5053\\-39\\-60.44608\\-166.4584\\-39\\-61.53098\\-168.4115\\-39\\-61.70345\\-170.3646\\-39\\-60.78554\\-172.3178\\-39\\-60.46628\\-174.2709\\-39\\-60.44608\\-178.1771\\-39\\-59.87281\\-180.1303\\-39\\-59.03157\\-182.0834\\-39\\-58.65827\\-184.0365\\-39\\-58.65827\\-185.9896\\-39\\-57.93336\\-187.9428\\-39\\-57.31358\\-189.8959\\-39\\-56.83608\\-191.849\\-39\\-56.0233\\-193.8021\\-39\\-55.51841\\-195.7553\\-39\\-56.91685\\-196.9777\\-39\\-58.86998\\-195.6332\\-39\\-62.51772\\-193.8021\\-39\\-62.77623\\-193.6151\\-39\\-64.72935\\-192.9402\\-39\\-66.16109\\-193.8021\\-39\\-68.6356\\-196.3697\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "253" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-162.7879\\-39\\-39.33873\\-161.746\\-39\\-41.29185\\-161.2786\\-39\\-43.24498\\-159.6401\\-39\\-44.28142\\-158.6459\\-39\\-46.09674\\-156.6928\\-39\\-46.72057\\-154.7396\\-39\\-46.85826\\-152.7865\\-39\\-47.15123\\-152.4292\\-39\\-49.10435\\-150.9419\\-39\\-50.97671\\-152.7865\\-39\\-52.15434\\-154.7396\\-39\\-53.0106\\-155.3682\\-39\\-53.82553\\-154.7396\\-39\\-53.80115\\-152.7865\\-39\\-53.0106\\-151.0078\\-39\\-51.78856\\-148.8803\\-39\\-49.8949\\-146.9271\\-39\\-48.90491\\-144.974\\-39\\-48.82253\\-143.0209\\-39\\-47.95238\\-141.0678\\-39\\-46.85826\\-139.1146\\-39\\-46.45802\\-137.1615\\-39\\-45.64089\\-135.2084\\-39\\-44.02309\\-133.2553\\-39\\-43.24498\\-132.4894\\-39\\-41.29185\\-131.799\\-39\\-39.33873\\-130.5469\\-39\\-37.3856\\-129.8286\\-39\\-33.47935\\-129.4711\\-39\\-31.52623\\-129.5234\\-39\\-29.5731\\-129.6851\\-39\\-27.61998\\-130.0429\\-39\\-25.66685\\-130.6689\\-39\\-23.71373\\-131.6792\\-39\\-21.7606\\-132.4572\\-39\\-19.09031\\-135.2084\\-39\\-18.47914\\-137.1615\\-39\\-17.64116\\-141.0678\\-39\\-16.85518\\-143.0209\\-39\\-15.96781\\-144.974\\-39\\-13.9481\\-147.0131\\-39\\-12.30445\\-148.8803\\-39\\-12.34593\\-150.8334\\-39\\-12.85886\\-152.7865\\-39\\-13.61626\\-154.7396\\-39\\-14.19578\\-154.7396\\-39\\-14.14754\\-152.7865\\-39\\-14.80259\\-150.8334\\-39\\-15.90123\\-150.0927\\-39\\-16.6722\\-150.8334\\-39\\-17.89191\\-152.7865\\-39\\-18.76673\\-154.7396\\-39\\-19.99581\\-156.6928\\-39\\-20.95089\\-158.6459\\-39\\-21.7606\\-159.4556\\-39\\-23.71373\\-160.7075\\-39\\-27.61998\\-162.4996\\-39\\-31.52623\\-163.2152\\-39\\-33.47935\\-163.2352\\-39\\-35.43248\\-162.8882\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "254" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-21.7606\\-229.6212\\-39\\-24.37657\\-227.0053\\-39\\-24.37657\\-225.0521\\-39\\-22.42345\\-223.099\\-39\\-24.37657\\-221.1459\\-39\\-23.71373\\-220.483\\-39\\-21.7606\\-220.483\\-39\\-21.09775\\-221.1459\\-39\\-21.09775\\-223.099\\-39\\-17.1915\\-227.0053\\-39\\-19.80748\\-229.6212\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "255" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-13.9481\\-237.4337\\-39\\-14.61095\\-236.7709\\-39\\-12.65782\\-234.8178\\-39\\-12.65782\\-232.8646\\-39\\-14.61095\\-230.9115\\-39\\-14.61095\\-228.9584\\-39\\-11.99498\\-226.3424\\-39\\-8.088726\\-226.3424\\-39\\-7.425878\\-227.0053\\-39\\-7.425878\\-236.7709\\-39\\-8.088726\\-237.4337\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "256" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "21.20815\\-237.2592\\-39\\19.25502\\-236.4316\\-39\\17.3019\\-234.5248\\-39\\15.34877\\-233.8678\\-39\\13.39565\\-233.3834\\-39\\12.59235\\-232.8646\\-39\\13.04913\\-230.9115\\-39\\13.20368\\-228.9584\\-39\\13.39565\\-228.55\\-39\\15.02951\\-227.0053\\-39\\17.3019\\-226.2083\\-39\\19.25502\\-226.1869\\-39\\23.16127\\-227.9278\\-39\\25.1144\\-228.0937\\-39\\27.06752\\-228.0516\\-39\\28.16195\\-228.9584\\-39\\27.32128\\-230.9115\\-39\\25.1144\\-233.8412\\-39\\24.48661\\-234.8178\\-39\\23.16127\\-236.0676\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "257" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-197.4521\\-39\\54.92309\\-195.7553\\-39\\55.45724\\-193.8021\\-39\\56.25589\\-191.849\\-39\\56.34169\\-187.9428\\-39\\56.60012\\-185.9896\\-39\\56.60012\\-184.0365\\-39\\56.76113\\-182.0834\\-39\\57.38203\\-180.1303\\-39\\58.14314\\-178.1771\\-39\\58.15593\\-172.3178\\-39\\57.19072\\-168.4115\\-39\\57.3649\\-166.4584\\-39\\58.04699\\-164.5053\\-39\\56.97145\\-162.5521\\-39\\56.20281\\-160.599\\-39\\56.3644\\-160.4179\\-39\\58.31752\\-159.7233\\-39\\60.27065\\-161.61\\-39\\62.22377\\-162.3454\\-39\\64.1769\\-162.3583\\-39\\66.13003\\-162.6469\\-39\\70.03628\\-163.8456\\-39\\71.9894\\-165.1365\\-39\\73.94253\\-166.0476\\-39\\75.89565\\-167.1272\\-39\\77.84878\\-167.675\\-39\\79.8019\\-168.7906\\-39\\82.54697\\-172.3178\\-39\\83.02151\\-174.2709\\-39\\82.5782\\-176.224\\-39\\81.75503\\-177.2067\\-39\\79.8019\\-179.079\\-39\\77.84878\\-180.4871\\-39\\75.89565\\-181.3824\\-39\\73.31683\\-184.0365\\-39\\72.44638\\-185.9896\\-39\\72.28632\\-187.9428\\-39\\71.01284\\-189.8959\\-39\\70.03628\\-190.9053\\-39\\68.08315\\-192.2498\\-39\\66.13003\\-191.792\\-39\\64.1769\\-190.9722\\-39\\62.22377\\-190.9025\\-39\\61.17508\\-191.849\\-39\\59.78832\\-193.8021\\-39\\59.05503\\-195.7553\\-39\\58.31752\\-196.5045\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "258" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-205.8244\\-39\\71.83709\\-201.6146\\-39\\71.72717\\-199.6615\\-39\\71.9894\\-199.4064\\-39\\73.94253\\-199.5988\\-39\\75.89565\\-200.9761\\-39\\77.33986\\-199.6615\\-39\\77.84878\\-199.3857\\-39\\79.8019\\-199.0826\\-39\\83.70815\\-198.9655\\-39\\85.66128\\-200.6855\\-39\\86.9602\\-201.6146\\-39\\87.6144\\-202.6056\\-39\\88.56265\\-203.5678\\-39\\87.6144\\-204.3375\\-39\\85.66128\\-204.4393\\-39\\81.75503\\-204.4393\\-39\\79.8019\\-205.6997\\-39\\77.84878\\-206.1434\\-39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "79" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "259" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-219.0312\\-37\\-125.2762\\-218.5227\\-37\\-127.2293\\-218.3833\\-37\\-129.1825\\-218.364\\-37\\-131.1356\\-217.9039\\-37\\-132.9492\\-217.2396\\-37\\-136.995\\-215.2941\\-37\\-140.9012\\-212.9464\\-37\\-142.8544\\-212.2721\\-37\\-144.8075\\-211.0984\\-37\\-146.1321\\-209.4271\\-37\\-146.1833\\-207.474\\-37\\-146.5249\\-205.5209\\-37\\-147.6042\\-203.5678\\-37\\-147.4559\\-201.6146\\-37\\-146.1321\\-199.6615\\-37\\-146.0786\\-195.7553\\-37\\-144.8075\\-194.4089\\-37\\-142.8544\\-196.4395\\-37\\-140.9012\\-198.1029\\-37\\-138.9481\\-198.1333\\-37\\-136.995\\-198.6901\\-37\\-135.0419\\-200.4459\\-37\\-131.1356\\-201.5199\\-37\\-129.1825\\-202.2716\\-37\\-128.1023\\-203.5678\\-37\\-126.2262\\-205.5209\\-37\\-125.2762\\-206.3736\\-37\\-123.3231\\-207.1485\\-37\\-121.37\\-207.5825\\-37\\-119.4168\\-207.5128\\-37\\-118.5201\\-205.5209\\-37\\-118.5976\\-203.5678\\-37\\-119.1129\\-201.6146\\-37\\-119.3075\\-199.6615\\-37\\-118.2565\\-197.7084\\-37\\-115.5106\\-194.8855\\-37\\-113.5575\\-192.9496\\-37\\-111.6043\\-191.543\\-37\\-107.6981\\-190.5638\\-37\\-105.745\\-190.8777\\-37\\-103.7918\\-191.4773\\-37\\-101.8387\\-191.9304\\-37\\-99.8856\\-192.732\\-37\\-97.93247\\-193.8543\\-37\\-95.97935\\-194.5022\\-37\\-93.36704\\-195.7553\\-37\\-92.0731\\-196.8804\\-37\\-90.11997\\-196.2435\\-37\\-87.67857\\-193.8021\\-37\\-85.83813\\-191.849\\-37\\-84.17182\\-189.8959\\-37\\-82.30747\\-189.419\\-37\\-78.40122\\-189.6029\\-37\\-78.09964\\-189.8959\\-37\\-78.12409\\-193.8021\\-37\\-78.00684\\-195.7553\\-37\\-78.40122\\-197.8711\\-37\\-79.81467\\-199.6615\\-37\\-79.82851\\-203.5678\\-37\\-82.30747\\-205.7256\\-37\\-84.2606\\-205.6051\\-37\\-86.21372\\-204.0041\\-37\\-90.11997\\-203.9863\\-37\\-92.0731\\-205.6914\\-37\\-93.80087\\-207.474\\-37\\-95.97935\\-208.8547\\-37\\-97.93247\\-209.168\\-37\\-99.8856\\-210.2559\\-37\\-101.8387\\-210.7275\\-37\\-103.7918\\-210.9007\\-37\\-105.745\\-211.1933\\-37\\-109.6512\\-214.1472\\-37\\-111.6043\\-214.8069\\-37\\-113.5575\\-216.0414\\-37\\-115.5106\\-216.7688\\-37\\-117.4637\\-217.9936\\-37\\-119.4168\\-218.6874\\-37\\-121.3483\\-219.1928\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "260" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-56.91685\\-197.8528\\-37\\-59.0976\\-195.7553\\-37\\-62.77623\\-193.4831\\-37\\-64.72935\\-192.6271\\-37\\-66.68247\\-192.9678\\-37\\-68.6356\\-194.1684\\-37\\-70.58872\\-192.9984\\-37\\-71.52256\\-191.849\\-37\\-72.46673\\-189.8959\\-37\\-74.49497\\-186.185\\-37\\-76.03642\\-184.0365\\-37\\-76.4481\\-183.6366\\-37\\-80.35435\\-181.101\\-37\\-82.30747\\-180.3893\\-37\\-84.2606\\-179.1306\\-37\\-86.22222\\-178.1771\\-37\\-87.18278\\-176.224\\-37\\-85.39088\\-174.2709\\-37\\-84.2606\\-173.4405\\-37\\-82.30747\\-172.7409\\-37\\-80.35435\\-171.4633\\-37\\-79.30804\\-170.3646\\-37\\-77.92793\\-168.4115\\-37\\-76.72047\\-166.4584\\-37\\-74.49497\\-164.2462\\-37\\-72.54185\\-163.0404\\-37\\-70.58872\\-161.7326\\-37\\-68.6356\\-161.3168\\-37\\-66.68247\\-160.3858\\-37\\-64.72935\\-160.2607\\-37\\-62.36983\\-162.5521\\-37\\-61.85084\\-164.5053\\-37\\-60.8231\\-166.4503\\-37\\-61.79966\\-168.4115\\-37\\-62.09363\\-170.3646\\-37\\-61.6498\\-172.3178\\-37\\-60.47658\\-174.2709\\-37\\-60.45611\\-178.1771\\-37\\-60.17035\\-180.1303\\-37\\-59.63896\\-182.0834\\-37\\-58.67054\\-184.0365\\-37\\-58.65827\\-185.9896\\-37\\-57.84841\\-187.9428\\-37\\-56.93956\\-189.8959\\-37\\-56.82211\\-191.849\\-37\\-55.86255\\-193.8021\\-37\\-54.69739\\-195.7553\\-37\\-54.02353\\-197.7084\\-37\\-54.96373\\-199.2454\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "261" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-162.7996\\-37\\-37.3856\\-162.4292\\-37\\-41.29185\\-160.786\\-37\\-43.24498\\-159.4158\\-37\\-44.04889\\-158.6459\\-37\\-46.39568\\-154.7396\\-37\\-46.84726\\-152.7865\\-37\\-48.25713\\-150.8334\\-37\\-49.10435\\-150.0896\\-37\\-50.22654\\-150.8334\\-37\\-50.97671\\-152.7865\\-37\\-52.3792\\-154.7396\\-37\\-53.0106\\-155.1835\\-37\\-53.55719\\-154.7396\\-37\\-53.81575\\-152.7865\\-37\\-53.0106\\-150.8944\\-37\\-51.77618\\-148.8803\\-37\\-50.03416\\-146.9271\\-37\\-49.11204\\-144.974\\-37\\-48.671\\-143.0209\\-37\\-47.85169\\-141.0678\\-37\\-46.84726\\-139.1146\\-37\\-46.22681\\-137.1615\\-37\\-45.1981\\-135.4245\\-37\\-43.70789\\-133.2553\\-37\\-43.24498\\-132.7983\\-37\\-41.29185\\-131.9118\\-37\\-39.33873\\-130.5257\\-37\\-37.3856\\-129.802\\-37\\-35.43248\\-128.8293\\-37\\-33.47935\\-128.3001\\-37\\-31.52623\\-128.2945\\-37\\-29.5731\\-128.6999\\-37\\-27.61998\\-129.6308\\-37\\-25.66685\\-130.0326\\-37\\-23.71373\\-130.77\\-37\\-21.7606\\-132.4203\\-37\\-18.93371\\-135.2084\\-37\\-18.00296\\-137.1615\\-37\\-17.90653\\-139.1146\\-37\\-17.05706\\-141.0678\\-37\\-16.52976\\-143.0209\\-37\\-15.17651\\-144.974\\-37\\-13.29103\\-146.9271\\-37\\-12.262\\-148.8803\\-37\\-12.69688\\-150.8334\\-37\\-13.08795\\-154.7396\\-37\\-13.9481\\-155.5268\\-37\\-14.67778\\-154.7396\\-37\\-14.1351\\-152.7865\\-37\\-14.22615\\-150.8334\\-37\\-15.90123\\-149.4706\\-37\\-17.2875\\-150.8334\\-37\\-18.16034\\-152.7865\\-37\\-18.85416\\-154.7396\\-37\\-20.62606\\-156.6928\\-37\\-22.18097\\-158.6459\\-37\\-25.66685\\-161.3043\\-37\\-27.61998\\-161.6964\\-37\\-29.5731\\-162.4567\\-37\\-31.52623\\-162.8669\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "262" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.22887\\-238.724\\-37\\17.3019\\-236.797\\-37\\15.34877\\-235.9698\\-37\\13.39565\\-235.4037\\-37\\11.44252\\-234.1687\\-37\\10.19276\\-232.8646\\-37\\10.64013\\-230.9115\\-37\\11.74851\\-228.9584\\-37\\13.39565\\-226.8309\\-37\\15.34877\\-226.467\\-37\\19.25502\\-226.2478\\-37\\21.20815\\-226.2715\\-37\\23.16127\\-226.8814\\-37\\25.1144\\-227.9043\\-37\\27.06752\\-227.9118\\-37\\28.7964\\-228.9584\\-37\\28.54103\\-230.9115\\-37\\25.73149\\-234.8178\\-37\\25.1144\\-235.4667\\-37\\23.16127\\-236.5234\\-37\\21.20815\\-238.0343\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "263" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-199.5235\\-37\\53.26749\\-197.7084\\-37\\53.57496\\-195.7553\\-37\\55.2799\\-193.8021\\-37\\56.25589\\-191.849\\-37\\56.28363\\-187.9428\\-37\\57.02763\\-185.9896\\-37\\57.2319\\-184.0365\\-37\\56.75631\\-182.0834\\-37\\57.35947\\-180.1303\\-37\\58.14314\\-178.1771\\-37\\58.15593\\-172.3178\\-37\\58.0818\\-170.3646\\-37\\57.72286\\-168.4115\\-37\\57.73701\\-166.4584\\-37\\58.11808\\-164.5053\\-37\\57.18272\\-162.5521\\-37\\56.3644\\-160.5245\\-37\\58.31752\\-159.7183\\-37\\60.27065\\-161.37\\-37\\64.1769\\-161.4302\\-37\\66.13003\\-161.7408\\-37\\68.08315\\-162.3713\\-37\\70.03628\\-163.4814\\-37\\72.63463\\-164.5053\\-37\\75.89565\\-165.6953\\-37\\77.84878\\-166.835\\-37\\79.8019\\-167.6489\\-37\\80.53564\\-168.4115\\-37\\81.5193\\-170.3646\\-37\\82.62257\\-172.3178\\-37\\82.55833\\-174.2709\\-37\\81.75503\\-175.3695\\-37\\78.94282\\-178.1771\\-37\\75.89565\\-180.4451\\-37\\73.98009\\-182.0834\\-37\\71.9894\\-184.6648\\-37\\70.81079\\-185.9896\\-37\\70.03628\\-187.3934\\-37\\68.08315\\-189.4607\\-37\\66.13003\\-190.3011\\-37\\64.1769\\-189.8238\\-37\\62.22377\\-189.9035\\-37\\60.27065\\-192.2321\\-37\\59.30334\\-193.8021\\-37\\58.65361\\-195.7553\\-37\\56.3644\\-198.396\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "264" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-213.7995\\-37\\75.32599\\-213.3334\\-37\\74.4308\\-211.3803\\-37\\74.07616\\-209.4271\\-37\\73.01937\\-207.474\\-37\\72.48379\\-205.5209\\-37\\71.75038\\-203.5678\\-37\\70.51546\\-201.6146\\-37\\70.18488\\-199.6615\\-37\\71.9894\\-198.1243\\-37\\73.94253\\-198.2466\\-37\\75.89565\\-199.0709\\-37\\77.84878\\-198.9572\\-37\\79.8019\\-199.0475\\-37\\81.75503\\-198.7263\\-37\\83.36192\\-199.6615\\-37\\83.70815\\-200.0624\\-37\\85.78104\\-201.6146\\-37\\87.6144\\-202.7126\\-37\\88.61024\\-203.5678\\-37\\89.56753\\-205.1324\\-37\\89.95605\\-205.5209\\-37\\91.14334\\-207.474\\-37\\91.52065\\-207.8513\\-37\\92.21238\\-207.474\\-37\\93.47378\\-207.2481\\-37\\93.81393\\-207.474\\-37\\94.20836\\-209.4271\\-37\\93.58503\\-211.3803\\-37\\93.47378\\-212.3568\\-37\\92.67477\\-213.3334\\-37\\91.52065\\-215.147\\-37\\89.54874\\-213.3334\\-37\\89.36484\\-211.3803\\-37\\89.78725\\-209.4271\\-37\\89.56753\\-209.2074\\-37\\87.6144\\-208.3405\\-37\\85.66128\\-208.3725\\-37\\83.70815\\-209.4106\\-37\\81.75503\\-209.9254\\-37\\79.8019\\-210.2664\\-37\\77.84878\\-211.2624\\-37\\77.3605\\-211.3803\\-37\\76.36173\\-213.3334\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "265" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "87.6144\\-194.0768\\-37\\87.38904\\-193.8021\\-37\\88.67167\\-191.849\\-37\\89.56753\\-191.091\\-37\\90.85798\\-191.849\\-37\\91.52065\\-192.6676\\-37\\92.0564\\-193.8021\\-37\\91.52065\\-194.7098\\-37\\89.56753\\-194.9929\\-37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "90" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "266" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-123.3231\\-219.6781\\-35\\-125.2762\\-218.9337\\-35\\-129.1825\\-218.8888\\-35\\-131.1356\\-218.5187\\-35\\-133.0887\\-217.719\\-35\\-135.0419\\-216.0215\\-35\\-136.995\\-214.9717\\-35\\-138.9481\\-214.0781\\-35\\-140.9012\\-212.9367\\-35\\-142.8544\\-212.5997\\-35\\-144.7113\\-211.3803\\-35\\-145.9468\\-209.4271\\-35\\-146.1321\\-205.5209\\-35\\-146.5131\\-203.5678\\-35\\-146.5489\\-201.6146\\-35\\-146.1251\\-199.6615\\-35\\-146.1043\\-197.7084\\-35\\-145.7338\\-195.7553\\-35\\-144.8075\\-194.9319\\-35\\-142.8544\\-197.5863\\-35\\-140.9012\\-198.7272\\-35\\-138.9481\\-198.8916\\-35\\-137.2946\\-199.6615\\-35\\-135.0419\\-200.9907\\-35\\-133.0887\\-201.4402\\-35\\-131.1356\\-201.5339\\-35\\-129.1825\\-201.9612\\-35\\-127.2669\\-203.5678\\-35\\-125.9587\\-205.5209\\-35\\-125.2762\\-206.1919\\-35\\-123.3231\\-207.012\\-35\\-121.37\\-206.9377\\-35\\-119.4168\\-205.8319\\-35\\-119.135\\-205.5209\\-35\\-119.1694\\-203.5678\\-35\\-120.2248\\-201.6146\\-35\\-120.2616\\-199.6615\\-35\\-119.4168\\-198.8965\\-35\\-117.4637\\-197.7943\\-35\\-116.2377\\-195.7553\\-35\\-113.5575\\-192.9554\\-35\\-111.6043\\-191.1783\\-35\\-109.6512\\-190.3074\\-35\\-107.6981\\-189.7343\\-35\\-105.745\\-190.1451\\-35\\-103.7918\\-190.862\\-35\\-99.8856\\-191.0617\\-35\\-97.93247\\-192.5251\\-35\\-95.97935\\-193.2017\\-35\\-94.02622\\-193.0051\\-35\\-92.0731\\-192.141\\-35\\-89.33598\\-189.8959\\-35\\-88.16685\\-188.7742\\-35\\-86.21372\\-187.924\\-35\\-84.2606\\-186.3664\\-35\\-82.30747\\-186.3567\\-35\\-80.35435\\-186.6385\\-35\\-78.40122\\-187.3481\\-35\\-76.4481\\-187.3781\\-35\\-75.69348\\-187.9428\\-35\\-75.89451\\-189.8959\\-35\\-75.73863\\-193.8021\\-35\\-75.10277\\-195.7553\\-35\\-75.31027\\-197.7084\\-35\\-76.64754\\-199.6615\\-35\\-76.69559\\-203.5678\\-35\\-76.84288\\-205.5209\\-35\\-78.40122\\-207.4483\\-35\\-80.35435\\-209.282\\-35\\-82.30747\\-210.0026\\-35\\-84.2606\\-210.1389\\-35\\-87.67857\\-209.4271\\-35\\-90.11997\\-209.1467\\-35\\-92.0731\\-209.0057\\-35\\-92.86186\\-209.4271\\-35\\-94.02622\\-210.3004\\-35\\-95.97935\\-210.9309\\-35\\-97.93247\\-210.9739\\-35\\-99.8856\\-211.2059\\-35\\-101.8387\\-210.9094\\-35\\-103.7918\\-210.834\\-35\\-105.745\\-212.1018\\-35\\-107.6981\\-213.9302\\-35\\-109.6512\\-214.7483\\-35\\-111.6043\\-215.0047\\-35\\-113.5575\\-216.2529\\-35\\-115.5106\\-217.0402\\-35\\-115.759\\-217.2396\\-35\\-119.2569\\-219.1928\\-35\\-121.37\\-220.0747\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "267" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-54.96373\\-200.9616\\-35\\-56.29595\\-199.6615\\-35\\-57.67428\\-197.7084\\-35\\-59.59977\\-195.7553\\-35\\-61.86001\\-193.8021\\-35\\-62.77623\\-192.9011\\-35\\-64.72935\\-191.6668\\-35\\-66.68247\\-191.6707\\-35\\-68.6356\\-192.15\\-35\\-69.19187\\-191.849\\-35\\-70.58872\\-190.2948\\-35\\-71.56528\\-187.9428\\-35\\-72.9435\\-185.9896\\-35\\-73.67995\\-184.0365\\-35\\-74.49497\\-183.3715\\-35\\-76.4481\\-181.4975\\-35\\-78.40122\\-180.6604\\-35\\-80.35435\\-179.4977\\-35\\-82.30747\\-178.7184\\-35\\-83.27407\\-178.1771\\-35\\-84.38067\\-176.224\\-35\\-83.06852\\-174.2709\\-35\\-79.86026\\-170.3646\\-35\\-79.1896\\-168.4115\\-35\\-77.44578\\-166.4584\\-35\\-73.20489\\-162.5521\\-35\\-72.54185\\-161.8856\\-35\\-70.58872\\-161.3106\\-35\\-68.6356\\-161.061\\-35\\-66.68247\\-160.5913\\-35\\-64.72935\\-160.5176\\-35\\-62.77623\\-161.9594\\-35\\-62.20657\\-162.5521\\-35\\-61.72136\\-164.5053\\-35\\-61.54926\\-166.4584\\-35\\-62.10673\\-168.4115\\-35\\-62.31426\\-170.3646\\-35\\-61.8607\\-172.3178\\-35\\-60.9051\\-174.2709\\-35\\-60.46628\\-176.224\\-35\\-60.39773\\-180.1303\\-35\\-59.85492\\-182.0834\\-35\\-59.01859\\-184.0365\\-35\\-58.68298\\-185.9896\\-35\\-57.15421\\-189.8959\\-35\\-56.82211\\-191.849\\-35\\-55.84214\\-193.8021\\-35\\-54.06648\\-195.7553\\-35\\-53.39754\\-197.7084\\-35\\-53.57134\\-199.6615\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "268" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-161.3586\\-35\\-42.70438\\-158.6459\\-35\\-44.47339\\-156.6928\\-35\\-46.09591\\-154.7396\\-35\\-46.71387\\-152.7865\\-35\\-47.46346\\-150.8334\\-35\\-49.10435\\-149.4706\\-35\\-50.90443\\-150.8334\\-35\\-51.27577\\-152.7865\\-35\\-52.74837\\-154.7396\\-35\\-53.26122\\-154.7396\\-35\\-53.79916\\-152.7865\\-35\\-53.0106\\-150.896\\-35\\-52.635\\-150.8334\\-35\\-51.72565\\-148.8803\\-35\\-50.52324\\-146.9271\\-35\\-49.55927\\-144.974\\-35\\-48.09104\\-143.0209\\-35\\-47.15123\\-140.7805\\-35\\-46.6485\\-139.1146\\-35\\-45.8964\\-137.1615\\-35\\-44.29406\\-135.2084\\-35\\-42.41464\\-133.2553\\-35\\-41.29185\\-132.236\\-35\\-39.33873\\-130.6812\\-35\\-37.3856\\-129.9437\\-35\\-35.43248\\-128.6191\\-35\\-33.47935\\-127.8842\\-35\\-31.52623\\-127.8578\\-35\\-29.5731\\-128.0898\\-35\\-27.61998\\-128.8398\\-35\\-25.66685\\-129.8199\\-35\\-23.71373\\-130.381\\-35\\-20.92836\\-133.2553\\-35\\-18.92436\\-135.2084\\-35\\-17.90653\\-137.1615\\-35\\-17.89191\\-139.1146\\-35\\-16.90338\\-141.0678\\-35\\-16.18305\\-143.0209\\-35\\-14.94932\\-144.974\\-35\\-12.97154\\-146.9271\\-35\\-12.2411\\-148.8803\\-35\\-11.89952\\-150.8334\\-35\\-11.79269\\-152.7865\\-35\\-13.00705\\-154.7396\\-35\\-13.9481\\-155.6219\\-35\\-14.82535\\-154.7396\\-35\\-14.29687\\-152.7865\\-35\\-14.1598\\-150.8334\\-35\\-15.90123\\-149.1732\\-35\\-17.77358\\-150.8334\\-35\\-18.63849\\-152.7865\\-35\\-19.37948\\-154.7396\\-35\\-20.97223\\-156.6928\\-35\\-23.71373\\-159.4323\\-35\\-25.66685\\-160.6938\\-35\\-27.61998\\-161.3106\\-35\\-29.5731\\-161.6804\\-35\\-31.52623\\-162.2179\\-35\\-35.43248\\-162.2071\\-35\\-37.3856\\-161.713\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "269" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-239.6371\\-35\\17.3019\\-238.4071\\-35\\13.39565\\-236.4669\\-35\\11.44252\\-235.3436\\-35\\9.380892\\-232.8646\\-35\\9.761773\\-230.9115\\-35\\10.89999\\-228.9584\\-35\\11.44252\\-228.4701\\-35\\13.39565\\-227.7592\\-35\\15.34877\\-226.6587\\-35\\17.3019\\-226.4055\\-35\\21.20815\\-225.6172\\-35\\23.16127\\-225.9236\\-35\\25.20318\\-227.0053\\-35\\27.06752\\-227.8598\\-35\\29.02065\\-228.3019\\-35\\29.75917\\-228.9584\\-35\\29.55279\\-230.9115\\-35\\27.97433\\-232.8646\\-35\\26.5293\\-234.8178\\-35\\25.1144\\-236.5118\\-35\\23.16127\\-237.5291\\-35\\21.20815\\-239.3961\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "270" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-201.9136\\-35\\53.59747\\-201.6146\\-35\\52.45815\\-199.9956\\-35\\52.36341\\-197.7084\\-35\\53.33706\\-195.7553\\-35\\55.26383\\-193.8021\\-35\\56.25589\\-191.849\\-35\\56.28363\\-187.9428\\-35\\57.22063\\-185.9896\\-35\\57.7793\\-184.0365\\-35\\57.51123\\-182.0834\\-35\\57.76821\\-180.1303\\-35\\58.15593\\-178.1771\\-35\\58.16891\\-170.3646\\-35\\58.10582\\-168.4115\\-35\\58.13052\\-164.5053\\-35\\57.31749\\-162.5521\\-35\\57.2233\\-160.599\\-35\\58.31752\\-160.0584\\-35\\60.27065\\-161.061\\-35\\64.1769\\-161.0873\\-35\\66.13003\\-161.3469\\-35\\68.08315\\-161.4144\\-35\\70.03628\\-162.1307\\-35\\71.9894\\-163.2013\\-35\\73.94253\\-163.7067\\-35\\75.89565\\-164.9122\\-35\\77.84878\\-165.6412\\-35\\79.8019\\-166.8141\\-35\\81.22079\\-168.4115\\-35\\82.55313\\-170.3646\\-35\\82.60838\\-172.3178\\-35\\81.75503\\-173.4959\\-35\\80.85863\\-174.2709\\-35\\76.94675\\-178.1771\\-35\\75.89565\\-179.0117\\-35\\73.94253\\-180.8627\\-35\\71.9894\\-182.478\\-35\\69.76888\\-184.0365\\-35\\68.08315\\-186.4474\\-35\\66.61831\\-187.9428\\-35\\66.13003\\-188.2821\\-35\\64.1769\\-188.3293\\-35\\62.22377\\-188.9602\\-35\\61.30258\\-189.8959\\-35\\60.07121\\-191.849\\-35\\58.31752\\-195.5859\\-35\\57.17006\\-197.7084\\-35\\55.78962\\-199.6615\\-35\\54.7082\\-201.6146\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "271" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "83.70815\\-197.1969\\-35\\82.93191\\-195.7553\\-35\\83.70815\\-194.6741\\-35\\84.81788\\-193.8021\\-35\\85.66128\\-193.622\\-35\\86.85485\\-191.849\\-35\\87.6144\\-191.1654\\-35\\89.56753\\-190.1796\\-35\\91.52065\\-190.451\\-35\\92.70728\\-191.849\\-35\\92.86343\\-193.8021\\-35\\91.52065\\-195.6323\\-35\\89.56753\\-195.6605\\-35\\85.66128\\-196.2834\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "272" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "87.6144\\-230.2388\\-35\\85.91978\\-228.9584\\-35\\85.71731\\-227.0053\\-35\\83.70815\\-224.9795\\-35\\79.8019\\-224.8611\\-35\\77.84878\\-223.0255\\-35\\76.00873\\-221.1459\\-35\\74.92722\\-219.1928\\-35\\74.13476\\-217.2396\\-35\\72.71243\\-215.2865\\-35\\72.33817\\-213.3334\\-35\\74.01433\\-209.4271\\-35\\73.93465\\-207.474\\-35\\73.04331\\-203.5678\\-35\\71.34611\\-201.6146\\-35\\70.73045\\-199.6615\\-35\\71.9894\\-198.647\\-35\\73.94253\\-198.6292\\-35\\75.89565\\-199.6522\\-35\\77.84878\\-201.0786\\-35\\79.8019\\-200.6496\\-35\\81.25401\\-199.6615\\-35\\81.75503\\-198.7322\\-35\\82.30376\\-199.6615\\-35\\82.78518\\-201.6146\\-35\\83.70815\\-202.9309\\-35\\85.66128\\-203.1446\\-35\\86.27755\\-203.5678\\-35\\87.6144\\-205.0977\\-35\\89.56753\\-207.7792\\-35\\91.32534\\-209.4271\\-35\\92.09264\\-211.3803\\-35\\93.47378\\-213.1381\\-35\\94.11066\\-215.2865\\-35\\95.4269\\-216.9378\\-35\\97.04266\\-219.1928\\-35\\96.71542\\-221.1459\\-35\\96.02049\\-223.099\\-35\\95.4269\\-224.1802\\-35\\95.19438\\-225.0521\\-35\\94.07109\\-227.0053\\-35\\93.47378\\-228.287\\-35\\91.68341\\-228.9584\\-35\\89.56753\\-230.5816\\-35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "94" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "273" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-125.2762\\-219.3414\\-33\\-129.1825\\-218.9811\\-33\\-131.1356\\-218.8998\\-33\\-133.0887\\-217.8853\\-33\\-135.0419\\-215.9915\\-33\\-136.995\\-214.9504\\-33\\-138.9481\\-214.0781\\-33\\-140.9012\\-212.9367\\-33\\-142.8544\\-212.3946\\-33\\-143.9366\\-211.3803\\-33\\-145.2811\\-209.4271\\-33\\-146.0367\\-205.5209\\-33\\-146.1321\\-203.5678\\-33\\-146.0824\\-197.7084\\-33\\-144.8075\\-196.1472\\-33\\-142.8544\\-197.9559\\-33\\-140.9012\\-198.7036\\-33\\-136.995\\-200.4174\\-33\\-135.0419\\-201.3789\\-33\\-133.0887\\-201.5339\\-33\\-131.1356\\-201.5199\\-33\\-129.1825\\-201.2741\\-33\\-127.2293\\-201.4268\\-33\\-126.7598\\-201.6146\\-33\\-125.5307\\-203.5678\\-33\\-125.2762\\-204.1505\\-33\\-124.3322\\-205.5209\\-33\\-123.3231\\-206.2777\\-33\\-121.37\\-206.104\\-33\\-120.6831\\-205.5209\\-33\\-120.6131\\-203.5678\\-33\\-121.37\\-202.2122\\-33\\-121.9766\\-201.6146\\-33\\-120.6297\\-199.6615\\-33\\-119.4168\\-199.2085\\-33\\-117.4637\\-198.6468\\-33\\-116.5253\\-197.7084\\-33\\-114.2613\\-193.8021\\-33\\-111.6043\\-191.0171\\-33\\-109.6512\\-189.7089\\-33\\-105.745\\-189.3403\\-33\\-103.7918\\-189.6673\\-33\\-99.8856\\-189.8437\\-33\\-95.97935\\-191.3452\\-33\\-94.02622\\-191.078\\-33\\-92.0731\\-190.0478\\-33\\-90.11997\\-188.8513\\-33\\-89.36838\\-187.9428\\-33\\-87.50687\\-185.9896\\-33\\-86.21372\\-183.9893\\-33\\-84.2606\\-182.353\\-33\\-82.30747\\-182.8104\\-33\\-80.83612\\-184.0365\\-33\\-80.35435\\-184.2983\\-33\\-78.40122\\-186.0272\\-33\\-76.4481\\-186.1653\\-33\\-74.49497\\-186.4413\\-33\\-73.67226\\-187.9428\\-33\\-74.64359\\-189.8959\\-33\\-74.09286\\-191.849\\-33\\-73.10116\\-193.8021\\-33\\-72.87837\\-195.7553\\-33\\-72.85409\\-197.7084\\-33\\-73.07223\\-199.6615\\-33\\-73.46656\\-201.6146\\-33\\-74.49497\\-203.9625\\-33\\-74.93887\\-205.5209\\-33\\-75.83857\\-207.474\\-33\\-76.4481\\-208.2006\\-33\\-78.40122\\-210.173\\-33\\-80.35435\\-212.0443\\-33\\-82.30747\\-212.8906\\-33\\-84.1835\\-213.3334\\-33\\-86.21372\\-214.0824\\-33\\-88.16685\\-214.1863\\-33\\-89.48808\\-213.3334\\-33\\-90.11997\\-213.0714\\-33\\-92.0731\\-212.5814\\-33\\-94.02622\\-212.56\\-33\\-95.97935\\-212.6978\\-33\\-97.93247\\-212.6573\\-33\\-99.8856\\-212.5172\\-33\\-101.8387\\-211.6124\\-33\\-103.7918\\-211.2175\\-33\\-106.2083\\-213.3334\\-33\\-107.6981\\-214.4307\\-33\\-109.6512\\-214.9825\\-33\\-111.6043\\-215.0274\\-33\\-113.5575\\-216.2682\\-33\\-115.5106\\-217.0652\\-33\\-117.4637\\-218.076\\-33\\-119.4168\\-219.6752\\-33\\-121.37\\-220.2895\\-33\\-123.3231\\-219.7484\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "274" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-54.96373\\-202.3925\\-33\\-55.65693\\-201.6146\\-33\\-56.91685\\-199.3943\\-33\\-57.75587\\-197.7084\\-33\\-61.61751\\-193.8021\\-33\\-62.81692\\-191.849\\-33\\-64.72935\\-190.6218\\-33\\-66.68247\\-189.9035\\-33\\-68.6356\\-188.1451\\-33\\-70.46767\\-185.9896\\-33\\-72.54185\\-183.7442\\-33\\-74.49497\\-182.4217\\-33\\-76.4481\\-180.9667\\-33\\-78.40122\\-179.3165\\-33\\-80.35435\\-178.5465\\-33\\-80.89283\\-178.1771\\-33\\-82.22671\\-176.224\\-33\\-81.60573\\-172.3178\\-33\\-81.18067\\-170.3646\\-33\\-79.87784\\-168.4115\\-33\\-78.68305\\-166.4584\\-33\\-78.40122\\-166.1766\\-33\\-74.49497\\-163.4722\\-33\\-72.54185\\-161.5184\\-33\\-70.58872\\-160.3923\\-33\\-68.6356\\-160.5176\\-33\\-66.68247\\-159.8754\\-33\\-64.72935\\-159.7939\\-33\\-61.91152\\-162.5521\\-33\\-61.15076\\-164.5053\\-33\\-62.29661\\-168.4115\\-33\\-62.36028\\-170.3646\\-33\\-62.12689\\-172.3178\\-33\\-61.65126\\-174.2709\\-33\\-60.46628\\-176.224\\-33\\-60.45611\\-180.1303\\-33\\-59.2669\\-185.9896\\-33\\-58.39346\\-187.9428\\-33\\-56.91685\\-191.7164\\-33\\-55.84214\\-193.8021\\-33\\-53.91166\\-195.7553\\-33\\-53.04816\\-197.7084\\-33\\-53.04816\\-199.6615\\-33\\-53.76918\\-201.6146\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "58" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "275" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-161.1403\\-33\\-38.84293\\-160.599\\-33\\-41.29185\\-159.4142\\-33\\-44.04049\\-156.6928\\-33\\-45.29284\\-154.7396\\-33\\-46.24857\\-152.7865\\-33\\-46.76184\\-150.8334\\-33\\-47.15123\\-150.381\\-33\\-49.10435\\-149.1508\\-33\\-50.96273\\-150.8334\\-33\\-52.3475\\-152.7865\\-33\\-53.0106\\-153.3519\\-33\\-53.38102\\-152.7865\\-33\\-53.0106\\-150.9961\\-33\\-52.46807\\-150.8334\\-33\\-50.89589\\-146.9271\\-33\\-49.3189\\-144.974\\-33\\-47.28666\\-143.0209\\-33\\-46.65713\\-141.0678\\-33\\-46.12841\\-139.1146\\-33\\-45.1981\\-137.4312\\-33\\-43.68829\\-135.2084\\-33\\-41.29185\\-132.8233\\-33\\-39.33873\\-131.619\\-33\\-37.3856\\-130.3114\\-33\\-35.43248\\-128.7742\\-33\\-33.47935\\-128.0049\\-33\\-31.52623\\-127.8118\\-33\\-29.5731\\-127.8306\\-33\\-27.61998\\-128.5794\\-33\\-25.66685\\-129.7929\\-33\\-23.71373\\-130.0122\\-33\\-22.27795\\-131.3021\\-33\\-20.9067\\-133.2553\\-33\\-18.92436\\-135.2084\\-33\\-17.90653\\-137.1615\\-33\\-17.58382\\-139.1146\\-33\\-16.12502\\-143.0209\\-33\\-14.70356\\-144.974\\-33\\-12.56649\\-146.9271\\-33\\-12.19843\\-148.8803\\-33\\-11.35688\\-150.8334\\-33\\-11.22344\\-152.7865\\-33\\-13.9481\\-155.5176\\-33\\-14.93164\\-154.7396\\-33\\-14.65225\\-152.7865\\-33\\-14.1598\\-150.8334\\-33\\-15.94602\\-148.8803\\-33\\-17.86198\\-150.8334\\-33\\-18.74681\\-152.7865\\-33\\-20.57584\\-154.7396\\-33\\-21.7606\\-156.3061\\-33\\-24.13324\\-158.6459\\-33\\-25.66685\\-159.7348\\-33\\-27.61998\\-160.6366\\-33\\-29.5731\\-161.3043\\-33\\-31.52623\\-161.425\\-33\\-35.43248\\-161.4197\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "276" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "15.34877\\-239.1022\\-33\\13.39565\\-237.9395\\-33\\11.85485\\-236.7709\\-33\\10.44438\\-234.8178\\-33\\9.315013\\-232.8646\\-33\\9.598716\\-230.9115\\-33\\10.95786\\-228.9584\\-33\\11.44252\\-228.552\\-33\\13.39565\\-228.0795\\-33\\15.34877\\-227.354\\-33\\17.3019\\-226.4055\\-33\\19.25502\\-225.9254\\-33\\21.20815\\-224.6751\\-33\\25.1144\\-225.975\\-33\\29.02065\\-227.4666\\-33\\30.97377\\-228.9288\\-33\\29.02065\\-232.8121\\-33\\27.81247\\-234.8178\\-33\\26.42274\\-236.7709\\-33\\25.1144\\-237.9048\\-33\\21.20815\\-240.0244\\-33\\19.25502\\-240.0486\\-33\\17.3019\\-239.77\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "277" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.34964\\-201.6146\\-33\\52.27115\\-199.6615\\-33\\52.55289\\-197.7084\\-33\\53.46571\\-195.7553\\-33\\55.12597\\-193.8021\\-33\\55.93793\\-191.849\\-33\\56.25589\\-189.8959\\-33\\56.28363\\-187.9428\\-33\\58.11808\\-184.0365\\-33\\58.05844\\-182.0834\\-33\\58.15593\\-178.1771\\-33\\58.15593\\-174.2709\\-33\\58.50452\\-172.3178\\-33\\58.50452\\-170.3646\\-33\\58.16891\\-168.4115\\-33\\58.15593\\-164.5053\\-33\\57.79557\\-162.5521\\-33\\58.31752\\-161.8589\\-33\\60.27065\\-160.9957\\-33\\64.1769\\-160.319\\-33\\68.08315\\-160.4182\\-33\\70.03628\\-160.8714\\-33\\71.9894\\-161.634\\-33\\73.94253\\-162.7928\\-33\\75.89565\\-163.5897\\-33\\77.84878\\-164.8691\\-33\\79.8019\\-165.6863\\-33\\81.75503\\-167.5254\\-33\\82.48745\\-168.4115\\-33\\82.84544\\-170.3646\\-33\\81.88372\\-172.3178\\-33\\79.8019\\-173.6295\\-33\\77.84878\\-175.579\\-33\\75.89565\\-177.4045\\-33\\74.66261\\-178.1771\\-33\\73.94253\\-178.8561\\-33\\71.9894\\-180.211\\-33\\70.03628\\-180.8627\\-33\\68.08315\\-183.0457\\-33\\66.13003\\-184.6414\\-33\\64.1769\\-186.0129\\-33\\62.22377\\-187.609\\-33\\60.27065\\-191.4682\\-33\\59.16356\\-193.8021\\-33\\58.14314\\-195.7553\\-33\\56.3644\\-199.3952\\-33\\55.35366\\-201.6146\\-33\\54.41127\\-202.8796\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "18" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "278" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "79.8019\\-197.4398\\-33\\78.11733\\-195.7553\\-33\\78.22855\\-193.8021\\-33\\79.8019\\-192.7979\\-33\\81.75503\\-192.1081\\-33\\83.70815\\-192.1745\\-33\\85.66128\\-191.8261\\-33\\87.6144\\-190.6442\\-33\\89.56753\\-189.6842\\-33\\91.52065\\-190.1349\\-33\\93.47378\\-191.1016\\-33\\93.93442\\-191.849\\-33\\92.93954\\-193.8021\\-33\\91.52065\\-195.3891\\-33\\89.56753\\-195.7629\\-33\\87.6144\\-196.4263\\-33\\85.66128\\-197.3573\\-33\\83.70815\\-198.0123\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "279" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "81.75503\\-249.0608\\-33\\81.15356\\-248.4896\\-33\\80.59066\\-246.5365\\-33\\79.8019\\-245.56\\-33\\79.27152\\-244.5834\\-33\\77.69067\\-242.6303\\-33\\76.53547\\-238.724\\-33\\77.23124\\-236.7709\\-33\\76.4201\\-234.8178\\-33\\74.38197\\-232.8646\\-33\\74.62612\\-230.9115\\-33\\75.09541\\-228.9584\\-33\\75.30634\\-227.0053\\-33\\75.22546\\-225.0521\\-33\\74.67494\\-223.099\\-33\\75.33533\\-221.1459\\-33\\75.56055\\-219.1928\\-33\\75.63273\\-217.2396\\-33\\75.60352\\-215.2865\\-33\\75.76389\\-213.3334\\-33\\77.23124\\-211.3803\\-33\\77.46664\\-209.4271\\-33\\77.12178\\-207.474\\-33\\75.89565\\-205.8976\\-33\\75.89565\\-205.0814\\-33\\77.25117\\-203.5678\\-33\\79.8019\\-202.2848\\-33\\80.48346\\-203.5678\\-33\\81.75503\\-205.0039\\-33\\83.70815\\-205.2409\\-33\\84.63929\\-205.5209\\-33\\85.66128\\-206.5672\\-33\\85.94763\\-207.474\\-33\\86.01722\\-209.4271\\-33\\86.8657\\-211.3803\\-33\\87.6144\\-212.1548\\-33\\87.97801\\-213.3334\\-33\\88.98159\\-215.2865\\-33\\89.56753\\-215.8725\\-33\\90.02325\\-217.2396\\-33\\91.52065\\-218.737\\-33\\91.83713\\-219.1928\\-33\\92.2802\\-221.1459\\-33\\92.9448\\-223.099\\-33\\93.47378\\-223.628\\-33\\93.71792\\-225.0521\\-33\\93.74081\\-232.8646\\-33\\93.55515\\-234.8178\\-33\\91.99537\\-236.7709\\-33\\91.52065\\-237.9102\\-33\\90.70685\\-238.724\\-33\\90.20048\\-240.6771\\-33\\90.04893\\-242.6303\\-33\\89.56753\\-243.3898\\-33\\85.66128\\-247.0323\\-33\\83.70815\\-249.1578\\-33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "89" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "280" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-219.6928\\-31\\-129.1825\\-218.6723\\-31\\-131.1356\\-218.524\\-31\\-133.0887\\-217.7514\\-31\\-135.0419\\-215.9915\\-31\\-136.995\\-214.9504\\-31\\-138.9481\\-214.0781\\-31\\-140.9012\\-212.9367\\-31\\-142.8544\\-211.9764\\-31\\-143.4505\\-211.3803\\-31\\-144.1057\\-209.4271\\-31\\-144.5837\\-207.474\\-31\\-145.6569\\-205.5209\\-31\\-146.0306\\-203.5678\\-31\\-146.1181\\-201.6146\\-31\\-146.0786\\-197.7084\\-31\\-144.8075\\-196.4851\\-31\\-142.8544\\-197.9559\\-31\\-140.9012\\-198.6382\\-31\\-138.883\\-199.6615\\-31\\-135.0419\\-201.1442\\-31\\-133.0887\\-201.2057\\-31\\-131.1356\\-201.0489\\-31\\-129.1825\\-200.6632\\-31\\-127.2293\\-200.4288\\-31\\-125.2762\\-200.4878\\-31\\-123.3231\\-200.1997\\-31\\-121.37\\-199.6991\\-31\\-119.4168\\-199.6239\\-31\\-117.4637\\-198.8394\\-31\\-116.2655\\-197.7084\\-31\\-114.578\\-195.7553\\-31\\-113.7445\\-193.8021\\-31\\-112.451\\-191.849\\-31\\-111.6043\\-191.0023\\-31\\-109.6512\\-189.5189\\-31\\-107.6981\\-189.0296\\-31\\-105.745\\-188.6928\\-31\\-101.8387\\-188.6951\\-31\\-99.8856\\-189.0489\\-31\\-97.93247\\-189.7089\\-31\\-95.97935\\-190.1316\\-31\\-94.02622\\-189.5598\\-31\\-92.0731\\-189.1843\\-31\\-90.11997\\-189.0322\\-31\\-89.07288\\-187.9428\\-31\\-87.44096\\-185.9896\\-31\\-85.9319\\-182.0834\\-31\\-84.2606\\-180.6604\\-31\\-82.30747\\-180.4558\\-31\\-80.35435\\-181.0629\\-31\\-79.73653\\-182.0834\\-31\\-77.74393\\-184.0365\\-31\\-76.4481\\-185.0732\\-31\\-74.49497\\-185.0459\\-31\\-72.99659\\-185.9896\\-31\\-72.57941\\-187.9428\\-31\\-72.63659\\-189.8959\\-31\\-71.31686\\-191.849\\-31\\-70.82445\\-193.8021\\-31\\-70.80043\\-195.7553\\-31\\-71.21017\\-199.6615\\-31\\-71.63504\\-201.6146\\-31\\-72.70344\\-203.5678\\-31\\-73.58108\\-205.5209\\-31\\-75.78197\\-209.4271\\-31\\-77.59383\\-211.3803\\-31\\-80.35435\\-213.794\\-31\\-82.30747\\-214.6583\\-31\\-84.21257\\-215.2865\\-31\\-86.21372\\-216.0712\\-31\\-88.16685\\-216.3721\\-31\\-90.11997\\-215.6844\\-31\\-92.0731\\-214.8136\\-31\\-94.02622\\-214.1318\\-31\\-95.97935\\-214.1618\\-31\\-97.93247\\-214.0367\\-31\\-99.8856\\-213.159\\-31\\-101.8387\\-212.9766\\-31\\-103.7918\\-213.3613\\-31\\-105.745\\-214.4544\\-31\\-107.6981\\-214.7982\\-31\\-109.6512\\-215.0047\\-31\\-111.6043\\-215.016\\-31\\-113.5575\\-216.103\\-31\\-117.4637\\-217.5862\\-31\\-121.37\\-219.6896\\-31\\-123.3231\\-219.2303\\-31\\-125.2762\\-219.9428\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "281" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-54.96373\\-203.7509\\-31\\-56.78141\\-199.6615\\-31\\-57.76504\\-197.7084\\-31\\-59.73958\\-195.7553\\-31\\-61.10683\\-193.8021\\-31\\-61.91074\\-191.849\\-31\\-62.77623\\-190.9077\\-31\\-64.72935\\-189.4895\\-31\\-66.68247\\-188.5299\\-31\\-70.58872\\-184.6664\\-31\\-72.54185\\-183.5101\\-31\\-73.51841\\-182.0834\\-31\\-74.49497\\-181.2054\\-31\\-76.4481\\-180.7151\\-31\\-78.40122\\-179.4772\\-31\\-80.35435\\-177.767\\-31\\-81.42586\\-176.224\\-31\\-81.82787\\-174.2709\\-31\\-81.79379\\-172.3178\\-31\\-81.59946\\-170.3646\\-31\\-81.15025\\-168.4115\\-31\\-79.4509\\-166.4584\\-31\\-76.4481\\-163.8098\\-31\\-74.7307\\-162.5521\\-31\\-72.54185\\-160.4066\\-31\\-70.58872\\-159.4619\\-31\\-68.6356\\-159.7387\\-31\\-66.68247\\-159.7262\\-31\\-64.72935\\-159.5576\\-31\\-62.77623\\-161.5088\\-31\\-61.90291\\-162.5521\\-31\\-61.22522\\-164.5053\\-31\\-62.34154\\-168.4115\\-31\\-62.33233\\-172.3178\\-31\\-61.7668\\-174.2709\\-31\\-60.46628\\-176.224\\-31\\-60.46628\\-180.1303\\-31\\-60.81547\\-182.0834\\-31\\-60.27378\\-184.0365\\-31\\-60.19531\\-185.9896\\-31\\-59.8581\\-187.9428\\-31\\-57.88843\\-189.8959\\-31\\-55.84214\\-193.8021\\-31\\-54.03829\\-195.7553\\-31\\-53.26969\\-197.7084\\-31\\-53.00297\\-199.6615\\-31\\-53.05666\\-201.6146\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "57" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "282" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-159.4514\\-31\\-41.29185\\-158.1486\\-31\\-43.24498\\-156.2358\\-31\\-44.46059\\-154.7396\\-31\\-45.50206\\-152.7865\\-31\\-46.26005\\-150.8334\\-31\\-47.15123\\-149.7388\\-31\\-49.10435\\-148.8879\\-31\\-51.05748\\-150.9863\\-31\\-52.46807\\-150.8334\\-31\\-51.9134\\-148.8803\\-31\\-51.05748\\-146.808\\-31\\-47.15123\\-143.6895\\-31\\-46.63997\\-143.0209\\-31\\-46.11813\\-141.0678\\-31\\-44.99866\\-139.1146\\-31\\-44.17576\\-137.1615\\-31\\-42.40722\\-135.2084\\-31\\-39.33873\\-132.2182\\-31\\-37.3856\\-130.516\\-31\\-35.27766\\-129.349\\-31\\-33.47935\\-128.5388\\-31\\-31.52623\\-128.1554\\-31\\-29.5731\\-128.1484\\-31\\-27.61998\\-128.7584\\-31\\-25.66685\\-129.7837\\-31\\-23.71373\\-129.811\\-31\\-21.7606\\-130.9452\\-31\\-21.42451\\-131.3021\\-31\\-20.78873\\-133.2553\\-31\\-18.91927\\-135.2084\\-31\\-17.85435\\-137.241\\-31\\-17.07215\\-139.1146\\-31\\-16.56407\\-141.0678\\-31\\-15.77916\\-143.0209\\-31\\-13.9481\\-144.9816\\-31\\-12.26551\\-146.9271\\-31\\-12.17466\\-148.8803\\-31\\-11.29743\\-150.8334\\-31\\-11.50302\\-152.7865\\-31\\-11.99498\\-153.1929\\-31\\-13.9481\\-154.211\\-31\\-14.76533\\-152.7865\\-31\\-14.38279\\-150.8334\\-31\\-15.36007\\-148.8803\\-31\\-15.90123\\-148.3715\\-31\\-16.76818\\-148.8803\\-31\\-17.85435\\-150.2277\\-31\\-18.16916\\-150.8334\\-31\\-18.8496\\-152.7865\\-31\\-23.71373\\-157.717\\-31\\-25.66685\\-159.3539\\-31\\-27.61998\\-159.7187\\-31\\-29.5731\\-160.3427\\-31\\-31.52623\\-160.3923\\-31\\-35.43248\\-160.3672\\-31\\-37.3856\\-159.7738\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "283" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "13.39565\\-238.9597\\-31\\11.44252\\-237.5856\\-31\\10.6466\\-236.7709\\-31\\9.866426\\-234.8178\\-31\\9.58414\\-232.8646\\-31\\10.31266\\-230.9115\\-31\\12.01738\\-228.9584\\-31\\13.39565\\-228.0947\\-31\\17.3019\\-226.4204\\-31\\19.25502\\-225.912\\-31\\21.20815\\-224.3524\\-31\\23.16127\\-224.3463\\-31\\27.06752\\-225.3581\\-31\\29.02065\\-225.577\\-31\\31.37942\\-227.0053\\-31\\32.42626\\-228.9584\\-31\\31.35626\\-230.9115\\-31\\30.60756\\-232.8646\\-31\\29.36881\\-234.8178\\-31\\27.81126\\-236.7709\\-31\\27.06752\\-237.4728\\-31\\25.1144\\-238.7906\\-31\\23.16127\\-239.6912\\-31\\21.20815\\-239.9238\\-31\\17.3019\\-240.2242\\-31\\15.34877\\-239.8147\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "284" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-205.1077\\-31\\52.84725\\-203.5678\\-31\\52.28376\\-201.6146\\-31\\52.27115\\-199.6615\\-31\\53.8946\\-195.7553\\-31\\54.85517\\-193.8021\\-31\\56.25589\\-189.8959\\-31\\56.28363\\-187.9428\\-31\\58.15593\\-184.0365\\-31\\58.15593\\-174.2709\\-31\\59.06606\\-172.3178\\-31\\59.15105\\-170.3646\\-31\\58.71425\\-168.4115\\-31\\58.68687\\-162.5521\\-31\\60.27065\\-160.8599\\-31\\62.22377\\-159.7708\\-31\\64.1769\\-159.4514\\-31\\70.03628\\-159.4567\\-31\\71.9894\\-160.1437\\-31\\72.69869\\-160.599\\-31\\75.89565\\-162.2024\\-31\\79.8019\\-165.0333\\-31\\81.75503\\-166.1766\\-31\\82.04069\\-166.4584\\-31\\82.87807\\-168.4115\\-31\\82.66936\\-170.3646\\-31\\81.75503\\-171.3839\\-31\\79.8019\\-172.9037\\-31\\77.84878\\-175.1852\\-31\\75.89565\\-176.7036\\-31\\73.94253\\-176.7036\\-31\\71.9894\\-176.8089\\-31\\70.40326\\-178.1771\\-31\\69.19024\\-180.1303\\-31\\68.08315\\-181.3523\\-31\\66.13003\\-183.028\\-31\\62.22377\\-185.121\\-31\\61.33549\\-185.9896\\-31\\60.58546\\-189.8959\\-31\\59.74481\\-191.849\\-31\\59.06133\\-193.8021\\-31\\58.14314\\-195.7553\\-31\\56.3644\\-200.101\\-31\\55.83943\\-201.6146\\-31\\55.67833\\-203.5678\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "24" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "285" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-199.2474\\-31\\74.0535\\-197.7084\\-31\\73.55559\\-195.7553\\-31\\73.94253\\-195.1338\\-31\\74.24147\\-193.8021\\-31\\75.89565\\-191.738\\-31\\77.84878\\-191.8566\\-31\\79.8019\\-191.7004\\-31\\83.70815\\-191.6874\\-31\\85.66128\\-191.0043\\-31\\87.6144\\-190.1316\\-31\\89.56753\\-190.1244\\-31\\91.52065\\-190.8572\\-31\\93.47378\\-191.4362\\-31\\93.76603\\-191.849\\-31\\92.53769\\-193.8021\\-31\\91.52065\\-194.8298\\-31\\89.56753\\-195.778\\-31\\87.6144\\-196.0592\\-31\\85.66128\\-196.8476\\-31\\83.70815\\-197.4727\\-31\\81.75503\\-197.1921\\-31\\79.8019\\-198.3816\\-31\\77.84878\\-199.2474\\-31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "139" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "286" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-127.2293\\-219.3881\\-29\\-129.1825\\-217.7076\\-29\\-131.1356\\-217.5695\\-29\\-133.0887\\-217.2623\\-29\\-135.0419\\-216.1757\\-29\\-138.9481\\-214.2551\\-29\\-140.9012\\-213.1848\\-29\\-142.5838\\-211.3803\\-29\\-143.7007\\-209.4271\\-29\\-144.5484\\-205.5209\\-29\\-145.6394\\-203.5678\\-29\\-146.0233\\-201.6146\\-29\\-146.0464\\-199.6615\\-29\\-145.6587\\-197.7084\\-29\\-144.8075\\-196.8956\\-29\\-142.8544\\-198.2997\\-29\\-140.9012\\-199.1202\\-29\\-138.9202\\-199.6615\\-29\\-136.995\\-200.0775\\-29\\-135.0419\\-200.6522\\-29\\-133.0887\\-200.7648\\-29\\-131.1356\\-200.3177\\-29\\-129.1825\\-200.1172\\-29\\-125.2762\\-200.3819\\-29\\-123.3231\\-199.7281\\-29\\-119.4168\\-199.6842\\-29\\-117.4637\\-199.3127\\-29\\-115.5106\\-197.4582\\-29\\-113.5575\\-194.4404\\-29\\-113.0632\\-193.8021\\-29\\-112.2835\\-191.849\\-29\\-109.6512\\-189.3186\\-29\\-107.6981\\-188.6497\\-29\\-105.745\\-187.7433\\-29\\-101.8387\\-187.7558\\-29\\-99.8856\\-188.7409\\-29\\-97.93247\\-189.3932\\-29\\-95.97935\\-189.6721\\-29\\-94.02622\\-189.4163\\-29\\-92.0731\\-189.3546\\-29\\-90.11997\\-189.4134\\-29\\-88.16685\\-188.1985\\-29\\-87.93829\\-187.9428\\-29\\-86.97095\\-185.9896\\-29\\-85.76984\\-184.0365\\-29\\-85.34517\\-182.0834\\-29\\-84.2606\\-180.5551\\-29\\-82.30747\\-178.4983\\-29\\-81.75746\\-178.1771\\-29\\-81.58187\\-176.224\\-29\\-81.82787\\-174.2709\\-29\\-82.26991\\-172.3178\\-29\\-82.47636\\-170.3646\\-29\\-81.70446\\-168.4115\\-29\\-80.70771\\-166.4584\\-29\\-80.35435\\-166.1119\\-29\\-78.40122\\-164.8563\\-29\\-76.4481\\-163.446\\-29\\-73.58817\\-160.599\\-29\\-72.54185\\-159.6563\\-29\\-70.58872\\-159.176\\-29\\-68.6356\\-159.552\\-29\\-66.68247\\-159.6225\\-29\\-64.72935\\-159.3055\\-29\\-62.8992\\-160.599\\-29\\-62.30538\\-162.5521\\-29\\-62.41241\\-164.5053\\-29\\-62.32963\\-166.4584\\-29\\-62.36028\\-172.3178\\-29\\-61.87077\\-174.2709\\-29\\-60.98705\\-176.224\\-29\\-60.46628\\-178.1771\\-29\\-60.48701\\-180.1303\\-29\\-61.40361\\-182.0834\\-29\\-61.33678\\-185.9896\\-29\\-61.00002\\-187.9428\\-29\\-58.86998\\-189.3262\\-29\\-58.19538\\-189.8959\\-29\\-56.82211\\-191.849\\-29\\-55.97481\\-193.8021\\-29\\-54.7128\\-195.7553\\-29\\-53.352\\-199.6615\\-29\\-53.00297\\-201.6146\\-29\\-53.65265\\-205.5209\\-29\\-54.10408\\-207.474\\-29\\-54.96373\\-208.9447\\-29\\-56.68303\\-207.474\\-29\\-57.83916\\-205.5209\\-29\\-56.76494\\-203.5678\\-29\\-56.716\\-201.6146\\-29\\-56.83393\\-199.6615\\-29\\-57.8499\\-197.7084\\-29\\-59.73958\\-195.7553\\-29\\-60.49758\\-193.8021\\-29\\-61.7668\\-191.849\\-29\\-62.77623\\-190.689\\-29\\-66.68247\\-187.2467\\-29\\-68.6356\\-185.1923\\-29\\-70.58872\\-183.2676\\-29\\-72.54185\\-182.4605\\-29\\-72.81197\\-182.0834\\-29\\-74.49497\\-180.9693\\-29\\-76.4481\\-180.8152\\-29\\-78.20403\\-182.0834\\-29\\-76.4481\\-183.928\\-29\\-74.49497\\-184.2497\\-29\\-72.54185\\-185.4969\\-29\\-72.19533\\-185.9896\\-29\\-71.60244\\-187.9428\\-29\\-70.40759\\-189.8959\\-29\\-69.31756\\-191.849\\-29\\-68.8763\\-195.7553\\-29\\-69.35323\\-197.7084\\-29\\-69.95803\\-199.6615\\-29\\-70.66949\\-201.6146\\-29\\-72.66392\\-205.5209\\-29\\-73.54439\\-207.474\\-29\\-75.73962\\-211.3803\\-29\\-76.4481\\-212.0707\\-29\\-78.40122\\-213.0516\\-29\\-80.35435\\-214.4009\\-29\\-82.30747\\-215.9606\\-29\\-84.2606\\-216.4498\\-29\\-88.16685\\-216.9691\\-29\\-92.0731\\-216.4129\\-29\\-94.02622\\-215.7748\\-29\\-95.97935\\-215.3408\\-29\\-97.93247\\-215.2039\\-29\\-99.8856\\-214.2021\\-29\\-101.8387\\-214.1805\\-29\\-103.7918\\-214.7615\\-29\\-105.745\\-214.9717\\-29\\-111.6043\\-215.0047\\-29\\-113.5575\\-215.5239\\-29\\-115.5106\\-216.3011\\-29\\-117.4637\\-216.6363\\-29\\-121.37\\-218.796\\-29\\-123.3231\\-218.9933\\-29\\-125.2762\\-219.9931\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "287" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-158.8329\\-29\\-41.29185\\-157.4291\\-29\\-44.01146\\-154.7396\\-29\\-45.50409\\-150.8334\\-29\\-46.72636\\-148.8803\\-29\\-47.15123\\-148.4554\\-29\\-49.10435\\-148.323\\-29\\-49.71157\\-148.8803\\-29\\-51.05748\\-150.6596\\-29\\-52.44794\\-148.8803\\-29\\-51.81953\\-146.9271\\-29\\-51.05748\\-146.1562\\-29\\-49.10435\\-145.2792\\-29\\-47.15123\\-144.0797\\-29\\-46.24071\\-143.0209\\-29\\-45.1981\\-140.9655\\-29\\-43.36705\\-137.1615\\-29\\-42.13788\\-135.2084\\-29\\-37.3856\\-130.5278\\-29\\-35.43248\\-129.7837\\-29\\-33.47935\\-129.4575\\-29\\-31.52623\\-129.0213\\-29\\-29.5731\\-128.8293\\-29\\-27.61998\\-129.1874\\-29\\-25.66685\\-129.7837\\-29\\-23.71373\\-129.802\\-29\\-21.7606\\-130.5762\\-29\\-21.0609\\-131.3021\\-29\\-20.36789\\-133.2553\\-29\\-18.89936\\-135.2084\\-29\\-16.90338\\-139.1146\\-29\\-16.13695\\-141.0678\\-29\\-15.18139\\-143.0209\\-29\\-13.46939\\-144.974\\-29\\-12.46539\\-146.9271\\-29\\-11.88647\\-148.8803\\-29\\-11.68485\\-150.8334\\-29\\-11.99498\\-151.3491\\-29\\-13.84903\\-152.7865\\-29\\-14.00507\\-152.7865\\-29\\-14.67919\\-150.8334\\-29\\-15.65203\\-148.8803\\-29\\-15.90123\\-148.6146\\-29\\-17.85435\\-148.9837\\-29\\-18.62507\\-150.8334\\-29\\-19.18269\\-152.7865\\-29\\-20.75573\\-154.7396\\-29\\-23.71373\\-157.5982\\-29\\-25.66685\\-158.7813\\-29\\-27.61998\\-159.3476\\-29\\-29.5731\\-159.452\\-29\\-35.43248\\-159.452\\-29\\-37.3856\\-159.3783\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "288" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "15.34877\\-239.3692\\-29\\13.39565\\-238.2391\\-29\\11.44252\\-237.7928\\-29\\10.24829\\-236.7709\\-29\\9.367329\\-234.8178\\-29\\10.06285\\-232.8646\\-29\\11.18166\\-230.9115\\-29\\12.6981\\-228.9584\\-29\\13.39565\\-228.3855\\-29\\15.34877\\-227.7235\\-29\\17.3019\\-226.7013\\-29\\19.25502\\-225.965\\-29\\21.20815\\-224.2344\\-29\\23.16127\\-223.9589\\-29\\29.02065\\-223.5282\\-29\\30.97377\\-224.3023\\-29\\31.81362\\-225.0521\\-29\\32.9269\\-225.4738\\-29\\34.33071\\-227.0053\\-29\\34.34568\\-228.9584\\-29\\33.27812\\-230.9115\\-29\\32.51946\\-232.8646\\-29\\31.52018\\-234.8178\\-29\\30.97377\\-235.1629\\-29\\29.02065\\-236.8251\\-29\\27.06752\\-237.938\\-29\\25.1144\\-238.1484\\-29\\23.16127\\-238.6441\\-29\\21.20815\\-238.7318\\-29\\17.3019\\-239.7875\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "289" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-208.4091\\-29\\53.34546\\-207.474\\-29\\52.88194\\-203.5678\\-29\\52.86768\\-199.6615\\-29\\53.46507\\-197.7084\\-29\\55.85613\\-191.849\\-29\\56.25589\\-189.8959\\-29\\56.28363\\-187.9428\\-29\\58.15593\\-184.0365\\-29\\58.15593\\-176.224\\-29\\58.52923\\-174.2709\\-29\\59.32267\\-172.3178\\-29\\59.60761\\-170.3646\\-29\\59.41675\\-168.4115\\-29\\59.42618\\-162.5521\\-29\\60.13422\\-160.599\\-29\\62.22377\\-159.3902\\-29\\64.1769\\-159.1596\\-29\\66.13003\\-159.1512\\-29\\68.08315\\-158.7125\\-29\\70.03628\\-158.8453\\-29\\73.94253\\-159.8\\-29\\75.89565\\-161.2234\\-29\\77.84878\\-162.2334\\-29\\79.8019\\-163.6743\\-29\\81.75503\\-165.4409\\-29\\82.64648\\-166.4584\\-29\\83.00285\\-168.4115\\-29\\81.79572\\-170.3646\\-29\\79.8019\\-171.607\\-29\\79.07087\\-172.3178\\-29\\77.8409\\-174.2709\\-29\\77.28845\\-176.224\\-29\\75.89565\\-177.2006\\-29\\73.94253\\-176.7041\\-29\\71.9894\\-177.0067\\-29\\70.03628\\-179.1818\\-29\\69.29144\\-180.1303\\-29\\68.08315\\-181.1735\\-29\\66.13003\\-182.5917\\-29\\64.1769\\-183.0012\\-29\\62.22377\\-183.9411\\-29\\60.54118\\-185.9896\\-29\\60.05895\\-187.9428\\-29\\59.74481\\-189.8959\\-29\\58.14314\\-195.7553\\-29\\57.73049\\-197.7084\\-29\\56.77333\\-201.6146\\-29\\57.27012\\-203.5678\\-29\\57.08311\\-205.5209\\-29\\55.59129\\-207.474\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "290" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "71.9894\\-198.5184\\-29\\71.27856\\-197.7084\\-29\\70.70387\\-195.7553\\-29\\71.38668\\-193.8021\\-29\\72.36353\\-191.849\\-29\\72.36806\\-187.9428\\-29\\72.94026\\-185.9896\\-29\\73.94253\\-184.7611\\-29\\75.89565\\-184.3207\\-29\\77.6159\\-185.9896\\-29\\77.43024\\-187.9428\\-29\\77.38654\\-189.8959\\-29\\77.84878\\-190.4689\\-29\\79.8019\\-190.8054\\-29\\81.75503\\-190.8144\\-29\\83.70815\\-190.9335\\-29\\87.6144\\-190.1366\\-29\\89.56753\\-190.888\\-29\\91.52065\\-191.3933\\-29\\92.11744\\-191.849\\-29\\92.33535\\-193.8021\\-29\\91.52065\\-194.6124\\-29\\89.56753\\-195.7629\\-29\\87.6144\\-195.7928\\-29\\85.66128\\-196.4399\\-29\\83.70815\\-196.9004\\-29\\81.75503\\-196.6508\\-29\\79.8019\\-197.2083\\-29\\77.84878\\-198.6445\\-29\\75.89565\\-199.235\\-29\\73.94253\\-199.4007\\-29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "151" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "291" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-125.2762\\-219.4967\\-27\\-127.2293\\-217.7481\\-27\\-127.6596\\-217.2396\\-27\\-129.1825\\-215.9198\\-27\\-131.1356\\-216.5164\\-27\\-133.0887\\-216.9921\\-27\\-135.0419\\-216.6382\\-27\\-136.995\\-215.8062\\-27\\-138.9481\\-214.6962\\-27\\-140.9012\\-213.8417\\-27\\-141.428\\-213.3334\\-27\\-142.205\\-211.3803\\-27\\-142.6069\\-209.4271\\-27\\-143.6791\\-207.474\\-27\\-143.9654\\-205.5209\\-27\\-144.3728\\-203.5678\\-27\\-145.5919\\-201.6146\\-27\\-145.5236\\-199.6615\\-27\\-144.8075\\-198.7237\\-27\\-142.8544\\-198.6354\\-27\\-140.9012\\-199.8485\\-27\\-138.9481\\-200.0285\\-27\\-136.995\\-199.7137\\-27\\-135.0419\\-200.3512\\-27\\-133.0887\\-200.5191\\-27\\-131.1356\\-199.77\\-27\\-129.1825\\-199.7137\\-27\\-127.2293\\-199.9976\\-27\\-125.2762\\-200.1411\\-27\\-123.3231\\-199.6842\\-27\\-117.4637\\-199.6691\\-27\\-115.5106\\-198.3067\\-27\\-114.9988\\-197.7084\\-27\\-114.0393\\-195.7553\\-27\\-112.4778\\-193.8021\\-27\\-111.385\\-191.849\\-27\\-109.6512\\-189.8732\\-27\\-107.6981\\-188.9807\\-27\\-105.745\\-188.3536\\-27\\-101.8387\\-188.0648\\-27\\-99.8856\\-188.6324\\-27\\-95.97935\\-189.6254\\-27\\-90.11997\\-189.6254\\-27\\-88.16685\\-188.9139\\-27\\-87.29282\\-187.9428\\-27\\-86.17616\\-185.9896\\-27\\-85.03078\\-182.0834\\-27\\-83.76376\\-180.1303\\-27\\-83.52172\\-178.1771\\-27\\-82.61695\\-176.224\\-27\\-81.95065\\-174.2709\\-27\\-83.18839\\-172.3178\\-27\\-83.43243\\-170.3646\\-27\\-83.01521\\-168.4115\\-27\\-81.70111\\-166.4584\\-27\\-80.35435\\-165.1624\\-27\\-77.03101\\-162.5521\\-27\\-74.49497\\-160.0464\\-27\\-72.54185\\-159.0176\\-27\\-68.6356\\-159.3055\\-27\\-64.72935\\-159.3135\\-27\\-63.09238\\-160.599\\-27\\-63.57523\\-162.5521\\-27\\-63.92945\\-164.5053\\-27\\-63.65615\\-166.4584\\-27\\-62.81437\\-168.4115\\-27\\-62.36028\\-170.3646\\-27\\-62.36028\\-172.3178\\-27\\-62.14433\\-174.2709\\-27\\-61.66219\\-176.224\\-27\\-60.47658\\-178.1771\\-27\\-60.48701\\-180.1303\\-27\\-61.01144\\-182.0834\\-27\\-60.99874\\-185.9896\\-27\\-60.64619\\-187.9428\\-27\\-58.27997\\-189.8959\\-27\\-56.80835\\-191.849\\-27\\-56.38059\\-193.8021\\-27\\-55.82082\\-195.7553\\-27\\-55.67208\\-197.7084\\-27\\-56.21931\\-199.6615\\-27\\-54.96373\\-200.061\\-27\\-53.90662\\-201.6146\\-27\\-53.83652\\-203.5678\\-27\\-53.60294\\-205.5209\\-27\\-53.04816\\-207.474\\-27\\-52.64678\\-209.4271\\-27\\-52.49282\\-211.3803\\-27\\-51.95355\\-213.3334\\-27\\-51.65712\\-215.2865\\-27\\-51.01309\\-217.2396\\-27\\-50.76622\\-219.1928\\-27\\-51.05748\\-219.6414\\-27\\-53.0106\\-220.7318\\-27\\-54.96373\\-220.5057\\-27\\-58.86998\\-216.7158\\-27\\-60.8231\\-215.1252\\-27\\-62.31625\\-213.3334\\-27\\-62.25743\\-211.3803\\-27\\-61.61656\\-209.4271\\-27\\-60.2921\\-207.474\\-27\\-59.84184\\-205.5209\\-27\\-58.73354\\-203.5678\\-27\\-58.03182\\-201.6146\\-27\\-57.07607\\-199.6615\\-27\\-58.12752\\-197.7084\\-27\\-58.86998\\-196.9857\\-27\\-59.74472\\-195.7553\\-27\\-60.46628\\-193.8021\\-27\\-61.60739\\-191.849\\-27\\-62.60211\\-189.8959\\-27\\-64.72935\\-187.8906\\-27\\-66.68247\\-186.5608\\-27\\-67.2431\\-185.9896\\-27\\-68.6356\\-183.9174\\-27\\-70.82627\\-182.0834\\-27\\-72.54185\\-181.1312\\-27\\-74.49497\\-181.0165\\-27\\-75.98344\\-182.0834\\-27\\-74.49497\\-183.0651\\-27\\-71.714\\-185.9896\\-27\\-70.8611\\-187.9428\\-27\\-70.58872\\-188.2657\\-27\\-68.21445\\-191.849\\-27\\-67.62594\\-193.8021\\-27\\-67.2347\\-195.7553\\-27\\-67.41784\\-197.7084\\-27\\-68.26725\\-199.6615\\-27\\-68.6356\\-200.113\\-27\\-70.62658\\-203.5678\\-27\\-71.59183\\-205.5209\\-27\\-73.67287\\-209.4271\\-27\\-74.8942\\-211.3803\\-27\\-76.4481\\-213.061\\-27\\-78.40122\\-214.3549\\-27\\-84.2606\\-217.3204\\-27\\-86.21372\\-217.6011\\-27\\-92.0731\\-217.5907\\-27\\-94.02622\\-217.1715\\-27\\-95.97935\\-216.6131\\-27\\-97.93247\\-216.4275\\-27\\-99.8856\\-215.8123\\-27\\-101.8387\\-214.9805\\-27\\-107.6981\\-215.0047\\-27\\-109.6512\\-214.7491\\-27\\-111.6043\\-214.6217\\-27\\-113.5575\\-214.6255\\-27\\-117.4637\\-215.3262\\-27\\-119.4168\\-215.6225\\-27\\-121.37\\-217.7923\\-27\\-123.3231\\-218.7113\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "292" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-158.433\\-27\\-39.33873\\-157.827\\-27\\-40.76208\\-156.6928\\-27\\-43.24498\\-154.2701\\-27\\-44.43799\\-152.7865\\-27\\-44.89414\\-150.8334\\-27\\-46.08444\\-148.8803\\-27\\-47.15123\\-147.8579\\-27\\-49.10435\\-147.9297\\-27\\-50.08091\\-148.8803\\-27\\-51.05748\\-150.1043\\-27\\-52.91905\\-148.8803\\-27\\-52.49569\\-146.9271\\-27\\-51.05748\\-145.4156\\-27\\-49.10435\\-144.9218\\-27\\-47.15123\\-144.1736\\-27\\-46.06563\\-143.0209\\-27\\-44.84128\\-141.0678\\-27\\-44.24905\\-139.1146\\-27\\-42.24936\\-135.2084\\-27\\-39.33873\\-132.4541\\-27\\-37.3856\\-130.5377\\-27\\-35.43248\\-129.7929\\-27\\-33.47935\\-129.7744\\-27\\-31.52623\\-129.536\\-27\\-29.5731\\-128.6689\\-27\\-27.61998\\-128.6498\\-27\\-25.66685\\-129.536\\-27\\-23.71373\\-129.802\\-27\\-21.7606\\-130.4982\\-27\\-20.9647\\-131.3021\\-27\\-19.46919\\-133.2553\\-27\\-18.78506\\-135.2084\\-27\\-17.90653\\-137.1615\\-27\\-16.89485\\-139.1146\\-27\\-16.08823\\-141.0678\\-27\\-14.93419\\-143.0209\\-27\\-13.30669\\-144.974\\-27\\-12.72488\\-146.9271\\-27\\-11.35688\\-148.8803\\-27\\-11.70591\\-150.8334\\-27\\-11.99498\\-151.0843\\-27\\-13.9481\\-151.101\\-27\\-14.24186\\-150.8334\\-27\\-15.90123\\-148.6641\\-27\\-17.85435\\-148.8907\\-27\\-18.71984\\-150.8334\\-27\\-20.0465\\-152.7865\\-27\\-21.03783\\-154.7396\\-27\\-21.7606\\-155.4624\\-27\\-23.71373\\-157.0797\\-27\\-25.66685\\-157.8051\\-27\\-27.61998\\-158.7544\\-27\\-29.5731\\-159.1512\\-27\\-33.47935\\-159.1427\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "293" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "13.39565\\-236.7789\\-27\\11.44252\\-236.5551\\-27\\10.10847\\-234.8178\\-27\\10.51706\\-232.8646\\-27\\13.39565\\-229.7172\\-27\\15.34877\\-228.3374\\-27\\17.3019\\-227.7036\\-27\\19.25502\\-226.3665\\-27\\23.16127\\-224.5351\\-27\\25.1144\\-224.0101\\-27\\27.06752\\-223.1512\\-27\\29.02065\\-222.1225\\-27\\30.97377\\-221.3591\\-27\\32.9269\\-220.0133\\-27\\34.88002\\-219.4197\\-27\\36.83315\\-220.8651\\-27\\37.02512\\-221.1459\\-27\\36.84078\\-223.099\\-27\\36.31656\\-225.0521\\-27\\36.33517\\-228.9584\\-27\\35.30938\\-230.9115\\-27\\34.50136\\-232.8646\\-27\\34.27472\\-234.8178\\-27\\32.9269\\-236.1121\\-27\\30.97377\\-236.3067\\-27\\29.02065\\-237.2529\\-27\\27.06752\\-237.6118\\-27\\25.1144\\-237.1499\\-27\\23.16127\\-237.1314\\-27\\21.20815\\-236.9262\\-27\\19.25502\\-236.3932\\-27\\17.3019\\-237.4667\\-27\\15.34877\\-237.4587\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "294" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-208.0812\\-27\\53.65948\\-207.474\\-27\\53.6699\\-199.6615\\-27\\53.92591\\-197.7084\\-27\\54.55988\\-195.7553\\-27\\56.24233\\-191.849\\-27\\56.25589\\-189.8959\\-27\\56.56384\\-187.9428\\-27\\58.15593\\-184.0365\\-27\\58.15593\\-178.1771\\-27\\57.96182\\-176.224\\-27\\59.05275\\-174.2709\\-27\\59.65696\\-172.3178\\-27\\59.97768\\-170.3646\\-27\\59.95584\\-162.5521\\-27\\60.01156\\-160.599\\-27\\60.27065\\-160.3105\\-27\\62.22377\\-159.1255\\-27\\66.13003\\-159.1167\\-27\\68.08315\\-157.8222\\-27\\70.03628\\-157.8445\\-27\\71.9894\\-158.8203\\-27\\75.89565\\-159.8854\\-27\\77.84878\\-161.197\\-27\\79.8019\\-162.3148\\-27\\82.00594\\-164.5053\\-27\\83.08379\\-166.4584\\-27\\82.87041\\-168.4115\\-27\\81.75503\\-169.5492\\-27\\78.74603\\-172.3178\\-27\\76.94695\\-174.2709\\-27\\77.83701\\-176.224\\-27\\79.82461\\-178.1771\\-27\\80.71855\\-180.1303\\-27\\81.24747\\-182.0834\\-27\\81.25704\\-184.0365\\-27\\81.47904\\-185.9896\\-27\\81.75503\\-186.443\\-27\\83.10961\\-187.9428\\-27\\83.70815\\-188.4354\\-27\\85.66128\\-189.1942\\-27\\86.41307\\-189.8959\\-27\\87.6144\\-190.7185\\-27\\90.8877\\-191.849\\-27\\91.52065\\-192.3669\\-27\\92.10179\\-193.8021\\-27\\91.52065\\-194.4094\\-27\\89.56753\\-195.7476\\-27\\87.6144\\-195.778\\-27\\85.66128\\-196.039\\-27\\83.70815\\-196.6156\\-27\\81.75503\\-197.0169\\-27\\79.8019\\-197.5444\\-27\\77.84878\\-198.4282\\-27\\75.89565\\-198.9076\\-27\\73.94253\\-200.3108\\-27\\71.9894\\-200.3555\\-27\\71.24378\\-199.6615\\-27\\70.18707\\-197.7084\\-27\\69.65925\\-195.7553\\-27\\70.04402\\-193.8021\\-27\\70.97857\\-191.849\\-27\\70.95181\\-189.8959\\-27\\70.54552\\-187.9428\\-27\\71.15025\\-185.9896\\-27\\72.16379\\-184.0365\\-27\\73.94253\\-180.2\\-27\\73.94253\\-179.9983\\-27\\71.9894\\-179.0535\\-27\\70.72964\\-180.1303\\-27\\68.08315\\-181.598\\-27\\66.13003\\-182.232\\-27\\62.22377\\-183.1925\\-27\\61.32703\\-184.0365\\-27\\60.55247\\-185.9896\\-27\\60.37915\\-187.9428\\-27\\59.32186\\-189.8959\\-27\\58.63234\\-191.849\\-27\\58.13562\\-193.8021\\-27\\58.13052\\-197.7084\\-27\\57.52531\\-201.6146\\-27\\58.18008\\-203.5678\\-27\\57.86819\\-205.5209\\-27\\56.3644\\-207.0247\\-27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "156" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "295" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-54.96373\\-224.1935\\-25\\-56.09627\\-223.099\\-25\\-57.65989\\-221.1459\\-25\\-60.8231\\-217.9649\\-25\\-62.77623\\-216.4808\\-25\\-64.09531\\-215.2865\\-25\\-63.70653\\-211.3803\\-25\\-62.57537\\-209.4271\\-25\\-61.78003\\-207.474\\-25\\-60.55073\\-205.5209\\-25\\-60.0093\\-203.5678\\-25\\-59.72324\\-201.6146\\-25\\-59.06942\\-199.6615\\-25\\-58.86998\\-198.748\\-25\\-58.33287\\-197.7084\\-25\\-58.86998\\-197.3656\\-25\\-59.63446\\-195.7553\\-25\\-60.8231\\-192.2717\\-25\\-61.9118\\-189.8959\\-25\\-64.72935\\-186.9662\\-25\\-66.68247\\-185.17\\-25\\-67.71182\\-184.0365\\-25\\-70.58872\\-181.1996\\-25\\-72.54185\\-180.3556\\-25\\-74.47208\\-182.0834\\-25\\-73.28047\\-184.0365\\-25\\-71.46908\\-185.9896\\-25\\-70.2117\\-187.9428\\-25\\-69.35138\\-189.8959\\-25\\-67.8008\\-191.849\\-25\\-66.67484\\-193.8021\\-25\\-66.72062\\-195.7553\\-25\\-67.3728\\-199.6615\\-25\\-68.21966\\-201.6146\\-25\\-69.62296\\-203.5678\\-25\\-71.58157\\-207.474\\-25\\-73.17171\\-209.4271\\-25\\-74.12084\\-211.3803\\-25\\-75.64489\\-213.3334\\-25\\-78.40122\\-215.842\\-25\\-80.35435\\-216.4938\\-25\\-82.30747\\-217.0264\\-25\\-84.2606\\-218.09\\-25\\-86.21372\\-218.3858\\-25\\-94.02622\\-218.3652\\-25\\-95.97935\\-217.8079\\-25\\-97.93247\\-216.9921\\-25\\-99.8856\\-216.7022\\-25\\-101.8387\\-216.0666\\-25\\-103.7918\\-215.2199\\-25\\-107.6981\\-214.7343\\-25\\-111.6043\\-213.5347\\-25\\-113.5575\\-213.3741\\-25\\-115.5106\\-213.3741\\-25\\-117.4637\\-213.5866\\-25\\-119.4168\\-213.5757\\-25\\-121.37\\-214.3625\\-25\\-122.5833\\-215.2865\\-25\\-123.5383\\-217.2396\\-25\\-125.2762\\-218.1552\\-25\\-126.1307\\-217.2396\\-25\\-127.2293\\-216.2912\\-25\\-129.1825\\-215.6758\\-25\\-131.1356\\-216.4509\\-25\\-133.0887\\-217.0039\\-25\\-135.0419\\-216.9357\\-25\\-136.995\\-216\\-25\\-138.9481\\-214.739\\-25\\-140.9012\\-213.6524\\-25\\-141.2267\\-213.3334\\-25\\-142.0834\\-211.3803\\-25\\-142.1982\\-209.4271\\-25\\-142.5725\\-207.474\\-25\\-143.1574\\-205.5209\\-25\\-143.8527\\-203.5678\\-25\\-144.31\\-201.6146\\-25\\-142.8544\\-199.7019\\-25\\-140.9012\\-200.4417\\-25\\-138.9481\\-200.6279\\-25\\-136.995\\-200.2072\\-25\\-135.0419\\-200.3569\\-25\\-133.0887\\-200.3975\\-25\\-131.1356\\-200.1835\\-25\\-127.2293\\-200.1835\\-25\\-125.2762\\-200.26\\-25\\-123.3231\\-200.4825\\-25\\-119.4168\\-200.1782\\-25\\-117.4637\\-200.1668\\-25\\-115.5106\\-199.057\\-25\\-112.8103\\-195.7553\\-25\\-111.385\\-193.8021\\-25\\-110.5036\\-191.849\\-25\\-109.6512\\-190.9331\\-25\\-107.6981\\-189.7462\\-25\\-105.745\\-189.5176\\-25\\-103.7918\\-188.9656\\-25\\-101.8387\\-188.8032\\-25\\-99.8856\\-189.1921\\-25\\-97.93247\\-189.3466\\-25\\-95.97935\\-189.9625\\-25\\-94.02622\\-190.2851\\-25\\-92.0731\\-190.296\\-25\\-90.11997\\-190.1137\\-25\\-88.16685\\-189.0049\\-25\\-87.1417\\-187.9428\\-25\\-85.74288\\-185.9896\\-25\\-85.33709\\-184.0365\\-25\\-84.25297\\-182.0834\\-25\\-83.77232\\-180.1303\\-25\\-83.75529\\-178.1771\\-25\\-82.80235\\-176.224\\-25\\-82.60188\\-174.2709\\-25\\-83.90955\\-172.3178\\-25\\-84.39132\\-170.3646\\-25\\-83.75488\\-168.4115\\-25\\-83.30586\\-166.4584\\-25\\-82.30747\\-164.8036\\-25\\-80.35435\\-163.3049\\-25\\-79.12255\\-162.5521\\-25\\-77.13937\\-160.599\\-25\\-76.4481\\-160.0863\\-25\\-74.49497\\-158.2735\\-25\\-72.54185\\-157.8801\\-25\\-70.58872\\-159.1078\\-25\\-66.68247\\-159.1342\\-25\\-64.72935\\-159.7496\\-25\\-63.96576\\-160.599\\-25\\-64.26739\\-164.5053\\-25\\-64.10082\\-166.4584\\-25\\-63.67012\\-168.4115\\-25\\-62.81467\\-170.3646\\-25\\-62.36028\\-172.3178\\-25\\-62.35085\\-174.2709\\-25\\-61.87514\\-176.224\\-25\\-61.00002\\-178.1771\\-25\\-60.47658\\-180.1303\\-25\\-60.48701\\-185.9896\\-25\\-59.91788\\-187.9428\\-25\\-57.93967\\-189.8959\\-25\\-56.82211\\-191.849\\-25\\-56.79478\\-193.8021\\-25\\-56.40559\\-195.7553\\-25\\-56.47129\\-199.6615\\-25\\-55.86839\\-201.6146\\-25\\-54.08537\\-203.5678\\-25\\-51.9585\\-209.4271\\-25\\-51.25833\\-213.3334\\-25\\-50.99089\\-215.2865\\-25\\-49.76937\\-217.2396\\-25\\-49.10435\\-217.9481\\-25\\-47.40409\\-219.1928\\-25\\-45.67188\\-221.1459\\-25\\-45.83106\\-223.099\\-25\\-47.15123\\-224.1322\\-25\\-49.10435\\-224.4339\\-25\\-53.0106\\-224.5505\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "296" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-157.0992\\-25\\-41.29185\\-155.6278\\-25\\-44.29094\\-152.7865\\-25\\-44.86201\\-150.8334\\-25\\-45.78632\\-148.8803\\-25\\-47.15123\\-147.6518\\-25\\-49.10435\\-147.5052\\-25\\-50.76587\\-148.8803\\-25\\-51.05748\\-149.2392\\-25\\-52.05729\\-148.8803\\-25\\-52.91142\\-146.9271\\-25\\-51.65363\\-144.974\\-25\\-51.05748\\-144.3947\\-25\\-47.15123\\-143.8718\\-25\\-46.33833\\-143.0209\\-25\\-45.1981\\-140.2688\\-25\\-44.06762\\-137.1615\\-25\\-42.81432\\-135.2084\\-25\\-40.7348\\-133.2553\\-25\\-39.33873\\-132.2929\\-25\\-37.3856\\-130.5377\\-25\\-35.43248\\-129.802\\-25\\-33.47935\\-129.7837\\-25\\-29.5731\\-128.0487\\-25\\-27.61998\\-128.0416\\-25\\-25.66685\\-128.8254\\-25\\-23.71373\\-129.7929\\-25\\-21.7606\\-130.4924\\-25\\-19.0675\\-133.2553\\-25\\-18.39565\\-135.2084\\-25\\-17.57062\\-137.1615\\-25\\-16.07561\\-141.0678\\-25\\-14.69523\\-143.0209\\-25\\-12.69252\\-144.974\\-25\\-12.48033\\-146.9271\\-25\\-11.1333\\-148.8803\\-25\\-11.58427\\-150.8334\\-25\\-11.99498\\-151.1264\\-25\\-13.9481\\-150.1693\\-25\\-15.90123\\-148.0655\\-25\\-17.85435\\-148.479\\-25\\-18.19044\\-148.8803\\-25\\-18.85922\\-150.8334\\-25\\-20.58372\\-152.7865\\-25\\-21.7606\\-154.2576\\-25\\-23.71373\\-155.9999\\-25\\-25.66685\\-157.3455\\-25\\-27.61998\\-157.7901\\-25\\-29.5731\\-158.4054\\-25\\-33.47935\\-158.3821\\-25\\-35.43248\\-157.7933\\-25\\-37.3856\\-157.4955\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "297" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "32.9269\\-237.5271\\-25\\30.97377\\-236.7028\\-25\\29.02065\\-236.1876\\-25\\27.06752\\-236.1487\\-25\\25.1144\\-235.7356\\-25\\23.16127\\-235.69\\-25\\21.20815\\-235.3868\\-25\\19.25502\\-234.3295\\-25\\17.3019\\-233.8725\\-25\\15.34877\\-234.0141\\-25\\13.39565\\-234.4516\\-25\\12.24153\\-232.8646\\-25\\13.39565\\-231.6637\\-25\\13.86738\\-230.9115\\-25\\16.3593\\-228.9584\\-25\\17.3019\\-228.3595\\-25\\19.25502\\-227.7169\\-25\\21.20815\\-226.4064\\-25\\23.16127\\-226.0909\\-25\\25.1144\\-225.3842\\-25\\28.04409\\-223.099\\-25\\29.02065\\-222.2595\\-25\\30.97377\\-221.2267\\-25\\32.9269\\-219.9973\\-25\\34.88002\\-218.9811\\-25\\36.83315\\-218.4977\\-25\\38.78627\\-218.403\\-25\\39.96576\\-219.1928\\-25\\39.22261\\-221.1459\\-25\\38.78627\\-221.7673\\-25\\38.4655\\-223.099\\-25\\38.42274\\-228.9584\\-25\\37.55447\\-230.9115\\-25\\37.34058\\-232.8646\\-25\\36.84219\\-234.8178\\-25\\34.56535\\-236.7709\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "85" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "298" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-206.5494\\-25\\53.80323\\-205.5209\\-25\\54.26266\\-201.6146\\-25\\54.2892\\-197.7084\\-25\\54.58566\\-195.7553\\-25\\55.59083\\-193.8021\\-25\\56.25589\\-191.849\\-25\\56.26966\\-189.8959\\-25\\57.05658\\-187.9428\\-25\\58.48291\\-184.0365\\-25\\58.46613\\-182.0834\\-25\\57.76939\\-180.1303\\-25\\57.69229\\-178.1771\\-25\\57.42917\\-176.224\\-25\\58.31752\\-175.0571\\-25\\59.21824\\-174.2709\\-25\\59.96334\\-172.3178\\-25\\60.00616\\-164.5053\\-25\\60.39272\\-162.5521\\-25\\60.63764\\-160.599\\-25\\62.22377\\-159.2884\\-25\\64.1769\\-159.1167\\-25\\66.13003\\-158.6228\\-25\\68.08315\\-157.5581\\-25\\70.03628\\-157.3728\\-25\\71.9894\\-158.0229\\-25\\73.94253\\-159.1342\\-25\\75.89565\\-159.393\\-25\\77.84878\\-159.8922\\-25\\79.8019\\-161.6518\\-25\\82.60168\\-164.5053\\-25\\84.27828\\-166.4584\\-25\\83.46025\\-168.4115\\-25\\81.75503\\-169.5035\\-25\\78.73067\\-172.3178\\-25\\77.10165\\-174.2709\\-25\\77.84878\\-175.6489\\-25\\78.55779\\-176.224\\-25\\79.8019\\-176.9564\\-25\\82.23705\\-180.1303\\-25\\82.82344\\-182.0834\\-25\\82.83311\\-184.0365\\-25\\83.70815\\-185.4973\\-25\\85.66128\\-188.0419\\-25\\86.80216\\-189.8959\\-25\\87.6144\\-190.8725\\-25\\89.56753\\-191.6133\\-25\\89.90594\\-191.849\\-25\\91.17094\\-193.8021\\-25\\89.56753\\-195.5999\\-25\\87.6144\\-196.0592\\-25\\85.66128\\-195.778\\-25\\83.70815\\-196.562\\-25\\81.74087\\-197.7084\\-25\\79.8019\\-198.398\\-25\\75.89565\\-199.4578\\-25\\73.94253\\-200.6231\\-25\\71.9894\\-200.9274\\-25\\70.5125\\-199.6615\\-25\\69.67945\\-197.7084\\-25\\69.64934\\-193.8021\\-25\\70.37679\\-189.8959\\-25\\70.36648\\-187.9428\\-25\\71.71886\\-184.0365\\-25\\72.13801\\-182.0834\\-25\\71.9894\\-181.8135\\-25\\70.03628\\-181.0168\\-25\\68.08315\\-182.1781\\-25\\66.13003\\-182.2055\\-25\\64.1769\\-182.8987\\-25\\62.22377\\-183.4872\\-25\\61.63065\\-184.0365\\-25\\60.95969\\-185.9896\\-25\\60.41926\\-187.9428\\-25\\59.0652\\-189.8959\\-25\\58.31752\\-191.6255\\-25\\57.22607\\-191.849\\-25\\58.04361\\-193.8021\\-25\\58.15593\\-195.7553\\-25\\58.16891\\-199.6615\\-25\\58.51696\\-201.6146\\-25\\59.24401\\-203.5678\\-25\\59.07882\\-205.5209\\-25\\58.31752\\-206.2989\\-25\\56.3644\\-207.012\\-25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "164" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "299" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-47.15123\\-227.1093\\-23\\-49.10435\\-226.5907\\-23\\-51.05748\\-226.5689\\-23\\-53.0106\\-226.2757\\-23\\-54.96373\\-225.7192\\-23\\-57.76161\\-223.099\\-23\\-59.34524\\-221.1459\\-23\\-61.19404\\-219.1928\\-23\\-62.77623\\-217.9992\\-23\\-64.11523\\-217.2396\\-23\\-64.72935\\-216.7305\\-23\\-65.65255\\-215.2865\\-23\\-65.02594\\-213.3334\\-23\\-64.75418\\-211.3803\\-23\\-63.92181\\-209.4271\\-23\\-61.71828\\-205.5209\\-23\\-60.47658\\-203.5678\\-23\\-60.17723\\-201.6146\\-23\\-59.67336\\-199.6615\\-23\\-58.86998\\-197.9627\\-23\\-58.39127\\-197.7084\\-23\\-58.86998\\-197.0302\\-23\\-59.79229\\-193.8021\\-23\\-60.24259\\-191.849\\-23\\-61.77641\\-189.8959\\-23\\-63.52301\\-187.9428\\-23\\-64.49363\\-185.9896\\-23\\-66.68247\\-184.0136\\-23\\-68.6356\\-182.8735\\-23\\-70.58872\\-181.0116\\-23\\-72.54185\\-179.2795\\-23\\-74.49497\\-179.3348\\-23\\-75.06183\\-180.1303\\-23\\-73.61894\\-182.0834\\-23\\-72.54185\\-184.0108\\-23\\-71.32114\\-185.9896\\-23\\-69.75533\\-187.9428\\-23\\-68.8138\\-189.8959\\-23\\-67.7435\\-191.849\\-23\\-67.0056\\-193.8021\\-23\\-67.57581\\-195.7553\\-23\\-67.89613\\-197.7084\\-23\\-67.9116\\-199.6615\\-23\\-68.13876\\-201.6146\\-23\\-68.82394\\-203.5678\\-23\\-70.58872\\-207.1006\\-23\\-71.94506\\-209.4271\\-23\\-75.46655\\-213.3334\\-23\\-78.40122\\-216.2212\\-23\\-80.35435\\-217.0039\\-23\\-82.30747\\-217.9475\\-23\\-84.2606\\-218.6987\\-23\\-86.21372\\-218.9811\\-23\\-92.0731\\-218.9811\\-23\\-94.02622\\-218.9222\\-23\\-97.58595\\-217.2396\\-23\\-97.93247\\-217.0158\\-23\\-99.8856\\-217.0039\\-23\\-101.8387\\-216.716\\-23\\-103.7918\\-215.7926\\-23\\-107.6981\\-214.2834\\-23\\-109.6512\\-212.9598\\-23\\-111.6043\\-211.9807\\-23\\-113.5575\\-211.3887\\-23\\-115.5106\\-211.4216\\-23\\-117.4637\\-212.015\\-23\\-119.4168\\-212.1066\\-23\\-121.37\\-212.5196\\-23\\-123.3231\\-214.1431\\-23\\-127.2293\\-216.2523\\-23\\-131.1356\\-216.7875\\-23\\-133.0887\\-216.9921\\-23\\-135.0419\\-216.6907\\-23\\-136.995\\-215.5966\\-23\\-138.9481\\-214.1649\\-23\\-140.9012\\-212.3442\\-23\\-141.6794\\-211.3803\\-23\\-141.9652\\-209.4271\\-23\\-142.1783\\-205.5209\\-23\\-143.4966\\-203.5678\\-23\\-143.2294\\-201.6146\\-23\\-142.8544\\-201.2527\\-23\\-140.9012\\-201.0399\\-23\\-138.9481\\-201.2057\\-23\\-136.995\\-200.9117\\-23\\-133.0887\\-200.8678\\-23\\-129.1825\\-201.2728\\-23\\-127.2293\\-201.3325\\-23\\-126.0392\\-201.6146\\-23\\-123.3231\\-203.0634\\-23\\-121.37\\-202.4988\\-23\\-120.087\\-201.6146\\-23\\-119.4168\\-201.3577\\-23\\-117.4637\\-201.3202\\-23\\-115.5106\\-200.667\\-23\\-114.4664\\-199.6615\\-23\\-113.1482\\-197.7084\\-23\\-112.0257\\-195.7553\\-23\\-110.4907\\-193.8021\\-23\\-109.2892\\-191.849\\-23\\-107.6981\\-190.7821\\-23\\-105.745\\-190.8943\\-23\\-103.7918\\-190.1324\\-23\\-101.8387\\-189.9214\\-23\\-99.8856\\-190.0703\\-23\\-97.93247\\-189.6721\\-23\\-95.97935\\-190.5666\\-23\\-94.02622\\-191.1466\\-23\\-92.0731\\-191.1729\\-23\\-90.11997\\-190.6529\\-23\\-87.40479\\-187.9428\\-23\\-86.06512\\-185.9896\\-23\\-84.5011\\-182.0834\\-23\\-84.46035\\-178.1771\\-23\\-82.89341\\-176.224\\-23\\-83.02246\\-174.2709\\-23\\-84.98217\\-172.3178\\-23\\-85.38496\\-170.3646\\-23\\-84.99583\\-168.4115\\-23\\-84.02488\\-166.4584\\-23\\-83.29312\\-164.5053\\-23\\-82.30747\\-163.4073\\-23\\-81.31326\\-162.5521\\-23\\-80.35435\\-161.105\\-23\\-78.40122\\-159.4227\\-23\\-76.4481\\-158.1875\\-23\\-74.49497\\-157.4126\\-23\\-72.54185\\-157.6693\\-23\\-70.58872\\-159.0989\\-23\\-68.6356\\-159.1167\\-23\\-66.68247\\-159.2635\\-23\\-64.70664\\-160.599\\-23\\-64.32295\\-162.5521\\-23\\-64.30398\\-166.4584\\-23\\-64.1223\\-168.4115\\-23\\-63.56479\\-170.3646\\-23\\-62.36983\\-172.3178\\-23\\-62.36028\\-174.2709\\-23\\-62.15526\\-176.224\\-23\\-61.75482\\-178.1771\\-23\\-60.87609\\-180.1303\\-23\\-60.47658\\-182.0834\\-23\\-60.45611\\-185.9896\\-23\\-59.82454\\-187.9428\\-23\\-57.84177\\-189.8959\\-23\\-56.82211\\-191.849\\-23\\-56.78141\\-195.7553\\-23\\-56.45553\\-197.7084\\-23\\-55.90431\\-199.6615\\-23\\-55.5226\\-201.6146\\-23\\-53.94186\\-203.5678\\-23\\-52.67009\\-205.5209\\-23\\-52.023\\-207.474\\-23\\-50.94734\\-209.4271\\-23\\-50.48782\\-211.3803\\-23\\-50.35295\\-213.3334\\-23\\-50.1132\\-215.2865\\-23\\-49.10435\\-216.4717\\-23\\-47.10545\\-217.2396\\-23\\-45.1981\\-219.5218\\-23\\-44.37714\\-221.1459\\-23\\-43.6841\\-223.099\\-23\\-44.55576\\-225.0521\\-23\\-45.1981\\-226.1151\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "300" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1724\\-23\\-39.33873\\-155.9552\\-23\\-41.29185\\-155.382\\-23\\-43.24498\\-153.787\\-23\\-44.28631\\-152.7865\\-23\\-45.33761\\-150.8334\\-23\\-46.17466\\-148.8803\\-23\\-47.15123\\-147.8982\\-23\\-49.10435\\-147.1746\\-23\\-51.05748\\-148.2273\\-23\\-52.91957\\-146.9271\\-23\\-51.81369\\-144.974\\-23\\-51.05748\\-144.2178\\-23\\-49.10435\\-143.6559\\-23\\-47.78377\\-143.0209\\-23\\-47.15123\\-142.4223\\-23\\-46.42722\\-141.0678\\-23\\-46.01733\\-139.1146\\-23\\-44.82108\\-137.1615\\-23\\-44.05787\\-135.2084\\-23\\-43.24498\\-134.3816\\-23\\-41.29185\\-132.7095\\-23\\-39.33873\\-131.9652\\-23\\-37.3856\\-130.5317\\-23\\-35.43248\\-129.802\\-23\\-33.47935\\-129.7837\\-23\\-31.52623\\-128.6246\\-23\\-29.5731\\-127.8118\\-23\\-27.61998\\-127.8118\\-23\\-25.66685\\-128.3979\\-23\\-23.71373\\-129.5234\\-23\\-21.7606\\-130.3305\\-23\\-18.93995\\-133.2553\\-23\\-17.85435\\-135.2907\\-23\\-17.07798\\-137.1615\\-23\\-16.44744\\-139.1146\\-23\\-15.70179\\-141.0678\\-23\\-12.24246\\-144.974\\-23\\-12.15892\\-146.9271\\-23\\-11.12286\\-148.8803\\-23\\-11.59505\\-150.8334\\-23\\-11.99498\\-151.1152\\-23\\-13.9481\\-149.8852\\-23\\-14.85308\\-148.8803\\-23\\-15.90123\\-147.3039\\-23\\-17.85435\\-147.6351\\-23\\-18.60142\\-148.8803\\-23\\-19.54482\\-150.8334\\-23\\-21.03373\\-152.7865\\-23\\-23.71373\\-155.4565\\-23\\-25.66685\\-156.7875\\-23\\-27.61998\\-157.3317\\-23\\-29.5731\\-157.4918\\-23\\-33.47935\\-157.4979\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "301" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "30.97377\\-235.3968\\-23\\27.06752\\-233.9508\\-23\\25.1144\\-233.3478\\-23\\23.16127\\-233.4291\\-23\\21.20815\\-233.2568\\-23\\19.25502\\-232.8728\\-23\\17.3019\\-231.9436\\-23\\16.19433\\-230.9115\\-23\\18.77784\\-228.9584\\-23\\21.20815\\-227.8925\\-23\\23.16127\\-226.7936\\-23\\25.1144\\-226.011\\-23\\27.06752\\-224.5972\\-23\\29.02065\\-223.6345\\-23\\30.97377\\-222.0842\\-23\\32.9269\\-220.3263\\-23\\34.96807\\-219.1928\\-23\\38.16992\\-217.2396\\-23\\38.78627\\-216.7811\\-23\\40.7394\\-216.9684\\-23\\42.69252\\-218.6726\\-23\\43.83185\\-219.1928\\-23\\44.64565\\-219.744\\-23\\46.25517\\-221.1459\\-23\\45.94065\\-223.099\\-23\\44.64565\\-224.709\\-23\\44.11131\\-227.0053\\-23\\42.69252\\-228.4797\\-23\\42.41509\\-228.9584\\-23\\40.59676\\-230.9115\\-23\\38.4258\\-234.8178\\-23\\36.83315\\-236.1075\\-23\\34.88002\\-236.4175\\-23\\32.9269\\-236.5221\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "302" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-164.754\\-23\\50.99331\\-164.5053\\-23\\50.50502\\-164.1537\\-23\\49.3274\\-162.5521\\-23\\50.50502\\-161.3009\\-23\\52.45815\\-160.9859\\-23\\53.14174\\-160.599\\-23\\56.3644\\-159.7905\\-23\\57.38123\\-160.599\\-23\\57.65292\\-162.5521\\-23\\56.3644\\-163.6566\\-23\\54.41127\\-163.1518\\-23\\52.95564\\-164.5053\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "97" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "303" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-208.0585\\-23\\53.53459\\-207.474\\-23\\52.96848\\-205.5209\\-23\\53.52657\\-203.5678\\-23\\54.27584\\-201.6146\\-23\\54.30277\\-197.7084\\-23\\53.85413\\-195.7553\\-23\\55.22931\\-193.8021\\-23\\56.25589\\-191.849\\-23\\56.28363\\-189.8959\\-23\\57.31985\\-187.9428\\-23\\58.16891\\-185.9896\\-23\\59.39174\\-184.0365\\-23\\59.07165\\-182.0834\\-23\\58.31752\\-181.2849\\-23\\56.43013\\-180.1303\\-23\\56.67004\\-178.1771\\-23\\56.71092\\-176.224\\-23\\56.26966\\-174.2709\\-23\\56.3644\\-174.1488\\-23\\58.31752\\-174.5261\\-23\\58.99816\\-174.2709\\-23\\59.96732\\-172.3178\\-23\\59.97904\\-166.4584\\-23\\59.59171\\-164.5053\\-23\\60.27065\\-163.9011\\-23\\61.07867\\-162.5521\\-23\\61.3761\\-160.599\\-23\\62.22377\\-159.7108\\-23\\64.1769\\-159.1078\\-23\\66.13003\\-157.8296\\-23\\68.08315\\-157.3137\\-23\\70.03628\\-157.1896\\-23\\71.9894\\-157.8389\\-23\\73.94253\\-159.1167\\-23\\77.84878\\-159.5015\\-23\\79.36307\\-160.599\\-23\\80.84717\\-162.5521\\-23\\83.70815\\-165.4157\\-23\\84.65247\\-166.4584\\-23\\84.47995\\-168.4115\\-23\\83.70815\\-169.1592\\-23\\81.75503\\-169.9557\\-23\\79.8019\\-171.294\\-23\\78.73163\\-172.3178\\-23\\78.51503\\-174.2709\\-23\\79.8019\\-175.1768\\-23\\80.97234\\-176.224\\-23\\82.28937\\-178.1771\\-23\\82.96024\\-180.1303\\-23\\83.19447\\-182.0834\\-23\\83.54656\\-184.0365\\-23\\83.70815\\-184.2148\\-23\\85.66128\\-187.63\\-23\\85.93741\\-187.9428\\-23\\86.94036\\-189.8959\\-23\\87.6144\\-190.6521\\-23\\89.56753\\-191.4596\\-23\\90.02666\\-191.849\\-23\\90.57542\\-193.8021\\-23\\89.56753\\-195.2746\\-23\\89.04168\\-195.7553\\-23\\87.6144\\-196.683\\-23\\85.66128\\-196.0914\\-23\\83.70815\\-196.562\\-23\\81.75503\\-197.7311\\-23\\79.8019\\-198.5183\\-23\\77.75383\\-199.6615\\-23\\75.89565\\-200.3547\\-23\\73.94253\\-201.3483\\-23\\71.9894\\-201.1417\\-23\\70.54552\\-199.6615\\-23\\69.66929\\-197.7084\\-23\\69.62988\\-193.8021\\-23\\69.66929\\-191.849\\-23\\70.65514\\-189.8959\\-23\\71.24992\\-187.9428\\-23\\71.70757\\-184.0365\\-23\\71.67367\\-182.0834\\-23\\70.03628\\-181.0313\\-23\\68.08315\\-182.2055\\-23\\66.13003\\-182.2188\\-23\\64.1769\\-182.9185\\-23\\62.22377\\-183.4418\\-23\\61.28178\\-184.0365\\-23\\60.58546\\-185.9896\\-23\\59.40323\\-187.9428\\-23\\58.59935\\-189.8959\\-23\\58.31752\\-191.2081\\-23\\57.1782\\-191.849\\-23\\58.11245\\-193.8021\\-23\\58.16891\\-197.7084\\-23\\58.55325\\-199.6615\\-23\\59.7479\\-203.5678\\-23\\59.96965\\-205.5209\\-23\\58.31752\\-206.7838\\-23\\56.3644\\-207.3655\\-23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "169" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "304" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-53.0106\\-227.5592\\-21\\-54.96373\\-226.1876\\-21\\-56.91685\\-225.2759\\-21\\-59.09534\\-223.099\\-21\\-60.33482\\-221.1459\\-21\\-60.8231\\-220.5966\\-21\\-62.77623\\-218.8217\\-21\\-64.72935\\-217.8117\\-21\\-65.3374\\-217.2396\\-21\\-66.33595\\-215.2865\\-21\\-66.43833\\-213.3334\\-21\\-66.15406\\-211.3803\\-21\\-65.46329\\-209.4271\\-21\\-64.19847\\-207.474\\-21\\-62.49623\\-205.5209\\-21\\-60.48701\\-203.5678\\-21\\-60.46628\\-201.6146\\-21\\-59.9268\\-199.6615\\-21\\-59.16294\\-197.7084\\-21\\-58.86998\\-196.3767\\-21\\-58.46786\\-195.7553\\-21\\-58.86998\\-195.1338\\-21\\-59.16491\\-193.8021\\-21\\-59.91133\\-191.849\\-21\\-61.74802\\-189.8959\\-21\\-62.81437\\-187.9428\\-21\\-63.67012\\-185.9896\\-21\\-65.66708\\-184.0365\\-21\\-66.68247\\-183.1732\\-21\\-68.6356\\-182.5207\\-21\\-70.58872\\-181.0116\\-21\\-72.54185\\-179.2539\\-21\\-74.49497\\-179.2344\\-21\\-75.10056\\-180.1303\\-21\\-74.49497\\-180.7497\\-21\\-71.89597\\-184.0365\\-21\\-70.82943\\-185.9896\\-21\\-69.35319\\-187.9428\\-21\\-68.37651\\-189.8959\\-21\\-67.91329\\-193.8021\\-21\\-68.33163\\-197.7084\\-21\\-68.36507\\-203.5678\\-21\\-69.62116\\-205.5209\\-21\\-70.38929\\-207.474\\-21\\-71.57017\\-209.4271\\-21\\-77.4295\\-215.2865\\-21\\-78.40122\\-216.2212\\-21\\-80.35435\\-217.0158\\-21\\-82.30747\\-218.1557\\-21\\-84.2606\\-218.9811\\-21\\-86.21372\\-219.0058\\-21\\-88.16685\\-219.3544\\-21\\-90.11997\\-219.5871\\-21\\-92.0731\\-219.2593\\-21\\-94.02622\\-218.6554\\-21\\-97.93247\\-217.0279\\-21\\-101.8387\\-217.0039\\-21\\-103.7918\\-216.0124\\-21\\-107.6981\\-213.4783\\-21\\-110.0802\\-211.3803\\-21\\-111.6043\\-209.9241\\-21\\-113.5575\\-209.2222\\-21\\-115.5106\\-209.0589\\-21\\-117.4637\\-209.2876\\-21\\-119.4168\\-209.6321\\-21\\-121.37\\-210.4508\\-21\\-123.3231\\-212.1103\\-21\\-124.082\\-213.3334\\-21\\-125.2762\\-214.4409\\-21\\-127.2293\\-216.0381\\-21\\-129.1825\\-216.5321\\-21\\-133.0887\\-216.513\\-21\\-135.0419\\-215.8818\\-21\\-136.995\\-214.2638\\-21\\-138.9481\\-212.9672\\-21\\-140.3839\\-211.3803\\-21\\-141.1298\\-209.4271\\-21\\-141.6735\\-207.474\\-21\\-142.0398\\-205.5209\\-21\\-142.5078\\-203.5678\\-21\\-141.5997\\-201.6146\\-21\\-140.9012\\-201.0195\\-21\\-138.9481\\-201.0973\\-21\\-136.995\\-201.4926\\-21\\-135.0419\\-201.5771\\-21\\-133.0887\\-201.9446\\-21\\-131.1356\\-202.7964\\-21\\-129.6774\\-203.5678\\-21\\-129.1825\\-204.0696\\-21\\-127.2293\\-205.3146\\-21\\-123.3231\\-205.4185\\-21\\-117.4637\\-205.3146\\-21\\-115.5106\\-203.839\\-21\\-115.4264\\-203.5678\\-21\\-112.3086\\-199.6615\\-21\\-111.5084\\-197.7084\\-21\\-110.5948\\-195.7553\\-21\\-109.3137\\-193.8021\\-21\\-107.6981\\-192.0157\\-21\\-105.745\\-191.7964\\-21\\-103.7918\\-191.2039\\-21\\-101.8387\\-191.1689\\-21\\-99.8856\\-190.8404\\-21\\-97.93247\\-190.3809\\-21\\-95.97935\\-190.9464\\-21\\-94.02622\\-191.6133\\-21\\-92.0731\\-191.9711\\-21\\-90.11997\\-190.757\\-21\\-89.56602\\-189.8959\\-21\\-88.55616\\-187.9428\\-21\\-86.87736\\-185.9896\\-21\\-85.56785\\-184.0365\\-21\\-85.40793\\-182.0834\\-21\\-85.40793\\-180.1303\\-21\\-85.29142\\-178.1771\\-21\\-84.2606\\-177.024\\-21\\-82.55456\\-176.224\\-21\\-82.83589\\-174.2709\\-21\\-84.2606\\-173.2256\\-21\\-85.19186\\-172.3178\\-21\\-85.72544\\-170.3646\\-21\\-85.52651\\-168.4115\\-21\\-84.88002\\-166.4584\\-21\\-83.54811\\-164.5053\\-21\\-82.69682\\-162.5521\\-21\\-81.47997\\-160.599\\-21\\-80.35435\\-159.4303\\-21\\-78.40122\\-157.986\\-21\\-76.4481\\-157.4089\\-21\\-74.49497\\-157.1896\\-21\\-72.54185\\-157.6646\\-21\\-70.58872\\-159.0989\\-21\\-68.6356\\-159.1342\\-21\\-66.68247\\-159.5973\\-21\\-65.6088\\-160.599\\-21\\-65.08009\\-162.5521\\-21\\-64.7672\\-164.5053\\-21\\-64.34241\\-166.4584\\-21\\-64.30398\\-168.4115\\-21\\-63.87786\\-170.3646\\-21\\-62.85886\\-172.3178\\-21\\-62.36983\\-174.2709\\-21\\-62.35085\\-176.224\\-21\\-62.16254\\-178.1771\\-21\\-61.57703\\-180.1303\\-21\\-60.46628\\-182.0834\\-21\\-60.46628\\-184.0365\\-21\\-60.19831\\-185.9896\\-21\\-59.67505\\-187.9428\\-21\\-57.83238\\-189.8959\\-21\\-56.82211\\-191.849\\-21\\-56.79478\\-193.8021\\-21\\-56.43745\\-195.7553\\-21\\-55.29982\\-199.6615\\-21\\-53.71313\\-203.5678\\-21\\-52.12775\\-205.5209\\-21\\-51.35241\\-207.474\\-21\\-50.18649\\-209.4271\\-21\\-48.72342\\-213.3334\\-21\\-47.66029\\-215.2865\\-21\\-45.75984\\-217.2396\\-21\\-46.34647\\-219.1928\\-21\\-45.8412\\-221.1459\\-21\\-45.00279\\-223.099\\-21\\-44.86201\\-227.0053\\-21\\-45.1981\\-227.3698\\-21\\-47.15123\\-228.2083\\-21\\-49.10435\\-228.0702\\-21\\-51.05748\\-228.0512\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "305" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1636\\-21\\-39.33873\\-155.6987\\-21\\-41.29185\\-155.2193\\-21\\-43.24498\\-153.787\\-21\\-44.28631\\-152.7865\\-21\\-46.03439\\-150.8334\\-21\\-46.69824\\-148.8803\\-21\\-47.15123\\-148.3581\\-21\\-49.10435\\-146.8186\\-21\\-51.05748\\-147.9601\\-21\\-52.89986\\-146.9271\\-21\\-52.01878\\-144.974\\-21\\-51.05748\\-144.0512\\-21\\-49.10435\\-143.0285\\-21\\-47.21781\\-141.0678\\-21\\-46.60501\\-139.1146\\-21\\-45.82156\\-137.1615\\-21\\-44.60344\\-135.2084\\-21\\-43.24498\\-133.7257\\-21\\-41.29185\\-132.2692\\-21\\-39.33873\\-131.5138\\-21\\-37.3856\\-130.3448\\-21\\-35.43248\\-129.802\\-21\\-33.47935\\-129.7837\\-21\\-31.52623\\-128.6206\\-21\\-29.5731\\-127.8306\\-21\\-27.61998\\-127.8213\\-21\\-25.66685\\-128.0523\\-21\\-23.71373\\-128.8116\\-21\\-21.7606\\-129.9806\\-21\\-19.80748\\-131.5183\\-21\\-17.85435\\-134.8322\\-21\\-17.54836\\-135.2084\\-21\\-16.04983\\-139.1146\\-21\\-15.12101\\-141.0678\\-21\\-13.09217\\-143.0209\\-21\\-12.20668\\-144.974\\-21\\-12.17183\\-146.9271\\-21\\-11.12286\\-148.8803\\-21\\-11.59505\\-150.8334\\-21\\-11.99498\\-151.1152\\-21\\-13.9481\\-149.544\\-21\\-14.45685\\-148.8803\\-21\\-15.23716\\-146.9271\\-21\\-15.90123\\-146.2743\\-21\\-17.85435\\-146.978\\-21\\-18.71171\\-148.8803\\-21\\-20.54885\\-150.8334\\-21\\-21.7606\\-152.3363\\-21\\-24.21983\\-154.7396\\-21\\-25.66685\\-155.841\\-21\\-27.61998\\-156.7875\\-21\\-29.5731\\-157.1724\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "32" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "306" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "34.88002\\-235.6556\\-21\\33.40501\\-234.8178\\-21\\30.97377\\-233.0349\\-21\\29.02065\\-232.656\\-21\\25.1144\\-230.6243\\-21\\23.16127\\-231.1312\\-21\\21.20815\\-231.0792\\-21\\20.74699\\-230.9115\\-21\\21.20815\\-230.5506\\-21\\22.35256\\-228.9584\\-21\\23.16127\\-228.4559\\-21\\25.07684\\-227.0053\\-21\\28.89123\\-225.0521\\-21\\30.97377\\-223.81\\-21\\33.66528\\-221.1459\\-21\\38.78627\\-216.7107\\-21\\40.7394\\-215.9801\\-21\\42.69252\\-216.4365\\-21\\44.64565\\-216.6189\\-21\\46.59877\\-215.5286\\-21\\48.5519\\-214.084\\-21\\50.50502\\-213.4699\\-21\\51.81468\\-215.2865\\-21\\52.194\\-217.2396\\-21\\52.00371\\-219.1928\\-21\\50.50502\\-221.6799\\-21\\48.82271\\-225.0521\\-21\\47.22656\\-227.0053\\-21\\43.32031\\-230.9115\\-21\\40.7394\\-233.1291\\-21\\38.78627\\-235.152\\-21\\36.83315\\-235.9552\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "307" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-209.5356\\-21\\52.25871\\-207.474\\-21\\52.27115\\-205.5209\\-21\\52.45815\\-205.2673\\-21\\54.23689\\-201.6146\\-21\\54.30277\\-197.7084\\-21\\53.91657\\-195.7553\\-21\\56.25589\\-191.849\\-21\\56.28363\\-189.8959\\-21\\57.33559\\-187.9428\\-21\\58.18982\\-185.9896\\-21\\58.91044\\-185.9896\\-21\\59.23399\\-187.9428\\-21\\58.55325\\-189.8959\\-21\\58.31752\\-191.2105\\-21\\57.27993\\-191.849\\-21\\58.15757\\-193.8021\\-21\\58.20902\\-197.7084\\-21\\59.0575\\-199.6615\\-21\\59.68361\\-201.6146\\-21\\61.1935\\-205.5209\\-21\\61.30825\\-207.474\\-21\\60.27065\\-208.0311\\-21\\58.31752\\-207.8711\\-21\\56.3644\\-208.3778\\-21\\54.41127\\-209.8334\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "84" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "308" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "71.9894\\-202.1803\\-21\\71.41673\\-201.6146\\-21\\70.46963\\-199.6615\\-21\\69.64934\\-195.7553\\-21\\69.67945\\-191.849\\-21\\70.69672\\-189.8959\\-21\\71.30522\\-187.9428\\-21\\71.68543\\-184.0365\\-21\\71.67367\\-182.0834\\-21\\70.03628\\-181.0313\\-21\\68.08315\\-182.2055\\-21\\66.13003\\-182.2055\\-21\\62.22377\\-182.8006\\-21\\60.27065\\-182.5991\\-21\\59.93805\\-182.0834\\-21\\58.31752\\-180.7362\\-21\\56.3644\\-181.5362\\-21\\54.80344\\-180.1303\\-21\\55.93105\\-176.224\\-21\\56.26966\\-174.2709\\-21\\57.03257\\-174.2709\\-21\\58.31752\\-174.9889\\-21\\59.05734\\-174.2709\\-21\\59.94789\\-172.3178\\-21\\59.99065\\-170.3646\\-21\\59.50939\\-168.4115\\-21\\59.6626\\-166.4584\\-21\\58.31752\\-165.2702\\-21\\57.45862\\-166.4584\\-21\\56.3644\\-167.3152\\-21\\54.41127\\-166.666\\-21\\51.0853\\-164.5053\\-21\\52.45815\\-162.5721\\-21\\54.41127\\-163.2888\\-21\\54.77642\\-162.5521\\-21\\55.00981\\-160.599\\-21\\56.3644\\-159.7362\\-21\\57.88219\\-160.599\\-21\\58.31752\\-161.0143\\-21\\59.00716\\-162.5521\\-21\\60.27065\\-164.4671\\-21\\61.55399\\-162.5521\\-21\\61.82705\\-160.599\\-21\\62.22377\\-160.1069\\-21\\64.1769\\-158.3599\\-21\\66.13003\\-157.5359\\-21\\68.08315\\-157.181\\-21\\70.03628\\-157.1896\\-21\\71.9894\\-157.6693\\-21\\73.94253\\-158.8329\\-21\\75.89565\\-159.4873\\-21\\77.84878\\-159.4722\\-21\\79.8019\\-159.9283\\-21\\80.44778\\-160.599\\-21\\81.75503\\-162.2572\\-21\\83.99976\\-164.5053\\-21\\85.11555\\-166.4584\\-21\\84.74125\\-168.4115\\-21\\83.70815\\-169.3418\\-21\\81.75503\\-170.3723\\-21\\79.8019\\-171.3038\\-21\\78.73701\\-172.3178\\-21\\79.4277\\-174.2709\\-21\\79.8019\\-174.5414\\-21\\81.75503\\-175.3479\\-21\\82.55357\\-176.224\\-21\\82.97451\\-178.1771\\-21\\83.58608\\-180.1303\\-21\\83.99011\\-182.0834\\-21\\84.50065\\-184.0365\\-21\\85.17592\\-185.9896\\-21\\86.41714\\-187.9428\\-21\\87.9562\\-189.8959\\-21\\90.42767\\-191.849\\-21\\90.44939\\-193.8021\\-21\\88.9183\\-195.7553\\-21\\87.6144\\-197.0592\\-21\\85.66128\\-196.7318\\-21\\83.70815\\-196.7919\\-21\\81.75503\\-197.775\\-21\\79.8019\\-198.5291\\-21\\77.84878\\-199.9433\\-21\\75.89565\\-200.8121\\-21\\73.94253\\-202.4672\\-21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "24" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "309" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-135.0419\\-214.1947\\-19\\-136.995\\-212.9466\\-19\\-138.9481\\-211.9582\\-19\\-139.4693\\-211.3803\\-19\\-139.9778\\-209.4271\\-19\\-140.3785\\-207.474\\-19\\-141.6436\\-205.5209\\-19\\-141.9344\\-203.5678\\-19\\-141.7852\\-201.6146\\-19\\-140.9012\\-200.6225\\-19\\-138.9481\\-200.5324\\-19\\-136.995\\-201.1146\\-19\\-135.0419\\-201.9186\\-19\\-133.0887\\-202.9292\\-19\\-132.397\\-203.5678\\-19\\-131.1356\\-205.9623\\-19\\-129.6029\\-207.474\\-19\\-127.4037\\-209.4271\\-19\\-125.8437\\-211.3803\\-19\\-125.7645\\-213.3334\\-19\\-127.2293\\-214.5001\\-19\\-129.1825\\-215.0359\\-19\\-131.1356\\-215.1293\\-19\\-133.0887\\-215.0978\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "139" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "310" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-53.0106\\-227.8294\\-19\\-54.96373\\-226.391\\-19\\-56.91685\\-225.8719\\-19\\-59.69734\\-223.099\\-19\\-60.8231\\-221.7481\\-19\\-62.77623\\-219.7976\\-19\\-65.79623\\-217.2396\\-19\\-67.43683\\-215.2865\\-19\\-67.88847\\-213.3334\\-19\\-67.41067\\-211.3803\\-19\\-66.09544\\-209.4271\\-19\\-65.48421\\-207.474\\-19\\-64.72935\\-206.6982\\-19\\-62.77623\\-205.1242\\-19\\-60.8231\\-203.88\\-19\\-60.51914\\-203.5678\\-19\\-60.46628\\-201.6146\\-19\\-60.19493\\-199.6615\\-19\\-59.76802\\-197.7084\\-19\\-58.86998\\-194.4092\\-19\\-57.62215\\-193.8021\\-19\\-58.86998\\-193.5498\\-19\\-59.63834\\-191.849\\-19\\-61.35961\\-189.8959\\-19\\-61.92243\\-187.9428\\-19\\-61.55552\\-185.9896\\-19\\-62.77623\\-185.4262\\-19\\-64.72935\\-184.3425\\-19\\-66.68247\\-183.0327\\-19\\-68.6356\\-182.1642\\-19\\-72.2249\\-180.1303\\-19\\-72.54185\\-179.8776\\-19\\-73.05804\\-180.1303\\-19\\-73.42841\\-182.0834\\-19\\-72.12332\\-184.0365\\-19\\-70.96432\\-185.9896\\-19\\-68.83091\\-187.9428\\-19\\-68.36507\\-189.8959\\-19\\-68.33163\\-193.8021\\-19\\-68.34263\\-201.6146\\-19\\-68.78421\\-203.5678\\-19\\-69.77013\\-205.5209\\-19\\-70.41434\\-207.474\\-19\\-71.57017\\-209.4271\\-19\\-77.4295\\-215.2865\\-19\\-78.40122\\-216.2212\\-19\\-80.35435\\-217.0158\\-19\\-82.30747\\-218.1557\\-19\\-84.2606\\-218.9811\\-19\\-86.21372\\-218.9933\\-19\\-88.16685\\-219.6724\\-19\\-90.11997\\-219.988\\-19\\-92.0731\\-219.5183\\-19\\-94.02622\\-218.2011\\-19\\-95.97935\\-217.7016\\-19\\-99.8856\\-217.0158\\-19\\-101.8387\\-216.7309\\-19\\-103.7918\\-215.8014\\-19\\-105.745\\-214.2834\\-19\\-106.7732\\-213.3334\\-19\\-108.0497\\-211.3803\\-19\\-109.2163\\-209.4271\\-19\\-111.0111\\-207.474\\-19\\-111.1824\\-205.5209\\-19\\-110.3649\\-203.5678\\-19\\-110.4584\\-201.6146\\-19\\-109.7985\\-197.7084\\-19\\-109.13\\-195.7553\\-19\\-107.9992\\-193.8021\\-19\\-107.6981\\-193.5154\\-19\\-103.7918\\-192.076\\-19\\-101.8387\\-191.6496\\-19\\-97.93247\\-191.1922\\-19\\-95.97935\\-191.2032\\-19\\-94.02622\\-191.3549\\-19\\-92.0731\\-192.4679\\-19\\-90.32809\\-191.849\\-19\\-90.11997\\-191.6049\\-19\\-89.59723\\-189.8959\\-19\\-88.8307\\-187.9428\\-19\\-87.14356\\-185.9896\\-19\\-85.76074\\-184.0365\\-19\\-85.75176\\-180.1303\\-19\\-85.46362\\-178.1771\\-19\\-84.2606\\-176.932\\-19\\-82.46818\\-176.224\\-19\\-82.8161\\-174.2709\\-19\\-84.2606\\-173.2256\\-19\\-85.19186\\-172.3178\\-19\\-85.73412\\-170.3646\\-19\\-85.70841\\-168.4115\\-19\\-85.26575\\-166.4584\\-19\\-84.11199\\-164.5053\\-19\\-83.33243\\-162.5521\\-19\\-82.30747\\-160.7022\\-19\\-79.79335\\-158.6459\\-19\\-78.40122\\-157.7413\\-19\\-76.4481\\-157.2147\\-19\\-74.49497\\-157.181\\-19\\-72.54185\\-157.6646\\-19\\-70.58872\\-159.1078\\-19\\-68.6356\\-159.2986\\-19\\-66.68247\\-160.3567\\-19\\-66.45712\\-160.599\\-19\\-65.95005\\-162.5521\\-19\\-65.6312\\-164.5053\\-19\\-64.81136\\-166.4584\\-19\\-64.33262\\-168.4115\\-19\\-64.13701\\-170.3646\\-19\\-63.69012\\-172.3178\\-19\\-62.85823\\-174.2709\\-19\\-62.36028\\-176.224\\-19\\-62.34154\\-178.1771\\-19\\-61.79098\\-180.1303\\-19\\-60.50829\\-182.0834\\-19\\-61.00501\\-184.0365\\-19\\-60.52817\\-185.9896\\-19\\-59.58988\\-187.9428\\-19\\-58.86998\\-188.6112\\-19\\-57.83734\\-189.8959\\-19\\-56.86467\\-191.849\\-19\\-56.82211\\-193.8021\\-19\\-56.00441\\-195.7553\\-19\\-55.29982\\-197.7084\\-19\\-54.91154\\-199.6615\\-19\\-53.29243\\-203.5678\\-19\\-51.88593\\-205.5209\\-19\\-50.67561\\-207.474\\-19\\-49.77195\\-209.4271\\-19\\-48.21412\\-211.3803\\-19\\-48.13282\\-213.3334\\-19\\-47.83418\\-215.2865\\-19\\-47.88108\\-217.2396\\-19\\-48.81829\\-219.1928\\-19\\-47.8364\\-221.1459\\-19\\-45.25028\\-227.0053\\-19\\-47.15123\\-228.6654\\-19\\-49.10435\\-228.3298\\-19\\-51.05748\\-228.3228\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "311" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1636\\-19\\-39.33873\\-155.6987\\-19\\-41.29185\\-155.2193\\-19\\-43.24498\\-153.787\\-19\\-46.25096\\-150.8334\\-19\\-46.89214\\-148.8803\\-19\\-48.38509\\-146.9271\\-19\\-49.10435\\-146.2561\\-19\\-51.05748\\-147.2168\\-19\\-51.83429\\-146.9271\\-19\\-52.50354\\-144.974\\-19\\-51.05748\\-143.6923\\-19\\-49.10435\\-142.2946\\-19\\-48.00776\\-141.0678\\-19\\-47.20341\\-139.1146\\-19\\-45.1981\\-135.2176\\-19\\-43.77708\\-133.2553\\-19\\-43.24498\\-132.746\\-19\\-41.29185\\-131.9549\\-19\\-39.33873\\-130.7577\\-19\\-37.3856\\-129.9948\\-19\\-35.43248\\-129.7929\\-19\\-33.47935\\-129.7837\\-19\\-31.52623\\-128.8577\\-19\\-29.5731\\-128.2246\\-19\\-25.66685\\-128.2246\\-19\\-23.71373\\-128.7869\\-19\\-21.7606\\-129.7929\\-19\\-19.80748\\-130.5685\\-19\\-19.07379\\-131.3021\\-19\\-18.35412\\-133.2553\\-19\\-17.10431\\-135.2084\\-19\\-16.42318\\-137.1615\\-19\\-16.04983\\-139.1146\\-19\\-14.73917\\-141.0678\\-19\\-12.5407\\-143.0209\\-19\\-12.16936\\-144.974\\-19\\-12.18372\\-146.9271\\-19\\-11.12286\\-148.8803\\-19\\-11.59505\\-150.8334\\-19\\-11.99498\\-151.1152\\-19\\-12.38743\\-150.8334\\-19\\-14.18382\\-148.8803\\-19\\-15.02482\\-146.9271\\-19\\-15.90123\\-146.0975\\-19\\-17.85435\\-147.0356\\-19\\-18.71171\\-148.8803\\-19\\-23.71373\\-153.8677\\-19\\-25.66685\\-155.3539\\-19\\-27.61998\\-156.0398\\-19\\-29.5731\\-157.181\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "312" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "36.81145\\-234.8178\\-19\\34.88002\\-234.2057\\-19\\32.9269\\-233.0119\\-19\\30.97377\\-231.5347\\-19\\29.58074\\-230.9115\\-19\\27.28036\\-228.9584\\-19\\28.81407\\-227.0053\\-19\\30.97377\\-225.7943\\-19\\39.55684\\-217.2396\\-19\\40.7394\\-216.2816\\-19\\42.69252\\-215.7574\\-19\\44.64565\\-215.0356\\-19\\46.59877\\-214.043\\-19\\48.5519\\-212.3889\\-19\\50.50502\\-210.9881\\-19\\51.56514\\-209.4271\\-19\\52.25871\\-207.474\\-19\\52.27115\\-205.5209\\-19\\53.13816\\-203.5678\\-19\\53.73917\\-201.6146\\-19\\54.26266\\-197.7084\\-19\\54.2892\\-195.7553\\-19\\56.25589\\-191.849\\-19\\56.28363\\-189.8959\\-19\\58.31752\\-185.8501\\-19\\60.27065\\-185.6641\\-19\\60.43224\\-185.9896\\-19\\59.38612\\-187.9428\\-19\\59.03173\\-189.8959\\-19\\58.84336\\-191.849\\-19\\58.22278\\-195.7553\\-19\\58.61049\\-197.7084\\-19\\60.08365\\-201.6146\\-19\\61.03761\\-203.5678\\-19\\63.16068\\-207.474\\-19\\62.22377\\-209.3197\\-19\\60.27065\\-209.1123\\-19\\58.31752\\-208.6595\\-19\\56.3644\\-209.7131\\-19\\52.94643\\-211.3803\\-19\\52.45815\\-212.0778\\-19\\51.9445\\-213.3334\\-19\\53.17505\\-215.2865\\-19\\53.92651\\-217.2396\\-19\\53.90207\\-219.1928\\-19\\53.033\\-221.1459\\-19\\51.63068\\-223.099\\-19\\50.56774\\-225.0521\\-19\\48.86805\\-227.0053\\-19\\46.59877\\-229.2404\\-19\\44.48406\\-230.9115\\-19\\42.69252\\-232.0644\\-19\\40.7394\\-233.6469\\-19\\38.78627\\-234.5703\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "73" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "313" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "71.9894\\-202.4704\\-19\\71.1731\\-201.6146\\-19\\70.85835\\-199.6615\\-19\\70.92355\\-197.7084\\-19\\70.38456\\-195.7553\\-19\\70.35017\\-193.8021\\-19\\69.99871\\-191.849\\-19\\70.07442\\-189.8959\\-19\\70.47105\\-187.9428\\-19\\71.9894\\-181.9362\\-19\\70.03628\\-181.0262\\-19\\68.08315\\-182.2188\\-19\\66.13003\\-182.245\\-19\\62.22377\\-182.8429\\-19\\61.09436\\-182.0834\\-19\\59.48779\\-180.1303\\-19\\59.83066\\-178.1771\\-19\\59.84747\\-174.2709\\-19\\59.98817\\-172.3178\\-19\\59.74422\\-170.3646\\-19\\58.31752\\-168.83\\-19\\57.5513\\-168.4115\\-19\\56.10088\\-166.4584\\-19\\56.01563\\-164.5053\\-19\\56.3644\\-162.4148\\-19\\58.31752\\-161.0906\\-19\\59.31192\\-162.5521\\-19\\58.73004\\-164.5053\\-19\\60.27065\\-166.6415\\-19\\61.44638\\-164.5053\\-19\\62.34675\\-162.5521\\-19\\62.27596\\-160.599\\-19\\63.00613\\-158.6459\\-19\\64.1769\\-157.6358\\-19\\66.13003\\-157.2958\\-19\\68.08315\\-157.1547\\-19\\70.03628\\-157.1547\\-19\\71.9894\\-157.356\\-19\\73.94253\\-158.0704\\-19\\75.89565\\-159.3349\\-19\\77.84878\\-159.4998\\-19\\79.8019\\-159.9051\\-19\\81.75503\\-161.6609\\-19\\84.78385\\-164.5053\\-19\\86.38114\\-166.4584\\-19\\85.20889\\-168.4115\\-19\\83.70815\\-169.3608\\-19\\81.75503\\-170.3873\\-19\\79.8019\\-171.3086\\-19\\78.73701\\-172.3178\\-19\\78.8724\\-174.2709\\-19\\79.8019\\-174.7328\\-19\\81.75503\\-174.8071\\-19\\83.01203\\-176.224\\-19\\83.22854\\-178.1771\\-19\\84.42907\\-180.1303\\-19\\84.8049\\-182.0834\\-19\\84.91337\\-184.0365\\-19\\85.98894\\-185.9896\\-19\\86.78736\\-187.9428\\-19\\87.6144\\-188.9138\\-19\\89.56753\\-190.7993\\-19\\91.04338\\-191.849\\-19\\91.03711\\-193.8021\\-19\\89.56753\\-194.7541\\-19\\87.6144\\-197.0517\\-19\\85.66128\\-197.9884\\-19\\83.70815\\-197.9377\\-19\\81.75503\\-198.3913\\-19\\79.8019\\-199.0988\\-19\\76.72258\\-201.6146\\-19\\75.89565\\-202.422\\-19\\73.94253\\-203.35\\-19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "16" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "314" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-137.1171\\-211.3803\\-17\\-138.5074\\-209.4271\\-17\\-138.9481\\-208.6489\\-17\\-140.2362\\-205.5209\\-17\\-140.6116\\-203.5678\\-17\\-140.617\\-201.6146\\-17\\-138.9481\\-200.4499\\-17\\-136.995\\-201.0657\\-17\\-135.0419\\-202.6575\\-17\\-134.0843\\-203.5678\\-17\\-133.1596\\-205.5209\\-17\\-132.7705\\-207.474\\-17\\-131.4954\\-209.4271\\-17\\-131.2492\\-211.3803\\-17\\-133.0887\\-212.6162\\-17\\-135.0419\\-212.3648\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "83" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "315" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.11997\\-219.2593\\-17\\-92.0731\\-218.5923\\-17\\-94.02622\\-217.819\\-17\\-97.93247\\-217.6167\\-17\\-101.8387\\-216.2631\\-17\\-103.3931\\-215.2865\\-17\\-105.9432\\-213.3334\\-17\\-109.2874\\-207.474\\-17\\-108.7178\\-203.5678\\-17\\-109.2165\\-201.6146\\-17\\-109.0829\\-199.6615\\-17\\-108.5843\\-197.7084\\-17\\-107.9698\\-195.7553\\-17\\-106.2019\\-193.8021\\-17\\-105.745\\-193.4723\\-17\\-103.7918\\-192.6823\\-17\\-101.8387\\-191.6373\\-17\\-97.93247\\-191.5899\\-17\\-95.97935\\-191.1052\\-17\\-94.02622\\-190.7742\\-17\\-92.08296\\-191.849\\-17\\-90.11997\\-190.964\\-17\\-88.53619\\-187.9428\\-17\\-87.29612\\-185.9896\\-17\\-86.58984\\-184.0365\\-17\\-86.56823\\-182.0834\\-17\\-86.16154\\-180.1303\\-17\\-85.87764\\-178.1771\\-17\\-84.2606\\-176.7622\\-17\\-83.42231\\-176.224\\-17\\-83.14529\\-174.2709\\-17\\-85.212\\-172.3178\\-17\\-85.77904\\-170.3646\\-17\\-85.76984\\-168.4115\\-17\\-85.55743\\-166.4584\\-17\\-85.0601\\-164.5053\\-17\\-83.8326\\-162.5521\\-17\\-82.97427\\-160.599\\-17\\-82.30747\\-159.9138\\-17\\-80.35435\\-159.1167\\-17\\-78.40122\\-157.7413\\-17\\-76.4481\\-157.2147\\-17\\-74.49497\\-157.181\\-17\\-72.54185\\-157.6506\\-17\\-70.58872\\-159.0806\\-17\\-68.6356\\-159.6122\\-17\\-67.59429\\-160.599\\-17\\-66.68247\\-162.8384\\-17\\-66.13626\\-164.5053\\-17\\-65.64753\\-166.4584\\-17\\-64.82553\\-168.4115\\-17\\-64.33262\\-170.3646\\-17\\-64.13701\\-172.3178\\-17\\-63.53933\\-174.2709\\-17\\-62.36028\\-176.224\\-17\\-62.34154\\-178.1771\\-17\\-61.80399\\-180.1303\\-17\\-61.03604\\-182.0834\\-17\\-62.77623\\-183.5863\\-17\\-64.72935\\-183.3221\\-17\\-66.68247\\-182.8924\\-17\\-68.6356\\-181.6527\\-17\\-70.58872\\-181.0414\\-17\\-72.54185\\-180.7399\\-17\\-73.77341\\-182.0834\\-17\\-71.9966\\-185.9896\\-17\\-68.79556\\-187.9428\\-17\\-69.01427\\-189.8959\\-17\\-68.36507\\-193.8021\\-17\\-68.74574\\-195.7553\\-17\\-68.73106\\-197.7084\\-17\\-68.39988\\-199.6615\\-17\\-68.79836\\-201.6146\\-17\\-69.55821\\-203.5678\\-17\\-70.82445\\-207.474\\-17\\-71.72296\\-209.4271\\-17\\-73.51841\\-211.3803\\-17\\-78.40122\\-216.2119\\-17\\-80.35435\\-216.9921\\-17\\-82.30747\\-218.1464\\-17\\-84.2606\\-218.957\\-17\\-86.21372\\-218.9811\\-17\\-88.16685\\-219.3414\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "316" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-49.10435\\-228.3298\\-17\\-51.05748\\-228.2955\\-17\\-53.0106\\-227.8199\\-17\\-54.96373\\-226.3697\\-17\\-56.91685\\-225.8561\\-17\\-60.8231\\-221.952\\-17\\-62.77623\\-220.1267\\-17\\-64.72935\\-219.2321\\-17\\-66.95213\\-217.2396\\-17\\-68.0588\\-215.2865\\-17\\-68.33163\\-213.3334\\-17\\-67.69952\\-211.3803\\-17\\-66.29554\\-209.4271\\-17\\-65.74294\\-207.474\\-17\\-64.72935\\-206.4884\\-17\\-61.02539\\-203.5678\\-17\\-60.47658\\-201.6146\\-17\\-60.46628\\-199.6615\\-17\\-60.21275\\-197.7084\\-17\\-59.78306\\-195.7553\\-17\\-58.86998\\-192.6059\\-17\\-56.91685\\-193.6122\\-17\\-55.82909\\-195.7553\\-17\\-54.9561\\-197.7084\\-17\\-54.89714\\-199.6615\\-17\\-53.85358\\-201.6146\\-17\\-52.59909\\-203.5678\\-17\\-51.74412\\-205.5209\\-17\\-50.16829\\-207.474\\-17\\-49.28127\\-209.4271\\-17\\-47.98754\\-211.3803\\-17\\-48.19532\\-213.3334\\-17\\-48.62495\\-215.2865\\-17\\-49.56499\\-217.2396\\-17\\-50.23367\\-219.1928\\-17\\-49.69965\\-221.1459\\-17\\-47.52232\\-225.0521\\-17\\-46.06794\\-227.0053\\-17\\-47.06154\\-228.9584\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "317" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1636\\-17\\-39.33873\\-155.6987\\-17\\-41.29185\\-155.2193\\-17\\-43.24498\\-153.787\\-17\\-46.23538\\-150.8334\\-17\\-46.8694\\-148.8803\\-17\\-48.2033\\-146.9271\\-17\\-49.10435\\-146.0353\\-17\\-51.05748\\-146.2705\\-17\\-52.92182\\-144.974\\-17\\-51.05748\\-142.9982\\-17\\-49.10435\\-141.3907\\-17\\-48.83198\\-141.0678\\-17\\-46.60501\\-137.1615\\-17\\-45.78978\\-135.2084\\-17\\-43.24498\\-132.4894\\-17\\-41.29185\\-131.799\\-17\\-39.33873\\-130.5199\\-17\\-37.3856\\-129.802\\-17\\-33.47935\\-129.7837\\-17\\-31.52623\\-129.5106\\-17\\-29.5731\\-129.048\\-17\\-25.66685\\-129.048\\-17\\-21.7606\\-129.811\\-17\\-19.80748\\-130.4899\\-17\\-18.97111\\-131.3021\\-17\\-17.85435\\-133.3414\\-17\\-16.06281\\-137.1615\\-17\\-16.04983\\-139.1146\\-17\\-14.75201\\-141.0678\\-17\\-12.51772\\-143.0209\\-17\\-12.17062\\-144.974\\-17\\-12.21095\\-146.9271\\-17\\-11.12286\\-148.8803\\-17\\-11.59505\\-150.8334\\-17\\-11.99498\\-151.1152\\-17\\-12.38743\\-150.8334\\-17\\-14.1719\\-148.8803\\-17\\-14.94076\\-146.9271\\-17\\-15.90123\\-146.1065\\-17\\-17.2255\\-146.9271\\-17\\-17.85435\\-147.6075\\-17\\-18.61925\\-148.8803\\-17\\-19.80748\\-150.3246\\-17\\-22.26443\\-152.7865\\-17\\-23.71373\\-154.072\\-17\\-25.66685\\-155.2533\\-17\\-27.61998\\-155.8344\\-17\\-29.5731\\-157.181\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "138" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "318" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "36.83315\\-233.6978\\-17\\35.35854\\-232.8646\\-17\\33.23978\\-230.9115\\-17\\31.31392\\-228.9584\\-17\\32.07369\\-227.0053\\-17\\32.9269\\-226.143\\-17\\33.7407\\-225.0521\\-17\\36.83315\\-221.9442\\-17\\39.19058\\-219.1928\\-17\\40.7394\\-217.6439\\-17\\42.69252\\-216.1708\\-17\\44.64565\\-214.4409\\-17\\46.59877\\-212.5936\\-17\\48.5519\\-211.3137\\-17\\50.50502\\-210.6114\\-17\\51.70302\\-209.4271\\-17\\52.27115\\-207.474\\-17\\52.27115\\-205.5209\\-17\\52.96198\\-201.6146\\-17\\53.37067\\-199.6615\\-17\\53.94086\\-197.7084\\-17\\54.26266\\-195.7553\\-17\\56.25589\\-191.849\\-17\\56.28363\\-189.8959\\-17\\57.31985\\-187.9428\\-17\\58.18209\\-185.9896\\-17\\59.33341\\-184.0365\\-17\\60.05441\\-182.0834\\-17\\60.00011\\-180.1303\\-17\\60.01156\\-174.2709\\-17\\60.51814\\-172.3178\\-17\\60.58877\\-170.3646\\-17\\60.90039\\-168.4115\\-17\\61.83514\\-166.4584\\-17\\62.22377\\-165.922\\-17\\62.79855\\-164.5053\\-17\\63.08373\\-162.5521\\-17\\63.05312\\-160.599\\-17\\63.19042\\-158.6459\\-17\\64.1769\\-157.6594\\-17\\68.08315\\-156.6546\\-17\\70.03628\\-156.7875\\-17\\71.9894\\-157.1724\\-17\\73.94253\\-157.6645\\-17\\75.89565\\-158.7945\\-17\\79.8019\\-160.1901\\-17\\80.21601\\-160.599\\-17\\83.03527\\-162.5521\\-17\\83.70815\\-163.1652\\-17\\85.66128\\-164.2508\\-17\\85.91936\\-164.5053\\-17\\86.89456\\-166.4584\\-17\\86.0736\\-168.4115\\-17\\85.66128\\-168.7706\\-17\\83.70815\\-169.5365\\-17\\81.75503\\-170.6902\\-17\\79.8019\\-171.4744\\-17\\78.85844\\-172.3178\\-17\\77.18762\\-174.2709\\-17\\77.84878\\-175.7093\\-17\\81.75503\\-174.7328\\-17\\83.70815\\-175.7594\\-17\\84.08473\\-176.224\\-17\\84.17232\\-178.1771\\-17\\84.73679\\-180.1303\\-17\\85.07641\\-182.0834\\-17\\84.917\\-184.0365\\-17\\85.22392\\-185.9896\\-17\\86.68501\\-187.9428\\-17\\87.6144\\-188.9771\\-17\\89.56753\\-190.2124\\-17\\91.52065\\-191.1958\\-17\\92.21122\\-191.849\\-17\\92.47233\\-193.8021\\-17\\91.52065\\-194.7599\\-17\\89.56753\\-195.2851\\-17\\89.15534\\-195.7553\\-17\\88.10614\\-197.7084\\-17\\87.6144\\-198.2587\\-17\\85.66128\\-199.6351\\-17\\83.70815\\-199.6527\\-17\\81.75503\\-200.283\\-17\\79.75224\\-201.6146\\-17\\77.84878\\-202.5059\\-17\\75.89565\\-204.3767\\-17\\73.94253\\-204.2095\\-17\\73.2971\\-203.5678\\-17\\71.88089\\-201.6146\\-17\\71.45828\\-199.6615\\-17\\71.49255\\-197.7084\\-17\\71.25117\\-195.7553\\-17\\71.24227\\-193.8021\\-17\\70.87253\\-191.849\\-17\\70.40166\\-189.8959\\-17\\70.47363\\-185.9896\\-17\\71.14887\\-184.0365\\-17\\72.69065\\-182.0834\\-17\\73.07583\\-180.1303\\-17\\71.9894\\-179.5659\\-17\\71.36858\\-180.1303\\-17\\68.08315\\-182.3191\\-17\\66.13003\\-182.5832\\-17\\64.1769\\-183.1031\\-17\\62.68181\\-184.0365\\-17\\62.22377\\-184.4905\\-17\\61.23018\\-185.9896\\-17\\59.36029\\-187.9428\\-17\\59.19199\\-189.8959\\-17\\59.53555\\-191.849\\-17\\58.8956\\-195.7553\\-17\\59.18391\\-197.7084\\-17\\59.73641\\-199.6615\\-17\\60.27065\\-200.9778\\-17\\61.54282\\-203.5678\\-17\\63.1381\\-205.5209\\-17\\63.9899\\-207.474\\-17\\64.27531\\-209.4271\\-17\\62.22377\\-210.8817\\-17\\60.27065\\-210.2174\\-17\\58.31752\\-208.9742\\-17\\56.3644\\-210.0466\\-17\\54.41127\\-210.598\\-17\\52.33775\\-211.3803\\-17\\51.80149\\-213.3334\\-17\\53.09076\\-215.2865\\-17\\55.01177\\-217.2396\\-17\\55.23677\\-219.1928\\-17\\54.23176\\-221.1459\\-17\\53.56688\\-223.099\\-17\\52.43077\\-225.0521\\-17\\50.50502\\-226.131\\-17\\47.1824\\-228.9584\\-17\\46.59877\\-229.5318\\-17\\44.64565\\-230.4468\\-17\\44.10615\\-230.9115\\-17\\41.33185\\-232.8646\\-17\\40.7394\\-233.3874\\-17\\38.78627\\-233.9887\\-17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "319" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-136.995\\-208.4831\\-15\\-137.683\\-207.474\\-15\\-138.9481\\-205.1901\\-15\\-139.5132\\-203.5678\\-15\\-139.0866\\-201.6146\\-15\\-138.9481\\-201.4662\\-15\\-136.995\\-202.4243\\-15\\-135.8214\\-203.5678\\-15\\-134.6833\\-205.5209\\-15\\-134.668\\-207.474\\-15\\-135.0419\\-208.431\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "88" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "320" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-217.3229\\-15\\-94.02622\\-217.0499\\-15\\-95.97935\\-217.0249\\-15\\-97.93247\\-216.6642\\-15\\-99.8856\\-216.4795\\-15\\-101.8387\\-215.839\\-15\\-103.7918\\-214.294\\-15\\-104.8503\\-213.3334\\-15\\-106.5205\\-211.3803\\-15\\-107.3162\\-209.4271\\-15\\-108.5007\\-207.474\\-15\\-108.3152\\-203.5678\\-15\\-108.863\\-201.6146\\-15\\-108.5656\\-199.6615\\-15\\-107.4257\\-197.7084\\-15\\-106.9219\\-195.7553\\-15\\-105.745\\-194.215\\-15\\-103.7918\\-192.9335\\-15\\-101.8387\\-191.4143\\-15\\-99.8856\\-191.1854\\-15\\-97.93247\\-191.0901\\-15\\-95.97935\\-190.5641\\-15\\-94.02622\\-189.7215\\-15\\-92.0731\\-189.745\\-15\\-90.11997\\-188.7125\\-15\\-89.55103\\-187.9428\\-15\\-88.46344\\-185.9896\\-15\\-87.68867\\-184.0365\\-15\\-87.11391\\-180.1303\\-15\\-87.09702\\-178.1771\\-15\\-86.21372\\-176.9583\\-15\\-84.2606\\-176.749\\-15\\-83.36139\\-176.224\\-15\\-83.39693\\-174.2709\\-15\\-85.59602\\-172.3178\\-15\\-86.77087\\-170.3646\\-15\\-86.69886\\-168.4115\\-15\\-85.54041\\-164.5053\\-15\\-84.89536\\-162.5521\\-15\\-83.19733\\-160.599\\-15\\-82.30747\\-159.7133\\-15\\-80.35435\\-159.1167\\-15\\-78.40122\\-157.7503\\-15\\-76.4481\\-157.239\\-15\\-74.49497\\-157.181\\-15\\-72.54185\\-157.5542\\-15\\-70.58872\\-158.5933\\-15\\-68.6356\\-160.055\\-15\\-68.15599\\-160.599\\-15\\-67.487\\-162.5521\\-15\\-66.35696\\-164.5053\\-15\\-66.12836\\-166.4584\\-15\\-65.66368\\-168.4115\\-15\\-64.82553\\-170.3646\\-15\\-63.74791\\-174.2709\\-15\\-62.3992\\-176.224\\-15\\-62.35085\\-178.1771\\-15\\-61.87779\\-180.1303\\-15\\-62.42999\\-182.0834\\-15\\-62.77623\\-182.3479\\-15\\-64.72935\\-182.6931\\-15\\-66.4536\\-182.0834\\-15\\-68.6356\\-181.0824\\-15\\-72.54185\\-181.0926\\-15\\-74.49497\\-181.9338\\-15\\-74.49497\\-182.2111\\-15\\-73.30249\\-184.0365\\-15\\-72.50215\\-185.9896\\-15\\-70.11341\\-187.9428\\-15\\-69.90266\\-189.8959\\-15\\-69.30377\\-191.849\\-15\\-68.46121\\-193.8021\\-15\\-69.36663\\-195.7553\\-15\\-69.49346\\-197.7084\\-15\\-69.13287\\-199.6615\\-15\\-69.5746\\-201.6146\\-15\\-70.14484\\-203.5678\\-15\\-70.44012\\-205.5209\\-15\\-71.3771\\-207.474\\-15\\-73.66592\\-211.3803\\-15\\-75.48649\\-213.3334\\-15\\-78.40122\\-216.024\\-15\\-80.35435\\-216.7485\\-15\\-82.30747\\-217.9632\\-15\\-84.2606\\-218.6815\\-15\\-86.21372\\-218.9222\\-15\\-88.16685\\-218.6134\\-15\\-90.11997\\-218.031\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "321" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-53.0106\\-227.5311\\-15\\-54.96373\\-226.1485\\-15\\-56.91685\\-225.3227\\-15\\-58.86998\\-223.6913\\-15\\-60.8231\\-221.9466\\-15\\-62.77623\\-220.5411\\-15\\-64.72935\\-220.3907\\-15\\-66.21176\\-219.1928\\-15\\-67.77906\\-217.2396\\-15\\-68.79955\\-215.2865\\-15\\-68.37651\\-213.3334\\-15\\-67.85538\\-211.3803\\-15\\-66.68247\\-209.3788\\-15\\-65.76199\\-207.474\\-15\\-61.67041\\-203.5678\\-15\\-60.49758\\-201.6146\\-15\\-60.46628\\-197.7084\\-15\\-60.22009\\-195.7553\\-15\\-59.64622\\-193.8021\\-15\\-58.86998\\-192.9469\\-15\\-56.91685\\-193.7681\\-15\\-55.82909\\-195.7553\\-15\\-54.9561\\-197.7084\\-15\\-54.89714\\-199.6615\\-15\\-53.85757\\-201.6146\\-15\\-52.11256\\-203.5678\\-15\\-51.2932\\-205.5209\\-15\\-49.92955\\-207.474\\-15\\-48.6643\\-209.4271\\-15\\-48.05839\\-211.3803\\-15\\-48.35355\\-213.3334\\-15\\-48.96891\\-215.2865\\-15\\-50.49554\\-219.1928\\-15\\-50.57219\\-221.1459\\-15\\-49.72084\\-223.099\\-15\\-47.98488\\-225.0521\\-15\\-46.62927\\-227.0053\\-15\\-47.15123\\-227.8162\\-15\\-49.10435\\-228.2823\\-15\\-51.05748\\-228.1363\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "322" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1636\\-15\\-39.33873\\-155.7074\\-15\\-41.29185\\-155.2365\\-15\\-43.24498\\-153.787\\-15\\-44.28631\\-152.7865\\-15\\-46.06785\\-150.8334\\-15\\-46.68648\\-148.8803\\-15\\-48.01753\\-146.9271\\-15\\-49.10435\\-145.9164\\-15\\-51.05748\\-146.125\\-15\\-52.92182\\-144.974\\-15\\-51.67397\\-143.0209\\-15\\-49.57477\\-141.0678\\-15\\-47.7609\\-139.1146\\-15\\-46.8047\\-137.1615\\-15\\-45.96798\\-135.2084\\-15\\-43.24498\\-132.4894\\-15\\-41.29185\\-131.799\\-15\\-39.33873\\-130.5314\\-15\\-37.3856\\-129.8199\\-15\\-35.43248\\-129.7837\\-15\\-23.71373\\-129.7929\\-15\\-21.7606\\-129.9772\\-15\\-19.80748\\-130.6999\\-15\\-19.17725\\-131.3021\\-15\\-17.85435\\-133.3414\\-15\\-16.06281\\-137.1615\\-15\\-16.04983\\-139.1146\\-15\\-14.93375\\-141.0678\\-15\\-12.91205\\-143.0209\\-15\\-12.21595\\-144.974\\-15\\-12.36319\\-146.9271\\-15\\-11.99498\\-147.1636\\-15\\-11.12286\\-148.8803\\-15\\-11.59505\\-150.8334\\-15\\-11.99498\\-151.1152\\-15\\-12.38743\\-150.8334\\-15\\-14.14754\\-148.8803\\-15\\-14.66425\\-146.9271\\-15\\-15.90123\\-146.1357\\-15\\-16.79423\\-146.9271\\-15\\-18.17987\\-148.8803\\-15\\-19.08219\\-150.8334\\-15\\-21.7606\\-153.5058\\-15\\-23.71373\\-155.0234\\-15\\-27.61998\\-156.0289\\-15\\-29.5731\\-157.239\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "323" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "38.78627\\-233.0212\\-15\\36.83315\\-232.4572\\-15\\35.26672\\-230.9115\\-15\\34.88002\\-229.0529\\-15\\34.98761\\-227.0053\\-15\\36.09553\\-225.0521\\-15\\36.83315\\-224.2902\\-15\\39.08934\\-221.1459\\-15\\39.95486\\-219.1928\\-15\\40.7394\\-218.4169\\-15\\42.69252\\-217.091\\-15\\45.50202\\-213.3334\\-15\\46.59877\\-212.2137\\-15\\48.5519\\-210.7699\\-15\\50.0104\\-211.3803\\-15\\50.50502\\-212.0856\\-15\\50.96031\\-213.3334\\-15\\51.90843\\-215.2865\\-15\\52.45815\\-215.8362\\-15\\54.41127\\-216.8453\\-15\\54.88453\\-217.2396\\-15\\55.83226\\-219.1928\\-15\\55.27875\\-221.1459\\-15\\54.58566\\-223.099\\-15\\53.06448\\-225.0521\\-15\\52.45815\\-225.6585\\-15\\50.50502\\-226.1021\\-15\\46.59877\\-228.4387\\-15\\44.64565\\-229.7125\\-15\\42.69252\\-231.1991\\-15\\40.7394\\-232.3793\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "73" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "324" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "62.22377\\-212.1544\\-15\\61.3937\\-211.3803\\-15\\58.97418\\-209.4271\\-15\\58.31752\\-208.8129\\-15\\56.3644\\-209.0086\\-15\\54.41127\\-209.7665\\-15\\53.71777\\-209.4271\\-15\\52.45815\\-207.9786\\-15\\52.24645\\-207.474\\-15\\52.27115\\-203.5678\\-15\\52.63253\\-201.6146\\-15\\53.67759\\-197.7084\\-15\\54.27584\\-195.7553\\-15\\56.25589\\-191.849\\-15\\56.28363\\-189.8959\\-15\\57.36303\\-187.9428\\-15\\58.16891\\-185.9896\\-15\\58.55325\\-184.0365\\-15\\59.33994\\-182.0834\\-15\\59.97768\\-180.1303\\-15\\60.01156\\-174.2709\\-15\\61.03297\\-172.3178\\-15\\61.55498\\-170.3646\\-15\\62.22377\\-168.9678\\-15\\63.57201\\-166.4584\\-15\\63.69749\\-164.5053\\-15\\63.52077\\-162.5521\\-15\\63.48785\\-160.599\\-15\\63.92941\\-158.6459\\-15\\64.1769\\-158.3821\\-15\\66.13003\\-157.3246\\-15\\68.08315\\-155.9297\\-15\\70.03628\\-156.0976\\-15\\71.9894\\-157.1547\\-15\\73.94253\\-157.3728\\-15\\75.89565\\-157.8551\\-15\\77.84878\\-159.0952\\-15\\79.8019\\-159.8087\\-15\\81.75503\\-161.4994\\-15\\83.70815\\-162.3651\\-15\\85.66128\\-163.6636\\-15\\86.51933\\-164.5053\\-15\\87.35531\\-166.4584\\-15\\86.97044\\-168.4115\\-15\\85.66128\\-169.3987\\-15\\83.70815\\-170.0285\\-15\\81.75503\\-171.1429\\-15\\79.8019\\-171.9667\\-15\\77.84878\\-173.3048\\-15\\76.93169\\-174.2709\\-15\\75.89565\\-175.9717\\-15\\73.86475\\-178.1771\\-15\\71.9894\\-179.3677\\-15\\70.03628\\-181.3032\\-15\\68.08315\\-182.8739\\-15\\66.13003\\-183.4955\\-15\\64.1769\\-184.7245\\-15\\62.22377\\-186.5942\\-15\\60.27065\\-187.4487\\-15\\59.62718\\-187.9428\\-15\\59.21078\\-189.8959\\-15\\60.03493\\-191.849\\-15\\59.69587\\-193.8021\\-15\\59.57078\\-195.7553\\-15\\59.69587\\-197.7084\\-15\\60.57664\\-199.6615\\-15\\61.32716\\-201.6146\\-15\\63.06747\\-203.5678\\-15\\64.58182\\-205.5209\\-15\\65.75842\\-207.474\\-15\\66.15365\\-209.4271\\-15\\64.90556\\-211.3803\\-15\\64.1769\\-212.0118\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "325" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-205.9208\\-15\\73.87594\\-203.5678\\-15\\72.92881\\-201.6146\\-15\\72.17773\\-199.6615\\-15\\71.75368\\-197.7084\\-15\\71.69643\\-193.8021\\-15\\71.25553\\-189.8959\\-15\\71.25117\\-187.9428\\-15\\70.92061\\-185.9896\\-15\\71.2934\\-184.0365\\-15\\73.08142\\-182.0834\\-15\\73.94253\\-180.861\\-15\\75.89565\\-178.5922\\-15\\77.84878\\-177.3308\\-15\\79.8019\\-176.3188\\-15\\81.75503\\-175.0531\\-15\\83.70815\\-174.8797\\-15\\84.80801\\-176.224\\-15\\84.73267\\-178.1771\\-15\\84.81986\\-180.1303\\-15\\85.08397\\-182.0834\\-15\\84.81492\\-184.0365\\-15\\84.82484\\-185.9896\\-15\\87.6144\\-189.0032\\-15\\90.70685\\-189.8959\\-15\\95.4269\\-191.5235\\-15\\95.59499\\-191.849\\-15\\93.85659\\-193.8021\\-15\\91.52065\\-196.1182\\-15\\89.56753\\-197.1151\\-15\\87.93992\\-199.6615\\-15\\85.66128\\-202.0076\\-15\\83.70815\\-203.6985\\-15\\79.8019\\-204.1018\\-15\\78.20856\\-205.5209\\-15\\77.84878\\-205.9766\\-15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "92" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "326" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-218.0109\\-13\\-90.10603\\-217.2396\\-13\\-92.0731\\-216.0833\\-13\\-94.02622\\-216.3377\\-13\\-95.97935\\-216.1181\\-13\\-97.93247\\-215.4804\\-13\\-99.8856\\-215.6708\\-13\\-101.8387\\-214.9588\\-13\\-103.8764\\-213.3334\\-13\\-105.745\\-210.8443\\-13\\-106.7165\\-209.4271\\-13\\-107.5111\\-207.474\\-13\\-107.6173\\-205.5209\\-13\\-107.5627\\-203.5678\\-13\\-108.0054\\-201.6146\\-13\\-107.6173\\-199.6615\\-13\\-106.9717\\-197.7084\\-13\\-106.1607\\-195.7553\\-13\\-104.6195\\-193.8021\\-13\\-101.8387\\-191.0982\\-13\\-99.8856\\-190.1171\\-13\\-97.93247\\-189.4665\\-13\\-95.97935\\-189.0013\\-13\\-94.02622\\-188.7705\\-13\\-92.59736\\-187.9428\\-13\\-92.0731\\-187.0204\\-13\\-91.0791\\-185.9896\\-13\\-90.11997\\-184.5762\\-13\\-88.84167\\-182.0834\\-13\\-88.48586\\-180.1303\\-13\\-88.3308\\-178.1771\\-13\\-88.16685\\-177.9632\\-13\\-86.21372\\-176.7653\\-13\\-84.2606\\-177.2696\\-13\\-82.30747\\-177.9981\\-13\\-81.5631\\-176.224\\-13\\-82.30747\\-175.5237\\-13\\-84.2606\\-174.1093\\-13\\-86.21372\\-173.1779\\-13\\-87.42758\\-172.3178\\-13\\-88.62413\\-170.3646\\-13\\-88.10941\\-168.4115\\-13\\-86.84793\\-166.4584\\-13\\-85.70841\\-164.5053\\-13\\-85.12502\\-162.5521\\-13\\-82.30747\\-159.7133\\-13\\-80.35435\\-159.1167\\-13\\-78.40122\\-157.9297\\-13\\-76.4481\\-157.4043\\-13\\-74.49497\\-157.1896\\-13\\-72.54185\\-157.4429\\-13\\-70.58872\\-158.2902\\-13\\-70.21831\\-158.6459\\-13\\-68.6356\\-160.8149\\-13\\-67.83444\\-162.5521\\-13\\-66.81891\\-164.5053\\-13\\-66.29554\\-166.4584\\-13\\-66.12836\\-168.4115\\-13\\-65.50739\\-170.3646\\-13\\-64.35233\\-172.3178\\-13\\-63.88204\\-174.2709\\-13\\-63.00159\\-176.224\\-13\\-62.3992\\-178.1771\\-13\\-62.18388\\-180.1303\\-13\\-62.77623\\-180.8677\\-13\\-64.65739\\-182.0834\\-13\\-66.68247\\-181.2955\\-13\\-68.6356\\-180.8383\\-13\\-70.58872\\-181.0201\\-13\\-72.54185\\-181.3745\\-13\\-74.16567\\-182.0834\\-13\\-73.80919\\-184.0365\\-13\\-72.91888\\-185.9896\\-13\\-71.56528\\-187.9428\\-13\\-70.83792\\-189.8959\\-13\\-69.77927\\-191.849\\-13\\-69.19601\\-193.8021\\-13\\-69.786\\-195.7553\\-13\\-70.09167\\-197.7084\\-13\\-69.90862\\-199.6615\\-13\\-70.44012\\-203.5678\\-13\\-70.85926\\-205.5209\\-13\\-71.73383\\-207.474\\-13\\-73.3488\\-209.4271\\-13\\-74.49497\\-211.3208\\-13\\-75.85973\\-213.3334\\-13\\-76.4481\\-213.9075\\-13\\-78.65292\\-215.2865\\-13\\-80.35435\\-216.1884\\-13\\-82.30747\\-217.0513\\-13\\-84.2606\\-218.1035\\-13\\-86.21372\\-218.3649\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "327" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-227.4428\\-13\\-53.0106\\-226.3138\\-13\\-54.96373\\-225.4113\\-13\\-58.86998\\-222.5434\\-13\\-62.77623\\-220.8311\\-13\\-64.72935\\-220.4966\\-13\\-66.68247\\-219.4727\\-13\\-68.83688\\-217.2396\\-13\\-69.61765\\-215.2865\\-13\\-69.12096\\-213.3334\\-13\\-68.51171\\-211.3803\\-13\\-67.60853\\-209.4271\\-13\\-66.05949\\-207.474\\-13\\-64.72935\\-206.3925\\-13\\-61.8628\\-203.5678\\-13\\-60.50829\\-201.6146\\-13\\-60.46628\\-195.7553\\-13\\-59.66898\\-193.8021\\-13\\-58.86998\\-193.0475\\-13\\-56.91685\\-194.2668\\-13\\-55.84843\\-195.7553\\-13\\-55.00129\\-197.7084\\-13\\-54.91154\\-199.6615\\-13\\-54.04433\\-201.6146\\-13\\-51.99478\\-203.5678\\-13\\-50.65108\\-205.5209\\-13\\-49.79522\\-207.474\\-13\\-48.22544\\-209.4271\\-13\\-48.15245\\-211.3803\\-13\\-48.72492\\-213.3334\\-13\\-50.12456\\-217.2396\\-13\\-50.71095\\-219.1928\\-13\\-50.88309\\-221.1459\\-13\\-49.87271\\-223.099\\-13\\-47.86002\\-225.0521\\-13\\-47.21989\\-227.0053\\-13\\-49.10435\\-228.0821\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "328" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-157.1981\\-13\\-39.33873\\-155.9223\\-13\\-41.29185\\-155.3682\\-13\\-43.24498\\-153.7823\\-13\\-44.26593\\-152.7865\\-13\\-45.39056\\-150.8334\\-13\\-47.15123\\-147.2947\\-13\\-47.39712\\-146.9271\\-13\\-49.10435\\-145.5475\\-13\\-51.05748\\-146.1309\\-13\\-52.92182\\-144.974\\-13\\-51.82026\\-143.0209\\-13\\-51.05748\\-142.2581\\-13\\-49.10435\\-141.1199\\-13\\-47.20341\\-139.1146\\-13\\-46.59398\\-137.1615\\-13\\-45.7749\\-135.2084\\-13\\-43.24498\\-132.5255\\-13\\-41.29185\\-131.8158\\-13\\-39.33873\\-130.7417\\-13\\-37.3856\\-130.0052\\-13\\-35.43248\\-129.811\\-13\\-33.47935\\-129.7837\\-13\\-23.71373\\-129.7929\\-13\\-21.7606\\-130.3207\\-13\\-20.05374\\-131.3021\\-13\\-18.00296\\-133.2553\\-13\\-16.94754\\-135.2084\\-13\\-16.06281\\-137.1615\\-13\\-16.04983\\-139.1146\\-13\\-14.96885\\-141.0678\\-13\\-13.09361\\-143.0209\\-13\\-12.23912\\-144.974\\-13\\-12.32528\\-146.9271\\-13\\-11.99498\\-147.1636\\-13\\-11.12286\\-148.8803\\-13\\-11.59505\\-150.8334\\-13\\-11.99498\\-151.1152\\-13\\-12.38743\\-150.8334\\-13\\-14.15039\\-148.8803\\-13\\-15.16076\\-146.9271\\-13\\-15.90123\\-146.506\\-13\\-16.32237\\-146.9271\\-13\\-17.3019\\-148.8803\\-13\\-18.63084\\-150.8334\\-13\\-19.80748\\-152.3132\\-13\\-21.7606\\-154.2731\\-13\\-23.71373\\-155.8123\\-13\\-27.61998\\-157.0722\\-13\\-29.5731\\-157.4731\\-13\\-33.47935\\-157.2469\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "329" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "38.78627\\-231.8831\\-13\\37.11584\\-230.9115\\-13\\36.92933\\-228.9584\\-13\\37.36175\\-227.0053\\-13\\38.89641\\-225.0521\\-13\\39.7032\\-223.099\\-13\\40.95564\\-221.1459\\-13\\41.60499\\-219.1928\\-13\\42.69252\\-218.3121\\-13\\43.64255\\-217.2396\\-13\\44.78208\\-215.2865\\-13\\45.71938\\-213.3334\\-13\\46.59877\\-212.3233\\-13\\48.5519\\-210.4738\\-13\\49.85159\\-211.3803\\-13\\50.1795\\-213.3334\\-13\\51.49734\\-215.2865\\-13\\52.45815\\-216.2422\\-13\\54.41127\\-217.4405\\-13\\55.95546\\-219.1928\\-13\\55.81867\\-221.1459\\-13\\54.85787\\-223.099\\-13\\54.41127\\-223.5456\\-13\\52.45815\\-224.5788\\-13\\50.50502\\-224.9147\\-13\\48.5519\\-225.7162\\-13\\46.59877\\-227.4712\\-13\\44.64565\\-228.334\\-13\\43.45546\\-228.9584\\-13\\40.7394\\-231.3231\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "117" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "330" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "62.22377\\-212.3613\\-13\\60.27065\\-210.431\\-13\\58.31752\\-208.6598\\-13\\56.3644\\-208.6059\\-13\\54.41127\\-208.9218\\-13\\52.45815\\-207.9728\\-13\\52.03278\\-207.474\\-13\\51.97853\\-205.5209\\-13\\52.25871\\-203.5678\\-13\\53.13544\\-201.6146\\-13\\53.73427\\-199.6615\\-13\\53.94711\\-197.7084\\-13\\54.33051\\-195.7553\\-13\\56.25589\\-191.849\\-13\\56.28363\\-189.8959\\-13\\57.28024\\-187.9428\\-13\\58.15593\\-185.9896\\-13\\58.16891\\-184.0365\\-13\\59.19084\\-182.0834\\-13\\59.97768\\-180.1303\\-13\\60.07121\\-174.2709\\-13\\62.22377\\-170.7046\\-13\\64.1769\\-168.7052\\-13\\66.13003\\-166.9513\\-13\\66.53439\\-166.4584\\-13\\66.27314\\-164.5053\\-13\\64.13934\\-162.5521\\-13\\63.74221\\-160.599\\-13\\64.96527\\-158.6459\\-13\\66.13003\\-157.555\\-13\\68.08315\\-155.9617\\-13\\70.03628\\-155.7683\\-13\\71.9894\\-156.8544\\-13\\73.94253\\-157.1896\\-13\\75.89565\\-157.4115\\-13\\77.84878\\-158.03\\-13\\79.8019\\-159.5325\\-13\\83.70815\\-161.8524\\-13\\86.51398\\-164.5053\\-13\\88.17825\\-166.4584\\-13\\88.57803\\-168.4115\\-13\\87.6144\\-169.585\\-13\\85.66128\\-170.0717\\-13\\81.75503\\-171.4841\\-13\\79.95609\\-172.3178\\-13\\77.84878\\-173.6977\\-13\\77.36349\\-174.2709\\-13\\76.32455\\-176.224\\-13\\74.39175\\-178.1771\\-13\\73.94253\\-179.041\\-13\\72.9189\\-180.1303\\-13\\73.94253\\-181.8295\\-13\\75.89565\\-180.3173\\-13\\78.51196\\-178.1771\\-13\\79.8019\\-177.2428\\-13\\81.75503\\-175.5674\\-13\\83.70815\\-174.977\\-13\\84.91193\\-176.224\\-13\\84.81002\\-178.1771\\-13\\84.82484\\-180.1303\\-13\\85.173\\-182.0834\\-13\\85.29429\\-184.0365\\-13\\86.04783\\-185.9896\\-13\\87.6144\\-188.0494\\-13\\89.56753\\-189.138\\-13\\91.52065\\-189.2261\\-13\\93.47378\\-189.4612\\-13\\95.4269\\-190.2689\\-13\\96.53684\\-191.849\\-13\\95.4269\\-193.4978\\-13\\91.52065\\-197.325\\-13\\89.56753\\-198.6917\\-13\\88.80442\\-199.6615\\-13\\88.2495\\-201.6146\\-13\\88.50844\\-203.5678\\-13\\89.70809\\-205.5209\\-13\\89.74722\\-207.474\\-13\\89.56753\\-207.7817\\-13\\87.6144\\-209.9229\\-13\\86.17915\\-211.3803\\-13\\85.66128\\-211.6581\\-13\\83.70815\\-211.4994\\-13\\81.75503\\-209.9192\\-13\\80.45959\\-209.4271\\-13\\79.8019\\-208.7826\\-13\\77.84878\\-208.1576\\-13\\77.09415\\-207.474\\-13\\73.55559\\-201.6146\\-13\\72.95517\\-199.6615\\-13\\72.45696\\-197.7084\\-13\\71.73031\\-193.8021\\-13\\71.69643\\-191.849\\-13\\71.81376\\-185.9896\\-13\\72.73434\\-184.0365\\-13\\73.81806\\-182.0834\\-13\\71.9894\\-180.7017\\-13\\70.03628\\-182.7282\\-13\\68.36331\\-184.0365\\-13\\66.13003\\-186.2984\\-13\\64.1769\\-187.0883\\-13\\63.18749\\-187.9428\\-13\\62.22377\\-188.4343\\-13\\60.27065\\-189.8817\\-13\\60.58546\\-191.849\\-13\\60.10906\\-193.8021\\-13\\60.14858\\-197.7084\\-13\\62.22377\\-200.6292\\-13\\63.66909\\-201.6146\\-13\\64.1769\\-202.1511\\-13\\66.13003\\-203.2446\\-13\\66.48159\\-203.5678\\-13\\66.84103\\-205.5209\\-13\\67.56279\\-207.474\\-13\\68.13614\\-209.4271\\-13\\67.24458\\-211.3803\\-13\\66.13003\\-212.7849\\-13\\64.1769\\-213.0743\\-13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "90" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "331" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.21372\\-217.5757\\-11\\-88.16685\\-217.173\\-11\\-90.11997\\-216.6341\\-11\\-91.6662\\-215.2865\\-11\\-92.0731\\-214.6388\\-11\\-93.49454\\-213.3334\\-11\\-94.02622\\-212.9988\\-11\\-95.47627\\-213.3334\\-11\\-97.93247\\-214.2303\\-11\\-99.8856\\-214.5062\\-11\\-101.8387\\-214.1204\\-11\\-103.7918\\-212.3952\\-11\\-104.7183\\-211.3803\\-11\\-106.2856\\-209.4271\\-11\\-107.042\\-207.474\\-11\\-107.1928\\-205.5209\\-11\\-107.2098\\-199.6615\\-11\\-107.0838\\-197.7084\\-11\\-105.745\\-195.8773\\-11\\-103.7691\\-193.8021\\-11\\-102.7486\\-191.849\\-11\\-100.701\\-189.8959\\-11\\-99.8856\\-189.0191\\-11\\-97.93247\\-187.5081\\-11\\-95.97935\\-186.8588\\-11\\-94.62132\\-185.9896\\-11\\-94.29933\\-184.0365\\-11\\-94.02622\\-183.1158\\-11\\-92.99386\\-182.0834\\-11\\-92.0731\\-181.785\\-11\\-90.11997\\-179.8802\\-11\\-89.33982\\-178.1771\\-11\\-88.16685\\-177.1428\\-11\\-86.21372\\-177.2255\\-11\\-84.2606\\-178.4811\\-11\\-82.30747\\-179.2836\\-11\\-78.40122\\-182.0183\\-11\\-77.30596\\-180.1303\\-11\\-78.93234\\-178.1771\\-11\\-82.30747\\-175.4236\\-11\\-86.21372\\-174.1624\\-11\\-88.16685\\-173.6327\\-11\\-89.28761\\-172.3178\\-11\\-89.42455\\-170.3646\\-11\\-88.74365\\-168.4115\\-11\\-87.07685\\-166.4584\\-11\\-85.70841\\-164.5053\\-11\\-85.12502\\-162.5521\\-11\\-82.30747\\-159.7133\\-11\\-80.35435\\-159.1167\\-11\\-78.40122\\-158.2299\\-11\\-76.4481\\-157.5266\\-11\\-74.49497\\-157.2229\\-11\\-72.54185\\-157.5938\\-11\\-71.19757\\-158.6459\\-11\\-69.4281\\-160.599\\-11\\-68.14732\\-162.5521\\-11\\-67.48943\\-164.5053\\-11\\-66.35696\\-166.4584\\-11\\-66.28574\\-168.4115\\-11\\-65.86295\\-170.3646\\-11\\-64.72935\\-172.6123\\-11\\-64.15205\\-174.2709\\-11\\-63.73255\\-176.224\\-11\\-63.04676\\-178.1771\\-11\\-62.97708\\-180.1303\\-11\\-64.72935\\-181.694\\-11\\-66.68247\\-182.2717\\-11\\-68.6356\\-181.2269\\-11\\-70.58872\\-180.8745\\-11\\-74.49497\\-181.7092\\-11\\-76.4481\\-181.6091\\-11\\-78.1655\\-182.0834\\-11\\-76.4481\\-182.5669\\-11\\-75.38959\\-184.0365\\-11\\-73.63131\\-185.9896\\-11\\-71.57072\\-189.8959\\-11\\-70.16734\\-193.8021\\-11\\-70.2319\\-195.7553\\-11\\-70.49399\\-197.7084\\-11\\-70.49399\\-201.6146\\-11\\-70.89269\\-203.5678\\-11\\-71.55998\\-205.5209\\-11\\-72.54185\\-207.4226\\-11\\-73.91383\\-209.4271\\-11\\-76.4481\\-212.3343\\-11\\-77.43958\\-213.3334\\-11\\-78.40122\\-214.1062\\-11\\-82.30747\\-216.1611\\-11\\-84.2606\\-216.9904\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "332" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-225.9568\\-11\\-53.0106\\-224.7625\\-11\\-54.96373\\-223.982\\-11\\-56.91685\\-222.5164\\-11\\-58.86998\\-221.543\\-11\\-60.8231\\-220.4452\\-11\\-62.77623\\-220.2908\\-11\\-64.72935\\-219.8974\\-11\\-66.68247\\-218.7527\\-11\\-68.6356\\-217.7369\\-11\\-69.16193\\-217.2396\\-11\\-70.14484\\-215.2865\\-11\\-69.92024\\-213.3334\\-11\\-69.58984\\-211.3803\\-11\\-68.6356\\-209.6225\\-11\\-67.33552\\-207.474\\-11\\-66.68247\\-206.8404\\-11\\-64.72935\\-205.7701\\-11\\-62.77623\\-204.5017\\-11\\-61.86226\\-203.5678\\-11\\-60.6361\\-201.6146\\-11\\-60.46628\\-195.7553\\-11\\-59.26758\\-193.8021\\-11\\-58.86998\\-193.4453\\-11\\-56.91685\\-194.7074\\-11\\-55.99802\\-195.7553\\-11\\-55.37967\\-197.7084\\-11\\-54.48721\\-201.6146\\-11\\-51.05748\\-204.7777\\-11\\-50.42894\\-205.5209\\-11\\-49.57801\\-207.474\\-11\\-48.24123\\-209.4271\\-11\\-48.35908\\-211.3803\\-11\\-49.34007\\-213.3334\\-11\\-50.12456\\-215.2865\\-11\\-50.69049\\-217.2396\\-11\\-50.88309\\-219.1928\\-11\\-50.49363\\-221.1459\\-11\\-49.10435\\-222.9837\\-11\\-47.15123\\-224.7577\\-11\\-46.24125\\-225.0521\\-11\\-47.15123\\-225.4781\\-11\\-49.10435\\-226.6328\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "333" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-156.8414\\-11\\-41.29185\\-155.627\\-11\\-44.15931\\-152.7865\\-11\\-44.68442\\-150.8334\\-11\\-46.21905\\-148.8803\\-11\\-46.85826\\-146.9271\\-11\\-47.15123\\-146.5891\\-11\\-49.10435\\-145.2215\\-11\\-52.65456\\-146.9271\\-11\\-53.0106\\-147.2689\\-11\\-53.25474\\-146.9271\\-11\\-52.92182\\-144.974\\-11\\-51.82026\\-143.0209\\-11\\-51.05748\\-142.2581\\-11\\-49.10435\\-141.5731\\-11\\-48.44088\\-141.0678\\-11\\-46.8047\\-139.1146\\-11\\-46.18961\\-137.1615\\-11\\-45.1981\\-135.6666\\-11\\-43.24498\\-133.2316\\-11\\-41.29185\\-131.965\\-11\\-39.33873\\-131.5259\\-11\\-37.3856\\-130.542\\-11\\-35.43248\\-130.0188\\-11\\-33.47935\\-129.8199\\-11\\-31.52623\\-129.7837\\-11\\-25.66685\\-129.7837\\-11\\-23.71373\\-129.8199\\-11\\-21.7606\\-130.5022\\-11\\-19.80748\\-131.9617\\-11\\-18.47196\\-133.2553\\-11\\-16.95255\\-135.2084\\-11\\-16.06281\\-137.1615\\-11\\-16.06281\\-139.1146\\-11\\-15.13255\\-141.0678\\-11\\-13.25452\\-143.0209\\-11\\-12.2307\\-144.974\\-11\\-12.14869\\-146.9271\\-11\\-11.10109\\-148.8803\\-11\\-11.55785\\-150.8334\\-11\\-11.99498\\-151.1373\\-11\\-12.41606\\-150.8334\\-11\\-14.21891\\-148.8803\\-11\\-15.90123\\-147.7163\\-11\\-16.87779\\-148.8803\\-11\\-18.24129\\-150.8334\\-11\\-19.09058\\-152.7865\\-11\\-21.7606\\-155.4372\\-11\\-23.71373\\-156.8013\\-11\\-25.66685\\-157.3882\\-11\\-27.61998\\-157.7695\\-11\\-29.5731\\-158.2672\\-11\\-31.52623\\-157.7426\\-11\\-33.47935\\-157.4876\\-11\\-37.3856\\-157.3818\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "334" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "44.64565\\-224.9301\\-11\\42.90179\\-223.099\\-11\\42.97257\\-221.1459\\-11\\43.63094\\-219.1928\\-11\\45.10629\\-217.2396\\-11\\45.74352\\-215.2865\\-11\\46.59877\\-214.0233\\-11\\48.5519\\-211.4418\\-11\\51.20257\\-215.2865\\-11\\52.45815\\-216.4807\\-11\\54.41127\\-218.0042\\-11\\55.5177\\-219.1928\\-11\\55.77846\\-221.1459\\-11\\54.41127\\-222.6698\\-11\\52.45815\\-223.8608\\-11\\48.5519\\-224.0199\\-11\\46.59877\\-224.8262\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "75" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "335" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "64.1769\\-218.3464\\-11\\62.99107\\-217.2396\\-11\\64.15419\\-215.2865\\-11\\63.50618\\-213.3334\\-11\\62.31995\\-211.3803\\-11\\60.27065\\-209.4195\\-11\\58.31752\\-208.5614\\-11\\56.3644\\-208.6008\\-11\\54.41127\\-208.7381\\-11\\52.45815\\-207.8042\\-11\\52.15419\\-207.474\\-11\\51.79858\\-205.5209\\-11\\52.45815\\-203.4213\\-11\\54.26266\\-199.6615\\-11\\54.35909\\-197.7084\\-11\\54.6931\\-195.7553\\-11\\55.41225\\-193.8021\\-11\\56.25589\\-191.849\\-11\\56.34169\\-189.8959\\-11\\58.15593\\-185.9896\\-11\\58.23676\\-184.0365\\-11\\59.20414\\-182.0834\\-11\\59.97768\\-180.1303\\-11\\60.07121\\-176.224\\-11\\61.30172\\-172.3178\\-11\\62.22377\\-171.2744\\-11\\64.1769\\-169.8284\\-11\\66.13003\\-168.9596\\-11\\66.67816\\-168.4115\\-11\\67.46886\\-166.4584\\-11\\67.39793\\-164.5053\\-11\\66.13003\\-163.2087\\-11\\65.26278\\-162.5521\\-11\\64.44743\\-160.599\\-11\\65.29626\\-158.6459\\-11\\66.13003\\-157.7394\\-11\\68.08315\\-156.7735\\-11\\70.03628\\-155.7068\\-11\\71.9894\\-156.1509\\-11\\73.94253\\-157.2229\\-11\\75.89565\\-157.4192\\-11\\77.84878\\-158.0294\\-11\\79.8019\\-159.6225\\-11\\81.63296\\-160.599\\-11\\83.70815\\-161.9618\\-11\\88.40881\\-166.4584\\-11\\89.30843\\-168.4115\\-11\\87.86594\\-170.3646\\-11\\85.66128\\-170.771\\-11\\83.70815\\-171.3623\\-11\\79.8019\\-172.7337\\-11\\77.84878\\-174.6687\\-11\\76.77754\\-176.224\\-11\\74.83076\\-178.1771\\-11\\71.80106\\-182.0834\\-11\\70.5537\\-184.0365\\-11\\68.08315\\-185.7899\\-11\\66.34956\\-187.9428\\-11\\64.1769\\-190.1696\\-11\\62.22377\\-191.5663\\-11\\61.20039\\-193.8021\\-11\\62.22377\\-195.444\\-11\\64.1769\\-197.3793\\-11\\64.40624\\-197.7084\\-11\\65.13468\\-199.6615\\-11\\66.13003\\-200.5695\\-11\\67.52903\\-203.5678\\-11\\68.08315\\-205.3943\\-11\\68.99936\\-207.474\\-11\\69.57404\\-209.4271\\-11\\69.89828\\-211.3803\\-11\\68.58047\\-213.3334\\-11\\68.63614\\-215.2865\\-11\\68.52517\\-217.2396\\-11\\68.08315\\-217.5677\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "336" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "83.70815\\-211.9255\\-11\\81.75503\\-210.305\\-11\\79.8019\\-209.1016\\-11\\77.84878\\-207.3302\\-11\\76.69903\\-205.5209\\-11\\75.08022\\-203.5678\\-11\\73.94253\\-199.7572\\-11\\73.26189\\-197.7084\\-11\\72.93323\\-195.7553\\-11\\72.16379\\-193.8021\\-11\\71.77769\\-191.849\\-11\\72.47768\\-187.9428\\-11\\72.91871\\-185.9896\\-11\\73.82162\\-184.0365\\-11\\75.05593\\-182.0834\\-11\\75.89565\\-181.3124\\-11\\80.48006\\-178.1771\\-11\\81.75503\\-177.1793\\-11\\83.70815\\-176.0362\\-11\\83.9116\\-176.224\\-11\\84.92886\\-178.1771\\-11\\85.31475\\-180.1303\\-11\\86.24503\\-182.0834\\-11\\86.6557\\-184.0365\\-11\\87.6144\\-185.5059\\-11\\89.56753\\-187.4955\\-11\\90.18101\\-187.9428\\-11\\91.52065\\-188.5685\\-11\\93.47378\\-189.311\\-11\\95.4269\\-190.9452\\-11\\96.22202\\-191.849\\-11\\95.80847\\-193.8021\\-11\\94.40965\\-195.7553\\-11\\93.47378\\-196.8105\\-11\\91.52065\\-198.7521\\-11\\90.40136\\-199.6615\\-11\\90.07508\\-201.6146\\-11\\91.52065\\-204.7295\\-11\\91.97964\\-205.5209\\-11\\93.77239\\-207.474\\-11\\93.9883\\-209.4271\\-11\\93.47378\\-209.8829\\-11\\91.52065\\-210.6762\\-11\\90.87653\\-211.3803\\-11\\89.56753\\-211.8804\\-11\\85.66128\\-212.4506\\-11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "337" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.11997\\-215.9824\\-9\\-92.0731\\-214.0085\\-9\\-94.02622\\-212.6292\\-9\\-95.97935\\-212.8114\\-9\\-97.93247\\-213.3712\\-9\\-99.8856\\-213.6761\\-9\\-101.8387\\-212.927\\-9\\-103.7918\\-211.3726\\-9\\-105.2654\\-209.4271\\-9\\-106.5095\\-207.474\\-9\\-107.0353\\-205.5209\\-9\\-107.1844\\-203.5678\\-9\\-107.2098\\-197.7084\\-9\\-106.1667\\-195.7553\\-9\\-103.8873\\-193.8021\\-9\\-102.9201\\-191.849\\-9\\-101.1635\\-189.8959\\-9\\-100.2471\\-187.9428\\-9\\-99.8856\\-186.8723\\-9\\-98.96764\\-185.9896\\-9\\-97.95518\\-184.0365\\-9\\-96.45859\\-182.0834\\-9\\-95.97935\\-181.7056\\-9\\-92.0731\\-179.4604\\-9\\-88.16685\\-178.1057\\-9\\-86.21372\\-178.4129\\-9\\-84.2606\\-179.4413\\-9\\-82.30747\\-180.6271\\-9\\-80.35435\\-181.4872\\-9\\-78.40122\\-183.1601\\-9\\-76.4481\\-184.5954\\-9\\-75.01055\\-185.9896\\-9\\-73.53976\\-187.9428\\-9\\-72.59403\\-189.8959\\-9\\-71.95094\\-191.849\\-9\\-71.15066\\-195.7553\\-9\\-71.21352\\-201.6146\\-9\\-71.60326\\-203.5678\\-9\\-72.54185\\-205.4041\\-9\\-73.75124\\-207.474\\-9\\-75.32597\\-209.4271\\-9\\-77.08549\\-211.3803\\-9\\-78.40122\\-212.6728\\-9\\-80.35435\\-214.2312\\-9\\-82.30747\\-215.0627\\-9\\-84.2606\\-216.1552\\-9\\-86.21372\\-216.4434\\-9\\-88.16685\\-216.4292\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "338" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-68.6356\\-182.5779\\-9\\-70.58872\\-180.9519\\-9\\-72.54185\\-181.1673\\-9\\-74.49497\\-181.7536\\-9\\-76.4481\\-180.9587\\-9\\-78.40122\\-179.0653\\-9\\-80.35435\\-177.3449\\-9\\-82.30747\\-176.4732\\-9\\-84.2606\\-175.3529\\-9\\-86.21372\\-174.9798\\-9\\-88.16685\\-174.7684\\-9\\-88.87948\\-174.2709\\-9\\-90.11997\\-172.3584\\-9\\-89.19936\\-170.3646\\-9\\-87.07685\\-166.4584\\-9\\-85.70841\\-164.5053\\-9\\-85.12502\\-162.5521\\-9\\-82.30747\\-159.7224\\-9\\-80.35435\\-159.176\\-9\\-78.40122\\-157.9352\\-9\\-76.4481\\-157.3723\\-9\\-74.49497\\-157.3623\\-9\\-72.54185\\-157.8321\\-9\\-70.58872\\-159.6225\\-9\\-69.64884\\-160.599\\-9\\-68.4118\\-162.5521\\-9\\-67.83222\\-164.5053\\-9\\-66.87081\\-166.4584\\-9\\-66.29554\\-168.4115\\-9\\-66.13626\\-170.3646\\-9\\-65.52016\\-172.3178\\-9\\-64.35233\\-174.2709\\-9\\-64.14126\\-176.224\\-9\\-63.72837\\-178.1771\\-9\\-63.71272\\-180.1303\\-9\\-65.3623\\-182.0834\\-9\\-66.68247\\-183.1474\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "339" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-225.803\\-9\\-46.77088\\-225.0521\\-9\\-47.15123\\-224.0198\\-9\\-49.10435\\-224.4334\\-9\\-51.05748\\-224.3915\\-9\\-53.0106\\-223.4985\\-9\\-56.91685\\-221.4759\\-9\\-58.86998\\-220.0427\\-9\\-60.8231\\-219.0707\\-9\\-64.72935\\-218.4809\\-9\\-66.68247\\-217.9388\\-9\\-68.6356\\-216.7697\\-9\\-69.99163\\-215.2865\\-9\\-70.66949\\-213.3334\\-9\\-70.55058\\-211.3803\\-9\\-69.60101\\-209.4271\\-9\\-68.0991\\-207.474\\-9\\-66.68247\\-206.3707\\-9\\-64.72935\\-205.1539\\-9\\-62.77623\\-204.5713\\-9\\-61.85735\\-203.5678\\-9\\-61.51031\\-201.6146\\-9\\-61.48633\\-199.6615\\-9\\-61.18222\\-197.7084\\-9\\-60.54128\\-195.7553\\-9\\-58.86998\\-193.6667\\-9\\-56.91685\\-195.188\\-9\\-56.44355\\-195.7553\\-9\\-54.92617\\-199.6615\\-9\\-54.45247\\-201.6146\\-9\\-52.68983\\-203.5678\\-9\\-51.03476\\-205.5209\\-9\\-49.8198\\-207.474\\-9\\-48.74523\\-209.4271\\-9\\-48.81138\\-211.3803\\-9\\-49.91724\\-213.3334\\-9\\-50.67805\\-215.2865\\-9\\-50.4921\\-217.2396\\-9\\-49.87165\\-219.1928\\-9\\-49.10435\\-220.4992\\-9\\-47.87739\\-221.1459\\-9\\-47.15123\\-222.0594\\-9\\-45.75007\\-223.099\\-9\\-45.1981\\-223.252\\-9\\-43.24498\\-224.7027\\-9\\-43.24498\\-225.3242\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "340" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-158.4233\\-9\\-35.43248\\-158.3249\\-9\\-37.3856\\-157.763\\-9\\-39.33873\\-157.4822\\-9\\-41.29185\\-156.1456\\-9\\-42.48266\\-154.7396\\-9\\-43.98736\\-152.7865\\-9\\-44.54876\\-150.8334\\-9\\-46.03299\\-148.8803\\-9\\-46.66294\\-146.9271\\-9\\-47.15123\\-146.2837\\-9\\-49.10435\\-144.8519\\-9\\-52.05497\\-146.9271\\-9\\-53.0106\\-148.5587\\-9\\-53.72605\\-146.9271\\-9\\-53.0106\\-145.1192\\-9\\-51.82026\\-143.0209\\-9\\-51.05748\\-142.2581\\-9\\-49.10435\\-141.5731\\-9\\-47.15123\\-139.8664\\-9\\-46.57392\\-139.1146\\-9\\-45.78404\\-137.1615\\-9\\-44.18106\\-135.2084\\-9\\-43.24498\\-134.2102\\-9\\-41.29185\\-132.53\\-9\\-39.33873\\-131.9782\\-9\\-37.3856\\-131.5379\\-9\\-35.43248\\-130.56\\-9\\-33.47935\\-130.0392\\-9\\-31.52623\\-129.8459\\-9\\-25.66685\\-129.8459\\-9\\-23.71373\\-130.0223\\-9\\-21.7606\\-130.7274\\-9\\-19.80748\\-132.2598\\-9\\-16.96786\\-135.2084\\-9\\-16.06281\\-137.1615\\-9\\-16.06281\\-139.1146\\-9\\-15.6655\\-141.0678\\-9\\-12.28794\\-144.974\\-9\\-11.77118\\-146.9271\\-9\\-10.89822\\-148.8803\\-9\\-11.01841\\-150.8334\\-9\\-11.99498\\-151.3471\\-9\\-12.67335\\-150.8334\\-9\\-14.38523\\-148.8803\\-9\\-15.90123\\-148.0883\\-9\\-16.68924\\-148.8803\\-9\\-17.85435\\-150.9579\\-9\\-18.74681\\-152.7865\\-9\\-21.7606\\-155.7683\\-9\\-23.71373\\-157.3556\\-9\\-25.66685\\-157.7795\\-9\\-27.6412\\-158.6459\\-9\\-29.5731\\-159.1596\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "341" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-222.4143\\-9\\45.34478\\-221.1459\\-9\\45.58283\\-219.1928\\-9\\46.32264\\-217.2396\\-9\\47.48111\\-215.2865\\-9\\48.5519\\-213.9149\\-9\\50.50502\\-215.9644\\-9\\52.45815\\-217.5427\\-9\\54.41127\\-218.6319\\-9\\54.94337\\-219.1928\\-9\\54.95894\\-221.1459\\-9\\54.41127\\-221.6722\\-9\\52.45815\\-222.4276\\-9\\50.50502\\-222.5002\\-9\\48.5519\\-222.4051\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "79" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "342" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "62.22377\\-218.765\\-9\\61.24202\\-217.2396\\-9\\63.20499\\-215.2865\\-9\\63.59203\\-213.3334\\-9\\63.76826\\-211.3803\\-9\\64.32186\\-209.4271\\-9\\64.1769\\-207.8809\\-9\\63.91991\\-207.474\\-9\\62.22377\\-207.0609\\-9\\60.27065\\-207.0412\\-9\\58.31752\\-207.19\\-9\\56.3644\\-207.4997\\-9\\54.41127\\-207.5004\\-9\\52.96907\\-205.5209\\-9\\53.05049\\-203.5678\\-9\\53.50582\\-201.6146\\-9\\54.33051\\-199.6615\\-9\\54.71524\\-197.7084\\-9\\55.91604\\-193.8021\\-9\\56.40196\\-191.849\\-9\\56.78034\\-189.8959\\-9\\57.36873\\-187.9428\\-9\\58.31752\\-185.7611\\-9\\59.3476\\-182.0834\\-9\\59.98882\\-180.1303\\-9\\60.08365\\-178.1771\\-9\\60.71454\\-176.224\\-9\\61.65549\\-172.3178\\-9\\62.22377\\-171.693\\-9\\64.39519\\-170.3646\\-9\\66.13003\\-169.5966\\-9\\67.23997\\-168.4115\\-9\\67.64846\\-166.4584\\-9\\67.66721\\-164.5053\\-9\\66.47428\\-162.5521\\-9\\65.12976\\-160.599\\-9\\65.51573\\-158.6459\\-9\\66.13003\\-157.9449\\-9\\68.08315\\-157.181\\-9\\70.03628\\-155.9229\\-9\\71.9894\\-156.1574\\-9\\73.94253\\-157.407\\-9\\75.89565\\-157.8678\\-9\\79.8019\\-159.7068\\-9\\83.09109\\-162.5521\\-9\\83.70815\\-163.2246\\-9\\85.66128\\-164.2815\\-9\\88.10863\\-166.4584\\-9\\89.43109\\-168.4115\\-9\\90.35722\\-170.3646\\-9\\89.56753\\-171.3193\\-9\\87.6144\\-171.1323\\-9\\85.66128\\-171.3895\\-9\\83.70815\\-172.4125\\-9\\81.75503\\-173.0266\\-9\\79.8019\\-173.5211\\-9\\75.23869\\-178.1771\\-9\\73.84561\\-180.1303\\-9\\71.9894\\-183.3302\\-9\\70.03628\\-185.8245\\-9\\68.08315\\-187.6051\\-9\\66.57704\\-189.8959\\-9\\66.13003\\-191.1405\\-9\\65.43517\\-191.849\\-9\\64.44115\\-193.8021\\-9\\65.91139\\-195.7553\\-9\\67.09179\\-197.7084\\-9\\68.08315\\-199.1624\\-9\\68.24474\\-199.6615\\-9\\68.69141\\-203.5678\\-9\\69.2129\\-205.5209\\-9\\70.49466\\-207.474\\-9\\70.996\\-209.4271\\-9\\71.25698\\-211.3803\\-9\\70.03628\\-213.9086\\-9\\68.55933\\-217.2396\\-9\\68.08315\\-217.6454\\-9\\66.13003\\-218.4376\\-9\\64.1769\\-218.7742\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "343" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-211.4495\\-9\\83.70815\\-210.4292\\-9\\81.75503\\-209.0703\\-9\\79.8019\\-208.1431\\-9\\77.27467\\-205.5209\\-9\\76.26499\\-203.5678\\-9\\73.58107\\-195.7553\\-9\\72.94932\\-193.8021\\-9\\72.54352\\-191.849\\-9\\73.27004\\-187.9428\\-9\\73.53728\\-185.9896\\-9\\74.79986\\-184.0365\\-9\\75.89565\\-182.8731\\-9\\77.84878\\-182.0183\\-9\\79.96828\\-180.1303\\-9\\83.70815\\-177.2977\\-9\\84.68472\\-178.1771\\-9\\86.35278\\-180.1303\\-9\\87.11132\\-182.0834\\-9\\88.29189\\-184.0365\\-9\\91.65608\\-187.9428\\-9\\93.47378\\-189.1458\\-9\\94.36615\\-189.8959\\-9\\95.50767\\-191.849\\-9\\95.46446\\-193.8021\\-9\\95.7592\\-195.7553\\-9\\95.4269\\-196.6253\\-9\\94.72607\\-197.7084\\-9\\92.64891\\-199.6615\\-9\\92.10659\\-201.6146\\-9\\92.65371\\-203.5678\\-9\\94.67228\\-207.474\\-9\\95.03751\\-209.4271\\-9\\93.47378\\-210.7997\\-9\\91.52065\\-211.5638\\-9\\89.56753\\-211.9756\\-9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "344" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-215.5428\\-7\\-90.11997\\-214.8071\\-7\\-94.02622\\-212.8804\\-7\\-97.93247\\-212.8804\\-7\\-99.8856\\-212.7086\\-7\\-101.8387\\-211.7576\\-7\\-104.1463\\-209.4271\\-7\\-105.2567\\-207.474\\-7\\-106.5051\\-205.5209\\-7\\-107.012\\-203.5678\\-7\\-107.1599\\-201.6146\\-7\\-107.1599\\-197.7084\\-7\\-106.5095\\-195.7553\\-7\\-104.7125\\-193.8021\\-7\\-103.5787\\-191.849\\-7\\-102.5964\\-189.8959\\-7\\-101.3758\\-187.9428\\-7\\-100.8881\\-185.9896\\-7\\-99.8856\\-184.3924\\-7\\-97.47471\\-182.0834\\-7\\-95.97935\\-181.034\\-7\\-94.02622\\-180.6356\\-7\\-92.0731\\-179.3896\\-7\\-90.11997\\-179.2144\\-7\\-86.21372\\-179.4293\\-7\\-84.2606\\-180.9506\\-7\\-82.30747\\-182.1927\\-7\\-80.35435\\-183.2191\\-7\\-79.25083\\-184.0365\\-7\\-76.4481\\-185.8435\\-7\\-74.49497\\-188.0502\\-7\\-73.50266\\-189.8959\\-7\\-73.14159\\-191.849\\-7\\-71.98826\\-195.7553\\-7\\-71.98826\\-197.7084\\-7\\-72.97921\\-203.5678\\-7\\-73.81534\\-205.5209\\-7\\-75.36236\\-207.474\\-7\\-76.4481\\-209.1231\\-7\\-78.19683\\-211.3803\\-7\\-80.35435\\-213.386\\-7\\-82.30747\\-215.022\\-7\\-84.2606\\-215.4874\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "345" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-66.68247\\-184.5489\\-7\\-68.6356\\-183.1339\\-7\\-70.58872\\-181.0262\\-7\\-72.54185\\-181.1838\\-7\\-74.49497\\-182.7153\\-7\\-76.4481\\-181.4304\\-7\\-78.40122\\-179.5004\\-7\\-80.35435\\-178.4721\\-7\\-82.30747\\-177.2737\\-7\\-85.93202\\-176.224\\-7\\-88.16685\\-175.3604\\-7\\-90.11997\\-174.4826\\-7\\-90.36024\\-174.2709\\-7\\-90.78426\\-172.3178\\-7\\-89.23356\\-170.3646\\-7\\-87.07685\\-166.4584\\-7\\-85.70841\\-164.5053\\-7\\-85.12502\\-162.5521\\-7\\-82.30747\\-159.8957\\-7\\-80.35435\\-159.396\\-7\\-78.40122\\-157.7743\\-7\\-76.4481\\-157.3142\\-7\\-74.49497\\-157.5868\\-7\\-70.58872\\-159.7775\\-7\\-69.81236\\-160.599\\-7\\-68.6356\\-163.1078\\-7\\-67.47723\\-166.4584\\-7\\-66.30545\\-168.4115\\-7\\-66.27608\\-170.3646\\-7\\-65.85463\\-172.3178\\-7\\-64.89094\\-174.2709\\-7\\-64.29466\\-176.224\\-7\\-64.12634\\-178.1771\\-7\\-64.09746\\-180.1303\\-7\\-64.52991\\-182.0834\\-7\\-65.95434\\-184.0365\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "346" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-223.7642\\-7\\-46.17466\\-223.099\\-7\\-47.15123\\-222.7165\\-7\\-51.05748\\-222.6532\\-7\\-53.0106\\-221.7591\\-7\\-58.86998\\-218.511\\-7\\-60.8231\\-217.9776\\-7\\-62.77623\\-217.1042\\-7\\-66.68247\\-216.5321\\-7\\-68.6356\\-215.6958\\-7\\-70.9281\\-213.3334\\-7\\-71.56528\\-211.3803\\-7\\-70.59635\\-209.4271\\-7\\-69.51389\\-207.474\\-7\\-68.6356\\-206.6173\\-7\\-66.68247\\-205.7933\\-7\\-62.77623\\-204.65\\-7\\-61.87896\\-203.5678\\-7\\-62.09893\\-201.6146\\-7\\-62.15627\\-199.6615\\-7\\-61.79966\\-197.7084\\-7\\-61.22485\\-195.7553\\-7\\-59.41166\\-193.8021\\-7\\-58.86998\\-193.3768\\-7\\-58.35638\\-193.8021\\-7\\-56.87929\\-195.7553\\-7\\-55.83749\\-197.7084\\-7\\-54.04433\\-201.6146\\-7\\-51.80223\\-205.5209\\-7\\-50.22997\\-207.474\\-7\\-49.75014\\-209.4271\\-7\\-49.72532\\-211.3803\\-7\\-50.3359\\-213.3334\\-7\\-50.62947\\-215.2865\\-7\\-49.10435\\-217.4812\\-7\\-47.15123\\-218.8067\\-7\\-44.99436\\-221.1459\\-7\\-44.7846\\-223.099\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "347" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-158.8329\\-7\\-39.33873\\-158.4609\\-7\\-41.29185\\-157.4171\\-7\\-42.0452\\-156.6928\\-7\\-43.46122\\-154.7396\\-7\\-44.27691\\-152.7865\\-7\\-44.70125\\-150.8334\\-7\\-45.36325\\-148.8803\\-7\\-46.37498\\-146.9271\\-7\\-47.15123\\-145.8223\\-7\\-49.11223\\-144.974\\-7\\-51.49039\\-146.9271\\-7\\-52.44047\\-148.8803\\-7\\-53.0106\\-149.6219\\-7\\-54.7719\\-148.8803\\-7\\-53.77071\\-146.9271\\-7\\-53.0106\\-145.2322\\-7\\-51.79111\\-143.0209\\-7\\-51.05748\\-142.2761\\-7\\-49.10435\\-141.5731\\-7\\-47.15123\\-140.1873\\-7\\-46.1795\\-139.1146\\-7\\-45.1981\\-137.657\\-7\\-43.24498\\-135.2004\\-7\\-41.29185\\-133.7606\\-7\\-39.33873\\-132.5384\\-7\\-37.3856\\-131.9982\\-7\\-35.43248\\-131.5727\\-7\\-33.47935\\-130.5997\\-7\\-31.52623\\-130.2254\\-7\\-25.66685\\-130.2209\\-7\\-23.71373\\-130.5669\\-7\\-19.80748\\-132.4055\\-7\\-16.97306\\-135.2084\\-7\\-16.06281\\-137.1615\\-7\\-16.04983\\-141.0678\\-7\\-14.76841\\-143.0209\\-7\\-12.5764\\-144.974\\-7\\-11.28426\\-146.9271\\-7\\-10.49119\\-148.8803\\-7\\-9.518917\\-150.8334\\-7\\-9.726502\\-152.7865\\-7\\-10.04185\\-153.0091\\-7\\-11.99498\\-151.8699\\-7\\-13.9481\\-149.6287\\-7\\-15.90123\\-148.5482\\-7\\-16.23106\\-148.8803\\-7\\-17.27503\\-150.8334\\-7\\-19.80748\\-154.3477\\-7\\-22.49913\\-156.6928\\-7\\-23.71373\\-157.6271\\-7\\-25.66685\\-158.6535\\-7\\-27.61998\\-159.1678\\-7\\-29.5731\\-159.3902\\-7\\-31.52623\\-159.4671\\-7\\-35.43248\\-159.3662\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "77" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "348" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "62.22377\\-217.2758\\-7\\63.47535\\-215.2865\\-7\\64.33966\\-213.3334\\-7\\65.05782\\-211.3803\\-7\\66.27386\\-209.4271\\-7\\66.66463\\-207.474\\-7\\66.13003\\-206.1891\\-7\\65.47337\\-205.5209\\-7\\64.4169\\-203.5678\\-7\\64.1769\\-203.3532\\-7\\60.27065\\-203.3499\\-7\\58.31752\\-203.7267\\-7\\56.3644\\-205.1102\\-7\\54.41127\\-204.056\\-7\\54.20528\\-203.5678\\-7\\54.07924\\-201.6146\\-7\\54.7578\\-199.6615\\-7\\55.2958\\-197.7084\\-7\\55.93521\\-195.7553\\-7\\56.68992\\-193.8021\\-7\\57.27361\\-189.8959\\-7\\57.8626\\-187.9428\\-7\\58.80581\\-185.9896\\-7\\59.73439\\-182.0834\\-7\\60.00011\\-180.1303\\-7\\60.68659\\-178.1771\\-7\\61.64446\\-174.2709\\-7\\62.61841\\-172.3178\\-7\\64.1769\\-171.1075\\-7\\66.13003\\-170.5262\\-7\\67.48013\\-168.4115\\-7\\68.14973\\-166.4584\\-7\\68.61942\\-164.5053\\-7\\65.82606\\-160.599\\-7\\65.68613\\-158.6459\\-7\\66.13003\\-158.1408\\-7\\68.08315\\-157.231\\-7\\70.03628\\-156.7449\\-7\\71.9894\\-156.9165\\-7\\73.94253\\-157.6935\\-7\\75.89565\\-158.7813\\-7\\77.84878\\-159.1512\\-7\\79.8019\\-159.7165\\-7\\83.70815\\-163.7716\\-7\\85.66128\\-164.729\\-7\\87.09245\\-166.4584\\-7\\88.55164\\-168.4115\\-7\\89.56753\\-169.3072\\-7\\90.51811\\-170.3646\\-7\\90.39913\\-172.3178\\-7\\89.56753\\-172.9366\\-7\\87.6144\\-172.3985\\-7\\85.66128\\-172.4805\\-7\\83.70815\\-173.3649\\-7\\81.75503\\-174.0994\\-7\\79.8019\\-175.3062\\-7\\75.89565\\-179.1613\\-7\\73.27824\\-182.0834\\-7\\72.2354\\-184.0365\\-7\\71.08337\\-185.9896\\-7\\70.03628\\-188.2023\\-7\\68.78591\\-189.8959\\-7\\68.22925\\-191.849\\-7\\68.20034\\-193.8021\\-7\\68.62222\\-195.7553\\-7\\69.25373\\-197.7084\\-7\\69.37598\\-199.6615\\-7\\69.67932\\-201.6146\\-7\\70.25725\\-203.5678\\-7\\71.11522\\-205.5209\\-7\\72.53359\\-207.474\\-7\\72.3439\\-209.4271\\-7\\71.71886\\-211.3803\\-7\\70.77847\\-213.3334\\-7\\68.08315\\-216.1316\\-7\\66.13003\\-216.7894\\-7\\64.1769\\-217.1645\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "349" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-210.0676\\-7\\83.70815\\-208.7741\\-7\\81.51376\\-207.474\\-7\\79.56344\\-205.5209\\-7\\78.04101\\-203.5678\\-7\\76.31418\\-199.6615\\-7\\75.18125\\-197.7084\\-7\\74.54554\\-195.7553\\-7\\74.29935\\-193.8021\\-7\\73.6075\\-191.849\\-7\\73.5787\\-189.8959\\-7\\74.22435\\-187.9428\\-7\\74.67051\\-185.9896\\-7\\75.89565\\-184.5661\\-7\\77.84878\\-183.3055\\-7\\81.75503\\-179.5199\\-7\\83.70815\\-178.7103\\-7\\85.66128\\-179.4585\\-7\\88.26724\\-182.0834\\-7\\88.9288\\-184.0365\\-7\\90.43613\\-185.9896\\-7\\91.52065\\-187.1953\\-7\\93.47378\\-188.405\\-7\\94.8628\\-189.8959\\-7\\95.16781\\-191.849\\-7\\95.17941\\-193.8021\\-7\\96.03932\\-195.7553\\-7\\95.89732\\-197.7084\\-7\\94.58891\\-199.6615\\-7\\93.16981\\-203.5678\\-7\\93.48141\\-205.5209\\-7\\94.0532\\-207.474\\-7\\93.9252\\-209.4271\\-7\\93.47378\\-209.8396\\-7\\91.52065\\-210.1408\\-7\\89.56753\\-210.2841\\-7\\87.6144\\-210.5696\\-7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "350" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.11997\\-213.9453\\-5\\-92.0731\\-212.8365\\-5\\-94.02622\\-212.5237\\-5\\-97.93247\\-212.4659\\-5\\-99.8856\\-211.7401\\-5\\-100.2911\\-211.3803\\-5\\-104.1198\\-207.474\\-5\\-106.398\\-203.5678\\-5\\-106.8126\\-201.6146\\-5\\-106.808\\-197.7084\\-5\\-106.2364\\-195.7553\\-5\\-105.0489\\-193.8021\\-5\\-104.4925\\-191.849\\-5\\-103.0344\\-189.8959\\-5\\-102.5058\\-187.9428\\-5\\-99.8856\\-184.6744\\-5\\-97.93247\\-183.4881\\-5\\-95.97935\\-182.4308\\-5\\-92.0731\\-180.7653\\-5\\-90.11997\\-180.6439\\-5\\-88.16685\\-180.7076\\-5\\-86.21372\\-181.0043\\-5\\-84.2606\\-182.4322\\-5\\-82.30747\\-183.3874\\-5\\-80.35435\\-185.1782\\-5\\-79.27248\\-185.9896\\-5\\-78.40122\\-186.8609\\-5\\-76.4481\\-188.2683\\-5\\-74.71692\\-189.8959\\-5\\-74.69441\\-191.849\\-5\\-73.27281\\-195.7553\\-5\\-73.19814\\-197.7084\\-5\\-73.80215\\-199.6615\\-5\\-74.68198\\-201.6146\\-5\\-74.70817\\-203.5678\\-5\\-75.65649\\-205.5209\\-5\\-77.01537\\-207.474\\-5\\-78.40122\\-208.994\\-5\\-79.04064\\-209.4271\\-5\\-80.35435\\-210.9598\\-5\\-81.40325\\-213.3334\\-5\\-82.30747\\-214.8041\\-5\\-84.2606\\-214.689\\-5\\-86.21372\\-214.4655\\-5\\-88.16685\\-214.4456\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "351" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-66.68247\\-187.0116\\-5\\-68.6356\\-185.2572\\-5\\-69.75458\\-184.0365\\-5\\-70.58872\\-181.9538\\-5\\-71.80943\\-182.0834\\-5\\-72.54185\\-182.435\\-5\\-74.49497\\-183.8568\\-5\\-76.4481\\-183.1792\\-5\\-79.48058\\-180.1303\\-5\\-80.35435\\-179.4217\\-5\\-82.30747\\-178.5048\\-5\\-88.16685\\-176.7894\\-5\\-90.11997\\-175.8818\\-5\\-91.29795\\-174.2709\\-5\\-91.1775\\-172.3178\\-5\\-89.89142\\-170.3646\\-5\\-88.78934\\-168.4115\\-5\\-87.07685\\-166.4584\\-5\\-85.70841\\-164.5053\\-5\\-85.10917\\-162.5521\\-5\\-84.2606\\-161.7157\\-5\\-82.30747\\-160.7476\\-5\\-80.35435\\-159.5846\\-5\\-78.40122\\-158.0037\\-5\\-76.4481\\-157.5228\\-5\\-74.49497\\-157.8518\\-5\\-72.54185\\-159.3154\\-5\\-70.58872\\-160.559\\-5\\-68.36507\\-164.5053\\-5\\-67.65421\\-166.4584\\-5\\-66.31549\\-168.4115\\-5\\-66.28574\\-170.3646\\-5\\-66.13807\\-172.3178\\-5\\-65.51168\\-174.2709\\-5\\-64.30398\\-176.224\\-5\\-64.28546\\-178.1771\\-5\\-64.05327\\-180.1303\\-5\\-63.94535\\-182.0834\\-5\\-64.13701\\-184.0365\\-5\\-64.18214\\-185.9896\\-5\\-64.72935\\-187.2851\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "352" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-47.2832\\-221.1459\\-5\\-49.10435\\-219.9207\\-5\\-51.05748\\-219.8952\\-5\\-53.1815\\-219.1928\\-5\\-54.96373\\-217.9421\\-5\\-57.09674\\-217.2396\\-5\\-58.86998\\-216.7514\\-5\\-60.8231\\-216.5448\\-5\\-62.77623\\-215.9594\\-5\\-66.68247\\-215.0596\\-5\\-68.6356\\-214.1713\\-5\\-70.58872\\-213.1296\\-5\\-72.40338\\-211.3803\\-5\\-71.86101\\-209.4271\\-5\\-70.58872\\-206.3773\\-5\\-69.81561\\-205.5209\\-5\\-68.6356\\-204.5094\\-5\\-66.68247\\-204.0811\\-5\\-64.72935\\-204.0878\\-5\\-63.39471\\-203.5678\\-5\\-64.07298\\-201.6146\\-5\\-64.18829\\-199.6615\\-5\\-63.53435\\-197.7084\\-5\\-62.77623\\-196.268\\-5\\-61.74464\\-193.8021\\-5\\-60.8231\\-193.173\\-5\\-58.86998\\-192.9892\\-5\\-58.05703\\-193.8021\\-5\\-57.33279\\-195.7553\\-5\\-55.98701\\-197.7084\\-5\\-55.40762\\-199.6615\\-5\\-54.093\\-201.6146\\-5\\-53.43597\\-203.5678\\-5\\-52.18428\\-205.5209\\-5\\-50.84293\\-209.4271\\-5\\-50.57877\\-211.3803\\-5\\-51.34144\\-213.3334\\-5\\-51.41555\\-215.2865\\-5\\-51.05748\\-216.1817\\-5\\-49.10435\\-218.1106\\-5\\-47.10802\\-219.1928\\-5\\-47.01559\\-221.1459\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "353" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.33873\\-159.4619\\-5\\-41.29185\\-158.17\\-5\\-43.24498\\-156.1867\\-5\\-44.28836\\-154.7396\\-5\\-44.69833\\-152.7865\\-5\\-44.89414\\-148.8803\\-5\\-46.29364\\-146.9271\\-5\\-47.15123\\-145.978\\-5\\-49.10435\\-145.9099\\-5\\-50.14642\\-146.9271\\-5\\-53.0106\\-150.2348\\-5\\-54.77498\\-148.8803\\-5\\-53.73794\\-146.9271\\-5\\-52.45338\\-144.974\\-5\\-51.62714\\-143.0209\\-5\\-51.05748\\-142.435\\-5\\-49.10435\\-141.5731\\-5\\-47.15123\\-140.4362\\-5\\-45.77742\\-139.1146\\-5\\-44.17146\\-137.1615\\-5\\-43.24498\\-136.1743\\-5\\-41.29185\\-134.5363\\-5\\-39.33873\\-133.7689\\-5\\-37.3856\\-132.5569\\-5\\-35.43248\\-132.0183\\-5\\-31.52623\\-131.3397\\-5\\-29.5731\\-131.2941\\-5\\-25.66685\\-131.3248\\-5\\-21.7606\\-131.8562\\-5\\-19.80748\\-132.4576\\-5\\-17.02501\\-135.2084\\-5\\-16.17176\\-137.1615\\-5\\-16.06281\\-139.1146\\-5\\-16.06281\\-141.0678\\-5\\-15.13134\\-143.0209\\-5\\-13.9481\\-144.2773\\-5\\-11.99498\\-146.0388\\-5\\-11.15419\\-146.9271\\-5\\-9.153595\\-150.8334\\-5\\-8.331031\\-152.7865\\-5\\-9.525399\\-154.7396\\-5\\-10.04185\\-155.1346\\-5\\-10.5583\\-154.7396\\-5\\-11.99498\\-152.6208\\-5\\-13.08894\\-150.8334\\-5\\-13.9481\\-149.9501\\-5\\-15.90123\\-149.7514\\-5\\-16.85816\\-150.8334\\-5\\-18.21347\\-152.7865\\-5\\-19.03151\\-154.7396\\-5\\-19.80748\\-155.4952\\-5\\-21.7606\\-157.1274\\-5\\-23.71373\\-157.9277\\-5\\-25.66685\\-159.1596\\-5\\-27.61998\\-159.396\\-5\\-29.5731\\-159.7697\\-5\\-31.52623\\-160.2735\\-5\\-33.47935\\-160.2493\\-5\\-35.43248\\-159.722\\-5\\-37.3856\\-159.4722\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "77" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "354" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "66.13003\\-215.1115\\-5\\65.1328\\-213.3334\\-5\\65.58562\\-211.3803\\-5\\66.99429\\-209.4271\\-5\\67.74487\\-207.474\\-5\\67.38285\\-205.5209\\-5\\66.49197\\-203.5678\\-5\\66.13003\\-203.157\\-5\\64.1769\\-201.6395\\-5\\62.22377\\-201.2173\\-5\\58.31752\\-201.2679\\-5\\56.3644\\-201.8421\\-5\\56.13698\\-201.6146\\-5\\55.62872\\-199.6615\\-5\\56.03888\\-197.7084\\-5\\56.77079\\-195.7553\\-5\\57.73769\\-191.849\\-5\\57.95131\\-189.8959\\-5\\58.78837\\-187.9428\\-5\\59.75939\\-184.0365\\-5\\60.00011\\-182.0834\\-5\\60.09626\\-180.1303\\-5\\61.08216\\-178.1771\\-5\\61.59219\\-176.224\\-5\\62.22377\\-174.7714\\-5\\63.51947\\-172.3178\\-5\\64.1769\\-171.7295\\-5\\66.13003\\-171.3825\\-5\\67.13202\\-170.3646\\-5\\67.57784\\-168.4115\\-5\\68.82745\\-166.4584\\-5\\69.27905\\-164.5053\\-5\\68.79929\\-162.5521\\-5\\66.82603\\-160.599\\-5\\66.22476\\-158.6459\\-5\\68.08315\\-157.3623\\-5\\70.03628\\-157.1724\\-5\\71.9894\\-157.1896\\-5\\73.94253\\-157.8254\\-5\\75.89565\\-159.1078\\-5\\77.84878\\-159.1596\\-5\\79.8019\\-159.7417\\-5\\80.63577\\-160.599\\-5\\81.55559\\-162.5521\\-5\\83.70815\\-164.4105\\-5\\85.66128\\-165.4747\\-5\\86.4154\\-166.4584\\-5\\87.16311\\-168.4115\\-5\\87.6144\\-168.7958\\-5\\89.56753\\-169.7719\\-5\\90.20441\\-170.3646\\-5\\91.88259\\-172.3178\\-5\\92.48559\\-174.2709\\-5\\91.52065\\-175.0428\\-5\\89.56753\\-174.6459\\-5\\87.6144\\-173.8524\\-5\\85.66128\\-173.5706\\-5\\83.70815\\-174.8229\\-5\\81.75503\\-175.5366\\-5\\80.89853\\-176.224\\-5\\77.84878\\-179.1394\\-5\\74.94846\\-182.0834\\-5\\73.19382\\-184.0365\\-5\\71.9894\\-187.2148\\-5\\70.87791\\-189.8959\\-5\\70.27858\\-191.849\\-5\\70.26219\\-193.8021\\-5\\70.59515\\-197.7084\\-5\\70.62222\\-199.6615\\-5\\71.22768\\-201.6146\\-5\\73.13251\\-205.5209\\-5\\73.88869\\-207.474\\-5\\73.04226\\-209.4271\\-5\\71.9894\\-211.3709\\-5\\70.72327\\-213.3334\\-5\\70.03628\\-214.0204\\-5\\68.08315\\-215.1249\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "355" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.08929\\-207.474\\-5\\83.70815\\-205.2846\\-5\\82.30756\\-203.5678\\-5\\81.75503\\-203.2635\\-5\\79.8019\\-202.5912\\-5\\79.04765\\-201.6146\\-5\\76.0994\\-195.7553\\-5\\76.05724\\-193.8021\\-5\\75.42392\\-191.849\\-5\\75.05183\\-189.8959\\-5\\75.63097\\-187.9428\\-5\\75.89565\\-187.4932\\-5\\77.22983\\-185.9896\\-5\\77.84878\\-185.5221\\-5\\79.8019\\-183.5099\\-5\\80.94763\\-182.0834\\-5\\81.75503\\-181.2946\\-5\\83.70815\\-180.5284\\-5\\85.66128\\-180.8186\\-5\\87.6144\\-181.4486\\-5\\88.26359\\-182.0834\\-5\\89.02131\\-184.0365\\-5\\90.46053\\-185.9896\\-5\\91.52065\\-186.9247\\-5\\93.47378\\-187.4374\\-5\\94.02737\\-187.9428\\-5\\95.14507\\-189.8959\\-5\\95.16781\\-193.8021\\-5\\95.46475\\-195.7553\\-5\\95.46446\\-197.7084\\-5\\95.11208\\-199.6615\\-5\\94.24628\\-201.6146\\-5\\93.08684\\-203.5678\\-5\\92.80046\\-205.5209\\-5\\91.97757\\-207.474\\-5\\91.52065\\-207.9352\\-5\\89.56753\\-208.8809\\-5\\87.6144\\-209.2304\\-5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "356" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-211.8482\\-3\\-94.02622\\-211.1194\\-3\\-97.93247\\-210.7319\\-3\\-99.8856\\-209.669\\-3\\-101.8387\\-207.8052\\-3\\-104.0131\\-205.5209\\-3\\-104.8674\\-203.5678\\-3\\-105.186\\-201.6146\\-3\\-105.1897\\-197.7084\\-3\\-105.0043\\-195.7553\\-3\\-104.9949\\-193.8021\\-3\\-104.4528\\-191.849\\-3\\-102.7308\\-189.8959\\-3\\-101.8778\\-187.9428\\-3\\-99.8856\\-186.817\\-3\\-98.6942\\-185.9896\\-3\\-95.97935\\-184.9987\\-3\\-94.67076\\-184.0365\\-3\\-92.0731\\-183.0874\\-3\\-90.11997\\-182.9558\\-3\\-88.16685\\-182.561\\-3\\-86.21372\\-182.7005\\-3\\-84.2606\\-183.6872\\-3\\-82.30747\\-185.1478\\-3\\-81.45976\\-185.9896\\-3\\-80.35435\\-187.4773\\-3\\-78.40122\\-189.4459\\-3\\-77.83458\\-189.8959\\-3\\-76.78614\\-191.849\\-3\\-76.70719\\-193.8021\\-3\\-76.4481\\-194.5346\\-3\\-75.69243\\-195.7553\\-3\\-75.1335\\-197.7084\\-3\\-76.71864\\-201.6146\\-3\\-76.72047\\-203.5678\\-3\\-77.68043\\-205.5209\\-3\\-78.40122\\-206.3777\\-3\\-80.35435\\-208.0075\\-3\\-81.82858\\-209.4271\\-3\\-82.30747\\-210.1002\\-3\\-84.2606\\-212.0028\\-3\\-86.21372\\-212.7379\\-3\\-88.16685\\-212.805\\-3\\-90.11997\\-212.46\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "357" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-66.68247\\-213.9319\\-3\\-68.6356\\-213.0977\\-3\\-70.58872\\-212.663\\-3\\-72.54185\\-211.6402\\-3\\-72.80368\\-211.3803\\-3\\-73.43423\\-209.4271\\-3\\-72.89063\\-207.474\\-3\\-72.85923\\-205.5209\\-3\\-72.54185\\-204.7885\\-3\\-71.74839\\-203.5678\\-3\\-70.96714\\-201.6146\\-3\\-70.83485\\-197.7084\\-3\\-70.58872\\-196.9876\\-3\\-69.46355\\-195.7553\\-3\\-69.33964\\-193.8021\\-3\\-70.58872\\-193.0005\\-3\\-71.40945\\-191.849\\-3\\-73.35565\\-189.8959\\-3\\-74.65903\\-187.9428\\-3\\-75.35177\\-185.9896\\-3\\-76.4481\\-185.1351\\-3\\-80.35435\\-181.2209\\-3\\-82.30747\\-179.4813\\-3\\-84.2606\\-178.9748\\-3\\-86.21372\\-178.7896\\-3\\-88.16685\\-178.3058\\-3\\-90.11997\\-178.3607\\-3\\-92.0731\\-178.5824\\-3\\-94.02622\\-178.5159\\-3\\-94.47091\\-178.1771\\-3\\-94.92838\\-176.224\\-3\\-92.97231\\-174.2709\\-3\\-92.0731\\-173.1213\\-3\\-90.75388\\-170.3646\\-3\\-88.9763\\-168.4115\\-3\\-87.07132\\-166.4584\\-3\\-85.65961\\-164.5053\\-3\\-84.90613\\-162.5521\\-3\\-84.2606\\-161.9278\\-3\\-82.30747\\-161.3586\\-3\\-80.35435\\-159.6517\\-3\\-78.40122\\-158.8576\\-3\\-76.4481\\-158.4637\\-3\\-74.49497\\-158.7406\\-3\\-72.54185\\-159.4408\\-3\\-71.14285\\-160.599\\-3\\-69.62142\\-162.5521\\-3\\-68.37651\\-164.5053\\-3\\-67.66387\\-166.4584\\-3\\-66.31549\\-168.4115\\-3\\-66.27608\\-172.3178\\-3\\-65.68048\\-174.2709\\-3\\-64.30398\\-176.224\\-3\\-64.28546\\-178.1771\\-3\\-63.83036\\-180.1303\\-3\\-63.02571\\-182.0834\\-3\\-63.02391\\-184.0365\\-3\\-62.31426\\-185.9896\\-3\\-61.37951\\-189.8959\\-3\\-60.8231\\-190.4459\\-3\\-60.09214\\-191.849\\-3\\-58.45586\\-193.8021\\-3\\-57.71454\\-195.7553\\-3\\-56.64072\\-197.7084\\-3\\-55.15073\\-201.6146\\-3\\-54.03939\\-203.5678\\-3\\-53.0106\\-207.198\\-3\\-52.09507\\-209.4271\\-3\\-51.95266\\-211.3803\\-3\\-53.0106\\-212.7494\\-3\\-54.96373\\-212.9681\\-3\\-56.07655\\-213.3334\\-3\\-56.91685\\-213.8284\\-3\\-58.86998\\-214.4904\\-3\\-60.8231\\-214.5346\\-3\\-64.72935\\-214.4487\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "358" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-160.5754\\-3\\-39.33873\\-160.56\\-3\\-41.29185\\-159.6774\\-3\\-42.56138\\-158.6459\\-3\\-44.26426\\-156.6928\\-3\\-44.82638\\-154.7396\\-3\\-44.9864\\-152.7865\\-3\\-45.02372\\-148.8803\\-3\\-46.5379\\-146.9271\\-3\\-47.15123\\-146.3457\\-3\\-49.10435\\-146.7595\\-3\\-51.05748\\-149.5346\\-3\\-52.13983\\-150.8334\\-3\\-53.0106\\-151.448\\-3\\-53.76779\\-150.8334\\-3\\-54.36663\\-148.8803\\-3\\-53.21289\\-146.9271\\-3\\-51.80393\\-144.974\\-3\\-51.01992\\-143.0209\\-3\\-49.10435\\-141.7033\\-3\\-47.15123\\-141.4348\\-3\\-45.1981\\-139.6796\\-3\\-43.24498\\-137.0631\\-3\\-41.29185\\-135.7932\\-3\\-39.33873\\-134.284\\-3\\-37.3856\\-133.6712\\-3\\-35.43248\\-132.6338\\-3\\-33.47935\\-132.184\\-3\\-23.71373\\-132.1653\\-3\\-21.7606\\-132.2071\\-3\\-19.80748\\-133.0642\\-3\\-17.63338\\-135.2084\\-3\\-16.53677\\-137.1615\\-3\\-16.17176\\-139.1146\\-3\\-16.06281\\-141.0678\\-3\\-15.72558\\-143.0209\\-3\\-14.77082\\-144.974\\-3\\-13.9481\\-145.6724\\-3\\-11.99498\\-146.3147\\-3\\-11.32585\\-146.9271\\-3\\-9.818055\\-148.8803\\-3\\-8.036543\\-152.7865\\-3\\-8.288477\\-154.7396\\-3\\-9.065289\\-156.6928\\-3\\-10.04185\\-157.6568\\-3\\-10.55338\\-156.6928\\-3\\-11.79522\\-154.7396\\-3\\-12.15657\\-152.7865\\-3\\-13.30763\\-150.8334\\-3\\-13.9481\\-150.2566\\-3\\-15.90123\\-150.2586\\-3\\-16.49641\\-150.8334\\-3\\-17.85435\\-153.0168\\-3\\-18.74084\\-154.7396\\-3\\-21.7606\\-157.6182\\-3\\-23.71373\\-158.8576\\-3\\-25.66685\\-159.396\\-3\\-27.61998\\-159.7753\\-3\\-29.5731\\-160.7606\\-3\\-31.52623\\-161.1372\\-3\\-33.47935\\-161.1292\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "359" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-131.9597\\-3\\48.93942\\-131.3021\\-3\\48.5519\\-131.0007\\-3\\46.59877\\-128.3217\\-3\\46.16409\\-127.3959\\-3\\46.35129\\-125.4428\\-3\\46.59877\\-125.1172\\-3\\48.5519\\-124.3478\\-3\\49.92403\\-125.4428\\-3\\51.86971\\-127.3959\\-3\\53.03798\\-129.349\\-3\\52.29835\\-131.3021\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "73" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "360" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "68.08315\\-214.3036\\-3\\66.66016\\-213.3334\\-3\\66.6872\\-211.3803\\-3\\67.19069\\-209.4271\\-3\\68.41081\\-207.474\\-3\\68.76727\\-205.5209\\-3\\68.08315\\-204.0835\\-3\\66.3684\\-201.6146\\-3\\66.13003\\-201.3999\\-3\\64.1769\\-200.5941\\-3\\62.22377\\-200.0613\\-3\\60.27065\\-199.9847\\-3\\58.31752\\-199.4502\\-3\\57.05591\\-197.7084\\-3\\57.3723\\-195.7553\\-3\\58.67434\\-191.849\\-3\\59.25706\\-187.9428\\-3\\59.78529\\-185.9896\\-3\\60.09626\\-184.0365\\-3\\60.20406\\-182.0834\\-3\\61.7984\\-176.224\\-3\\62.86611\\-174.2709\\-3\\63.27794\\-172.3178\\-3\\64.1769\\-171.2404\\-3\\66.13003\\-171.5767\\-3\\67.1401\\-170.3646\\-3\\67.41365\\-168.4115\\-3\\68.67483\\-166.4584\\-3\\69.17584\\-164.5053\\-3\\69.0092\\-162.5521\\-3\\68.08315\\-161.6858\\-3\\66.59676\\-160.599\\-3\\66.92857\\-158.6459\\-3\\68.08315\\-157.5645\\-3\\70.03628\\-157.181\\-3\\71.9894\\-157.1981\\-3\\73.94253\\-157.8312\\-3\\75.89565\\-159.1167\\-3\\77.84878\\-159.2232\\-3\\79.8019\\-159.9831\\-3\\80.39749\\-160.599\\-3\\80.9489\\-162.5521\\-3\\81.75503\\-163.4612\\-3\\85.07867\\-166.4584\\-3\\86.5738\\-168.4115\\-3\\87.6144\\-169.4191\\-3\\89.56753\\-170.2019\\-3\\91.52065\\-171.5419\\-3\\92.29647\\-172.3178\\-3\\93.77976\\-174.2709\\-3\\94.28345\\-176.224\\-3\\93.47378\\-177.7116\\-3\\91.52065\\-177.0094\\-3\\89.56753\\-176.6732\\-3\\87.6144\\-176.0421\\-3\\85.66128\\-175.6543\\-3\\84.69997\\-176.224\\-3\\81.75503\\-177.3768\\-3\\79.8019\\-179.0542\\-3\\77.84878\\-180.892\\-3\\75.04298\\-184.0365\\-3\\74.23266\\-185.9896\\-3\\73.19691\\-187.9428\\-3\\72.45273\\-189.8959\\-3\\72.25905\\-191.849\\-3\\72.2299\\-197.7084\\-3\\72.31773\\-199.6615\\-3\\73.33547\\-201.6146\\-3\\75.24734\\-205.5209\\-3\\74.95837\\-207.474\\-3\\73.94253\\-209.2069\\-3\\72.2299\\-211.3803\\-3\\70.03628\\-213.3258\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "361" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-207.5643\\-3\\88.97073\\-207.474\\-3\\87.6144\\-206.8142\\-3\\87.00092\\-205.5209\\-3\\85.66128\\-204.1982\\-3\\85.20012\\-203.5678\\-3\\83.70815\\-202.0618\\-3\\81.75503\\-201.0578\\-3\\80.20507\\-199.6615\\-3\\78.43722\\-195.7553\\-3\\78.32543\\-193.8021\\-3\\78.36345\\-191.849\\-3\\78.94411\\-189.8959\\-3\\79.8019\\-188.6264\\-3\\80.97136\\-185.9896\\-3\\82.29911\\-184.0365\\-3\\83.70815\\-183.1316\\-3\\85.66128\\-182.8142\\-3\\87.6144\\-182.8983\\-3\\88.57954\\-184.0365\\-3\\89.56753\\-185.6008\\-3\\90.0341\\-185.9896\\-3\\91.52065\\-186.6901\\-3\\93.47378\\-187.0511\\-3\\94.40594\\-187.9428\\-3\\95.04987\\-189.8959\\-3\\95.04987\\-191.849\\-3\\95.16781\\-195.7553\\-3\\95.16781\\-197.7084\\-3\\95.07008\\-199.6615\\-3\\94.04855\\-201.6146\\-3\\92.55432\\-203.5678\\-3\\91.61092\\-205.5209\\-3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "362" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-94.02622\\-209.5792\\-1\\-95.97935\\-208.5367\\-1\\-97.93247\\-207.8496\\-1\\-99.8856\\-206.7079\\-1\\-101.0236\\-205.5209\\-1\\-102.2647\\-203.5678\\-1\\-103.0446\\-201.6146\\-1\\-103.1754\\-199.6615\\-1\\-102.8346\\-195.7553\\-1\\-103.9427\\-193.8021\\-1\\-103.7918\\-193.4766\\-1\\-102.3193\\-191.849\\-1\\-101.8387\\-191.505\\-1\\-99.8856\\-191.1194\\-1\\-99.12083\\-191.849\\-1\\-98.65269\\-193.8021\\-1\\-98.52271\\-195.7553\\-1\\-97.78599\\-197.7084\\-1\\-95.97935\\-200.0269\\-1\\-94.02622\\-200.952\\-1\\-92.0731\\-201.0165\\-1\\-88.16685\\-201.0165\\-1\\-86.67149\\-201.6146\\-1\\-85.7412\\-201.6146\\-1\\-84.2606\\-200.8975\\-1\\-83.39135\\-199.6615\\-1\\-82.86357\\-197.7084\\-1\\-82.67738\\-195.7553\\-1\\-83.39135\\-193.8021\\-1\\-82.30747\\-192.451\\-1\\-80.35435\\-192.4322\\-1\\-79.15151\\-193.8021\\-1\\-79.13667\\-201.6146\\-1\\-78.26324\\-203.5678\\-1\\-80.35435\\-204.5254\\-1\\-81.54667\\-205.5209\\-1\\-86.21372\\-209.9417\\-1\\-88.16685\\-210.4953\\-1\\-90.11997\\-209.608\\-1\\-92.0731\\-209.8089\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "363" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-84.2606\\-191.4421\\-1\\-85.13036\\-189.8959\\-1\\-86.56468\\-187.9428\\-1\\-87.17549\\-185.9896\\-1\\-86.21372\\-185.3143\\-1\\-84.2606\\-186.8091\\-1\\-82.97965\\-187.9428\\-1\\-83.5648\\-189.8959\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "68" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "364" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-70.58872\\-211.6859\\-1\\-72.54185\\-210.6365\\-1\\-73.85007\\-209.4271\\-1\\-75.21622\\-207.474\\-1\\-75.44078\\-205.5209\\-1\\-74.97029\\-203.5678\\-1\\-74.86733\\-201.6146\\-1\\-73.84047\\-199.6615\\-1\\-73.15801\\-197.7084\\-1\\-72.92398\\-195.7553\\-1\\-72.94061\\-193.8021\\-1\\-73.90552\\-191.849\\-1\\-75.13455\\-189.8959\\-1\\-75.92774\\-187.9428\\-1\\-77.59229\\-185.9896\\-1\\-80.35435\\-183.2286\\-1\\-82.30747\\-181.4403\\-1\\-84.2606\\-180.7474\\-1\\-86.21372\\-180.64\\-1\\-88.16685\\-179.6857\\-1\\-90.11997\\-179.8861\\-1\\-92.0731\\-180.658\\-1\\-94.02622\\-180.658\\-1\\-95.97935\\-181.2958\\-1\\-96.96479\\-180.1303\\-1\\-96.51257\\-178.1771\\-1\\-95.65383\\-176.224\\-1\\-94.10071\\-174.2709\\-1\\-92.0731\\-172.1016\\-1\\-90.92139\\-170.3646\\-1\\-87.06573\\-166.4584\\-1\\-85.50396\\-164.5053\\-1\\-83.63584\\-162.5521\\-1\\-82.30747\\-161.5931\\-1\\-80.35435\\-159.6647\\-1\\-78.40122\\-159.1427\\-1\\-74.49497\\-158.9607\\-1\\-72.54185\\-159.1078\\-1\\-70.58872\\-160.6595\\-1\\-69.58466\\-162.5521\\-1\\-68.33163\\-164.5053\\-1\\-67.6252\\-166.4584\\-1\\-66.31549\\-168.4115\\-1\\-66.28574\\-172.3178\\-1\\-65.71095\\-174.2709\\-1\\-64.37253\\-176.224\\-1\\-64.28546\\-178.1771\\-1\\-63.77519\\-180.1303\\-1\\-62.45071\\-182.0834\\-1\\-62.36983\\-184.0365\\-1\\-61.88647\\-185.9896\\-1\\-60.98586\\-187.9428\\-1\\-60.48701\\-189.8959\\-1\\-59.30733\\-193.8021\\-1\\-57.96317\\-195.7553\\-1\\-57.61228\\-197.7084\\-1\\-57.11629\\-199.6615\\-1\\-55.95509\\-201.6146\\-1\\-55.01591\\-205.5209\\-1\\-54.05692\\-207.474\\-1\\-53.73061\\-209.4271\\-1\\-54.96373\\-210.6708\\-1\\-56.91685\\-210.8954\\-1\\-60.8231\\-210.9057\\-1\\-61.90992\\-211.3803\\-1\\-62.77623\\-211.9397\\-1\\-64.72935\\-212.6748\\-1\\-68.6356\\-212.4707\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "365" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-161.4469\\-1\\-42.66662\\-160.599\\-1\\-44.57525\\-158.6459\\-1\\-45.71111\\-156.6928\\-1\\-45.80561\\-154.7396\\-1\\-45.83934\\-150.8334\\-1\\-46.00028\\-148.8803\\-1\\-47.15123\\-147.7766\\-1\\-49.10435\\-148.4652\\-1\\-49.48746\\-148.8803\\-1\\-50.62275\\-150.8334\\-1\\-51.05748\\-151.3857\\-1\\-53.0106\\-152.6001\\-1\\-54.01752\\-150.8334\\-1\\-53.4082\\-148.8803\\-1\\-51.835\\-146.9271\\-1\\-50.66309\\-144.974\\-1\\-50.17363\\-143.0209\\-1\\-49.10435\\-142.1633\\-1\\-47.15123\\-142.0311\\-1\\-45.83106\\-141.0678\\-1\\-44.13769\\-139.1146\\-1\\-42.26305\\-137.1615\\-1\\-41.29185\\-136.2821\\-1\\-39.33873\\-134.7872\\-1\\-37.3856\\-134.1631\\-1\\-33.47935\\-133.491\\-1\\-23.71373\\-133.479\\-1\\-21.7606\\-133.6668\\-1\\-19.80748\\-134.4509\\-1\\-17.85435\\-136.2688\\-1\\-17.07205\\-137.1615\\-1\\-16.55735\\-139.1146\\-1\\-16.17176\\-141.0678\\-1\\-16.06281\\-143.0209\\-1\\-15.74586\\-144.974\\-1\\-13.9481\\-146.7449\\-1\\-11.99498\\-147.0887\\-1\\-10.04185\\-148.1778\\-1\\-9.347532\\-148.8803\\-1\\-8.317284\\-150.8334\\-1\\-8.022142\\-152.7865\\-1\\-7.993985\\-156.6928\\-1\\-7.927136\\-158.6459\\-1\\-8.088726\\-159.6668\\-1\\-10.04185\\-159.0057\\-1\\-10.84403\\-156.6928\\-1\\-11.73411\\-154.7396\\-1\\-12.28794\\-152.7865\\-1\\-13.9481\\-151.0328\\-1\\-15.90123\\-151.3283\\-1\\-17.02529\\-152.7865\\-1\\-18.16659\\-154.7396\\-1\\-20.13749\\-156.6928\\-1\\-22.59665\\-158.6459\\-1\\-23.71373\\-159.396\\-1\\-25.66685\\-159.827\\-1\\-27.61998\\-160.892\\-1\\-29.5731\\-161.3756\\-1\\-31.52623\\-161.4895\\-1\\-37.3856\\-161.5096\\-1\\-39.33873\\-161.6152\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "366" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "13.39565\\-202.0426\\-1\\12.88583\\-201.6146\\-1\\11.90029\\-199.6615\\-1\\13.39565\\-198.7108\\-1\\15.34877\\-198.2541\\-1\\19.25502\\-198.084\\-1\\25.1144\\-198.084\\-1\\27.06752\\-198.6713\\-1\\29.02065\\-199.0695\\-1\\32.9269\\-199.0974\\-1\\34.1219\\-199.6615\\-1\\34.88002\\-201.1777\\-1\\34.88002\\-201.7367\\-1\\32.9269\\-202.3099\\-1\\27.06752\\-202.3339\\-1\\25.1144\\-202.5349\\-1\\21.20815\\-202.4577\\-1\\19.25502\\-202.5529\\-1\\17.3019\\-202.3339\\-1\\15.34877\\-202.3301\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "367" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-135.5953\\-1\\53.61227\\-135.2084\\-1\\52.45815\\-134.4005\\-1\\50.50502\\-133.8558\\-1\\48.5519\\-133.1144\\-1\\46.59877\\-131.1608\\-1\\45.86635\\-129.349\\-1\\45.38741\\-127.3959\\-1\\45.80323\\-125.4428\\-1\\46.59877\\-123.5464\\-1\\48.5519\\-121.859\\-1\\50.50502\\-121.3352\\-1\\52.45815\\-122.5673\\-1\\54.41127\\-124.5735\\-1\\56.5882\\-127.3959\\-1\\56.68992\\-131.3021\\-1\\56.6813\\-133.2553\\-1\\56.3644\\-134.0528\\-1\\55.32953\\-135.2084\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "71" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "368" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "68.08315\\-211.4204\\-1\\67.59779\\-209.4271\\-1\\67.92156\\-207.474\\-1\\68.71473\\-205.5209\\-1\\68.64824\\-203.5678\\-1\\67.22237\\-201.6146\\-1\\66.13003\\-200.5334\\-1\\62.22377\\-199.0964\\-1\\60.27065\\-198.7754\\-1\\58.88784\\-197.7084\\-1\\58.82284\\-195.7553\\-1\\58.98702\\-193.8021\\-1\\59.27914\\-191.849\\-1\\59.82143\\-189.8959\\-1\\59.93014\\-187.9428\\-1\\60.21847\\-185.9896\\-1\\60.74149\\-184.0365\\-1\\61.21556\\-180.1303\\-1\\61.63241\\-178.1771\\-1\\61.81738\\-176.224\\-1\\62.15719\\-174.2709\\-1\\62.12903\\-172.3178\\-1\\61.85678\\-170.3646\\-1\\62.22377\\-169.9531\\-1\\66.13003\\-168.9799\\-1\\66.42757\\-168.4115\\-1\\67.07376\\-166.4584\\-1\\66.89825\\-164.5053\\-1\\64.40578\\-162.5521\\-1\\65.22246\\-160.599\\-1\\66.78658\\-158.6459\\-1\\68.08315\\-157.5264\\-1\\70.03628\\-157.181\\-1\\71.9894\\-157.1981\\-1\\73.94253\\-157.7982\\-1\\75.89565\\-159.0618\\-1\\77.84878\\-159.4393\\-1\\79.19632\\-160.599\\-1\\80.70034\\-162.5521\\-1\\84.62864\\-166.4584\\-1\\87.6144\\-169.5699\\-1\\89.50571\\-170.3646\\-1\\91.52065\\-171.5619\\-1\\92.26807\\-172.3178\\-1\\94.38208\\-176.224\\-1\\95.29\\-178.1771\\-1\\94.13042\\-180.1303\\-1\\93.47378\\-180.3893\\-1\\91.52065\\-179.2306\\-1\\89.56753\\-178.688\\-1\\85.66128\\-178.6333\\-1\\83.70815\\-178.7588\\-1\\81.75503\\-179.4608\\-1\\79.8019\\-180.8481\\-1\\78.44041\\-182.0834\\-1\\77.00667\\-184.0365\\-1\\75.89565\\-186.7859\\-1\\75.24178\\-187.9428\\-1\\74.43081\\-189.8959\\-1\\74.28672\\-191.849\\-1\\74.24247\\-193.8021\\-1\\74.30143\\-195.7553\\-1\\74.50917\\-197.7084\\-1\\75.27611\\-199.6615\\-1\\76.41136\\-201.6146\\-1\\77.07683\\-203.5678\\-1\\77.55038\\-205.5209\\-1\\76.29515\\-207.474\\-1\\73.94253\\-209.7437\\-1\\70.96401\\-211.3803\\-1\\70.03628\\-212.0245\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "22" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "369" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-202.2695\\-1\\87.6144\\-200.7336\\-1\\85.66128\\-200.309\\-1\\83.70815\\-198.8292\\-1\\82.44363\\-197.7084\\-1\\82.41812\\-191.849\\-1\\82.45963\\-189.8959\\-1\\82.94975\\-187.9428\\-1\\84.34617\\-185.9896\\-1\\85.66128\\-185.0591\\-1\\87.6144\\-185.6099\\-1\\89.56753\\-187.6471\\-1\\93.47378\\-187.3475\\-1\\94.06103\\-187.9428\\-1\\94.32325\\-191.849\\-1\\94.77034\\-193.8021\\-1\\95.04987\\-195.7553\\-1\\95.10138\\-197.7084\\-1\\94.7473\\-199.6615\\-1\\93.47378\\-200.8849\\-1\\91.82969\\-201.6146\\-1\\91.52065\\-201.9088\\-1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "370" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.11997\\-206.1372\\1\\-90.82527\\-205.5209\\1\\-92.0731\\-204.7771\\1\\-97.93247\\-204.7592\\1\\-99.09293\\-203.5678\\1\\-100.5667\\-201.6146\\1\\-101.0587\\-199.6615\\1\\-99.8856\\-198.0905\\1\\-97.93247\\-198.8695\\1\\-95.97935\\-200.8639\\1\\-94.02622\\-202.4542\\1\\-88.16685\\-202.4821\\1\\-86.40903\\-203.5678\\1\\-87.23167\\-205.5209\\1\\-88.16685\\-206.4805\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "64" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "371" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-70.58872\\-210.0848\\1\\-72.54185\\-208.9652\\1\\-74.49497\\-208.5975\\1\\-76.4481\\-207.6156\\1\\-77.66117\\-205.5209\\1\\-78.01282\\-203.5678\\1\\-77.25401\\-201.6146\\1\\-77.21608\\-199.6615\\1\\-77.03256\\-197.7084\\1\\-75.87424\\-195.7553\\1\\-75.7938\\-193.8021\\1\\-76.4481\\-192.9058\\1\\-76.93638\\-191.849\\1\\-77.54881\\-189.8959\\1\\-78.40122\\-188.8589\\1\\-78.92397\\-187.9428\\1\\-79.58008\\-185.9896\\1\\-80.35435\\-185.2263\\1\\-82.30747\\-184.3446\\1\\-84.2606\\-182.9425\\1\\-86.21372\\-182.7215\\1\\-92.0731\\-182.7143\\1\\-94.02622\\-182.8581\\1\\-95.97935\\-183.618\\1\\-97.93247\\-182.1367\\1\\-97.53325\\-180.1303\\1\\-96.80605\\-178.1771\\1\\-95.31612\\-176.224\\1\\-94.49039\\-174.2709\\1\\-92.76669\\-172.3178\\1\\-90.92139\\-170.3646\\1\\-88.16685\\-167.6064\\1\\-85.25603\\-164.5053\\1\\-80.35435\\-159.6692\\1\\-74.49497\\-158.0185\\1\\-72.54185\\-158.0111\\1\\-71.65613\\-158.6459\\1\\-70.58872\\-159.8228\\1\\-70.06375\\-160.599\\1\\-69.32647\\-162.5521\\1\\-68.06594\\-164.5053\\1\\-67.38155\\-166.4584\\1\\-66.30545\\-168.4115\\1\\-66.28574\\-172.3178\\1\\-65.85167\\-174.2709\\1\\-64.87796\\-176.224\\1\\-64.29466\\-178.1771\\1\\-63.88513\\-180.1303\\1\\-62.44014\\-184.0365\\1\\-61.90769\\-185.9896\\1\\-60.67449\\-189.8959\\1\\-60.36737\\-191.849\\1\\-59.83737\\-193.8021\\1\\-58.39103\\-197.7084\\1\\-57.87038\\-199.6615\\1\\-56.01658\\-205.5209\\1\\-55.74346\\-207.474\\1\\-56.91685\\-208.6474\\1\\-58.86998\\-208.7087\\1\\-60.8231\\-208.5935\\1\\-62.77623\\-208.6234\\1\\-64.72935\\-209.8755\\1\\-66.68247\\-210.6797\\1\\-68.6356\\-210.7525\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "372" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-130.7763\\1\\-63.3634\\-129.349\\1\\-63.286\\-127.3959\\1\\-61.93801\\-125.4428\\1\\-58.86998\\-122.4178\\1\\-56.91685\\-121.0974\\1\\-54.96373\\-121.1496\\1\\-54.41927\\-121.5365\\1\\-52.82091\\-123.4896\\1\\-52.40635\\-125.4428\\1\\-53.0106\\-127.4072\\1\\-54.96373\\-128.196\\1\\-56.71053\\-127.3959\\1\\-56.91685\\-127.1773\\1\\-58.86998\\-127.5194\\1\\-59.91037\\-129.349\\1\\-60.8231\\-131.2361\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "373" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-133.9364\\1\\-46.5775\\-133.2553\\1\\-47.15123\\-132.515\\1\\-47.77267\\-131.3021\\1\\-47.76482\\-129.349\\1\\-47.15123\\-128.6342\\1\\-45.1981\\-127.0559\\1\\-44.39286\\-127.3959\\1\\-43.24498\\-128.131\\1\\-42.57996\\-129.349\\1\\-42.64524\\-131.3021\\1\\-43.24498\\-132.8786\\1\\-43.62165\\-133.2553\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "374" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-43.24498\\-163.5058\\1\\-44.61655\\-162.5521\\1\\-45.1981\\-161.7173\\1\\-46.75211\\-158.6459\\1\\-47.06245\\-156.6928\\1\\-46.69205\\-154.7396\\1\\-47.28086\\-152.7865\\1\\-48.68266\\-150.8334\\1\\-49.10435\\-150.66\\1\\-51.05748\\-152.2913\\1\\-51.87319\\-152.7865\\1\\-53.0106\\-153.9801\\1\\-53.59654\\-152.7865\\1\\-51.81011\\-148.8803\\1\\-49.10435\\-144.4715\\1\\-47.15123\\-143.7874\\1\\-46.07939\\-143.0209\\1\\-45.1981\\-141.9786\\1\\-43.34189\\-139.1146\\1\\-41.29185\\-137.1081\\1\\-39.33873\\-136.0368\\1\\-37.3856\\-135.7167\\1\\-35.43248\\-134.6774\\1\\-33.47935\\-134.2066\\1\\-23.71373\\-134.2066\\1\\-21.7606\\-134.6343\\1\\-19.80748\\-135.8332\\1\\-18.4116\\-137.1615\\1\\-17.04806\\-139.1146\\1\\-16.18305\\-143.0209\\1\\-16.06281\\-144.974\\1\\-14.70477\\-146.9271\\1\\-13.9481\\-147.5515\\1\\-11.99498\\-147.8012\\1\\-10.04185\\-148.407\\1\\-9.517032\\-148.8803\\1\\-8.126287\\-150.8334\\1\\-7.980219\\-154.7396\\1\\-7.635742\\-156.6928\\1\\-7.394166\\-158.6459\\1\\-7.600445\\-160.599\\1\\-8.088726\\-162.4436\\1\\-10.04185\\-161.116\\1\\-10.17729\\-158.6459\\1\\-10.44107\\-156.6928\\1\\-11.63407\\-154.7396\\1\\-13.03523\\-152.7865\\1\\-13.9481\\-151.9353\\1\\-15.00673\\-152.7865\\1\\-16.38566\\-154.7396\\1\\-17.85435\\-156.3203\\1\\-20.41783\\-158.6459\\1\\-21.7606\\-159.4048\\1\\-23.71373\\-159.8893\\1\\-25.66685\\-161.2379\\1\\-29.5731\\-161.8538\\1\\-31.52623\\-163.0345\\1\\-33.47935\\-163.2559\\1\\-37.3856\\-163.2679\\1\\-39.33873\\-163.8813\\1\\-41.29185\\-163.9193\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "375" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "21.20815\\-204.5516\\1\\19.25502\\-203.405\\1\\17.3019\\-202.8367\\1\\15.34877\\-202.6388\\1\\13.39565\\-202.3164\\1\\11.44252\\-200.8517\\1\\9.489399\\-200.3363\\1\\5.583149\\-200.1498\\1\\4.975681\\-199.6615\\1\\5.583149\\-198.9197\\1\\7.536274\\-198.4197\\1\\9.489399\\-198.4103\\1\\11.44252\\-198.1967\\1\\15.34877\\-197.5598\\1\\17.3019\\-197.1528\\1\\19.25502\\-196.8705\\1\\21.20815\\-196.7194\\1\\23.16127\\-196.7318\\1\\27.06752\\-197.0399\\1\\30.97377\\-197.9702\\1\\32.9269\\-198.0407\\1\\34.88002\\-198.2267\\1\\36.83315\\-198.7853\\1\\38.78627\\-199.1361\\1\\39.8643\\-199.6615\\1\\40.7394\\-200.56\\1\\41.35259\\-201.6146\\1\\40.7394\\-202.0883\\1\\38.78627\\-202.3378\\1\\34.88002\\-202.3037\\1\\32.9269\\-202.0287\\1\\30.97377\\-202.1117\\1\\29.02065\\-202.4068\\1\\25.1144\\-203.3392\\1\\23.16127\\-204.5588\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "376" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "36.83315\\-132.5473\\1\\34.94183\\-131.3021\\1\\33.29051\\-129.349\\1\\33.66871\\-127.3959\\1\\34.88002\\-126.623\\1\\36.83315\\-126.2553\\1\\38.78627\\-126.2725\\1\\40.70184\\-127.3959\\1\\40.45551\\-129.349\\1\\39.62865\\-131.3021\\1\\38.78627\\-132.2701\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "377" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-135.5014\\1\\46.59877\\-134.4866\\1\\44.85061\\-133.2553\\1\\43.8305\\-131.3021\\1\\44.45865\\-127.3959\\1\\45.71391\\-125.4428\\1\\46.11916\\-123.4896\\1\\47.49631\\-121.5365\\1\\48.5519\\-120.3733\\1\\50.50502\\-118.6949\\1\\52.45815\\-118.8305\\1\\55.18501\\-121.5365\\1\\56.66836\\-123.4896\\1\\57.12273\\-125.4428\\1\\57.82282\\-127.3959\\1\\57.94192\\-129.349\\1\\58.34024\\-131.3021\\1\\58.54132\\-133.2553\\1\\57.42815\\-135.2084\\1\\56.3644\\-136.3467\\1\\54.41127\\-136.5779\\1\\52.45815\\-135.8986\\1\\50.50502\\-135.5549\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "65" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "378" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "70.03628\\-210.5771\\1\\68.732\\-209.4271\\1\\67.98841\\-205.5209\\1\\68.48238\\-203.5678\\1\\68.09084\\-201.6146\\1\\66.13003\\-199.4241\\1\\62.22377\\-198.2708\\1\\61.47066\\-197.7084\\1\\60.47009\\-195.7553\\1\\59.85774\\-193.8021\\1\\60.99099\\-189.8959\\1\\61.00307\\-185.9896\\1\\61.22481\\-184.0365\\1\\61.57458\\-182.0834\\1\\61.81738\\-178.1771\\1\\61.82705\\-170.3646\\1\\63.21777\\-168.4115\\1\\63.70605\\-166.4584\\1\\63.78017\\-164.5053\\1\\63.64677\\-162.5521\\1\\64.72131\\-160.599\\1\\65.55718\\-158.6459\\1\\66.13003\\-158.005\\1\\68.08315\\-157.1513\\1\\71.9894\\-157.1896\\1\\73.94253\\-157.6089\\1\\77.84878\\-159.6922\\1\\80.63329\\-162.5521\\1\\84.55672\\-166.4584\\1\\87.6144\\-169.5761\\1\\89.36989\\-170.3646\\1\\91.52065\\-171.8229\\1\\91.97842\\-172.3178\\1\\92.83875\\-174.2709\\1\\94.24107\\-176.224\\1\\96.23444\\-178.1771\\1\\98.09297\\-180.1303\\1\\97.96243\\-182.0834\\1\\97.38003\\-182.7236\\1\\95.4269\\-182.6993\\1\\93.8328\\-182.0834\\1\\91.52065\\-181.0098\\1\\89.56753\\-180.7334\\1\\87.6144\\-180.7878\\1\\85.66128\\-180.9685\\1\\83.70815\\-181.3998\\1\\81.75503\\-182.9719\\1\\79.8019\\-183.3302\\1\\79.16399\\-184.0365\\1\\78.38732\\-185.9896\\1\\78.27525\\-187.9428\\1\\78.31998\\-189.8959\\1\\77.84878\\-191.0005\\1\\77.28619\\-191.849\\1\\76.58778\\-193.8021\\1\\77.84878\\-194.9937\\1\\79.12582\\-195.7553\\1\\79.8019\\-196.4112\\1\\80.63761\\-197.7084\\1\\80.55376\\-201.6146\\1\\80.40353\\-203.5678\\1\\79.8019\\-204.0082\\1\\77.84878\\-205.9447\\1\\75.89565\\-207.5498\\1\\71.9894\\-210.1062\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "379" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "93.47378\\-199.4174\\1\\91.5904\\-197.7084\\1\\90.12726\\-195.7553\\1\\89.56753\\-195.3663\\1\\87.6144\\-194.8044\\1\\86.62085\\-193.8021\\1\\87.6144\\-192.2787\\1\\89.56753\\-192.1393\\1\\91.52065\\-193.0149\\1\\93.47378\\-194.1362\\1\\94.52847\\-195.7553\\1\\94.68011\\-197.7084\\1" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "380" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-80.454\\-207.474\\3\\-81.68516\\-205.5209\\3\\-81.23916\\-203.5678\\3\\-81.57505\\-201.6146\\3\\-81.68603\\-199.6615\\3\\-80.13606\\-197.7084\\3\\-79.20023\\-195.7553\\3\\-79.20824\\-191.849\\3\\-79.99364\\-189.8959\\3\\-81.23454\\-187.9428\\3\\-81.82733\\-185.9896\\3\\-82.30747\\-185.5923\\3\\-84.2606\\-184.9198\\3\\-86.21372\\-184.8189\\3\\-88.16685\\-184.9135\\3\\-90.11997\\-184.8058\\3\\-92.0731\\-184.866\\3\\-94.02622\\-185.7243\\3\\-95.97935\\-186.9007\\3\\-97.93247\\-187.5544\\3\\-98.34428\\-187.9428\\3\\-98.98875\\-189.8959\\3\\-99.06674\\-191.849\\3\\-99.8856\\-192.8403\\3\\-100.8695\\-191.849\\3\\-100.814\\-189.8959\\3\\-100.6003\\-187.9428\\3\\-100.1693\\-185.9896\\3\\-98.79784\\-184.0365\\3\\-98.47869\\-182.0834\\3\\-97.15599\\-180.1303\\3\\-96.61464\\-178.1771\\3\\-94.94684\\-176.224\\3\\-94.02622\\-174.3828\\3\\-92.84267\\-172.3178\\3\\-88.16685\\-167.6064\\3\\-86.21372\\-165.5415\\3\\-84.2606\\-163.3053\\3\\-82.30747\\-161.5154\\3\\-80.35435\\-159.6266\\3\\-78.40122\\-159.0806\\3\\-76.4481\\-157.8248\\3\\-74.49497\\-157.3345\\3\\-72.54185\\-157.2465\\3\\-70.58872\\-158.1946\\3\\-70.20686\\-158.6459\\3\\-69.36247\\-160.599\\3\\-68.23887\\-162.5521\\3\\-67.47956\\-164.5053\\3\\-66.53387\\-166.4584\\3\\-66.28574\\-168.4115\\3\\-66.24779\\-172.3178\\3\\-65.95745\\-174.2709\\3\\-65.28976\\-176.224\\3\\-64.30398\\-178.1771\\3\\-64.18806\\-180.1303\\3\\-63.8094\\-182.0834\\3\\-63.18773\\-184.0365\\3\\-62.30538\\-185.9896\\3\\-61.84509\\-187.9428\\3\\-61.63145\\-189.8959\\3\\-61.24163\\-191.849\\3\\-60.46398\\-193.8021\\3\\-59.37825\\-197.7084\\3\\-58.58432\\-199.6615\\3\\-58.08553\\-201.6146\\3\\-57.89341\\-203.5678\\3\\-58.7709\\-205.5209\\3\\-58.96626\\-205.5209\\3\\-60.8231\\-204.4036\\3\\-62.83601\\-203.5678\\3\\-64.72935\\-203.0315\\3\\-65.74884\\-203.5678\\3\\-66.68247\\-204.6432\\3\\-67.16734\\-205.5209\\3\\-67.34594\\-207.474\\3\\-68.6356\\-208.6233\\3\\-70.58872\\-208.5698\\3\\-72.54185\\-208.0851\\3\\-74.49497\\-207.287\\3\\-76.4481\\-208.1233\\3\\-78.40122\\-207.7215\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "381" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.1981\\-135.9117\\3\\-46.7327\\-135.2084\\3\\-49.10435\\-133.7309\\3\\-51.05748\\-132.0067\\3\\-53.0106\\-131.4106\\3\\-54.96373\\-130.5955\\3\\-56.91685\\-130.1079\\3\\-58.86998\\-131.2673\\3\\-60.8231\\-133.2276\\3\\-62.77623\\-133.9861\\3\\-64.03022\\-133.2553\\3\\-64.72935\\-132.6637\\3\\-65.71269\\-131.3021\\3\\-65.57247\\-129.349\\3\\-65.21456\\-127.3959\\3\\-64.72935\\-125.8529\\3\\-63.53646\\-123.4896\\3\\-62.77623\\-122.6064\\3\\-59.714\\-119.5834\\3\\-58.86998\\-118.9377\\3\\-56.91685\\-118.8931\\3\\-54.96373\\-119.1842\\3\\-54.17027\\-119.5834\\3\\-53.0106\\-120.4424\\3\\-52.33921\\-121.5365\\3\\-51.64722\\-123.4896\\3\\-50.34789\\-125.4428\\3\\-49.10435\\-126.9329\\3\\-47.15123\\-126.1425\\3\\-45.1981\\-124.7469\\3\\-43.24498\\-124.2536\\3\\-39.33873\\-124.4208\\3\\-37.3856\\-124.4208\\3\\-36.48262\\-125.4428\\3\\-37.3856\\-126.6983\\3\\-38.08315\\-127.3959\\3\\-39.33873\\-128.2748\\3\\-40.39881\\-129.349\\3\\-41.21108\\-131.3021\\3\\-42.20807\\-133.2553\\3\\-43.24498\\-134.546\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "70" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "382" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.088726\\-169.0701\\3\\-8.438359\\-168.4115\\3\\-9.104879\\-166.4584\\3\\-9.515021\\-164.5053\\3\\-10.02829\\-162.5521\\3\\-10.17729\\-160.599\\3\\-10.64058\\-158.6459\\3\\-10.95776\\-156.6928\\3\\-11.99498\\-155.6555\\3\\-13.9481\\-155.6021\\3\\-14.96452\\-156.6928\\3\\-15.90123\\-158.2755\\3\\-16.31439\\-158.6459\\3\\-17.85435\\-159.463\\3\\-19.80748\\-160.2597\\3\\-21.7606\\-161.405\\3\\-23.71373\\-161.5815\\3\\-25.66685\\-162.2922\\3\\-27.61998\\-163.3176\\3\\-29.5731\\-163.4141\\3\\-31.52623\\-164.1865\\3\\-33.47935\\-165.2601\\3\\-37.3856\\-165.3547\\3\\-39.33873\\-166.1469\\3\\-41.29185\\-167.1691\\3\\-43.24498\\-167.1622\\3\\-44.69298\\-166.4584\\3\\-46.67312\\-164.5053\\3\\-47.15123\\-163.7767\\3\\-48.4973\\-160.599\\3\\-49.52753\\-158.6459\\3\\-48.40766\\-156.6928\\3\\-47.96503\\-154.7396\\3\\-49.10435\\-153.5173\\3\\-51.05748\\-153.5601\\3\\-52.79269\\-154.7396\\3\\-53.0106\\-155.1453\\3\\-53.38728\\-154.7396\\3\\-53.49888\\-152.7865\\3\\-51.93584\\-150.8334\\3\\-50.53454\\-148.8803\\3\\-49.10435\\-146.7407\\3\\-47.15123\\-145.9193\\3\\-45.49436\\-144.974\\3\\-45.1981\\-144.6525\\3\\-43.51263\\-141.0678\\3\\-41.29185\\-138.7475\\3\\-39.33873\\-137.8493\\3\\-37.58627\\-137.1615\\3\\-35.43248\\-136.118\\3\\-33.47935\\-135.9379\\3\\-27.61998\\-135.9307\\3\\-23.71373\\-135.8757\\3\\-21.7606\\-135.9886\\3\\-19.80748\\-136.807\\3\\-19.44805\\-137.1615\\3\\-18.4647\\-139.1146\\3\\-17.10276\\-141.0678\\3\\-16.18305\\-144.974\\3\\-14.95534\\-146.9271\\3\\-13.9481\\-147.9344\\3\\-11.99498\\-149.2253\\3\\-10.04185\\-149.6923\\3\\-8.669558\\-150.8334\\3\\-7.763205\\-154.7396\\3\\-6.401283\\-158.6459\\3\\-6.920053\\-160.599\\3\\-7.32562\\-162.5521\\3\\-7.590744\\-166.4584\\3\\-7.869189\\-168.4115\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "383" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "21.20815\\-211.9906\\3\\19.96923\\-211.3803\\3\\19.25502\\-210.8601\\3\\17.66664\\-209.4271\\3\\15.34877\\-207.1286\\3\\14.45799\\-205.5209\\3\\13.50416\\-203.5678\\3\\11.44252\\-201.6067\\3\\9.489399\\-200.4787\\3\\7.536274\\-200.1498\\3\\5.583149\\-200.0458\\3\\3.630024\\-200.0679\\3\\1.676899\\-200.4874\\3\\-0.276226\\-200.3291\\3\\-0.9219313\\-199.6615\\3\\-0.276226\\-198.2548\\3\\0.3702308\\-197.7084\\3\\1.676899\\-197.1461\\3\\5.583149\\-196.9996\\3\\7.536274\\-197.2057\\3\\9.489399\\-197.573\\3\\11.44252\\-197.573\\3\\15.34877\\-196.8154\\3\\17.3019\\-195.9629\\3\\19.25502\\-194.1657\\3\\19.83434\\-193.8021\\3\\21.20815\\-193.2724\\3\\23.16127\\-193.2724\\3\\25.1144\\-194.4092\\3\\27.06752\\-195.127\\3\\29.02065\\-196.307\\3\\30.97377\\-196.8821\\3\\32.9269\\-197.1941\\3\\34.88002\\-197.6708\\3\\36.83315\\-197.9322\\3\\40.7394\\-198.1738\\3\\42.69252\\-198.7731\\3\\44.06948\\-199.6615\\3\\44.64565\\-200.2494\\3\\46.59877\\-200.8736\\3\\47.83384\\-201.6146\\3\\46.59877\\-202.6388\\3\\44.64565\\-202.6599\\3\\42.69252\\-202.4698\\3\\40.7394\\-202.5345\\3\\38.78627\\-202.4862\\3\\36.83315\\-202.0855\\3\\34.88002\\-201.9816\\3\\30.97377\\-202.5796\\3\\29.7368\\-203.5678\\3\\29.68845\\-205.5209\\3\\28.28823\\-207.474\\3\\27.786\\-209.4271\\3\\27.06752\\-210.4749\\3\\26.0569\\-211.3803\\3\\25.1144\\-211.9807\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "384" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-137.9012\\3\\52.45815\\-136.6403\\3\\50.50502\\-136.1081\\3\\48.5519\\-136.1214\\3\\46.59877\\-135.9182\\3\\44.64565\\-134.6992\\3\\42.69252\\-133.6992\\3\\40.7394\\-133.467\\3\\36.83315\\-133.894\\3\\34.88002\\-133.9241\\3\\33.32578\\-133.2553\\3\\32.9269\\-132.8326\\3\\32.2523\\-131.3021\\3\\30.97377\\-129.215\\3\\30.35528\\-127.3959\\3\\30.57166\\-125.4428\\3\\30.97377\\-125.2003\\3\\32.9269\\-126.1736\\3\\36.83315\\-125.8681\\3\\38.78627\\-125.8957\\3\\40.7394\\-126.7128\\3\\42.69252\\-128.5666\\3\\44.64565\\-126.5905\\3\\45.50788\\-125.4428\\3\\45.96751\\-121.5365\\3\\47.52493\\-119.5834\\3\\49.82143\\-117.6303\\3\\50.50502\\-116.7758\\3\\52.45815\\-116.5173\\3\\53.44105\\-117.6303\\3\\56.3644\\-120.6325\\3\\57.12891\\-121.5365\\3\\57.93097\\-123.4896\\3\\58.07512\\-125.4428\\3\\58.7429\\-127.3959\\3\\59.05614\\-129.349\\3\\59.4491\\-133.2553\\3\\58.95942\\-135.2084\\3\\58.31752\\-136.1605\\3\\57.37172\\-137.1615\\3\\56.3644\\-137.8244\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "68" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "385" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "70.03628\\-207.9998\\3\\69.671\\-207.474\\3\\68.79072\\-205.5209\\3\\69.11625\\-203.5678\\3\\69.15737\\-201.6146\\3\\68.08315\\-200.4744\\3\\66.13003\\-198.725\\3\\64.1769\\-197.5173\\3\\62.22377\\-196.4402\\3\\61.60732\\-195.7553\\3\\61.08524\\-193.8021\\3\\61.28608\\-191.849\\3\\61.76022\\-189.8959\\3\\61.61135\\-185.9896\\3\\61.81738\\-182.0834\\3\\61.81738\\-180.1303\\3\\62.01207\\-176.224\\3\\61.81738\\-172.3178\\3\\61.81738\\-170.3646\\3\\62.12903\\-168.4115\\3\\63.07074\\-166.4584\\3\\63.30359\\-164.5053\\3\\63.42678\\-162.5521\\3\\65.11239\\-160.599\\3\\65.54516\\-158.6459\\3\\66.13003\\-157.7662\\3\\67.16909\\-156.6928\\3\\68.08315\\-156.0509\\3\\71.9894\\-157.0496\\3\\73.94253\\-157.261\\3\\75.89565\\-157.9569\\3\\78.66029\\-160.599\\3\\84.55672\\-166.4584\\3\\87.6144\\-169.5761\\3\\89.56753\\-170.9235\\3\\90.97811\\-172.3178\\3\\92.42168\\-174.2709\\3\\94.00275\\-176.224\\3\\97.38003\\-179.4378\\3\\98.02192\\-180.1303\\3\\98.43613\\-182.0834\\3\\98.48789\\-185.9896\\3\\97.38003\\-187.4226\\3\\96.43156\\-185.9896\\3\\95.4269\\-185.0062\\3\\93.47378\\-184.9405\\3\\91.52065\\-184.5464\\3\\89.56753\\-182.9682\\3\\88.02209\\-184.0365\\3\\85.66128\\-186.0458\\3\\83.70815\\-186.9662\\3\\81.75503\\-187.4598\\3\\81.27211\\-187.9428\\3\\82.41909\\-189.8959\\3\\84.31746\\-191.849\\3\\84.65661\\-193.8021\\3\\84.59296\\-201.6146\\3\\84.55218\\-203.5678\\3\\86.53008\\-205.5209\\3\\86.2871\\-207.474\\3\\85.66128\\-208.0061\\3\\83.70815\\-207.5119\\3\\81.75503\\-206.2238\\3\\79.8019\\-204.6647\\3\\77.84878\\-204.7063\\3\\76.2881\\-205.5209\\3\\73.94253\\-207.9387\\3\\71.9894\\-209.1943\\3" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "386" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-86.21372\\-212.4242\\5\\-86.82738\\-211.3803\\5\\-85.14561\\-209.4271\\5\\-84.97034\\-207.474\\5\\-85.32027\\-205.5209\\5\\-86.80949\\-203.5678\\5\\-86.29362\\-201.6146\\5\\-85.18223\\-199.6615\\5\\-85.21789\\-195.7553\\5\\-84.92736\\-193.8021\\5\\-84.96292\\-191.849\\5\\-85.70127\\-189.8959\\5\\-86.21372\\-189.3834\\5\\-88.16685\\-189.0451\\5\\-90.11997\\-188.4155\\5\\-92.0731\\-188.708\\5\\-95.97935\\-192.2821\\5\\-97.02608\\-193.8021\\5\\-95.7373\\-195.7553\\5\\-95.13648\\-197.7084\\5\\-95.97935\\-198.6046\\5\\-97.93247\\-199.1075\\5\\-99.03481\\-197.7084\\5\\-98.99458\\-195.7553\\5\\-100.4749\\-193.8021\\5\\-101.1894\\-191.849\\5\\-100.6543\\-187.9428\\5\\-99.56008\\-185.9896\\5\\-98.82766\\-184.0365\\5\\-97.27627\\-182.0834\\5\\-96.70669\\-180.1303\\5\\-95.97935\\-178.2173\\5\\-94.85529\\-176.224\\5\\-93.38389\\-174.2709\\5\\-92.60422\\-172.3178\\5\\-90.92139\\-170.3646\\5\\-87.07132\\-166.4584\\5\\-85.59612\\-164.5053\\5\\-84.88406\\-162.5521\\5\\-84.2606\\-161.9251\\5\\-82.30747\\-160.5043\\5\\-80.35435\\-159.5341\\5\\-78.40122\\-158.3378\\5\\-76.4481\\-157.5357\\5\\-74.49497\\-156.4626\\5\\-72.54185\\-155.8402\\5\\-70.58872\\-157.0764\\5\\-69.18919\\-158.6459\\5\\-67.93145\\-160.599\\5\\-67.47303\\-162.5521\\5\\-66.52089\\-164.5053\\5\\-66.28574\\-166.4584\\5\\-66.20287\\-170.3646\\5\\-66.02291\\-172.3178\\5\\-65.49065\\-174.2709\\5\\-64.51765\\-176.224\\5\\-64.30398\\-178.1771\\5\\-64.30398\\-180.1303\\5\\-64.19922\\-182.0834\\5\\-63.82322\\-184.0365\\5\\-63.21628\\-185.9896\\5\\-62.38929\\-187.9428\\5\\-62.33344\\-189.8959\\5\\-61.88025\\-191.849\\5\\-61.69067\\-193.8021\\5\\-61.14\\-195.7553\\5\\-59.92713\\-197.7084\\5\\-59.78369\\-199.6615\\5\\-60.56711\\-201.6146\\5\\-60.8231\\-201.8565\\5\\-62.77623\\-202.5187\\5\\-64.72935\\-202.2039\\5\\-66.68247\\-202.4919\\5\\-68.15868\\-203.5678\\5\\-68.6356\\-204.1271\\5\\-70.58872\\-205.6651\\5\\-72.54185\\-206.6008\\5\\-74.49497\\-206.561\\5\\-78.40122\\-207.1379\\5\\-80.35435\\-208.4192\\5\\-82.30747\\-210.1181\\5\\-84.2606\\-211.4333\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "387" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-62.77623\\-137.5134\\5\\-64.72935\\-136.9432\\5\\-65.57198\\-135.2084\\5\\-67.34611\\-131.3021\\5\\-67.25261\\-129.349\\5\\-66.68247\\-127.6484\\5\\-65.77135\\-125.4428\\5\\-65.31528\\-123.4896\\5\\-63.84916\\-121.5365\\5\\-62.00195\\-119.5834\\5\\-60.8231\\-118.5709\\5\\-58.86998\\-117.7264\\5\\-56.91685\\-118.348\\5\\-53.0106\\-118.5363\\5\\-51.31261\\-119.5834\\5\\-50.77948\\-121.5365\\5\\-49.10435\\-123.0076\\5\\-47.15123\\-123.3619\\5\\-45.1981\\-123.4669\\5\\-43.24498\\-122.9123\\5\\-41.29185\\-123.2191\\5\\-39.33873\\-123.8465\\5\\-37.3856\\-123.915\\5\\-35.69156\\-125.4428\\5\\-36.19805\\-127.3959\\5\\-37.3856\\-128.3825\\5\\-38.86967\\-129.349\\5\\-39.33873\\-129.7838\\5\\-40.33398\\-131.3021\\5\\-40.86972\\-133.2553\\5\\-42.40419\\-135.2084\\5\\-42.91946\\-137.1615\\5\\-43.24498\\-137.4754\\5\\-45.1981\\-137.9018\\5\\-47.15123\\-137.7825\\5\\-48.20917\\-137.1615\\5\\-49.10435\\-136.0991\\5\\-49.60162\\-135.2084\\5\\-50.39719\\-133.2553\\5\\-51.05748\\-132.5509\\5\\-53.0106\\-132.0308\\5\\-54.96373\\-132.1696\\5\\-56.91685\\-132.0866\\5\\-58.74477\\-133.2553\\5\\-60.8231\\-135.3533\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "78" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "388" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.182476\\-183.1748\\5\\-5.68691\\-182.0834\\5\\-6.135601\\-181.9268\\5\\-8.088726\\-180.7864\\5\\-8.76602\\-180.1303\\5\\-7.852215\\-178.1771\\5\\-7.293704\\-176.224\\5\\-7.413866\\-174.2709\\5\\-7.774056\\-172.3178\\5\\-7.726453\\-170.3646\\5\\-8.088726\\-170.0294\\5\\-8.745687\\-168.4115\\5\\-9.257484\\-166.4584\\5\\-9.318666\\-164.5053\\5\\-9.732377\\-162.5521\\5\\-10.72544\\-160.599\\5\\-11.99498\\-159.4449\\5\\-13.1086\\-160.599\\5\\-13.9481\\-162.2682\\5\\-14.22872\\-162.5521\\5\\-15.90123\\-163.4131\\5\\-19.80748\\-163.4299\\5\\-21.7606\\-164.3228\\5\\-23.71373\\-165.3818\\5\\-29.5731\\-165.424\\5\\-31.56285\\-166.4584\\5\\-33.47935\\-167.2528\\5\\-35.43248\\-167.3149\\5\\-37.54429\\-168.4115\\5\\-39.33873\\-169.1592\\5\\-45.1981\\-169.1128\\5\\-46.36479\\-168.4115\\5\\-48.38356\\-166.4584\\5\\-49.60162\\-164.5053\\5\\-49.66661\\-162.5521\\5\\-50.25634\\-160.599\\5\\-51.05748\\-159.1125\\5\\-53.0106\\-158.2455\\5\\-54.50362\\-156.6928\\5\\-53.01823\\-152.7865\\5\\-51.53916\\-150.8334\\5\\-51.05748\\-150.3613\\5\\-49.10435\\-149.2918\\5\\-47.79576\\-148.8803\\5\\-45.1981\\-147.7222\\5\\-44.39275\\-146.9271\\5\\-42.70057\\-144.974\\5\\-42.53627\\-143.0209\\5\\-42.08984\\-141.0678\\5\\-41.29185\\-140.0843\\5\\-39.33873\\-139.1373\\5\\-37.3856\\-139.8508\\5\\-35.52126\\-139.1146\\5\\-33.47935\\-137.968\\5\\-27.61998\\-137.8441\\5\\-25.66685\\-137.7538\\5\\-23.71373\\-137.2423\\5\\-21.7606\\-137.1221\\5\\-19.54753\\-139.1146\\5\\-18.67753\\-141.0678\\5\\-17.48897\\-143.0209\\5\\-16.6101\\-144.974\\5\\-15.00851\\-146.9271\\5\\-13.04792\\-148.8803\\5\\-11.99498\\-150.0366\\5\\-10.04185\\-151.6351\\5\\-9.00561\\-152.7865\\5\\-8.088726\\-154.7281\\5\\-6.812478\\-156.6928\\5\\-6.127972\\-158.6459\\5\\-5.799511\\-160.599\\5\\-5.59622\\-162.5521\\5\\-5.511343\\-170.3646\\5\\-4.630898\\-172.3178\\5\\-4.182476\\-172.9547\\5\\-3.654451\\-174.2709\\5\\-3.630021\\-180.1303\\5\\-3.823353\\-182.0834\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "389" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "21.20815\\-215.7338\\5\\19.25502\\-214.6054\\5\\17.3019\\-213.8975\\5\\16.25799\\-213.3334\\5\\15.34877\\-212.6515\\5\\12.00451\\-209.4271\\5\\10.11973\\-207.474\\5\\9.489399\\-206.6583\\5\\8.906991\\-205.5209\\5\\8.836396\\-201.6146\\5\\7.536274\\-200.4727\\5\\3.630024\\-199.9433\\5\\1.676899\\-200.4398\\5\\-0.276226\\-200.6015\\5\\-2.095468\\-199.6615\\5\\-3.212173\\-197.7084\\5\\-3.399192\\-195.7553\\5\\-2.229351\\-194.2579\\5\\-0.8597816\\-195.7553\\5\\-0.276226\\-196.132\\5\\1.676899\\-196.0718\\5\\5.583149\\-196.0718\\5\\7.536274\\-196.5458\\5\\9.489399\\-196.8459\\5\\11.44252\\-196.8101\\5\\13.39565\\-196.2106\\5\\13.97653\\-195.7553\\5\\15.95808\\-193.8021\\5\\17.3019\\-192.7469\\5\\19.25502\\-191.543\\5\\21.20815\\-191.2869\\5\\23.16127\\-191.2869\\5\\25.1144\\-191.5882\\5\\27.06752\\-192.753\\5\\29.02065\\-194.3895\\5\\30.97377\\-195.1318\\5\\32.9269\\-196.2532\\5\\34.88002\\-197.164\\5\\36.83315\\-197.573\\5\\40.7394\\-197.573\\5\\44.64565\\-197.9525\\5\\46.59877\\-198.6339\\5\\48.5519\\-198.8953\\5\\50.50502\\-198.9379\\5\\51.65914\\-199.6615\\5\\52.8858\\-201.6146\\5\\52.45815\\-202.1103\\5\\50.50502\\-202.4947\\5\\48.5519\\-202.4368\\5\\46.59877\\-202.6383\\5\\44.64565\\-202.6464\\5\\42.69252\\-202.5164\\5\\40.7394\\-202.0493\\5\\38.78627\\-202.3774\\5\\34.88002\\-202.5602\\5\\33.73973\\-203.5678\\5\\33.55513\\-207.474\\5\\32.9269\\-208.5346\\5\\32.21743\\-209.4271\\5\\27.06752\\-214.5741\\5\\25.1144\\-215.7338\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "390" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-137.3371\\5\\44.64565\\-136.0736\\5\\42.69252\\-134.476\\5\\40.7394\\-133.9877\\5\\38.78627\\-134.1585\\5\\36.58241\\-135.2084\\5\\34.88002\\-135.8857\\5\\32.9269\\-135.0776\\5\\30.97377\\-133.2799\\5\\29.02065\\-131.1987\\5\\27.07958\\-129.349\\5\\27.87319\\-127.3959\\5\\29.02065\\-126.005\\5\\29.86404\\-125.4428\\5\\30.97377\\-124.9962\\5\\32.9269\\-125.9224\\5\\34.88002\\-125.9729\\5\\38.78627\\-125.931\\5\\40.7394\\-126.4417\\5\\42.4728\\-127.3959\\5\\42.94606\\-127.3959\\5\\44.51021\\-125.4428\\5\\44.7154\\-121.5365\\5\\45.94946\\-119.5834\\5\\46.59877\\-118.9163\\5\\48.5916\\-117.6303\\5\\49.7673\\-115.6771\\5\\49.85202\\-113.724\\5\\50.50502\\-113.0109\\5\\52.45815\\-112.9555\\5\\53.36642\\-113.724\\5\\54.85683\\-115.6771\\5\\55.42335\\-117.6303\\5\\57.21334\\-119.5834\\5\\58.52923\\-121.5365\\5\\59.06227\\-123.4896\\5\\59.08413\\-125.4428\\5\\59.44685\\-127.3959\\5\\60.87366\\-129.349\\5\\60.97866\\-133.2553\\5\\60.90957\\-135.2084\\5\\60.27065\\-136.81\\5\\60.00431\\-137.1615\\5\\56.3644\\-139.0595\\5\\54.41127\\-138.9889\\5\\52.45815\\-137.938\\5\\50.50502\\-137.6235\\5\\48.5519\\-137.7968\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "391" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "77.84878\\-212.1099\\5\\75.89565\\-211.1117\\5\\73.94253\\-210.436\\5\\71.9894\\-209.6204\\5\\71.9894\\-208.8814\\5\\73.94253\\-208.1145\\5\\75.89565\\-208.1313\\5\\77.84878\\-208.6281\\5\\79.8019\\-210.3924\\5\\81.12669\\-211.3803\\5\\79.8019\\-212.3458\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "392" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-209.604\\5\\83.70815\\-208.2945\\5\\82.92401\\-207.474\\5\\79.8019\\-204.6005\\5\\77.84878\\-203.0912\\5\\75.89565\\-203.6341\\5\\74.93359\\-205.5209\\5\\73.94253\\-207.0261\\5\\71.9894\\-207.0429\\5\\70.97166\\-205.5209\\5\\70.71281\\-203.5678\\5\\70.62689\\-201.6146\\5\\70.03628\\-200.8441\\5\\68.08315\\-199.2598\\5\\66.13003\\-198.2752\\5\\63.45903\\-195.7553\\5\\62.98609\\-193.8021\\5\\63.08263\\-189.8959\\5\\62.73204\\-187.9428\\5\\61.99998\\-185.9896\\5\\61.99998\\-184.0365\\5\\61.81738\\-180.1303\\5\\62.6008\\-178.1771\\5\\63.05893\\-176.224\\5\\62.66113\\-174.2709\\5\\61.89825\\-172.3178\\5\\61.81738\\-168.4115\\5\\62.26222\\-164.5053\\5\\63.391\\-162.5521\\5\\65.28603\\-160.599\\5\\65.62471\\-158.6459\\5\\65.52297\\-156.6928\\5\\66.13003\\-155.2343\\5\\66.61831\\-154.7396\\5\\68.08315\\-154.0472\\5\\70.03628\\-155.3763\\5\\73.94253\\-156.6851\\5\\75.89565\\-157.8414\\5\\82.60673\\-164.5053\\5\\85.66128\\-167.6076\\5\\90.45776\\-172.3178\\5\\92.31172\\-174.2709\\5\\93.35171\\-176.224\\5\\94.67932\\-178.1771\\5\\95.4269\\-178.7793\\5\\96.72032\\-180.1303\\5\\97.82166\\-182.0834\\5\\98.49413\\-184.0365\\5\\98.82784\\-185.9896\\5\\98.4703\\-189.8959\\5\\98.42684\\-191.849\\5\\97.78955\\-193.8021\\5\\96.58173\\-195.7553\\5\\95.52308\\-197.7084\\5\\94.14386\\-199.6615\\5\\93.51134\\-201.6146\\5\\92.33256\\-203.5678\\5\\91.52065\\-204.6178\\5\\90.63744\\-205.5209\\5\\89.56753\\-206.362\\5\\88.42916\\-207.474\\5\\87.6144\\-208.5172\\5" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "70" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "393" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-213.3593\\7\\-87.30246\\-211.3803\\7\\-84.71083\\-209.4271\\7\\-84.91364\\-207.474\\7\\-86.21372\\-206.4352\\7\\-88.16685\\-205.6294\\7\\-90.11997\\-203.4351\\7\\-91.18853\\-201.6146\\7\\-92.0731\\-200.7171\\7\\-94.02622\\-199.9976\\7\\-95.97935\\-199.5394\\7\\-97.93247\\-199.5129\\7\\-99.28587\\-197.7084\\7\\-99.02781\\-195.7553\\7\\-99.62112\\-193.8021\\7\\-100.8957\\-191.849\\7\\-100.5853\\-189.8959\\7\\-99.54951\\-187.9428\\7\\-98.96771\\-185.9896\\7\\-98.63422\\-184.0365\\7\\-96.88046\\-182.0834\\7\\-95.95664\\-180.1303\\7\\-95.68638\\-178.1771\\7\\-94.83075\\-176.224\\7\\-92.97175\\-174.2709\\7\\-92.0731\\-172.4345\\7\\-90.92139\\-170.3646\\7\\-87.06008\\-166.4584\\7\\-85.50571\\-164.5053\\7\\-84.90294\\-162.5521\\7\\-82.30747\\-159.7789\\7\\-78.40122\\-157.4577\\7\\-76.4481\\-155.9528\\7\\-75.0955\\-154.7396\\7\\-74.49497\\-153.5522\\7\\-72.54185\\-151.2259\\7\\-70.58872\\-150.9998\\7\\-69.79865\\-152.7865\\7\\-69.46192\\-154.7396\\7\\-68.27878\\-156.6928\\7\\-67.4649\\-158.6459\\7\\-66.47077\\-160.599\\7\\-66.19419\\-164.5053\\7\\-66.18563\\-166.4584\\7\\-65.8627\\-170.3646\\7\\-65.46965\\-172.3178\\7\\-64.48186\\-174.2709\\7\\-64.30398\\-176.224\\7\\-64.27637\\-184.0365\\7\\-63.85759\\-185.9896\\7\\-63.6534\\-187.9428\\7\\-63.64954\\-189.8959\\7\\-63.08019\\-191.849\\7\\-62.34154\\-193.8021\\7\\-61.96994\\-195.7553\\7\\-61.79966\\-197.7084\\7\\-62.77623\\-198.7252\\7\\-66.68247\\-200.7211\\7\\-68.6356\\-201.56\\7\\-70.58872\\-202.7197\\7\\-72.54185\\-202.7573\\7\\-73.9843\\-203.5678\\7\\-75.90089\\-205.5209\\7\\-76.4481\\-205.9385\\7\\-78.40122\\-206.6093\\7\\-80.35435\\-208.3945\\7\\-82.30747\\-210.0097\\7\\-83.38914\\-211.3803\\7\\-84.2606\\-212.8414\\7\\-86.21372\\-214.4032\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "126" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "394" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.182476\\-183.8035\\7\\-5.037658\\-182.0834\\7\\-5.527342\\-180.1303\\7\\-5.535071\\-178.1771\\7\\-5.764507\\-176.224\\7\\-6.915818\\-174.2709\\7\\-7.32549\\-172.3178\\7\\-7.312359\\-170.3646\\7\\-7.439473\\-168.4115\\7\\-7.975172\\-166.4584\\7\\-8.868942\\-164.5053\\7\\-10.04185\\-163.0274\\7\\-11.99498\\-164.2306\\7\\-14.02852\\-166.4584\\7\\-15.90123\\-167.3282\\7\\-19.80748\\-167.3577\\7\\-21.8628\\-168.4115\\7\\-23.71373\\-169.2034\\7\\-29.5731\\-169.2074\\7\\-33.47935\\-169.3076\\7\\-35.43248\\-170.553\\7\\-37.3856\\-171.1336\\7\\-41.29185\\-171.1336\\7\\-43.24498\\-171.0824\\7\\-45.1981\\-170.6794\\7\\-47.15123\\-169.5614\\7\\-49.10435\\-167.8079\\7\\-50.20853\\-166.4584\\7\\-51.30496\\-164.5053\\7\\-51.67054\\-162.5521\\7\\-53.0106\\-160.8168\\7\\-54.96373\\-161.3162\\7\\-55.74609\\-160.599\\7\\-55.59849\\-158.6459\\7\\-54.28371\\-156.6928\\7\\-53.54998\\-154.7396\\7\\-52.33656\\-152.7865\\7\\-51.05748\\-151.4643\\7\\-49.10435\\-149.9707\\7\\-47.15123\\-148.6565\\7\\-45.1981\\-147.8239\\7\\-43.92923\\-146.9271\\7\\-41.46073\\-144.974\\7\\-40.30947\\-143.0209\\7\\-40.84525\\-141.0678\\7\\-41.29185\\-140.4865\\7\\-43.24498\\-139.9008\\7\\-45.1981\\-139.9145\\7\\-47.15123\\-138.7381\\7\\-50.98317\\-137.1615\\7\\-52.52232\\-135.2084\\7\\-53.0106\\-134.8693\\7\\-53.6366\\-135.2084\\7\\-54.96373\\-135.5489\\7\\-56.91685\\-134.193\\7\\-58.86998\\-135.8354\\7\\-60.04876\\-137.1615\\7\\-60.64619\\-139.1146\\7\\-62.77623\\-141.1935\\7\\-64.72935\\-141.8996\\7\\-66.68247\\-141.4307\\7\\-67.03584\\-141.0678\\7\\-67.5247\\-139.1146\\7\\-68.6356\\-137.1444\\7\\-69.23862\\-135.2084\\7\\-69.18491\\-131.3021\\7\\-68.6356\\-129.4064\\7\\-67.75818\\-127.3959\\7\\-67.33523\\-125.4428\\7\\-66.68247\\-123.5917\\7\\-65.71111\\-121.5365\\7\\-65.39565\\-119.5834\\7\\-63.61245\\-117.6303\\7\\-62.77623\\-116.9214\\7\\-60.8231\\-116.3756\\7\\-58.86998\\-116.1688\\7\\-56.91685\\-116.7729\\7\\-54.96373\\-116.8966\\7\\-53.0106\\-117.8541\\7\\-51.05748\\-118.7036\\7\\-49.68598\\-119.5834\\7\\-49.10435\\-120.2426\\7\\-47.15123\\-120.5599\\7\\-46.4394\\-121.5365\\7\\-45.1981\\-122.5319\\7\\-43.24498\\-122.1931\\7\\-41.29185\\-122.5755\\7\\-37.3856\\-123.1967\\7\\-34.96163\\-125.4428\\7\\-34.55678\\-127.3959\\7\\-35.02097\\-129.349\\7\\-37.3856\\-131.8682\\7\\-38.50814\\-133.2553\\7\\-38.79161\\-135.2084\\7\\-40.19159\\-137.1615\\7\\-39.33873\\-138.0624\\7\\-38.59905\\-139.1146\\7\\-37.3856\\-140.3716\\7\\-35.43248\\-141.6837\\7\\-33.47935\\-141.8824\\7\\-31.52623\\-141.1212\\7\\-29.58446\\-139.1146\\7\\-27.61998\\-138.1302\\7\\-25.66685\\-138.0319\\7\\-23.71373\\-136.5087\\7\\-21.7606\\-136.1739\\7\\-20.81058\\-137.1615\\7\\-22.15733\\-139.1146\\7\\-20.77829\\-141.0678\\7\\-19.83054\\-143.0209\\7\\-17.85435\\-144.3167\\7\\-15.90123\\-146.0851\\7\\-13.08643\\-148.8803\\7\\-12.03254\\-150.8334\\7\\-11.65729\\-152.7865\\7\\-10.55233\\-154.7396\\7\\-7.999948\\-156.6928\\7\\-7.040816\\-158.6459\\7\\-5.588048\\-160.599\\7\\-4.454518\\-162.5521\\7\\-3.825655\\-164.5053\\7\\-3.2901\\-168.4115\\7\\-2.512554\\-170.3646\\7\\-2.424664\\-174.2709\\7\\-2.426121\\-180.1303\\7\\-2.5191\\-182.0834\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "64" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "395" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-217.7221\\7\\17.3019\\-216.5036\\7\\15.34877\\-215.8032\\7\\13.39565\\-214.5879\\7\\11.44252\\-213.9139\\7\\10.36528\\-213.3334\\7\\9.489399\\-212.5319\\7\\8.840089\\-211.3803\\7\\8.033275\\-209.4271\\7\\7.536274\\-208.8086\\7\\6.893936\\-207.474\\7\\6.859801\\-203.5678\\7\\5.872132\\-201.6146\\7\\3.630024\\-200.3074\\7\\1.676899\\-199.909\\7\\-0.276226\\-199.9545\\7\\-2.229351\\-198.7676\\7\\-3.245571\\-197.7084\\7\\-3.934333\\-195.7553\\7\\-3.127789\\-193.8021\\7\\-2.229351\\-192.3047\\7\\-2.067761\\-193.8021\\7\\-0.276226\\-195.7476\\7\\5.583149\\-195.7476\\7\\7.536274\\-195.85\\7\\9.489399\\-195.3984\\7\\11.44252\\-195.0627\\7\\13.39565\\-194.2832\\7\\15.34877\\-192.6079\\7\\17.3019\\-191.3607\\7\\21.20815\\-190.0103\\7\\23.16127\\-190.0103\\7\\25.1144\\-190.7138\\7\\27.06752\\-191.1629\\7\\28.30631\\-191.849\\7\\29.02065\\-192.4001\\7\\32.9269\\-194.6121\\7\\34.88002\\-196.1842\\7\\36.83315\\-196.7454\\7\\42.69252\\-196.6986\\7\\46.59877\\-196.851\\7\\50.50502\\-197.8967\\7\\52.45815\\-198.543\\7\\53.79414\\-199.6615\\7\\54.97956\\-201.6146\\7\\54.92253\\-203.5678\\7\\54.41127\\-204.3043\\7\\52.45815\\-204.2438\\7\\51.96376\\-203.5678\\7\\50.50502\\-202.4872\\7\\48.5519\\-202.0114\\7\\46.59877\\-202.3742\\7\\44.64565\\-202.5291\\7\\42.69252\\-202.5422\\7\\40.7394\\-202.7788\\7\\39.82666\\-203.5678\\7\\39.51991\\-205.5209\\7\\38.78627\\-207.2975\\7\\36.83315\\-208.9298\\7\\34.32805\\-211.3803\\7\\30.97377\\-214.5541\\7\\29.02065\\-216.4801\\7\\27.06752\\-217.7479\\7\\21.20815\\-217.7728\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "396" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-141.8694\\7\\54.41127\\-140.5088\\7\\52.45815\\-139.4156\\7\\52.16122\\-139.1146\\7\\50.50502\\-138.0847\\7\\46.59877\\-139.632\\7\\45.04674\\-139.1146\\7\\42.69252\\-137.5545\\7\\42.46873\\-137.1615\\7\\42.09771\\-135.2084\\7\\40.7394\\-134.4382\\7\\38.78627\\-135.9235\\7\\36.83315\\-136.563\\7\\34.88002\\-137.6584\\7\\32.9269\\-136.6599\\7\\29.16199\\-135.2084\\7\\28.26367\\-133.2553\\7\\27.06752\\-132.1626\\7\\25.00508\\-131.3021\\7\\24.45136\\-129.349\\7\\25.1144\\-128.1139\\7\\25.7404\\-127.3959\\7\\27.06752\\-126.6458\\7\\30.97377\\-125.7996\\7\\32.9269\\-126.2818\\7\\34.88002\\-126.4458\\7\\36.83315\\-126.4368\\7\\40.7394\\-126.0064\\7\\42.69252\\-126.9558\\7\\44.22451\\-125.4428\\7\\44.27866\\-121.5365\\7\\45.54954\\-119.5834\\7\\47.3939\\-117.6303\\7\\47.89914\\-115.6771\\7\\47.26253\\-113.724\\7\\47.98611\\-111.7709\\7\\48.5519\\-111.3308\\7\\50.50502\\-111.1356\\7\\52.45815\\-111.3429\\7\\54.41127\\-112.7413\\7\\55.27044\\-113.724\\7\\56.53878\\-115.6771\\7\\57.36902\\-117.6303\\7\\58.93897\\-119.5834\\7\\59.43876\\-121.5365\\7\\60.91999\\-123.4896\\7\\60.95675\\-125.4428\\7\\61.14258\\-127.3959\\7\\62.43548\\-129.349\\7\\62.81187\\-131.3021\\7\\61.80966\\-133.2553\\7\\62.48286\\-135.2084\\7\\62.99449\\-137.1615\\7\\62.99829\\-139.1146\\7\\62.27676\\-141.0678\\7\\60.27065\\-141.9412\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "397" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "73.94253\\-210.4491\\7\\72.74183\\-209.4271\\7\\72.33161\\-207.474\\7\\71.69643\\-205.5209\\7\\71.9894\\-205.1063\\7\\73.94253\\-204.352\\7\\75.36243\\-205.5209\\7\\77.25278\\-207.474\\7\\79.58897\\-209.4271\\7\\77.84878\\-210.7728\\7\\75.89565\\-210.5313\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "69" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "398" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-210.8023\\7\\84.77466\\-209.4271\\7\\83.98997\\-207.474\\7\\81.75503\\-205.3593\\7\\79.8019\\-204.4518\\7\\77.84878\\-202.4357\\7\\75.6515\\-201.6146\\7\\73.94253\\-201.0949\\7\\71.9894\\-200.3884\\7\\71.30856\\-199.6615\\7\\70.03628\\-198.7971\\7\\68.08315\\-198.3143\\7\\65.44643\\-195.7553\\7\\64.97066\\-193.8021\\7\\64.9591\\-191.849\\7\\64.45872\\-189.8959\\7\\63.31356\\-187.9428\\7\\63.11353\\-185.9896\\7\\63.10569\\-184.0365\\7\\62.78571\\-182.0834\\7\\62.01207\\-180.1303\\7\\62.97535\\-178.1771\\7\\63.26627\\-176.224\\7\\63.21342\\-174.2709\\7\\62.65846\\-172.3178\\7\\61.81738\\-170.3646\\7\\61.81738\\-166.4584\\7\\61.95324\\-164.5053\\7\\64.42867\\-162.5521\\7\\65.55272\\-160.599\\7\\65.56809\\-158.6459\\7\\64.77003\\-156.6928\\7\\63.06376\\-154.7396\\7\\63.00357\\-152.7865\\7\\63.44326\\-150.8334\\7\\61.92483\\-148.8803\\7\\62.22377\\-147.3649\\7\\64.1769\\-147.3829\\7\\66.13003\\-148.2452\\7\\67.22636\\-148.8803\\7\\68.08315\\-149.5898\\7\\70.03628\\-151.6591\\7\\72.50031\\-154.7396\\7\\73.94253\\-155.9631\\7\\75.89565\\-157.8038\\7\\79.8019\\-161.6807\\7\\85.66128\\-167.6076\\7\\87.6144\\-169.2962\\7\\88.68813\\-170.3646\\7\\90.36505\\-172.3178\\7\\92.31172\\-174.2709\\7\\93.19195\\-176.224\\7\\94.27769\\-178.1771\\7\\95.98741\\-180.1303\\7\\96.1487\\-182.0834\\7\\96.63982\\-184.0365\\7\\97.38003\\-184.7451\\7\\98.31627\\-185.9896\\7\\98.32523\\-191.849\\7\\97.88829\\-193.8021\\7\\96.54778\\-195.7553\\7\\95.4269\\-197.0555\\7\\94.62789\\-197.7084\\7\\93.43621\\-199.6615\\7\\92.88642\\-205.5209\\7\\92.05715\\-207.474\\7\\90.88274\\-209.4271\\7\\89.56753\\-210.6442\\7\\87.6144\\-211.2739\\7" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "399" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-214.3782\\9\\-89.17902\\-213.3334\\9\\-88.52826\\-211.3803\\9\\-88.16685\\-211.0763\\9\\-86.21372\\-210.6419\\9\\-84.2606\\-210.4738\\9\\-83.28941\\-211.3803\\9\\-83.25271\\-213.3334\\9\\-84.2606\\-214.3863\\9\\-86.21372\\-214.9916\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "121" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "400" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-82.30747\\-208.3292\\9\\-84.2606\\-206.7979\\9\\-86.21372\\-206.5585\\9\\-88.16685\\-205.9828\\9\\-90.11997\\-204.3694\\9\\-92.0731\\-202.5149\\9\\-94.02622\\-200.9081\\9\\-95.97935\\-200.1411\\9\\-97.93247\\-198.863\\9\\-98.8963\\-197.7084\\9\\-98.68775\\-195.7553\\9\\-98.08333\\-193.8021\\9\\-98.81633\\-191.849\\9\\-99.08444\\-189.8959\\9\\-98.95495\\-187.9428\\9\\-98.65025\\-185.9896\\9\\-96.81705\\-182.0834\\9\\-95.77991\\-180.1303\\9\\-94.57868\\-176.224\\9\\-92.8913\\-174.2709\\9\\-90.92139\\-170.3646\\9\\-87.06573\\-166.4584\\9\\-85.42603\\-164.5053\\9\\-84.64754\\-162.5521\\9\\-83.1932\\-160.599\\9\\-80.35435\\-157.756\\9\\-79.18748\\-156.6928\\9\\-77.24952\\-154.7396\\9\\-76.69559\\-152.7865\\9\\-75.3296\\-150.8334\\9\\-74.96582\\-148.8803\\9\\-74.49497\\-147.9605\\9\\-73.55953\\-146.9271\\9\\-72.54185\\-146.2911\\9\\-71.36423\\-144.974\\9\\-71.18107\\-141.0678\\9\\-71.18846\\-137.1615\\9\\-71.11886\\-133.2553\\9\\-70.65531\\-131.3021\\9\\-69.73932\\-129.349\\9\\-69.29173\\-127.3959\\9\\-68.6356\\-125.4872\\9\\-67.76367\\-123.4896\\9\\-67.38422\\-121.5365\\9\\-66.68247\\-119.7688\\9\\-65.64257\\-117.6303\\9\\-62.77623\\-114.7834\\9\\-60.8231\\-113.1621\\9\\-58.86998\\-112.9993\\9\\-56.91685\\-112.5471\\9\\-54.96373\\-112.7259\\9\\-54.16991\\-113.724\\9\\-54.08911\\-115.6771\\9\\-53.43439\\-117.6303\\9\\-53.0106\\-118.054\\9\\-51.05748\\-117.7966\\9\\-49.10435\\-116.2264\\9\\-47.15123\\-117.3496\\9\\-45.96045\\-119.5834\\9\\-45.1981\\-120.404\\9\\-43.24498\\-121.1018\\9\\-41.29185\\-122.0728\\9\\-39.33873\\-122.1362\\9\\-37.3856\\-122.4654\\9\\-36.03101\\-123.4896\\9\\-33.93464\\-125.4428\\9\\-32.68685\\-127.3959\\9\\-32.29679\\-129.349\\9\\-31.26714\\-131.3021\\9\\-33.08149\\-133.2553\\9\\-35.43248\\-135.4081\\9\\-36.9858\\-137.1615\\9\\-36.32223\\-139.1146\\9\\-35.37989\\-141.0678\\9\\-37.3856\\-142.8181\\9\\-39.33873\\-142.5955\\9\\-41.29185\\-141.9029\\9\\-43.24498\\-141.8077\\9\\-45.1981\\-142.2355\\9\\-47.15123\\-140.6211\\9\\-49.75909\\-139.1146\\9\\-51.05748\\-138.4386\\9\\-53.0106\\-137.8939\\9\\-56.91685\\-137.8694\\9\\-58.67321\\-139.1146\\9\\-60.8231\\-141.2645\\9\\-62.31267\\-143.0209\\9\\-64.1669\\-144.974\\9\\-65.8264\\-146.9271\\9\\-66.01269\\-148.8803\\9\\-66.04694\\-150.8334\\9\\-66.61589\\-152.7865\\9\\-67.71275\\-154.7396\\9\\-67.1216\\-156.6928\\9\\-65.93237\\-158.6459\\9\\-65.84605\\-160.599\\9\\-65.84605\\-166.4584\\9\\-65.47216\\-168.4115\\9\\-64.69179\\-170.3646\\9\\-64.30398\\-174.2709\\9\\-64.30398\\-176.224\\9\\-64.47026\\-180.1303\\9\\-64.48186\\-182.0834\\9\\-65.17324\\-184.0365\\9\\-65.04417\\-185.9896\\9\\-64.29466\\-187.9428\\9\\-64.97684\\-189.8959\\9\\-63.74307\\-193.8021\\9\\-64.72935\\-195.6209\\9\\-66.14899\\-197.7084\\9\\-66.68247\\-198.2051\\9\\-68.6356\\-198.8557\\9\\-70.58872\\-198.8965\\9\\-72.05357\\-199.6615\\9\\-72.54185\\-200.0905\\9\\-74.49497\\-201.0366\\9\\-75.28699\\-201.6146\\9\\-76.4481\\-202.7577\\9\\-77.03513\\-203.5678\\9\\-79.04356\\-205.5209\\9\\-80.35435\\-206.9628\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "401" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-219.4518\\9\\17.3019\\-218.269\\9\\15.34877\\-217.4266\\9\\13.39565\\-216.3543\\9\\11.44252\\-215.8085\\9\\9.489399\\-214.7558\\9\\7.880472\\-213.3334\\9\\5.583149\\-210.8403\\9\\4.947608\\-209.4271\\9\\4.900552\\-205.5209\\9\\3.95229\\-203.5678\\9\\3.630024\\-203.1748\\9\\2.967176\\-201.6146\\9\\1.676899\\-200.331\\9\\-0.276226\\-199.7836\\9\\-2.229351\\-198.6189\\9\\-3.181253\\-197.7084\\9\\-3.934333\\-195.7553\\9\\-3.127789\\-193.8021\\9\\-3.127789\\-184.0365\\9\\-4.182476\\-182.4855\\9\\-4.485547\\-180.1303\\9\\-4.574386\\-178.1771\\9\\-5.098585\\-176.224\\9\\-6.367447\\-172.3178\\9\\-6.449974\\-170.3646\\9\\-6.966408\\-168.4115\\9\\-8.088726\\-166.6491\\9\\-10.04185\\-165.3312\\9\\-11.49332\\-166.4584\\9\\-12.88338\\-168.4115\\9\\-13.9481\\-170.5143\\9\\-15.90123\\-171.1941\\9\\-17.85435\\-171.232\\9\\-29.5731\\-171.3111\\9\\-31.52623\\-172.3553\\9\\-33.47935\\-173.0266\\9\\-37.3856\\-173.0693\\9\\-41.29185\\-173.0442\\9\\-43.24498\\-172.6848\\9\\-45.1981\\-171.6353\\9\\-47.15123\\-170.8355\\9\\-49.10435\\-169.3019\\9\\-49.95953\\-168.4115\\9\\-51.4143\\-166.4584\\9\\-52.58335\\-164.5053\\9\\-53.0106\\-163.9794\\9\\-54.96373\\-163.2819\\9\\-55.69747\\-162.5521\\9\\-55.97411\\-160.599\\9\\-55.51304\\-158.6459\\9\\-53.84983\\-156.6928\\9\\-52.38963\\-154.7396\\9\\-51.2834\\-152.7865\\9\\-47.88365\\-148.8803\\9\\-47.15123\\-148.1765\\9\\-45.1981\\-147.3165\\9\\-43.24498\\-146.9937\\9\\-41.29185\\-146.243\\9\\-39.33873\\-145.7922\\9\\-37.3856\\-145.7409\\9\\-35.43248\\-145.085\\9\\-33.47935\\-143.647\\9\\-31.52623\\-142.9458\\9\\-30.31894\\-141.0678\\9\\-30.31148\\-139.1146\\9\\-29.5731\\-138.3008\\9\\-27.61998\\-137.8939\\9\\-25.66685\\-137.8633\\9\\-23.71373\\-136.6674\\9\\-21.7606\\-136.1382\\9\\-20.72381\\-137.1615\\9\\-20.74135\\-139.1146\\9\\-21.34466\\-141.0678\\9\\-21.7606\\-141.6859\\9\\-23.30856\\-143.0209\\9\\-21.7606\\-145.0979\\9\\-19.80748\\-145.7995\\9\\-17.85435\\-145.9358\\9\\-15.90123\\-146.4965\\9\\-13.9481\\-148.098\\9\\-13.14861\\-148.8803\\9\\-12.28794\\-150.8334\\9\\-11.62799\\-152.7865\\9\\-10.79806\\-154.7396\\9\\-9.711435\\-156.6928\\9\\-9.14881\\-158.6459\\9\\-7.924354\\-160.599\\9\\-6.135601\\-161.4432\\9\\-4.893168\\-162.5521\\9\\-3.546935\\-164.5053\\9\\-3.120012\\-166.4584\\9\\-2.46671\\-168.4115\\9\\-2.067761\\-170.3646\\9\\-2.067761\\-193.8021\\9\\-0.276226\\-195.7476\\9\\3.630024\\-195.7476\\9\\5.583149\\-195.6605\\9\\7.536274\\-195.1555\\9\\9.489399\\-194.4662\\9\\11.44252\\-193.9131\\9\\13.39565\\-192.8925\\9\\15.34877\\-191.3694\\9\\17.3019\\-190.6617\\9\\19.25502\\-189.8011\\9\\21.20815\\-189.4895\\9\\23.16127\\-189.4895\\9\\27.06752\\-190.0501\\9\\29.02065\\-190.7621\\9\\30.97377\\-192.35\\9\\32.9269\\-193.3582\\9\\34.88002\\-194.5346\\9\\36.83315\\-193.958\\9\\38.78627\\-193.1326\\9\\40.7394\\-193.0736\\9\\44.64565\\-193.1195\\9\\46.13219\\-193.8021\\9\\48.5519\\-196.0013\\9\\50.50502\\-196.7502\\9\\52.45815\\-197.2288\\9\\54.41127\\-198.5184\\9\\55.80938\\-199.6615\\9\\58.31752\\-202.3471\\9\\59.11653\\-203.5678\\9\\58.31752\\-204.7345\\9\\56.3644\\-204.4216\\9\\54.41127\\-205.0706\\9\\52.45815\\-203.2818\\9\\50.50502\\-202.5036\\9\\48.5519\\-202.611\\9\\47.43665\\-203.5678\\9\\47.35645\\-205.5209\\9\\46.59877\\-207.1897\\9\\44.34047\\-209.4271\\9\\40.7394\\-211.1063\\9\\40.4621\\-211.3803\\9\\36.83315\\-212.929\\9\\36.42459\\-213.3334\\9\\34.88002\\-214.2914\\9\\33.05181\\-215.2865\\9\\30.97377\\-216.6318\\9\\29.02065\\-218.5484\\9\\27.06752\\-219.681\\9\\21.20815\\-219.6896\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "402" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-208.741\\9\\73.94253\\-207.8181\\9\\73.62833\\-207.474\\9\\71.9894\\-206.4715\\9\\70.99101\\-205.5209\\9\\71.9894\\-204.2444\\9\\73.94253\\-203.7042\\9\\75.89565\\-204.5341\\9\\78.55679\\-207.474\\9\\77.85884\\-209.4271\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "130" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "403" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-212.1512\\9\\84.98519\\-211.3803\\9\\84.61135\\-207.474\\9\\81.75503\\-204.7387\\9\\80.19128\\-203.5678\\9\\77.84878\\-201.0527\\9\\75.89565\\-200.6426\\9\\73.94253\\-200.0244\\9\\71.9894\\-198.5004\\9\\68.08315\\-196.1475\\9\\67.69093\\-195.7553\\9\\66.90614\\-193.8021\\9\\66.87\\-191.849\\9\\65.70863\\-189.8959\\9\\65.00914\\-187.9428\\9\\64.91552\\-185.9896\\9\\64.46987\\-184.0365\\9\\63.24787\\-182.0834\\9\\62.9598\\-178.1771\\9\\63.28798\\-174.2709\\9\\63.02322\\-172.3178\\9\\61.81738\\-170.3646\\9\\61.83683\\-166.4584\\9\\62.81439\\-164.5053\\9\\64.1769\\-163.5073\\9\\65.23405\\-162.5521\\9\\65.56036\\-160.599\\9\\65.32447\\-158.6459\\9\\64.1769\\-157.3818\\9\\62.22377\\-155.6831\\9\\61.42477\\-154.7396\\9\\60.17299\\-152.7865\\9\\59.52069\\-150.8334\\9\\59.45595\\-148.8803\\9\\58.31752\\-147.2318\\9\\56.0904\\-144.974\\9\\55.30812\\-143.0209\\9\\54.41127\\-142.2408\\9\\52.45815\\-141.8816\\9\\50.50502\\-141.2996\\9\\48.5519\\-140.866\\9\\46.59877\\-141.8583\\9\\44.64565\\-141.7346\\9\\42.69252\\-139.9935\\9\\40.7394\\-137.7251\\9\\38.78627\\-137.8819\\9\\34.88002\\-138.0898\\9\\32.9269\\-138.0029\\9\\30.97377\\-137.804\\9\\27.60607\\-135.2084\\9\\27.06752\\-134.6271\\9\\25.1144\\-133.5027\\9\\23.16127\\-131.8641\\9\\21.99167\\-131.3021\\9\\22.10798\\-129.349\\9\\23.16127\\-128.5343\\9\\25.1144\\-127.7903\\9\\27.06752\\-127.5703\\9\\29.02065\\-126.6257\\9\\30.97377\\-126.3093\\9\\34.85783\\-127.3959\\9\\36.83315\\-127.2605\\9\\38.78627\\-126.4809\\9\\40.7394\\-125.8867\\9\\42.39956\\-127.3959\\9\\42.69252\\-127.8585\\9\\43.34842\\-127.3959\\9\\44.22186\\-125.4428\\9\\44.22971\\-123.4896\\9\\44.35268\\-121.5365\\9\\44.82129\\-119.5834\\9\\46.01826\\-117.6303\\9\\46.77829\\-115.6771\\9\\46.4767\\-113.724\\9\\46.51801\\-109.8178\\9\\47.97943\\-107.8646\\9\\48.5519\\-107.5391\\9\\50.50502\\-107.6289\\9\\52.45815\\-108.9115\\9\\54.95647\\-111.7709\\9\\56.5882\\-113.724\\9\\57.52672\\-115.6771\\9\\59.0997\\-117.6303\\9\\60.50637\\-119.5834\\9\\61.18586\\-121.5365\\9\\62.39816\\-123.4896\\9\\62.95248\\-125.4428\\9\\63.01364\\-127.3959\\9\\63.40923\\-129.349\\9\\64.1769\\-131.3268\\9\\63.12899\\-133.2553\\9\\63.91991\\-135.2084\\9\\64.92694\\-137.1615\\9\\64.93475\\-139.1146\\9\\65.46495\\-141.0678\\9\\66.13003\\-141.7956\\9\\66.83209\\-143.0209\\9\\67.38811\\-144.974\\9\\68.08315\\-145.6391\\9\\70.03628\\-147.9319\\9\\70.59039\\-148.8803\\9\\71.30976\\-150.8334\\9\\72.60369\\-152.7865\\9\\73.3438\\-154.7396\\9\\75.20347\\-156.6928\\9\\79.8019\\-161.3752\\9\\80.82186\\-162.5521\\9\\83.70815\\-165.6338\\9\\85.66128\\-167.6076\\9\\87.6144\\-168.6262\\9\\89.01507\\-170.3646\\9\\90.36505\\-172.3178\\9\\92.31172\\-174.2709\\9\\93.47378\\-176.9001\\9\\94.80545\\-180.1303\\9\\95.22746\\-182.0834\\9\\96.52617\\-185.9896\\9\\96.49952\\-191.849\\9\\96.38821\\-193.8021\\9\\95.4269\\-195.5768\\9\\93.47378\\-198.4803\\9\\92.82444\\-199.6615\\9\\92.84525\\-201.6146\\9\\93.18081\\-203.5678\\9\\93.18081\\-205.5209\\9\\92.59714\\-207.474\\9\\92.16998\\-209.4271\\9\\91.52065\\-210.2485\\9\\89.56753\\-211.6277\\9\\87.6144\\-212.4301\\9" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "404" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-215.4609\\11\\-89.73811\\-213.3334\\11\\-88.93459\\-211.3803\\11\\-88.16685\\-210.7378\\11\\-84.97777\\-209.4271\\11\\-83.98716\\-207.474\\11\\-86.21372\\-205.8659\\11\\-88.16685\\-204.8413\\11\\-90.11997\\-204.5914\\11\\-92.0731\\-203.9863\\11\\-94.02622\\-202.2603\\11\\-96.50832\\-199.6615\\11\\-97.3269\\-197.7084\\11\\-97.85171\\-195.7553\\11\\-97.21999\\-191.849\\11\\-98.12217\\-189.8959\\11\\-98.64404\\-187.9428\\11\\-97.10126\\-184.0365\\11\\-96.62868\\-182.0834\\11\\-94.02622\\-176.2345\\11\\-92.8913\\-174.2709\\11\\-90.92139\\-170.3646\\11\\-87.07132\\-166.4584\\11\\-85.63642\\-164.5053\\11\\-85.04087\\-162.5521\\11\\-83.28403\\-160.599\\11\\-81.42473\\-158.6459\\11\\-80.35435\\-157.2124\\11\\-79.82538\\-156.6928\\11\\-78.84512\\-154.7396\\11\\-77.443\\-152.7865\\11\\-77.1307\\-150.8334\\11\\-76.69559\\-148.8803\\11\\-75.48679\\-146.9271\\11\\-74.56156\\-143.0209\\11\\-73.44824\\-141.0678\\11\\-73.14159\\-139.1146\\11\\-73.10378\\-137.1615\\11\\-72.25989\\-133.2553\\11\\-71.63853\\-131.3021\\11\\-71.25157\\-129.349\\11\\-70.66949\\-127.3959\\11\\-69.72794\\-125.4428\\11\\-69.34361\\-123.4896\\11\\-68.6356\\-121.6265\\11\\-67.68321\\-119.5834\\11\\-65.65255\\-115.6771\\11\\-64.72935\\-114.6715\\11\\-60.8231\\-110.9007\\11\\-58.86998\\-109.5703\\11\\-56.91685\\-109.6183\\11\\-55.12368\\-111.7709\\11\\-54.62947\\-113.724\\11\\-54.5769\\-115.6771\\11\\-54.1465\\-117.6303\\11\\-53.36742\\-119.5834\\11\\-53.0106\\-120.743\\11\\-51.96033\\-119.5834\\11\\-51.05748\\-119.0575\\11\\-50.37746\\-117.6303\\11\\-49.10435\\-116.5199\\11\\-47.15123\\-116.8308\\11\\-45.1981\\-118.7352\\11\\-43.24498\\-120.2286\\11\\-41.29185\\-120.8162\\11\\-37.3856\\-120.894\\11\\-35.43248\\-122.1634\\11\\-32.58228\\-123.4896\\11\\-31.52623\\-124.3005\\11\\-30.78675\\-125.4428\\11\\-30.56243\\-127.3959\\11\\-29.5731\\-128.8655\\11\\-27.77671\\-131.3021\\11\\-28.42869\\-133.2553\\11\\-29.5731\\-133.7046\\11\\-33.47935\\-136.5131\\11\\-34.19198\\-137.1615\\11\\-33.47935\\-138.0213\\11\\-31.52623\\-138.2097\\11\\-29.5731\\-137.7363\\11\\-27.61998\\-137.6498\\11\\-25.66685\\-137.783\\11\\-23.71373\\-137.8109\\11\\-21.7606\\-137.6997\\11\\-20.22342\\-139.1146\\11\\-20.87008\\-141.0678\\11\\-21.7606\\-142.0213\\11\\-23.48348\\-143.0209\\11\\-23.71373\\-143.2856\\11\\-25.66685\\-143.4595\\11\\-27.61998\\-143.4595\\11\\-31.52623\\-143.6303\\11\\-33.47935\\-142.2492\\11\\-35.43248\\-142.2345\\11\\-37.3856\\-142.9401\\11\\-39.33873\\-142.8988\\11\\-41.29185\\-142.2332\\11\\-45.1981\\-143.9544\\11\\-47.1024\\-143.0209\\11\\-48.05736\\-141.0678\\11\\-49.10435\\-140.0868\\11\\-51.05748\\-139.951\\11\\-53.0106\\-140.757\\11\\-54.96373\\-141.1945\\11\\-56.91685\\-139.9866\\11\\-58.24131\\-141.0678\\11\\-60.01615\\-143.0209\\11\\-60.56044\\-144.974\\11\\-62.11594\\-146.9271\\11\\-62.77623\\-148.715\\11\\-63.97474\\-150.8334\\11\\-64.22404\\-152.7865\\11\\-65.35347\\-154.7396\\11\\-65.50719\\-156.6928\\11\\-64.72172\\-158.6459\\11\\-64.72172\\-166.4584\\11\\-64.51765\\-170.3646\\11\\-64.50555\\-176.224\\11\\-65.26254\\-178.1771\\11\\-65.61507\\-180.1303\\11\\-65.61507\\-182.0834\\11\\-65.87681\\-184.0365\\11\\-65.87854\\-185.9896\\11\\-65.63986\\-187.9428\\11\\-66.2477\\-189.8959\\11\\-67.36064\\-191.849\\11\\-67.3735\\-193.8021\\11\\-67.74988\\-195.7553\\11\\-68.6356\\-196.5893\\11\\-70.58872\\-196.8594\\11\\-72.54185\\-196.9646\\11\\-73.80848\\-197.7084\\11\\-74.49497\\-198.4232\\11\\-75.20996\\-199.6615\\11\\-77.41924\\-201.6146\\11\\-78.96316\\-203.5678\\11\\-79.48978\\-205.5209\\11\\-80.35435\\-206.4314\\11\\-82.30747\\-208.1301\\11\\-83.95663\\-209.4271\\11\\-82.97111\\-211.3803\\11\\-83.12363\\-213.3334\\11\\-84.2606\\-215.0388\\11\\-86.21372\\-216.0069\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "132" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "405" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "17.3019\\-219.4967\\11\\15.34877\\-218.3028\\11\\11.44252\\-216.8875\\11\\7.536274\\-215.9008\\11\\6.252478\\-215.2865\\11\\5.583149\\-214.7298\\11\\3.141743\\-211.3803\\11\\2.934593\\-209.4271\\11\\2.928273\\-207.474\\11\\2.594985\\-205.5209\\11\\1.124444\\-203.5678\\11\\0.918452\\-201.6146\\11\\-0.276226\\-200.3628\\11\\-3.181253\\-197.7084\\11\\-3.934333\\-195.7553\\11\\-3.127789\\-193.8021\\11\\-3.127789\\-184.0365\\11\\-3.726747\\-182.0834\\11\\-4.182476\\-181.9843\\11\\-4.845324\\-180.1303\\11\\-5.101333\\-178.1771\\11\\-5.192569\\-176.224\\11\\-5.597382\\-174.2709\\11\\-6.858785\\-170.3646\\11\\-8.088726\\-168.8062\\11\\-10.04185\\-167.6463\\11\\-10.76396\\-168.4115\\11\\-11.19699\\-170.3646\\11\\-11.82059\\-172.3178\\11\\-13.9481\\-174.4703\\11\\-15.90123\\-175.0405\\11\\-17.85435\\-175.103\\11\\-21.7606\\-175.103\\11\\-23.71373\\-175.1593\\11\\-27.61998\\-175.4071\\11\\-31.52623\\-175.2407\\11\\-35.43248\\-175.1827\\11\\-37.3856\\-175.076\\11\\-41.29185\\-175.0021\\11\\-43.24498\\-174.0196\\11\\-45.1981\\-173.2025\\11\\-46.5728\\-172.3178\\11\\-49.10435\\-170.0369\\11\\-51.05748\\-167.676\\11\\-53.0106\\-165.7146\\11\\-54.96373\\-165.9658\\11\\-55.7688\\-164.5053\\11\\-55.84177\\-162.5521\\11\\-55.51618\\-160.599\\11\\-54.96373\\-159.8553\\11\\-51.69197\\-154.7396\\11\\-50.05317\\-152.7865\\11\\-47.83761\\-148.8803\\11\\-47.15123\\-148.2016\\11\\-45.1981\\-147.2737\\11\\-41.29185\\-147.0079\\11\\-39.33873\\-146.7897\\11\\-35.43248\\-146.9647\\11\\-31.52623\\-146.7792\\11\\-29.5731\\-147.3716\\11\\-27.61998\\-147.6281\\11\\-23.71373\\-147.6507\\11\\-21.7606\\-147.512\\11\\-19.80748\\-147.5447\\11\\-17.85435\\-147.7784\\11\\-15.90123\\-147.8988\\11\\-13.9481\\-148.975\\11\\-12.67106\\-150.8334\\11\\-11.53301\\-152.7865\\11\\-10.75605\\-154.7396\\11\\-10.20344\\-156.6928\\11\\-9.918877\\-158.6459\\11\\-9.283515\\-160.599\\11\\-8.088726\\-162.2964\\11\\-6.135601\\-163.4776\\11\\-5.153613\\-164.5053\\11\\-2.98999\\-168.4115\\11\\-2.39094\\-170.3646\\11\\-2.067761\\-174.2709\\11\\-2.067761\\-193.8021\\11\\-0.276226\\-195.7476\\11\\3.630024\\-195.5558\\11\\5.583149\\-195.0991\\11\\7.536274\\-194.4476\\11\\9.489399\\-193.272\\11\\11.44252\\-192.9374\\11\\13.39565\\-192.4947\\11\\15.34877\\-190.9173\\11\\17.3019\\-189.8437\\11\\19.25502\\-189.2816\\11\\21.20815\\-189.0851\\11\\23.16127\\-189.0696\\11\\25.1144\\-189.2744\\11\\27.06752\\-189.6484\\11\\29.02065\\-189.8732\\11\\30.97377\\-191.0556\\11\\32.9269\\-192.5933\\11\\34.88002\\-192.9357\\11\\36.8712\\-191.849\\11\\38.78627\\-191.081\\11\\40.7394\\-189.8437\\11\\42.69252\\-189.8293\\11\\44.64565\\-190.9372\\11\\46.59877\\-191.1258\\11\\48.4315\\-191.849\\11\\50.76396\\-193.8021\\11\\52.35939\\-195.7553\\11\\56.3644\\-198.4839\\11\\58.31752\\-200.262\\11\\60.90619\\-203.5678\\11\\60.27065\\-204.4777\\11\\59.23535\\-205.5209\\11\\58.31752\\-206.1668\\11\\57.59946\\-205.5209\\11\\56.3644\\-204.0423\\11\\54.41127\\-202.7896\\11\\52.22418\\-203.5678\\11\\50.50502\\-206.7721\\11\\48.5519\\-209.0831\\11\\46.23668\\-211.3803\\11\\43.72949\\-213.3334\\11\\42.69252\\-213.8985\\11\\40.7394\\-214.2021\\11\\38.55117\\-215.2865\\11\\36.83315\\-215.8167\\11\\34.88002\\-215.9883\\11\\32.9269\\-216.7547\\11\\30.28882\\-219.1928\\11\\29.02065\\-220.139\\11\\27.06752\\-220.6021\\11\\21.20815\\-220.6021\\11\\19.25502\\-220.2104\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "406" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "73.94253\\-206.3512\\11\\71.9894\\-204.7855\\11\\70.70183\\-203.5678\\11\\71.9894\\-202.567\\11\\73.94253\\-202.8184\\11\\75.89565\\-203.9512\\11\\76.8251\\-205.5209\\11\\75.89565\\-206.6664\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "125" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "407" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "87.6144\\-213.5691\\11\\85.66128\\-212.1205\\11\\85.03983\\-211.3803\\11\\84.95953\\-209.4271\\11\\84.65392\\-207.474\\11\\80.67241\\-203.5678\\11\\78.91703\\-201.6146\\11\\77.84878\\-200.2272\\11\\75.89565\\-198.617\\11\\73.94253\\-197.3829\\11\\71.9894\\-196.7372\\11\\70.87246\\-195.7553\\11\\69.3879\\-193.8021\\11\\68.23176\\-189.8959\\11\\67.04948\\-187.9428\\11\\66.37751\\-185.9896\\11\\65.2443\\-184.0365\\11\\64.98492\\-182.0834\\11\\64.51518\\-180.1303\\11\\63.29355\\-178.1771\\11\\63.21235\\-176.224\\11\\63.24436\\-174.2709\\11\\63.03911\\-172.3178\\11\\62.08834\\-170.3646\\11\\61.86695\\-166.4584\\11\\64.1769\\-164.2347\\11\\65.46053\\-162.5521\\11\\65.314\\-160.599\\11\\64.1769\\-159.0426\\11\\61.70949\\-156.6928\\11\\59.92952\\-154.7396\\11\\58.95893\\-152.7865\\11\\56.3644\\-148.9517\\11\\52.37221\\-144.974\\11\\50.50502\\-143.2949\\11\\48.5519\\-142.4374\\11\\46.59877\\-143.6874\\11\\44.64565\\-142.4316\\11\\42.69252\\-140.484\\11\\40.7394\\-139.9402\\11\\38.78627\\-139.7743\\11\\36.83315\\-139.9094\\11\\34.88002\\-140.2096\\11\\32.9269\\-139.8208\\11\\30.97377\\-138.5657\\11\\29.02065\\-137.409\\11\\27.06752\\-135.9348\\11\\25.1144\\-135.4559\\11\\23.16127\\-134.4065\\11\\22.30825\\-133.2553\\11\\20.16333\\-131.3021\\11\\21.02596\\-129.349\\11\\23.16127\\-128.2673\\11\\25.1144\\-127.8667\\11\\27.06752\\-128.1649\\11\\29.1268\\-127.3959\\11\\30.97377\\-126.8902\\11\\32.9269\\-127.6777\\11\\34.88002\\-127.1484\\11\\36.83315\\-126.7534\\11\\40.7394\\-125.8297\\11\\42.08547\\-127.3959\\11\\42.69252\\-128.5419\\11\\43.91323\\-127.3959\\11\\44.35803\\-125.4428\\11\\44.51021\\-123.4896\\11\\45.3913\\-121.5365\\11\\45.57636\\-119.5834\\11\\46.77316\\-117.6303\\11\\47.50624\\-115.6771\\11\\47.46832\\-113.724\\11\\45.82586\\-109.8178\\11\\45.28569\\-107.8646\\11\\46.11049\\-105.9115\\11\\46.59877\\-105.5445\\11\\48.5519\\-105.4956\\11\\50.50502\\-106.1792\\11\\52.45815\\-107.3701\\11\\54.59827\\-109.8178\\11\\55.71907\\-111.7709\\11\\58.31752\\-114.6295\\11\\60.57461\\-117.6303\\11\\61.35305\\-119.5834\\11\\62.99245\\-121.5365\\11\\63.19605\\-123.4896\\11\\64.21446\\-125.4428\\11\\64.89133\\-127.3959\\11\\65.10439\\-129.349\\11\\65.47327\\-131.3021\\11\\65.98781\\-133.2553\\11\\66.76855\\-135.2084\\11\\67.01118\\-139.1146\\11\\68.08315\\-141.1776\\11\\68.9455\\-143.0209\\11\\72.04158\\-148.8803\\11\\72.98171\\-150.8334\\11\\74.09113\\-152.7865\\11\\74.93484\\-154.7396\\11\\76.54481\\-156.6928\\11\\80.45811\\-160.599\\11\\82.01411\\-162.5521\\11\\82.82481\\-164.5053\\11\\85.66128\\-167.5655\\11\\87.707\\-168.4115\\11\\89.56753\\-171.0695\\11\\90.36505\\-172.3178\\11\\92.31172\\-174.2709\\11\\93.18081\\-176.224\\11\\93.32516\\-178.1771\\11\\94.36733\\-180.1303\\11\\94.73785\\-182.0834\\11\\94.79837\\-184.0365\\11\\95.40419\\-185.9896\\11\\94.80545\\-187.9428\\11\\94.83655\\-189.8959\\11\\94.24107\\-193.8021\\11\\94.07971\\-195.7553\\11\\93.29939\\-197.7084\\11\\92.71788\\-199.6615\\11\\92.74136\\-201.6146\\11\\93.18081\\-203.5678\\11\\93.18081\\-205.5209\\11\\92.93317\\-209.4271\\11\\91.65453\\-211.3803\\11\\89.56753\\-212.5843\\11" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "160" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "408" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-88.16685\\-216.3311\\13\\-89.53915\\-215.2865\\13\\-90.59082\\-213.3334\\13\\-89.05895\\-211.3803\\13\\-87.0754\\-209.4271\\13\\-86.32387\\-207.474\\13\\-88.16685\\-205.9128\\13\\-90.11997\\-204.9747\\13\\-92.0731\\-204.5399\\13\\-93.1522\\-203.5678\\13\\-94.85468\\-201.6146\\13\\-96.00206\\-199.6615\\13\\-96.91049\\-197.7084\\13\\-97.61766\\-195.7553\\13\\-97.15976\\-193.8021\\13\\-96.88828\\-191.849\\13\\-97.17786\\-189.8959\\13\\-97.83774\\-187.9428\\13\\-97.60696\\-185.9896\\13\\-96.87308\\-184.0365\\13\\-95.97172\\-182.0834\\13\\-95.75555\\-180.1303\\13\\-94.02622\\-176.3165\\13\\-91.8614\\-172.3178\\13\\-90.92139\\-170.3646\\13\\-88.16685\\-167.5872\\13\\-87.13763\\-166.4584\\13\\-85.78835\\-164.5053\\13\\-85.21065\\-162.5521\\13\\-83.4204\\-160.599\\13\\-82.67682\\-158.6459\\13\\-82.30747\\-158.2159\\13\\-80.35435\\-155.2547\\13\\-79.87233\\-154.7396\\13\\-79.1455\\-152.7865\\13\\-78.67176\\-150.8334\\13\\-77.443\\-148.8803\\13\\-77.1623\\-146.9271\\13\\-76.70719\\-144.974\\13\\-75.49985\\-143.0209\\13\\-75.19672\\-141.0678\\13\\-74.76551\\-139.1146\\13\\-74.10563\\-137.1615\\13\\-73.55544\\-135.2084\\13\\-73.30915\\-133.2553\\13\\-72.87794\\-131.3021\\13\\-72.14493\\-129.349\\13\\-71.61246\\-127.3959\\13\\-71.28416\\-125.4428\\13\\-70.64091\\-123.4896\\13\\-68.71637\\-119.5834\\13\\-66.73466\\-115.6771\\13\\-65.64188\\-113.724\\13\\-64.72935\\-112.8262\\13\\-63.33723\\-111.7709\\13\\-60.8231\\-109.4795\\13\\-58.86998\\-108.672\\13\\-56.91685\\-108.9622\\13\\-55.92995\\-109.8178\\13\\-55.25669\\-111.7709\\13\\-55.22281\\-115.6771\\13\\-54.94084\\-117.6303\\13\\-54.15158\\-119.5834\\13\\-53.81084\\-121.5365\\13\\-53.63205\\-123.4896\\13\\-53.13267\\-125.4428\\13\\-52.94611\\-127.3959\\13\\-52.92065\\-129.349\\13\\-51.05748\\-131.2888\\13\\-50.33502\\-129.349\\13\\-50.09035\\-127.3959\\13\\-49.36244\\-123.4896\\13\\-50.27523\\-121.5365\\13\\-50.83368\\-119.5834\\13\\-49.44373\\-117.6303\\13\\-49.10435\\-117.3091\\13\\-47.15123\\-117.1449\\13\\-45.1981\\-118.4603\\13\\-43.24498\\-118.7099\\13\\-41.29185\\-119.3596\\13\\-39.33873\\-120.2432\\13\\-37.54358\\-119.5834\\13\\-37.23214\\-119.5834\\13\\-35.43248\\-120.3288\\13\\-29.72682\\-123.4896\\13\\-27.61998\\-124.8857\\13\\-25.66685\\-125.0789\\13\\-24.07645\\-125.4428\\13\\-21.7606\\-126.6311\\13\\-19.80748\\-126.6311\\13\\-17.85435\\-126.9113\\13\\-17.22587\\-127.3959\\13\\-15.90123\\-129.3881\\13\\-17.85435\\-130.0786\\13\\-19.80748\\-130.5697\\13\\-20.65383\\-131.3021\\13\\-21.7606\\-131.7006\\13\\-24.26936\\-133.2553\\13\\-27.61998\\-134.4987\\13\\-28.70815\\-135.2084\\13\\-27.61998\\-135.9701\\13\\-25.66685\\-137.6054\\13\\-23.71373\\-138.1339\\13\\-21.7606\\-138.4294\\13\\-21.07158\\-139.1146\\13\\-21.39126\\-141.0678\\13\\-21.7606\\-141.4468\\13\\-23.71373\\-142.3994\\13\\-25.66685\\-143.1156\\13\\-27.61998\\-143.2914\\13\\-29.5731\\-143.8454\\13\\-31.52623\\-144.0401\\13\\-33.47935\\-143.7242\\13\\-35.43248\\-142.3648\\13\\-37.3856\\-142.1946\\13\\-39.33873\\-142.2206\\13\\-41.29185\\-142.524\\13\\-43.24498\\-144.0813\\13\\-45.1981\\-144.9663\\13\\-47.15123\\-144.2375\\13\\-48.35439\\-143.0209\\13\\-49.10435\\-141.8089\\13\\-50.04762\\-141.0678\\13\\-51.05748\\-140.5481\\13\\-53.0106\\-142.4204\\13\\-54.96373\\-143.3716\\13\\-56.91685\\-143.4921\\13\\-58.17825\\-144.974\\13\\-59.52766\\-146.9271\\13\\-61.98277\\-150.8334\\13\\-62.66772\\-152.7865\\13\\-63.85582\\-154.7396\\13\\-64.04031\\-156.6928\\13\\-64.32295\\-162.5521\\13\\-64.41454\\-166.4584\\13\\-65.24303\\-168.4115\\13\\-65.61507\\-170.3646\\13\\-65.66743\\-176.224\\13\\-66.36374\\-178.1771\\13\\-66.95301\\-180.1303\\13\\-66.97741\\-182.0834\\13\\-67.51588\\-184.0365\\13\\-67.46042\\-187.9428\\13\\-68.2405\\-189.8959\\13\\-68.6356\\-190.4407\\13\\-70.41212\\-193.8021\\13\\-72.54185\\-194.8723\\13\\-74.49497\\-195.9913\\13\\-76.4481\\-198.1486\\13\\-77.46783\\-199.6615\\13\\-79.05735\\-201.6146\\13\\-79.49187\\-203.5678\\13\\-81.07314\\-205.5209\\13\\-81.50352\\-207.474\\13\\-82.53339\\-209.4271\\13\\-83.10648\\-211.3803\\13\\-83.42419\\-213.3334\\13\\-83.87366\\-215.2865\\13\\-84.2606\\-215.7167\\13\\-86.21372\\-216.7396\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "409" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "9.489399\\-131.584\\13\\7.536274\\-130.3194\\13\\5.583149\\-129.7434\\13\\5.196209\\-129.349\\13\\5.583149\\-128.4168\\13\\6.469765\\-127.3959\\13\\7.536274\\-126.9163\\13\\8.933768\\-127.3959\\13\\9.489399\\-127.7351\\13\\11.33663\\-129.349\\13\\11.64196\\-131.3021\\13\\11.44252\\-131.5016\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "148" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "410" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "17.3019\\-219.9909\\13\\15.34877\\-218.844\\13\\13.39565\\-218.3167\\13\\11.44252\\-217.9955\\13\\7.536274\\-217.8245\\13\\5.583149\\-216.8744\\13\\3.630024\\-214.9182\\13\\2.808824\\-213.3334\\13\\2.011525\\-211.3803\\13\\0.9145823\\-209.4271\\13\\0.7895203\\-205.5209\\13\\0.4536789\\-203.5678\\13\\-0.8742334\\-201.6146\\13\\-1.418709\\-199.6615\\13\\-3.186284\\-197.7084\\13\\-3.945965\\-195.7553\\13\\-3.469849\\-193.8021\\13\\-3.127789\\-191.849\\13\\-3.127789\\-187.9428\\13\\-3.726747\\-185.9896\\13\\-4.182476\\-185.3682\\13\\-4.290983\\-184.0365\\13\\-4.890484\\-182.0834\\13\\-5.797315\\-178.1771\\13\\-5.923899\\-176.224\\13\\-7.711942\\-172.3178\\13\\-8.088726\\-171.8486\\13\\-10.04185\\-173.7493\\13\\-11.88054\\-176.224\\13\\-13.9481\\-178.4352\\13\\-15.90123\\-178.9937\\13\\-17.85435\\-179.2359\\13\\-19.80748\\-179.0296\\13\\-21.7606\\-179.0084\\13\\-23.71373\\-180.342\\13\\-25.66685\\-180.6185\\13\\-29.5731\\-180.6185\\13\\-31.52623\\-180.2657\\13\\-33.47935\\-179.0016\\13\\-35.43248\\-178.8677\\13\\-37.3856\\-178.2992\\13\\-39.33873\\-177.0975\\13\\-41.29185\\-176.9846\\13\\-43.24498\\-175.8467\\13\\-45.1981\\-175.0511\\13\\-46.22085\\-174.2709\\13\\-48.05844\\-172.3178\\13\\-49.99673\\-170.3646\\13\\-51.69774\\-168.4115\\13\\-53.0106\\-167.4103\\13\\-54.96373\\-167.2947\\13\\-55.74033\\-166.4584\\13\\-55.54424\\-164.5053\\13\\-54.29364\\-162.5521\\13\\-53.98716\\-160.599\\13\\-53.01841\\-158.6459\\13\\-51.73707\\-156.6928\\13\\-51.05748\\-154.877\\13\\-49.8651\\-152.7865\\13\\-47.15123\\-149.2696\\13\\-45.1981\\-147.7989\\13\\-43.24498\\-147.371\\13\\-39.33873\\-147.3525\\13\\-37.3856\\-147.7822\\13\\-35.43248\\-147.9691\\13\\-31.52623\\-148.016\\13\\-29.5731\\-148.371\\13\\-27.61998\\-149.0023\\13\\-23.71373\\-149.0023\\13\\-21.7606\\-148.5012\\13\\-19.80748\\-148.395\\13\\-15.90123\\-149.5295\\13\\-13.9481\\-150.7258\\13\\-11.4195\\-154.7396\\13\\-10.71135\\-156.6928\\13\\-10.21624\\-158.6459\\13\\-9.933344\\-160.599\\13\\-8.99727\\-162.5521\\13\\-7.259236\\-164.5053\\13\\-6.189427\\-166.4584\\13\\-4.182476\\-168.5092\\13\\-3.22873\\-170.3646\\13\\-2.999805\\-172.3178\\13\\-2.403737\\-174.2709\\13\\-2.403737\\-176.224\\13\\-2.067761\\-180.1303\\13\\-2.067761\\-191.849\\13\\-1.925388\\-193.8021\\13\\-0.276226\\-195.5195\\13\\1.676899\\-195.0535\\13\\3.630024\\-194.7545\\13\\5.583149\\-193.9599\\13\\7.536274\\-192.9644\\13\\9.489399\\-192.5722\\13\\11.44252\\-191.9592\\13\\13.39565\\-191.6252\\13\\15.34877\\-190.8123\\13\\17.3019\\-189.6368\\13\\21.20815\\-188.7324\\13\\23.16127\\-188.1713\\13\\25.1144\\-189.0231\\13\\27.06752\\-189.6368\\13\\29.02065\\-189.6602\\13\\30.97377\\-190.6141\\13\\32.9269\\-191.3189\\13\\34.88002\\-191.2784\\13\\36.86761\\-189.8959\\13\\38.78627\\-189.0638\\13\\40.7394\\-187.9052\\13\\42.69252\\-187.3003\\13\\44.64565\\-187.3965\\13\\46.59877\\-187.9052\\13\\48.5519\\-188.9779\\13\\50.50502\\-189.3183\\13\\51.64631\\-189.8959\\13\\53.73674\\-191.849\\13\\54.41127\\-192.6879\\13\\54.91659\\-193.8021\\13\\55.17438\\-195.7553\\13\\56.3644\\-197.0363\\13\\58.31752\\-198.8282\\13\\60.91999\\-201.6146\\13\\61.34531\\-203.5678\\13\\60.97594\\-205.5209\\13\\60.27065\\-206.2407\\13\\58.31752\\-206.734\\13\\57.24286\\-205.5209\\13\\57.46904\\-203.5678\\13\\56.3644\\-202.567\\13\\54.41127\\-202.7669\\13\\53.57035\\-203.5678\\13\\53.12765\\-205.5209\\13\\52.45815\\-206.7579\\13\\50.50502\\-209.5636\\13\\49.42894\\-211.3803\\13\\48.5519\\-212.2409\\13\\46.59877\\-213.3856\\13\\42.69252\\-215.3673\\13\\40.7394\\-215.9883\\13\\38.78627\\-216.2966\\13\\36.83315\\-216.7335\\13\\34.88002\\-217.2918\\13\\32.9269\\-218.2212\\13\\30.97377\\-219.7959\\13\\29.02065\\-220.7344\\13\\27.06752\\-220.8754\\13\\21.20815\\-220.8754\\13\\19.25502\\-220.7274\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "136" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "411" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "87.6144\\-214.1497\\13\\86.72513\\-213.3334\\13\\85.09934\\-211.3803\\13\\84.86104\\-209.4271\\13\\84.43317\\-207.474\\13\\82.71524\\-205.5209\\13\\80.73618\\-203.5678\\13\\79.49591\\-201.6146\\13\\78.60432\\-199.6615\\13\\77.84878\\-198.864\\13\\75.89565\\-197.1773\\13\\73.94253\\-196.1445\\13\\73.48249\\-195.7553\\13\\71.8063\\-193.8021\\13\\70.81194\\-191.849\\13\\69.63052\\-189.8959\\13\\68.9047\\-187.9428\\13\\67.68851\\-185.9896\\13\\66.96781\\-184.0365\\13\\66.87486\\-182.0834\\13\\66.13003\\-180.1727\\13\\65.01755\\-178.1771\\13\\64.50893\\-176.224\\13\\63.36609\\-174.2709\\13\\63.14466\\-170.3646\\13\\62.90025\\-168.4115\\13\\61.99998\\-166.4584\\13\\63.84506\\-164.5053\\13\\64.1769\\-164.2646\\13\\65.28219\\-162.5521\\13\\64.1769\\-161.0511\\13\\57.96924\\-154.7396\\13\\57.31605\\-152.7865\\13\\56.3644\\-151.2943\\13\\52.32845\\-146.9271\\13\\50.1257\\-144.974\\13\\48.5519\\-144.0496\\13\\46.59877\\-144.3837\\13\\44.64565\\-143.8733\\13\\43.89712\\-143.0209\\13\\40.7394\\-140.2002\\13\\38.78627\\-139.9659\\13\\36.83315\\-140.1748\\13\\34.88002\\-141.3496\\13\\32.9269\\-140.422\\13\\30.97377\\-139.9025\\13\\29.02065\\-138.1381\\13\\27.06752\\-136.2561\\13\\25.1144\\-135.8509\\13\\23.16127\\-135.6051\\13\\22.75437\\-135.2084\\13\\20.15997\\-133.2553\\13\\19.90778\\-131.3021\\13\\21.20815\\-130.0286\\13\\23.16127\\-128.8096\\13\\25.1144\\-128.2166\\13\\27.06752\\-128.2635\\13\\29.02065\\-128.0984\\13\\30.97377\\-127.6664\\13\\32.9269\\-127.7107\\13\\34.88002\\-126.6301\\13\\36.83315\\-126.0081\\13\\38.78627\\-125.1172\\13\\40.7394\\-125.0081\\13\\41.18219\\-125.4428\\13\\41.74892\\-127.3959\\13\\42.47782\\-129.349\\13\\42.97545\\-129.349\\13\\44.64565\\-127.0161\\13\\45.36444\\-125.4428\\13\\45.59521\\-123.4896\\13\\46.62221\\-121.5365\\13\\47.40599\\-119.5834\\13\\48.5519\\-117.2006\\13\\49.16619\\-115.6771\\13\\48.5519\\-114.2489\\13\\47.12874\\-111.7709\\13\\44.64565\\-108.885\\13\\43.88403\\-107.8646\\13\\43.86165\\-105.9115\\13\\44.64565\\-104.1537\\13\\46.59877\\-103.4875\\13\\48.5519\\-103.5617\\13\\50.50502\\-104.6559\\13\\52.45815\\-106.4886\\13\\56.3644\\-110.5952\\13\\57.23616\\-111.7709\\13\\58.95584\\-113.724\\13\\60.57461\\-115.6771\\13\\61.18567\\-117.6303\\13\\62.9271\\-119.5834\\13\\63.46803\\-121.5365\\13\\64.1769\\-123.4495\\13\\65.17146\\-125.4428\\13\\65.45001\\-127.3959\\13\\65.58873\\-129.349\\13\\66.44484\\-131.3021\\13\\67.1349\\-133.2553\\13\\67.50837\\-135.2084\\13\\68.08315\\-137.1062\\13\\68.84975\\-139.1146\\13\\69.15407\\-141.0678\\13\\70.21066\\-143.0209\\13\\71.10561\\-144.974\\13\\72.22512\\-146.9271\\13\\73.05967\\-148.8803\\13\\74.25734\\-150.8334\\13\\75.01186\\-152.7865\\13\\76.30205\\-154.7396\\13\\77.30021\\-156.6928\\13\\78.92715\\-158.6459\\13\\80.68772\\-160.599\\13\\82.6167\\-162.5521\\13\\83.93195\\-164.5053\\13\\85.03387\\-166.4584\\13\\85.66128\\-167.0965\\13\\87.6144\\-167.9768\\13\\88.09936\\-168.4115\\13\\89.16113\\-170.3646\\13\\90.4174\\-172.3178\\13\\92.31172\\-174.2709\\13\\93.18081\\-176.224\\13\\93.19195\\-178.1771\\13\\94.28349\\-180.1303\\13\\94.65398\\-182.0834\\13\\94.69689\\-185.9896\\13\\94.13015\\-187.9428\\13\\94.06844\\-191.849\\13\\93.55515\\-193.8021\\13\\93.18081\\-197.7084\\13\\93.0484\\-199.6615\\13\\93.18081\\-203.5678\\13\\93.16981\\-209.4271\\13\\92.55202\\-211.3803\\13\\91.52065\\-212.4012\\13\\89.56753\\-213.7483\\13" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "412" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-90.11997\\-216.2631\\15\\-91.12308\\-215.2865\\15\\-91.28856\\-213.3334\\15\\-88.73223\\-211.3803\\15\\-87.43196\\-209.4271\\15\\-87.33182\\-207.474\\15\\-88.16685\\-206.4632\\15\\-90.11997\\-205.0156\\15\\-92.0731\\-204.8681\\15\\-94.02622\\-203.9128\\15\\-94.36231\\-203.5678\\15\\-95.08379\\-201.6146\\15\\-96.48466\\-199.6615\\15\\-97.61766\\-195.7553\\15\\-97.12798\\-193.8021\\15\\-97.03949\\-191.849\\15\\-97.48588\\-189.8959\\15\\-97.6395\\-187.9428\\15\\-97.59639\\-185.9896\\15\\-96.11478\\-182.0834\\15\\-95.89858\\-180.1303\\15\\-95.10873\\-178.1771\\15\\-94.47012\\-176.224\\15\\-92.9474\\-174.2709\\15\\-90.92139\\-170.3646\\15\\-89.05784\\-168.4115\\15\\-87.3885\\-166.4584\\15\\-86.54981\\-164.5053\\15\\-85.40068\\-162.5521\\15\\-84.47231\\-160.599\\15\\-83.37241\\-158.6459\\15\\-82.54649\\-156.6928\\15\\-81.35719\\-154.7396\\15\\-80.49078\\-152.7865\\15\\-79.36505\\-150.8334\\15\\-78.84512\\-148.8803\\15\\-77.87011\\-146.9271\\15\\-76.90108\\-143.0209\\15\\-76.01475\\-141.0678\\15\\-75.48045\\-139.1146\\15\\-75.05691\\-137.1615\\15\\-74.44239\\-135.2084\\15\\-74.12084\\-133.2553\\15\\-72.46047\\-127.3959\\15\\-72.14747\\-125.4428\\15\\-71.56055\\-123.4896\\15\\-70.58872\\-121.4361\\15\\-68.61271\\-117.6303\\15\\-67.69222\\-115.6771\\15\\-66.68247\\-113.8684\\15\\-64.56396\\-111.7709\\15\\-62.77623\\-110.7446\\15\\-58.86998\\-109.2919\\15\\-57.90403\\-109.8178\\15\\-56.91685\\-110.6995\\15\\-56.22715\\-111.7709\\15\\-55.99509\\-113.724\\15\\-55.76928\\-117.6303\\15\\-55.0858\\-121.5365\\15\\-54.32952\\-123.4896\\15\\-53.18499\\-127.3959\\15\\-53.00156\\-129.349\\15\\-51.05748\\-130.9277\\15\\-49.74522\\-129.349\\15\\-48.96891\\-127.3959\\15\\-49.27874\\-125.4428\\15\\-49.11198\\-123.4896\\15\\-50.09943\\-121.5365\\15\\-50.18571\\-119.5834\\15\\-49.10435\\-118.5475\\15\\-47.15123\\-118.2588\\15\\-45.1981\\-118.4143\\15\\-43.24498\\-118.3898\\15\\-41.29185\\-118.6477\\15\\-39.33873\\-118.7688\\15\\-37.3856\\-118.6606\\15\\-35.43248\\-118.9341\\15\\-33.47935\\-120.6116\\15\\-29.5731\\-121.0146\\15\\-27.61998\\-121.266\\15\\-25.66685\\-121.8262\\15\\-23.71373\\-122.7399\\15\\-21.7606\\-124.5042\\15\\-19.80748\\-124.7164\\15\\-17.85435\\-125.1388\\15\\-15.90123\\-126.777\\15\\-13.9481\\-128.1088\\15\\-11.99498\\-128.379\\15\\-10.04185\\-129.0235\\15\\-8.088726\\-129.2824\\15\\-5.915087\\-129.349\\15\\-4.182476\\-130.659\\15\\-2.229351\\-130.9458\\15\\-0.276226\\-130.7162\\15\\1.005512\\-129.349\\15\\3.630024\\-128.5235\\15\\5.583149\\-126.8186\\15\\7.536274\\-126.7328\\15\\9.489399\\-128.1821\\15\\11.44252\\-129.1734\\15\\13.32477\\-131.3021\\15\\12.89368\\-133.2553\\15\\11.44252\\-134.1131\\15\\9.489399\\-133.3638\\15\\7.536274\\-132.3701\\15\\3.630024\\-132.2787\\15\\1.676899\\-132.0466\\15\\-0.276226\\-131.6491\\15\\-6.135601\\-131.6277\\15\\-10.04185\\-131.5631\\15\\-13.9481\\-131.0336\\15\\-17.85435\\-131.6989\\15\\-19.80748\\-131.773\\15\\-21.7606\\-132.337\\15\\-23.71373\\-133.6806\\15\\-25.66685\\-134.7237\\15\\-26.115\\-135.2084\\15\\-26.33008\\-137.1615\\15\\-26.05885\\-139.1146\\15\\-25.66685\\-140.2743\\15\\-24.78113\\-141.0678\\15\\-29.5731\\-142.8214\\15\\-31.52623\\-143.1258\\15\\-33.47935\\-142.7562\\15\\-34.73396\\-141.0678\\15\\-35.43248\\-140.483\\15\\-37.3856\\-140.6784\\15\\-37.77254\\-141.0678\\15\\-40.69408\\-143.0209\\15\\-41.29185\\-143.5977\\15\\-43.24498\\-144.4915\\15\\-45.1981\\-145.8648\\15\\-47.15123\\-145.6808\\15\\-47.89071\\-144.974\\15\\-49.58653\\-143.0209\\15\\-51.05748\\-141.8615\\15\\-52.34355\\-143.0209\\15\\-53.92696\\-144.974\\15\\-54.96373\\-145.839\\15\\-56.91685\\-146.1626\\15\\-57.58859\\-146.9271\\15\\-58.97236\\-148.8803\\15\\-60.10064\\-150.8334\\15\\-61.48339\\-152.7865\\15\\-62.14769\\-154.7396\\15\\-63.46344\\-156.6928\\15\\-63.83141\\-158.6459\\15\\-63.94535\\-160.599\\15\\-64.29466\\-162.5521\\15\\-64.41454\\-164.5053\\15\\-65.28347\\-166.4584\\15\\-65.85023\\-168.4115\\15\\-66.29309\\-170.3646\\15\\-66.31313\\-172.3178\\15\\-67.0145\\-174.2709\\15\\-67.49352\\-176.224\\15\\-67.84505\\-178.1771\\15\\-67.99007\\-180.1303\\15\\-69.42243\\-184.0365\\15\\-69.58595\\-187.9428\\15\\-70.7642\\-189.8959\\15\\-72.54185\\-191.9543\\15\\-74.49497\\-193.0222\\15\\-75.38474\\-193.8021\\15\\-76.82513\\-195.7553\\15\\-77.62968\\-197.7084\\15\\-79.07072\\-199.6615\\15\\-79.5959\\-201.6146\\15\\-81.07938\\-203.5678\\15\\-81.73017\\-207.474\\15\\-82.98079\\-209.4271\\15\\-83.42805\\-211.3803\\15\\-83.91408\\-215.2865\\15\\-84.2606\\-215.6621\\15\\-86.21372\\-216.9141\\15\\-88.16685\\-216.8602\\15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "145" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "413" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "17.3019\\-220.0581\\15\\15.34877\\-219.0058\\15\\13.39565\\-218.9204\\15\\9.489399\\-218.8826\\15\\7.536274\\-218.7663\\15\\5.583149\\-218.2551\\15\\4.048551\\-217.2396\\15\\1.676899\\-214.7342\\15\\0.8592031\\-213.3334\\15\\0.07952174\\-211.3803\\15\\-1.099892\\-209.4271\\15\\-1.149214\\-205.5209\\15\\-1.248309\\-203.5678\\15\\-1.573059\\-201.6146\\15\\-2.221722\\-199.6615\\15\\-3.248997\\-197.7084\\15\\-3.969283\\-195.7553\\15\\-3.921415\\-193.8021\\15\\-3.469849\\-191.849\\15\\-3.726747\\-189.8959\\15\\-4.182476\\-189.4076\\15\\-4.331083\\-187.9428\\15\\-4.897635\\-185.9896\\15\\-5.186291\\-184.0365\\15\\-5.626853\\-182.0834\\15\\-7.908274\\-178.1771\\15\\-8.088726\\-177.0704\\15\\-8.396162\\-178.1771\\15\\-9.859416\\-180.1303\\15\\-11.99498\\-182.2633\\15\\-13.9481\\-183.7296\\15\\-14.51348\\-184.0365\\15\\-15.90123\\-184.274\\15\\-17.85435\\-184.4012\\15\\-19.80748\\-184.2393\\15\\-21.7606\\-183.1373\\15\\-23.71373\\-184.1662\\15\\-25.66685\\-184.505\\15\\-29.5731\\-184.505\\15\\-31.52623\\-184.0912\\15\\-33.47935\\-182.8934\\15\\-35.43248\\-182.5909\\15\\-37.3856\\-182.1803\\15\\-39.33873\\-180.2888\\15\\-43.24498\\-178.2453\\15\\-45.1981\\-176.7639\\15\\-47.15123\\-174.8621\\15\\-49.10435\\-172.4445\\15\\-51.57777\\-170.3646\\15\\-53.0106\\-169.3179\\15\\-53.90627\\-168.4115\\15\\-54.71453\\-166.4584\\15\\-54.05616\\-164.5053\\15\\-52.87417\\-162.5521\\15\\-52.14312\\-160.599\\15\\-51.57954\\-158.6459\\15\\-50.25758\\-154.7396\\15\\-49.43201\\-152.7865\\15\\-47.15123\\-150.4388\\15\\-44.75342\\-148.8803\\15\\-43.24498\\-148.0641\\15\\-39.33873\\-148.0752\\15\\-37.3856\\-148.6412\\15\\-35.43248\\-149.6509\\15\\-33.47935\\-149.9231\\15\\-29.5731\\-150.1802\\15\\-23.71373\\-150.2238\\15\\-19.80748\\-150.1802\\15\\-17.85435\\-150.3105\\15\\-15.90123\\-151.3992\\15\\-14.45656\\-152.7865\\15\\-13.1964\\-154.7396\\15\\-12.26551\\-156.6928\\15\\-10.80768\\-158.6459\\15\\-10.22885\\-160.599\\15\\-9.198874\\-162.5521\\15\\-8.036141\\-164.5053\\15\\-7.658267\\-166.4584\\15\\-6.551004\\-168.4115\\15\\-5.024696\\-170.3646\\15\\-4.252789\\-172.3178\\15\\-3.257997\\-174.2709\\15\\-3.231726\\-176.224\\15\\-3.024892\\-178.1771\\15\\-2.441053\\-180.1303\\15\\-2.447145\\-182.0834\\15\\-2.067761\\-185.9896\\15\\-2.067761\\-189.8959\\15\\-1.925388\\-191.849\\15\\-1.269247\\-193.8021\\15\\-0.276226\\-194.6949\\15\\3.630024\\-192.9554\\15\\5.583149\\-192.4623\\15\\7.536274\\-191.8263\\15\\9.489399\\-191.6252\\15\\11.44252\\-191.1795\\15\\13.39565\\-190.9466\\15\\15.34877\\-190.5344\\15\\17.3019\\-189.6368\\15\\19.25502\\-189.4799\\15\\21.20815\\-188.9281\\15\\23.16127\\-188.0648\\15\\25.1144\\-189.0085\\15\\27.06752\\-189.6368\\15\\29.02065\\-189.6484\\15\\30.97377\\-189.8583\\15\\32.9269\\-190.6085\\15\\34.88002\\-189.6797\\15\\36.88681\\-187.9428\\15\\38.78627\\-187.1313\\15\\40.7394\\-186.68\\15\\42.69252\\-185.4677\\15\\44.64565\\-185.1948\\15\\46.59877\\-185.2632\\15\\48.5519\\-185.4843\\15\\50.50502\\-186.5569\\15\\52.45815\\-188.2808\\15\\54.41127\\-190.1826\\15\\56.01403\\-191.849\\15\\57.0339\\-193.8021\\15\\57.09682\\-195.7553\\15\\57.97166\\-197.7084\\15\\60.27065\\-200.0351\\15\\62.89709\\-203.5678\\15\\60.27065\\-206.0003\\15\\58.38728\\-205.5209\\15\\59.10152\\-203.5678\\15\\58.31752\\-202.6651\\15\\56.3644\\-202.4406\\15\\55.19347\\-203.5678\\15\\54.61951\\-205.5209\\15\\53.49543\\-207.474\\15\\51.93081\\-209.4271\\15\\50.80397\\-211.3803\\15\\48.5519\\-213.4419\\15\\46.59877\\-214.4037\\15\\44.64565\\-215.4982\\15\\42.69252\\-216.3008\\15\\40.7394\\-216.7426\\15\\36.83315\\-217.0039\\15\\36.43103\\-217.2396\\15\\32.9269\\-218.8034\\15\\30.97377\\-219.9771\\15\\29.02065\\-220.8868\\15\\19.25502\\-220.8868\\15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "142" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "414" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "87.6144\\-213.8827\\15\\85.66128\\-212.0553\\15\\85.09934\\-211.3803\\15\\84.70711\\-209.4271\\15\\83.39333\\-207.474\\15\\82.72752\\-205.5209\\15\\80.92381\\-203.5678\\15\\80.50365\\-201.6146\\15\\77.84878\\-197.9066\\15\\75.73431\\-195.7553\\15\\73.94253\\-192.5366\\15\\71.91093\\-189.8959\\15\\70.854\\-187.9428\\15\\70.03628\\-186.0574\\15\\68.90276\\-184.0365\\15\\68.73224\\-180.1303\\15\\68.08315\\-178.9258\\15\\66.13003\\-176.1788\\15\\65.08406\\-174.2709\\15\\64.95287\\-172.3178\\15\\64.50242\\-170.3646\\15\\63.33535\\-168.4115\\15\\62.78886\\-166.4584\\15\\61.34808\\-164.5053\\15\\62.22377\\-163.4081\\15\\63.47815\\-162.5521\\15\\62.22377\\-161.253\\15\\61.76885\\-160.599\\15\\60.27065\\-158.8883\\15\\56.20785\\-154.7396\\15\\55.13308\\-152.7865\\15\\53.84405\\-150.8334\\15\\52.97938\\-148.8803\\15\\50.50502\\-146.4731\\15\\48.5519\\-145.966\\15\\46.59877\\-145.7523\\15\\44.64565\\-144.2921\\15\\43.57235\\-143.0209\\15\\42.69252\\-142.1692\\15\\40.7394\\-140.5541\\15\\38.78627\\-140.1324\\15\\36.83315\\-140.4116\\15\\34.88002\\-141.5474\\15\\32.9269\\-141.3933\\15\\30.97377\\-140.2156\\15\\29.75179\\-139.1146\\15\\27.06752\\-136.3792\\15\\25.1144\\-135.7703\\15\\23.85707\\-135.2084\\15\\21.20815\\-133.7689\\15\\20.61963\\-133.2553\\15\\20.52349\\-131.3021\\15\\21.20815\\-130.6061\\15\\25.1144\\-128.8263\\15\\27.06752\\-128.2543\\15\\29.02065\\-127.8927\\15\\30.97377\\-127.7926\\15\\34.88002\\-126.3124\\15\\36.83315\\-125.0657\\15\\38.78627\\-124.4001\\15\\40.56435\\-123.4896\\15\\40.89149\\-123.4896\\15\\41.80597\\-125.4428\\15\\41.63987\\-127.3959\\15\\40.7394\\-128.8404\\15\\40.28164\\-129.349\\15\\39.94805\\-131.3021\\15\\40.7394\\-132.8669\\15\\42.69252\\-134.1601\\15\\43.53554\\-133.2553\\15\\43.58553\\-131.3021\\15\\44.00755\\-129.349\\15\\45.39647\\-127.3959\\15\\45.85777\\-125.4428\\15\\47.18209\\-123.4896\\15\\48.5519\\-122.3743\\15\\49.38971\\-121.5365\\15\\49.38706\\-115.6771\\15\\48.5519\\-114.0438\\15\\47.16104\\-111.7709\\15\\44.64565\\-109.2505\\15\\41.76271\\-105.9115\\15\\41.83018\\-103.9584\\15\\42.69252\\-102.8413\\15\\44.64565\\-101.6183\\15\\46.59877\\-101.5344\\15\\48.0113\\-102.0053\\15\\50.50502\\-103.1137\\15\\51.65431\\-103.9584\\15\\52.45815\\-104.7257\\15\\54.41127\\-107.168\\15\\55.05629\\-107.8646\\15\\57.18329\\-109.8178\\15\\58.57661\\-111.7709\\15\\59.54747\\-113.724\\15\\61.19342\\-115.6771\\15\\62.27596\\-117.6303\\15\\63.23758\\-119.5834\\15\\63.74221\\-121.5365\\15\\64.95124\\-123.4896\\15\\65.46372\\-125.4428\\15\\65.61634\\-127.3959\\15\\66.13003\\-128.8292\\15\\67.15774\\-131.3021\\15\\67.56648\\-133.2553\\15\\68.4342\\-135.2084\\15\\69.13729\\-137.1615\\15\\69.52502\\-139.1146\\15\\70.03628\\-140.5632\\15\\71.13251\\-143.0209\\15\\72.27122\\-144.974\\15\\73.07716\\-146.9271\\15\\74.29935\\-148.8803\\15\\75.02597\\-150.8334\\15\\76.31159\\-152.7865\\15\\77.20736\\-154.7396\\15\\77.84878\\-155.4301\\15\\80.33203\\-158.6459\\15\\81.07455\\-160.599\\15\\81.75503\\-161.2831\\15\\85.66128\\-165.8203\\15\\88.3817\\-168.4115\\15\\89.80325\\-170.3646\\15\\90.72658\\-172.3178\\15\\92.35996\\-174.2709\\15\\93.18081\\-176.224\\15\\93.28677\\-178.1771\\15\\94.32827\\-180.1303\\15\\95.0205\\-182.0834\\15\\95.0205\\-184.0365\\15\\94.6392\\-185.9896\\15\\94.02789\\-187.9428\\15\\94.06612\\-189.8959\\15\\94.3102\\-191.849\\15\\94.25226\\-193.8021\\15\\93.92676\\-195.7553\\15\\93.39301\\-197.7084\\15\\93.16981\\-201.6146\\15\\93.18081\\-209.4271\\15\\93.03642\\-211.3803\\15\\91.52065\\-212.8336\\15\\89.56753\\-213.661\\15" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "189" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "415" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-215.6211\\17\\-92.38792\\-215.2865\\17\\-92.78111\\-213.3334\\17\\-92.0731\\-212.5997\\17\\-90.11997\\-212.5331\\17\\-88.12929\\-211.3803\\17\\-87.69601\\-209.4271\\17\\-87.68724\\-207.474\\17\\-89.08141\\-205.5209\\17\\-90.11997\\-204.6523\\17\\-92.0731\\-204.7387\\17\\-94.02622\\-204.6534\\17\\-95.01635\\-203.5678\\17\\-95.65383\\-201.6146\\17\\-96.79315\\-199.6615\\17\\-97.42421\\-197.7084\\17\\-97.61766\\-195.7553\\17\\-97.59639\\-193.8021\\17\\-97.77089\\-191.849\\17\\-97.62851\\-187.9428\\17\\-97.60696\\-185.9896\\17\\-97.03875\\-184.0365\\17\\-96.61489\\-180.1303\\17\\-94.83424\\-176.224\\17\\-93.26\\-174.2709\\17\\-92.46983\\-172.3178\\17\\-90.9886\\-170.3646\\17\\-89.36993\\-168.4115\\17\\-88.40257\\-166.4584\\17\\-88.16685\\-166.2033\\17\\-86.21372\\-163.1958\\17\\-85.71688\\-162.5521\\17\\-85.15205\\-160.599\\17\\-83.73047\\-158.6459\\17\\-83.19147\\-156.6928\\17\\-81.77734\\-154.7396\\17\\-81.21575\\-152.7865\\17\\-79.86607\\-150.8334\\17\\-79.37361\\-148.8803\\17\\-79.02267\\-146.9271\\17\\-78.01184\\-144.974\\17\\-77.42899\\-143.0209\\17\\-77.06955\\-141.0678\\17\\-76.17573\\-139.1146\\17\\-75.51186\\-137.1615\\17\\-75.32637\\-135.2084\\17\\-74.94796\\-133.2553\\17\\-74.17808\\-131.3021\\17\\-73.59673\\-129.349\\17\\-73.37701\\-127.3959\\17\\-72.94825\\-125.4428\\17\\-71.30589\\-121.5365\\17\\-70.22961\\-119.5834\\17\\-69.32647\\-117.6303\\17\\-68.24622\\-115.6771\\17\\-67.32437\\-113.724\\17\\-65.78301\\-111.7709\\17\\-64.72935\\-110.7943\\17\\-62.77623\\-110.3829\\17\\-60.8231\\-110.6802\\17\\-59.71695\\-111.7709\\17\\-58.26036\\-113.724\\17\\-57.82141\\-115.6771\\17\\-57.63105\\-119.5834\\17\\-57.03892\\-121.5365\\17\\-55.92085\\-123.4896\\17\\-55.12532\\-125.4428\\17\\-53.74174\\-127.3959\\17\\-53.18499\\-129.349\\17\\-53.0106\\-129.6173\\17\\-51.05748\\-130.6145\\17\\-49.86932\\-129.349\\17\\-49.77089\\-127.3959\\17\\-49.99991\\-125.4428\\17\\-49.52029\\-123.4896\\17\\-49.75023\\-121.5365\\17\\-49.4124\\-119.5834\\17\\-49.10435\\-119.2733\\17\\-47.15123\\-118.4754\\17\\-45.1981\\-118.4087\\17\\-43.24498\\-117.4675\\17\\-41.29185\\-117.1956\\17\\-39.33873\\-118.3454\\17\\-37.3856\\-118.4087\\17\\-35.43248\\-118.6897\\17\\-33.47935\\-120.2497\\17\\-31.52623\\-120.4979\\17\\-29.5731\\-120.5795\\17\\-25.66685\\-120.483\\17\\-23.71373\\-120.7015\\17\\-22.30843\\-121.5365\\17\\-21.7606\\-122.0213\\17\\-19.65155\\-123.4896\\17\\-17.85435\\-124.4618\\17\\-16.44376\\-125.4428\\17\\-15.90123\\-125.9616\\17\\-13.9481\\-126.9895\\17\\-11.99498\\-127.6228\\17\\-8.088726\\-128.0083\\17\\-6.135601\\-128.0193\\17\\-2.229351\\-128.5668\\17\\-0.276226\\-128.3585\\17\\1.676899\\-127.9773\\17\\3.630024\\-127.7573\\17\\5.583149\\-126.9612\\17\\7.536274\\-127.2089\\17\\9.489399\\-128.8058\\17\\11.44252\\-129.9339\\17\\13.39565\\-130.7809\\17\\13.89542\\-131.3021\\17\\14.21776\\-133.2553\\17\\13.39565\\-134.3016\\17\\11.44252\\-135.8577\\17\\9.489399\\-134.7514\\17\\7.536274\\-134.3769\\17\\5.583149\\-134.3851\\17\\3.630024\\-135.1043\\17\\-0.276226\\-135.1043\\17\\-2.229351\\-135.2618\\17\\-6.135601\\-135.1827\\17\\-8.088726\\-134.0396\\17\\-10.04185\\-133.5914\\17\\-11.99498\\-132.3689\\17\\-13.9481\\-131.7275\\17\\-15.90123\\-131.6382\\17\\-19.80748\\-131.7551\\17\\-21.7606\\-132.1098\\17\\-23.71373\\-132.9583\\17\\-25.66685\\-134.1602\\17\\-26.62933\\-135.2084\\17\\-27.61998\\-136.9399\\17\\-29.5731\\-137.4244\\17\\-31.52623\\-137.1371\\17\\-33.47935\\-137.6691\\17\\-35.43248\\-139.047\\17\\-37.3856\\-140.6331\\17\\-39.33873\\-142.3784\\17\\-41.29185\\-144.3926\\17\\-42.03145\\-144.974\\17\\-44.9201\\-146.9271\\17\\-45.1981\\-147.2093\\17\\-47.15123\\-147.7\\17\\-47.86296\\-146.9271\\17\\-48.10264\\-144.974\\17\\-48.68379\\-143.0209\\17\\-49.10435\\-142.6539\\17\\-51.05748\\-141.7706\\17\\-52.12225\\-143.0209\\17\\-53.38232\\-144.974\\17\\-54.27126\\-146.9271\\17\\-54.96373\\-147.5727\\17\\-56.91685\\-148.5295\\17\\-58.86998\\-150.2052\\17\\-59.43359\\-150.8334\\17\\-60.03344\\-152.7865\\17\\-61.79514\\-154.7396\\17\\-62.52874\\-156.6928\\17\\-62.96456\\-158.6459\\17\\-63.845\\-160.599\\17\\-64.40383\\-162.5521\\17\\-65.3364\\-164.5053\\17\\-65.87512\\-166.4584\\17\\-67.09842\\-168.4115\\17\\-67.631\\-170.3646\\17\\-67.67828\\-172.3178\\17\\-69.47975\\-176.224\\17\\-69.56947\\-178.1771\\17\\-70.24935\\-180.1303\\17\\-71.30914\\-182.0834\\17\\-71.44252\\-184.0365\\17\\-72.07852\\-185.9896\\17\\-74.30683\\-189.8959\\17\\-76.4481\\-192.0372\\17\\-77.34708\\-193.8021\\17\\-78.18829\\-195.7553\\17\\-79.29175\\-197.7084\\17\\-80.03781\\-199.6615\\17\\-80.35435\\-199.9965\\17\\-81.30576\\-201.6146\\17\\-81.52716\\-203.5678\\17\\-82.0145\\-205.5209\\17\\-82.14589\\-207.474\\17\\-83.2976\\-209.4271\\17\\-83.67574\\-211.3803\\17\\-83.76376\\-213.3334\\17\\-84.88002\\-215.2865\\17\\-86.21372\\-216.5413\\17\\-88.16685\\-217.0039\\17\\-90.11997\\-216.8503\\17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "137" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "416" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "7.536274\\-219.7851\\17\\3.630024\\-218.0355\\17\\0.7859116\\-215.2865\\17\\-0.8051974\\-213.3334\\17\\-1.498207\\-211.3803\\17\\-2.027063\\-209.4271\\17\\-2.792967\\-207.474\\17\\-3.128943\\-205.5209\\17\\-3.27073\\-199.6615\\17\\-3.557686\\-197.7084\\17\\-4.304546\\-195.7553\\17\\-4.331083\\-191.849\\17\\-4.92867\\-189.8959\\17\\-5.305997\\-187.9428\\17\\-6.135601\\-185.8776\\17\\-7.890362\\-184.0365\\17\\-8.226719\\-184.0365\\17\\-10.04185\\-187.0664\\17\\-11.99498\\-189.1104\\17\\-13.9481\\-189.941\\17\\-15.90123\\-190.1648\\17\\-17.85435\\-189.7114\\17\\-19.80748\\-188.5429\\17\\-23.71373\\-187.1311\\17\\-29.5731\\-187.1438\\17\\-31.52623\\-187.0218\\17\\-33.47935\\-186.6473\\17\\-37.3856\\-185.1708\\17\\-39.33873\\-184.677\\17\\-41.29185\\-183.8906\\17\\-45.1981\\-179.9791\\17\\-46.05814\\-178.1771\\17\\-47.15123\\-176.3958\\17\\-49.10435\\-174.2629\\17\\-51.05748\\-173.2712\\17\\-53.0106\\-173.882\\17\\-54.38082\\-172.3178\\17\\-54.42051\\-170.3646\\17\\-54.09196\\-168.4115\\17\\-53.0106\\-166.5168\\17\\-51.74646\\-164.5053\\17\\-51.18518\\-162.5521\\17\\-51.01992\\-160.599\\17\\-50.25354\\-158.6459\\17\\-50.01116\\-156.6928\\17\\-49.3313\\-154.7396\\17\\-47.98164\\-152.7865\\17\\-47.15123\\-152.0642\\17\\-45.1981\\-151.4082\\17\\-43.24498\\-150.0349\\17\\-41.29185\\-149.9501\\17\\-39.33873\\-150.0004\\17\\-37.3856\\-151.0197\\17\\-35.43248\\-151.8567\\17\\-33.47935\\-152.5236\\17\\-31.52623\\-153.58\\17\\-27.61998\\-153.9133\\17\\-25.66685\\-153.943\\17\\-23.71373\\-153.7559\\17\\-21.7606\\-153.6833\\17\\-19.80748\\-153.7559\\17\\-17.85435\\-154.5115\\17\\-15.90123\\-156.4178\\17\\-13.72412\\-158.6459\\17\\-11.99498\\-159.6592\\17\\-10.96063\\-160.599\\17\\-9.545004\\-162.5521\\17\\-8.088726\\-166.3272\\17\\-7.143166\\-168.4115\\17\\-5.743732\\-170.3646\\17\\-5.414683\\-172.3178\\17\\-4.746325\\-174.2709\\17\\-3.805449\\-176.224\\17\\-3.454937\\-178.1771\\17\\-3.270161\\-180.1303\\17\\-3.270161\\-182.0834\\17\\-2.972705\\-184.0365\\17\\-2.093915\\-185.9896\\17\\-1.707395\\-189.8959\\17\\-1.166621\\-191.849\\17\\-0.276226\\-192.7447\\17\\1.676899\\-192.4211\\17\\3.630024\\-191.2717\\17\\5.583149\\-190.9557\\17\\9.489399\\-190.9035\\17\\11.44252\\-190.6179\\17\\13.39565\\-190.0323\\17\\17.3019\\-189.6484\\17\\19.25502\\-189.6141\\17\\21.20815\\-189.1659\\17\\23.16127\\-188.975\\17\\25.1144\\-189.2163\\17\\27.06752\\-189.6368\\17\\30.97377\\-189.6484\\17\\32.9269\\-189.272\\17\\36.83315\\-186.7404\\17\\38.78627\\-185.3973\\17\\42.69252\\-184.7415\\17\\44.64565\\-183.4451\\17\\46.59877\\-183.1328\\17\\48.5519\\-183.4302\\17\\50.50502\\-184.8855\\17\\52.20833\\-185.9896\\17\\56.3644\\-190.1225\\17\\57.46552\\-191.849\\17\\58.08897\\-193.8021\\17\\58.14061\\-195.7553\\17\\59.13804\\-197.7084\\17\\60.27065\\-198.8237\\17\\62.22377\\-200.4831\\17\\63.15769\\-201.6146\\17\\63.37017\\-203.5678\\17\\62.22377\\-204.5819\\17\\60.81124\\-203.5678\\17\\60.27065\\-203.0106\\17\\58.31752\\-202.4115\\17\\56.69423\\-203.5678\\17\\55.55145\\-205.5209\\17\\54.82021\\-207.474\\17\\53.51652\\-209.4271\\17\\51.87467\\-211.3803\\17\\48.5519\\-214.103\\17\\46.59877\\-215.4481\\17\\44.64565\\-216.3291\\17\\42.69252\\-216.8602\\17\\40.7394\\-217.0039\\17\\36.83315\\-217.0158\\17\\36.48663\\-217.2396\\17\\32.54286\\-219.1928\\17\\29.02065\\-220.7891\\17\\27.06752\\-220.8984\\17\\21.20815\\-220.8984\\17\\19.25502\\-220.7891\\17\\15.44753\\-219.1928\\17\\13.39565\\-219.7701\\17\\11.44252\\-220.0088\\17\\9.489399\\-220.0088\\17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "417" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-212.0553\\17\\85.09934\\-211.3803\\17\\84.66671\\-209.4271\\17\\83.17802\\-207.474\\17\\82.43811\\-203.5678\\17\\80.91332\\-201.6146\\17\\80.64825\\-199.6615\\17\\79.8019\\-198.2715\\17\\79.29434\\-197.7084\\17\\78.2056\\-195.7553\\17\\76.98643\\-193.8021\\17\\75.60268\\-191.849\\17\\74.71587\\-189.8959\\17\\73.49014\\-187.9428\\17\\72.72182\\-185.9896\\17\\71.54238\\-184.0365\\17\\70.8613\\-182.0834\\17\\70.34431\\-180.1303\\17\\69.28235\\-178.1771\\17\\68.83221\\-176.224\\17\\67.64234\\-174.2709\\17\\66.9384\\-172.3178\\17\\66.13003\\-170.701\\17\\64.68304\\-168.4115\\17\\63.10539\\-166.4584\\17\\61.34748\\-164.5053\\17\\61.10186\\-160.599\\17\\58.31752\\-157.7028\\17\\55.29858\\-154.7396\\17\\53.69306\\-152.7865\\17\\52.91307\\-150.8334\\17\\51.43052\\-148.8803\\17\\50.50502\\-148.131\\17\\48.5519\\-147.9469\\17\\46.59877\\-146.6512\\17\\44.64565\\-145.8377\\17\\43.90962\\-144.974\\17\\43.36549\\-143.0209\\17\\42.69252\\-142.3444\\17\\40.7394\\-141.899\\17\\38.78627\\-141.8421\\17\\36.83315\\-141.6675\\17\\34.88002\\-141.7881\\17\\32.9269\\-141.6748\\17\\29.02065\\-139.5189\\17\\28.62392\\-139.1146\\17\\27.49552\\-137.1615\\17\\25.1144\\-134.936\\17\\23.16127\\-134.0956\\17\\22.12891\\-133.2553\\17\\22.08191\\-131.3021\\17\\23.16127\\-130.2279\\17\\25.1144\\-129.7457\\17\\27.06752\\-128.451\\17\\29.02065\\-127.8118\\17\\30.97377\\-127.8023\\17\\32.9269\\-126.6661\\17\\34.88002\\-125.8681\\17\\36.83315\\-124.6365\\17\\38.78627\\-123.0367\\17\\40.7394\\-122.5846\\17\\41.91895\\-123.4896\\17\\42.22168\\-125.4428\\17\\41.75068\\-127.3959\\17\\40.16789\\-129.349\\17\\39.70515\\-131.3021\\17\\39.87773\\-133.2553\\17\\40.7394\\-134.1933\\17\\42.09502\\-135.2084\\17\\44.43893\\-137.1615\\17\\44.64565\\-138.5101\\17\\44.95017\\-137.1615\\17\\45.59247\\-135.2084\\17\\45.03752\\-133.2553\\17\\45.23935\\-131.3021\\17\\45.96005\\-127.3959\\17\\47.27925\\-125.4428\\17\\47.88181\\-123.4896\\17\\49.24154\\-121.5365\\17\\49.00763\\-119.5834\\17\\48.35246\\-117.6303\\17\\47.83156\\-115.6771\\17\\47.51817\\-113.724\\17\\46.59877\\-111.9949\\17\\44.48406\\-109.8178\\17\\42.69252\\-107.4881\\17\\40.06293\\-103.9584\\17\\41.53359\\-102.0053\\17\\42.69252\\-101.1228\\17\\44.64565\\-100.8659\\17\\46.59877\\-100.7969\\17\\48.5519\\-101.1097\\17\\50.35131\\-102.0053\\17\\52.45815\\-103.4356\\17\\54.70424\\-105.9115\\17\\56.26034\\-107.8646\\17\\58.42603\\-109.8178\\17\\59.27229\\-111.7709\\17\\60.93369\\-113.724\\17\\61.69059\\-115.6771\\17\\63.08049\\-117.6303\\17\\63.52756\\-119.5834\\17\\64.55392\\-121.5365\\17\\65.24184\\-123.4896\\17\\65.5918\\-125.4428\\17\\65.71408\\-127.3959\\17\\66.83977\\-129.349\\17\\67.48013\\-131.3021\\17\\68.08315\\-132.8138\\17\\69.18689\\-135.2084\\17\\69.59238\\-137.1615\\17\\71.15838\\-141.0678\\17\\72.31492\\-143.0209\\17\\73.06778\\-144.974\\17\\74.21306\\-146.9271\\17\\74.99814\\-148.8803\\17\\76.22117\\-150.8334\\17\\76.98654\\-152.7865\\17\\77.84878\\-153.9343\\17\\80.21784\\-156.6928\\17\\80.86022\\-158.6459\\17\\84.10738\\-162.5521\\17\\84.81344\\-164.5053\\17\\86.55565\\-166.4584\\17\\88.48525\\-168.4115\\17\\90.2713\\-170.3646\\17\\91.69504\\-172.3178\\17\\92.65675\\-174.2709\\17\\94.59588\\-180.1303\\17\\95.15636\\-182.0834\\17\\95.15636\\-184.0365\\17\\95.03017\\-185.9896\\17\\94.5251\\-187.9428\\17\\94.61552\\-189.8959\\17\\94.96839\\-191.849\\17\\94.90721\\-193.8021\\17\\94.548\\-195.7553\\17\\93.95338\\-199.6615\\17\\93.40719\\-201.6146\\17\\93.39301\\-203.5678\\17\\93.22629\\-205.5209\\17\\93.16981\\-211.3803\\17\\91.52065\\-212.927\\17\\87.6144\\-213.0859\\17" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "185" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "418" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-216.3833\\19\\-93.12147\\-215.2865\\19\\-93.44157\\-213.3334\\19\\-92.0731\\-212.3087\\19\\-90.11997\\-212.5749\\19\\-88.84089\\-211.3803\\19\\-87.87388\\-209.4271\\19\\-87.77012\\-207.474\\19\\-89.07183\\-205.5209\\19\\-90.11997\\-204.6428\\19\\-92.0731\\-205.6448\\19\\-94.02622\\-206.4309\\19\\-95.01241\\-205.5209\\19\\-95.97935\\-203.3123\\19\\-96.57909\\-201.6146\\19\\-97.0855\\-199.6615\\19\\-97.9401\\-197.7084\\19\\-97.98466\\-195.7553\\19\\-98.57495\\-193.8021\\19\\-98.81683\\-191.849\\19\\-98.59532\\-189.8959\\19\\-97.98466\\-187.9428\\19\\-97.98466\\-185.9896\\19\\-97.77089\\-184.0365\\19\\-97.45\\-182.0834\\19\\-96.61489\\-178.1771\\19\\-95.19321\\-176.224\\19\\-94.40325\\-174.2709\\19\\-91.33559\\-170.3646\\19\\-90.43479\\-168.4115\\19\\-87.43196\\-164.5053\\19\\-86.75195\\-162.5521\\19\\-85.44844\\-160.599\\19\\-84.81785\\-158.6459\\19\\-83.46743\\-156.6928\\19\\-82.89884\\-154.7396\\19\\-81.47739\\-152.7865\\19\\-81.00366\\-150.8334\\19\\-79.85751\\-148.8803\\19\\-79.38603\\-146.9271\\19\\-79.05056\\-144.974\\19\\-78.03424\\-143.0209\\19\\-77.4374\\-141.0678\\19\\-77.08364\\-139.1146\\19\\-76.20061\\-137.1615\\19\\-75.98335\\-135.2084\\19\\-74.48734\\-131.3021\\19\\-74.202\\-129.349\\19\\-74.04838\\-127.3959\\19\\-70.91425\\-119.5834\\19\\-69.80283\\-117.6303\\19\\-68.90797\\-115.6771\\19\\-67.84417\\-113.724\\19\\-66.68247\\-111.7786\\19\\-64.72935\\-109.8848\\19\\-62.77623\\-109.045\\19\\-60.8231\\-110.2484\\19\\-58.86998\\-112.2936\\19\\-57.82185\\-113.724\\19\\-57.84438\\-115.6771\\19\\-58.20367\\-117.6303\\19\\-58.32066\\-119.5834\\19\\-57.99242\\-121.5365\\19\\-57.78254\\-123.4896\\19\\-56.91685\\-124.7853\\19\\-54.36757\\-127.3959\\19\\-53.73452\\-129.349\\19\\-53.0106\\-130.3126\\19\\-51.05748\\-130.4928\\19\\-50.25847\\-129.349\\19\\-50.40127\\-127.3959\\19\\-50.66809\\-125.4428\\19\\-49.78437\\-123.4896\\19\\-48.29055\\-119.5834\\19\\-47.15123\\-118.6193\\19\\-45.1981\\-118.4032\\19\\-43.24498\\-116.9016\\19\\-41.29185\\-116.6042\\19\\-39.33873\\-116.6782\\19\\-37.3856\\-117.2143\\19\\-36.94229\\-117.6303\\19\\-35.43248\\-118.5945\\19\\-33.47935\\-119.1964\\19\\-31.52623\\-120.5515\\19\\-29.5731\\-120.7153\\19\\-27.61998\\-120.6048\\19\\-26.67118\\-119.5834\\19\\-27.36089\\-117.6303\\19\\-25.66685\\-117.1272\\19\\-23.71373\\-117.4897\\19\\-22.35838\\-119.5834\\19\\-21.7606\\-120.1812\\19\\-19.80748\\-122.5536\\19\\-17.85435\\-123.9692\\19\\-15.90123\\-124.7724\\19\\-13.9481\\-126.3188\\19\\-10.04185\\-126.9429\\19\\-8.088726\\-127.6076\\19\\-6.135601\\-127.6076\\19\\-2.229351\\-127.8239\\19\\-0.276226\\-127.7214\\19\\1.676899\\-126.9992\\19\\3.630024\\-126.6064\\19\\5.583149\\-126.8906\\19\\7.536274\\-128.2262\\19\\8.5174\\-129.349\\19\\9.489399\\-131.4339\\19\\11.44252\\-131.8196\\19\\13.39565\\-133.0925\\19\\13.47703\\-133.2553\\19\\12.20774\\-135.2084\\19\\11.44252\\-135.778\\19\\9.489399\\-135.9926\\19\\7.536274\\-136.3064\\19\\5.583149\\-136.4591\\19\\3.630024\\-136.9313\\19\\1.676899\\-136.9951\\19\\-0.276226\\-137.561\\19\\-2.229351\\-138.2724\\19\\-4.182476\\-138.2438\\19\\-6.135601\\-137.3853\\19\\-8.45982\\-135.2084\\19\\-10.04185\\-134.073\\19\\-11.99498\\-132.4538\\19\\-13.9481\\-131.0092\\19\\-15.90123\\-130.4448\\19\\-17.85435\\-130.4539\\19\\-19.80748\\-131.0092\\19\\-21.7606\\-131.8562\\19\\-23.71373\\-132.4406\\19\\-25.66685\\-133.6926\\19\\-29.5731\\-135.9712\\19\\-31.52623\\-135.9433\\19\\-33.47935\\-136.7748\\19\\-33.84634\\-137.1615\\19\\-34.60543\\-139.1146\\19\\-36.4337\\-141.0678\\19\\-38.4722\\-143.0209\\19\\-39.33873\\-143.9531\\19\\-41.29185\\-145.7956\\19\\-43.24498\\-146.3543\\19\\-45.1981\\-148.007\\19\\-47.15123\\-148.7983\\19\\-48.68321\\-146.9271\\19\\-47.26109\\-143.0209\\19\\-49.10435\\-142.2836\\19\\-51.05748\\-141.0983\\19\\-53.0106\\-141.6956\\19\\-53.89561\\-144.974\\19\\-54.14756\\-146.9271\\19\\-55.57124\\-148.8803\\19\\-57.93016\\-150.8334\\19\\-61.70439\\-154.7396\\19\\-62.36028\\-156.6928\\19\\-63.33664\\-158.6459\\19\\-63.95643\\-160.599\\19\\-65.36124\\-162.5521\\19\\-65.90218\\-164.5053\\19\\-67.19982\\-166.4584\\19\\-67.93353\\-168.4115\\19\\-69.03991\\-170.3646\\19\\-69.54391\\-172.3178\\19\\-71.4848\\-176.224\\19\\-71.51192\\-178.1771\\19\\-71.88187\\-180.1303\\19\\-73.00602\\-182.0834\\19\\-73.52402\\-184.0365\\19\\-74.49497\\-185.8729\\19\\-76.4481\\-188.3928\\19\\-77.32999\\-189.8959\\19\\-79.28013\\-193.8021\\19\\-79.57014\\-195.7553\\19\\-80.98593\\-197.7084\\19\\-81.51019\\-199.6615\\19\\-81.84551\\-201.6146\\19\\-83.03989\\-203.5678\\19\\-83.32128\\-205.5209\\19\\-83.32128\\-207.474\\19\\-83.47842\\-209.4271\\19\\-83.76376\\-211.3803\\19\\-83.89362\\-213.3334\\19\\-85.26134\\-215.2865\\19\\-86.21372\\-216.2885\\19\\-88.16685\\-217.0158\\19\\-90.11997\\-217.0158\\19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "146" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "419" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-219.7547\\19\\1.803628\\-217.2396\\19\\-0.276226\\-215.2189\\19\\-2.229351\\-213.1188\\19\\-3.249316\\-211.3803\\19\\-3.302256\\-209.4271\\19\\-3.547185\\-207.474\\19\\-3.969283\\-205.5209\\19\\-3.970774\\-199.6615\\19\\-4.856516\\-197.7084\\19\\-5.26414\\-195.7553\\19\\-5.37659\\-193.8021\\19\\-5.662298\\-191.849\\19\\-6.135601\\-190.5843\\19\\-8.115359\\-189.8959\\19\\-10.08394\\-191.849\\19\\-11.99498\\-194.1953\\19\\-13.9481\\-195.3367\\19\\-15.90123\\-195.2791\\19\\-17.85435\\-194.7244\\19\\-19.80748\\-193.3304\\19\\-21.7606\\-191.6377\\19\\-23.71373\\-191.0544\\19\\-25.66685\\-190.8206\\19\\-31.52623\\-190.6956\\19\\-33.47935\\-189.7672\\19\\-35.43248\\-189.1946\\19\\-37.3856\\-188.8578\\19\\-39.33873\\-187.7058\\19\\-41.29185\\-187.2356\\19\\-43.24498\\-185.7914\\19\\-45.1981\\-184.9548\\19\\-45.82589\\-184.0365\\19\\-48.03736\\-180.1303\\19\\-48.30195\\-178.1771\\19\\-49.10435\\-176.5825\\19\\-49.54686\\-176.224\\19\\-51.05748\\-175.5751\\19\\-53.0106\\-176.8431\\19\\-54.96373\\-180.0473\\19\\-55.90326\\-178.1771\\19\\-55.64329\\-176.224\\19\\-55.63981\\-174.2709\\19\\-55.21121\\-172.3178\\19\\-55.59226\\-170.3646\\19\\-54.96373\\-169.346\\19\\-53.0106\\-168.1335\\19\\-51.05748\\-167.3223\\19\\-50.11033\\-166.4584\\19\\-49.94775\\-164.5053\\19\\-49.91108\\-160.599\\19\\-49.34171\\-158.6459\\19\\-48.2442\\-156.6928\\19\\-47.15123\\-155.1646\\19\\-45.1981\\-154.0507\\19\\-43.1562\\-152.7865\\19\\-41.29185\\-152.1375\\19\\-39.42751\\-152.7865\\19\\-37.3856\\-153.8202\\19\\-35.43248\\-153.8851\\19\\-33.58275\\-154.7396\\19\\-31.52623\\-155.8301\\19\\-29.5731\\-156.454\\19\\-27.61998\\-157.8661\\19\\-25.66685\\-157.9172\\19\\-23.71373\\-156.6213\\19\\-21.7606\\-156.0832\\19\\-19.80748\\-156.7012\\19\\-17.62899\\-158.6459\\19\\-13.9481\\-160.8137\\19\\-11.99498\\-161.638\\19\\-10.83105\\-162.5521\\19\\-9.152741\\-164.5053\\19\\-7.245331\\-168.4115\\19\\-6.127972\\-170.3646\\19\\-5.853774\\-172.3178\\19\\-5.459128\\-174.2709\\19\\-4.902313\\-176.224\\19\\-3.867663\\-178.1771\\19\\-3.729492\\-180.1303\\19\\-3.711633\\-182.0834\\19\\-3.210352\\-184.0365\\19\\-1.776367\\-185.9896\\19\\-1.315637\\-187.9428\\19\\-0.276226\\-189.8343\\19\\1.676899\\-190.7383\\19\\3.630024\\-190.3929\\19\\5.583149\\-189.7605\\19\\9.489399\\-189.9913\\19\\13.39565\\-189.6602\\19\\19.25502\\-189.6368\\19\\23.16127\\-189.425\\19\\25.1144\\-189.5704\\19\\29.02065\\-189.6484\\19\\30.97377\\-189.5289\\19\\32.9269\\-188.847\\19\\34.88002\\-186.9815\\19\\36.83315\\-185.2693\\19\\38.78627\\-184.8149\\19\\40.7394\\-183.3667\\19\\42.69252\\-183.0764\\19\\44.64565\\-182.95\\19\\46.59877\\-182.5717\\19\\50.50502\\-183.2849\\19\\52.45815\\-184.8535\\19\\54.14559\\-185.9896\\19\\56.3644\\-188.1335\\19\\57.49233\\-189.8959\\19\\58.98037\\-191.849\\19\\59.19263\\-193.8021\\19\\59.19727\\-195.7553\\19\\59.44755\\-197.7084\\19\\60.27065\\-198.5814\\19\\62.22377\\-199.8359\\19\\63.59959\\-201.6146\\19\\64.86411\\-203.5678\\19\\64.1769\\-204.2737\\19\\62.22377\\-204.4171\\19\\60.27065\\-202.4589\\19\\58.31752\\-202.6106\\19\\57.41432\\-203.5678\\19\\57.19072\\-205.5209\\19\\55.93105\\-207.474\\19\\54.81558\\-209.4271\\19\\52.45815\\-212.0139\\19\\50.50502\\-213.5724\\19\\48.5519\\-214.5349\\19\\46.59877\\-215.9466\\19\\44.64565\\-216.7867\\19\\42.69252\\-217.0158\\19\\36.83315\\-217.0158\\19\\36.46694\\-217.2396\\19\\32.9269\\-218.8672\\19\\30.97377\\-219.6547\\19\\29.02065\\-220.2476\\19\\27.06752\\-220.6663\\19\\25.1144\\-220.7891\\19\\23.16127\\-220.7789\\19\\21.20815\\-220.6663\\19\\19.25502\\-220.2552\\19\\17.3019\\-219.7064\\19\\15.34877\\-219.731\\19\\13.39565\\-220.2593\\19\\11.44252\\-220.6292\\19\\9.489399\\-220.6292\\19\\7.536274\\-220.2733\\19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "145" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "420" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-212.0553\\19\\85.09934\\-211.3803\\19\\84.70255\\-209.4271\\19\\83.46066\\-207.474\\19\\83.21987\\-205.5209\\19\\82.45755\\-201.6146\\19\\81.30843\\-199.6615\\19\\80.63124\\-197.7084\\19\\79.07986\\-195.7553\\19\\78.71832\\-193.8021\\19\\77.61768\\-191.849\\19\\76.78484\\-189.8959\\19\\75.72018\\-187.9428\\19\\74.82886\\-185.9896\\19\\73.76033\\-184.0365\\19\\72.88548\\-182.0834\\19\\71.86458\\-180.1303\\19\\70.99281\\-178.1771\\19\\70.39675\\-176.224\\19\\69.3424\\-174.2709\\19\\68.9295\\-172.3178\\19\\67.84962\\-170.3646\\19\\64.1769\\-166.4506\\19\\62.84813\\-164.5053\\19\\61.41227\\-162.5521\\19\\61.01492\\-160.599\\19\\58.31752\\-157.7836\\19\\55.19357\\-154.7396\\19\\53.26838\\-152.7865\\19\\51.52951\\-150.8334\\19\\50.50502\\-150.0067\\19\\48.5519\\-149.89\\19\\46.59877\\-149.1523\\19\\44.64565\\-148.0865\\19\\42.69252\\-147.457\\19\\42.36269\\-146.9271\\19\\43.20987\\-144.974\\19\\43.60608\\-143.0209\\19\\42.69252\\-142.0491\\19\\40.7394\\-142.1165\\19\\38.78627\\-142.5561\\19\\36.83315\\-142.2812\\19\\32.9269\\-142.0102\\19\\30.97377\\-141.4348\\19\\29.02065\\-140.1099\\19\\28.05317\\-139.1146\\19\\26.6905\\-137.1615\\19\\25.8309\\-135.2084\\19\\25.1144\\-134.4958\\19\\23.29303\\-133.2553\\19\\23.32643\\-131.3021\\19\\25.1144\\-130.1102\\19\\27.06752\\-128.5361\\19\\29.02065\\-127.8118\\19\\30.97377\\-127.8023\\19\\32.9269\\-126.5777\\19\\34.88002\\-125.0121\\19\\37.06424\\-123.4896\\19\\38.78627\\-122.4642\\19\\40.7394\\-122.584\\19\\41.71148\\-123.4896\\19\\42.27658\\-125.4428\\19\\41.98096\\-127.3959\\19\\41.55091\\-129.349\\19\\40.38028\\-131.3021\\19\\40.39288\\-133.2553\\19\\41.94087\\-135.2084\\19\\42.69252\\-135.8936\\19\\43.72627\\-137.1615\\19\\43.57414\\-139.1146\\19\\44.64565\\-140.3523\\19\\46.0832\\-139.1146\\19\\46.00606\\-135.2084\\19\\45.47918\\-133.2553\\19\\45.7667\\-131.3021\\19\\47.16415\\-129.349\\19\\47.58402\\-127.3959\\19\\48.08993\\-123.4896\\19\\48.22638\\-121.5365\\19\\48.10801\\-119.5834\\19\\47.70671\\-117.6303\\19\\46.91779\\-115.6771\\19\\45.79205\\-113.724\\19\\45.48341\\-111.7709\\19\\43.60434\\-109.8178\\19\\42.65496\\-107.8646\\19\\41.86797\\-105.9115\\19\\40.87684\\-103.9584\\19\\41.10982\\-102.0053\\19\\44.25055\\-100.0521\\19\\44.64565\\-99.71604\\19\\46.59877\\-99.24658\\19\\48.41965\\-100.0521\\19\\50.50502\\-101.3843\\19\\52.45815\\-102.9818\\19\\53.94007\\-103.9584\\19\\56.3644\\-106.4224\\19\\57.43192\\-107.8646\\19\\59.02365\\-109.8178\\19\\60.47009\\-111.7709\\19\\61.25132\\-113.724\\19\\62.22377\\-115.2172\\19\\62.66113\\-115.6771\\19\\63.26627\\-117.6303\\19\\63.67159\\-119.5834\\19\\64.92165\\-121.5365\\19\\65.48069\\-123.4896\\19\\65.62471\\-125.4428\\19\\67.26482\\-129.349\\19\\67.65778\\-131.3021\\19\\68.78693\\-133.2553\\19\\70.4548\\-137.1615\\19\\71.16203\\-139.1146\\19\\72.24849\\-141.0678\\19\\73.08917\\-143.0209\\19\\73.64956\\-144.974\\19\\73.94253\\-145.427\\19\\75.60268\\-148.8803\\19\\76.648\\-150.8334\\19\\78.25517\\-152.7865\\19\\78.96281\\-154.7396\\19\\82.24619\\-158.6459\\19\\82.87045\\-160.599\\19\\84.61873\\-162.5521\\19\\87.17277\\-166.4584\\19\\87.6144\\-166.9057\\19\\89.56753\\-169.3759\\19\\92.29022\\-172.3178\\19\\93.95338\\-176.224\\19\\95.11208\\-180.1303\\19\\95.41927\\-182.0834\\19\\95.43453\\-185.9896\\19\\95.27829\\-187.9428\\19\\95.92374\\-189.8959\\19\\95.94058\\-191.849\\19\\95.44961\\-193.8021\\19\\95.11\\-197.7084\\19\\94.60677\\-199.6615\\19\\94.33835\\-201.6146\\19\\94.32938\\-203.5678\\19\\93.84076\\-205.5209\\19\\93.18081\\-207.474\\19\\93.18081\\-211.3803\\19\\91.52065\\-212.927\\19\\87.6144\\-212.9367\\19" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "188" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "421" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-216.8828\\21\\-93.69014\\-215.2865\\21\\-92.60489\\-213.3334\\21\\-92.0731\\-212.9869\\21\\-90.11997\\-212.6489\\21\\-89.42386\\-211.3803\\21\\-88.76907\\-209.4271\\21\\-87.77012\\-207.474\\21\\-89.48633\\-205.5209\\21\\-90.11997\\-205.0326\\21\\-90.70869\\-205.5209\\21\\-93.58846\\-207.474\\21\\-94.02622\\-207.8758\\21\\-95.97935\\-206.1287\\21\\-96.48466\\-205.5209\\21\\-96.8591\\-203.5678\\21\\-96.97268\\-201.6146\\21\\-98.42075\\-199.6615\\21\\-98.83487\\-197.7084\\21\\-98.92135\\-193.8021\\21\\-99.2161\\-191.849\\21\\-98.92552\\-189.8959\\21\\-98.83929\\-187.9428\\21\\-98.83487\\-184.0365\\21\\-98.63422\\-182.0834\\21\\-97.60696\\-180.1303\\21\\-96.52557\\-176.224\\21\\-93.27387\\-172.3178\\21\\-92.46004\\-170.3646\\21\\-92.0731\\-169.9461\\21\\-89.40653\\-166.4584\\21\\-88.6377\\-164.5053\\21\\-87.40942\\-162.5521\\21\\-86.57055\\-160.599\\21\\-85.42056\\-158.6459\\21\\-84.61166\\-156.6928\\21\\-83.4204\\-154.7396\\21\\-82.78399\\-152.7865\\21\\-81.44759\\-150.8334\\21\\-81.01739\\-148.8803\\21\\-79.85751\\-146.9271\\21\\-79.38999\\-144.974\\21\\-79.07072\\-143.0209\\21\\-78.0547\\-141.0678\\21\\-77.44981\\-139.1146\\21\\-77.07663\\-137.1615\\21\\-76.4481\\-135.3152\\21\\-75.57552\\-133.2553\\21\\-75.07984\\-131.3021\\21\\-74.47227\\-129.349\\21\\-74.35954\\-127.3959\\21\\-73.02146\\-123.4896\\21\\-72.21633\\-121.5365\\21\\-70.58872\\-118.1028\\21\\-70.29575\\-117.6303\\21\\-67.32034\\-111.7709\\21\\-65.83307\\-109.8178\\21\\-64.72935\\-108.8182\\21\\-62.77623\\-108.4343\\21\\-60.8231\\-109.0138\\21\\-58.86998\\-110.9034\\21\\-57.83121\\-111.7709\\21\\-56.16064\\-113.724\\21\\-57.48651\\-115.6771\\21\\-57.85289\\-117.6303\\21\\-58.35629\\-119.5834\\21\\-58.42608\\-121.5365\\21\\-58.36466\\-123.4896\\21\\-57.74591\\-125.4428\\21\\-55.71377\\-127.3959\\21\\-53.0106\\-131.0828\\21\\-51.05748\\-131.3687\\21\\-50.39444\\-129.349\\21\\-50.89589\\-127.3959\\21\\-50.89589\\-125.4428\\21\\-48.77883\\-121.5365\\21\\-47.8591\\-119.5834\\21\\-47.15123\\-118.8866\\21\\-45.1981\\-118.4552\\21\\-43.24498\\-116.8291\\21\\-41.29185\\-116.5235\\21\\-39.33873\\-116.5332\\21\\-37.3856\\-116.7365\\21\\-35.43248\\-118.3919\\21\\-33.47935\\-118.8281\\21\\-31.52623\\-120.6218\\21\\-29.5731\\-121.3627\\21\\-27.61998\\-120.0885\\21\\-27.61998\\-119.4741\\21\\-29.5731\\-118.5542\\21\\-30.5108\\-117.6303\\21\\-31.19639\\-115.6771\\21\\-29.5731\\-114.6296\\21\\-25.66685\\-116.5123\\21\\-23.71373\\-116.5985\\21\\-22.32598\\-117.6303\\21\\-21.05885\\-119.5834\\21\\-19.80748\\-120.9903\\21\\-17.85435\\-123.0249\\21\\-15.90123\\-124.4054\\21\\-13.9481\\-125.0268\\21\\-11.99498\\-125.8681\\21\\-10.04185\\-126.2467\\21\\-8.088726\\-126.4828\\21\\-2.229351\\-126.4926\\21\\-0.276226\\-126.5345\\21\\1.676899\\-126.3651\\21\\3.630024\\-126.0425\\21\\5.583149\\-126.388\\21\\6.745723\\-127.3959\\21\\8.369536\\-131.3021\\21\\9.962703\\-133.2553\\21\\10.04185\\-135.2084\\21\\8.843969\\-137.1615\\21\\7.536274\\-138.2101\\21\\5.583149\\-139.047\\21\\3.630024\\-140.3442\\21\\1.676899\\-140.4943\\21\\-2.229351\\-140.4622\\21\\-4.182476\\-140.2327\\21\\-5.441728\\-139.1146\\21\\-8.088726\\-136.2525\\21\\-11.18475\\-133.2553\\21\\-13.9481\\-130.5074\\21\\-15.90123\\-129.9109\\21\\-17.85435\\-129.9187\\21\\-19.80748\\-130.4915\\21\\-21.7606\\-131.6277\\21\\-23.71373\\-132.0522\\21\\-25.66685\\-132.3221\\21\\-27.61998\\-133.3917\\21\\-29.5731\\-134.2926\\21\\-30.96536\\-135.2084\\21\\-31.52623\\-135.7145\\21\\-34.30672\\-139.1146\\21\\-39.33873\\-144.158\\21\\-41.29185\\-146.0698\\21\\-43.21414\\-146.9271\\21\\-45.1981\\-148.0512\\21\\-46.92831\\-148.8803\\21\\-47.38969\\-148.8803\\21\\-49.10435\\-147.3442\\21\\-50.05766\\-146.9271\\21\\-49.10435\\-146.3205\\21\\-48.46959\\-144.974\\21\\-48.23876\\-143.0209\\21\\-51.05748\\-142.0874\\21\\-53.0106\\-142.4212\\21\\-53.887\\-144.974\\21\\-53.0106\\-146.1261\\21\\-51.78148\\-146.9271\\21\\-52.53833\\-148.8803\\21\\-53.0106\\-149.2618\\21\\-54.96373\\-149.3849\\21\\-56.91685\\-150.3451\\21\\-58.86998\\-151.9488\\21\\-61.69913\\-154.7396\\21\\-62.45071\\-156.6928\\21\\-63.71133\\-158.6459\\21\\-65.28181\\-160.599\\21\\-65.93683\\-162.5521\\21\\-67.19122\\-164.5053\\21\\-68.30785\\-166.4584\\21\\-69.61695\\-168.4115\\21\\-70.38787\\-170.3646\\21\\-71.53524\\-172.3178\\21\\-72.40542\\-174.2709\\21\\-73.42314\\-176.224\\21\\-73.49796\\-178.1771\\21\\-74.23232\\-180.1303\\21\\-75.42576\\-182.0834\\21\\-76.06377\\-184.0365\\21\\-77.33466\\-185.9896\\21\\-79.32834\\-189.8959\\21\\-79.52589\\-191.849\\21\\-80.90681\\-193.8021\\21\\-81.36723\\-195.7553\\21\\-81.57145\\-197.7084\\21\\-83.05223\\-199.6615\\21\\-83.34997\\-201.6146\\21\\-83.74692\\-205.5209\\21\\-83.78099\\-209.4271\\21\\-83.86387\\-211.3803\\21\\-84.96107\\-213.3334\\21\\-85.55088\\-215.2865\\21\\-86.21372\\-216.0714\\21\\-88.16685\\-217.0158\\21\\-90.11997\\-217.0111\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "142" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "422" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-220.0305\\21\\3.630024\\-218.9453\\21\\1.676899\\-218.072\\21\\-0.276226\\-216.5036\\21\\-1.980159\\-215.2865\\21\\-3.452471\\-213.3334\\21\\-3.95868\\-211.3803\\21\\-4.746092\\-209.4271\\21\\-5.252857\\-207.474\\21\\-5.295405\\-203.5678\\21\\-5.370314\\-201.6146\\21\\-5.555089\\-199.6615\\21\\-5.910241\\-197.7084\\21\\-6.135601\\-197.2545\\21\\-7.656249\\-195.7553\\21\\-8.088726\\-195.5327\\21\\-10.37779\\-197.7084\\21\\-13.9481\\-200.9571\\21\\-15.90123\\-200.9108\\21\\-17.85435\\-200.2583\\21\\-19.80748\\-198.9695\\21\\-21.7606\\-197.1403\\21\\-23.71373\\-196.4945\\21\\-24.69029\\-195.7553\\21\\-25.66685\\-195.2208\\21\\-27.61998\\-194.7713\\21\\-31.52623\\-194.7225\\21\\-33.47935\\-194.5694\\21\\-35.43248\\-193.2891\\21\\-37.3856\\-192.776\\21\\-39.33873\\-192.6381\\21\\-41.29185\\-191.349\\21\\-43.24498\\-190.8173\\21\\-45.1981\\-190.4416\\21\\-47.15123\\-189.2423\\21\\-48.46088\\-187.9428\\21\\-49.77532\\-185.9896\\21\\-50.18467\\-182.0834\\21\\-50.79114\\-180.1303\\21\\-51.05748\\-179.8481\\21\\-53.0106\\-180.6111\\21\\-54.96373\\-182.2461\\21\\-55.15247\\-182.0834\\21\\-55.9747\\-180.1303\\21\\-55.11234\\-176.224\\21\\-55.31025\\-174.2709\\21\\-56.0923\\-170.3646\\21\\-56.31454\\-168.4115\\21\\-54.96373\\-167.4433\\21\\-53.0106\\-167.7901\\21\\-51.95414\\-168.4115\\21\\-49.10435\\-170.3548\\21\\-48.08104\\-168.4115\\21\\-48.02421\\-166.4584\\21\\-48.02421\\-162.5521\\21\\-47.96676\\-160.599\\21\\-47.0931\\-158.6459\\21\\-45.1981\\-157.7566\\21\\-43.24498\\-156.4128\\21\\-41.29185\\-155.7656\\21\\-35.43248\\-155.9062\\21\\-33.79756\\-156.6928\\21\\-31.52623\\-158.3719\\21\\-29.0675\\-160.599\\21\\-27.61998\\-161.6195\\21\\-25.66685\\-161.6481\\21\\-23.71373\\-160.3074\\21\\-21.7606\\-159.7932\\21\\-19.80748\\-159.825\\21\\-17.85435\\-160.9652\\21\\-15.90123\\-161.729\\21\\-13.9481\\-161.9532\\21\\-13.20053\\-162.5521\\21\\-10.39394\\-164.5053\\21\\-8.833998\\-166.4584\\21\\-7.609112\\-168.4115\\21\\-6.083418\\-172.3178\\21\\-5.865067\\-174.2709\\21\\-5.217927\\-176.224\\21\\-4.115892\\-178.1771\\21\\-3.923388\\-182.0834\\21\\-2.981784\\-184.0365\\21\\-2.229351\\-184.7426\\21\\-0.3588582\\-185.9896\\21\\1.676899\\-188.1937\\21\\3.630024\\-188.9103\\21\\5.583149\\-188.9279\\21\\7.536274\\-189.1659\\21\\9.489399\\-189.5704\\21\\11.44252\\-189.6484\\21\\23.16127\\-189.6484\\21\\27.06752\\-189.8883\\21\\29.02065\\-189.7343\\21\\30.97377\\-189.161\\21\\32.58185\\-187.9428\\21\\34.88002\\-185.6641\\21\\36.83315\\-184.8533\\21\\38.78627\\-183.2506\\21\\40.7394\\-182.9384\\21\\42.69252\\-182.5273\\21\\46.59877\\-182.2055\\21\\48.5519\\-182.3652\\21\\50.50502\\-182.9185\\21\\52.45815\\-183.3151\\21\\54.41127\\-185.1612\\21\\56.3644\\-186.7797\\21\\57.48249\\-187.9428\\21\\59.01295\\-189.8959\\21\\59.43424\\-191.849\\21\\59.96669\\-193.8021\\21\\60.00011\\-195.7553\\21\\60.23309\\-197.7084\\21\\62.33712\\-199.6615\\21\\64.1769\\-200.7517\\21\\64.97244\\-201.6146\\21\\65.26755\\-203.5678\\21\\64.1769\\-204.5609\\21\\62.22377\\-202.7915\\21\\60.27065\\-202.3986\\21\\58.86374\\-203.5678\\21\\57.11293\\-207.474\\21\\55.51709\\-209.4271\\21\\54.41127\\-210.6144\\21\\52.45815\\-212.2315\\21\\50.50502\\-214.074\\21\\48.5519\\-214.9195\\21\\46.59877\\-215.5905\\21\\44.64565\\-216.3598\\21\\42.69252\\-216.8429\\21\\38.78627\\-217.0158\\21\\36.83315\\-217.0158\\21\\32.9269\\-218.3054\\21\\30.97377\\-218.8672\\21\\29.02065\\-219.6087\\21\\25.1144\\-220.2407\\21\\23.16127\\-220.2503\\21\\19.25502\\-219.6981\\21\\17.3019\\-219.098\\21\\13.39565\\-220.7689\\21\\11.44252\\-220.8984\\21\\9.489399\\-220.8984\\21\\7.536274\\-220.7689\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "423" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-148.3082\\21\\39.66383\\-146.9271\\21\\38.78627\\-145.2115\\21\\36.83315\\-144.1881\\21\\34.88002\\-143.8736\\21\\32.9269\\-142.2387\\21\\30.97377\\-141.6601\\21\\29.02065\\-140.2855\\21\\27.82597\\-139.1146\\21\\26.24632\\-137.1615\\21\\25.41133\\-135.2084\\21\\23.89761\\-133.2553\\21\\23.85515\\-131.3021\\21\\25.1144\\-130.0998\\21\\27.06752\\-128.5361\\21\\29.02065\\-127.8118\\21\\30.97377\\-127.8023\\21\\32.9269\\-126.5777\\21\\34.04371\\-125.4428\\21\\36.83315\\-122.009\\21\\38.78627\\-121.2325\\21\\40.7394\\-122.7223\\21\\41.51782\\-123.4896\\21\\42.24863\\-125.4428\\21\\43.18369\\-127.3959\\21\\42.7887\\-129.349\\21\\41.59719\\-131.3021\\21\\41.4057\\-133.2553\\21\\42.01605\\-135.2084\\21\\43.43588\\-137.1615\\21\\43.25446\\-139.1146\\21\\42.40491\\-141.0678\\21\\40.27523\\-143.0209\\21\\39.46236\\-144.974\\21\\40.7394\\-145.3175\\21\\42.69252\\-146.4686\\21\\43.66909\\-146.9271\\21\\42.69252\\-147.7023\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "108" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "424" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "85.66128\\-212.0553\\21\\85.09934\\-211.3803\\21\\84.85046\\-209.4271\\21\\84.73334\\-207.474\\21\\84.48656\\-205.5209\\21\\83.35133\\-203.5678\\21\\82.95071\\-201.6146\\21\\82.7438\\-199.6615\\21\\80.78746\\-195.7553\\21\\80.40163\\-193.8021\\21\\79.01577\\-191.849\\21\\78.72324\\-189.8959\\21\\77.72107\\-187.9428\\21\\76.82213\\-185.9896\\21\\74.87331\\-182.0834\\21\\73.83321\\-180.1303\\21\\71.03152\\-174.2709\\21\\70.39919\\-172.3178\\21\\69.32839\\-170.3646\\21\\68.08315\\-168.5402\\21\\64.04047\\-164.5053\\21\\63.22068\\-162.5521\\21\\62.22377\\-161.4792\\21\\59.19322\\-158.6459\\21\\58.31752\\-157.7448\\21\\54.41127\\-153.9488\\21\\52.45815\\-152.5274\\21\\50.50502\\-151.5796\\21\\48.5519\\-150.8856\\21\\46.59877\\-149.7722\\21\\45.90914\\-148.8803\\21\\45.11562\\-146.9271\\21\\45.54745\\-144.974\\21\\45.87123\\-141.0678\\21\\46.1734\\-139.1146\\21\\46.17077\\-135.2084\\21\\45.81477\\-133.2553\\21\\46.98812\\-131.3021\\21\\47.85934\\-129.349\\21\\48.02177\\-127.3959\\21\\48.13596\\-123.4896\\21\\47.72453\\-121.5365\\21\\47.48039\\-119.5834\\21\\46.73421\\-117.6303\\21\\45.70474\\-115.6771\\21\\44.1488\\-113.724\\21\\43.13912\\-109.8178\\21\\43.57187\\-107.8646\\21\\43.72677\\-105.9115\\21\\43.77808\\-102.0053\\21\\44.42185\\-100.0521\\21\\44.64565\\-99.82834\\21\\46.59877\\-99.1113\\21\\48.5519\\-99.53845\\21\\50.50502\\-101.0584\\21\\52.45815\\-101.8968\\21\\54.41127\\-103.0358\\21\\55.72835\\-103.9584\\21\\56.3644\\-104.5626\\21\\58.71425\\-107.8646\\21\\59.33711\\-109.8178\\21\\60.91652\\-111.7709\\21\\61.63891\\-113.724\\21\\62.96713\\-115.6771\\21\\63.56985\\-117.6303\\21\\63.7705\\-119.5834\\21\\65.02263\\-121.5365\\21\\65.58381\\-123.4896\\21\\65.70465\\-125.4428\\21\\66.87432\\-127.3959\\21\\67.4761\\-129.349\\21\\69.2653\\-133.2553\\21\\70.35317\\-135.2084\\21\\71.19081\\-137.1615\\21\\71.62241\\-139.1146\\21\\72.74624\\-141.0678\\21\\74.46448\\-144.974\\21\\75.1252\\-146.9271\\21\\76.45758\\-148.8803\\21\\77.04539\\-150.8334\\21\\79.8019\\-154.2223\\21\\80.30721\\-154.7396\\21\\80.84271\\-156.6928\\21\\82.60047\\-158.6459\\21\\84.22482\\-160.599\\21\\84.84007\\-162.5521\\21\\87.6144\\-165.7141\\21\\88.3547\\-166.4584\\21\\91.20191\\-170.3646\\21\\92.6935\\-172.3178\\21\\93.90846\\-174.2709\\21\\95.13393\\-178.1771\\21\\95.95703\\-180.1303\\21\\96.29447\\-182.0834\\21\\96.29836\\-187.9428\\21\\96.51545\\-189.8959\\21\\96.48936\\-191.849\\21\\96.29836\\-193.8021\\21\\96.2896\\-197.7084\\21\\95.94058\\-199.6615\\21\\95.14507\\-201.6146\\21\\94.99221\\-203.5678\\21\\94.25212\\-205.5209\\21\\93.23805\\-207.474\\21\\93.18081\\-211.3803\\21\\91.52065\\-212.9869\\21\\89.56753\\-213.0294\\21\\87.6144\\-212.9367\\21" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "184" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "425" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-216.9096\\23\\-93.73051\\-215.2865\\23\\-92.0731\\-213.9568\\23\\-90.11997\\-213.3967\\23\\-89.72324\\-211.3803\\23\\-89.00608\\-209.4271\\23\\-88.16685\\-208.1584\\23\\-87.51824\\-207.474\\23\\-88.16685\\-206.8054\\23\\-90.11997\\-205.3214\\23\\-92.0731\\-206.58\\23\\-94.02622\\-208.4186\\23\\-95.97935\\-207.9928\\23\\-96.46763\\-207.474\\23\\-97.58595\\-203.5678\\23\\-97.72077\\-201.6146\\23\\-98.76503\\-199.6615\\23\\-99.22947\\-197.7084\\23\\-99.25707\\-195.7553\\23\\-99.41476\\-193.8021\\23\\-99.6739\\-191.849\\23\\-99.42364\\-187.9428\\23\\-99.25006\\-184.0365\\23\\-98.62152\\-180.1303\\23\\-97.61766\\-178.1771\\23\\-97.03069\\-176.224\\23\\-95.97935\\-174.4558\\23\\-94.52599\\-172.3178\\23\\-92.88005\\-170.3646\\23\\-91.37556\\-168.4115\\23\\-90.58472\\-166.4584\\23\\-89.38878\\-164.5053\\23\\-88.52367\\-162.5521\\23\\-88.16685\\-162.176\\23\\-86.21372\\-159.2757\\23\\-85.70841\\-158.6459\\23\\-85.11084\\-156.6928\\23\\-83.73047\\-154.7396\\23\\-83.43428\\-152.7865\\23\\-82.69686\\-150.8334\\23\\-81.42312\\-148.8803\\23\\-81.01392\\-146.9271\\23\\-79.87474\\-144.974\\23\\-79.38989\\-143.0209\\23\\-79.07072\\-141.0678\\23\\-78.07571\\-139.1146\\23\\-77.45848\\-137.1615\\23\\-77.00222\\-135.2084\\23\\-76.14413\\-133.2553\\23\\-74.38647\\-127.3959\\23\\-74.18016\\-125.4428\\23\\-73.22142\\-123.4896\\23\\-72.39324\\-121.5365\\23\\-71.78658\\-119.5834\\23\\-70.93525\\-117.6303\\23\\-69.84445\\-115.6771\\23\\-69.01746\\-113.724\\23\\-68.6356\\-113.1673\\23\\-66.86068\\-109.8178\\23\\-64.72935\\-107.8262\\23\\-62.77623\\-106.9621\\23\\-60.8231\\-108.1138\\23\\-58.86998\\-108.9286\\23\\-56.91685\\-109.1396\\23\\-56.20299\\-109.8178\\23\\-55.72535\\-111.7709\\23\\-55.54859\\-113.724\\23\\-56.0186\\-115.6771\\23\\-57.45507\\-117.6303\\23\\-57.7681\\-119.5834\\23\\-57.91464\\-121.5365\\23\\-58.39036\\-123.4896\\23\\-57.90258\\-125.4428\\23\\-56.24706\\-127.3959\\23\\-55.67889\\-129.349\\23\\-53.88053\\-131.3021\\23\\-53.0106\\-132.0552\\23\\-51.05748\\-132.488\\23\\-49.50812\\-133.2553\\23\\-49.10435\\-133.5912\\23\\-48.61607\\-133.2553\\23\\-48.77883\\-131.3021\\23\\-50.27729\\-129.349\\23\\-50.97671\\-127.3959\\23\\-50.82175\\-125.4428\\23\\-49.78164\\-123.4896\\23\\-48.26661\\-121.5365\\23\\-46.51313\\-119.5834\\23\\-44.00508\\-117.6303\\23\\-43.24498\\-116.8855\\23\\-41.29185\\-116.488\\23\\-39.33873\\-116.472\\23\\-37.3856\\-116.5751\\23\\-35.43248\\-117.2023\\23\\-33.47935\\-118.726\\23\\-31.52623\\-120.3885\\23\\-30.26639\\-119.5834\\23\\-30.7061\\-117.6303\\23\\-30.37769\\-115.6771\\23\\-29.5731\\-115.0143\\23\\-27.61998\\-114.9176\\23\\-25.66685\\-116.3912\\23\\-24.79737\\-117.6303\\23\\-23.71373\\-118.8534\\23\\-21.7606\\-119.1487\\23\\-19.80748\\-120.6925\\23\\-17.85435\\-122.7093\\23\\-15.90123\\-124.0279\\23\\-13.9481\\-124.4228\\23\\-11.99498\\-124.5888\\23\\-8.088726\\-124.5463\\23\\-6.135601\\-124.6117\\23\\-2.229351\\-124.6388\\23\\1.676899\\-125.7893\\23\\3.630024\\-125.7246\\23\\5.583149\\-125.9564\\23\\7.022591\\-127.3959\\23\\7.26574\\-129.349\\23\\8.265953\\-131.3021\\23\\8.875712\\-133.2553\\23\\8.730388\\-135.2084\\23\\9.122411\\-137.1615\\23\\8.434081\\-139.1146\\23\\7.536274\\-139.9982\\23\\5.583149\\-142.2752\\23\\3.642544\\-143.0209\\23\\1.676899\\-144.1685\\23\\-2.229351\\-144.19\\23\\-4.115892\\-143.0209\\23\\-5.142557\\-141.0678\\23\\-5.507069\\-139.1146\\23\\-7.284788\\-137.1615\\23\\-11.19356\\-133.2553\\23\\-12.64431\\-131.3021\\23\\-13.9481\\-130.0632\\23\\-15.90123\\-129.6638\\23\\-17.85435\\-129.6638\\23\\-21.7606\\-130.3121\\23\\-25.66685\\-131.7641\\23\\-27.61998\\-132.0843\\23\\-29.03886\\-133.2553\\23\\-32.34325\\-137.1615\\23\\-39.33873\\-144.158\\23\\-41.29185\\-145.8285\\23\\-43.24498\\-146.373\\23\\-45.1981\\-147.6787\\23\\-47.15123\\-148.4066\\23\\-49.10435\\-149.6064\\23\\-51.05748\\-149.5771\\23\\-53.0106\\-149.954\\23\\-54.96373\\-150.4564\\23\\-56.91685\\-150.7249\\23\\-58.86998\\-151.9985\\23\\-61.69913\\-154.7396\\23\\-63.33507\\-156.6928\\23\\-64.47026\\-158.6459\\23\\-65.96828\\-160.599\\23\\-68.38293\\-164.5053\\23\\-70.58872\\-166.8412\\23\\-71.55566\\-168.4115\\23\\-72.31805\\-170.3646\\23\\-73.51363\\-172.3178\\23\\-73.75747\\-174.2709\\23\\-75.03237\\-176.224\\23\\-75.48116\\-178.1771\\23\\-77.43861\\-182.0834\\23\\-77.55304\\-184.0365\\23\\-78.97729\\-185.9896\\23\\-79.49874\\-187.9428\\23\\-80.92913\\-189.8959\\23\\-81.44179\\-191.849\\23\\-81.54585\\-193.8021\\23\\-82.83961\\-195.7553\\23\\-83.41425\\-197.7084\\23\\-83.78099\\-201.6146\\23\\-84.95448\\-203.5678\\23\\-85.34332\\-205.5209\\23\\-85.40817\\-207.474\\23\\-84.83868\\-209.4271\\23\\-84.96107\\-211.3803\\23\\-85.4813\\-213.3334\\23\\-85.77904\\-215.2865\\23\\-86.21372\\-215.7957\\23\\-88.16685\\-216.9578\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "426" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-47.15123\\-112.0964\\23\\-47.57691\\-111.7709\\23\\-48.59969\\-109.8178\\23\\-47.15123\\-108.6254\\23\\-45.1981\\-108.7699\\23\\-43.24498\\-108.4188\\23\\-41.29185\\-109.2332\\23\\-40.7948\\-109.8178\\23\\-40.94308\\-111.7709\\23\\-41.29185\\-112.129\\23\\-43.24498\\-112.5901\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "141" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "427" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "3.630024\\-219.7547\\23\\1.676899\\-218.4812\\23\\-0.276226\\-217.7616\\23\\-2.229351\\-216.097\\23\\-3.061238\\-215.2865\\23\\-4.718739\\-213.3334\\23\\-5.304203\\-211.3803\\23\\-5.500061\\-209.4271\\23\\-6.000165\\-207.474\\23\\-6.143948\\-205.5209\\23\\-6.948161\\-203.5678\\23\\-8.088726\\-202.7468\\23\\-10.04185\\-202.9902\\23\\-11.99498\\-204.9085\\23\\-13.9481\\-204.9448\\23\\-15.90123\\-204.5401\\23\\-17.85435\\-203.2401\\23\\-19.80748\\-202.6241\\23\\-21.7606\\-202.5817\\23\\-23.71373\\-200.9804\\23\\-25.66685\\-200.5858\\23\\-27.61998\\-199.1183\\23\\-29.5731\\-198.6908\\23\\-33.47935\\-198.5746\\23\\-35.43248\\-197.289\\23\\-37.3856\\-196.7318\\23\\-41.29185\\-196.5932\\23\\-43.24498\\-195.2028\\23\\-45.1981\\-194.7432\\23\\-47.15123\\-194.6067\\23\\-49.10435\\-193.2046\\23\\-50.43373\\-191.849\\23\\-51.89688\\-189.8959\\23\\-52.10274\\-185.9896\\23\\-52.77488\\-184.0365\\23\\-53.0106\\-183.7991\\23\\-54.96373\\-183.3976\\23\\-56.70456\\-184.0365\\23\\-57.02536\\-184.0365\\23\\-56.69149\\-182.0834\\23\\-55.87247\\-180.1303\\23\\-54.28325\\-178.1771\\23\\-54.96373\\-176.3231\\23\\-55.86994\\-174.2709\\23\\-56.02387\\-172.3178\\23\\-56.43745\\-170.3646\\23\\-55.70225\\-168.4115\\23\\-54.96373\\-167.783\\23\\-53.0106\\-167.9495\\23\\-52.43054\\-168.4115\\23\\-50.80999\\-170.3646\\23\\-51.21907\\-172.3178\\23\\-51.05748\\-172.5097\\23\\-49.10435\\-173.3939\\23\\-47.57553\\-172.3178\\23\\-46.43139\\-170.3646\\23\\-46.16598\\-168.4115\\23\\-46.03447\\-162.5521\\23\\-45.1981\\-160.6539\\23\\-42.7053\\-158.6459\\23\\-41.29185\\-157.8402\\23\\-37.3856\\-157.8305\\23\\-35.43248\\-158.5645\\23\\-33.47935\\-159.7723\\23\\-31.87366\\-160.599\\23\\-29.5731\\-162.6361\\23\\-27.61998\\-163.7158\\23\\-23.71373\\-163.705\\23\\-21.7606\\-162.5761\\23\\-19.80748\\-162.4855\\23\\-17.85435\\-163.608\\23\\-13.9481\\-163.7436\\23\\-11.99498\\-164.8464\\23\\-10.04185\\-166.726\\23\\-8.798469\\-168.4115\\23\\-7.558592\\-170.3646\\23\\-6.069017\\-174.2709\\23\\-4.954981\\-178.1771\\23\\-4.087735\\-180.1303\\23\\-3.463686\\-182.0834\\23\\-2.229351\\-183.2754\\23\\-0.276226\\-184.8495\\23\\1.676899\\-185.7288\\23\\3.630024\\-187.3115\\23\\5.583149\\-187.8762\\23\\7.536274\\-188.6318\\23\\9.489399\\-189.1934\\23\\11.44252\\-189.6484\\23\\19.25502\\-189.6484\\23\\23.16127\\-189.8583\\23\\25.1144\\-190.6505\\23\\27.06752\\-190.9929\\23\\29.02065\\-190.5452\\23\\30.97377\\-188.9917\\23\\34.88002\\-185.0798\\23\\38.78627\\-183.0348\\23\\40.7394\\-182.3425\\23\\42.69252\\-182.2055\\23\\44.64565\\-182.2055\\23\\46.59877\\-182.091\\23\\48.5519\\-182.0758\\23\\50.50502\\-182.3539\\23\\52.45815\\-183.168\\23\\54.41127\\-184.8035\\23\\56.3644\\-185.3754\\23\\58.87164\\-187.9428\\23\\59.43943\\-189.8959\\23\\60.89918\\-191.849\\23\\61.20702\\-193.8021\\23\\61.21896\\-197.7084\\23\\62.22377\\-198.9062\\23\\64.1769\\-200.3446\\23\\65.35535\\-201.6146\\23\\64.1769\\-203.4303\\23\\62.22377\\-202.4254\\23\\60.27065\\-202.5771\\23\\59.3589\\-203.5678\\23\\58.97365\\-205.5209\\23\\57.56899\\-207.474\\23\\56.87315\\-209.4271\\23\\54.41127\\-211.8163\\23\\52.45815\\-212.6192\\23\\50.50502\\-214.1135\\23\\48.5519\\-215.0047\\23\\46.59877\\-215.039\\23\\44.64565\\-215.6433\\23\\40.7394\\-216.3598\\23\\38.78627\\-216.8503\\23\\34.88002\\-216.9227\\23\\32.9269\\-217.5652\\23\\30.97377\\-217.8958\\23\\29.02065\\-217.9351\\23\\27.06752\\-218.3656\\23\\25.1144\\-219.4633\\23\\23.16127\\-219.4402\\23\\21.20815\\-218.3763\\23\\19.25502\\-218.3305\\23\\17.3019\\-218.8888\\23\\15.34877\\-219.9927\\23\\13.39565\\-220.8868\\23\\7.536274\\-220.8868\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "428" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.59117\\-148.8803\\23\\38.78627\\-147.7816\\23\\36.83315\\-145.849\\23\\34.88002\\-144.5032\\23\\32.9269\\-143.5307\\23\\32.40732\\-143.0209\\23\\29.3989\\-141.0678\\23\\29.02065\\-140.7212\\23\\27.06752\\-139.7386\\23\\26.44361\\-139.1146\\23\\25.46317\\-137.1615\\23\\24.2742\\-135.2084\\23\\23.63494\\-133.2553\\23\\23.16127\\-131.2201\\23\\25.80514\\-129.349\\23\\27.06752\\-128.5361\\23\\29.02065\\-127.8118\\23\\30.97377\\-127.8023\\23\\32.9269\\-126.5777\\23\\34.00917\\-125.4428\\23\\35.02863\\-123.4896\\23\\35.66431\\-121.5365\\23\\36.83315\\-120.6043\\23\\38.78627\\-120.8285\\23\\41.48275\\-123.4896\\23\\42.30558\\-125.4428\\23\\43.49988\\-127.3959\\23\\43.67356\\-129.349\\23\\41.98096\\-131.3021\\23\\41.79206\\-133.2553\\23\\41.85736\\-135.2084\\23\\41.77856\\-137.1615\\23\\43.4441\\-139.1146\\23\\43.73884\\-141.0678\\23\\41.78302\\-144.974\\23\\42.4107\\-146.9271\\23\\40.89602\\-148.8803\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "109" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "429" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-213.9257\\23\\85.66128\\-211.8248\\23\\85.28425\\-211.3803\\23\\84.94707\\-207.474\\23\\84.75888\\-203.5678\\23\\84.75888\\-201.6146\\23\\84.30616\\-199.6615\\23\\82.92783\\-197.7084\\23\\82.75211\\-195.7553\\23\\81.58987\\-193.8021\\23\\80.80982\\-191.849\\23\\80.28725\\-189.8959\\23\\78.99195\\-187.9428\\23\\78.8159\\-185.9896\\23\\72.94202\\-174.2709\\23\\71.02653\\-170.3646\\23\\70.03628\\-168.6418\\23\\65.94302\\-164.5053\\23\\64.68871\\-162.5521\\23\\62.22377\\-159.9358\\23\\60.27065\\-158.7544\\23\\58.18982\\-156.6928\\23\\56.3644\\-155.4758\\23\\54.41127\\-153.8929\\23\\52.45815\\-153.1013\\23\\50.50502\\-151.9639\\23\\48.22006\\-150.8334\\23\\47.25861\\-148.8803\\23\\47.08706\\-146.9271\\23\\45.89077\\-144.974\\23\\46.24772\\-143.0209\\23\\46.28065\\-141.0678\\23\\46.1734\\-137.1615\\23\\46.18283\\-133.2553\\23\\47.64545\\-131.3021\\23\\48.09892\\-129.349\\23\\48.15517\\-125.4428\\23\\48.06362\\-123.4896\\23\\47.38503\\-121.5365\\23\\45.75599\\-119.5834\\23\\45.54743\\-117.6303\\23\\44.00734\\-115.6771\\23\\43.05165\\-113.724\\23\\42.39956\\-111.7709\\23\\42.42199\\-109.8178\\23\\43.75909\\-107.8646\\23\\45.40248\\-105.9115\\23\\45.69197\\-103.9584\\23\\45.71442\\-102.0053\\23\\46.59877\\-100.613\\23\\48.5519\\-100.1329\\23\\50.50502\\-100.8306\\23\\52.45815\\-101.0545\\23\\54.41127\\-101.8959\\23\\56.3644\\-103.3544\\23\\58.55325\\-105.9115\\23\\59.31513\\-107.8646\\23\\59.87392\\-109.8178\\23\\61.02372\\-111.7709\\23\\61.80783\\-113.724\\23\\63.00407\\-115.6771\\23\\63.69728\\-117.6303\\23\\64.62079\\-119.5834\\23\\65.27832\\-121.5365\\23\\65.59989\\-123.4896\\23\\66.51941\\-125.4428\\23\\67.29369\\-127.3959\\23\\67.63926\\-129.349\\23\\68.77673\\-131.3021\\23\\69.58329\\-133.2553\\23\\70.67048\\-135.2084\\23\\71.62241\\-137.1615\\23\\72.33592\\-139.1146\\23\\73.21499\\-141.0678\\23\\74.43369\\-143.0209\\23\\75.05663\\-144.974\\23\\76.33954\\-146.9271\\23\\76.99658\\-148.8803\\23\\78.38699\\-150.8334\\23\\78.9602\\-152.7865\\23\\80.59333\\-154.7396\\23\\81.23307\\-156.6928\\23\\82.64568\\-158.6459\\23\\84.59881\\-160.599\\23\\86.15833\\-162.5521\\23\\87.30428\\-164.5053\\23\\87.6144\\-164.8196\\23\\90.37083\\-168.4115\\23\\92.22839\\-170.3646\\23\\93.15896\\-172.3178\\23\\94.26234\\-174.2709\\23\\95.4269\\-176.8326\\23\\95.96317\\-178.1771\\23\\96.4942\\-180.1303\\23\\96.90918\\-182.0834\\23\\97.07606\\-185.9896\\23\\97.07606\\-187.9428\\23\\97.20564\\-189.8959\\23\\97.19302\\-191.849\\23\\97.07606\\-193.8021\\23\\97.0545\\-197.7084\\23\\96.54881\\-199.6615\\23\\96.32534\\-201.6146\\23\\95.90651\\-203.5678\\23\\94.70049\\-205.5209\\23\\93.22629\\-209.4271\\23\\93.18081\\-211.3803\\23\\91.90986\\-213.3334\\23\\91.52065\\-213.6799\\23" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "173" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "430" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-95.97935\\-208.6449\\25\\-97.02536\\-207.474\\25\\-98.53221\\-205.5209\\25\\-98.86818\\-203.5678\\25\\-98.90483\\-201.6146\\25\\-99.08659\\-199.6615\\25\\-99.61507\\-197.7084\\25\\-99.62651\\-195.7553\\25\\-100.5418\\-193.8021\\25\\-100.8784\\-191.849\\25\\-100.8784\\-187.9428\\25\\-100.612\\-185.9896\\25\\-99.62651\\-184.0365\\25\\-99.52878\\-182.0834\\25\\-98.98185\\-180.1303\\25\\-98.61858\\-178.1771\\25\\-97.60696\\-176.224\\25\\-96.74167\\-174.2709\\25\\-95.17033\\-172.3178\\25\\-93.95647\\-170.3646\\25\\-92.0731\\-167.6687\\25\\-91.34694\\-166.4584\\25\\-90.53592\\-164.5053\\25\\-90.11997\\-164.0733\\25\\-87.49735\\-160.599\\25\\-86.71944\\-158.6459\\25\\-85.50571\\-156.6928\\25\\-84.78645\\-154.7396\\25\\-83.73865\\-152.7865\\25\\-83.12378\\-150.8334\\25\\-81.79379\\-148.8803\\25\\-81.03082\\-144.974\\25\\-79.89239\\-143.0209\\25\\-79.38979\\-141.0678\\25\\-79.06407\\-139.1146\\25\\-78.08641\\-137.1615\\25\\-76.35336\\-133.2553\\25\\-76.13329\\-131.3021\\25\\-75.16128\\-129.349\\25\\-74.38647\\-127.3959\\25\\-74.29554\\-125.4428\\25\\-73.24798\\-123.4896\\25\\-72.41978\\-121.5365\\25\\-72.28276\\-119.5834\\25\\-71.20634\\-117.6303\\25\\-70.3069\\-115.6771\\25\\-69.83862\\-113.724\\25\\-68.6356\\-111.5455\\25\\-67.87971\\-109.8178\\25\\-66.68247\\-108.2417\\25\\-64.37964\\-105.9115\\25\\-62.77623\\-104.499\\25\\-60.8231\\-106.2284\\25\\-56.91685\\-107.8873\\25\\-55.23426\\-109.8178\\25\\-54.89663\\-113.724\\25\\-55.50195\\-115.6771\\25\\-55.98956\\-117.6303\\25\\-56.92448\\-119.5834\\25\\-57.5383\\-121.5365\\25\\-57.74825\\-123.4896\\25\\-57.6059\\-125.4428\\25\\-55.98423\\-129.349\\25\\-53.0106\\-132.3448\\25\\-51.05748\\-134.0796\\25\\-50.11171\\-135.2084\\25\\-49.10435\\-136.1892\\25\\-47.44781\\-135.2084\\25\\-47.87368\\-133.2553\\25\\-49.6131\\-131.3021\\25\\-50.58663\\-129.349\\25\\-50.86914\\-127.3959\\25\\-50.16837\\-125.4428\\25\\-49.22642\\-123.4896\\25\\-47.85711\\-121.5365\\25\\-45.1981\\-118.8635\\25\\-43.22227\\-117.6303\\25\\-41.29185\\-116.5661\\25\\-39.33873\\-116.472\\25\\-37.3856\\-116.5235\\25\\-35.43248\\-116.7873\\25\\-33.47935\\-118.5254\\25\\-31.52623\\-118.5736\\25\\-29.5731\\-116.6733\\25\\-27.61998\\-116.5396\\25\\-25.66685\\-118.032\\25\\-23.71373\\-118.6351\\25\\-21.7606\\-118.6431\\25\\-19.80748\\-119.8558\\25\\-18.73326\\-121.5365\\25\\-17.85435\\-122.5732\\25\\-15.90123\\-123.9516\\25\\-11.99498\\-124.0967\\25\\-10.04185\\-123.0832\\25\\-8.088726\\-122.3351\\25\\-5.81008\\-123.4896\\25\\-4.182476\\-124.0967\\25\\-2.229351\\-124.1039\\25\\-0.276226\\-124.4214\\25\\1.676899\\-124.5617\\25\\3.630024\\-124.5617\\25\\5.006706\\-125.4428\\25\\5.583149\\-125.9552\\25\\6.699888\\-127.3959\\25\\7.71066\\-131.3021\\25\\8.098207\\-133.2553\\25\\7.882796\\-135.2084\\25\\8.352305\\-137.1615\\25\\7.980166\\-139.1146\\25\\7.074307\\-141.0678\\25\\6.818501\\-143.0209\\25\\5.583149\\-145.0941\\25\\3.630024\\-146.2068\\25\\-0.276226\\-146.2643\\25\\-2.229351\\-147.1674\\25\\-4.182476\\-145.4869\\25\\-4.633673\\-144.974\\25\\-5.469301\\-143.0209\\25\\-5.150434\\-141.0678\\25\\-5.366617\\-139.1146\\25\\-8.088726\\-136.3367\\25\\-11.19356\\-133.2553\\25\\-11.99498\\-131.6524\\25\\-13.58952\\-129.349\\25\\-13.9481\\-129.0389\\25\\-15.90123\\-128.4192\\25\\-17.85435\\-128.3939\\25\\-21.7606\\-128.4805\\25\\-23.71373\\-129.4976\\25\\-27.61998\\-130.9948\\25\\-27.95544\\-131.3021\\25\\-29.5731\\-133.4236\\25\\-30.38182\\-135.2084\\25\\-32.30847\\-137.1615\\25\\-39.33873\\-144.1389\\25\\-41.29185\\-145.278\\25\\-45.1981\\-146.4832\\25\\-47.15123\\-148.1237\\25\\-49.10435\\-149.9433\\25\\-51.05748\\-149.9169\\25\\-53.0106\\-150.0511\\25\\-54.96373\\-151.1039\\25\\-56.91685\\-151.648\\25\\-58.86998\\-152.4935\\25\\-60.8231\\-153.8298\\25\\-62.77623\\-155.7757\\25\\-64.72935\\-157.3818\\25\\-66.02634\\-158.6459\\25\\-66.68247\\-159.8016\\25\\-68.42241\\-162.5521\\25\\-72.54185\\-166.7065\\25\\-73.48734\\-168.4115\\25\\-74.32059\\-170.3646\\25\\-75.47153\\-172.3178\\25\\-75.51299\\-174.2709\\25\\-76.58308\\-176.224\\25\\-77.45192\\-178.1771\\25\\-78.48581\\-180.1303\\25\\-79.41738\\-182.0834\\25\\-79.43034\\-184.0365\\25\\-80.55112\\-185.9896\\25\\-82.30747\\-189.7738\\25\\-83.38085\\-191.849\\25\\-83.4394\\-193.8021\\25\\-84.17983\\-195.7553\\25\\-85.31579\\-197.7084\\25\\-85.40817\\-201.6146\\25\\-85.5852\\-203.5678\\25\\-86.21372\\-204.6323\\25\\-87.22018\\-205.5209\\25\\-88.16685\\-206.051\\25\\-92.0731\\-206.7416\\25\\-94.02622\\-208.4969\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "431" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-216.3667\\25\\-93.13712\\-215.2865\\25\\-92.0731\\-213.6157\\25\\-90.11997\\-212.453\\25\\-88.16685\\-209.8447\\25\\-86.21372\\-209.1123\\25\\-85.89891\\-209.4271\\25\\-85.52468\\-211.3803\\25\\-85.76074\\-213.3334\\25\\-86.89894\\-215.2865\\25\\-88.16685\\-216.4944\\25\\-90.11997\\-217.0158\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "432" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-45.34671\\-111.7709\\25\\-45.93541\\-109.8178\\25\\-45.1981\\-109.0163\\25\\-43.24498\\-107.4479\\25\\-41.29185\\-107.2873\\25\\-38.72631\\-109.8178\\25\\-40.20206\\-111.7709\\25\\-41.29185\\-112.9903\\25\\-43.24498\\-113.601\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "139" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "433" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "3.630024\\-219.6367\\25\\1.676899\\-218.8998\\25\\-0.276226\\-218.0519\\25\\-3.130406\\-215.2865\\25\\-5.052227\\-213.3334\\25\\-5.853774\\-211.3803\\25\\-6.800369\\-209.4271\\25\\-8.088726\\-207.2623\\25\\-10.04185\\-207.107\\25\\-11.99498\\-208.571\\25\\-13.9481\\-207.5443\\25\\-15.90123\\-206.2224\\25\\-17.85435\\-204.6973\\25\\-21.7606\\-204.6144\\25\\-23.71373\\-203.6965\\25\\-25.66685\\-202.6358\\25\\-29.5731\\-202.5958\\25\\-31.52623\\-201.1606\\25\\-33.47935\\-200.67\\25\\-39.33873\\-200.589\\25\\-41.29185\\-199.4258\\25\\-43.24498\\-198.7133\\25\\-45.1981\\-198.6255\\25\\-47.15123\\-197.5214\\25\\-49.10435\\-196.7509\\25\\-51.05748\\-195.5501\\25\\-53.0106\\-192.0725\\25\\-53.20167\\-191.849\\25\\-53.93963\\-189.8959\\25\\-53.9828\\-187.9428\\25\\-54.96373\\-185.9669\\25\\-56.91685\\-186.2896\\25\\-57.22791\\-185.9896\\25\\-57.7966\\-184.0365\\25\\-55.7751\\-180.1303\\25\\-54.96373\\-178.277\\25\\-55.64279\\-176.224\\25\\-55.82451\\-174.2709\\25\\-55.59927\\-172.3178\\25\\-54.79603\\-170.3646\\25\\-53.0106\\-169.3125\\25\\-51.32719\\-170.3646\\25\\-52.02884\\-174.2709\\25\\-53.0106\\-175.7242\\25\\-53.75739\\-176.224\\25\\-53.0106\\-177.0484\\25\\-51.05748\\-177.1635\\25\\-49.10435\\-176.3342\\25\\-46.77709\\-174.2709\\25\\-46.10702\\-172.3178\\25\\-45.62347\\-170.3646\\25\\-44.90317\\-168.4115\\25\\-44.38673\\-166.4584\\25\\-44.13643\\-164.5053\\25\\-43.24498\\-162.7855\\25\\-41.08746\\-160.599\\25\\-39.33873\\-159.6431\\25\\-37.3856\\-160.3858\\25\\-35.43248\\-161.6954\\25\\-33.47935\\-162.4996\\25\\-31.52623\\-163.7104\\25\\-29.78236\\-164.5053\\25\\-27.61998\\-165.6635\\25\\-23.71373\\-165.7025\\25\\-21.7606\\-165.0099\\25\\-19.80748\\-163.8358\\25\\-15.90123\\-165.3208\\25\\-13.9481\\-165.7141\\25\\-11.99498\\-166.8153\\25\\-10.04185\\-168.7441\\25\\-8.813099\\-170.3646\\25\\-7.583412\\-172.3178\\25\\-6.861763\\-174.2709\\25\\-5.986994\\-176.224\\25\\-5.521312\\-178.1771\\25\\-4.928127\\-180.1303\\25\\-3.139792\\-182.0834\\25\\-2.229351\\-182.8927\\25\\-0.276226\\-183.2599\\25\\1.676899\\-184.8577\\25\\3.630024\\-185.6967\\25\\5.583149\\-187.1912\\25\\7.536274\\-187.7942\\25\\9.489399\\-188.9694\\25\\11.44252\\-189.6484\\25\\13.39565\\-189.6484\\25\\17.3019\\-189.8151\\25\\19.25502\\-189.8437\\25\\21.20815\\-190.6821\\25\\23.16127\\-191.0874\\25\\27.06752\\-191.6133\\25\\29.02065\\-191.242\\25\\30.97377\\-190.0598\\25\\33.12919\\-187.9428\\25\\34.32591\\-185.9896\\25\\34.88002\\-185.3574\\25\\36.83315\\-184.0138\\25\\38.78627\\-183.0092\\25\\40.7394\\-182.2055\\25\\44.64565\\-182.2055\\25\\46.59877\\-181.2773\\25\\48.5519\\-181.334\\25\\50.50502\\-182.3072\\25\\52.45815\\-183.1432\\25\\56.3644\\-185.1699\\25\\59.13208\\-187.9428\\25\\60.88494\\-189.8959\\25\\61.31427\\-191.849\\25\\61.63143\\-193.8021\\25\\61.63143\\-195.7553\\25\\61.77079\\-197.7084\\25\\62.22377\\-198.2031\\25\\64.1769\\-199.6868\\25\\66.13003\\-200.9655\\25\\66.73901\\-201.6146\\25\\66.13003\\-202.314\\25\\64.1769\\-202.6311\\25\\62.22377\\-202.4214\\25\\60.93407\\-203.5678\\25\\59.38167\\-205.5209\\25\\59.28124\\-207.474\\25\\58.31752\\-209.275\\25\\56.32684\\-211.3803\\25\\54.41127\\-212.6131\\25\\52.45815\\-212.9564\\25\\50.50502\\-214.1221\\25\\48.5519\\-214.8946\\25\\44.64565\\-214.925\\25\\42.69252\\-215.0009\\25\\38.78627\\-215.929\\25\\32.9269\\-215.929\\25\\27.06752\\-216.0069\\25\\23.16127\\-216.1025\\25\\21.20815\\-216.0538\\25\\19.25502\\-216.6755\\25\\15.34877\\-219.9341\\25\\13.39565\\-220.8076\\25\\11.44252\\-220.8984\\25\\7.536274\\-220.8868\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "434" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "38.78627\\-147.6583\\25\\36.83315\\-146.4832\\25\\34.88002\\-145.8562\\25\\32.9269\\-144.1349\\25\\30.97377\\-142.5679\\25\\29.02065\\-142.0223\\25\\27.06752\\-140.6614\\25\\25.1144\\-139.6887\\25\\24.51863\\-139.1146\\25\\23.59596\\-135.2084\\25\\22.82518\\-133.2553\\25\\22.77433\\-131.3021\\25\\23.16127\\-130.8627\\25\\25.56717\\-129.349\\25\\27.06752\\-128.4983\\25\\29.02065\\-127.8118\\25\\30.97377\\-127.7424\\25\\32.9269\\-126.5105\\25\\33.94437\\-125.4428\\25\\35.71355\\-121.5365\\25\\36.83315\\-120.5972\\25\\38.78627\\-120.8041\\25\\41.48647\\-123.4896\\25\\43.23693\\-125.4428\\25\\43.7944\\-127.3959\\25\\43.92531\\-129.349\\25\\43.55099\\-131.3021\\25\\42.24863\\-133.2553\\25\\41.99709\\-135.2084\\25\\42.46716\\-137.1615\\25\\43.80424\\-139.1146\\25\\44.06078\\-141.0678\\25\\43.73628\\-143.0209\\25\\42.51814\\-144.974\\25\\42.55709\\-146.9271\\25\\40.7394\\-148.4007\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "106" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "435" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-214.1997\\25\\87.6144\\-212.4747\\25\\86.76804\\-211.3803\\25\\86.3646\\-209.4271\\25\\85.24533\\-207.474\\25\\85.19931\\-205.5209\\25\\86.12544\\-203.5678\\25\\86.22012\\-201.6146\\25\\84.9229\\-199.6615\\25\\84.78152\\-197.7084\\25\\84.23927\\-195.7553\\25\\82.87942\\-193.8021\\25\\82.80972\\-191.849\\25\\80.81381\\-187.9428\\25\\80.75704\\-185.9896\\25\\79.88267\\-184.0365\\25\\78.82534\\-182.0834\\25\\76.86761\\-178.1771\\25\\75.9809\\-176.224\\25\\74.90527\\-174.2709\\25\\74.04409\\-172.3178\\25\\71.9894\\-168.6693\\25\\69.8395\\-166.4584\\25\\66.13003\\-162.7715\\25\\64.02829\\-160.599\\25\\59.91017\\-156.6928\\25\\58.31752\\-155.4942\\25\\56.3644\\-154.2847\\25\\54.41127\\-153.4883\\25\\52.45815\\-153.1226\\25\\50.50502\\-151.9781\\25\\49.07409\\-150.8334\\25\\47.8693\\-148.8803\\25\\48.02387\\-146.9271\\25\\47.78661\\-144.974\\25\\47.68719\\-141.0678\\25\\47.06962\\-139.1146\\25\\46.16812\\-137.1615\\25\\46.26268\\-135.2084\\25\\47.36923\\-133.2553\\25\\47.93761\\-131.3021\\25\\48.15517\\-129.349\\25\\48.13596\\-125.4428\\25\\47.67393\\-123.4896\\25\\45.88434\\-121.5365\\25\\44.88137\\-119.5834\\25\\43.73732\\-117.6303\\25\\42.04324\\-115.6771\\25\\41.6489\\-113.724\\25\\41.65336\\-111.7709\\25\\41.99641\\-109.8178\\25\\45.7437\\-105.9115\\25\\46.15488\\-103.9584\\25\\46.30581\\-102.0053\\25\\46.59877\\-101.6936\\25\\48.5519\\-100.7547\\25\\50.50502\\-100.7663\\25\\52.45815\\-99.79305\\25\\54.41127\\-100.5973\\25\\56.3644\\-102.4154\\25\\58.31752\\-105.1548\\25\\58.93181\\-105.9115\\25\\60.74149\\-109.8178\\25\\61.80783\\-113.724\\25\\63.00407\\-115.6771\\25\\63.69728\\-117.6303\\25\\64.93804\\-119.5834\\25\\65.50858\\-121.5365\\25\\65.62471\\-123.4896\\25\\66.82529\\-125.4428\\25\\67.48341\\-127.3959\\25\\69.30386\\-131.3021\\25\\69.68975\\-133.2553\\25\\70.8164\\-135.2084\\25\\72.71297\\-139.1146\\25\\74.22435\\-141.0678\\25\\75.08031\\-143.0209\\25\\75.63656\\-144.974\\25\\76.63666\\-146.9271\\25\\78.24551\\-148.8803\\25\\78.89945\\-150.8334\\25\\80.33203\\-152.7865\\25\\81.25818\\-156.6928\\25\\82.75162\\-158.6459\\25\\83.70815\\-159.4823\\25\\85.66128\\-160.9373\\25\\87.6144\\-163.56\\25\\89.97183\\-166.4584\\25\\92.76962\\-170.3646\\25\\93.98806\\-172.3178\\25\\94.7216\\-174.2709\\25\\95.97445\\-176.224\\25\\97.07606\\-180.1303\\25\\97.25796\\-182.0834\\25\\97.97562\\-184.0365\\25\\98.2929\\-185.9896\\25\\98.2929\\-197.7084\\25\\97.85368\\-199.6615\\25\\97.0545\\-201.6146\\25\\96.55129\\-203.5678\\25\\95.82613\\-205.5209\\25\\94.6596\\-207.474\\25\\93.87051\\-209.4271\\25\\93.18081\\-211.3803\\25\\92.17365\\-213.3334\\25\\91.52065\\-213.9636\\25" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "187" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "436" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-95.97935\\-209.9414\\27\\-98.49441\\-207.474\\27\\-99.38029\\-203.5678\\27\\-100.4661\\-201.6146\\27\\-100.8827\\-199.6615\\27\\-100.8909\\-195.7553\\27\\-100.9654\\-193.8021\\27\\-101.2614\\-191.849\\27\\-101.2317\\-187.9428\\27\\-100.9199\\-185.9896\\27\\-100.8909\\-182.0834\\27\\-100.5687\\-180.1303\\27\\-98.99978\\-178.1771\\27\\-98.61205\\-176.224\\27\\-97.12412\\-174.2709\\27\\-96.5631\\-172.3178\\27\\-94.78982\\-170.3646\\27\\-93.30006\\-168.4115\\27\\-92.55271\\-166.4584\\27\\-90.89832\\-164.5053\\27\\-89.49519\\-162.5521\\27\\-88.6339\\-160.599\\27\\-87.49077\\-158.6459\\27\\-86.61548\\-156.6928\\27\\-85.46362\\-154.7396\\27\\-84.74596\\-152.7865\\27\\-83.4766\\-150.8334\\27\\-82.89451\\-148.8803\\27\\-81.79379\\-146.9271\\27\\-81.04045\\-143.0209\\27\\-79.90137\\-141.0678\\27\\-79.38979\\-139.1146\\27\\-79.03677\\-137.1615\\27\\-77.5021\\-135.2084\\27\\-77.01776\\-133.2553\\27\\-76.4481\\-131.7016\\27\\-75.20286\\-129.349\\27\\-74.38647\\-127.3959\\27\\-74.29554\\-125.4428\\27\\-73.24798\\-123.4896\\27\\-72.43334\\-121.5365\\27\\-72.38026\\-119.5834\\27\\-71.2346\\-117.6303\\27\\-70.40173\\-115.6771\\27\\-70.31819\\-113.724\\27\\-69.20625\\-111.7709\\27\\-67.21018\\-107.8646\\27\\-65.92293\\-105.9115\\27\\-64.92042\\-103.9584\\27\\-62.77623\\-102.0723\\27\\-60.8231\\-104.0546\\27\\-58.64521\\-105.9115\\27\\-56.91685\\-107.0887\\27\\-56.07735\\-107.8646\\27\\-54.8873\\-109.8178\\27\\-54.02531\\-111.7709\\27\\-53.97745\\-113.724\\27\\-54.96373\\-115.9158\\27\\-55.93593\\-119.5834\\27\\-56.72578\\-121.5365\\27\\-56.92448\\-123.4896\\27\\-56.95441\\-125.4428\\27\\-56.82211\\-127.3959\\27\\-56.03495\\-129.349\\27\\-54.96373\\-130.5026\\27\\-52.16818\\-133.2553\\27\\-51.4369\\-135.2084\\27\\-52.15175\\-137.1615\\27\\-52.09427\\-139.1146\\27\\-51.05748\\-140.4672\\27\\-49.80561\\-139.1146\\27\\-49.10435\\-137.5069\\27\\-47.70345\\-135.2084\\27\\-48.2518\\-133.2553\\27\\-50.16447\\-131.3021\\27\\-50.90887\\-129.349\\27\\-49.39732\\-125.4428\\27\\-48.2108\\-123.4896\\27\\-44.375\\-119.5834\\27\\-42.74813\\-117.6303\\27\\-41.74075\\-115.6771\\27\\-43.33972\\-113.724\\27\\-44.09016\\-111.7709\\27\\-44.08014\\-109.8178\\27\\-43.24498\\-108.7808\\27\\-41.29185\\-108.0341\\27\\-39.33873\\-108.5985\\27\\-38.30845\\-109.8178\\27\\-39.87774\\-111.7709\\27\\-40.55582\\-113.724\\27\\-40.82012\\-115.6771\\27\\-39.33873\\-116.4827\\27\\-37.3856\\-116.4272\\27\\-35.43248\\-116.4932\\27\\-33.47935\\-117.1637\\27\\-31.52623\\-118.3627\\27\\-29.5731\\-117.4938\\27\\-27.61998\\-117.4433\\27\\-25.66685\\-118.4087\\27\\-21.7606\\-118.6282\\27\\-20.70856\\-119.5834\\27\\-17.85435\\-122.7053\\27\\-15.90123\\-124.0416\\27\\-11.99498\\-124.0322\\27\\-10.04185\\-123.3676\\27\\-8.088726\\-122.8335\\27\\-4.182476\\-124.0695\\27\\-2.229351\\-124.0063\\27\\3.630024\\-124.1144\\27\\5.145793\\-125.4428\\27\\6.363338\\-127.3959\\27\\6.777315\\-129.349\\27\\6.50499\\-131.3021\\27\\6.559711\\-137.1615\\27\\6.475886\\-143.0209\\27\\6.623959\\-144.974\\27\\6.171673\\-146.9271\\27\\5.583149\\-147.5157\\27\\3.630024\\-148.2344\\27\\1.676899\\-148.2413\\27\\-0.276226\\-149.345\\27\\-2.229351\\-150.1059\\27\\-3.591113\\-148.8803\\27\\-3.946754\\-146.9271\\27\\-4.68779\\-144.974\\27\\-5.060525\\-143.0209\\27\\-5.269915\\-141.0678\\27\\-5.605467\\-139.1146\\27\\-7.284788\\-137.1615\\27\\-11.15716\\-133.2553\\27\\-11.16417\\-131.3021\\27\\-11.95622\\-129.349\\27\\-13.9481\\-128.1725\\27\\-15.90123\\-127.8398\\27\\-17.85435\\-127.0802\\27\\-19.80748\\-127.1158\\27\\-21.7606\\-127.7926\\27\\-23.71373\\-126.9873\\27\\-25.66685\\-127.6815\\27\\-27.61998\\-129.4156\\27\\-28.93756\\-131.3021\\27\\-29.40795\\-133.2553\\27\\-30.24484\\-135.2084\\27\\-33.47935\\-138.2865\\27\\-37.3856\\-142.2153\\27\\-39.33873\\-143.9161\\27\\-41.29185\\-144.3967\\27\\-43.24498\\-145.3829\\27\\-45.1981\\-146.1779\\27\\-47.15123\\-148.0621\\27\\-49.10435\\-149.5296\\27\\-51.05748\\-150.0136\\27\\-54.96373\\-151.1589\\27\\-56.91685\\-151.8811\\27\\-58.86998\\-152.1088\\27\\-60.8231\\-152.8531\\27\\-62.77623\\-154.8344\\27\\-64.72935\\-155.5697\\27\\-66.36558\\-156.6928\\27\\-67.81065\\-158.6459\\27\\-68.48699\\-160.599\\27\\-72.54185\\-164.5443\\27\\-74.49497\\-167.56\\27\\-76.4481\\-170.4565\\27\\-77.40746\\-172.3178\\27\\-78.00672\\-174.2709\\27\\-78.40122\\-174.6817\\27\\-79.39075\\-176.224\\27\\-79.40337\\-178.1771\\27\\-80.51456\\-180.1303\\27\\-81.43894\\-182.0834\\27\\-81.44376\\-184.0365\\27\\-82.30747\\-185.6834\\27\\-82.58542\\-185.9896\\27\\-83.43187\\-187.9428\\27\\-83.52818\\-189.8959\\27\\-84.81948\\-191.849\\27\\-85.3954\\-193.8021\\27\\-85.73412\\-197.7084\\27\\-86.7556\\-199.6615\\27\\-87.33298\\-201.6146\\27\\-87.3419\\-203.5678\\27\\-87.96741\\-205.5209\\27\\-88.16685\\-205.7261\\27\\-90.11997\\-206.6685\\27\\-92.0731\\-207.107\\27\\-94.02622\\-208.8825\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "437" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-92.0731\\-216.0052\\27\\-92.79181\\-215.2865\\27\\-92.28915\\-213.3334\\27\\-90.11997\\-212.3673\\27\\-88.16685\\-210.7447\\27\\-86.96568\\-211.3803\\27\\-86.8874\\-213.3334\\27\\-87.57451\\-215.2865\\27\\-88.16685\\-216.0044\\27\\-90.11997\\-216.9163\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "122" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "438" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-220.0467\\27\\3.630024\\-219.0573\\27\\1.676899\\-218.9811\\27\\-0.276226\\-218.0959\\27\\-5.096371\\-213.3334\\27\\-6.135601\\-212.1263\\27\\-6.936382\\-211.3803\\27\\-8.088726\\-210.5725\\27\\-11.99498\\-210.5363\\27\\-13.9481\\-209.6182\\27\\-17.85435\\-207.4364\\27\\-19.80748\\-206.6201\\27\\-21.7606\\-206.6201\\27\\-23.71373\\-205.695\\27\\-25.66685\\-204.6\\27\\-29.5731\\-204.6\\27\\-33.47935\\-202.6126\\27\\-41.29185\\-202.5912\\27\\-43.24498\\-201.5332\\27\\-45.1981\\-200.6553\\27\\-47.15123\\-200.6076\\27\\-51.05748\\-198.6716\\27\\-52.66288\\-197.7084\\27\\-53.0106\\-197.358\\27\\-53.93148\\-195.7553\\27\\-53.98309\\-193.8021\\27\\-54.31439\\-191.849\\27\\-54.96373\\-189.728\\27\\-56.91685\\-188.4271\\27\\-57.35487\\-187.9428\\27\\-58.46358\\-185.9896\\27\\-57.75705\\-184.0365\\27\\-54.28764\\-180.1303\\27\\-53.0106\\-179.204\\27\\-51.05748\\-178.8732\\27\\-50.23479\\-178.1771\\27\\-48.62474\\-176.224\\27\\-46.48856\\-174.2709\\27\\-44.93901\\-172.3178\\27\\-44.41184\\-170.3646\\27\\-44.09016\\-168.4115\\27\\-43.24498\\-167.1026\\27\\-40.89425\\-164.5053\\27\\-40.25961\\-162.5521\\27\\-39.33873\\-160.8989\\27\\-37.3856\\-159.7861\\27\\-36.62071\\-160.599\\27\\-36.6995\\-162.5521\\27\\-35.43248\\-163.7013\\27\\-33.96763\\-164.5053\\27\\-33.47935\\-164.9139\\27\\-31.52623\\-165.7105\\27\\-29.5731\\-165.8965\\27\\-27.61998\\-167.2977\\27\\-25.66685\\-167.6937\\27\\-19.80748\\-167.6108\\27\\-13.9481\\-167.6999\\27\\-11.99498\\-168.8659\\27\\-10.04185\\-170.7919\\27\\-8.827892\\-172.3178\\27\\-7.635742\\-174.2709\\27\\-6.899647\\-176.224\\27\\-5.192548\\-180.1303\\27\\-4.182476\\-181.1022\\27\\-2.229351\\-182.3309\\27\\-0.276226\\-183.0805\\27\\3.630024\\-185.0797\\27\\5.583149\\-187.0036\\27\\7.536274\\-187.6837\\27\\9.489399\\-188.9344\\27\\11.44252\\-189.6484\\27\\13.39565\\-189.7215\\27\\15.34877\\-190.6244\\27\\17.3019\\-191.0558\\27\\19.25502\\-191.1011\\27\\21.20815\\-192.2923\\27\\23.16127\\-192.9906\\27\\27.06752\\-193.0484\\27\\29.02065\\-192.4941\\27\\30.97377\\-190.8556\\27\\33.81789\\-187.9428\\27\\35.489\\-185.9896\\27\\38.78627\\-183.0258\\27\\40.7394\\-182.2828\\27\\44.64565\\-182.2055\\27\\46.59877\\-181.4273\\27\\48.5519\\-181.5293\\27\\50.50502\\-182.95\\27\\52.45815\\-183.3439\\27\\54.41127\\-184.0289\\27\\56.3644\\-185.1403\\27\\61.09697\\-189.8959\\27\\61.74416\\-191.849\\27\\61.89825\\-195.7553\\27\\63.02493\\-197.7084\\27\\64.1769\\-198.8832\\27\\66.13003\\-200.3109\\27\\67.3941\\-201.6146\\27\\66.13003\\-203.2529\\27\\64.1769\\-202.8948\\27\\62.22377\\-203.7722\\27\\61.25973\\-205.5209\\27\\60.83258\\-207.474\\27\\59.14384\\-209.4271\\27\\56.3644\\-212.1774\\27\\54.41127\\-212.9367\\27\\52.45815\\-213.8592\\27\\50.50502\\-214.2352\\27\\48.5519\\-214.013\\27\\42.69252\\-213.9861\\27\\36.83315\\-214.045\\27\\34.88002\\-212.9789\\27\\32.9269\\-212.3524\\27\\30.97377\\-212.3186\\27\\25.1144\\-212.3186\\27\\23.16127\\-212.3524\\27\\21.20815\\-213.2607\\27\\19.25502\\-214.7602\\27\\14.73438\\-219.1928\\27\\13.39565\\-220.1837\\27\\11.44252\\-220.8116\\27\\7.536274\\-220.8008\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "439" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "42.69252\\-149.6587\\27\\40.7394\\-148.136\\27\\38.78627\\-147.2737\\27\\36.83315\\-147.0492\\27\\34.88002\\-146.0757\\27\\32.9269\\-144.5676\\27\\30.97377\\-143.9744\\27\\29.02065\\-142.6145\\27\\27.06752\\-142.2424\\27\\25.1144\\-141.7059\\27\\23.16127\\-140.1715\\27\\22.14616\\-139.1146\\27\\22.13092\\-133.2553\\27\\22.16019\\-131.3021\\27\\23.16127\\-129.2934\\27\\25.1144\\-128.3596\\27\\29.02065\\-127.7629\\27\\30.97377\\-126.8455\\27\\32.9269\\-125.2405\\27\\34.25906\\-123.4896\\27\\35.89507\\-121.5365\\27\\36.83315\\-120.6748\\27\\38.78627\\-120.8041\\27\\40.7394\\-122.7513\\27\\42.69252\\-124.3809\\27\\43.77808\\-125.4428\\27\\44.13197\\-127.3959\\27\\44.18368\\-129.349\\27\\43.7094\\-131.3021\\27\\42.43344\\-133.2553\\27\\43.21222\\-135.2084\\27\\43.78954\\-137.1615\\27\\44.16603\\-139.1146\\27\\44.28883\\-141.0678\\27\\45.17676\\-143.0209\\27\\45.78727\\-144.974\\27\\45.89907\\-146.9271\\27\\45.20107\\-148.8803\\27\\44.64565\\-149.3999\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "116" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "440" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-212.9415\\27\\88.21149\\-211.3803\\27\\86.9318\\-209.4271\\27\\86.80511\\-207.474\\27\\86.79985\\-205.5209\\27\\86.92535\\-201.6146\\27\\86.79985\\-199.6615\\27\\86.19778\\-197.7084\\27\\84.89965\\-195.7553\\27\\84.78323\\-191.849\\27\\82.80103\\-187.9428\\27\\82.40055\\-185.9896\\27\\81.75503\\-185.3095\\27\\80.83318\\-184.0365\\27\\80.76994\\-182.0834\\27\\79.93833\\-180.1303\\27\\78.82094\\-178.1771\\27\\77.96412\\-176.224\\27\\76.85438\\-174.2709\\27\\76.06711\\-172.3178\\27\\75.89565\\-172.1351\\27\\73.94253\\-168.5499\\27\\71.90482\\-166.4584\\27\\66.13003\\-160.8499\\27\\63.91781\\-158.6459\\27\\62.22377\\-157.4131\\27\\58.31752\\-154.2755\\27\\56.3644\\-153.4626\\27\\54.41127\\-153.1226\\27\\50.50502\\-151.4689\\27\\49.61527\\-150.8334\\27\\48.1305\\-148.8803\\27\\47.87936\\-146.9271\\27\\48.09058\\-143.0209\\27\\48.02177\\-141.0678\\27\\47.39045\\-139.1146\\27\\46.59877\\-137.6454\\27\\46.17585\\-137.1615\\27\\46.59877\\-136.6687\\27\\47.38679\\-135.2084\\27\\47.90256\\-133.2553\\27\\48.12653\\-131.3021\\27\\48.15517\\-127.3959\\27\\48.11721\\-125.4428\\27\\47.40922\\-123.4896\\27\\46.59877\\-122.6956\\27\\44.64565\\-121.2585\\27\\43.64478\\-119.5834\\27\\43.06955\\-117.6303\\27\\41.62759\\-115.6771\\27\\40.76211\\-113.724\\27\\40.80598\\-111.7709\\27\\42.8653\\-109.8178\\27\\44.07599\\-107.8646\\27\\44.64565\\-107.2719\\27\\46.59877\\-105.8886\\27\\47.7753\\-103.9584\\27\\47.85294\\-102.0053\\27\\48.5519\\-101.2728\\27\\50.50502\\-100.8364\\27\\52.45815\\-99.40966\\27\\54.41127\\-99.59016\\27\\56.85268\\-102.0053\\27\\58.9634\\-105.9115\\27\\59.84265\\-107.8646\\27\\60.91999\\-109.8178\\27\\61.70182\\-111.7709\\27\\61.81738\\-113.724\\27\\63.00407\\-115.6771\\27\\63.69728\\-117.6303\\27\\64.94558\\-119.5834\\27\\65.56036\\-121.5365\\27\\65.63318\\-123.4896\\27\\66.85982\\-125.4428\\27\\67.54493\\-127.3959\\27\\68.72473\\-129.349\\27\\70.03628\\-132.4367\\27\\71.9894\\-133.777\\27\\72.57315\\-135.2084\\27\\72.36642\\-137.1615\\27\\73.2864\\-139.1146\\27\\74.67123\\-141.0678\\27\\75.89565\\-143.6185\\27\\77.07627\\-146.9271\\27\\78.57015\\-148.8803\\27\\79.43491\\-150.8334\\27\\80.52223\\-152.7865\\27\\80.75146\\-154.7396\\27\\80.76978\\-156.6928\\27\\81.75503\\-157.7191\\27\\83.70815\\-159.1078\\27\\85.66128\\-159.8324\\27\\86.42406\\-160.599\\27\\88.04909\\-162.5521\\27\\89.56753\\-164.6179\\27\\90.81366\\-166.4584\\27\\92.24776\\-168.4115\\27\\93.873\\-170.3646\\27\\94.71533\\-172.3178\\27\\95.92395\\-174.2709\\27\\96.59232\\-176.224\\27\\97.07606\\-178.1771\\27\\97.98635\\-180.1303\\27\\98.31503\\-182.0834\\27\\98.46844\\-184.0365\\27\\98.82784\\-185.9896\\27\\98.91721\\-191.849\\27\\98.91721\\-197.7084\\27\\98.51102\\-199.6615\\27\\98.33077\\-201.6146\\27\\97.88275\\-203.5678\\27\\96.59232\\-205.5209\\27\\95.8333\\-207.474\\27\\94.18742\\-209.4271\\27\\93.125\\-211.3803\\27\\91.52065\\-213.3105\\27" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "176" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "441" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-98.06528\\-209.4271\\29\\-99.01022\\-207.474\\29\\-100.5315\\-205.5209\\29\\-100.8911\\-203.5678\\29\\-100.9654\\-201.6146\\29\\-101.2846\\-199.6615\\29\\-101.3005\\-195.7553\\29\\-102.4122\\-193.8021\\29\\-102.8927\\-191.849\\29\\-102.8927\\-189.8959\\29\\-102.5549\\-187.9428\\29\\-101.3679\\-185.9896\\29\\-101.3005\\-182.0834\\29\\-100.9947\\-180.1303\\29\\-100.5521\\-178.1771\\29\\-99.02999\\-176.224\\29\\-98.56065\\-174.2709\\29\\-97.12024\\-172.3178\\29\\-96.10142\\-170.3646\\29\\-94.58507\\-168.4115\\29\\-92.88775\\-166.4584\\29\\-91.45604\\-164.5053\\29\\-90.57296\\-162.5521\\29\\-89.43689\\-160.599\\29\\-88.57836\\-158.6459\\29\\-87.01461\\-156.6928\\29\\-85.73412\\-154.7396\\29\\-85.05769\\-152.7865\\29\\-83.75529\\-150.8334\\29\\-83.44228\\-148.8803\\29\\-82.88799\\-146.9271\\29\\-81.74554\\-144.974\\29\\-81.03043\\-141.0678\\29\\-79.84904\\-139.1146\\29\\-79.21656\\-137.1615\\29\\-78.09726\\-135.2084\\29\\-76.4481\\-131.4765\\29\\-75.24657\\-129.349\\29\\-74.45741\\-127.3959\\29\\-74.29554\\-125.4428\\29\\-73.24798\\-123.4896\\29\\-72.43334\\-121.5365\\29\\-72.38026\\-119.5834\\29\\-71.2346\\-117.6303\\29\\-70.40173\\-115.6771\\29\\-70.40173\\-113.724\\29\\-69.23433\\-111.7709\\29\\-67.29713\\-107.8646\\29\\-66.19419\\-105.9115\\29\\-65.90813\\-103.9584\\29\\-64.3428\\-102.0053\\29\\-62.77623\\-101.0115\\29\\-60.8231\\-101.0153\\29\\-59.80508\\-102.0053\\29\\-58.90783\\-103.9584\\29\\-56.83471\\-105.9115\\29\\-53.0106\\-107.8198\\29\\-51.05748\\-107.7914\\29\\-49.78956\\-109.8178\\29\\-50.32949\\-111.7709\\29\\-52.20261\\-113.724\\29\\-53.6703\\-115.6771\\29\\-54.01941\\-117.6303\\29\\-55.36045\\-119.5834\\29\\-55.73664\\-121.5365\\29\\-55.98448\\-123.4896\\29\\-56.75526\\-125.4428\\29\\-56.82211\\-127.3959\\29\\-56.35176\\-129.349\\29\\-55.60577\\-131.3021\\29\\-54.96373\\-131.9624\\29\\-53.05163\\-133.2553\\29\\-51.82058\\-135.2084\\29\\-52.9021\\-137.1615\\29\\-52.37871\\-139.1146\\29\\-51.05748\\-142.4381\\29\\-49.10435\\-142.6453\\29\\-48.95574\\-141.0678\\29\\-48.96891\\-139.1146\\29\\-48.88055\\-137.1615\\29\\-48.45504\\-135.2084\\29\\-48.72733\\-133.2553\\29\\-50.24725\\-131.3021\\29\\-50.93541\\-129.349\\29\\-49.88247\\-127.3959\\29\\-47.94403\\-123.4896\\29\\-44.11972\\-119.5834\\29\\-44.05878\\-117.6303\\29\\-43.43331\\-115.6771\\29\\-43.24498\\-115.4574\\29\\-41.29185\\-115.0545\\29\\-40.71562\\-115.6771\\29\\-39.33873\\-116.597\\29\\-37.82037\\-115.6771\\29\\-36.54935\\-113.724\\29\\-35.43248\\-112.7897\\29\\-34.43588\\-113.724\\29\\-33.79102\\-115.6771\\29\\-33.47935\\-115.9701\\29\\-31.52623\\-116.6288\\29\\-29.5731\\-116.6292\\29\\-27.61998\\-117.1996\\29\\-25.66685\\-118.7\\29\\-23.71373\\-118.7148\\29\\-21.76867\\-117.6303\\29\\-20.76968\\-115.6771\\29\\-19.80748\\-114.7243\\29\\-18.12979\\-115.6771\\29\\-17.85435\\-116.5252\\29\\-15.90123\\-117.4094\\29\\-14.7464\\-115.6771\\29\\-13.9481\\-114.9834\\29\\-13.30743\\-115.6771\\29\\-13.9481\\-116.3219\\29\\-15.90123\\-117.7862\\29\\-17.85435\\-117.9508\\29\\-19.80748\\-116.874\\29\\-21.74534\\-117.6303\\29\\-21.18009\\-119.5834\\29\\-21.52188\\-121.5365\\29\\-21.7606\\-121.812\\29\\-23.71373\\-122.6767\\29\\-25.66685\\-123.8427\\29\\-26.79122\\-125.4428\\29\\-27.61998\\-127.29\\29\\-28.86146\\-129.349\\29\\-28.86336\\-131.3021\\29\\-28.30045\\-133.2553\\29\\-28.3326\\-135.2084\\29\\-29.5731\\-136.4422\\29\\-31.31062\\-137.1615\\29\\-33.47935\\-138.3733\\29\\-36.12791\\-141.0678\\29\\-37.3856\\-142.6744\\29\\-39.33873\\-144.285\\29\\-41.29185\\-144.681\\29\\-43.24498\\-145.8589\\29\\-45.1981\\-146.5501\\29\\-47.15123\\-147.6268\\29\\-49.10435\\-148.4155\\29\\-51.05748\\-150.0086\\29\\-53.0106\\-151.0809\\29\\-54.96373\\-151.0572\\29\\-56.91685\\-151.3666\\29\\-58.86998\\-150.6551\\29\\-60.8231\\-150.9842\\29\\-62.77623\\-151.7664\\29\\-63.82753\\-152.7865\\29\\-64.72935\\-154.2006\\29\\-65.2212\\-154.7396\\29\\-66.68247\\-155.858\\29\\-67.51255\\-156.6928\\29\\-69.13657\\-158.6459\\29\\-70.58091\\-160.599\\29\\-74.5892\\-164.5053\\29\\-76.4481\\-166.6093\\29\\-77.40119\\-168.4115\\29\\-77.63255\\-170.3646\\29\\-79.10458\\-172.3178\\29\\-80.35435\\-174.3123\\29\\-81.39873\\-176.224\\29\\-81.44199\\-178.1771\\29\\-82.50278\\-180.1303\\29\\-84.2606\\-184.0259\\29\\-85.31568\\-185.9896\\29\\-85.42952\\-189.8959\\29\\-86.44482\\-191.849\\29\\-87.35055\\-193.8021\\29\\-87.40237\\-197.7084\\29\\-89.19895\\-201.6146\\29\\-88.64307\\-203.5678\\29\\-88.871\\-205.5209\\29\\-90.11997\\-206.635\\29\\-92.0731\\-208.2202\\29\\-94.02622\\-210.2203\\29\\-95.97935\\-210.6406\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "442" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-39.45628\\-103.9584\\29\\-40.4115\\-102.0053\\29\\-40.31529\\-98.09901\\29\\-39.33873\\-97.2343\\29\\-37.3856\\-97.23911\\29\\-35.90212\\-98.09901\\29\\-36.27451\\-100.0521\\29\\-38.02684\\-102.0053\\29\\-39.20509\\-103.9584\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "443" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.182476\\-156.313\\29\\-6.135601\\-154.5255\\29\\-8.088726\\-154.2232\\29\\-10.04185\\-153.3779\\29\\-10.3725\\-152.7865\\29\\-10.04185\\-152.4866\\29\\-8.088726\\-152.0203\\29\\-6.135601\\-151.0921\\29\\-5.900923\\-150.8334\\29\\-4.838685\\-146.9271\\29\\-4.101708\\-144.974\\29\\-4.370813\\-143.0209\\29\\-5.340724\\-141.0678\\29\\-5.923899\\-139.1146\\29\\-7.236725\\-137.1615\\29\\-9.161344\\-135.2084\\29\\-10.53013\\-133.2553\\29\\-10.51269\\-131.3021\\29\\-10.60394\\-129.349\\29\\-11.99498\\-128.0695\\29\\-13.9481\\-127.6998\\29\\-14.58558\\-127.3959\\29\\-14.84412\\-125.4428\\29\\-13.9481\\-124.9374\\29\\-11.99498\\-124.9374\\29\\-10.04185\\-124.533\\29\\-8.088726\\-123.9849\\29\\-6.135601\\-124.7029\\29\\-4.182476\\-126.6696\\29\\-2.229351\\-124.573\\29\\-0.276226\\-124.1054\\29\\1.676899\\-124.1094\\29\\3.630024\\-124.5545\\29\\4.560328\\-125.4428\\29\\4.814246\\-127.3959\\29\\4.620276\\-129.349\\29\\4.800951\\-131.3021\\29\\6.311696\\-135.2084\\29\\6.528639\\-137.1615\\29\\5.635733\\-139.1146\\29\\5.488408\\-141.0678\\29\\6.338421\\-143.0209\\29\\7.536274\\-144.7703\\29\\9.337312\\-146.9271\\29\\7.777244\\-148.8803\\29\\5.583149\\-150.1804\\29\\3.630024\\-151.0153\\29\\2.653461\\-152.7865\\29\\1.676899\\-153.7178\\29\\-0.276226\\-154.3353\\29\\-0.7425126\\-154.7396\\29\\-2.229351\\-155.6129\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "130" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "444" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-219.6274\\29\\3.630024\\-218.9811\\29\\1.676899\\-218.8998\\29\\-0.276226\\-218.0652\\29\\-4.182476\\-214.2235\\29\\-6.135601\\-212.7086\\29\\-8.088726\\-212.4648\\29\\-10.04185\\-212.4409\\29\\-11.99498\\-211.9092\\29\\-13.9481\\-210.7105\\29\\-15.90123\\-210.0208\\29\\-17.85435\\-208.741\\29\\-21.7606\\-208.5649\\29\\-23.82562\\-207.474\\29\\-25.66685\\-206.6283\\29\\-29.5731\\-206.58\\29\\-33.47935\\-204.6079\\29\\-41.29185\\-204.5708\\29\\-43.24498\\-203.8085\\29\\-45.1981\\-202.6226\\29\\-47.15123\\-202.2933\\29\\-49.10435\\-200.9793\\29\\-51.05748\\-200.6337\\29\\-53.0106\\-199.7733\\29\\-54.24656\\-197.7084\\29\\-54.84166\\-195.7553\\29\\-54.91154\\-193.8021\\29\\-56.13018\\-191.849\\29\\-56.91685\\-191.3372\\29\\-58.86998\\-192.4763\\29\\-59.42393\\-191.849\\29\\-59.33194\\-189.8959\\29\\-58.45145\\-187.9428\\29\\-57.89802\\-185.9896\\29\\-56.91685\\-184.729\\29\\-54.40321\\-182.0834\\29\\-52.13946\\-180.1303\\29\\-50.54921\\-178.1771\\29\\-49.67448\\-176.224\\29\\-49.10435\\-175.5877\\29\\-47.15123\\-174.5857\\29\\-45.1981\\-173.2773\\29\\-43.24498\\-170.9235\\29\\-41.29185\\-168.8493\\29\\-39.33873\\-166.8964\\29\\-37.3856\\-165.6782\\29\\-35.43248\\-166.7607\\29\\-31.71646\\-168.4115\\29\\-29.5731\\-169.5582\\29\\-25.66685\\-169.6902\\29\\-15.90123\\-169.6832\\29\\-13.9481\\-170.6878\\29\\-11.99498\\-171.5922\\29\\-10.72161\\-172.3178\\29\\-10.04185\\-172.9909\\29\\-9.340596\\-174.2709\\29\\-8.554068\\-176.224\\29\\-7.40461\\-178.1771\\29\\-5.630934\\-180.1303\\29\\-4.182476\\-181.1435\\29\\-2.229351\\-182.245\\29\\1.676899\\-183.9699\\29\\3.630024\\-185.0433\\29\\5.583149\\-186.9851\\29\\7.536274\\-187.6837\\29\\9.489399\\-188.9344\\29\\11.44252\\-189.6484\\29\\13.39565\\-190.6047\\29\\15.34877\\-191.3189\\29\\17.3019\\-191.6874\\29\\19.25502\\-192.5546\\29\\21.20815\\-194.205\\29\\25.7624\\-197.7084\\29\\27.06752\\-198.4473\\29\\28.56912\\-197.7084\\29\\30.97377\\-195.5671\\29\\31.92147\\-193.8021\\29\\32.11147\\-191.849\\29\\33.31359\\-189.8959\\29\\34.39756\\-187.9428\\29\\35.82171\\-185.9896\\29\\36.83315\\-185.0319\\29\\38.78627\\-183.3976\\29\\40.7394\\-182.9339\\29\\42.69252\\-182.3072\\29\\46.59877\\-182.1781\\29\\48.5519\\-182.2461\\29\\52.45815\\-183.8749\\29\\54.41127\\-184.1595\\29\\56.3644\\-185.1598\\29\\61.1302\\-189.8959\\29\\61.80783\\-191.849\\29\\61.81738\\-193.8021\\29\\62.99829\\-195.7553\\29\\63.38744\\-197.7084\\29\\64.1769\\-198.5883\\29\\68.08315\\-200.9576\\29\\68.69141\\-201.6146\\29\\68.08315\\-202.3538\\29\\65.77386\\-203.5678\\29\\64.1769\\-204.2639\\29\\62.22377\\-206.2518\\29\\61.3325\\-207.474\\29\\60.44629\\-209.4271\\29\\58.31752\\-211.5611\\29\\54.41127\\-213.8791\\29\\52.45815\\-214.6132\\29\\50.50502\\-214.3202\\29\\48.5519\\-213.2386\\29\\46.59877\\-213.0404\\29\\42.69252\\-212.1303\\29\\40.89613\\-211.3803\\29\\38.3362\\-209.4271\\29\\36.83315\\-208.5497\\29\\34.88002\\-207.9587\\29\\34.35236\\-207.474\\29\\32.9269\\-206.5676\\29\\30.97377\\-206.1203\\29\\30.35736\\-205.5209\\29\\29.02065\\-204.6191\\29\\27.06752\\-204.6097\\29\\25.1144\\-204.7079\\29\\24.27508\\-205.5209\\29\\23.32995\\-207.474\\29\\22.21889\\-209.4271\\29\\21.20815\\-210.793\\29\\15.34877\\-216.6865\\29\\13.39565\\-218.6068\\29\\11.44252\\-219.7998\\29\\7.536274\\-219.8489\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "154" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "445" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "89.56753\\-212.1009\\29\\88.98701\\-211.3803\\29\\88.78332\\-209.4271\\29\\88.73399\\-207.474\\29\\88.69149\\-199.6615\\29\\87.6144\\-197.6298\\29\\86.80704\\-195.7553\\29\\86.77525\\-193.8021\\29\\86.2079\\-191.849\\29\\84.90384\\-189.8959\\29\\84.79904\\-187.9428\\29\\83.99026\\-185.9896\\29\\82.81335\\-184.0365\\29\\82.43365\\-182.0834\\29\\80.89941\\-180.1303\\29\\80.79202\\-178.1771\\29\\79.97738\\-176.224\\29\\78.8299\\-174.2709\\29\\77.84878\\-172.1734\\29\\75.89565\\-168.4384\\29\\71.9894\\-164.4942\\29\\71.10391\\-162.5521\\29\\69.55477\\-160.599\\29\\68.08315\\-158.5843\\29\\66.13003\\-158.8075\\29\\63.96235\\-156.6928\\29\\62.22377\\-155.5337\\29\\60.35203\\-154.7396\\29\\58.31752\\-153.403\\29\\56.3644\\-152.3012\\29\\54.41127\\-151.6751\\29\\52.45815\\-151.4281\\29\\50.50502\\-150.3263\\29\\49.1295\\-148.8803\\29\\48.5519\\-148.1163\\29\\46.59877\\-147.8021\\29\\44.64565\\-149.8187\\29\\42.69252\\-149.9564\\29\\40.7394\\-148.1018\\29\\38.23018\\-146.9271\\29\\36.83315\\-146.3652\\29\\32.9269\\-145.1978\\29\\30.97377\\-144.521\\29\\27.06752\\-143.9601\\29\\25.1144\\-142.6539\\29\\23.16127\\-142.081\\29\\20.09842\\-139.1146\\29\\19.41897\\-137.1615\\29\\20.07665\\-135.2084\\29\\20.40814\\-133.2553\\29\\21.94677\\-129.349\\29\\23.16127\\-127.4195\\29\\25.1144\\-126.5174\\29\\27.06752\\-127.0015\\29\\29.02065\\-126.8099\\29\\30.97377\\-125.2265\\29\\32.9269\\-124.2891\\29\\33.87507\\-123.4896\\29\\35.47274\\-121.5365\\29\\36.83315\\-120.5599\\29\\38.78627\\-120.8475\\29\\40.7394\\-122.7513\\29\\42.69252\\-124.0279\\29\\44.08372\\-125.4428\\29\\44.29913\\-129.349\\29\\44.03136\\-131.3021\\29\\43.03304\\-135.2084\\29\\43.85077\\-137.1615\\29\\44.34169\\-139.1146\\29\\45.27044\\-141.0678\\29\\45.87486\\-143.0209\\29\\46.59877\\-144.2136\\29\\48.28556\\-144.974\\29\\48.66816\\-144.974\\29\\49.11399\\-143.0209\\29\\48.21361\\-141.0678\\29\\47.46101\\-139.1146\\29\\47.39071\\-137.1615\\29\\47.97905\\-135.2084\\29\\48.27007\\-133.2553\\29\\48.29281\\-127.3959\\29\\48.17487\\-125.4428\\29\\47.34556\\-123.4896\\29\\46.59877\\-122.7623\\29\\44.64565\\-122.057\\29\\44.06622\\-121.5365\\29\\42.54391\\-119.5834\\29\\42.38856\\-117.6303\\29\\40.70184\\-113.724\\29\\40.73177\\-111.7709\\29\\42.69252\\-110.4241\\29\\44.64565\\-108.8203\\29\\46.59877\\-107.3913\\29\\48.5519\\-106.2735\\29\\48.90399\\-105.9115\\29\\49.64814\\-103.9584\\29\\51.12592\\-102.0053\\29\\52.45815\\-100.8063\\29\\54.41127\\-100.416\\29\\56.40196\\-102.0053\\29\\57.27121\\-103.9584\\29\\58.47911\\-105.9115\\29\\59.24526\\-107.8646\\29\\60.89162\\-109.8178\\29\\61.70408\\-111.7709\\29\\61.74131\\-113.724\\29\\63.00407\\-115.6771\\29\\63.69728\\-117.6303\\29\\64.25767\\-119.5834\\29\\65.21014\\-121.5365\\29\\65.59989\\-123.4896\\29\\66.85982\\-125.4428\\29\\67.54493\\-127.3959\\29\\68.75489\\-129.349\\29\\70.03628\\-132.0457\\29\\71.9894\\-132.3982\\29\\73.46768\\-133.2553\\29\\72.98076\\-135.2084\\29\\72.64224\\-137.1615\\29\\74.29935\\-139.1146\\29\\75.19232\\-141.0678\\29\\76.38393\\-143.0209\\29\\77.02715\\-144.974\\29\\78.30176\\-146.9271\\29\\79.00636\\-148.8803\\29\\80.37156\\-150.8334\\29\\80.34012\\-152.7865\\29\\78.69684\\-154.7396\\29\\79.8019\\-156.3929\\29\\81.75503\\-157.4601\\29\\83.70815\\-158.047\\29\\85.66128\\-159.7492\\29\\90.3435\\-164.5053\\29\\91.96901\\-166.4584\\29\\92.83525\\-168.4115\\29\\94.28482\\-170.3646\\29\\95.90923\\-172.3178\\29\\96.66123\\-174.2709\\29\\97.16832\\-176.224\\29\\98.00439\\-178.1771\\29\\98.49036\\-180.1303\\29\\98.8363\\-182.0834\\29\\98.90778\\-184.0365\\29\\98.8998\\-187.9428\\29\\99.9402\\-189.8959\\29\\100.2721\\-191.849\\29\\100.2545\\-199.6615\\29\\99.80966\\-201.6146\\29\\98.54147\\-203.5678\\29\\97.9372\\-205.5209\\29\\96.17458\\-207.474\\29\\94.17053\\-209.4271\\29\\92.4761\\-211.3803\\29\\91.52065\\-212.3515\\29" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "182" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "446" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-99.939\\-209.4271\\31\\-100.9209\\-207.474\\31\\-101.031\\-205.5209\\31\\-101.3168\\-203.5678\\31\\-102.4631\\-201.6146\\31\\-102.8894\\-199.6615\\31\\-102.8974\\-195.7553\\31\\-102.9706\\-193.8021\\31\\-103.1425\\-191.849\\31\\-103.1425\\-189.8959\\31\\-102.8974\\-184.0365\\31\\-102.8934\\-182.0834\\31\\-102.5055\\-180.1303\\31\\-101.0257\\-178.1771\\31\\-100.5349\\-176.224\\31\\-99.05963\\-174.2709\\31\\-98.54954\\-172.3178\\31\\-96.79925\\-170.3646\\31\\-95.26492\\-168.4115\\31\\-94.18781\\-166.4584\\31\\-90.96201\\-162.5521\\31\\-89.86089\\-160.599\\31\\-88.9798\\-158.6459\\31\\-87.57451\\-156.6928\\31\\-86.67789\\-154.7396\\31\\-85.50843\\-152.7865\\31\\-84.82445\\-150.8334\\31\\-83.75529\\-148.8803\\31\\-83.14101\\-146.9271\\31\\-81.93045\\-144.974\\31\\-81.72261\\-143.0209\\31\\-81.24808\\-141.0678\\31\\-80.06138\\-139.1146\\31\\-79.45917\\-137.1615\\31\\-79.00828\\-135.2084\\31\\-77.57668\\-133.2553\\31\\-77.00222\\-131.3021\\31\\-75.68746\\-129.349\\31\\-74.29554\\-125.4428\\31\\-73.24798\\-123.4896\\31\\-72.43334\\-121.5365\\31\\-72.38026\\-119.5834\\31\\-71.2346\\-117.6303\\31\\-70.40173\\-115.6771\\31\\-70.40173\\-113.724\\31\\-69.23433\\-111.7709\\31\\-68.6356\\-110.4813\\31\\-66.28574\\-105.9115\\31\\-66.16052\\-103.9584\\31\\-65.31298\\-102.0053\\31\\-62.77623\\-99.80465\\31\\-60.8231\\-99.16049\\31\\-59.63232\\-100.0521\\31\\-58.09483\\-102.0053\\31\\-56.91685\\-103.0524\\31\\-54.96373\\-102.6813\\31\\-53.0106\\-101.3217\\31\\-52.20321\\-102.0053\\31\\-51.91545\\-103.9584\\31\\-51.05748\\-105.4789\\31\\-49.10435\\-105.6185\\31\\-47.9461\\-103.9584\\31\\-47.15123\\-103.2748\\31\\-46.424\\-103.9584\\31\\-45.7574\\-105.9115\\31\\-45.1981\\-106.9723\\31\\-44.508\\-107.8646\\31\\-45.1981\\-108.2628\\31\\-47.15123\\-110.3578\\31\\-48.33175\\-111.7709\\31\\-51.05748\\-114.4731\\31\\-52.13318\\-115.6771\\31\\-53.47257\\-117.6303\\31\\-54.03345\\-119.5834\\31\\-55.61306\\-121.5365\\31\\-56.18196\\-123.4896\\31\\-56.89414\\-125.4428\\31\\-56.98344\\-127.3959\\31\\-56.75526\\-129.349\\31\\-56.32219\\-131.3021\\31\\-54.96373\\-133.3186\\31\\-53.0106\\-134.5743\\31\\-52.50488\\-135.2084\\31\\-53.25687\\-137.1615\\31\\-55.24585\\-139.1146\\31\\-55.80614\\-141.0678\\31\\-56.56081\\-143.0209\\31\\-54.96373\\-144.2377\\31\\-53.0106\\-141.9746\\31\\-51.05748\\-142.2129\\31\\-49.11626\\-141.0678\\31\\-48.90491\\-137.1615\\31\\-48.96891\\-135.2084\\31\\-49.89291\\-133.2553\\31\\-50.64854\\-131.3021\\31\\-50.93541\\-129.349\\31\\-49.88668\\-127.3959\\31\\-48.96891\\-125.4428\\31\\-48.4551\\-123.4896\\31\\-46.90174\\-121.5365\\31\\-45.1981\\-120.5433\\31\\-44.08684\\-119.5834\\31\\-43.63192\\-117.6303\\31\\-43.24498\\-117.1341\\31\\-41.29185\\-116.2842\\31\\-39.33873\\-116.5615\\31\\-38.14766\\-115.6771\\31\\-37.3856\\-114.2123\\31\\-36.99323\\-113.724\\31\\-35.43248\\-112.8412\\31\\-34.50758\\-113.724\\31\\-32.77905\\-115.6771\\31\\-31.52623\\-116.5547\\31\\-29.5731\\-116.7404\\31\\-28.52678\\-117.6303\\31\\-27.39698\\-119.5834\\31\\-28.5902\\-121.5365\\31\\-28.74331\\-123.4896\\31\\-28.76365\\-125.4428\\31\\-28.60562\\-127.3959\\31\\-28.27627\\-129.349\\31\\-27.61998\\-130.9986\\31\\-26.38556\\-133.2553\\31\\-26.40602\\-135.2084\\31\\-27.61998\\-137.119\\31\\-29.5731\\-137.7663\\31\\-31.52623\\-138.1381\\31\\-32.6352\\-139.1146\\31\\-34.13222\\-141.0678\\31\\-33.47935\\-143.0621\\31\\-35.43248\\-144.2152\\31\\-37.3856\\-144.5486\\31\\-39.33873\\-145.0825\\31\\-41.29185\\-145.1857\\31\\-43.24498\\-145.6666\\31\\-45.1981\\-146.2673\\31\\-46.74329\\-146.9271\\31\\-49.10435\\-148.0665\\31\\-51.05748\\-149.9281\\31\\-52.86796\\-150.8334\\31\\-53.20295\\-150.8334\\31\\-54.96373\\-150.1375\\31\\-56.78947\\-148.8803\\31\\-56.50822\\-146.9271\\31\\-55.74334\\-144.974\\31\\-56.91685\\-143.4049\\31\\-57.65966\\-144.974\\31\\-57.397\\-146.9271\\31\\-58.86998\\-148.4001\\31\\-59.54782\\-148.8803\\31\\-62.77623\\-150.3852\\31\\-64.72935\\-152.2416\\31\\-66.68247\\-154.5395\\31\\-70.76534\\-158.6459\\31\\-72.54185\\-159.584\\31\\-73.55115\\-160.599\\31\\-74.71296\\-162.5521\\31\\-76.4481\\-163.6026\\31\\-77.31335\\-164.5053\\31\\-78.56661\\-166.4584\\31\\-80.28403\\-170.3646\\31\\-81.37269\\-172.3178\\31\\-81.59328\\-174.2709\\31\\-82.92838\\-176.224\\31\\-83.44337\\-178.1771\\31\\-83.61127\\-180.1303\\31\\-84.90184\\-182.0834\\31\\-85.61813\\-184.0365\\31\\-86.81422\\-185.9896\\31\\-87.36294\\-187.9428\\31\\-87.38452\\-189.8959\\31\\-88.4389\\-191.849\\31\\-89.26875\\-193.8021\\31\\-89.33121\\-197.7084\\31\\-89.89618\\-201.6146\\31\\-89.57066\\-203.5678\\31\\-89.64913\\-205.5209\\31\\-90.11997\\-206.0664\\31\\-92.0731\\-207.793\\31\\-94.02622\\-209.9918\\31\\-95.97935\\-210.8183\\31\\-97.93247\\-210.6491\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "447" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-51.05748\\-95.15248\\31\\-52.19348\\-94.19276\\31\\-51.05748\\-92.18219\\31\\-49.10435\\-91.85308\\31\\-48.91307\\-92.23963\\31\\-47.15123\\-93.26298\\31\\-45.1981\\-94.2411\\31\\-49.10435\\-96.06137\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "448" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-106.4028\\31\\-42.39048\\-105.9115\\31\\-42.46476\\-102.0053\\31\\-42.43983\\-100.0521\\31\\-41.80928\\-98.09901\\31\\-41.29185\\-97.63367\\31\\-39.33873\\-97.17535\\31\\-37.3856\\-97.73202\\31\\-36.95881\\-98.09901\\31\\-36.25017\\-100.0521\\31\\-37.3856\\-102.0876\\31\\-38.21152\\-103.9584\\31\\-39.33873\\-104.9486\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "449" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-19.80748\\-123.9812\\31\\-20.26812\\-123.4896\\31\\-19.80748\\-122.9665\\31\\-18.03584\\-121.5365\\31\\-18.54401\\-119.5834\\31\\-20.9363\\-117.6303\\31\\-20.81845\\-115.6771\\31\\-19.80748\\-114.6617\\31\\-17.85435\\-114.5554\\31\\-15.90123\\-114.5718\\31\\-13.9481\\-113.0318\\31\\-11.99498\\-111.0812\\31\\-10.4691\\-111.7709\\31\\-10.47921\\-113.724\\31\\-10.81365\\-115.6771\\31\\-11.34936\\-117.6303\\31\\-11.99498\\-118.2831\\31\\-13.9481\\-119.0183\\31\\-17.68056\\-121.5365\\31\\-17.64913\\-123.4896\\31\\-17.85435\\-124.0045\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "450" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.04185\\-159.0163\\31\\-10.46147\\-158.6459\\31\\-11.25394\\-156.6928\\31\\-11.99498\\-155.5779\\31\\-13.9481\\-153.9393\\31\\-15.90123\\-153.7277\\31\\-16.68365\\-152.7865\\31\\-15.90123\\-152.0357\\31\\-13.9481\\-151.9054\\31\\-10.04185\\-151.1482\\31\\-8.088726\\-151.0572\\31\\-6.135601\\-149.2611\\31\\-5.876513\\-148.8803\\31\\-5.048862\\-146.9271\\31\\-4.182476\\-145.1854\\31\\-4.182476\\-144.7749\\31\\-5.046897\\-143.0209\\31\\-5.565939\\-141.0678\\31\\-5.781145\\-139.1146\\31\\-6.486653\\-137.1615\\31\\-7.760537\\-135.2084\\31\\-9.517401\\-133.2553\\31\\-10.13659\\-131.3021\\31\\-8.87474\\-129.349\\31\\-8.088726\\-128.6166\\31\\-6.135601\\-128.7671\\31\\-4.182476\\-128.345\\31\\-2.229351\\-127.3133\\31\\-0.276226\\-126.8128\\31\\1.676899\\-127.9062\\31\\2.795063\\-129.349\\31\\6.083196\\-133.2553\\31\\6.818501\\-135.2084\\31\\6.921985\\-137.1615\\31\\6.449677\\-139.1146\\31\\5.583149\\-140.8893\\31\\5.583149\\-141.2428\\31\\6.666348\\-143.0209\\31\\7.536274\\-143.7777\\31\\9.489399\\-144.8376\\31\\11.73026\\-146.9271\\31\\12.18062\\-148.8803\\31\\11.44252\\-149.3504\\31\\8.416386\\-150.8334\\31\\7.536274\\-151.3818\\31\\5.948298\\-152.7865\\31\\4.74527\\-154.7396\\31\\4.606586\\-156.6928\\31\\3.630024\\-158.6924\\31\\1.676899\\-159.4934\\31\\-2.229351\\-159.5485\\31\\-4.182476\\-159.7421\\31\\-6.135601\\-159.6964\\31\\-8.088726\\-159.4553\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "141" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "451" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.276226\\-217.4987\\31\\-2.229351\\-216.107\\31\\-4.182476\\-214.2235\\31\\-6.135601\\-212.9174\\31\\-10.04185\\-213.0294\\31\\-11.99498\\-212.7312\\31\\-13.9481\\-212.0037\\31\\-15.90123\\-210.7997\\31\\-17.85435\\-210.584\\31\\-19.80748\\-210.4867\\31\\-21.7606\\-210.0188\\31\\-23.71373\\-208.7445\\31\\-25.66685\\-208.5304\\31\\-27.61998\\-208.5077\\31\\-29.5731\\-208.0329\\31\\-31.52623\\-206.7814\\31\\-33.47935\\-206.6391\\31\\-39.33873\\-206.5334\\31\\-41.29185\\-206.1877\\31\\-43.24498\\-204.7752\\31\\-45.1981\\-204.5854\\31\\-47.15123\\-203.8102\\31\\-49.10435\\-202.6308\\31\\-51.05748\\-202.2568\\31\\-53.0106\\-200.9508\\31\\-54.30717\\-199.6615\\31\\-55.7333\\-195.7553\\31\\-56.91685\\-194.0801\\31\\-58.86998\\-194.9754\\31\\-60.05176\\-193.8021\\31\\-59.75159\\-191.849\\31\\-58.63262\\-189.8959\\31\\-57.89341\\-187.9428\\31\\-56.91685\\-186.5951\\31\\-54.43475\\-184.0365\\31\\-53.55992\\-182.0834\\31\\-51.94744\\-180.1303\\31\\-50.82012\\-178.1771\\31\\-49.85342\\-176.224\\31\\-49.10435\\-175.453\\31\\-47.15123\\-174.6092\\31\\-45.1981\\-173.4256\\31\\-43.24498\\-171.9879\\31\\-41.29185\\-170.9517\\31\\-39.33873\\-169.6918\\31\\-37.3856\\-169.5508\\31\\-35.43248\\-169.6383\\31\\-31.52623\\-171.5914\\31\\-27.61998\\-173.3371\\31\\-23.71373\\-173.3964\\31\\-21.7606\\-172.713\\31\\-19.80748\\-171.6921\\31\\-15.90123\\-171.7038\\31\\-13.9481\\-172.8828\\31\\-11.99498\\-174.6282\\31\\-10.58282\\-176.224\\31\\-9.350833\\-178.1771\\31\\-8.088726\\-179.6553\\31\\-6.135601\\-180.9297\\31\\-4.182476\\-181.4845\\31\\-2.564589\\-182.0834\\31\\-0.276226\\-183.0764\\31\\1.676899\\-184.132\\31\\3.630024\\-185.0703\\31\\5.583149\\-186.9851\\31\\7.536274\\-187.8073\\31\\9.489399\\-188.9753\\31\\11.44252\\-189.7605\\31\\13.39565\\-190.9028\\31\\15.34877\\-192.5242\\31\\17.3019\\-193.1383\\31\\19.25502\\-194.2227\\31\\21.20815\\-196.2359\\31\\22.18471\\-197.7084\\31\\23.16127\\-198.6651\\31\\27.06752\\-199.4745\\31\\29.02065\\-199.0337\\31\\30.97377\\-197.9474\\31\\31.22326\\-197.7084\\31\\32.46273\\-195.7553\\31\\32.88934\\-193.8021\\31\\33.51858\\-191.849\\31\\34.3343\\-189.8959\\31\\35.58338\\-187.9428\\31\\37.38654\\-185.9896\\31\\40.7394\\-183.3702\\31\\42.69252\\-182.9379\\31\\44.64565\\-182.3803\\31\\46.59877\\-182.9797\\31\\48.5519\\-183.127\\31\\50.50502\\-183.4368\\31\\52.20274\\-184.0365\\31\\54.41127\\-184.9495\\31\\56.3644\\-185.3754\\31\\58.31752\\-187.0934\\31\\61.1302\\-189.8959\\31\\61.80783\\-191.849\\31\\61.94195\\-193.8021\\31\\63.17334\\-195.7553\\31\\63.7705\\-197.7084\\31\\64.1769\\-198.1628\\31\\66.13003\\-199.5385\\31\\68.08315\\-200.2758\\31\\69.42922\\-201.6146\\31\\68.08315\\-203.2422\\31\\66.13003\\-203.5012\\31\\64.1769\\-204.6756\\31\\63.421\\-205.5209\\31\\62.94248\\-207.474\\31\\61.38222\\-209.4271\\31\\60.35203\\-211.3803\\31\\56.3644\\-213.7891\\31\\54.41127\\-214.6164\\31\\52.45815\\-214.94\\31\\50.50502\\-214.7028\\31\\48.5519\\-213.9898\\31\\46.59877\\-212.9367\\31\\44.64565\\-212.4409\\31\\42.69252\\-211.1933\\31\\40.7394\\-210.4785\\31\\37.60565\\-207.474\\31\\35.85659\\-205.5209\\31\\34.88002\\-203.4963\\31\\32.9269\\-202.6693\\31\\30.97377\\-202.8037\\31\\29.02065\\-203.7294\\31\\27.06752\\-203.817\\31\\25.1144\\-203.7548\\31\\23.16127\\-204.2056\\31\\22.09302\\-205.5209\\31\\21.20815\\-206.7944\\31\\20.56337\\-207.474\\31\\20.05271\\-209.4271\\31\\19.25502\\-210.6572\\31\\18.61928\\-211.3803\\31\\12.78442\\-217.2396\\31\\11.44252\\-218.2759\\31\\9.489399\\-218.9702\\31\\7.536274\\-218.9575\\31\\3.630024\\-218.8086\\31\\1.676899\\-218.291\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "11" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "452" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-118.5064\\31\\4.788743\\-117.6303\\31\\4.485206\\-115.6771\\31\\5.583149\\-114.6805\\31\\7.536274\\-114.6805\\31\\9.489399\\-115.6533\\31\\11.44252\\-116.8203\\31\\12.20327\\-117.6303\\31\\11.44252\\-118.4216\\31\\9.489399\\-119.1025\\31\\7.536274\\-119.1367\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "453" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "42.69252\\-149.4576\\31\\40.7394\\-148.0412\\31\\36.83315\\-146.1334\\31\\34.88002\\-145.3707\\31\\29.02065\\-145.0825\\31\\27.06752\\-144.5676\\31\\25.1144\\-144.2526\\31\\23.16127\\-143.7818\\31\\21.20815\\-142.33\\31\\19.25502\\-141.6602\\31\\18.66258\\-141.0678\\31\\17.77556\\-139.1146\\31\\18.03689\\-135.2084\\31\\18.22933\\-131.3021\\31\\19.36434\\-129.349\\31\\20.23159\\-127.3959\\31\\21.20815\\-126.5029\\31\\25.1144\\-125.8867\\31\\27.06752\\-126.1336\\31\\29.02065\\-125.1172\\31\\30.97377\\-124.2358\\31\\32.9269\\-122.8845\\31\\34.88002\\-120.9495\\31\\36.83315\\-120.6826\\31\\38.78627\\-121.6173\\31\\42.02781\\-123.4896\\31\\42.69252\\-123.9605\\31\\44.15737\\-125.4428\\31\\44.32013\\-127.3959\\31\\45.22245\\-129.349\\31\\45.44958\\-131.3021\\31\\43.72359\\-133.2553\\31\\43.5425\\-135.2084\\31\\45.71244\\-137.1615\\31\\45.49262\\-139.1146\\31\\45.50918\\-141.0678\\31\\47.09301\\-143.0209\\31\\48.10911\\-144.974\\31\\47.8599\\-146.9271\\31\\44.64565\\-149.3885\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "121" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "454" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "91.52065\\-209.0057\\31\\90.71227\\-207.474\\31\\90.69516\\-205.5209\\31\\90.1547\\-203.5678\\31\\90.05581\\-201.6146\\31\\90.10654\\-199.6615\\31\\88.97285\\-197.7084\\31\\88.75549\\-195.7553\\31\\88.6943\\-193.8021\\31\\87.82418\\-191.849\\31\\86.81999\\-189.8959\\31\\86.73447\\-187.9428\\31\\85.92948\\-185.9896\\31\\84.80615\\-184.0365\\31\\83.97311\\-182.0834\\31\\82.83855\\-180.1303\\31\\82.76414\\-178.1771\\31\\81.92018\\-176.224\\31\\80.80677\\-174.2709\\31\\78.84904\\-170.3646\\31\\77.93904\\-168.4115\\31\\75.89565\\-166.2691\\31\\73.94253\\-162.7825\\31\\71.96597\\-160.599\\31\\70.50476\\-158.6459\\31\\69.22352\\-156.6928\\31\\68.08315\\-155.6884\\31\\66.13003\\-155.6071\\31\\64.1769\\-154.8481\\31\\62.22377\\-153.6391\\31\\60.27065\\-152.8096\\31\\58.31752\\-151.6975\\31\\56.3644\\-151.3809\\31\\54.41127\\-150.3793\\31\\52.45815\\-149.7489\\31\\50.71217\\-148.8803\\31\\49.34955\\-146.9271\\31\\49.29449\\-144.974\\31\\49.81781\\-143.0209\\31\\49.1206\\-141.0678\\31\\47.91\\-139.1146\\31\\47.7235\\-137.1615\\31\\48.5519\\-136.2651\\31\\49.28941\\-135.2084\\31\\49.68959\\-133.2553\\31\\49.66866\\-127.3959\\31\\49.03408\\-125.4428\\31\\47.35773\\-123.4896\\31\\46.59877\\-122.7623\\31\\44.64565\\-122.0248\\31\\44.06402\\-121.5365\\31\\42.44504\\-119.5834\\31\\42.49308\\-117.6303\\31\\41.86379\\-115.6771\\31\\41.76148\\-113.724\\31\\41.83085\\-111.7709\\31\\42.69252\\-110.8139\\31\\44.64565\\-109.0115\\31\\46.08844\\-107.8646\\31\\48.5519\\-105.6391\\31\\49.87313\\-103.9584\\31\\52.45815\\-101.2888\\31\\54.41127\\-101.2354\\31\\55.22417\\-102.0053\\31\\56.53878\\-103.9584\\31\\57.31238\\-105.9115\\31\\58.99084\\-107.8646\\31\\60.45765\\-109.8178\\31\\61.0762\\-111.7709\\31\\61.19153\\-113.724\\31\\62.87305\\-115.6771\\31\\63.62278\\-117.6303\\31\\63.75153\\-119.5834\\31\\65.03313\\-121.5365\\31\\65.58381\\-123.4896\\31\\66.85982\\-125.4428\\31\\67.54493\\-127.3959\\31\\68.75489\\-129.349\\31\\70.03628\\-131.8494\\31\\71.9894\\-132.3097\\31\\73.57092\\-133.2553\\31\\72.99541\\-135.2084\\31\\72.76955\\-137.1615\\31\\74.68003\\-139.1146\\31\\75.89565\\-141.4238\\31\\77.55581\\-144.974\\31\\78.61156\\-146.9271\\31\\80.18884\\-148.8803\\31\\80.61793\\-150.8334\\31\\79.8019\\-151.9717\\31\\78.98183\\-152.7865\\31\\77.64053\\-154.7396\\31\\79.0794\\-156.6928\\31\\79.8019\\-157.2774\\31\\81.75503\\-157.2998\\31\\83.70815\\-157.8814\\31\\86.4715\\-160.599\\31\\87.6144\\-161.5576\\31\\89.44338\\-162.5521\\31\\91.54336\\-164.5053\\31\\94.02386\\-168.4115\\31\\95.66042\\-170.3646\\31\\96.69281\\-172.3178\\31\\97.94212\\-174.2709\\31\\98.37426\\-176.224\\31\\98.63633\\-178.1771\\31\\99.07406\\-180.1303\\31\\99.15876\\-182.0834\\31\\99.08566\\-184.0365\\31\\98.285\\-185.9896\\31\\98.2417\\-187.9428\\31\\99.99599\\-189.8959\\31\\100.5129\\-191.849\\31\\100.7726\\-195.7553\\31\\100.8243\\-199.6615\\31\\100.5041\\-201.6146\\31\\100.3097\\-203.5678\\31\\99.38656\\-205.5209\\31\\97.38003\\-206.6376\\31\\95.4269\\-208.2168\\31\\93.47378\\-209.275\\31" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "121" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "455" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-99.8856\\-210.8042\\33\\-101.0872\\-209.4271\\33\\-102.3793\\-207.474\\33\\-102.8693\\-205.5209\\33\\-102.9706\\-201.6146\\33\\-103.2299\\-199.6615\\33\\-103.4453\\-191.849\\33\\-103.4558\\-189.8959\\33\\-104.4071\\-187.9428\\33\\-104.3767\\-185.9896\\33\\-103.321\\-184.0365\\33\\-103.321\\-182.0834\\33\\-103.0654\\-180.1303\\33\\-102.4916\\-178.1771\\33\\-101.0528\\-176.224\\33\\-100.5313\\-174.2709\\33\\-99.09959\\-172.3178\\33\\-98.11948\\-170.3646\\33\\-96.58833\\-168.4115\\33\\-94.86701\\-166.4584\\33\\-93.38418\\-164.5053\\33\\-92.32078\\-162.5521\\33\\-90.74905\\-160.599\\33\\-89.49519\\-158.6459\\33\\-88.4658\\-156.6928\\33\\-86.95289\\-154.7396\\33\\-85.62997\\-152.7865\\33\\-85.43531\\-150.8334\\33\\-84.76935\\-148.8803\\33\\-83.4747\\-146.9271\\33\\-82.96385\\-144.974\\33\\-81.93045\\-143.0209\\33\\-81.02065\\-139.1146\\33\\-79.84067\\-137.1615\\33\\-79.16237\\-135.2084\\33\\-78.01429\\-133.2553\\33\\-77.1478\\-131.3021\\33\\-75.17806\\-127.3959\\33\\-74.49497\\-125.7881\\33\\-73.24798\\-123.4896\\33\\-72.43334\\-121.5365\\33\\-72.38026\\-119.5834\\33\\-71.2346\\-117.6303\\33\\-70.40173\\-115.6771\\33\\-70.26758\\-113.724\\33\\-69.16882\\-111.7709\\33\\-68.29951\\-109.8178\\33\\-66.28574\\-105.9115\\33\\-66.2571\\-103.9584\\33\\-65.92065\\-102.0053\\33\\-62.77623\\-99.31037\\33\\-60.8231\\-97.88731\\33\\-58.86998\\-96.70277\\33\\-58.13755\\-96.14588\\33\\-56.91685\\-95.50779\\33\\-54.96373\\-94.8697\\33\\-54.52891\\-94.19276\\33\\-51.65278\\-92.23963\\33\\-51.05748\\-91.63184\\33\\-49.10435\\-90.96746\\33\\-47.15123\\-91.3523\\33\\-45.1981\\-92.04717\\33\\-43.24498\\-93.20078\\33\\-42.28824\\-94.19276\\33\\-41.15542\\-96.14588\\33\\-39.33873\\-97.26893\\33\\-38.45224\\-98.09901\\33\\-36.84622\\-100.0521\\33\\-38.18845\\-103.9584\\33\\-41.29185\\-107.1605\\33\\-44.42476\\-109.8178\\33\\-47.15123\\-112.5329\\33\\-49.10435\\-114.0321\\33\\-51.05748\\-115.0242\\33\\-51.69579\\-115.6771\\33\\-53.14604\\-117.6303\\33\\-53.87373\\-119.5834\\33\\-55.71226\\-121.5365\\33\\-56.91685\\-123.8778\\33\\-57.57314\\-125.4428\\33\\-57.76382\\-127.3959\\33\\-57.05229\\-129.349\\33\\-56.34534\\-133.2553\\33\\-55.84806\\-135.2084\\33\\-56.07088\\-137.1615\\33\\-56.74247\\-139.1146\\33\\-57.57669\\-141.0678\\33\\-58.52345\\-144.974\\33\\-59.68378\\-146.9271\\33\\-60.8231\\-147.7634\\33\\-62.77623\\-148.7408\\33\\-64.72935\\-150.5335\\33\\-66.68247\\-152.6434\\33\\-68.6356\\-154.5965\\33\\-70.85934\\-156.6928\\33\\-72.54185\\-157.4773\\33\\-74.49497\\-158.5064\\33\\-76.5407\\-160.599\\33\\-78.40122\\-163.5857\\33\\-80.56872\\-166.4584\\33\\-82.30747\\-170.1651\\33\\-83.39085\\-172.3178\\33\\-83.50668\\-174.2709\\33\\-84.2606\\-175.9827\\33\\-85.36665\\-178.1771\\33\\-85.48661\\-180.1303\\33\\-86.55177\\-182.0834\\33\\-87.43163\\-184.0365\\33\\-88.53853\\-185.9896\\33\\-89.33524\\-187.9428\\33\\-89.36043\\-189.8959\\33\\-89.63765\\-191.849\\33\\-90.68567\\-193.8021\\33\\-91.18009\\-195.7553\\33\\-91.18484\\-197.7084\\33\\-91.33659\\-201.6146\\33\\-91.33513\\-205.5209\\33\\-92.952\\-207.474\\33\\-94.68243\\-209.4271\\33\\-95.97935\\-210.6466\\33\\-97.93247\\-211.0654\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "456" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-53.0106\\-149.6708\\33\\-54.50474\\-148.8803\\33\\-54.96373\\-148.1631\\33\\-55.43457\\-146.9271\\33\\-54.8078\\-144.974\\33\\-51.42147\\-143.0209\\33\\-51.05748\\-142.5326\\33\\-50.37109\\-141.0678\\33\\-49.71542\\-139.1146\\33\\-49.15904\\-137.1615\\33\\-49.92753\\-135.2084\\33\\-50.57212\\-133.2553\\33\\-51.08036\\-131.3021\\33\\-51.19804\\-129.349\\33\\-49.52972\\-125.4428\\33\\-48.77883\\-123.4896\\33\\-46.91522\\-121.5365\\33\\-45.1981\\-120.6166\\33\\-44.04087\\-119.5834\\33\\-42.31067\\-117.6303\\33\\-41.29185\\-116.6884\\33\\-39.33873\\-116.5629\\33\\-37.3856\\-116.1204\\33\\-35.43248\\-115.3425\\33\\-33.47935\\-116.5102\\33\\-31.52623\\-117.2359\\33\\-30.90478\\-117.6303\\33\\-29.62193\\-119.5834\\33\\-30.75311\\-121.5365\\33\\-30.3344\\-123.4896\\33\\-29.3324\\-125.4428\\33\\-28.57422\\-127.3959\\33\\-25.46557\\-131.3021\\33\\-24.50026\\-133.2553\\33\\-24.84634\\-135.2084\\33\\-26.47006\\-137.1615\\33\\-27.61998\\-138.1381\\33\\-29.5731\\-138.5973\\33\\-30.37048\\-139.1146\\33\\-31.52623\\-140.2197\\33\\-32.11574\\-141.0678\\33\\-31.125\\-143.0209\\33\\-31.52623\\-144.2532\\33\\-32.28306\\-144.974\\33\\-33.47935\\-145.293\\33\\-35.43248\\-145.0262\\33\\-37.3856\\-144.9359\\33\\-41.29185\\-145.0262\\33\\-43.24498\\-145.1226\\33\\-45.1981\\-145.6513\\33\\-47.15123\\-146.2888\\33\\-49.10435\\-147.5285\\33\\-51.4542\\-148.8803\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "21" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "457" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-125.6545\\33\\-19.80748\\-124.4554\\33\\-20.6815\\-123.4896\\33\\-20.03932\\-121.5365\\33\\-19.11491\\-119.5834\\33\\-20.51361\\-117.6303\\33\\-20.0893\\-115.6771\\33\\-19.80748\\-115.3814\\33\\-17.85435\\-114.5672\\33\\-15.90123\\-114.5117\\33\\-13.9481\\-112.9645\\33\\-11.99498\\-111.0271\\33\\-9.946788\\-111.7709\\33\\-9.959849\\-113.724\\33\\-10.24129\\-115.6771\\33\\-10.8003\\-117.6303\\33\\-11.99498\\-118.9093\\33\\-13.9481\\-120.6355\\33\\-15.94561\\-121.5365\\33\\-16.85226\\-123.4896\\33\\-17.01342\\-125.4428\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "458" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.088726\\-160.9267\\33\\-10.04185\\-160.1875\\33\\-11.99498\\-159.7657\\33\\-13.9481\\-158.9991\\33\\-16.3379\\-156.6928\\33\\-17.85435\\-155.4656\\33\\-19.80748\\-153.2029\\33\\-21.7606\\-151.1422\\33\\-22.23603\\-150.8334\\33\\-21.7606\\-150.4957\\33\\-17.85435\\-151.3311\\33\\-15.90123\\-151.0328\\33\\-13.9481\\-151.1373\\33\\-11.99498\\-151.0691\\33\\-10.04185\\-150.1684\\33\\-8.088726\\-149.6168\\33\\-6.135601\\-148.0719\\33\\-5.191057\\-146.9271\\33\\-4.337838\\-144.974\\33\\-5.293897\\-143.0209\\33\\-5.190372\\-141.0678\\33\\-4.182476\\-139.629\\33\\-3.656048\\-139.1146\\33\\-3.282644\\-137.1615\\33\\-4.239253\\-135.2084\\33\\-6.135601\\-134.1425\\33\\-8.088726\\-133.8456\\33\\-8.880334\\-133.2553\\33\\-9.758922\\-131.3021\\33\\-8.088726\\-129.9685\\33\\-4.182476\\-130.8753\\33\\-2.229351\\-130.7429\\33\\-0.276226\\-129.8246\\33\\1.676899\\-129.2405\\33\\3.630024\\-130.5118\\33\\4.436973\\-131.3021\\33\\5.744739\\-133.2553\\33\\6.665659\\-135.2084\\33\\7.221461\\-137.1615\\33\\6.706425\\-139.1146\\33\\6.295641\\-141.0678\\33\\7.536274\\-142.5415\\33\\9.489399\\-144.2185\\33\\11.44252\\-145.6938\\33\\13.39565\\-145.9553\\33\\15.47747\\-146.9271\\33\\15.86315\\-148.8803\\33\\15.34877\\-149.415\\33\\12.44381\\-150.8334\\33\\11.44252\\-151.4514\\33\\9.860131\\-152.7865\\33\\7.914582\\-154.7396\\33\\6.844542\\-156.6928\\33\\6.152811\\-158.6459\\33\\4.771381\\-160.599\\33\\3.630024\\-161.6079\\33\\1.676899\\-161.7569\\33\\-0.276226\\-161.7569\\33\\-2.229351\\-161.4559\\33\\-6.135601\\-161.4559\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "144" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "459" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "1.676899\\-217.4987\\33\\-0.276226\\-216.3721\\33\\-2.229351\\-215.4229\\33\\-4.182476\\-214.1472\\33\\-6.135601\\-213.0743\\33\\-8.088726\\-213.975\\33\\-10.04185\\-214.4459\\33\\-11.99498\\-213.9366\\33\\-13.9481\\-212.7651\\33\\-15.90123\\-212.4857\\33\\-17.85435\\-211.9719\\33\\-19.80748\\-211.0547\\33\\-21.7606\\-210.7732\\33\\-23.71373\\-210.0985\\33\\-25.66685\\-209.0703\\33\\-27.61998\\-209.0501\\33\\-29.5731\\-208.7511\\33\\-31.52623\\-208.5606\\33\\-33.47935\\-208.5083\\33\\-35.43248\\-208.097\\33\\-37.3856\\-207.097\\33\\-39.33873\\-207.097\\33\\-41.29185\\-206.7537\\33\\-43.24498\\-206.5722\\33\\-45.1981\\-206.1701\\33\\-47.15123\\-204.7812\\33\\-49.10435\\-204.2241\\33\\-51.05748\\-202.929\\33\\-53.0106\\-202.6423\\33\\-54.30294\\-201.6146\\33\\-55.64784\\-199.6615\\33\\-56.08604\\-197.7084\\33\\-56.91685\\-196.2563\\33\\-58.86998\\-197.041\\33\\-60.15567\\-195.7553\\33\\-59.89627\\-193.8021\\33\\-59.25937\\-191.849\\33\\-56.91685\\-188.5768\\33\\-56.36872\\-187.9428\\33\\-55.48568\\-185.9896\\33\\-53.93316\\-184.0365\\33\\-53.10534\\-182.0834\\33\\-51.94308\\-180.1303\\33\\-49.10435\\-176.838\\33\\-47.15123\\-175.0754\\33\\-45.1981\\-173.974\\33\\-43.24498\\-173.1425\\33\\-41.29185\\-172.0924\\33\\-39.33873\\-171.7294\\33\\-35.43248\\-171.7294\\33\\-33.47935\\-172.7996\\33\\-31.52623\\-173.6061\\33\\-29.5731\\-173.9948\\33\\-27.61998\\-175.0344\\33\\-25.66685\\-176.4309\\33\\-23.71373\\-177.178\\33\\-21.7606\\-176.5996\\33\\-19.80748\\-175.4115\\33\\-15.90123\\-175.4115\\33\\-13.9481\\-176.5671\\33\\-11.99498\\-178.4969\\33\\-10.63784\\-180.1303\\33\\-10.04185\\-180.64\\33\\-8.088726\\-181.2312\\33\\-6.135601\\-181.492\\33\\-4.182476\\-182.2461\\33\\-2.229351\\-182.4368\\33\\-0.276226\\-183.1107\\33\\1.676899\\-184.9011\\33\\3.630024\\-185.476\\33\\7.536274\\-188.692\\33\\9.489399\\-189.4429\\33\\11.44252\\-190.6674\\33\\13.39565\\-191.4922\\33\\17.3019\\-195.0861\\33\\18.51986\\-195.7553\\33\\19.25502\\-196.3555\\33\\20.02707\\-197.7084\\33\\21.20815\\-198.9975\\33\\23.16127\\-199.4745\\33\\27.06752\\-199.9395\\33\\29.02065\\-199.8282\\33\\30.97377\\-198.6356\\33\\32.9269\\-197.1607\\33\\34.08895\\-195.7553\\33\\34.18644\\-193.8021\\33\\34.44667\\-191.849\\33\\35.56251\\-189.8959\\33\\36.83315\\-188.287\\33\\39.17016\\-185.9896\\33\\42.69252\\-183.4262\\33\\44.64565\\-183.1689\\33\\46.59877\\-183.3702\\33\\50.50502\\-184.0594\\33\\52.45815\\-184.9532\\33\\54.41127\\-185.3335\\33\\56.3644\\-185.9521\\33\\58.31752\\-187.1236\\33\\61.1302\\-189.8959\\33\\61.80783\\-191.849\\33\\62.98061\\-193.8021\\33\\63.50082\\-195.7553\\33\\65.00533\\-197.7084\\33\\66.13003\\-198.7905\\33\\68.08315\\-199.6386\\33\\70.03628\\-200.9162\\33\\70.71745\\-201.6146\\33\\70.78553\\-203.5678\\33\\70.03628\\-204.079\\33\\68.08315\\-203.3561\\33\\66.13003\\-204.4137\\33\\65.23177\\-205.5209\\33\\64.34706\\-207.474\\33\\62.93349\\-209.4271\\33\\60.27065\\-212.1991\\33\\58.31752\\-212.8804\\33\\56.3644\\-214.0929\\33\\54.41127\\-214.9297\\33\\50.50502\\-214.961\\33\\48.5519\\-214.3048\\33\\46.59877\\-213.0977\\33\\44.64565\\-212.7197\\33\\42.69252\\-212.08\\33\\40.7394\\-210.4348\\33\\37.76471\\-207.474\\33\\36.62145\\-205.5209\\33\\36.20189\\-203.5678\\33\\34.88002\\-202.2459\\33\\32.9269\\-201.9076\\33\\30.97377\\-202.6159\\33\\29.02065\\-204.3186\\33\\27.06752\\-204.6543\\33\\25.1144\\-204.4203\\33\\23.16127\\-203.6625\\33\\21.20815\\-204.1674\\33\\20.01513\\-205.5209\\33\\18.59306\\-207.474\\33\\17.99717\\-209.4271\\33\\16.63051\\-211.3803\\33\\12.74227\\-215.2865\\33\\11.44252\\-216.5411\\33\\9.489399\\-217.7616\\33\\7.536274\\-217.8467\\33\\3.630024\\-217.8394\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "460" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "5.583149\\-120.3678\\33\\4.834616\\-119.5834\\33\\3.976546\\-117.6303\\33\\3.630024\\-115.668\\33\\5.583149\\-114.4913\\33\\7.536274\\-114.5154\\33\\9.489399\\-114.6775\\33\\11.39853\\-115.6771\\33\\13.00871\\-117.6303\\33\\11.44252\\-119.6065\\33\\9.489399\\-120.6095\\33\\7.536274\\-121.0228\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "461" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-147.5218\\33\\38.78627\\-146.3032\\33\\36.83315\\-145.6838\\33\\34.88002\\-145.278\\33\\30.97377\\-145.267\\33\\29.02065\\-145.3758\\33\\25.1144\\-145.295\\33\\23.16127\\-145.705\\33\\21.20815\\-145.5086\\33\\19.25502\\-143.6739\\33\\16.64494\\-141.0678\\33\\16.00507\\-139.1146\\33\\15.96467\\-137.1615\\33\\16.01284\\-133.2553\\33\\16.09873\\-131.3021\\33\\17.3019\\-129.1511\\33\\18.01554\\-127.3959\\33\\19.18801\\-125.4428\\33\\21.20815\\-124.4413\\33\\23.16127\\-124.8837\\33\\25.1144\\-124.4662\\33\\26.15774\\-123.4896\\33\\27.06752\\-122.8779\\33\\29.02065\\-122.6374\\33\\30.97377\\-122.5692\\33\\32.9269\\-121.3737\\33\\34.88002\\-120.7257\\33\\40.7394\\-122.7942\\33\\42.69252\\-124.0928\\33\\44.05046\\-125.4428\\33\\45.15993\\-127.3959\\33\\45.82979\\-129.349\\33\\45.66939\\-131.3021\\33\\43.9828\\-133.2553\\33\\44.64565\\-134.7428\\33\\46.08509\\-137.1615\\33\\45.70034\\-139.1146\\33\\45.55439\\-141.0678\\33\\47.42936\\-143.0209\\33\\48.10801\\-144.974\\33\\47.32477\\-146.9271\\33\\46.59877\\-147.5368\\33\\44.64565\\-148.185\\33\\42.69252\\-148.371\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "124" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "462" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "93.47378\\-207.068\\33\\92.6638\\-205.5209\\33\\91.90968\\-203.5678\\33\\91.74827\\-199.6615\\33\\90.77847\\-197.7084\\33\\90.73121\\-195.7553\\33\\90.11892\\-193.8021\\33\\89.01189\\-191.849\\33\\88.77833\\-189.8959\\33\\88.24075\\-187.9428\\33\\87.02303\\-185.9896\\33\\86.80791\\-184.0365\\33\\85.94579\\-182.0834\\33\\84.84574\\-180.1303\\33\\84.33681\\-178.1771\\33\\82.98677\\-176.224\\33\\82.83073\\-174.2709\\33\\80.83676\\-170.3646\\33\\79.95525\\-168.4115\\33\\78.7979\\-166.4584\\33\\77.84878\\-164.5165\\33\\75.89565\\-162.3666\\33\\71.9894\\-158.5023\\33\\70.61201\\-156.6928\\33\\68.08315\\-154.3267\\33\\66.13003\\-153.6321\\33\\64.1769\\-153.3469\\33\\62.22377\\-152.295\\33\\60.27065\\-151.4068\\33\\58.31752\\-150.3225\\33\\56.3644\\-149.6783\\33\\54.41127\\-149.3976\\33\\52.45815\\-148.3768\\33\\50.97153\\-146.9271\\33\\50.50502\\-145.7827\\33\\49.69631\\-144.974\\33\\50.09639\\-143.0209\\33\\49.84199\\-141.0678\\33\\48.5519\\-138.1241\\33\\47.70961\\-137.1615\\33\\48.5519\\-136.6802\\33\\49.59258\\-135.2084\\33\\50.1083\\-133.2553\\33\\50.09863\\-127.3959\\33\\49.80673\\-125.4428\\33\\48.5519\\-124.252\\33\\45.26539\\-121.5365\\33\\43.42763\\-119.5834\\33\\43.59573\\-117.6303\\33\\43.23312\\-115.6771\\33\\42.25784\\-113.724\\33\\42.25784\\-111.7709\\33\\43.84755\\-109.8178\\33\\46.59877\\-107.0315\\33\\50.50502\\-103.3129\\33\\52.45815\\-102.2215\\33\\54.41127\\-102.9194\\33\\57.01718\\-105.9115\\33\\58.92385\\-107.8646\\33\\59.98882\\-109.8178\\33\\60.10789\\-111.7709\\33\\60.36539\\-113.724\\33\\61.26724\\-115.6771\\33\\63.22906\\-117.6303\\33\\63.68005\\-119.5834\\33\\64.97066\\-121.5365\\33\\65.5759\\-123.4896\\33\\66.85982\\-125.4428\\33\\67.54493\\-127.3959\\33\\68.77488\\-129.349\\33\\70.03628\\-130.8005\\33\\71.9894\\-132.0374\\33\\73.1474\\-133.2553\\33\\72.76969\\-135.2084\\33\\73.86115\\-137.1615\\33\\75.19883\\-139.1146\\33\\76.40096\\-141.0678\\33\\77.14178\\-143.0209\\33\\78.1953\\-144.974\\33\\78.82008\\-146.9271\\33\\79.7571\\-148.8803\\33\\79.24687\\-150.8334\\33\\77.30282\\-152.7865\\33\\76.41232\\-154.7396\\33\\76.93081\\-156.6928\\33\\77.84878\\-157.7602\\33\\79.8019\\-159.5268\\33\\80.62527\\-158.6459\\33\\81.75503\\-157.7013\\33\\83.70815\\-158.7754\\33\\84.72935\\-160.599\\33\\83.70815\\-162.6917\\33\\83.44729\\-164.5053\\33\\83.70815\\-164.7793\\33\\85.66128\\-164.6244\\33\\87.6144\\-162.8072\\33\\89.5754\\-162.5521\\33\\91.52065\\-163.7766\\33\\92.31818\\-164.5053\\33\\94.02547\\-166.4584\\33\\95.59578\\-168.4115\\33\\96.72356\\-170.3646\\33\\97.96145\\-172.3178\\33\\98.6356\\-174.2709\\33\\99.89199\\-176.224\\33\\100.2843\\-178.1771\\33\\100.2929\\-182.0834\\33\\100.03\\-184.0365\\33\\99.33315\\-184.7757\\33\\97.27486\\-185.9896\\33\\97.43515\\-187.9428\\33\\98.08286\\-189.8959\\33\\96.33044\\-191.849\\33\\97.38003\\-192.7927\\33\\99.33315\\-193.0011\\33\\99.97004\\-193.8021\\33\\101.8112\\-195.7553\\33\\102.2387\\-197.7084\\33\\102.2375\\-201.6146\\33\\101.8307\\-203.5678\\33\\100.5439\\-205.5209\\33\\99.33315\\-206.7255\\33\\97.38003\\-206.9439\\33\\95.44724\\-207.474\\33" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "126" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "463" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-99.8856\\-212.4602\\35\\-101.8387\\-211.3717\\35\\-102.8603\\-209.4271\\35\\-102.9863\\-207.474\\35\\-103.2456\\-205.5209\\35\\-103.2536\\-203.5678\\35\\-103.1114\\-201.6146\\35\\-104.3006\\-199.6615\\35\\-104.8734\\-197.7084\\35\\-104.8905\\-189.8959\\35\\-105.0066\\-187.9428\\35\\-105.0007\\-185.9896\\35\\-104.8865\\-184.0365\\35\\-104.8825\\-182.0834\\35\\-104.441\\-180.1303\\35\\-103.1704\\-178.1771\\35\\-102.543\\-176.224\\35\\-101.0872\\-174.2709\\35\\-100.5276\\-172.3178\\35\\-98.8046\\-170.3646\\35\\-97.21804\\-168.4115\\35\\-96.30487\\-166.4584\\35\\-94.02622\\-163.5779\\35\\-92.12569\\-160.599\\35\\-90.11997\\-159.1921\\35\\-89.52319\\-158.6459\\35\\-88.0029\\-156.6928\\35\\-86.80685\\-154.7396\\35\\-85.19493\\-152.7865\\35\\-85.35802\\-150.8334\\35\\-85.08215\\-148.8803\\35\\-83.80762\\-146.9271\\35\\-83.46917\\-144.974\\35\\-82.92117\\-143.0209\\35\\-81.73782\\-141.0678\\35\\-81.22581\\-139.1146\\35\\-79.94795\\-137.1615\\35\\-79.19109\\-135.2084\\35\\-78.1194\\-133.2553\\35\\-76.4481\\-129.7111\\35\\-75.20842\\-127.3959\\35\\-74.49497\\-125.7759\\35\\-73.24798\\-123.4896\\35\\-72.43334\\-121.5365\\35\\-72.38026\\-119.5834\\35\\-71.2346\\-117.6303\\35\\-69.63733\\-113.724\\35\\-68.65831\\-111.7709\\35\\-68.29951\\-109.8178\\35\\-66.28574\\-105.9115\\35\\-66.28574\\-103.9584\\35\\-66.16879\\-102.0053\\35\\-65.09129\\-100.0521\\35\\-64.72935\\-99.68243\\35\\-62.59403\\-98.09901\\35\\-60.8231\\-97.13435\\35\\-59.52276\\-96.14588\\35\\-58.86998\\-95.49657\\35\\-56.91685\\-94.993\\35\\-54.96373\\-93.54353\\35\\-53.0106\\-93.05045\\35\\-51.05748\\-91.66899\\35\\-49.10435\\-91.00684\\35\\-45.1981\\-91.14387\\35\\-43.62109\\-92.23963\\35\\-43.24498\\-92.64594\\35\\-42.32361\\-94.19276\\35\\-40.48257\\-96.14588\\35\\-38.88574\\-98.09901\\35\\-38.47017\\-100.0521\\35\\-38.46027\\-102.0053\\35\\-38.55466\\-103.9584\\35\\-40.07115\\-105.9115\\35\\-41.29185\\-107.2261\\35\\-47.90376\\-113.724\\35\\-49.10435\\-114.7006\\35\\-51.05748\\-116.1025\\35\\-53.0106\\-117.1035\\35\\-53.51591\\-117.6303\\35\\-55.01591\\-119.5834\\35\\-56.23273\\-121.5365\\35\\-57.61521\\-123.4896\\35\\-58.17243\\-125.4428\\35\\-58.20343\\-127.3959\\35\\-57.79062\\-129.349\\35\\-57.13309\\-131.3021\\35\\-56.98344\\-133.2553\\35\\-56.63503\\-135.2084\\35\\-56.85027\\-137.1615\\35\\-57.64676\\-139.1146\\35\\-58.16299\\-141.0678\\35\\-58.80339\\-143.0209\\35\\-58.98333\\-144.974\\35\\-60.8231\\-146.2228\\35\\-62.77623\\-146.7833\\35\\-64.72935\\-148.6716\\35\\-68.6356\\-152.5465\\35\\-72.54185\\-154.7649\\35\\-74.49497\\-156.4937\\35\\-76.4481\\-158.3234\\35\\-78.40122\\-160.3006\\35\\-80.5116\\-162.5521\\35\\-81.39562\\-164.5053\\35\\-82.55767\\-166.4584\\35\\-83.48478\\-168.4115\\35\\-83.6833\\-170.3646\\35\\-84.82915\\-172.3178\\35\\-85.4612\\-174.2709\\35\\-85.70004\\-176.224\\35\\-86.80098\\-178.1771\\35\\-87.43443\\-180.1303\\35\\-88.53494\\-182.0834\\35\\-89.38604\\-184.0365\\35\\-90.50387\\-185.9896\\35\\-91.25164\\-187.9428\\35\\-91.35812\\-191.849\\35\\-91.62099\\-193.8021\\35\\-91.99233\\-195.7553\\35\\-92.00652\\-197.7084\\35\\-92.67088\\-199.6615\\35\\-93.19476\\-201.6146\\35\\-93.28799\\-205.5209\\35\\-93.6545\\-207.474\\35\\-94.96928\\-209.4271\\35\\-96.55918\\-211.3803\\35\\-97.93247\\-212.4574\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "464" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-16.06156\\-125.4428\\35\\-16.57899\\-123.4896\\35\\-17.63136\\-121.5365\\35\\-18.9524\\-119.5834\\35\\-19.55933\\-117.6303\\35\\-17.85435\\-115.4227\\35\\-15.90123\\-114.7987\\35\\-14.57286\\-113.724\\35\\-12.68019\\-111.7709\\35\\-11.99498\\-110.683\\35\\-11.17983\\-109.8178\\35\\-10.04185\\-108.9518\\35\\-8.298872\\-109.8178\\35\\-7.571723\\-111.7709\\35\\-8.088726\\-112.3013\\35\\-9.037227\\-113.724\\35\\-9.904408\\-115.6771\\35\\-10.39867\\-117.6303\\35\\-11.21479\\-119.5834\\35\\-13.23312\\-121.5365\\35\\-13.9481\\-122.4534\\35\\-15.11829\\-123.4896\\35\\-15.79988\\-125.4428\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "141" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "465" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.276226\\-215.4362\\35\\-2.229351\\-214.4122\\35\\-4.182476\\-213.509\\35\\-6.135601\\-213.9227\\35\\-8.088726\\-214.6443\\35\\-10.04185\\-214.9095\\35\\-11.99498\\-214.6515\\35\\-13.9481\\-213.8955\\35\\-15.90123\\-212.8714\\35\\-19.80748\\-212.5097\\35\\-21.7606\\-211.9504\\35\\-23.71373\\-210.7042\\35\\-25.66685\\-210.5626\\35\\-27.61998\\-210.5412\\35\\-29.5731\\-210.0491\\35\\-31.52623\\-208.9742\\35\\-35.43248\\-208.6829\\35\\-39.33873\\-208.5869\\35\\-41.29185\\-208.1799\\35\\-43.24498\\-207.0486\\35\\-45.1981\\-206.6955\\35\\-47.15123\\-206.2297\\35\\-49.10435\\-204.8184\\35\\-51.05748\\-204.5787\\35\\-53.0106\\-204.1009\\35\\-55.57801\\-201.6146\\35\\-56.19069\\-199.6615\\35\\-56.91685\\-198.6428\\35\\-58.86998\\-198.5814\\35\\-60.22038\\-197.7084\\35\\-59.93975\\-195.7553\\35\\-59.2494\\-193.8021\\35\\-55.8561\\-189.8959\\35\\-55.47741\\-187.9428\\35\\-54.82628\\-185.9896\\35\\-53.0106\\-182.3204\\35\\-51.80178\\-180.1303\\35\\-47.15123\\-175.4394\\35\\-45.1981\\-174.647\\35\\-43.24498\\-174.0335\\35\\-41.29185\\-173.6686\\35\\-35.43248\\-173.7137\\35\\-33.47935\\-174.0562\\35\\-31.52623\\-175.0789\\35\\-29.5731\\-175.6528\\35\\-27.61998\\-176.8014\\35\\-25.66685\\-178.6556\\35\\-23.71373\\-179.4399\\35\\-21.7606\\-179.4732\\35\\-19.80748\\-179.2718\\35\\-17.85435\\-180.3847\\35\\-15.90123\\-180.8483\\35\\-10.04185\\-181.5278\\35\\-8.088726\\-182.1648\\35\\-6.135601\\-182.3614\\35\\-4.182476\\-182.9816\\35\\-0.276226\\-183.5808\\35\\0.1908256\\-184.0365\\35\\1.676899\\-185.0768\\35\\3.630024\\-186.752\\35\\5.583149\\-187.4632\\35\\8.580186\\-189.8959\\35\\9.489399\\-190.6998\\35\\11.44252\\-191.5235\\35\\13.39565\\-193.0055\\35\\13.94943\\-193.8021\\35\\14.907\\-195.7553\\35\\17.3019\\-197.9144\\35\\19.25502\\-199.027\\35\\21.20815\\-199.77\\35\\23.16127\\-199.9671\\35\\25.1144\\-200.6158\\35\\27.06752\\-201.7901\\35\\29.02065\\-201.6721\\35\\31.2971\\-199.6615\\35\\33.6487\\-197.7084\\35\\35.52545\\-195.7553\\35\\35.98328\\-193.8021\\35\\36.0116\\-191.849\\35\\36.3244\\-189.8959\\35\\37.83625\\-187.9428\\35\\38.78627\\-187.0417\\35\\40.7394\\-185.4123\\35\\42.69252\\-184.8617\\35\\44.64565\\-184.0601\\35\\48.5519\\-184.2807\\35\\50.50502\\-184.9575\\35\\54.41127\\-185.7421\\35\\56.3644\\-186.7913\\35\\58.31752\\-187.3072\\35\\60.27065\\-189.0363\\35\\61.1302\\-189.8959\\35\\61.99998\\-191.849\\35\\63.24991\\-193.8021\\35\\64.96164\\-195.7553\\35\\66.55727\\-197.7084\\35\\68.08315\\-198.8771\\35\\70.03628\\-200.1997\\35\\71.9894\\-201.3509\\35\\72.24749\\-201.6146\\35\\72.9227\\-203.5678\\35\\71.9894\\-204.3125\\35\\70.03628\\-204.0731\\35\\68.08315\\-203.545\\35\\66.13003\\-205.096\\35\\65.7732\\-205.5209\\35\\65.45394\\-207.474\\35\\64.37665\\-209.4271\\35\\62.22377\\-211.6079\\35\\60.27065\\-212.7698\\35\\58.31752\\-213.198\\35\\56.3644\\-214.2066\\35\\54.41127\\-214.9825\\35\\50.50502\\-215.0047\\35\\48.5519\\-214.715\\35\\46.59877\\-214.0041\\35\\44.64565\\-212.908\\35\\42.69252\\-212.3387\\35\\40.7394\\-210.4764\\35\\37.76939\\-207.474\\35\\36.82552\\-205.5209\\35\\36.72464\\-203.5678\\35\\34.88002\\-201.6954\\35\\32.9269\\-202.3638\\35\\30.97377\\-203.9151\\35\\29.02065\\-204.6736\\35\\27.06752\\-206.0179\\35\\25.1144\\-205.8871\\35\\23.16127\\-204.4467\\35\\21.20815\\-203.6898\\35\\19.25502\\-204.1479\\35\\17.95837\\-205.5209\\35\\17.3019\\-206.5951\\35\\16.58041\\-207.474\\35\\15.96406\\-209.4271\\35\\14.64925\\-211.3803\\35\\10.74195\\-215.2865\\35\\9.489399\\-216.3154\\35\\7.536274\\-216.9026\\35\\3.630024\\-216.9026\\35\\1.676899\\-216.3486\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "151" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "466" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "1.676899\\-162.5897\\35\\-0.276226\\-162.3905\\35\\-2.229351\\-161.8619\\35\\-6.135601\\-161.9418\\35\\-10.04185\\-160.903\\35\\-11.99498\\-160.786\\35\\-13.9481\\-160.2071\\35\\-15.90123\\-159.2635\\35\\-17.85435\\-157.9254\\35\\-18.96506\\-156.6928\\35\\-20.472\\-154.7396\\35\\-22.4095\\-152.7865\\35\\-24.66122\\-150.8334\\35\\-27.61998\\-147.6057\\35\\-29.5731\\-146.3699\\35\\-31.52623\\-146.2007\\35\\-33.47935\\-145.7739\\35\\-35.43248\\-144.3247\\35\\-37.3856\\-143.9658\\35\\-43.24498\\-143.9658\\35\\-45.1981\\-144.3506\\35\\-47.15123\\-145.5427\\35\\-49.10435\\-146.258\\35\\-51.05748\\-147.4452\\35\\-53.0106\\-148.248\\35\\-54.85038\\-146.9271\\35\\-54.86607\\-144.974\\35\\-52.01866\\-143.0209\\35\\-51.17192\\-141.0678\\35\\-50.61358\\-139.1146\\35\\-50.42762\\-137.1615\\35\\-51.21284\\-133.2553\\35\\-51.88623\\-131.3021\\35\\-52.09352\\-129.349\\35\\-51.05748\\-128.0654\\35\\-50.3284\\-127.3959\\35\\-48.95872\\-125.4428\\35\\-48.53215\\-123.4896\\35\\-46.26694\\-121.5365\\35\\-45.1981\\-120.8221\\35\\-43.24498\\-118.8993\\35\\-41.29185\\-117.9493\\35\\-39.33873\\-117.1969\\35\\-35.43248\\-117.296\\35\\-33.47935\\-118.7076\\35\\-32.72352\\-119.5834\\35\\-32.26904\\-121.5365\\35\\-29.5731\\-124.6654\\35\\-26.37505\\-127.3959\\35\\-25.38263\\-129.349\\35\\-24.1959\\-131.3021\\35\\-23.42007\\-133.2553\\35\\-23.85117\\-135.2084\\35\\-24.77628\\-137.1615\\35\\-26.82767\\-139.1146\\35\\-27.61998\\-139.9658\\35\\-29.00206\\-141.0678\\35\\-28.71946\\-143.0209\\35\\-25.66685\\-145.4801\\35\\-23.71373\\-146.5003\\35\\-21.7606\\-148.2313\\35\\-19.80748\\-149.38\\35\\-17.85435\\-149.6112\\35\\-15.90123\\-149.5983\\35\\-13.9481\\-150.0993\\35\\-11.99498\\-150.0638\\35\\-10.04185\\-148.547\\35\\-8.088726\\-147.6743\\35\\-6.796815\\-146.9271\\35\\-6.135601\\-146.1337\\35\\-5.605467\\-144.974\\35\\-5.826835\\-143.0209\\35\\-4.182476\\-141.85\\35\\-2.229351\\-141.3933\\35\\-1.921308\\-141.0678\\35\\-1.125197\\-139.1146\\35\\-1.095841\\-135.2084\\35\\-1.215228\\-133.2553\\35\\-0.5638437\\-131.3021\\35\\-0.276226\\-130.9956\\35\\1.676899\\-129.9763\\35\\3.630024\\-130.6981\\35\\4.252001\\-131.3021\\35\\5.221694\\-133.2553\\35\\6.479583\\-135.2084\\35\\7.536274\\-137.0816\\35\\7.536274\\-137.4646\\35\\6.831269\\-141.0678\\35\\7.536274\\-142.2885\\35\\8.224113\\-143.0209\\35\\9.489399\\-143.9081\\35\\11.44252\\-145.0406\\35\\13.39565\\-145.1484\\35\\15.34877\\-145.9445\\35\\17.3019\\-147.5569\\35\\18.94179\\-146.9271\\35\\19.25502\\-146.3547\\35\\19.52556\\-144.974\\35\\17.3019\\-142.8988\\35\\15.61931\\-141.0678\\35\\12.34933\\-137.1615\\35\\13.45078\\-135.2084\\35\\14.73993\\-131.3021\\35\\15.87073\\-129.349\\35\\16.20606\\-125.4428\\35\\17.3019\\-124.5045\\35\\19.25502\\-123.3233\\35\\21.20815\\-122.5933\\35\\23.16127\\-122.6766\\35\\27.06752\\-122.2191\\35\\30.97377\\-122.206\\35\\32.9269\\-120.87\\35\\34.88002\\-120.8872\\35\\36.83315\\-122.1312\\35\\38.78627\\-122.312\\35\\40.65726\\-123.4896\\35\\42.69252\\-124.9631\\35\\44.64565\\-126.6649\\35\\45.34856\\-127.3959\\35\\46.06055\\-129.349\\35\\45.74853\\-131.3021\\35\\44.38656\\-133.2553\\35\\45.4052\\-135.2084\\35\\46.16409\\-137.1615\\35\\45.75094\\-139.1146\\35\\45.77328\\-141.0678\\35\\47.94632\\-143.0209\\35\\48.20538\\-144.974\\35\\46.59877\\-147.0626\\35\\44.64565\\-147.5335\\35\\42.69252\\-147.587\\35\\40.7394\\-146.3865\\35\\36.83315\\-145.2097\\35\\34.88002\\-144.9967\\35\\30.97377\\-145.267\\35\\29.02065\\-145.8605\\35\\27.06752\\-146.3057\\35\\25.1144\\-146.4135\\35\\23.16127\\-146.7785\\35\\21.20815\\-147.6817\\35\\19.51484\\-148.8803\\35\\17.3019\\-151.1037\\35\\15.34877\\-152.2423\\35\\13.39565\\-153.1527\\35\\11.44252\\-154.9995\\35\\9.823486\\-156.6928\\35\\8.745027\\-158.6459\\35\\7.893553\\-160.599\\35\\7.536274\\-160.9245\\35\\5.583149\\-162.0064\\35\\3.630024\\-162.5897\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "467" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "7.536274\\-122.465\\35\\5.583149\\-120.6591\\35\\4.592896\\-119.5834\\35\\3.622395\\-117.6303\\35\\3.2308\\-115.6771\\35\\3.630024\\-114.2345\\35\\7.536274\\-114.7577\\35\\9.489399\\-115.3782\\35\\11.44252\\-116.2776\\35\\13.057\\-117.6303\\35\\12.37818\\-119.5834\\35\\9.489399\\-122.2797\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "66" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "468" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "71.9894\\-155.5356\\35\\68.08315\\-153.3092\\35\\66.13003\\-152.3175\\35\\64.1769\\-151.6379\\35\\62.42873\\-150.8334\\35\\60.27065\\-149.6392\\35\\58.56826\\-148.8803\\35\\56.3644\\-147.7331\\35\\54.41127\\-147.6867\\35\\52.45815\\-147.4476\\35\\51.77913\\-146.9271\\35\\50.50502\\-145.4171\\35\\49.5848\\-144.974\\35\\49.7837\\-143.0209\\35\\50.13568\\-141.0678\\35\\49.29897\\-139.1146\\35\\48.5519\\-137.7312\\35\\47.64714\\-137.1615\\35\\48.5519\\-136.7221\\35\\49.63309\\-135.2084\\35\\50.20106\\-133.2553\\35\\50.20106\\-131.3021\\35\\50.36959\\-129.349\\35\\50.30558\\-127.3959\\35\\50.1083\\-125.4428\\35\\49.05946\\-123.4896\\35\\48.5519\\-123.0134\\35\\46.59877\\-121.6342\\35\\44.63802\\-119.5834\\35\\44.03136\\-117.6303\\35\\43.85619\\-115.6771\\35\\43.24008\\-113.724\\35\\42.367\\-111.7709\\35\\42.69252\\-111.425\\35\\44.64565\\-108.6762\\35\\45.30563\\-107.8646\\35\\46.59877\\-105.8301\\35\\48.5519\\-104.7539\\35\\50.50502\\-104.0531\\35\\52.45815\\-103.0711\\35\\54.41127\\-103.5195\\35\\58.91641\\-107.8646\\35\\59.92413\\-109.8178\\35\\58.98731\\-113.724\\35\\60.09653\\-115.6771\\35\\62.22377\\-116.8057\\35\\63.04832\\-117.6303\\35\\63.67159\\-119.5834\\35\\64.97066\\-121.5365\\35\\65.5759\\-123.4896\\35\\66.85982\\-125.4428\\35\\67.54493\\-127.3959\\35\\68.90154\\-129.349\\35\\71.37978\\-131.3021\\35\\72.34622\\-133.2553\\35\\72.68158\\-135.2084\\35\\74.56992\\-137.1615\\35\\75.89565\\-139.38\\35\\76.66815\\-141.0678\\35\\77.38403\\-143.0209\\35\\76.62257\\-146.9271\\35\\77.2179\\-148.8803\\35\\77.07389\\-150.8334\\35\\75.89565\\-151.6363\\35\\74.6124\\-152.7865\\35\\73.69839\\-154.7396\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "469" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "91.52065\\-193.2114\\35\\90.84364\\-191.849\\35\\90.7975\\-189.8959\\35\\90.58906\\-187.9428\\35\\87.6144\\-181.6506\\35\\84.92509\\-176.224\\35\\84.77486\\-174.2709\\35\\83.83887\\-172.3178\\35\\82.80201\\-170.3646\\35\\81.9239\\-168.4115\\35\\80.91002\\-166.4584\\35\\80.08796\\-164.5053\\35\\78.94665\\-162.5521\\35\\79.8019\\-161.6522\\35\\81.75503\\-161.8279\\35\\82.26329\\-162.5521\\35\\82.65198\\-164.5053\\35\\83.70815\\-165.507\\35\\85.66128\\-165.8159\\35\\87.6144\\-163.9444\\35\\89.56753\\-163.6143\\35\\91.52065\\-163.5874\\35\\93.47378\\-164.2985\\35\\95.58226\\-166.4584\\35\\96.69163\\-168.4115\\35\\98.02905\\-170.3646\\35\\98.74044\\-172.3178\\35\\99.96055\\-174.2709\\35\\100.5354\\-176.224\\35\\100.9092\\-178.1771\\35\\100.9092\\-182.0834\\35\\100.5439\\-184.0365\\35\\99.33315\\-185.2597\\35\\97.38003\\-185.7779\\35\\95.4269\\-187.0185\\35\\94.49152\\-187.9428\\35\\93.90005\\-189.8959\\35\\93.9211\\-191.849\\35\\93.47378\\-193.2357\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "470" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "99.33315\\-208.2202\\35\\97.38003\\-206.9798\\35\\95.4269\\-206.3255\\35\\94.66085\\-205.5209\\35\\94.54931\\-203.5678\\35\\93.99693\\-201.6146\\35\\92.97672\\-199.6615\\35\\92.73984\\-197.7084\\35\\93.47378\\-195.468\\35\\95.4269\\-194.999\\35\\99.33315\\-195.1062\\35\\101.2863\\-196.6301\\35\\102.0665\\-197.7084\\35\\102.3276\\-199.6615\\35\\102.3742\\-201.6146\\35\\102.2223\\-205.5209\\35\\101.2863\\-207.56\\35" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "115" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "471" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-101.8387\\-212.5492\\37\\-102.8813\\-211.3803\\37\\-103.0462\\-209.4271\\37\\-103.0986\\-207.474\\37\\-103.9139\\-205.5209\\37\\-104.005\\-203.5678\\37\\-102.5001\\-201.6146\\37\\-103.8001\\-199.6615\\37\\-104.9026\\-197.7084\\37\\-105.4302\\-191.849\\37\\-105.4975\\-185.9896\\37\\-105.441\\-182.0834\\37\\-104.9423\\-178.1771\\37\\-103.9546\\-176.224\\37\\-101.1051\\-172.3178\\37\\-100.2156\\-170.3646\\37\\-97.93247\\-167.56\\37\\-97.20776\\-166.4584\\37\\-96.21288\\-164.5053\\37\\-94.64996\\-162.5521\\37\\-92.0731\\-159.831\\37\\-90.11997\\-159.1427\\37\\-88.16685\\-157.6806\\37\\-86.21372\\-155.6071\\37\\-85.26846\\-154.7396\\37\\-83.5024\\-152.7865\\37\\-84.6557\\-150.8334\\37\\-85.18607\\-148.8803\\37\\-84.4753\\-146.9271\\37\\-83.66171\\-144.974\\37\\-83.20998\\-143.0209\\37\\-81.97139\\-141.0678\\37\\-81.25348\\-139.1146\\37\\-79.95762\\-137.1615\\37\\-79.19109\\-135.2084\\37\\-78.1194\\-133.2553\\37\\-76.4481\\-129.4064\\37\\-75.20842\\-127.3959\\37\\-74.49497\\-125.7759\\37\\-73.24798\\-123.4896\\37\\-72.41978\\-121.5365\\37\\-72.17803\\-119.5834\\37\\-71.16157\\-117.6303\\37\\-70.40173\\-115.6771\\37\\-68.21885\\-111.7709\\37\\-68.08182\\-109.8178\\37\\-66.29554\\-105.9115\\37\\-66.53387\\-103.9584\\37\\-66.3895\\-102.0053\\37\\-65.94879\\-100.0521\\37\\-64.35825\\-98.09901\\37\\-62.77623\\-97.13826\\37\\-60.8231\\-97.07842\\37\\-58.86998\\-95.40858\\37\\-56.91685\\-94.04307\\37\\-54.96373\\-93.12862\\37\\-53.0106\\-92.94138\\37\\-51.05748\\-91.54287\\37\\-49.10435\\-91.00684\\37\\-45.1981\\-91.07436\\37\\-43.3568\\-92.23963\\37\\-42.41513\\-94.19276\\37\\-40.50967\\-96.14588\\37\\-39.54102\\-98.09901\\37\\-38.9922\\-100.0521\\37\\-39.02391\\-103.9584\\37\\-40.09556\\-105.9115\\37\\-41.29185\\-107.3025\\37\\-43.24498\\-109.3054\\37\\-45.1981\\-111.1293\\37\\-47.82333\\-113.724\\37\\-49.10435\\-114.8408\\37\\-51.05748\\-116.3057\\37\\-53.0106\\-116.9224\\37\\-55.65336\\-119.5834\\37\\-57.48698\\-121.5365\\37\\-58.86998\\-123.6064\\37\\-59.69814\\-125.4428\\37\\-58.40241\\-129.349\\37\\-58.00449\\-131.3021\\37\\-57.75587\\-133.2553\\37\\-56.91685\\-135.0976\\37\\-58.14641\\-139.1146\\37\\-59.37305\\-141.0678\\37\\-60.14262\\-143.0209\\37\\-60.8231\\-144.3965\\37\\-61.54892\\-144.974\\37\\-62.77623\\-145.5244\\37\\-64.72935\\-146.6727\\37\\-68.6356\\-150.4707\\37\\-69.16457\\-150.8334\\37\\-72.54185\\-152.4736\\37\\-74.49497\\-153.5869\\37\\-76.4481\\-154.8617\\37\\-78.40122\\-156.7863\\37\\-80.35435\\-160.1561\\37\\-82.50111\\-162.5521\\37\\-84.54783\\-166.4584\\37\\-85.48277\\-168.4115\\37\\-85.56085\\-170.3646\\37\\-87.44825\\-174.2709\\37\\-87.53738\\-176.224\\37\\-91.35779\\-184.0365\\37\\-91.71165\\-185.9896\\37\\-92.793\\-187.9428\\37\\-93.29534\\-189.8959\\37\\-93.38517\\-197.7084\\37\\-93.62447\\-199.6615\\37\\-94.72108\\-201.6146\\37\\-95.25442\\-203.5678\\37\\-95.28016\\-207.474\\37\\-95.6283\\-209.4271\\37\\-96.81016\\-211.3803\\37\\-97.93247\\-212.4915\\37\\-99.8856\\-212.8625\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "472" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-15.90123\\-124.4128\\37\\-16.75449\\-123.4896\\37\\-17.46741\\-121.5365\\37\\-18.37102\\-119.5834\\37\\-17.49184\\-117.6303\\37\\-15.90123\\-116.4507\\37\\-13.12664\\-113.724\\37\\-12.372\\-111.7709\\37\\-11.97227\\-109.8178\\37\\-10.2416\\-107.8646\\37\\-7.903179\\-105.9115\\37\\-6.135601\\-104.2749\\37\\-4.182476\\-104.6441\\37\\-2.915023\\-105.9115\\37\\-2.229351\\-106.8067\\37\\-0.276226\\-108.7598\\37\\0.4854928\\-109.8178\\37\\1.676899\\-110.3693\\37\\2.628894\\-111.7709\\37\\4.336596\\-113.724\\37\\5.583149\\-114.8335\\37\\7.021835\\-115.6771\\37\\7.536274\\-116.1136\\37\\9.489399\\-116.8865\\37\\10.67393\\-117.6303\\37\\11.57796\\-119.5834\\37\\10.87567\\-121.5365\\37\\9.634433\\-123.4896\\37\\9.299159\\-123.4896\\37\\7.536274\\-122.7519\\37\\6.41811\\-121.5365\\37\\4.797249\\-119.5834\\37\\3.983385\\-117.6303\\37\\2.532024\\-115.6771\\37\\0.7249041\\-113.724\\37\\-0.276226\\-112.0659\\37\\-2.229351\\-110.1057\\37\\-4.182476\\-110.1229\\37\\-5.196599\\-111.7709\\37\\-6.135601\\-112.5687\\37\\-8.088726\\-114.4564\\37\\-9.159955\\-115.6771\\37\\-10.13659\\-117.6303\\37\\-10.85801\\-119.5834\\37\\-12.73115\\-121.5365\\37\\-13.9481\\-123.0105\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "206" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "473" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-10.04185\\-160.5326\\37\\-11.99498\\-160.5333\\37\\-13.9481\\-160.4134\\37\\-15.90123\\-159.5292\\37\\-17.85435\\-158.9277\\37\\-19.80748\\-157.5743\\37\\-20.63532\\-156.6928\\37\\-21.34466\\-154.7396\\37\\-21.7606\\-154.2684\\37\\-23.82509\\-152.7865\\37\\-25.66685\\-150.4617\\37\\-27.61998\\-148.7317\\37\\-29.5731\\-147.7242\\37\\-31.52623\\-146.2137\\37\\-33.47935\\-145.5654\\37\\-35.43248\\-144.1201\\37\\-37.3856\\-143.3777\\37\\-39.33873\\-143.3777\\37\\-41.29185\\-143.5262\\37\\-43.24498\\-143.5262\\37\\-45.1981\\-143.7934\\37\\-47.15123\\-143.8468\\37\\-49.10435\\-144.7077\\37\\-51.05748\\-145.7995\\37\\-53.0106\\-146.5764\\37\\-54.89109\\-144.974\\37\\-53.78741\\-143.0209\\37\\-52.45701\\-141.0678\\37\\-52.25105\\-137.1615\\37\\-52.21548\\-135.2084\\37\\-52.33496\\-133.2553\\37\\-52.74974\\-131.3021\\37\\-52.1363\\-129.349\\37\\-51.05748\\-128.3136\\37\\-49.28449\\-127.3959\\37\\-47.15123\\-125.8851\\37\\-46.27398\\-125.4428\\37\\-45.27948\\-123.4896\\37\\-45.07603\\-121.5365\\37\\-42.98275\\-119.5834\\37\\-41.29185\\-118.7379\\37\\-39.33873\\-118.4247\\37\\-37.3856\\-118.7839\\37\\-35.43248\\-119.2665\\37\\-33.47935\\-120.6355\\37\\-31.52623\\-122.3321\\37\\-29.5731\\-123.1918\\37\\-27.61998\\-124.2949\\37\\-25.66685\\-124.3848\\37\\-23.71373\\-125.065\\37\\-23.17987\\-125.4428\\37\\-23.43052\\-127.3959\\37\\-23.99178\\-129.349\\37\\-22.96943\\-131.3021\\37\\-22.42819\\-133.2553\\37\\-22.32976\\-135.2084\\37\\-22.43042\\-137.1615\\37\\-23.71373\\-138.5813\\37\\-24.42312\\-139.1146\\37\\-25.66685\\-140.3241\\37\\-26.22202\\-141.0678\\37\\-25.72682\\-143.0209\\37\\-23.71373\\-144.5609\\37\\-21.7606\\-146.4304\\37\\-19.80748\\-147.6046\\37\\-13.9481\\-147.7231\\37\\-11.99498\\-147.6612\\37\\-10.68084\\-146.9271\\37\\-8.299575\\-144.974\\37\\-8.7902\\-141.0678\\37\\-8.088726\\-139.5114\\37\\-6.135601\\-140.5879\\37\\-5.600369\\-141.0678\\37\\-4.182476\\-141.887\\37\\-2.229351\\-141.8309\\37\\-1.509514\\-141.0678\\37\\-0.6630462\\-139.1146\\37\\-0.1677191\\-137.1615\\37\\0.7167954\\-135.2084\\37\\1.064478\\-133.2553\\37\\1.676899\\-132.1603\\37\\3.630024\\-132.3622\\37\\5.583149\\-134.426\\37\\7.536274\\-135.9813\\37\\9.489399\\-136.4172\\37\\11.44252\\-135.1375\\37\\12.86569\\-133.2553\\37\\13.94977\\-131.3021\\37\\14.64317\\-129.349\\37\\14.44775\\-127.3959\\37\\14.07173\\-125.4428\\37\\15.20186\\-123.4896\\37\\17.3019\\-122.5403\\37\\21.20815\\-122.2126\\37\\23.16127\\-122.2126\\37\\27.06752\\-122.1062\\37\\29.02065\\-122.1062\\37\\30.97377\\-122.2066\\37\\32.9269\\-121.7676\\37\\34.88002\\-121.8453\\37\\36.83315\\-122.6316\\37\\38.17222\\-123.4896\\37\\38.78627\\-124.041\\37\\40.7394\\-125.2311\\37\\42.69252\\-125.8856\\37\\44.64565\\-126.8032\\37\\45.25965\\-127.3959\\37\\46.25225\\-129.349\\37\\46.25225\\-131.3021\\37\\45.60063\\-133.2553\\37\\45.53836\\-135.2084\\37\\46.16409\\-137.1615\\37\\45.93592\\-139.1146\\37\\47.16748\\-141.0678\\37\\48.5519\\-142.5668\\37\\50.16389\\-141.0678\\37\\48.5519\\-137.4005\\37\\48.08396\\-137.1615\\37\\48.5519\\-136.9804\\37\\49.69038\\-135.2084\\37\\50.19698\\-133.2553\\37\\50.23681\\-131.3021\\37\\51.24419\\-129.349\\37\\51.127\\-127.3959\\37\\49.9214\\-123.4896\\37\\47.69392\\-121.5365\\37\\46.59877\\-120.4491\\37\\45.94946\\-119.5834\\37\\45.25316\\-117.6303\\37\\44.27866\\-115.6771\\37\\43.4287\\-113.724\\37\\42.70028\\-111.7709\\37\\43.86928\\-109.8178\\37\\45.58966\\-107.8646\\37\\46.35129\\-105.9115\\37\\46.59877\\-105.6588\\37\\48.5519\\-104.6552\\37\\50.50502\\-104.4721\\37\\52.45815\\-104.025\\37\\54.41127\\-104.8115\\37\\56.33623\\-105.9115\\37\\58.31752\\-107.3202\\37\\58.85882\\-107.8646\\37\\59.6626\\-109.8178\\37\\58.95358\\-111.7709\\37\\57.68974\\-113.724\\37\\58.31752\\-114.2733\\37\\60.27065\\-115.2877\\37\\62.22377\\-116.937\\37\\62.91341\\-117.6303\\37\\63.55211\\-119.5834\\37\\64.95912\\-121.5365\\37\\65.5759\\-123.4896\\37\\66.85982\\-125.4428\\37\\67.54493\\-127.3959\\37\\68.81403\\-129.349\\37\\71.0504\\-131.3021\\37\\72.15888\\-133.2553\\37\\72.78889\\-135.2084\\37\\74.63708\\-137.1615\\37\\76.27267\\-139.1146\\37\\76.92937\\-141.0678\\37\\76.85646\\-143.0209\\37\\75.89565\\-144.4281\\37\\75.36636\\-144.974\\37\\74.4581\\-146.9271\\37\\74.46111\\-148.8803\\37\\73.45821\\-150.8334\\37\\71.9894\\-152.6046\\37\\70.03628\\-152.5895\\37\\68.08315\\-151.5387\\37\\66.13003\\-151.2864\\37\\64.1769\\-150.2687\\37\\62.22377\\-148.7649\\37\\58.51284\\-146.9271\\37\\56.3644\\-145.7493\\37\\52.45815\\-145.6963\\37\\50.50502\\-145.1135\\37\\48.5519\\-145.0988\\37\\46.59877\\-146.151\\37\\44.64565\\-146.8729\\37\\42.69252\\-146.2865\\37\\40.7394\\-145.5745\\37\\38.78627\\-145.0262\\37\\36.83315\\-144.3003\\37\\34.88002\\-143.9507\\37\\32.9269\\-144.2287\\37\\31.08792\\-144.974\\37\\27.06752\\-146.9653\\37\\25.1144\\-147.8591\\37\\23.16127\\-148.5032\\37\\21.20815\\-149.8483\\37\\19.25502\\-152.2793\\37\\17.3019\\-153.5819\\37\\15.34877\\-155.0938\\37\\13.39565\\-156.1829\\37\\11.44252\\-157.5172\\37\\10.66895\\-158.6459\\37\\9.626842\\-160.599\\37\\7.536274\\-161.8122\\37\\5.583149\\-162.2418\\37\\1.676899\\-162.2842\\37\\-0.276226\\-161.5396\\37\\-2.229351\\-161.2691\\37\\-4.182476\\-161.6757\\37\\-6.135601\\-161.6747\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "146" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "474" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "3.630024\\-215.6832\\37\\1.676899\\-215.23\\37\\-0.276226\\-214.3318\\37\\-2.229351\\-213.309\\37\\-4.182476\\-212.9027\\37\\-6.135601\\-214.0658\\37\\-8.088726\\-214.8372\\37\\-10.04185\\-214.9935\\37\\-11.99498\\-214.828\\37\\-13.9481\\-214.0777\\37\\-15.90123\\-212.9367\\37\\-19.80748\\-212.8804\\37\\-21.7606\\-212.252\\37\\-23.71373\\-210.892\\37\\-27.61998\\-210.842\\37\\-29.5731\\-210.6723\\37\\-31.52623\\-210.0277\\37\\-33.47935\\-208.9652\\37\\-37.3856\\-208.8423\\37\\-39.33873\\-208.8423\\37\\-41.29185\\-208.6888\\37\\-43.24498\\-208.1716\\37\\-45.1981\\-206.9687\\37\\-47.15123\\-206.7067\\37\\-49.10435\\-206.1594\\37\\-51.05748\\-204.9908\\37\\-53.0106\\-204.3831\\37\\-55.71384\\-201.6146\\37\\-56.4835\\-199.6615\\37\\-56.91685\\-199.1322\\37\\-58.86998\\-199.1044\\37\\-60.39944\\-197.7084\\37\\-59.83285\\-195.7553\\37\\-58.86998\\-194.704\\37\\-55.55843\\-191.849\\37\\-55.13811\\-189.8959\\37\\-55.03031\\-187.9428\\37\\-54.10149\\-185.9896\\37\\-53.29243\\-184.0365\\37\\-52.10488\\-182.0834\\37\\-51.05748\\-180.804\\37\\-49.10435\\-178.7954\\37\\-47.15123\\-176.9445\\37\\-45.1981\\-175.702\\37\\-43.24498\\-175.2834\\37\\-41.29185\\-175.1977\\37\\-39.33873\\-175.6613\\37\\-33.47935\\-175.7044\\37\\-31.52623\\-176.7585\\37\\-29.5731\\-177.54\\37\\-27.61998\\-178.701\\37\\-25.66685\\-179.7135\\37\\-23.71373\\-180.9247\\37\\-21.7606\\-181.3944\\37\\-19.80748\\-181.4882\\37\\-17.85435\\-182.5529\\37\\-15.90123\\-183.2188\\37\\-13.9481\\-183.232\\37\\-11.99498\\-182.9055\\37\\-10.04185\\-182.4222\\37\\-8.088726\\-182.9995\\37\\-4.182476\\-183.554\\37\\-2.229351\\-184.8613\\37\\-0.276226\\-185.3136\\37\\1.676899\\-185.5929\\37\\4.644389\\-187.9428\\37\\6.820574\\-189.8959\\37\\9.489399\\-192.3907\\37\\11.24342\\-193.8021\\37\\12.8497\\-195.7553\\37\\14.13366\\-197.7084\\37\\15.34877\\-198.7095\\37\\17.3019\\-199.0518\\37\\18.99961\\-199.6615\\37\\21.20815\\-200.5754\\37\\25.1144\\-202.8908\\37\\27.06752\\-203.2708\\37\\29.02065\\-203.1609\\37\\30.67278\\-201.6146\\37\\31.99971\\-199.6615\\37\\32.9269\\-198.7343\\37\\34.88002\\-197.2863\\37\\36.23605\\-195.7553\\37\\36.82552\\-193.8021\\37\\36.97371\\-191.849\\37\\37.6661\\-189.8959\\37\\39.37498\\-187.9428\\37\\40.7394\\-186.8559\\37\\42.69252\\-185.4434\\37\\44.64565\\-185.2056\\37\\48.5519\\-185.1297\\37\\50.50502\\-185.2449\\37\\54.41127\\-185.6431\\37\\56.3644\\-186.4837\\37\\58.31752\\-187.1105\\37\\60.27065\\-188.8797\\37\\63.10428\\-191.849\\37\\64.1769\\-193.336\\37\\66.5649\\-195.7553\\37\\67.65778\\-197.7084\\37\\68.08315\\-198.2072\\37\\70.14263\\-199.6615\\37\\71.9894\\-200.6381\\37\\73.00311\\-201.6146\\37\\73.7888\\-203.5678\\37\\71.9894\\-204.4716\\37\\70.03628\\-203.7434\\37\\68.08315\\-204.5881\\37\\67.34453\\-205.5209\\37\\66.77161\\-207.474\\37\\65.49448\\-209.4271\\37\\64.33712\\-211.3803\\37\\62.22377\\-212.8033\\37\\60.27065\\-213.9357\\37\\58.31752\\-214.4459\\37\\54.41127\\-214.9935\\37\\50.50502\\-215.0047\\37\\48.5519\\-214.961\\37\\46.59877\\-214.2557\\37\\44.64565\\-212.9367\\37\\42.69252\\-212.3748\\37\\41.5067\\-211.3803\\37\\39.44912\\-209.4271\\37\\37.76088\\-207.474\\37\\36.82552\\-205.5209\\37\\36.82552\\-203.5678\\37\\34.90642\\-201.6146\\37\\32.9269\\-202.5189\\37\\31.94355\\-203.5678\\37\\30.97377\\-204.3612\\37\\29.02065\\-204.1901\\37\\27.06752\\-204.9854\\37\\26.83695\\-205.5209\\37\\25.1144\\-206.1877\\37\\23.62014\\-205.5209\\37\\23.16127\\-205.1362\\37\\21.20815\\-204.2407\\37\\19.25502\\-203.7164\\37\\17.3019\\-203.967\\37\\15.34877\\-205.0471\\37\\14.88866\\-205.5209\\37\\14.04437\\-207.474\\37\\13.9224\\-209.4271\\37\\12.55085\\-211.3803\\37\\9.489399\\-214.4176\\37\\7.536274\\-215.6635\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "475" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "91.52065\\-186.6905\\37\\90.3086\\-184.0365\\37\\89.16113\\-182.0834\\37\\88.8232\\-180.1303\\37\\87.6144\\-177.8777\\37\\86.88911\\-176.224\\37\\86.21443\\-174.2709\\37\\85.10403\\-172.3178\\37\\84.3086\\-170.3646\\37\\83.10926\\-168.4115\\37\\83.26536\\-166.4584\\37\\83.70815\\-166.0072\\37\\85.66128\\-165.9875\\37\\87.6144\\-167.0735\\37\\89.56753\\-165.49\\37\\90.39384\\-164.5053\\37\\91.52065\\-163.6832\\37\\93.47378\\-163.4403\\37\\95.4269\\-164.3795\\37\\97.38003\\-167.5006\\37\\99.55252\\-170.3646\\37\\100.4243\\-172.3178\\37\\100.7161\\-174.2709\\37\\101.9391\\-176.224\\37\\102.2878\\-178.1771\\37\\102.2878\\-182.0834\\37\\101.9564\\-184.0365\\37\\101.2863\\-184.7442\\37\\99.33315\\-185.6535\\37\\97.38003\\-185.8026\\37\\93.47378\\-187.7855\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "476" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "99.33315\\-208.446\\37\\98.29829\\-207.474\\37\\96.68248\\-205.5209\\37\\96.69707\\-203.5678\\37\\95.96213\\-201.6146\\37\\95.4269\\-200.8521\\37\\94.84747\\-199.6615\\37\\95.57207\\-197.7084\\37\\97.38003\\-196.7318\\37\\99.33315\\-197.2544\\37\\99.68286\\-197.7084\\37\\99.95629\\-199.6615\\37\\101.2863\\-202.3614\\37\\101.6757\\-203.5678\\37\\102.1098\\-205.5209\\37\\102.4043\\-207.474\\37\\101.2863\\-208.7959\\37" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "130" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "477" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-101.8387\\-212.0023\\39\\-102.373\\-211.3803\\39\\-102.6809\\-209.4271\\39\\-102.6516\\-207.474\\39\\-101.8387\\-206.0882\\39\\-101.1033\\-205.5209\\39\\-100.2775\\-201.6146\\39\\-98.65237\\-199.6615\\39\\-98.78968\\-197.7084\\39\\-99.8856\\-197.0637\\39\\-101.8387\\-197.3134\\39\\-103.7918\\-197.2888\\39\\-105.745\\-194.3969\\39\\-106.2363\\-193.8021\\39\\-106.8483\\-191.849\\39\\-107.0668\\-187.9428\\39\\-107.0742\\-184.0365\\39\\-106.8316\\-180.1303\\39\\-106.3538\\-178.1771\\39\\-105.2741\\-176.224\\39\\-104.0192\\-174.2709\\39\\-102.5129\\-172.3178\\39\\-101.8387\\-171.3033\\39\\-100.1379\\-168.4115\\39\\-97.93247\\-165.5756\\39\\-97.22083\\-164.5053\\39\\-95.97935\\-162.2999\\39\\-94.02622\\-161.0484\\39\\-92.0731\\-159.6891\\39\\-90.11997\\-159.1512\\39\\-88.16685\\-157.9562\\39\\-84.2606\\-155.8272\\39\\-83.14777\\-154.7396\\39\\-82.06065\\-152.7865\\39\\-82.37668\\-150.8334\\39\\-82.3334\\-148.8803\\39\\-82.59944\\-146.9271\\39\\-83.46973\\-144.974\\39\\-83.484\\-143.0209\\39\\-82.90215\\-141.0678\\39\\-81.30949\\-139.1146\\39\\-80.17996\\-137.1615\\39\\-78.40122\\-133.625\\39\\-78.14214\\-133.2553\\39\\-77.65647\\-131.3021\\39\\-77.27909\\-129.349\\39\\-75.32622\\-127.3959\\39\\-73.24798\\-123.4896\\39\\-72.36746\\-121.5365\\39\\-70.73734\\-117.6303\\39\\-70.2044\\-115.6771\\39\\-69.12691\\-113.724\\39\\-67.60387\\-111.7709\\39\\-67.12131\\-109.8178\\39\\-66.50809\\-107.8646\\39\\-66.34639\\-105.9115\\39\\-67.35615\\-103.9584\\39\\-66.9643\\-102.0053\\39\\-66.16879\\-100.0521\\39\\-65.10878\\-98.09901\\39\\-64.72935\\-97.72198\\39\\-62.77623\\-97.12642\\39\\-60.8231\\-97.04828\\39\\-59.67943\\-96.14588\\39\\-56.91685\\-93.59055\\39\\-54.96373\\-93.05045\\39\\-53.16008\\-92.23963\\39\\-51.05748\\-91.06678\\39\\-49.10435\\-90.89356\\39\\-47.15123\\-91.00684\\39\\-45.1981\\-91.30081\\39\\-44.24078\\-92.23963\\39\\-42.51995\\-94.19276\\39\\-41.09241\\-96.14588\\39\\-40.3322\\-98.09901\\39\\-39.30117\\-100.0521\\39\\-39.16434\\-102.0053\\39\\-39.17714\\-103.9584\\39\\-40.09556\\-105.9115\\39\\-41.29185\\-107.6579\\39\\-43.24498\\-109.9532\\39\\-45.1981\\-111.1217\\39\\-47.15123\\-112.9269\\39\\-49.10435\\-114.4443\\39\\-51.05748\\-115.3649\\39\\-53.0106\\-116.8076\\39\\-54.96373\\-118.6777\\39\\-58.12717\\-121.5365\\39\\-59.68614\\-123.4896\\39\\-60.06567\\-125.4428\\39\\-59.96639\\-127.3959\\39\\-59.7262\\-129.349\\39\\-58.50299\\-131.3021\\39\\-57.90258\\-133.2553\\39\\-56.80151\\-135.2084\\39\\-57.81203\\-137.1615\\39\\-59.37975\\-139.1146\\39\\-59.13737\\-141.0678\\39\\-60.8231\\-141.8015\\39\\-62.64753\\-143.0209\\39\\-64.72935\\-144.7299\\39\\-66.68247\\-146.5935\\39\\-68.6356\\-147.7184\\39\\-70.58872\\-148.9965\\39\\-74.49497\\-150.2853\\39\\-76.78733\\-152.7865\\39\\-80.87006\\-156.6928\\39\\-82.30747\\-158.6564\\39\\-83.52818\\-160.599\\39\\-84.2606\\-162.17\\39\\-85.55311\\-164.5053\\39\\-87.46931\\-168.4115\\39\\-87.52561\\-170.3646\\39\\-89.43324\\-174.2709\\39\\-89.99128\\-176.224\\39\\-91.15513\\-178.1771\\39\\-91.40755\\-180.1303\\39\\-92.0731\\-181.602\\39\\-93.32688\\-184.0365\\39\\-93.37315\\-185.9896\\39\\-94.54858\\-187.9428\\39\\-95.28892\\-189.8959\\39\\-95.34746\\-195.7553\\39\\-95.97115\\-197.7084\\39\\-95.72987\\-199.6615\\39\\-97.15891\\-203.5678\\39\\-97.17591\\-209.4271\\39\\-97.43839\\-211.3803\\39\\-97.93247\\-211.9488\\39\\-99.8856\\-212.6519\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "478" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-15.90123\\-124.7675\\39\\-17.03069\\-123.4896\\39\\-17.3407\\-121.5365\\39\\-16.14871\\-117.6303\\39\\-15.90123\\-117.3722\\39\\-13.49675\\-115.6771\\39\\-12.10348\\-113.724\\39\\-11.72098\\-111.7709\\39\\-11.64669\\-109.8178\\39\\-10.58372\\-107.8646\\39\\-8.741628\\-105.9115\\39\\-6.135601\\-101.9824\\39\\-4.182476\\-102.2246\\39\\-2.229351\\-103.555\\39\\-2.085516\\-103.9584\\39\\-0.276226\\-106.091\\39\\0.883442\\-107.8646\\39\\2.364693\\-109.8178\\39\\3.214081\\-111.7709\\39\\3.855385\\-113.724\\39\\4.798697\\-115.6771\\39\\5.583149\\-116.5316\\39\\7.083721\\-117.6303\\39\\9.489399\\-120.2383\\39\\10.19228\\-121.5365\\39\\10.89139\\-123.4896\\39\\9.489399\\-124.3691\\39\\7.536274\\-122.8218\\39\\6.548677\\-121.5365\\39\\5.583149\\-120.5975\\39\\2.897602\\-117.6303\\39\\-0.276226\\-114.5103\\39\\-2.229351\\-113.2878\\39\\-4.182476\\-113.2519\\39\\-6.135601\\-114.0751\\39\\-8.088726\\-115.0168\\39\\-8.756605\\-115.6771\\39\\-10.13659\\-117.6303\\39\\-10.83172\\-119.5834\\39\\-12.42967\\-121.5365\\39\\-13.20327\\-123.4896\\39\\-13.9481\\-124.2387\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "85" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "479" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-13.9481\\-213.4419\\39\\-15.90123\\-212.9367\\39\\-19.80748\\-212.927\\39\\-21.7606\\-212.2813\\39\\-23.71373\\-210.9364\\39\\-29.5731\\-210.6686\\39\\-31.52623\\-210.1487\\39\\-33.47935\\-208.9652\\39\\-39.33873\\-208.9563\\39\\-41.29185\\-208.897\\39\\-43.24498\\-208.368\\39\\-45.1981\\-207.0486\\39\\-47.15123\\-206.9687\\39\\-49.10435\\-206.3884\\39\\-51.05748\\-205.1339\\39\\-53.0106\\-204.4015\\39\\-53.83657\\-203.5678\\39\\-55.39841\\-201.6146\\39\\-55.92579\\-199.6615\\39\\-56.91685\\-198.6023\\39\\-58.97612\\-199.6615\\39\\-60.22068\\-197.7084\\39\\-59.72686\\-195.7553\\39\\-58.86998\\-194.8679\\39\\-57.1203\\-193.8021\\39\\-55.03031\\-191.849\\39\\-54.92617\\-187.9428\\39\\-53.90959\\-185.9896\\39\\-52.18694\\-184.0365\\39\\-51.2932\\-182.0834\\39\\-49.82712\\-180.1303\\39\\-49.10435\\-179.3865\\39\\-47.15123\\-178.081\\39\\-45.1981\\-177.5638\\39\\-43.24498\\-177.397\\39\\-35.43248\\-177.4406\\39\\-33.47935\\-177.5557\\39\\-31.52623\\-178.0002\\39\\-29.5731\\-179.0193\\39\\-27.61998\\-179.7434\\39\\-25.66685\\-180.9779\\39\\-23.71373\\-181.6069\\39\\-21.7606\\-182.9937\\39\\-19.80748\\-183.4991\\39\\-17.85435\\-183.4872\\39\\-15.90123\\-183.789\\39\\-13.9481\\-183.7774\\39\\-11.99498\\-183.4189\\39\\-10.04185\\-183.4049\\39\\-8.088726\\-183.7416\\39\\-6.135601\\-184.2463\\39\\-4.182476\\-184.9398\\39\\-2.229351\\-185.5277\\39\\-0.276226\\-186.8095\\39\\1.676899\\-187.3072\\39\\2.721396\\-187.9428\\39\\4.949112\\-189.8959\\39\\8.850878\\-193.8021\\39\\10.7101\\-195.7553\\39\\11.99967\\-197.7084\\39\\13.39565\\-199.0124\\39\\15.34877\\-199.4999\\39\\17.3019\\-199.8456\\39\\19.25502\\-200.6975\\39\\20.50036\\-201.6146\\39\\20.62831\\-203.5678\\39\\19.25502\\-203.8627\\39\\17.3019\\-202.6623\\39\\15.34877\\-202.5208\\39\\13.1721\\-203.5678\\39\\12.00979\\-205.5209\\39\\11.91203\\-207.474\\39\\11.44252\\-208.8057\\39\\11.01528\\-209.4271\\39\\9.168161\\-211.3803\\39\\7.536274\\-212.9114\\39\\6.838729\\-213.3334\\39\\5.583149\\-213.7408\\39\\1.676899\\-213.7572\\39\\-0.276226\\-212.6305\\39\\-2.229351\\-212.0405\\39\\-4.182476\\-212.4831\\39\\-8.088726\\-214.3522\\39\\-10.04185\\-214.7208\\39\\-11.99498\\-214.3204\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "196" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "480" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-6.135601\\-160.6077\\39\\-7.170757\\-158.6459\\39\\-8.088726\\-157.9994\\39\\-10.04185\\-157.7323\\39\\-11.99498\\-157.8538\\39\\-14.04261\\-158.6459\\39\\-15.90123\\-159.0129\\39\\-17.70176\\-158.6459\\39\\-19.80748\\-158.0462\\39\\-21.7606\\-155.7449\\39\\-23.71373\\-154.1208\\39\\-25.02511\\-152.7865\\39\\-26.47449\\-150.8334\\39\\-27.61998\\-149.7062\\39\\-29.5731\\-147.9753\\39\\-31.52623\\-146.0821\\39\\-35.43248\\-144.0258\\39\\-37.3856\\-142.3413\\39\\-39.33873\\-142.3212\\39\\-41.29185\\-142.9389\\39\\-45.1981\\-143.0584\\39\\-47.15123\\-142.3362\\39\\-49.10435\\-142.9538\\39\\-51.05748\\-144.3551\\39\\-53.0106\\-145.5165\\39\\-54.96373\\-144.8565\\39\\-56.06507\\-143.0209\\39\\-56.87035\\-141.0678\\39\\-54.96373\\-139.4445\\39\\-53.66803\\-137.1615\\39\\-53.24756\\-135.2084\\39\\-53.84229\\-133.2553\\39\\-54.12294\\-131.3021\\39\\-53.29272\\-129.349\\39\\-53.0106\\-129.069\\39\\-51.05748\\-127.9896\\39\\-49.10435\\-127.3881\\39\\-45.1981\\-126.6697\\39\\-43.24498\\-126.7916\\39\\-41.79652\\-125.4428\\39\\-42.69742\\-123.4896\\39\\-44.12568\\-121.5365\\39\\-43.24498\\-120.6221\\39\\-41.29185\\-120.0347\\39\\-39.33873\\-119.3225\\39\\-37.3856\\-120.4758\\39\\-35.43248\\-121.0146\\39\\-33.47935\\-121.266\\39\\-31.52623\\-121.807\\39\\-27.61998\\-122.4144\\39\\-25.66685\\-122.5505\\39\\-23.71373\\-123.0367\\39\\-21.7606\\-124.3982\\39\\-20.67272\\-125.4428\\39\\-21.04674\\-127.3959\\39\\-22.35578\\-129.349\\39\\-22.22192\\-131.3021\\39\\-20.92275\\-133.2553\\39\\-20.35267\\-135.2084\\39\\-20.57097\\-137.1615\\39\\-24.06048\\-141.0678\\39\\-23.71373\\-141.9706\\39\\-22.9512\\-143.0209\\39\\-21.7606\\-143.6507\\39\\-19.80748\\-145.0931\\39\\-17.85435\\-145.5559\\39\\-13.9481\\-145.5369\\39\\-12.10595\\-144.974\\39\\-11.50669\\-143.0209\\39\\-11.5001\\-139.1146\\39\\-11.10997\\-137.1615\\39\\-10.04185\\-136.5042\\39\\-8.088726\\-137.0443\\39\\-6.135601\\-137.9699\\39\\-4.182476\\-139.2347\\39\\-2.229351\\-139.7717\\39\\-0.276226\\-137.9362\\39\\0.3519412\\-137.1615\\39\\1.676899\\-135.8577\\39\\3.630024\\-134.6357\\39\\5.583149\\-135.37\\39\\7.536274\\-135.891\\39\\9.489399\\-135.7625\\39\\11.44252\\-134.2203\\39\\12.3907\\-133.2553\\39\\13.39565\\-131.2064\\39\\13.93387\\-129.349\\39\\13.79238\\-127.3959\\39\\12.56494\\-125.4428\\39\\13.8229\\-123.4896\\39\\15.34877\\-122.4863\\39\\17.3019\\-122.2191\\39\\21.20815\\-122.1062\\39\\29.02065\\-122.1062\\39\\32.9269\\-122.9843\\39\\34.88002\\-123.0014\\39\\36.83315\\-123.3542\\39\\38.78627\\-124.6875\\39\\40.7394\\-125.8297\\39\\42.69252\\-126.424\\39\\44.5471\\-127.3959\\39\\46.59877\\-128.8998\\39\\47.03072\\-129.349\\39\\47.69271\\-131.3021\\39\\47.05406\\-133.2553\\39\\45.89702\\-135.2084\\39\\46.1734\\-137.1615\\39\\46.32824\\-139.1146\\39\\47.52319\\-141.0678\\39\\48.5519\\-142.4712\\39\\50.33269\\-141.0678\\39\\49.46044\\-139.1146\\39\\49.40899\\-137.1615\\39\\49.98307\\-135.2084\\39\\50.27028\\-131.3021\\39\\51.53812\\-129.349\\39\\51.82998\\-127.3959\\39\\51.62757\\-125.4428\\39\\51.10645\\-123.4896\\39\\49.87276\\-121.5365\\39\\47.28934\\-119.5834\\39\\45.97733\\-117.6303\\39\\45.17676\\-115.6771\\39\\43.55789\\-113.724\\39\\43.68278\\-111.7709\\39\\44.05331\\-109.8178\\39\\46.59877\\-106.65\\39\\48.5519\\-104.7918\\39\\50.50502\\-104.2175\\39\\52.45815\\-104.025\\39\\54.41127\\-104.5173\\39\\56.3644\\-105.5144\\39\\58.34024\\-107.8646\\39\\58.27469\\-109.8178\\39\\57.09408\\-111.7709\\39\\57.42031\\-113.724\\39\\58.31752\\-114.4454\\39\\60.27065\\-115.1659\\39\\60.78493\\-115.6771\\39\\62.31852\\-117.6303\\39\\63.19616\\-119.5834\\39\\64.91687\\-121.5365\\39\\65.5759\\-123.4896\\39\\66.85982\\-125.4428\\39\\67.54493\\-127.3959\\39\\68.7588\\-129.349\\39\\70.86864\\-131.3021\\39\\73.39243\\-133.2553\\39\\73.30005\\-135.2084\\39\\74.52847\\-137.1615\\39\\75.55972\\-139.1146\\39\\76.15474\\-141.0678\\39\\75.28612\\-143.0209\\39\\73.57464\\-144.974\\39\\72.68467\\-146.9271\\39\\72.54185\\-148.8803\\39\\71.9894\\-149.9545\\39\\70.03628\\-150.5724\\39\\68.08315\\-149.5968\\39\\66.13003\\-149.5293\\39\\64.57044\\-148.8803\\39\\60.27065\\-146.3625\\39\\58.31752\\-144.8901\\39\\56.3644\\-143.8872\\39\\54.41127\\-143.7252\\39\\50.50502\\-143.6322\\39\\48.5519\\-144.4521\\39\\48.0113\\-144.974\\39\\46.59877\\-145.4505\\39\\44.64565\\-145.7585\\39\\42.69252\\-144.7932\\39\\40.7394\\-143.9493\\39\\38.78627\\-143.927\\39\\36.83315\\-143.7407\\39\\34.88002\\-143.1825\\39\\32.9269\\-143.6068\\39\\30.97377\\-144.1897\\39\\29.70178\\-144.974\\39\\27.06752\\-146.859\\39\\25.58966\\-148.8803\\39\\23.16127\\-151.0075\\39\\21.20815\\-153.3598\\39\\19.44065\\-154.7396\\39\\18.33535\\-156.6928\\39\\17.35824\\-158.6459\\39\\15.34877\\-158.3802\\39\\13.39565\\-157.8362\\39\\11.44252\\-158.2672\\39\\8.534781\\-160.599\\39\\7.536274\\-161.1248\\39\\5.75893\\-160.599\\39\\3.630024\\-159.7159\\39\\1.676899\\-159.5633\\39\\-0.1765768\\-158.6459\\39\\-2.229351\\-157.0183\\39\\-4.182476\\-160.6075\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "481" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-214.2952\\39\\44.64565\\-212.9367\\39\\42.69252\\-212.3704\\39\\40.7394\\-210.5688\\39\\37.856\\-207.474\\39\\37.09224\\-205.5209\\39\\36.84078\\-203.5678\\39\\34.88002\\-201.8504\\39\\34.33749\\-201.6146\\39\\33.35609\\-199.6615\\39\\35.60496\\-197.7084\\39\\37.0876\\-195.7553\\39\\37.63944\\-193.8021\\39\\37.95843\\-191.849\\39\\39.11403\\-189.8959\\39\\41.08053\\-187.9428\\39\\42.69252\\-186.7296\\39\\44.64565\\-185.6431\\39\\46.59877\\-185.4514\\39\\48.5519\\-185.0311\\39\\50.50502\\-184.8303\\39\\52.45815\\-184.8439\\39\\54.41127\\-185.1074\\39\\56.3644\\-185.6003\\39\\58.31752\\-186.4297\\39\\60.27065\\-187.4768\\39\\62.75184\\-189.8959\\39\\64.1769\\-191.4474\\39\\66.52549\\-193.8021\\39\\68.38879\\-195.7553\\39\\69.21416\\-197.7084\\39\\70.03628\\-198.7218\\39\\71.9894\\-200.1584\\39\\73.94253\\-201.2823\\39\\74.26804\\-201.6146\\39\\74.93612\\-203.5678\\39\\73.94253\\-204.3855\\39\\71.9894\\-204.0844\\39\\70.03628\\-204.3501\\39\\68.71644\\-205.5209\\39\\67.65778\\-207.474\\39\\66.85496\\-209.4271\\39\\65.64175\\-211.3803\\39\\64.1769\\-212.7872\\39\\62.22377\\-214.009\\39\\60.27065\\-214.6583\\39\\58.31752\\-214.8996\\39\\54.41127\\-214.9935\\39\\48.5519\\-214.9935\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "482" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "95.4269\\-186.0844\\39\\93.47378\\-185.8164\\39\\92.67988\\-184.0365\\39\\91.48309\\-182.0834\\39\\90.71068\\-180.1303\\39\\89.56753\\-177.8755\\39\\88.88274\\-176.224\\39\\87.6144\\-173.9171\\39\\86.9874\\-172.3178\\39\\86.04532\\-170.3646\\39\\85.66128\\-169.7853\\39\\85.18166\\-168.4115\\39\\85.66128\\-167.7246\\39\\87.6144\\-168.0222\\39\\89.56753\\-168.0886\\39\\90.85509\\-166.4584\\39\\92.07975\\-164.5053\\39\\93.47378\\-163.6057\\39\\95.4269\\-163.4845\\39\\96.80242\\-164.5053\\39\\98.08863\\-166.4584\\39\\99.5235\\-168.4115\\39\\101.9133\\-172.3178\\39\\102.4208\\-174.2709\\39\\102.9033\\-178.1771\\39\\102.8929\\-182.0834\\39\\102.5206\\-184.0365\\39\\101.2863\\-185.2771\\39\\99.33315\\-185.7779\\39\\97.38003\\-185.7902\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "483" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "101.2863\\-210.1016\\39\\100.564\\-209.4271\\39\\99.01414\\-207.474\\39\\99.27666\\-205.5209\\39\\101.2863\\-206.1831\\39\\103.1524\\-207.474\\39\\103.2788\\-209.4271\\39" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "484" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-196.152\\41\\-105.745\\-194.5909\\41\\-106.5796\\-193.8021\\41\\-107.6034\\-191.849\\41\\-108.2901\\-189.8959\\41\\-108.7401\\-187.9428\\41\\-108.754\\-184.0365\\41\\-108.3589\\-182.0834\\41\\-107.6605\\-180.1303\\41\\-107.3516\\-178.1771\\41\\-106.9363\\-176.224\\41\\-105.9131\\-174.2709\\41\\-103.7918\\-171.9957\\41\\-103.0403\\-170.3646\\41\\-102.0128\\-168.4115\\41\\-99.8856\\-166.1876\\41\\-97.93247\\-163.6044\\41\\-97.21804\\-162.5521\\41\\-95.97935\\-160.4552\\41\\-94.02622\\-159.5682\\41\\-90.11997\\-159.4085\\41\\-86.21372\\-158.8794\\41\\-85.74288\\-160.599\\41\\-86.21372\\-161.8958\\41\\-86.64426\\-162.5521\\41\\-89.32198\\-168.4115\\41\\-89.49474\\-170.3646\\41\\-90.47443\\-172.3178\\41\\-91.27511\\-174.2709\\41\\-91.72658\\-176.224\\41\\-92.74407\\-178.1771\\41\\-93.36893\\-180.1303\\41\\-94.02622\\-181.5745\\41\\-95.30953\\-184.0365\\41\\-95.34273\\-185.9896\\41\\-96.47733\\-187.9428\\41\\-97.1748\\-189.8959\\41\\-97.2916\\-191.849\\41\\-97.29986\\-193.8021\\41\\-97.93247\\-195.4511\\41\\-98.59515\\-195.7553\\41\\-99.8856\\-196.0027\\41\\-101.8387\\-196.2172\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "485" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-15.90123\\-123.9225\\41\\-16.18305\\-123.4896\\41\\-16.11293\\-121.5365\\41\\-14.84476\\-119.5834\\41\\-14.24107\\-117.6303\\41\\-13.9481\\-117.3164\\41\\-11.99498\\-116.2693\\41\\-11.40904\\-115.6771\\41\\-10.64818\\-113.724\\41\\-10.50382\\-111.7709\\41\\-10.49483\\-109.8178\\41\\-10.38236\\-107.8646\\41\\-9.133277\\-105.9115\\41\\-8.051166\\-103.9584\\41\\-7.276693\\-102.0053\\41\\-6.135601\\-101.0884\\41\\-4.182476\\-101.2425\\41\\-2.229351\\-101.1906\\41\\-1.098225\\-102.0053\\41\\-0.9950157\\-103.9584\\41\\0.3730842\\-105.9115\\41\\1.027646\\-107.8646\\41\\2.015706\\-109.8178\\41\\2.749638\\-111.7709\\41\\2.816222\\-113.724\\41\\3.950992\\-115.6771\\41\\4.443826\\-117.6303\\41\\5.583149\\-118.6705\\41\\5.983075\\-119.5834\\41\\5.583149\\-119.922\\41\\3.394302\\-117.6303\\41\\1.119846\\-115.6771\\41\\-0.276226\\-114.7376\\41\\-2.229351\\-114.5507\\41\\-4.182476\\-114.5451\\41\\-6.135601\\-114.7997\\41\\-8.088726\\-116.0027\\41\\-10.04185\\-116.891\\41\\-10.78809\\-117.6303\\41\\-11.32884\\-119.5834\\41\\-12.86395\\-121.5365\\41\\-13.41363\\-123.4896\\41\\-13.9481\\-124.0428\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "76" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "486" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-13.9481\\-212.9766\\41\\-15.90123\\-212.927\\41\\-19.80748\\-212.6989\\41\\-21.7606\\-212.1421\\41\\-23.71373\\-210.8198\\41\\-27.61998\\-210.1012\\41\\-29.5731\\-210.0728\\41\\-31.59598\\-209.4271\\41\\-33.47935\\-208.9563\\41\\-37.3856\\-208.9475\\41\\-41.29185\\-208.7535\\41\\-43.24498\\-208.2837\\41\\-45.1981\\-207.0486\\41\\-47.15123\\-207.0393\\41\\-49.10435\\-206.4065\\41\\-51.05748\\-204.9684\\41\\-53.0106\\-204.1808\\41\\-53.61693\\-203.5678\\41\\-54.52163\\-201.6146\\41\\-55.0451\\-199.6615\\41\\-56.91685\\-198.3332\\41\\-58.86998\\-199.3494\\41\\-59.70338\\-197.7084\\41\\-59.32571\\-195.7553\\41\\-58.86998\\-195.2472\\41\\-56.91685\\-193.7646\\41\\-54.96373\\-192.4317\\41\\-54.51055\\-191.849\\41\\-54.86827\\-187.9428\\41\\-53.68877\\-185.9896\\41\\-51.73843\\-184.0365\\41\\-49.10435\\-181.0065\\41\\-47.15123\\-179.5078\\41\\-43.24498\\-178.6378\\41\\-35.43248\\-178.6378\\41\\-29.5731\\-179.9533\\41\\-27.61998\\-181.1124\\41\\-25.66685\\-181.7753\\41\\-23.71373\\-183.06\\41\\-21.7606\\-184.5441\\41\\-19.80748\\-185.2167\\41\\-15.90123\\-184.481\\41\\-11.99498\\-184.3886\\41\\-10.04185\\-184.9184\\41\\-8.088726\\-185.228\\41\\-6.135601\\-185.4048\\41\\-4.182476\\-185.7421\\41\\-2.229351\\-186.9775\\41\\-0.276226\\-187.6953\\41\\1.676899\\-188.84\\41\\2.956788\\-189.8959\\41\\4.895116\\-191.849\\41\\6.71527\\-193.8021\\41\\7.536274\\-194.8809\\41\\9.425152\\-197.7084\\41\\11.44252\\-199.0575\\41\\13.39565\\-199.6239\\41\\15.34877\\-200.0624\\41\\17.3019\\-201.2533\\41\\17.3019\\-201.8621\\41\\15.34877\\-202.341\\41\\13.39565\\-202.3543\\41\\11.44252\\-202.5963\\41\\10.06087\\-203.5678\\41\\9.489399\\-205.1107\\41\\8.22078\\-207.474\\41\\7.255142\\-209.4271\\41\\5.583149\\-210.9388\\41\\4.938618\\-211.3803\\41\\3.630024\\-211.8079\\41\\1.676899\\-211.8343\\41\\-0.276226\\-211.2101\\41\\-2.229351\\-210.9037\\41\\-4.182476\\-212.1668\\41\\-8.088726\\-213.5078\\41\\-10.04185\\-213.8953\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "202" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "487" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "15.34877\\-158.9277\\41\\13.39565\\-157.5703\\41\\11.44252\\-157.1636\\41\\9.489399\\-157.2747\\41\\7.536274\\-156.9831\\41\\6.385325\\-156.6928\\41\\3.630024\\-155.0808\\41\\1.676899\\-154.7158\\41\\-0.276226\\-153.1557\\41\\-2.229351\\-152.1622\\41\\-4.182476\\-151.2687\\41\\-6.135601\\-151.4895\\41\\-8.066015\\-152.7865\\41\\-10.04185\\-152.9772\\41\\-11.99498\\-153.3753\\41\\-13.5412\\-154.7396\\41\\-17.88225\\-156.6928\\41\\-19.80748\\-157.1087\\41\\-21.7606\\-155.4575\\41\\-23.71373\\-154.5283\\41\\-25.66685\\-152.2736\\41\\-26.71499\\-150.8334\\41\\-29.5731\\-147.7831\\41\\-31.52623\\-145.8327\\41\\-33.47935\\-144.2287\\41\\-35.43248\\-143.6112\\41\\-37.3856\\-142.1005\\41\\-39.33873\\-141.9234\\41\\-41.29185\\-141.9855\\41\\-43.24498\\-141.8681\\41\\-47.15123\\-141.8405\\41\\-49.10435\\-142.1845\\41\\-51.05748\\-143.6068\\41\\-53.0106\\-144.2272\\41\\-54.96373\\-144.2351\\41\\-56.68923\\-143.0209\\41\\-58.57701\\-141.0678\\41\\-57.49926\\-139.1146\\41\\-57.97742\\-137.1615\\41\\-58.86998\\-136.6615\\41\\-59.64575\\-137.1615\\41\\-60.3475\\-139.1146\\41\\-60.8231\\-139.8257\\41\\-61.9861\\-141.0678\\41\\-64.72935\\-142.7337\\41\\-66.68247\\-144.6108\\41\\-67.2532\\-144.974\\41\\-70.58872\\-146.5713\\41\\-72.54185\\-147.6095\\41\\-74.49497\\-148.1671\\41\\-76.4481\\-149.9866\\41\\-78.40122\\-151.4581\\41\\-80.33215\\-150.8334\\41\\-80.28986\\-148.8803\\41\\-79.39215\\-146.9271\\41\\-79.55151\\-144.974\\41\\-80.35435\\-144.1826\\41\\-82.30747\\-144.4269\\41\\-83.5556\\-143.0209\\41\\-83.23904\\-141.0678\\41\\-81.65134\\-139.1146\\41\\-81.00014\\-137.1615\\41\\-79.27692\\-135.2084\\41\\-78.39359\\-133.2553\\41\\-78.0547\\-131.3021\\41\\-78.95197\\-129.349\\41\\-78.40122\\-128.3519\\41\\-76.4481\\-127.2319\\41\\-74.49497\\-125.7574\\41\\-72.54185\\-122.1717\\41\\-72.12774\\-121.5365\\41\\-71.22062\\-119.5834\\41\\-69.65223\\-115.6771\\41\\-68.6356\\-114.0654\\41\\-66.47269\\-111.7709\\41\\-65.57139\\-109.8178\\41\\-66.31549\\-105.9115\\41\\-66.94157\\-103.9584\\41\\-66.60171\\-102.0053\\41\\-66.07767\\-100.0521\\41\\-64.12067\\-98.09901\\41\\-62.77623\\-97.23048\\41\\-60.8231\\-96.896\\41\\-57.5661\\-94.19276\\41\\-56.91685\\-93.54705\\41\\-54.96373\\-93.03987\\41\\-53.68335\\-92.23963\\41\\-51.05748\\-90.32407\\41\\-49.10435\\-89.88671\\41\\-47.15123\\-90.94621\\41\\-45.1981\\-91.78265\\41\\-43.08339\\-94.19276\\41\\-42.27725\\-96.14588\\41\\-40.52088\\-98.09901\\41\\-39.74047\\-100.0521\\41\\-39.43347\\-102.0053\\41\\-39.56409\\-103.9584\\41\\-40.11324\\-105.9115\\41\\-41.29185\\-107.3884\\41\\-43.24498\\-109.5514\\41\\-47.15123\\-112.4535\\41\\-49.10435\\-113.5315\\41\\-53.0106\\-116.5522\\41\\-54.96373\\-117.4109\\41\\-56.91685\\-119.0078\\41\\-59.39495\\-121.5365\\41\\-59.99955\\-123.4896\\41\\-60.39773\\-125.4428\\41\\-60.33482\\-127.3959\\41\\-59.94646\\-129.349\\41\\-59.08317\\-131.3021\\41\\-56.91685\\-134.539\\41\\-55.89206\\-135.2084\\41\\-54.96373\\-136.4616\\41\\-54.47225\\-135.2084\\41\\-54.84075\\-133.2553\\41\\-54.98643\\-131.3021\\41\\-54.2893\\-129.349\\41\\-53.0106\\-128.0265\\41\\-51.05748\\-126.817\\41\\-49.10435\\-126.3995\\41\\-45.1981\\-126.1304\\41\\-43.24498\\-125.5823\\41\\-42.25058\\-123.4896\\41\\-41.29185\\-121.899\\41\\-39.33873\\-121.0228\\41\\-37.3856\\-121.5592\\41\\-35.43248\\-121.7722\\41\\-33.47935\\-120.9302\\41\\-31.52623\\-120.5816\\41\\-29.5731\\-120.586\\41\\-27.61998\\-120.9551\\41\\-25.66685\\-122.1681\\41\\-23.71373\\-122.8403\\41\\-21.7606\\-124.1562\\41\\-20.30453\\-125.4428\\41\\-20.36789\\-127.3959\\41\\-20.83775\\-129.349\\41\\-20.9468\\-131.3021\\41\\-19.66797\\-133.2553\\41\\-18.51739\\-135.2084\\41\\-18.33375\\-137.1615\\41\\-18.47969\\-139.1146\\41\\-18.26345\\-141.0678\\41\\-17.85435\\-141.3534\\41\\-15.90123\\-141.407\\41\\-15.58528\\-141.0678\\41\\-15.08551\\-139.1146\\41\\-13.9481\\-137.6929\\41\\-13.67643\\-137.1615\\41\\-11.99498\\-136.0653\\41\\-10.04185\\-135.9164\\41\\-6.135601\\-136.0958\\41\\-4.182476\\-136.2806\\41\\-2.229351\\-136.6044\\41\\-0.276226\\-136.1623\\41\\3.630024\\-135.7857\\41\\7.536274\\-135.8645\\41\\9.489399\\-134.9575\\41\\11.44252\\-133.1602\\41\\12.6423\\-131.3021\\41\\13.34347\\-129.349\\41\\13.69258\\-127.3959\\41\\13.32804\\-125.4428\\41\\14.62398\\-123.4896\\41\\15.34877\\-122.9341\\41\\17.3019\\-122.3557\\41\\21.20815\\-122.1062\\41\\29.02065\\-122.1062\\41\\30.97377\\-122.7623\\41\\32.9269\\-123.8667\\41\\36.83315\\-123.9605\\41\\38.78627\\-124.725\\41\\40.7394\\-125.8774\\41\\42.69252\\-126.6647\\41\\44.64565\\-127.7527\\41\\46.59877\\-128.685\\41\\47.26665\\-129.349\\41\\48.02994\\-131.3021\\41\\47.63543\\-133.2553\\41\\46.12793\\-135.2084\\41\\46.39933\\-137.1615\\41\\47.3312\\-139.1146\\41\\47.8219\\-141.0678\\41\\47.64636\\-143.0209\\41\\46.59877\\-144.0437\\41\\44.64565\\-144.3658\\41\\40.7394\\-143.1017\\41\\38.78627\\-143.0875\\41\\36.83315\\-142.4229\\41\\34.88002\\-141.9993\\41\\32.9269\\-142.267\\41\\30.97377\\-143.5748\\41\\29.02065\\-144.3003\\41\\28.32078\\-144.974\\41\\26.79699\\-146.9271\\41\\26.10546\\-148.8803\\41\\24.24038\\-150.8334\\41\\21.0442\\-154.7396\\41\\20.34291\\-158.6459\\41\\19.25502\\-159.8321\\41\\17.3019\\-159.6431\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "488" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-214.2952\\41\\44.64565\\-212.9367\\41\\42.69252\\-212.3614\\41\\39.79034\\-209.4271\\41\\38.51204\\-207.474\\41\\37.74236\\-205.5209\\41\\37.22753\\-203.5678\\41\\36.83315\\-202.9762\\41\\34.88002\\-202.4524\\41\\33.66491\\-201.6146\\41\\33.89344\\-199.6615\\41\\34.88002\\-198.6216\\41\\36.83315\\-197.1459\\41\\37.93178\\-195.7553\\41\\38.14048\\-193.8021\\41\\38.78627\\-191.8955\\41\\39.73936\\-189.8959\\41\\42.69252\\-186.9705\\41\\44.64565\\-185.8152\\41\\46.59877\\-185.129\\41\\48.5519\\-184.589\\41\\50.50502\\-184.1981\\41\\52.45815\\-184.1851\\41\\54.41127\\-184.6279\\41\\58.31752\\-185.1293\\41\\60.27065\\-186.4203\\41\\62.22377\\-187.5895\\41\\62.62869\\-187.9428\\41\\68.08315\\-193.3744\\41\\68.46372\\-193.8021\\41\\69.53943\\-195.7553\\41\\70.07565\\-197.7084\\41\\72.16468\\-199.6615\\41\\73.94253\\-200.7228\\41\\74.86742\\-201.6146\\41\\75.82928\\-203.5678\\41\\73.94253\\-204.4592\\41\\71.9894\\-203.8222\\41\\70.03628\\-205.1665\\41\\69.74331\\-205.5209\\41\\69.27498\\-207.474\\41\\68.08315\\-209.608\\41\\67.3276\\-211.3803\\41\\66.13003\\-212.7266\\41\\64.1769\\-214.0095\\41\\62.22377\\-214.6942\\41\\60.27065\\-214.9504\\41\\58.31752\\-215.0047\\41\\48.5519\\-214.9935\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "489" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "66.13003\\-147.5927\\41\\64.54681\\-146.9271\\41\\62.22377\\-145.6477\\41\\60.6584\\-144.974\\41\\57.28056\\-143.0209\\41\\56.3644\\-142.4324\\41\\54.41127\\-141.7246\\41\\52.45815\\-141.7014\\41\\51.54052\\-141.0678\\41\\49.99747\\-139.1146\\41\\49.96373\\-137.1615\\41\\50.45308\\-133.2553\\41\\50.82156\\-131.3021\\41\\51.68437\\-129.349\\41\\52.21066\\-127.3959\\41\\52.15419\\-125.4428\\41\\51.81244\\-123.4896\\41\\50.91396\\-121.5365\\41\\48.5519\\-119.2536\\41\\46.59877\\-117.1791\\41\\45.36922\\-115.6771\\41\\43.90137\\-113.724\\41\\43.8919\\-111.7709\\41\\44.10743\\-109.8178\\41\\45.16609\\-107.8646\\41\\46.39648\\-105.9115\\41\\48.5519\\-103.8345\\41\\50.50502\\-103.0345\\41\\52.45815\\-102.4127\\41\\54.41127\\-102.4825\\41\\56.97808\\-105.9115\\41\\57.59661\\-107.8646\\41\\56.9417\\-109.8178\\41\\56.94815\\-111.7709\\41\\57.96543\\-113.724\\41\\60.27065\\-115.8387\\41\\62.22377\\-118.0532\\41\\63.09523\\-119.5834\\41\\64.89782\\-121.5365\\41\\65.5918\\-123.4896\\41\\66.86636\\-125.4428\\41\\67.54493\\-127.3959\\41\\68.76225\\-129.349\\41\\70.73031\\-131.3021\\41\\72.96028\\-133.2553\\41\\73.33659\\-135.2084\\41\\73.59179\\-137.1615\\41\\73.64391\\-139.1146\\41\\73.57011\\-141.0678\\41\\73.88508\\-143.0209\\41\\72.88416\\-144.974\\41\\71.9894\\-146.5276\\41\\70.03628\\-148.5547\\41\\68.08315\\-147.6265\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "28" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "490" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "95.4269\\-184.7606\\41\\94.74016\\-184.0365\\41\\93.79929\\-182.0834\\41\\92.37144\\-180.1303\\41\\91.26156\\-178.1771\\41\\90.91822\\-176.224\\41\\89.56753\\-173.7673\\41\\89.01199\\-172.3178\\41\\89.46431\\-170.3646\\41\\91.52065\\-168.7194\\41\\91.78768\\-168.4115\\41\\92.70487\\-166.4584\\41\\93.92633\\-164.5053\\41\\95.4269\\-163.6136\\41\\97.38003\\-163.5382\\41\\98.62683\\-164.5053\\41\\99.55851\\-166.4584\\41\\101.3839\\-168.4115\\41\\102.4208\\-170.3646\\41\\102.7629\\-172.3178\\41\\103.9361\\-174.2709\\41\\104.6002\\-176.224\\41\\104.6152\\-182.0834\\41\\104.0379\\-184.0365\\41\\103.2394\\-184.7823\\41\\101.2863\\-185.6748\\41\\99.33315\\-185.8026\\41\\97.38003\\-185.5729\\41" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "491" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-194.4879\\43\\-107.6981\\-193.2232\\43\\-108.7962\\-191.849\\43\\-109.0088\\-189.8959\\43\\-109.4155\\-187.9428\\43\\-109.7042\\-185.9896\\43\\-109.7474\\-184.0365\\43\\-109.1019\\-180.1303\\43\\-109.0176\\-178.1771\\43\\-108.3513\\-176.224\\43\\-107.3833\\-174.2709\\43\\-106.0396\\-172.3178\\43\\-104.4407\\-170.3646\\43\\-103.3759\\-168.4115\\43\\-102.1309\\-166.4584\\43\\-99.8856\\-164.2321\\43\\-97.21531\\-160.599\\43\\-95.97935\\-159.4581\\43\\-94.02622\\-159.5899\\43\\-90.09472\\-160.599\\43\\-89.49017\\-162.5521\\43\\-89.53288\\-164.5053\\43\\-89.89618\\-166.4584\\43\\-90.87879\\-168.4115\\43\\-91.42809\\-170.3646\\43\\-91.80257\\-172.3178\\43\\-92.80552\\-174.2709\\43\\-93.39327\\-176.224\\43\\-94.43784\\-178.1771\\43\\-95.97935\\-181.5273\\43\\-97.29986\\-184.0365\\43\\-97.32363\\-185.9896\\43\\-97.68328\\-187.9428\\43\\-99.02762\\-189.8959\\43\\-99.29609\\-191.849\\43\\-99.32498\\-193.8021\\43\\-99.8856\\-194.5229\\43\\-101.8387\\-195.2634\\43\\-103.7918\\-195.306\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "80" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "492" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-19.80748\\-211.8939\\43\\-23.71373\\-210.2666\\43\\-25.66685\\-209.262\\43\\-27.61998\\-208.7417\\43\\-31.52623\\-208.7813\\43\\-37.3856\\-208.7405\\43\\-39.33873\\-208.4171\\43\\-41.29185\\-208.2002\\43\\-43.24498\\-207.6734\\43\\-45.1981\\-207.0393\\43\\-47.15123\\-206.8935\\43\\-49.10435\\-206.1161\\43\\-51.05748\\-204.3672\\43\\-52.08218\\-203.5678\\43\\-53.29243\\-201.6146\\43\\-53.51591\\-199.6615\\43\\-54.96373\\-198.2052\\43\\-56.91685\\-198.5667\\43\\-58.86998\\-197.861\\43\\-58.97848\\-197.7084\\43\\-58.46823\\-195.7553\\43\\-56.91685\\-194.0531\\43\\-54.96373\\-193.3862\\43\\-53.53256\\-191.849\\43\\-53.69356\\-189.8959\\43\\-54.08385\\-187.9428\\43\\-53.0106\\-187.0083\\43\\-51.05748\\-185.1115\\43\\-50.16908\\-184.0365\\43\\-48.22615\\-182.0834\\43\\-47.15123\\-181.2045\\43\\-45.1981\\-180.1074\\43\\-43.24498\\-179.6035\\43\\-35.43248\\-179.6035\\43\\-33.47935\\-180.0489\\43\\-31.52623\\-181.152\\43\\-29.5731\\-181.5621\\43\\-27.61998\\-182.6718\\43\\-25.66685\\-183.4087\\43\\-24.56822\\-184.0365\\43\\-23.71373\\-184.7097\\43\\-21.7606\\-185.6967\\43\\-19.80748\\-186.2266\\43\\-17.85435\\-185.51\\43\\-15.90123\\-185.2395\\43\\-13.9481\\-185.2337\\43\\-11.99498\\-185.42\\43\\-8.088726\\-186.2283\\43\\-6.135601\\-186.8537\\43\\-4.182476\\-187.3731\\43\\-2.229351\\-188.5364\\43\\-0.276226\\-189.3186\\43\\0.7382613\\-189.8959\\43\\1.676899\\-190.6228\\43\\2.893958\\-191.849\\43\\5.583149\\-195.8204\\43\\6.241761\\-197.7084\\43\\7.536274\\-198.6907\\43\\9.489399\\-199.1202\\43\\11.44252\\-199.9213\\43\\13.39565\\-200.2444\\43\\15.29627\\-201.6146\\43\\13.39565\\-202.4727\\43\\11.44252\\-202.4935\\43\\9.489399\\-202.2742\\43\\7.536274\\-202.7598\\43\\6.401883\\-203.5678\\43\\6.081674\\-205.5209\\43\\5.583149\\-206.9467\\43\\5.157872\\-207.474\\43\\3.010283\\-209.4271\\43\\1.676899\\-209.8716\\43\\-0.276226\\-209.9154\\43\\-2.229351\\-210.3174\\43\\-4.182476\\-211.2033\\43\\-6.135601\\-212.3464\\43\\-8.088726\\-212.6992\\43\\-10.04185\\-212.7452\\43\\-15.90123\\-212.6695\\43\\-17.85435\\-212.3517\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "493" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-8.088726\\-115.9009\\43\\-8.442864\\-115.6771\\43\\-8.885774\\-113.724\\43\\-8.612305\\-111.7709\\43\\-8.658387\\-109.8178\\43\\-10.60451\\-107.8646\\43\\-10.92204\\-105.9115\\43\\-10.04185\\-105.1382\\43\\-8.134359\\-103.9584\\43\\-6.771652\\-102.0053\\43\\-6.135601\\-101.4399\\43\\-4.182476\\-101.0201\\43\\-2.229351\\-101.0929\\43\\-0.9128458\\-102.0053\\43\\-0.8029779\\-103.9584\\43\\0.471678\\-107.8646\\43\\0.1650356\\-113.724\\43\\-0.276226\\-114.1406\\43\\-2.229351\\-114.946\\43\\-4.182476\\-115.2063\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "194" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "494" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "19.25502\\-159.0523\\43\\18.16453\\-158.6459\\43\\17.3019\\-158.0147\\43\\15.34877\\-156.8684\\43\\13.39565\\-154.7821\\43\\11.44252\\-153.7988\\43\\9.489399\\-153.3184\\43\\8.543839\\-152.7865\\43\\7.536274\\-151.7947\\43\\5.306456\\-150.8334\\43\\3.630024\\-149.6067\\43\\1.098933\\-148.8803\\43\\-0.276226\\-147.9936\\43\\-2.229351\\-147.4407\\43\\-6.135601\\-147.3408\\43\\-8.088726\\-147.4451\\43\\-10.04185\\-147.9037\\43\\-11.3386\\-148.8803\\43\\-11.99498\\-149.1955\\43\\-13.9481\\-150.9651\\43\\-15.90123\\-151.7323\\43\\-17.32851\\-152.7865\\43\\-19.80748\\-153.6308\\43\\-21.7606\\-153.3606\\43\\-23.71373\\-153.2025\\43\\-25.66685\\-151.5565\\43\\-27.89235\\-148.8803\\43\\-29.00289\\-146.9271\\43\\-31.52623\\-144.3546\\43\\-33.47935\\-143.4758\\43\\-35.43248\\-142.3102\\43\\-37.3856\\-141.7478\\43\\-39.33873\\-141.0754\\43\\-41.29185\\-141.0905\\43\\-43.24498\\-140.124\\43\\-45.1981\\-140.2877\\43\\-47.15123\\-141.0905\\43\\-51.05748\\-142.2859\\43\\-53.0106\\-143.4052\\43\\-54.96373\\-143.473\\43\\-56.91685\\-142.2771\\43\\-58.03359\\-141.0678\\43\\-58.0953\\-139.1146\\43\\-58.32066\\-137.1615\\43\\-58.86998\\-136.5457\\43\\-60.8231\\-136.3767\\43\\-61.59843\\-137.1615\\43\\-62.55243\\-139.1146\\43\\-64.72935\\-140.8045\\43\\-66.68247\\-142.6577\\43\\-67.2607\\-143.0209\\43\\-70.58872\\-144.5883\\43\\-71.17717\\-144.974\\43\\-74.49497\\-146.5547\\43\\-76.4481\\-148.3145\\43\\-78.40122\\-147.9037\\43\\-78.61293\\-146.9271\\43\\-79.30737\\-144.974\\43\\-80.35435\\-143.8686\\43\\-82.30747\\-143.5551\\43\\-82.91701\\-143.0209\\43\\-83.42673\\-141.0678\\43\\-82.96777\\-139.1146\\43\\-79.67747\\-135.2084\\43\\-79.02602\\-133.2553\\43\\-78.1655\\-131.3021\\43\\-79.36459\\-129.349\\43\\-79.03571\\-127.3959\\43\\-78.40122\\-126.7888\\43\\-76.4481\\-126.676\\43\\-74.49497\\-125.4195\\43\\-73.22186\\-123.4896\\43\\-71.72642\\-121.5365\\43\\-70.92481\\-119.5834\\43\\-70.40173\\-117.6303\\43\\-69.30265\\-115.6771\\43\\-66.16879\\-111.7709\\43\\-65.45092\\-109.8178\\43\\-65.92403\\-107.8646\\43\\-66.28574\\-105.9115\\43\\-66.17421\\-103.9584\\43\\-66.17716\\-102.0053\\43\\-65.65111\\-100.0521\\43\\-62.77623\\-97.57404\\43\\-60.8231\\-96.50734\\43\\-60.45928\\-96.14588\\43\\-57.59208\\-94.19276\\43\\-56.91685\\-93.54705\\43\\-54.96373\\-93.03987\\43\\-53.0106\\-91.66756\\43\\-51.05748\\-89.79212\\43\\-49.10435\\-89.16714\\43\\-47.39712\\-90.28651\\43\\-46.05853\\-92.23963\\43\\-44.25538\\-94.19276\\43\\-43.24498\\-95.58121\\43\\-41.23967\\-98.09901\\43\\-40.35285\\-100.0521\\43\\-40.04125\\-102.0053\\43\\-40.26556\\-103.9584\\43\\-40.24619\\-105.9115\\43\\-41.29185\\-107.1855\\43\\-43.24498\\-109.2181\\43\\-45.1981\\-110.5679\\43\\-47.15123\\-111.6167\\43\\-49.10435\\-112.9269\\43\\-51.05748\\-114.7668\\43\\-53.0106\\-116.0542\\43\\-54.96373\\-116.425\\43\\-56.80753\\-117.6303\\43\\-58.06003\\-119.5834\\43\\-59.67232\\-121.5365\\43\\-60.50829\\-123.4896\\43\\-61.06724\\-125.4428\\43\\-60.9051\\-127.3959\\43\\-60.16354\\-129.349\\43\\-59.80547\\-131.3021\\43\\-58.86998\\-132.5773\\43\\-56.91685\\-132.9532\\43\\-55.70261\\-131.3021\\43\\-55.00129\\-129.349\\43\\-53.0106\\-127.1368\\43\\-51.05748\\-126.331\\43\\-49.10435\\-125.9481\\43\\-47.15123\\-125.0484\\43\\-45.1981\\-124.4759\\43\\-43.24498\\-124.3167\\43\\-41.29185\\-122.7036\\43\\-39.33873\\-122.0161\\43\\-37.3856\\-122.0585\\43\\-35.43248\\-121.0745\\43\\-33.47935\\-120.5177\\43\\-31.52623\\-120.345\\43\\-29.5731\\-120.3393\\43\\-27.61998\\-120.4579\\43\\-25.88783\\-121.5365\\43\\-23.71373\\-123.6281\\43\\-21.7606\\-124.6626\\43\\-20.96261\\-125.4428\\43\\-19.99717\\-127.3959\\43\\-20.0432\\-129.349\\43\\-20.45335\\-131.3021\\43\\-17.85435\\-134.7543\\43\\-15.90123\\-136.1669\\43\\-13.9481\\-136.0536\\43\\-10.04185\\-136.0001\\43\\-2.229351\\-136.0421\\43\\1.676899\\-135.9577\\43\\3.630024\\-136.0001\\43\\7.536274\\-135.9323\\43\\9.489399\\-135.4675\\43\\9.777928\\-135.2084\\43\\11.14956\\-133.2553\\43\\11.94784\\-131.3021\\43\\12.98346\\-129.349\\43\\14.30322\\-127.3959\\43\\15.32534\\-125.4428\\43\\17.39531\\-123.4896\\43\\19.25502\\-122.5598\\43\\21.20815\\-122.1062\\43\\27.06752\\-122.1062\\43\\29.02065\\-122.2435\\43\\30.97377\\-122.8993\\43\\32.9269\\-123.9692\\43\\34.88002\\-123.9779\\43\\36.83315\\-124.1389\\43\\38.78627\\-124.8324\\43\\40.7394\\-125.8867\\43\\42.69252\\-126.6898\\43\\44.64565\\-127.8023\\43\\46.59877\\-128.6704\\43\\47.2891\\-129.349\\43\\48.09892\\-131.3021\\43\\47.75336\\-133.2553\\43\\46.78514\\-135.2084\\43\\47.88905\\-139.1146\\43\\47.73647\\-141.0678\\43\\46.59877\\-142.4552\\43\\44.64565\\-143.5296\\43\\42.69252\\-142.3822\\43\\40.7394\\-141.8622\\43\\38.78627\\-141.6701\\43\\36.83315\\-141.6185\\43\\34.88002\\-141.2032\\43\\32.9269\\-141.6581\\43\\30.97377\\-142.2426\\43\\29.02065\\-143.9375\\43\\28.17592\\-144.974\\43\\26.90358\\-146.9271\\43\\26.1409\\-148.8803\\43\\24.52206\\-150.8334\\43\\24.05646\\-154.7396\\43\\23.64956\\-156.6928\\43\\23.16127\\-157.181\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "495" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-215.5135\\43\\50.50502\\-215.0047\\43\\48.5519\\-214.9935\\43\\46.59877\\-214.2901\\43\\44.64565\\-212.8251\\43\\42.69252\\-212.1018\\43\\41.96692\\-211.3803\\43\\40.43341\\-209.4271\\43\\39.71168\\-207.474\\43\\38.56248\\-205.5209\\43\\37.94441\\-203.5678\\43\\37.43587\\-201.6146\\43\\36.83315\\-201.1232\\43\\36.27813\\-201.6146\\43\\34.4615\\-203.5678\\43\\32.9269\\-204.5443\\43\\32.00459\\-203.5678\\43\\33.72326\\-201.6146\\43\\34.3773\\-199.6615\\43\\34.88002\\-199.0368\\43\\36.83315\\-197.6276\\43\\38.53879\\-195.7553\\43\\38.92171\\-193.8021\\43\\39.6033\\-191.849\\43\\40.03327\\-189.8959\\43\\41.70704\\-187.9428\\43\\42.69252\\-186.9878\\43\\44.64565\\-185.8152\\43\\46.59877\\-185.0396\\43\\48.5519\\-184.0741\\43\\50.50502\\-183.9699\\43\\52.45815\\-183.6571\\43\\54.41127\\-183.7528\\43\\58.31752\\-184.6961\\43\\60.27065\\-185.1048\\43\\62.22377\\-186.4633\\43\\64.1769\\-187.7021\\43\\68.30907\\-191.849\\43\\70.74702\\-195.7553\\43\\71.19564\\-197.7084\\43\\72.83647\\-199.6615\\43\\73.94253\\-200.6675\\43\\75.27924\\-201.6146\\43\\76.82227\\-203.5678\\43\\75.89565\\-204.3594\\43\\73.94253\\-204.2539\\43\\71.9894\\-204.6426\\43\\71.25441\\-205.5209\\43\\70.70129\\-207.474\\43\\68.72341\\-211.3803\\43\\66.87964\\-213.3334\\43\\66.13003\\-213.9746\\43\\64.1769\\-214.7016\\43\\62.22377\\-215.178\\43\\60.27065\\-215.5135\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "496" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "66.13003\\-145.6189\\43\\64.5525\\-144.974\\43\\60.44298\\-143.0209\\43\\58.31752\\-141.8883\\43\\56.52899\\-141.0678\\43\\54.41127\\-139.6833\\43\\52.45815\\-139.6751\\43\\51.58105\\-139.1146\\43\\50.77876\\-137.1615\\43\\50.79663\\-135.2084\\43\\51.3351\\-133.2553\\43\\52.03278\\-129.349\\43\\52.27115\\-127.3959\\43\\52.25871\\-125.4428\\43\\51.9408\\-123.4896\\43\\51.04129\\-121.5365\\43\\49.24214\\-119.5834\\43\\45.38562\\-115.6771\\43\\44.1488\\-113.724\\43\\43.67801\\-111.7709\\43\\43.88451\\-109.8178\\43\\44.40993\\-107.8646\\43\\45.87786\\-105.9115\\43\\48.5519\\-103.2505\\43\\50.50502\\-102.4761\\43\\52.45815\\-100.8989\\43\\54.41127\\-100.8561\\43\\55.60885\\-102.0053\\43\\57.15471\\-105.9115\\43\\57.498\\-107.8646\\43\\56.82291\\-109.8178\\43\\57.25367\\-111.7709\\43\\60.66503\\-115.6771\\43\\62.22377\\-117.8372\\43\\63.14366\\-119.5834\\43\\64.91827\\-121.5365\\43\\66.13003\\-123.5007\\43\\67.00642\\-125.4428\\43\\67.72633\\-127.3959\\43\\68.99652\\-129.349\\43\\70.87568\\-131.3021\\43\\72.04158\\-133.2553\\43\\72.53561\\-135.2084\\43\\72.58174\\-137.1615\\43\\72.28237\\-139.1146\\43\\72.1764\\-141.0678\\43\\72.5667\\-143.0209\\43\\71.9894\\-145.1525\\43\\70.03628\\-146.5578\\43\\68.08315\\-145.6438\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "26" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "497" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "97.38003\\-184.7331\\43\\96.71868\\-184.0365\\43\\95.4269\\-181.6607\\43\\94.72458\\-180.1303\\43\\94.38332\\-178.1771\\43\\93.17884\\-176.224\\43\\92.71176\\-174.2709\\43\\91.39858\\-172.3178\\43\\91.97321\\-170.3646\\43\\92.85948\\-168.4115\\43\\95.34613\\-164.5053\\43\\97.38003\\-163.111\\43\\99.33315\\-163.1719\\43\\100.4515\\-164.5053\\43\\101.5116\\-166.4584\\43\\103.8579\\-170.3646\\43\\104.6788\\-172.3178\\43\\105.25\\-174.2709\\43\\106.3926\\-176.224\\43\\106.6155\\-178.1771\\43\\106.6125\\-182.0834\\43\\105.6127\\-184.0365\\43\\105.1925\\-184.5058\\43\\103.2394\\-185.4677\\43\\101.2863\\-185.8026\\43\\99.33315\\-185.559\\43" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "498" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-107.6981\\-193.6405\\45\\-109.2259\\-191.849\\45\\-109.4395\\-189.8959\\45\\-110.4094\\-187.9428\\45\\-110.9665\\-185.9896\\45\\-111.0106\\-184.0365\\45\\-110.9665\\-180.1303\\45\\-110.7768\\-178.1771\\45\\-107.9631\\-172.3178\\45\\-105.745\\-169.9131\\45\\-104.0229\\-166.4584\\45\\-99.8856\\-162.2889\\45\\-98.686\\-160.599\\45\\-97.93247\\-159.8215\\45\\-95.97935\\-158.8816\\45\\-94.02622\\-159.9799\\45\\-93.48493\\-160.599\\45\\-92.18545\\-162.5521\\45\\-91.47792\\-164.5053\\45\\-91.4838\\-166.4584\\45\\-92.63226\\-168.4115\\45\\-93.36121\\-170.3646\\45\\-93.40793\\-172.3178\\45\\-94.5423\\-174.2709\\45\\-95.32631\\-176.224\\45\\-96.41067\\-178.1771\\45\\-97.93247\\-181.5052\\45\\-99.27966\\-184.0365\\45\\-99.28329\\-185.9896\\45\\-99.53455\\-187.9428\\45\\-101.243\\-189.8959\\45\\-101.3129\\-191.849\\45\\-101.8387\\-193.3812\\45\\-102.5363\\-193.8021\\45\\-103.7918\\-194.0951\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "72" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "499" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-15.90123\\-211.7371\\45\\-17.85435\\-211.0866\\45\\-19.80748\\-210.2498\\45\\-21.7606\\-209.9212\\45\\-23.71373\\-208.4107\\45\\-25.66685\\-208.0061\\45\\-27.31254\\-207.474\\45\\-27.61998\\-207.2062\\45\\-29.5731\\-207.4137\\45\\-31.52623\\-208.0051\\45\\-33.47935\\-208.0134\\45\\-37.3856\\-208.2076\\45\\-41.29185\\-207.1485\\45\\-43.24498\\-206.9199\\45\\-45.1981\\-206.8247\\45\\-47.15123\\-206.3143\\45\\-48.10772\\-205.5209\\45\\-50.11579\\-203.5678\\45\\-51.54576\\-201.6146\\45\\-52.08683\\-199.6615\\45\\-53.0106\\-198.6443\\45\\-54.96373\\-198.1109\\45\\-56.91685\\-199.3631\\45\\-58.16658\\-197.7084\\45\\-57.86994\\-195.7553\\45\\-56.91685\\-194.66\\45\\-53.0106\\-192.8196\\45\\-52.14077\\-191.849\\45\\-51.66306\\-189.8959\\45\\-51.05748\\-188.1475\\45\\-50.01292\\-185.9896\\45\\-49.10435\\-184.9418\\45\\-47.15123\\-183.0195\\45\\-45.1981\\-181.5262\\45\\-33.47935\\-181.5262\\45\\-31.52623\\-182.8972\\45\\-29.5731\\-183.5192\\45\\-27.61998\\-183.7641\\45\\-25.66685\\-185.2712\\45\\-23.71373\\-186.6534\\45\\-21.7606\\-187.5268\\45\\-19.80748\\-187.3654\\45\\-15.90123\\-186.2756\\45\\-13.9481\\-186.2534\\45\\-11.99498\\-186.8806\\45\\-10.04185\\-187.3654\\45\\-6.135601\\-187.8207\\45\\-4.182476\\-188.9436\\45\\-2.229351\\-189.7738\\45\\-0.276226\\-191.0724\\45\\0.6721664\\-191.849\\45\\1.676899\\-192.9153\\45\\2.200478\\-193.8021\\45\\2.241\\-195.7553\\45\\3.669086\\-197.7084\\45\\5.583149\\-199.1158\\45\\9.489399\\-199.9518\\45\\11.44252\\-200.6623\\45\\13.00702\\-201.6146\\45\\11.44252\\-202.6576\\45\\9.489399\\-202.6633\\45\\7.536274\\-201.9816\\45\\5.583149\\-202.04\\45\\3.630024\\-202.745\\45\\2.517828\\-203.5678\\45\\2.193171\\-205.5209\\45\\-0.276226\\-207.773\\45\\-2.229351\\-208.6875\\45\\-4.182476\\-210.145\\45\\-7.093383\\-211.3803\\45\\-8.088726\\-211.7164\\45\\-10.04185\\-211.777\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "500" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-4.182476\\-116.1025\\45\\-5.049175\\-115.6771\\45\\-6.135601\\-114.8494\\45\\-6.810824\\-113.724\\45\\-6.791893\\-109.8178\\45\\-8.088726\\-107.8725\\45\\-10.04185\\-108.1004\\45\\-10.38365\\-107.8646\\45\\-11.4759\\-105.9115\\45\\-10.04185\\-104.8911\\45\\-8.088726\\-105.1368\\45\\-6.82617\\-103.9584\\45\\-4.95974\\-102.0053\\45\\-4.182476\\-101.3775\\45\\-2.229351\\-101.5706\\45\\-1.794662\\-102.0053\\45\\-1.444714\\-105.9115\\45\\-0.5883233\\-107.8646\\45\\-1.179212\\-109.8178\\45\\-1.629614\\-111.7709\\45\\-1.65969\\-113.724\\45\\-2.229351\\-114.6235\\45\\-3.467673\\-115.6771\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "204" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "501" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "21.20815\\-156.9285\\45\\19.07551\\-154.7396\\45\\18.4107\\-152.7865\\45\\17.3019\\-151.6891\\45\\16.0049\\-150.8334\\45\\15.34877\\-150.2159\\45\\13.39565\\-149.807\\45\\11.44252\\-149.5044\\45\\10.62066\\-148.8803\\45\\9.489399\\-147.749\\45\\8.286387\\-146.9271\\45\\7.536274\\-146.2277\\45\\5.583149\\-145.5889\\45\\4.344226\\-144.974\\45\\3.630024\\-144.3\\45\\1.676899\\-143.8003\\45\\-2.229351\\-143.5372\\45\\-3.676756\\-143.0209\\45\\-4.182476\\-142.5152\\45\\-6.135601\\-142.3358\\45\\-6.985572\\-143.0209\\45\\-8.088726\\-143.4261\\45\\-11.99498\\-143.7013\\45\\-13.9481\\-145.1392\\45\\-15.90123\\-146.0132\\45\\-16.81519\\-146.9271\\45\\-19.80748\\-149.0157\\45\\-21.7606\\-149.5897\\45\\-23.71373\\-149.6912\\45\\-25.66685\\-149.4817\\45\\-26.41743\\-148.8803\\45\\-28.92963\\-144.974\\45\\-30.9579\\-143.0209\\45\\-31.52623\\-142.5764\\45\\-33.47935\\-141.825\\45\\-35.43248\\-141.5648\\45\\-37.3856\\-140.223\\45\\-39.33873\\-139.5667\\45\\-41.29185\\-138.4059\\45\\-43.24498\\-137.9418\\45\\-47.15123\\-139.6718\\45\\-49.10435\\-139.9965\\45\\-51.05748\\-141.4721\\45\\-53.0106\\-141.6781\\45\\-54.96373\\-141.6781\\45\\-56.91685\\-141.5291\\45\\-57.38978\\-141.0678\\45\\-58.18987\\-139.1146\\45\\-58.40523\\-137.1615\\45\\-58.86998\\-136.3579\\45\\-60.8231\\-134.8791\\45\\-61.07596\\-135.2084\\45\\-64.99965\\-139.1146\\45\\-67.09955\\-141.0678\\45\\-68.6356\\-141.848\\45\\-70.58872\\-142.7021\\45\\-72.54185\\-143.8096\\45\\-74.49497\\-144.6208\\45\\-75.0741\\-144.974\\45\\-76.4481\\-146.144\\45\\-78.40122\\-144.9226\\45\\-79.71039\\-143.0209\\45\\-80.35435\\-142.3906\\45\\-82.30747\\-141.6781\\45\\-82.96478\\-141.0678\\45\\-83.43052\\-139.1146\\45\\-82.30747\\-137.1692\\45\\-80.93367\\-135.2084\\45\\-79.14829\\-133.2553\\45\\-78.1655\\-131.3021\\45\\-79.3591\\-129.349\\45\\-78.62853\\-127.3959\\45\\-78.40122\\-127.2076\\45\\-76.4481\\-127.0682\\45\\-73.23506\\-123.4896\\45\\-71.94047\\-121.5365\\45\\-71.11068\\-119.5834\\45\\-70.40173\\-117.6303\\45\\-69.26653\\-115.6771\\45\\-67.33904\\-113.724\\45\\-66.27608\\-111.7709\\45\\-66.00639\\-109.8178\\45\\-66.23859\\-105.9115\\45\\-65.75264\\-103.9584\\45\\-65.77203\\-102.0053\\45\\-65.2294\\-100.0521\\45\\-64.72935\\-99.55508\\45\\-62.77623\\-98.5429\\45\\-60.8231\\-97.17764\\45\\-58.86998\\-95.21644\\45\\-57.31399\\-94.19276\\45\\-56.91685\\-93.80843\\45\\-54.96373\\-93.09525\\45\\-53.67736\\-92.23963\\45\\-51.05748\\-89.77094\\45\\-49.10435\\-89.01598\\45\\-47.15123\\-90.06866\\45\\-46.95179\\-90.28651\\45\\-46.45971\\-92.23963\\45\\-45.07603\\-94.19276\\45\\-44.13579\\-96.14588\\45\\-42.34317\\-98.09901\\45\\-40.74253\\-100.0521\\45\\-40.36744\\-102.0053\\45\\-40.93503\\-103.9584\\45\\-40.93503\\-105.9115\\45\\-42.21386\\-107.8646\\45\\-43.24498\\-108.9315\\45\\-45.1981\\-110.2974\\45\\-47.15123\\-111.1605\\45\\-47.89968\\-111.7709\\45\\-51.05748\\-113.8325\\45\\-54.96373\\-115.3581\\45\\-56.91685\\-116.8557\\45\\-57.6764\\-117.6303\\45\\-58.51316\\-119.5834\\45\\-59.6921\\-121.5365\\45\\-61.35936\\-123.4896\\45\\-61.94991\\-125.4428\\45\\-61.72136\\-127.3959\\45\\-60.46628\\-129.349\\45\\-59.92792\\-133.2553\\45\\-58.86998\\-134.4258\\45\\-56.91685\\-132.2201\\45\\-56.2034\\-131.3021\\45\\-55.37523\\-129.349\\45\\-54.96373\\-128.9323\\45\\-52.65938\\-127.3959\\45\\-51.05748\\-126.4873\\45\\-49.10435\\-125.6666\\45\\-47.15123\\-124.6281\\45\\-45.1981\\-124.0438\\45\\-43.24498\\-123.9949\\45\\-41.29185\\-122.7247\\45\\-39.33873\\-122.1062\\45\\-37.3856\\-122.1062\\45\\-35.43248\\-120.9516\\45\\-33.47935\\-120.4665\\45\\-29.5731\\-120.266\\45\\-27.61998\\-120.2976\\45\\-25.66685\\-121.2305\\45\\-25.36289\\-121.5365\\45\\-24.57761\\-123.4896\\45\\-21.7606\\-126.0399\\45\\-20.01571\\-127.3959\\45\\-18.88915\\-129.349\\45\\-20.07985\\-131.3021\\45\\-19.71202\\-133.2553\\45\\-18.29298\\-135.2084\\45\\-17.85435\\-135.5445\\45\\-15.90123\\-136.0501\\45\\-11.99498\\-136.502\\45\\-8.088726\\-136.7085\\45\\-2.229351\\-136.7058\\45\\1.676899\\-136.5668\\45\\3.630024\\-136.6968\\45\\5.583149\\-136.6335\\45\\7.536274\\-136.1171\\45\\9.489399\\-135.8369\\45\\10.43471\\-135.2084\\45\\11.52329\\-133.2553\\45\\11.55103\\-131.3021\\45\\15.34877\\-126.8614\\45\\16.43666\\-125.4428\\45\\19.25502\\-122.6506\\45\\21.20815\\-122.1062\\45\\27.06752\\-122.1062\\45\\29.02065\\-122.5087\\45\\30.97377\\-123.1857\\45\\32.9269\\-123.9692\\45\\34.88002\\-123.9865\\45\\36.83315\\-124.3893\\45\\38.78627\\-124.9808\\45\\40.7394\\-125.7246\\45\\42.69252\\-126.8166\\45\\44.64565\\-128.0951\\45\\46.59877\\-128.8546\\45\\47.11578\\-129.349\\45\\48.28136\\-131.3021\\45\\48.49972\\-133.2553\\45\\48.16496\\-135.2084\\45\\48.00258\\-139.1146\\45\\47.0111\\-141.0678\\45\\46.59877\\-141.4269\\45\\44.64565\\-141.6745\\45\\42.69252\\-141.6266\\45\\40.7394\\-140.3492\\45\\38.78627\\-139.6833\\45\\34.88002\\-140.0315\\45\\32.9269\\-140.358\\45\\30.97377\\-141.8556\\45\\29.02065\\-142.5677\\45\\28.5873\\-143.0209\\45\\28.61241\\-144.974\\45\\29.81039\\-146.9271\\45\\29.02065\\-148.493\\45\\27.06752\\-147.6544\\45\\26.09096\\-148.8803\\45\\25.1144\\-149.8248\\45\\24.72746\\-150.8334\\45\\24.4935\\-152.7865\\45\\24.04409\\-154.7396\\45\\23.99256\\-156.6928\\45\\23.16127\\-157.427\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "502" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-215.9207\\45\\50.50502\\-215.0047\\45\\48.5519\\-214.8372\\45\\46.59877\\-214.1221\\45\\43.3231\\-211.3803\\45\\41.68402\\-209.4271\\45\\40.46703\\-207.474\\45\\39.0681\\-203.5678\\45\\38.78627\\-201.5375\\45\\36.83315\\-201.0018\\45\\36.21601\\-201.6146\\45\\35.55959\\-203.5678\\45\\34.88002\\-204.258\\45\\32.9269\\-203.8568\\45\\32.67941\\-203.5678\\45\\33.91328\\-201.6146\\45\\34.88002\\-199.8657\\45\\36.83315\\-198.0005\\45\\38.98571\\-195.7553\\45\\39.61297\\-193.8021\\45\\40.01437\\-191.849\\45\\40.7394\\-190.0319\\45\\41.91025\\-187.9428\\45\\42.69252\\-187.1804\\45\\48.5519\\-183.9843\\45\\50.50502\\-183.6571\\45\\52.45815\\-183.101\\45\\54.41127\\-183.1062\\45\\56.3644\\-183.56\\45\\58.31752\\-183.7217\\45\\60.27065\\-184.6893\\45\\62.22377\\-185.1974\\45\\64.1769\\-186.8732\\45\\68.08315\\-190.7646\\45\\69.07529\\-191.849\\45\\70.60012\\-193.8021\\45\\71.41974\\-195.7553\\45\\71.90863\\-197.7084\\45\\73.03907\\-199.6615\\45\\73.94253\\-200.5797\\45\\75.79136\\-201.6146\\45\\77.7138\\-203.5678\\45\\75.89565\\-204.5486\\45\\73.94253\\-204.4386\\45\\72.70015\\-205.5209\\45\\71.82781\\-207.474\\45\\71.23319\\-209.4271\\45\\70.03628\\-211.2649\\45\\68.08315\\-213.6367\\45\\66.13003\\-214.6722\\45\\64.1769\\-215.1918\\45\\62.22377\\-216.0287\\45\\60.27065\\-216.3782\\45\\54.41127\\-216.3782\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "503" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "64.1769\\-143.5634\\45\\62.22377\\-142.3225\\45\\60.27065\\-141.6537\\45\\59.28469\\-141.0678\\45\\56.3644\\-139.03\\45\\54.41127\\-137.9231\\45\\52.45815\\-137.3732\\45\\52.24645\\-137.1615\\45\\51.73831\\-135.2084\\45\\52.19906\\-131.3021\\45\\52.27115\\-127.3959\\45\\52.22243\\-125.4428\\45\\51.49609\\-123.4896\\45\\50.50502\\-121.546\\45\\49.26167\\-119.5834\\45\\45.38562\\-115.6771\\45\\44.22028\\-113.724\\45\\43.46481\\-111.7709\\45\\43.69739\\-109.8178\\45\\44.19267\\-107.8646\\45\\45.83041\\-105.9115\\45\\47.64286\\-103.9584\\45\\49.8559\\-102.0053\\45\\51.43245\\-100.0521\\45\\52.45815\\-99.13592\\45\\54.41127\\-99.95739\\45\\56.0475\\-102.0053\\45\\56.82637\\-103.9584\\45\\57.35518\\-105.9115\\45\\57.59136\\-107.8646\\45\\57.45612\\-109.8178\\45\\58.23676\\-111.7709\\45\\59.45841\\-113.724\\45\\60.99567\\-115.6771\\45\\62.78886\\-117.6303\\45\\63.48785\\-119.5834\\45\\65.13301\\-121.5365\\45\\67.3111\\-123.4896\\45\\67.3814\\-125.4428\\45\\68.08315\\-126.7986\\45\\69.92776\\-129.349\\45\\71.45118\\-131.3021\\45\\72.01211\\-133.2553\\45\\71.7656\\-135.2084\\45\\71.73031\\-141.0678\\45\\71.59226\\-143.0209\\45\\70.03628\\-144.6645\\45\\68.08315\\-143.8329\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "29" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "504" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "103.2394\\-186.801\\45\\101.2863\\-185.6641\\45\\99.33315\\-184.7233\\45\\98.68011\\-184.0365\\45\\97.38003\\-181.6087\\45\\96.73096\\-180.1303\\45\\96.69461\\-178.1771\\45\\95.81587\\-176.224\\45\\94.78951\\-174.2709\\45\\94.66057\\-172.3178\\45\\93.94154\\-170.3646\\45\\93.73463\\-168.4115\\45\\94.4656\\-166.4584\\45\\96.58867\\-162.5521\\45\\97.38003\\-161.6638\\45\\99.33315\\-161.1647\\45\\100.6795\\-162.5521\\45\\101.2863\\-163.5195\\45\\103.2394\\-166.2719\\45\\104.6872\\-168.4115\\45\\105.3773\\-170.3646\\45\\106.6488\\-172.3178\\45\\106.7991\\-174.2709\\45\\107.783\\-176.224\\45\\108.3724\\-178.1771\\45\\108.5686\\-180.1303\\45\\108.1032\\-184.0365\\45\\106.852\\-185.9896\\45\\105.1925\\-187.1037\\45" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "505" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-107.6981\\-193.4594\\47\\-109.2771\\-191.849\\47\\-110.3932\\-189.8959\\47\\-111.8693\\-187.9428\\47\\-112.7316\\-185.9896\\47\\-112.9007\\-184.0365\\47\\-112.8809\\-180.1303\\47\\-112.2886\\-178.1771\\47\\-109.402\\-172.3178\\47\\-108.1002\\-170.3646\\47\\-106.6366\\-168.4115\\47\\-104.1508\\-164.5053\\47\\-97.93247\\-158.3658\\47\\-95.97935\\-157.8775\\47\\-95.13842\\-158.6459\\47\\-94.00352\\-160.599\\47\\-93.88979\\-162.5521\\47\\-93.42306\\-164.5053\\47\\-93.40008\\-166.4584\\47\\-94.53714\\-168.4115\\47\\-95.18623\\-170.3646\\47\\-95.32639\\-172.3178\\47\\-96.53851\\-174.2709\\47\\-97.30341\\-176.224\\47\\-97.93247\\-177.4594\\47\\-98.60181\\-178.1771\\47\\-99.2599\\-180.1303\\47\\-101.2749\\-184.0365\\47\\-101.2865\\-185.9896\\47\\-101.8387\\-187.3539\\47\\-103.2745\\-189.8959\\47\\-103.7384\\-191.849\\47\\-105.745\\-193.123\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "506" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-76.4481\\-143.8496\\47\\-78.40122\\-142.6997\\47\\-80.35435\\-140.7509\\47\\-82.30747\\-140.0478\\47\\-83.33669\\-139.1146\\47\\-83.18783\\-137.1615\\47\\-81.35689\\-135.2084\\47\\-79.37778\\-133.2553\\47\\-78.46781\\-131.3021\\47\\-79.30908\\-129.349\\47\\-78.40122\\-128.103\\47\\-76.4481\\-127.3283\\47\\-75.15118\\-125.4428\\47\\-73.39697\\-123.4896\\47\\-72.54185\\-121.5926\\47\\-71.25157\\-119.5834\\47\\-70.58872\\-117.964\\47\\-69.26653\\-115.6771\\47\\-67.30135\\-113.724\\47\\-66.28574\\-111.7709\\47\\-66.2571\\-107.8646\\47\\-66.04043\\-105.9115\\47\\-65.32206\\-103.9584\\47\\-64.99021\\-102.0053\\47\\-64.55496\\-100.0521\\47\\-62.77623\\-98.87749\\47\\-60.8231\\-97.33577\\47\\-58.86998\\-95.40253\\47\\-56.91685\\-94.81421\\47\\-53.59175\\-92.23963\\47\\-51.05748\\-90.05299\\47\\-49.10435\\-89.25027\\47\\-47.43896\\-90.28651\\47\\-46.71654\\-92.23963\\47\\-46.20884\\-94.19276\\47\\-43.24498\\-98.18665\\47\\-42.29395\\-100.0521\\47\\-41.53416\\-102.0053\\47\\-42.42813\\-103.9584\\47\\-42.55833\\-105.9115\\47\\-43.42324\\-107.8646\\47\\-45.44624\\-109.8178\\47\\-49.10435\\-112.2846\\47\\-51.05748\\-112.9269\\47\\-53.0106\\-114.3164\\47\\-54.96373\\-114.9396\\47\\-57.70455\\-117.6303\\47\\-58.59944\\-119.5834\\47\\-59.69734\\-121.5365\\47\\-61.44702\\-123.4896\\47\\-62.08011\\-125.4428\\47\\-61.88967\\-127.3959\\47\\-60.53013\\-129.349\\47\\-60.43616\\-131.3021\\47\\-61.40904\\-133.2553\\47\\-62.77623\\-135.1693\\47\\-65.05196\\-137.1615\\47\\-67.05083\\-139.1146\\47\\-68.6356\\-140.2509\\47\\-70.58872\\-141.5255\\47\\-72.54185\\-142.1964\\47\\-74.49497\\-143.395\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "60" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "507" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-25.66685\\-145.6612\\47\\-26.66442\\-144.974\\47\\-29.5731\\-142.1391\\47\\-31.52623\\-141.5199\\47\\-33.47935\\-140.3341\\47\\-35.43248\\-139.856\\47\\-37.3856\\-138.687\\47\\-39.33873\\-137.9929\\47\\-41.29185\\-137.6411\\47\\-43.24498\\-136.5313\\47\\-45.1981\\-136.9453\\47\\-47.15123\\-137.6873\\47\\-49.10435\\-137.7813\\47\\-51.05748\\-139.4833\\47\\-53.0106\\-139.7098\\47\\-54.96373\\-139.7017\\47\\-56.91685\\-139.1685\\47\\-57.85025\\-137.1615\\47\\-58.34553\\-135.2084\\47\\-56.91685\\-132.4669\\47\\-56.20071\\-131.3021\\47\\-54.4022\\-129.349\\47\\-53.0106\\-128.4512\\47\\-51.05748\\-126.6999\\47\\-49.10435\\-125.1498\\47\\-47.15123\\-124.3034\\47\\-45.1981\\-123.6766\\47\\-43.24498\\-123.9516\\47\\-41.29185\\-122.7247\\47\\-39.33873\\-122.1062\\47\\-37.3856\\-122.1062\\47\\-35.43248\\-121.9726\\47\\-33.47935\\-121.266\\47\\-29.5731\\-120.3599\\47\\-27.61998\\-120.266\\47\\-25.66685\\-120.8768\\47\\-25.0141\\-121.5365\\47\\-24.15652\\-123.4896\\47\\-22.59674\\-125.4428\\47\\-21.7606\\-126.1161\\47\\-19.80748\\-126.8154\\47\\-19.21038\\-127.3959\\47\\-18.71789\\-129.349\\47\\-20.5833\\-131.3021\\47\\-21.27232\\-133.2553\\47\\-20.57225\\-135.2084\\47\\-19.80748\\-135.9216\\47\\-17.85435\\-136.5551\\47\\-15.90123\\-136.8024\\47\\-14.92466\\-137.1615\\47\\-13.9481\\-137.8752\\47\\-11.99498\\-138.3641\\47\\-10.04185\\-139.0508\\47\\-10.04185\\-139.1711\\47\\-11.99498\\-140.1585\\47\\-12.90419\\-141.0678\\47\\-13.9481\\-141.6354\\47\\-17.85435\\-141.6941\\47\\-21.7606\\-145.4753\\47\\-23.71373\\-145.7345\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "73" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "508" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-209.8483\\47\\-19.80748\\-208.3471\\47\\-21.7606\\-208.028\\47\\-23.71373\\-206.3036\\47\\-25.2791\\-205.5209\\47\\-25.66685\\-205.1273\\47\\-27.61998\\-204.0977\\47\\-29.5731\\-204.635\\47\\-31.52623\\-206.083\\47\\-33.47935\\-206.1557\\47\\-37.3856\\-206.8891\\47\\-41.29185\\-206.8213\\47\\-45.1981\\-206.1414\\47\\-46.02387\\-205.5209\\47\\-48.10716\\-203.5678\\47\\-49.80493\\-201.6146\\47\\-50.89785\\-199.6615\\47\\-53.0106\\-198.2965\\47\\-54.96373\\-198.9807\\47\\-55.6643\\-199.6615\\47\\-56.94449\\-201.6146\\47\\-57.78545\\-199.6615\\47\\-57.11629\\-195.7553\\47\\-54.96373\\-194.0666\\47\\-53.0106\\-193.4029\\47\\-51.05748\\-191.9711\\47\\-49.89523\\-189.8959\\47\\-49.41447\\-187.9428\\47\\-47.98944\\-185.9896\\47\\-45.96725\\-184.0365\\47\\-45.1981\\-183.5161\\47\\-33.47935\\-183.5075\\47\\-31.52623\\-184.8562\\47\\-29.5731\\-185.5102\\47\\-27.73353\\-185.9896\\47\\-25.66685\\-187.4757\\47\\-24.79249\\-187.9428\\47\\-23.71373\\-188.8705\\47\\-21.7606\\-189.4721\\47\\-19.80748\\-188.8771\\47\\-17.85435\\-187.719\\47\\-15.90123\\-187.5509\\47\\-13.9481\\-187.5509\\47\\-11.99498\\-187.8762\\47\\-10.04185\\-189.1245\\47\\-8.088726\\-189.4721\\47\\-6.135601\\-189.5321\\47\\-5.456771\\-189.8959\\47\\-4.182476\\-190.8817\\47\\-2.473492\\-191.849\\47\\-2.229351\\-192.1106\\47\\-1.566927\\-193.8021\\47\\-0.1243163\\-195.7553\\47\\0.7170299\\-197.7084\\47\\1.676899\\-198.4059\\47\\3.630024\\-199.1761\\47\\7.536274\\-200.1392\\47\\9.489399\\-200.8574\\47\\10.43933\\-201.6146\\47\\9.489399\\-203.1074\\47\\7.536274\\-202.3037\\47\\5.583149\\-202.0306\\47\\3.630024\\-201.9917\\47\\1.676899\\-202.175\\47\\-0.276226\\-202.5912\\47\\-1.496929\\-203.5678\\47\\-1.790516\\-205.5209\\47\\-2.229351\\-206.3366\\47\\-3.257858\\-207.474\\47\\-6.135601\\-209.0681\\47\\-6.556533\\-209.4271\\47\\-8.088726\\-209.9468\\47\\-15.90123\\-209.9468\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "65" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "509" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "23.16127\\-152.901\\47\\20.96401\\-150.8334\\47\\19.05063\\-148.8803\\47\\18.21407\\-146.9271\\47\\17.3019\\-146.0048\\47\\15.34877\\-145.4073\\47\\13.39565\\-145.6051\\47\\11.44252\\-145.1953\\47\\9.489399\\-143.4354\\47\\7.536274\\-141.8474\\47\\5.583149\\-141.4921\\47\\5.17024\\-141.0678\\47\\5.078031\\-139.1146\\47\\7.536274\\-136.797\\47\\9.489399\\-136.3545\\47\\11.44252\\-135.6573\\47\\11.96275\\-135.2084\\47\\12.22988\\-133.2553\\47\\11.67825\\-131.3021\\47\\12.83855\\-129.349\\47\\15.34877\\-126.7548\\47\\16.47439\\-125.4428\\47\\19.25502\\-122.6758\\47\\21.20815\\-122.2751\\47\\23.16127\\-122.3167\\47\\27.06752\\-122.1062\\47\\29.02065\\-122.3807\\47\\30.97377\\-122.8156\\47\\32.9269\\-123.7254\\47\\38.78627\\-124.4569\\47\\40.7394\\-125.0558\\47\\42.69252\\-127.4543\\47\\44.64565\\-129.11\\47\\46.59877\\-129.7508\\47\\48.5519\\-130.6532\\47\\49.1728\\-131.3021\\47\\49.66733\\-133.2553\\47\\49.50647\\-135.2084\\47\\48.96784\\-137.1615\\47\\47.3033\\-139.1146\\47\\46.59877\\-139.6948\\47\\42.69252\\-139.6819\\47\\41.23519\\-139.1146\\47\\40.7394\\-138.6791\\47\\38.78627\\-137.8648\\47\\36.83315\\-138.3654\\47\\34.88002\\-139.289\\47\\32.9269\\-139.9603\\47\\31.43636\\-141.0678\\47\\30.97377\\-141.7749\\47\\29.02065\\-142.5728\\47\\28.74665\\-143.0209\\47\\29.02065\\-143.3073\\47\\30.97377\\-143.8179\\47\\31.8826\\-144.974\\47\\31.82555\\-146.9271\\47\\30.77292\\-148.8803\\47\\29.02065\\-150.608\\47\\26.429\\-148.8803\\47\\25.89806\\-146.9271\\47\\25.1144\\-146.1133\\47\\24.42444\\-146.9271\\47\\24.19062\\-148.8803\\47\\24.10265\\-150.8334\\47\\23.30924\\-152.7865\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "510" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-216.2108\\47\\50.50502\\-215.0047\\47\\48.5519\\-214.4702\\47\\46.59877\\-213.2095\\47\\44.64565\\-212.1013\\47\\43.93287\\-211.3803\\47\\42.3334\\-209.4271\\47\\41.62048\\-207.474\\47\\40.16655\\-205.5209\\47\\39.59429\\-201.6146\\47\\38.78627\\-200.7634\\47\\36.83315\\-201.7928\\47\\34.88002\\-204.0038\\47\\34.26643\\-203.5678\\47\\34.40636\\-201.6146\\47\\35.65787\\-199.6615\\47\\39.5113\\-195.7553\\47\\40.0397\\-193.8021\\47\\40.46886\\-191.849\\47\\41.5119\\-189.8959\\47\\42.69252\\-188.394\\47\\44.64565\\-186.7758\\47\\46.59877\\-185.0266\\47\\48.5519\\-183.9843\\47\\50.50502\\-183.1549\\47\\52.45815\\-182.6937\\47\\54.41127\\-182.6937\\47\\58.31752\\-183.168\\47\\60.27065\\-184.0741\\47\\62.22377\\-184.6754\\47\\64.1769\\-185.6078\\47\\68.42428\\-189.8959\\47\\69.62734\\-191.849\\47\\71.05507\\-193.8021\\47\\72.76297\\-197.7084\\47\\73.46886\\-199.6615\\47\\73.94253\\-200.2347\\47\\75.90582\\-201.6146\\47\\77.84878\\-202.7451\\47\\78.57467\\-203.5678\\47\\77.84878\\-204.3219\\47\\75.89565\\-204.461\\47\\73.94253\\-204.8491\\47\\73.40123\\-205.5209\\47\\73.08862\\-207.474\\47\\72.60586\\-209.4271\\47\\70.9954\\-211.3803\\47\\69.51961\\-213.3334\\47\\68.08315\\-214.6689\\47\\66.13003\\-215.1644\\47\\64.1769\\-216.0303\\47\\62.22377\\-216.6903\\47\\60.27065\\-216.9467\\47\\54.41127\\-216.9578\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "511" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "70.03628\\-143.473\\47\\68.08315\\-142.2359\\47\\66.13003\\-141.7169\\47\\64.1769\\-141.7014\\47\\62.61153\\-141.0678\\47\\58.62204\\-139.1146\\47\\55.16314\\-137.1615\\47\\54.41127\\-136.5632\\47\\53.12011\\-135.2084\\47\\52.40729\\-133.2553\\47\\52.24551\\-131.3021\\47\\52.27115\\-127.3959\\47\\52.21066\\-125.4428\\47\\51.42149\\-123.4896\\47\\50.50502\\-121.7202\\47\\49.26167\\-119.5834\\47\\47.33366\\-117.6303\\47\\45.52406\\-115.6771\\47\\43.41724\\-111.7709\\47\\42.95518\\-109.8178\\47\\43.70257\\-107.8646\\47\\45.556\\-105.9115\\47\\46.89243\\-103.9584\\47\\49.26977\\-102.0053\\47\\49.97402\\-100.0521\\47\\50.50502\\-99.13857\\47\\52.45815\\-98.405\\47\\54.41127\\-99.36954\\47\\55.14236\\-100.0521\\47\\56.1406\\-102.0053\\47\\56.60012\\-103.9584\\47\\57.27555\\-107.8646\\47\\58.02456\\-109.8178\\47\\59.93456\\-113.724\\47\\61.01999\\-115.6771\\47\\62.99649\\-117.6303\\47\\64.3886\\-119.5834\\47\\65.405\\-121.5365\\47\\67.13726\\-123.4896\\47\\67.55302\\-125.4428\\47\\68.79072\\-127.3959\\47\\70.90366\\-129.349\\47\\72.56421\\-131.3021\\47\\72.79778\\-133.2553\\47\\72.01211\\-135.2084\\47\\71.69643\\-137.1615\\47\\71.69643\\-139.1146\\47\\71.55471\\-141.0678\\47\\70.62694\\-143.0209\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "512" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "103.2394\\-186.8877\\47\\102.2004\\-185.9896\\47\\100.6372\\-184.0365\\47\\98.68015\\-180.1303\\47\\98.65614\\-178.1771\\47\\97.84389\\-176.224\\47\\96.7155\\-174.2709\\47\\96.5698\\-172.3178\\47\\95.89539\\-170.3646\\47\\94.84547\\-168.4115\\47\\95.29047\\-166.4584\\47\\95.79388\\-162.5521\\47\\96.83815\\-160.599\\47\\97.38003\\-160.0571\\47\\99.33315\\-159.2952\\47\\101.2863\\-160.4272\\47\\102.6407\\-162.5521\\47\\103.2394\\-164.0099\\47\\105.1925\\-166.1021\\47\\106.6369\\-168.4115\\47\\107.1457\\-169.9287\\47\\108.5698\\-172.3178\\47\\108.6164\\-174.2709\\47\\108.8379\\-176.224\\47\\109.7439\\-178.1771\\47\\110.1784\\-180.1303\\47\\109.7518\\-182.0834\\47\\109.0322\\-184.0365\\47\\108.8264\\-185.9896\\47\\107.1457\\-187.5836\\47\\105.1925\\-187.4808\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "513" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "105.1925\\-215.8586\\47\\104.6238\\-215.2865\\47\\103.8021\\-213.3334\\47\\105.1925\\-212.1985\\47\\107.1457\\-213.0497\\47\\107.4638\\-213.3334\\47\\108.4325\\-215.2865\\47\\107.1457\\-216.7147\\47" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "514" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-107.6981\\-192.7657\\49\\-109.6512\\-191.517\\49\\-111.7427\\-189.8959\\49\\-113.3151\\-187.9428\\49\\-114.2883\\-185.9896\\49\\-114.8534\\-184.0365\\49\\-114.8699\\-180.1303\\49\\-114.0833\\-178.1771\\49\\-113.5575\\-177.4836\\49\\-112.1609\\-174.2709\\49\\-111.6043\\-173.4984\\49\\-110.235\\-170.3646\\49\\-109.6512\\-169.6187\\49\\-109.0304\\-168.4115\\49\\-107.5059\\-166.4584\\49\\-106.1647\\-164.5053\\49\\-99.8856\\-158.2404\\49\\-97.93247\\-157.204\\49\\-95.97935\\-157.7282\\49\\-95.07976\\-158.6459\\49\\-94.74091\\-160.599\\49\\-95.0753\\-162.5521\\49\\-95.35411\\-166.4584\\49\\-95.80115\\-168.4115\\49\\-97.03729\\-170.3646\\49\\-97.34274\\-172.3178\\49\\-97.93247\\-173.3738\\49\\-98.7197\\-174.2709\\49\\-99.70734\\-176.224\\49\\-101.2202\\-178.1771\\49\\-101.2921\\-180.1303\\49\\-102.3393\\-182.0834\\49\\-103.2723\\-184.0365\\49\\-103.2941\\-185.9896\\49\\-105.0553\\-189.8959\\49\\-105.4688\\-191.849\\49\\-105.745\\-192.1855\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "515" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-78.40122\\-142.1184\\49\\-80.35435\\-140.2002\\49\\-82.30747\\-139.7907\\49\\-83.06953\\-139.1146\\49\\-83.51861\\-137.1615\\49\\-82.40513\\-135.2084\\49\\-80.35435\\-133.1459\\49\\-79.01884\\-131.3021\\49\\-79.27824\\-129.349\\49\\-78.88211\\-127.3959\\49\\-78.40122\\-126.9941\\49\\-76.4481\\-126.8121\\49\\-75.18461\\-125.4428\\49\\-73.87556\\-123.4896\\49\\-73.0387\\-121.5365\\49\\-71.2617\\-119.5834\\49\\-70.58872\\-117.9598\\49\\-69.26653\\-115.6771\\49\\-67.51719\\-113.724\\49\\-66.45868\\-111.7709\\49\\-66.06252\\-107.8646\\49\\-65.53515\\-105.9115\\49\\-64.63461\\-103.9584\\49\\-64.0873\\-100.0521\\49\\-59.31657\\-96.14588\\49\\-58.86998\\-95.69655\\49\\-56.91685\\-95.10168\\49\\-55.67448\\-94.19276\\49\\-53.0106\\-91.67579\\49\\-51.05748\\-90.84844\\49\\-49.10435\\-90.53241\\49\\-47.32011\\-92.23963\\49\\-46.06306\\-96.14588\\49\\-44.70061\\-98.09901\\49\\-43.94741\\-100.0521\\49\\-42.55888\\-102.0053\\49\\-42.97444\\-103.9584\\49\\-43.85459\\-105.9115\\49\\-44.62002\\-107.8646\\49\\-46.28237\\-109.8178\\49\\-47.15123\\-110.4635\\49\\-49.4586\\-111.7709\\49\\-53.0106\\-113.4139\\49\\-54.96373\\-114.9295\\49\\-57.59642\\-117.6303\\49\\-58.2952\\-119.5834\\49\\-59.56609\\-121.5365\\49\\-60.45928\\-123.4896\\49\\-61.67207\\-125.4428\\49\\-61.75249\\-127.3959\\49\\-60.53013\\-129.349\\49\\-60.78554\\-131.3021\\49\\-61.85934\\-133.2553\\49\\-62.77623\\-134.1983\\49\\-64.72935\\-135.7954\\49\\-66.68247\\-137.0631\\49\\-68.6356\\-138.7416\\49\\-70.58872\\-139.8842\\49\\-72.54185\\-140.7916\\49\\-74.49497\\-141.8921\\49\\-76.4481\\-142.3896\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "516" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-139.5426\\49\\-35.43248\\-138.2376\\49\\-37.3856\\-137.5869\\49\\-39.33873\\-137.3485\\49\\-41.29185\\-136.4411\\49\\-43.24498\\-135.7889\\49\\-45.1981\\-135.5722\\49\\-47.15123\\-135.722\\49\\-49.10435\\-135.7405\\49\\-51.63068\\-137.1615\\49\\-53.0106\\-137.5933\\49\\-54.96373\\-137.5933\\49\\-55.82152\\-137.1615\\49\\-56.91685\\-135.895\\49\\-57.21785\\-135.2084\\49\\-55.58171\\-133.2553\\49\\-54.17079\\-131.3021\\49\\-53.0106\\-129.5161\\49\\-51.05748\\-127.2672\\49\\-47.15123\\-124.2394\\49\\-45.1981\\-123.0457\\49\\-43.24498\\-123.9516\\49\\-41.29185\\-122.6816\\49\\-39.33873\\-121.862\\49\\-37.3856\\-122.2563\\49\\-35.43248\\-122.8481\\49\\-33.47935\\-123.2472\\49\\-31.52623\\-122.7229\\49\\-30.62337\\-121.5365\\49\\-29.5731\\-120.7015\\49\\-27.61998\\-119.9993\\49\\-25.66685\\-120.6642\\49\\-24.90942\\-121.5365\\49\\-21.99189\\-125.4428\\49\\-19.80748\\-126.6269\\49\\-18.94704\\-127.3959\\49\\-18.56223\\-129.349\\49\\-19.80748\\-130.5027\\49\\-21.7606\\-131.9874\\49\\-23.71373\\-132.4356\\49\\-25.62616\\-133.2553\\49\\-26.60585\\-135.2084\\49\\-26.03794\\-137.1615\\49\\-27.61998\\-138.2451\\49\\-28.6118\\-139.1146\\49\\-29.5731\\-139.5573\\49\\-31.52623\\-139.6736\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "73" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "517" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-17.85435\\-207.8735\\49\\-19.80748\\-206.1795\\49\\-21.07555\\-205.5209\\49\\-23.71373\\-202.9727\\49\\-24.61908\\-201.6146\\49\\-25.66685\\-200.891\\49\\-27.61998\\-201.5501\\49\\-29.5731\\-202.4986\\49\\-30.81334\\-203.5678\\49\\-31.52623\\-204.0218\\49\\-33.47935\\-204.3502\\49\\-35.43248\\-205.3678\\49\\-37.3856\\-206.0179\\49\\-41.29185\\-206.0092\\49\\-42.73926\\-205.5209\\49\\-45.1981\\-204.1915\\49\\-45.9654\\-203.5678\\49\\-47.54883\\-201.6146\\49\\-48.61103\\-199.6615\\49\\-49.10435\\-199.266\\49\\-51.05748\\-198.3201\\49\\-53.0106\\-198.7026\\49\\-54.96373\\-200.5094\\49\\-56.92615\\-201.6146\\49\\-57.61212\\-199.6615\\49\\-56.43499\\-197.7084\\49\\-55.74857\\-195.7553\\49\\-54.96373\\-194.9136\\49\\-53.0106\\-194.2235\\49\\-51.05748\\-194.3934\\49\\-49.89862\\-193.8021\\49\\-47.70438\\-189.8959\\49\\-47.15123\\-188.7495\\49\\-45.1981\\-186.4779\\49\\-44.52791\\-185.9896\\49\\-43.24498\\-185.562\\49\\-33.47935\\-185.5521\\49\\-31.52623\\-186.8469\\49\\-29.5731\\-187.5508\\49\\-28.87892\\-187.9428\\49\\-27.61998\\-188.9672\\49\\-26.06708\\-189.8959\\49\\-24.64322\\-191.849\\49\\-23.71373\\-192.7257\\49\\-21.7606\\-191.8407\\49\\-19.80748\\-190.8156\\49\\-17.85435\\-189.5959\\49\\-13.9481\\-189.5704\\49\\-12.67314\\-189.8959\\49\\-10.04185\\-191.385\\49\\-8.088726\\-191.5096\\49\\-6.949403\\-191.849\\49\\-6.135601\\-192.3517\\49\\-4.618173\\-193.8021\\49\\-4.182476\\-194.3801\\49\\-3.704584\\-195.7553\\49\\-2.075633\\-197.7084\\49\\-0.276226\\-198.7646\\49\\1.676899\\-199.2404\\49\\3.630024\\-200.0097\\49\\5.583149\\-200.3442\\49\\7.447495\\-201.6146\\49\\5.583149\\-202.3623\\49\\3.630024\\-202.5238\\49\\1.676899\\-201.9507\\49\\-0.276226\\-201.6522\\49\\-4.182476\\-202.5257\\49\\-5.643147\\-203.5678\\49\\-7.312952\\-205.5209\\49\\-8.088726\\-206.8179\\49\\-8.777122\\-207.474\\49\\-10.04185\\-207.9502\\49\\-15.90123\\-207.9502\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "58" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "518" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "29.02065\\-151.0925\\49\\27.06752\\-149.6321\\49\\26.50701\\-148.8803\\49\\25.81283\\-146.9271\\49\\25.1144\\-145.5303\\49\\23.16127\\-144.795\\49\\21.20815\\-145.5115\\49\\20.72997\\-144.974\\49\\20.54343\\-143.0209\\49\\19.25502\\-141.7325\\49\\17.3019\\-141.5285\\49\\15.34877\\-141.8236\\49\\13.39565\\-141.5998\\49\\12.72479\\-141.0678\\49\\10.79391\\-139.1146\\49\\11.89557\\-137.1615\\49\\13.39565\\-136.0675\\49\\15.23852\\-135.2084\\49\\14.0159\\-133.2553\\49\\13.39565\\-132.9153\\49\\11.87276\\-131.3021\\49\\12.3599\\-129.349\\49\\16.24631\\-125.4428\\49\\19.25502\\-122.8438\\49\\23.16127\\-122.907\\49\\25.1144\\-122.2585\\49\\27.06752\\-122.1062\\49\\29.02065\\-122.1289\\49\\30.97377\\-122.4777\\49\\32.9269\\-123.1431\\49\\34.88002\\-123.9692\\49\\36.83315\\-124.0033\\49\\38.78627\\-124.1872\\49\\40.7394\\-125.0962\\49\\41.09045\\-125.4428\\49\\42.02181\\-127.3959\\49\\43.44625\\-129.349\\49\\44.64565\\-130.2426\\49\\48.5519\\-130.3089\\49\\49.5395\\-131.3021\\49\\49.34536\\-133.2553\\49\\48.5519\\-135.6605\\49\\47.48539\\-137.1615\\49\\46.59877\\-137.6137\\49\\44.64565\\-137.4538\\49\\42.69252\\-136.0774\\49\\40.7394\\-135.8187\\49\\38.78627\\-136.3126\\49\\36.83315\\-137.5285\\49\\34.88002\\-137.8435\\49\\32.9269\\-138.5803\\49\\32.38228\\-139.1146\\49\\31.43105\\-141.0678\\49\\32.34472\\-143.0209\\49\\32.7399\\-144.974\\49\\32.52768\\-146.9271\\49\\31.76458\\-148.8803\\49\\30.97377\\-149.7675\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "519" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-216.0486\\49\\50.50502\\-214.8252\\49\\48.5519\\-214.1224\\49\\46.59877\\-212.5212\\49\\44.64565\\-210.7497\\49\\41.76899\\-207.474\\49\\41.03633\\-205.5209\\49\\40.77696\\-203.5678\\49\\40.06931\\-201.6146\\49\\38.78627\\-200.5473\\49\\36.83315\\-202.3244\\49\\35.26843\\-201.6146\\49\\35.8815\\-199.6615\\49\\36.83315\\-198.6423\\49\\39.72965\\-195.7553\\49\\40.46886\\-193.8021\\49\\40.5277\\-191.849\\49\\41.68372\\-189.8959\\49\\46.59877\\-185.0312\\49\\48.5519\\-183.9699\\49\\50.50502\\-183.1204\\49\\52.45815\\-182.5019\\49\\54.41127\\-182.2704\\49\\56.3644\\-182.3652\\49\\60.27065\\-183.9843\\49\\62.22377\\-184.0441\\49\\64.1769\\-185.0872\\49\\66.13003\\-187.0563\\49\\67.12793\\-187.9428\\49\\69.08541\\-189.8959\\49\\70.6245\\-191.849\\49\\71.62558\\-193.8021\\49\\72.75146\\-195.7553\\49\\73.37891\\-197.7084\\49\\73.71873\\-199.6615\\49\\75.89565\\-201.607\\49\\77.84878\\-202.1121\\49\\79.05422\\-203.5678\\49\\77.84878\\-204.5784\\49\\75.89565\\-204.2341\\49\\73.96542\\-205.5209\\49\\73.35217\\-209.4271\\49\\72.02847\\-211.3803\\49\\70.03628\\-213.7981\\49\\68.08315\\-214.9717\\49\\64.1769\\-216.7003\\49\\62.22377\\-216.9805\\49\\56.3644\\-217.0158\\49\\54.41127\\-216.8379\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "520" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "70.03628\\-141.6766\\49\\68.08315\\-140.7073\\49\\66.13003\\-139.8948\\49\\64.1769\\-139.7151\\49\\62.22377\\-139.6343\\49\\60.27065\\-138.3806\\49\\58.31752\\-137.6228\\49\\56.3644\\-136.4859\\49\\54.41127\\-134.9059\\49\\53.20008\\-133.2553\\49\\52.46578\\-131.3021\\49\\51.9911\\-129.349\\49\\51.88334\\-127.3959\\49\\51.87467\\-125.4428\\49\\51.58384\\-123.4896\\49\\50.79799\\-121.5365\\49\\49.26167\\-119.5834\\49\\47.33366\\-117.6303\\49\\45.89625\\-115.6771\\49\\45.12798\\-113.724\\49\\43.20492\\-111.7709\\49\\41.46468\\-109.8178\\49\\42.12882\\-107.8646\\49\\44.00773\\-105.9115\\49\\45.55392\\-103.9584\\49\\47.64268\\-102.0053\\49\\48.91384\\-100.0521\\49\\50.50502\\-98.80192\\49\\52.45815\\-98.65313\\49\\54.41127\\-99.22073\\49\\55.37761\\-100.0521\\49\\55.90664\\-102.0053\\49\\56.25589\\-103.9584\\49\\56.34169\\-105.9115\\49\\56.95144\\-107.8646\\49\\57.80261\\-109.8178\\49\\58.98432\\-111.7709\\49\\61.01999\\-115.6771\\49\\63.00219\\-117.6303\\49\\64.35129\\-119.5834\\49\\65.24184\\-121.5365\\49\\66.8753\\-123.4896\\49\\67.73663\\-125.4428\\49\\68.08315\\-125.9355\\49\\69.55704\\-127.3959\\49\\71.9894\\-129.3881\\49\\73.31861\\-131.3021\\49\\73.304\\-133.2553\\49\\71.70757\\-137.1615\\49\\71.5428\\-139.1146\\49\\70.75101\\-141.0678\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "7" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "521" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "105.1925\\-216.2336\\49\\104.295\\-215.2865\\49\\104.3399\\-213.3334\\49\\105.1925\\-212.7158\\49\\107.1457\\-213.7725\\49\\108.225\\-215.2865\\49\\107.1457\\-216.6964\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "31" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "522" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "107.1457\\-188.964\\49\\106.0493\\-187.9428\\49\\103.6543\\-185.9896\\49\\101.7176\\-182.0834\\49\\100.6615\\-180.1303\\49\\100.5017\\-178.1771\\49\\99.75632\\-176.224\\49\\98.68417\\-174.2709\\49\\98.22166\\-172.3178\\49\\97.09241\\-170.3646\\49\\96.61505\\-168.4115\\49\\96.46631\\-166.4584\\49\\96.19187\\-164.5053\\49\\95.76741\\-162.5521\\49\\96.65315\\-160.599\\49\\99.33315\\-157.9074\\49\\101.2863\\-158.1698\\49\\103.2394\\-160.1416\\49\\104.8143\\-162.5521\\49\\106.5421\\-164.5053\\49\\107.1457\\-165.8424\\49\\107.628\\-166.4584\\49\\108.6041\\-168.4115\\49\\109.0988\\-169.686\\49\\109.5698\\-170.3646\\49\\110.5198\\-172.3178\\49\\110.57\\-176.224\\49\\111.1062\\-180.1303\\49\\110.5829\\-184.0365\\49\\110.403\\-187.9428\\49\\109.0988\\-189.6666\\49" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "523" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-190.8619\\51\\-113.5575\\-189.3638\\51\\-114.7913\\-187.9428\\51\\-115.5106\\-186.3195\\51\\-116.6836\\-184.0365\\51\\-116.8613\\-182.0834\\51\\-116.8701\\-180.1303\\51\\-116.7429\\-178.1771\\51\\-115.5106\\-176.1155\\51\\-114.8302\\-174.2709\\51\\-113.5575\\-172.1783\\51\\-112.8577\\-170.3646\\51\\-111.6043\\-168.4234\\51\\-110.1771\\-166.4584\\51\\-108.2433\\-164.5053\\51\\-100.3447\\-156.6928\\51\\-99.8856\\-156.3064\\51\\-97.93247\\-155.9773\\51\\-97.14082\\-156.6928\\51\\-95.44308\\-158.6459\\51\\-95.32306\\-160.599\\51\\-95.91277\\-162.5521\\51\\-96.88402\\-164.5053\\51\\-97.32611\\-166.4584\\51\\-97.93247\\-168.1764\\51\\-99.2468\\-170.3646\\51\\-99.8856\\-172.2527\\51\\-102.4766\\-176.224\\51\\-103.2838\\-178.1771\\51\\-103.3102\\-180.1303\\51\\-104.3714\\-182.0834\\51\\-105.2533\\-184.0365\\51\\-105.277\\-185.9896\\51\\-105.4688\\-187.9428\\51\\-106.4367\\-189.8959\\51\\-107.6981\\-191.3778\\51\\-109.6512\\-191.5785\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "65" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "524" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-78.40122\\-141.9629\\51\\-80.35435\\-140.3427\\51\\-82.30747\\-139.4402\\51\\-82.66579\\-139.1146\\51\\-83.64299\\-137.1615\\51\\-83.20103\\-135.2084\\51\\-82.30747\\-134.2044\\51\\-79.39937\\-131.3021\\51\\-78.98609\\-129.349\\51\\-78.83146\\-127.3959\\51\\-78.40122\\-126.999\\51\\-76.4481\\-126.6309\\51\\-75.36248\\-125.4428\\51\\-74.49497\\-123.5007\\51\\-73.18433\\-121.5365\\51\\-71.2683\\-119.5834\\51\\-70.58872\\-117.9558\\51\\-69.26653\\-115.6771\\51\\-68.01565\\-113.724\\51\\-67.04868\\-111.7709\\51\\-66.23859\\-109.8178\\51\\-65.64047\\-107.8646\\51\\-64.64858\\-105.9115\\51\\-64.31341\\-103.9584\\51\\-64.24974\\-102.0053\\51\\-63.68409\\-100.0521\\51\\-62.77623\\-99.20791\\51\\-60.8231\\-97.62534\\51\\-58.86998\\-96.82636\\51\\-58.10393\\-96.14588\\51\\-55.59822\\-94.19276\\51\\-54.96373\\-93.56536\\51\\-53.0106\\-92.00779\\51\\-51.05748\\-91.24196\\51\\-49.10435\\-91.6915\\51\\-48.50179\\-92.23963\\51\\-47.41214\\-94.19276\\51\\-46.96423\\-96.14588\\51\\-46.1092\\-98.09901\\51\\-44.70693\\-100.0521\\51\\-43.5982\\-102.0053\\51\\-43.93198\\-103.9584\\51\\-44.50056\\-105.9115\\51\\-45.59503\\-107.8646\\51\\-47.36908\\-109.8178\\51\\-49.96792\\-111.7709\\51\\-51.05748\\-112.447\\51\\-53.0106\\-113.1369\\51\\-55.45796\\-115.6771\\51\\-57.16434\\-117.6303\\51\\-57.83623\\-119.5834\\51\\-58.99205\\-121.5365\\51\\-59.81575\\-123.4896\\51\\-60.81547\\-125.4428\\51\\-61.18456\\-127.3959\\51\\-60.50829\\-129.349\\51\\-61.4505\\-131.3021\\51\\-62.77623\\-133.0864\\51\\-65.23798\\-135.2084\\51\\-66.68247\\-136.2697\\51\\-68.6356\\-137.5483\\51\\-70.58872\\-138.3443\\51\\-72.54185\\-139.6119\\51\\-74.49497\\-140.3684\\51\\-76.4481\\-141.5348\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "525" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-203.9258\\51\\-42.17236\\-203.5678\\51\\-43.24498\\-202.7888\\51\\-45.1981\\-200.9876\\51\\-46.17466\\-199.6615\\51\\-47.15123\\-198.9375\\51\\-49.10435\\-198.4316\\51\\-51.05748\\-198.7086\\51\\-53.0106\\-200.2186\\51\\-54.96373\\-200.6512\\51\\-56.07246\\-199.6615\\51\\-55.27762\\-197.7084\\51\\-53.64584\\-195.7553\\51\\-53.0106\\-195.3132\\51\\-49.10435\\-195.309\\51\\-47.15123\\-194.7241\\51\\-45.91911\\-193.8021\\51\\-45.66774\\-191.849\\51\\-45.1981\\-190.6185\\51\\-43.24498\\-188.4981\\51\\-42.33142\\-187.9428\\51\\-41.29185\\-187.6968\\51\\-33.47935\\-187.6968\\51\\-31.52623\\-189.3121\\51\\-29.18056\\-191.849\\51\\-28.65079\\-193.8021\\51\\-27.61998\\-194.7997\\51\\-25.66685\\-195.1943\\51\\-23.71373\\-195.3577\\51\\-21.7606\\-195.1838\\51\\-19.44657\\-193.8021\\51\\-17.85435\\-193.154\\51\\-13.9481\\-193.1367\\51\\-11.99498\\-193.352\\51\\-10.43775\\-193.8021\\51\\-8.088726\\-195.3544\\51\\-7.674748\\-195.7553\\51\\-4.182476\\-197.9924\\51\\-2.229351\\-199.1703\\51\\-1.00125\\-199.6615\\51\\-2.229351\\-201.4236\\51\\-4.182476\\-201.5906\\51\\-6.135601\\-201.1004\\51\\-8.088726\\-201.4134\\51\\-10.04185\\-202.2101\\51\\-11.99498\\-202.4267\\51\\-13.9481\\-202.4913\\51\\-17.85435\\-202.492\\51\\-19.80748\\-202.2874\\51\\-21.7606\\-201.002\\51\\-25.66685\\-200.4509\\51\\-29.5731\\-200.8257\\51\\-33.47935\\-202.5631\\51\\-35.43248\\-203.9235\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "526" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-137.6432\\51\\-35.43248\\-136.6445\\51\\-37.3856\\-135.9191\\51\\-41.29185\\-135.5467\\51\\-43.24498\\-134.5288\\51\\-45.1981\\-133.9877\\51\\-47.15123\\-133.7674\\51\\-51.05748\\-133.5482\\51\\-51.38971\\-133.2553\\51\\-51.77228\\-131.3021\\51\\-51.05748\\-130.2673\\51\\-50.19095\\-129.349\\51\\-49.32408\\-127.3959\\51\\-47.15123\\-125.0415\\51\\-45.1981\\-123.9182\\51\\-43.24498\\-124.2522\\51\\-41.71978\\-123.4896\\51\\-39.33873\\-122.135\\51\\-37.3856\\-123.0014\\51\\-35.43248\\-124.629\\51\\-33.04158\\-125.4428\\51\\-31.52623\\-126.1403\\51\\-30.54966\\-125.4428\\51\\-29.28237\\-121.5365\\51\\-27.98379\\-119.5834\\51\\-27.61998\\-119.2219\\51\\-25.66685\\-119.5947\\51\\-24.87542\\-121.5365\\51\\-21.7606\\-124.9603\\51\\-19.80748\\-126.7711\\51\\-18.94665\\-127.3959\\51\\-17.93762\\-129.349\\51\\-19.80748\\-130.6671\\51\\-21.7606\\-131.799\\51\\-23.71373\\-131.8241\\51\\-25.66685\\-131.584\\51\\-29.5731\\-129.6777\\51\\-30.89299\\-131.3021\\51\\-31.12047\\-133.2553\\51\\-31.00964\\-135.2084\\51\\-31.47928\\-137.1615\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "527" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "29.02065\\-151.3128\\51\\27.06752\\-150.0977\\51\\26.15898\\-148.8803\\51\\25.19578\\-146.9271\\51\\24.76563\\-144.974\\51\\24.6083\\-143.0209\\51\\25.1144\\-141.243\\51\\27.06752\\-141.3085\\51\\27.43904\\-141.0678\\51\\27.84377\\-139.1146\\51\\27.06752\\-138.5609\\51\\25.1144\\-138.2409\\51\\23.16127\\-138.2507\\51\\21.20815\\-137.3344\\51\\20.0338\\-135.2084\\51\\18.01322\\-133.2553\\51\\17.3019\\-132.7628\\51\\15.34877\\-132.1775\\51\\13.39565\\-131.996\\51\\11.44252\\-131.4891\\51\\11.1707\\-131.3021\\51\\11.25842\\-129.349\\51\\15.34877\\-125.2489\\51\\17.3019\\-124.0517\\51\\19.25502\\-123.2902\\51\\21.20815\\-123.9188\\51\\22.1572\\-123.4896\\51\\24.51625\\-121.5365\\51\\25.1144\\-121.1275\\51\\27.06752\\-122.1062\\51\\29.02065\\-122.1062\\51\\30.97377\\-122.5886\\51\\32.9269\\-123.5844\\51\\34.88002\\-124.1353\\51\\36.83315\\-124.2763\\51\\38.78627\\-124.6388\\51\\40.7394\\-126.4073\\51\\41.52541\\-127.3959\\51\\42.69252\\-129.1423\\51\\44.64565\\-130.8588\\51\\46.59877\\-131.0432\\51\\47.35832\\-131.3021\\51\\46.59877\\-133.2664\\51\\44.64565\\-133.8656\\51\\42.69252\\-133.7873\\51\\40.7394\\-133.9745\\51\\38.78627\\-134.6906\\51\\36.83315\\-135.8809\\51\\34.88002\\-136.4091\\51\\32.9269\\-137.7377\\51\\31.69534\\-139.1146\\51\\32.40057\\-141.0678\\51\\32.80483\\-143.0209\\51\\32.83216\\-146.9271\\51\\31.99167\\-148.8803\\51\\30.97377\\-149.9202\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "528" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-214.465\\51\\46.59877\\-212.3618\\51\\43.75744\\-209.4271\\51\\42.45517\\-207.474\\51\\41.83982\\-205.5209\\51\\41.56874\\-203.5678\\51\\40.7394\\-201.4465\\51\\38.78627\\-200.6139\\51\\36.83315\\-202.5436\\51\\35.71297\\-201.6146\\51\\36.34487\\-199.6615\\51\\36.83315\\-199.0566\\51\\38.78627\\-197.2628\\51\\40.11161\\-195.7553\\51\\40.90099\\-191.849\\51\\41.7715\\-189.8959\\51\\44.64565\\-186.9844\\51\\46.59877\\-185.12\\51\\50.50502\\-183.4714\\51\\52.45815\\-183.0011\\51\\54.41127\\-182.6358\\51\\56.3644\\-182.6627\\51\\58.31752\\-183.2001\\51\\60.27065\\-183.9843\\51\\62.22377\\-184.4383\\51\\64.1769\\-185.1797\\51\\66.13003\\-187.0366\\51\\68.08315\\-188.309\\51\\69.43069\\-189.8959\\51\\70.91884\\-191.849\\51\\72.59257\\-193.8021\\51\\73.39999\\-195.7553\\51\\74.08099\\-199.6615\\51\\75.89565\\-201.2613\\51\\77.84878\\-201.9851\\51\\79.23125\\-203.5678\\51\\77.84878\\-204.5923\\51\\75.89565\\-204.4629\\51\\74.61101\\-205.5209\\51\\73.74309\\-207.474\\51\\73.7068\\-209.4271\\51\\72.71908\\-211.3803\\51\\70.03628\\-214.0714\\51\\64.1769\\-216.9921\\51\\58.31752\\-217.0158\\51\\56.3644\\-216.8307\\51\\54.41127\\-216.2962\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "529" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "68.08315\\-139.5453\\51\\66.13003\\-138.4365\\51\\64.1769\\-137.9217\\51\\62.22377\\-137.6948\\51\\58.31752\\-135.9548\\51\\56.3644\\-134.8829\\51\\54.41127\\-133.2162\\51\\52.45815\\-130.741\\51\\51.48159\\-129.349\\51\\51.03603\\-127.3959\\51\\50.98397\\-123.4896\\51\\50.22889\\-121.5365\\51\\49.10753\\-119.5834\\51\\47.33366\\-117.6303\\51\\45.97733\\-115.6771\\51\\44.91576\\-113.724\\51\\44.64565\\-113.4558\\51\\42.69252\\-112.2417\\51\\40.7394\\-110.651\\51\\39.90158\\-109.8178\\51\\40.20229\\-107.8646\\51\\40.7394\\-107.0291\\51\\41.74526\\-105.9115\\51\\43.28883\\-103.9584\\51\\44.64565\\-102.6252\\51\\45.42905\\-102.0053\\51\\46.87672\\-100.0521\\51\\48.5519\\-98.86858\\51\\52.45815\\-98.90456\\51\\54.41127\\-99.61478\\51\\54.86535\\-100.0521\\51\\55.36781\\-102.0053\\51\\56.1527\\-103.9584\\51\\56.25589\\-105.9115\\51\\56.5882\\-107.8646\\51\\57.27684\\-109.8178\\51\\58.97033\\-111.7709\\51\\60.27065\\-114.1326\\51\\61.01999\\-115.6771\\51\\63.00219\\-117.6303\\51\\64.67963\\-119.5834\\51\\65.52035\\-121.5365\\51\\67.01192\\-123.4896\\51\\68.08315\\-125.0222\\51\\71.37652\\-127.3959\\51\\72.81148\\-129.349\\51\\73.68343\\-131.3021\\51\\73.16855\\-133.2553\\51\\72.21476\\-135.2084\\51\\71.71703\\-137.1615\\51\\70.95345\\-139.1146\\51\\70.03628\\-139.873\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "530" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "109.0988\\-192.4585\\51\\106.9339\\-189.8959\\51\\106.1691\\-187.9428\\51\\104.7836\\-185.9896\\51\\104.6652\\-184.0365\\51\\103.7195\\-182.0834\\51\\102.6676\\-180.1303\\51\\102.3076\\-178.1771\\51\\100.9987\\-176.224\\51\\100.6799\\-174.2709\\51\\99.96597\\-172.3178\\51\\98.73565\\-170.3646\\51\\98.42317\\-168.4115\\51\\97.68967\\-166.4584\\51\\97.21365\\-164.5053\\51\\96.85709\\-162.5521\\51\\98.09389\\-160.599\\51\\98.70157\\-158.6459\\51\\99.33315\\-157.2287\\51\\99.72552\\-156.6928\\51\\99.33315\\-154.7091\\51\\101.2863\\-155.028\\51\\103.2394\\-156.9784\\51\\104.5887\\-158.6459\\51\\105.1925\\-159.7923\\51\\105.818\\-160.599\\51\\107.7248\\-162.5521\\51\\108.9725\\-164.5053\\51\\110.4503\\-166.4584\\51\\111.043\\-168.4115\\51\\112.336\\-170.3646\\51\\112.49\\-172.3178\\51\\112.4802\\-174.2709\\51\\112.8643\\-176.224\\51\\113.005\\-178.2687\\51\\112.5765\\-180.1303\\51\\113.1729\\-182.0834\\51\\113.1445\\-184.0365\\51\\112.5516\\-185.9896\\51\\112.49\\-189.8959\\51\\112.2687\\-191.849\\51\\111.0519\\-193.1161\\51" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "531" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-190.4886\\53\\-114.473\\-189.8959\\53\\-115.5106\\-188.9433\\53\\-116.1599\\-187.9428\\53\\-116.3347\\-185.9896\\53\\-118.0667\\-184.0365\\53\\-118.6573\\-182.0834\\53\\-118.8597\\-180.1303\\53\\-118.6801\\-178.1771\\53\\-118.3375\\-176.224\\53\\-117.5838\\-174.2709\\53\\-115.6501\\-170.3646\\53\\-114.3213\\-168.4115\\53\\-111.6043\\-165.6594\\53\\-108.4182\\-162.5521\\53\\-107.6981\\-161.9725\\53\\-102.384\\-156.6928\\53\\-101.8387\\-156.0182\\53\\-99.8856\\-155.1676\\53\\-97.93247\\-155.7601\\53\\-97.01814\\-156.6928\\53\\-96.35349\\-158.6459\\53\\-96.33041\\-160.599\\53\\-96.80014\\-162.5521\\53\\-98.44296\\-164.5053\\53\\-99.33043\\-166.4584\\53\\-103.1951\\-172.3178\\53\\-103.3417\\-174.2709\\53\\-104.4826\\-176.224\\53\\-105.2709\\-178.1771\\53\\-105.3102\\-180.1303\\53\\-106.3671\\-182.0834\\53\\-107.2314\\-184.0365\\53\\-107.2568\\-187.9428\\53\\-107.5056\\-189.8959\\53\\-107.6981\\-190.1334\\53\\-109.6512\\-191.4333\\53\\-111.6043\\-191.2631\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "532" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-80.35435\\-140.182\\53\\-81.60841\\-139.1146\\53\\-83.44996\\-137.1615\\53\\-83.54903\\-135.2084\\53\\-82.44911\\-133.2553\\53\\-80.35435\\-131.1394\\53\\-78.40122\\-128.5807\\53\\-76.4481\\-126.3066\\53\\-75.81718\\-125.4428\\53\\-75.00029\\-123.4896\\53\\-73.1946\\-121.5365\\53\\-71.2683\\-119.5834\\53\\-70.58872\\-117.9558\\53\\-68.08338\\-113.724\\53\\-67.1172\\-111.7709\\53\\-66.02963\\-109.8178\\53\\-64.30398\\-105.9115\\53\\-63.98759\\-102.0053\\53\\-63.54027\\-100.0521\\53\\-62.77623\\-99.31483\\53\\-60.8231\\-98.60432\\53\\-58.86998\\-97.22952\\53\\-57.63462\\-96.14588\\53\\-54.96373\\-93.56536\\53\\-53.0106\\-92.84669\\53\\-51.05748\\-92.50256\\53\\-49.10435\\-93.87015\\53\\-48.81984\\-94.19276\\53\\-48.25149\\-96.14588\\53\\-46.18935\\-100.0521\\53\\-44.75898\\-102.0053\\53\\-44.5559\\-103.9584\\53\\-45.0111\\-105.9115\\53\\-46.05597\\-107.8646\\53\\-47.76523\\-109.8178\\53\\-49.10435\\-111.141\\53\\-51.05748\\-112.4404\\53\\-53.0106\\-113.3188\\53\\-54.82765\\-115.6771\\53\\-56.91685\\-117.7258\\53\\-58.56601\\-121.5365\\53\\-59.54645\\-123.4896\\53\\-60.0933\\-125.4428\\53\\-60.27378\\-127.3959\\53\\-60.80039\\-129.349\\53\\-61.88794\\-131.3021\\53\\-64.72935\\-134.1519\\53\\-66.68247\\-135.5164\\53\\-68.6356\\-135.9769\\53\\-70.94489\\-137.1615\\53\\-76.4481\\-139.9015\\53\\-78.40122\\-140.7422\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "20" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "533" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-35.43248\\-135.2892\\53\\-37.3856\\-134.2001\\53\\-39.33873\\-133.7614\\53\\-41.29185\\-133.7435\\53\\-43.24498\\-133.459\\53\\-46.83927\\-131.3021\\53\\-47.15123\\-130.7798\\53\\-47.57847\\-129.349\\53\\-47.39723\\-127.3959\\53\\-45.1981\\-125.2897\\53\\-43.24498\\-125.0286\\53\\-39.33873\\-124.8731\\53\\-37.3856\\-125.3629\\53\\-35.43248\\-126.5717\\53\\-34.27037\\-127.3959\\53\\-33.16123\\-129.349\\53\\-33.12489\\-131.3021\\53\\-33.18638\\-133.2553\\53\\-33.47935\\-134.4094\\53\\-34.8671\\-135.2084\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "534" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-33.47935\\-201.6668\\53\\-35.43248\\-201.0522\\53\\-37.3856\\-200.8557\\53\\-41.29185\\-200.8431\\53\\-43.24498\\-200.663\\53\\-45.1981\\-199.6225\\53\\-47.15123\\-199.0582\\53\\-49.10435\\-199.3289\\53\\-51.05748\\-199.9206\\53\\-53.0106\\-200.3055\\53\\-53.956\\-199.6615\\53\\-53.2336\\-197.7084\\53\\-53.0106\\-197.4307\\53\\-51.05748\\-196.0933\\53\\-49.10435\\-195.7325\\53\\-47.15123\\-195.7177\\53\\-45.1981\\-195.3219\\53\\-43.24498\\-194.7787\\53\\-41.29185\\-194.5088\\53\\-39.33873\\-194.0887\\53\\-37.3856\\-194.0326\\53\\-35.43248\\-194.2066\\53\\-31.52623\\-195.1073\\53\\-29.5731\\-196.3493\\53\\-27.61998\\-197.3633\\53\\-25.66685\\-197.4131\\53\\-23.71373\\-197.3513\\53\\-21.7606\\-197.1623\\53\\-17.85435\\-196.6349\\53\\-11.99498\\-196.6349\\53\\-10.04185\\-197.0275\\53\\-8.088726\\-197.7632\\53\\-6.135601\\-198.2031\\53\\-4.182476\\-198.8769\\53\\-2.981218\\-199.6615\\53\\-4.182476\\-200.9794\\53\\-6.135601\\-201.047\\53\\-8.088726\\-200.5554\\53\\-10.04185\\-200.529\\53\\-13.9481\\-200.8506\\53\\-15.90123\\-200.888\\53\\-17.85435\\-201.4627\\53\\-21.7606\\-201.9948\\53\\-23.71373\\-202.6822\\53\\-25.66685\\-202.8279\\53\\-27.61998\\-202.7968\\53\\-29.5731\\-201.9993\\53\\-31.52623\\-201.6676\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "23" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "535" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-21.7606\\-131.5379\\53\\-23.71373\\-131.2313\\53\\-25.66685\\-130.4872\\53\\-27.04218\\-129.349\\53\\-27.34624\\-127.3959\\53\\-28.21202\\-123.4896\\53\\-28.18243\\-121.5365\\53\\-27.61998\\-120.0554\\53\\-27.20954\\-119.5834\\53\\-26.19796\\-117.6303\\53\\-25.66685\\-117.0864\\53\\-23.7218\\-115.6771\\53\\-21.7606\\-116.0745\\53\\-20.70646\\-117.6303\\53\\-21.7606\\-119.289\\53\\-23.71373\\-119.2904\\53\\-24.28444\\-119.5834\\53\\-24.93685\\-121.5365\\53\\-23.24006\\-123.4896\\53\\-21.7606\\-125.4049\\53\\-19.83387\\-127.3959\\53\\-17.70356\\-129.349\\53\\-19.80748\\-131.3969\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "536" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "27.06752\\-151.0933\\53\\25.80406\\-148.8803\\53\\25.22454\\-146.9271\\53\\25.45377\\-144.974\\53\\26.2099\\-143.0209\\53\\28.36358\\-141.0678\\53\\29.02065\\-140.054\\53\\30.97377\\-139.5754\\53\\32.47671\\-141.0678\\53\\32.83216\\-143.0209\\53\\32.84613\\-144.974\\53\\32.62294\\-146.9271\\53\\31.84243\\-148.8803\\53\\29.97998\\-150.8334\\53\\29.02065\\-151.6872\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "537" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "27.06752\\-137.4433\\53\\26.56762\\-137.1615\\53\\24.58261\\-135.2084\\53\\24.10028\\-133.2553\\53\\22.53872\\-131.3021\\53\\21.20815\\-130.004\\53\\17.3019\\-130.8104\\53\\15.34877\\-131.5496\\53\\13.39565\\-131.8074\\53\\11.44252\\-131.799\\53\\10.13543\\-131.3021\\53\\10.52303\\-129.349\\53\\12.77532\\-127.3959\\53\\15.34877\\-124.7821\\53\\17.3019\\-122.9669\\53\\19.25502\\-122.7731\\53\\21.20815\\-123.1454\\53\\22.81702\\-121.5365\\53\\23.16127\\-120.8115\\53\\25.1144\\-120.9408\\53\\25.64628\\-121.5365\\53\\27.06752\\-122.4674\\53\\29.02065\\-122.3832\\53\\30.97377\\-123.1446\\53\\32.9269\\-124.2828\\53\\36.83315\\-125.0484\\53\\38.78627\\-125.7816\\53\\40.7394\\-127.1827\\53\\42.37863\\-129.349\\53\\43.27236\\-131.3021\\53\\42.69252\\-131.7336\\53\\40.7394\\-132.3983\\53\\38.78627\\-133.7082\\53\\36.83315\\-134.4439\\53\\34.88002\\-135.7137\\53\\32.9269\\-136.3792\\53\\31.45188\\-137.1615\\53\\30.97377\\-137.9668\\53\\29.02065\\-137.9938\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "538" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-215.5392\\53\\52.45815\\-215.016\\53\\50.50502\\-214.2944\\53\\48.5519\\-212.8191\\53\\46.59877\\-211.9967\\53\\44.37328\\-209.4271\\53\\43.55283\\-207.474\\53\\42.2958\\-205.5209\\53\\42.00643\\-203.5678\\53\\41.52927\\-201.6146\\53\\40.7394\\-200.771\\53\\38.78627\\-200.9968\\53\\36.83315\\-202.6358\\53\\35.92599\\-201.6146\\53\\36.83315\\-199.9599\\53\\38.78627\\-198.0258\\53\\40.48031\\-195.7553\\53\\40.5277\\-193.8021\\53\\41.48178\\-191.849\\53\\42.04665\\-189.8959\\53\\43.68726\\-187.9428\\53\\44.64565\\-186.9844\\53\\46.59877\\-185.4434\\53\\48.5519\\-184.9422\\53\\50.50502\\-184.2874\\53\\52.45815\\-183.5198\\53\\54.41127\\-183.2857\\53\\56.3644\\-183.2955\\53\\58.31752\\-183.5282\\53\\60.27065\\-184.3663\\53\\62.22377\\-185.0702\\53\\64.1769\\-185.923\\53\\66.13003\\-187.1487\\53\\68.08315\\-188.1729\\53\\70.03628\\-190.612\\53\\70.92928\\-191.849\\53\\72.87094\\-193.8021\\53\\73.71873\\-195.7553\\53\\73.74309\\-197.7084\\53\\74.65324\\-199.6615\\53\\77.84878\\-202.546\\53\\78.784\\-203.5678\\53\\77.84878\\-204.513\\53\\75.89565\\-204.8681\\53\\75.06328\\-205.5209\\53\\73.74309\\-207.474\\53\\73.73082\\-209.4271\\53\\72.74352\\-211.3803\\53\\70.03628\\-214.0782\\53\\67.49992\\-215.2865\\53\\64.1769\\-216.7847\\53\\62.22377\\-217.0158\\53\\58.31752\\-217.0158\\53\\56.3644\\-216.443\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "539" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "66.13003\\-137.5285\\53\\64.1769\\-136.4898\\53\\62.22377\\-135.9482\\53\\60.27065\\-135.5489\\53\\58.31752\\-134.5831\\53\\56.3644\\-133.8174\\53\\54.41127\\-132.3727\\53\\51.05862\\-129.349\\53\\49.88412\\-127.3959\\53\\49.85199\\-123.4896\\53\\49.42422\\-121.5365\\53\\48.5519\\-119.688\\53\\47.33978\\-117.6303\\53\\44.64565\\-114.5544\\53\\43.81531\\-113.724\\53\\41.54138\\-111.7709\\53\\39.51244\\-109.8178\\53\\38.82412\\-107.8646\\53\\37.73531\\-103.9584\\53\\38.78627\\-103.0612\\53\\39.71401\\-102.0053\\53\\40.1707\\-100.0521\\53\\40.7394\\-99.29682\\53\\42.01707\\-98.09901\\53\\44.64565\\-96.15926\\53\\46.59877\\-96.91932\\53\\48.5519\\-97.81528\\53\\50.50502\\-98.90456\\53\\52.45815\\-98.92021\\53\\54.22427\\-100.0521\\53\\54.96852\\-102.0053\\53\\55.84634\\-103.9584\\53\\56.22896\\-105.9115\\53\\56.49984\\-107.8646\\53\\57.21825\\-109.8178\\53\\58.97033\\-111.7709\\53\\60.27065\\-113.7343\\53\\61.14539\\-115.6771\\53\\64.90932\\-119.5834\\53\\66.52441\\-121.5365\\53\\67.35699\\-123.4896\\53\\68.08315\\-124.5308\\53\\69.29906\\-125.4428\\53\\71.9894\\-127.0198\\53\\72.35561\\-127.3959\\53\\73.33852\\-129.349\\53\\73.71873\\-131.3021\\53\\73.03754\\-133.2553\\53\\71.71886\\-135.2084\\53\\71.51729\\-137.1615\\53\\70.03628\\-138.4109\\53\\68.08315\\-137.9053\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "540" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "105.1925\\-214.2475\\53\\104.5782\\-213.3334\\53\\105.1925\\-211.9228\\53\\105.6151\\-211.3803\\53\\107.1457\\-210.2184\\53\\108.5669\\-211.3803\\53\\109.76\\-213.3334\\53\\109.0988\\-214.0387\\53\\107.1457\\-215.2633\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "541" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "111.0519\\-195.082\\53\\109.0988\\-193.3779\\53\\108.1471\\-191.849\\53\\107.1229\\-189.8959\\53\\106.8487\\-187.9428\\53\\106.4447\\-184.0365\\53\\105.6509\\-182.0834\\53\\104.7009\\-180.1303\\53\\104.3313\\-178.1771\\53\\103.3585\\-176.224\\53\\101.9503\\-172.3178\\53\\100.7482\\-170.3646\\53\\100.6066\\-168.4115\\53\\99.33315\\-166.1016\\53\\98.78343\\-164.5053\\53\\98.59518\\-162.5521\\53\\98.71609\\-160.599\\53\\98.94621\\-158.6459\\53\\98.74384\\-156.6928\\53\\98.00348\\-154.7396\\53\\99.33315\\-153.2212\\53\\101.2863\\-153.1883\\53\\103.2394\\-154.2033\\53\\103.9355\\-154.7396\\53\\105.8825\\-156.6928\\53\\107.1457\\-158.6577\\53\\108.9767\\-160.599\\53\\110.9951\\-162.5521\\53\\112.9052\\-164.5053\\53\\114.1076\\-166.4584\\53\\114.8838\\-168.4115\\53\\115.989\\-170.3646\\53\\114.9582\\-172.9107\\53\\114.651\\-174.2709\\53\\114.9582\\-175.0643\\53\\115.7003\\-176.224\\53\\116.2914\\-178.1771\\53\\116.1159\\-180.1303\\53\\116.299\\-182.0834\\53\\116.2884\\-184.0365\\53\\116.0842\\-185.9896\\53\\115.9964\\-187.9428\\53\\114.9688\\-189.8959\\53\\114.4806\\-191.849\\53\\114.2594\\-193.8021\\53\\113.005\\-195.113\\53" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "542" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-190.5635\\55\\-114.6317\\-189.8959\\55\\-115.5106\\-189.0902\\55\\-116.2167\\-187.9428\\55\\-116.3497\\-185.9896\\55\\-118.3215\\-184.0365\\55\\-119.7737\\-182.0834\\55\\-120.0416\\-180.1303\\55\\-119.4168\\-178.7131\\55\\-118.9902\\-178.1771\\55\\-118.4082\\-176.224\\55\\-118.3131\\-174.2709\\55\\-118.0993\\-172.3178\\55\\-117.0345\\-170.3646\\55\\-116.428\\-168.4115\\55\\-115.5106\\-166.6914\\55\\-113.5575\\-164.4031\\55\\-111.6043\\-162.4095\\55\\-107.6981\\-159.8352\\55\\-105.745\\-158.0406\\55\\-104.3972\\-156.6928\\55\\-103.193\\-154.7396\\55\\-101.8387\\-153.3322\\55\\-99.8856\\-153.7695\\55\\-98.9523\\-154.7396\\55\\-97.35641\\-156.6928\\55\\-97.29106\\-158.6459\\55\\-97.54883\\-160.599\\55\\-97.93247\\-161.5756\\55\\-98.52271\\-162.5521\\55\\-100.2415\\-164.5053\\55\\-102.4575\\-168.4115\\55\\-104.3293\\-170.3646\\55\\-105.2937\\-172.3178\\55\\-105.3529\\-174.2709\\55\\-106.4545\\-176.224\\55\\-107.2583\\-178.1771\\55\\-107.309\\-180.1303\\55\\-108.3675\\-182.0834\\55\\-109.2197\\-184.0365\\55\\-109.2349\\-187.9428\\55\\-109.339\\-189.8959\\55\\-109.6512\\-190.2657\\55\\-111.6043\\-191.1041\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "543" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-80.35435\\-139.9061\\55\\-83.34705\\-137.1615\\55\\-83.74692\\-135.2084\\55\\-83.21464\\-133.2553\\55\\-82.30747\\-132.2341\\55\\-77.46307\\-127.3959\\55\\-76.4481\\-125.4533\\55\\-75.15454\\-123.4896\\55\\-73.20815\\-121.5365\\55\\-71.47791\\-119.5834\\55\\-70.58872\\-117.6636\\55\\-69.26653\\-115.6771\\55\\-67.60625\\-113.724\\55\\-66.52089\\-111.7709\\55\\-65.628\\-109.8178\\55\\-64.56776\\-107.8646\\55\\-63.58387\\-103.9584\\55\\-63.29829\\-102.0053\\55\\-63.54206\\-100.0521\\55\\-62.77623\\-99.31725\\55\\-60.8231\\-98.90456\\55\\-58.86998\\-97.34889\\55\\-56.91685\\-95.45267\\55\\-54.96373\\-93.91471\\55\\-53.0106\\-93.231\\55\\-51.05748\\-93.91694\\55\\-50.77296\\-94.19276\\55\\-49.9264\\-96.14588\\55\\-48.69506\\-98.09901\\55\\-47.96398\\-100.0521\\55\\-46.36602\\-102.0053\\55\\-45.37762\\-103.9584\\55\\-45.67432\\-105.9115\\55\\-46.64463\\-107.8646\\55\\-48.05762\\-109.8178\\55\\-49.10435\\-110.8645\\55\\-51.05748\\-112.2592\\55\\-53.0106\\-113.1754\\55\\-55.34278\\-115.6771\\55\\-56.91685\\-117.747\\55\\-58.55516\\-121.5365\\55\\-59.03274\\-123.4896\\55\\-59.8558\\-127.3959\\55\\-60.8231\\-128.7042\\55\\-62.77623\\-131.0939\\55\\-64.72935\\-132.7635\\55\\-66.68247\\-134.006\\55\\-68.6356\\-134.6212\\55\\-70.58872\\-135.8354\\55\\-72.54185\\-136.572\\55\\-74.49497\\-137.8108\\55\\-76.4481\\-138.4765\\55\\-78.40122\\-139.7283\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "15" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "544" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-41.29185\\-131.7867\\55\\-43.24498\\-130.9932\\55\\-45.1981\\-129.8181\\55\\-45.63711\\-129.349\\55\\-45.62629\\-127.3959\\55\\-45.1981\\-126.9805\\55\\-43.24498\\-126.1073\\55\\-41.29185\\-125.8681\\55\\-39.33873\\-126.3762\\55\\-37.3856\\-127.1845\\55\\-35.43248\\-128.8065\\55\\-35.05155\\-129.349\\55\\-35.43248\\-131.3459\\55\\-37.3856\\-132.3209\\55\\-39.33873\\-131.9978\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "545" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-29.5731\\-204.019\\55\\-31.52623\\-202.7565\\55\\-33.47935\\-202.5971\\55\\-37.3856\\-201.3059\\55\\-43.24498\\-201.2939\\55\\-45.1981\\-201.0812\\55\\-47.15123\\-200.4695\\55\\-49.10435\\-200.251\\55\\-50.42873\\-199.6615\\55\\-50.93961\\-197.7084\\55\\-49.10435\\-196.7136\\55\\-45.1981\\-196.3285\\55\\-43.24498\\-196.2243\\55\\-37.3856\\-196.2243\\55\\-35.43248\\-196.3326\\55\\-31.52623\\-197.5346\\55\\-31.15336\\-197.7084\\55\\-29.5731\\-199.0664\\55\\-29.04413\\-199.6615\\55\\-27.61998\\-200.7186\\55\\-25.66685\\-200.9932\\55\\-23.71373\\-200.5275\\55\\-22.69376\\-199.6615\\55\\-21.7606\\-199.2691\\55\\-19.80748\\-199.023\\55\\-11.99498\\-199.3622\\55\\-11.06724\\-199.6615\\55\\-13.9481\\-200.0672\\55\\-15.90123\\-200.1273\\55\\-17.85435\\-200.934\\55\\-18.68624\\-201.6146\\55\\-21.7606\\-202.18\\55\\-23.71373\\-203.6491\\55\\-25.66685\\-204.4185\\55\\-27.61998\\-204.6762\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "546" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-23.71373\\-130.2042\\55\\-25.19772\\-129.349\\55\\-25.66685\\-128.6844\\55\\-26.25776\\-127.3959\\55\\-27.20457\\-123.4896\\55\\-27.05936\\-121.5365\\55\\-25.66685\\-120.6519\\55\\-25.21387\\-121.5365\\55\\-24.43299\\-123.4896\\55\\-22.75291\\-125.4428\\55\\-21.7606\\-126.7611\\55\\-18.77488\\-129.349\\55\\-19.80748\\-130.7334\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "14" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "547" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "27.06752\\-151.4911\\55\\26.50543\\-150.8334\\55\\25.78228\\-148.8803\\55\\26.0376\\-146.9271\\55\\26.59904\\-144.974\\55\\27.06752\\-144.2364\\55\\29.02065\\-142.199\\55\\30.97377\\-141.2518\\55\\31.99103\\-143.0209\\55\\32.2235\\-144.974\\55\\32.02846\\-146.9271\\55\\31.1005\\-148.8803\\55\\29.81009\\-150.8334\\55\\29.02065\\-151.6089\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "548" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "29.02065\\-135.6301\\55\\27.83631\\-135.2084\\55\\27.06752\\-134.2047\\55\\26.79409\\-133.2553\\55\\25.97906\\-131.3021\\55\\24.96596\\-129.349\\55\\26.24468\\-127.3959\\55\\26.35873\\-125.4428\\55\\25.1144\\-123.8355\\55\\23.16127\\-124.6127\\55\\21.20815\\-124.7134\\55\\20.63768\\-125.4428\\55\\19.73094\\-127.3959\\55\\19.25502\\-128.0921\\55\\17.92422\\-129.349\\55\\17.3019\\-129.7559\\55\\13.39565\\-131.7904\\55\\11.44252\\-131.8074\\55\\10.46596\\-131.3021\\55\\10.76644\\-129.349\\55\\11.44252\\-128.7631\\55\\13.39565\\-127.7011\\55\\15.54265\\-125.4428\\55\\16.88153\\-123.4896\\55\\17.3019\\-123.0801\\55\\19.25502\\-122.1416\\55\\21.20815\\-122.8408\\55\\23.16127\\-122.8417\\55\\25.50048\\-123.4896\\55\\27.06752\\-124.6718\\55\\28.71101\\-123.4896\\55\\29.02065\\-123.3949\\55\\30.97377\\-124.176\\55\\34.88002\\-125.931\\55\\36.83315\\-126.2383\\55\\38.78627\\-126.7222\\55\\39.62443\\-127.3959\\55\\40.86789\\-129.349\\55\\40.01098\\-131.3021\\55\\38.78627\\-132.3255\\55\\36.83315\\-133.6806\\55\\34.88002\\-134.4327\\55\\32.9269\\-135.4441\\55\\30.97377\\-135.6608\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "549" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-216.0773\\55\\54.41127\\-215.0274\\55\\52.45815\\-214.8437\\55\\50.50502\\-214.0772\\55\\48.5519\\-212.5\\55\\46.59877\\-210.735\\55\\43.69069\\-207.474\\55\\42.32553\\-205.5209\\55\\42.3155\\-203.5678\\55\\41.72021\\-201.6146\\55\\40.7394\\-200.603\\55\\36.83315\\-202.245\\55\\36.40249\\-201.6146\\55\\37.64114\\-199.6615\\55\\39.48753\\-197.7084\\55\\40.50368\\-195.7553\\55\\40.9264\\-193.8021\\55\\41.75299\\-191.849\\55\\42.346\\-189.8959\\55\\43.75654\\-187.9428\\55\\44.64565\\-187.0836\\55\\47.02405\\-185.9896\\55\\48.5519\\-185.4514\\55\\50.50502\\-184.9571\\55\\52.45815\\-184.597\\55\\58.31752\\-184.6086\\55\\60.27065\\-185.1044\\55\\64.1769\\-187.1846\\55\\68.08315\\-188.9301\\55\\70.03628\\-190.8837\\55\\72.69096\\-193.8021\\55\\73.48476\\-195.7553\\55\\73.75552\\-197.7084\\55\\74.70563\\-199.6615\\55\\76.72197\\-201.6146\\55\\78.1306\\-203.5678\\55\\77.84878\\-203.8788\\55\\75.36668\\-205.5209\\55\\73.74309\\-207.474\\55\\73.44526\\-209.4271\\55\\72.2915\\-211.3803\\55\\70.03628\\-213.6256\\55\\68.08315\\-214.7629\\55\\66.13003\\-215.3094\\55\\64.1769\\-216.1901\\55\\62.22377\\-216.7783\\55\\60.27065\\-217.0039\\55\\58.31752\\-216.8116\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "550" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "70.03628\\-137.4433\\55\\68.08315\\-136.4672\\55\\64.1769\\-135.5123\\55\\62.22377\\-134.5288\\55\\58.31752\\-133.5333\\55\\56.3644\\-132.6062\\55\\54.41127\\-131.8407\\55\\52.45815\\-130.4264\\55\\50.50502\\-129.1957\\55\\49.20875\\-127.3959\\55\\49.01724\\-125.4428\\55\\48.99399\\-123.4896\\55\\47.9638\\-119.5834\\55\\47.17484\\-117.6303\\55\\45.39569\\-115.6771\\55\\39.46987\\-109.8178\\55\\37.96675\\-107.8646\\55\\37.03483\\-103.9584\\55\\39.66615\\-102.0053\\55\\40.7394\\-99.55751\\55\\42.85529\\-98.09901\\55\\44.64565\\-95.96093\\55\\46.59877\\-96.35818\\55\\49.03204\\-98.09901\\55\\50.50502\\-98.90983\\55\\52.45815\\-98.92021\\55\\54.18748\\-100.0521\\55\\54.58566\\-102.0053\\55\\55.3313\\-103.9584\\55\\56.3644\\-106.3915\\55\\56.87566\\-107.8646\\55\\57.68303\\-109.8178\\55\\58.98432\\-111.7709\\55\\60.79034\\-113.724\\55\\61.65692\\-115.6771\\55\\63.15106\\-117.6303\\55\\64.1769\\-118.8073\\55\\66.99527\\-121.5365\\55\\67.77918\\-123.4896\\55\\68.08315\\-123.9107\\55\\70.28288\\-125.4428\\55\\71.9894\\-126.4729\\55\\72.91237\\-127.3959\\55\\74.23824\\-129.349\\55\\74.0646\\-131.3021\\55\\73.03278\\-133.2553\\55\\71.51647\\-135.2084\\55\\70.41458\\-137.1615\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "551" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "105.1925\\-213.6025\\55\\104.9568\\-213.3334\\55\\105.7279\\-211.3803\\55\\106.6074\\-209.4271\\55\\107.1457\\-208.8276\\55\\109.0988\\-208.3343\\55\\110.5183\\-209.4271\\55\\111.4901\\-211.3803\\55\\112.0987\\-213.3334\\55\\111.0519\\-214.4357\\55\\109.0988\\-214.9825\\55\\107.1457\\-214.828\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "552" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "111.0519\\-196.0783\\55\\110.7623\\-195.7553\\55\\108.8936\\-191.849\\55\\108.6623\\-189.8959\\55\\108.6327\\-185.9896\\55\\107.9873\\-184.0365\\55\\106.8866\\-182.0834\\55\\106.6865\\-180.1303\\55\\106.0714\\-178.1771\\55\\104.9334\\-176.224\\55\\104.7112\\-174.2709\\55\\103.9503\\-172.3178\\55\\102.7892\\-170.3646\\55\\102.7199\\-168.4115\\55\\101.8105\\-166.4584\\55\\100.7705\\-164.5053\\55\\100.1013\\-162.5521\\55\\99.25238\\-160.599\\55\\98.97633\\-158.6459\\55\\98.32275\\-156.6928\\55\\97.78642\\-154.7396\\55\\99.33315\\-153.2918\\55\\101.2863\\-151.9826\\55\\103.2394\\-152.0591\\55\\105.1925\\-153.3116\\55\\107.1937\\-154.7396\\55\\113.005\\-160.4007\\55\\114.9582\\-161.4085\\55\\115.9928\\-162.5521\\55\\116.2958\\-164.5053\\55\\116.9113\\-165.9701\\55\\118.2341\\-168.4115\\55\\118.449\\-170.3646\\55\\118.8644\\-172.1041\\55\\120.0108\\-174.2709\\55\\120.0018\\-178.1771\\55\\119.4157\\-180.1303\\55\\119.0349\\-182.0834\\55\\118.9865\\-184.0365\\55\\118.4186\\-185.9896\\55\\118.3412\\-187.9428\\55\\117.379\\-189.8959\\55\\117.1274\\-191.849\\55\\117.0198\\-193.8021\\55\\115.9857\\-195.7553\\55\\114.9582\\-196.7388\\55\\113.005\\-197.0159\\55" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "553" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-115.5106\\-188.5081\\57\\-115.9636\\-187.9428\\57\\-116.5651\\-185.9896\\57\\-118.3226\\-184.0365\\57\\-118.7989\\-182.0834\\57\\-118.0063\\-180.1303\\57\\-117.4637\\-179.6124\\57\\-114.8234\\-178.1771\\57\\-113.6915\\-176.224\\57\\-114.8392\\-174.2709\\57\\-115.5106\\-174.1399\\57\\-117.4637\\-172.9258\\57\\-117.6875\\-172.3178\\57\\-117.2593\\-170.3646\\57\\-116.1529\\-166.4584\\57\\-114.8982\\-164.5053\\57\\-113.8936\\-162.5521\\57\\-111.6043\\-159.9762\\57\\-109.6512\\-158.4366\\57\\-107.022\\-156.6928\\57\\-105.745\\-155.3958\\57\\-104.4125\\-152.7865\\57\\-103.7918\\-152.171\\57\\-101.8387\\-150.7169\\57\\-99.8856\\-151.4719\\57\\-98.20301\\-154.7396\\57\\-97.97004\\-156.6928\\57\\-98.77534\\-158.6459\\57\\-100.0611\\-160.599\\57\\-100.9613\\-162.5521\\57\\-103.4512\\-166.4584\\57\\-104.5087\\-168.4115\\57\\-106.2167\\-170.3646\\57\\-107.2906\\-172.3178\\57\\-107.4133\\-174.2709\\57\\-108.6428\\-176.224\\57\\-109.6034\\-178.1771\\57\\-109.6417\\-180.1303\\57\\-110.6386\\-182.0834\\57\\-111.2059\\-184.0365\\57\\-111.0049\\-185.9896\\57\\-111.0239\\-187.9428\\57\\-111.6043\\-189.2198\\57\\-113.5575\\-189.7215\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "554" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-80.35435\\-139.4186\\57\\-82.30747\\-138.1466\\57\\-83.34705\\-137.1615\\57\\-83.75529\\-135.2084\\57\\-83.56164\\-133.2553\\57\\-82.47636\\-131.3021\\57\\-78.40122\\-127.1964\\57\\-76.4481\\-124.9178\\57\\-73.43661\\-121.5365\\57\\-72.12424\\-119.5834\\57\\-71.03262\\-117.6303\\57\\-67.54758\\-113.724\\57\\-65.36326\\-109.8178\\57\\-64.06951\\-107.8646\\57\\-63.54353\\-105.9115\\57\\-62.69546\\-103.9584\\57\\-62.3795\\-102.0053\\57\\-62.48051\\-100.0521\\57\\-59.40808\\-98.09901\\57\\-56.91685\\-96.022\\57\\-54.96373\\-94.98411\\57\\-53.0106\\-94.59828\\57\\-51.463\\-96.14588\\57\\-49.4695\\-100.0521\\57\\-48.18835\\-102.0053\\57\\-46.40561\\-103.9584\\57\\-46.1443\\-105.9115\\57\\-47.15123\\-107.3838\\57\\-49.00197\\-109.8178\\57\\-51.36177\\-111.7709\\57\\-53.0106\\-113.028\\57\\-55.69615\\-115.6771\\57\\-57.09124\\-117.6303\\57\\-58.57701\\-121.5365\\57\\-58.65827\\-125.4428\\57\\-59.72578\\-127.3959\\57\\-61.83315\\-129.349\\57\\-62.77623\\-130.4002\\57\\-64.72935\\-132.3503\\57\\-66.68247\\-133.8494\\57\\-68.6356\\-134.4395\\57\\-70.58872\\-135.6902\\57\\-74.49497\\-136.5317\\57\\-76.4481\\-137.7746\\57\\-78.40122\\-138.4194\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "555" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-37.3856\\-131.3248\\57\\-39.33873\\-130.3488\\57\\-41.29185\\-129.881\\57\\-42.24237\\-129.349\\57\\-43.24498\\-127.8451\\57\\-43.24498\\-127.2055\\57\\-41.29185\\-126.3651\\57\\-39.33873\\-126.9625\\57\\-36.67352\\-129.349\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "19" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "556" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-29.5731\\-204.0744\\57\\-30.52669\\-203.5678\\57\\-31.52623\\-202.4644\\57\\-33.47935\\-202.7599\\57\\-37.3856\\-202.314\\57\\-43.24498\\-202.3007\\57\\-45.1981\\-202.2593\\57\\-46.20456\\-201.6146\\57\\-46.62177\\-199.6615\\57\\-45.1981\\-198.1845\\57\\-44.31238\\-197.7084\\57\\-43.24498\\-197.3553\\57\\-37.3856\\-197.3553\\57\\-35.43248\\-198.185\\57\\-33.47935\\-199.9122\\57\\-31.52623\\-200.8357\\57\\-29.5731\\-201.4465\\57\\-26.13131\\-203.5678\\57\\-27.61998\\-204.6022\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "557" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "11.44252\\-131.3397\\57\\12.1908\\-129.349\\57\\13.39565\\-128.7047\\57\\15.34877\\-126.9433\\57\\17.3019\\-124.66\\57\\19.25502\\-122.7814\\57\\20.12206\\-123.4896\\57\\19.25502\\-124.7782\\57\\18.617\\-125.4428\\57\\18.13994\\-127.3959\\57\\17.3019\\-128.3806\\57\\15.34877\\-130.0535\\57\\13.39565\\-131.3098\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "558" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "27.06752\\-149.785\\57\\26.64613\\-148.8803\\57\\26.94545\\-146.9271\\57\\29.02065\\-144.6688\\57\\29.71819\\-144.974\\57\\30.79987\\-146.9271\\57\\29.87691\\-148.8803\\57\\29.02065\\-150.1111\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "17" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "559" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "30.97377\\-133.8261\\57\\29.17256\\-133.2553\\57\\28.48097\\-131.3021\\57\\28.28303\\-129.349\\57\\28.67812\\-125.4428\\57\\29.02065\\-125.0814\\57\\30.97377\\-124.689\\57\\31.99473\\-125.4428\\57\\32.9269\\-126.4681\\57\\34.88002\\-127.2672\\57\\36.83315\\-127.3433\\57\\38.78627\\-128.943\\57\\39.03376\\-129.349\\57\\37.97247\\-131.3021\\57\\36.83315\\-132.2469\\57\\34.88002\\-133.5592\\57\\32.9269\\-133.8163\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "560" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-215.5027\\57\\52.45815\\-214.4763\\57\\50.4562\\-213.3334\\57\\48.5519\\-212.3467\\57\\43.69069\\-207.474\\57\\42.3357\\-205.5209\\57\\42.3357\\-203.5678\\57\\41.7287\\-201.6146\\57\\40.7394\\-200.5943\\57\\38.78627\\-201.4362\\57\\37.24005\\-201.6146\\57\\36.9971\\-203.5678\\57\\36.65201\\-203.5678\\57\\36.79559\\-201.6146\\57\\37.79396\\-199.6615\\57\\39.61868\\-197.7084\\57\\41.47309\\-193.8021\\57\\42.06436\\-191.849\\57\\42.78798\\-189.8959\\57\\44.64565\\-187.6722\\57\\48.5519\\-185.8026\\57\\52.45815\\-185.1558\\57\\54.41127\\-185.0469\\57\\58.31752\\-185.3266\\57\\60.27065\\-186.5573\\57\\62.22377\\-187.4768\\57\\64.1769\\-188.8362\\57\\66.13003\\-189.6711\\57\\68.08315\\-190.269\\57\\70.29919\\-191.849\\57\\71.9894\\-194.48\\57\\72.7169\\-195.7553\\57\\73.96577\\-199.6615\\57\\76.35094\\-201.6146\\57\\77.60129\\-203.5678\\57\\75.89565\\-205.1145\\57\\73.94253\\-206.6359\\57\\73.30128\\-207.474\\57\\72.61146\\-209.4271\\57\\71.9894\\-210.1423\\57\\68.82684\\-213.3334\\57\\68.08315\\-213.9911\\57\\66.13003\\-214.7923\\57\\64.44138\\-215.2865\\57\\62.22377\\-216.1798\\57\\60.27065\\-216.556\\57\\58.31752\\-216.2631\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "561" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "68.08315\\-135.4789\\57\\66.13003\\-134.5018\\57\\62.22377\\-133.5027\\57\\60.27065\\-132.5711\\57\\56.3644\\-131.5463\\57\\54.41127\\-130.6412\\57\\52.45815\\-130.0234\\57\\50.50502\\-128.9241\\57\\49.03408\\-127.3959\\57\\47.97258\\-125.4428\\57\\48.13596\\-121.5365\\57\\47.59927\\-119.5834\\57\\46.59877\\-117.7109\\57\\45.38562\\-115.6771\\57\\39.4896\\-109.8178\\57\\38.2627\\-107.8646\\57\\38.40263\\-105.9115\\57\\38.78627\\-105.1655\\57\\39.6823\\-103.9584\\57\\40.7394\\-103.1932\\57\\41.90129\\-102.0053\\57\\42.69252\\-100.9213\\57\\43.5794\\-100.0521\\57\\44.64565\\-99.31628\\57\\46.59877\\-98.26917\\57\\48.5519\\-98.72641\\57\\50.50502\\-98.98483\\57\\52.45815\\-99.02254\\57\\53.88921\\-100.0521\\57\\54.26266\\-102.0053\\57\\54.95257\\-103.9584\\57\\55.83226\\-105.9115\\57\\57.0066\\-107.8646\\57\\58.34024\\-109.8178\\57\\59.17631\\-111.7709\\57\\62.76315\\-115.6771\\57\\63.63069\\-117.6303\\57\\65.38686\\-119.5834\\57\\67.53093\\-121.5365\\57\\68.08315\\-122.4201\\57\\69.03488\\-123.4896\\57\\70.03628\\-124.2236\\57\\71.9894\\-125.4195\\57\\73.98128\\-127.3959\\57\\75.22981\\-129.349\\57\\74.94495\\-131.3021\\57\\73.3299\\-133.2553\\57\\71.9894\\-134.5958\\57\\70.03628\\-135.9393\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "562" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "107.1457\\-214.1324\\57\\106.2667\\-213.3334\\57\\106.3846\\-211.3803\\57\\106.9713\\-209.4271\\57\\109.0988\\-207.5978\\57\\111.0519\\-208.5436\\57\\112.4792\\-209.4271\\57\\113.005\\-210.4953\\57\\113.2492\\-211.3803\\57\\112.6754\\-213.3334\\57\\111.0519\\-214.4531\\57\\109.0988\\-214.4628\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "563" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "113.005\\-197.7898\\57\\111.2648\\-195.7553\\57\\110.8855\\-193.8021\\57\\110.3773\\-189.8959\\57\\110.203\\-187.9428\\57\\110.182\\-185.9896\\57\\109.6272\\-184.0365\\57\\108.7097\\-182.0834\\57\\108.6673\\-180.1303\\57\\107.8044\\-178.1771\\57\\106.7804\\-176.224\\57\\106.7092\\-174.2709\\57\\105.9117\\-172.3178\\57\\104.8381\\-170.3646\\57\\104.7545\\-168.4115\\57\\103.2394\\-165.9939\\57\\101.5462\\-162.5521\\57\\100.1316\\-160.599\\57\\99.69697\\-158.6459\\57\\98.38313\\-156.6928\\57\\98.22852\\-154.7396\\57\\100.1426\\-152.7865\\57\\101.2863\\-151.0477\\57\\103.2394\\-149.8434\\57\\105.1793\\-150.8334\\57\\107.1457\\-152.3463\\57\\109.0988\\-153.2748\\57\\111.1237\\-154.7396\\57\\113.0559\\-156.6928\\57\\114.9582\\-158.5009\\57\\117.3593\\-160.599\\57\\118.4512\\-162.5521\\57\\118.5086\\-164.5053\\57\\119.5811\\-166.4584\\57\\121.0069\\-168.4115\\57\\122.8594\\-172.3178\\57\\123.0053\\-174.2709\\57\\122.5015\\-176.224\\57\\122.4994\\-178.1771\\57\\122.8573\\-180.1303\\57\\122.7788\\-182.0834\\57\\122.2081\\-184.0365\\57\\120.8175\\-186.6976\\57\\120.4373\\-187.9428\\57\\118.8644\\-190.8267\\57\\118.445\\-191.849\\57\\118.2116\\-193.8021\\57\\117.7492\\-195.7553\\57\\116.9113\\-196.651\\57\\114.9582\\-198.1654\\57" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "13" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "564" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-115.5106\\-188.0628\\59\\-116.8093\\-185.9896\\59\\-117.4637\\-185.1758\\59\\-117.9774\\-184.0365\\59\\-117.4637\\-182.991\\59\\-116.2583\\-182.0834\\59\\-115.5106\\-181.7095\\59\\-114.2514\\-182.0834\\59\\-113.5575\\-182.6693\\59\\-113.0878\\-184.0365\\59\\-112.6028\\-185.9896\\59\\-112.6312\\-187.9428\\59\\-113.5575\\-188.7715\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "25" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "565" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.7427\\-172.3178\\59\\-115.4032\\-170.3646\\59\\-115.6592\\-168.4115\\59\\-115.3069\\-166.4584\\59\\-114.1964\\-162.5521\\59\\-111.772\\-158.6459\\59\\-107.9104\\-154.7396\\59\\-106.3934\\-152.7865\\59\\-103.7918\\-150.205\\59\\-101.8387\\-148.9039\\59\\-99.8856\\-148.2484\\59\\-99.29351\\-148.8803\\59\\-98.84556\\-150.8334\\59\\-98.2143\\-152.7865\\59\\-98.02721\\-154.7396\\59\\-98.7999\\-156.6928\\59\\-101.8476\\-160.599\\59\\-102.9691\\-162.5521\\59\\-103.7918\\-163.8111\\59\\-106.001\\-166.4584\\59\\-107.6981\\-169.2029\\59\\-108.2372\\-170.3646\\59\\-109.4961\\-172.3178\\59\\-109.6512\\-172.9107\\59\\-111.6043\\-173.6583\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "566" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-82.30747\\-138.0869\\59\\-83.31659\\-137.1615\\59\\-84.20842\\-135.2084\\59\\-84.0368\\-133.2553\\59\\-83.04121\\-131.3021\\59\\-80.35435\\-128.3569\\59\\-75.47153\\-123.4896\\59\\-74.06451\\-121.5365\\59\\-73.00381\\-119.5834\\59\\-69.51916\\-115.6771\\59\\-68.15342\\-113.724\\59\\-67.02361\\-111.7709\\59\\-64.72935\\-109.0951\\59\\-63.85044\\-107.8646\\59\\-63.01195\\-105.9115\\59\\-62.36983\\-103.9584\\59\\-62.27938\\-102.0053\\59\\-61.48739\\-100.0521\\59\\-60.8231\\-99.43452\\59\\-58.86998\\-98.76606\\59\\-56.91685\\-97.32903\\59\\-54.96373\\-96.42985\\59\\-53.0106\\-96.9811\\59\\-52.39045\\-98.09901\\59\\-51.74002\\-100.0521\\59\\-51.05748\\-100.6625\\59\\-50.01532\\-102.0053\\59\\-48.07536\\-103.9584\\59\\-46.94894\\-105.9115\\59\\-47.82645\\-107.8646\\59\\-49.7305\\-109.8178\\59\\-54.96373\\-114.9295\\59\\-57.53114\\-117.6303\\59\\-58.19268\\-119.5834\\59\\-58.65827\\-121.5365\\59\\-58.69559\\-123.4896\\59\\-59.05698\\-125.4428\\59\\-60.26022\\-127.3959\\59\\-60.8231\\-127.8962\\59\\-62.84711\\-129.349\\59\\-62.95933\\-131.3021\\59\\-62.66486\\-133.2553\\59\\-64.72935\\-133.9227\\59\\-67.17075\\-135.2084\\59\\-68.6356\\-135.8706\\59\\-70.58872\\-136.5042\\59\\-74.49497\\-136.0629\\59\\-76.4481\\-136.4898\\59\\-78.40122\\-137.733\\59\\-80.35435\\-138.3783\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "567" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.31752\\-215.4493\\59\\56.3644\\-214.9825\\59\\54.41127\\-214.8189\\59\\52.45815\\-214.096\\59\\50.50502\\-212.8054\\59\\48.5519\\-212.1182\\59\\46.59877\\-210.4085\\59\\43.69069\\-207.474\\59\\42.3357\\-205.5209\\59\\42.3357\\-203.5678\\59\\41.61116\\-201.6146\\59\\40.7394\\-200.7513\\59\\39.17176\\-201.6146\\59\\38.78627\\-201.969\\59\\37.80488\\-203.5678\\59\\36.83315\\-204.5206\\59\\35.74265\\-203.5678\\59\\36.83315\\-201.5434\\59\\37.74559\\-199.6615\\59\\39.61868\\-197.7084\\59\\40.50368\\-195.7553\\59\\41.63691\\-193.8021\\59\\42.346\\-191.849\\59\\43.45207\\-189.8959\\59\\45.4502\\-187.9428\\59\\46.59877\\-186.9662\\59\\48.5519\\-185.8152\\59\\50.50502\\-185.8026\\59\\52.45815\\-185.1382\\59\\54.41127\\-184.7287\\59\\56.3644\\-185.2207\\59\\58.31752\\-185.8676\\59\\60.27065\\-187.0801\\59\\64.1769\\-190.444\\59\\67.30521\\-191.849\\59\\68.08315\\-192.3425\\59\\70.03628\\-194.2677\\59\\72.29816\\-197.7084\\59\\72.97164\\-199.6615\\59\\73.94253\\-200.6324\\59\\75.89565\\-201.9965\\59\\77.36342\\-203.5678\\59\\75.89565\\-205.6023\\59\\73.94253\\-205.8051\\59\\71.99789\\-207.474\\59\\70.77996\\-209.4271\\59\\68.8995\\-211.3803\\59\\66.13003\\-213.9958\\59\\64.1769\\-214.6074\\59\\62.22377\\-215.0718\\59\\60.27065\\-215.7367\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "568" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "66.13003\\-133.467\\59\\64.1769\\-132.5329\\59\\60.27065\\-131.5044\\59\\58.31752\\-130.5988\\59\\54.41127\\-129.8493\\59\\52.88194\\-129.349\\59\\50.50502\\-128.3725\\59\\49.53407\\-127.3959\\59\\47.87188\\-125.4428\\59\\47.90942\\-123.4896\\59\\48.11721\\-121.5365\\59\\47.36923\\-119.5834\\59\\46.1734\\-117.6303\\59\\45.38562\\-115.6771\\59\\41.45285\\-111.7709\\59\\39.68587\\-109.8178\\59\\39.3745\\-107.8646\\59\\40.0391\\-105.9115\\59\\40.7394\\-105.0863\\59\\45.78243\\-100.0521\\59\\46.59877\\-99.45161\\59\\50.50502\\-99.30975\\59\\52.45815\\-99.6133\\59\\52.97175\\-100.0521\\59\\54.7578\\-103.9584\\59\\55.52236\\-105.9115\\59\\56.99943\\-107.8646\\59\\58.79999\\-109.8178\\59\\59.61066\\-111.7709\\59\\61.02788\\-113.724\\59\\63.14532\\-115.6771\\59\\64.1769\\-117.0504\\59\\66.13003\\-119.1433\\59\\70.03628\\-123.0563\\59\\72.9369\\-125.4428\\59\\74.89597\\-127.3959\\59\\76.60951\\-129.349\\59\\76.44379\\-131.3021\\59\\73.94253\\-133.9996\\59\\71.9894\\-134.942\\59\\70.03628\\-134.5754\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "57" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "569" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "114.9582\\-198.5635\\59\\113.2231\\-197.7084\\59\\112.2065\\-195.7553\\59\\112.1738\\-191.849\\59\\111.7973\\-189.8959\\59\\111.2761\\-187.9428\\59\\111.2221\\-185.9896\\59\\110.643\\-184.0365\\59\\110.2204\\-182.0834\\59\\110.1995\\-180.1303\\59\\109.6712\\-178.1771\\59\\108.7157\\-176.224\\59\\108.3914\\-174.2709\\59\\107.7212\\-172.3178\\59\\106.8481\\-170.3646\\59\\106.7689\\-168.4115\\59\\105.5425\\-166.4584\\59\\104.0621\\-164.5053\\59\\103.0718\\-162.5521\\59\\101.635\\-160.599\\59\\101.0615\\-158.6459\\59\\99.7663\\-156.6928\\59\\99.44497\\-154.7396\\59\\100.3423\\-152.7865\\59\\100.8424\\-150.8334\\59\\101.2863\\-150.2281\\59\\103.2394\\-148.5173\\59\\105.1925\\-149.038\\59\\107.1457\\-150.4002\\59\\109.0988\\-151.1643\\59\\111.0519\\-152.3877\\59\\113.005\\-153.2965\\59\\114.481\\-154.7396\\59\\114.9582\\-155.5031\\59\\116.1698\\-156.6928\\59\\116.9113\\-157.1426\\59\\118.8644\\-158.8438\\59\\120.2762\\-160.599\\59\\120.5463\\-162.5521\\59\\120.591\\-164.5053\\59\\121.3614\\-166.4584\\59\\123.0233\\-168.4115\\59\\123.8009\\-170.3646\\59\\124.7238\\-175.0196\\59\\125.0712\\-176.224\\59\\125.0493\\-178.1771\\59\\124.7763\\-180.1303\\59\\124.7553\\-182.0834\\59\\124.5499\\-185.9896\\59\\123.2158\\-187.9428\\59\\122.7707\\-188.2339\\59\\120.8175\\-190.4322\\59\\119.7304\\-191.849\\59\\119.2282\\-193.8021\\59\\119.3035\\-195.7553\\59\\118.8644\\-196.444\\59\\117.098\\-197.7084\\59" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "30" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "570" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-113.5575\\-169.5667\\61\\-114.1807\\-168.4115\\61\\-114.4153\\-166.4584\\61\\-114.0014\\-164.5053\\61\\-113.6929\\-162.5521\\61\\-112.9422\\-160.599\\61\\-111.6043\\-158.9096\\61\\-111.2501\\-158.6459\\61\\-109.4649\\-156.6928\\61\\-108.7501\\-154.7396\\61\\-107.6981\\-152.9691\\61\\-106.26\\-150.8334\\61\\-103.7918\\-148.355\\61\\-101.8387\\-147.1837\\61\\-99.8856\\-146.2306\\61\\-97.93247\\-146.0455\\61\\-97.50646\\-146.9271\\61\\-97.68156\\-148.8803\\61\\-98.20301\\-150.8334\\61\\-98.08109\\-152.7865\\61\\-98.82388\\-154.7396\\61\\-99.8856\\-156.189\\61\\-102.3309\\-158.6459\\61\\-103.7918\\-160.2911\\61\\-104.3259\\-160.599\\61\\-105.745\\-162.0879\\61\\-107.6981\\-165.1854\\61\\-108.2639\\-166.4584\\61\\-109.6512\\-168.8607\\61\\-111.5311\\-170.3646\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "571" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-82.30747\\-137.9058\\61\\-83.35047\\-137.1615\\61\\-84.2606\\-136.2871\\61\\-85.67119\\-135.2084\\61\\-85.11585\\-133.2553\\61\\-83.35229\\-131.3021\\61\\-81.84897\\-129.349\\61\\-80.46617\\-127.3959\\61\\-76.4481\\-123.3676\\61\\-73.39755\\-119.5834\\61\\-71.57054\\-117.6303\\61\\-70.12517\\-115.6771\\61\\-69.02495\\-113.724\\61\\-66.68247\\-111.1386\\61\\-65.60365\\-109.8178\\61\\-64.16064\\-107.8646\\61\\-62.33233\\-103.9584\\61\\-62.01391\\-102.0053\\61\\-60.8231\\-100.7299\\61\\-58.86998\\-99.24132\\61\\-54.96373\\-97.25881\\61\\-53.77568\\-98.09901\\61\\-53.53557\\-100.0521\\61\\-51.64204\\-102.0053\\61\\-49.28654\\-103.9584\\61\\-48.18953\\-105.9115\\61\\-48.09219\\-107.8646\\61\\-49.73826\\-109.8178\\61\\-57.71002\\-117.6303\\61\\-58.96472\\-119.5834\\61\\-59.44149\\-121.5365\\61\\-59.45258\\-123.4896\\61\\-59.64269\\-125.4428\\61\\-60.6053\\-127.3959\\61\\-62.48483\\-129.349\\61\\-61.60308\\-131.3021\\61\\-62.64773\\-133.2553\\61\\-66.68247\\-134.6328\\61\\-68.6356\\-135.9103\\61\\-70.58872\\-136.4859\\61\\-72.54185\\-136.8295\\61\\-76.4481\\-135.5449\\61\\-78.40122\\-136.3909\\61\\-80.35435\\-137.6835\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "572" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-212.5179\\61\\48.5519\\-211.3726\\61\\46.59877\\-210.4085\\61\\43.69069\\-207.474\\61\\42.3357\\-205.5209\\61\\42.3357\\-203.5678\\61\\41.19163\\-201.6146\\61\\40.7394\\-201.1961\\61\\38.78627\\-202.8874\\61\\36.83315\\-205.1005\\61\\34.88002\\-205.6029\\61\\34.77573\\-205.5209\\61\\35.20325\\-203.5678\\61\\36.83315\\-201.9263\\61\\37.26398\\-201.6146\\61\\37.83802\\-199.6615\\61\\39.62399\\-197.7084\\61\\40.50368\\-195.7553\\61\\41.63691\\-193.8021\\61\\42.3357\\-191.849\\61\\43.66439\\-189.8959\\61\\46.59877\\-186.9709\\61\\48.5519\\-185.8152\\61\\50.50502\\-185.7902\\61\\52.45815\\-185.1074\\61\\54.41127\\-184.7348\\61\\56.3644\\-185.1835\\61\\58.31752\\-185.8676\\61\\60.27065\\-187.085\\61\\64.1769\\-190.9659\\61\\65.27554\\-191.849\\61\\67.47593\\-193.8021\\61\\69.24829\\-195.7553\\61\\70.80082\\-197.7084\\61\\71.63245\\-199.6615\\61\\71.9894\\-200.069\\61\\73.94253\\-201.1882\\61\\75.89565\\-202.5746\\61\\76.83546\\-203.5678\\61\\76.55699\\-205.5209\\61\\75.89565\\-206.1146\\61\\73.94253\\-205.7462\\61\\71.9894\\-205.7669\\61\\70.03628\\-207.4428\\61\\68.82153\\-209.4271\\61\\66.13003\\-212.1661\\61\\64.1769\\-213.5512\\61\\62.22377\\-214.1983\\61\\60.27065\\-214.5606\\61\\56.3644\\-214.5777\\61\\54.41127\\-214.2772\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "573" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "69.67996\\-133.2553\\61\\68.08315\\-132.5561\\61\\64.1769\\-131.4242\\61\\62.22377\\-130.554\\61\\58.31752\\-129.5285\\61\\54.41127\\-128.6424\\61\\52.45815\\-128.0626\\61\\50.50502\\-126.9843\\61\\49.01284\\-125.4428\\61\\48.25893\\-123.4896\\61\\48.13596\\-121.5365\\61\\47.36923\\-119.5834\\61\\46.1734\\-117.6303\\61\\45.38562\\-115.6771\\61\\41.47802\\-111.7709\\61\\40.18544\\-109.8178\\61\\40.51178\\-107.8646\\61\\41.84772\\-105.9115\\61\\46.59877\\-101.145\\61\\48.5519\\-100.6336\\61\\50.50502\\-100.409\\61\\52.45815\\-101.0347\\61\\53.33276\\-102.0053\\61\\54.72609\\-103.9584\\61\\55.521\\-105.9115\\61\\56.99219\\-107.8646\\61\\58.9491\\-109.8178\\61\\60.29336\\-111.7709\\61\\61.48358\\-113.724\\61\\63.67159\\-115.6771\\61\\65.18204\\-117.6303\\61\\70.03628\\-122.5239\\61\\71.83839\\-123.4896\\61\\73.94253\\-124.9585\\61\\76.38796\\-127.3959\\61\\77.87403\\-129.349\\61\\77.23916\\-131.3021\\61\\75.89565\\-133.2963\\61\\73.94253\\-134.5377\\61\\71.9894\\-134.4384\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "574" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "114.9582\\-198.0675\\61\\114.4521\\-197.7084\\61\\113.3216\\-195.7553\\61\\112.883\\-193.8021\\61\\112.9074\\-189.8959\\61\\112.3743\\-185.9896\\61\\111.3435\\-182.0834\\61\\111.3082\\-180.1303\\61\\110.9853\\-178.1771\\61\\109.8442\\-174.2709\\61\\109.0761\\-172.3178\\61\\108.4047\\-168.4115\\61\\107.3022\\-166.4584\\61\\105.6228\\-164.5053\\61\\105.0018\\-162.5521\\61\\103.6037\\-160.599\\61\\103.1514\\-158.6459\\61\\101.7364\\-156.6928\\61\\100.7274\\-154.7396\\61\\100.6405\\-152.7865\\61\\100.8333\\-150.8334\\61\\101.4678\\-148.8803\\61\\103.2394\\-147.1394\\61\\105.1925\\-147.2144\\61\\107.1457\\-148.454\\61\\109.0988\\-149.1675\\61\\111.0519\\-150.3967\\61\\113.005\\-151.0921\\61\\114.9582\\-152.2664\\61\\116.7026\\-154.7396\\61\\118.8644\\-157.1878\\61\\120.8268\\-158.6459\\61\\122.7096\\-160.599\\61\\122.7137\\-164.5053\\61\\122.8088\\-166.4584\\61\\124.9275\\-170.3646\\61\\125.493\\-172.3178\\61\\125.7796\\-174.2709\\61\\126.9529\\-176.224\\61\\127.7191\\-178.1771\\61\\127.8705\\-180.1303\\61\\127.8852\\-182.0834\\61\\128.63\\-183.5482\\61\\129.0762\\-185.9896\\61\\128.63\\-187.166\\61\\127.9325\\-187.9428\\61\\126.9821\\-189.8959\\61\\126.6769\\-190.2038\\61\\124.6102\\-189.8959\\61\\122.7707\\-190.4609\\61\\120.8175\\-192.2567\\61\\119.9885\\-193.8021\\61\\119.8828\\-195.7553\\61\\118.8644\\-197.006\\61\\116.9113\\-197.5983\\61" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "9" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "575" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-111.6043\\-168.1959\\63\\-113.16\\-166.4584\\63\\-112.8271\\-164.5053\\63\\-112.8069\\-162.5521\\63\\-111.6043\\-160.4818\\63\\-109.6512\\-160.1921\\63\\-108.6747\\-160.599\\63\\-108.3084\\-162.5521\\63\\-109.6512\\-165.595\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "75" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "576" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-158.4628\\63\\-107.3915\\-156.6928\\63\\-107.8949\\-154.7396\\63\\-107.0042\\-150.8334\\63\\-106.192\\-148.8803\\63\\-103.7918\\-146.4839\\63\\-101.8387\\-145.166\\63\\-99.8856\\-144.3881\\63\\-98.0834\\-143.0209\\63\\-95.97935\\-141.0445\\63\\-94.02622\\-140.5857\\63\\-92.0731\\-138.981\\63\\-88.41099\\-135.2084\\63\\-86.21372\\-133.1399\\63\\-84.2606\\-131.1801\\63\\-83.07928\\-129.349\\63\\-81.3736\\-127.3959\\63\\-78.40122\\-124.654\\63\\-75.50254\\-121.5365\\63\\-74.00977\\-119.5834\\63\\-72.67828\\-117.6303\\63\\-71.04365\\-115.6771\\63\\-69.26582\\-113.724\\63\\-67.31233\\-111.7709\\63\\-65.99836\\-109.8178\\63\\-65.0571\\-107.8646\\63\\-63.48211\\-105.9115\\63\\-62.29661\\-103.9584\\63\\-61.66226\\-102.0053\\63\\-60.8231\\-101.2176\\63\\-58.86998\\-99.68514\\63\\-56.91685\\-98.64154\\63\\-54.96373\\-97.86329\\63\\-54.70081\\-98.09901\\63\\-53.83128\\-100.0521\\63\\-52.39351\\-102.0053\\63\\-50.22296\\-103.9584\\63\\-49.50128\\-105.9115\\63\\-48.92744\\-107.8646\\63\\-49.77958\\-109.8178\\63\\-51.7029\\-111.7709\\63\\-55.71532\\-115.6771\\63\\-57.85272\\-117.6303\\63\\-59.6208\\-119.5834\\63\\-60.08692\\-121.5365\\63\\-60.02025\\-123.4896\\63\\-59.73656\\-125.4428\\63\\-59.97461\\-127.3959\\63\\-61.44081\\-129.349\\63\\-62.02985\\-131.3021\\63\\-62.77623\\-131.9763\\63\\-64.72935\\-132.4932\\63\\-66.68247\\-133.7606\\63\\-68.6356\\-134.4646\\63\\-70.58872\\-135.764\\63\\-72.54185\\-136.4498\\63\\-74.49497\\-136.741\\63\\-75.60588\\-135.2084\\63\\-76.4481\\-134.3289\\63\\-78.40122\\-134.8192\\63\\-80.35435\\-136.3615\\63\\-82.30747\\-137.409\\63\\-84.2606\\-137.3359\\63\\-86.21372\\-137.3956\\63\\-88.16685\\-139.168\\63\\-90.11997\\-139.9716\\63\\-93.18638\\-143.0209\\63\\-94.02622\\-143.4724\\63\\-95.97935\\-145.3858\\63\\-96.6422\\-146.9271\\63\\-97.0855\\-148.8803\\63\\-99.16798\\-152.7865\\63\\-99.8856\\-153.888\\63\\-101.8387\\-155.7923\\63\\-103.7918\\-157.5191\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "577" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-213.4281\\63\\50.50502\\-212.5071\\63\\48.5519\\-211.2718\\63\\46.59877\\-210.4085\\63\\43.69069\\-207.474\\63\\42.3357\\-205.5209\\63\\42.3357\\-203.5678\\63\\40.79733\\-201.6146\\63\\40.67429\\-201.6146\\63\\38.6605\\-203.5678\\63\\37.46844\\-205.5209\\63\\36.83315\\-206.1701\\63\\34.88002\\-206.5412\\63\\33.57233\\-205.5209\\63\\34.59734\\-203.5678\\63\\36.83315\\-202.2277\\63\\37.53158\\-201.6146\\63\\38.02944\\-199.6615\\63\\39.62925\\-197.7084\\63\\40.50368\\-195.7553\\63\\41.63691\\-193.8021\\63\\42.3357\\-191.849\\63\\43.66439\\-189.8959\\63\\46.59877\\-186.9851\\63\\48.5519\\-185.841\\63\\50.50502\\-185.8026\\63\\52.45815\\-185.4843\\63\\54.41127\\-185.3611\\63\\56.3644\\-185.4843\\63\\58.31752\\-185.9089\\63\\60.27065\\-187.0938\\63\\67.05598\\-193.8021\\63\\68.08315\\-195.7083\\63\\70.33286\\-199.6615\\63\\71.9894\\-201.1725\\63\\73.94253\\-202.1061\\63\\75.39468\\-203.5678\\63\\74.84728\\-205.5209\\63\\73.94253\\-205.9103\\63\\71.9894\\-205.2169\\63\\70.03628\\-205.7116\\63\\68.08315\\-207.3245\\63\\66.495\\-209.4271\\63\\64.88036\\-211.3803\\63\\64.1769\\-211.9607\\63\\62.22377\\-212.8451\\63\\60.27065\\-213.5686\\63\\58.31752\\-213.7904\\63\\56.3644\\-213.7904\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "578" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "73.94253\\-133.9639\\63\\71.9894\\-132.8632\\63\\70.03628\\-132.0603\\63\\68.08315\\-131.4242\\63\\66.13003\\-130.4782\\63\\64.1769\\-129.7349\\63\\62.22377\\-129.3717\\63\\60.27065\\-128.5733\\63\\58.31752\\-128.0581\\63\\54.41127\\-127.4656\\63\\52.45815\\-126.558\\63\\50.50502\\-124.9902\\63\\49.3796\\-123.4896\\63\\47.39071\\-119.5834\\63\\46.19238\\-117.6303\\63\\45.38562\\-115.6771\\63\\42.69252\\-112.9273\\63\\41.66576\\-111.7709\\63\\41.38868\\-109.8178\\63\\42.06026\\-107.8646\\63\\42.69252\\-107.0627\\63\\46.59877\\-103.1527\\63\\48.5519\\-101.8055\\63\\50.50502\\-101.087\\63\\52.45815\\-101.6461\\63\\54.6931\\-103.9584\\63\\55.48501\\-105.9115\\63\\56.98487\\-107.8646\\63\\58.94188\\-109.8178\\63\\62.22377\\-113.3223\\63\\64.73916\\-115.6771\\63\\66.13003\\-117.249\\63\\70.03628\\-121.0711\\63\\73.94253\\-123.3935\\63\\77.84878\\-127.2584\\63\\79.91204\\-129.349\\63\\79.38874\\-131.3021\\63\\77.84878\\-132.3941\\63\\77.12567\\-133.2553\\63\\75.89565\\-134.0691\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "579" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "114.9582\\-195.872\\63\\113.8991\\-193.8021\\63\\113.7558\\-191.849\\63\\114.171\\-189.8959\\63\\114.164\\-187.9428\\63\\113.8335\\-185.9896\\63\\113.0726\\-184.0365\\63\\112.4231\\-180.1303\\63\\112.2156\\-178.1771\\63\\111.8848\\-176.224\\63\\111.1339\\-174.2709\\63\\110.3739\\-170.3646\\63\\109.818\\-168.4115\\63\\108.2551\\-166.4584\\63\\107.2964\\-164.5053\\63\\106.9803\\-162.5521\\63\\105.624\\-160.599\\63\\105.1689\\-158.6459\\63\\103.7277\\-156.6928\\63\\102.1624\\-154.7396\\63\\101.7599\\-152.7865\\63\\101.2341\\-150.8334\\63\\100.8516\\-148.8803\\63\\101.3634\\-146.9271\\63\\100.9608\\-144.974\\63\\101.2863\\-143.7607\\63\\103.2394\\-144.7853\\63\\105.1925\\-145.1676\\63\\107.1457\\-146.4839\\63\\109.0988\\-147.1525\\63\\111.0519\\-148.3958\\63\\113.005\\-149.0872\\63\\114.9582\\-149.2635\\63\\116.4893\\-150.8334\\63\\116.8713\\-152.7865\\63\\117.9087\\-154.7396\\63\\118.8644\\-155.8098\\63\\120.8175\\-157.2834\\63\\123.4347\\-158.6459\\63\\124.7238\\-159.9524\\63\\125.1435\\-160.599\\63\\124.9867\\-162.5521\\63\\124.201\\-164.5053\\63\\123.9286\\-166.4584\\63\\124.7238\\-167.9628\\63\\126.4385\\-170.3646\\63\\126.7862\\-172.3178\\63\\126.9718\\-174.2709\\63\\127.7788\\-176.224\\63\\129.4036\\-178.1771\\63\\129.6958\\-180.1303\\63\\129.7053\\-182.0834\\63\\129.8941\\-184.0365\\63\\129.9236\\-185.9896\\63\\129.1987\\-187.9428\\63\\127.9061\\-189.8959\\63\\126.6769\\-191.2031\\63\\124.7238\\-191.3278\\63\\122.7707\\-192.1153\\63\\120.8714\\-193.8021\\63\\118.8644\\-195.9871\\63\\116.9113\\-196.545\\63" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "71" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "580" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-154.6176\\65\\-106.7688\\-152.7865\\65\\-106.9422\\-150.8334\\65\\-106.914\\-148.8803\\65\\-105.8147\\-146.9271\\65\\-103.7918\\-144.8622\\65\\-101.8387\\-143.5942\\65\\-99.8856\\-142.5844\\65\\-97.93247\\-140.7039\\65\\-95.97935\\-139.7006\\65\\-94.02622\\-138.2869\\65\\-92.66909\\-137.1615\\65\\-90.11997\\-134.6069\\65\\-88.16685\\-133.2476\\65\\-86.21372\\-132.1466\\65\\-85.37422\\-131.3021\\65\\-83.80487\\-129.349\\65\\-82.47636\\-127.3959\\65\\-79.88065\\-125.4428\\65\\-78.06242\\-123.4896\\65\\-75.21043\\-119.5834\\65\\-73.50376\\-117.6303\\65\\-67.67513\\-111.7709\\65\\-66.43499\\-109.8178\\65\\-65.32808\\-107.8646\\65\\-63.69056\\-105.9115\\65\\-62.77623\\-104.3308\\65\\-61.18118\\-102.0053\\65\\-60.8231\\-101.6587\\65\\-58.86998\\-100.8345\\65\\-56.91685\\-100.1553\\65\\-54.96373\\-100.2677\\65\\-53.79014\\-102.0053\\65\\-53.0106\\-102.5471\\65\\-51.57305\\-103.9584\\65\\-50.38139\\-107.8646\\65\\-50.06597\\-109.8178\\65\\-51.71413\\-111.7709\\65\\-53.71648\\-113.724\\65\\-55.82243\\-115.6771\\65\\-56.91685\\-116.5388\\65\\-58.86998\\-117.5769\\65\\-60.0944\\-119.5834\\65\\-60.83073\\-121.5365\\65\\-60.78495\\-123.4896\\65\\-59.35244\\-125.4428\\65\\-59.67282\\-127.3959\\65\\-60.8231\\-128.7553\\65\\-62.77623\\-130.7872\\65\\-64.72935\\-131.9307\\65\\-66.68247\\-132.8478\\65\\-68.6356\\-133.9578\\65\\-70.58872\\-134.4774\\65\\-72.54185\\-135.2008\\65\\-74.49497\\-136.2887\\65\\-76.4481\\-134.5899\\65\\-78.40122\\-134.0505\\65\\-80.35435\\-134.7939\\65\\-82.30747\\-136.3253\\65\\-84.2606\\-137.409\\65\\-86.21372\\-138.1381\\65\\-88.16685\\-139.6\\65\\-90.11997\\-140.8515\\65\\-92.30166\\-143.0209\\65\\-94.02622\\-144.3947\\65\\-96.57402\\-146.9271\\65\\-97.64086\\-148.8803\\65\\-99.22699\\-150.8334\\65\\-99.8856\\-151.5186\\65\\-101.6134\\-152.7865\\65\\-103.7918\\-154.5063\\65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "581" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-212.0713\\65\\46.59877\\-210.4085\\65\\43.69069\\-207.474\\65\\42.3357\\-205.5209\\65\\42.3357\\-203.5678\\65\\40.79733\\-201.6146\\65\\40.67429\\-201.6146\\65\\38.6605\\-203.5678\\65\\37.6721\\-205.5209\\65\\36.83315\\-206.3956\\65\\34.88002\\-206.6246\\65\\33.68754\\-205.5209\\65\\34.88002\\-203.8614\\65\\37.26133\\-201.6146\\65\\37.85279\\-199.6615\\65\\39.62399\\-197.7084\\65\\40.50368\\-195.7553\\65\\41.63691\\-193.8021\\65\\42.3357\\-191.849\\65\\43.66439\\-189.8959\\65\\46.59877\\-187.093\\65\\48.5519\\-186.3279\\65\\50.50502\\-185.841\\65\\56.3644\\-185.8152\\65\\58.31752\\-186.3815\\65\\60.27065\\-187.1496\\65\\63.13189\\-189.8959\\65\\67.05598\\-193.8021\\65\\68.1213\\-197.7084\\65\\69.02174\\-199.6615\\65\\70.03628\\-200.6649\\65\\71.9894\\-202.0585\\65\\73.94253\\-203.3193\\65\\73.94253\\-204.0646\\65\\72.60369\\-205.5209\\65\\71.9894\\-205.78\\65\\70.03628\\-205.2061\\65\\68.08315\\-205.3077\\65\\66.13003\\-207.217\\65\\64.1769\\-209.5698\\65\\62.53269\\-211.3803\\65\\60.27065\\-212.4293\\65\\58.31752\\-212.9174\\65\\52.45815\\-212.9367\\65\\50.50502\\-212.7872\\65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "582" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "75.89565\\-133.7521\\65\\73.94253\\-132.5635\\65\\71.9894\\-131.8375\\65\\70.03628\\-130.657\\65\\68.08315\\-130.0643\\65\\66.13003\\-128.8946\\65\\64.1769\\-128.1438\\65\\60.27065\\-127.4188\\65\\58.31752\\-126.6113\\65\\56.3644\\-126.0691\\65\\54.41127\\-125.7389\\65\\52.45815\\-124.8925\\65\\50.50502\\-123.0895\\65\\48.5519\\-120.9092\\65\\47.58477\\-119.5834\\65\\46.59877\\-117.7109\\65\\45.41793\\-115.6771\\65\\43.65527\\-113.724\\65\\42.33107\\-111.7709\\65\\42.53948\\-109.8178\\65\\43.88784\\-107.8646\\65\\46.59877\\-105.1442\\65\\50.50502\\-102.6649\\65\\52.45815\\-102.6024\\65\\54.41127\\-103.6975\\65\\54.67036\\-103.9584\\65\\55.48405\\-105.9115\\65\\57.01011\\-107.8646\\65\\58.95972\\-109.8178\\65\\61.0113\\-111.7709\\65\\62.22377\\-112.7841\\65\\64.1769\\-114.691\\65\\66.13003\\-116.2986\\65\\68.08315\\-117.6068\\65\\71.9894\\-120.7257\\65\\73.94253\\-122.5237\\65\\77.84878\\-126.3866\\65\\81.15725\\-129.349\\65\\81.75503\\-130.8434\\65\\82.22077\\-131.3021\\65\\82.34862\\-133.2553\\65\\81.75503\\-133.6434\\65\\79.6734\\-133.2553\\65\\77.84878\\-133.6806\\65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "59" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "583" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "116.9113\\-194.2482\\65\\116.3554\\-193.8021\\65\\115.1841\\-191.849\\65\\115.3645\\-189.8959\\65\\115.3645\\-187.9428\\65\\114.708\\-184.0365\\65\\114.6757\\-182.0834\\65\\113.4304\\-178.1771\\65\\113.1271\\-176.224\\65\\112.3352\\-172.3178\\65\\111.8184\\-170.3646\\65\\111.0746\\-168.4115\\65\\109.7037\\-166.4584\\65\\108.926\\-164.5053\\65\\108.4655\\-162.5521\\65\\107.6023\\-160.599\\65\\107.1457\\-159.8342\\65\\105.6605\\-156.6928\\65\\103.7769\\-154.7396\\65\\102.7094\\-152.7865\\65\\102.0706\\-150.8334\\65\\101.2863\\-148.8137\\65\\100.798\\-146.9271\\65\\100.0774\\-144.974\\65\\99.54241\\-143.0209\\65\\101.2863\\-141.1102\\65\\103.2394\\-142.6732\\65\\105.1925\\-143.5853\\65\\107.1457\\-144.6195\\65\\109.0988\\-145.134\\65\\111.0519\\-146.117\\65\\113.005\\-146.9887\\65\\116.9113\\-147.2856\\65\\118.1226\\-148.8803\\65\\118.0843\\-150.8334\\65\\118.3073\\-152.7865\\65\\119.3298\\-154.7396\\65\\120.8175\\-155.8598\\65\\122.7707\\-157.1181\\65\\124.7238\\-157.8426\\65\\125.5727\\-158.6459\\65\\126.9917\\-160.599\\65\\126.8123\\-162.5521\\65\\125.9716\\-164.5053\\65\\125.4381\\-166.4584\\65\\127.1074\\-168.4115\\65\\127.9494\\-170.3646\\65\\127.7625\\-172.3178\\65\\127.7625\\-174.2709\\65\\128.3825\\-176.224\\65\\129.6413\\-178.1771\\65\\129.761\\-180.1303\\65\\129.7494\\-184.0365\\65\\129.1559\\-185.9896\\65\\128.63\\-186.816\\65\\127.1409\\-189.8959\\65\\126.6769\\-190.3953\\65\\124.6511\\-191.849\\65\\120.8175\\-194.2286\\65" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "66" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "584" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-151.2519\\67\\-106.6428\\-148.8803\\67\\-106.2212\\-146.9271\\67\\-104.7447\\-144.974\\67\\-103.7918\\-143.9463\\67\\-101.8387\\-142.1671\\67\\-97.93247\\-139.1068\\67\\-95.97935\\-138.2699\\67\\-94.57886\\-137.1615\\67\\-92.0731\\-134.6381\\67\\-90.11997\\-132.8018\\67\\-88.16685\\-131.9716\\67\\-86.21372\\-130.5845\\67\\-83.3773\\-127.3959\\67\\-81.26292\\-125.4428\\67\\-78.40122\\-122.566\\67\\-77.4922\\-121.5365\\67\\-74.59043\\-117.6303\\67\\-70.58872\\-113.6843\\67\\-68.58219\\-111.7709\\67\\-65.386\\-107.8646\\67\\-64.72935\\-106.965\\67\\-62.7841\\-103.9584\\67\\-60.8231\\-102.7073\\67\\-58.86998\\-102.348\\67\\-56.91685\\-102.2943\\67\\-54.96373\\-102.8393\\67\\-53.26017\\-103.9584\\67\\-52.70728\\-105.9115\\67\\-52.04046\\-107.8646\\67\\-51.05748\\-109.7802\\67\\-51.8056\\-111.7709\\67\\-53.0106\\-112.8116\\67\\-54.96373\\-114.6601\\67\\-56.91685\\-116.2073\\67\\-58.86998\\-116.8203\\67\\-59.67232\\-117.6303\\67\\-60.38841\\-119.5834\\67\\-61.50722\\-121.5365\\67\\-62.77623\\-123.4349\\67\\-62.77623\\-123.6605\\67\\-60.8231\\-124.7845\\67\\-60.0225\\-125.4428\\67\\-59.98378\\-127.3959\\67\\-62.77623\\-130.2525\\67\\-64.72935\\-131.4507\\67\\-66.68247\\-132.5256\\67\\-68.6356\\-133.7935\\67\\-70.58872\\-133.657\\67\\-72.54185\\-133.9241\\67\\-74.49497\\-134.7404\\67\\-76.4481\\-135.2006\\67\\-78.40122\\-134.3248\\67\\-80.35435\\-134.0356\\67\\-82.30747\\-134.7476\\67\\-84.2606\\-136.3005\\67\\-86.21372\\-137.5989\\67\\-88.16685\\-138.5378\\67\\-88.7757\\-139.1146\\67\\-91.1926\\-141.0678\\67\\-97.06752\\-146.9271\\67\\-97.93247\\-147.8615\\67\\-99.18277\\-148.8803\\67\\-100.8684\\-150.8334\\67\\-101.8387\\-151.6697\\67\\-103.7918\\-152.4929\\67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "585" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-212.3467\\67\\43.69069\\-207.474\\67\\42.3357\\-205.5209\\67\\42.3357\\-203.5678\\67\\40.79733\\-201.6146\\67\\40.67429\\-201.6146\\67\\38.59381\\-203.5678\\67\\37.66188\\-205.5209\\67\\36.83315\\-206.3812\\67\\34.88002\\-206.7894\\67\\33.78938\\-205.5209\\67\\35.60873\\-203.5678\\67\\36.83315\\-201.5231\\67\\37.67612\\-199.6615\\67\\39.61868\\-197.7084\\67\\40.5524\\-195.7553\\67\\41.64687\\-193.8021\\67\\42.3357\\-191.849\\67\\43.67378\\-189.8959\\67\\44.64565\\-188.9287\\67\\46.59877\\-187.4545\\67\\50.50502\\-186.3173\\67\\52.45815\\-185.8026\\67\\56.3644\\-185.841\\67\\58.31752\\-186.8752\\67\\60.27065\\-187.4208\\67\\62.22377\\-189.0148\\67\\67.05598\\-193.8021\\67\\67.60354\\-195.7553\\67\\67.6123\\-197.7084\\67\\68.1216\\-199.6615\\67\\70.56822\\-201.6146\\67\\71.9894\\-202.6251\\67\\72.89543\\-203.5678\\67\\72.78532\\-205.5209\\67\\71.9894\\-206.2381\\67\\70.03628\\-205.8485\\67\\68.08315\\-204.6452\\67\\66.13003\\-205.5125\\67\\65.07094\\-207.474\\67\\62.22377\\-210.6942\\67\\60.27065\\-212.3995\\67\\58.31752\\-212.927\\67\\50.50502\\-212.9367\\67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "41" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "586" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "77.84878\\-132.9847\\67\\75.89565\\-132.4384\\67\\73.86964\\-131.3021\\67\\70.03628\\-129.8524\\67\\68.08315\\-128.5466\\67\\65.91772\\-127.3959\\67\\64.1769\\-126.7211\\67\\62.22377\\-126.2642\\67\\60.27065\\-126.0432\\67\\58.31752\\-125.4815\\67\\56.3644\\-124.5455\\67\\52.45815\\-122.9112\\67\\50.50502\\-121.4962\\67\\48.5519\\-119.2913\\67\\47.44772\\-117.6303\\67\\45.6817\\-115.6771\\67\\44.1231\\-111.7709\\67\\44.47186\\-109.8178\\67\\45.88047\\-107.8646\\67\\47.81746\\-105.9115\\67\\48.5519\\-105.3455\\67\\50.50502\\-104.4284\\67\\52.45815\\-103.2802\\67\\53.70377\\-103.9584\\67\\54.41127\\-104.5362\\67\\55.33328\\-105.9115\\67\\60.27065\\-110.8146\\67\\64.12431\\-113.724\\67\\66.50562\\-115.6771\\67\\69.31638\\-117.6303\\67\\70.03628\\-118.2542\\67\\71.9894\\-119.5308\\67\\74.09338\\-121.5365\\67\\76.42092\\-123.4896\\67\\80.39399\\-127.3959\\67\\81.75503\\-128.4762\\67\\83.70815\\-130.3753\\67\\84.81889\\-131.3021\\67\\84.605\\-133.2553\\67\\83.70815\\-133.9528\\67\\81.75503\\-134.4304\\67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "59" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "587" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "120.8175\\-192.0474\\67\\119.7596\\-191.849\\67\\118.8644\\-191.3119\\67\\117.1985\\-189.8959\\67\\116.968\\-187.9428\\67\\116.8486\\-185.9896\\67\\116.9381\\-182.0834\\67\\114.7279\\-178.1771\\67\\114.3304\\-176.224\\67\\114.1804\\-174.2709\\67\\113.7829\\-172.3178\\67\\112.3859\\-168.4115\\67\\111.5611\\-166.4584\\67\\110.4485\\-164.5053\\67\\109.2615\\-160.599\\67\\106.7245\\-156.6928\\67\\105.7209\\-154.7396\\67\\104.1575\\-152.7865\\67\\102.8425\\-150.8334\\67\\101.2863\\-146.9633\\67\\100.089\\-144.974\\67\\99.04018\\-143.0209\\67\\99.661\\-141.0678\\67\\99.27932\\-139.1146\\67\\101.2863\\-138.9708\\67\\103.2394\\-140.6639\\67\\107.1457\\-142.9679\\67\\111.0519\\-143.2704\\67\\113.005\\-144.808\\67\\114.9582\\-145.1628\\67\\116.9113\\-145.2081\\67\\118.8644\\-145.6334\\67\\120.8175\\-146.7548\\67\\120.9285\\-146.9271\\67\\119.9234\\-148.8803\\67\\119.3174\\-150.8334\\67\\119.7811\\-152.7865\\67\\120.8175\\-154.1713\\67\\122.7707\\-155.4841\\67\\124.7238\\-156.4668\\67\\126.7456\\-158.6459\\67\\127.7427\\-160.599\\67\\127.7553\\-162.5521\\67\\127.5873\\-164.5053\\67\\127.718\\-166.4584\\67\\128.63\\-167.5619\\67\\129.1418\\-168.4115\\67\\128.7797\\-170.3646\\67\\127.9672\\-172.3178\\67\\127.9672\\-174.2709\\67\\128.1081\\-176.224\\67\\128.3808\\-178.1771\\67\\128.4403\\-182.0834\\67\\128.3548\\-184.0365\\67\\126.9573\\-185.9896\\67\\126.6769\\-187.1225\\67\\126.2667\\-187.9428\\67\\124.7973\\-189.8959\\67\\122.7707\\-191.9051\\67" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "63" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "588" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-150.8094\\69\\-105.415\\-148.8803\\69\\-105.3985\\-146.9271\\69\\-105.0101\\-144.974\\69\\-104.2965\\-143.0209\\69\\-103.7918\\-142.4512\\69\\-99.8856\\-138.608\\69\\-97.93247\\-137.2354\\69\\-95.97935\\-136.5332\\69\\-92.68539\\-133.2553\\69\\-92.0731\\-132.7232\\69\\-90.11997\\-131.7657\\69\\-88.16685\\-130.4532\\69\\-84.2606\\-127.1607\\69\\-80.35435\\-123.1685\\69\\-78.8895\\-121.5365\\69\\-77.28595\\-119.5834\\69\\-74.49497\\-116.6283\\69\\-71.56528\\-113.724\\69\\-69.28867\\-111.7709\\69\\-66.68247\\-109.1441\\69\\-65.65111\\-107.8646\\69\\-64.44753\\-105.9115\\69\\-62.77623\\-104.3453\\69\\-60.8231\\-103.4241\\69\\-58.86998\\-103.1039\\69\\-56.91685\\-103.6902\\69\\-56.42223\\-103.9584\\69\\-54.96373\\-105.4169\\69\\-53.63588\\-107.8646\\69\\-52.44152\\-109.8178\\69\\-52.35732\\-111.7709\\69\\-53.0106\\-112.3314\\69\\-54.96373\\-113.5834\\69\\-56.91685\\-115.3875\\69\\-59.09534\\-117.6303\\69\\-60.30341\\-119.5834\\69\\-62.77623\\-122.0763\\69\\-64.72935\\-123.0977\\69\\-65.94507\\-123.4896\\69\\-64.58984\\-125.4428\\69\\-62.77623\\-126.1481\\69\\-61.47204\\-127.3959\\69\\-63.07733\\-129.349\\69\\-65.98246\\-131.3021\\69\\-66.68247\\-131.8753\\69\\-68.6356\\-132.8114\\69\\-70.58872\\-132.4126\\69\\-72.54185\\-132.5384\\69\\-74.49497\\-133.7702\\69\\-76.4481\\-134.4543\\69\\-78.40122\\-134.9115\\69\\-80.35435\\-134.0636\\69\\-82.30747\\-133.7102\\69\\-84.2606\\-134.6836\\69\\-86.21372\\-136.2743\\69\\-88.16685\\-138.0266\\69\\-90.11997\\-138.9751\\69\\-92.0731\\-140.3745\\69\\-97.93247\\-146.1834\\69\\-99.8856\\-147.4889\\69\\-101.241\\-148.8803\\69\\-101.8387\\-149.6865\\69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "589" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-212.3316\\69\\44.64565\\-208.4686\\69\\43.69069\\-207.474\\69\\42.3357\\-205.5209\\69\\42.28613\\-203.5678\\69\\40.7394\\-201.6373\\69\\38.78627\\-202.9778\\69\\38.27753\\-203.5678\\69\\37.47207\\-205.5209\\69\\36.83315\\-206.1882\\69\\34.88002\\-206.9419\\69\\33.6935\\-205.5209\\69\\35.7007\\-203.5678\\69\\37.67888\\-199.6615\\69\\39.63324\\-197.7084\\69\\41.07769\\-195.7553\\69\\42.3357\\-191.849\\69\\43.76017\\-189.8959\\69\\44.64565\\-189.0622\\69\\47.14131\\-187.9428\\69\\50.50502\\-186.7657\\69\\52.45815\\-185.8026\\69\\56.3644\\-185.841\\69\\58.31752\\-186.9008\\69\\60.27065\\-187.3965\\69\\62.22377\\-188.7997\\69\\64.1769\\-190.6146\\69\\67.07135\\-193.8021\\69\\67.60354\\-195.7553\\69\\67.63926\\-199.6615\\69\\69.52707\\-201.6146\\69\\71.8024\\-203.5678\\69\\72.27136\\-205.5209\\69\\71.9894\\-205.8131\\69\\70.03628\\-206.3669\\69\\68.08315\\-204.6302\\69\\66.13003\\-205.4488\\69\\65.07588\\-207.474\\69\\63.50082\\-209.4271\\69\\62.54031\\-211.3803\\69\\62.22377\\-211.6925\\69\\60.27065\\-212.7278\\69\\58.31752\\-212.9367\\69\\50.50502\\-212.9174\\69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "590" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "81.75503\\-133.7347\\69\\79.8019\\-132.5271\\69\\77.84878\\-131.9388\\69\\75.89565\\-130.8139\\69\\73.94253\\-130.0106\\69\\71.9894\\-129.3725\\69\\70.03628\\-128.5001\\69\\68.08315\\-126.9699\\69\\66.13003\\-126.2547\\69\\64.1769\\-125.9577\\69\\62.22377\\-125.1279\\69\\58.31752\\-124.0661\\69\\56.3644\\-122.9726\\69\\54.41127\\-122.137\\69\\52.45815\\-121.0706\\69\\50.50502\\-119.6439\\69\\48.73141\\-117.6303\\69\\47.12193\\-115.6771\\69\\46.68541\\-113.724\\69\\46.59877\\-111.6081\\69\\46.68755\\-109.8178\\69\\47.94898\\-107.8646\\69\\48.5519\\-107.251\\69\\50.50502\\-105.803\\69\\52.45815\\-105.0298\\69\\54.41127\\-105.783\\69\\56.3644\\-106.6716\\69\\58.31752\\-107.8417\\69\\60.29635\\-109.8178\\69\\62.22377\\-111.0806\\69\\66.13003\\-114.9617\\69\\68.08315\\-116.5199\\69\\70.03628\\-117.2038\\69\\73.94253\\-120.6838\\69\\75.89565\\-122.112\\69\\77.84878\\-123.3676\\69\\79.8019\\-125.3073\\69\\82.40863\\-127.3959\\69\\83.70815\\-128.6654\\69\\85.66128\\-129.7375\\69\\87.41438\\-131.3021\\69\\85.97594\\-133.2553\\69\\85.66128\\-133.4547\\69\\83.70815\\-133.9313\\69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "54" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "591" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "120.8175\\-186.9662\\69\\119.8681\\-185.9896\\69\\119.9223\\-184.0365\\69\\120.6083\\-182.0834\\69\\118.9218\\-180.1303\\69\\116.9113\\-178.0883\\69\\115.7249\\-174.2709\\69\\114.9702\\-170.3646\\69\\114.3988\\-168.4115\\69\\113.2397\\-166.4584\\69\\111.2998\\-162.5521\\69\\110.9288\\-160.599\\69\\109.7421\\-158.6459\\69\\108.394\\-156.6928\\69\\107.3516\\-154.7396\\69\\105.8563\\-152.7865\\69\\104.192\\-150.8334\\69\\102.8813\\-148.8803\\69\\102.1018\\-146.9271\\69\\100.4224\\-144.974\\69\\99.53259\\-143.0209\\69\\99.00763\\-141.0678\\69\\98.06524\\-139.1146\\69\\97.38003\\-137.3921\\69\\97.38003\\-136.8541\\69\\99.33315\\-136.619\\69\\100.2156\\-137.1615\\69\\103.2394\\-138.6813\\69\\105.1925\\-139.1941\\69\\107.1457\\-140.7851\\69\\111.0519\\-141.6118\\69\\114.9582\\-143.4954\\69\\118.8644\\-144.2248\\69\\120.8175\\-145.5346\\69\\121.7775\\-146.9271\\69\\121.4299\\-148.8803\\69\\120.8175\\-150.9729\\69\\122.5265\\-152.7865\\69\\124.7238\\-154.8578\\69\\126.6769\\-158.1042\\69\\127.113\\-158.6459\\69\\127.7418\\-160.599\\69\\127.7584\\-164.5053\\69\\127.9212\\-166.4584\\69\\128.2731\\-168.4115\\69\\127.9845\\-170.3646\\69\\127.6046\\-174.2709\\69\\126.6769\\-177.1701\\69\\125.9445\\-178.1771\\69\\125.6732\\-180.1303\\69\\125.6732\\-182.0834\\69\\125.1958\\-184.0365\\69\\124.7238\\-184.8457\\69\\122.7707\\-186.8306\\69" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "74" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "592" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-148.7394\\71\\-104.8106\\-146.9271\\71\\-105.0432\\-144.974\\71\\-105.0151\\-143.0209\\71\\-104.3526\\-141.0678\\71\\-103.7918\\-140.4333\\71\\-100.4905\\-137.1615\\71\\-99.8856\\-136.6317\\71\\-97.93247\\-135.8156\\71\\-95.97935\\-134.5204\\71\\-94.02622\\-132.6017\\71\\-92.0731\\-131.2491\\71\\-90.11997\\-130.4113\\71\\-88.16685\\-128.7805\\71\\-86.21372\\-127.8235\\71\\-84.2606\\-126.3809\\71\\-81.40102\\-123.4896\\71\\-79.88142\\-121.5365\\71\\-78.67176\\-119.5834\\71\\-74.49497\\-115.4689\\71\\-72.54185\\-113.6248\\71\\-70.58872\\-112.3833\\71\\-68.6356\\-110.7717\\71\\-67.6871\\-109.8178\\71\\-66.19419\\-107.8646\\71\\-65.07906\\-105.9115\\71\\-64.72935\\-105.5594\\71\\-62.77623\\-104.7745\\71\\-60.8231\\-104.7595\\71\\-58.86998\\-103.5237\\71\\-56.91685\\-103.6841\\71\\-56.64261\\-103.9584\\71\\-56.55664\\-105.9115\\71\\-56.04016\\-107.8646\\71\\-54.96373\\-109.0198\\71\\-54.4045\\-109.8178\\71\\-53.76606\\-111.7709\\71\\-54.96373\\-112.8911\\71\\-57.39647\\-115.6771\\71\\-58.11153\\-117.6303\\71\\-58.86998\\-118.4336\\71\\-60.8231\\-120.1422\\71\\-62.77623\\-120.9495\\71\\-64.72935\\-122.2881\\71\\-66.68247\\-122.4228\\71\\-68.6356\\-123.0107\\71\\-70.58872\\-124.5711\\71\\-71.46632\\-125.4428\\71\\-70.58872\\-127.3813\\71\\-68.6356\\-126.6314\\71\\-66.68247\\-126.1478\\71\\-64.72935\\-125.8681\\71\\-62.77623\\-127.0443\\71\\-62.47728\\-127.3959\\71\\-64.24847\\-129.349\\71\\-64.72935\\-129.7585\\71\\-66.68247\\-130.2685\\71\\-68.6356\\-130.9159\\71\\-70.58872\\-131.6787\\71\\-72.54185\\-131.9762\\71\\-74.49497\\-132.746\\71\\-76.4481\\-133.9877\\71\\-78.40122\\-134.6113\\71\\-80.56187\\-133.2553\\71\\-82.30747\\-132.414\\71\\-84.2606\\-133.6941\\71\\-86.21372\\-134.6328\\71\\-88.16685\\-136.4692\\71\\-90.11997\\-137.6913\\71\\-92.0731\\-138.5405\\71\\-92.79073\\-139.1146\\71\\-98.6854\\-144.974\\71\\-99.8856\\-145.9386\\71\\-101.8387\\-147.8593\\71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "593" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-212.1059\\71\\46.59877\\-210.4085\\71\\43.69069\\-207.474\\71\\42.27658\\-205.5209\\71\\41.98723\\-203.5678\\71\\40.7394\\-202.1229\\71\\38.78627\\-202.5815\\71\\37.82858\\-203.5678\\71\\36.58547\\-205.5209\\71\\34.88002\\-206.7661\\71\\33.06963\\-205.5209\\71\\34.88002\\-204.3015\\71\\35.67554\\-203.5678\\71\\36.11158\\-201.6146\\71\\37.70308\\-199.6615\\71\\38.78627\\-198.733\\71\\41.50004\\-195.7553\\71\\42.08285\\-193.8021\\71\\42.3357\\-191.849\\71\\44.09048\\-189.8959\\71\\44.64565\\-189.4134\\71\\46.59877\\-188.7167\\71\\48.5519\\-187.6837\\71\\50.50502\\-186.9125\\71\\52.45815\\-185.8026\\71\\56.3644\\-185.8152\\71\\58.31752\\-186.3217\\71\\62.22377\\-187.7433\\71\\64.72887\\-189.8959\\71\\65.91532\\-191.849\\71\\67.20473\\-193.8021\\71\\67.60354\\-195.7553\\71\\67.63017\\-199.6615\\71\\69.13205\\-201.6146\\71\\71.1208\\-203.5678\\71\\71.65136\\-205.5209\\71\\70.03628\\-206.5066\\71\\68.08315\\-204.9448\\71\\66.13003\\-206.252\\71\\65.08501\\-207.474\\71\\63.69728\\-209.4271\\71\\63.06151\\-211.3803\\71\\62.22377\\-212.2019\\71\\60.27065\\-212.927\\71\\52.45815\\-212.9367\\71\\50.50502\\-212.7872\\71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "99" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "594" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "118.8644\\-174.3116\\71\\118.7912\\-168.4115\\71\\117.0403\\-166.4584\\71\\114.9582\\-164.6489\\71\\113.5369\\-162.5521\\71\\112.91\\-160.599\\71\\111.7899\\-158.6459\\71\\111.0519\\-156.8555\\71\\109.5961\\-154.7396\\71\\107.8648\\-152.7865\\71\\105.9173\\-150.8334\\71\\104.4872\\-148.8803\\71\\103.3936\\-146.9271\\71\\101.9858\\-144.974\\71\\100.282\\-143.0209\\71\\99.29559\\-141.0678\\71\\96.91096\\-139.1146\\71\\95.4269\\-137.7684\\71\\93.90974\\-137.1615\\71\\93.47378\\-136.5802\\71\\91.52065\\-134.835\\71\\89.56753\\-133.2934\\71\\85.66128\\-133.8326\\71\\83.70815\\-133.5143\\71\\81.75503\\-132.4864\\71\\79.8019\\-131.7369\\71\\77.84878\\-130.4516\\71\\75.82277\\-129.349\\71\\73.94253\\-128.6208\\71\\71.9894\\-128.0095\\71\\70.03628\\-126.9172\\71\\68.08315\\-126.1066\\71\\66.13003\\-125.5782\\71\\64.1769\\-124.7724\\71\\60.32809\\-123.4896\\71\\56.3644\\-121.9019\\71\\54.41127\\-120.7882\\71\\52.45815\\-120.0209\\71\\50.50502\\-118.5245\\71\\49.62558\\-117.6303\\71\\48.80697\\-115.6771\\71\\48.67167\\-113.724\\71\\48.64696\\-111.7709\\71\\48.78978\\-109.8178\\71\\50.50502\\-108.3945\\71\\52.45815\\-108.1302\\71\\54.41127\\-107.2572\\71\\56.3644\\-106.7092\\71\\58.31752\\-107.2995\\71\\60.27065\\-109.1581\\71\\62.22377\\-110.5413\\71\\63.70693\\-111.7709\\71\\65.20021\\-113.724\\71\\66.13003\\-114.6538\\71\\68.08315\\-116.1118\\71\\70.03628\\-116.7292\\71\\71.9894\\-118.6372\\71\\73.94253\\-120.1874\\71\\75.89565\\-121.1018\\71\\77.84878\\-122.6243\\71\\79.8019\\-124.4226\\71\\81.75503\\-125.7364\\71\\85.66128\\-127.9667\\71\\87.6144\\-128.8277\\71\\88.21712\\-129.349\\71\\89.56753\\-130.9204\\71\\90.67258\\-131.3021\\71\\91.52065\\-132.0346\\71\\93.47378\\-132.9942\\71\\94.52847\\-133.2553\\71\\95.4269\\-133.6712\\71\\97.38003\\-134.0266\\71\\99.33315\\-134.7201\\71\\101.2863\\-136.2915\\71\\103.3391\\-137.1615\\71\\105.1925\\-137.74\\71\\107.1457\\-138.6043\\71\\109.0988\\-139.6514\\71\\111.0519\\-140.2997\\71\\113.005\\-141.4331\\71\\114.9582\\-142.2345\\71\\118.8644\\-143.9742\\71\\119.9467\\-144.974\\71\\121.438\\-146.9271\\71\\121.7983\\-148.8803\\71\\122.6612\\-150.8334\\71\\124.7238\\-154.2706\\71\\125.1106\\-154.7396\\71\\125.7543\\-156.6928\\71\\126.2876\\-160.599\\71\\126.309\\-164.5053\\71\\126.2293\\-166.4584\\71\\125.8631\\-168.4115\\71\\125.7178\\-170.3646\\71\\125.7178\\-172.3178\\71\\125.1563\\-174.2709\\71\\124.7238\\-174.8315\\71\\122.7707\\-176.1264\\71\\120.8175\\-176.1903\\71" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "70" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "595" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-145.9787\\73\\-104.4449\\-144.974\\73\\-105.0432\\-143.0209\\73\\-105.0681\\-141.0678\\73\\-104.5355\\-139.1146\\73\\-103.7918\\-138.1668\\73\\-102.7963\\-137.1615\\73\\-99.8856\\-135.167\\73\\-97.93247\\-134.0804\\73\\-95.97935\\-132.5172\\73\\-94.02622\\-130.6141\\73\\-91.70489\\-129.349\\73\\-90.11997\\-128.6221\\73\\-88.16685\\-127.2866\\73\\-86.21372\\-126.5188\\73\\-84.94346\\-125.4428\\73\\-82.30747\\-122.8545\\73\\-81.23659\\-121.5365\\73\\-79.38722\\-119.5834\\73\\-76.4481\\-116.614\\73\\-74.49497\\-114.7761\\73\\-70.97262\\-111.7709\\73\\-68.6356\\-109.6328\\73\\-67.02596\\-107.8646\\73\\-64.72935\\-105.6953\\73\\-62.77623\\-105.4839\\73\\-60.8231\\-106.4725\\73\\-58.86998\\-105.6452\\73\\-57.16099\\-103.9584\\73\\-56.91685\\-104.1579\\73\\-58.65181\\-105.9115\\73\\-58.30845\\-107.8646\\73\\-56.5944\\-109.8178\\73\\-55.69019\\-111.7709\\73\\-56.35184\\-113.724\\73\\-57.86629\\-115.6771\\73\\-59.12443\\-117.6303\\73\\-61.1987\\-119.5834\\73\\-64.72935\\-121.6851\\73\\-66.68247\\-122.0747\\73\\-68.6356\\-122.2904\\73\\-70.58872\\-122.9359\\73\\-71.30385\\-123.4896\\73\\-73.13935\\-125.4428\\73\\-72.54185\\-126.7042\\73\\-70.58872\\-126.6408\\73\\-68.6356\\-126.2985\\73\\-64.72935\\-125.9793\\73\\-63.46144\\-127.3959\\73\\-64.72935\\-128.8038\\73\\-66.68247\\-129.726\\73\\-68.6356\\-129.9372\\73\\-70.58872\\-130.5288\\73\\-74.49497\\-132.4628\\73\\-76.4481\\-133.8401\\73\\-78.40122\\-134.372\\73\\-79.57007\\-133.2553\\73\\-78.40122\\-131.3754\\73\\-78.40122\\-131.1024\\73\\-80.35435\\-130.304\\73\\-82.30747\\-131.0105\\73\\-84.2606\\-132.4706\\73\\-86.21372\\-133.6674\\73\\-88.16685\\-134.5933\\73\\-90.11997\\-136.2347\\73\\-92.0731\\-137.5809\\73\\-94.02622\\-138.5043\\73\\-94.74329\\-139.1146\\73\\-99.8856\\-144.1855\\73\\-101.8387\\-146.0698\\73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "596" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-212.4763\\73\\48.5519\\-211.2718\\73\\46.59877\\-210.4085\\73\\43.69069\\-207.474\\73\\42.06063\\-205.5209\\73\\41.60586\\-203.5678\\73\\40.7394\\-202.6325\\73\\38.78627\\-202.4974\\73\\34.88002\\-206.478\\73\\33.00904\\-207.474\\73\\32.79373\\-207.474\\73\\32.37532\\-205.5209\\73\\34.88002\\-203.9042\\73\\35.23124\\-203.5678\\73\\35.35562\\-201.6146\\73\\36.83315\\-200.0123\\73\\38.78627\\-199.262\\73\\40.7394\\-197.0551\\73\\41.61001\\-195.7553\\73\\42.32553\\-193.8021\\73\\42.39956\\-191.849\\73\\44.64565\\-189.6964\\73\\46.59877\\-188.8855\\73\\48.5519\\-187.6953\\73\\50.50502\\-186.9171\\73\\52.45815\\-185.8026\\73\\58.31752\\-185.8152\\73\\60.27065\\-186.3108\\73\\62.22377\\-187.1388\\73\\65.09123\\-189.8959\\73\\66.8338\\-191.849\\73\\67.44443\\-193.8021\\73\\67.60354\\-195.7553\\73\\67.63017\\-199.6615\\73\\69.04549\\-201.6146\\73\\70.96611\\-203.5678\\73\\71.65136\\-205.5209\\73\\70.03628\\-206.5113\\73\\68.08315\\-205.1641\\73\\66.13003\\-206.4381\\73\\65.10846\\-207.474\\73\\63.76096\\-209.4271\\73\\63.07109\\-211.3803\\73\\62.22377\\-212.2113\\73\\60.27065\\-212.927\\73\\52.45815\\-212.9367\\73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "82" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "597" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "120.8175\\-165.5984\\73\\118.8644\\-164.0893\\73\\116.9113\\-163.4792\\73\\116.1152\\-162.5521\\73\\114.9582\\-160.4994\\73\\113.0138\\-156.6928\\73\\111.8256\\-154.7396\\73\\107.9284\\-150.8334\\73\\106.4972\\-148.8803\\73\\105.2933\\-146.9271\\73\\103.6389\\-144.974\\73\\101.2863\\-142.6242\\73\\99.33315\\-140.4396\\73\\97.38003\\-139.7289\\73\\95.4269\\-138.3246\\73\\93.47378\\-137.7312\\73\\91.52065\\-136.3467\\73\\89.56753\\-134.3089\\73\\87.6144\\-133.7854\\73\\85.66128\\-133.5027\\73\\81.75503\\-131.2646\\73\\79.8019\\-130.416\\73\\77.84878\\-128.7883\\73\\75.89565\\-128.1665\\73\\73.94253\\-127.772\\73\\71.9894\\-126.6921\\73\\68.08315\\-125.5375\\73\\66.13003\\-124.7223\\73\\64.1769\\-124.1352\\73\\62.22377\\-122.9123\\73\\58.31752\\-121.8438\\73\\56.3644\\-120.6021\\73\\54.42276\\-119.5834\\73\\52.45815\\-118.3845\\73\\51.52104\\-117.6303\\73\\50.65874\\-115.6771\\73\\51.62921\\-113.724\\73\\51.48159\\-111.7709\\73\\53.73265\\-109.8178\\73\\54.41127\\-109.4328\\73\\56.3644\\-107.5114\\73\\58.31752\\-107.6652\\73\\58.53207\\-107.8646\\73\\61.6153\\-109.8178\\73\\62.22377\\-110.2886\\73\\64.1769\\-111.364\\73\\66.72416\\-113.724\\73\\68.08315\\-114.8877\\73\\70.03628\\-116.2145\\73\\71.9894\\-117.4378\\73\\74.42123\\-119.5834\\73\\77.84878\\-122.0489\\73\\79.8019\\-122.9669\\73\\81.75503\\-124.5565\\73\\83.70815\\-125.7862\\73\\85.66128\\-126.6246\\73\\87.6144\\-127.8033\\73\\89.56753\\-128.7805\\73\\91.52065\\-129.9295\\73\\93.47378\\-130.7281\\73\\95.4269\\-131.8986\\73\\97.38003\\-132.52\\73\\99.33315\\-133.7188\\73\\101.2863\\-134.6126\\73\\103.2394\\-135.7673\\73\\105.1925\\-136.3855\\73\\107.1457\\-137.6003\\73\\109.0988\\-138.3241\\73\\111.0519\\-139.5938\\73\\113.005\\-140.3071\\73\\114.9582\\-141.6064\\73\\116.9113\\-142.5679\\73\\119.4166\\-144.974\\73\\120.1574\\-146.9271\\73\\121.3796\\-148.8803\\73\\122.7707\\-150.8933\\73\\123.7561\\-152.7865\\73\\124.2418\\-156.6928\\73\\124.158\\-158.6459\\73\\123.8098\\-160.599\\73\\123.8098\\-164.5053\\73\\122.7707\\-165.9527\\73" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "67" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "598" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-143.8212\\75\\-104.4489\\-143.0209\\75\\-105.3386\\-141.0678\\75\\-106.5418\\-139.1146\\75\\-105.9015\\-137.1615\\75\\-103.7918\\-135.8778\\75\\-101.8387\\-134.4488\\75\\-99.8856\\-132.7536\\75\\-97.93247\\-132.0173\\75\\-95.97935\\-130.5223\\75\\-94.02622\\-128.7466\\75\\-92.0731\\-127.919\\75\\-90.11997\\-126.6598\\75\\-88.16685\\-125.5055\\75\\-86.21372\\-124.7319\\75\\-84.97148\\-123.4896\\75\\-82.30747\\-121.1832\\75\\-80.73868\\-119.5834\\75\\-76.4481\\-115.3606\\75\\-74.49497\\-114.5081\\75\\-72.54185\\-112.9392\\75\\-70.58872\\-110.7775\\75\\-68.6356\\-108.948\\75\\-66.68247\\-107.6484\\75\\-64.72935\\-106.7789\\75\\-62.77623\\-107.1601\\75\\-60.8231\\-108.2204\\75\\-59.22572\\-109.8178\\75\\-59.13446\\-113.724\\75\\-59.6237\\-115.6771\\75\\-63.23775\\-119.5834\\75\\-64.72935\\-120.7296\\75\\-66.68247\\-121.645\\75\\-68.6356\\-122.0666\\75\\-70.58872\\-122.2803\\75\\-72.54185\\-122.9291\\75\\-73.1452\\-123.4896\\75\\-74.34534\\-125.4428\\75\\-72.54185\\-126.8064\\75\\-70.58872\\-126.0993\\75\\-68.6356\\-126.6182\\75\\-66.68247\\-127.2609\\75\\-64.72935\\-126.9037\\75\\-64.30505\\-127.3959\\75\\-64.72935\\-127.8655\\75\\-66.68247\\-127.7912\\75\\-68.6356\\-128.7361\\75\\-69.68319\\-129.349\\75\\-72.54185\\-130.5108\\75\\-74.49497\\-132.1539\\75\\-76.4481\\-133.5592\\75\\-78.40122\\-134.1967\\75\\-79.21167\\-133.2553\\75\\-77.21936\\-131.3021\\75\\-75.61552\\-129.349\\75\\-76.4481\\-128.063\\75\\-78.40122\\-128.5264\\75\\-82.30747\\-130.3353\\75\\-84.2606\\-131.6409\\75\\-86.21372\\-132.4396\\75\\-88.16685\\-133.6472\\75\\-90.11997\\-134.5553\\75\\-92.0731\\-136.1911\\75\\-94.02622\\-137.561\\75\\-95.97935\\-138.6634\\75\\-98.74043\\-141.0678\\75\\-101.8387\\-144.0776\\75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "599" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-212.3465\\75\\48.5519\\-210.9094\\75\\46.59877\\-210.4085\\75\\44.64565\\-208.4686\\75\\41.78479\\-205.5209\\75\\40.7394\\-203.8259\\75\\38.78627\\-202.6308\\75\\35.66604\\-205.5209\\75\\32.9269\\-208.1598\\75\\30.97377\\-208.0866\\75\\30.39015\\-207.474\\75\\30.97377\\-205.8571\\75\\31.57694\\-205.5209\\75\\32.9269\\-205.2169\\75\\34.84246\\-203.5678\\75\\34.87239\\-201.6146\\75\\36.83315\\-199.6842\\75\\38.78627\\-199.6239\\75\\40.7394\\-197.3743\\75\\41.61414\\-195.7553\\75\\42.3357\\-193.8021\\75\\42.95339\\-191.849\\75\\44.92581\\-189.8959\\75\\48.24041\\-187.9428\\75\\48.5519\\-187.6953\\75\\50.50502\\-186.9171\\75\\52.45815\\-185.8026\\75\\58.31752\\-185.8026\\75\\60.27065\\-185.9521\\75\\62.22377\\-187.0818\\75\\65.09123\\-189.8959\\75\\66.81581\\-191.849\\75\\67.44067\\-193.8021\\75\\67.60354\\-195.7553\\75\\67.63017\\-199.6615\\75\\69.04549\\-201.6146\\75\\70.96611\\-203.5678\\75\\71.65136\\-205.5209\\75\\70.03628\\-206.5113\\75\\68.08315\\-205.1641\\75\\66.13003\\-206.4878\\75\\65.23228\\-207.474\\75\\64.21475\\-209.4271\\75\\63.07109\\-211.3803\\75\\62.22377\\-212.2113\\75\\60.27065\\-212.927\\75\\52.45815\\-212.9367\\75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "69" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "600" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "116.9113\\-157.5391\\75\\114.9582\\-155.6552\\75\\114.1706\\-154.7396\\75\\113.005\\-153.8861\\75\\109.0988\\-150.0208\\75\\106.3158\\-146.9271\\75\\100.42\\-141.0678\\75\\99.33315\\-140.1405\\75\\97.38003\\-139.2094\\75\\93.47378\\-136.8338\\75\\91.52065\\-136.051\\75\\89.56753\\-134.1364\\75\\87.6144\\-132.9522\\75\\85.66128\\-132.3929\\75\\83.70815\\-130.6449\\75\\81.75503\\-130.0695\\75\\77.84878\\-128.0153\\75\\75.89565\\-127.4481\\75\\73.94253\\-126.6136\\75\\70.03628\\-125.4949\\75\\64.1769\\-123.1027\\75\\62.22377\\-122.5676\\75\\60.29612\\-121.5365\\75\\58.31752\\-120.3773\\75\\55.03035\\-117.6303\\75\\53.40419\\-115.6771\\75\\54.13363\\-113.724\\75\\55.86943\\-111.7709\\75\\56.95516\\-109.8178\\75\\58.31752\\-108.988\\75\\60.27065\\-109.2126\\75\\62.22377\\-110.4667\\75\\64.42927\\-111.7709\\75\\66.13003\\-112.5315\\75\\68.08315\\-113.6537\\75\\70.03628\\-114.942\\75\\71.9894\\-116.6537\\75\\73.94253\\-118.6269\\75\\75.89565\\-120.011\\75\\77.84878\\-120.9903\\75\\79.8019\\-122.2803\\75\\81.75503\\-123.1535\\75\\83.70815\\-124.6544\\75\\85.66128\\-125.362\\75\\87.6144\\-126.5339\\75\\89.56753\\-127.2729\\75\\91.52065\\-128.472\\75\\93.47378\\-129.3109\\75\\95.4269\\-130.4361\\75\\97.38003\\-131.727\\75\\99.33315\\-132.4577\\75\\101.2863\\-133.7583\\75\\103.2394\\-134.3912\\75\\105.1925\\-135.6996\\75\\107.1457\\-136.3486\\75\\109.0988\\-137.6557\\75\\111.0519\\-138.6085\\75\\111.5909\\-139.1146\\75\\113.005\\-140.0615\\75\\114.7322\\-141.0678\\75\\116.9113\\-143.0488\\75\\118.0598\\-144.974\\75\\119.1243\\-146.9271\\75\\119.9677\\-148.8803\\75\\120.957\\-150.8334\\75\\121.8035\\-152.7865\\75\\121.8429\\-156.6928\\75\\120.8175\\-157.9432\\75\\118.8644\\-158.031\\75" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "601" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-142.1921\\77\\-105.745\\-140.6492\\77\\-106.9991\\-139.1146\\77\\-106.7359\\-137.1615\\77\\-105.745\\-136.0629\\77\\-103.7918\\-134.3751\\77\\-101.8387\\-132.8633\\77\\-99.8856\\-131.9035\\77\\-97.93247\\-130.6731\\77\\-95.97935\\-128.7208\\77\\-94.02622\\-127.7282\\77\\-92.0731\\-126.4856\\77\\-90.11997\\-124.8404\\77\\-88.16685\\-123.9917\\77\\-86.21372\\-122.7655\\77\\-84.2606\\-121.3495\\77\\-82.30747\\-120.5109\\77\\-76.4481\\-114.6705\\77\\-74.62067\\-113.724\\77\\-72.54185\\-111.4908\\77\\-70.58872\\-109.6901\\77\\-68.6356\\-108.6084\\77\\-66.68247\\-108.4885\\77\\-64.72935\\-108.5622\\77\\-62.77623\\-108.9076\\77\\-61.67053\\-109.8178\\77\\-61.53257\\-111.7709\\77\\-61.53868\\-113.724\\77\\-61.85479\\-115.6771\\77\\-63.20646\\-117.6303\\77\\-64.72935\\-119.3586\\77\\-66.68247\\-120.5831\\77\\-68.6356\\-121.6312\\77\\-72.54185\\-122.4735\\77\\-73.89266\\-123.4896\\77\\-75.47153\\-125.4428\\77\\-76.4481\\-126.4424\\77\\-78.40122\\-127.6759\\77\\-80.35435\\-128.4965\\77\\-82.30747\\-129.6406\\77\\-84.2606\\-130.449\\77\\-86.21372\\-131.6299\\77\\-88.16685\\-132.4221\\77\\-90.11997\\-133.6264\\77\\-92.0731\\-134.5108\\77\\-94.02622\\-136.1788\\77\\-95.97935\\-137.9586\\77\\-97.93247\\-139.4042\\77\\-99.8856\\-140.3937\\77\\-101.8387\\-142.1592\\77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "12" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "602" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-78.40122\\-134.0403\\77\\-79.04702\\-133.2553\\77\\-75.13329\\-129.349\\77\\-73.56577\\-127.3959\\77\\-72.54185\\-126.5636\\77\\-70.58872\\-126.0648\\77\\-69.23917\\-127.3959\\77\\-70.58872\\-128.5064\\77\\-72.54185\\-129.6878\\77\\-74.49497\\-130.7424\\77\\-76.4481\\-132.3782\\77\\-77.30925\\-133.2553\\77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "603" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-212.3261\\77\\48.5519\\-210.8834\\77\\46.59877\\-210.3845\\77\\41.69962\\-205.5209\\77\\40.7394\\-204.473\\77\\38.78627\\-203.1184\\77\\35.26937\\-205.5209\\77\\32.9269\\-207.633\\77\\30.97377\\-207.7582\\77\\30.70744\\-207.474\\77\\30.97377\\-206.9729\\77\\32.9269\\-207.1078\\77\\34.0962\\-205.5209\\77\\34.85732\\-203.5678\\77\\34.87239\\-201.6146\\77\\36.83315\\-199.6842\\77\\38.78627\\-199.6239\\77\\40.7394\\-197.3743\\77\\41.61414\\-195.7553\\77\\42.3357\\-193.8021\\77\\43.50124\\-191.849\\77\\44.64565\\-190.6926\\77\\46.59877\\-188.8902\\77\\48.5519\\-187.6953\\77\\50.50502\\-186.942\\77\\52.45815\\-185.8811\\77\\56.3644\\-185.8026\\77\\58.31752\\-185.9089\\77\\62.22377\\-187.1926\\77\\65.09123\\-189.8959\\77\\65.91832\\-191.849\\77\\67.1315\\-193.8021\\77\\67.53693\\-195.7553\\77\\67.57784\\-199.6615\\77\\69.04066\\-201.6146\\77\\70.96611\\-203.5678\\77\\71.65136\\-205.5209\\77\\70.03628\\-206.5113\\77\\68.08315\\-205.1641\\77\\66.13003\\-206.7477\\77\\65.50858\\-207.474\\77\\64.8857\\-209.4271\\77\\62.22377\\-212.2113\\77\\60.27065\\-212.927\\77\\52.45815\\-212.9174\\77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "604" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "113.005\\-151.4307\\77\\109.0988\\-147.7883\\77\\106.2476\\-144.974\\77\\105.1925\\-144.1591\\77\\101.2863\\-140.2594\\77\\99.33315\\-138.9094\\77\\97.38003\\-138.0734\\77\\95.4269\\-136.4845\\77\\93.47378\\-135.6967\\77\\91.52065\\-134.3864\\77\\89.56753\\-132.5692\\77\\87.6144\\-132.014\\77\\85.66128\\-131.0064\\77\\83.70815\\-129.6855\\77\\79.8019\\-128.3676\\77\\77.78696\\-127.3959\\77\\73.94253\\-125.7615\\77\\71.9894\\-125.0364\\77\\70.03628\\-124.65\\77\\68.08315\\-123.8308\\77\\66.13003\\-122.7434\\77\\62.22377\\-121.3352\\77\\60.64107\\-119.5834\\77\\60.27065\\-118.9203\\77\\58.31752\\-117.2782\\77\\56.91247\\-115.6771\\77\\58.35766\\-113.724\\77\\60.27065\\-112.4545\\77\\64.1769\\-112.4168\\77\\66.13003\\-112.4599\\77\\68.08315\\-113.1821\\77\\70.03628\\-114.5471\\77\\71.9894\\-115.5636\\77\\74.2477\\-117.6303\\77\\75.89565\\-118.841\\77\\77.84878\\-120.55\\77\\83.38538\\-123.4896\\77\\83.70815\\-123.7598\\77\\85.66128\\-124.2235\\77\\87.6144\\-124.8771\\77\\89.56753\\-125.9413\\77\\91.52065\\-126.8075\\77\\95.4269\\-129.1172\\77\\97.38003\\-130.5134\\77\\99.33315\\-131.7117\\77\\101.2863\\-132.6932\\77\\103.2394\\-133.9384\\77\\105.1925\\-134.7141\\77\\107.1457\\-135.9811\\77\\109.0988\\-136.7696\\77\\113.8776\\-141.0678\\77\\115.5413\\-143.0209\\77\\116.9113\\-146.8028\\77\\117.8878\\-148.8803\\77\\116.9113\\-150.315\\77\\114.9582\\-151.3217\\77" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "605" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-103.7918\\-141.2574\\79\\-105.745\\-140.2314\\79\\-106.8192\\-139.1146\\79\\-107.4819\\-137.1615\\79\\-106.5275\\-135.2084\\79\\-105.745\\-134.4818\\79\\-103.7918\\-133.6215\\79\\-101.8387\\-132.1686\\79\\-100.3149\\-131.3021\\79\\-97.93247\\-129.4921\\79\\-95.97935\\-127.7054\\79\\-94.02622\\-126.5596\\79\\-92.0731\\-125.0765\\79\\-90.11997\\-124.1567\\79\\-88.16685\\-122.9638\\79\\-84.2606\\-119.448\\79\\-82.30747\\-118.9341\\79\\-80.7711\\-117.6303\\79\\-76.4481\\-113.5445\\79\\-74.49497\\-111.763\\79\\-72.54185\\-110.6211\\79\\-68.6356\\-108.8365\\79\\-66.68247\\-109.4204\\79\\-66.09454\\-109.8178\\79\\-65.08878\\-111.7709\\79\\-65.0863\\-115.6771\\79\\-65.54648\\-117.6303\\79\\-67.52219\\-119.5834\\79\\-68.6356\\-120.5823\\79\\-70.58872\\-121.6031\\79\\-72.54185\\-122.4817\\79\\-74.49497\\-123.482\\79\\-76.93995\\-125.4428\\79\\-78.40122\\-126.5076\\79\\-80.35435\\-127.6383\\79\\-82.30747\\-128.4758\\79\\-84.2606\\-129.6172\\79\\-86.21372\\-130.4129\\79\\-88.16685\\-131.5821\\79\\-90.11997\\-132.4049\\79\\-92.0731\\-133.6026\\79\\-94.02622\\-134.4848\\79\\-94.87212\\-135.2084\\79\\-96.86775\\-137.1615\\79\\-97.93247\\-138.0581\\79\\-99.8856\\-139.3553\\79\\-101.8387\\-140.3561\\79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "606" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-212.0871\\79\\48.5519\\-210.7484\\79\\46.59877\\-210.1787\\79\\44.64565\\-208.4686\\79\\40.7394\\-204.5402\\79\\38.96039\\-203.5678\\79\\38.58021\\-203.5678\\79\\36.83315\\-204.4333\\79\\34.88999\\-203.5678\\79\\34.93221\\-201.6146\\79\\36.83315\\-199.7563\\79\\38.78627\\-199.6239\\79\\40.7394\\-197.4884\\79\\41.63839\\-195.7553\\79\\42.3357\\-193.8021\\79\\43.63098\\-191.849\\79\\46.59877\\-188.9193\\79\\48.5519\\-187.7684\\79\\52.45815\\-186.4203\\79\\54.41127\\-185.9973\\79\\56.3644\\-186.0123\\79\\62.22377\\-187.6067\\79\\64.1769\\-189.0449\\79\\65.06161\\-189.8959\\79\\65.5759\\-191.849\\79\\66.80819\\-193.8021\\79\\67.27015\\-195.7553\\79\\67.32201\\-199.6615\\79\\68.98421\\-201.6146\\79\\70.96611\\-203.5678\\79\\71.65136\\-205.5209\\79\\70.03628\\-206.5113\\79\\68.08315\\-205.1641\\79\\66.13003\\-206.8935\\79\\65.64175\\-207.474\\79\\65.02838\\-209.4271\\79\\62.22377\\-212.2113\\79\\60.27065\\-212.927\\79\\54.41127\\-212.9174\\79\\52.45815\\-212.7304\\79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "607" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "111.0519\\-145.3466\\79\\107.1457\\-142.4334\\79\\105.1925\\-142.0925\\79\\102.1594\\-139.1146\\79\\101.2863\\-138.3204\\79\\99.33315\\-136.9939\\79\\97.38003\\-136.2254\\79\\95.4269\\-135.0131\\79\\93.47378\\-134.1696\\79\\91.52065\\-132.5167\\79\\89.56753\\-131.5958\\79\\85.66128\\-130.1637\\79\\83.70815\\-128.4675\\79\\81.75503\\-127.785\\79\\77.84878\\-126.5296\\79\\75.89565\\-125.7129\\79\\73.94253\\-124.5975\\79\\70.03628\\-123.7854\\79\\68.08315\\-122.6637\\79\\66.13003\\-122.1639\\79\\64.1769\\-120.7806\\79\\62.90795\\-119.5834\\79\\62.73252\\-117.6303\\79\\62.86425\\-115.6771\\79\\63.74897\\-113.724\\79\\64.1769\\-113.444\\79\\66.13003\\-112.7724\\79\\70.03628\\-114.5825\\79\\71.9894\\-115.5532\\79\\73.94253\\-116.7347\\79\\75.89565\\-118.2759\\79\\77.84878\\-119.2885\\79\\79.8019\\-120.7864\\79\\81.75503\\-121.9877\\79\\83.70815\\-122.7132\\79\\85.66128\\-123.6382\\79\\87.6144\\-124.1842\\79\\89.56753\\-124.9575\\79\\91.52065\\-126.0698\\79\\93.47378\\-126.9381\\79\\95.4269\\-128.7408\\79\\97.38003\\-130.0194\\79\\99.33315\\-130.5658\\79\\101.2863\\-132.2507\\79\\103.2394\\-133.6712\\79\\105.1925\\-134.5884\\79\\105.9484\\-135.2084\\79\\108.8168\\-137.1615\\79\\112.3075\\-141.0678\\79\\113.7095\\-143.0209\\79\\113.7845\\-144.974\\79\\113.005\\-145.8683\\79" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "608" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-139.7152\\81\\-108.4472\\-137.1615\\81\\-108.0392\\-135.2084\\81\\-107.6981\\-134.8601\\81\\-105.745\\-133.7008\\81\\-102.3055\\-131.3021\\81\\-101.8387\\-130.8952\\81\\-99.8856\\-129.7696\\81\\-97.93247\\-128.3511\\81\\-95.97935\\-126.479\\81\\-94.02622\\-125.219\\81\\-90.11997\\-123.9779\\81\\-88.16685\\-122.8333\\81\\-86.92442\\-121.5365\\81\\-85.53764\\-119.5834\\81\\-84.2606\\-118.5357\\81\\-82.30747\\-118.4641\\81\\-80.35435\\-116.8462\\81\\-78.64193\\-115.6771\\81\\-76.4481\\-113.8479\\81\\-74.30623\\-111.7709\\81\\-72.54185\\-110.7898\\81\\-68.6356\\-110.612\\81\\-67.29961\\-111.7709\\81\\-67.10735\\-113.724\\81\\-67.10735\\-115.6771\\81\\-67.54118\\-117.6303\\81\\-69.11729\\-119.5834\\81\\-70.58872\\-120.6777\\81\\-72.54185\\-121.7684\\81\\-74.49497\\-122.6244\\81\\-76.4481\\-124.3078\\81\\-78.40122\\-125.1194\\81\\-82.30747\\-127.5754\\81\\-84.2606\\-128.4142\\81\\-86.21372\\-129.0808\\81\\-88.16685\\-130.2396\\81\\-90.11997\\-131.5463\\81\\-92.0731\\-132.3542\\81\\-94.02622\\-133.5583\\81\\-95.97935\\-134.4374\\81\\-96.87013\\-135.2084\\81\\-98.83344\\-137.1615\\81\\-99.8856\\-138.0576\\81\\-101.8387\\-139.4003\\81\\-103.7918\\-140.171\\81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "609" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-212.2256\\81\\50.50502\\-211.1808\\81\\48.5519\\-210.4784\\81\\46.59877\\-209.2401\\81\\44.64565\\-208.4597\\81\\40.7394\\-204.4183\\81\\39.01444\\-203.5678\\81\\38.56433\\-203.5678\\81\\36.83315\\-204.4333\\81\\34.88002\\-203.6262\\81\\35.29597\\-201.6146\\81\\36.83315\\-200.1668\\81\\38.78627\\-199.6239\\81\\40.7394\\-198.1251\\81\\41.14579\\-197.7084\\81\\42.4107\\-193.8021\\81\\43.66909\\-191.849\\81\\44.64565\\-190.8677\\81\\46.59877\\-189.1175\\81\\48.5519\\-188.3121\\81\\52.45815\\-187.0609\\81\\54.41127\\-186.8156\\81\\56.3644\\-186.8299\\81\\58.31752\\-187.105\\81\\60.27065\\-187.6722\\81\\62.22377\\-188.4455\\81\\64.1769\\-189.5878\\81\\64.49127\\-189.8959\\81\\65.36679\\-191.849\\81\\65.81521\\-193.8021\\81\\66.09246\\-195.7553\\81\\66.10732\\-197.7084\\81\\66.74038\\-199.6615\\81\\68.82858\\-201.6146\\81\\70.03628\\-202.6151\\81\\70.96611\\-203.5678\\81\\71.65136\\-205.5209\\81\\70.03628\\-206.5113\\81\\68.08315\\-205.1641\\81\\66.13003\\-206.8935\\81\\65.64175\\-207.474\\81\\65.02838\\-209.4271\\81\\62.22377\\-212.2113\\81\\60.27065\\-212.927\\81\\56.3644\\-212.9367\\81\\54.41127\\-212.7715\\81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "610" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "99.33315\\-134.3471\\81\\97.38003\\-133.1978\\81\\93.47378\\-132.0269\\81\\91.52065\\-130.9427\\81\\89.56753\\-130.0586\\81\\85.66128\\-128.1902\\81\\83.70815\\-127.0229\\81\\81.75503\\-126.2105\\81\\79.8019\\-125.1668\\81\\77.84878\\-124.9511\\81\\75.89565\\-124.267\\81\\73.94253\\-122.9648\\81\\71.9894\\-122.7345\\81\\70.03628\\-121.9027\\81\\68.08315\\-120.8322\\81\\66.13003\\-120.3195\\81\\65.30118\\-119.5834\\81\\65.16934\\-117.6303\\81\\66.13003\\-116.6203\\81\\68.08315\\-115.4572\\81\\70.03628\\-116.3343\\81\\71.9894\\-116.5948\\81\\73.94253\\-116.7285\\81\\75.89565\\-118.088\\81\\77.84878\\-119.2686\\81\\79.8019\\-120.6167\\81\\81.75503\\-121.3879\\81\\83.70815\\-122.3321\\81\\85.75681\\-123.4896\\81\\87.6144\\-124.3113\\81\\89.56753\\-124.9034\\81\\91.52065\\-125.9647\\81\\93.47378\\-126.8816\\81\\95.4269\\-129.0963\\81\\97.38003\\-130.4541\\81\\99.33315\\-130.8021\\81\\101.8722\\-133.2553\\81\\101.2863\\-134.2914\\81" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "611" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-105.745\\-138.1594\\83\\-107.5896\\-137.1615\\83\\-108.4571\\-135.2084\\83\\-107.6981\\-134.3841\\83\\-105.745\\-132.8478\\83\\-103.7918\\-131.7579\\83\\-100.4632\\-129.349\\83\\-97.93247\\-127.0704\\83\\-95.69452\\-125.4428\\83\\-94.02622\\-124.5286\\83\\-92.0731\\-124.2031\\83\\-90.11997\\-124.0669\\83\\-88.16685\\-122.9136\\83\\-86.85606\\-121.5365\\83\\-85.62138\\-119.5834\\83\\-84.2606\\-118.4864\\83\\-82.30747\\-118.4864\\83\\-80.35435\\-117.4419\\83\\-78.40122\\-116.5457\\83\\-76.4481\\-116.3053\\83\\-75.44628\\-115.6771\\83\\-74.49497\\-114.7872\\83\\-72.54185\\-114.2353\\83\\-70.40092\\-115.6771\\83\\-70.78119\\-117.6303\\83\\-72.84989\\-119.5834\\83\\-74.49497\\-120.8942\\83\\-75.61757\\-121.5365\\83\\-76.4481\\-122.2474\\83\\-78.40122\\-123.0781\\83\\-80.35435\\-124.4779\\83\\-82.30747\\-126.1491\\83\\-84.2606\\-126.9652\\83\\-86.21372\\-127.135\\83\\-88.16685\\-128.339\\83\\-90.11997\\-130.1557\\83\\-92.0731\\-130.9639\\83\\-94.02622\\-132.1067\\83\\-95.97935\\-132.8463\\83\\-97.93247\\-134.2256\\83\\-100.8807\\-137.1615\\83\\-101.8387\\-138.0119\\83\\-103.7918\\-138.3922\\83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "612" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-210.9273\\83\\48.5519\\-210.4037\\83\\46.59877\\-208.9135\\83\\44.64565\\-208.3404\\83\\43.84496\\-207.474\\83\\42.91632\\-205.5209\\83\\40.7394\\-203.7042\\83\\38.78627\\-203.3561\\83\\36.83315\\-204.4333\\83\\34.88002\\-204.0261\\83\\34.46408\\-203.5678\\83\\35.5879\\-201.6146\\83\\36.83315\\-200.4886\\83\\38.78627\\-199.7836\\83\\40.7394\\-198.527\\83\\41.55004\\-197.7084\\83\\42.22778\\-195.7553\\83\\43.96153\\-191.849\\83\\44.64565\\-191.1649\\83\\46.8479\\-189.8959\\83\\48.5519\\-189.0306\\83\\50.50502\\-188.7413\\83\\54.41127\\-187.5609\\83\\56.3644\\-187.5836\\83\\58.31752\\-188.3198\\83\\60.27065\\-188.7558\\83\\62.22377\\-189.3513\\83\\64.68073\\-191.849\\83\\65.41582\\-193.8021\\83\\65.63318\\-195.7553\\83\\65.65918\\-197.7084\\83\\66.9896\\-199.6615\\83\\70.96611\\-203.5678\\83\\71.65136\\-205.5209\\83\\70.03628\\-206.5113\\83\\68.08315\\-205.1641\\83\\66.13003\\-206.8935\\83\\65.64175\\-207.474\\83\\65.02838\\-209.4271\\83\\62.22377\\-212.2457\\83\\60.27065\\-212.927\\83\\56.3644\\-212.9367\\83\\54.41127\\-212.6254\\83" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "32" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "613" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-107.6981\\-135.8573\\85\\-108.2729\\-135.2084\\85\\-107.6981\\-134.5552\\85\\-105.745\\-133.3907\\85\\-103.4385\\-131.3021\\85\\-100.3173\\-129.349\\85\\-97.93247\\-127.1602\\85\\-95.97935\\-126.2972\\85\\-94.02622\\-125.2646\\85\\-92.0731\\-124.475\\85\\-90.11997\\-124.4662\\85\\-88.16685\\-123.6972\\85\\-86.10522\\-121.5365\\85\\-85.3921\\-119.5834\\85\\-84.2606\\-118.6109\\85\\-82.30747\\-118.6109\\85\\-80.35435\\-118.9473\\85\\-79.49114\\-119.5834\\85\\-79.18124\\-121.5365\\85\\-80.35435\\-122.6402\\85\\-82.30747\\-123.3152\\85\\-84.2606\\-124.7017\\85\\-86.21372\\-125.2474\\85\\-88.16685\\-126.4402\\85\\-90.11997\\-128.4123\\85\\-92.0731\\-129.2968\\85\\-94.02622\\-130.3451\\85\\-95.97935\\-131.2355\\85\\-97.93247\\-131.2945\\85\\-99.8856\\-132.5468\\85\\-103.7918\\-136.3986\\85\\-105.745\\-136.7746\\85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "45" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "614" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-212.2513\\85\\50.50502\\-211.0032\\85\\48.5519\\-210.4235\\85\\46.59877\\-208.771\\85\\44.64565\\-207.2848\\85\\43.61606\\-205.5209\\85\\42.69252\\-204.5974\\85\\40.7394\\-203.3808\\85\\38.78627\\-203.4593\\85\\36.83315\\-204.4723\\85\\34.88002\\-204.31\\85\\34.21053\\-203.5678\\85\\35.66702\\-201.6146\\85\\36.83315\\-200.7011\\85\\38.78627\\-200.3757\\85\\40.7394\\-199.0049\\85\\41.76392\\-197.7084\\85\\43.10847\\-195.7553\\85\\43.72024\\-193.8021\\85\\44.64565\\-192.5722\\85\\46.59877\\-190.9681\\85\\48.5519\\-190.0313\\85\\50.50502\\-189.3731\\85\\52.45815\\-189.0175\\85\\54.41127\\-188.7856\\85\\56.3644\\-188.8023\\85\\60.27065\\-189.4018\\85\\62.22377\\-190.7823\\85\\64.1769\\-192.7107\\85\\65.1774\\-193.8021\\85\\65.63318\\-195.7553\\85\\65.65918\\-197.7084\\85\\67.10659\\-199.6615\\85\\71.00823\\-203.5678\\85\\71.65136\\-205.5209\\85\\70.03628\\-206.5352\\85\\68.08315\\-205.1641\\85\\66.13003\\-206.8935\\85\\65.64175\\-207.474\\85\\65.03913\\-209.4271\\85\\62.22377\\-212.4658\\85\\60.27065\\-212.9664\\85\\58.31752\\-213.0404\\85\\56.3644\\-212.9973\\85\\54.41127\\-212.8451\\85" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "615" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-213.6589\\87\\52.45815\\-212.606\\87\\50.50502\\-211.7672\\87\\48.5519\\-210.6993\\87\\46.59877\\-209.1016\\87\\44.64565\\-206.7765\\87\\43.70262\\-205.5209\\87\\42.69252\\-204.5361\\87\\40.7394\\-203.6763\\87\\36.83315\\-204.8092\\87\\34.88002\\-203.836\\87\\34.70564\\-203.5678\\87\\36.83315\\-201.3538\\87\\38.78627\\-201.0966\\87\\40.7394\\-200.547\\87\\41.6069\\-199.6615\\87\\42.22778\\-197.7084\\87\\43.54941\\-195.7553\\87\\44.09153\\-193.8021\\87\\44.64565\\-193.1075\\87\\46.59877\\-191.4696\\87\\48.5519\\-190.6867\\87\\50.50502\\-189.6368\\87\\54.41127\\-189.264\\87\\56.3644\\-189.3308\\87\\60.27065\\-189.6602\\87\\62.22377\\-190.9657\\87\\65.10995\\-193.8021\\87\\65.63318\\-195.7553\\87\\65.74309\\-197.7084\\87\\67.15726\\-199.6615\\87\\68.08315\\-200.6332\\87\\71.2072\\-203.5678\\87\\71.65136\\-205.5209\\87\\70.03628\\-206.756\\87\\68.08315\\-205.1641\\87\\66.13003\\-206.8935\\87\\65.64175\\-207.474\\87\\65.11277\\-209.4271\\87\\64.1769\\-210.7484\\87\\62.22377\\-212.8538\\87\\60.27065\\-213.5328\\87\\58.31752\\-213.9962\\87" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "616" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-214.013\\89\\50.50502\\-212.9189\\89\\48.5519\\-212.1711\\89\\46.59877\\-210.8212\\89\\45.55322\\-209.4271\\89\\44.39816\\-207.474\\89\\43.55057\\-205.5209\\89\\42.69252\\-204.7026\\89\\40.7394\\-204.4167\\89\\38.78627\\-204.5746\\89\\36.83315\\-206.1628\\89\\35.32976\\-205.5209\\89\\35.35369\\-203.5678\\89\\36.83315\\-202.2027\\89\\38.78627\\-201.4926\\89\\40.7394\\-201.2429\\89\\42.11646\\-199.6615\\89\\43.1179\\-197.7084\\89\\43.75267\\-195.7553\\89\\44.22028\\-193.8021\\89\\44.64565\\-193.2605\\89\\46.59877\\-191.5342\\89\\48.5519\\-190.7497\\89\\50.50502\\-189.5494\\89\\52.45815\\-189.2198\\89\\54.41127\\-189.0903\\89\\56.3644\\-189.3035\\89\\58.31752\\-189.6368\\89\\60.27065\\-189.8011\\89\\62.22377\\-191.0062\\89\\65.10487\\-193.8021\\89\\65.63318\\-195.7553\\89\\67.31416\\-199.6615\\89\\68.08315\\-200.5219\\89\\70.03628\\-201.8504\\89\\71.56403\\-203.5678\\89\\71.74327\\-205.5209\\89\\72.69408\\-207.474\\89\\71.9894\\-208.3474\\89\\70.03628\\-207.4993\\89\\68.49245\\-205.5209\\89\\68.08315\\-205.1641\\89\\66.13003\\-206.8935\\89\\65.64175\\-207.474\\89\\65.26732\\-209.4271\\89\\64.47382\\-211.3803\\89\\62.22377\\-213.6039\\89\\60.27065\\-214.3768\\89\\58.31752\\-214.8136\\89\\54.41127\\-214.1407\\89" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "617" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-215.3673\\91\\50.50502\\-214.6918\\91\\48.5519\\-214.2123\\91\\46.59877\\-212.7113\\91\\45.53683\\-211.3803\\91\\44.42185\\-209.4271\\91\\43.85975\\-207.474\\91\\42.69252\\-206.0062\\91\\40.7394\\-204.8444\\91\\38.78627\\-204.9716\\91\\36.83315\\-206.4057\\91\\35.00328\\-205.5209\\91\\35.69382\\-203.5678\\91\\36.83315\\-202.4338\\91\\38.78627\\-201.5339\\91\\40.7394\\-201.3328\\91\\42.17057\\-199.6615\\91\\43.31731\\-197.7084\\91\\43.78473\\-195.7553\\91\\44.14034\\-193.8021\\91\\45.86635\\-191.849\\91\\46.59877\\-191.2567\\91\\48.5519\\-190.5233\\91\\50.50502\\-189.2466\\91\\54.41127\\-188.277\\91\\56.3644\\-189.0869\\91\\58.31752\\-189.6602\\91\\62.22377\\-191.16\\91\\65.10487\\-193.8021\\91\\65.64175\\-195.7553\\91\\66.98203\\-197.7084\\91\\67.53693\\-199.6615\\91\\68.08315\\-200.2934\\91\\70.09786\\-201.6146\\91\\71.69643\\-203.5678\\91\\72.36642\\-205.5209\\91\\73.15639\\-207.474\\91\\71.9894\\-208.6469\\91\\70.42297\\-207.474\\91\\68.08315\\-205.1641\\91\\66.13003\\-206.8935\\91\\65.64175\\-207.474\\91\\65.5015\\-209.4271\\91\\65.01326\\-211.3803\\91\\62.22377\\-214.6144\\91\\60.27065\\-215.9008\\91\\58.31752\\-216.0726\\91\\54.41127\\-215.8626\\91" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "618" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-217.414\\93\\52.45815\\-216.4077\\93\\50.50502\\-215.7395\\93\\46.59877\\-214.1157\\93\\45.82499\\-213.3334\\93\\44.49704\\-211.3803\\93\\43.90727\\-209.4271\\93\\43.62156\\-207.474\\93\\42.69252\\-206.5109\\93\\40.7394\\-205.1539\\93\\38.78627\\-205.1539\\93\\36.83315\\-206.3771\\93\\35.56087\\-205.5209\\93\\35.96662\\-203.5678\\93\\36.83315\\-202.5963\\93\\38.78627\\-201.5061\\93\\40.7394\\-200.8024\\93\\41.83297\\-199.6615\\93\\42.57045\\-197.7084\\93\\43.47666\\-195.7553\\93\\43.88975\\-193.8021\\93\\45.60663\\-191.849\\93\\46.59877\\-190.921\\93\\48.5519\\-189.8583\\93\\50.50502\\-188.9538\\93\\52.45815\\-187.9505\\93\\54.41127\\-187.92\\93\\56.3644\\-189.0595\\93\\58.31752\\-189.6842\\93\\60.27065\\-190.8632\\93\\62.22377\\-191.4922\\93\\64.1769\\-192.9054\\93\\65.10487\\-193.8021\\93\\65.64175\\-195.7553\\93\\67.06772\\-197.7084\\93\\67.62119\\-199.6615\\93\\68.08315\\-200.201\\93\\70.11546\\-201.6146\\93\\71.9894\\-203.942\\93\\72.80556\\-205.5209\\93\\73.53389\\-207.474\\93\\71.9894\\-208.521\\93\\70.03628\\-206.5921\\93\\68.08315\\-205.2852\\93\\65.87093\\-207.474\\93\\65.71408\\-209.4271\\93\\65.27332\\-211.3803\\93\\64.35381\\-213.3334\\93\\62.94581\\-215.2865\\93\\62.22377\\-216.0202\\93\\60.27065\\-217.1704\\93\\58.31752\\-217.8016\\93\\56.3644\\-217.8093\\93" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "51" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "619" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-217.646\\95\\50.50502\\-216.4411\\95\\48.5519\\-215.7212\\95\\46.59877\\-214.5225\\95\\45.39724\\-213.3334\\95\\44.23925\\-211.3803\\95\\43.56881\\-207.474\\95\\42.69252\\-206.5258\\95\\40.7394\\-204.9512\\95\\38.78627\\-205.05\\95\\36.83315\\-205.842\\95\\36.48387\\-205.5209\\95\\36.56078\\-203.5678\\95\\38.78627\\-201.3441\\95\\40.7394\\-200.5211\\95\\41.611\\-199.6615\\95\\42.20424\\-197.7084\\95\\42.58402\\-195.7553\\95\\43.68743\\-193.8021\\95\\46.59877\\-190.813\\95\\48.5519\\-189.6602\\95\\50.50502\\-188.8485\\95\\52.45815\\-187.719\\95\\54.41127\\-188.5531\\95\\56.3644\\-189.1781\\95\\58.31752\\-189.6842\\95\\60.27065\\-190.9044\\95\\62.22377\\-191.556\\95\\64.1769\\-192.9054\\95\\65.10487\\-193.8021\\95\\65.753\\-195.7553\\95\\67.13462\\-197.7084\\95\\67.63017\\-199.6615\\95\\68.08315\\-200.1911\\95\\70.11546\\-201.6146\\95\\71.9894\\-203.9042\\95\\72.89687\\-205.5209\\95\\73.66005\\-207.474\\95\\71.9894\\-208.4601\\95\\70.03628\\-206.5207\\95\\68.08315\\-206.0747\\95\\67.04\\-207.474\\95\\66.4788\\-209.4271\\95\\65.5015\\-211.3803\\95\\65.00056\\-213.3334\\95\\63.3252\\-215.2865\\95\\62.22377\\-216.7663\\95\\60.27065\\-218.1887\\95\\58.31752\\-218.6638\\95\\56.3644\\-218.6638\\95\\54.41127\\-218.3071\\95" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "52" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "620" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-217.6266\\97\\48.5519\\-216.1359\\97\\47.19285\\-215.2865\\97\\44.57906\\-213.3334\\97\\44.22971\\-211.3803\\97\\44.13197\\-209.4271\\97\\43.79665\\-207.474\\97\\42.89627\\-205.5209\\97\\42.69252\\-205.3186\\97\\40.7394\\-204.5403\\97\\38.78627\\-204.6171\\97\\37.15867\\-203.5678\\97\\37.87724\\-201.6146\\97\\38.78627\\-200.7969\\97\\40.7394\\-199.5789\\97\\41.82982\\-197.7084\\97\\42.3357\\-195.7553\\97\\43.60746\\-193.8021\\97\\46.59877\\-190.803\\97\\48.5519\\-189.6484\\97\\50.50502\\-188.843\\97\\52.45815\\-187.707\\97\\54.41127\\-188.6125\\97\\56.3644\\-189.1635\\97\\58.31752\\-189.5919\\97\\60.27065\\-190.5891\\97\\62.22377\\-191.2276\\97\\64.1769\\-192.849\\97\\65.18834\\-193.8021\\97\\66.71706\\-195.7553\\97\\67.32939\\-197.7084\\97\\67.71616\\-199.6615\\97\\68.08315\\-200.0731\\97\\70.24143\\-201.6146\\97\\71.9894\\-203.7729\\97\\72.9614\\-205.5209\\97\\73.67171\\-207.474\\97\\71.9894\\-208.4554\\97\\70.03628\\-206.516\\97\\68.08315\\-206.6835\\97\\67.45836\\-207.474\\97\\66.97606\\-209.4271\\97\\65.70465\\-211.3803\\97\\65.29616\\-213.3334\\97\\64.47382\\-215.2865\\97\\62.92503\\-217.2396\\97\\62.22377\\-217.9157\\97\\60.27065\\-218.7838\\97\\58.31752\\-218.969\\97\\56.3644\\-218.969\\97\\54.41127\\-218.844\\97\\52.45815\\-218.3454\\97" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "621" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-218.089\\99\\48.5519\\-216.2222\\99\\46.59877\\-214.5592\\99\\45.33344\\-213.3334\\99\\44.22971\\-211.3803\\99\\44.14034\\-207.474\\99\\43.78503\\-205.5209\\99\\42.69252\\-204.3651\\99\\40.7394\\-203.5012\\99\\38.78627\\-202.7359\\99\\38.02944\\-201.6146\\99\\39.70121\\-199.6615\\99\\41.611\\-197.7084\\99\\42.32553\\-195.7553\\99\\43.63622\\-193.8021\\99\\46.59877\\-190.8578\\99\\48.5519\\-189.7215\\99\\50.50502\\-188.843\\99\\52.45815\\-187.6953\\99\\54.41127\\-187.8762\\99\\56.3644\\-188.7211\\99\\60.27065\\-189.7605\\99\\63.46841\\-191.849\\99\\66.13003\\-193.9123\\99\\67.31992\\-195.7553\\99\\67.65778\\-197.7084\\99\\68.67686\\-199.6615\\99\\70.81422\\-201.6146\\99\\72.51953\\-203.5678\\99\\73.24\\-205.5209\\99\\73.68155\\-207.474\\99\\71.9894\\-208.4457\\99\\70.03628\\-206.4928\\99\\68.08315\\-206.8736\\99\\67.60354\\-207.474\\99\\67.30097\\-209.4271\\99\\66.56738\\-211.3803\\99\\65.53029\\-213.3334\\99\\64.93645\\-215.2865\\99\\62.22377\\-218.0049\\99\\60.27065\\-218.957\\99\\54.41127\\-218.9811\\99\\52.45815\\-218.8779\\99" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "622" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-218.1645\\101\\45.60785\\-213.3334\\101\\44.22971\\-211.3803\\101\\44.22971\\-207.474\\101\\44.1748\\-205.5209\\101\\43.79665\\-203.5678\\101\\42.69252\\-202.4735\\101\\40.7394\\-202.4793\\101\\39.59818\\-201.6146\\101\\39.49428\\-199.6615\\101\\40.42503\\-197.7084\\101\\42.69252\\-195.4962\\101\\43.87835\\-193.8021\\101\\44.64565\\-192.8969\\101\\46.59877\\-191.2276\\101\\48.5519\\-190.4872\\101\\50.50502\\-188.874\\101\\52.45815\\-187.7311\\101\\54.41127\\-187.6953\\101\\56.3644\\-187.848\\101\\58.31752\\-188.6861\\101\\60.27065\\-189.1941\\101\\62.22377\\-190.5102\\101\\64.1769\\-191.2101\\101\\67.02867\\-193.8021\\101\\68.61633\\-195.7553\\101\\69.10834\\-197.7084\\101\\69.3185\\-199.6615\\101\\70.96425\\-201.6146\\101\\72.84786\\-203.5678\\101\\73.6607\\-205.5209\\101\\73.56878\\-207.474\\101\\71.9894\\-208.2355\\101\\70.03628\\-206.2899\\101\\68.08315\\-206.8837\\101\\67.6123\\-207.474\\101\\67.52122\\-209.4271\\101\\66.9123\\-211.3803\\101\\65.63318\\-213.3334\\101\\64.96745\\-215.2865\\101\\62.22377\\-218.0049\\101\\60.27065\\-218.957\\101\\52.45815\\-218.9811\\101" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "623" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-218.1591\\103\\45.65674\\-213.3334\\103\\44.24892\\-211.3803\\103\\44.22971\\-205.5209\\103\\44.18368\\-203.5678\\103\\43.80669\\-201.6146\\103\\42.69252\\-200.5005\\103\\40.7394\\-200.7848\\103\\38.88469\\-199.6615\\103\\39.70676\\-197.7084\\103\\40.7394\\-196.6758\\103\\42.69252\\-194.9843\\103\\44.64565\\-193.4873\\103\\46.59877\\-192.3801\\103\\47.19628\\-191.849\\103\\50.50502\\-189.2603\\103\\52.45815\\-188.5851\\103\\54.41127\\-187.6953\\103\\56.3644\\-187.6837\\103\\58.31752\\-187.7812\\103\\60.27065\\-188.6324\\103\\62.22377\\-189.2063\\103\\66.13003\\-191.767\\103\\68.13573\\-193.8021\\103\\69.33453\\-195.7553\\103\\69.57431\\-197.7084\\103\\69.65925\\-199.6615\\103\\70.98843\\-201.6146\\103\\72.91042\\-203.5678\\103\\73.7149\\-205.5209\\103\\73.22173\\-207.474\\103\\71.9894\\-207.8752\\103\\70.30196\\-205.5209\\103\\70.03628\\-205.2734\\103\\68.08315\\-206.8837\\103\\67.6123\\-207.474\\103\\67.60354\\-209.4271\\103\\66.94725\\-211.3803\\103\\65.62471\\-213.3334\\103\\64.96127\\-215.2865\\103\\62.22377\\-217.9992\\103\\60.27065\\-218.9453\\103\\58.31752\\-218.9811\\103\\52.45815\\-218.969\\103" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "624" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-217.5965\\105\\48.5519\\-216.19\\105\\47.65326\\-215.2865\\105\\45.98449\\-213.3334\\105\\45.39418\\-211.3803\\105\\44.28883\\-209.4271\\105\\44.28883\\-203.5678\\105\\44.23925\\-201.6146\\105\\43.82612\\-199.6615\\105\\42.69252\\-198.5222\\105\\41.63937\\-197.7084\\105\\41.37129\\-195.7553\\105\\42.69252\\-194.2207\\105\\44.64565\\-193.6124\\105\\46.59877\\-193.1459\\105\\48.5519\\-191.96\\105\\50.50502\\-189.579\\105\\52.45815\\-188.3492\\105\\54.41127\\-187.6279\\105\\56.3644\\-187.1476\\105\\58.31752\\-186.9783\\105\\60.27065\\-186.9949\\105\\62.22377\\-187.7658\\105\\64.1769\\-188.8767\\105\\66.13003\\-189.8267\\105\\68.13614\\-191.849\\105\\69.32651\\-193.8021\\105\\69.62988\\-195.7553\\105\\70.59989\\-197.7084\\105\\71.08829\\-199.6615\\105\\71.9894\\-201.4159\\105\\73.314\\-203.5678\\105\\73.70034\\-205.5209\\105\\72.99166\\-207.474\\105\\71.9894\\-207.7836\\105\\70.43964\\-205.5209\\105\\70.03628\\-205.1641\\105\\68.08315\\-206.8837\\105\\67.6123\\-207.474\\105\\67.60354\\-209.4271\\105\\66.94725\\-211.3803\\105\\65.27608\\-213.3334\\105\\64.46063\\-215.2865\\105\\62.22377\\-217.5544\\105\\60.27065\\-218.3046\\105\\58.31752\\-218.957\\105\\54.41127\\-218.9453\\105\\52.45815\\-218.3987\\105" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "625" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-217.6743\\107\\50.50502\\-216.4807\\107\\48.5519\\-214.8474\\107\\47.29865\\-213.3334\\107\\45.90334\\-211.3803\\107\\45.72923\\-209.4271\\107\\45.72923\\-201.6146\\107\\45.69557\\-199.6615\\107\\44.64565\\-197.5903\\107\\42.69252\\-196.9181\\107\\40.76444\\-195.7553\\107\\41.44713\\-193.8021\\107\\42.69252\\-192.623\\107\\44.64565\\-192.6192\\107\\46.59877\\-193.0671\\107\\48.5519\\-192.6116\\107\\49.32316\\-191.849\\107\\50.18387\\-189.8959\\107\\51.52327\\-187.9428\\107\\52.45815\\-187.18\\107\\56.3644\\-186.529\\107\\58.31752\\-185.9669\\107\\60.27065\\-185.9669\\107\\62.22377\\-186.6459\\107\\64.1769\\-186.9399\\107\\66.13003\\-187.7764\\107\\68.23619\\-189.8959\\107\\69.33212\\-191.849\\107\\69.64934\\-193.8021\\107\\70.62898\\-195.7553\\107\\71.31252\\-197.7084\\107\\71.62241\\-199.6615\\107\\72.8451\\-201.6146\\107\\73.67199\\-203.5678\\107\\73.70034\\-205.5209\\107\\71.9894\\-206.7643\\107\\70.03628\\-205.2279\\107\\68.08315\\-206.9447\\107\\67.65778\\-207.474\\107\\67.57784\\-209.4271\\107\\66.88659\\-211.3803\\107\\64.1769\\-214.1886\\107\\62.22377\\-216.3311\\107\\60.27065\\-217.9942\\107\\58.31752\\-218.8585\\107\\56.3644\\-218.8918\\107\\54.41127\\-218.379\\107" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "626" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-217.5652\\109\\52.45815\\-216.4486\\109\\50.50502\\-215.5456\\109\\48.5519\\-213.9682\\109\\48.03523\\-213.3334\\109\\47.32696\\-211.3803\\109\\46.15488\\-209.4271\\109\\46.06864\\-207.474\\109\\46.06055\\-199.6615\\109\\45.85678\\-197.7084\\109\\44.64565\\-195.5999\\109\\42.69252\\-195.1856\\109\\40.79936\\-193.8021\\109\\41.45866\\-191.849\\109\\42.69252\\-190.6782\\109\\44.64565\\-191.1808\\109\\46.59877\\-192.265\\109\\47.36449\\-191.849\\109\\48.5519\\-190.916\\109\\49.20109\\-189.8959\\109\\49.88992\\-187.9428\\109\\50.50502\\-187.3196\\109\\52.45815\\-186.4417\\109\\54.41127\\-185.1732\\109\\56.3644\\-184.919\\109\\62.22377\\-184.919\\109\\64.1769\\-185.2828\\109\\66.13003\\-186.5833\\109\\68.08315\\-187.7368\\109\\69.3424\\-189.8959\\109\\69.66929\\-191.849\\109\\70.65157\\-193.8021\\109\\71.32261\\-195.7553\\109\\71.65331\\-197.7084\\109\\71.73031\\-199.6615\\109\\72.89927\\-201.6146\\109\\73.73082\\-203.5678\\109\\73.69025\\-205.5209\\109\\71.9894\\-206.5165\\109\\70.03628\\-206.0957\\109\\68.57439\\-207.474\\109\\67.23376\\-209.4271\\109\\66.13003\\-210.7099\\109\\62.22377\\-214.6553\\109\\60.27065\\-216.5198\\109\\58.31752\\-217.7937\\109\\56.3644\\-217.832\\109" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "627" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-215.8667\\111\\52.45815\\-214.791\\111\\50.74916\\-213.3334\\111\\48.5519\\-210.9471\\111\\47.41623\\-209.4271\\111\\46.30581\\-207.474\\111\\46.1734\\-205.5209\\111\\46.1734\\-201.6146\\111\\45.99319\\-197.7084\\111\\45.4863\\-195.7553\\111\\44.64565\\-194.7845\\111\\42.69252\\-193.1958\\111\\40.91619\\-191.849\\111\\41.36763\\-189.8959\\111\\42.69252\\-188.6935\\111\\44.64565\\-189.491\\111\\46.59877\\-189.3398\\111\\47.27385\\-187.9428\\111\\48.5519\\-185.6589\\111\\49.74935\\-184.0365\\111\\50.50502\\-183.4748\\111\\54.41127\\-182.8848\\111\\56.3644\\-182.8483\\111\\62.22377\\-182.8862\\111\\64.1769\\-183.7564\\111\\64.54188\\-184.0365\\111\\68.08315\\-185.7787\\111\\69.34603\\-187.9428\\111\\69.68975\\-189.8959\\111\\70.67048\\-191.849\\111\\71.32617\\-193.8021\\111\\71.65331\\-195.7553\\111\\71.84079\\-199.6615\\111\\72.95634\\-201.6146\\111\\73.72629\\-203.5678\\111\\73.51614\\-205.5209\\111\\71.9894\\-206.1942\\111\\70.03628\\-205.6526\\111\\68.87722\\-207.474\\111\\67.0244\\-209.4271\\111\\64.1769\\-212.2702\\111\\62.22377\\-214.1504\\111\\60.27065\\-215.3387\\111\\58.31752\\-215.8725\\111" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "48" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "628" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-213.9825\\113\\52.45815\\-212.8317\\113\\50.50502\\-211.0124\\113\\48.5519\\-209.0323\\113\\47.38932\\-207.474\\113\\46.35129\\-205.5209\\113\\46.08509\\-201.6146\\113\\45.0474\\-195.7553\\113\\43.09776\\-191.849\\113\\42.69252\\-191.4597\\113\\40.7394\\-190.5951\\113\\39.95164\\-189.8959\\113\\40.51404\\-187.9428\\113\\40.7394\\-187.694\\113\\42.69252\\-186.6657\\113\\44.64565\\-185.9588\\113\\46.58839\\-184.0365\\113\\47.77298\\-180.1303\\113\\48.5519\\-176.5495\\113\\48.87742\\-176.224\\113\\50.50502\\-175.8541\\113\\56.3644\\-175.8752\\113\\58.07338\\-178.1771\\113\\58.31752\\-178.2768\\113\\60.39105\\-180.1303\\113\\62.22377\\-180.8164\\113\\64.1769\\-181.7493\\113\\64.60483\\-182.0834\\113\\66.13003\\-182.7831\\113\\68.08315\\-183.9341\\113\\69.35626\\-185.9896\\113\\69.72146\\-187.9428\\113\\70.70034\\-189.8959\\113\\71.32617\\-191.849\\113\\71.64288\\-193.8021\\113\\71.71886\\-197.7084\\113\\73.37286\\-201.6146\\113\\73.71953\\-203.5678\\113\\73.72201\\-205.5209\\113\\71.9894\\-205.9217\\113\\70.03628\\-205.1035\\113\\69.70019\\-205.5209\\113\\68.92368\\-207.474\\113\\66.13003\\-210.2705\\113\\64.1769\\-212.1279\\113\\62.20827\\-213.3334\\113\\60.27065\\-213.9968\\113\\58.31752\\-214.0521\\113" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "56" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "629" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-211.6679\\115\\50.50502\\-210.2983\\115\\49.65795\\-209.4271\\115\\48.03822\\-207.474\\115\\47.32494\\-205.5209\\115\\46.09346\\-203.5678\\115\\45.71749\\-201.6146\\115\\44.44621\\-197.7084\\115\\44.21096\\-195.7553\\115\\43.74314\\-193.8021\\115\\43.10403\\-191.849\\115\\42.69252\\-191.3256\\115\\40.7394\\-188.323\\115\\38.78627\\-188.7283\\115\\38.39775\\-187.9428\\115\\38.86405\\-185.9896\\115\\40.7394\\-184.6975\\115\\42.69252\\-184.1771\\115\\44.75833\\-182.0834\\115\\45.20456\\-180.1303\\115\\45.27344\\-176.224\\115\\45.66333\\-174.2709\\115\\46.59877\\-172.7387\\115\\48.5519\\-170.5274\\115\\50.50502\\-170.4534\\115\\54.41127\\-170.4623\\115\\56.3644\\-170.9245\\115\\57.77645\\-172.3178\\115\\58.31752\\-172.6659\\115\\59.90865\\-174.2709\\115\\60.9669\\-176.224\\115\\62.22377\\-178.1848\\115\\64.1769\\-178.9726\\115\\66.13003\\-180.3046\\115\\69.0216\\-184.0365\\115\\69.74331\\-185.9896\\115\\70.71876\\-187.9428\\115\\71.33662\\-189.8959\\115\\71.64288\\-191.849\\115\\71.71886\\-197.7084\\115\\72.85578\\-199.6615\\115\\73.6607\\-201.6146\\115\\73.93365\\-203.5678\\115\\74.68025\\-205.5209\\115\\73.94253\\-206.391\\115\\71.9894\\-205.8642\\115\\70.03628\\-204.9014\\115\\69.548\\-205.5209\\115\\68.81814\\-207.474\\115\\66.13003\\-210.1763\\115\\64.13126\\-211.3803\\115\\62.22377\\-212.4111\\115\\60.27065\\-212.9539\\115\\58.31752\\-213.0743\\115\\56.3644\\-212.9743\\115\\54.41127\\-212.5213\\115" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "62" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "630" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-211.6312\\117\\52.45815\\-210.5455\\117\\50.50502\\-208.9328\\117\\48.5519\\-206.7748\\117\\47.59301\\-205.5209\\117\\45.84288\\-203.5678\\117\\45.25123\\-201.6146\\117\\44.34169\\-199.6615\\117\\44.11552\\-197.7084\\117\\43.73388\\-195.7553\\117\\43.22879\\-193.8021\\117\\42.274\\-191.849\\117\\42.01565\\-189.8959\\117\\41.40594\\-187.9428\\117\\40.7394\\-187.2866\\117\\38.98972\\-187.9428\\117\\37.69968\\-189.8959\\117\\36.83315\\-190.3231\\117\\36.42571\\-189.8959\\117\\36.19626\\-187.9428\\117\\37.53249\\-185.9896\\117\\37.53249\\-184.0365\\117\\38.78627\\-182.7908\\117\\40.7394\\-182.2731\\117\\42.88359\\-180.1303\\117\\43.27962\\-178.1771\\117\\43.32119\\-172.3178\\117\\44.64565\\-170.3451\\117\\45.38934\\-168.4115\\117\\46.59877\\-167.2964\\117\\48.5519\\-167.1627\\117\\52.45815\\-167.1702\\117\\54.41127\\-167.2649\\117\\56.3644\\-167.4742\\117\\57.72345\\-168.4115\\117\\60.27065\\-170.883\\117\\61.43642\\-172.3178\\117\\62.22377\\-173.8541\\117\\64.00251\\-176.224\\117\\66.13003\\-178.2579\\117\\67.50584\\-180.1303\\117\\68.75489\\-182.0834\\117\\69.51961\\-184.0365\\117\\70.72986\\-185.9896\\117\\71.34706\\-187.9428\\117\\71.64288\\-189.8959\\117\\71.69643\\-191.849\\117\\71.73031\\-197.7084\\117\\72.90119\\-199.6615\\117\\73.94253\\-201.9402\\117\\74.59184\\-203.5678\\117\\75.17208\\-205.5209\\117\\73.94253\\-206.7316\\117\\71.87865\\-205.5209\\117\\70.03628\\-204.5335\\117\\69.1893\\-205.5209\\117\\68.08315\\-207.3881\\117\\66.08967\\-209.4271\\117\\62.22377\\-211.5673\\117\\60.27065\\-212.3817\\117\\58.31752\\-212.7251\\117\\56.3644\\-212.4525\\117" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "59" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "631" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-211.5546\\119\\54.41127\\-210.5174\\119\\52.45815\\-209.6645\\119\\50.50502\\-208.3898\\119\\48.5519\\-206.5021\\119\\45.93592\\-203.5678\\119\\45.46977\\-201.6146\\119\\44.25871\\-199.6615\\119\\43.799\\-197.7084\\119\\43.22055\\-195.7553\\119\\42.274\\-193.8021\\119\\41.75703\\-191.849\\119\\41.51408\\-189.8959\\119\\40.97512\\-187.9428\\119\\38.78627\\-185.7156\\119\\36.83315\\-185.356\\119\\35.88342\\-184.0365\\119\\36.3756\\-182.0834\\119\\36.83315\\-181.6383\\119\\38.78627\\-180.7998\\119\\39.97786\\-180.1303\\119\\40.7394\\-179.2079\\119\\41.27878\\-178.1771\\119\\41.29503\\-172.3178\\119\\41.4354\\-170.3646\\119\\42.83099\\-168.4115\\119\\43.99704\\-166.4584\\119\\44.64565\\-165.8098\\119\\46.59877\\-165.2118\\119\\52.45815\\-165.2233\\119\\54.41127\\-165.6271\\119\\58.31752\\-167.0365\\119\\60.27065\\-168.31\\119\\62.22377\\-170.3723\\119\\63.42678\\-172.3178\\119\\64.1769\\-174.0241\\119\\65.55272\\-176.224\\119\\68.08315\\-179.473\\119\\68.66909\\-180.1303\\119\\69.38694\\-182.0834\\119\\70.62331\\-184.0365\\119\\71.36123\\-185.9896\\119\\71.64288\\-187.9428\\119\\71.69643\\-189.8959\\119\\71.69643\\-193.8021\\119\\71.89466\\-195.7553\\119\\72.19315\\-197.7084\\119\\73.07387\\-199.6615\\119\\74.18154\\-201.6146\\119\\74.88622\\-203.5678\\119\\74.65784\\-205.5209\\119\\73.94253\\-206.1414\\119\\71.9894\\-204.5764\\119\\70.03628\\-204.3145\\119\\67.21873\\-207.474\\119\\66.13003\\-208.5575\\119\\64.1769\\-210.2094\\119\\60.62423\\-211.3803\\119\\58.31752\\-212.0563\\119" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "632" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-209.6155\\121\\52.45815\\-208.5507\\121\\50.50502\\-207.6857\\121\\48.5519\\-206.2927\\121\\47.80809\\-205.5209\\121\\46.38707\\-203.5678\\121\\45.69422\\-201.6146\\121\\44.56488\\-199.6615\\121\\43.70978\\-197.7084\\121\\42.44504\\-195.7553\\121\\41.85997\\-193.8021\\121\\41.4694\\-191.849\\121\\40.46703\\-189.8959\\121\\39.27456\\-185.9896\\121\\38.78627\\-185.2615\\121\\37.5051\\-184.0365\\121\\36.83315\\-183.567\\121\\35.11874\\-182.0834\\121\\36.83315\\-180.5089\\121\\38.78627\\-178.8793\\121\\39.28312\\-178.1771\\121\\39.54217\\-174.2709\\121\\39.5479\\-172.3178\\121\\39.8055\\-170.3646\\121\\41.04539\\-168.4115\\121\\42.05147\\-166.4584\\121\\42.69252\\-165.7427\\121\\44.64565\\-163.8993\\121\\46.59877\\-163.4794\\121\\52.45815\\-163.4837\\121\\54.41127\\-164.1133\\121\\56.3644\\-165.2917\\121\\58.31752\\-165.69\\121\\59.51885\\-166.4584\\121\\62.22377\\-168.4342\\121\\64.1769\\-171.4135\\121\\64.85506\\-172.3178\\121\\65.51573\\-174.2709\\121\\66.85279\\-176.224\\121\\67.4203\\-178.1771\\121\\68.95491\\-180.1303\\121\\69.6109\\-182.0834\\121\\70.89658\\-184.0365\\121\\71.65331\\-185.9896\\121\\71.69643\\-191.849\\121\\71.90863\\-193.8021\\121\\72.75234\\-195.7553\\121\\73.28606\\-197.7084\\121\\74.33178\\-199.6615\\121\\74.98818\\-201.6146\\121\\75.02121\\-203.5678\\121\\73.94253\\-204.4599\\121\\72.66315\\-203.5678\\121\\71.9894\\-202.9287\\121\\70.03628\\-203.4111\\121\\68.80407\\-205.5209\\121\\66.13003\\-208.2482\\121\\62.22377\\-210.4037\\121\\60.27065\\-210.7603\\121\\58.31752\\-210.8182\\121\\56.3644\\-210.4902\\121" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "65" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "633" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-209.5365\\123\\54.41127\\-208.5407\\123\\52.45815\\-207.6994\\123\\50.50502\\-206.4865\\123\\49.26149\\-205.5209\\123\\47.51062\\-203.5678\\123\\46.12793\\-201.6146\\123\\45.49636\\-199.6615\\123\\43.91191\\-197.7084\\123\\42.68489\\-195.7553\\123\\41.97475\\-193.8021\\123\\41.5532\\-191.849\\123\\39.86466\\-189.8959\\123\\38.77864\\-185.9896\\123\\38.38453\\-184.0365\\123\\36.83315\\-182.8109\\123\\34.88002\\-183.189\\123\\33.58014\\-182.0834\\123\\34.25682\\-180.1303\\123\\34.88002\\-179.292\\123\\36.83315\\-178.0564\\123\\37.78687\\-176.224\\123\\38.45165\\-174.2709\\123\\38.58398\\-172.3178\\123\\39.30823\\-170.3646\\123\\39.85453\\-168.4115\\123\\41.22187\\-166.4584\\123\\42.24973\\-164.5053\\123\\42.69252\\-164.0706\\123\\44.64565\\-163.2083\\123\\46.59877\\-162.9681\\123\\52.45815\\-162.9681\\123\\54.41127\\-163.287\\123\\56.3644\\-163.713\\123\\58.31752\\-165.0721\\123\\60.27065\\-165.6761\\123\\63.22659\\-168.4115\\123\\64.79939\\-170.3646\\123\\65.37048\\-172.3178\\123\\66.73402\\-174.2709\\123\\67.39059\\-176.224\\123\\67.5863\\-178.1771\\123\\68.97912\\-180.1303\\123\\69.63955\\-182.0834\\123\\70.79638\\-184.0365\\123\\71.54006\\-185.9896\\123\\71.90863\\-187.9428\\123\\72.1676\\-189.8959\\123\\72.18186\\-191.849\\123\\72.77436\\-193.8021\\123\\74.31488\\-195.7553\\123\\74.96537\\-197.7084\\123\\75.25346\\-199.6615\\123\\75.2668\\-201.6146\\123\\73.94253\\-202.78\\123\\72.59787\\-201.6146\\123\\71.9894\\-200.8955\\123\\70.03628\\-201.5083\\123\\69.06983\\-203.5678\\123\\68.08315\\-205.2989\\123\\66.01247\\-207.474\\123\\64.1769\\-208.4506\\123\\62.05222\\-209.4271\\123\\60.27065\\-210.1067\\123\\58.31752\\-210.1261\\123" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "72" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "634" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-206.5714\\125\\51.08061\\-205.5209\\125\\49.15432\\-203.5678\\125\\47.51313\\-201.6146\\125\\46.13681\\-199.6615\\125\\45.26598\\-197.7084\\125\\43.69781\\-195.7553\\125\\42.59778\\-193.8021\\125\\41.6426\\-191.849\\125\\39.70351\\-189.8959\\125\\38.76357\\-187.9428\\125\\38.42715\\-185.9896\\125\\37.85878\\-184.0365\\125\\36.83315\\-182.2921\\125\\34.88002\\-182.2864\\125\\33.8583\\-184.0365\\125\\32.9269\\-185.402\\125\\30.97377\\-185.5733\\125\\29.89048\\-184.0365\\125\\30.97377\\-182.8565\\125\\31.98848\\-182.0834\\125\\33.06796\\-180.1303\\125\\33.55513\\-178.1771\\125\\34.88002\\-176.7904\\125\\35.74697\\-176.224\\125\\36.83315\\-175.1804\\125\\37.3821\\-174.2709\\125\\37.82954\\-172.3178\\125\\38.51014\\-170.3646\\125\\39.75367\\-168.4115\\125\\40.65863\\-166.4584\\125\\41.76759\\-164.5053\\125\\42.69252\\-163.608\\125\\44.64565\\-162.8987\\125\\46.59877\\-162.4292\\125\\48.5519\\-162.3268\\125\\50.50502\\-162.5146\\125\\52.45815\\-162.8227\\125\\54.41127\\-162.8987\\125\\56.3644\\-163.2683\\125\\58.31752\\-163.7849\\125\\60.27065\\-165.2086\\125\\62.22377\\-166.1654\\125\\64.41931\\-168.4115\\125\\65.35731\\-170.3646\\125\\65.7835\\-172.3178\\125\\67.08142\\-174.2709\\125\\67.5612\\-176.224\\125\\67.62119\\-178.1771\\125\\68.97912\\-180.1303\\125\\69.63955\\-182.0834\\125\\70.13101\\-184.0365\\125\\71.2362\\-185.9896\\125\\72.70218\\-187.9428\\125\\73.1853\\-189.8959\\125\\73.35191\\-191.849\\125\\74.37579\\-193.8021\\125\\75.28259\\-195.7553\\125\\75.57753\\-197.7084\\125\\75.1795\\-199.6615\\125\\73.94253\\-200.8641\\125\\73.1457\\-199.6615\\125\\71.9894\\-198.3152\\125\\70.03628\\-199.515\\125\\69.03374\\-201.6146\\125\\67.93346\\-203.5678\\125\\66.95329\\-205.5209\\125\\66.13003\\-206.3254\\125\\62.22377\\-208.2654\\125\\60.27065\\-208.8196\\125\\58.31752\\-208.831\\125\\56.3644\\-208.3888\\125" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "69" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "635" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "58.31752\\-207.8685\\127\\56.3644\\-206.5053\\127\\52.45815\\-205.491\\127\\50.36959\\-203.5678\\127\\49.275\\-201.6146\\127\\47.53753\\-199.6615\\127\\46.31695\\-197.7084\\127\\45.3951\\-195.7553\\127\\44.64565\\-195.0058\\127\\43.71027\\-193.8021\\127\\41.9167\\-191.849\\127\\39.78827\\-189.8959\\127\\38.6642\\-187.9428\\127\\37.48928\\-184.0365\\127\\36.83315\\-182.1278\\127\\35.79086\\-180.1303\\127\\34.88002\\-179.396\\127\\34.10989\\-180.1303\\127\\33.24534\\-182.0834\\127\\32.13842\\-184.0365\\127\\30.97377\\-184.935\\127\\29.16657\\-184.0365\\127\\30.01979\\-182.0834\\127\\30.97377\\-180.7081\\127\\31.6041\\-180.1303\\127\\32.05078\\-178.1771\\127\\33.22679\\-176.224\\127\\35.81618\\-174.2709\\127\\37.30399\\-172.3178\\127\\37.93301\\-170.3646\\127\\39.74902\\-168.4115\\127\\40.91378\\-166.4584\\127\\41.94633\\-164.5053\\127\\42.69252\\-163.7777\\127\\44.64565\\-163.0258\\127\\46.59877\\-161.7383\\127\\48.5519\\-161.5114\\127\\50.50502\\-161.7639\\127\\52.45815\\-162.5\\127\\54.41127\\-162.8227\\127\\56.3644\\-162.9292\\127\\58.31752\\-163.6803\\127\\60.27065\\-164.741\\127\\62.22377\\-165.6423\\127\\65.00475\\-168.4115\\127\\65.5759\\-170.3646\\127\\66.68045\\-172.3178\\127\\67.40984\\-174.2709\\127\\67.60354\\-176.224\\127\\67.62119\\-178.1771\\127\\68.97912\\-180.1303\\127\\69.87469\\-182.0834\\127\\70.33755\\-184.0365\\127\\71.9894\\-186.0729\\127\\73.35992\\-187.9428\\127\\74.14196\\-189.8959\\127\\74.51597\\-191.849\\127\\74.86108\\-195.7553\\127\\74.19508\\-197.7084\\127\\73.81943\\-197.7084\\127\\71.9894\\-195.764\\127\\70.03628\\-197.0031\\127\\68.87997\\-199.6615\\127\\67.7148\\-201.6146\\127\\66.82488\\-203.5678\\127\\66.13003\\-204.359\\127\\64.1769\\-205.9971\\127\\62.22377\\-206.3089\\127\\60.27065\\-207.8369\\127" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "65" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "636" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "54.41127\\-203.9845\\129\\53.28318\\-203.5678\\129\\52.45815\\-202.9912\\129\\51.38025\\-201.6146\\129\\49.46397\\-199.6615\\129\\48.1426\\-197.7084\\129\\47.48111\\-195.7553\\129\\45.56942\\-193.8021\\129\\44.64565\\-193.1093\\129\\42.69252\\-191.3317\\129\\40.61312\\-189.8959\\129\\38.98571\\-187.9428\\129\\38.23064\\-185.9896\\129\\37.5927\\-184.0365\\129\\36.82552\\-182.0834\\129\\36.76656\\-180.1303\\129\\35.86616\\-178.1771\\129\\34.88002\\-177.524\\129\\34.18633\\-178.1771\\129\\33.04897\\-180.1303\\129\\31.74546\\-182.0834\\129\\30.97377\\-183.0514\\129\\30.05418\\-182.0834\\129\\30.26789\\-180.1303\\129\\30.97377\\-178.3009\\129\\32.16615\\-176.224\\129\\32.9269\\-175.3945\\129\\34.88002\\-174.5831\\129\\36.87071\\-172.3178\\129\\37.7999\\-170.3646\\129\\39.75819\\-168.4115\\129\\41.52742\\-166.4584\\129\\43.19317\\-164.5053\\129\\44.64565\\-163.4227\\129\\46.59877\\-161.7144\\129\\48.5519\\-161.2449\\129\\50.50502\\-161.3564\\129\\52.45815\\-161.7559\\129\\54.41127\\-162.4714\\129\\56.3644\\-162.8777\\129\\58.31752\\-163.6714\\129\\62.22377\\-165.627\\129\\65.02587\\-168.4115\\129\\65.62471\\-170.3646\\129\\66.83776\\-172.3178\\129\\67.46218\\-174.2709\\129\\67.60354\\-176.224\\129\\67.89615\\-178.1771\\129\\69.35509\\-180.1303\\129\\70.03628\\-181.2121\\129\\71.9894\\-183.1052\\129\\72.71828\\-184.0365\\129\\73.07937\\-185.9896\\129\\72.99166\\-187.9428\\129\\71.9894\\-189.8471\\129\\70.03628\\-191.6342\\129\\68.57546\\-193.8021\\129\\68.35688\\-195.7553\\129\\68.26001\\-197.7084\\129\\66.13003\\-200.859\\129\\64.1769\\-202.7615\\129\\63.18639\\-203.5678\\129\\62.22377\\-204.056\\129\\60.27065\\-204.2467\\129\\58.31752\\-204.2587\\129" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "61" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "637" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-201.9023\\131\\55.36459\\-201.6146\\131\\54.41127\\-200.9243\\131\\52.45815\\-199.3047\\131\\51.05124\\-197.7084\\131\\50.50502\\-196.8821\\131\\50.07419\\-195.7553\\131\\48.59768\\-193.8021\\131\\46.59877\\-192.2663\\131\\44.64565\\-191.685\\131\\42.69252\\-190.7992\\131\\40.7394\\-189.1562\\131\\39.52595\\-187.9428\\131\\38.61189\\-185.9896\\131\\37.83748\\-184.0365\\131\\37.29671\\-182.0834\\131\\36.78097\\-178.1771\\131\\34.88002\\-176.7859\\131\\33.0354\\-178.1771\\131\\30.97377\\-180.5392\\131\\30.59993\\-180.1303\\131\\30.2061\\-178.1771\\131\\32.9269\\-175.3152\\131\\34.88002\\-174.119\\131\\36.83315\\-171.9384\\131\\37.79008\\-170.3646\\131\\39.76284\\-168.4115\\131\\44.64565\\-163.7791\\131\\46.59877\\-162.4024\\131\\48.5519\\-161.5756\\131\\50.50502\\-161.2238\\131\\52.45815\\-161.4468\\131\\54.41127\\-161.964\\131\\56.3644\\-162.8777\\131\\58.31752\\-163.6714\\131\\62.22377\\-165.627\\131\\65.02587\\-168.4115\\131\\66.19816\\-172.3178\\131\\67.20473\\-174.2709\\131\\67.89615\\-176.224\\131\\69.37593\\-178.1771\\131\\70.03628\\-178.8313\\131\\71.77925\\-180.1303\\131\\72.79903\\-182.0834\\131\\72.57534\\-184.0365\\131\\71.9894\\-185.0962\\131\\70.2021\\-182.0834\\131\\69.89895\\-182.0834\\131\\68.91209\\-184.0365\\131\\68.9127\\-185.9896\\131\\68.4232\\-187.9428\\131\\66.5257\\-191.849\\131\\66.29409\\-193.8021\\131\\66.265\\-195.7553\\131\\66.13003\\-196.3701\\131\\65.4609\\-197.7084\\131\\64.1769\\-199.0418\\131\\63.35058\\-199.6615\\131\\60.27065\\-200.9444\\131\\59.37119\\-201.6146\\131\\58.31752\\-201.8908\\131" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "55" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "638" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "56.3644\\-196.4419\\133\\54.41127\\-195.5705\\133\\52.68944\\-193.8021\\133\\50.65151\\-191.849\\133\\48.5519\\-190.7073\\133\\44.64565\\-190.3184\\133\\42.69252\\-189.7475\\133\\40.7394\\-188.7143\\133\\39.96786\\-187.9428\\133\\39.04536\\-185.9896\\133\\38.28355\\-184.0365\\133\\38.03632\\-182.0834\\133\\37.62171\\-180.1303\\133\\37.08234\\-178.1771\\133\\36.83315\\-177.8881\\133\\34.88002\\-176.5388\\133\\32.9269\\-177.1323\\133\\30.97377\\-178.8\\133\\30.45337\\-178.1771\\133\\32.11003\\-176.224\\133\\34.03005\\-174.2709\\133\\36.13807\\-172.3178\\133\\37.89441\\-170.3646\\133\\40.7394\\-167.4795\\133\\42.69252\\-166.0145\\133\\44.64565\\-164.9712\\133\\46.59877\\-163.5038\\133\\48.5519\\-162.4292\\133\\50.50502\\-161.5852\\133\\52.45815\\-161.6467\\133\\56.3644\\-162.8669\\133\\58.31752\\-163.6714\\133\\62.22377\\-165.627\\133\\63.0903\\-166.4584\\133\\64.84795\\-168.4115\\133\\65.50566\\-170.3646\\133\\65.65041\\-172.3178\\133\\67.07884\\-174.2709\\133\\68.08315\\-175.3756\\133\\70.03628\\-176.8601\\133\\71.9894\\-178.8963\\133\\72.79742\\-180.1303\\133\\71.9894\\-181.7381\\133\\70.03628\\-180.8826\\133\\68.08315\\-180.6848\\133\\66.55501\\-182.0834\\133\\66.30972\\-184.0365\\133\\66.26611\\-185.9896\\133\\66.13003\\-186.464\\133\\64.44157\\-189.8959\\133\\64.1769\\-190.622\\133\\63.32241\\-191.849\\133\\62.22377\\-193.7716\\133\\60.27065\\-195.7756\\133\\58.31752\\-196.4614\\133" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "49" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "639" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-189.8238\\135\\48.5519\\-189.317\\135\\46.59877\\-189.3088\\135\\44.64565\\-188.9407\\135\\42.69252\\-188.3206\\135\\40.7394\\-187.1004\\135\\39.84671\\-185.9896\\135\\39.0681\\-184.0365\\135\\38.19257\\-180.1303\\135\\37.63829\\-178.1771\\135\\36.83315\\-177.2919\\135\\34.88002\\-176.528\\135\\32.9269\\-176.9784\\135\\32.12958\\-176.224\\135\\33.86748\\-174.2709\\135\\34.88002\\-173.2741\\135\\36.83315\\-171.9387\\135\\38.78627\\-169.7906\\135\\39.76284\\-168.4115\\135\\40.7394\\-167.4838\\135\\44.64565\\-165.5353\\135\\46.59877\\-164.0989\\135\\48.5519\\-163.5237\\135\\50.50502\\-162.8091\\135\\52.45815\\-162.8683\\135\\54.41127\\-163.2411\\135\\56.3644\\-163.2726\\135\\58.31752\\-163.7457\\135\\60.27065\\-164.948\\135\\62.22377\\-165.9447\\135\\62.75591\\-166.4584\\135\\63.86885\\-168.4115\\135\\65.10124\\-170.3646\\135\\65.50185\\-172.3178\\135\\66.13003\\-173.1304\\135\\68.08315\\-174.7928\\135\\70.03628\\-175.6217\\135\\70.6729\\-176.224\\135\\72.8146\\-180.1303\\135\\71.9894\\-181.5408\\135\\70.03628\\-180.668\\135\\68.08315\\-179.1102\\135\\66.13003\\-179.704\\135\\65.75443\\-180.1303\\135\\63.66692\\-185.9896\\135\\60.27065\\-189.5621\\135\\58.31752\\-190.8562\\135\\56.3644\\-190.9034\\135\\54.41127\\-190.6992\\135" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "47" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "640" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.1396\\137\\44.64565\\-187.6828\\137\\42.69252\\-186.8719\\137\\41.54235\\-185.9896\\137\\40.7394\\-185.1926\\137\\39.81995\\-184.0365\\137\\38.99798\\-182.0834\\137\\38.71969\\-180.1303\\137\\38.20485\\-178.1771\\137\\36.83315\\-176.8211\\137\\34.88002\\-176.517\\137\\32.9269\\-176.5937\\137\\32.54633\\-176.224\\137\\33.87246\\-174.2709\\137\\34.88002\\-173.2791\\137\\36.83315\\-172.3985\\137\\38.78627\\-170.284\\137\\39.76284\\-168.4115\\137\\40.7394\\-167.4838\\137\\42.69252\\-166.1119\\137\\46.59877\\-164.6273\\137\\48.5519\\-164.0989\\137\\50.50502\\-163.9279\\137\\52.45815\\-163.9356\\137\\58.31752\\-164.8118\\137\\60.27065\\-165.6638\\137\\62.22377\\-167.4494\\137\\62.98779\\-168.4115\\137\\63.98721\\-170.3646\\137\\65.09692\\-172.3178\\137\\66.13003\\-173.4931\\137\\68.08315\\-174.7294\\137\\70.03628\\-175.7198\\137\\70.53724\\-176.224\\137\\71.52523\\-178.1771\\137\\72.67036\\-180.1303\\137\\71.9894\\-181.429\\137\\70.03628\\-181.1515\\137\\68.08315\\-179.1811\\137\\66.13003\\-178.7428\\137\\64.39308\\-180.1303\\137\\63.79279\\-182.0834\\137\\62.91016\\-184.0365\\137\\62.22377\\-184.9677\\137\\60.27065\\-186.9128\\137\\58.31752\\-188.1095\\137\\56.3644\\-188.1413\\137" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "641" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "44.64565\\-186.4317\\139\\42.69252\\-185.417\\139\\40.7394\\-183.5299\\139\\39.57048\\-182.0834\\139\\39.05681\\-180.1303\\139\\38.71969\\-178.1771\\139\\36.83315\\-176.528\\139\\34.88002\\-176.5058\\139\\34.31256\\-176.224\\139\\33.87246\\-174.2709\\139\\34.88002\\-173.2791\\139\\36.83315\\-172.3985\\139\\38.78627\\-170.284\\139\\39.75819\\-168.4115\\139\\41.70021\\-166.4584\\139\\42.69252\\-165.333\\139\\44.64565\\-164.3425\\139\\46.59877\\-163.9886\\139\\50.50502\\-163.9886\\139\\52.45815\\-164.2462\\139\\54.41127\\-165.2894\\139\\58.31752\\-166.1654\\139\\60.27065\\-167.4042\\139\\62.22377\\-169.3568\\139\\62.96481\\-170.3646\\139\\64.1769\\-172.5619\\139\\66.42199\\-174.2709\\139\\68.08315\\-175.1372\\139\\69.36257\\-176.224\\139\\70.974\\-178.1771\\139\\71.83749\\-180.1303\\139\\70.03628\\-181.6693\\139\\68.08315\\-180.3347\\139\\66.13003\\-178.7153\\139\\64.1769\\-179.031\\139\\63.11111\\-180.1303\\139\\62.71206\\-182.0834\\139\\61.38417\\-184.0365\\139\\60.27065\\-185.15\\139\\58.31752\\-186.284\\139\\56.3644\\-186.6153\\139\\46.59877\\-186.6073\\139" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "642" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "42.69252\\-184.5969\\141\\40.08662\\-182.0834\\141\\39.52116\\-180.1303\\141\\38.71969\\-178.1771\\141\\36.83315\\-176.528\\141\\34.88002\\-176.5058\\141\\34.49121\\-176.224\\141\\33.86748\\-174.2709\\141\\34.88002\\-173.2741\\141\\36.83315\\-172.3843\\141\\38.67777\\-170.3646\\141\\40.58971\\-166.4584\\141\\41.93989\\-164.5053\\141\\42.69252\\-163.7847\\141\\44.64565\\-162.9601\\141\\46.59877\\-162.7136\\141\\48.5519\\-162.7136\\141\\50.50502\\-163.0499\\141\\52.45815\\-163.6675\\141\\56.3644\\-165.7396\\141\\60.03712\\-168.4115\\141\\62.22377\\-170.9811\\141\\63.24219\\-172.3178\\141\\64.1769\\-173.3509\\141\\66.13003\\-174.7328\\141\\68.08315\\-175.5382\\141\\68.80121\\-176.224\\141\\70.07413\\-178.1771\\141\\70.95248\\-180.1303\\141\\70.03628\\-181.4562\\141\\68.08315\\-181.0509\\141\\66.13003\\-179.0541\\141\\64.1769\\-178.6854\\141\\62.31923\\-180.1303\\141\\61.49377\\-182.0834\\141\\60.27065\\-183.8737\\141\\58.31752\\-185.0899\\141\\56.3644\\-185.7779\\141\\54.41127\\-185.841\\141\\48.5519\\-185.828\\141\\46.59877\\-185.5457\\141\\44.64565\\-185.1626\\141" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "643" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-186.3691\\143\\46.59877\\-185.3577\\143\\44.64565\\-184.931\\143\\42.69252\\-184.0741\\143\\40.49191\\-182.0834\\143\\39.69213\\-180.1303\\143\\38.78627\\-178.2593\\143\\36.83315\\-176.528\\143\\34.88002\\-176.528\\143\\34.45504\\-176.224\\143\\33.86748\\-174.2709\\143\\34.88002\\-173.2741\\143\\36.83315\\-172.0039\\143\\38.1081\\-170.3646\\143\\38.76357\\-168.4115\\143\\40.63008\\-164.5053\\143\\42.85215\\-162.5521\\143\\44.64565\\-161.6378\\143\\46.59877\\-161.3931\\143\\48.5519\\-161.3872\\143\\50.50502\\-161.7213\\143\\52.45815\\-162.8302\\143\\54.41127\\-163.6477\\143\\56.3644\\-165.3537\\143\\58.13763\\-166.4584\\143\\60.27065\\-168.05\\143\\60.6321\\-168.4115\\143\\61.55723\\-170.3646\\143\\63.11113\\-172.3178\\143\\64.1769\\-173.4098\\143\\66.13003\\-175.1305\\143\\68.08315\\-176.3916\\143\\69.31644\\-178.1771\\143\\69.80518\\-180.1303\\143\\68.08315\\-181.2307\\143\\66.13003\\-179.363\\143\\64.1769\\-178.5132\\143\\62.22377\\-179.6247\\143\\61.78909\\-180.1303\\143\\61.22652\\-182.0834\\143\\60.27065\\-183.1135\\143\\58.31752\\-184.9638\\143\\56.3644\\-185.8026\\143\\54.41127\\-186.3362\\143\\52.45815\\-186.5789\\143\\50.50502\\-186.5824\\143" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "644" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-186.3106\\145\\44.64565\\-185.284\\145\\42.69252\\-184.5277\\145\\40.14051\\-182.0834\\145\\39.56079\\-180.1303\\145\\38.71969\\-178.1771\\145\\36.83315\\-176.528\\145\\34.88002\\-176.6949\\145\\34.15432\\-176.224\\145\\33.86748\\-174.2709\\145\\35.9606\\-172.3178\\145\\37.42137\\-170.3646\\145\\37.94288\\-168.4115\\145\\39.15562\\-166.4584\\145\\39.86466\\-164.5053\\145\\42.69252\\-161.7406\\145\\44.64565\\-161.2413\\145\\46.59877\\-161.0244\\145\\48.5519\\-161.0244\\145\\50.50502\\-161.2826\\145\\52.45815\\-161.7061\\145\\53.99778\\-162.5521\\145\\56.3644\\-164.1461\\145\\58.31752\\-165.592\\145\\60.27065\\-167.3023\\145\\61.21121\\-168.4115\\145\\62.31923\\-170.3646\\145\\63.22315\\-172.3178\\145\\66.13003\\-175.3676\\145\\67.0953\\-176.224\\145\\68.48839\\-178.1771\\145\\68.97242\\-180.1303\\145\\68.08315\\-181.1314\\145\\66.13003\\-180.4464\\145\\64.1769\\-178.7468\\145\\62.22377\\-179.6247\\145\\61.78909\\-180.1303\\145\\61.1641\\-182.0834\\145\\58.31752\\-184.9591\\145\\56.3644\\-186.1512\\145\\54.41127\\-186.9257\\145\\52.45815\\-187.2544\\145\\50.50502\\-187.2754\\145\\48.5519\\-186.9969\\145" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "645" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-187.9953\\147\\44.64565\\-186.688\\147\\42.69252\\-184.9543\\147\\39.79391\\-182.0834\\147\\39.11394\\-180.1303\\147\\38.70551\\-178.1771\\147\\36.83315\\-176.528\\147\\34.88002\\-177.0165\\147\\33.36635\\-176.224\\147\\33.86748\\-174.2709\\147\\35.82098\\-172.3178\\147\\36.85586\\-170.3646\\147\\38.74871\\-166.4584\\147\\39.74516\\-164.5053\\147\\42.69252\\-161.5961\\147\\44.64565\\-161.0244\\147\\50.50502\\-161.0054\\147\\52.45815\\-161.4393\\147\\54.41127\\-161.9949\\147\\56.3644\\-163.6938\\147\\58.31752\\-165.0542\\147\\60.27065\\-166.0592\\147\\60.66987\\-166.4584\\147\\61.5433\\-168.4115\\147\\62.93821\\-170.3646\\147\\63.50359\\-172.3178\\147\\64.88953\\-174.2709\\147\\66.57627\\-176.224\\147\\67.44786\\-178.1771\\147\\67.96667\\-180.1303\\147\\66.13003\\-181.1784\\147\\64.1769\\-179.1908\\147\\62.22377\\-179.6247\\147\\61.78909\\-180.1303\\147\\61.1641\\-182.0834\\147\\58.31752\\-184.9681\\147\\56.3644\\-186.6926\\147\\54.41127\\-187.4117\\147\\52.45815\\-187.719\\147\\50.50502\\-188.1681\\147" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "646" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.2284\\149\\44.64565\\-187.1605\\149\\42.69252\\-185.3473\\149\\39.69002\\-182.0834\\149\\38.73409\\-180.1303\\149\\38.69153\\-178.1771\\149\\36.83315\\-176.4945\\149\\34.88002\\-177.2596\\149\\32.9269\\-176.3397\\149\\32.9269\\-176.1325\\149\\33.86748\\-174.2709\\149\\35.82098\\-172.3178\\149\\36.84078\\-170.3646\\149\\39.632\\-164.5053\\149\\42.69252\\-161.6001\\149\\44.64565\\-161.061\\149\\46.59877\\-161.0054\\149\\50.50502\\-161.052\\149\\52.45815\\-161.5849\\149\\54.41127\\-162.4035\\149\\56.3644\\-163.6831\\149\\60.27065\\-165.6453\\149\\61.08369\\-166.4584\\149\\61.77988\\-168.4115\\149\\63.09235\\-170.3646\\149\\63.68862\\-172.3178\\149\\64.12472\\-174.2709\\149\\65.39055\\-176.224\\149\\67.01259\\-178.1771\\149\\67.42345\\-180.1303\\149\\66.13003\\-181.7514\\149\\64.1769\\-180.1218\\149\\62.22377\\-179.6247\\149\\61.78909\\-180.1303\\149\\61.16859\\-182.0834\\149\\60.27065\\-183.1022\\149\\58.31752\\-185.0929\\149\\56.3644\\-186.8988\\149\\54.41127\\-187.707\\149\\52.45815\\-188.2054\\149\\50.50502\\-188.856\\149\\48.5519\\-188.9351\\149" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "46" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "647" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.8056\\151\\44.64565\\-187.4843\\151\\42.69252\\-186.6943\\151\\41.99966\\-185.9896\\151\\40.9511\\-184.0365\\151\\39.68608\\-182.0834\\151\\38.73409\\-180.1303\\151\\38.69153\\-178.1771\\151\\36.83315\\-176.0612\\151\\34.88002\\-177.7081\\151\\32.84552\\-178.1771\\151\\32.88934\\-176.224\\151\\33.88301\\-174.2709\\151\\35.82098\\-172.3178\\151\\36.89973\\-170.3646\\151\\38.78627\\-166.3211\\151\\39.42131\\-164.5053\\151\\42.69252\\-161.7514\\151\\44.64565\\-161.3043\\151\\46.59877\\-161.0959\\151\\48.5519\\-161.0959\\151\\50.50502\\-161.298\\151\\52.45815\\-161.8172\\151\\54.41127\\-162.8669\\151\\56.3644\\-163.6831\\151\\60.27065\\-165.6453\\151\\61.08369\\-166.4584\\151\\61.77988\\-168.4115\\151\\63.09235\\-170.3646\\151\\63.68862\\-172.3178\\151\\63.69728\\-174.2709\\151\\65.08166\\-176.224\\151\\66.05679\\-178.1771\\151\\67.16763\\-180.1303\\151\\66.18947\\-182.0834\\151\\64.1769\\-180.5694\\151\\62.22377\\-179.635\\151\\61.7984\\-180.1303\\151\\61.26863\\-182.0834\\151\\60.27065\\-183.861\\151\\57.7625\\-185.9896\\151\\56.3644\\-186.9285\\151\\54.41127\\-188.0375\\151\\52.45815\\-188.8622\\151\\50.50502\\-189.3958\\151\\48.5519\\-189.4465\\151" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "53" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "648" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.9873\\153\\44.64565\\-187.6837\\153\\42.69252\\-187.0443\\153\\41.66076\\-185.9896\\153\\40.50368\\-184.0365\\153\\39.6997\\-182.0834\\153\\38.7939\\-180.1303\\153\\38.70551\\-178.1771\\153\\38.1438\\-176.224\\153\\36.83315\\-175.4207\\153\\35.97445\\-176.224\\153\\34.90274\\-178.1771\\153\\32.9269\\-179.8733\\153\\32.07883\\-178.1771\\153\\32.9269\\-176.6278\\153\\33.27977\\-176.224\\153\\34.02617\\-174.2709\\153\\35.83592\\-172.3178\\153\\37.28613\\-170.3646\\153\\37.8903\\-168.4115\\153\\39.77387\\-164.5053\\153\\40.7394\\-163.6465\\153\\42.69252\\-162.934\\153\\44.64565\\-161.6453\\153\\46.59877\\-161.4518\\153\\48.5519\\-161.4518\\153\\50.50502\\-161.6879\\153\\52.45815\\-162.4024\\153\\54.41127\\-162.9292\\153\\56.3644\\-163.7013\\153\\58.31752\\-164.7643\\153\\60.27065\\-165.6652\\153\\61.06382\\-166.4584\\153\\61.72692\\-168.4115\\153\\63.09235\\-170.3646\\153\\63.68862\\-172.3178\\153\\63.69728\\-174.2709\\153\\65.08166\\-176.224\\153\\65.61702\\-178.1771\\153\\67.0467\\-180.1303\\153\\66.13003\\-181.6485\\153\\64.1769\\-180.1219\\153\\62.22377\\-179.721\\153\\61.86695\\-180.1303\\153\\61.59941\\-182.0834\\153\\61.04533\\-184.0365\\153\\60.27065\\-184.8462\\153\\58.31752\\-186.1905\\153\\56.3644\\-187.0805\\153\\54.41127\\-188.4515\\153\\52.45815\\-189.1991\\153\\50.50502\\-189.6368\\153\\48.5519\\-189.6368\\153" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "50" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "649" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.9674\\155\\44.64565\\-187.6279\\155\\42.69252\\-187.0229\\155\\41.68185\\-185.9896\\155\\40.59079\\-184.0365\\155\\39.80663\\-182.0834\\155\\39.1633\\-180.1303\\155\\38.70551\\-178.1771\\155\\38.54984\\-176.224\\155\\36.83315\\-175.3472\\155\\35.90123\\-176.224\\155\\35.26696\\-178.1771\\155\\32.9269\\-180.342\\155\\32.65169\\-180.1303\\155\\31.93554\\-178.1771\\155\\33.8099\\-176.224\\155\\34.59042\\-174.2709\\155\\36.00683\\-172.3178\\155\\37.78988\\-170.3646\\155\\38.43057\\-168.4115\\155\\39.30902\\-166.4584\\155\\40.7394\\-164.8373\\155\\42.69252\\-163.6661\\155\\44.64565\\-162.934\\155\\46.59877\\-162.3499\\155\\48.5519\\-162.3374\\155\\50.50502\\-162.6043\\155\\54.41127\\-163.2894\\155\\56.3644\\-163.7849\\155\\58.31752\\-165.0923\\155\\60.27065\\-166.0054\\155\\60.72363\\-166.4584\\155\\61.47812\\-168.4115\\155\\63.0695\\-170.3646\\155\\63.64677\\-172.3178\\155\\63.69728\\-174.2709\\155\\65.08166\\-176.224\\155\\65.63579\\-178.1771\\155\\66.98998\\-180.1303\\155\\66.13003\\-181.118\\155\\64.1769\\-179.5366\\155\\62.56933\\-180.1303\\155\\62.22377\\-180.6185\\155\\61.18903\\-184.0365\\155\\60.27065\\-184.9915\\155\\58.31752\\-186.7678\\155\\54.41127\\-188.0389\\155\\52.45815\\-188.9704\\155\\50.50502\\-189.5811\\155\\48.5519\\-189.5919\\155" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "650" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.7819\\157\\44.64565\\-187.4126\\157\\42.69252\\-186.7559\\157\\41.93791\\-185.9896\\157\\40.26288\\-182.0834\\157\\39.61332\\-180.1303\\157\\38.78627\\-178.1587\\157\\36.83315\\-176.4682\\157\\35.65822\\-178.1771\\157\\34.88002\\-178.9719\\157\\32.9269\\-180.342\\157\\32.65169\\-180.1303\\157\\32.02505\\-178.1771\\157\\34.05252\\-176.224\\157\\34.88002\\-174.8448\\157\\36.97266\\-172.3178\\157\\38.40195\\-170.3646\\157\\39.98687\\-166.4584\\157\\40.7394\\-165.7315\\157\\42.69252\\-164.8947\\157\\44.64565\\-163.6221\\157\\46.59877\\-163.4363\\157\\52.45815\\-163.4403\\157\\54.41127\\-163.6826\\157\\56.3644\\-164.3437\\157\\58.31752\\-165.5295\\157\\60.27065\\-167.3427\\157\\62.92424\\-170.3646\\157\\63.43852\\-172.3178\\157\\63.69728\\-174.2709\\157\\65.08166\\-176.224\\157\\65.69267\\-178.1771\\157\\66.98328\\-180.1303\\157\\66.13003\\-181.0011\\157\\64.1769\\-180.0073\\157\\62.22377\\-181.5219\\157\\61.80783\\-182.0834\\157\\61.18903\\-184.0365\\157\\58.31752\\-186.9195\\157\\56.3644\\-187.6498\\157\\54.41127\\-187.6953\\157\\52.45815\\-188.6593\\157\\50.50502\\-189.3003\\157\\48.5519\\-189.3154\\157" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "651" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.0529\\159\\44.64565\\-187.1091\\159\\42.69252\\-185.3403\\159\\41.58095\\-184.0365\\159\\40.53996\\-182.0834\\159\\39.8247\\-180.1303\\159\\39.21165\\-178.1771\\159\\38.78627\\-177.6558\\159\\36.83315\\-177.0871\\159\\34.88002\\-178.9657\\159\\32.9269\\-180.342\\159\\32.65169\\-180.1303\\159\\32.78871\\-178.1771\\159\\34.5699\\-176.224\\159\\35.71483\\-174.2709\\159\\37.68164\\-172.3178\\159\\38.80898\\-170.3646\\159\\39.69999\\-168.4115\\159\\40.7394\\-167.2642\\159\\42.69252\\-165.5719\\159\\44.64565\\-164.789\\159\\46.59877\\-164.1692\\159\\50.50502\\-164.0433\\159\\52.45815\\-164.1085\\159\\54.41127\\-164.3183\\159\\56.3644\\-164.6923\\159\\58.31752\\-165.6577\\159\\61.07677\\-168.4115\\159\\63.17709\\-172.3178\\159\\63.69728\\-174.2709\\159\\65.08166\\-176.224\\159\\66.16759\\-178.1771\\159\\67.14043\\-180.1303\\159\\66.13003\\-181.093\\159\\64.1769\\-180.3777\\159\\62.22377\\-181.6187\\159\\61.80783\\-182.0834\\159\\61.18903\\-184.0365\\159\\58.31752\\-186.9195\\159\\56.3644\\-187.6498\\159\\54.41127\\-187.6953\\159\\52.45815\\-187.9958\\159\\50.50502\\-188.7671\\159\\48.5519\\-188.8438\\159" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "652" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.0667\\161\\46.59877\\-187.6837\\161\\44.64565\\-187.0304\\161\\41.67872\\-184.0365\\161\\40.53996\\-182.0834\\161\\40.20314\\-180.1303\\161\\39.58572\\-178.1771\\161\\38.78627\\-177.3233\\161\\36.83315\\-177.1494\\161\\34.88002\\-178.9271\\161\\32.9269\\-180.342\\161\\32.65169\\-180.1303\\161\\33.37178\\-178.1771\\161\\34.92789\\-176.224\\161\\35.85659\\-174.2709\\161\\37.77519\\-172.3178\\161\\39.28312\\-170.3646\\161\\40.14669\\-168.4115\\161\\40.7394\\-167.8354\\161\\44.64565\\-165.4404\\161\\46.98571\\-164.5053\\161\\48.5519\\-164.017\\161\\50.50502\\-163.8035\\161\\52.45815\\-164.1183\\161\\54.41127\\-164.6273\\161\\56.3644\\-164.6923\\161\\58.31752\\-165.6577\\161\\61.07677\\-168.4115\\161\\61.7984\\-170.3646\\161\\63.09655\\-172.3178\\161\\63.69728\\-174.2709\\161\\65.08611\\-176.224\\161\\66.87432\\-178.1771\\161\\67.41467\\-180.1303\\161\\66.13003\\-181.1203\\161\\64.1769\\-180.3777\\161\\62.22377\\-181.6187\\161\\61.80783\\-182.0834\\161\\61.20208\\-184.0365\\161\\58.31752\\-186.9432\\161\\56.3644\\-187.6498\\161\\52.45815\\-187.862\\161\\50.50502\\-188.0925\\161" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "43" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "653" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-188.3957\\163\\48.5519\\-187.707\\163\\46.59877\\-187.6837\\163\\44.64565\\-187.0304\\163\\41.67872\\-184.0365\\163\\40.53996\\-182.0834\\163\\39.98197\\-180.1303\\163\\39.53562\\-178.1771\\163\\38.78627\\-177.3633\\163\\36.83315\\-177.1494\\163\\34.88002\\-178.9271\\163\\32.9269\\-180.342\\163\\32.65169\\-180.1303\\163\\33.37178\\-178.1771\\163\\34.88002\\-176.8844\\163\\35.39362\\-176.224\\163\\36.0736\\-174.2709\\163\\39.64198\\-170.3646\\163\\41.33076\\-168.4115\\163\\44.64565\\-165.5443\\163\\46.84004\\-164.5053\\163\\48.5519\\-163.7849\\163\\50.50502\\-163.6029\\163\\52.45815\\-163.8767\\163\\54.41127\\-164.6273\\163\\56.3644\\-164.6923\\163\\58.31752\\-165.6577\\163\\61.07677\\-168.4115\\163\\61.7984\\-170.3646\\163\\63.09655\\-172.3178\\163\\63.69728\\-174.2709\\163\\65.08611\\-176.224\\163\\67.01913\\-178.1771\\163\\67.53146\\-180.1303\\163\\66.13003\\-181.1203\\163\\64.1769\\-180.4558\\163\\62.22377\\-181.7225\\163\\61.89825\\-182.0834\\163\\61.2851\\-184.0365\\163\\60.27065\\-185.2818\\163\\58.31752\\-187.1117\\163\\54.41127\\-188.2357\\163\\52.45815\\-188.7231\\163" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "44" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "654" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-188.8941\\165\\48.5519\\-187.8073\\165\\46.59877\\-187.6837\\165\\44.64565\\-187.0304\\165\\41.67872\\-184.0365\\165\\40.53996\\-182.0834\\165\\39.03376\\-178.1771\\165\\38.78627\\-177.8949\\165\\36.83315\\-177.0337\\165\\34.88002\\-178.8787\\165\\32.9269\\-180.342\\165\\32.65169\\-180.1303\\165\\33.4093\\-178.1771\\165\\34.88002\\-177.3467\\165\\35.86828\\-176.224\\165\\37.13711\\-174.2709\\165\\37.92709\\-172.3178\\165\\41.45097\\-168.4115\\165\\42.69252\\-167.1573\\165\\44.64565\\-165.5443\\165\\46.59877\\-164.6539\\165\\48.5519\\-164.2695\\165\\50.50502\\-164.0989\\165\\52.45815\\-164.3183\\165\\54.41127\\-164.6407\\165\\56.3644\\-164.7982\\165\\58.31752\\-165.6818\\165\\61.07677\\-168.4115\\165\\61.88768\\-170.3646\\165\\63.13058\\-172.3178\\165\\63.69728\\-174.2709\\165\\65.08611\\-176.224\\165\\67.01913\\-178.1771\\165\\67.53146\\-180.1303\\165\\66.13003\\-181.1483\\165\\64.1769\\-180.7588\\165\\62.6008\\-182.0834\\165\\61.64326\\-184.0365\\165\\60.91993\\-185.9896\\165\\60.27065\\-186.657\\165\\58.31752\\-187.478\\165\\56.3644\\-187.7812\\165\\54.41127\\-188.76\\165\\52.45815\\-189.2979\\165" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "34" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "655" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.479\\167\\46.59877\\-187.6837\\167\\44.64565\\-187.0487\\167\\41.6661\\-184.0365\\167\\40.53996\\-182.0834\\167\\39.70565\\-180.1303\\167\\38.78627\\-178.2228\\167\\36.47121\\-176.224\\167\\37.64858\\-174.2709\\167\\38.41693\\-172.3178\\167\\39.74862\\-170.3646\\167\\42.69252\\-167.3939\\167\\44.64565\\-165.583\\167\\46.59877\\-164.8823\\167\\50.50502\\-164.5718\\167\\54.41127\\-164.6539\\167\\58.31752\\-165.8441\\167\\61.07677\\-168.4115\\167\\62.63271\\-170.3646\\167\\63.27104\\-172.3178\\167\\63.69728\\-174.2709\\167\\65.08611\\-176.224\\167\\67.01913\\-178.1771\\167\\67.54762\\-180.1303\\167\\66.13003\\-181.3717\\167\\64.1769\\-180.9938\\167\\63.10223\\-182.0834\\167\\61.81738\\-184.0365\\167\\61.17777\\-185.9896\\167\\60.27065\\-186.9259\\167\\56.3644\\-188.3198\\167\\54.41127\\-189.0805\\167\\52.45815\\-189.6029\\167\\50.50502\\-189.166\\167" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "656" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.8896\\169\\46.59877\\-187.6837\\169\\44.64565\\-187.1897\\169\\42.69252\\-185.5616\\169\\41.5271\\-184.0365\\169\\40.5277\\-182.0834\\169\\39.70097\\-180.1303\\169\\38.78627\\-178.2585\\169\\37.57112\\-176.224\\169\\37.75653\\-174.2709\\169\\39.77679\\-170.3646\\169\\42.69252\\-167.4791\\169\\44.64565\\-165.7046\\169\\48.5519\\-165.2303\\169\\50.50502\\-164.741\\169\\52.45815\\-164.6407\\169\\54.41127\\-164.7982\\169\\58.31752\\-166.3363\\169\\60.27065\\-167.6054\\169\\63.01571\\-170.3646\\169\\63.54501\\-172.3178\\169\\63.69728\\-174.2709\\169\\65.08611\\-176.224\\169\\67.01913\\-178.1771\\169\\67.56357\\-180.1303\\169\\66.62582\\-182.0834\\169\\66.13003\\-182.3221\\169\\64.1769\\-181.0496\\169\\63.20448\\-182.0834\\169\\61.95324\\-184.0365\\169\\61.19153\\-185.9896\\169\\60.27065\\-186.944\\169\\58.31752\\-187.6498\\169\\56.3644\\-188.7574\\169\\54.41127\\-189.4402\\169\\52.45815\\-189.6368\\169\\50.50502\\-189.4895\\169" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "657" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.9788\\171\\46.59877\\-187.6953\\171\\44.64565\\-187.5364\\171\\42.69252\\-186.8429\\171\\41.85616\\-185.9896\\171\\40.83414\\-184.0365\\171\\40.5277\\-182.0834\\171\\38.86704\\-178.1771\\171\\37.71694\\-176.224\\171\\37.7662\\-174.2709\\171\\39.36358\\-172.3178\\171\\39.86779\\-170.3646\\171\\42.69252\\-167.5145\\171\\44.64565\\-166.3363\\171\\46.59877\\-166.0424\\171\\50.50502\\-165.158\\171\\52.45815\\-164.6407\\171\\54.41127\\-165.2583\\171\\56.3644\\-165.7594\\171\\58.17618\\-166.4584\\171\\60.27065\\-167.6054\\171\\63.08182\\-170.3646\\171\\63.68005\\-172.3178\\171\\63.78996\\-174.2709\\171\\65.1442\\-176.224\\171\\67.01913\\-178.1771\\171\\67.57281\\-180.1303\\171\\68.30695\\-182.0834\\171\\68.08315\\-182.3392\\171\\66.13003\\-182.5048\\171\\65.67429\\-182.0834\\171\\64.1769\\-181.1208\\171\\63.29416\\-182.0834\\171\\62.75391\\-184.0365\\171\\61.19559\\-185.9896\\171\\60.27065\\-186.944\\171\\58.31752\\-187.7433\\171\\56.3644\\-188.8905\\171\\54.41127\\-189.5919\\171\\50.50502\\-189.6368\\171" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "658" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.9841\\173\\46.59877\\-187.6953\\173\\44.64565\\-187.6722\\173\\42.69252\\-187.0275\\173\\41.68624\\-185.9896\\173\\40.65863\\-184.0365\\173\\40.5277\\-182.0834\\173\\39.8236\\-180.1303\\173\\39.40056\\-178.1771\\173\\37.7267\\-176.224\\173\\37.78027\\-174.2709\\173\\39.62925\\-172.3178\\173\\40.4225\\-170.3646\\173\\41.96815\\-168.4115\\173\\42.69252\\-167.7319\\173\\46.58276\\-166.4584\\173\\48.5519\\-165.7504\\173\\50.50502\\-165.2583\\173\\52.45815\\-164.6539\\173\\54.41127\\-165.5138\\173\\56.3644\\-166.2109\\173\\58.31752\\-166.5531\\173\\60.27065\\-167.5764\\173\\63.11198\\-170.3646\\173\\63.7705\\-172.3178\\173\\64.67099\\-174.2709\\173\\65.3223\\-176.224\\173\\67.07855\\-178.1771\\173\\67.57891\\-180.1303\\173\\68.86916\\-182.0834\\173\\68.08315\\-182.9989\\173\\66.13003\\-181.6697\\173\\64.1769\\-181.4184\\173\\63.58456\\-182.0834\\173\\63.14916\\-184.0365\\173\\60.27065\\-186.944\\173\\58.31752\\-188.4136\\173\\56.3644\\-189.1021\\173\\54.41127\\-189.6254\\173\\50.50502\\-189.6484\\173" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "39" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "659" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-189.0085\\175\\46.59877\\-187.7812\\175\\44.64565\\-187.6837\\175\\42.69252\\-186.9754\\175\\41.78814\\-185.9896\\175\\41.43483\\-184.0365\\175\\40.5277\\-182.0834\\175\\40.34018\\-180.1303\\175\\39.64363\\-178.1771\\175\\37.73119\\-176.224\\175\\37.79477\\-174.2709\\175\\39.73959\\-172.3178\\175\\40.7394\\-171.0971\\175\\42.69252\\-168.9447\\175\\44.64565\\-167.4166\\175\\48.5519\\-165.5981\\175\\50.50502\\-164.7982\\175\\52.45815\\-164.6539\\175\\54.41127\\-165.4008\\175\\56.3644\\-165.8735\\175\\58.29977\\-166.4584\\175\\60.27065\\-167.3449\\175\\62.22377\\-168.8449\\175\\64.61426\\-172.3178\\175\\65.25068\\-174.2709\\175\\66.39088\\-176.224\\175\\67.27543\\-178.1771\\175\\67.57224\\-180.1303\\175\\68.90835\\-182.0834\\175\\68.08315\\-182.9755\\175\\66.13003\\-181.1823\\175\\64.1769\\-181.5207\\175\\63.68005\\-182.0834\\175\\63.20858\\-184.0365\\175\\60.27065\\-186.944\\175\\58.31752\\-188.7973\\175\\56.3644\\-189.4799\\175\\54.41127\\-189.6368\\175\\50.50502\\-189.6484\\175" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "660" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.6605\\177\\45.05518\\-187.9428\\177\\42.69252\\-186.5505\\177\\42.20424\\-185.9896\\177\\41.65728\\-184.0365\\177\\40.53996\\-182.0834\\177\\40.5156\\-180.1303\\177\\39.70833\\-178.1771\\177\\37.73573\\-176.224\\177\\38.02807\\-174.2709\\177\\38.78627\\-173.6075\\177\\41.69271\\-170.3646\\177\\44.64565\\-167.4954\\177\\48.5519\\-165.5295\\177\\50.50502\\-164.6407\\177\\52.45815\\-164.6407\\177\\54.41127\\-164.8329\\177\\56.3644\\-165.4645\\177\\58.31752\\-165.8586\\177\\59.82919\\-166.4584\\177\\62.22377\\-167.6556\\177\\63.01386\\-168.4115\\177\\63.62278\\-170.3646\\177\\65.01605\\-172.3178\\177\\65.55272\\-174.2709\\177\\66.94047\\-176.224\\177\\67.50584\\-178.1771\\177\\67.5499\\-180.1303\\177\\68.77602\\-182.0834\\177\\68.08315\\-182.8172\\177\\67.36208\\-182.0834\\177\\66.13003\\-181.1157\\177\\64.1769\\-181.53\\177\\63.68862\\-182.0834\\177\\63.21265\\-184.0365\\177\\58.31752\\-188.8622\\177\\56.3644\\-189.5919\\177\\54.41127\\-189.6484\\177\\50.50502\\-189.6484\\177\\48.5519\\-189.2229\\177" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "661" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.9624\\179\\42.69252\\-186.4387\\179\\42.30558\\-185.9896\\179\\41.67872\\-184.0365\\179\\40.53996\\-182.0834\\179\\40.5277\\-180.1303\\179\\39.82202\\-178.1771\\179\\38.78627\\-176.9868\\179\\37.88966\\-176.224\\179\\38.78627\\-174.4202\\179\\40.7394\\-171.9647\\179\\41.73465\\-170.3646\\179\\44.64565\\-167.4954\\179\\48.5519\\-165.5249\\179\\50.50502\\-164.6273\\179\\54.41127\\-164.6407\\179\\56.3644\\-164.7871\\179\\58.31752\\-165.4433\\179\\60.27065\\-165.8586\\179\\63.07357\\-168.4115\\179\\64.74974\\-170.3646\\179\\65.31025\\-172.3178\\179\\65.63318\\-174.2709\\179\\66.62119\\-176.224\\179\\67.29369\\-178.1771\\179\\67.16239\\-180.1303\\179\\66.13003\\-180.9552\\179\\64.1769\\-181.53\\179\\63.68862\\-182.0834\\179\\63.21265\\-184.0365\\179\\58.31752\\-188.8622\\179\\56.3644\\-189.5919\\179\\54.41127\\-189.6484\\179\\50.50502\\-189.6484\\179\\48.5519\\-189.5811\\179" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "33" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "662" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.9873\\181\\44.64565\\-187.1994\\181\\42.69252\\-185.2388\\181\\41.67872\\-184.0365\\181\\40.53996\\-182.0834\\181\\40.5277\\-180.1303\\181\\40.40331\\-178.1771\\181\\37.69566\\-176.224\\181\\38.99721\\-174.2709\\181\\40.7394\\-172.0696\\181\\41.73465\\-170.3646\\181\\44.64565\\-167.4954\\181\\46.59877\\-165.7566\\181\\48.5519\\-165.2664\\181\\50.50502\\-164.6273\\181\\56.3644\\-164.6407\\181\\58.31752\\-164.8201\\181\\60.27065\\-165.6528\\181\\62.22377\\-167.2661\\181\\65.02029\\-170.3646\\181\\65.5759\\-172.3178\\181\\65.72363\\-176.224\\181\\67.06921\\-178.1771\\181\\67.23077\\-180.1303\\181\\68.13698\\-182.0834\\181\\66.13003\\-180.9766\\181\\64.1769\\-181.53\\181\\63.68862\\-182.0834\\181\\63.21265\\-184.0365\\181\\58.31752\\-188.8622\\181\\56.3644\\-189.5919\\181\\54.41127\\-189.6484\\181\\48.5519\\-189.6368\\181" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "40" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "663" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.6025\\183\\44.64565\\-187.0445\\183\\41.67872\\-184.0365\\183\\40.53996\\-182.0834\\183\\40.5277\\-180.1303\\183\\39.54173\\-178.1771\\183\\36.95704\\-176.224\\183\\38.99721\\-174.2709\\183\\40.7394\\-172.0676\\183\\41.73005\\-170.3646\\183\\46.59877\\-165.5795\\183\\48.5519\\-164.741\\183\\50.50502\\-164.6273\\183\\52.45815\\-163.7728\\183\\54.41127\\-163.5816\\183\\56.3644\\-163.8559\\183\\58.31752\\-164.6539\\183\\60.27065\\-165.3365\\183\\62.22377\\-165.8887\\183\\62.81649\\-166.4584\\183\\63.61497\\-168.4115\\183\\65.0455\\-170.3646\\183\\65.62471\\-172.3178\\183\\65.64175\\-176.224\\183\\67.02962\\-178.1771\\183\\67.51877\\-180.1303\\183\\68.88767\\-182.0834\\183\\69.2713\\-184.0365\\183\\68.08315\\-185.1059\\183\\67.12839\\-184.0365\\183\\67.27444\\-182.0834\\183\\66.13003\\-181.0936\\183\\64.1769\\-181.53\\183\\63.68862\\-182.0834\\183\\63.21265\\-184.0365\\183\\58.31752\\-188.8622\\183\\56.3644\\-189.5919\\183\\54.41127\\-189.6484\\183\\50.50502\\-189.6484\\183\\48.5519\\-189.2264\\183" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "42" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "664" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-189.014\\185\\46.59877\\-187.8343\\185\\44.64565\\-187.0304\\185\\41.67872\\-184.0365\\185\\40.53996\\-182.0834\\185\\40.5277\\-180.1303\\185\\38.51837\\-178.1771\\185\\36.84078\\-176.224\\185\\38.99721\\-174.2709\\185\\40.5277\\-172.3178\\185\\42.3208\\-168.4115\\185\\42.69252\\-168.0445\\185\\44.64565\\-167.0754\\185\\46.59877\\-165.5192\\185\\48.5519\\-164.6407\\185\\50.50502\\-164.5574\\185\\52.45815\\-163.5745\\185\\54.41127\\-163.0741\\185\\58.31752\\-163.8491\\185\\60.27065\\-164.8201\\185\\62.22377\\-165.6423\\185\\63.07478\\-166.4584\\185\\64.74518\\-168.4115\\185\\65.34056\\-170.3646\\185\\65.63318\\-172.3178\\185\\65.64175\\-176.224\\185\\67.02962\\-178.1771\\185\\67.57891\\-180.1303\\185\\68.88353\\-182.0834\\185\\69.51334\\-184.0365\\185\\68.08315\\-185.6429\\185\\67.02248\\-184.0365\\185\\67.1804\\-182.0834\\185\\66.13003\\-181.2064\\185\\64.1769\\-181.6858\\185\\63.82008\\-182.0834\\185\\63.24261\\-184.0365\\185\\61.20381\\-185.9896\\185\\58.31752\\-188.8622\\185\\56.3644\\-189.5919\\185\\54.41127\\-189.6484\\185\\50.50502\\-189.6484\\185" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "35" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "665" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-188.9841\\187\\46.59877\\-187.6837\\187\\44.64565\\-187.0304\\187\\41.67872\\-184.0365\\187\\40.53996\\-182.0834\\187\\40.5277\\-180.1303\\187\\38.29012\\-178.1771\\187\\36.92789\\-176.224\\187\\39.07701\\-174.2709\\187\\40.5277\\-172.3178\\187\\40.73177\\-170.3646\\187\\41.80348\\-168.4115\\187\\44.64565\\-165.8091\\187\\48.53754\\-164.5053\\187\\50.50502\\-163.7249\\187\\54.41127\\-162.8227\\187\\56.3644\\-162.996\\187\\58.31752\\-163.6855\\187\\62.22377\\-165.627\\187\\64.99483\\-168.4115\\187\\65.54516\\-170.3646\\187\\65.63318\\-172.3178\\187\\65.64175\\-176.224\\187\\67.02962\\-178.1771\\187\\67.6123\\-180.1303\\187\\67.87144\\-182.0834\\187\\69.21365\\-184.0365\\187\\68.08315\\-185.6757\\187\\66.13003\\-185.2906\\187\\64.1769\\-184.6748\\187\\62.22377\\-185.0801\\187\\58.31752\\-188.8622\\187\\56.3644\\-189.5919\\187\\54.41127\\-189.6484\\187\\50.50502\\-189.6484\\187" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "666" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-189.0295\\189\\46.59877\\-187.8343\\189\\44.64565\\-187.0304\\189\\41.67872\\-184.0365\\189\\40.53996\\-182.0834\\189\\40.40288\\-180.1303\\189\\37.54788\\-178.1771\\189\\37.53844\\-176.224\\189\\39.51595\\-174.2709\\189\\40.5277\\-172.3178\\189\\40.53996\\-170.3646\\189\\41.74321\\-168.4115\\189\\44.64565\\-165.5888\\189\\46.59877\\-164.7758\\189\\48.5519\\-163.7494\\189\\52.45815\\-162.9489\\189\\54.41127\\-162.8227\\189\\56.3644\\-162.9987\\189\\58.31752\\-163.6907\\189\\62.22377\\-165.627\\189\\65.02587\\-168.4115\\189\\65.61634\\-170.3646\\189\\65.64175\\-176.224\\189\\66.96918\\-178.1771\\189\\67.53693\\-180.1303\\189\\67.60949\\-182.0834\\189\\68.40867\\-184.0365\\189\\68.08315\\-184.4516\\189\\66.13003\\-185.5978\\189\\64.1769\\-185.1851\\189\\62.4352\\-185.9896\\189\\60.27065\\-187.2188\\189\\58.31752\\-188.8721\\189\\56.3644\\-189.5919\\189\\54.41127\\-189.6484\\189\\50.50502\\-189.6484\\189" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "667" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.6803\\191\\44.64565\\-187.0304\\191\\41.67872\\-184.0365\\191\\40.53996\\-182.0834\\191\\39.50197\\-180.1303\\191\\37.12808\\-178.1771\\191\\37.76254\\-176.224\\191\\39.67188\\-174.2709\\191\\40.5156\\-172.3178\\191\\40.53996\\-170.3646\\191\\41.74321\\-168.4115\\191\\44.64565\\-165.549\\191\\48.5519\\-163.6892\\191\\50.50502\\-163.0688\\191\\52.45815\\-162.8227\\191\\54.41127\\-162.8561\\191\\56.3644\\-163.4799\\191\\58.31752\\-163.9356\\191\\62.22377\\-165.6689\\191\\64.94894\\-168.4115\\191\\65.54193\\-170.3646\\191\\65.63318\\-172.3178\\191\\65.63318\\-176.224\\191\\67.26247\\-180.1303\\191\\67.56757\\-182.0834\\191\\67.59119\\-184.0365\\191\\66.13003\\-185.1283\\191\\64.1769\\-184.8189\\191\\63.19555\\-185.9896\\191\\62.22377\\-186.8949\\191\\60.27065\\-187.546\\191\\58.31752\\-188.8771\\191\\56.3644\\-189.5919\\191\\54.41127\\-189.6484\\191\\50.50502\\-189.6484\\191\\48.5519\\-189.311\\191" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "38" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "668" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "46.59877\\-188.9528\\193\\42.69252\\-185.2227\\193\\41.61658\\-184.0365\\193\\40.37076\\-182.0834\\193\\37.59769\\-180.1303\\193\\37.61729\\-178.1771\\193\\38.13699\\-176.224\\193\\39.64135\\-174.2709\\193\\40.35997\\-172.3178\\193\\40.53996\\-170.3646\\193\\41.74321\\-168.4115\\193\\44.64565\\-165.549\\193\\46.90486\\-164.5053\\193\\48.5519\\-163.9055\\193\\52.45815\\-162.9707\\193\\54.41127\\-163.0079\\193\\56.3644\\-163.6831\\193\\60.27065\\-165.3951\\193\\62.22377\\-166.1654\\193\\64.21446\\-168.4115\\193\\65.2738\\-170.3646\\193\\65.63318\\-172.3178\\193\\65.63318\\-176.224\\193\\65.74309\\-178.1771\\193\\67.01652\\-180.1303\\193\\67.2901\\-182.0834\\193\\66.47246\\-184.0365\\193\\66.13003\\-184.2544\\193\\64.1769\\-183.6473\\193\\63.83038\\-184.0365\\193\\63.20894\\-185.9896\\193\\62.22377\\-186.9662\\193\\60.27065\\-187.8343\\193\\58.31752\\-188.9428\\193\\56.3644\\-189.6029\\193\\54.41127\\-189.6602\\193\\50.50502\\-189.6484\\193\\48.5519\\-189.5391\\193" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "669" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "52.45815\\-190.0501\\195\\48.5519\\-189.6368\\195\\46.59877\\-189.0482\\195\\44.64565\\-187.4898\\195\\42.69252\\-186.5756\\195\\42.10992\\-185.9896\\195\\41.19238\\-184.0365\\195\\39.74195\\-182.0834\\195\\37.66954\\-180.1303\\195\\38.04292\\-178.1771\\195\\38.56248\\-176.224\\195\\39.36358\\-174.2709\\195\\39.85867\\-172.3178\\195\\40.53996\\-170.3646\\195\\41.74321\\-168.4115\\195\\44.64565\\-165.549\\195\\46.59877\\-164.6539\\195\\48.5519\\-164.4677\\195\\50.50502\\-163.8982\\195\\52.45815\\-163.4297\\195\\54.41127\\-163.4841\\195\\56.3644\\-163.967\\195\\57.89225\\-164.5053\\195\\60.27065\\-165.6105\\195\\62.22377\\-167.2618\\195\\65.08095\\-170.3646\\195\\65.62471\\-172.3178\\195\\65.63318\\-178.1771\\195\\66.32946\\-180.1303\\195\\65.51115\\-182.0834\\195\\63.89507\\-184.0365\\195\\63.19609\\-185.9896\\195\\62.22377\\-186.9662\\195\\60.27065\\-188.5815\\195\\56.3644\\-189.8011\\195\\54.41127\\-190.0489\\195" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "670" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-190.6548\\197\\48.5519\\-189.8583\\197\\46.59877\\-189.334\\197\\44.64565\\-188.6403\\197\\42.69252\\-187.0058\\197\\41.69875\\-185.9896\\197\\39.57973\\-182.0834\\197\\38.09084\\-180.1303\\197\\38.56248\\-178.1771\\197\\38.83846\\-174.2709\\197\\39.68302\\-172.3178\\197\\40.35754\\-170.3646\\197\\41.74321\\-168.4115\\197\\44.64565\\-165.549\\197\\46.59877\\-164.6539\\197\\48.5519\\-164.6273\\197\\50.50502\\-164.4677\\197\\52.45815\\-163.5333\\197\\54.41127\\-163.5923\\197\\56.3644\\-164.2815\\197\\58.31752\\-164.6923\\197\\60.27065\\-165.6401\\197\\63.10777\\-168.4115\\197\\64.95087\\-170.3646\\197\\65.54516\\-172.3178\\197\\65.63318\\-174.2709\\197\\65.63318\\-178.1771\\197\\65.69534\\-180.1303\\197\\65.3684\\-182.0834\\197\\64.84344\\-184.0365\\197\\63.23032\\-185.9896\\197\\62.22377\\-187.0877\\197\\60.27065\\-188.91\\197\\58.31752\\-189.5089\\197\\56.3644\\-190.5089\\197\\54.41127\\-191.0488\\197\\52.45815\\-191.065\\197" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "36" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "671" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "48.5519\\-190.4981\\199\\46.59877\\-189.4705\\199\\44.64565\\-188.861\\199\\41.66076\\-185.9896\\199\\40.50368\\-184.0365\\199\\39.68146\\-182.0834\\199\\38.62468\\-180.1303\\199\\38.69153\\-178.1771\\199\\38.69153\\-174.2709\\199\\39.33249\\-172.3178\\199\\39.85957\\-170.3646\\199\\41.74321\\-168.4115\\199\\44.64565\\-165.597\\199\\46.59877\\-164.8329\\199\\48.5519\\-164.6273\\199\\50.50502\\-164.6273\\199\\52.45815\\-163.6144\\199\\54.41127\\-163.4428\\199\\56.3644\\-163.8292\\199\\57.992\\-164.5053\\199\\60.27065\\-165.6453\\199\\63.00404\\-168.4115\\199\\64.21446\\-170.3646\\199\\65.20064\\-172.3178\\199\\65.48783\\-174.2709\\199\\65.63318\\-178.1771\\199\\65.48069\\-182.0834\\199\\65.15782\\-184.0365\\199\\63.39841\\-185.9896\\199\\62.22377\\-187.7558\\199\\60.27065\\-189.172\\199\\58.31752\\-189.6254\\199\\56.3644\\-190.6761\\199\\54.41127\\-191.2485\\199\\52.45815\\-191.3033\\199\\50.50502\\-191.1115\\199" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "37" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "672" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "50.50502\\-190.3872\\201\\48.70726\\-189.8959\\201\\46.59877\\-188.8312\\201\\44.64565\\-187.9505\\201\\42.69252\\-186.6921\\201\\42.00614\\-185.9896\\201\\41.1463\\-184.0365\\201\\40.7394\\-183.6093\\201\\40.03379\\-182.0834\\201\\39.332\\-180.1303\\201\\39.23771\\-176.224\\201\\39.13399\\-174.2709\\201\\39.1633\\-172.3178\\201\\39.9486\\-170.3646\\201\\42.69252\\-167.777\\201\\44.64565\\-166.2227\\201\\48.5519\\-165.1889\\201\\50.50502\\-165.1898\\201\\52.45815\\-164.3058\\201\\54.41127\\-163.9916\\201\\56.3644\\-164.4245\\201\\60.27065\\-166.009\\201\\60.71999\\-166.4584\\201\\62.22377\\-168.4833\\201\\63.01346\\-170.3646\\201\\64.1769\\-172.3358\\201\\64.77061\\-174.2709\\201\\65.24287\\-178.1771\\201\\65.01001\\-180.1303\\201\\65.3684\\-184.0365\\201\\64.1769\\-185.6328\\201\\62.22377\\-187.0156\\201\\60.27065\\-188.7301\\201\\58.31752\\-189.1453\\201\\56.3644\\-189.7105\\201\\54.41127\\-190.3962\\201\\52.45815\\-190.4597\\201" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "10" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "673" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "40.7394\\-174.3062\\203\\40.02677\\-172.3178\\203\\40.7394\\-171.1511\\203\\42.69252\\-169.7956\\203\\44.64565\\-169.9335\\203\\45.13897\\-170.3646\\203\\46.46356\\-172.3178\\203\\46.32986\\-174.2709\\203\\44.64565\\-175.534\\203\\42.69252\\-175.4795\\203" + } + }, + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "CLOSED_PLANAR" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "8" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "674" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "62.22377\\-185.221\\203\\61.20846\\-184.0365\\203\\61.70231\\-182.0834\\203\\62.22377\\-181.5906\\203\\64.1769\\-181.8031\\203\\64.4192\\-182.0834\\203\\65.25975\\-184.0365\\203\\64.1769\\-185.397\\203" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "7" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "255\\255\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "POINT" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "1" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "-0.4882813\\-206.6055\\1" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "8" + } + }, + { + "3006,002a" : { + "Name" : "ROIDisplayColor", + "Type" : "String", + "Value" : "255\\0\\0" + }, + "3006,0040" : { + "Name" : "ContourSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0016" : { + "Name" : "ContourImageSequence", + "Type" : "Sequence", + "Value" : [ + { + "0008,1150" : { + "Name" : "ReferencedSOPClassUID", + "Type" : "String", + "Value" : "1.2.840.10008.5.1.4.1.1.2" + }, + "0008,1155" : { + "Name" : "ReferencedSOPInstanceUID", + "Type" : "String", + "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" + } + } + ] + }, + "3006,0042" : { + "Name" : "ContourGeometricType", + "Type" : "String", + "Value" : "POINT" + }, + "3006,0046" : { + "Name" : "NumberOfContourPoints", + "Type" : "String", + "Value" : "1" + }, + "3006,0048" : { + "Name" : "ContourNumber", + "Type" : "String", + "Value" : "0" + }, + "3006,0050" : { + "Name" : "ContourData", + "Type" : "String", + "Value" : "0.6\\-180.9\\-33" + } + } + ] + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "9" + } + } + ] + }, + "3006,0080" : { + "Name" : "RTROIObservationsSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "1" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "External" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "EXTERNAL" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "2" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "CTV" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "CTV" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "3" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "PTV" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "PTV" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "4" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "PTV Eval" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "PTV" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "5" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "Bladder" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "ORGAN" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "6" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "Rectum" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "ORGAN" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "7" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "Air Override" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "NONE" + }, + "3006,00b0" : { + "Name" : "ROIPhysicalPropertiesSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "REL_MASS_DENSITY" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "1" + } + }, + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "REL_ELEC_DENSITY" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "1.000148" + } + }, + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "EFFECTIVE_Z" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "6.600049" + } + }, + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "EFF_Z_PER_A" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "0.5550822" + } + }, + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "MEAN_EXCI_ENERGY" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "75" + } + }, + { + "3006,00b2" : { + "Name" : "ROIPhysicalProperty", + "Type" : "String", + "Value" : "ELEM_FRACTION" + }, + "3006,00b4" : { + "Name" : "ROIPhysicalPropertyValue", + "Type" : "String", + "Value" : "0" + }, + "3006,00b6" : { + "Name" : "ROIElementalCompositionSequence", + "Type" : "Sequence", + "Value" : [ + { + "3006,00b7" : { + "Name" : "ROIElementalCompositionAtomicNumber", + "Type" : "String", + "Value" : "1" + }, + "3006,00b8" : { + "Name" : "ROIElementalCompositionAtomicMassFraction", + "Type" : "String", + "Value" : "0.111893997" + } + }, + { + "3006,00b7" : { + "Name" : "ROIElementalCompositionAtomicNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,00b8" : { + "Name" : "ROIElementalCompositionAtomicMassFraction", + "Type" : "String", + "Value" : "0.888105989" + } + } + ] + } + } + ] + }, + "300a,00e1" : { + "Name" : "MaterialID", + "Type" : "String", + "Value" : "Water" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "8" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "Localization Poi" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "MARKER" + } + }, + { + "3006,0082" : { + "Name" : "ObservationNumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0084" : { + "Name" : "ReferencedROINumber", + "Type" : "String", + "Value" : "9" + }, + "3006,0085" : { + "Name" : "ROIObservationLabel", + "Type" : "String", + "Value" : "Isocenter" + }, + "3006,00a4" : { + "Name" : "RTROIInterpretedType", + "Type" : "String", + "Value" : "ISOCENTER" + } + } + ] + }, + "300e,0002" : { + "Name" : "ApprovalStatus", + "Type" : "String", + "Value" : "APPROVED" + }, + "300e,0004" : { + "Name" : "ReviewDate", + "Type" : "String", + "Value" : "20181204" + }, + "300e,0005" : { + "Name" : "ReviewTime", + "Type" : "String", + "Value" : "115323" + }, + "300e,0008" : { + "Name" : "ReviewerName", + "Type" : "String", + "Value" : "DSNET_marc.blakey" + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/GenericToolboxTests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/GenericToolboxTests.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,4251 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../Sources/Toolbox/GenericToolbox.h" + +#include +#include +#include + +#include +#include +#include + +TEST(GenericToolbox, TestLegitDoubleString) +{ + using OrthancStone::GenericToolbox::LegitDoubleString; + + EXPECT_TRUE(LegitDoubleString("12.34")); + EXPECT_TRUE(LegitDoubleString("1234")); + EXPECT_TRUE(LegitDoubleString(".1234")); + EXPECT_TRUE(LegitDoubleString("1234.")); + EXPECT_TRUE(LegitDoubleString("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234")); + EXPECT_TRUE(LegitDoubleString("000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000000011234")); + EXPECT_TRUE(LegitDoubleString("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000112.34")); + EXPECT_TRUE(LegitDoubleString("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234.")); + EXPECT_TRUE(LegitDoubleString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001123456")); + EXPECT_TRUE(LegitDoubleString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001123456000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000112345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234565664565623456")); + EXPECT_TRUE(LegitDoubleString("1234.")); + EXPECT_TRUE(LegitDoubleString(".0123")); + EXPECT_TRUE(LegitDoubleString(".123")); + EXPECT_TRUE(LegitDoubleString(".5")); + EXPECT_TRUE(LegitDoubleString(".")); + EXPECT_TRUE(LegitDoubleString("")); + EXPECT_TRUE(LegitDoubleString("0.")); + EXPECT_TRUE(LegitDoubleString(".0")); + + EXPECT_TRUE(LegitDoubleString("1e-15")); + EXPECT_TRUE(LegitDoubleString("1E-15")); + EXPECT_TRUE(LegitDoubleString("0.31E-15")); + EXPECT_TRUE(LegitDoubleString(".0031E-15")); + EXPECT_TRUE(LegitDoubleString("1e-15")); + EXPECT_TRUE(LegitDoubleString("1E015")); + EXPECT_TRUE(LegitDoubleString("0.31E015")); + + + EXPECT_FALSE(LegitDoubleString(".5f")); + EXPECT_FALSE(LegitDoubleString("\n.0031E015")); + EXPECT_FALSE(LegitDoubleString(".05f")); + EXPECT_FALSE(LegitDoubleString(" 1 2 ")); + EXPECT_FALSE(LegitDoubleString(" 0.12\t")); + EXPECT_FALSE(LegitDoubleString(" 0.12")); + EXPECT_FALSE(LegitDoubleString("0.12\t")); + EXPECT_FALSE(LegitDoubleString("12\t")); + EXPECT_FALSE(LegitDoubleString(".01 23")); + EXPECT_FALSE(LegitDoubleString(". 123")); + EXPECT_FALSE(LegitDoubleString(".5 ")); + EXPECT_FALSE(LegitDoubleString(" .")); + EXPECT_FALSE(LegitDoubleString("\n0.")); +} + +TEST(GenericToolbox, TestLegitIntegerString) +{ + using OrthancStone::GenericToolbox::LegitIntegerString; + + EXPECT_TRUE(LegitIntegerString("1234")); + EXPECT_TRUE(LegitIntegerString("234")); + EXPECT_TRUE(LegitIntegerString("01234")); + EXPECT_TRUE(LegitIntegerString("12340")); + EXPECT_TRUE(LegitIntegerString("0000000000000011234")); + EXPECT_TRUE(LegitIntegerString("00000000000000011234")); + EXPECT_TRUE(LegitIntegerString("00000000000011234")); + EXPECT_TRUE(LegitIntegerString("112340000000000010")); + EXPECT_TRUE(LegitIntegerString("0000000000001123456")); + EXPECT_TRUE(LegitIntegerString("000000000000112345604565665623456")); + EXPECT_TRUE(LegitIntegerString("")); + EXPECT_TRUE(LegitIntegerString("0")); + EXPECT_TRUE(LegitIntegerString("00000")); + + EXPECT_FALSE(LegitIntegerString(".5f")); + EXPECT_FALSE(LegitIntegerString("1e-15")); + EXPECT_FALSE(LegitIntegerString("1E-15")); + EXPECT_FALSE(LegitIntegerString("0.31E-15")); + EXPECT_FALSE(LegitIntegerString(".0031E-15")); + EXPECT_FALSE(LegitIntegerString("1e-15")); + EXPECT_FALSE(LegitIntegerString("1E015")); + EXPECT_FALSE(LegitIntegerString("0.31E015")); + EXPECT_FALSE(LegitIntegerString("\n.0031E015")); + EXPECT_FALSE(LegitIntegerString(".05f")); + EXPECT_FALSE(LegitIntegerString(" 1 2 ")); + EXPECT_FALSE(LegitIntegerString(" 0.12\t")); + EXPECT_FALSE(LegitIntegerString(" 0.12")); + EXPECT_FALSE(LegitIntegerString("0.12\t")); + EXPECT_FALSE(LegitIntegerString("12\t")); + EXPECT_FALSE(LegitIntegerString(".01 23")); + EXPECT_FALSE(LegitIntegerString(". 123")); + EXPECT_FALSE(LegitIntegerString(".5 ")); + EXPECT_FALSE(LegitIntegerString(" .")); + EXPECT_FALSE(LegitIntegerString("\n0.")); +} + +TEST(GenericToolbox, TestStringToDouble) +{ + using OrthancStone::GenericToolbox::StringToDouble; + + const double TOLERANCE = 0.00000000000001; + double r = 0.0; + bool ok = StringToDouble(r, "0.0001"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.0001, r, TOLERANCE); + + { + bool ok = StringToDouble(r, "0.0001"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.0001, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.50217817069333900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.50217817069333900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.96770274105399000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.96770274105399000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.49521088758962000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.49521088758962000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.06201839227379000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.06201839227379000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.33360671999703000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.33360671999703000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.07639304839166000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.07639304839166000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.19287806240687400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.19287806240687400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.44207082838626000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.44207082838626000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.84619708036551800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.84619708036551800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.58091726580509000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.58091726580509000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.18073661859763000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.18073661859763000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.33045549786387000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.33045549786387000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.00272400249168000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.00272400249168000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.95337715877137000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.95337715877137000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "8.95930523708542000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(8.95930523708542000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.78847681371515000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.78847681371515000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.23601540702684000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.23601540702684000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.40676557671367000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.40676557671367000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.36110595246212700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.36110595246212700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.10430292945232000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.10430292945232000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.34892053003478100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.34892053003478100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.86871791690589000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.86871791690589000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.23477571361979100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.23477571361979100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.17723077954105000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.17723077954105000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.55533339430731000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.55533339430731000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.39193581722996000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.39193581722996000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.98290538242799000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.98290538242799000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.39701448187652000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.39701448187652000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.97546141973594000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.97546141973594000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.33870401451186000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.33870401451186000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.15061799435527000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.15061799435527000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.78705704115137000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.78705704115137000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.56210637202493000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.56210637202493000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-8.86139731673717000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-8.86139731673717000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.63169336137189000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.63169336137189000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.93978481744645000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.93978481744645000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.49952444717512000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.49952444717512000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.32659301981935000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.32659301981935000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.59514994228045000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.59514994228045000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.66422938111626000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.66422938111626000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.70431239624531000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.70431239624531000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.22698147029468000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.22698147029468000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.90761005965631200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.90761005965631200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.43368952065867000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.43368952065867000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.79510450171595000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.79510450171595000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.94081596072268000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.94081596072268000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.42019476309409300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.42019476309409300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.70663631642677000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.70663631642677000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.06601188243267550000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.06601188243267550000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.79928310771909400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.79928310771909400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.65577800860582000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.65577800860582000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.62187216187698000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.62187216187698000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.95596656702613300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.95596656702613300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.14349841191783000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.14349841191783000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.23732575725115000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.23732575725115000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.02522229405373000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.02522229405373000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.43364697172459700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.43364697172459700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.39612114240613000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.39612114240613000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.87981321512563200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.87981321512563200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.47459557296809400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.47459557296809400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.10534326849558000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.10534326849558000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.48420825457170000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.48420825457170000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.98994851457562000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.98994851457562000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.18550683277018200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.18550683277018200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.79951199056989300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.79951199056989300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.92573951347502000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.92573951347502000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.46138476058529000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.46138476058529000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.34518431607109000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.34518431607109000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.33372656820168000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.33372656820168000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.16931283159188600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.16931283159188600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.97223922802124000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.97223922802124000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.48394627491386000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.48394627491386000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.88861737945960600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.88861737945960600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.85676190081840000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.85676190081840000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.54459170417494000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.54459170417494000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.16447870264995300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.16447870264995300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.35795535411029000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.35795535411029000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.29431172135530300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.29431172135530300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.96558311276619000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.96558311276619000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.81681460880669000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.81681460880669000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.20509941503951000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.20509941503951000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.72765905661257000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.72765905661257000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.48788237089759900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.48788237089759900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.24947907141902000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.24947907141902000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.59005387432649000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.59005387432649000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.30370570926522000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.30370570926522000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.73638792046556000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.73638792046556000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.87789934199453800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.87789934199453800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.51989255137937000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.51989255137937000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.76305470679095000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.76305470679095000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.86920962997342000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.86920962997342000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.91313411328065000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.91313411328065000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.73463683758381000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.73463683758381000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.84273889473222500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.84273889473222500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.87403925546477700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.87403925546477700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.36964126011414000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.36964126011414000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.02726746648694000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.02726746648694000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.50557053097483000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.50557053097483000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.56453106035648000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.56453106035648000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.61890516636808000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.61890516636808000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.37767835277405000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.37767835277405000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.90511255527429100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.90511255527429100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.05929345122920000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.05929345122920000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.21311454144036000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.21311454144036000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-7.79062987304713000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-7.79062987304713000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.21365525338096000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.21365525338096000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.28348152906416000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.28348152906416000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.06610409505261000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.06610409505261000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.35302095923550200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.35302095923550200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.90818370281786000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.90818370281786000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.32125632829404000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.32125632829404000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.19461589112926800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.19461589112926800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.13206147532649300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.13206147532649300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.90445975568758000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.90445975568758000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.09055301456874000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.09055301456874000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.94747584830211900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.94747584830211900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.87479371073786000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.87479371073786000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.77693922561847000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.77693922561847000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.43857452366099000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.43857452366099000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.32571155407419000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.32571155407419000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.02598140411007480000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.02598140411007480000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.63213858956142000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.63213858956142000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.87199046737281000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.87199046737281000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.51485641768478000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.51485641768478000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.64286402800302700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.64286402800302700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.47677130142230000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.47677130142230000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.39498987162520000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.39498987162520000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.97846593865349600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.97846593865349600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.38696988049949000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.38696988049949000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.99716557343840900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.99716557343840900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.26983285318203300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.26983285318203300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.02818282704670500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.02818282704670500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.33995460770471000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.33995460770471000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.90961343273142000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.90961343273142000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.70545858631691000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.70545858631691000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.99837322296447000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.99837322296447000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.52931499785106000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.52931499785106000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.50600351005455000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.50600351005455000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.83191012798055900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.83191012798055900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.58090819604341000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.58090819604341000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.95182376827953000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.95182376827953000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.04199841193785000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.04199841193785000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.17938850513021000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.17938850513021000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.66797071567664000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.66797071567664000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.37221015583147000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.37221015583147000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.75673862000485000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.75673862000485000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.79003986824116500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.79003986824116500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.86020949016507000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.86020949016507000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.14082258481500000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.14082258481500000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.71685664840859000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.71685664840859000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.93998389083824300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.93998389083824300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.77244357996158000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.77244357996158000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.10595524850565900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.10595524850565900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.69799635213612000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.69799635213612000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.57971250175452400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.57971250175452400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.92766866933807100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.92766866933807100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.46991620588858000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.46991620588858000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.94569644123488000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.94569644123488000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.18859094010287000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.18859094010287000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.03213167005865000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.03213167005865000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "8.81754146434609000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(8.81754146434609000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.75897430327076600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.75897430327076600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.80047028975912000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.80047028975912000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.00529573224131364000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.00529573224131364000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.71024073322357000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.71024073322357000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.60642130185119000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.60642130185119000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.09793780927960000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.09793780927960000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.18560965637846000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.18560965637846000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.13078526893487000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.13078526893487000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.19951899215254000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.19951899215254000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.81885534502479000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.81885534502479000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.00480638980341000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.00480638980341000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.35315675289406200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.35315675289406200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.29812812014442000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.29812812014442000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.98878626408816000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.98878626408816000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.34644737073484000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.34644737073484000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.37478492823657000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.37478492823657000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.97205178784195000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.97205178784195000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.65165003646427000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.65165003646427000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.89236175545723000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.89236175545723000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.80366872242454000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.80366872242454000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "7.65465855719486000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(7.65465855719486000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.51455943741659600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.51455943741659600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.14337541345649000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.14337541345649000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.06909574569091000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.06909574569091000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.07698497525470000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.07698497525470000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.04223854975535000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.04223854975535000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.46422724459484000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.46422724459484000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.65888981424971000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.65888981424971000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-7.10193673069906000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-7.10193673069906000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.77638222509466500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.77638222509466500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.15543610545042000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.15543610545042000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.51787760900314000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.51787760900314000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.09022915694655000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.09022915694655000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.41861013154040000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.41861013154040000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.40227565288403000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.40227565288403000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.44321592617247400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.44321592617247400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.34090258417639000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.34090258417639000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.54291265629528700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.54291265629528700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.70700051509186000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.70700051509186000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-6.55072864947955000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-6.55072864947955000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.96741942560520000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.96741942560520000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.55202552301084000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.55202552301084000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.36133250863907300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.36133250863907300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.46513564511238000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.46513564511238000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.97424909475891000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.97424909475891000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.87005014400085000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.87005014400085000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.25552308785543000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.25552308785543000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.43365620710902500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.43365620710902500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.17392137573999000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.17392137573999000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.56870774575795000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.56870774575795000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.07449225479459900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.07449225479459900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.25905472211571000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.25905472211571000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.13708454690765000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.13708454690765000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.08223808231444500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.08223808231444500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.69624060459529000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.69624060459529000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.87232652840742000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.87232652840742000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.20739068103174300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.20739068103174300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.45449313279700600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.45449313279700600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.06604828436047000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.06604828436047000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.16603807756896700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.16603807756896700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "6.56288534361719000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(6.56288534361719000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.28481655900710000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.28481655900710000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.79412040010646300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.79412040010646300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.90088144503330000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.90088144503330000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.65278657648370200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.65278657648370200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.40305895338068000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.40305895338068000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.07193308249503000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.07193308249503000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.83752112822253600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.83752112822253600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.63174453257058400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.63174453257058400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.80163760021425000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.80163760021425000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.57922670044433000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.57922670044433000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "6.80309348037215000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(6.80309348037215000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.03658264005365000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.03658264005365000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "8.57714214650747000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(8.57714214650747000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.25657256359494300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.25657256359494300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.07218601388076000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.07218601388076000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.70300607815345600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.70300607815345600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.06822028770915030000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.06822028770915030000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.52253514473857300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.52253514473857300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.89211508282910000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.89211508282910000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.47331243043688000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.47331243043688000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.77190031720697000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.77190031720697000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.80704979593058400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.80704979593058400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.58398766715845000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.58398766715845000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.59532008540482000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.59532008540482000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.92824570343456000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.92824570343456000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.15232705272560400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.15232705272560400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.13670276871382500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.13670276871382500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.20063314286385000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.20063314286385000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.20390958339690000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.20390958339690000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.01999231401200000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.01999231401200000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.33696129476675000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.33696129476675000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.97472839619216000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.97472839619216000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.25935508044004000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.25935508044004000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.98737992668548000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.98737992668548000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.12647380973595000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.12647380973595000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.04573005673487000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.04573005673487000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.40131707240240000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.40131707240240000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.65350895248975000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.65350895248975000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.94344081509933000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.94344081509933000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.72697189247371000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.72697189247371000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-6.67990308483490000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-6.67990308483490000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.32343310660542000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.32343310660542000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.78517123090950000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.78517123090950000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.25849816293583000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.25849816293583000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.75396267700095000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.75396267700095000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.07647901824168000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.07647901824168000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.38047538070258000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.38047538070258000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.20758597742145100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.20758597742145100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.85537090667122100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.85537090667122100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.76805423797310000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.76805423797310000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.40449492713592000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.40449492713592000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.62167096457336000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.62167096457336000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.74002997550002000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.74002997550002000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.42443064164790400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.42443064164790400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.27951604455776900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.27951604455776900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.51579267322296100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.51579267322296100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.36457251883339000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.36457251883339000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.24583724281163800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.24583724281163800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.89377268220461400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.89377268220461400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.45674815825147000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.45674815825147000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.85885778179785000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.85885778179785000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.46665640857091000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.46665640857091000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.20955012166670000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.20955012166670000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.56901773371710000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.56901773371710000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.28236715260714000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.28236715260714000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.68701183150938000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.68701183150938000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.52491544332882000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.52491544332882000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.35369978756681100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.35369978756681100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.37511760913818000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.37511760913818000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.97143364160106000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.97143364160106000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.24559477959438200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.24559477959438200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.75423032204965000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.75423032204965000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.32370293533555300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.32370293533555300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.91057697616735300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.91057697616735300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.47061739750017000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.47061739750017000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.00584944044255000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.00584944044255000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.50109276836214000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.50109276836214000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.55007311077336000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.55007311077336000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "6.72362848947278000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(6.72362848947278000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.01151577930873910000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.01151577930873910000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.42911860719965600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.42911860719965600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.66111289816664900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.66111289816664900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.86619326895662000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.86619326895662000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.55732089555551800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.55732089555551800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.30341160871063000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.30341160871063000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.56416171751671000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.56416171751671000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.18594183907073900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.18594183907073900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.76842629255481000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.76842629255481000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.51401910241563500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.51401910241563500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.22475819701855600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.22475819701855600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.52647532265208000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.52647532265208000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.36302691626541400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.36302691626541400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.97344494357431000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.97344494357431000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.55983273528683000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.55983273528683000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.11831213859734000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.11831213859734000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.65912510665320000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.65912510665320000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.49382686162217300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.49382686162217300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.82681319206813000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.82681319206813000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.63990018376158400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.63990018376158400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.46190583889476000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.46190583889476000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.33778970852365000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.33778970852365000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.67479071577411000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.67479071577411000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.92524843393689500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.92524843393689500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.25880026429762000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.25880026429762000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.74489327613996700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.74489327613996700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.81221138965657700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.81221138965657700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.63922583575742000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.63922583575742000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.46277795175279000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.46277795175279000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.92701639727950000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.92701639727950000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.00608886511047000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.00608886511047000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.59692755566202000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.59692755566202000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.43660191582482000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.43660191582482000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.81340386111566000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.81340386111566000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.41381029424169000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.41381029424169000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.19067619994638000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.19067619994638000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.41344288416300500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.41344288416300500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.19449050806631000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.19449050806631000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.94346623486537000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.94346623486537000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.15222182306952000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.15222182306952000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.16597270635016000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.16597270635016000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.70800933434033500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.70800933434033500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.01520859362049000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.01520859362049000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.99808924291921000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.99808924291921000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.46413571523617000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.46413571523617000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.23372155013436100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.23372155013436100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.22220872747082200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.22220872747082200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.45231083327185000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.45231083327185000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.18629931302726700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.18629931302726700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.25902351261081000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.25902351261081000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.74979626491734000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.74979626491734000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.96938763187002300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.96938763187002300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.01957662295404000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.01957662295404000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.29052978268713000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.29052978268713000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.72223107008226000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.72223107008226000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.02075269473024000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.02075269473024000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.41254866425811000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.41254866425811000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.79485280000328000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.79485280000328000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.71346724218879000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.71346724218879000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.02769972220451300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.02769972220451300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.30840233811538300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.30840233811538300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.46998368658050000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.46998368658050000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.39027116095637000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.39027116095637000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.76287623175477000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.76287623175477000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.32254147772188000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.32254147772188000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.43476530791568300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.43476530791568300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.15293149279800000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.15293149279800000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.52187680632247000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.52187680632247000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.81464816227136000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.81464816227136000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.45410471462063000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.45410471462063000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.05770661428355000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.05770661428355000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.13365631051443000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.13365631051443000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.78752268413674000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.78752268413674000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.07653691039301000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.07653691039301000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.69590678743817200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.69590678743817200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.16750017237716000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.16750017237716000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.80454059859949500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.80454059859949500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.01080121519000000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.01080121519000000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-6.26823154211325000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-6.26823154211325000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.27168923945051000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.27168923945051000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.95882006177823000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.95882006177823000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.29782169884960000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.29782169884960000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.18868107998160000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.18868107998160000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.42221680213317000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.42221680213317000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.97658929351465000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.97658929351465000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.76786358453912000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.76786358453912000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.63996015852897000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.63996015852897000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.53048948235281000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.53048948235281000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.72713707173900000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.72713707173900000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.67678586641071000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.67678586641071000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.27938145860632000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.27938145860632000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.67198854485259000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.67198854485259000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.08448300379640000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.08448300379640000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.89200760812645600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.89200760812645600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.84610740591283000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.84610740591283000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.33520422865196000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.33520422865196000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.26977509689943300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.26977509689943300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.06556998317024000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.06556998317024000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.10187258099846900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.10187258099846900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.17925123727943000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.17925123727943000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.53744857107300000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.53744857107300000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.79170718052687000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.79170718052687000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.70094405912437000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.70094405912437000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.36090079790873000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.36090079790873000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.24214402582849600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.24214402582849600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.61857148054390100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.61857148054390100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.49681404951875000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.49681404951875000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.62901170744691000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.62901170744691000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.31812686057237000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.31812686057237000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.29232513324991000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.29232513324991000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.30415968616239000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.30415968616239000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.23085063327904200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.23085063327904200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.55328286749515200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.55328286749515200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.85987085857330000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.85987085857330000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.91580898949892000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.91580898949892000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.83451772893723400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.83451772893723400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "8.47663066417390000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(8.47663066417390000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.07750241770625000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.07750241770625000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.79888627452876900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.79888627452876900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.62390154942094000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.62390154942094000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.15344123017231000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.15344123017231000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.29946850732165400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.29946850732165400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.43195118421230900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.43195118421230900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.96541584823575200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.96541584823575200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.31046639376194000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.31046639376194000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.80868720295308000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.80868720295308000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.91875650345864000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.91875650345864000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.16383120358956700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.16383120358956700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.70602187714556100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.70602187714556100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.59908461641224000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.59908461641224000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.75777826959967000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.75777826959967000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "7.51297060665513000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(7.51297060665513000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.26428182282563100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.26428182282563100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.39790664337099000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.39790664337099000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.52727246472497000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.52727246472497000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.15622706860781000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.15622706860781000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.33838258813926000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.33838258813926000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.68209356689853000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.68209356689853000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.12950059731897000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.12950059731897000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.24366467557925000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.24366467557925000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.49620375847259000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.49620375847259000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.04336416841016000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.04336416841016000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.67258592218424000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.67258592218424000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.50983053528049600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.50983053528049600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.91671084717300400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.91671084717300400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-8.44023177630015000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-8.44023177630015000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.74048232685721000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.74048232685721000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.26893036021697000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.26893036021697000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.81851986861265000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.81851986861265000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.15033199581975000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.15033199581975000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.78498201393837000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.78498201393837000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.05287486584367510000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.05287486584367510000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.61135813076181000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.61135813076181000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.28026567889772000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.28026567889772000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.42191037602383000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.42191037602383000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.91926628714024000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.91926628714024000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.13695172353534000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.13695172353534000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.19234124167404000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.19234124167404000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.54749310279860000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.54749310279860000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.79683457995789900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.79683457995789900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.35976469553121900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.35976469553121900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.77036485893720200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.77036485893720200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.05245602278075000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.05245602278075000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.82693752156961000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.82693752156961000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.59176692084240000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.59176692084240000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.59390017044970000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.59390017044970000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.33597209441560000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.33597209441560000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.73223852215944000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.73223852215944000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.36562951036666300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.36562951036666300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.16083819415565000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.16083819415565000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.19457461912900000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.19457461912900000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.48993781857833000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.48993781857833000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.91089514047878000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.91089514047878000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.67713158365996000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.67713158365996000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.14929866451844800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.14929866451844800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.76110653286820000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.76110653286820000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.05937778946509720000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.05937778946509720000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.67737188304973000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.67737188304973000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.58425440578219000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.58425440578219000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.30491550374261000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.30491550374261000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.48379945880357000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.48379945880357000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.62987027701035800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.62987027701035800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.97181285150671000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.97181285150671000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.24881707556359700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.24881707556359700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.83925282156180000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.83925282156180000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.07567311295324000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.07567311295324000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.78919598870022000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.78919598870022000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.51240908161798000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.51240908161798000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.51275535534832000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.51275535534832000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.58920518726789000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.58920518726789000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.81944139206950000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.81944139206950000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.20584689863215000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.20584689863215000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.52387820278697400000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.52387820278697400000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.41030960929320000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.41030960929320000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.92103214885374000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.92103214885374000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.24231540245246000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.24231540245246000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.16908726665941100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.16908726665941100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.44589887686242000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.44589887686242000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.49069006371512000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.49069006371512000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.80650544937931100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.80650544937931100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.97976397104165000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.97976397104165000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.98766812819005000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.98766812819005000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.72989593663204100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.72989593663204100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.61947487048298000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.61947487048298000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.14305085135282200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.14305085135282200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.19625994631193500000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.19625994631193500000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.37918205114016000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.37918205114016000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "6.59599108171267000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(6.59599108171267000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.96455017519345000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.96455017519345000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.54659210340770000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.54659210340770000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.34333955584988000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.34333955584988000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.97945807230247000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.97945807230247000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.16309656911088000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.16309656911088000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.25046325751587000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.25046325751587000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.95513333613538000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.95513333613538000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.44180657712571200000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.44180657712571200000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.62068238736436000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.62068238736436000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.06550714914445000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.06550714914445000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.50821128944561000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.50821128944561000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.15508838007900000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.15508838007900000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.95233817795899000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.95233817795899000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.51496658163574000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.51496658163574000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.78333801715048000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.78333801715048000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.21314186040171000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.21314186040171000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.66527690284710800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.66527690284710800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.15441313415350000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.15441313415350000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.23491685110319000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.23491685110319000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.72724695951577000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.72724695951577000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.24050455306641300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.24050455306641300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.21656863480457000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.21656863480457000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.26488830552906000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.26488830552906000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "3.75588617365038000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(3.75588617365038000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.03323480544193850000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.03323480544193850000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.09120742547457650000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.09120742547457650000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-7.88263056036503000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-7.88263056036503000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.43816026309627000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.43816026309627000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-7.03193105607121000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-7.03193105607121000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.60611554369909000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.60611554369909000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-5.51585989717609000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-5.51585989717609000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.07820571638609000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.07820571638609000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.06101375865811000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.06101375865811000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.20736962161768000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.20736962161768000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.90243061828996000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.90243061828996000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.85299495975262000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.85299495975262000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.12934888152265000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.12934888152265000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.67072919212958000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.67072919212958000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.83114509924264900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.83114509924264900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.30250616100438000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.30250616100438000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.12093048302870000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.12093048302870000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.05552960660102000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.05552960660102000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.49292325032676000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.49292325032676000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.17400757029104000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.17400757029104000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.14267109660887000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.14267109660887000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.10546669054034000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.10546669054034000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.21371952871041700000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.21371952871041700000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "4.78156583044177000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(4.78156583044177000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.50472792044367000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.50472792044367000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.12605755507866600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.12605755507866600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.70371185139311000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.70371185139311000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.10053982101354000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.10053982101354000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.83624586947925000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.83624586947925000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.05046060224221000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.05046060224221000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.28157147555257100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.28157147555257100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.59637285322805000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.59637285322805000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.75470175557419100000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.75470175557419100000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.70838399472621000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.70838399472621000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.45654131621183000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.45654131621183000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.28443945581399000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.28443945581399000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.68823597183684000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.68823597183684000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.29650435341174000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.29650435341174000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.90134290476188000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.90134290476188000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.18487205108194000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.18487205108194000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.14778330708372000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.14778330708372000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.98574838531856000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.98574838531856000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.38116626593387000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.38116626593387000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.18109367323846900000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.18109367323846900000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.54919024558896000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.54919024558896000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-3.01819062231017000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-3.01819062231017000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.86141885135950000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.86141885135950000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.31984756442573800000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.31984756442573800000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.35256585949514000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.35256585949514000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-6.04254591090669000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-6.04254591090669000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.31151799331342300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.31151799331342300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.77556498660193000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.77556498660193000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "5.90371566906766000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(5.90371566906766000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.29825016398122000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.29825016398122000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.01456323654512000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.01456323654512000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-6.19305288625244000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-6.19305288625244000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.99509367627092600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.99509367627092600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.08519786419394440000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.08519786419394440000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.88317752752055000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.88317752752055000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "1.69592260047492000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(1.69592260047492000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.66260089028084000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.66260089028084000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.12882625389413000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.12882625389413000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.79536921500302000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.79536921500302000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-4.51399167357593000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-4.51399167357593000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-0.75817764527332300000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-0.75817764527332300000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-2.12821371262498000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-2.12821371262498000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "-1.08153732327358000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(-1.08153732327358000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "0.71608571781169600000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(0.71608571781169600000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.42004689052701000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.42004689052701000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.84542164846610000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.84542164846610000000, r, TOLERANCE); + } + + { + bool ok = StringToDouble(r, "2.97822513569917000000"); + EXPECT_TRUE(ok); + EXPECT_NEAR(2.97822513569917000000, r, TOLERANCE); + } +} + +TEST(GenericToolbox, TestStringToDoubleHard) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17f", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17f", b); +#endif + double r = 0.0; + bool ok = StringToDouble(r, txt); + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > TOLERANCE) + { + printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b-r), TOLERANCE); + } +#endif + EXPECT_NEAR(b, r, TOLERANCE); + } +} + +TEST(GenericToolbox, TestStringToDoubleHardNeg) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = -1.0*DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17f", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17f", b); +#endif + double r = 0.0; + bool ok = StringToDouble(r, txt); + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > TOLERANCE) + { + printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b - r), TOLERANCE); + } +#endif + EXPECT_NEAR(b, r, TOLERANCE); + } +} + +static const size_t NUM_TIMINGS_CONVS = 1; // set to 2000 if you want to measure perfs; + + +//4444444444444444$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + +TEST(GenericToolbox, TestStringToDoubleHardNeg_lexical_cast_vs_StringToDouble) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + double total_us_StringToDouble = 0.0; + double total_us_lexical_cast = 0.0; + int64_t numConversions = 0; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17f", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17f", b); +#endif + + + double r = 0.0; + + bool ok = true; + + { + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) + { + ok = StringToDouble(r, txt); + } + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + total_us_StringToDouble += (end - start).total_microseconds(); + } + + { + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) + { + try + { + r = boost::lexical_cast(txt); + ok = true; + } + catch (boost::bad_lexical_cast& ) + { + ok = false; + } + } + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + total_us_lexical_cast += (end - start).total_microseconds(); + } + numConversions += NUM_TIMINGS_CONVS; + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > TOLERANCE) + { + printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b - r), TOLERANCE); + } +#endif + EXPECT_NEAR(b, r, TOLERANCE); + } + std::cout << "Total time (us) for " << numConversions + << " conversions using StringToDouble (with NO scientific notation) = " + << static_cast(total_us_StringToDouble) << std::endl; + + std::cout << "Time per conversion using StringToDouble (ns) = " + << (int64_t)( (total_us_StringToDouble * 1000) /((double)numConversions)) << std::endl; + + std::cout << "Total time (us) for " << numConversions + << " conversions using boost::lexical_cast (with NO scientific notation) = " + << static_cast(total_us_lexical_cast) << std::endl; + + std::cout << "Time per conversion using boost::lexical_cast (ns) = " + << (int64_t)( (total_us_lexical_cast * 1000) / ((double)numConversions)) << std::endl; + + std::cout << "StringToDouble is " << (int)((total_us_lexical_cast / total_us_StringToDouble) + 0.5) << " times faster than boost::lexical_cast" << std::endl; + +} +//4444444444444444$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + + +TEST(GenericToolbox, TestStringToDoubleHardScientific) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + + // the tolerance must be adapted depending on the exponent + double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); + double actualTolerance = TOLERANCE * pow(10.0, exponent); + + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17e", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17e", b); +#endif + double r = 0.0; + bool ok = StringToDouble(r, txt); + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > actualTolerance) + { + printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + ok = StringToDouble(r, txt); + } + else + { + printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + } +#endif + EXPECT_NEAR(b, r, actualTolerance); + } +} + +TEST(GenericToolbox, TestStringToDoubleHardNegScientific) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + // the tolerance must be adapted depending on the exponent + double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); + double actualTolerance = TOLERANCE * pow(10.0, exponent); + + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17e", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17e", b); +#endif + double r = 0.0; + bool ok = StringToDouble(r, txt); + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > actualTolerance) + { + printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + ok = StringToDouble(r, txt); + } + else + { + printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + } +#endif + EXPECT_NEAR(b, r, actualTolerance); + } +} + + +TEST(GenericToolbox, TestStringToDoubleHardNegScientific_lexical_cast_vs_StringToDouble) +{ + using OrthancStone::GenericToolbox::StringToDouble; + const double TOLERANCE = 0.00000000000001; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + + double total_us_StringToDouble = 0.0; + double total_us_lexical_cast = 0.0; + int64_t numConversions = 0; + + for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + // the tolerance must be adapted depending on the exponent + double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); + double actualTolerance = TOLERANCE * pow(10.0, exponent); + + char txt[1024]; +#if defined(_MSC_VER) + sprintf_s(txt, "%.17e", b); +#else + snprintf(txt, sizeof(txt) - 1, "%.17e", b); +#endif + double r = 0.0; + + bool ok = true; + + { + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) + { + ok = StringToDouble(r, txt); + } + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + total_us_StringToDouble += (end - start).total_microseconds(); + } + + { + boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); + for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) + { + try + { + r = boost::lexical_cast(txt); + ok = true; + } + catch (boost::bad_lexical_cast& ) + { + ok = false; + } + } + boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); + total_us_lexical_cast += (end - start).total_microseconds(); + } + numConversions += NUM_TIMINGS_CONVS; + +#if 0 + if (ok) + { + printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); + } + else + { + printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); + ok = StringToDouble(r, txt); + } +#endif + + EXPECT_TRUE(ok); + +#if 0 + if (fabs(b - r) > actualTolerance) + { + printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + ok = StringToDouble(r, txt); + } + else + { + printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); + printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); + } +#endif + EXPECT_NEAR(b, r, actualTolerance); + } + + std::cout << "Total time (us) for " << numConversions + << " conversions using StringToDouble (WITH scientific notation) = " + << static_cast(total_us_StringToDouble) << std::endl; + + std::cout << "Time per conversion using StringToDouble (ns) = " + << (int64_t)( (total_us_StringToDouble*1000) / ((double)numConversions)) << std::endl; + + std::cout << "Total time (us) for " << numConversions + << " conversions using boost::lexical_cast (WITH scientific notation) = " + << static_cast(total_us_lexical_cast) << std::endl; + + std::cout << "Time per conversion using boost::lexical_cast (ns) = " + << (int64_t)( (total_us_lexical_cast * 1000) / ((double)numConversions)) << std::endl; + + std::cout << "StringToDouble is " << (int)((total_us_lexical_cast / total_us_StringToDouble)+ 0.5) << " times faster than boost::lexical_cast" << std::endl; +} + + +TEST(GenericToolbox, TestStringToIntegerHard) +{ + using OrthancStone::GenericToolbox::StringToInteger; + + size_t i = 0; + const size_t COUNT = 125; + //const double FACTOR = 1.000000000171271211; + const double FACTOR = 1.71271211; + for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) + { + int64_t bi = static_cast(b); + char txt[1024]; +#if defined(_MSC_VER) +# if (_MSC_VER > 1800) + sprintf_s(txt, "%lld", bi); +# else + sprintf_s(txt, "%I64d", bi); +# endif +#else + snprintf(txt, sizeof(txt) - 1, "%ld", bi); +#endif + int64_t r = 0; + bool ok = StringToInteger(r, txt); + EXPECT_TRUE(ok); + EXPECT_EQ(bi, r); +#if 0 + if (ok) + { + printf("OK for b = %.17f bi = %lld txt = \"%s\" and r = %lld\n", b, bi, txt, r); + } + else + { + printf("NOK for b = %.17f bi = %lld txt = \"%s\" and r = %lld\n", b, bi, txt,r); + ok = StringToInteger(r, txt); + } +#endif + } +} + + +TEST(GenericToolbox, TestGetRgbValuesFromString) +{ + using OrthancStone::GenericToolbox::GetRgbValuesFromString; + + uint8_t red = 0; + uint8_t green = 0; + uint8_t blue = 0; + + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, " ")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb() ")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,30 2563) ")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,30 2563,45) ")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,303.23,45)")); + EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,303,45 ")); + + ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, "rgb(12,255,45)")); + EXPECT_EQ(12, red); + EXPECT_EQ(255, green); + EXPECT_EQ(45, blue); + + ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 72 , 257 , 47 ) ")); + EXPECT_EQ(72, red); + EXPECT_EQ(1, green); //rollover 255 --> 255, 256 --> 0, 257 --> 1,... + EXPECT_EQ(47, blue); + + ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 72 , 247 , 47 ) ")); + EXPECT_EQ(72, red); + EXPECT_EQ(247, green); + EXPECT_EQ(47, blue); + + ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 000, 0, 000) ")); + EXPECT_EQ(0, red); + EXPECT_EQ(0, green); + EXPECT_EQ(0, blue); +} + + + + + + + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/ImageToolboxTests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/ImageToolboxTests.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,260 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +#include "../Sources/Toolbox/ImageToolbox.h" + +// #include +// #include + +#include +#include +#include + +#include "stdint.h" + +#include + +#include + + +TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1) +{ + using OrthancStone::HistogramData; + using OrthancStone::DumpHistogramResult; + using OrthancStone::ComputeHistogram; + + const unsigned int W = 16; + const unsigned int H = 16; + + // 256/17 = 15,... + // 256 % 17 = 1 + // 0 will be 16 times + // 1 will be 15 times + // 2 will be 15 times + // ... + // 16 will be 15 times + + size_t pixCounter = 0; + + std::unique_ptr image(new Orthanc::Image( + Orthanc::PixelFormat_Grayscale8, W, H, false)); + + for (unsigned int y = 0; y < H; ++y) + { + uint8_t* buffer = reinterpret_cast(image->GetRow(y)); + for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) + { + *buffer = static_cast(pixCounter % 17); + } + } + + HistogramData hd; + ComputeHistogram(*image, hd, 1); + ASSERT_EQ(-0.5, hd.minValue); + ASSERT_EQ(17u, hd.bins.size()); + ASSERT_EQ(16u, hd.bins[0]); + for (size_t i = 1; i < hd.bins.size(); ++i) + ASSERT_EQ(15u, hd.bins[i]); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1_FormatString) +{ + using OrthancStone::HistogramData; + using OrthancStone::DumpHistogramResult; + using OrthancStone::ComputeHistogram; + + const unsigned int W = 16; + const unsigned int H = 16; + + // 256/17 = 15,... + // 256 % 17 = 1 + // 0 will be 16 times + // 1 will be 15 times + // 2 will be 15 times + // ... + // 16 will be 15 times + + size_t pixCounter = 0; + + std::unique_ptr image(new Orthanc::Image( + Orthanc::PixelFormat_Grayscale8, W, H, false)); + + for (unsigned int y = 0; y < H; ++y) + { + uint8_t* buffer = reinterpret_cast(image->GetRow(y)); + for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) + { + *buffer = static_cast(pixCounter % 17); + } + } + + HistogramData hd; + ComputeHistogram(*image, hd, 1); + + // void DumpHistogramResult(std::string& s, const HistogramData& hd) + std::string s; + DumpHistogramResult(s, hd); + std::cout << s; +} + +template +void SimpleHisto_T_BinSize1_2() +{ + using OrthancStone::HistogramData; + using OrthancStone::DumpHistogramResult; + using OrthancStone::ComputeHistogram; + + const unsigned int W = 16; + const unsigned int H = 16; + + // 256/17 = 15,... + // 256 % 17 = 1 + // 0 will be 16 times + // 1 will be 15 times + // 2 will be 15 times + // ... + // 16 will be 15 times + + size_t pixCounter = 0; + + std::unique_ptr image(new Orthanc::Image( + Format, W, H, false)); + + typedef typename Orthanc::PixelTraits::PixelType PixelType; + + PixelType pixValue = 0; + + for (unsigned int y = 0; y < H; ++y) + { + PixelType* buffer = reinterpret_cast(image->GetRow(y)); + for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) + { + // 0..99 0..99 0..55 + *buffer = pixValue; + pixValue++; + if (pixValue >= 100) + pixValue = 0; + } + } + + HistogramData hd; + ComputeHistogram(*image, hd, 1); + ASSERT_EQ(-0.5, hd.minValue); + ASSERT_EQ(100u, hd.bins.size()); + for (size_t i = 0; i <= 55; ++i) + ASSERT_EQ(3u, hd.bins[i]); + for (size_t i = 56; i <= 99; ++i) + ASSERT_EQ(2u, hd.bins[i]); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1_2) +{ + SimpleHisto_T_BinSize1_2(); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale16_BinSize1_2) +{ + SimpleHisto_T_BinSize1_2(); +} + +TEST(ImageToolbox, SimpleHisto_SignedGrayscale16_BinSize1_2) +{ + SimpleHisto_T_BinSize1_2(); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale32_BinSize1_2) +{ + SimpleHisto_T_BinSize1_2(); +} + +template +void SimpleHisto_T_BinSize10_2() +{ + using OrthancStone::HistogramData; + using OrthancStone::DumpHistogramResult; + using OrthancStone::ComputeHistogram; + + const unsigned int W = 16; + const unsigned int H = 16; + + // 256/17 = 15,... + // 256 % 17 = 1 + // 0 will be 16 times + // 1 will be 15 times + // 2 will be 15 times + // ... + // 16 will be 15 times + + size_t pixCounter = 0; + + std::unique_ptr image(new Orthanc::Image( + Format, W, H, false)); + + typedef typename Orthanc::PixelTraits::PixelType PixelType; + + PixelType pixValue = 0; + + for (unsigned int y = 0; y < H; ++y) + { + PixelType* buffer = reinterpret_cast(image->GetRow(y)); + for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) + { + // 0..99 0..99 0..55 + *buffer = pixValue; + pixValue++; + if (pixValue >= 100) + pixValue = 0; + } + } + + HistogramData hd; + ComputeHistogram(*image, hd, 10); + ASSERT_EQ(-0.5, hd.minValue); + ASSERT_EQ(10u, hd.bins.size()); + + for (size_t i = 0; i <= 4; ++i) + ASSERT_EQ(30u, hd.bins[i]); + + ASSERT_EQ(26u, hd.bins[5]); + + for (size_t i = 6; i <= 9; ++i) + ASSERT_EQ(20u, hd.bins[i]); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize10_2) +{ + SimpleHisto_T_BinSize10_2(); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale16_BinSize10_2) +{ + SimpleHisto_T_BinSize10_2(); +} + +TEST(ImageToolbox, SimpleHisto_SignedGrayscale16_BinSize10_2) +{ + SimpleHisto_T_BinSize10_2(); +} + +TEST(ImageToolbox, SimpleHisto_Grayscale32_BinSize10_2) +{ + SimpleHisto_T_BinSize10_2(); +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/PixelTestPatternsTests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/PixelTestPatternsTests.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,168 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "../Sources/Toolbox/PixelTestPatterns.h" + +#include +#include + +#include +#include + +#include +#include +#include + + /* Autogenerated from prout.png */ +static const unsigned char bin2c_SimpleRedBlueHGradient_png[391] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\0\200\0\0\0\200\10\6\0\0\0\303>a\313\0\0\1MIDATx\234\355\322\1\15\3000\0\303\260~\3741o\7\342X\12\203|o{wgev\26Z\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p?\314\262\201\3760\355r\262\0\0\0\0IEND\256B`\202"; + +TEST(PixelTestPatterns, SimpleRedHGradient) +{ + std::unique_ptr texture; + + texture.reset(new Orthanc::Image( + Orthanc::PixelFormat_RGBA32, + 128, + 128, + /*forceMinimalPitch*/false)); + + Orthanc::ImageAccessor target; + texture->GetWriteableAccessor(target); + + OrthancStone::PixelTestPatterns::fillWithHGradient(target,255,0,0,0,0,255); + + Orthanc::PngWriter writer; +#if 0 + writer.WriteToFile("SimpleRedBlueHGradient.png", *texture); +#else + std::string contents; + writer.WriteToMemory(contents, *texture); + + ASSERT_EQ(1u, sizeof(unsigned char)); + ASSERT_EQ(391u, sizeof(bin2c_SimpleRedBlueHGradient_png)); + ASSERT_EQ(390u, contents.size()); + + char* resultPngBytes = &(contents[0]); + + int result = memcmp(resultPngBytes, bin2c_SimpleRedBlueHGradient_png, 390); + ASSERT_EQ(0, result); +#endif +} + +static const unsigned char bin2c_SimpleRedBlueVGradient_png[400] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\0\200\0\0\0\200\10\6\0\0\0\303>a\313\0\0\1VIDATx\234\355\322A\21\3000\14\300\260t7\376\220\327\301\310\303\22\2?|\356\314\35\262\336o\236\355\6\26\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\316\231\357nG\260\347\7\221\255\203\367~A)\36\0\0\0\0IEND\256B`\202"; + + +TEST(PixelTestPatterns, SimpleRedBlueVGradient) +{ + std::unique_ptr texture; + + texture.reset(new Orthanc::Image( + Orthanc::PixelFormat_RGBA32, + 128, + 128, + /*forceMinimalPitch*/false)); + + Orthanc::ImageAccessor target; + texture->GetWriteableAccessor(target); + + OrthancStone::PixelTestPatterns::fillWithVGradient(target, 255, 0, 0, 0, 0, 255); + + Orthanc::PngWriter writer; +#if 0 + writer.WriteToFile("SimpleRedBlueVGradient.png", *texture); +#else + std::string contents; + writer.WriteToMemory(contents, *texture); + + ASSERT_EQ(1u, sizeof(unsigned char)); + ASSERT_EQ(400u, sizeof(bin2c_SimpleRedBlueVGradient_png)); + ASSERT_EQ(399u, contents.size()); + + char* resultPngBytes = &(contents[0]); + + int result = memcmp(resultPngBytes, bin2c_SimpleRedBlueVGradient_png, 399); + ASSERT_EQ(0, result); +#endif +} + + +/* Autogenerated from MultiGradient.png */ +static const unsigned char bin2c_MultiGradient_png[774] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\1\0\0\0\0\200\10\6\0\0\0\344\265\267\12\0\0\2\314IDATx\234\355\325\301\11\3030\24\5\301/\242\376+6(E$ \314\354\30\337\215\364X\2573s\6\266\316\314\226\237\365\271}\5\227\255\331{\273\357s\373\374sY\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\2559\347\354\231Q\337\317\372\303)\276\331Ys\377\26\256.\340\3673|\261}\373\3n{\360?\240>\200\347\351\376i\5\300V\0pz\0t\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0lz\0\276!\352\302\35+U\244b\0\0\0\0IEND\256B`\202"; + +TEST(PixelTestPatterns, MultiGradient) +{ + std::unique_ptr texture; + + const int CELLW = 64; + const int CELLH = 64; + const int NHCELLS = 4; + const int NVCELLS = 2; + const int NCELLS = NHCELLS * NVCELLS; + + texture.reset(new Orthanc::Image( + Orthanc::PixelFormat_RGBA32, + NHCELLS * CELLW, + NVCELLS * CELLH, + /*forceMinimalPitch*/false)); + + // H:R->K, V:G->W, H:B->K + + // R G B K C M Y W + uint8_t startR[NCELLS] = {255,000,000,000,000,255,255,255}; + uint8_t startG[NCELLS] = {000,255,000,000,255,000,255,255}; + uint8_t startB[NCELLS] = {000,000,255,000,255,255,000,255}; + + // K W K W W K W K + uint8_t eeendR[NCELLS] = {000,255,000,255,255,000,255,000}; + uint8_t eeendG[NCELLS] = {000,255,000,255,255,000,255,000 }; + uint8_t eeendB[NCELLS] = {000,255,000,255,255,000,255,000 }; + + for(size_t slot = 0; slot < NCELLS; ++slot) + { + int x0 = (slot % 4) * CELLW; + bool vertical = (((slot / NHCELLS) % 2) == 0) ? (slot % 2 == 0) : (slot % 2 == 1); + int y0 = static_cast(slot / NHCELLS) * CELLH; + Orthanc::ImageAccessor target; + texture->GetRegion(target, x0, y0, CELLW, CELLH); + if (vertical) + OrthancStone::PixelTestPatterns::fillWithVGradient(target, startR[slot], startG[slot], startB[slot], eeendR[slot], eeendG[slot], eeendB[slot]); + else + OrthancStone::PixelTestPatterns::fillWithHGradient(target, startR[slot], startG[slot], startB[slot], eeendR[slot], eeendG[slot], eeendB[slot]); + } + + Orthanc::PngWriter writer; +#if 0 + writer.WriteToFile("MultiGradient.png", *texture); +#else + std::string contents; + writer.WriteToMemory(contents, *texture); + + ASSERT_EQ(1u, sizeof(unsigned char)); + ASSERT_EQ(774u, sizeof(bin2c_MultiGradient_png)); + ASSERT_EQ(773u, contents.size()); + + char* resultPngBytes = &(contents[0]); + + int result = memcmp(resultPngBytes, bin2c_MultiGradient_png, 773); + ASSERT_EQ(0, result); +#endif +} + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/SortedFramesCreateTest.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/SortedFramesCreateTest.py Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import pprint +import requests +import sys + +if len(sys.argv) != 2: + print('Usage: %s [Orthanc series ID]' % sys.argv[0]) + print('Example: %s 4d04593b-953ced51-87e93f11-ae4cf03c-25defdcd | xclip -selection c -t text/plain' % sys.argv[0]) + exit(-1) + +SERIES = sys.argv[1] + +r = requests.get('http://localhost:8042/series/%s/study' % SERIES) +r.raise_for_status() +print(' // From patient %s' % r.json() ['PatientMainDicomTags']['PatientName']) + +r = requests.get('http://localhost:8042/series/%s' % SERIES) +r.raise_for_status() + +first = True + +for instance in r.json() ['Instances']: + tags = requests.get('http://localhost:8042/instances/%s/tags?short' % instance) + tags.raise_for_status() + + if first: + print(''' + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "%s", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "%s", false); + OrthancStone::SortedFrames f; +''' % (tags.json() ['0020,000d'], tags.json() ['0020,000e'])) + first = False + + print(' tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "%s", false);' % instance) + + if '0020,0032' in tags.json(): + print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "%s", false);' % + tags.json() ['0020,0032'].replace('\\', '\\\\')) + + if '0020,0037' in tags.json(): + print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "%s", false);' % + tags.json() ['0020,0037'].replace('\\', '\\\\')) + + if '0020,0013' in tags.json(): + print(' tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "%s", false);' % + tags.json() ['0020,0013'].replace('\\', '\\\\')) + + if '0054,1330' in tags.json(): + print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "%s", false);' % + tags.json() ['0054,1330'].replace('\\', '\\\\')) + + print(' f.AddInstance(tags);') + +print(' f.Sort();') + +r = requests.get('http://localhost:8042/series/%s/ordered-slices' % SERIES) +r.raise_for_status() +slices = r.json() ['SlicesShort'] + +print(' ASSERT_EQ(%du, f.GetFramesCount());' % len(slices)) + +for i in range(len(slices)): + print(' ASSERT_EQ(f.GetFrameSopInstanceUid(%d), "%s");' % (i, slices[i][0])) + diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/SortedFramesTests.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/SortedFramesTests.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,483 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include + +#include "../Sources/Toolbox/SortedFrames.h" + +#include + + +TEST(SortedFrames, Basic) +{ + OrthancStone::SortedFrames f; + ASSERT_TRUE(f.GetStudyInstanceUid().empty()); + ASSERT_TRUE(f.GetSeriesInstanceUid().empty()); + ASSERT_EQ(0u, f.GetInstancesCount()); + ASSERT_THROW(f.GetInstanceTags(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetSopInstanceUid(0), Orthanc::OrthancException); + ASSERT_TRUE(f.IsSorted()); + ASSERT_EQ(0u, f.GetFramesCount()); + ASSERT_THROW(f.GetFrameTags(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameSopInstanceUid(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameSiblingsCount(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameIndex(0), Orthanc::OrthancException); + + Orthanc::DicomMap tags; + ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); + ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); + ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop", false); + f.AddInstance(tags); + + ASSERT_EQ("study", f.GetStudyInstanceUid()); + ASSERT_EQ("series", f.GetSeriesInstanceUid()); + ASSERT_EQ(1u, f.GetInstancesCount()); + std::string s; + ASSERT_TRUE(f.GetInstanceTags(0).LookupStringValue(s, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)); + ASSERT_EQ("sop", s); + ASSERT_EQ("sop", f.GetSopInstanceUid(0)); + ASSERT_FALSE(f.IsSorted()); + ASSERT_THROW(f.GetFramesCount(), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameTags(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameSopInstanceUid(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameSiblingsCount(0), Orthanc::OrthancException); + ASSERT_THROW(f.GetFrameIndex(0), Orthanc::OrthancException); + + f.Sort(); + ASSERT_TRUE(f.IsSorted()); + ASSERT_EQ(1u, f.GetFramesCount()); + ASSERT_TRUE(f.GetFrameTags(0).LookupStringValue(s, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)); + ASSERT_EQ("sop", s); + ASSERT_EQ("sop", f.GetFrameSopInstanceUid(0)); + ASSERT_EQ(1u, f.GetFrameSiblingsCount(0)); + ASSERT_EQ(0u, f.GetFrameIndex(0)); + ASSERT_THROW(f.GetFrameTags(1), Orthanc::OrthancException); +} + + +TEST(SortedFrames, SortSopInstanceUid) +{ + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); + + OrthancStone::SortedFrames f; + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); + tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "1", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); + tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "3", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); + tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "2", false); + f.AddInstance(tags); + + f.Sort(); + ASSERT_EQ(3u, f.GetInstancesCount()); + ASSERT_EQ("sop3", f.GetSopInstanceUid(0)); + ASSERT_EQ("sop1", f.GetSopInstanceUid(1)); + ASSERT_EQ("sop2", f.GetSopInstanceUid(2)); + ASSERT_EQ(6u, f.GetFramesCount()); + ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); + ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(1u, f.GetFrameIndex(1)); + ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(2u, f.GetFrameIndex(2)); + ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); + ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(4)); ASSERT_EQ(1u, f.GetFrameIndex(4)); + ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(5)); ASSERT_EQ(0u, f.GetFrameIndex(5)); +} + + +TEST(SortedFrames, SortInstanceNumber) +{ + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); + + OrthancStone::SortedFrames f; + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "-20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2a", false); + tags.Remove(Orthanc::DICOM_TAG_INSTANCE_NUMBER); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop4", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop5", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); + f.AddInstance(tags); + + f.Sort(); + ASSERT_EQ(6u, f.GetInstancesCount()); + ASSERT_EQ("sop1", f.GetSopInstanceUid(0)); + ASSERT_EQ("sop2", f.GetSopInstanceUid(1)); + ASSERT_EQ("sop2a", f.GetSopInstanceUid(2)); + ASSERT_EQ("sop4", f.GetSopInstanceUid(3)); + ASSERT_EQ("sop3", f.GetSopInstanceUid(4)); + ASSERT_EQ("sop5", f.GetSopInstanceUid(5)); + ASSERT_EQ(6u, f.GetFramesCount()); + ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); + ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(0u, f.GetFrameIndex(1)); + ASSERT_EQ("sop4", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(0u, f.GetFrameIndex(2)); + ASSERT_EQ("sop5", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); + ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(4)); ASSERT_EQ(0u, f.GetFrameIndex(4)); + ASSERT_EQ("sop2a", f.GetFrameSopInstanceUid(5)); ASSERT_EQ(0u, f.GetFrameIndex(5)); +} + + +TEST(SortedFrames, SortInstanceNumberAndImageIndex) +{ + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); + + OrthancStone::SortedFrames f; + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); + tags.Remove(Orthanc::DICOM_TAG_INSTANCE_NUMBER); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "30", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop4", false); + tags.Remove(Orthanc::DICOM_TAG_IMAGE_INDEX); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "30", false); + f.AddInstance(tags); + + f.Sort(); + ASSERT_EQ(4u, f.GetInstancesCount()); + ASSERT_EQ("sop1", f.GetSopInstanceUid(0)); + ASSERT_EQ("sop2", f.GetSopInstanceUid(1)); + ASSERT_EQ("sop3", f.GetSopInstanceUid(2)); + ASSERT_EQ("sop4", f.GetSopInstanceUid(3)); + ASSERT_EQ(4u, f.GetFramesCount()); + // First instance number, then image index + ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); + ASSERT_EQ("sop4", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(0u, f.GetFrameIndex(1)); + ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(0u, f.GetFrameIndex(2)); + ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); +} + + +TEST(SortedFrames, Knix) // Created using "SortedFramesCreateTest.py" +{ + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "1.2.840.113619.2.176.2025.1499492.7391.1171285944.390", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "1.2.840.113619.2.176.2025.1499492.7391.1171285944.392", false); + OrthancStone::SortedFrames f; + + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "67b44a5e-8997f88d-6e527bd6-df342483-dab1674c", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-60.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a8ee83f9-1cc26ad9-ebba3043-8afc47c2-bd784610", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-42.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "6", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "5a2acb03-063f5063-cac452d1-a55992f9-769900fb", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-114.729\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "22", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "23d12f39-e9a4fc21-8da338c4-97feff30-48e95534", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-83.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "15", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "16606f69-83b48518-ab34304a-c8871b7f-a9298d74", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-78.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "14", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "63d595f3-327a306d-1709bb8b-2a72e11c-4f7221fe", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-96.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "18", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8bdecadd-e3477e28-bbbf0297-22b0b680-37b13a7c", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-65.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "11", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b590cc95-55789755-ebd10b76-911e855e-f24e4fe7", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-74.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "13", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "eaa49a94-b9042041-7f45150b-e414f800-d7232874", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-38.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "5", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "6824db93-ed4e2740-07be953f-6d0a8fb3-af0a3a0b", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-105.729\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "e0d82343-9cef01e9-e21df50a-11886a94-1d0216ea", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-51.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "8", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "dc1576ee-25b0b1ef-e038df76-d296fcad-a1456169", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-110.229\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "21", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b9cf5158-06f8e713-7d5111aa-411fd75b-7be2c51e", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-20.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "5faf886f-bd5517cf-1a6ba06e-ac0e6ddb-47bdd8b2", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-101.229\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "19", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "3e8f8ec1-b603f874-825552f1-6fcac7fa-72ca1aa5", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-24.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "2", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "7a7c0120-37f6dd58-c46312e6-2559975d-5af4616f", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-87.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "16", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a0ca6802-56c697c3-0205bab8-42217cfc-84ff0de6", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-33.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "4", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "efce9ff4-3fe07d83-745846f8-fefe5d64-bfea65e6", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-56.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "9", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "fa56f961-d1ae8f6a-989c04f4-7a588e9e-b41b1a13", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-92.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "17", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "f5e889ac-c5afdc37-c5b62074-a8bdeef3-c58d9889", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-69.7285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "12", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "c19fb4b6-ad1224f2-2c3a2b28-0ea233be-38eea0de", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-47.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "7", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "348efc0a-71ee4758-56bd51fa-9703cbff-9b51d4c9", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-29.2285\\-105.586\\73.7768", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "3", false); + f.AddInstance(tags); + f.Sort(); + ASSERT_EQ(22u, f.GetFramesCount()); + ASSERT_EQ(f.GetFrameSopInstanceUid(0), "b9cf5158-06f8e713-7d5111aa-411fd75b-7be2c51e"); + ASSERT_EQ(f.GetFrameSopInstanceUid(1), "3e8f8ec1-b603f874-825552f1-6fcac7fa-72ca1aa5"); + ASSERT_EQ(f.GetFrameSopInstanceUid(2), "348efc0a-71ee4758-56bd51fa-9703cbff-9b51d4c9"); + ASSERT_EQ(f.GetFrameSopInstanceUid(3), "a0ca6802-56c697c3-0205bab8-42217cfc-84ff0de6"); + ASSERT_EQ(f.GetFrameSopInstanceUid(4), "eaa49a94-b9042041-7f45150b-e414f800-d7232874"); + ASSERT_EQ(f.GetFrameSopInstanceUid(5), "a8ee83f9-1cc26ad9-ebba3043-8afc47c2-bd784610"); + ASSERT_EQ(f.GetFrameSopInstanceUid(6), "c19fb4b6-ad1224f2-2c3a2b28-0ea233be-38eea0de"); + ASSERT_EQ(f.GetFrameSopInstanceUid(7), "e0d82343-9cef01e9-e21df50a-11886a94-1d0216ea"); + ASSERT_EQ(f.GetFrameSopInstanceUid(8), "efce9ff4-3fe07d83-745846f8-fefe5d64-bfea65e6"); + ASSERT_EQ(f.GetFrameSopInstanceUid(9), "67b44a5e-8997f88d-6e527bd6-df342483-dab1674c"); + ASSERT_EQ(f.GetFrameSopInstanceUid(10), "8bdecadd-e3477e28-bbbf0297-22b0b680-37b13a7c"); + ASSERT_EQ(f.GetFrameSopInstanceUid(11), "f5e889ac-c5afdc37-c5b62074-a8bdeef3-c58d9889"); + ASSERT_EQ(f.GetFrameSopInstanceUid(12), "b590cc95-55789755-ebd10b76-911e855e-f24e4fe7"); + ASSERT_EQ(f.GetFrameSopInstanceUid(13), "16606f69-83b48518-ab34304a-c8871b7f-a9298d74"); + ASSERT_EQ(f.GetFrameSopInstanceUid(14), "23d12f39-e9a4fc21-8da338c4-97feff30-48e95534"); + ASSERT_EQ(f.GetFrameSopInstanceUid(15), "7a7c0120-37f6dd58-c46312e6-2559975d-5af4616f"); + ASSERT_EQ(f.GetFrameSopInstanceUid(16), "fa56f961-d1ae8f6a-989c04f4-7a588e9e-b41b1a13"); + ASSERT_EQ(f.GetFrameSopInstanceUid(17), "63d595f3-327a306d-1709bb8b-2a72e11c-4f7221fe"); + ASSERT_EQ(f.GetFrameSopInstanceUid(18), "5faf886f-bd5517cf-1a6ba06e-ac0e6ddb-47bdd8b2"); + ASSERT_EQ(f.GetFrameSopInstanceUid(19), "6824db93-ed4e2740-07be953f-6d0a8fb3-af0a3a0b"); + ASSERT_EQ(f.GetFrameSopInstanceUid(20), "dc1576ee-25b0b1ef-e038df76-d296fcad-a1456169"); + ASSERT_EQ(f.GetFrameSopInstanceUid(21), "5a2acb03-063f5063-cac452d1-a55992f9-769900fb"); +} + + +TEST(SortedFrames, Cardiac) // Created using "SortedFramesCreateTest.py" +{ + Orthanc::DicomMap tags; + tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "1.3.51.0.1.1.192.168.29.133.1681753.1681732", false); + tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "1.3.12.2.1107.5.2.33.37097.2012041612474981424569674.0.0.0", false); + OrthancStone::SortedFrames f; + + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a468da62-a8a6e0b9-f66b86b0-b15fa30b-93077161", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "14", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "1cf40ac9-e823e677-cbd5db4b-9e48b451-cccbf950", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "21", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "d52d5f21-54f1ad99-4015a995-108f7210-ee157944", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "15", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b348f629-11d59f98-fb22710b-4964b90a-f44436ff", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "12", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "aac4f2ba-e863f124-6af96709-053258a7-3d39db26", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "13", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8fefe14c-c4c34152-2c3d3514-04e75747-eb7f01f0", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "20b42f52-6d5f784b-cdbc0fbe-4bfc6b0c-5a199c75", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "17", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "931d0c36-8fbb4101-70e6d756-edb15431-aaa9a31b", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "19", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "9e3b97ec-25b86a67-2cbb8f77-94e73268-4509d383", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "caa62568-fdf894fe-08f830a2-5a468967-681d954b", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "18", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "e734c170-96b0a397-95e3b43e-d7a5ed74-025843c8", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "22", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "efc9f411-9f4294e0-66d292a1-b8b6b421-897f1d80", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "11", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8346a1db-0b08a22b-9045aaad-57098aac-5b2e9159", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "16", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8c7d1e4d-7936f799-c4b8b56b-32d0d9a6-2b492e98", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "3", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "faec09f9-ca7fe0f0-2b25c370-bb1bfaef-8ccfa560", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "4", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "99c20bcc-115ae447-84d616f2-cb6c5576-9f67aa7a", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "23", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "7906b806-47190031-72c5043c-d42704c1-688a3b23", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "9", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "c9dfc022-7b377063-08bdc5e8-fedcc463-8de22ee6", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "6", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "6570b6c0-7d2f324d-db7cad50-843f62df-d0446352", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "5", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "0be36fe7-6c7a762b-281cf109-fff9d8ea-42e16b7a", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "7", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "ec282396-a8209d00-1c5091f3-f632bf3d-a1bcebba", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "8", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "fda415d4-f1429b07-5d1cd9f0-675059ff-c0ce9e67", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); + f.AddInstance(tags); + tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "f555ef96-6b01a90c-bdc2585a-dd17bb3a-75e89920", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); + tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); + tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "2", false); + f.AddInstance(tags); + f.Sort(); + ASSERT_EQ(23u, f.GetFramesCount()); + ASSERT_EQ(f.GetFrameSopInstanceUid(0), "fda415d4-f1429b07-5d1cd9f0-675059ff-c0ce9e67"); + ASSERT_EQ(f.GetFrameSopInstanceUid(1), "f555ef96-6b01a90c-bdc2585a-dd17bb3a-75e89920"); + ASSERT_EQ(f.GetFrameSopInstanceUid(2), "8c7d1e4d-7936f799-c4b8b56b-32d0d9a6-2b492e98"); + ASSERT_EQ(f.GetFrameSopInstanceUid(3), "faec09f9-ca7fe0f0-2b25c370-bb1bfaef-8ccfa560"); + ASSERT_EQ(f.GetFrameSopInstanceUid(4), "6570b6c0-7d2f324d-db7cad50-843f62df-d0446352"); + ASSERT_EQ(f.GetFrameSopInstanceUid(5), "c9dfc022-7b377063-08bdc5e8-fedcc463-8de22ee6"); + ASSERT_EQ(f.GetFrameSopInstanceUid(6), "0be36fe7-6c7a762b-281cf109-fff9d8ea-42e16b7a"); + ASSERT_EQ(f.GetFrameSopInstanceUid(7), "ec282396-a8209d00-1c5091f3-f632bf3d-a1bcebba"); + ASSERT_EQ(f.GetFrameSopInstanceUid(8), "7906b806-47190031-72c5043c-d42704c1-688a3b23"); + ASSERT_EQ(f.GetFrameSopInstanceUid(9), "9e3b97ec-25b86a67-2cbb8f77-94e73268-4509d383"); + ASSERT_EQ(f.GetFrameSopInstanceUid(10), "efc9f411-9f4294e0-66d292a1-b8b6b421-897f1d80"); + ASSERT_EQ(f.GetFrameSopInstanceUid(11), "b348f629-11d59f98-fb22710b-4964b90a-f44436ff"); + ASSERT_EQ(f.GetFrameSopInstanceUid(12), "aac4f2ba-e863f124-6af96709-053258a7-3d39db26"); + ASSERT_EQ(f.GetFrameSopInstanceUid(13), "a468da62-a8a6e0b9-f66b86b0-b15fa30b-93077161"); + ASSERT_EQ(f.GetFrameSopInstanceUid(14), "d52d5f21-54f1ad99-4015a995-108f7210-ee157944"); + ASSERT_EQ(f.GetFrameSopInstanceUid(15), "8346a1db-0b08a22b-9045aaad-57098aac-5b2e9159"); + ASSERT_EQ(f.GetFrameSopInstanceUid(16), "20b42f52-6d5f784b-cdbc0fbe-4bfc6b0c-5a199c75"); + ASSERT_EQ(f.GetFrameSopInstanceUid(17), "caa62568-fdf894fe-08f830a2-5a468967-681d954b"); + ASSERT_EQ(f.GetFrameSopInstanceUid(18), "931d0c36-8fbb4101-70e6d756-edb15431-aaa9a31b"); + ASSERT_EQ(f.GetFrameSopInstanceUid(19), "8fefe14c-c4c34152-2c3d3514-04e75747-eb7f01f0"); + ASSERT_EQ(f.GetFrameSopInstanceUid(20), "1cf40ac9-e823e677-cbd5db4b-9e48b451-cccbf950"); + ASSERT_EQ(f.GetFrameSopInstanceUid(21), "e734c170-96b0a397-95e3b43e-d7a5ed74-025843c8"); + ASSERT_EQ(f.GetFrameSopInstanceUid(22), "99c20bcc-115ae447-84d616f2-cb6c5576-9f67aa7a"); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/TestCommands.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/TestCommands.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,108 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include + +//#include "../Applications/Commands/BaseCommandFactory.h" +//#include "OrthancException.h" + +//class CommandIncrement: public OrthancStone::BaseCommand +//{ +//public: +// static int counter; +// int increment_; +//public: +// CommandIncrement() +// : OrthancStone::BaseCommand("increment"), +// increment_(0) +// {} + +// virtual void Execute() +// { +// counter += increment_; +// } +// virtual void Configure(const Json::Value& arguments) +// { +// increment_ = arguments["increment"].asInt(); +// } +//}; + +//// COMMAND("name", "arg1", "int", "arg2", "string") +//// COMMAND(name, arg1, arg2) + + +//int CommandIncrement::counter = 0; + +//TEST(Commands, CreateNoop) +//{ +// OrthancStone::BaseCommandFactory factory; + +// factory.RegisterCommandClass(); + +// Json::Value cmdJson; +// cmdJson["command"] = "noop"; + +// std::unique_ptr command(factory.CreateFromJson(cmdJson)); + +// ASSERT_TRUE(command.get() != NULL); +// ASSERT_EQ("noop", command->GetName()); +//} + +//TEST(Commands, Execute) +//{ +// OrthancStone::BaseCommandFactory factory; + +// factory.RegisterCommandClass(); +// factory.RegisterCommandClass(); + +// Json::Value cmdJson; +// cmdJson["command"] = "increment"; +// cmdJson["args"]["increment"] = 2; + +// std::unique_ptr command(factory.CreateFromJson(cmdJson)); + +// ASSERT_TRUE(command.get() != NULL); +// CommandIncrement::counter = 0; +// command->Execute(); +// ASSERT_EQ(2, CommandIncrement::counter); +//} + +//TEST(Commands, TryCreateUnknowCommand) +//{ +// OrthancStone::BaseCommandFactory factory; +// factory.RegisterCommandClass(); + +// Json::Value cmdJson; +// cmdJson["command"] = "unknown"; + +// ASSERT_THROW(std::unique_ptr command(factory.CreateFromJson(cmdJson)), Orthanc::OrthancException); +//} + +//TEST(Commands, TryCreateCommandFromInvalidJson) +//{ +// OrthancStone::BaseCommandFactory factory; +// factory.RegisterCommandClass(); + +// Json::Value cmdJson; +// cmdJson["command-name"] = "noop"; + +// ASSERT_THROW(std::unique_ptr command(factory.CreateFromJson(cmdJson)), Orthanc::OrthancException); +//} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/TestMessageBroker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/TestMessageBroker.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,104 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include + +#include "../Sources/Messages/IObservable.h" +#include "../Sources/Messages/ObserverBase.h" + + +int testCounter = 0; +namespace { + + using namespace OrthancStone; + + + class MyObservable : public IObservable + { + public: + struct MyCustomMessage : public IMessage + { + ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); + + int payload_; + + MyCustomMessage(int payload) : + payload_(payload) + { + } + }; + }; + + class MyObserver : public ObserverBase + { + public: + void HandleCompletedMessage(const MyObservable::MyCustomMessage& message) + { + testCounter += message.payload_; + } + }; +} + + +TEST(MessageBroker, TestPermanentConnectionSimpleUseCase) +{ + MyObservable observable; + boost::shared_ptr observer(new MyObserver); + + // create a permanent connection between an observable and an observer + observer->Register(observable, &MyObserver::HandleCompletedMessage); + + testCounter = 0; + observable.BroadcastMessage(MyObservable::MyCustomMessage(12)); + ASSERT_EQ(12, testCounter); + + // the connection is permanent; if we emit the same message again, the observer will be notified again + testCounter = 0; + observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); + ASSERT_EQ(20, testCounter); + + // Unregister the observer; make sure it's not called anymore + observer.reset(); + testCounter = 0; + observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); + ASSERT_EQ(0, testCounter); +} + +TEST(MessageBroker, TestPermanentConnectionDeleteObserver) +{ + MyObservable observable; + boost::shared_ptr observer(new MyObserver); + + // create a permanent connection between an observable and an observer + observer->Register(observable, &MyObserver::HandleCompletedMessage); + + testCounter = 0; + observable.BroadcastMessage(MyObservable::MyCustomMessage(12)); + ASSERT_EQ(12, testCounter); + + // delete the observer and check that the callback is not called anymore + observer.reset(); + + // the connection is permanent; if we emit the same message again, the observer will be notified again + testCounter = 0; + observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); + ASSERT_EQ(0, testCounter); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/TestStrategy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/TestStrategy.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,391 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include + +#include "../Sources/Loaders/BasicFetchingStrategy.h" +#include "../Sources/Loaders/BasicFetchingItemsSorter.h" + +#include + + +namespace +{ + class StrategyTester : public boost::noncopyable + { + private: + std::map qualities_; + + public: + bool IsValidCommand(unsigned int item, + unsigned int quality) + { + if (qualities_.find(item) != qualities_.end() && + qualities_[item] >= quality) + { + return false; + } + else + { + qualities_[item] = quality; + return true; + } + } + + bool HasFinished(OrthancStone::BasicFetchingStrategy& strategy) + { + for (unsigned int i = 0; i < strategy.GetItemsCount(); i++) + { + if (qualities_.find(i) == qualities_.end() || + qualities_[i] != strategy.GetMaxQuality()) + { + return false; + } + } + + return true; + } + }; +} + + +TEST(BasicFetchingStrategy, Test1) +{ + ASSERT_THROW(OrthancStone::BasicFetchingStrategy(NULL, 0), Orthanc::OrthancException); + ASSERT_THROW(OrthancStone::BasicFetchingStrategy(new OrthancStone::BasicFetchingItemsSorter(0), 0), Orthanc::OrthancException); + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(1), 0); + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(1), 5); + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(5u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(2), 2); + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(3), 2); + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(1u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(2u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(3), 2); + s.SetBlockSize(1); + s.SetCurrent(0); + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(1u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(2u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(5), 0); + ASSERT_THROW(s.SetCurrent(5), Orthanc::OrthancException); + s.SetCurrent(2); + + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(3u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(4u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } + + { + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(5), 0); + s.SetCurrent(4); + + unsigned int i, q; + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(4u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(3u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(0u, q); + ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); + ASSERT_FALSE(s.GetNext(i, q)); + } +} + + +TEST(BasicFetchingStrategy, Test2) +{ + OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(20), 2); + ASSERT_EQ(20u, s.GetItemsCount()); + ASSERT_EQ(2u, s.GetMaxQuality()); + + StrategyTester t; + + s.SetCurrent(10); + + unsigned int i, q; + while (s.GetNext(i, q)) + { + ASSERT_TRUE(t.IsValidCommand(i, q)); + } + + ASSERT_TRUE(t.HasFinished(s)); +} + + + + +TEST(BasicFetchingItemsSorter, Small) +{ + ASSERT_THROW(OrthancStone::BasicFetchingItemsSorter(0), Orthanc::OrthancException); + std::vector v; + + { + OrthancStone::BasicFetchingItemsSorter s(1); + s.Sort(v, 0); + ASSERT_EQ(1u, v.size()); + ASSERT_EQ(0u, v[0]); + + ASSERT_THROW(s.Sort(v, 1), Orthanc::OrthancException); + } + + { + OrthancStone::BasicFetchingItemsSorter s(2); + s.Sort(v, 0); + ASSERT_EQ(2u, v.size()); + ASSERT_EQ(0u, v[0]); + ASSERT_EQ(1u, v[1]); + + s.Sort(v, 1); + ASSERT_EQ(2u, v.size()); + ASSERT_EQ(1u, v[0]); + ASSERT_EQ(0u, v[1]); + + ASSERT_THROW(s.Sort(v, 2), Orthanc::OrthancException); + } + + { + OrthancStone::BasicFetchingItemsSorter s(3); + s.Sort(v, 0); + ASSERT_EQ(3u, v.size()); + ASSERT_EQ(0u, v[0]); + ASSERT_EQ(1u, v[1]); + ASSERT_EQ(2u, v[2]); + + s.Sort(v, 1); + ASSERT_EQ(3u, v.size()); + ASSERT_EQ(1u, v[0]); + ASSERT_EQ(2u, v[1]); + ASSERT_EQ(0u, v[2]); + + s.Sort(v, 2); + ASSERT_EQ(3u, v.size()); + ASSERT_EQ(2u, v[0]); + ASSERT_EQ(1u, v[1]); + ASSERT_EQ(0u, v[2]); + + ASSERT_THROW(s.Sort(v, 3), Orthanc::OrthancException); + } +} + + +TEST(BasicFetchingItemsSorter, Odd) +{ + OrthancStone::BasicFetchingItemsSorter s(7); + std::vector v; + + ASSERT_THROW(s.Sort(v, 7), Orthanc::OrthancException); + + { + s.Sort(v, 0); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(0u, v[0]); + ASSERT_EQ(1u, v[1]); + ASSERT_EQ(2u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(4u, v[4]); + ASSERT_EQ(5u, v[5]); + ASSERT_EQ(6u, v[6]); + } + + { + s.Sort(v, 1); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(1u, v[0]); + ASSERT_EQ(2u, v[1]); + ASSERT_EQ(0u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(4u, v[4]); + ASSERT_EQ(5u, v[5]); + ASSERT_EQ(6u, v[6]); + } + + { + s.Sort(v, 2); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(2u, v[0]); + ASSERT_EQ(3u, v[1]); + ASSERT_EQ(1u, v[2]); + ASSERT_EQ(4u, v[3]); + ASSERT_EQ(0u, v[4]); + ASSERT_EQ(5u, v[5]); + ASSERT_EQ(6u, v[6]); + } + + { + s.Sort(v, 3); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(3u, v[0]); + ASSERT_EQ(4u, v[1]); + ASSERT_EQ(2u, v[2]); + ASSERT_EQ(5u, v[3]); + ASSERT_EQ(1u, v[4]); + ASSERT_EQ(6u, v[5]); + ASSERT_EQ(0u, v[6]); + } + + { + s.Sort(v, 4); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(4u, v[0]); + ASSERT_EQ(5u, v[1]); + ASSERT_EQ(3u, v[2]); + ASSERT_EQ(6u, v[3]); + ASSERT_EQ(2u, v[4]); + ASSERT_EQ(1u, v[5]); + ASSERT_EQ(0u, v[6]); + } + + { + s.Sort(v, 5); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(5u, v[0]); + ASSERT_EQ(6u, v[1]); + ASSERT_EQ(4u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(2u, v[4]); + ASSERT_EQ(1u, v[5]); + ASSERT_EQ(0u, v[6]); + } + + { + s.Sort(v, 6); + ASSERT_EQ(7u, v.size()); + ASSERT_EQ(6u, v[0]); + ASSERT_EQ(5u, v[1]); + ASSERT_EQ(4u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(2u, v[4]); + ASSERT_EQ(1u, v[5]); + ASSERT_EQ(0u, v[6]); + } +} + + +TEST(BasicFetchingItemsSorter, Even) +{ + OrthancStone::BasicFetchingItemsSorter s(6); + std::vector v; + + { + s.Sort(v, 0); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(0u, v[0]); + ASSERT_EQ(1u, v[1]); + ASSERT_EQ(2u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(4u, v[4]); + ASSERT_EQ(5u, v[5]); + } + + { + s.Sort(v, 1); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(1u, v[0]); + ASSERT_EQ(2u, v[1]); + ASSERT_EQ(0u, v[2]); + ASSERT_EQ(3u, v[3]); + ASSERT_EQ(4u, v[4]); + ASSERT_EQ(5u, v[5]); + } + + { + s.Sort(v, 2); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(2u, v[0]); + ASSERT_EQ(3u, v[1]); + ASSERT_EQ(1u, v[2]); + ASSERT_EQ(4u, v[3]); + ASSERT_EQ(0u, v[4]); + ASSERT_EQ(5u, v[5]); + } + + { + s.Sort(v, 3); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(3u, v[0]); + ASSERT_EQ(4u, v[1]); + ASSERT_EQ(2u, v[2]); + ASSERT_EQ(5u, v[3]); + ASSERT_EQ(1u, v[4]); + ASSERT_EQ(0u, v[5]); + } + + { + s.Sort(v, 4); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(4u, v[0]); + ASSERT_EQ(5u, v[1]); + ASSERT_EQ(3u, v[2]); + ASSERT_EQ(2u, v[3]); + ASSERT_EQ(1u, v[4]); + ASSERT_EQ(0u, v[5]); + } + + { + s.Sort(v, 5); + ASSERT_EQ(6u, v.size()); + ASSERT_EQ(5u, v[0]); + ASSERT_EQ(4u, v[1]); + ASSERT_EQ(3u, v[2]); + ASSERT_EQ(2u, v[3]); + ASSERT_EQ(1u, v[4]); + ASSERT_EQ(0u, v[5]); + } +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/TestStructureSet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/TestStructureSet.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,5770 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + +// working around a bug where the Visual C++ compiler would get +// stuck trying to compile this cpp file in release mode +// (versions: https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B) +#ifdef _MSC_VER +# pragma optimize("", off) +// warning C4748: /GS can not protect parameters and local variables from +// local buffer overrun because optimizations are disabled in function +# pragma warning(disable: 4748) +#endif + +#include "../Sources/Loaders/DicomStructureSetLoader.h" +#include "../Sources/Loaders/GenericLoadersContext.h" +#include "../Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h" +#include "../Sources/Toolbox/DicomStructureSet2.h" +#include "../Sources/Toolbox/DicomStructureSetUtils.h" +#include "../Sources/Toolbox/DisjointDataSet.h" + +#include +#include + +#include + +#include +#include + +using namespace Orthanc; +using namespace OrthancStone; + +/* +The following string is the reply to the following Orthanc request: + +http://localhost:8042/instances/1aa5f84b-c32a03b4-3c1857da-da2e69f3-3ef6e2b3/tags?ignore-length=3006-0050 + +The tag hierarchy can be found here: https://dicom.innolitics.com/ciods/rt-dose +*/ + +const double DELTA_MAX = 10.0 * std::numeric_limits::epsilon(); + +#ifdef _MSC_VER +#pragma region BigJsonString +#endif +// _MSC_VER +const char* k_rtStruct_json00 = +"{\n" +" \"0008,0005\" : {\n" +" \"Name\" : \"SpecificCharacterSet\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ISO_IR 100\"\n" +" },\n" +" \"0008,0012\" : {\n" +" \"Name\" : \"InstanceCreationDate\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20190318\"\n" +" },\n" +" \"0008,0013\" : {\n" +" \"Name\" : \"InstanceCreationTime\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"182529\"\n" +" },\n" +" \"0008,0016\" : {\n" +" \"Name\" : \"SOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.481.3\"\n" +" },\n" +" \"0008,0018\" : {\n" +" \"Name\" : \"SOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3500.4285482120751\"\n" +" },\n" +" \"0008,0020\" : {\n" +" \"Name\" : \"StudyDate\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20190225\"\n" +" },\n" +" \"0008,0030\" : {\n" +" \"Name\" : \"StudyTime\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"135152\"\n" +" },\n" +" \"0008,0050\" : {\n" +" \"Name\" : \"AccessionNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"897154\"\n" +" },\n" +" \"0008,0060\" : {\n" +" \"Name\" : \"Modality\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"RTSTRUCT\"\n" +" },\n" +" \"0008,0070\" : {\n" +" \"Name\" : \"Manufacturer\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"RaySearch Laboratories\"\n" +" },\n" +" \"0008,0090\" : {\n" +" \"Name\" : \"ReferringPhysicianName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" },\n" +" \"0008,1030\" : {\n" +" \"Name\" : \"StudyDescription\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CT ohne KM\"\n" +" },\n" +" \"0008,103e\" : {\n" +" \"Name\" : \"SeriesDescription\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"RS: Approved Structure Set\"\n" +" },\n" +" \"0008,1070\" : {\n" +" \"Name\" : \"OperatorsName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" },\n" +" \"0008,1090\" : {\n" +" \"Name\" : \"ManufacturerModelName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"RayStation\"\n" +" },\n" +" \"0010,0010\" : {\n" +" \"Name\" : \"PatientName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Karamazov^Serge\"\n" +" },\n" +" \"0010,0020\" : {\n" +" \"Name\" : \"PatientID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"66498\"\n" +" },\n" +" \"0010,0030\" : {\n" +" \"Name\" : \"PatientBirthDate\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"19630511\"\n" +" },\n" +" \"0010,0040\" : {\n" +" \"Name\" : \"PatientSex\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"F\"\n" +" },\n" +" \"0018,1020\" : {\n" +" \"Name\" : \"SoftwareVersions\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7.0.0.19 (Dicom Export)\"\n" +" },\n" +" \"0020,000d\" : {\n" +" \"Name\" : \"StudyInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.113854.1977802846882851650617130240362685394\"\n" +" },\n" +" \"0020,000e\" : {\n" +" \"Name\" : \"SeriesInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3582165\"\n" +" },\n" +" \"0020,0010\" : {\n" +" \"Name\" : \"StudyID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"467\"\n" +" },\n" +" \"0020,0011\" : {\n" +" \"Name\" : \"SeriesNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"0020,0052\" : {\n" +" \"Name\" : \"FrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965689415626\"\n" +" },\n" +" \"0020,1040\" : {\n" +" \"Name\" : \"PositionReferenceIndicator\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" },\n" +" \"3006,0002\" : {\n" +" \"Name\" : \"StructureSetLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"RS: Approved\"\n" +" },\n" +" \"3006,0008\" : {\n" +" \"Name\" : \"StructureSetDate\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20190318\"\n" +" },\n" +" \"3006,0009\" : {\n" +" \"Name\" : \"StructureSetTime\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"182529\"\n" +" },\n" +" \"3006,0010\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0020,0052\" : {\n" +" \"Name\" : \"FrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.47019656894156\"\n" +" },\n" +" \"3006,0012\" : {\n" +" \"Name\" : \"RTReferencedStudySequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.3.1.2.3.1\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.113854.1977802846882851650617130240362685\"\n" +" },\n" +" \"3006,0014\" : {\n" +" \"Name\" : \"RTReferencedSeriesSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0020,000e\" : {\n" +" \"Name\" : \"SeriesInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3582165\"\n" +" },\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" +" }\n" +" },\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" +" }\n" +" }\n" +" ]\n" +" }\n" +" }\n" +" ]\n" +" }\n" +" }\n" +" ]\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0020\" : {\n" +" \"Name\" : \"StructureSetROISequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"LN300\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Cortical Bone\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Adipose\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CB2-50%\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Water\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"External\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0022\" : {\n" +" \"Name\" : \"ROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11\"\n" +" },\n" +" \"3006,0024\" : {\n" +" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" +" },\n" +" \"3006,0026\" : {\n" +" \"Name\" : \"ROIName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"PTV\"\n" +" },\n" +" \"3006,0036\" : {\n" +" \"Name\" : \"ROIGenerationAlgorithm\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"SEMIAUTOMATIC\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0039\" : {\n" +" \"Name\" : \"ROIContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"255\\\\0\\\\0\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7.657838\\\\108.2725\\\\304.01\\\\6.826687\\\\107.4413\\\\304.01\\\\6.152492\\\\106.4785\\\\304.01\\\\5.655735\\\\105.4132\\\\304.01\\\\5.351513\\\\104.2778\\\\304.01\\\\5.249068\\\\103.1069\\\\304.01\\\\5.351513\\\\101.9359\\\\304.01\\\\5.655735\\\\100.8005\\\\304.01\\\\6.152492\\\\99.73524\\\\304.01\\\\6.826687\\\\98.77239\\\\304.01\\\\7.657838\\\\97.94124\\\\304.01\\\\8.620689\\\\97.26704\\\\304.01\\\\9.685987\\\\96.77029\\\\304.01\\\\10.82136\\\\96.46606\\\\304.01\\\\11.99231\\\\96.36362\\\\304.01\\\\13.16326\\\\96.46606\\\\304.01\\\\14.29864\\\\96.77029\\\\304.01\\\\15.36393\\\\97.26704\\\\304.01\\\\16.32678\\\\97.94124\\\\304.01\\\\17.15794\\\\98.77239\\\\304.01\\\\17.83213\\\\99.73524\\\\304.01\\\\18.32889\\\\100.8005\\\\304.01\\\\18.63311\\\\101.9359\\\\304.01\\\\18.73555\\\\103.1069\\\\304.01\\\\18.63311\\\\104.2778\\\\304.01\\\\18.32889\\\\105.4132\\\\304.01\\\\17.83213\\\\106.4785\\\\304.01\\\\17.15794\\\\107.4413\\\\304.01\\\\16.32678\\\\108.2725\\\\304.01\\\\15.36393\\\\108.9467\\\\304.01\\\\14.29864\\\\109.4434\\\\304.01\\\\13.16326\\\\109.7477\\\\304.01\\\\11.99231\\\\109.8501\\\\304.01\\\\10.82136\\\\109.7477\\\\304.01\\\\9.685987\\\\109.4434\\\\304.01\\\\8.620689\\\\108.9467\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7.657838\\\\108.2725\\\\307.01\\\\6.826687\\\\107.4413\\\\307.01\\\\6.152492\\\\106.4785\\\\307.01\\\\5.655735\\\\105.4132\\\\307.01\\\\5.351513\\\\104.2778\\\\307.01\\\\5.249068\\\\103.1069\\\\307.01\\\\5.351513\\\\101.9359\\\\307.01\\\\5.655735\\\\100.8005\\\\307.01\\\\6.152492\\\\99.73524\\\\307.01\\\\6.826687\\\\98.77239\\\\307.01\\\\7.657838\\\\97.94124\\\\307.01\\\\8.620689\\\\97.26704\\\\307.01\\\\9.685987\\\\96.77029\\\\307.01\\\\10.82136\\\\96.46606\\\\307.01\\\\11.99231\\\\96.36362\\\\307.01\\\\13.16326\\\\96.46606\\\\307.01\\\\14.29864\\\\96.77029\\\\307.01\\\\15.36393\\\\97.26704\\\\307.01\\\\16.32678\\\\97.94124\\\\307.01\\\\17.15794\\\\98.77239\\\\307.01\\\\17.83213\\\\99.73524\\\\307.01\\\\18.32889\\\\100.8005\\\\307.01\\\\18.63311\\\\101.9359\\\\307.01\\\\18.73555\\\\103.1069\\\\307.01\\\\18.63311\\\\104.2778\\\\307.01\\\\18.32889\\\\105.4132\\\\307.01\\\\17.83213\\\\106.4785\\\\307.01\\\\17.15794\\\\107.4413\\\\307.01\\\\16.32678\\\\108.2725\\\\307.01\\\\15.36393\\\\108.9467\\\\307.01\\\\14.29864\\\\109.4434\\\\307.01\\\\13.16326\\\\109.7477\\\\307.01\\\\11.99231\\\\109.8501\\\\307.01\\\\10.82136\\\\109.7477\\\\307.01\\\\9.685987\\\\109.4434\\\\307.01\\\\8.620689\\\\108.9467\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7.657838\\\\108.2725\\\\310.01\\\\6.826687\\\\107.4413\\\\310.01\\\\6.152492\\\\106.4785\\\\310.01\\\\5.655735\\\\105.4132\\\\310.01\\\\5.351513\\\\104.2778\\\\310.01\\\\5.249068\\\\103.1069\\\\310.01\\\\5.351513\\\\101.9359\\\\310.01\\\\5.655735\\\\100.8005\\\\310.01\\\\6.152492\\\\99.73524\\\\310.01\\\\6.826687\\\\98.77239\\\\310.01\\\\7.657838\\\\97.94124\\\\310.01\\\\8.620689\\\\97.26704\\\\310.01\\\\9.685987\\\\96.77029\\\\310.01\\\\10.82136\\\\96.46606\\\\310.01\\\\11.99231\\\\96.36362\\\\310.01\\\\13.16326\\\\96.46606\\\\310.01\\\\14.29864\\\\96.77029\\\\310.01\\\\15.36393\\\\97.26704\\\\310.01\\\\16.32678\\\\97.94124\\\\310.01\\\\17.15794\\\\98.77239\\\\310.01\\\\17.83213\\\\99.73524\\\\310.01\\\\18.32889\\\\100.8005\\\\310.01\\\\18.63311\\\\101.9359\\\\310.01\\\\18.73555\\\\103.1069\\\\310.01\\\\18.63311\\\\104.2778\\\\310.01\\\\18.32889\\\\105.4132\\\\310.01\\\\17.83213\\\\106.4785\\\\310.01\\\\17.15794\\\\107.4413\\\\310.01\\\\16.32678\\\\108.2725\\\\310.01\\\\15.36393\\\\108.9467\\\\310.01\\\\14.29864\\\\109.4434\\\\310.01\\\\13.16326\\\\109.7477\\\\310.01\\\\11.99231\\\\109.8501\\\\310.01\\\\10.82136\\\\109.7477\\\\310.01\\\\9.685987\\\\109.4434\\\\310.01\\\\8.620689\\\\108.9467\\\\310.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\\\\255\\\\255\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-37.967\\\\161.9664\\\\304.01\\\\-39.10237\\\\161.6622\\\\304.01\\\\-40.16767\\\\161.1655\\\\304.01\\\\-41.13052\\\\160.4913\\\\304.01\\\\-41.96167\\\\159.6601\\\\304.01\\\\-42.63587\\\\158.6973\\\\304.01\\\\-43.13263\\\\157.632\\\\304.01\\\\-43.43685\\\\156.4966\\\\304.01\\\\-43.53929\\\\155.3257\\\\304.01\\\\-43.43685\\\\154.1547\\\\304.01\\\\-43.13263\\\\153.0193\\\\304.01\\\\-42.63587\\\\151.954\\\\304.01\\\\-41.96167\\\\150.9912\\\\304.01\\\\-41.13052\\\\150.16\\\\304.01\\\\-40.16767\\\\149.4858\\\\304.01\\\\-39.10237\\\\148.9891\\\\304.01\\\\-37.967\\\\148.6849\\\\304.01\\\\-36.79605\\\\148.5824\\\\304.01\\\\-35.6251\\\\148.6849\\\\304.01\\\\-34.48972\\\\148.9891\\\\304.01\\\\-33.42443\\\\149.4858\\\\304.01\\\\-32.46157\\\\150.16\\\\304.01\\\\-31.63042\\\\150.9912\\\\304.01\\\\-30.95623\\\\151.954\\\\304.01\\\\-30.45947\\\\153.0193\\\\304.01\\\\-30.15525\\\\154.1547\\\\304.01\\\\-30.0528\\\\155.3257\\\\304.01\\\\-30.15525\\\\156.4966\\\\304.01\\\\-30.45947\\\\157.632\\\\304.01\\\\-30.95623\\\\158.6973\\\\304.01\\\\-31.63042\\\\159.6601\\\\304.01\\\\-32.46157\\\\160.4913\\\\304.01\\\\-33.42443\\\\161.1655\\\\304.01\\\\-34.48972\\\\161.6622\\\\304.01\\\\-35.6251\\\\161.9664\\\\304.01\\\\-36.79605\\\\162.0689\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-37.967\\\\161.9664\\\\307.01\\\\-39.10237\\\\161.6622\\\\307.01\\\\-40.16767\\\\161.1655\\\\307.01\\\\-41.13052\\\\160.4913\\\\307.01\\\\-41.96167\\\\159.6601\\\\307.01\\\\-42.63587\\\\158.6973\\\\307.01\\\\-43.13263\\\\157.632\\\\307.01\\\\-43.43685\\\\156.4966\\\\307.01\\\\-43.53929\\\\155.3257\\\\307.01\\\\-43.43685\\\\154.1547\\\\307.01\\\\-43.13263\\\\153.0193\\\\307.01\\\\-42.63587\\\\151.954\\\\307.01\\\\-41.96167\\\\150.9912\\\\307.01\\\\-41.13052\\\\150.16\\\\307.01\\\\-40.16767\\\\149.4858\\\\307.01\\\\-39.10237\\\\148.9891\\\\307.01\\\\-37.967\\\\148.6849\\\\307.01\\\\-36.79605\\\\148.5824\\\\307.01\\\\-35.6251\\\\148.6849\\\\307.01\\\\-34.48972\\\\148.9891\\\\307.01\\\\-33.42443\\\\149.4858\\\\307.01\\\\-32.46157\\\\150.16\\\\307.01\\\\-31.63042\\\\150.9912\\\\307.01\\\\-30.95623\\\\151.954\\\\307.01\\\\-30.45947\\\\153.0193\\\\307.01\\\\-30.15525\\\\154.1547\\\\307.01\\\\-30.0528\\\\155.3257\\\\307.01\\\\-30.15525\\\\156.4966\\\\307.01\\\\-30.45947\\\\157.632\\\\307.01\\\\-30.95623\\\\158.6973\\\\307.01\\\\-31.63042\\\\159.6601\\\\307.01\\\\-32.46157\\\\160.4913\\\\307.01\\\\-33.42443\\\\161.1655\\\\307.01\\\\-34.48972\\\\161.6622\\\\307.01\\\\-35.6251\\\\161.9664\\\\307.01\\\\-36.79605\\\\162.0689\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-37.967\\\\161.9664\\\\310.01\\\\-39.10237\\\\161.6622\\\\310.01\\\\-40.16767\\\\161.1655\\\\310.01\\\\-41.13052\\\\160.4913\\\\310.01\\\\-41.96167\\\\159.6601\\\\310.01\\\\-42.63587\\\\158.6973\\\\310.01\\\\-43.13263\\\\157.632\\\\310.01\\\\-43.43685\\\\156.4966\\\\310.01\\\\-43.53929\\\\155.3257\\\\310.01\\\\-43.43685\\\\154.1547\\\\310.01\\\\-43.13263\\\\153.0193\\\\310.01\\\\-42.63587\\\\151.954\\\\310.01\\\\-41.96167\\\\150.9912\\\\310.01\\\\-41.13052\\\\150.16\\\\310.01\\\\-40.16767\\\\149.4858\\\\310.01\\\\-39.10237\\\\148.9891\\\\310.01\\\\-37.967\\\\148.6849\\\\310.01\\\\-36.79605\\\\148.5824\\\\310.01\\\\-35.6251\\\\148.6849\\\\310.01\\\\-34.48972\\\\148.9891\\\\310.01\\\\-33.42443\\\\149.4858\\\\310.01\\\\-32.46157\\\\150.16\\\\310.01\\\\-31.63042\\\\150.9912\\\\310.01\\\\-30.95623\\\\151.954\\\\310.01\\\\-30.45947\\\\153.0193\\\\310.01\\\\-30.15525\\\\154.1547\\\\310.01\\\\-30.0528\\\\155.3257\\\\310.01\\\\-30.15525\\\\156.4966\\\\310.01\\\\-30.45947\\\\157.632\\\\310.01\\\\-30.95623\\\\158.6973\\\\310.01\\\\-31.63042\\\\159.6601\\\\310.01\\\\-32.46157\\\\160.4913\\\\310.01\\\\-33.42443\\\\161.1655\\\\310.01\\\\-34.48972\\\\161.6622\\\\310.01\\\\-35.6251\\\\161.9664\\\\310.01\\\\-36.79605\\\\162.0689\\\\310.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"255\\\\0\\\\255\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"69.4042\\\\150.7324\\\\304.01\\\\69.70842\\\\151.8678\\\\304.01\\\\69.81087\\\\153.0387\\\\304.01\\\\69.70842\\\\154.2097\\\\304.01\\\\69.4042\\\\155.345\\\\304.01\\\\68.90745\\\\156.4103\\\\304.01\\\\68.23325\\\\157.3732\\\\304.01\\\\67.4021\\\\158.2043\\\\304.01\\\\66.43925\\\\158.8785\\\\304.01\\\\65.37395\\\\159.3753\\\\304.01\\\\64.23858\\\\159.6795\\\\304.01\\\\63.06762\\\\159.7819\\\\304.01\\\\61.89667\\\\159.6795\\\\304.01\\\\60.7613\\\\159.3753\\\\304.01\\\\59.696\\\\158.8785\\\\304.01\\\\58.73315\\\\158.2043\\\\304.01\\\\57.902\\\\157.3732\\\\304.01\\\\57.22781\\\\156.4103\\\\304.01\\\\56.73105\\\\155.345\\\\304.01\\\\56.42683\\\\154.2097\\\\304.01\\\\56.32438\\\\153.0387\\\\304.01\\\\56.42683\\\\151.8678\\\\304.01\\\\56.73105\\\\150.7324\\\\304.01\\\\57.22781\\\\149.6671\\\\304.01\\\\57.902\\\\148.7042\\\\304.01\\\\58.73315\\\\147.8731\\\\304.01\\\\59.696\\\\147.1989\\\\304.01\\\\60.7613\\\\146.7021\\\\304.01\\\\61.89667\\\\146.3979\\\\304.01\\\\63.06762\\\\146.2955\\\\304.01\\\\64.23858\\\\146.3979\\\\304.01\\\\65.37395\\\\146.7021\\\\304.01\\\\66.43925\\\\147.1989\\\\304.01\\\\67.4021\\\\147.8731\\\\304.01\\\\68.23325\\\\148.7042\\\\304.01\\\\68.90745\\\\149.6671\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"69.4042\\\\150.7324\\\\307.01\\\\69.70842\\\\151.8678\\\\307.01\\\\69.81087\\\\153.0387\\\\307.01\\\\69.70842\\\\154.2097\\\\307.01\\\\69.4042\\\\155.345\\\\307.01\\\\68.90745\\\\156.4103\\\\307.01\\\\68.23325\\\\157.3732\\\\307.01\\\\67.4021\\\\158.2043\\\\307.01\\\\66.43925\\\\158.8785\\\\307.01\\\\65.37395\\\\159.3753\\\\307.01\\\\64.23858\\\\159.6795\\\\307.01\\\\63.06762\\\\159.7819\\\\307.01\\\\61.89667\\\\159.6795\\\\307.01\\\\60.7613\\\\159.3753\\\\307.01\\\\59.696\\\\158.8785\\\\307.01\\\\58.73315\\\\158.2043\\\\307.01\\\\57.902\\\\157.3732\\\\307.01\\\\57.22781\\\\156.4103\\\\307.01\\\\56.73105\\\\155.345\\\\307.01\\\\56.42683\\\\154.2097\\\\307.01\\\\56.32438\\\\153.0387\\\\307.01\\\\56.42683\\\\151.8678\\\\307.01\\\\56.73105\\\\150.7324\\\\307.01\\\\57.22781\\\\149.6671\\\\307.01\\\\57.902\\\\148.7042\\\\307.01\\\\58.73315\\\\147.8731\\\\307.01\\\\59.696\\\\147.1989\\\\307.01\\\\60.7613\\\\146.7021\\\\307.01\\\\61.89667\\\\146.3979\\\\307.01\\\\63.06762\\\\146.2955\\\\307.01\\\\64.23858\\\\146.3979\\\\307.01\\\\65.37395\\\\146.7021\\\\307.01\\\\66.43925\\\\147.1989\\\\307.01\\\\67.4021\\\\147.8731\\\\307.01\\\\68.23325\\\\148.7042\\\\307.01\\\\68.90745\\\\149.6671\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"69.4042\\\\150.7324\\\\310.01\\\\69.70842\\\\151.8678\\\\310.01\\\\69.81087\\\\153.0387\\\\310.01\\\\69.70842\\\\154.2097\\\\310.01\\\\69.4042\\\\155.345\\\\310.01\\\\68.90745\\\\156.4103\\\\310.01\\\\68.23325\\\\157.3732\\\\310.01\\\\67.4021\\\\158.2043\\\\310.01\\\\66.43925\\\\158.8785\\\\310.01\\\\65.37395\\\\159.3753\\\\310.01\\\\64.23858\\\\159.6795\\\\310.01\\\\63.06762\\\\159.7819\\\\310.01\\\\61.89667\\\\159.6795\\\\310.01\\\\60.7613\\\\159.3753\\\\310.01\\\\59.696\\\\158.8785\\\\310.01\\\\58.73315\\\\158.2043\\\\310.01\\\\57.902\\\\157.3732\\\\310.01\\\\57.22781\\\\156.4103\\\\310.01\\\\56.73105\\\\155.345\\\\310.01\\\\56.42683\\\\154.2097\\\\310.01\\\\56.32438\\\\153.0387\\\\310.01\\\\56.42683\\\\151.8678\\\\310.01\\\\56.73105\\\\150.7324\\\\310.01\\\\57.22781\\\\149.6671\\\\310.01\\\\57.902\\\\148.7042\\\\310.01\\\\58.73315\\\\147.8731\\\\310.01\\\\59.696\\\\147.1989\\\\310.01\\\\60.7613\\\\146.7021\\\\310.01\\\\61.89667\\\\146.3979\\\\310.01\\\\63.06762\\\\146.2955\\\\310.01\\\\64.23858\\\\146.3979\\\\310.01\\\\65.37395\\\\146.7021\\\\310.01\\\\66.43925\\\\147.1989\\\\310.01\\\\67.4021\\\\147.8731\\\\310.01\\\\68.23325\\\\148.7042\\\\310.01\\\\68.90745\\\\149.6671\\\\310.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\\\\0\\\\255\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"15.45022\\\\210.3737\\\\304.01\\\\14.27927\\\\210.4761\\\\304.01\\\\13.10831\\\\210.3737\\\\304.01\\\\11.97294\\\\210.0694\\\\304.01\\\\10.90764\\\\209.5727\\\\304.01\\\\9.944793\\\\208.8985\\\\304.01\\\\9.113642\\\\208.0673\\\\304.01\\\\8.439445\\\\207.1045\\\\304.01\\\\7.94269\\\\206.0392\\\\304.01\\\\7.638467\\\\204.9038\\\\304.01\\\\7.536023\\\\203.7328\\\\304.01\\\\7.638467\\\\202.5619\\\\304.01\\\\7.94269\\\\201.4265\\\\304.01\\\\8.439445\\\\200.3612\\\\304.01\\\\9.113642\\\\199.3984\\\\304.01\\\\9.944793\\\\198.5672\\\\304.01\\\\10.90764\\\\197.893\\\\304.01\\\\11.97294\\\\197.3963\\\\304.01\\\\13.10831\\\\197.0921\\\\304.01\\\\14.27927\\\\196.9896\\\\304.01\\\\15.45022\\\\197.0921\\\\304.01\\\\16.58559\\\\197.3963\\\\304.01\\\\17.65089\\\\197.893\\\\304.01\\\\18.61374\\\\198.5672\\\\304.01\\\\19.44489\\\\199.3984\\\\304.01\\\\20.11909\\\\200.3612\\\\304.01\\\\20.61584\\\\201.4265\\\\304.01\\\\20.92006\\\\202.5619\\\\304.01\\\\21.02251\\\\203.7328\\\\304.01\\\\20.92006\\\\204.9038\\\\304.01\\\\20.61584\\\\206.0392\\\\304.01\\\\20.11909\\\\207.1045\\\\304.01\\\\19.44489\\\\208.0673\\\\304.01\\\\18.61374\\\\208.8985\\\\304.01\\\\17.65089\\\\209.5727\\\\304.01\\\\16.58559\\\\210.0694\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"15.45022\\\\210.3737\\\\307.01\\\\14.27927\\\\210.4761\\\\307.01\\\\13.10831\\\\210.3737\\\\307.01\\\\11.97294\\\\210.0694\\\\307.01\\\\10.90764\\\\209.5727\\\\307.01\\\\9.944793\\\\208.8985\\\\307.01\\\\9.113642\\\\208.0673\\\\307.01\\\\8.439445\\\\207.1045\\\\307.01\\\\7.94269\\\\206.0392\\\\307.01\\\\7.638467\\\\204.9038\\\\307.01\\\\7.536023\\\\203.7328\\\\307.01\\\\7.638467\\\\202.5619\\\\307.01\\\\7.94269\\\\201.4265\\\\307.01\\\\8.439445\\\\200.3612\\\\307.01\\\\9.113642\\\\199.3984\\\\307.01\\\\9.944793\\\\198.5672\\\\307.01\\\\10.90764\\\\197.893\\\\307.01\\\\11.97294\\\\197.3963\\\\307.01\\\\13.10831\\\\197.0921\\\\307.01\\\\14.27927\\\\196.9896\\\\307.01\\\\15.45022\\\\197.0921\\\\307.01\\\\16.58559\\\\197.3963\\\\307.01\\\\17.65089\\\\197.893\\\\307.01\\\\18.61374\\\\198.5672\\\\307.01\\\\19.44489\\\\199.3984\\\\307.01\\\\20.11909\\\\200.3612\\\\307.01\\\\20.61584\\\\201.4265\\\\307.01\\\\20.92006\\\\202.5619\\\\307.01\\\\21.02251\\\\203.7328\\\\307.01\\\\20.92006\\\\204.9038\\\\307.01\\\\20.61584\\\\206.0392\\\\307.01\\\\20.11909\\\\207.1045\\\\307.01\\\\19.44489\\\\208.0673\\\\307.01\\\\18.61374\\\\208.8985\\\\307.01\\\\17.65089\\\\209.5727\\\\307.01\\\\16.58559\\\\210.0694\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"15.45022\\\\210.3737\\\\310.01\\\\14.27927\\\\210.4761\\\\310.01\\\\13.10831\\\\210.3737\\\\310.01\\\\11.97294\\\\210.0694\\\\310.01\\\\10.90764\\\\209.5727\\\\310.01\\\\9.944793\\\\208.8985\\\\310.01\\\\9.113642\\\\208.0673\\\\310.01\\\\8.439445\\\\207.1045\\\\310.01\\\\7.94269\\\\206.0392\\\\310.01\\\\7.638467\\\\204.9038\\\\310.01\\\\7.536023\\\\203.7328\\\\310.01\\\\7.638467\\\\202.5619\\\\310.01\\\\7.94269\\\\201.4265\\\\310.01\\\\8.439445\\\\200.3612\\\\310.01\\\\9.113642\\\\199.3984\\\\310.01\\\\9.944793\\\\198.5672\\\\310.01\\\\10.90764\\\\197.893\\\\310.01\\\\11.97294\\\\197.3963\\\\310.01\\\\13.10831\\\\197.0921\\\\310.01\\\\14.27927\\\\196.9896\\\\310.01\\\\15.45022\\\\197.0921\\\\310.01\\\\16.58559\\\\197.3963\\\\310.01\\\\17.65089\\\\197.893\\\\310.01\\\\18.61374\\\\198.5672\\\\310.01\\\\19.44489\\\\199.3984\\\\310.01\\\\20.11909\\\\200.3612\\\\310.01\\\\20.61584\\\\201.4265\\\\310.01\\\\20.92006\\\\202.5619\\\\310.01\\\\21.02251\\\\203.7328\\\\310.01\\\\20.92006\\\\204.9038\\\\310.01\\\\20.61584\\\\206.0392\\\\310.01\\\\20.11909\\\\207.1045\\\\310.01\\\\19.44489\\\\208.0673\\\\310.01\\\\18.61374\\\\208.8985\\\\310.01\\\\17.65089\\\\209.5727\\\\310.01\\\\16.58559\\\\210.0694\\\\310.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\\\\128\\\\255\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.97014\\\\164.0225\\\\295.01\\\\13.79919\\\\164.1249\\\\295.01\\\\12.62824\\\\164.0225\\\\295.01\\\\11.49286\\\\163.7183\\\\295.01\\\\10.42757\\\\163.2215\\\\295.01\\\\9.464716\\\\162.5473\\\\295.01\\\\8.633565\\\\161.7162\\\\295.01\\\\7.95937\\\\160.7533\\\\295.01\\\\7.462614\\\\159.688\\\\295.01\\\\7.158391\\\\158.5526\\\\295.01\\\\7.055946\\\\157.3817\\\\295.01\\\\7.158391\\\\156.2107\\\\295.01\\\\7.462614\\\\155.0753\\\\295.01\\\\7.95937\\\\154.0101\\\\295.01\\\\8.633565\\\\153.0472\\\\295.01\\\\9.464716\\\\152.216\\\\295.01\\\\10.42757\\\\151.5419\\\\295.01\\\\11.49286\\\\151.0451\\\\295.01\\\\12.62824\\\\150.7409\\\\295.01\\\\13.79919\\\\150.6384\\\\295.01\\\\14.97014\\\\150.7409\\\\295.01\\\\16.10551\\\\151.0451\\\\295.01\\\\17.17081\\\\151.5419\\\\295.01\\\\18.13366\\\\152.216\\\\295.01\\\\18.96481\\\\153.0472\\\\295.01\\\\19.63901\\\\154.0101\\\\295.01\\\\20.13577\\\\155.0753\\\\295.01\\\\20.43999\\\\156.2107\\\\295.01\\\\20.54243\\\\157.3817\\\\295.01\\\\20.43999\\\\158.5526\\\\295.01\\\\20.13577\\\\159.688\\\\295.01\\\\19.63901\\\\160.7533\\\\295.01\\\\18.96481\\\\161.7162\\\\295.01\\\\18.13366\\\\162.5473\\\\295.01\\\\17.17081\\\\163.2215\\\\295.01\\\\16.10551\\\\163.7183\\\\295.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n"; +const char* k_rtStruct_json01 = +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.97014\\\\164.0225\\\\298.01\\\\13.79919\\\\164.1249\\\\298.01\\\\12.62824\\\\164.0225\\\\298.01\\\\11.49286\\\\163.7183\\\\298.01\\\\10.42757\\\\163.2215\\\\298.01\\\\9.464716\\\\162.5473\\\\298.01\\\\8.633565\\\\161.7162\\\\298.01\\\\7.95937\\\\160.7533\\\\298.01\\\\7.462614\\\\159.688\\\\298.01\\\\7.158391\\\\158.5526\\\\298.01\\\\7.055946\\\\157.3817\\\\298.01\\\\7.158391\\\\156.2107\\\\298.01\\\\7.462614\\\\155.0753\\\\298.01\\\\7.95937\\\\154.0101\\\\298.01\\\\8.633565\\\\153.0472\\\\298.01\\\\9.464716\\\\152.216\\\\298.01\\\\10.42757\\\\151.5419\\\\298.01\\\\11.49286\\\\151.0451\\\\298.01\\\\12.62824\\\\150.7409\\\\298.01\\\\13.79919\\\\150.6384\\\\298.01\\\\14.97014\\\\150.7409\\\\298.01\\\\16.10551\\\\151.0451\\\\298.01\\\\17.17081\\\\151.5419\\\\298.01\\\\18.13366\\\\152.216\\\\298.01\\\\18.96481\\\\153.0472\\\\298.01\\\\19.63901\\\\154.0101\\\\298.01\\\\20.13577\\\\155.0753\\\\298.01\\\\20.43999\\\\156.2107\\\\298.01\\\\20.54243\\\\157.3817\\\\298.01\\\\20.43999\\\\158.5526\\\\298.01\\\\20.13577\\\\159.688\\\\298.01\\\\19.63901\\\\160.7533\\\\298.01\\\\18.96481\\\\161.7162\\\\298.01\\\\18.13366\\\\162.5473\\\\298.01\\\\17.17081\\\\163.2215\\\\298.01\\\\16.10551\\\\163.7183\\\\298.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.97014\\\\164.0225\\\\301.01\\\\13.79919\\\\164.1249\\\\301.01\\\\12.62824\\\\164.0225\\\\301.01\\\\11.49286\\\\163.7183\\\\301.01\\\\10.42757\\\\163.2215\\\\301.01\\\\9.464716\\\\162.5473\\\\301.01\\\\8.633565\\\\161.7162\\\\301.01\\\\7.95937\\\\160.7533\\\\301.01\\\\7.462614\\\\159.688\\\\301.01\\\\7.158391\\\\158.5526\\\\301.01\\\\7.055946\\\\157.3817\\\\301.01\\\\7.158391\\\\156.2107\\\\301.01\\\\7.462614\\\\155.0753\\\\301.01\\\\7.95937\\\\154.0101\\\\301.01\\\\8.633565\\\\153.0472\\\\301.01\\\\9.464716\\\\152.216\\\\301.01\\\\10.42757\\\\151.5419\\\\301.01\\\\11.49286\\\\151.0451\\\\301.01\\\\12.62824\\\\150.7409\\\\301.01\\\\13.79919\\\\150.6384\\\\301.01\\\\14.97014\\\\150.7409\\\\301.01\\\\16.10551\\\\151.0451\\\\301.01\\\\17.17081\\\\151.5419\\\\301.01\\\\18.13366\\\\152.216\\\\301.01\\\\18.96481\\\\153.0472\\\\301.01\\\\19.63901\\\\154.0101\\\\301.01\\\\20.13577\\\\155.0753\\\\301.01\\\\20.43999\\\\156.2107\\\\301.01\\\\20.54243\\\\157.3817\\\\301.01\\\\20.43999\\\\158.5526\\\\301.01\\\\20.13577\\\\159.688\\\\301.01\\\\19.63901\\\\160.7533\\\\301.01\\\\18.96481\\\\161.7162\\\\301.01\\\\18.13366\\\\162.5473\\\\301.01\\\\17.17081\\\\163.2215\\\\301.01\\\\16.10551\\\\163.7183\\\\301.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\\\\128\\\\0\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"340\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"108.3984\\\\232.7406\\\\274.01\\\\106.0547\\\\231.7948\\\\274.01\\\\103.7109\\\\232.8407\\\\274.01\\\\96.67969\\\\232.8757\\\\274.01\\\\77.92969\\\\232.887\\\\274.01\\\\47.46094\\\\232.8902\\\\274.01\\\\38.08594\\\\232.7537\\\\274.01\\\\37.6668\\\\232.3734\\\\274.01\\\\38.08594\\\\231.9774\\\\274.01\\\\40.42969\\\\231.8475\\\\274.01\\\\41.76413\\\\230.0297\\\\274.01\\\\42.77344\\\\229.1388\\\\274.01\\\\45.11719\\\\228.5069\\\\274.01\\\\47.46094\\\\227.1533\\\\274.01\\\\49.80469\\\\226.3505\\\\274.01\\\\52.14844\\\\224.6564\\\\274.01\\\\54.49219\\\\223.923\\\\274.01\\\\56.83594\\\\222.0692\\\\274.01\\\\59.17969\\\\220.3438\\\\274.01\\\\61.52344\\\\219.3888\\\\274.01\\\\63.86719\\\\217.1287\\\\274.01\\\\65.83488\\\\215.9672\\\\274.01\\\\68.55469\\\\213.2383\\\\274.01\\\\70.89844\\\\211.2328\\\\274.01\\\\72.8125\\\\208.9359\\\\274.01\\\\75.58594\\\\206.3615\\\\274.01\\\\76.91445\\\\204.2484\\\\274.01\\\\78.89509\\\\201.9047\\\\274.01\\\\80.51276\\\\199.5609\\\\274.01\\\\81.51955\\\\197.2172\\\\274.01\\\\83.67448\\\\194.8734\\\\274.01\\\\84.60938\\\\192.5297\\\\274.01\\\\85.86986\\\\190.1859\\\\274.01\\\\86.57623\\\\187.8422\\\\274.01\\\\88.30051\\\\185.4984\\\\274.01\\\\88.94002\\\\183.1547\\\\274.01\\\\89.23261\\\\180.8109\\\\274.01\\\\89.64844\\\\180.3263\\\\274.01\\\\90.71885\\\\178.4672\\\\274.01\\\\90.97656\\\\176.1234\\\\274.01\\\\91.99219\\\\174.4794\\\\274.01\\\\92.56773\\\\173.7797\\\\274.01\\\\92.80016\\\\171.4359\\\\274.01\\\\93.23473\\\\169.0922\\\\274.01\\\\93.37606\\\\166.7484\\\\274.01\\\\93.60748\\\\157.3734\\\\274.01\\\\93.6341\\\\152.6859\\\\274.01\\\\93.35742\\\\140.9672\\\\274.01\\\\92.89317\\\\138.6234\\\\274.01\\\\92.7069\\\\136.2797\\\\274.01\\\\92.03726\\\\133.9359\\\\274.01\\\\90.84009\\\\131.5922\\\\274.01\\\\90.3769\\\\129.2484\\\\274.01\\\\89.09074\\\\126.9047\\\\274.01\\\\88.13225\\\\122.2172\\\\274.01\\\\86.17828\\\\119.8734\\\\274.01\\\\84.96094\\\\117.4163\\\\274.01\\\\83.99619\\\\115.1859\\\\274.01\\\\83.13079\\\\112.8422\\\\274.01\\\\82.61719\\\\112.2984\\\\274.01\\\\80.27344\\\\108.8454\\\\274.01\\\\79.64514\\\\108.1547\\\\274.01\\\\77.21497\\\\105.8109\\\\274.01\\\\76.47787\\\\103.4672\\\\274.01\\\\75.58594\\\\102.6177\\\\274.01\\\\73.24219\\\\100.0077\\\\274.01\\\\69.54492\\\\96.43594\\\\274.01\\\\67.34096\\\\94.09219\\\\274.01\\\\64.66306\\\\91.74844\\\\274.01\\\\63.86719\\\\90.92619\\\\274.01\\\\61.52344\\\\90.20454\\\\274.01\\\\59.17969\\\\87.78574\\\\274.01\\\\56.83594\\\\86.48566\\\\274.01\\\\54.49219\\\\84.31388\\\\274.01\\\\52.14844\\\\83.44438\\\\274.01\\\\49.80469\\\\82.75121\\\\274.01\\\\49.37617\\\\82.37344\\\\274.01\\\\47.46094\\\\81.26244\\\\274.01\\\\45.71391\\\\80.02969\\\\274.01\\\\45.11719\\\\79.45415\\\\274.01\\\\42.77344\\\\79.08185\\\\274.01\\\\40.42969\\\\78.51941\\\\274.01\\\\38.08594\\\\78.27534\\\\274.01\\\\37.36932\\\\77.68594\\\\274.01\\\\35.74219\\\\76.67624\\\\274.01\\\\33.39844\\\\76.49941\\\\274.01\\\\31.05469\\\\76.03495\\\\274.01\\\\28.71094\\\\74.83174\\\\274.01\\\\26.36719\\\\74.62859\\\\274.01\\\\24.02344\\\\74.55463\\\\274.01\\\\21.67969\\\\74.22861\\\\274.01\\\\19.33594\\\\74.05312\\\\274.01\\\\12.30469\\\\73.99397\\\\274.01\\\\5.273438\\\\74.0736\\\\274.01\\\\2.929688\\\\74.55463\\\\274.01\\\\0.5859375\\\\74.68513\\\\274.01\\\\-1.757813\\\\74.914\\\\274.01\\\\-2.319131\\\\75.34219\\\\274.01\\\\-4.101563\\\\76.31516\\\\274.01\\\\-8.789063\\\\76.74514\\\\274.01\\\\-11.13281\\\\78.39038\\\\274.01\\\\-13.47656\\\\78.6124\\\\274.01\\\\-15.82031\\\\79.19784\\\\274.01\\\\-18.16406\\\\81.11024\\\\274.01\\\\-20.50781\\\\82.03296\\\\274.01\\\\-22.85156\\\\83.13991\\\\274.01\\\\-25.19531\\\\83.70732\\\\274.01\\\\-27.53906\\\\85.85863\\\\274.01\\\\-29.88281\\\\87.03368\\\\274.01\\\\-32.22656\\\\88.3274\\\\274.01\\\\-34.57031\\\\90.53674\\\\274.01\\\\-36.91406\\\\92.5602\\\\274.01\\\\-39.25781\\\\93.55952\\\\274.01\\\\-41.60156\\\\95.74537\\\\274.01\\\\-43.94531\\\\98.26609\\\\274.01\\\\-46.28906\\\\100.3701\\\\274.01\\\\-47.02621\\\\101.1234\\\\274.01\\\\-47.86611\\\\103.4672\\\\274.01\\\\-49.83594\\\\105.8109\\\\274.01\\\\-51.98182\\\\108.1547\\\\274.01\\\\-53.06448\\\\110.4984\\\\274.01\\\\-53.32031\\\\110.7675\\\\274.01\\\\-54.53804\\\\112.8422\\\\274.01\\\\-55.66406\\\\114.273\\\\274.01\\\\-56.55722\\\\115.1859\\\\274.01\\\\-57.13953\\\\117.5297\\\\274.01\\\\-58.29264\\\\119.8734\\\\274.01\\\\-59.26869\\\\122.2172\\\\274.01\\\\-60.35156\\\\124.0119\\\\274.01\\\\-60.84229\\\\124.5609\\\\274.01\\\\-61.54484\\\\126.9047\\\\274.01\\\\-61.71691\\\\129.2484\\\\274.01\\\\-63.62281\\\\131.5922\\\\274.01\\\\-63.81256\\\\133.9359\\\\274.01\\\\-64.12511\\\\136.2797\\\\274.01\\\\-64.84515\\\\138.6234\\\\274.01\\\\-65.13599\\\\140.9672\\\\274.01\\\\-65.33604\\\\143.3109\\\\274.01\\\\-65.87358\\\\145.6547\\\\274.01\\\\-66.10577\\\\147.9984\\\\274.01\\\\-66.17618\\\\155.0297\\\\274.01\\\\-66.09933\\\\162.0609\\\\274.01\\\\-65.40382\\\\164.4047\\\\274.01\\\\-65.24833\\\\166.7484\\\\274.01\\\\-64.71442\\\\171.4359\\\\274.01\\\\-63.88171\\\\173.7797\\\\274.01\\\\-63.69299\\\\176.1234\\\\274.01\\\\-61.79081\\\\178.4672\\\\274.01\\\\-61.59269\\\\180.8109\\\\274.01\\\\-61.19405\\\\183.1547\\\\274.01\\\\-60.35156\\\\185.2055\\\\274.01\\\\-59.08288\\\\187.8422\\\\274.01\\\\-58.00781\\\\189.3499\\\\274.01\\\\-57.25858\\\\190.1859\\\\274.01\\\\-56.64558\\\\192.5297\\\\274.01\\\\-55.29191\\\\194.8734\\\\274.01\\\\-54.28698\\\\197.2172\\\\274.01\\\\-52.28595\\\\199.5609\\\\274.01\\\\-51.47569\\\\201.9047\\\\274.01\\\\-48.63281\\\\204.6417\\\\274.01\\\\-47.10181\\\\206.5922\\\\274.01\\\\-44.64154\\\\208.9359\\\\274.01\\\\-42.38504\\\\211.2797\\\\274.01\\\\-39.25781\\\\214.4025\\\\274.01\\\\-37.42723\\\\215.9672\\\\274.01\\\\-34.57031\\\\218.9107\\\\274.01\\\\-32.22656\\\\219.7277\\\\274.01\\\\-29.88281\\\\221.6934\\\\274.01\\\\-27.53906\\\\222.852\\\\274.01\\\\-25.19531\\\\224.5168\\\\274.01\\\\-22.85156\\\\225.9419\\\\274.01\\\\-20.50781\\\\226.7359\\\\274.01\\\\-18.16406\\\\228.3332\\\\274.01\\\\-15.82031\\\\229.065\\\\274.01\\\\-13.47656\\\\229.267\\\\274.01\\\\-12.63854\\\\230.0297\\\\274.01\\\\-11.13281\\\\231.9201\\\\274.01\\\\-10.65505\\\\232.3734\\\\274.01\\\\-11.13281\\\\232.7794\\\\274.01\\\\-15.82031\\\\232.792\\\\274.01\\\\-18.16406\\\\232.8902\\\\274.01\\\\-36.91406\\\\232.9015\\\\274.01\\\\-39.25781\\\\232.8902\\\\274.01\\\\-50.97656\\\\232.9236\\\\274.01\\\\-60.35156\\\\232.9126\\\\274.01\\\\-67.38281\\\\232.8407\\\\274.01\\\\-72.07031\\\\232.8642\\\\274.01\\\\-79.10156\\\\232.8555\\\\274.01\\\\-83.78906\\\\232.8788\\\\274.01\\\\-95.50781\\\\232.8902\\\\274.01\\\\-97.85156\\\\233.4886\\\\274.01\\\\-100.1953\\\\233.647\\\\274.01\\\\-102.5391\\\\232.9858\\\\274.01\\\\-104.8828\\\\233.6969\\\\274.01\\\\-109.5703\\\\233.722\\\\274.01\\\\-125.9766\\\\233.7086\\\\274.01\\\\-128.3203\\\\233.2849\\\\274.01\\\\-130.6641\\\\233.702\\\\274.01\\\\-135.3516\\\\233.727\\\\274.01\\\\-149.4141\\\\233.7135\\\\274.01\\\\-156.4453\\\\233.727\\\\274.01\\\\-163.4766\\\\233.7119\\\\274.01\\\\-168.1641\\\\233.7643\\\\274.01\\\\-191.6016\\\\233.7809\\\\274.01\\\\-210.3516\\\\233.7716\\\\274.01\\\\-224.4141\\\\233.7998\\\\274.01\\\\-233.7891\\\\233.7647\\\\274.01\\\\-243.1641\\\\233.7785\\\\274.01\\\\-247.8516\\\\233.7378\\\\274.01\\\\-254.8828\\\\233.8578\\\\274.01\\\\-257.2266\\\\235.2519\\\\274.01\\\\-259.5703\\\\236.0817\\\\274.01\\\\-260.7617\\\\237.0609\\\\274.01\\\\-261.9141\\\\238.2262\\\\274.01\\\\-262.8989\\\\239.4047\\\\274.01\\\\-262.9743\\\\241.7484\\\\274.01\\\\-262.5977\\\\244.0922\\\\274.01\\\\-260.6675\\\\246.4359\\\\274.01\\\\-259.6161\\\\248.7797\\\\274.01\\\\-257.2266\\\\251.0035\\\\274.01\\\\-255.0361\\\\253.4672\\\\274.01\\\\-252.5391\\\\256.0995\\\\274.01\\\\-251.2277\\\\258.1547\\\\274.01\\\\-246.7444\\\\262.8422\\\\274.01\\\\-243.1641\\\\266.3515\\\\274.01\\\\-239.7411\\\\269.8734\\\\274.01\\\\-238.4766\\\\270.9495\\\\274.01\\\\-237.2269\\\\272.2172\\\\274.01\\\\-236.1328\\\\273.5215\\\\274.01\\\\-235.0934\\\\274.5609\\\\274.01\\\\-233.7891\\\\275.6655\\\\274.01\\\\-232.5319\\\\276.9047\\\\274.01\\\\-231.4453\\\\278.1693\\\\274.01\\\\-227.917\\\\281.5922\\\\274.01\\\\-224.4141\\\\285.1802\\\\274.01\\\\-222.0703\\\\287.4025\\\\274.01\\\\-218.6841\\\\290.9672\\\\274.01\\\\-217.3828\\\\291.9709\\\\274.01\\\\-215.0391\\\\293.1788\\\\274.01\\\\-212.6953\\\\294.5138\\\\274.01\\\\-210.3516\\\\295.2614\\\\274.01\\\\-209.8994\\\\295.6547\\\\274.01\\\\-208.0078\\\\296.7083\\\\274.01\\\\-203.3203\\\\296.9372\\\\274.01\\\\-196.2891\\\\296.9317\\\\274.01\\\\-193.9453\\\\296.8988\\\\274.01\\\\-172.8516\\\\296.8482\\\\274.01\\\\-161.1328\\\\296.843\\\\274.01\\\\-137.6953\\\\296.8542\\\\274.01\\\\-130.6641\\\\296.8378\\\\274.01\\\\-107.2266\\\\296.8379\\\\274.01\\\\-93.16406\\\\296.8208\\\\274.01\\\\-74.41406\\\\296.838\\\\274.01\\\\-65.03906\\\\296.8609\\\\274.01\\\\-50.97656\\\\296.8556\\\\274.01\\\\-46.28906\\\\296.9051\\\\274.01\\\\-41.60156\\\\298.5331\\\\274.01\\\\-39.25781\\\\298.5624\\\\274.01\\\\-36.91406\\\\297.1455\\\\274.01\\\\-34.57031\\\\297.0498\\\\274.01\\\\-32.22656\\\\298.5589\\\\274.01\\\\-25.19531\\\\298.5624\\\\274.01\\\\-22.85156\\\\297.2842\\\\274.01\\\\-20.50781\\\\298.5624\\\\274.01\\\\-1.757813\\\\298.5624\\\\274.01\\\\0.5859375\\\\297.2104\\\\274.01\\\\2.929688\\\\298.5624\\\\274.01\\\\5.273438\\\\297.6946\\\\274.01\\\\7.617188\\\\298.5168\\\\274.01\\\\9.960938\\\\298.5512\\\\274.01\\\\12.30469\\\\296.937\\\\274.01\\\\14.64844\\\\298.5478\\\\274.01\\\\16.99219\\\\298.5478\\\\274.01\\\\19.33594\\\\297.0782\\\\274.01\\\\21.67969\\\\296.844\\\\274.01\\\\23.54531\\\\297.9984\\\\274.01\\\\24.02344\\\\298.4023\\\\274.01\\\\24.50156\\\\297.9984\\\\274.01\\\\26.36719\\\\296.844\\\\274.01\\\\38.08594\\\\296.8381\\\\274.01\\\\52.14844\\\\296.8033\\\\274.01\\\\59.17969\\\\296.8033\\\\274.01\\\\73.24219\\\\296.7682\\\\274.01\\\\99.02344\\\\296.7566\\\\274.01\\\\117.7734\\\\296.7216\\\\274.01\\\\129.4922\\\\296.7152\\\\274.01\\\\131.8359\\\\295.9083\\\\274.01\\\\134.1797\\\\295.5245\\\\274.01\\\\138.8672\\\\295.4763\\\\274.01\\\\155.2734\\\\295.4763\\\\274.01\\\\176.3672\\\\295.3861\\\\274.01\\\\190.4297\\\\295.3718\\\\274.01\\\\197.4609\\\\295.4763\\\\274.01\\\\202.1484\\\\295.4454\\\\274.01\\\\204.4922\\\\295.3438\\\\274.01\\\\206.8359\\\\295.0757\\\\274.01\\\\209.1797\\\\294.4124\\\\274.01\\\\211.5234\\\\292.3133\\\\274.01\\\\213.8672\\\\291.0809\\\\274.01\\\\216.2109\\\\289.6743\\\\274.01\\\\217.3081\\\\288.6234\\\\274.01\\\\219.3558\\\\286.2797\\\\274.01\\\\221.8608\\\\283.9359\\\\274.01\\\\225.5859\\\\280.045\\\\274.01\\\\227.9297\\\\277.8885\\\\274.01\\\\230.2734\\\\275.2857\\\\274.01\\\\232.6172\\\\273.2225\\\\274.01\\\\233.6225\\\\272.2172\\\\274.01\\\\234.9609\\\\270.5822\\\\274.01\\\\238.2254\\\\267.5297\\\\274.01\\\\240.3691\\\\265.1859\\\\274.01\\\\244.3359\\\\261.3326\\\\274.01\\\\246.6797\\\\258.8034\\\\274.01\\\\249.0234\\\\256.7196\\\\274.01\\\\251.3672\\\\254.0746\\\\274.01\\\\254.5313\\\\251.1234\\\\274.01\\\\255.333\\\\248.7797\\\\274.01\\\\257.3723\\\\246.4359\\\\274.01\\\\259.7201\\\\244.0922\\\\274.01\\\\260.106\\\\241.7484\\\\274.01\\\\261.6423\\\\239.4047\\\\274.01\\\\261.0804\\\\237.0609\\\\274.01\\\\259.3552\\\\234.7172\\\\274.01\\\\258.3984\\\\233.7696\\\\274.01\\\\256.0547\\\\232.8757\\\\274.01\\\\253.7109\\\\232.792\\\\274.01\\\\251.3672\\\\232.8161\\\\274.01\\\\246.6797\\\\232.6981\\\\274.01\\\\244.3359\\\\232.725\\\\274.01\\\\239.6484\\\\232.9137\\\\274.01\\\\234.9609\\\\232.8525\\\\274.01\\\\225.5859\\\\232.8757\\\\274.01\\\\209.1797\\\\232.8757\\\\274.01\\\\204.4922\\\\232.7537\\\\274.01\\\\195.1172\\\\232.7794\\\\274.01\\\\171.6797\\\\232.792\\\\274.01\\\\164.6484\\\\232.7666\\\\274.01\\\\152.9297\\\\232.7666\\\\274.01\\\\148.2422\\\\232.792\\\\274.01\\\\138.8672\\\\232.7406\\\\274.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"380\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0671\\\\277.01\\\\-32.22656\\\\233.1221\\\\277.01\\\\-41.60156\\\\233.1397\\\\277.01\\\\-43.94531\\\\233.1221\\\\277.01\\\\-50.97656\\\\233.1818\\\\277.01\\\\-60.35156\\\\233.1568\\\\277.01\\\\-67.38281\\\\232.9942\\\\277.01\\\\-74.41406\\\\233.0537\\\\277.01\\\\-79.10156\\\\233.0283\\\\277.01\\\\-88.47656\\\\233.0859\\\\277.01\\\\-95.50781\\\\233.1042\\\\277.01\\\\-97.85156\\\\234.0105\\\\277.01\\\\-100.1953\\\\234.062\\\\277.01\\\\-102.5391\\\\233.987\\\\277.01\\\\-104.8828\\\\234.0941\\\\277.01\\\\-109.5703\\\\234.1996\\\\277.01\\\\-114.2578\\\\234.1551\\\\277.01\\\\-123.6328\\\\234.1127\\\\277.01\\\\-125.9766\\\\234.1266\\\\277.01\\\\-128.3203\\\\234.0177\\\\277.01\\\\-135.3516\\\\234.1741\\\\277.01\\\\-140.0391\\\\234.1551\\\\277.01\\\\-142.3828\\\\234.1996\\\\277.01\\\\-147.0703\\\\234.1174\\\\277.01\\\\-156.4453\\\\234.1828\\\\277.01\\\\-163.4766\\\\234.1357\\\\277.01\\\\-165.8203\\\\234.1871\\\\277.01\\\\-168.1641\\\\234.3922\\\\277.01\\\\-177.5391\\\\234.4145\\\\277.01\\\\-179.8828\\\\234.3618\\\\277.01\\\\-184.5703\\\\234.3864\\\\277.01\\\\-186.9141\\\\234.4535\\\\277.01\\\\-189.2578\\\\234.4194\\\\277.01\\\\-191.6016\\\\234.471\\\\277.01\\\\-198.6328\\\\234.3891\\\\277.01\\\\-200.9766\\\\234.4386\\\\277.01\\\\-205.6641\\\\234.3731\\\\277.01\\\\-210.3516\\\\234.3731\\\\277.01\\\\-217.3828\\\\234.4242\\\\277.01\\\\-219.7266\\\\234.5104\\\\277.01\\\\-224.4141\\\\234.4944\\\\277.01\\\\-229.1016\\\\234.4218\\\\277.01\\\\-233.7891\\\\234.2678\\\\277.01\\\\-240.8203\\\\234.3296\\\\277.01\\\\-243.1641\\\\234.3917\\\\277.01\\\\-247.8516\\\\234.2029\\\\277.01\\\\-250.1953\\\\234.3235\\\\277.01\\\\-251.4551\\\\234.7172\\\\277.01\\\\-252.5391\\\\236.6024\\\\277.01\\\\-254.8828\\\\235.4008\\\\277.01\\\\-257.2266\\\\235.5063\\\\277.01\\\\-259.5703\\\\236.2655\\\\277.01\\\\-260.5737\\\\237.0609\\\\277.01\\\\-262.332\\\\239.4047\\\\277.01\\\\-262.689\\\\241.7484\\\\277.01\\\\-261.9141\\\\243.7504\\\\277.01\\\\-260.6889\\\\246.4359\\\\277.01\\\\-259.5703\\\\248.4867\\\\277.01\\\\-255.2138\\\\253.4672\\\\277.01\\\\-253.2667\\\\255.8109\\\\277.01\\\\-250.1953\\\\258.8662\\\\277.01\\\\-247.8516\\\\261.4125\\\\277.01\\\\-246.2862\\\\262.8422\\\\277.01\\\\-244.1278\\\\265.1859\\\\277.01\\\\-240.8203\\\\268.3467\\\\277.01\\\\-239.375\\\\269.8734\\\\277.01\\\\-236.9429\\\\272.2172\\\\277.01\\\\-233.7891\\\\275.382\\\\277.01\\\\-231.4453\\\\277.8091\\\\277.01\\\\-229.8568\\\\279.2484\\\\277.01\\\\-227.6842\\\\281.5922\\\\277.01\\\\-225.1387\\\\283.9359\\\\277.01\\\\-222.0703\\\\287.1957\\\\277.01\\\\-220.5108\\\\288.6234\\\\277.01\\\\-218.2596\\\\290.9672\\\\277.01\\\\-217.3828\\\\291.6321\\\\277.01\\\\-215.0391\\\\292.8542\\\\277.01\\\\-214.579\\\\293.3109\\\\277.01\\\\-212.6953\\\\294.5394\\\\277.01\\\\-210.3516\\\\295.0909\\\\277.01\\\\-209.68\\\\295.6547\\\\277.01\\\\-208.0078\\\\296.4548\\\\277.01\\\\-205.6641\\\\296.8658\\\\277.01\\\\-203.3203\\\\297.1639\\\\277.01\\\\-196.2891\\\\297.1488\\\\277.01\\\\-193.9453\\\\297.0495\\\\277.01\\\\-179.8828\\\\296.9703\\\\277.01\\\\-172.8516\\\\296.9012\\\\277.01\\\\-168.1641\\\\296.9407\\\\277.01\\\\-161.1328\\\\296.9063\\\\277.01\\\\-156.4453\\\\296.9453\\\\277.01\\\\-151.7578\\\\296.9222\\\\277.01\\\\-147.0703\\\\296.9559\\\\277.01\\\\-144.7266\\\\296.9085\\\\277.01\\\\-135.3516\\\\296.92\\\\277.01\\\\-121.2891\\\\296.8532\\\\277.01\\\\-107.2266\\\\296.8819\\\\277.01\\\\-93.16406\\\\296.7973\\\\277.01\\\\-90.82031\\\\296.8363\\\\277.01\\\\-83.78906\\\\296.8459\\\\277.01\\\\-81.44531\\\\296.8837\\\\277.01\\\\-74.41406\\\\296.9028\\\\277.01\\\\-65.03906\\\\296.96\\\\277.01\\\\-60.35156\\\\296.9494\\\\277.01\\\\-58.00781\\\\296.9872\\\\277.01\\\\-53.32031\\\\296.9377\\\\277.01\\\\-50.97656\\\\296.9579\\\\277.01\\\\-48.63281\\\\297.1438\\\\277.01\\\\-43.94531\\\\297.2253\\\\277.01\\\\-41.60156\\\\297.048\\\\277.01\\\\-39.25781\\\\297.3759\\\\277.01\\\\-36.91406\\\\296.9644\\\\277.01\\\\-34.57031\\\\297.3341\\\\277.01\\\\-32.22656\\\\297.1747\\\\277.01\\\\-29.88281\\\\297.4229\\\\277.01\\\\-27.53906\\\\297.3652\\\\277.01\\\\-25.19531\\\\297.4334\\\\277.01\\\\-22.85156\\\\297.3652\\\\277.01\\\\-18.16406\\\\297.4229\\\\277.01\\\\-11.13281\\\\297.4334\\\\277.01\\\\-4.101563\\\\297.3235\\\\277.01\\\\-1.757813\\\\297.4229\\\\277.01\\\\2.929688\\\\297.3531\\\\277.01\\\\5.273438\\\\297.2199\\\\277.01\\\\7.617188\\\\297.4055\\\\277.01\\\\9.960938\\\\297.3842\\\\277.01\\\\12.30469\\\\296.9557\\\\277.01\\\\14.64844\\\\297.2621\\\\277.01\\\\16.99219\\\\297.2089\\\\277.01\\\\21.67969\\\\296.916\\\\277.01\\\\24.02344\\\\297.3701\\\\277.01\\\\26.36719\\\\296.9067\\\\277.01\\\\28.71094\\\\296.9467\\\\277.01\\\\33.39844\\\\296.8867\\\\277.01\\\\40.42969\\\\296.8564\\\\277.01\\\\45.11719\\\\296.7865\\\\277.01\\\\56.83594\\\\296.6788\\\\277.01\\\\61.52344\\\\296.6724\\\\277.01\\\\73.24219\\\\296.5521\\\\277.01\\\\87.30469\\\\296.5362\\\\277.01\\\\91.99219\\\\296.4801\\\\277.01\\\\96.67969\\\\296.4873\\\\277.01\\\\101.3672\\\\296.4462\\\\277.01\\\\115.4297\\\\296.3703\\\\277.01\\\\117.7734\\\\296.3846\\\\277.01\\\\134.1797\\\\296.2709\\\\277.01\\\\136.5234\\\\296.2305\\\\277.01\\\\138.8672\\\\295.864\\\\277.01\\\\141.2109\\\\295.9064\\\\277.01\\\\145.8984\\\\295.8486\\\\277.01\\\\148.2422\\\\295.9027\\\\277.01\\\\150.5859\\\\295.833\\\\277.01\\\\155.2734\\\\295.864\\\\277.01\\\\157.6172\\\\295.8012\\\\277.01\\\\164.6484\\\\295.7516\\\\277.01\\\\169.3359\\\\295.6819\\\\277.01\\\\174.0234\\\\295.6819\\\\277.01\\\\176.3672\\\\295.5916\\\\277.01\\\\181.0547\\\\295.557\\\\277.01\\\\185.7422\\\\295.5742\\\\277.01\\\\192.7734\\\\295.5401\\\\277.01\\\\197.4609\\\\295.833\\\\277.01\\\\202.1484\\\\295.7684\\\\277.01\\\\204.4922\\\\295.4594\\\\277.01\\\\206.8359\\\\294.8185\\\\277.01\\\\209.1797\\\\294.347\\\\277.01\\\\211.5234\\\\292.4135\\\\277.01\\\\213.8672\\\\291.0298\\\\277.01\\\\216.2109\\\\289.437\\\\277.01\\\\217.074\\\\288.6234\\\\277.01\\\\218.5547\\\\286.9247\\\\277.01\\\\221.5416\\\\283.9359\\\\277.01\\\\225.5859\\\\279.7662\\\\277.01\\\\227.9297\\\\277.4546\\\\277.01\\\\230.2734\\\\274.9609\\\\277.01\\\\233.0324\\\\272.2172\\\\277.01\\\\234.9609\\\\270.159\\\\277.01\\\\241.9922\\\\262.9747\\\\277.01\\\\244.3264\\\\260.4984\\\\277.01\\\\246.6903\\\\258.1547\\\\277.01\\\\249.0234\\\\255.711\\\\277.01\\\\251.3672\\\\253.4211\\\\277.01\\\\255.433\\\\248.7797\\\\277.01\\\\257.1424\\\\246.4359\\\\277.01\\\\259.4697\\\\244.0922\\\\277.01\\\\261.12\\\\239.4047\\\\277.01\\\\260.5029\\\\237.0609\\\\277.01\\\\259.4318\\\\234.7172\\\\277.01\\\\258.3984\\\\233.723\\\\277.01\\\\256.0547\\\\233.0686\\\\277.01\\\\253.7109\\\\232.8224\\\\277.01\\\\251.3672\\\\233.3211\\\\277.01\\\\249.0234\\\\232.7988\\\\277.01\\\\246.6797\\\\232.5842\\\\277.01\\\\244.3359\\\\232.6886\\\\277.01\\\\239.6484\\\\233.2349\\\\277.01\\\\237.3047\\\\233.3486\\\\277.01\\\\234.9609\\\\233.0207\\\\277.01\\\\227.9297\\\\233.0108\\\\277.01\\\\225.5859\\\\233.0402\\\\277.01\\\\209.1797\\\\233.0726\\\\277.01\\\\206.8359\\\\232.9699\\\\277.01\\\\204.4922\\\\232.7719\\\\277.01\\\\199.8047\\\\232.7719\\\\277.01\\\\195.1172\\\\232.8224\\\\277.01\\\\183.3984\\\\232.8852\\\\277.01\\\\176.3672\\\\232.8253\\\\277.01\\\\171.6797\\\\232.8497\\\\277.01\\\\166.9922\\\\232.81\\\\277.01\\\\157.6172\\\\232.8253\\\\277.01\\\\152.9297\\\\232.8003\\\\277.01\\\\145.8984\\\\232.8497\\\\277.01\\\\138.8672\\\\232.7614\\\\277.01\\\\136.5234\\\\232.7746\\\\277.01\\\\129.4922\\\\232.7186\\\\277.01\\\\127.1484\\\\232.7614\\\\277.01\\\\120.1172\\\\232.7346\\\\277.01\\\\108.3984\\\\232.7481\\\\277.01\\\\106.0547\\\\232.7048\\\\277.01\\\\103.7109\\\\232.9735\\\\277.01\\\\101.3672\\\\232.9629\\\\277.01\\\\96.67969\\\\233.0726\\\\277.01\\\\87.30469\\\\233.091\\\\277.01\\\\75.58594\\\\233.0819\\\\277.01\\\\54.49219\\\\233.1221\\\\277.01\\\\47.46094\\\\233.1132\\\\277.01\\\\45.11719\\\\233.0766\\\\277.01\\\\43.65234\\\\232.3734\\\\277.01\\\\42.77344\\\\231.5049\\\\277.01\\\\42.03585\\\\230.0297\\\\277.01\\\\42.77344\\\\229.2833\\\\277.01\\\\45.11719\\\\228.6392\\\\277.01\\\\47.46094\\\\227.2099\\\\277.01\\\\49.80469\\\\226.1658\\\\277.01\\\\52.14844\\\\224.6817\\\\277.01\\\\54.49219\\\\223.8452\\\\277.01\\\\56.83594\\\\222.0004\\\\277.01\\\\59.17969\\\\220.4439\\\\277.01\\\\61.52344\\\\219.1271\\\\277.01\\\\63.86719\\\\217.0811\\\\277.01\\\\66.21094\\\\215.1756\\\\277.01\\\\67.88793\\\\213.6234\\\\277.01\\\\68.55469\\\\212.8797\\\\277.01\\\\70.89844\\\\210.7867\\\\277.01\\\\72.54482\\\\208.9359\\\\277.01\\\\75.58594\\\\205.6807\\\\277.01\\\\78.63421\\\\201.9047\\\\277.01\\\\80.27344\\\\199.5051\\\\277.01\\\\81.52466\\\\197.2172\\\\277.01\\\\83.37788\\\\194.8734\\\\277.01\\\\84.31507\\\\192.5297\\\\277.01\\\\85.73579\\\\190.1859\\\\277.01\\\\86.63975\\\\187.8422\\\\277.01\\\\88.17874\\\\185.4984\\\\277.01\\\\88.71944\\\\183.1547\\\\277.01\\\\89.50195\\\\180.8109\\\\277.01\\\\90.46938\\\\178.4672\\\\277.01\\\\91.07824\\\\176.1234\\\\277.01\\\\91.79828\\\\173.7797\\\\277.01\\\\92.70757\\\\171.4359\\\\277.01\\\\93.03977\\\\169.0922\\\\277.01\\\\93.52213\\\\162.0609\\\\277.01\\\\93.79673\\\\157.3734\\\\277.01\\\\93.88062\\\\152.6859\\\\277.01\\\\93.4634\\\\145.6547\\\\277.01\\\\92.9856\\\\138.6234\\\\277.01\\\\92.41903\\\\136.2797\\\\277.01\\\\91.40625\\\\133.9359\\\\277.01\\\\90.85396\\\\131.5922\\\\277.01\\\\90.15889\\\\129.2484\\\\277.01\\\\89.05895\\\\126.9047\\\\277.01\\\\88.55738\\\\124.5609\\\\277.01\\\\87.68194\\\\122.2172\\\\277.01\\\\86.25967\\\\119.8734\\\\277.01\\\\85.33871\\\\117.5297\\\\277.01\\\\84.04059\\\\115.1859\\\\277.01\\\\82.57069\\\\112.8422\\\\277.01\\\\81.18974\\\\110.4984\\\\277.01\\\\80.27344\\\\109.1834\\\\277.01\\\\77.70041\\\\105.8109\\\\277.01\\\\76.15247\\\\103.4672\\\\277.01\\\\71.9184\\\\98.77969\\\\277.01\\\\68.55469\\\\95.4427\\\\277.01\\\\63.86719\\\\91.32878\\\\277.01\\\\61.52344\\\\89.91453\\\\277.01\\\\59.17969\\\\88.0407\\\\277.01\\\\56.83594\\\\86.33517\\\\277.01\\\\54.49219\\\\85.22703\\\\277.01\\\\53.90625\\\\84.71719\\\\277.01\\\\52.14844\\\\83.53945\\\\277.01\\\\49.80469\\\\82.68647\\\\277.01\\\\47.46094\\\\81.38185\\\\277.01\\\\45.11719\\\\80.48212\\\\277.01\\\\42.77344\\\\79.08845\\\\277.01\\\\40.42969\\\\78.67566\\\\277.01\\\\38.08594\\\\78.01502\\\\277.01\\\\35.74219\\\\77.02299\\\\277.01\\\\33.39844\\\\76.44418\\\\277.01\\\\31.05469\\\\75.99764\\\\277.01\\\\26.36719\\\\74.59824\\\\277.01\\\\24.02344\\\\74.41319\\\\277.01\\\\16.99219\\\\74.11594\\\\277.01\\\\12.30469\\\\74.05871\\\\277.01\\\\7.617188\\\\74.18881\\\\277.01\\\\2.929688\\\\74.428\\\\277.01\\\\0.5859375\\\\74.75625\\\\277.01\\\\-1.757813\\\\75.58151\\\\277.01\\\\-4.101563\\\\76.20659\\\\277.01\\\\-6.445313\\\\76.63125\\\\277.01\\\\-8.789063\\\\77.37503\\\\277.01\\\\-11.13281\\\\78.3486\\\\277.01\\\\-13.47656\\\\78.8168\\\\277.01\\\\-15.82031\\\\79.47342\\\\277.01\\\\-18.16406\\\\80.87569\\\\277.01\\\\-20.50781\\\\81.76657\\\\277.01\\\\-22.85156\\\\83.13133\\\\277.01\\\\-25.19531\\\\83.96092\\\\277.01\\\\-27.53906\\\\85.77746\\\\277.01\\\\-29.88281\\\\87.03368\\\\277.01\\\\-32.22656\\\\88.52746\\\\277.01\\\\-34.57031\\\\90.49887\\\\277.01\\\\-36.2212\\\\91.74844\\\\277.01\\\\-39.02853\\\\94.09219\\\\277.01\\\\-41.60156\\\\96.38751\\\\277.01\\\\-43.955\\\\98.77969\\\\277.01\\\\-46.28906\\\\101.3187\\\\277.01\\\\-48.63281\\\\104.1332\\\\277.01\\\\-49.87989\\\\105.8109\\\\277.01\\\\-51.93118\\\\108.1547\\\\277.01\\\\-53.12213\\\\110.4984\\\\277.01\\\\-55.66406\\\\114.2724\\\\277.01\\\\-56.35877\\\\115.1859\\\\277.01\\\\-57.13709\\\\117.5297\\\\277.01\\\\-58.55372\\\\119.8734\\\\277.01\\\\-59.49023\\\\122.2172\\\\277.01\\\\-60.81275\\\\124.5609\\\\277.01\\\\-61.92934\\\\129.2484\\\\277.01\\\\-63.00622\\\\131.5922\\\\277.01\\\\-63.77141\\\\133.9359\\\\277.01\\\\-64.50639\\\\138.6234\\\\277.01\\\\-65.16927\\\\140.9672\\\\277.01\\\\-65.6146\\\\143.3109\\\\277.01\\\\-65.7933\\\\145.6547\\\\277.01\\\\-66.06516\\\\150.3422\\\\277.01\\\\-66.13699\\\\155.0297\\\\277.01\\\\-66.09879\\\\157.3734\\\\277.01\\\\-65.89844\\\\162.0609\\\\277.01\\\\-65.71338\\\\164.4047\\\\277.01\\\\-65.41684\\\\166.7484\\\\277.01\\\\-64.78502\\\\169.0922\\\\277.01\\\\-64.27641\\\\171.4359\\\\277.01\\\\-63.9314\\\\173.7797\\\\277.01\\\\-63.32528\\\\176.1234\\\\277.01\\\\-62.18676\\\\178.4672\\\\277.01\\\\-61.52936\\\\180.8109\\\\277.01\\\\-61.08647\\\\183.1547\\\\277.01\\\\-59.75184\\\\185.4984\\\\277.01\\\\-58.89447\\\\187.8422\\\\277.01\\\\-57.47786\\\\190.1859\\\\277.01\\\\-56.72234\\\\192.5297\\\\277.01\\\\-55.0424\\\\194.8734\\\\277.01\\\\-53.77855\\\\197.2172\\\\277.01\\\\-52.24194\\\\199.5609\\\\277.01\\\\-50.4126\\\\201.9047\\\\277.01\\\\-48.63281\\\\204.3003\\\\277.01\\\\-47.03415\\\\206.5922\\\\277.01\\\\-42.56292\\\\211.2797\\\\277.01\\\\-39.25781\\\\214.4452\\\\277.01\\\\-36.91406\\\\216.3386\\\\277.01\\\\-34.26873\\\\218.3109\\\\277.01\\\\-29.88281\\\\221.4518\\\\277.01\\\\-27.53906\\\\223.027\\\\277.01\\\\-25.19531\\\\224.3439\\\\277.01\\\\-23.14453\\\\225.3422\\\\277.01\\\\-20.50781\\\\226.7399\\\\277.01\\\\-18.16406\\\\228.2227\\\\277.01\\\\-15.82031\\\\229.069\\\\277.01\\\\-14.3044\\\\230.0297\\\\277.01\\\\-15.82031\\\\231.8656\\\\277.01\\\\-16.46402\\\\232.3734\\\\277.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"374\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-95.50781\\\\233.1042\\\\280.01\\\\-97.85156\\\\234.0105\\\\280.01\\\\-100.1953\\\\233.4044\\\\280.01\\\\-102.5391\\\\234.062\\\\280.01\\\\-104.8828\\\\233.3561\\\\280.01\\\\-109.5703\\\\234.1651\\\\280.01\\\\-111.9141\\\\234.0722\\\\280.01\\\\-116.6016\\\\234.0411\\\\280.01\\\\-121.2891\\\\234.0855\\\\280.01\\\\-128.3203\\\\234.0672\\\\280.01\\\\-135.3516\\\\234.1266\\\\280.01\\\\-140.0391\\\\234.1078\\\\280.01\\\\-142.3828\\\\234.1741\\\\280.01\\\\-149.4141\\\\234.0642\\\\280.01\\\\-156.4453\\\\234.1132\\\\280.01\\\\-163.4766\\\\234.0613\\\\280.01\\\\-165.8203\\\\234.1313\\\\280.01\\\\-168.1641\\\\234.3108\\\\280.01\\\\-177.5391\\\\234.3173\\\\280.01\\\\-182.2266\\\\234.2721\\\\280.01\\\\-186.9141\\\\234.3703\\\\280.01\\\\-191.6016\\\\234.3837\\\\280.01\\\\-198.6328\\\\234.3084\\\\280.01\\\\-200.9766\\\\234.3389\\\\280.01\\\\-208.0078\\\\234.2822\\\\280.01\\\\-217.3828\\\\234.3296\\\\280.01\\\\-219.7266\\\\234.3758\\\\280.01\\\\-229.1016\\\\234.3389\\\\280.01\\\\-233.7891\\\\234.2125\\\\280.01\\\\-240.8203\\\\234.2537\\\\280.01\\\\-243.1641\\\\234.2967\\\\280.01\\\\-247.8516\\\\234.0375\\\\280.01\\\\-250.1953\\\\234.1916\\\\280.01\\\\-252.181\\\\234.7172\\\\280.01\\\\-252.5391\\\\235.6379\\\\280.01\\\\-254.1504\\\\234.7172\\\\280.01\\\\-254.8828\\\\234.668\\\\280.01\\\\-259.5703\\\\236.2655\\\\280.01\\\\-260.5737\\\\237.0609\\\\280.01\\\\-262.3019\\\\239.4047\\\\280.01\\\\-262.5477\\\\241.7484\\\\280.01\\\\-261.5577\\\\244.0922\\\\280.01\\\\-260.8438\\\\246.4359\\\\280.01\\\\-259.5991\\\\248.7797\\\\280.01\\\\-254.8828\\\\253.9193\\\\280.01\\\\-253.2919\\\\255.8109\\\\280.01\\\\-250.1953\\\\258.8925\\\\280.01\\\\-247.8516\\\\261.4312\\\\280.01\\\\-246.2802\\\\262.8422\\\\280.01\\\\-244.138\\\\265.1859\\\\280.01\\\\-240.8203\\\\268.3534\\\\280.01\\\\-239.3737\\\\269.8734\\\\280.01\\\\-236.938\\\\272.2172\\\\280.01\\\\-233.7891\\\\275.3765\\\\280.01\\\\-231.4453\\\\277.7994\\\\280.01\\\\-229.1016\\\\279.9918\\\\280.01\\\\-226.7578\\\\282.4992\\\\280.01\\\\-225.119\\\\283.9359\\\\280.01\\\\-222.0703\\\\287.169\\\\280.01\\\\-220.4806\\\\288.6234\\\\280.01\\\\-218.2311\\\\290.9672\\\\280.01\\\\-217.3828\\\\291.613\\\\280.01\\\\-215.0391\\\\292.8596\\\\280.01\\\\-214.5047\\\\293.3109\\\\280.01\\\\-212.6953\\\\294.459\\\\280.01\\\\-210.3516\\\\295.1842\\\\280.01\\\\-208.0078\\\\296.4338\\\\280.01\\\\-205.6641\\\\296.8595\\\\280.01\\\\-203.3203\\\\297.1639\\\\280.01\\\\-196.2891\\\\297.1563\\\\280.01\\\\-193.9453\\\\297.0622\\\\280.01\\\\-184.5703\\\\296.9731\\\\280.01\\\\-172.8516\\\\296.8959\\\\280.01\\\\-165.8203\\\\296.9125\\\\280.01\\\\-161.1328\\\\296.8904\\\\280.01\\\\-156.4453\\\\296.9295\\\\280.01\\\\-144.7266\\\\296.9097\\\\280.01\\\\-137.6953\\\\296.9173\\\\280.01\\\\-125.9766\\\\296.8528\\\\280.01\\\\-118.9453\\\\296.8629\\\\280.01\\\\-116.6016\\\\296.8357\\\\280.01\\\\-109.5703\\\\296.8723\\\\280.01\\\\-102.5391\\\\296.8266\\\\280.01\\\\-93.16406\\\\296.7973\\\\280.01\\\\-76.75781\\\\296.8647\\\\280.01\\\\-72.07031\\\\296.9145\\\\280.01\\\\-67.38281\\\\296.9028\\\\280.01\\\\-65.03906\\\\296.9514\\\\280.01\\\\-60.35156\\\\296.9322\\\\280.01\\\\-55.66406\\\\296.9622\\\\280.01\\\\-53.32031\\\\296.925\\\\280.01\\\\-48.63281\\\\296.9622\\\\280.01\\\\-46.28906\\\\296.8973\\\\280.01\\\\-41.60156\\\\296.9067\\\\280.01\\\\-39.25781\\\\297.0439\\\\280.01\\\\-36.91406\\\\296.9267\\\\280.01\\\\-34.57031\\\\297.1128\\\\280.01\\\\-32.22656\\\\296.9926\\\\280.01\\\\-29.88281\\\\297.3952\\\\280.01\\\\-27.53906\\\\297.0591\\\\280.01\\\\-25.19531\\\\297.3984\\\\280.01\\\\-22.85156\\\\297.0809\\\\280.01\\\\-20.50781\\\\297.0809\\\\280.01\\\\-18.16406\\\\297.3798\\\\280.01\\\\-13.47656\\\\297.4022\\\\280.01\\\\-11.13281\\\\297.2922\\\\280.01\\\\-8.789063\\\\297.4125\\\\280.01\\\\-4.101563\\\\297.3691\\\\280.01\\\\-1.757813\\\\297.4334\\\\280.01\\\\0.5859375\\\\297.3911\\\\280.01\\\\2.929688\\\\297.106\\\\280.01\\\\5.273438\\\\297.1626\\\\280.01\\\\7.617188\\\\297.409\\\\280.01\\\\9.960938\\\\297.3879\\\\280.01\\\\12.30469\\\\296.9377\\\\280.01\\\\14.64844\\\\297.0091\\\\280.01\\\\16.99219\\\\296.9358\\\\280.01\\\\19.33594\\\\297.0362\\\\280.01\\\\21.67969\\\\296.8867\\\\280.01\\\\24.02344\\\\297.1195\\\\280.01\\\\26.36719\\\\296.8762\\\\280.01\\\\33.39844\\\\296.8961\\\\280.01\\\\42.77344\\\\296.8163\\\\280.01\\\\56.83594\\\\296.6724\\\\280.01\\\\63.86719\\\\296.6577\\\\280.01\\\\68.55469\\\\296.5859\\\\280.01\\\\70.89844\\\\296.6028\\\\280.01\\\\77.92969\\\\296.5441\\\\280.01\\\\84.96094\\\\296.549\\\\280.01\\\\96.67969\\\\296.5208\\\\280.01\\\\101.3672\\\\296.4462\\\\280.01\\\\103.7109\\\\296.4668\\\\280.01\\\\113.0859\\\\296.4189\\\\280.01\\\\122.4609\\\\296.3348\\\\280.01\\\\136.5234\\\\296.2873\\\\280.01\\\\138.8672\\\\295.8791\\\\280.01\\\\141.2109\\\\296.1963\\\\280.01\\\\145.8984\\\\295.8486\\\\280.01\\\\148.2422\\\\295.9009\\\\280.01\\\\150.5859\\\\295.8172\\\\280.01\\\\155.2734\\\\295.8791\\\\280.01\\\\162.3047\\\\295.7684\\\\280.01\\\\164.6484\\\\295.7684\\\\280.01\\\\183.3984\\\\295.557\\\\280.01\\\\192.7734\\\\295.557\\\\280.01\\\\197.4609\\\\295.8172\\\\280.01\\\\202.1484\\\\295.7516\\\\280.01\\\\204.4922\\\\295.4439\\\\280.01\\\\206.8359\\\\294.8185\\\\280.01\\\\209.1797\\\\294.3583\\\\280.01\\\\211.5234\\\\292.4108\\\\280.01\\\\213.8672\\\\291.0471\\\\280.01\\\\216.2109\\\\289.452\\\\280.01\\\\217.0839\\\\288.6234\\\\280.01\\\\218.5547\\\\286.9506\\\\280.01\\\\221.5668\\\\283.9359\\\\280.01\\\\225.5859\\\\279.7481\\\\280.01\\\\227.9297\\\\277.4546\\\\280.01\\\\230.2734\\\\274.9423\\\\280.01\\\\233.0475\\\\272.2172\\\\280.01\\\\234.9609\\\\270.1762\\\\280.01\\\\237.5903\\\\267.5297\\\\280.01\\\\242.1654\\\\262.8422\\\\280.01\\\\244.3673\\\\260.4984\\\\280.01\\\\246.773\\\\258.1547\\\\280.01\\\\249.0142\\\\255.8109\\\\280.01\\\\251.3672\\\\253.4397\\\\280.01\\\\253.7109\\\\250.8472\\\\280.01\\\\255.4546\\\\248.7797\\\\280.01\\\\257.1065\\\\246.4359\\\\280.01\\\\259.3784\\\\244.0922\\\\280.01\\\\260.9815\\\\239.4047\\\\280.01\\\\260.4452\\\\237.0609\\\\280.01\\\\259.4202\\\\234.7172\\\\280.01\\\\258.3984\\\\233.7341\\\\280.01\\\\256.0547\\\\233.1091\\\\280.01\\\\253.7109\\\\232.7821\\\\280.01\\\\251.3672\\\\232.8781\\\\280.01\\\\249.0234\\\\232.6162\\\\280.01\\\\244.3359\\\\232.7025\\\\280.01\\\\241.9922\\\\232.9379\\\\280.01\\\\237.3047\\\\233.0766\\\\280.01\\\\234.9609\\\\233.0108\\\\280.01\\\\232.6172\\\\233.0402\\\\280.01\\\\227.9297\\\\233.0108\\\\280.01\\\\225.5859\\\\233.0498\\\\280.01\\\\211.5234\\\\233.0819\\\\280.01\\\\206.8359\\\\232.9594\\\\280.01\\\\204.4922\\\\232.7588\\\\280.01\\\\202.1484\\\\232.7848\\\\280.01\\\\183.3984\\\\232.8852\\\\280.01\\\\178.7109\\\\232.8467\\\\280.01\\\\162.3047\\\\232.8003\\\\280.01\\\\159.9609\\\\232.8253\\\\280.01\\\\143.5547\\\\232.8376\\\\280.01\\\\141.2109\\\\232.7746\\\\280.01\\\\136.5234\\\\232.7975\\\\280.01\\\\131.8359\\\\232.7322\\\\280.01\\\\127.1484\\\\232.7614\\\\280.01\\\\124.8047\\\\232.721\\\\280.01\\\\120.1172\\\\232.7481\\\\280.01\\\\113.0859\\\\232.7071\\\\280.01\\\\106.0547\\\\232.721\\\\280.01\\\\103.7109\\\\232.9629\\\\280.01\\\\101.3672\\\\232.9735\\\\280.01\\\\96.67969\\\\233.0819\\\\280.01\\\\82.61719\\\\233.1001\\\\280.01\\\\77.92969\\\\233.0726\\\\280.01\\\\73.24219\\\\233.1132\\\\280.01\\\\63.86719\\\\233.1221\\\\280.01\\\\56.83594\\\\233.0951\\\\280.01\\\\47.46094\\\\233.1221\\\\280.01\\\\45.11719\\\\233.0726\\\\280.01\\\\44.1779\\\\232.3734\\\\280.01\\\\42.77344\\\\230.9901\\\\280.01\\\\42.0716\\\\230.0297\\\\280.01\\\\42.77344\\\\229.2739\\\\280.01\\\\45.11719\\\\228.632\\\\280.01\\\\47.46094\\\\227.1643\\\\280.01\\\\49.80469\\\\226.1565\\\\280.01\\\\52.14844\\\\224.6574\\\\280.01\\\\54.49219\\\\223.8228\\\\280.01\\\\56.83594\\\\221.9803\\\\280.01\\\\59.17969\\\\220.4287\\\\280.01\\\\61.52344\\\\219.0851\\\\280.01\\\\62.3638\\\\218.3109\\\\280.01\\\\66.21094\\\\215.1389\\\\280.01\\\\67.85556\\\\213.6234\\\\280.01\\\\68.55469\\\\212.8447\\\\280.01\\\\70.89844\\\\210.758\\\\280.01\\\\72.51065\\\\208.9359\\\\280.01\\\\75.58594\\\\205.632\\\\280.01\\\\78.58622\\\\201.9047\\\\280.01\\\\80.27344\\\\199.4393\\\\280.01\\\\81.50667\\\\197.2172\\\\280.01\\\\83.34528\\\\194.8734\\\\280.01\\\\84.28662\\\\192.5297\\\\280.01\\\\85.68763\\\\190.1859\\\\280.01\\\\86.60807\\\\187.8422\\\\280.01\\\\88.12763\\\\185.4984\\\\280.01\\\\88.70493\\\\183.1547\\\\280.01\\\\89.40742\\\\180.8109\\\\280.01\\\\90.42329\\\\178.4672\\\\280.01\\\\91.73814\\\\173.7797\\\\280.01\\\\92.66084\\\\171.4359\\\\280.01\\\\93.0161\\\\169.0922\\\\280.01\\\\93.30299\\\\164.4047\\\\280.01\\\\93.50073\\\\162.0609\\\\280.01\\\\93.76065\\\\157.3734\\\\280.01\\\\93.84212\\\\155.0297\\\\280.01\\\\93.83057\\\\152.6859\\\\280.01\\\\93.44278\\\\145.6547\\\\280.01\\\\92.97371\\\\138.6234\\\\280.01\\\\92.3933\\\\136.2797\\\\280.01\\\\91.39597\\\\133.9359\\\\280.01\\\\90.83705\\\\131.5922\\\\280.01\\\\90.15889\\\\129.2484\\\\280.01\\\\89.05895\\\\126.9047\\\\280.01\\\\88.55198\\\\124.5609\\\\280.01\\\\87.66837\\\\122.2172\\\\280.01\\\\86.27174\\\\119.8734\\\\280.01\\\\85.36424\\\\117.5297\\\\280.01\\\\84.03852\\\\115.1859\\\\280.01\\\\81.2221\\\\110.4984\\\\280.01\\\\80.27344\\\\109.1401\\\\280.01\\\\77.76597\\\\105.8109\\\\280.01\\\\76.17959\\\\103.4672\\\\280.01\\\\74.11412\\\\101.1234\\\\280.01\\\\71.95528\\\\98.77969\\\\280.01\\\\68.55469\\\\95.41232\\\\280.01\\\\66.21094\\\\93.31791\\\\280.01\\\\63.86719\\\\91.31586\\\\280.01\\\\61.52344\\\\89.8781\\\\280.01\\\\61.00544\\\\89.40469\\\\280.01\\\\56.83594\\\\86.32603\\\\280.01\\\\54.49219\\\\85.22374\\\\280.01\\\\53.91059\\\\84.71719\\\\280.01\\\\52.14844\\\\83.52773\\\\280.01\\\\49.80469\\\\82.67247\\\\280.01\\\\47.46094\\\\81.38185\\\\280.01\\\\45.11719\\\\80.45787\\\\280.01\\\\42.77344\\\\79.08102\\\\280.01\\\\40.42969\\\\78.68263\\\\280.01\\\\38.08594\\\\78.00113\\\\280.01\\\\35.74219\\\\76.98543\\\\280.01\\\\33.39844\\\\76.44418\\\\280.01\\\\31.05469\\\\75.99764\\\\280.01\\\\28.71094\\\\75.21002\\\\280.01\\\\26.36719\\\\74.59824\\\\280.01\\\\24.02344\\\\74.40105\\\\280.01\\\\14.64844\\\\74.0463\\\\280.01\\\\9.960938\\\\74.09591\\\\280.01\\\\5.273438\\\\74.27516\\\\280.01\\\\2.929688\\\\74.42056\\\\280.01\\\\0.5859375\\\\74.75625\\\\280.01\\\\-1.757813\\\\75.52052\\\\280.01\\\\-4.101563\\\\76.1918\\\\280.01\\\\-6.445313\\\\76.61909\\\\280.01\\\\-8.789063\\\\77.32118\\\\280.01\\\\-11.13281\\\\78.33466\\\\280.01\\\\-13.47656\\\\78.80508\\\\280.01\\\\-15.82031\\\\79.44011\\\\280.01\\\\-18.16406\\\\80.84683\\\\280.01\\\\-20.50781\\\\81.74243\\\\280.01\\\\-22.85156\\\\83.11391\\\\280.01\\\\-25.19531\\\\83.92464\\\\280.01\\\\-27.53906\\\\85.7457\\\\280.01\\\\-29.88281\\\\86.96401\\\\280.01\\\\-32.22656\\\\88.49249\\\\280.01\\\\-34.57031\\\\90.47998\\\\280.01\\\\-36.28038\\\\91.74844\\\\280.01\\\\-39.07948\\\\94.09219\\\\280.01\\\\-41.60156\\\\96.27657\\\\280.01\\\\-44.03106\\\\98.77969\\\\280.01\\\\-46.28906\\\\101.2371\\\\280.01\\\\-48.63281\\\\104.0658\\\\280.01\\\\-49.94405\\\\105.8109\\\\280.01\\\\-51.96513\\\\108.1547\\\\280.01\\\\-53.18715\\\\110.4984\\\\280.01\\\\-54.74057\\\\112.8422\\\\280.01\\\\-56.42476\\\\115.1859\\\\280.01\\\\-57.19754\\\\117.5297\\\\280.01\\\\-58.65653\\\\119.8734\\\\280.01\\\\-59.544\\\\122.2172\\\\280.01\\\\-60.8896\\\\124.5609\\\\280.01\\\\-62.0208\\\\129.2484\\\\280.01\\\\-63.12626\\\\131.5922\\\\280.01\\\\-63.84518\\\\133.9359\\\\280.01\\\\-64.19696\\\\136.2797\\\\280.01\\\\-64.66129\\\\138.6234\\\\280.01\\\\-65.33604\\\\140.9672\\\\280.01\\\\-65.68493\\\\143.3109\\\\280.01\\\\-66.13839\\\\150.3422\\\\280.01\\\\-66.21657\\\\155.0297\\\\280.01\\\\-66.17729\\\\157.3734\\\\280.01\\\\-65.96361\\\\162.0609\\\\280.01\\\\-65.54951\\\\166.7484\\\\280.01\\\\-64.3463\\\\171.4359\\\\280.01\\\\-63.998\\\\173.7797\\\\280.01\\\\-63.46595\\\\176.1234\\\\280.01\\\\-62.32813\\\\178.4672\\\\280.01\\\\-61.61405\\\\180.8109\\\\280.01\\\\-61.15642\\\\183.1547\\\\280.01\\\\-59.86389\\\\185.4984\\\\280.01\\\\-58.95148\\\\187.8422\\\\280.01\\\\-57.52841\\\\190.1859\\\\280.01\\\\-56.74625\\\\192.5297\\\\280.01\\\\-55.1036\\\\194.8734\\\\280.01\\\\-53.84033\\\\197.2172\\\\280.01\\\\-52.26687\\\\199.5609\\\\280.01\\\\-48.63281\\\\204.3615\\\\280.01\\\\-47.1009\\\\206.5922\\\\280.01\\\\-42.59905\\\\211.2797\\\\280.01\\\\-39.25781\\\\214.5093\\\\280.01\\\\-36.91406\\\\216.3794\\\\280.01\\\\-34.31858\\\\218.3109\\\\280.01\\\\-29.88281\\\\221.4737\\\\280.01\\\\-27.53906\\\\223.0821\\\\280.01\\\\-25.19531\\\\224.3511\\\\280.01\\\\-20.50781\\\\226.7643\\\\280.01\\\\-18.16406\\\\228.2682\\\\280.01\\\\-15.82031\\\\229.0908\\\\280.01\\\\-14.92839\\\\230.0297\\\\280.01\\\\-15.82031\\\\231.4137\\\\280.01\\\\-16.95631\\\\232.3734\\\\280.01\\\\-18.16406\\\\233.0537\\\\280.01\\\\-20.50781\\\\233.0951\\\\280.01\\\\-39.25781\\\\233.1397\\\\280.01\\\\-43.94531\\\\233.1221\\\\280.01\\\\-53.32031\\\\233.1736\\\\280.01\\\\-60.35156\\\\233.1736\\\\280.01\\\\-65.03906\\\\232.9735\\\\280.01\\\\-74.41406\\\\233.0441\\\\280.01\\\\-79.10156\\\\233.0145\\\\280.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"354\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0766\\\\283.01\\\\-27.53906\\\\233.1221\\\\283.01\\\\-32.22656\\\\233.1042\\\\283.01\\\\-39.25781\\\\233.1397\\\\283.01\\\\-48.63281\\\\233.131\\\\283.01\\\\-53.32031\\\\233.1652\\\\283.01\\\\-60.35156\\\\233.1652\\\\283.01\\\\-62.69531\\\\233.0576\\\\283.01\\\\-65.03906\\\\232.8497\\\\283.01\\\\-67.38281\\\\232.9304\\\\283.01\\\\-74.41406\\\\233.0245\\\\283.01\\\\-86.13281\\\\232.9942\\\\283.01\\\\-88.47656\\\\233.0479\\\\283.01\\\\-97.85156\\\\233.0992\\\\283.01\\\\-107.2266\\\\233.1132\\\\283.01\\\\-109.5703\\\\233.2337\\\\283.01\\\\-111.9141\\\\233.9859\\\\283.01\\\\-116.6016\\\\233.9503\\\\283.01\\\\-121.2891\\\\234.0035\\\\283.01\\\\-130.6641\\\\234.0088\\\\283.01\\\\-135.3516\\\\234.0855\\\\283.01\\\\-140.0391\\\\234.0722\\\\283.01\\\\-142.3828\\\\234.1266\\\\283.01\\\\-149.4141\\\\234.0211\\\\283.01\\\\-151.7578\\\\234.0591\\\\283.01\\\\-161.1328\\\\234.0243\\\\283.01\\\\-165.8203\\\\234.0691\\\\283.01\\\\-168.1641\\\\234.2175\\\\283.01\\\\-172.8516\\\\234.2252\\\\283.01\\\\-175.1953\\\\234.1797\\\\283.01\\\\-179.8828\\\\234.2112\\\\283.01\\\\-184.5703\\\\234.2869\\\\283.01\\\\-191.6016\\\\234.2721\\\\283.01\\\\-198.6328\\\\234.2187\\\\283.01\\\\-200.9766\\\\234.2902\\\\283.01\\\\-205.6641\\\\234.205\\\\283.01\\\\-210.3516\\\\234.1861\\\\283.01\\\\-212.6953\\\\234.2398\\\\283.01\\\\-219.7266\\\\234.3115\\\\283.01\\\\-229.1016\\\\234.3235\\\\283.01\\\\-233.7891\\\\234.2362\\\\283.01\\\\-236.1328\\\\234.2789\\\\283.01\\\\-243.1641\\\\234.2502\\\\283.01\\\\-247.8516\\\\233.9138\\\\283.01\\\\-250.1953\\\\234.1229\\\\283.01\\\\-254.8828\\\\234.6658\\\\283.01\\\\-257.2266\\\\235.4369\\\\283.01\\\\-259.5703\\\\236.3773\\\\283.01\\\\-260.3961\\\\237.0609\\\\283.01\\\\-262.014\\\\239.4047\\\\283.01\\\\-262.2271\\\\241.7484\\\\283.01\\\\-261.3423\\\\244.0922\\\\283.01\\\\-260.8191\\\\246.4359\\\\283.01\\\\-259.7416\\\\248.7797\\\\283.01\\\\-257.5902\\\\251.1234\\\\283.01\\\\-255.5257\\\\253.4672\\\\283.01\\\\-252.5391\\\\256.6338\\\\283.01\\\\-250.1953\\\\258.856\\\\283.01\\\\-247.8516\\\\261.3733\\\\283.01\\\\-246.2019\\\\262.8422\\\\283.01\\\\-243.1641\\\\266.1315\\\\283.01\\\\-241.6046\\\\267.5297\\\\283.01\\\\-239.419\\\\269.8734\\\\283.01\\\\-236.9491\\\\272.2172\\\\283.01\\\\-233.7891\\\\275.3661\\\\283.01\\\\-231.4453\\\\277.8091\\\\283.01\\\\-229.1016\\\\280.0036\\\\283.01\\\\-226.7578\\\\282.509\\\\283.01\\\\-225.1317\\\\283.9359\\\\283.01\\\\-222.0703\\\\287.1792\\\\283.01\\\\-220.4806\\\\288.6234\\\\283.01\\\\-218.2311\\\\290.9672\\\\283.01\\\\-217.3828\\\\291.613\\\\283.01\\\\-215.0391\\\\292.905\\\\283.01\\\\-212.6953\\\\294.4828\\\\283.01\\\\-210.3516\\\\295.2615\\\\283.01\\\\-208.0078\\\\296.4508\\\\283.01\\\\-205.6641\\\\296.8789\\\\283.01\\\\-203.3203\\\\297.1639\\\\283.01\\\\-196.2891\\\\297.1563\\\\283.01\\\\-191.6016\\\\297.023\\\\283.01\\\\-189.2578\\\\297.0306\\\\283.01\\\\-182.2266\\\\296.948\\\\283.01\\\\-172.8516\\\\296.9022\\\\283.01\\\\-158.7891\\\\296.8988\\\\283.01\\\\-147.0703\\\\296.9323\\\\283.01\\\\-142.3828\\\\296.9074\\\\283.01\\\\-133.0078\\\\296.92\\\\283.01\\\\-123.6328\\\\296.8528\\\\283.01\\\\-116.6016\\\\296.8356\\\\283.01\\\\-111.9141\\\\296.8723\\\\283.01\\\\-100.1953\\\\296.8075\\\\283.01\\\\-74.41406\\\\296.8938\\\\283.01\\\\-67.38281\\\\296.9028\\\\283.01\\\\-62.69531\\\\296.96\\\\283.01\\\\-58.00781\\\\296.9234\\\\283.01\\\\-41.60156\\\\296.9081\\\\283.01\\\\-36.91406\\\\297.0328\\\\283.01\\\\-34.57031\\\\297.3842\\\\283.01\\\\-32.22656\\\\297.1128\\\\283.01\\\\-27.53906\\\\297.3192\\\\283.01\\\\-25.19531\\\\296.9926\\\\283.01\\\\-20.50781\\\\297.1747\\\\283.01\\\\-18.16406\\\\297.3531\\\\283.01\\\\-15.82031\\\\297.4125\\\\283.01\\\\-6.445313\\\\297.4125\\\\283.01\\\\-4.101563\\\\297.257\\\\283.01\\\\-1.757813\\\\297.4229\\\\283.01\\\\9.960938\\\\297.4125\\\\283.01\\\\12.30469\\\\296.9377\\\\283.01\\\\16.99219\\\\296.9467\\\\283.01\\\\21.67969\\\\296.8877\\\\283.01\\\\33.39844\\\\296.8771\\\\283.01\\\\40.42969\\\\296.8369\\\\283.01\\\\45.11719\\\\296.7643\\\\283.01\\\\52.14844\\\\296.7021\\\\283.01\\\\56.83594\\\\296.6906\\\\283.01\\\\68.55469\\\\296.5732\\\\283.01\\\\75.58594\\\\296.5859\\\\283.01\\\\77.92969\\\\296.5441\\\\283.01\\\\84.96094\\\\296.5441\\\\283.01\\\\87.30469\\\\296.4813\\\\283.01\\\\91.99219\\\\296.5154\\\\283.01\\\\110.7422\\\\296.4051\\\\283.01\\\\117.7734\\\\296.3495\\\\283.01\\\\129.4922\\\\296.2929\\\\283.01\\\\131.8359\\\\296.3023\\\\283.01\\\\136.5234\\\\295.8486\\\\283.01\\\\143.5547\\\\295.864\\\\283.01\\\\152.9297\\\\295.8012\\\\283.01\\\\155.2734\\\\295.8486\\\\283.01\\\\164.6484\\\\295.6998\\\\283.01\\\\169.3359\\\\295.7173\\\\283.01\\\\176.3672\\\\295.5916\\\\283.01\\\\188.0859\\\\295.5235\\\\283.01\\\\192.7734\\\\295.5401\\\\283.01\\\\197.4609\\\\295.833\\\\283.01\\\\202.1484\\\\295.7516\\\\283.01\\\\204.4922\\\\295.4439\\\\283.01\\\\206.8359\\\\294.8185\\\\283.01\\\\209.1797\\\\294.3532\\\\283.01\\\\211.5234\\\\292.4178\\\\283.01\\\\213.8672\\\\291.0471\\\\283.01\\\\216.2109\\\\289.437\\\\283.01\\\\217.074\\\\288.6234\\\\283.01\\\\218.5547\\\\286.9377\\\\283.01\\\\221.5668\\\\283.9359\\\\283.01\\\\225.5859\\\\279.7481\\\\283.01\\\\227.9297\\\\277.4225\\\\283.01\\\\230.2734\\\\274.9423\\\\283.01\\\\233.014\\\\272.2172\\\\283.01\\\\234.9609\\\\270.1737\\\\283.01\\\\237.6074\\\\267.5297\\\\283.01\\\\244.4276\\\\260.4984\\\\283.01\\\\246.7938\\\\258.1547\\\\283.01\\\\251.3978\\\\253.4672\\\\283.01\\\\253.7109\\\\250.8942\\\\283.01\\\\255.4174\\\\248.7797\\\\283.01\\\\257.0561\\\\246.4359\\\\283.01\\\\259.226\\\\244.0922\\\\283.01\\\\260.0378\\\\241.7484\\\\283.01\\\\260.5957\\\\239.4047\\\\283.01\\\\260.2749\\\\237.0609\\\\283.01\\\\259.2681\\\\234.7172\\\\283.01\\\\258.3984\\\\233.8742\\\\283.01\\\\256.0547\\\\233.2096\\\\283.01\\\\253.7109\\\\232.7947\\\\283.01\\\\251.3672\\\\232.6745\\\\283.01\\\\246.6797\\\\232.7162\\\\283.01\\\\244.3359\\\\232.6725\\\\283.01\\\\241.9922\\\\232.927\\\\283.01\\\\239.6484\\\\233.0007\\\\283.01\\\\230.2734\\\\233.0007\\\\283.01\\\\216.2109\\\\233.0819\\\\283.01\\\\209.1797\\\\233.0726\\\\283.01\\\\206.8359\\\\232.9839\\\\283.01\\\\204.4922\\\\232.7588\\\\283.01\\\\199.8047\\\\232.7719\\\\283.01\\\\195.1172\\\\232.8346\\\\283.01\\\\185.7422\\\\232.8346\\\\283.01\\\\183.3984\\\\232.8617\\\\283.01\\\\176.3672\\\\232.8224\\\\283.01\\\\174.0234\\\\232.8497\\\\283.01\\\\162.3047\\\\232.8003\\\\283.01\\\\159.9609\\\\232.8376\\\\283.01\\\\155.2734\\\\232.8253\\\\283.01\\\\145.8984\\\\232.8497\\\\283.01\\\\138.8672\\\\232.7588\\\\283.01\\\\136.5234\\\\232.7975\\\\283.01\\\\131.8359\\\\232.7456\\\\283.01\\\\122.4609\\\\232.7746\\\\283.01\\\\117.7734\\\\232.7186\\\\283.01\\\\106.0547\\\\232.721\\\\283.01\\\\103.7109\\\\232.9735\\\\283.01\\\\101.3672\\\\232.9735\\\\283.01\\\\99.02344\\\\233.0766\\\\283.01\\\\89.64844\\\\233.0726\\\\283.01\\\\82.61719\\\\233.1091\\\\283.01\\\\77.92969\\\\233.0766\\\\283.01\\\\75.58594\\\\233.1042\\\\283.01\\\\63.86719\\\\233.131\\\\283.01\\\\56.83594\\\\233.1042\\\\283.01\\\\54.49219\\\\233.131\\\\283.01\\\\45.11719\\\\233.0726\\\\283.01\\\\44.18501\\\\232.3734\\\\283.01\\\\42.77344\\\\230.9932\\\\283.01\\\\42.06263\\\\230.0297\\\\283.01\\\\42.77344\\\\229.2645\\\\283.01\\\\45.11719\\\\228.6247\\\\283.01\\\\47.46094\\\\227.1533\\\\283.01\\\\49.80469\\\\226.1347\\\\283.01\\\\52.14844\\\\224.6675\\\\283.01\\\\54.49219\\\\223.8092\\\\283.01\\\\56.83594\\\\221.9546\\\\283.01\\\\59.17969\\\\220.3699\\\\283.01\\\\61.52344\\\\219.056\\\\283.01\\\\62.3228\\\\218.3109\\\\283.01\\\\66.21094\\\\215.1232\\\\283.01\\\\67.84627\\\\213.6234\\\\283.01\\\\68.55469\\\\212.8298\\\\283.01\\\\70.89844\\\\210.6976\\\\283.01\\\\74.68501\\\\206.5922\\\\283.01\\\\76.71939\\\\204.2484\\\\283.01\\\\78.54079\\\\201.9047\\\\283.01\\\\80.27344\\\\199.3159\\\\283.01\\\\81.47583\\\\197.2172\\\\283.01\\\\83.28172\\\\194.8734\\\\283.01\\\\84.25013\\\\192.5297\\\\283.01\\\\85.65463\\\\190.1859\\\\283.01\\\\86.55134\\\\187.8422\\\\283.01\\\\88.09267\\\\185.4984\\\\283.01\\\\89.37801\\\\180.8109\\\\283.01\\\\90.42329\\\\178.4672\\\\283.01\\\\91.70932\\\\173.7797\\\\283.01\\\\92.6346\\\\171.4359\\\\283.01\\\\93.02129\\\\169.0922\\\\283.01\\\\93.30979\\\\164.4047\\\\283.01\\\\93.6478\\\\159.7172\\\\283.01\\\\93.86867\\\\155.0297\\\\283.01\\\\93.75715\\\\150.3422\\\\283.01\\\\93.46669\\\\145.6547\\\\283.01\\\\93.27223\\\\143.3109\\\\283.01\\\\92.9856\\\\138.6234\\\\283.01\\\\92.43455\\\\136.2797\\\\283.01\\\\91.41665\\\\133.9359\\\\283.01\\\\90.85938\\\\131.5922\\\\283.01\\\\90.19202\\\\129.2484\\\\283.01\\\\89.08047\\\\126.9047\\\\283.01\\\\88.56892\\\\124.5609\\\\283.01\\\\87.69531\\\\122.2172\\\\283.01\\\\86.27174\\\\119.8734\\\\283.01\\\\85.33871\\\\117.5297\\\\283.01\\\\84.03852\\\\115.1859\\\\283.01\\\\81.2221\\\\110.4984\\\\283.01\\\\80.27344\\\\109.1604\\\\283.01\\\\77.73295\\\\105.8109\\\\283.01\\\\76.16416\\\\103.4672\\\\283.01\\\\74.09638\\\\101.1234\\\\283.01\\\\71.9184\\\\98.77969\\\\283.01\\\\68.55469\\\\95.4427\\\\283.01\\\\66.21094\\\\93.35094\\\\283.01\\\\63.86719\\\\91.35781\\\\283.01\\\\61.52344\\\\89.90582\\\\283.01\\\\59.17969\\\\88.0407\\\\283.01\\\\56.83594\\\\86.3728\\\\283.01\\\\54.49219\\\\85.23886\\\\283.01\\\\52.14844\\\\83.56911\\\\283.01\\\\49.80469\\\\82.70029\\\\283.01\\\\47.46094\\\\81.4009\\\\283.01\\\\45.11719\\\\80.45787\\\\283.01\\\\42.77344\\\\79.09343\\\\283.01\\\\40.42969\\\\78.69472\\\\283.01\\\\38.08594\\\\78.00113\\\\283.01\\\\35.74219\\\\77.01344\\\\283.01\\\\33.39844\\\\76.44418\\\\283.01\\\\31.05469\\\\76.01651\\\\283.01\\\\28.71094\\\\75.22678\\\\283.01\\\\26.36719\\\\74.61642\\\\283.01\\\\24.02344\\\\74.40105\\\\283.01\\\\14.64844\\\\74.05312\\\\283.01\\\\9.960938\\\\74.09591\\\\283.01\\\\2.929688\\\\74.41573\\\\283.01\\\\0.5859375\\\\74.74547\\\\283.01\\\\-4.101563\\\\76.1767\\\\283.01\\\\-6.445313\\\\76.62514\\\\283.01\\\\-8.789063\\\\77.27011\\\\283.01\\\\-11.13281\\\\78.3245\\\\283.01\\\\-13.47656\\\\78.80508\\\\283.01\\\\-15.82031\\\\79.42928\\\\283.01\\\\-18.16406\\\\80.84683\\\\283.01\\\\-20.50781\\\\81.73235\\\\283.01\\\\-22.85156\\\\83.10505\\\\283.01\\\\-25.19531\\\\83.8896\\\\283.01\\\\-27.53906\\\\85.73323\\\\283.01\\\\-29.88281\\\\86.93073\\\\283.01\\\\-32.22656\\\\88.45541\\\\283.01\\\\-34.57031\\\\90.46002\\\\283.01\\\\-36.32372\\\\91.74844\\\\283.01\\\\-41.60156\\\\96.22536\\\\283.01\\\\-44.08482\\\\98.77969\\\\283.01\\\\-46.28906\\\\101.1685\\\\283.01\\\\-48.63281\\\\104.0022\\\\283.01\\\\-49.98205\\\\105.8109\\\\283.01\\\\-51.99305\\\\108.1547\\\\283.01\\\\-53.27454\\\\110.4984\\\\283.01\\\\-54.77706\\\\112.8422\\\\283.01\\\\-56.46552\\\\115.1859\\\\283.01\\\\-57.23792\\\\117.5297\\\\283.01\\\\-58.69997\\\\119.8734\\\\283.01\\\\-59.59329\\\\122.2172\\\\283.01\\\\-60.93391\\\\124.5609\\\\283.01\\\\-61.45277\\\\126.9047\\\\283.01\\\\-62.0745\\\\129.2484\\\\283.01\\\\-63.20891\\\\131.5922\\\\283.01\\\\-63.89457\\\\133.9359\\\\283.01\\\\-64.2122\\\\136.2797\\\\283.01\\\\-64.74208\\\\138.6234\\\\283.01\\\\-65.41684\\\\140.9672\\\\283.01\\\\-65.71338\\\\143.3109\\\\283.01\\\\-66.04911\\\\147.9984\\\\283.01\\\\-66.25537\\\\152.6859\\\\283.01\\\\-66.28944\\\\155.0297\\\\283.01\\\\-66.13839\\\\159.7172\\\\283.01\\\\-65.84704\\\\164.4047\\\\283.01\\\\-65.6146\\\\166.7484\\\\283.01\\\\-65.16927\\\\169.0922\\\\283.01\\\\-64.43269\\\\171.4359\\\\283.01\\\\-64.04324\\\\173.7797\\\\283.01\\\\-63.56812\\\\176.1234\\\\283.01\\\\-62.48605\\\\178.4672\\\\283.01\\\\-61.66916\\\\180.8109\\\\283.01\\\\-61.23355\\\\183.1547\\\\283.01\\\\-60\\\\185.4984\\\\283.01\\\\-59.02929\\\\187.8422\\\\283.01\\\\-57.57813\\\\190.1859\\\\283.01\\\\-56.76455\\\\192.5297\\\\283.01\\\\-55.16396\\\\194.8734\\\\283.01\\\\-53.87801\\\\197.2172\\\\283.01\\\\-52.31674\\\\199.5609\\\\283.01\\\\-48.63281\\\\204.4387\\\\283.01\\\\-47.14196\\\\206.5922\\\\283.01\\\\-42.63475\\\\211.2797\\\\283.01\\\\-39.25781\\\\214.554\\\\283.01\\\\-36.91406\\\\216.4344\\\\283.01\\\\-32.22656\\\\219.8671\\\\283.01\\\\-27.53906\\\\223.0999\\\\283.01\\\\-23.31792\\\\225.3422\\\\283.01\\\\-22.85156\\\\225.6686\\\\283.01\\\\-20.50781\\\\226.7934\\\\283.01\\\\-18.16406\\\\228.3114\\\\283.01\\\\-15.82031\\\\229.1045\\\\283.01\\\\-14.9365\\\\230.0297\\\\283.01\\\\-15.82031\\\\231.4054\\\\283.01\\\\-16.93359\\\\232.3734\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"351\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0766\\\\286.01\\\\-60.35156\\\\233.1818\\\\286.01\\\\-62.69531\\\\233.0766\\\\286.01\\\\-65.03906\\\\232.8253\\\\286.01\\\\-69.72656\\\\232.9942\\\\286.01\\\\-83.78906\\\\233.0441\\\\286.01\\\\-95.50781\\\\233.0671\\\\286.01\\\\-97.85156\\\\233.3067\\\\286.01\\\\-100.1953\\\\233.6324\\\\286.01\\\\-102.5391\\\\233.4044\\\\286.01\\\\-107.2266\\\\233.1842\\\\286.01\\\\-109.5703\\\\233.2251\\\\286.01\\\\-111.9141\\\\233.9738\\\\286.01\\\\-114.2578\\\\233.8765\\\\286.01\\\\-116.6016\\\\233.6229\\\\286.01\\\\-118.9453\\\\233.9675\\\\286.01\\\\-130.6641\\\\233.9967\\\\286.01\\\\-133.0078\\\\234.0855\\\\286.01\\\\-137.6953\\\\234.0855\\\\286.01\\\\-142.3828\\\\234.1551\\\\286.01\\\\-144.7266\\\\234.0941\\\\286.01\\\\-154.1016\\\\234.0642\\\\286.01\\\\-158.7891\\\\234.0999\\\\286.01\\\\-165.8203\\\\234.0642\\\\286.01\\\\-168.1641\\\\234.2429\\\\286.01\\\\-175.1953\\\\234.2112\\\\286.01\\\\-182.2266\\\\234.2686\\\\286.01\\\\-184.5703\\\\234.3486\\\\286.01\\\\-196.2891\\\\234.2902\\\\286.01\\\\-198.6328\\\\234.2467\\\\286.01\\\\-203.3203\\\\234.2935\\\\286.01\\\\-210.3516\\\\234.2224\\\\286.01\\\\-217.3828\\\\234.3115\\\\286.01\\\\-226.7578\\\\234.3891\\\\286.01\\\\-233.7891\\\\234.2362\\\\286.01\\\\-236.1328\\\\234.3235\\\\286.01\\\\-238.4766\\\\234.2502\\\\286.01\\\\-243.1641\\\\234.2088\\\\286.01\\\\-247.8516\\\\233.9638\\\\286.01\\\\-252.5391\\\\234.2967\\\\286.01\\\\-254.8828\\\\234.7444\\\\286.01\\\\-257.2266\\\\235.601\\\\286.01\\\\-259.5802\\\\237.0609\\\\286.01\\\\-261.0486\\\\239.4047\\\\286.01\\\\-261.1572\\\\241.7484\\\\286.01\\\\-260.2748\\\\246.4359\\\\286.01\\\\-257.2359\\\\251.1234\\\\286.01\\\\-255.457\\\\253.4672\\\\286.01\\\\-250.6794\\\\258.1547\\\\286.01\\\\-248.6664\\\\260.4984\\\\286.01\\\\-245.5078\\\\263.4952\\\\286.01\\\\-244.041\\\\265.1859\\\\286.01\\\\-241.534\\\\267.5297\\\\286.01\\\\-239.4093\\\\269.8734\\\\286.01\\\\-236.9663\\\\272.2172\\\\286.01\\\\-233.7891\\\\275.371\\\\286.01\\\\-231.4453\\\\277.8091\\\\286.01\\\\-229.8568\\\\279.2484\\\\286.01\\\\-226.7578\\\\282.5186\\\\286.01\\\\-225.1317\\\\283.9359\\\\286.01\\\\-222.0703\\\\287.1792\\\\286.01\\\\-220.4928\\\\288.6234\\\\286.01\\\\-218.2422\\\\290.9672\\\\286.01\\\\-217.3828\\\\291.6227\\\\286.01\\\\-215.0391\\\\292.9462\\\\286.01\\\\-212.6953\\\\294.5394\\\\286.01\\\\-210.3516\\\\295.2875\\\\286.01\\\\-208.0078\\\\296.4592\\\\286.01\\\\-205.6641\\\\296.8852\\\\286.01\\\\-203.3203\\\\297.1639\\\\286.01\\\\-196.2891\\\\297.1563\\\\286.01\\\\-193.9453\\\\297.0926\\\\286.01\\\\-179.8828\\\\296.943\\\\286.01\\\\-165.8203\\\\296.8959\\\\286.01\\\\-156.4453\\\\296.9137\\\\286.01\\\\-151.7578\\\\296.9559\\\\286.01\\\\-149.4141\\\\296.9249\\\\286.01\\\\-137.6953\\\\296.9338\\\\286.01\\\\-125.9766\\\\296.9228\\\\286.01\\\\-114.2578\\\\296.8545\\\\286.01\\\\-111.9141\\\\296.8917\\\\286.01\\\\-100.1953\\\\296.8456\\\\286.01\\\\-93.16406\\\\296.8549\\\\286.01\\\\-83.78906\\\\296.9041\\\\286.01\\\\-81.44531\\\\296.8837\\\\286.01\\\\-74.41406\\\\296.9322\\\\286.01\\\\-67.38281\\\\296.9234\\\\286.01\\\\-65.03906\\\\296.9706\\\\286.01\\\\-50.97656\\\\296.9358\\\\286.01\\\\-48.63281\\\\297.048\\\\286.01\\\\-46.28906\\\\296.9267\\\\286.01\\\\-43.94531\\\\297.0552\\\\286.01\\\\-41.60156\\\\296.9396\\\\286.01\\\\-39.25781\\\\296.9191\\\\286.01\\\\-36.91406\\\\297.4229\\\\286.01\\\\-34.57031\\\\297.3212\\\\286.01\\\\-29.88281\\\\297.409\\\\286.01\\\\-25.19531\\\\297.1687\\\\286.01\\\\-22.85156\\\\297.4125\\\\286.01\\\\-11.13281\\\\297.4441\\\\286.01\\\\-6.445313\\\\297.4125\\\\286.01\\\\0.5859375\\\\297.4229\\\\286.01\\\\2.929688\\\\297.3586\\\\286.01\\\\5.273438\\\\297.4334\\\\286.01\\\\9.960938\\\\297.3911\\\\286.01\\\\12.30469\\\\296.9467\\\\286.01\\\\14.64844\\\\296.9899\\\\286.01\\\\19.33594\\\\296.8973\\\\286.01\\\\33.39844\\\\296.8867\\\\286.01\\\\38.08594\\\\296.8666\\\\286.01\\\\49.80469\\\\296.7436\\\\286.01\\\\52.14844\\\\296.6929\\\\286.01\\\\59.17969\\\\296.6906\\\\286.01\\\\61.52344\\\\296.6365\\\\286.01\\\\66.21094\\\\296.6454\\\\286.01\\\\80.27344\\\\296.5362\\\\286.01\\\\82.61719\\\\296.5521\\\\286.01\\\\87.30469\\\\296.4947\\\\286.01\\\\89.64844\\\\296.5284\\\\286.01\\\\99.02344\\\\296.506\\\\286.01\\\\108.3984\\\\296.3986\\\\286.01\\\\115.4297\\\\296.4117\\\\286.01\\\\117.7734\\\\296.3557\\\\286.01\\\\129.4922\\\\296.3023\\\\286.01\\\\131.8359\\\\296.3139\\\\286.01\\\\136.5234\\\\295.833\\\\286.01\\\\141.2109\\\\295.8172\\\\286.01\\\\143.5547\\\\295.9179\\\\286.01\\\\145.8984\\\\295.864\\\\286.01\\\\152.9297\\\\295.8012\\\\286.01\\\\155.2734\\\\295.8486\\\\286.01\\\\157.6172\\\\295.7516\\\\286.01\\\\162.3047\\\\295.7346\\\\286.01\\\\164.6484\\\\295.6819\\\\286.01\\\\169.3359\\\\295.6998\\\\286.01\\\\181.0547\\\\295.5401\\\\286.01\\\\185.7422\\\\295.5071\\\\286.01\\\\192.7734\\\\295.5401\\\\286.01\\\\197.4609\\\\295.8012\\\\286.01\\\\202.1484\\\\295.7516\\\\286.01\\\\204.4922\\\\295.4287\\\\286.01\\\\206.8359\\\\294.8107\\\\286.01\\\\209.1797\\\\294.347\\\\286.01\\\\211.5234\\\\292.432\\\\286.01\\\\213.8672\\\\291.0641\\\\286.01\\\\216.2109\\\\289.4511\\\\286.01\\\\217.0997\\\\288.6234\\\\286.01\\\\219.2182\\\\286.2797\\\\286.01\\\\221.6202\\\\283.9359\\\\286.01\\\\225.5859\\\\279.7662\\\\286.01\\\\227.9297\\\\277.4504\\\\286.01\\\\230.2734\\\\274.9912\\\\286.01\\\\233.0769\\\\272.2172\\\\286.01\\\\234.9609\\\\270.226\\\\286.01\\\\237.6601\\\\267.5297\\\\286.01\\\\241.9922\\\\263.0508\\\\286.01\\\\246.6797\\\\258.3049\\\\286.01\\\\249.209\\\\255.8109\\\\286.01\\\\251.3672\\\\253.4207\\\\286.01\\\\253.1321\\\\251.1234\\\\286.01\\\\255.0749\\\\248.7797\\\\286.01\\\\256.5535\\\\246.4359\\\\286.01\\\\257.7698\\\\244.0922\\\\286.01\\\\259.3152\\\\241.7484\\\\286.01\\\\259.6588\\\\239.4047\\\\286.01\\\\259.5052\\\\237.0609\\\\286.01\\\\257.4836\\\\234.7172\\\\286.01\\\\256.0547\\\\233.5391\\\\286.01\\\\253.7109\\\\232.9048\\\\286.01\\\\251.3672\\\\232.5688\\\\286.01\\\\249.0234\\\\232.7431\\\\286.01\\\\246.6797\\\\232.7947\\\\286.01\\\\244.3359\\\\232.7162\\\\286.01\\\\239.6484\\\\233.0007\\\\286.01\\\\232.6172\\\\233.0108\\\\286.01\\\\230.2734\\\\232.9699\\\\286.01\\\\220.8984\\\\233.0726\\\\286.01\\\\211.5234\\\\233.091\\\\286.01\\\\206.8359\\\\233.0044\\\\286.01\\\\204.4922\\\\232.7719\\\\286.01\\\\199.8047\\\\232.7456\\\\286.01\\\\195.1172\\\\232.8346\\\\286.01\\\\190.4297\\\\232.8586\\\\286.01\\\\181.0547\\\\232.8224\\\\286.01\\\\171.6797\\\\232.8346\\\\286.01\\\\166.9922\\\\232.81\\\\286.01\\\\159.9609\\\\232.8376\\\\286.01\\\\155.2734\\\\232.8129\\\\286.01\\\\150.5859\\\\232.8376\\\\286.01\\\\143.5547\\\\232.8253\\\\286.01\\\\138.8672\\\\232.7456\\\\286.01\\\\131.8359\\\\232.7048\\\\286.01\\\\127.1484\\\\232.7614\\\\286.01\\\\117.7734\\\\232.7048\\\\286.01\\\\113.0859\\\\232.721\\\\286.01\\\\108.3984\\\\232.6767\\\\286.01\\\\106.0547\\\\232.5873\\\\286.01\\\\103.7109\\\\232.8967\\\\286.01\\\\101.3672\\\\232.9081\\\\286.01\\\\99.02344\\\\233.0951\\\\286.01\\\\89.64844\\\\233.0819\\\\286.01\\\\80.27344\\\\233.1132\\\\286.01\\\\77.92969\\\\233.0819\\\\286.01\\\\73.24219\\\\233.1221\\\\286.01\\\\63.86719\\\\233.1397\\\\286.01\\\\47.46094\\\\233.1042\\\\286.01\\\\45.11719\\\\233.0859\\\\286.01\\\\44.1744\\\\232.3734\\\\286.01\\\\42.77344\\\\230.9829\\\\286.01\\\\42.0716\\\\230.0297\\\\286.01\\\\42.77344\\\\229.2739\\\\286.01\\\\45.11719\\\\228.6098\\\\286.01\\\\47.46094\\\\227.1533\\\\286.01\\\\49.80469\\\\226.1119\\\\286.01\\\\52.14844\\\\224.628\\\\286.01\\\\54.49219\\\\223.8002\\\\286.01\\\\56.83594\\\\221.9418\\\\286.01\\\\59.17969\\\\220.3256\\\\286.01\\\\61.52344\\\\219.017\\\\286.01\\\\62.28633\\\\218.3109\\\\286.01\\\\66.21094\\\\215.1155\\\\286.01\\\\67.83708\\\\213.6234\\\\286.01\\\\68.55469\\\\212.8201\\\\286.01\\\\70.89844\\\\210.637\\\\286.01\\\\73.24219\\\\208.133\\\\286.01\\\\76.6862\\\\204.2484\\\\286.01\\\\78.48246\\\\201.9047\\\\286.01\\\\80.27344\\\\199.2337\\\\286.01\\\\81.43317\\\\197.2172\\\\286.01\\\\83.23588\\\\194.8734\\\\286.01\\\\84.22379\\\\192.5297\\\\286.01\\\\85.618\\\\190.1859\\\\286.01\\\\86.50858\\\\187.8422\\\\286.01\\\\88.05106\\\\185.4984\\\\286.01\\\\89.46748\\\\180.8109\\\\286.01\\\\90.44455\\\\178.4672\\\\286.01\\\\91.72363\\\\173.7797\\\\286.01\\\\92.65485\\\\171.4359\\\\286.01\\\\93.02794\\\\169.0922\\\\286.01\\\\93.30979\\\\164.4047\\\\286.01\\\\93.66728\\\\159.7172\\\\286.01\\\\93.85384\\\\155.0297\\\\286.01\\\\93.76065\\\\150.3422\\\\286.01\\\\93.25375\\\\143.3109\\\\286.01\\\\92.96676\\\\138.6234\\\\286.01\\\\92.39601\\\\136.2797\\\\286.01\\\\91.37577\\\\133.9359\\\\286.01\\\\90.82589\\\\131.5922\\\\286.01\\\\90.13611\\\\129.2484\\\\286.01\\\\89.05535\\\\126.9047\\\\286.01\\\\88.54037\\\\124.5609\\\\286.01\\\\87.64068\\\\122.2172\\\\286.01\\\\86.2421\\\\119.8734\\\\286.01\\\\85.29913\\\\117.5297\\\\286.01\\\\84.01531\\\\115.1859\\\\286.01\\\\81.1849\\\\110.4984\\\\286.01\\\\77.92969\\\\106.097\\\\286.01\\\\76.125\\\\103.4672\\\\286.01\\\\71.88107\\\\98.77969\\\\286.01\\\\68.55469\\\\95.47974\\\\286.01\\\\63.86719\\\\91.39851\\\\286.01\\\\61.52344\\\\89.95306\\\\286.01\\\\59.17969\\\\88.07359\\\\286.01\\\\56.83594\\\\86.40219\\\\286.01\\\\54.49219\\\\85.2847\\\\286.01\\\\52.14844\\\\83.56911\\\\286.01\\\\49.80469\\\\82.75372\\\\286.01\\\\47.46094\\\\81.42015\\\\286.01\\\\45.11719\\\\80.50576\\\\286.01\\\\42.77344\\\\79.10091\\\\286.01\\\\40.42969\\\\78.70156\\\\286.01\\\\38.08594\\\\78.04225\\\\286.01\\\\35.74219\\\\77.04612\\\\286.01\\\\33.39844\\\\76.45493\\\\286.01\\\\31.05469\\\\76.03495\\\\286.01\\\\28.71094\\\\75.26105\\\\286.01\\\\26.36719\\\\74.62567\\\\286.01\\\\24.02344\\\\74.40835\\\\286.01\\\\16.99219\\\\74.11594\\\\286.01\\\\14.64844\\\\74.06655\\\\286.01\\\\9.960938\\\\74.10896\\\\286.01\\\\2.929688\\\\74.40835\\\\286.01\\\\0.5859375\\\\74.73109\\\\286.01\\\\-4.101563\\\\76.15349\\\\286.01\\\\-6.445313\\\\76.61499\\\\286.01\\\\-8.789063\\\\77.28263\\\\286.01\\\\-11.13281\\\\78.30383\\\\286.01\\\\-13.47656\\\\78.80508\\\\286.01\\\\-15.82031\\\\79.40802\\\\286.01\\\\-18.16406\\\\80.83015\\\\286.01\\\\-20.50781\\\\81.71255\\\\286.01\\\\-22.85156\\\\83.07788\\\\286.01\\\\-25.19531\\\\83.8896\\\\286.01\\\\-27.53906\\\\85.7117\\\\286.01\\\\-29.88281\\\\86.86703\\\\286.01\\\\-32.22656\\\\88.43999\\\\286.01\\\\-34.57031\\\\90.43253\\\\286.01\\\\-36.39626\\\\91.74844\\\\286.01\\\\-41.60156\\\\96.15862\\\\286.01\\\\-44.13608\\\\98.77969\\\\286.01\\\\-46.29859\\\\101.1234\\\\286.01\\\\-48.63281\\\\103.9307\\\\286.01\\\\-50.00961\\\\105.8109\\\\286.01\\\\-52.01322\\\\108.1547\\\\286.01\\\\-53.32031\\\\110.4421\\\\286.01\\\\-54.80162\\\\112.8422\\\\286.01\\\\-56.5049\\\\115.1859\\\\286.01\\\\-57.25154\\\\117.5297\\\\286.01\\\\-58.74689\\\\119.8734\\\\286.01\\\\-59.61914\\\\122.2172\\\\286.01\\\\-60.97609\\\\124.5609\\\\286.01\\\\-61.4707\\\\126.9047\\\\286.01\\\\-62.12735\\\\129.2484\\\\286.01\\\\-63.28823\\\\131.5922\\\\286.01\\\\-63.93199\\\\133.9359\\\\286.01\\\\-64.24364\\\\136.2797\\\\286.01\\\\-65.46725\\\\140.9672\\\\286.01\\\\-65.92946\\\\145.6547\\\\286.01\\\\-66.21094\\\\150.3422\\\\286.01\\\\-66.32308\\\\155.0297\\\\286.01\\\\-66.18277\\\\159.7172\\\\286.01\\\\-65.88306\\\\164.4047\\\\286.01\\\\-65.65548\\\\166.7484\\\\286.01\\\\-65.26347\\\\169.0922\\\\286.01\\\\-64.4847\\\\171.4359\\\\286.01\\\\-63.62205\\\\176.1234\\\\286.01\\\\-62.61541\\\\178.4672\\\\286.01\\\\-61.71265\\\\180.8109\\\\286.01\\\\-61.26099\\\\183.1547\\\\286.01\\\\-60.12716\\\\185.4984\\\\286.01\\\\-59.11038\\\\187.8422\\\\286.01\\\\-57.65788\\\\190.1859\\\\286.01\\\\-56.79988\\\\192.5297\\\\286.01\\\\-55.26563\\\\194.8734\\\\286.01\\\\-53.9098\\\\197.2172\\\\286.01\\\\-52.35414\\\\199.5609\\\\286.01\\\\-50.58594\\\\201.9047\\\\286.01\\\\-47.18681\\\\206.5922\\\\286.01\\\\-42.69849\\\\211.2797\\\\286.01\\\\-39.25781\\\\214.6135\\\\286.01\\\\-34.48792\\\\218.3109\\\\286.01\\\\-29.88281\\\\221.5676\\\\286.01\\\\-27.53906\\\\223.1529\\\\286.01\\\\-23.37105\\\\225.3422\\\\286.01\\\\-22.85156\\\\225.6946\\\\286.01\\\\-20.50781\\\\226.8241\\\\286.01\\\\-18.16406\\\\228.3425\\\\286.01\\\\-15.82031\\\\229.1045\\\\286.01\\\\-14.9365\\\\230.0297\\\\286.01\\\\-15.82031\\\\231.4054\\\\286.01\\\\-16.93359\\\\232.3734\\\\286.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n"; +const char* k_rtStruct_json02 = +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"364\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"45.11719\\\\233.0859\\\\289.01\\\\44.16001\\\\232.3734\\\\289.01\\\\42.77344\\\\231.028\\\\289.01\\\\42.04498\\\\230.0297\\\\289.01\\\\42.77344\\\\229.2462\\\\289.01\\\\45.11719\\\\228.6173\\\\289.01\\\\47.46094\\\\227.1104\\\\289.01\\\\49.80469\\\\226.098\\\\289.01\\\\52.14844\\\\224.6141\\\\289.01\\\\54.49219\\\\223.7681\\\\289.01\\\\56.83594\\\\221.9221\\\\289.01\\\\59.17969\\\\220.2719\\\\289.01\\\\61.52344\\\\218.9816\\\\289.01\\\\62.24398\\\\218.3109\\\\289.01\\\\66.21094\\\\215.1002\\\\289.01\\\\67.80134\\\\213.6234\\\\289.01\\\\68.55469\\\\212.7718\\\\289.01\\\\70.89844\\\\210.6111\\\\289.01\\\\74.61816\\\\206.5922\\\\289.01\\\\76.64589\\\\204.2484\\\\289.01\\\\78.44145\\\\201.9047\\\\289.01\\\\80.27344\\\\199.1565\\\\289.01\\\\81.39723\\\\197.2172\\\\289.01\\\\83.19193\\\\194.8734\\\\289.01\\\\84.19829\\\\192.5297\\\\289.01\\\\85.55715\\\\190.1859\\\\289.01\\\\86.47488\\\\187.8422\\\\289.01\\\\87.98352\\\\185.4984\\\\289.01\\\\89.43614\\\\180.8109\\\\289.01\\\\90.43185\\\\178.4672\\\\289.01\\\\91.66755\\\\173.7797\\\\289.01\\\\92.6346\\\\171.4359\\\\289.01\\\\93.0094\\\\169.0922\\\\289.01\\\\93.45066\\\\162.0609\\\\289.01\\\\93.64378\\\\159.7172\\\\289.01\\\\93.74645\\\\157.3734\\\\289.01\\\\93.7934\\\\152.6859\\\\289.01\\\\93.7114\\\\150.3422\\\\289.01\\\\92.93333\\\\138.6234\\\\289.01\\\\92.32584\\\\136.2797\\\\289.01\\\\91.33673\\\\133.9359\\\\289.01\\\\90.79788\\\\131.5922\\\\289.01\\\\90.07662\\\\129.2484\\\\289.01\\\\89.01367\\\\126.9047\\\\289.01\\\\88.51154\\\\124.5609\\\\289.01\\\\87.5829\\\\122.2172\\\\289.01\\\\86.21134\\\\119.8734\\\\289.01\\\\85.2438\\\\117.5297\\\\289.01\\\\83.98051\\\\115.1859\\\\289.01\\\\82.44851\\\\112.8422\\\\289.01\\\\81.15704\\\\110.4984\\\\289.01\\\\77.92969\\\\106.1652\\\\289.01\\\\77.60783\\\\105.8109\\\\289.01\\\\76.08817\\\\103.4672\\\\289.01\\\\71.85195\\\\98.77969\\\\289.01\\\\68.55469\\\\95.5261\\\\289.01\\\\63.86719\\\\91.42658\\\\289.01\\\\61.52344\\\\90.00546\\\\289.01\\\\59.17969\\\\88.09907\\\\289.01\\\\56.83594\\\\86.42617\\\\289.01\\\\54.49219\\\\85.32829\\\\289.01\\\\52.14844\\\\83.5929\\\\289.01\\\\49.80469\\\\82.79196\\\\289.01\\\\47.46094\\\\81.4396\\\\289.01\\\\45.11719\\\\80.55132\\\\289.01\\\\42.77344\\\\79.11613\\\\289.01\\\\40.42969\\\\78.70156\\\\289.01\\\\38.08594\\\\78.06875\\\\289.01\\\\35.74219\\\\77.06593\\\\289.01\\\\33.39844\\\\76.46006\\\\289.01\\\\31.05469\\\\76.05299\\\\289.01\\\\28.71094\\\\75.29677\\\\289.01\\\\26.36719\\\\74.63503\\\\289.01\\\\24.02344\\\\74.42056\\\\289.01\\\\16.99219\\\\74.12224\\\\289.01\\\\12.30469\\\\74.05988\\\\289.01\\\\7.617188\\\\74.17641\\\\289.01\\\\2.929688\\\\74.40835\\\\289.01\\\\0.5859375\\\\74.69978\\\\289.01\\\\-4.101563\\\\76.1376\\\\289.01\\\\-6.445313\\\\76.582\\\\289.01\\\\-8.789063\\\\77.28263\\\\289.01\\\\-11.13281\\\\78.30383\\\\289.01\\\\-13.47656\\\\78.79336\\\\289.01\\\\-15.82031\\\\79.36918\\\\289.01\\\\-18.16406\\\\80.80879\\\\289.01\\\\-20.50781\\\\81.69893\\\\289.01\\\\-22.85156\\\\83.05925\\\\289.01\\\\-25.19531\\\\83.88489\\\\289.01\\\\-27.53906\\\\85.67889\\\\289.01\\\\-29.88281\\\\86.82161\\\\289.01\\\\-32.22656\\\\88.42921\\\\289.01\\\\-34.57031\\\\90.3988\\\\289.01\\\\-36.43259\\\\91.74844\\\\289.01\\\\-41.60156\\\\96.09487\\\\289.01\\\\-46.40716\\\\101.1234\\\\289.01\\\\-48.63281\\\\103.8925\\\\289.01\\\\-50.05581\\\\105.8109\\\\289.01\\\\-52.03897\\\\108.1547\\\\289.01\\\\-54.84508\\\\112.8422\\\\289.01\\\\-56.54788\\\\115.1859\\\\289.01\\\\-57.31724\\\\117.5297\\\\289.01\\\\-58.77809\\\\119.8734\\\\289.01\\\\-59.66415\\\\122.2172\\\\289.01\\\\-61.01031\\\\124.5609\\\\289.01\\\\-61.49414\\\\126.9047\\\\289.01\\\\-62.17529\\\\129.2484\\\\289.01\\\\-63.36781\\\\131.5922\\\\289.01\\\\-63.95774\\\\133.9359\\\\289.01\\\\-64.28482\\\\136.2797\\\\289.01\\\\-65.52673\\\\140.9672\\\\289.01\\\\-65.77621\\\\143.3109\\\\289.01\\\\-66.25\\\\150.3422\\\\289.01\\\\-66.3455\\\\155.0297\\\\289.01\\\\-66.22784\\\\159.7172\\\\289.01\\\\-65.91351\\\\164.4047\\\\289.01\\\\-65.68493\\\\166.7484\\\\289.01\\\\-65.33604\\\\169.0922\\\\289.01\\\\-64.55139\\\\171.4359\\\\289.01\\\\-63.66697\\\\176.1234\\\\289.01\\\\-61.73706\\\\180.8109\\\\289.01\\\\-61.2854\\\\183.1547\\\\289.01\\\\-60.35156\\\\185.3682\\\\289.01\\\\-59.14885\\\\187.8422\\\\289.01\\\\-57.77686\\\\190.1859\\\\289.01\\\\-56.84834\\\\192.5297\\\\289.01\\\\-55.35103\\\\194.8734\\\\289.01\\\\-53.94861\\\\197.2172\\\\289.01\\\\-50.97656\\\\201.5585\\\\289.01\\\\-48.63281\\\\204.6038\\\\289.01\\\\-47.23869\\\\206.5922\\\\289.01\\\\-42.7328\\\\211.2797\\\\289.01\\\\-39.25781\\\\214.6555\\\\289.01\\\\-34.54219\\\\218.3109\\\\289.01\\\\-32.22656\\\\219.8927\\\\289.01\\\\-27.53906\\\\223.2363\\\\289.01\\\\-23.37646\\\\225.3422\\\\289.01\\\\-22.85156\\\\225.6921\\\\289.01\\\\-20.50781\\\\226.8489\\\\289.01\\\\-18.16406\\\\228.3625\\\\289.01\\\\-15.82031\\\\229.1235\\\\289.01\\\\-14.9447\\\\230.0297\\\\289.01\\\\-15.82031\\\\231.385\\\\289.01\\\\-16.95703\\\\232.3734\\\\289.01\\\\-18.16406\\\\233.0632\\\\289.01\\\\-20.50781\\\\233.1042\\\\289.01\\\\-27.53906\\\\233.0951\\\\289.01\\\\-36.91406\\\\233.1132\\\\289.01\\\\-50.97656\\\\233.1652\\\\289.01\\\\-60.35156\\\\233.1652\\\\289.01\\\\-62.69531\\\\233.0671\\\\289.01\\\\-65.03906\\\\232.8376\\\\289.01\\\\-69.72656\\\\232.9839\\\\289.01\\\\-76.75781\\\\233.0245\\\\289.01\\\\-90.82031\\\\233.0382\\\\289.01\\\\-97.85156\\\\233.1345\\\\289.01\\\\-100.1953\\\\233.0992\\\\289.01\\\\-102.5391\\\\233.1524\\\\289.01\\\\-104.8828\\\\233.3934\\\\289.01\\\\-107.2266\\\\233.2115\\\\289.01\\\\-109.5703\\\\233.2027\\\\289.01\\\\-111.9141\\\\233.9046\\\\289.01\\\\-114.2578\\\\233.3123\\\\289.01\\\\-116.6016\\\\233.131\\\\289.01\\\\-118.9453\\\\233.9503\\\\289.01\\\\-123.6328\\\\234.0035\\\\289.01\\\\-130.6641\\\\234.0035\\\\289.01\\\\-135.3516\\\\234.1218\\\\289.01\\\\-137.6953\\\\234.054\\\\289.01\\\\-142.3828\\\\234.1551\\\\289.01\\\\-147.0703\\\\234.0336\\\\289.01\\\\-158.7891\\\\234.0691\\\\289.01\\\\-165.8203\\\\234.0314\\\\289.01\\\\-168.1641\\\\234.2175\\\\289.01\\\\-172.8516\\\\234.2539\\\\289.01\\\\-175.1953\\\\234.1973\\\\289.01\\\\-179.8828\\\\234.2721\\\\289.01\\\\-182.2266\\\\234.2574\\\\289.01\\\\-186.9141\\\\234.3359\\\\289.01\\\\-189.2578\\\\234.2721\\\\289.01\\\\-196.2891\\\\234.2502\\\\289.01\\\\-198.6328\\\\234.205\\\\289.01\\\\-200.9766\\\\234.2644\\\\289.01\\\\-205.6641\\\\234.2088\\\\289.01\\\\-215.0391\\\\234.2398\\\\289.01\\\\-217.3828\\\\234.2822\\\\289.01\\\\-229.1016\\\\234.2967\\\\289.01\\\\-233.7891\\\\234.1692\\\\289.01\\\\-238.4766\\\\234.2088\\\\289.01\\\\-243.1641\\\\234.1652\\\\289.01\\\\-245.5078\\\\234.0396\\\\289.01\\\\-247.8516\\\\234.0172\\\\289.01\\\\-250.1953\\\\234.1313\\\\289.01\\\\-252.5391\\\\234.3629\\\\289.01\\\\-254.8828\\\\235.229\\\\289.01\\\\-257.4503\\\\237.0609\\\\289.01\\\\-258.6989\\\\239.4047\\\\289.01\\\\-258.6135\\\\241.7484\\\\289.01\\\\-258.1335\\\\244.0922\\\\289.01\\\\-257.8311\\\\246.4359\\\\289.01\\\\-256.3118\\\\251.1234\\\\289.01\\\\-254.9679\\\\253.4672\\\\289.01\\\\-252.5391\\\\256.3686\\\\289.01\\\\-250.728\\\\258.1547\\\\289.01\\\\-248.6658\\\\260.4984\\\\289.01\\\\-245.5078\\\\263.5156\\\\289.01\\\\-243.1641\\\\266.0784\\\\289.01\\\\-241.5408\\\\267.5297\\\\289.01\\\\-239.3968\\\\269.8734\\\\289.01\\\\-233.7891\\\\275.3661\\\\289.01\\\\-231.4453\\\\277.8055\\\\289.01\\\\-229.1016\\\\280.0036\\\\289.01\\\\-226.7578\\\\282.5186\\\\289.01\\\\-224.4141\\\\284.6728\\\\289.01\\\\-222.0703\\\\287.1957\\\\289.01\\\\-220.4987\\\\288.6234\\\\289.01\\\\-218.2467\\\\290.9672\\\\289.01\\\\-217.3828\\\\291.6321\\\\289.01\\\\-215.0391\\\\292.9727\\\\289.01\\\\-212.6953\\\\294.534\\\\289.01\\\\-210.3516\\\\295.2615\\\\289.01\\\\-208.0078\\\\296.4424\\\\289.01\\\\-205.6641\\\\296.8658\\\\289.01\\\\-203.3203\\\\297.1563\\\\289.01\\\\-198.6328\\\\297.1793\\\\289.01\\\\-193.9453\\\\297.0673\\\\289.01\\\\-184.5703\\\\296.9514\\\\289.01\\\\-175.1953\\\\296.923\\\\289.01\\\\-165.8203\\\\296.8651\\\\289.01\\\\-154.1016\\\\296.9236\\\\289.01\\\\-149.4141\\\\296.8921\\\\289.01\\\\-144.7266\\\\296.9173\\\\289.01\\\\-137.6953\\\\296.9008\\\\289.01\\\\-135.3516\\\\296.9292\\\\289.01\\\\-128.3203\\\\296.9121\\\\289.01\\\\-116.6016\\\\296.8357\\\\289.01\\\\-111.9141\\\\296.8635\\\\289.01\\\\-102.5391\\\\296.8731\\\\289.01\\\\-88.47656\\\\296.8549\\\\289.01\\\\-81.44531\\\\296.8647\\\\289.01\\\\-79.10156\\\\296.913\\\\289.01\\\\-65.03906\\\\296.9409\\\\289.01\\\\-62.69531\\\\296.9706\\\\289.01\\\\-50.97656\\\\296.9668\\\\289.01\\\\-48.63281\\\\297.2359\\\\289.01\\\\-46.28906\\\\296.9447\\\\289.01\\\\-43.94531\\\\297.1975\\\\289.01\\\\-41.60156\\\\296.9191\\\\289.01\\\\-39.25781\\\\296.9095\\\\289.01\\\\-36.91406\\\\297.267\\\\289.01\\\\-34.57031\\\\297.0362\\\\289.01\\\\-32.22656\\\\297.4055\\\\289.01\\\\-27.53906\\\\297.3806\\\\289.01\\\\-25.19531\\\\297.4229\\\\289.01\\\\-13.47656\\\\297.4441\\\\289.01\\\\-4.101563\\\\297.4229\\\\289.01\\\\-1.757813\\\\297.2719\\\\289.01\\\\0.5859375\\\\297.4334\\\\289.01\\\\2.929688\\\\297.1626\\\\289.01\\\\5.273438\\\\297.4266\\\\289.01\\\\7.617188\\\\297.3879\\\\289.01\\\\9.960938\\\\297.2416\\\\289.01\\\\12.30469\\\\296.9841\\\\289.01\\\\14.64844\\\\297.1018\\\\289.01\\\\16.99219\\\\296.9081\\\\289.01\\\\21.67969\\\\296.9095\\\\289.01\\\\26.36719\\\\296.8673\\\\289.01\\\\28.71094\\\\296.9175\\\\289.01\\\\31.05469\\\\296.8771\\\\289.01\\\\47.46094\\\\296.7858\\\\289.01\\\\49.80469\\\\296.7229\\\\289.01\\\\59.17969\\\\296.6999\\\\289.01\\\\61.52344\\\\296.6331\\\\289.01\\\\68.55469\\\\296.6365\\\\289.01\\\\73.24219\\\\296.5732\\\\289.01\\\\84.96094\\\\296.5362\\\\289.01\\\\91.99219\\\\296.5569\\\\289.01\\\\103.7109\\\\296.4873\\\\289.01\\\\108.3984\\\\296.3976\\\\289.01\\\\113.0859\\\\296.4325\\\\289.01\\\\120.1172\\\\296.3495\\\\289.01\\\\122.4609\\\\296.364\\\\289.01\\\\127.1484\\\\296.3023\\\\289.01\\\\131.8359\\\\296.3259\\\\289.01\\\\134.1797\\\\296.1569\\\\289.01\\\\136.5234\\\\295.8717\\\\289.01\\\\138.8672\\\\295.9832\\\\289.01\\\\141.2109\\\\295.8685\\\\289.01\\\\143.5547\\\\296.085\\\\289.01\\\\145.8984\\\\295.8791\\\\289.01\\\\152.9297\\\\295.833\\\\289.01\\\\155.2734\\\\295.864\\\\289.01\\\\157.6172\\\\295.7849\\\\289.01\\\\164.6484\\\\295.6998\\\\289.01\\\\169.3359\\\\295.7346\\\\289.01\\\\174.0234\\\\295.6454\\\\289.01\\\\178.7109\\\\295.6272\\\\289.01\\\\188.0859\\\\295.5071\\\\289.01\\\\192.7734\\\\295.557\\\\289.01\\\\197.4609\\\\295.7849\\\\289.01\\\\202.1484\\\\295.7173\\\\289.01\\\\204.4922\\\\295.4439\\\\289.01\\\\206.8359\\\\294.8185\\\\289.01\\\\209.1797\\\\294.3595\\\\289.01\\\\211.5234\\\\292.4465\\\\289.01\\\\213.8672\\\\291.0974\\\\289.01\\\\216.2109\\\\289.4896\\\\289.01\\\\217.1345\\\\288.6234\\\\289.01\\\\218.5547\\\\287.023\\\\289.01\\\\221.6488\\\\283.9359\\\\289.01\\\\225.5859\\\\279.7803\\\\289.01\\\\227.9297\\\\277.5081\\\\289.01\\\\230.2734\\\\275.0207\\\\289.01\\\\232.6172\\\\272.7547\\\\289.01\\\\234.9609\\\\270.2734\\\\289.01\\\\237.7078\\\\267.5297\\\\289.01\\\\239.9578\\\\265.1859\\\\289.01\\\\244.3359\\\\260.784\\\\289.01\\\\246.6797\\\\258.2849\\\\289.01\\\\249.093\\\\255.8109\\\\289.01\\\\251.3672\\\\252.927\\\\289.01\\\\253.7109\\\\249.593\\\\289.01\\\\254.3837\\\\248.7797\\\\289.01\\\\255.2195\\\\246.4359\\\\289.01\\\\255.899\\\\244.0922\\\\289.01\\\\256.6528\\\\239.4047\\\\289.01\\\\256.6685\\\\237.0609\\\\289.01\\\\256.0547\\\\236.1658\\\\289.01\\\\255.3861\\\\234.7172\\\\289.01\\\\253.7109\\\\233.2892\\\\289.01\\\\251.3672\\\\232.6603\\\\289.01\\\\246.6797\\\\232.927\\\\289.01\\\\244.3359\\\\232.8224\\\\289.01\\\\239.6484\\\\233.0007\\\\289.01\\\\237.3047\\\\233.0305\\\\289.01\\\\230.2734\\\\232.9699\\\\289.01\\\\220.8984\\\\233.091\\\\289.01\\\\209.1797\\\\233.0819\\\\289.01\\\\206.8359\\\\233.0245\\\\289.01\\\\204.4922\\\\232.7848\\\\289.01\\\\199.8047\\\\232.7588\\\\289.01\\\\197.4609\\\\232.81\\\\289.01\\\\190.4297\\\\232.8467\\\\289.01\\\\183.3984\\\\232.8224\\\\289.01\\\\164.6484\\\\232.81\\\\289.01\\\\155.2734\\\\232.7875\\\\289.01\\\\148.2422\\\\232.8253\\\\289.01\\\\143.5547\\\\232.8003\\\\289.01\\\\138.8672\\\\232.7186\\\\289.01\\\\129.4922\\\\232.6623\\\\289.01\\\\122.4609\\\\232.7048\\\\289.01\\\\117.7734\\\\232.6477\\\\289.01\\\\115.4297\\\\232.6908\\\\289.01\\\\110.7422\\\\232.6477\\\\289.01\\\\108.3984\\\\232.5557\\\\289.01\\\\106.0547\\\\231.9897\\\\289.01\\\\103.7109\\\\232.81\\\\289.01\\\\101.3672\\\\232.8735\\\\289.01\\\\99.02344\\\\233.0819\\\\289.01\\\\82.61719\\\\233.1091\\\\289.01\\\\75.58594\\\\233.1042\\\\289.01\\\\63.86719\\\\233.1397\\\\289.01\\\\61.52344\\\\233.1132\\\\289.01\\\\54.49219\\\\233.131\\\\289.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"352\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"6\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0632\\\\292.01\\\\-34.57031\\\\233.1221\\\\292.01\\\\-46.28906\\\\233.1221\\\\292.01\\\\-53.32031\\\\233.1652\\\\292.01\\\\-60.35156\\\\233.1736\\\\292.01\\\\-62.69531\\\\233.0951\\\\292.01\\\\-65.03906\\\\232.8376\\\\292.01\\\\-69.72656\\\\232.9735\\\\292.01\\\\-83.78906\\\\233.0245\\\\292.01\\\\-86.13281\\\\233.0082\\\\292.01\\\\-95.50781\\\\233.0766\\\\292.01\\\\-109.5703\\\\233.1083\\\\292.01\\\\-111.9141\\\\233.1524\\\\292.01\\\\-114.2578\\\\233.4062\\\\292.01\\\\-116.6016\\\\233.1221\\\\292.01\\\\-118.9453\\\\233.9388\\\\292.01\\\\-123.6328\\\\233.9793\\\\292.01\\\\-130.6641\\\\233.9793\\\\292.01\\\\-135.3516\\\\234.0805\\\\292.01\\\\-137.6953\\\\234.0105\\\\292.01\\\\-142.3828\\\\234.0855\\\\292.01\\\\-149.4141\\\\233.9967\\\\292.01\\\\-154.1016\\\\234.0263\\\\292.01\\\\-161.1328\\\\233.9784\\\\292.01\\\\-165.8203\\\\233.9954\\\\292.01\\\\-168.1641\\\\234.1756\\\\292.01\\\\-172.8516\\\\234.2357\\\\292.01\\\\-175.1953\\\\234.1837\\\\292.01\\\\-179.8828\\\\234.2394\\\\292.01\\\\-186.9141\\\\234.2574\\\\292.01\\\\-189.2578\\\\234.2012\\\\292.01\\\\-193.9453\\\\234.205\\\\292.01\\\\-198.6328\\\\234.1437\\\\292.01\\\\-200.9766\\\\234.2224\\\\292.01\\\\-205.6641\\\\234.1523\\\\292.01\\\\-212.6953\\\\234.2224\\\\292.01\\\\-215.0391\\\\234.2088\\\\292.01\\\\-222.0703\\\\234.2644\\\\292.01\\\\-229.1016\\\\234.2224\\\\292.01\\\\-233.7891\\\\234.0787\\\\292.01\\\\-238.4766\\\\234.1437\\\\292.01\\\\-243.1641\\\\234.1482\\\\292.01\\\\-245.5078\\\\234.0015\\\\292.01\\\\-247.8516\\\\233.9742\\\\292.01\\\\-250.1953\\\\234.1478\\\\292.01\\\\-252.5391\\\\234.7444\\\\292.01\\\\-254.8828\\\\236.1971\\\\292.01\\\\-255.7199\\\\237.0609\\\\292.01\\\\-256.4182\\\\239.4047\\\\292.01\\\\-255.9699\\\\244.0922\\\\292.01\\\\-255.9741\\\\246.4359\\\\292.01\\\\-255.8244\\\\248.7797\\\\292.01\\\\-255.2465\\\\251.1234\\\\292.01\\\\-254.8828\\\\251.716\\\\292.01\\\\-252.9549\\\\255.8109\\\\292.01\\\\-250.1953\\\\258.7278\\\\292.01\\\\-247.8516\\\\261.3344\\\\292.01\\\\-245.5078\\\\263.528\\\\292.01\\\\-243.1641\\\\266.0844\\\\292.01\\\\-241.5582\\\\267.5297\\\\292.01\\\\-239.4252\\\\269.8734\\\\292.01\\\\-233.7891\\\\275.382\\\\292.01\\\\-231.4453\\\\277.8153\\\\292.01\\\\-229.1016\\\\280.0153\\\\292.01\\\\-226.7578\\\\282.5249\\\\292.01\\\\-224.4141\\\\284.6784\\\\292.01\\\\-222.0703\\\\287.1957\\\\292.01\\\\-220.5108\\\\288.6234\\\\292.01\\\\-218.2575\\\\290.9672\\\\292.01\\\\-217.3828\\\\291.6415\\\\292.01\\\\-215.0391\\\\293\\\\292.01\\\\-212.6953\\\\294.5345\\\\292.01\\\\-210.3516\\\\295.3008\\\\292.01\\\\-208.0078\\\\296.4338\\\\292.01\\\\-205.6641\\\\296.8658\\\\292.01\\\\-203.3203\\\\297.1488\\\\292.01\\\\-196.2891\\\\297.1563\\\\292.01\\\\-193.9453\\\\297.0522\\\\292.01\\\\-184.5703\\\\296.9452\\\\292.01\\\\-177.5391\\\\296.9218\\\\292.01\\\\-172.8516\\\\296.8713\\\\292.01\\\\-161.1328\\\\296.8585\\\\292.01\\\\-158.7891\\\\296.882\\\\292.01\\\\-149.4141\\\\296.8672\\\\292.01\\\\-147.0703\\\\296.8921\\\\292.01\\\\-137.6953\\\\296.8852\\\\292.01\\\\-128.3203\\\\296.9041\\\\292.01\\\\-116.6016\\\\296.8174\\\\292.01\\\\-102.5391\\\\296.8641\\\\292.01\\\\-95.50781\\\\296.8456\\\\292.01\\\\-90.82031\\\\296.8738\\\\292.01\\\\-74.41406\\\\296.8938\\\\292.01\\\\-67.38281\\\\296.9218\\\\292.01\\\\-62.69531\\\\296.9731\\\\292.01\\\\-50.97656\\\\296.9447\\\\292.01\\\\-48.63281\\\\297.0809\\\\292.01\\\\-46.28906\\\\296.9447\\\\292.01\\\\-43.94531\\\\297.1128\\\\292.01\\\\-41.60156\\\\296.9191\\\\292.01\\\\-36.91406\\\\297.3879\\\\292.01\\\\-34.57031\\\\297.0362\\\\292.01\\\\-29.88281\\\\297.4229\\\\292.01\\\\-18.16406\\\\297.3836\\\\292.01\\\\-13.47656\\\\297.4229\\\\292.01\\\\-11.13281\\\\297.3192\\\\292.01\\\\-8.789063\\\\297.4125\\\\292.01\\\\-4.101563\\\\297.3947\\\\292.01\\\\-1.757813\\\\297.1564\\\\292.01\\\\0.5859375\\\\297.4125\\\\292.01\\\\5.273438\\\\297.2937\\\\292.01\\\\7.617188\\\\296.9841\\\\292.01\\\\9.960938\\\\297.1865\\\\292.01\\\\12.30469\\\\296.9081\\\\292.01\\\\14.64844\\\\296.9396\\\\292.01\\\\19.33594\\\\296.8985\\\\292.01\\\\28.71094\\\\296.8973\\\\292.01\\\\35.74219\\\\296.8466\\\\292.01\\\\40.42969\\\\296.8673\\\\292.01\\\\61.52344\\\\296.6577\\\\292.01\\\\68.55469\\\\296.6487\\\\292.01\\\\75.58594\\\\296.5943\\\\292.01\\\\87.30469\\\\296.549\\\\292.01\\\\91.99219\\\\296.5862\\\\292.01\\\\106.0547\\\\296.4597\\\\292.01\\\\113.0859\\\\296.4597\\\\292.01\\\\115.4297\\\\296.4117\\\\292.01\\\\127.1484\\\\296.3229\\\\292.01\\\\134.1797\\\\296.3288\\\\292.01\\\\136.5234\\\\296.2406\\\\292.01\\\\143.5547\\\\296.2559\\\\292.01\\\\145.8984\\\\295.894\\\\292.01\\\\148.2422\\\\295.9087\\\\292.01\\\\155.2734\\\\295.864\\\\292.01\\\\162.3047\\\\295.7516\\\\292.01\\\\166.9922\\\\295.7849\\\\292.01\\\\171.6797\\\\295.6998\\\\292.01\\\\183.3984\\\\295.557\\\\292.01\\\\188.0859\\\\295.5916\\\\292.01\\\\192.7734\\\\295.5742\\\\292.01\\\\197.4609\\\\295.8012\\\\292.01\\\\202.1484\\\\295.7173\\\\292.01\\\\204.4922\\\\295.4287\\\\292.01\\\\206.8359\\\\294.8185\\\\292.01\\\\209.1797\\\\294.3768\\\\292.01\\\\211.5234\\\\292.4613\\\\292.01\\\\213.8672\\\\291.1455\\\\292.01\\\\216.2109\\\\289.5482\\\\292.01\\\\217.195\\\\288.6234\\\\292.01\\\\218.5547\\\\287.0752\\\\292.01\\\\221.6824\\\\283.9359\\\\292.01\\\\225.5859\\\\279.8388\\\\292.01\\\\227.9297\\\\277.5633\\\\292.01\\\\230.2734\\\\275.0632\\\\292.01\\\\233.2115\\\\272.2172\\\\292.01\\\\234.9609\\\\270.3186\\\\292.01\\\\237.735\\\\267.5297\\\\292.01\\\\239.9391\\\\265.1859\\\\292.01\\\\244.3359\\\\260.7643\\\\292.01\\\\246.751\\\\258.1547\\\\292.01\\\\249.0234\\\\255.6098\\\\292.01\\\\250.567\\\\253.4672\\\\292.01\\\\252.0319\\\\251.1234\\\\292.01\\\\252.7511\\\\248.7797\\\\292.01\\\\253.3727\\\\246.4359\\\\292.01\\\\253.5807\\\\244.0922\\\\292.01\\\\253.6483\\\\241.7484\\\\292.01\\\\254.3572\\\\239.4047\\\\292.01\\\\254.5918\\\\237.0609\\\\292.01\\\\253.1041\\\\234.7172\\\\292.01\\\\251.3672\\\\232.9906\\\\292.01\\\\249.0234\\\\232.8704\\\\292.01\\\\246.6797\\\\232.9906\\\\292.01\\\\244.3359\\\\232.9594\\\\292.01\\\\239.6484\\\\233.0108\\\\292.01\\\\230.2734\\\\232.9906\\\\292.01\\\\220.8984\\\\233.0819\\\\292.01\\\\211.5234\\\\233.091\\\\292.01\\\\206.8359\\\\233.0245\\\\292.01\\\\204.4922\\\\232.7848\\\\292.01\\\\199.8047\\\\232.7719\\\\292.01\\\\190.4297\\\\232.8346\\\\292.01\\\\181.0547\\\\232.7719\\\\292.01\\\\178.7109\\\\232.7975\\\\292.01\\\\174.0234\\\\232.7588\\\\292.01\\\\166.9922\\\\232.7456\\\\292.01\\\\152.9297\\\\232.8003\\\\292.01\\\\145.8984\\\\232.7875\\\\292.01\\\\141.2109\\\\232.6908\\\\292.01\\\\136.5234\\\\232.6908\\\\292.01\\\\134.1797\\\\232.6477\\\\292.01\\\\127.1484\\\\232.6767\\\\292.01\\\\124.8047\\\\232.6329\\\\292.01\\\\122.4609\\\\232.6767\\\\292.01\\\\117.7734\\\\232.6329\\\\292.01\\\\115.4297\\\\232.6767\\\\292.01\\\\110.7422\\\\232.6329\\\\292.01\\\\108.3984\\\\232.4011\\\\292.01\\\\106.0547\\\\231.7168\\\\292.01\\\\103.7109\\\\232.7346\\\\292.01\\\\99.02344\\\\233.0819\\\\292.01\\\\96.67969\\\\233.1001\\\\292.01\\\\80.27344\\\\233.0859\\\\292.01\\\\77.92969\\\\233.131\\\\292.01\\\\68.55469\\\\233.1042\\\\292.01\\\\63.86719\\\\233.1483\\\\292.01\\\\54.49219\\\\233.1132\\\\292.01\\\\45.11719\\\\233.1042\\\\292.01\\\\44.13916\\\\232.3734\\\\292.01\\\\42.77344\\\\231.028\\\\292.01\\\\42.04498\\\\230.0297\\\\292.01\\\\42.77344\\\\229.2462\\\\292.01\\\\45.11719\\\\228.6098\\\\292.01\\\\47.46094\\\\227.1\\\\292.01\\\\49.80469\\\\226.0746\\\\292.01\\\\52.14844\\\\224.5908\\\\292.01\\\\54.49219\\\\223.7256\\\\292.01\\\\56.83594\\\\221.9043\\\\292.01\\\\59.17969\\\\220.2334\\\\292.01\\\\61.52344\\\\218.9233\\\\292.01\\\\62.17359\\\\218.3109\\\\292.01\\\\65.03114\\\\215.9672\\\\292.01\\\\66.21094\\\\215.0853\\\\292.01\\\\67.77555\\\\213.6234\\\\292.01\\\\68.55469\\\\212.7391\\\\292.01\\\\70.89844\\\\210.5899\\\\292.01\\\\74.60287\\\\206.5922\\\\292.01\\\\76.61049\\\\204.2484\\\\292.01\\\\78.37865\\\\201.9047\\\\292.01\\\\80.27344\\\\199.0659\\\\292.01\\\\81.3732\\\\197.2172\\\\292.01\\\\83.11832\\\\194.8734\\\\292.01\\\\84.16552\\\\192.5297\\\\292.01\\\\85.52934\\\\190.1859\\\\292.01\\\\86.43362\\\\187.8422\\\\292.01\\\\87.9126\\\\185.4984\\\\292.01\\\\89.3596\\\\180.8109\\\\292.01\\\\90.38334\\\\178.4672\\\\292.01\\\\91.58888\\\\173.7797\\\\292.01\\\\92.57813\\\\171.4359\\\\292.01\\\\92.99067\\\\169.0922\\\\292.01\\\\93.58354\\\\159.7172\\\\292.01\\\\93.69106\\\\157.3734\\\\292.01\\\\93.75715\\\\152.6859\\\\292.01\\\\93.66728\\\\150.3422\\\\292.01\\\\93.08162\\\\140.9672\\\\292.01\\\\92.89124\\\\138.6234\\\\292.01\\\\92.23668\\\\136.2797\\\\292.01\\\\91.29035\\\\133.9359\\\\292.01\\\\90.7637\\\\131.5922\\\\292.01\\\\90.01319\\\\129.2484\\\\292.01\\\\88.96999\\\\126.9047\\\\292.01\\\\88.48242\\\\124.5609\\\\292.01\\\\87.50434\\\\122.2172\\\\292.01\\\\86.16302\\\\119.8734\\\\292.01\\\\85.18534\\\\117.5297\\\\292.01\\\\83.93555\\\\115.1859\\\\292.01\\\\82.35394\\\\112.8422\\\\292.01\\\\81.1205\\\\110.4984\\\\292.01\\\\77.92969\\\\106.2493\\\\292.01\\\\77.53906\\\\105.8109\\\\292.01\\\\76.03666\\\\103.4672\\\\292.01\\\\71.81973\\\\98.77969\\\\292.01\\\\68.55469\\\\95.57756\\\\292.01\\\\63.86719\\\\91.47022\\\\292.01\\\\61.52344\\\\90.03793\\\\292.01\\\\59.17969\\\\88.1257\\\\292.01\\\\56.83594\\\\86.46088\\\\292.01\\\\54.49219\\\\85.37372\\\\292.01\\\\52.14844\\\\83.62384\\\\292.01\\\\49.80469\\\\82.8195\\\\292.01\\\\47.46094\\\\81.45925\\\\292.01\\\\45.11719\\\\80.5947\\\\292.01\\\\42.77344\\\\79.13168\\\\292.01\\\\40.42969\\\\78.71358\\\\292.01\\\\38.08594\\\\78.09455\\\\292.01\\\\35.74219\\\\77.09653\\\\292.01\\\\33.39844\\\\76.47086\\\\292.01\\\\31.05469\\\\76.06187\\\\292.01\\\\28.71094\\\\75.29641\\\\292.01\\\\26.36719\\\\74.65405\\\\292.01\\\\24.02344\\\\74.42056\\\\292.01\\\\14.64844\\\\74.05988\\\\292.01\\\\12.30469\\\\74.06546\\\\292.01\\\\7.617188\\\\74.16415\\\\292.01\\\\2.929688\\\\74.40835\\\\292.01\\\\0.5859375\\\\74.66957\\\\292.01\\\\-4.101563\\\\76.10484\\\\292.01\\\\-6.445313\\\\76.55428\\\\292.01\\\\-8.789063\\\\77.2619\\\\292.01\\\\-11.13281\\\\78.29331\\\\292.01\\\\-15.82031\\\\79.33912\\\\292.01\\\\-18.16406\\\\80.80879\\\\292.01\\\\-20.50781\\\\81.67974\\\\292.01\\\\-22.85156\\\\83.04977\\\\292.01\\\\-25.19531\\\\83.8679\\\\292.01\\\\-27.53906\\\\85.67369\\\\292.01\\\\-29.88281\\\\86.77807\\\\292.01\\\\-32.22656\\\\88.40859\\\\292.01\\\\-34.57031\\\\90.3647\\\\292.01\\\\-36.45433\\\\91.74844\\\\292.01\\\\-39.25781\\\\94.04677\\\\292.01\\\\-41.60156\\\\96.05102\\\\292.01\\\\-46.47692\\\\101.1234\\\\292.01\\\\-48.63281\\\\103.8257\\\\292.01\\\\-50.09444\\\\105.8109\\\\292.01\\\\-52.05878\\\\108.1547\\\\292.01\\\\-53.53416\\\\110.4984\\\\292.01\\\\-54.89417\\\\112.8422\\\\292.01\\\\-56.60029\\\\115.1859\\\\292.01\\\\-57.3473\\\\117.5297\\\\292.01\\\\-58.83843\\\\119.8734\\\\292.01\\\\-59.71175\\\\122.2172\\\\292.01\\\\-61.0397\\\\124.5609\\\\292.01\\\\-61.54119\\\\126.9047\\\\292.01\\\\-62.23412\\\\129.2484\\\\292.01\\\\-63.41292\\\\131.5922\\\\292.01\\\\-63.98491\\\\133.9359\\\\292.01\\\\-64.32825\\\\136.2797\\\\292.01\\\\-65.57173\\\\140.9672\\\\292.01\\\\-65.81827\\\\143.3109\\\\292.01\\\\-66.16071\\\\147.9984\\\\292.01\\\\-66.35813\\\\152.6859\\\\292.01\\\\-66.35179\\\\157.3734\\\\292.01\\\\-66.26755\\\\159.7172\\\\292.01\\\\-65.93555\\\\164.4047\\\\292.01\\\\-65.72266\\\\166.7484\\\\292.01\\\\-65.40382\\\\169.0922\\\\292.01\\\\-64.58663\\\\171.4359\\\\292.01\\\\-63.71209\\\\176.1234\\\\292.01\\\\-61.78386\\\\180.8109\\\\292.01\\\\-61.30256\\\\183.1547\\\\292.01\\\\-60.36086\\\\185.4984\\\\292.01\\\\-59.18586\\\\187.8422\\\\292.01\\\\-57.87363\\\\190.1859\\\\292.01\\\\-56.84834\\\\192.5297\\\\292.01\\\\-55.66406\\\\194.5832\\\\292.01\\\\-54.00845\\\\197.2172\\\\292.01\\\\-50.97656\\\\201.6594\\\\292.01\\\\-47.27555\\\\206.5922\\\\292.01\\\\-42.76654\\\\211.2797\\\\292.01\\\\-39.25781\\\\214.6977\\\\292.01\\\\-34.57031\\\\218.3578\\\\292.01\\\\-32.22656\\\\219.9231\\\\292.01\\\\-27.53906\\\\223.3272\\\\292.01\\\\-25.19531\\\\224.3983\\\\292.01\\\\-22.85156\\\\225.7515\\\\292.01\\\\-20.50781\\\\226.8662\\\\292.01\\\\-18.16406\\\\228.3724\\\\292.01\\\\-15.82031\\\\229.1319\\\\292.01\\\\-14.95299\\\\230.0297\\\\292.01\\\\-15.82031\\\\231.3763\\\\292.01\\\\-16.95703\\\\232.3734\\\\292.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"352\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0632\\\\295.01\\\\-39.25781\\\\233.1397\\\\295.01\\\\-41.60156\\\\233.1221\\\\295.01\\\\-53.32031\\\\233.1818\\\\295.01\\\\-60.35156\\\\233.1818\\\\295.01\\\\-62.69531\\\\233.1221\\\\295.01\\\\-65.03906\\\\232.8497\\\\295.01\\\\-69.72656\\\\232.9735\\\\295.01\\\\-74.41406\\\\233.0145\\\\295.01\\\\-83.78906\\\\233.0145\\\\295.01\\\\-93.16406\\\\233.0859\\\\295.01\\\\-109.5703\\\\233.1132\\\\295.01\\\\-111.9141\\\\233.5764\\\\295.01\\\\-114.2578\\\\233.9331\\\\295.01\\\\-125.9766\\\\234.0105\\\\295.01\\\\-130.6641\\\\233.9793\\\\295.01\\\\-135.3516\\\\234.0672\\\\295.01\\\\-137.6953\\\\234.0035\\\\295.01\\\\-142.3828\\\\234.0672\\\\295.01\\\\-151.7578\\\\233.9848\\\\295.01\\\\-154.1016\\\\234.0192\\\\295.01\\\\-163.4766\\\\233.9784\\\\295.01\\\\-165.8203\\\\234.0072\\\\295.01\\\\-168.1641\\\\234.1894\\\\295.01\\\\-172.8516\\\\234.2539\\\\295.01\\\\-175.1953\\\\234.2012\\\\295.01\\\\-186.9141\\\\234.2721\\\\295.01\\\\-189.2578\\\\234.2326\\\\295.01\\\\-193.9453\\\\234.261\\\\295.01\\\\-198.6328\\\\234.1692\\\\295.01\\\\-200.9766\\\\234.2362\\\\295.01\\\\-205.6641\\\\234.1564\\\\295.01\\\\-208.0078\\\\234.1992\\\\295.01\\\\-215.0391\\\\234.2125\\\\295.01\\\\-222.0703\\\\234.2967\\\\295.01\\\\-224.4141\\\\234.226\\\\295.01\\\\-229.1016\\\\234.2224\\\\295.01\\\\-233.7891\\\\234.067\\\\295.01\\\\-240.8203\\\\234.1692\\\\295.01\\\\-243.1641\\\\234.1482\\\\295.01\\\\-247.8516\\\\233.8526\\\\295.01\\\\-250.1953\\\\233.9885\\\\295.01\\\\-252.5391\\\\234.8955\\\\295.01\\\\-254.3724\\\\237.0609\\\\295.01\\\\-255.6279\\\\239.4047\\\\295.01\\\\-254.6435\\\\241.7484\\\\295.01\\\\-254.2969\\\\244.0922\\\\295.01\\\\-254.2467\\\\248.7797\\\\295.01\\\\-253.6501\\\\253.4672\\\\295.01\\\\-252.733\\\\255.8109\\\\295.01\\\\-250.7417\\\\258.1547\\\\295.01\\\\-247.8516\\\\261.34\\\\295.01\\\\-246.2058\\\\262.8422\\\\295.01\\\\-244.0969\\\\265.1859\\\\295.01\\\\-241.6217\\\\267.5297\\\\295.01\\\\-239.489\\\\269.8734\\\\295.01\\\\-233.7891\\\\275.382\\\\295.01\\\\-231.4453\\\\277.8344\\\\295.01\\\\-229.1016\\\\280.0153\\\\295.01\\\\-226.7578\\\\282.5409\\\\295.01\\\\-224.4141\\\\284.6849\\\\295.01\\\\-222.0703\\\\287.2122\\\\295.01\\\\-220.5406\\\\288.6234\\\\295.01\\\\-218.2745\\\\290.9672\\\\295.01\\\\-217.3828\\\\291.6508\\\\295.01\\\\-215.0391\\\\293.0865\\\\295.01\\\\-212.6953\\\\294.6149\\\\295.01\\\\-210.3516\\\\295.3416\\\\295.01\\\\-208.0078\\\\296.4592\\\\295.01\\\\-205.6641\\\\296.8974\\\\295.01\\\\-203.3203\\\\297.1488\\\\295.01\\\\-196.2891\\\\297.1563\\\\295.01\\\\-193.9453\\\\297.0647\\\\295.01\\\\-182.2266\\\\296.9607\\\\295.01\\\\-175.1953\\\\296.9311\\\\295.01\\\\-170.5078\\\\296.8813\\\\295.01\\\\-158.7891\\\\296.8978\\\\295.01\\\\-154.1016\\\\296.9236\\\\295.01\\\\-149.4141\\\\296.8921\\\\295.01\\\\-142.3828\\\\296.9338\\\\295.01\\\\-128.3203\\\\296.942\\\\295.01\\\\-116.6016\\\\296.854\\\\295.01\\\\-111.9141\\\\296.8927\\\\295.01\\\\-109.5703\\\\296.8635\\\\295.01\\\\-102.5391\\\\296.8927\\\\295.01\\\\-97.85156\\\\296.8641\\\\295.01\\\\-88.47656\\\\296.9234\\\\295.01\\\\-81.44531\\\\296.9428\\\\295.01\\\\-74.41406\\\\296.9322\\\\295.01\\\\-67.38281\\\\296.9622\\\\295.01\\\\-65.03906\\\\297.1085\\\\295.01\\\\-62.69531\\\\297.0091\\\\295.01\\\\-60.35156\\\\297.0949\\\\295.01\\\\-58.00781\\\\297.0091\\\\295.01\\\\-53.32031\\\\297.0091\\\\295.01\\\\-50.97656\\\\296.9644\\\\295.01\\\\-46.28906\\\\297.3691\\\\295.01\\\\-43.94531\\\\297.4229\\\\295.01\\\\-39.25781\\\\297.2468\\\\295.01\\\\-36.91406\\\\297.1104\\\\295.01\\\\-34.57031\\\\297.373\\\\295.01\\\\-32.22656\\\\297.22\\\\295.01\\\\-29.88281\\\\297.4441\\\\295.01\\\\-27.53906\\\\297.3984\\\\295.01\\\\-22.85156\\\\297.4334\\\\295.01\\\\-13.47656\\\\297.4125\\\\295.01\\\\-11.13281\\\\297.252\\\\295.01\\\\-8.789063\\\\297.4022\\\\295.01\\\\-6.445313\\\\297.231\\\\295.01\\\\-4.101563\\\\297.3798\\\\295.01\\\\-1.757813\\\\296.9644\\\\295.01\\\\0.5859375\\\\297.252\\\\295.01\\\\2.929688\\\\297.4229\\\\295.01\\\\5.273438\\\\297.1516\\\\295.01\\\\9.960938\\\\296.8998\\\\295.01\\\\12.30469\\\\296.8888\\\\295.01\\\\14.64844\\\\296.9755\\\\295.01\\\\16.99219\\\\296.8888\\\\295.01\\\\28.71094\\\\296.878\\\\295.01\\\\40.42969\\\\296.847\\\\295.01\\\\59.17969\\\\296.7115\\\\295.01\\\\61.52344\\\\296.6365\\\\295.01\\\\66.21094\\\\296.6365\\\\295.01\\\\77.92969\\\\296.5696\\\\295.01\\\\89.64844\\\\296.5616\\\\295.01\\\\101.3672\\\\296.506\\\\295.01\\\\106.0547\\\\296.4528\\\\295.01\\\\115.4297\\\\296.4117\\\\295.01\\\\124.8047\\\\296.308\\\\295.01\\\\129.4922\\\\296.3348\\\\295.01\\\\131.8359\\\\296.1569\\\\295.01\\\\134.1797\\\\296.1766\\\\295.01\\\\136.5234\\\\295.9102\\\\295.01\\\\141.2109\\\\295.8807\\\\295.01\\\\143.5547\\\\295.9983\\\\295.01\\\\145.8984\\\\295.8791\\\\295.01\\\\148.2422\\\\295.8791\\\\295.01\\\\157.6172\\\\295.7684\\\\295.01\\\\166.9922\\\\295.7173\\\\295.01\\\\169.3359\\\\295.6638\\\\295.01\\\\174.0234\\\\295.6638\\\\295.01\\\\176.3672\\\\295.5916\\\\295.01\\\\183.3984\\\\295.5235\\\\295.01\\\\188.0859\\\\295.5742\\\\295.01\\\\192.7734\\\\295.557\\\\295.01\\\\197.4609\\\\295.8012\\\\295.01\\\\202.1484\\\\295.7173\\\\295.01\\\\204.4922\\\\295.4137\\\\295.01\\\\206.8359\\\\294.8107\\\\295.01\\\\209.1797\\\\294.3656\\\\295.01\\\\211.5234\\\\292.4688\\\\295.01\\\\213.8672\\\\291.1611\\\\295.01\\\\216.2109\\\\289.5734\\\\295.01\\\\217.2207\\\\288.6234\\\\295.01\\\\218.5547\\\\287.0638\\\\295.01\\\\221.6933\\\\283.9359\\\\295.01\\\\225.5859\\\\279.8647\\\\295.01\\\\227.9297\\\\277.5633\\\\295.01\\\\230.2734\\\\275.067\\\\295.01\\\\233.2115\\\\272.2172\\\\295.01\\\\234.9609\\\\270.3037\\\\295.01\\\\237.7232\\\\267.5297\\\\295.01\\\\239.9391\\\\265.1859\\\\295.01\\\\244.3359\\\\260.7816\\\\295.01\\\\246.788\\\\258.1547\\\\295.01\\\\249.0234\\\\255.4653\\\\295.01\\\\250.3651\\\\253.4672\\\\295.01\\\\251.5764\\\\251.1234\\\\295.01\\\\252.2446\\\\248.7797\\\\295.01\\\\252.5619\\\\246.4359\\\\295.01\\\\252.6451\\\\241.7484\\\\295.01\\\\252.8992\\\\239.4047\\\\295.01\\\\253.0001\\\\237.0609\\\\295.01\\\\252.33\\\\234.7172\\\\295.01\\\\251.3672\\\\233.4192\\\\295.01\\\\249.0234\\\\232.9487\\\\295.01\\\\241.9922\\\\233.0537\\\\295.01\\\\237.3047\\\\232.9699\\\\295.01\\\\232.6172\\\\232.9487\\\\295.01\\\\227.9297\\\\233.0207\\\\295.01\\\\216.2109\\\\233.0819\\\\295.01\\\\211.5234\\\\233.0632\\\\295.01\\\\206.8359\\\\232.9699\\\\295.01\\\\204.4922\\\\232.7588\\\\295.01\\\\199.8047\\\\232.7322\\\\295.01\\\\190.4297\\\\232.7975\\\\295.01\\\\176.3672\\\\232.7186\\\\295.01\\\\162.3047\\\\232.7322\\\\295.01\\\\152.9297\\\\232.7848\\\\295.01\\\\143.5547\\\\232.7456\\\\295.01\\\\138.8672\\\\232.6623\\\\295.01\\\\136.5234\\\\232.6908\\\\295.01\\\\131.8359\\\\232.6329\\\\295.01\\\\127.1484\\\\232.6623\\\\295.01\\\\124.8047\\\\232.6329\\\\295.01\\\\110.7422\\\\232.6477\\\\295.01\\\\108.3984\\\\232.6179\\\\295.01\\\\106.0547\\\\231.7168\\\\295.01\\\\103.7109\\\\232.6027\\\\295.01\\\\101.3672\\\\232.9735\\\\295.01\\\\99.02344\\\\233.091\\\\295.01\\\\89.64844\\\\233.1091\\\\295.01\\\\80.27344\\\\233.0819\\\\295.01\\\\73.24219\\\\233.131\\\\295.01\\\\66.21094\\\\233.1132\\\\295.01\\\\56.83594\\\\233.1397\\\\295.01\\\\54.49219\\\\233.1042\\\\295.01\\\\45.11719\\\\233.0951\\\\295.01\\\\44.15678\\\\232.3734\\\\295.01\\\\42.77344\\\\231.0106\\\\295.01\\\\42.05375\\\\230.0297\\\\295.01\\\\42.77344\\\\229.2553\\\\295.01\\\\45.11719\\\\228.5743\\\\295.01\\\\47.46094\\\\227.0897\\\\295.01\\\\49.80469\\\\226.0467\\\\295.01\\\\52.14844\\\\224.5908\\\\295.01\\\\54.49219\\\\223.7059\\\\295.01\\\\56.83594\\\\221.8778\\\\295.01\\\\59.17969\\\\220.2334\\\\295.01\\\\61.52344\\\\218.9233\\\\295.01\\\\64.98363\\\\215.9672\\\\295.01\\\\66.21094\\\\215.0635\\\\295.01\\\\67.76714\\\\213.6234\\\\295.01\\\\68.55469\\\\212.7302\\\\295.01\\\\70.89844\\\\210.5392\\\\295.01\\\\74.57118\\\\206.5922\\\\295.01\\\\76.57597\\\\204.2484\\\\295.01\\\\78.3308\\\\201.9047\\\\295.01\\\\80.27344\\\\198.9949\\\\295.01\\\\81.35471\\\\197.2172\\\\295.01\\\\83.0397\\\\194.8734\\\\295.01\\\\84.14964\\\\192.5297\\\\295.01\\\\85.47139\\\\190.1859\\\\295.01\\\\86.37085\\\\187.8422\\\\295.01\\\\87.84957\\\\185.4984\\\\295.01\\\\88.62815\\\\183.1547\\\\295.01\\\\89.2244\\\\180.8109\\\\295.01\\\\90.29716\\\\178.4672\\\\295.01\\\\91.52786\\\\173.7797\\\\295.01\\\\92.50722\\\\171.4359\\\\295.01\\\\92.97176\\\\169.0922\\\\295.01\\\\93.68722\\\\157.3734\\\\295.01\\\\93.72856\\\\152.6859\\\\295.01\\\\93.52158\\\\147.9984\\\\295.01\\\\93.06984\\\\140.9672\\\\295.01\\\\92.83925\\\\138.6234\\\\295.01\\\\92.12536\\\\136.2797\\\\295.01\\\\91.24645\\\\133.9359\\\\295.01\\\\90.72266\\\\131.5922\\\\295.01\\\\89.95934\\\\129.2484\\\\295.01\\\\88.9045\\\\126.9047\\\\295.01\\\\88.46478\\\\124.5609\\\\295.01\\\\87.35082\\\\122.2172\\\\295.01\\\\86.12689\\\\119.8734\\\\295.01\\\\85.13927\\\\117.5297\\\\295.01\\\\83.90684\\\\115.1859\\\\295.01\\\\82.26481\\\\112.8422\\\\295.01\\\\81.10777\\\\110.4984\\\\295.01\\\\77.92969\\\\106.3366\\\\295.01\\\\77.45313\\\\105.8109\\\\295.01\\\\75.98749\\\\103.4672\\\\295.01\\\\71.75832\\\\98.77969\\\\295.01\\\\68.55469\\\\95.61713\\\\295.01\\\\63.86719\\\\91.51749\\\\295.01\\\\61.52344\\\\90.08352\\\\295.01\\\\59.17969\\\\88.14508\\\\295.01\\\\56.83594\\\\86.47145\\\\295.01\\\\54.49219\\\\85.40367\\\\295.01\\\\52.14844\\\\83.63686\\\\295.01\\\\49.80469\\\\82.85554\\\\295.01\\\\47.46094\\\\81.48983\\\\295.01\\\\45.11719\\\\80.5947\\\\295.01\\\\42.77344\\\\79.16859\\\\295.01\\\\40.42969\\\\78.71358\\\\295.01\\\\38.08594\\\\78.12252\\\\295.01\\\\35.74219\\\\77.10697\\\\295.01\\\\33.39844\\\\76.50327\\\\295.01\\\\31.05469\\\\76.07934\\\\295.01\\\\28.71094\\\\75.31472\\\\295.01\\\\26.36719\\\\74.67744\\\\295.01\\\\24.02344\\\\74.42056\\\\295.01\\\\16.99219\\\\74.12224\\\\295.01\\\\12.30469\\\\74.07317\\\\295.01\\\\7.617188\\\\74.17641\\\\295.01\\\\2.929688\\\\74.40835\\\\295.01\\\\0.5859375\\\\74.66957\\\\295.01\\\\-4.101563\\\\76.07934\\\\295.01\\\\-6.445313\\\\76.52584\\\\295.01\\\\-8.789063\\\\77.22805\\\\295.01\\\\-11.13281\\\\78.25741\\\\295.01\\\\-15.82031\\\\79.32516\\\\295.01\\\\-18.16406\\\\80.7914\\\\295.01\\\\-20.50781\\\\81.66099\\\\295.01\\\\-22.85156\\\\83.04977\\\\295.01\\\\-25.19531\\\\83.83018\\\\295.01\\\\-27.53906\\\\85.65853\\\\295.01\\\\-29.88281\\\\86.7363\\\\295.01\\\\-32.22656\\\\88.3882\\\\295.01\\\\-34.57031\\\\90.3647\\\\295.01\\\\-36.52969\\\\91.74844\\\\295.01\\\\-41.60156\\\\95.97882\\\\295.01\\\\-46.52696\\\\101.1234\\\\295.01\\\\-48.63281\\\\103.7908\\\\295.01\\\\-50.13672\\\\105.8109\\\\295.01\\\\-52.07761\\\\108.1547\\\\295.01\\\\-53.5798\\\\110.4984\\\\295.01\\\\-54.92211\\\\112.8422\\\\295.01\\\\-56.62057\\\\115.1859\\\\295.01\\\\-57.39671\\\\117.5297\\\\295.01\\\\-58.88357\\\\119.8734\\\\295.01\\\\-59.73514\\\\122.2172\\\\295.01\\\\-61.08647\\\\124.5609\\\\295.01\\\\-61.55913\\\\126.9047\\\\295.01\\\\-62.3125\\\\129.2484\\\\295.01\\\\-63.44866\\\\131.5922\\\\295.01\\\\-64.00282\\\\133.9359\\\\295.01\\\\-64.36475\\\\136.2797\\\\295.01\\\\-65.6146\\\\140.9672\\\\295.01\\\\-65.84246\\\\143.3109\\\\295.01\\\\-66.18851\\\\147.9984\\\\295.01\\\\-66.41199\\\\152.6859\\\\295.01\\\\-66.39387\\\\157.3734\\\\295.01\\\\-66.14896\\\\162.0609\\\\295.01\\\\-65.75378\\\\166.7484\\\\295.01\\\\-65.45489\\\\169.0922\\\\295.01\\\\-64.61088\\\\171.4359\\\\295.01\\\\-63.74142\\\\176.1234\\\\295.01\\\\-62.87364\\\\178.4672\\\\295.01\\\\-61.83551\\\\180.8109\\\\295.01\\\\-61.31699\\\\183.1547\\\\295.01\\\\-60.39734\\\\185.4984\\\\295.01\\\\-59.19819\\\\187.8422\\\\295.01\\\\-57.87465\\\\190.1859\\\\295.01\\\\-56.84821\\\\192.5297\\\\295.01\\\\-55.66406\\\\194.6634\\\\295.01\\\\-54.06846\\\\197.2172\\\\295.01\\\\-50.97656\\\\201.7629\\\\295.01\\\\-47.3112\\\\206.5922\\\\295.01\\\\-42.79436\\\\211.2797\\\\295.01\\\\-39.25781\\\\214.7107\\\\295.01\\\\-34.57031\\\\218.463\\\\295.01\\\\-32.22656\\\\219.9411\\\\295.01\\\\-27.96936\\\\222.9984\\\\295.01\\\\-27.53906\\\\223.3836\\\\295.01\\\\-25.19531\\\\224.406\\\\295.01\\\\-22.85156\\\\225.8094\\\\295.01\\\\-20.50781\\\\226.8905\\\\295.01\\\\-18.16406\\\\228.4055\\\\295.01\\\\-15.82031\\\\229.1319\\\\295.01\\\\-14.95299\\\\230.0297\\\\295.01\\\\-15.82031\\\\231.3646\\\\295.01\\\\-16.96898\\\\232.3734\\\\295.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"358\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"8\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0632\\\\298.01\\\\-27.53906\\\\233.1042\\\\298.01\\\\-29.88281\\\\233.0819\\\\298.01\\\\-34.57031\\\\233.131\\\\298.01\\\\-43.94531\\\\233.1221\\\\298.01\\\\-50.97656\\\\233.1736\\\\298.01\\\\-62.69531\\\\233.1397\\\\298.01\\\\-65.03906\\\\232.8376\\\\298.01\\\\-69.72656\\\\232.9839\\\\298.01\\\\-79.10156\\\\233.0245\\\\298.01\\\\-90.82031\\\\233.0382\\\\298.01\\\\-93.16406\\\\233.0859\\\\298.01\\\\-109.5703\\\\233.1132\\\\298.01\\\\-111.9141\\\\233.1791\\\\298.01\\\\-114.2578\\\\233.7139\\\\298.01\\\\-118.9453\\\\233.9793\\\\298.01\\\\-128.3203\\\\234.0284\\\\298.01\\\\-130.6641\\\\233.9793\\\\298.01\\\\-135.3516\\\\234.0591\\\\298.01\\\\-137.6953\\\\234.0284\\\\298.01\\\\-142.3828\\\\234.0855\\\\298.01\\\\-144.7266\\\\234.0284\\\\298.01\\\\-151.7578\\\\234.002\\\\298.01\\\\-158.7891\\\\234.0263\\\\298.01\\\\-163.4766\\\\233.9784\\\\298.01\\\\-165.8203\\\\234.0072\\\\298.01\\\\-168.1641\\\\234.1756\\\\298.01\\\\-170.5078\\\\234.2214\\\\298.01\\\\-179.8828\\\\234.1934\\\\298.01\\\\-186.9141\\\\234.2721\\\\298.01\\\\-189.2578\\\\234.2289\\\\298.01\\\\-193.9453\\\\234.2431\\\\298.01\\\\-198.6328\\\\234.1692\\\\298.01\\\\-200.9766\\\\234.2326\\\\298.01\\\\-205.6641\\\\234.1271\\\\298.01\\\\-212.6953\\\\234.2224\\\\298.01\\\\-215.0391\\\\234.1992\\\\298.01\\\\-222.0703\\\\234.3115\\\\298.01\\\\-224.4141\\\\234.2224\\\\298.01\\\\-226.7578\\\\234.2502\\\\298.01\\\\-233.7891\\\\234.0906\\\\298.01\\\\-238.4766\\\\234.0329\\\\298.01\\\\-243.1641\\\\234.0283\\\\298.01\\\\-247.8516\\\\233.7949\\\\298.01\\\\-250.1953\\\\233.8681\\\\298.01\\\\-252.5391\\\\234.7626\\\\298.01\\\\-254.3469\\\\237.0609\\\\298.01\\\\-255.6034\\\\239.4047\\\\298.01\\\\-254.5181\\\\241.7484\\\\298.01\\\\-254.2274\\\\244.0922\\\\298.01\\\\-254.181\\\\248.7797\\\\298.01\\\\-253.9355\\\\251.1234\\\\298.01\\\\-253.5926\\\\253.4672\\\\298.01\\\\-252.7483\\\\255.8109\\\\298.01\\\\-250.8092\\\\258.1547\\\\298.01\\\\-248.713\\\\260.4984\\\\298.01\\\\-246.263\\\\262.8422\\\\298.01\\\\-244.1406\\\\265.1859\\\\298.01\\\\-241.6671\\\\267.5297\\\\298.01\\\\-239.4754\\\\269.8734\\\\298.01\\\\-237.0156\\\\272.2172\\\\298.01\\\\-233.7891\\\\275.382\\\\298.01\\\\-231.4453\\\\277.8249\\\\298.01\\\\-229.1016\\\\279.9981\\\\298.01\\\\-226.7578\\\\282.5281\\\\298.01\\\\-224.4141\\\\284.6784\\\\298.01\\\\-222.0703\\\\287.2355\\\\298.01\\\\-220.5414\\\\288.6234\\\\298.01\\\\-218.2745\\\\290.9672\\\\298.01\\\\-217.3828\\\\291.6508\\\\298.01\\\\-212.6953\\\\294.5949\\\\298.01\\\\-210.3516\\\\295.3142\\\\298.01\\\\-208.0078\\\\296.4674\\\\298.01\\\\-205.6641\\\\296.8852\\\\298.01\\\\-203.3203\\\\297.1563\\\\298.01\\\\-196.2891\\\\297.1488\\\\298.01\\\\-193.9453\\\\297.0597\\\\298.01\\\\-182.2266\\\\296.9529\\\\298.01\\\\-168.1641\\\\296.8576\\\\298.01\\\\-154.1016\\\\296.9249\\\\298.01\\\\-149.4141\\\\296.8921\\\\298.01\\\\-128.3203\\\\296.9228\\\\298.01\\\\-121.2891\\\\296.8623\\\\298.01\\\\-111.9141\\\\296.8549\\\\298.01\\\\-107.2266\\\\296.8266\\\\298.01\\\\-102.5391\\\\296.8731\\\\298.01\\\\-95.50781\\\\296.8453\\\\298.01\\\\-88.47656\\\\296.9218\\\\298.01\\\\-83.78906\\\\296.9016\\\\298.01\\\\-69.72656\\\\296.979\\\\298.01\\\\-67.38281\\\\296.9514\\\\298.01\\\\-65.03906\\\\297.2199\\\\298.01\\\\-62.69531\\\\296.9622\\\\298.01\\\\-55.66406\\\\296.9926\\\\298.01\\\\-50.97656\\\\296.9467\\\\298.01\\\\-48.63281\\\\297.3652\\\\298.01\\\\-46.28906\\\\297.0439\\\\298.01\\\\-43.94531\\\\297.2875\\\\298.01\\\\-39.25781\\\\297.0121\\\\298.01\\\\-34.57031\\\\297.1564\\\\298.01\\\\-32.22656\\\\297.3612\\\\298.01\\\\-29.88281\\\\297.4229\\\\298.01\\\\-27.53906\\\\297.1687\\\\298.01\\\\-25.19531\\\\297.4334\\\\298.01\\\\-18.16406\\\\297.3612\\\\298.01\\\\-15.82031\\\\297.4441\\\\298.01\\\\-13.47656\\\\297.4125\\\\298.01\\\\-11.13281\\\\297.2468\\\\298.01\\\\-8.789063\\\\297.4125\\\\298.01\\\\-6.445313\\\\297.373\\\\298.01\\\\-4.101563\\\\297.4195\\\\298.01\\\\-1.757813\\\\297.077\\\\298.01\\\\0.5859375\\\\297.4229\\\\298.01\\\\2.929688\\\\297.4125\\\\298.01\\\\5.273438\\\\296.9489\\\\298.01\\\\7.617188\\\\297.3168\\\\298.01\\\\9.960938\\\\296.9377\\\\298.01\\\\12.30469\\\\296.8998\\\\298.01\\\\14.64844\\\\297.1975\\\\298.01\\\\16.99219\\\\296.8579\\\\298.01\\\\28.71094\\\\296.878\\\\298.01\\\\40.42969\\\\296.8163\\\\298.01\\\\42.77344\\\\296.8369\\\\298.01\\\\49.80469\\\\296.734\\\\298.01\\\\59.17969\\\\296.6906\\\\298.01\\\\61.52344\\\\296.6365\\\\298.01\\\\68.55469\\\\296.6278\\\\298.01\\\\73.24219\\\\296.5777\\\\298.01\\\\75.58594\\\\296.6191\\\\298.01\\\\84.96094\\\\296.5284\\\\298.01\\\\96.67969\\\\296.5538\\\\298.01\\\\103.7109\\\\296.479\\\\298.01\\\\115.4297\\\\296.4259\\\\298.01\\\\122.4609\\\\296.3434\\\\298.01\\\\129.4922\\\\296.3495\\\\298.01\\\\131.8359\\\\295.9141\\\\298.01\\\\136.5234\\\\296.2256\\\\298.01\\\\138.8672\\\\295.833\\\\298.01\\\\143.5547\\\\295.9857\\\\298.01\\\\145.8984\\\\295.8791\\\\298.01\\\\152.9297\\\\295.833\\\\298.01\\\\164.6484\\\\295.6819\\\\298.01\\\\171.6797\\\\295.6819\\\\298.01\\\\181.0547\\\\295.5401\\\\298.01\\\\185.7422\\\\295.5742\\\\298.01\\\\192.7734\\\\295.557\\\\298.01\\\\197.4609\\\\295.8012\\\\298.01\\\\202.1484\\\\295.6819\\\\298.01\\\\204.4922\\\\295.3698\\\\298.01\\\\206.8359\\\\294.803\\\\298.01\\\\209.1797\\\\294.3656\\\\298.01\\\\211.5234\\\\292.4764\\\\298.01\\\\213.8672\\\\291.1765\\\\298.01\\\\216.2109\\\\289.5873\\\\298.01\\\\217.229\\\\288.6234\\\\298.01\\\\218.5547\\\\287.0752\\\\298.01\\\\221.7097\\\\283.9359\\\\298.01\\\\225.5859\\\\279.8775\\\\298.01\\\\227.9297\\\\277.5633\\\\298.01\\\\230.2734\\\\275.0808\\\\298.01\\\\233.1989\\\\272.2172\\\\298.01\\\\234.9609\\\\270.2887\\\\298.01\\\\237.7384\\\\267.5297\\\\298.01\\\\241.9922\\\\263.0843\\\\298.01\\\\244.3359\\\\260.7643\\\\298.01\\\\246.788\\\\258.1547\\\\298.01\\\\249.0234\\\\255.451\\\\298.01\\\\250.3651\\\\253.4672\\\\298.01\\\\251.5297\\\\251.1234\\\\298.01\\\\252.1947\\\\248.7797\\\\298.01\\\\252.4915\\\\246.4359\\\\298.01\\\\252.5755\\\\241.7484\\\\298.01\\\\252.8592\\\\239.4047\\\\298.01\\\\252.9236\\\\237.0609\\\\298.01\\\\252.2924\\\\234.7172\\\\298.01\\\\251.3672\\\\233.4697\\\\298.01\\\\249.0234\\\\232.882\\\\298.01\\\\244.3359\\\\232.9048\\\\298.01\\\\241.9922\\\\233.0145\\\\298.01\\\\232.6172\\\\232.9048\\\\298.01\\\\227.9297\\\\233.0007\\\\298.01\\\\216.2109\\\\233.0632\\\\298.01\\\\211.5234\\\\233.0537\\\\298.01\\\\206.8359\\\\232.9699\\\\298.01\\\\204.4922\\\\232.7322\\\\298.01\\\\199.8047\\\\232.7186\\\\298.01\\\\190.4297\\\\232.7719\\\\298.01\\\\183.3984\\\\232.7719\\\\298.01\\\\181.0547\\\\232.7322\\\\298.01\\\\174.0234\\\\232.7048\\\\298.01\\\\171.6797\\\\232.7322\\\\298.01\\\\166.9922\\\\232.6908\\\\298.01\\\\157.6172\\\\232.7975\\\\298.01\\\\155.2734\\\\232.7588\\\\298.01\\\\148.2422\\\\232.7875\\\\298.01\\\\143.5547\\\\232.7614\\\\298.01\\\\138.8672\\\\232.6477\\\\298.01\\\\124.8047\\\\232.6179\\\\298.01\\\\122.4609\\\\232.6477\\\\298.01\\\\113.0859\\\\232.6027\\\\298.01\\\\110.7422\\\\232.4552\\\\298.01\\\\108.3984\\\\232.2192\\\\298.01\\\\106.0547\\\\231.6764\\\\298.01\\\\103.7109\\\\231.8559\\\\298.01\\\\102.8237\\\\232.3734\\\\298.01\\\\101.3672\\\\232.9839\\\\298.01\\\\99.02344\\\\233.0951\\\\298.01\\\\87.30469\\\\233.0819\\\\298.01\\\\84.96094\\\\233.1091\\\\298.01\\\\80.27344\\\\233.0726\\\\298.01\\\\77.92969\\\\233.1132\\\\298.01\\\\70.89844\\\\233.1397\\\\298.01\\\\68.55469\\\\233.1132\\\\298.01\\\\52.14844\\\\233.131\\\\298.01\\\\45.11719\\\\233.0859\\\\298.01\\\\44.16726\\\\232.3734\\\\298.01\\\\42.77344\\\\231.0206\\\\298.01\\\\42.04498\\\\230.0297\\\\298.01\\\\42.77344\\\\229.2462\\\\298.01\\\\45.11719\\\\228.5664\\\\298.01\\\\47.46094\\\\227.0695\\\\298.01\\\\49.80469\\\\226.0552\\\\298.01\\\\52.14844\\\\224.5723\\\\298.01\\\\54.49219\\\\223.6857\\\\298.01\\\\56.83594\\\\221.8519\\\\298.01\\\\59.17969\\\\220.2086\\\\298.01\\\\61.52344\\\\218.8854\\\\298.01\\\\64.94469\\\\215.9672\\\\298.01\\\\66.21094\\\\215.0191\\\\298.01\\\\67.72036\\\\213.6234\\\\298.01\\\\68.55469\\\\212.6986\\\\298.01\\\\70.89844\\\\210.5055\\\\298.01\\\\74.53191\\\\206.5922\\\\298.01\\\\76.54903\\\\204.2484\\\\298.01\\\\78.26105\\\\201.9047\\\\298.01\\\\80.27344\\\\198.9262\\\\298.01\\\\82.61719\\\\195.2822\\\\298.01\\\\82.98087\\\\194.8734\\\\298.01\\\\84.96094\\\\190.9255\\\\298.01\\\\85.43701\\\\190.1859\\\\298.01\\\\86.33423\\\\187.8422\\\\298.01\\\\87.78722\\\\185.4984\\\\298.01\\\\88.60233\\\\183.1547\\\\298.01\\\\89.10253\\\\180.8109\\\\298.01\\\\90.17504\\\\178.4672\\\\298.01\\\\90.88959\\\\176.1234\\\\298.01\\\\91.43783\\\\173.7797\\\\298.01\\\\92.39601\\\\171.4359\\\\298.01\\\\92.95762\\\\169.0922\\\\298.01\\\\93.55695\\\\159.7172\\\\298.01\\\\93.65527\\\\157.3734\\\\298.01\\\\93.67542\\\\152.6859\\\\298.01\\\\93.61213\\\\150.3422\\\\298.01\\\\93.22542\\\\143.3109\\\\298.01\\\\93.06345\\\\140.9672\\\\298.01\\\\92.77563\\\\138.6234\\\\298.01\\\\91.21714\\\\133.9359\\\\298.01\\\\90.67235\\\\131.5922\\\\298.01\\\\89.88776\\\\129.2484\\\\298.01\\\\88.8737\\\\126.9047\\\\298.01\\\\88.44087\\\\124.5609\\\\298.01\\\\86.09712\\\\119.8734\\\\298.01\\\\85.05786\\\\117.5297\\\\298.01\\\\83.87151\\\\115.1859\\\\298.01\\\\82.22388\\\\112.8422\\\\298.01\\\\81.09117\\\\110.4984\\\\298.01\\\\77.92969\\\\106.4052\\\\298.01\\\\77.3894\\\\105.8109\\\\298.01\\\\75.94332\\\\103.4672\\\\298.01\\\\71.71799\\\\98.77969\\\\298.01\\\\68.55469\\\\95.65721\\\\298.01\\\\63.86719\\\\91.54878\\\\298.01\\\\61.52344\\\\90.1121\\\\298.01\\\\59.17969\\\\88.15762\\\\298.01\\\\56.83594\\\\86.51503\\\\298.01\\\\54.49219\\\\85.42721\\\\298.01\\\\52.14844\\\\83.64907\\\\298.01\\\\49.80469\\\\82.89023\\\\298.01\\\\47.46094\\\\81.50237\\\\298.01\\\\45.11719\\\\80.62591\\\\298.01\\\\42.77344\\\\79.18153\\\\298.01\\\\40.42969\\\\78.7203\\\\298.01\\\\38.08594\\\\78.1349\\\\298.01\\\\35.74219\\\\77.11755\\\\298.01\\\\33.39844\\\\76.51949\\\\298.01\\\\31.05469\\\\76.07934\\\\298.01\\\\26.36719\\\\74.67744\\\\298.01\\\\24.02344\\\\74.42056\\\\298.01\\\\14.64844\\\\74.07317\\\\298.01\\\\9.960938\\\\74.11538\\\\298.01\\\\2.929688\\\\74.40105\\\\298.01\\\\0.5859375\\\\74.67952\\\\298.01\\\\-1.757813\\\\75.31406\\\\298.01\\\\-4.101563\\\\76.07065\\\\298.01\\\\-6.445313\\\\76.49051\\\\298.01\\\\-8.789063\\\\77.17276\\\\298.01\\\\-11.13281\\\\78.20097\\\\298.01\\\\-15.82031\\\\79.31967\\\\298.01\\\\-18.16406\\\\80.76948\\\\298.01\\\\-20.50781\\\\81.64266\\\\298.01\\\\-22.85156\\\\83.0305\\\\298.01\\\\-25.19531\\\\83.7937\\\\298.01\\\\-27.53906\\\\85.63515\\\\298.01\\\\-29.88281\\\\86.7363\\\\298.01\\\\-32.22656\\\\88.36089\\\\298.01\\\\-34.57031\\\\90.3302\\\\298.01\\\\-36.56719\\\\91.74844\\\\298.01\\\\-41.60156\\\\95.93605\\\\298.01\\\\-46.58845\\\\101.1234\\\\298.01\\\\-50.17995\\\\105.8109\\\\298.01\\\\-52.10386\\\\108.1547\\\\298.01\\\\-53.63992\\\\110.4984\\\\298.01\\\\-54.95532\\\\112.8422\\\\298.01\\\\-56.64794\\\\115.1859\\\\298.01\\\\-57.4403\\\\117.5297\\\\298.01\\\\-58.91927\\\\119.8734\\\\298.01\\\\-59.78655\\\\122.2172\\\\298.01\\\\-61.11754\\\\124.5609\\\\298.01\\\\-61.58921\\\\126.9047\\\\298.01\\\\-62.38012\\\\129.2484\\\\298.01\\\\-63.49118\\\\131.5922\\\\298.01\\\\-64.02599\\\\133.9359\\\\298.01\\\\-64.3932\\\\136.2797\\\\298.01\\\\-65.11897\\\\138.6234\\\\298.01\\\\-65.64544\\\\140.9672\\\\298.01\\\\-66.23938\\\\147.9984\\\\298.01\\\\-66.46289\\\\152.6859\\\\298.01\\\\-66.48911\\\\155.0297\\\\298.01\\\\-66.34437\\\\159.7172\\\\298.01\\\\-65.99894\\\\164.4047\\\\298.01\\\\-65.49149\\\\169.0922\\\\298.01\\\\-64.6875\\\\171.4359\\\\298.01\\\\-63.7739\\\\176.1234\\\\298.01\\\\-62.9398\\\\178.4672\\\\298.01\\\\-61.86011\\\\180.8109\\\\298.01\\\\-61.33423\\\\183.1547\\\\298.01\\\\-60.43332\\\\185.4984\\\\298.01\\\\-58.00781\\\\190.0632\\\\298.01\\\\-56.85406\\\\192.5297\\\\298.01\\\\-55.66406\\\\194.7283\\\\298.01\\\\-54.11692\\\\197.2172\\\\298.01\\\\-50.97656\\\\201.8369\\\\298.01\\\\-47.36435\\\\206.5922\\\\298.01\\\\-45.04395\\\\208.9359\\\\298.01\\\\-42.83026\\\\211.2797\\\\298.01\\\\-39.25781\\\\214.7435\\\\298.01\\\\-34.57031\\\\218.4974\\\\298.01\\\\-32.22656\\\\219.9595\\\\298.01\\\\-28.02053\\\\222.9984\\\\298.01\\\\-27.53906\\\\223.4238\\\\298.01\\\\-25.19531\\\\224.4187\\\\298.01\\\\-22.85156\\\\225.8252\\\\298.01\\\\-20.50781\\\\226.9067\\\\298.01\\\\-18.16406\\\\228.4286\\\\298.01\\\\-15.82031\\\\229.1235\\\\298.01\\\\-14.9447\\\\230.0297\\\\298.01\\\\-15.82031\\\\231.3969\\\\298.01\\\\-16.94484\\\\232.3734\\\\298.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"358\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"9\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-252.9673\\\\255.8109\\\\301.01\\\\-248.7477\\\\260.4984\\\\301.01\\\\-245.5078\\\\263.6263\\\\301.01\\\\-244.1215\\\\265.1859\\\\301.01\\\\-241.6381\\\\267.5297\\\\301.01\\\\-239.4403\\\\269.8734\\\\301.01\\\\-233.7891\\\\275.3765\\\\301.01\\\\-231.4453\\\\277.8215\\\\301.01\\\\-229.1016\\\\280.0093\\\\301.01\\\\-226.7578\\\\282.5186\\\\301.01\\\\-224.4141\\\\284.6481\\\\301.01\\\\-222.0703\\\\287.2057\\\\301.01\\\\-220.5227\\\\288.6234\\\\301.01\\\\-218.2914\\\\290.9672\\\\301.01\\\\-217.3828\\\\291.6599\\\\301.01\\\\-212.6953\\\\294.5939\\\\301.01\\\\-210.3516\\\\295.3008\\\\301.01\\\\-208.0078\\\\296.4424\\\\301.01\\\\-205.6641\\\\296.8595\\\\301.01\\\\-203.3203\\\\297.1563\\\\301.01\\\\-196.2891\\\\297.1563\\\\301.01\\\\-193.9453\\\\297.0746\\\\301.01\\\\-186.9141\\\\297.033\\\\301.01\\\\-177.5391\\\\296.8785\\\\301.01\\\\-165.8203\\\\296.8345\\\\301.01\\\\-151.7578\\\\296.8757\\\\301.01\\\\-149.4141\\\\296.8513\\\\301.01\\\\-140.0391\\\\296.8521\\\\301.01\\\\-137.6953\\\\296.886\\\\301.01\\\\-118.9453\\\\296.8623\\\\301.01\\\\-111.9141\\\\296.8078\\\\301.01\\\\-104.8828\\\\296.8456\\\\301.01\\\\-97.85156\\\\296.836\\\\301.01\\\\-93.16406\\\\296.8927\\\\301.01\\\\-86.13281\\\\296.9203\\\\301.01\\\\-81.44531\\\\296.8927\\\\301.01\\\\-74.41406\\\\296.9514\\\\301.01\\\\-58.00781\\\\296.9428\\\\301.01\\\\-53.32031\\\\296.9579\\\\301.01\\\\-50.97656\\\\296.9175\\\\301.01\\\\-48.63281\\\\297.0362\\\\301.01\\\\-46.28906\\\\296.9267\\\\301.01\\\\-43.94531\\\\297.2032\\\\301.01\\\\-41.60156\\\\297.3168\\\\301.01\\\\-39.25781\\\\296.8998\\\\301.01\\\\-34.57031\\\\297.3691\\\\301.01\\\\-32.22656\\\\297.2089\\\\301.01\\\\-29.88281\\\\297.4229\\\\301.01\\\\-27.53906\\\\297.3299\\\\301.01\\\\-25.19531\\\\297.4125\\\\301.01\\\\-13.47656\\\\297.4125\\\\301.01\\\\-11.13281\\\\297.252\\\\301.01\\\\-8.789063\\\\297.4055\\\\301.01\\\\-6.445313\\\\297.3015\\\\301.01\\\\-4.101563\\\\297.4125\\\\301.01\\\\-1.757813\\\\297.1261\\\\301.01\\\\0.5859375\\\\297.4229\\\\301.01\\\\2.929688\\\\297.4125\\\\301.01\\\\5.273438\\\\297.1687\\\\301.01\\\\7.617188\\\\297.0362\\\\301.01\\\\9.960938\\\\297.1516\\\\301.01\\\\12.30469\\\\296.8579\\\\301.01\\\\14.64844\\\\296.9396\\\\301.01\\\\19.33594\\\\296.8369\\\\301.01\\\\28.71094\\\\296.868\\\\301.01\\\\38.08594\\\\296.7858\\\\301.01\\\\45.11719\\\\296.7858\\\\301.01\\\\49.80469\\\\296.7115\\\\301.01\\\\54.49219\\\\296.7115\\\\301.01\\\\63.86719\\\\296.6154\\\\301.01\\\\66.21094\\\\296.6278\\\\301.01\\\\77.92969\\\\296.5901\\\\301.01\\\\80.27344\\\\296.5362\\\\301.01\\\\91.99219\\\\296.5284\\\\301.01\\\\94.33594\\\\296.5461\\\\301.01\\\\103.7109\\\\296.4917\\\\301.01\\\\106.0547\\\\296.5208\\\\301.01\\\\108.3984\\\\296.4462\\\\301.01\\\\120.1172\\\\296.3831\\\\301.01\\\\129.4922\\\\296.3139\\\\301.01\\\\134.1797\\\\295.9385\\\\301.01\\\\136.5234\\\\296.3023\\\\301.01\\\\138.8672\\\\295.833\\\\301.01\\\\141.2109\\\\295.939\\\\301.01\\\\155.2734\\\\295.7849\\\\301.01\\\\159.9609\\\\295.7849\\\\301.01\\\\169.3359\\\\295.6638\\\\301.01\\\\176.3672\\\\295.6638\\\\301.01\\\\181.0547\\\\295.5742\\\\301.01\\\\185.7422\\\\295.6093\\\\301.01\\\\192.7734\\\\295.5742\\\\301.01\\\\197.4609\\\\295.8172\\\\301.01\\\\202.1484\\\\295.6638\\\\301.01\\\\204.4922\\\\295.3698\\\\301.01\\\\206.8359\\\\294.8185\\\\301.01\\\\209.1797\\\\294.3828\\\\301.01\\\\211.5234\\\\292.4841\\\\301.01\\\\213.8672\\\\291.1916\\\\301.01\\\\216.2109\\\\289.6171\\\\301.01\\\\217.2534\\\\288.6234\\\\301.01\\\\218.5547\\\\287.0864\\\\301.01\\\\221.7097\\\\283.9359\\\\301.01\\\\225.5859\\\\279.9023\\\\301.01\\\\227.9297\\\\277.5431\\\\301.01\\\\230.2734\\\\275.0279\\\\301.01\\\\233.1732\\\\272.2172\\\\301.01\\\\234.9609\\\\270.242\\\\301.01\\\\237.6891\\\\267.5297\\\\301.01\\\\241.9922\\\\263.0863\\\\301.01\\\\244.3359\\\\260.7816\\\\301.01\\\\246.7498\\\\258.1547\\\\301.01\\\\249.0234\\\\255.4868\\\\301.01\\\\250.5381\\\\253.4672\\\\301.01\\\\251.9462\\\\251.1234\\\\301.01\\\\252.6083\\\\248.7797\\\\301.01\\\\253.1286\\\\246.4359\\\\301.01\\\\253.2715\\\\244.0922\\\\301.01\\\\253.323\\\\241.7484\\\\301.01\\\\254.0203\\\\239.4047\\\\301.01\\\\254.2562\\\\237.0609\\\\301.01\\\\253.7109\\\\236.3782\\\\301.01\\\\252.7413\\\\234.7172\\\\301.01\\\\251.3672\\\\233.1433\\\\301.01\\\\249.0234\\\\232.7162\\\\301.01\\\\246.6797\\\\232.5994\\\\301.01\\\\244.3359\\\\232.6145\\\\301.01\\\\241.9922\\\\232.8788\\\\301.01\\\\239.6484\\\\232.9594\\\\301.01\\\\232.6172\\\\232.9487\\\\301.01\\\\223.2422\\\\233.0498\\\\301.01\\\\211.5234\\\\233.0726\\\\301.01\\\\206.8359\\\\233.0007\\\\301.01\\\\204.4922\\\\232.7186\\\\301.01\\\\202.1484\\\\232.7048\\\\301.01\\\\195.1172\\\\232.7719\\\\301.01\\\\192.7734\\\\232.7456\\\\301.01\\\\183.3984\\\\232.7588\\\\301.01\\\\174.0234\\\\232.7322\\\\301.01\\\\164.6484\\\\232.7322\\\\301.01\\\\152.9297\\\\232.8003\\\\301.01\\\\145.8984\\\\232.7875\\\\301.01\\\\141.2109\\\\232.6908\\\\301.01\\\\134.1797\\\\232.6329\\\\301.01\\\\127.1484\\\\232.6329\\\\301.01\\\\124.8047\\\\232.5873\\\\301.01\\\\122.4609\\\\232.0753\\\\301.01\\\\120.1172\\\\232.6027\\\\301.01\\\\113.0859\\\\232.5873\\\\301.01\\\\110.7422\\\\231.8582\\\\301.01\\\\106.0547\\\\231.5762\\\\301.01\\\\103.7109\\\\231.6158\\\\301.01\\\\102.652\\\\232.3734\\\\301.01\\\\101.3672\\\\233.0044\\\\301.01\\\\99.02344\\\\233.091\\\\301.01\\\\89.64844\\\\233.0819\\\\301.01\\\\84.96094\\\\233.1132\\\\301.01\\\\66.21094\\\\233.1132\\\\301.01\\\\61.52344\\\\233.131\\\\301.01\\\\47.46094\\\\233.1132\\\\301.01\\\\45.11719\\\\233.0671\\\\301.01\\\\44.1887\\\\232.3734\\\\301.01\\\\42.77344\\\\231.0305\\\\301.01\\\\42.03629\\\\230.0297\\\\301.01\\\\42.77344\\\\229.2325\\\\301.01\\\\45.11719\\\\228.5376\\\\301.01\\\\47.46094\\\\227.0364\\\\301.01\\\\49.80469\\\\226.0128\\\\301.01\\\\52.14844\\\\224.5587\\\\301.01\\\\54.49219\\\\223.6608\\\\301.01\\\\56.83594\\\\221.833\\\\301.01\\\\59.17969\\\\220.1609\\\\301.01\\\\61.52344\\\\218.8188\\\\301.01\\\\64.90625\\\\215.9672\\\\301.01\\\\66.21094\\\\214.9687\\\\301.01\\\\67.67578\\\\213.6234\\\\301.01\\\\68.55469\\\\212.6704\\\\301.01\\\\70.89844\\\\210.4727\\\\301.01\\\\74.47953\\\\206.5922\\\\301.01\\\\76.50275\\\\204.2484\\\\301.01\\\\78.21651\\\\201.9047\\\\301.01\\\\80.27344\\\\198.8597\\\\301.01\\\\82.61719\\\\195.1853\\\\301.01\\\\82.89342\\\\194.8734\\\\301.01\\\\84.96094\\\\190.8408\\\\301.01\\\\85.38912\\\\190.1859\\\\301.01\\\\86.29591\\\\187.8422\\\\301.01\\\\87.73726\\\\185.4984\\\\301.01\\\\88.56714\\\\183.1547\\\\301.01\\\\89.0239\\\\180.8109\\\\301.01\\\\90.08218\\\\178.4672\\\\301.01\\\\90.826\\\\176.1234\\\\301.01\\\\91.33673\\\\173.7797\\\\301.01\\\\92.27242\\\\171.4359\\\\301.01\\\\92.92352\\\\169.0922\\\\301.01\\\\93.52101\\\\159.7172\\\\301.01\\\\93.68569\\\\155.0297\\\\301.01\\\\93.66122\\\\150.3422\\\\301.01\\\\93.03977\\\\140.9672\\\\301.01\\\\92.73054\\\\138.6234\\\\301.01\\\\91.17617\\\\133.9359\\\\301.01\\\\90.61806\\\\131.5922\\\\301.01\\\\89.82677\\\\129.2484\\\\301.01\\\\88.83517\\\\126.9047\\\\301.01\\\\88.39883\\\\124.5609\\\\301.01\\\\87.14217\\\\122.2172\\\\301.01\\\\83.83617\\\\115.1859\\\\301.01\\\\82.61719\\\\113.3482\\\\301.01\\\\82.16586\\\\112.8422\\\\301.01\\\\81.0612\\\\110.4984\\\\301.01\\\\77.92969\\\\106.4629\\\\301.01\\\\77.33624\\\\105.8109\\\\301.01\\\\75.88316\\\\103.4672\\\\301.01\\\\71.66676\\\\98.77969\\\\301.01\\\\68.55469\\\\95.70351\\\\301.01\\\\63.86719\\\\91.59751\\\\301.01\\\\61.52344\\\\90.16005\\\\301.01\\\\59.17969\\\\88.18321\\\\301.01\\\\56.83594\\\\86.57265\\\\301.01\\\\54.49219\\\\85.45554\\\\301.01\\\\52.14844\\\\83.67484\\\\301.01\\\\49.80469\\\\82.92365\\\\301.01\\\\47.46094\\\\81.52637\\\\301.01\\\\45.11719\\\\80.65604\\\\301.01\\\\42.77344\\\\79.19824\\\\301.01\\\\40.42969\\\\78.73884\\\\301.01\\\\38.08594\\\\78.15919\\\\301.01\\\\35.74219\\\\77.15002\\\\301.01\\\\33.39844\\\\76.53034\\\\301.01\\\\31.05469\\\\76.09643\\\\301.01\\\\26.36719\\\\74.69731\\\\301.01\\\\24.02344\\\\74.428\\\\301.01\\\\16.99219\\\\74.14042\\\\301.01\\\\12.30469\\\\74.06655\\\\301.01\\\\7.617188\\\\74.18246\\\\301.01\\\\2.929688\\\\74.39614\\\\301.01\\\\0.5859375\\\\74.67952\\\\301.01\\\\-4.101563\\\\76.04402\\\\301.01\\\\-6.445313\\\\76.46788\\\\301.01\\\\-8.789063\\\\77.11446\\\\301.01\\\\-11.13281\\\\78.1283\\\\301.01\\\\-15.82031\\\\79.30067\\\\301.01\\\\-18.16406\\\\80.75135\\\\301.01\\\\-20.50781\\\\81.63853\\\\301.01\\\\-22.85156\\\\82.99707\\\\301.01\\\\-25.19531\\\\83.76582\\\\301.01\\\\-27.53906\\\\85.60597\\\\301.01\\\\-29.88281\\\\86.70937\\\\301.01\\\\-32.22656\\\\88.32835\\\\301.01\\\\-34.57031\\\\90.28696\\\\301.01\\\\-36.60469\\\\91.74844\\\\301.01\\\\-41.60156\\\\95.87829\\\\301.01\\\\-46.64644\\\\101.1234\\\\301.01\\\\-50.23326\\\\105.8109\\\\301.01\\\\-52.14844\\\\108.1547\\\\301.01\\\\-53.7083\\\\110.4984\\\\301.01\\\\-54.99341\\\\112.8422\\\\301.01\\\\-56.69257\\\\115.1859\\\\301.01\\\\-57.50126\\\\117.5297\\\\301.01\\\\-58.9611\\\\119.8734\\\\301.01\\\\-59.86389\\\\122.2172\\\\301.01\\\\-61.15642\\\\124.5609\\\\301.01\\\\-61.63161\\\\126.9047\\\\301.01\\\\-62.48454\\\\129.2484\\\\301.01\\\\-63.52435\\\\131.5922\\\\301.01\\\\-64.05602\\\\133.9359\\\\301.01\\\\-64.42265\\\\136.2797\\\\301.01\\\\-65.18555\\\\138.6234\\\\301.01\\\\-65.68493\\\\140.9672\\\\301.01\\\\-66.26755\\\\147.9984\\\\301.01\\\\-66.50095\\\\152.6859\\\\301.01\\\\-66.53545\\\\155.0297\\\\301.01\\\\-66.39441\\\\159.7172\\\\301.01\\\\-66.05307\\\\164.4047\\\\301.01\\\\-65.51514\\\\169.0922\\\\301.01\\\\-64.74208\\\\171.4359\\\\301.01\\\\-64.20454\\\\173.7797\\\\301.01\\\\-63.7793\\\\176.1234\\\\301.01\\\\-62.91559\\\\178.4672\\\\301.01\\\\-61.86849\\\\180.8109\\\\301.01\\\\-61.33743\\\\183.1547\\\\301.01\\\\-60.35156\\\\185.6212\\\\301.01\\\\-57.99851\\\\190.1859\\\\301.01\\\\-56.86614\\\\192.5297\\\\301.01\\\\-55.66406\\\\194.816\\\\301.01\\\\-54.17318\\\\197.2172\\\\301.01\\\\-52.51101\\\\199.5609\\\\301.01\\\\-50.98609\\\\201.9047\\\\301.01\\\\-47.40362\\\\206.5922\\\\301.01\\\\-45.07058\\\\208.9359\\\\301.01\\\\-42.88062\\\\211.2797\\\\301.01\\\\-39.25781\\\\214.7825\\\\301.01\\\\-34.57031\\\\218.5488\\\\301.01\\\\-32.22656\\\\219.9976\\\\301.01\\\\-28.02734\\\\222.9984\\\\301.01\\\\-27.53906\\\\223.4429\\\\301.01\\\\-25.19531\\\\224.4472\\\\301.01\\\\-22.85156\\\\225.8554\\\\301.01\\\\-20.50781\\\\226.9317\\\\301.01\\\\-18.16406\\\\228.4426\\\\301.01\\\\-15.82031\\\\229.1456\\\\301.01\\\\-14.96138\\\\230.0297\\\\301.01\\\\-15.82031\\\\231.3675\\\\301.01\\\\-16.95703\\\\232.3734\\\\301.01\\\\-18.16406\\\\233.0671\\\\301.01\\\\-20.50781\\\\233.0537\\\\301.01\\\\-27.53906\\\\233.1221\\\\301.01\\\\-29.88281\\\\233.1042\\\\301.01\\\\-39.25781\\\\233.1397\\\\301.01\\\\-46.28906\\\\233.1221\\\\301.01\\\\-48.63281\\\\233.1652\\\\301.01\\\\-60.35156\\\\233.1818\\\\301.01\\\\-62.69531\\\\233.1483\\\\301.01\\\\-65.03906\\\\232.8735\\\\301.01\\\\-67.38281\\\\232.8735\\\\301.01\\\\-69.72656\\\\232.9839\\\\301.01\\\\-79.10156\\\\232.9942\\\\301.01\\\\-83.78906\\\\233.0537\\\\301.01\\\\-86.13281\\\\233.0283\\\\301.01\\\\-107.2266\\\\233.1132\\\\301.01\\\\-109.5703\\\\233.6324\\\\301.01\\\\-111.9141\\\\233.2523\\\\301.01\\\\-114.2578\\\\233.855\\\\301.01\\\\-118.9453\\\\233.9675\\\\301.01\\\\-123.6328\\\\234.0359\\\\301.01\\\\-128.3203\\\\234.054\\\\301.01\\\\-130.6641\\\\233.9859\\\\301.01\\\\-133.0078\\\\234.0284\\\\301.01\\\\-137.6953\\\\234.0158\\\\301.01\\\\-142.3828\\\\234.0805\\\\301.01\\\\-149.4141\\\\234.0088\\\\301.01\\\\-154.1016\\\\234.054\\\\301.01\\\\-165.8203\\\\233.9784\\\\301.01\\\\-168.1641\\\\234.1138\\\\301.01\\\\-172.8516\\\\234.1797\\\\301.01\\\\-179.8828\\\\234.1797\\\\301.01\\\\-184.5703\\\\234.2539\\\\301.01\\\\-198.6328\\\\234.1652\\\\301.01\\\\-200.9766\\\\234.2187\\\\301.01\\\\-205.6641\\\\234.1147\\\\301.01\\\\-208.0078\\\\234.1692\\\\301.01\\\\-217.3828\\\\234.2088\\\\301.01\\\\-222.0703\\\\234.2967\\\\301.01\\\\-224.4141\\\\234.2088\\\\301.01\\\\-229.1016\\\\234.2088\\\\301.01\\\\-238.4766\\\\234.0063\\\\301.01\\\\-243.1641\\\\233.9589\\\\301.01\\\\-245.5078\\\\233.8656\\\\301.01\\\\-247.8516\\\\233.8749\\\\301.01\\\\-250.1953\\\\233.9791\\\\301.01\\\\-252.5391\\\\234.4847\\\\301.01\\\\-254.8828\\\\236.4281\\\\301.01\\\\-255.4874\\\\237.0609\\\\301.01\\\\-256.2803\\\\239.4047\\\\301.01\\\\-255.8475\\\\241.7484\\\\301.01\\\\-255.5735\\\\244.0922\\\\301.01\\\\-255.6104\\\\246.4359\\\\301.01\\\\-255.4959\\\\248.7797\\\\301.01\\\\-254.8828\\\\250.669\\\\301.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"361\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n"; +const char* k_rtStruct_json03 = +" \"Value\" : \"-258.4268\\\\239.4047\\\\304.01\\\\-257.2636\\\\244.0922\\\\304.01\\\\-257.1989\\\\246.4359\\\\304.01\\\\-256.6301\\\\248.7797\\\\304.01\\\\-256.215\\\\251.1234\\\\304.01\\\\-254.8828\\\\253.3128\\\\304.01\\\\-253.1956\\\\255.8109\\\\304.01\\\\-252.5391\\\\256.5626\\\\304.01\\\\-250.1953\\\\258.8727\\\\304.01\\\\-247.8516\\\\261.3969\\\\304.01\\\\-245.5078\\\\263.5693\\\\304.01\\\\-244.0789\\\\265.1859\\\\304.01\\\\-241.5988\\\\267.5297\\\\304.01\\\\-239.4249\\\\269.8734\\\\304.01\\\\-233.7891\\\\275.3867\\\\304.01\\\\-231.4453\\\\277.8311\\\\304.01\\\\-229.1016\\\\280.0036\\\\304.01\\\\-226.7578\\\\282.5281\\\\304.01\\\\-224.4141\\\\284.6849\\\\304.01\\\\-222.0703\\\\287.2221\\\\304.01\\\\-220.5406\\\\288.6234\\\\304.01\\\\-218.2914\\\\290.9672\\\\304.01\\\\-217.3828\\\\291.6599\\\\304.01\\\\-214.8704\\\\293.3109\\\\304.01\\\\-212.6953\\\\294.634\\\\304.01\\\\-210.3516\\\\295.3279\\\\304.01\\\\-208.0078\\\\296.4424\\\\304.01\\\\-205.6641\\\\296.8732\\\\304.01\\\\-203.3203\\\\297.1639\\\\304.01\\\\-196.2891\\\\297.1639\\\\304.01\\\\-189.2578\\\\297.0197\\\\304.01\\\\-184.5703\\\\297.0141\\\\304.01\\\\-177.5391\\\\296.8785\\\\304.01\\\\-161.1328\\\\296.851\\\\304.01\\\\-149.4141\\\\296.8598\\\\304.01\\\\-128.3203\\\\296.895\\\\304.01\\\\-118.9453\\\\296.8887\\\\304.01\\\\-114.2578\\\\296.8266\\\\304.01\\\\-107.2266\\\\296.817\\\\304.01\\\\-104.8828\\\\296.8459\\\\304.01\\\\-97.85156\\\\296.8456\\\\304.01\\\\-93.16406\\\\296.9116\\\\304.01\\\\-90.82031\\\\296.8828\\\\304.01\\\\-81.44531\\\\296.9305\\\\304.01\\\\-79.10156\\\\296.9116\\\\304.01\\\\-72.07031\\\\296.979\\\\304.01\\\\-69.72656\\\\296.96\\\\304.01\\\\-58.00781\\\\296.9557\\\\304.01\\\\-53.32031\\\\297.4055\\\\304.01\\\\-50.97656\\\\297.1979\\\\304.01\\\\-48.63281\\\\297.1858\\\\304.01\\\\-46.28906\\\\297.4229\\\\304.01\\\\-41.60156\\\\297.3806\\\\304.01\\\\-39.25781\\\\297.0362\\\\304.01\\\\-36.91406\\\\297.4125\\\\304.01\\\\-34.57031\\\\297.4229\\\\304.01\\\\-32.22656\\\\297.1747\\\\304.01\\\\-29.88281\\\\297.4334\\\\304.01\\\\-25.19531\\\\297.4125\\\\304.01\\\\-18.16406\\\\297.4334\\\\304.01\\\\-8.789063\\\\297.4195\\\\304.01\\\\-6.445313\\\\297.3383\\\\304.01\\\\-4.101563\\\\297.4125\\\\304.01\\\\0.5859375\\\\297.4195\\\\304.01\\\\2.929688\\\\297.0439\\\\304.01\\\\5.273438\\\\297.273\\\\304.01\\\\7.617188\\\\296.9841\\\\304.01\\\\12.30469\\\\296.8673\\\\304.01\\\\26.36719\\\\296.8574\\\\304.01\\\\35.74219\\\\296.8163\\\\304.01\\\\38.08594\\\\296.7654\\\\304.01\\\\45.11719\\\\296.7761\\\\304.01\\\\52.14844\\\\296.6929\\\\304.01\\\\54.49219\\\\296.7115\\\\304.01\\\\61.52344\\\\296.6724\\\\304.01\\\\63.86719\\\\296.6241\\\\304.01\\\\91.99219\\\\296.4947\\\\304.01\\\\94.33594\\\\296.5412\\\\304.01\\\\103.7109\\\\296.466\\\\304.01\\\\106.0547\\\\296.4801\\\\304.01\\\\115.4297\\\\296.391\\\\304.01\\\\117.7734\\\\296.4051\\\\304.01\\\\124.8047\\\\296.3288\\\\304.01\\\\131.8359\\\\296.2987\\\\304.01\\\\134.1797\\\\295.9161\\\\304.01\\\\136.5234\\\\295.8172\\\\304.01\\\\143.5547\\\\295.8791\\\\304.01\\\\148.2422\\\\295.8791\\\\304.01\\\\155.2734\\\\295.7849\\\\304.01\\\\159.9609\\\\295.7684\\\\304.01\\\\169.3359\\\\295.6454\\\\304.01\\\\171.6797\\\\295.6819\\\\304.01\\\\178.7109\\\\295.6454\\\\304.01\\\\181.0547\\\\295.5742\\\\304.01\\\\185.7422\\\\295.5916\\\\304.01\\\\192.7734\\\\295.557\\\\304.01\\\\197.4609\\\\295.8172\\\\304.01\\\\202.1484\\\\295.6819\\\\304.01\\\\204.4922\\\\295.3842\\\\304.01\\\\206.8359\\\\294.8185\\\\304.01\\\\209.1797\\\\294.3828\\\\304.01\\\\211.5234\\\\292.4841\\\\304.01\\\\213.8672\\\\291.1765\\\\304.01\\\\216.2109\\\\289.5873\\\\304.01\\\\217.229\\\\288.6234\\\\304.01\\\\218.5547\\\\287.0752\\\\304.01\\\\221.7204\\\\283.9359\\\\304.01\\\\225.5859\\\\279.9071\\\\304.01\\\\227.9297\\\\277.5303\\\\304.01\\\\230.2734\\\\275.0172\\\\304.01\\\\233.1467\\\\272.2172\\\\304.01\\\\234.9609\\\\270.242\\\\304.01\\\\237.7046\\\\267.5297\\\\304.01\\\\239.6484\\\\265.4887\\\\304.01\\\\244.3359\\\\260.7987\\\\304.01\\\\249.0234\\\\255.6807\\\\304.01\\\\251.3672\\\\252.8391\\\\304.01\\\\252.5586\\\\251.1234\\\\304.01\\\\254.0274\\\\248.7797\\\\304.01\\\\254.9669\\\\246.4359\\\\304.01\\\\255.696\\\\241.7484\\\\304.01\\\\255.9729\\\\239.4047\\\\304.01\\\\255.8408\\\\237.0609\\\\304.01\\\\254.6498\\\\234.7172\\\\304.01\\\\253.7109\\\\233.7838\\\\304.01\\\\251.3672\\\\232.8072\\\\304.01\\\\249.0234\\\\232.5688\\\\304.01\\\\246.6797\\\\232.4189\\\\304.01\\\\244.3359\\\\232.4365\\\\304.01\\\\241.9922\\\\232.8195\\\\304.01\\\\239.6484\\\\232.9699\\\\304.01\\\\234.9609\\\\232.9906\\\\304.01\\\\230.2734\\\\232.9594\\\\304.01\\\\225.5859\\\\233.0305\\\\304.01\\\\211.5234\\\\233.0632\\\\304.01\\\\206.8359\\\\232.9906\\\\304.01\\\\204.4922\\\\232.7048\\\\304.01\\\\199.8047\\\\232.6908\\\\304.01\\\\195.1172\\\\232.7456\\\\304.01\\\\190.4297\\\\232.7186\\\\304.01\\\\183.3984\\\\232.7588\\\\304.01\\\\174.0234\\\\232.7322\\\\304.01\\\\164.6484\\\\232.7322\\\\304.01\\\\157.6172\\\\232.7848\\\\304.01\\\\143.5547\\\\232.7746\\\\304.01\\\\138.8672\\\\232.6477\\\\304.01\\\\131.8359\\\\232.6623\\\\304.01\\\\127.1484\\\\232.6179\\\\304.01\\\\124.8047\\\\232.2817\\\\304.01\\\\122.4609\\\\231.7518\\\\304.01\\\\120.1172\\\\232.5557\\\\304.01\\\\113.0859\\\\232.5396\\\\304.01\\\\110.7422\\\\232.0028\\\\304.01\\\\108.3984\\\\231.6882\\\\304.01\\\\106.0547\\\\231.5762\\\\304.01\\\\103.7109\\\\231.6396\\\\304.01\\\\102.8085\\\\232.3734\\\\304.01\\\\101.3672\\\\233.0819\\\\304.01\\\\99.02344\\\\233.1221\\\\304.01\\\\91.99219\\\\233.091\\\\304.01\\\\84.96094\\\\233.131\\\\304.01\\\\80.27344\\\\233.1132\\\\304.01\\\\70.89844\\\\233.1483\\\\304.01\\\\59.17969\\\\233.1221\\\\304.01\\\\54.49219\\\\233.1483\\\\304.01\\\\47.46094\\\\233.1397\\\\304.01\\\\45.11719\\\\233.0951\\\\304.01\\\\44.15678\\\\232.3734\\\\304.01\\\\42.77344\\\\231.0402\\\\304.01\\\\42.0277\\\\230.0297\\\\304.01\\\\42.77344\\\\229.2236\\\\304.01\\\\45.11719\\\\228.5376\\\\304.01\\\\47.46094\\\\227.0172\\\\304.01\\\\49.80469\\\\226.0045\\\\304.01\\\\52.14844\\\\224.5497\\\\304.01\\\\54.49219\\\\223.6396\\\\304.01\\\\56.83594\\\\221.8073\\\\304.01\\\\59.17969\\\\220.1493\\\\304.01\\\\61.52344\\\\218.7845\\\\304.01\\\\64.88177\\\\215.9672\\\\304.01\\\\66.21094\\\\214.941\\\\304.01\\\\68.55469\\\\212.6457\\\\304.01\\\\70.89844\\\\210.4545\\\\304.01\\\\74.44025\\\\206.5922\\\\304.01\\\\76.45425\\\\204.2484\\\\304.01\\\\78.18552\\\\201.9047\\\\304.01\\\\80.27344\\\\198.8021\\\\304.01\\\\82.61719\\\\195.0944\\\\304.01\\\\82.81684\\\\194.8734\\\\304.01\\\\85.33871\\\\190.1859\\\\304.01\\\\86.25837\\\\187.8422\\\\304.01\\\\87.69531\\\\185.4984\\\\304.01\\\\88.53373\\\\183.1547\\\\304.01\\\\88.98369\\\\180.8109\\\\304.01\\\\90.01319\\\\178.4672\\\\304.01\\\\90.75238\\\\176.1234\\\\304.01\\\\91.26373\\\\173.7797\\\\304.01\\\\92.16087\\\\171.4359\\\\304.01\\\\92.84856\\\\169.0922\\\\304.01\\\\93.08162\\\\166.7484\\\\304.01\\\\93.46188\\\\159.7172\\\\304.01\\\\93.63705\\\\157.3734\\\\304.01\\\\93.71725\\\\155.0297\\\\304.01\\\\94.1173\\\\152.6859\\\\304.01\\\\95.2567\\\\150.3422\\\\304.01\\\\94.33594\\\\149.3719\\\\304.01\\\\93.55707\\\\147.9984\\\\304.01\\\\93.31775\\\\145.6547\\\\304.01\\\\93.0161\\\\140.9672\\\\304.01\\\\92.68435\\\\138.6234\\\\304.01\\\\91.79828\\\\136.2797\\\\304.01\\\\91.12964\\\\133.9359\\\\304.01\\\\90.57047\\\\131.5922\\\\304.01\\\\89.74536\\\\129.2484\\\\304.01\\\\88.82685\\\\126.9047\\\\304.01\\\\88.37492\\\\124.5609\\\\304.01\\\\87.09542\\\\122.2172\\\\304.01\\\\83.81286\\\\115.1859\\\\304.01\\\\82.08039\\\\112.8422\\\\304.01\\\\81.03055\\\\110.4984\\\\304.01\\\\77.92969\\\\106.5352\\\\304.01\\\\77.27783\\\\105.8109\\\\304.01\\\\75.79013\\\\103.4672\\\\304.01\\\\71.63571\\\\98.77969\\\\304.01\\\\68.55469\\\\95.73435\\\\304.01\\\\63.86719\\\\91.66604\\\\304.01\\\\61.52344\\\\90.20212\\\\304.01\\\\59.17969\\\\88.20197\\\\304.01\\\\56.83594\\\\86.62436\\\\304.01\\\\54.49219\\\\85.48727\\\\304.01\\\\52.14844\\\\83.70115\\\\304.01\\\\49.80469\\\\82.94526\\\\304.01\\\\47.46094\\\\81.53912\\\\304.01\\\\45.11719\\\\80.67555\\\\304.01\\\\42.77344\\\\79.20674\\\\304.01\\\\38.08594\\\\78.20923\\\\304.01\\\\35.74219\\\\77.17549\\\\304.01\\\\33.39844\\\\76.53049\\\\304.01\\\\31.05469\\\\76.11316\\\\304.01\\\\26.36719\\\\74.72801\\\\304.01\\\\24.02344\\\\74.428\\\\304.01\\\\16.99219\\\\74.14042\\\\304.01\\\\12.30469\\\\74.08618\\\\304.01\\\\7.617188\\\\74.18843\\\\304.01\\\\2.929688\\\\74.3889\\\\304.01\\\\0.5859375\\\\74.66957\\\\304.01\\\\-4.101563\\\\76.00713\\\\304.01\\\\-6.445313\\\\76.45148\\\\304.01\\\\-8.789063\\\\77.1\\\\304.01\\\\-11.13281\\\\78.06062\\\\304.01\\\\-15.82031\\\\79.2827\\\\304.01\\\\-18.16406\\\\80.74213\\\\304.01\\\\-20.50781\\\\81.62949\\\\304.01\\\\-22.85156\\\\82.96635\\\\304.01\\\\-25.19531\\\\83.75838\\\\304.01\\\\-27.53906\\\\85.57612\\\\304.01\\\\-29.88281\\\\86.67031\\\\304.01\\\\-32.22656\\\\88.3215\\\\304.01\\\\-34.57031\\\\90.27851\\\\304.01\\\\-36.65471\\\\91.74844\\\\304.01\\\\-39.25781\\\\93.84944\\\\304.01\\\\-41.60156\\\\95.82625\\\\304.01\\\\-46.73052\\\\101.1234\\\\304.01\\\\-50.25593\\\\105.8109\\\\304.01\\\\-52.17377\\\\108.1547\\\\304.01\\\\-53.74715\\\\110.4984\\\\304.01\\\\-55.05993\\\\112.8422\\\\304.01\\\\-56.70641\\\\115.1859\\\\304.01\\\\-57.55294\\\\117.5297\\\\304.01\\\\-59.00451\\\\119.8734\\\\304.01\\\\-59.93574\\\\122.2172\\\\304.01\\\\-61.16483\\\\124.5609\\\\304.01\\\\-61.67763\\\\126.9047\\\\304.01\\\\-62.54883\\\\129.2484\\\\304.01\\\\-63.58032\\\\131.5922\\\\304.01\\\\-64.08025\\\\133.9359\\\\304.01\\\\-64.47405\\\\136.2797\\\\304.01\\\\-65.29311\\\\138.6234\\\\304.01\\\\-65.704\\\\140.9672\\\\304.01\\\\-66.11191\\\\145.6547\\\\304.01\\\\-66.44185\\\\150.3422\\\\304.01\\\\-66.55173\\\\155.0297\\\\304.01\\\\-66.54406\\\\157.3734\\\\304.01\\\\-66.41875\\\\159.7172\\\\304.01\\\\-66.08267\\\\164.4047\\\\304.01\\\\-65.54951\\\\169.0922\\\\304.01\\\\-64.81466\\\\171.4359\\\\304.01\\\\-64.22777\\\\173.7797\\\\304.01\\\\-63.82658\\\\176.1234\\\\304.01\\\\-63.00951\\\\178.4672\\\\304.01\\\\-61.88151\\\\180.8109\\\\304.01\\\\-61.35514\\\\183.1547\\\\304.01\\\\-60.35156\\\\185.6658\\\\304.01\\\\-58.00781\\\\190.247\\\\304.01\\\\-55.71056\\\\194.8734\\\\304.01\\\\-54.20731\\\\197.2172\\\\304.01\\\\-52.52815\\\\199.5609\\\\304.01\\\\-51.09558\\\\201.9047\\\\304.01\\\\-48.63281\\\\204.9516\\\\304.01\\\\-47.4356\\\\206.5922\\\\304.01\\\\-45.0904\\\\208.9359\\\\304.01\\\\-42.90285\\\\211.2797\\\\304.01\\\\-39.25781\\\\214.8017\\\\304.01\\\\-34.92887\\\\218.3109\\\\304.01\\\\-34.57031\\\\218.6566\\\\304.01\\\\-32.22656\\\\220.0173\\\\304.01\\\\-31.40713\\\\220.6547\\\\304.01\\\\-28.07253\\\\222.9984\\\\304.01\\\\-27.53906\\\\223.4814\\\\304.01\\\\-25.19531\\\\224.4633\\\\304.01\\\\-22.85156\\\\225.8906\\\\304.01\\\\-20.50781\\\\226.9488\\\\304.01\\\\-18.16406\\\\228.4606\\\\304.01\\\\-15.82031\\\\229.1542\\\\304.01\\\\-14.96987\\\\230.0297\\\\304.01\\\\-15.82031\\\\231.3705\\\\304.01\\\\-16.94484\\\\232.3734\\\\304.01\\\\-18.16406\\\\233.0671\\\\304.01\\\\-25.19531\\\\233.091\\\\304.01\\\\-27.53906\\\\233.131\\\\304.01\\\\-43.94531\\\\233.1397\\\\304.01\\\\-46.28906\\\\233.1221\\\\304.01\\\\-55.66406\\\\233.19\\\\304.01\\\\-62.69531\\\\233.1652\\\\304.01\\\\-65.03906\\\\232.8767\\\\304.01\\\\-67.38281\\\\232.8735\\\\304.01\\\\-72.07031\\\\233.0044\\\\304.01\\\\-79.10156\\\\232.9735\\\\304.01\\\\-83.78906\\\\233.0441\\\\304.01\\\\-102.5391\\\\233.0951\\\\304.01\\\\-104.8828\\\\233.1525\\\\304.01\\\\-107.2266\\\\233.3238\\\\304.01\\\\-109.5703\\\\234.0489\\\\304.01\\\\-116.6016\\\\233.9967\\\\304.01\\\\-123.6328\\\\234.0805\\\\304.01\\\\-128.3203\\\\234.0855\\\\304.01\\\\-130.6641\\\\234.0088\\\\304.01\\\\-135.3516\\\\234.0722\\\\304.01\\\\-137.6953\\\\234.0591\\\\304.01\\\\-142.3828\\\\234.1266\\\\304.01\\\\-149.4141\\\\234.0722\\\\304.01\\\\-158.7891\\\\234.0772\\\\304.01\\\\-165.8203\\\\233.9901\\\\304.01\\\\-168.1641\\\\234.1182\\\\304.01\\\\-172.8516\\\\234.1837\\\\304.01\\\\-177.5391\\\\234.1837\\\\304.01\\\\-184.5703\\\\234.2574\\\\304.01\\\\-193.9453\\\\234.1916\\\\304.01\\\\-200.9766\\\\234.2224\\\\304.01\\\\-205.6641\\\\234.1652\\\\304.01\\\\-212.6953\\\\234.2362\\\\304.01\\\\-217.3828\\\\234.2502\\\\304.01\\\\-222.0703\\\\234.3418\\\\304.01\\\\-233.7891\\\\234.1026\\\\304.01\\\\-238.4766\\\\234.0555\\\\304.01\\\\-243.1641\\\\234.0626\\\\304.01\\\\-245.5078\\\\233.9906\\\\304.01\\\\-247.8516\\\\234.0236\\\\304.01\\\\-252.5391\\\\234.2887\\\\304.01\\\\-254.8828\\\\235.3755\\\\304.01\\\\-256.6911\\\\237.0609\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"361\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0859\\\\307.01\\\\-27.53906\\\\233.1221\\\\307.01\\\\-46.28906\\\\233.131\\\\307.01\\\\-58.00781\\\\233.19\\\\307.01\\\\-62.69531\\\\233.1736\\\\307.01\\\\-65.03906\\\\232.5396\\\\307.01\\\\-67.38281\\\\232.8735\\\\307.01\\\\-72.07031\\\\233.0145\\\\307.01\\\\-79.10156\\\\232.9839\\\\307.01\\\\-83.78906\\\\233.0441\\\\307.01\\\\-95.50781\\\\233.0859\\\\307.01\\\\-97.85156\\\\233.1345\\\\307.01\\\\-100.1953\\\\233.09\\\\307.01\\\\-102.5391\\\\233.2952\\\\307.01\\\\-104.8828\\\\234.0051\\\\307.01\\\\-107.2266\\\\233.8864\\\\307.01\\\\-109.5703\\\\234.0891\\\\307.01\\\\-116.6016\\\\233.9967\\\\307.01\\\\-123.6328\\\\234.0941\\\\307.01\\\\-128.3203\\\\234.1127\\\\307.01\\\\-130.6641\\\\234.0463\\\\307.01\\\\-133.0078\\\\234.099\\\\307.01\\\\-140.0391\\\\234.099\\\\307.01\\\\-142.3828\\\\234.1453\\\\307.01\\\\-149.4141\\\\234.099\\\\307.01\\\\-151.7578\\\\234.1313\\\\307.01\\\\-165.8203\\\\233.9901\\\\307.01\\\\-168.1641\\\\234.1182\\\\307.01\\\\-172.8516\\\\234.1973\\\\307.01\\\\-175.1953\\\\234.1934\\\\307.01\\\\-186.9141\\\\234.302\\\\307.01\\\\-189.2578\\\\234.2431\\\\307.01\\\\-191.6016\\\\234.2721\\\\307.01\\\\-198.6328\\\\234.2187\\\\307.01\\\\-200.9766\\\\234.2326\\\\307.01\\\\-205.6641\\\\234.1523\\\\307.01\\\\-208.0078\\\\234.2088\\\\307.01\\\\-217.3828\\\\234.2644\\\\307.01\\\\-222.0703\\\\234.3731\\\\307.01\\\\-226.7578\\\\234.3084\\\\307.01\\\\-233.7891\\\\234.1271\\\\307.01\\\\-243.1641\\\\234.1783\\\\307.01\\\\-247.8516\\\\233.9385\\\\307.01\\\\-252.5391\\\\234.1396\\\\307.01\\\\-254.8828\\\\234.6465\\\\307.01\\\\-257.2266\\\\235.5375\\\\307.01\\\\-259.5389\\\\237.0609\\\\307.01\\\\-261.1549\\\\239.4047\\\\307.01\\\\-261.1453\\\\241.7484\\\\307.01\\\\-260.4097\\\\244.0922\\\\307.01\\\\-258.4325\\\\248.7797\\\\307.01\\\\-257.2266\\\\250.7551\\\\307.01\\\\-255.4608\\\\253.4672\\\\307.01\\\\-252.5391\\\\256.6329\\\\307.01\\\\-250.1953\\\\258.8892\\\\307.01\\\\-247.8516\\\\261.4029\\\\307.01\\\\-245.5078\\\\263.58\\\\307.01\\\\-244.0815\\\\265.1859\\\\307.01\\\\-241.6044\\\\267.5297\\\\307.01\\\\-239.4249\\\\269.8734\\\\307.01\\\\-236.9699\\\\272.2172\\\\307.01\\\\-233.7891\\\\275.3877\\\\307.01\\\\-231.4453\\\\277.8249\\\\307.01\\\\-229.1016\\\\280.0036\\\\307.01\\\\-226.7578\\\\282.5186\\\\307.01\\\\-225.1687\\\\283.9359\\\\307.01\\\\-222.0703\\\\287.2188\\\\307.01\\\\-220.5469\\\\288.6234\\\\307.01\\\\-218.3018\\\\290.9672\\\\307.01\\\\-217.3828\\\\291.669\\\\307.01\\\\-212.6953\\\\294.6293\\\\307.01\\\\-210.3516\\\\295.3142\\\\307.01\\\\-208.0078\\\\296.4338\\\\307.01\\\\-205.6641\\\\296.8865\\\\307.01\\\\-203.3203\\\\297.1639\\\\307.01\\\\-196.2891\\\\297.1639\\\\307.01\\\\-191.6016\\\\297.0361\\\\307.01\\\\-186.9141\\\\297.0219\\\\307.01\\\\-179.8828\\\\296.9526\\\\307.01\\\\-175.1953\\\\296.8713\\\\307.01\\\\-161.1328\\\\296.8585\\\\307.01\\\\-158.7891\\\\296.8764\\\\307.01\\\\-149.4141\\\\296.8598\\\\307.01\\\\-147.0703\\\\296.8931\\\\307.01\\\\-140.0391\\\\296.8779\\\\307.01\\\\-128.3203\\\\296.9292\\\\307.01\\\\-118.9453\\\\296.9053\\\\307.01\\\\-114.2578\\\\296.845\\\\307.01\\\\-97.85156\\\\296.8459\\\\307.01\\\\-90.82031\\\\296.9116\\\\307.01\\\\-79.10156\\\\296.9116\\\\307.01\\\\-72.07031\\\\296.979\\\\307.01\\\\-69.72656\\\\296.9409\\\\307.01\\\\-65.03906\\\\296.9644\\\\307.01\\\\-58.00781\\\\296.9377\\\\307.01\\\\-55.66406\\\\297.3491\\\\307.01\\\\-53.32031\\\\297.1261\\\\307.01\\\\-50.97656\\\\297.3612\\\\307.01\\\\-48.63281\\\\296.9285\\\\307.01\\\\-46.28906\\\\297.4229\\\\307.01\\\\-41.60156\\\\297.416\\\\307.01\\\\-39.25781\\\\297.3425\\\\307.01\\\\-34.57031\\\\297.4229\\\\307.01\\\\-29.88281\\\\297.2875\\\\307.01\\\\-27.53906\\\\297.3947\\\\307.01\\\\-22.85156\\\\297.3077\\\\307.01\\\\-20.50781\\\\297.4125\\\\307.01\\\\-15.82031\\\\297.3768\\\\307.01\\\\-13.47656\\\\297.4125\\\\307.01\\\\-11.13281\\\\297.2579\\\\307.01\\\\-8.789063\\\\297.4229\\\\307.01\\\\-4.101563\\\\297.4055\\\\307.01\\\\0.5859375\\\\297.3148\\\\307.01\\\\2.929688\\\\296.9267\\\\307.01\\\\5.273438\\\\297.2621\\\\307.01\\\\7.617188\\\\297.257\\\\307.01\\\\9.960938\\\\296.9447\\\\307.01\\\\12.30469\\\\296.868\\\\307.01\\\\24.02344\\\\296.8266\\\\307.01\\\\26.36719\\\\296.878\\\\307.01\\\\33.39844\\\\296.7761\\\\307.01\\\\47.46094\\\\296.7546\\\\307.01\\\\52.14844\\\\296.6839\\\\307.01\\\\61.52344\\\\296.6635\\\\307.01\\\\68.55469\\\\296.6028\\\\307.01\\\\77.92969\\\\296.5859\\\\307.01\\\\80.27344\\\\296.5309\\\\307.01\\\\84.96094\\\\296.5362\\\\307.01\\\\91.99219\\\\296.4947\\\\307.01\\\\96.67969\\\\296.5208\\\\307.01\\\\108.3984\\\\296.4194\\\\307.01\\\\117.7734\\\\296.3986\\\\307.01\\\\120.1172\\\\296.3578\\\\307.01\\\\131.8359\\\\296.2929\\\\307.01\\\\134.1797\\\\295.8184\\\\307.01\\\\138.8672\\\\295.9218\\\\307.01\\\\141.2109\\\\296.2507\\\\307.01\\\\143.5547\\\\295.8486\\\\307.01\\\\150.5859\\\\295.8791\\\\307.01\\\\155.2734\\\\295.8012\\\\307.01\\\\159.9609\\\\295.7684\\\\307.01\\\\169.3359\\\\295.6454\\\\307.01\\\\171.6797\\\\295.7173\\\\307.01\\\\181.0547\\\\295.5742\\\\307.01\\\\183.3984\\\\295.6272\\\\307.01\\\\190.4297\\\\295.557\\\\307.01\\\\192.7734\\\\295.5742\\\\307.01\\\\197.4609\\\\295.8172\\\\307.01\\\\199.8047\\\\295.8012\\\\307.01\\\\202.1484\\\\295.6998\\\\307.01\\\\204.4922\\\\295.3989\\\\307.01\\\\206.8359\\\\294.8185\\\\307.01\\\\209.1797\\\\294.3828\\\\307.01\\\\211.5234\\\\292.4841\\\\307.01\\\\213.8672\\\\291.1765\\\\307.01\\\\216.2109\\\\289.6034\\\\307.01\\\\217.2454\\\\288.6234\\\\307.01\\\\218.5547\\\\287.0864\\\\307.01\\\\221.7204\\\\283.9359\\\\307.01\\\\225.5859\\\\279.8821\\\\307.01\\\\228.5326\\\\276.9047\\\\307.01\\\\230.2734\\\\275.0424\\\\307.01\\\\233.137\\\\272.2172\\\\307.01\\\\234.9609\\\\270.245\\\\307.01\\\\237.6922\\\\267.5297\\\\307.01\\\\246.856\\\\258.1547\\\\307.01\\\\251.3768\\\\253.4672\\\\307.01\\\\253.166\\\\251.1234\\\\307.01\\\\255.1239\\\\248.7797\\\\307.01\\\\256.5218\\\\246.4359\\\\307.01\\\\257.6041\\\\244.0922\\\\307.01\\\\258.817\\\\241.7484\\\\307.01\\\\259.2578\\\\239.4047\\\\307.01\\\\258.9535\\\\237.0609\\\\307.01\\\\256.0547\\\\234.1196\\\\307.01\\\\253.7109\\\\233.131\\\\307.01\\\\251.3672\\\\232.5372\\\\307.01\\\\244.3359\\\\232.7139\\\\307.01\\\\241.9922\\\\232.9015\\\\307.01\\\\239.6484\\\\232.9906\\\\307.01\\\\234.9609\\\\232.9803\\\\307.01\\\\225.5859\\\\233.0305\\\\307.01\\\\211.5234\\\\233.0632\\\\307.01\\\\206.8359\\\\233.0007\\\\307.01\\\\204.4922\\\\232.7186\\\\307.01\\\\199.8047\\\\232.6767\\\\307.01\\\\195.1172\\\\232.7588\\\\307.01\\\\190.4297\\\\232.7186\\\\307.01\\\\183.3984\\\\232.7588\\\\307.01\\\\169.3359\\\\232.7456\\\\307.01\\\\166.9922\\\\232.7186\\\\307.01\\\\157.6172\\\\232.7848\\\\307.01\\\\152.9297\\\\232.7588\\\\307.01\\\\143.5547\\\\232.7875\\\\307.01\\\\138.8672\\\\232.6477\\\\307.01\\\\131.8359\\\\232.6179\\\\307.01\\\\127.1484\\\\232.4192\\\\307.01\\\\124.8047\\\\231.7722\\\\307.01\\\\122.4609\\\\231.7224\\\\307.01\\\\120.1172\\\\231.7625\\\\307.01\\\\117.7734\\\\232.2817\\\\307.01\\\\115.4297\\\\232.5232\\\\307.01\\\\113.0859\\\\232.4546\\\\307.01\\\\110.7422\\\\232.4888\\\\307.01\\\\108.3984\\\\231.7722\\\\307.01\\\\106.0547\\\\231.6215\\\\307.01\\\\103.7109\\\\231.648\\\\307.01\\\\102.8453\\\\232.3734\\\\307.01\\\\101.3672\\\\233.1042\\\\307.01\\\\94.33594\\\\233.0951\\\\307.01\\\\89.64844\\\\233.1221\\\\307.01\\\\77.92969\\\\233.1221\\\\307.01\\\\59.17969\\\\233.1483\\\\307.01\\\\47.46094\\\\233.131\\\\307.01\\\\45.11719\\\\233.0951\\\\307.01\\\\44.1495\\\\232.3734\\\\307.01\\\\42.77344\\\\231.0667\\\\307.01\\\\42.01079\\\\230.0297\\\\307.01\\\\42.77344\\\\229.206\\\\307.01\\\\45.11719\\\\228.5128\\\\307.01\\\\47.46094\\\\226.9947\\\\307.01\\\\49.80469\\\\225.986\\\\307.01\\\\52.14844\\\\224.5319\\\\307.01\\\\54.49219\\\\223.5919\\\\307.01\\\\55.18826\\\\222.9984\\\\307.01\\\\59.17969\\\\220.1266\\\\307.01\\\\61.52344\\\\218.7716\\\\307.01\\\\64.83179\\\\215.9672\\\\307.01\\\\66.21094\\\\214.9167\\\\307.01\\\\70.89844\\\\210.4059\\\\307.01\\\\74.42065\\\\206.5922\\\\307.01\\\\76.41272\\\\204.2484\\\\307.01\\\\78.09221\\\\201.9047\\\\307.01\\\\80.27344\\\\198.7387\\\\307.01\\\\82.73348\\\\194.8734\\\\307.01\\\\84.0608\\\\192.5297\\\\307.01\\\\85.28558\\\\190.1859\\\\307.01\\\\86.21609\\\\187.8422\\\\307.01\\\\87.62429\\\\185.4984\\\\307.01\\\\88.50529\\\\183.1547\\\\307.01\\\\88.94127\\\\180.8109\\\\307.01\\\\89.95934\\\\178.4672\\\\307.01\\\\90.70085\\\\176.1234\\\\307.01\\\\91.22121\\\\173.7797\\\\307.01\\\\92.07523\\\\171.4359\\\\307.01\\\\92.80196\\\\169.0922\\\\307.01\\\\93.06984\\\\166.7484\\\\307.01\\\\93.43011\\\\159.7172\\\\307.01\\\\93.78402\\\\155.0297\\\\307.01\\\\95.35853\\\\152.6859\\\\307.01\\\\97.21561\\\\150.3422\\\\307.01\\\\96.67969\\\\149.7189\\\\307.01\\\\94.33594\\\\148.4892\\\\307.01\\\\93.77909\\\\147.9984\\\\307.01\\\\93.3065\\\\145.6547\\\\307.01\\\\92.98377\\\\140.9672\\\\307.01\\\\92.62429\\\\138.6234\\\\307.01\\\\91.70932\\\\136.2797\\\\307.01\\\\90.52432\\\\131.5922\\\\307.01\\\\88.79446\\\\126.9047\\\\307.01\\\\88.35513\\\\124.5609\\\\307.01\\\\86.99378\\\\122.2172\\\\307.01\\\\85.96972\\\\119.8734\\\\307.01\\\\84.78261\\\\117.5297\\\\307.01\\\\83.77131\\\\115.1859\\\\307.01\\\\82.02393\\\\112.8422\\\\307.01\\\\80.98469\\\\110.4984\\\\307.01\\\\77.92969\\\\106.5841\\\\307.01\\\\77.24248\\\\105.8109\\\\307.01\\\\75.73918\\\\103.4672\\\\307.01\\\\71.58269\\\\98.77969\\\\307.01\\\\68.55469\\\\95.79888\\\\307.01\\\\63.86719\\\\91.72031\\\\307.01\\\\61.52344\\\\90.225\\\\307.01\\\\59.17969\\\\88.22054\\\\307.01\\\\56.83594\\\\86.64962\\\\307.01\\\\54.49219\\\\85.5138\\\\307.01\\\\52.14844\\\\83.72078\\\\307.01\\\\49.80469\\\\82.97671\\\\307.01\\\\47.46094\\\\81.57265\\\\307.01\\\\45.11719\\\\80.68514\\\\307.01\\\\42.77344\\\\79.22858\\\\307.01\\\\38.08594\\\\78.2206\\\\307.01\\\\35.74219\\\\77.19827\\\\307.01\\\\33.39844\\\\76.55239\\\\307.01\\\\31.05469\\\\76.12139\\\\307.01\\\\26.36719\\\\74.72801\\\\307.01\\\\24.02344\\\\74.43276\\\\307.01\\\\16.99219\\\\74.13425\\\\307.01\\\\14.64844\\\\74.0982\\\\307.01\\\\7.617188\\\\74.18246\\\\307.01\\\\2.929688\\\\74.39614\\\\307.01\\\\0.5859375\\\\74.65002\\\\307.01\\\\-4.101563\\\\75.99764\\\\307.01\\\\-6.445313\\\\76.44152\\\\307.01\\\\-8.789063\\\\77.05959\\\\307.01\\\\-11.13281\\\\78.04713\\\\307.01\\\\-15.82031\\\\79.25529\\\\307.01\\\\-18.16406\\\\80.70029\\\\307.01\\\\-20.50781\\\\81.59003\\\\307.01\\\\-22.85156\\\\82.96635\\\\307.01\\\\-25.19531\\\\83.75323\\\\307.01\\\\-27.53906\\\\85.54559\\\\307.01\\\\-29.88281\\\\86.62055\\\\307.01\\\\-32.22656\\\\88.30287\\\\307.01\\\\-34.57031\\\\90.24761\\\\307.01\\\\-36.72696\\\\91.74844\\\\307.01\\\\-39.25781\\\\93.79108\\\\307.01\\\\-41.60156\\\\95.80312\\\\307.01\\\\-46.76263\\\\101.1234\\\\307.01\\\\-50.32931\\\\105.8109\\\\307.01\\\\-52.19967\\\\108.1547\\\\307.01\\\\-53.78753\\\\110.4984\\\\307.01\\\\-55.12727\\\\112.8422\\\\307.01\\\\-56.73218\\\\115.1859\\\\307.01\\\\-57.60399\\\\117.5297\\\\307.01\\\\-59.0554\\\\119.8734\\\\307.01\\\\-59.9868\\\\122.2172\\\\307.01\\\\-61.19757\\\\124.5609\\\\307.01\\\\-61.69523\\\\126.9047\\\\307.01\\\\-63.64114\\\\131.5922\\\\307.01\\\\-64.53993\\\\136.2797\\\\307.01\\\\-65.34997\\\\138.6234\\\\307.01\\\\-65.7409\\\\140.9672\\\\307.01\\\\-66.1507\\\\145.6547\\\\307.01\\\\-66.472\\\\150.3422\\\\307.01\\\\-66.58739\\\\155.0297\\\\307.01\\\\-66.57152\\\\157.3734\\\\307.01\\\\-66.46494\\\\159.7172\\\\307.01\\\\-66.11516\\\\164.4047\\\\307.01\\\\-65.59342\\\\169.0922\\\\307.01\\\\-64.28482\\\\173.7797\\\\307.01\\\\-63.89509\\\\176.1234\\\\307.01\\\\-63.1595\\\\178.4672\\\\307.01\\\\-61.99355\\\\180.8109\\\\307.01\\\\-61.42098\\\\183.1547\\\\307.01\\\\-60.5483\\\\185.4984\\\\307.01\\\\-60.35156\\\\185.7601\\\\307.01\\\\-56.91528\\\\192.5297\\\\307.01\\\\-55.83274\\\\194.8734\\\\307.01\\\\-54.25148\\\\197.2172\\\\307.01\\\\-52.56362\\\\199.5609\\\\307.01\\\\-51.16442\\\\201.9047\\\\307.01\\\\-48.63281\\\\205.0156\\\\307.01\\\\-47.47334\\\\206.5922\\\\307.01\\\\-45.13073\\\\208.9359\\\\307.01\\\\-42.93779\\\\211.2797\\\\307.01\\\\-39.25781\\\\214.8144\\\\307.01\\\\-34.97234\\\\218.3109\\\\307.01\\\\-34.57031\\\\218.6988\\\\307.01\\\\-32.22656\\\\220.0478\\\\307.01\\\\-28.16808\\\\222.9984\\\\307.01\\\\-27.53906\\\\223.5539\\\\307.01\\\\-25.19531\\\\224.4929\\\\307.01\\\\-22.85156\\\\225.9097\\\\307.01\\\\-20.50781\\\\226.9751\\\\307.01\\\\-18.16406\\\\228.4825\\\\307.01\\\\-15.82031\\\\229.1508\\\\307.01\\\\-14.96138\\\\230.0297\\\\307.01\\\\-15.82031\\\\231.3794\\\\307.01\\\\-16.92257\\\\232.3734\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"376\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"12\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.0951\\\\310.01\\\\-29.88281\\\\233.1132\\\\310.01\\\\-32.22656\\\\233.1483\\\\310.01\\\\-36.91406\\\\233.1221\\\\310.01\\\\-46.28906\\\\233.1397\\\\310.01\\\\-50.97656\\\\233.1736\\\\310.01\\\\-60.35156\\\\233.19\\\\310.01\\\\-62.69531\\\\233.1652\\\\310.01\\\\-65.03906\\\\232.5396\\\\310.01\\\\-67.38281\\\\232.8852\\\\310.01\\\\-72.07031\\\\232.9942\\\\310.01\\\\-86.13281\\\\233.0183\\\\310.01\\\\-88.47656\\\\233.0671\\\\310.01\\\\-95.50781\\\\233.0859\\\\310.01\\\\-97.85156\\\\233.3123\\\\310.01\\\\-102.5391\\\\233.9389\\\\310.01\\\\-104.8828\\\\234.062\\\\310.01\\\\-107.2266\\\\233.5222\\\\310.01\\\\-109.5703\\\\234.0754\\\\310.01\\\\-116.6016\\\\234.0158\\\\310.01\\\\-133.0078\\\\234.1313\\\\310.01\\\\-137.6953\\\\234.1127\\\\310.01\\\\-142.3828\\\\234.1741\\\\310.01\\\\-147.0703\\\\234.0855\\\\310.01\\\\-151.7578\\\\234.1127\\\\310.01\\\\-165.8203\\\\234.0141\\\\310.01\\\\-168.1641\\\\234.1313\\\\310.01\\\\-182.2266\\\\234.2252\\\\310.01\\\\-186.9141\\\\234.2721\\\\310.01\\\\-189.2578\\\\234.2252\\\\310.01\\\\-198.6328\\\\234.2187\\\\310.01\\\\-200.9766\\\\234.261\\\\310.01\\\\-205.6641\\\\234.1564\\\\310.01\\\\-208.0078\\\\234.2088\\\\310.01\\\\-215.0391\\\\234.2678\\\\310.01\\\\-222.0703\\\\234.3601\\\\310.01\\\\-226.7578\\\\234.3296\\\\310.01\\\\-233.7891\\\\234.1478\\\\310.01\\\\-238.4766\\\\234.1954\\\\310.01\\\\-243.1641\\\\234.1652\\\\310.01\\\\-245.5078\\\\233.9895\\\\310.01\\\\-247.8516\\\\233.9042\\\\310.01\\\\-252.5391\\\\234.0772\\\\310.01\\\\-254.8828\\\\234.2605\\\\310.01\\\\-257.2266\\\\234.9111\\\\310.01\\\\-259.5703\\\\236.1157\\\\310.01\\\\-260.7422\\\\237.0609\\\\310.01\\\\-262.3813\\\\239.4047\\\\310.01\\\\-262.5138\\\\241.7484\\\\310.01\\\\-261.5641\\\\244.0922\\\\310.01\\\\-260.7806\\\\246.4359\\\\310.01\\\\-259.5703\\\\248.5863\\\\310.01\\\\-257.6038\\\\251.1234\\\\310.01\\\\-255.672\\\\253.4672\\\\310.01\\\\-252.5391\\\\256.6564\\\\310.01\\\\-250.1953\\\\258.9219\\\\310.01\\\\-247.8516\\\\261.4344\\\\310.01\\\\-245.5078\\\\263.6147\\\\310.01\\\\-244.1124\\\\265.1859\\\\310.01\\\\-241.6101\\\\267.5297\\\\310.01\\\\-239.4375\\\\269.8734\\\\310.01\\\\-236.9858\\\\272.2172\\\\310.01\\\\-233.7891\\\\275.3877\\\\310.01\\\\-231.4453\\\\277.8215\\\\310.01\\\\-229.1016\\\\280.0036\\\\310.01\\\\-226.7578\\\\282.5409\\\\310.01\\\\-225.1803\\\\283.9359\\\\310.01\\\\-222.0703\\\\287.2221\\\\310.01\\\\-220.5288\\\\288.6234\\\\310.01\\\\-218.3186\\\\290.9672\\\\310.01\\\\-217.3828\\\\291.678\\\\310.01\\\\-212.6953\\\\294.6293\\\\310.01\\\\-210.3516\\\\295.3008\\\\310.01\\\\-208.0078\\\\296.4508\\\\310.01\\\\-205.6641\\\\296.8858\\\\310.01\\\\-203.3203\\\\297.1639\\\\310.01\\\\-196.2891\\\\297.1446\\\\310.01\\\\-191.6016\\\\297.0175\\\\310.01\\\\-179.8828\\\\296.9378\\\\310.01\\\\-177.5391\\\\296.8855\\\\310.01\\\\-165.8203\\\\296.8345\\\\310.01\\\\-158.7891\\\\296.8672\\\\310.01\\\\-154.1016\\\\296.851\\\\310.01\\\\-135.3516\\\\296.8786\\\\310.01\\\\-128.3203\\\\296.9134\\\\310.01\\\\-121.2891\\\\296.8971\\\\310.01\\\\-111.9141\\\\296.8359\\\\310.01\\\\-97.85156\\\\296.8453\\\\310.01\\\\-88.47656\\\\296.9028\\\\310.01\\\\-86.13281\\\\296.8927\\\\310.01\\\\-69.72656\\\\296.9622\\\\310.01\\\\-65.03906\\\\296.934\\\\310.01\\\\-58.00781\\\\296.9358\\\\310.01\\\\-55.66406\\\\297.3383\\\\310.01\\\\-53.32031\\\\296.9926\\\\310.01\\\\-50.97656\\\\297.0405\\\\310.01\\\\-48.63281\\\\296.9267\\\\310.01\\\\-46.28906\\\\297.409\\\\310.01\\\\-43.94531\\\\297.3148\\\\310.01\\\\-41.60156\\\\297.373\\\\310.01\\\\-39.25781\\\\297.0516\\\\310.01\\\\-36.91406\\\\297.1798\\\\310.01\\\\-34.57031\\\\297.1975\\\\310.01\\\\-32.22656\\\\297.3947\\\\310.01\\\\-29.88281\\\\297.2767\\\\310.01\\\\-27.53906\\\\297.2779\\\\310.01\\\\-25.19531\\\\297.3806\\\\310.01\\\\-22.85156\\\\297.106\\\\310.01\\\\-20.50781\\\\297.4055\\\\310.01\\\\-18.16406\\\\297.1577\\\\310.01\\\\-15.82031\\\\297.2089\\\\310.01\\\\-13.47656\\\\297.4229\\\\310.01\\\\-11.13281\\\\297.2307\\\\310.01\\\\-8.789063\\\\297.1626\\\\310.01\\\\-6.445313\\\\297.4229\\\\310.01\\\\-4.101563\\\\297.3546\\\\310.01\\\\-1.757813\\\\297.0439\\\\310.01\\\\0.5859375\\\\297.0849\\\\310.01\\\\2.929688\\\\296.8985\\\\310.01\\\\5.273438\\\\297.2462\\\\310.01\\\\7.617188\\\\296.8985\\\\310.01\\\\9.960938\\\\297.1152\\\\310.01\\\\12.30469\\\\296.8477\\\\310.01\\\\19.33594\\\\296.8579\\\\310.01\\\\24.02344\\\\296.8161\\\\310.01\\\\26.36719\\\\296.8473\\\\310.01\\\\33.39844\\\\296.7643\\\\310.01\\\\42.77344\\\\296.7533\\\\310.01\\\\45.11719\\\\296.7115\\\\310.01\\\\59.17969\\\\296.6814\\\\310.01\\\\68.55469\\\\296.5984\\\\310.01\\\\75.58594\\\\296.6107\\\\310.01\\\\80.27344\\\\296.5362\\\\310.01\\\\84.96094\\\\296.5616\\\\310.01\\\\87.30469\\\\296.5098\\\\310.01\\\\99.02344\\\\296.5005\\\\310.01\\\\101.3672\\\\296.466\\\\310.01\\\\110.7422\\\\296.4189\\\\310.01\\\\113.0859\\\\296.3782\\\\310.01\\\\117.7734\\\\296.3976\\\\310.01\\\\120.1172\\\\296.3578\\\\310.01\\\\127.1484\\\\296.3288\\\\310.01\\\\129.4922\\\\296.2873\\\\310.01\\\\131.8359\\\\296.3348\\\\310.01\\\\134.1797\\\\295.9141\\\\310.01\\\\136.5234\\\\296.1612\\\\310.01\\\\138.8672\\\\296.033\\\\310.01\\\\141.2109\\\\296.2967\\\\310.01\\\\143.5547\\\\295.9477\\\\310.01\\\\145.8984\\\\295.864\\\\310.01\\\\150.5859\\\\295.894\\\\310.01\\\\152.9297\\\\295.833\\\\310.01\\\\162.3047\\\\295.7516\\\\310.01\\\\166.9922\\\\295.6638\\\\310.01\\\\171.6797\\\\295.7173\\\\310.01\\\\181.0547\\\\295.6093\\\\310.01\\\\185.7422\\\\295.6272\\\\310.01\\\\188.0859\\\\295.557\\\\310.01\\\\192.7734\\\\295.5742\\\\310.01\\\\197.4609\\\\295.8012\\\\310.01\\\\199.8047\\\\295.8012\\\\310.01\\\\202.1484\\\\295.6819\\\\310.01\\\\204.4922\\\\295.4287\\\\310.01\\\\206.8359\\\\294.8307\\\\310.01\\\\209.1797\\\\294.3828\\\\310.01\\\\211.5234\\\\292.4764\\\\310.01\\\\213.8672\\\\291.1765\\\\310.01\\\\216.2109\\\\289.625\\\\310.01\\\\217.2743\\\\288.6234\\\\310.01\\\\218.5547\\\\287.0983\\\\310.01\\\\221.7204\\\\283.9359\\\\310.01\\\\225.5859\\\\279.8821\\\\310.01\\\\227.9297\\\\277.5431\\\\310.01\\\\230.2734\\\\275.0606\\\\310.01\\\\233.113\\\\272.2172\\\\310.01\\\\235.3208\\\\269.8734\\\\310.01\\\\237.7111\\\\267.5297\\\\310.01\\\\239.9438\\\\265.1859\\\\310.01\\\\246.8767\\\\258.1547\\\\310.01\\\\249.1396\\\\255.8109\\\\310.01\\\\251.4974\\\\253.4672\\\\310.01\\\\255.4942\\\\248.7797\\\\310.01\\\\257.2692\\\\246.4359\\\\310.01\\\\259.2847\\\\244.0922\\\\310.01\\\\260.0775\\\\241.7484\\\\310.01\\\\260.576\\\\239.4047\\\\310.01\\\\260.1205\\\\237.0609\\\\310.01\\\\258.8931\\\\234.7172\\\\310.01\\\\258.3984\\\\234.2411\\\\310.01\\\\256.0547\\\\233.35\\\\310.01\\\\253.7109\\\\232.9379\\\\310.01\\\\251.3672\\\\232.7162\\\\310.01\\\\249.0234\\\\232.8224\\\\310.01\\\\244.3359\\\\232.8437\\\\310.01\\\\239.6484\\\\233.0108\\\\310.01\\\\237.3047\\\\233.0007\\\\310.01\\\\232.6172\\\\233.0726\\\\310.01\\\\227.9297\\\\233.0305\\\\310.01\\\\211.5234\\\\233.0726\\\\310.01\\\\206.8359\\\\233.0245\\\\310.01\\\\204.4922\\\\232.7456\\\\310.01\\\\202.1484\\\\232.6886\\\\310.01\\\\195.1172\\\\232.7848\\\\310.01\\\\190.4297\\\\232.7186\\\\310.01\\\\176.3672\\\\232.7719\\\\310.01\\\\166.9922\\\\232.7456\\\\310.01\\\\159.9609\\\\232.7975\\\\310.01\\\\150.5859\\\\232.7746\\\\310.01\\\\145.8984\\\\232.8003\\\\310.01\\\\138.8672\\\\232.6623\\\\310.01\\\\134.1797\\\\232.6623\\\\310.01\\\\131.8359\\\\232.4897\\\\310.01\\\\129.4922\\\\231.8945\\\\310.01\\\\124.8047\\\\231.6823\\\\310.01\\\\120.1172\\\\231.737\\\\310.01\\\\117.7734\\\\232.3211\\\\310.01\\\\115.4297\\\\232.6329\\\\310.01\\\\110.7422\\\\232.6623\\\\310.01\\\\108.3984\\\\231.9109\\\\310.01\\\\106.0547\\\\231.602\\\\310.01\\\\103.7109\\\\231.6193\\\\310.01\\\\102.8551\\\\232.3734\\\\310.01\\\\101.3672\\\\233.1132\\\\310.01\\\\94.33594\\\\233.0951\\\\310.01\\\\87.30469\\\\233.1397\\\\310.01\\\\82.61719\\\\233.1132\\\\310.01\\\\75.58594\\\\233.1483\\\\310.01\\\\70.89844\\\\233.1221\\\\310.01\\\\59.17969\\\\233.1568\\\\310.01\\\\52.14844\\\\233.1221\\\\310.01\\\\47.46094\\\\233.131\\\\310.01\\\\45.11719\\\\233.0859\\\\310.01\\\\44.16726\\\\232.3734\\\\310.01\\\\42.77344\\\\231.0498\\\\310.01\\\\42.0192\\\\230.0297\\\\310.01\\\\42.77344\\\\229.2101\\\\310.01\\\\45.11719\\\\228.4825\\\\310.01\\\\47.46094\\\\226.9683\\\\310.01\\\\49.80469\\\\225.9571\\\\310.01\\\\52.14844\\\\224.5099\\\\310.01\\\\54.49219\\\\223.5692\\\\310.01\\\\55.14323\\\\222.9984\\\\310.01\\\\59.17969\\\\220.1045\\\\310.01\\\\61.52344\\\\218.7182\\\\310.01\\\\64.78396\\\\215.9672\\\\310.01\\\\66.21094\\\\214.8859\\\\310.01\\\\70.89844\\\\210.3839\\\\310.01\\\\74.36692\\\\206.5922\\\\310.01\\\\76.38396\\\\204.2484\\\\310.01\\\\81.22672\\\\197.2172\\\\310.01\\\\84.03577\\\\192.5297\\\\310.01\\\\85.25792\\\\190.1859\\\\310.01\\\\86.1923\\\\187.8422\\\\310.01\\\\87.47085\\\\185.4984\\\\310.01\\\\88.48811\\\\183.1547\\\\310.01\\\\88.90029\\\\180.8109\\\\310.01\\\\89.90248\\\\178.4672\\\\310.01\\\\90.64713\\\\176.1234\\\\310.01\\\\91.18042\\\\173.7797\\\\310.01\\\\92.74409\\\\169.0922\\\\310.01\\\\93.04629\\\\166.7484\\\\310.01\\\\93.38223\\\\159.7172\\\\310.01\\\\93.66732\\\\155.0297\\\\310.01\\\\94.19643\\\\152.6859\\\\310.01\\\\95.64145\\\\150.3422\\\\310.01\\\\94.33594\\\\149.1322\\\\310.01\\\\93.50089\\\\147.9984\\\\310.01\\\\93.25756\\\\145.6547\\\\310.01\\\\92.96472\\\\140.9672\\\\310.01\\\\92.55265\\\\138.6234\\\\310.01\\\\91.62743\\\\136.2797\\\\310.01\\\\90.46875\\\\131.5922\\\\310.01\\\\88.75411\\\\126.9047\\\\310.01\\\\88.33083\\\\124.5609\\\\310.01\\\\86.91406\\\\122.2172\\\\310.01\\\\85.93851\\\\119.8734\\\\310.01\\\\84.69238\\\\117.5297\\\\310.01\\\\83.74721\\\\115.1859\\\\310.01\\\\81.96295\\\\112.8422\\\\310.01\\\\80.91831\\\\110.4984\\\\310.01\\\\79.14664\\\\108.1547\\\\310.01\\\\77.20256\\\\105.8109\\\\310.01\\\\75.65157\\\\103.4672\\\\310.01\\\\71.53253\\\\98.77969\\\\310.01\\\\68.55469\\\\95.82625\\\\310.01\\\\66.21094\\\\93.7748\\\\310.01\\\\63.79395\\\\91.74844\\\\310.01\\\\61.52344\\\\90.26997\\\\310.01\\\\59.17969\\\\88.23898\\\\310.01\\\\56.83594\\\\86.67812\\\\310.01\\\\54.49219\\\\85.52697\\\\310.01\\\\52.14844\\\\83.74062\\\\310.01\\\\49.80469\\\\82.99707\\\\310.01\\\\47.46094\\\\81.59437\\\\310.01\\\\45.11719\\\\80.70401\\\\310.01\\\\42.77344\\\\79.24621\\\\310.01\\\\38.08594\\\\78.23525\\\\310.01\\\\35.74219\\\\77.20986\\\\310.01\\\\33.39844\\\\76.56908\\\\310.01\\\\31.05469\\\\76.1376\\\\310.01\\\\28.71094\\\\75.50471\\\\310.01\\\\26.36719\\\\74.72801\\\\310.01\\\\24.02344\\\\74.43276\\\\310.01\\\\16.99219\\\\74.15237\\\\310.01\\\\12.30469\\\\74.10455\\\\310.01\\\\7.617188\\\\74.19435\\\\310.01\\\\2.929688\\\\74.40105\\\\310.01\\\\0.5859375\\\\74.6557\\\\310.01\\\\-4.101563\\\\75.97835\\\\310.01\\\\-6.445313\\\\76.43703\\\\310.01\\\\-8.789063\\\\77.04008\\\\310.01\\\\-11.13281\\\\78.03346\\\\310.01\\\\-15.82031\\\\79.22787\\\\310.01\\\\-18.16406\\\\80.65422\\\\310.01\\\\-20.50781\\\\81.57233\\\\310.01\\\\-22.85156\\\\82.94526\\\\310.01\\\\-25.19531\\\\83.73331\\\\310.01\\\\-27.53906\\\\85.52371\\\\310.01\\\\-29.88281\\\\86.58486\\\\310.01\\\\-32.22656\\\\88.25871\\\\310.01\\\\-34.57031\\\\90.22985\\\\310.01\\\\-36.76382\\\\91.74844\\\\310.01\\\\-39.25781\\\\93.74467\\\\310.01\\\\-41.60156\\\\95.77628\\\\310.01\\\\-46.83174\\\\101.1234\\\\310.01\\\\-50.36664\\\\105.8109\\\\310.01\\\\-52.22528\\\\108.1547\\\\310.01\\\\-53.85835\\\\110.4984\\\\310.01\\\\-55.16944\\\\112.8422\\\\310.01\\\\-56.75659\\\\115.1859\\\\310.01\\\\-57.66267\\\\117.5297\\\\310.01\\\\-59.07907\\\\119.8734\\\\310.01\\\\-60.05458\\\\122.2172\\\\310.01\\\\-61.23355\\\\124.5609\\\\310.01\\\\-61.71977\\\\126.9047\\\\310.01\\\\-63.70555\\\\131.5922\\\\310.01\\\\-64.61088\\\\136.2797\\\\310.01\\\\-65.42969\\\\138.6234\\\\310.01\\\\-65.75874\\\\140.9672\\\\310.01\\\\-66.18872\\\\145.6547\\\\310.01\\\\-66.50977\\\\150.3422\\\\310.01\\\\-66.63708\\\\155.0297\\\\310.01\\\\-66.4952\\\\159.7172\\\\310.01\\\\-66.1377\\\\164.4047\\\\310.01\\\\-65.63528\\\\169.0922\\\\310.01\\\\-65.06631\\\\171.4359\\\\310.01\\\\-64.31938\\\\173.7797\\\\310.01\\\\-63.93199\\\\176.1234\\\\310.01\\\\-63.24552\\\\178.4672\\\\310.01\\\\-62.07078\\\\180.8109\\\\310.01\\\\-61.44824\\\\183.1547\\\\310.01\\\\-60.69909\\\\185.4984\\\\310.01\\\\-59.32978\\\\187.8422\\\\310.01\\\\-58.20172\\\\190.1859\\\\310.01\\\\-56.94638\\\\192.5297\\\\310.01\\\\-55.91395\\\\194.8734\\\\310.01\\\\-52.60492\\\\199.5609\\\\310.01\\\\-51.24368\\\\201.9047\\\\310.01\\\\-48.63281\\\\205.082\\\\310.01\\\\-47.51002\\\\206.5922\\\\310.01\\\\-45.16488\\\\208.9359\\\\310.01\\\\-42.98322\\\\211.2797\\\\310.01\\\\-39.25781\\\\214.8471\\\\310.01\\\\-34.57031\\\\218.7393\\\\310.01\\\\-32.22656\\\\220.0723\\\\310.01\\\\-31.49524\\\\220.6547\\\\310.01\\\\-28.1901\\\\222.9984\\\\310.01\\\\-27.53906\\\\223.5692\\\\310.01\\\\-25.19531\\\\224.5146\\\\310.01\\\\-22.85156\\\\225.9463\\\\310.01\\\\-20.50781\\\\226.9932\\\\310.01\\\\-18.16406\\\\228.5043\\\\310.01\\\\-15.82031\\\\229.1644\\\\310.01\\\\-14.9747\\\\230.0297\\\\310.01\\\\-15.82031\\\\231.3705\\\\310.01\\\\-16.91176\\\\232.3734\\\\310.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"369\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"13\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"45.11719\\\\233.1042\\\\313.01\\\\44.14645\\\\232.3734\\\\313.01\\\\42.77344\\\\231.0593\\\\313.01\\\\42.01079\\\\230.0297\\\\313.01\\\\42.77344\\\\229.2013\\\\313.01\\\\45.11719\\\\228.4738\\\\313.01\\\\47.46094\\\\226.9815\\\\313.01\\\\49.80469\\\\225.902\\\\313.01\\\\52.14844\\\\224.4881\\\\313.01\\\\54.49219\\\\223.5423\\\\313.01\\\\55.12733\\\\222.9984\\\\313.01\\\\59.17969\\\\220.0829\\\\313.01\\\\61.52344\\\\218.6617\\\\313.01\\\\64.74609\\\\215.9672\\\\313.01\\\\66.21094\\\\214.8439\\\\313.01\\\\70.89844\\\\210.3514\\\\313.01\\\\72.25302\\\\208.9359\\\\313.01\\\\76.36958\\\\204.2484\\\\313.01\\\\77.92969\\\\201.9154\\\\313.01\\\\80.27344\\\\198.618\\\\313.01\\\\81.20244\\\\197.2172\\\\313.01\\\\82.5531\\\\194.8734\\\\313.01\\\\84.01786\\\\192.5297\\\\313.01\\\\85.20026\\\\190.1859\\\\313.01\\\\86.15661\\\\187.8422\\\\313.01\\\\87.38582\\\\185.4984\\\\313.01\\\\88.4649\\\\183.1547\\\\313.01\\\\88.8737\\\\180.8109\\\\313.01\\\\89.82677\\\\178.4672\\\\313.01\\\\90.60566\\\\176.1234\\\\313.01\\\\91.14483\\\\173.7797\\\\313.01\\\\91.8785\\\\171.4359\\\\313.01\\\\92.70221\\\\169.0922\\\\313.01\\\\93.03451\\\\166.7484\\\\313.01\\\\93.47005\\\\157.3734\\\\313.01\\\\93.61861\\\\152.6859\\\\313.01\\\\93.64014\\\\150.3422\\\\313.01\\\\93.34677\\\\147.9984\\\\313.01\\\\92.94547\\\\140.9672\\\\313.01\\\\92.48362\\\\138.6234\\\\313.01\\\\91.57636\\\\136.2797\\\\313.01\\\\90.42757\\\\131.5922\\\\313.01\\\\89.48472\\\\129.2484\\\\313.01\\\\88.73901\\\\126.9047\\\\313.01\\\\88.29956\\\\124.5609\\\\313.01\\\\86.86148\\\\122.2172\\\\313.01\\\\85.9046\\\\119.8734\\\\313.01\\\\84.65003\\\\117.5297\\\\313.01\\\\83.69191\\\\115.1859\\\\313.01\\\\81.91267\\\\112.8422\\\\313.01\\\\80.87713\\\\110.4984\\\\313.01\\\\79.10793\\\\108.1547\\\\313.01\\\\77.14613\\\\105.8109\\\\313.01\\\\75.58594\\\\103.498\\\\313.01\\\\73.56179\\\\101.1234\\\\313.01\\\\71.46389\\\\98.77969\\\\313.01\\\\68.55469\\\\95.89069\\\\313.01\\\\66.21094\\\\93.83636\\\\313.01\\\\63.71433\\\\91.74844\\\\313.01\\\\61.52344\\\\90.29206\\\\313.01\\\\59.17969\\\\88.26962\\\\313.01\\\\56.83594\\\\86.74574\\\\313.01\\\\54.49219\\\\85.57699\\\\313.01\\\\52.14844\\\\83.78355\\\\313.01\\\\49.80469\\\\83.01695\\\\313.01\\\\47.46094\\\\81.62056\\\\313.01\\\\45.11719\\\\80.73152\\\\313.01\\\\42.77344\\\\79.27779\\\\313.01\\\\38.08594\\\\78.27902\\\\313.01\\\\35.74219\\\\77.23351\\\\313.01\\\\33.39844\\\\76.57487\\\\313.01\\\\31.05469\\\\76.15349\\\\313.01\\\\28.71094\\\\75.56659\\\\313.01\\\\26.36719\\\\74.72801\\\\313.01\\\\24.02344\\\\74.44027\\\\313.01\\\\14.64844\\\\74.0982\\\\313.01\\\\7.617188\\\\74.19435\\\\313.01\\\\2.929688\\\\74.39614\\\\313.01\\\\0.5859375\\\\74.6557\\\\313.01\\\\-1.757813\\\\75.2781\\\\313.01\\\\-4.101563\\\\75.98805\\\\313.01\\\\-6.445313\\\\76.43114\\\\313.01\\\\-8.789063\\\\77.04008\\\\313.01\\\\-11.13281\\\\78.03108\\\\313.01\\\\-13.47656\\\\78.68081\\\\313.01\\\\-15.82031\\\\79.16585\\\\313.01\\\\-18.16406\\\\80.60848\\\\313.01\\\\-20.50781\\\\81.54504\\\\313.01\\\\-22.85156\\\\82.93452\\\\313.01\\\\-25.19531\\\\83.69951\\\\313.01\\\\-27.53906\\\\85.48667\\\\313.01\\\\-29.88281\\\\86.58486\\\\313.01\\\\-32.22656\\\\88.2459\\\\313.01\\\\-34.57031\\\\90.18356\\\\313.01\\\\-36.84147\\\\91.74844\\\\313.01\\\\-39.25781\\\\93.7097\\\\313.01\\\\-41.60156\\\\95.73894\\\\313.01\\\\-46.90146\\\\101.1234\\\\313.01\\\\-48.62366\\\\103.4672\\\\313.01\\\\-52.24294\\\\108.1547\\\\313.01\\\\-53.89533\\\\110.4984\\\\313.01\\\\-55.24722\\\\112.8422\\\\313.01\\\\-56.79365\\\\115.1859\\\\313.01\\\\-57.7046\\\\117.5297\\\\313.01\\\\-59.10275\\\\119.8734\\\\313.01\\\\-60.1423\\\\122.2172\\\\313.01\\\\-61.27319\\\\124.5609\\\\313.01\\\\-61.73931\\\\126.9047\\\\313.01\\\\-62.82649\\\\129.2484\\\\313.01\\\\-63.74772\\\\131.5922\\\\313.01\\\\-64.64844\\\\136.2797\\\\313.01\\\\-65.49149\\\\138.6234\\\\313.01\\\\-66.03151\\\\143.3109\\\\313.01\\\\-66.55173\\\\150.3422\\\\313.01\\\\-66.7085\\\\155.0297\\\\313.01\\\\-66.5332\\\\159.7172\\\\313.01\\\\-66.37591\\\\162.0609\\\\313.01\\\\-65.93555\\\\166.7484\\\\313.01\\\\-65.66541\\\\169.0922\\\\313.01\\\\-65.13599\\\\171.4359\\\\313.01\\\\-64.35547\\\\173.7797\\\\313.01\\\\-63.97324\\\\176.1234\\\\313.01\\\\-63.31245\\\\178.4672\\\\313.01\\\\-62.13423\\\\180.8109\\\\313.01\\\\-60.7784\\\\185.4984\\\\313.01\\\\-59.36625\\\\187.8422\\\\313.01\\\\-58.29068\\\\190.1859\\\\313.01\\\\-56.97235\\\\192.5297\\\\313.01\\\\-55.9882\\\\194.8734\\\\313.01\\\\-55.66406\\\\195.2305\\\\313.01\\\\-53.32031\\\\198.6979\\\\313.01\\\\-52.65765\\\\199.5609\\\\313.01\\\\-51.33394\\\\201.9047\\\\313.01\\\\-48.63281\\\\205.1581\\\\313.01\\\\-47.54197\\\\206.5922\\\\313.01\\\\-45.18493\\\\208.9359\\\\313.01\\\\-43.00636\\\\211.2797\\\\313.01\\\\-39.25781\\\\214.8799\\\\313.01\\\\-34.57031\\\\218.8154\\\\313.01\\\\-32.22656\\\\220.1045\\\\313.01\\\\-31.54811\\\\220.6547\\\\313.01\\\\-28.24903\\\\222.9984\\\\313.01\\\\-27.53906\\\\223.618\\\\313.01\\\\-25.19531\\\\224.5319\\\\313.01\\\\-22.85156\\\\226.0067\\\\313.01\\\\-20.50781\\\\227.0116\\\\313.01\\\\-18.16406\\\\228.5043\\\\313.01\\\\-15.82031\\\\229.173\\\\313.01\\\\-14.98326\\\\230.0297\\\\313.01\\\\-15.82031\\\\231.3494\\\\313.01\\\\-16.91331\\\\232.3734\\\\313.01\\\\-18.16406\\\\233.1042\\\\313.01\\\\-22.85156\\\\233.131\\\\313.01\\\\-29.88281\\\\233.1132\\\\313.01\\\\-36.91406\\\\233.1483\\\\313.01\\\\-46.28906\\\\233.1397\\\\313.01\\\\-50.97656\\\\233.1818\\\\313.01\\\\-62.69531\\\\233.1652\\\\313.01\\\\-65.03906\\\\232.5396\\\\313.01\\\\-67.38281\\\\232.8735\\\\313.01\\\\-72.07031\\\\232.9942\\\\313.01\\\\-81.44531\\\\233.0343\\\\313.01\\\\-86.13281\\\\233.0283\\\\313.01\\\\-95.50781\\\\233.0951\\\\313.01\\\\-97.85156\\\\233.3584\\\\313.01\\\\-100.1953\\\\233.9981\\\\313.01\\\\-102.5391\\\\234.0754\\\\313.01\\\\-107.2266\\\\233.9926\\\\313.01\\\\-109.5703\\\\234.0754\\\\313.01\\\\-114.2578\\\\234.0284\\\\313.01\\\\-123.6328\\\\234.0805\\\\313.01\\\\-130.6641\\\\234.0855\\\\313.01\\\\-135.3516\\\\234.1407\\\\313.01\\\\-137.6953\\\\234.1127\\\\313.01\\\\-142.3828\\\\234.1889\\\\313.01\\\\-147.0703\\\\234.1038\\\\313.01\\\\-154.1016\\\\234.0513\\\\313.01\\\\-158.7891\\\\234.0691\\\\313.01\\\\-165.8203\\\\234.0211\\\\313.01\\\\-168.1641\\\\234.1579\\\\313.01\\\\-172.8516\\\\234.2175\\\\313.01\\\\-175.1953\\\\234.1894\\\\313.01\\\\-184.5703\\\\234.2686\\\\313.01\\\\-189.2578\\\\234.2252\\\\313.01\\\\-193.9453\\\\234.2289\\\\313.01\\\\-200.9766\\\\234.2902\\\\313.01\\\\-205.6641\\\\234.1783\\\\313.01\\\\-210.3516\\\\234.2822\\\\313.01\\\\-215.0391\\\\234.3418\\\\313.01\\\\-222.0703\\\\234.3731\\\\313.01\\\\-226.7578\\\\234.3601\\\\313.01\\\\-233.7891\\\\234.1731\\\\313.01\\\\-238.4766\\\\234.2088\\\\313.01\\\\-243.1641\\\\234.1523\\\\313.01\\\\-247.8516\\\\233.8669\\\\313.01\\\\-250.1953\\\\233.9436\\\\313.01\\\\-254.8828\\\\234.2296\\\\313.01\\\\-257.2266\\\\234.63\\\\313.01\\\\-259.5703\\\\235.982\\\\313.01\\\\-260.9235\\\\237.0609\\\\313.01\\\\-262.7961\\\\239.4047\\\\313.01\\\\-262.9268\\\\241.7484\\\\313.01\\\\-262.2656\\\\244.0922\\\\313.01\\\\-261.032\\\\246.4359\\\\313.01\\\\-259.6734\\\\248.7797\\\\313.01\\\\-257.5789\\\\251.1234\\\\313.01\\\\-255.7048\\\\253.4672\\\\313.01\\\\-252.5391\\\\256.6491\\\\313.01\\\\-250.1953\\\\258.9388\\\\313.01\\\\-247.8516\\\\261.453\\\\313.01\\\\-245.5078\\\\263.6436\\\\313.01\\\\-244.1278\\\\265.1859\\\\313.01\\\\-241.655\\\\267.5297\\\\313.01\\\\-239.4557\\\\269.8734\\\\313.01\\\\-233.7891\\\\275.4082\\\\313.01\\\\-231.4453\\\\277.8406\\\\313.01\\\\-229.1016\\\\280.0036\\\\313.01\\\\-226.7578\\\\282.5503\\\\313.01\\\\-225.1923\\\\283.9359\\\\313.01\\\\-222.0703\\\\287.2287\\\\313.01\\\\-220.5585\\\\288.6234\\\\313.01\\\\-218.3552\\\\290.9672\\\\313.01\\\\-217.3828\\\\291.7043\\\\313.01\\\\-214.921\\\\293.3109\\\\313.01\\\\-212.6953\\\\294.6401\\\\313.01\\\\-210.3516\\\\295.3416\\\\313.01\\\\-208.0078\\\\296.4592\\\\313.01\\\\-205.6641\\\\296.8858\\\\313.01\\\\-203.3203\\\\297.1639\\\\313.01\\\\-196.2891\\\\297.1254\\\\313.01\\\\-193.9453\\\\297.0099\\\\313.01\\\\-177.5391\\\\296.8925\\\\313.01\\\\-165.8203\\\\296.8423\\\\313.01\\\\-154.1016\\\\296.851\\\\313.01\\\\-147.0703\\\\296.8843\\\\313.01\\\\-144.7266\\\\296.8517\\\\313.01\\\\-137.6953\\\\296.894\\\\313.01\\\\-125.9766\\\\296.9214\\\\313.01\\\\-116.6016\\\\296.8896\\\\313.01\\\\-111.9141\\\\296.8447\\\\313.01\\\\-95.50781\\\\296.8738\\\\313.01\\\\-93.16406\\\\296.9016\\\\313.01\\\\-83.78906\\\\296.9028\\\\313.01\\\\-74.41406\\\\296.9514\\\\313.01\\\\-65.03906\\\\296.9644\\\\313.01\\\\-60.35156\\\\296.916\\\\313.01\\\\-58.00781\\\\296.9377\\\\313.01\\\\-55.66406\\\\297.3491\\\\313.01\\\\-53.32031\\\\296.9377\\\\313.01\\\\-50.97656\\\\296.9285\\\\313.01\\\\-48.63281\\\\297.1917\\\\313.01\\\\-46.28906\\\\297.1807\\\\313.01\\\\-43.94531\\\\297.2621\\\\313.01\\\\-41.60156\\\\297.2199\\\\313.01\\\\-39.25781\\\\297.3984\\\\313.01\\\\-36.91406\\\\297.402\\\\313.01\\\\-34.57031\\\\297.0362\\\\313.01\\\\-32.22656\\\\297.4125\\\\313.01\\\\-29.88281\\\\297.4125\\\\313.01\\\\-27.53906\\\\297.2416\\\\313.01\\\\-25.19531\\\\297.4125\\\\313.01\\\\-22.85156\\\\297.3879\\\\313.01\\\\-20.50781\\\\297.0121\\\\313.01\\\\-18.16406\\\\297.3299\\\\313.01\\\\-15.82031\\\\297.1454\\\\313.01\\\\-11.13281\\\\297.2468\\\\313.01\\\\-8.789063\\\\296.9557\\\\313.01\\\\-6.445313\\\\297.4125\\\\313.01\\\\-4.101563\\\\296.9731\\\\313.01\\\\2.929688\\\\296.9191\\\\313.01\\\\5.273438\\\\297.0809\\\\313.01\\\\7.617188\\\\296.8877\\\\313.01\\\\12.30469\\\\296.8055\\\\313.01\\\\16.99219\\\\296.837\\\\313.01\\\\21.67969\\\\296.8058\\\\313.01\\\\31.05469\\\\296.8159\\\\313.01\\\\35.74219\\\\296.7436\\\\313.01\\\\40.42969\\\\296.7743\\\\313.01\\\\47.46094\\\\296.734\\\\313.01\\\\52.14844\\\\296.6724\\\\313.01\\\\61.52344\\\\296.6635\\\\313.01\\\\66.21094\\\\296.5942\\\\313.01\\\\73.24219\\\\296.5901\\\\313.01\\\\80.27344\\\\296.5284\\\\313.01\\\\82.61719\\\\296.5569\\\\313.01\\\\87.30469\\\\296.4947\\\\313.01\\\\91.99219\\\\296.5134\\\\313.01\\\\96.67969\\\\296.473\\\\313.01\\\\115.4297\\\\296.3986\\\\313.01\\\\134.1797\\\\296.2873\\\\313.01\\\\136.5234\\\\295.9046\\\\313.01\\\\138.8672\\\\295.9102\\\\313.01\\\\141.2109\\\\296.0271\\\\313.01\\\\143.5547\\\\295.8654\\\\313.01\\\\148.2422\\\\295.864\\\\313.01\\\\159.9609\\\\295.7849\\\\313.01\\\\164.6484\\\\295.6819\\\\313.01\\\\169.3359\\\\295.6998\\\\313.01\\\\178.7109\\\\295.6638\\\\313.01\\\\188.0859\\\\295.5742\\\\313.01\\\\192.7734\\\\295.5916\\\\313.01\\\\197.4609\\\\295.8172\\\\313.01\\\\199.8047\\\\295.8012\\\\313.01\\\\202.1484\\\\295.6998\\\\313.01\\\\204.4922\\\\295.4287\\\\313.01\\\\206.8359\\\\294.8307\\\\313.01\\\\209.1797\\\\294.3768\\\\313.01\\\\211.5234\\\\292.4688\\\\313.01\\\\213.8672\\\\291.1765\\\\313.01\\\\216.2109\\\\289.627\\\\313.01\\\\217.2822\\\\288.6234\\\\313.01\\\\219.371\\\\286.2797\\\\313.01\\\\221.7773\\\\283.9359\\\\313.01\\\\225.5859\\\\279.9482\\\\313.01\\\\228.6426\\\\276.9047\\\\313.01\\\\230.2734\\\\275.138\\\\313.01\\\\233.135\\\\272.2172\\\\313.01\\\\235.3423\\\\269.8734\\\\313.01\\\\237.73\\\\267.5297\\\\313.01\\\\239.6484\\\\265.4964\\\\313.01\\\\246.9323\\\\258.1547\\\\313.01\\\\251.4581\\\\253.4672\\\\313.01\\\\256.0547\\\\248.1981\\\\313.01\\\\257.454\\\\246.4359\\\\313.01\\\\259.6265\\\\244.0922\\\\313.01\\\\261.2413\\\\239.4047\\\\313.01\\\\260.4736\\\\237.0609\\\\313.01\\\\259.4369\\\\234.7172\\\\313.01\\\\258.3984\\\\233.723\\\\313.01\\\\256.0547\\\\233.1051\\\\313.01\\\\253.7109\\\\232.7947\\\\313.01\\\\249.0234\\\\232.8704\\\\313.01\\\\244.3359\\\\232.8072\\\\313.01\\\\239.6484\\\\233.0207\\\\313.01\\\\237.3047\\\\233.0007\\\\313.01\\\\232.6172\\\\233.0726\\\\313.01\\\\227.9297\\\\233.0305\\\\313.01\\\\216.2109\\\\233.0632\\\\313.01\\\\206.8359\\\\233.0207\\\\313.01\\\\204.4922\\\\232.7456\\\\313.01\\\\202.1484\\\\232.6745\\\\313.01\\\\197.4609\\\\232.7322\\\\313.01\\\\192.7734\\\\232.7456\\\\313.01\\\\188.0859\\\\232.7048\\\\313.01\\\\178.7109\\\\232.7588\\\\313.01\\\\174.0234\\\\232.7322\\\\313.01\\\\166.9922\\\\232.7456\\\\313.01\\\\162.3047\\\\232.7848\\\\313.01\\\\157.6172\\\\232.7746\\\\313.01\\\\148.2422\\\\232.8003\\\\313.01\\\\143.5547\\\\232.7746\\\\313.01\\\\141.2109\\\\232.6908\\\\313.01\\\\134.1797\\\\232.6329\\\\313.01\\\\131.8359\\\\232.0401\\\\313.01\\\\129.4922\\\\231.6858\\\\313.01\\\\127.1484\\\\231.6664\\\\313.01\\\\120.1172\\\\231.7875\\\\313.01\\\\117.7734\\\\232.6329\\\\313.01\\\\110.7422\\\\232.6623\\\\313.01\\\\108.3984\\\\231.8903\\\\313.01\\\\106.0547\\\\231.6022\\\\313.01\\\\103.7109\\\\231.5567\\\\313.01\\\\102.832\\\\232.3734\\\\313.01\\\\101.3672\\\\233.1221\\\\313.01\\\\94.33594\\\\233.1042\\\\313.01\\\\87.30469\\\\233.1397\\\\313.01\\\\82.61719\\\\233.1132\\\\313.01\\\\77.92969\\\\233.1397\\\\313.01\\\\59.17969\\\\233.1568\\\\313.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"374\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.1132\\\\316.01\\\\-34.57031\\\\233.1132\\\\316.01\\\\-39.25781\\\\233.1568\\\\316.01\\\\-41.60156\\\\233.131\\\\316.01\\\\-50.97656\\\\233.1818\\\\316.01\\\\-55.66406\\\\233.1652\\\\316.01\\\\-60.35156\\\\233.2393\\\\316.01\\\\-62.69531\\\\233.1818\\\\316.01\\\\-65.03906\\\\232.7048\\\\316.01\\\\-67.38281\\\\232.8967\\\\316.01\\\\-72.07031\\\\233.0145\\\\316.01\\\\-81.44531\\\\233.0479\\\\316.01\\\\-86.13281\\\\233.0382\\\\316.01\\\\-95.50781\\\\233.0951\\\\316.01\\\\-97.85156\\\\233.3265\\\\316.01\\\\-100.1953\\\\233.9981\\\\316.01\\\\-102.5391\\\\234.0805\\\\316.01\\\\-107.2266\\\\234.0231\\\\316.01\\\\-111.9141\\\\234.0891\\\\316.01\\\\-114.2578\\\\234.0411\\\\316.01\\\\-121.2891\\\\234.054\\\\316.01\\\\-123.6328\\\\234.1127\\\\316.01\\\\-130.6641\\\\234.0672\\\\316.01\\\\-133.0078\\\\234.1127\\\\316.01\\\\-142.3828\\\\234.1741\\\\316.01\\\\-147.0703\\\\234.1174\\\\316.01\\\\-151.7578\\\\234.1127\\\\316.01\\\\-161.1328\\\\234.0263\\\\316.01\\\\-165.8203\\\\234.0387\\\\316.01\\\\-168.1641\\\\234.1894\\\\316.01\\\\-170.5078\\\\234.2503\\\\316.01\\\\-175.1953\\\\234.2073\\\\316.01\\\\-186.9141\\\\234.2539\\\\316.01\\\\-189.2578\\\\234.2112\\\\316.01\\\\-193.9453\\\\234.2289\\\\316.01\\\\-200.9766\\\\234.3204\\\\316.01\\\\-205.6641\\\\234.1916\\\\316.01\\\\-212.6953\\\\234.3573\\\\316.01\\\\-222.0703\\\\234.4053\\\\316.01\\\\-226.7578\\\\234.3731\\\\316.01\\\\-233.7891\\\\234.2125\\\\316.01\\\\-238.4766\\\\234.226\\\\316.01\\\\-243.1641\\\\234.1068\\\\316.01\\\\-247.8516\\\\233.8141\\\\316.01\\\\-250.1953\\\\233.8749\\\\316.01\\\\-254.8828\\\\234.2268\\\\316.01\\\\-257.2266\\\\234.5565\\\\316.01\\\\-259.5703\\\\235.9516\\\\316.01\\\\-260.9418\\\\237.0609\\\\316.01\\\\-262.8647\\\\239.4047\\\\316.01\\\\-263.0318\\\\241.7484\\\\316.01\\\\-262.4791\\\\244.0922\\\\316.01\\\\-261.0516\\\\246.4359\\\\316.01\\\\-259.5703\\\\248.5972\\\\316.01\\\\-257.2266\\\\251.3685\\\\316.01\\\\-255.6122\\\\253.4672\\\\316.01\\\\-252.5391\\\\256.6377\\\\316.01\\\\-250.1953\\\\258.9164\\\\316.01\\\\-247.8516\\\\261.4313\\\\316.01\\\\-245.5078\\\\263.6035\\\\316.01\\\\-244.1\\\\265.1859\\\\316.01\\\\-241.649\\\\267.5297\\\\316.01\\\\-239.4557\\\\269.8734\\\\316.01\\\\-233.7891\\\\275.4139\\\\316.01\\\\-231.4453\\\\277.8628\\\\316.01\\\\-229.1016\\\\280.0036\\\\316.01\\\\-226.7578\\\\282.5439\\\\316.01\\\\-225.1864\\\\283.9359\\\\316.01\\\\-222.0703\\\\287.2355\\\\316.01\\\\-220.5764\\\\288.6234\\\\316.01\\\\-218.3692\\\\290.9672\\\\316.01\\\\-214.9922\\\\293.3109\\\\316.01\\\\-212.6953\\\\294.6526\\\\316.01\\\\-210.3516\\\\295.3416\\\\316.01\\\\-208.0078\\\\296.4756\\\\316.01\\\\-205.6641\\\\296.892\\\\316.01\\\\-203.3203\\\\297.1563\\\\316.01\\\\-196.2891\\\\297.1297\\\\316.01\\\\-193.9453\\\\297.0023\\\\316.01\\\\-184.5703\\\\296.9636\\\\316.01\\\\-177.5391\\\\296.8925\\\\316.01\\\\-172.8516\\\\296.9032\\\\316.01\\\\-168.1641\\\\296.8568\\\\316.01\\\\-163.4766\\\\296.8895\\\\316.01\\\\-156.4453\\\\296.8506\\\\316.01\\\\-147.0703\\\\296.8921\\\\316.01\\\\-144.7266\\\\296.8517\\\\316.01\\\\-125.9766\\\\296.9402\\\\316.01\\\\-121.2891\\\\296.8887\\\\316.01\\\\-118.9453\\\\296.9077\\\\316.01\\\\-111.9141\\\\296.8723\\\\316.01\\\\-102.5391\\\\296.9016\\\\316.01\\\\-95.50781\\\\296.8837\\\\316.01\\\\-88.47656\\\\296.9322\\\\316.01\\\\-83.78906\\\\296.9234\\\\316.01\\\\-67.38281\\\\296.9841\\\\316.01\\\\-65.03906\\\\297.1698\\\\316.01\\\\-62.69531\\\\296.9377\\\\316.01\\\\-58.00781\\\\296.9377\\\\316.01\\\\-55.66406\\\\297.2922\\\\316.01\\\\-53.32031\\\\297.2468\\\\316.01\\\\-50.97656\\\\296.9396\\\\316.01\\\\-48.63281\\\\297.1798\\\\316.01\\\\-46.28906\\\\296.9579\\\\316.01\\\\-43.94531\\\\297.1687\\\\316.01\\\\-41.60156\\\\296.9285\\\\316.01\\\\-39.25781\\\\297.2089\\\\316.01\\\\-36.91406\\\\296.9303\\\\316.01\\\\-34.57031\\\\296.9396\\\\316.01\\\\-32.22656\\\\297.1373\\\\316.01\\\\-29.88281\\\\297.4229\\\\316.01\\\\-27.53906\\\\296.9396\\\\316.01\\\\-25.19531\\\\296.9954\\\\316.01\\\\-22.85156\\\\297.3383\\\\316.01\\\\-20.50781\\\\296.9358\\\\316.01\\\\-18.16406\\\\296.9467\\\\316.01\\\\-15.82031\\\\297.1454\\\\316.01\\\\-13.47656\\\\297.0061\\\\316.01\\\\-11.13281\\\\297.2089\\\\316.01\\\\-8.789063\\\\296.9067\\\\316.01\\\\-6.445313\\\\297.1687\\\\316.01\\\\-4.101563\\\\296.9358\\\\316.01\\\\-1.757813\\\\297.2875\\\\316.01\\\\0.5859375\\\\296.9081\\\\316.01\\\\7.617188\\\\296.8985\\\\316.01\\\\12.30469\\\\296.8161\\\\316.01\\\\14.64844\\\\296.8372\\\\316.01\\\\19.33594\\\\296.7743\\\\316.01\\\\21.67969\\\\296.8055\\\\316.01\\\\31.05469\\\\296.7843\\\\316.01\\\\35.74219\\\\296.7247\\\\316.01\\\\40.42969\\\\296.7743\\\\316.01\\\\42.77344\\\\296.7154\\\\316.01\\\\45.11719\\\\296.7546\\\\316.01\\\\49.80469\\\\296.6839\\\\316.01\\\\63.86719\\\\296.6346\\\\316.01\\\\66.21094\\\\296.5862\\\\316.01\\\\75.58594\\\\296.5696\\\\316.01\\\\77.92969\\\\296.5208\\\\316.01\\\\82.61719\\\\296.549\\\\316.01\\\\89.64844\\\\296.4947\\\\316.01\\\\94.33594\\\\296.5005\\\\316.01\\\\96.67969\\\\296.4597\\\\316.01\\\\108.3984\\\\296.4393\\\\316.01\\\\113.0859\\\\296.3846\\\\316.01\\\\120.1172\\\\296.3782\\\\316.01\\\\127.1484\\\\296.308\\\\316.01\\\\134.1797\\\\296.2929\\\\316.01\\\\136.5234\\\\295.9009\\\\316.01\\\\138.8672\\\\295.9433\\\\316.01\\\\148.2422\\\\295.833\\\\316.01\\\\150.5859\\\\295.864\\\\316.01\\\\152.9297\\\\295.8012\\\\316.01\\\\157.6172\\\\295.8012\\\\316.01\\\\166.9922\\\\295.6638\\\\316.01\\\\174.0234\\\\295.6998\\\\316.01\\\\183.3984\\\\295.6093\\\\316.01\\\\192.7734\\\\295.6093\\\\316.01\\\\197.4609\\\\295.8012\\\\316.01\\\\202.1484\\\\295.6998\\\\316.01\\\\204.4922\\\\295.4137\\\\316.01\\\\206.8359\\\\294.8185\\\\316.01\\\\209.1797\\\\294.3768\\\\316.01\\\\211.5234\\\\292.4764\\\\316.01\\\\213.8672\\\\291.1916\\\\316.01\\\\216.2109\\\\289.6328\\\\316.01\\\\217.2822\\\\288.6234\\\\316.01\\\\219.3814\\\\286.2797\\\\316.01\\\\221.8029\\\\283.9359\\\\316.01\\\\225.5859\\\\279.9599\\\\316.01\\\\227.9297\\\\277.6382\\\\316.01\\\\230.2734\\\\275.1772\\\\316.01\\\\233.2298\\\\272.2172\\\\316.01\\\\234.9609\\\\270.3593\\\\316.01\\\\239.6484\\\\265.57\\\\316.01\\\\246.9653\\\\258.1547\\\\316.01\\\\251.4385\\\\253.4672\\\\316.01\\\\256.0547\\\\248.2196\\\\316.01\\\\257.4986\\\\246.4359\\\\316.01\\\\259.7266\\\\244.0922\\\\316.01\\\\260.7422\\\\241.4555\\\\316.01\\\\261.4258\\\\239.4047\\\\316.01\\\\260.7422\\\\237.3192\\\\316.01\\\\259.477\\\\234.7172\\\\316.01\\\\258.3984\\\\233.6994\\\\316.01\\\\256.0547\\\\233.0592\\\\316.01\\\\253.7109\\\\232.7025\\\\316.01\\\\251.3672\\\\232.81\\\\316.01\\\\246.6797\\\\232.7563\\\\316.01\\\\241.9922\\\\232.9906\\\\316.01\\\\237.3047\\\\233.0007\\\\316.01\\\\232.6172\\\\233.0632\\\\316.01\\\\227.9297\\\\233.0305\\\\316.01\\\\211.5234\\\\233.0537\\\\316.01\\\\206.8359\\\\233.0245\\\\316.01\\\\204.4922\\\\232.7588\\\\316.01\\\\202.1484\\\\232.6623\\\\316.01\\\\195.1172\\\\232.7186\\\\316.01\\\\188.0859\\\\232.7186\\\\316.01\\\\183.3984\\\\232.7719\\\\316.01\\\\181.0547\\\\232.7322\\\\316.01\\\\169.3359\\\\232.7588\\\\316.01\\\\166.9922\\\\232.7322\\\\316.01\\\\157.6172\\\\232.7875\\\\316.01\\\\152.9297\\\\232.7456\\\\316.01\\\\145.8984\\\\232.7875\\\\316.01\\\\141.2109\\\\232.6623\\\\316.01\\\\136.5234\\\\232.6329\\\\316.01\\\\134.1797\\\\232.0805\\\\316.01\\\\131.8359\\\\231.7245\\\\316.01\\\\127.1484\\\\231.6801\\\\316.01\\\\122.4609\\\\231.7572\\\\316.01\\\\120.1172\\\\232.5873\\\\316.01\\\\115.4297\\\\232.6908\\\\316.01\\\\110.7422\\\\232.6623\\\\316.01\\\\108.3984\\\\231.8903\\\\316.01\\\\106.0547\\\\231.6087\\\\316.01\\\\103.7109\\\\231.5483\\\\316.01\\\\102.8224\\\\232.3734\\\\316.01\\\\101.3672\\\\233.1132\\\\316.01\\\\99.02344\\\\233.1397\\\\316.01\\\\80.27344\\\\233.1132\\\\316.01\\\\68.55469\\\\233.1568\\\\316.01\\\\52.14844\\\\233.1483\\\\316.01\\\\45.11719\\\\233.1132\\\\316.01\\\\44.13628\\\\232.3734\\\\316.01\\\\42.77344\\\\231.0686\\\\316.01\\\\42.00247\\\\230.0297\\\\316.01\\\\42.77344\\\\229.1926\\\\316.01\\\\45.11719\\\\228.465\\\\316.01\\\\47.46094\\\\226.9633\\\\316.01\\\\49.80469\\\\225.8906\\\\316.01\\\\52.14844\\\\224.4715\\\\316.01\\\\54.49219\\\\223.5304\\\\316.01\\\\55.10944\\\\222.9984\\\\316.01\\\\59.17969\\\\220.0478\\\\316.01\\\\61.52344\\\\218.6274\\\\316.01\\\\64.72018\\\\215.9672\\\\316.01\\\\66.21094\\\\214.8258\\\\316.01\\\\70.89844\\\\210.3064\\\\316.01\\\\72.20967\\\\208.9359\\\\316.01\\\\76.32568\\\\204.2484\\\\316.01\\\\77.88355\\\\201.9047\\\\316.01\\\\81.18286\\\\197.2172\\\\316.01\\\\82.483\\\\194.8734\\\\316.01\\\\83.97971\\\\192.5297\\\\316.01\\\\85.15485\\\\190.1859\\\\316.01\\\\86.11506\\\\187.8422\\\\316.01\\\\88.44123\\\\183.1547\\\\316.01\\\\88.85645\\\\180.8109\\\\316.01\\\\90.57047\\\\176.1234\\\\316.01\\\\91.12964\\\\173.7797\\\\316.01\\\\91.82967\\\\171.4359\\\\316.01\\\\92.67867\\\\169.0922\\\\316.01\\\\93.02273\\\\166.7484\\\\316.01\\\\93.23618\\\\162.0609\\\\316.01\\\\93.4022\\\\157.3734\\\\316.01\\\\93.45381\\\\152.6859\\\\316.01\\\\93.30592\\\\147.9984\\\\316.01\\\\93.08162\\\\143.3109\\\\316.01\\\\92.91119\\\\140.9672\\\\316.01\\\\92.40625\\\\138.6234\\\\316.01\\\\91.51611\\\\136.2797\\\\316.01\\\\90.39767\\\\131.5922\\\\316.01\\\\89.42243\\\\129.2484\\\\316.01\\\\88.71695\\\\126.9047\\\\316.01\\\\88.25335\\\\124.5609\\\\316.01\\\\86.80245\\\\122.2172\\\\316.01\\\\85.8848\\\\119.8734\\\\316.01\\\\84.58316\\\\117.5297\\\\316.01\\\\83.66635\\\\115.1859\\\\316.01\\\\81.8702\\\\112.8422\\\\316.01\\\\80.80811\\\\110.4984\\\\316.01\\\\79.08266\\\\108.1547\\\\316.01\\\\77.10529\\\\105.8109\\\\316.01\\\\75.58594\\\\103.5963\\\\316.01\\\\73.49802\\\\101.1234\\\\316.01\\\\71.40904\\\\98.77969\\\\316.01\\\\68.55469\\\\95.92896\\\\316.01\\\\63.67357\\\\91.74844\\\\316.01\\\\61.52344\\\\90.32737\\\\316.01\\\\59.17969\\\\88.27599\\\\316.01\\\\56.83594\\\\86.7886\\\\316.01\\\\54.49219\\\\85.58972\\\\316.01\\\\52.14844\\\\83.79642\\\\316.01\\\\49.80469\\\\83.02673\\\\316.01\\\\47.46094\\\\81.63853\\\\316.01\\\\45.11719\\\\80.76684\\\\316.01\\\\42.77344\\\\79.30589\\\\316.01\\\\38.08594\\\\78.27902\\\\316.01\\\\35.74219\\\\77.25775\\\\316.01\\\\33.39844\\\\76.59698\\\\316.01\\\\31.05469\\\\76.1613\\\\316.01\\\\28.71094\\\\75.56659\\\\316.01\\\\26.36719\\\\74.74911\\\\316.01\\\\24.02344\\\\74.44027\\\\316.01\\\\14.64844\\\\74.10455\\\\316.01\\\\9.960938\\\\74.14651\\\\316.01\\\\5.273438\\\\74.273\\\\316.01\\\\2.929688\\\\74.39614\\\\316.01\\\\0.5859375\\\\74.68565\\\\316.01\\\\-1.757813\\\\75.2776\\\\316.01\\\\-4.101563\\\\75.97835\\\\316.01\\\\-6.445313\\\\76.42603\\\\316.01\\\\-8.789063\\\\77.04977\\\\316.01\\\\-11.13281\\\\78.0173\\\\316.01\\\\-13.47656\\\\78.67566\\\\316.01\\\\-15.82031\\\\79.13776\\\\316.01\\\\-18.16406\\\\80.56435\\\\316.01\\\\-20.50781\\\\81.50463\\\\316.01\\\\-22.85156\\\\82.9015\\\\316.01\\\\-25.19531\\\\83.68569\\\\316.01\\\\-27.53906\\\\85.50075\\\\316.01\\\\-29.88281\\\\86.57327\\\\316.01\\\\-32.22656\\\\88.24621\\\\316.01\\\\-34.57031\\\\90.17396\\\\316.01\\\\-36.86175\\\\91.74844\\\\316.01\\\\-39.25781\\\\93.66087\\\\316.01\\\\-41.60156\\\\95.69225\\\\316.01\\\\-46.92759\\\\101.1234\\\\316.01\\\\-50.43298\\\\105.8109\\\\316.01\\\\-52.27513\\\\108.1547\\\\316.01\\\\-53.92769\\\\110.4984\\\\316.01\\\\-55.28938\\\\112.8422\\\\316.01\\\\-56.8119\\\\115.1859\\\\316.01\\\\-57.76507\\\\117.5297\\\\316.01\\\\-59.14436\\\\119.8734\\\\316.01\\\\-61.2854\\\\124.5609\\\\316.01\\\\-61.77901\\\\126.9047\\\\316.01\\\\-62.87364\\\\129.2484\\\\316.01\\\\-63.78268\\\\131.5922\\\\316.01\\\\-64.18945\\\\133.9359\\\\316.01\\\\-64.71442\\\\136.2797\\\\316.01\\\\-65.51514\\\\138.6234\\\\316.01\\\\-65.81827\\\\140.9672\\\\316.01\\\\-66.45339\\\\147.9984\\\\316.01\\\\-66.7085\\\\152.6859\\\\316.01\\\\-66.75646\\\\155.0297\\\\316.01\\\\-66.5637\\\\159.7172\\\\316.01\\\\-66.21094\\\\164.4047\\\\316.01\\\\-65.704\\\\169.0922\\\\316.01\\\\-65.23297\\\\171.4359\\\\316.01\\\\-64.38361\\\\173.7797\\\\316.01\\\\-64.01566\\\\176.1234\\\\316.01\\\\-63.38504\\\\178.4672\\\\316.01\\\\-62.17049\\\\180.8109\\\\316.01\\\\-60.82787\\\\185.4984\\\\316.01\\\\-59.41992\\\\187.8422\\\\316.01\\\\-58.36174\\\\190.1859\\\\316.01\\\\-56.99887\\\\192.5297\\\\316.01\\\\-56.07342\\\\194.8734\\\\316.01\\\\-55.66406\\\\195.3297\\\\316.01\\\\-53.32031\\\\198.7587\\\\316.01\\\\-52.68821\\\\199.5609\\\\316.01\\\\-51.4049\\\\201.9047\\\\316.01\\\\-50.97656\\\\202.358\\\\316.01\\\\-47.5612\\\\206.5922\\\\316.01\\\\-45.21313\\\\208.9359\\\\316.01\\\\-43.05138\\\\211.2797\\\\316.01\\\\-39.25781\\\\214.893\\\\316.01\\\\-35.15625\\\\218.3109\\\\316.01\\\\-34.57031\\\\218.8701\\\\316.01\\\\-32.22656\\\\220.1266\\\\316.01\\\\-31.58335\\\\220.6547\\\\316.01\\\\-28.28872\\\\222.9984\\\\316.01\\\\-27.53906\\\\223.6396\\\\316.01\\\\-25.19531\\\\224.5407\\\\316.01\\\\-22.85156\\\\226.027\\\\316.01\\\\-20.50781\\\\227.0401\\\\316.01\\\\-18.16406\\\\228.5211\\\\316.01\\\\-15.82031\\\\229.1818\\\\316.01\\\\-14.99192\\\\230.0297\\\\316.01\\\\-15.82031\\\\231.3521\\\\316.01\\\\-16.89078\\\\232.3734\\\\316.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"371\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"15\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n"; +const char* k_rtStruct_json04 = +" \"Value\" : \"-18.16406\\\\233.1221\\\\319.01\\\\-32.22656\\\\233.131\\\\319.01\\\\-39.25781\\\\233.1568\\\\319.01\\\\-43.94531\\\\233.1397\\\\319.01\\\\-53.32031\\\\233.19\\\\319.01\\\\-58.00781\\\\233.1818\\\\319.01\\\\-60.35156\\\\233.5756\\\\319.01\\\\-62.69531\\\\233.19\\\\319.01\\\\-65.03906\\\\232.9081\\\\319.01\\\\-67.38281\\\\232.8852\\\\319.01\\\\-72.07031\\\\233.0044\\\\319.01\\\\-76.75781\\\\233.0343\\\\319.01\\\\-83.78906\\\\233.0343\\\\319.01\\\\-88.47656\\\\233.0859\\\\319.01\\\\-93.16406\\\\233.0859\\\\319.01\\\\-97.85156\\\\233.1569\\\\319.01\\\\-100.1953\\\\233.8986\\\\319.01\\\\-102.5391\\\\234.0359\\\\319.01\\\\-107.2266\\\\234.0231\\\\319.01\\\\-109.5703\\\\234.0754\\\\319.01\\\\-118.9453\\\\234.0411\\\\319.01\\\\-128.3203\\\\234.1127\\\\319.01\\\\-130.6641\\\\234.054\\\\319.01\\\\-142.3828\\\\234.1407\\\\319.01\\\\-147.0703\\\\234.0855\\\\319.01\\\\-151.7578\\\\234.1127\\\\319.01\\\\-158.7891\\\\234.0387\\\\319.01\\\\-165.8203\\\\234.0513\\\\319.01\\\\-170.5078\\\\234.2214\\\\319.01\\\\-175.1953\\\\234.1797\\\\319.01\\\\-186.9141\\\\234.2012\\\\319.01\\\\-189.2578\\\\234.1743\\\\319.01\\\\-191.6016\\\\234.2431\\\\319.01\\\\-198.6328\\\\234.2326\\\\319.01\\\\-200.9766\\\\234.2902\\\\319.01\\\\-205.6641\\\\234.1916\\\\319.01\\\\-212.6953\\\\234.3084\\\\319.01\\\\-215.0391\\\\234.2967\\\\319.01\\\\-222.0703\\\\234.3891\\\\319.01\\\\-224.4141\\\\234.3115\\\\319.01\\\\-229.1016\\\\234.3573\\\\319.01\\\\-233.7891\\\\234.2125\\\\319.01\\\\-238.4766\\\\234.1954\\\\319.01\\\\-243.1641\\\\234.0555\\\\319.01\\\\-247.8516\\\\233.7286\\\\319.01\\\\-250.1953\\\\233.7565\\\\319.01\\\\-252.5391\\\\233.9759\\\\319.01\\\\-257.2266\\\\234.7266\\\\319.01\\\\-259.5703\\\\235.9456\\\\319.01\\\\-260.9676\\\\237.0609\\\\319.01\\\\-262.9079\\\\239.4047\\\\319.01\\\\-263.0764\\\\241.7484\\\\319.01\\\\-262.579\\\\244.0922\\\\319.01\\\\-261.0551\\\\246.4359\\\\319.01\\\\-259.5703\\\\248.578\\\\319.01\\\\-257.2266\\\\251.3205\\\\319.01\\\\-255.5183\\\\253.4672\\\\319.01\\\\-252.5391\\\\256.6434\\\\319.01\\\\-250.1953\\\\258.9331\\\\319.01\\\\-247.8516\\\\261.4281\\\\319.01\\\\-245.5078\\\\263.6319\\\\319.01\\\\-244.1062\\\\265.1859\\\\319.01\\\\-241.6212\\\\267.5297\\\\319.01\\\\-239.4403\\\\269.8734\\\\319.01\\\\-233.7891\\\\275.424\\\\319.01\\\\-231.4453\\\\277.8534\\\\319.01\\\\-229.1016\\\\280.0498\\\\319.01\\\\-226.7578\\\\282.5503\\\\319.01\\\\-225.1923\\\\283.9359\\\\319.01\\\\-222.0703\\\\287.2521\\\\319.01\\\\-220.5829\\\\288.6234\\\\319.01\\\\-218.3594\\\\290.9672\\\\319.01\\\\-214.9922\\\\293.3109\\\\319.01\\\\-212.6953\\\\294.6526\\\\319.01\\\\-210.3516\\\\295.3282\\\\319.01\\\\-208.0078\\\\296.4917\\\\319.01\\\\-205.6641\\\\296.899\\\\319.01\\\\-203.3203\\\\297.1488\\\\319.01\\\\-196.2891\\\\297.1047\\\\319.01\\\\-193.9453\\\\296.9722\\\\319.01\\\\-184.5703\\\\296.9529\\\\319.01\\\\-177.5391\\\\296.8713\\\\319.01\\\\-163.4766\\\\296.8895\\\\319.01\\\\-144.7266\\\\296.8434\\\\319.01\\\\-135.3516\\\\296.8869\\\\319.01\\\\-133.0078\\\\296.8697\\\\319.01\\\\-116.6016\\\\296.916\\\\319.01\\\\-111.9141\\\\296.8811\\\\319.01\\\\-102.5391\\\\296.8641\\\\319.01\\\\-93.16406\\\\296.8746\\\\319.01\\\\-88.47656\\\\296.913\\\\319.01\\\\-81.44531\\\\296.8949\\\\319.01\\\\-79.10156\\\\296.9358\\\\319.01\\\\-67.38281\\\\296.9535\\\\319.01\\\\-65.03906\\\\296.9872\\\\319.01\\\\-62.69531\\\\296.9267\\\\319.01\\\\-58.00781\\\\296.9175\\\\319.01\\\\-55.66406\\\\297.0091\\\\319.01\\\\-50.97656\\\\296.9267\\\\319.01\\\\-46.28906\\\\296.9447\\\\319.01\\\\-43.94531\\\\297.0627\\\\319.01\\\\-41.60156\\\\296.8867\\\\319.01\\\\-36.91406\\\\296.8877\\\\319.01\\\\-32.22656\\\\296.9557\\\\319.01\\\\-29.88281\\\\297.2089\\\\319.01\\\\-27.53906\\\\296.9067\\\\319.01\\\\-22.85156\\\\296.998\\\\319.01\\\\-20.50781\\\\296.916\\\\319.01\\\\-15.82031\\\\297.0405\\\\319.01\\\\-13.47656\\\\296.9622\\\\319.01\\\\-11.13281\\\\296.9926\\\\319.01\\\\-8.789063\\\\296.9081\\\\319.01\\\\-4.101563\\\\296.9447\\\\319.01\\\\-1.757813\\\\297.0516\\\\319.01\\\\0.5859375\\\\296.8877\\\\319.01\\\\7.617188\\\\296.8888\\\\319.01\\\\16.99219\\\\296.8369\\\\319.01\\\\19.33594\\\\296.7851\\\\319.01\\\\28.71094\\\\296.7743\\\\319.01\\\\35.74219\\\\296.7043\\\\319.01\\\\45.11719\\\\296.7229\\\\319.01\\\\56.83594\\\\296.6313\\\\319.01\\\\63.86719\\\\296.6228\\\\319.01\\\\73.24219\\\\296.5616\\\\319.01\\\\75.58594\\\\296.5859\\\\319.01\\\\77.92969\\\\296.5154\\\\319.01\\\\91.99219\\\\296.5208\\\\319.01\\\\96.67969\\\\296.4597\\\\319.01\\\\101.3672\\\\296.4668\\\\319.01\\\\106.0547\\\\296.4124\\\\319.01\\\\108.3984\\\\296.4393\\\\319.01\\\\117.7734\\\\296.3922\\\\319.01\\\\122.4609\\\\296.391\\\\319.01\\\\127.1484\\\\296.3229\\\\319.01\\\\134.1797\\\\296.2817\\\\319.01\\\\136.5234\\\\295.884\\\\319.01\\\\138.8672\\\\296.2261\\\\319.01\\\\141.2109\\\\296.1486\\\\319.01\\\\145.8984\\\\295.864\\\\319.01\\\\152.9297\\\\295.833\\\\319.01\\\\155.2734\\\\295.7849\\\\319.01\\\\162.3047\\\\295.7849\\\\319.01\\\\164.6484\\\\295.7346\\\\319.01\\\\176.3672\\\\295.6638\\\\319.01\\\\183.3984\\\\295.6454\\\\319.01\\\\188.0859\\\\295.5916\\\\319.01\\\\192.7734\\\\295.6093\\\\319.01\\\\197.4609\\\\295.8172\\\\319.01\\\\202.1484\\\\295.7173\\\\319.01\\\\204.4922\\\\295.3989\\\\319.01\\\\206.8359\\\\294.803\\\\319.01\\\\209.1797\\\\294.3707\\\\319.01\\\\211.5234\\\\292.4764\\\\319.01\\\\213.8672\\\\291.2065\\\\319.01\\\\216.2109\\\\289.6522\\\\319.01\\\\217.2899\\\\288.6234\\\\319.01\\\\218.5547\\\\287.1418\\\\319.01\\\\221.8375\\\\283.9359\\\\319.01\\\\225.5859\\\\279.9363\\\\319.01\\\\227.9297\\\\277.6265\\\\319.01\\\\230.2734\\\\275.1683\\\\319.01\\\\233.3338\\\\272.2172\\\\319.01\\\\234.9609\\\\270.4222\\\\319.01\\\\244.3359\\\\260.8793\\\\319.01\\\\249.0234\\\\255.926\\\\319.01\\\\251.398\\\\253.4672\\\\319.01\\\\256.0547\\\\248.2237\\\\319.01\\\\257.5125\\\\246.4359\\\\319.01\\\\259.786\\\\244.0922\\\\319.01\\\\260.7422\\\\241.626\\\\319.01\\\\261.5214\\\\239.4047\\\\319.01\\\\260.7422\\\\237.1834\\\\319.01\\\\259.4941\\\\234.7172\\\\319.01\\\\258.3984\\\\233.6884\\\\319.01\\\\256.0547\\\\233.0498\\\\319.01\\\\253.7109\\\\232.7848\\\\319.01\\\\251.3672\\\\233.0989\\\\319.01\\\\249.0234\\\\232.8375\\\\319.01\\\\246.6797\\\\232.7692\\\\319.01\\\\241.9922\\\\233.0207\\\\319.01\\\\237.3047\\\\233.0108\\\\319.01\\\\232.6172\\\\233.0819\\\\319.01\\\\227.9297\\\\233.0402\\\\319.01\\\\211.5234\\\\233.0819\\\\319.01\\\\206.8359\\\\233.0245\\\\319.01\\\\204.4922\\\\232.7975\\\\319.01\\\\202.1484\\\\232.6767\\\\319.01\\\\199.8047\\\\232.6623\\\\319.01\\\\190.4297\\\\232.7588\\\\319.01\\\\185.7422\\\\232.7848\\\\319.01\\\\181.0547\\\\232.7588\\\\319.01\\\\169.3359\\\\232.7588\\\\319.01\\\\166.9922\\\\232.7048\\\\319.01\\\\159.9609\\\\232.7719\\\\319.01\\\\152.9297\\\\232.7346\\\\319.01\\\\148.2422\\\\232.7875\\\\319.01\\\\143.5547\\\\232.7481\\\\319.01\\\\138.8672\\\\232.5056\\\\319.01\\\\136.5234\\\\232.5056\\\\319.01\\\\134.1797\\\\232.0429\\\\319.01\\\\131.8359\\\\231.7224\\\\319.01\\\\129.4922\\\\231.6882\\\\319.01\\\\122.4609\\\\231.7224\\\\319.01\\\\120.1172\\\\232.6179\\\\319.01\\\\117.7734\\\\232.6767\\\\319.01\\\\113.0859\\\\232.6767\\\\319.01\\\\110.7422\\\\232.5557\\\\319.01\\\\108.3984\\\\231.8031\\\\319.01\\\\106.0547\\\\231.589\\\\319.01\\\\103.7109\\\\231.5244\\\\319.01\\\\102.7966\\\\232.3734\\\\319.01\\\\101.3672\\\\233.1042\\\\319.01\\\\96.67969\\\\233.131\\\\319.01\\\\89.64844\\\\233.1221\\\\319.01\\\\75.58594\\\\233.1483\\\\319.01\\\\70.89844\\\\233.1042\\\\319.01\\\\66.21094\\\\233.1652\\\\319.01\\\\56.83594\\\\233.131\\\\319.01\\\\52.14844\\\\233.1397\\\\319.01\\\\45.11719\\\\233.1042\\\\319.01\\\\44.14645\\\\232.3734\\\\319.01\\\\42.77344\\\\231.0593\\\\319.01\\\\42.01079\\\\230.0297\\\\319.01\\\\42.77344\\\\229.2013\\\\319.01\\\\45.11719\\\\228.447\\\\319.01\\\\47.46094\\\\226.9284\\\\319.01\\\\49.80469\\\\225.886\\\\319.01\\\\52.14844\\\\224.4503\\\\319.01\\\\54.49219\\\\223.4528\\\\319.01\\\\55.01404\\\\222.9984\\\\319.01\\\\59.17969\\\\220.0237\\\\319.01\\\\61.52344\\\\218.6082\\\\319.01\\\\64.67848\\\\215.9672\\\\319.01\\\\66.21094\\\\214.8015\\\\319.01\\\\70.89844\\\\210.2358\\\\319.01\\\\72.148\\\\208.9359\\\\319.01\\\\76.26517\\\\204.2484\\\\319.01\\\\77.81339\\\\201.9047\\\\319.01\\\\81.15081\\\\197.2172\\\\319.01\\\\82.41605\\\\194.8734\\\\319.01\\\\83.95089\\\\192.5297\\\\319.01\\\\85.09115\\\\190.1859\\\\319.01\\\\86.09138\\\\187.8422\\\\319.01\\\\88.39328\\\\183.1547\\\\319.01\\\\88.81863\\\\180.8109\\\\319.01\\\\90.54276\\\\176.1234\\\\319.01\\\\91.10133\\\\173.7797\\\\319.01\\\\91.76778\\\\171.4359\\\\319.01\\\\92.65485\\\\169.0922\\\\319.01\\\\92.99918\\\\166.7484\\\\319.01\\\\93.21165\\\\162.0609\\\\319.01\\\\93.36247\\\\157.3734\\\\319.01\\\\93.37488\\\\152.6859\\\\319.01\\\\93.27335\\\\147.9984\\\\319.01\\\\93.05807\\\\143.3109\\\\319.01\\\\92.86326\\\\140.9672\\\\319.01\\\\92.33733\\\\138.6234\\\\319.01\\\\91.43783\\\\136.2797\\\\319.01\\\\90.94626\\\\133.9359\\\\319.01\\\\90.36204\\\\131.5922\\\\319.01\\\\89.36162\\\\129.2484\\\\319.01\\\\88.68583\\\\126.9047\\\\319.01\\\\88.21825\\\\124.5609\\\\319.01\\\\86.72572\\\\122.2172\\\\319.01\\\\85.8493\\\\119.8734\\\\319.01\\\\84.53275\\\\117.5297\\\\319.01\\\\83.62613\\\\115.1859\\\\319.01\\\\81.8292\\\\112.8422\\\\319.01\\\\80.77354\\\\110.4984\\\\319.01\\\\79.05143\\\\108.1547\\\\319.01\\\\77.04742\\\\105.8109\\\\319.01\\\\75.58594\\\\103.674\\\\319.01\\\\73.4361\\\\101.1234\\\\319.01\\\\71.3485\\\\98.77969\\\\319.01\\\\68.55469\\\\95.97556\\\\319.01\\\\63.59904\\\\91.74844\\\\319.01\\\\61.52344\\\\90.34084\\\\319.01\\\\59.17969\\\\88.31962\\\\319.01\\\\56.83594\\\\86.83331\\\\319.01\\\\54.49219\\\\85.63074\\\\319.01\\\\52.14844\\\\83.82526\\\\319.01\\\\49.80469\\\\83.06862\\\\319.01\\\\47.46094\\\\81.65692\\\\319.01\\\\45.11719\\\\80.79234\\\\319.01\\\\42.77344\\\\79.31967\\\\319.01\\\\38.08594\\\\78.27902\\\\319.01\\\\35.74219\\\\77.28263\\\\319.01\\\\33.39844\\\\76.61404\\\\319.01\\\\31.05469\\\\76.1767\\\\319.01\\\\28.71094\\\\75.56659\\\\319.01\\\\26.36719\\\\74.77422\\\\319.01\\\\24.02344\\\\74.45255\\\\319.01\\\\14.64844\\\\74.10455\\\\319.01\\\\12.30469\\\\74.10455\\\\319.01\\\\5.273438\\\\74.26746\\\\319.01\\\\2.929688\\\\74.40346\\\\319.01\\\\0.5859375\\\\74.73805\\\\319.01\\\\-4.101563\\\\75.99764\\\\319.01\\\\-6.445313\\\\76.4192\\\\319.01\\\\-8.789063\\\\77.021\\\\319.01\\\\-11.13281\\\\78.0173\\\\319.01\\\\-13.47656\\\\78.67566\\\\319.01\\\\-15.82031\\\\79.11396\\\\319.01\\\\-18.16406\\\\80.51486\\\\319.01\\\\-20.50781\\\\81.46942\\\\319.01\\\\-22.85156\\\\82.85554\\\\319.01\\\\-25.19531\\\\83.66675\\\\319.01\\\\-27.53906\\\\85.46803\\\\319.01\\\\-29.88281\\\\86.52827\\\\319.01\\\\-32.22656\\\\88.23955\\\\319.01\\\\-34.57031\\\\90.13984\\\\319.01\\\\-36.9035\\\\91.74844\\\\319.01\\\\-41.60156\\\\95.65716\\\\319.01\\\\-46.9745\\\\101.1234\\\\319.01\\\\-50.48889\\\\105.8109\\\\319.01\\\\-52.30941\\\\108.1547\\\\319.01\\\\-53.97684\\\\110.4984\\\\319.01\\\\-55.34668\\\\112.8422\\\\319.01\\\\-56.83594\\\\115.1859\\\\319.01\\\\-57.84288\\\\117.5297\\\\319.01\\\\-59.17969\\\\119.8734\\\\319.01\\\\-60.35156\\\\122.2895\\\\319.01\\\\-61.30981\\\\124.5609\\\\319.01\\\\-61.83551\\\\126.9047\\\\319.01\\\\-62.94936\\\\129.2484\\\\319.01\\\\-63.81696\\\\131.5922\\\\319.01\\\\-64.21995\\\\133.9359\\\\319.01\\\\-64.78502\\\\136.2797\\\\319.01\\\\-65.56069\\\\138.6234\\\\319.01\\\\-65.84246\\\\140.9672\\\\319.01\\\\-66.49079\\\\147.9984\\\\319.01\\\\-66.73695\\\\152.6859\\\\319.01\\\\-66.80727\\\\155.0297\\\\319.01\\\\-66.62016\\\\159.7172\\\\319.01\\\\-66.24458\\\\164.4047\\\\319.01\\\\-65.7409\\\\169.0922\\\\319.01\\\\-65.32193\\\\171.4359\\\\319.01\\\\-64.43269\\\\173.7797\\\\319.01\\\\-64.03687\\\\176.1234\\\\319.01\\\\-63.43099\\\\178.4672\\\\319.01\\\\-62.2521\\\\180.8109\\\\319.01\\\\-61.52967\\\\183.1547\\\\319.01\\\\-60.90088\\\\185.4984\\\\319.01\\\\-59.4697\\\\187.8422\\\\319.01\\\\-58.42364\\\\190.1859\\\\319.01\\\\-57.02597\\\\192.5297\\\\319.01\\\\-56.12809\\\\194.8734\\\\319.01\\\\-55.66406\\\\195.3972\\\\319.01\\\\-53.32031\\\\198.8418\\\\319.01\\\\-52.73438\\\\199.5609\\\\319.01\\\\-51.45956\\\\201.9047\\\\319.01\\\\-48.63281\\\\205.2587\\\\319.01\\\\-47.59325\\\\206.5922\\\\319.01\\\\-45.25587\\\\208.9359\\\\319.01\\\\-43.11045\\\\211.2797\\\\319.01\\\\-41.60156\\\\212.6377\\\\319.01\\\\-39.25781\\\\214.941\\\\319.01\\\\-35.2231\\\\218.3109\\\\319.01\\\\-34.57031\\\\218.9344\\\\319.01\\\\-32.22656\\\\220.1609\\\\319.01\\\\-31.63622\\\\220.6547\\\\319.01\\\\-28.34042\\\\222.9984\\\\319.01\\\\-27.53906\\\\223.6754\\\\319.01\\\\-25.19531\\\\224.5542\\\\319.01\\\\-22.85156\\\\226.0607\\\\319.01\\\\-20.50781\\\\227.0596\\\\319.01\\\\-18.16406\\\\228.5294\\\\319.01\\\\-15.82031\\\\229.1996\\\\319.01\\\\-15.00954\\\\230.0297\\\\319.01\\\\-15.82031\\\\231.333\\\\319.01\\\\-16.88058\\\\232.3734\\\\319.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"359\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"16\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"101.3672\\\\233.1221\\\\322.01\\\\80.27344\\\\233.131\\\\322.01\\\\75.58594\\\\233.1568\\\\322.01\\\\70.89844\\\\233.131\\\\322.01\\\\61.52344\\\\233.1652\\\\322.01\\\\45.11719\\\\233.1132\\\\322.01\\\\44.12896\\\\232.3734\\\\322.01\\\\42.77344\\\\231.076\\\\322.01\\\\42.00247\\\\230.0297\\\\322.01\\\\42.77344\\\\229.1926\\\\322.01\\\\45.11719\\\\228.4243\\\\322.01\\\\47.46094\\\\226.9242\\\\322.01\\\\49.80469\\\\225.8587\\\\322.01\\\\52.14844\\\\224.4422\\\\322.01\\\\54.49219\\\\223.4268\\\\322.01\\\\54.97742\\\\222.9984\\\\322.01\\\\59.17969\\\\220.0136\\\\322.01\\\\61.52344\\\\218.5471\\\\322.01\\\\64.65119\\\\215.9672\\\\322.01\\\\66.21094\\\\214.7764\\\\322.01\\\\70.89844\\\\210.1964\\\\322.01\\\\72.1096\\\\208.9359\\\\322.01\\\\76.2437\\\\204.2484\\\\322.01\\\\77.92969\\\\201.7078\\\\322.01\\\\81.11842\\\\197.2172\\\\322.01\\\\82.30748\\\\194.8734\\\\322.01\\\\82.61719\\\\194.5523\\\\322.01\\\\83.92992\\\\192.5297\\\\322.01\\\\85.04084\\\\190.1859\\\\322.01\\\\87.1582\\\\185.4984\\\\322.01\\\\88.36839\\\\183.1547\\\\322.01\\\\88.7899\\\\180.8109\\\\322.01\\\\89.56792\\\\178.4672\\\\322.01\\\\90.50697\\\\176.1234\\\\322.01\\\\91.68128\\\\171.4359\\\\322.01\\\\92.59956\\\\169.0922\\\\322.01\\\\92.97371\\\\166.7484\\\\322.01\\\\93.0934\\\\164.4047\\\\322.01\\\\93.33585\\\\157.3734\\\\322.01\\\\93.34813\\\\152.6859\\\\322.01\\\\93.22983\\\\147.9984\\\\322.01\\\\93.04629\\\\143.3109\\\\322.01\\\\92.83467\\\\140.9672\\\\322.01\\\\92.2954\\\\138.6234\\\\322.01\\\\91.39597\\\\136.2797\\\\322.01\\\\90.90752\\\\133.9359\\\\322.01\\\\90.32093\\\\131.5922\\\\322.01\\\\89.30564\\\\129.2484\\\\322.01\\\\88.67188\\\\126.9047\\\\322.01\\\\88.16579\\\\124.5609\\\\322.01\\\\86.67472\\\\122.2172\\\\322.01\\\\85.81149\\\\119.8734\\\\322.01\\\\84.49661\\\\117.5297\\\\322.01\\\\83.58636\\\\115.1859\\\\322.01\\\\81.76791\\\\112.8422\\\\322.01\\\\80.71002\\\\110.4984\\\\322.01\\\\79.01383\\\\108.1547\\\\322.01\\\\77.02567\\\\105.8109\\\\322.01\\\\75.58594\\\\103.7458\\\\322.01\\\\73.38867\\\\101.1234\\\\322.01\\\\71.30643\\\\98.77969\\\\322.01\\\\68.55469\\\\96.01372\\\\322.01\\\\63.52539\\\\91.74844\\\\322.01\\\\61.52344\\\\90.35172\\\\322.01\\\\59.17969\\\\88.35252\\\\322.01\\\\56.83594\\\\86.87999\\\\322.01\\\\54.49219\\\\85.66346\\\\322.01\\\\52.14844\\\\83.84647\\\\322.01\\\\49.80469\\\\83.09609\\\\322.01\\\\47.46094\\\\81.6853\\\\322.01\\\\45.11719\\\\80.80066\\\\322.01\\\\42.77344\\\\79.34901\\\\322.01\\\\38.08594\\\\78.30383\\\\322.01\\\\35.74219\\\\77.32118\\\\322.01\\\\33.39844\\\\76.64365\\\\322.01\\\\31.05469\\\\76.1918\\\\322.01\\\\28.71094\\\\75.59623\\\\322.01\\\\26.36719\\\\74.80752\\\\322.01\\\\24.02344\\\\74.45255\\\\322.01\\\\14.64844\\\\74.12846\\\\322.01\\\\12.30469\\\\74.11021\\\\322.01\\\\5.273438\\\\74.2905\\\\322.01\\\\2.929688\\\\74.40346\\\\322.01\\\\0.5859375\\\\74.73805\\\\322.01\\\\-4.101563\\\\76.01651\\\\322.01\\\\-6.445313\\\\76.43631\\\\322.01\\\\-8.789063\\\\77.04008\\\\322.01\\\\-11.13281\\\\78.04468\\\\322.01\\\\-13.47656\\\\78.69472\\\\322.01\\\\-15.82031\\\\79.13468\\\\322.01\\\\-18.16406\\\\80.51486\\\\322.01\\\\-20.50781\\\\81.47456\\\\322.01\\\\-22.85156\\\\82.85554\\\\322.01\\\\-25.19531\\\\83.68029\\\\322.01\\\\-27.53906\\\\85.48688\\\\322.01\\\\-29.88281\\\\86.53931\\\\322.01\\\\-32.22656\\\\88.25278\\\\322.01\\\\-34.57031\\\\90.1353\\\\322.01\\\\-36.86266\\\\91.74844\\\\322.01\\\\-39.25781\\\\93.66832\\\\322.01\\\\-41.60156\\\\95.6376\\\\322.01\\\\-47.00521\\\\101.1234\\\\322.01\\\\-50.52413\\\\105.8109\\\\322.01\\\\-50.97656\\\\106.3405\\\\322.01\\\\-54.00098\\\\110.4984\\\\322.01\\\\-56.85406\\\\115.1859\\\\322.01\\\\-57.8924\\\\117.5297\\\\322.01\\\\-59.20324\\\\119.8734\\\\322.01\\\\-60.36086\\\\122.2172\\\\322.01\\\\-61.32914\\\\124.5609\\\\322.01\\\\-61.85643\\\\126.9047\\\\322.01\\\\-63.04688\\\\129.2484\\\\322.01\\\\-63.83418\\\\131.5922\\\\322.01\\\\-64.24364\\\\133.9359\\\\322.01\\\\-65.59342\\\\138.6234\\\\322.01\\\\-65.87014\\\\140.9672\\\\322.01\\\\-66.32201\\\\145.6547\\\\322.01\\\\-66.68098\\\\150.3422\\\\322.01\\\\-66.85014\\\\155.0297\\\\322.01\\\\-66.7664\\\\157.3734\\\\322.01\\\\-66.48803\\\\162.0609\\\\322.01\\\\-65.75874\\\\169.0922\\\\322.01\\\\-65.3637\\\\171.4359\\\\322.01\\\\-64.4847\\\\173.7797\\\\322.01\\\\-64.05982\\\\176.1234\\\\322.01\\\\-63.44819\\\\178.4672\\\\322.01\\\\-62.28937\\\\180.8109\\\\322.01\\\\-61.54255\\\\183.1547\\\\322.01\\\\-60.94105\\\\185.4984\\\\322.01\\\\-59.49768\\\\187.8422\\\\322.01\\\\-58.49549\\\\190.1859\\\\322.01\\\\-57.04611\\\\192.5297\\\\322.01\\\\-56.17723\\\\194.8734\\\\322.01\\\\-55.66406\\\\195.4638\\\\322.01\\\\-53.32031\\\\198.8875\\\\322.01\\\\-52.75635\\\\199.5609\\\\322.01\\\\-51.52395\\\\201.9047\\\\322.01\\\\-50.97656\\\\202.4906\\\\322.01\\\\-47.61296\\\\206.5922\\\\322.01\\\\-45.29157\\\\208.9359\\\\322.01\\\\-43.14595\\\\211.2797\\\\322.01\\\\-41.60156\\\\212.6678\\\\322.01\\\\-39.25781\\\\214.9694\\\\322.01\\\\-35.26563\\\\218.3109\\\\322.01\\\\-34.57031\\\\218.971\\\\322.01\\\\-32.22656\\\\220.1965\\\\322.01\\\\-31.68909\\\\220.6547\\\\322.01\\\\-28.39057\\\\222.9984\\\\322.01\\\\-27.53906\\\\223.7158\\\\322.01\\\\-25.19531\\\\224.5815\\\\322.01\\\\-22.85156\\\\226.0936\\\\322.01\\\\-20.50781\\\\227.1104\\\\322.01\\\\-18.16406\\\\228.5341\\\\322.01\\\\-15.82031\\\\229.2136\\\\322.01\\\\-15.0185\\\\230.0297\\\\322.01\\\\-15.82031\\\\231.3232\\\\322.01\\\\-16.88058\\\\232.3734\\\\322.01\\\\-18.16406\\\\233.1221\\\\322.01\\\\-22.85156\\\\233.1483\\\\322.01\\\\-32.22656\\\\233.131\\\\322.01\\\\-34.57031\\\\233.1652\\\\322.01\\\\-41.60156\\\\233.131\\\\322.01\\\\-58.00781\\\\233.1981\\\\322.01\\\\-60.35156\\\\233.6712\\\\322.01\\\\-65.03906\\\\232.6477\\\\322.01\\\\-67.38281\\\\232.8735\\\\322.01\\\\-69.72656\\\\232.9735\\\\322.01\\\\-74.41406\\\\233.0245\\\\322.01\\\\-86.13281\\\\233.0479\\\\322.01\\\\-88.47656\\\\233.0859\\\\322.01\\\\-95.50781\\\\233.0951\\\\322.01\\\\-97.85156\\\\233.2679\\\\322.01\\\\-100.1953\\\\233.9446\\\\322.01\\\\-102.5391\\\\233.6928\\\\322.01\\\\-104.8828\\\\234.0489\\\\322.01\\\\-107.2266\\\\233.6082\\\\322.01\\\\-109.5703\\\\234.062\\\\322.01\\\\-114.2578\\\\234.0672\\\\322.01\\\\-118.9453\\\\234.0158\\\\322.01\\\\-125.9766\\\\234.1221\\\\322.01\\\\-130.6641\\\\234.0591\\\\322.01\\\\-137.6953\\\\234.1038\\\\322.01\\\\-142.3828\\\\234.1741\\\\322.01\\\\-147.0703\\\\234.1078\\\\322.01\\\\-151.7578\\\\234.1127\\\\322.01\\\\-154.1016\\\\234.0722\\\\322.01\\\\-161.1328\\\\234.0513\\\\322.01\\\\-165.8203\\\\234.0722\\\\322.01\\\\-168.1641\\\\234.1994\\\\322.01\\\\-177.5391\\\\234.2214\\\\322.01\\\\-189.2578\\\\234.1743\\\\322.01\\\\-191.6016\\\\234.2721\\\\322.01\\\\-198.6328\\\\234.2326\\\\322.01\\\\-200.9766\\\\234.2902\\\\322.01\\\\-203.3203\\\\234.205\\\\322.01\\\\-215.0391\\\\234.2967\\\\322.01\\\\-217.3828\\\\234.3573\\\\322.01\\\\-222.0703\\\\234.3917\\\\322.01\\\\-224.4141\\\\234.3447\\\\322.01\\\\-229.1016\\\\234.4078\\\\322.01\\\\-233.7891\\\\234.2125\\\\322.01\\\\-238.4766\\\\234.2088\\\\322.01\\\\-243.1641\\\\234.0441\\\\322.01\\\\-247.8516\\\\233.665\\\\322.01\\\\-250.1953\\\\233.6877\\\\322.01\\\\-252.5391\\\\233.9291\\\\322.01\\\\-257.2266\\\\234.8983\\\\322.01\\\\-259.5703\\\\235.9345\\\\322.01\\\\-260.9983\\\\237.0609\\\\322.01\\\\-262.9464\\\\239.4047\\\\322.01\\\\-263.0954\\\\241.7484\\\\322.01\\\\-262.6598\\\\244.0922\\\\322.01\\\\-261.9141\\\\245.2447\\\\322.01\\\\-259.5703\\\\248.5569\\\\322.01\\\\-257.2266\\\\251.3205\\\\322.01\\\\-255.5536\\\\253.4672\\\\322.01\\\\-252.5391\\\\256.6377\\\\322.01\\\\-250.1953\\\\258.905\\\\322.01\\\\-247.8516\\\\261.4186\\\\322.01\\\\-245.5078\\\\263.615\\\\322.01\\\\-244.0908\\\\265.1859\\\\322.01\\\\-241.6044\\\\267.5297\\\\322.01\\\\-239.4094\\\\269.8734\\\\322.01\\\\-233.7891\\\\275.4182\\\\322.01\\\\-231.4453\\\\277.8469\\\\322.01\\\\-229.1016\\\\280.0557\\\\322.01\\\\-226.7578\\\\282.5473\\\\322.01\\\\-224.4141\\\\284.7202\\\\322.01\\\\-222.0703\\\\287.2521\\\\322.01\\\\-220.5943\\\\288.6234\\\\322.01\\\\-218.3764\\\\290.9672\\\\322.01\\\\-215.0295\\\\293.3109\\\\322.01\\\\-212.6953\\\\294.6526\\\\322.01\\\\-210.3516\\\\295.2914\\\\322.01\\\\-209.9242\\\\295.6547\\\\322.01\\\\-208.0078\\\\296.5075\\\\322.01\\\\-205.6641\\\\296.899\\\\322.01\\\\-203.3203\\\\297.134\\\\322.01\\\\-198.6328\\\\297.1414\\\\322.01\\\\-193.9453\\\\296.9471\\\\322.01\\\\-189.2578\\\\296.9713\\\\322.01\\\\-182.2266\\\\296.9337\\\\322.01\\\\-177.5391\\\\296.8792\\\\322.01\\\\-163.4766\\\\296.8978\\\\322.01\\\\-149.4141\\\\296.8432\\\\322.01\\\\-142.3828\\\\296.886\\\\322.01\\\\-133.0078\\\\296.8703\\\\322.01\\\\-130.6641\\\\296.896\\\\322.01\\\\-121.2891\\\\296.8971\\\\322.01\\\\-114.2578\\\\296.9339\\\\322.01\\\\-111.9141\\\\296.9077\\\\322.01\\\\-95.50781\\\\296.8847\\\\322.01\\\\-90.82031\\\\296.9145\\\\322.01\\\\-81.44531\\\\296.8949\\\\322.01\\\\-74.41406\\\\296.9447\\\\322.01\\\\-65.03906\\\\296.9557\\\\322.01\\\\-60.35156\\\\296.916\\\\322.01\\\\-50.97656\\\\296.9067\\\\322.01\\\\-46.28906\\\\296.9267\\\\322.01\\\\-43.94531\\\\297.0141\\\\322.01\\\\-41.60156\\\\296.8673\\\\322.01\\\\-34.57031\\\\296.9285\\\\322.01\\\\-27.53906\\\\296.9067\\\\322.01\\\\-22.85156\\\\296.9377\\\\322.01\\\\-11.13281\\\\296.9377\\\\322.01\\\\-8.789063\\\\296.9067\\\\322.01\\\\7.617188\\\\296.8877\\\\322.01\\\\14.64844\\\\296.8266\\\\322.01\\\\16.99219\\\\296.847\\\\322.01\\\\24.02344\\\\296.7643\\\\322.01\\\\31.05469\\\\296.7229\\\\322.01\\\\45.11719\\\\296.7229\\\\322.01\\\\49.80469\\\\296.6724\\\\322.01\\\\52.14844\\\\296.6929\\\\322.01\\\\61.52344\\\\296.6191\\\\322.01\\\\73.24219\\\\296.5777\\\\322.01\\\\84.96094\\\\296.5079\\\\322.01\\\\91.99219\\\\296.5208\\\\322.01\\\\96.67969\\\\296.4597\\\\322.01\\\\101.3672\\\\296.4604\\\\322.01\\\\115.4297\\\\296.3846\\\\322.01\\\\122.4609\\\\296.3766\\\\322.01\\\\124.8047\\\\296.3139\\\\322.01\\\\131.8359\\\\296.2987\\\\322.01\\\\134.1797\\\\296.1332\\\\322.01\\\\136.5234\\\\295.85\\\\322.01\\\\138.8672\\\\295.9433\\\\322.01\\\\143.5547\\\\295.8543\\\\322.01\\\\148.2422\\\\295.8486\\\\322.01\\\\157.6172\\\\295.7849\\\\322.01\\\\164.6484\\\\295.6998\\\\322.01\\\\174.0234\\\\295.6454\\\\322.01\\\\183.3984\\\\295.6638\\\\322.01\\\\188.0859\\\\295.5742\\\\322.01\\\\192.7734\\\\295.5916\\\\322.01\\\\197.4609\\\\295.833\\\\322.01\\\\202.1484\\\\295.7346\\\\322.01\\\\204.4922\\\\295.3842\\\\322.01\\\\206.8359\\\\294.8107\\\\322.01\\\\209.1797\\\\294.3828\\\\322.01\\\\211.5234\\\\292.4996\\\\322.01\\\\213.8672\\\\291.1916\\\\322.01\\\\216.2109\\\\289.625\\\\322.01\\\\217.2743\\\\288.6234\\\\322.01\\\\219.3824\\\\286.2797\\\\322.01\\\\221.8496\\\\283.9359\\\\322.01\\\\223.2422\\\\282.3931\\\\322.01\\\\225.5859\\\\279.9482\\\\322.01\\\\227.9297\\\\277.6329\\\\322.01\\\\230.2734\\\\275.1512\\\\322.01\\\\233.3577\\\\272.2172\\\\322.01\\\\234.9609\\\\270.4549\\\\322.01\\\\237.8726\\\\267.5297\\\\322.01\\\\244.3359\\\\260.9081\\\\322.01\\\\246.6797\\\\258.3968\\\\322.01\\\\251.3775\\\\253.4672\\\\322.01\\\\256.0547\\\\248.2237\\\\322.01\\\\257.5039\\\\246.4359\\\\322.01\\\\259.7775\\\\244.0922\\\\322.01\\\\260.7422\\\\241.7324\\\\322.01\\\\261.5918\\\\239.4047\\\\322.01\\\\260.8048\\\\237.0609\\\\322.01\\\\259.4941\\\\234.7172\\\\322.01\\\\258.3984\\\\233.6932\\\\322.01\\\\256.0547\\\\233.0686\\\\322.01\\\\253.7109\\\\232.8224\\\\322.01\\\\251.3672\\\\233.8731\\\\322.01\\\\249.0234\\\\233.2281\\\\322.01\\\\246.6797\\\\232.7947\\\\322.01\\\\241.9922\\\\233.0207\\\\322.01\\\\237.3047\\\\233.0207\\\\322.01\\\\232.6172\\\\233.0726\\\\322.01\\\\227.9297\\\\233.0305\\\\322.01\\\\218.5547\\\\233.0498\\\\322.01\\\\211.5234\\\\233.091\\\\322.01\\\\206.8359\\\\233.0245\\\\322.01\\\\202.1484\\\\232.6623\\\\322.01\\\\190.4297\\\\232.7588\\\\322.01\\\\174.0234\\\\232.7588\\\\322.01\\\\171.6797\\\\232.7719\\\\322.01\\\\164.6484\\\\232.7048\\\\322.01\\\\159.9609\\\\232.7588\\\\322.01\\\\152.9297\\\\232.7481\\\\322.01\\\\148.2422\\\\232.7875\\\\322.01\\\\143.5547\\\\232.7614\\\\322.01\\\\141.2109\\\\232.6329\\\\322.01\\\\138.8672\\\\231.8626\\\\322.01\\\\136.5234\\\\231.9556\\\\322.01\\\\134.1797\\\\232.4196\\\\322.01\\\\131.8359\\\\231.7424\\\\322.01\\\\124.8047\\\\231.7024\\\\322.01\\\\122.4609\\\\232.0168\\\\322.01\\\\120.1172\\\\232.6329\\\\322.01\\\\115.4297\\\\232.7071\\\\322.01\\\\110.7422\\\\232.6027\\\\322.01\\\\108.3984\\\\231.8445\\\\322.01\\\\106.0547\\\\231.5827\\\\322.01\\\\103.7109\\\\231.4945\\\\322.01\\\\102.7858\\\\232.3734\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"368\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"17\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-18.16406\\\\233.1132\\\\325.01\\\\-34.57031\\\\233.1568\\\\325.01\\\\-43.94531\\\\233.1397\\\\325.01\\\\-53.32031\\\\233.1652\\\\325.01\\\\-62.69531\\\\233.2507\\\\325.01\\\\-65.03906\\\\232.6027\\\\325.01\\\\-67.38281\\\\232.8617\\\\325.01\\\\-69.72656\\\\232.9735\\\\325.01\\\\-74.41406\\\\233.0343\\\\325.01\\\\-83.78906\\\\233.0245\\\\325.01\\\\-88.47656\\\\233.0951\\\\325.01\\\\-95.50781\\\\233.0859\\\\325.01\\\\-97.85156\\\\233.4143\\\\325.01\\\\-100.1953\\\\234.0359\\\\325.01\\\\-102.5391\\\\234.1029\\\\325.01\\\\-104.8828\\\\233.4395\\\\325.01\\\\-109.5703\\\\234.0489\\\\325.01\\\\-111.9141\\\\234.0805\\\\325.01\\\\-116.6016\\\\234.054\\\\325.01\\\\-128.3203\\\\234.1174\\\\325.01\\\\-130.6641\\\\234.0591\\\\325.01\\\\-137.6953\\\\234.1221\\\\325.01\\\\-142.3828\\\\234.2191\\\\325.01\\\\-147.0703\\\\234.1029\\\\325.01\\\\-151.7578\\\\234.1127\\\\325.01\\\\-156.4453\\\\234.0772\\\\325.01\\\\-158.7891\\\\234.1085\\\\325.01\\\\-163.4766\\\\234.0463\\\\325.01\\\\-165.8203\\\\234.0722\\\\325.01\\\\-168.1641\\\\234.1994\\\\325.01\\\\-177.5391\\\\234.2357\\\\325.01\\\\-179.8828\\\\234.1837\\\\325.01\\\\-184.5703\\\\234.2574\\\\325.01\\\\-189.2578\\\\234.2012\\\\325.01\\\\-191.6016\\\\234.2721\\\\325.01\\\\-196.2891\\\\234.2574\\\\325.01\\\\-200.9766\\\\234.3204\\\\325.01\\\\-205.6641\\\\234.2187\\\\325.01\\\\-215.0391\\\\234.3146\\\\325.01\\\\-217.3828\\\\234.3917\\\\325.01\\\\-222.0703\\\\234.4409\\\\325.01\\\\-224.4141\\\\234.3917\\\\325.01\\\\-229.1016\\\\234.4578\\\\325.01\\\\-233.7891\\\\234.2398\\\\325.01\\\\-238.4766\\\\234.2644\\\\325.01\\\\-243.1641\\\\234.0329\\\\325.01\\\\-247.8516\\\\233.6513\\\\325.01\\\\-250.1953\\\\233.6663\\\\325.01\\\\-252.5391\\\\234.2918\\\\325.01\\\\-254.8828\\\\234.4928\\\\325.01\\\\-257.2266\\\\234.9479\\\\325.01\\\\-259.5703\\\\235.9244\\\\325.01\\\\-261.0111\\\\237.0609\\\\325.01\\\\-262.9464\\\\239.4047\\\\325.01\\\\-263.1001\\\\241.7484\\\\325.01\\\\-262.7014\\\\244.0922\\\\325.01\\\\-261.9141\\\\245.3016\\\\325.01\\\\-259.5703\\\\248.4308\\\\325.01\\\\-259.1987\\\\248.7797\\\\325.01\\\\-257.2266\\\\251.1994\\\\325.01\\\\-255.4771\\\\253.4672\\\\325.01\\\\-252.5391\\\\256.632\\\\325.01\\\\-250.1953\\\\258.8544\\\\325.01\\\\-247.8516\\\\261.3872\\\\325.01\\\\-245.5078\\\\263.5746\\\\325.01\\\\-244.0755\\\\265.1859\\\\325.01\\\\-241.6044\\\\267.5297\\\\325.01\\\\-239.3906\\\\269.8734\\\\325.01\\\\-236.1328\\\\273.1332\\\\325.01\\\\-233.7891\\\\275.4082\\\\325.01\\\\-231.4453\\\\277.8406\\\\325.01\\\\-229.8915\\\\279.2484\\\\325.01\\\\-226.7578\\\\282.5634\\\\325.01\\\\-224.4141\\\\284.7142\\\\325.01\\\\-222.0703\\\\287.2492\\\\325.01\\\\-220.6122\\\\288.6234\\\\325.01\\\\-218.3665\\\\290.9672\\\\325.01\\\\-215.0391\\\\293.3202\\\\325.01\\\\-212.6953\\\\294.6589\\\\325.01\\\\-210.3516\\\\295.3953\\\\325.01\\\\-208.0078\\\\296.5198\\\\325.01\\\\-205.6641\\\\296.899\\\\325.01\\\\-203.3203\\\\297.134\\\\325.01\\\\-198.6328\\\\297.134\\\\325.01\\\\-193.9453\\\\296.9855\\\\325.01\\\\-189.2578\\\\296.9891\\\\325.01\\\\-179.8828\\\\296.8863\\\\325.01\\\\-168.1641\\\\296.9185\\\\325.01\\\\-161.1328\\\\296.8737\\\\325.01\\\\-156.4453\\\\296.8978\\\\325.01\\\\-149.4141\\\\296.8678\\\\325.01\\\\-144.7266\\\\296.9186\\\\325.01\\\\-140.0391\\\\296.886\\\\325.01\\\\-128.3203\\\\296.8794\\\\325.01\\\\-125.9766\\\\296.916\\\\325.01\\\\-116.6016\\\\296.916\\\\325.01\\\\-114.2578\\\\296.9518\\\\325.01\\\\-100.1953\\\\296.9218\\\\325.01\\\\-95.50781\\\\296.8847\\\\325.01\\\\-88.47656\\\\296.934\\\\325.01\\\\-81.44531\\\\296.925\\\\325.01\\\\-76.75781\\\\296.9557\\\\325.01\\\\-72.07031\\\\296.9428\\\\325.01\\\\-69.72656\\\\297.0516\\\\325.01\\\\-67.38281\\\\296.9622\\\\325.01\\\\-53.32031\\\\296.9053\\\\325.01\\\\-41.60156\\\\296.8985\\\\325.01\\\\-22.85156\\\\296.9081\\\\325.01\\\\-20.50781\\\\296.9841\\\\325.01\\\\-18.16406\\\\297.3277\\\\325.01\\\\-15.82031\\\\296.9175\\\\325.01\\\\-13.47656\\\\296.9175\\\\325.01\\\\-11.13281\\\\297.3806\\\\325.01\\\\-8.789063\\\\296.9067\\\\325.01\\\\-6.445313\\\\296.9285\\\\325.01\\\\0.5859375\\\\296.878\\\\325.01\\\\2.929688\\\\296.9095\\\\325.01\\\\9.960938\\\\296.837\\\\325.01\\\\21.67969\\\\296.8055\\\\325.01\\\\33.39844\\\\296.7135\\\\325.01\\\\38.08594\\\\296.7324\\\\325.01\\\\42.77344\\\\296.7021\\\\325.01\\\\52.14844\\\\296.6929\\\\325.01\\\\59.17969\\\\296.6635\\\\325.01\\\\66.21094\\\\296.5984\\\\325.01\\\\77.92969\\\\296.582\\\\325.01\\\\80.27344\\\\296.5336\\\\325.01\\\\91.99219\\\\296.5079\\\\325.01\\\\94.33594\\\\296.473\\\\325.01\\\\101.3672\\\\296.474\\\\325.01\\\\106.0547\\\\296.4051\\\\325.01\\\\115.4297\\\\296.3986\\\\325.01\\\\122.4609\\\\296.3557\\\\325.01\\\\124.8047\\\\296.308\\\\325.01\\\\129.4922\\\\296.3139\\\\325.01\\\\134.1797\\\\296.1332\\\\325.01\\\\136.5234\\\\295.833\\\\325.01\\\\143.5547\\\\295.8172\\\\325.01\\\\148.2422\\\\295.864\\\\325.01\\\\152.9297\\\\295.7516\\\\325.01\\\\157.6172\\\\295.7849\\\\325.01\\\\169.3359\\\\295.6454\\\\325.01\\\\176.3672\\\\295.6093\\\\325.01\\\\183.3984\\\\295.6638\\\\325.01\\\\188.0859\\\\295.5742\\\\325.01\\\\192.7734\\\\295.5742\\\\325.01\\\\197.4609\\\\295.8172\\\\325.01\\\\202.1484\\\\295.7346\\\\325.01\\\\204.4922\\\\295.4287\\\\325.01\\\\206.8359\\\\294.8107\\\\325.01\\\\209.1797\\\\294.3828\\\\325.01\\\\211.5234\\\\292.5155\\\\325.01\\\\213.8672\\\\291.2065\\\\325.01\\\\216.2109\\\\289.625\\\\325.01\\\\217.2743\\\\288.6234\\\\325.01\\\\218.5547\\\\287.1312\\\\325.01\\\\221.8125\\\\283.9359\\\\325.01\\\\225.5859\\\\279.9313\\\\325.01\\\\227.9297\\\\277.6329\\\\325.01\\\\230.2734\\\\275.1294\\\\325.01\\\\233.3415\\\\272.2172\\\\325.01\\\\234.9609\\\\270.437\\\\325.01\\\\237.8862\\\\267.5297\\\\325.01\\\\244.7266\\\\260.4984\\\\325.01\\\\246.6797\\\\258.4162\\\\325.01\\\\251.4181\\\\253.4672\\\\325.01\\\\256.0547\\\\248.2155\\\\325.01\\\\257.5107\\\\246.4359\\\\325.01\\\\259.7775\\\\244.0922\\\\325.01\\\\260.7694\\\\241.7484\\\\325.01\\\\261.6139\\\\239.4047\\\\325.01\\\\260.8724\\\\237.0609\\\\325.01\\\\259.4996\\\\234.7172\\\\325.01\\\\258.3984\\\\233.6932\\\\325.01\\\\256.0547\\\\233.0686\\\\325.01\\\\253.7109\\\\232.8467\\\\325.01\\\\251.3672\\\\233.6969\\\\325.01\\\\249.0234\\\\232.8344\\\\325.01\\\\246.6797\\\\232.8072\\\\325.01\\\\241.9922\\\\233.0305\\\\325.01\\\\237.3047\\\\233.0207\\\\325.01\\\\232.6172\\\\233.0592\\\\325.01\\\\227.9297\\\\233.0305\\\\325.01\\\\220.8984\\\\233.0402\\\\325.01\\\\211.5234\\\\233.0819\\\\325.01\\\\206.8359\\\\233.0207\\\\325.01\\\\202.1484\\\\232.6477\\\\325.01\\\\197.4609\\\\232.7322\\\\325.01\\\\185.7422\\\\232.7322\\\\325.01\\\\171.6797\\\\232.7848\\\\325.01\\\\164.6484\\\\232.7186\\\\325.01\\\\159.9609\\\\232.7588\\\\325.01\\\\152.9297\\\\232.7456\\\\325.01\\\\143.5547\\\\232.7614\\\\325.01\\\\141.2109\\\\232.6477\\\\325.01\\\\138.8672\\\\231.7333\\\\325.01\\\\136.5234\\\\231.9353\\\\325.01\\\\134.1797\\\\232.6179\\\\325.01\\\\131.8359\\\\232.4552\\\\325.01\\\\129.4922\\\\231.9931\\\\325.01\\\\127.1484\\\\231.7424\\\\325.01\\\\124.8047\\\\231.7224\\\\325.01\\\\121.8516\\\\232.3734\\\\325.01\\\\120.1172\\\\232.6767\\\\325.01\\\\115.4297\\\\232.7346\\\\325.01\\\\108.3984\\\\232.6788\\\\325.01\\\\106.0547\\\\231.6083\\\\325.01\\\\103.7109\\\\231.4658\\\\325.01\\\\102.7466\\\\232.3734\\\\325.01\\\\101.3672\\\\233.1132\\\\325.01\\\\99.02344\\\\233.1397\\\\325.01\\\\89.64844\\\\233.1221\\\\325.01\\\\84.96094\\\\233.1483\\\\325.01\\\\77.92969\\\\233.131\\\\325.01\\\\70.89844\\\\233.1483\\\\325.01\\\\68.55469\\\\233.1221\\\\325.01\\\\63.86719\\\\233.1652\\\\325.01\\\\47.46094\\\\233.131\\\\325.01\\\\45.11719\\\\233.1042\\\\325.01\\\\44.13916\\\\232.3734\\\\325.01\\\\42.77344\\\\231.0852\\\\325.01\\\\41.99423\\\\230.0297\\\\325.01\\\\42.77344\\\\229.1792\\\\325.01\\\\45.11719\\\\228.4149\\\\325.01\\\\47.46094\\\\226.9069\\\\325.01\\\\49.80469\\\\225.8247\\\\325.01\\\\52.14844\\\\224.4343\\\\325.01\\\\54.49219\\\\223.4268\\\\325.01\\\\54.98124\\\\222.9984\\\\325.01\\\\59.17969\\\\219.9802\\\\325.01\\\\61.52344\\\\218.4654\\\\325.01\\\\66.21094\\\\214.7512\\\\325.01\\\\67.41649\\\\213.6234\\\\325.01\\\\72.08356\\\\208.9359\\\\325.01\\\\76.20634\\\\204.2484\\\\325.01\\\\77.92969\\\\201.635\\\\325.01\\\\81.10609\\\\197.2172\\\\325.01\\\\82.23734\\\\194.8734\\\\325.01\\\\82.61719\\\\194.4684\\\\325.01\\\\83.89715\\\\192.5297\\\\325.01\\\\87.08028\\\\185.4984\\\\325.01\\\\88.34971\\\\183.1547\\\\325.01\\\\88.75122\\\\180.8109\\\\325.01\\\\89.51726\\\\178.4672\\\\325.01\\\\90.45728\\\\176.1234\\\\325.01\\\\91.58888\\\\171.4359\\\\325.01\\\\92.52214\\\\169.0922\\\\325.01\\\\92.92603\\\\166.7484\\\\325.01\\\\93.08162\\\\164.4047\\\\325.01\\\\93.24734\\\\159.7172\\\\325.01\\\\93.34813\\\\155.0297\\\\325.01\\\\93.33585\\\\152.6859\\\\325.01\\\\93.21733\\\\147.9984\\\\325.01\\\\93.03451\\\\143.3109\\\\325.01\\\\92.80149\\\\140.9672\\\\325.01\\\\92.20603\\\\138.6234\\\\325.01\\\\91.35603\\\\136.2797\\\\325.01\\\\90.86391\\\\133.9359\\\\325.01\\\\90.26195\\\\131.5922\\\\325.01\\\\89.23982\\\\129.2484\\\\325.01\\\\88.11904\\\\124.5609\\\\325.01\\\\86.61727\\\\122.2172\\\\325.01\\\\85.77421\\\\119.8734\\\\325.01\\\\84.43931\\\\117.5297\\\\325.01\\\\83.54303\\\\115.1859\\\\325.01\\\\81.72218\\\\112.8422\\\\325.01\\\\80.63217\\\\110.4984\\\\325.01\\\\78.97623\\\\108.1547\\\\325.01\\\\76.99889\\\\105.8109\\\\325.01\\\\75.58594\\\\103.8485\\\\325.01\\\\71.2717\\\\98.77969\\\\325.01\\\\68.55469\\\\96.10746\\\\325.01\\\\63.40781\\\\91.74844\\\\325.01\\\\61.52344\\\\90.39472\\\\325.01\\\\59.17969\\\\88.40859\\\\325.01\\\\56.83594\\\\86.96328\\\\325.01\\\\54.49219\\\\85.72954\\\\325.01\\\\52.14844\\\\83.90226\\\\325.01\\\\49.80469\\\\83.13991\\\\325.01\\\\47.46094\\\\81.75262\\\\325.01\\\\45.11719\\\\80.8488\\\\325.01\\\\42.77344\\\\79.45107\\\\325.01\\\\40.42969\\\\78.81117\\\\325.01\\\\38.08594\\\\78.3781\\\\325.01\\\\35.74219\\\\77.40307\\\\325.01\\\\33.39844\\\\76.69214\\\\325.01\\\\28.71094\\\\75.71996\\\\325.01\\\\26.36719\\\\74.93087\\\\325.01\\\\24.02344\\\\74.48033\\\\325.01\\\\14.64844\\\\74.16439\\\\325.01\\\\12.30469\\\\74.15256\\\\325.01\\\\5.273438\\\\74.32497\\\\325.01\\\\2.929688\\\\74.428\\\\325.01\\\\0.5859375\\\\74.75261\\\\325.01\\\\-4.101563\\\\76.07065\\\\325.01\\\\-6.445313\\\\76.48616\\\\325.01\\\\-8.789063\\\\77.12093\\\\325.01\\\\-11.13281\\\\78.12252\\\\325.01\\\\-13.47656\\\\78.72694\\\\325.01\\\\-15.82031\\\\79.19357\\\\325.01\\\\-18.16406\\\\80.59765\\\\325.01\\\\-20.50781\\\\81.5181\\\\325.01\\\\-22.85156\\\\82.87881\\\\325.01\\\\-25.19531\\\\83.74062\\\\325.01\\\\-27.53906\\\\85.55424\\\\325.01\\\\-29.88281\\\\86.58486\\\\325.01\\\\-32.22656\\\\88.27789\\\\325.01\\\\-34.57031\\\\90.20212\\\\325.01\\\\-36.80389\\\\91.74844\\\\325.01\\\\-39.25781\\\\93.7097\\\\325.01\\\\-41.60156\\\\95.68683\\\\325.01\\\\-46.93845\\\\101.1234\\\\325.01\\\\-48.63281\\\\103.3971\\\\325.01\\\\-52.29492\\\\108.1547\\\\325.01\\\\-53.96273\\\\110.4984\\\\325.01\\\\-55.34668\\\\112.8422\\\\325.01\\\\-56.84198\\\\115.1859\\\\325.01\\\\-57.82686\\\\117.5297\\\\325.01\\\\-59.19159\\\\119.8734\\\\325.01\\\\-60.36086\\\\122.2172\\\\325.01\\\\-61.3241\\\\124.5609\\\\325.01\\\\-61.87306\\\\126.9047\\\\325.01\\\\-63.0335\\\\129.2484\\\\325.01\\\\-63.83386\\\\131.5922\\\\325.01\\\\-64.24364\\\\133.9359\\\\325.01\\\\-65.60407\\\\138.6234\\\\325.01\\\\-65.90472\\\\140.9672\\\\325.01\\\\-66.56733\\\\147.9984\\\\325.01\\\\-66.85014\\\\152.6859\\\\325.01\\\\-66.89514\\\\155.0297\\\\325.01\\\\-66.80727\\\\157.3734\\\\325.01\\\\-66.51716\\\\162.0609\\\\325.01\\\\-66.30065\\\\164.4047\\\\325.01\\\\-65.77621\\\\169.0922\\\\325.01\\\\-65.44237\\\\171.4359\\\\325.01\\\\-64.52861\\\\173.7797\\\\325.01\\\\-64.08521\\\\176.1234\\\\325.01\\\\-63.46983\\\\178.4672\\\\325.01\\\\-62.2521\\\\180.8109\\\\325.01\\\\-61.54234\\\\183.1547\\\\325.01\\\\-60.97238\\\\185.4984\\\\325.01\\\\-59.53244\\\\187.8422\\\\325.01\\\\-58.54048\\\\190.1859\\\\325.01\\\\-57.08706\\\\192.5297\\\\325.01\\\\-56.2388\\\\194.8734\\\\325.01\\\\-55.66406\\\\195.557\\\\325.01\\\\-53.32031\\\\198.94\\\\325.01\\\\-52.79036\\\\199.5609\\\\325.01\\\\-51.59609\\\\201.9047\\\\325.01\\\\-48.63281\\\\205.3395\\\\325.01\\\\-47.64024\\\\206.5922\\\\325.01\\\\-45.34446\\\\208.9359\\\\325.01\\\\-43.1875\\\\211.2797\\\\325.01\\\\-41.60156\\\\212.7042\\\\325.01\\\\-39.25781\\\\215.0065\\\\325.01\\\\-36.91406\\\\216.9296\\\\325.01\\\\-34.57031\\\\219.0371\\\\325.01\\\\-32.22656\\\\220.2086\\\\325.01\\\\-29.88281\\\\221.9258\\\\325.01\\\\-27.53906\\\\223.7543\\\\325.01\\\\-25.19531\\\\224.6046\\\\325.01\\\\-22.85156\\\\226.1349\\\\325.01\\\\-20.50781\\\\227.1316\\\\325.01\\\\-18.16406\\\\228.5423\\\\325.01\\\\-15.82031\\\\229.2136\\\\325.01\\\\-15.0185\\\\230.0297\\\\325.01\\\\-15.82031\\\\231.2992\\\\325.01\\\\-16.9148\\\\232.3734\\\\325.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"368\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"18\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-95.50781\\\\233.1042\\\\328.01\\\\-97.85156\\\\233.9217\\\\328.01\\\\-100.1953\\\\234.0411\\\\328.01\\\\-104.8828\\\\234.1505\\\\328.01\\\\-107.2266\\\\234.0891\\\\328.01\\\\-114.2578\\\\234.0855\\\\328.01\\\\-123.6328\\\\234.1407\\\\328.01\\\\-125.9766\\\\234.099\\\\328.01\\\\-135.3516\\\\234.0642\\\\328.01\\\\-142.3828\\\\234.1453\\\\328.01\\\\-147.0703\\\\234.0672\\\\328.01\\\\-158.7891\\\\234.0691\\\\328.01\\\\-165.8203\\\\234.0513\\\\328.01\\\\-170.5078\\\\234.2214\\\\328.01\\\\-177.5391\\\\234.2214\\\\328.01\\\\-179.8828\\\\234.1662\\\\328.01\\\\-186.9141\\\\234.2431\\\\328.01\\\\-189.2578\\\\234.1743\\\\328.01\\\\-191.6016\\\\234.2289\\\\328.01\\\\-196.2891\\\\234.2012\\\\328.01\\\\-200.9766\\\\234.3052\\\\328.01\\\\-203.3203\\\\234.2326\\\\328.01\\\\-208.0078\\\\234.2187\\\\328.01\\\\-212.6953\\\\234.3266\\\\328.01\\\\-215.0391\\\\234.3146\\\\328.01\\\\-222.0703\\\\234.4926\\\\328.01\\\\-224.4141\\\\234.4242\\\\328.01\\\\-229.1016\\\\234.4409\\\\328.01\\\\-233.7891\\\\234.2678\\\\328.01\\\\-236.1328\\\\234.2789\\\\328.01\\\\-240.8203\\\\234.1822\\\\328.01\\\\-243.1641\\\\234.0396\\\\328.01\\\\-247.8516\\\\233.6445\\\\328.01\\\\-250.1953\\\\233.6456\\\\328.01\\\\-252.0338\\\\234.7172\\\\328.01\\\\-252.5391\\\\236.7571\\\\328.01\\\\-254.5061\\\\234.7172\\\\328.01\\\\-254.8828\\\\234.6373\\\\328.01\\\\-257.2266\\\\235.072\\\\328.01\\\\-259.5703\\\\235.9195\\\\328.01\\\\-261.0352\\\\237.0609\\\\328.01\\\\-262.9576\\\\239.4047\\\\328.01\\\\-263.0812\\\\241.7484\\\\328.01\\\\-262.6933\\\\244.0922\\\\328.01\\\\-261.0624\\\\246.4359\\\\328.01\\\\-259.5703\\\\248.3512\\\\328.01\\\\-259.053\\\\248.7797\\\\328.01\\\\-255.4084\\\\253.4672\\\\328.01\\\\-252.5391\\\\256.6272\\\\328.01\\\\-250.1953\\\\258.8713\\\\328.01\\\\-247.8516\\\\261.3969\\\\328.01\\\\-245.5078\\\\263.5681\\\\328.01\\\\-244.0815\\\\265.1859\\\\328.01\\\\-241.6044\\\\267.5297\\\\328.01\\\\-239.4063\\\\269.8734\\\\328.01\\\\-233.7891\\\\275.4299\\\\328.01\\\\-231.4453\\\\277.8564\\\\328.01\\\\-229.8974\\\\279.2484\\\\328.01\\\\-226.7578\\\\282.5634\\\\328.01\\\\-224.4141\\\\284.7263\\\\328.01\\\\-222.0703\\\\287.2521\\\\328.01\\\\-220.5943\\\\288.6234\\\\328.01\\\\-218.3665\\\\290.9672\\\\328.01\\\\-215.0107\\\\293.3109\\\\328.01\\\\-212.6953\\\\294.6589\\\\328.01\\\\-210.3516\\\\295.2445\\\\328.01\\\\-209.8801\\\\295.6547\\\\328.01\\\\-208.0078\\\\296.512\\\\328.01\\\\-205.6641\\\\296.8998\\\\328.01\\\\-203.3203\\\\297.1414\\\\328.01\\\\-198.6328\\\\297.1488\\\\328.01\\\\-193.9453\\\\296.9968\\\\328.01\\\\-184.5703\\\\296.9452\\\\328.01\\\\-177.5391\\\\296.8713\\\\328.01\\\\-170.5078\\\\296.8886\\\\328.01\\\\-154.1016\\\\296.8744\\\\328.01\\\\-149.4141\\\\296.8513\\\\328.01\\\\-144.7266\\\\296.9097\\\\328.01\\\\-140.0391\\\\296.8603\\\\328.01\\\\-130.6641\\\\296.8439\\\\328.01\\\\-121.2891\\\\296.9065\\\\328.01\\\\-109.5703\\\\296.9339\\\\328.01\\\\-97.85156\\\\296.8641\\\\328.01\\\\-83.78906\\\\296.9234\\\\328.01\\\\-74.41406\\\\296.9234\\\\328.01\\\\-69.72656\\\\296.9706\\\\328.01\\\\-67.38281\\\\296.9428\\\\328.01\\\\-60.35156\\\\296.9447\\\\328.01\\\\-53.32031\\\\296.9145\\\\328.01\\\\-39.25781\\\\296.9377\\\\328.01\\\\-36.91406\\\\296.8789\\\\328.01\\\\-29.88281\\\\296.9095\\\\328.01\\\\-22.85156\\\\296.8973\\\\328.01\\\\-18.16406\\\\296.9841\\\\328.01\\\\-15.82031\\\\297.088\\\\328.01\\\\-13.47656\\\\296.9175\\\\328.01\\\\-11.13281\\\\296.9731\\\\328.01\\\\-8.789063\\\\296.9175\\\\328.01\\\\-1.757813\\\\296.9191\\\\328.01\\\\19.33594\\\\296.7952\\\\328.01\\\\21.67969\\\\296.8159\\\\328.01\\\\26.36719\\\\296.7533\\\\328.01\\\\31.05469\\\\296.7733\\\\328.01\\\\33.39844\\\\296.7229\\\\328.01\\\\38.08594\\\\296.7421\\\\328.01\\\\47.46094\\\\296.7324\\\\328.01\\\\49.80469\\\\296.6724\\\\328.01\\\\59.17969\\\\296.675\\\\328.01\\\\66.21094\\\\296.6107\\\\328.01\\\\68.55469\\\\296.6228\\\\328.01\\\\75.58594\\\\296.5696\\\\328.01\\\\77.92969\\\\296.5901\\\\328.01\\\\80.27344\\\\296.5208\\\\328.01\\\\82.61719\\\\296.5616\\\\328.01\\\\87.30469\\\\296.5079\\\\328.01\\\\103.7109\\\\296.4597\\\\328.01\\\\113.0859\\\\296.3846\\\\328.01\\\\117.7734\\\\296.3986\\\\328.01\\\\124.8047\\\\296.3288\\\\328.01\\\\129.4922\\\\296.3288\\\\328.01\\\\131.8359\\\\295.9477\\\\328.01\\\\134.1797\\\\296.1527\\\\328.01\\\\138.8672\\\\295.8486\\\\328.01\\\\143.5547\\\\295.9433\\\\328.01\\\\145.8984\\\\295.864\\\\328.01\\\\148.2422\\\\295.8791\\\\328.01\\\\152.9297\\\\295.8012\\\\328.01\\\\159.9609\\\\295.8012\\\\328.01\\\\164.6484\\\\295.7346\\\\328.01\\\\171.6797\\\\295.6998\\\\328.01\\\\176.3672\\\\295.6272\\\\328.01\\\\183.3984\\\\295.7173\\\\328.01\\\\188.0859\\\\295.5742\\\\328.01\\\\192.7734\\\\295.6093\\\\328.01\\\\197.4609\\\\295.8486\\\\328.01\\\\202.1484\\\\295.7516\\\\328.01\\\\204.4922\\\\295.4287\\\\328.01\\\\206.8359\\\\294.803\\\\328.01\\\\209.1797\\\\294.3828\\\\328.01\\\\211.5234\\\\292.5075\\\\328.01\\\\213.8672\\\\291.2212\\\\328.01\\\\216.2109\\\\289.6308\\\\328.01\\\\217.2743\\\\288.6234\\\\328.01\\\\218.5547\\\\287.1312\\\\328.01\\\\221.809\\\\283.9359\\\\328.01\\\\225.5859\\\\279.9599\\\\328.01\\\\227.9297\\\\277.6776\\\\328.01\\\\230.2734\\\\275.1425\\\\328.01\\\\233.3301\\\\272.2172\\\\328.01\\\\234.9609\\\\270.437\\\\328.01\\\\237.8817\\\\267.5297\\\\328.01\\\\246.9583\\\\258.1547\\\\328.01\\\\251.4177\\\\253.4672\\\\328.01\\\\256.0547\\\\248.1981\\\\328.01\\\\257.4792\\\\246.4359\\\\328.01\\\\259.8178\\\\244.0922\\\\328.01\\\\261.6764\\\\239.4047\\\\328.01\\\\260.9047\\\\237.0609\\\\328.01\\\\259.4996\\\\234.7172\\\\328.01\\\\258.3984\\\\233.6884\\\\328.01\\\\256.0547\\\\233.0779\\\\328.01\\\\253.7109\\\\232.916\\\\328.01\\\\251.3672\\\\233.9331\\\\328.01\\\\249.0234\\\\233.1868\\\\328.01\\\\246.6797\\\\232.8317\\\\328.01\\\\241.9922\\\\233.0305\\\\328.01\\\\237.3047\\\\233.0305\\\\328.01\\\\232.6172\\\\233.0819\\\\328.01\\\\227.9297\\\\233.0498\\\\328.01\\\\223.2422\\\\233.091\\\\328.01\\\\220.8984\\\\233.0632\\\\328.01\\\\211.5234\\\\233.0819\\\\328.01\\\\206.8359\\\\233.0537\\\\328.01\\\\202.1484\\\\232.6477\\\\328.01\\\\197.4609\\\\232.7456\\\\328.01\\\\188.0859\\\\232.7322\\\\328.01\\\\178.7109\\\\232.7975\\\\328.01\\\\174.0234\\\\232.7588\\\\328.01\\\\166.9922\\\\232.7588\\\\328.01\\\\162.3047\\\\232.7186\\\\328.01\\\\152.9297\\\\232.7588\\\\328.01\\\\143.5547\\\\232.8253\\\\328.01\\\\141.2109\\\\232.721\\\\328.01\\\\138.8672\\\\232.1391\\\\328.01\\\\136.5234\\\\232.6027\\\\328.01\\\\134.1797\\\\232.6477\\\\328.01\\\\131.8359\\\\232.5716\\\\328.01\\\\129.4922\\\\231.8784\\\\328.01\\\\127.1484\\\\231.7224\\\\328.01\\\\124.8047\\\\231.7315\\\\328.01\\\\122.4609\\\\232.6623\\\\328.01\\\\115.4297\\\\232.7875\\\\328.01\\\\108.3984\\\\232.7071\\\\328.01\\\\106.0547\\\\231.641\\\\328.01\\\\103.7109\\\\231.4558\\\\328.01\\\\102.6978\\\\232.3734\\\\328.01\\\\101.3672\\\\233.0951\\\\328.01\\\\99.02344\\\\233.1483\\\\328.01\\\\94.33594\\\\233.1221\\\\328.01\\\\89.64844\\\\233.1397\\\\328.01\\\\77.92969\\\\233.1221\\\\328.01\\\\70.89844\\\\233.1568\\\\328.01\\\\47.46094\\\\233.1483\\\\328.01\\\\45.11719\\\\233.1221\\\\328.01\\\\44.12626\\\\232.3734\\\\328.01\\\\42.77344\\\\231.0868\\\\328.01\\\\41.98608\\\\230.0297\\\\328.01\\\\42.77344\\\\229.1708\\\\328.01\\\\45.11719\\\\228.3863\\\\328.01\\\\47.46094\\\\226.8852\\\\328.01\\\\49.80469\\\\225.7875\\\\328.01\\\\52.14844\\\\224.4137\\\\328.01\\\\54.49219\\\\223.3972\\\\328.01\\\\54.94433\\\\222.9984\\\\328.01\\\\59.17969\\\\219.9666\\\\328.01\\\\61.52344\\\\218.3946\\\\328.01\\\\63.86719\\\\216.6084\\\\328.01\\\\66.21094\\\\214.7201\\\\328.01\\\\72.05011\\\\208.9359\\\\328.01\\\\76.14435\\\\204.2484\\\\328.01\\\\77.59603\\\\201.9047\\\\328.01\\\\77.92969\\\\201.5351\\\\328.01\\\\81.09001\\\\197.2172\\\\328.01\\\\82.18169\\\\194.8734\\\\328.01\\\\82.61719\\\\194.396\\\\328.01\\\\83.85225\\\\192.5297\\\\328.01\\\\85.99004\\\\187.8422\\\\328.01\\\\87.00566\\\\185.4984\\\\328.01\\\\88.31177\\\\183.1547\\\\328.01\\\\88.73158\\\\180.8109\\\\328.01\\\\89.43767\\\\178.4672\\\\328.01\\\\90.393\\\\176.1234\\\\328.01\\\\91.51611\\\\171.4359\\\\328.01\\\\92.42188\\\\169.0922\\\\328.01\\\\92.89885\\\\166.7484\\\\328.01\\\\93.06984\\\\164.4047\\\\328.01\\\\93.28426\\\\157.3734\\\\328.01\\\\93.30979\\\\152.6859\\\\328.01\\\\93.18761\\\\147.9984\\\\328.01\\\\93.02273\\\\143.3109\\\\328.01\\\\92.74458\\\\140.9672\\\\328.01\\\\92.09059\\\\138.6234\\\\328.01\\\\91.29035\\\\136.2797\\\\328.01\\\\90.7983\\\\133.9359\\\\328.01\\\\90.19531\\\\131.5922\\\\328.01\\\\89.1515\\\\129.2484\\\\328.01\\\\88.04228\\\\124.5609\\\\328.01\\\\86.57227\\\\122.2172\\\\328.01\\\\85.71805\\\\119.8734\\\\328.01\\\\84.35456\\\\117.5297\\\\328.01\\\\83.45424\\\\115.1859\\\\328.01\\\\81.67584\\\\112.8422\\\\328.01\\\\80.51793\\\\110.4984\\\\328.01\\\\78.89664\\\\108.1547\\\\328.01\\\\76.93359\\\\105.8109\\\\328.01\\\\75.58594\\\\104.0007\\\\328.01\\\\71.0907\\\\98.77969\\\\328.01\\\\68.55469\\\\96.27782\\\\328.01\\\\66.21094\\\\94.34207\\\\328.01\\\\63.23686\\\\91.74844\\\\328.01\\\\61.52344\\\\90.49887\\\\328.01\\\\59.17969\\\\88.51089\\\\328.01\\\\54.49219\\\\85.80405\\\\328.01\\\\52.14844\\\\84.03836\\\\328.01\\\\49.80469\\\\83.19375\\\\328.01\\\\47.46094\\\\81.85665\\\\328.01\\\\45.11719\\\\80.92008\\\\328.01\\\\43.41961\\\\80.02969\\\\328.01\\\\42.77344\\\\79.5718\\\\328.01\\\\40.42969\\\\78.83472\\\\328.01\\\\38.08594\\\\78.42924\\\\328.01\\\\35.74219\\\\77.53945\\\\328.01\\\\33.39844\\\\76.75893\\\\328.01\\\\28.71094\\\\75.81826\\\\328.01\\\\26.36719\\\\75.0248\\\\328.01\\\\24.02344\\\\74.52504\\\\328.01\\\\21.67969\\\\74.40105\\\\328.01\\\\14.64844\\\\74.17623\\\\328.01\\\\12.30469\\\\74.17031\\\\328.01\\\\7.617188\\\\74.25909\\\\328.01\\\\2.929688\\\\74.428\\\\328.01\\\\0.5859375\\\\74.71389\\\\328.01\\\\-4.101563\\\\76.07934\\\\328.01\\\\-6.445313\\\\76.51406\\\\328.01\\\\-8.789063\\\\77.13158\\\\328.01\\\\-11.13281\\\\78.13784\\\\328.01\\\\-13.47656\\\\78.72694\\\\328.01\\\\-15.82031\\\\79.21071\\\\328.01\\\\-18.16406\\\\80.62277\\\\328.01\\\\-20.50781\\\\81.54421\\\\328.01\\\\-22.85156\\\\82.91264\\\\328.01\\\\-25.19531\\\\83.73855\\\\328.01\\\\-27.53906\\\\85.55424\\\\328.01\\\\-29.88281\\\\86.58486\\\\328.01\\\\-32.22656\\\\88.27042\\\\328.01\\\\-34.57031\\\\90.21121\\\\328.01\\\\-36.82314\\\\91.74844\\\\328.01\\\\-39.25781\\\\93.68283\\\\328.01\\\\-41.60156\\\\95.69698\\\\328.01\\\\-43.94531\\\\98.10894\\\\328.01\\\\-46.95976\\\\101.1234\\\\328.01\\\\-50.47743\\\\105.8109\\\\328.01\\\\-52.28932\\\\108.1547\\\\328.01\\\\-53.96273\\\\110.4984\\\\328.01\\\\-56.82392\\\\115.1859\\\\328.01\\\\-57.82686\\\\117.5297\\\\328.01\\\\-59.17969\\\\119.8734\\\\328.01\\\\-60.35156\\\\122.2886\\\\328.01\\\\-61.31202\\\\124.5609\\\\328.01\\\\-61.84362\\\\126.9047\\\\328.01\\\\-62.97818\\\\129.2484\\\\328.01\\\\-63.81696\\\\131.5922\\\\328.01\\\\-64.22777\\\\133.9359\\\\328.01\\\\-65.57173\\\\138.6234\\\\328.01\\\\-65.88971\\\\140.9672\\\\328.01\\\\-66.54406\\\\147.9984\\\\328.01\\\\-66.83923\\\\152.6859\\\\328.01\\\\-66.87236\\\\155.0297\\\\328.01\\\\-66.8178\\\\157.3734\\\\328.01\\\\-66.51716\\\\162.0609\\\\328.01\\\\-66.31799\\\\164.4047\\\\328.01\\\\-65.7848\\\\169.0922\\\\328.01\\\\-65.44237\\\\171.4359\\\\328.01\\\\-64.53993\\\\173.7797\\\\328.01\\\\-64.09171\\\\176.1234\\\\328.01\\\\-63.46994\\\\178.4672\\\\328.01\\\\-62.26713\\\\180.8109\\\\328.01\\\\-61.52344\\\\183.1547\\\\328.01\\\\-61.02607\\\\185.4984\\\\328.01\\\\-59.56421\\\\187.8422\\\\328.01\\\\-58.60754\\\\190.1859\\\\328.01\\\\-57.1322\\\\192.5297\\\\328.01\\\\-56.30392\\\\194.8734\\\\328.01\\\\-55.66406\\\\195.646\\\\328.01\\\\-53.32031\\\\199.0141\\\\328.01\\\\-52.84091\\\\199.5609\\\\328.01\\\\-51.67393\\\\201.9047\\\\328.01\\\\-48.63281\\\\205.3802\\\\328.01\\\\-47.66054\\\\206.5922\\\\328.01\\\\-45.38484\\\\208.9359\\\\328.01\\\\-43.23581\\\\211.2797\\\\328.01\\\\-41.60156\\\\212.7535\\\\328.01\\\\-39.25781\\\\215.0201\\\\328.01\\\\-36.91406\\\\216.9578\\\\328.01\\\\-34.57031\\\\219.0567\\\\328.01\\\\-32.22656\\\\220.2589\\\\328.01\\\\-31.7772\\\\220.6547\\\\328.01\\\\-28.47822\\\\222.9984\\\\328.01\\\\-27.53906\\\\223.7774\\\\328.01\\\\-25.19531\\\\224.6141\\\\328.01\\\\-22.85156\\\\226.1618\\\\328.01\\\\-20.50781\\\\227.1643\\\\328.01\\\\-18.16406\\\\228.5648\\\\328.01\\\\-15.82031\\\\229.3696\\\\328.01\\\\-15.16846\\\\230.0297\\\\328.01\\\\-15.82031\\\\231.0044\\\\328.01\\\\-17.12821\\\\232.3734\\\\328.01\\\\-18.16406\\\\233.0441\\\\328.01\\\\-20.50781\\\\233.1397\\\\328.01\\\\-34.57031\\\\233.1568\\\\328.01\\\\-43.94531\\\\233.1397\\\\328.01\\\\-48.63281\\\\233.1736\\\\328.01\\\\-58.00781\\\\233.19\\\\328.01\\\\-60.35156\\\\233.3635\\\\328.01\\\\-62.69531\\\\233.7748\\\\328.01\\\\-65.03906\\\\232.6767\\\\328.01\\\\-69.72656\\\\232.9839\\\\328.01\\\\-81.44531\\\\233.0537\\\\328.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"562\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"19\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-15.82031\\\\230.0018\\\\331.01\\\\-18.16406\\\\232.6603\\\\331.01\\\\-20.50781\\\\233.131\\\\331.01\\\\-29.88281\\\\233.131\\\\331.01\\\\-43.94531\\\\233.1568\\\\331.01\\\\-53.32031\\\\233.1981\\\\331.01\\\\-58.00781\\\\233.19\\\\331.01\\\\-62.69531\\\\233.3017\\\\331.01\\\\-65.03906\\\\232.9665\\\\331.01\\\\-67.38281\\\\232.9081\\\\331.01\\\\-72.07031\\\\233.0441\\\\331.01\\\\-76.75781\\\\233.0382\\\\331.01\\\\-81.44531\\\\233.0859\\\\331.01\\\\-86.13281\\\\233.0671\\\\331.01\\\\-88.47656\\\\233.1042\\\\331.01\\\\-95.50781\\\\233.1132\\\\331.01\\\\-97.85156\\\\234.054\\\\331.01\\\\-104.8828\\\\234.2191\\\\331.01\\\\-107.2266\\\\234.1551\\\\331.01\\\\-111.9141\\\\234.2039\\\\331.01\\\\-114.2578\\\\234.1596\\\\331.01\\\\-123.6328\\\\234.2233\\\\331.01\\\\-125.9766\\\\234.1641\\\\331.01\\\\-135.3516\\\\234.1174\\\\331.01\\\\-142.3828\\\\234.1785\\\\331.01\\\\-147.0703\\\\234.0904\\\\331.01\\\\-158.7891\\\\234.1085\\\\331.01\\\\-165.8203\\\\234.0952\\\\331.01\\\\-168.1641\\\\234.2214\\\\331.01\\\\-177.5391\\\\234.2835\\\\331.01\\\\-182.2266\\\\234.2539\\\\331.01\\\\-186.9141\\\\234.2902\\\\331.01\\\\-189.2578\\\\234.2431\\\\331.01\\\\-191.6016\\\\234.2902\\\\331.01\\\\-198.6328\\\\234.3084\\\\331.01\\\\-200.9766\\\\234.3864\\\\331.01\\\\-203.3203\\\\234.3235\\\\331.01\\\\-208.0078\\\\234.3115\\\\331.01\\\\-212.6953\\\\234.4578\\\\331.01\\\\-215.0391\\\\234.4266\\\\331.01\\\\-219.7266\\\\234.5859\\\\331.01\\\\-222.0703\\\\234.6051\\\\331.01\\\\-224.4141\\\\234.5285\\\\331.01\\\\-229.1016\\\\234.5121\\\\331.01\\\\-233.7891\\\\234.3601\\\\331.01\\\\-238.4766\\\\234.2935\\\\331.01\\\\-243.1641\\\\234.1026\\\\331.01\\\\-245.5078\\\\233.8227\\\\331.01\\\\-247.8516\\\\233.6637\\\\331.01\\\\-250.1953\\\\233.665\\\\331.01\\\\-252.0243\\\\234.7172\\\\331.01\\\\-252.5391\\\\236.7571\\\\331.01\\\\-253.125\\\\237.0609\\\\331.01\\\\-252.5391\\\\237.1236\\\\331.01\\\\-250.1953\\\\237.9965\\\\331.01\\\\-247.8516\\\\238.0423\\\\331.01\\\\-236.1328\\\\238.0359\\\\331.01\\\\-229.1016\\\\238.0082\\\\331.01\\\\-226.7578\\\\238.0391\\\\331.01\\\\-219.7266\\\\238.0207\\\\331.01\\\\-215.0391\\\\238.0838\\\\331.01\\\\-210.3516\\\\238.0525\\\\331.01\\\\-208.0078\\\\238.1037\\\\331.01\\\\-198.6328\\\\238.1236\\\\331.01\\\\-196.2891\\\\238.1015\\\\331.01\\\\-191.6016\\\\238.1621\\\\331.01\\\\-186.9141\\\\238.0992\\\\331.01\\\\-182.2266\\\\238.1527\\\\331.01\\\\-172.8516\\\\238.1823\\\\331.01\\\\-163.4766\\\\238.1513\\\\331.01\\\\-156.4453\\\\238.192\\\\331.01\\\\-154.1016\\\\238.1706\\\\331.01\\\\-144.7266\\\\238.192\\\\331.01\\\\-142.3828\\\\238.2227\\\\331.01\\\\-137.6953\\\\238.1717\\\\331.01\\\\-133.0078\\\\238.2124\\\\331.01\\\\-128.3203\\\\238.1483\\\\331.01\\\\-125.9766\\\\238.2014\\\\331.01\\\\-116.6016\\\\238.1596\\\\331.01\\\\-100.1953\\\\238.1906\\\\331.01\\\\-93.16406\\\\238.1906\\\\331.01\\\\-88.47656\\\\238.1483\\\\331.01\\\\-79.10156\\\\238.2014\\\\331.01\\\\-74.41406\\\\238.1513\\\\331.01\\\\-69.72656\\\\238.1717\\\\331.01\\\\-62.69531\\\\238.1498\\\\331.01\\\\-58.00781\\\\238.1717\\\\331.01\\\\-48.63281\\\\238.1197\\\\331.01\\\\-43.94531\\\\238.1609\\\\331.01\\\\-41.60156\\\\238.1309\\\\331.01\\\\-29.88281\\\\238.1498\\\\331.01\\\\-25.19531\\\\238.1156\\\\331.01\\\\-15.82031\\\\238.1582\\\\331.01\\\\-8.789063\\\\238.1156\\\\331.01\\\\-6.445313\\\\238.1582\\\\331.01\\\\0.5859375\\\\238.1596\\\\331.01\\\\5.273438\\\\238.1272\\\\331.01\\\\12.30469\\\\238.1796\\\\331.01\\\\16.99219\\\\238.1695\\\\331.01\\\\24.02344\\\\238.0968\\\\331.01\\\\26.36719\\\\238.1061\\\\331.01\\\\31.05469\\\\238.0254\\\\331.01\\\\45.11719\\\\238.0254\\\\331.01\\\\49.80469\\\\237.9679\\\\331.01\\\\52.14844\\\\237.9883\\\\331.01\\\\59.17969\\\\237.9553\\\\331.01\\\\63.86719\\\\237.9632\\\\331.01\\\\66.21094\\\\237.9217\\\\331.01\\\\77.92969\\\\237.9347\\\\331.01\\\\80.27344\\\\237.8105\\\\331.01\\\\82.61719\\\\237.9372\\\\331.01\\\\84.96094\\\\237.4751\\\\331.01\\\\87.30469\\\\237.8936\\\\331.01\\\\89.64844\\\\237.9217\\\\331.01\\\\91.99219\\\\237.7291\\\\331.01\\\\94.33594\\\\237.2086\\\\331.01\\\\99.02344\\\\237.2496\\\\331.01\\\\101.3672\\\\236.9089\\\\331.01\\\\106.0547\\\\236.8813\\\\331.01\\\\110.7422\\\\236.9438\\\\331.01\\\\117.7734\\\\236.8147\\\\331.01\\\\124.8047\\\\236.8069\\\\331.01\\\\131.8359\\\\236.8627\\\\331.01\\\\134.1797\\\\236.7867\\\\331.01\\\\141.2109\\\\236.7996\\\\331.01\\\\150.5859\\\\236.7134\\\\331.01\\\\152.9297\\\\236.7413\\\\331.01\\\\157.6172\\\\236.6997\\\\331.01\\\\162.3047\\\\236.7022\\\\331.01\\\\171.6797\\\\236.6496\\\\331.01\\\\181.0547\\\\236.6756\\\\331.01\\\\185.7422\\\\236.5877\\\\331.01\\\\190.4297\\\\236.5877\\\\331.01\\\\195.1172\\\\236.5409\\\\331.01\\\\199.8047\\\\236.5758\\\\331.01\\\\206.8359\\\\236.515\\\\331.01\\\\225.5859\\\\236.4299\\\\331.01\\\\227.9297\\\\236.4541\\\\331.01\\\\239.6484\\\\236.4137\\\\331.01\\\\246.6797\\\\236.4174\\\\331.01\\\\249.0234\\\\236.3047\\\\331.01\\\\251.3672\\\\235.5069\\\\331.01\\\\253.7109\\\\236.5074\\\\331.01\\\\254.3945\\\\237.0609\\\\331.01\\\\255.8271\\\\239.4047\\\\331.01\\\\255.6086\\\\241.7484\\\\331.01\\\\254.6224\\\\244.0922\\\\331.01\\\\253.7109\\\\245.1008\\\\331.01\\\\252.7054\\\\246.4359\\\\331.01\\\\251.3672\\\\248.4433\\\\331.01\\\\248.6766\\\\251.1234\\\\331.01\\\\246.6797\\\\253.313\\\\331.01\\\\244.3359\\\\255.5254\\\\331.01\\\\239.5975\\\\260.4984\\\\331.01\\\\232.5846\\\\267.5297\\\\331.01\\\\230.2734\\\\269.8828\\\\331.01\\\\227.9297\\\\272.1213\\\\331.01\\\\225.5859\\\\274.5504\\\\331.01\\\\218.4426\\\\281.5922\\\\331.01\\\\215.9517\\\\283.9359\\\\331.01\\\\213.5485\\\\286.2797\\\\331.01\\\\211.5234\\\\288.0286\\\\331.01\\\\209.1797\\\\289.5822\\\\331.01\\\\206.8359\\\\290.8047\\\\331.01\\\\199.8047\\\\290.6986\\\\331.01\\\\197.4609\\\\290.7428\\\\331.01\\\\195.1172\\\\290.1895\\\\331.01\\\\190.4297\\\\290.0456\\\\331.01\\\\185.7422\\\\289.9906\\\\331.01\\\\169.3359\\\\290.0001\\\\331.01\\\\166.9922\\\\289.9612\\\\331.01\\\\159.9609\\\\289.9643\\\\331.01\\\\152.9297\\\\289.9091\\\\331.01\\\\134.1797\\\\289.9193\\\\331.01\\\\129.4922\\\\289.8967\\\\331.01\\\\120.1172\\\\289.9292\\\\331.01\\\\113.0859\\\\289.8948\\\\331.01\\\\108.3984\\\\289.9267\\\\331.01\\\\96.67969\\\\289.8987\\\\331.01\\\\94.33594\\\\289.9418\\\\331.01\\\\87.30469\\\\289.9091\\\\331.01\\\\84.96094\\\\289.9418\\\\331.01\\\\77.92969\\\\289.9091\\\\331.01\\\\68.55469\\\\289.9418\\\\331.01\\\\63.86719\\\\289.8967\\\\331.01\\\\56.83594\\\\289.9418\\\\331.01\\\\52.14844\\\\289.9069\\\\331.01\\\\47.46094\\\\289.9418\\\\331.01\\\\42.77344\\\\289.8967\\\\331.01\\\\35.74219\\\\289.9292\\\\331.01\\\\16.99219\\\\289.9319\\\\331.01\\\\5.273438\\\\289.8967\\\\331.01\\\\2.929688\\\\289.9418\\\\331.01\\\\-1.757813\\\\289.9193\\\\331.01\\\\-11.13281\\\\289.9739\\\\331.01\\\\-22.85156\\\\289.9643\\\\331.01\\\\-32.22656\\\\290.0094\\\\331.01\\\\-36.91406\\\\290.0001\\\\331.01\\\\-43.94531\\\\290.0409\\\\331.01\\\\-53.32031\\\\290.0094\\\\331.01\\\\-62.69531\\\\290.0409\\\\331.01\\\\-72.07031\\\\290.032\\\\331.01\\\\-74.41406\\\\290.0545\\\\331.01\\\\-76.75781\\\\290.5839\\\\331.01\\\\-79.10156\\\\290.2641\\\\331.01\\\\-81.44531\\\\290.7153\\\\331.01\\\\-83.78906\\\\290.9129\\\\331.01\\\\-86.13281\\\\290.1897\\\\331.01\\\\-88.47656\\\\290.5401\\\\331.01\\\\-90.82031\\\\291.2065\\\\331.01\\\\-93.16406\\\\291.1611\\\\331.01\\\\-95.50781\\\\291.3054\\\\331.01\\\\-97.85156\\\\291.2781\\\\331.01\\\\-104.8828\\\\291.3188\\\\331.01\\\\-107.2266\\\\291.2918\\\\331.01\\\\-111.9141\\\\291.3319\\\\331.01\\\\-114.2578\\\\291.3054\\\\331.01\\\\-121.2891\\\\291.3578\\\\331.01\\\\-125.9766\\\\291.3319\\\\331.01\\\\-133.0078\\\\291.3954\\\\331.01\\\\-175.1953\\\\291.5322\\\\331.01\\\\-182.2266\\\\291.5427\\\\331.01\\\\-191.6016\\\\291.6034\\\\331.01\\\\-200.9766\\\\291.5935\\\\331.01\\\\-205.6641\\\\292.3098\\\\331.01\\\\-208.0078\\\\292.3435\\\\331.01\\\\-210.3516\\\\292.0615\\\\331.01\\\\-211.9404\\\\290.9672\\\\331.01\\\\-212.6953\\\\290.2194\\\\331.01\\\\-215.0391\\\\288.6748\\\\331.01\\\\-219.7266\\\\284.4174\\\\331.01\\\\-229.1016\\\\275.1351\\\\331.01\\\\-231.4453\\\\272.9203\\\\331.01\\\\-232.0349\\\\272.2172\\\\331.01\\\\-233.7891\\\\270.4738\\\\331.01\\\\-236.1328\\\\268.2849\\\\331.01\\\\-238.4766\\\\265.8145\\\\331.01\\\\-240.8203\\\\263.537\\\\331.01\\\\-243.7982\\\\260.4984\\\\331.01\\\\-247.8516\\\\256.5038\\\\331.01\\\\-250.1953\\\\254.0828\\\\331.01\\\\-252.5391\\\\251.896\\\\331.01\\\\-254.8828\\\\249.3695\\\\331.01\\\\-255.6047\\\\248.7797\\\\331.01\\\\-257.5359\\\\246.4359\\\\331.01\\\\-258.3608\\\\244.0922\\\\331.01\\\\-258.3411\\\\241.7484\\\\331.01\\\\-257.8627\\\\239.4047\\\\331.01\\\\-257.2266\\\\238.6151\\\\331.01\\\\-255.1194\\\\237.0609\\\\331.01\\\\-257.2266\\\\235.0688\\\\331.01\\\\-259.5703\\\\235.9095\\\\331.01\\\\-261.0516\\\\237.0609\\\\331.01\\\\-261.9141\\\\238.0086\\\\331.01\\\\-262.9709\\\\239.4047\\\\331.01\\\\-263.0859\\\\241.7484\\\\331.01\\\\-262.7175\\\\244.0922\\\\331.01\\\\-261.9141\\\\245.282\\\\331.01\\\\-259.5703\\\\248.3058\\\\331.01\\\\-259.0049\\\\248.7797\\\\331.01\\\\-255.4084\\\\253.4672\\\\331.01\\\\-252.5391\\\\256.6166\\\\331.01\\\\-250.1953\\\\258.8892\\\\331.01\\\\-247.8516\\\\261.3909\\\\331.01\\\\-246.2402\\\\262.8422\\\\331.01\\\\-244.0969\\\\265.1859\\\\331.01\\\\-241.6044\\\\267.5297\\\\331.01\\\\-239.4219\\\\269.8734\\\\331.01\\\\-237.0058\\\\272.2172\\\\331.01\\\\-231.4453\\\\277.8564\\\\331.01\\\\-229.8974\\\\279.2484\\\\331.01\\\\-226.7578\\\\282.5503\\\\331.01\\\\-225.2042\\\\283.9359\\\\331.01\\\\-222.0703\\\\287.2617\\\\331.01\\\\-220.5943\\\\288.6234\\\\331.01\\\\-218.3789\\\\290.9672\\\\331.01\\\\-215.0295\\\\293.3109\\\\331.01\\\\-212.6953\\\\294.6589\\\\331.01\\\\-210.3516\\\\295.2362\\\\331.01\\\\-209.869\\\\295.6547\\\\331.01\\\\-208.0078\\\\296.4917\\\\331.01\\\\-205.6641\\\\296.8928\\\\331.01\\\\-203.3203\\\\297.1297\\\\331.01\\\\-196.2891\\\\297.0883\\\\331.01\\\\-193.9453\\\\296.959\\\\331.01\\\\-182.2266\\\\296.9206\\\\331.01\\\\-177.5391\\\\296.8568\\\\331.01\\\\-165.8203\\\\296.85\\\\331.01\\\\-158.7891\\\\296.8757\\\\331.01\\\\-151.7578\\\\296.8266\\\\331.01\\\\-144.7266\\\\296.8852\\\\331.01\\\\-140.0391\\\\296.8437\\\\331.01\\\\-135.3516\\\\296.8618\\\\331.01\\\\-130.6641\\\\296.8089\\\\331.01\\\\-109.5703\\\\296.9242\\\\331.01\\\\-97.85156\\\\296.8545\\\\331.01\\\\-90.82031\\\\296.8927\\\\331.01\\\\-83.78906\\\\296.8837\\\\331.01\\\\-76.75781\\\\296.9409\\\\331.01\\\\-55.66406\\\\296.934\\\\331.01\\\\-50.97656\\\\296.9053\\\\331.01\\\\-43.94531\\\\296.9191\\\\331.01\\\\-39.25781\\\\297.0516\\\\331.01\\\\-36.91406\\\\296.8688\\\\331.01\\\\-32.22656\\\\296.9207\\\\331.01\\\\-27.53906\\\\296.8888\\\\331.01\\\\-25.19531\\\\297.2621\\\\331.01\\\\-22.85156\\\\296.8985\\\\331.01\\\\-18.16406\\\\296.9489\\\\331.01\\\\-15.82031\\\\297.2814\\\\331.01\\\\-13.47656\\\\296.9067\\\\331.01\\\\-8.789063\\\\296.9285\\\\331.01\\\\7.617188\\\\296.8574\\\\331.01\\\\12.30469\\\\296.8579\\\\331.01\\\\21.67969\\\\296.7843\\\\331.01\\\\38.08594\\\\296.734\\\\331.01\\\\54.49219\\\\296.7043\\\\331.01\\\\59.17969\\\\296.6518\\\\331.01\\\\70.89844\\\\296.6068\\\\331.01\\\\80.27344\\\\296.549\\\\331.01\\\\87.30469\\\\296.5412\\\\331.01\\\\94.33594\\\\296.5005\\\\331.01\\\\101.3672\\\\296.4257\\\\331.01\\\\103.7109\\\\296.4801\\\\331.01\\\\115.4297\\\\296.3782\\\\331.01\\\\124.8047\\\\296.3703\\\\331.01\\\\129.4922\\\\296.3288\\\\331.01\\\\131.8359\\\\295.9433\\\\331.01\\\\134.1797\\\\295.9857\\\\331.01\\\\138.8672\\\\295.864\\\\331.01\\\\143.5547\\\\295.939\\\\331.01\\\\145.8984\\\\295.864\\\\331.01\\\\152.9297\\\\295.8172\\\\331.01\\\\159.9609\\\\295.8172\\\\331.01\\\\164.6484\\\\295.7516\\\\331.01\\\\171.6797\\\\295.7173\\\\331.01\\\\176.3672\\\\295.6454\\\\331.01\\\\183.3984\\\\295.6998\\\\331.01\\\\188.0859\\\\295.5742\\\\331.01\\\\192.7734\\\\295.6093\\\\331.01\\\\197.4609\\\\295.8486\\\\331.01\\\\202.1484\\\\295.7849\\\\331.01\\\\204.4922\\\\295.4439\\\\331.01\\\\206.8359\\\\294.8185\\\\331.01\\\\209.1797\\\\294.3828\\\\331.01\\\\211.5234\\\\292.5155\\\\331.01\\\\213.8672\\\\291.2065\\\\331.01\\\\216.2109\\\\289.6192\\\\331.01\\\\217.2678\\\\288.6234\\\\331.01\\\\218.5547\\\\287.1143\\\\331.01\\\\221.8249\\\\283.9359\\\\331.01\\\\225.5859\\\\279.9988\\\\331.01\\\\227.9297\\\\277.6831\\\\331.01\\\\230.2734\\\\275.1513\\\\331.01\\\\233.3252\\\\272.2172\\\\331.01\\\\234.9609\\\\270.4053\\\\331.01\\\\237.8731\\\\267.5297\\\\331.01\\\\240.1012\\\\265.1859\\\\331.01\\\\242.4443\\\\262.8422\\\\331.01\\\\251.4558\\\\253.4672\\\\331.01\\\\253.4477\\\\251.1234\\\\331.01\\\\256.0547\\\\248.2287\\\\331.01\\\\257.4762\\\\246.4359\\\\331.01\\\\259.8178\\\\244.0922\\\\331.01\\\\261.7753\\\\239.4047\\\\331.01\\\\261.0251\\\\237.0609\\\\331.01\\\\259.4941\\\\234.7172\\\\331.01\\\\258.3984\\\\233.6932\\\\331.01\\\\256.0547\\\\233.0961\\\\331.01\\\\253.7109\\\\232.9379\\\\331.01\\\\251.3672\\\\233.7695\\\\331.01\\\\249.0234\\\\232.8723\\\\331.01\\\\246.6797\\\\232.8195\\\\331.01\\\\241.9922\\\\233.0305\\\\331.01\\\\237.3047\\\\233.0305\\\\331.01\\\\232.6172\\\\233.1001\\\\331.01\\\\227.9297\\\\233.0686\\\\331.01\\\\225.5859\\\\233.1001\\\\331.01\\\\220.8984\\\\233.0726\\\\331.01\\\\211.5234\\\\233.0726\\\\331.01\\\\206.8359\\\\233.0441\\\\331.01\\\\202.1484\\\\232.6179\\\\331.01\\\\195.1172\\\\232.7456\\\\331.01\\\\178.7109\\\\232.7719\\\\331.01\\\\174.0234\\\\232.7456\\\\331.01\\\\162.3047\\\\232.7322\\\\331.01\\\\157.6172\\\\232.7875\\\\331.01\\\\150.5859\\\\232.8253\\\\331.01\\\\143.5547\\\\232.8253\\\\331.01\\\\138.8672\\\\232.6643\\\\331.01\\\\131.8359\\\\232.6477\\\\331.01\\\\129.4922\\\\231.969\\\\331.01\\\\127.1484\\\\231.7258\\\\331.01\\\\124.8047\\\\231.7518\\\\331.01\\\\122.4609\\\\232.4013\\\\331.01\\\\120.1172\\\\232.6788\\\\331.01\\\\113.0859\\\\232.7875\\\\331.01\\\\108.3984\\\\232.7481\\\\331.01\\\\103.7109\\\\231.505\\\\331.01\\\\102.6762\\\\232.3734\\\\331.01\\\\101.3672\\\\233.0766\\\\331.01\\\\99.02344\\\\233.1483\\\\331.01\\\\96.67969\\\\233.1221\\\\331.01\\\\89.64844\\\\233.1483\\\\331.01\\\\84.96094\\\\233.1221\\\\331.01\\\\80.27344\\\\233.1483\\\\331.01\\\\75.58594\\\\233.131\\\\331.01\\\\61.52344\\\\233.1397\\\\331.01\\\\59.17969\\\\233.1736\\\\331.01\\\\54.49219\\\\233.131\\\\331.01\\\\47.46094\\\\233.1397\\\\331.01\\\\45.11719\\\\233.1132\\\\331.01\\\\44.1435\\\\232.3734\\\\331.01\\\\42.77344\\\\231.0613\\\\331.01\\\\42.00247\\\\230.0297\\\\331.01\\\\42.77344\\\\229.1878\\\\331.01\\\\45.11719\\\\228.3765\\\\331.01\\\\47.46094\\\\226.8637\\\\331.01\\\\49.80469\\\\225.7647\\\\331.01\\\\52.14844\\\\224.4265\\\\331.01\\\\54.49219\\\\223.3249\\\\331.01\\\\59.17969\\\\219.9393\\\\331.01\\\\61.52344\\\\218.3393\\\\331.01\\\\63.86719\\\\216.5828\\\\331.01\\\\66.21094\\\\214.673\\\\331.01\\\\67.32799\\\\213.6234\\\\331.01\\\\72.01612\\\\208.9359\\\\331.01\\\\74.09509\\\\206.5922\\\\331.01\\\\76.07555\\\\204.2484\\\\331.01\\\\77.53638\\\\201.9047\\\\331.01\\\\77.92969\\\\201.4729\\\\331.01\\\\81.07359\\\\197.2172\\\\331.01\\\\82.12826\\\\194.8734\\\\331.01\\\\82.61719\\\\194.3306\\\\331.01\\\\83.8237\\\\192.5297\\\\331.01\\\\84.79842\\\\190.1859\\\\331.01\\\\85.95763\\\\187.8422\\\\331.01\\\\86.92441\\\\185.4984\\\\331.01\\\\88.28735\\\\183.1547\\\\331.01\\\\88.71695\\\\180.8109\\\\331.01\\\\89.3761\\\\178.4672\\\\331.01\\\\90.33585\\\\176.1234\\\\331.01\\\\90.93139\\\\173.7797\\\\331.01\\\\91.42718\\\\171.4359\\\\331.01\\\\92.2997\\\\169.0922\\\\331.01\\\\92.84734\\\\166.7484\\\\331.01\\\\93.04629\\\\164.4047\\\\331.01\\\\93.26022\\\\157.3734\\\\331.01\\\\93.2657\\\\152.6859\\\\331.01\\\\93.16406\\\\147.9984\\\\331.01\\\\92.9856\\\\143.3109\\\\331.01\\\\92.63075\\\\140.9672\\\\331.01\\\\91.86198\\\\138.6234\\\\331.01\\\\91.20483\\\\136.2797\\\\331.01\\\\90.71938\\\\133.9359\\\\331.01\\\\90.07662\\\\131.5922\\\\331.01\\\\89.03426\\\\129.2484\\\\331.01\\\\88.59089\\\\126.9047\\\\331.01\\\\87.9126\\\\124.5609\\\\331.01\\\\86.48499\\\\122.2172\\\\331.01\\\\85.62569\\\\119.8734\\\\331.01\\\\84.24227\\\\117.5297\\\\331.01\\\\83.30611\\\\115.1859\\\\331.01\\\\81.58318\\\\112.8422\\\\331.01\\\\80.28274\\\\110.4984\\\\331.01\\\\78.78014\\\\108.1547\\\\331.01\\\\76.8465\\\\105.8109\\\\331.01\\\\75.58594\\\\104.1452\\\\331.01\\\\70.89844\\\\98.8085\\\\331.01\\\\68.55469\\\\96.42617\\\\331.01\\\\66.21094\\\\94.49095\\\\331.01\\\\63.14011\\\\91.74844\\\\331.01\\\\61.52344\\\\90.55122\\\\331.01\\\\59.17969\\\\88.55907\\\\331.01\\\\56.83594\\\\87.2702\\\\331.01\\\\54.49219\\\\85.83469\\\\331.01\\\\52.14844\\\\84.10928\\\\331.01\\\\49.80469\\\\83.22182\\\\331.01\\\\47.46094\\\\81.90617\\\\331.01\\\\45.11719\\\\80.96379\\\\331.01\\\\43.32682\\\\80.02969\\\\331.01\\\\42.77344\\\\79.62586\\\\331.01\\\\40.42969\\\\78.84627\\\\331.01\\\\38.08594\\\\78.46938\\\\331.01\\\\33.39844\\\\76.78945\\\\331.01\\\\28.71094\\\\75.85264\\\\331.01\\\\26.36719\\\\75.06985\\\\331.01\\\\24.02344\\\\74.54173\\\\331.01\\\\21.67969\\\\74.41319\\\\331.01\\\\14.64844\\\\74.19387\\\\331.01\\\\12.30469\\\\74.18209\\\\331.01\\\\7.617188\\\\74.26453\\\\331.01\\\\2.929688\\\\74.44027\\\\331.01\\\\0.5859375\\\\74.71766\\\\331.01\\\\-4.101563\\\\76.07934\\\\331.01\\\\-6.445313\\\\76.52496\\\\331.01\\\\-8.789063\\\\77.12093\\\\331.01\\\\-11.13281\\\\78.13784\\\\331.01\\\\-15.82031\\\\79.21476\\\\331.01\\\\-18.16406\\\\80.64018\\\\331.01\\\\-20.50781\\\\81.58089\\\\331.01\\\\-22.85156\\\\82.93452\\\\331.01\\\\-25.19531\\\\83.7171\\\\331.01\\\\-27.53906\\\\85.53682\\\\331.01\\\\-29.88281\\\\86.56181\\\\331.01\\\\-32.22656\\\\88.24535\\\\331.01\\\\-34.57031\\\\90.17438\\\\331.01\\\\-36.86355\\\\91.74844\\\\331.01\\\\-39.25781\\\\93.65373\\\\331.01\\\\-41.60156\\\\95.64732\\\\331.01\\\\-43.94531\\\\98.08269\\\\331.01\\\\-46.99951\\\\101.1234\\\\331.01\\\\-50.52413\\\\105.8109\\\\331.01\\\\-50.97656\\\\106.3405\\\\331.01\\\\-53.99293\\\\110.4984\\\\331.01\\\\-56.84198\\\\115.1859\\\\331.01\\\\-57.84288\\\\117.5297\\\\331.01\\\\-59.19744\\\\119.8734\\\\331.01\\\\-60.39734\\\\122.2172\\\\331.01\\\\-61.32914\\\\124.5609\\\\331.01\\\\-61.87757\\\\126.9047\\\\331.01\\\\-63.0335\\\\129.2484\\\\331.01\\\\-63.83955\\\\131.5922\\\\331.01\\\\-64.25171\\\\133.9359\\\\331.01\\\\-65.59342\\\\138.6234\\\\331.01\\\\-66.13319\\\\143.3109\\\\331.01\\\\-66.54406\\\\147.9984\\\\331.01\\\\-66.85014\\\\152.6859\\\\331.01\\\\-66.87236\\\\155.0297\\\\331.01\\\\-66.69005\\\\159.7172\\\\331.01\\\\-66.30065\\\\164.4047\\\\331.01\\\\-65.77621\\\\169.0922\\\\331.01\\\\-65.40382\\\\171.4359\\\\331.01\\\\-64.53993\\\\173.7797\\\\331.01\\\\-64.07877\\\\176.1234\\\\331.01\\\\-63.49142\\\\178.4672\\\\331.01\\\\-62.30469\\\\180.8109\\\\331.01\\\\-61.53546\\\\183.1547\\\\331.01\\\\-61.04526\\\\185.4984\\\\331.01\\\\-59.60582\\\\187.8422\\\\331.01\\\\-58.66488\\\\190.1859\\\\331.01\\\\-57.16698\\\\192.5297\\\\331.01\\\\-56.36295\\\\194.8734\\\\331.01\\\\-55.66406\\\\195.7081\\\\331.01\\\\-53.32031\\\\199.0835\\\\331.01\\\\-52.89063\\\\199.5609\\\\331.01\\\\-51.73193\\\\201.9047\\\\331.01\\\\-49.63058\\\\204.2484\\\\331.01\\\\-47.6863\\\\206.5922\\\\331.01\\\\-45.43213\\\\208.9359\\\\331.01\\\\-43.27911\\\\211.2797\\\\331.01\\\\-41.60156\\\\212.8009\\\\331.01\\\\-39.25781\\\\215.0557\\\\331.01\\\\-36.91406\\\\216.9837\\\\331.01\\\\-34.57031\\\\219.0804\\\\331.01\\\\-32.22656\\\\220.3119\\\\331.01\\\\-29.88281\\\\221.9844\\\\331.01\\\\-27.53906\\\\223.8002\\\\331.01\\\\-25.19531\\\\224.6377\\\\331.01\\\\-22.85156\\\\226.1792\\\\331.01\\\\-20.50781\\\\227.1868\\\\331.01\\\\-18.16406\\\\228.6441\\\\331.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n"; +const char* k_rtStruct_json05 = +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"567\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-15.98772\\\\230.0297\\\\334.01\\\\-18.16406\\\\232.5688\\\\334.01\\\\-20.50781\\\\233.1397\\\\334.01\\\\-34.57031\\\\233.1397\\\\334.01\\\\-41.60156\\\\233.1981\\\\334.01\\\\-46.28906\\\\233.1652\\\\334.01\\\\-50.97656\\\\233.2061\\\\334.01\\\\-62.69531\\\\233.1981\\\\334.01\\\\-67.38281\\\\232.9839\\\\334.01\\\\-72.07031\\\\233.0766\\\\334.01\\\\-81.44531\\\\233.1042\\\\334.01\\\\-86.13281\\\\233.0766\\\\334.01\\\\-90.82031\\\\233.131\\\\334.01\\\\-93.16406\\\\233.4871\\\\334.01\\\\-95.50781\\\\233.1884\\\\334.01\\\\-97.85156\\\\234.1127\\\\334.01\\\\-104.8828\\\\234.2828\\\\334.01\\\\-107.2266\\\\234.215\\\\334.01\\\\-109.5703\\\\234.2828\\\\334.01\\\\-116.6016\\\\234.2703\\\\334.01\\\\-121.2891\\\\234.303\\\\334.01\\\\-130.6641\\\\234.2081\\\\334.01\\\\-133.0078\\\\234.2426\\\\334.01\\\\-137.6953\\\\234.2081\\\\334.01\\\\-142.3828\\\\234.3198\\\\334.01\\\\-147.0703\\\\234.2191\\\\334.01\\\\-156.4453\\\\234.1685\\\\334.01\\\\-158.7891\\\\234.2273\\\\334.01\\\\-161.1328\\\\234.1641\\\\334.01\\\\-165.8203\\\\234.1641\\\\334.01\\\\-168.1641\\\\234.3426\\\\334.01\\\\-175.1953\\\\234.3328\\\\334.01\\\\-177.5391\\\\234.381\\\\334.01\\\\-179.8828\\\\234.3426\\\\334.01\\\\-186.9141\\\\234.3837\\\\334.01\\\\-189.2578\\\\234.3359\\\\334.01\\\\-193.9453\\\\234.4194\\\\334.01\\\\-198.6328\\\\234.4053\\\\334.01\\\\-200.9766\\\\234.4535\\\\334.01\\\\-203.3203\\\\234.4053\\\\334.01\\\\-208.0078\\\\234.4078\\\\334.01\\\\-212.6953\\\\234.5484\\\\334.01\\\\-215.0391\\\\234.5301\\\\334.01\\\\-219.7266\\\\234.6855\\\\334.01\\\\-224.4141\\\\234.6051\\\\334.01\\\\-231.4453\\\\234.5285\\\\334.01\\\\-243.1641\\\\234.1437\\\\334.01\\\\-247.8516\\\\233.6847\\\\334.01\\\\-250.1953\\\\233.672\\\\334.01\\\\-252.0368\\\\234.7172\\\\334.01\\\\-252.5391\\\\236.6006\\\\334.01\\\\-253.2552\\\\237.0609\\\\334.01\\\\-252.5391\\\\237.1579\\\\334.01\\\\-250.1953\\\\238.0169\\\\334.01\\\\-247.8516\\\\238.0779\\\\334.01\\\\-243.1641\\\\238.0359\\\\334.01\\\\-222.0703\\\\238.0611\\\\334.01\\\\-215.0391\\\\238.1343\\\\334.01\\\\-210.3516\\\\238.1037\\\\334.01\\\\-203.3203\\\\238.1419\\\\334.01\\\\-193.9453\\\\238.1633\\\\334.01\\\\-186.9141\\\\238.0901\\\\334.01\\\\-175.1953\\\\238.2427\\\\334.01\\\\-163.4766\\\\238.1727\\\\334.01\\\\-156.4453\\\\238.2124\\\\334.01\\\\-144.7266\\\\238.192\\\\334.01\\\\-142.3828\\\\238.2328\\\\334.01\\\\-137.6953\\\\238.1927\\\\334.01\\\\-114.2578\\\\238.2009\\\\334.01\\\\-109.5703\\\\238.1609\\\\334.01\\\\-102.5391\\\\238.202\\\\334.01\\\\-97.85156\\\\238.1609\\\\334.01\\\\-93.16406\\\\238.1906\\\\334.01\\\\-88.47656\\\\238.1369\\\\334.01\\\\-86.13281\\\\238.1695\\\\334.01\\\\-81.44531\\\\238.1483\\\\334.01\\\\-76.75781\\\\238.1913\\\\334.01\\\\-67.38281\\\\238.1386\\\\334.01\\\\-65.03906\\\\238.1596\\\\334.01\\\\-53.32031\\\\238.1197\\\\334.01\\\\-43.94531\\\\238.1498\\\\334.01\\\\-32.22656\\\\238.1197\\\\334.01\\\\-25.19531\\\\238.1483\\\\334.01\\\\-22.85156\\\\238.1084\\\\334.01\\\\-18.16406\\\\238.1483\\\\334.01\\\\-8.789063\\\\238.1156\\\\334.01\\\\-1.757813\\\\238.1483\\\\334.01\\\\2.929688\\\\238.1177\\\\334.01\\\\14.64844\\\\238.1369\\\\334.01\\\\28.71094\\\\238.073\\\\334.01\\\\42.77344\\\\237.9922\\\\334.01\\\\47.46094\\\\238.0047\\\\334.01\\\\54.49219\\\\237.9503\\\\334.01\\\\61.52344\\\\237.9583\\\\334.01\\\\66.21094\\\\237.9084\\\\334.01\\\\70.89844\\\\237.9294\\\\334.01\\\\77.92969\\\\237.9084\\\\334.01\\\\82.61719\\\\237.9318\\\\334.01\\\\84.96094\\\\237.4483\\\\334.01\\\\87.30469\\\\237.4347\\\\334.01\\\\89.64844\\\\237.735\\\\334.01\\\\91.99219\\\\236.9602\\\\334.01\\\\96.67969\\\\236.8598\\\\334.01\\\\99.02344\\\\236.9089\\\\334.01\\\\103.7109\\\\236.9145\\\\334.01\\\\108.3984\\\\236.8773\\\\334.01\\\\113.0859\\\\236.9438\\\\334.01\\\\117.7734\\\\236.8147\\\\334.01\\\\127.1484\\\\236.8051\\\\334.01\\\\131.8359\\\\236.88\\\\334.01\\\\136.5234\\\\236.7721\\\\334.01\\\\141.2109\\\\236.7996\\\\334.01\\\\143.5547\\\\236.7556\\\\334.01\\\\152.9297\\\\236.7134\\\\334.01\\\\155.2734\\\\236.673\\\\334.01\\\\159.9609\\\\236.7413\\\\334.01\\\\174.0234\\\\236.612\\\\334.01\\\\176.3672\\\\236.6756\\\\334.01\\\\181.0547\\\\236.6625\\\\334.01\\\\185.7422\\\\236.564\\\\334.01\\\\190.4297\\\\236.5997\\\\334.01\\\\197.4609\\\\236.5524\\\\334.01\\\\199.8047\\\\236.5758\\\\334.01\\\\206.8359\\\\236.493\\\\334.01\\\\225.5859\\\\236.4299\\\\334.01\\\\244.3359\\\\236.4273\\\\334.01\\\\249.0234\\\\236.379\\\\334.01\\\\251.3672\\\\235.5749\\\\334.01\\\\253.7109\\\\236.4964\\\\334.01\\\\254.4123\\\\237.0609\\\\334.01\\\\255.858\\\\239.4047\\\\334.01\\\\255.6086\\\\241.7484\\\\334.01\\\\254.6009\\\\244.0922\\\\334.01\\\\253.7109\\\\245.0623\\\\334.01\\\\252.6891\\\\246.4359\\\\334.01\\\\251.3672\\\\248.4433\\\\334.01\\\\248.6766\\\\251.1234\\\\334.01\\\\246.6797\\\\253.2569\\\\334.01\\\\244.3359\\\\255.5082\\\\334.01\\\\241.9922\\\\258.0435\\\\334.01\\\\239.6484\\\\260.3833\\\\334.01\\\\237.3047\\\\262.8111\\\\334.01\\\\234.9609\\\\265.1107\\\\334.01\\\\232.6172\\\\267.5191\\\\334.01\\\\225.5957\\\\274.5609\\\\334.01\\\\220.7587\\\\279.2484\\\\334.01\\\\218.4622\\\\281.5922\\\\334.01\\\\215.9334\\\\283.9359\\\\334.01\\\\213.5136\\\\286.2797\\\\334.01\\\\211.5234\\\\288.0286\\\\334.01\\\\209.1797\\\\289.5707\\\\334.01\\\\206.8359\\\\290.8047\\\\334.01\\\\204.4922\\\\290.8047\\\\334.01\\\\199.8047\\\\290.7131\\\\334.01\\\\197.4609\\\\290.7579\\\\334.01\\\\195.1172\\\\290.4285\\\\334.01\\\\192.7734\\\\290.6412\\\\334.01\\\\190.4297\\\\290.0366\\\\334.01\\\\183.3984\\\\289.9869\\\\334.01\\\\176.3672\\\\290.0042\\\\334.01\\\\169.3359\\\\289.9643\\\\334.01\\\\159.9609\\\\289.9643\\\\334.01\\\\155.2734\\\\289.9193\\\\334.01\\\\150.5859\\\\289.9418\\\\334.01\\\\145.8984\\\\289.8967\\\\334.01\\\\136.5234\\\\289.9516\\\\334.01\\\\131.8359\\\\289.9091\\\\334.01\\\\124.8047\\\\289.939\\\\334.01\\\\110.7422\\\\289.9091\\\\334.01\\\\96.67969\\\\289.9193\\\\334.01\\\\91.99219\\\\289.9418\\\\334.01\\\\77.92969\\\\289.9217\\\\334.01\\\\63.86719\\\\289.9193\\\\334.01\\\\54.49219\\\\289.9418\\\\334.01\\\\52.14844\\\\289.9169\\\\334.01\\\\45.11719\\\\289.9292\\\\334.01\\\\33.39844\\\\289.8967\\\\334.01\\\\28.71094\\\\289.939\\\\334.01\\\\19.33594\\\\289.9319\\\\334.01\\\\16.99219\\\\289.9546\\\\334.01\\\\7.617188\\\\289.9193\\\\334.01\\\\2.929688\\\\289.9447\\\\334.01\\\\-1.757813\\\\289.9193\\\\334.01\\\\-11.13281\\\\289.9643\\\\334.01\\\\-15.82031\\\\289.9418\\\\334.01\\\\-20.50781\\\\289.9832\\\\334.01\\\\-32.22656\\\\289.9925\\\\334.01\\\\-34.57031\\\\289.9739\\\\334.01\\\\-41.60156\\\\290.0363\\\\334.01\\\\-46.28906\\\\290.0001\\\\334.01\\\\-55.66406\\\\290.0275\\\\334.01\\\\-60.35156\\\\290.0094\\\\334.01\\\\-67.38281\\\\290.0366\\\\334.01\\\\-69.72656\\\\290.8044\\\\334.01\\\\-72.07031\\\\290.032\\\\334.01\\\\-74.41406\\\\290.0632\\\\334.01\\\\-76.75781\\\\291.0641\\\\334.01\\\\-79.10156\\\\290.6554\\\\334.01\\\\-81.44531\\\\291.2212\\\\334.01\\\\-86.13281\\\\291.2357\\\\334.01\\\\-88.47656\\\\290.1748\\\\334.01\\\\-90.82031\\\\291.2501\\\\334.01\\\\-102.5391\\\\291.2918\\\\334.01\\\\-104.8828\\\\291.2642\\\\334.01\\\\-107.4707\\\\290.9672\\\\334.01\\\\-109.5703\\\\291.3054\\\\334.01\\\\-114.2578\\\\291.3054\\\\334.01\\\\-118.9453\\\\291.3578\\\\334.01\\\\-125.9766\\\\291.345\\\\334.01\\\\-130.6641\\\\291.3954\\\\334.01\\\\-140.0391\\\\291.3954\\\\334.01\\\\-151.7578\\\\291.4549\\\\334.01\\\\-163.4766\\\\291.4776\\\\334.01\\\\-168.1641\\\\291.5108\\\\334.01\\\\-184.5703\\\\291.5531\\\\334.01\\\\-189.2578\\\\291.5836\\\\334.01\\\\-196.2891\\\\291.5836\\\\334.01\\\\-198.6328\\\\291.8617\\\\334.01\\\\-200.9766\\\\291.6205\\\\334.01\\\\-203.3203\\\\292.0964\\\\334.01\\\\-205.6641\\\\292.3344\\\\334.01\\\\-208.0078\\\\292.3654\\\\334.01\\\\-210.3516\\\\292.0912\\\\334.01\\\\-212.1875\\\\290.9672\\\\334.01\\\\-215.0391\\\\288.6954\\\\334.01\\\\-217.3828\\\\286.5314\\\\334.01\\\\-219.7266\\\\284.4869\\\\334.01\\\\-222.0703\\\\282.1065\\\\334.01\\\\-225.0175\\\\279.2484\\\\334.01\\\\-227.3079\\\\276.9047\\\\334.01\\\\-229.8221\\\\274.5609\\\\334.01\\\\-231.4453\\\\272.9496\\\\334.01\\\\-232.0564\\\\272.2172\\\\334.01\\\\-233.7891\\\\270.4845\\\\334.01\\\\-236.1328\\\\268.3081\\\\334.01\\\\-238.4766\\\\265.837\\\\334.01\\\\-240.8203\\\\263.5652\\\\334.01\\\\-243.8257\\\\260.4984\\\\334.01\\\\-246.2413\\\\258.1547\\\\334.01\\\\-248.4672\\\\255.8109\\\\334.01\\\\-250.9794\\\\253.4672\\\\334.01\\\\-252.5391\\\\251.9189\\\\334.01\\\\-254.8828\\\\249.4032\\\\334.01\\\\-255.6368\\\\248.7797\\\\334.01\\\\-257.6019\\\\246.4359\\\\334.01\\\\-258.3731\\\\244.0922\\\\334.01\\\\-258.3472\\\\241.7484\\\\334.01\\\\-257.8529\\\\239.4047\\\\334.01\\\\-257.2266\\\\238.6262\\\\334.01\\\\-255.1592\\\\237.0609\\\\334.01\\\\-257.2266\\\\235.0319\\\\334.01\\\\-259.5703\\\\235.8942\\\\334.01\\\\-261.0516\\\\237.0609\\\\334.01\\\\-261.9141\\\\237.997\\\\334.01\\\\-262.9828\\\\239.4047\\\\334.01\\\\-263.0954\\\\241.7484\\\\334.01\\\\-262.7562\\\\244.0922\\\\334.01\\\\-261.9141\\\\245.3244\\\\334.01\\\\-259.5703\\\\248.3447\\\\334.01\\\\-259.0576\\\\248.7797\\\\334.01\\\\-255.4217\\\\253.4672\\\\334.01\\\\-252.5391\\\\256.6166\\\\334.01\\\\-250.1953\\\\258.8944\\\\334.01\\\\-247.8516\\\\261.3969\\\\334.01\\\\-245.5078\\\\263.5919\\\\334.01\\\\-244.0908\\\\265.1859\\\\334.01\\\\-241.5988\\\\267.5297\\\\334.01\\\\-239.4375\\\\269.8734\\\\334.01\\\\-237\\\\272.2172\\\\334.01\\\\-231.4453\\\\277.8564\\\\334.01\\\\-229.8857\\\\279.2484\\\\334.01\\\\-227.7252\\\\281.5922\\\\334.01\\\\-225.2042\\\\283.9359\\\\334.01\\\\-222.0703\\\\287.2521\\\\334.01\\\\-220.5943\\\\288.6234\\\\334.01\\\\-218.3814\\\\290.9672\\\\334.01\\\\-215.0391\\\\293.3202\\\\334.01\\\\-212.6953\\\\294.6652\\\\334.01\\\\-210.3516\\\\295.2812\\\\334.01\\\\-209.947\\\\295.6547\\\\334.01\\\\-208.0078\\\\296.5075\\\\334.01\\\\-205.6641\\\\296.8852\\\\334.01\\\\-203.3203\\\\297.1267\\\\334.01\\\\-196.2891\\\\297.0739\\\\334.01\\\\-193.9453\\\\296.9265\\\\334.01\\\\-182.2266\\\\296.9128\\\\334.01\\\\-179.8828\\\\296.8785\\\\334.01\\\\-170.5078\\\\296.8576\\\\334.01\\\\-156.4453\\\\296.8931\\\\334.01\\\\-151.7578\\\\296.8432\\\\334.01\\\\-147.0703\\\\296.894\\\\334.01\\\\-140.0391\\\\296.8608\\\\334.01\\\\-135.3516\\\\296.8709\\\\334.01\\\\-130.6641\\\\296.8266\\\\334.01\\\\-118.9453\\\\296.8981\\\\334.01\\\\-114.2578\\\\296.8981\\\\334.01\\\\-109.5703\\\\296.942\\\\334.01\\\\-97.85156\\\\296.8828\\\\334.01\\\\-86.13281\\\\296.9218\\\\334.01\\\\-79.10156\\\\296.913\\\\334.01\\\\-76.75781\\\\296.9514\\\\334.01\\\\-67.38281\\\\296.9953\\\\334.01\\\\-58.00781\\\\296.934\\\\334.01\\\\-55.66406\\\\297.1698\\\\334.01\\\\-53.32031\\\\297.1516\\\\334.01\\\\-50.97656\\\\296.9358\\\\334.01\\\\-43.94531\\\\296.9285\\\\334.01\\\\-39.25781\\\\296.9899\\\\334.01\\\\-36.91406\\\\296.8888\\\\334.01\\\\-34.57031\\\\296.8998\\\\334.01\\\\-32.22656\\\\297.252\\\\334.01\\\\-29.88281\\\\296.9011\\\\334.01\\\\-27.53906\\\\296.8789\\\\334.01\\\\-25.19531\\\\297.3806\\\\334.01\\\\-22.85156\\\\297.2719\\\\334.01\\\\-20.50781\\\\297.0591\\\\334.01\\\\-18.16406\\\\297.0665\\\\334.01\\\\-15.82031\\\\296.9285\\\\334.01\\\\-13.47656\\\\296.9377\\\\334.01\\\\-11.13281\\\\297.0627\\\\334.01\\\\-8.789063\\\\296.9095\\\\334.01\\\\-1.757813\\\\296.9095\\\\334.01\\\\7.617188\\\\296.8473\\\\334.01\\\\24.02344\\\\296.8058\\\\334.01\\\\28.71094\\\\296.7421\\\\334.01\\\\31.05469\\\\296.7743\\\\334.01\\\\40.42969\\\\296.7229\\\\334.01\\\\47.46094\\\\296.7229\\\\334.01\\\\61.52344\\\\296.6346\\\\334.01\\\\63.86719\\\\296.6518\\\\334.01\\\\68.55469\\\\296.5942\\\\334.01\\\\75.58594\\\\296.582\\\\334.01\\\\80.27344\\\\296.5412\\\\334.01\\\\87.30469\\\\296.5412\\\\334.01\\\\94.33594\\\\296.4668\\\\334.01\\\\101.3672\\\\296.4257\\\\334.01\\\\103.7109\\\\296.4597\\\\334.01\\\\108.3984\\\\296.4051\\\\334.01\\\\113.0859\\\\296.4393\\\\334.01\\\\122.4609\\\\296.3578\\\\334.01\\\\129.4922\\\\296.3288\\\\334.01\\\\131.8359\\\\295.9278\\\\334.01\\\\134.1797\\\\296.1292\\\\334.01\\\\136.5234\\\\296.0546\\\\334.01\\\\138.8672\\\\295.8486\\\\334.01\\\\143.5547\\\\295.8172\\\\334.01\\\\155.2734\\\\295.833\\\\334.01\\\\166.9922\\\\295.7684\\\\334.01\\\\174.0234\\\\295.6454\\\\334.01\\\\178.7109\\\\295.6819\\\\334.01\\\\183.3984\\\\295.6638\\\\334.01\\\\188.0859\\\\295.5916\\\\334.01\\\\192.7734\\\\295.6093\\\\334.01\\\\197.4609\\\\295.833\\\\334.01\\\\202.1484\\\\295.8172\\\\334.01\\\\204.4922\\\\295.4439\\\\334.01\\\\206.8359\\\\294.803\\\\334.01\\\\209.1797\\\\294.3717\\\\334.01\\\\211.5234\\\\292.5155\\\\334.01\\\\213.8672\\\\291.1916\\\\334.01\\\\216.2109\\\\289.5954\\\\334.01\\\\217.2437\\\\288.6234\\\\334.01\\\\218.5547\\\\287.1034\\\\334.01\\\\221.7932\\\\283.9359\\\\334.01\\\\225.5859\\\\279.9242\\\\334.01\\\\227.9297\\\\277.6213\\\\334.01\\\\230.2734\\\\275.1202\\\\334.01\\\\233.3138\\\\272.2172\\\\334.01\\\\234.9609\\\\270.3912\\\\334.01\\\\237.8462\\\\267.5297\\\\334.01\\\\240.0901\\\\265.1859\\\\334.01\\\\242.4443\\\\262.8422\\\\334.01\\\\246.6797\\\\258.431\\\\334.01\\\\249.248\\\\255.8109\\\\334.01\\\\251.4581\\\\253.4672\\\\334.01\\\\253.4629\\\\251.1234\\\\334.01\\\\256.0547\\\\248.2519\\\\334.01\\\\257.4878\\\\246.4359\\\\334.01\\\\259.8235\\\\244.0922\\\\334.01\\\\260.8724\\\\241.7484\\\\334.01\\\\261.781\\\\239.4047\\\\334.01\\\\261.0668\\\\237.0609\\\\334.01\\\\259.4941\\\\234.7172\\\\334.01\\\\258.3984\\\\233.6932\\\\334.01\\\\256.0547\\\\233.1227\\\\334.01\\\\253.7109\\\\232.9594\\\\334.01\\\\251.3672\\\\233.6412\\\\334.01\\\\249.0234\\\\232.7692\\\\334.01\\\\246.6797\\\\232.7821\\\\334.01\\\\241.9922\\\\233.0207\\\\334.01\\\\237.3047\\\\233.0207\\\\334.01\\\\232.6172\\\\233.091\\\\334.01\\\\230.2734\\\\233.0592\\\\334.01\\\\225.5859\\\\233.0819\\\\334.01\\\\216.2109\\\\233.0726\\\\334.01\\\\206.8359\\\\233.0245\\\\334.01\\\\204.4922\\\\232.8704\\\\334.01\\\\202.1484\\\\232.6027\\\\334.01\\\\199.8047\\\\232.6623\\\\334.01\\\\192.7734\\\\232.7456\\\\334.01\\\\183.3984\\\\232.7719\\\\334.01\\\\181.0547\\\\232.7456\\\\334.01\\\\169.3359\\\\232.7186\\\\334.01\\\\164.6484\\\\232.7588\\\\334.01\\\\150.5859\\\\232.8129\\\\334.01\\\\141.2109\\\\232.7746\\\\334.01\\\\138.8672\\\\232.6788\\\\334.01\\\\134.1797\\\\232.6477\\\\334.01\\\\129.4922\\\\231.8537\\\\334.01\\\\127.1484\\\\231.9275\\\\334.01\\\\124.8047\\\\231.7976\\\\334.01\\\\120.1172\\\\232.7071\\\\334.01\\\\113.0859\\\\232.8253\\\\334.01\\\\108.3984\\\\232.8003\\\\334.01\\\\106.0547\\\\232.6477\\\\334.01\\\\103.7109\\\\231.6597\\\\334.01\\\\102.765\\\\232.3734\\\\334.01\\\\101.3672\\\\233.0479\\\\334.01\\\\99.02344\\\\233.1568\\\\334.01\\\\91.99219\\\\233.131\\\\334.01\\\\82.61719\\\\233.1483\\\\334.01\\\\66.21094\\\\233.131\\\\334.01\\\\61.52344\\\\233.1568\\\\334.01\\\\45.11719\\\\233.1132\\\\334.01\\\\44.13628\\\\232.3734\\\\334.01\\\\42.77344\\\\231.0868\\\\334.01\\\\41.98608\\\\230.0297\\\\334.01\\\\42.77344\\\\229.1708\\\\334.01\\\\45.11719\\\\228.3666\\\\334.01\\\\47.46094\\\\226.8342\\\\334.01\\\\49.80469\\\\225.7806\\\\334.01\\\\52.14844\\\\224.4214\\\\334.01\\\\54.49219\\\\223.3104\\\\334.01\\\\59.17969\\\\219.9071\\\\334.01\\\\61.51359\\\\218.3109\\\\334.01\\\\63.86719\\\\216.5456\\\\334.01\\\\66.21094\\\\214.6382\\\\334.01\\\\67.29213\\\\213.6234\\\\334.01\\\\71.99537\\\\208.9359\\\\334.01\\\\76.04661\\\\204.2484\\\\334.01\\\\77.48438\\\\201.9047\\\\334.01\\\\77.92969\\\\201.4099\\\\334.01\\\\81.04408\\\\197.2172\\\\334.01\\\\82.10064\\\\194.8734\\\\334.01\\\\82.61719\\\\194.2786\\\\334.01\\\\83.77148\\\\192.5297\\\\334.01\\\\84.75167\\\\190.1859\\\\334.01\\\\85.91919\\\\187.8422\\\\334.01\\\\86.84645\\\\185.4984\\\\334.01\\\\88.24593\\\\183.1547\\\\334.01\\\\88.69778\\\\180.8109\\\\334.01\\\\89.31935\\\\178.4672\\\\334.01\\\\90.28825\\\\176.1234\\\\334.01\\\\90.88572\\\\173.7797\\\\334.01\\\\91.32725\\\\171.4359\\\\334.01\\\\92.09135\\\\169.0922\\\\334.01\\\\92.73549\\\\166.7484\\\\334.01\\\\93.00426\\\\164.4047\\\\334.01\\\\93.15228\\\\159.7172\\\\334.01\\\\93.21165\\\\155.0297\\\\334.01\\\\93.16998\\\\150.3422\\\\334.01\\\\93.04629\\\\145.6547\\\\334.01\\\\92.89885\\\\143.3109\\\\334.01\\\\92.4685\\\\140.9672\\\\334.01\\\\91.65399\\\\138.6234\\\\334.01\\\\90.63558\\\\133.9359\\\\334.01\\\\89.94542\\\\131.5922\\\\334.01\\\\88.9603\\\\129.2484\\\\334.01\\\\88.56628\\\\126.9047\\\\334.01\\\\87.77809\\\\124.5609\\\\334.01\\\\86.38477\\\\122.2172\\\\334.01\\\\85.54688\\\\119.8734\\\\334.01\\\\84.18599\\\\117.5297\\\\334.01\\\\83.21418\\\\115.1859\\\\334.01\\\\81.51971\\\\112.8422\\\\334.01\\\\80.27344\\\\110.6408\\\\334.01\\\\78.70409\\\\108.1547\\\\334.01\\\\77.92969\\\\107.2539\\\\334.01\\\\75.58594\\\\104.2182\\\\334.01\\\\70.89844\\\\98.90157\\\\334.01\\\\68.45073\\\\96.43594\\\\334.01\\\\66.21094\\\\94.55936\\\\334.01\\\\63.09443\\\\91.74844\\\\334.01\\\\61.52344\\\\90.59526\\\\334.01\\\\59.17969\\\\88.5986\\\\334.01\\\\56.83594\\\\87.31498\\\\334.01\\\\54.49219\\\\85.86478\\\\334.01\\\\52.14844\\\\84.14245\\\\334.01\\\\49.80469\\\\83.22958\\\\334.01\\\\47.46094\\\\81.94525\\\\334.01\\\\45.11719\\\\80.9931\\\\334.01\\\\43.27874\\\\80.02969\\\\334.01\\\\42.77344\\\\79.65244\\\\334.01\\\\40.42969\\\\78.85207\\\\334.01\\\\38.08594\\\\78.4912\\\\334.01\\\\35.74219\\\\77.58901\\\\334.01\\\\33.39844\\\\76.8085\\\\334.01\\\\28.71094\\\\75.86382\\\\334.01\\\\26.36719\\\\75.08454\\\\334.01\\\\24.02344\\\\74.55878\\\\334.01\\\\21.67969\\\\74.41319\\\\334.01\\\\14.64844\\\\74.18806\\\\334.01\\\\7.617188\\\\74.26453\\\\334.01\\\\2.929688\\\\74.44027\\\\334.01\\\\0.5859375\\\\74.70742\\\\334.01\\\\-4.101563\\\\76.08793\\\\334.01\\\\-6.445313\\\\76.51406\\\\334.01\\\\-8.789063\\\\77.1104\\\\334.01\\\\-11.13281\\\\78.11278\\\\334.01\\\\-15.82031\\\\79.19739\\\\334.01\\\\-18.16406\\\\80.65051\\\\334.01\\\\-20.50781\\\\81.58109\\\\334.01\\\\-22.85156\\\\82.92365\\\\334.01\\\\-25.19531\\\\83.7171\\\\334.01\\\\-27.53906\\\\85.51434\\\\334.01\\\\-29.88281\\\\86.55049\\\\334.01\\\\-32.22656\\\\88.22651\\\\334.01\\\\-34.57031\\\\90.14594\\\\334.01\\\\-36.91406\\\\91.72009\\\\334.01\\\\-41.60156\\\\95.61852\\\\334.01\\\\-47.01968\\\\101.1234\\\\334.01\\\\-50.97656\\\\106.2919\\\\334.01\\\\-54.02066\\\\110.4984\\\\334.01\\\\-55.66406\\\\113.0483\\\\334.01\\\\-56.86023\\\\115.1859\\\\334.01\\\\-57.96204\\\\117.5297\\\\334.01\\\\-60.48373\\\\122.2172\\\\334.01\\\\-61.34826\\\\124.5609\\\\334.01\\\\-61.9119\\\\126.9047\\\\334.01\\\\-63.09862\\\\129.2484\\\\334.01\\\\-63.86719\\\\131.5922\\\\334.01\\\\-64.28482\\\\133.9359\\\\334.01\\\\-65.63528\\\\138.6234\\\\334.01\\\\-66.16119\\\\143.3109\\\\334.01\\\\-66.7664\\\\150.3422\\\\334.01\\\\-66.95463\\\\155.0297\\\\334.01\\\\-66.72736\\\\159.7172\\\\334.01\\\\-66.31696\\\\164.4047\\\\334.01\\\\-65.80171\\\\169.0922\\\\334.01\\\\-65.46725\\\\171.4359\\\\334.01\\\\-64.59868\\\\173.7797\\\\334.01\\\\-63.56812\\\\178.4672\\\\334.01\\\\-62.35712\\\\180.8109\\\\334.01\\\\-61.55333\\\\183.1547\\\\334.01\\\\-61.07733\\\\185.4984\\\\334.01\\\\-59.6588\\\\187.8422\\\\334.01\\\\-58.72026\\\\190.1859\\\\334.01\\\\-57.18415\\\\192.5297\\\\334.01\\\\-56.40602\\\\194.8734\\\\334.01\\\\-55.66406\\\\195.7821\\\\334.01\\\\-53.32031\\\\199.1387\\\\334.01\\\\-52.92969\\\\199.5609\\\\334.01\\\\-51.7693\\\\201.9047\\\\334.01\\\\-49.67076\\\\204.2484\\\\334.01\\\\-47.72281\\\\206.5922\\\\334.01\\\\-45.48062\\\\208.9359\\\\334.01\\\\-43.33069\\\\211.2797\\\\334.01\\\\-41.60156\\\\212.8348\\\\334.01\\\\-39.25781\\\\215.1041\\\\334.01\\\\-36.91406\\\\217.014\\\\334.01\\\\-34.57031\\\\219.1361\\\\334.01\\\\-32.22656\\\\220.3536\\\\334.01\\\\-29.88281\\\\222.028\\\\334.01\\\\-27.53906\\\\223.8316\\\\334.01\\\\-25.19531\\\\224.6377\\\\334.01\\\\-22.85156\\\\226.2194\\\\334.01\\\\-20.50781\\\\227.2216\\\\334.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"543\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"21\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-16.05469\\\\230.0297\\\\337.01\\\\-18.16406\\\\232.5531\\\\337.01\\\\-20.50781\\\\233.1221\\\\337.01\\\\-36.91406\\\\233.1483\\\\337.01\\\\-41.60156\\\\233.19\\\\337.01\\\\-43.94531\\\\233.1652\\\\337.01\\\\-58.00781\\\\233.2061\\\\337.01\\\\-62.69531\\\\233.1981\\\\337.01\\\\-65.03906\\\\233.0382\\\\337.01\\\\-67.38281\\\\232.9942\\\\337.01\\\\-69.72656\\\\233.0671\\\\337.01\\\\-74.41406\\\\233.0859\\\\337.01\\\\-86.13281\\\\233.0859\\\\337.01\\\\-90.82031\\\\233.131\\\\337.01\\\\-93.16406\\\\233.6525\\\\337.01\\\\-95.50781\\\\233.9503\\\\337.01\\\\-97.85156\\\\234.099\\\\337.01\\\\-102.5391\\\\234.2346\\\\337.01\\\\-107.2266\\\\234.2191\\\\337.01\\\\-111.9141\\\\234.2994\\\\337.01\\\\-114.2578\\\\234.2346\\\\337.01\\\\-123.6328\\\\234.2703\\\\337.01\\\\-125.9766\\\\234.2122\\\\337.01\\\\-130.6641\\\\234.1932\\\\337.01\\\\-133.0078\\\\234.2387\\\\337.01\\\\-137.6953\\\\234.1641\\\\337.01\\\\-142.3828\\\\234.2994\\\\337.01\\\\-147.0703\\\\234.1641\\\\337.01\\\\-149.4141\\\\234.2081\\\\337.01\\\\-156.4453\\\\234.1404\\\\337.01\\\\-158.7891\\\\234.1785\\\\337.01\\\\-163.4766\\\\234.1453\\\\337.01\\\\-165.8203\\\\234.1785\\\\337.01\\\\-168.1641\\\\234.3108\\\\337.01\\\\-184.5703\\\\234.3328\\\\337.01\\\\-189.2578\\\\234.3204\\\\337.01\\\\-193.9453\\\\234.4002\\\\337.01\\\\-200.9766\\\\234.471\\\\337.01\\\\-208.0078\\\\234.4053\\\\337.01\\\\-212.6953\\\\234.5285\\\\337.01\\\\-215.0391\\\\234.5285\\\\337.01\\\\-217.3828\\\\234.6247\\\\337.01\\\\-222.0703\\\\234.6649\\\\337.01\\\\-224.4141\\\\234.5484\\\\337.01\\\\-229.1016\\\\234.5121\\\\337.01\\\\-236.1328\\\\234.3573\\\\337.01\\\\-238.4766\\\\234.2224\\\\337.01\\\\-243.1641\\\\234.119\\\\337.01\\\\-247.8516\\\\233.6502\\\\337.01\\\\-250.1953\\\\233.6581\\\\337.01\\\\-252.28\\\\234.7172\\\\337.01\\\\-252.5391\\\\235.7872\\\\337.01\\\\-253.8707\\\\237.0609\\\\337.01\\\\-252.5391\\\\237.3071\\\\337.01\\\\-250.1953\\\\238.1959\\\\337.01\\\\-243.1641\\\\238.1697\\\\337.01\\\\-226.7578\\\\238.1965\\\\337.01\\\\-215.0391\\\\238.2418\\\\337.01\\\\-210.3516\\\\238.2328\\\\337.01\\\\-200.9766\\\\238.2793\\\\337.01\\\\-186.9141\\\\238.2513\\\\337.01\\\\-182.2266\\\\238.3066\\\\337.01\\\\-172.8516\\\\238.3418\\\\337.01\\\\-158.7891\\\\238.3078\\\\337.01\\\\-151.7578\\\\238.3537\\\\337.01\\\\-147.0703\\\\238.3165\\\\337.01\\\\-142.3828\\\\238.3368\\\\337.01\\\\-128.3203\\\\238.3351\\\\337.01\\\\-123.6328\\\\238.3078\\\\337.01\\\\-111.9141\\\\238.3297\\\\337.01\\\\-107.2266\\\\238.2891\\\\337.01\\\\-102.5391\\\\238.3193\\\\337.01\\\\-97.85156\\\\238.2891\\\\337.01\\\\-93.16406\\\\238.3297\\\\337.01\\\\-88.47656\\\\238.2715\\\\337.01\\\\-81.44531\\\\238.2709\\\\337.01\\\\-76.75781\\\\238.3193\\\\337.01\\\\-67.38281\\\\238.2801\\\\337.01\\\\-65.03906\\\\238.309\\\\337.01\\\\-53.32031\\\\238.2607\\\\337.01\\\\-39.25781\\\\238.2801\\\\337.01\\\\-34.57031\\\\238.309\\\\337.01\\\\-32.22656\\\\238.2793\\\\337.01\\\\-11.13281\\\\238.2516\\\\337.01\\\\-1.757813\\\\238.3179\\\\337.01\\\\2.929688\\\\238.2612\\\\337.01\\\\7.617188\\\\238.2801\\\\337.01\\\\9.960938\\\\238.2423\\\\337.01\\\\16.99219\\\\238.2423\\\\337.01\\\\31.05469\\\\238.1953\\\\337.01\\\\33.39844\\\\238.2234\\\\337.01\\\\42.77344\\\\238.1566\\\\337.01\\\\45.11719\\\\238.1953\\\\337.01\\\\54.49219\\\\238.1478\\\\337.01\\\\66.21094\\\\238.1119\\\\337.01\\\\75.58594\\\\238.1016\\\\337.01\\\\82.61719\\\\238.1289\\\\337.01\\\\84.96094\\\\237.6617\\\\337.01\\\\87.30469\\\\238.1036\\\\337.01\\\\89.64844\\\\238.0933\\\\337.01\\\\91.99219\\\\237.956\\\\337.01\\\\94.33594\\\\237.1551\\\\337.01\\\\96.67969\\\\237.0326\\\\337.01\\\\101.3672\\\\236.9958\\\\337.01\\\\103.7109\\\\237.0335\\\\337.01\\\\106.0547\\\\237.7065\\\\337.01\\\\108.3984\\\\237.0328\\\\337.01\\\\113.0859\\\\237.0932\\\\337.01\\\\117.7734\\\\236.961\\\\337.01\\\\120.1172\\\\237.0144\\\\337.01\\\\124.8047\\\\236.9785\\\\337.01\\\\127.1484\\\\236.9111\\\\337.01\\\\129.4922\\\\237.0144\\\\337.01\\\\134.1797\\\\236.9964\\\\337.01\\\\138.8672\\\\236.8935\\\\337.01\\\\150.5859\\\\236.8935\\\\337.01\\\\152.9297\\\\236.8455\\\\337.01\\\\164.6484\\\\236.8786\\\\337.01\\\\171.6797\\\\236.7721\\\\337.01\\\\181.0547\\\\236.8165\\\\337.01\\\\183.3984\\\\236.7296\\\\337.01\\\\190.4297\\\\236.7577\\\\337.01\\\\199.8047\\\\236.7158\\\\337.01\\\\202.1484\\\\236.6625\\\\337.01\\\\211.5234\\\\236.6215\\\\337.01\\\\216.2109\\\\236.6341\\\\337.01\\\\223.2422\\\\236.5608\\\\337.01\\\\230.2734\\\\236.612\\\\337.01\\\\237.3047\\\\236.564\\\\337.01\\\\246.6797\\\\236.5556\\\\337.01\\\\249.0234\\\\236.5217\\\\337.01\\\\251.3672\\\\235.8337\\\\337.01\\\\253.7109\\\\236.673\\\\337.01\\\\254.1778\\\\237.0609\\\\337.01\\\\255.7377\\\\239.4047\\\\337.01\\\\255.5197\\\\241.7484\\\\337.01\\\\254.5064\\\\244.0922\\\\337.01\\\\252.6128\\\\246.4359\\\\337.01\\\\251.3672\\\\248.2697\\\\337.01\\\\248.4421\\\\251.1234\\\\337.01\\\\246.6797\\\\253.0868\\\\337.01\\\\244.3359\\\\255.2826\\\\337.01\\\\241.9922\\\\257.8041\\\\337.01\\\\239.3325\\\\260.4984\\\\337.01\\\\236.9309\\\\262.8422\\\\337.01\\\\234.6654\\\\265.1859\\\\337.01\\\\232.2605\\\\267.5297\\\\337.01\\\\230.2734\\\\269.6653\\\\337.01\\\\227.9297\\\\271.8957\\\\337.01\\\\225.5859\\\\274.3181\\\\337.01\\\\223.2422\\\\276.5594\\\\337.01\\\\218.2125\\\\281.5922\\\\337.01\\\\215.6647\\\\283.9359\\\\337.01\\\\213.3404\\\\286.2797\\\\337.01\\\\211.5234\\\\287.78\\\\337.01\\\\209.1797\\\\289.4079\\\\337.01\\\\206.8359\\\\290.6449\\\\337.01\\\\202.1484\\\\290.6449\\\\337.01\\\\199.8047\\\\290.5828\\\\337.01\\\\197.4609\\\\290.6118\\\\337.01\\\\195.1172\\\\290.5487\\\\337.01\\\\192.7734\\\\290.6282\\\\337.01\\\\190.4297\\\\289.8361\\\\337.01\\\\183.3984\\\\289.8157\\\\337.01\\\\176.3672\\\\289.8256\\\\337.01\\\\169.3359\\\\289.7852\\\\337.01\\\\159.9609\\\\289.7852\\\\337.01\\\\155.2734\\\\289.7545\\\\337.01\\\\150.5859\\\\289.785\\\\337.01\\\\145.8984\\\\289.7439\\\\337.01\\\\129.4922\\\\289.765\\\\337.01\\\\122.4609\\\\289.7234\\\\337.01\\\\113.0859\\\\289.7246\\\\337.01\\\\108.3984\\\\289.7552\\\\337.01\\\\106.0547\\\\289.7246\\\\337.01\\\\91.99219\\\\289.7448\\\\337.01\\\\80.27344\\\\289.7234\\\\337.01\\\\73.24219\\\\289.7545\\\\337.01\\\\66.21094\\\\289.7545\\\\337.01\\\\56.83594\\\\289.7234\\\\337.01\\\\42.77344\\\\289.7246\\\\337.01\\\\40.42969\\\\289.765\\\\337.01\\\\31.05469\\\\289.7352\\\\337.01\\\\12.30469\\\\289.7852\\\\337.01\\\\2.929688\\\\289.765\\\\337.01\\\\-8.789063\\\\289.7854\\\\337.01\\\\-25.19531\\\\289.7753\\\\337.01\\\\-29.88281\\\\289.8052\\\\337.01\\\\-34.57031\\\\289.7854\\\\337.01\\\\-53.32031\\\\289.8354\\\\337.01\\\\-67.38281\\\\289.8354\\\\337.01\\\\-74.41406\\\\289.8648\\\\337.01\\\\-76.75781\\\\290.7283\\\\337.01\\\\-79.10156\\\\289.8554\\\\337.01\\\\-81.44531\\\\290.3386\\\\337.01\\\\-83.78906\\\\291.0974\\\\337.01\\\\-86.13281\\\\291.0974\\\\337.01\\\\-88.47656\\\\289.9266\\\\337.01\\\\-90.82031\\\\290.9763\\\\337.01\\\\-93.16406\\\\291.1297\\\\337.01\\\\-97.85156\\\\291.1137\\\\337.01\\\\-104.8828\\\\291.1611\\\\337.01\\\\-128.3203\\\\291.2212\\\\337.01\\\\-135.3516\\\\291.2642\\\\337.01\\\\-140.0391\\\\291.2501\\\\337.01\\\\-149.4141\\\\291.3054\\\\337.01\\\\-154.1016\\\\291.3054\\\\337.01\\\\-168.1641\\\\291.3705\\\\337.01\\\\-172.8516\\\\291.3705\\\\337.01\\\\-189.2578\\\\291.4549\\\\337.01\\\\-196.2891\\\\291.4549\\\\337.01\\\\-198.6328\\\\292.0931\\\\337.01\\\\-200.9766\\\\291.6703\\\\337.01\\\\-203.3203\\\\292.0439\\\\337.01\\\\-208.0078\\\\292.155\\\\337.01\\\\-210.3516\\\\291.8999\\\\337.01\\\\-211.6451\\\\290.9672\\\\337.01\\\\-212.6953\\\\290.0075\\\\337.01\\\\-215.0391\\\\288.4995\\\\337.01\\\\-219.7266\\\\284.2614\\\\337.01\\\\-226.7578\\\\277.3752\\\\337.01\\\\-229.1016\\\\275.0117\\\\337.01\\\\-231.4453\\\\272.749\\\\337.01\\\\-231.9032\\\\272.2172\\\\337.01\\\\-234.3526\\\\269.8734\\\\337.01\\\\-236.6545\\\\267.5297\\\\337.01\\\\-239.0497\\\\265.1859\\\\337.01\\\\-247.8516\\\\256.3387\\\\337.01\\\\-248.3156\\\\255.8109\\\\337.01\\\\-250.7947\\\\253.4672\\\\337.01\\\\-254.8828\\\\249.2404\\\\337.01\\\\-255.4349\\\\248.7797\\\\337.01\\\\-257.3968\\\\246.4359\\\\337.01\\\\-258.2731\\\\244.0922\\\\337.01\\\\-258.2375\\\\241.7484\\\\337.01\\\\-257.667\\\\239.4047\\\\337.01\\\\-257.2266\\\\238.8687\\\\337.01\\\\-255.0871\\\\237.0609\\\\337.01\\\\-257.2266\\\\235.0331\\\\337.01\\\\-259.5703\\\\235.8786\\\\337.01\\\\-261.0648\\\\237.0609\\\\337.01\\\\-261.9141\\\\237.9827\\\\337.01\\\\-262.9937\\\\239.4047\\\\337.01\\\\-263.0859\\\\241.7484\\\\337.01\\\\-262.7562\\\\244.0922\\\\337.01\\\\-261.9141\\\\245.3154\\\\337.01\\\\-259.5703\\\\248.3479\\\\337.01\\\\-259.0795\\\\248.7797\\\\337.01\\\\-255.473\\\\253.4672\\\\337.01\\\\-252.5391\\\\256.6491\\\\337.01\\\\-250.1953\\\\258.8997\\\\337.01\\\\-247.8516\\\\261.422\\\\337.01\\\\-245.5078\\\\263.5974\\\\337.01\\\\-244.0876\\\\265.1859\\\\337.01\\\\-241.5988\\\\267.5297\\\\337.01\\\\-239.4282\\\\269.8734\\\\337.01\\\\-236.9844\\\\272.2172\\\\337.01\\\\-233.7891\\\\275.424\\\\337.01\\\\-231.4453\\\\277.8406\\\\337.01\\\\-229.8799\\\\279.2484\\\\337.01\\\\-226.7578\\\\282.5503\\\\337.01\\\\-225.2042\\\\283.9359\\\\337.01\\\\-222.0703\\\\287.2521\\\\337.01\\\\-220.5943\\\\288.6234\\\\337.01\\\\-218.3718\\\\290.9672\\\\337.01\\\\-217.3828\\\\291.7129\\\\337.01\\\\-214.9922\\\\293.3109\\\\337.01\\\\-212.6953\\\\294.6589\\\\337.01\\\\-210.3516\\\\295.2864\\\\337.01\\\\-209.9019\\\\295.6547\\\\337.01\\\\-208.0078\\\\296.512\\\\337.01\\\\-205.6641\\\\296.899\\\\337.01\\\\-203.3203\\\\297.1108\\\\337.01\\\\-198.6328\\\\297.0992\\\\337.01\\\\-193.9453\\\\296.9203\\\\337.01\\\\-191.6016\\\\296.8886\\\\337.01\\\\-182.2266\\\\296.9061\\\\337.01\\\\-175.1953\\\\296.8497\\\\337.01\\\\-163.4766\\\\296.882\\\\337.01\\\\-154.1016\\\\296.8757\\\\337.01\\\\-151.7578\\\\296.8513\\\\337.01\\\\-142.3828\\\\296.8771\\\\337.01\\\\-140.0391\\\\296.8521\\\\337.01\\\\-128.3203\\\\296.8175\\\\337.01\\\\-109.5703\\\\296.916\\\\337.01\\\\-90.82031\\\\296.8938\\\\337.01\\\\-86.13281\\\\296.9322\\\\337.01\\\\-81.44531\\\\296.9041\\\\337.01\\\\-74.41406\\\\296.9622\\\\337.01\\\\-67.38281\\\\296.979\\\\337.01\\\\-58.00781\\\\296.9535\\\\337.01\\\\-55.66406\\\\297.2359\\\\337.01\\\\-53.32031\\\\297.1979\\\\337.01\\\\-50.97656\\\\296.9267\\\\337.01\\\\-43.94531\\\\296.9377\\\\337.01\\\\-39.25781\\\\296.878\\\\337.01\\\\-34.57031\\\\296.8985\\\\337.01\\\\-32.22656\\\\297.1454\\\\337.01\\\\-29.88281\\\\296.9011\\\\337.01\\\\-27.53906\\\\296.8899\\\\337.01\\\\-25.19531\\\\297.257\\\\337.01\\\\-22.85156\\\\297.2363\\\\337.01\\\\-20.50781\\\\296.8985\\\\337.01\\\\-8.789063\\\\296.9396\\\\337.01\\\\-6.445313\\\\297.0519\\\\337.01\\\\-4.101563\\\\296.8888\\\\337.01\\\\12.30469\\\\296.8163\\\\337.01\\\\16.99219\\\\296.8369\\\\337.01\\\\24.02344\\\\296.8163\\\\337.01\\\\28.71094\\\\296.7643\\\\337.01\\\\35.74219\\\\296.7743\\\\337.01\\\\45.11719\\\\296.7021\\\\337.01\\\\56.83594\\\\296.6839\\\\337.01\\\\61.52344\\\\296.6346\\\\337.01\\\\63.86719\\\\296.6548\\\\337.01\\\\70.89844\\\\296.582\\\\337.01\\\\87.30469\\\\296.5412\\\\337.01\\\\94.33594\\\\296.4801\\\\337.01\\\\103.7109\\\\296.4597\\\\337.01\\\\110.7422\\\\296.4059\\\\337.01\\\\113.0859\\\\296.4326\\\\337.01\\\\127.1484\\\\296.3578\\\\337.01\\\\134.1797\\\\296.2355\\\\337.01\\\\136.5234\\\\295.8685\\\\337.01\\\\138.8672\\\\296.0063\\\\337.01\\\\141.2109\\\\295.8486\\\\337.01\\\\143.5547\\\\295.8172\\\\337.01\\\\150.5859\\\\295.833\\\\337.01\\\\159.9609\\\\295.7849\\\\337.01\\\\164.6484\\\\295.8012\\\\337.01\\\\176.3672\\\\295.6638\\\\337.01\\\\178.7109\\\\295.6998\\\\337.01\\\\192.7734\\\\295.6093\\\\337.01\\\\195.1172\\\\295.7849\\\\337.01\\\\197.4609\\\\295.8486\\\\337.01\\\\202.1484\\\\295.7849\\\\337.01\\\\204.4922\\\\295.3989\\\\337.01\\\\206.8359\\\\294.7878\\\\337.01\\\\209.1797\\\\294.3606\\\\337.01\\\\211.5234\\\\292.5075\\\\337.01\\\\213.8672\\\\291.1916\\\\337.01\\\\216.2109\\\\289.5791\\\\337.01\\\\217.2271\\\\288.6234\\\\337.01\\\\218.5547\\\\287.1251\\\\337.01\\\\221.7773\\\\283.9359\\\\337.01\\\\225.5859\\\\279.9242\\\\337.01\\\\228.6029\\\\276.9047\\\\337.01\\\\230.8462\\\\274.5609\\\\337.01\\\\233.2856\\\\272.2172\\\\337.01\\\\234.9609\\\\270.3731\\\\337.01\\\\237.8504\\\\267.5297\\\\337.01\\\\240.0754\\\\265.1859\\\\337.01\\\\242.4628\\\\262.8422\\\\337.01\\\\246.6797\\\\258.4333\\\\337.01\\\\249.248\\\\255.8109\\\\337.01\\\\251.4573\\\\253.4672\\\\337.01\\\\256.0547\\\\248.2478\\\\337.01\\\\257.4822\\\\246.4359\\\\337.01\\\\259.856\\\\244.0922\\\\337.01\\\\260.9205\\\\241.7484\\\\337.01\\\\261.7867\\\\239.4047\\\\337.01\\\\261.0251\\\\237.0609\\\\337.01\\\\259.4996\\\\234.7172\\\\337.01\\\\258.3984\\\\233.6932\\\\337.01\\\\256.0547\\\\233.1313\\\\337.01\\\\253.7109\\\\233.0145\\\\337.01\\\\251.3672\\\\233.5155\\\\337.01\\\\249.0234\\\\232.7431\\\\337.01\\\\244.3359\\\\232.8555\\\\337.01\\\\241.9922\\\\233.0207\\\\337.01\\\\234.9609\\\\233.0537\\\\337.01\\\\227.9297\\\\233.0305\\\\337.01\\\\223.2422\\\\233.0632\\\\337.01\\\\206.8359\\\\233.0145\\\\337.01\\\\204.4922\\\\232.882\\\\337.01\\\\202.1484\\\\232.6027\\\\337.01\\\\195.1172\\\\232.7456\\\\337.01\\\\192.7734\\\\232.7186\\\\337.01\\\\183.3984\\\\232.7588\\\\337.01\\\\174.0234\\\\232.7186\\\\337.01\\\\157.6172\\\\232.7614\\\\337.01\\\\143.5547\\\\232.8253\\\\337.01\\\\136.5234\\\\232.6767\\\\337.01\\\\129.4922\\\\232.693\\\\337.01\\\\127.0996\\\\232.3734\\\\337.01\\\\124.8047\\\\232.7481\\\\337.01\\\\120.1172\\\\232.7614\\\\337.01\\\\113.0859\\\\232.8617\\\\337.01\\\\110.7422\\\\232.8253\\\\337.01\\\\106.0547\\\\232.8617\\\\337.01\\\\103.7109\\\\232.1634\\\\337.01\\\\101.3672\\\\232.998\\\\337.01\\\\99.02344\\\\233.1221\\\\337.01\\\\89.64844\\\\233.1483\\\\337.01\\\\84.96094\\\\233.1221\\\\337.01\\\\70.89844\\\\233.1568\\\\337.01\\\\68.55469\\\\233.131\\\\337.01\\\\54.49219\\\\233.1397\\\\337.01\\\\45.11719\\\\233.0951\\\\337.01\\\\44.15678\\\\232.3734\\\\337.01\\\\42.77344\\\\231.0868\\\\337.01\\\\41.98608\\\\230.0297\\\\337.01\\\\42.77344\\\\229.1708\\\\337.01\\\\45.11719\\\\228.3666\\\\337.01\\\\47.46094\\\\226.8342\\\\337.01\\\\49.80469\\\\225.7676\\\\337.01\\\\52.14844\\\\224.4137\\\\337.01\\\\54.49219\\\\223.2807\\\\337.01\\\\59.17969\\\\219.898\\\\337.01\\\\61.47501\\\\218.3109\\\\337.01\\\\63.86719\\\\216.4922\\\\337.01\\\\66.21094\\\\214.6099\\\\337.01\\\\70.89844\\\\210.0019\\\\337.01\\\\71.93934\\\\208.9359\\\\337.01\\\\76.00388\\\\204.2484\\\\337.01\\\\77.40801\\\\201.9047\\\\337.01\\\\77.92969\\\\201.3145\\\\337.01\\\\81.018\\\\197.2172\\\\337.01\\\\82.01642\\\\194.8734\\\\337.01\\\\83.7233\\\\192.5297\\\\337.01\\\\84.67807\\\\190.1859\\\\337.01\\\\85.88257\\\\187.8422\\\\337.01\\\\86.77662\\\\185.4984\\\\337.01\\\\88.21052\\\\183.1547\\\\337.01\\\\88.67678\\\\180.8109\\\\337.01\\\\89.25264\\\\178.4672\\\\337.01\\\\90.24816\\\\176.1234\\\\337.01\\\\90.83131\\\\173.7797\\\\337.01\\\\91.26373\\\\171.4359\\\\337.01\\\\92.6648\\\\166.7484\\\\337.01\\\\92.97371\\\\164.4047\\\\337.01\\\\93.12873\\\\159.7172\\\\337.01\\\\93.17584\\\\152.6859\\\\337.01\\\\93.0293\\\\145.6547\\\\337.01\\\\92.85534\\\\143.3109\\\\337.01\\\\92.3933\\\\140.9672\\\\337.01\\\\91.5518\\\\138.6234\\\\337.01\\\\90.58476\\\\133.9359\\\\337.01\\\\89.87284\\\\131.5922\\\\337.01\\\\88.92268\\\\129.2484\\\\337.01\\\\88.54911\\\\126.9047\\\\337.01\\\\87.68194\\\\124.5609\\\\337.01\\\\86.33789\\\\122.2172\\\\337.01\\\\85.47454\\\\119.8734\\\\337.01\\\\84.15683\\\\117.5297\\\\337.01\\\\83.14225\\\\115.1859\\\\337.01\\\\81.47615\\\\112.8422\\\\337.01\\\\80.27344\\\\110.7263\\\\337.01\\\\78.65778\\\\108.1547\\\\337.01\\\\77.92969\\\\107.3061\\\\337.01\\\\75.58594\\\\104.2673\\\\337.01\\\\70.89844\\\\98.97046\\\\337.01\\\\68.38074\\\\96.43594\\\\337.01\\\\66.21094\\\\94.59663\\\\337.01\\\\63.03367\\\\91.74844\\\\337.01\\\\61.52344\\\\90.60773\\\\337.01\\\\59.17969\\\\88.63029\\\\337.01\\\\56.83594\\\\87.3438\\\\337.01\\\\54.49219\\\\85.87691\\\\337.01\\\\52.14844\\\\84.18039\\\\337.01\\\\49.80469\\\\83.24171\\\\337.01\\\\47.46094\\\\81.97013\\\\337.01\\\\45.11719\\\\81.00246\\\\337.01\\\\42.77344\\\\79.69603\\\\337.01\\\\40.42969\\\\78.85781\\\\337.01\\\\38.08594\\\\78.49974\\\\337.01\\\\35.74219\\\\77.60603\\\\337.01\\\\33.39844\\\\76.81591\\\\337.01\\\\28.71094\\\\75.88577\\\\337.01\\\\26.36719\\\\75.09944\\\\337.01\\\\24.02344\\\\74.58508\\\\337.01\\\\21.67969\\\\74.41319\\\\337.01\\\\14.64844\\\\74.19961\\\\337.01\\\\7.617188\\\\74.26453\\\\337.01\\\\2.929688\\\\74.44027\\\\337.01\\\\0.5859375\\\\74.69731\\\\337.01\\\\-4.101563\\\\76.08793\\\\337.01\\\\-6.445313\\\\76.49226\\\\337.01\\\\-8.789063\\\\77.12093\\\\337.01\\\\-11.13281\\\\78.06062\\\\337.01\\\\-13.47656\\\\78.67705\\\\337.01\\\\-15.82031\\\\79.20602\\\\337.01\\\\-18.16406\\\\80.67077\\\\337.01\\\\-20.50781\\\\81.56818\\\\337.01\\\\-22.85156\\\\82.93452\\\\337.01\\\\-25.19531\\\\83.69257\\\\337.01\\\\-27.53906\\\\85.49158\\\\337.01\\\\-29.88281\\\\86.50658\\\\337.01\\\\-32.22656\\\\88.21391\\\\337.01\\\\-34.57031\\\\90.13181\\\\337.01\\\\-36.91406\\\\91.68333\\\\337.01\\\\-39.25781\\\\93.56712\\\\337.01\\\\-41.60156\\\\95.59077\\\\337.01\\\\-47.06793\\\\101.1234\\\\337.01\\\\-50.97656\\\\106.257\\\\337.01\\\\-54.06295\\\\110.4984\\\\337.01\\\\-55.66406\\\\112.9218\\\\337.01\\\\-56.87866\\\\115.1859\\\\337.01\\\\-58.00781\\\\117.468\\\\337.01\\\\-60.35156\\\\121.8745\\\\337.01\\\\-60.61105\\\\122.2172\\\\337.01\\\\-61.37396\\\\124.5609\\\\337.01\\\\-61.96955\\\\126.9047\\\\337.01\\\\-63.18912\\\\129.2484\\\\337.01\\\\-63.92686\\\\131.5922\\\\337.01\\\\-64.32825\\\\133.9359\\\\337.01\\\\-65.08414\\\\136.2797\\\\337.01\\\\-65.66541\\\\138.6234\\\\337.01\\\\-65.95693\\\\140.9672\\\\337.01\\\\-66.45103\\\\145.6547\\\\337.01\\\\-66.83923\\\\150.3422\\\\337.01\\\\-67.00504\\\\155.0297\\\\337.01\\\\-66.91849\\\\157.3734\\\\337.01\\\\-66.59546\\\\162.0609\\\\337.01\\\\-65.85083\\\\169.0922\\\\337.01\\\\-65.52673\\\\171.4359\\\\337.01\\\\-64.66129\\\\173.7797\\\\337.01\\\\-63.60744\\\\178.4672\\\\337.01\\\\-62.44127\\\\180.8109\\\\337.01\\\\-61.60844\\\\183.1547\\\\337.01\\\\-61.10444\\\\185.4984\\\\337.01\\\\-59.69611\\\\187.8422\\\\337.01\\\\-58.78688\\\\190.1859\\\\337.01\\\\-57.22429\\\\192.5297\\\\337.01\\\\-56.42923\\\\194.8734\\\\337.01\\\\-55.66406\\\\195.816\\\\337.01\\\\-53.32031\\\\199.2024\\\\337.01\\\\-52.98665\\\\199.5609\\\\337.01\\\\-51.81459\\\\201.9047\\\\337.01\\\\-49.69277\\\\204.2484\\\\337.01\\\\-47.77253\\\\206.5922\\\\337.01\\\\-45.4857\\\\208.9359\\\\337.01\\\\-43.94531\\\\210.7107\\\\337.01\\\\-39.25781\\\\215.1271\\\\337.01\\\\-36.91406\\\\217.0729\\\\337.01\\\\-34.57031\\\\219.1932\\\\337.01\\\\-32.22656\\\\220.397\\\\337.01\\\\-31.95135\\\\220.6547\\\\337.01\\\\-28.60054\\\\222.9984\\\\337.01\\\\-27.53906\\\\223.8551\\\\337.01\\\\-25.19531\\\\224.6817\\\\337.01\\\\-22.85156\\\\226.2544\\\\337.01\\\\-20.50781\\\\227.2455\\\\337.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"344\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"22\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"45.11719\\\\233.0951\\\\340.01\\\\43.64898\\\\232.3734\\\\340.01\\\\42.77344\\\\231.5882\\\\340.01\\\\41.51367\\\\230.0297\\\\340.01\\\\42.77344\\\\229.1609\\\\340.01\\\\45.11719\\\\228.3465\\\\340.01\\\\47.46094\\\\226.8296\\\\340.01\\\\49.80469\\\\225.7274\\\\340.01\\\\50.36671\\\\225.3422\\\\340.01\\\\54.49219\\\\223.2026\\\\340.01\\\\56.83594\\\\221.5721\\\\340.01\\\\61.40058\\\\218.3109\\\\340.01\\\\63.86719\\\\216.4497\\\\340.01\\\\66.21094\\\\214.5379\\\\340.01\\\\67.18151\\\\213.6234\\\\340.01\\\\71.87971\\\\208.9359\\\\340.01\\\\75.93159\\\\204.2484\\\\340.01\\\\77.34375\\\\201.9047\\\\340.01\\\\77.92969\\\\201.2338\\\\340.01\\\\81.00505\\\\197.2172\\\\340.01\\\\81.93835\\\\194.8734\\\\340.01\\\\83.70493\\\\192.5297\\\\340.01\\\\84.59618\\\\190.1859\\\\340.01\\\\85.85058\\\\187.8422\\\\340.01\\\\86.71875\\\\185.4984\\\\340.01\\\\88.16106\\\\183.1547\\\\340.01\\\\89.19947\\\\178.4672\\\\340.01\\\\90.19531\\\\176.1234\\\\340.01\\\\90.79267\\\\173.7797\\\\340.01\\\\91.21298\\\\171.4359\\\\340.01\\\\91.82967\\\\169.0922\\\\340.01\\\\92.58527\\\\166.7484\\\\340.01\\\\92.92848\\\\164.4047\\\\340.01\\\\93.04102\\\\162.0609\\\\340.01\\\\93.14051\\\\157.3734\\\\340.01\\\\93.15228\\\\152.6859\\\\340.01\\\\93.01096\\\\145.6547\\\\340.01\\\\92.82652\\\\143.3109\\\\340.01\\\\92.30957\\\\140.9672\\\\340.01\\\\91.49306\\\\138.6234\\\\340.01\\\\90.54668\\\\133.9359\\\\340.01\\\\89.79492\\\\131.5922\\\\340.01\\\\88.89133\\\\129.2484\\\\340.01\\\\88.5321\\\\126.9047\\\\340.01\\\\87.59558\\\\124.5609\\\\340.01\\\\86.30105\\\\122.2172\\\\340.01\\\\85.44\\\\119.8734\\\\340.01\\\\84.1048\\\\117.5297\\\\340.01\\\\83.04976\\\\115.1859\\\\340.01\\\\81.44531\\\\112.8422\\\\340.01\\\\78.61036\\\\108.1547\\\\340.01\\\\77.92969\\\\107.3653\\\\340.01\\\\75.58594\\\\104.3202\\\\340.01\\\\70.89844\\\\99.03911\\\\340.01\\\\68.31129\\\\96.43594\\\\340.01\\\\66.21094\\\\94.65131\\\\340.01\\\\63.00066\\\\91.74844\\\\340.01\\\\59.99457\\\\89.40469\\\\340.01\\\\59.17969\\\\88.66788\\\\340.01\\\\56.83594\\\\87.38558\\\\340.01\\\\52.7524\\\\84.71719\\\\340.01\\\\52.14844\\\\84.20734\\\\340.01\\\\49.80469\\\\83.25685\\\\340.01\\\\47.46094\\\\81.99566\\\\340.01\\\\45.11719\\\\81.03172\\\\340.01\\\\42.77344\\\\79.72434\\\\340.01\\\\40.42969\\\\78.86356\\\\340.01\\\\38.08594\\\\78.50819\\\\340.01\\\\33.39844\\\\76.83095\\\\340.01\\\\28.71094\\\\75.9072\\\\340.01\\\\26.36719\\\\75.12989\\\\340.01\\\\24.02344\\\\74.57621\\\\340.01\\\\21.67969\\\\74.42056\\\\340.01\\\\14.64844\\\\74.21133\\\\340.01\\\\9.960938\\\\74.21133\\\\340.01\\\\5.273438\\\\74.33174\\\\340.01\\\\2.929688\\\\74.44027\\\\340.01\\\\0.5859375\\\\74.68344\\\\340.01\\\\-4.101563\\\\76.06187\\\\340.01\\\\-6.445313\\\\76.48074\\\\340.01\\\\-8.789063\\\\77.09653\\\\340.01\\\\-11.13281\\\\78.03346\\\\340.01\\\\-13.47656\\\\78.66458\\\\340.01\\\\-15.82031\\\\79.18885\\\\340.01\\\\-18.16406\\\\80.65698\\\\340.01\\\\-20.50781\\\\81.53359\\\\340.01\\\\-22.85156\\\\82.9015\\\\340.01\\\\-25.19531\\\\83.66675\\\\340.01\\\\-27.53906\\\\85.45914\\\\340.01\\\\-29.88281\\\\86.475\\\\340.01\\\\-32.22656\\\\88.17611\\\\340.01\\\\-34.57031\\\\90.08352\\\\340.01\\\\-36.91406\\\\91.61217\\\\340.01\\\\-39.25781\\\\93.50252\\\\340.01\\\\-41.60156\\\\95.54475\\\\340.01\\\\-47.14196\\\\101.1234\\\\340.01\\\\-50.67958\\\\105.8109\\\\340.01\\\\-50.97656\\\\106.1445\\\\340.01\\\\-54.1083\\\\110.4984\\\\340.01\\\\-55.67351\\\\112.8422\\\\340.01\\\\-59.33949\\\\119.8734\\\\340.01\\\\-60.7103\\\\122.2172\\\\340.01\\\\-61.41526\\\\124.5609\\\\340.01\\\\-62.03443\\\\126.9047\\\\340.01\\\\-63.2848\\\\129.2484\\\\340.01\\\\-63.97519\\\\131.5922\\\\340.01\\\\-64.37412\\\\133.9359\\\\340.01\\\\-65.20158\\\\136.2797\\\\340.01\\\\-65.72266\\\\138.6234\\\\340.01\\\\-66.51716\\\\145.6547\\\\340.01\\\\-66.90674\\\\150.3422\\\\340.01\\\\-67.05817\\\\152.6859\\\\340.01\\\\-67.07191\\\\155.0297\\\\340.01\\\\-66.80727\\\\159.7172\\\\340.01\\\\-66.38559\\\\164.4047\\\\340.01\\\\-65.8744\\\\169.0922\\\\340.01\\\\-65.56069\\\\171.4359\\\\340.01\\\\-64.72816\\\\173.7797\\\\340.01\\\\-64.14594\\\\176.1234\\\\340.01\\\\-63.66697\\\\178.4672\\\\340.01\\\\-62.54883\\\\180.8109\\\\340.01\\\\-61.63273\\\\183.1547\\\\340.01\\\\-61.1263\\\\185.4984\\\\340.01\\\\-59.74519\\\\187.8422\\\\340.01\\\\-58.81712\\\\190.1859\\\\340.01\\\\-57.25644\\\\192.5297\\\\340.01\\\\-56.44758\\\\194.8734\\\\340.01\\\\-55.66406\\\\195.85\\\\340.01\\\\-53.32031\\\\199.2374\\\\340.01\\\\-53.01497\\\\199.5609\\\\340.01\\\\-51.82329\\\\201.9047\\\\340.01\\\\-49.72613\\\\204.2484\\\\340.01\\\\-47.79478\\\\206.5922\\\\340.01\\\\-45.51518\\\\208.9359\\\\340.01\\\\-43.94531\\\\210.7713\\\\340.01\\\\-41.60156\\\\212.8845\\\\340.01\\\\-39.25781\\\\215.1362\\\\340.01\\\\-36.91406\\\\217.0861\\\\340.01\\\\-34.57031\\\\219.2098\\\\340.01\\\\-32.22656\\\\220.4119\\\\340.01\\\\-29.88281\\\\222.0768\\\\340.01\\\\-27.53906\\\\223.8773\\\\340.01\\\\-25.19531\\\\224.7128\\\\340.01\\\\-22.85156\\\\226.2625\\\\340.01\\\\-20.50781\\\\227.2578\\\\340.01\\\\-18.16406\\\\228.6914\\\\340.01\\\\-15.82031\\\\229.7006\\\\340.01\\\\-15.45354\\\\230.0297\\\\340.01\\\\-15.82031\\\\230.6879\\\\340.01\\\\-17.62983\\\\232.3734\\\\340.01\\\\-18.16406\\\\232.6311\\\\340.01\\\\-20.50781\\\\233.1132\\\\340.01\\\\-34.57031\\\\233.131\\\\340.01\\\\-41.60156\\\\233.1818\\\\340.01\\\\-46.28906\\\\233.1652\\\\340.01\\\\-55.66406\\\\233.1981\\\\340.01\\\\-60.35156\\\\233.19\\\\340.01\\\\-62.69531\\\\233.246\\\\340.01\\\\-65.03906\\\\233.0382\\\\340.01\\\\-69.72656\\\\233.0671\\\\340.01\\\\-83.78906\\\\233.0766\\\\340.01\\\\-90.82031\\\\233.1132\\\\340.01\\\\-93.16406\\\\233.1964\\\\340.01\\\\-95.50781\\\\233.8279\\\\340.01\\\\-97.85156\\\\234.0941\\\\340.01\\\\-102.5391\\\\234.2306\\\\340.01\\\\-109.5703\\\\234.279\\\\340.01\\\\-116.6016\\\\234.2191\\\\340.01\\\\-121.2891\\\\234.2543\\\\340.01\\\\-130.6641\\\\234.1741\\\\340.01\\\\-133.0078\\\\234.2081\\\\340.01\\\\-137.6953\\\\234.1499\\\\340.01\\\\-142.3828\\\\234.2703\\\\340.01\\\\-147.0703\\\\234.1641\\\\340.01\\\\-151.7578\\\\234.1932\\\\340.01\\\\-156.4453\\\\234.1267\\\\340.01\\\\-158.7891\\\\234.1543\\\\340.01\\\\-163.4766\\\\234.1221\\\\340.01\\\\-168.1641\\\\234.2766\\\\340.01\\\\-175.1953\\\\234.2686\\\\340.01\\\\-177.5391\\\\234.2987\\\\340.01\\\\-184.5703\\\\234.2835\\\\340.01\\\\-186.9141\\\\234.3328\\\\340.01\\\\-189.2578\\\\234.2902\\\\340.01\\\\-193.9453\\\\234.4002\\\\340.01\\\\-196.2891\\\\234.3837\\\\340.01\\\\-200.9766\\\\234.4888\\\\340.01\\\\-203.3203\\\\234.3837\\\\340.01\\\\-208.0078\\\\234.3864\\\\340.01\\\\-212.6953\\\\234.5069\\\\340.01\\\\-215.0391\\\\234.4907\\\\340.01\\\\-222.0703\\\\234.6239\\\\340.01\\\\-224.4141\\\\234.4731\\\\340.01\\\\-231.4453\\\\234.4218\\\\340.01\\\\-233.7891\\\\234.3266\\\\340.01\\\\-243.1641\\\\234.0949\\\\340.01\\\\-247.8516\\\\233.6378\\\\340.01\\\\-250.1953\\\\233.6378\\\\340.01\\\\-252.5391\\\\234.0867\\\\340.01\\\\-254.6143\\\\234.7172\\\\340.01\\\\-254.8828\\\\234.9516\\\\340.01\\\\-257.2266\\\\234.9974\\\\340.01\\\\-259.5703\\\\235.8786\\\\340.01\\\\-261.108\\\\237.0609\\\\340.01\\\\-261.9141\\\\237.891\\\\340.01\\\\-263.0544\\\\239.4047\\\\340.01\\\\-263.1094\\\\241.7484\\\\340.01\\\\-262.7858\\\\244.0922\\\\340.01\\\\-261.9141\\\\245.3383\\\\340.01\\\\-259.5703\\\\248.3687\\\\340.01\\\\-259.1593\\\\248.7797\\\\340.01\\\\-255.7086\\\\253.4672\\\\340.01\\\\-252.5391\\\\256.7179\\\\340.01\\\\-250.1953\\\\258.9929\\\\340.01\\\\-247.8516\\\\261.4776\\\\340.01\\\\-245.5078\\\\263.6263\\\\340.01\\\\-244.1031\\\\265.1859\\\\340.01\\\\-241.5987\\\\267.5297\\\\340.01\\\\-239.4125\\\\269.8734\\\\340.01\\\\-236.9858\\\\272.2172\\\\340.01\\\\-233.7891\\\\275.424\\\\340.01\\\\-231.4453\\\\277.8469\\\\340.01\\\\-229.1016\\\\280.0326\\\\340.01\\\\-226.7578\\\\282.5503\\\\340.01\\\\-225.1803\\\\283.9359\\\\340.01\\\\-222.0703\\\\287.259\\\\340.01\\\\-220.6122\\\\288.6234\\\\340.01\\\\-218.3861\\\\290.9672\\\\340.01\\\\-214.9922\\\\293.3109\\\\340.01\\\\-212.6953\\\\294.6589\\\\340.01\\\\-210.3516\\\\295.3856\\\\340.01\\\\-208.0078\\\\296.5275\\\\340.01\\\\-205.6641\\\\296.892\\\\340.01\\\\-203.3203\\\\297.0948\\\\340.01\\\\-198.6328\\\\297.0876\\\\340.01\\\\-193.9453\\\\296.9006\\\\340.01\\\\-170.5078\\\\296.8421\\\\340.01\\\\-168.1641\\\\296.8731\\\\340.01\\\\-158.7891\\\\296.8427\\\\340.01\\\\-156.4453\\\\296.8667\\\\340.01\\\\-144.7266\\\\296.8678\\\\340.01\\\\-130.6641\\\\296.8089\\\\340.01\\\\-121.2891\\\\296.7995\\\\340.01\\\\-114.2578\\\\296.8629\\\\340.01\\\\-102.5391\\\\296.9188\\\\340.01\\\\-100.1953\\\\296.9004\\\\340.01\\\\-79.10156\\\\296.9041\\\\340.01\\\\-76.75781\\\\296.9428\\\\340.01\\\\-69.72656\\\\296.9622\\\\340.01\\\\-53.32031\\\\296.9428\\\\340.01\\\\-50.97656\\\\297.0061\\\\340.01\\\\-41.60156\\\\296.9731\\\\340.01\\\\-39.25781\\\\296.8877\\\\340.01\\\\-36.91406\\\\296.9467\\\\340.01\\\\-32.22656\\\\296.9731\\\\340.01\\\\-29.88281\\\\296.8888\\\\340.01\\\\-25.19531\\\\296.8798\\\\340.01\\\\-22.85156\\\\297.0362\\\\340.01\\\\-20.50781\\\\296.8789\\\\340.01\\\\-15.82031\\\\296.9535\\\\340.01\\\\-4.101563\\\\296.8673\\\\340.01\\\\-1.757813\\\\296.9081\\\\340.01\\\\19.33594\\\\296.7952\\\\340.01\\\\21.67969\\\\296.8163\\\\340.01\\\\33.39844\\\\296.734\\\\340.01\\\\42.77344\\\\296.7324\\\\340.01\\\\49.80469\\\\296.6724\\\\340.01\\\\66.21094\\\\296.6346\\\\340.01\\\\87.30469\\\\296.5154\\\\340.01\\\\96.67969\\\\296.5208\\\\340.01\\\\99.02344\\\\296.473\\\\340.01\\\\108.3984\\\\296.466\\\\340.01\\\\110.7422\\\\296.4326\\\\340.01\\\\117.7734\\\\296.446\\\\340.01\\\\131.8359\\\\296.308\\\\340.01\\\\134.1797\\\\296.1372\\\\340.01\\\\136.5234\\\\295.8701\\\\340.01\\\\152.9297\\\\295.8012\\\\340.01\\\\157.6172\\\\295.833\\\\340.01\\\\159.9609\\\\295.7849\\\\340.01\\\\164.6484\\\\295.8172\\\\340.01\\\\171.6797\\\\295.7684\\\\340.01\\\\176.3672\\\\295.6638\\\\340.01\\\\183.3984\\\\295.6819\\\\340.01\\\\190.4297\\\\295.6093\\\\340.01\\\\192.7734\\\\295.6272\\\\340.01\\\\197.4609\\\\295.833\\\\340.01\\\\202.1484\\\\295.7173\\\\340.01\\\\204.4922\\\\295.3679\\\\340.01\\\\206.8359\\\\294.7878\\\\340.01\\\\209.1797\\\\294.3717\\\\340.01\\\\211.5234\\\\292.5075\\\\340.01\\\\213.8672\\\\291.2065\\\\340.01\\\\216.2109\\\\289.6012\\\\340.01\\\\217.2437\\\\288.6234\\\\340.01\\\\218.5547\\\\287.1462\\\\340.01\\\\221.7714\\\\283.9359\\\\340.01\\\\225.5859\\\\279.9119\\\\340.01\\\\227.9297\\\\277.6044\\\\340.01\\\\230.2734\\\\275.1119\\\\340.01\\\\233.2526\\\\272.2172\\\\340.01\\\\234.9609\\\\270.3654\\\\340.01\\\\237.8731\\\\267.5297\\\\340.01\\\\240.1082\\\\265.1859\\\\340.01\\\\242.4774\\\\262.8422\\\\340.01\\\\246.6797\\\\258.4333\\\\340.01\\\\249.248\\\\255.8109\\\\340.01\\\\251.4573\\\\253.4672\\\\340.01\\\\256.0547\\\\248.2246\\\\340.01\\\\257.4792\\\\246.4359\\\\340.01\\\\259.8469\\\\244.0922\\\\340.01\\\\260.9666\\\\241.7484\\\\340.01\\\\261.8304\\\\239.4047\\\\340.01\\\\261.0668\\\\237.0609\\\\340.01\\\\259.4996\\\\234.7172\\\\340.01\\\\258.3984\\\\233.6932\\\\340.01\\\\256.0547\\\\233.1526\\\\340.01\\\\253.7109\\\\233.0245\\\\340.01\\\\251.3672\\\\233.382\\\\340.01\\\\249.0234\\\\232.6886\\\\340.01\\\\244.3359\\\\232.8195\\\\340.01\\\\241.9922\\\\233.0007\\\\340.01\\\\232.6172\\\\233.0305\\\\340.01\\\\227.9297\\\\233.0007\\\\340.01\\\\223.2422\\\\233.0441\\\\340.01\\\\209.1797\\\\233.0108\\\\340.01\\\\206.8359\\\\233.0343\\\\340.01\\\\204.4922\\\\232.916\\\\340.01\\\\202.1484\\\\232.6179\\\\340.01\\\\195.1172\\\\232.7322\\\\340.01\\\\181.0547\\\\232.7719\\\\340.01\\\\174.0234\\\\232.7456\\\\340.01\\\\166.9922\\\\232.7614\\\\340.01\\\\148.2422\\\\232.8497\\\\340.01\\\\141.2109\\\\232.8253\\\\340.01\\\\136.5234\\\\232.721\\\\340.01\\\\134.1797\\\\232.7614\\\\340.01\\\\129.4922\\\\232.7481\\\\340.01\\\\113.0859\\\\232.8617\\\\340.01\\\\106.0547\\\\232.8735\\\\340.01\\\\103.7109\\\\232.8253\\\\340.01\\\\101.3672\\\\232.9942\\\\340.01\\\\96.67969\\\\233.1397\\\\340.01\\\\68.55469\\\\233.1483\\\\340.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"342\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"23\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-13.47656\\\\296.8499\\\\343.01\\\\14.64844\\\\296.8324\\\\343.01\\\\33.39844\\\\296.8033\\\\343.01\\\\63.86719\\\\296.7919\\\\343.01\\\\87.30469\\\\296.7566\\\\343.01\\\\117.7734\\\\296.7458\\\\343.01\\\\131.8359\\\\296.7216\\\\343.01\\\\136.5234\\\\296.6649\\\\343.01\\\\138.8672\\\\295.4763\\\\343.01\\\\157.6172\\\\295.4763\\\\343.01\\\\159.9609\\\\295.4454\\\\343.01\\\\164.6484\\\\295.4763\\\\343.01\\\\166.9922\\\\295.4454\\\\343.01\\\\176.3672\\\\295.4154\\\\343.01\\\\192.7734\\\\295.4006\\\\343.01\\\\197.4609\\\\295.4763\\\\343.01\\\\202.1484\\\\295.4303\\\\343.01\\\\204.4922\\\\295.3165\\\\343.01\\\\206.8359\\\\295.0653\\\\343.01\\\\209.1797\\\\294.4177\\\\343.01\\\\211.5234\\\\292.3443\\\\343.01\\\\213.8672\\\\291.6227\\\\343.01\\\\214.5661\\\\290.9672\\\\343.01\\\\216.2109\\\\289.7204\\\\343.01\\\\217.3604\\\\288.6234\\\\343.01\\\\219.4239\\\\286.2797\\\\343.01\\\\221.9183\\\\283.9359\\\\343.01\\\\225.5859\\\\280.0836\\\\343.01\\\\227.9297\\\\277.9224\\\\343.01\\\\230.2734\\\\275.331\\\\343.01\\\\231.0524\\\\274.5609\\\\343.01\\\\232.6172\\\\273.2719\\\\343.01\\\\233.6719\\\\272.2172\\\\343.01\\\\235.7042\\\\269.8734\\\\343.01\\\\238.2833\\\\267.5297\\\\343.01\\\\240.4319\\\\265.1859\\\\343.01\\\\244.3359\\\\261.4106\\\\343.01\\\\246.6797\\\\258.8701\\\\343.01\\\\249.0234\\\\256.7692\\\\343.01\\\\249.948\\\\255.8109\\\\343.01\\\\251.3672\\\\254.1198\\\\343.01\\\\254.5945\\\\251.1234\\\\343.01\\\\255.6744\\\\248.7797\\\\343.01\\\\257.489\\\\246.4359\\\\343.01\\\\259.8584\\\\244.0922\\\\343.01\\\\260.9205\\\\241.7484\\\\343.01\\\\261.8858\\\\239.4047\\\\343.01\\\\261.2413\\\\237.0609\\\\343.01\\\\259.3759\\\\234.7172\\\\343.01\\\\258.3984\\\\233.7629\\\\343.01\\\\256.0547\\\\232.9203\\\\343.01\\\\251.3672\\\\232.8406\\\\343.01\\\\249.0234\\\\232.6981\\\\343.01\\\\241.9922\\\\232.8407\\\\343.01\\\\234.9609\\\\232.8642\\\\343.01\\\\227.9297\\\\232.8407\\\\343.01\\\\218.5547\\\\232.8757\\\\343.01\\\\213.8672\\\\232.8525\\\\343.01\\\\206.8359\\\\232.8642\\\\343.01\\\\202.1484\\\\232.7003\\\\343.01\\\\197.4609\\\\232.7406\\\\343.01\\\\190.4297\\\\232.7537\\\\343.01\\\\174.0234\\\\232.7537\\\\343.01\\\\157.6172\\\\232.7666\\\\343.01\\\\155.2734\\\\232.792\\\\343.01\\\\141.2109\\\\232.7794\\\\343.01\\\\136.5234\\\\232.7406\\\\343.01\\\\124.8047\\\\232.7537\\\\343.01\\\\122.4609\\\\232.7794\\\\343.01\\\\103.7109\\\\232.7794\\\\343.01\\\\96.67969\\\\232.9126\\\\343.01\\\\54.49219\\\\232.9126\\\\343.01\\\\45.11719\\\\232.8902\\\\343.01\\\\42.77344\\\\232.8044\\\\343.01\\\\38.08594\\\\232.7794\\\\343.01\\\\36.64153\\\\232.3734\\\\343.01\\\\38.08594\\\\231.9234\\\\343.01\\\\40.42969\\\\229.497\\\\343.01\\\\42.77344\\\\229.0768\\\\343.01\\\\45.11719\\\\228.3851\\\\343.01\\\\47.46094\\\\226.9828\\\\343.01\\\\49.80469\\\\226.2342\\\\343.01\\\\52.14844\\\\224.5333\\\\343.01\\\\54.49219\\\\223.435\\\\343.01\\\\54.94049\\\\222.9984\\\\343.01\\\\56.83594\\\\221.7432\\\\343.01\\\\58.32031\\\\220.6547\\\\343.01\\\\59.17969\\\\219.8756\\\\343.01\\\\61.52344\\\\219.154\\\\343.01\\\\64.5971\\\\215.9672\\\\343.01\\\\66.21094\\\\214.6717\\\\343.01\\\\67.30957\\\\213.6234\\\\343.01\\\\69.44305\\\\211.2797\\\\343.01\\\\71.93533\\\\208.9359\\\\343.01\\\\75.58594\\\\204.9751\\\\343.01\\\\76.34663\\\\204.2484\\\\343.01\\\\77.07796\\\\201.9047\\\\343.01\\\\79.4009\\\\199.5609\\\\343.01\\\\80.80936\\\\197.2172\\\\343.01\\\\82.61719\\\\194.8027\\\\343.01\\\\83.81027\\\\192.5297\\\\343.01\\\\84.70689\\\\190.1859\\\\343.01\\\\86.036\\\\187.8422\\\\343.01\\\\87.30469\\\\185.8838\\\\343.01\\\\87.68246\\\\185.4984\\\\343.01\\\\88.88221\\\\180.8109\\\\343.01\\\\89.11252\\\\178.4672\\\\343.01\\\\89.64844\\\\177.7911\\\\343.01\\\\90.63388\\\\176.1234\\\\343.01\\\\90.79569\\\\173.7797\\\\343.01\\\\91.10613\\\\171.4359\\\\343.01\\\\92.53577\\\\169.0922\\\\343.01\\\\92.74599\\\\166.7484\\\\343.01\\\\92.91211\\\\162.0609\\\\343.01\\\\93.33398\\\\159.7172\\\\343.01\\\\93.3525\\\\150.3422\\\\343.01\\\\92.9874\\\\147.9984\\\\343.01\\\\92.81616\\\\143.3109\\\\343.01\\\\92.65137\\\\140.9672\\\\343.01\\\\92.28917\\\\138.6234\\\\343.01\\\\91.99219\\\\138.295\\\\343.01\\\\90.88379\\\\136.2797\\\\343.01\\\\90.72434\\\\133.9359\\\\343.01\\\\89.63928\\\\131.5922\\\\343.01\\\\89.00118\\\\129.2484\\\\343.01\\\\88.44993\\\\126.9047\\\\343.01\\\\88.13577\\\\124.5609\\\\343.01\\\\87.30469\\\\123.6708\\\\343.01\\\\86.17751\\\\122.2172\\\\343.01\\\\85.52595\\\\119.8734\\\\343.01\\\\84.34743\\\\117.5297\\\\343.01\\\\83.591\\\\115.1859\\\\343.01\\\\81.36161\\\\112.8422\\\\343.01\\\\80.40365\\\\110.4984\\\\343.01\\\\77.92969\\\\107.4057\\\\343.01\\\\76.88994\\\\105.8109\\\\343.01\\\\75.58594\\\\104.1483\\\\343.01\\\\72.53094\\\\101.1234\\\\343.01\\\\70.89844\\\\99.3583\\\\343.01\\\\68.03966\\\\96.43594\\\\343.01\\\\66.21094\\\\94.85841\\\\343.01\\\\63.2178\\\\91.74844\\\\343.01\\\\59.9375\\\\89.40469\\\\343.01\\\\56.83594\\\\86.85168\\\\343.01\\\\54.49219\\\\85.89411\\\\343.01\\\\52.14844\\\\83.75636\\\\343.01\\\\49.80469\\\\83.0305\\\\343.01\\\\47.46094\\\\81.82986\\\\343.01\\\\45.11719\\\\81.13115\\\\343.01\\\\43.61636\\\\80.02969\\\\343.01\\\\42.77344\\\\79.26299\\\\343.01\\\\40.42969\\\\78.94232\\\\343.01\\\\38.08594\\\\78.44798\\\\343.01\\\\35.74219\\\\77.71319\\\\343.01\\\\33.39844\\\\76.62014\\\\343.01\\\\31.05469\\\\76.45058\\\\343.01\\\\28.99255\\\\75.34219\\\\343.01\\\\28.71094\\\\75.08814\\\\343.01\\\\26.36719\\\\74.78448\\\\343.01\\\\24.02344\\\\74.61057\\\\343.01\\\\21.67969\\\\74.54632\\\\343.01\\\\19.33594\\\\74.09106\\\\343.01\\\\9.960938\\\\74.04196\\\\343.01\\\\5.273438\\\\74.09106\\\\343.01\\\\2.929688\\\\74.55463\\\\343.01\\\\0.5859375\\\\74.63775\\\\343.01\\\\-4.101563\\\\75.10286\\\\343.01\\\\-6.445313\\\\76.49429\\\\343.01\\\\-8.789063\\\\76.67171\\\\343.01\\\\-10.42799\\\\77.68594\\\\343.01\\\\-11.13281\\\\78.2649\\\\343.01\\\\-13.47656\\\\78.54448\\\\343.01\\\\-15.82031\\\\79.10727\\\\343.01\\\\-18.16406\\\\79.86597\\\\343.01\\\\-18.33274\\\\80.02969\\\\343.01\\\\-22.37745\\\\82.37344\\\\343.01\\\\-22.85156\\\\82.77675\\\\343.01\\\\-25.19531\\\\83.57171\\\\343.01\\\\-27.22969\\\\84.71719\\\\343.01\\\\-27.53906\\\\84.99342\\\\343.01\\\\-29.88281\\\\86.06935\\\\343.01\\\\-32.22656\\\\87.99243\\\\343.01\\\\-34.57031\\\\90.32504\\\\343.01\\\\-36.91406\\\\91.11633\\\\343.01\\\\-37.53859\\\\91.74844\\\\343.01\\\\-41.60156\\\\95.4947\\\\343.01\\\\-44.75509\\\\98.77969\\\\343.01\\\\-46.28906\\\\100.0988\\\\343.01\\\\-47.29911\\\\101.1234\\\\343.01\\\\-48.63281\\\\102.8523\\\\343.01\\\\-51.72631\\\\105.8109\\\\343.01\\\\-52.41647\\\\108.1547\\\\343.01\\\\-53.32031\\\\109.1202\\\\343.01\\\\-54.39367\\\\110.4984\\\\343.01\\\\-55.85938\\\\112.8422\\\\343.01\\\\-57.07632\\\\115.1859\\\\343.01\\\\-58.80323\\\\117.5297\\\\343.01\\\\-59.511\\\\119.8734\\\\343.01\\\\-60.86516\\\\122.2172\\\\343.01\\\\-61.57744\\\\124.5609\\\\343.01\\\\-61.88775\\\\126.9047\\\\343.01\\\\-63.71547\\\\129.2484\\\\343.01\\\\-64.02027\\\\131.5922\\\\343.01\\\\-64.8298\\\\133.9359\\\\343.01\\\\-65.21739\\\\136.2797\\\\343.01\\\\-66.03065\\\\138.6234\\\\343.01\\\\-66.32159\\\\145.6547\\\\343.01\\\\-66.52577\\\\147.9984\\\\343.01\\\\-68.15379\\\\150.3422\\\\343.01\\\\-68.19411\\\\152.6859\\\\343.01\\\\-68.12855\\\\159.7172\\\\343.01\\\\-67.38281\\\\160.578\\\\343.01\\\\-66.33832\\\\162.0609\\\\343.01\\\\-66.11034\\\\169.0922\\\\343.01\\\\-65.01181\\\\173.7797\\\\343.01\\\\-64.67431\\\\176.1234\\\\343.01\\\\-63.80735\\\\178.4672\\\\343.01\\\\-63.54492\\\\180.8109\\\\343.01\\\\-61.65305\\\\183.1547\\\\343.01\\\\-61.42054\\\\185.4984\\\\343.01\\\\-60.49805\\\\187.8422\\\\343.01\\\\-58.00781\\\\191.825\\\\343.01\\\\-57.387\\\\192.5297\\\\343.01\\\\-56.74913\\\\194.8734\\\\343.01\\\\-55.66406\\\\195.936\\\\343.01\\\\-54.58899\\\\197.2172\\\\343.01\\\\-53.60318\\\\199.5609\\\\343.01\\\\-50.97656\\\\203.258\\\\343.01\\\\-48.00071\\\\206.5922\\\\343.01\\\\-45.5013\\\\208.9359\\\\343.01\\\\-43.50982\\\\211.2797\\\\343.01\\\\-41.60156\\\\212.84\\\\343.01\\\\-39.25781\\\\215.3739\\\\343.01\\\\-35.93977\\\\218.3109\\\\343.01\\\\-34.57031\\\\219.3768\\\\343.01\\\\-32.52378\\\\220.6547\\\\343.01\\\\-32.22656\\\\220.9395\\\\343.01\\\\-29.88281\\\\221.9077\\\\343.01\\\\-28.61672\\\\222.9984\\\\343.01\\\\-27.53906\\\\224.1391\\\\343.01\\\\-25.19531\\\\224.7669\\\\343.01\\\\-24.54516\\\\225.3422\\\\343.01\\\\-20.89297\\\\227.6859\\\\343.01\\\\-20.50781\\\\228.0531\\\\343.01\\\\-18.16406\\\\228.8638\\\\343.01\\\\-15.82031\\\\229.1627\\\\343.01\\\\-14.73801\\\\230.0297\\\\343.01\\\\-13.47656\\\\231.7823\\\\343.01\\\\-11.13281\\\\231.9774\\\\343.01\\\\-10.70429\\\\232.3734\\\\343.01\\\\-11.13281\\\\232.7537\\\\343.01\\\\-15.82031\\\\232.8044\\\\343.01\\\\-20.50781\\\\232.9015\\\\343.01\\\\-34.57031\\\\232.9126\\\\343.01\\\\-41.60156\\\\232.9345\\\\343.01\\\\-58.00781\\\\232.9453\\\\343.01\\\\-60.35156\\\\232.9345\\\\343.01\\\\-62.69531\\\\233.5567\\\\343.01\\\\-65.03906\\\\232.8672\\\\343.01\\\\-83.78906\\\\232.8788\\\\343.01\\\\-93.16406\\\\232.9126\\\\343.01\\\\-95.50781\\\\233.5393\\\\343.01\\\\-97.85156\\\\233.7035\\\\343.01\\\\-102.5391\\\\233.7288\\\\343.01\\\\-121.2891\\\\233.7406\\\\343.01\\\\-137.6953\\\\233.7202\\\\343.01\\\\-142.3828\\\\233.7337\\\\343.01\\\\-163.4766\\\\233.7135\\\\343.01\\\\-168.1641\\\\233.7435\\\\343.01\\\\-189.2578\\\\233.76\\\\343.01\\\\-200.9766\\\\233.788\\\\343.01\\\\-208.0078\\\\233.7738\\\\343.01\\\\-222.0703\\\\233.8144\\\\343.01\\\\-243.1641\\\\233.72\\\\343.01\\\\-247.8516\\\\233.5974\\\\343.01\\\\-250.1953\\\\233.592\\\\343.01\\\\-252.5391\\\\233.6761\\\\343.01\\\\-254.8828\\\\233.8458\\\\343.01\\\\-257.2266\\\\233.8853\\\\343.01\\\\-258.0715\\\\234.7172\\\\343.01\\\\-260.9406\\\\237.0609\\\\343.01\\\\-261.9141\\\\237.9809\\\\343.01\\\\-263.0811\\\\239.4047\\\\343.01\\\\-263.0952\\\\241.7484\\\\343.01\\\\-262.8482\\\\244.0922\\\\343.01\\\\-261.1393\\\\246.4359\\\\343.01\\\\-259.5703\\\\248.77\\\\343.01\\\\-257.2359\\\\251.1234\\\\343.01\\\\-256.1725\\\\253.4672\\\\343.01\\\\-254.8828\\\\254.541\\\\343.01\\\\-253.6187\\\\255.8109\\\\343.01\\\\-252.5391\\\\257.1211\\\\343.01\\\\-248.9935\\\\260.4984\\\\343.01\\\\-246.7643\\\\262.8422\\\\343.01\\\\-243.1641\\\\266.3453\\\\343.01\\\\-239.7483\\\\269.8734\\\\343.01\\\\-238.4766\\\\270.9653\\\\343.01\\\\-237.2486\\\\272.2172\\\\343.01\\\\-236.1328\\\\273.5273\\\\343.01\\\\-235.0992\\\\274.5609\\\\343.01\\\\-233.7891\\\\275.6767\\\\343.01\\\\-232.5432\\\\276.9047\\\\343.01\\\\-231.4453\\\\278.1825\\\\343.01\\\\-227.9297\\\\281.5922\\\\343.01\\\\-224.4141\\\\285.1934\\\\343.01\\\\-222.0703\\\\287.4207\\\\343.01\\\\-218.7154\\\\290.9672\\\\343.01\\\\-217.3828\\\\291.9945\\\\343.01\\\\-215.0391\\\\293.3382\\\\343.01\\\\-212.6953\\\\294.5551\\\\343.01\\\\-210.3516\\\\295.3438\\\\343.01\\\\-209.9888\\\\295.6547\\\\343.01\\\\-208.0078\\\\296.7353\\\\343.01\\\\-203.3203\\\\296.9163\\\\343.01\\\\-198.6328\\\\296.9163\\\\343.01\\\\-193.9453\\\\296.8423\\\\343.01\\\\-179.8828\\\\296.8319\\\\343.01\\\\-168.1641\\\\296.8428\\\\343.01\\\\-161.1328\\\\296.8266\\\\343.01\\\\-147.0703\\\\296.8376\\\\343.01\\\\-121.2891\\\\296.8209\\\\343.01\\\\-111.9141\\\\296.8435\\\\343.01\\\\-97.85156\\\\296.855\\\\343.01\\\\-90.82031\\\\296.838\\\\343.01\\\\-65.03906\\\\296.8668\\\\343.01\\\\-53.32031\\\\296.8553\\\\343.01\\\\-51.43964\\\\297.9984\\\\343.01\\\\-50.97656\\\\298.3864\\\\343.01\\\\-48.63281\\\\297.5516\\\\343.01\\\\-46.28906\\\\298.5331\\\\343.01\\\\-43.94531\\\\298.5331\\\\343.01\\\\-41.60156\\\\298.2598\\\\343.01\\\\-39.25781\\\\296.8499\\\\343.01\\\\-36.91406\\\\297.9681\\\\343.01\\\\-32.22656\\\\298.5331\\\\343.01\\\\-29.88281\\\\296.8741\\\\343.01\\\\-27.53906\\\\296.8383\\\\343.01\\\\-25.19531\\\\296.9201\\\\343.01\\\\-22.85156\\\\298.5331\\\\343.01\\\\-20.50781\\\\296.8441\\\\343.01\\\\-18.16406\\\\298.1147\\\\343.01\\\\-15.82031\\\\297.8174\\\\343.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,002a\" : {\n" +" \"Name\" : \"ROIDisplayColor\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"255\\\\0\\\\255\"\n" +" },\n" +" \"3006,0040\" : {\n" +" \"Name\" : \"ContourSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"0\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"13.63579\\\\147.5839\\\\274.01\\\\11.63579\\\\147.882\\\\274.01\\\\10.13579\\\\148.3365\\\\274.01\\\\9.135789\\\\148.7989\\\\274.01\\\\7.635788\\\\149.7859\\\\274.01\\\\6.037574\\\\151.4199\\\\274.01\\\\5.095466\\\\152.9199\\\\274.01\\\\4.507\\\\154.4199\\\\274.01\\\\4.299851\\\\155.4199\\\\274.01\\\\4.099024\\\\157.4199\\\\274.01\\\\4.240627\\\\158.9199\\\\274.01\\\\4.522152\\\\160.4199\\\\274.01\\\\5.437513\\\\162.4199\\\\274.01\\\\6.109003\\\\163.4199\\\\274.01\\\\7.635788\\\\164.9824\\\\274.01\\\\9.135789\\\\165.9763\\\\274.01\\\\10.63579\\\\166.5941\\\\274.01\\\\12.13579\\\\166.9426\\\\274.01\\\\13.63579\\\\167.0941\\\\274.01\\\\15.13579\\\\166.988\\\\274.01\\\\17.13579\\\\166.537\\\\274.01\\\\19.13579\\\\165.5782\\\\274.01\\\\20.63579\\\\164.3655\\\\274.01\\\\22.19224\\\\162.4199\\\\274.01\\\\22.7061\\\\161.4199\\\\274.01\\\\23.21912\\\\159.9199\\\\274.01\\\\23.42485\\\\158.9199\\\\274.01\\\\23.5186\\\\156.9199\\\\274.01\\\\23.23427\\\\154.9199\\\\274.01\\\\22.72173\\\\153.4199\\\\274.01\\\\22.22746\\\\152.4199\\\\274.01\\\\21.13579\\\\150.9318\\\\274.01\\\\20.09829\\\\149.9199\\\\274.01\\\\18.63579\\\\148.8949\\\\274.01\\\\17.13579\\\\148.2402\\\\274.01\\\\15.63579\\\\147.8214\\\\274.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"47\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-2.854718\\\\157.4199\\\\277.01\\\\-2.472545\\\\160.9199\\\\277.01\\\\-1.487775\\\\163.9199\\\\277.01\\\\-0.4315192\\\\165.9199\\\\277.01\\\\0.9787372\\\\167.9199\\\\277.01\\\\2.406915\\\\169.4199\\\\277.01\\\\3.635788\\\\170.4986\\\\277.01\\\\5.135788\\\\171.5571\\\\277.01\\\\6.135788\\\\172.111\\\\277.01\\\\8.135789\\\\173.0158\\\\277.01\\\\10.13579\\\\173.6004\\\\277.01\\\\12.63579\\\\174.0313\\\\277.01\\\\15.13579\\\\174.0013\\\\277.01\\\\17.63579\\\\173.571\\\\277.01\\\\19.13579\\\\173.1137\\\\277.01\\\\21.63579\\\\172.0419\\\\277.01\\\\23.13579\\\\171.1081\\\\277.01\\\\24.63579\\\\169.9456\\\\277.01\\\\26.19738\\\\168.4199\\\\277.01\\\\27.74516\\\\166.4199\\\\277.01\\\\28.32924\\\\165.4199\\\\277.01\\\\29.29383\\\\163.4199\\\\277.01\\\\29.81079\\\\161.9199\\\\277.01\\\\30.28139\\\\159.9199\\\\277.01\\\\30.45172\\\\157.4199\\\\277.01\\\\30.29068\\\\154.9199\\\\277.01\\\\29.82399\\\\152.9199\\\\277.01\\\\28.86814\\\\150.4199\\\\277.01\\\\27.79128\\\\148.4199\\\\277.01\\\\26.27724\\\\146.4199\\\\277.01\\\\24.63579\\\\144.8084\\\\277.01\\\\22.63579\\\\143.3281\\\\277.01\\\\21.63579\\\\142.7463\\\\277.01\\\\19.63579\\\\141.8135\\\\277.01\\\\18.13579\\\\141.3103\\\\277.01\\\\15.63579\\\\140.7907\\\\277.01\\\\13.63579\\\\140.6754\\\\277.01\\\\12.13579\\\\140.7704\\\\277.01\\\\9.635789\\\\141.2671\\\\277.01\\\\8.135789\\\\141.7522\\\\277.01\\\\5.135788\\\\143.2278\\\\277.01\\\\3.635788\\\\144.2585\\\\277.01\\\\2.350577\\\\145.4199\\\\277.01\\\\0.5107885\\\\147.4199\\\\277.01\\\\-0.5040925\\\\148.9199\\\\277.01\\\\-1.520461\\\\150.9199\\\\277.01\\\\-2.489212\\\\153.9199\\\\277.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"52\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n"; +const char* k_rtStruct_json06 = +" \"Value\" : \"-5.041041\\\\149.9199\\\\280.01\\\\-6.018211\\\\152.9199\\\\280.01\\\\-6.511849\\\\155.9199\\\\280.01\\\\-6.502212\\\\158.9199\\\\280.01\\\\-5.99526\\\\161.9199\\\\280.01\\\\-5.006773\\\\164.9199\\\\280.01\\\\-4.038581\\\\166.9199\\\\280.01\\\\-3.442042\\\\167.9199\\\\280.01\\\\-2.039212\\\\169.9199\\\\280.01\\\\-1.135438\\\\170.9199\\\\280.01\\\\1.135789\\\\173.1176\\\\280.01\\\\3.135788\\\\174.5681\\\\280.01\\\\6.135788\\\\176.1244\\\\280.01\\\\8.635789\\\\177.0288\\\\280.01\\\\11.13579\\\\177.5844\\\\280.01\\\\13.63579\\\\177.7594\\\\280.01\\\\16.63579\\\\177.5678\\\\280.01\\\\18.63579\\\\177.1104\\\\280.01\\\\21.63579\\\\176.0678\\\\280.01\\\\23.63579\\\\175.0686\\\\280.01\\\\25.13579\\\\174.1177\\\\280.01\\\\27.63579\\\\172.1109\\\\280.01\\\\29.24222\\\\170.4199\\\\280.01\\\\30.74459\\\\168.4199\\\\280.01\\\\31.88371\\\\166.4199\\\\280.01\\\\32.81119\\\\164.4199\\\\280.01\\\\33.32179\\\\162.9199\\\\280.01\\\\33.82031\\\\160.9199\\\\280.01\\\\34.18623\\\\157.4199\\\\280.01\\\\34.07163\\\\155.9199\\\\280.01\\\\33.74713\\\\153.4199\\\\280.01\\\\32.83294\\\\150.4199\\\\280.01\\\\32.18903\\\\148.9199\\\\280.01\\\\30.80605\\\\146.4199\\\\280.01\\\\29.31239\\\\144.4199\\\\280.01\\\\28.13579\\\\143.1796\\\\280.01\\\\26.63579\\\\141.776\\\\280.01\\\\24.63579\\\\140.3194\\\\280.01\\\\23.63579\\\\139.7211\\\\280.01\\\\21.63579\\\\138.7252\\\\280.01\\\\19.13579\\\\137.8053\\\\280.01\\\\16.63579\\\\137.2421\\\\280.01\\\\13.63579\\\\137.0479\\\\280.01\\\\10.63579\\\\137.2928\\\\280.01\\\\8.635789\\\\137.7512\\\\280.01\\\\7.135788\\\\138.2404\\\\280.01\\\\4.635788\\\\139.3442\\\\280.01\\\\3.135788\\\\140.2151\\\\280.01\\\\1.635789\\\\141.2464\\\\280.01\\\\-0.8642115\\\\143.5646\\\\280.01\\\\-2.084666\\\\144.9199\\\\280.01\\\\-3.518559\\\\146.9199\\\\280.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"35\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-36.86421\\\\165.9127\\\\283.01\\\\-33.86421\\\\165.5801\\\\283.01\\\\-32.36421\\\\165.0618\\\\283.01\\\\-31.36421\\\\164.5518\\\\283.01\\\\-29.86421\\\\163.5032\\\\283.01\\\\-28.76573\\\\162.4199\\\\283.01\\\\-27.6906\\\\160.9199\\\\283.01\\\\-26.75524\\\\158.9199\\\\283.01\\\\-26.24242\\\\156.9199\\\\283.01\\\\-26.08132\\\\155.4199\\\\283.01\\\\-26.27046\\\\153.4199\\\\283.01\\\\-26.69974\\\\151.9199\\\\283.01\\\\-27.3034\\\\150.4199\\\\283.01\\\\-28.22451\\\\148.9199\\\\283.01\\\\-29.07254\\\\147.9199\\\\283.01\\\\-30.86421\\\\146.4123\\\\283.01\\\\-32.86421\\\\145.387\\\\283.01\\\\-34.86421\\\\144.8136\\\\283.01\\\\-36.36421\\\\144.637\\\\283.01\\\\-38.86421\\\\144.8261\\\\283.01\\\\-40.36421\\\\145.2685\\\\283.01\\\\-41.86421\\\\145.9129\\\\283.01\\\\-43.36421\\\\146.839\\\\283.01\\\\-45.00815\\\\148.4199\\\\283.01\\\\-46.03782\\\\149.9199\\\\283.01\\\\-46.92191\\\\151.9199\\\\283.01\\\\-47.13395\\\\152.9199\\\\283.01\\\\-47.39546\\\\155.4199\\\\283.01\\\\-47.01165\\\\158.4199\\\\283.01\\\\-46.47908\\\\159.9199\\\\283.01\\\\-45.95449\\\\160.9199\\\\283.01\\\\-44.36421\\\\162.8921\\\\283.01\\\\-42.36421\\\\164.4824\\\\283.01\\\\-41.36421\\\\165.0054\\\\283.01\\\\-39.86421\\\\165.5288\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"6.135788\\\\112.0556\\\\283.01\\\\8.135789\\\\113.058\\\\283.01\\\\9.635789\\\\113.5261\\\\283.01\\\\11.13579\\\\113.7211\\\\283.01\\\\13.13579\\\\113.7083\\\\283.01\\\\14.63579\\\\113.4775\\\\283.01\\\\17.13579\\\\112.4942\\\\283.01\\\\18.63579\\\\111.5302\\\\283.01\\\\20.27973\\\\109.9199\\\\283.01\\\\21.29551\\\\108.4199\\\\283.01\\\\22.15553\\\\106.4199\\\\283.01\\\\22.49763\\\\104.4199\\\\283.01\\\\22.56146\\\\102.9199\\\\283.01\\\\22.45816\\\\101.4199\\\\283.01\\\\22.20454\\\\99.91986\\\\283.01\\\\21.35107\\\\97.91986\\\\283.01\\\\20.75722\\\\96.91986\\\\283.01\\\\19.13579\\\\95.12147\\\\283.01\\\\18.13579\\\\94.30956\\\\283.01\\\\17.13579\\\\93.71847\\\\283.01\\\\15.13579\\\\92.88696\\\\283.01\\\\13.63579\\\\92.61065\\\\283.01\\\\11.63579\\\\92.5317\\\\283.01\\\\9.135789\\\\92.82371\\\\283.01\\\\7.635788\\\\93.33433\\\\283.01\\\\6.635788\\\\93.82958\\\\283.01\\\\5.135788\\\\94.8808\\\\283.01\\\\4.049851\\\\95.91986\\\\283.01\\\\2.948288\\\\97.41986\\\\283.01\\\\1.984473\\\\99.41986\\\\283.01\\\\1.529539\\\\100.9199\\\\283.01\\\\1.326578\\\\103.4199\\\\283.01\\\\1.542039\\\\105.4199\\\\283.01\\\\2.010788\\\\106.9199\\\\283.01\\\\3.000074\\\\108.9199\\\\283.01\\\\4.135788\\\\110.3525\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"60\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"9.635789\\\\134.821\\\\283.01\\\\6.635788\\\\135.7311\\\\283.01\\\\5.135788\\\\136.3564\\\\283.01\\\\3.135788\\\\137.3443\\\\283.01\\\\1.635789\\\\138.235\\\\283.01\\\\0.1357885\\\\139.3028\\\\283.01\\\\-1.698245\\\\140.9199\\\\283.01\\\\-4.057226\\\\143.4199\\\\283.01\\\\-5.492074\\\\145.4199\\\\283.01\\\\-6.94348\\\\147.9199\\\\283.01\\\\-8.519453\\\\151.4199\\\\283.01\\\\-9.020194\\\\152.9199\\\\283.01\\\\-9.438021\\\\154.9199\\\\283.01\\\\-9.607633\\\\157.4199\\\\283.01\\\\-9.515528\\\\158.9199\\\\283.01\\\\-8.990245\\\\161.4199\\\\283.01\\\\-7.952794\\\\164.4199\\\\283.01\\\\-7.072832\\\\166.4199\\\\283.01\\\\-6.031465\\\\168.4199\\\\283.01\\\\-5.07724\\\\169.9199\\\\283.01\\\\-3.571932\\\\171.9199\\\\283.01\\\\-2.141343\\\\173.4199\\\\283.01\\\\-0.3642115\\\\175.0795\\\\283.01\\\\1.635789\\\\176.5706\\\\283.01\\\\3.135788\\\\177.5459\\\\283.01\\\\5.635788\\\\178.9883\\\\283.01\\\\7.635788\\\\180.0143\\\\283.01\\\\9.135789\\\\180.633\\\\283.01\\\\12.13579\\\\181.4936\\\\283.01\\\\13.63579\\\\181.6266\\\\283.01\\\\15.13579\\\\181.5587\\\\283.01\\\\17.63579\\\\181.0121\\\\283.01\\\\20.13579\\\\179.997\\\\283.01\\\\23.63579\\\\178.0965\\\\283.01\\\\26.63579\\\\176.1115\\\\283.01\\\\28.63579\\\\174.5219\\\\283.01\\\\30.30579\\\\172.9199\\\\283.01\\\\32.35387\\\\170.4199\\\\283.01\\\\33.34441\\\\168.9199\\\\283.01\\\\34.6741\\\\166.4199\\\\283.01\\\\35.77129\\\\163.9199\\\\283.01\\\\36.76814\\\\160.9199\\\\283.01\\\\37.28946\\\\158.4199\\\\283.01\\\\37.36674\\\\156.4199\\\\283.01\\\\37.27414\\\\154.9199\\\\283.01\\\\36.83626\\\\152.9199\\\\283.01\\\\36.33173\\\\151.4199\\\\283.01\\\\35.21079\\\\148.9199\\\\283.01\\\\33.79925\\\\146.4199\\\\283.01\\\\32.80308\\\\144.9199\\\\283.01\\\\30.83086\\\\142.4199\\\\283.01\\\\29.13579\\\\140.7037\\\\283.01\\\\26.63579\\\\138.7033\\\\283.01\\\\25.13579\\\\137.7264\\\\283.01\\\\23.13579\\\\136.6915\\\\283.01\\\\21.13579\\\\135.8365\\\\283.01\\\\19.63579\\\\135.3254\\\\283.01\\\\17.63579\\\\134.7876\\\\283.01\\\\14.63579\\\\134.3352\\\\283.01\\\\12.63579\\\\134.3453\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"35\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"6\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11.63579\\\\193.3493\\\\283.01\\\\9.135789\\\\194.3455\\\\283.01\\\\7.635788\\\\195.3096\\\\283.01\\\\5.991849\\\\196.9199\\\\283.01\\\\4.976066\\\\198.4199\\\\283.01\\\\4.116052\\\\200.4199\\\\283.01\\\\3.773946\\\\202.4199\\\\283.01\\\\3.710113\\\\203.9199\\\\283.01\\\\3.81342\\\\205.4199\\\\283.01\\\\4.067039\\\\206.9199\\\\283.01\\\\4.920511\\\\208.9199\\\\283.01\\\\5.51436\\\\209.9199\\\\283.01\\\\7.135788\\\\211.7182\\\\283.01\\\\8.135789\\\\212.5302\\\\283.01\\\\9.135789\\\\213.1212\\\\283.01\\\\11.13579\\\\213.9528\\\\283.01\\\\12.63579\\\\214.2291\\\\283.01\\\\14.63579\\\\214.308\\\\283.01\\\\17.13579\\\\214.016\\\\283.01\\\\18.63579\\\\213.5054\\\\283.01\\\\19.63579\\\\213.0101\\\\283.01\\\\21.13579\\\\211.9589\\\\283.01\\\\22.22173\\\\210.9199\\\\283.01\\\\23.32329\\\\209.4199\\\\283.01\\\\24.2871\\\\207.4199\\\\283.01\\\\24.74204\\\\205.9199\\\\283.01\\\\24.945\\\\203.4199\\\\283.01\\\\24.72954\\\\201.4199\\\\283.01\\\\24.26079\\\\199.9199\\\\283.01\\\\23.2715\\\\197.9199\\\\283.01\\\\22.13579\\\\196.4872\\\\283.01\\\\20.13579\\\\194.774\\\\283.01\\\\18.13579\\\\193.7817\\\\283.01\\\\16.63579\\\\193.3109\\\\283.01\\\\14.13579\\\\193.0843\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"39\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"73.62865\\\\152.4199\\\\283.01\\\\73.25758\\\\149.9199\\\\283.01\\\\72.72131\\\\148.4199\\\\283.01\\\\72.19829\\\\147.4199\\\\283.01\\\\70.63579\\\\145.5002\\\\283.01\\\\69.13579\\\\144.2413\\\\283.01\\\\67.63579\\\\143.3861\\\\283.01\\\\66.13579\\\\142.8237\\\\283.01\\\\64.63579\\\\142.5712\\\\283.01\\\\63.13579\\\\142.4671\\\\283.01\\\\60.13579\\\\142.7724\\\\283.01\\\\58.63579\\\\143.2817\\\\283.01\\\\57.63579\\\\143.7984\\\\283.01\\\\56.13579\\\\144.8652\\\\283.01\\\\55.05246\\\\145.9199\\\\283.01\\\\53.9715\\\\147.4199\\\\283.01\\\\53.02681\\\\149.4199\\\\283.01\\\\52.51399\\\\151.4199\\\\283.01\\\\52.35289\\\\152.9199\\\\283.01\\\\52.53963\\\\154.9199\\\\283.01\\\\52.945\\\\156.4199\\\\283.01\\\\53.53444\\\\157.9199\\\\283.01\\\\54.11373\\\\158.9199\\\\283.01\\\\55.13579\\\\160.2145\\\\283.01\\\\56.13579\\\\161.186\\\\283.01\\\\57.13579\\\\161.9566\\\\283.01\\\\59.13579\\\\163.0032\\\\283.01\\\\60.63579\\\\163.4761\\\\283.01\\\\62.13579\\\\163.6955\\\\283.01\\\\64.13579\\\\163.6699\\\\283.01\\\\65.13579\\\\163.5261\\\\283.01\\\\66.63579\\\\163.0843\\\\283.01\\\\68.13579\\\\162.4546\\\\283.01\\\\69.63579\\\\161.5154\\\\283.01\\\\70.63579\\\\160.6282\\\\283.01\\\\71.68726\\\\159.4199\\\\283.01\\\\72.3094\\\\158.4199\\\\283.01\\\\73.20454\\\\156.4199\\\\283.01\\\\73.48447\\\\154.9199\\\\283.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"46\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"8\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-17.14754\\\\156.4199\\\\286.01\\\\-17.54129\\\\154.9199\\\\286.01\\\\-18.18997\\\\153.4199\\\\286.01\\\\-19.27567\\\\151.4199\\\\286.01\\\\-22.23767\\\\146.4199\\\\286.01\\\\-23.71109\\\\144.4199\\\\286.01\\\\-25.86421\\\\142.2542\\\\286.01\\\\-27.86421\\\\140.7934\\\\286.01\\\\-29.86421\\\\139.7504\\\\286.01\\\\-32.36421\\\\138.8496\\\\286.01\\\\-34.86421\\\\138.3014\\\\286.01\\\\-37.86421\\\\138.2204\\\\286.01\\\\-38.86421\\\\138.315\\\\286.01\\\\-40.86421\\\\138.7523\\\\286.01\\\\-42.36421\\\\139.2324\\\\286.01\\\\-44.86421\\\\140.3181\\\\286.01\\\\-46.36421\\\\141.2324\\\\286.01\\\\-48.36421\\\\142.7916\\\\286.01\\\\-49.47421\\\\143.9199\\\\286.01\\\\-51.016\\\\145.9199\\\\286.01\\\\-51.87383\\\\147.4199\\\\286.01\\\\-52.97685\\\\149.9199\\\\286.01\\\\-53.49453\\\\151.9199\\\\286.01\\\\-53.73249\\\\155.4199\\\\286.01\\\\-53.47443\\\\158.9199\\\\286.01\\\\-52.93605\\\\160.9199\\\\286.01\\\\-52.55032\\\\161.9199\\\\286.01\\\\-51.54154\\\\163.9199\\\\286.01\\\\-50.53799\\\\165.4199\\\\286.01\\\\-49.36421\\\\166.7567\\\\286.01\\\\-46.86421\\\\169.0795\\\\286.01\\\\-45.36421\\\\170.0664\\\\286.01\\\\-43.36421\\\\171.06\\\\286.01\\\\-41.86421\\\\171.5856\\\\286.01\\\\-39.86421\\\\172.0751\\\\286.01\\\\-36.86421\\\\172.2774\\\\286.01\\\\-33.36421\\\\172.0395\\\\286.01\\\\-31.36421\\\\171.5115\\\\286.01\\\\-30.36421\\\\171.1171\\\\286.01\\\\-28.36421\\\\170.1204\\\\286.01\\\\-26.86421\\\\169.1277\\\\286.01\\\\-25.43843\\\\167.9199\\\\286.01\\\\-24.36421\\\\166.8613\\\\286.01\\\\-22.68564\\\\164.9199\\\\286.01\\\\-20.18366\\\\161.4199\\\\286.01\\\\-18.24384\\\\158.4199\\\\286.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"143\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"9\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-14.57135\\\\153.4199\\\\286.01\\\\-15.49516\\\\155.4199\\\\286.01\\\\-15.75707\\\\156.4199\\\\286.01\\\\-15.78467\\\\157.4199\\\\286.01\\\\-15.0439\\\\158.9199\\\\286.01\\\\-14.02238\\\\160.4199\\\\286.01\\\\-11.75342\\\\163.4199\\\\286.01\\\\-10.05119\\\\165.9199\\\\286.01\\\\-9.266294\\\\166.9199\\\\286.01\\\\-6.534666\\\\170.9199\\\\286.01\\\\-4.989212\\\\172.9199\\\\286.01\\\\-2.364212\\\\175.6552\\\\286.01\\\\0.6357885\\\\178.3645\\\\286.01\\\\3.162897\\\\180.9199\\\\286.01\\\\4.831301\\\\182.9199\\\\286.01\\\\5.793481\\\\184.4199\\\\286.01\\\\6.209064\\\\185.4199\\\\286.01\\\\6.251529\\\\186.4199\\\\286.01\\\\5.84561\\\\187.4199\\\\286.01\\\\5.229538\\\\188.4199\\\\286.01\\\\3.904728\\\\189.9199\\\\286.01\\\\1.509165\\\\192.4199\\\\286.01\\\\-0.01421149\\\\194.4199\\\\286.01\\\\-1.566989\\\\197.4199\\\\286.01\\\\-1.955878\\\\198.4199\\\\286.01\\\\-2.473254\\\\200.4199\\\\286.01\\\\-2.691339\\\\203.4199\\\\286.01\\\\-2.664743\\\\204.9199\\\\286.01\\\\-2.487896\\\\206.9199\\\\286.01\\\\-1.985179\\\\208.9199\\\\286.01\\\\-0.9445686\\\\211.4199\\\\286.01\\\\-0.07303502\\\\212.9199\\\\286.01\\\\0.9783811\\\\214.4199\\\\286.01\\\\1.885789\\\\215.4199\\\\286.01\\\\3.635788\\\\217.0773\\\\286.01\\\\5.135788\\\\218.1228\\\\286.01\\\\6.635788\\\\218.9891\\\\286.01\\\\9.135789\\\\220.027\\\\286.01\\\\11.13579\\\\220.5289\\\\286.01\\\\14.13579\\\\220.731\\\\286.01\\\\17.13579\\\\220.5555\\\\286.01\\\\19.13579\\\\220.0785\\\\286.01\\\\20.63579\\\\219.56\\\\286.01\\\\22.63579\\\\218.5779\\\\286.01\\\\24.13579\\\\217.5997\\\\286.01\\\\26.63579\\\\215.3391\\\\286.01\\\\28.25469\\\\213.4199\\\\286.01\\\\29.69829\\\\210.9199\\\\286.01\\\\30.32329\\\\209.4199\\\\286.01\\\\30.81052\\\\207.9199\\\\286.01\\\\31.25947\\\\205.9199\\\\286.01\\\\31.36474\\\\202.9199\\\\286.01\\\\31.25015\\\\201.4199\\\\286.01\\\\30.79802\\\\199.4199\\\\286.01\\\\30.30698\\\\197.9199\\\\286.01\\\\29.65141\\\\196.4199\\\\286.01\\\\28.84218\\\\194.9199\\\\286.01\\\\27.82176\\\\193.4199\\\\286.01\\\\26.13579\\\\191.552\\\\286.01\\\\23.59412\\\\188.9199\\\\286.01\\\\22.45183\\\\187.4199\\\\286.01\\\\21.87136\\\\185.9199\\\\286.01\\\\22.07775\\\\184.9199\\\\286.01\\\\22.51447\\\\183.9199\\\\286.01\\\\23.47013\\\\182.4199\\\\286.01\\\\25.57\\\\179.9199\\\\286.01\\\\27.5517\\\\177.9199\\\\286.01\\\\30.13579\\\\175.5383\\\\286.01\\\\32.1768\\\\173.4199\\\\286.01\\\\33.78976\\\\171.4199\\\\286.01\\\\35.44261\\\\168.9199\\\\286.01\\\\37.52156\\\\165.9199\\\\286.01\\\\40.48853\\\\161.9199\\\\286.01\\\\42.13579\\\\160.0113\\\\286.01\\\\43.13579\\\\159.0058\\\\286.01\\\\44.13579\\\\158.355\\\\286.01\\\\45.63579\\\\159.3214\\\\286.01\\\\47.13579\\\\160.8254\\\\286.01\\\\48.51277\\\\162.4199\\\\286.01\\\\50.37894\\\\164.4199\\\\286.01\\\\52.63579\\\\166.5075\\\\286.01\\\\54.13579\\\\167.5623\\\\286.01\\\\57.13579\\\\169.0584\\\\286.01\\\\58.63579\\\\169.5623\\\\286.01\\\\60.63579\\\\170.0095\\\\286.01\\\\62.13579\\\\170.1383\\\\286.01\\\\65.13579\\\\170.0383\\\\286.01\\\\67.13579\\\\169.5946\\\\286.01\\\\68.63579\\\\169.1182\\\\286.01\\\\71.13579\\\\168.0377\\\\286.01\\\\72.63579\\\\167.1193\\\\286.01\\\\74.63579\\\\165.5595\\\\286.01\\\\75.7575\\\\164.4199\\\\286.01\\\\77.29167\\\\162.4199\\\\286.01\\\\78.15794\\\\160.9199\\\\286.01\\\\79.25264\\\\158.4199\\\\286.01\\\\79.77\\\\156.4199\\\\286.01\\\\80.00407\\\\152.9199\\\\286.01\\\\79.79632\\\\149.9199\\\\286.01\\\\79.30515\\\\147.9199\\\\286.01\\\\78.7759\\\\146.4199\\\\286.01\\\\77.78234\\\\144.4199\\\\286.01\\\\76.78518\\\\142.9199\\\\286.01\\\\75.44829\\\\141.4199\\\\286.01\\\\73.63579\\\\139.7192\\\\286.01\\\\71.63579\\\\138.3489\\\\286.01\\\\69.63579\\\\137.3365\\\\286.01\\\\68.13579\\\\136.7758\\\\286.01\\\\66.13579\\\\136.2751\\\\286.01\\\\62.63579\\\\136.0838\\\\286.01\\\\59.63579\\\\136.315\\\\286.01\\\\57.63579\\\\136.8432\\\\286.01\\\\56.63579\\\\137.2282\\\\286.01\\\\54.63579\\\\138.2251\\\\286.01\\\\53.13579\\\\139.2217\\\\286.01\\\\51.73048\\\\140.4199\\\\286.01\\\\50.63579\\\\141.5006\\\\286.01\\\\49.01391\\\\143.4199\\\\286.01\\\\45.63579\\\\148.6563\\\\286.01\\\\44.13579\\\\150.5612\\\\286.01\\\\43.13579\\\\151.2219\\\\286.01\\\\42.63579\\\\151.0217\\\\286.01\\\\40.13579\\\\149.1523\\\\286.01\\\\35.63579\\\\144.8964\\\\286.01\\\\31.34298\\\\140.4199\\\\286.01\\\\29.63579\\\\138.8365\\\\286.01\\\\27.63579\\\\137.2758\\\\286.01\\\\26.13579\\\\136.2875\\\\286.01\\\\21.63579\\\\133.7337\\\\286.01\\\\18.63579\\\\132.2451\\\\286.01\\\\16.13579\\\\131.3449\\\\286.01\\\\14.13579\\\\130.8667\\\\286.01\\\\12.63579\\\\130.8597\\\\286.01\\\\10.63579\\\\131.2148\\\\286.01\\\\9.135789\\\\131.787\\\\286.01\\\\7.135788\\\\132.7495\\\\286.01\\\\3.635788\\\\134.8391\\\\286.01\\\\0.6357885\\\\136.7923\\\\286.01\\\\-1.364211\\\\138.2802\\\\286.01\\\\-3.166659\\\\139.9199\\\\286.01\\\\-5.078728\\\\141.9199\\\\286.01\\\\-8.743597\\\\146.4199\\\\286.01\\\\-10.50432\\\\148.4199\\\\286.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"50\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"26.28579\\\\112.4199\\\\286.01\\\\27.83857\\\\109.4199\\\\286.01\\\\28.22746\\\\108.4199\\\\286.01\\\\28.74483\\\\106.4199\\\\286.01\\\\28.96292\\\\103.4199\\\\286.01\\\\28.93632\\\\101.9199\\\\286.01\\\\28.75947\\\\99.91986\\\\286.01\\\\28.25676\\\\97.91986\\\\286.01\\\\27.21615\\\\95.41986\\\\286.01\\\\26.34461\\\\93.91986\\\\286.01\\\\25.2932\\\\92.41986\\\\286.01\\\\24.38579\\\\91.41986\\\\286.01\\\\22.63579\\\\89.76245\\\\286.01\\\\21.13579\\\\88.71692\\\\286.01\\\\19.63579\\\\87.85058\\\\286.01\\\\17.13579\\\\86.81271\\\\286.01\\\\15.13579\\\\86.31081\\\\286.01\\\\12.13579\\\\86.10869\\\\286.01\\\\9.135789\\\\86.28422\\\\286.01\\\\7.135788\\\\86.76125\\\\286.01\\\\5.635788\\\\87.27975\\\\286.01\\\\3.635788\\\\88.26181\\\\286.01\\\\2.135788\\\\89.23998\\\\286.01\\\\-0.3642115\\\\91.50063\\\\286.01\\\\-1.983114\\\\93.41986\\\\286.01\\\\-3.426712\\\\95.91986\\\\286.01\\\\-4.051712\\\\97.41986\\\\286.01\\\\-4.538943\\\\98.91986\\\\286.01\\\\-4.987895\\\\100.9199\\\\286.01\\\\-5.093159\\\\103.9199\\\\286.01\\\\-4.978573\\\\105.4199\\\\286.01\\\\-4.526445\\\\107.4199\\\\286.01\\\\-4.035407\\\\108.9199\\\\286.01\\\\-3.379837\\\\110.4199\\\\286.01\\\\-2.570607\\\\111.9199\\\\286.01\\\\-1.120541\\\\113.9199\\\\286.01\\\\-0.1875448\\\\114.9199\\\\286.01\\\\1.635789\\\\116.6058\\\\286.01\\\\3.135788\\\\117.6287\\\\286.01\\\\4.635788\\\\118.4723\\\\286.01\\\\7.135788\\\\119.5478\\\\286.01\\\\8.635789\\\\120.032\\\\286.01\\\\11.13579\\\\120.4815\\\\286.01\\\\13.63579\\\\120.4539\\\\286.01\\\\15.63579\\\\120.0365\\\\286.01\\\\17.13579\\\\119.5128\\\\286.01\\\\20.13579\\\\118.0816\\\\286.01\\\\21.63579\\\\117.1312\\\\286.01\\\\23.63579\\\\115.5595\\\\286.01\\\\24.74579\\\\114.4199\\\\286.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"245\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-24.36421\\\\171.6106\\\\289.01\\\\-19.86421\\\\167.7245\\\\289.01\\\\-18.36421\\\\166.7742\\\\289.01\\\\-16.86421\\\\166.2171\\\\289.01\\\\-15.86421\\\\166.136\\\\289.01\\\\-14.86421\\\\166.3039\\\\289.01\\\\-12.86421\\\\167.2141\\\\289.01\\\\-11.36421\\\\168.2115\\\\289.01\\\\-8.864211\\\\170.4133\\\\289.01\\\\-7.364212\\\\172.015\\\\289.01\\\\-3.364212\\\\176.4838\\\\289.01\\\\-1.698104\\\\178.4199\\\\289.01\\\\-0.6444128\\\\179.9199\\\\289.01\\\\0.2081026\\\\181.4199\\\\289.01\\\\0.8369604\\\\182.9199\\\\289.01\\\\1.181462\\\\184.4199\\\\289.01\\\\1.159226\\\\185.4199\\\\289.01\\\\0.7715028\\\\186.9199\\\\289.01\\\\0.3016764\\\\187.9199\\\\289.01\\\\-0.6509087\\\\189.4199\\\\289.01\\\\-2.53016\\\\191.9199\\\\289.01\\\\-3.495677\\\\193.4199\\\\289.01\\\\-4.539615\\\\195.4199\\\\289.01\\\\-5.487195\\\\197.9199\\\\289.01\\\\-6.045509\\\\200.4199\\\\289.01\\\\-6.221633\\\\203.9199\\\\289.01\\\\-5.981275\\\\207.4199\\\\289.01\\\\-5.507912\\\\209.4199\\\\289.01\\\\-4.566212\\\\211.9199\\\\289.01\\\\-3.55636\\\\213.9199\\\\289.01\\\\-2.941314\\\\214.9199\\\\289.01\\\\-1.4598\\\\216.9199\\\\289.01\\\\0.1357885\\\\218.6212\\\\289.01\\\\1.135789\\\\219.5154\\\\289.01\\\\3.135788\\\\220.9883\\\\289.01\\\\4.135788\\\\221.6079\\\\289.01\\\\6.135788\\\\222.6179\\\\289.01\\\\8.635789\\\\223.5528\\\\289.01\\\\11.13579\\\\224.0987\\\\289.01\\\\14.13579\\\\224.2564\\\\289.01\\\\17.63579\\\\224.0546\\\\289.01\\\\19.63579\\\\223.5962\\\\289.01\\\\21.13579\\\\223.1108\\\\289.01\\\\23.63579\\\\222.0024\\\\289.01\\\\25.13579\\\\221.1236\\\\289.01\\\\26.63579\\\\220.0783\\\\289.01\\\\29.13579\\\\217.7342\\\\289.01\\\\30.33269\\\\216.4199\\\\289.01\\\\31.75305\\\\214.4199\\\\289.01\\\\33.30979\\\\211.4199\\\\289.01\\\\34.3199\\\\208.4199\\\\289.01\\\\34.75285\\\\206.4199\\\\289.01\\\\34.88579\\\\204.9199\\\\289.01\\\\34.88197\\\\202.4199\\\\289.01\\\\34.74179\\\\200.9199\\\\289.01\\\\34.31215\\\\198.9199\\\\289.01\\\\33.2965\\\\195.9199\\\\289.01\\\\32.31141\\\\193.9199\\\\289.01\\\\30.31499\\\\190.9199\\\\289.01\\\\29.46377\\\\189.9199\\\\289.01\\\\28.09009\\\\187.9199\\\\289.01\\\\27.5465\\\\186.9199\\\\289.01\\\\27.02657\\\\185.4199\\\\289.01\\\\26.95302\\\\183.9199\\\\289.01\\\\27.49712\\\\181.9199\\\\289.01\\\\28.4963\\\\179.9199\\\\289.01\\\\29.48924\\\\178.4199\\\\289.01\\\\31.52524\\\\175.9199\\\\289.01\\\\33.74527\\\\173.4199\\\\289.01\\\\35.40354\\\\171.4199\\\\289.01\\\\37.13579\\\\169.6051\\\\289.01\\\\39.13579\\\\167.7864\\\\289.01\\\\40.63579\\\\166.7655\\\\289.01\\\\41.63579\\\\166.2524\\\\289.01\\\\43.13579\\\\165.754\\\\289.01\\\\44.63579\\\\165.7558\\\\289.01\\\\46.13579\\\\166.2658\\\\289.01\\\\47.13579\\\\166.7949\\\\289.01\\\\48.63579\\\\167.8024\\\\289.01\\\\51.63579\\\\170.0929\\\\289.01\\\\53.13579\\\\171.0158\\\\289.01\\\\55.13579\\\\172.0168\\\\289.01\\\\58.13579\\\\173.0807\\\\289.01\\\\60.13579\\\\173.508\\\\289.01\\\\63.13579\\\\173.6928\\\\289.01\\\\65.63579\\\\173.5299\\\\289.01\\\\67.63579\\\\173.1064\\\\289.01\\\\69.63579\\\\172.491\\\\289.01\\\\71.63579\\\\171.6557\\\\289.01\\\\73.63579\\\\170.6136\\\\289.01\\\\75.13579\\\\169.622\\\\289.01\\\\77.13579\\\\167.9501\\\\289.01\\\\78.14953\\\\166.9199\\\\289.01\\\\79.80318\\\\164.9199\\\\289.01\\\\80.78197\\\\163.4199\\\\289.01\\\\81.81926\\\\161.4199\\\\289.01\\\\82.77949\\\\158.9199\\\\289.01\\\\83.26665\\\\156.9199\\\\289.01\\\\83.42233\\\\155.4199\\\\289.01\\\\83.54694\\\\152.9199\\\\289.01\\\\83.298\\\\149.4199\\\\289.01\\\\82.82378\\\\147.4199\\\\289.01\\\\82.33067\\\\145.9199\\\\289.01\\\\81.20625\\\\143.4199\\\\289.01\\\\80.32435\\\\141.9199\\\\289.01\\\\78.83173\\\\139.9199\\\\289.01\\\\77.63579\\\\138.6628\\\\289.01\\\\76.13579\\\\137.254\\\\289.01\\\\74.13579\\\\135.7893\\\\289.01\\\\73.13579\\\\135.2029\\\\289.01\\\\70.13579\\\\133.7565\\\\289.01\\\\68.63579\\\\133.2538\\\\289.01\\\\66.63579\\\\132.7745\\\\289.01\\\\63.13579\\\\132.5449\\\\289.01\\\\59.63579\\\\132.7386\\\\289.01\\\\57.13579\\\\133.3031\\\\289.01\\\\55.63579\\\\133.8401\\\\289.01\\\\53.63579\\\\134.7649\\\\289.01\\\\50.63579\\\\136.7378\\\\289.01\\\\48.79829\\\\138.4199\\\\289.01\\\\45.63579\\\\141.6464\\\\289.01\\\\44.63579\\\\142.51\\\\289.01\\\\42.63579\\\\143.6619\\\\289.01\\\\41.13579\\\\144.0638\\\\289.01\\\\40.13579\\\\143.9958\\\\289.01\\\\38.63579\\\\143.6008\\\\289.01\\\\35.63579\\\\142.1031\\\\289.01\\\\34.13579\\\\141.0644\\\\289.01\\\\29.63579\\\\137.31\\\\289.01\\\\26.63579\\\\135.0555\\\\289.01\\\\23.55246\\\\132.4199\\\\289.01\\\\22.0726\\\\130.9199\\\\289.01\\\\20.46226\\\\128.9199\\\\289.01\\\\19.39348\\\\126.9199\\\\289.01\\\\19.14968\\\\125.9199\\\\289.01\\\\19.44511\\\\124.9199\\\\289.01\\\\19.99907\\\\123.9199\\\\289.01\\\\20.82414\\\\122.9199\\\\289.01\\\\22.27133\\\\121.4199\\\\289.01\\\\26.13579\\\\117.9661\\\\289.01\\\\27.14412\\\\116.9199\\\\289.01\\\\28.79449\\\\114.9199\\\\289.01\\\\29.76725\\\\113.4199\\\\289.01\\\\30.81119\\\\111.4199\\\\289.01\\\\31.75877\\\\108.9199\\\\289.01\\\\32.31709\\\\106.4199\\\\289.01\\\\32.49321\\\\102.9199\\\\289.01\\\\32.25285\\\\99.41986\\\\289.01\\\\31.77949\\\\97.41986\\\\289.01\\\\30.83779\\\\94.91986\\\\289.01\\\\29.82794\\\\92.91986\\\\289.01\\\\29.21289\\\\91.91986\\\\289.01\\\\27.73138\\\\89.91986\\\\289.01\\\\26.13579\\\\88.21847\\\\289.01\\\\25.13579\\\\87.32427\\\\289.01\\\\23.13579\\\\85.85146\\\\289.01\\\\22.13579\\\\85.23184\\\\289.01\\\\20.13579\\\\84.22186\\\\289.01\\\\17.63579\\\\83.28586\\\\289.01\\\\15.63579\\\\82.81703\\\\289.01\\\\14.13579\\\\82.65841\\\\289.01\\\\12.13579\\\\82.58332\\\\289.01\\\\8.635789\\\\82.78226\\\\289.01\\\\6.635788\\\\83.2435\\\\289.01\\\\5.135788\\\\83.72891\\\\289.01\\\\2.635788\\\\84.83727\\\\289.01\\\\1.135789\\\\85.71608\\\\289.01\\\\-0.3642115\\\\86.76138\\\\289.01\\\\-2.864212\\\\89.1055\\\\289.01\\\\-4.061114\\\\90.41986\\\\289.01\\\\-5.481468\\\\92.41986\\\\289.01\\\\-7.038211\\\\95.41986\\\\289.01\\\\-8.04832\\\\98.41986\\\\289.01\\\\-8.481275\\\\100.4199\\\\289.01\\\\-8.614211\\\\101.9199\\\\289.01\\\\-8.610394\\\\104.4199\\\\289.01\\\\-8.470211\\\\105.9199\\\\289.01\\\\-8.040568\\\\107.9199\\\\289.01\\\\-7.024926\\\\110.9199\\\\289.01\\\\-6.039831\\\\112.9199\\\\289.01\\\\-5.436641\\\\113.9199\\\\289.01\\\\-4.016484\\\\115.9199\\\\289.01\\\\-2.364212\\\\117.6864\\\\289.01\\\\-0.8642115\\\\119.0858\\\\289.01\\\\2.635788\\\\121.7363\\\\289.01\\\\4.936513\\\\123.9199\\\\289.01\\\\5.739955\\\\124.9199\\\\289.01\\\\6.243547\\\\125.9199\\\\289.01\\\\6.389576\\\\126.9199\\\\289.01\\\\5.898776\\\\128.4199\\\\289.01\\\\5.36544\\\\129.4199\\\\289.01\\\\4.344122\\\\130.9199\\\\289.01\\\\2.635788\\\\132.901\\\\289.01\\\\0.6357885\\\\134.9343\\\\289.01\\\\-3.291989\\\\138.4199\\\\289.01\\\\-6.454596\\\\141.4199\\\\289.01\\\\-8.364211\\\\143.1276\\\\289.01\\\\-10.36421\\\\144.5659\\\\289.01\\\\-12.36421\\\\145.6168\\\\289.01\\\\-13.86421\\\\146.1154\\\\289.01\\\\-14.86421\\\\146.2075\\\\289.01\\\\-15.86421\\\\146.0664\\\\289.01\\\\-17.86421\\\\145.0818\\\\289.01\\\\-19.36421\\\\143.7907\\\\289.01\\\\-22.36421\\\\140.7383\\\\289.01\\\\-23.36421\\\\139.8224\\\\289.01\\\\-25.36421\\\\138.2655\\\\289.01\\\\-27.86421\\\\136.8177\\\\289.01\\\\-30.36421\\\\135.775\\\\289.01\\\\-31.86421\\\\135.3379\\\\289.01\\\\-34.36421\\\\134.8099\\\\289.01\\\\-36.36421\\\\134.6622\\\\289.01\\\\-39.36421\\\\134.8203\\\\289.01\\\\-41.36421\\\\135.2396\\\\289.01\\\\-44.36421\\\\136.2353\\\\289.01\\\\-47.36421\\\\137.7303\\\\289.01\\\\-48.86421\\\\138.7237\\\\289.01\\\\-50.31903\\\\139.9199\\\\289.01\\\\-51.86699\\\\141.4199\\\\289.01\\\\-53.52726\\\\143.4199\\\\289.01\\\\-54.5031\\\\144.9199\\\\289.01\\\\-55.54621\\\\146.9199\\\\289.01\\\\-56.50508\\\\149.4199\\\\289.01\\\\-56.99216\\\\151.4199\\\\289.01\\\\-57.2638\\\\154.9199\\\\289.01\\\\-57.13921\\\\157.9199\\\\289.01\\\\-56.96703\\\\159.4199\\\\289.01\\\\-56.47692\\\\161.4199\\\\289.01\\\\-55.93595\\\\162.9199\\\\289.01\\\\-55.00497\\\\164.9199\\\\289.01\\\\-54.08002\\\\166.4199\\\\289.01\\\\-53.01329\\\\167.9199\\\\289.01\\\\-51.64692\\\\169.4199\\\\289.01\\\\-49.36421\\\\171.5437\\\\289.01\\\\-47.86421\\\\172.6127\\\\289.01\\\\-46.36421\\\\173.4903\\\\289.01\\\\-43.86421\\\\174.6123\\\\289.01\\\\-42.36421\\\\175.104\\\\289.01\\\\-40.36421\\\\175.5783\\\\289.01\\\\-36.86421\\\\175.813\\\\289.01\\\\-34.36421\\\\175.6949\\\\289.01\\\\-32.86421\\\\175.5299\\\\289.01\\\\-30.86421\\\\175.0428\\\\289.01\\\\-29.36421\\\\174.5075\\\\289.01\\\\-27.36421\\\\173.5845\\\\289.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"237\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"12\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-50.86421\\\\137.2415\\\\292.01\\\\-53.36421\\\\139.566\\\\292.01\\\\-54.99971\\\\141.4199\\\\292.01\\\\-56.06249\\\\142.9199\\\\292.01\\\\-57.48386\\\\145.4199\\\\292.01\\\\-58.5421\\\\147.9199\\\\292.01\\\\-59.00731\\\\149.4199\\\\292.01\\\\-59.52402\\\\151.9199\\\\292.01\\\\-59.68875\\\\155.4199\\\\292.01\\\\-59.50454\\\\158.9199\\\\292.01\\\\-58.98414\\\\161.4199\\\\292.01\\\\-58.51487\\\\162.9199\\\\292.01\\\\-57.42337\\\\165.4199\\\\292.01\\\\-55.9553\\\\167.9199\\\\292.01\\\\-54.43354\\\\169.9199\\\\292.01\\\\-53.06614\\\\171.4199\\\\292.01\\\\-51.36421\\\\172.969\\\\292.01\\\\-49.86421\\\\174.1299\\\\292.01\\\\-48.36421\\\\175.1141\\\\292.01\\\\-45.36421\\\\176.6118\\\\292.01\\\\-42.36421\\\\177.607\\\\292.01\\\\-39.86421\\\\178.0984\\\\292.01\\\\-36.86421\\\\178.2351\\\\292.01\\\\-33.36421\\\\178.0634\\\\292.01\\\\-30.86421\\\\177.5482\\\\292.01\\\\-29.36421\\\\177.0816\\\\292.01\\\\-26.86421\\\\176.0001\\\\292.01\\\\-24.36421\\\\174.5449\\\\292.01\\\\-22.36421\\\\173.0784\\\\292.01\\\\-21.36421\\\\172.2305\\\\292.01\\\\-19.36421\\\\170.8463\\\\292.01\\\\-18.36421\\\\170.289\\\\292.01\\\\-16.86421\\\\169.7166\\\\292.01\\\\-15.36421\\\\169.4899\\\\292.01\\\\-13.36421\\\\169.7316\\\\292.01\\\\-10.86421\\\\170.7901\\\\292.01\\\\-9.364211\\\\171.7313\\\\292.01\\\\-7.874132\\\\172.9199\\\\292.01\\\\-5.819569\\\\174.9199\\\\292.01\\\\-4.197077\\\\176.9199\\\\292.01\\\\-3.215368\\\\178.4199\\\\292.01\\\\-2.222842\\\\180.4199\\\\292.01\\\\-1.726866\\\\181.9199\\\\292.01\\\\-1.545029\\\\183.9199\\\\292.01\\\\-1.7261\\\\185.4199\\\\292.01\\\\-2.267621\\\\186.9199\\\\292.01\\\\-3.670156\\\\189.4199\\\\292.01\\\\-5.063191\\\\191.4199\\\\292.01\\\\-6.47314\\\\193.9199\\\\292.01\\\\-7.528172\\\\196.4199\\\\292.01\\\\-7.99005\\\\197.9199\\\\292.01\\\\-8.496565\\\\200.4199\\\\292.01\\\\-8.660795\\\\203.9199\\\\292.01\\\\-8.561417\\\\206.4199\\\\292.01\\\\-8.006369\\\\209.4199\\\\292.01\\\\-6.968822\\\\212.4199\\\\292.01\\\\-6.01766\\\\214.4199\\\\292.01\\\\-4.087803\\\\217.4199\\\\292.01\\\\-1.925022\\\\219.9199\\\\292.01\\\\0.6357885\\\\222.1419\\\\292.01\\\\3.635788\\\\224.0674\\\\292.01\\\\5.635788\\\\225.0181\\\\292.01\\\\8.635789\\\\226.0507\\\\292.01\\\\11.63579\\\\226.6077\\\\292.01\\\\14.13579\\\\226.7023\\\\292.01\\\\17.13579\\\\226.5765\\\\292.01\\\\19.63579\\\\226.0975\\\\292.01\\\\21.63579\\\\225.4732\\\\292.01\\\\23.63579\\\\224.6535\\\\292.01\\\\25.63579\\\\223.6229\\\\292.01\\\\26.63579\\\\222.9888\\\\292.01\\\\28.63579\\\\221.508\\\\292.01\\\\30.13579\\\\220.1511\\\\292.01\\\\31.76374\\\\218.4199\\\\292.01\\\\33.28978\\\\216.4199\\\\292.01\\\\34.22413\\\\214.9199\\\\292.01\\\\35.26341\\\\212.9199\\\\292.01\\\\36.23893\\\\210.4199\\\\292.01\\\\36.81548\\\\208.4199\\\\292.01\\\\37.31635\\\\205.4199\\\\292.01\\\\37.31125\\\\201.9199\\\\292.01\\\\36.80509\\\\198.9199\\\\292.01\\\\36.21972\\\\196.9199\\\\292.01\\\\35.23758\\\\194.4199\\\\292.01\\\\34.185\\\\192.4199\\\\292.01\\\\33.25797\\\\190.9199\\\\292.01\\\\31.47586\\\\188.4199\\\\292.01\\\\30.39613\\\\186.4199\\\\292.01\\\\29.98475\\\\185.4199\\\\292.01\\\\29.70282\\\\183.9199\\\\292.01\\\\29.65647\\\\182.9199\\\\292.01\\\\30.01312\\\\180.9199\\\\292.01\\\\30.59115\\\\179.4199\\\\292.01\\\\31.96314\\\\176.9199\\\\292.01\\\\33.04444\\\\175.4199\\\\292.01\\\\34.63579\\\\173.6154\\\\292.01\\\\36.13579\\\\172.1795\\\\292.01\\\\37.13579\\\\171.3688\\\\292.01\\\\39.63579\\\\169.8149\\\\292.01\\\\41.13579\\\\169.2102\\\\292.01\\\\42.63579\\\\168.8687\\\\292.01\\\\43.63579\\\\168.8372\\\\292.01\\\\45.63579\\\\169.3281\\\\292.01\\\\47.63579\\\\170.2854\\\\292.01\\\\51.13579\\\\172.6065\\\\292.01\\\\53.63579\\\\173.9453\\\\292.01\\\\55.13579\\\\174.6138\\\\292.01\\\\58.13579\\\\175.5708\\\\292.01\\\\61.13579\\\\176.0839\\\\292.01\\\\64.63579\\\\176.0973\\\\292.01\\\\67.63579\\\\175.5995\\\\292.01\\\\69.63579\\\\175.0346\\\\292.01\\\\72.13579\\\\174.0871\\\\292.01\\\\74.13579\\\\173.0916\\\\292.01\\\\77.13579\\\\171.1028\\\\292.01\\\\79.63579\\\\168.7767\\\\292.01\\\\81.27783\\\\166.9199\\\\292.01\\\\82.33613\\\\165.4199\\\\292.01\\\\83.23394\\\\163.9199\\\\292.01\\\\84.21426\\\\161.9199\\\\292.01\\\\84.81573\\\\160.4199\\\\292.01\\\\85.28121\\\\158.9199\\\\292.01\\\\85.79774\\\\156.4199\\\\292.01\\\\85.96235\\\\152.9199\\\\292.01\\\\85.82057\\\\149.9199\\\\292.01\\\\85.32604\\\\147.4199\\\\292.01\\\\84.3297\\\\144.4199\\\\292.01\\\\82.82874\\\\141.4199\\\\292.01\\\\81.84238\\\\139.9199\\\\292.01\\\\79.77893\\\\137.4199\\\\292.01\\\\78.13579\\\\135.8536\\\\292.01\\\\76.13579\\\\134.271\\\\292.01\\\\73.63579\\\\132.7315\\\\292.01\\\\71.63579\\\\131.7812\\\\292.01\\\\68.63579\\\\130.7527\\\\292.01\\\\66.13579\\\\130.2516\\\\292.01\\\\63.13579\\\\130.112\\\\292.01\\\\59.63579\\\\130.2875\\\\292.01\\\\57.13579\\\\130.7999\\\\292.01\\\\55.63579\\\\131.2636\\\\292.01\\\\53.13579\\\\132.3465\\\\292.01\\\\50.63579\\\\133.8043\\\\292.01\\\\48.63579\\\\135.3059\\\\292.01\\\\45.13579\\\\138.5364\\\\292.01\\\\43.63579\\\\139.6493\\\\292.01\\\\42.13579\\\\140.4601\\\\292.01\\\\40.13579\\\\141.0791\\\\292.01\\\\38.63579\\\\141.1097\\\\292.01\\\\36.63579\\\\140.6416\\\\292.01\\\\35.13579\\\\140.0553\\\\292.01\\\\32.63579\\\\138.6373\\\\292.01\\\\31.13579\\\\137.5738\\\\292.01\\\\29.72654\\\\136.4199\\\\292.01\\\\28.07417\\\\134.9199\\\\292.01\\\\25.91139\\\\132.4199\\\\292.01\\\\24.93418\\\\130.9199\\\\292.01\\\\24.00985\\\\128.9199\\\\292.01\\\\23.59784\\\\126.9199\\\\292.01\\\\24.00117\\\\124.9199\\\\292.01\\\\24.45341\\\\123.9199\\\\292.01\\\\25.412\\\\122.4199\\\\292.01\\\\27.1188\\\\120.4199\\\\292.01\\\\30.26747\\\\116.9199\\\\292.01\\\\31.33271\\\\115.4199\\\\292.01\\\\32.74472\\\\112.9199\\\\292.01\\\\33.80082\\\\110.4199\\\\292.01\\\\34.26079\\\\108.9199\\\\292.01\\\\34.76814\\\\106.4199\\\\292.01\\\\34.93237\\\\102.9199\\\\292.01\\\\34.83299\\\\100.4199\\\\292.01\\\\34.27795\\\\97.41986\\\\292.01\\\\33.2404\\\\94.41986\\\\292.01\\\\32.28924\\\\92.41986\\\\292.01\\\\30.35938\\\\89.41986\\\\292.01\\\\28.13579\\\\86.85905\\\\292.01\\\\25.63579\\\\84.69783\\\\292.01\\\\22.63579\\\\82.77126\\\\292.01\\\\20.63579\\\\81.82164\\\\292.01\\\\17.63579\\\\80.78906\\\\292.01\\\\14.63579\\\\80.23197\\\\292.01\\\\12.13579\\\\80.13745\\\\292.01\\\\9.135789\\\\80.26321\\\\292.01\\\\6.635788\\\\80.74219\\\\292.01\\\\4.635788\\\\81.36616\\\\292.01\\\\2.635788\\\\82.1862\\\\292.01\\\\0.6357885\\\\83.21684\\\\292.01\\\\-0.3642115\\\\83.85096\\\\292.01\\\\-2.364212\\\\85.33102\\\\292.01\\\\-3.864212\\\\86.68865\\\\292.01\\\\-5.492164\\\\88.41986\\\\292.01\\\\-7.018197\\\\90.41986\\\\292.01\\\\-7.953227\\\\91.91986\\\\292.01\\\\-8.991834\\\\93.91986\\\\292.01\\\\-9.966642\\\\96.41986\\\\292.01\\\\-10.5439\\\\98.41986\\\\292.01\\\\-11.04477\\\\101.4199\\\\292.01\\\\-11.03968\\\\104.9199\\\\292.01\\\\-10.53351\\\\107.9199\\\\292.01\\\\-9.947545\\\\109.9199\\\\292.01\\\\-8.965997\\\\112.4199\\\\292.01\\\\-7.913424\\\\114.4199\\\\292.01\\\\-6.97299\\\\115.9199\\\\292.01\\\\-5.421904\\\\117.9199\\\\292.01\\\\-3.864212\\\\119.5885\\\\292.01\\\\-1.366711\\\\121.9199\\\\292.01\\\\-0.3642115\\\\123.0152\\\\292.01\\\\0.7380612\\\\124.4199\\\\292.01\\\\1.307276\\\\125.4199\\\\292.01\\\\1.837008\\\\126.9199\\\\292.01\\\\1.945404\\\\127.9199\\\\292.01\\\\1.824169\\\\129.4199\\\\292.01\\\\1.341957\\\\130.9199\\\\292.01\\\\0.3438723\\\\132.9199\\\\292.01\\\\-0.6656821\\\\134.4199\\\\292.01\\\\-2.354596\\\\136.4199\\\\292.01\\\\-3.364212\\\\137.4545\\\\292.01\\\\-6.364212\\\\140.0493\\\\292.01\\\\-7.864212\\\\141.0763\\\\292.01\\\\-9.864211\\\\142.1287\\\\292.01\\\\-11.36421\\\\142.6533\\\\292.01\\\\-12.86421\\\\142.9596\\\\292.01\\\\-13.86421\\\\142.9695\\\\292.01\\\\-15.36421\\\\142.6443\\\\292.01\\\\-16.86421\\\\142.0094\\\\292.01\\\\-18.36421\\\\141.0572\\\\292.01\\\\-20.86421\\\\138.869\\\\292.01\\\\-23.36421\\\\136.7725\\\\292.01\\\\-25.86421\\\\135.1882\\\\292.01\\\\-28.86421\\\\133.7659\\\\292.01\\\\-30.36421\\\\133.2484\\\\292.01\\\\-32.36421\\\\132.7296\\\\292.01\\\\-35.36421\\\\132.2475\\\\292.01\\\\-38.36421\\\\132.2506\\\\292.01\\\\-41.36421\\\\132.7474\\\\292.01\\\\-43.36421\\\\133.3174\\\\292.01\\\\-45.86421\\\\134.2638\\\\292.01\\\\-47.86421\\\\135.2561\\\\292.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"247\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"13\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.13579\\\\228.4295\\\\295.01\\\\18.13579\\\\228.1286\\\\295.01\\\\20.63579\\\\227.5699\\\\295.01\\\\23.63579\\\\226.5032\\\\295.01\\\\25.63579\\\\225.5385\\\\295.01\\\\27.13579\\\\224.6467\\\\295.01\\\\28.63579\\\\223.6208\\\\295.01\\\\30.63579\\\\221.9606\\\\295.01\\\\32.63579\\\\219.9176\\\\295.01\\\\34.26079\\\\217.9199\\\\295.01\\\\35.85596\\\\215.4199\\\\295.01\\\\36.86065\\\\213.4199\\\\295.01\\\\37.84481\\\\210.9199\\\\295.01\\\\38.30011\\\\209.4199\\\\295.01\\\\38.83393\\\\206.9199\\\\295.01\\\\39.02689\\\\203.9199\\\\295.01\\\\38.82799\\\\200.4199\\\\295.01\\\\38.28665\\\\197.9199\\\\295.01\\\\37.83388\\\\196.4199\\\\295.01\\\\36.84829\\\\193.9199\\\\295.01\\\\35.83665\\\\191.9199\\\\295.01\\\\34.2616\\\\189.4199\\\\295.01\\\\32.91469\\\\187.4199\\\\295.01\\\\31.91341\\\\185.4199\\\\295.01\\\\31.41753\\\\183.9199\\\\295.01\\\\31.21638\\\\182.4199\\\\295.01\\\\31.22183\\\\181.4199\\\\295.01\\\\31.4365\\\\179.9199\\\\295.01\\\\31.9365\\\\178.4199\\\\295.01\\\\32.96956\\\\176.4199\\\\295.01\\\\33.63579\\\\175.5072\\\\295.01\\\\35.13579\\\\173.8535\\\\295.01\\\\37.13579\\\\172.3393\\\\295.01\\\\39.13579\\\\171.3338\\\\295.01\\\\41.13579\\\\170.7382\\\\295.01\\\\42.13579\\\\170.6482\\\\295.01\\\\43.63579\\\\170.7407\\\\295.01\\\\45.63579\\\\171.3626\\\\295.01\\\\47.63579\\\\172.3561\\\\295.01\\\\51.13579\\\\174.5457\\\\295.01\\\\53.13579\\\\175.5831\\\\295.01\\\\55.63579\\\\176.5908\\\\295.01\\\\57.13579\\\\177.05\\\\295.01\\\\60.13579\\\\177.6526\\\\295.01\\\\63.13579\\\\177.7993\\\\295.01\\\\66.13579\\\\177.6153\\\\295.01\\\\68.63579\\\\177.0842\\\\295.01\\\\71.63579\\\\176.1077\\\\295.01\\\\73.13579\\\\175.4511\\\\295.01\\\\75.63579\\\\174.1397\\\\295.01\\\\76.63579\\\\173.5072\\\\295.01\\\\78.63579\\\\172.0237\\\\295.01\\\\79.63579\\\\171.1478\\\\295.01\\\\81.34893\\\\169.4199\\\\295.01\\\\83.33125\\\\166.9199\\\\295.01\\\\84.85596\\\\164.4199\\\\295.01\\\\85.83382\\\\162.4199\\\\295.01\\\\86.74227\\\\159.9199\\\\295.01\\\\87.34301\\\\157.4199\\\\295.01\\\\87.67046\\\\154.4199\\\\295.01\\\\87.69308\\\\151.9199\\\\295.01\\\\87.28692\\\\148.4199\\\\295.01\\\\86.80479\\\\146.4199\\\\295.01\\\\85.72182\\\\143.4199\\\\295.01\\\\84.74316\\\\141.4199\\\\295.01\\\\83.8507\\\\139.9199\\\\295.01\\\\82.79869\\\\138.4199\\\\295.01\\\\81.13579\\\\136.4793\\\\295.01\\\\80.09653\\\\135.4199\\\\295.01\\\\78.13579\\\\133.6971\\\\295.01\\\\76.13579\\\\132.2705\\\\295.01\\\\73.63579\\\\130.872\\\\295.01\\\\71.13579\\\\129.7844\\\\295.01\\\\69.63579\\\\129.2868\\\\295.01\\\\67.13579\\\\128.7073\\\\295.01\\\\64.13579\\\\128.4028\\\\295.01\\\\62.13579\\\\128.3921\\\\295.01\\\\58.63579\\\\128.7287\\\\295.01\\\\56.13579\\\\129.3365\\\\295.01\\\\53.63579\\\\130.2527\\\\295.01\\\\50.63579\\\\131.8282\\\\295.01\\\\48.63579\\\\133.1938\\\\295.01\\\\46.13579\\\\135.2852\\\\295.01\\\\44.13579\\\\137.0396\\\\295.01\\\\42.63579\\\\138.0648\\\\295.01\\\\40.63579\\\\138.9977\\\\295.01\\\\38.63579\\\\139.4802\\\\295.01\\\\37.13579\\\\139.5112\\\\295.01\\\\35.13579\\\\139.0861\\\\295.01\\\\32.63579\\\\138.0112\\\\295.01\\\\31.13579\\\\137.0381\\\\295.01\\\\29.3328\\\\135.4199\\\\295.01\\\\28.06653\\\\133.9199\\\\295.01\\\\27.42027\\\\132.9199\\\\295.01\\\\26.43855\\\\130.9199\\\\295.01\\\\25.97402\\\\129.4199\\\\295.01\\\\25.83393\\\\127.9199\\\\295.01\\\\25.95701\\\\126.4199\\\\295.01\\\\26.43787\\\\124.9199\\\\295.01\\\\27.49988\\\\122.9199\\\\295.01\\\\28.62579\\\\121.4199\\\\295.01\\\\31.1932\\\\118.4199\\\\295.01\\\\32.32444\\\\116.9199\\\\295.01\\\\33.85028\\\\114.4199\\\\295.01\\\\34.81903\\\\112.4199\\\\295.01\\\\35.7245\\\\109.9199\\\\295.01\\\\36.32799\\\\107.4199\\\\295.01\\\\36.61153\\\\104.4199\\\\295.01\\\\36.68043\\\\102.9199\\\\295.01\\\\36.33499\\\\98.91986\\\\295.01\\\\35.74227\\\\96.41986\\\\295.01\\\\34.84829\\\\93.91986\\\\295.01\\\\33.88437\\\\91.91986\\\\295.01\\\\32.7434\\\\89.91986\\\\295.01\\\\31.31367\\\\87.91986\\\\295.01\\\\29.63579\\\\86.04859\\\\295.01\\\\27.13579\\\\83.74197\\\\295.01\\\\25.13579\\\\82.31819\\\\295.01\\\\23.13579\\\\81.17551\\\\295.01\\\\21.13579\\\\80.21014\\\\295.01\\\\18.63579\\\\79.3208\\\\295.01\\\\16.13579\\\\78.72765\\\\295.01\\\\12.13579\\\\78.41024\\\\295.01\\\\8.135789\\\\78.70996\\\\295.01\\\\5.635788\\\\79.269\\\\295.01\\\\2.635788\\\\80.33652\\\\295.01\\\\0.6357885\\\\81.29802\\\\295.01\\\\-2.364212\\\\83.21894\\\\295.01\\\\-4.364212\\\\84.87916\\\\295.01\\\\-6.364212\\\\86.92207\\\\295.01\\\\-7.991695\\\\88.91986\\\\295.01\\\\-9.58564\\\\91.41986\\\\295.01\\\\-10.58907\\\\93.41986\\\\295.01\\\\-11.57323\\\\95.91986\\\\295.01\\\\-12.02854\\\\97.41986\\\\295.01\\\\-12.56235\\\\99.91986\\\\295.01\\\\-12.75532\\\\102.9199\\\\295.01\\\\-12.55642\\\\106.4199\\\\295.01\\\\-12.01507\\\\108.9199\\\\295.01\\\\-11.5623\\\\110.4199\\\\295.01\\\\-10.57671\\\\112.9199\\\\295.01\\\\-8.962544\\\\115.9199\\\\295.01\\\\-7.569458\\\\117.9199\\\\295.01\\\\-5.366278\\\\120.4199\\\\295.01\\\\-3.364212\\\\122.4839\\\\295.01\\\\-2.140774\\\\123.9199\\\\295.01\\\\-1.179429\\\\125.4199\\\\295.01\\\\-0.712649\\\\126.4199\\\\295.01\\\\-0.2422979\\\\127.9199\\\\295.01\\\\-0.09468023\\\\129.4199\\\\295.01\\\\-0.234851\\\\130.9199\\\\295.01\\\\-0.6829615\\\\132.4199\\\\295.01\\\\-1.630643\\\\134.4199\\\\295.01\\\\-2.241431\\\\135.4199\\\\295.01\\\\-3.364212\\\\136.8065\\\\295.01\\\\-4.479952\\\\137.9199\\\\295.01\\\\-5.864212\\\\139.0335\\\\295.01\\\\-6.864212\\\\139.6417\\\\295.01\\\\-8.864211\\\\140.5979\\\\295.01\\\\-10.36421\\\\141.0637\\\\295.01\\\\-11.86421\\\\141.2292\\\\295.01\\\\-13.86421\\\\141.0486\\\\295.01\\\\-15.36421\\\\140.5495\\\\295.01\\\\-16.36421\\\\140.0745\\\\295.01\\\\-17.86421\\\\139.1365\\\\295.01\\\\-21.36421\\\\136.2233\\\\295.01\\\\-23.36421\\\\134.7404\\\\295.01\\\\-24.86421\\\\133.8202\\\\295.01\\\\-26.86421\\\\132.7895\\\\295.01\\\\-29.36421\\\\131.8086\\\\295.01\\\\-31.36421\\\\131.2283\\\\295.01\\\\-33.86421\\\\130.726\\\\295.01\\\\-35.86421\\\\130.5824\\\\295.01\\\\-37.86421\\\\130.5851\\\\295.01\\\\-39.86421\\\\130.732\\\\295.01\\\\-42.36421\\\\131.2641\\\\295.01\\\\-45.36421\\\\132.2405\\\\295.01\\\\-46.86421\\\\132.9028\\\\295.01\\\\-49.36421\\\\134.2029\\\\295.01\\\\-50.36421\\\\134.8394\\\\295.01\\\\-52.36421\\\\136.3216\\\\295.01\\\\-53.36421\\\\137.1936\\\\295.01\\\\-55.51793\\\\139.4199\\\\295.01\\\\-57.05593\\\\141.4199\\\\295.01\\\\-58.58438\\\\143.9199\\\\295.01\\\\-59.55771\\\\145.9199\\\\295.01\\\\-60.46825\\\\148.4199\\\\295.01\\\\-61.06986\\\\150.9199\\\\295.01\\\\-61.39546\\\\153.9199\\\\295.01\\\\-61.46327\\\\155.4199\\\\295.01\\\\-61.38126\\\\156.9199\\\\295.01\\\\-61.0591\\\\159.9199\\\\295.01\\\\-60.44754\\\\162.4199\\\\295.01\\\\-59.52451\\\\164.9199\\\\295.01\\\\-58.53138\\\\166.9199\\\\295.01\\\\-56.56637\\\\169.9199\\\\295.01\\\\-54.86625\\\\171.9199\\\\295.01\\\\-53.86421\\\\172.9499\\\\295.01\\\\-51.36421\\\\175.0986\\\\295.01\\\\-49.86421\\\\176.1393\\\\295.01\\\\-48.36421\\\\177.0304\\\\295.01\\\\-46.36421\\\\178.0032\\\\295.01\\\\-43.36421\\\\179.0823\\\\295.01\\\\-40.86421\\\\179.6404\\\\295.01\\\\-37.86421\\\\179.9579\\\\295.01\\\\-35.86421\\\\179.9677\\\\295.01\\\\-32.36421\\\\179.618\\\\295.01\\\\-29.86421\\\\179.0112\\\\295.01\\\\-27.36421\\\\178.0918\\\\295.01\\\\-25.36421\\\\177.1055\\\\295.01\\\\-22.86421\\\\175.5296\\\\295.01\\\\-19.86421\\\\173.325\\\\295.01\\\\-18.86421\\\\172.7049\\\\295.01\\\\-16.86421\\\\171.7768\\\\295.01\\\\-14.86421\\\\171.2971\\\\295.01\\\\-13.36421\\\\171.3134\\\\295.01\\\\-11.36421\\\\171.8039\\\\295.01\\\\-9.364211\\\\172.7201\\\\295.01\\\\-8.364211\\\\173.3311\\\\295.01\\\\-7.018403\\\\174.4199\\\\295.01\\\\-5.208806\\\\176.4199\\\\295.01\\\\-4.272865\\\\177.9199\\\\295.01\\\\-3.310016\\\\180.4199\\\\295.01\\\\-3.060024\\\\182.4199\\\\295.01\\\\-3.162389\\\\183.9199\\\\295.01\\\\-3.778172\\\\185.9199\\\\295.01\\\\-4.226866\\\\186.9199\\\\295.01\\\\-5.705407\\\\189.4199\\\\295.01\\\\-7.020076\\\\191.4199\\\\295.01\\\\-8.54745\\\\194.4199\\\\295.01\\\\-9.452921\\\\196.9199\\\\295.01\\\\-10.05642\\\\199.4199\\\\295.01\\\\-10.37757\\\\202.9199\\\\295.01\\\\-10.35085\\\\204.9199\\\\295.01\\\\-10.06341\\\\207.9199\\\\295.01\\\\-9.470693\\\\210.4199\\\\295.01\\\\-8.575538\\\\212.9199\\\\295.01\\\\-7.082783\\\\215.9199\\\\295.01\\\\-6.471828\\\\216.9199\\\\295.01\\\\-5.042096\\\\218.9199\\\\295.01\\\\-3.364212\\\\220.7911\\\\295.01\\\\-0.8642115\\\\223.0957\\\\295.01\\\\1.135789\\\\224.5215\\\\295.01\\\\3.135788\\\\225.6642\\\\295.01\\\\5.135788\\\\226.6284\\\\295.01\\\\7.635788\\\\227.5189\\\\295.01\\\\10.13579\\\\228.111\\\\295.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"254\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-17.36421\\\\138.0734\\\\298.01\\\\-21.36421\\\\134.8208\\\\298.01\\\\-22.86421\\\\133.7527\\\\298.01\\\\-25.36421\\\\132.2841\\\\298.01\\\\-27.36421\\\\131.3688\\\\298.01\\\\-30.36421\\\\130.3311\\\\298.01\\\\-32.86421\\\\129.7536\\\\298.01\\\\-35.86421\\\\129.4102\\\\298.01\\\\-37.86421\\\\129.4179\\\\298.01\\\\-40.86421\\\\129.7645\\\\298.01\\\\-42.86421\\\\130.2402\\\\298.01\\\\-45.86421\\\\131.2459\\\\298.01\\\\-48.36421\\\\132.3956\\\\298.01\\\\-50.86421\\\\133.8477\\\\298.01\\\\-52.86421\\\\135.3082\\\\298.01\\\\-55.36421\\\\137.6335\\\\298.01\\\\-56.93636\\\\139.4199\\\\298.01\\\\-58.04616\\\\140.9199\\\\298.01\\\\-59.57426\\\\143.4199\\\\298.01\\\\-60.54849\\\\145.4199\\\\298.01\\\\-61.49141\\\\147.9199\\\\298.01\\\\-62.02512\\\\149.9199\\\\298.01\\\\-62.42456\\\\152.4199\\\\298.01\\\\-62.59074\\\\155.4199\\\\298.01\\\\-62.47311\\\\157.9199\\\\298.01\\\\-62.01004\\\\160.9199\\\\298.01\\\\-61.47311\\\\162.9199\\\\298.01\\\\-60.51775\\\\165.4199\\\\298.01\\\\-58.92757\\\\168.4199\\\\298.01\\\\-57.56282\\\\170.4199\\\\298.01\\\\-55.90886\\\\172.4199\\\\298.01\\\\-53.86421\\\\174.4545\\\\298.01\\\\-51.86421\\\\176.0956\\\\298.01\\\\-50.36421\\\\177.126\\\\298.01\\\\-48.86421\\\\178.0214\\\\298.01\\\\-46.86421\\\\179.0059\\\\298.01\\\\-43.86421\\\\180.1004\\\\298.01\\\\-41.86421\\\\180.6074\\\\298.01\\\\-39.36421\\\\181.0032\\\\298.01\\\\-36.86421\\\\181.1393\\\\298.01\\\\-34.86421\\\\181.0696\\\\298.01\\\\-31.36421\\\\180.5696\\\\298.01\\\\-29.36421\\\\180.0358\\\\298.01\\\\-26.86421\\\\179.0826\\\\298.01\\\\-24.86421\\\\178.0915\\\\298.01\\\\-22.36421\\\\176.5441\\\\298.01\\\\-19.86421\\\\174.7606\\\\298.01\\\\-17.36421\\\\173.3134\\\\298.01\\\\-15.86421\\\\172.7165\\\\298.01\\\\-14.36421\\\\172.3535\\\\298.01\\\\-12.86421\\\\172.2821\\\\298.01\\\\-10.86421\\\\172.8134\\\\298.01\\\\-9.864211\\\\173.2612\\\\298.01\\\\-8.364211\\\\174.2009\\\\298.01\\\\-6.864212\\\\175.5768\\\\298.01\\\\-5.747024\\\\176.9199\\\\298.01\\\\-4.668733\\\\178.9199\\\\298.01\\\\-4.188285\\\\180.4199\\\\298.01\\\\-4.035754\\\\181.9199\\\\298.01\\\\-4.183949\\\\183.4199\\\\298.01\\\\-4.643007\\\\184.9199\\\\298.01\\\\-5.294955\\\\186.4199\\\\298.01\\\\-6.132928\\\\187.9199\\\\298.01\\\\-8.012517\\\\190.9199\\\\298.01\\\\-9.077596\\\\192.9199\\\\298.01\\\\-9.952921\\\\194.9199\\\\298.01\\\\-10.47785\\\\196.4199\\\\298.01\\\\-11.01005\\\\198.4199\\\\298.01\\\\-11.45025\\\\201.4199\\\\298.01\\\\-11.55772\\\\203.9199\\\\298.01\\\\-11.46073\\\\205.9199\\\\298.01\\\\-11.01962\\\\208.9199\\\\298.01\\\\-10.49571\\\\210.9199\\\\298.01\\\\-9.571923\\\\213.4199\\\\298.01\\\\-8.606749\\\\215.4199\\\\298.01\\\\-7.463268\\\\217.4199\\\\298.01\\\\-6.421503\\\\218.9199\\\\298.01\\\\-5.364212\\\\220.2352\\\\298.01\\\\-3.29047\\\\222.4199\\\\298.01\\\\-0.8642115\\\\224.4741\\\\298.01\\\\1.635789\\\\226.1212\\\\298.01\\\\4.635788\\\\227.6221\\\\298.01\\\\7.135788\\\\228.5449\\\\298.01\\\\9.135789\\\\229.0657\\\\298.01\\\\12.13579\\\\229.4949\\\\298.01\\\\14.13579\\\\229.5963\\\\298.01\\\\16.13579\\\\229.5164\\\\298.01\\\\19.13579\\\\229.0929\\\\298.01\\\\21.13579\\\\228.5912\\\\298.01\\\\24.13579\\\\227.5032\\\\298.01\\\\26.13579\\\\226.5287\\\\298.01\\\\29.13579\\\\224.6157\\\\298.01\\\\31.13579\\\\222.9954\\\\298.01\\\\32.76643\\\\221.4199\\\\298.01\\\\33.67046\\\\220.4199\\\\298.01\\\\35.25476\\\\218.4199\\\\298.01\\\\36.84434\\\\215.9199\\\\298.01\\\\37.8587\\\\213.9199\\\\298.01\\\\38.85302\\\\211.4199\\\\298.01\\\\39.31954\\\\209.9199\\\\298.01\\\\39.80026\\\\207.9199\\\\298.01\\\\40.16704\\\\204.9199\\\\298.01\\\\40.16004\\\\202.4199\\\\298.01\\\\39.79305\\\\199.4199\\\\298.01\\\\39.31053\\\\197.4199\\\\298.01\\\\38.84\\\\195.9199\\\\298.01\\\\37.8401\\\\193.4199\\\\298.01\\\\36.82063\\\\191.4199\\\\298.01\\\\35.26744\\\\188.9199\\\\298.01\\\\33.94211\\\\186.9199\\\\298.01\\\\32.91801\\\\184.9199\\\\298.01\\\\32.53175\\\\183.9199\\\\298.01\\\\32.02689\\\\181.4199\\\\298.01\\\\32.4123\\\\179.4199\\\\298.01\\\\32.97419\\\\177.9199\\\\298.01\\\\33.5138\\\\176.9199\\\\298.01\\\\34.61511\\\\175.4199\\\\298.01\\\\35.63579\\\\174.3649\\\\298.01\\\\37.13579\\\\173.2065\\\\298.01\\\\39.13579\\\\172.2018\\\\298.01\\\\40.63579\\\\171.7608\\\\298.01\\\\42.63579\\\\171.7324\\\\298.01\\\\44.63579\\\\172.2536\\\\298.01\\\\47.63579\\\\173.7016\\\\298.01\\\\50.63579\\\\175.5381\\\\298.01\\\\52.63579\\\\176.5734\\\\298.01\\\\55.13579\\\\177.5946\\\\298.01\\\\56.63579\\\\178.0771\\\\298.01\\\\58.63579\\\\178.5676\\\\298.01\\\\61.63579\\\\178.9218\\\\298.01\\\\64.13579\\\\178.9405\\\\298.01\\\\67.13579\\\\178.5826\\\\298.01\\\\69.13579\\\\178.1077\\\\298.01\\\\72.13579\\\\177.1048\\\\298.01\\\\73.63579\\\\176.4441\\\\298.01\\\\76.13579\\\\175.128\\\\298.01\\\\77.13579\\\\174.5032\\\\298.01\\\\79.13579\\\\173.037\\\\298.01\\\\80.41171\\\\171.9199\\\\298.01\\\\82.80591\\\\169.4199\\\\298.01\\\\84.32225\\\\167.4199\\\\298.01\\\\85.84733\\\\164.9199\\\\298.01\\\\86.82425\\\\162.9199\\\\298.01\\\\87.76729\\\\160.4199\\\\298.01\\\\88.29848\\\\158.4199\\\\298.01\\\\88.69914\\\\155.9199\\\\298.01\\\\88.86338\\\\152.9199\\\\298.01\\\\88.73231\\\\150.4199\\\\298.01\\\\88.32969\\\\147.9199\\\\298.01\\\\87.82111\\\\145.9199\\\\298.01\\\\86.72449\\\\142.9199\\\\298.01\\\\85.73485\\\\140.9199\\\\298.01\\\\84.83606\\\\139.4199\\\\298.01\\\\83.80003\\\\137.9199\\\\298.01\\\\81.67046\\\\135.4199\\\\298.01\\\\80.63579\\\\134.4028\\\\298.01\\\\78.13579\\\\132.3134\\\\298.01\\\\76.63579\\\\131.2847\\\\298.01\\\\74.18953\\\\129.9199\\\\298.01\\\\71.63579\\\\128.778\\\\298.01\\\\70.13579\\\\128.2663\\\\298.01\\\\68.13579\\\\127.7468\\\\298.01\\\\65.63579\\\\127.3565\\\\298.01\\\\64.13579\\\\127.2386\\\\298.01\\\\60.63579\\\\127.3285\\\\298.01\\\\57.63579\\\\127.776\\\\298.01\\\\55.63579\\\\128.311\\\\298.01\\\\53.13579\\\\129.2608\\\\298.01\\\\51.13579\\\\130.2564\\\\298.01\\\\48.63579\\\\131.8259\\\\298.01\\\\46.63579\\\\133.3886\\\\298.01\\\\43.63579\\\\135.9802\\\\298.01\\\\42.13579\\\\137.0449\\\\298.01\\\\40.13579\\\\138.0715\\\\298.01\\\\38.63579\\\\138.5637\\\\298.01\\\\36.63579\\\\138.7519\\\\298.01\\\\35.13579\\\\138.5808\\\\298.01\\\\33.63579\\\\138.0696\\\\298.01\\\\31.63579\\\\136.9511\\\\298.01\\\\29.8448\\\\135.4199\\\\298.01\\\\28.96778\\\\134.4199\\\\298.01\\\\27.9767\\\\132.9199\\\\298.01\\\\27.488\\\\131.9199\\\\298.01\\\\26.98038\\\\130.4199\\\\298.01\\\\26.80886\\\\128.9199\\\\298.01\\\\26.93039\\\\127.4199\\\\298.01\\\\27.55797\\\\125.4199\\\\298.01\\\\28.02931\\\\124.4199\\\\298.01\\\\28.95004\\\\122.9199\\\\298.01\\\\30.51157\\\\120.9199\\\\298.01\\\\31.80976\\\\119.4199\\\\298.01\\\\33.31496\\\\117.4199\\\\298.01\\\\34.83657\\\\114.9199\\\\298.01\\\\35.81157\\\\112.9199\\\\298.01\\\\36.74942\\\\110.4199\\\\298.01\\\\37.28162\\\\108.4199\\\\298.01\\\\37.72183\\\\105.4199\\\\298.01\\\\37.8293\\\\102.9199\\\\298.01\\\\37.73231\\\\100.9199\\\\298.01\\\\37.29119\\\\97.91986\\\\298.01\\\\36.76729\\\\95.91986\\\\298.01\\\\35.8435\\\\93.41986\\\\298.01\\\\34.34129\\\\90.41986\\\\298.01\\\\32.69308\\\\87.91986\\\\298.01\\\\31.63579\\\\86.6045\\\\298.01\\\\30.08003\\\\84.91986\\\\298.01\\\\27.63579\\\\82.74211\\\\298.01\\\\25.63579\\\\81.32591\\\\298.01\\\\23.63579\\\\80.17981\\\\298.01\\\\21.63579\\\\79.2176\\\\298.01\\\\19.13579\\\\78.29486\\\\298.01\\\\17.13579\\\\77.77402\\\\298.01\\\\14.13579\\\\77.34486\\\\298.01\\\\12.13579\\\\77.24346\\\\298.01\\\\10.13579\\\\77.32334\\\\298.01\\\\7.135788\\\\77.74678\\\\298.01\\\\5.135788\\\\78.24847\\\\298.01\\\\2.135788\\\\79.33382\\\\298.01\\\\0.1357885\\\\80.31096\\\\298.01\\\\-2.864212\\\\82.22402\\\\298.01\\\\-4.864212\\\\83.84435\\\\298.01\\\\-6.494857\\\\85.41986\\\\298.01\\\\-7.398883\\\\86.41986\\\\298.01\\\\-8.986199\\\\88.41986\\\\298.01\\\\-10.57276\\\\90.91986\\\\298.01\\\\-11.58712\\\\92.91986\\\\298.01\\\\-12.58144\\\\95.41986\\\\298.01\\\\-13.04796\\\\96.91986\\\\298.01\\\\-13.52869\\\\98.91986\\\\298.01\\\\-13.89546\\\\101.9199\\\\298.01\\\\-13.88846\\\\104.4199\\\\298.01\\\\-13.52147\\\\107.4199\\\\298.01\\\\-13.03896\\\\109.4199\\\\298.01\\\\-12.56842\\\\110.9199\\\\298.01\\\\-11.56853\\\\113.4199\\\\298.01\\\\-10.54737\\\\115.4199\\\\298.01\\\\-8.942026\\\\117.9199\\\\298.01\\\\-6.441266\\\\120.9199\\\\298.01\\\\-4.864212\\\\122.5615\\\\298.01\\\\-3.257069\\\\124.4199\\\\298.01\\\\-2.292064\\\\125.9199\\\\298.01\\\\-1.797885\\\\126.9199\\\\298.01\\\\-1.141081\\\\128.9199\\\\298.01\\\\-0.9914045\\\\130.4199\\\\298.01\\\\-1.169235\\\\131.9199\\\\298.01\\\\-1.678251\\\\133.4199\\\\298.01\\\\-2.778172\\\\135.4199\\\\298.01\\\\-3.864212\\\\136.7395\\\\298.01\\\\-5.864212\\\\138.492\\\\298.01\\\\-7.864212\\\\139.5963\\\\298.01\\\\-9.364211\\\\140.1104\\\\298.01\\\\-11.36421\\\\140.3688\\\\298.01\\\\-13.36421\\\\140.0734\\\\298.01\\\\-14.86421\\\\139.5239\\\\298.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"246\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"15\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n"; +const char* k_rtStruct_json07 = +" \"Value\" : \"41.63579\\\\136.0798\\\\301.01\\\\39.63579\\\\137.1339\\\\301.01\\\\38.13579\\\\137.6336\\\\301.01\\\\36.63579\\\\137.8285\\\\301.01\\\\35.13579\\\\137.6244\\\\301.01\\\\33.63579\\\\137.0851\\\\301.01\\\\32.63579\\\\136.5518\\\\301.01\\\\31.13579\\\\135.4333\\\\301.01\\\\30.12233\\\\134.4199\\\\301.01\\\\29.0038\\\\132.9199\\\\301.01\\\\28.47056\\\\131.9199\\\\301.01\\\\27.93124\\\\130.4199\\\\301.01\\\\27.72713\\\\128.9199\\\\301.01\\\\27.9259\\\\127.4199\\\\301.01\\\\28.43386\\\\125.9199\\\\301.01\\\\29.51482\\\\123.9199\\\\301.01\\\\31.77887\\\\120.9199\\\\301.01\\\\33.79488\\\\117.9199\\\\301.01\\\\35.27357\\\\115.4199\\\\301.01\\\\36.26941\\\\113.4199\\\\301.01\\\\37.23983\\\\110.9199\\\\301.01\\\\37.80718\\\\108.9199\\\\301.01\\\\38.26298\\\\106.4199\\\\301.01\\\\38.42556\\\\102.9199\\\\301.01\\\\38.32632\\\\100.4199\\\\301.01\\\\37.81704\\\\97.41986\\\\301.01\\\\37.26298\\\\95.41986\\\\301.01\\\\36.30376\\\\92.91986\\\\301.01\\\\35.31862\\\\90.91986\\\\301.01\\\\33.79669\\\\88.41986\\\\301.01\\\\32.69613\\\\86.91986\\\\301.01\\\\31.40617\\\\85.41986\\\\301.01\\\\30.13579\\\\84.11847\\\\301.01\\\\28.13579\\\\82.36256\\\\301.01\\\\26.63579\\\\81.26077\\\\301.01\\\\24.13579\\\\79.73861\\\\301.01\\\\22.13579\\\\78.75716\\\\301.01\\\\19.63579\\\\77.80389\\\\301.01\\\\17.63579\\\\77.24678\\\\301.01\\\\15.13579\\\\76.79932\\\\301.01\\\\12.13579\\\\76.64858\\\\301.01\\\\9.635789\\\\76.72783\\\\301.01\\\\6.635788\\\\77.21915\\\\301.01\\\\4.635788\\\\77.74511\\\\301.01\\\\3.135788\\\\78.25896\\\\301.01\\\\0.5678061\\\\79.41986\\\\301.01\\\\-1.864211\\\\80.78835\\\\301.01\\\\-3.364212\\\\81.83115\\\\301.01\\\\-4.710485\\\\82.91986\\\\301.01\\\\-6.864212\\\\84.94054\\\\301.01\\\\-9.004042\\\\87.41986\\\\301.01\\\\-11.00404\\\\90.41986\\\\301.01\\\\-12.04224\\\\92.41986\\\\301.01\\\\-13.0635\\\\94.91986\\\\301.01\\\\-13.55475\\\\96.41986\\\\301.01\\\\-14.05919\\\\98.41986\\\\301.01\\\\-14.46577\\\\100.9199\\\\301.01\\\\-14.56064\\\\103.9199\\\\301.01\\\\-14.45556\\\\105.4199\\\\301.01\\\\-14.05171\\\\107.9199\\\\301.01\\\\-13.54386\\\\109.9199\\\\301.01\\\\-12.47311\\\\112.9199\\\\301.01\\\\-11.52147\\\\114.9199\\\\301.01\\\\-10.0356\\\\117.4199\\\\301.01\\\\-7.977848\\\\120.4199\\\\301.01\\\\-6.493406\\\\122.4199\\\\301.01\\\\-4.729596\\\\124.4199\\\\301.01\\\\-3.644515\\\\125.9199\\\\301.01\\\\-2.642783\\\\127.9199\\\\301.01\\\\-2.184044\\\\129.4199\\\\301.01\\\\-2.190483\\\\131.4199\\\\301.01\\\\-2.659926\\\\132.9199\\\\301.01\\\\-3.746865\\\\134.9199\\\\301.01\\\\-4.864212\\\\136.2112\\\\301.01\\\\-5.864212\\\\137.1478\\\\301.01\\\\-7.364212\\\\138.139\\\\301.01\\\\-8.364211\\\\138.6184\\\\301.01\\\\-9.864211\\\\139.0841\\\\301.01\\\\-10.86421\\\\139.1837\\\\301.01\\\\-12.36421\\\\139.0851\\\\301.01\\\\-13.86421\\\\138.6368\\\\301.01\\\\-15.36421\\\\137.9369\\\\301.01\\\\-16.86421\\\\137.0216\\\\301.01\\\\-19.36421\\\\135.1894\\\\301.01\\\\-22.36421\\\\133.2626\\\\301.01\\\\-25.86421\\\\131.3565\\\\301.01\\\\-28.36421\\\\130.3086\\\\301.01\\\\-29.86421\\\\129.8259\\\\301.01\\\\-32.36421\\\\129.2191\\\\301.01\\\\-34.86421\\\\128.8338\\\\301.01\\\\-37.86421\\\\128.7519\\\\301.01\\\\-41.36421\\\\129.2324\\\\301.01\\\\-43.36421\\\\129.7339\\\\301.01\\\\-46.36421\\\\130.7721\\\\301.01\\\\-49.36421\\\\132.2284\\\\301.01\\\\-51.86421\\\\133.7884\\\\301.01\\\\-53.86421\\\\135.3506\\\\301.01\\\\-56.47069\\\\137.9199\\\\301.01\\\\-58.44481\\\\140.4199\\\\301.01\\\\-60.00607\\\\142.9199\\\\301.01\\\\-61.00807\\\\144.9199\\\\301.01\\\\-61.98475\\\\147.4199\\\\301.01\\\\-62.55171\\\\149.4199\\\\301.01\\\\-62.94481\\\\151.4199\\\\301.01\\\\-63.10673\\\\152.9199\\\\301.01\\\\-63.19798\\\\155.4199\\\\301.01\\\\-63.00807\\\\158.9199\\\\301.01\\\\-62.53729\\\\161.4199\\\\301.01\\\\-61.96073\\\\163.4199\\\\301.01\\\\-60.97069\\\\165.9199\\\\301.01\\\\-60.48248\\\\166.9199\\\\301.01\\\\-59.01394\\\\169.4199\\\\301.01\\\\-57.95292\\\\170.9199\\\\301.01\\\\-56.86421\\\\172.2435\\\\301.01\\\\-55.29496\\\\173.9199\\\\301.01\\\\-53.67131\\\\175.4199\\\\301.01\\\\-52.36421\\\\176.4802\\\\301.01\\\\-49.86421\\\\178.1377\\\\301.01\\\\-47.36421\\\\179.4369\\\\301.01\\\\-45.86421\\\\180.0861\\\\301.01\\\\-42.86421\\\\181.0311\\\\301.01\\\\-40.36421\\\\181.5311\\\\301.01\\\\-36.86421\\\\181.7386\\\\301.01\\\\-33.36421\\\\181.5637\\\\301.01\\\\-30.86421\\\\181.0963\\\\301.01\\\\-28.86421\\\\180.5239\\\\301.01\\\\-26.36421\\\\179.5404\\\\301.01\\\\-24.36421\\\\178.5404\\\\301.01\\\\-20.36421\\\\176.3956\\\\301.01\\\\-17.86421\\\\175.2373\\\\301.01\\\\-14.86421\\\\174.2269\\\\301.01\\\\-13.36421\\\\174.0709\\\\301.01\\\\-11.86421\\\\174.2958\\\\301.01\\\\-9.864211\\\\175.2389\\\\301.01\\\\-8.441711\\\\176.4199\\\\301.01\\\\-7.16156\\\\177.9199\\\\301.01\\\\-6.177148\\\\179.9199\\\\301.01\\\\-5.842727\\\\181.4199\\\\301.01\\\\-5.813838\\\\182.4199\\\\301.01\\\\-6.169591\\\\184.4199\\\\301.01\\\\-7.196132\\\\187.4199\\\\301.01\\\\-8.770263\\\\190.9199\\\\301.01\\\\-10.00404\\\\193.4199\\\\301.01\\\\-10.97069\\\\195.9199\\\\301.01\\\\-11.5356\\\\197.9199\\\\301.01\\\\-12.04705\\\\200.9199\\\\301.01\\\\-12.15398\\\\203.9199\\\\301.01\\\\-12.05475\\\\206.4199\\\\301.01\\\\-11.54546\\\\209.4199\\\\301.01\\\\-10.9914\\\\211.4199\\\\301.01\\\\-10.03218\\\\213.9199\\\\301.01\\\\-9.047048\\\\215.9199\\\\301.01\\\\-7.525116\\\\218.4199\\\\301.01\\\\-6.424556\\\\219.9199\\\\301.01\\\\-5.133131\\\\221.4199\\\\301.01\\\\-3.864212\\\\222.7213\\\\301.01\\\\-1.864211\\\\224.4771\\\\301.01\\\\-0.3642115\\\\225.5771\\\\301.01\\\\2.135788\\\\227.0995\\\\301.01\\\\4.135788\\\\228.0826\\\\301.01\\\\6.635788\\\\229.0358\\\\301.01\\\\8.635789\\\\229.5929\\\\301.01\\\\11.13579\\\\230.0381\\\\301.01\\\\14.13579\\\\230.1911\\\\301.01\\\\16.63579\\\\230.1119\\\\301.01\\\\19.63579\\\\229.6206\\\\301.01\\\\21.63579\\\\229.0929\\\\301.01\\\\23.13579\\\\228.5808\\\\301.01\\\\25.70377\\\\227.4199\\\\301.01\\\\28.13579\\\\226.0514\\\\301.01\\\\29.63579\\\\225.0086\\\\301.01\\\\30.98206\\\\223.9199\\\\301.01\\\\33.13579\\\\221.8956\\\\301.01\\\\35.27562\\\\219.4199\\\\301.01\\\\37.27562\\\\216.4199\\\\301.01\\\\38.31382\\\\214.4199\\\\301.01\\\\39.33508\\\\211.9199\\\\301.01\\\\39.82632\\\\210.4199\\\\301.01\\\\40.33076\\\\208.4199\\\\301.01\\\\40.73735\\\\205.9199\\\\301.01\\\\40.83222\\\\202.9199\\\\301.01\\\\40.72713\\\\201.4199\\\\301.01\\\\40.32329\\\\198.9199\\\\301.01\\\\39.81544\\\\196.9199\\\\301.01\\\\39.32329\\\\195.4199\\\\301.01\\\\38.29488\\\\192.9199\\\\301.01\\\\35.95219\\\\188.4199\\\\301.01\\\\34.43608\\\\184.9199\\\\301.01\\\\33.9686\\\\183.4199\\\\301.01\\\\33.73262\\\\181.4199\\\\301.01\\\\33.94788\\\\179.9199\\\\301.01\\\\34.52448\\\\178.4199\\\\301.01\\\\35.44645\\\\176.9199\\\\301.01\\\\36.36579\\\\175.9199\\\\301.01\\\\37.63579\\\\174.8116\\\\301.01\\\\39.63579\\\\173.747\\\\301.01\\\\41.13579\\\\173.3669\\\\301.01\\\\42.13579\\\\173.3279\\\\301.01\\\\44.13579\\\\173.7036\\\\301.01\\\\46.13579\\\\174.3009\\\\301.01\\\\48.63579\\\\175.2884\\\\301.01\\\\51.13579\\\\176.5471\\\\301.01\\\\54.63579\\\\178.0789\\\\301.01\\\\56.13579\\\\178.5789\\\\301.01\\\\58.13579\\\\179.0963\\\\301.01\\\\60.63579\\\\179.4977\\\\301.01\\\\62.13579\\\\179.6058\\\\301.01\\\\65.13579\\\\179.5138\\\\301.01\\\\67.63579\\\\179.1134\\\\301.01\\\\69.63579\\\\178.6148\\\\301.01\\\\72.63579\\\\177.5771\\\\301.01\\\\75.63579\\\\176.1191\\\\301.01\\\\78.13579\\\\174.5576\\\\301.01\\\\80.13579\\\\172.992\\\\301.01\\\\81.80482\\\\171.4199\\\\301.01\\\\83.17384\\\\169.9199\\\\301.01\\\\84.72182\\\\167.9199\\\\301.01\\\\86.27964\\\\165.4199\\\\301.01\\\\87.28358\\\\163.4199\\\\301.01\\\\88.26079\\\\160.9199\\\\301.01\\\\88.82632\\\\158.9199\\\\301.01\\\\89.22182\\\\156.9199\\\\301.01\\\\89.3794\\\\155.4199\\\\301.01\\\\89.46956\\\\152.9199\\\\301.01\\\\89.26079\\\\149.4199\\\\301.01\\\\88.75857\\\\146.9199\\\\301.01\\\\87.80548\\\\143.9199\\\\301.01\\\\87.16004\\\\142.4199\\\\301.01\\\\85.85093\\\\139.9199\\\\301.01\\\\84.18044\\\\137.4199\\\\301.01\\\\82.63579\\\\135.578\\\\301.01\\\\80.45245\\\\133.4199\\\\301.01\\\\79.13579\\\\132.3039\\\\301.01\\\\76.13579\\\\130.259\\\\301.01\\\\73.13579\\\\128.7278\\\\301.01\\\\70.63579\\\\127.7663\\\\301.01\\\\68.63579\\\\127.2192\\\\301.01\\\\66.63579\\\\126.8285\\\\301.01\\\\63.13579\\\\126.6148\\\\301.01\\\\59.63579\\\\126.7884\\\\301.01\\\\57.13579\\\\127.2502\\\\301.01\\\\55.13579\\\\127.8208\\\\301.01\\\\52.63579\\\\128.8062\\\\301.01\\\\51.63579\\\\129.2905\\\\301.01\\\\49.13579\\\\130.7368\\\\301.01\\\\46.13579\\\\132.7185\\\\301.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"234\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"16\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-7.002701\\\\124.9199\\\\304.01\\\\-5.332349\\\\127.4199\\\\304.01\\\\-4.657244\\\\128.9199\\\\304.01\\\\-4.339658\\\\130.4199\\\\304.01\\\\-4.672063\\\\131.9199\\\\304.01\\\\-5.731034\\\\133.9199\\\\304.01\\\\-7.364212\\\\135.553\\\\304.01\\\\-9.364211\\\\136.612\\\\304.01\\\\-10.86421\\\\136.9399\\\\304.01\\\\-12.86421\\\\136.6037\\\\304.01\\\\-14.36421\\\\135.9559\\\\304.01\\\\-16.36421\\\\134.8809\\\\304.01\\\\-19.36421\\\\134.0734\\\\304.01\\\\-20.86421\\\\133.5753\\\\304.01\\\\-23.36421\\\\132.4405\\\\304.01\\\\-26.86421\\\\130.722\\\\304.01\\\\-29.36421\\\\129.7841\\\\304.01\\\\-31.36421\\\\129.2435\\\\304.01\\\\-33.86421\\\\128.7862\\\\304.01\\\\-36.86421\\\\128.6288\\\\304.01\\\\-39.86421\\\\128.8016\\\\304.01\\\\-42.36421\\\\129.274\\\\304.01\\\\-44.36421\\\\129.8477\\\\304.01\\\\-46.86421\\\\130.78\\\\304.01\\\\-48.86421\\\\131.7485\\\\304.01\\\\-51.36421\\\\133.2519\\\\304.01\\\\-52.86421\\\\134.3259\\\\304.01\\\\-54.71862\\\\135.9199\\\\304.01\\\\-56.66553\\\\137.9199\\\\304.01\\\\-57.90558\\\\139.4199\\\\304.01\\\\-58.98475\\\\140.9199\\\\304.01\\\\-59.89888\\\\142.4199\\\\304.01\\\\-60.96327\\\\144.4199\\\\304.01\\\\-62.00404\\\\146.9199\\\\304.01\\\\-62.49141\\\\148.4199\\\\304.01\\\\-62.99141\\\\150.4199\\\\304.01\\\\-63.42456\\\\153.4199\\\\304.01\\\\-63.54705\\\\155.4199\\\\304.01\\\\-63.39888\\\\157.4199\\\\304.01\\\\-63.05474\\\\159.9199\\\\304.01\\\\-62.44481\\\\162.4199\\\\304.01\\\\-61.95556\\\\163.9199\\\\304.01\\\\-60.87383\\\\166.4199\\\\304.01\\\\-59.51394\\\\168.9199\\\\304.01\\\\-58.50607\\\\170.4199\\\\304.01\\\\-56.92757\\\\172.4199\\\\304.01\\\\-55.52116\\\\173.9199\\\\304.01\\\\-53.86421\\\\175.4709\\\\304.01\\\\-51.86421\\\\177.0449\\\\304.01\\\\-49.36421\\\\178.6177\\\\304.01\\\\-46.36421\\\\180.0843\\\\304.01\\\\-43.36421\\\\181.1058\\\\304.01\\\\-41.36421\\\\181.5843\\\\304.01\\\\-38.36421\\\\181.9891\\\\304.01\\\\-35.86421\\\\182.0426\\\\304.01\\\\-32.36421\\\\181.6119\\\\304.01\\\\-29.86421\\\\181.0164\\\\304.01\\\\-28.36421\\\\180.5311\\\\304.01\\\\-25.86421\\\\179.4802\\\\304.01\\\\-23.36421\\\\178.2136\\\\304.01\\\\-21.36421\\\\177.3016\\\\304.01\\\\-19.86421\\\\176.7993\\\\304.01\\\\-17.36421\\\\176.4579\\\\304.01\\\\-15.36421\\\\176.7158\\\\304.01\\\\-13.36421\\\\177.2203\\\\304.01\\\\-11.36421\\\\178.2083\\\\304.01\\\\-9.70184\\\\179.9199\\\\304.01\\\\-8.743179\\\\181.9199\\\\304.01\\\\-8.174695\\\\183.9199\\\\304.01\\\\-7.905579\\\\185.9199\\\\304.01\\\\-8.208806\\\\188.4199\\\\304.01\\\\-9.245948\\\\191.4199\\\\304.01\\\\-9.968248\\\\192.9199\\\\304.01\\\\-10.97069\\\\195.4199\\\\304.01\\\\-11.4448\\\\196.9199\\\\304.01\\\\-12.03729\\\\199.4199\\\\304.01\\\\-12.38126\\\\202.4199\\\\304.01\\\\-12.46825\\\\203.9199\\\\304.01\\\\-12.05171\\\\207.9199\\\\304.01\\\\-11.47785\\\\210.4199\\\\304.01\\\\-10.41841\\\\213.4199\\\\304.01\\\\-9.501996\\\\215.4199\\\\304.01\\\\-8.038957\\\\217.9199\\\\304.01\\\\-6.995714\\\\219.4199\\\\304.01\\\\-5.364212\\\\221.372\\\\304.01\\\\-4.364212\\\\222.4369\\\\304.01\\\\-2.749882\\\\223.9199\\\\304.01\\\\-1.364211\\\\225.0471\\\\304.01\\\\0.1357885\\\\226.0878\\\\304.01\\\\2.635788\\\\227.5471\\\\304.01\\\\3.635788\\\\228.0311\\\\304.01\\\\6.135788\\\\229.0404\\\\304.01\\\\7.635788\\\\229.5059\\\\304.01\\\\10.13579\\\\230.0826\\\\304.01\\\\13.63579\\\\230.4369\\\\304.01\\\\15.13579\\\\230.4102\\\\304.01\\\\18.13579\\\\230.1177\\\\304.01\\\\20.63579\\\\229.5789\\\\304.01\\\\23.63579\\\\228.5771\\\\304.01\\\\25.63579\\\\227.6478\\\\304.01\\\\27.63579\\\\226.5696\\\\304.01\\\\29.13579\\\\225.5808\\\\304.01\\\\30.63579\\\\224.4476\\\\304.01\\\\32.13579\\\\223.1389\\\\304.01\\\\34.72183\\\\220.4199\\\\304.01\\\\36.23735\\\\218.4199\\\\304.01\\\\37.77357\\\\215.9199\\\\304.01\\\\38.76079\\\\213.9199\\\\304.01\\\\39.71638\\\\211.4199\\\\304.01\\\\40.29669\\\\209.4199\\\\304.01\\\\40.83928\\\\206.4199\\\\304.01\\\\40.95776\\\\203.9199\\\\304.01\\\\40.76941\\\\200.4199\\\\304.01\\\\40.27357\\\\197.9199\\\\304.01\\\\39.32481\\\\194.9199\\\\304.01\\\\38.71079\\\\193.4199\\\\304.01\\\\37.00217\\\\189.9199\\\\304.01\\\\35.97488\\\\186.9199\\\\304.01\\\\35.81218\\\\184.9199\\\\304.01\\\\36.02215\\\\182.9199\\\\304.01\\\\36.53948\\\\180.9199\\\\304.01\\\\36.95037\\\\179.9199\\\\304.01\\\\37.94024\\\\178.4199\\\\304.01\\\\39.13579\\\\177.2874\\\\304.01\\\\40.13579\\\\176.6719\\\\304.01\\\\42.13579\\\\175.8343\\\\304.01\\\\44.13579\\\\175.2645\\\\304.01\\\\45.63579\\\\175.1192\\\\304.01\\\\47.13579\\\\175.259\\\\304.01\\\\49.13579\\\\175.872\\\\304.01\\\\54.13579\\\\178.0657\\\\304.01\\\\57.13579\\\\179.0164\\\\304.01\\\\59.63579\\\\179.5214\\\\304.01\\\\63.13579\\\\179.7263\\\\304.01\\\\66.13579\\\\179.5597\\\\304.01\\\\68.63579\\\\179.0826\\\\304.01\\\\70.63579\\\\178.5164\\\\304.01\\\\73.13579\\\\177.5753\\\\304.01\\\\75.13579\\\\176.6043\\\\304.01\\\\77.63579\\\\175.0995\\\\304.01\\\\79.13579\\\\174.0263\\\\304.01\\\\81.00275\\\\172.4199\\\\304.01\\\\82.94763\\\\170.4199\\\\304.01\\\\84.19308\\\\168.9199\\\\304.01\\\\85.26515\\\\167.4199\\\\304.01\\\\86.74468\\\\164.9199\\\\304.01\\\\87.67715\\\\162.9199\\\\304.01\\\\88.76941\\\\159.9199\\\\304.01\\\\89.26729\\\\157.9199\\\\304.01\\\\89.69914\\\\154.9199\\\\304.01\\\\89.77764\\\\151.9199\\\\304.01\\\\89.31544\\\\148.4199\\\\304.01\\\\88.83076\\\\146.4199\\\\304.01\\\\88.18044\\\\144.4199\\\\304.01\\\\87.34991\\\\142.4199\\\\304.01\\\\86.33366\\\\140.4199\\\\304.01\\\\84.75405\\\\137.9199\\\\304.01\\\\83.16004\\\\135.9199\\\\304.01\\\\80.63579\\\\133.3449\\\\304.01\\\\78.13579\\\\131.3449\\\\304.01\\\\75.63579\\\\129.7572\\\\304.01\\\\73.63579\\\\128.7402\\\\304.01\\\\71.13579\\\\127.7324\\\\304.01\\\\69.63579\\\\127.2572\\\\304.01\\\\67.63579\\\\126.778\\\\304.01\\\\64.13579\\\\126.3338\\\\304.01\\\\61.63579\\\\126.3752\\\\304.01\\\\58.63579\\\\126.7435\\\\304.01\\\\56.13579\\\\127.3449\\\\304.01\\\\53.63579\\\\128.2206\\\\304.01\\\\51.13579\\\\129.3886\\\\304.01\\\\48.13579\\\\131.1148\\\\304.01\\\\45.13579\\\\132.5771\\\\304.01\\\\42.63579\\\\133.274\\\\304.01\\\\41.63579\\\\133.6847\\\\304.01\\\\40.13579\\\\134.6251\\\\304.01\\\\38.13579\\\\135.5657\\\\304.01\\\\36.63579\\\\135.7968\\\\304.01\\\\35.13579\\\\135.5526\\\\304.01\\\\33.13579\\\\134.5317\\\\304.01\\\\32.13579\\\\133.6744\\\\304.01\\\\31.02395\\\\132.4199\\\\304.01\\\\30.0031\\\\130.4199\\\\304.01\\\\29.75883\\\\128.9199\\\\304.01\\\\29.99374\\\\127.4199\\\\304.01\\\\30.93457\\\\125.4199\\\\304.01\\\\31.87468\\\\123.9199\\\\304.01\\\\32.28358\\\\122.9199\\\\304.01\\\\32.97309\\\\120.4199\\\\304.01\\\\34.10454\\\\117.9199\\\\304.01\\\\36.20794\\\\113.9199\\\\304.01\\\\37.24227\\\\111.4199\\\\304.01\\\\37.71638\\\\109.9199\\\\304.01\\\\38.30886\\\\107.4199\\\\304.01\\\\38.70211\\\\103.9199\\\\304.01\\\\38.67046\\\\101.9199\\\\304.01\\\\38.32329\\\\98.91986\\\\304.01\\\\37.74942\\\\96.41986\\\\304.01\\\\36.68998\\\\93.41986\\\\304.01\\\\35.77357\\\\91.41986\\\\304.01\\\\34.31053\\\\88.91986\\\\304.01\\\\33.26729\\\\87.41986\\\\304.01\\\\32.13579\\\\86.02943\\\\304.01\\\\30.13383\\\\83.91986\\\\304.01\\\\27.63579\\\\81.79266\\\\304.01\\\\26.13579\\\\80.75189\\\\304.01\\\\23.63579\\\\79.29266\\\\304.01\\\\20.13579\\\\77.79707\\\\304.01\\\\18.63579\\\\77.33382\\\\304.01\\\\16.13579\\\\76.75716\\\\304.01\\\\12.63579\\\\76.39918\\\\304.01\\\\11.13579\\\\76.42567\\\\304.01\\\\8.135789\\\\76.72199\\\\304.01\\\\5.635788\\\\77.25896\\\\304.01\\\\2.635788\\\\78.2626\\\\304.01\\\\0.6357885\\\\79.19189\\\\304.01\\\\-1.364211\\\\80.27013\\\\304.01\\\\-2.864212\\\\81.25896\\\\304.01\\\\-4.364212\\\\82.39208\\\\304.01\\\\-6.864212\\\\84.67407\\\\304.01\\\\-8.452921\\\\86.41986\\\\304.01\\\\-9.968248\\\\88.41986\\\\304.01\\\\-11.50404\\\\90.91986\\\\304.01\\\\-12.48921\\\\92.91986\\\\304.01\\\\-13.4448\\\\95.41986\\\\304.01\\\\-14.02512\\\\97.41986\\\\304.01\\\\-14.56907\\\\100.4199\\\\304.01\\\\-14.68618\\\\102.9199\\\\304.01\\\\-14.49783\\\\106.4199\\\\304.01\\\\-14.002\\\\108.9199\\\\304.01\\\\-13.05324\\\\111.9199\\\\304.01\\\\-11.97069\\\\114.4199\\\\304.01\\\\-8.813155\\\\119.9199\\\\304.01\\\\-7.750575\\\\122.4199\\\\304.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"248\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"17\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.13579\\\\230.4862\\\\307.01\\\\18.13579\\\\230.1234\\\\307.01\\\\20.63579\\\\229.5843\\\\307.01\\\\23.63579\\\\228.5826\\\\307.01\\\\25.63579\\\\227.6544\\\\307.01\\\\27.63579\\\\226.5734\\\\307.01\\\\29.13579\\\\225.5843\\\\307.01\\\\30.63579\\\\224.4545\\\\307.01\\\\32.13579\\\\223.1497\\\\307.01\\\\34.73231\\\\220.4199\\\\307.01\\\\36.24707\\\\218.4199\\\\307.01\\\\37.78162\\\\215.9199\\\\307.01\\\\38.76729\\\\213.9199\\\\307.01\\\\39.7245\\\\211.4199\\\\307.01\\\\40.30202\\\\209.4199\\\\307.01\\\\40.84336\\\\206.4199\\\\307.01\\\\40.96271\\\\203.9199\\\\307.01\\\\40.77357\\\\200.4199\\\\307.01\\\\40.27764\\\\197.9199\\\\307.01\\\\39.3293\\\\194.9199\\\\307.01\\\\38.71912\\\\193.4199\\\\307.01\\\\37.00643\\\\189.9199\\\\307.01\\\\36.42688\\\\188.4199\\\\307.01\\\\35.98225\\\\186.9199\\\\307.01\\\\35.84065\\\\184.9199\\\\307.01\\\\36.01079\\\\183.4199\\\\307.01\\\\36.51752\\\\181.9199\\\\307.01\\\\37.00217\\\\180.9199\\\\307.01\\\\37.99393\\\\179.4199\\\\307.01\\\\39.13579\\\\178.1658\\\\307.01\\\\40.13579\\\\177.278\\\\307.01\\\\41.63579\\\\176.2862\\\\307.01\\\\42.63579\\\\175.8016\\\\307.01\\\\44.13579\\\\175.2949\\\\307.01\\\\45.63579\\\\175.1247\\\\307.01\\\\47.13579\\\\175.2645\\\\307.01\\\\48.63579\\\\175.7045\\\\307.01\\\\54.13579\\\\178.0715\\\\307.01\\\\57.13579\\\\179.0214\\\\307.01\\\\59.63579\\\\179.5239\\\\307.01\\\\63.13579\\\\179.7308\\\\307.01\\\\65.63579\\\\179.6192\\\\307.01\\\\68.63579\\\\179.0896\\\\307.01\\\\70.63579\\\\178.5263\\\\307.01\\\\72.13579\\\\177.9862\\\\307.01\\\\74.13579\\\\177.1148\\\\307.01\\\\76.13579\\\\176.0637\\\\307.01\\\\79.13579\\\\174.0311\\\\307.01\\\\81.0086\\\\172.4199\\\\307.01\\\\82.9529\\\\170.4199\\\\307.01\\\\84.19914\\\\168.9199\\\\307.01\\\\85.26941\\\\167.4199\\\\307.01\\\\86.75175\\\\164.9199\\\\307.01\\\\87.68684\\\\162.9199\\\\307.01\\\\88.77357\\\\159.9199\\\\307.01\\\\89.27562\\\\157.9199\\\\307.01\\\\89.71638\\\\154.9199\\\\307.01\\\\89.82782\\\\152.9199\\\\307.01\\\\89.68684\\\\150.9199\\\\307.01\\\\89.32175\\\\148.4199\\\\307.01\\\\88.83649\\\\146.4199\\\\307.01\\\\88.18999\\\\144.4199\\\\307.01\\\\87.35246\\\\142.4199\\\\307.01\\\\86.33649\\\\140.4199\\\\307.01\\\\84.75857\\\\137.9199\\\\307.01\\\\83.16704\\\\135.9199\\\\307.01\\\\80.63579\\\\133.3393\\\\307.01\\\\79.13579\\\\132.1011\\\\307.01\\\\76.63579\\\\130.3393\\\\307.01\\\\73.63579\\\\128.7339\\\\307.01\\\\71.13579\\\\127.7278\\\\307.01\\\\69.63579\\\\127.2502\\\\307.01\\\\67.63579\\\\126.7701\\\\307.01\\\\64.63579\\\\126.372\\\\307.01\\\\63.13579\\\\126.2701\\\\307.01\\\\61.63579\\\\126.3565\\\\307.01\\\\58.63579\\\\126.7386\\\\307.01\\\\56.13579\\\\127.3393\\\\307.01\\\\54.63579\\\\127.8233\\\\307.01\\\\52.13579\\\\128.8818\\\\307.01\\\\46.13579\\\\132.1365\\\\307.01\\\\45.13579\\\\132.5696\\\\307.01\\\\43.13579\\\\133.1104\\\\307.01\\\\41.13579\\\\133.1027\\\\307.01\\\\39.13579\\\\132.5188\\\\307.01\\\\38.63579\\\\132.4971\\\\307.01\\\\37.13579\\\\134.4706\\\\307.01\\\\35.63579\\\\135.5464\\\\307.01\\\\34.13579\\\\136.0158\\\\307.01\\\\32.63579\\\\135.5587\\\\307.01\\\\31.13579\\\\134.5006\\\\307.01\\\\30.00924\\\\132.9199\\\\307.01\\\\29.57402\\\\131.4199\\\\307.01\\\\30.02434\\\\129.9199\\\\307.01\\\\31.13579\\\\128.4078\\\\307.01\\\\33.07329\\\\126.9199\\\\307.01\\\\33.03827\\\\126.4199\\\\307.01\\\\32.45295\\\\124.4199\\\\307.01\\\\32.44526\\\\122.4199\\\\307.01\\\\32.98225\\\\120.4199\\\\307.01\\\\34.13579\\\\117.8923\\\\307.01\\\\36.2136\\\\113.9199\\\\307.01\\\\37.24707\\\\111.4199\\\\307.01\\\\37.72183\\\\109.9199\\\\307.01\\\\38.31382\\\\107.4199\\\\307.01\\\\38.67046\\\\104.4199\\\\307.01\\\\38.75405\\\\102.9199\\\\307.01\\\\38.3293\\\\98.91986\\\\307.01\\\\37.75405\\\\96.41986\\\\307.01\\\\36.69613\\\\93.41986\\\\307.01\\\\35.77964\\\\91.41986\\\\307.01\\\\34.31382\\\\88.91986\\\\307.01\\\\33.2715\\\\87.41986\\\\307.01\\\\32.13579\\\\86.02634\\\\307.01\\\\30.13579\\\\83.91791\\\\307.01\\\\27.63579\\\\81.7905\\\\307.01\\\\26.13579\\\\80.74847\\\\307.01\\\\23.63579\\\\79.28835\\\\307.01\\\\20.13579\\\\77.79486\\\\307.01\\\\18.63579\\\\77.32851\\\\307.01\\\\16.13579\\\\76.75017\\\\307.01\\\\12.13579\\\\76.35353\\\\307.01\\\\8.135789\\\\76.71637\\\\307.01\\\\5.635788\\\\77.25362\\\\307.01\\\\2.635788\\\\78.25716\\\\307.01\\\\0.6357885\\\\79.18528\\\\307.01\\\\-1.364211\\\\80.26633\\\\307.01\\\\-2.864212\\\\81.25539\\\\307.01\\\\-4.364212\\\\82.38519\\\\307.01\\\\-5.864212\\\\83.69002\\\\307.01\\\\-8.460731\\\\86.41986\\\\307.01\\\\-9.975492\\\\88.41986\\\\307.01\\\\-11.51005\\\\90.91986\\\\307.01\\\\-12.49571\\\\92.91986\\\\307.01\\\\-13.45292\\\\95.41986\\\\307.01\\\\-14.03044\\\\97.41986\\\\307.01\\\\-14.57178\\\\100.4199\\\\307.01\\\\-14.69113\\\\102.9199\\\\307.01\\\\-14.502\\\\106.4199\\\\307.01\\\\-14.00607\\\\108.9199\\\\307.01\\\\-13.05772\\\\111.9199\\\\307.01\\\\-11.97785\\\\114.4199\\\\307.01\\\\-8.843534\\\\119.9199\\\\307.01\\\\-8.178251\\\\121.4199\\\\307.01\\\\-7.722358\\\\122.9199\\\\307.01\\\\-7.57178\\\\124.4199\\\\307.01\\\\-7.64881\\\\125.4199\\\\307.01\\\\-7.944804\\\\126.4199\\\\307.01\\\\-7.864212\\\\127.2299\\\\307.01\\\\-5.864212\\\\128.2935\\\\307.01\\\\-4.207962\\\\129.9199\\\\307.01\\\\-3.203497\\\\131.9199\\\\307.01\\\\-3.045334\\\\132.9199\\\\307.01\\\\-3.208599\\\\133.9199\\\\307.01\\\\-4.270838\\\\135.9199\\\\307.01\\\\-5.364212\\\\137.0193\\\\307.01\\\\-7.364212\\\\138.0806\\\\307.01\\\\-8.364211\\\\138.2472\\\\307.01\\\\-9.364211\\\\138.0891\\\\307.01\\\\-11.36421\\\\137.0818\\\\307.01\\\\-12.99477\\\\135.4199\\\\307.01\\\\-13.86421\\\\133.7608\\\\307.01\\\\-14.36421\\\\133.5952\\\\307.01\\\\-15.86421\\\\134.0404\\\\307.01\\\\-17.36421\\\\134.2123\\\\307.01\\\\-18.86421\\\\134.0696\\\\307.01\\\\-21.86421\\\\133.1043\\\\307.01\\\\-26.86421\\\\130.7191\\\\307.01\\\\-29.36421\\\\129.78\\\\307.01\\\\-31.36421\\\\129.2402\\\\307.01\\\\-34.36421\\\\128.7263\\\\307.01\\\\-36.86421\\\\128.6261\\\\307.01\\\\-39.86421\\\\128.7971\\\\307.01\\\\-42.36421\\\\129.2701\\\\307.01\\\\-44.36421\\\\129.8393\\\\307.01\\\\-46.86421\\\\130.776\\\\307.01\\\\-48.86421\\\\131.7451\\\\307.01\\\\-51.36421\\\\133.2485\\\\307.01\\\\-52.86421\\\\134.3233\\\\307.01\\\\-54.72322\\\\135.9199\\\\307.01\\\\-56.66919\\\\137.9199\\\\307.01\\\\-57.91208\\\\139.4199\\\\307.01\\\\-58.98921\\\\140.9199\\\\307.01\\\\-59.90558\\\\142.4199\\\\307.01\\\\-60.96825\\\\144.4199\\\\307.01\\\\-62.00807\\\\146.9199\\\\307.01\\\\-62.49783\\\\148.4199\\\\307.01\\\\-62.99993\\\\150.4199\\\\307.01\\\\-63.44202\\\\153.4199\\\\307.01\\\\-63.55772\\\\155.4199\\\\307.01\\\\-63.41841\\\\157.4199\\\\307.01\\\\-63.06064\\\\159.9199\\\\307.01\\\\-62.45292\\\\162.4199\\\\307.01\\\\-61.96073\\\\163.9199\\\\307.01\\\\-60.87757\\\\166.4199\\\\307.01\\\\-59.51585\\\\168.9199\\\\307.01\\\\-58.50807\\\\170.4199\\\\307.01\\\\-56.93054\\\\172.4199\\\\307.01\\\\-55.36421\\\\174.0796\\\\307.01\\\\-53.86421\\\\175.4771\\\\307.01\\\\-51.86421\\\\177.0492\\\\307.01\\\\-49.36421\\\\178.6206\\\\307.01\\\\-47.36421\\\\179.634\\\\307.01\\\\-45.36421\\\\180.4612\\\\307.01\\\\-43.36421\\\\181.1119\\\\307.01\\\\-41.36421\\\\181.5929\\\\307.01\\\\-38.36421\\\\182.0059\\\\307.01\\\\-35.86421\\\\182.0576\\\\307.01\\\\-32.36421\\\\181.6177\\\\307.01\\\\-29.86421\\\\181.0239\\\\307.01\\\\-28.36421\\\\180.5358\\\\307.01\\\\-25.86421\\\\179.4891\\\\307.01\\\\-23.36421\\\\178.2178\\\\307.01\\\\-21.36421\\\\177.3183\\\\307.01\\\\-19.36421\\\\176.722\\\\307.01\\\\-17.86421\\\\176.5826\\\\307.01\\\\-16.36421\\\\176.7435\\\\307.01\\\\-14.86421\\\\177.2485\\\\307.01\\\\-12.86421\\\\178.3477\\\\307.01\\\\-11.86421\\\\179.138\\\\307.01\\\\-10.58232\\\\180.4199\\\\307.01\\\\-9.792064\\\\181.4199\\\\307.01\\\\-8.69282\\\\183.4199\\\\307.01\\\\-8.187816\\\\184.9199\\\\307.01\\\\-8.02691\\\\186.4199\\\\307.01\\\\-8.145048\\\\187.9199\\\\307.01\\\\-8.676711\\\\189.9199\\\\307.01\\\\-9.252931\\\\191.4199\\\\307.01\\\\-9.970693\\\\192.9199\\\\307.01\\\\-10.97549\\\\195.4199\\\\307.01\\\\-11.45025\\\\196.9199\\\\307.01\\\\-12.04224\\\\199.4199\\\\307.01\\\\-12.39888\\\\202.4199\\\\307.01\\\\-12.48248\\\\203.9199\\\\307.01\\\\-12.05772\\\\207.9199\\\\307.01\\\\-11.48475\\\\210.4199\\\\307.01\\\\-10.42456\\\\213.4199\\\\307.01\\\\-9.508066\\\\215.4199\\\\307.01\\\\-8.042242\\\\217.9199\\\\307.01\\\\-6.999926\\\\219.4199\\\\307.01\\\\-4.870026\\\\221.9199\\\\307.01\\\\-2.752931\\\\223.9199\\\\307.01\\\\-1.364211\\\\225.0492\\\\307.01\\\\0.1357885\\\\226.0912\\\\307.01\\\\2.635788\\\\227.5514\\\\307.01\\\\6.135788\\\\229.0449\\\\307.01\\\\7.635788\\\\229.5112\\\\307.01\\\\10.13579\\\\230.0896\\\\307.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"270\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"18\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.13579\\\\230.4862\\\\310.01\\\\18.13579\\\\230.1234\\\\310.01\\\\20.63579\\\\229.5843\\\\310.01\\\\23.63579\\\\228.5826\\\\310.01\\\\25.63579\\\\227.6544\\\\310.01\\\\27.63579\\\\226.5734\\\\310.01\\\\29.13579\\\\225.5843\\\\310.01\\\\30.63579\\\\224.4545\\\\310.01\\\\32.13579\\\\223.1497\\\\310.01\\\\34.73231\\\\220.4199\\\\310.01\\\\36.24707\\\\218.4199\\\\310.01\\\\37.78162\\\\215.9199\\\\310.01\\\\38.76729\\\\213.9199\\\\310.01\\\\39.7245\\\\211.4199\\\\310.01\\\\40.30202\\\\209.4199\\\\310.01\\\\40.84336\\\\206.4199\\\\310.01\\\\40.96271\\\\203.9199\\\\310.01\\\\40.77357\\\\200.4199\\\\310.01\\\\40.27764\\\\197.9199\\\\310.01\\\\39.3293\\\\194.9199\\\\310.01\\\\38.71912\\\\193.4199\\\\310.01\\\\37.00643\\\\189.9199\\\\310.01\\\\36.42688\\\\188.4199\\\\310.01\\\\35.98225\\\\186.9199\\\\310.01\\\\35.83789\\\\184.9199\\\\310.01\\\\35.988\\\\183.4199\\\\310.01\\\\36.26941\\\\182.4199\\\\310.01\\\\36.26491\\\\181.4199\\\\310.01\\\\34.99829\\\\179.9199\\\\310.01\\\\34.38188\\\\178.9199\\\\310.01\\\\33.88579\\\\177.4199\\\\310.01\\\\34.07719\\\\176.4199\\\\310.01\\\\34.63116\\\\175.4199\\\\310.01\\\\35.63579\\\\174.4152\\\\310.01\\\\36.63579\\\\173.8545\\\\310.01\\\\37.63579\\\\173.6662\\\\310.01\\\\39.13579\\\\174.166\\\\310.01\\\\40.13579\\\\174.7764\\\\310.01\\\\41.13579\\\\175.6614\\\\310.01\\\\42.13579\\\\175.9128\\\\310.01\\\\44.13579\\\\175.2927\\\\310.01\\\\45.63579\\\\175.1247\\\\310.01\\\\47.13579\\\\175.2645\\\\310.01\\\\48.63579\\\\175.7045\\\\310.01\\\\54.13579\\\\178.0715\\\\310.01\\\\57.13579\\\\179.0214\\\\310.01\\\\59.63579\\\\179.5239\\\\310.01\\\\63.13579\\\\179.7308\\\\310.01\\\\65.63579\\\\179.6192\\\\310.01\\\\68.63579\\\\179.0896\\\\310.01\\\\70.63579\\\\178.5263\\\\310.01\\\\72.13579\\\\177.9862\\\\310.01\\\\74.13579\\\\177.1148\\\\310.01\\\\76.13579\\\\176.0637\\\\310.01\\\\79.13579\\\\174.0311\\\\310.01\\\\81.0086\\\\172.4199\\\\310.01\\\\82.9529\\\\170.4199\\\\310.01\\\\84.19914\\\\168.9199\\\\310.01\\\\85.26941\\\\167.4199\\\\310.01\\\\86.75175\\\\164.9199\\\\310.01\\\\87.68684\\\\162.9199\\\\310.01\\\\88.77357\\\\159.9199\\\\310.01\\\\89.27562\\\\157.9199\\\\310.01\\\\89.71638\\\\154.9199\\\\310.01\\\\89.82782\\\\152.9199\\\\310.01\\\\89.68684\\\\150.9199\\\\310.01\\\\89.32175\\\\148.4199\\\\310.01\\\\88.83649\\\\146.4199\\\\310.01\\\\88.18999\\\\144.4199\\\\310.01\\\\87.35246\\\\142.4199\\\\310.01\\\\86.33649\\\\140.4199\\\\310.01\\\\84.75857\\\\137.9199\\\\310.01\\\\83.16704\\\\135.9199\\\\310.01\\\\80.63579\\\\133.3393\\\\310.01\\\\79.13579\\\\132.1011\\\\310.01\\\\76.63579\\\\130.3393\\\\310.01\\\\73.63579\\\\128.7339\\\\310.01\\\\71.13579\\\\127.7278\\\\310.01\\\\69.63579\\\\127.2502\\\\310.01\\\\67.63579\\\\126.7701\\\\310.01\\\\64.63579\\\\126.372\\\\310.01\\\\63.13579\\\\126.2701\\\\310.01\\\\61.63579\\\\126.3565\\\\310.01\\\\58.63579\\\\126.7386\\\\310.01\\\\56.13579\\\\127.3393\\\\310.01\\\\54.63579\\\\127.8233\\\\310.01\\\\52.13579\\\\128.8818\\\\310.01\\\\46.13579\\\\132.1365\\\\310.01\\\\45.13579\\\\132.5696\\\\310.01\\\\42.13579\\\\133.3956\\\\310.01\\\\41.55696\\\\133.9199\\\\310.01\\\\40.21622\\\\135.9199\\\\310.01\\\\38.63579\\\\137.4791\\\\310.01\\\\37.13579\\\\138.4632\\\\310.01\\\\35.63579\\\\139.1069\\\\310.01\\\\34.13579\\\\139.3742\\\\310.01\\\\32.13579\\\\139.0896\\\\310.01\\\\30.13579\\\\138.1211\\\\310.01\\\\28.68742\\\\136.9199\\\\310.01\\\\27.43292\\\\135.4199\\\\310.01\\\\26.47601\\\\133.4199\\\\310.01\\\\26.25527\\\\131.4199\\\\310.01\\\\26.50186\\\\129.9199\\\\310.01\\\\27.44195\\\\127.9199\\\\310.01\\\\28.58762\\\\126.4199\\\\310.01\\\\29.65523\\\\125.4199\\\\310.01\\\\31.63579\\\\124.0459\\\\310.01\\\\32.17715\\\\123.4199\\\\310.01\\\\32.98225\\\\120.4199\\\\310.01\\\\34.13579\\\\117.8923\\\\310.01\\\\36.2136\\\\113.9199\\\\310.01\\\\37.24707\\\\111.4199\\\\310.01\\\\37.72183\\\\109.9199\\\\310.01\\\\38.31382\\\\107.4199\\\\310.01\\\\38.67046\\\\104.4199\\\\310.01\\\\38.75405\\\\102.9199\\\\310.01\\\\38.3293\\\\98.91986\\\\310.01\\\\37.75405\\\\96.41986\\\\310.01\\\\36.69613\\\\93.41986\\\\310.01\\\\35.77964\\\\91.41986\\\\310.01\\\\34.31382\\\\88.91986\\\\310.01\\\\33.2715\\\\87.41986\\\\310.01\\\\32.13579\\\\86.02634\\\\310.01\\\\30.13579\\\\83.91791\\\\310.01\\\\27.63579\\\\81.7905\\\\310.01\\\\26.13579\\\\80.74847\\\\310.01\\\\23.63579\\\\79.28835\\\\310.01\\\\20.13579\\\\77.79486\\\\310.01\\\\18.63579\\\\77.32851\\\\310.01\\\\16.13579\\\\76.75017\\\\310.01\\\\12.13579\\\\76.35353\\\\310.01\\\\8.135789\\\\76.71637\\\\310.01\\\\5.635788\\\\77.25362\\\\310.01\\\\2.635788\\\\78.25716\\\\310.01\\\\0.6357885\\\\79.18528\\\\310.01\\\\-1.364211\\\\80.26633\\\\310.01\\\\-2.864212\\\\81.25539\\\\310.01\\\\-4.364212\\\\82.38519\\\\310.01\\\\-5.864212\\\\83.69002\\\\310.01\\\\-8.460731\\\\86.41986\\\\310.01\\\\-9.975492\\\\88.41986\\\\310.01\\\\-11.51005\\\\90.91986\\\\310.01\\\\-12.49571\\\\92.91986\\\\310.01\\\\-13.45292\\\\95.41986\\\\310.01\\\\-14.03044\\\\97.41986\\\\310.01\\\\-14.57178\\\\100.4199\\\\310.01\\\\-14.69113\\\\102.9199\\\\310.01\\\\-14.502\\\\106.4199\\\\310.01\\\\-14.00607\\\\108.9199\\\\310.01\\\\-13.05772\\\\111.9199\\\\310.01\\\\-11.97785\\\\114.4199\\\\310.01\\\\-8.843534\\\\119.9199\\\\310.01\\\\-8.175187\\\\121.4199\\\\310.01\\\\-7.470693\\\\123.9199\\\\310.01\\\\-6.864212\\\\124.6244\\\\310.01\\\\-5.364212\\\\125.3065\\\\310.01\\\\-3.864212\\\\126.3094\\\\310.01\\\\-2.211956\\\\127.9199\\\\310.01\\\\-1.176711\\\\129.4199\\\\310.01\\\\-0.6816457\\\\130.4199\\\\310.01\\\\-0.188405\\\\131.9199\\\\310.01\\\\-0.08336733\\\\132.9199\\\\310.01\\\\-0.247305\\\\134.4199\\\\310.01\\\\-0.8017115\\\\135.9199\\\\310.01\\\\-1.679097\\\\137.4199\\\\310.01\\\\-2.581154\\\\138.4199\\\\310.01\\\\-3.864212\\\\139.5973\\\\310.01\\\\-5.364212\\\\140.4625\\\\310.01\\\\-6.864212\\\\141.0252\\\\310.01\\\\-8.364211\\\\141.2053\\\\310.01\\\\-9.364211\\\\141.101\\\\310.01\\\\-10.86421\\\\140.6143\\\\310.01\\\\-11.86421\\\\140.1195\\\\310.01\\\\-13.36421\\\\139.0945\\\\310.01\\\\-15.00626\\\\137.4199\\\\310.01\\\\-16.86421\\\\134.6526\\\\310.01\\\\-17.36421\\\\134.3886\\\\310.01\\\\-18.86421\\\\134.0912\\\\310.01\\\\-21.86421\\\\133.1043\\\\310.01\\\\-26.86421\\\\130.7191\\\\310.01\\\\-29.36421\\\\129.78\\\\310.01\\\\-31.36421\\\\129.2402\\\\310.01\\\\-34.36421\\\\128.7263\\\\310.01\\\\-36.86421\\\\128.6261\\\\310.01\\\\-39.86421\\\\128.7971\\\\310.01\\\\-42.36421\\\\129.2701\\\\310.01\\\\-44.36421\\\\129.8393\\\\310.01\\\\-46.86421\\\\130.776\\\\310.01\\\\-48.86421\\\\131.7451\\\\310.01\\\\-51.36421\\\\133.2485\\\\310.01\\\\-52.86421\\\\134.3233\\\\310.01\\\\-54.72322\\\\135.9199\\\\310.01\\\\-56.66919\\\\137.9199\\\\310.01\\\\-57.91208\\\\139.4199\\\\310.01\\\\-58.98921\\\\140.9199\\\\310.01\\\\-59.90558\\\\142.4199\\\\310.01\\\\-60.96825\\\\144.4199\\\\310.01\\\\-62.00807\\\\146.9199\\\\310.01\\\\-62.49783\\\\148.4199\\\\310.01\\\\-62.99993\\\\150.4199\\\\310.01\\\\-63.44202\\\\153.4199\\\\310.01\\\\-63.55772\\\\155.4199\\\\310.01\\\\-63.41841\\\\157.4199\\\\310.01\\\\-63.06064\\\\159.9199\\\\310.01\\\\-62.45292\\\\162.4199\\\\310.01\\\\-61.96073\\\\163.9199\\\\310.01\\\\-60.87757\\\\166.4199\\\\310.01\\\\-59.51585\\\\168.9199\\\\310.01\\\\-58.50807\\\\170.4199\\\\310.01\\\\-56.93054\\\\172.4199\\\\310.01\\\\-55.36421\\\\174.0796\\\\310.01\\\\-53.86421\\\\175.4771\\\\310.01\\\\-51.86421\\\\177.0492\\\\310.01\\\\-49.36421\\\\178.6206\\\\310.01\\\\-47.36421\\\\179.634\\\\310.01\\\\-45.36421\\\\180.4612\\\\310.01\\\\-43.36421\\\\181.1119\\\\310.01\\\\-41.36421\\\\181.5929\\\\310.01\\\\-38.36421\\\\182.0059\\\\310.01\\\\-35.86421\\\\182.0576\\\\310.01\\\\-32.36421\\\\181.6177\\\\310.01\\\\-29.86421\\\\181.0239\\\\310.01\\\\-28.36421\\\\180.5358\\\\310.01\\\\-25.86421\\\\179.4891\\\\310.01\\\\-23.36421\\\\178.2178\\\\310.01\\\\-21.36421\\\\177.3183\\\\310.01\\\\-19.36421\\\\176.722\\\\310.01\\\\-17.86421\\\\176.5789\\\\310.01\\\\-15.86421\\\\176.8016\\\\310.01\\\\-14.86421\\\\177.0947\\\\310.01\\\\-13.86421\\\\177.1754\\\\310.01\\\\-13.38972\\\\176.9199\\\\310.01\\\\-12.40512\\\\175.4199\\\\310.01\\\\-10.86421\\\\174.216\\\\310.01\\\\-9.864211\\\\173.802\\\\310.01\\\\-8.864211\\\\173.8091\\\\310.01\\\\-7.864212\\\\174.2572\\\\310.01\\\\-6.864212\\\\175.0914\\\\310.01\\\\-6.193576\\\\175.9199\\\\310.01\\\\-5.746355\\\\176.9199\\\\310.01\\\\-5.739212\\\\177.9199\\\\310.01\\\\-6.144981\\\\178.9199\\\\310.01\\\\-7.364212\\\\180.5032\\\\310.01\\\\-8.680878\\\\181.4199\\\\310.01\\\\-8.937325\\\\181.9199\\\\310.01\\\\-8.250575\\\\184.4199\\\\310.01\\\\-8.025116\\\\186.4199\\\\310.01\\\\-8.145048\\\\187.9199\\\\310.01\\\\-8.676711\\\\189.9199\\\\310.01\\\\-9.252931\\\\191.4199\\\\310.01\\\\-9.970693\\\\192.9199\\\\310.01\\\\-10.97549\\\\195.4199\\\\310.01\\\\-11.45025\\\\196.9199\\\\310.01\\\\-12.04224\\\\199.4199\\\\310.01\\\\-12.39888\\\\202.4199\\\\310.01\\\\-12.48248\\\\203.9199\\\\310.01\\\\-12.05772\\\\207.9199\\\\310.01\\\\-11.48475\\\\210.4199\\\\310.01\\\\-10.42456\\\\213.4199\\\\310.01\\\\-9.508066\\\\215.4199\\\\310.01\\\\-8.042242\\\\217.9199\\\\310.01\\\\-6.999926\\\\219.4199\\\\310.01\\\\-4.870026\\\\221.9199\\\\310.01\\\\-2.752931\\\\223.9199\\\\310.01\\\\-1.364211\\\\225.0492\\\\310.01\\\\0.1357885\\\\226.0912\\\\310.01\\\\2.635788\\\\227.5514\\\\310.01\\\\6.135788\\\\229.0449\\\\310.01\\\\7.635788\\\\229.5112\\\\310.01\\\\10.13579\\\\230.0896\\\\310.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"272\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"19\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"45.13579\\\\174.0365\\\\313.01\\\\49.63579\\\\175.8393\\\\313.01\\\\53.13579\\\\177.5358\\\\313.01\\\\56.13579\\\\178.6134\\\\313.01\\\\57.63579\\\\179.0189\\\\313.01\\\\60.63579\\\\179.5311\\\\313.01\\\\62.13579\\\\179.634\\\\313.01\\\\64.13579\\\\179.6288\\\\313.01\\\\65.63579\\\\179.4949\\\\313.01\\\\68.13579\\\\179.0826\\\\313.01\\\\70.13579\\\\178.5597\\\\313.01\\\\71.63579\\\\178.0576\\\\313.01\\\\74.13579\\\\176.992\\\\313.01\\\\76.63579\\\\175.6117\\\\313.01\\\\77.63579\\\\174.9709\\\\313.01\\\\79.63579\\\\173.4802\\\\313.01\\\\81.13579\\\\172.141\\\\313.01\\\\83.24468\\\\169.9199\\\\313.01\\\\84.78358\\\\167.9199\\\\313.01\\\\86.33118\\\\165.4199\\\\313.01\\\\87.33508\\\\163.4199\\\\313.01\\\\88.32481\\\\160.9199\\\\313.01\\\\88.79119\\\\159.4199\\\\313.01\\\\89.33366\\\\156.9199\\\\313.01\\\\89.63774\\\\153.9199\\\\313.01\\\\89.66704\\\\152.4199\\\\313.01\\\\89.30026\\\\148.9199\\\\313.01\\\\88.71638\\\\146.4199\\\\313.01\\\\88.25405\\\\144.9199\\\\313.01\\\\87.24943\\\\142.4199\\\\313.01\\\\86.76299\\\\141.4199\\\\313.01\\\\85.29488\\\\138.9199\\\\313.01\\\\84.24227\\\\137.4199\\\\313.01\\\\83.13579\\\\136.0748\\\\313.01\\\\81.58791\\\\134.4199\\\\313.01\\\\79.95832\\\\132.9199\\\\313.01\\\\78.63579\\\\131.8477\\\\313.01\\\\77.13579\\\\130.7949\\\\313.01\\\\75.63579\\\\129.9028\\\\313.01\\\\73.63579\\\\128.8657\\\\313.01\\\\71.13579\\\\127.8535\\\\313.01\\\\69.13579\\\\127.2418\\\\313.01\\\\66.63579\\\\126.722\\\\313.01\\\\63.63579\\\\126.4741\\\\313.01\\\\62.63579\\\\126.4677\\\\313.01\\\\59.13579\\\\126.7663\\\\313.01\\\\56.63579\\\\127.3183\\\\313.01\\\\55.13579\\\\127.7721\\\\313.01\\\\52.63579\\\\128.7645\\\\313.01\\\\50.63579\\\\129.776\\\\313.01\\\\48.13579\\\\131.2884\\\\313.01\\\\45.13579\\\\133.2862\\\\313.01\\\\43.81487\\\\134.4199\\\\313.01\\\\42.44948\\\\135.9199\\\\313.01\\\\40.76783\\\\137.9199\\\\313.01\\\\39.63579\\\\138.9596\\\\313.01\\\\38.13579\\\\140.0828\\\\313.01\\\\36.13579\\\\141.1221\\\\313.01\\\\34.63579\\\\141.6103\\\\313.01\\\\33.13579\\\\141.7315\\\\313.01\\\\32.13579\\\\141.6267\\\\313.01\\\\30.63579\\\\141.1365\\\\313.01\\\\28.63579\\\\140.0659\\\\313.01\\\\27.2121\\\\138.9199\\\\313.01\\\\26.13579\\\\137.8833\\\\313.01\\\\24.93796\\\\136.4199\\\\313.01\\\\23.94562\\\\134.4199\\\\313.01\\\\23.68623\\\\132.9199\\\\313.01\\\\23.94523\\\\130.9199\\\\313.01\\\\24.50558\\\\129.4199\\\\313.01\\\\25.96752\\\\126.9199\\\\313.01\\\\27.13579\\\\125.5354\\\\313.01\\\\28.23917\\\\124.4199\\\\313.01\\\\30.50511\\\\122.4199\\\\313.01\\\\32.27399\\\\120.4199\\\\313.01\\\\33.26515\\\\118.9199\\\\313.01\\\\34.76941\\\\116.4199\\\\313.01\\\\35.8293\\\\114.4199\\\\313.01\\\\36.74227\\\\112.4199\\\\313.01\\\\37.74227\\\\109.4199\\\\313.01\\\\38.34469\\\\106.4199\\\\313.01\\\\38.54975\\\\103.4199\\\\313.01\\\\38.35495\\\\99.91986\\\\313.01\\\\37.76941\\\\96.91986\\\\313.01\\\\36.78162\\\\93.91986\\\\313.01\\\\35.36021\\\\90.91986\\\\313.01\\\\33.83302\\\\88.41986\\\\313.01\\\\32.73983\\\\86.91986\\\\313.01\\\\31.13579\\\\85.08799\\\\313.01\\\\29.96766\\\\83.91986\\\\313.01\\\\28.13579\\\\82.3208\\\\313.01\\\\25.13579\\\\80.25896\\\\313.01\\\\22.13579\\\\78.72199\\\\313.01\\\\19.63579\\\\77.75362\\\\313.01\\\\18.13579\\\\77.31338\\\\313.01\\\\15.63579\\\\76.78624\\\\313.01\\\\12.13579\\\\76.54264\\\\313.01\\\\9.135789\\\\76.69946\\\\313.01\\\\6.135788\\\\77.24847\\\\313.01\\\\4.135788\\\\77.83652\\\\313.01\\\\1.635789\\\\78.81096\\\\313.01\\\\0.6357885\\\\79.28624\\\\313.01\\\\-1.864211\\\\80.72861\\\\313.01\\\\-3.364212\\\\81.75896\\\\313.01\\\\-5.864212\\\\83.83652\\\\313.01\\\\-7.433468\\\\85.41986\\\\313.01\\\\-9.477848\\\\87.91986\\\\313.01\\\\-11.07731\\\\90.41986\\\\313.01\\\\-12.56631\\\\93.41986\\\\313.01\\\\-13.49357\\\\95.91986\\\\313.01\\\\-14.02512\\\\97.91986\\\\313.01\\\\-14.45556\\\\100.4199\\\\313.01\\\\-14.60266\\\\102.4199\\\\313.01\\\\-14.50807\\\\105.4199\\\\313.01\\\\-14.00404\\\\108.4199\\\\313.01\\\\-13.45556\\\\110.4199\\\\313.01\\\\-12.93347\\\\111.9199\\\\313.01\\\\-12.06961\\\\113.9199\\\\313.01\\\\-11.03044\\\\115.9199\\\\313.01\\\\-9.447545\\\\118.4199\\\\313.01\\\\-7.028274\\\\121.9199\\\\313.01\\\\-5.864212\\\\123.1258\\\\313.01\\\\-3.364212\\\\124.8657\\\\313.01\\\\-1.605229\\\\126.4199\\\\313.01\\\\-0.2548365\\\\127.9199\\\\313.01\\\\0.7884731\\\\129.4199\\\\313.01\\\\1.803042\\\\131.4199\\\\313.01\\\\2.263741\\\\132.9199\\\\313.01\\\\2.37004\\\\133.9199\\\\313.01\\\\2.269263\\\\134.9199\\\\313.01\\\\1.749628\\\\136.4199\\\\313.01\\\\0.8712052\\\\137.9199\\\\313.01\\\\-0.3263327\\\\139.4199\\\\313.01\\\\-1.364211\\\\140.4421\\\\313.01\\\\-2.864212\\\\141.6427\\\\313.01\\\\-4.364212\\\\142.5469\\\\313.01\\\\-5.864212\\\\143.1195\\\\313.01\\\\-7.364212\\\\143.3308\\\\313.01\\\\-9.364211\\\\143.0816\\\\313.01\\\\-11.86421\\\\142.0038\\\\313.01\\\\-13.86421\\\\140.6465\\\\313.01\\\\-15.36421\\\\139.234\\\\313.01\\\\-16.5498\\\\137.9199\\\\313.01\\\\-17.74925\\\\136.4199\\\\313.01\\\\-18.36421\\\\135.8188\\\\313.01\\\\-19.86421\\\\134.709\\\\313.01\\\\-23.86421\\\\132.3233\\\\313.01\\\\-26.86421\\\\130.8365\\\\313.01\\\\-29.86421\\\\129.7536\\\\313.01\\\\-31.86421\\\\129.2502\\\\313.01\\\\-34.36421\\\\128.8535\\\\313.01\\\\-36.86421\\\\128.6958\\\\313.01\\\\-38.86421\\\\128.7993\\\\313.01\\\\-41.86421\\\\129.278\\\\313.01\\\\-43.86421\\\\129.8016\\\\313.01\\\\-45.36421\\\\130.3039\\\\313.01\\\\-47.86421\\\\131.3785\\\\313.01\\\\-50.36421\\\\132.7435\\\\313.01\\\\-51.86421\\\\133.7382\\\\313.01\\\\-53.36421\\\\134.8785\\\\313.01\\\\-55.58069\\\\136.9199\\\\313.01\\\\-56.96327\\\\138.4199\\\\313.01\\\\-58.502\\\\140.4199\\\\313.01\\\\-60.05171\\\\142.9199\\\\313.01\\\\-61.05772\\\\144.9199\\\\313.01\\\\-62.04862\\\\147.4199\\\\313.01\\\\-62.51394\\\\148.9199\\\\313.01\\\\-63.05919\\\\151.4199\\\\313.01\\\\-63.42757\\\\155.4199\\\\313.01\\\\-63.03729\\\\159.4199\\\\313.01\\\\-62.47549\\\\161.9199\\\\313.01\\\\-61.44202\\\\164.9199\\\\313.01\\\\-60.51775\\\\166.9199\\\\313.01\\\\-59.04568\\\\169.4199\\\\313.01\\\\-57.99572\\\\170.9199\\\\313.01\\\\-56.36421\\\\172.8595\\\\313.01\\\\-55.36421\\\\173.9179\\\\313.01\\\\-53.73056\\\\175.4199\\\\313.01\\\\-52.36421\\\\176.5381\\\\313.01\\\\-50.86421\\\\177.5843\\\\313.01\\\\-48.36421\\\\179.0449\\\\313.01\\\\-47.36421\\\\179.5287\\\\313.01\\\\-44.86421\\\\180.5263\\\\313.01\\\\-42.86421\\\\181.1177\\\\313.01\\\\-40.86421\\\\181.5676\\\\313.01\\\\-37.36421\\\\181.9065\\\\313.01\\\\-36.36421\\\\181.914\\\\313.01\\\\-33.36421\\\\181.6486\\\\313.01\\\\-30.36421\\\\181.0404\\\\313.01\\\\-28.86421\\\\180.5826\\\\313.01\\\\-26.36421\\\\179.5878\\\\313.01\\\\-24.36421\\\\178.5929\\\\313.01\\\\-20.86421\\\\176.7294\\\\313.01\\\\-18.36421\\\\175.6257\\\\313.01\\\\-17.36421\\\\175.0934\\\\313.01\\\\-16.58718\\\\174.4199\\\\313.01\\\\-13.86421\\\\171.7129\\\\313.01\\\\-12.36421\\\\170.7226\\\\313.01\\\\-11.36421\\\\170.2449\\\\313.01\\\\-9.864211\\\\169.8028\\\\313.01\\\\-8.364211\\\\169.7928\\\\313.01\\\\-6.864212\\\\170.2438\\\\313.01\\\\-5.864212\\\\170.7449\\\\313.01\\\\-4.364212\\\\171.9052\\\\313.01\\\\-2.711557\\\\173.9199\\\\313.01\\\\-2.21085\\\\174.9199\\\\313.01\\\\-1.762128\\\\176.4199\\\\313.01\\\\-1.727673\\\\177.9199\\\\313.01\\\\-2.167647\\\\179.4199\\\\313.01\\\\-3.207707\\\\181.4199\\\\313.01\\\\-5.876966\\\\184.4199\\\\313.01\\\\-6.53835\\\\185.4199\\\\313.01\\\\-7.7156\\\\188.4199\\\\313.01\\\\-10.04546\\\\193.4199\\\\313.01\\\\-11.02147\\\\195.9199\\\\313.01\\\\-11.47069\\\\197.4199\\\\313.01\\\\-12.012\\\\199.9199\\\\313.01\\\\-12.28921\\\\203.9199\\\\313.01\\\\-12.08461\\\\206.9199\\\\313.01\\\\-11.49571\\\\209.9199\\\\313.01\\\\-10.51005\\\\212.9199\\\\313.01\\\\-9.600636\\\\214.9199\\\\313.01\\\\-8.53218\\\\216.9199\\\\313.01\\\\-6.468249\\\\219.9199\\\\313.01\\\\-4.864212\\\\221.7517\\\\313.01\\\\-3.695094\\\\222.9199\\\\313.01\\\\-1.864211\\\\224.5189\\\\313.01\\\\1.135789\\\\226.5789\\\\313.01\\\\4.135788\\\\228.1177\\\\313.01\\\\6.635788\\\\229.0843\\\\313.01\\\\8.135789\\\\229.5239\\\\313.01\\\\10.63579\\\\230.0514\\\\313.01\\\\14.13579\\\\230.2971\\\\313.01\\\\17.13579\\\\230.1403\\\\313.01\\\\20.13579\\\\229.5878\\\\313.01\\\\22.13579\\\\229.0004\\\\313.01\\\\24.63579\\\\228.0287\\\\313.01\\\\25.63579\\\\227.5514\\\\313.01\\\\28.13579\\\\226.1111\\\\313.01\\\\29.63579\\\\225.0808\\\\313.01\\\\32.13579\\\\223.0032\\\\313.01\\\\33.70211\\\\221.4199\\\\313.01\\\\35.74942\\\\218.9199\\\\313.01\\\\37.34888\\\\216.4199\\\\313.01\\\\38.83649\\\\213.4199\\\\313.01\\\\39.76298\\\\210.9199\\\\313.01\\\\40.29488\\\\208.9199\\\\313.01\\\\40.7245\\\\206.4199\\\\313.01\\\\40.87313\\\\204.4199\\\\313.01\\\\40.84863\\\\202.4199\\\\313.01\\\\40.70794\\\\200.9199\\\\313.01\\\\40.27562\\\\198.4199\\\\313.01\\\\39.72713\\\\196.4199\\\\313.01\\\\39.20504\\\\194.9199\\\\313.01\\\\38.34256\\\\192.9199\\\\313.01\\\\36.03673\\\\188.4199\\\\313.01\\\\35.18366\\\\186.4199\\\\313.01\\\\34.37849\\\\184.9199\\\\313.01\\\\31.46317\\\\181.4199\\\\313.01\\\\30.60703\\\\179.9199\\\\313.01\\\\29.99819\\\\178.4199\\\\313.01\\\\29.80047\\\\176.9199\\\\313.01\\\\29.96704\\\\175.4199\\\\313.01\\\\30.57026\\\\173.9199\\\\313.01\\\\31.56785\\\\172.4199\\\\313.01\\\\32.63579\\\\171.3258\\\\313.01\\\\34.13579\\\\170.2914\\\\313.01\\\\35.63579\\\\169.7194\\\\313.01\\\\36.63579\\\\169.5831\\\\313.01\\\\38.63579\\\\169.7668\\\\313.01\\\\40.13579\\\\170.3782\\\\313.01\\\\41.63579\\\\171.2379\\\\313.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"277\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"25.13579\\\\125.7391\\\\316.01\\\\29.49653\\\\121.9199\\\\316.01\\\\31.13579\\\\120.2483\\\\316.01\\\\32.28399\\\\118.9199\\\\316.01\\\\33.71638\\\\116.9199\\\\316.01\\\\35.1454\\\\114.4199\\\\316.01\\\\36.28551\\\\111.9199\\\\316.01\\\\37.23983\\\\108.9199\\\\316.01\\\\37.85425\\\\105.4199\\\\316.01\\\\37.94677\\\\102.9199\\\\316.01\\\\37.75405\\\\99.91986\\\\316.01\\\\37.26729\\\\97.41986\\\\316.01\\\\36.3198\\\\94.41986\\\\316.01\\\\35.22183\\\\91.91986\\\\316.01\\\\33.79257\\\\89.41986\\\\316.01\\\\32.75317\\\\87.91986\\\\316.01\\\\31.13579\\\\85.97396\\\\316.01\\\\30.13579\\\\84.91024\\\\316.01\\\\28.50211\\\\83.41986\\\\316.01\\\\27.13579\\\\82.31029\\\\316.01\\\\25.63579\\\\81.27071\\\\316.01\\\\23.13579\\\\79.8506\\\\316.01\\\\20.63579\\\\78.75362\\\\316.01\\\\17.63579\\\\77.8183\\\\316.01\\\\15.13579\\\\77.34204\\\\316.01\\\\12.13579\\\\77.14066\\\\316.01\\\\9.135789\\\\77.29932\\\\316.01\\\\6.635788\\\\77.75716\\\\316.01\\\\4.635788\\\\78.30858\\\\316.01\\\\2.135788\\\\79.25539\\\\316.01\\\\0.1357885\\\\80.2317\\\\316.01\\\\-2.364212\\\\81.76813\\\\316.01\\\\-4.364212\\\\83.29879\\\\316.01\\\\-6.115665\\\\84.91986\\\\316.01\\\\-7.947545\\\\86.91986\\\\316.01\\\\-9.447545\\\\88.91986\\\\316.01\\\\-10.96327\\\\91.41986\\\\316.01\\\\-11.91527\\\\93.41986\\\\316.01\\\\-13.00807\\\\96.41986\\\\316.01\\\\-13.50807\\\\98.41986\\\\316.01\\\\-13.93921\\\\101.4199\\\\316.01\\\\-14.03218\\\\102.9199\\\\316.01\\\\-13.97549\\\\104.4199\\\\316.01\\\\-13.48699\\\\107.9199\\\\316.01\\\\-12.97549\\\\109.9199\\\\316.01\\\\-12.48018\\\\111.4199\\\\316.01\\\\-11.40558\\\\113.9199\\\\316.01\\\\-10.02949\\\\116.4199\\\\316.01\\\\-9.019734\\\\117.9199\\\\316.01\\\\-7.430538\\\\119.9199\\\\316.01\\\\-5.864212\\\\121.586\\\\316.01\\\\-4.864212\\\\122.5021\\\\316.01\\\\-2.864212\\\\124.1116\\\\316.01\\\\-1.364211\\\\125.2054\\\\316.01\\\\1.135789\\\\127.2049\\\\316.01\\\\2.936209\\\\128.9199\\\\316.01\\\\4.82263\\\\130.9199\\\\316.01\\\\6.264465\\\\132.9199\\\\316.01\\\\6.784093\\\\133.9199\\\\316.01\\\\7.031243\\\\134.9199\\\\316.01\\\\6.765253\\\\135.9199\\\\316.01\\\\5.798487\\\\137.4199\\\\316.01\\\\4.889261\\\\138.4199\\\\316.01\\\\2.635788\\\\140.5555\\\\316.01\\\\1.135789\\\\141.7674\\\\316.01\\\\-1.364211\\\\144.0751\\\\316.01\\\\-3.364212\\\\145.6282\\\\316.01\\\\-5.364212\\\\146.6321\\\\316.01\\\\-6.364212\\\\146.802\\\\316.01\\\\-7.864212\\\\146.5771\\\\316.01\\\\-9.864211\\\\145.615\\\\316.01\\\\-11.36421\\\\144.6044\\\\316.01\\\\-13.36421\\\\142.8379\\\\316.01\\\\-15.36421\\\\140.7688\\\\316.01\\\\-17.86421\\\\137.9523\\\\316.01\\\\-18.86421\\\\136.9179\\\\316.01\\\\-21.36421\\\\134.7479\\\\316.01\\\\-24.36421\\\\132.7573\\\\316.01\\\\-26.36421\\\\131.7247\\\\316.01\\\\-28.86421\\\\130.7191\\\\316.01\\\\-30.36421\\\\130.2485\\\\316.01\\\\-32.36421\\\\129.7721\\\\316.01\\\\-35.86421\\\\129.3365\\\\316.01\\\\-37.86421\\\\129.3449\\\\316.01\\\\-41.36421\\\\129.7971\\\\316.01\\\\-43.36421\\\\130.2884\\\\316.01\\\\-46.36421\\\\131.3565\\\\316.01\\\\-48.36421\\\\132.2884\\\\316.01\\\\-50.86421\\\\133.767\\\\316.01\\\\-52.86421\\\\135.2392\\\\316.01\\\\-54.72205\\\\136.9199\\\\316.01\\\\-57.00942\\\\139.4199\\\\316.01\\\\-58.45816\\\\141.4199\\\\316.01\\\\-59.07794\\\\142.4199\\\\316.01\\\\-60.38489\\\\144.9199\\\\316.01\\\\-61.03985\\\\146.4199\\\\316.01\\\\-62.01394\\\\149.4199\\\\316.01\\\\-62.58369\\\\152.4199\\\\316.01\\\\-62.75058\\\\155.4199\\\\316.01\\\\-62.49993\\\\158.9199\\\\316.01\\\\-61.97785\\\\161.4199\\\\316.01\\\\-61.53218\\\\162.9199\\\\316.01\\\\-60.56345\\\\165.4199\\\\316.01\\\\-59.56343\\\\167.4199\\\\316.01\\\\-57.98846\\\\169.9199\\\\316.01\\\\-56.41841\\\\171.9199\\\\316.01\\\\-54.86421\\\\173.5871\\\\316.01\\\\-53.36421\\\\174.9645\\\\316.01\\\\-51.36421\\\\176.5263\\\\316.01\\\\-48.86421\\\\178.0915\\\\316.01\\\\-46.86421\\\\179.087\\\\316.01\\\\-44.36421\\\\180.0535\\\\316.01\\\\-42.36421\\\\180.6162\\\\316.01\\\\-39.36421\\\\181.1487\\\\316.01\\\\-36.86421\\\\181.28\\\\316.01\\\\-33.36421\\\\181.0535\\\\316.01\\\\-30.86421\\\\180.5426\\\\316.01\\\\-29.36421\\\\180.1004\\\\316.01\\\\-26.86421\\\\179.1441\\\\316.01\\\\-24.86421\\\\178.1536\\\\316.01\\\\-22.36421\\\\176.6336\\\\316.01\\\\-20.86421\\\\175.584\\\\316.01\\\\-18.86421\\\\173.9379\\\\316.01\\\\-15.36421\\\\170.4052\\\\316.01\\\\-13.36421\\\\168.7274\\\\316.01\\\\-11.86421\\\\167.7328\\\\316.01\\\\-9.864211\\\\166.7353\\\\316.01\\\\-8.364211\\\\166.2789\\\\316.01\\\\-7.364212\\\\166.2522\\\\316.01\\\\-5.864212\\\\166.7301\\\\316.01\\\\-4.864212\\\\167.2843\\\\316.01\\\\-3.864212\\\\168.1102\\\\316.01\\\\-2.364212\\\\169.5607\\\\316.01\\\\-0.7082709\\\\171.4199\\\\316.01\\\\0.3049062\\\\172.9199\\\\316.01\\\\0.8081186\\\\173.9199\\\\316.01\\\\1.284373\\\\175.4199\\\\316.01\\\\1.291771\\\\176.9199\\\\316.01\\\\0.8586567\\\\178.4199\\\\316.01\\\\0.1957059\\\\179.9199\\\\316.01\\\\-0.6775677\\\\181.4199\\\\316.01\\\\-2.661191\\\\183.9199\\\\316.01\\\\-5.007315\\\\186.4199\\\\316.01\\\\-6.500715\\\\188.4199\\\\316.01\\\\-8.073847\\\\190.9199\\\\316.01\\\\-8.87757\\\\192.4199\\\\316.01\\\\-10.01585\\\\194.9199\\\\316.01\\\\-10.96825\\\\197.9199\\\\316.01\\\\-11.58267\\\\201.4199\\\\316.01\\\\-11.67519\\\\203.9199\\\\316.01\\\\-11.48248\\\\206.9199\\\\316.01\\\\-10.99571\\\\209.4199\\\\316.01\\\\-10.04661\\\\212.4199\\\\316.01\\\\-8.950251\\\\214.9199\\\\316.01\\\\-7.520991\\\\217.4199\\\\316.01\\\\-6.481589\\\\218.9199\\\\316.01\\\\-4.364212\\\\221.414\\\\316.01\\\\-3.354596\\\\222.4199\\\\316.01\\\\-0.8642115\\\\224.5294\\\\316.01\\\\0.6357885\\\\225.569\\\\316.01\\\\3.135788\\\\226.9891\\\\316.01\\\\5.635788\\\\228.0878\\\\316.01\\\\8.635789\\\\229.0214\\\\316.01\\\\11.13579\\\\229.4977\\\\316.01\\\\14.13579\\\\229.6991\\\\316.01\\\\17.13579\\\\229.5404\\\\316.01\\\\19.63579\\\\229.0808\\\\316.01\\\\21.63579\\\\228.5287\\\\316.01\\\\24.13579\\\\227.5826\\\\316.01\\\\26.13579\\\\226.6064\\\\316.01\\\\28.63579\\\\225.0716\\\\316.01\\\\30.63579\\\\223.5409\\\\316.01\\\\32.38724\\\\221.9199\\\\316.01\\\\34.21912\\\\219.9199\\\\316.01\\\\35.71912\\\\217.9199\\\\316.01\\\\37.23231\\\\215.4199\\\\316.01\\\\37.74227\\\\214.4199\\\\316.01\\\\38.78743\\\\211.9199\\\\316.01\\\\39.27964\\\\210.4199\\\\316.01\\\\39.77964\\\\208.4199\\\\316.01\\\\40.21079\\\\205.4199\\\\316.01\\\\40.30376\\\\203.9199\\\\316.01\\\\40.24707\\\\202.4199\\\\316.01\\\\39.75857\\\\198.9199\\\\316.01\\\\39.24707\\\\196.9199\\\\316.01\\\\38.75175\\\\195.4199\\\\316.01\\\\37.67715\\\\192.9199\\\\316.01\\\\36.30844\\\\190.4199\\\\316.01\\\\35.32992\\\\188.9199\\\\316.01\\\\33.83548\\\\186.9199\\\\316.01\\\\30.59809\\\\183.4199\\\\316.01\\\\28.97444\\\\181.4199\\\\316.01\\\\27.49209\\\\178.9199\\\\316.01\\\\26.92882\\\\177.4199\\\\316.01\\\\26.67292\\\\175.9199\\\\316.01\\\\27.0272\\\\173.9199\\\\316.01\\\\27.47647\\\\172.9199\\\\316.01\\\\28.42746\\\\171.4199\\\\316.01\\\\30.0573\\\\169.4199\\\\316.01\\\\31.13579\\\\168.3365\\\\316.01\\\\32.63579\\\\167.1923\\\\316.01\\\\34.63579\\\\166.3017\\\\316.01\\\\36.13579\\\\166.2524\\\\316.01\\\\38.13579\\\\166.8033\\\\316.01\\\\40.13579\\\\167.7816\\\\316.01\\\\41.63579\\\\168.748\\\\316.01\\\\43.63579\\\\170.3422\\\\316.01\\\\46.63579\\\\172.9895\\\\316.01\\\\48.13579\\\\174.0761\\\\316.01\\\\50.63579\\\\175.6084\\\\316.01\\\\52.63579\\\\176.6375\\\\316.01\\\\55.13579\\\\177.647\\\\316.01\\\\56.63579\\\\178.1235\\\\316.01\\\\58.63579\\\\178.6027\\\\316.01\\\\61.13579\\\\178.9332\\\\316.01\\\\63.13579\\\\179.0715\\\\316.01\\\\64.63579\\\\178.9771\\\\316.01\\\\67.63579\\\\178.5617\\\\316.01\\\\69.63579\\\\178.0715\\\\316.01\\\\72.63579\\\\177.0086\\\\316.01\\\\74.63579\\\\176.0676\\\\316.01\\\\77.13579\\\\174.5898\\\\316.01\\\\78.63579\\\\173.5138\\\\316.01\\\\81.01079\\\\171.4199\\\\316.01\\\\82.63579\\\\169.6953\\\\316.01\\\\83.67384\\\\168.4199\\\\316.01\\\\85.35615\\\\165.9199\\\\316.01\\\\86.67046\\\\163.4199\\\\316.01\\\\87.31818\\\\161.9199\\\\316.01\\\\88.28932\\\\158.9199\\\\316.01\\\\88.85658\\\\155.9199\\\\316.01\\\\89.01982\\\\152.9199\\\\316.01\\\\88.76299\\\\149.4199\\\\316.01\\\\88.34512\\\\147.4199\\\\316.01\\\\87.78162\\\\145.4199\\\\316.01\\\\87.23485\\\\143.9199\\\\316.01\\\\85.80917\\\\140.9199\\\\316.01\\\\84.23231\\\\138.4199\\\\316.01\\\\82.65283\\\\136.4199\\\\316.01\\\\81.26814\\\\134.9199\\\\316.01\\\\79.62587\\\\133.4199\\\\316.01\\\\78.13579\\\\132.2224\\\\316.01\\\\75.13579\\\\130.2905\\\\316.01\\\\73.13579\\\\129.2905\\\\316.01\\\\70.63579\\\\128.3183\\\\316.01\\\\68.63579\\\\127.7468\\\\316.01\\\\65.63579\\\\127.2051\\\\316.01\\\\63.13579\\\\127.0843\\\\316.01\\\\59.63579\\\\127.3134\\\\316.01\\\\57.13579\\\\127.8183\\\\316.01\\\\55.63579\\\\128.2519\\\\316.01\\\\53.13579\\\\129.2097\\\\316.01\\\\51.13579\\\\130.2003\\\\316.01\\\\48.63579\\\\131.7489\\\\316.01\\\\47.13579\\\\132.8785\\\\316.01\\\\45.13579\\\\134.6568\\\\316.01\\\\43.91469\\\\135.9199\\\\316.01\\\\42.24456\\\\137.9199\\\\316.01\\\\40.13579\\\\140.2911\\\\316.01\\\\39.13579\\\\141.291\\\\316.01\\\\37.13579\\\\143.0427\\\\316.01\\\\35.63579\\\\144.0175\\\\316.01\\\\34.63579\\\\144.5213\\\\316.01\\\\33.13579\\\\144.9878\\\\316.01\\\\32.13579\\\\145.0095\\\\316.01\\\\30.63579\\\\144.5631\\\\316.01\\\\29.63579\\\\144.0704\\\\316.01\\\\28.13579\\\\143.0939\\\\316.01\\\\25.13579\\\\140.7603\\\\316.01\\\\24.13579\\\\140.097\\\\316.01\\\\22.13579\\\\138.5449\\\\316.01\\\\20.45722\\\\136.9199\\\\316.01\\\\19.40894\\\\135.4199\\\\316.01\\\\19.02304\\\\134.4199\\\\316.01\\\\19.41152\\\\132.9199\\\\316.01\\\\20.52696\\\\130.9199\\\\316.01\\\\22.4984\\\\128.4199\\\\316.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"62\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"21\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-12.89888\\\\102.9199\\\\319.01\\\\-12.55271\\\\106.9199\\\\319.01\\\\-11.97069\\\\109.4199\\\\319.01\\\\-11.4907\\\\110.9199\\\\319.01\\\\-10.43921\\\\113.4199\\\\319.01\\\\-9.063915\\\\115.9199\\\\319.01\\\\-8.047024\\\\117.4199\\\\319.01\\\\-6.419136\\\\119.4199\\\\319.01\\\\-4.864212\\\\121.0275\\\\319.01\\\\-2.364212\\\\123.1128\\\\319.01\\\\-0.8642115\\\\124.1393\\\\319.01\\\\1.635789\\\\125.6274\\\\319.01\\\\6.135788\\\\128.0177\\\\319.01\\\\8.635789\\\\129.0637\\\\319.01\\\\10.63579\\\\129.5962\\\\319.01\\\\12.63579\\\\129.8757\\\\319.01\\\\14.63579\\\\129.5984\\\\319.01\\\\16.13579\\\\129.1345\\\\319.01\\\\18.63579\\\\127.9669\\\\319.01\\\\21.13579\\\\126.5592\\\\319.01\\\\25.13579\\\\123.9956\\\\319.01\\\\27.13579\\\\122.544\\\\319.01\\\\28.96026\\\\120.9199\\\\319.01\\\\30.87045\\\\118.9199\\\\319.01\\\\32.74672\\\\116.4199\\\\319.01\\\\34.18366\\\\113.9199\\\\319.01\\\\35.30482\\\\111.4199\\\\319.01\\\\35.81496\\\\109.9199\\\\319.01\\\\36.33659\\\\107.9199\\\\319.01\\\\36.74227\\\\105.4199\\\\319.01\\\\36.87132\\\\102.9199\\\\319.01\\\\36.75857\\\\100.9199\\\\319.01\\\\36.24469\\\\97.91986\\\\319.01\\\\35.34095\\\\94.91986\\\\319.01\\\\34.72183\\\\93.41986\\\\319.01\\\\33.72296\\\\91.41986\\\\319.01\\\\32.8289\\\\89.91986\\\\319.01\\\\31.77888\\\\88.41986\\\\319.01\\\\30.13579\\\\86.49043\\\\319.01\\\\29.10066\\\\85.41986\\\\319.01\\\\26.63579\\\\83.28575\\\\319.01\\\\25.13579\\\\82.23956\\\\319.01\\\\22.63579\\\\80.81954\\\\319.01\\\\20.13579\\\\79.73236\\\\319.01\\\\18.63579\\\\79.23167\\\\319.01\\\\16.63579\\\\78.72334\\\\319.01\\\\14.13579\\\\78.33926\\\\319.01\\\\12.13579\\\\78.20802\\\\319.01\\\\10.13579\\\\78.30858\\\\319.01\\\\7.135788\\\\78.77843\\\\319.01\\\\5.135788\\\\79.30858\\\\319.01\\\\2.635788\\\\80.22572\\\\319.01\\\\0.6357885\\\\81.20093\\\\319.01\\\\-1.864211\\\\82.73734\\\\319.01\\\\-3.864212\\\\84.28801\\\\319.01\\\\-5.595103\\\\85.91986\\\\319.01\\\\-6.961729\\\\87.41986\\\\319.01\\\\-8.481761\\\\89.41986\\\\319.01\\\\-9.996199\\\\91.91986\\\\319.01\\\\-10.94203\\\\93.91986\\\\319.01\\\\-12.00149\\\\96.91986\\\\319.01\\\\-12.56767\\\\99.41986\\\\319.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"61\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"22\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-7.780878\\\\157.9199\\\\319.01\\\\-7.557069\\\\155.9199\\\\319.01\\\\-7.641239\\\\155.4199\\\\319.01\\\\-8.680249\\\\152.9199\\\\319.01\\\\-10.14019\\\\150.4199\\\\319.01\\\\-11.96758\\\\147.9199\\\\319.01\\\\-14.06594\\\\144.9199\\\\319.01\\\\-15.72495\\\\142.4199\\\\319.01\\\\-17.18427\\\\140.4199\\\\319.01\\\\-19.36421\\\\137.9739\\\\319.01\\\\-21.86421\\\\135.7308\\\\319.01\\\\-24.86421\\\\133.7219\\\\319.01\\\\-26.86421\\\\132.7002\\\\319.01\\\\-29.36421\\\\131.7077\\\\319.01\\\\-30.86421\\\\131.2518\\\\319.01\\\\-33.36421\\\\130.7201\\\\319.01\\\\-36.86421\\\\130.4545\\\\319.01\\\\-40.36421\\\\130.7374\\\\319.01\\\\-42.86421\\\\131.2971\\\\319.01\\\\-44.36421\\\\131.7584\\\\319.01\\\\-46.86421\\\\132.7666\\\\319.01\\\\-48.86421\\\\133.8061\\\\319.01\\\\-50.36421\\\\134.7354\\\\319.01\\\\-52.36421\\\\136.2252\\\\319.01\\\\-54.36421\\\\138.0987\\\\319.01\\\\-55.60049\\\\139.4199\\\\319.01\\\\-57.48921\\\\141.9199\\\\319.01\\\\-58.94202\\\\144.4199\\\\319.01\\\\-60.06339\\\\146.9199\\\\319.01\\\\-60.99572\\\\149.9199\\\\319.01\\\\-61.47311\\\\152.4199\\\\319.01\\\\-61.65237\\\\155.4199\\\\319.01\\\\-61.57079\\\\157.4199\\\\319.01\\\\-61.0741\\\\160.4199\\\\319.01\\\\-60.5406\\\\162.4199\\\\319.01\\\\-59.58504\\\\164.9199\\\\319.01\\\\-58.59007\\\\166.9199\\\\319.01\\\\-57.01646\\\\169.4199\\\\319.01\\\\-55.41872\\\\171.4199\\\\319.01\\\\-53.86421\\\\173.0574\\\\319.01\\\\-52.86421\\\\173.9672\\\\319.01\\\\-50.86421\\\\175.5555\\\\319.01\\\\-48.36421\\\\177.127\\\\319.01\\\\-46.36421\\\\178.1151\\\\319.01\\\\-43.86421\\\\179.0579\\\\319.01\\\\-41.86421\\\\179.606\\\\319.01\\\\-38.86421\\\\180.1074\\\\319.01\\\\-36.86421\\\\180.191\\\\319.01\\\\-34.86421\\\\180.1185\\\\319.01\\\\-31.36421\\\\179.5214\\\\319.01\\\\-28.36421\\\\178.5899\\\\319.01\\\\-25.86421\\\\177.4476\\\\319.01\\\\-24.36421\\\\176.6231\\\\319.01\\\\-22.86421\\\\175.6373\\\\319.01\\\\-21.36421\\\\174.4941\\\\319.01\\\\-19.86421\\\\173.1573\\\\319.01\\\\-17.74542\\\\170.9199\\\\319.01\\\\-15.68287\\\\168.4199\\\\319.01\\\\-14.53537\\\\166.9199\\\\319.01\\\\-11.19653\\\\162.9199\\\\319.01\\\\-9.668378\\\\160.9199\\\\319.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"156\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"23\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"33.13579\\\\158.2413\\\\319.01\\\\35.63579\\\\160.3188\\\\319.01\\\\37.63579\\\\162.1973\\\\319.01\\\\41.63579\\\\166.1942\\\\319.01\\\\45.15037\\\\169.9199\\\\319.01\\\\46.17537\\\\170.9199\\\\319.01\\\\48.13579\\\\172.6269\\\\319.01\\\\50.13579\\\\174.0326\\\\319.01\\\\53.13579\\\\175.6531\\\\319.01\\\\55.13579\\\\176.4862\\\\319.01\\\\57.13579\\\\177.1228\\\\319.01\\\\59.13579\\\\177.5749\\\\319.01\\\\63.13579\\\\177.9218\\\\319.01\\\\66.63579\\\\177.6196\\\\319.01\\\\69.13579\\\\177.067\\\\319.01\\\\72.13579\\\\176.0294\\\\319.01\\\\74.13579\\\\175.1044\\\\319.01\\\\76.63579\\\\173.6219\\\\319.01\\\\78.13579\\\\172.5346\\\\319.01\\\\79.96026\\\\170.9199\\\\319.01\\\\82.30837\\\\168.4199\\\\319.01\\\\83.772\\\\166.4199\\\\319.01\\\\84.67715\\\\164.9199\\\\319.01\\\\85.70212\\\\162.9199\\\\319.01\\\\86.34207\\\\161.4199\\\\319.01\\\\87.27515\\\\158.4199\\\\319.01\\\\87.74707\\\\155.9199\\\\319.01\\\\87.92132\\\\152.9199\\\\319.01\\\\87.83974\\\\150.9199\\\\319.01\\\\87.33659\\\\147.9199\\\\319.01\\\\86.78665\\\\145.9199\\\\319.01\\\\85.83718\\\\143.4199\\\\319.01\\\\84.84293\\\\141.4199\\\\319.01\\\\83.26244\\\\138.9199\\\\319.01\\\\81.65337\\\\136.9199\\\\319.01\\\\80.13579\\\\135.3188\\\\319.01\\\\77.63579\\\\133.1981\\\\319.01\\\\74.63579\\\\131.2557\\\\319.01\\\\72.63579\\\\130.2625\\\\319.01\\\\70.13579\\\\129.3158\\\\319.01\\\\68.13579\\\\128.7592\\\\319.01\\\\65.63579\\\\128.3183\\\\319.01\\\\63.13579\\\\128.1659\\\\319.01\\\\60.63579\\\\128.3016\\\\319.01\\\\58.13579\\\\128.7191\\\\319.01\\\\56.13579\\\\129.2453\\\\319.01\\\\53.63579\\\\130.192\\\\319.01\\\\50.63579\\\\131.7338\\\\319.01\\\\49.13579\\\\132.7196\\\\319.01\\\\47.13579\\\\134.2836\\\\319.01\\\\45.41303\\\\135.9199\\\\319.01\\\\44.05789\\\\137.4199\\\\319.01\\\\42.53205\\\\139.4199\\\\319.01\\\\40.22859\\\\142.9199\\\\319.01\\\\37.76569\\\\146.4199\\\\319.01\\\\34.63579\\\\150.5317\\\\319.01\\\\33.63579\\\\151.6949\\\\319.01\\\\32.63579\\\\152.5969\\\\319.01\\\\32.13579\\\\152.8053\\\\319.01\\\\31.63579\\\\152.5761\\\\319.01\\\\30.63579\\\\151.7115\\\\319.01\\\\29.63579\\\\150.6442\\\\319.01\\\\27.79562\\\\148.4199\\\\319.01\\\\25.45295\\\\145.9199\\\\319.01\\\\24.13579\\\\144.7099\\\\319.01\\\\22.13579\\\\143.3042\\\\319.01\\\\20.13579\\\\142.2827\\\\319.01\\\\17.13579\\\\141.2436\\\\319.01\\\\14.13579\\\\140.6942\\\\319.01\\\\12.13579\\\\140.8091\\\\319.01\\\\10.13579\\\\141.2746\\\\319.01\\\\8.635789\\\\141.7564\\\\319.01\\\\6.635788\\\\142.6667\\\\319.01\\\\4.635788\\\\143.8113\\\\319.01\\\\2.690873\\\\145.4199\\\\319.01\\\\1.635789\\\\146.4907\\\\319.01\\\\0.0003718426\\\\148.4199\\\\319.01\\\\-1.019515\\\\149.9199\\\\319.01\\\\-2.529212\\\\152.4199\\\\319.01\\\\-3.476054\\\\154.4199\\\\319.01\\\\-4.022545\\\\155.9199\\\\319.01\\\\-3.918899\\\\158.4199\\\\319.01\\\\-3.595462\\\\159.4199\\\\319.01\\\\-1.940824\\\\162.9199\\\\319.01\\\\-0.5122378\\\\165.4199\\\\319.01\\\\0.4943411\\\\166.9199\\\\319.01\\\\2.635788\\\\169.3352\\\\319.01\\\\5.151413\\\\171.9199\\\\319.01\\\\6.24749\\\\173.4199\\\\319.01\\\\6.578497\\\\174.4199\\\\319.01\\\\6.298288\\\\175.9199\\\\319.01\\\\5.779171\\\\176.9199\\\\319.01\\\\4.722327\\\\178.4199\\\\319.01\\\\3.883184\\\\179.4199\\\\319.01\\\\1.506402\\\\181.9199\\\\319.01\\\\-2.864212\\\\186.0801\\\\319.01\\\\-5.025976\\\\188.4199\\\\319.01\\\\-6.477698\\\\190.4199\\\\319.01\\\\-7.915268\\\\192.9199\\\\319.01\\\\-9.033246\\\\195.4199\\\\319.01\\\\-9.545151\\\\196.9199\\\\319.01\\\\-10.06501\\\\198.9199\\\\319.01\\\\-10.47069\\\\201.4199\\\\319.01\\\\-10.59974\\\\203.9199\\\\319.01\\\\-10.48699\\\\205.9199\\\\319.01\\\\-9.975492\\\\208.9199\\\\319.01\\\\-9.069374\\\\211.9199\\\\319.01\\\\-8.450251\\\\213.4199\\\\319.01\\\\-7.448093\\\\215.4199\\\\319.01\\\\-6.554331\\\\216.9199\\\\319.01\\\\-5.50494\\\\218.4199\\\\319.01\\\\-3.364212\\\\220.8809\\\\319.01\\\\-2.289615\\\\221.9199\\\\319.01\\\\-0.3642115\\\\223.5549\\\\319.01\\\\1.135789\\\\224.6032\\\\319.01\\\\2.635788\\\\225.492\\\\319.01\\\\4.635788\\\\226.4862\\\\319.01\\\\7.635788\\\\227.608\\\\319.01\\\\9.635789\\\\228.1153\\\\319.01\\\\12.13579\\\\228.5004\\\\319.01\\\\14.13579\\\\228.6302\\\\319.01\\\\16.13579\\\\228.5311\\\\319.01\\\\19.13579\\\\228.0613\\\\319.01\\\\21.13579\\\\227.5287\\\\319.01\\\\23.63579\\\\226.6123\\\\319.01\\\\25.63579\\\\225.6388\\\\319.01\\\\28.13579\\\\224.1024\\\\319.01\\\\30.13579\\\\222.5501\\\\319.01\\\\31.86496\\\\220.9199\\\\319.01\\\\33.23043\\\\219.4199\\\\319.01\\\\34.75003\\\\217.4199\\\\319.01\\\\36.26778\\\\214.9199\\\\319.01\\\\37.2136\\\\212.9199\\\\319.01\\\\38.27096\\\\209.9199\\\\319.01\\\\38.83924\\\\207.4199\\\\319.01\\\\39.17046\\\\203.9199\\\\319.01\\\\38.82429\\\\199.9199\\\\319.01\\\\38.24227\\\\197.4199\\\\319.01\\\\37.76228\\\\195.9199\\\\319.01\\\\36.7136\\\\193.4199\\\\319.01\\\\35.33726\\\\190.9199\\\\319.01\\\\34.32057\\\\189.4199\\\\319.01\\\\32.69406\\\\187.4199\\\\319.01\\\\30.13579\\\\184.8861\\\\319.01\\\\28.13579\\\\183.1373\\\\319.01\\\\26.33371\\\\181.4199\\\\319.01\\\\23.47009\\\\178.4199\\\\319.01\\\\22.04972\\\\176.4199\\\\319.01\\\\21.53857\\\\175.4199\\\\319.01\\\\21.30416\\\\174.4199\\\\319.01\\\\21.59775\\\\173.4199\\\\319.01\\\\22.58987\\\\171.9199\\\\319.01\\\\26.76079\\\\167.4199\\\\319.01\\\\28.76607\\\\164.4199\\\\319.01\\\\30.52865\\\\161.4199\\\\319.01\\\\32.13579\\\\159.0449\\\\319.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n"; +const char* k_rtStruct_json08 = +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"61\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"24\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-22.86421\\\\173.6167\\\\322.01\\\\-20.36421\\\\171.3328\\\\322.01\\\\-18.64568\\\\169.4199\\\\322.01\\\\-17.21133\\\\167.4199\\\\322.01\\\\-15.76229\\\\164.9199\\\\322.01\\\\-14.17866\\\\161.4199\\\\322.01\\\\-13.68593\\\\159.9199\\\\322.01\\\\-13.19968\\\\157.9199\\\\322.01\\\\-13.03158\\\\155.4199\\\\322.01\\\\-13.19686\\\\153.4199\\\\322.01\\\\-13.74929\\\\150.9199\\\\322.01\\\\-14.23635\\\\149.4199\\\\322.01\\\\-15.71317\\\\145.9199\\\\322.01\\\\-16.80026\\\\143.9199\\\\322.01\\\\-17.74579\\\\142.4199\\\\322.01\\\\-19.29129\\\\140.4199\\\\322.01\\\\-20.86421\\\\138.7435\\\\322.01\\\\-21.86421\\\\137.8386\\\\322.01\\\\-23.86421\\\\136.282\\\\322.01\\\\-26.36421\\\\134.764\\\\322.01\\\\-28.36421\\\\133.8425\\\\322.01\\\\-29.86421\\\\133.2735\\\\322.01\\\\-31.86421\\\\132.7164\\\\322.01\\\\-34.36421\\\\132.2486\\\\322.01\\\\-36.86421\\\\132.13\\\\322.01\\\\-39.36421\\\\132.2642\\\\322.01\\\\-41.86421\\\\132.7382\\\\322.01\\\\-43.86421\\\\133.3401\\\\322.01\\\\-46.36421\\\\134.3583\\\\322.01\\\\-48.86421\\\\135.7135\\\\322.01\\\\-50.36421\\\\136.728\\\\322.01\\\\-52.36421\\\\138.4039\\\\322.01\\\\-53.86421\\\\139.9274\\\\322.01\\\\-55.50681\\\\141.9199\\\\322.01\\\\-56.51492\\\\143.4199\\\\322.01\\\\-58.07415\\\\146.4199\\\\322.01\\\\-59.00964\\\\148.9199\\\\322.01\\\\-59.5293\\\\150.9199\\\\322.01\\\\-59.89546\\\\153.4199\\\\322.01\\\\-60.03242\\\\154.9199\\\\322.01\\\\-59.93835\\\\156.9199\\\\322.01\\\\-59.49086\\\\159.9199\\\\322.01\\\\-58.95904\\\\161.9199\\\\322.01\\\\-58.02025\\\\164.4199\\\\322.01\\\\-57.0033\\\\166.4199\\\\322.01\\\\-56.06999\\\\167.9199\\\\322.01\\\\-54.56957\\\\169.9199\\\\322.01\\\\-52.65075\\\\171.9199\\\\322.01\\\\-51.36421\\\\173.1195\\\\322.01\\\\-49.36421\\\\174.6134\\\\322.01\\\\-47.86421\\\\175.5312\\\\322.01\\\\-45.86421\\\\176.5396\\\\322.01\\\\-42.86421\\\\177.6258\\\\322.01\\\\-40.86421\\\\178.1171\\\\322.01\\\\-38.36421\\\\178.4579\\\\322.01\\\\-36.86421\\\\178.5724\\\\322.01\\\\-35.36421\\\\178.4741\\\\322.01\\\\-32.36421\\\\178.0522\\\\322.01\\\\-30.36421\\\\177.5304\\\\322.01\\\\-27.86421\\\\176.6086\\\\322.01\\\\-25.86421\\\\175.6103\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"57\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"25\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"12.13579\\\\79.89561\\\\322.01\\\\8.135789\\\\80.26321\\\\322.01\\\\6.135788\\\\80.73197\\\\322.01\\\\3.135788\\\\81.80273\\\\322.01\\\\1.135789\\\\82.78688\\\\322.01\\\\-0.3642115\\\\83.70047\\\\322.01\\\\-1.864211\\\\84.7538\\\\322.01\\\\-4.364212\\\\87.02203\\\\322.01\\\\-6.084282\\\\88.91986\\\\322.01\\\\-7.526799\\\\90.91986\\\\322.01\\\\-8.904288\\\\93.41986\\\\322.01\\\\-9.95048\\\\95.91986\\\\322.01\\\\-10.55831\\\\97.91986\\\\322.01\\\\-11.04673\\\\100.4199\\\\322.01\\\\-11.16636\\\\102.4199\\\\322.01\\\\-11.03347\\\\105.9199\\\\322.01\\\\-10.53559\\\\108.4199\\\\322.01\\\\-9.545301\\\\111.4199\\\\322.01\\\\-8.064543\\\\114.4199\\\\322.01\\\\-5.994056\\\\117.4199\\\\322.01\\\\-4.364212\\\\119.1962\\\\322.01\\\\-2.364212\\\\121.063\\\\322.01\\\\-0.3642115\\\\122.5134\\\\322.01\\\\1.635789\\\\123.6633\\\\322.01\\\\3.635788\\\\124.6195\\\\322.01\\\\6.135788\\\\125.5152\\\\322.01\\\\8.135789\\\\126.0422\\\\322.01\\\\11.13579\\\\126.4622\\\\322.01\\\\13.13579\\\\126.4859\\\\322.01\\\\16.13579\\\\126.0393\\\\322.01\\\\19.13579\\\\125.1215\\\\322.01\\\\20.63579\\\\124.5159\\\\322.01\\\\22.63579\\\\123.5519\\\\322.01\\\\25.63579\\\\121.6349\\\\322.01\\\\28.13579\\\\119.4801\\\\322.01\\\\29.13579\\\\118.4173\\\\322.01\\\\30.76925\\\\116.4199\\\\322.01\\\\32.34138\\\\113.9199\\\\322.01\\\\33.32649\\\\111.9199\\\\322.01\\\\34.23682\\\\109.4199\\\\322.01\\\\34.83486\\\\106.9199\\\\322.01\\\\35.12617\\\\104.4199\\\\322.01\\\\35.21572\\\\102.9199\\\\322.01\\\\34.76814\\\\98.91986\\\\322.01\\\\34.2723\\\\96.91986\\\\322.01\\\\33.77169\\\\95.41986\\\\322.01\\\\32.64571\\\\92.91986\\\\322.01\\\\31.84079\\\\91.41986\\\\322.01\\\\30.85131\\\\89.91986\\\\322.01\\\\28.81709\\\\87.41986\\\\322.01\\\\27.13579\\\\85.78797\\\\322.01\\\\25.13579\\\\84.21124\\\\322.01\\\\23.63579\\\\83.22486\\\\322.01\\\\21.63579\\\\82.17953\\\\322.01\\\\19.63579\\\\81.30779\\\\322.01\\\\18.13579\\\\80.81271\\\\322.01\\\\15.63579\\\\80.22696\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"30\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"26\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.13579\\\\148.5344\\\\322.01\\\\11.63579\\\\148.8526\\\\322.01\\\\10.13579\\\\149.3299\\\\322.01\\\\9.135789\\\\149.8438\\\\322.01\\\\7.635788\\\\151.0171\\\\322.01\\\\6.442606\\\\152.4199\\\\322.01\\\\5.485788\\\\154.4199\\\\322.01\\\\5.087712\\\\156.4199\\\\322.01\\\\5.087712\\\\158.4199\\\\322.01\\\\5.505788\\\\160.4199\\\\322.01\\\\6.510788\\\\162.4199\\\\322.01\\\\7.333157\\\\163.4199\\\\322.01\\\\8.635789\\\\164.5903\\\\322.01\\\\10.63579\\\\165.6099\\\\322.01\\\\12.13579\\\\165.9872\\\\322.01\\\\13.63579\\\\166.1299\\\\322.01\\\\15.63579\\\\165.9679\\\\322.01\\\\17.13579\\\\165.5553\\\\322.01\\\\19.13579\\\\164.4994\\\\322.01\\\\20.74293\\\\162.9199\\\\322.01\\\\21.68787\\\\161.4199\\\\322.01\\\\22.26579\\\\159.9199\\\\322.01\\\\22.5597\\\\158.4199\\\\322.01\\\\22.58144\\\\156.9199\\\\322.01\\\\22.26579\\\\154.9199\\\\322.01\\\\21.72579\\\\153.4199\\\\322.01\\\\20.79055\\\\151.9199\\\\322.01\\\\19.13579\\\\150.2949\\\\322.01\\\\17.13579\\\\149.2219\\\\322.01\\\\16.13579\\\\148.9099\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"58\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"27\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"14.13579\\\\226.9441\\\\322.01\\\\18.13579\\\\226.5733\\\\322.01\\\\20.13579\\\\226.1058\\\\322.01\\\\23.13579\\\\225.037\\\\322.01\\\\25.13579\\\\224.0554\\\\322.01\\\\26.63579\\\\223.1393\\\\322.01\\\\28.13579\\\\222.0859\\\\322.01\\\\30.02057\\\\220.4199\\\\322.01\\\\32.35234\\\\217.9199\\\\322.01\\\\33.796\\\\215.9199\\\\322.01\\\\35.17205\\\\213.4199\\\\322.01\\\\36.22206\\\\210.9199\\\\322.01\\\\36.82989\\\\208.9199\\\\322.01\\\\37.3183\\\\206.4199\\\\322.01\\\\37.43793\\\\204.4199\\\\322.01\\\\37.30504\\\\200.9199\\\\322.01\\\\36.80717\\\\198.4199\\\\322.01\\\\35.81688\\\\195.4199\\\\322.01\\\\34.33746\\\\192.4199\\\\322.01\\\\33.71524\\\\191.4199\\\\322.01\\\\32.26848\\\\189.4199\\\\322.01\\\\30.63579\\\\187.6435\\\\322.01\\\\28.63579\\\\185.7795\\\\322.01\\\\26.63579\\\\184.2958\\\\322.01\\\\25.13579\\\\183.3219\\\\322.01\\\\21.63579\\\\181.3373\\\\322.01\\\\19.13579\\\\180.2194\\\\322.01\\\\17.63579\\\\179.7097\\\\322.01\\\\16.13579\\\\179.3674\\\\322.01\\\\14.13579\\\\179.1844\\\\322.01\\\\12.63579\\\\179.2658\\\\322.01\\\\10.63579\\\\179.7215\\\\322.01\\\\9.135789\\\\180.2507\\\\322.01\\\\6.135788\\\\181.6909\\\\322.01\\\\2.635788\\\\183.7795\\\\322.01\\\\0.6357885\\\\185.1998\\\\322.01\\\\-1.864211\\\\187.3557\\\\322.01\\\\-2.866484\\\\188.4199\\\\322.01\\\\-4.500405\\\\190.4199\\\\322.01\\\\-6.073093\\\\192.9199\\\\322.01\\\\-7.054916\\\\194.9199\\\\322.01\\\\-7.965239\\\\197.4199\\\\322.01\\\\-8.563286\\\\199.9199\\\\322.01\\\\-8.854596\\\\202.4199\\\\322.01\\\\-8.944143\\\\203.9199\\\\322.01\\\\-8.496565\\\\207.9199\\\\322.01\\\\-8.000725\\\\209.9199\\\\322.01\\\\-7.083763\\\\212.4199\\\\322.01\\\\-5.565878\\\\215.4199\\\\322.01\\\\-4.578253\\\\216.9199\\\\322.01\\\\-2.545509\\\\219.4199\\\\322.01\\\\-0.8642115\\\\221.0499\\\\322.01\\\\1.135789\\\\222.6285\\\\322.01\\\\2.635788\\\\223.6162\\\\322.01\\\\4.635788\\\\224.66\\\\322.01\\\\6.635788\\\\225.5312\\\\322.01\\\\8.135789\\\\226.0243\\\\322.01\\\\10.63579\\\\226.6116\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"59\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"28\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"49.13579\\\\134.7441\\\\322.01\\\\46.63579\\\\137.0307\\\\322.01\\\\44.92775\\\\138.9199\\\\322.01\\\\43.50623\\\\140.9199\\\\322.01\\\\42.38579\\\\142.9199\\\\322.01\\\\40.97799\\\\145.9199\\\\322.01\\\\39.93071\\\\148.9199\\\\322.01\\\\39.43028\\\\150.9199\\\\322.01\\\\39.09673\\\\153.4199\\\\322.01\\\\39.41588\\\\156.4199\\\\322.01\\\\39.95945\\\\158.4199\\\\322.01\\\\40.52195\\\\159.9199\\\\322.01\\\\41.48458\\\\161.9199\\\\322.01\\\\42.9492\\\\164.4199\\\\322.01\\\\43.96608\\\\165.9199\\\\322.01\\\\45.53619\\\\167.9199\\\\322.01\\\\46.44071\\\\168.9199\\\\322.01\\\\48.13579\\\\170.5235\\\\322.01\\\\50.13579\\\\172.0799\\\\322.01\\\\51.63579\\\\173.0376\\\\322.01\\\\53.63579\\\\174.1012\\\\322.01\\\\56.13579\\\\175.1018\\\\322.01\\\\57.63579\\\\175.5449\\\\322.01\\\\60.13579\\\\176.0546\\\\322.01\\\\63.13579\\\\176.222\\\\322.01\\\\65.63579\\\\176.0973\\\\322.01\\\\68.13579\\\\175.614\\\\322.01\\\\70.13579\\\\175.0277\\\\322.01\\\\72.63579\\\\174.0123\\\\322.01\\\\75.13579\\\\172.6378\\\\322.01\\\\76.63579\\\\171.6285\\\\322.01\\\\78.63579\\\\169.9578\\\\322.01\\\\80.14716\\\\168.4199\\\\322.01\\\\81.7909\\\\166.4199\\\\322.01\\\\82.79488\\\\164.9199\\\\322.01\\\\84.34893\\\\161.9199\\\\322.01\\\\85.28902\\\\159.4199\\\\322.01\\\\85.8061\\\\157.4199\\\\322.01\\\\86.23142\\\\154.4199\\\\322.01\\\\86.31414\\\\152.9199\\\\322.01\\\\86.13579\\\\150.9318\\\\322.01\\\\85.74485\\\\148.4199\\\\322.01\\\\85.19829\\\\146.4199\\\\322.01\\\\84.26165\\\\143.9199\\\\322.01\\\\83.2471\\\\141.9199\\\\322.01\\\\82.32372\\\\140.4199\\\\322.01\\\\80.81777\\\\138.4199\\\\322.01\\\\78.13579\\\\135.695\\\\322.01\\\\75.63579\\\\133.7706\\\\322.01\\\\74.13579\\\\132.8641\\\\322.01\\\\72.13579\\\\131.8482\\\\322.01\\\\69.13579\\\\130.7308\\\\322.01\\\\67.13579\\\\130.2393\\\\322.01\\\\63.13579\\\\129.7981\\\\322.01\\\\61.63579\\\\129.9028\\\\322.01\\\\58.63579\\\\130.3108\\\\322.01\\\\56.63579\\\\130.8307\\\\322.01\\\\54.13579\\\\131.7483\\\\322.01\\\\52.13579\\\\132.7481\\\\322.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"55\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"29\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-36.86421\\\\134.5039\\\\325.01\\\\-40.36421\\\\134.8251\\\\325.01\\\\-42.36421\\\\135.3162\\\\325.01\\\\-44.86421\\\\136.2328\\\\325.01\\\\-46.86421\\\\137.2308\\\\325.01\\\\-47.86421\\\\137.8358\\\\325.01\\\\-49.86421\\\\139.2767\\\\325.01\\\\-50.86421\\\\140.1812\\\\325.01\\\\-52.55669\\\\141.9199\\\\325.01\\\\-54.06213\\\\143.9199\\\\325.01\\\\-54.98921\\\\145.4199\\\\325.01\\\\-55.96295\\\\147.4199\\\\325.01\\\\-56.98823\\\\150.4199\\\\325.01\\\\-57.53526\\\\153.4199\\\\325.01\\\\-57.62727\\\\155.4199\\\\325.01\\\\-57.52279\\\\157.4199\\\\325.01\\\\-57.06078\\\\159.9199\\\\325.01\\\\-56.49021\\\\161.9199\\\\325.01\\\\-55.41194\\\\164.4199\\\\325.01\\\\-54.57702\\\\165.9199\\\\325.01\\\\-53.57396\\\\167.4199\\\\325.01\\\\-51.89916\\\\169.4199\\\\325.01\\\\-50.86421\\\\170.4544\\\\325.01\\\\-48.86421\\\\172.1211\\\\325.01\\\\-47.36421\\\\173.1227\\\\325.01\\\\-45.86421\\\\173.9317\\\\325.01\\\\-43.36421\\\\175.006\\\\325.01\\\\-41.36421\\\\175.596\\\\325.01\\\\-38.86421\\\\176.0515\\\\325.01\\\\-36.86421\\\\176.1623\\\\325.01\\\\-34.86421\\\\176.0684\\\\325.01\\\\-32.36421\\\\175.6225\\\\325.01\\\\-30.36421\\\\175.073\\\\325.01\\\\-27.86421\\\\174.0279\\\\325.01\\\\-25.36421\\\\172.5758\\\\325.01\\\\-23.36421\\\\171.0328\\\\325.01\\\\-21.68302\\\\169.4199\\\\325.01\\\\-19.67303\\\\166.9199\\\\325.01\\\\-18.72346\\\\165.4199\\\\325.01\\\\-17.71021\\\\163.4199\\\\325.01\\\\-16.66229\\\\160.4199\\\\325.01\\\\-16.19818\\\\158.4199\\\\325.01\\\\-15.96381\\\\155.4199\\\\325.01\\\\-16.25821\\\\151.9199\\\\325.01\\\\-16.73232\\\\149.9199\\\\325.01\\\\-17.64964\\\\147.4199\\\\325.01\\\\-19.19963\\\\144.4199\\\\325.01\\\\-20.24376\\\\142.9199\\\\325.01\\\\-21.86421\\\\141.089\\\\325.01\\\\-24.36421\\\\138.787\\\\325.01\\\\-25.86421\\\\137.7401\\\\325.01\\\\-27.36421\\\\136.9034\\\\325.01\\\\-29.86421\\\\135.7551\\\\325.01\\\\-31.36421\\\\135.2615\\\\325.01\\\\-33.36421\\\\134.7939\\\\325.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"55\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"30\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10.13579\\\\183.3021\\\\325.01\\\\7.135788\\\\184.2407\\\\325.01\\\\5.135788\\\\185.1719\\\\325.01\\\\3.135788\\\\186.2872\\\\325.01\\\\1.135789\\\\187.7495\\\\325.01\\\\-1.559387\\\\190.4199\\\\325.01\\\\-3.057961\\\\192.4199\\\\325.01\\\\-4.487128\\\\194.9199\\\\325.01\\\\-5.510696\\\\197.4199\\\\325.01\\\\-6.051712\\\\199.4199\\\\325.01\\\\-6.519062\\\\202.4199\\\\325.01\\\\-6.565339\\\\203.9199\\\\325.01\\\\-6.408329\\\\205.9199\\\\325.01\\\\-5.967034\\\\208.4199\\\\325.01\\\\-4.985113\\\\211.4199\\\\325.01\\\\-4.035583\\\\213.4199\\\\325.01\\\\-3.447545\\\\214.4199\\\\325.01\\\\-2.060332\\\\216.4199\\\\325.01\\\\-0.8642115\\\\217.754\\\\325.01\\\\1.635789\\\\220.1117\\\\325.01\\\\3.635788\\\\221.491\\\\325.01\\\\4.635788\\\\222.0804\\\\325.01\\\\6.635788\\\\223.0186\\\\325.01\\\\8.135789\\\\223.5795\\\\325.01\\\\10.13579\\\\224.1074\\\\325.01\\\\12.63579\\\\224.4875\\\\325.01\\\\14.13579\\\\224.5909\\\\325.01\\\\16.13579\\\\224.4519\\\\325.01\\\\18.63579\\\\224.0641\\\\325.01\\\\20.63579\\\\223.4818\\\\325.01\\\\23.13579\\\\222.4497\\\\325.01\\\\25.63579\\\\221.0292\\\\325.01\\\\27.63579\\\\219.5015\\\\325.01\\\\29.76198\\\\217.4199\\\\325.01\\\\31.33117\\\\215.4199\\\\325.01\\\\32.29767\\\\213.9199\\\\325.01\\\\33.31492\\\\211.9199\\\\325.01\\\\34.25379\\\\209.4199\\\\325.01\\\\34.83692\\\\206.9199\\\\325.01\\\\35.10346\\\\203.9199\\\\325.01\\\\34.88203\\\\200.9199\\\\325.01\\\\34.73055\\\\199.9199\\\\325.01\\\\34.20932\\\\197.9199\\\\325.01\\\\33.27197\\\\195.4199\\\\325.01\\\\32.22284\\\\193.4199\\\\325.01\\\\31.25856\\\\191.9199\\\\325.01\\\\29.63579\\\\189.9463\\\\325.01\\\\28.11496\\\\188.4199\\\\325.01\\\\26.13579\\\\186.7882\\\\325.01\\\\23.63579\\\\185.2499\\\\325.01\\\\21.63579\\\\184.3438\\\\325.01\\\\20.13579\\\\183.7888\\\\325.01\\\\18.13579\\\\183.2512\\\\325.01\\\\15.13579\\\\182.8438\\\\325.01\\\\13.13579\\\\182.8685\\\\325.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"54\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"31\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"12.13579\\\\123.9516\\\\325.01\\\\15.63579\\\\123.596\\\\325.01\\\\17.63579\\\\123.0987\\\\325.01\\\\19.13579\\\\122.5923\\\\325.01\\\\21.13579\\\\121.6678\\\\325.01\\\\23.13579\\\\120.5568\\\\325.01\\\\25.13579\\\\119.0902\\\\325.01\\\\26.89038\\\\117.4199\\\\325.01\\\\28.2372\\\\115.9199\\\\325.01\\\\29.32537\\\\114.4199\\\\325.01\\\\30.75554\\\\111.9199\\\\325.01\\\\31.77949\\\\109.4199\\\\325.01\\\\32.32329\\\\107.4199\\\\325.01\\\\32.79064\\\\104.4199\\\\325.01\\\\32.83692\\\\102.9199\\\\325.01\\\\32.6799\\\\100.9199\\\\325.01\\\\32.23861\\\\98.41986\\\\325.01\\\\31.25669\\\\95.41986\\\\325.01\\\\30.30979\\\\93.41986\\\\325.01\\\\29.72363\\\\92.41986\\\\325.01\\\\28.33361\\\\90.41986\\\\325.01\\\\25.96829\\\\87.91986\\\\325.01\\\\24.63579\\\\86.72805\\\\325.01\\\\21.63579\\\\84.76335\\\\325.01\\\\19.63579\\\\83.82532\\\\325.01\\\\18.13579\\\\83.26024\\\\325.01\\\\16.13579\\\\82.73236\\\\325.01\\\\13.63579\\\\82.35223\\\\325.01\\\\11.13579\\\\82.27512\\\\325.01\\\\7.635788\\\\82.77291\\\\325.01\\\\5.635788\\\\83.35789\\\\325.01\\\\3.135788\\\\84.39439\\\\325.01\\\\0.6357885\\\\85.814\\\\325.01\\\\-1.364211\\\\87.34236\\\\325.01\\\\-3.033193\\\\88.91986\\\\325.01\\\\-5.063791\\\\91.41986\\\\325.01\\\\-6.030195\\\\92.91986\\\\325.01\\\\-7.047282\\\\94.91986\\\\325.01\\\\-7.982212\\\\97.41986\\\\325.01\\\\-8.565339\\\\99.91986\\\\325.01\\\\-8.831883\\\\102.9199\\\\325.01\\\\-8.610452\\\\105.9199\\\\325.01\\\\-8.458969\\\\106.9199\\\\325.01\\\\-7.937741\\\\108.9199\\\\325.01\\\\-6.997408\\\\111.4199\\\\325.01\\\\-5.947545\\\\113.4199\\\\325.01\\\\-4.983581\\\\114.9199\\\\325.01\\\\-3.364212\\\\116.8934\\\\325.01\\\\-1.843378\\\\118.4199\\\\325.01\\\\0.1357885\\\\120.0548\\\\325.01\\\\1.635789\\\\121.0273\\\\325.01\\\\3.635788\\\\122.0806\\\\325.01\\\\6.135788\\\\123.0276\\\\325.01\\\\8.135789\\\\123.5526\\\\325.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"54\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"32\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"63.13579\\\\173.8627\\\\325.01\\\\66.63579\\\\173.5429\\\\325.01\\\\68.63579\\\\173.0517\\\\325.01\\\\71.13579\\\\172.1226\\\\325.01\\\\74.13579\\\\170.5327\\\\325.01\\\\76.13579\\\\169.0828\\\\325.01\\\\77.39513\\\\167.9199\\\\325.01\\\\79.25494\\\\165.9199\\\\325.01\\\\80.34204\\\\164.4199\\\\325.01\\\\81.26814\\\\162.9199\\\\325.01\\\\82.24203\\\\160.9199\\\\325.01\\\\83.26665\\\\157.9199\\\\325.01\\\\83.75102\\\\155.4199\\\\325.01\\\\83.89706\\\\152.9199\\\\325.01\\\\83.7918\\\\150.9199\\\\325.01\\\\83.32329\\\\148.4199\\\\325.01\\\\82.73289\\\\146.4199\\\\325.01\\\\81.65215\\\\143.9199\\\\325.01\\\\80.83456\\\\142.4199\\\\325.01\\\\79.83023\\\\140.9199\\\\325.01\\\\78.13579\\\\138.9287\\\\325.01\\\\77.1152\\\\137.9199\\\\325.01\\\\75.13579\\\\136.2468\\\\325.01\\\\73.63579\\\\135.2457\\\\325.01\\\\70.63579\\\\133.7382\\\\325.01\\\\67.63579\\\\132.7589\\\\325.01\\\\64.63579\\\\132.2613\\\\325.01\\\\63.13579\\\\132.1962\\\\325.01\\\\61.13579\\\\132.3016\\\\325.01\\\\58.63579\\\\132.7324\\\\325.01\\\\56.63579\\\\133.2899\\\\325.01\\\\54.13579\\\\134.3387\\\\325.01\\\\51.63579\\\\135.7905\\\\325.01\\\\49.63579\\\\137.3374\\\\325.01\\\\47.52657\\\\139.4199\\\\325.01\\\\45.95454\\\\141.4199\\\\325.01\\\\45.00655\\\\142.9199\\\\325.01\\\\43.99264\\\\144.9199\\\\325.01\\\\42.93922\\\\147.9199\\\\325.01\\\\42.47358\\\\149.9199\\\\325.01\\\\42.22876\\\\152.9199\\\\325.01\\\\42.5039\\\\156.4199\\\\325.01\\\\42.97881\\\\158.4199\\\\325.01\\\\43.47368\\\\159.9199\\\\325.01\\\\44.61928\\\\162.4199\\\\325.01\\\\45.45341\\\\163.9199\\\\325.01\\\\46.4907\\\\165.4199\\\\325.01\\\\48.77973\\\\167.9199\\\\325.01\\\\50.63579\\\\169.5769\\\\325.01\\\\52.13579\\\\170.6161\\\\325.01\\\\53.63579\\\\171.4762\\\\325.01\\\\56.13579\\\\172.604\\\\325.01\\\\57.63579\\\\173.1012\\\\325.01\\\\59.63579\\\\173.5834\\\\325.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"44\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"33\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-36.86421\\\\137.8837\\\\328.01\\\\-40.36421\\\\138.2949\\\\328.01\\\\-43.36421\\\\139.2683\\\\328.01\\\\-45.36421\\\\140.256\\\\328.01\\\\-46.86421\\\\141.2251\\\\328.01\\\\-49.36421\\\\143.4318\\\\328.01\\\\-51.02226\\\\145.4199\\\\328.01\\\\-52.4865\\\\147.9199\\\\328.01\\\\-53.44845\\\\150.4199\\\\328.01\\\\-54.01472\\\\152.9199\\\\328.01\\\\-54.17799\\\\155.4199\\\\328.01\\\\-53.99431\\\\157.9199\\\\328.01\\\\-53.53869\\\\159.9199\\\\328.01\\\\-53.04579\\\\161.4199\\\\328.01\\\\-51.54679\\\\164.4199\\\\328.01\\\\-50.51004\\\\165.9199\\\\328.01\\\\-48.86421\\\\167.6923\\\\328.01\\\\-47.36421\\\\169.0581\\\\328.01\\\\-45.86421\\\\170.0912\\\\328.01\\\\-42.86421\\\\171.5804\\\\328.01\\\\-41.36421\\\\172.0771\\\\328.01\\\\-39.36421\\\\172.5214\\\\328.01\\\\-36.86421\\\\172.7081\\\\328.01\\\\-34.36421\\\\172.5449\\\\328.01\\\\-32.36421\\\\172.1048\\\\328.01\\\\-30.86421\\\\171.6225\\\\328.01\\\\-29.36421\\\\170.9925\\\\328.01\\\\-26.86421\\\\169.5144\\\\328.01\\\\-24.36421\\\\167.2983\\\\328.01\\\\-22.72177\\\\165.4199\\\\328.01\\\\-21.74773\\\\163.9199\\\\328.01\\\\-20.7528\\\\161.9199\\\\328.01\\\\-20.20369\\\\160.4199\\\\328.01\\\\-19.68638\\\\158.4199\\\\328.01\\\\-19.35579\\\\155.4199\\\\328.01\\\\-19.73277\\\\151.9199\\\\328.01\\\\-20.68263\\\\148.9199\\\\328.01\\\\-22.23921\\\\145.9199\\\\328.01\\\\-23.76356\\\\143.9199\\\\328.01\\\\-25.36421\\\\142.3077\\\\328.01\\\\-27.36421\\\\140.775\\\\328.01\\\\-29.36421\\\\139.6808\\\\328.01\\\\-31.36421\\\\138.8302\\\\328.01\\\\-33.36421\\\\138.2729\\\\328.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"48\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"34\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"19.13579\\\\87.28422\\\\328.01\\\\16.13579\\\\86.24017\\\\328.01\\\\13.63579\\\\85.78097\\\\328.01\\\\12.13579\\\\85.70812\\\\328.01\\\\10.13579\\\\85.80904\\\\328.01\\\\7.635788\\\\86.28326\\\\328.01\\\\6.135788\\\\86.7646\\\\328.01\\\\3.135788\\\\88.22263\\\\328.01\\\\1.635789\\\\89.22868\\\\328.01\\\\0.2878155\\\\90.41986\\\\328.01\\\\-2.01651\\\\92.91986\\\\328.01\\\\-3.005878\\\\94.41986\\\\328.01\\\\-4.015807\\\\96.41986\\\\328.01\\\\-5.004518\\\\99.41986\\\\328.01\\\\-5.367085\\\\101.9199\\\\328.01\\\\-5.40542\\\\103.9199\\\\328.01\\\\-4.976191\\\\106.9199\\\\328.01\\\\-4.533483\\\\108.4199\\\\328.01\\\\-3.493332\\\\110.9199\\\\328.01\\\\-2.909943\\\\111.9199\\\\328.01\\\\-1.527902\\\\113.9199\\\\328.01\\\\-0.3642115\\\\115.1828\\\\328.01\\\\1.135789\\\\116.5895\\\\328.01\\\\3.135788\\\\117.9891\\\\328.01\\\\5.135788\\\\119.0462\\\\328.01\\\\8.135789\\\\120.0565\\\\328.01\\\\10.63579\\\\120.4504\\\\328.01\\\\13.13579\\\\120.4817\\\\328.01\\\\15.63579\\\\120.0977\\\\328.01\\\\17.63579\\\\119.5301\\\\328.01\\\\20.63579\\\\118.1171\\\\328.01\\\\22.13579\\\\117.1346\\\\328.01\\\\23.61563\\\\115.9199\\\\328.01\\\\24.63579\\\\114.9158\\\\328.01\\\\26.28404\\\\112.9199\\\\328.01\\\\27.71817\\\\110.4199\\\\328.01\\\\28.33316\\\\108.9199\\\\328.01\\\\28.81362\\\\107.4199\\\\328.01\\\\29.22263\\\\105.4199\\\\328.01\\\\29.37814\\\\102.9199\\\\328.01\\\\29.24661\\\\100.9199\\\\328.01\\\\28.70996\\\\98.41986\\\\328.01\\\\28.19545\\\\96.91986\\\\328.01\\\\27.28689\\\\94.91986\\\\328.01\\\\26.34556\\\\93.41986\\\\328.01\\\\25.22345\\\\91.91986\\\\328.01\\\\23.63579\\\\90.26862\\\\328.01\\\\21.63579\\\\88.71584\\\\328.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"47\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"35\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"31.24777\\\\199.9199\\\\328.01\\\\30.23194\\\\196.9199\\\\328.01\\\\29.18762\\\\194.9199\\\\328.01\\\\27.80543\\\\192.9199\\\\328.01\\\\25.8825\\\\190.9199\\\\328.01\\\\25.13579\\\\190.2482\\\\328.01\\\\23.13579\\\\188.8506\\\\328.01\\\\21.13579\\\\187.7935\\\\328.01\\\\18.13579\\\\186.7796\\\\328.01\\\\15.63579\\\\186.3893\\\\328.01\\\\13.13579\\\\186.358\\\\328.01\\\\10.63579\\\\186.7369\\\\328.01\\\\8.635789\\\\187.3055\\\\328.01\\\\5.635788\\\\188.7204\\\\328.01\\\\4.135788\\\\189.7018\\\\328.01\\\\2.65595\\\\190.9199\\\\328.01\\\\1.632165\\\\191.9199\\\\328.01\\\\-0.01651034\\\\193.9199\\\\328.01\\\\-1.45228\\\\196.4199\\\\328.01\\\\-2.066843\\\\197.9199\\\\328.01\\\\-2.542047\\\\199.4199\\\\328.01\\\\-2.951977\\\\201.4199\\\\328.01\\\\-3.091252\\\\204.4199\\\\328.01\\\\-2.975036\\\\205.9199\\\\328.01\\\\-2.438387\\\\208.4199\\\\328.01\\\\-1.923871\\\\209.9199\\\\328.01\\\\-1.013668\\\\211.9199\\\\328.01\\\\-0.07398161\\\\213.4199\\\\328.01\\\\1.482664\\\\215.4199\\\\328.01\\\\2.635788\\\\216.573\\\\328.01\\\\4.635788\\\\218.1181\\\\328.01\\\\7.135788\\\\219.5555\\\\328.01\\\\10.13579\\\\220.5977\\\\328.01\\\\12.63579\\\\221.0551\\\\328.01\\\\14.13579\\\\221.1316\\\\328.01\\\\16.13579\\\\221.0307\\\\328.01\\\\18.63579\\\\220.5513\\\\328.01\\\\20.13579\\\\220.0735\\\\328.01\\\\23.13579\\\\218.6193\\\\328.01\\\\24.63579\\\\217.6051\\\\328.01\\\\26.63579\\\\215.7863\\\\328.01\\\\28.28404\\\\213.9199\\\\328.01\\\\29.27745\\\\212.4199\\\\328.01\\\\30.28206\\\\210.4199\\\\328.01\\\\31.27239\\\\207.4199\\\\328.01\\\\31.63863\\\\204.9199\\\\328.01\\\\31.677\\\\202.9199\\\\328.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"47\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"36\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"45.63295\\\\152.9199\\\\328.01\\\\45.99919\\\\156.4199\\\\328.01\\\\46.56079\\\\158.4199\\\\328.01\\\\46.94164\\\\159.4199\\\\328.01\\\\48.4909\\\\162.4199\\\\328.01\\\\50.01237\\\\164.4199\\\\328.01\\\\51.63579\\\\166.0496\\\\328.01\\\\53.63579\\\\167.5761\\\\328.01\\\\55.13579\\\\168.4353\\\\328.01\\\\57.63579\\\\169.5475\\\\328.01\\\\59.63579\\\\170.0908\\\\328.01\\\\62.13579\\\\170.4227\\\\328.01\\\\64.13579\\\\170.4052\\\\328.01\\\\66.63579\\\\170.0602\\\\328.01\\\\69.63579\\\\169.0909\\\\328.01\\\\71.63579\\\\168.1004\\\\328.01\\\\73.13579\\\\167.1263\\\\328.01\\\\75.13579\\\\165.4452\\\\328.01\\\\77.29958\\\\162.9199\\\\328.01\\\\78.76894\\\\160.4199\\\\328.01\\\\79.72987\\\\157.9199\\\\328.01\\\\80.2863\\\\155.4199\\\\328.01\\\\80.43733\\\\153.4199\\\\328.01\\\\80.26079\\\\150.4199\\\\328.01\\\\79.80331\\\\148.4199\\\\328.01\\\\79.30334\\\\146.9199\\\\328.01\\\\77.80714\\\\143.9199\\\\328.01\\\\76.75469\\\\142.4199\\\\328.01\\\\75.63579\\\\141.1699\\\\328.01\\\\73.63579\\\\139.3292\\\\328.01\\\\72.13579\\\\138.2726\\\\328.01\\\\69.13579\\\\136.7804\\\\328.01\\\\67.63579\\\\136.2818\\\\328.01\\\\65.13579\\\\135.7744\\\\328.01\\\\63.13579\\\\135.652\\\\328.01\\\\60.63579\\\\135.8225\\\\328.01\\\\58.63579\\\\136.2454\\\\328.01\\\\57.13579\\\\136.731\\\\328.01\\\\55.63579\\\\137.3752\\\\328.01\\\\54.13579\\\\138.2036\\\\328.01\\\\52.63579\\\\139.2228\\\\328.01\\\\51.28782\\\\140.4199\\\\328.01\\\\49.00781\\\\142.9199\\\\328.01\\\\48.03405\\\\144.4199\\\\328.01\\\\47.02981\\\\146.4199\\\\328.01\\\\46.48053\\\\147.9199\\\\328.01\\\\45.95977\\\\149.9199\\\\328.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"39\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"37\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"-35.86421\\\\143.7896\\\\331.01\\\\-38.36421\\\\143.8818\\\\331.01\\\\-40.36421\\\\144.3699\\\\331.01\\\\-42.36421\\\\145.2396\\\\331.01\\\\-43.36421\\\\145.8187\\\\331.01\\\\-44.67136\\\\146.9199\\\\331.01\\\\-46.04104\\\\148.4199\\\\331.01\\\\-46.98353\\\\149.9199\\\\331.01\\\\-47.44573\\\\150.9199\\\\331.01\\\\-47.93336\\\\152.4199\\\\331.01\\\\-48.16312\\\\153.9199\\\\331.01\\\\-48.25866\\\\155.4199\\\\331.01\\\\-48.0823\\\\157.4199\\\\331.01\\\\-47.55443\\\\159.4199\\\\331.01\\\\-46.57254\\\\161.4199\\\\331.01\\\\-45.48601\\\\162.9199\\\\331.01\\\\-44.36421\\\\164.0417\\\\331.01\\\\-42.86421\\\\165.1163\\\\331.01\\\\-40.86421\\\\166.0921\\\\331.01\\\\-39.36421\\\\166.5422\\\\331.01\\\\-36.86421\\\\166.784\\\\331.01\\\\-35.36421\\\\166.6911\\\\331.01\\\\-33.86421\\\\166.4476\\\\331.01\\\\-31.36421\\\\165.5051\\\\331.01\\\\-29.86421\\\\164.5511\\\\331.01\\\\-28.86421\\\\163.6834\\\\331.01\\\\-27.69546\\\\162.4199\\\\331.01\\\\-26.71886\\\\160.9199\\\\331.01\\\\-25.70996\\\\158.4199\\\\331.01\\\\-25.27567\\\\156.4199\\\\331.01\\\\-25.21317\\\\155.4199\\\\331.01\\\\-25.32698\\\\153.9199\\\\331.01\\\\-25.78442\\\\151.9199\\\\331.01\\\\-26.63747\\\\149.9199\\\\331.01\\\\-27.21177\\\\148.9199\\\\331.01\\\\-28.36421\\\\147.5032\\\\331.01\\\\-30.36421\\\\145.7552\\\\331.01\\\\-31.36421\\\\145.1815\\\\331.01\\\\-33.36421\\\\144.3188\\\\331.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"38\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"38\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4.534598\\\\209.9199\\\\331.01\\\\6.188819\\\\211.9199\\\\331.01\\\\8.135789\\\\213.5071\\\\331.01\\\\10.13579\\\\214.5014\\\\331.01\\\\12.13579\\\\215.0422\\\\331.01\\\\14.13579\\\\215.197\\\\331.01\\\\16.63579\\\\215.0084\\\\331.01\\\\18.13579\\\\214.5883\\\\331.01\\\\19.63579\\\\213.9377\\\\331.01\\\\21.13579\\\\213.0235\\\\331.01\\\\22.13579\\\\212.1699\\\\331.01\\\\23.30454\\\\210.9199\\\\331.01\\\\24.30439\\\\209.4199\\\\331.01\\\\25.19557\\\\207.4199\\\\331.01\\\\25.71232\\\\205.4199\\\\331.01\\\\25.81808\\\\203.9199\\\\331.01\\\\25.67383\\\\201.9199\\\\331.01\\\\25.30427\\\\200.4199\\\\331.01\\\\24.75245\\\\198.9199\\\\331.01\\\\24.23462\\\\197.9199\\\\331.01\\\\23.19348\\\\196.4199\\\\331.01\\\\21.63579\\\\194.8493\\\\331.01\\\\20.13579\\\\193.8005\\\\331.01\\\\18.13579\\\\192.881\\\\331.01\\\\16.13579\\\\192.3417\\\\331.01\\\\14.63579\\\\192.2231\\\\331.01\\\\12.63579\\\\192.3105\\\\331.01\\\\10.63579\\\\192.7975\\\\331.01\\\\8.635789\\\\193.6931\\\\331.01\\\\7.635788\\\\194.2918\\\\331.01\\\\5.818221\\\\195.9199\\\\331.01\\\\4.971154\\\\196.9199\\\\331.01\\\\4.039197\\\\198.4199\\\\331.01\\\\3.596016\\\\199.4199\\\\331.01\\\\3.00558\\\\201.4199\\\\331.01\\\\2.826006\\\\203.9199\\\\331.01\\\\3.086875\\\\206.4199\\\\331.01\\\\3.532528\\\\207.9199\\\\331.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"39\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"39\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"21.73698\\\\96.91986\\\\331.01\\\\20.08276\\\\94.91986\\\\331.01\\\\18.13579\\\\93.33265\\\\331.01\\\\16.13579\\\\92.33833\\\\331.01\\\\14.13579\\\\91.79752\\\\331.01\\\\12.13579\\\\91.64268\\\\331.01\\\\9.635789\\\\91.83131\\\\331.01\\\\8.135789\\\\92.25138\\\\331.01\\\\6.635788\\\\92.902\\\\331.01\\\\5.135788\\\\93.8162\\\\331.01\\\\4.135788\\\\94.66986\\\\331.01\\\\2.967038\\\\95.91986\\\\331.01\\\\1.967184\\\\97.41986\\\\331.01\\\\1.076006\\\\99.41986\\\\331.01\\\\0.5592579\\\\101.4199\\\\331.01\\\\0.4534968\\\\102.9199\\\\331.01\\\\0.597745\\\\104.9199\\\\331.01\\\\0.9673102\\\\106.4199\\\\331.01\\\\1.519122\\\\107.9199\\\\331.01\\\\2.036951\\\\108.9199\\\\331.01\\\\3.078096\\\\110.4199\\\\331.01\\\\4.635788\\\\111.9904\\\\331.01\\\\6.135788\\\\113.0392\\\\331.01\\\\8.135789\\\\113.9587\\\\331.01\\\\10.13579\\\\114.498\\\\331.01\\\\11.63579\\\\114.6167\\\\331.01\\\\13.63579\\\\114.5292\\\\331.01\\\\15.63579\\\\114.0422\\\\331.01\\\\17.63579\\\\113.1466\\\\331.01\\\\18.63579\\\\112.5479\\\\331.01\\\\20.45336\\\\110.9199\\\\331.01\\\\21.30042\\\\109.9199\\\\331.01\\\\22.23238\\\\108.4199\\\\331.01\\\\22.67556\\\\107.4199\\\\331.01\\\\23.266\\\\105.4199\\\\331.01\\\\23.41296\\\\103.9199\\\\331.01\\\\23.39122\\\\101.9199\\\\331.01\\\\23.1847\\\\100.4199\\\\331.01\\\\22.73905\\\\98.91986\\\\331.01\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0016\" : {\n" +" \"Name\" : \"ContourImageSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"0008,1150\" : {\n" +" \"Name\" : \"ReferencedSOPClassUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" +" },\n" +" \"0008,1155\" : {\n" +" \"Name\" : \"ReferencedSOPInstanceUID\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0042\" : {\n" +" \"Name\" : \"ContourGeometricType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CLOSED_PLANAR\"\n" +" },\n" +" \"3006,0046\" : {\n" +" \"Name\" : \"NumberOfContourPoints\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"37\"\n" +" },\n" +" \"3006,0048\" : {\n" +" \"Name\" : \"ContourNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"40\"\n" +" },\n" +" \"3006,0050\" : {\n" +" \"Name\" : \"ContourData\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"74.53024\\\\152.9199\\\\331.01\\\\74.26877\\\\150.4199\\\\331.01\\\\73.81514\\\\148.9199\\\\331.01\\\\72.83221\\\\146.9199\\\\331.01\\\\71.73194\\\\145.4199\\\\331.01\\\\70.63579\\\\144.3343\\\\331.01\\\\69.13579\\\\143.2472\\\\331.01\\\\67.13579\\\\142.2623\\\\331.01\\\\65.63579\\\\141.8188\\\\331.01\\\\63.13579\\\\141.581\\\\331.01\\\\60.63579\\\\141.7975\\\\331.01\\\\59.13579\\\\142.2188\\\\331.01\\\\57.63579\\\\142.8559\\\\331.01\\\\56.13579\\\\143.804\\\\331.01\\\\55.40785\\\\144.4199\\\\331.01\\\\53.99204\\\\145.9199\\\\331.01\\\\53.00511\\\\147.4199\\\\331.01\\\\51.98905\\\\149.9199\\\\331.01\\\\51.54905\\\\151.9199\\\\331.01\\\\51.52641\\\\153.9199\\\\331.01\\\\52.04536\\\\156.4199\\\\331.01\\\\52.89742\\\\158.4199\\\\331.01\\\\53.47115\\\\159.4199\\\\331.01\\\\54.63579\\\\160.8652\\\\331.01\\\\56.63579\\\\162.6044\\\\331.01\\\\58.13579\\\\163.4489\\\\331.01\\\\59.63579\\\\164.0449\\\\331.01\\\\61.63579\\\\164.5168\\\\331.01\\\\63.13579\\\\164.5917\\\\331.01\\\\64.63579\\\\164.4964\\\\331.01\\\\66.63579\\\\164.0014\\\\331.01\\\\68.63579\\\\163.1234\\\\331.01\\\\70.40923\\\\161.9199\\\\331.01\\\\71.63579\\\\160.736\\\\331.01\\\\72.67847\\\\159.4199\\\\331.01\\\\73.72818\\\\157.4199\\\\331.01\\\\74.21391\\\\155.9199\\\\331.01\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"3006,0080\" : {\n" +" \"Name\" : \"RTROIObservationsSequence\",\n" +" \"Type\" : \"Sequence\",\n" +" \"Value\" : [\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"1\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"LN300\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ORGAN\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"2\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Cortical Bone\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ORGAN\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"3\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Adipose\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ORGAN\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"4\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"CB2-50%\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ORGAN\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"5\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"Water\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ORGAN\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"6\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"10\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"External\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"EXTERNAL\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" },\n" +" {\n" +" \"3006,0082\" : {\n" +" \"Name\" : \"ObservationNumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"7\"\n" +" },\n" +" \"3006,0084\" : {\n" +" \"Name\" : \"ReferencedROINumber\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"11\"\n" +" },\n" +" \"3006,0085\" : {\n" +" \"Name\" : \"ROIObservationLabel\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"PTV\"\n" +" },\n" +" \"3006,00a4\" : {\n" +" \"Name\" : \"RTROIInterpretedType\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"PTV\"\n" +" },\n" +" \"3006,00a6\" : {\n" +" \"Name\" : \"ROIInterpreter\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"\"\n" +" }\n" +" }\n" +" ]\n" +" },\n" +" \"300e,0002\" : {\n" +" \"Name\" : \"ApprovalStatus\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"APPROVED\"\n" +" },\n" +" \"300e,0004\" : {\n" +" \"Name\" : \"ReviewDate\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"20190318\"\n" +" },\n" +" \"300e,0005\" : {\n" +" \"Name\" : \"ReviewTime\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"182558\"\n" +" },\n" +" \"300e,0008\" : {\n" +" \"Name\" : \"ReviewerName\",\n" +" \"Type\" : \"String\",\n" +" \"Value\" : \"ONC_jwulff2\"\n" +" }\n" +"}\n" +""; + +#ifdef _MSC_VER +#pragma endregion +#endif +// _MSC_VER + +/* +these tests are single-threaded... no worries for old buggy compilers +(I'm talking to YOU, cl.exe v100! And to your ancestors!) +*/ +static std::string& GetTestJson() +{ + static const char* resultRaw = NULL; + static std::string result; + if (resultRaw == NULL) + { + std::stringstream sst; + + sst << k_rtStruct_json00 + << k_rtStruct_json01 + << k_rtStruct_json02 + << k_rtStruct_json03 + << k_rtStruct_json04 + << k_rtStruct_json05 + << k_rtStruct_json06 + << k_rtStruct_json07 + << k_rtStruct_json08; + + std::string wholeBody = sst.str(); + result.swap(wholeBody); + resultRaw = result.c_str(); + } + return result; +} + +#define STONE_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +static void CheckGroundTruth( + const std::vector& structures, + const size_t structureIndex, + const size_t sliceIndex, + std::vector groundTruth) +{ + const std::vector& polygonsForThisStruct = structures.at(structureIndex).GetPolygons(); + const DicomStructurePolygon2& polygon = polygonsForThisStruct.at(sliceIndex); + + //double groundTruth[] = { 7.657838, 108.2725, 304.01, 6.826687, 107.4413, 304.01, 6.152492, 106.4785, 304.01, 5.655735, 105.4132, 304.01, 5.351513, 104.2778, 304.01, 5.249068, 103.1069, 304.01, 5.351513, 101.9359, 304.01, 5.655735, 100.8005, 304.01, 6.152492, 99.73524, 304.01, 6.826687, 98.77239, 304.01, 7.657838, 97.94124, 304.01, 8.620689, 97.26704, 304.01, 9.685987, 96.77029, 304.01, 10.82136, 96.46606, 304.01, 11.99231, 96.36362, 304.01, 13.16326, 96.46606, 304.01, 14.29864, 96.77029, 304.01, 15.36393, 97.26704, 304.01, 16.32678, 97.94124, 304.01, 17.15794, 98.77239, 304.01, 17.83213, 99.73524, 304.01, 18.32889, 100.8005, 304.01, 18.63311, 101.9359, 304.01, 18.73555, 103.1069, 304.01, 18.63311, 104.2778, 304.01, 18.32889, 105.4132, 304.01, 17.83213, 106.4785, 304.01, 17.15794, 107.4413, 304.01, 16.32678, 108.2725, 304.01, 15.36393, 108.9467, 304.01, 14.29864, 109.4434, 304.01, 13.16326, 109.7477, 304.01, 11.99231, 109.8501, 304.01, 10.82136, 109.7477, 304.01, 9.685987, 109.4434, 304.01, 8.620689, 108.9467, 304.01 }; + size_t groundTruthItems = groundTruth.size(); + + size_t pointCount = 3 * polygon.GetPointCount(); + + EXPECT_EQ(groundTruthItems, pointCount); + + for (size_t i = 0; i < polygon.GetPointCount(); ++i) + { + const Point3D& point = polygon.GetPoint(i); + + // loop over X, Y then Z. + for (size_t j = 0; j < 3; ++j) + { + size_t index = 3 * i + j; + ASSERT_LT(index, groundTruthItems); + bool isNear = LinearAlgebra::IsNear(groundTruth[index], point[j]); + EXPECT_TRUE(isNear); + } + } +} + + +TEST(StructureSet, ReadFromJsonThatsAll) +{ + DicomStructureSet2 structureSet; + + OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); + //loader.content_.reset(new DicomStructureSet(dicom)); + structureSet.Clear(); + + structureSet.FillStructuresFromDataset(dicom); + structureSet.ComputeDependentProperties(); + + const std::vector& structures = structureSet.structures_; + + /* + + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•”β•β•β•β•β• + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•— β•šβ•β•β•β•β–ˆβ–ˆβ•‘ + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ + β•šβ•β•β•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• + http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=BASIC%20CHECKS + */ + + // (0x3006, 0x0080) seq. size + EXPECT_EQ(7, structures.size()); + + // (0x3006, 0x0080)[i]/(0x3006, 0x00a4) + for (size_t i = 0; i < 5; ++i) + { + EXPECT_EQ(std::string("ORGAN"), structures[i].interpretation_); + } + EXPECT_EQ(std::string("EXTERNAL"), structures[5].interpretation_); + EXPECT_EQ(std::string("PTV"), structures[6].interpretation_); + + // (0x3006, 0x0020)[i]/(0x3006, 0x0026) + EXPECT_EQ(std::string("LN300"), structures[0].name_); + EXPECT_EQ(std::string("Cortical Bone"), structures[1].name_); + EXPECT_EQ(std::string("Adipose"), structures[2].name_); + EXPECT_EQ(std::string("CB2-50%"), structures[3].name_); + EXPECT_EQ(std::string("Water"), structures[4].name_); + EXPECT_EQ(std::string("External"), structures[5].name_); + EXPECT_EQ(std::string("PTV"), structures[6].name_); + + // (0x3006, 0x0039)[i]/(0x3006, 0x002a) + EXPECT_EQ(0xff, structures[0].red_); + EXPECT_EQ(0x00, structures[0].green_); + EXPECT_EQ(0x00, structures[0].blue_); + + EXPECT_EQ(0x00, structures[1].red_); + EXPECT_EQ(0xff, structures[1].green_); + EXPECT_EQ(0xff, structures[1].blue_); + + // ... + + EXPECT_EQ(0x00, structures[5].red_); + EXPECT_EQ(0x80, structures[5].green_); + EXPECT_EQ(0x00, structures[5].blue_); + + EXPECT_EQ(0xff, structures[6].red_); + EXPECT_EQ(0x00, structures[6].green_); + EXPECT_EQ(0xff, structures[6].blue_); + + /* + + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•— β–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β• + β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β–ˆβ–ˆβ–ˆβ–ˆβ•”β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• + β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•— β•šβ–ˆβ–ˆβ•”β• + β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β•šβ•β• β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ + β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• + http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=BASIC%20CHECKS + */ + + + { + double groundTruthRaw[] = { 7.657838, 108.2725, 304.01, 6.826687, 107.4413, 304.01, 6.152492, 106.4785, 304.01, 5.655735, 105.4132, 304.01, 5.351513, 104.2778, 304.01, 5.249068, 103.1069, 304.01, 5.351513, 101.9359, 304.01, 5.655735, 100.8005, 304.01, 6.152492, 99.73524, 304.01, 6.826687, 98.77239, 304.01, 7.657838, 97.94124, 304.01, 8.620689, 97.26704, 304.01, 9.685987, 96.77029, 304.01, 10.82136, 96.46606, 304.01, 11.99231, 96.36362, 304.01, 13.16326, 96.46606, 304.01, 14.29864, 96.77029, 304.01, 15.36393, 97.26704, 304.01, 16.32678, 97.94124, 304.01, 17.15794, 98.77239, 304.01, 17.83213, 99.73524, 304.01, 18.32889, 100.8005, 304.01, 18.63311, 101.9359, 304.01, 18.73555, 103.1069, 304.01, 18.63311, 104.2778, 304.01, 18.32889, 105.4132, 304.01, 17.83213, 106.4785, 304.01, 17.15794, 107.4413, 304.01, 16.32678, 108.2725, 304.01, 15.36393, 108.9467, 304.01, 14.29864, 109.4434, 304.01, 13.16326, 109.7477, 304.01, 11.99231, 109.8501, 304.01, 10.82136, 109.7477, 304.01, 9.685987, 109.4434, 304.01, 8.620689, 108.9467, 304.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + CheckGroundTruth(structures, 0, 0, groundTruth); + } + { + double groundTruthRaw[] = { 7.657838, 108.2725, 310.01, 6.826687, 107.4413, 310.01, 6.152492, 106.4785, 310.01, 5.655735, 105.4132, 310.01, 5.351513, 104.2778, 310.01, 5.249068, 103.1069, 310.01, 5.351513, 101.9359, 310.01, 5.655735, 100.8005, 310.01, 6.152492, 99.73524, 310.01, 6.826687, 98.77239, 310.01, 7.657838, 97.94124, 310.01, 8.620689, 97.26704, 310.01, 9.685987, 96.77029, 310.01, 10.82136, 96.46606, 310.01, 11.99231, 96.36362, 310.01, 13.16326, 96.46606, 310.01, 14.29864, 96.77029, 310.01, 15.36393, 97.26704, 310.01, 16.32678, 97.94124, 310.01, 17.15794, 98.77239, 310.01, 17.83213, 99.73524, 310.01, 18.32889, 100.8005, 310.01, 18.63311, 101.9359, 310.01, 18.73555, 103.1069, 310.01, 18.63311, 104.2778, 310.01, 18.32889, 105.4132, 310.01, 17.83213, 106.4785, 310.01, 17.15794, 107.4413, 310.01, 16.32678, 108.2725, 310.01, 15.36393, 108.9467, 310.01, 14.29864, 109.4434, 310.01, 13.16326, 109.7477, 310.01, 11.99231, 109.8501, 310.01, 10.82136, 109.7477, 310.01, 9.685987, 109.4434, 310.01, 8.620689, 108.9467, 310.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + CheckGroundTruth(structures, 0, 2, groundTruth); + } + { + double groundTruthRaw[] = { -37.967, 161.9664, 304.01, -39.10237, 161.6622, 304.01, -40.16767, 161.1655, 304.01, -41.13052, 160.4913, 304.01, -41.96167, 159.6601, 304.01, -42.63587, 158.6973, 304.01, -43.13263, 157.632, 304.01, -43.43685, 156.4966, 304.01, -43.53929, 155.3257, 304.01, -43.43685, 154.1547, 304.01, -43.13263, 153.0193, 304.01, -42.63587, 151.954, 304.01, -41.96167, 150.9912, 304.01, -41.13052, 150.16, 304.01, -40.16767, 149.4858, 304.01, -39.10237, 148.9891, 304.01, -37.967, 148.6849, 304.01, -36.79605, 148.5824, 304.01, -35.6251, 148.6849, 304.01, -34.48972, 148.9891, 304.01, -33.42443, 149.4858, 304.01, -32.46157, 150.16, 304.01, -31.63042, 150.9912, 304.01, -30.95623, 151.954, 304.01, -30.45947, 153.0193, 304.01, -30.15525, 154.1547, 304.01, -30.0528, 155.3257, 304.01, -30.15525, 156.4966, 304.01, -30.45947, 157.632, 304.01, -30.95623, 158.6973, 304.01, -31.63042, 159.6601, 304.01, -32.46157, 160.4913, 304.01, -33.42443, 161.1655, 304.01, -34.48972, 161.6622, 304.01, -35.6251, 161.9664, 304.01, -36.79605, 162.0689, 304.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + CheckGroundTruth(structures, 1, 0, groundTruth); + } + { + double groundTruthRaw[] = { 69.4042, 150.7324, 307.01, 69.70842, 151.8678, 307.01, 69.81087, 153.0387, 307.01, 69.70842, 154.2097, 307.01, 69.4042, 155.345, 307.01, 68.90745, 156.4103, 307.01, 68.23325, 157.3732, 307.01, 67.4021, 158.2043, 307.01, 66.43925, 158.8785, 307.01, 65.37395, 159.3753, 307.01, 64.23858, 159.6795, 307.01, 63.06762, 159.7819, 307.01, 61.89667, 159.6795, 307.01, 60.7613, 159.3753, 307.01, 59.696, 158.8785, 307.01, 58.73315, 158.2043, 307.01, 57.902, 157.3732, 307.01, 57.22781, 156.4103, 307.01, 56.73105, 155.345, 307.01, 56.42683, 154.2097, 307.01, 56.32438, 153.0387, 307.01, 56.42683, 151.8678, 307.01, 56.73105, 150.7324, 307.01, 57.22781, 149.6671, 307.01, 57.902, 148.7042, 307.01, 58.73315, 147.8731, 307.01, 59.696, 147.1989, 307.01, 60.7613, 146.7021, 307.01, 61.89667, 146.3979, 307.01, 63.06762, 146.2955, 307.01, 64.23858, 146.3979, 307.01, 65.37395, 146.7021, 307.01, 66.43925, 147.1989, 307.01, 67.4021, 147.8731, 307.01, 68.23325, 148.7042, 307.01, 68.90745, 149.6671, 307.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + CheckGroundTruth(structures, 2, 1, groundTruth); + } + + { + double groundTruthRaw[] = { 108.3984, 232.7406, 274.01, 106.0547, 231.7948, 274.01, 103.7109, 232.8407, 274.01, 96.67969, 232.8757, 274.01, 77.92969, 232.887, 274.01, 47.46094, 232.8902, 274.01, 38.08594, 232.7537, 274.01, 37.6668, 232.3734, 274.01, 38.08594, 231.9774, 274.01, 40.42969, 231.8475, 274.01, 41.76413, 230.0297, 274.01, 42.77344, 229.1388, 274.01, 45.11719, 228.5069, 274.01, 47.46094, 227.1533, 274.01, 49.80469, 226.3505, 274.01, 52.14844, 224.6564, 274.01, 54.49219, 223.923, 274.01, 56.83594, 222.0692, 274.01, 59.17969, 220.3438, 274.01, 61.52344, 219.3888, 274.01, 63.86719, 217.1287, 274.01, 65.83488, 215.9672, 274.01, 68.55469, 213.2383, 274.01, 70.89844, 211.2328, 274.01, 72.8125, 208.9359, 274.01, 75.58594, 206.3615, 274.01, 76.91445, 204.2484, 274.01, 78.89509, 201.9047, 274.01, 80.51276, 199.5609, 274.01, 81.51955, 197.2172, 274.01, 83.67448, 194.8734, 274.01, 84.60938, 192.5297, 274.01, 85.86986, 190.1859, 274.01, 86.57623, 187.8422, 274.01, 88.30051, 185.4984, 274.01, 88.94002, 183.1547, 274.01, 89.23261, 180.8109, 274.01, 89.64844, 180.3263, 274.01, 90.71885, 178.4672, 274.01, 90.97656, 176.1234, 274.01, 91.99219, 174.4794, 274.01, 92.56773, 173.7797, 274.01, 92.80016, 171.4359, 274.01, 93.23473, 169.0922, 274.01, 93.37606, 166.7484, 274.01, 93.60748, 157.3734, 274.01, 93.6341, 152.6859, 274.01, 93.35742, 140.9672, 274.01, 92.89317, 138.6234, 274.01, 92.7069, 136.2797, 274.01, 92.03726, 133.9359, 274.01, 90.84009, 131.5922, 274.01, 90.3769, 129.2484, 274.01, 89.09074, 126.9047, 274.01, 88.13225, 122.2172, 274.01, 86.17828, 119.8734, 274.01, 84.96094, 117.4163, 274.01, 83.99619, 115.1859, 274.01, 83.13079, 112.8422, 274.01, 82.61719, 112.2984, 274.01, 80.27344, 108.8454, 274.01, 79.64514, 108.1547, 274.01, 77.21497, 105.8109, 274.01, 76.47787, 103.4672, 274.01, 75.58594, 102.6177, 274.01, 73.24219, 100.0077, 274.01, 69.54492, 96.43594, 274.01, 67.34096, 94.09219, 274.01, 64.66306, 91.74844, 274.01, 63.86719, 90.92619, 274.01, 61.52344, 90.20454, 274.01, 59.17969, 87.78574, 274.01, 56.83594, 86.48566, 274.01, 54.49219, 84.31388, 274.01, 52.14844, 83.44438, 274.01, 49.80469, 82.75121, 274.01, 49.37617, 82.37344, 274.01, 47.46094, 81.26244, 274.01, 45.71391, 80.02969, 274.01, 45.11719, 79.45415, 274.01, 42.77344, 79.08185, 274.01, 40.42969, 78.51941, 274.01, 38.08594, 78.27534, 274.01, 37.36932, 77.68594, 274.01, 35.74219, 76.67624, 274.01, 33.39844, 76.49941, 274.01, 31.05469, 76.03495, 274.01, 28.71094, 74.83174, 274.01, 26.36719, 74.62859, 274.01, 24.02344, 74.55463, 274.01, 21.67969, 74.22861, 274.01, 19.33594, 74.05312, 274.01, 12.30469, 73.99397, 274.01, 5.273438, 74.0736, 274.01, 2.929688, 74.55463, 274.01, 0.5859375, 74.68513, 274.01, -1.757813, 74.914, 274.01, -2.319131, 75.34219, 274.01, -4.101563, 76.31516, 274.01, -8.789063, 76.74514, 274.01, -11.13281, 78.39038, 274.01, -13.47656, 78.6124, 274.01, -15.82031, 79.19784, 274.01, -18.16406, 81.11024, 274.01, -20.50781, 82.03296, 274.01, -22.85156, 83.13991, 274.01, -25.19531, 83.70732, 274.01, -27.53906, 85.85863, 274.01, -29.88281, 87.03368, 274.01, -32.22656, 88.3274, 274.01, -34.57031, 90.53674, 274.01, -36.91406, 92.5602, 274.01, -39.25781, 93.55952, 274.01, -41.60156, 95.74537, 274.01, -43.94531, 98.26609, 274.01, -46.28906, 100.3701, 274.01, -47.02621, 101.1234, 274.01, -47.86611, 103.4672, 274.01, -49.83594, 105.8109, 274.01, -51.98182, 108.1547, 274.01, -53.06448, 110.4984, 274.01, -53.32031, 110.7675, 274.01, -54.53804, 112.8422, 274.01, -55.66406, 114.273, 274.01, -56.55722, 115.1859, 274.01, -57.13953, 117.5297, 274.01, -58.29264, 119.8734, 274.01, -59.26869, 122.2172, 274.01, -60.35156, 124.0119, 274.01, -60.84229, 124.5609, 274.01, -61.54484, 126.9047, 274.01, -61.71691, 129.2484, 274.01, -63.62281, 131.5922, 274.01, -63.81256, 133.9359, 274.01, -64.12511, 136.2797, 274.01, -64.84515, 138.6234, 274.01, -65.13599, 140.9672, 274.01, -65.33604, 143.3109, 274.01, -65.87358, 145.6547, 274.01, -66.10577, 147.9984, 274.01, -66.17618, 155.0297, 274.01, -66.09933, 162.0609, 274.01, -65.40382, 164.4047, 274.01, -65.24833, 166.7484, 274.01, -64.71442, 171.4359, 274.01, -63.88171, 173.7797, 274.01, -63.69299, 176.1234, 274.01, -61.79081, 178.4672, 274.01, -61.59269, 180.8109, 274.01, -61.19405, 183.1547, 274.01, -60.35156, 185.2055, 274.01, -59.08288, 187.8422, 274.01, -58.00781, 189.3499, 274.01, -57.25858, 190.1859, 274.01, -56.64558, 192.5297, 274.01, -55.29191, 194.8734, 274.01, -54.28698, 197.2172, 274.01, -52.28595, 199.5609, 274.01, -51.47569, 201.9047, 274.01, -48.63281, 204.6417, 274.01, -47.10181, 206.5922, 274.01, -44.64154, 208.9359, 274.01, -42.38504, 211.2797, 274.01, -39.25781, 214.4025, 274.01, -37.42723, 215.9672, 274.01, -34.57031, 218.9107, 274.01, -32.22656, 219.7277, 274.01, -29.88281, 221.6934, 274.01, -27.53906, 222.852, 274.01, -25.19531, 224.5168, 274.01, -22.85156, 225.9419, 274.01, -20.50781, 226.7359, 274.01, -18.16406, 228.3332, 274.01, -15.82031, 229.065, 274.01, -13.47656, 229.267, 274.01, -12.63854, 230.0297, 274.01, -11.13281, 231.9201, 274.01, -10.65505, 232.3734, 274.01, -11.13281, 232.7794, 274.01, -15.82031, 232.792, 274.01, -18.16406, 232.8902, 274.01, -36.91406, 232.9015, 274.01, -39.25781, 232.8902, 274.01, -50.97656, 232.9236, 274.01, -60.35156, 232.9126, 274.01, -67.38281, 232.8407, 274.01, -72.07031, 232.8642, 274.01, -79.10156, 232.8555, 274.01, -83.78906, 232.8788, 274.01, -95.50781, 232.8902, 274.01, -97.85156, 233.4886, 274.01, -100.1953, 233.647, 274.01, -102.5391, 232.9858, 274.01, -104.8828, 233.6969, 274.01, -109.5703, 233.722, 274.01, -125.9766, 233.7086, 274.01, -128.3203, 233.2849, 274.01, -130.6641, 233.702, 274.01, -135.3516, 233.727, 274.01, -149.4141, 233.7135, 274.01, -156.4453, 233.727, 274.01, -163.4766, 233.7119, 274.01, -168.1641, 233.7643, 274.01, -191.6016, 233.7809, 274.01, -210.3516, 233.7716, 274.01, -224.4141, 233.7998, 274.01, -233.7891, 233.7647, 274.01, -243.1641, 233.7785, 274.01, -247.8516, 233.7378, 274.01, -254.8828, 233.8578, 274.01, -257.2266, 235.2519, 274.01, -259.5703, 236.0817, 274.01, -260.7617, 237.0609, 274.01, -261.9141, 238.2262, 274.01, -262.8989, 239.4047, 274.01, -262.9743, 241.7484, 274.01, -262.5977, 244.0922, 274.01, -260.6675, 246.4359, 274.01, -259.6161, 248.7797, 274.01, -257.2266, 251.0035, 274.01, -255.0361, 253.4672, 274.01, -252.5391, 256.0995, 274.01, -251.2277, 258.1547, 274.01, -246.7444, 262.8422, 274.01, -243.1641, 266.3515, 274.01, -239.7411, 269.8734, 274.01, -238.4766, 270.9495, 274.01, -237.2269, 272.2172, 274.01, -236.1328, 273.5215, 274.01, -235.0934, 274.5609, 274.01, -233.7891, 275.6655, 274.01, -232.5319, 276.9047, 274.01, -231.4453, 278.1693, 274.01, -227.917, 281.5922, 274.01, -224.4141, 285.1802, 274.01, -222.0703, 287.4025, 274.01, -218.6841, 290.9672, 274.01, -217.3828, 291.9709, 274.01, -215.0391, 293.1788, 274.01, -212.6953, 294.5138, 274.01, -210.3516, 295.2614, 274.01, -209.8994, 295.6547, 274.01, -208.0078, 296.7083, 274.01, -203.3203, 296.9372, 274.01, -196.2891, 296.9317, 274.01, -193.9453, 296.8988, 274.01, -172.8516, 296.8482, 274.01, -161.1328, 296.843, 274.01, -137.6953, 296.8542, 274.01, -130.6641, 296.8378, 274.01, -107.2266, 296.8379, 274.01, -93.16406, 296.8208, 274.01, -74.41406, 296.838, 274.01, -65.03906, 296.8609, 274.01, -50.97656, 296.8556, 274.01, -46.28906, 296.9051, 274.01, -41.60156, 298.5331, 274.01, -39.25781, 298.5624, 274.01, -36.91406, 297.1455, 274.01, -34.57031, 297.0498, 274.01, -32.22656, 298.5589, 274.01, -25.19531, 298.5624, 274.01, -22.85156, 297.2842, 274.01, -20.50781, 298.5624, 274.01, -1.757813, 298.5624, 274.01, 0.5859375, 297.2104, 274.01, 2.929688, 298.5624, 274.01, 5.273438, 297.6946, 274.01, 7.617188, 298.5168, 274.01, 9.960938, 298.5512, 274.01, 12.30469, 296.937, 274.01, 14.64844, 298.5478, 274.01, 16.99219, 298.5478, 274.01, 19.33594, 297.0782, 274.01, 21.67969, 296.844, 274.01, 23.54531, 297.9984, 274.01, 24.02344, 298.4023, 274.01, 24.50156, 297.9984, 274.01, 26.36719, 296.844, 274.01, 38.08594, 296.8381, 274.01, 52.14844, 296.8033, 274.01, 59.17969, 296.8033, 274.01, 73.24219, 296.7682, 274.01, 99.02344, 296.7566, 274.01, 117.7734, 296.7216, 274.01, 129.4922, 296.7152, 274.01, 131.8359, 295.9083, 274.01, 134.1797, 295.5245, 274.01, 138.8672, 295.4763, 274.01, 155.2734, 295.4763, 274.01, 176.3672, 295.3861, 274.01, 190.4297, 295.3718, 274.01, 197.4609, 295.4763, 274.01, 202.1484, 295.4454, 274.01, 204.4922, 295.3438, 274.01, 206.8359, 295.0757, 274.01, 209.1797, 294.4124, 274.01, 211.5234, 292.3133, 274.01, 213.8672, 291.0809, 274.01, 216.2109, 289.6743, 274.01, 217.3081, 288.6234, 274.01, 219.3558, 286.2797, 274.01, 221.8608, 283.9359, 274.01, 225.5859, 280.045, 274.01, 227.9297, 277.8885, 274.01, 230.2734, 275.2857, 274.01, 232.6172, 273.2225, 274.01, 233.6225, 272.2172, 274.01, 234.9609, 270.5822, 274.01, 238.2254, 267.5297, 274.01, 240.3691, 265.1859, 274.01, 244.3359, 261.3326, 274.01, 246.6797, 258.8034, 274.01, 249.0234, 256.7196, 274.01, 251.3672, 254.0746, 274.01, 254.5313, 251.1234, 274.01, 255.333, 248.7797, 274.01, 257.3723, 246.4359, 274.01, 259.7201, 244.0922, 274.01, 260.106, 241.7484, 274.01, 261.6423, 239.4047, 274.01, 261.0804, 237.0609, 274.01, 259.3552, 234.7172, 274.01, 258.3984, 233.7696, 274.01, 256.0547, 232.8757, 274.01, 253.7109, 232.792, 274.01, 251.3672, 232.8161, 274.01, 246.6797, 232.6981, 274.01, 244.3359, 232.725, 274.01, 239.6484, 232.9137, 274.01, 234.9609, 232.8525, 274.01, 225.5859, 232.8757, 274.01, 209.1797, 232.8757, 274.01, 204.4922, 232.7537, 274.01, 195.1172, 232.7794, 274.01, 171.6797, 232.792, 274.01, 164.6484, 232.7666, 274.01, 152.9297, 232.7666, 274.01, 148.2422, 232.792, 274.01, 138.8672, 232.7406, 274.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + EXPECT_EQ(340u * 3, groundTruth.size()); + CheckGroundTruth(structures, 5, 0, groundTruth); + } + + { + double groundTruthRaw[] = { -18.16406, 233.0632, 298.01, -27.53906, 233.1042, 298.01, -29.88281, 233.0819, 298.01, -34.57031, 233.131, 298.01, -43.94531, 233.1221, 298.01, -50.97656, 233.1736, 298.01, -62.69531, 233.1397, 298.01, -65.03906, 232.8376, 298.01, -69.72656, 232.9839, 298.01, -79.10156, 233.0245, 298.01, -90.82031, 233.0382, 298.01, -93.16406, 233.0859, 298.01, -109.5703, 233.1132, 298.01, -111.9141, 233.1791, 298.01, -114.2578, 233.7139, 298.01, -118.9453, 233.9793, 298.01, -128.3203, 234.0284, 298.01, -130.6641, 233.9793, 298.01, -135.3516, 234.0591, 298.01, -137.6953, 234.0284, 298.01, -142.3828, 234.0855, 298.01, -144.7266, 234.0284, 298.01, -151.7578, 234.002, 298.01, -158.7891, 234.0263, 298.01, -163.4766, 233.9784, 298.01, -165.8203, 234.0072, 298.01, -168.1641, 234.1756, 298.01, -170.5078, 234.2214, 298.01, -179.8828, 234.1934, 298.01, -186.9141, 234.2721, 298.01, -189.2578, 234.2289, 298.01, -193.9453, 234.2431, 298.01, -198.6328, 234.1692, 298.01, -200.9766, 234.2326, 298.01, -205.6641, 234.1271, 298.01, -212.6953, 234.2224, 298.01, -215.0391, 234.1992, 298.01, -222.0703, 234.3115, 298.01, -224.4141, 234.2224, 298.01, -226.7578, 234.2502, 298.01, -233.7891, 234.0906, 298.01, -238.4766, 234.0329, 298.01, -243.1641, 234.0283, 298.01, -247.8516, 233.7949, 298.01, -250.1953, 233.8681, 298.01, -252.5391, 234.7626, 298.01, -254.3469, 237.0609, 298.01, -255.6034, 239.4047, 298.01, -254.5181, 241.7484, 298.01, -254.2274, 244.0922, 298.01, -254.181, 248.7797, 298.01, -253.9355, 251.1234, 298.01, -253.5926, 253.4672, 298.01, -252.7483, 255.8109, 298.01, -250.8092, 258.1547, 298.01, -248.713, 260.4984, 298.01, -246.263, 262.8422, 298.01, -244.1406, 265.1859, 298.01, -241.6671, 267.5297, 298.01, -239.4754, 269.8734, 298.01, -237.0156, 272.2172, 298.01, -233.7891, 275.382, 298.01, -231.4453, 277.8249, 298.01, -229.1016, 279.9981, 298.01, -226.7578, 282.5281, 298.01, -224.4141, 284.6784, 298.01, -222.0703, 287.2355, 298.01, -220.5414, 288.6234, 298.01, -218.2745, 290.9672, 298.01, -217.3828, 291.6508, 298.01, -212.6953, 294.5949, 298.01, -210.3516, 295.3142, 298.01, -208.0078, 296.4674, 298.01, -205.6641, 296.8852, 298.01, -203.3203, 297.1563, 298.01, -196.2891, 297.1488, 298.01, -193.9453, 297.0597, 298.01, -182.2266, 296.9529, 298.01, -168.1641, 296.8576, 298.01, -154.1016, 296.9249, 298.01, -149.4141, 296.8921, 298.01, -128.3203, 296.9228, 298.01, -121.2891, 296.8623, 298.01, -111.9141, 296.8549, 298.01, -107.2266, 296.8266, 298.01, -102.5391, 296.8731, 298.01, -95.50781, 296.8453, 298.01, -88.47656, 296.9218, 298.01, -83.78906, 296.9016, 298.01, -69.72656, 296.979, 298.01, -67.38281, 296.9514, 298.01, -65.03906, 297.2199, 298.01, -62.69531, 296.9622, 298.01, -55.66406, 296.9926, 298.01, -50.97656, 296.9467, 298.01, -48.63281, 297.3652, 298.01, -46.28906, 297.0439, 298.01, -43.94531, 297.2875, 298.01, -39.25781, 297.0121, 298.01, -34.57031, 297.1564, 298.01, -32.22656, 297.3612, 298.01, -29.88281, 297.4229, 298.01, -27.53906, 297.1687, 298.01, -25.19531, 297.4334, 298.01, -18.16406, 297.3612, 298.01, -15.82031, 297.4441, 298.01, -13.47656, 297.4125, 298.01, -11.13281, 297.2468, 298.01, -8.789063, 297.4125, 298.01, -6.445313, 297.373, 298.01, -4.101563, 297.4195, 298.01, -1.757813, 297.077, 298.01, 0.5859375, 297.4229, 298.01, 2.929688, 297.4125, 298.01, 5.273438, 296.9489, 298.01, 7.617188, 297.3168, 298.01, 9.960938, 296.9377, 298.01, 12.30469, 296.8998, 298.01, 14.64844, 297.1975, 298.01, 16.99219, 296.8579, 298.01, 28.71094, 296.878, 298.01, 40.42969, 296.8163, 298.01, 42.77344, 296.8369, 298.01, 49.80469, 296.734, 298.01, 59.17969, 296.6906, 298.01, 61.52344, 296.6365, 298.01, 68.55469, 296.6278, 298.01, 73.24219, 296.5777, 298.01, 75.58594, 296.6191, 298.01, 84.96094, 296.5284, 298.01, 96.67969, 296.5538, 298.01, 103.7109, 296.479, 298.01, 115.4297, 296.4259, 298.01, 122.4609, 296.3434, 298.01, 129.4922, 296.3495, 298.01, 131.8359, 295.9141, 298.01, 136.5234, 296.2256, 298.01, 138.8672, 295.833, 298.01, 143.5547, 295.9857, 298.01, 145.8984, 295.8791, 298.01, 152.9297, 295.833, 298.01, 164.6484, 295.6819, 298.01, 171.6797, 295.6819, 298.01, 181.0547, 295.5401, 298.01, 185.7422, 295.5742, 298.01, 192.7734, 295.557, 298.01, 197.4609, 295.8012, 298.01, 202.1484, 295.6819, 298.01, 204.4922, 295.3698, 298.01, 206.8359, 294.803, 298.01, 209.1797, 294.3656, 298.01, 211.5234, 292.4764, 298.01, 213.8672, 291.1765, 298.01, 216.2109, 289.5873, 298.01, 217.229, 288.6234, 298.01, 218.5547, 287.0752, 298.01, 221.7097, 283.9359, 298.01, 225.5859, 279.8775, 298.01, 227.9297, 277.5633, 298.01, 230.2734, 275.0808, 298.01, 233.1989, 272.2172, 298.01, 234.9609, 270.2887, 298.01, 237.7384, 267.5297, 298.01, 241.9922, 263.0843, 298.01, 244.3359, 260.7643, 298.01, 246.788, 258.1547, 298.01, 249.0234, 255.451, 298.01, 250.3651, 253.4672, 298.01, 251.5297, 251.1234, 298.01, 252.1947, 248.7797, 298.01, 252.4915, 246.4359, 298.01, 252.5755, 241.7484, 298.01, 252.8592, 239.4047, 298.01, 252.9236, 237.0609, 298.01, 252.2924, 234.7172, 298.01, 251.3672, 233.4697, 298.01, 249.0234, 232.882, 298.01, 244.3359, 232.9048, 298.01, 241.9922, 233.0145, 298.01, 232.6172, 232.9048, 298.01, 227.9297, 233.0007, 298.01, 216.2109, 233.0632, 298.01, 211.5234, 233.0537, 298.01, 206.8359, 232.9699, 298.01, 204.4922, 232.7322, 298.01, 199.8047, 232.7186, 298.01, 190.4297, 232.7719, 298.01, 183.3984, 232.7719, 298.01, 181.0547, 232.7322, 298.01, 174.0234, 232.7048, 298.01, 171.6797, 232.7322, 298.01, 166.9922, 232.6908, 298.01, 157.6172, 232.7975, 298.01, 155.2734, 232.7588, 298.01, 148.2422, 232.7875, 298.01, 143.5547, 232.7614, 298.01, 138.8672, 232.6477, 298.01, 124.8047, 232.6179, 298.01, 122.4609, 232.6477, 298.01, 113.0859, 232.6027, 298.01, 110.7422, 232.4552, 298.01, 108.3984, 232.2192, 298.01, 106.0547, 231.6764, 298.01, 103.7109, 231.8559, 298.01, 102.8237, 232.3734, 298.01, 101.3672, 232.9839, 298.01, 99.02344, 233.0951, 298.01, 87.30469, 233.0819, 298.01, 84.96094, 233.1091, 298.01, 80.27344, 233.0726, 298.01, 77.92969, 233.1132, 298.01, 70.89844, 233.1397, 298.01, 68.55469, 233.1132, 298.01, 52.14844, 233.131, 298.01, 45.11719, 233.0859, 298.01, 44.16726, 232.3734, 298.01, 42.77344, 231.0206, 298.01, 42.04498, 230.0297, 298.01, 42.77344, 229.2462, 298.01, 45.11719, 228.5664, 298.01, 47.46094, 227.0695, 298.01, 49.80469, 226.0552, 298.01, 52.14844, 224.5723, 298.01, 54.49219, 223.6857, 298.01, 56.83594, 221.8519, 298.01, 59.17969, 220.2086, 298.01, 61.52344, 218.8854, 298.01, 64.94469, 215.9672, 298.01, 66.21094, 215.0191, 298.01, 67.72036, 213.6234, 298.01, 68.55469, 212.6986, 298.01, 70.89844, 210.5055, 298.01, 74.53191, 206.5922, 298.01, 76.54903, 204.2484, 298.01, 78.26105, 201.9047, 298.01, 80.27344, 198.9262, 298.01, 82.61719, 195.2822, 298.01, 82.98087, 194.8734, 298.01, 84.96094, 190.9255, 298.01, 85.43701, 190.1859, 298.01, 86.33423, 187.8422, 298.01, 87.78722, 185.4984, 298.01, 88.60233, 183.1547, 298.01, 89.10253, 180.8109, 298.01, 90.17504, 178.4672, 298.01, 90.88959, 176.1234, 298.01, 91.43783, 173.7797, 298.01, 92.39601, 171.4359, 298.01, 92.95762, 169.0922, 298.01, 93.55695, 159.7172, 298.01, 93.65527, 157.3734, 298.01, 93.67542, 152.6859, 298.01, 93.61213, 150.3422, 298.01, 93.22542, 143.3109, 298.01, 93.06345, 140.9672, 298.01, 92.77563, 138.6234, 298.01, 91.21714, 133.9359, 298.01, 90.67235, 131.5922, 298.01, 89.88776, 129.2484, 298.01, 88.8737, 126.9047, 298.01, 88.44087, 124.5609, 298.01, 86.09712, 119.8734, 298.01, 85.05786, 117.5297, 298.01, 83.87151, 115.1859, 298.01, 82.22388, 112.8422, 298.01, 81.09117, 110.4984, 298.01, 77.92969, 106.4052, 298.01, 77.3894, 105.8109, 298.01, 75.94332, 103.4672, 298.01, 71.71799, 98.77969, 298.01, 68.55469, 95.65721, 298.01, 63.86719, 91.54878, 298.01, 61.52344, 90.1121, 298.01, 59.17969, 88.15762, 298.01, 56.83594, 86.51503, 298.01, 54.49219, 85.42721, 298.01, 52.14844, 83.64907, 298.01, 49.80469, 82.89023, 298.01, 47.46094, 81.50237, 298.01, 45.11719, 80.62591, 298.01, 42.77344, 79.18153, 298.01, 40.42969, 78.7203, 298.01, 38.08594, 78.1349, 298.01, 35.74219, 77.11755, 298.01, 33.39844, 76.51949, 298.01, 31.05469, 76.07934, 298.01, 26.36719, 74.67744, 298.01, 24.02344, 74.42056, 298.01, 14.64844, 74.07317, 298.01, 9.960938, 74.11538, 298.01, 2.929688, 74.40105, 298.01, 0.5859375, 74.67952, 298.01, -1.757813, 75.31406, 298.01, -4.101563, 76.07065, 298.01, -6.445313, 76.49051, 298.01, -8.789063, 77.17276, 298.01, -11.13281, 78.20097, 298.01, -15.82031, 79.31967, 298.01, -18.16406, 80.76948, 298.01, -20.50781, 81.64266, 298.01, -22.85156, 83.0305, 298.01, -25.19531, 83.7937, 298.01, -27.53906, 85.63515, 298.01, -29.88281, 86.7363, 298.01, -32.22656, 88.36089, 298.01, -34.57031, 90.3302, 298.01, -36.56719, 91.74844, 298.01, -41.60156, 95.93605, 298.01, -46.58845, 101.1234, 298.01, -50.17995, 105.8109, 298.01, -52.10386, 108.1547, 298.01, -53.63992, 110.4984, 298.01, -54.95532, 112.8422, 298.01, -56.64794, 115.1859, 298.01, -57.4403, 117.5297, 298.01, -58.91927, 119.8734, 298.01, -59.78655, 122.2172, 298.01, -61.11754, 124.5609, 298.01, -61.58921, 126.9047, 298.01, -62.38012, 129.2484, 298.01, -63.49118, 131.5922, 298.01, -64.02599, 133.9359, 298.01, -64.3932, 136.2797, 298.01, -65.11897, 138.6234, 298.01, -65.64544, 140.9672, 298.01, -66.23938, 147.9984, 298.01, -66.46289, 152.6859, 298.01, -66.48911, 155.0297, 298.01, -66.34437, 159.7172, 298.01, -65.99894, 164.4047, 298.01, -65.49149, 169.0922, 298.01, -64.6875, 171.4359, 298.01, -63.7739, 176.1234, 298.01, -62.9398, 178.4672, 298.01, -61.86011, 180.8109, 298.01, -61.33423, 183.1547, 298.01, -60.43332, 185.4984, 298.01, -58.00781, 190.0632, 298.01, -56.85406, 192.5297, 298.01, -55.66406, 194.7283, 298.01, -54.11692, 197.2172, 298.01, -50.97656, 201.8369, 298.01, -47.36435, 206.5922, 298.01, -45.04395, 208.9359, 298.01, -42.83026, 211.2797, 298.01, -39.25781, 214.7435, 298.01, -34.57031, 218.4974, 298.01, -32.22656, 219.9595, 298.01, -28.02053, 222.9984, 298.01, -27.53906, 223.4238, 298.01, -25.19531, 224.4187, 298.01, -22.85156, 225.8252, 298.01, -20.50781, 226.9067, 298.01, -18.16406, 228.4286, 298.01, -15.82031, 229.1235, 298.01, -14.9447, 230.0297, 298.01, -15.82031, 231.3969, 298.01, -16.94484, 232.3734, 298.01 }; + size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); + std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); + EXPECT_EQ(358u * 3, groundTruth.size()); + CheckGroundTruth(structures, 5, 8, groundTruth); + } +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +#if 0 + +TEST(StructureSet, ReadFromJsonAndCompute1) +{ + DicomStructureSet2 structureSet; + + OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); + //loader.content_.reset(new DicomStructureSet(dicom)); + structureSet.Clear(); + + structureSet.FillStructuresFromDataset(dicom); + + structureSet.ComputeDependentProperties(); +} + +TEST(StructureSet, ReadFromJsonAndCompute2) +{ + DicomStructureSet2 structureSet; + + OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); + //loader.content_.reset(new DicomStructureSet(dicom)); + structureSet.Clear(); + + structureSet.SetContents(dicom); +} +#endif + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +static bool CutStructureWithPlane( + std::vector< std::pair >& segments, + const DicomStructure2& structure, + const double originX, const double originY, const double originZ, + const double axisX_X, const double axisX_Y, const double axisX_Z, + const double axisY_X, const double axisY_Y, const double axisY_Z +) +{ + // create an AXIAL cutting plane, too far away from the volume + // (> sliceThickness/2) + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, originX, originY, originZ); + LinearAlgebra::AssignVector(axisX, axisX_X, axisX_Y, axisX_Z); + LinearAlgebra::AssignVector(axisY, axisY_X, axisY_Y, axisY_Z); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + // compute intersection + bool ok = structure.Project(segments, cuttingPlane); + return ok; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +static double pointsCoord1[] = { 2, 2, 3, 3, 6, 8, 8, 7, 8, 8, 6 }; +static double pointsCoord2[] = { 2, 6, 8, 10, 12, 10, 8, 6, 4, 2, 4 }; +static const size_t pointsCoord1Count = STONE_ARRAY_SIZE(pointsCoord1); +static const size_t pointsCoord2Count = STONE_ARRAY_SIZE(pointsCoord2); +const size_t POLYGON_POINT_COUNT = pointsCoord1Count; + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +static void CreateBasicStructure(DicomStructure2& structure) +{ + // see https://www.dropbox.com/s/1o1vg53hsbvx4cc/test-rtstruct-polygons.jpg?dl=0 + EXPECT_EQ(pointsCoord1Count, pointsCoord2Count); + EXPECT_EQ(11, pointsCoord2Count); + + for (size_t slice = 0; slice < 3; ++slice) + { + DicomStructurePolygon2 polygon("Oblomptu", "CLOSED_PLANAR"); + for (size_t ip = 0; ip < pointsCoord1Count; ++ip) + { + Point3D pt; + double pt0 = pointsCoord1[ip]; + double pt1 = pointsCoord2[ip]; + double pt2 = 4 * (static_cast(slice) - 1); // -4, 0, 4 + LinearAlgebra::AssignVector(pt, pt0, pt1, pt2); + polygon.AddPoint(pt); + } + structure.AddPolygon(polygon); + } + structure.ComputeDependentProperties(); +} + + +TEST(StructureSet, CutAxialOutsideTop) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an AXIAL cutting plane, too far away from the volume + // (> sliceThickness/2) + bool ok = CutStructureWithPlane(segments, structure, + 0, 0, 7, + 1, 0, 0, + 0, 1, 0); + EXPECT_FALSE(ok); +} + + +TEST(StructureSet, CutAxialOutsideBottom) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an AXIAL cutting plane, too far away from the volume + // (> sliceThickness/2) + bool ok = CutStructureWithPlane(segments, structure, + 0, 0, -6.66, + 1, 0, 0, + 0, 1, 0); + EXPECT_FALSE(ok); +} + +TEST(StructureSet, CutAxialInsideClose) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an AXIAL cutting plane in the volume + bool ok = CutStructureWithPlane(segments, structure, + 0, 0, 1.1, + 1, 0, 0, + 0, 1, 0); + EXPECT_TRUE(ok); + EXPECT_EQ(POLYGON_POINT_COUNT, segments.size()); + + for (size_t i = 0; i < segments.size(); ++i) + { + EXPECT_LT(i, POLYGON_POINT_COUNT); + EXPECT_LT(i, POLYGON_POINT_COUNT); + + const Point2D& pt = segments[i].first; + + // ...should be at the same location as the 3D coords since the plane + // is rooted at 0,0,0 with normal 0,0,1 + EXPECT_NEAR(pt.x, pointsCoord1[i], DELTA_MAX); + EXPECT_NEAR(pt.y, pointsCoord2[i], DELTA_MAX); + } +} + + +TEST(StructureSet, CutAxialInsideFar) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an AXIAL cutting plane + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, 0, 0, 0); + LinearAlgebra::AssignVector(axisX, 1, 0, 0); + LinearAlgebra::AssignVector(axisY, 0, 1, 0); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + // compute intersection + bool ok = structure.Project(segments, cuttingPlane); + EXPECT_TRUE(ok); + + EXPECT_EQ(11, segments.size()); + for (size_t i = 0; i < segments.size(); ++i) + { + EXPECT_LT(i, pointsCoord1Count); + EXPECT_LT(i, pointsCoord2Count); + + // the 2D points of the projected polygon + const Point2D& pt = segments[i].first; + + // ...should be at the same location as the 3D coords since the plane + // is rooted at 0,0,0 with normal 0,0,1 + EXPECT_NEAR(pt.x, pointsCoord1[i], DELTA_MAX); + EXPECT_NEAR(pt.y, pointsCoord2[i], DELTA_MAX); + } +} + +TEST(StructureSet, CutCoronalOutsideClose) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an X,Z cutting plane, outside of the volume + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, 0, 0, 0); + LinearAlgebra::AssignVector(axisX, 1, 0, 0); + LinearAlgebra::AssignVector(axisY, 0, 0, 1); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + // compute intersection + bool ok = structure.Project(segments, cuttingPlane); + EXPECT_FALSE(ok); +} + +TEST(StructureSet, CutCoronalInsideClose1DTest) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + + // create an X,Z cutting plane, outside of the volume + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, 0, 3, 0); + LinearAlgebra::AssignVector(axisX, 1, 0, 0); + LinearAlgebra::AssignVector(axisY, 0, 0, 1); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + ASSERT_EQ(3u, structure.GetPolygons().size()); + + for (int i = 0; i < 3; ++i) + { + double polygonZ = static_cast(i - 1) * 4.0; + + const DicomStructurePolygon2& topSlab = structure.GetPolygons()[i]; + + // let's compute the intersection between the polygon and the plane + // intersections are in plane coords + std::vector intersects; + topSlab.ProjectOnConstantPlane(intersects, cuttingPlane); + + ASSERT_EQ(4u, intersects.size()); + + EXPECT_NEAR(2, intersects[0].x, DELTA_MAX); + EXPECT_NEAR(4, intersects[1].x, DELTA_MAX); + EXPECT_NEAR(7, intersects[2].x, DELTA_MAX); + EXPECT_NEAR(8, intersects[3].x, DELTA_MAX); + + for (size_t i = 0; i < 4u; ++i) + { + EXPECT_NEAR(polygonZ, intersects[i].y, DELTA_MAX); + } + } +} + +TEST(StructureSet, CutCoronalInsideClose) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an X,Z cutting plane, outside of the volume + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, 0, 3, 0); + LinearAlgebra::AssignVector(axisX, 1, 0, 0); + LinearAlgebra::AssignVector(axisY, 0, 0, 1); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + // compute intersection + ASSERT_TRUE(structure.Project(segments, cuttingPlane)); + EXPECT_EQ(24, segments.size()); + + size_t numberOfVeryShortSegments = 0; + for (size_t iSegment = 0; iSegment < segments.size(); ++iSegment) + { + // count the NON vertical very short segments + if (LinearAlgebra::IsNear(segments[iSegment].first.x, segments[iSegment].second.x)) + { + if (LinearAlgebra::IsNear(segments[iSegment].first.y, segments[iSegment].second.y)) + { + numberOfVeryShortSegments++; + } + } + } + EXPECT_EQ(8, numberOfVeryShortSegments); +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + +TEST(DisjointDataSet, BasicTest) +{ + const size_t ITEM_COUNT = 10; + DisjointDataSet ds(ITEM_COUNT); + + for (size_t i = 0; i < ITEM_COUNT; ++i) + { + EXPECT_EQ(i, ds.Find(i)); + } + + ds.Union(0, 4); + EXPECT_EQ(0u, ds.Find(0)); + EXPECT_EQ(0u, ds.Find(4)); + + ds.Union(4, 6); + ds.Union(8, 9); + ds.Union(0, 8); + + for (size_t i = 0; i < ITEM_COUNT; ++i) + { + size_t parent = ds.Find(i); + EXPECT_TRUE(0 == parent || 1 == parent || 2 == parent || 3 == parent || 5 == parent || 7 == parent); + } + + ds.Union(1, 2); + ds.Union(1, 7); + for (size_t i = 0; i < ITEM_COUNT; ++i) + { + size_t parent = ds.Find(i); + EXPECT_TRUE(0 == parent || 1 == parent || 3 == parent || 5 == parent); + } + + ds.Union(3, 5); + for (size_t i = 0; i < ITEM_COUNT; ++i) + { + size_t parent = ds.Find(i); + EXPECT_TRUE(0 == parent || 1 == parent || 3 == parent); + } + + EXPECT_EQ(ds.Find(0), ds.Find(0)); + EXPECT_EQ(ds.Find(0), ds.Find(4)); + EXPECT_EQ(ds.Find(0), ds.Find(6)); + EXPECT_EQ(ds.Find(0), ds.Find(8)); + EXPECT_EQ(ds.Find(0), ds.Find(8)); + + EXPECT_EQ(ds.Find(1), ds.Find(7)); + EXPECT_EQ(ds.Find(2), ds.Find(1)); + EXPECT_EQ(ds.Find(7), ds.Find(2)); + + EXPECT_EQ(ds.Find(3), ds.Find(5)); + EXPECT_EQ(ds.Find(5), ds.Find(3)); + + ds.Union(0, 1); + ds.Union(3, 1); + for (size_t i = 0; i < ITEM_COUNT; ++i) + { + EXPECT_EQ(ds.Find(0), ds.Find(i)); + } +} + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +TEST(StructureSet, CutSagittalInsideClose) +{ + DicomStructure2 structure; + CreateBasicStructure(structure); + std::vector< std::pair > segments; + + // create an X,Z cutting plane, inside of the volume + Point3D origin, axisX, axisY; + LinearAlgebra::AssignVector(origin, 0, 3, 0); + LinearAlgebra::AssignVector(axisX, 1, 0, 0); + LinearAlgebra::AssignVector(axisY, 0, 0, 1); + CoordinateSystem3D cuttingPlane(origin, axisX, axisY); + + // compute intersection + bool ok = structure.Project(segments, cuttingPlane); + EXPECT_TRUE(ok); +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + + +static size_t ConvertListOfSlabsToSegments_Add(RtStructRectanglesInSlab& rectangles, int row, double xmin, double xmax) +{ + double ymin = static_cast(row) * 5.0; + double ymax = static_cast(row + 1) * 5.0; + + RtStructRectangleInSlab rectangle; + rectangle.xmin = xmin; + rectangle.xmax = xmax; + rectangle.ymin = ymin; + rectangle.ymax = ymax; + + rectangles.push_back(rectangle); + + return 1u; +} + +static size_t FillTestRectangleList(std::vector< RtStructRectanglesInSlab >& rectanglesForEachSlab) +{ + // ConvertListOfSlabsToSegments + size_t rectCount = 0; + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 0, 5, 31); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 0, 36, 50); + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 1, 20, 45); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 1, 52, 70); + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 0, 32); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 35, 44); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 60, 75); + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 3, 10, 41); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 3, 46, 80); + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 4, 34, 42); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 4, 90, 96); + + rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 1, 33); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 40, 43); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 51, 61); + rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 76, 95); + + return rectCount; +} + +/* +void AddSlabBoundaries( + std::vector >& boundaries, + const std::vector& slabCuts, size_t iSlab) +*/ + + +/* +void ProcessBoundaryList( + std::vector< std::pair >& segments, + const std::vector >& boundaries, + double y) +*/ + + +TEST(StructureSet, ProcessBoundaryList_Empty) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + + boundaries.clear(); + EXPECT_NO_THROW(AddSlabBoundaries(boundaries, slabCuts, 0)); + ASSERT_EQ(0u, boundaries.size()); +} + +TEST(StructureSet, ProcessBoundaryListTopRow) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + FillTestRectangleList(slabCuts); + + boundaries.clear(); + AddSlabBoundaries(boundaries, slabCuts, 0); + + { + size_t i = 0; + ASSERT_EQ(4u, boundaries.size()); + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(5, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(31, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(36, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(50, boundaries[i].first, DELTA_MAX); + i++; + } +} + +TEST(StructureSet, ProcessBoundaryListRows_0_and_1) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + FillTestRectangleList(slabCuts); + + boundaries.clear(); + AddSlabBoundaries(boundaries, slabCuts, 0); + AddSlabBoundaries(boundaries, slabCuts, 1); + + ASSERT_EQ(8u, boundaries.size()); + + { + size_t i = 0; + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(5, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(20, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(31, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(36, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(45, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(50, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); + ASSERT_NEAR(52, boundaries[i].first, DELTA_MAX); + i++; + + ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); + ASSERT_NEAR(70, boundaries[i].first, DELTA_MAX); + i++; + } +} + +TEST(StructureSet, ConvertListOfSlabsToSegments_EmptyBoundaries) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + FillTestRectangleList(slabCuts); + boundaries.clear(); + std::vector< std::pair > segments; + ASSERT_NO_THROW(ProcessBoundaryList(segments, boundaries, 42.0)); + ASSERT_EQ(0u, segments.size()); +} + +TEST(StructureSet, ConvertListOfSlabsToSegments_TopRow_Horizontal) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + FillTestRectangleList(slabCuts); + + // top row + { + std::vector< std::pair > segments; + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, 0); + ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); + + ASSERT_EQ(2u, segments.size()); + + ASSERT_NEAR( 5.0, segments[0].first.x, DELTA_MAX); + ASSERT_NEAR(31.0, segments[0].second.x, DELTA_MAX); + ASSERT_NEAR( 0.0, segments[0].first.y, DELTA_MAX); + ASSERT_NEAR( 0.0, segments[0].second.y, DELTA_MAX); + + ASSERT_NEAR(36.0, segments[1].first.x, DELTA_MAX); + ASSERT_NEAR(50.0, segments[1].second.x, DELTA_MAX); + ASSERT_NEAR( 0.0, segments[1].first.y, DELTA_MAX); + ASSERT_NEAR( 0.0, segments[1].second.y, DELTA_MAX); + } +} + +TEST(StructureSet, ConvertListOfSlabsToSegments_All_Horizontal) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + FillTestRectangleList(slabCuts); + + // top row + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, 0); + std::vector< std::pair > segments; + ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); + } + + // mids + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, 0); + AddSlabBoundaries(boundaries, slabCuts, 1); + std::vector< std::pair > segments; + ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymax); + + ASSERT_EQ(4u, segments.size()); + + ASSERT_NEAR(05.0, segments[0].first.x, DELTA_MAX); + ASSERT_NEAR(20.0, segments[0].second.x, DELTA_MAX); + ASSERT_NEAR(05.0, segments[0].first.y, DELTA_MAX); + ASSERT_NEAR(05.0, segments[0].second.y, DELTA_MAX); + + ASSERT_NEAR(31.0, segments[1].first.x, DELTA_MAX); + ASSERT_NEAR(36.0, segments[1].second.x, DELTA_MAX); + ASSERT_NEAR(05.0, segments[1].first.y, DELTA_MAX); + ASSERT_NEAR(05.0, segments[1].second.y, DELTA_MAX); + + ASSERT_NEAR(45.0, segments[2].first.x, DELTA_MAX); + ASSERT_NEAR(50.0, segments[2].second.x, DELTA_MAX); + ASSERT_NEAR(05.0, segments[2].first.y, DELTA_MAX); + ASSERT_NEAR(05.0, segments[2].second.y, DELTA_MAX); + + ASSERT_NEAR(52.0, segments[3].first.x, DELTA_MAX); + ASSERT_NEAR(70.0, segments[3].second.x, DELTA_MAX); + ASSERT_NEAR(05.0, segments[3].first.y, DELTA_MAX); + ASSERT_NEAR(05.0, segments[3].second.y, DELTA_MAX); + } + + // bottom row + { + std::vector > boundaries; + AddSlabBoundaries(boundaries, slabCuts, 1); + std::vector< std::pair > segments; + ProcessBoundaryList(segments, boundaries, slabCuts[1][0].ymax); + + ASSERT_EQ(2u, segments.size()); + + ASSERT_NEAR(20.0, segments[0].first.x, DELTA_MAX); + ASSERT_NEAR(45.0, segments[0].second.x, DELTA_MAX); + ASSERT_NEAR(10.0, segments[0].first.y, DELTA_MAX); + ASSERT_NEAR(10.0, segments[0].second.y, DELTA_MAX); + + ASSERT_NEAR(52.0, segments[1].first.x, DELTA_MAX); + ASSERT_NEAR(70.0, segments[1].second.x, DELTA_MAX); + ASSERT_NEAR(10.0, segments[1].first.y, DELTA_MAX); + ASSERT_NEAR(10.0, segments[1].second.y, DELTA_MAX); + } + +} + +TEST(StructureSet, ConvertListOfSlabsToSegments_Complete_Empty) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + + std::vector< std::pair > segments; + + ASSERT_NO_THROW(ConvertListOfSlabsToSegments(segments, slabCuts, 0)); + ASSERT_EQ(0u, segments.size()); +} + +TEST(StructureSet, ConvertListOfSlabsToSegments_Complete_Regular) +{ + std::vector< RtStructRectanglesInSlab > slabCuts; + std::vector > boundaries; + size_t totalRectCount = FillTestRectangleList(slabCuts); + + std::vector< std::pair > segments; + + ASSERT_NO_THROW(ConvertListOfSlabsToSegments(segments, slabCuts, totalRectCount)); + ASSERT_EQ(60u, segments.size()); + + size_t i = 0; + + ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 31.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 31.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 36.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 36.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 50.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 45.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 45.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 52.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 70.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 70.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 32.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 35.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 44.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 44.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 60.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 75.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 75.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 41.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 46.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 80.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 34.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 34.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 42.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 42.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 90.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 90.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 96.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 1.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 33.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 40.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 40.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 43.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 51.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 61.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 76.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 95.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 95.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 31.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 0.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 36.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 0.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 31.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 36.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 45.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 70.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 44.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 45.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 70.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 75.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 44.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 75.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 10.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 34.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 42.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 90.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 34.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 40.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 42.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 90.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 95.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 40.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); + i++; + ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.x, 95.000000000000000, DELTA_MAX); + ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); +} + +#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +TEST(StructureSet, ReadFromJsonPart2) +{ + DicomStructureSet2 structureSet; + std::string jsonText; + + SystemToolbox::ReadFile(jsonText, "72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json"); + + OrthancPlugins::FullOrthancDataset dicom(jsonText); + //loader.content_.reset(new DicomStructureSet(dicom)); + structureSet.Clear(); + + structureSet.FillStructuresFromDataset(dicom); + structureSet.ComputeDependentProperties(); + + const std::vector& structures = structureSet.structures_; +} + +#endif +// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 + +namespace +{ + void Initialize(const char* orthancApiUrl, OrthancStone::ILoadersContext& loadersContext) + { + Orthanc::WebServiceParameters p; + + OrthancStone::GenericLoadersContext& typedLoadersContext = + dynamic_cast(loadersContext); + // Default is http://localhost:8042 + // Here's how you may change it + p.SetUrl(orthancApiUrl); + p.SetCredentials("orthanc", "orthanc"); + typedLoadersContext.SetOrthancParameters(p); + + typedLoadersContext.StartOracle(); + } + + void Exitialize(OrthancStone::ILoadersContext& loadersContext) + { + OrthancStone::GenericLoadersContext& typedLoadersContext = + dynamic_cast(loadersContext); + + typedLoadersContext.StopOracle(); + } + + +#if 0 + class TestObserver : public ObserverBase + { + public: + TestObserver() {}; + + virtual void Handle + + }; +#endif + +} + +TEST(StructureSet, DISABLED_StructureSetLoader_injection_feature_2020_05_10) +{ + namespace pt = boost::posix_time; + + std::unique_ptr loadersContext(new OrthancStone::GenericLoadersContext(1,4,1)); + Initialize("http://localhost:8042/", *loadersContext); + + boost::shared_ptr loader = DicomStructureSetLoader::Create(*loadersContext); + + // replace with Orthanc ID of an uploaded RTSTRUCT instance! + loader->LoadInstanceFullVisibility("72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661"); + + bool bContinue(true); + + pt::ptime initialTime = pt::second_clock::local_time(); + + while (bContinue) + { + bContinue = !loader->AreStructuresReady(); + boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); + + { + pt::ptime nowTime = pt::second_clock::local_time(); + pt::time_duration diff = nowTime - initialTime; + double seconds = static_cast(diff.total_milliseconds()) * 0.001; + std::cout << seconds << " seconds elapsed...\n"; + if (seconds > 30) + { + std::cout << "More than 30 seconds elapsed... Aborting test :(\n"; + //GTEST_FATAL_FAILURE_("More than 30 seconds elapsed... Aborting test :("); + //bContinue = false; + } + } + } +} + +class SliceProcessor : + public OrthancStone::OrthancSeriesVolumeProgressiveLoader::ISlicePostProcessor, + public OrthancStone::DicomStructureSetLoader::IInstanceLookupHandler +{ +public: + SliceProcessor(OrthancStone::DicomStructureSetLoader& structLoader) : structLoader_(structLoader) + { + } + + virtual void ProcessCTDicomSlice(const Orthanc::DicomMap& instance) ORTHANC_OVERRIDE + { + std::string sopInstanceUid; + if (!instance.LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Missing SOPInstanceUID in a DICOM instance"); + } + slicesDicom_[sopInstanceUid] = boost::shared_ptr(instance.Clone()); + } + + virtual void RetrieveReferencedSlices(const std::set& nonEmptyInstances) ORTHANC_OVERRIDE + { + for (std::set::const_iterator it = nonEmptyInstances.begin(); + it != nonEmptyInstances.end(); + ++it) + { + const std::string nonEmptyInstance = *it; + if (slicesDicom_.find(nonEmptyInstance) == slicesDicom_.end()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Referenced SOPInstanceUID not found in CT"); + } + boost::shared_ptr instance = slicesDicom_[nonEmptyInstance]; + structLoader_.AddReferencedSlice(*instance); + } + } + + OrthancStone::DicomStructureSetLoader& structLoader_; + std::map > slicesDicom_; +}; + +void LoadCtSeriesBlocking(boost::shared_ptr ctLoader, std::string seriesId) +{ + namespace pt = boost::posix_time; + + // Load the CT + ctLoader->LoadSeries(seriesId); + + // Wait for CT to be loaded + pt::ptime initialTime = pt::second_clock::local_time(); + { + bool bContinue(true); + while (bContinue) + { + bContinue = !ctLoader->IsVolumeImageReadyInHighQuality(); + boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); + + { + pt::ptime nowTime = pt::second_clock::local_time(); + pt::time_duration diff = nowTime - initialTime; + double seconds = static_cast(diff.total_milliseconds()) * 0.001; + std::cout << seconds << " seconds elapsed...\n"; + if (seconds > 30) + { + const char* msg = "More than 30 seconds elapsed when waiting for CT... Aborting test :(\n"; + GTEST_FATAL_FAILURE_(msg); + bContinue = false; + } + } + } + } +} + + +/** +Will fill planes +*/ +void GetCTPlanes(std::vector& planes, + OrthancStone::VolumeProjection projection, + boost::shared_ptr ctLoader) +{ + planes.clear(); // inefficient : we don't care + + const VolumeImageGeometry& geometry = ctLoader->GetImageGeometry(); + const unsigned int depth = geometry.GetProjectionDepth(projection); + + planes.resize(depth); + + for (unsigned int z = 0; z < depth; z++) + { + planes[z] = geometry.GetProjectionSlice(projection, z); + } +} + +void LoadRtStructBlocking(boost::shared_ptr structLoader, std::string instanceId) +{ + namespace pt = boost::posix_time; + + // Load RTSTRUCT + structLoader->LoadInstanceFullVisibility(instanceId); + + pt::ptime initialTime = pt::second_clock::local_time(); + + // Wait for the loading process to complete + { + bool bContinue(true); + while (bContinue) + { + bContinue = !structLoader->AreStructuresReady(); + boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); + + { + pt::ptime nowTime = pt::second_clock::local_time(); + pt::time_duration diff = nowTime - initialTime; + double seconds = static_cast(diff.total_milliseconds()) * 0.001; + std::cout << seconds << " seconds elapsed...\n"; + if (seconds > 30) + { + const char* msg = "More than 30 seconds elapsed when waiting for RTSTRUCT... Aborting test :(\n"; + GTEST_FATAL_FAILURE_(msg); + bContinue = false; + } + } + } + } +} + +TEST(StructureSet, DISABLED_Integration_Compound_CT_Struct_Loading) +{ + const double TOLERANCE = 0.0000001; + + // create loaders context + std::unique_ptr loadersContext(new OrthancStone::GenericLoadersContext(1,4,1)); + Initialize("http://localhost:8042/", *loadersContext); + + const char* ctSeriesId = "a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"; + const char* rtStructInstanceId = "54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"; + + // we'll compare normal loading and optimized loading with SliceProcessor to store the dicom + + boost::shared_ptr normalStructLoader; + boost::shared_ptr optimizedStructLoader; + + { + // Create the CT volume + boost::shared_ptr volume = boost::make_shared(); + + // Create CT loader + boost::shared_ptr ctLoader = + OrthancStone::OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext, volume); + + // Create struct loader + normalStructLoader = OrthancStone::DicomStructureSetLoader::Create(*loadersContext); + + // Load the CT + LoadCtSeriesBlocking(ctLoader, ctSeriesId); + + const OrthancStone::VolumeImageGeometry& imageGeometry = ctLoader->GetImageGeometry(); + unsigned int width = imageGeometry.GetWidth(); + EXPECT_EQ(512u, width); + unsigned int height = imageGeometry.GetHeight(); + EXPECT_EQ(512u, height); + unsigned int depth = imageGeometry.GetDepth(); + EXPECT_EQ(109u, depth); + + // Load the RTStruct + LoadRtStructBlocking(normalStructLoader, rtStructInstanceId); + } + + std::vector axialPlanes; + std::vector coronalPlanes; + std::vector sagittalPlanes; + + { + // Create the CT volume + boost::shared_ptr volume = boost::make_shared(); + + // Create CT loader + boost::shared_ptr ctLoader = + OrthancStone::OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext, volume); + + // Create struct loader + optimizedStructLoader = OrthancStone::DicomStructureSetLoader::Create(*loadersContext); + + // create the slice processor / instance lookup + boost::shared_ptr sliceProcessor(new SliceProcessor(*optimizedStructLoader)); + + // Inject it into CT loader + ctLoader->SetDicomSlicePostProcessor(sliceProcessor); + + // Inject it into RTSTRUCT loader + optimizedStructLoader->SetInstanceLookupHandler(sliceProcessor); + + // Load the CT + LoadCtSeriesBlocking(ctLoader, ctSeriesId); + + // now, the slices are collected. let's do some checks + EXPECT_EQ(109u, sliceProcessor->slicesDicom_.size()); + + // Load the RTStruct + LoadRtStructBlocking(optimizedStructLoader, rtStructInstanceId); + + GetCTPlanes(axialPlanes, VolumeProjection_Axial, ctLoader); + GetCTPlanes(coronalPlanes, VolumeProjection_Coronal, ctLoader); + GetCTPlanes(sagittalPlanes, VolumeProjection_Sagittal, ctLoader); + } + + // DO NOT DELETE THOSE! + OrthancStone::DicomStructureSet* normalContent = normalStructLoader->GetContent(); + OrthancStone::DicomStructureSet* optimizedContent = optimizedStructLoader->GetContent(); + + EXPECT_EQ(normalContent->GetStructuresCount(), optimizedContent->GetStructuresCount()); + + /*void GetCTPlanes(std::vector& planes, + OrthancStone::VolumeProjection projection, + boost::shared_ptr ctLoader)*/ + + + std::vector allPlanes; + + // let's gather all the possible cutting planes in a single struct + for (size_t i = 0; i < axialPlanes.size(); ++i) + allPlanes.push_back(axialPlanes[i]); + + for (size_t i = 0; i < coronalPlanes.size(); ++i) + allPlanes.push_back(coronalPlanes[i]); + + for (size_t i = 0; i < sagittalPlanes.size(); ++i) + allPlanes.push_back(sagittalPlanes[i]); + + for (size_t i = 0; i < normalContent->GetStructuresCount(); ++i) + { + std::cout << "Testing structure (" << i << "/" << normalContent->GetStructuresCount() << ")\n"; + Vector structureCenter1 = normalContent->GetStructureCenter(i); + const std::string& structureName1 = normalContent->GetStructureName(i); + const std::string& structureInterpretation1 = normalContent->GetStructureInterpretation(i); + Color structureColor1 = normalContent->GetStructureColor(i); + + Vector structureCenter2 = optimizedContent->GetStructureCenter(i); + const std::string& structureName2 = optimizedContent->GetStructureName(i); + const std::string& structureInterpretation2 = optimizedContent->GetStructureInterpretation(i); + Color structureColor2 = optimizedContent->GetStructureColor(i); + + EXPECT_NEAR(structureCenter1[0], structureCenter2[0], TOLERANCE); + EXPECT_NEAR(structureCenter1[1], structureCenter2[1], TOLERANCE); + EXPECT_NEAR(structureCenter1[2], structureCenter2[2], TOLERANCE); + + EXPECT_EQ(structureName1, structureName2); + EXPECT_EQ(structureInterpretation1, structureInterpretation2); + EXPECT_EQ(structureColor1.GetRed(), structureColor2.GetRed()); + EXPECT_EQ(structureColor1.GetGreen(), structureColor2.GetGreen()); + EXPECT_EQ(structureColor1.GetBlue(), structureColor2.GetBlue()); + + // "random" walk through the planes. Processing them all takes too long (~ 1 min) + for (size_t j = 0; j < allPlanes.size(); j += 37) + { + const OrthancStone::CoordinateSystem3D& plane = allPlanes[j]; + + std::vector< std::pair > segments1; + std::vector< std::pair > segments2; + + bool ok1 = normalContent->ProjectStructure(segments1, i, plane); + bool ok2 = optimizedContent->ProjectStructure(segments2, i, plane); + + // checks here + EXPECT_EQ(ok1, ok2); + EXPECT_EQ(segments1.size(), segments2.size()); + + for (size_t k = 0; k < segments1.size(); ++k) + { + EXPECT_NEAR(segments1[k].first.x, segments2[k].first.x, TOLERANCE); + EXPECT_NEAR(segments1[k].first.y, segments2[k].first.y, TOLERANCE); + EXPECT_NEAR(segments1[k].second.x, segments2[k].second.x, TOLERANCE); + EXPECT_NEAR(segments1[k].second.y, segments2[k].second.y, TOLERANCE); + } + } + } + + Exitialize(*loadersContext); +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a OrthancStone/UnitTestsSources/UnitTestsMain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancStone/UnitTestsSources/UnitTestsMain.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -0,0 +1,894 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2020 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include + +#include "../Sources/StoneInitialization.h" +#include "../Sources/Toolbox/FiniteProjectiveCamera.h" +#include "../Sources/Toolbox/GeometryToolbox.h" +#include "../Sources/Volumes/ImageBuffer3D.h" +#include "../Sources/Loaders/LoaderCache.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +TEST(GeometryToolbox, Interpolation) +{ + using namespace OrthancStone::GeometryToolbox; + + // https://en.wikipedia.org/wiki/Bilinear_interpolation#Application_in_image_processing + ASSERT_FLOAT_EQ(146.1f, ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 91, 210, 162, 95)); + + ASSERT_FLOAT_EQ(91, ComputeBilinearInterpolationUnitSquare(0, 0, 91, 210, 162, 95)); + ASSERT_FLOAT_EQ(210, ComputeBilinearInterpolationUnitSquare(1, 0, 91, 210, 162, 95)); + ASSERT_FLOAT_EQ(162, ComputeBilinearInterpolationUnitSquare(0, 1, 91, 210, 162, 95)); + ASSERT_FLOAT_EQ(95, ComputeBilinearInterpolationUnitSquare(1, 1, 91, 210, 162, 95)); + + ASSERT_FLOAT_EQ(123.35f, ComputeTrilinearInterpolationUnitSquare + (0.5f, 0.2f, 0.7f, + 91, 210, 162, 95, + 51, 190, 80, 92)); + + ASSERT_FLOAT_EQ(ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 91, 210, 162, 95), + ComputeTrilinearInterpolationUnitSquare(0.5f, 0.2f, 0, + 91, 210, 162, 95, + 51, 190, 80, 92)); + + ASSERT_FLOAT_EQ(ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 51, 190, 80, 92), + ComputeTrilinearInterpolationUnitSquare(0.5f, 0.2f, 1, + 91, 210, 162, 95, + 51, 190, 80, 92)); +} + + +static bool CompareMatrix(const OrthancStone::Matrix& a, + const OrthancStone::Matrix& b, + double threshold = 0.00000001) +{ + if (a.size1() != b.size1() || + a.size2() != b.size2()) + { + return false; + } + + for (size_t i = 0; i < a.size1(); i++) + { + for (size_t j = 0; j < a.size2(); j++) + { + if (fabs(a(i, j) - b(i, j)) > threshold) + { + LOG(ERROR) << "Too large difference in component (" + << i << "," << j << "): " << a(i,j) << " != " << b(i,j); + return false; + } + } + } + + return true; +} + + +static bool CompareVector(const OrthancStone::Vector& a, + const OrthancStone::Vector& b, + double threshold = 0.00000001) +{ + if (a.size() != b.size()) + { + return false; + } + + for (size_t i = 0; i < a.size(); i++) + { + if (fabs(a(i) - b(i)) > threshold) + { + LOG(ERROR) << "Too large difference in component " + << i << ": " << a(i) << " != " << b(i); + return false; + } + } + + return true; +} + + + +TEST(FiniteProjectiveCamera, Decomposition1) +{ + // Example 6.2 of "Multiple View Geometry in Computer Vision - 2nd + // edition" (page 163) + const double p[12] = { + 3.53553e+2, 3.39645e+2, 2.77744e+2, -1.44946e+6, + -1.03528e+2, 2.33212e+1, 4.59607e+2, -6.32525e+5, + 7.07107e-1, -3.53553e-1, 6.12372e-1, -9.18559e+2 + }; + + OrthancStone::FiniteProjectiveCamera camera(p); + ASSERT_EQ(3u, camera.GetMatrix().size1()); + ASSERT_EQ(4u, camera.GetMatrix().size2()); + ASSERT_EQ(3u, camera.GetIntrinsicParameters().size1()); + ASSERT_EQ(3u, camera.GetIntrinsicParameters().size2()); + ASSERT_EQ(3u, camera.GetRotation().size1()); + ASSERT_EQ(3u, camera.GetRotation().size2()); + ASSERT_EQ(3u, camera.GetCenter().size()); + + ASSERT_NEAR(1000.0, camera.GetCenter()[0], 0.01); + ASSERT_NEAR(2000.0, camera.GetCenter()[1], 0.01); + ASSERT_NEAR(1500.0, camera.GetCenter()[2], 0.01); + + ASSERT_NEAR(468.2, camera.GetIntrinsicParameters() (0, 0), 0.1); + ASSERT_NEAR(91.2, camera.GetIntrinsicParameters() (0, 1), 0.1); + ASSERT_NEAR(300.0, camera.GetIntrinsicParameters() (0, 2), 0.1); + ASSERT_NEAR(427.2, camera.GetIntrinsicParameters() (1, 1), 0.1); + ASSERT_NEAR(200.0, camera.GetIntrinsicParameters() (1, 2), 0.1); + ASSERT_NEAR(1.0, camera.GetIntrinsicParameters() (2, 2), 0.1); + + ASSERT_NEAR(0, camera.GetIntrinsicParameters() (1, 0), 0.0000001); + ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 0), 0.0000001); + ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 1), 0.0000001); + + ASSERT_NEAR(0.41380, camera.GetRotation() (0, 0), 0.00001); + ASSERT_NEAR(0.90915, camera.GetRotation() (0, 1), 0.00001); + ASSERT_NEAR(0.04708, camera.GetRotation() (0, 2), 0.00001); + ASSERT_NEAR(-0.57338, camera.GetRotation() (1, 0), 0.00001); + ASSERT_NEAR(0.22011, camera.GetRotation() (1, 1), 0.00001); + ASSERT_NEAR(0.78917, camera.GetRotation() (1, 2), 0.00001); + ASSERT_NEAR(0.70711, camera.GetRotation() (2, 0), 0.00001); + ASSERT_NEAR(-0.35355, camera.GetRotation() (2, 1), 0.00001); + ASSERT_NEAR(0.61237, camera.GetRotation() (2, 2), 0.00001); + + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); + + OrthancStone::FiniteProjectiveCamera camera2(camera.GetIntrinsicParameters(), + camera.GetRotation(), + camera.GetCenter()); + + ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix())); + ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters())); + ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation())); + ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter())); +} + + +TEST(FiniteProjectiveCamera, Decomposition2) +{ + const double p[] = { 1188.111986, 580.205341, -808.445330, 128000.000000, -366.466264, 1446.510501, 418.499736, 128000.000000, -0.487118, 0.291726, -0.823172, 500.000000 }; + const double k[] = { -1528.494743, 0.000000, 256.000000, 0.000000, 1528.494743, 256.000000, 0.000000, 0.000000, 1.000000 }; + const double r[] = { -0.858893, -0.330733, 0.391047, -0.158171, 0.897503, 0.411668, -0.487118, 0.291726, -0.823172 }; + const double c[] = { 243.558936, -145.863085, 411.585964 }; + + OrthancStone::FiniteProjectiveCamera camera(p); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); + + OrthancStone::FiniteProjectiveCamera camera2(k, r, c); + ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix(), 1)); + ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters(), 0.001)); + ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation(), 0.000001)); + ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter(), 0.0001)); +} + + +TEST(FiniteProjectiveCamera, Decomposition3) +{ + const double p[] = { 10, 0, 0, 0, + 0, 20, 0, 0, + 0, 0, 30, 0 }; + + OrthancStone::FiniteProjectiveCamera camera(p); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); + ASSERT_DOUBLE_EQ(10, camera.GetIntrinsicParameters() (0, 0)); + ASSERT_DOUBLE_EQ(20, camera.GetIntrinsicParameters() (1, 1)); + ASSERT_DOUBLE_EQ(30, camera.GetIntrinsicParameters() (2, 2)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (0, 0)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 2)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (0)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (1)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (2)); +} + + +TEST(FiniteProjectiveCamera, Decomposition4) +{ + const double p[] = { 1, 0, 0, 10, + 0, 1, 0, 20, + 0, 0, 1, 30 }; + + OrthancStone::FiniteProjectiveCamera camera(p); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); + ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (0, 0)); + ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (1, 1)); + ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (2, 2)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (0, 0)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 2)); + ASSERT_DOUBLE_EQ(-10, camera.GetCenter() (0)); + ASSERT_DOUBLE_EQ(-20, camera.GetCenter() (1)); + ASSERT_DOUBLE_EQ(-30, camera.GetCenter() (2)); +} + + +TEST(FiniteProjectiveCamera, Decomposition5) +{ + const double p[] = { 0, 0, 10, 0, + 0, 20, 0, 0, + 30, 0, 0, 0 }; + + OrthancStone::FiniteProjectiveCamera camera(p); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); + ASSERT_DOUBLE_EQ(-10, camera.GetIntrinsicParameters() (0, 0)); + ASSERT_DOUBLE_EQ(20, camera.GetIntrinsicParameters() (1, 1)); + ASSERT_DOUBLE_EQ(30, camera.GetIntrinsicParameters() (2, 2)); + ASSERT_DOUBLE_EQ(-1, camera.GetRotation() (0, 2)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); + ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 0)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (0)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (1)); + ASSERT_DOUBLE_EQ(0, camera.GetCenter() (2)); + + OrthancStone::FiniteProjectiveCamera camera2(camera.GetIntrinsicParameters(), + camera.GetRotation(), + camera.GetCenter()); + ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix())); + ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters())); + ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation())); + ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter())); +} + + +static double GetCosAngle(const OrthancStone::Vector& a, + const OrthancStone::Vector& b) +{ + // Returns the cosine of the angle between two vectors + // https://en.wikipedia.org/wiki/Dot_product#Geometric_definition + return boost::numeric::ublas::inner_prod(a, b) / + (boost::numeric::ublas::norm_2(a) * boost::numeric::ublas::norm_2(b)); +} + + +TEST(FiniteProjectiveCamera, Ray) +{ + const double pp[] = { -1499.650894, 2954.618773, -259.737419, 637891.819097, + -2951.517707, -1501.019129, -285.785281, 637891.819097, + 0.008528, 0.003067, -0.999959, 2491.764918 }; + + const OrthancStone::FiniteProjectiveCamera camera(pp); + + ASSERT_NEAR(-21.2492, camera.GetCenter() (0), 0.0001); + ASSERT_NEAR(-7.64234, camera.GetCenter() (1), 0.00001); + ASSERT_NEAR(2491.66, camera.GetCenter() (2), 0.01); + + // Image plane that led to these parameters, with principal point at + // (256,256). The image has dimensions 512x512. + OrthancStone::Vector o = + OrthancStone::LinearAlgebra::CreateVector(7.009620, 2.521030, -821.942000); + OrthancStone::Vector ax = + OrthancStone::LinearAlgebra::CreateVector(-0.453219, 0.891399, -0.001131); + OrthancStone::Vector ay = + OrthancStone::LinearAlgebra::CreateVector(-0.891359, -0.453210, -0.008992); + + OrthancStone::CoordinateSystem3D imagePlane(o, ax, ay); + + // Back-projection of the principal point + { + OrthancStone::Vector ray = camera.GetRayDirection(256, 256); + + // The principal axis vector is orthogonal to the image plane + // (i.e. parallel to the plane normal), in the opposite direction + // ("-1" corresponds to "cos(pi)"). + ASSERT_NEAR(-1, GetCosAngle(ray, imagePlane.GetNormal()), 0.0000001); + + // Forward projection of principal axis, resulting in the principal point + double x, y; + camera.ApplyFinite(x, y, camera.GetCenter() - ray); + + ASSERT_NEAR(256, x, 0.00001); + ASSERT_NEAR(256, y, 0.00001); + } + + // Back-projection of the 4 corners of the image + std::vector cx, cy; + cx.push_back(0); + cy.push_back(0); + cx.push_back(512); + cy.push_back(0); + cx.push_back(512); + cy.push_back(512); + cx.push_back(0); + cy.push_back(512); + + bool first = true; + double angle; + + for (size_t i = 0; i < cx.size(); i++) + { + OrthancStone::Vector ray = camera.GetRayDirection(cx[i], cy[i]); + + // Check that the angle wrt. principal axis is the same for all + // the 4 corners + double a = GetCosAngle(ray, imagePlane.GetNormal()); + if (first) + { + first = false; + angle = a; + } + else + { + ASSERT_NEAR(angle, a, 0.000001); + } + + // Forward projection of the ray, going back to the original point + double x, y; + camera.ApplyFinite(x, y, camera.GetCenter() - ray); + + ASSERT_NEAR(cx[i], x, 0.00001); + ASSERT_NEAR(cy[i], y, 0.00001); + + // Alternative construction, by computing the intersection of the + // ray with the image plane + OrthancStone::Vector p; + ASSERT_TRUE(imagePlane.IntersectLine(p, camera.GetCenter(), -ray)); + imagePlane.ProjectPoint(x, y, p); + ASSERT_NEAR(cx[i], x + 256, 0.01); + ASSERT_NEAR(cy[i], y + 256, 0.01); + } +} + + +TEST(Matrix, Inverse1) +{ + OrthancStone::Matrix a, b; + + a.resize(0, 0); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(0u, b.size1()); + ASSERT_EQ(0u, b.size2()); + + a.resize(2, 3); + ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException); + + a.resize(1, 1); + a(0, 0) = 45.0; + + ASSERT_DOUBLE_EQ(45, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(1u, b.size1()); + ASSERT_EQ(1u, b.size2()); + ASSERT_DOUBLE_EQ(1.0 / 45.0, b(0, 0)); + + a(0, 0) = 0; + ASSERT_DOUBLE_EQ(0, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException); +} + + +TEST(Matrix, Inverse2) +{ + OrthancStone::Matrix a, b; + a.resize(2, 2); + a(0, 0) = 4; + a(0, 1) = 3; + a(1, 0) = 3; + a(1, 1) = 2; + + ASSERT_DOUBLE_EQ(-1, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(2u, b.size1()); + ASSERT_EQ(2u, b.size2()); + + ASSERT_DOUBLE_EQ(-2, b(0, 0)); + ASSERT_DOUBLE_EQ(3, b(0, 1)); + ASSERT_DOUBLE_EQ(3, b(1, 0)); + ASSERT_DOUBLE_EQ(-4, b(1, 1)); + + a(0, 0) = 1; + a(0, 1) = 2; + a(1, 0) = 3; + a(1, 1) = 4; + + ASSERT_DOUBLE_EQ(-2, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + + ASSERT_DOUBLE_EQ(-2, b(0, 0)); + ASSERT_DOUBLE_EQ(1, b(0, 1)); + ASSERT_DOUBLE_EQ(1.5, b(1, 0)); + ASSERT_DOUBLE_EQ(-0.5, b(1, 1)); +} + + +TEST(Matrix, Inverse3) +{ + OrthancStone::Matrix a, b; + a.resize(3, 3); + a(0, 0) = 7; + a(0, 1) = 2; + a(0, 2) = 1; + a(1, 0) = 0; + a(1, 1) = 3; + a(1, 2) = -1; + a(2, 0) = -3; + a(2, 1) = 4; + a(2, 2) = -2; + + ASSERT_DOUBLE_EQ(1, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(3u, b.size1()); + ASSERT_EQ(3u, b.size2()); + + ASSERT_DOUBLE_EQ(-2, b(0, 0)); + ASSERT_DOUBLE_EQ(8, b(0, 1)); + ASSERT_DOUBLE_EQ(-5, b(0, 2)); + ASSERT_DOUBLE_EQ(3, b(1, 0)); + ASSERT_DOUBLE_EQ(-11, b(1, 1)); + ASSERT_DOUBLE_EQ(7, b(1, 2)); + ASSERT_DOUBLE_EQ(9, b(2, 0)); + ASSERT_DOUBLE_EQ(-34, b(2, 1)); + ASSERT_DOUBLE_EQ(21, b(2, 2)); + + + a(0, 0) = 1; + a(0, 1) = 2; + a(0, 2) = 2; + a(1, 0) = 1; + a(1, 1) = 0; + a(1, 2) = 1; + a(2, 0) = 1; + a(2, 1) = 2; + a(2, 2) = 1; + + ASSERT_DOUBLE_EQ(2, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(3u, b.size1()); + ASSERT_EQ(3u, b.size2()); + + ASSERT_DOUBLE_EQ(-1, b(0, 0)); + ASSERT_DOUBLE_EQ(1, b(0, 1)); + ASSERT_DOUBLE_EQ(1, b(0, 2)); + ASSERT_DOUBLE_EQ(0, b(1, 0)); + ASSERT_DOUBLE_EQ(-0.5, b(1, 1)); + ASSERT_DOUBLE_EQ(0.5, b(1, 2)); + ASSERT_DOUBLE_EQ(1, b(2, 0)); + ASSERT_DOUBLE_EQ(0, b(2, 1)); + ASSERT_DOUBLE_EQ(-1, b(2, 2)); +} + + +TEST(Matrix, Inverse4) +{ + OrthancStone::Matrix a, b; + a.resize(4, 4); + a(0, 0) = 2; + a(0, 1) = 1; + a(0, 2) = 2; + a(0, 3) = -3; + a(1, 0) = -2; + a(1, 1) = 2; + a(1, 2) = -1; + a(1, 3) = -1; + a(2, 0) = 2; + a(2, 1) = 2; + a(2, 2) = -3; + a(2, 3) = -1; + a(3, 0) = 3; + a(3, 1) = -2; + a(3, 2) = -3; + a(3, 3) = -1; + + OrthancStone::LinearAlgebra::InvertMatrix(b, a); + ASSERT_EQ(4u, b.size1()); + ASSERT_EQ(4u, b.size2()); + + b *= 134.0; // This is the determinant + + ASSERT_DOUBLE_EQ(8, b(0, 0)); + ASSERT_DOUBLE_EQ(-44, b(0, 1)); + ASSERT_DOUBLE_EQ(30, b(0, 2)); + ASSERT_DOUBLE_EQ(-10, b(0, 3)); + ASSERT_DOUBLE_EQ(2, b(1, 0)); + ASSERT_DOUBLE_EQ(-11, b(1, 1)); + ASSERT_DOUBLE_EQ(41, b(1, 2)); + ASSERT_DOUBLE_EQ(-36, b(1, 3)); + ASSERT_DOUBLE_EQ(16, b(2, 0)); + ASSERT_DOUBLE_EQ(-21, b(2, 1)); + ASSERT_DOUBLE_EQ(-7, b(2, 2)); + ASSERT_DOUBLE_EQ(-20, b(2, 3)); + ASSERT_DOUBLE_EQ(-28, b(3, 0)); + ASSERT_DOUBLE_EQ(-47, b(3, 1)); + ASSERT_DOUBLE_EQ(29, b(3, 2)); + ASSERT_DOUBLE_EQ(-32, b(3, 3)); +} + + +TEST(FiniteProjectiveCamera, Calibration) +{ + unsigned int volumeWidth = 512; + unsigned int volumeHeight = 512; + unsigned int volumeDepth = 110; + + OrthancStone::Vector camera = OrthancStone::LinearAlgebra::CreateVector + (-1000, -5000, -static_cast(volumeDepth) * 32); + + OrthancStone::Vector principalPoint = OrthancStone::LinearAlgebra::CreateVector + (volumeWidth/2, volumeHeight/2, volumeDepth * 2); + + OrthancStone::FiniteProjectiveCamera c(camera, principalPoint, 0, 512, 512, 1, 1); + + double swapv[9] = { 1, 0, 0, + 0, -1, 512, + 0, 0, 1 }; + OrthancStone::Matrix swap; + OrthancStone::LinearAlgebra::FillMatrix(swap, 3, 3, swapv); + + OrthancStone::Matrix p = OrthancStone::LinearAlgebra::Product(swap, c.GetMatrix()); + p /= p(2,3); + + ASSERT_NEAR( 1.04437, p(0,0), 0.00001); + ASSERT_NEAR(-0.0703111, p(0,1), 0.00000001); + ASSERT_NEAR(-0.179283, p(0,2), 0.000001); + ASSERT_NEAR( 61.7431, p(0,3), 0.0001); + ASSERT_NEAR( 0.11127, p(1,0), 0.000001); + ASSERT_NEAR(-0.595541, p(1,1), 0.000001); + ASSERT_NEAR( 0.872211, p(1,2), 0.000001); + ASSERT_NEAR( 203.748, p(1,3), 0.001); + ASSERT_NEAR( 3.08593e-05, p(2,0), 0.0000000001); + ASSERT_NEAR( 0.000129138, p(2,1), 0.000000001); + ASSERT_NEAR( 9.18901e-05, p(2,2), 0.0000000001); + ASSERT_NEAR( 1, p(2,3), 0.0000001); +} + + +static bool IsEqualRotationVector(OrthancStone::Vector a, + OrthancStone::Vector b) +{ + if (a.size() != b.size() || + a.size() != 3) + { + return false; + } + else + { + OrthancStone::LinearAlgebra::NormalizeVector(a); + OrthancStone::LinearAlgebra::NormalizeVector(b); + return OrthancStone::LinearAlgebra::IsCloseToZero(boost::numeric::ublas::norm_2(a - b)); + } +} + + +TEST(GeometryToolbox, AlignVectorsWithRotation) +{ + OrthancStone::Vector a, b; + OrthancStone::Matrix r; + + OrthancStone::LinearAlgebra::AssignVector(a, -200, 200, -846.63); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); + ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); + + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, b, a); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); + ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, b), a)); + + OrthancStone::LinearAlgebra::AssignVector(a, 1, 0, 0); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); + ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); + + OrthancStone::LinearAlgebra::AssignVector(a, 0, 1, 0); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); + ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); + + OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, 1); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); + ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); + ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); + + OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, 0); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + ASSERT_THROW(OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b), Orthanc::OrthancException); + + // TODO: Deal with opposite vectors + + /* + OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, -1); + OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); + OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); + OrthancStone::LinearAlgebra::Print(r); + OrthancStone::LinearAlgebra::Print(boost::numeric::ublas::prod(r, a)); + */ +} + + +static bool IsEqualVectorL1(OrthancStone::Vector a, + OrthancStone::Vector b) +{ + if (a.size() != b.size()) + { + return false; + } + else + { + for (size_t i = 0; i < a.size(); i++) + { + if (!OrthancStone::LinearAlgebra::IsNear(a[i], b[i], 0.0001)) + { + return false; + } + } + + return true; + } +} + + +TEST(VolumeImageGeometry, Basic) +{ + using namespace OrthancStone; + + VolumeImageGeometry g; + g.SetSizeInVoxels(10, 20, 30); + g.SetVoxelDimensions(1, 2, 3); + + Vector p = g.GetCoordinates(0, 0, 0); + ASSERT_EQ(3u, p.size()); + ASSERT_DOUBLE_EQ(-1.0 / 2.0, p[0]); + ASSERT_DOUBLE_EQ(-2.0 / 2.0, p[1]); + ASSERT_DOUBLE_EQ(-3.0 / 2.0, p[2]); + + p = g.GetCoordinates(1, 1, 1); + ASSERT_DOUBLE_EQ(-1.0 / 2.0 + 10.0 * 1.0, p[0]); + ASSERT_DOUBLE_EQ(-2.0 / 2.0 + 20.0 * 2.0, p[1]); + ASSERT_DOUBLE_EQ(-3.0 / 2.0 + 30.0 * 3.0, p[2]); + + VolumeProjection proj; + ASSERT_TRUE(g.DetectProjection(proj, g.GetAxialGeometry().GetNormal())); + ASSERT_EQ(VolumeProjection_Axial, proj); + ASSERT_TRUE(g.DetectProjection(proj, g.GetCoronalGeometry().GetNormal())); + ASSERT_EQ(VolumeProjection_Coronal, proj); + ASSERT_TRUE(g.DetectProjection(proj, g.GetSagittalGeometry().GetNormal())); + ASSERT_EQ(VolumeProjection_Sagittal, proj); + + ASSERT_EQ(10u, g.GetProjectionWidth(VolumeProjection_Axial)); + ASSERT_EQ(20u, g.GetProjectionHeight(VolumeProjection_Axial)); + ASSERT_EQ(30u, g.GetProjectionDepth(VolumeProjection_Axial)); + ASSERT_EQ(10u, g.GetProjectionWidth(VolumeProjection_Coronal)); + ASSERT_EQ(30u, g.GetProjectionHeight(VolumeProjection_Coronal)); + ASSERT_EQ(20u, g.GetProjectionDepth(VolumeProjection_Coronal)); + ASSERT_EQ(20u, g.GetProjectionWidth(VolumeProjection_Sagittal)); + ASSERT_EQ(30u, g.GetProjectionHeight(VolumeProjection_Sagittal)); + ASSERT_EQ(10u, g.GetProjectionDepth(VolumeProjection_Sagittal)); + + p = g.GetVoxelDimensions(VolumeProjection_Axial); + ASSERT_EQ(3u, p.size()); + ASSERT_DOUBLE_EQ(1, p[0]); + ASSERT_DOUBLE_EQ(2, p[1]); + ASSERT_DOUBLE_EQ(3, p[2]); + p = g.GetVoxelDimensions(VolumeProjection_Coronal); + ASSERT_EQ(3u, p.size()); + ASSERT_DOUBLE_EQ(1, p[0]); + ASSERT_DOUBLE_EQ(3, p[1]); + ASSERT_DOUBLE_EQ(2, p[2]); + p = g.GetVoxelDimensions(VolumeProjection_Sagittal); + ASSERT_EQ(3u, p.size()); + ASSERT_DOUBLE_EQ(2, p[0]); + ASSERT_DOUBLE_EQ(3, p[1]); + ASSERT_DOUBLE_EQ(1, p[2]); + + // Loop over all the voxels of the volume + for (unsigned int z = 0; z < g.GetDepth(); z++) + { + const float zz = (0.5f + static_cast(z)) / static_cast(g.GetDepth()); // Z-center of the voxel + + for (unsigned int y = 0; y < g.GetHeight(); y++) + { + const float yy = (0.5f + static_cast(y)) / static_cast(g.GetHeight()); // Y-center of the voxel + + for (unsigned int x = 0; x < g.GetWidth(); x++) + { + const float xx = (0.5f + static_cast(x)) / static_cast(g.GetWidth()); // X-center of the voxel + + const float sx = 1.0f; + const float sy = 2.0f; + const float sz = 3.0f; + + Vector p = g.GetCoordinates(xx, yy, zz); + + Vector q = (g.GetAxialGeometry().MapSliceToWorldCoordinates( + static_cast(x) * sx, + static_cast(y) * sy) + + z * sz * g.GetAxialGeometry().GetNormal()); + ASSERT_TRUE(IsEqualVectorL1(p, q)); + + q = (g.GetCoronalGeometry().MapSliceToWorldCoordinates( + static_cast(x) * sx, + static_cast(g.GetDepth() - 1 - z) * sz) + + y * sy * g.GetCoronalGeometry().GetNormal()); + ASSERT_TRUE(IsEqualVectorL1(p, q)); + + /** + * WARNING: In sagittal geometry, the normal points to + * REDUCING X-axis in the 3D world. This is necessary to keep + * the right-hand coordinate system. Hence the "-". + **/ + q = (g.GetSagittalGeometry().MapSliceToWorldCoordinates( + static_cast(y) * sy, + static_cast(g.GetDepth() - 1 - z) * sz) + + x * sx * (-g.GetSagittalGeometry().GetNormal())); + ASSERT_TRUE(IsEqualVectorL1(p, q)); + } + } + } + + ASSERT_EQ(0, (int) VolumeProjection_Axial); + ASSERT_EQ(1, (int) VolumeProjection_Coronal); + ASSERT_EQ(2, (int) VolumeProjection_Sagittal); + + for (int p = 0; p < 3; p++) + { + VolumeProjection projection = (VolumeProjection) p; + const CoordinateSystem3D& s = g.GetProjectionGeometry(projection); + + ASSERT_THROW(g.GetProjectionSlice(projection, g.GetProjectionDepth(projection)), Orthanc::OrthancException); + + for (unsigned int i = 0; i < g.GetProjectionDepth(projection); i++) + { + CoordinateSystem3D plane = g.GetProjectionSlice(projection, i); + + if (projection == VolumeProjection_Sagittal) + { + ASSERT_TRUE(IsEqualVectorL1(plane.GetOrigin(), s.GetOrigin() + static_cast(i) * + (-s.GetNormal()) * g.GetVoxelDimensions(projection)[2])); + } + else + { + ASSERT_TRUE(IsEqualVectorL1(plane.GetOrigin(), s.GetOrigin() + static_cast(i) * + s.GetNormal() * g.GetVoxelDimensions(projection)[2])); + } + + ASSERT_TRUE(IsEqualVectorL1(plane.GetAxisX(), s.GetAxisX())); + ASSERT_TRUE(IsEqualVectorL1(plane.GetAxisY(), s.GetAxisY())); + + unsigned int slice; + VolumeProjection q; + ASSERT_TRUE(g.DetectSlice(q, slice, plane)); + ASSERT_EQ(projection, q); + ASSERT_EQ(i, slice); + } + } +} + + +TEST(LinearAlgebra, ParseVectorLocale) +{ + OrthancStone::Vector v; + + ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "1.2")); + ASSERT_EQ(1u, v.size()); + ASSERT_DOUBLE_EQ(1.2, v[0]); + + ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "-1.2e+2")); + ASSERT_EQ(1u, v.size()); + ASSERT_DOUBLE_EQ(-120.0, v[0]); + + ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "-1e-2\\2")); + ASSERT_EQ(2u, v.size()); + ASSERT_DOUBLE_EQ(-0.01, v[0]); + ASSERT_DOUBLE_EQ(2.0, v[1]); + + ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "1.3671875\\1.3671875")); + ASSERT_EQ(2u, v.size()); + ASSERT_DOUBLE_EQ(1.3671875, v[0]); + ASSERT_DOUBLE_EQ(1.3671875, v[1]); +} + +TEST(LoaderCache, NormalizeUuid) +{ + std::string ref("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); + + { + std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space left + { + std::string u(" 44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space right + { + std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb "); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space l & r + { + std::string u(" 44ca5051-14ef-4d2f-8bd7-db20bfb61fbb "); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space left + case + { + std::string u(" 44CA5051-14ef-4d2f-8bd7-dB20bfb61fbb"); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space right + case + { + std::string u("44ca5051-14EF-4D2f-8bd7-db20bfb61fbB "); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // space l & r + case + { + std::string u(" 44cA5051-14Ef-4d2f-8bD7-db20bfb61fbb "); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_EQ(ref, u); + } + + // no + { + std::string u(" 44ca5051-14ef-4d2f-8bd7- db20bfb61fbb"); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_NE(ref, u); + } + + // no + { + std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fb"); + OrthancStone::LoaderCache::NormalizeUuid(u); + ASSERT_NE(ref, u); + } +} + + +int main(int argc, char **argv) +{ + Orthanc::Logging::Initialize(); + Orthanc::Logging::EnableInfoLevel(true); + + ::testing::InitGoogleTest(&argc, argv); + int result = RUN_ALL_TESTS(); + + Orthanc::Logging::Finalize(); + + return result; +} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/CairoConfiguration.cmake --- a/Resources/CMake/CairoConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,257 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -# ./configure --disable-pdf --disable-svg --disable-xlib --disable-xcb --disable-script --disable-ps --disable-ft --disable-fc --disable-png --disable-trace --disable-interpreter - - -if (STATIC_BUILD OR NOT USE_SYSTEM_CAIRO) - SET(CAIRO_SOURCES_DIR ${CMAKE_BINARY_DIR}/cairo-1.14.12) - SET(CAIRO_URL "http://orthanc.osimis.io/ThirdPartyDownloads/cairo-1.14.12.tar.xz") - SET(CAIRO_MD5 "9f0db9dbfca0966be8acd682e636d165") - - DownloadPackage(${CAIRO_MD5} ${CAIRO_URL} "${CAIRO_SOURCES_DIR}") - - file(COPY - ${CMAKE_CURRENT_LIST_DIR}/cairo-features.h - DESTINATION ${CAIRO_SOURCES_DIR}/src - ) - - set(CAIRO_SOURCES - ${CAIRO_SOURCES_DIR}/src/cairo-analysis-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-arc.c - ${CAIRO_SOURCES_DIR}/src/cairo-array.c - ${CAIRO_SOURCES_DIR}/src/cairo-atomic.c - ${CAIRO_SOURCES_DIR}/src/cairo-base64-stream.c - ${CAIRO_SOURCES_DIR}/src/cairo-base85-stream.c - ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann.c - ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann-rectangular.c - ${CAIRO_SOURCES_DIR}/src/cairo-bentley-ottmann-rectilinear.c - ${CAIRO_SOURCES_DIR}/src/cairo-botor-scan-converter.c - ${CAIRO_SOURCES_DIR}/src/cairo-boxes.c - ${CAIRO_SOURCES_DIR}/src/cairo-boxes-intersect.c - ${CAIRO_SOURCES_DIR}/src/cairo.c - ${CAIRO_SOURCES_DIR}/src/cairo-cache.c - ${CAIRO_SOURCES_DIR}/src/cairo-cff-subset.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip-boxes.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip-polygon.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip-region.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-clip-tor-scan-converter.c - # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-context.c - # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-gradient.c - # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-cogl-utils.c - ${CAIRO_SOURCES_DIR}/src/cairo-color.c - ${CAIRO_SOURCES_DIR}/src/cairo-composite-rectangles.c - ${CAIRO_SOURCES_DIR}/src/cairo-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-contour.c - ${CAIRO_SOURCES_DIR}/src/cairo-damage.c - ${CAIRO_SOURCES_DIR}/src/cairo-debug.c - ${CAIRO_SOURCES_DIR}/src/cairo-default-context.c - ${CAIRO_SOURCES_DIR}/src/cairo-deflate-stream.c - ${CAIRO_SOURCES_DIR}/src/cairo-device.c - # ${CAIRO_SOURCES_DIR}/src/cairo-directfb-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-egl-context.c - ${CAIRO_SOURCES_DIR}/src/cairo-error.c - ${CAIRO_SOURCES_DIR}/src/cairo-fallback-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-fixed.c - ${CAIRO_SOURCES_DIR}/src/cairo-font-face.c - ${CAIRO_SOURCES_DIR}/src/cairo-font-face-twin.c - ${CAIRO_SOURCES_DIR}/src/cairo-font-face-twin-data.c - ${CAIRO_SOURCES_DIR}/src/cairo-font-options.c - ${CAIRO_SOURCES_DIR}/src/cairo-freed-pool.c - ${CAIRO_SOURCES_DIR}/src/cairo-freelist.c - # ${CAIRO_SOURCES_DIR}/src/cairo-ft-font.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-composite.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-device.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-dispatch.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-glyphs.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-gradient.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-info.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-msaa-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-operand.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-shaders.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-source.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-spans-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-gl-traps-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-glx-context.c - ${CAIRO_SOURCES_DIR}/src/cairo-gstate.c - ${CAIRO_SOURCES_DIR}/src/cairo-hash.c - ${CAIRO_SOURCES_DIR}/src/cairo-hull.c - ${CAIRO_SOURCES_DIR}/src/cairo-image-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-image-info.c - ${CAIRO_SOURCES_DIR}/src/cairo-image-source.c - ${CAIRO_SOURCES_DIR}/src/cairo-image-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-line.c - ${CAIRO_SOURCES_DIR}/src/cairo-lzw.c - ${CAIRO_SOURCES_DIR}/src/cairo-mask-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-matrix.c - ${CAIRO_SOURCES_DIR}/src/cairo-mempool.c - ${CAIRO_SOURCES_DIR}/src/cairo-mesh-pattern-rasterizer.c - ${CAIRO_SOURCES_DIR}/src/cairo-misc.c - ${CAIRO_SOURCES_DIR}/src/cairo-mono-scan-converter.c - ${CAIRO_SOURCES_DIR}/src/cairo-mutex.c - ${CAIRO_SOURCES_DIR}/src/cairo-no-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-observer.c - # ${CAIRO_SOURCES_DIR}/src/cairo-os2-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-output-stream.c - ${CAIRO_SOURCES_DIR}/src/cairo-paginated-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-bounds.c - ${CAIRO_SOURCES_DIR}/src/cairo-path.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-fill.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-fixed.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-in-fill.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-boxes.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-polygon.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-traps.c - ${CAIRO_SOURCES_DIR}/src/cairo-path-stroke-tristrip.c - ${CAIRO_SOURCES_DIR}/src/cairo-pattern.c - # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-operators.c - # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-shading.c - # ${CAIRO_SOURCES_DIR}/src/cairo-pdf-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-pen.c - # ${CAIRO_SOURCES_DIR}/src/cairo-png.c - ${CAIRO_SOURCES_DIR}/src/cairo-polygon.c - ${CAIRO_SOURCES_DIR}/src/cairo-polygon-intersect.c - ${CAIRO_SOURCES_DIR}/src/cairo-polygon-reduce.c - # ${CAIRO_SOURCES_DIR}/src/cairo-ps-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-font.c - # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-image-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-quartz-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-raster-source-pattern.c - ${CAIRO_SOURCES_DIR}/src/cairo-recording-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-rectangle.c - ${CAIRO_SOURCES_DIR}/src/cairo-rectangular-scan-converter.c - ${CAIRO_SOURCES_DIR}/src/cairo-region.c - ${CAIRO_SOURCES_DIR}/src/cairo-rtree.c - ${CAIRO_SOURCES_DIR}/src/cairo-scaled-font.c - ${CAIRO_SOURCES_DIR}/src/cairo-scaled-font-subsets.c - # ${CAIRO_SOURCES_DIR}/src/cairo-script-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-shape-mask-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-slope.c - ${CAIRO_SOURCES_DIR}/src/cairo-spans.c - ${CAIRO_SOURCES_DIR}/src/cairo-spans-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-spline.c - ${CAIRO_SOURCES_DIR}/src/cairo-stroke-dash.c - ${CAIRO_SOURCES_DIR}/src/cairo-stroke-style.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-clipper.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-fallback.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-observer.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-offset.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-snapshot.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-subsurface.c - ${CAIRO_SOURCES_DIR}/src/cairo-surface-wrapper.c - # ${CAIRO_SOURCES_DIR}/src/cairo-svg-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-tee-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-time.c - ${CAIRO_SOURCES_DIR}/src/cairo-tor22-scan-converter.c - ${CAIRO_SOURCES_DIR}/src/cairo-tor-scan-converter.c - ${CAIRO_SOURCES_DIR}/src/cairo-toy-font-face.c - ${CAIRO_SOURCES_DIR}/src/cairo-traps.c - ${CAIRO_SOURCES_DIR}/src/cairo-traps-compositor.c - ${CAIRO_SOURCES_DIR}/src/cairo-tristrip.c - ${CAIRO_SOURCES_DIR}/src/cairo-truetype-subset.c - ${CAIRO_SOURCES_DIR}/src/cairo-type1-fallback.c - ${CAIRO_SOURCES_DIR}/src/cairo-type1-glyph-names.c - ${CAIRO_SOURCES_DIR}/src/cairo-type1-subset.c - ${CAIRO_SOURCES_DIR}/src/cairo-type3-glyph-surface.c - ${CAIRO_SOURCES_DIR}/src/cairo-unicode.c - ${CAIRO_SOURCES_DIR}/src/cairo-user-font.c - ${CAIRO_SOURCES_DIR}/src/cairo-version.c - # ${CAIRO_SOURCES_DIR}/src/cairo-vg-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-wgl-context.c - ${CAIRO_SOURCES_DIR}/src/cairo-wideint.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-core.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-render.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-connection-shm.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-resources.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-screen.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-shm.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface-core.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xcb-surface-render.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-core-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-display.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-fallback-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-render-compositor.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-screen.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-source.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-surface-shm.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-visual.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xlib-xcb-surface.c - # ${CAIRO_SOURCES_DIR}/src/cairo-xml-surface.c - ) - - include_directories(${CAIRO_SOURCES_DIR}/src) - - set(CAIRO_DEFINITIONS "HAS_PIXMAN_GLYPHS=1") - - if (${CMAKE_SYSTEM_NAME} STREQUAL "PNaCl") - # Disable vectorized instructions when targeting archicture-independent PNaCl - set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=1;HAVE_UINT64_T=1") - - elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "Android") - # Disable vectorized instructions and threading if targeting asm.js - set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=0;CAIRO_NO_MUTEX=1;HAVE_UINT64_T=1") - - elseif (CMAKE_COMPILER_IS_GNUCXX OR - CMAKE_SYSTEM_NAME STREQUAL "Darwin") - - set(CAIRO_DEFINITIONS "${CAIRO_DEFINITIONS};HAVE_STDINT_H=1;CAIRO_HAS_PTHREAD=1;HAVE_UINT64_T=1;CAIRO_HAS_REAL_PTHREAD=1;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_FLOAT128") - - if (CMAKE_COMPILER_IS_GNUCXX) - set_property( - SOURCE ${CAIRO_SOURCES} - PROPERTY COMPILE_FLAGS "-Wno-attributes" - ) - endif() - - elseif (MSVC) - # The cairo source code comes with built-in support for Visual Studio - - else() - message(FATAL_ERROR "Support your platform here") - - endif() - - - if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - # Explicitly request static building on Windows - add_definitions(-DCAIRO_WIN32_STATIC_BUILD=1) - endif() - - - set_property( - SOURCE ${CAIRO_SOURCES} - PROPERTY COMPILE_DEFINITIONS "${CAIRO_DEFINITIONS}" - ) - -else() - - pkg_search_module(CAIRO REQUIRED cairo) - include_directories(${CAIRO_INCLUDE_DIRS}) - link_libraries(${CAIRO_LIBRARIES}) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/FreetypeConfiguration.cmake --- a/Resources/CMake/FreetypeConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -if (STATIC_BUILD OR NOT USE_SYSTEM_FREETYPE) - set(FREETYPE_SOURCES_DIR ${CMAKE_BINARY_DIR}/freetype-2.9.1) - set(FREETYPE_URL "http://orthanc.osimis.io/ThirdPartyDownloads/freetype-2.9.1.tar.gz") - set(FREETYPE_MD5 "3adb0e35d3c100c456357345ccfa8056") - - DownloadPackage(${FREETYPE_MD5} ${FREETYPE_URL} "${FREETYPE_SOURCES_DIR}") - - include_directories(BEFORE - ${FREETYPE_SOURCES_DIR}/include/ - ) - - add_definitions( - -DFT2_BUILD_LIBRARY - -DFT_CONFIG_OPTION_NO_ASSEMBLER - ) - - set(FREETYPE_SOURCES - ${FREETYPE_SOURCES_DIR}/src/autofit/autofit.c - ${FREETYPE_SOURCES_DIR}/src/base/ftbase.c - ${FREETYPE_SOURCES_DIR}/src/base/ftbbox.c - ${FREETYPE_SOURCES_DIR}/src/base/ftbdf.c - ${FREETYPE_SOURCES_DIR}/src/base/ftbitmap.c - ${FREETYPE_SOURCES_DIR}/src/base/ftcid.c - ${FREETYPE_SOURCES_DIR}/src/base/ftfstype.c - ${FREETYPE_SOURCES_DIR}/src/base/ftgasp.c - ${FREETYPE_SOURCES_DIR}/src/base/ftglyph.c - ${FREETYPE_SOURCES_DIR}/src/base/ftgxval.c - ${FREETYPE_SOURCES_DIR}/src/base/ftinit.c - ${FREETYPE_SOURCES_DIR}/src/base/ftmm.c - ${FREETYPE_SOURCES_DIR}/src/base/ftotval.c - ${FREETYPE_SOURCES_DIR}/src/base/ftpatent.c - ${FREETYPE_SOURCES_DIR}/src/base/ftpfr.c - ${FREETYPE_SOURCES_DIR}/src/base/ftstroke.c - ${FREETYPE_SOURCES_DIR}/src/base/ftsynth.c - ${FREETYPE_SOURCES_DIR}/src/base/ftsystem.c - ${FREETYPE_SOURCES_DIR}/src/base/fttype1.c - ${FREETYPE_SOURCES_DIR}/src/base/ftwinfnt.c - ${FREETYPE_SOURCES_DIR}/src/bdf/bdf.c - ${FREETYPE_SOURCES_DIR}/src/bzip2/ftbzip2.c - ${FREETYPE_SOURCES_DIR}/src/cache/ftcache.c - ${FREETYPE_SOURCES_DIR}/src/cff/cff.c - ${FREETYPE_SOURCES_DIR}/src/cid/type1cid.c - ${FREETYPE_SOURCES_DIR}/src/gzip/ftgzip.c - ${FREETYPE_SOURCES_DIR}/src/lzw/ftlzw.c - ${FREETYPE_SOURCES_DIR}/src/pcf/pcf.c - ${FREETYPE_SOURCES_DIR}/src/pfr/pfr.c - ${FREETYPE_SOURCES_DIR}/src/psaux/psaux.c - ${FREETYPE_SOURCES_DIR}/src/pshinter/pshinter.c - ${FREETYPE_SOURCES_DIR}/src/psnames/psnames.c - ${FREETYPE_SOURCES_DIR}/src/raster/raster.c - ${FREETYPE_SOURCES_DIR}/src/sfnt/sfnt.c - ${FREETYPE_SOURCES_DIR}/src/smooth/smooth.c - ${FREETYPE_SOURCES_DIR}/src/truetype/truetype.c - ${FREETYPE_SOURCES_DIR}/src/type1/type1.c - ${FREETYPE_SOURCES_DIR}/src/type42/type42.c - ${FREETYPE_SOURCES_DIR}/src/winfonts/winfnt.c - ) - - if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - list(APPEND FREETYPE_SOURCES - ${FREETYPE_SOURCES_DIR}/builds/windows/ftdebug.c - ) - endif() - - foreach(header - ${FREETYPE_SOURCES_DIR}/include/freetype/config/ftconfig.h - ${FREETYPE_SOURCES_DIR}/include/freetype/config/ftoption.h - ) - - set_source_files_properties( - ${FREETYPE_SOURCES} - PROPERTIES OBJECT_DEPENDS ${header} - ) - endforeach() - - source_group(ThirdParty\\Freetype REGULAR_EXPRESSION ${FREETYPE_SOURCES_DIR}/.*) - -else() - include(FindFreetype) - - if (NOT FREETYPE_FOUND) - message(FATAL_ERROR "Please install the libfreetype6-dev package") - endif() - - include_directories(${FREETYPE_INCLUDE_DIRS}) - link_libraries(${FREETYPE_LIBRARIES}) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/GlewConfiguration.cmake --- a/Resources/CMake/GlewConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -if (STATIC_BUILD OR NOT USE_SYSTEM_GLEW) - SET(GLEW_SOURCES_DIR ${CMAKE_BINARY_DIR}/glew-2.1.0) - SET(GLEW_URL "http://orthanc.osimis.io/ThirdPartyDownloads/glew-2.1.0.tgz") - SET(GLEW_MD5 "b2ab12331033ddfaa50dc39345343980") - DownloadPackage(${GLEW_MD5} ${GLEW_URL} "${GLEW_SOURCES_DIR}") - - set(GLEW_SOURCES - ${GLEW_SOURCES_DIR}/src/glew.c - ) - - include_directories(${GLEW_SOURCES_DIR}/include) - - add_definitions( - -DGLEW_STATIC=1 - ) - -else() - include(FindGLEW) - if (NOT GLEW_FOUND) - message(FATAL_ERROR "Please install the libglew-dev package") - endif() - - include_directories(${GLEW_INCLUDE_DIRS}) - link_libraries(${GLEW_LIBRARIES}) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/LinuxStandardBaseUic.py --- a/Resources/CMake/LinuxStandardBaseUic.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#!/usr/bin/env python - -import subprocess -import sys - -if len(sys.argv) <= 1: - sys.stderr.write('Please provide arguments for uic\n') - sys.exit(-1) - -path = '' -pos = 1 -while pos < len(sys.argv): - if sys.argv[pos].startswith('-'): - pos += 2 - else: - path = sys.argv[pos] - break - -if len(path) == 0: - sys.stderr.write('Unable to find the input file in the arguments to uic\n') - sys.exit(-1) - -with open(path, 'r') as f: - lines = f.read().split('\n') - if (len(lines) > 1 and - lines[0].startswith('. - - - -##################################################################### -## Configure the Orthanc Framework -##################################################################### - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - include(${CMAKE_CURRENT_LIST_DIR}/../Orthanc/CMake/DownloadOrthancFramework.cmake) - link_libraries(${ORTHANC_FRAMEWORK_LIBRARIES}) - -else() - if (ENABLE_DCMTK) - set(ENABLE_LOCALE ON) - else() - if (NOT DEFINED ENABLE_LOCALE) - set(ENABLE_LOCALE OFF) # Disable support for locales (notably in Boost) - endif() - endif() - - include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkConfiguration.cmake) - include_directories( - ${ORTHANC_FRAMEWORK_ROOT}/Sources/ - ) -endif() - - -##################################################################### -## Sanity check of the configuration -##################################################################### - -if (ORTHANC_SANDBOXED) - if (ENABLE_CURL) - message(FATAL_ERROR "Cannot enable curl in sandboxed environments") - endif() - - if (ENABLE_SDL) - message(FATAL_ERROR "Cannot enable SDL in sandboxed environments") - endif() - - if (ENABLE_SSL) - message(FATAL_ERROR "Cannot enable SSL in sandboxed environments") - endif() -endif() - -if (ENABLE_OPENGL) - if (NOT ENABLE_SDL AND NOT ENABLE_WASM) - message(FATAL_ERROR "Cannot enable OpenGL if WebAssembly and SDL are both disabled") - endif() -endif() - -if (ENABLE_WASM) - if (NOT ORTHANC_SANDBOXED) - message(FATAL_ERROR "WebAssembly target must me configured as sandboxed") - endif() - - if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - message(FATAL_ERROR "WebAssembly target requires the emscripten compiler") - endif() - - set(ENABLE_THREADS OFF) - add_definitions(-DORTHANC_ENABLE_WASM=1) -else() - if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR - CMAKE_SYSTEM_NAME STREQUAL "PNaCl" OR - CMAKE_SYSTEM_NAME STREQUAL "NaCl32" OR - CMAKE_SYSTEM_NAME STREQUAL "NaCl64") - message(FATAL_ERROR "Trying to use a Web compiler for a native build") - endif() - - set(ENABLE_THREADS ON) - add_definitions(-DORTHANC_ENABLE_WASM=0) -endif() - - -##################################################################### -## Configure mandatory third-party components -##################################################################### - -SET(ORTHANC_STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../..) - -include(FindPkgConfig) -include(${CMAKE_CURRENT_LIST_DIR}/CairoConfiguration.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/FreetypeConfiguration.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/PixmanConfiguration.cmake) - - - -##################################################################### -## Configure optional third-party components -##################################################################### - -if (NOT ORTHANC_SANDBOXED) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp - ) -endif() - - -if(ENABLE_SDL) - message("SDL is enabled") - include(${CMAKE_CURRENT_LIST_DIR}/SdlConfiguration.cmake) - add_definitions( - -DORTHANC_ENABLE_SDL=1 - ) -else() - message("SDL is disabled") - unset(USE_SYSTEM_SDL CACHE) - add_definitions( - -DORTHANC_ENABLE_SDL=0 - ) -endif() - - -if (ENABLE_THREADS) - add_definitions(-DORTHANC_ENABLE_THREADS=1) -else() - add_definitions(-DORTHANC_ENABLE_THREADS=0) -endif() - - -if (ENABLE_OPENGL AND CMAKE_SYSTEM_NAME STREQUAL "Windows") - include(${CMAKE_CURRENT_LIST_DIR}/GlewConfiguration.cmake) - add_definitions( - -DORTHANC_ENABLE_GLEW=1 - ) -else() - add_definitions( - -DORTHANC_ENABLE_GLEW=0 - ) -endif() - - -if (ENABLE_OPENGL) - if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - # If including "FindOpenGL.cmake" using Emscripten (targeting - # WebAssembly), the "OPENGL_LIBRARIES" value incorrectly includes - # the "nul" library, which leads to warning message in Emscripten: - # 'shared:WARNING: emcc: cannot find library "nul"'. - include(FindOpenGL) - if (NOT OPENGL_FOUND) - message(FATAL_ERROR "Cannot find OpenGL on your system") - endif() - - link_libraries(${OPENGL_LIBRARIES}) - endif() - - add_definitions( - -DORTHANC_ENABLE_OPENGL=1 - ) -else() - add_definitions(-DORTHANC_ENABLE_OPENGL=0) -endif() - - - -##################################################################### -## Configuration of the C/C++ macros -##################################################################### - -if (MSVC) - # Remove some warnings on Visual Studio 2015 - add_definitions(-D_SCL_SECURE_NO_WARNINGS=1) -endif() - -add_definitions( - -DHAS_ORTHANC_EXCEPTION=1 - ) - -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - add_definitions(-DCHECK_OBSERVERS_MESSAGES) -endif() - - - -##################################################################### -## System-specific patches -##################################################################### - -if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND - NOT MSVC AND - ENABLE_SDL) - # This is necessary when compiling EXE for Windows using MinGW - link_libraries(mingw32) -endif() - -if (ORTHANC_SANDBOXED) - # Remove functions not suitable for a sandboxed environment - list(REMOVE_ITEM ORTHANC_CORE_SOURCES - ${ZLIB_SOURCES_DIR}/gzlib.c - ${ZLIB_SOURCES_DIR}/gzwrite.c - ${ZLIB_SOURCES_DIR}/gzread.c - ) -endif() - - - -##################################################################### -## All the source files required to build Stone of Orthanc -##################################################################### - -if (NOT ORTHANC_SANDBOXED) - set(PLATFORM_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Loaders/GenericLoadersContext.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/GenericLoadersContext.h - ) - - if (ENABLE_SDL) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Viewport/SdlWindow.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/SdlWindow.h - ) - endif() - - if (ENABLE_SDL) - if (ENABLE_OPENGL) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/SdlOpenGLContext.cpp - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/SdlOpenGLContext.h - ${ORTHANC_STONE_ROOT}/Framework/Viewport/SdlViewport.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/SdlViewport.h - ) - endif() - endif() -endif() - - -if (ENABLE_DCMTK) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Oracle/ParseDicomSuccessMessage.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ParsedDicomCache.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ParsedDicomDataset.cpp - ) -endif() - -if (ENABLE_THREADS) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Oracle/ThreadedOracle.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/GenericOracleRunner.cpp - ) -endif() - - -if (ENABLE_WASM) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Loaders/WebAssemblyLoadersContext.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/WebAssemblyOracle.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/WebAssemblyCairoViewport.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/WebAssemblyViewport.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/WebAssemblyViewport.h - ) -endif() - -if ((ENABLE_SDL OR ENABLE_WASM) AND ENABLE_GUIADAPTER) - list(APPEND APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Deprecated/GuiAdapter.cpp - ${ORTHANC_STONE_ROOT}/Framework/Deprecated/GuiAdapter.h - ) -endif() - - -list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/OrthancDatasets/DicomDatasetReader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/OrthancDatasets/DicomPath.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/OrthancDatasets/FullOrthancDataset.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/OrthancDatasets/IOrthancConnection.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Fonts/FontRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Fonts/Glyph.cpp - ${ORTHANC_STONE_ROOT}/Framework/Fonts/GlyphAlphabet.cpp - ${ORTHANC_STONE_ROOT}/Framework/Fonts/GlyphBitmapAlphabet.cpp - ${ORTHANC_STONE_ROOT}/Framework/Fonts/GlyphTextureAlphabet.cpp - ${ORTHANC_STONE_ROOT}/Framework/Fonts/TextBoundingBox.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Loaders/BasicFetchingItemsSorter.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/BasicFetchingItemsSorter.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/BasicFetchingStrategy.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/BasicFetchingStrategy.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/DicomResourcesLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/DicomSource.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/DicomStructureSetLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/DicomStructureSetLoader.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/DicomVolumeLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/IFetchingItemsSorter.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/IFetchingStrategy.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/LoadedDicomResources.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/LoaderCache.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/LoaderCache.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/LoaderStateMachine.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/LoaderStateMachine.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/OrthancMultiframeVolumeLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/OrthancMultiframeVolumeLoader.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/OracleScheduler.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h - ${ORTHANC_STONE_ROOT}/Framework/Loaders/SeriesFramesLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/SeriesMetadataLoader.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/SeriesOrderedFrames.cpp - ${ORTHANC_STONE_ROOT}/Framework/Loaders/SeriesThumbnailsLoader.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Messages/ICallable.h - ${ORTHANC_STONE_ROOT}/Framework/Messages/IMessage.h - ${ORTHANC_STONE_ROOT}/Framework/Messages/IMessageEmitter.h - ${ORTHANC_STONE_ROOT}/Framework/Messages/IObservable.cpp - ${ORTHANC_STONE_ROOT}/Framework/Messages/IObservable.h - ${ORTHANC_STONE_ROOT}/Framework/Messages/IObserver.h - ${ORTHANC_STONE_ROOT}/Framework/Messages/ObserverBase.h - - ${ORTHANC_STONE_ROOT}/Framework/Oracle/GetOrthancImageCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/GetOrthancWebViewerJpegCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/HttpCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/OracleCommandBase.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/OrthancRestApiCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/ParseDicomFromFileCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Oracle/ParseDicomFromWadoCommand.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/CairoCompositor.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/CairoCompositor.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Color.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ColorSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ColorTextureSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ColorTextureSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/FloatTextureSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/FloatTextureSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/GrayscaleStyleConfigurator.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/GrayscaleStyleConfigurator.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ICompositor.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ILayerStyleConfigurator.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/InfoPanelSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/InfoPanelSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/IPointerTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ISceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/LookupTableStyleConfigurator.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/LookupTableStyleConfigurator.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/LookupTableTextureSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/LookupTableTextureSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/NullLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PanSceneTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PanSceneTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PointerEvent.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PointerEvent.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PolylineSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/PolylineSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/RotateSceneTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/RotateSceneTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Scene2D.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Scene2D.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ScenePoint2D.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/TextSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/TextSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/TextureBaseSceneLayer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/TextureBaseSceneLayer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ZoomSceneTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/ZoomSceneTracker.h - - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoBaseRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoColorTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoColorTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoFloatTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoFloatTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoInfoPanelRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoInfoPanelRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoLookupTableTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoPolylineRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoPolylineRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoTextRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CairoTextRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CompositorHelper.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/CompositorHelper.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/FixedPointAligner.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/FixedPointAligner.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/ICairoContextProvider.h - - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/AngleMeasureTool.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/AngleMeasureTool.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateAngleMeasureCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateAngleMeasureCommand.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateAngleMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateAngleMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateCircleMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateCircleMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateLineMeasureCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateLineMeasureCommand.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateLineMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateLineMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/CreateSimpleTrackerAdapter.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditAngleMeasureCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditAngleMeasureCommand.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditAngleMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditAngleMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditLineMeasureCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditLineMeasureCommand.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditLineMeasureTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/EditLineMeasureTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/IFlexiblePointerTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/LayerHolder.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/LayerHolder.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/LineMeasureTool.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/LineMeasureTool.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureCommands.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureCommands.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureTool.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureTool.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureToolsToolbox.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureToolsToolbox.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureTrackers.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/MeasureTrackers.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/OneGesturePointerTracker.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/OneGesturePointerTracker.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/PredeclaredTypes.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/UndoStack.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/UndoStack.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/ViewportController.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2DViewport/ViewportController.h - ${ORTHANC_STONE_ROOT}/Framework/StoneEnumerations.cpp - ${ORTHANC_STONE_ROOT}/Framework/StoneException.h - ${ORTHANC_STONE_ROOT}/Framework/StoneInitialization.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/AffineTransform2D.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/AffineTransform2D.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/CoordinateSystem3D.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/CoordinateSystem3D.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomInstanceParameters.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomInstanceParameters.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructure2.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructure2.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructurePolygon2.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructurePolygon2.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSet.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSet.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSet2.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSet2.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSetUtils.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DicomStructureSetUtils.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DisjointDataSet.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DynamicBitmap.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/DynamicBitmap.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/Extent2D.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/Extent2D.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/FiniteProjectiveCamera.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/FiniteProjectiveCamera.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/GenericToolbox.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/GenericToolbox.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/GeometryToolbox.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/GeometryToolbox.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ImageGeometry.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ImageGeometry.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ImageToolbox.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ImageToolbox.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/LinearAlgebra.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/LinearAlgebra.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/PixelTestPatterns.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ShearWarpProjectiveTransform.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ShearWarpProjectiveTransform.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SlicesSorter.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SlicesSorter.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SortedFrames.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SortedFrames.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SubpixelReader.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/SubvoxelReader.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/TextRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/TextRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/UndoRedoStack.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/UndoRedoStack.h - - ${ORTHANC_STONE_ROOT}/Framework/Viewport/IViewport.h - - ${ORTHANC_STONE_ROOT}/Framework/Volumes/IGeometryProvider.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/IVolumeSlicer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/IVolumeSlicer.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/OrientedVolumeBoundingBox.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/OrientedVolumeBoundingBox.h - - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeImageGeometry.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeImageGeometry.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeReslicer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeReslicer.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeSceneLayerSource.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/VolumeSceneLayerSource.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomStructureSetSlicer2.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomStructureSetSlicer2.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImage.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImage.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImage.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImageMPRSlicer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImageMPRSlicer.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImageReslicer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/DicomVolumeImageReslicer.h - ${ORTHANC_STONE_ROOT}/Framework/Volumes/ImageBuffer3D.cpp - ${ORTHANC_STONE_ROOT}/Framework/Volumes/ImageBuffer3D.h - - ${ORTHANC_STONE_ROOT}/Framework/Wrappers/CairoContext.cpp - ${ORTHANC_STONE_ROOT}/Framework/Wrappers/CairoSurface.cpp - - ${PLATFORM_SOURCES} - ${APPLICATIONS_SOURCES} - ${ORTHANC_CORE_SOURCES} - ${ORTHANC_DICOM_SOURCES} - - # Mandatory components - ${CAIRO_SOURCES} - ${FREETYPE_SOURCES} - ${PIXMAN_SOURCES} - - # Optional components - ${SDL_SOURCES} - ${QT_SOURCES} - ${GLEW_SOURCES} - ) - - -if (ENABLE_OPENGL) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/Fonts/OpenGLTextCoordinates.h - ${ORTHANC_STONE_ROOT}/Framework/Fonts/OpenGLTextCoordinates.cpp - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLProgram.h - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLShader.h - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLShader.cpp - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLTexture.h - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/OpenGLTexture.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/OpenGLCompositor.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/OpenGLCompositor.cpp - - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLBasicPolylineRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLColorTextureProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLColorTextureProgram.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLColorTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLColorTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLFloatTextureProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLFloatTextureProgram.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLFloatTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLInfoPanelRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLLinesProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLLinesProgram.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLShaderVersionDirective.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextProgram.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextRenderer.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextRenderer.h - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextureProgram.cpp - ${ORTHANC_STONE_ROOT}/Framework/Scene2D/Internals/OpenGLTextureProgram.h - ) - - if (ENABLE_WASM) - list(APPEND ORTHANC_STONE_SOURCES - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/WebAssemblyOpenGLContext.cpp - ${ORTHANC_STONE_ROOT}/Framework/OpenGL/WebAssemblyOpenGLContext.h - ${ORTHANC_STONE_ROOT}/Framework/Viewport/WebGLViewport.cpp - ${ORTHANC_STONE_ROOT}/Framework/Viewport/WebGLViewportsRegistry.cpp - ) - endif() -endif() - -## -## TEST - Automatically add all ".h" headers to the list of sources -## - -macro(AutodetectHeaderFiles SOURCES_VAR) - set(TMP) - - foreach(f IN LISTS ${SOURCES_VAR}) - get_filename_component(_base ${f} NAME_WE) - get_filename_component(_dir ${f} DIRECTORY) - get_filename_component(_extension ${f} EXT) - set(_header ${_dir}/${_base}.h) - - if ((_extension STREQUAL ".cpp" OR - _extension STREQUAL ".cc" OR - _extension STREQUAL ".h") AND - EXISTS ${_header} AND - NOT IS_DIRECTORY ${_header} AND - NOT IS_SYMLINK ${_header}) - - # Prevent adding the header twice if it is already manually - # specified in the sources - list (FIND SOURCES_VAR ${_header} _index) - if (${_index} EQUAL -1) - list(APPEND TMP ${_header}) - endif() - endif() - endforeach() - - list(APPEND ${SOURCES_VAR} ${TMP}) -endmacro() - - -AutodetectHeaderFiles(ORTHANC_STONE_SOURCES) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/OrthancStoneParameters.cmake --- a/Resources/CMake/OrthancStoneParameters.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - - -##################################################################### -## Select the location of the Orthanc framework -##################################################################### - -include(${CMAKE_CURRENT_LIST_DIR}/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_DEFAULT_VERSION "1.7.2") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -# Parameters of the build -set(STATIC_BUILD OFF CACHE BOOL "Static build of the third-party libraries (necessary for Windows)") -set(ALLOW_DOWNLOADS OFF CACHE BOOL "Allow CMake to download packages") -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc framework (can be \"system\", \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_VERSION "${ORTHANC_FRAMEWORK_DEFAULT_VERSION}" CACHE STRING "Version of the Orthanc framework") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - -# Advanced parameters to fine-tune linking against system libraries -set(ORTHANC_FRAMEWORK_STATIC OFF CACHE BOOL "If linking against the Orthanc framework system library, indicates whether this library was statically linked") -mark_as_advanced(ORTHANC_FRAMEWORK_STATIC) - - - -##################################################################### -## Import the parameters of the Orthanc Framework -##################################################################### - -if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - include(${CMAKE_CURRENT_LIST_DIR}/../Orthanc/CMake/DownloadOrthancFramework.cmake) - include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) - - unset(STANDALONE_BUILD CACHE) - set(STANDALONE_BUILD ON) # Embed DCMTK's dictionaries in static builds - - set(ENABLE_DCMTK OFF) - set(ENABLE_GOOGLE_TEST ON) - set(ENABLE_JPEG ON) - set(ENABLE_OPENSSL_ENGINES ON) - set(ENABLE_PNG ON) - set(ENABLE_SQLITE OFF) - set(ENABLE_ZLIB ON) -endif() - - - -##################################################################### -## CMake parameters tunable by the user -##################################################################### - -# Advanced parameters to fine-tune linking against system libraries -set(USE_SYSTEM_CAIRO ON CACHE BOOL "Use the system version of Cairo") -set(USE_SYSTEM_FREETYPE ON CACHE BOOL "Use the system version of Freetype") -set(USE_SYSTEM_GLEW ON CACHE BOOL "Use the system version of glew (for Windows only)") -set(USE_SYSTEM_PIXMAN ON CACHE BOOL "Use the system version of Pixman") -set(USE_SYSTEM_SDL ON CACHE BOOL "Use the system version of SDL2") - - - -##################################################################### -## Internal CMake parameters to enable the optional subcomponents of -## the Stone of Orthanc -##################################################################### - -set(ENABLE_OPENGL ON CACHE BOOL "Enable support of OpenGL") -set(ENABLE_WASM OFF CACHE INTERNAL "Enable support of WebAssembly") -set(ENABLE_GUIADAPTER OFF CACHE INTERNAL "Enable backward compatibility with the Stone GuiAdapter class") diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/PixmanConfiguration.cmake --- a/Resources/CMake/PixmanConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -if (STATIC_BUILD OR NOT USE_SYSTEM_PIXMAN) - SET(PIXMAN_SOURCES_DIR ${CMAKE_BINARY_DIR}/pixman-0.34.0) - SET(PIXMAN_URL "http://orthanc.osimis.io/ThirdPartyDownloads/pixman-0.34.0.tar.gz") - SET(PIXMAN_MD5 "e80ebae4da01e77f68744319f01d52a3") - - if (IS_DIRECTORY "${PIXMAN_SOURCES_DIR}") - set(FirstRun OFF) - else() - set(FirstRun ON) - endif() - - DownloadPackage(${PIXMAN_MD5} ${PIXMAN_URL} "${PIXMAN_SOURCES_DIR}") - - # Apply a patch for NaCl32: This bypasses the custom implementation of - # "cpuid" that makes use of assembly code leading to "unrecognized - # instruction" when validating ".nexe" files using "ncval" - execute_process( - COMMAND ${PATCH_EXECUTABLE} -p0 -N -i ${CMAKE_CURRENT_LIST_DIR}/PixmanConfiguration.patch - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - - if (Failure AND FirstRun) - message(FATAL_ERROR "Error while patching a file") - endif() - - set(PIXMAN_VERSION_MAJOR 0) - set(PIXMAN_VERSION_MINOR 34) - set(PIXMAN_VERSION_MICRO 0) - configure_file( - ${PIXMAN_SOURCES_DIR}/pixman/pixman-version.h.in - ${PIXMAN_SOURCES_DIR}/pixman/pixman-version.h) - - list(APPEND PIXMAN_SOURCES - ${PIXMAN_SOURCES_DIR}/pixman/pixman-access-accessors.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-access.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-bits-image.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-combine32.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-combine-float.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-conical-gradient.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-edge-accessors.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-edge.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-fast-path.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-filter.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-general.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-glyph.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-gradient-walker.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-image.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-implementation.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-linear-gradient.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-matrix.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-mips.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-mips-dspr2.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-mmx.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-noop.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-ppc.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-radial-gradient.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-region16.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-region32.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-region.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-solid-fill.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-timer.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-trap.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-utils.c - #${PIXMAN_SOURCES_DIR}/pixman/pixman-vmx.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-x86.c - ) - - set(PIXMAN_DEFINITIONS "PACKAGE=\"pixman\"") - - if (CMAKE_SYSTEM_PROCESSOR) - message("Processor: ${CMAKE_SYSTEM_PROCESSOR}") - else() - message("Processor: Not applicable") - endif() - - - ########################## - ## Portable Google NaCl - ########################## - - if (CMAKE_SYSTEM_NAME STREQUAL "PNaCl") - # No hardware acceleration - set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread") - - elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR - CMAKE_SYSTEM_NAME STREQUAL "Android") - ########################## - ## Emscripten (asm.js) - ########################## - - # No threading support - set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};PIXMAN_NO_TLS=1;HAVE_GCC_VECTOR_EXTENSIONS") - - elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") - - ########################## - ## Windows 32 or 64 - ########################## - - if (CMAKE_COMPILER_IS_GNUCXX) - set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_BUILTIN_CLZ;HAVE_FEDIVBYZERO=1;HAVE_FENV_H=1;HAVE_MPROTECT=1;HAVE_FLOAT128;HAVE_POSIX_MEMALIGN;USE_GCC_INLINE_ASM=1;HAVE_GETPAGESIZE=1") - - # The option "-mstackrealign" is necessary to avoid a crash on - # Windows if enabling SSE2. As an alternative, it is possible to - # fully disable hardware acceleration. - # https://bugs.freedesktop.org/show_bug.cgi?id=68300#c4 - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2 -mssse3 -mstackrealign") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -mssse3 -mstackrealign") - endif() - - list(APPEND PIXMAN_SOURCES - ${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c - ) - - if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") - # Only enable MMX on Windows 32 - add_definitions( - -DUSE_X86_MMX=1 - ) - endif() - - add_definitions( - -DUSE_SSE2=1 - -DUSE_SSSE3=1 - ) - - - ########################## - ## Generic x86 processor - ########################## - - elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" OR - CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR - CMAKE_SYSTEM_NAME STREQUAL "NaCl32" OR - CMAKE_SYSTEM_NAME STREQUAL "NaCl64" OR - CMAKE_SYSTEM_NAME STREQUAL "Darwin") - - set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread;HAVE_GCC_VECTOR_EXTENSIONS;HAVE_BUILTIN_CLZ;HAVE_MPROTECT=1;HAVE_FLOAT128;HAVE_POSIX_MEMALIGN;USE_GCC_INLINE_ASM;HAVE_GETPAGESIZE=1") - - if (${CMAKE_SYSTEM_NAME} STREQUAL "NaCl32" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "NaCl64") - # The MMX instructions lead to "unrecognized instruction" when - # validating ".nexe" files using "ncval", disable them - else() - #add_definitions(-DUSE_X86_MMX=1) - endif() - - list(APPEND PIXMAN_SOURCES - ${PIXMAN_SOURCES_DIR}/pixman/pixman-sse2.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-ssse3.c - ) - add_definitions( - -DUSE_SSE2=1 - -DUSE_SSSE3=1 - ) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2 -mssse3") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2 -mssse3") - - - ########################## - ## ARM processor - ########################## - - elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv5te" OR - CMAKE_SYSTEM_PROCESSOR STREQUAL "armv6" OR - CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l" OR - CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a" OR - CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - - set(PIXMAN_DEFINITIONS "${PIXMAN_DEFINITIONS};TLS=__thread") - - if (NEON) - message("Processor with NEON instructions") - list(APPEND PIXMAN_SOURCES - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon-asm.S - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-neon-asm-bilinear.S - ) - add_definitions( - -DUSE_ARM_NEON=1 - ) - elseif() - message("Processor without NEON instructions") - endif() - - add_definitions( - -DUSE_ARM_SIMD=1 - ) - list(APPEND PIXMAN_SOURCES - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm.c - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd-asm.S - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd-asm-scaled.S - ${PIXMAN_SOURCES_DIR}/pixman/pixman-arm-simd.c - ) - - else() - message(FATAL_ERROR "Support your platform here") - endif() - - - include_directories( - ${PIXMAN_SOURCES_DIR}/pixman - ) - - set_property( - SOURCE ${PIXMAN_SOURCES} - PROPERTY COMPILE_DEFINITIONS ${PIXMAN_DEFINITIONS} - ) - -else() - - pkg_search_module(PIXMAN REQUIRED pixman-1) - include_directories(${PIXMAN_INCLUDE_DIRS}) - link_libraries(${PIXMAN_LIBRARIES}) - -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/PixmanConfiguration.patch --- a/Resources/CMake/PixmanConfiguration.patch Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -diff -urEb pixman-0.34.0.orig/pixman/pixman-x86.c pixman-0.34.0/pixman/pixman-x86.c ---- pixman-0.34.0.orig/pixman/pixman-x86.c 2016-07-05 12:46:52.889101224 +0200 -+++ pixman-0.34.0/pixman/pixman-x86.c 2016-07-05 12:47:07.253101808 +0200 -@@ -80,7 +80,7 @@ - static pixman_bool_t - have_cpuid (void) - { --#if _PIXMAN_X86_64 || defined (_MSC_VER) -+#if _PIXMAN_X86_64 || defined (_MSC_VER) || defined(__native_client__) - - return TRUE; - -Only in pixman-0.34.0/pixman: pixman-x86.c~ diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/SdlConfiguration.cmake --- a/Resources/CMake/SdlConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,224 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -if (STATIC_BUILD OR NOT USE_SYSTEM_SDL) - SET(SDL_SOURCES_DIR ${CMAKE_BINARY_DIR}/SDL2-2.0.4) - SET(SDL_URL "http://orthanc.osimis.io/ThirdPartyDownloads/SDL2-2.0.4.tar.gz") - SET(SDL_MD5 "44fc4a023349933e7f5d7a582f7b886e") - DownloadPackage(${SDL_MD5} ${SDL_URL} "${SDL_SOURCES_DIR}") - - include_directories(${SDL_SOURCES_DIR}/include) - - set(TMP "${SDL_SOURCES_DIR}/include/SDL_config_premake.h") - if (NOT EXISTS "${TMP}") - file(WRITE "${TMP}" " -#include \"SDL_platform.h\" -#define HAVE_STDARG_H 1 -#define HAVE_STDDEF_H 1 -#define HAVE_STDINT_H 1 -") - endif() - - # General source files - file(GLOB SDL_SOURCES - ${SDL_SOURCES_DIR}/src/*.c - ${SDL_SOURCES_DIR}/src/atomic/*.c - ${SDL_SOURCES_DIR}/src/audio/*.c - ${SDL_SOURCES_DIR}/src/cpuinfo/*.c - ${SDL_SOURCES_DIR}/src/dynapi/*.c - ${SDL_SOURCES_DIR}/src/events/*.c - ${SDL_SOURCES_DIR}/src/file/*.c - ${SDL_SOURCES_DIR}/src/haptic/*.c - ${SDL_SOURCES_DIR}/src/joystick/*.c - ${SDL_SOURCES_DIR}/src/libm/*.c - ${SDL_SOURCES_DIR}/src/power/*.c - ${SDL_SOURCES_DIR}/src/render/*.c - ${SDL_SOURCES_DIR}/src/stdlib/*.c - ${SDL_SOURCES_DIR}/src/thread/*.c - ${SDL_SOURCES_DIR}/src/timer/*.c - ${SDL_SOURCES_DIR}/src/video/*.c - - ${SDL_SOURCES_DIR}/src/loadso/dummy/*.c - #${SDL_SOURCES_DIR}/src/timer/dummy/*.c - ${SDL_SOURCES_DIR}/src/audio/dummy/*.c - ${SDL_SOURCES_DIR}/src/filesystem/dummy/*.c - ${SDL_SOURCES_DIR}/src/haptic/dummy/*.c - ${SDL_SOURCES_DIR}/src/joystick/dummy/*.c - #${SDL_SOURCES_DIR}/src/main/dummy/*.c - ${SDL_SOURCES_DIR}/src/video/dummy/*.c - ) - - add_definitions( - -DUSING_PREMAKE_CONFIG_H=1 - - -DSDL_AUDIO_DISABLED=1 - -DSDL_AUDIO_DRIVER_DUMMY=1 - -DSDL_FILESYSTEM_DISABLED=1 - -DSDL_FILESYSTEM_DUMMY=1 - -DSDL_FILE_DISABLED=1 - -DSDL_HAPTIC_DISABLED=1 - -DSDL_JOYSTICK_DISABLED=1 - - #-DSDL_THREADS_DISABLED=1 - ) - - if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - file(GLOB TMP - ${SDL_SOURCES_DIR}/src/core/linux/*.c - ${SDL_SOURCES_DIR}/src/loadso/dlopen/*.c - ${SDL_SOURCES_DIR}/src/render/software/*.c - ${SDL_SOURCES_DIR}/src/thread/pthread/*.c - ${SDL_SOURCES_DIR}/src/timer/unix/*.c - ${SDL_SOURCES_DIR}/src/video/x11/*.c - ) - - list(APPEND SDL_SOURCES ${TMP}) - - add_definitions( - -DSDL_LOADSO_DLOPEN=1 - -DSDL_THREAD_PTHREAD=1 - -DSDL_TIMER_UNIX=1 - -DSDL_POWER_DISABLED=1 - - -DSDL_VIDEO_DRIVER_X11=1 - - -DSDL_ASSEMBLY_ROUTINES=1 - -DSDL_THREAD_PTHREAD_RECURSIVE_MUTEX=1 - -DSDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS=1 - -DHAVE_GCC_SYNC_LOCK_TEST_AND_SET=1 - ) - - link_libraries(X11 Xext) - - if (NOT CMAKE_SYSTEM_VERSION STREQUAL "Raspberry") - # Raspberry Pi has no support for OpenGL - file(GLOB TMP - ${SDL_SOURCES_DIR}/src/render/opengl/*.c - ${SDL_SOURCES_DIR}/src/render/opengles2/*.c - ) - - list(APPEND SDL_SOURCES ${TMP}) - - add_definitions( - -DSDL_VIDEO_OPENGL=1 - -DSDL_VIDEO_OPENGL_ES2=1 - -DSDL_VIDEO_RENDER_OGL=1 - -DSDL_VIDEO_RENDER_OGL_ES2=1 - -DSDL_VIDEO_OPENGL_GLX=1 - -DSDL_VIDEO_OPENGL_EGL=1 - ) - endif() - - elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") - file(GLOB TMP - ${SDL_SOURCES_DIR}/src/audio/directsound/*.c - ${SDL_SOURCES_DIR}/src/audio/disk/*.c - ${SDL_SOURCES_DIR}/src/audio/winmm/*.c - ${SDL_SOURCES_DIR}/src/joystick/windows/*.c - ${SDL_SOURCES_DIR}/src/haptic/windows/*.c - ${SDL_SOURCES_DIR}/src/power/windows/*.c - - ${SDL_SOURCES_DIR}/src/main/windows/*.c - ${SDL_SOURCES_DIR}/src/core/windows/*.c - ${SDL_SOURCES_DIR}/src/loadso/windows/*.c - ${SDL_SOURCES_DIR}/src/render/direct3d/*.c - ${SDL_SOURCES_DIR}/src/render/direct3d11/*.c - ${SDL_SOURCES_DIR}/src/render/opengl/*.c - ${SDL_SOURCES_DIR}/src/render/psp/*.c - ${SDL_SOURCES_DIR}/src/render/opengles/*.c - ${SDL_SOURCES_DIR}/src/render/opengles2/*.c - ${SDL_SOURCES_DIR}/src/render/software/*.c - ${SDL_SOURCES_DIR}/src/thread/generic/SDL_syscond.c # Don't include more files from "thread/generic/*.c"! - ${SDL_SOURCES_DIR}/src/thread/windows/*.c - ${SDL_SOURCES_DIR}/src/timer/windows/*.c - ${SDL_SOURCES_DIR}/src/video/windows/*.c - ${SDL_SOURCES_DIR}/src/windows/dlopen/*.c - ) - - list(APPEND SDL_SOURCES ${TMP}) - - # NB: OpenGL ES headers are not available in MinGW-W64 - add_definitions( - -DSDL_LOADSO_WINDOWS=1 - -DSDL_THREAD_WINDOWS=1 - -DSDL_TIMER_WINDOWS=1 - -DSDL_POWER_WINDOWS=1 - - -DSDL_VIDEO_OPENGL=1 - -DSDL_VIDEO_OPENGL_WGL=1 - -DSDL_VIDEO_RENDER_D3D=1 - -DSDL_VIDEO_RENDER_OGL=1 - -DSDL_VIDEO_DRIVER_WINDOWS=1 - ) - - if (MSVC) - add_definitions( - -D__FLTUSED__ - -DHAVE_LIBC=1 - ) - else() - add_definitions( - -DHAVE_GCC_ATOMICS=1 - -DSDL_ASSEMBLY_ROUTINES=1 - ) - endif() - - link_libraries(imm32 winmm version) - - elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") - file(GLOB TMP - ${SDL_SOURCES_DIR}/src/loadso/dlopen/*.c - ${SDL_SOURCES_DIR}/src/render/opengl/*.c - ${SDL_SOURCES_DIR}/src/render/opengles2/*.c - ${SDL_SOURCES_DIR}/src/render/software/*.c - ${SDL_SOURCES_DIR}/src/thread/pthread/*.c - ${SDL_SOURCES_DIR}/src/timer/unix/*.c - ${SDL_SOURCES_DIR}/src/video/cocoa/*.m - ) - - list(APPEND SDL_SOURCES ${TMP}) - - add_definitions( - -DSDL_LOADSO_DLOPEN=1 - -DSDL_THREAD_PTHREAD=1 - -DSDL_TIMER_UNIX=1 - -DSDL_POWER_DISABLED=1 - - -DSDL_VIDEO_DRIVER_COCOA=1 - -DSDL_VIDEO_OPENGL=1 - -DSDL_VIDEO_OPENGL_CGL=1 - -DSDL_VIDEO_RENDER_OGL=1 - - -DSDL_ASSEMBLY_ROUTINES=1 - -DSDL_THREAD_PTHREAD_RECURSIVE_MUTEX=1 - ) - - find_library(CARBON_LIBRARY Carbon) - find_library(COCOA_LIBRARY Cocoa) - find_library(IOKIT_LIBRARY IOKit) - find_library(QUARTZ_LIBRARY QuartzCore) - link_libraries(${CARBON_LIBRARY} ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${QUARTZ_LIBRARY}) - - endif() - -else() - pkg_search_module(SDL2 REQUIRED sdl2) - include_directories(${SDL2_INCLUDE_DIRS}) - link_libraries(${SDL2_LIBRARIES}) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/Version.cmake --- a/Resources/CMake/Version.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -set(ORTHANC_STONE_VERSION "mainline") - -add_definitions( - -DORTHANC_STONE_VERSION="${ORTHANC_STONE_VERSION}" - ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/CMake/cairo-features.h --- a/Resources/CMake/cairo-features.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -#ifndef CAIRO_FEATURES_H -#define CAIRO_FEATURES_H - -#define CAIRO_HAS_GOBJECT_FUNCTIONS 1 -#define CAIRO_HAS_IMAGE_SURFACE 1 -#define CAIRO_HAS_MIME_SURFACE 1 -#define CAIRO_HAS_OBSERVER_SURFACE 1 -#define CAIRO_HAS_RECORDING_SURFACE 1 -#define CAIRO_HAS_USER_FONT 1 - -/*#undef CAIRO_HAS_BEOS_SURFACE */ -/*#undef CAIRO_HAS_COGL_SURFACE */ -/*#undef CAIRO_HAS_DIRECTFB_SURFACE */ -/*#undef CAIRO_HAS_DRM_SURFACE */ -/*#undef CAIRO_HAS_EGL_FUNCTIONS */ -/*#undef CAIRO_HAS_FC_FONT */ -/*#undef CAIRO_HAS_FT_FONT */ -/*#undef CAIRO_HAS_GALLIUM_SURFACE */ -/*#undef CAIRO_HAS_GLESV2_SURFACE */ -/*#undef CAIRO_HAS_GLX_FUNCTIONS */ -/*#undef CAIRO_HAS_GL_SURFACE */ -/*#undef CAIRO_HAS_OS2_SURFACE */ -/*#undef CAIRO_HAS_PDF_SURFACE */ -/*#undef CAIRO_HAS_PNG_FUNCTIONS */ -/*#undef CAIRO_HAS_PS_SURFACE */ -/*#undef CAIRO_HAS_QT_SURFACE */ -/*#undef CAIRO_HAS_QUARTZ_FONT */ -/*#undef CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ -/*#undef CAIRO_HAS_QUARTZ_SURFACE */ -/*#undef CAIRO_HAS_SCRIPT_SURFACE */ -/*#undef CAIRO_HAS_SKIA_SURFACE */ -/*#undef CAIRO_HAS_SVG_SURFACE */ -/*#undef CAIRO_HAS_TEE_SURFACE */ -/*#undef CAIRO_HAS_VG_SURFACE */ -/*#undef CAIRO_HAS_WGL_FUNCTIONS */ -/*#undef CAIRO_HAS_WIN32_FONT */ -/*#undef CAIRO_HAS_WIN32_SURFACE */ -/*#undef CAIRO_HAS_XCB_SHM_FUNCTIONS */ -/*#undef CAIRO_HAS_XCB_SURFACE */ -/*#undef CAIRO_HAS_XLIB_SURFACE */ -/*#undef CAIRO_HAS_XLIB_XCB_FUNCTIONS */ -/*#undef CAIRO_HAS_XLIB_XRENDER_SURFACE */ -/*#undef CAIRO_HAS_XML_SURFACE */ - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/GenerateColormaps.py --- a/Resources/Colormaps/GenerateColormaps.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#!/usr/bin/python - -import array -import matplotlib.pyplot as plt - -def GenerateColormap(name): - colormap = [] - - for gray in range(256): - if name == 'red': - color = (gray / 255.0, 0, 0) - elif name == 'green': - color = (0, gray / 255.0, 0) - elif name == 'blue': - color = (0, 0, gray / 255.0) - else: - color = plt.get_cmap(name) (gray) - - colormap += map(lambda k: int(round(color[k] * 255)), range(3)) - - colormap[0] = 0 - colormap[1] = 0 - colormap[2] = 0 - - return array.array('B', colormap).tostring() - - -for name in [ - 'hot', - 'jet', - 'blue', - 'green', - 'red', -]: - with open('%s.lut' % name, 'w') as f: - f.write(GenerateColormap(name)) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/blue.lut Binary file Resources/Colormaps/blue.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/green.lut Binary file Resources/Colormaps/green.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/hot.lut Binary file Resources/Colormaps/hot.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/jet.lut Binary file Resources/Colormaps/jet.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Colormaps/red.lut Binary file Resources/Colormaps/red.lut has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Computations/ComputeShearOnSlice.py --- a/Resources/Computations/ComputeShearOnSlice.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -#!/usr/bin/python - -from sympy import * -import pprint - -init_printing(use_unicode=True) - - -# Setup "T * S * M_shear" (Equation A.16) - -ex, ey, ew = symbols('ex ey ew') -sx, sy = symbols('sx, sy') -ti, tj = symbols('ti tj') - -T = Matrix([[ 1, 0, 0, ti ], - [ 0, 1, 0, tj ], - [ 0, 0, 1, 0 ], - [ 0, 0, 0, 1 ]]) - -# Equation (A.15), if "sx == sy == f" -S = Matrix([[ sx, 0, 0, 0 ], - [ 0, sy, 0, 0 ], - [ 0, 0, 1, 0 ], - [ 0, 0, 0, 1 ]]) - -# MM_shear, in Equation (A.14) -M = Matrix([[ 1, 0, ex, 0 ], - [ 0, 1, ey, 0 ], - [ 0, 0, 1, 0 ], - [ 0, 0, ew, 1 ]]) - - -x, y, z, w = symbols('x y z w') -p = Matrix([ x, y, z, w ]) - -print("\nT =" % T) -pprint.pprint(T); - -print("\nS =" % T) -pprint.pprint(S); - -print("\nM'_shear =" % T) -pprint.pprint(M); - -print("\nGeneral form of a Lacroute's shear matrix (Equation A.16): T * S * M'_shear =") -pprint.pprint(T * S * M); - -print("\nHence, alternative parametrization:") -a11, a13, a14, a22, a23, a24, a43 = symbols('a11 a13 a14 a22 a23 a24 a43') - -A = Matrix([[ a11, 0, a13, a14 ], - [ 0, a22, a23, a24 ], - [ 0, 0, 1, 0 ], - [ 0, 0, a43, 1 ]]) -pprint.pprint(A); - -v = A * p -v = v.subs(w, 1) - -print("\nAction of Lacroute's shear matrix A on plane z (taking w=1):\n%s\n" % v) - -print('Output x\' = %s\n' % (v[0]/v[3])) -print('Output y\' = %s\n' % (v[1]/v[3])) -print('Output z\' = %s\n' % (v[2]/v[3])) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Computations/ComputeShearParameters.py --- a/Resources/Computations/ComputeShearParameters.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -#!/usr/bin/python - -from sympy import * -import pprint - -init_printing(use_unicode=True) - -s13, s23, s43 = symbols('s13 s23 s43') -x, y, z, w = symbols('x y z w') - -A = Matrix([[ 1, 0, s13, 0 ], - [ 0, 1, s23, 0 ], - [ 0, 0, 1, 0 ], - [ 0, 0, s43, 1 ]]) - -print('\nLacroute\'s shear matrix (A.14) is:') -pprint.pprint(A) - -# At this point, we can write "print(A*p)". However, we don't care -# about the output "z" axis, as it is fixed. So we delete the 3rd row -# of A. - -A.row_del(2) - -p = Matrix([ x, y, z, 1 ]) - -v = A*p -print('\nAction of Lacroute\'s shear matrix on plane z (taking w=1):\n%s\n' % v) - -print('Scaling = %s' % (1/v[2])) -print('Offset X = %s' % (v[0]/v[2]).subs(x, 0)) -print('Offset Y = %s' % (v[1]/v[2]).subs(y, 0)) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Computations/ComputeWarp.py --- a/Resources/Computations/ComputeWarp.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -#!/usr/bin/python - -from sympy import * -from sympy.solvers import solve -import pprint -import sys - -init_printing(use_unicode=True) - - -# Create a test 3D vector using homogeneous coordinates -x, y, z, w = symbols('x y z w') -p = Matrix([ x, y, z, w ]) - - -# Create a shear matrix, and a scale/shift "T * S" transform as in -# Lacroute's thesis (Equation A.16, page 209) -ex, ey, ew = symbols('ex ey ew') -sx, sy, tx, ty = symbols('sx sy tx ty') - -TS = Matrix([[ sx, 0, 0, tx ], - [ 0, sy, 0, ty ], - [ 0, 0, 1, 0 ], - [ 0, 0, 0, 1 ]]) - -pureShear = Matrix([[ 1, 0, ex, 0 ], - [ 0, 1, ey, 0 ], - [ 0, 0, 1, 0 ], - [ 0, 0, ew, 1 ]]) - - -# Create a general warp matrix, that corresponds to "M_warp" in -# Equation (A.17) of Lacroute's thesis: -ww11, ww12, ww13, ww14, ww21, ww22, ww23, ww24, ww31, ww32, ww33, ww34, ww41, ww42, ww43, ww44 = symbols('ww11 ww12 ww13 ww14 ww21 ww22 ww23 ww24 ww31 ww32 ww33 ww34 ww41 ww42 ww43 ww44') - -WW = Matrix([[ ww11, ww12, ww13, ww14 ], - [ ww21, ww22, ww23, ww24 ], - [ ww31, ww32, ww33, ww34 ], - [ ww41, ww43, ww43, ww44 ]]) - - -# Create the matrix of intrinsic parameters of the camera -k11, k22, k14, k24 = symbols('k11 k22 k14 k24') -K = Matrix([[ k11, 0, 0, k14 ], - [ 0, k22, 0, k24 ], - [ 0, 0, 0, 1 ]]) - - -# The full decomposition is: -M_shear = TS * pureShear -M_warp = K * WW * TS.inv() -AA = M_warp * M_shear - -# Check that the central component "M_warp == K * WW * TS.inv()" that -# is the left part of "A" is another general warp matrix (i.e. no -# exception is thrown about incompatible matrix sizes): -M_warp * p - -if (M_warp.cols != 4 or - M_warp.rows != 3): - raise Exception('Invalid matrix size') - - -# We've just shown that "M_warp" is a general 3x4 matrix. Let's call -# it W: -w11, w12, w13, w14, w21, w22, w23, w24, w41, w42, w43, w44 = symbols('w11 w12 w13 w14 w21 w22 w23 w24 w41 w42 w43 w44') - -W = Matrix([[ w11, w12, w13, w14 ], - [ w21, w22, w23, w24 ], - [ w41, w43, w43, w44 ]]) - -# This shows that it is sufficient to study a decomposition of the -# following form: -A = W * M_shear -print('\nA = W * M_shear =') -pprint.pprint(A) - -sys.stdout.write('\nW = ') -pprint.pprint(W) - -sys.stdout.write('\nM_shear = ') -pprint.pprint(M_shear) - - - -# Let's consider one fixed 2D point (i,j) in the intermediate -# image. The 3D points (x,y,z,1) that are mapped to (i,j) must satisfy -# the equation "(i,j) == M_shear * (x,y,z,w)". As "M_shear" is -# invertible, we solve "(x,y,z,w) == inv(M_shear) * (i,j,k,1)". - -i, j, k = symbols('i j k') -l = M_shear.inv() * Matrix([ i, j, k, 1 ]) - -print('\nLocus for points imaged to some fixed (i,j,k,l) point in the intermediate image:') -print('x = %s' % l[0]) -print('y = %s' % l[1]) -print('z = %s' % l[2]) -print('w = %s' % l[3]) - - -# By inspecting the 4 equations above, we see that the locus entirely -# depends upon the "k" value that encodes the Z-axis - -print('\nGlobal effect of the shear-warp transform on this locus:') -q = expand(A * l) -pprint.pprint(q) - -print("\nWe can arbitrarily fix the value of 'k', so let's choose 'k=0':") -pprint.pprint(q.subs(k, 0)) - -print("\nThis gives the warp transform.") -print("QED: line after Equation (A.17) on page 209.\n") diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Computations/IntersectSegmentAndHorizontalLine.py --- a/Resources/Computations/IntersectSegmentAndHorizontalLine.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -from sympy import * - -# Intersection between the 2D line segment (prevX,prevY)-(curX,curY) and the -# horizontal line "y = y0" using homogeneous coordinates - -prevX, prevY, curX, curY, y0 = symbols('prevX prevY curX curY y0') - -p1 = Matrix([prevX, prevY, 1]) -p2 = Matrix([curX, curY, 1]) -l1 = p1.cross(p2) - -h1 = Matrix([0, y0, 1]) -h2 = Matrix([1, y0, 1]) -l2 = h1.cross(h2) - -a = l1.cross(l2) - -#pprint(cse(a/a[2], symbols = symbols('a b'))) -pprint(a / a[2]) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Computations/IntersectSegmentAndVerticalLine.py --- a/Resources/Computations/IntersectSegmentAndVerticalLine.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#!/usr/bin/env python - -from sympy import * - -# Intersection between the 2D line segment (prevX,prevY)-(curX,curY) and the -# vertical line "x = x0" using homogeneous coordinates - -prevX, prevY, curX, curY, x0 = symbols('prevX prevY curX curY x0') - -p1 = Matrix([prevX, prevY, 1]) -p2 = Matrix([curX, curY, 1]) -l1 = p1.cross(p2) - -h1 = Matrix([x0, 0, 1]) -h2 = Matrix([x0, 1, 1]) -l2 = h1.cross(h2) - -a = l1.cross(l2) - -pprint(a / a[2]) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Conventions.txt --- a/Resources/Conventions.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ - -Some notes about the lifetime of objects -======================================== - -Stone applications ------------------- - -A typical Stone application can be split in 3 parts: - -1- The "loaders part" and the associated "IOracle", that communicate - through "IMessage" objects. The lifetime of these objects is - governed by the "IStoneContext". - -2- The "data part" holds the data loaded by the "loaders part". The - related objects must not be aware of the oracle, neither of the - messages. It is up to the user application to store these objects. - -3- The "viewport part" is based upon the "Scene2D" class. - - -Multithreading --------------- - -* Stone makes the hypothesis that its objects live in a single thread. - All the content of the "Framework" folder (with the exception of - the "Oracle" stuff) must not use "boost::thread". - -* The "IOracleCommand" classes represent commands that must be - executed asynchronously from the Stone thread. Their actual - execution is done by the "IOracle". - -* In WebAssembly, the "IOracle" corresponds to the "html5.h" - facilities (notably for the Fetch API). There is no mutex here, as - JavaScript is inherently single-threaded. - -* In plain C++ applications, the "IOracle" corresponds to a FIFO queue - of commands that are executed by a pool of threads. The Stone - context holds a global mutex, that must be properly locked by the - user application, and by the "IOracle" when it sends back messages - to the Stone loaders (cf. class "IMessageEmitter"). - -* Multithreading is thus achieved by defining new oracle commands by - subclassing "IOracleCommand", then by defining a way to execute them - (cf. class "GenericCommandRunner"). - - -References between objects --------------------------- - -* An object allocated on the heap must never store a reference/pointer - to another object. - -* A class designed to be allocated only on the stack can store a - reference/pointer to another object. Here is the list of - such classes: - - - IMessage and its derived classes: All the messages are allocated - on the stack. - - -Pointers --------- - -* As we are targeting C++03 (for VS2008 and LSB compatibility), use - "std::unique_ptr<>" and "boost::shared_ptr<>" (*not* - "std::shared_ptr<>"). We provide an implementation of std::unique_ptr for - pre-C++11 compilers. - -* The fact of transfering the ownership of one object to another must - be tagged by naming the method "Acquire...()", and by providing a - raw pointer. - -* Use "std::unique_ptr<>" if the goal is to internally store a pointer - whose lifetime corresponds to the host object. - -* The use of "boost::weak_ptr<>" should be restricted to - oracle/message handling. - -* The use of "boost::shared_ptr<>" should be minimized to avoid - clutter. The "loaders" and "data parts" objects must however - be created as "boost::shared_ptr<>". - - -Global context --------------- - -* As the global Stone context can be created/destroyed by other - languages than C++, we don't use a "boost:shared_ptr<>". diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Commands/BaseCommands.yml --- a/Resources/Graveyard/Deprecated/Applications/Commands/BaseCommands.yml Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -SelectTool: - target: Application - toolName: string - comment: Selects the current application tool -DownloadDicom: - target: SliceViewerWidget - comment: Downloads the slice currently displayed in the SliceViewerWidget -Export: - target: IWidget - comment: Export the content of the widget \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.cpp --- a/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "NativeStoneApplicationContext.h" -#include "../../Platforms/Generic/OracleWebService.h" - -namespace OrthancStone -{ - void NativeStoneApplicationContext::GlobalMutexLocker::SetCentralWidget( - boost::shared_ptr widget) - { - that_.centralViewport_.SetCentralWidget(widget); - } - - - void NativeStoneApplicationContext::UpdateThread(NativeStoneApplicationContext* that) - { - while (!that->stopped_) - { - { - GlobalMutexLocker locker(*that); - locker.GetCentralViewport().DoAnimation(); - } - - boost::this_thread::sleep(boost::posix_time::milliseconds(that->updateDelayInMs_)); - } - } - - - NativeStoneApplicationContext::NativeStoneApplicationContext() : - stopped_(true), - updateDelayInMs_(100) // By default, 100ms between each refresh of the content - { - srand(static_cast(time(NULL))); - } - - - void NativeStoneApplicationContext::Start() - { - boost::recursive_mutex::scoped_lock lock(globalMutex_); - - if (stopped_ && - centralViewport_.HasAnimation()) - { - stopped_ = false; - updateThread_ = boost::thread(UpdateThread, this); - } - } - - - void NativeStoneApplicationContext::Stop() - { - stopped_ = true; - - if (updateThread_.joinable()) - { - updateThread_.join(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.h --- a/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" -#include "../../Framework/Deprecated/Volumes/ISlicedVolume.h" -#include "../../Framework/Deprecated/Volumes/IVolumeLoader.h" - -#include -#include -#include "../StoneApplicationContext.h" - -namespace OrthancStone -{ - class NativeStoneApplicationContext : public StoneApplicationContext - { - private: - static void UpdateThread(NativeStoneApplicationContext* that); - - boost::recursive_mutex globalMutex_; - Deprecated::WidgetViewport centralViewport_; - boost::thread updateThread_; - bool stopped_; - unsigned int updateDelayInMs_; - - public: - class GlobalMutexLocker: public boost::noncopyable - { - private: - NativeStoneApplicationContext& that_; - boost::recursive_mutex::scoped_lock lock_; - - public: - GlobalMutexLocker(NativeStoneApplicationContext& that) : - that_(that), - lock_(that.globalMutex_) - { - } - - void SetCentralWidget(boost::shared_ptr widget); - - Deprecated::IViewport& GetCentralViewport() - { - return that_.centralViewport_; - } - - void SetUpdateDelay(unsigned int delayInMs) - { - that_.updateDelayInMs_ = delayInMs; - } - }; - - NativeStoneApplicationContext(); - - void Start(); - - void Stop(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.cpp --- a/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,265 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#if ORTHANC_ENABLE_THREADS != 1 -#error this file shall be included only with the ORTHANC_ENABLE_THREADS set to 1 -#endif - -#include "NativeStoneApplicationRunner.h" - -#include "../../Framework/Deprecated/Toolbox/MessagingToolbox.h" -#include "../../Platforms/Generic/OracleWebService.h" -#include "../../Platforms/Generic/OracleDelayedCallExecutor.h" -#include "NativeStoneApplicationContext.h" - -#include -#include -#include -#include -#include - -#include - -namespace OrthancStone -{ - // Anonymous namespace to avoid clashes against other compilation modules - namespace - { - class LogStatusBar : public Deprecated::IStatusBar - { - public: - virtual void ClearMessage() - { - } - - virtual void SetMessage(const std::string& message) - { - LOG(WARNING) << message; - } - }; - } - - int NativeStoneApplicationRunner::Execute(int argc, - char* argv[]) - { - /****************************************************************** - * Initialize all the subcomponents of Orthanc Stone - ******************************************************************/ - - Orthanc::Logging::Initialize(); - Orthanc::Toolbox::InitializeOpenSsl(); - Orthanc::HttpClient::GlobalInitialize(); - - Initialize(); - - /****************************************************************** - * Declare and parse the command-line options of the application - ******************************************************************/ - - boost::program_options::options_description options; - - { // generic options - boost::program_options::options_description generic("Generic options"); - generic.add_options() - ("help", "Display this help and exit") - ("verbose", "Be verbose in logs") - ("orthanc", boost::program_options::value()-> - default_value("http://localhost:8042/"), - "URL to the Orthanc server") - ("username", "Username for the Orthanc server") - ("password", "Password for the Orthanc server") - ("https-verify", boost::program_options::value()-> - default_value(true), "Check HTTPS certificates") - ; - - options.add(generic); - } - - // platform specific options - DeclareCommandLineOptions(options); - - // application specific options - application_->DeclareStartupOptions(options); - - boost::program_options::variables_map parameters; - bool error = false; - - try - { - boost::program_options::store( - boost::program_options::command_line_parser(argc, argv). - options(options).allow_unregistered().run(), parameters); - boost::program_options::notify(parameters); - } - catch (boost::program_options::error& e) - { - LOG(ERROR) << - "Error while parsing the command-line arguments: " << e.what(); - error = true; - } - - - /****************************************************************** - * Configure the application with the command-line parameters - ******************************************************************/ - - if (error || parameters.count("help")) - { - std::cout << std::endl; - - std::cout << options << "\n"; - return error ? -1 : 0; - } - - if (parameters.count("https-verify") && - !parameters["https-verify"].as()) - { - LOG(WARNING) << "Turning off verification of HTTPS certificates (unsafe)"; - Orthanc::HttpClient::ConfigureSsl(false, ""); - } - - LOG(ERROR) << "???????? if (parameters.count(\"verbose\"))"; - if (parameters.count("verbose")) - { - LOG(ERROR) << "parameters.count(\"verbose\") != 0"; - Orthanc::Logging::EnableInfoLevel(true); - LOG(INFO) << "Verbose logs are enabled"; - } - - LOG(ERROR) << "???????? if (parameters.count(\"trace\"))"; - if (parameters.count("trace")) - { - LOG(ERROR) << "parameters.count(\"trace\") != 0"; - Orthanc::Logging::EnableTraceLevel(true); - VLOG(1) << "Trace logs are enabled"; - } - - ParseCommandLineOptions(parameters); - - bool success = true; - try - { - /**************************************************************** - * Initialize the connection to the Orthanc server - ****************************************************************/ - - Orthanc::WebServiceParameters webServiceParameters; - - if (parameters.count("orthanc")) - { - webServiceParameters.SetUrl(parameters["orthanc"].as()); - } - - if (parameters.count("username") && parameters.count("password")) - { - webServiceParameters.SetCredentials(parameters["username"]. - as(), - parameters["password"].as()); - } - - LOG(WARNING) << "URL to the Orthanc REST API: " << - webServiceParameters.GetUrl(); - - { - OrthancPlugins::OrthancHttpConnection orthanc(webServiceParameters); - if (!Deprecated::MessagingToolbox::CheckOrthancVersion(orthanc)) - { - LOG(ERROR) << "Your version of Orthanc is incompatible with Stone of " - << "Orthanc, please upgrade"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - - - /**************************************************************** - * Initialize the application - ****************************************************************/ - - LOG(WARNING) << "Creating the widgets of the application"; - - LogStatusBar statusBar; - - NativeStoneApplicationContext context; - - { - // use multiple threads to execute asynchronous tasks like - // download content - Deprecated::Oracle oracle(6); - oracle.Start(); - - { - boost::shared_ptr webService - (new Deprecated::OracleWebService(oracle, webServiceParameters, context)); - context.SetWebService(webService); - context.SetOrthancBaseUrl(webServiceParameters.GetUrl()); - - Deprecated::OracleDelayedCallExecutor delayedExecutor(oracle, context); - context.SetDelayedCallExecutor(delayedExecutor); - - application_->Initialize(&context, statusBar, parameters); - - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context); - locker.SetCentralWidget(application_->GetCentralWidget()); - locker.GetCentralViewport().SetStatusBar(statusBar); - } - - std::string title = application_->GetTitle(); - if (title.empty()) - { - title = "Stone of Orthanc"; - } - - /**************************************************************** - * Run the application - ****************************************************************/ - - Run(context, title, argc, argv); - - /**************************************************************** - * Finalize the application - ****************************************************************/ - - oracle.Stop(); - } - } - - LOG(WARNING) << "The application is stopping"; - application_->Finalize(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - success = false; - } - - - /****************************************************************** - * Finalize all the subcomponents of Orthanc Stone - ******************************************************************/ - - Finalize(); - Orthanc::HttpClient::GlobalFinalize(); - Orthanc::Toolbox::FinalizeOpenSsl(); - - return (success ? 0 : -1); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.h --- a/Resources/Graveyard/Deprecated/Applications/Generic/NativeStoneApplicationRunner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../IStoneApplication.h" - -#if ORTHANC_ENABLE_THREADS != 1 -#error this file shall be included only with the ORTHANC_ENABLE_THREADS set to 1 -#endif - -namespace OrthancStone -{ - class NativeStoneApplicationContext; - - class NativeStoneApplicationRunner - { - protected: - boost::shared_ptr application_; - - public: - NativeStoneApplicationRunner(boost::shared_ptr application) - : application_(application) - { - } - int Execute(int argc, - char* argv[]); - - virtual void Initialize() = 0; - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) = 0; - virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters) = 0; - - virtual void Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]) = 0; - virtual void Finalize() = 0; - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Generic/Scene2DInteractor.h --- a/Resources/Graveyard/Deprecated/Applications/Generic/Scene2DInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "../../Framework/Scene2D/PointerEvent.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -//#include "../../Framework/Scene2D/Internals/CompositorHelper.h" -#include "GuiAdapter.h" - - -namespace OrthancStone -{ - - class Scene2DInteractor - { - protected: - boost::shared_ptr viewportController_; -// boost::shared_ptr compositor_; - - public: - Scene2DInteractor(boost::shared_ptr viewportController) : - viewportController_(viewportController) - {} - -// void SetCompositor(boost::shared_ptr compositor) -// { -// compositor_ = compositor; -// } - - virtual bool OnMouseEvent(const GuiAdapterMouseEvent& guiEvent, const PointerEvent& pointerEvent) = 0; // returns true if it has handled the event - virtual bool OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) = 0; // returns true if it has handled the event - virtual bool OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) = 0; // returns true if it has handled the event - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/IStoneApplication.h --- a/Resources/Graveyard/Deprecated/Applications/IStoneApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "StoneApplicationContext.h" -#include "../Framework/Deprecated/Viewport/WidgetViewport.h" - -#include -#include - -namespace OrthancStone -{ -#if ORTHANC_ENABLE_QT==1 - class QStoneMainWindow; -#endif - - // a StoneApplication is an application that can actually be executed - // in multiple environments. i.e: it can run natively integrated in a QtApplication - // or it can be executed as part of a WebPage when compiled into WebAssembly. - class IStoneApplication : public boost::noncopyable - { - protected: - StoneApplicationContext* context_; - - public: - virtual ~IStoneApplication() - { - } - - virtual void DeclareStartupOptions(boost::program_options::options_description& options) = 0; - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) = 0; - - /** - This method is meant to process messages received from the outside world (i.e. GUI) - */ - virtual void HandleSerializedMessage(const char* data) = 0; - -#if ORTHANC_ENABLE_WASM==1 - virtual void InitializeWasm() {} // specific initialization when the app is running in WebAssembly. This is called after the other Initialize() -#endif -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow() = 0; -#endif - - virtual std::string GetTitle() const = 0; - - virtual void SetCentralWidget(boost::shared_ptr widget) = 0; - - virtual boost::shared_ptr GetCentralWidget() = 0; - - virtual void Finalize() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.cpp --- a/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,238 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "QCairoWidget.h" - -#include -#include - -#include - - -QCairoWidget::StoneObserver::StoneObserver(QCairoWidget& that, - Deprecated::IViewport& viewport, - OrthancStone::MessageBroker& broker) : - OrthancStone::IObserver(broker), - that_(that) -{ - // get notified each time the content of the central viewport changes - viewport.RegisterObserverCallback( - new OrthancStone::Callable - (*this, &StoneObserver::OnViewportChanged)); -} - - -QCairoWidget::QCairoWidget(QWidget *parent) : - QWidget(parent), - context_(NULL) -{ - setFocusPolicy(Qt::StrongFocus); // catch keyPressEvents -} - - -void QCairoWidget::SetContext(OrthancStone::NativeStoneApplicationContext& context) -{ - context_ = &context; - - { - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - observer_.reset(new StoneObserver(*this, - locker.GetCentralViewport(), - locker.GetMessageBroker())); - } -} - - -void QCairoWidget::paintEvent(QPaintEvent* /*event*/) -{ - QPainter painter(this); - - if (image_.get() != NULL && - context_ != NULL) - { - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - Deprecated::IViewport& viewport = locker.GetCentralViewport(); - Orthanc::ImageAccessor a; - surface_.GetWriteableAccessor(a); - viewport.Render(a); - painter.drawImage(0, 0, *image_); - } - else - { - painter.fillRect(rect(), Qt::red); - } -} - -OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event) -{ - Qt::KeyboardModifiers qtModifiers = event->modifiers(); - int stoneModifiers = static_cast(OrthancStone::KeyboardModifiers_None); - if ((qtModifiers & Qt::AltModifier) != 0) - { - stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Alt); - } - if ((qtModifiers & Qt::ControlModifier) != 0) - { - stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Control); - } - if ((qtModifiers & Qt::ShiftModifier) != 0) - { - stoneModifiers |= static_cast(OrthancStone::KeyboardModifiers_Shift); - } - return static_cast(stoneModifiers); -} - -void QCairoWidget::mousePressEvent(QMouseEvent* event) -{ - OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); - - OrthancStone::MouseButton button; - - switch (event->button()) - { - case Qt::LeftButton: - button = OrthancStone::MouseButton_Left; - break; - - case Qt::RightButton: - button = OrthancStone::MouseButton_Right; - break; - - case Qt::MiddleButton: - button = OrthancStone::MouseButton_Middle; - break; - - default: - return; // Unsupported button - } - - { - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - locker.GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers, std::vector()); - } -} - - -void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) -{ - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - locker.GetCentralViewport().MouseLeave(); -} - - -void QCairoWidget::mouseMoveEvent(QMouseEvent* event) -{ - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - locker.GetCentralViewport().MouseMove(event->pos().x(), event->pos().y(), std::vector()); -} - - -void QCairoWidget::wheelEvent(QWheelEvent * event) -{ - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - - OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); - - if (event->orientation() == Qt::Vertical) - { - if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions - { - locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); - } - else - { - locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); - } - } -} - -void QCairoWidget::keyPressEvent(QKeyEvent *event) -{ - using namespace OrthancStone; - - OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); - - OrthancStone::KeyboardKeys keyType = OrthancStone::KeyboardKeys_Generic; - char keyChar = event->text()[0].toLatin1(); - -#define CASE_QT_KEY_TO_ORTHANC(qt, o) case qt: keyType = o; break; - if (keyChar == 0) - { - switch (event->key()) - { - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Up, KeyboardKeys_Up); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Down, KeyboardKeys_Down); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Left, KeyboardKeys_Left); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Right, KeyboardKeys_Right); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F1, KeyboardKeys_F1); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F2, KeyboardKeys_F2); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F3, KeyboardKeys_F3); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F4, KeyboardKeys_F4); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F5, KeyboardKeys_F5); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F6, KeyboardKeys_F6); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F7, KeyboardKeys_F7); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F8, KeyboardKeys_F8); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F9, KeyboardKeys_F9); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F10, KeyboardKeys_F10); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F11, KeyboardKeys_F11); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_F12, KeyboardKeys_F12); - default: - break; - } - } - else if (keyChar == 127) - { - switch (event->key()) - { - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Delete, KeyboardKeys_Delete); - CASE_QT_KEY_TO_ORTHANC(Qt::Key_Backspace, KeyboardKeys_Backspace); - default: - break; - } - } - - { - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - locker.GetCentralViewport().KeyPressed(keyType, keyChar, stoneModifiers); - } -} - - -void QCairoWidget::resizeEvent(QResizeEvent* event) -{ - grabGesture(Qt::PanGesture); - QWidget::resizeEvent(event); - - if (event) - { - surface_.SetSize(event->size().width(), event->size().height(), true); - - image_.reset(new QImage(reinterpret_cast(surface_.GetBuffer()), - event->size().width(), - event->size().height(), - surface_.GetPitch(), - QImage::Format_RGB32)); - - { - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - locker.GetCentralViewport().SetSize(event->size().width(), event->size().height()); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.h --- a/Resources/Graveyard/Deprecated/Applications/Qt/QCairoWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../../Applications/Generic/NativeStoneApplicationContext.h" -#include "../../Framework/Wrappers/CairoSurface.h" -#include "../../Framework/Deprecated/Widgets/IWidget.h" - -#include -#include -#include - -class QCairoWidget : public QWidget -{ - Q_OBJECT - -private: - class StoneObserver : public OrthancStone::IObserver - { - private: - QCairoWidget& that_; - - public: - StoneObserver(QCairoWidget& that, - Deprecated::IViewport& viewport, - OrthancStone::MessageBroker& broker); - - void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) - { - that_.OnViewportChanged(); - } - }; - - std::unique_ptr image_; - OrthancStone::CairoSurface surface_; - OrthancStone::NativeStoneApplicationContext* context_; - std::unique_ptr observer_; - -protected: - virtual void paintEvent(QPaintEvent *event); - - virtual void resizeEvent(QResizeEvent *event); - - virtual void mouseMoveEvent(QMouseEvent *event); - - virtual void mousePressEvent(QMouseEvent *event); - - virtual void mouseReleaseEvent(QMouseEvent *event); - - virtual void wheelEvent(QWheelEvent *event); - - virtual void keyPressEvent(QKeyEvent *event); - -public: - explicit QCairoWidget(QWidget *parent); - - void SetContext(OrthancStone::NativeStoneApplicationContext& context); - - void OnViewportChanged() - { - update(); // schedule a repaint (handled by Qt) - emit ContentChanged(); - } - -signals: - void ContentChanged(); - -public slots: - -}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.cpp --- a/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "QStoneMainWindow.h" - -namespace OrthancStone -{ - - QStoneMainWindow::QStoneMainWindow(NativeStoneApplicationContext& context, - QWidget *parent) : - QMainWindow(parent), - context_(context), - cairoCentralWidget_(NULL) - { - } - - void QStoneMainWindow::SetCentralStoneWidget(QCairoWidget& centralWidget) - { - cairoCentralWidget_ = ¢ralWidget; - cairoCentralWidget_->SetContext(context_); - } - - QStoneMainWindow::~QStoneMainWindow() - { - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.h --- a/Resources/Graveyard/Deprecated/Applications/Qt/QStoneMainWindow.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include - -#include "QCairoWidget.h" -#include "../Generic/NativeStoneApplicationContext.h" - -namespace OrthancStone -{ - class QStoneMainWindow : public QMainWindow - { - Q_OBJECT - - private: - OrthancStone::NativeStoneApplicationContext& context_; - QCairoWidget *cairoCentralWidget_; - - protected: // you must inherit this class - QStoneMainWindow(NativeStoneApplicationContext& context, QWidget *parent = 0); - void SetCentralStoneWidget(QCairoWidget& centralWidget); - - public: - virtual ~QStoneMainWindow(); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.cpp --- a/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#if ORTHANC_ENABLE_QT != 1 -#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 -#endif - -#include "QtStoneApplicationRunner.h" -#include -#include - -#include "../../Framework/Deprecated/Toolbox/MessagingToolbox.h" - -#include -#include -#include -#include -#include "../../Platforms/Generic/OracleWebService.h" - - -namespace OrthancStone -{ - void QtStoneApplicationRunner::Initialize() - { - } - - void QtStoneApplicationRunner::DeclareCommandLineOptions(boost::program_options::options_description& options) - { - } - - void QtStoneApplicationRunner::Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]) - { - context.Start(); - - QApplication qtApplication(argc, argv); - window_.reset(application_.CreateQtMainWindow()); - - window_->show(); - qtApplication.exec(); - - context.Stop(); - } - - void QtStoneApplicationRunner::Finalize() - { - } - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.h --- a/Resources/Graveyard/Deprecated/Applications/Qt/QtStoneApplicationRunner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Generic/NativeStoneApplicationRunner.h" -#include "QStoneMainWindow.h" - -#if ORTHANC_ENABLE_QT != 1 -#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 -#endif - -namespace OrthancStone -{ - class QtStoneApplicationRunner : public NativeStoneApplicationRunner - { - protected: - std::unique_ptr window_; - - public: - QtStoneApplicationRunner(MessageBroker& broker, - IStoneApplication& application) - : NativeStoneApplicationRunner(broker, application) - { - } - - - virtual void Initialize(); - - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options); - virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters) {} - virtual void Run(NativeStoneApplicationContext& context, const std::string& title, int argc, char* argv[]); - virtual void Finalize(); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/BasicPetCtFusionApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/BasicPetCtFusionApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleInteractor.h" - -#include - -namespace OrthancStone -{ - namespace Samples - { - class BasicPetCtFusionApplication : public SampleApplicationBase - { - private: - class Interactor : public SampleInteractor - { - public: - static void SetStyle(LayeredSceneWidget& widget, - bool ct, - bool pet) - { - if (ct) - { - RenderStyle style; - style.windowing_ = ImageWindowing_Bone; - widget.SetLayerStyle(0, style); - } - else - { - RenderStyle style; - style.visible_ = false; - widget.SetLayerStyle(0, style); - } - - if (ct && pet) - { - RenderStyle style; - style.applyLut_ = true; - style.alpha_ = 0.5; - widget.SetLayerStyle(1, style); - } - else if (pet) - { - RenderStyle style; - style.applyLut_ = true; - widget.SetLayerStyle(1, style); - } - else - { - RenderStyle style; - style.visible_ = false; - widget.SetLayerStyle(1, style); - } - } - - - static bool IsVisible(LayeredSceneWidget& widget, - size_t layer) - { - RenderStyle style = widget.GetLayerStyle(layer); - return style.visible_; - } - - - static void ToggleInterpolation(LayeredSceneWidget& widget, - size_t layer) - { - RenderStyle style = widget.GetLayerStyle(layer); - - if (style.interpolation_ == ImageInterpolation_Bilinear) - { - style.interpolation_ = ImageInterpolation_Nearest; - } - else - { - style.interpolation_ = ImageInterpolation_Bilinear; - } - - widget.SetLayerStyle(layer, style); - } - - - Interactor(VolumeImage& volume, - VolumeProjection projection, - bool reverse) : - SampleInteractor(volume, projection, reverse) - { - } - - - virtual void KeyPressed(WorldSceneWidget& widget, - char key, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - LayeredSceneWidget& layered = dynamic_cast(widget); - - switch (key) - { - case 'c': - // Toggle the visibility of the CT layer - SetStyle(layered, !IsVisible(layered, 0), IsVisible(layered, 1)); - break; - - case 'p': - // Toggle the visibility of the PET layer - SetStyle(layered, IsVisible(layered, 0), !IsVisible(layered, 1)); - break; - - case 'i': - { - // Toggle on/off the interpolation - ToggleInterpolation(layered, 0); - ToggleInterpolation(layered, 1); - break; - } - - default: - break; - } - } - }; - - - public: - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("ct", boost::program_options::value(), - "Orthanc ID of the CT series") - ("pet", boost::program_options::value(), - "Orthanc ID of the PET series") - ("threads", boost::program_options::value()->default_value(3), - "Number of download threads for the CT series") - ; - - options.add(generic); - } - - virtual void Initialize(BasicApplicationContext& context, - IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - if (parameters.count("ct") != 1 || - parameters.count("pet") != 1) - { - LOG(ERROR) << "The series ID is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string ct = parameters["ct"].as(); - std::string pet = parameters["pet"].as(); - unsigned int threads = parameters["threads"].as(); - - VolumeImage& ctVolume = context.AddSeriesVolume(ct, true /* progressive download */, threads); - VolumeImage& petVolume = context.AddSeriesVolume(pet, true /* progressive download */, 1); - - // Take the PET volume as the reference for the slices - std::unique_ptr interactor(new Interactor(petVolume, VolumeProjection_Axial, false /* don't reverse normal */)); - - std::unique_ptr widget(new LayeredSceneWidget); - widget->AddLayer(new VolumeImage::LayerFactory(ctVolume)); - widget->AddLayer(new VolumeImage::LayerFactory(petVolume)); - widget->SetSlice(interactor->GetCursor().GetCurrentSlice()); - widget->SetInteractor(*interactor); - - Interactor::SetStyle(*widget, true, true); // Initially, show both CT and PET layers - - context.AddInteractor(interactor.release()); - context.SetCentralWidget(widget.release()); - - statusBar.SetMessage("Use the key \"t\" to toggle the fullscreen mode"); - statusBar.SetMessage("Use the key \"c\" to show/hide the CT layer"); - statusBar.SetMessage("Use the key \"p\" to show/hide the PET layer"); - statusBar.SetMessage("Use the key \"i\" to toggle the smoothing of the images"); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,292 +0,0 @@ -# Usage (Linux): -# to build the WASM samples -# source ~/Downloads/emsdk/emsdk_env.sh && cmake -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc -DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON -# to build the Qt samples - -cmake_minimum_required(VERSION 2.8.3) -project(OrthancStone) - -include(../../../Resources/CMake/OrthancStoneParameters.cmake) - -set(ENABLE_STONE_DEPRECATED ON) # Need deprecated classes for these samples -set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON) - -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -set(ORTHANC_STONE_APPLICATION_RESOURCES - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -if (OPENSSL_NO_CAPIENG) -add_definitions(-DOPENSSL_NO_CAPIENG=1) -endif() - - -# the following block has been borrowed from orthanc/**/Compiler.cmake -if (MSVC_MULTIPLE_PROCESSES) -# "If you omit the processMax argument in the /MP option, the -# compiler obtains the number of effective processors from the -# operating system, and then creates one process per effective -# processor" -# https://blog.kitware.com/cmake-building-with-all-your-cores/ -# https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") -endif() - -#set(ENABLE_DCMTK ON) - -set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") -set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") -set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") - -if (ENABLE_WASM) - ##################################################################### - ## Configuration of the Emscripten compiler for WebAssembly target - ##################################################################### - - set(WASM_FLAGS "-s WASM=1") - set(WASM_FLAGS "${WASM_FLAGS} -s STRICT=1") # drops support for all deprecated build options - set(WASM_FLAGS "${WASM_FLAGS} -s FILESYSTEM=1") # if we don't include it, gen_uuid.c fails to build because srand, getpid(), ... are not defined - set(WASM_FLAGS "${WASM_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0") # actually enable exception catching - set(WASM_FLAGS "${WASM_FLAGS} -s ERROR_ON_MISSING_LIBRARIES=1") - - if (CMAKE_BUILD_TYPE MATCHES DEBUG) - set(WASM_FLAGS "${WASM_FLAGS} -g4") # generate debug information - set(WASM_FLAGS "${WASM_FLAGS} -s ASSERTIONS=2") # more runtime checks - else() - set(WASM_FLAGS "${WASM_FLAGS} -Os") # optimize for web (speed and size) - endif() - - set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS}") # not always clear which flags are for the compiler and which one are for the linker -> pass them all to the linker too - # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Applications/Samples/samples-library.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"'") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_STACK=128000000") - - add_definitions(-DORTHANC_ENABLE_WASM=1) - set(ORTHANC_SANDBOXED ON) - -elseif (ENABLE_QT OR ENABLE_SDL) - - set(ENABLE_NATIVE ON) - set(ORTHANC_SANDBOXED OFF) - set(ENABLE_CRYPTO_OPTIONS ON) - set(ENABLE_GOOGLE_TEST ON) - set(ENABLE_WEB_CLIENT ON) - -else() - set(ENABLE_NATIVE ON) - set(ENABLE_OPENGL OFF) - -endif() - - -##################################################################### -## Configuration for Orthanc -##################################################################### - -# include(../../Resources/CMake/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.4.1") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - -add_definitions( - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - ) - - -##################################################################### -## Build a static library containing the Orthanc Stone framework -##################################################################### - - -LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) - -include(../../../Resources/CMake/OrthancStoneConfiguration.cmake) - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - -##################################################################### -## Build all the sample applications -##################################################################### - -include_directories(${ORTHANC_STONE_ROOT}) - -# files common to all samples -list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleInteractor.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleApplicationBase.h - ) - -if (ENABLE_QT) - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp - ) - - ORTHANC_QT_WRAP_UI(SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui - ) - - ORTHANC_QT_WRAP_CPP(SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Qt/QCairoWidget.h - ${ORTHANC_STONE_ROOT}/Applications/Qt/QStoneMainWindow.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindow.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h - ) -endif() - -if (ENABLE_NATIVE) - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleMainNative.cpp - ) - -elseif (ENABLE_WASM) - - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SampleMainWasm.cpp - ${STONE_WASM_SOURCES} - ) -endif() - - -macro(BuildSingleFileSample Target Header Sample) - add_executable(${Target} - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/${Header} - ${SAMPLE_APPLICATIONS_SOURCES} - ) - set_target_properties(${Target} PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=${Sample}) - target_link_libraries(${Target} OrthancStone) -endmacro() - - -if (ENABLE_SDL) - #BuildSingleFileSample(OrthancStoneEmpty EmptyApplication.h 1) - #BuildSingleFileSample(OrthancStoneTestPattern TestPatternApplication.h 2) - BuildSingleFileSample(OrthancStoneSingleFrame SingleFrameApplication.h 3) - #BuildSingleFileSample(OrthancStoneSingleVolume SingleVolumeApplication.h 4) - #BuildSingleFileSample(OrthancStoneBasicPetCtFusion 5) - #BuildSingleFileSample(OrthancStoneSynchronizedSeries 6) - #BuildSingleFileSample(OrthancStoneLayoutPetCtFusion 7) - BuildSingleFileSample(OrthancStoneSimpleViewerSingleFile SimpleViewerApplicationSingleFile.h 8) # we keep that one just as a sample before we convert another sample to this pattern - BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) -endif() - -##### SimpleViewer sample (Qt and WASM only) ####### - -if (ENABLE_QT OR ENABLE_WASM) - - if (ENABLE_QT) - list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp - ) - - ORTHANC_QT_WRAP_UI(SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui - ) - - ORTHANC_QT_WRAP_CPP(SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h - ) - -elseif (ENABLE_WASM) - list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h - ${STONE_WASM_SOURCES} - ) - endif() - - add_executable(OrthancStoneSimpleViewer - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h - ${SIMPLE_VIEWER_APPLICATION_SOURCES} - ) - target_link_libraries(OrthancStoneSimpleViewer OrthancStone) - - BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) -endif() - -##################################################################### -## Build the unit tests -##################################################################### - -if (ENABLE_NATIVE) - add_executable(UnitTests - ${GOOGLE_TEST_SOURCES} - ${ORTHANC_STONE_ROOT}/UnitTestsSources/GenericToolboxTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/ImageToolboxTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/PixelTestPatternsTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStrategy.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStructureSet.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp - ) - - target_link_libraries(UnitTests OrthancStone) - - add_custom_command( - TARGET UnitTests - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - "${ORTHANC_STONE_ROOT}/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" - "$/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" - ) - -endif() - -##################################################################### -## Generate the documentation if Doxygen is present -##################################################################### - -find_package(Doxygen) -if (DOXYGEN_FOUND) - configure_file( - ${ORTHANC_STONE_ROOT}/Resources/OrthancStone.doxygen - ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen - @ONLY) - - add_custom_target(doc - ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen - COMMENT "Generating documentation with Doxygen" VERBATIM - ) -else() - message("Doxygen not found. The documentation will not be built.") -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt.old --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/CMakeLists.txt.old Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,248 +0,0 @@ -# Usage: see README file - -cmake_minimum_required(VERSION 2.8.3) - -# Automatically link Qt executables to qtmain target on Windows -# ("OLD" == do not link) -if(POLICY CMP0020) - cmake_policy(SET CMP0020 OLD) -endif() - -# Only interpret if() arguments as variables or keywords when unquoted. -# NEW = do NOT dereference *quoted* variables -if(POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() - -project(OrthancStone) - -include(../../Resources/CMake/OrthancStoneParameters.cmake) - -#set(ENABLE_DCMTK ON) - -set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") -set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") -set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") - -# TODO: replace or compute STONE_SOURCES_DIR from CMAKE_CURRENT_LIST_FILE - -if (ENABLE_WASM) - ##################################################################### - ## Configuration of the Emscripten compiler for WebAssembly target - ##################################################################### - - set(WASM_FLAGS "-s WASM=1 -O0 -g0") - message("*****************************************************************************") - message("WARNING: optimizations are disabled in emcc!!! Enable them for production use") - message("*****************************************************************************") - set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") - - # Handling of memory - #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") # Resize - #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") # 512MB - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=536870912 -s TOTAL_STACK=128000000") # 512MB + resize - #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=1073741824") # 1GB + resize - - # To debug exceptions - #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DEMANGLE_SUPPORT=1 -s ASSERTIONS=2") - - add_definitions(-DORTHANC_ENABLE_WASM=1) - set(ORTHANC_SANDBOXED ON) - -elseif (ENABLE_QT OR ENABLE_SDL) - - set(ENABLE_NATIVE ON) - set(ORTHANC_SANDBOXED OFF) - set(ENABLE_CRYPTO_OPTIONS ON) - set(ENABLE_GOOGLE_TEST ON) - set(ENABLE_WEB_CLIENT ON) - -endif() - -##################################################################### -## Configuration for Orthanc -##################################################################### - -# include(../../Resources/CMake/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.4.1") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - -##################################################################### -## Build a static library containing the Orthanc Stone framework -##################################################################### - -LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) - -include(../../Resources/CMake/OrthancStoneConfiguration.cmake) - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - -##################################################################### -## Build all the sample applications -##################################################################### - -include_directories(${ORTHANC_STONE_ROOT}) - -# files common to all samples -list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleInteractor.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleApplicationBase.h - ) - -if (ENABLE_QT) - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleQtApplicationRunner.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.cpp - ) - - ORTHANC_QT_WRAP_UI(SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.ui - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.ui - ) - - ORTHANC_QT_WRAP_CPP(SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Qt/QCairoWidget.h - ${ORTHANC_STONE_ROOT}/Applications/Qt/QStoneMainWindow.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindow.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/Qt/SampleMainWindowWithButtons.h - ) -endif() - -if (ENABLE_NATIVE) - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleMainNative.cpp - ) - -elseif (ENABLE_WASM) - - list(APPEND SAMPLE_APPLICATIONS_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleMainWasm.cpp - ${STONE_WASM_SOURCES} - ) -endif() - - -macro(BuildSingleFileSample Target Header Sample) - add_executable(${Target} - ${ORTHANC_STONE_ROOT}/Applications/Samples/${Header} - ${SAMPLE_APPLICATIONS_SOURCES} - ) - set_target_properties(${Target} PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=${Sample}) - target_link_libraries(${Target} OrthancStone) - - if (ENABLE_QT AND (CMAKE_SYSTEM_NAME STREQUAL "Windows")) - message("(ENABLE_QT and (CMAKE_SYSTEM_NAME matches \"Windows\")) is true") - add_custom_command( - TARGET ${Target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $ - ) - endif() -endmacro() - -#BuildSingleFileSample(OrthancStoneEmpty EmptyApplication.h 1) -#BuildSingleFileSample(OrthancStoneTestPattern TestPatternApplication.h 2) -BuildSingleFileSample(OrthancStoneSingleFrame SingleFrameApplication.h 3) -#BuildSingleFileSample(OrthancStoneSingleVolume SingleVolumeApplication.h 4) -#BuildSingleFileSample(OrthancStoneBasicPetCtFusion 5) -#BuildSingleFileSample(OrthancStoneSynchronizedSeries 6) -#BuildSingleFileSample(OrthancStoneLayoutPetCtFusion 7) -BuildSingleFileSample(OrthancStoneSimpleViewerSingleFile SimpleViewerApplicationSingleFile.h 8) # we keep that one just as a sample before we convert another sample to this pattern -BuildSingleFileSample(OrthancStoneSingleFrameEditor SingleFrameEditorApplication.h 9) - -##### SimpleViewer sample (Qt and WASM only) ####### - -if (ENABLE_QT OR ENABLE_WASM) - - # GenerateCodeFromFlatBufferSchema("${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ApplicationCommands.fbs") - - list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES ${FLATC_AUTOGENERATED_SOURCES}) - message(STATUS "SIMPLE_VIEWER_APPLICATION_SOURCES = ${SIMPLE_VIEWER_APPLICATION_SOURCES}") - message(STATUS "FLATC_AUTOGENERATED_SOURCES = ${FLATC_AUTOGENERATED_SOURCES}") - - if (ENABLE_QT) - list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.ui - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/mainQt.cpp - ) - - ORTHANC_QT_WRAP_UI(SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.ui - ) - - ORTHANC_QT_WRAP_CPP(SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Qt/SimpleViewerMainWindow.h - ) - -elseif (ENABLE_WASM) - list(APPEND SIMPLE_VIEWER_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Wasm/mainWasm.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp - ${STONE_WASM_SOURCES} - ) - endif() - - add_executable(OrthancStoneSimpleViewer - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/SimpleViewerApplication.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/ThumbnailInteractor.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/MainWidgetInteractor.cpp - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/AppStatus.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/SimpleViewer/Messages.h - ${SIMPLE_VIEWER_APPLICATION_SOURCES} - ) - target_link_libraries(OrthancStoneSimpleViewer OrthancStone) - -endif() - -##################################################################### -## Build the unit tests -##################################################################### - -if (ENABLE_NATIVE) - add_executable(UnitTests - ${GOOGLE_TEST_SOURCES} - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestExceptions.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp - ) - - target_link_libraries(UnitTests OrthancStone) -endif() - -##################################################################### -## Generate the documentation if Doxygen is present -##################################################################### - -find_package(Doxygen) -if (DOXYGEN_FOUND) - configure_file( - ${ORTHANC_STONE_ROOT}/Resources/OrthancStone.doxygen - ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen - @ONLY) - - add_custom_target(doc - ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/OrthancStone.doxygen - COMMENT "Generating documentation with Doxygen" VERBATIM - ) -else() - message("Doxygen not found. The documentation will not be built.") -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/EmptyApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/EmptyApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Widgets/EmptyWidget.h" - -namespace OrthancStone -{ - namespace Samples - { - class EmptyApplication : public SampleApplicationBase - { - public: - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("red", boost::program_options::value()->default_value(255), "Background color: red channel") - ("green", boost::program_options::value()->default_value(0), "Background color: green channel") - ("blue", boost::program_options::value()->default_value(0), "Background color: blue channel") - ; - - options.add(generic); - } - - virtual void Initialize(IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - int red = parameters["red"].as(); - int green = parameters["green"].as(); - int blue = parameters["blue"].as(); - - context_->SetCentralWidget(new EmptyWidget(red, green, blue)); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/LayoutPetCtFusionApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/LayoutPetCtFusionApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,398 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleInteractor.h" - -#include "../../../Framework/Layers/ReferenceLineFactory.h" -#include "../../../Framework/Layers/DicomStructureSetSlicer.h" -#include "../../../Framework/Widgets/LayoutWidget.h" - -#include - -namespace OrthancStone -{ - namespace Samples - { - class LayoutPetCtFusionApplication : - public SampleApplicationBase, - public LayeredSceneWidget::ISliceObserver, - public WorldSceneWidget::IWorldObserver - { - private: - class Interactor : public SampleInteractor - { - private: - LayoutPetCtFusionApplication& that_; - - public: - Interactor(LayoutPetCtFusionApplication& that, - VolumeImage& volume, - VolumeProjection projection, - bool reverse) : - SampleInteractor(volume, projection, reverse), - that_(that) - { - } - - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const SliceGeometry& slice, - const ViewportGeometry& view, - MouseButton button, - double x, - double y, - IStatusBar* statusBar) - { - if (button == MouseButton_Left) - { - // Center the sibling views over the clicked point - Vector p = slice.MapSliceToWorldCoordinates(x, y); - - if (statusBar != NULL) - { - char buf[64]; - sprintf(buf, "Click on coordinates (%.02f,%.02f,%.02f) in cm", p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); - statusBar->SetMessage(buf); - } - - that_.interactorAxial_->LookupSliceContainingPoint(*that_.ctAxial_, p); - that_.interactorCoronal_->LookupSliceContainingPoint(*that_.ctCoronal_, p); - that_.interactorSagittal_->LookupSliceContainingPoint(*that_.ctSagittal_, p); - } - - return NULL; - } - - virtual void KeyPressed(WorldSceneWidget& widget, - char key, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - if (key == 's') - { - that_.FitContent(); - } - } - }; - - bool processingEvent_; - Interactor* interactorAxial_; - Interactor* interactorCoronal_; - Interactor* interactorSagittal_; - LayeredSceneWidget* ctAxial_; - LayeredSceneWidget* ctCoronal_; - LayeredSceneWidget* ctSagittal_; - LayeredSceneWidget* petAxial_; - LayeredSceneWidget* petCoronal_; - LayeredSceneWidget* petSagittal_; - LayeredSceneWidget* fusionAxial_; - LayeredSceneWidget* fusionCoronal_; - LayeredSceneWidget* fusionSagittal_; - - - void FitContent() - { - petAxial_->FitContent(); - petCoronal_->FitContent(); - petSagittal_->FitContent(); - } - - - void AddLayer(LayeredSceneWidget& widget, - VolumeImage& volume, - bool isCt) - { - size_t layer; - widget.AddLayer(layer, new VolumeImage::LayerFactory(volume)); - - if (isCt) - { - RenderStyle style; - style.windowing_ = ImageWindowing_Bone; - widget.SetLayerStyle(layer, style); - } - else - { - RenderStyle style; - style.applyLut_ = true; - style.alpha_ = (layer == 0 ? 1.0f : 0.5f); - widget.SetLayerStyle(layer, style); - } - } - - - void ConnectSiblingLocations(LayeredSceneWidget& axial, - LayeredSceneWidget& coronal, - LayeredSceneWidget& sagittal) - { - ReferenceLineFactory::Configure(axial, coronal); - ReferenceLineFactory::Configure(axial, sagittal); - ReferenceLineFactory::Configure(coronal, sagittal); - } - - - void SynchronizeView(const WorldSceneWidget& source, - const ViewportGeometry& view, - LayeredSceneWidget& widget1, - LayeredSceneWidget& widget2, - LayeredSceneWidget& widget3) - { - if (&source == &widget1 || - &source == &widget2 || - &source == &widget3) - { - if (&source != &widget1) - { - widget1.SetView(view); - } - - if (&source != &widget2) - { - widget2.SetView(view); - } - - if (&source != &widget3) - { - widget3.SetView(view); - } - } - } - - - void SynchronizeSlice(const LayeredSceneWidget& source, - const SliceGeometry& slice, - LayeredSceneWidget& widget1, - LayeredSceneWidget& widget2, - LayeredSceneWidget& widget3) - { - if (&source == &widget1 || - &source == &widget2 || - &source == &widget3) - { - if (&source != &widget1) - { - widget1.SetSlice(slice); - } - - if (&source != &widget2) - { - widget2.SetSlice(slice); - } - - if (&source != &widget3) - { - widget3.SetSlice(slice); - } - } - } - - - LayeredSceneWidget* CreateWidget() - { - std::unique_ptr widget(new LayeredSceneWidget); - widget->Register(dynamic_cast(*this)); - widget->Register(dynamic_cast(*this)); - return widget.release(); - } - - - void CreateLayout(BasicApplicationContext& context) - { - std::unique_ptr layout(new OrthancStone::LayoutWidget); - layout->SetBackgroundCleared(true); - //layout->SetBackgroundColor(255,0,0); - layout->SetPadding(5); - - OrthancStone::LayoutWidget& layoutA = dynamic_cast - (layout->AddWidget(new OrthancStone::LayoutWidget)); - layoutA.SetPadding(0, 0, 0, 0, 5); - layoutA.SetVertical(); - petAxial_ = &dynamic_cast(layoutA.AddWidget(CreateWidget())); - OrthancStone::LayoutWidget& layoutA2 = dynamic_cast - (layoutA.AddWidget(new OrthancStone::LayoutWidget)); - layoutA2.SetPadding(0, 0, 0, 0, 5); - petSagittal_ = &dynamic_cast(layoutA2.AddWidget(CreateWidget())); - petCoronal_ = &dynamic_cast(layoutA2.AddWidget(CreateWidget())); - - OrthancStone::LayoutWidget& layoutB = dynamic_cast - (layout->AddWidget(new OrthancStone::LayoutWidget)); - layoutB.SetPadding(0, 0, 0, 0, 5); - layoutB.SetVertical(); - ctAxial_ = &dynamic_cast(layoutB.AddWidget(CreateWidget())); - OrthancStone::LayoutWidget& layoutB2 = dynamic_cast - (layoutB.AddWidget(new OrthancStone::LayoutWidget)); - layoutB2.SetPadding(0, 0, 0, 0, 5); - ctSagittal_ = &dynamic_cast(layoutB2.AddWidget(CreateWidget())); - ctCoronal_ = &dynamic_cast(layoutB2.AddWidget(CreateWidget())); - - OrthancStone::LayoutWidget& layoutC = dynamic_cast - (layout->AddWidget(new OrthancStone::LayoutWidget)); - layoutC.SetPadding(0, 0, 0, 0, 5); - layoutC.SetVertical(); - fusionAxial_ = &dynamic_cast(layoutC.AddWidget(CreateWidget())); - OrthancStone::LayoutWidget& layoutC2 = dynamic_cast - (layoutC.AddWidget(new OrthancStone::LayoutWidget)); - layoutC2.SetPadding(0, 0, 0, 0, 5); - fusionSagittal_ = &dynamic_cast(layoutC2.AddWidget(CreateWidget())); - fusionCoronal_ = &dynamic_cast(layoutC2.AddWidget(CreateWidget())); - - context.SetCentralWidget(layout.release()); - } - - - public: - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("ct", boost::program_options::value(), - "Orthanc ID of the CT series") - ("pet", boost::program_options::value(), - "Orthanc ID of the PET series") - ("rt", boost::program_options::value(), - "Orthanc ID of the DICOM RT-STRUCT series (optional)") - ("threads", boost::program_options::value()->default_value(3), - "Number of download threads for the CT series") - ; - - options.add(generic); - } - - virtual void Initialize(BasicApplicationContext& context, - IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - processingEvent_ = true; - - if (parameters.count("ct") != 1 || - parameters.count("pet") != 1) - { - LOG(ERROR) << "The series ID is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string ct = parameters["ct"].as(); - std::string pet = parameters["pet"].as(); - unsigned int threads = parameters["threads"].as(); - - VolumeImage& ctVolume = context.AddSeriesVolume(ct, true /* progressive download */, threads); - VolumeImage& petVolume = context.AddSeriesVolume(pet, true /* progressive download */, 1); - - // Take the PET volume as the reference for the slices - interactorAxial_ = &dynamic_cast - (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Axial, false))); - interactorCoronal_ = &dynamic_cast - (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Coronal, false))); - interactorSagittal_ = &dynamic_cast - (context.AddInteractor(new Interactor(*this, petVolume, VolumeProjection_Sagittal, true))); - - CreateLayout(context); - - AddLayer(*ctAxial_, ctVolume, true); - AddLayer(*ctCoronal_, ctVolume, true); - AddLayer(*ctSagittal_, ctVolume, true); - - AddLayer(*petAxial_, petVolume, false); - AddLayer(*petCoronal_, petVolume, false); - AddLayer(*petSagittal_, petVolume, false); - - AddLayer(*fusionAxial_, ctVolume, true); - AddLayer(*fusionAxial_, petVolume, false); - AddLayer(*fusionCoronal_, ctVolume, true); - AddLayer(*fusionCoronal_, petVolume, false); - AddLayer(*fusionSagittal_, ctVolume, true); - AddLayer(*fusionSagittal_, petVolume, false); - - if (parameters.count("rt") == 1) - { - DicomStructureSet& rtStruct = context.AddStructureSet(parameters["rt"].as()); - - Vector p = rtStruct.GetStructureCenter(0); - interactorAxial_->GetCursor().LookupSliceContainingPoint(p); - - ctAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); - petAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); - fusionAxial_->AddLayer(new DicomStructureSetSlicer(rtStruct)); - } - - ConnectSiblingLocations(*ctAxial_, *ctCoronal_, *ctSagittal_); - ConnectSiblingLocations(*petAxial_, *petCoronal_, *petSagittal_); - ConnectSiblingLocations(*fusionAxial_, *fusionCoronal_, *fusionSagittal_); - - interactorAxial_->AddWidget(*ctAxial_); - interactorAxial_->AddWidget(*petAxial_); - interactorAxial_->AddWidget(*fusionAxial_); - - interactorCoronal_->AddWidget(*ctCoronal_); - interactorCoronal_->AddWidget(*petCoronal_); - interactorCoronal_->AddWidget(*fusionCoronal_); - - interactorSagittal_->AddWidget(*ctSagittal_); - interactorSagittal_->AddWidget(*petSagittal_); - interactorSagittal_->AddWidget(*fusionSagittal_); - - processingEvent_ = false; - - statusBar.SetMessage("Use the key \"t\" to toggle the fullscreen mode"); - statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); - } - - virtual void NotifySizeChange(const WorldSceneWidget& source, - ViewportGeometry& view) - { - view.FitContent(); - } - - virtual void NotifyViewChange(const WorldSceneWidget& source, - const ViewportGeometry& view) - { - if (!processingEvent_) // Avoid reentrant calls - { - processingEvent_ = true; - - SynchronizeView(source, view, *ctAxial_, *petAxial_, *fusionAxial_); - SynchronizeView(source, view, *ctCoronal_, *petCoronal_, *fusionCoronal_); - SynchronizeView(source, view, *ctSagittal_, *petSagittal_, *fusionSagittal_); - - processingEvent_ = false; - } - } - - virtual void NotifySliceContentChange(const LayeredSceneWidget& source, - const SliceGeometry& slice) - { - if (!processingEvent_) // Avoid reentrant calls - { - processingEvent_ = true; - - SynchronizeSlice(source, slice, *ctAxial_, *petAxial_, *fusionAxial_); - SynchronizeSlice(source, slice, *ctCoronal_, *petCoronal_, *fusionCoronal_); - SynchronizeSlice(source, slice, *ctSagittal_, *petSagittal_, *fusionSagittal_); - - processingEvent_ = false; - } - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "SampleMainWindow.h" - -/** - * Don't use "ui_MainWindow.h" instead of below, as - * this makes CMake unable to detect when the UI file changes. - **/ -#include -#include "../../../Applications/Samples/SampleApplicationBase.h" - -namespace OrthancStone -{ - namespace Samples - { - - SampleMainWindow::SampleMainWindow( - OrthancStone::NativeStoneApplicationContext& context, - OrthancStone::Samples::SampleSingleCanvasApplicationBase& stoneSampleApplication, - QWidget *parent) : - QStoneMainWindow(context, parent), - ui_(new Ui::SampleMainWindow), - stoneSampleApplication_(stoneSampleApplication) - { - ui_->setupUi(this); - SetCentralStoneWidget(*ui_->cairoCentralWidget); - } - - SampleMainWindow::~SampleMainWindow() - { - delete ui_; - } - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "../../../Qt/QCairoWidget.h" -#include "../../../Qt/QStoneMainWindow.h" - -namespace Ui -{ - class SampleMainWindow; -} - -namespace OrthancStone -{ - namespace Samples - { - - class SampleSingleCanvasApplicationBase; - - class SampleMainWindow : public QStoneMainWindow - { - Q_OBJECT - - private: - Ui::SampleMainWindow* ui_; - SampleSingleCanvasApplicationBase& stoneSampleApplication_; - - public: - explicit SampleMainWindow(OrthancStone::NativeStoneApplicationContext& context, SampleSingleCanvasApplicationBase& stoneSampleApplication, QWidget *parent = 0); - ~SampleMainWindow(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindow.ui Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - - SampleMainWindow - - - - 0 - 0 - 903 - 634 - - - - - 500 - 300 - - - - - 500 - 300 - - - - Stone of Orthanc - - - Qt::LeftToRight - - - - - 0 - 0 - - - - Qt::LeftToRight - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 500 - - - - - - - - - - 0 - 0 - 903 - 22 - - - - - Test - - - - - - - - - QCairoWidget - QGraphicsView -
QCairoWidget.h
-
-
- - -
diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "SampleMainWindow.h" - -/** - * Don't use "ui_MainWindow.h" instead of below, as - * this makes CMake unable to detect when the UI file changes. - **/ -#include -#include "../../../Applications/Samples/SampleApplicationBase.h" - -namespace OrthancStone -{ - namespace Samples - { - - SampleMainWindowWithButtons::SampleMainWindowWithButtons( - OrthancStone::NativeStoneApplicationContext& context, - OrthancStone::Samples::SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication, - QWidget *parent) : - QStoneMainWindow(context, parent), - ui_(new Ui::SampleMainWindowWithButtons), - stoneSampleApplication_(stoneSampleApplication) - { - ui_->setupUi(this); - SetCentralStoneWidget(*ui_->cairoCentralWidget); - -#if QT_VERSION >= 0x050000 - connect(ui_->toolButton1, &QToolButton::clicked, this, &SampleMainWindowWithButtons::tool1Clicked); - connect(ui_->toolButton2, &QToolButton::clicked, this, &SampleMainWindowWithButtons::tool2Clicked); - connect(ui_->pushButton1, &QPushButton::clicked, this, &SampleMainWindowWithButtons::pushButton1Clicked); - connect(ui_->pushButton1, &QPushButton::clicked, this, &SampleMainWindowWithButtons::pushButton2Clicked); -#else - connect(ui_->toolButton1, SIGNAL(clicked()), this, SLOT(tool1Clicked())); - connect(ui_->toolButton2, SIGNAL(clicked()), this, SLOT(tool2Clicked())); - connect(ui_->pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1Clicked())); - connect(ui_->pushButton1, SIGNAL(clicked()), this, SLOT(pushButton2Clicked())); -#endif - - std::string pushButton1Name; - std::string pushButton2Name; - std::string tool1Name; - std::string tool2Name; - stoneSampleApplication_.GetButtonNames(pushButton1Name, pushButton2Name, tool1Name, tool2Name); - - ui_->toolButton1->setText(QString::fromStdString(tool1Name)); - ui_->toolButton2->setText(QString::fromStdString(tool2Name)); - ui_->pushButton1->setText(QString::fromStdString(pushButton1Name)); - ui_->pushButton2->setText(QString::fromStdString(pushButton2Name)); - } - - SampleMainWindowWithButtons::~SampleMainWindowWithButtons() - { - delete ui_; - } - - void SampleMainWindowWithButtons::tool1Clicked() - { - stoneSampleApplication_.OnTool1Clicked(); - } - - void SampleMainWindowWithButtons::tool2Clicked() - { - stoneSampleApplication_.OnTool2Clicked(); - } - - void SampleMainWindowWithButtons::pushButton1Clicked() - { - stoneSampleApplication_.OnPushButton1Clicked(); - } - - void SampleMainWindowWithButtons::pushButton2Clicked() - { - stoneSampleApplication_.OnPushButton2Clicked(); - } - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include "../../../Qt/QCairoWidget.h" -#include "../../../Qt/QStoneMainWindow.h" - -namespace Ui -{ - class SampleMainWindowWithButtons; -} - -namespace OrthancStone -{ - namespace Samples - { - - class SampleSingleCanvasWithButtonsApplicationBase; - - class SampleMainWindowWithButtons : public QStoneMainWindow - { - Q_OBJECT - - private: - Ui::SampleMainWindowWithButtons* ui_; - SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication_; - - public: - explicit SampleMainWindowWithButtons(OrthancStone::NativeStoneApplicationContext& context, SampleSingleCanvasWithButtonsApplicationBase& stoneSampleApplication, QWidget *parent = 0); - ~SampleMainWindowWithButtons(); - - private slots: - void tool1Clicked(); - void tool2Clicked(); - void pushButton1Clicked(); - void pushButton2Clicked(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleMainWindowWithButtons.ui Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ - - - SampleMainWindowWithButtons - - - - 0 - 0 - 903 - 634 - - - - - 500 - 300 - - - - - 500 - 300 - - - - Stone of Orthanc - - - Qt::LeftToRight - - - - - 0 - 0 - - - - Qt::LeftToRight - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 500 - - - - - - - - - 0 - 100 - - - - - 16777215 - 100 - - - - - - - tool1 - - - - - - - tool2 - - - - - - - action1 - - - - - - - action2 - - - - - - - - - - - - 0 - 0 - 903 - 22 - - - - - Test - - - - - - - - - QCairoWidget - QGraphicsView -
QCairoWidget.h
-
-
- - -
diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Qt/SampleQtApplicationRunner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../../Qt/QtStoneApplicationRunner.h" - -#if ORTHANC_ENABLE_QT != 1 -#error this file shall be included only with the ORTHANC_ENABLE_QT set to 1 -#endif - -namespace OrthancStone -{ - namespace Samples - { - class SampleQtApplicationRunner : public OrthancStone::QtStoneApplicationRunner - { - protected: - virtual void InitializeMainWindow(OrthancStone::NativeStoneApplicationContext& context) - { - window_.reset(application_.CreateQtMainWindow()); - } - public: - SampleQtApplicationRunner(MessageBroker& broker, - SampleApplicationBase& application) - : OrthancStone::QtStoneApplicationRunner(broker, application) - { - } - - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleApplicationBase.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleApplicationBase.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../../Applications/IStoneApplication.h" -#include "../../../Framework/Deprecated/Widgets/WorldSceneWidget.h" - -#if ORTHANC_ENABLE_WASM==1 -#include "../../../Platforms/Wasm/WasmPlatformApplicationAdapter.h" -#include "../../../Platforms/Wasm/Defaults.h" -#endif - -#if ORTHANC_ENABLE_QT==1 -#include "Qt/SampleMainWindow.h" -#include "Qt/SampleMainWindowWithButtons.h" -#endif - -namespace OrthancStone -{ - namespace Samples - { - class SampleApplicationBase : public IStoneApplication - { - private: - boost::shared_ptr mainWidget_; - - public: - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE - { - } - - virtual std::string GetTitle() const ORTHANC_OVERRIDE - { - return "Stone of Orthanc - Sample"; - } - - /** - * In the basic samples, the commands are handled by the platform adapter and NOT - * by the application handler - */ - virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE {}; - - - virtual void Finalize() ORTHANC_OVERRIDE {} - - virtual void SetCentralWidget(boost::shared_ptr widget) ORTHANC_OVERRIDE - { - mainWidget_ = widget; - } - - virtual boost::shared_ptr GetCentralWidget() ORTHANC_OVERRIDE - { - return mainWidget_; - } - -#if ORTHANC_ENABLE_WASM==1 - // default implementations for a single canvas named "canvas" in the HTML and an emtpy WasmApplicationAdapter - - virtual void InitializeWasm() ORTHANC_OVERRIDE - { - AttachWidgetToWasmViewport("canvas", mainWidget_); - } - - virtual WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(MessageBroker& broker) - { - return new WasmPlatformApplicationAdapter(broker, *this); - } -#endif - - }; - - // this application actually works in Qt and WASM - class SampleSingleCanvasWithButtonsApplicationBase : public SampleApplicationBase - { -public: - virtual void OnPushButton1Clicked() {} - virtual void OnPushButton2Clicked() {} - virtual void OnTool1Clicked() {} - virtual void OnTool2Clicked() {} - - virtual void GetButtonNames(std::string& pushButton1, - std::string& pushButton2, - std::string& tool1, - std::string& tool2 - ) { - pushButton1 = "action1"; - pushButton2 = "action2"; - tool1 = "tool1"; - tool2 = "tool2"; - } - -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow() { - return new SampleMainWindowWithButtons(dynamic_cast(*context_), *this); - } -#endif - - }; - - // this application actually works in SDL and WASM - class SampleSingleCanvasApplicationBase : public SampleApplicationBase - { -public: - -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow() { - return new SampleMainWindow(dynamic_cast(*context_), *this); - } -#endif - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleInteractor.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Widgets/LayeredSceneWidget.h" -#include "../../../Framework/Widgets/IWorldSceneInteractor.h" -#include "../../../Framework/Toolbox/ParallelSlicesCursor.h" - -namespace OrthancStone -{ - namespace Samples - { - /** - * This is a basic mouse interactor for sample applications. It - * contains a set of parallel slices in the 3D space. The mouse - * wheel events make the widget change the slice that is - * displayed. - **/ - class SampleInteractor : public IWorldSceneInteractor - { - private: - ParallelSlicesCursor cursor_; - - public: - SampleInteractor(VolumeImage& volume, - VolumeProjection projection, - bool reverse) - { - std::unique_ptr slices(volume.GetGeometry(projection, reverse)); - cursor_.SetGeometry(*slices); - } - - SampleInteractor(ISeriesLoader& series, - bool reverse) - { - if (reverse) - { - std::unique_ptr slices(series.GetGeometry().Reverse()); - cursor_.SetGeometry(*slices); - } - else - { - cursor_.SetGeometry(series.GetGeometry()); - } - } - - SampleInteractor(const ParallelSlices& slices) - { - cursor_.SetGeometry(slices); - } - - ParallelSlicesCursor& GetCursor() - { - return cursor_; - } - - void AddWidget(LayeredSceneWidget& widget) - { - widget.SetInteractor(*this); - widget.SetSlice(cursor_.GetCurrentSlice()); - } - - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const ViewportGeometry& view, - MouseButton button, - double x, - double y, - IStatusBar* statusBar) - { - return NULL; - } - - virtual void MouseOver(CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) - { - } - - virtual void MouseWheel(WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - if (cursor_.ApplyWheelEvent(direction, modifiers)) - { - dynamic_cast(widget).SetSlice(cursor_.GetCurrentSlice()); - } - } - - virtual void KeyPressed(WorldSceneWidget& widget, - char key, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - } - - void LookupSliceContainingPoint(LayeredSceneWidget& widget, - const Vector& p) - { - if (cursor_.LookupSliceContainingPoint(p)) - { - widget.SetSlice(cursor_.GetCurrentSlice()); - } - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleList.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleList.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -// The macro "ORTHANC_STONE_SAMPLE" must be set by the CMake script - -#if ORTHANC_STONE_SAMPLE == 1 -#include "EmptyApplication.h" -typedef OrthancStone::Samples::EmptyApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 2 -#include "TestPatternApplication.h" -typedef OrthancStone::Samples::TestPatternApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 3 -#include "SingleFrameApplication.h" -typedef OrthancStone::Samples::SingleFrameApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 4 -#include "SingleVolumeApplication.h" -typedef OrthancStone::Samples::SingleVolumeApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 5 -#include "BasicPetCtFusionApplication.h" -typedef OrthancStone::Samples::BasicPetCtFusionApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 6 -#include "SynchronizedSeriesApplication.h" -typedef OrthancStone::Samples::SynchronizedSeriesApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 7 -#include "LayoutPetCtFusionApplication.h" -typedef OrthancStone::Samples::LayoutPetCtFusionApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 8 -#include "SimpleViewerApplicationSingleFile.h" -typedef OrthancStone::Samples::SimpleViewerApplication SampleApplication; - -#elif ORTHANC_STONE_SAMPLE == 9 -#include "SingleFrameEditorApplication.h" -typedef OrthancStone::Samples::SingleFrameEditorApplication SampleApplication; - -#else -#error Please set the ORTHANC_STONE_SAMPLE macro -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainNative.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainNative.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SampleList.h" -#if ORTHANC_ENABLE_SDL==1 -#include "../../Sdl/SdlStoneApplicationRunner.h" -#endif -#if ORTHANC_ENABLE_QT==1 -#include "Qt/SampleQtApplicationRunner.h" -#endif - -int main(int argc, char* argv[]) -{ - boost::shared_ptr sampleStoneApplication(new SampleApplication); - -#if ORTHANC_ENABLE_SDL==1 - OrthancStone::SdlStoneApplicationRunner sdlApplicationRunner(sampleStoneApplication); - return sdlApplicationRunner.Execute(argc, argv); -#endif - -#if ORTHANC_ENABLE_QT==1 - OrthancStone::Samples::SampleQtApplicationRunner qtAppRunner(sampleStoneApplication); - return qtAppRunner.Execute(argc, argv); -#endif -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainWasm.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SampleMainWasm.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "Platforms/Wasm/WasmWebService.h" -#include "Platforms/Wasm/WasmViewport.h" - -#include - -#include "SampleList.h" - - -OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) -{ - return new SampleApplication(broker); -} - -OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application) -{ - return dynamic_cast(application)->CreateWasmApplicationAdapter(broker); -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Samples-status.md --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Samples-status.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -Executable versions -================ -Generic options ----------------------- -``` -("help", "Display this help and exit") -("verbose", "Be verbose in logs") -("orthanc", boost::program_options::value() - ->default_value("http://localhost:8042/"), - "URL to the Orthanc server") -("username", "Username for the Orthanc server") -("password", "Password for the Orthanc server") -("https-verify", boost::program_options::value() - ->default_value(true), "Check HTTPS certificates") -``` -OrthancStoneSimpleViewer -------------------------------------- -- Options: - ``` - - "studyId", std::string, "Orthanc ID of the study" - ``` -- study loading works OK -- Invert does not work: -``` -void SimpleViewerApplication::ExecuteAction(SimpleViewerApplication::Actions action) - { - // TODO - } -``` - -OrthancStoneSimpleViewerSingleFile -------------------------------------- -- Options: - ``` - - "studyId", std::string, "Orthanc ID of the study" - ``` - -Study loading works. - -The `line` and `circle` buttons work and call this: -``` -virtual void OnTool1Clicked() -{ - currentTool_ = Tools_LineMeasure; -} - -virtual void OnTool2Clicked() -{ - currentTool_ = Tools_CircleMeasure; -} -``` -The `action1` and `action2` buttons are not connected - -The following is displayed in the console at launch time: -``` -W0313 12:20:12.790449 NativeStoneApplicationRunner.cpp:55] Use the key "s" to reinitialize the layout -W0313 12:20:12.790449 NativeStoneApplicationRunner.cpp:55] Use the key "n" to go to next image in the main viewport -``` -However, when looking at `MainWidgetInteractor::KeyPressed` (`SimpleViewerApplicationSingleFile.h:169`), only the following is processed: -- 's': reset layout -- 'l': select line tool -- 'c': select circle tool - -OrthancStoneSingleFrame -------------------------------------- -``` -generic.add_options() -("instance", boost::program_options::value(), -"Orthanc ID of the instance") -("frame", boost::program_options::value() - ->default_value(0), -"Number of the frame, for multi-frame DICOM instances") -("smooth", boost::program_options::value() - ->default_value(true), -"Enable bilinear interpolation to smooth the image"); -``` -only key handled in `KeyPressed` is `s` to call `widget.FitContent()` - - -OrthancStoneSingleFrameEditor -------------------------------------- -``` -generic.add_options() -("instance", boost::program_options::value(), -"Orthanc ID of the instance") -("frame", boost::program_options::value() - ->default_value(0), -"Number of the frame, for multi-frame DICOM instances"); -``` -Available commands in `KeyPressed` (`SingleFrameEditorApplication.h:280`): -- 'a' widget.FitContent() -- 'c' Crop tool -- 'm' Mask tool -- 'd' dump to json and diplay result (?) -- 'e' export current view to Dicom with dummy tags (?) -- 'i' wdiget.SwitchInvert -- 't' Move tool -- 'n' switch between nearest and bilinear interpolation -- 'r' Rotate tool -- 's' Resize tool -- 'w' Windowing tool -- 'ctrl+y' redo -- 'ctrl+z' undo diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/AppStatus.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - - -namespace SimpleViewer -{ - struct AppStatus - { - std::string patientId; - std::string studyDescription; - std::string currentInstanceIdInMainViewport; - // note: if you add members here, update the serialization code below and deserialization in simple-viewer.ts -> onAppStatusUpdated() - - - AppStatus() - { - } - - void ToJson(Json::Value &output) const - { - output["patientId"] = patientId; - output["studyDescription"] = studyDescription; - output["currentInstanceIdInMainViewport"] = currentInstanceIdInMainViewport; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "MainWidgetInteractor.h" - -#include "SimpleViewerApplication.h" - -namespace SimpleViewer { - - Deprecated::IWorldSceneMouseTracker* MainWidgetInteractor::CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - if (button == MouseButton_Left) - { - if (application_.GetCurrentTool() == Tool_LineMeasure) - { - return new Deprecated::LineMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), - x, y, 255, 0, 0, application_.GetFont()); - } - else if (application_.GetCurrentTool() == Tool_CircleMeasure) - { - return new Deprecated::CircleMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), - x, y, 255, 0, 0, application_.GetFont()); - } - else if (application_.GetCurrentTool() == Tool_Crop) - { - // TODO - } - else if (application_.GetCurrentTool() == Tool_Windowing) - { - // TODO - } - else if (application_.GetCurrentTool() == Tool_Zoom) - { - // TODO - } - else if (application_.GetCurrentTool() == Tool_Pan) - { - // TODO - } - } - return NULL; - } - - void MainWidgetInteractor::MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - { - if (statusBar != NULL) - { - Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); - - char buf[64]; - sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", - p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); - statusBar->SetMessage(buf); - } - } - - void MainWidgetInteractor::MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - } - - void MainWidgetInteractor::KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - switch (keyChar) - { - case 's': - widget.FitContent(); - break; - - default: - break; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/MainWidgetInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include "../../../../Framework/Deprecated/Widgets/IWorldSceneInteractor.h" - -using namespace OrthancStone; - -namespace SimpleViewer { - - class SimpleViewerApplication; - - class MainWidgetInteractor : public Deprecated::IWorldSceneInteractor - { - private: - SimpleViewerApplication& application_; - - public: - MainWidgetInteractor(SimpleViewerApplication& application) : - application_(application) - { - } - - /** - WorldSceneWidget: - */ - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches); - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar); - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar); - - virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar); - }; - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "SimpleViewerMainWindow.h" - -/** - * Don't use "ui_MainWindow.h" instead of below, as - * this makes CMake unable to detect when the UI file changes. - **/ -#include -#include "../../SimpleViewerApplication.h" - - -namespace SimpleViewer -{ - template - bool ExecuteCommand(U* handler, const T& command) - { - std::string serializedCommand = StoneSerialize(command); - StoneDispatchToHandler(serializedCommand, handler); - } - - SimpleViewerMainWindow::SimpleViewerMainWindow( - OrthancStone::NativeStoneApplicationContext& context, - SimpleViewerApplication& stoneApplication, - QWidget *parent) : - QStoneMainWindow(context, parent), - ui_(new Ui::SimpleViewerMainWindow), - stoneApplication_(stoneApplication) - { - ui_->setupUi(this); - SetCentralStoneWidget(*ui_->cairoCentralWidget); - -#if QT_VERSION >= 0x050000 - connect(ui_->toolButtonCrop, &QToolButton::clicked, this, &SimpleViewerMainWindow::cropClicked); - connect(ui_->pushButtonUndoCrop, &QToolButton::clicked, this, &SimpleViewerMainWindow::undoCropClicked); - connect(ui_->toolButtonLine, &QToolButton::clicked, this, &SimpleViewerMainWindow::lineClicked); - connect(ui_->toolButtonCircle, &QToolButton::clicked, this, &SimpleViewerMainWindow::circleClicked); - connect(ui_->toolButtonWindowing, &QToolButton::clicked, this, &SimpleViewerMainWindow::windowingClicked); - connect(ui_->pushButtonRotate, &QPushButton::clicked, this, &SimpleViewerMainWindow::rotateClicked); - connect(ui_->pushButtonInvert, &QPushButton::clicked, this, &SimpleViewerMainWindow::invertClicked); -#else - connect(ui_->toolButtonCrop, SIGNAL(clicked()), this, SLOT(cropClicked())); - connect(ui_->toolButtonLine, SIGNAL(clicked()), this, SLOT(lineClicked())); - connect(ui_->toolButtonCircle, SIGNAL(clicked()), this, SLOT(circleClicked())); - connect(ui_->toolButtonWindowing, SIGNAL(clicked()), this, SLOT(windowingClicked())); - connect(ui_->pushButtonUndoCrop, SIGNAL(clicked()), this, SLOT(undoCropClicked())); - connect(ui_->pushButtonRotate, SIGNAL(clicked()), this, SLOT(rotateClicked())); - connect(ui_->pushButtonInvert, SIGNAL(clicked()), this, SLOT(invertClicked())); -#endif - } - - SimpleViewerMainWindow::~SimpleViewerMainWindow() - { - delete ui_; - } - - void SimpleViewerMainWindow::cropClicked() - { - stoneApplication_.ExecuteCommand(SelectTool(Tool_Crop)); - } - - void SimpleViewerMainWindow::undoCropClicked() - { - stoneApplication_.ExecuteCommand(Action(ActionType_UndoCrop)); - } - - void SimpleViewerMainWindow::lineClicked() - { - stoneApplication_.ExecuteCommand(SelectTool(Tool_LineMeasure)); - } - - void SimpleViewerMainWindow::circleClicked() - { - stoneApplication_.ExecuteCommand(SelectTool(Tool_CircleMeasure)); - } - - void SimpleViewerMainWindow::windowingClicked() - { - stoneApplication_.ExecuteCommand(SelectTool(Tool_Windowing)); - } - - void SimpleViewerMainWindow::rotateClicked() - { - stoneApplication_.ExecuteCommand(Action(ActionType_Rotate)); - } - - void SimpleViewerMainWindow::invertClicked() - { - stoneApplication_.ExecuteCommand(Action(ActionType_Invert)); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ -#pragma once - -#include -#include - -namespace Ui -{ - class SimpleViewerMainWindow; -} - -using namespace OrthancStone; - -namespace SimpleViewer -{ - class SimpleViewerApplication; - - class SimpleViewerMainWindow : public QStoneMainWindow - { - Q_OBJECT - - private: - Ui::SimpleViewerMainWindow* ui_; - SimpleViewerApplication& stoneApplication_; - - public: - explicit SimpleViewerMainWindow(OrthancStone::NativeStoneApplicationContext& context, SimpleViewerApplication& stoneApplication, QWidget *parent = 0); - ~SimpleViewerMainWindow(); - - private slots: - void cropClicked(); - void undoCropClicked(); - void rotateClicked(); - void windowingClicked(); - void lineClicked(); - void circleClicked(); - void invertClicked(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/SimpleViewerMainWindow.ui Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ - - - SimpleViewerMainWindow - - - - 0 - 0 - 903 - 634 - - - - - 500 - 300 - - - - - 500 - 300 - - - - Stone of Orthanc - - - Qt::LeftToRight - - - - - 0 - 0 - - - - Qt::LeftToRight - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 500 - - - - - - - - - 0 - 100 - - - - - 16777215 - 100 - - - - - - - windowing - - - - - - - crop - - - - - - - undo crop - - - - - - - line - - - - - - - circle - - - - - - - rotate - - - - - - - invert - - - - - - - - - - - - 0 - 0 - 903 - 22 - - - - - Test - - - - - - - - - QCairoWidget - QGraphicsView -
QCairoWidget.h
-
-
- - -
diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Qt/mainQt.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Applications/Qt/QtStoneApplicationRunner.h" - -#include "../../SimpleViewerApplication.h" -#include "Framework/Messages/MessageBroker.h" - - -int main(int argc, char* argv[]) -{ - OrthancStone::MessageBroker broker; - SimpleViewer::SimpleViewerApplication stoneApplication(broker); - - OrthancStone::QtStoneApplicationRunner qtAppRunner(broker, stoneApplication); - return qtAppRunner.Execute(argc, argv); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SimpleViewerApplication.h" - -#if ORTHANC_ENABLE_QT == 1 -# include "Qt/SimpleViewerMainWindow.h" -#endif - -#if ORTHANC_ENABLE_WASM == 1 -# include -#endif - -namespace SimpleViewer -{ - - void SimpleViewerApplication::Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - context_ = context; - statusBar_ = &statusBar; - - {// initialize viewports and layout - mainLayout_ = new Deprecated::LayoutWidget("main-layout"); - mainLayout_->SetPadding(10); - mainLayout_->SetBackgroundCleared(true); - mainLayout_->SetBackgroundColor(0, 0, 0); - mainLayout_->SetHorizontal(); - - thumbnailsLayout_ = new Deprecated::LayoutWidget("thumbnail-layout"); - thumbnailsLayout_->SetPadding(10); - thumbnailsLayout_->SetBackgroundCleared(true); - thumbnailsLayout_->SetBackgroundColor(50, 50, 50); - thumbnailsLayout_->SetVertical(); - - mainWidget_ = new Deprecated::SliceViewerWidget(IObserver::GetBroker(), "main-viewport"); - //mainWidget_->RegisterObserver(*this); - - // hierarchy - mainLayout_->AddWidget(thumbnailsLayout_); - mainLayout_->AddWidget(mainWidget_); - - // sources - smartLoader_.reset(new Deprecated::SmartLoader(IObserver::GetBroker(), context->GetOrthancApiClient())); - smartLoader_->SetImageQuality(Deprecated::SliceImageQuality_FullPam); - - mainLayout_->SetTransmitMouseOver(true); - mainWidgetInteractor_.reset(new MainWidgetInteractor(*this)); - mainWidget_->SetInteractor(*mainWidgetInteractor_); - thumbnailInteractor_.reset(new ThumbnailInteractor(*this)); - } - - statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); - statusBar.SetMessage("Use the key \"n\" to go to next image in the main viewport"); - - - if (parameters.count("studyId") < 1) - { - LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; - context->GetOrthancApiClient().GetJsonAsync("/studies", new Callable(*this, &SimpleViewerApplication::OnStudyListReceived)); - } - else - { - SelectStudy(parameters["studyId"].as()); - } - } - - - void SimpleViewerApplication::DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("studyId", boost::program_options::value(), - "Orthanc ID of the study") - ; - - options.add(generic); - } - - void SimpleViewerApplication::OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isArray() && - response.size() >= 1) - { - SelectStudy(response[0].asString()); - } - } - void SimpleViewerApplication::OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isObject() && response["Series"].isArray()) - { - for (size_t i=0; i < response["Series"].size(); i++) - { - context_->GetOrthancApiClient().GetJsonAsync("/series/" + response["Series"][(int)i].asString(), new Callable(*this, &SimpleViewerApplication::OnSeriesReceived)); - } - } - } - - void SimpleViewerApplication::OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isObject() && - response["Instances"].isArray() && - response["Instances"].size() > 0) - { - // keep track of all instances IDs - const std::string& seriesId = response["ID"].asString(); - seriesTags_[seriesId] = response; - instancesIdsPerSeriesId_[seriesId] = std::vector(); - for (size_t i = 0; i < response["Instances"].size(); i++) - { - const std::string& instanceId = response["Instances"][static_cast(i)].asString(); - instancesIdsPerSeriesId_[seriesId].push_back(instanceId); - } - - // load the first instance in the thumbnail - LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); - - // if this is the first thumbnail loaded, load the first instance in the mainWidget - if (mainWidget_->GetLayerCount() == 0) - { - smartLoader_->SetFrameInWidget(*mainWidget_, 0, instancesIdsPerSeriesId_[seriesId][0], 0); - } - } - } - - void SimpleViewerApplication::LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) - { - LOG(INFO) << "Loading thumbnail for series " << seriesId; - - Deprecated::SliceViewerWidget* thumbnailWidget = - new Deprecated::SliceViewerWidget(IObserver::GetBroker(), "thumbnail-series-" + seriesId); - thumbnails_.push_back(thumbnailWidget); - thumbnailsLayout_->AddWidget(thumbnailWidget); - - thumbnailWidget->RegisterObserverCallback( - new Callable - (*this, &SimpleViewerApplication::OnWidgetGeometryChanged)); - - smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); - thumbnailWidget->SetInteractor(*thumbnailInteractor_); - } - - void SimpleViewerApplication::SelectStudy(const std::string& studyId) - { - context_->GetOrthancApiClient().GetJsonAsync("/studies/" + studyId, new Callable(*this, &SimpleViewerApplication::OnStudyReceived)); - } - - void SimpleViewerApplication::OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message) - { - // TODO: The "const_cast" could probably be replaced by "mainWidget_" - const_cast(message.GetOrigin()).FitContent(); - } - - void SimpleViewerApplication::SelectSeriesInMainViewport(const std::string& seriesId) - { - smartLoader_->SetFrameInWidget(*mainWidget_, 0, instancesIdsPerSeriesId_[seriesId][0], 0); - } - - bool SimpleViewerApplication::Handle(const StoneSampleCommands::SelectTool& value) - { - currentTool_ = value.tool; - return true; - } - - bool SimpleViewerApplication::Handle(const StoneSampleCommands::Action& value) - { - switch (value.type) - { - case ActionType_Invert: - // TODO - break; - case ActionType_UndoCrop: - // TODO - break; - case ActionType_Rotate: - // TODO - break; - default: - throw std::runtime_error("Action type not supported"); - } - return true; - } - -#if ORTHANC_ENABLE_QT==1 - QStoneMainWindow* SimpleViewerApplication::CreateQtMainWindow() - { - return new SimpleViewerMainWindow(dynamic_cast(*context_), *this); - } -#endif - -#if ORTHANC_ENABLE_WASM==1 - void SimpleViewerApplication::InitializeWasm() { - - AttachWidgetToWasmViewport("canvasThumbnails", thumbnailsLayout_); - AttachWidgetToWasmViewport("canvasMain", mainWidget_); - } -#endif - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/SimpleViewerApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - - /* - This header contains the command definitions for the sample applications - */ -#include "Applications/Samples/StoneSampleCommands_generated.hpp" -using namespace StoneSampleCommands; - -#include "Applications/IStoneApplication.h" - -#include "../../../../Framework/Deprecated/Layers/CircleMeasureTracker.h" -#include "../../../../Framework/Deprecated/Layers/LineMeasureTracker.h" -#include "../../../../Framework/Deprecated/SmartLoader.h" -#include "../../../../Framework/Deprecated/Widgets/LayoutWidget.h" -#include "../../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" -#include "../../../../Framework/Messages/IObserver.h" - -#if ORTHANC_ENABLE_WASM==1 -#include "Platforms/Wasm/WasmPlatformApplicationAdapter.h" -#include "Platforms/Wasm/Defaults.h" -#endif - -#if ORTHANC_ENABLE_QT==1 -#include "Qt/SimpleViewerMainWindow.h" -#endif - -#include -#include - -#include "ThumbnailInteractor.h" -#include "MainWidgetInteractor.h" -#include "AppStatus.h" - -using namespace OrthancStone; - - -namespace SimpleViewer -{ - - class SimpleViewerApplication - : public IStoneApplication - , public IObserver - , public IObservable - , public StoneSampleCommands::IHandler - { - public: - - struct StatusUpdatedMessage : public IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - const AppStatus& status_; - - StatusUpdatedMessage(const AppStatus& status) - : status_(status) - { - } - }; - - private: - Tool currentTool_; - - std::unique_ptr mainWidgetInteractor_; - std::unique_ptr thumbnailInteractor_; - Deprecated::LayoutWidget* mainLayout_; - Deprecated::LayoutWidget* thumbnailsLayout_; - Deprecated::SliceViewerWidget* mainWidget_; - std::vector thumbnails_; - std::map > instancesIdsPerSeriesId_; - std::map seriesTags_; - unsigned int currentInstanceIndex_; - Deprecated::WidgetViewport* wasmViewport1_; - Deprecated::WidgetViewport* wasmViewport2_; - - Deprecated::IStatusBar* statusBar_; - std::unique_ptr smartLoader_; - - Orthanc::Font font_; - - public: - SimpleViewerApplication(MessageBroker& broker) : - IObserver(broker), - IObservable(broker), - currentTool_(StoneSampleCommands::Tool_LineMeasure), - mainLayout_(NULL), - currentInstanceIndex_(0), - wasmViewport1_(NULL), - wasmViewport2_(NULL) - { - font_.LoadFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); - } - - virtual void Finalize() ORTHANC_OVERRIDE {} - virtual Deprecated::IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainLayout_;} - - virtual void DeclareStartupOptions(boost::program_options::options_description& options) ORTHANC_OVERRIDE; - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE; - - void OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); - - void OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); - - void OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message); - - void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId); - - void SelectStudy(const std::string& studyId); - - void OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message); - - void SelectSeriesInMainViewport(const std::string& seriesId); - - - Tool GetCurrentTool() const - { - return currentTool_; - } - - const Orthanc::Font& GetFont() const - { - return font_; - } - - // ExecuteAction method was empty (its body was a single "TODO" comment) - virtual bool Handle(const SelectTool& value) ORTHANC_OVERRIDE; - virtual bool Handle(const Action& value) ORTHANC_OVERRIDE; - - template - bool ExecuteCommand(const T& cmd) - { - std::string cmdStr = StoneSampleCommands::StoneSerialize(cmd); - return StoneSampleCommands::StoneDispatchToHandler(cmdStr, this); - } - - virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE - { - StoneSampleCommands::StoneDispatchToHandler(data, this); - } - - virtual std::string GetTitle() const ORTHANC_OVERRIDE {return "SimpleViewer";} - -#if ORTHANC_ENABLE_WASM==1 - virtual void InitializeWasm() ORTHANC_OVERRIDE; -#endif - -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow(); -#endif - }; - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "ThumbnailInteractor.h" - -#include "SimpleViewerApplication.h" - -namespace SimpleViewer { - - Deprecated::IWorldSceneMouseTracker* ThumbnailInteractor::CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - if (button == MouseButton_Left) - { - statusBar->SetMessage("selected thumbnail " + widget.GetName()); - std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); - application_.SelectSeriesInMainViewport(seriesId); - } - return NULL; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/ThumbnailInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../../../Framework/Deprecated/Widgets/IWorldSceneInteractor.h" - -using namespace OrthancStone; - -namespace SimpleViewer { - - class SimpleViewerApplication; - - class ThumbnailInteractor : public Deprecated::IWorldSceneInteractor - { - private: - SimpleViewerApplication& application_; - public: - ThumbnailInteractor(SimpleViewerApplication& application) : - application_(application) - { - } - - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches); - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - {} - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - {} - - virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - {} - - }; - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "SimpleViewerWasmApplicationAdapter.h" - -namespace SimpleViewer -{ - - SimpleViewerWasmApplicationAdapter::SimpleViewerWasmApplicationAdapter(MessageBroker &broker, SimpleViewerApplication &application) - : WasmPlatformApplicationAdapter(broker, application), - viewerApplication_(application) - { - application.RegisterObserverCallback(new Callable(*this, &SimpleViewerWasmApplicationAdapter::OnStatusUpdated)); - } - - void SimpleViewerWasmApplicationAdapter::OnStatusUpdated(const SimpleViewerApplication::StatusUpdatedMessage &message) - { - Json::Value statusJson; - message.status_.ToJson(statusJson); - - Json::Value event; - event["event"] = "appStatusUpdated"; - event["data"] = statusJson; - - Json::StreamWriterBuilder builder; - std::unique_ptr writer(builder.newStreamWriter()); - std::ostringstream outputStr; - - writer->write(event, &outputStr); - - NotifyStatusUpdateFromCppToWebWithString(outputStr.str()); - } - -} // namespace SimpleViewer \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/SimpleViewerWasmApplicationAdapter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include "../../../../../../Framework/Messages/IObserver.h" -#include - -#include "../../SimpleViewerApplication.h" - -namespace SimpleViewer { - - class SimpleViewerWasmApplicationAdapter : public WasmPlatformApplicationAdapter - { - SimpleViewerApplication& viewerApplication_; - - public: - SimpleViewerWasmApplicationAdapter(MessageBroker& broker, SimpleViewerApplication& application); - - private: - void OnStatusUpdated(const SimpleViewerApplication::StatusUpdatedMessage& message); - - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/mainWasm.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "Platforms/Wasm/WasmWebService.h" -#include "Platforms/Wasm/WasmViewport.h" - -#include - -#include "../../SimpleViewerApplication.h" -#include "SimpleViewerWasmApplicationAdapter.h" - - -OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) { - - return new SimpleViewer::SimpleViewerApplication(broker); -} - -OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, IStoneApplication* application) -{ - return new SimpleViewer::SimpleViewerWasmApplicationAdapter(broker, *(dynamic_cast(application))); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ - - - - - - - - - - - - Simple Viewer - - - - -
-
- -
-
- -
-
-
- - - - - - - - - -
- - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/simple-viewer.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -import wasmApplicationRunner = require('../../../../Platforms/Wasm/wasm-application-runner'); - -wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewer", "/orthanc"); - -function SelectTool(toolName: string) { - var command = { - command: "selectTool:" + toolName, - commandType: "generic-no-arg-command", - args: { - } - }; - wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); -} - -function PerformAction(actionName: string) { - var command = { - command: "action:" + actionName, - commandType: "generic-no-arg-command", - args: { - } - }; - wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); -} - -class SimpleViewerUI { - - private _labelPatientId: HTMLSpanElement; - private _labelStudyDescription: HTMLSpanElement; - - public constructor() { - // install "SelectTool" handlers - document.querySelectorAll("[tool-selector]").forEach((e) => { - (e as HTMLButtonElement).addEventListener("click", () => { - SelectTool(e.attributes["tool-selector"].value); - }); - }); - - // install "PerformAction" handlers - document.querySelectorAll("[action-trigger]").forEach((e) => { - (e as HTMLButtonElement).addEventListener("click", () => { - PerformAction(e.attributes["action-trigger"].value); - }); - }); - - // connect all ui elements to members - this._labelPatientId = document.getElementById("label-patient-id") as HTMLSpanElement; - this._labelStudyDescription = document.getElementById("label-study-description") as HTMLSpanElement; - } - - public onAppStatusUpdated(status: any) { - this._labelPatientId.innerText = status["patientId"]; - this._labelStudyDescription.innerText = status["studyDescription"]; - // this.highlighThumbnail(status["currentInstanceIdInMainViewport"]); - } - -} - -var ui = new SimpleViewerUI(); - -// this method is called "from the C++ code" when the StoneApplication is updated. -// it can be used to update the UI of the application -function UpdateWebApplicationWithString(statusUpdateMessageString: string) { - console.log("updating web application with string: ", statusUpdateMessageString); - let statusUpdateMessage = JSON.parse(statusUpdateMessageString); - - if ("event" in statusUpdateMessage) { - let eventName = statusUpdateMessage["event"]; - if (eventName == "appStatusUpdated") { - ui.onAppStatusUpdated(statusUpdateMessage["data"]); - } - } -} - -function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { - console.log("updating web application with serialized message: ", statusUpdateMessageString); - console.log(""); -} - -// make it available to other js scripts in the application -( window).UpdateWebApplicationWithString = UpdateWebApplicationWithString; -( window).UpdateWebApplicationWithSerializedMessage = UpdateWebApplicationWithSerializedMessage; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/styles.css --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/styles.css Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0px; - border: 0; - overflow: hidden; /* Disable scrollbars */ - display: block; /* No floating content on sides */ - background-color: black; - color: white; - font-family: Arial, Helvetica, sans-serif; -} - -canvas { - left:0px; - top:0px; -} - -#canvas-group { - padding:5px; - background-color: grey; -} - -#status-group { - padding:5px; -} - -#worklist-group { - padding:5px; -} - -.vsol-button { - height: 40px; -} - -#thumbnails-group ul li { - display: inline; - list-style: none; -} - -.thumbnail { - width: 100px; - height: 100px; - padding: 3px; -} - -.thumbnail-selected { - border-width: 1px; - border-color: red; - border-style: solid; -} - -#template-thumbnail-li { - display: none !important; -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/tsconfig-simple-viewer.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewer/Wasm/tsconfig-simple-viewer.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -{ - "extends" : "../../Web/tsconfig-samples", - "compilerOptions": { - }, - "include" : [ - "simple-viewer.ts", - "../../build-wasm/ApplicationCommands_generated.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewerApplicationSingleFile.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SimpleViewerApplicationSingleFile.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,461 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Deprecated/Layers/CircleMeasureTracker.h" -#include "../../../Framework/Deprecated/Layers/LineMeasureTracker.h" -#include "../../../Framework/Deprecated/SmartLoader.h" -#include "../../../Framework/Deprecated/Widgets/LayoutWidget.h" -#include "../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" -#include "../../../Framework/Messages/IObserver.h" - -#if ORTHANC_ENABLE_WASM==1 -#include "../../../Platforms/Wasm/WasmPlatformApplicationAdapter.h" -#include "../../../Platforms/Wasm/Defaults.h" -#endif - -#include -#include - -namespace OrthancStone -{ - namespace Samples - { - class SimpleViewerApplication : - public SampleSingleCanvasWithButtonsApplicationBase, - public ObserverBase - { - private: - class ThumbnailInteractor : public Deprecated::IWorldSceneInteractor - { - private: - SimpleViewerApplication& application_; - - public: - ThumbnailInteractor(SimpleViewerApplication& application) : - application_(application) - { - } - - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - if (button == MouseButton_Left) - { - statusBar->SetMessage("selected thumbnail " + widget.GetName()); - std::string seriesId = widget.GetName().substr(strlen("thumbnail-series-")); - application_.SelectSeriesInMainViewport(seriesId); - } - return NULL; - } - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - { - } - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - } - - virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - } - }; - - class MainWidgetInteractor : public Deprecated::IWorldSceneInteractor - { - private: - SimpleViewerApplication& application_; - - public: - MainWidgetInteractor(SimpleViewerApplication& application) : - application_(application) - { - } - - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - if (button == MouseButton_Left) - { - if (application_.currentTool_ == Tool_LineMeasure) - { - return new Deprecated::LineMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), - x, y, 255, 0, 0, application_.GetFont()); - } - else if (application_.currentTool_ == Tool_CircleMeasure) - { - return new Deprecated::CircleMeasureTracker(statusBar, dynamic_cast(widget).GetSlice(), - x, y, 255, 0, 0, application_.GetFont()); - } - } - return NULL; - } - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - { - if (statusBar != NULL) - { - Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); - - char buf[64]; - sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", - p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); - statusBar->SetMessage(buf); - } - } - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - } - - virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - switch (keyChar) - { - case 's': - widget.FitContent(); - break; - - case 'l': - application_.currentTool_ = Tool_LineMeasure; - break; - - case 'c': - application_.currentTool_ = Tool_CircleMeasure; - break; - - default: - break; - } - } - }; - - -#if ORTHANC_ENABLE_WASM==1 - class SimpleViewerApplicationAdapter : public WasmPlatformApplicationAdapter - { - SimpleViewerApplication& viewerApplication_; - - public: - SimpleViewerApplicationAdapter(SimpleViewerApplication& application) - : WasmPlatformApplicationAdapter(application), - viewerApplication_(application) - { - } - - virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input) - { - if (input == "select-tool:line-measure") - { - viewerApplication_.currentTool_ = Tool_LineMeasure; - NotifyStatusUpdateFromCppToWebWithString("currentTool=line-measure"); - } - else if (input == "select-tool:circle-measure") - { - viewerApplication_.currentTool_ = Tool_CircleMeasure; - NotifyStatusUpdateFromCppToWebWithString("currentTool=circle-measure"); - } - - output = "ok"; - } - - virtual void NotifySerializedMessageFromCppToWeb(const std::string& statusUpdateMessage) - { - UpdateStoneApplicationStatusFromCppWithSerializedMessage(statusUpdateMessage.c_str()); - } - - virtual void NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage) - { - UpdateStoneApplicationStatusFromCppWithString(statusUpdateMessage.c_str()); - } - - }; -#endif - enum Tool { - Tool_LineMeasure, - Tool_CircleMeasure - }; - - Tool currentTool_; - std::unique_ptr mainWidgetInteractor_; - std::unique_ptr thumbnailInteractor_; - Deprecated::LayoutWidget* mainLayout_; - Deprecated::LayoutWidget* thumbnailsLayout_; - std::vector > thumbnails_; - - std::map > instancesIdsPerSeriesId_; - std::map seriesTags_; - - unsigned int currentInstanceIndex_; - Deprecated::WidgetViewport* wasmViewport1_; - Deprecated::WidgetViewport* wasmViewport2_; - - Deprecated::IStatusBar* statusBar_; - std::unique_ptr smartLoader_; - - Orthanc::Font font_; - - public: - SimpleViewerApplication() : - currentTool_(Tool_LineMeasure), - mainLayout_(NULL), - currentInstanceIndex_(0), - wasmViewport1_(NULL), - wasmViewport2_(NULL) - { - font_.LoadFromResource(Orthanc::EmbeddedResources::FONT_UBUNTU_MONO_BOLD_16); -// DeclareIgnoredMessage(MessageType_Widget_ContentChanged); - } - - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("studyId", boost::program_options::value(), - "Orthanc ID of the study") - ; - - options.add(generic); - } - - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - context_ = context; - statusBar_ = &statusBar; - - {// initialize viewports and layout - mainLayout_ = new Deprecated::LayoutWidget("main-layout"); - mainLayout_->SetPadding(10); - mainLayout_->SetBackgroundCleared(true); - mainLayout_->SetBackgroundColor(0, 0, 0); - mainLayout_->SetHorizontal(); - - boost::shared_ptr thumbnailsLayout_(new Deprecated::LayoutWidget("thumbnail-layout")); - thumbnailsLayout_->SetPadding(10); - thumbnailsLayout_->SetBackgroundCleared(true); - thumbnailsLayout_->SetBackgroundColor(50, 50, 50); - thumbnailsLayout_->SetVertical(); - - boost::shared_ptr widget - (new Deprecated::SliceViewerWidget("main-viewport")); - SetCentralWidget(widget); - //mainWidget_->RegisterObserver(*this); - - // hierarchy - mainLayout_->AddWidget(thumbnailsLayout_); - mainLayout_->AddWidget(widget); - - // sources - smartLoader_.reset(new Deprecated::SmartLoader(context->GetOrthancApiClient())); - smartLoader_->SetImageQuality(Deprecated::SliceImageQuality_FullPam); - - mainLayout_->SetTransmitMouseOver(true); - mainWidgetInteractor_.reset(new MainWidgetInteractor(*this)); - widget->SetInteractor(*mainWidgetInteractor_); - thumbnailInteractor_.reset(new ThumbnailInteractor(*this)); - } - - statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); - statusBar.SetMessage("Use the key \"n\" to go to next image in the main viewport"); - - - if (parameters.count("studyId") < 1) - { - LOG(WARNING) << "The study ID is missing, will take the first studyId found in Orthanc"; - context->GetOrthancApiClient()->GetJsonAsync( - "/studies", - new Deprecated::DeprecatedCallable - (GetSharedObserver(), &SimpleViewerApplication::OnStudyListReceived)); - } - else - { - SelectStudy(parameters["studyId"].as()); - } - } - - void OnStudyListReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isArray() && - response.size() >= 1) - { - SelectStudy(response[0].asString()); - } - } - - void OnStudyReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isObject() && response["Series"].isArray()) - { - for (size_t i=0; i < response["Series"].size(); i++) - { - context_->GetOrthancApiClient()->GetJsonAsync( - "/series/" + response["Series"][(int)i].asString(), - new Deprecated::DeprecatedCallable - (GetSharedObserver(), &SimpleViewerApplication::OnSeriesReceived)); - } - } - } - - void OnSeriesReceived(const Deprecated::OrthancApiClient::JsonResponseReadyMessage& message) - { - const Json::Value& response = message.GetJson(); - - if (response.isObject() && - response["Instances"].isArray() && - response["Instances"].size() > 0) - { - // keep track of all instances IDs - const std::string& seriesId = response["ID"].asString(); - seriesTags_[seriesId] = response; - instancesIdsPerSeriesId_[seriesId] = std::vector(); - for (size_t i = 0; i < response["Instances"].size(); i++) - { - const std::string& instanceId = response["Instances"][static_cast(i)].asString(); - instancesIdsPerSeriesId_[seriesId].push_back(instanceId); - } - - // load the first instance in the thumbnail - LoadThumbnailForSeries(seriesId, instancesIdsPerSeriesId_[seriesId][0]); - - // if this is the first thumbnail loaded, load the first instance in the mainWidget - Deprecated::SliceViewerWidget& widget = dynamic_cast(*GetCentralWidget()); - if (widget.GetLayerCount() == 0) - { - smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); - } - } - } - - void LoadThumbnailForSeries(const std::string& seriesId, const std::string& instanceId) - { - LOG(INFO) << "Loading thumbnail for series " << seriesId; - boost::shared_ptr thumbnailWidget(new Deprecated::SliceViewerWidget("thumbnail-series-" + seriesId)); - thumbnails_.push_back(thumbnailWidget); - thumbnailsLayout_->AddWidget(thumbnailWidget); - Register(*thumbnailWidget, &SimpleViewerApplication::OnWidgetGeometryChanged); - smartLoader_->SetFrameInWidget(*thumbnailWidget, 0, instanceId, 0); - thumbnailWidget->SetInteractor(*thumbnailInteractor_); - } - - void SelectStudy(const std::string& studyId) - { - LOG(INFO) << "Selecting study: " << studyId; - context_->GetOrthancApiClient()->GetJsonAsync( - "/studies/" + studyId, new Deprecated::DeprecatedCallable - (GetSharedObserver(), &SimpleViewerApplication::OnStudyReceived)); - } - - void OnWidgetGeometryChanged(const Deprecated::SliceViewerWidget::GeometryChangedMessage& message) - { - // TODO: The "const_cast" could probably be replaced by "mainWidget" - const_cast(message.GetOrigin()).FitContent(); - } - - void SelectSeriesInMainViewport(const std::string& seriesId) - { - Deprecated::SliceViewerWidget& widget = dynamic_cast(*GetCentralWidget()); - smartLoader_->SetFrameInWidget(widget, 0, instancesIdsPerSeriesId_[seriesId][0], 0); - } - - const Orthanc::Font& GetFont() const - { - return font_; - } - - virtual void OnPushButton1Clicked() {} - virtual void OnPushButton2Clicked() {} - virtual void OnTool1Clicked() { currentTool_ = Tool_LineMeasure;} - virtual void OnTool2Clicked() { currentTool_ = Tool_CircleMeasure;} - - virtual void GetButtonNames(std::string& pushButton1, - std::string& pushButton2, - std::string& tool1, - std::string& tool2) - { - tool1 = "line"; - tool2 = "circle"; - pushButton1 = "action1"; - pushButton2 = "action2"; - } - -#if ORTHANC_ENABLE_WASM==1 - virtual void InitializeWasm() - { - AttachWidgetToWasmViewport("canvas", thumbnailsLayout_); - AttachWidgetToWasmViewport("canvas2", widget); - } -#endif - - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,268 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Deprecated/Layers/DicomSeriesVolumeSlicer.h" -#include "../../../Framework/Deprecated/Widgets/SliceViewerWidget.h" - -#include -#include - -#include - - -namespace OrthancStone -{ - namespace Samples - { - class SingleFrameApplication : - public SampleSingleCanvasApplicationBase, - public ObserverBase - { - private: - class Interactor : public Deprecated::IWorldSceneInteractor - { - private: - SingleFrameApplication& application_; - - public: - Interactor(SingleFrameApplication& application) : - application_(application) - { - } - - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - return NULL; - } - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& widget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - { - if (statusBar != NULL) - { - Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); - - char buf[64]; - sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", - p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); - statusBar->SetMessage(buf); - } - } - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); - - switch (direction) - { - case MouseWheelDirection_Up: - application_.OffsetSlice(-scale); - break; - - case MouseWheelDirection_Down: - application_.OffsetSlice(scale); - break; - - default: - break; - } - } - - virtual void KeyPressed(Deprecated::WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - switch (keyChar) - { - case 's': - widget.FitContent(); - break; - - default: - break; - } - } - }; - - - void OffsetSlice(int offset) - { - if (source_) - { - int slice = static_cast(slice_) + offset; - - if (slice < 0) - { - slice = 0; - } - - if (slice >= static_cast(source_->GetSlicesCount())) - { - slice = static_cast(source_->GetSlicesCount()) - 1; - } - - if (slice != static_cast(slice_)) - { - SetSlice(slice); - } - } - } - - - void SetSlice(size_t index) - { - if (source_ && - index < source_->GetSlicesCount()) - { - slice_ = static_cast(index); - -#if 1 - widget_->SetSlice(source_->GetSlice(slice_).GetGeometry()); -#else - // TEST for scene extents - Rotate the axes - double a = 15.0 / 180.0 * boost::math::constants::pi(); - -#if 1 - Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); - Vector y; GeometryToolbox::AssignVector(y, -sin(a), cos(a), 0); -#else - // Flip the normal - Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); - Vector y; GeometryToolbox::AssignVector(y, sin(a), -cos(a), 0); -#endif - - SliceGeometry s(source_->GetSlice(slice_).GetGeometry().GetOrigin(), x, y); - widget_->SetSlice(s); -#endif - } - } - - - void OnMainWidgetGeometryReady(const Deprecated::IVolumeSlicer::GeometryReadyMessage& message) - { - // Once the geometry of the series is downloaded from Orthanc, - // display its middle slice, and adapt the viewport to fit this - // slice - if (source_ && - source_.get() == &message.GetOrigin()) - { - SetSlice(source_->GetSlicesCount() / 2); - } - - widget_->FitContent(); - } - - boost::shared_ptr widget_; - std::unique_ptr mainWidgetInteractor_; - boost::shared_ptr source_; - unsigned int slice_; - - public: - SingleFrameApplication() : - slice_(0) - { - } - - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("instance", boost::program_options::value(), - "Orthanc ID of the instance") - ("frame", boost::program_options::value()->default_value(0), - "Number of the frame, for multi-frame DICOM instances") - ("smooth", boost::program_options::value()->default_value(true), - "Enable bilinear interpolation to smooth the image") - ; - - options.add(generic); - } - - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - context_ = context; - - statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); - - if (parameters.count("instance") != 1) - { - LOG(ERROR) << "The instance ID is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string instance = parameters["instance"].as(); - int frame = parameters["frame"].as(); - - widget_.reset(new Deprecated::SliceViewerWidget("main-widget")); - SetCentralWidget(widget_); - - boost::shared_ptr layer(new Deprecated::DicomSeriesVolumeSlicer); - layer->Connect(context->GetOrthancApiClient()); - source_ = layer; - - layer->LoadFrame(instance, frame); - Register(*layer, &SingleFrameApplication::OnMainWidgetGeometryReady); - widget_->AddLayer(layer); - - Deprecated::RenderStyle s; - - if (parameters["smooth"].as()) - { - s.interpolation_ = ImageInterpolation_Bilinear; - } - - widget_->SetLayerStyle(0, s); - widget_->SetTransmitMouseOver(true); - - mainWidgetInteractor_.reset(new Interactor(*this)); - widget_->SetInteractor(*mainWidgetInteractor_); - } - }; - - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameEditorApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleFrameEditorApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,531 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Radiography/RadiographyLayerCropTracker.h" -#include "../../../Framework/Radiography/RadiographyLayerMaskTracker.h" -#include "../../../Framework/Radiography/RadiographyLayerMoveTracker.h" -#include "../../../Framework/Radiography/RadiographyLayerResizeTracker.h" -#include "../../../Framework/Radiography/RadiographyLayerRotateTracker.h" -#include "../../../Framework/Radiography/RadiographyMaskLayer.h" -#include "../../../Framework/Radiography/RadiographyScene.h" -#include "../../../Framework/Radiography/RadiographySceneCommand.h" -#include "../../../Framework/Radiography/RadiographySceneReader.h" -#include "../../../Framework/Radiography/RadiographySceneWriter.h" -#include "../../../Framework/Radiography/RadiographyWidget.h" -#include "../../../Framework/Radiography/RadiographyWindowingTracker.h" -#include "../../../Framework/Toolbox/TextRenderer.h" - -#include -#include -#include -#include -#include - - -// Export using PAM is faster than using PNG, but requires Orthanc -// core >= 1.4.3 -#define EXPORT_USING_PAM 1 - - -namespace OrthancStone -{ - namespace Samples - { - class RadiographyEditorInteractor : - public Deprecated::IWorldSceneInteractor, - public ObserverBase - { - private: - enum Tool - { - Tool_Move, - Tool_Rotate, - Tool_Crop, - Tool_Resize, - Tool_Mask, - Tool_Windowing - }; - - - StoneApplicationContext* context_; - UndoRedoStack undoRedoStack_; - Tool tool_; - RadiographyMaskLayer* maskLayer_; - - - static double GetHandleSize() - { - return 10.0; - } - - - public: - RadiographyEditorInteractor() : - context_(NULL), - tool_(Tool_Move), - maskLayer_(NULL) - { - } - - void SetContext(StoneApplicationContext& context) - { - context_ = &context; - } - - void SetMaskLayer(RadiographyMaskLayer* maskLayer) - { - maskLayer_ = maskLayer; - } - virtual Deprecated::IWorldSceneMouseTracker* CreateMouseTracker(Deprecated::WorldSceneWidget& worldWidget, - const Deprecated::ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - Deprecated::IStatusBar* statusBar, - const std::vector& displayTouches) - { - RadiographyWidget& widget = dynamic_cast(worldWidget); - - if (button == MouseButton_Left) - { - size_t selected; - - if (tool_ == Tool_Windowing) - { - return new RadiographyWindowingTracker( - undoRedoStack_, - widget.GetScene(), - widget, - OrthancStone::ImageInterpolation_Nearest, - viewportX, viewportY, - RadiographyWindowingTracker::Action_DecreaseWidth, - RadiographyWindowingTracker::Action_IncreaseWidth, - RadiographyWindowingTracker::Action_DecreaseCenter, - RadiographyWindowingTracker::Action_IncreaseCenter); - } - else if (!widget.LookupSelectedLayer(selected)) - { - // No layer is currently selected - size_t layer; - if (widget.GetScene().LookupLayer(layer, x, y)) - { - widget.Select(layer); - } - - return NULL; - } - else if (tool_ == Tool_Crop || - tool_ == Tool_Resize || - tool_ == Tool_Mask) - { - RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); - - ControlPoint controlPoint; - if (accessor.GetLayer().LookupControlPoint(controlPoint, x, y, view.GetZoom(), GetHandleSize())) - { - switch (tool_) - { - case Tool_Crop: - return new RadiographyLayerCropTracker - (undoRedoStack_, widget.GetScene(), view, selected, controlPoint); - - case Tool_Mask: - return new RadiographyLayerMaskTracker - (undoRedoStack_, widget.GetScene(), view, selected, controlPoint); - - case Tool_Resize: - return new RadiographyLayerResizeTracker - (undoRedoStack_, widget.GetScene(), selected, controlPoint, - (modifiers & KeyboardModifiers_Shift)); - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - } - else - { - size_t layer; - - if (widget.GetScene().LookupLayer(layer, x, y)) - { - widget.Select(layer); - } - else - { - widget.Unselect(); - } - - return NULL; - } - } - else - { - size_t layer; - - if (widget.GetScene().LookupLayer(layer, x, y)) - { - if (layer == selected) - { - switch (tool_) - { - case Tool_Move: - return new RadiographyLayerMoveTracker - (undoRedoStack_, widget.GetScene(), layer, x, y, - (modifiers & KeyboardModifiers_Shift)); - - case Tool_Rotate: - return new RadiographyLayerRotateTracker - (undoRedoStack_, widget.GetScene(), view, layer, x, y, - (modifiers & KeyboardModifiers_Shift)); - - default: - break; - } - - return NULL; - } - else - { - widget.Select(layer); - return NULL; - } - } - else - { - widget.Unselect(); - return NULL; - } - } - } - else - { - return NULL; - } - return NULL; - } - - virtual void MouseOver(CairoContext& context, - Deprecated::WorldSceneWidget& worldWidget, - const Deprecated::ViewportGeometry& view, - double x, - double y, - Deprecated::IStatusBar* statusBar) - { - RadiographyWidget& widget = dynamic_cast(worldWidget); - -#if 0 - if (statusBar != NULL) - { - char buf[64]; - sprintf(buf, "X = %.02f Y = %.02f (in cm)", x / 10.0, y / 10.0); - statusBar->SetMessage(buf); - } -#endif - - size_t selected; - - if (widget.LookupSelectedLayer(selected) && - (tool_ == Tool_Crop || - tool_ == Tool_Resize || - tool_ == Tool_Mask)) - { - RadiographyScene::LayerAccessor accessor(widget.GetScene(), selected); - - ControlPoint controlPoint; - if (accessor.GetLayer().LookupControlPoint(controlPoint, x, y, view.GetZoom(), GetHandleSize())) - { - double z = 1.0 / view.GetZoom(); - - context.SetSourceColor(255, 0, 0); - cairo_t* cr = context.GetObject(); - cairo_set_line_width(cr, 2.0 * z); - cairo_move_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); - cairo_line_to(cr, controlPoint.x + GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); - cairo_line_to(cr, controlPoint.x + GetHandleSize() * z, controlPoint.y + GetHandleSize() * z); - cairo_line_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y + GetHandleSize() * z); - cairo_line_to(cr, controlPoint.x - GetHandleSize() * z, controlPoint.y - GetHandleSize() * z); - cairo_stroke(cr); - } - } - } - - virtual void MouseWheel(Deprecated::WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - } - - virtual void KeyPressed(Deprecated::WorldSceneWidget& worldWidget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - Deprecated::IStatusBar* statusBar) - { - RadiographyWidget& widget = dynamic_cast(worldWidget); - - switch (keyChar) - { - case 'a': - widget.FitContent(); - break; - - case 'c': - tool_ = Tool_Crop; - break; - - case 'm': - tool_ = Tool_Mask; - widget.Select(1); - break; - - case 'd': - { - // dump to json and reload - Json::Value snapshot; - RadiographySceneWriter writer; - writer.Write(snapshot, widget.GetScene()); - - LOG(INFO) << "JSON export was successful: " - << snapshot.toStyledString(); - - boost::shared_ptr scene(new RadiographyScene); - RadiographySceneReader reader(*scene, *context_->GetOrthancApiClient()); - reader.Read(snapshot); - - widget.SetScene(scene); - };break; - - case 'e': - { - Orthanc::DicomMap tags; - - // Minimal set of tags to generate a valid CR image - tags.SetValue(Orthanc::DICOM_TAG_ACCESSION_NUMBER, "NOPE", false); - tags.SetValue(Orthanc::DICOM_TAG_BODY_PART_EXAMINED, "PELVIS", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); - //tags.SetValue(Orthanc::DICOM_TAG_LATERALITY, "", false); - tags.SetValue(Orthanc::DICOM_TAG_MANUFACTURER, "OSIMIS", false); - tags.SetValue(Orthanc::DICOM_TAG_MODALITY, "CR", false); - tags.SetValue(Orthanc::DICOM_TAG_PATIENT_BIRTH_DATE, "20000101", false); - tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ID, "hello", false); - tags.SetValue(Orthanc::DICOM_TAG_PATIENT_NAME, "HELLO^WORLD", false); - tags.SetValue(Orthanc::DICOM_TAG_PATIENT_ORIENTATION, "", false); - tags.SetValue(Orthanc::DICOM_TAG_PATIENT_SEX, "M", false); - tags.SetValue(Orthanc::DICOM_TAG_REFERRING_PHYSICIAN_NAME, "HOUSE^MD", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_NUMBER, "1", false); - tags.SetValue(Orthanc::DICOM_TAG_SOP_CLASS_UID, "1.2.840.10008.5.1.4.1.1.1", false); - tags.SetValue(Orthanc::DICOM_TAG_STUDY_ID, "STUDY", false); - tags.SetValue(Orthanc::DICOM_TAG_VIEW_POSITION, "", false); - - if (context_ != NULL) - { - widget.GetScene().ExportDicom(*context_->GetOrthancApiClient(), - tags, std::string(), 0.1, 0.1, widget.IsInverted(), - false /* autoCrop */, widget.GetInterpolation(), EXPORT_USING_PAM); - } - - break; - } - - case 'i': - widget.SwitchInvert(); - break; - - case 't': - tool_ = Tool_Move; - break; - - case 'n': - { - switch (widget.GetInterpolation()) - { - case ImageInterpolation_Nearest: - LOG(INFO) << "Switching to bilinear interpolation"; - widget.SetInterpolation(ImageInterpolation_Bilinear); - break; - - case ImageInterpolation_Bilinear: - LOG(INFO) << "Switching to nearest neighbor interpolation"; - widget.SetInterpolation(ImageInterpolation_Nearest); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - break; - } - - case 'r': - tool_ = Tool_Rotate; - break; - - case 's': - tool_ = Tool_Resize; - break; - - case 'w': - tool_ = Tool_Windowing; - break; - - case 'y': - if (modifiers & KeyboardModifiers_Control) - { - undoRedoStack_.Redo(); - widget.NotifyContentChanged(); - } - break; - - case 'z': - if (modifiers & KeyboardModifiers_Control) - { - undoRedoStack_.Undo(); - widget.NotifyContentChanged(); - } - break; - - default: - break; - } - } - }; - - - - class SingleFrameEditorApplication : - public SampleSingleCanvasApplicationBase, - public IObserver - { - private: - boost::shared_ptr scene_; - RadiographyEditorInteractor interactor_; - RadiographyMaskLayer* maskLayer_; - - public: - virtual ~SingleFrameEditorApplication() - { - LOG(WARNING) << "Destroying the application"; - } - - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("instance", boost::program_options::value(), - "Orthanc ID of the instance") - ("frame", boost::program_options::value()->default_value(0), - "Number of the frame, for multi-frame DICOM instances") - ; - - options.add(generic); - } - - virtual void Initialize(StoneApplicationContext* context, - Deprecated::IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - context_ = context; - interactor_.SetContext(*context); - - statusBar.SetMessage("Use the key \"a\" to reinitialize the layout"); - statusBar.SetMessage("Use the key \"c\" to crop"); - statusBar.SetMessage("Use the key \"e\" to export DICOM to the Orthanc server"); - statusBar.SetMessage("Use the key \"f\" to switch full screen"); - statusBar.SetMessage("Use the key \"i\" to invert contrast"); - statusBar.SetMessage("Use the key \"m\" to modify the mask"); - statusBar.SetMessage("Use the key \"n\" to switch between nearest neighbor and bilinear interpolation"); - statusBar.SetMessage("Use the key \"r\" to rotate objects"); - statusBar.SetMessage("Use the key \"s\" to resize objects (not applicable to DICOM layers)"); - statusBar.SetMessage("Use the key \"t\" to move (translate) objects"); - statusBar.SetMessage("Use the key \"w\" to change windowing"); - - statusBar.SetMessage("Use the key \"ctrl-z\" to undo action"); - statusBar.SetMessage("Use the key \"ctrl-y\" to redo action"); - - if (parameters.count("instance") != 1) - { - LOG(ERROR) << "The instance ID is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string instance = parameters["instance"].as(); - //int frame = parameters["frame"].as(); - - scene_.reset(new RadiographyScene); - - RadiographyLayer& dicomLayer = scene_->LoadDicomFrame(*context->GetOrthancApiClient(), instance, 0, false, NULL); - //scene_->LoadDicomFrame(instance, frame, false); //.SetPan(200, 0); - // = scene_->LoadDicomFrame(context->GetOrthancApiClient(), "61f3143e-96f34791-ad6bbb8d-62559e75-45943e1b", 0, false, NULL); - -#if !defined(ORTHANC_ENABLE_WASM) || ORTHANC_ENABLE_WASM != 1 - Orthanc::HttpClient::ConfigureSsl(true, "/etc/ssl/certs/ca-certificates.crt"); -#endif - - //scene_->LoadDicomWebFrame(context->GetWebService()); - - std::vector mask; - mask.push_back(Orthanc::ImageProcessing::ImagePoint(1100, 100)); - mask.push_back(Orthanc::ImageProcessing::ImagePoint(1100, 1000)); - mask.push_back(Orthanc::ImageProcessing::ImagePoint(2000, 1000)); - mask.push_back(Orthanc::ImageProcessing::ImagePoint(2200, 150)); - mask.push_back(Orthanc::ImageProcessing::ImagePoint(1500, 550)); - maskLayer_ = dynamic_cast(&(scene_->LoadMask(mask, dynamic_cast(dicomLayer), 128.0f, NULL))); - interactor_.SetMaskLayer(maskLayer_); - - { - std::unique_ptr renderedTextAlpha(TextRenderer::Render(Orthanc::EmbeddedResources::UBUNTU_FONT, 100, - "%ΓΆΓ‡aA&#")); - RadiographyLayer& layer = scene_->LoadAlphaBitmap(renderedTextAlpha.release(), NULL); - dynamic_cast(layer).SetForegroundValue(200.0f * 256.0f); - } - - { - RadiographyTextLayer::RegisterFont("ubuntu", Orthanc::EmbeddedResources::UBUNTU_FONT); - RadiographyLayer& layer = scene_->LoadText("Hello\nworld", "ubuntu", 20, 128, NULL, false); - layer.SetResizeable(true); - } - - { - RadiographyLayer& layer = scene_->LoadTestBlock(100, 50, NULL); - layer.SetResizeable(true); - layer.SetPan(0, 200); - } - - boost::shared_ptr widget(new RadiographyWidget(scene_, "main-widget")); - widget->SetTransmitMouseOver(true); - widget->SetInteractor(interactor_); - SetCentralWidget(widget); - - //scene_->SetWindowing(128, 256); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleVolumeApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SingleVolumeApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,277 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" -#include "../../../Framework/dev.h" -#include "../../../Framework/Layers/LineMeasureTracker.h" -#include "../../../Framework/Layers/CircleMeasureTracker.h" - -#include -#include - -#include // TODO REMOVE -#include "../../../Framework/Layers/DicomStructureSetSlicer.h" // TODO REMOVE -#include "../../../Framework/Toolbox/MessagingToolbox.h" // TODO REMOVE - -namespace OrthancStone -{ - namespace Samples - { - class SingleVolumeApplication : public SampleApplicationBase - { - private: - class Interactor : public VolumeImageInteractor - { - private: - SliceViewerWidget& widget_; - size_t layer_; - - protected: - virtual void NotifySliceContentChange(const ISlicedVolume& volume, - const size_t& sliceIndex, - const Slice& slice) - { - const OrthancVolumeImage& image = dynamic_cast(volume); - - RenderStyle s = widget_.GetLayerStyle(layer_); - - if (image.FitWindowingToRange(s, slice.GetConverter())) - { - //printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); - widget_.SetLayerStyle(layer_, s); - } - } - - virtual void MouseOver(CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) - { - const SliceViewerWidget& w = dynamic_cast(widget); - Vector p = w.GetSlice().MapSliceToWorldCoordinates(x, y); - printf("%f %f %f\n", p[0], p[1], p[2]); - } - - public: - Interactor(OrthancVolumeImage& volume, - SliceViewerWidget& widget, - VolumeProjection projection, - size_t layer) : - VolumeImageInteractor(volume, widget, projection), - widget_(widget), - layer_(layer) - { - } - }; - - - public: - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("series", boost::program_options::value(), - "Orthanc ID of the series") - ("instance", boost::program_options::value(), - "Orthanc ID of a multi-frame instance that describes a 3D volume") - ("threads", boost::program_options::value()->default_value(3), - "Number of download threads") - ("projection", boost::program_options::value()->default_value("axial"), - "Projection of interest (can be axial, sagittal or coronal)") - ("reverse", boost::program_options::value()->default_value(false), - "Reverse the normal direction of the volume") - ; - - options.add(generic); - } - - virtual void Initialize(IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - if (parameters.count("series") > 1 || - parameters.count("instance") > 1) - { - LOG(ERROR) << "Only one series or instance is allowed"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - if (parameters.count("series") == 1 && - parameters.count("instance") == 1) - { - LOG(ERROR) << "Cannot specify both a series and an instance"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::string series; - if (parameters.count("series") == 1) - { - series = parameters["series"].as(); - } - - std::string instance; - if (parameters.count("instance") == 1) - { - instance = parameters["instance"].as(); - } - - if (series.empty() && - instance.empty()) - { - LOG(ERROR) << "The series ID or instance ID is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - //unsigned int threads = parameters["threads"].as(); - //bool reverse = parameters["reverse"].as(); - - std::string tmp = parameters["projection"].as(); - Orthanc::Toolbox::ToLowerCase(tmp); - - VolumeProjection projection; - if (tmp == "axial") - { - projection = VolumeProjection_Axial; - } - else if (tmp == "sagittal") - { - projection = VolumeProjection_Sagittal; - } - else if (tmp == "coronal") - { - projection = VolumeProjection_Coronal; - } - else - { - LOG(ERROR) << "Unknown projection: " << tmp; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::unique_ptr widget(new SliceViewerWidget); - -#if 1 - std::unique_ptr volume(new OrthancVolumeImage(context.GetWebService(), true)); - if (series.empty()) - { - volume->ScheduleLoadInstance(instance); - } - else - { - volume->ScheduleLoadSeries(series); - } - - widget->AddLayer(new VolumeImageMPRSlicer(*volume)); - - context_->AddInteractor(new Interactor(*volume, *widget, projection, 0)); - context_->AddSlicedVolume(volume.release()); - - if (1) - { - RenderStyle s; - //s.drawGrid_ = true; - s.alpha_ = 1; - s.windowing_ = ImageWindowing_Bone; - widget->SetLayerStyle(0, s); - } - else - { - RenderStyle s; - s.alpha_ = 1; - s.applyLut_ = true; - s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; - s.interpolation_ = ImageInterpolation_Bilinear; - widget->SetLayerStyle(0, s); - } -#else - std::unique_ptr ct(new OrthancVolumeImage(context_->GetWebService(), false)); - //ct->ScheduleLoadSeries("15a6f44a-ac7b88fe-19c462d9-dddd918e-b01550d8"); // 0178023P - //ct->ScheduleLoadSeries("dd069910-4f090474-7d2bba07-e5c10783-f9e4fb1d"); - //ct->ScheduleLoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // IBA - //ct->ScheduleLoadSeries("03677739-1d8bca40-db1daf59-d74ff548-7f6fc9c0"); // 0522c0001 TCIA - ct->ScheduleLoadSeries("295e8a13-dfed1320-ba6aebb2-9a13e20f-1b3eb953"); // Captain - - std::unique_ptr pet(new OrthancVolumeImage(context_->GetWebService(), true)); - //pet->ScheduleLoadSeries("48d2997f-8e25cd81-dd715b64-bd79cdcc-e8fcee53"); // 0178023P - //pet->ScheduleLoadSeries("aabad2e7-80702b5d-e599d26c-4f13398e-38d58a9e"); - //pet->ScheduleLoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // IBA 1 - //pet->ScheduleLoadInstance("337876a1-a68a9718-f15abccd-38faafa1-b99b496a"); // IBA 2 - //pet->ScheduleLoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // IBA 3 - //pet->ScheduleLoadInstance("269f26f4-0c83eeeb-2e67abbd-5467a40f-f1bec90c"); // 0522c0001 TCIA - pet->ScheduleLoadInstance("f080888c-0ab7528a-f7d9c28c-84980eb1-ff3b0ae6"); // Captain 1 - //pet->ScheduleLoadInstance("4f78055b-6499a2c5-1e089290-394acc05-3ec781c1"); // Captain 2 - - std::unique_ptr rtStruct(new StructureSetLoader(context_->GetWebService())); - //rtStruct->ScheduleLoadInstance("c2ebc17b-6b3548db-5e5da170-b8ecab71-ea03add3"); // 0178023P - //rtStruct->ScheduleLoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // IBA - //rtStruct->ScheduleLoadInstance("17cd032b-ad92a438-ca05f06a-f9e96668-7e3e9e20"); // 0522c0001 TCIA - rtStruct->ScheduleLoadInstance("96c889ab-29fe5c54-dda6e66c-3949e4da-58f90d75"); // Captain - - widget->AddLayer(new VolumeImageMPRSlicer(*ct)); - widget->AddLayer(new VolumeImageMPRSlicer(*pet)); - widget->AddLayer(new DicomStructureSetSlicer(*rtStruct)); - - context_->AddInteractor(new Interactor(*pet, *widget, projection, 1)); - //context_->AddInteractor(new VolumeImageInteractor(*ct, *widget, projection)); - - context_->AddSlicedVolume(ct.release()); - context_->AddSlicedVolume(pet.release()); - context_->AddVolumeLoader(rtStruct.release()); - - { - RenderStyle s; - //s.drawGrid_ = true; - s.alpha_ = 1; - s.windowing_ = ImageWindowing_Bone; - widget->SetLayerStyle(0, s); - } - - { - RenderStyle s; - //s.drawGrid_ = true; - s.SetColor(255, 0, 0); // Draw missing PET layer in red - s.alpha_ = 0.5; - s.applyLut_ = true; - s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; - s.interpolation_ = ImageInterpolation_Bilinear; - s.windowing_ = ImageWindowing_Custom; - s.customWindowCenter_ = 0; - s.customWindowWidth_ = 128; - widget->SetLayerStyle(1, s); - } -#endif - - - statusBar.SetMessage("Use the keys \"b\", \"l\" and \"d\" to change Hounsfield windowing"); - statusBar.SetMessage("Use the keys \"t\" to track the (X,Y,Z) mouse coordinates"); - statusBar.SetMessage("Use the keys \"m\" to measure distances"); - statusBar.SetMessage("Use the keys \"c\" to draw circles"); - - widget->SetTransmitMouseOver(true); - context_->SetCentralWidget(widget.release()); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands.yml --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands.yml Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -# -# 1 2 3 4 5 6 7 8 -# 345678901234567890123456789012345678901234567890123456789012345678901234567890 -# -rootName: StoneSampleCommands - -# +---------------------------------+ -# | Messages from TypeScript to C++ | -# +---------------------------------+ - -enum Tool: - - LineMeasure - - CircleMeasure - - Crop - - Windowing - - Zoom - - Pan - - Move - - Rotate - - Resize - - Mask - -struct SelectTool: - __handler: cpp - tool: Tool - -enum ActionType: - - UndoCrop - - Rotate - - Invert - -struct Action: - __handler: cpp - type: ActionType - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generate.py --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generate.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -import sys -import os - -# add the generation script location to the search paths -sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'Resources', 'CodeGeneration')) - -# import the code generation tooling script -import stonegentool - -schemaFile = os.path.join(os.path.dirname(__file__), 'StoneSampleCommands.yml') -outDir = os.path.dirname(__file__) - -# ignition! -stonegentool.Process(schemaFile, outDir) - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.hpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.hpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,703 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 - -Generated on 2019-03-18 12:07:42.696093 by stonegentool - -*/ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -//#define STONEGEN_NO_CPP11 1 - -#ifdef STONEGEN_NO_CPP11 -#define StoneSmartPtr std::unique_ptr -#else -#define StoneSmartPtr std::unique_ptr -#endif - -namespace StoneSampleCommands -{ - /** Throws in case of problem */ - inline void _StoneDeserializeValue(int32_t& destValue, const Json::Value& jsonValue) - { - destValue = jsonValue.asInt(); - } - - inline Json::Value _StoneSerializeValue(int32_t value) - { - Json::Value result(value); - return result; - } - - inline void _StoneDeserializeValue(Json::Value& destValue, const Json::Value& jsonValue) - { - destValue = jsonValue; - } - - inline Json::Value _StoneSerializeValue(Json::Value value) - { - return value; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue(double& destValue, const Json::Value& jsonValue) - { - destValue = jsonValue.asDouble(); - } - - inline Json::Value _StoneSerializeValue(double value) - { - Json::Value result(value); - return result; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue(bool& destValue, const Json::Value& jsonValue) - { - destValue = jsonValue.asBool(); - } - - inline Json::Value _StoneSerializeValue(bool value) - { - Json::Value result(value); - return result; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue( - std::string& destValue - , const Json::Value& jsonValue) - { - destValue = jsonValue.asString(); - } - - inline Json::Value _StoneSerializeValue(const std::string& value) - { - // the following is better than - Json::Value result(value.data(),value.data()+value.size()); - return result; - } - - inline std::string MakeIndent(size_t indent) - { - char* txt = reinterpret_cast(malloc(indent+1)); // NO EXCEPTION BELOW!!!!!!!!!!!! - for(size_t i = 0; i < indent; ++i) - txt[i] = ' '; - txt[indent] = 0; - std::string retVal(txt); - free(txt); // NO EXCEPTION ABOVE !!!!!!!!!! - return retVal; - } - - // generic dumper - template - std::ostream& StoneDumpValue(std::ostream& out, const T& value, size_t indent) - { - out << MakeIndent(indent) << value; - return out; - } - - // string dumper - inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, size_t indent) - { - out << MakeIndent(indent) << "\"" << value << "\""; - return out; - } - - /** Throws in case of problem */ - template - void _StoneDeserializeValue( - std::map& destValue, const Json::Value& jsonValue) - { - destValue.clear(); - for ( - Json::Value::const_iterator itr = jsonValue.begin(); - itr != jsonValue.end(); - itr++) - { - std::string key; - _StoneDeserializeValue(key, itr.key()); - - T innerDestValue; - _StoneDeserializeValue(innerDestValue, *itr); - - destValue[key] = innerDestValue; - } - } - - template - Json::Value _StoneSerializeValue(const std::map& value) - { - Json::Value result(Json::objectValue); - - for (typename std::map::const_iterator it = value.cbegin(); - it != value.cend(); ++it) - { - // it->first it->second - result[it->first] = _StoneSerializeValue(it->second); - } - return result; - } - - template - std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, size_t indent) - { - out << MakeIndent(indent) << "{\n"; - for (typename std::map::const_iterator it = value.cbegin(); - it != value.cend(); ++it) - { - out << MakeIndent(indent+2) << "\"" << it->first << "\" : "; - StoneDumpValue(out, it->second, indent+2); - } - out << MakeIndent(indent) << "}\n"; - return out; - } - - /** Throws in case of problem */ - template - void _StoneDeserializeValue( - std::vector& destValue, const Json::Value& jsonValue) - { - destValue.clear(); - destValue.reserve(jsonValue.size()); - for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) - { - T innerDestValue; - _StoneDeserializeValue(innerDestValue, jsonValue[i]); - destValue.push_back(innerDestValue); - } - } - - template - Json::Value _StoneSerializeValue(const std::vector& value) - { - Json::Value result(Json::arrayValue); - for (size_t i = 0; i < value.size(); ++i) - { - result.append(_StoneSerializeValue(value[i])); - } - return result; - } - - template - std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, size_t indent) - { - out << MakeIndent(indent) << "[\n"; - for (size_t i = 0; i < value.size(); ++i) - { - StoneDumpValue(out, value[i], indent+2); - } - out << MakeIndent(indent) << "]\n"; - return out; - } - - inline void StoneCheckSerializedValueTypeGeneric(const Json::Value& value) - { - if ((!value.isMember("type")) || (!value["type"].isString())) - { - std::stringstream ss; - ss << "Cannot deserialize value ('type' key invalid)"; - throw std::runtime_error(ss.str()); - } - } - - inline void StoneCheckSerializedValueType( - const Json::Value& value, std::string typeStr) - { - StoneCheckSerializedValueTypeGeneric(value); - - std::string actTypeStr = value["type"].asString(); - if (actTypeStr != typeStr) - { - std::stringstream ss; - ss << "Cannot deserialize type" << actTypeStr - << "into " << typeStr; - throw std::runtime_error(ss.str()); - } - } - - // end of generic methods - -// end of generic methods - - enum Tool { - Tool_LineMeasure, - Tool_CircleMeasure, - Tool_Crop, - Tool_Windowing, - Tool_Zoom, - Tool_Pan, - Tool_Move, - Tool_Rotate, - Tool_Resize, - Tool_Mask, - }; - - inline std::string ToString(const Tool& value) - { - if( value == Tool_LineMeasure) - { - return std::string("LineMeasure"); - } - if( value == Tool_CircleMeasure) - { - return std::string("CircleMeasure"); - } - if( value == Tool_Crop) - { - return std::string("Crop"); - } - if( value == Tool_Windowing) - { - return std::string("Windowing"); - } - if( value == Tool_Zoom) - { - return std::string("Zoom"); - } - if( value == Tool_Pan) - { - return std::string("Pan"); - } - if( value == Tool_Move) - { - return std::string("Move"); - } - if( value == Tool_Rotate) - { - return std::string("Rotate"); - } - if( value == Tool_Resize) - { - return std::string("Resize"); - } - if( value == Tool_Mask) - { - return std::string("Mask"); - } - std::stringstream ss; - ss << "Value \"" << value << "\" cannot be converted to Tool. Possible values are: " - << " LineMeasure = " << static_cast(Tool_LineMeasure) << ", " - << " CircleMeasure = " << static_cast(Tool_CircleMeasure) << ", " - << " Crop = " << static_cast(Tool_Crop) << ", " - << " Windowing = " << static_cast(Tool_Windowing) << ", " - << " Zoom = " << static_cast(Tool_Zoom) << ", " - << " Pan = " << static_cast(Tool_Pan) << ", " - << " Move = " << static_cast(Tool_Move) << ", " - << " Rotate = " << static_cast(Tool_Rotate) << ", " - << " Resize = " << static_cast(Tool_Resize) << ", " - << " Mask = " << static_cast(Tool_Mask) << ", " - << std::endl; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - inline void FromString(Tool& value, std::string strValue) - { - if( strValue == std::string("LineMeasure") ) - { - value = Tool_LineMeasure; - return; - } - if( strValue == std::string("CircleMeasure") ) - { - value = Tool_CircleMeasure; - return; - } - if( strValue == std::string("Crop") ) - { - value = Tool_Crop; - return; - } - if( strValue == std::string("Windowing") ) - { - value = Tool_Windowing; - return; - } - if( strValue == std::string("Zoom") ) - { - value = Tool_Zoom; - return; - } - if( strValue == std::string("Pan") ) - { - value = Tool_Pan; - return; - } - if( strValue == std::string("Move") ) - { - value = Tool_Move; - return; - } - if( strValue == std::string("Rotate") ) - { - value = Tool_Rotate; - return; - } - if( strValue == std::string("Resize") ) - { - value = Tool_Resize; - return; - } - if( strValue == std::string("Mask") ) - { - value = Tool_Mask; - return; - } - - std::stringstream ss; - ss << "String \"" << strValue << "\" cannot be converted to Tool. Possible values are: LineMeasure CircleMeasure Crop Windowing Zoom Pan Move Rotate Resize Mask "; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - - inline void _StoneDeserializeValue( - Tool& destValue, const Json::Value& jsonValue) - { - FromString(destValue, jsonValue.asString()); - } - - inline Json::Value _StoneSerializeValue(const Tool& value) - { - std::string strValue = ToString(value); - return Json::Value(strValue); - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const Tool& value, size_t indent = 0) - { - if( value == Tool_LineMeasure) - { - out << MakeIndent(indent) << "LineMeasure" << std::endl; - } - if( value == Tool_CircleMeasure) - { - out << MakeIndent(indent) << "CircleMeasure" << std::endl; - } - if( value == Tool_Crop) - { - out << MakeIndent(indent) << "Crop" << std::endl; - } - if( value == Tool_Windowing) - { - out << MakeIndent(indent) << "Windowing" << std::endl; - } - if( value == Tool_Zoom) - { - out << MakeIndent(indent) << "Zoom" << std::endl; - } - if( value == Tool_Pan) - { - out << MakeIndent(indent) << "Pan" << std::endl; - } - if( value == Tool_Move) - { - out << MakeIndent(indent) << "Move" << std::endl; - } - if( value == Tool_Rotate) - { - out << MakeIndent(indent) << "Rotate" << std::endl; - } - if( value == Tool_Resize) - { - out << MakeIndent(indent) << "Resize" << std::endl; - } - if( value == Tool_Mask) - { - out << MakeIndent(indent) << "Mask" << std::endl; - } - return out; - } - - - enum ActionType { - ActionType_UndoCrop, - ActionType_Rotate, - ActionType_Invert, - }; - - inline std::string ToString(const ActionType& value) - { - if( value == ActionType_UndoCrop) - { - return std::string("UndoCrop"); - } - if( value == ActionType_Rotate) - { - return std::string("Rotate"); - } - if( value == ActionType_Invert) - { - return std::string("Invert"); - } - std::stringstream ss; - ss << "Value \"" << value << "\" cannot be converted to ActionType. Possible values are: " - << " UndoCrop = " << static_cast(ActionType_UndoCrop) << ", " - << " Rotate = " << static_cast(ActionType_Rotate) << ", " - << " Invert = " << static_cast(ActionType_Invert) << ", " - << std::endl; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - inline void FromString(ActionType& value, std::string strValue) - { - if( strValue == std::string("UndoCrop") ) - { - value = ActionType_UndoCrop; - return; - } - if( strValue == std::string("Rotate") ) - { - value = ActionType_Rotate; - return; - } - if( strValue == std::string("Invert") ) - { - value = ActionType_Invert; - return; - } - - std::stringstream ss; - ss << "String \"" << strValue << "\" cannot be converted to ActionType. Possible values are: UndoCrop Rotate Invert "; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - - inline void _StoneDeserializeValue( - ActionType& destValue, const Json::Value& jsonValue) - { - FromString(destValue, jsonValue.asString()); - } - - inline Json::Value _StoneSerializeValue(const ActionType& value) - { - std::string strValue = ToString(value); - return Json::Value(strValue); - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const ActionType& value, size_t indent = 0) - { - if( value == ActionType_UndoCrop) - { - out << MakeIndent(indent) << "UndoCrop" << std::endl; - } - if( value == ActionType_Rotate) - { - out << MakeIndent(indent) << "Rotate" << std::endl; - } - if( value == ActionType_Invert) - { - out << MakeIndent(indent) << "Invert" << std::endl; - } - return out; - } - - - -#ifdef _MSC_VER -#pragma region SelectTool -#endif //_MSC_VER - - struct SelectTool - { - Tool tool; - - SelectTool(Tool tool = Tool()) - { - this->tool = tool; - } - }; - - inline void _StoneDeserializeValue(SelectTool& destValue, const Json::Value& value) - { - _StoneDeserializeValue(destValue.tool, value["tool"]); - } - - inline Json::Value _StoneSerializeValue(const SelectTool& value) - { - Json::Value result(Json::objectValue); - result["tool"] = _StoneSerializeValue(value.tool); - - return result; - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const SelectTool& value, size_t indent = 0) - { - out << MakeIndent(indent) << "{\n"; - out << MakeIndent(indent) << "tool:\n"; - StoneDumpValue(out, value.tool,indent+2); - out << "\n"; - - out << MakeIndent(indent) << "}\n"; - return out; - } - - inline void StoneDeserialize(SelectTool& destValue, const Json::Value& value) - { - StoneCheckSerializedValueType(value, "StoneSampleCommands.SelectTool"); - _StoneDeserializeValue(destValue, value["value"]); - } - - inline Json::Value StoneSerializeToJson(const SelectTool& value) - { - Json::Value result(Json::objectValue); - result["type"] = "StoneSampleCommands.SelectTool"; - result["value"] = _StoneSerializeValue(value); - return result; - } - - inline std::string StoneSerialize(const SelectTool& value) - { - Json::Value resultJson = StoneSerializeToJson(value); - std::string resultStr = resultJson.toStyledString(); - return resultStr; - } - -#ifdef _MSC_VER -#pragma endregion SelectTool -#endif //_MSC_VER - -#ifdef _MSC_VER -#pragma region Action -#endif //_MSC_VER - - struct Action - { - ActionType type; - - Action(ActionType type = ActionType()) - { - this->type = type; - } - }; - - inline void _StoneDeserializeValue(Action& destValue, const Json::Value& value) - { - _StoneDeserializeValue(destValue.type, value["type"]); - } - - inline Json::Value _StoneSerializeValue(const Action& value) - { - Json::Value result(Json::objectValue); - result["type"] = _StoneSerializeValue(value.type); - - return result; - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const Action& value, size_t indent = 0) - { - out << MakeIndent(indent) << "{\n"; - out << MakeIndent(indent) << "type:\n"; - StoneDumpValue(out, value.type,indent+2); - out << "\n"; - - out << MakeIndent(indent) << "}\n"; - return out; - } - - inline void StoneDeserialize(Action& destValue, const Json::Value& value) - { - StoneCheckSerializedValueType(value, "StoneSampleCommands.Action"); - _StoneDeserializeValue(destValue, value["value"]); - } - - inline Json::Value StoneSerializeToJson(const Action& value) - { - Json::Value result(Json::objectValue); - result["type"] = "StoneSampleCommands.Action"; - result["value"] = _StoneSerializeValue(value); - return result; - } - - inline std::string StoneSerialize(const Action& value) - { - Json::Value resultJson = StoneSerializeToJson(value); - std::string resultStr = resultJson.toStyledString(); - return resultStr; - } - -#ifdef _MSC_VER -#pragma endregion Action -#endif //_MSC_VER - -#ifdef _MSC_VER -#pragma region Dispatching code -#endif //_MSC_VER - - class IHandler - { - public: - virtual bool Handle(const SelectTool& value) = 0; - virtual bool Handle(const Action& value) = 0; - }; - - /** Service function for StoneDispatchToHandler */ - inline bool StoneDispatchJsonToHandler( - const Json::Value& jsonValue, IHandler* handler) - { - StoneCheckSerializedValueTypeGeneric(jsonValue); - std::string type = jsonValue["type"].asString(); - if (type == "") - { - // this should never ever happen - throw std::runtime_error("Caught empty type while dispatching"); - } - else if (type == "StoneSampleCommands.SelectTool") - { - SelectTool value; - _StoneDeserializeValue(value, jsonValue["value"]); - return handler->Handle(value); - } - else if (type == "StoneSampleCommands.Action") - { - Action value; - _StoneDeserializeValue(value, jsonValue["value"]); - return handler->Handle(value); - } - else - { - return false; - } - } - - /** Takes a serialized type and passes this to the handler */ - inline bool StoneDispatchToHandler(std::string strValue, IHandler* handler) - { - Json::Value readValue; - - Json::CharReaderBuilder builder; - Json::CharReader* reader = builder.newCharReader(); - - StoneSmartPtr ptr(reader); - - std::string errors; - - bool ok = reader->parse( - strValue.c_str(), - strValue.c_str() + strValue.size(), - &readValue, - &errors - ); - if (!ok) - { - std::stringstream ss; - ss << "Jsoncpp parsing error: " << errors; - throw std::runtime_error(ss.str()); - } - return StoneDispatchJsonToHandler(readValue, handler); - } - -#ifdef _MSC_VER -#pragma endregion Dispatching code -#endif //_MSC_VER -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/StoneSampleCommands_generated.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,333 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 - -Generated on 2019-03-18 12:07:42.696093 by stonegentool - -*/ - -function StoneCheckSerializedValueType(value: any, typeStr: string) -{ - StoneCheckSerializedValueTypeGeneric(value); - - if (value['type'] != typeStr) - { - throw new Error( - `Cannot deserialize type ${value['type']} into ${typeStr}`); - } -} - -function isString(val: any) :boolean -{ - return ((typeof val === 'string') || (val instanceof String)); -} - -function StoneCheckSerializedValueTypeGeneric(value: any) -{ - // console.//log("+-------------------------------------------------+"); - // console.//log("| StoneCheckSerializedValueTypeGeneric |"); - // console.//log("+-------------------------------------------------+"); - // console.//log("value = "); - // console.//log(value); - if ( (!('type' in value)) || (!isString(value.type)) ) - { - throw new Error( - "Cannot deserialize value ('type' key invalid)"); - } -} - -// end of generic methods - -export enum Tool { - LineMeasure = "LineMeasure", - CircleMeasure = "CircleMeasure", - Crop = "Crop", - Windowing = "Windowing", - Zoom = "Zoom", - Pan = "Pan", - Move = "Move", - Rotate = "Rotate", - Resize = "Resize", - Mask = "Mask" -}; - -export function Tool_FromString(strValue:string) : Tool -{ - if( strValue == "LineMeasure" ) - { - return Tool.LineMeasure; - } - if( strValue == "CircleMeasure" ) - { - return Tool.CircleMeasure; - } - if( strValue == "Crop" ) - { - return Tool.Crop; - } - if( strValue == "Windowing" ) - { - return Tool.Windowing; - } - if( strValue == "Zoom" ) - { - return Tool.Zoom; - } - if( strValue == "Pan" ) - { - return Tool.Pan; - } - if( strValue == "Move" ) - { - return Tool.Move; - } - if( strValue == "Rotate" ) - { - return Tool.Rotate; - } - if( strValue == "Resize" ) - { - return Tool.Resize; - } - if( strValue == "Mask" ) - { - return Tool.Mask; - } - - let msg : string = `String ${strValue} cannot be converted to Tool. Possible values are: LineMeasure, CircleMeasure, Crop, Windowing, Zoom, Pan, Move, Rotate, Resize, Mask`; - throw new Error(msg); -} - -export function Tool_ToString(value:Tool) : string -{ - if( value == Tool.LineMeasure ) - { - return "LineMeasure"; - } - if( value == Tool.CircleMeasure ) - { - return "CircleMeasure"; - } - if( value == Tool.Crop ) - { - return "Crop"; - } - if( value == Tool.Windowing ) - { - return "Windowing"; - } - if( value == Tool.Zoom ) - { - return "Zoom"; - } - if( value == Tool.Pan ) - { - return "Pan"; - } - if( value == Tool.Move ) - { - return "Move"; - } - if( value == Tool.Rotate ) - { - return "Rotate"; - } - if( value == Tool.Resize ) - { - return "Resize"; - } - if( value == Tool.Mask ) - { - return "Mask"; - } - - let msg : string = `Value ${value} cannot be converted to Tool. Possible values are: `; - { - let _LineMeasure_enumValue : string = Tool.LineMeasure; // enums are strings in stonecodegen, so this will work. - let msg_LineMeasure : string = `LineMeasure (${_LineMeasure_enumValue}), `; - msg = msg + msg_LineMeasure; - } - { - let _CircleMeasure_enumValue : string = Tool.CircleMeasure; // enums are strings in stonecodegen, so this will work. - let msg_CircleMeasure : string = `CircleMeasure (${_CircleMeasure_enumValue}), `; - msg = msg + msg_CircleMeasure; - } - { - let _Crop_enumValue : string = Tool.Crop; // enums are strings in stonecodegen, so this will work. - let msg_Crop : string = `Crop (${_Crop_enumValue}), `; - msg = msg + msg_Crop; - } - { - let _Windowing_enumValue : string = Tool.Windowing; // enums are strings in stonecodegen, so this will work. - let msg_Windowing : string = `Windowing (${_Windowing_enumValue}), `; - msg = msg + msg_Windowing; - } - { - let _Zoom_enumValue : string = Tool.Zoom; // enums are strings in stonecodegen, so this will work. - let msg_Zoom : string = `Zoom (${_Zoom_enumValue}), `; - msg = msg + msg_Zoom; - } - { - let _Pan_enumValue : string = Tool.Pan; // enums are strings in stonecodegen, so this will work. - let msg_Pan : string = `Pan (${_Pan_enumValue}), `; - msg = msg + msg_Pan; - } - { - let _Move_enumValue : string = Tool.Move; // enums are strings in stonecodegen, so this will work. - let msg_Move : string = `Move (${_Move_enumValue}), `; - msg = msg + msg_Move; - } - { - let _Rotate_enumValue : string = Tool.Rotate; // enums are strings in stonecodegen, so this will work. - let msg_Rotate : string = `Rotate (${_Rotate_enumValue}), `; - msg = msg + msg_Rotate; - } - { - let _Resize_enumValue : string = Tool.Resize; // enums are strings in stonecodegen, so this will work. - let msg_Resize : string = `Resize (${_Resize_enumValue}), `; - msg = msg + msg_Resize; - } - { - let _Mask_enumValue : string = Tool.Mask; // enums are strings in stonecodegen, so this will work. - let msg_Mask : string = `Mask (${_Mask_enumValue})`; - msg = msg + msg_Mask; - } - throw new Error(msg); -} - -export enum ActionType { - UndoCrop = "UndoCrop", - Rotate = "Rotate", - Invert = "Invert" -}; - -export function ActionType_FromString(strValue:string) : ActionType -{ - if( strValue == "UndoCrop" ) - { - return ActionType.UndoCrop; - } - if( strValue == "Rotate" ) - { - return ActionType.Rotate; - } - if( strValue == "Invert" ) - { - return ActionType.Invert; - } - - let msg : string = `String ${strValue} cannot be converted to ActionType. Possible values are: UndoCrop, Rotate, Invert`; - throw new Error(msg); -} - -export function ActionType_ToString(value:ActionType) : string -{ - if( value == ActionType.UndoCrop ) - { - return "UndoCrop"; - } - if( value == ActionType.Rotate ) - { - return "Rotate"; - } - if( value == ActionType.Invert ) - { - return "Invert"; - } - - let msg : string = `Value ${value} cannot be converted to ActionType. Possible values are: `; - { - let _UndoCrop_enumValue : string = ActionType.UndoCrop; // enums are strings in stonecodegen, so this will work. - let msg_UndoCrop : string = `UndoCrop (${_UndoCrop_enumValue}), `; - msg = msg + msg_UndoCrop; - } - { - let _Rotate_enumValue : string = ActionType.Rotate; // enums are strings in stonecodegen, so this will work. - let msg_Rotate : string = `Rotate (${_Rotate_enumValue}), `; - msg = msg + msg_Rotate; - } - { - let _Invert_enumValue : string = ActionType.Invert; // enums are strings in stonecodegen, so this will work. - let msg_Invert : string = `Invert (${_Invert_enumValue})`; - msg = msg + msg_Invert; - } - throw new Error(msg); -} - - - -export class SelectTool { - tool:Tool; - - constructor() { - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'StoneSampleCommands.SelectTool'; - container['value'] = this; - return JSON.stringify(container); - } - - public static StoneDeserialize(valueStr: string) : SelectTool - { - let value: any = JSON.parse(valueStr); - StoneCheckSerializedValueType(value, 'StoneSampleCommands.SelectTool'); - let result: SelectTool = value['value'] as SelectTool; - return result; - } -} -export class Action { - type:ActionType; - - constructor() { - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'StoneSampleCommands.Action'; - container['value'] = this; - return JSON.stringify(container); - } - - public static StoneDeserialize(valueStr: string) : Action - { - let value: any = JSON.parse(valueStr); - StoneCheckSerializedValueType(value, 'StoneSampleCommands.Action'); - let result: Action = value['value'] as Action; - return result; - } -} - -export interface IHandler { -}; - -/** Service function for StoneDispatchToHandler */ -export function StoneDispatchJsonToHandler( - jsonValue: any, handler: IHandler): boolean -{ - StoneCheckSerializedValueTypeGeneric(jsonValue); - let type: string = jsonValue["type"]; - if (type == "") - { - // this should never ever happen - throw new Error("Caught empty type while dispatching"); - } - else - { - return false; - } -} - -/** Takes a serialized type and passes this to the handler */ -export function StoneDispatchToHandler( - strValue: string, handler: IHandler): boolean -{ - // console.//log("+------------------------------------------------+"); - // console.//log("| StoneDispatchToHandler |"); - // console.//log("+------------------------------------------------+"); - // console.//log("strValue = "); - // console.//log(strValue); - let jsonValue: any = JSON.parse(strValue) - return StoneDispatchJsonToHandler(jsonValue, handler); -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SynchronizedSeriesApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/SynchronizedSeriesApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleInteractor.h" - -#include "../../../Framework/Toolbox/OrthancSeriesLoader.h" -#include "../../../Framework/Layers/SeriesFrameRendererFactory.h" -#include "../../../Framework/Layers/ReferenceLineFactory.h" -#include "../../../Framework/Widgets/LayoutWidget.h" - -#include - -namespace OrthancStone -{ - namespace Samples - { - class SynchronizedSeriesApplication : public SampleApplicationBase - { - private: - LayeredSceneWidget* CreateSeriesWidget(BasicApplicationContext& context, - const std::string& series) - { - std::unique_ptr loader - (new OrthancSeriesLoader(context.GetWebService().GetConnection(), series)); - - std::unique_ptr interactor(new SampleInteractor(*loader, false)); - - std::unique_ptr widget(new LayeredSceneWidget); - widget->AddLayer(new SeriesFrameRendererFactory(loader.release(), false)); - widget->SetSlice(interactor->GetCursor().GetCurrentSlice()); - widget->SetInteractor(*interactor); - - context.AddInteractor(interactor.release()); - - return widget.release(); - } - - public: - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("a", boost::program_options::value(), - "Orthanc ID of the 1st series") - ("b", boost::program_options::value(), - "Orthanc ID of the 2nd series") - ("c", boost::program_options::value(), - "Orthanc ID of the 3rd series") - ; - - options.add(generic); - } - - virtual void Initialize(BasicApplicationContext& context, - IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - if (parameters.count("a") != 1 || - parameters.count("b") != 1 || - parameters.count("c") != 1) - { - LOG(ERROR) << "At least one of the three series IDs is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - std::unique_ptr a(CreateSeriesWidget(context, parameters["a"].as())); - std::unique_ptr b(CreateSeriesWidget(context, parameters["b"].as())); - std::unique_ptr c(CreateSeriesWidget(context, parameters["c"].as())); - - ReferenceLineFactory::Configure(*a, *b); - ReferenceLineFactory::Configure(*a, *c); - ReferenceLineFactory::Configure(*b, *c); - - std::unique_ptr layout(new LayoutWidget); - layout->SetPadding(5); - layout->AddWidget(a.release()); - - std::unique_ptr layoutB(new LayoutWidget); - layoutB->SetVertical(); - layoutB->SetPadding(5); - layoutB->AddWidget(b.release()); - layoutB->AddWidget(c.release()); - layout->AddWidget(layoutB.release()); - - context.SetCentralWidget(layout.release()); - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/TestPatternApplication.h --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/TestPatternApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "SampleApplicationBase.h" - -#include "../../../Framework/Widgets/TestCairoWidget.h" -#include "../../../Framework/Widgets/TestWorldSceneWidget.h" -#include "../../../Framework/Widgets/LayoutWidget.h" - -namespace OrthancStone -{ - namespace Samples - { - class TestPatternApplication : public SampleApplicationBase - { - public: - virtual void DeclareStartupOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description generic("Sample options"); - generic.add_options() - ("animate", boost::program_options::value()->default_value(true), "Animate the test pattern") - ; - - options.add(generic); - } - - virtual void Initialize(IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - std::unique_ptr layout(new LayoutWidget); - layout->SetPadding(10); - layout->SetBackgroundCleared(true); - layout->AddWidget(new TestCairoWidget(parameters["animate"].as())); - layout->AddWidget(new TestWorldSceneWidget(parameters["animate"].as())); - - context_->SetCentralWidget(layout.release()); - context_->SetUpdateDelay(25); // If animation, update the content each 25ms - } - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/index.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/index.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - Wasm Samples - - - - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/samples-styles.css --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/samples-styles.css Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0px; - border: 0; - overflow: hidden; /* Disable scrollbars */ - display: block; /* No floating content on sides */ - background-color: black; - color: white; - font-family: Arial, Helvetica, sans-serif; -} - -canvas { - left:0px; - top:0px; -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - - - Simple Viewer - - - - -
-
- -
-
- -
-
-
- line - circle - - -
- - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); - -wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSimpleViewerSingleFile", "/orthanc"); - -function SelectTool(toolName: string) { - var command = { - command: "selectTool", - args: { - toolName: toolName - } - }; - wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); - -} - -function PerformAction(commandName: string) { - var command = { - command: commandName, - commandType: "simple", - args: {} - }; - wasmApplicationRunner.SendSerializedMessageToStoneApplication(JSON.stringify(command)); -} - -//initializes the buttons -//----------------------- -// install "SelectTool" handlers -document.querySelectorAll("[tool-selector]").forEach((e) => { - console.log(e); - (e as HTMLInputElement).addEventListener("click", () => { - console.log(e); - SelectTool(e.attributes["tool-selector"].value); - }); -}); - -// install "PerformAction" handlers -document.querySelectorAll("[action-trigger]").forEach((e) => { - (e as HTMLInputElement).addEventListener("click", () => { - PerformAction(e.attributes["action-trigger"].value); - }); -}); - -// this method is called "from the C++ code" when the StoneApplication is updated. -// it can be used to update the UI of the application -function UpdateWebApplicationWithString(statusUpdateMessage: string) { - console.log(statusUpdateMessage); - - if (statusUpdateMessage.startsWith("series-description=")) { - document.getElementById("series-description").innerText = statusUpdateMessage.split("=")[1]; - } -} - -function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { - console.log("updating web application with serialized message: ", statusUpdateMessageString); - console.log(""); -} - -// make it available to other js scripts in the application -( window).UpdateWebApplicationWithString = UpdateWebApplicationWithString; - -( window).UpdateWebApplicationWithSerializedMessage = UpdateWebApplicationWithSerializedMessage; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.tsconfig.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/simple-viewer-single-file.tsconfig.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -{ - "extends" : "./tsconfig-samples", - "compilerOptions": { - // "outFile": "../build-web/app-simple-viewer-single-file.js" - }, - "include" : [ - "simple-viewer-single-file.ts" - ] -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - Simple Viewer - - - -
- -
- - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); - -wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrameEditor", "/orthanc"); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.tsconfig.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame-editor.tsconfig.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -{ - "extends" : "./tsconfig-samples", - "compilerOptions": { - }, - "include" : [ - "single-frame-editor.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - Simple Viewer - - - -
- -
- - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -import wasmApplicationRunner = require('../../../Platforms/Wasm/wasm-application-runner'); - -wasmApplicationRunner.InitializeWasmApplication("OrthancStoneSingleFrame", "/orthanc"); - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.tsconfig.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/single-frame.tsconfig.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -{ - "extends" : "./tsconfig-samples", - "compilerOptions": { - }, - "include" : [ - "single-frame.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/tsconfig-samples.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/Web/tsconfig-samples.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{ - "extends" : "../../../Platforms/Wasm/tsconfig-stone", - "compilerOptions": { - "sourceMap": false, - "lib" : [ - "es2017", - "dom", - "dom.iterable" - ] - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -#!/bin/bash -# -# usage: -# to build all targets in Debug: -# ./build-wasm.sh -# -# to build a single target in release: -# ./build-wasm.sh OrthancStoneSingleFrameEditor Release - -set -e - -target=${1:-all} -buildType=${2:-Debug} - -currentDir=$(pwd) -samplesRootDir=$(pwd) - -mkdir -p $samplesRootDir/build-wasm -cd $samplesRootDir/build-wasm - -source ~/apps/emsdk/emsdk_env.sh -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=~/apps/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=$buildType -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc -DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON -ninja $target - -echo "-- building the web application -- " -cd $currentDir -./build-web.sh \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh.old --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-wasm.sh.old Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -#!/bin/bash -# -# usage: -# to build all targets: -# ./build-wasm.sh -# -# to build a single target: -# ./build-wasm.sh OrthancStoneSingleFrameEditor - -set -e - -target=${1:-all} - -currentDir=$(pwd) -samplesRootDir=$(pwd) - -mkdir -p $samplesRootDir/build-wasm -cd $samplesRootDir/build-wasm - -source ~/apps/emsdk/emsdk_env.sh -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DSTONE_SOURCES_DIR=$currentDir/../../../orthanc-stone \ - -DORTHANC_FRAMEWORK_SOURCE=path \ - -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc \ - -DALLOW_DOWNLOADS=ON .. \ - -DENABLE_WASM=ON - -ninja $target - -echo "-- building the web application -- " -cd $currentDir -./build-web.sh diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web-ext.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web-ext.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -#!/bin/bash - -set -e - -target=${1:-all} -# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ - -currentDir=$(pwd) - -scriptDirRel=$(dirname $0) -#echo $scriptDirRel -scriptDirAbs=$(realpath $scriptDirRel) -echo $scriptDirAbs - -samplesRootDir=scriptDirAbs - -outputDir=$samplesRootDir/build-web/ -mkdir -p $outputDir - -# files used by all single files samples -cp $samplesRootDir/Web/index.html $outputDir -cp $samplesRootDir/Web/samples-styles.css $outputDir - -# build simple-viewer-single-file (obsolete project) -if [[ $target == "all" || $target == "OrthancStoneSimpleViewerSingleFile" ]]; then - cp $samplesRootDir/Web/simple-viewer-single-file.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm $outputDir -fi - -# build single-frame -if [[ $target == "all" || $target == "OrthancStoneSingleFrame" ]]; then - cp $samplesRootDir/Web/single-frame.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/single-frame.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSingleFrame.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSingleFrame.wasm $outputDir -fi - -# build single-frame-editor -if [[ $target == "all" || $target == "OrthancStoneSingleFrameEditor" ]]; then - cp $samplesRootDir/Web/single-frame-editor.html $outputDir - tsc --allowJs --project $samplesRootDir/Web/single-frame-editor.tsconfig.json - cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.js $outputDir - cp $currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm $outputDir -fi - -# build simple-viewer project -if [[ $target == "all" || $target == "OrthancStoneSimpleViewer" ]]; then - mkdir -p $outputDir/simple-viewer/ - cp $samplesRootDir/SimpleViewer/Wasm/simple-viewer.html $outputDir/simple-viewer/ - cp $samplesRootDir/SimpleViewer/Wasm/styles.css $outputDir/simple-viewer/ - tsc --allowJs --project $samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json - cp $currentDir/build-wasm/OrthancStoneSimpleViewer.js $outputDir/simple-viewer/ - cp $currentDir/build-wasm/OrthancStoneSimpleViewer.wasm $outputDir/simple-viewer/ -fi - -cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/build-web.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -#!/bin/bash - -set -e - -target=${1:-all} -# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ - -currentDir=$(pwd) -samplesRootDir=$(pwd) - -echo "*************************************************************************" -echo "samplesRootDir = $samplesRootDir" -echo "*************************************************************************" - -outputDir=$samplesRootDir/build-web/ -mkdir -p "$outputDir" - -# files used by all single files samples -cp "$samplesRootDir/Web/index.html" "$outputDir" -cp "$samplesRootDir/Web/samples-styles.css" "$outputDir" - -# # build simple-viewer-single-file (obsolete project) -# if [[ $target == "all" || $target == "OrthancStoneSimpleViewerSingleFile" ]]; then -# cp $samplesRootDir/Web/simple-viewer-single-file.html $outputDir -# tsc --project $samplesRootDir/Web/simple-viewer-single-file.tsconfig.json --outDir "$outputDir" -# browserify \ -# "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ -# "$outputDir/Applications/Samples/Web/simple-viewer-single-file.js" \ -# -o "$outputDir/app-simple-viewer-single-file.js" -# cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.js" $outputDir -# cp "$currentDir/build-wasm/OrthancStoneSimpleViewerSingleFile.wasm" $outputDir -# fi - -# # build single-frame -# if [[ $target == "all" || $target == "OrthancStoneSingleFrame" ]]; then -# cp $samplesRootDir/Web/single-frame.html $outputDir -# tsc --project $samplesRootDir/Web/single-frame.tsconfig.json --outDir "$outputDir" -# browserify \ -# "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ -# "$outputDir/Applications/Samples/Web/single-frame.js" \ -# -o "$outputDir/app-single-frame.js" -# cp "$currentDir/build-wasm/OrthancStoneSingleFrame.js" $outputDir -# cp "$currentDir/build-wasm/OrthancStoneSingleFrame.wasm" $outputDir -# fi - -# build single-frame-editor -if [[ $target == "all" || $target == "OrthancStoneSingleFrameEditor" ]]; then - cp $samplesRootDir/Web/single-frame-editor.html $outputDir - tsc --project $samplesRootDir/Web/single-frame-editor.tsconfig.json --outDir "$outputDir" - browserify \ - "$outputDir/Platforms/Wasm/wasm-application-runner.js" \ - "$outputDir/Applications/Samples/Web/single-frame-editor.js" \ - -o "$outputDir/app-single-frame-editor.js" - cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.js" $outputDir - cp "$currentDir/build-wasm/OrthancStoneSingleFrameEditor.wasm" $outputDir -fi - -# build simple-viewer project -if [[ $target == "all" || $target == "OrthancStoneSimpleViewer" ]]; then - mkdir -p $outputDir/simple-viewer/ - cp $samplesRootDir/SimpleViewer/Wasm/simple-viewer.html $outputDir/simple-viewer/ - cp $samplesRootDir/SimpleViewer/Wasm/styles.css $outputDir/simple-viewer/ - - # the root dir must contain all the source files for the whole project - tsc --module commonjs --allowJs --project "$samplesRootDir/SimpleViewer/Wasm/tsconfig-simple-viewer.json" --rootDir "$samplesRootDir/../.." --outDir "$outputDir/simple-viewer/" - browserify \ - "$outputDir/simple-viewer/Platforms/Wasm/wasm-application-runner.js" \ - "$outputDir/simple-viewer/Applications/Samples/SimpleViewer/Wasm/simple-viewer.js" \ - -o "$outputDir/simple-viewer/app-simple-viewer.js" - cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.js" "$outputDir/simple-viewer/" - cp "$currentDir/build-wasm/OrthancStoneSimpleViewer.wasm" "$outputDir/simple-viewer/" -fi - -cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/get-requirements-windows.ps1 --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/get-requirements-windows.ps1 Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ - -if ($true) { - - Write-Error "This script is obsolete. Please work under WSL and run build-wasm.sh" - -} else { - - param( - [IO.DirectoryInfo] $EmsdkRootDir = "C:\Emscripten", - [bool] $Overwrite = $false - ) - - if (Test-Path -Path $EmsdkRootDir) { - if( $Override) { - Remove-Item -Path $EmsdkRootDir -Force -Recurse - } else { - throw "The `"$EmsdkRootDir`" folder may not exist! Use the Overwrite flag to bypass this check." - } - } - - # TODO: detect whether git is installed - # choco install -y git - - Write-Host "Will retrieve the Emscripten SDK to the `"$EmsdkRootDir`" folder" - - $EmsdkParentDir = split-path -Parent $EmsdkRootDir - $EmsdkRootName = split-path -Leaf $EmsdkRootDir - - Push-Location $EmsdkParentDir - - git clone https://github.com/juj/emsdk.git $EmsdkRootName - cd $EmsdkRootName - - git pull - - ./emsdk install latest - - ./emsdk activate latest - - echo "INFO: the ~/.emscripten file has been configured for this installation of Emscripten." - - Write-Host "emsdk is now installed in $EmsdkRootDir" - - Pop-Location - -} - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/nginx.local.conf --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/nginx.local.conf Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -# Local config to serve the WASM samples static files and reverse proxy Orthanc. -# Uses port 9977 instead of 80. - -# `events` section is mandatory -events { - worker_connections 1024; # Default: 1024 -} - -http { - - # prevent nginx sync issues on OSX - proxy_buffering off; - - server { - listen 9977 default_server; - client_max_body_size 4G; - - # location may have to be adjusted depending on your OS and nginx install - include /etc/nginx/mime.types; - # if not in your system mime.types, add this line to support WASM: - # types { - # application/wasm wasm; - # } - - # serve WASM static files - root build-web/; - location / { - } - - # reverse proxy orthanc - location /orthanc/ { - rewrite /orthanc(.*) $1 break; - proxy_pass http://127.0.0.1:8042; - proxy_set_header Host $http_host; - proxy_set_header my-auth-header good-token; - proxy_request_buffering off; - proxy_max_temp_file_size 0; - client_max_body_size 0; - } - - - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/package-lock.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/package-lock.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==" - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(RtViewerDemo) - -if(MSVC) - add_definitions(/MP) - if (CMAKE_BUILD_TYPE MATCHES DEBUG) - add_definitions(/JMC) - endif() -endif() - -message("-------------------------------------------------------------------------------------------------------------------") -message("ORTHANC_FRAMEWORK_ROOT is set to ${ORTHANC_FRAMEWORK_ROOT}") -message("-------------------------------------------------------------------------------------------------------------------") - -if(NOT DEFINED ORTHANC_FRAMEWORK_ROOT) - message(FATAL_ERROR "The location of the Orthanc source repository must be set in the ORTHANC_FRAMEWORK_ROOT CMake variable") -endif() - -message("-------------------------------------------------------------------------------------------------------------------") -message("STONE_SOURCES_DIR is set to ${STONE_SOURCES_DIR}") -message("-------------------------------------------------------------------------------------------------------------------") - -if(NOT DEFINED STONE_SOURCES_DIR) - message(FATAL_ERROR "The location of the Stone of Orthanc source repository must be set in the STONE_SOURCES_DIR CMake variable") -endif() - -include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneParameters.cmake) - -if (OPENSSL_NO_CAPIENG) -add_definitions(-DOPENSSL_NO_CAPIENG=1) -endif() - -set(ENABLE_SDL OFF CACHE BOOL "Target SDL Native application") -set(ENABLE_QT OFF CACHE BOOL "Target Qt Native application") -set(ENABLE_WASM OFF CACHE BOOL "Target WASM application") - -if (ENABLE_WASM) - ##################################################################### - ## Configuration of the Emscripten compiler for WebAssembly target - ##################################################################### - - set(WASM_FLAGS "-s WASM=1") - set(WASM_FLAGS "${WASM_FLAGS} -s STRICT=1") # drops support for all deprecated build options - set(WASM_FLAGS "${WASM_FLAGS} -s FILESYSTEM=1") # if we don't include it, gen_uuid.c fails to build because srand, getpid(), ... are not defined - set(WASM_FLAGS "${WASM_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0") # actually enable exception catching - set(WASM_FLAGS "${WASM_FLAGS} -s ERROR_ON_MISSING_LIBRARIES=1") - - if (CMAKE_BUILD_TYPE MATCHES DEBUG) - set(WASM_FLAGS "${WASM_FLAGS} -g4") # generate debug information - set(WASM_FLAGS "${WASM_FLAGS} -s ASSERTIONS=2") # more runtime checks - else() - set(WASM_FLAGS "${WASM_FLAGS} -Os") # optimize for web (speed and size) - endif() - - set(WASM_MODULE_NAME "StoneFrameworkModule" CACHE STRING "Name of the WebAssembly module") - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${WASM_FLAGS}") # not always clear which flags are for the compiler and which one are for the linker -> pass them all to the linker too - # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Applications/Samples/samples-library.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"'") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_MEMORY=536870912") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s TOTAL_STACK=128000000") - - add_definitions(-DORTHANC_ENABLE_WASM=1) - set(ORTHANC_SANDBOXED ON) - -elseif (ENABLE_QT OR ENABLE_SDL) - - set(ENABLE_NATIVE ON) - set(ORTHANC_SANDBOXED OFF) - set(ENABLE_CRYPTO_OPTIONS ON) - set(ENABLE_GOOGLE_TEST ON) - set(ENABLE_WEB_CLIENT ON) - -endif() - - -##################################################################### -## Configuration for Orthanc -##################################################################### - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.4.1") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - -add_definitions( - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - ) - - -##################################################################### -## Build a static library containing the Orthanc Stone framework -##################################################################### - -LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) - -include(${STONE_SOURCES_DIR}/Resources/CMake/OrthancStoneConfiguration.cmake) - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - -##################################################################### -## Build all the sample applications -##################################################################### - -include_directories(${ORTHANC_STONE_ROOT}) - -list(APPEND RTVIEWERDEMO_APPLICATION_SOURCES - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleInteractor.h - ${ORTHANC_STONE_ROOT}/Applications/Samples/SampleApplicationBase.h - ) - -if (ENABLE_WASM) - list(APPEND RTVIEWERDEMO_APPLICATION_SOURCES - ${STONE_WASM_SOURCES} - ) -endif() - -add_executable(RtViewerDemo - main.cpp - ${RTVIEWERDEMO_APPLICATION_SOURCES} -) -set_target_properties(RtViewerDemo PROPERTIES COMPILE_DEFINITIONS ORTHANC_STONE_SAMPLE=3) -target_include_directories(RtViewerDemo PRIVATE ${ORTHANC_STONE_ROOT}) -target_link_libraries(RtViewerDemo OrthancStone) - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-sdl-msvc15.ps1 --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-sdl-msvc15.ps1 Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -if (-not (Test-Path "build-sdl-msvc15")) { - mkdir -p "build-sdl-msvc15" -} - -cd build-sdl-msvc15 - -cmake -G "Visual Studio 15 2017 Win64" -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DSTONE_SOURCES_DIR="$($pwd)\..\..\..\.." -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\..\..\..\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON .. - -if (!$?) { - Write-Error 'cmake configuration failed' -ErrorAction Stop -} - -cmake --build . --target RtViewerDemo --config Debug - -if (!$?) { - Write-Error 'cmake build failed' -ErrorAction Stop -} - -cd Debug - -.\RtViewerDemo.exe --ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-wasm.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-wasm.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -#!/bin/bash -# -# usage: -# build-wasm BUILD_TYPE -# where BUILD_TYPE is Debug, RelWithDebInfo or Release - -set -e - -buildType=${1:-Debug} - -currentDir=$(pwd) -currentDirAbs=$(realpath $currentDir) - -mkdir -p build-wasm -cd build-wasm - -source ~/apps/emsdk/emsdk_env.sh -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake \ --DCMAKE_BUILD_TYPE=$buildType -DSTONE_SOURCES_DIR=$currentDirAbs/../../../../orthanc-stone \ --DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=$currentDirAbs/../../../../orthanc \ --DALLOW_DOWNLOADS=ON .. -DENABLE_WASM=ON - -ninja $target - -echo "-- building the web application -- " -cd $currentDir -./build-web.sh - -echo "Launch start-serving-files.sh to access the web sample application locally" diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-web.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/build-web.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -#!/bin/bash - -set -e - -target=${1:-all} -# this script currently assumes that the wasm code has been built on its side and is availabie in build-wasm/ - -currentDir=$(pwd) -samplesRootDir=$(pwd) - -tscOutput=$samplesRootDir/build-tsc-output/ -outputDir=$samplesRootDir/build-web/ -mkdir -p "$outputDir" - -# files used by all single files samples -cp "$samplesRootDir/index.html" "$outputDir" -cp "$samplesRootDir/samples-styles.css" "$outputDir" - -# build rt-viewer-demo -cp $samplesRootDir/rt-viewer-demo.html $outputDir -tsc --project $samplesRootDir/rt-viewer-demo.tsconfig.json --outDir "$tscOutput" -browserify \ - "$tscOutput/orthanc-stone/Platforms/Wasm/logger.js" \ - "$tscOutput/orthanc-stone/Platforms/Wasm/stone-framework-loader.js" \ - "$tscOutput/orthanc-stone/Platforms/Wasm/wasm-application-runner.js" \ - "$tscOutput/orthanc-stone/Platforms/Wasm/wasm-viewport.js" \ - "$tscOutput/rt-viewer-sample/rt-viewer-demo.js" \ - -o "$outputDir/app-rt-viewer-demo.js" -cp "$currentDir/build-wasm/RtViewerDemo.js" $outputDir -cp "$currentDir/build-wasm/RtViewerDemo.wasm" $outputDir - -cd $currentDir diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/index.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/index.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ - - - - - - - - - - - - Wasm Samples - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/main.cpp --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/main.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,893 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "Applications/IStoneApplication.h" -#include "Framework/Widgets/WorldSceneWidget.h" -#include "Framework/Widgets/LayoutWidget.h" - -#if ORTHANC_ENABLE_WASM==1 - #include "Platforms/Wasm/WasmPlatformApplicationAdapter.h" - #include "Platforms/Wasm/Defaults.h" - #include "Platforms/Wasm/WasmViewport.h" -#endif - -#if ORTHANC_ENABLE_QT==1 - #include "Qt/SampleMainWindow.h" - #include "Qt/SampleMainWindowWithButtons.h" -#endif - -#include "Framework/Layers/DicomSeriesVolumeSlicer.h" -#include "Framework/Widgets/SliceViewerWidget.h" -#include "Framework/Volumes/StructureSetLoader.h" - -#include -#include -#include - -#include -#include "Framework/dev.h" -#include "Framework/Widgets/LayoutWidget.h" -#include "Framework/Layers/DicomStructureSetSlicer.h" - -namespace OrthancStone -{ - namespace Samples - { - class RtViewerDemoBaseApplication : public IStoneApplication - { - protected: - // ownership is transferred to the application context -#ifndef RESTORE_NON_RTVIEWERDEMO_BEHAVIOR - LayoutWidget* mainWidget_; -#else - WorldSceneWidget* mainWidget_; -#endif - - public: - virtual void Initialize(StoneApplicationContext* context, - IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) ORTHANC_OVERRIDE - { - } - - virtual std::string GetTitle() const ORTHANC_OVERRIDE - { - return "Stone of Orthanc - Sample"; - } - - /** - * In the basic samples, the commands are handled by the platform adapter and NOT - * by the application handler - */ - virtual void HandleSerializedMessage(const char* data) ORTHANC_OVERRIDE {}; - - - virtual void Finalize() ORTHANC_OVERRIDE {} - virtual IWidget* GetCentralWidget() ORTHANC_OVERRIDE {return mainWidget_;} - -#if ORTHANC_ENABLE_WASM==1 - // default implementations for a single canvas named "canvas" in the HTML and an empty WasmApplicationAdapter - - virtual void InitializeWasm() ORTHANC_OVERRIDE - { - AttachWidgetToWasmViewport("canvas", mainWidget_); - } - - virtual WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(MessageBroker& broker) - { - return new WasmPlatformApplicationAdapter(broker, *this); - } -#endif - - }; - - // this application actually works in Qt and WASM - class RtViewerDemoBaseSingleCanvasWithButtonsApplication : public RtViewerDemoBaseApplication - { -public: - virtual void OnPushButton1Clicked() {} - virtual void OnPushButton2Clicked() {} - virtual void OnTool1Clicked() {} - virtual void OnTool2Clicked() {} - - virtual void GetButtonNames(std::string& pushButton1, - std::string& pushButton2, - std::string& tool1, - std::string& tool2 - ) { - pushButton1 = "action1"; - pushButton2 = "action2"; - tool1 = "tool1"; - tool2 = "tool2"; - } - -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow() { - return new SampleMainWindowWithButtons(dynamic_cast(*context_), *this); - } -#endif - - }; - - // this application actually works in SDL and WASM - class RtViewerDemoBaseApplicationSingleCanvas : public RtViewerDemoBaseApplication - { -public: - -#if ORTHANC_ENABLE_QT==1 - virtual QStoneMainWindow* CreateQtMainWindow() { - return new SampleMainWindow(dynamic_cast(*context_), *this); - } -#endif - }; - } -} - - - -namespace OrthancStone -{ - namespace Samples - { - template - void ReadDistributionInternal(std::vector& distribution, - const Orthanc::ImageAccessor& image) - { - const unsigned int width = image.GetWidth(); - const unsigned int height = image.GetHeight(); - - distribution.resize(width * height); - size_t pos = 0; - - for (unsigned int y = 0; y < height; y++) - { - for (unsigned int x = 0; x < width; x++, pos++) - { - distribution[pos] = Orthanc::ImageTraits::GetFloatPixel(image, x, y); - } - } - } - - void ReadDistribution(std::vector& distribution, - const Orthanc::ImageAccessor& image) - { - switch (image.GetFormat()) - { - case Orthanc::PixelFormat_Grayscale8: - ReadDistributionInternal(distribution, image); - break; - - case Orthanc::PixelFormat_Grayscale16: - ReadDistributionInternal(distribution, image); - break; - - case Orthanc::PixelFormat_SignedGrayscale16: - ReadDistributionInternal(distribution, image); - break; - - case Orthanc::PixelFormat_Grayscale32: - ReadDistributionInternal(distribution, image); - break; - - case Orthanc::PixelFormat_Grayscale64: - ReadDistributionInternal(distribution, image); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - - class DoseInteractor : public VolumeImageInteractor - { - private: - SliceViewerWidget& widget_; - size_t layer_; - DicomFrameConverter converter_; - - - - protected: - virtual void NotifySliceChange(const ISlicedVolume& slicedVolume, - const size_t& sliceIndex, - const Slice& slice) - { - converter_ = slice.GetConverter(); - - #if 0 - const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); - - RenderStyle s = widget_.GetLayerStyle(layer_); - - if (volume.FitWindowingToRange(s, slice.GetConverter())) - { - printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); - widget_.SetLayerStyle(layer_, s); - } - #endif - } - - virtual void NotifyVolumeReady(const ISlicedVolume& slicedVolume) - { - const float percentile = 0.01f; - const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); - - std::vector distribution; - ReadDistribution(distribution, volume.GetImage().GetInternalImage()); - std::sort(distribution.begin(), distribution.end()); - - int start = static_cast(std::ceil(distribution.size() * percentile)); - int end = static_cast(std::floor(distribution.size() * (1.0f - percentile))); - - float a = 0; - float b = 0; - - if (start < end && - start >= 0 && - end < static_cast(distribution.size())) - { - a = distribution[start]; - b = distribution[end]; - } - else if (!distribution.empty()) - { - // Too small distribution: Use full range - a = distribution.front(); - b = distribution.back(); - } - - //printf("%f %f\n", a, b); - - RenderStyle s = widget_.GetLayerStyle(layer_); - s.windowing_ = ImageWindowing_Custom; - s.customWindowCenter_ = static_cast(converter_.Apply((a + b) / 2.0f)); - s.customWindowWidth_ = static_cast(converter_.Apply(b - a)); - - // 96.210556 => 192.421112 - widget_.SetLayerStyle(layer_, s); - printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); - } - - public: - DoseInteractor(MessageBroker& broker, OrthancVolumeImage& volume, - SliceViewerWidget& widget, - VolumeProjection projection, - size_t layer) : - VolumeImageInteractor(broker, volume, widget, projection), - widget_(widget), - layer_(layer) - { - } - }; - - class RtViewerDemoApplication : - public RtViewerDemoBaseApplicationSingleCanvas, - public IObserver - { - public: - std::vector > doseCtWidgetLayerPairs_; - std::list interactors_; - - class Interactor : public IWorldSceneInteractor - { - private: - RtViewerDemoApplication& application_; - - public: - Interactor(RtViewerDemoApplication& application) : - application_(application) - { - } - - virtual IWorldSceneMouseTracker* CreateMouseTracker(WorldSceneWidget& widget, - const ViewportGeometry& view, - MouseButton button, - KeyboardModifiers modifiers, - int viewportX, - int viewportY, - double x, - double y, - IStatusBar* statusBar, - const std::vector& displayTouches) - { - return NULL; - } - - virtual void MouseOver(CairoContext& context, - WorldSceneWidget& widget, - const ViewportGeometry& view, - double x, - double y, - IStatusBar* statusBar) - { - if (statusBar != NULL) - { - Vector p = dynamic_cast(widget).GetSlice().MapSliceToWorldCoordinates(x, y); - - char buf[64]; - sprintf(buf, "X = %.02f Y = %.02f Z = %.02f (in cm)", - p[0] / 10.0, p[1] / 10.0, p[2] / 10.0); - statusBar->SetMessage(buf); - } - } - - virtual void MouseWheel(WorldSceneWidget& widget, - MouseWheelDirection direction, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - int scale = (modifiers & KeyboardModifiers_Control ? 10 : 1); - - switch (direction) - { - case MouseWheelDirection_Up: - application_.OffsetSlice(-scale); - break; - - case MouseWheelDirection_Down: - application_.OffsetSlice(scale); - break; - - default: - break; - } - } - - virtual void KeyPressed(WorldSceneWidget& widget, - KeyboardKeys key, - char keyChar, - KeyboardModifiers modifiers, - IStatusBar* statusBar) - { - switch (keyChar) - { - case 's': - // TODO: recursively traverse children - widget.FitContent(); - break; - - default: - break; - } - } - }; - - void OffsetSlice(int offset) - { - if (source_ != NULL) - { - int slice = static_cast(slice_) + offset; - - if (slice < 0) - { - slice = 0; - } - - if (slice >= static_cast(source_->GetSliceCount())) - { - slice = static_cast(source_->GetSliceCount()) - 1; - } - - if (slice != static_cast(slice_)) - { - SetSlice(slice); - } - } - } - - - SliceViewerWidget& GetMainWidget() - { - return *dynamic_cast(mainWidget_); - } - - - void SetSlice(size_t index) - { - if (source_ != NULL && - index < source_->GetSliceCount()) - { - slice_ = static_cast(index); - -#if 1 - GetMainWidget().SetSlice(source_->GetSlice(slice_).GetGeometry()); -#else - // TEST for scene extents - Rotate the axes - double a = 15.0 / 180.0 * boost::math::constants::pi(); - -#if 1 - Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); - Vector y; GeometryToolbox::AssignVector(y, -sin(a), cos(a), 0); -#else - // Flip the normal - Vector x; GeometryToolbox::AssignVector(x, cos(a), sin(a), 0); - Vector y; GeometryToolbox::AssignVector(y, sin(a), -cos(a), 0); -#endif - - SliceGeometry s(source_->GetSlice(slice_).GetGeometry().GetOrigin(), x, y); - widget_->SetSlice(s); -#endif - } - } - - - void OnMainWidgetGeometryReady(const IVolumeSlicer::GeometryReadyMessage& message) - { - // Once the geometry of the series is downloaded from Orthanc, - // display its middle slice, and adapt the viewport to fit this - // slice - if (source_ == &message.GetOrigin()) - { - SetSlice(source_->GetSliceCount() / 2); - } - - GetMainWidget().FitContent(); - } - - DicomFrameConverter converter_; - - void OnSliceContentChangedMessage(const ISlicedVolume::SliceContentChangedMessage& message) - { - converter_ = message.GetSlice().GetConverter(); - } - - void OnVolumeReadyMessage(const ISlicedVolume::VolumeReadyMessage& message) - { - const float percentile = 0.01f; - - auto& slicedVolume = message.GetOrigin(); - const OrthancVolumeImage& volume = dynamic_cast(slicedVolume); - - std::vector distribution; - ReadDistribution(distribution, volume.GetImage().GetInternalImage()); - std::sort(distribution.begin(), distribution.end()); - - int start = static_cast(std::ceil(distribution.size() * percentile)); - int end = static_cast(std::floor(distribution.size() * (1.0f - percentile))); - - float a = 0; - float b = 0; - - if (start < end && - start >= 0 && - end < static_cast(distribution.size())) - { - a = distribution[start]; - b = distribution[end]; - } - else if (!distribution.empty()) - { - // Too small distribution: Use full range - a = distribution.front(); - b = distribution.back(); - } - - //printf("WINDOWING %f %f\n", a, b); - - for (const auto& pair : doseCtWidgetLayerPairs_) - { - auto widget = pair.first; - auto layer = pair.second; - RenderStyle s = widget->GetLayerStyle(layer); - s.windowing_ = ImageWindowing_Custom; - s.customWindowCenter_ = static_cast(converter_.Apply((a + b) / 2.0f)); - s.customWindowWidth_ = static_cast(converter_.Apply(b - a)); - - // 96.210556 => 192.421112 - widget->SetLayerStyle(layer, s); - printf("Windowing: %f => %f\n", s.customWindowCenter_, s.customWindowWidth_); - } - } - - - - size_t AddDoseLayer(SliceViewerWidget& widget, - OrthancVolumeImage& volume, VolumeProjection projection); - - void AddStructLayer( - SliceViewerWidget& widget, StructureSetLoader& loader); - - SliceViewerWidget* CreateDoseCtWidget( - std::unique_ptr& ct, - std::unique_ptr& dose, - std::unique_ptr& structLoader, - VolumeProjection projection); - - void AddCtLayer(SliceViewerWidget& widget, OrthancVolumeImage& volume); - - std::unique_ptr mainWidgetInteractor_; - const DicomSeriesVolumeSlicer* source_; - unsigned int slice_; - - std::string ctSeries_; - std::string doseInstance_; - std::string doseSeries_; - std::string structInstance_; - std::unique_ptr dose_; - std::unique_ptr ct_; - std::unique_ptr struct_; - - public: - RtViewerDemoApplication(MessageBroker& broker) : - IObserver(broker), - source_(NULL), - slice_(0) - { - } - - /* - dev options on bgo xps15 - - COMMAND LINE - --ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 - - URL PARAMETERS - ?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 - - */ - - void ParseParameters(const boost::program_options::variables_map& parameters) - { - // Generic - { - if (parameters.count("verbose")) - { - Orthanc::Logging::EnableInfoLevel(true); - LOG(INFO) << "Verbose logs (info) are enabled"; - } - } - - { - if (parameters.count("trace")) - { - LOG(INFO) << "parameters.count(\"trace\") != 0"; - Orthanc::Logging::EnableTraceLevel(true); - VLOG(1) << "Trace logs (debug) are enabled"; - } - } - - // CT series - { - - if (parameters.count("ct-series") != 1) - { - LOG(ERROR) << "There must be exactly one CT series specified"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - ctSeries_ = parameters["ct-series"].as(); - } - - // RTDOSE - { - if (parameters.count("dose-instance") == 1) - { - doseInstance_ = parameters["dose-instance"].as(); - } - else - { -#ifdef BGO_NOT_IMPLEMENTED_YET - // Dose series - if (parameters.count("dose-series") != 1) - { - LOG(ERROR) << "the RTDOSE series is missing"; - throw Orthanc::OrthancException( - Orthanc::ErrorCode_ParameterOutOfRange); - } - doseSeries_ = parameters["ct"].as(); -#endif - LOG(ERROR) << "the RTSTRUCT instance is missing"; - throw Orthanc::OrthancException( - Orthanc::ErrorCode_ParameterOutOfRange); - } - } - - // RTSTRUCT - { - if (parameters.count("struct-instance") == 1) - { - structInstance_ = parameters["struct-instance"].as(); - } - else - { -#ifdef BGO_NOT_IMPLEMENTED_YET - // Struct series - if (parameters.count("struct-series") != 1) - { - LOG(ERROR) << "the RTSTRUCT series is missing"; - throw Orthanc::OrthancException( - Orthanc::ErrorCode_ParameterOutOfRange); - } - structSeries_ = parameters["struct-series"].as(); -#endif - LOG(ERROR) << "the RTSTRUCT instance is missing"; - throw Orthanc::OrthancException( - Orthanc::ErrorCode_ParameterOutOfRange); - } - } - } - - virtual void DeclareStartupOptions( - boost::program_options::options_description& options) - { - boost::program_options::options_description generic( - "RtViewerDemo options. Please note that some of these options " - "are mutually exclusive"); - generic.add_options() - ("ct-series", boost::program_options::value(), - "Orthanc ID of the CT series") - ("dose-instance", boost::program_options::value(), - "Orthanc ID of the RTDOSE instance (incompatible with dose-series)") - ("dose-series", boost::program_options::value(), - "NOT IMPLEMENTED YET. Orthanc ID of the RTDOSE series (incompatible" - " with dose-instance)") - ("struct-instance", boost::program_options::value(), - "Orthanc ID of the RTSTRUCT instance (incompatible with struct-" - "series)") - ("struct-series", boost::program_options::value(), - "NOT IMPLEMENTED YET. Orthanc ID of the RTSTRUCT (incompatible with" - " struct-instance)") - ("smooth", boost::program_options::value()->default_value(true), - "Enable bilinear image smoothing") - ; - - options.add(generic); - } - - virtual void Initialize( - StoneApplicationContext* context, - IStatusBar& statusBar, - const boost::program_options::variables_map& parameters) - { - using namespace OrthancStone; - - ParseParameters(parameters); - - context_ = context; - - statusBar.SetMessage("Use the key \"s\" to reinitialize the layout"); - - if (!ctSeries_.empty()) - { - printf("CT = [%s]\n", ctSeries_.c_str()); - - ct_.reset(new OrthancStone::OrthancVolumeImage( - IObserver::GetBroker(), context->GetOrthancApiClient(), false)); - ct_->ScheduleLoadSeries(ctSeries_); - //ct_->ScheduleLoadSeries( - // "a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); - //ct_->ScheduleLoadSeries( - // "03677739-1d8bca40-db1daf59-d74ff548-7f6fc9c0"); - } - - if (!doseSeries_.empty() || - !doseInstance_.empty()) - { - dose_.reset(new OrthancStone::OrthancVolumeImage( - IObserver::GetBroker(), context->GetOrthancApiClient(), true)); - - - dose_->RegisterObserverCallback( - new Callable - (*this, &RtViewerDemoApplication::OnVolumeReadyMessage)); - - dose_->RegisterObserverCallback( - new Callable - (*this, &RtViewerDemoApplication::OnSliceContentChangedMessage)); - - if (doseInstance_.empty()) - { - dose_->ScheduleLoadSeries(doseSeries_); - } - else - { - dose_->ScheduleLoadInstance(doseInstance_); - } - - //dose_->ScheduleLoadInstance( - //"830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // 1 - //dose_->ScheduleLoadInstance( - //"269f26f4-0c83eeeb-2e67abbd-5467a40f-f1bec90c"); //0522c0001 TCIA - } - - if (!structInstance_.empty()) - { - struct_.reset(new OrthancStone::StructureSetLoader( - IObserver::GetBroker(), context->GetOrthancApiClient())); - - struct_->ScheduleLoadInstance(structInstance_); - - //struct_->ScheduleLoadInstance( - //"54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); - //struct_->ScheduleLoadInstance( - //"17cd032b-ad92a438-ca05f06a-f9e96668-7e3e9e20"); // 0522c0001 TCIA - } - - mainWidget_ = new LayoutWidget("main-layout"); - mainWidget_->SetBackgroundColor(0, 0, 0); - mainWidget_->SetBackgroundCleared(true); - mainWidget_->SetPadding(0); - - auto axialWidget = CreateDoseCtWidget - (ct_, dose_, struct_, OrthancStone::VolumeProjection_Axial); - mainWidget_->AddWidget(axialWidget); - - std::unique_ptr subLayout( - new OrthancStone::LayoutWidget("main-layout")); - subLayout->SetVertical(); - subLayout->SetPadding(5); - - auto coronalWidget = CreateDoseCtWidget - (ct_, dose_, struct_, OrthancStone::VolumeProjection_Coronal); - subLayout->AddWidget(coronalWidget); - - auto sagittalWidget = CreateDoseCtWidget - (ct_, dose_, struct_, OrthancStone::VolumeProjection_Sagittal); - subLayout->AddWidget(sagittalWidget); - - mainWidget_->AddWidget(subLayout.release()); - } - }; - - - size_t RtViewerDemoApplication::AddDoseLayer( - SliceViewerWidget& widget, - OrthancVolumeImage& volume, VolumeProjection projection) - { - size_t layer = widget.AddLayer( - new VolumeImageMPRSlicer(IObserver::GetBroker(), volume)); - - RenderStyle s; - //s.drawGrid_ = true; - s.SetColor(255, 0, 0); // Draw missing PET layer in red - s.alpha_ = 0.3f; - s.applyLut_ = true; - s.lut_ = Orthanc::EmbeddedResources::COLORMAP_JET; - s.interpolation_ = ImageInterpolation_Bilinear; - widget.SetLayerStyle(layer, s); - - return layer; - } - - void RtViewerDemoApplication::AddStructLayer( - SliceViewerWidget& widget, StructureSetLoader& loader) - { - widget.AddLayer(new DicomStructureSetSlicer( - IObserver::GetBroker(), loader)); - } - - SliceViewerWidget* RtViewerDemoApplication::CreateDoseCtWidget( - std::unique_ptr& ct, - std::unique_ptr& dose, - std::unique_ptr& structLoader, - VolumeProjection projection) - { - std::unique_ptr widget( - new OrthancStone::SliceViewerWidget(IObserver::GetBroker(), - "ct-dose-widget")); - - if (ct.get() != NULL) - { - AddCtLayer(*widget, *ct); - } - - if (dose.get() != NULL) - { - size_t layer = AddDoseLayer(*widget, *dose, projection); - - // we need to store the dose rendering widget because we'll update them - // according to various asynchronous events - doseCtWidgetLayerPairs_.push_back(std::make_pair(widget.get(), layer)); -#if 0 - interactors_.push_back(new VolumeImageInteractor( - IObserver::GetBroker(), *dose, *widget, projection)); -#else - interactors_.push_back(new DoseInteractor( - IObserver::GetBroker(), *dose, *widget, projection, layer)); -#endif - } - else if (ct.get() != NULL) - { - interactors_.push_back( - new VolumeImageInteractor( - IObserver::GetBroker(), *ct, *widget, projection)); - } - - if (structLoader.get() != NULL) - { - AddStructLayer(*widget, *structLoader); - } - - return widget.release(); - } - - void RtViewerDemoApplication::AddCtLayer( - SliceViewerWidget& widget, - OrthancVolumeImage& volume) - { - size_t layer = widget.AddLayer( - new VolumeImageMPRSlicer(IObserver::GetBroker(), volume)); - - RenderStyle s; - //s.drawGrid_ = true; - s.alpha_ = 1; - s.windowing_ = ImageWindowing_Bone; - widget.SetLayerStyle(layer, s); - } - } -} - - - -#if ORTHANC_ENABLE_WASM==1 - -#include "Platforms/Wasm/WasmWebService.h" -#include "Platforms/Wasm/WasmViewport.h" - -#include - -//#include "SampleList.h" - - -OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker) -{ - return new OrthancStone::Samples::RtViewerDemoApplication(broker); -} - -OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application) -{ - return dynamic_cast(application)->CreateWasmApplicationAdapter(broker); -} - -#else - -//#include "SampleList.h" -#if ORTHANC_ENABLE_SDL==1 -#include "Applications/Sdl/SdlStoneApplicationRunner.h" -#endif -#if ORTHANC_ENABLE_QT==1 -#include "Applications/Qt/SampleQtApplicationRunner.h" -#endif -#include "Framework/Messages/MessageBroker.h" - -int main(int argc, char* argv[]) -{ - OrthancStone::MessageBroker broker; - OrthancStone::Samples::RtViewerDemoApplication sampleStoneApplication(broker); - -#if ORTHANC_ENABLE_SDL==1 - OrthancStone::SdlStoneApplicationRunner sdlApplicationRunner(broker, sampleStoneApplication); - return sdlApplicationRunner.Execute(argc, argv); -#endif -#if ORTHANC_ENABLE_QT==1 - OrthancStone::Samples::SampleQtApplicationRunner qtAppRunner(broker, sampleStoneApplication); - return qtAppRunner.Execute(argc, argv); -#endif -} - - -#endif - - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/nginx.local.conf --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/nginx.local.conf Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -# Local config to serve the WASM samples static files and reverse proxy Orthanc. -# Uses port 9977 instead of 80. - -# `events` section is mandatory -events { - worker_connections 1024; # Default: 1024 -} - -http { - - # prevent nginx sync issues on OSX - proxy_buffering off; - - server { - listen 9977 default_server; - client_max_body_size 4G; - - # location may have to be adjusted depending on your OS and nginx install - include /etc/nginx/mime.types; - # if not in your system mime.types, add this line to support WASM: - # types { - # application/wasm wasm; - # } - - # serve WASM static files - root build-web/; - location / { - } - - # reverse proxy orthanc - location /orthanc/ { - rewrite /orthanc(.*) $1 break; - proxy_pass http://127.0.0.1:8042; - proxy_set_header Host $http_host; - proxy_set_header my-auth-header good-token; - proxy_request_buffering off; - proxy_max_temp_file_size 0; - client_max_body_size 0; - } - - - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.html --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - Simple Viewer - - - -
-

RTSTRUCT viewer demonstration

-
-
- -
- - - - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.ts --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -import { InitializeWasmApplication } from '../../../Platforms/Wasm/wasm-application-runner'; - - -InitializeWasmApplication("RtViewerDemo", "/orthanc"); - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.tsconfig.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/rt-viewer-demo.tsconfig.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -{ - "extends" : "./tsconfig-samples", - "compilerOptions": { - }, - "include" : [ - "rt-viewer-demo.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/samples-styles.css --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/samples-styles.css Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -html, body { - width: 100%; - height: 100%; - margin: 0px; - border: 0; - overflow: hidden; /* Disable scrollbars */ - display: block; /* No floating content on sides */ - background-color: black; - color: white; - font-family: Arial, Helvetica, sans-serif; -} - -canvas { - left:0px; - top:0px; -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/start-serving-files.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/start-serving-files.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -#!/bin/bash - -sudo nginx -p $(pwd) -c nginx.local.conf - -echo "Please browse to :" - -echo "http://localhost:9977/rt-viewer-demo.html?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9" - -echo "(This requires you have uploaded the correct files to your local Orthanc instance)" diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/stop-serving-files.sh --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/stop-serving-files.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -#!/bin/bash - -sudo nginx -s stop - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/tsconfig-samples.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/rt-viewer-demo/tsconfig-samples.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -{ - "extends" : "../../../Platforms/Wasm/tsconfig-stone.json", - "compilerOptions": { - "sourceMap": false, - "lib" : [ - "es2017", - "dom", - "dom.iterable" - ] - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/tsconfig-stone.json --- a/Resources/Graveyard/Deprecated/Applications/Samples/Deprecated/tsconfig-stone.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -{ - "include" : [ - "../../Platforms/Wasm/stone-framework-loader.ts", - "../../Platforms/Wasm/wasm-application-runner.ts", - "../../Platforms/Wasm/wasm-viewport.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.cpp --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlCairoSurface.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#include -#include - -namespace OrthancStone -{ - SdlCairoSurface::SdlCairoSurface(SdlWindow& window) : - window_(window), - sdlSurface_(NULL) - { - } - - - SdlCairoSurface::~SdlCairoSurface() - { - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - } - - - void SdlCairoSurface::SetSize(unsigned int width, - unsigned int height) - { - if (cairoSurface_.get() == NULL || - cairoSurface_->GetWidth() != width || - cairoSurface_->GetHeight() != height) - { - cairoSurface_.reset(new CairoSurface(width, height, false /* no alpha */)); - - // TODO Big endian? - static const uint32_t rmask = 0x00ff0000; - static const uint32_t gmask = 0x0000ff00; - static const uint32_t bmask = 0x000000ff; - - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - - sdlSurface_ = SDL_CreateRGBSurfaceFrom(cairoSurface_->GetBuffer(), width, height, 32, - cairoSurface_->GetPitch(), rmask, gmask, bmask, 0); - if (!sdlSurface_) - { - LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - - - void SdlCairoSurface::Render(Deprecated::IViewport& viewport) - { - if (cairoSurface_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - Orthanc::ImageAccessor target; - cairoSurface_->GetWriteableAccessor(target); - - if (viewport.Render(target)) - { - window_.Render(sdlSurface_); - } - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.h --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlCairoSurface.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include "../../Framework/Viewport/SdlWindow.h" -#include "../../Framework/Wrappers/CairoSurface.h" -#include "../../Framework/Deprecated/Viewport/IViewport.h" - -#include - -#include -#include - -namespace OrthancStone -{ - class SdlCairoSurface : public boost::noncopyable - { - private: - std::unique_ptr cairoSurface_; - SdlWindow& window_; - SDL_Surface* sdlSurface_; - - public: - SdlCairoSurface(SdlWindow& window); - - ~SdlCairoSurface(); - - void SetSize(unsigned int width, - unsigned int height); - - void Render(Deprecated::IViewport& viewport); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.cpp --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,282 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlEngine.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#include - -#include - -namespace OrthancStone -{ - void SdlEngine::SetSize(unsigned int width, - unsigned int height) - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context_); - locker.GetCentralViewport().SetSize(width, height); - surface_.SetSize(width, height); - } - - - void SdlEngine::RenderFrame() - { - if (viewportChanged_) - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context_); - surface_.Render(locker.GetCentralViewport()); - - viewportChanged_ = false; - } - } - - - KeyboardModifiers SdlEngine::GetKeyboardModifiers(const uint8_t* keyboardState, - const int scancodeCount) - { - int result = KeyboardModifiers_None; - - if (keyboardState != NULL) - { - if (SDL_SCANCODE_LSHIFT < scancodeCount && - keyboardState[SDL_SCANCODE_LSHIFT]) - { - result |= KeyboardModifiers_Shift; - } - - if (SDL_SCANCODE_RSHIFT < scancodeCount && - keyboardState[SDL_SCANCODE_RSHIFT]) - { - result |= KeyboardModifiers_Shift; - } - - if (SDL_SCANCODE_LCTRL < scancodeCount && - keyboardState[SDL_SCANCODE_LCTRL]) - { - result |= KeyboardModifiers_Control; - } - - if (SDL_SCANCODE_RCTRL < scancodeCount && - keyboardState[SDL_SCANCODE_RCTRL]) - { - result |= KeyboardModifiers_Control; - } - - if (SDL_SCANCODE_LALT < scancodeCount && - keyboardState[SDL_SCANCODE_LALT]) - { - result |= KeyboardModifiers_Alt; - } - - if (SDL_SCANCODE_RALT < scancodeCount && - keyboardState[SDL_SCANCODE_RALT]) - { - result |= KeyboardModifiers_Alt; - } - } - - return static_cast(result); - } - - - SdlEngine::SdlEngine(SdlWindow& window, - NativeStoneApplicationContext& context) : - window_(window), - context_(context), - surface_(window), - viewportChanged_(true) - { - } - - - void SdlEngine::Run() - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - SetSize(window_.GetWidth(), window_.GetHeight()); - - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context_); - locker.GetCentralViewport().FitContent(); - } - - bool stop = false; - while (!stop) - { - RenderFrame(); - - SDL_Event event; - - while (!stop && - SDL_PollEvent(&event)) - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context_); - - if (event.type == SDL_QUIT) - { - stop = true; - break; - } - else if (event.type == SDL_MOUSEBUTTONDOWN) - { - KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); - - switch (event.button.button) - { - case SDL_BUTTON_LEFT: - locker.GetCentralViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers, std::vector()); - break; - - case SDL_BUTTON_RIGHT: - locker.GetCentralViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers, std::vector()); - break; - - case SDL_BUTTON_MIDDLE: - locker.GetCentralViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers, std::vector()); - break; - - default: - break; - } - } - else if (event.type == SDL_MOUSEMOTION) - { - locker.GetCentralViewport().MouseMove(event.button.x, event.button.y, std::vector()); - } - else if (event.type == SDL_MOUSEBUTTONUP) - { - locker.GetCentralViewport().MouseUp(); - } - else if (event.type == SDL_WINDOWEVENT) - { - switch (event.window.event) - { - case SDL_WINDOWEVENT_LEAVE: - locker.GetCentralViewport().MouseLeave(); - break; - - case SDL_WINDOWEVENT_ENTER: - locker.GetCentralViewport().MouseEnter(); - break; - - case SDL_WINDOWEVENT_SIZE_CHANGED: - SetSize(event.window.data1, event.window.data2); - break; - - default: - break; - } - } - else if (event.type == SDL_MOUSEWHEEL) - { - KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); - - int x, y; - SDL_GetMouseState(&x, &y); - - if (event.wheel.y > 0) - { - locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); - } - else if (event.wheel.y < 0) - { - locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); - } - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); - - switch (event.key.keysym.sym) - { - case SDLK_a: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'a', modifiers); break; - case SDLK_b: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'b', modifiers); break; - case SDLK_c: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'c', modifiers); break; - case SDLK_d: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'd', modifiers); break; - case SDLK_e: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'e', modifiers); break; - case SDLK_f: window_.ToggleMaximize(); break; - case SDLK_g: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'g', modifiers); break; - case SDLK_h: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'h', modifiers); break; - case SDLK_i: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'i', modifiers); break; - case SDLK_j: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'j', modifiers); break; - case SDLK_k: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'k', modifiers); break; - case SDLK_l: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'l', modifiers); break; - case SDLK_m: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'm', modifiers); break; - case SDLK_n: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'n', modifiers); break; - case SDLK_o: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'o', modifiers); break; - case SDLK_p: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'p', modifiers); break; - case SDLK_q: stop = true; break; - case SDLK_r: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'r', modifiers); break; - case SDLK_s: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 's', modifiers); break; - case SDLK_t: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 't', modifiers); break; - case SDLK_u: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'u', modifiers); break; - case SDLK_v: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'v', modifiers); break; - case SDLK_w: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'w', modifiers); break; - case SDLK_x: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'x', modifiers); break; - case SDLK_y: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'y', modifiers); break; - case SDLK_z: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'z', modifiers); break; - case SDLK_KP_0: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '0', modifiers); break; - case SDLK_KP_1: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '1', modifiers); break; - case SDLK_KP_2: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '2', modifiers); break; - case SDLK_KP_3: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '3', modifiers); break; - case SDLK_KP_4: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '4', modifiers); break; - case SDLK_KP_5: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '5', modifiers); break; - case SDLK_KP_6: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '6', modifiers); break; - case SDLK_KP_7: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '7', modifiers); break; - case SDLK_KP_8: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '8', modifiers); break; - case SDLK_KP_9: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '9', modifiers); break; - - case SDLK_PLUS: - case SDLK_KP_PLUS: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '+', modifiers); break; - - case SDLK_MINUS: - case SDLK_KP_MINUS: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '-', modifiers); break; - - case SDLK_DELETE: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Delete, 0, modifiers); break; - case SDLK_BACKSPACE: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Backspace, 0, modifiers); break; - case SDLK_RIGHT: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Right, 0, modifiers); break; - case SDLK_LEFT: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Left, 0, modifiers); break; - case SDLK_UP: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Up, 0, modifiers); break; - case SDLK_DOWN: - locker.GetCentralViewport().KeyPressed(KeyboardKeys_Down, 0, modifiers); break; - default: - break; - } - } - } - - // Small delay to avoid using 100% of CPU - SDL_Delay(1); - } - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.h --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include "../../Framework/Messages/ObserverBase.h" -#include "../Generic/NativeStoneApplicationContext.h" -#include "SdlCairoSurface.h" - -namespace OrthancStone -{ - class SdlEngine : public ObserverBase - { - private: - SdlWindow& window_; - NativeStoneApplicationContext& context_; - SdlCairoSurface surface_; - bool viewportChanged_; - - void SetSize(unsigned int width, - unsigned int height); - - void RenderFrame(); - - static KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, - const int scancodeCount); - - public: - SdlEngine(SdlWindow& window, - NativeStoneApplicationContext& context); - - void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) - { - viewportChanged_ = true; - } - - void Run(); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.cpp --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlOrthancSurface.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#include -#include -#include - -#include - -namespace OrthancStone -{ - SdlOrthancSurface::SdlOrthancSurface(SdlWindow& window) : - window_(window), - sdlSurface_(NULL) - { - } - - - SdlOrthancSurface::~SdlOrthancSurface() - { - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - } - - - void SdlOrthancSurface::SetSize(unsigned int width, - unsigned int height) - { - if (image_.get() == NULL || - image_->GetWidth() != width || - image_->GetHeight() != height) - { - image_.reset(new Orthanc::Image(Orthanc::PixelFormat_BGRA32, width, height, true)); // (*) - - if (image_->GetPitch() != image_->GetWidth() * 4) - { - // This should have been ensured by setting "forceMinimalPitch" to "true" (*) - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - // TODO Big endian? - static const uint32_t rmask = 0x00ff0000; - static const uint32_t gmask = 0x0000ff00; - static const uint32_t bmask = 0x000000ff; - - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - - sdlSurface_ = SDL_CreateRGBSurfaceFrom(image_->GetBuffer(), width, height, 32, - image_->GetPitch(), rmask, gmask, bmask, 0); - if (!sdlSurface_) - { - LOG(ERROR) << "Cannot create a SDL surface from a Orthanc surface"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - - - Orthanc::ImageAccessor& SdlOrthancSurface::GetImage() - { - if (image_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return *image_; - } - - - void SdlOrthancSurface::Render() - { - if (image_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - window_.Render(sdlSurface_); - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.h --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlOrthancSurface.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include "../../Framework/Viewport/SdlWindow.h" - -#include -#include - -#include - -namespace OrthancStone -{ - class SdlOrthancSurface : public boost::noncopyable - { - private: - std::unique_ptr image_; - SdlWindow& window_; - SDL_Surface* sdlSurface_; - - public: - SdlOrthancSurface(SdlWindow& window); - - ~SdlOrthancSurface(); - - void SetSize(unsigned int width, - unsigned int height); - - Orthanc::ImageAccessor& GetImage(); - - void Render(); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.cpp --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#if ORTHANC_ENABLE_SDL != 1 -#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 1 -#endif - -#include "SdlStoneApplicationRunner.h" - -#include "../../Platforms/Generic/OracleWebService.h" -#include "SdlEngine.h" - -#include -#include -#include -#include -#include - -#include - -namespace OrthancStone -{ - void SdlStoneApplicationRunner::Initialize() - { - SdlWindow::GlobalInitialize(); - } - - - void SdlStoneApplicationRunner::DeclareCommandLineOptions(boost::program_options::options_description& options) - { - boost::program_options::options_description sdl("SDL options"); - sdl.add_options() - ("width", boost::program_options::value()->default_value(1024), "Initial width of the SDL window") - ("height", boost::program_options::value()->default_value(768), "Initial height of the SDL window") - ("opengl", boost::program_options::value()->default_value(true), "Enable OpenGL in SDL") - ; - - options.add(sdl); - } - - - void SdlStoneApplicationRunner::ParseCommandLineOptions(const boost::program_options::variables_map& parameters) - { - if (!parameters.count("width") || - !parameters.count("height") || - !parameters.count("opengl")) - { - LOG(ERROR) << "Parameter \"width\", \"height\" or \"opengl\" is missing"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - int w = parameters["width"].as(); - int h = parameters["height"].as(); - if (w <= 0 || h <= 0) - { - LOG(ERROR) << "Parameters \"width\" and \"height\" must be positive"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); - } - - width_ = static_cast(w); - height_ = static_cast(h); - LOG(WARNING) << "Initial display size: " << width_ << "x" << height_; - - enableOpenGl_ = parameters["opengl"].as(); - if (enableOpenGl_) - { - LOG(WARNING) << "OpenGL is enabled, disable it with option \"--opengl=off\" if the application crashes"; - } - else - { - LOG(WARNING) << "OpenGL is disabled, enable it with option \"--opengl=on\" for best performance"; - } - } - - - void SdlStoneApplicationRunner::Run(NativeStoneApplicationContext& context, - const std::string& title, - int argc, - char* argv[]) - { - /************************************************************** - * Run the application inside a SDL window - **************************************************************/ - - LOG(WARNING) << "Starting the application"; - - SdlWindow window(title.c_str(), width_, height_, enableOpenGl_); - boost::shared_ptr sdl(new SdlEngine(window, context)); - - { - NativeStoneApplicationContext::GlobalMutexLocker locker(context); - - sdl->Register - (locker.GetCentralViewport(), &SdlEngine::OnViewportChanged); - - //context.GetCentralViewport().Register(sdl); // (*) - } - - context.Start(); - sdl->Run(); - - LOG(WARNING) << "Stopping the application"; - - // Don't move the "Stop()" command below out of the block, - // otherwise the application might crash, because the - // "SdlEngine" is an observer of the viewport (*) and the - // update thread started by "context.Start()" would call a - // destructed object (the "SdlEngine" is deleted with the - // lexical scope). - - // TODO Is this still true with message broker? - context.Stop(); - } - - - void SdlStoneApplicationRunner::Finalize() - { - SdlWindow::GlobalFinalize(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.h --- a/Resources/Graveyard/Deprecated/Applications/Sdl/SdlStoneApplicationRunner.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Generic/NativeStoneApplicationRunner.h" - -#if ORTHANC_ENABLE_SDL != 1 -#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 1 -#endif - -#include // Necessary to avoid undefined reference to `SDL_main' - -namespace OrthancStone -{ - class SdlStoneApplicationRunner : public NativeStoneApplicationRunner - { - private: - unsigned int width_; - unsigned int height_; - bool enableOpenGl_; - - public: - SdlStoneApplicationRunner(boost::shared_ptr application) : - NativeStoneApplicationRunner(application) - { - } - - virtual void Initialize(); - - virtual void DeclareCommandLineOptions(boost::program_options::options_description& options); - - virtual void Run(NativeStoneApplicationContext& context, - const std::string& title, - int argc, - char* argv[]); - - virtual void ParseCommandLineOptions(const boost::program_options::variables_map& parameters); - - virtual void Finalize(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.cpp --- a/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "StoneApplicationContext.h" - -#include - -namespace OrthancStone -{ - void StoneApplicationContext::InitializeOrthanc() - { - if (webService_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - orthanc_.reset(new Deprecated::OrthancApiClient(*webService_, orthancBaseUrl_)); - } - - - boost::shared_ptr StoneApplicationContext::GetWebService() - { - if (webService_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return webService_; - } - - - boost::shared_ptr StoneApplicationContext::GetOrthancApiClient() - { - if (orthanc_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - return orthanc_; - } - - - void StoneApplicationContext::SetWebService(boost::shared_ptr webService) - { - webService_ = webService; - InitializeOrthanc(); - } - - - void StoneApplicationContext::SetOrthancBaseUrl(const std::string& baseUrl) - { - // Make sure the base url ends with "/" - if (baseUrl.empty() || - baseUrl[baseUrl.size() - 1] != '/') - { - orthancBaseUrl_ = baseUrl + "/"; - } - else - { - orthancBaseUrl_ = baseUrl; - } - - if (webService_ != NULL) - { - InitializeOrthanc(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.h --- a/Resources/Graveyard/Deprecated/Applications/StoneApplicationContext.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Framework/Deprecated/Toolbox/IWebService.h" -#include "../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" -#include "../Framework/Deprecated/Toolbox/OrthancApiClient.h" -#include "../Framework/Deprecated/Viewport/WidgetViewport.h" - - -#ifdef _MSC_VER - #if _MSC_VER > 1910 - #define orthanc_override override - #else - #define orthanc_override - #endif -#elif defined __GNUC__ - #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) -/* Test for GCC > 3.2.0 */ - #if GCC_VERSION > 40900 - #define orthanc_override override - #else - #define orthanc_override - #endif -#else - #define orthanc_override -#endif - -#include - -namespace OrthancStone -{ - // a StoneApplicationContext contains the services that a StoneApplication - // uses and that depends on the environment in which the Application executes. - // I.e, the StoneApplicationContext provides a WebService interface such that - // the StoneApplication can perform HTTP requests. In a WASM environment, - // the WebService is provided by the browser while, in a native environment, - // the WebService is provided by the OracleWebService (a C++ Http client) - - class StoneApplicationContext : public boost::noncopyable - { - private: - boost::shared_ptr webService_; - Deprecated::IDelayedCallExecutor* delayedCallExecutor_; // TODO => shared_ptr ?? - boost::shared_ptr orthanc_; - std::string orthancBaseUrl_; - - void InitializeOrthanc(); - - public: - StoneApplicationContext() : - delayedCallExecutor_(NULL) - { - } - - virtual ~StoneApplicationContext() - { - } - - boost::shared_ptr GetWebService(); - - boost::shared_ptr GetOrthancApiClient(); - - void SetWebService(boost::shared_ptr webService); - - void SetOrthancBaseUrl(const std::string& baseUrl); - - void SetDelayedCallExecutor(Deprecated::IDelayedCallExecutor& delayedCallExecutor) - { - delayedCallExecutor_ = &delayedCallExecutor; - } - - Deprecated::IDelayedCallExecutor& GetDelayedCallExecutor() - { - return *delayedCallExecutor_; - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.cpp --- a/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "StartupParametersBuilder.h" -#include -#include -#include "emscripten/html5.h" - -namespace OrthancStone -{ - void StartupParametersBuilder::Clear() - { - startupParameters_.clear(); - } - - void StartupParametersBuilder::SetStartupParameter( - const char* name, - const char* value) - { - startupParameters_.push_back(std::make_tuple(name, value)); - } - - void StartupParametersBuilder::GetStartupParameters( - boost::program_options::variables_map& parameters, - const boost::program_options::options_description& options) - { - std::vector argvStrings(startupParameters_.size() + 1); - // argv mirrors pointers to the internal argvStrings buffers. - // ****************************************************** - // THIS IS HIGHLY DANGEROUS SO BEWARE!!!!!!!!!!!!!! - // ****************************************************** - std::vector argv(startupParameters_.size() + 1); - - int argCounter = 0; - argvStrings[argCounter] = "dummy.exe"; - argv[argCounter] = argvStrings[argCounter].c_str(); - - argCounter++; - - std::string cmdLine = ""; - for ( StartupParameters::const_iterator it = startupParameters_.begin(); - it != startupParameters_.end(); - it++) - { - std::stringstream argSs; - - argSs << "--" << std::get<0>(*it); - if(std::get<1>(*it).length() > 0) - argSs << "=" << std::get<1>(*it); - - argvStrings[argCounter] = argSs.str(); - cmdLine = cmdLine + " " + argvStrings[argCounter]; - std::cout << cmdLine << std::endl; - argv[argCounter] = argvStrings[argCounter].c_str(); - argCounter++; - } - - - std::cout << "simulated cmdLine = \"" << cmdLine.c_str() << "\"\n"; - - try - { - boost::program_options::store( - boost::program_options::command_line_parser(argCounter, argv.data()). - options(options).allow_unregistered().run(), parameters); - boost::program_options::notify(parameters); - } - catch (boost::program_options::error& e) - { - std::cerr << "Error while parsing the command-line arguments: " << - e.what() << std::endl; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.h --- a/Resources/Graveyard/Deprecated/Applications/Wasm/StartupParametersBuilder.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -#if ORTHANC_ENABLE_SDL == 1 -#error this file shall be included only with the ORTHANC_ENABLE_SDL set to 0 -#endif - -namespace OrthancStone -{ - // This class is used to generate boost program options from a dico. - // In a Wasm context, startup options are passed as URI arguments that - // are then passed to this class as a dico. - // This class regenerates a fake command-line and parses it to produce - // the same output as if the app was started at command-line. - class StartupParametersBuilder - { - typedef std::list> StartupParameters; - StartupParameters startupParameters_; - - public: - - void Clear(); - // Please note that if a parameter is a flag-style one, the value that - // is passed should be an empty string - void SetStartupParameter(const char* name, const char* value); - void GetStartupParameters( - boost::program_options::variables_map& parameters_, - const boost::program_options::options_description& options); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DelayedCallCommand.h" -#include "boost/thread/thread.hpp" - -#include - -namespace Deprecated -{ - DelayedCallCommand::DelayedCallCommand(MessageHandler* callback, // takes ownership - unsigned int timeoutInMs, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context - ) : - callback_(callback), - payload_(payload), - context_(context), - expirationTimePoint_(boost::posix_time::microsec_clock::local_time() + boost::posix_time::milliseconds(timeoutInMs)), - timeoutInMs_(timeoutInMs) - { - } - - - void DelayedCallCommand::Execute() - { - while (boost::posix_time::microsec_clock::local_time() < expirationTimePoint_) - { - boost::this_thread::sleep(boost::posix_time::milliseconds(1)); - } - } - - void DelayedCallCommand::Commit() - { - // We want to make sure that, i.e, the UpdateThread is not - // triggered while we are updating the "model" with the result of - // an OracleCommand - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); - - if (callback_.get() != NULL) - { - IDelayedCallExecutor::TimeoutMessage message; // TODO: add payload - callback_->Apply(message); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/DelayedCallCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOracleCommand.h" - -#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" -#include "../../Framework/Messages/IObservable.h" -#include "../../Framework/Messages/ICallable.h" -#include "../../Applications/Generic/NativeStoneApplicationContext.h" - -#include - -namespace Deprecated -{ - class DelayedCallCommand : public IOracleCommand, OrthancStone::IObservable - { - protected: - std::unique_ptr > callback_; - std::unique_ptr payload_; - OrthancStone::NativeStoneApplicationContext& context_; - boost::posix_time::ptime expirationTimePoint_; - unsigned int timeoutInMs_; - - public: - DelayedCallCommand(MessageHandler* callback, // takes ownership - unsigned int timeoutInMs, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context - ); - - virtual void Execute(); - - virtual void Commit(); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/IOracleCommand.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/IOracleCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace Deprecated -{ - class IOracleCommand : public Orthanc::IDynamicObject - { - public: - virtual ~IOracleCommand() - { - } - - // This part of the command can be invoked simultaneously, and - // must not modify the Stone context - virtual void Execute() = 0; - - // This part of the command must be invoked in mutual exclusion - virtual void Commit() = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Oracle.h" - -#include -#include -#include - -#include -#include -#include - -namespace Deprecated -{ - class Oracle::PImpl - { - private: - enum State - { - State_Init, - State_Started, - State_Stopped - }; - - boost::mutex oracleMutex_; - State state_; - std::vector threads_; - Orthanc::SharedMessageQueue queue_; - - static void Worker(PImpl* that) - { - for (;;) - { - State state; - - { - boost::mutex::scoped_lock lock(that->oracleMutex_); - state = that->state_; - } - - if (state == State_Stopped) - { - break; - } - - std::unique_ptr item(that->queue_.Dequeue(100)); - if (item.get() != NULL) - { - IOracleCommand& command = dynamic_cast(*item); - try - { - command.Execute(); - } - catch (Orthanc::OrthancException& /*ex*/) - { - // this is probably a curl error that has been triggered. We may just ignore it. - // The command.success_ will stay at false and this will be handled in the command.Commit - } - - // Random sleeping to test - //boost::this_thread::sleep(boost::posix_time::milliseconds(50 * (1 + rand() % 10))); - - command.Commit(); - } - } - } - - public: - PImpl(unsigned int threadCount) : - state_(State_Init), - threads_(threadCount) - { - } - - ~PImpl() - { - if (state_ == State_Started) - { - LOG(ERROR) << "You should have manually called Oracle::Stop()"; - Stop(); - } - } - - Orthanc::SharedMessageQueue& GetQueue() - { - return queue_; - } - - void Submit(IOracleCommand* command) - { - std::unique_ptr protection(command); - - if (command == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - - boost::mutex::scoped_lock lock(oracleMutex_); - - switch (state_) - { - case State_Init: - case State_Started: - queue_.Enqueue(protection.release()); - break; - - case State_Stopped: - LOG(ERROR) << "Cannot schedule a request to the Oracle after having " - << "called Oracle::Stop()"; - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - } - - void Start() - { - boost::mutex::scoped_lock lock(oracleMutex_); - - if (state_ != State_Init) - { - LOG(ERROR) << "Oracle::PImpl::Start: (state_ != State_Init)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - for (size_t i = 0; i < threads_.size(); i++) - { - threads_[i] = new boost::thread(Worker, this); - } - - state_ = State_Started; - } - - void Stop() - { - { - boost::mutex::scoped_lock lock(oracleMutex_); - - if (state_ != State_Started) - { - LOG(ERROR) << "Oracle::PImpl::Stop(): (state_ != State_Started)"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - - state_ = State_Stopped; - } - - for (size_t i = 0; i < threads_.size(); i++) - { - if (threads_[i] != NULL) - { - if (threads_[i]->joinable()) - { - threads_[i]->join(); - } - - delete threads_[i]; - } - } - } - }; - - - Oracle::Oracle(unsigned int threadCount) : - pimpl_(new PImpl(threadCount)) - { - } - - void Oracle::Start() - { - pimpl_->Start(); - } - - - void Oracle::Submit(IOracleCommand* command) - { - pimpl_->Submit(command); - } - - - void Oracle::Stop() - { - pimpl_->Stop(); - } - - - void Oracle::WaitEmpty() - { - pimpl_->GetQueue().WaitEmpty(50); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/Oracle.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOracleCommand.h" - -#include - -namespace Deprecated -{ - class Oracle : public boost::noncopyable - { - private: - class PImpl; - - boost::shared_ptr pimpl_; - - public: - Oracle(unsigned int threadCount); - - void Start(); - - void Submit(IOracleCommand* command); - - void WaitEmpty(); // For unit tests - - void Stop(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/OracleDelayedCallExecutor.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/OracleDelayedCallExecutor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" -#include "Oracle.h" -#include "../../Applications/Generic/NativeStoneApplicationContext.h" -#include "DelayedCallCommand.h" - -namespace Deprecated -{ - // The OracleTimeout executes callbacks after a delay. - class OracleDelayedCallExecutor : public IDelayedCallExecutor - { - private: - Oracle& oracle_; - OrthancStone::NativeStoneApplicationContext& context_; - - public: - OracleDelayedCallExecutor(Oracle& oracle, - OrthancStone::NativeStoneApplicationContext& context) : - oracle_(oracle), - context_(context) - { - } - - virtual void Schedule(MessageHandler* callback, - unsigned int timeoutInMs = 1000) - { - oracle_.Submit(new DelayedCallCommand(callback, timeoutInMs, NULL, context_)); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "OracleWebService.h" -#include "../../Framework/Deprecated/Toolbox/IWebService.h" - -namespace Deprecated -{ - - - class OracleWebService::WebServiceCachedGetCommand : public IOracleCommand, OrthancStone::IObservable - { - protected: - std::unique_ptr > successCallback_; - std::unique_ptr payload_; - boost::shared_ptr cachedMessage_; - OrthancStone::NativeStoneApplicationContext& context_; - - public: - WebServiceCachedGetCommand(MessageHandler* successCallback, // takes ownership - boost::shared_ptr cachedMessage, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context - ) : - successCallback_(successCallback), - payload_(payload), - cachedMessage_(cachedMessage), - context_(context) - { - } - - virtual void Execute() - { - // nothing to do, everything is in the commit - } - - virtual void Commit() - { - // We want to make sure that, i.e, the UpdateThread is not - // triggered while we are updating the "model" with the result of - // a WebServiceCommand - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); - - IWebService::HttpRequestSuccessMessage successMessage(cachedMessage_->GetUri(), - cachedMessage_->GetAnswer(), - cachedMessage_->GetAnswerSize(), - cachedMessage_->GetAnswerHttpHeaders(), - payload_.get()); - - successCallback_->Apply(successMessage); - } - }; - - void OracleWebService::NotifyHttpSuccessLater(boost::shared_ptr cachedMessage, - Orthanc::IDynamicObject* payload, // takes ownership - MessageHandler* successCallback) - { - oracle_.Submit(new WebServiceCachedGetCommand(successCallback, cachedMessage, payload, context_)); - } - - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/OracleWebService.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Toolbox/BaseWebService.h" -#include "Oracle.h" -#include "WebServiceGetCommand.h" -#include "WebServicePostCommand.h" -#include "WebServiceDeleteCommand.h" -#include "../../Applications/Generic/NativeStoneApplicationContext.h" - -namespace Deprecated -{ - // The OracleWebService performs HTTP requests in a native environment. - // It uses a thread pool to handle multiple HTTP requests in a same time. - // It works asynchronously to mimick the behaviour of the WebService running in a WASM environment. - class OracleWebService : public BaseWebService - { - private: - Oracle& oracle_; - OrthancStone::NativeStoneApplicationContext& context_; - Orthanc::WebServiceParameters parameters_; - - class WebServiceCachedGetCommand; - - public: - OracleWebService(Oracle& oracle, - const Orthanc::WebServiceParameters& parameters, - OrthancStone::NativeStoneApplicationContext& context) : - oracle_(oracle), - context_(context), - parameters_(parameters) - { - } - - virtual void PostAsync(const std::string& uri, - const HttpHeaders& headers, - const std::string& body, - Orthanc::IDynamicObject* payload, // takes ownership - MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback = NULL, // takes ownership - unsigned int timeoutInSeconds = 60) - { - oracle_.Submit(new WebServicePostCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, body, payload, context_)); - } - - virtual void DeleteAsync(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload, - MessageHandler* successCallback, - MessageHandler* failureCallback = NULL, - unsigned int timeoutInSeconds = 60) - { - oracle_.Submit(new WebServiceDeleteCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, payload, context_)); - } - - protected: - virtual void GetAsyncInternal(const std::string& uri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload, // takes ownership - MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback = NULL,// takes ownership - unsigned int timeoutInSeconds = 60) - { - oracle_.Submit(new WebServiceGetCommand(successCallback, failureCallback, parameters_, uri, headers, timeoutInSeconds, payload, context_)); - } - - virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, - Orthanc::IDynamicObject* payload, // takes ownership - MessageHandler* successCallback); - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebServiceCommandBase.h" - -#include - -namespace Deprecated -{ - WebServiceCommandBase::WebServiceCommandBase(MessageHandler* successCallback, - MessageHandler* failureCallback, - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context) : - successCallback_(successCallback), - failureCallback_(failureCallback), - parameters_(parameters), - url_(url), - headers_(headers), - payload_(payload), - success_(false), - httpStatus_(Orthanc::HttpStatus_None), - context_(context), - timeoutInSeconds_(timeoutInSeconds) - { - } - - - void WebServiceCommandBase::Commit() - { - // We want to make sure that, i.e, the UpdateThread is not - // triggered while we are updating the "model" with the result of - // a WebServiceCommand - OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker lock(context_); - - if (success_ && successCallback_.get() != NULL) - { - IWebService::HttpRequestSuccessMessage message - (url_, answer_.c_str(), answer_.size(), answerHeaders_, payload_.get()); - successCallback_->Apply(message); - } - else if (!success_ && failureCallback_.get() != NULL) - { - IWebService::HttpRequestErrorMessage message(url_, httpStatus_, payload_.get()); - failureCallback_->Apply(message); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceCommandBase.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOracleCommand.h" - -#include "../../Framework/Deprecated/Toolbox/IWebService.h" -#include "../../Framework/Messages/IObservable.h" -#include "../../Framework/Messages/ICallable.h" -#include "../../Applications/Generic/NativeStoneApplicationContext.h" - -#include - -#include - -namespace Deprecated -{ - class WebServiceCommandBase : public IOracleCommand, OrthancStone::IObservable - { - protected: - std::unique_ptr > successCallback_; - std::unique_ptr > failureCallback_; - Orthanc::WebServiceParameters parameters_; - std::string url_; - IWebService::HttpHeaders headers_; - std::unique_ptr payload_; - bool success_; - Orthanc::HttpStatus httpStatus_; - std::string answer_; - IWebService::HttpHeaders answerHeaders_; - OrthancStone::NativeStoneApplicationContext& context_; - unsigned int timeoutInSeconds_; - - public: - WebServiceCommandBase(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context - ); - - virtual void Execute() = 0; - - virtual void Commit(); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebServiceDeleteCommand.h" - -#include - -namespace Deprecated -{ - WebServiceDeleteCommand::WebServiceDeleteCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const Deprecated::IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context) : - WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context) - { - } - - void WebServiceDeleteCommand::Execute() - { - Orthanc::HttpClient client(parameters_, "/"); - client.SetUrl(url_); - client.SetTimeout(timeoutInSeconds_); - client.SetMethod(Orthanc::HttpMethod_Delete); - - for (Deprecated::IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) - { - client.AddHeader(it->first, it->second); - } - - success_ = client.Apply(answer_, answerHeaders_); - httpStatus_ = client.GetLastStatus(); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceDeleteCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebServiceCommandBase.h" - -namespace Deprecated -{ - class WebServiceDeleteCommand : public WebServiceCommandBase - { - public: - WebServiceDeleteCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context); - - virtual void Execute(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebServiceGetCommand.h" - -#include - -namespace Deprecated -{ - WebServiceGetCommand::WebServiceGetCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context) : - WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context) - { - } - - - void WebServiceGetCommand::Execute() - { - Orthanc::HttpClient client(parameters_, "/"); - client.SetUrl(url_); - client.SetTimeout(timeoutInSeconds_); - client.SetMethod(Orthanc::HttpMethod_Get); - - for (IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) - { - client.AddHeader(it->first, it->second); - } - - success_ = client.Apply(answer_, answerHeaders_); - httpStatus_ = client.GetLastStatus(); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServiceGetCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebServiceCommandBase.h" - -namespace Deprecated -{ - class WebServiceGetCommand : public WebServiceCommandBase - { - public: - WebServiceGetCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context); - - virtual void Execute(); - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WebServicePostCommand.h" - -#include - -namespace Deprecated -{ - WebServicePostCommand::WebServicePostCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const Deprecated::IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - const std::string& body, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context) : - WebServiceCommandBase(successCallback, failureCallback, parameters, url, headers, timeoutInSeconds, payload, context), - body_(body) - { - } - - void WebServicePostCommand::Execute() - { - Orthanc::HttpClient client(parameters_, "/"); - client.SetUrl(url_); - client.SetTimeout(timeoutInSeconds_); - client.SetMethod(Orthanc::HttpMethod_Post); - client.GetBody().swap(body_); - - for (Deprecated::IWebService::HttpHeaders::const_iterator it = headers_.begin(); it != headers_.end(); it++ ) - { - client.AddHeader(it->first, it->second); - } - - success_ = client.Apply(answer_, answerHeaders_); - httpStatus_ = client.GetLastStatus(); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.h --- a/Resources/Graveyard/Deprecated/Platforms/Generic/WebServicePostCommand.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "WebServiceCommandBase.h" - -namespace Deprecated -{ - class WebServicePostCommand : public WebServiceCommandBase - { - protected: - std::string body_; - - public: - WebServicePostCommand(MessageHandler* successCallback, // takes ownership - MessageHandler* failureCallback, // takes ownership - const Orthanc::WebServiceParameters& parameters, - const std::string& url, - const IWebService::HttpHeaders& headers, - unsigned int timeoutInSeconds, - const std::string& body, - Orthanc::IDynamicObject* payload /* takes ownership */, - OrthancStone::NativeStoneApplicationContext& context); - - virtual void Execute(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,437 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Defaults.h" - -#include "WasmWebService.h" -#include "WasmDelayedCallExecutor.h" -#include "../../../Framework/Deprecated/Widgets/TestCairoWidget.h" -#include "../../../Framework/Deprecated/Viewport/WidgetViewport.h" -#include -#include -#include -#include -#include - -#include - - -static unsigned int width_ = 0; -static unsigned int height_ = 0; - -/**********************************/ - -static std::unique_ptr application; -static std::unique_ptr applicationWasmAdapter = NULL; -static std::unique_ptr context; -static OrthancStone::StartupParametersBuilder startupParametersBuilder; -static OrthancStone::MessageBroker broker; - -static OrthancStone::ViewportContentChangedObserver viewportContentChangedObserver_(broker); -static OrthancStone::StatusBar statusBar_; - -static std::list> viewports_; - -std::shared_ptr FindViewportSharedPtr(ViewportHandle viewport) { - for (const auto& v : viewports_) { - if (v.get() == viewport) { - return v; - } - } - assert(false); - return std::shared_ptr(); -} - -#ifdef __cplusplus -extern "C" { -#endif - -#if 0 - // rewrite malloc/free in order to monitor allocations. We actually only monitor large allocations (like images ...) - - size_t bigChunksTotalSize = 0; - std::map allocatedBigChunks; - - extern void* emscripten_builtin_malloc(size_t bytes); - extern void emscripten_builtin_free(void* mem); - - void * __attribute__((noinline)) malloc(size_t size) - { - void *ptr = emscripten_builtin_malloc(size); - if (size > 100000) - { - bigChunksTotalSize += size; - printf("++ Allocated %zu bytes, got %p. (%zu MB consumed by big chunks)\n", size, ptr, bigChunksTotalSize/(1024*1024)); - allocatedBigChunks[ptr] = size; - } - return ptr; - } - - void __attribute__((noinline)) free(void *ptr) - { - emscripten_builtin_free(ptr); - - std::map::iterator it = allocatedBigChunks.find(ptr); - if (it != allocatedBigChunks.end()) - { - bigChunksTotalSize -= it->second; - printf("-- Freed %zu bytes at %p. (%zu MB consumed by big chunks)\n", it->second, ptr, bigChunksTotalSize/(1024*1024)); - allocatedBigChunks.erase(it); - } - } -#endif // 0 - - using namespace OrthancStone; - - // when WASM needs a C++ viewport - ViewportHandle EMSCRIPTEN_KEEPALIVE CreateCppViewport() { - - std::shared_ptr viewport(new Deprecated::WidgetViewport(broker)); - printf("viewport %x\n", (int)viewport.get()); - - viewports_.push_back(viewport); - - printf("There are now %lu viewports in C++\n", viewports_.size()); - - viewport->SetStatusBar(statusBar_); - - viewport->RegisterObserverCallback( - new Callable - (viewportContentChangedObserver_, &ViewportContentChangedObserver::OnViewportChanged)); - - return viewport.get(); - } - - // when WASM does not need a viewport anymore, it should release it - void EMSCRIPTEN_KEEPALIVE ReleaseCppViewport(ViewportHandle viewport) { - viewports_.remove_if([viewport](const std::shared_ptr& v) { return v.get() == viewport;}); - - printf("There are now %lu viewports in C++\n", viewports_.size()); - } - - void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle viewport) { - printf("Initializing Stone\n"); - OrthancStone::StoneInitialize(); - printf("CreateWasmApplication\n"); - - application.reset(CreateUserApplication(broker)); - applicationWasmAdapter.reset(CreateWasmApplicationAdapter(broker, application.get())); - Deprecated::WasmWebService::SetBroker(broker); - Deprecated::WasmDelayedCallExecutor::SetBroker(broker); - - startupParametersBuilder.Clear(); - } - - void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, - const char* value) { - startupParametersBuilder.SetStartupParameter(keyc, value); - } - - void EMSCRIPTEN_KEEPALIVE StartWasmApplication(const char* baseUri) { - - printf("StartWasmApplication\n"); - - Orthanc::Logging::SetErrorWarnInfoTraceLoggingFunctions( - stone_console_error, stone_console_warning, - stone_console_info, stone_console_trace); - - // recreate a command line from uri arguments and parse it - boost::program_options::variables_map parameters; - boost::program_options::options_description options; - application->DeclareStartupOptions(options); - startupParametersBuilder.GetStartupParameters(parameters, options); - - context.reset(new OrthancStone::StoneApplicationContext(broker)); - context->SetOrthancBaseUrl(baseUri); - printf("Base URL to Orthanc API: [%s]\n", baseUri); - context->SetWebService(Deprecated::WasmWebService::GetInstance()); - context->SetDelayedCallExecutor(Deprecated::WasmDelayedCallExecutor::GetInstance()); - application->Initialize(context.get(), statusBar_, parameters); - application->InitializeWasm(); - -// viewport->SetSize(width_, height_); - printf("StartWasmApplication - completed\n"); - } - - bool EMSCRIPTEN_KEEPALIVE WasmIsTraceLevelEnabled() - { - return Orthanc::Logging::IsTraceLevelEnabled(); - } - - bool EMSCRIPTEN_KEEPALIVE WasmIsInfoLevelEnabled() - { - return Orthanc::Logging::IsInfoLevelEnabled(); - } - - void EMSCRIPTEN_KEEPALIVE WasmDoAnimation() - { - for (auto viewport : viewports_) { - // TODO Only launch the JavaScript timer if "HasAnimation()" - if (viewport->HasAnimation()) - { - viewport->DoAnimation(); - } - - } - - } - - - void EMSCRIPTEN_KEEPALIVE ViewportSetSize(ViewportHandle viewport, unsigned int width, unsigned int height) - { - width_ = width; - height_ = height; - - viewport->SetSize(width, height); - } - - int EMSCRIPTEN_KEEPALIVE ViewportRender(ViewportHandle viewport, - unsigned int width, - unsigned int height, - uint8_t* data) - { - viewportContentChangedObserver_.Reset(); - - //printf("ViewportRender called %dx%d\n", width, height); - if (width == 0 || - height == 0) - { - return 1; - } - - Orthanc::ImageAccessor surface; - surface.AssignWritable(Orthanc::PixelFormat_BGRA32, width, height, 4 * width, data); - - viewport->Render(surface); - - // Convert from BGRA32 memory layout (only color mode supported by - // Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 (as - // expected by HTML5 canvas). This simply amounts to swapping the - // B and R channels. - uint8_t* p = data; - for (unsigned int y = 0; y < height; y++) { - for (unsigned int x = 0; x < width; x++) { - uint8_t tmp = p[0]; - p[0] = p[2]; - p[2] = tmp; - - p += 4; - } - } - - return 1; - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(ViewportHandle viewport, - unsigned int rawButton, - int x, - int y, - unsigned int rawModifiers) - { - OrthancStone::MouseButton button; - switch (rawButton) - { - case 0: - button = OrthancStone::MouseButton_Left; - break; - - case 1: - button = OrthancStone::MouseButton_Middle; - break; - - case 2: - button = OrthancStone::MouseButton_Right; - break; - - default: - return; // Unknown button - } - - viewport->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None, std::vector()); - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(ViewportHandle viewport, - int deltaY, - int x, - int y, - int isControl) - { - if (deltaY != 0) - { - OrthancStone::MouseWheelDirection direction = (deltaY < 0 ? - OrthancStone::MouseWheelDirection_Up : - OrthancStone::MouseWheelDirection_Down); - OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; - - if (isControl != 0) - { - modifiers = OrthancStone::KeyboardModifiers_Control; - } - - viewport->MouseWheel(direction, x, y, modifiers); - } - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(ViewportHandle viewport, - int x, - int y) - { - viewport->MouseMove(x, y, std::vector()); - } - - void GetTouchVector(std::vector& output, - int touchCount, - float x0, - float y0, - float x1, - float y1, - float x2, - float y2) - { - // TODO: it might be nice to try to pass all the x0,y0 coordinates as arrays but that's not so easy to pass array between JS and C++ - if (touchCount > 0) - { - output.push_back(Deprecated::Touch(x0, y0)); - } - if (touchCount > 1) - { - output.push_back(Deprecated::Touch(x1, y1)); - } - if (touchCount > 2) - { - output.push_back(Deprecated::Touch(x2, y2)); - } - - } - - void EMSCRIPTEN_KEEPALIVE ViewportTouchStart(ViewportHandle viewport, - int touchCount, - float x0, - float y0, - float x1, - float y1, - float x2, - float y2) - { - // printf("touch start with %d touches\n", touchCount); - - std::vector touches; - GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); - viewport->TouchStart(touches); - } - - void EMSCRIPTEN_KEEPALIVE ViewportTouchMove(ViewportHandle viewport, - int touchCount, - float x0, - float y0, - float x1, - float y1, - float x2, - float y2) - { - // printf("touch move with %d touches\n", touchCount); - - std::vector touches; - GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); - viewport->TouchMove(touches); - } - - void EMSCRIPTEN_KEEPALIVE ViewportTouchEnd(ViewportHandle viewport, - int touchCount, - float x0, - float y0, - float x1, - float y1, - float x2, - float y2) - { - // printf("touch end with %d touches remaining\n", touchCount); - - std::vector touches; - GetTouchVector(touches, touchCount, x0, y0, x1, y1, x2, y2); - viewport->TouchEnd(touches); - } - - void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(ViewportHandle viewport, - int key, - const char* keyChar, - bool isShiftPressed, - bool isControlPressed, - bool isAltPressed) - - { - OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; - if (isShiftPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Shift); - } - if (isControlPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Control); - } - if (isAltPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Alt); - } - - char c = 0; - if (keyChar != NULL && key == OrthancStone::KeyboardKeys_Generic) { - c = keyChar[0]; - } - viewport->KeyPressed(static_cast(key), c, modifiers); - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseUp(ViewportHandle viewport) - { - viewport->MouseUp(); - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter(ViewportHandle viewport) - { - viewport->MouseEnter(); - } - - - void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave(ViewportHandle viewport) - { - viewport->MouseLeave(); - } - - const char* EMSCRIPTEN_KEEPALIVE SendSerializedMessageToStoneApplication(const char* message) - { - static std::string output; // we don't want the string to be deallocated when we return to JS code so we always use the same string (this is fine since JS is single-thread) - - //printf("SendSerializedMessageToStoneApplication\n"); - //printf("%s", message); - - if (applicationWasmAdapter.get() != NULL) { - applicationWasmAdapter->HandleSerializedMessageFromWeb(output, std::string(message)); - return output.c_str(); - } - printf("This Stone application does not have a Web Adapter, unable to send messages"); - return NULL; - } - -#ifdef __cplusplus -} -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.h --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/Defaults.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" -#include "../../Framework/Deprecated/Widgets/LayoutWidget.h" -#include -#include - -typedef Deprecated::WidgetViewport* ViewportHandle; // the objects exchanged between JS and C++ - -#ifdef __cplusplus -extern "C" { -#endif - - // JS methods accessible from C++ - extern void ScheduleWebViewportRedrawFromCpp(ViewportHandle cppViewportHandle); - extern void UpdateStoneApplicationStatusFromCppWithString(const char* statusUpdateMessage); - extern void UpdateStoneApplicationStatusFromCppWithSerializedMessage(const char* statusUpdateMessage); - extern void stone_console_error(const char*); - extern void stone_console_warning(const char*); - extern void stone_console_info(const char*); - extern void stone_console_trace(const char*); - - // C++ methods accessible from JS - extern void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle cppViewportHandle); - extern void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, const char* value); - - -#ifdef __cplusplus -} -#endif - -// these methods must be implemented in the custom app "mainWasm.cpp" -extern OrthancStone::IStoneApplication* CreateUserApplication(OrthancStone::MessageBroker& broker); -extern OrthancStone::WasmPlatformApplicationAdapter* CreateWasmApplicationAdapter(OrthancStone::MessageBroker& broker, OrthancStone::IStoneApplication* application); - -namespace OrthancStone { - - // default Observer to trigger Viewport redraw when something changes in the Viewport - class ViewportContentChangedObserver : public IObserver - { - private: - // Flag to avoid flooding JavaScript with redundant Redraw requests - bool isScheduled_; - - public: - ViewportContentChangedObserver(MessageBroker& broker) : - IObserver(broker), - isScheduled_(false) - { - } - - void Reset() - { - isScheduled_ = false; - } - - void OnViewportChanged(const Deprecated::IViewport::ViewportChangedMessage& message) - { - if (!isScheduled_) - { - ScheduleWebViewportRedrawFromCpp((ViewportHandle)&message.GetOrigin()); // loosing constness when transmitted to Web - isScheduled_ = true; - } - } - }; - - // default status bar to log messages on the console/stdout - class StatusBar : public Deprecated::IStatusBar - { - public: - virtual void ClearMessage() - { - } - - virtual void SetMessage(const std::string& message) - { - printf("%s\n", message.c_str()); - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WasmDelayedCallExecutor.h" -#include "json/value.h" -#include "json/writer.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - - extern void WasmDelayedCallExecutor_Schedule(void* callable, - unsigned int timeoutInMs - /*void* payload*/); - - void EMSCRIPTEN_KEEPALIVE WasmDelayedCallExecutor_ExecuteCallback(void* callable - //void* payload - ) - { - if (callable == NULL) - { - throw; - } - else - { - reinterpret_cast*>(callable)-> - Apply(Deprecated::IDelayedCallExecutor::TimeoutMessage()); // uri, reinterpret_cast(payload))); - } - } - - -#ifdef __cplusplus -} -#endif - - - -namespace Deprecated -{ - OrthancStone::MessageBroker* WasmDelayedCallExecutor::broker_ = NULL; - - - void WasmDelayedCallExecutor::Schedule(OrthancStone::MessageHandler* callback, - unsigned int timeoutInMs) - { - WasmDelayedCallExecutor_Schedule(callback, timeoutInMs); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.h --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Toolbox/IDelayedCallExecutor.h" -#include - -namespace Deprecated -{ - class WasmDelayedCallExecutor : public IDelayedCallExecutor - { - private: - static OrthancStone::MessageBroker* broker_; - - // Private constructor => Singleton design pattern - WasmDelayedCallExecutor(OrthancStone::MessageBroker& broker) : - IDelayedCallExecutor(broker) - { - } - - public: - static WasmDelayedCallExecutor& GetInstance() - { - if (broker_ == NULL) - { - printf("WasmDelayedCallExecutor::GetInstance(): broker not initialized\n"); - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - static WasmDelayedCallExecutor instance(*broker_); - return instance; - } - - static void SetBroker(OrthancStone::MessageBroker& broker) - { - broker_ = &broker; - } - - virtual void Schedule(OrthancStone::MessageHandler* callback, - unsigned int timeoutInMs = 1000); - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.js --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmDelayedCallExecutor.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -mergeInto(LibraryManager.library, { - WasmDelayedCallExecutor_Schedule: function(callable, timeoutInMs/*, payload*/) { - setTimeout(function() { - window.WasmDelayedCallExecutor_ExecuteCallback(callable/*, payload*/); - }, timeoutInMs); - } -}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WasmPlatformApplicationAdapter.h" - -#include "Framework/StoneException.h" -#include -#include "Platforms/Wasm/Defaults.h" - -namespace OrthancStone -{ - WasmPlatformApplicationAdapter::WasmPlatformApplicationAdapter(MessageBroker& broker, IStoneApplication& application) - : IObserver(broker), - application_(application) - { - } - - void WasmPlatformApplicationAdapter::HandleSerializedMessageFromWeb(std::string& output, const std::string& input) - { - try - { - application_.HandleSerializedMessage(input.c_str()); - } - catch (StoneException& exc) - { - printf("Error while handling message from web (error code = %d):\n", exc.GetErrorCode()); - printf("While interpreting input: '%s'\n", input.c_str()); - output = std::string("ERROR : "); - } - catch (std::exception& exc) - { - printf("Error while handling message from web (error text = %s):\n", exc.what()); - printf("While interpreting input: '%s'\n", input.c_str()); - output = std::string("ERROR : "); - } - } - - void WasmPlatformApplicationAdapter::NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage) - { - try - { - UpdateStoneApplicationStatusFromCppWithString(statusUpdateMessage.c_str()); - } - catch (...) - { - printf("Error while handling string message to web\n"); - } - } - - void WasmPlatformApplicationAdapter::NotifyStatusUpdateFromCppToWebWithSerializedMessage(const std::string& statusUpdateMessage) - { - try - { - UpdateStoneApplicationStatusFromCppWithSerializedMessage(statusUpdateMessage.c_str()); - } - catch (...) - { - printf("Error while handling serialized message to web\n"); - } - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.h --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmPlatformApplicationAdapter.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include "../../../Framework/Messages/IObserver.h" -#include - -namespace OrthancStone -{ - class WasmPlatformApplicationAdapter : public IObserver - { - IStoneApplication& application_; - public: - WasmPlatformApplicationAdapter(MessageBroker& broker, IStoneApplication& application); - - virtual void HandleSerializedMessageFromWeb(std::string& output, const std::string& input); - virtual void NotifyStatusUpdateFromCppToWebWithString(const std::string& statusUpdateMessage); - virtual void NotifyStatusUpdateFromCppToWebWithSerializedMessage(const std::string& statusUpdateMessage); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WasmViewport.h" - -#include -#include - -std::vector> wasmViewports; - -void AttachWidgetToWasmViewport(const char* htmlCanvasId, Deprecated::IWidget* centralWidget) { - std::shared_ptr viewport(CreateWasmViewportFromCpp(htmlCanvasId)); - viewport->SetCentralWidget(centralWidget); - - wasmViewports.push_back(viewport); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.h --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmViewport.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Viewport/WidgetViewport.h" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - // JS methods accessible from C++ - extern Deprecated::WidgetViewport* CreateWasmViewportFromCpp(const char* htmlCanvasId); - -#ifdef __cplusplus -} -#endif - -extern void AttachWidgetToWasmViewport(const char* htmlCanvasId, Deprecated::IWidget* centralWidget); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.cpp --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "WasmWebService.h" -#include "json/value.h" -#include "json/writer.h" -#include -#include - -struct CachedSuccessNotification -{ - boost::shared_ptr cachedMessage; - std::unique_ptr payload; - OrthancStone::MessageHandler* successCallback; -}; - - -#ifdef __cplusplus -extern "C" { -#endif - - extern void WasmWebService_GetAsync(void* callableSuccess, - void* callableFailure, - const char* uri, - const char* headersInJsonString, - void* payload, - unsigned int timeoutInSeconds); - - extern void WasmWebService_ScheduleLaterCachedSuccessNotification(void* brol); - - extern void WasmWebService_PostAsync(void* callableSuccess, - void* callableFailure, - const char* uri, - const char* headersInJsonString, - const void* body, - size_t bodySize, - void* payload, - unsigned int timeoutInSeconds); - - extern void WasmWebService_DeleteAsync(void* callableSuccess, - void* callableFailure, - const char* uri, - const char* headersInJsonString, - void* payload, - unsigned int timeoutInSeconds); - - void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifyError(void* failureCallable, - const char* uri, - unsigned int httpStatus, - void* payload) - { - if (failureCallable != NULL) - { - reinterpret_cast*>(failureCallable)-> - Apply(Deprecated::IWebService::HttpRequestErrorMessage(uri, static_cast(httpStatus), reinterpret_cast(payload))); - } - } - - void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifyCachedSuccess(void* notification_) - { - // notification has been allocated in C++ and passed to JS. It must be deleted by this method - std::unique_ptr notification(reinterpret_cast(notification_)); - - notification->successCallback->Apply(Deprecated::IWebService::HttpRequestSuccessMessage( - notification->cachedMessage->GetUri(), - notification->cachedMessage->GetAnswer(), - notification->cachedMessage->GetAnswerSize(), - notification->cachedMessage->GetAnswerHttpHeaders(), - notification->payload.get() - )); - } - - void EMSCRIPTEN_KEEPALIVE WasmWebService_NotifySuccess(void* successCallable, - const char* uri, - const void* body, - size_t bodySize, - const char* answerHeaders, - void* payload) - { - if (successCallable != NULL) - { - Deprecated::IWebService::HttpHeaders headers; - - // TODO - Parse "answerHeaders" - //printf("TODO: parse headers [%s]\n", answerHeaders); - - reinterpret_cast*>(successCallable)-> - Apply(Deprecated::IWebService::HttpRequestSuccessMessage(uri, body, bodySize, headers, - reinterpret_cast(payload))); - } - } - -#ifdef __cplusplus -} -#endif - - - -namespace Deprecated -{ - OrthancStone::MessageBroker* WasmWebService::broker_ = NULL; - - void ToJsonString(std::string& output, const IWebService::HttpHeaders& headers) - { - Json::Value jsonHeaders; - for (IWebService::HttpHeaders::const_iterator it = headers.begin(); it != headers.end(); it++ ) - { - jsonHeaders[it->first] = it->second; - } - - Json::StreamWriterBuilder builder; - std::unique_ptr writer(builder.newStreamWriter()); - std::ostringstream outputStr; - - writer->write(jsonHeaders, &outputStr); - output = outputStr.str(); - } - - void WasmWebService::PostAsync(const std::string& relativeUri, - const HttpHeaders& headers, - const std::string& body, - Orthanc::IDynamicObject* payload, - OrthancStone::MessageHandler* successCallable, - OrthancStone::MessageHandler* failureCallable, - unsigned int timeoutInSeconds) - { - std::string headersInJsonString; - ToJsonString(headersInJsonString, headers); - WasmWebService_PostAsync(successCallable, failureCallable, relativeUri.c_str(), headersInJsonString.c_str(), - body.c_str(), body.size(), payload, timeoutInSeconds); - } - - void WasmWebService::DeleteAsync(const std::string& relativeUri, - const HttpHeaders& headers, - Orthanc::IDynamicObject* payload, - OrthancStone::MessageHandler* successCallable, - OrthancStone::MessageHandler* failureCallable, - unsigned int timeoutInSeconds) - { - std::string headersInJsonString; - ToJsonString(headersInJsonString, headers); - WasmWebService_DeleteAsync(successCallable, failureCallable, relativeUri.c_str(), headersInJsonString.c_str(), - payload, timeoutInSeconds); - } - - void WasmWebService::GetAsyncInternal(const std::string &relativeUri, - const HttpHeaders &headers, - Orthanc::IDynamicObject *payload, - OrthancStone::MessageHandler *successCallable, - OrthancStone::MessageHandler *failureCallable, - unsigned int timeoutInSeconds) - { - std::string headersInJsonString; - ToJsonString(headersInJsonString, headers); - WasmWebService_GetAsync(successCallable, failureCallable, relativeUri.c_str(), - headersInJsonString.c_str(), payload, timeoutInSeconds); - } - - void WasmWebService::NotifyHttpSuccessLater(boost::shared_ptr cachedMessage, - Orthanc::IDynamicObject* payload, // takes ownership - OrthancStone::MessageHandler* successCallback) - { - CachedSuccessNotification* notification = new CachedSuccessNotification(); // allocated on the heap, it will be passed to JS and deleted when coming back to C++ - notification->cachedMessage = cachedMessage; - notification->payload.reset(payload); - notification->successCallback = successCallback; - - WasmWebService_ScheduleLaterCachedSuccessNotification(notification); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.h --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Deprecated/Toolbox/BaseWebService.h" -#include - -namespace Deprecated -{ -class WasmWebService : public BaseWebService -{ -private: - static OrthancStone::MessageBroker *broker_; - - // Private constructor => Singleton design pattern - WasmWebService(OrthancStone::MessageBroker &broker) : BaseWebService(broker) - { - } - -public: - static WasmWebService &GetInstance() - { - if (broker_ == NULL) - { - printf("WasmWebService::GetInstance(): broker not initialized\n"); - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - static WasmWebService instance(*broker_); - return instance; - } - - static void SetBroker(OrthancStone::MessageBroker &broker) - { - broker_ = &broker; - } - - virtual void PostAsync(const std::string &uri, - const HttpHeaders &headers, - const std::string &body, - Orthanc::IDynamicObject *payload, - OrthancStone::MessageHandler *successCallable, - OrthancStone::MessageHandler *failureCallable = NULL, - unsigned int timeoutInSeconds = 60); - - virtual void DeleteAsync(const std::string &uri, - const HttpHeaders &headers, - Orthanc::IDynamicObject *payload, - OrthancStone::MessageHandler *successCallable, - OrthancStone::MessageHandler *failureCallable = NULL, - unsigned int timeoutInSeconds = 60); - -protected: - virtual void GetAsyncInternal(const std::string &uri, - const HttpHeaders &headers, - Orthanc::IDynamicObject *payload, - OrthancStone::MessageHandler *successCallable, - OrthancStone::MessageHandler *failureCallable = NULL, - unsigned int timeoutInSeconds = 60); - - virtual void NotifyHttpSuccessLater(boost::shared_ptr cachedHttpMessage, - Orthanc::IDynamicObject *payload, // takes ownership - OrthancStone::MessageHandler *successCallback); -}; -} // namespace Deprecated diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.js --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/WasmWebService.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -mergeInto(LibraryManager.library, { - WasmWebService_GetAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) { - // Directly use XMLHttpRequest (no jQuery) to retrieve the raw binary data - // http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ - var xhr = new XMLHttpRequest(); - var url_ = UTF8ToString(url); - var headersInJsonString_ = UTF8ToString(headersInJsonString); - - xhr.open('GET', url_, true); - xhr.responseType = 'arraybuffer'; - xhr.timeout = timeoutInSeconds * 1000; - var headers = JSON.parse(headersInJsonString_); - for (var key in headers) { - xhr.setRequestHeader(key, headers[key]); - } - //console.log(xhr); - xhr.onreadystatechange = function() { - if (this.readyState == XMLHttpRequest.DONE) { - if (xhr.status === 200) { - var s = xhr.getAllResponseHeaders(); - var headers = _malloc(s.length + 1); - stringToUTF8(s, headers, s.length + 1); - - // TODO - Is "new Uint8Array()" necessary? This copies the - // answer to the WebAssembly stack, hence necessitating - // increasing the TOTAL_STACK parameter of Emscripten - window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), - this.response.byteLength, headers, payload); - } else { - window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); - } - } - } - - xhr.send(); - }, - - WasmWebService_ScheduleLaterCachedSuccessNotification: function (brol) { - setTimeout(function() { - window.WasmWebService_NotifyCachedSuccess(brol); - }, 0); - }, - - WasmWebService_PostAsync: function(callableSuccess, callableFailure, url, headersInJsonString, body, bodySize, payload, timeoutInSeconds) { - var xhr = new XMLHttpRequest(); - var url_ = UTF8ToString(url); - var headersInJsonString_ = UTF8ToString(headersInJsonString); - xhr.open('POST', url_, true); - xhr.timeout = timeoutInSeconds * 1000; - xhr.responseType = 'arraybuffer'; - xhr.setRequestHeader('Content-type', 'application/octet-stream'); - - var headers = JSON.parse(headersInJsonString_); - for (var key in headers) { - xhr.setRequestHeader(key, headers[key]); - } - - xhr.onreadystatechange = function() { - if (this.readyState == XMLHttpRequest.DONE) { - if (xhr.status === 200) { - var s = xhr.getAllResponseHeaders(); - var headers = _malloc(s.length + 1); - stringToUTF8(s, headers, s.length + 1); - - window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), - this.response.byteLength, headers, payload); - } else { - window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); - } - } - } - - xhr.send(new Uint8ClampedArray(HEAPU8.buffer, body, bodySize)); - }, - - WasmWebService_DeleteAsync: function(callableSuccess, callableFailure, url, headersInJsonString, payload, timeoutInSeconds) { - var xhr = new XMLHttpRequest(); - var url_ = UTF8ToString(url); - var headersInJsonString_ = UTF8ToString(headersInJsonString); - xhr.open('DELETE', url_, true); - xhr.timeout = timeoutInSeconds * 1000; - xhr.responseType = 'arraybuffer'; - xhr.setRequestHeader('Content-type', 'application/octet-stream'); - - var headers = JSON.parse(headersInJsonString_); - for (var key in headers) { - xhr.setRequestHeader(key, headers[key]); - } - - xhr.onreadystatechange = function() { - if (this.readyState == XMLHttpRequest.DONE) { - if (xhr.status === 200) { - var s = xhr.getAllResponseHeaders(); - var headers = _malloc(s.length + 1); - stringToUTF8(s, headers, s.length + 1); - - window.WasmWebService_NotifySuccess(callableSuccess, url_, new Uint8Array(this.response), - this.response.byteLength, headers, payload); - } else { - window.WasmWebService_NotifyError(callableFailure, url_, xhr.status, payload); - } - } - } - - xhr.send(); - } - -}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/default-library.js --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/default-library.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -// this file contains the JS method you want to expose to C++ code - -mergeInto(LibraryManager.library, { - - ScheduleWebViewportRedrawFromCpp: function(cppViewportHandle) { - window.ScheduleWebViewportRedraw(cppViewportHandle); - }, - - CreateWasmViewportFromCpp: function(htmlCanvasId) { - return window.CreateWasmViewport(htmlCanvasId); - }, - - // each time the StoneApplication updates its status, it may signal it - // through this method. i.e, to change the status of a button in the web interface - UpdateStoneApplicationStatusFromCppWithString: function(statusUpdateMessage) { - var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); - window.UpdateWebApplicationWithString(statusUpdateMessage_); - }, - - // same, but with a serialized message - UpdateStoneApplicationStatusFromCppWithSerializedMessage: function(statusUpdateMessage) { - var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); - window.UpdateWebApplicationWithSerializedMessage(statusUpdateMessage_); - }, - - // These functions are called from C++ (through an extern declaration) - // and call the standard logger that, here, routes to the console. - - stone_console_error : function(message) { - var text = UTF8ToString(message); - window.errorFromCpp(text); - }, - - stone_console_warning : function(message) { - var text = UTF8ToString(message); - window.warningFromCpp(text); - }, - - stone_console_info: function(message) { - var text = UTF8ToString(message); - window.infoFromCpp(text); - }, - - stone_console_trace : function(message) { - var text = UTF8ToString(message); - window.debugFromCpp(text); - } - -}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/logger.ts --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/logger.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -export enum LogSource { - Cpp, - Typescript -} - -export class StandardConsoleLogger { - public showSource: boolean = true; - - public debug(...args: any[]): void { - this._debug(LogSource.Typescript, ...args); - } - - public debugFromCpp(...args: any[]): void { - this._debug(LogSource.Cpp, ...args); - } - - public info(...args: any[]): void { - this._info(LogSource.Typescript, ...args); - } - - public infoFromCpp(message: string): void { - this._info(LogSource.Cpp, message); - } - - public warning(...args: any[]): void { - this._warning(LogSource.Typescript, ...args); - } - - public warningFromCpp(message: string): void { - this._warning(LogSource.Cpp, message); - } - - public error(...args: any[]): void { - this._error(LogSource.Typescript, ...args); - } - - public errorFromCpp(message: string): void { - this._error(LogSource.Cpp, message); - } - - public _debug(source: LogSource, ...args: any[]): void { - if (( window).IsTraceLevelEnabled) - { - if (( window).IsTraceLevelEnabled()) - { - var output = this.getOutput(source, args); - console.debug(...output); - } - } - } - - private _info(source: LogSource, ...args: any[]): void { - if (( window).IsInfoLevelEnabled) - { - if (( window).IsInfoLevelEnabled()) - { - var output = this.getOutput(source, args); - console.info(...output); - } - } - } - - public _warning(source: LogSource, ...args: any[]): void { - var output = this.getOutput(source, args); - console.warn(...output); - } - - public _error(source: LogSource, ...args: any[]): void { - var output = this.getOutput(source, args); - console.error(...output); - } - - - private getOutput(source: LogSource, args: any[]): any[] { - var prefix = this.getPrefix(); - var prefixAndSource = Array(); - - if (prefix != null) { - prefixAndSource = [prefix]; - } - - if (this.showSource) { - if (source == LogSource.Typescript) { - prefixAndSource = [...prefixAndSource, "TS "]; - } else if (source == LogSource.Cpp) { - prefixAndSource = [...prefixAndSource, "C++"]; - } - } - - if (prefixAndSource.length > 0) { - prefixAndSource = [...prefixAndSource, "|"]; - } - - return [...prefixAndSource, ...args]; - } - - protected getPrefix(): string | null { - return null; - } -} - -export class TimeConsoleLogger extends StandardConsoleLogger { - protected getPrefix(): string { - let now = new Date(); - let timeString = now.getHours().toString().padStart(2, "0") + ":" + now.getMinutes().toString().padStart(2, "0") + ":" + now.getSeconds().toString().padStart(2, "0") + "." + now.getMilliseconds().toString().padStart(3, "0"); - return timeString; - } -} - -export var defaultLogger: StandardConsoleLogger = new TimeConsoleLogger(); - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/stone-framework-loader.ts --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/stone-framework-loader.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/** - * This file contains primitives to interface with WebAssembly and - * with the Stone framework. - **/ -import * as Logger from './logger' - -export declare type InitializationCallback = () => void; - -//export declare var StoneFrameworkModule : any; -export var StoneFrameworkModule : any; - -//const ASSETS_FOLDER : string = "assets/lib"; -//const WASM_FILENAME : string = "orthanc-framework"; - -export class Framework -{ - private static singleton_ : Framework = null; - private static wasmModuleName_ : string = null; - - public static Configure(wasmModuleName: string) { - this.wasmModuleName_ = wasmModuleName; - } - - private constructor(verbose : boolean) - { - //this.ccall('Initialize', null, [ 'number' ], [ verbose ]); - } - - - public ccall( name: string, - returnType: string, - argTypes: Array, - argValues: Array) : any - { - return ( window).StoneFrameworkModule.ccall(name, returnType, argTypes, argValues); - } - - - public cwrap( name: string, - returnType: string, - argTypes: Array) : any - { - return ( window).StoneFrameworkModule.cwrap(name, returnType, argTypes); - } - - - public static GetInstance() : Framework - { - if (Framework.singleton_ == null) { - throw new Error('The WebAssembly module is not loaded yet'); - } else { - return Framework.singleton_; - } - } - - - public static Initialize( verbose: boolean, - callback: InitializationCallback) - { - Logger.defaultLogger.debug('Initializing WebAssembly Module'); - - ( window).errorFromCpp = function(text:any) { Logger.defaultLogger.errorFromCpp(text); }; - ( window).warningFromCpp = function(text:any) { Logger.defaultLogger.warningFromCpp(text); }; - ( window).infoFromCpp = function(text:any) { Logger.defaultLogger.infoFromCpp(text); }; - ( window).debugFromCpp = function(text:any) { Logger.defaultLogger.debugFromCpp(text); }; - - // ( window). - ( window).StoneFrameworkModule = { - preRun: [ - function() { - Logger.defaultLogger.debug('Loading the Stone Framework using WebAssembly'); - } - ], - postRun: [ - function() { - // This function is called by ".js" wrapper once the ".wasm" - // WebAssembly module has been loaded and compiled by the - // browser - Logger.defaultLogger.debug('WebAssembly is ready'); - Framework.singleton_ = new Framework(verbose); - callback(); - } - ], - totalDependencies: 0 - }; - - // Dynamic loading of the JavaScript wrapper around WebAssembly - var script = document.createElement('script'); - script.type = 'application/javascript'; - //script.src = "orthanc-stone.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; - script.src = this.wasmModuleName_ + ".js";// "OrthancStoneSimpleViewer.js"; // ASSETS_FOLDER + '/' + WASM_FILENAME + '.js'; - script.async = true; - document.head.appendChild(script); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/tsconfig-stone.json --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/tsconfig-stone.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -{ - "include" : [ - "stone-framework-loader.ts", - "logger.ts", - "wasm-application-runner.ts", - "wasm-viewport.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-application-runner.ts --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-application-runner.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -import * as Stone from './stone-framework-loader' -import * as StoneViewport from './wasm-viewport' -import * as Logger from './logger' - -if (!('WebAssembly' in window)) { - alert('Sorry, your browser does not support WebAssembly :('); -} - -//var StoneFrameworkModule : Stone.Framework = (window).StoneFrameworkModule; -//export declare var StoneFrameworkModule : Stone.Framework; - -// global functions -var WasmWebService_NotifyError: Function = null; -var WasmWebService_NotifySuccess: Function = null; -var WasmWebService_NotifyCachedSuccess: Function = null; -var WasmDelayedCallExecutor_ExecuteCallback: Function = null; -var WasmDoAnimation: Function = null; -var SetStartupParameter: Function = null; -var CreateWasmApplication: Function = null; -export var CreateCppViewport: Function = null; -var ReleaseCppViewport: Function = null; -var StartWasmApplication: Function = null; -export var SendSerializedMessageToStoneApplication: Function = null; - -var auxiliaryParameters : Map = null; - -export function SetApplicationParameters(params : Map) { - if (auxiliaryParameters != null) { - console.warn("wasm-application-runner.SetApplicationParameters: about to overwrite the existing application parameters!") - } - auxiliaryParameters = params; -} - -function DoAnimationThread() { - if (WasmDoAnimation != null) { - WasmDoAnimation(); - } - - // Update the viewport content every 100ms if need be - setTimeout(DoAnimationThread, 100); -} - - -function GetUriParameters(): Map { - var parameters = window.location.search.substr(1); - - if (parameters != null && - parameters != '') { - var result = new Map(); - var tokens = parameters.split('&'); - - for (var i = 0; i < tokens.length; i++) { - var tmp = tokens[i].split('='); - if (tmp.length == 2) { - result[tmp[0]] = decodeURIComponent(tmp[1]); - } else if(tmp.length == 1) { - // if there is no '=', we treat ot afterwards as a flag-style param - result[tmp[0]] = ""; - } - } - return result; - } - else { - return new Map(); - } -} - -// function UpdateWebApplication(statusUpdateMessage: string) { -// console.log(statusUpdateMessage); -// } - -function _InitializeWasmApplication(orthancBaseUrl: string): void { - - CreateWasmApplication(); - - // transmit the API-specified parameters to the app before initializing it - for (let key in auxiliaryParameters) { - if (auxiliaryParameters.hasOwnProperty(key)) { - Logger.defaultLogger.debug( - `About to call SetStartupParameter("${key}","${auxiliaryParameters[key]}")`); - SetStartupParameter(key, auxiliaryParameters[key]); - } - } - - // parse uri and transmit the URI parameters to the app before initializing it - let parameters = GetUriParameters(); - - for (let key in parameters) { - if (parameters.hasOwnProperty(key)) { - Logger.defaultLogger.debug( - `About to call SetStartupParameter("${key}","${parameters[key]}")`); - SetStartupParameter(key, parameters[key]); - } - } - - StartWasmApplication(orthancBaseUrl); - - // trigger a first resize of the canvas that has just been initialized - StoneViewport.WasmViewport.ResizeAll(); - - DoAnimationThread(); -} - -export function InitializeWasmApplication(wasmModuleName: string, orthancBaseUrl: string) { - - Stone.Framework.Configure(wasmModuleName); - - // Wait for the Orthanc Framework to be initialized (this initializes - // the WebAssembly environment) and then, create and initialize the Wasm application - Stone.Framework.Initialize(true, function () { - - Logger.defaultLogger.debug("Connecting C++ methods to JS methods"); - - SetStartupParameter = ( window).StoneFrameworkModule.cwrap('SetStartupParameter', null, ['string', 'string']); - CreateWasmApplication = ( window).StoneFrameworkModule.cwrap('CreateWasmApplication', null, ['number']); - CreateCppViewport = ( window).StoneFrameworkModule.cwrap('CreateCppViewport', 'number', []); - ReleaseCppViewport = ( window).StoneFrameworkModule.cwrap('ReleaseCppViewport', null, ['number']); - StartWasmApplication = ( window).StoneFrameworkModule.cwrap('StartWasmApplication', null, ['string']); - ( window).IsTraceLevelEnabled = ( window).StoneFrameworkModule.cwrap('WasmIsTraceLevelEnabled', 'boolean', null); - ( window).IsInfoLevelEnabled = ( window).StoneFrameworkModule.cwrap('WasmIsInfoLevelEnabled', 'boolean', null); - - ( window).WasmWebService_NotifyCachedSuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyCachedSuccess', null, ['number']); - ( window).WasmWebService_NotifySuccess = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifySuccess', null, ['number', 'string', 'array', 'number', 'number']); - ( window).WasmWebService_NotifyError = ( window).StoneFrameworkModule.cwrap('WasmWebService_NotifyError', null, ['number', 'string', 'number', 'number']); - ( window).WasmDelayedCallExecutor_ExecuteCallback = ( window).StoneFrameworkModule.cwrap('WasmDelayedCallExecutor_ExecuteCallback', null, ['number']); - // no need to put this into the globals for it's only used in this very module - WasmDoAnimation = ( window).StoneFrameworkModule.cwrap('WasmDoAnimation', null, []); - - SendSerializedMessageToStoneApplication = ( window).StoneFrameworkModule.cwrap('SendSerializedMessageToStoneApplication', 'string', ['string']); - - Logger.defaultLogger.debug("Connecting C++ methods to JS methods - done"); - - _InitializeWasmApplication(orthancBaseUrl); - }); -} - - -// exports.InitializeWasmApplication = InitializeWasmApplication; - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-viewport.ts --- a/Resources/Graveyard/Deprecated/Platforms/Wasm/wasm-viewport.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,359 +0,0 @@ -import * as wasmApplicationRunner from './wasm-application-runner' -import * as Logger from './logger' - -var isPendingRedraw = false; - -function ScheduleWebViewportRedraw(cppViewportHandle: any) : void -{ - if (!isPendingRedraw) { - isPendingRedraw = true; - Logger.defaultLogger.debug('Scheduling a refresh of the viewport, as its content changed'); - window.requestAnimationFrame(function() { - isPendingRedraw = false; - let viewport = WasmViewport.GetFromCppViewport(cppViewportHandle); - if (viewport) { - viewport.Redraw(); - } - }); - } -} - -(window).ScheduleWebViewportRedraw = ScheduleWebViewportRedraw; - -declare function UTF8ToString(v: any): string; - -function CreateWasmViewport(htmlCanvasId: string) : any { - var cppViewportHandle = wasmApplicationRunner.CreateCppViewport(); - var canvasId = UTF8ToString(htmlCanvasId); - var webViewport = new WasmViewport(( window).StoneFrameworkModule, canvasId, cppViewportHandle); // viewports are stored in a static map in WasmViewport -> won't be deleted - webViewport.Initialize(); - - return cppViewportHandle; -} - -(window).CreateWasmViewport = CreateWasmViewport; - -export class WasmViewport { - - private static viewportsMapByCppHandle_ : Map = new Map(); // key = the C++ handle - private static viewportsMapByCanvasId_ : Map = new Map(); // key = the canvasId - - private module_ : any; - private canvasId_ : string; - private htmlCanvas_ : HTMLCanvasElement; - private context_ : CanvasRenderingContext2D | null; - private imageData_ : any = null; - private renderingBuffer_ : any = null; - - private touchGestureInProgress_: boolean = false; - private touchCount_: number = 0; - private touchGestureLastCoordinates_: [number, number][] = []; // last x,y coordinates of each touch - - private touchZoom_ : any = false; - private touchTranslation_ : any = false; - - private ViewportSetSize : Function; - private ViewportRender : Function; - private ViewportMouseDown : Function; - private ViewportMouseMove : Function; - private ViewportMouseUp : Function; - private ViewportMouseEnter : Function; - private ViewportMouseLeave : Function; - private ViewportMouseWheel : Function; - private ViewportKeyPressed : Function; - private ViewportTouchStart : Function; - private ViewportTouchMove : Function; - private ViewportTouchEnd : Function; - - private pimpl_ : any; // Private pointer to the underlying WebAssembly C++ object - - public constructor(module: any, canvasId: string, cppViewport: any) { - - this.pimpl_ = cppViewport; - WasmViewport.viewportsMapByCppHandle_[this.pimpl_] = this; - WasmViewport.viewportsMapByCanvasId_[canvasId] = this; - - this.module_ = module; - this.canvasId_ = canvasId; - this.htmlCanvas_ = document.getElementById(this.canvasId_) as HTMLCanvasElement; - if (this.htmlCanvas_ == null) { - Logger.defaultLogger.error("Can not create WasmViewport, did not find the canvas whose id is '", this.canvasId_, "'"); - } - this.context_ = this.htmlCanvas_.getContext('2d'); - - this.ViewportSetSize = this.module_.cwrap('ViewportSetSize', null, [ 'number', 'number', 'number' ]); - this.ViewportRender = this.module_.cwrap('ViewportRender', null, [ 'number', 'number', 'number', 'number' ]); - this.ViewportMouseDown = this.module_.cwrap('ViewportMouseDown', null, [ 'number', 'number', 'number', 'number', 'number' ]); - this.ViewportMouseMove = this.module_.cwrap('ViewportMouseMove', null, [ 'number', 'number', 'number' ]); - this.ViewportMouseUp = this.module_.cwrap('ViewportMouseUp', null, [ 'number' ]); - this.ViewportMouseEnter = this.module_.cwrap('ViewportMouseEnter', null, [ 'number' ]); - this.ViewportMouseLeave = this.module_.cwrap('ViewportMouseLeave', null, [ 'number' ]); - this.ViewportMouseWheel = this.module_.cwrap('ViewportMouseWheel', null, [ 'number', 'number', 'number', 'number', 'number' ]); - this.ViewportKeyPressed = this.module_.cwrap('ViewportKeyPressed', null, [ 'number', 'number', 'string', 'number', 'number' ]); - this.ViewportTouchStart = this.module_.cwrap('ViewportTouchStart', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); - this.ViewportTouchMove = this.module_.cwrap('ViewportTouchMove', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); - this.ViewportTouchEnd = this.module_.cwrap('ViewportTouchEnd', null, [ 'number', 'number', 'number', 'number', 'number', 'number', 'number' ]); - } - - public GetCppViewport() : number { - return this.pimpl_; - } - - public static GetFromCppViewport(cppViewportHandle: number) : WasmViewport | null { - if (WasmViewport.viewportsMapByCppHandle_[cppViewportHandle] !== undefined) { - return WasmViewport.viewportsMapByCppHandle_[cppViewportHandle]; - } - Logger.defaultLogger.error("WasmViewport not found !"); - return null; - } - - public static GetFromCanvasId(canvasId: string) : WasmViewport | null { - if (WasmViewport.viewportsMapByCanvasId_[canvasId] !== undefined) { - return WasmViewport.viewportsMapByCanvasId_[canvasId]; - } - Logger.defaultLogger.error("WasmViewport not found !"); - return null; - } - - public static ResizeAll() { - for (let canvasId in WasmViewport.viewportsMapByCanvasId_) { - WasmViewport.viewportsMapByCanvasId_[canvasId].Resize(); - } - } - - public Redraw() { - if (this.imageData_ === null || - this.renderingBuffer_ === null || - this.ViewportRender(this.pimpl_, - this.imageData_.width, - this.imageData_.height, - this.renderingBuffer_) == 0) { - Logger.defaultLogger.error('The rendering has failed'); - } else { - // Create an accessor to the rendering buffer (i.e. create a - // "window" above the heap of the WASM module), then copy it to - // the ImageData object - this.imageData_.data.set(new Uint8ClampedArray( - this.module_.HEAPU8.buffer, - this.renderingBuffer_, - this.imageData_.width * this.imageData_.height * 4)); - - if (this.context_) { - this.context_.putImageData(this.imageData_, 0, 0); - } - } - } - - public Resize() { - if (this.imageData_ != null && - (this.imageData_.width != window.innerWidth || - this.imageData_.height != window.innerHeight)) { - this.imageData_ = null; - } - - // width/height is defined by the parent width/height - if (this.htmlCanvas_.parentElement) { - this.htmlCanvas_.width = this.htmlCanvas_.parentElement.offsetWidth; - this.htmlCanvas_.height = this.htmlCanvas_.parentElement.offsetHeight; - - Logger.defaultLogger.debug("resizing WasmViewport: ", this.htmlCanvas_.width, "x", this.htmlCanvas_.height); - - if (this.imageData_ === null && this.context_) { - this.imageData_ = this.context_.getImageData(0, 0, this.htmlCanvas_.width, this.htmlCanvas_.height); - this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); - - if (this.renderingBuffer_ != null) { - this.module_._free(this.renderingBuffer_); - } - - this.renderingBuffer_ = this.module_._malloc(this.imageData_.width * this.imageData_.height * 4); - } else { - this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); - } - - this.Redraw(); - } - } - - public Initialize() { - - // Force the rendering of the viewport for the first time - this.Resize(); - - var that : WasmViewport = this; - // Register an event listener to call the Resize() function - // each time the window is resized. - window.addEventListener('resize', function(event) { - that.Resize(); - }, false); - - this.htmlCanvas_.addEventListener('contextmenu', function(event) { - // Prevent right click on the canvas - event.preventDefault(); - }, false); - - this.htmlCanvas_.addEventListener('mouseleave', function(event) { - that.ViewportMouseLeave(that.pimpl_); - }); - - this.htmlCanvas_.addEventListener('mouseenter', function(event) { - that.ViewportMouseEnter(that.pimpl_); - }); - - this.htmlCanvas_.addEventListener('mousedown', function(event) { - var x = event.pageX - this.offsetLeft; - var y = event.pageY - this.offsetTop; - - that.ViewportMouseDown(that.pimpl_, event.button, x, y, 0 /* TODO detect modifier keys*/); - }); - - this.htmlCanvas_.addEventListener('mousemove', function(event) { - var x = event.pageX - this.offsetLeft; - var y = event.pageY - this.offsetTop; - that.ViewportMouseMove(that.pimpl_, x, y); - }); - - this.htmlCanvas_.addEventListener('mouseup', function(event) { - that.ViewportMouseUp(that.pimpl_); - }); - - window.addEventListener('keydown', function(event) { - var keyChar: string | null = event.key; - var keyCode = event.keyCode - if (keyChar.length == 1) { - keyCode = 0; // maps to OrthancStone::KeyboardKeys_Generic - } else { - keyChar = null; - } -// console.log("key: ", keyCode, keyChar); - that.ViewportKeyPressed(that.pimpl_, keyCode, keyChar, event.shiftKey, event.ctrlKey, event.altKey); - }); - - this.htmlCanvas_.addEventListener('wheel', function(event) { - var x = event.pageX - this.offsetLeft; - var y = event.pageY - this.offsetTop; - that.ViewportMouseWheel(that.pimpl_, event.deltaY, x, y, event.ctrlKey); - event.preventDefault(); - }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface - - this.htmlCanvas_.addEventListener('touchstart', function(event: TouchEvent) { - // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) - event.preventDefault(); - event.stopPropagation(); - - // TODO: find a way to pass the coordinates as an array between JS and C++ - var x0 = 0; - var y0 = 0; - var x1 = 0; - var y1 = 0; - var x2 = 0; - var y2 = 0; - if (event.targetTouches.length > 0) { - x0 = event.targetTouches[0].pageX; - y0 = event.targetTouches[0].pageY; - } - if (event.targetTouches.length > 1) { - x1 = event.targetTouches[1].pageX; - y1 = event.targetTouches[1].pageY; - } - if (event.targetTouches.length > 2) { - x2 = event.targetTouches[2].pageX; - y2 = event.targetTouches[2].pageY; - } - - that.ViewportTouchStart(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); - }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface - - this.htmlCanvas_.addEventListener('touchend', function(event) { - // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) - event.preventDefault(); - event.stopPropagation(); - - // TODO: find a way to pass the coordinates as an array between JS and C++ - var x0 = 0; - var y0 = 0; - var x1 = 0; - var y1 = 0; - var x2 = 0; - var y2 = 0; - if (event.targetTouches.length > 0) { - x0 = event.targetTouches[0].pageX; - y0 = event.targetTouches[0].pageY; - } - if (event.targetTouches.length > 1) { - x1 = event.targetTouches[1].pageX; - y1 = event.targetTouches[1].pageY; - } - if (event.targetTouches.length > 2) { - x2 = event.targetTouches[2].pageX; - y2 = event.targetTouches[2].pageY; - } - - that.ViewportTouchEnd(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); - }); - - this.htmlCanvas_.addEventListener('touchmove', function(event: TouchEvent) { - - // don't propagate events to the whole body (this could zoom the entire page instead of zooming the viewport) - event.preventDefault(); - event.stopPropagation(); - - - // TODO: find a way to pass the coordinates as an array between JS and C++ - var x0 = 0; - var y0 = 0; - var x1 = 0; - var y1 = 0; - var x2 = 0; - var y2 = 0; - if (event.targetTouches.length > 0) { - x0 = event.targetTouches[0].pageX; - y0 = event.targetTouches[0].pageY; - } - if (event.targetTouches.length > 1) { - x1 = event.targetTouches[1].pageX; - y1 = event.targetTouches[1].pageY; - } - if (event.targetTouches.length > 2) { - x2 = event.targetTouches[2].pageX; - y2 = event.targetTouches[2].pageY; - } - - that.ViewportTouchMove(that.pimpl_, event.targetTouches.length, x0, y0, x1, y1, x2, y2); - return; - - }, {passive: false}); // must not be passive if calling event.preventDefault, ie to cancel scroll or zoom of the whole interface - } - - public ResetTouch() { - if (this.touchTranslation_ || - this.touchZoom_) { - this.ViewportMouseUp(this.pimpl_); - } - - this.touchTranslation_ = false; - this.touchZoom_ = false; - } - - public GetTouchTranslation(event: any) { - var touch = event.targetTouches[0]; - return [ - touch.pageX, - touch.pageY - ]; - } - - public GetTouchZoom(event: any) { - var touch1 = event.targetTouches[0]; - var touch2 = event.targetTouches[1]; - var dx = (touch1.pageX - touch2.pageX); - var dy = (touch1.pageY - touch2.pageY); - var d = Math.sqrt(dx * dx + dy * dy); - return [ - (touch1.pageX + touch2.pageX) / 2.0, - (touch1.pageY + touch2.pageY) / 2.0, - d - ]; - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground.ts --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 -*/ - -namespace VsolStuff -{ - enum EnumMonth0 - { - January, - February, - March - }; - - // interface Serializer - // { - // Serialize(value: number): string; - // Serialize(value: string): string; - // Serialize(value: EnumMonth0): string; - // }; - function printf(value: any):void - { - console.log(value) - } - - // function StoneSerialize(value: string) : string; - // function StoneSerialize(value: number) : string; - // function StoneSerialize(value: EnumMonth0) : string; - function StoneSerialize(value: T[]) : string; - - function StoneSerialize(value: T[] | EnumMonth0) : string - { - let valueType = typeof value; - printf(`About to serialize value. Type is ${valueType}`) - printf(`About to serialize value. Type is ${typeof value}`) - return "Choucroute"; - } - - function main():number - { - enum Color {Red = 1, Green = 2, Blue = 4} - let color: Color = Color.Green; - printf("---------------------------"); - printf(`typeof color: ${typeof color}`); - printf("---------------------------"); - let colors: Color[] = [] - colors.push(Color.Green); - colors.push(Color.Red); - printf(`typeof colors: ${typeof colors}`); - printf(`Array.isArray(colors): ${Array.isArray(colors)}`); - printf("---------------------------"); - - - let toto:EnumMonth0[] = []; - - toto.push(EnumMonth0.February); - toto.push(EnumMonth0.March); - - printf(JSON.stringify(toto)); - - return 0; - - } - - main() - -// string StoneSerialize_number(int32_t value) -// { - -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(double value) -// { -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(bool value) -// { -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(const std::string& value) -// { -// // the following is better than -// Json::Value result(value.data(),value.data()+value.size()); -// return result; -// } - -// template -// Json::Value StoneSerialize(const std::map& value) -// { -// Json::Value result(Json::objectValue); - -// for (std::map::const_iterator it = value.cbegin(); -// it != value.cend(); ++it) -// { -// // it->first it->second -// result[it->first] = StoneSerialize(it->second); -// } -// return result; -// } - -// template -// Json::Value StoneSerialize(const std::vector& value) -// { -// Json::Value result(Json::arrayValue); -// for (size_t i = 0; i < value.size(); ++i) -// { -// result.append(StoneSerialize(value[i])); -// } -// return result; -// } - -// enum EnumMonth0 -// { -// January, -// February, -// March -// }; - -// std::string ToString(EnumMonth0 value) -// { -// switch(value) -// { -// case January: -// return "January"; -// case February: -// return "February"; -// case March: -// return "March"; -// default: -// { -// std::stringstream ss; -// ss << "Unrecognized EnumMonth0 value (" << static_cast(value) << ")"; -// throw std::runtime_error(ss.str()); -// } -// } -// } - -// void FromString(EnumMonth0& value, std::string strValue) -// { -// if (strValue == "January" || strValue == "EnumMonth0_January") -// { -// return January; -// } -// else if (strValue == "February" || strValue == "EnumMonth0_February") -// { -// return February; -// } -// #error Not implemented yet -// } - -// Json::Value StoneSerialize(const EnumMonth0& value) -// { -// return StoneSerialize(ToString(value)); -// } -// struct Message1 -// { -// int32_t a; -// std::string b; -// EnumMonth0 c; -// bool d; -// }; - -// struct Message2 -// { -// std::string toto; -// std::vector tata; -// std::vector tutu; -// std::map titi; -// std::map lulu; -// }; - -// Json::Value StoneSerialize(const Message1& value) -// { -// Json::Value result(Json::objectValue); -// result["a"] = StoneSerialize(value.a); -// result["b"] = StoneSerialize(value.b); -// result["c"] = StoneSerialize(value.c); -// result["d"] = StoneSerialize(value.d); -// return result; -// } - -// Json::Value StoneSerialize(const Message2& value) -// { -// Json::Value result(Json::objectValue); -// result["toto"] = StoneSerialize(value.toto); -// result["tata"] = StoneSerialize(value.tata); -// result["tutu"] = StoneSerialize(value.tutu); -// result["titi"] = StoneSerialize(value.titi); -// result["lulu"] = StoneSerialize(value.lulu); -// return result; -// } -// } - -// int main() -// { -// VsolStuff::Message1 msg1_0; -// msg1_0.a = 42; -// msg1_0.b = "Benjamin"; -// msg1_0.c = VsolStuff::January; -// msg1_0.d = true; - -// VsolStuff::Message1 msg1_1; -// msg1_1.a = 43; -// msg1_1.b = "Sandrine"; -// msg1_1.c = VsolStuff::March; -// msg1_0.d = false; - -// // std::string toto; -// // std::vector tata; -// // std::vector tutu; -// // std::map titi; -// // std::map lulu; - -// VsolStuff::Message2 msg2_0; -// msg2_0.toto = "Prout zizi"; -// msg2_0.tata.push_back(msg1_0); -// msg2_0.tata.push_back(msg1_1); -// msg2_0.tutu.push_back("Mercadet"); -// msg2_0.tutu.push_back("Poisson"); -// msg2_0.titi["44"] = "key 44"; -// msg2_0.titi["45"] = "key 45"; -// msg2_0.lulu["54"] = msg1_1; -// msg2_0.lulu["55"] = msg1_0; -// auto result = VsolStuff::StoneSerialize(msg2_0); -// auto resultStr = result.toStyledString(); - -// Json::Value readValue; - -// Json::CharReaderBuilder builder; -// Json::CharReader* reader = builder.newCharReader(); -// std::string errors; - -// bool ok = reader->parse( -// resultStr.c_str(), -// resultStr.c_str() + resultStr.size(), -// &readValue, -// &errors -// ); -// delete reader; - -// if (!ok) -// { -// std::stringstream ss; -// ss << "Json parsing error: " << errors; -// throw std::runtime_error(ss.str()); -// } -// std::cout << readValue.get("toto", "Default Value").asString() << std::endl; -// return 0; -// } - - -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground2.ts --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground2.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -class Greeter { - greeting: string; - constructor(message: string) { - this.greeting = message; - } - greet() { - return "Hello, " + this.greeting; - } -} -enum Color { - Red, - Green, - Blue, -}; - -function ColorToString(value: Color) -{ - switch (value) - { - case Color.Red: - return "Red"; - case Color.Green: - return "Green"; - case Color.Blue: - return "Blue"; - default: - throw new Error(`Unrecognized Color value(${value})`); - } -} - -let color: Color = Color.Red; - -document.body.textContent = "

---------------------

" -document.body.textContent += "

********************************

" - -class TestMessage { - s1: string; - s2: Array; - s3: Array>; - s4: Map; - s5: Map>; - s6: Color; - s7: boolean; -} - -let tm = new TestMessage(); -tm.s2 = new Array() -tm.s2.push("toto"); -tm.s2.push("toto2"); -tm.s2.push("toto3"); -tm.s4 = new Map(); -tm.s4["toto"] = 42; -tm.s4["toto"] = 1999; -tm.s4["tatata"] = 1999; -tm.s6 = Color.Red; -tm.s7 = true - -let txt = JSON.stringify(tm) -let txtElem = document.createElement('textarea'); -txtElem.value = txt; - -document.body.appendChild(txtElem); - -let greeter = new Greeter("world"); - -let button = document.createElement('button'); -button.textContent = "Say Hello"; -button.onclick = function() { - alert(greeter.greet()); -} - -document.body.appendChild(button); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground3.ts --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground3.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,275 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 -*/ - -namespace VsolStuff222 { - export enum EnumMonth0 { - January, - February, - March - }; - - export class Message1 { - a: number; - b: string; - c: EnumMonth0; - d: boolean; - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'VsolStuff.Message1'; - container['value'] = this; - return JSON.stringify(container); - } - }; - - export class Message2 { - toto: string; - tata: Message1[]; - tutu: string[]; - titi: Map; - lulu: Map; - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'VsolStuff.Message2'; - container['value'] = this; - return JSON.stringify(container); - } - }; -} - -function printf(value: any): void { - console.log(value) -} - -function main(): number { - - let msg1_0 = new VsolStuff.Message1(); - msg1_0.a = 42; - msg1_0.b = "Benjamin"; - msg1_0.c = VsolStuff.EnumMonth0.January; - msg1_0.d = true; - - let msg1_1 = new VsolStuff.Message1(); - msg1_1.a = 43; - msg1_1.b = "Sandrine"; - msg1_1.c = VsolStuff.EnumMonth0.March; - msg1_0.d = false; - - // std::string toto; - // std::vector tata; - // std::vector tutu; - // std::map titi; - // std::map lulu; - - let msg2_0 = new VsolStuff.Message2(); - msg2_0.toto = "Prout zizi"; - msg2_0.tata = new Array(); - msg2_0.tata.push(msg1_0); - msg2_0.tata.push(msg1_1); - msg2_0.tutu.push("Mercadet"); - msg2_0.tutu.push("Poisson");ing - msg2_0.titi["44"] = "key 44"; - msg2_0.titi["45"] = "key 45"; - msg2_0.lulu["54"] = msg1_1; - msg2_0.lulu["55"] = msg1_0; - let result:string = VsolStuff.StoneSerialize(msg2_0); - return 0; -} - -main() - -// string StoneSerialize_number(int32_t value) -// { - -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(double value) -// { -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(bool value) -// { -// Json::Value result(value); -// return result; -// } - -// Json::Value StoneSerialize(const std::string& value) -// { -// // the following is better than -// Json::Value result(value.data(),value.data()+value.size()); -// return result; -// } - -// template -// Json::Value StoneSerialize(const std::map& value) -// { -// Json::Value result(Json::objectValue); - -// for (std::map::const_iterator it = value.cbegin(); -// it != value.cend(); ++it) -// { -// // it->first it->second -// result[it->first] = StoneSerialize(it->second); -// } -// return result; -// } - -// template -// Json::Value StoneSerialize(const std::vector& value) -// { -// Json::Value result(Json::arrayValue); -// for (size_t i = 0; i < value.size(); ++i) -// { -// result.append(StoneSerialize(value[i])); -// } -// return result; -// } - -// enum EnumMonth0 -// { -// January, -// February, -// March -// }; - -// std::string ToString(EnumMonth0 value) -// { -// switch(value) -// { -// case January: -// return "January"; -// case February: -// return "February"; -// case March: -// return "March"; -// default: -// { -// std::stringstream ss; -// ss << "Unrecognized EnumMonth0 value (" << static_cast(value) << ")"; -// throw std::runtime_error(ss.str()); -// } -// } -// } - -// void FromString(EnumMonth0& value, std::string strValue) -// { -// if (strValue == "January" || strValue == "EnumMonth0_January") -// { -// return January; -// } -// else if (strValue == "February" || strValue == "EnumMonth0_February") -// { -// return February; -// } -// #error Not implemented yet -// } - -// Json::Value StoneSerialize(const EnumMonth0& value) -// { -// return StoneSerialize(ToString(value)); -// } -// struct Message1 -// { -// int32_t a; -// std::string b; -// EnumMonth0 c; -// bool d; -// }; - -// struct Message2 -// { -// std::string toto; -// std::vector tata; -// std::vector tutu; -// std::map titi; -// std::map lulu; -// }; - -// Json::Value StoneSerialize(const Message1& value) -// { -// Json::Value result(Json::objectValue); -// result["a"] = StoneSerialize(value.a); -// result["b"] = StoneSerialize(value.b); -// result["c"] = StoneSerialize(value.c); -// result["d"] = StoneSerialize(value.d); -// return result; -// } - -// Json::Value StoneSerialize(const Message2& value) -// { -// Json::Value result(Json::objectValue); -// result["toto"] = StoneSerialize(value.toto); -// result["tata"] = StoneSerialize(value.tata); -// result["tutu"] = StoneSerialize(value.tutu); -// result["titi"] = StoneSerialize(value.titi); -// result["lulu"] = StoneSerialize(value.lulu); -// return result; -// } -// } - -// int main() -// { -// VsolStuff::Message1 msg1_0; -// msg1_0.a = 42; -// msg1_0.b = "Benjamin"; -// msg1_0.c = VsolStuff::January; -// msg1_0.d = true; - -// VsolStuff::Message1 msg1_1; -// msg1_1.a = 43; -// msg1_1.b = "Sandrine"; -// msg1_1.c = VsolStuff::March; -// msg1_0.d = false; - -// // std::string toto; -// // std::vector tata; -// // std::vector tutu; -// // std::map titi; -// // std::map lulu; - -// VsolStuff::Message2 msg2_0; -// msg2_0.toto = "Prout zizi"; -// msg2_0.tata.push_back(msg1_0); -// msg2_0.tata.push_back(msg1_1); -// msg2_0.tutu.push_back("Mercadet"); -// msg2_0.tutu.push_back("Poisson"); -// msg2_0.titi["44"] = "key 44"; -// msg2_0.titi["45"] = "key 45"; -// msg2_0.lulu["54"] = msg1_1; -// msg2_0.lulu["55"] = msg1_0; -// auto result = VsolStuff::StoneSerialize(msg2_0); -// auto resultStr = result.toStyledString(); - -// Json::Value readValue; - -// Json::CharReaderBuilder builder; -// Json::CharReader* reader = builder.newCharReader(); -// std::string errors; - -// bool ok = reader->parse( -// resultStr.c_str(), -// resultStr.c_str() + resultStr.size(), -// &readValue, -// &errors -// ); -// delete reader; - -// if (!ok) -// { -// std::stringstream ss; -// ss << "Json parsing error: " << errors; -// throw std::runtime_error(ss.str()); -// } -// std::cout << readValue.get("toto", "Default Value").asString() << std::endl; -// return 0; -// } - - -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground4.py --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/playground4.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -testYaml = """ -enum SomeEnum: - - january - - feb - -struct Message0: - a: string - -struct Message1: - a: string - b: int32 - c: vector - d: SomeEnum = january - e: SomeEnum= january - f: SomeEnum=january - g: SomeEnum =january - - -# github.com/AlDanial/cloc -header2 : - cloc_version : 1.67 - elapsed_seconds : int32_t - -header : - cloc_version : 1.67 - elapsed_seconds : int32_t - cloc_url : vector> - n_files : 1 - n_lines : 3 - files_per_second : 221.393718659277 - lines_per_second : 664.181155977831 - report_file : IDL.idl.yaml -IDL : - nFiles: 1 - blank: 0 - comment: 2 - code: 1 -EnumSUM: - - aaa - - bbb - -SUM: - blank: 0 - comment: 2 - code: 1 - nFiles: 1 -""" - -import yaml - -b = yaml.load(testYaml) -print(b) - -c = { - 'enum SomeEnum': ['january', 'feb'], - 'struct Message0': {'a': 'string'}, - 'struct Message1': { - 'a': 'string', - 'b': 'int32', - 'c': 'vector', - 'd': 'vector>', - 'e': 'SomeEnum= january', - 'f': 'SomeEnum=january', - 'g': 'SomeEnum =january' - }, -} - -print(c) \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/runts.ps1 --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/runts.ps1 Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -# echo "+----------------------+" -# echo "| playground.ts |" -# echo "+----------------------+" - -# tsc -t ES2015 .\playground.ts; node .\playground.js - -# echo "+----------------------+" -# echo "| playground3.ts |" -# echo "+----------------------+" - -# tsc -t ES2015 .\playground3.ts; node .\playground3.js - -echo "+----------------------+" -echo "| stonegen |" -echo "+----------------------+" - -if(-not (test-Path "build")) { - mkdir "build" -} - -echo "Generate the TS and CPP wrapper... (to build/)" -python stonegentool.py -o "." test_data/test1.yaml -if($LASTEXITCODE -ne 0) { - Write-Error ("Code generation failed!") - exit $LASTEXITCODE -} - -echo "Compile the TS wrapper to JS... (in build/)" -tsc --module commonjs --sourceMap -t ES2015 --outDir "build/" VsolMessages_generated.ts -if($LASTEXITCODE -ne 0) { - Write-Error ("Code compilation failed!") - exit $LASTEXITCODE -} - -echo "Compile the test app..." -tsc --module commonjs --sourceMap -t ES2015 --outDir "build/" test_stonegen.ts -if($LASTEXITCODE -ne 0) { - Write-Error ("Code compilation failed!") - exit $LASTEXITCODE -} - -browserify "build/test_stonegen.js" "build/VsolMessages_generated.js" -o "build_browser/test_stonegen_fused.js" - -cp .\test_stonegen.html .\build_browser\ - -echo "Run the test app..." -Push-Location -cd build_browser -node .\test_stonegen_fused.js -Pop-Location -if($LASTEXITCODE -ne 0) { - Write-Error ("Code execution failed!") - exit $LASTEXITCODE -} - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.html --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.ts --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/test_stonegen.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -import * as VsolMessages from "./VsolMessages_generated"; - -function TEST_StoneGen_SerializeComplex() { - let msg1_0 = new VsolMessages.Message1(); - msg1_0.a = 42; - msg1_0.b = "Benjamin"; - msg1_0.c = VsolMessages.EnumMonth0.January; - msg1_0.d = true; - let msg1_1 = new VsolMessages.Message1(); - msg1_1.a = 43; - msg1_1.b = "Sandrine"; - msg1_1.c = VsolMessages.EnumMonth0.March; - msg1_0.d = false; - let result1_0 = msg1_0.StoneSerialize(); - let resultStr1_0 = JSON.stringify(result1_0); - let result1_1 = msg1_1.StoneSerialize(); - let resultStr1_1 = JSON.stringify(result1_1); - // std::string toto; - // std::vector tata; - // std::vector tutu; - // std::map titi; - // std::map lulu; - let msg2_0 = new VsolMessages.Message2(); - msg2_0.toto = "Prout zizi"; - msg2_0.tata.push(msg1_0); - msg2_0.tata.push(msg1_1); - msg2_0.tutu.push("Mercadet"); - msg2_0.tutu.push("Poisson"); - msg2_0.titi["44"] = "key 44"; - msg2_0.titi["45"] = "key 45"; - msg2_0.lulu["54"] = msg1_1; - msg2_0.lulu["55"] = msg1_0; - let result2 = msg2_0.StoneSerialize(); - let resultStr2 = JSON.stringify(result2); - let refResult2 = `{ -"type" : "VsolMessages.Message2", -"value" : -{ - "lulu" : - { - "54" : - { - "a" : 43, - "b" : "Sandrine", - "c" : 2, - "d" : true - }, - "55" : - { - "a" : 42, - "b" : "Benjamin", - "c" : 0, - "d" : false - } - }, - "tata" : - [ - { - "a" : 42, - "b" : "Benjamin", - "c" : 0, - "d" : false - }, - { - "a" : 43, - "b" : "Sandrine", - "c" : 2, - "d" : true - } - ], - "titi" : - { - "44" : "key 44", - "45" : "key 45" - }, - "toto" : "Prout zizi", - "tutu" : - [ - "Mercadet", - "Poisson" - ] -} -} -`; - let refResult2Obj = JSON.parse(refResult2); - let resultStr2Obj = JSON.parse(resultStr2); - if (false) { - if (refResult2Obj !== resultStr2Obj) { - console.log("Results are different!"); - console.log(`refResult2Obj['value']['lulu']['54'] = ${refResult2Obj['value']['lulu']['54']}`); - console.log(`refResult2Obj['value']['lulu']['54']['a'] = ${refResult2Obj['value']['lulu']['54']['a']}`); - console.log("************************************************************"); - console.log("** REFERENCE OBJ **"); - console.log("************************************************************"); - console.log(refResult2Obj); - console.log("************************************************************"); - console.log("** ACTUAL OBJ **"); - console.log("************************************************************"); - console.log(resultStr2Obj); - console.log("************************************************************"); - console.log("** REFERENCE **"); - console.log("************************************************************"); - console.log(refResult2); - console.log("************************************************************"); - console.log("** ACTUAL **"); - console.log("************************************************************"); - console.log(resultStr2); - throw new Error("Wrong serialization"); - } - } - let refResultValue = JSON.parse(resultStr2); - console.log(refResultValue); -} -class MyDispatcher { - message1: VsolMessages.Message1; - message2: VsolMessages.Message2; - - HandleMessage1(value: VsolMessages.Message1) { - this.message1 = value; - return true; - } - HandleMessage2(value: VsolMessages.Message2) { - this.message2 = value; - return true; - } - HandleA(value) { - return true; - } - HandleB(value) { - return true; - } - HandleC(value) { - return true; - } -} -; -function TEST_StoneGen_DeserializeOkAndNok() { - let serializedMessage = `{ -"type" : "VsolMessages.Message2", -"value" : -{ - "lulu" : - { - "54" : - { - "a" : 43, - "b" : "Sandrine", - "c" : 2, - "d" : true - }, - "55" : - { - "a" : 42, - "b" : "Benjamin", - "c" : 0, - "d" : false - } - }, - "tata" : - [ - { - "a" : 42, - "b" : "Benjamin", - "c" : 0, - "d" : false - }, - { - "a" : 43, - "b" : "Sandrine", - "c" : 2, - "d" : true - } - ], - "titi" : - { - "44" : "key 44", - "45" : "key 45" - }, - "toto" : "Prout zizi", - "tutu" : - [ - "Mercadet", - "Poisson" - ] -} -}`; - let myDispatcher = new MyDispatcher(); - let ok = VsolMessages.StoneDispatchToHandler(serializedMessage, myDispatcher); - if (!ok) { - throw Error("Error when dispatching message!"); - } - if (myDispatcher.message1 != undefined) { - throw Error("(myDispatcher.Message1 != undefined)"); - } - if (myDispatcher.message2 == undefined) { - throw Error("(myDispatcher.Message2 == undefined)"); - } - console.log("TEST_StoneGen_DeserializeOkAndNok: OK!"); -} -function main() { - console.log("Entering main()"); - TEST_StoneGen_SerializeComplex(); - TEST_StoneGen_DeserializeOkAndNok(); - return 0; -} -console.log(`Exit code is: ${main()}`); \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/tsconfig.json --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/Graveyard/tsconfig.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -{ - // "extends": "../../../../../orthanc-stone/Platforms/Wasm/tsconfig-stone", - "compilerOptions": { - // "outFile": "../../../WebApplication-build/to-embed/app.js", - // "module": "system", - // "sourceMap": false, - "lib": [ - "es2017", - "es2017", - "dom", - "dom.iterable" - ] - }, - "include": [ - // "commands/*.ts", - // "logger.ts", - // "app.ts", - // "main.ts", - // "ui.ts", - // "popup.ts" - ] -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/README.md --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/README.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -Requirements ----------------- - -Install Node and npm. - -Then: -- `npm install browserify` -- `npm install typescript` -- `npm install tsify` - -`testCppHandler` contains a C++ project that produces an executable -slurping a set of text files representing messages defined against -the `test_data/testTestStoneCodeGen.yaml' schema and dumping them to `cout`. - -'testWasmIntegrated` contains a small Web app demonstrating the -interaction between TypeScript and C++ in WASM. -source ~/apps/emsdk/emsdk_env.sh - - -Install Python and the following packages `pip install pyyaml yamlloader jinja2` diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool.py --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,605 +0,0 @@ -import json -import yaml -import re -import os -import sys -from jinja2 import Template -from io import StringIO -import time -import datetime -import yamlloader - -""" - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 -""" - -# see https://stackoverflow.com/a/2504457/2927708 -def trim(docstring): - if not docstring: - return '' - # Convert tabs to spaces (following the normal Python rules) - # and split into a list of lines: - lines = docstring.expandtabs().splitlines() - # Determine minimum indentation (first line doesn't count): - indent = sys.maxsize - for line in lines[1:]: - stripped = line.lstrip() - if stripped: - indent = min(indent, len(line) - len(stripped)) - # Remove indentation (first line is special): - trimmed = [lines[0].strip()] - if indent < sys.maxsize: - for line in lines[1:]: - trimmed.append(line[indent:].rstrip()) - # Strip off trailing and leading blank lines: - while trimmed and not trimmed[-1]: - trimmed.pop() - while trimmed and not trimmed[0]: - trimmed.pop(0) - # Return a single string: - return '\n'.join(trimmed) - -class JsonHelpers: - """A set of utilities to perform JSON operations""" - - @staticmethod - def removeCommentsFromJsonContent(string): - """ - Remove comments from a JSON file - - Comments are not allowed in JSON but, i.e., Orthanc configuration files - contains C++ like comments that we need to remove before python can - parse the file - """ - # remove all occurrence streamed comments (/*COMMENT */) from string - string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string) - - # remove all occurrence singleline comments (//COMMENT\n ) from string - string = re.sub(re.compile("//.*?\n"), "", string) - - return string - - @staticmethod - def loadJsonWithComments(path): - """ - Reads a JSON file that may contain C++ like comments - """ - with open(path, "r") as fp: - fileContent = fp.read() - fileContent = JsonHelpers.removeCommentsFromJsonContent(fileContent) - return json.loads(fileContent) - -class FieldDefinition: - - def __init__(self, name: str, type: str, defaultValue: str): - self.name = name - self.type = type - self.defaultValue = defaultValue - - @staticmethod - def fromKeyValue(key: str, value: str): - - if "=" in value: - splitValue = value.split(sep="=") - type = splitValue[0].strip(" ") - defaultValue = splitValue[1].strip(" ") - else: - type = value - defaultValue = None - - return FieldDefinition(name = key, type = type, defaultValue = defaultValue) - - -def LoadSchemaFromJson(filePath): - return JsonHelpers.loadJsonWithComments(filePath) - -def CanonToCpp(canonicalTypename): - # C++: prefix map vector and string with std::map, std::vector and - # std::string - # replace int32... by int32_t... - # replace float32 by float - # replace float64 by double - retVal = canonicalTypename - retVal = retVal.replace("map", "std::map") - retVal = retVal.replace("vector", "std::vector") - retVal = retVal.replace("set", "std::set") - retVal = retVal.replace("string", "std::string") - #uint32 and uint64 are handled by int32 and uint32 (because search and replace are done as partial words) - retVal = retVal.replace("int32", "int32_t") - retVal = retVal.replace("int64", "int64_t") - retVal = retVal.replace("float32", "float") - retVal = retVal.replace("float64", "double") - retVal = retVal.replace("json", "Json::Value") - return retVal - -def CanonToTs(canonicalTypename): - # TS: replace vector with Array and map with Map - # string remains string - # replace int32... by number - # replace float32... by number - retVal = canonicalTypename - retVal = retVal.replace("map", "Map") - retVal = retVal.replace("vector", "Array") - retVal = retVal.replace("set", "Set") - retVal = retVal.replace("uint32", "number") - retVal = retVal.replace("uint64", "number") - retVal = retVal.replace("int32", "number") - retVal = retVal.replace("int64", "number") - retVal = retVal.replace("float32", "number") - retVal = retVal.replace("float64", "number") - retVal = retVal.replace("bool", "boolean") - retVal = retVal.replace("json", "Object") - return retVal - -def NeedsTsConstruction(enums, tsType): - if tsType == 'boolean': - return False - elif tsType == 'number': - return False - elif tsType == 'string': - return False - else: - enumNames = [] - for enum in enums: - enumNames.append(enum['name']) - if tsType in enumNames: - return False - return True - -def NeedsCppConstruction(canonTypename): - return False - -def DefaultValueToTs(enums, field:FieldDefinition): - tsType = CanonToTs(field.type) - - enumNames = [] - for enum in enums: - enumNames.append(enum['name']) - - if tsType in enumNames: - return tsType + "." + field.defaultValue - else: - return field.defaultValue - -def DefaultValueToCpp(root, enums, field:FieldDefinition): - cppType = CanonToCpp(field.type) - - enumNames = [] - for enum in enums: - enumNames.append(enum['name']) - - if cppType in enumNames: - return root + "::" + cppType + "_" + field.defaultValue - else: - return field.defaultValue - -def RegisterTemplateFunction(template,func): - """Makes a function callable by a jinja2 template""" - template.globals[func.__name__] = func - return func - -def MakeTemplate(templateStr): - template = Template(templateStr) - RegisterTemplateFunction(template,CanonToCpp) - RegisterTemplateFunction(template,CanonToTs) - RegisterTemplateFunction(template,NeedsTsConstruction) - RegisterTemplateFunction(template,NeedsCppConstruction) - RegisterTemplateFunction(template, DefaultValueToTs) - RegisterTemplateFunction(template, DefaultValueToCpp) - return template - -def MakeTemplateFromFile(templateFileName): - - with open(templateFileName, "r") as templateFile: - templateFileContents = templateFile.read() - return MakeTemplate(templateFileContents) - - -def EatToken(sentence): - """splits "A,B,C" into "A" and "B,C" where A, B and C are type names - (including templates) like "int32", "TotoTutu", or - "map>,map>" """ - - if sentence.count("<") != sentence.count(">"): - raise Exception( - "Error in the partial template type list " + str(sentence) + "." - + " The number of < and > do not match!" - ) - - # the template level we're currently in - templateLevel = 0 - for i in range(len(sentence)): - if (sentence[i] == ",") and (templateLevel == 0): - return (sentence[0:i], sentence[i + 1 :]) - elif sentence[i] == "<": - templateLevel += 1 - elif sentence[i] == ">": - templateLevel -= 1 - return (sentence, "") - - -def SplitListOfTypes(typename): - """Splits something like - vector,int32,map> - in: - - vector - - int32 - map> - - This is not possible with a regex so - """ - stillStuffToEat = True - tokenList = [] - restOfString = typename - while stillStuffToEat: - firstToken, restOfString = EatToken(restOfString) - tokenList.append(firstToken) - if restOfString == "": - stillStuffToEat = False - return tokenList - - -templateRegex = \ - re.compile(r"([a-zA-Z0-9_]*[a-zA-Z0-9_]*)<([a-zA-Z0-9_,:<>]+)>") - - -def ParseTemplateType(typename): - """ If the type is a template like "SOMETHING>>", - then it returns (true,"SOMETHING","SOME>") - otherwise it returns (false,"","")""" - - # let's remove all whitespace from the type - # split without argument uses any whitespace string as separator - # (space, tab, newline, return or formfeed) - typename = "".join(typename.split()) - matches = templateRegex.match(typename) - if matches == None: - return (False, "", []) - else: - m = matches - assert len(m.groups()) == 2 - # we need to split with the commas that are outside of the - # defined types. Simply splitting at commas won't work - listOfDependentTypes = SplitListOfTypes(m.group(2)) - return (True, m.group(1), listOfDependentTypes) - -def GetStructFields(struct): - """This filters out the special metadata key from the struct fields""" - return [k for k in struct.keys() if k != '__handler'] - -def ComputeOrderFromTypeTree( - ancestors, - genOrder, - shortTypename, schema): - - if shortTypename in ancestors: - raise Exception( - "Cyclic dependency chain found: the last of " + str(ancestors) + - + " depends on " + str(shortTypename) + " that is already in the list." - ) - - if not (shortTypename in genOrder): - (isTemplate, _, dependentTypenames) = ParseTemplateType(shortTypename) - if isTemplate: - # if it is a template, it HAS dependent types... They can be - # anything (primitive, collection, enum, structs..). - # Let's process them! - for dependentTypename in dependentTypenames: - # childAncestors = ancestors.copy() NO TEMPLATE ANCESTOR!!! - # childAncestors.append(typename) - ComputeOrderFromTypeTree( - ancestors, genOrder, dependentTypename, schema - ) - else: - # If it is not template, we are only interested if it is a - # dependency that we must take into account in the dep graph, - # i.e., a struct. - if IsShortStructType(shortTypename, schema): - struct = schema[GetLongTypename(shortTypename, schema)] - # The keys in the struct dict are the member names - # The values in the struct dict are the member types - if struct: - # we reach this if struct is not None AND not empty - for field in GetStructFields(struct): - # we fill the chain of dependent types (starting here) - ancestors.append(shortTypename) - ComputeOrderFromTypeTree( - ancestors, genOrder, struct[field], schema) - # don't forget to restore it! - ancestors.pop() - - # now we're pretty sure our dependencies have been processed, - # we can start marking our code for generation (it might - # already have been done if someone referenced us earlier) - if not shortTypename in genOrder: - genOrder.append(shortTypename) - -# +-----------------------+ -# | Utility functions | -# +-----------------------+ - -def IsShortStructType(typename, schema): - fullStructName = "struct " + typename - return (fullStructName in schema) - -def GetLongTypename(shortTypename, schema): - if shortTypename.startswith("enum "): - raise RuntimeError('shortTypename.startswith("enum "):') - enumName = "enum " + shortTypename - isEnum = enumName in schema - - if shortTypename.startswith("struct "): - raise RuntimeError('shortTypename.startswith("struct "):') - structName = "struct " + shortTypename - isStruct = ("struct " + shortTypename) in schema - - if isEnum and isStruct: - raise RuntimeError('Enums and structs cannot have the same name') - - if isEnum: - return enumName - if isStruct: - return structName - -def IsTypename(fullName): - return (fullName.startswith("enum ") or fullName.startswith("struct ")) - -def IsEnumType(fullName): - return fullName.startswith("enum ") - -def IsStructType(fullName): - return fullName.startswith("struct ") - -def GetShortTypename(fullTypename): - if fullTypename.startswith("struct "): - return fullTypename[7:] - elif fullTypename.startswith("enum"): - return fullTypename[5:] - else: - raise RuntimeError \ - ('fullTypename should start with either "struct " or "enum "') - -def CheckSchemaSchema(schema): - if not "rootName" in schema: - raise Exception("schema lacks the 'rootName' key") - for name in schema.keys(): - if (not IsEnumType(name)) and (not IsStructType(name)) and \ - (name != 'rootName'): - raise RuntimeError \ - ('Type "' + str(name) + '" should start with "enum " or "struct "') - - # TODO: check enum fields are unique (in whole namespace) - # TODO: check struct fields are unique (in each struct) - # TODO: check that in the source schema, there are spaces after each colon - -nonTypeKeys = ['rootName'] -def GetTypesInSchema(schema): - """Returns the top schema keys that are actual type names""" - typeList = [k for k in schema if k not in nonTypeKeys] - return typeList - -# +-----------------------+ -# | Main processing logic | -# +-----------------------+ - -def ComputeRequiredDeclarationOrder(schema): - # sanity check - CheckSchemaSchema(schema) - - # we traverse the type dependency graph and we fill a queue with - # the required struct types, in a bottom-up fashion, to compute - # the declaration order - # The genOrder list contains the struct full names in the order - # where they must be defined. - # We do not care about the enums here... They do not depend upon - # anything and we'll handle them, in their original declaration - # order, at the start - genOrder = [] - for fullName in GetTypesInSchema(schema): - if IsStructType(fullName): - realName = GetShortTypename(fullName) - ancestors = [] - ComputeOrderFromTypeTree(ancestors, genOrder, realName, schema) - return genOrder - -def GetStructFields(fieldDict): - """Returns the regular (non __handler) struct fields""" - # the following happens for empty structs - if fieldDict == None: - return fieldDict - ret = {} - for k,v in fieldDict.items(): - if k != "__handler": - ret[k] = FieldDefinition.fromKeyValue(k, v) - if k.startswith("__") and k != "__handler": - raise RuntimeError("Fields starting with __ (double underscore) are reserved names!") - return ret - -def GetStructMetadata(fieldDict): - """Returns the __handler struct fields (there are default values that - can be overridden by entries in the schema - Not tested because it's a fail-safe: if something is broken in this, - dependent projects will not build.""" - metadataDict = {} - metadataDict['handleInCpp'] = False - metadataDict['handleInTypescript'] = False - - if fieldDict != None: - for k,v in fieldDict.items(): - if k.startswith("__") and k != "__handler": - raise RuntimeError("Fields starting with __ (double underscore) are reserved names") - if k == "__handler": - if type(v) == list: - for i in v: - if i == "cpp": - metadataDict['handleInCpp'] = True - elif i == "ts": - metadataDict['handleInTypescript'] = True - else: - raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\"") - elif type(v) == str: - if v == "cpp": - metadataDict['handleInCpp'] = True - elif v == "ts": - metadataDict['handleInTypescript'] = True - else: - raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\" (or a list of both)") - else: - raise RuntimeError("Error in schema. Allowed values for __handler are \"cpp\" or \"ts\" (or a list of both)") - return metadataDict - -def ProcessSchema(schema, genOrder): - # sanity check - CheckSchemaSchema(schema) - - # let's doctor the schema to clean it up a bit - # order DOES NOT matter for enums, even though it's a list - enums = [] - for fullName in schema.keys(): - if IsEnumType(fullName): - # convert "enum Toto" to "Toto" - typename = GetShortTypename(fullName) - enum = {} - enum['name'] = typename - assert(type(schema[fullName]) == list) - enum['fields'] = schema[fullName] # must be a list - enums.append(enum) - - # now that the order has been established, we actually store\ - # the structs in the correct order - # the structs are like: - # example = [ - # { - # "name": "Message1", - # "fields": { - # "someMember":"int32", - # "someOtherMember":"vector" - # } - # }, - # { - # "name": "Message2", - # "fields": { - # "someMember":"int32", - # "someOtherMember22":"vector" - # } - # } - # ] - - structs = [] - for i in range(len(genOrder)): - # this is already the short name - typename = genOrder[i] - fieldDict = schema["struct " + typename] - struct = {} - struct['name'] = typename - struct['fields'] = GetStructFields(fieldDict) - struct['__meta__'] = GetStructMetadata(fieldDict) - structs.append(struct) - - templatingDict = {} - templatingDict['enums'] = enums - templatingDict['structs'] = structs - templatingDict['rootName'] = schema['rootName'] - - return templatingDict - -# +-----------------------+ -# | Write to files | -# +-----------------------+ - -# def WriteStreamsToFiles(rootName: str, genc: Dict[str, StringIO]) \ -# -> None: -# pass - -def LoadSchema(fn): - # latin-1 is a trick, when we do NOT care about NON-ascii chars but - # we wish to avoid using a decoding error handler - # (see http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html#files-in-an-ascii-compatible-encoding-best-effort-is-acceptable) - # TL;DR: all 256 values are mapped to characters in latin-1 so the file - # contents never cause an error. - with open(fn, 'r', encoding='latin-1') as f: - schemaText = f.read() - assert(type(schemaText) == str) - return LoadSchemaFromString(schemaText = schemaText) - -def LoadSchemaFromString(schemaText:str): - # ensure there is a space after each colon. Otherwise, dicts could be - # erroneously recognized as an array of strings containing ':' - for i in range(len(schemaText)-1): - ch = schemaText[i] - nextCh = schemaText[i+1] - if ch == ':': - if not (nextCh == ' ' or nextCh == '\n'): - lineNumber = schemaText.count("\n",0,i) + 1 - raise RuntimeError("Error at line " + str(lineNumber) + " in the schema: colons must be followed by a space or a newline!") - schema = yaml.load(schemaText, Loader = yamlloader.ordereddict.SafeLoader) - return schema - -def GetTemplatingDictFromSchemaFilename(fn): - return GetTemplatingDictFromSchema(LoadSchema(fn)) - -def GetTemplatingDictFromSchema(schema): - genOrder = ComputeRequiredDeclarationOrder(schema) - templatingDict = ProcessSchema(schema, genOrder) - currentDT = datetime.datetime.now() - templatingDict['currentDatetime'] = str(currentDT) - return templatingDict - -# +-----------------------+ -# | ENTRY POINT | -# +-----------------------+ -def Process(schemaFile, outDir): - tdico = GetTemplatingDictFromSchemaFilename(schemaFile) - - tsTemplateFile = \ - os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') - template = MakeTemplateFromFile(tsTemplateFile) - renderedTsCode = template.render(**tdico) - outputTsFile = os.path.join( \ - outDir,str(tdico['rootName']) + "_generated.ts") - with open(outputTsFile,"wt",encoding='utf8') as outFile: - outFile.write(renderedTsCode) - - cppTemplateFile = \ - os.path.join(os.path.dirname(__file__), 'template.in.h.j2') - template = MakeTemplateFromFile(cppTemplateFile) - renderedCppCode = template.render(**tdico) - outputCppFile = os.path.join( \ - outDir, str(tdico['rootName']) + "_generated.hpp") - with open(outputCppFile,"wt",encoding='utf8') as outFile: - outFile.write(renderedCppCode) - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser( - usage="""stonegentool.py [-h] [-o OUT_DIR] [-v] input_schema - EXAMPLE: python stonegentool.py -o "generated_files/" """ - + """ "mainSchema.yaml,App Specific Commands.json" """ - ) - parser.add_argument("input_schema", type=str, \ - help="path to the schema file") - parser.add_argument( - "-o", - "--out_dir", - type=str, - default=".", - help="""path of the directory where the files - will be generated. Default is current - working folder""", - ) - parser.add_argument( - "-v", - "--verbosity", - action="count", - default=0, - help="""increase output verbosity (0 == errors - only, 1 == some verbosity, 2 == nerd - mode""", - ) - - args = parser.parse_args() - schemaFile = args.input_schema - outDir = args.out_dir - Process(schemaFile, outDir) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool_test.py --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/stonegentool_test.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,438 +0,0 @@ -# -# 1 2 3 4 5 6 7 8 -# 345678901234567890123456789012345678901234567890123456789012345678901234567890 -# - -from stonegentool import \ -EatToken,SplitListOfTypes,ParseTemplateType,ProcessSchema, \ -CheckSchemaSchema,LoadSchema,trim,ComputeRequiredDeclarationOrder, \ -GetTemplatingDictFromSchemaFilename,MakeTemplate,MakeTemplateFromFile,LoadSchemaFromString,GetTemplatingDictFromSchema -import unittest -import os -import re -import pprint -from jinja2 import Template - -def RemoveDateTimeLine(s : str): - # regex are non-multiline by default, and $ does NOT match the end of the line - s2 = re.sub(r"^// autogenerated by stonegentool on .*\n","",s) - return s2 - -class TestStonegentool(unittest.TestCase): - def test_EatToken_empty(self): - c = r"" - a,b = EatToken(c) - self.assertEqual(a,r"") - self.assertEqual(b,r"") - - def test_EatToken_simpleNonTemplate(self): - c = r"int32" - a,b = EatToken(c) - self.assertEqual(a,r"int32") - self.assertEqual(b,r"") - - def test_EatToken_simpleTemplate(self): - c = r"vector" - a,b = EatToken(c) - self.assertEqual(a,r"vector") - self.assertEqual(b,r"") - - def test_EatToken_complexTemplate(self): - c = r"vector>,vector>" - a,b = EatToken(c) - self.assertEqual(a,r"vector>") - self.assertEqual(b,r"vector>") - - def test_EatToken_complexTemplates(self): - c = r"vector,map>>,map,map,string>" - a,b = EatToken(c) - self.assertEqual(a,r"vector,map>>") - self.assertEqual(b,r"map,map,string>") - a,b = EatToken(b) - self.assertEqual(a,r"map") - self.assertEqual(b,r"map,string>") - - def test_SplitListOfTypes(self): - c = r"vector,map>>,map,map,string>" - lot = SplitListOfTypes(c) - self.assertEqual(3,len(lot)) - self.assertEqual("vector,map>>",lot[0]) - self.assertEqual("map",lot[1]) - self.assertEqual("map,string>",lot[2]) - - def test_SplitListOfTypes_bogus(self): - c = r"vector,map>,map,map,string" - self.assertRaises(Exception,SplitListOfTypes,c) # the argument c must be passed to assertRaises, not as a normal call of SplitListOfTypes - - def test_ParseTemplateType_true(self): - c = "map>>,map,vector>>" - (ok,a,b) = ParseTemplateType(c) - self.assertEqual(ok,True) - self.assertEqual(a,"map") - self.assertEqual(b,["vector>>","map,vector>"]) - - (ok2,a2,b2) = ParseTemplateType(b[0]) - self.assertEqual(ok2,True) - self.assertEqual(a2,"vector") - self.assertEqual(b2,["map>"]) - - (ok3,a3,b3) = ParseTemplateType(b[1]) - self.assertEqual(ok3,True) - self.assertEqual(a3,"map") - self.assertEqual(b3,["vector","vector"]) - - (ok4,a4,b4) = ParseTemplateType(b2[0]) - self.assertEqual(ok4,True) - self.assertEqual(a4,"map") - self.assertEqual(b4,["int","vector"]) - - def test_ParseSchema(self): - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - obj = LoadSchema(fn) - # we're happy if it does not crash :) - CheckSchemaSchema(obj) - - def test_ComputeRequiredDeclarationOrder(self): - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - obj = LoadSchema(fn) - genOrder: str = ComputeRequiredDeclarationOrder(obj) - self.assertEqual(5,len(genOrder)) - self.assertEqual("A",genOrder[0]) - self.assertEqual("B",genOrder[1]) - self.assertEqual("C",genOrder[2]) - self.assertEqual("Message1",genOrder[3]) - self.assertEqual("Message2",genOrder[4]) - - # def test_GeneratePreambleEnumerationAndStructs(self): - # fn = os.path.join(os.path.dirname(__file__), 'test', 'test1.jsonc') - # obj = LoadSchema(fn) - # (_,genc,_) = ProcessSchema(obj) - - def test_genEnums(self): - self.maxDiff = None - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - obj = LoadSchema(fn) - genOrder: str = ComputeRequiredDeclarationOrder(obj) - processedSchema = ProcessSchema(obj, genOrder) - self.assertTrue('rootName' in processedSchema) - - structs = {} - for v in processedSchema['structs']: - structs[v['name']] = v - enums = {} - for v in processedSchema['enums']: - enums[v['name']] = v - - self.assertTrue('C' in structs) - self.assertTrue('someBs' in structs['C']['fields']) - self.assertTrue('CrispType' in enums) - self.assertTrue('Message1' in structs) - self.assertEqual('int32', structs['Message1']['fields']['memberInt32'].type) - self.assertEqual('string', structs['Message1']['fields']['memberString'].type) - self.assertEqual('EnumMonth0', structs['Message1']['fields']['memberEnumMonth'].type) - self.assertEqual('bool', structs['Message1']['fields']['memberBool'].type) - self.assertEqual('float32', structs['Message1']['fields']['memberFloat32'].type) - self.assertEqual('float64', structs['Message1']['fields']['memberFloat64'].type) - - def test_GenerateTypeScriptEnums(self): - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - tdico = GetTemplatingDictFromSchemaFilename(fn) - template = Template(""" // end of generic methods -{% for enum in enums%} export enum {{enum['name']}} { -{% for key in enum['fields']%} {{key}}, -{%endfor%} }; - -{%endfor%}""") - renderedCode = template.render(**tdico) - renderedCodeRef = """ // end of generic methods - export enum MovieType { - RomCom, - Horror, - ScienceFiction, - Vegetables, - }; - - export enum CrispType { - SaltAndPepper, - CreamAndChives, - Paprika, - Barbecue, - }; - - export enum EnumMonth0 { - January, - February, - March, - }; - -""" - self.assertEqual(renderedCodeRef,renderedCode) - - def test_GenerateCplusplusEnums(self): - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - tdico = GetTemplatingDictFromSchemaFilename(fn) - template = Template(""" // end of generic methods -{% for enum in enums%} enum {{enum['name']}} { -{% for key in enum['fields']%} {{key}}, -{%endfor%} }; - -{%endfor%}""") - renderedCode = template.render(**tdico) - renderedCodeRef = """ // end of generic methods - enum MovieType { - RomCom, - Horror, - ScienceFiction, - Vegetables, - }; - - enum CrispType { - SaltAndPepper, - CreamAndChives, - Paprika, - Barbecue, - }; - - enum EnumMonth0 { - January, - February, - March, - }; - -""" - self.assertEqual(renderedCodeRef,renderedCode) - - def test_generateTsStructType(self): - fn = os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - tdico = GetTemplatingDictFromSchemaFilename(fn) - -# template = MakeTemplate(""" // end of generic methods -# {% for struct in struct%} export class {{struct['name']}} { -# {% for key in struct['fields']%} {{key}}:{{struct['fields'][key]}}, -# {% endfor %} -# constructor() { -# {% for key in struct['fields']%} -# {% if NeedsConstruction(struct['fields']['key'])} -# {{key}} = new {{CanonToTs(struct['fields']['key'])}}; -# {% end if %} -# {% endfor %} -# } -# {% endfor %} -# public StoneSerialize(): string { -# let container: object = {}; -# container['type'] = '{{rootName}}.{{struct['name']}}'; -# container['value'] = this; -# return JSON.stringify(container); -# } };""") - template = MakeTemplate(""" // end of generic methods -{% for struct in structs%} export class {{struct['name']}} { -{% for key in struct['fields']%} {{key}}:{{CanonToTs(struct['fields'][key]['type'])}}; -{% endfor %} - constructor() { -{% for key in struct['fields']%} this.{{key}} = new {{CanonToTs(struct['fields'][key]['type'])}}(); -{% endfor %} } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = '{{rootName}}.{{struct['name']}}'; - container['value'] = this; - return JSON.stringify(container); - } - }; - -{% endfor %}""") - renderedCode = template.render(**tdico) - renderedCodeRef = """ // end of generic methods - export class A { - someStrings:Array; - someInts2:Array; - movies:Array; - - constructor() { - this.someStrings = new Array(); - this.someInts2 = new Array(); - this.movies = new Array(); - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'TestStoneCodeGen.A'; - container['value'] = this; - return JSON.stringify(container); - } - }; - - export class B { - someAs:Array; - someInts:Array; - - constructor() { - this.someAs = new Array(); - this.someInts = new Array(); - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'TestStoneCodeGen.B'; - container['value'] = this; - return JSON.stringify(container); - } - }; - - export class C { - someBs:Array; - ddd:Array; - - constructor() { - this.someBs = new Array(); - this.ddd = new Array(); - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'TestStoneCodeGen.C'; - container['value'] = this; - return JSON.stringify(container); - } - }; - - export class Message1 { - memberInt32:number; - memberString:string; - memberEnumMonth:EnumMonth0; - memberBool:boolean; - memberFloat32:number; - memberFloat64:number; - - constructor() { - this.memberInt32 = new number(); - this.memberString = new string(); - this.memberEnumMonth = new EnumMonth0(); - this.memberBool = new boolean(); - this.memberFloat32 = new number(); - this.memberFloat64 = new number(); - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'TestStoneCodeGen.Message1'; - container['value'] = this; - return JSON.stringify(container); - } - }; - - export class Message2 { - memberString:string; - memberStringWithDefault:string; - memberVectorOfMessage1:Array; - memberVectorOfString:Array; - memberMapStringString:Map; - memberMapStringStruct:Map; - memberMapEnumFloat:Map; - memberEnumMovieType:MovieType; - memberJson:Object; - - constructor() { - this.memberString = new string(); - this.memberStringWithDefault = new string(); - this.memberVectorOfMessage1 = new Array(); - this.memberVectorOfString = new Array(); - this.memberMapStringString = new Map(); - this.memberMapStringStruct = new Map(); - this.memberMapEnumFloat = new Map(); - this.memberEnumMovieType = new MovieType(); - this.memberJson = new Object(); - } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = 'TestStoneCodeGen.Message2'; - container['value'] = this; - return JSON.stringify(container); - } - }; - -""" - # print(renderedCode) - self.maxDiff = None - self.assertEqual(renderedCodeRef, renderedCode) - - def test_generateWholeTsFile(self): - schemaFile = \ - os.path.join(os.path.dirname(__file__), 'test_data', 'testTestStoneCodeGen.yaml') - tdico = GetTemplatingDictFromSchemaFilename(schemaFile) - tsTemplateFile = \ - os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') - template = MakeTemplateFromFile(tsTemplateFile) - renderedCode = template.render(**tdico) - print(renderedCode) - - def test_GenerateTypeScriptHandlerInterface(self): - pass - - def test_GenerateCppHandlerInterface(self): - pass - - def test_GenerateTypeScriptDispatcher(self): - pass - - def test_GenerateCppDispatcher(self): - pass - - def test_StringDefaultValueInTs(self): - schema = LoadSchemaFromString(""" - rootName: MyTest - struct Toto: - withoutDefault: string - withDefault: string = \"tutu\" - """) - tdico = GetTemplatingDictFromSchema(schema) - - tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') - template = MakeTemplateFromFile(tsTemplateFile) - renderedCode = template.render(**tdico) - self.assertIn("withDefault = \"tutu\"", renderedCode) - # print(renderedCode) - - cppTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.h.j2') - template = MakeTemplateFromFile(cppTemplateFile) - renderedCode = template.render(**tdico) - print(renderedCode) - self.assertIn("withDefault = \"tutu\"", renderedCode) - - - def test_EnumDefaultValue(self): - schema = LoadSchemaFromString(""" - rootName: MyTest - enum MyEnum: - - Toto - - Tutu - struct Toto: - withoutDefault: MyEnum - withDefault: MyEnum = Toto - """) - tdico = GetTemplatingDictFromSchema(schema) - - tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.ts.j2') - template = MakeTemplateFromFile(tsTemplateFile) - renderedCode = template.render(**tdico) - # print(renderedCode) - self.assertIn("withDefault = MyEnum.Toto", renderedCode) - - tsTemplateFile = os.path.join(os.path.dirname(__file__), 'template.in.h.j2') - template = MakeTemplateFromFile(tsTemplateFile) - renderedCode = template.render(**tdico) - self.assertIn("withDefault = MyTest::MyEnum_Toto", renderedCode) - # print(renderedCode) - - -# def test(self): -# s = 'hello world' -# self.assertEqual(s.split(), ['hello', 'world']) -# # check that s.split fails when the separator is not a string -# with self.assertRaises(TypeError): -# s.split(2) - -if __name__ == '__main__': - unittest.main() - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.h.j2 --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.h.j2 Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,551 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 - -Generated on {{currentDatetime}} by stonegentool - -*/ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -//#define STONEGEN_NO_CPP11 1 - -#ifdef STONEGEN_NO_CPP11 -#define StoneSmartPtr std::unique_ptr -#else -#define StoneSmartPtr std::unique_ptr -#endif - -namespace {{rootName}} -{ - /** Throws in case of problem */ - inline void _StoneDeserializeValue(int32_t& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asInt(); - } - } - - inline Json::Value _StoneSerializeValue(int32_t value) - { - Json::Value result(value); - return result; - } - - inline void _StoneDeserializeValue(int64_t& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asInt64(); - } - } - - inline Json::Value _StoneSerializeValue(int64_t value) - { - Json::Value result(static_cast(value)); - return result; - } - - inline void _StoneDeserializeValue(uint32_t& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asUInt(); - } - } - - inline Json::Value _StoneSerializeValue(uint32_t value) - { - Json::Value result(value); - return result; - } - - inline void _StoneDeserializeValue(uint64_t& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asUInt64(); - } - } - - inline Json::Value _StoneSerializeValue(uint64_t value) - { - Json::Value result(static_cast(value)); - return result; - } - - inline void _StoneDeserializeValue(Json::Value& destValue, const Json::Value& jsonValue) - { - destValue = jsonValue; - } - - inline Json::Value _StoneSerializeValue(Json::Value value) - { - return value; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue(double& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asDouble(); - } - } - - inline Json::Value _StoneSerializeValue(double value) - { - Json::Value result(value); - return result; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue(float& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asFloat(); - } - } - - inline Json::Value _StoneSerializeValue(float value) - { - Json::Value result(value); - return result; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue(bool& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asBool(); - } - } - - inline Json::Value _StoneSerializeValue(bool value) - { - Json::Value result(value); - return result; - } - - /** Throws in case of problem */ - inline void _StoneDeserializeValue( - std::string& destValue - , const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue = jsonValue.asString(); - } - } - - inline Json::Value _StoneSerializeValue(const std::string& value) - { - // the following is better than - Json::Value result(value.data(),value.data()+value.size()); - return result; - } - - inline std::string MakeIndent(size_t indent) - { - char* txt = reinterpret_cast(malloc(indent+1)); // NO EXCEPTION BELOW!!!!!!!!!!!! - for(size_t i = 0; i < indent; ++i) - txt[i] = ' '; - txt[indent] = 0; - std::string retVal(txt); - free(txt); // NO EXCEPTION ABOVE !!!!!!!!!! - return retVal; - } - - // generic dumper - template - std::ostream& StoneDumpValue(std::ostream& out, const T& value, size_t indent) - { - out << MakeIndent(indent) << value; - return out; - } - - // string dumper - inline std::ostream& StoneDumpValue(std::ostream& out, const std::string& value, size_t indent) - { - out << MakeIndent(indent) << "\"" << value << "\""; - return out; - } - - inline std::string ToString(const std::string& str) - { - return str; - } - - inline void FromString(std::string& value, std::string strValue) - { - value = strValue; - } - - - /** Throws in case of problem */ - template - void _StoneDeserializeValue( - std::map& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - destValue.clear(); - for ( - Json::Value::const_iterator itr = jsonValue.begin(); - itr != jsonValue.end(); - itr++) - { - std::string strKey; - _StoneDeserializeValue(strKey, itr.key()); - TK key; - FromString(key, strKey); // if you have a compile error here, it means that your type is not suitable to be the key of a map (or you should overwrite the FromString/ToString in template.in.h.j2) - - TV innerDestValue; - _StoneDeserializeValue(innerDestValue, *itr); - - destValue[key] = innerDestValue; - } - } - } - - template - Json::Value _StoneSerializeValue(const std::map& value) - { - Json::Value result(Json::objectValue); - - for (typename std::map::const_iterator it = value.cbegin(); - it != value.cend(); ++it) - { - // it->first it->second - result[ToString(it->first)] = _StoneSerializeValue(it->second); - } - return result; - } - - template - std::ostream& StoneDumpValue(std::ostream& out, const std::map& value, size_t indent) - { - out << MakeIndent(indent) << "{\n"; - for (typename std::map::const_iterator it = value.cbegin(); - it != value.cend(); ++it) - { - out << MakeIndent(indent+2) << "\"" << it->first << "\" : "; - StoneDumpValue(out, it->second, indent+2); - out << ", \n"; - } - out << MakeIndent(indent) << "}\n"; - return out; - } - - /** Throws in case of problem */ - template - void _StoneDeserializeValue( - std::vector& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull() && jsonValue.isArray()) - { - destValue.clear(); - destValue.reserve(jsonValue.size()); - for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) - { - T innerDestValue; - _StoneDeserializeValue(innerDestValue, jsonValue[i]); - destValue.push_back(innerDestValue); - } - } - } - - template - Json::Value _StoneSerializeValue(const std::vector& value) - { - Json::Value result(Json::arrayValue); - for (size_t i = 0; i < value.size(); ++i) - { - result.append(_StoneSerializeValue(value[i])); - } - return result; - } - - template - std::ostream& StoneDumpValue(std::ostream& out, const std::vector& value, size_t indent) - { - out << MakeIndent(indent) << "[\n"; - for (size_t i = 0; i < value.size(); ++i) - { - StoneDumpValue(out, value[i], indent+2); - out << ", \n"; - } - out << MakeIndent(indent) << "]\n"; - return out; - } - - /** Throws in case of problem */ - template - void _StoneDeserializeValue( - std::set& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull() && jsonValue.isArray()) - { - destValue.clear(); - for (Json::Value::ArrayIndex i = 0; i != jsonValue.size(); i++) - { - T innerDestValue; - _StoneDeserializeValue(innerDestValue, jsonValue[i]); - destValue.insert(innerDestValue); - } - } - } - - template - Json::Value _StoneSerializeValue(const std::set& value) - { - Json::Value result(Json::arrayValue); - for (typename std::set::const_iterator it = value.begin(); it != value.end(); ++it) - { - result.append(_StoneSerializeValue(*it)); - } - return result; - } - - template - std::ostream& StoneDumpValue(std::ostream& out, const std::set& value, size_t indent) - { - out << MakeIndent(indent) << "[\n"; - for (typename std::set::const_iterator it = value.begin(); it != value.end(); ++it) - { - StoneDumpValue(out, *it, indent+2); - out << ", \n"; - } - out << MakeIndent(indent) << "]\n"; - return out; - } - - inline void StoneCheckSerializedValueTypeGeneric(const Json::Value& value) - { - if ((!value.isMember("type")) || (!value["type"].isString())) - { - std::stringstream ss; - ss << "Cannot deserialize value ('type' key invalid)"; - throw std::runtime_error(ss.str()); - } - } - - inline void StoneCheckSerializedValueType( - const Json::Value& value, std::string typeStr) - { - StoneCheckSerializedValueTypeGeneric(value); - - std::string actTypeStr = value["type"].asString(); - if (actTypeStr != typeStr) - { - std::stringstream ss; - ss << "Cannot deserialize type" << actTypeStr - << "into " << typeStr; - throw std::runtime_error(ss.str()); - } - } - - // end of generic methods - -// end of generic methods -{% for enum in enums%} - enum {{enum['name']}} { -{% for key in enum['fields']%} {{enum['name']}}_{{key}}, -{%endfor%} }; - - inline std::string ToString(const {{enum['name']}}& value) - { -{% for key in enum['fields']%} if( value == {{enum['name']}}_{{key}}) - { - return std::string("{{key}}"); - } -{%endfor%} std::stringstream ss; - ss << "Value \"" << value << "\" cannot be converted to {{enum['name']}}. Possible values are: " -{% for key in enum['fields']%} << " {{key}} = " << static_cast({{enum['name']}}_{{key}}) << ", " -{% endfor %} << std::endl; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - inline void FromString({{enum['name']}}& value, std::string strValue) - { -{% for key in enum['fields']%} if( strValue == std::string("{{key}}") ) - { - value = {{enum['name']}}_{{key}}; - return; - } -{%endfor%} - std::stringstream ss; - ss << "String \"" << strValue << "\" cannot be converted to {{enum['name']}}. Possible values are: {% for key in enum['fields']%}{{key}} {% endfor %}"; - std::string msg = ss.str(); - throw std::runtime_error(msg); - } - - - inline void _StoneDeserializeValue( - {{enum['name']}}& destValue, const Json::Value& jsonValue) - { - if (!jsonValue.isNull()) - { - FromString(destValue, jsonValue.asString()); - } - } - - inline Json::Value _StoneSerializeValue(const {{enum['name']}}& value) - { - std::string strValue = ToString(value); - return Json::Value(strValue); - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const {{enum['name']}}& value, size_t indent = 0) - { -{% for key in enum['fields']%} if( value == {{enum['name']}}_{{key}}) - { - out << MakeIndent(indent) << "{{key}}"; - } -{%endfor%} return out; - } - -{%endfor%} -{% for struct in structs%} -#ifdef _MSC_VER -#pragma region {{struct['name']}} -#endif //_MSC_VER - - struct {{struct['name']}} - { -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields'] %} {{CanonToCpp(struct['fields'][key]['type'])}} {{key}}; -{% endfor %}{% endif %}{% endif %} - {{struct['name']}}({% if struct %}{% if struct['fields'] %}{% for key in struct['fields'] %}{{CanonToCpp(struct['fields'][key]['type'])}} {{key}} = {% if struct['fields'][key]['defaultValue'] %}{{DefaultValueToCpp(rootName,enums,struct['fields'][key])}} {%else%} {{CanonToCpp(struct['fields'][key]['type'])}}() {%endif%} {{ ", " if not loop.last }}{% endfor %}{% endif %}{% endif %}) - { -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} this->{{key}} = {{key}}; -{% endfor %}{% endif %}{% endif %} } - }; - - inline void _StoneDeserializeValue({{struct['name']}}& destValue, const Json::Value& value) - { - if (!value.isNull()) - { -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} _StoneDeserializeValue(destValue.{{key}}, value["{{key}}"]); -{% endfor %}{% endif %}{% endif %} } - } - - inline Json::Value _StoneSerializeValue(const {{struct['name']}}& value) - { - Json::Value result(Json::objectValue); -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} result["{{key}}"] = _StoneSerializeValue(value.{{key}}); -{% endfor %}{% endif %}{% endif %} - return result; - } - - inline std::ostream& StoneDumpValue(std::ostream& out, const {{struct['name']}}& value, size_t indent = 0) - { - out << MakeIndent(indent) << "{\n"; -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} out << MakeIndent(indent+2) << "{{key}}: "; - StoneDumpValue(out, value.{{key}},indent+2); - out << ", \n"; -{% endfor %}{% endif %}{% endif %} - out << MakeIndent(indent) << "}"; - return out; - } - - inline void StoneDeserialize({{struct['name']}}& destValue, const Json::Value& value) - { - StoneCheckSerializedValueType(value, "{{rootName}}.{{struct['name']}}"); - _StoneDeserializeValue(destValue, value["value"]); - } - - inline Json::Value StoneSerializeToJson(const {{struct['name']}}& value) - { - Json::Value result(Json::objectValue); - result["type"] = "{{rootName}}.{{struct['name']}}"; - result["value"] = _StoneSerializeValue(value); - return result; - } - - inline std::string StoneSerialize(const {{struct['name']}}& value) - { - Json::Value resultJson = StoneSerializeToJson(value); - std::string resultStr = resultJson.toStyledString(); - return resultStr; - } - -#ifdef _MSC_VER -#pragma endregion {{struct['name']}} -#endif //_MSC_VER -{% endfor %} -#ifdef _MSC_VER -#pragma region Dispatching code -#endif //_MSC_VER - - class IHandler - { - public: -{% for struct in structs%}{% if struct['__meta__'].handleInCpp %} virtual bool Handle(const {{struct['name']}}& value) = 0; -{% endif %}{% endfor %} }; - - /** Service function for StoneDispatchToHandler */ - inline bool StoneDispatchJsonToHandler( - const Json::Value& jsonValue, IHandler* handler) - { - StoneCheckSerializedValueTypeGeneric(jsonValue); - std::string type = jsonValue["type"].asString(); - if (type == "") - { - // this should never ever happen - throw std::runtime_error("Caught empty type while dispatching"); - } -{% for struct in structs%}{% if struct['__meta__'].handleInCpp %} else if (type == "{{rootName}}.{{struct['name']}}") - { - {{struct['name']}} value; - _StoneDeserializeValue(value, jsonValue["value"]); - return handler->Handle(value); - } -{% endif %}{% endfor %} else - { - return false; - } - } - - /** Takes a serialized type and passes this to the handler */ - inline bool StoneDispatchToHandler(std::string strValue, IHandler* handler) - { - Json::Value readValue; - - Json::CharReaderBuilder builder; - Json::CharReader* reader = builder.newCharReader(); - - StoneSmartPtr ptr(reader); - - std::string errors; - - bool ok = reader->parse( - strValue.c_str(), - strValue.c_str() + strValue.size(), - &readValue, - &errors - ); - if (!ok) - { - std::stringstream ss; - ss << "Jsoncpp parsing error: " << errors; - throw std::runtime_error(ss.str()); - } - return StoneDispatchJsonToHandler(readValue, handler); - } - -#ifdef _MSC_VER -#pragma endregion Dispatching code -#endif //_MSC_VER -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.ts.j2 --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/template.in.ts.j2 Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - 1 2 3 4 5 6 7 -12345678901234567890123456789012345678901234567890123456789012345678901234567890 - -Generated on {{currentDatetime}} by stonegentool - -*/ - -function StoneCheckSerializedValueType(value: any, typeStr: string) -{ - StoneCheckSerializedValueTypeGeneric(value); - - if (value['type'] != typeStr) - { - throw new Error( - `Cannot deserialize type ${value['type']} into ${typeStr}`); - } -} - -function isString(val: any) :boolean -{ - return ((typeof val === 'string') || (val instanceof String)); -} - -function StoneCheckSerializedValueTypeGeneric(value: any) -{ - // console.//log("+-------------------------------------------------+"); - // console.//log("| StoneCheckSerializedValueTypeGeneric |"); - // console.//log("+-------------------------------------------------+"); - // console.//log("value = "); - // console.//log(value); - if ( (!('type' in value)) || (!isString(value.type)) ) - { - throw new Error( - "Cannot deserialize value ('type' key invalid)"); - } -} - -// end of generic methods -{% for enum in enums%} -export enum {{enum['name']}} { -{% for key in enum['fields']%} {{key}} = "{{key}}"{% if not loop.last %},{%endif%} -{%endfor%}}; - -export function {{enum['name']}}_FromString(strValue:string) : {{enum['name']}} -{ -{% for key in enum['fields'] %} if( strValue == "{{key}}" ) - { - return {{enum['name']}}.{{key}}; - } -{%endfor%} - let msg : string = `String ${strValue} cannot be converted to {{enum['name']}}. Possible values are: {% for key in enum['fields']%}{{key}}{% if not loop.last %}, {%endif%}{% endfor %}`; - throw new Error(msg); -} - -export function {{enum['name']}}_ToString(value:{{enum['name']}}) : string -{ -{% for key in enum['fields'] %} if( value == {{enum['name']}}.{{key}} ) - { - return "{{key}}"; - } -{%endfor%} - let msg : string = `Value ${value} cannot be converted to {{enum['name']}}. Possible values are: `; -{% for key in enum['fields']%} { - let _{{key}}_enumValue : string = {{enum['name']}}.{{key}}; // enums are strings in stonecodegen, so this will work. - let msg_{{key}} : string = `{{key}} (${_{{key}}_enumValue}){% if not loop.last %}, {%endif%}`; - msg = msg + msg_{{key}}; - } -{%endfor%} throw new Error(msg); -} -{%endfor%} - - -{% for struct in structs%}export class {{struct['name']}} { -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%} {{key}}:{{CanonToTs(struct['fields'][key]['type'])}}; -{% endfor %}{% endif %}{% endif %} - constructor() { -{% if struct %}{% if struct['fields'] %}{% for key in struct['fields']%}{% if NeedsTsConstruction(enums,CanonToTs(struct['fields'][key]['type'])) %} this.{{key}} = new {{CanonToTs(struct['fields'][key]['type'])}}(); -{% endif %} -{% if struct['fields'][key]['defaultValue'] %} this.{{key}} = {{DefaultValueToTs(enums,struct['fields'][key])}}; -{% endif %}{% endfor %}{% endif %}{% endif %} } - - public StoneSerialize(): string { - let container: object = {}; - container['type'] = '{{rootName}}.{{struct['name']}}'; - container['value'] = this; - return JSON.stringify(container); - } - - public static StoneDeserialize(valueStr: string) : {{struct['name']}} - { - let value: any = JSON.parse(valueStr); - StoneCheckSerializedValueType(value, '{{rootName}}.{{struct['name']}}'); - let result: {{struct['name']}} = value['value'] as {{struct['name']}}; - return result; - } -} -{% endfor %} -export interface IHandler { -{% for struct in structs%}{% if struct['__meta__'].handleInTypescript %} Handle{{struct['name']}}(value: {{struct['name']}}): boolean; -{% endif %}{% endfor %}}; - -/** Service function for StoneDispatchToHandler */ -export function StoneDispatchJsonToHandler( - jsonValue: any, handler: IHandler): boolean -{ - StoneCheckSerializedValueTypeGeneric(jsonValue); - let type: string = jsonValue["type"]; - if (type == "") - { - // this should never ever happen - throw new Error("Caught empty type while dispatching"); - } -{% for struct in structs%}{% if struct['__meta__'].handleInTypescript %} else if (type == "{{rootName}}.{{struct['name']}}") - { - let value = jsonValue["value"] as {{struct['name']}}; - return handler.Handle{{struct['name']}}(value); - } -{% endif %}{% endfor %} else - { - return false; - } -} - -/** Takes a serialized type and passes this to the handler */ -export function StoneDispatchToHandler( - strValue: string, handler: IHandler): boolean -{ - // console.//log("+------------------------------------------------+"); - // console.//log("| StoneDispatchToHandler |"); - // console.//log("+------------------------------------------------+"); - // console.//log("strValue = "); - // console.//log(strValue); - let jsonValue: any = JSON.parse(strValue) - return StoneDispatchJsonToHandler(jsonValue, handler); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(testCppHandler) - -set(testCppHandler_Codegen_Deps - ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml - ${CMAKE_CURRENT_LIST_DIR}/../template.in.h.j2 -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/VsolMessages_generated.hpp - COMMAND python ${CMAKE_CURRENT_LIST_DIR}/../stonegentool.py -o ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml - DEPENDS ${testCppHandler_Codegen_Deps} -) - -include(${CMAKE_BINARY_DIR}/conanbuildinfo_multi.cmake) -conan_basic_setup() - -add_executable(testCppHandler main.cpp ${CMAKE_CURRENT_BINARY_DIR}/VsolMessages_generated.hpp ${testCppHandler_Codegen_Deps}) - -target_include_directories(testCppHandler PUBLIC ${CMAKE_BINARY_DIR}) - -conan_target_link_libraries(testCppHandler) - -set_property(TARGET testCppHandler PROPERTY CXX_STANDARD 17) - -install(TARGETS testCppHandler DESTINATION bin) - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/README.md --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/README.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -Requirements -============== -- Install Python 3.x (tested with 3.7) -- Install conan with `pip install conan` (tested with 1.12.2) -- Install CMake (tested with 3.12) -- Under Windows: Visual Studio 2017 -- Under *nix*: Ninja - -How to build under *nix* -=============================== -- Navigate to `testCppHandler` folder -- `conan install . -g cmake` -- `mkdir build` -- `cd build` -- `cmake -G "Ninja" ..` -- `cmake --build . --config Debug` or - `cmake --build . --config Release` - -How to build under Windows with Visual Studio -============================================== -- Navigate to repo root -- `mkdir build` -- `cd build` -- `conan install .. -g cmake_multi -s build_type=Release` -- `conan install .. -g cmake_multi -s build_type=Debug` -- `cmake -G "Visual Studio 15 2017 Win64" ..` (modify for your current Visual Studio version) -- `cmake --build . --config Debug` or - `cmake --build . --config Release` - -How to execute the test -======================= -- `cd test_data && testCppHandler --pattern=*.json` - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/conanfile.txt --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/conanfile.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -[requires] -jsoncpp/1.8.4@theirix/stable -gtest/1.8.1@bincrafters/stable -boost/1.69.0@conan/stable diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/main.cpp --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/main.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include -#include -#include -#include -using namespace std; -namespace fs = std::filesystem; - -#include -using namespace boost::program_options; - -#include "TestStoneCodeGen_generated.hpp" - -/** -Transforms `str` by replacing occurrences of `oldStr` with `newStr`, using -plain text (*not* regular expressions.) -*/ -static inline void ReplaceInString( - string& str, - const std::string& oldStr, - const std::string& newStr) -{ - std::string::size_type pos = 0u; - while ((pos = str.find(oldStr, pos)) != std::string::npos) { - str.replace(pos, oldStr.length(), newStr); - pos += newStr.length(); - } -} - -string SlurpFile(const string& fileName) -{ - ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate); - - ifstream::pos_type fileSize = ifs.tellg(); - ifs.seekg(0, ios::beg); - - vector bytes(fileSize); - ifs.read(bytes.data(), fileSize); - - return string(bytes.data(), fileSize); -} - -class MyHandler : public TestStoneCodeGen::IHandler -{ -public: - virtual bool Handle(const TestStoneCodeGen::A& value) override - { - TestStoneCodeGen::StoneDumpValue(cout, value); - return true; - } - virtual bool Handle(const TestStoneCodeGen::B& value) override - { - TestStoneCodeGen::StoneDumpValue(cout, value); - return true; - } - virtual bool Handle(const TestStoneCodeGen::C& value) override - { - TestStoneCodeGen::StoneDumpValue(cout, value); - return true; - } - virtual bool Handle(const TestStoneCodeGen::Message1& value) override - { - TestStoneCodeGen::StoneDumpValue(cout, value); - return true; - } - virtual bool Handle(const TestStoneCodeGen::Message2& value) override - { - TestStoneCodeGen::StoneDumpValue(cout, value); - return true; - } -}; - -template -void ProcessPath(T filePath) -{ - cout << "+--------------------------------------------+\n"; - cout << "| Processing: " << filePath.path().string() << "\n"; - cout << "+--------------------------------------------+\n"; - MyHandler handler; - auto contents = SlurpFile(filePath.path().string()); - TestStoneCodeGen::StoneDispatchToHandler(contents, &handler); -} - -int main(int argc, char** argv) -{ - try - { - - options_description desc("Allowed options"); - desc.add_options() - // First parameter describes option name/short name - // The second is parameter to option - // The third is description - ("help,h", "print usage message") - ("pattern,p", value(), "pattern for input") - ; - - variables_map vm; - store(parse_command_line(argc, argv, desc), vm); - - if (vm.count("help")) - { - cout << desc << "\n"; - return 0; - } - - notify(vm); - - string pattern = vm["pattern"].as(); - - // tranform globbing pattern into regex - // we should deal with -, ., *... - string regexPatternStr = pattern; - cout << "Pattern is: " << regexPatternStr << endl; - ReplaceInString(regexPatternStr, "\\", "\\\\"); - ReplaceInString(regexPatternStr, "-", "\\-"); - ReplaceInString(regexPatternStr, ".", "\\."); - ReplaceInString(regexPatternStr, "*", ".*"); - ReplaceInString(regexPatternStr, "?", "."); - cout << "Corresponding regex is: " << regexPatternStr << endl; - - regex regexPattern(regexPatternStr); - - for (auto& p : fs::directory_iterator(".")) - { - auto fileName = p.path().filename().string(); - if (regex_match(fileName, regexPattern)) - { - ProcessPath(p); - } - } - return 0; - - - } - catch (exception& e) - { - cerr << e.what() << "\n"; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/test_data/test_Message2.json --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testCppHandler/test_data/test_Message2.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -{ - "type": "TestStoneCodeGen.Message2", - "value": { - "memberVectorOfMessage1": [ - { - "memberInt32": 42, - "memberString": "Benjamin", - "memberEnumMonth": "January", - "memberBool": false, - "memberFloat32": 0.1, - "memberFloat64": -0.2 - }, - { - "memberInt32": 43, - "memberString": "Sandrine", - "memberEnumMonth": "March" - } - ], - "memberVectorOfString": [ - "Mercadet", - "Poisson" - ], - "memberMapStringString": { - "44": "key 44", - "45": "key 45" - }, - "memberMapStringStruct": { - "54": { - "memberInt32": 43, - "memberString": "Sandrine", - "memberEnumMonth": "March" - }, - "55": { - "memberInt32": 42, - "memberString": "Benjamin", - "memberEnumMonth": "January", - "memberBool": false - } - }, - "memberString": "Prout zizi", - "memberMapEnumFloat" : { - "SaltAndPepper" : 0.1, - "CreamAndChives" : -0.2 - }, - "memberJson" : {"custom-key": "custom-value"} - } -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(testWasmIntegratedCpp) - -set(WASM_FLAGS "-s WASM=1 -O0 -g0") -set(WASM_MODULE_NAME "TestWasmIntegratedModule" CACHE STRING "Name of the WebAssembly module") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") -#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmWebService.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/WasmDelayedCallExecutor.js --js-library ${STONE_SOURCES_DIR}/Platforms/Wasm/default-library.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --js-library ${CMAKE_CURRENT_LIST_DIR}/DefaultLibrary.js -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0 -s EXPORT_NAME='\"${WASM_MODULE_NAME}\"' -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=536870912 -s TOTAL_STACK=128000000") # 512MB + resize - -add_definitions(-DORTHANC_ENABLE_WASM=1) - -set(testWasmIntegratedCpp_Codegen_Deps - ${CMAKE_CURRENT_LIST_DIR}/testWasmIntegratedCpp_api.yaml - ${CMAKE_CURRENT_LIST_DIR}/../template.in.h.j2 - ${CMAKE_CURRENT_LIST_DIR}/../template.in.ts.j2 -) - -set(jsoncppRootDir ${CMAKE_CURRENT_LIST_DIR}/jsoncpp-1.8.4) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.hpp ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.ts - COMMAND python3 ${CMAKE_CURRENT_LIST_DIR}/../stonegentool.py -o ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml - DEPENDS ${testCppHandler_Codegen_Deps} ${CMAKE_CURRENT_LIST_DIR}/../test_data/testTestStoneCodeGen.yaml -) - -add_executable(testWasmIntegratedCpp - main.cpp - ${CMAKE_CURRENT_BINARY_DIR}/TestStoneCodeGen_generated.hpp - ${jsoncppRootDir}/jsoncpp.cpp - ${testCppHandler_Codegen_Deps}) - -target_include_directories(testWasmIntegratedCpp PUBLIC ${CMAKE_BINARY_DIR}) -target_include_directories(testWasmIntegratedCpp PUBLIC ${jsoncppRootDir}) - -set_property(TARGET testWasmIntegratedCpp PROPERTY CXX_STANDARD 11) - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/DefaultLibrary.js --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/DefaultLibrary.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -// this file contains the JS method you want to expose to C++ code - -mergeInto(LibraryManager.library, { - // each time the Application updates its status, it may signal it through this method. i.e, to change the status of a button in the web interface - // It needs to be put in this file so that the emscripten SDK linker knows where to find it. - SendFreeTextFromCppJS: function(statusUpdateMessage) { - var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); - window.SendFreeTextFromCpp(statusUpdateMessage_); - }, - SendMessageFromCppJS: function(statusUpdateMessage) { - var statusUpdateMessage_ = UTF8ToString(statusUpdateMessage); - window.SendMessageFromCpp(statusUpdateMessage_); - } -}); - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build-web.sh --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build-web.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -#!/bin/bash -set -e - -mkdir -p build-final - -# compile TS to JS -tsc --module commonjs --sourceMap -t ES2015 --outDir "build-tsc/" build-wasm/TestStoneCodeGen_generated.ts testWasmIntegrated.ts - -# bundle JS files to final build dir -browserify "build-tsc/build-wasm/testWasmIntegratedCpp_generated.js" "build-tsc/testWasmIntegrated.js" -o "build-final/testWasmIntegratedApp.js" - -# copy WASM loader JS file to final build dir -cp build-wasm/testWasmIntegratedCpp.js build-final/ - -# copy HTML start page to output dir -cp testWasmIntegrated.html build-final/ - - -# copy styles to output dir -cp styles.css build-final/ - -# copy WASM binary to output dir -cp build-wasm/testWasmIntegratedCpp.wasm build-final/ - -cp ../test_data/testTestStoneCodeGen.yaml build-final/ -cp ../testCppHandler/test_data/test_Message2.json build-final/cppHandler_test_Message2.json - -echo "...Serving files at http://127.0.0.1:8080/build-final/testWasmIntegrated.html" - -sudo python3 serve.py - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build.sh --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/build.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -#!/bin/bash - -set -e - -mkdir -p build-wasm -cd build-wasm - -# shellcheck source="$HOME/apps/emsdk/emsdk_env.sh" -source "$HOME/apps/emsdk/emsdk_env.sh" -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_WASM=ON .. - -ninja - -cd .. - -./build-web.sh - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json-forwards.h --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json-forwards.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,344 +0,0 @@ -/// Json-cpp amalgamated forward header (http://jsoncpp.sourceforge.net/). -/// It is intended to be used with #include "json/json-forwards.h" -/// This header provides forward declaration for all JsonCpp types. - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - -/* -The JsonCpp library's source code, including accompanying documentation, -tests and demonstration applications, are licensed under the following -conditions... - -Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all -jurisdictions which recognize such a disclaimer. In such jurisdictions, -this software is released into the Public Domain. - -In jurisdictions which do not recognize Public Domain property (e.g. Germany as of -2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and -The JsonCpp Authors, and is released under the terms of the MIT License (see below). - -In jurisdictions which recognize Public Domain property, the user of this -software may choose to accept it either as 1) Public Domain, 2) under the -conditions of the MIT License (see below), or 3) under the terms of dual -Public Domain/MIT License conditions described here, as they choose. - -The MIT License is about as close to Public Domain as a license can get, and is -described in clear, concise terms at: - - http://en.wikipedia.org/wiki/MIT_License - -The full text of the MIT License follows: - -======================================================================== -Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors - -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. -======================================================================== -(END LICENSE TEXT) - -The MIT license is compatible with both the GPL and commercial -software, affording one all of the rights of Public Domain with the -minor nuisance of being required to keep the above copyright notice -and license text in the source code. Note also that by accepting the -Public Domain "license" you can re-license your copy using whatever -license you like. - -*/ - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - - - - - -#ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED -# define JSON_FORWARD_AMALGAMATED_H_INCLUDED -/// If defined, indicates that the source file is amalgamated -/// to prevent private header inclusion. -#define JSON_IS_AMALGAMATION - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_CONFIG_H_INCLUDED -#define JSON_CONFIG_H_INCLUDED -#include -#include -#include -#include -#include -#include -#include -#include - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 - -// If non-zero, the library uses exceptions to report bad input instead of C -// assertion macros. The default is to use exceptions. -#ifndef JSON_USE_EXCEPTION -#define JSON_USE_EXCEPTION 1 -#endif - -/// If defined, indicates that the source file is amalgamated -/// to prevent private header inclusion. -/// Remarks: it is automatically defined in the generated amalgamated header. -// #define JSON_IS_AMALGAMATION - -#ifdef JSON_IN_CPPTL -#include -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllexport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#endif // if defined(_MSC_VER) -#elif defined(JSON_DLL) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllimport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL -#if !defined(JSON_API) -#define JSON_API -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1800 -#error \ - "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1900 -// As recommended at -// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 -extern JSON_API int -msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...); -#define jsoncpp_snprintf msvc_pre1900_c99_snprintf -#else -#define jsoncpp_snprintf std::snprintf -#endif - -// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for -// integer -// Storages, and 64 bits integer support is disabled. -// #define JSON_NO_INT64 1 - -#if defined(_MSC_VER) // MSVC -#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -#endif // defined(_MSC_VER) - -// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. -// C++11 should be used directly in JSONCPP. -#define JSONCPP_OVERRIDE override - -#if __cplusplus >= 201103L -#define JSONCPP_NOEXCEPT noexcept -#define JSONCPP_OP_EXPLICIT explicit -#elif defined(_MSC_VER) && _MSC_VER < 1900 -#define JSONCPP_NOEXCEPT throw() -#define JSONCPP_OP_EXPLICIT explicit -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -#define JSONCPP_NOEXCEPT noexcept -#define JSONCPP_OP_EXPLICIT explicit -#else -#define JSONCPP_NOEXCEPT throw() -#define JSONCPP_OP_EXPLICIT -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2013 - -#ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 -#endif - -#ifdef __clang__ -#if __has_extension(attribute_deprecated_with_message) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -#endif // GNUC version -#endif // __clang__ || __GNUC__ - -#if !defined(JSONCPP_DEPRECATED) -#define JSONCPP_DEPRECATED(message) -#endif // if !defined(JSONCPP_DEPRECATED) - -#if __GNUC__ >= 6 -#define JSON_USE_INT64_DOUBLE_CONVERSION 1 -#endif - -#if !defined(JSON_IS_AMALGAMATION) - -#include "allocator.h" -#include "version.h" - -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { -typedef int Int; -typedef unsigned int UInt; -#if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; -#undef JSON_HAS_INT64 -#else // if defined(JSON_NO_INT64) -// For Microsoft Visual use specific types as long long is not supported -#if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -#else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; -#define JSON_HAS_INT64 -#endif // if defined(JSON_NO_INT64) - -template -using Allocator = typename std::conditional, - std::allocator>::type; -using String = std::basic_string, Allocator>; -using IStringStream = std::basic_istringstream; -using OStringStream = std::basic_ostringstream; -using IStream = std::istream; -using OStream = std::ostream; -} // namespace Json - -// Legacy names (formerly macros). -using JSONCPP_STRING = Json::String; -using JSONCPP_ISTRINGSTREAM = Json::IStringStream; -using JSONCPP_OSTRINGSTREAM = Json::OStringStream; -using JSONCPP_ISTREAM = Json::IStream; -using JSONCPP_OSTREAM = Json::OStream; - -#endif // JSON_CONFIG_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_FORWARDS_H_INCLUDED -#define JSON_FORWARDS_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -// writer.h -class FastWriter; -class StyledWriter; - -// reader.h -class Reader; - -// features.h -class Features; - -// value.h -typedef unsigned int ArrayIndex; -class StaticString; -class Path; -class PathArgument; -class Value; -class ValueIteratorBase; -class ValueIterator; -class ValueConstIterator; - -} // namespace Json - -#endif // JSON_FORWARDS_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - - - - - -#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json.h --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/json/json.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2366 +0,0 @@ -/// Json-cpp amalgamated header (http://jsoncpp.sourceforge.net/). -/// It is intended to be used with #include "json/json.h" - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - -/* -The JsonCpp library's source code, including accompanying documentation, -tests and demonstration applications, are licensed under the following -conditions... - -Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all -jurisdictions which recognize such a disclaimer. In such jurisdictions, -this software is released into the Public Domain. - -In jurisdictions which do not recognize Public Domain property (e.g. Germany as of -2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and -The JsonCpp Authors, and is released under the terms of the MIT License (see below). - -In jurisdictions which recognize Public Domain property, the user of this -software may choose to accept it either as 1) Public Domain, 2) under the -conditions of the MIT License (see below), or 3) under the terms of dual -Public Domain/MIT License conditions described here, as they choose. - -The MIT License is about as close to Public Domain as a license can get, and is -described in clear, concise terms at: - - http://en.wikipedia.org/wiki/MIT_License - -The full text of the MIT License follows: - -======================================================================== -Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors - -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. -======================================================================== -(END LICENSE TEXT) - -The MIT license is compatible with both the GPL and commercial -software, affording one all of the rights of Public Domain with the -minor nuisance of being required to keep the above copyright notice -and license text in the source code. Note also that by accepting the -Public Domain "license" you can re-license your copy using whatever -license you like. - -*/ - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - - - - - -#ifndef JSON_AMALGAMATED_H_INCLUDED -# define JSON_AMALGAMATED_H_INCLUDED -/// If defined, indicates that the source file is amalgamated -/// to prevent private header inclusion. -#define JSON_IS_AMALGAMATION - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/version.h -// ////////////////////////////////////////////////////////////////////// - -// DO NOT EDIT. This file (and "version") is generated by CMake. -// Run CMake configure step to update it. -#ifndef JSON_VERSION_H_INCLUDED -#define JSON_VERSION_H_INCLUDED - -#define JSONCPP_VERSION_STRING "1.8.4" -#define JSONCPP_VERSION_MAJOR 1 -#define JSONCPP_VERSION_MINOR 8 -#define JSONCPP_VERSION_PATCH 4 -#define JSONCPP_VERSION_QUALIFIER -#define JSONCPP_VERSION_HEXA \ - ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ - (JSONCPP_VERSION_PATCH << 8)) - -#ifdef JSONCPP_USING_SECURE_MEMORY -#undef JSONCPP_USING_SECURE_MEMORY -#endif -#define JSONCPP_USING_SECURE_MEMORY 0 -// If non-zero, the library zeroes any memory that it has allocated before -// it frees its memory. - -#endif // JSON_VERSION_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/version.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/allocator.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_ALLOCATOR_H_INCLUDED -#define CPPTL_JSON_ALLOCATOR_H_INCLUDED - -#include -#include - -#pragma pack(push, 8) - -namespace Json { -template class SecureAllocator { -public: - // Type definitions - using value_type = T; - using pointer = T*; - using const_pointer = const T*; - using reference = T&; - using const_reference = const T&; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; - - /** - * Allocate memory for N items using the standard allocator. - */ - pointer allocate(size_type n) { - // allocate using "global operator new" - return static_cast(::operator new(n * sizeof(T))); - } - - /** - * Release memory which was allocated for N items at pointer P. - * - * The memory block is filled with zeroes before being released. - * The pointer argument is tagged as "volatile" to prevent the - * compiler optimizing out this critical step. - */ - void deallocate(volatile pointer p, size_type n) { - std::memset(p, 0, n * sizeof(T)); - // free using "global operator delete" - ::operator delete(p); - } - - /** - * Construct an item in-place at pointer P. - */ - template void construct(pointer p, Args&&... args) { - // construct using "placement new" and "perfect forwarding" - ::new (static_cast(p)) T(std::forward(args)...); - } - - size_type max_size() const { return size_t(-1) / sizeof(T); } - - pointer address(reference x) const { return std::addressof(x); } - - const_pointer address(const_reference x) const { return std::addressof(x); } - - /** - * Destroy an item in-place at pointer P. - */ - void destroy(pointer p) { - // destroy using "explicit destructor" - p->~T(); - } - - // Boilerplate - SecureAllocator() {} - template SecureAllocator(const SecureAllocator&) {} - template struct rebind { using other = SecureAllocator; }; -}; - -template -bool operator==(const SecureAllocator&, const SecureAllocator&) { - return true; -} - -template -bool operator!=(const SecureAllocator&, const SecureAllocator&) { - return false; -} - -} // namespace Json - -#pragma pack(pop) - -#endif // CPPTL_JSON_ALLOCATOR_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/allocator.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_CONFIG_H_INCLUDED -#define JSON_CONFIG_H_INCLUDED -#include -#include -#include -#include -#include -#include -#include -#include - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 - -// If non-zero, the library uses exceptions to report bad input instead of C -// assertion macros. The default is to use exceptions. -#ifndef JSON_USE_EXCEPTION -#define JSON_USE_EXCEPTION 1 -#endif - -/// If defined, indicates that the source file is amalgamated -/// to prevent private header inclusion. -/// Remarks: it is automatically defined in the generated amalgamated header. -// #define JSON_IS_AMALGAMATION - -#ifdef JSON_IN_CPPTL -#include -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllexport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#endif // if defined(_MSC_VER) -#elif defined(JSON_DLL) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllimport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL -#if !defined(JSON_API) -#define JSON_API -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1800 -#error \ - "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1900 -// As recommended at -// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 -extern JSON_API int -msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...); -#define jsoncpp_snprintf msvc_pre1900_c99_snprintf -#else -#define jsoncpp_snprintf std::snprintf -#endif - -// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for -// integer -// Storages, and 64 bits integer support is disabled. -// #define JSON_NO_INT64 1 - -#if defined(_MSC_VER) // MSVC -#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -#endif // defined(_MSC_VER) - -// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. -// C++11 should be used directly in JSONCPP. -#define JSONCPP_OVERRIDE override - -#if __cplusplus >= 201103L -#define JSONCPP_NOEXCEPT noexcept -#define JSONCPP_OP_EXPLICIT explicit -#elif defined(_MSC_VER) && _MSC_VER < 1900 -#define JSONCPP_NOEXCEPT throw() -#define JSONCPP_OP_EXPLICIT explicit -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -#define JSONCPP_NOEXCEPT noexcept -#define JSONCPP_OP_EXPLICIT explicit -#else -#define JSONCPP_NOEXCEPT throw() -#define JSONCPP_OP_EXPLICIT -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2013 - -#ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 -#endif - -#ifdef __clang__ -#if __has_extension(attribute_deprecated_with_message) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -#endif // GNUC version -#endif // __clang__ || __GNUC__ - -#if !defined(JSONCPP_DEPRECATED) -#define JSONCPP_DEPRECATED(message) -#endif // if !defined(JSONCPP_DEPRECATED) - -#if __GNUC__ >= 6 -#define JSON_USE_INT64_DOUBLE_CONVERSION 1 -#endif - -#if !defined(JSON_IS_AMALGAMATION) - -#include "allocator.h" -#include "version.h" - -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { -typedef int Int; -typedef unsigned int UInt; -#if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; -#undef JSON_HAS_INT64 -#else // if defined(JSON_NO_INT64) -// For Microsoft Visual use specific types as long long is not supported -#if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -#else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; -#define JSON_HAS_INT64 -#endif // if defined(JSON_NO_INT64) - -template -using Allocator = typename std::conditional, - std::allocator>::type; -using String = std::basic_string, Allocator>; -using IStringStream = std::basic_istringstream; -using OStringStream = std::basic_ostringstream; -using IStream = std::istream; -using OStream = std::ostream; -} // namespace Json - -// Legacy names (formerly macros). -using JSONCPP_STRING = Json::String; -using JSONCPP_ISTRINGSTREAM = Json::IStringStream; -using JSONCPP_OSTRINGSTREAM = Json::OStringStream; -using JSONCPP_ISTREAM = Json::IStream; -using JSONCPP_OSTREAM = Json::OStream; - -#endif // JSON_CONFIG_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/config.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_FORWARDS_H_INCLUDED -#define JSON_FORWARDS_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -// writer.h -class FastWriter; -class StyledWriter; - -// reader.h -class Reader; - -// features.h -class Features; - -// value.h -typedef unsigned int ArrayIndex; -class StaticString; -class Path; -class PathArgument; -class Value; -class ValueIteratorBase; -class ValueIterator; -class ValueConstIterator; - -} // namespace Json - -#endif // JSON_FORWARDS_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/forwards.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/features.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -#define CPPTL_JSON_FEATURES_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -#pragma pack(push, 8) - -namespace Json { - -/** \brief Configuration passed to reader and writer. - * This configuration object can be used to force the Reader or Writer - * to behave in a standard conforming way. - */ -class JSON_API Features { -public: - /** \brief A configuration that allows all features and assumes all strings - * are UTF-8. - * - C & C++ comments are allowed - * - Root object can be any JSON value - * - Assumes Value strings are encoded in UTF-8 - */ - static Features all(); - - /** \brief A configuration that is strictly compatible with the JSON - * specification. - * - Comments are forbidden. - * - Root object must be either an array or an object value. - * - Assumes Value strings are encoded in UTF-8 - */ - static Features strictMode(); - - /** \brief Initialize the configuration like JsonConfig::allFeatures; - */ - Features(); - - /// \c true if comments are allowed. Default: \c true. - bool allowComments_{true}; - - /// \c true if root must be either an array or an object value. Default: \c - /// false. - bool strictRoot_{false}; - - /// \c true if dropped null placeholders are allowed. Default: \c false. - bool allowDroppedNullPlaceholders_{false}; - - /// \c true if numeric object key are allowed. Default: \c false. - bool allowNumericKeys_{false}; -}; - -} // namespace Json - -#pragma pack(pop) - -#endif // CPPTL_JSON_FEATURES_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/features.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/value.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_H_INCLUDED -#define CPPTL_JSON_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include - -#ifndef JSON_USE_CPPTL_SMALLMAP -#include -#else -#include -#endif -#ifdef JSON_USE_CPPTL -#include -#endif - -// Conditional NORETURN attribute on the throw functions would: -// a) suppress false positives from static code analysis -// b) possibly improve optimization opportunities. -#if !defined(JSONCPP_NORETURN) -#if defined(_MSC_VER) -#define JSONCPP_NORETURN __declspec(noreturn) -#elif defined(__GNUC__) -#define JSONCPP_NORETURN __attribute__((__noreturn__)) -#else -#define JSONCPP_NORETURN -#endif -#endif - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(push) -#pragma warning(disable : 4251) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -/** \brief JSON (JavaScript Object Notation). - */ -namespace Json { - -/** Base class for all exceptions we throw. - * - * We use nothing but these internally. Of course, STL can throw others. - */ -class JSON_API Exception : public std::exception { -public: - Exception(String msg); - ~Exception() JSONCPP_NOEXCEPT override; - char const* what() const JSONCPP_NOEXCEPT override; - -protected: - String msg_; -}; - -/** Exceptions which the user cannot easily avoid. - * - * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input - * - * \remark derived from Json::Exception - */ -class JSON_API RuntimeError : public Exception { -public: - RuntimeError(String const& msg); -}; - -/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. - * - * These are precondition-violations (user bugs) and internal errors (our bugs). - * - * \remark derived from Json::Exception - */ -class JSON_API LogicError : public Exception { -public: - LogicError(String const& msg); -}; - -/// used internally -JSONCPP_NORETURN void throwRuntimeError(String const& msg); -/// used internally -JSONCPP_NORETURN void throwLogicError(String const& msg); - -/** \brief Type of the value held by a Value object. - */ -enum ValueType { - nullValue = 0, ///< 'null' value - intValue, ///< signed integer value - uintValue, ///< unsigned integer value - realValue, ///< double value - stringValue, ///< UTF-8 string value - booleanValue, ///< bool value - arrayValue, ///< array value (ordered list) - objectValue ///< object value (collection of name/value pairs). -}; - -enum CommentPlacement { - commentBefore = 0, ///< a comment placed on the line before a value - commentAfterOnSameLine, ///< a comment just after a value on the same line - commentAfter, ///< a comment on the line after a value (only make sense for - /// root value) - numberOfCommentPlacement -}; - -/** \brief Type of precision for formatting of real values. - */ -enum PrecisionType { - significantDigits = 0, ///< we set max number of significant digits in string - decimalPlaces ///< we set max number of digits after "." in string -}; - -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator EnumMemberNames; -// typedef CppTL::AnyEnumerator EnumValues; -//# endif - -/** \brief Lightweight wrapper to tag static string. - * - * Value constructor and objectValue member assignment takes advantage of the - * StaticString and avoid the cost of string duplication when storing the - * string or the member name. - * - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ -class JSON_API StaticString { -public: - explicit StaticString(const char* czstring) : c_str_(czstring) {} - - operator const char*() const { return c_str_; } - - const char* c_str() const { return c_str_; } - -private: - const char* c_str_; -}; - -/** \brief Represents a JSON value. - * - * This class is a discriminated union wrapper that can represents a: - * - signed integer [range: Value::minInt - Value::maxInt] - * - unsigned integer (range: 0 - Value::maxUInt) - * - double - * - UTF-8 string - * - boolean - * - 'null' - * - an ordered list of Value - * - collection of name/value pairs (javascript object) - * - * The type of the held value is represented by a #ValueType and - * can be obtained using type(). - * - * Values of an #objectValue or #arrayValue can be accessed using operator[]() - * methods. - * Non-const methods will automatically create the a #nullValue element - * if it does not exist. - * The sequence of an #arrayValue will be automatically resized and initialized - * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. - * - * The get() methods can be used to obtain default value in the case the - * required element does not exist. - * - * It is possible to iterate over the list of member keys of an object using - * the getMemberNames() method. - * - * \note #Value string-length fit in size_t, but keys must be < 2^30. - * (The reason is an implementation detail.) A #CharReader will raise an - * exception if a bound is exceeded to avoid security holes in your app, - * but the Value API does *not* check bounds. That is the responsibility - * of the caller. - */ -class JSON_API Value { - friend class ValueIteratorBase; - -public: - typedef std::vector Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; -#if defined(JSON_HAS_INT64) - typedef Json::UInt64 UInt64; - typedef Json::Int64 Int64; -#endif // defined(JSON_HAS_INT64) - typedef Json::LargestInt LargestInt; - typedef Json::LargestUInt LargestUInt; - typedef Json::ArrayIndex ArrayIndex; - - // Required for boost integration, e. g. BOOST_TEST - typedef std::string value_type; - - static const Value& null; ///< We regret this reference to a global instance; - ///< prefer the simpler Value(). - static const Value& nullRef; ///< just a kludge for binary-compatibility; same - ///< as null - static Value const& nullSingleton(); ///< Prefer this to null or nullRef. - - /// Minimum signed integer value that can be stored in a Json::Value. - static const LargestInt minLargestInt; - /// Maximum signed integer value that can be stored in a Json::Value. - static const LargestInt maxLargestInt; - /// Maximum unsigned integer value that can be stored in a Json::Value. - static const LargestUInt maxLargestUInt; - - /// Minimum signed int value that can be stored in a Json::Value. - static const Int minInt; - /// Maximum signed int value that can be stored in a Json::Value. - static const Int maxInt; - /// Maximum unsigned int value that can be stored in a Json::Value. - static const UInt maxUInt; - -#if defined(JSON_HAS_INT64) - /// Minimum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 minInt64; - /// Maximum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 maxInt64; - /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. - static const UInt64 maxUInt64; -#endif // defined(JSON_HAS_INT64) - - /// Default precision for real value for string representation. - static const UInt defaultRealPrecision; - -// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler -// when using gcc and clang backend compilers. CZString -// cannot be defined as private. See issue #486 -#ifdef __NVCC__ -public: -#else -private: -#endif -#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - class CZString { - public: - enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; - CZString(ArrayIndex index); - CZString(char const* str, unsigned length, DuplicationPolicy allocate); - CZString(CZString const& other); -#if JSON_HAS_RVALUE_REFERENCES - CZString(CZString&& other); -#endif - ~CZString(); - CZString& operator=(const CZString& other); - -#if JSON_HAS_RVALUE_REFERENCES - CZString& operator=(CZString&& other); -#endif - - bool operator<(CZString const& other) const; - bool operator==(CZString const& other) const; - ArrayIndex index() const; - // const char* c_str() const; ///< \deprecated - char const* data() const; - unsigned length() const; - bool isStaticString() const; - - private: - void swap(CZString& other); - - struct StringStorage { - unsigned policy_ : 2; - unsigned length_ : 30; // 1GB max - }; - - char const* cstr_; // actually, a prefixed string, unless policy is noDup - union { - ArrayIndex index_; - StringStorage storage_; - }; - }; - -public: -#ifndef JSON_USE_CPPTL_SMALLMAP - typedef std::map ObjectValues; -#else - typedef CppTL::SmallMap ObjectValues; -#endif // ifndef JSON_USE_CPPTL_SMALLMAP -#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - -public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. -This is useful since clear() and resize() will not alter types. - - Examples: -\code -Json::Value null_value; // null -Json::Value arr_value(Json::arrayValue); // [] -Json::Value obj_value(Json::objectValue); // {} -\endcode - */ - Value(ValueType type = nullValue); - Value(Int value); - Value(UInt value); -#if defined(JSON_HAS_INT64) - Value(Int64 value); - Value(UInt64 value); -#endif // if defined(JSON_HAS_INT64) - Value(double value); - Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) - Value(const char* begin, const char* end); ///< Copy all, incl zeroes. - /** \brief Constructs a value from a static string. - - * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. - * \note This works only for null-terminated strings. (We cannot change the - * size of this class, so we have nowhere to store the length, - * which might be computed later for various operations.) - * - * Example of usage: - * \code - * static StaticString foo("some text"); - * Json::Value aValue(foo); - * \endcode - */ - Value(const StaticString& value); - Value(const String& value); ///< Copy data() til size(). Embedded - ///< zeroes too. -#ifdef JSON_USE_CPPTL - Value(const CppTL::ConstString& value); -#endif - Value(bool value); - Value(const Value& other); - Value(Value&& other); - ~Value(); - - /// \note Overwrite existing comments. To preserve comments, use - /// #swapPayload(). - Value& operator=(const Value& other); - Value& operator=(Value&& other); - - /// Swap everything. - void swap(Value& other); - /// Swap values but leave comments and source offsets in place. - void swapPayload(Value& other); - - /// copy everything. - void copy(const Value& other); - /// copy values but leave comments and source offsets in place. - void copyPayload(const Value& other); - - ValueType type() const; - - /// Compare payload only, not comments etc. - bool operator<(const Value& other) const; - bool operator<=(const Value& other) const; - bool operator>=(const Value& other) const; - bool operator>(const Value& other) const; - bool operator==(const Value& other) const; - bool operator!=(const Value& other) const; - int compare(const Value& other) const; - - const char* asCString() const; ///< Embedded zeroes could cause you trouble! -#if JSONCPP_USING_SECURE_MEMORY - unsigned getCStringLength() const; // Allows you to understand the length of - // the CString -#endif - String asString() const; ///< Embedded zeroes are possible. - /** Get raw char* of string-value. - * \return false if !string. (Seg-fault if str or end are NULL.) - */ - bool getString(char const** begin, char const** end) const; -#ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -#endif - Int asInt() const; - UInt asUInt() const; -#if defined(JSON_HAS_INT64) - Int64 asInt64() const; - UInt64 asUInt64() const; -#endif // if defined(JSON_HAS_INT64) - LargestInt asLargestInt() const; - LargestUInt asLargestUInt() const; - float asFloat() const; - double asDouble() const; - bool asBool() const; - - bool isNull() const; - bool isBool() const; - bool isInt() const; - bool isInt64() const; - bool isUInt() const; - bool isUInt64() const; - bool isIntegral() const; - bool isDouble() const; - bool isNumeric() const; - bool isString() const; - bool isArray() const; - bool isObject() const; - - bool isConvertibleTo(ValueType other) const; - - /// Number of values in array or object - ArrayIndex size() const; - - /// \brief Return true if empty array, empty object, or null; - /// otherwise, false. - bool empty() const; - - /// Return !isNull() - JSONCPP_OP_EXPLICIT operator bool() const; - - /// Remove all object members and array elements. - /// \pre type() is arrayValue, objectValue, or nullValue - /// \post type() is unchanged - void clear(); - - /// Resize the array to newSize elements. - /// New elements are initialized to null. - /// May only be called on nullValue or arrayValue. - /// \pre type() is arrayValue or nullValue - /// \post type() is arrayValue - void resize(ArrayIndex newSize); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value& operator[](ArrayIndex index); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value& operator[](int index); - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value& operator[](ArrayIndex index) const; - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value& operator[](int index) const; - - /// If the array contains at least index+1 elements, returns the element - /// value, - /// otherwise returns defaultValue. - Value get(ArrayIndex index, const Value& defaultValue) const; - /// Return true if index < size(). - bool isValidIndex(ArrayIndex index) const; - /// \brief Append value to array at the end. - /// - /// Equivalent to jsonvalue[jsonvalue.size()] = value; - Value& append(const Value& value); - -#if JSON_HAS_RVALUE_REFERENCES - Value& append(Value&& value); -#endif - - /// Access an object value by name, create a null member if it does not exist. - /// \note Because of our implementation, keys are limited to 2^30 -1 chars. - /// Exceeding that will cause an exception. - Value& operator[](const char* key); - /// Access an object value by name, returns null if there is no member with - /// that name. - const Value& operator[](const char* key) const; - /// Access an object value by name, create a null member if it does not exist. - /// \param key may contain embedded nulls. - Value& operator[](const String& key); - /// Access an object value by name, returns null if there is no member with - /// that name. - /// \param key may contain embedded nulls. - const Value& operator[](const String& key) const; - /** \brief Access an object value by name, create a null member if it does not - exist. - - * If the object has no entry for that name, then the member name used to - store - * the new entry is not duplicated. - * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - Value& operator[](const StaticString& key); -#ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value& operator[](const CppTL::ConstString& key); - /// Access an object value by name, returns null if there is no member with - /// that name. - const Value& operator[](const CppTL::ConstString& key) const; -#endif - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - Value get(const char* key, const Value& defaultValue) const; - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - /// \note key may contain embedded nulls. - Value - get(const char* begin, const char* end, const Value& defaultValue) const; - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - /// \param key may contain embedded nulls. - Value get(const String& key, const Value& defaultValue) const; -#ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - Value get(const CppTL::ConstString& key, const Value& defaultValue) const; -#endif - /// Most general and efficient version of isMember()const, get()const, - /// and operator[]const - /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 - Value const* find(char const* begin, char const* end) const; - /// Most general and efficient version of object-mutators. - /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 - /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. - Value const* demand(char const* begin, char const* end); - /// \brief Remove and return the named member. - /// - /// Do nothing if it did not exist. - /// \pre type() is objectValue or nullValue - /// \post type() is unchanged - void removeMember(const char* key); - /// Same as removeMember(const char*) - /// \param key may contain embedded nulls. - void removeMember(const String& key); - /// Same as removeMember(const char* begin, const char* end, Value* removed), - /// but 'key' is null-terminated. - bool removeMember(const char* key, Value* removed); - /** \brief Remove the named map member. - - Update 'removed' iff removed. - \param key may contain embedded nulls. - \return true iff removed (no exceptions) - */ - bool removeMember(String const& key, Value* removed); - /// Same as removeMember(String const& key, Value* removed) - bool removeMember(const char* begin, const char* end, Value* removed); - /** \brief Remove the indexed array element. - - O(n) expensive operations. - Update 'removed' iff removed. - \return true if removed (no exceptions) - */ - bool removeIndex(ArrayIndex index, Value* removed); - - /// Return true if the object has a member named key. - /// \note 'key' must be null-terminated. - bool isMember(const char* key) const; - /// Return true if the object has a member named key. - /// \param key may contain embedded nulls. - bool isMember(const String& key) const; - /// Same as isMember(String const& key)const - bool isMember(const char* begin, const char* end) const; -#ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember(const CppTL::ConstString& key) const; -#endif - - /// \brief Return a list of the member names. - /// - /// If null, return an empty list. - /// \pre type() is objectValue or nullValue - /// \post if type() was nullValue, it remains nullValue - Members getMemberNames() const; - - //# ifdef JSON_USE_CPPTL - // EnumMemberNames enumMemberNames() const; - // EnumValues enumValues() const; - //# endif - - /// \deprecated Always pass len. - JSONCPP_DEPRECATED("Use setComment(String const&) instead.") - void setComment(const char* comment, CommentPlacement placement); - /// Comments must be //... or /* ... */ - void setComment(const char* comment, size_t len, CommentPlacement placement); - /// Comments must be //... or /* ... */ - void setComment(const String& comment, CommentPlacement placement); - bool hasComment(CommentPlacement placement) const; - /// Include delimiters and embedded newlines. - String getComment(CommentPlacement placement) const; - - String toStyledString() const; - - const_iterator begin() const; - const_iterator end() const; - - iterator begin(); - iterator end(); - - // Accessors for the [start, limit) range of bytes within the JSON text from - // which this value was parsed, if any. - void setOffsetStart(ptrdiff_t start); - void setOffsetLimit(ptrdiff_t limit); - ptrdiff_t getOffsetStart() const; - ptrdiff_t getOffsetLimit() const; - -private: - void setType(ValueType v) { bits_.value_type_ = v; } - bool isAllocated() const { return bits_.allocated_; } - void setIsAllocated(bool v) { bits_.allocated_ = v; } - - void initBasic(ValueType type, bool allocated = false); - void dupPayload(const Value& other); - void releasePayload(); - void dupMeta(const Value& other); - - Value& resolveReference(const char* key); - Value& resolveReference(const char* key, const char* end); - - struct CommentInfo { - CommentInfo(); - ~CommentInfo(); - - void setComment(const char* text, size_t len); - - char* comment_{nullptr}; - }; - - // struct MemberNamesTransform - //{ - // typedef const char *result_type; - // const char *operator()( const CZString &name ) const - // { - // return name.c_str(); - // } - //}; - - union ValueHolder { - LargestInt int_; - LargestUInt uint_; - double real_; - bool bool_; - char* string_; // if allocated_, ptr to { unsigned, char[] }. - ObjectValues* map_; - } value_; - - struct { - // Really a ValueType, but types should agree for bitfield packing. - unsigned int value_type_ : 8; - // Unless allocated_, string_ must be null-terminated. - unsigned int allocated_ : 1; - } bits_; - - CommentInfo* comments_; - - // [start, limit) byte offsets in the source JSON text from which this Value - // was extracted. - ptrdiff_t start_; - ptrdiff_t limit_; -}; - -/** \brief Experimental and untested: represents an element of the "path" to - * access a node. - */ -class JSON_API PathArgument { -public: - friend class Path; - - PathArgument(); - PathArgument(ArrayIndex index); - PathArgument(const char* key); - PathArgument(const String& key); - -private: - enum Kind { kindNone = 0, kindIndex, kindKey }; - String key_; - ArrayIndex index_{}; - Kind kind_{kindNone}; -}; - -/** \brief Experimental and untested: represents a "path" to access a node. - * - * Syntax: - * - "." => root node - * - ".[n]" => elements at index 'n' of root node (an array value) - * - ".name" => member named 'name' of root node (an object value) - * - ".name1.name2.name3" - * - ".[0][1][2].name1[3]" - * - ".%" => member name is provided as parameter - * - ".[%]" => index is provied as parameter - */ -class JSON_API Path { -public: - Path(const String& path, - const PathArgument& a1 = PathArgument(), - const PathArgument& a2 = PathArgument(), - const PathArgument& a3 = PathArgument(), - const PathArgument& a4 = PathArgument(), - const PathArgument& a5 = PathArgument()); - - const Value& resolve(const Value& root) const; - Value resolve(const Value& root, const Value& defaultValue) const; - /// Creates the "path" to access the specified node and returns a reference on - /// the node. - Value& make(Value& root) const; - -private: - typedef std::vector InArgs; - typedef std::vector Args; - - void makePath(const String& path, const InArgs& in); - void addPathInArg(const String& path, - const InArgs& in, - InArgs::const_iterator& itInArg, - PathArgument::Kind kind); - static void invalidPath(const String& path, int location); - - Args args_; -}; - -/** \brief base class for Value iterators. - * - */ -class JSON_API ValueIteratorBase { -public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; - - bool operator==(const SelfType& other) const { return isEqual(other); } - - bool operator!=(const SelfType& other) const { return !isEqual(other); } - - difference_type operator-(const SelfType& other) const { - return other.computeDistance(*this); - } - - /// Return either the index or the member name of the referenced value as a - /// Value. - Value key() const; - - /// Return the index of the referenced Value, or -1 if it is not an - /// arrayValue. - UInt index() const; - - /// Return the member name of the referenced Value, or "" if it is not an - /// objectValue. - /// \note Avoid `c_str()` on result, as embedded zeroes are possible. - String name() const; - - /// Return the member name of the referenced Value. "" if it is not an - /// objectValue. - /// \deprecated This cannot be used for UTF-8 strings, since there can be - /// embedded nulls. - JSONCPP_DEPRECATED("Use `key = name();` instead.") - char const* memberName() const; - /// Return the member name of the referenced Value, or NULL if it is not an - /// objectValue. - /// \note Better version than memberName(). Allows embedded nulls. - char const* memberName(char const** end) const; - -protected: - Value& deref() const; - - void increment(); - - void decrement(); - - difference_type computeDistance(const SelfType& other) const; - - bool isEqual(const SelfType& other) const; - - void copy(const SelfType& other); - -private: - Value::ObjectValues::iterator current_; - // Indicates that iterator is for a null value. - bool isNull_{true}; - -public: - // For some reason, BORLAND needs these at the end, rather - // than earlier. No idea why. - ValueIteratorBase(); - explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); -}; - -/** \brief const iterator for object and array value. - * - */ -class JSON_API ValueConstIterator : public ValueIteratorBase { - friend class Value; - -public: - typedef const Value value_type; - // typedef unsigned int size_t; - // typedef int difference_type; - typedef const Value& reference; - typedef const Value* pointer; - typedef ValueConstIterator SelfType; - - ValueConstIterator(); - ValueConstIterator(ValueIterator const& other); - -private: - /*! \internal Use by Value to create an iterator. - */ - explicit ValueConstIterator(const Value::ObjectValues::iterator& current); - -public: - SelfType& operator=(const ValueIteratorBase& other); - - SelfType operator++(int) { - SelfType temp(*this); - ++*this; - return temp; - } - - SelfType operator--(int) { - SelfType temp(*this); - --*this; - return temp; - } - - SelfType& operator--() { - decrement(); - return *this; - } - - SelfType& operator++() { - increment(); - return *this; - } - - reference operator*() const { return deref(); } - - pointer operator->() const { return &deref(); } -}; - -/** \brief Iterator for object and array value. - */ -class JSON_API ValueIterator : public ValueIteratorBase { - friend class Value; - -public: - typedef Value value_type; - typedef unsigned int size_t; - typedef int difference_type; - typedef Value& reference; - typedef Value* pointer; - typedef ValueIterator SelfType; - - ValueIterator(); - explicit ValueIterator(const ValueConstIterator& other); - ValueIterator(const ValueIterator& other); - -private: - /*! \internal Use by Value to create an iterator. - */ - explicit ValueIterator(const Value::ObjectValues::iterator& current); - -public: - SelfType& operator=(const SelfType& other); - - SelfType operator++(int) { - SelfType temp(*this); - ++*this; - return temp; - } - - SelfType operator--(int) { - SelfType temp(*this); - --*this; - return temp; - } - - SelfType& operator--() { - decrement(); - return *this; - } - - SelfType& operator++() { - increment(); - return *this; - } - - reference operator*() const { return deref(); } - - pointer operator->() const { return &deref(); } -}; - -inline void swap(Value& a, Value& b) { a.swap(b); } - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // CPPTL_JSON_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/value.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/reader.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_READER_H_INCLUDED -#define CPPTL_JSON_READER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "features.h" -#include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(push) -#pragma warning(disable : 4251) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -namespace Json { - -/** \brief Unserialize a JSON document into a - *Value. - * - * \deprecated Use CharReader and CharReaderBuilder. - */ -class JSON_API Reader { -public: - typedef char Char; - typedef const Char* Location; - - /** \brief An error tagged with where in the JSON text it was encountered. - * - * The offsets give the [start, limit) range of bytes within the text. Note - * that this is bytes, not codepoints. - * - */ - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - String message; - }; - - /** \brief Constructs a Reader allowing all features - * for parsing. - */ - JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. - */ - JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") - Reader(const Features& features); - - /** \brief Read a Value from a JSON - * document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - * back during - * serialization, \c false to discard comments. - * This parameter is ignored if - * Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - bool - parse(const std::string& document, Value& root, bool collectComments = true); - - /** \brief Read a Value from a JSON - document. - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - back during - * serialization, \c false to discard comments. - * This parameter is ignored if - Features::allowComments_ - * is \c false. - * \return \c true if the document was successfully parsed, \c false if an - error occurred. - */ - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments = true); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse(IStream& is, Value& root, bool collectComments = true); - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. - * \deprecated Use getFormattedErrorMessages() instead (typo fix). - */ - JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") - String getFormatedErrorMessages() const; - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. - */ - String getFormattedErrorMessages() const; - - /** \brief Returns a vector of structured erros encounted while parsing. - * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate - * multiple - * errors. This can occur if the parser recovers from a non-fatal - * parse error and then encounters additional errors. - */ - std::vector getStructuredErrors() const; - - /** \brief Add a semantic error message. - * \param value JSON Value location associated with the error - * \param message The error message. - * \return \c true if the error was successfully added, \c false if the - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message); - - /** \brief Add a semantic error message with extra context. - * \param value JSON Value location associated with the error - * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error - * \return \c true if the error was successfully added, \c false if either - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message, const Value& extra); - - /** \brief Return whether there are any errors. - * \return \c true if there are no errors to report \c false if - * errors have occurred. - */ - bool good() const; - -private: - enum TokenType { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo { - public: - Token token_; - String message_; - Location extra_; - }; - - typedef std::deque Errors; - - bool readToken(Token& token); - void skipSpaces(); - bool match(Location pattern, int patternLength); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject(Token& token); - bool readArray(Token& token); - bool decodeNumber(Token& token); - bool decodeNumber(Token& token, Value& decoded); - bool decodeString(Token& token); - bool decodeString(Token& token, String& decoded); - bool decodeDouble(Token& token); - bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const String& message, Token& token, Location extra = nullptr); - bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const String& message, - Token& token, - TokenType skipUntilToken); - void skipUntilSpace(); - Value& currentValue(); - Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - String getLocationLineAndColumn(Location location) const; - void addComment(Location begin, Location end, CommentPlacement placement); - void skipCommentTokens(Token& token); - - static bool containsNewLine(Location begin, Location end); - static String normalizeEOL(Location begin, Location end); - - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - String document_; - Location begin_{}; - Location end_{}; - Location current_{}; - Location lastValueEnd_{}; - Value* lastValue_{}; - String commentsBefore_; - Features features_; - bool collectComments_{}; -}; // Reader - -/** Interface for reading JSON from a char array. - */ -class JSON_API CharReader { -public: - virtual ~CharReader() = default; - /** \brief Read a Value from a JSON - document. - * The document must be a UTF-8 encoded string containing the document to - read. - * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param errs [out] Formatted error messages (if not NULL) - * a user friendly string that lists errors in the parsed - * document. - * \return \c true if the document was successfully parsed, \c false if an - error occurred. - */ - virtual bool parse(char const* beginDoc, - char const* endDoc, - Value* root, - String* errs) = 0; - - class JSON_API Factory { - public: - virtual ~Factory() = default; - /** \brief Allocate a CharReader via operator new(). - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - virtual CharReader* newCharReader() const = 0; - }; // Factory -}; // CharReader - -/** \brief Build a CharReader implementation. - -Usage: -\code - using namespace Json; - CharReaderBuilder builder; - builder["collectComments"] = false; - Value value; - String errs; - bool ok = parseFromStream(builder, std::cin, &value, &errs); -\endcode -*/ -class JSON_API CharReaderBuilder : public CharReader::Factory { -public: - // Note: We use a Json::Value so that we can add data-members to this class - // without a major version bump. - /** Configuration of this builder. - These are case-sensitive. - Available settings (case-sensitive): - - `"collectComments": false or true` - - true to collect comment and allow writing them - back during serialization, false to discard comments. - This parameter is ignored if allowComments is false. - - `"allowComments": false or true` - - true if comments are allowed. - - `"strictRoot": false or true` - - true if root must be either an array or an object value - - `"allowDroppedNullPlaceholders": false or true` - - true if dropped null placeholders are allowed. (See - StreamWriterBuilder.) - - `"allowNumericKeys": false or true` - - true if numeric object keys are allowed. - - `"allowSingleQuotes": false or true` - - true if '' are allowed for strings (both keys and values) - - `"stackLimit": integer` - - Exceeding stackLimit (recursive depth of `readValue()`) will - cause an exception. - - This is a security issue (seg-faults caused by deeply nested JSON), - so the default is low. - - `"failIfExtra": false or true` - - If true, `parse()` returns false when extra non-whitespace trails - the JSON value in the input string. - - `"rejectDupKeys": false or true` - - If true, `parse()` returns false when a key is duplicated within an - object. - - `"allowSpecialFloats": false or true` - - If true, special float values (NaNs and infinities) are allowed - and their values are lossfree restorable. - - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ - Json::Value settings_; - - CharReaderBuilder(); - ~CharReaderBuilder() override; - - CharReader* newCharReader() const override; - - /** \return true if 'settings' are legal and consistent; - * otherwise, indicate bad settings via 'invalid'. - */ - bool validate(Json::Value* invalid) const; - - /** A simple way to update a specific setting. - */ - Value& operator[](const String& key); - - /** Called by ctor, but you can use this to reset settings_. - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults - */ - static void setDefaults(Json::Value* settings); - /** Same as old Features::strictMode(). - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode - */ - static void strictMode(Json::Value* settings); -}; - -/** Consume entire stream and use its begin/end. - * Someday we might have a real StreamReader, but for now this - * is convenient. - */ -bool JSON_API parseFromStream(CharReader::Factory const&, - IStream&, - Value* root, - std::string* errs); - -/** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() -*/ -JSON_API IStream& operator>>(IStream&, Value&); - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // CPPTL_JSON_READER_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/reader.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/writer.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_WRITER_H_INCLUDED -#define JSON_WRITER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4251) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -namespace Json { - -class Value; - -/** - -Usage: -\code - using namespace Json; - void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { - std::unique_ptr const writer( - factory.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush - } -\endcode -*/ -class JSON_API StreamWriter { -protected: - OStream* sout_; // not owned; will not delete -public: - StreamWriter(); - virtual ~StreamWriter(); - /** Write Value into document as configured in sub-class. - Do not take ownership of sout, but maintain a reference during function. - \pre sout != NULL - \return zero on success (For now, we always return zero, so check the - stream instead.) \throw std::exception possibly, depending on configuration - */ - virtual int write(Value const& root, OStream* sout) = 0; - - /** \brief A simple abstract factory. - */ - class JSON_API Factory { - public: - virtual ~Factory(); - /** \brief Allocate a CharReader via operator new(). - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - virtual StreamWriter* newStreamWriter() const = 0; - }; // Factory -}; // StreamWriter - -/** \brief Write into stringstream, then return string, for convenience. - * A StreamWriter will be created from the factory, used, and then deleted. - */ -String JSON_API writeString(StreamWriter::Factory const& factory, - Value const& root); - -/** \brief Build a StreamWriter implementation. - -Usage: -\code - using namespace Json; - Value value = ...; - StreamWriterBuilder builder; - builder["commentStyle"] = "None"; - builder["indentation"] = " "; // or whatever you like - std::unique_ptr writer( - builder.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush -\endcode -*/ -class JSON_API StreamWriterBuilder : public StreamWriter::Factory { -public: - // Note: We use a Json::Value so that we can add data-members to this class - // without a major version bump. - /** Configuration of this builder. - Available settings (case-sensitive): - - "commentStyle": "None" or "All" - - "indentation": "". - - Setting this to an empty string also omits newline characters. - - "enableYAMLCompatibility": false or true - - slightly change the whitespace around colons - - "dropNullPlaceholders": false or true - - Drop the "null" string from the writer's output for nullValues. - Strictly speaking, this is not valid JSON. But when the output is being - fed to a browser's JavaScript, it makes for smaller output and the - browser can handle the output just fine. - - "useSpecialFloats": false or true - - If true, outputs non-finite floating point values in the following way: - NaN values as "NaN", positive infinity as "Infinity", and negative - infinity as "-Infinity". - - "precision": int - - Number of precision digits for formatting of real values. - - "precisionType": "significant"(default) or "decimal" - - Type of precision for formatting of real values. - - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ - Json::Value settings_; - - StreamWriterBuilder(); - ~StreamWriterBuilder() override; - - /** - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - StreamWriter* newStreamWriter() const override; - - /** \return true if 'settings' are legal and consistent; - * otherwise, indicate bad settings via 'invalid'. - */ - bool validate(Json::Value* invalid) const; - /** A simple way to update a specific setting. - */ - Value& operator[](const String& key); - - /** Called by ctor, but you can use this to reset settings_. - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults - */ - static void setDefaults(Json::Value* settings); -}; - -/** \brief Abstract class for writers. - * \deprecated Use StreamWriter. (And really, this is an implementation detail.) - */ -class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer { -public: - virtual ~Writer(); - - virtual String write(const Value& root) = 0; -}; - -/** \brief Outputs a Value in JSON format - *without formatting (not human friendly). - * - * The JSON document is written in a single line. It is not intended for 'human' - *consumption, - * but may be useful to support feature such as RPC where bandwidth is limited. - * \sa Reader, Value - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter - : public Writer { -public: - FastWriter(); - ~FastWriter() override = default; - - void enableYAMLCompatibility(); - - /** \brief Drop the "null" string from the writer's output for nullValues. - * Strictly speaking, this is not valid JSON. But when the output is being - * fed to a browser's JavaScript, it makes for smaller output and the - * browser can handle the output just fine. - */ - void dropNullPlaceholders(); - - void omitEndingLineFeed(); - -public: // overridden from Writer - String write(const Value& root) override; - -private: - void writeValue(const Value& value); - - String document_; - bool yamlCompatibilityEnabled_{false}; - bool dropNullPlaceholders_{false}; - bool omitEndingLineFeed_{false}; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -/** \brief Writes a Value in JSON format in a - *human friendly way. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per - *line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value - *types, - * and all the values fit on one lines, then print the array on a single - *line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their - *#CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API - StyledWriter : public Writer { -public: - StyledWriter(); - ~StyledWriter() override = default; - -public: // overridden from Writer - /** \brief Serialize a Value in JSON format. - * \param root Value to serialize. - * \return String containing the JSON document that represents the root value. - */ - String write(const Value& root) override; - -private: - void writeValue(const Value& value); - void writeArrayValue(const Value& value); - bool isMultilineArray(const Value& value); - void pushValue(const String& value); - void writeIndent(); - void writeWithIndent(const String& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(const Value& root); - void writeCommentAfterValueOnSameLine(const Value& root); - static bool hasCommentForValue(const Value& value); - static String normalizeEOL(const String& text); - - typedef std::vector ChildValues; - - ChildValues childValues_; - String document_; - String indentString_; - unsigned int rightMargin_{74}; - unsigned int indentSize_{3}; - bool addChildValues_{false}; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -/** \brief Writes a Value in JSON format in a - human friendly way, - to a stream rather than to a string. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per - line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value - types, - * and all the values fit on one lines, then print the array on a single - line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their - #CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API - StyledStreamWriter { -public: - /** - * \param indentation Each level will be indented by this amount extra. - */ - StyledStreamWriter(String indentation = "\t"); - ~StyledStreamWriter() = default; - -public: - /** \brief Serialize a Value in JSON format. - * \param out Stream to write to. (Can be ostringstream, e.g.) - * \param root Value to serialize. - * \note There is no point in deriving from Writer, since write() should not - * return a value. - */ - void write(OStream& out, const Value& root); - -private: - void writeValue(const Value& value); - void writeArrayValue(const Value& value); - bool isMultilineArray(const Value& value); - void pushValue(const String& value); - void writeIndent(); - void writeWithIndent(const String& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(const Value& root); - void writeCommentAfterValueOnSameLine(const Value& root); - static bool hasCommentForValue(const Value& value); - static String normalizeEOL(const String& text); - - typedef std::vector ChildValues; - - ChildValues childValues_; - OStream* document_; - String indentString_; - unsigned int rightMargin_{74}; - String indentation_; - bool addChildValues_ : 1; - bool indented_ : 1; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -#if defined(JSON_HAS_INT64) -String JSON_API valueToString(Int value); -String JSON_API valueToString(UInt value); -#endif // if defined(JSON_HAS_INT64) -String JSON_API valueToString(LargestInt value); -String JSON_API valueToString(LargestUInt value); -String JSON_API -valueToString(double value, - unsigned int precision = Value::defaultRealPrecision, - PrecisionType precisionType = PrecisionType::significantDigits); -String JSON_API valueToString(bool value); -String JSON_API valueToQuotedString(const char* value); - -/// \brief Output using the StyledStreamWriter. -/// \see Json::operator>>() -JSON_API OStream& operator<<(OStream&, const Value& root); - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // JSON_WRITER_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/writer.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/assertions.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED -#define CPPTL_JSON_ASSERTIONS_H_INCLUDED - -#include -#include - -#if !defined(JSON_IS_AMALGAMATION) -#include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -/** It should not be possible for a maliciously designed file to - * cause an abort() or seg-fault, so these macros are used only - * for pre-condition violations and internal logic errors. - */ -#if JSON_USE_EXCEPTION - -// @todo <= add detail about condition in exception -#define JSON_ASSERT(condition) \ - { \ - if (!(condition)) { \ - Json::throwLogicError("assert json failed"); \ - } \ - } - -#define JSON_FAIL_MESSAGE(message) \ - { \ - OStringStream oss; \ - oss << message; \ - Json::throwLogicError(oss.str()); \ - abort(); \ - } - -#else // JSON_USE_EXCEPTION - -#define JSON_ASSERT(condition) assert(condition) - -// The call to assert() will show the failure message in debug builds. In -// release builds we abort, for a core-dump or debugger. -#define JSON_FAIL_MESSAGE(message) \ - { \ - OStringStream oss; \ - oss << message; \ - assert(false && oss.str().c_str()); \ - abort(); \ - } - -#endif - -#define JSON_ASSERT_MESSAGE(condition, message) \ - if (!(condition)) { \ - JSON_FAIL_MESSAGE(message); \ - } - -#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/assertions.h -// ////////////////////////////////////////////////////////////////////// - - - - - -#endif //ifndef JSON_AMALGAMATED_H_INCLUDED diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/jsoncpp.cpp --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/jsoncpp-1.8.4/jsoncpp.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5418 +0,0 @@ -/// Json-cpp amalgamated source (http://jsoncpp.sourceforge.net/). -/// It is intended to be used with #include "json/json.h" - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - -/* -The JsonCpp library's source code, including accompanying documentation, -tests and demonstration applications, are licensed under the following -conditions... - -Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all -jurisdictions which recognize such a disclaimer. In such jurisdictions, -this software is released into the Public Domain. - -In jurisdictions which do not recognize Public Domain property (e.g. Germany as of -2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and -The JsonCpp Authors, and is released under the terms of the MIT License (see below). - -In jurisdictions which recognize Public Domain property, the user of this -software may choose to accept it either as 1) Public Domain, 2) under the -conditions of the MIT License (see below), or 3) under the terms of dual -Public Domain/MIT License conditions described here, as they choose. - -The MIT License is about as close to Public Domain as a license can get, and is -described in clear, concise terms at: - - http://en.wikipedia.org/wiki/MIT_License - -The full text of the MIT License follows: - -======================================================================== -Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors - -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. -======================================================================== -(END LICENSE TEXT) - -The MIT license is compatible with both the GPL and commercial -software, affording one all of the rights of Public Domain with the -minor nuisance of being required to keep the above copyright notice -and license text in the source code. Note also that by accepting the -Public Domain "license" you can re-license your copy using whatever -license you like. - -*/ - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: LICENSE -// ////////////////////////////////////////////////////////////////////// - - - - - - -#include "json/json.h" - -#ifndef JSON_IS_AMALGAMATION -#error "Compile with -I PATH_TO_JSON_DIRECTORY" -#endif - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_tool.h -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED -#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include -#endif - -// Also support old flag NO_LOCALE_SUPPORT -#ifdef NO_LOCALE_SUPPORT -#define JSONCPP_NO_LOCALE_SUPPORT -#endif - -#ifndef JSONCPP_NO_LOCALE_SUPPORT -#include -#endif - -/* This header provides common string manipulation support, such as UTF-8, - * portable conversion from/to string... - * - * It is an internal header that must not be exposed. - */ - -namespace Json { -static inline char getDecimalPoint() { -#ifdef JSONCPP_NO_LOCALE_SUPPORT - return '\0'; -#else - struct lconv* lc = localeconv(); - return lc ? *(lc->decimal_point) : '\0'; -#endif -} - -/// Converts a unicode code-point to UTF-8. -static inline String codePointToUTF8(unsigned int cp) { - String result; - - // based on description from http://en.wikipedia.org/wiki/UTF-8 - - if (cp <= 0x7f) { - result.resize(1); - result[0] = static_cast(cp); - } else if (cp <= 0x7FF) { - result.resize(2); - result[1] = static_cast(0x80 | (0x3f & cp)); - result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); - } else if (cp <= 0xFFFF) { - result.resize(3); - result[2] = static_cast(0x80 | (0x3f & cp)); - result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); - } else if (cp <= 0x10FFFF) { - result.resize(4); - result[3] = static_cast(0x80 | (0x3f & cp)); - result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); - result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); - } - - return result; -} - -enum { - /// Constant that specify the size of the buffer that must be passed to - /// uintToString. - uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 -}; - -// Defines a char buffer for use with uintToString(). -typedef char UIntToStringBuffer[uintToStringBufferSize]; - -/** Converts an unsigned integer to string. - * @param value Unsigned integer to convert to string - * @param current Input/Output string buffer. - * Must have at least uintToStringBufferSize chars free. - */ -static inline void uintToString(LargestUInt value, char*& current) { - *--current = 0; - do { - *--current = static_cast(value % 10U + static_cast('0')); - value /= 10; - } while (value != 0); -} - -/** Change ',' to '.' everywhere in buffer. - * - * We had a sophisticated way, but it did not work in WinCE. - * @see https://github.com/open-source-parsers/jsoncpp/pull/9 - */ -template Iter fixNumericLocale(Iter begin, Iter end) { - for (; begin != end; ++begin) { - if (*begin == ',') { - *begin = '.'; - } - } - return begin; -} - -template void fixNumericLocaleInput(Iter begin, Iter end) { - char decimalPoint = getDecimalPoint(); - if (decimalPoint == '\0' || decimalPoint == '.') { - return; - } - for (; begin != end; ++begin) { - if (*begin == '.') { - *begin = decimalPoint; - } - } -} - -/** - * Return iterator that would be the new end of the range [begin,end), if we - * were to delete zeros in the end of string, but not the last zero before '.'. - */ -template Iter fixZerosInTheEnd(Iter begin, Iter end) { - for (; begin != end; --end) { - if (*(end - 1) != '0') { - return end; - } - // Don't delete the last zero before the decimal point. - if (begin != (end - 1) && *(end - 2) == '.') { - return end; - } - } - return end; -} - -} // namespace Json - -#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_tool.h -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_reader.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors -// Copyright (C) 2016 InfoTeCS JSC. All rights reserved. -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include "json_tool.h" -#include -#include -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#if __cplusplus >= 201103L - -#if !defined(sscanf) -#define sscanf std::sscanf -#endif - -#endif //__cplusplus - -#if defined(_MSC_VER) -#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) -#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 -#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES -#endif //_MSC_VER - -#if defined(_MSC_VER) -// Disable warning about strdup being deprecated. -#pragma warning(disable : 4996) -#endif - -// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile -// time to change the stack limit -#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) -#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 -#endif - -static size_t const stackLimit_g = - JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() - -namespace Json { - -#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr CharReaderPtr; -#else -typedef std::unique_ptr CharReaderPtr; -#endif - -// Implementation of class Features -// //////////////////////////////// - -Features::Features() = default; - -Features Features::all() { return {}; } - -Features Features::strictMode() { - Features features; - features.allowComments_ = false; - features.strictRoot_ = true; - features.allowDroppedNullPlaceholders_ = false; - features.allowNumericKeys_ = false; - return features; -} - -// Implementation of class Reader -// //////////////////////////////// - -bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; -} - -// Class Reader -// ////////////////////////////////////////////////////////////////// - -Reader::Reader() - : errors_(), document_(), commentsBefore_(), features_(Features::all()) {} - -Reader::Reader(const Features& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(features), collectComments_() { -} - -bool Reader::parse(const std::string& document, - Value& root, - bool collectComments) { - document_.assign(document.begin(), document.end()); - const char* begin = document_.c_str(); - const char* end = begin + document_.length(); - return parse(begin, end, root, collectComments); -} - -bool Reader::parse(std::istream& is, Value& root, bool collectComments) { - // std::istream_iterator begin(is); - // std::istream_iterator end; - // Those would allow streamed input from a file, if parse() were a - // template function. - - // Since String is reference-counted, this at least does not - // create an extra copy. - String doc; - std::getline(is, doc, (char)EOF); - return parse(doc.data(), doc.data() + doc.size(), root, collectComments); -} - -bool Reader::parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments) { - if (!features_.allowComments_) { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = nullptr; - lastValue_ = nullptr; - commentsBefore_.clear(); - errors_.clear(); - while (!nodes_.empty()) - nodes_.pop(); - nodes_.push(&root); - - bool successful = readValue(); - Token token; - skipCommentTokens(token); - if (collectComments_ && !commentsBefore_.empty()) - root.setComment(commentsBefore_, commentAfter); - if (features_.strictRoot_) { - if (!root.isArray() && !root.isObject()) { - // Set error location to start of doc, ideally should be first token found - // in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( - "A valid JSON document must be either an array or an object value.", - token); - return false; - } - } - return successful; -} - -bool Reader::readValue() { - // readValue() may call itself only if it calls readObject() or ReadArray(). - // These methods execute nodes_.push() just before and nodes_.pop)() just - // after calling readValue(). parse() executes one nodes_.push(), so > instead - // of >=. - if (nodes_.size() > stackLimit_g) - throwRuntimeError("Exceeded stackLimit in readValue()."); - - Token token; - skipCommentTokens(token); - bool successful = true; - - if (collectComments_ && !commentsBefore_.empty()) { - currentValue().setComment(commentsBefore_, commentBefore); - commentsBefore_.clear(); - } - - switch (token.type_) { - case tokenObjectBegin: - successful = readObject(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenArrayBegin: - successful = readArray(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenNumber: - successful = decodeNumber(token); - break; - case tokenString: - successful = decodeString(token); - break; - case tokenTrue: { - Value v(true); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenFalse: { - Value v(false); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNull: { - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenArraySeparator: - case tokenObjectEnd: - case tokenArrayEnd: - if (features_.allowDroppedNullPlaceholders_) { - // "Un-read" the current token and mark the current value as a null - // token. - current_--; - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(current_ - begin_ - 1); - currentValue().setOffsetLimit(current_ - begin_); - break; - } // Else, fall through... - default: - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return addError("Syntax error: value, object or array expected.", token); - } - - if (collectComments_) { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - -void Reader::skipCommentTokens(Token& token) { - if (features_.allowComments_) { - do { - readToken(token); - } while (token.type_ == tokenComment); - } else { - readToken(token); - } -} - -bool Reader::readToken(Token& token) { - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch (c) { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - token.type_ = tokenNumber; - readNumber(); - break; - case 't': - token.type_ = tokenTrue; - ok = match("rue", 3); - break; - case 'f': - token.type_ = tokenFalse; - ok = match("alse", 4); - break; - case 'n': - token.type_ = tokenNull; - ok = match("ull", 3); - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if (!ok) - token.type_ = tokenError; - token.end_ = current_; - return true; -} - -void Reader::skipSpaces() { - while (current_ != end_) { - Char c = *current_; - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') - ++current_; - else - break; - } -} - -bool Reader::match(Location pattern, int patternLength) { - if (end_ - current_ < patternLength) - return false; - int index = patternLength; - while (index--) - if (current_[index] != pattern[index]) - return false; - current_ += patternLength; - return true; -} - -bool Reader::readComment() { - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if (c == '*') - successful = readCStyleComment(); - else if (c == '/') - successful = readCppStyleComment(); - if (!successful) - return false; - - if (collectComments_) { - CommentPlacement placement = commentBefore; - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (c != '*' || !containsNewLine(commentBegin, current_)) - placement = commentAfterOnSameLine; - } - - addComment(commentBegin, current_, placement); - } - return true; -} - -String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { - String normalized; - normalized.reserve(static_cast(end - begin)); - Reader::Location current = begin; - while (current != end) { - char c = *current++; - if (c == '\r') { - if (current != end && *current == '\n') - // convert dos EOL - ++current; - // convert Mac EOL - normalized += '\n'; - } else { - normalized += c; - } - } - return normalized; -} - -void Reader::addComment(Location begin, - Location end, - CommentPlacement placement) { - assert(collectComments_); - const String& normalized = normalizeEOL(begin, end); - if (placement == commentAfterOnSameLine) { - assert(lastValue_ != nullptr); - lastValue_->setComment(normalized, placement); - } else { - commentsBefore_ += normalized; - } -} - -bool Reader::readCStyleComment() { - while ((current_ + 1) < end_) { - Char c = getNextChar(); - if (c == '*' && *current_ == '/') - break; - } - return getNextChar() == '/'; -} - -bool Reader::readCppStyleComment() { - while (current_ != end_) { - Char c = getNextChar(); - if (c == '\n') - break; - if (c == '\r') { - // Consume DOS EOL. It will be normalized in addComment. - if (current_ != end_ && *current_ == '\n') - getNextChar(); - // Break on Moc OS 9 EOL. - break; - } - } - return true; -} - -void Reader::readNumber() { - const char* p = current_; - char c = '0'; // stopgap for already consumed character - // integral part - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - // fractional part - if (c == '.') { - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - // exponential part - if (c == 'e' || c == 'E') { - c = (current_ = p) < end_ ? *p++ : '\0'; - if (c == '+' || c == '-') - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } -} - -bool Reader::readString() { - Char c = '\0'; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '"') - break; - } - return c == '"'; -} - -bool Reader::readObject(Token& token) { - Token tokenName; - String name; - Value init(objectValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - while (readToken(tokenName)) { - bool initialTokenOk = true; - while (tokenName.type_ == tokenComment && initialTokenOk) - initialTokenOk = readToken(tokenName); - if (!initialTokenOk) - break; - if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object - return true; - name.clear(); - if (tokenName.type_ == tokenString) { - if (!decodeString(tokenName, name)) - return recoverFromError(tokenObjectEnd); - } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { - Value numberName; - if (!decodeNumber(tokenName, numberName)) - return recoverFromError(tokenObjectEnd); - name = String(numberName.asCString()); - } else { - break; - } - - Token colon; - if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover("Missing ':' after object member name", colon, - tokenObjectEnd); - } - Value& value = currentValue()[name]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenObjectEnd); - - Token comma; - if (!readToken(comma) || - (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment)) { - return addErrorAndRecover("Missing ',' or '}' in object declaration", - comma, tokenObjectEnd); - } - bool finalizeTokenOk = true; - while (comma.type_ == tokenComment && finalizeTokenOk) - finalizeTokenOk = readToken(comma); - if (comma.type_ == tokenObjectEnd) - return true; - } - return addErrorAndRecover("Missing '}' or object member name", tokenName, - tokenObjectEnd); -} - -bool Reader::readArray(Token& token) { - Value init(arrayValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } - int index = 0; - for (;;) { - Value& value = currentValue()[index++]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenArrayEnd); - - Token currentToken; - // Accept Comment after last item in the array. - ok = readToken(currentToken); - while (currentToken.type_ == tokenComment && ok) { - ok = readToken(currentToken); - } - bool badTokenType = (currentToken.type_ != tokenArraySeparator && - currentToken.type_ != tokenArrayEnd); - if (!ok || badTokenType) { - return addErrorAndRecover("Missing ',' or ']' in array declaration", - currentToken, tokenArrayEnd); - } - if (currentToken.type_ == tokenArrayEnd) - break; - } - return true; -} - -bool Reader::decodeNumber(Token& token) { - Value decoded; - if (!decodeNumber(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeNumber(Token& token, Value& decoded) { - // Attempts to parse the number as an integer. If the number is - // larger than the maximum supported value of an integer then - // we decode the number as a double. - Location current = token.start_; - bool isNegative = *current == '-'; - if (isNegative) - ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of - // them. - Value::LargestUInt maxIntegerValue = - isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; - Value::LargestUInt value = 0; - while (current < token.end_) { - Char c = *current++; - if (c < '0' || c > '9') - return decodeDouble(token, decoded); - auto digit(static_cast(c - '0')); - if (value >= threshold) { - // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and - // c) it's small enough to fit in that rounding delta, we're okay. - // Otherwise treat this number as a double to avoid overflow. - if (value > threshold || current != token.end_ || - digit > maxIntegerValue % 10) { - return decodeDouble(token, decoded); - } - } - value = value * 10 + digit; - } - if (isNegative && value == maxIntegerValue) - decoded = Value::minLargestInt; - else if (isNegative) - decoded = -Value::LargestInt(value); - else if (value <= Value::LargestUInt(Value::maxInt)) - decoded = Value::LargestInt(value); - else - decoded = value; - return true; -} - -bool Reader::decodeDouble(Token& token) { - Value decoded; - if (!decodeDouble(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeDouble(Token& token, Value& decoded) { - double value = 0; - String buffer(token.start_, token.end_); - IStringStream is(buffer); - if (!(is >> value)) - return addError( - "'" + String(token.start_, token.end_) + "' is not a number.", token); - decoded = value; - return true; -} - -bool Reader::decodeString(Token& token) { - String decoded_string; - if (!decodeString(token, decoded_string)) - return false; - Value decoded(decoded_string); - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeString(Token& token, String& decoded) { - decoded.reserve(static_cast(token.end_ - token.start_ - 2)); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while (current != end) { - Char c = *current++; - if (c == '"') - break; - else if (c == '\\') { - if (current == end) - return addError("Empty escape sequence in string", token, current); - Char escape = *current++; - switch (escape) { - case '"': - decoded += '"'; - break; - case '/': - decoded += '/'; - break; - case '\\': - decoded += '\\'; - break; - case 'b': - decoded += '\b'; - break; - case 'f': - decoded += '\f'; - break; - case 'n': - decoded += '\n'; - break; - case 'r': - decoded += '\r'; - break; - case 't': - decoded += '\t'; - break; - case 'u': { - unsigned int unicode; - if (!decodeUnicodeCodePoint(token, current, end, unicode)) - return false; - decoded += codePointToUTF8(unicode); - } break; - default: - return addError("Bad escape sequence in string", token, current); - } - } else { - decoded += c; - } - } - return true; -} - -bool Reader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { - - if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) { - // surrogate pairs - if (end - current < 6) - return addError( - "additional six characters expected to parse unicode surrogate pair.", - token, current); - if (*(current++) == '\\' && *(current++) == 'u') { - unsigned int surrogatePair; - if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } else - return false; - } else - return addError("expecting another \\u token to begin the second half of " - "a unicode surrogate pair", - token, current); - } - return true; -} - -bool Reader::decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& ret_unicode) { - if (end - current < 4) - return addError( - "Bad unicode escape sequence in string: four digits expected.", token, - current); - int unicode = 0; - for (int index = 0; index < 4; ++index) { - Char c = *current++; - unicode *= 16; - if (c >= '0' && c <= '9') - unicode += c - '0'; - else if (c >= 'a' && c <= 'f') - unicode += c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - unicode += c - 'A' + 10; - else - return addError( - "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, current); - } - ret_unicode = static_cast(unicode); - return true; -} - -bool Reader::addError(const String& message, Token& token, Location extra) { - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back(info); - return false; -} - -bool Reader::recoverFromError(TokenType skipUntilToken) { - size_t const errorCount = errors_.size(); - Token skip; - for (;;) { - if (!readToken(skip)) - errors_.resize(errorCount); // discard errors caused by recovery - if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) - break; - } - errors_.resize(errorCount); - return false; -} - -bool Reader::addErrorAndRecover(const String& message, - Token& token, - TokenType skipUntilToken) { - addError(message, token); - return recoverFromError(skipUntilToken); -} - -Value& Reader::currentValue() { return *(nodes_.top()); } - -Reader::Char Reader::getNextChar() { - if (current_ == end_) - return 0; - return *current_++; -} - -void Reader::getLocationLineAndColumn(Location location, - int& line, - int& column) const { - Location current = begin_; - Location lastLineStart = current; - line = 0; - while (current < location && current != end_) { - Char c = *current++; - if (c == '\r') { - if (*current == '\n') - ++current; - lastLineStart = current; - ++line; - } else if (c == '\n') { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - -String Reader::getLocationLineAndColumn(Location location) const { - int line, column; - getLocationLineAndColumn(location, line, column); - char buffer[18 + 16 + 16 + 1]; - jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); - return buffer; -} - -// Deprecated. Preserved for backward compatibility -String Reader::getFormatedErrorMessages() const { - return getFormattedErrorMessages(); -} - -String Reader::getFormattedErrorMessages() const { - String formattedMessage; - for (const auto& error : errors_) { - formattedMessage += - "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if (error.extra_) - formattedMessage += - "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; - } - return formattedMessage; -} - -std::vector Reader::getStructuredErrors() const { - std::vector allErrors; - for (const auto& error : errors_) { - Reader::StructuredError structured; - structured.offset_start = error.token_.start_ - begin_; - structured.offset_limit = error.token_.end_ - begin_; - structured.message = error.message_; - allErrors.push_back(structured); - } - return allErrors; -} - -bool Reader::pushError(const Value& value, const String& message) { - ptrdiff_t const length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = nullptr; - errors_.push_back(info); - return true; -} - -bool Reader::pushError(const Value& value, - const String& message, - const Value& extra) { - ptrdiff_t const length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length || - extra.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = begin_ + extra.getOffsetStart(); - errors_.push_back(info); - return true; -} - -bool Reader::good() const { return errors_.empty(); } - -// exact copy of Features -class OurFeatures { -public: - static OurFeatures all(); - bool allowComments_; - bool strictRoot_; - bool allowDroppedNullPlaceholders_; - bool allowNumericKeys_; - bool allowSingleQuotes_; - bool failIfExtra_; - bool rejectDupKeys_; - bool allowSpecialFloats_; - size_t stackLimit_; -}; // OurFeatures - -// exact copy of Implementation of class Features -// //////////////////////////////// - -OurFeatures OurFeatures::all() { return {}; } - -// Implementation of class Reader -// //////////////////////////////// - -// exact copy of Reader, renamed to OurReader -class OurReader { -public: - typedef char Char; - typedef const Char* Location; - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - String message; - }; - - OurReader(OurFeatures const& features); - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments = true); - String getFormattedErrorMessages() const; - std::vector getStructuredErrors() const; - bool pushError(const Value& value, const String& message); - bool pushError(const Value& value, const String& message, const Value& extra); - bool good() const; - -private: - OurReader(OurReader const&); // no impl - void operator=(OurReader const&); // no impl - - enum TokenType { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenNaN, - tokenPosInf, - tokenNegInf, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo { - public: - Token token_; - String message_; - Location extra_; - }; - - typedef std::deque Errors; - - bool readToken(Token& token); - void skipSpaces(); - bool match(Location pattern, int patternLength); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - bool readStringSingleQuote(); - bool readNumber(bool checkInf); - bool readValue(); - bool readObject(Token& token); - bool readArray(Token& token); - bool decodeNumber(Token& token); - bool decodeNumber(Token& token, Value& decoded); - bool decodeString(Token& token); - bool decodeString(Token& token, String& decoded); - bool decodeDouble(Token& token); - bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const String& message, Token& token, Location extra = nullptr); - bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const String& message, - Token& token, - TokenType skipUntilToken); - void skipUntilSpace(); - Value& currentValue(); - Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - String getLocationLineAndColumn(Location location) const; - void addComment(Location begin, Location end, CommentPlacement placement); - void skipCommentTokens(Token& token); - - static String normalizeEOL(Location begin, Location end); - static bool containsNewLine(Location begin, Location end); - - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - String document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value* lastValue_; - String commentsBefore_; - - OurFeatures const features_; - bool collectComments_; -}; // OurReader - -// complete copy of Read impl, for OurReader - -bool OurReader::containsNewLine(OurReader::Location begin, - OurReader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; -} - -OurReader::OurReader(OurFeatures const& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(features), collectComments_() { -} - -bool OurReader::parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments) { - if (!features_.allowComments_) { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = nullptr; - lastValue_ = nullptr; - commentsBefore_.clear(); - errors_.clear(); - while (!nodes_.empty()) - nodes_.pop(); - nodes_.push(&root); - - bool successful = readValue(); - Token token; - skipCommentTokens(token); - if (features_.failIfExtra_) { - if ((features_.strictRoot_ || token.type_ != tokenError) && - token.type_ != tokenEndOfStream) { - addError("Extra non-whitespace after JSON value.", token); - return false; - } - } - if (collectComments_ && !commentsBefore_.empty()) - root.setComment(commentsBefore_, commentAfter); - if (features_.strictRoot_) { - if (!root.isArray() && !root.isObject()) { - // Set error location to start of doc, ideally should be first token found - // in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( - "A valid JSON document must be either an array or an object value.", - token); - return false; - } - } - return successful; -} - -bool OurReader::readValue() { - // To preserve the old behaviour we cast size_t to int. - if (nodes_.size() > features_.stackLimit_) - throwRuntimeError("Exceeded stackLimit in readValue()."); - Token token; - skipCommentTokens(token); - bool successful = true; - - if (collectComments_ && !commentsBefore_.empty()) { - currentValue().setComment(commentsBefore_, commentBefore); - commentsBefore_.clear(); - } - - switch (token.type_) { - case tokenObjectBegin: - successful = readObject(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenArrayBegin: - successful = readArray(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenNumber: - successful = decodeNumber(token); - break; - case tokenString: - successful = decodeString(token); - break; - case tokenTrue: { - Value v(true); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenFalse: { - Value v(false); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNull: { - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNaN: { - Value v(std::numeric_limits::quiet_NaN()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenPosInf: { - Value v(std::numeric_limits::infinity()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNegInf: { - Value v(-std::numeric_limits::infinity()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenArraySeparator: - case tokenObjectEnd: - case tokenArrayEnd: - if (features_.allowDroppedNullPlaceholders_) { - // "Un-read" the current token and mark the current value as a null - // token. - current_--; - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(current_ - begin_ - 1); - currentValue().setOffsetLimit(current_ - begin_); - break; - } // else, fall through ... - default: - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return addError("Syntax error: value, object or array expected.", token); - } - - if (collectComments_) { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - -void OurReader::skipCommentTokens(Token& token) { - if (features_.allowComments_) { - do { - readToken(token); - } while (token.type_ == tokenComment); - } else { - readToken(token); - } -} - -bool OurReader::readToken(Token& token) { - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch (c) { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '\'': - if (features_.allowSingleQuotes_) { - token.type_ = tokenString; - ok = readStringSingleQuote(); - break; - } // else fall through - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - token.type_ = tokenNumber; - readNumber(false); - break; - case '-': - if (readNumber(true)) { - token.type_ = tokenNumber; - } else { - token.type_ = tokenNegInf; - ok = features_.allowSpecialFloats_ && match("nfinity", 7); - } - break; - case 't': - token.type_ = tokenTrue; - ok = match("rue", 3); - break; - case 'f': - token.type_ = tokenFalse; - ok = match("alse", 4); - break; - case 'n': - token.type_ = tokenNull; - ok = match("ull", 3); - break; - case 'N': - if (features_.allowSpecialFloats_) { - token.type_ = tokenNaN; - ok = match("aN", 2); - } else { - ok = false; - } - break; - case 'I': - if (features_.allowSpecialFloats_) { - token.type_ = tokenPosInf; - ok = match("nfinity", 7); - } else { - ok = false; - } - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if (!ok) - token.type_ = tokenError; - token.end_ = current_; - return true; -} - -void OurReader::skipSpaces() { - while (current_ != end_) { - Char c = *current_; - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') - ++current_; - else - break; - } -} - -bool OurReader::match(Location pattern, int patternLength) { - if (end_ - current_ < patternLength) - return false; - int index = patternLength; - while (index--) - if (current_[index] != pattern[index]) - return false; - current_ += patternLength; - return true; -} - -bool OurReader::readComment() { - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if (c == '*') - successful = readCStyleComment(); - else if (c == '/') - successful = readCppStyleComment(); - if (!successful) - return false; - - if (collectComments_) { - CommentPlacement placement = commentBefore; - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (c != '*' || !containsNewLine(commentBegin, current_)) - placement = commentAfterOnSameLine; - } - - addComment(commentBegin, current_, placement); - } - return true; -} - -String OurReader::normalizeEOL(OurReader::Location begin, - OurReader::Location end) { - String normalized; - normalized.reserve(static_cast(end - begin)); - OurReader::Location current = begin; - while (current != end) { - char c = *current++; - if (c == '\r') { - if (current != end && *current == '\n') - // convert dos EOL - ++current; - // convert Mac EOL - normalized += '\n'; - } else { - normalized += c; - } - } - return normalized; -} - -void OurReader::addComment(Location begin, - Location end, - CommentPlacement placement) { - assert(collectComments_); - const String& normalized = normalizeEOL(begin, end); - if (placement == commentAfterOnSameLine) { - assert(lastValue_ != nullptr); - lastValue_->setComment(normalized, placement); - } else { - commentsBefore_ += normalized; - } -} - -bool OurReader::readCStyleComment() { - while ((current_ + 1) < end_) { - Char c = getNextChar(); - if (c == '*' && *current_ == '/') - break; - } - return getNextChar() == '/'; -} - -bool OurReader::readCppStyleComment() { - while (current_ != end_) { - Char c = getNextChar(); - if (c == '\n') - break; - if (c == '\r') { - // Consume DOS EOL. It will be normalized in addComment. - if (current_ != end_ && *current_ == '\n') - getNextChar(); - // Break on Moc OS 9 EOL. - break; - } - } - return true; -} - -bool OurReader::readNumber(bool checkInf) { - const char* p = current_; - if (checkInf && p != end_ && *p == 'I') { - current_ = ++p; - return false; - } - char c = '0'; // stopgap for already consumed character - // integral part - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - // fractional part - if (c == '.') { - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - // exponential part - if (c == 'e' || c == 'E') { - c = (current_ = p) < end_ ? *p++ : '\0'; - if (c == '+' || c == '-') - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - return true; -} -bool OurReader::readString() { - Char c = 0; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '"') - break; - } - return c == '"'; -} - -bool OurReader::readStringSingleQuote() { - Char c = 0; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '\'') - break; - } - return c == '\''; -} - -bool OurReader::readObject(Token& token) { - Token tokenName; - String name; - Value init(objectValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - while (readToken(tokenName)) { - bool initialTokenOk = true; - while (tokenName.type_ == tokenComment && initialTokenOk) - initialTokenOk = readToken(tokenName); - if (!initialTokenOk) - break; - if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object - return true; - name.clear(); - if (tokenName.type_ == tokenString) { - if (!decodeString(tokenName, name)) - return recoverFromError(tokenObjectEnd); - } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { - Value numberName; - if (!decodeNumber(tokenName, numberName)) - return recoverFromError(tokenObjectEnd); - name = numberName.asString(); - } else { - break; - } - - Token colon; - if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover("Missing ':' after object member name", colon, - tokenObjectEnd); - } - if (name.length() >= (1U << 30)) - throwRuntimeError("keylength >= 2^30"); - if (features_.rejectDupKeys_ && currentValue().isMember(name)) { - String msg = "Duplicate key: '" + name + "'"; - return addErrorAndRecover(msg, tokenName, tokenObjectEnd); - } - Value& value = currentValue()[name]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenObjectEnd); - - Token comma; - if (!readToken(comma) || - (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment)) { - return addErrorAndRecover("Missing ',' or '}' in object declaration", - comma, tokenObjectEnd); - } - bool finalizeTokenOk = true; - while (comma.type_ == tokenComment && finalizeTokenOk) - finalizeTokenOk = readToken(comma); - if (comma.type_ == tokenObjectEnd) - return true; - } - return addErrorAndRecover("Missing '}' or object member name", tokenName, - tokenObjectEnd); -} - -bool OurReader::readArray(Token& token) { - Value init(arrayValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } - int index = 0; - for (;;) { - Value& value = currentValue()[index++]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenArrayEnd); - - Token currentToken; - // Accept Comment after last item in the array. - ok = readToken(currentToken); - while (currentToken.type_ == tokenComment && ok) { - ok = readToken(currentToken); - } - bool badTokenType = (currentToken.type_ != tokenArraySeparator && - currentToken.type_ != tokenArrayEnd); - if (!ok || badTokenType) { - return addErrorAndRecover("Missing ',' or ']' in array declaration", - currentToken, tokenArrayEnd); - } - if (currentToken.type_ == tokenArrayEnd) - break; - } - return true; -} - -bool OurReader::decodeNumber(Token& token) { - Value decoded; - if (!decodeNumber(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeNumber(Token& token, Value& decoded) { - // Attempts to parse the number as an integer. If the number is - // larger than the maximum supported value of an integer then - // we decode the number as a double. - Location current = token.start_; - bool isNegative = *current == '-'; - if (isNegative) - ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of - // them. - Value::LargestUInt maxIntegerValue = - isNegative ? Value::LargestUInt(Value::minLargestInt) - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; - Value::LargestUInt value = 0; - while (current < token.end_) { - Char c = *current++; - if (c < '0' || c > '9') - return decodeDouble(token, decoded); - auto digit(static_cast(c - '0')); - if (value >= threshold) { - // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and - // c) it's small enough to fit in that rounding delta, we're okay. - // Otherwise treat this number as a double to avoid overflow. - if (value > threshold || current != token.end_ || - digit > maxIntegerValue % 10) { - return decodeDouble(token, decoded); - } - } - value = value * 10 + digit; - } - if (isNegative) - decoded = -Value::LargestInt(value); - else if (value <= Value::LargestUInt(Value::maxInt)) - decoded = Value::LargestInt(value); - else - decoded = value; - return true; -} - -bool OurReader::decodeDouble(Token& token) { - Value decoded; - if (!decodeDouble(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeDouble(Token& token, Value& decoded) { - double value = 0; - const int bufferSize = 32; - int count; - ptrdiff_t const length = token.end_ - token.start_; - - // Sanity check to avoid buffer overflow exploits. - if (length < 0) { - return addError("Unable to parse token length", token); - } - auto const ulength = static_cast(length); - - // Avoid using a string constant for the format control string given to - // sscanf, as this can cause hard to debug crashes on OS X. See here for more - // info: - // - // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html - char format[] = "%lf"; - - if (length <= bufferSize) { - Char buffer[bufferSize + 1]; - memcpy(buffer, token.start_, ulength); - buffer[length] = 0; - fixNumericLocaleInput(buffer, buffer + length); - count = sscanf(buffer, format, &value); - } else { - String buffer(token.start_, token.end_); - count = sscanf(buffer.c_str(), format, &value); - } - - if (count != 1) - return addError( - "'" + String(token.start_, token.end_) + "' is not a number.", token); - decoded = value; - return true; -} - -bool OurReader::decodeString(Token& token) { - String decoded_string; - if (!decodeString(token, decoded_string)) - return false; - Value decoded(decoded_string); - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeString(Token& token, String& decoded) { - decoded.reserve(static_cast(token.end_ - token.start_ - 2)); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while (current != end) { - Char c = *current++; - if (c == '"') - break; - else if (c == '\\') { - if (current == end) - return addError("Empty escape sequence in string", token, current); - Char escape = *current++; - switch (escape) { - case '"': - decoded += '"'; - break; - case '/': - decoded += '/'; - break; - case '\\': - decoded += '\\'; - break; - case 'b': - decoded += '\b'; - break; - case 'f': - decoded += '\f'; - break; - case 'n': - decoded += '\n'; - break; - case 'r': - decoded += '\r'; - break; - case 't': - decoded += '\t'; - break; - case 'u': { - unsigned int unicode; - if (!decodeUnicodeCodePoint(token, current, end, unicode)) - return false; - decoded += codePointToUTF8(unicode); - } break; - default: - return addError("Bad escape sequence in string", token, current); - } - } else { - decoded += c; - } - } - return true; -} - -bool OurReader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { - - if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) { - // surrogate pairs - if (end - current < 6) - return addError( - "additional six characters expected to parse unicode surrogate pair.", - token, current); - if (*(current++) == '\\' && *(current++) == 'u') { - unsigned int surrogatePair; - if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } else - return false; - } else - return addError("expecting another \\u token to begin the second half of " - "a unicode surrogate pair", - token, current); - } - return true; -} - -bool OurReader::decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& ret_unicode) { - if (end - current < 4) - return addError( - "Bad unicode escape sequence in string: four digits expected.", token, - current); - int unicode = 0; - for (int index = 0; index < 4; ++index) { - Char c = *current++; - unicode *= 16; - if (c >= '0' && c <= '9') - unicode += c - '0'; - else if (c >= 'a' && c <= 'f') - unicode += c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - unicode += c - 'A' + 10; - else - return addError( - "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, current); - } - ret_unicode = static_cast(unicode); - return true; -} - -bool OurReader::addError(const String& message, Token& token, Location extra) { - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back(info); - return false; -} - -bool OurReader::recoverFromError(TokenType skipUntilToken) { - size_t errorCount = errors_.size(); - Token skip; - for (;;) { - if (!readToken(skip)) - errors_.resize(errorCount); // discard errors caused by recovery - if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) - break; - } - errors_.resize(errorCount); - return false; -} - -bool OurReader::addErrorAndRecover(const String& message, - Token& token, - TokenType skipUntilToken) { - addError(message, token); - return recoverFromError(skipUntilToken); -} - -Value& OurReader::currentValue() { return *(nodes_.top()); } - -OurReader::Char OurReader::getNextChar() { - if (current_ == end_) - return 0; - return *current_++; -} - -void OurReader::getLocationLineAndColumn(Location location, - int& line, - int& column) const { - Location current = begin_; - Location lastLineStart = current; - line = 0; - while (current < location && current != end_) { - Char c = *current++; - if (c == '\r') { - if (*current == '\n') - ++current; - lastLineStart = current; - ++line; - } else if (c == '\n') { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - -String OurReader::getLocationLineAndColumn(Location location) const { - int line, column; - getLocationLineAndColumn(location, line, column); - char buffer[18 + 16 + 16 + 1]; - jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); - return buffer; -} - -String OurReader::getFormattedErrorMessages() const { - String formattedMessage; - for (const auto& error : errors_) { - formattedMessage += - "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if (error.extra_) - formattedMessage += - "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; - } - return formattedMessage; -} - -std::vector OurReader::getStructuredErrors() const { - std::vector allErrors; - for (const auto& error : errors_) { - OurReader::StructuredError structured; - structured.offset_start = error.token_.start_ - begin_; - structured.offset_limit = error.token_.end_ - begin_; - structured.message = error.message_; - allErrors.push_back(structured); - } - return allErrors; -} - -bool OurReader::pushError(const Value& value, const String& message) { - ptrdiff_t length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = nullptr; - errors_.push_back(info); - return true; -} - -bool OurReader::pushError(const Value& value, - const String& message, - const Value& extra) { - ptrdiff_t length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length || - extra.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = begin_ + extra.getOffsetStart(); - errors_.push_back(info); - return true; -} - -bool OurReader::good() const { return errors_.empty(); } - -class OurCharReader : public CharReader { - bool const collectComments_; - OurReader reader_; - -public: - OurCharReader(bool collectComments, OurFeatures const& features) - : collectComments_(collectComments), reader_(features) {} - bool parse(char const* beginDoc, - char const* endDoc, - Value* root, - String* errs) override { - bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); - if (errs) { - *errs = reader_.getFormattedErrorMessages(); - } - return ok; - } -}; - -CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } -CharReaderBuilder::~CharReaderBuilder() = default; -CharReader* CharReaderBuilder::newCharReader() const { - bool collectComments = settings_["collectComments"].asBool(); - OurFeatures features = OurFeatures::all(); - features.allowComments_ = settings_["allowComments"].asBool(); - features.strictRoot_ = settings_["strictRoot"].asBool(); - features.allowDroppedNullPlaceholders_ = - settings_["allowDroppedNullPlaceholders"].asBool(); - features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); - features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); -#if defined(JSON_HAS_INT64) - features.stackLimit_ = settings_["stackLimit"].asUInt64(); -#else - features.stackLimit_ = settings_["stackLimit"].asUInt(); -#endif - features.failIfExtra_ = settings_["failIfExtra"].asBool(); - features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); - features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); - return new OurCharReader(collectComments, features); -} -static void getValidReaderKeys(std::set* valid_keys) { - valid_keys->clear(); - valid_keys->insert("collectComments"); - valid_keys->insert("allowComments"); - valid_keys->insert("strictRoot"); - valid_keys->insert("allowDroppedNullPlaceholders"); - valid_keys->insert("allowNumericKeys"); - valid_keys->insert("allowSingleQuotes"); - valid_keys->insert("stackLimit"); - valid_keys->insert("failIfExtra"); - valid_keys->insert("rejectDupKeys"); - valid_keys->insert("allowSpecialFloats"); -} -bool CharReaderBuilder::validate(Json::Value* invalid) const { - Json::Value my_invalid; - if (!invalid) - invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set valid_keys; - getValidReaderKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - String const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } - } - return inv.empty(); -} -Value& CharReaderBuilder::operator[](const String& key) { - return settings_[key]; -} -// static -void CharReaderBuilder::strictMode(Json::Value* settings) { - //! [CharReaderBuilderStrictMode] - (*settings)["allowComments"] = false; - (*settings)["strictRoot"] = true; - (*settings)["allowDroppedNullPlaceholders"] = false; - (*settings)["allowNumericKeys"] = false; - (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; - (*settings)["failIfExtra"] = true; - (*settings)["rejectDupKeys"] = true; - (*settings)["allowSpecialFloats"] = false; - //! [CharReaderBuilderStrictMode] -} -// static -void CharReaderBuilder::setDefaults(Json::Value* settings) { - //! [CharReaderBuilderDefaults] - (*settings)["collectComments"] = true; - (*settings)["allowComments"] = true; - (*settings)["strictRoot"] = false; - (*settings)["allowDroppedNullPlaceholders"] = false; - (*settings)["allowNumericKeys"] = false; - (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; - (*settings)["failIfExtra"] = false; - (*settings)["rejectDupKeys"] = false; - (*settings)["allowSpecialFloats"] = false; - //! [CharReaderBuilderDefaults] -} - -////////////////////////////////// -// global functions - -bool parseFromStream(CharReader::Factory const& fact, - IStream& sin, - Value* root, - String* errs) { - OStringStream ssin; - ssin << sin.rdbuf(); - String doc = ssin.str(); - char const* begin = doc.data(); - char const* end = begin + doc.size(); - // Note that we do not actually need a null-terminator. - CharReaderPtr const reader(fact.newCharReader()); - return reader->parse(begin, end, root, errs); -} - -IStream& operator>>(IStream& sin, Value& root) { - CharReaderBuilder b; - String errs; - bool ok = parseFromStream(b, sin, &root, &errs); - if (!ok) { - throwRuntimeError(errs); - } - return sin; -} - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_reader.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_valueiterator.inl -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -// included by json_value.cpp - -namespace Json { - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIteratorBase -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIteratorBase::ValueIteratorBase() : current_() {} - -ValueIteratorBase::ValueIteratorBase( - const Value::ObjectValues::iterator& current) - : current_(current), isNull_(false) {} - -Value& ValueIteratorBase::deref() const { return current_->second; } - -void ValueIteratorBase::increment() { ++current_; } - -void ValueIteratorBase::decrement() { --current_; } - -ValueIteratorBase::difference_type -ValueIteratorBase::computeDistance(const SelfType& other) const { -#ifdef JSON_USE_CPPTL_SMALLMAP - return other.current_ - current_; -#else - // Iterator for null value are initialized using the default - // constructor, which initialize current_ to the default - // std::map::iterator. As begin() and end() are two instance - // of the default std::map::iterator, they can not be compared. - // To allow this, we handle this comparison specifically. - if (isNull_ && other.isNull_) { - return 0; - } - - // Usage of std::distance is not portable (does not compile with Sun Studio 12 - // RogueWave STL, - // which is the one used by default). - // Using a portable hand-made version for non random iterator instead: - // return difference_type( std::distance( current_, other.current_ ) ); - difference_type myDistance = 0; - for (Value::ObjectValues::iterator it = current_; it != other.current_; - ++it) { - ++myDistance; - } - return myDistance; -#endif -} - -bool ValueIteratorBase::isEqual(const SelfType& other) const { - if (isNull_) { - return other.isNull_; - } - return current_ == other.current_; -} - -void ValueIteratorBase::copy(const SelfType& other) { - current_ = other.current_; - isNull_ = other.isNull_; -} - -Value ValueIteratorBase::key() const { - const Value::CZString czstring = (*current_).first; - if (czstring.data()) { - if (czstring.isStaticString()) - return Value(StaticString(czstring.data())); - return Value(czstring.data(), czstring.data() + czstring.length()); - } - return Value(czstring.index()); -} - -UInt ValueIteratorBase::index() const { - const Value::CZString czstring = (*current_).first; - if (!czstring.data()) - return czstring.index(); - return Value::UInt(-1); -} - -String ValueIteratorBase::name() const { - char const* keey; - char const* end; - keey = memberName(&end); - if (!keey) - return String(); - return String(keey, end); -} - -char const* ValueIteratorBase::memberName() const { - const char* cname = (*current_).first.data(); - return cname ? cname : ""; -} - -char const* ValueIteratorBase::memberName(char const** end) const { - const char* cname = (*current_).first.data(); - if (!cname) { - *end = nullptr; - return nullptr; - } - *end = cname + (*current_).first.length(); - return cname; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueConstIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueConstIterator::ValueConstIterator() = default; - -ValueConstIterator::ValueConstIterator( - const Value::ObjectValues::iterator& current) - : ValueIteratorBase(current) {} - -ValueConstIterator::ValueConstIterator(ValueIterator const& other) - : ValueIteratorBase(other) {} - -ValueConstIterator& ValueConstIterator:: -operator=(const ValueIteratorBase& other) { - copy(other); - return *this; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIterator::ValueIterator() = default; - -ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) - : ValueIteratorBase(current) {} - -ValueIterator::ValueIterator(const ValueConstIterator& other) - : ValueIteratorBase(other) { - throwRuntimeError("ConstIterator to Iterator should never be allowed."); -} - -ValueIterator::ValueIterator(const ValueIterator& other) = default; - -ValueIterator& ValueIterator::operator=(const SelfType& other) { - copy(other); - return *this; -} - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_valueiterator.inl -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_value.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#ifdef JSON_USE_CPPTL -#include -#endif -#include // min() -#include // size_t - -// Provide implementation equivalent of std::snprintf for older _MSC compilers -#if defined(_MSC_VER) && _MSC_VER < 1900 -#include -static int msvc_pre1900_c99_vsnprintf(char* outBuf, - size_t size, - const char* format, - va_list ap) { - int count = -1; - if (size != 0) - count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); - if (count == -1) - count = _vscprintf(format, ap); - return count; -} - -int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, - size_t size, - const char* format, - ...) { - va_list ap; - va_start(ap, format); - const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); - va_end(ap); - return count; -} -#endif - -// Disable warning C4702 : unreachable code -#if defined(_MSC_VER) -#pragma warning(disable : 4702) -#endif - -#define JSON_ASSERT_UNREACHABLE assert(false) - -namespace Json { - -// This is a walkaround to avoid the static initialization of Value::null. -// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of -// 8 (instead of 4) as a bit of future-proofing. -#if defined(__ARMEL__) -#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) -#else -#define ALIGNAS(byte_alignment) -#endif -// static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; -// const unsigned char& kNullRef = kNull[0]; -// const Value& Value::null = reinterpret_cast(kNullRef); -// const Value& Value::nullRef = null; - -// static -Value const& Value::nullSingleton() { - static Value const nullStatic; - return nullStatic; -} - -// for backwards compatibility, we'll leave these global references around, but -// DO NOT use them in JSONCPP library code any more! -Value const& Value::null = Value::nullSingleton(); -Value const& Value::nullRef = Value::nullSingleton(); - -const Int Value::minInt = Int(~(UInt(-1) / 2)); -const Int Value::maxInt = Int(UInt(-1) / 2); -const UInt Value::maxUInt = UInt(-1); -#if defined(JSON_HAS_INT64) -const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); -const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); -const UInt64 Value::maxUInt64 = UInt64(-1); -// The constant is hard-coded because some compiler have trouble -// converting Value::maxUInt64 to a double correctly (AIX/xlC). -// Assumes that UInt64 is a 64 bits integer. -static const double maxUInt64AsDouble = 18446744073709551615.0; -#endif // defined(JSON_HAS_INT64) -const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); -const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); -const LargestUInt Value::maxLargestUInt = LargestUInt(-1); - -const UInt Value::defaultRealPrecision = 17; - -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -template -static inline bool InRange(double d, T min, U max) { - // The casts can lose precision, but we are looking only for - // an approximate range. Might fail on edge cases though. ~cdunn - // return d >= static_cast(min) && d <= static_cast(max); - return d >= min && d <= max; -} -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -static inline double integerToDouble(Json::UInt64 value) { - return static_cast(Int64(value / 2)) * 2.0 + - static_cast(Int64(value & 1)); -} - -template static inline double integerToDouble(T value) { - return static_cast(value); -} - -template -static inline bool InRange(double d, T min, U max) { - return d >= integerToDouble(min) && d <= integerToDouble(max); -} -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - -/** Duplicates the specified string value. - * @param value Pointer to the string to duplicate. Must be zero-terminated if - * length is "unknown". - * @param length Length of the value. if equals to unknown, then it will be - * computed using strlen(value). - * @return Pointer on the duplicate instance of string. - */ -static inline char* duplicateStringValue(const char* value, size_t length) { - // Avoid an integer overflow in the call to malloc below by limiting length - // to a sane value. - if (length >= static_cast(Value::maxInt)) - length = Value::maxInt - 1; - - char* newString = static_cast(malloc(length + 1)); - if (newString == nullptr) { - throwRuntimeError("in Json::Value::duplicateStringValue(): " - "Failed to allocate string value buffer"); - } - memcpy(newString, value, length); - newString[length] = 0; - return newString; -} - -/* Record the length as a prefix. - */ -static inline char* duplicateAndPrefixStringValue(const char* value, - unsigned int length) { - // Avoid an integer overflow in the call to malloc below by limiting length - // to a sane value. - JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - - sizeof(unsigned) - 1U, - "in Json::Value::duplicateAndPrefixStringValue(): " - "length too big for prefixing"); - unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; - char* newString = static_cast(malloc(actualLength)); - if (newString == nullptr) { - throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " - "Failed to allocate string value buffer"); - } - *reinterpret_cast(newString) = length; - memcpy(newString + sizeof(unsigned), value, length); - newString[actualLength - 1U] = - 0; // to avoid buffer over-run accidents by users later - return newString; -} -inline static void decodePrefixedString(bool isPrefixed, - char const* prefixed, - unsigned* length, - char const** value) { - if (!isPrefixed) { - *length = static_cast(strlen(prefixed)); - *value = prefixed; - } else { - *length = *reinterpret_cast(prefixed); - *value = prefixed + sizeof(unsigned); - } -} -/** Free the string duplicated by - * duplicateStringValue()/duplicateAndPrefixStringValue(). - */ -#if JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { - unsigned length = 0; - char const* valueDecoded; - decodePrefixedString(true, value, &length, &valueDecoded); - size_t const size = sizeof(unsigned) + length + 1U; - memset(value, 0, size); - free(value); -} -static inline void releaseStringValue(char* value, unsigned length) { - // length==0 => we allocated the strings memory - size_t size = (length == 0) ? strlen(value) : length; - memset(value, 0, size); - free(value); -} -#else // !JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { free(value); } -static inline void releaseStringValue(char* value, unsigned) { free(value); } -#endif // JSONCPP_USING_SECURE_MEMORY - -} // namespace Json - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ValueInternals... -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -#if !defined(JSON_IS_AMALGAMATION) - -#include "json_valueiterator.inl" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -Exception::Exception(String msg) : msg_(std::move(msg)) {} -Exception::~Exception() JSONCPP_NOEXCEPT {} -char const* Exception::what() const JSONCPP_NOEXCEPT { return msg_.c_str(); } -RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} -LogicError::LogicError(String const& msg) : Exception(msg) {} -JSONCPP_NORETURN void throwRuntimeError(String const& msg) { - throw RuntimeError(msg); -} -JSONCPP_NORETURN void throwLogicError(String const& msg) { - throw LogicError(msg); -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -Value::CommentInfo::CommentInfo() = default; - -Value::CommentInfo::~CommentInfo() { - if (comment_) - releaseStringValue(comment_, 0u); -} - -void Value::CommentInfo::setComment(const char* text, size_t len) { - if (comment_) { - releaseStringValue(comment_, 0u); - comment_ = nullptr; - } - JSON_ASSERT(text != nullptr); - JSON_ASSERT_MESSAGE( - text[0] == '\0' || text[0] == '/', - "in Json::Value::setComment(): Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = duplicateStringValue(text, len); -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CZString -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -// Notes: policy_ indicates if the string was allocated when -// a string is stored. - -Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} - -Value::CZString::CZString(char const* str, - unsigned length, - DuplicationPolicy allocate) - : cstr_(str) { - // allocate != duplicate - storage_.policy_ = allocate & 0x3; - storage_.length_ = length & 0x3FFFFFFF; -} - -Value::CZString::CZString(const CZString& other) { - cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr - ? duplicateStringValue(other.cstr_, other.storage_.length_) - : other.cstr_); - storage_.policy_ = - static_cast( - other.cstr_ - ? (static_cast(other.storage_.policy_) == - noDuplication - ? noDuplication - : duplicate) - : static_cast(other.storage_.policy_)) & - 3U; - storage_.length_ = other.storage_.length_; -} - -#if JSON_HAS_RVALUE_REFERENCES -Value::CZString::CZString(CZString&& other) - : cstr_(other.cstr_), index_(other.index_) { - other.cstr_ = nullptr; -} -#endif - -Value::CZString::~CZString() { - if (cstr_ && storage_.policy_ == duplicate) { - releaseStringValue(const_cast(cstr_), - storage_.length_ + 1u); // +1 for null terminating - // character for sake of - // completeness but not actually - // necessary - } -} - -void Value::CZString::swap(CZString& other) { - std::swap(cstr_, other.cstr_); - std::swap(index_, other.index_); -} - -Value::CZString& Value::CZString::operator=(const CZString& other) { - cstr_ = other.cstr_; - index_ = other.index_; - return *this; -} - -#if JSON_HAS_RVALUE_REFERENCES -Value::CZString& Value::CZString::operator=(CZString&& other) { - cstr_ = other.cstr_; - index_ = other.index_; - other.cstr_ = nullptr; - return *this; -} -#endif - -bool Value::CZString::operator<(const CZString& other) const { - if (!cstr_) - return index_ < other.index_; - // return strcmp(cstr_, other.cstr_) < 0; - // Assume both are strings. - unsigned this_len = this->storage_.length_; - unsigned other_len = other.storage_.length_; - unsigned min_len = std::min(this_len, other_len); - JSON_ASSERT(this->cstr_ && other.cstr_); - int comp = memcmp(this->cstr_, other.cstr_, min_len); - if (comp < 0) - return true; - if (comp > 0) - return false; - return (this_len < other_len); -} - -bool Value::CZString::operator==(const CZString& other) const { - if (!cstr_) - return index_ == other.index_; - // return strcmp(cstr_, other.cstr_) == 0; - // Assume both are strings. - unsigned this_len = this->storage_.length_; - unsigned other_len = other.storage_.length_; - if (this_len != other_len) - return false; - JSON_ASSERT(this->cstr_ && other.cstr_); - int comp = memcmp(this->cstr_, other.cstr_, this_len); - return comp == 0; -} - -ArrayIndex Value::CZString::index() const { return index_; } - -// const char* Value::CZString::c_str() const { return cstr_; } -const char* Value::CZString::data() const { return cstr_; } -unsigned Value::CZString::length() const { return storage_.length_; } -bool Value::CZString::isStaticString() const { - return storage_.policy_ == noDuplication; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::Value -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/*! \internal Default constructor initialization must be equivalent to: - * memset( this, 0, sizeof(Value) ) - * This optimization is used in ValueInternalMap fast allocator. - */ -Value::Value(ValueType type) { - static char const emptyString[] = ""; - initBasic(type); - switch (type) { - case nullValue: - break; - case intValue: - case uintValue: - value_.int_ = 0; - break; - case realValue: - value_.real_ = 0.0; - break; - case stringValue: - // allocated_ == false, so this is safe. - value_.string_ = const_cast(static_cast(emptyString)); - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(); - break; - case booleanValue: - value_.bool_ = false; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -Value::Value(Int value) { - initBasic(intValue); - value_.int_ = value; -} - -Value::Value(UInt value) { - initBasic(uintValue); - value_.uint_ = value; -} -#if defined(JSON_HAS_INT64) -Value::Value(Int64 value) { - initBasic(intValue); - value_.int_ = value; -} -Value::Value(UInt64 value) { - initBasic(uintValue); - value_.uint_ = value; -} -#endif // defined(JSON_HAS_INT64) - -Value::Value(double value) { - initBasic(realValue); - value_.real_ = value; -} - -Value::Value(const char* value) { - initBasic(stringValue, true); - JSON_ASSERT_MESSAGE(value != nullptr, - "Null Value Passed to Value Constructor"); - value_.string_ = duplicateAndPrefixStringValue( - value, static_cast(strlen(value))); -} - -Value::Value(const char* begin, const char* end) { - initBasic(stringValue, true); - value_.string_ = - duplicateAndPrefixStringValue(begin, static_cast(end - begin)); -} - -Value::Value(const String& value) { - initBasic(stringValue, true); - value_.string_ = duplicateAndPrefixStringValue( - value.data(), static_cast(value.length())); -} - -Value::Value(const StaticString& value) { - initBasic(stringValue); - value_.string_ = const_cast(value.c_str()); -} - -#ifdef JSON_USE_CPPTL -Value::Value(const CppTL::ConstString& value) { - initBasic(stringValue, true); - value_.string_ = duplicateAndPrefixStringValue( - value, static_cast(value.length())); -} -#endif - -Value::Value(bool value) { - initBasic(booleanValue); - value_.bool_ = value; -} - -Value::Value(const Value& other) { - dupPayload(other); - dupMeta(other); -} - -Value::Value(Value&& other) { - initBasic(nullValue); - swap(other); -} - -Value::~Value() { - releasePayload(); - delete[] comments_; - value_.uint_ = 0; -} - -Value& Value::operator=(const Value& other) { - Value(other).swap(*this); - return *this; -} - -Value& Value::operator=(Value&& other) { - other.swap(*this); - return *this; -} - -void Value::swapPayload(Value& other) { - std::swap(bits_, other.bits_); - std::swap(value_, other.value_); -} - -void Value::copyPayload(const Value& other) { - releasePayload(); - dupPayload(other); -} - -void Value::swap(Value& other) { - swapPayload(other); - std::swap(comments_, other.comments_); - std::swap(start_, other.start_); - std::swap(limit_, other.limit_); -} - -void Value::copy(const Value& other) { - copyPayload(other); - delete[] comments_; - dupMeta(other); -} - -ValueType Value::type() const { - return static_cast(bits_.value_type_); -} - -int Value::compare(const Value& other) const { - if (*this < other) - return -1; - if (*this > other) - return 1; - return 0; -} - -bool Value::operator<(const Value& other) const { - int typeDelta = type() - other.type(); - if (typeDelta) - return typeDelta < 0 ? true : false; - switch (type()) { - case nullValue: - return false; - case intValue: - return value_.int_ < other.value_.int_; - case uintValue: - return value_.uint_ < other.value_.uint_; - case realValue: - return value_.real_ < other.value_.real_; - case booleanValue: - return value_.bool_ < other.value_.bool_; - case stringValue: { - if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { - if (other.value_.string_) - return true; - else - return false; - } - unsigned this_len; - unsigned other_len; - char const* this_str; - char const* other_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, - &other_str); - unsigned min_len = std::min(this_len, other_len); - JSON_ASSERT(this_str && other_str); - int comp = memcmp(this_str, other_str, min_len); - if (comp < 0) - return true; - if (comp > 0) - return false; - return (this_len < other_len); - } - case arrayValue: - case objectValue: { - int delta = int(value_.map_->size() - other.value_.map_->size()); - if (delta) - return delta < 0; - return (*value_.map_) < (*other.value_.map_); - } - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool Value::operator<=(const Value& other) const { return !(other < *this); } - -bool Value::operator>=(const Value& other) const { return !(*this < other); } - -bool Value::operator>(const Value& other) const { return other < *this; } - -bool Value::operator==(const Value& other) const { - if (type() != other.type()) - return false; - switch (type()) { - case nullValue: - return true; - case intValue: - return value_.int_ == other.value_.int_; - case uintValue: - return value_.uint_ == other.value_.uint_; - case realValue: - return value_.real_ == other.value_.real_; - case booleanValue: - return value_.bool_ == other.value_.bool_; - case stringValue: { - if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { - return (value_.string_ == other.value_.string_); - } - unsigned this_len; - unsigned other_len; - char const* this_str; - char const* other_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, - &other_str); - if (this_len != other_len) - return false; - JSON_ASSERT(this_str && other_str); - int comp = memcmp(this_str, other_str, this_len); - return comp == 0; - } - case arrayValue: - case objectValue: - return value_.map_->size() == other.value_.map_->size() && - (*value_.map_) == (*other.value_.map_); - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool Value::operator!=(const Value& other) const { return !(*this == other); } - -const char* Value::asCString() const { - JSON_ASSERT_MESSAGE(type() == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == nullptr) - return nullptr; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return this_str; -} - -#if JSONCPP_USING_SECURE_MEMORY -unsigned Value::getCStringLength() const { - JSON_ASSERT_MESSAGE(type() == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) - return 0; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return this_len; -} -#endif - -bool Value::getString(char const** begin, char const** end) const { - if (type() != stringValue) - return false; - if (value_.string_ == nullptr) - return false; - unsigned length; - decodePrefixedString(this->isAllocated(), this->value_.string_, &length, - begin); - *end = *begin + length; - return true; -} - -String Value::asString() const { - switch (type()) { - case nullValue: - return ""; - case stringValue: { - if (value_.string_ == nullptr) - return ""; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return String(this_str, this_len); - } - case booleanValue: - return value_.bool_ ? "true" : "false"; - case intValue: - return valueToString(value_.int_); - case uintValue: - return valueToString(value_.uint_); - case realValue: - return valueToString(value_.real_); - default: - JSON_FAIL_MESSAGE("Type is not convertible to string"); - } -} - -#ifdef JSON_USE_CPPTL -CppTL::ConstString Value::asConstString() const { - unsigned len; - char const* str; - decodePrefixedString(isAllocated(), value_.string_, &len, &str); - return CppTL::ConstString(str, len); -} -#endif - -Value::Int Value::asInt() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); - return Int(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); - return Int(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), - "double out of Int range"); - return Int(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int."); -} - -Value::UInt Value::asUInt() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); - return UInt(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); - return UInt(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), - "double out of UInt range"); - return UInt(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt."); -} - -#if defined(JSON_HAS_INT64) - -Value::Int64 Value::asInt64() const { - switch (type()) { - case intValue: - return Int64(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); - return Int64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), - "double out of Int64 range"); - return Int64(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int64."); -} - -Value::UInt64 Value::asUInt64() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); - return UInt64(value_.int_); - case uintValue: - return UInt64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), - "double out of UInt64 range"); - return UInt64(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); -} -#endif // if defined(JSON_HAS_INT64) - -LargestInt Value::asLargestInt() const { -#if defined(JSON_NO_INT64) - return asInt(); -#else - return asInt64(); -#endif -} - -LargestUInt Value::asLargestUInt() const { -#if defined(JSON_NO_INT64) - return asUInt(); -#else - return asUInt64(); -#endif -} - -double Value::asDouble() const { - switch (type()) { - case intValue: - return static_cast(value_.int_); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast(value_.uint_); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return integerToDouble(value_.uint_); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return value_.real_; - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0 : 0.0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to double."); -} - -float Value::asFloat() const { - switch (type()) { - case intValue: - return static_cast(value_.int_); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast(value_.uint_); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - // This can fail (silently?) if the value is bigger than MAX_FLOAT. - return static_cast(integerToDouble(value_.uint_)); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return static_cast(value_.real_); - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0f : 0.0f; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to float."); -} - -bool Value::asBool() const { - switch (type()) { - case booleanValue: - return value_.bool_; - case nullValue: - return false; - case intValue: - return value_.int_ ? true : false; - case uintValue: - return value_.uint_ ? true : false; - case realValue: - // This is kind of strange. Not recommended. - return (value_.real_ != 0.0) ? true : false; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to bool."); -} - -bool Value::isConvertibleTo(ValueType other) const { - switch (other) { - case nullValue: - return (isNumeric() && asDouble() == 0.0) || - (type() == booleanValue && value_.bool_ == false) || - (type() == stringValue && asString().empty()) || - (type() == arrayValue && value_.map_->empty()) || - (type() == objectValue && value_.map_->empty()) || - type() == nullValue; - case intValue: - return isInt() || - (type() == realValue && InRange(value_.real_, minInt, maxInt)) || - type() == booleanValue || type() == nullValue; - case uintValue: - return isUInt() || - (type() == realValue && InRange(value_.real_, 0, maxUInt)) || - type() == booleanValue || type() == nullValue; - case realValue: - return isNumeric() || type() == booleanValue || type() == nullValue; - case booleanValue: - return isNumeric() || type() == booleanValue || type() == nullValue; - case stringValue: - return isNumeric() || type() == booleanValue || type() == stringValue || - type() == nullValue; - case arrayValue: - return type() == arrayValue || type() == nullValue; - case objectValue: - return type() == objectValue || type() == nullValue; - } - JSON_ASSERT_UNREACHABLE; - return false; -} - -/// Number of values in array or object -ArrayIndex Value::size() const { - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - case stringValue: - return 0; - case arrayValue: // size of the array is highest index + 1 - if (!value_.map_->empty()) { - ObjectValues::const_iterator itLast = value_.map_->end(); - --itLast; - return (*itLast).first.index() + 1; - } - return 0; - case objectValue: - return ArrayIndex(value_.map_->size()); - } - JSON_ASSERT_UNREACHABLE; - return 0; // unreachable; -} - -bool Value::empty() const { - if (isNull() || isArray() || isObject()) - return size() == 0u; - else - return false; -} - -Value::operator bool() const { return !isNull(); } - -void Value::clear() { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || - type() == objectValue, - "in Json::Value::clear(): requires complex value"); - start_ = 0; - limit_ = 0; - switch (type()) { - case arrayValue: - case objectValue: - value_.map_->clear(); - break; - default: - break; - } -} - -void Value::resize(ArrayIndex newSize) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, - "in Json::Value::resize(): requires arrayValue"); - if (type() == nullValue) - *this = Value(arrayValue); - ArrayIndex oldSize = size(); - if (newSize == 0) - clear(); - else if (newSize > oldSize) - this->operator[](newSize - 1); - else { - for (ArrayIndex index = newSize; index < oldSize; ++index) { - value_.map_->erase(index); - } - JSON_ASSERT(size() == newSize); - } -} - -Value& Value::operator[](ArrayIndex index) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == arrayValue, - "in Json::Value::operator[](ArrayIndex): requires arrayValue"); - if (type() == nullValue) - *this = Value(arrayValue); - CZString key(index); - auto it = value_.map_->lower_bound(key); - if (it != value_.map_->end() && (*it).first == key) - return (*it).second; - - ObjectValues::value_type defaultValue(key, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - return (*it).second; -} - -Value& Value::operator[](int index) { - JSON_ASSERT_MESSAGE( - index >= 0, - "in Json::Value::operator[](int index): index cannot be negative"); - return (*this)[ArrayIndex(index)]; -} - -const Value& Value::operator[](ArrayIndex index) const { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == arrayValue, - "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); - if (type() == nullValue) - return nullSingleton(); - CZString key(index); - ObjectValues::const_iterator it = value_.map_->find(key); - if (it == value_.map_->end()) - return nullSingleton(); - return (*it).second; -} - -const Value& Value::operator[](int index) const { - JSON_ASSERT_MESSAGE( - index >= 0, - "in Json::Value::operator[](int index) const: index cannot be negative"); - return (*this)[ArrayIndex(index)]; -} - -void Value::initBasic(ValueType type, bool allocated) { - setType(type); - setIsAllocated(allocated); - comments_ = nullptr; - start_ = 0; - limit_ = 0; -} - -void Value::dupPayload(const Value& other) { - setType(other.type()); - setIsAllocated(false); - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if (other.value_.string_ && other.isAllocated()) { - unsigned len; - char const* str; - decodePrefixedString(other.isAllocated(), other.value_.string_, &len, - &str); - value_.string_ = duplicateAndPrefixStringValue(str, len); - setIsAllocated(true); - } else { - value_.string_ = other.value_.string_; - } - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(*other.value_.map_); - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -void Value::releasePayload() { - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if (isAllocated()) - releasePrefixedStringValue(value_.string_); - break; - case arrayValue: - case objectValue: - delete value_.map_; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -void Value::dupMeta(const Value& other) { - if (other.comments_) { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { - const CommentInfo& otherComment = other.comments_[comment]; - if (otherComment.comment_) - comments_[comment].setComment(otherComment.comment_, - strlen(otherComment.comment_)); - } - } else { - comments_ = nullptr; - } - start_ = other.start_; - limit_ = other.limit_; -} - -// Access an object value by name, create a null member if it does not exist. -// @pre Type of '*this' is object or null. -// @param key is null-terminated. -Value& Value::resolveReference(const char* key) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::resolveReference(): requires objectValue"); - if (type() == nullValue) - *this = Value(objectValue); - CZString actualKey(key, static_cast(strlen(key)), - CZString::noDuplication); // NOTE! - auto it = value_.map_->lower_bound(actualKey); - if (it != value_.map_->end() && (*it).first == actualKey) - return (*it).second; - - ObjectValues::value_type defaultValue(actualKey, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - Value& value = (*it).second; - return value; -} - -// @param key is not null-terminated. -Value& Value::resolveReference(char const* key, char const* end) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::resolveReference(key, end): requires objectValue"); - if (type() == nullValue) - *this = Value(objectValue); - CZString actualKey(key, static_cast(end - key), - CZString::duplicateOnCopy); - auto it = value_.map_->lower_bound(actualKey); - if (it != value_.map_->end() && (*it).first == actualKey) - return (*it).second; - - ObjectValues::value_type defaultValue(actualKey, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - Value& value = (*it).second; - return value; -} - -Value Value::get(ArrayIndex index, const Value& defaultValue) const { - const Value* value = &((*this)[index]); - return value == &nullSingleton() ? defaultValue : *value; -} - -bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } - -Value const* Value::find(char const* begin, char const* end) const { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, - "in Json::Value::find(key, end, found): requires " - "objectValue or nullValue"); - if (type() == nullValue) - return nullptr; - CZString actualKey(begin, static_cast(end - begin), - CZString::noDuplication); - ObjectValues::const_iterator it = value_.map_->find(actualKey); - if (it == value_.map_->end()) - return nullptr; - return &(*it).second; -} -const Value& Value::operator[](const char* key) const { - Value const* found = find(key, key + strlen(key)); - if (!found) - return nullSingleton(); - return *found; -} -Value const& Value::operator[](const String& key) const { - Value const* found = find(key.data(), key.data() + key.length()); - if (!found) - return nullSingleton(); - return *found; -} - -Value& Value::operator[](const char* key) { - return resolveReference(key, key + strlen(key)); -} - -Value& Value::operator[](const String& key) { - return resolveReference(key.data(), key.data() + key.length()); -} - -Value& Value::operator[](const StaticString& key) { - return resolveReference(key.c_str()); -} - -#ifdef JSON_USE_CPPTL -Value& Value::operator[](const CppTL::ConstString& key) { - return resolveReference(key.c_str(), key.end_c_str()); -} -Value const& Value::operator[](CppTL::ConstString const& key) const { - Value const* found = find(key.c_str(), key.end_c_str()); - if (!found) - return nullSingleton(); - return *found; -} -#endif - -Value& Value::append(const Value& value) { return (*this)[size()] = value; } - -#if JSON_HAS_RVALUE_REFERENCES -Value& Value::append(Value&& value) { - return (*this)[size()] = std::move(value); -} -#endif - -Value Value::get(char const* begin, - char const* end, - Value const& defaultValue) const { - Value const* found = find(begin, end); - return !found ? defaultValue : *found; -} -Value Value::get(char const* key, Value const& defaultValue) const { - return get(key, key + strlen(key), defaultValue); -} -Value Value::get(String const& key, Value const& defaultValue) const { - return get(key.data(), key.data() + key.length(), defaultValue); -} - -bool Value::removeMember(const char* begin, const char* end, Value* removed) { - if (type() != objectValue) { - return false; - } - CZString actualKey(begin, static_cast(end - begin), - CZString::noDuplication); - auto it = value_.map_->find(actualKey); - if (it == value_.map_->end()) - return false; - if (removed) -#if JSON_HAS_RVALUE_REFERENCES - *removed = std::move(it->second); -#else - *removed = it->second; -#endif - value_.map_->erase(it); - return true; -} -bool Value::removeMember(const char* key, Value* removed) { - return removeMember(key, key + strlen(key), removed); -} -bool Value::removeMember(String const& key, Value* removed) { - return removeMember(key.data(), key.data() + key.length(), removed); -} -void Value::removeMember(const char* key) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, - "in Json::Value::removeMember(): requires objectValue"); - if (type() == nullValue) - return; - - CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); - value_.map_->erase(actualKey); -} -void Value::removeMember(const String& key) { removeMember(key.c_str()); } - -bool Value::removeIndex(ArrayIndex index, Value* removed) { - if (type() != arrayValue) { - return false; - } - CZString key(index); - auto it = value_.map_->find(key); - if (it == value_.map_->end()) { - return false; - } - if (removed) - *removed = it->second; - ArrayIndex oldSize = size(); - // shift left all items left, into the place of the "removed" - for (ArrayIndex i = index; i < (oldSize - 1); ++i) { - CZString keey(i); - (*value_.map_)[keey] = (*this)[i + 1]; - } - // erase the last one ("leftover") - CZString keyLast(oldSize - 1); - auto itLast = value_.map_->find(keyLast); - value_.map_->erase(itLast); - return true; -} - -#ifdef JSON_USE_CPPTL -Value Value::get(const CppTL::ConstString& key, - const Value& defaultValue) const { - return get(key.c_str(), key.end_c_str(), defaultValue); -} -#endif - -bool Value::isMember(char const* begin, char const* end) const { - Value const* value = find(begin, end); - return nullptr != value; -} -bool Value::isMember(char const* key) const { - return isMember(key, key + strlen(key)); -} -bool Value::isMember(String const& key) const { - return isMember(key.data(), key.data() + key.length()); -} - -#ifdef JSON_USE_CPPTL -bool Value::isMember(const CppTL::ConstString& key) const { - return isMember(key.c_str(), key.end_c_str()); -} -#endif - -Value::Members Value::getMemberNames() const { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::getMemberNames(), value must be objectValue"); - if (type() == nullValue) - return Value::Members(); - Members members; - members.reserve(value_.map_->size()); - ObjectValues::const_iterator it = value_.map_->begin(); - ObjectValues::const_iterator itEnd = value_.map_->end(); - for (; it != itEnd; ++it) { - members.push_back(String((*it).first.data(), (*it).first.length())); - } - return members; -} -// -//# ifdef JSON_USE_CPPTL -// EnumMemberNames -// Value::enumMemberNames() const -//{ -// if ( type() == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -// EnumValues -// Value::enumValues() const -//{ -// if ( type() == objectValue || type() == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type() ); -// return EnumValues(); -//} -// -//# endif - -static bool IsIntegral(double d) { - double integral_part; - return modf(d, &integral_part) == 0.0; -} - -bool Value::isNull() const { return type() == nullValue; } - -bool Value::isBool() const { return type() == booleanValue; } - -bool Value::isInt() const { - switch (type()) { - case intValue: -#if defined(JSON_HAS_INT64) - return value_.int_ >= minInt && value_.int_ <= maxInt; -#else - return true; -#endif - case uintValue: - return value_.uint_ <= UInt(maxInt); - case realValue: - return value_.real_ >= minInt && value_.real_ <= maxInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - -bool Value::isUInt() const { - switch (type()) { - case intValue: -#if defined(JSON_HAS_INT64) - return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); -#else - return value_.int_ >= 0; -#endif - case uintValue: -#if defined(JSON_HAS_INT64) - return value_.uint_ <= maxUInt; -#else - return true; -#endif - case realValue: - return value_.real_ >= 0 && value_.real_ <= maxUInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - -bool Value::isInt64() const { -#if defined(JSON_HAS_INT64) - switch (type()) { - case intValue: - return true; - case uintValue: - return value_.uint_ <= UInt64(maxInt64); - case realValue: - // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a - // double, so double(maxInt64) will be rounded up to 2^63. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && - value_.real_ < double(maxInt64) && IsIntegral(value_.real_); - default: - break; - } -#endif // JSON_HAS_INT64 - return false; -} - -bool Value::isUInt64() const { -#if defined(JSON_HAS_INT64) - switch (type()) { - case intValue: - return value_.int_ >= 0; - case uintValue: - return true; - case realValue: - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && - IsIntegral(value_.real_); - default: - break; - } -#endif // JSON_HAS_INT64 - return false; -} - -bool Value::isIntegral() const { - switch (type()) { - case intValue: - case uintValue: - return true; - case realValue: -#if defined(JSON_HAS_INT64) - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && - value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); -#else - return value_.real_ >= minInt && value_.real_ <= maxUInt && - IsIntegral(value_.real_); -#endif // JSON_HAS_INT64 - default: - break; - } - return false; -} - -bool Value::isDouble() const { - return type() == intValue || type() == uintValue || type() == realValue; -} - -bool Value::isNumeric() const { return isDouble(); } - -bool Value::isString() const { return type() == stringValue; } - -bool Value::isArray() const { return type() == arrayValue; } - -bool Value::isObject() const { return type() == objectValue; } - -void Value::setComment(const char* comment, - size_t len, - CommentPlacement placement) { - if (!comments_) - comments_ = new CommentInfo[numberOfCommentPlacement]; - if ((len > 0) && (comment[len - 1] == '\n')) { - // Always discard trailing newline, to aid indentation. - len -= 1; - } - comments_[placement].setComment(comment, len); -} - -void Value::setComment(const char* comment, CommentPlacement placement) { - setComment(comment, strlen(comment), placement); -} - -void Value::setComment(const String& comment, CommentPlacement placement) { - setComment(comment.c_str(), comment.length(), placement); -} - -bool Value::hasComment(CommentPlacement placement) const { - return comments_ != nullptr && comments_[placement].comment_ != nullptr; -} - -String Value::getComment(CommentPlacement placement) const { - if (hasComment(placement)) - return comments_[placement].comment_; - return ""; -} - -void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } - -void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } - -ptrdiff_t Value::getOffsetStart() const { return start_; } - -ptrdiff_t Value::getOffsetLimit() const { return limit_; } - -String Value::toStyledString() const { - StreamWriterBuilder builder; - - String out = this->hasComment(commentBefore) ? "\n" : ""; - out += Json::writeString(builder, *this); - out += '\n'; - - return out; -} - -Value::const_iterator Value::begin() const { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return const_iterator(value_.map_->begin()); - break; - default: - break; - } - return {}; -} - -Value::const_iterator Value::end() const { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return const_iterator(value_.map_->end()); - break; - default: - break; - } - return {}; -} - -Value::iterator Value::begin() { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return iterator(value_.map_->begin()); - break; - default: - break; - } - return iterator(); -} - -Value::iterator Value::end() { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return iterator(value_.map_->end()); - break; - default: - break; - } - return iterator(); -} - -// class PathArgument -// ////////////////////////////////////////////////////////////////// - -PathArgument::PathArgument() : key_() {} - -PathArgument::PathArgument(ArrayIndex index) - : key_(), index_(index), kind_(kindIndex) {} - -PathArgument::PathArgument(const char* key) - : key_(key), index_(), kind_(kindKey) {} - -PathArgument::PathArgument(const String& key) - : key_(key.c_str()), index_(), kind_(kindKey) {} - -// class Path -// ////////////////////////////////////////////////////////////////// - -Path::Path(const String& path, - const PathArgument& a1, - const PathArgument& a2, - const PathArgument& a3, - const PathArgument& a4, - const PathArgument& a5) { - InArgs in; - in.reserve(5); - in.push_back(&a1); - in.push_back(&a2); - in.push_back(&a3); - in.push_back(&a4); - in.push_back(&a5); - makePath(path, in); -} - -void Path::makePath(const String& path, const InArgs& in) { - const char* current = path.c_str(); - const char* end = current + path.length(); - auto itInArg = in.begin(); - while (current != end) { - if (*current == '[') { - ++current; - if (*current == '%') - addPathInArg(path, in, itInArg, PathArgument::kindIndex); - else { - ArrayIndex index = 0; - for (; current != end && *current >= '0' && *current <= '9'; ++current) - index = index * 10 + ArrayIndex(*current - '0'); - args_.push_back(index); - } - if (current == end || *++current != ']') - invalidPath(path, int(current - path.c_str())); - } else if (*current == '%') { - addPathInArg(path, in, itInArg, PathArgument::kindKey); - ++current; - } else if (*current == '.' || *current == ']') { - ++current; - } else { - const char* beginName = current; - while (current != end && !strchr("[.", *current)) - ++current; - args_.push_back(String(beginName, current)); - } - } -} - -void Path::addPathInArg(const String& /*path*/, - const InArgs& in, - InArgs::const_iterator& itInArg, - PathArgument::Kind kind) { - if (itInArg == in.end()) { - // Error: missing argument %d - } else if ((*itInArg)->kind_ != kind) { - // Error: bad argument type - } else { - args_.push_back(**itInArg++); - } -} - -void Path::invalidPath(const String& /*path*/, int /*location*/) { - // Error: invalid path. -} - -const Value& Path::resolve(const Value& root) const { - const Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray() || !node->isValidIndex(arg.index_)) { - // Error: unable to resolve path (array value expected at position... - return Value::null; - } - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) { - // Error: unable to resolve path (object value expected at position...) - return Value::null; - } - node = &((*node)[arg.key_]); - if (node == &Value::nullSingleton()) { - // Error: unable to resolve path (object has no member named '' at - // position...) - return Value::null; - } - } - } - return *node; -} - -Value Path::resolve(const Value& root, const Value& defaultValue) const { - const Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray() || !node->isValidIndex(arg.index_)) - return defaultValue; - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) - return defaultValue; - node = &((*node)[arg.key_]); - if (node == &Value::nullSingleton()) - return defaultValue; - } - } - return *node; -} - -Value& Path::make(Value& root) const { - Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray()) { - // Error: node is not an array at position ... - } - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) { - // Error: node is not an object at position... - } - node = &((*node)[arg.key_]); - } - } - return *node; -} - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_value.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - - -// ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: src/lib_json/json_writer.cpp -// ////////////////////////////////////////////////////////////////////// - -// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include "json_tool.h" -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#include -#include - -#if __cplusplus >= 201103L -#include -#include - -#if !defined(isnan) -#define isnan std::isnan -#endif - -#if !defined(isfinite) -#define isfinite std::isfinite -#endif - -#else -#include -#include - -#if defined(_MSC_VER) -#if !defined(isnan) -#include -#define isnan _isnan -#endif - -#if !defined(isfinite) -#include -#define isfinite _finite -#endif - -#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) -#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 -#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES - -#endif //_MSC_VER - -#if defined(__sun) && defined(__SVR4) // Solaris -#if !defined(isfinite) -#include -#define isfinite finite -#endif -#endif - -#if defined(__hpux) -#if !defined(isfinite) -#if defined(__ia64) && !defined(finite) -#define isfinite(x) \ - ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) -#endif -#endif -#endif - -#if !defined(isnan) -// IEEE standard states that NaN values will not compare to themselves -#define isnan(x) (x != x) -#endif - -#if !defined(__APPLE__) -#if !defined(isfinite) -#define isfinite finite -#endif -#endif -#endif - -#if defined(_MSC_VER) -// Disable warning about strdup being deprecated. -#pragma warning(disable : 4996) -#endif - -namespace Json { - -#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr StreamWriterPtr; -#else -typedef std::unique_ptr StreamWriterPtr; -#endif - -String valueToString(LargestInt value) { - UIntToStringBuffer buffer; - char* current = buffer + sizeof(buffer); - if (value == Value::minLargestInt) { - uintToString(LargestUInt(Value::maxLargestInt) + 1, current); - *--current = '-'; - } else if (value < 0) { - uintToString(LargestUInt(-value), current); - *--current = '-'; - } else { - uintToString(LargestUInt(value), current); - } - assert(current >= buffer); - return current; -} - -String valueToString(LargestUInt value) { - UIntToStringBuffer buffer; - char* current = buffer + sizeof(buffer); - uintToString(value, current); - assert(current >= buffer); - return current; -} - -#if defined(JSON_HAS_INT64) - -String valueToString(Int value) { return valueToString(LargestInt(value)); } - -String valueToString(UInt value) { return valueToString(LargestUInt(value)); } - -#endif // # if defined(JSON_HAS_INT64) - -namespace { -String valueToString(double value, - bool useSpecialFloats, - unsigned int precision, - PrecisionType precisionType) { - // Print into the buffer. We need not request the alternative representation - // that always has a decimal point because JSON doesn't distinguish the - // concepts of reals and integers. - if (!isfinite(value)) { - static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, - {"null", "-1e+9999", "1e+9999"}}; - return reps[useSpecialFloats ? 0 : 1] - [isnan(value) ? 0 : (value < 0) ? 1 : 2]; - } - - String buffer(size_t(36), '\0'); - while (true) { - int len = jsoncpp_snprintf( - &*buffer.begin(), buffer.size(), - (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", - precision, value); - assert(len >= 0); - auto wouldPrint = static_cast(len); - if (wouldPrint >= buffer.size()) { - buffer.resize(wouldPrint + 1); - continue; - } - buffer.resize(wouldPrint); - break; - } - - buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); - - // strip the zero padding from the right - if (precisionType == PrecisionType::decimalPlaces) { - buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end()), buffer.end()); - } - - // try to ensure we preserve the fact that this was given to us as a double on - // input - if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { - buffer += ".0"; - } - return buffer; -} -} // namespace - -String valueToString(double value, - unsigned int precision, - PrecisionType precisionType) { - return valueToString(value, false, precision, precisionType); -} - -String valueToString(bool value) { return value ? "true" : "false"; } - -static bool isAnyCharRequiredQuoting(char const* s, size_t n) { - assert(s || !n); - - char const* const end = s + n; - for (char const* cur = s; cur < end; ++cur) { - if (*cur == '\\' || *cur == '\"' || *cur < ' ' || - static_cast(*cur) < 0x80) - return true; - } - return false; -} - -static unsigned int utf8ToCodepoint(const char*& s, const char* e) { - const unsigned int REPLACEMENT_CHARACTER = 0xFFFD; - - unsigned int firstByte = static_cast(*s); - - if (firstByte < 0x80) - return firstByte; - - if (firstByte < 0xE0) { - if (e - s < 2) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = - ((firstByte & 0x1F) << 6) | (static_cast(s[1]) & 0x3F); - s += 1; - // oversized encoded characters are invalid - return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; - } - - if (firstByte < 0xF0) { - if (e - s < 3) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = ((firstByte & 0x0F) << 12) | - ((static_cast(s[1]) & 0x3F) << 6) | - (static_cast(s[2]) & 0x3F); - s += 2; - // surrogates aren't valid codepoints itself - // shouldn't be UTF-8 encoded - if (calculated >= 0xD800 && calculated <= 0xDFFF) - return REPLACEMENT_CHARACTER; - // oversized encoded characters are invalid - return calculated < 0x800 ? REPLACEMENT_CHARACTER : calculated; - } - - if (firstByte < 0xF8) { - if (e - s < 4) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = ((firstByte & 0x07) << 18) | - ((static_cast(s[1]) & 0x3F) << 12) | - ((static_cast(s[2]) & 0x3F) << 6) | - (static_cast(s[3]) & 0x3F); - s += 3; - // oversized encoded characters are invalid - return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; - } - - return REPLACEMENT_CHARACTER; -} - -static const char hex2[] = "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - "505152535455565758595a5b5c5d5e5f" - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; - -static String toHex16Bit(unsigned int x) { - const unsigned int hi = (x >> 8) & 0xff; - const unsigned int lo = x & 0xff; - String result(4, ' '); - result[0] = hex2[2 * hi]; - result[1] = hex2[2 * hi + 1]; - result[2] = hex2[2 * lo]; - result[3] = hex2[2 * lo + 1]; - return result; -} - -static String valueToQuotedStringN(const char* value, unsigned length) { - if (value == nullptr) - return ""; - - if (!isAnyCharRequiredQuoting(value, length)) - return String("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to String is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL - String result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - char const* end = value + length; - for (const char* c = value; c != end; ++c) { - switch (*c) { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - // case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something.) - // blep notes: actually escaping \/ may be useful in javascript to avoid = 0x20) - result += static_cast(cp); - else if (cp < 0x10000) { // codepoint is in Basic Multilingual Plane - result += "\\u"; - result += toHex16Bit(cp); - } else { // codepoint is not in Basic Multilingual Plane - // convert to surrogate pair first - cp -= 0x10000; - result += "\\u"; - result += toHex16Bit((cp >> 10) + 0xD800); - result += "\\u"; - result += toHex16Bit((cp & 0x3FF) + 0xDC00); - } - } break; - } - } - result += "\""; - return result; -} - -String valueToQuotedString(const char* value) { - return valueToQuotedStringN(value, static_cast(strlen(value))); -} - -// Class Writer -// ////////////////////////////////////////////////////////////////// -Writer::~Writer() = default; - -// Class FastWriter -// ////////////////////////////////////////////////////////////////// - -FastWriter::FastWriter() - - = default; - -void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } - -void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } - -void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } - -String FastWriter::write(const Value& root) { - document_.clear(); - writeValue(root); - if (!omitEndingLineFeed_) - document_ += '\n'; - return document_; -} - -void FastWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - if (!dropNullPlaceholders_) - document_ += "null"; - break; - case intValue: - document_ += valueToString(value.asLargestInt()); - break; - case uintValue: - document_ += valueToString(value.asLargestUInt()); - break; - case realValue: - document_ += valueToString(value.asDouble()); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - document_ += valueToQuotedStringN(str, static_cast(end - str)); - break; - } - case booleanValue: - document_ += valueToString(value.asBool()); - break; - case arrayValue: { - document_ += '['; - ArrayIndex size = value.size(); - for (ArrayIndex index = 0; index < size; ++index) { - if (index > 0) - document_ += ','; - writeValue(value[index]); - } - document_ += ']'; - } break; - case objectValue: { - Value::Members members(value.getMemberNames()); - document_ += '{'; - for (auto it = members.begin(); it != members.end(); ++it) { - const String& name = *it; - if (it != members.begin()) - document_ += ','; - document_ += valueToQuotedStringN(name.data(), - static_cast(name.length())); - document_ += yamlCompatibilityEnabled_ ? ": " : ":"; - writeValue(value[name]); - } - document_ += '}'; - } break; - } -} - -// Class StyledWriter -// ////////////////////////////////////////////////////////////////// - -StyledWriter::StyledWriter() = default; - -String StyledWriter::write(const Value& root) { - document_.clear(); - addChildValues_ = false; - indentString_.clear(); - writeCommentBeforeValue(root); - writeValue(root); - writeCommentAfterValueOnSameLine(root); - document_ += '\n'; - return document_; -} - -void StyledWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - pushValue("null"); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble())); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue(valueToQuotedStringN(str, static_cast(end - str))); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - const String& name = *it; - const Value& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedString(name.c_str())); - document_ += " : "; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - document_ += ','; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void StyledWriter::writeArrayValue(const Value& value) { - unsigned size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isArrayMultiLine = isMultilineArray(value); - if (isArrayMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index = 0; - for (;;) { - const Value& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - writeIndent(); - writeValue(childValue); - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - document_ += ','; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - document_ += "[ "; - for (unsigned index = 0; index < size; ++index) { - if (index > 0) - document_ += ", "; - document_ += childValues_[index]; - } - document_ += " ]"; - } - } -} - -bool StyledWriter::isMultilineArray(const Value& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - const Value& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void StyledWriter::pushValue(const String& value) { - if (addChildValues_) - childValues_.push_back(value); - else - document_ += value; -} - -void StyledWriter::writeIndent() { - if (!document_.empty()) { - char last = document_[document_.length() - 1]; - if (last == ' ') // already indented - return; - if (last != '\n') // Comments may add new-line - document_ += '\n'; - } - document_ += indentString_; -} - -void StyledWriter::writeWithIndent(const String& value) { - writeIndent(); - document_ += value; -} - -void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } - -void StyledWriter::unindent() { - assert(indentString_.size() >= indentSize_); - indentString_.resize(indentString_.size() - indentSize_); -} - -void StyledWriter::writeCommentBeforeValue(const Value& root) { - if (!root.hasComment(commentBefore)) - return; - - document_ += '\n'; - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - document_ += *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - writeIndent(); - ++iter; - } - - // Comments are stripped of trailing newlines, so add one here - document_ += '\n'; -} - -void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { - if (root.hasComment(commentAfterOnSameLine)) - document_ += " " + root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - document_ += '\n'; - document_ += root.getComment(commentAfter); - document_ += '\n'; - } -} - -bool StyledWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -// Class StyledStreamWriter -// ////////////////////////////////////////////////////////////////// - -StyledStreamWriter::StyledStreamWriter(String indentation) - : document_(nullptr), indentation_(std::move(indentation)), - addChildValues_(), indented_(false) {} - -void StyledStreamWriter::write(OStream& out, const Value& root) { - document_ = &out; - addChildValues_ = false; - indentString_.clear(); - indented_ = true; - writeCommentBeforeValue(root); - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(root); - writeCommentAfterValueOnSameLine(root); - *document_ << "\n"; - document_ = nullptr; // Forget the stream, for safety. -} - -void StyledStreamWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - pushValue("null"); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble())); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue(valueToQuotedStringN(str, static_cast(end - str))); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - const String& name = *it; - const Value& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedString(name.c_str())); - *document_ << " : "; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void StyledStreamWriter::writeArrayValue(const Value& value) { - unsigned size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isArrayMultiLine = isMultilineArray(value); - if (isArrayMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index = 0; - for (;;) { - const Value& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(childValue); - indented_ = false; - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - *document_ << "[ "; - for (unsigned index = 0; index < size; ++index) { - if (index > 0) - *document_ << ", "; - *document_ << childValues_[index]; - } - *document_ << " ]"; - } - } -} - -bool StyledStreamWriter::isMultilineArray(const Value& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - const Value& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void StyledStreamWriter::pushValue(const String& value) { - if (addChildValues_) - childValues_.push_back(value); - else - *document_ << value; -} - -void StyledStreamWriter::writeIndent() { - // blep intended this to look at the so-far-written string - // to determine whether we are already indented, but - // with a stream we cannot do that. So we rely on some saved state. - // The caller checks indented_. - *document_ << '\n' << indentString_; -} - -void StyledStreamWriter::writeWithIndent(const String& value) { - if (!indented_) - writeIndent(); - *document_ << value; - indented_ = false; -} - -void StyledStreamWriter::indent() { indentString_ += indentation_; } - -void StyledStreamWriter::unindent() { - assert(indentString_.size() >= indentation_.size()); - indentString_.resize(indentString_.size() - indentation_.size()); -} - -void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { - if (!root.hasComment(commentBefore)) - return; - - if (!indented_) - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - *document_ << *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - // writeIndent(); // would include newline - *document_ << indentString_; - ++iter; - } - indented_ = false; -} - -void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { - if (root.hasComment(commentAfterOnSameLine)) - *document_ << ' ' << root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - writeIndent(); - *document_ << root.getComment(commentAfter); - } - indented_ = false; -} - -bool StyledStreamWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -////////////////////////// -// BuiltStyledStreamWriter - -/// Scoped enums are not available until C++11. -struct CommentStyle { - /// Decide whether to write comments. - enum Enum { - None, ///< Drop all comments. - Most, ///< Recover odd behavior of previous versions (not implemented yet). - All ///< Keep all comments. - }; -}; - -struct BuiltStyledStreamWriter : public StreamWriter { - BuiltStyledStreamWriter(String indentation, - CommentStyle::Enum cs, - String colonSymbol, - String nullSymbol, - String endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision, - PrecisionType precisionType); - int write(Value const& root, OStream* sout) override; - -private: - void writeValue(Value const& value); - void writeArrayValue(Value const& value); - bool isMultilineArray(Value const& value); - void pushValue(String const& value); - void writeIndent(); - void writeWithIndent(String const& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(Value const& root); - void writeCommentAfterValueOnSameLine(Value const& root); - static bool hasCommentForValue(const Value& value); - - typedef std::vector ChildValues; - - ChildValues childValues_; - String indentString_; - unsigned int rightMargin_; - String indentation_; - CommentStyle::Enum cs_; - String colonSymbol_; - String nullSymbol_; - String endingLineFeedSymbol_; - bool addChildValues_ : 1; - bool indented_ : 1; - bool useSpecialFloats_ : 1; - unsigned int precision_; - PrecisionType precisionType_; -}; -BuiltStyledStreamWriter::BuiltStyledStreamWriter(String indentation, - CommentStyle::Enum cs, - String colonSymbol, - String nullSymbol, - String endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision, - PrecisionType precisionType) - : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), - colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), - endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), - addChildValues_(false), indented_(false), - useSpecialFloats_(useSpecialFloats), precision_(precision), - precisionType_(precisionType) {} -int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { - sout_ = sout; - addChildValues_ = false; - indented_ = true; - indentString_.clear(); - writeCommentBeforeValue(root); - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(root); - writeCommentAfterValueOnSameLine(root); - *sout_ << endingLineFeedSymbol_; - sout_ = nullptr; - return 0; -} -void BuiltStyledStreamWriter::writeValue(Value const& value) { - switch (value.type()) { - case nullValue: - pushValue(nullSymbol_); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, - precisionType_)); - break; - case stringValue: { - // Is NULL is possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue(valueToQuotedStringN(str, static_cast(end - str))); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - String const& name = *it; - Value const& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedStringN( - name.data(), static_cast(name.length()))); - *sout_ << colonSymbol_; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *sout_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { - unsigned size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isMultiLine = (cs_ == CommentStyle::All) || isMultilineArray(value); - if (isMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index = 0; - for (;;) { - Value const& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(childValue); - indented_ = false; - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *sout_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - *sout_ << "["; - if (!indentation_.empty()) - *sout_ << " "; - for (unsigned index = 0; index < size; ++index) { - if (index > 0) - *sout_ << ((!indentation_.empty()) ? ", " : ","); - *sout_ << childValues_[index]; - } - if (!indentation_.empty()) - *sout_ << " "; - *sout_ << "]"; - } - } -} - -bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - Value const& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void BuiltStyledStreamWriter::pushValue(String const& value) { - if (addChildValues_) - childValues_.push_back(value); - else - *sout_ << value; -} - -void BuiltStyledStreamWriter::writeIndent() { - // blep intended this to look at the so-far-written string - // to determine whether we are already indented, but - // with a stream we cannot do that. So we rely on some saved state. - // The caller checks indented_. - - if (!indentation_.empty()) { - // In this case, drop newlines too. - *sout_ << '\n' << indentString_; - } -} - -void BuiltStyledStreamWriter::writeWithIndent(String const& value) { - if (!indented_) - writeIndent(); - *sout_ << value; - indented_ = false; -} - -void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } - -void BuiltStyledStreamWriter::unindent() { - assert(indentString_.size() >= indentation_.size()); - indentString_.resize(indentString_.size() - indentation_.size()); -} - -void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { - if (cs_ == CommentStyle::None) - return; - if (!root.hasComment(commentBefore)) - return; - - if (!indented_) - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - *sout_ << *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - // writeIndent(); // would write extra newline - *sout_ << indentString_; - ++iter; - } - indented_ = false; -} - -void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( - Value const& root) { - if (cs_ == CommentStyle::None) - return; - if (root.hasComment(commentAfterOnSameLine)) - *sout_ << " " + root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - writeIndent(); - *sout_ << root.getComment(commentAfter); - } -} - -// static -bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -/////////////// -// StreamWriter - -StreamWriter::StreamWriter() : sout_(nullptr) {} -StreamWriter::~StreamWriter() = default; -StreamWriter::Factory::~Factory() = default; -StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } -StreamWriterBuilder::~StreamWriterBuilder() = default; -StreamWriter* StreamWriterBuilder::newStreamWriter() const { - String indentation = settings_["indentation"].asString(); - String cs_str = settings_["commentStyle"].asString(); - String pt_str = settings_["precisionType"].asString(); - bool eyc = settings_["enableYAMLCompatibility"].asBool(); - bool dnp = settings_["dropNullPlaceholders"].asBool(); - bool usf = settings_["useSpecialFloats"].asBool(); - unsigned int pre = settings_["precision"].asUInt(); - CommentStyle::Enum cs = CommentStyle::All; - if (cs_str == "All") { - cs = CommentStyle::All; - } else if (cs_str == "None") { - cs = CommentStyle::None; - } else { - throwRuntimeError("commentStyle must be 'All' or 'None'"); - } - PrecisionType precisionType(significantDigits); - if (pt_str == "significant") { - precisionType = PrecisionType::significantDigits; - } else if (pt_str == "decimal") { - precisionType = PrecisionType::decimalPlaces; - } else { - throwRuntimeError("precisionType must be 'significant' or 'decimal'"); - } - String colonSymbol = " : "; - if (eyc) { - colonSymbol = ": "; - } else if (indentation.empty()) { - colonSymbol = ":"; - } - String nullSymbol = "null"; - if (dnp) { - nullSymbol.clear(); - } - if (pre > 17) - pre = 17; - String endingLineFeedSymbol; - return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, - endingLineFeedSymbol, usf, pre, - precisionType); -} -static void getValidWriterKeys(std::set* valid_keys) { - valid_keys->clear(); - valid_keys->insert("indentation"); - valid_keys->insert("commentStyle"); - valid_keys->insert("enableYAMLCompatibility"); - valid_keys->insert("dropNullPlaceholders"); - valid_keys->insert("useSpecialFloats"); - valid_keys->insert("precision"); - valid_keys->insert("precisionType"); -} -bool StreamWriterBuilder::validate(Json::Value* invalid) const { - Json::Value my_invalid; - if (!invalid) - invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set valid_keys; - getValidWriterKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - String const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } - } - return inv.empty(); -} -Value& StreamWriterBuilder::operator[](const String& key) { - return settings_[key]; -} -// static -void StreamWriterBuilder::setDefaults(Json::Value* settings) { - //! [StreamWriterBuilderDefaults] - (*settings)["commentStyle"] = "All"; - (*settings)["indentation"] = "\t"; - (*settings)["enableYAMLCompatibility"] = false; - (*settings)["dropNullPlaceholders"] = false; - (*settings)["useSpecialFloats"] = false; - (*settings)["precision"] = 17; - (*settings)["precisionType"] = "significant"; - //! [StreamWriterBuilderDefaults] -} - -String writeString(StreamWriter::Factory const& factory, Value const& root) { - OStringStream sout; - StreamWriterPtr const writer(factory.newStreamWriter()); - writer->write(root, &sout); - return sout.str(); -} - -OStream& operator<<(OStream& sout, Value const& root) { - StreamWriterBuilder builder; - StreamWriterPtr const writer(builder.newStreamWriter()); - writer->write(root, &sout); - return sout; -} - -} // namespace Json - -// ////////////////////////////////////////////////////////////////////// -// End of content of file: src/lib_json/json_writer.cpp -// ////////////////////////////////////////////////////////////////////// - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/main.cpp --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/main.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include -#include -#include -#include "TestStoneCodeGen_generated.hpp" - -using std::stringstream; - -int main() -{ - std::cout << "Hello world from testWasmIntegrated! (this is sent from C++)" << std::endl; - try - { - const char* jsonData = R"bgo({"definition": - { - "val" : [ "berk", 42 ], - "zozo" : { "23": "zloutch", "lalala": 42} - } - })bgo"; - std::string strValue(jsonData); - - Json::Value readValue; - - Json::CharReaderBuilder builder; - Json::CharReader* reader = builder.newCharReader(); - - StoneSmartPtr ptr(reader); - - std::string errors; - - bool ok = reader->parse( - strValue.c_str(), - strValue.c_str() + strValue.size(), - &readValue, - &errors - ); - if (!ok) - { - std::stringstream ss; - ss << "Jsoncpp parsing error: " << errors; - throw std::runtime_error(ss.str()); - } - std::cout << "Json parsing OK" << std::endl; - std::cout << readValue << std::endl; - } - catch(std::exception& e) - { - std::cout << "Json parsing THROW" << std::endl; - std::cout << "e.what() = " << e.what() << std::endl; - } -} - -extern "C" void SendMessageFromCppJS(const char* message); -extern "C" void SendFreeTextFromCppJS(const char* message); - -#define HANDLE_MESSAGE(Type,value) \ - stringstream ss; \ - ss << "Received an instance of:\n" #Type "\n. Here's the dump:\n"; \ - TestStoneCodeGen::StoneDumpValue(ss, value, 0); \ - SendFreeTextFromCppJS(ss.str().c_str()); \ - return true; - -#define ECHO_MESSAGE(Type,value) \ - stringstream ss; \ - ss << "Received an instance of:\n" #Type "\n. Here's the dump:\n"; \ - TestStoneCodeGen::StoneDumpValue(ss, value, 0); \ - SendFreeTextFromCppJS(ss.str().c_str()); \ - std::string serializedInCpp = StoneSerialize(value); \ - SendMessageFromCppJS(serializedInCpp.c_str()); \ - return true; - -class MyHandler : public TestStoneCodeGen::IHandler -{ - public: - virtual bool Handle(const TestStoneCodeGen::A& value) override - { - HANDLE_MESSAGE(TestStoneCodeGen::A,value) - } - virtual bool Handle(const TestStoneCodeGen::B& value) override - { - HANDLE_MESSAGE(TestStoneCodeGen::B,value) - } - - virtual bool Handle(const TestStoneCodeGen::Message1& value) override - { - HANDLE_MESSAGE(TestStoneCodeGen::Message1,value) - } - - virtual bool Handle(const TestStoneCodeGen::Message2& value) override - { - HANDLE_MESSAGE(TestStoneCodeGen::Message2,value) - } - - virtual bool Handle(const TestStoneCodeGen::C& value) override - { - HANDLE_MESSAGE(TestStoneCodeGen::C,value) - } -}; - -class MyEchoHandler : public TestStoneCodeGen::IHandler -{ - public: - virtual bool Handle(const TestStoneCodeGen::A& value) override - { - ECHO_MESSAGE(TestStoneCodeGen::A,value) - } - virtual bool Handle(const TestStoneCodeGen::B& value) override - { - ECHO_MESSAGE(TestStoneCodeGen::B,value) - } - - virtual bool Handle(const TestStoneCodeGen::Message1& value) override - { - ECHO_MESSAGE(TestStoneCodeGen::Message1,value) - } - - virtual bool Handle(const TestStoneCodeGen::Message2& value) override - { - ECHO_MESSAGE(TestStoneCodeGen::Message2,value) - } - - virtual bool Handle(const TestStoneCodeGen::C& value) override - { - ECHO_MESSAGE(TestStoneCodeGen::C,value) - } -}; - -extern "C" void EMSCRIPTEN_KEEPALIVE SendMessageToCpp(const char* message) -{ - MyHandler handler; - try - { - bool handled = TestStoneCodeGen::StoneDispatchToHandler(message,&handler); - if(!handled) - { - SendFreeTextFromCppJS("This message is valid JSON, but was not handled!"); - } - } - catch(std::exception& e) - { - stringstream ss; - ss << "Error while parsing message: " << e.what() << "\n"; - SendFreeTextFromCppJS(ss.str().c_str()); - } -} - -extern "C" void EMSCRIPTEN_KEEPALIVE SendMessageToCppForEcho(const char* message) -{ - MyEchoHandler echoHandler; - try - { - bool handled = TestStoneCodeGen::StoneDispatchToHandler(message,&echoHandler); - if(!handled) - { - SendFreeTextFromCppJS("This message is valid JSON, but was not handled by the echo handler!"); - } - } - catch(std::exception& e) - { - stringstream ss; - ss << "Error while parsing message: " << e.what() << "\n"; - SendFreeTextFromCppJS(ss.str().c_str()); - } -} - -void EMSCRIPTEN_KEEPALIVE StartWasmApplication(const char* baseUri) -{ - printf("Hello! (this is sent from C++)\n"); - -// // recreate a command line from uri arguments and parse it -// boost::program_options::variables_map parameters; -// boost::program_options::options_description options; -// application->DeclareStartupOptions(options); -// startupParametersBuilder.GetStartupParameters(parameters, options); - -// context.reset(new OrthancStone::StoneApplicationContext(broker)); -// context->SetOrthancBaseUrl(baseUri); -// printf("Base URL to Orthanc API: [%s]\n", baseUri); -// context->SetWebService(OrthancStone::WasmWebService::GetInstance()); -// context->SetDelayedCallExecutor(OrthancStone::WasmDelayedCallExecutor::GetInstance()); -// application->Initialize(context.get(), statusBar_, parameters); -// application->InitializeWasm(); - -// // viewport->SetSize(width_, height_); -// printf("StartWasmApplication - completed\n"); - SendFreeTextFromCppJS("Hello world from C++!"); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/serve.py --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/serve.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# tested on python 3.4 ,python of lower version has different module organization. -# from https://gist.github.com/HaiyangXu/ec88cbdce3cdbac7b8d5 -import http.server -from http.server import HTTPServer, BaseHTTPRequestHandler -import socketserver - -PORT = 8080 - -Handler = http.server.SimpleHTTPRequestHandler - -Handler.extensions_map = { - '.manifest': 'text/cache-manifest', - '.html': 'text/html', - '.png': 'image/png', - '.jpg': 'image/jpg', - '.svg': 'image/svg+xml', - '.wasm': 'application/wasm', - '.css': 'text/css', - '.js': 'application/x-javascript', - '': 'application/octet-stream', # Default -} - -httpd = socketserver.TCPServer(("", PORT), Handler) - -print("serving at port", PORT) -httpd.serve_forever() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/styles.css --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/styles.css Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -.TestWasm-grid-container { - display: grid; - grid-template-columns: 0.55fr 0.55fr 0.55fr 0.55fr 0.6fr 1.1fr 1.1fr; - grid-template-rows: 1.1fr 0.9fr 0.2fr 0.3fr 0.1fr 0.3fr 0.1fr; - grid-template-areas: - "SerializedInput SerializedInput SerializedInput SerializedInput ButtonContainer CppOutput CppOutput" - "SerializedInput SerializedInput SerializedInput SerializedInput ButtonContainer CppOutput CppOutput" - ". . . . . . ." - "Test1 Test2 Test3 Test4 . . ." - ". . . . . . ." - "Test5 Test6 Test7 Test8 . . ." - "TestTsCppTs . . . . . ." - ". . . . . . ." - ; - height: 480px; - } - - .TestWasm-ButtonContainer { - display: grid; - grid-template-columns: 0.2fr 0.8fr 0.2fr; - grid-template-rows: 0.2fr 0.5fr 0.2fr 0.5fr 0.2fr 0.5fr 0.2fr; - grid-template-areas: - ". . ." - ". TriggerButton ." - ". . ." - ". ClearButton ." - ". . ." - ". ShowSchemaButton ." - ". . ." - ; - } - - .TestWasm-TriggerButton { grid-area: TriggerButton; } - - .TestWasm-ClearButton { grid-area: ClearButton; } - - .TestWasm-ShowSchemaButton { grid-area: ShowSchemaButton; } - - -.TestWasm-SerializedInput { grid-area: SerializedInput; } - -.TestWasm-CppOutput { grid-area: CppOutput; } - -.TestWasm-ButtonContainer { grid-area: ButtonContainer; } - -.TestWasm-Test1 { grid-area: Test1; } - -.TestWasm-Test2 { grid-area: Test2; } - -.TestWasm-Test3 { grid-area: Test3; } - -.TestWasm-Test4 { grid-area: Test4; } - -.TestWasm-Test5 { grid-area: Test5; } - -.TestWasm-Test6 { grid-area: Test6; } - -.TestWasm-Test7 { grid-area: Test7; } - -.TestWasm-Test8 { grid-area: Test8; } - -.TestWasm-ts-cpp-ts { grid-area: TestTsCppTs; } - -.TestWasm-button { - width:80px; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.html --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ - - - - - - - - Javascript to WASM message passing - - - - -
- - -
-
- -
-
- -
-
- -
- -
- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
- - - - - - -
- - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.ts --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/testWasmIntegrated/testWasmIntegrated.ts Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -var SendMessageToCpp: Function = null; -export var TestWasmIntegratedModule : any; - -import * as TestStoneCodeGen from './build-wasm/TestStoneCodeGen_generated' - -/* -+--------------------------------------------------+ -| install emscripten handlers | -+--------------------------------------------------+ -*/ - -// ( window).Module = { -// preRun: [ -// function() { -// console.log('Loading the Stone Framework using WebAssembly'); -// } -// ], -// postRun: [ -// function() { -// // This function is called by ".js" wrapper once the ".wasm" -// // WebAssembly module has been loaded and compiled by the -// // browser -// console.log('WebAssembly is ready'); -// // window.SendMessageToCpp = ( window).Module.cwrap('SendMessageToCpp', 'string', ['string']); -// // window.SendFreeTextToCpp = ( window).Module.cwrap('SendFreeTextToCpp', 'string', ['string']); -// } -// ], -// print: function(text : string) { -// console.log(text); -// }, -// printErr: function(text : string) { -// console.error(text); -// }, -// totalDependencies: 0 -// }; - -/* -+--------------------------------------------------+ -| install handlers | -+--------------------------------------------------+ -*/ -document.querySelectorAll(".TestWasm-button").forEach((e) => { - (e as HTMLButtonElement).addEventListener("click", () => { - ButtonClick(e.attributes["tool-selector"].value); - }); -}); - -/* -+--------------------------------------------------+ -| define stock messages | -+--------------------------------------------------+ -*/ -let schemaText: string = null; -fetch("testTestStoneCodeGen.yaml").then(function(res) {return res.text();}).then(function(text) {schemaText = text;}); - -let stockSerializedMessages = new Map(); -stockSerializedMessages["Test CppHandler message2"] = null; -fetch("cppHandler_test_Message2.json").then(function(res) {return res.text();}).then(function(text) {stockSerializedMessages["Test CppHandler message2"] = text;}); - -stockSerializedMessages["Test 2"] = ` { - "type" : "TestStoneCodeGen.Message1", - "value" : { - "memberInt32" : -987, - "memberString" : "SalomΓ©", - "memberEnumMonth" : "March", - "memberBool" : true, - "memberFloat32" : 0.1, - "memberFloat64" : -0.2, - "extraMember" : "don't care" - } -}`; -stockSerializedMessages["Test 3"] = "Test 3 stock message sdfsfsdfsdf"; -stockSerializedMessages["Test 4"] = "Test 4 stock message 355345345"; -stockSerializedMessages["Test 5"] = "Test 5 stock message 34535"; -stockSerializedMessages["Test 6"] = "Test 6 stock message xcvcxvx"; -stockSerializedMessages["Test 7"] = "Test 7 stock message fgwqewqdgg"; -stockSerializedMessages["Test 8"] = "Test 8 stock message fgfsdfsdgg"; - -/* -+--------------------------------------------------+ -| define handler | -+--------------------------------------------------+ -*/ - -function setSerializedInputValue(text: string) { - let e : HTMLTextAreaElement = document.getElementById('TestWasm-SerializedInput') as HTMLTextAreaElement; - e.value = text; -} - -function getSerializedInputValue(): string { - let e : HTMLTextAreaElement = document.getElementById('TestWasm-SerializedInput') as HTMLTextAreaElement; - return e.value; -} - -function setCppOutputValue(text: string) { - let e : HTMLTextAreaElement = document.getElementById('TestWasm-CppOutput') as HTMLTextAreaElement; - e.value = text; -} - -function getCppOutputValue(): string { - let e : HTMLTextAreaElement = document.getElementById('TestWasm-CppOutput') as HTMLTextAreaElement; - return e.value; -} - -function SendFreeTextFromCpp(txt: string):string -{ - setCppOutputValue(getCppOutputValue() + "\n" + txt); - return ""; -} -( window).SendFreeTextFromCpp = SendFreeTextFromCpp; - -var referenceMessages = Array(); - -function testTsCppTs() { - var r = new TestStoneCodeGen.Message2(); - r.memberEnumMovieType = TestStoneCodeGen.MovieType.RomCom; - r.memberStringWithDefault = "overriden"; - r.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives] = 0.5; - r.memberString = "reference-messsage2-test1"; - - referenceMessages[r.memberString] = r; - var strMsg2 = r.StoneSerialize(); - let SendMessageToCppForEchoLocal = ( window).Module.cwrap('SendMessageToCppForEcho', 'string', ['string']); - SendMessageToCppForEchoLocal(strMsg2); -} - -class MyEchoHandler implements TestStoneCodeGen.IHandler -{ - public HandleMessage2(value: TestStoneCodeGen.Message2): boolean - { - if (value.memberString in referenceMessages) { - let r = referenceMessages[value.memberString]; - let equals = (value.memberStringWithDefault == r.memberStringWithDefault); - if (TestStoneCodeGen.CrispType.CreamAndChives in r.memberMapEnumFloat) { - equals == equals && r.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives] == value.memberMapEnumFloat[TestStoneCodeGen.CrispType.CreamAndChives]; - } - // TODO continue comparison - - if (equals) { - console.log("objects are equals after round trip"); - return true; - } - } - console.log("problem after round trip"); - return true; - } -} - -function SendMessageFromCpp(txt: string):string -{ - setCppOutputValue(getCppOutputValue() + "\n" + txt); - TestStoneCodeGen.StoneDispatchToHandler(txt, new MyEchoHandler()); - return ""; -} -( window).SendMessageFromCpp = SendMessageFromCpp; - - - -function ButtonClick(buttonName: string) { - if (buttonName.startsWith('Test ')) { - setSerializedInputValue(stockSerializedMessages[buttonName]); - } - else if (buttonName == "Test-ts-cpp-ts") { - testTsCppTs(); - } - else if(buttonName == 'Trigger') - { - let serializedInputValue:string = getSerializedInputValue(); - - let SendMessageToCppLocal = ( window).Module.cwrap('SendMessageToCpp', 'string', ['string']); - SendMessageToCppLocal(serializedInputValue); - } - else if(buttonName == 'Clear') - { - setCppOutputValue(""); - } - else if(buttonName == 'ShowSchema') - { - setCppOutputValue(schemaText); - } - else - { - throw new Error("Internal error!"); - } -} - - - -// this method is called "from the C++ code" when the StoneApplication is updated. -// it can be used to update the UI of the application -function UpdateWebApplicationWithString(statusUpdateMessageString: string) { - console.log("updating web application (string): ", statusUpdateMessageString); - let statusUpdateMessage = JSON.parse(statusUpdateMessageString); - - if ("event" in statusUpdateMessage) - { - let eventName = statusUpdateMessage["event"]; - if (eventName == "appStatusUpdated") - { - //ui.onAppStatusUpdated(statusUpdateMessage["data"]); - } - } -} - - -function UpdateWebApplicationWithSerializedMessage(statusUpdateMessageString: string) { - console.log("updating web application (serialized message): ", statusUpdateMessageString); - console.log(""); -} - \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/test2.yaml --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/test2.yaml Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -enum EnumMonth0: - - January - - February - - Month - -struct Message1: - a: int32 - b: string - c: EnumMonth0 - d: bool - -struct Message2: - toto: string - tata: vector - tutu: vector - titi: map - lulu: map diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/testTestStoneCodeGen.yaml --- a/Resources/Graveyard/Deprecated/Resources/CodeGeneration/test_data/testTestStoneCodeGen.yaml Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -# -# 1 2 3 4 5 6 7 8 -# 345678901234567890123456789012345678901234567890123456789012345678901234567890 -# -rootName: TestStoneCodeGen - -struct B: - __handler: cpp - - someAs: vector - someInts: vector - -struct C: - __handler: cpp - - someBs: vector - ddd: vector - -struct A: - __handler: cpp - - someStrings: vector - someInts2: vector - movies: vector - -struct Message1: - __handler: cpp - - memberInt32: int32 - memberString: string - memberEnumMonth: EnumMonth0 - memberBool: bool - memberFloat32: float32 - memberFloat64: float64 - -struct Message2: - __handler: [cpp, ts] - - memberString: string - memberStringWithDefault: string = "my-default-value" - memberVectorOfMessage1: vector - memberVectorOfString: vector - memberMapStringString: map - memberMapStringStruct: map - memberMapEnumFloat: map - memberEnumMovieType: MovieType - memberJson: json - -enum MovieType: - - RomCom - - Horror - - ScienceFiction - - Vegetables - -enum CrispType: - - SaltAndPepper - - CreamAndChives - - Paprika - - Barbecue - -enum EnumMonth0: - - January - - February - - March diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.cpp --- a/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,275 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "BasicScene.h" - -// From Stone -#include "Framework/Scene2D/Scene2D.h" -#include "Framework/Scene2D/ColorTextureSceneLayer.h" -#include "Framework/Scene2D/PolylineSceneLayer.h" -#include "Framework/Scene2D/TextSceneLayer.h" - -#include "Framework/Scene2D/PanSceneTracker.h" -#include "Framework/Scene2D/ZoomSceneTracker.h" -#include "Framework/Scene2D/RotateSceneTracker.h" - -#include "Framework/Scene2D/CairoCompositor.h" - -// From Orthanc framework -#include -#include -#include - -using namespace OrthancStone; - -const unsigned int BASIC_SCENE_FONT_SIZE = 32; -const int BASIC_SCENE_LAYER_POSITION = 150; - -void PrepareScene(Scene2D& scene) -{ - //Scene2D& scene(*controller->GetScene()); - // Texture of 2x2 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - p[3] = 0; - p[4] = 255; - p[5] = 0; - - p = reinterpret_cast(i.GetRow(1)); - p[0] = 0; - p[1] = 0; - p[2] = 255; - - p[3] = 255; - p[4] = 0; - p[5] = 0; - - scene.SetLayer(12, new ColorTextureSceneLayer(i)); - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-3, 2); - l->SetPixelSpacing(1.5, 1); - l->SetAngle(20.0 / 180.0 * 3.14); - scene.SetLayer(14, l.release()); - } - - // Texture of 1x1 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-2, 1); - l->SetAngle(20.0 / 180.0 * 3.14); - scene.SetLayer(13, l.release()); - } - - // Some lines - { - std::unique_ptr layer(new PolylineSceneLayer); - - layer->SetThickness(1); - - PolylineSceneLayer::Chain chain; - chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); - chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); - layer->AddChain(chain, true, 255, 0, 0); - - chain.clear(); - chain.push_back(ScenePoint2D(-5, -5)); - chain.push_back(ScenePoint2D(5, -5)); - chain.push_back(ScenePoint2D(5, 5)); - chain.push_back(ScenePoint2D(-5, 5)); - layer->AddChain(chain, true, 0, 255, 0); - - double dy = 1.01; - chain.clear(); - chain.push_back(ScenePoint2D(-4, -4)); - chain.push_back(ScenePoint2D(4, -4 + dy)); - chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); - chain.push_back(ScenePoint2D(4, 2)); - layer->AddChain(chain, false, 0, 0, 255); - - // layer->SetColor(0,255, 255); - scene.SetLayer(50, layer.release()); - } - - // Some text - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetText("Hello"); - scene.SetLayer(100, layer.release()); - } -} - -#if ORTHANC_SANDBOXED == 0 -void TakeScreenshot(const std::string& target, - const OrthancStone::Scene2D& scene, - unsigned int canvasWidth, - unsigned int canvasHeight) -{ - using namespace OrthancStone; - // Take a screenshot, then save it as PNG file - CairoCompositor compositor(scene, canvasWidth, canvasHeight); - compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); - compositor.Refresh(); - - Orthanc::ImageAccessor canvas; - compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); - Orthanc::ImageProcessing::Convert(png, canvas); - - Orthanc::PngWriter writer; - writer.WriteToFile(target, png); -} -#endif - -void ShowCursorInfo(Scene2D& scene, const PointerEvent& pointerEvent) -{ - ScenePoint2D p = pointerEvent.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - - char buf[64]; - sprintf(buf, "(%0.02f,%0.02f)", p.GetX(), p.GetY()); - - if (scene.HasLayer(BASIC_SCENE_LAYER_POSITION)) - { - TextSceneLayer& layer = - dynamic_cast(scene.GetLayer(BASIC_SCENE_LAYER_POSITION)); - layer.SetText(buf); - layer.SetPosition(p.GetX(), p.GetY()); - } - else - { - std::unique_ptr - layer(new TextSceneLayer); - layer->SetColor(0, 255, 0); - layer->SetText(buf); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_BottomCenter); - layer->SetPosition(p.GetX(), p.GetY()); - scene.SetLayer(BASIC_SCENE_LAYER_POSITION, layer.release()); - } -} - - - -bool BasicScene2DInteractor::OnMouseEvent(const GuiAdapterMouseEvent& event, const PointerEvent& pointerEvent) -{ - if (currentTracker_.get() != NULL) - { - switch (event.type) - { - case GUIADAPTER_EVENT_MOUSEUP: - { - currentTracker_->PointerUp(pointerEvent); - if (!currentTracker_->IsAlive()) - { - currentTracker_.reset(); - } - };break; - case GUIADAPTER_EVENT_MOUSEMOVE: - { - currentTracker_->PointerMove(pointerEvent); - };break; - default: - return false; - } - return true; - } - else if (event.type == GUIADAPTER_EVENT_MOUSEDOWN) - { - if (event.button == GUIADAPTER_MOUSEBUTTON_LEFT) - { - currentTracker_.reset(new RotateSceneTracker(viewportController_, pointerEvent)); - } - else if (event.button == GUIADAPTER_MOUSEBUTTON_MIDDLE) - { - currentTracker_.reset(new PanSceneTracker(viewportController_, pointerEvent)); - } - else if (event.button == GUIADAPTER_MOUSEBUTTON_RIGHT) - { - currentTracker_.reset(new ZoomSceneTracker(viewportController_, pointerEvent, viewportController_->GetViewport().GetCanvasHeight())); - } - } - else if (event.type == GUIADAPTER_EVENT_MOUSEMOVE) - { - if (showCursorInfo_) - { - Scene2D& scene(viewportController_->GetScene()); - ShowCursorInfo(scene, pointerEvent); - } - return true; - } - return false; -} - -bool BasicScene2DInteractor::OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) -{ - if (guiEvent.type == GUIADAPTER_EVENT_KEYDOWN) - { - switch (guiEvent.sym[0]) - { - case 's': - { - //viewportController_->FitContent(viewportController_->GetViewport().GetCanvasWidth(), viewportController_->GetViewport().GetCanvasHeight()); - viewportController_->FitContent(); - return true; - }; -#if ORTHANC_SANDBOXED == 0 - case 'c': - { - Scene2D& scene(viewportController_->GetScene()); - TakeScreenshot("screenshot.png", scene, viewportController_->GetViewport().GetCanvasWidth(), viewportController_->GetViewport().GetCanvasHeight()); - return true; - } -#endif - case 'd': - { - showCursorInfo_ = !showCursorInfo_; - if (!showCursorInfo_) - { - Scene2D& scene(viewportController_->GetScene()); - scene.DeleteLayer(BASIC_SCENE_LAYER_POSITION); - } - - return true; - } - } - } - return false; -} - -bool BasicScene2DInteractor::OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) -{ - return false; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.h --- a/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/BasicScene.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#pragma once - -#include -#include "Framework/Scene2DViewport/ViewportController.h" -#include "Framework/Scene2D/Scene2D.h" - -extern const unsigned int BASIC_SCENE_FONT_SIZE; -extern const int BASIC_SCENE_LAYER_POSITION; - -extern void PrepareScene(OrthancStone::Scene2D& scene); -extern void TakeScreenshot(const std::string& target, - const OrthancStone::Scene2D& scene, - unsigned int canvasWidth, - unsigned int canvasHeight); - - -#include "Applications/Generic/Scene2DInteractor.h" -#include "Framework/Scene2DViewport/IFlexiblePointerTracker.h" - - -class BasicScene2DInteractor : public OrthancStone::Scene2DInteractor -{ - boost::shared_ptr currentTracker_; - bool showCursorInfo_; -public: - BasicScene2DInteractor(boost::shared_ptr viewportController) : - Scene2DInteractor(viewportController), - showCursorInfo_(false) - {} - - virtual bool OnMouseEvent(const OrthancStone::GuiAdapterMouseEvent& event, const OrthancStone::PointerEvent& pointerEvent) override; - virtual bool OnKeyboardEvent(const OrthancStone::GuiAdapterKeyboardEvent& guiEvent) override; - virtual bool OnWheelEvent(const OrthancStone::GuiAdapterWheelEvent& guiEvent) override; -}; - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainQt.cpp --- a/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainQt.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#define GLEW_STATIC 1 -// From Stone -#include "../../Framework/OpenGL/OpenGLIncludes.h" -#include "../../Applications/Sdl/SdlWindow.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/Scene2D.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" - -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Messages/MessageBroker.h" - -// From Orthanc framework -#include -#include -#include -#include -#include - -#include -#include -#include "EmbeddedResources.h" - -#include -#include -#include - -#include "BasicScene.h" - - -using namespace OrthancStone; - - - -static void GLAPIENTRY OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam ) -{ - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), - type, severity, message ); - } -} - -extern void InitGL(); - -#include -#include "BasicSceneWindow.h" - -int main(int argc, char* argv[]) -{ - QApplication a(argc, argv); - - OrthancStone::Samples::BasicSceneWindow window; - window.show(); - window.GetOpenGlWidget().Init(); - - MessageBroker broker; - boost::shared_ptr undoStack(new UndoStack); - boost::shared_ptr controller = boost::make_shared(undoStack, boost::ref(broker), window.GetOpenGlWidget()); - PrepareScene(controller->GetScene()); - - window.GetOpenGlWidget().GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); - - boost::shared_ptr interactor(new BasicScene2DInteractor(controller)); - window.GetOpenGlWidget().SetInteractor(interactor); - - controller->FitContent(); - - return a.exec(); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainSdl.cpp --- a/Resources/Graveyard/Deprecated/Samples/MultiPlatform/BasicScene/mainSdl.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,199 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -// From Stone -#include "Framework/Viewport/SdlViewport.h" -#include "Framework/Scene2D/OpenGLCompositor.h" -#include "Framework/Scene2DViewport/UndoStack.h" -#include "Framework/StoneInitialization.h" -#include "Framework/Messages/MessageBroker.h" - -// From Orthanc framework -#include -#include - -#include -#include - -#include -#include - - -#include "BasicScene.h" - -using namespace OrthancStone; - -boost::shared_ptr interactor; - -void HandleApplicationEvent(boost::shared_ptr controller, - const SDL_Event& event) -{ - using namespace OrthancStone; - Scene2D& scene(controller->GetScene()); - if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP || event.type == SDL_MOUSEMOTION) - { - // TODO: this code is copy/pasted from GuiAdapter::Run() -> find the right place - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - bool ctrlPressed(false); - bool shiftPressed(false); - bool altPressed(false); - - if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) - ctrlPressed = true; - if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) - shiftPressed = true; - if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) - altPressed = true; - - GuiAdapterMouseEvent guiEvent; - ConvertFromPlatform(guiEvent, ctrlPressed, shiftPressed, altPressed, event); - PointerEvent pointerEvent; - pointerEvent.AddPosition(controller->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); - - interactor->OnMouseEvent(guiEvent, pointerEvent); - return; - } - else if ((event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) && event.key.repeat == 0 /* Ignore key bounce */) - { - GuiAdapterKeyboardEvent guiEvent; - ConvertFromPlatform(guiEvent, event); - - interactor->OnKeyboardEvent(guiEvent); - } - -} - - -static void GLAPIENTRY -OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam ) -{ - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), - type, severity, message ); - } -} - - -void Run(boost::shared_ptr controller) -{ - SdlViewport& sdlViewport = dynamic_cast(controller->GetViewport()); - - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); - - controller->GetViewport().GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); - - controller->GetViewport().Refresh(); - controller->FitContent(); - - - bool stop = false; - while (!stop) - { - controller->GetViewport().Refresh(); - - SDL_Event event; - while (!stop && - SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - { - stop = true; - break; - } - else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) - { - sdlViewport.UpdateSize(event.window.data1, event.window.data2); - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - sdlViewport.GetWindow().ToggleMaximize(); - break; - - case SDLK_q: - stop = true; - break; - - default: - break; - } - } - - HandleApplicationEvent(controller, event); - } - - SDL_Delay(1); - } - interactor.reset(); -} - - - - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - using namespace OrthancStone; - StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); - - try - { - SdlOpenGLViewport viewport("Hello", 1024, 768); - MessageBroker broker; - boost::shared_ptr undoStack(new UndoStack); - boost::shared_ptr controller = boost::make_shared(undoStack, boost::ref(broker), boost::ref(viewport)); - interactor.reset(new BasicScene2DInteractor(controller)); - PrepareScene(controller->GetScene()); - Run(controller); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - StoneFinalize(); - - return 0; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.cpp --- a/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "../../Framework/OpenGL/OpenGLIncludes.h" -#include "BasicSceneWindow.h" - -/** - * Don't use "ui_MainWindow.h" instead of below, as - * this makes CMake unable to detect when the UI file changes. - **/ -#include -#include "../../Applications/Samples/SampleApplicationBase.h" - -namespace OrthancStone -{ - namespace Samples - { - - BasicSceneWindow::BasicSceneWindow( - QWidget *parent) : - ui_(new Ui::BasicSceneWindow) - { - ui_->setupUi(this); - } - - BasicSceneWindow::~BasicSceneWindow() - { - delete ui_; - } - - QStoneOpenGlWidget& BasicSceneWindow::GetOpenGlWidget() - { - return *(ui_->centralWidget); - } - - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.h --- a/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once -#include -#include -// #include "../../Qt/QCairoWidget.h" -// #include "../../Qt/QStoneMainWindow.h" - -namespace Ui -{ - class BasicSceneWindow; -} - -namespace OrthancStone -{ - namespace Samples - { - - //class SampleSingleCanvasApplicationBase; - - class BasicSceneWindow : public QMainWindow - { - Q_OBJECT - - private: - Ui::BasicSceneWindow* ui_; - //SampleSingleCanvasApplicationBase& stoneSampleApplication_; - - public: - explicit BasicSceneWindow(QWidget *parent = 0); - ~BasicSceneWindow(); - - QStoneOpenGlWidget& GetOpenGlWidget(); - }; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.ui --- a/Resources/Graveyard/Deprecated/Samples/Qt/BasicSceneWindow.ui Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - - BasicSceneWindow - - - - 0 - 0 - 903 - 634 - - - - - 500 - 300 - - - - - 500 - 300 - - - - Stone of Orthanc - - - Qt::LeftToRight - - - - - 0 - 0 - - - - Qt::LeftToRight - - - - QLayout::SetDefaultConstraint - - - - - - 0 - 500 - - - - - - - - - - 0 - 0 - 903 - 21 - - - - - Test - - - - - - - - - QStoneOpenGlWidget - QWidget -
QStoneOpenGlWidget.h
-
-
- - -
diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Samples/Qt/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -##################################################################### -## Configuration of the Orthanc framework -##################################################################### - -# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it -# must be the first inclusion -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.5.7") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - - -##################################################################### -## Configuration of the Stone framework -##################################################################### - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -set(ORTHANC_STONE_APPLICATION_RESOURCES - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) -SET(ENABLE_QT ON) -SET(ENABLE_SDL OFF) -SET(ENABLE_WEB_CLIENT ON) -SET(ORTHANC_SANDBOXED OFF) -LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) - -add_definitions( - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - ) -##################################################################### -## Build the samples -##################################################################### - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - -list(APPEND BASIC_SCENE_APPLICATIONS_SOURCES - BasicSceneWindow.cpp - ) - -ORTHANC_QT_WRAP_UI(BASIC_SCENE_APPLICATIONS_SOURCES - BasicSceneWindow.ui - ) - -ORTHANC_QT_WRAP_CPP(BASIC_SCENE_APPLICATIONS_SOURCES - BasicSceneWindow.h - QStoneOpenGlWidget.h - ) - -add_executable(MpBasicScene - ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/BasicScene.h - ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/BasicScene.cpp - ${CMAKE_CURRENT_LIST_DIR}/../MultiPlatform/BasicScene/mainQt.cpp - QStoneOpenGlWidget.cpp - ${BASIC_SCENE_APPLICATIONS_SOURCES} - ) - -target_include_directories(MpBasicScene PUBLIC ${CMAKE_SOURCE_DIR} ${ORTHANC_STONE_ROOT}) -target_link_libraries(MpBasicScene OrthancStone) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.cpp --- a/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "../../Framework/OpenGL/OpenGLIncludes.h" -#include "QStoneOpenGlWidget.h" - -#include - -using namespace OrthancStone; - -void QStoneOpenGlWidget::initializeGL() -{ - glewInit(); -} - -void QStoneOpenGlWidget::MakeCurrent() -{ - this->makeCurrent(); -} - -void QStoneOpenGlWidget::resizeGL(int w, int h) -{ - -} - -void QStoneOpenGlWidget::paintGL() -{ - if (compositor_) - { - compositor_->Refresh(); - } - doneCurrent(); -} - -void ConvertFromPlatform( - OrthancStone::GuiAdapterMouseEvent& guiEvent, - PointerEvent& pointerEvent, - const QMouseEvent& qtEvent, - const IViewport& viewport) -{ - guiEvent.targetX = qtEvent.x(); - guiEvent.targetY = qtEvent.y(); - pointerEvent.AddPosition(viewport.GetPixelCenterCoordinates(guiEvent.targetX, guiEvent.targetY)); - - switch (qtEvent.button()) - { - case Qt::LeftButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_LEFT; break; - case Qt::MiddleButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_MIDDLE; break; - case Qt::RightButton: guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_RIGHT; break; - default: - guiEvent.button = OrthancStone::GUIADAPTER_MOUSEBUTTON_LEFT; - } - - if (qtEvent.modifiers().testFlag(Qt::ShiftModifier)) - { - guiEvent.shiftKey = true; - } - if (qtEvent.modifiers().testFlag(Qt::ControlModifier)) - { - guiEvent.ctrlKey = true; - } - if (qtEvent.modifiers().testFlag(Qt::AltModifier)) - { - guiEvent.altKey = true; - } -} - -void QStoneOpenGlWidget::mouseEvent(QMouseEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType) -{ - OrthancStone::GuiAdapterMouseEvent guiEvent; - PointerEvent pointerEvent; - ConvertFromPlatform(guiEvent, pointerEvent, *qtEvent, *this); - guiEvent.type = guiEventType; - - if (sceneInteractor_.get() != NULL && compositor_.get() != NULL) - { - sceneInteractor_->OnMouseEvent(guiEvent, pointerEvent); - } - - // force redraw of the OpenGL widget - update(); -} - -void QStoneOpenGlWidget::mousePressEvent(QMouseEvent* qtEvent) -{ - mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEDOWN); -} - -void QStoneOpenGlWidget::mouseMoveEvent(QMouseEvent* qtEvent) -{ - mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEMOVE); -} - -void QStoneOpenGlWidget::mouseReleaseEvent(QMouseEvent* qtEvent) -{ - mouseEvent(qtEvent, GUIADAPTER_EVENT_MOUSEUP); -} - -void ConvertFromPlatform( - OrthancStone::GuiAdapterKeyboardEvent& guiEvent, - const QKeyEvent& qtEvent) -{ - if (qtEvent.text().length() > 0) - { - guiEvent.sym[0] = qtEvent.text()[0].cell(); - } - else - { - guiEvent.sym[0] = 0; - } - guiEvent.sym[1] = 0; - - if (qtEvent.modifiers().testFlag(Qt::ShiftModifier)) - { - guiEvent.shiftKey = true; - } - if (qtEvent.modifiers().testFlag(Qt::ControlModifier)) - { - guiEvent.ctrlKey = true; - } - if (qtEvent.modifiers().testFlag(Qt::AltModifier)) - { - guiEvent.altKey = true; - } - -} - - -bool QStoneOpenGlWidget::keyEvent(QKeyEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType) -{ - bool handled = false; - OrthancStone::GuiAdapterKeyboardEvent guiEvent; - ConvertFromPlatform(guiEvent, *qtEvent); - guiEvent.type = guiEventType; - - if (sceneInteractor_.get() != NULL && compositor_.get() != NULL) - { - handled = sceneInteractor_->OnKeyboardEvent(guiEvent); - - if (handled) - { - // force redraw of the OpenGL widget - update(); - } - } - return handled; -} - -void QStoneOpenGlWidget::keyPressEvent(QKeyEvent *qtEvent) -{ - bool handled = keyEvent(qtEvent, GUIADAPTER_EVENT_KEYDOWN); - if (!handled) - { - QOpenGLWidget::keyPressEvent(qtEvent); - } -} - -void QStoneOpenGlWidget::keyReleaseEvent(QKeyEvent *qtEvent) -{ - bool handled = keyEvent(qtEvent, GUIADAPTER_EVENT_KEYUP); - if (!handled) - { - QOpenGLWidget::keyPressEvent(qtEvent); - } -} - -void QStoneOpenGlWidget::wheelEvent(QWheelEvent *qtEvent) -{ - OrthancStone::GuiAdapterWheelEvent guiEvent; - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - - // force redraw of the OpenGL widget - update(); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.h --- a/Resources/Graveyard/Deprecated/Samples/Qt/QStoneOpenGlWidget.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once -#include "../../Framework/OpenGL/OpenGLIncludes.h" -#include -#include -#include - -#include -#include "../../Framework/OpenGL/IOpenGLContext.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Viewport/ViewportBase.h" -#include "../../Applications/Generic/Scene2DInteractor.h" - -namespace OrthancStone -{ - class QStoneOpenGlWidget : - public QOpenGLWidget, - public OpenGL::IOpenGLContext, - public ViewportBase - { - std::unique_ptr compositor_; - boost::shared_ptr sceneInteractor_; - QOpenGLContext openGlContext_; - - public: - QStoneOpenGlWidget(QWidget *parent) : - QOpenGLWidget(parent), - ViewportBase("QtStoneOpenGlWidget") // TODO: we shall be able to define a name but construction time is too early ! - { - setFocusPolicy(Qt::StrongFocus); // to enable keyPressEvent - setMouseTracking(true); // to enable mouseMoveEvent event when no button is pressed - } - - void Init() - { - QSurfaceFormat requestedFormat; - requestedFormat.setVersion( 2, 0 ); - openGlContext_.setFormat( requestedFormat ); - openGlContext_.create(); - openGlContext_.makeCurrent(context()->surface()); - - compositor_.reset(new OpenGLCompositor(*this, GetScene())); - } - - protected: - - //**** QWidget overrides - void initializeGL() override; - void resizeGL(int w, int h) override; - void paintGL() override; - - void mousePressEvent(QMouseEvent* event) override; - void mouseMoveEvent(QMouseEvent* event) override; - void mouseReleaseEvent(QMouseEvent* event) override; - void keyPressEvent(QKeyEvent* event) override; - void keyReleaseEvent(QKeyEvent *event) override; - void wheelEvent(QWheelEvent* event) override; - - //**** IOpenGLContext overrides - - virtual void MakeCurrent() override; - virtual void SwapBuffer() override {} - - virtual unsigned int GetCanvasWidth() const override - { - return this->width(); - } - - virtual unsigned int GetCanvasHeight() const override - { - return this->height(); - } - - public: - - void SetInteractor(boost::shared_ptr sceneInteractor) - { - sceneInteractor_ = sceneInteractor; - } - - virtual ICompositor& GetCompositor() - { - return *compositor_; - } - - protected: - void mouseEvent(QMouseEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType); - bool keyEvent(QKeyEvent* qtEvent, OrthancStone::GuiAdapterHidEventType guiEventType); - - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.cpp --- a/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "Scene2DInteractor.h" - -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" - - -namespace OrthancStone -{ - -} - -using namespace OrthancStone; - - -bool BasicScene2DInteractor::OnMouseEvent(const GuiAdapterMouseEvent& event, const PointerEvent& pointerEvent) -{ - if (currentTracker_.get() != NULL) - { - switch (event.type) - { - case GUIADAPTER_EVENT_MOUSEUP: - { - currentTracker_->PointerUp(pointerEvent); - if (!currentTracker_->IsAlive()) - { - currentTracker_.reset(); - } - };break; - case GUIADAPTER_EVENT_MOUSEMOVE: - { - currentTracker_->PointerMove(pointerEvent); - };break; - } - return true; - } - else - { - if (event.button == GUIADAPTER_MOUSEBUTTON_LEFT) - { - currentTracker_.reset(new RotateSceneTracker(viewportController_, pointerEvent)); - } - else if (event.button == GUIADAPTER_MOUSEBUTTON_MIDDLE) - { - currentTracker_.reset(new PanSceneTracker(viewportController_, pointerEvent)); - } - else if (event.button == GUIADAPTER_MOUSEBUTTON_RIGHT && compositor_.get() != NULL) - { - currentTracker_.reset(new ZoomSceneTracker(viewportController_, pointerEvent, compositor_->GetHeight())); - } - return true; - } - return false; -} - -bool BasicScene2DInteractor::OnKeyboardEvent(const GuiAdapterKeyboardEvent& guiEvent) -{ - switch (guiEvent.sym[0]) - { - case 's': - { - viewportController_->FitContent(compositor_->GetWidth(), compositor_->GetHeight()); - return true; - }; - } - return false; -} - -bool BasicScene2DInteractor::OnWheelEvent(const GuiAdapterWheelEvent& guiEvent) -{ - return false; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.h --- a/Resources/Graveyard/Deprecated/Samples/Qt/Scene2DInteractor.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Applications/Generic/Scene2DInteractor.h" -#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" - - -class BasicScene2DInteractor : public OrthancStone::Scene2DInteractor -{ - boost::shared_ptr currentTracker_; -public: - BasicScene2DInteractor(boost::shared_ptr viewportController) : - Scene2DInteractor(viewportController) - {} - - virtual bool OnMouseEvent(const OrthancStone::GuiAdapterMouseEvent& event, const OrthancStone::PointerEvent& pointerEvent) override; - virtual bool OnKeyboardEvent(const OrthancStone::GuiAdapterKeyboardEvent& guiEvent); - virtual bool OnWheelEvent(const OrthancStone::GuiAdapterWheelEvent& guiEvent); -}; - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/README.md --- a/Resources/Graveyard/Deprecated/Samples/README.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,195 +0,0 @@ - -**These samples are deprecated and not guaranteed to work. A migration to a -new version of the Stone API is underway.** - -Please read orthanc-stone/Samples/README.md first for general requirements. - - - -Deprecated -- to be sorted -=========================== - -The following assumes that the source code to be downloaded in -`~/orthanc-stone` and Orthanc source code to be checked out in -`~/orthanc`. - -Building the WASM samples -------------------------------------- - -``` -cd ~/orthanc-stone/Applications/Samples -./build-wasm.sh -``` - -Serving the WASM samples ------------------------------------- -``` -# launch an Orthanc listening on 8042 port: -Orthanc - -# launch an nginx that will serve the WASM static files and reverse -# proxy -sudo nginx -p $(pwd) -c nginx.local.conf -``` - -You can now open the samples in http://localhost:9977 - -Building the SDL native samples (SimpleViewer only) ---------------------------------------------------- - -The following also assumes that you have checked out the Orthanc -source code in an `orthanc` folder next to the Stone of Orthanc -repository, please enter the following: - -**Simple make generator with dynamic build** - -``` -# Please set $currentDir to the current folder -mkdir -p ~/builds/orthanc-stone-build -cd ~/builds/orthanc-stone-build -cmake -DORTHANC_FRAMEWORK_SOURCE=path \ - -DORTHANC_FRAMEWORK_ROOT=$currentDir/../../../orthanc \ - -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON \ - ~/orthanc-stone/Applications/Samples/ -``` - -**Ninja generator with static SDL build (pwsh script)** - -``` -# Please yourself one level above the orthanc-stone and orthanc folders -if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } -cd stone_build_sdl -cmake -G Ninja -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ -``` - -**Ninja generator with static SDL build (bash/zsh script)** - -``` -# Please yourself one level above the orthanc-stone and orthanc folders -if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } -cd stone_build_sdl -cmake -G Ninja -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="`pwd`/../orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ -``` - -**Visual Studio 2017 generator with static SDL build (pwsh script)** - -``` -# The following will use Visual Studio 2017 to build the SDL samples -# in debug mode (with multiple compilers in parallel). NOTE: place -# yourself one level above the `orthanc-stone` and `orthanc` folders - -if( -not (test-path stone_build_sdl)) { mkdir stone_build_sdl } -cd stone_build_sdl -cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples/ -cmake --build . --config Debug -``` - -If you are working on Windows, add the correct generator option to -cmake to, for instance, generate msbuild files for Visual Studio. - -Then, under Linux: -``` -cmake --build . --target OrthancStoneSimpleViewer -- -j 5 -``` - -Note: replace `$($pwd)` with the current directory when not using Powershell - -Building the Qt native samples (SimpleViewer only) under Windows: ------------------------------------------------------------------- - -**Visual Studio 2017 generator with static Qt build (pwsh script)** - -For instance, if Qt is installed in `C:\Qt\5.12.0\msvc2017_64` - -``` -# The following will use Visual Studio 2017 to build the SDL samples -# in debug mode (with multiple compilers in parallel). NOTE: place -# yourself one level above the `orthanc-stone` and `orthanc` folders - -if( -not (test-path stone_build_qt)) { mkdir stone_build_qt } -cd stone_build_qt -cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DCMAKE_PREFIX_PATH=C:\Qt\5.12.0\msvc2017_64 -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_QT=ON ../orthanc-stone/Applications/Samples/ -cmake --build . --config Debug -``` - -Note: replace `$($pwd)` with the current directory when not using Powershell - - - - - - -Building the SDL native samples (SimpleViewer only) under Windows: ------------------------------------------------------------------- -`cmake -DSTATIC_BUILD=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON -G "Visual Studio 15 2017 Win64" ../orthanc-stone/Applications/Samples/` - -Note: replace `$($pwd)` with the current directory when not using Powershell - -Executing the native samples: --------------------------------- -``` -# launch an Orthanc listening on 8042 port: -Orthanc - -# launch the sample -./OrthancStoneSimpleViewer --studyId=XX -``` - -Build the Application Samples ------------------------------ - -**Visual Studio 2008 (v90) ** - -``` -cmake -G "Visual Studio 9 2008" -DUSE_LEGACY_JSONCPP=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples -``` - -**Visual Studio 2019 (v142) ** - -``` -cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples -``` - -**Visual Studio 2017 (v140) ** - -``` -cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Applications/Samples -``` - - -Build the core Samples ---------------------------- -How to build the newest (2019-04-29) SDL samples under Windows, *inside* a -folder that is sibling to the orthanc-stone folder: - -**Visual Studio 2019 (v142) ** - -``` -cmake -G "Visual Studio 16 2019" -A x64 -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl -``` - -**Visual Studio 2017 (v140) ** - -``` -cmake -G "Visual Studio 15 2017 Win64" -DMSVC_MULTIPLE_PROCESSES=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl -``` - -**Visual Studio 2008 (v90) ** - -``` -cmake -G "Visual Studio 9 2008" -DUSE_LEGACY_JSONCPP=ON -DENABLE_OPENGL=ON -DSTATIC_BUILD=ON -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="$($pwd)\..\orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl -``` - -And under Ubuntu (note the /mnt/c/osi/dev/orthanc folder): -``` -cmake -G "Ninja" -DENABLE_OPENGL=ON -DSTATIC_BUILD=OFF -DOPENSSL_NO_CAPIENG=ON -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT="/mnt/c/osi/dev/orthanc" -DALLOW_DOWNLOADS=ON -DENABLE_SDL=ON ../orthanc-stone/Samples/Sdl -``` - -TODO trackers: -- CANCELLED (using outlined text now) text overlay 50% --> ColorTextureLayer 50% -- DONE angle tracker: draw arcs -- Handles on arc -- Select measure tool with hit test --> Delete command - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/BasicScene.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/BasicScene.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,418 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -// From Stone -#include "../../Framework/Viewport/SdlViewport.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" - -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Messages/MessageBroker.h" - -// From Orthanc framework -#include -#include -#include -#include -#include - -#include - -#include -#include - -static const unsigned int FONT_SIZE = 32; -static const int LAYER_POSITION = 150; - -#define OPENGL_ENABLED 0 - -void PrepareScene(OrthancStone::Scene2D& scene) -{ - using namespace OrthancStone; - - // Texture of 2x2 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - p[3] = 0; - p[4] = 255; - p[5] = 0; - - p = reinterpret_cast(i.GetRow(1)); - p[0] = 0; - p[1] = 0; - p[2] = 255; - - p[3] = 255; - p[4] = 0; - p[5] = 0; - - scene.SetLayer(12, new ColorTextureSceneLayer(i)); - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-3, 2); - l->SetPixelSpacing(1.5, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - scene.SetLayer(14, l.release()); - } - - // Texture of 1x1 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-2, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - scene.SetLayer(13, l.release()); - } - - // Some lines - { - std::unique_ptr layer(new PolylineSceneLayer); - - layer->SetThickness(10); - - PolylineSceneLayer::Chain chain; - chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); - chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); - layer->AddChain(chain, true, 255, 0, 0); - - chain.clear(); - chain.push_back(ScenePoint2D(-5, -5)); - chain.push_back(ScenePoint2D(5, -5)); - chain.push_back(ScenePoint2D(5, 5)); - chain.push_back(ScenePoint2D(-5, 5)); - layer->AddChain(chain, true, 0, 255, 0); - - double dy = 1.01; - chain.clear(); - chain.push_back(ScenePoint2D(-4, -4)); - chain.push_back(ScenePoint2D(4, -4 + dy)); - chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); - chain.push_back(ScenePoint2D(4, 2)); - layer->AddChain(chain, false, 0, 0, 255); - - scene.SetLayer(50, layer.release()); - } - - // Some text - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetText("Hello"); - scene.SetLayer(100, layer.release()); - } -} - - -void TakeScreenshot(const std::string& target, - const OrthancStone::Scene2D& scene, - unsigned int canvasWidth, - unsigned int canvasHeight) -{ - using namespace OrthancStone; - // Take a screenshot, then save it as PNG file - CairoCompositor compositor(scene, canvasWidth, canvasHeight); - compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE, Orthanc::Encoding_Latin1); - compositor.Refresh(); - - Orthanc::ImageAccessor canvas; - compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); - Orthanc::ImageProcessing::Convert(png, canvas); - - Orthanc::PngWriter writer; - writer.WriteToFile(target, png); -} - - -void HandleApplicationEvent(const SDL_Event& event, - boost::shared_ptr& controller, - boost::shared_ptr& activeTracker) -{ - using namespace OrthancStone; - - Scene2D& scene = controller->GetScene(); - IViewport& viewport = controller->GetViewport(); - - if (event.type == SDL_MOUSEMOTION) - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - if (activeTracker.get() == NULL && - SDL_SCANCODE_LCTRL < scancodeCount && - keyboardState[SDL_SCANCODE_LCTRL]) - { - // The "left-ctrl" key is down, while no tracker is present - - PointerEvent e; - e.AddPosition(viewport.GetPixelCenterCoordinates(event.button.x, event.button.y)); - - ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - - char buf[64]; - sprintf(buf, "(%0.02f,%0.02f)", p.GetX(), p.GetY()); - - if (scene.HasLayer(LAYER_POSITION)) - { - TextSceneLayer& layer = - dynamic_cast(scene.GetLayer(LAYER_POSITION)); - layer.SetText(buf); - layer.SetPosition(p.GetX(), p.GetY()); - } - else - { - std::unique_ptr - layer(new TextSceneLayer); - layer->SetColor(0, 255, 0); - layer->SetText(buf); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_BottomCenter); - layer->SetPosition(p.GetX(), p.GetY()); - scene.SetLayer(LAYER_POSITION, layer.release()); - } - } - else - { - scene.DeleteLayer(LAYER_POSITION); - } - } - else if (event.type == SDL_MOUSEBUTTONDOWN) - { - PointerEvent e; - e.AddPosition(viewport.GetPixelCenterCoordinates(event.button.x, event.button.y)); - - switch (event.button.button) - { - case SDL_BUTTON_MIDDLE: - activeTracker = boost::make_shared(controller, e); - break; - - case SDL_BUTTON_RIGHT: - activeTracker = boost::make_shared - (controller, e, viewport.GetCanvasHeight()); - break; - - case SDL_BUTTON_LEFT: - activeTracker = boost::make_shared(controller, e); - break; - - default: - break; - } - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_s: - controller->FitContent(viewport.GetCanvasWidth(), - viewport.GetCanvasHeight()); - break; - - case SDLK_c: - TakeScreenshot("screenshot.png", scene, - viewport.GetCanvasWidth(), - viewport.GetCanvasHeight()); - break; - - default: - break; - } - } -} - -#if OPENGL_ENABLED==1 -static void GLAPIENTRY -OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam ) -{ - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), - type, severity, message ); - } -} -#endif - -void Run(OrthancStone::MessageBroker& broker, - OrthancStone::SdlViewport& viewport) -{ - using namespace OrthancStone; - - boost::shared_ptr controller( - new ViewportController(boost::make_shared(), broker, viewport)); - -#if OPENGL_ENABLED==1 - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); -#endif - - boost::shared_ptr tracker; - - bool firstShown = true; - bool stop = false; - while (!stop) - { - viewport.Refresh(); - - SDL_Event event; - while (!stop && - SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - { - stop = true; - break; - } - else if (event.type == SDL_MOUSEMOTION) - { - if (tracker) - { - PointerEvent e; - e.AddPosition(viewport.GetPixelCenterCoordinates( - event.button.x, event.button.y)); - tracker->PointerMove(e); - } - } - else if (event.type == SDL_MOUSEBUTTONUP) - { - if (tracker) - { - PointerEvent e; - e.AddPosition(viewport.GetPixelCenterCoordinates( - event.button.x, event.button.y)); - tracker->PointerUp(e); - if(!tracker->IsAlive()) - tracker.reset(); - } - } - else if (event.type == SDL_WINDOWEVENT) - { - switch (event.window.event) - { - case SDL_WINDOWEVENT_SIZE_CHANGED: - tracker.reset(); - viewport.UpdateSize(event.window.data1, event.window.data2); - break; - - case SDL_WINDOWEVENT_SHOWN: - if (firstShown) - { - // Once the window is first shown, fit the content to its size - controller->FitContent(viewport.GetCanvasWidth(), viewport.GetCanvasHeight()); - firstShown = false; - } - - break; - - default: - break; - } - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - viewport.GetWindow().ToggleMaximize(); - break; - - case SDLK_q: - stop = true; - break; - - default: - break; - } - } - - HandleApplicationEvent(event, controller, tracker); - } - - SDL_Delay(1); - } -} - - - - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - OrthancStone::StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); - - try - { -#if OPENGL_ENABLED==1 - OrthancStone::SdlOpenGLViewport viewport("Hello", 1024, 768); -#else - OrthancStone::SdlCairoViewport viewport("Hello", 1024, 768); -#endif - PrepareScene(viewport.GetScene()); - - viewport.GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE, Orthanc::Encoding_Latin1); - - OrthancStone::MessageBroker broker; - Run(broker, viewport); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - OrthancStone::StoneFinalize(); - - return 0; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Samples/Sdl/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -##################################################################### -## Configuration of the Orthanc framework -##################################################################### - -# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it -# must be the first inclusion -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.5.7") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - - -##################################################################### -## Configuration of the Stone framework -##################################################################### - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -set(ORTHANC_STONE_APPLICATION_RESOURCES - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -SET(ENABLE_SDL_CONSOLE OFF CACHE BOOL "Enable the use of the MIT-licensed SDL_Console") -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) -SET(ENABLE_SDL ON) -SET(ENABLE_WEB_CLIENT ON) -SET(ORTHANC_SANDBOXED OFF) -LIST(APPEND ORTHANC_BOOST_COMPONENTS program_options) - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) - -add_definitions( - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - ) - - -##################################################################### -## Build the samples -##################################################################### - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - -# -# BasicScene -# - -add_executable(BasicScene - BasicScene.cpp - ) - -target_link_libraries(BasicScene OrthancStone) - -# -# TrackerSample -# - -LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSample.cpp") -LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSampleApp.cpp") -LIST(APPEND TRACKERSAMPLE_SOURCE "TrackerSampleApp.h") - -if (MSVC AND MSVC_VERSION GREATER 1700) - LIST(APPEND TRACKERSAMPLE_SOURCE "cpp.hint") -endif() - -add_executable(TrackerSample - ${TRACKERSAMPLE_SOURCE} - ) - -target_link_libraries(TrackerSample OrthancStone) - -# -# Loader -# - -add_executable(Loader - Loader.cpp - ) - -target_link_libraries(Loader OrthancStone) - -# -# FusionMprSdl -# - -add_executable(FusionMprSdl - FusionMprSdl.cpp - FusionMprSdl.h -) - -target_link_libraries(FusionMprSdl OrthancStone) - -# -# Multiplatform Basic Scene -# - -LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/BasicScene.cpp") -LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/BasicScene.h") -LIST(APPEND MP_BASIC_SCENE_SOURCE "../MultiPlatform/BasicScene/mainSdl.cpp") - -if (MSVC AND MSVC_VERSION GREATER 1700) - LIST(APPEND MP_BASIC_SCENE_SOURCE "cpp.hint") -endif() - -add_executable(MpBasicScene - ${MP_BASIC_SCENE_SOURCE} - ) - -target_include_directories(MpBasicScene PUBLIC ${ORTHANC_STONE_ROOT}) -target_link_libraries(MpBasicScene OrthancStone) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,805 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "FusionMprSdl.h" - -#include "../../Framework/OpenGL/SdlOpenGLContext.h" - -#include "../../Framework/StoneInitialization.h" - -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" - -#include "../../Framework/Scene2DViewport/UndoStack.h" -#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" -#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" -#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" -#include "../../Framework/Scene2DViewport/MeasureTool.h" -#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" - -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../../Framework/Oracle/ThreadedOracle.h" -#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" -#include "../../Framework/Loaders/DicomStructureSetLoader.h" -#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" -#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" -#include "Core/SystemToolbox.h" - -namespace OrthancStone -{ - const char* FusionMprMeasureToolToString(size_t i) - { - static const char* descs[] = { - "FusionMprGuiTool_Rotate", - "FusionMprGuiTool_Pan", - "FusionMprGuiTool_Zoom", - "FusionMprGuiTool_LineMeasure", - "FusionMprGuiTool_CircleMeasure", - "FusionMprGuiTool_AngleMeasure", - "FusionMprGuiTool_EllipseMeasure", - "FusionMprGuiTool_LAST" - }; - if (i >= FusionMprGuiTool_LAST) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); - } - return descs[i]; - } - - Scene2D& FusionMprSdlApp::GetScene() - { - return controller_->GetScene(); - } - - const Scene2D& FusionMprSdlApp::GetScene() const - { - return controller_->GetScene(); - } - - void FusionMprSdlApp::SelectNextTool() - { - currentTool_ = static_cast(currentTool_ + 1); - if (currentTool_ == FusionMprGuiTool_LAST) - currentTool_ = static_cast(0);; - printf("Current tool is now: %s\n", FusionMprMeasureToolToString(currentTool_)); - } - - void FusionMprSdlApp::DisplayInfoText() - { - // do not try to use stuff too early! - ICompositor* pCompositor = &(viewport_.GetCompositor()); - if (pCompositor == NULL) - return; - - std::stringstream msg; - - for (std::map::const_iterator kv = infoTextMap_.begin(); - kv != infoTextMap_.end(); ++kv) - { - msg << kv->first << " : " << kv->second << std::endl; - } - std::string msgS = msg.str(); - - TextSceneLayer* layerP = NULL; - if (GetScene().HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = dynamic_cast( - GetScene().GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); - layerP = &layer; - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layerP = layer.get(); - layer->SetColor(0, 255, 0); - layer->SetFontIndex(1); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_TopLeft); - //layer->SetPosition(0,0); - GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - // position the fixed info text in the upper right corner - layerP->SetText(msgS.c_str()); - double cX = viewport_.GetCompositor().GetCanvasWidth() * (-0.5); - double cY = viewport_.GetCompositor().GetCanvasHeight() * (-0.5); - GetScene().GetCanvasToSceneTransform().Apply(cX,cY); - layerP->SetPosition(cX, cY); - } - - void FusionMprSdlApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) - { - ScenePoint2D p = e.GetMainPosition().Apply(GetScene().GetCanvasToSceneTransform()); - - char buf[128]; - sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", - p.GetX(), p.GetY(), - e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); - - if (GetScene().HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = - dynamic_cast(GetScene().GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); - layer.SetText(buf); - layer.SetPosition(p.GetX(), p.GetY()); - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetColor(0, 255, 0); - layer->SetText(buf); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_BottomCenter); - layer->SetPosition(p.GetX(), p.GetY()); - GetScene().SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - } - - void FusionMprSdlApp::HideInfoText() - { - GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); - } - - void FusionMprSdlApp::HandleApplicationEvent( - const SDL_Event & event) - { - DisplayInfoText(); - - if (event.type == SDL_MOUSEMOTION) - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - if (activeTracker_.get() == NULL && - SDL_SCANCODE_LALT < scancodeCount && - keyboardState[SDL_SCANCODE_LALT]) - { - // The "left-ctrl" key is down, while no tracker is present - // Let's display the info text - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - - DisplayFloatingCtrlInfoText(e); - } - else - { - HideInfoText(); - //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)"; - if (activeTracker_.get() != NULL) - { - //LOG(TRACE) << "(activeTracker_.get() != NULL)"; - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - - //LOG(TRACE) << "event.button.x = " << event.button.x << " " << - // "event.button.y = " << event.button.y; - LOG(TRACE) << "activeTracker_->PointerMove(e); " << - e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); - - activeTracker_->PointerMove(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - } - } - else if (event.type == SDL_MOUSEBUTTONUP) - { - if (activeTracker_) - { - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); - activeTracker_->PointerUp(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - } - else if (event.type == SDL_MOUSEBUTTONDOWN) - { - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - if (activeTracker_) - { - activeTracker_->PointerDown(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - else - { - // we ATTEMPT to create a tracker if need be - activeTracker_ = CreateSuitableTracker(event, e); - } - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_ESCAPE: - if (activeTracker_) - { - activeTracker_->Cancel(); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - break; - - case SDLK_t: - if (!activeTracker_) - SelectNextTool(); - else - { - LOG(WARNING) << "You cannot change the active tool when an interaction" - " is taking place"; - } - break; - case SDLK_s: - controller_->FitContent(viewport_.GetCompositor().GetCanvasWidth(), - viewport_.GetCompositor().GetCanvasHeight()); - break; - - case SDLK_z: - LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; - if (event.key.keysym.mod & KMOD_CTRL) - { - if (controller_->CanUndo()) - { - LOG(TRACE) << "Undoing..."; - controller_->Undo(); - } - else - { - LOG(WARNING) << "Nothing to undo!!!"; - } - } - break; - - case SDLK_y: - LOG(TRACE) << "SDLK_y has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; - if (event.key.keysym.mod & KMOD_CTRL) - { - if (controller_->CanRedo()) - { - LOG(TRACE) << "Redoing..."; - controller_->Redo(); - } - else - { - LOG(WARNING) << "Nothing to redo!!!"; - } - } - break; - - case SDLK_c: - TakeScreenshot( - "screenshot.png", - viewport_.GetCompositor().GetCanvasWidth(), - viewport_.GetCompositor().GetCanvasHeight()); - break; - - default: - break; - } - } - } - - - void FusionMprSdlApp::OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message) - { - DisplayInfoText(); - } - - boost::shared_ptr FusionMprSdlApp::CreateSuitableTracker( - const SDL_Event & event, - const PointerEvent & e) - { - using namespace Orthanc; - - switch (event.button.button) - { - case SDL_BUTTON_MIDDLE: - return boost::shared_ptr(new PanSceneTracker - (controller_, e)); - - case SDL_BUTTON_RIGHT: - return boost::shared_ptr(new ZoomSceneTracker - (controller_, e, viewport_.GetCompositor().GetCanvasHeight())); - - case SDL_BUTTON_LEFT: - { - //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; - // TODO: we need to iterate on the set of measuring tool and perform - // a hit test to check if a tracker needs to be created for edition. - // Otherwise, depending upon the active tool, we might want to create - // a "measuring tool creation" tracker - - // TODO: if there are conflicts, we should prefer a tracker that - // pertains to the type of measuring tool currently selected (TBD?) - boost::shared_ptr hitTestTracker = TrackerHitTest(e); - - if (hitTestTracker != NULL) - { - //LOG(TRACE) << "hitTestTracker != NULL"; - return hitTestTracker; - } - else - { - switch (currentTool_) - { - case FusionMprGuiTool_Rotate: - //LOG(TRACE) << "Creating RotateSceneTracker"; - return boost::shared_ptr(new RotateSceneTracker( - controller_, e)); - case FusionMprGuiTool_Pan: - return boost::shared_ptr(new PanSceneTracker( - controller_, e)); - case FusionMprGuiTool_Zoom: - return boost::shared_ptr(new ZoomSceneTracker( - controller_, e, viewport_.GetCompositor().GetCanvasHeight())); - //case GuiTool_AngleMeasure: - // return new AngleMeasureTracker(GetScene(), e); - //case GuiTool_CircleMeasure: - // return new CircleMeasureTracker(GetScene(), e); - //case GuiTool_EllipseMeasure: - // return new EllipseMeasureTracker(GetScene(), e); - case FusionMprGuiTool_LineMeasure: - return boost::shared_ptr(new CreateLineMeasureTracker( - IObserver::GetBroker(), controller_, e)); - case FusionMprGuiTool_AngleMeasure: - return boost::shared_ptr(new CreateAngleMeasureTracker( - IObserver::GetBroker(), controller_, e)); - case FusionMprGuiTool_CircleMeasure: - LOG(ERROR) << "Not implemented yet!"; - return boost::shared_ptr(); - case FusionMprGuiTool_EllipseMeasure: - LOG(ERROR) << "Not implemented yet!"; - return boost::shared_ptr(); - default: - throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); - } - } - } - default: - return boost::shared_ptr(); - } - } - - - FusionMprSdlApp::FusionMprSdlApp(MessageBroker& broker) - : IObserver(broker) - , broker_(broker) - , oracleObservable_(broker) - , oracle_(*this) - , currentTool_(FusionMprGuiTool_Rotate) - , undoStack_(new UndoStack) - , viewport_("Hello", 1024, 1024, false) // False means we do NOT let Windows treat this as a legacy application that needs to be scaled - { - //oracleObservable.RegisterObserverCallback - //(new Callable - // (*this, &FusionMprSdlApp::Handle)); - - //oracleObservable.RegisterObserverCallback - //(new Callable - // (*this, &FusionMprSdlApp::Handle)); - - //oracleObservable.RegisterObserverCallback - //(new Callable - // (*this, &ToFusionMprSdlAppto::Handle)); - - oracleObservable_.RegisterObserverCallback - (new Callable - (*this, &FusionMprSdlApp::Handle)); - - controller_ = boost::shared_ptr( - new ViewportController(undoStack_, broker_, viewport_)); - - controller_->RegisterObserverCallback( - new Callable - (*this, &FusionMprSdlApp::OnSceneTransformChanged)); - - TEXTURE_2x2_1_ZINDEX = 1; - TEXTURE_1x1_ZINDEX = 2; - TEXTURE_2x2_2_ZINDEX = 3; - LINESET_1_ZINDEX = 4; - LINESET_2_ZINDEX = 5; - FLOATING_INFOTEXT_LAYER_ZINDEX = 6; - FIXED_INFOTEXT_LAYER_ZINDEX = 7; - } - - void FusionMprSdlApp::PrepareScene() - { - // Texture of 2x2 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); - - uint8_t* p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - p[3] = 0; - p[4] = 255; - p[5] = 0; - - p = reinterpret_cast(i.GetRow(1)); - p[0] = 0; - p[1] = 0; - p[2] = 255; - - p[3] = 255; - p[4] = 0; - p[5] = 0; - - GetScene().SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); - } - } - - void FusionMprSdlApp::DisableTracker() - { - if (activeTracker_) - { - activeTracker_->Cancel(); - activeTracker_.reset(); - } - } - - void FusionMprSdlApp::TakeScreenshot(const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - CairoCompositor compositor(GetScene(), canvasWidth, canvasHeight); - compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); - compositor.Refresh(); - - Orthanc::ImageAccessor canvas; - compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); - Orthanc::ImageProcessing::Convert(png, canvas); - - Orthanc::PngWriter writer; - writer.WriteToFile(target, png); - } - - - boost::shared_ptr FusionMprSdlApp::TrackerHitTest(const PointerEvent & e) - { - // std::vector> measureTools_; - return boost::shared_ptr(); - } - - static void GLAPIENTRY - OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) - { - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), - type, severity, message); - } - } - - static bool g_stopApplication = false; - - - void FusionMprSdlApp::Handle(const DicomVolumeImage::GeometryReadyMessage& message) - { - printf("Geometry ready\n"); - - //plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); - //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); - plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); - plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); - - //Refresh(); - } - - - void FusionMprSdlApp::Handle(const OracleCommandExceptionMessage& message) - { - printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType()); - - switch (message.GetCommand().GetType()) - { - case IOracleCommand::Type_GetOrthancWebViewerJpeg: - printf("URI: [%s]\n", dynamic_cast - (message.GetCommand()).GetUri().c_str()); - break; - - default: - break; - } - } - - void FusionMprSdlApp::SetVolume1(int depth, - const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - source1_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); - - if (style != NULL) - { - source1_->SetConfigurator(style); - } - } - - void FusionMprSdlApp::SetVolume2(int depth, - const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - source2_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); - - if (style != NULL) - { - source2_->SetConfigurator(style); - } - } - - void FusionMprSdlApp::SetStructureSet(int depth, - const boost::shared_ptr& volume) - { - source3_.reset(new OrthancStone::VolumeSceneLayerSource(controller_->GetScene(), depth, volume)); - } - - void FusionMprSdlApp::Run() - { - // False means we do NOT let Windows treat this as a legacy application - // that needs to be scaled - controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); - - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); - - viewport_.GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_0, Orthanc::Encoding_Latin1); - viewport_.GetCompositor().SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_1, Orthanc::Encoding_Latin1); - - - //////// from loader - { - Orthanc::WebServiceParameters p; - //p.SetUrl("http://localhost:8043/"); - p.SetCredentials("orthanc", "orthanc"); - oracle_.SetOrthancParameters(p); - } - - //////// from Run - - boost::shared_ptr ct(new DicomVolumeImage); - boost::shared_ptr dose(new DicomVolumeImage); - - - boost::shared_ptr ctLoader; - boost::shared_ptr doseLoader; - boost::shared_ptr rtstructLoader; - - { - ctLoader.reset(new OrthancSeriesVolumeProgressiveLoader(ct, oracle_, oracleObservable_)); - doseLoader.reset(new OrthancMultiframeVolumeLoader(dose, oracle_, oracleObservable_)); - rtstructLoader.reset(new DicomStructureSetLoader(oracle_, oracleObservable_)); - } - - //toto->SetReferenceLoader(*ctLoader); - //doseLoader->RegisterObserverCallback - //(new Callable - // (*this, &FusionMprSdlApp::Handle)); - ctLoader->RegisterObserverCallback - (new Callable - (*this, &FusionMprSdlApp::Handle)); - - this->SetVolume1(0, ctLoader, new GrayscaleStyleConfigurator); - - { - std::unique_ptr config(new LookupTableStyleConfigurator); - config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); - - boost::shared_ptr tmp(new DicomVolumeImageMPRSlicer(dose)); - this->SetVolume2(1, tmp, config.release()); - } - - this->SetStructureSet(2, rtstructLoader); - -#if 1 - /* - BGO data - http://localhost:8042/twiga-orthanc-viewer-demo/twiga-orthanc-viewer-demo.html?ct-series=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa - & - dose-instance=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb - & - struct-instance=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 - */ - ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT - doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE - rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT -#else - //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT - //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE - //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT - - // 2017-05-16 - ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT - doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE - rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT -#endif - - oracle_.Start(); - -//// END from loader - - while (!g_stopApplication) - { - viewport_.GetCompositor().Refresh(); - -//////// from loader - if (source1_.get() != NULL) - { - source1_->Update(plane_); - } - - if (source2_.get() != NULL) - { - source2_->Update(plane_); - } - - if (source3_.get() != NULL) - { - source3_->Update(plane_); - } -//// END from loader - - SDL_Event event; - while (!g_stopApplication && SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - { - g_stopApplication = true; - break; - } - else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) - { - DisableTracker(); // was: tracker.reset(NULL); - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - viewport_.GetWindow().ToggleMaximize(); - break; - - case SDLK_s: - controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); - break; - - case SDLK_q: - g_stopApplication = true; - break; - default: - break; - } - } - HandleApplicationEvent(event); - } - SDL_Delay(1); - } - - //// from loader - - //Orthanc::SystemToolbox::ServerBarrier(); - - /** - * WARNING => The oracle must be stopped BEFORE the objects using - * it are destroyed!!! This forces to wait for the completion of - * the running callback methods. Otherwise, the callbacks methods - * might still be running while their parent object is destroyed, - * resulting in crashes. This is very visible if adding a sleep(), - * as in (*). - **/ - - oracle_.Stop(); - //// END from loader - } - - void FusionMprSdlApp::SetInfoDisplayMessage( - std::string key, std::string value) - { - if (value == "") - infoTextMap_.erase(key); - else - infoTextMap_[key] = value; - DisplayInfoText(); - } - -} - - -boost::weak_ptr g_app; - -void FusionMprSdl_SetInfoDisplayMessage(std::string key, std::string value) -{ - boost::shared_ptr app = g_app.lock(); - if (app) - { - app->SetInfoDisplayMessage(key, value); - } -} - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - using namespace OrthancStone; - - StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); -// Orthanc::Logging::EnableTraceLevel(true); - - try - { - OrthancStone::MessageBroker broker; - boost::shared_ptr app(new FusionMprSdlApp(broker)); - g_app = app; - app->PrepareScene(); - app->Run(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - StoneFinalize(); - - return 0; -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.h --- a/Resources/Graveyard/Deprecated/Samples/Sdl/FusionMprSdl.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,209 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Viewport/SdlViewport.h" - -#include "../../Framework/Messages/IObserver.h" -#include "../../Framework/Messages/IMessageEmitter.h" -#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Volumes/DicomVolumeImage.h" -#include "../../Framework/Oracle/ThreadedOracle.h" - -#include -#include -#include - -#include - -namespace OrthancStone -{ - class OpenGLCompositor; - class IVolumeSlicer; - class ILayerStyleConfigurator; - class DicomStructureSetLoader; - class IOracle; - class ThreadedOracle; - class VolumeSceneLayerSource; - class NativeFusionMprApplicationContext; - class SdlOpenGLViewport; - - enum FusionMprGuiTool - { - FusionMprGuiTool_Rotate = 0, - FusionMprGuiTool_Pan, - FusionMprGuiTool_Zoom, - FusionMprGuiTool_LineMeasure, - FusionMprGuiTool_CircleMeasure, - FusionMprGuiTool_AngleMeasure, - FusionMprGuiTool_EllipseMeasure, - FusionMprGuiTool_LAST - }; - - const char* MeasureToolToString(size_t i); - - static const unsigned int FONT_SIZE_0 = 32; - static const unsigned int FONT_SIZE_1 = 24; - - class Scene2D; - class UndoStack; - - /** - This application subclasses IMessageEmitter to use a mutex before forwarding Oracle messages (that - can be sent from multiple threads) - */ - class FusionMprSdlApp : public IObserver - , public boost::enable_shared_from_this - , public IMessageEmitter - { - public: - // 12 because. - FusionMprSdlApp(MessageBroker& broker); - - void PrepareScene(); - void Run(); - void SetInfoDisplayMessage(std::string key, std::string value); - void DisableTracker(); - - Scene2D& GetScene(); - const Scene2D& GetScene() const; - - void HandleApplicationEvent(const SDL_Event& event); - - /** - This method is called when the scene transform changes. It allows to - recompute the visual elements whose content depend upon the scene transform - */ - void OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message); - - - virtual void EmitMessage(const IObserver& observer, - const IMessage& message) ORTHANC_OVERRIDE - { - try - { - boost::unique_lock lock(mutex_); - oracleObservable_.EmitMessage(observer, message); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while emitting a message: " << e.What(); - throw; - } - } - - private: -#if 1 - // if threaded (not wasm) - MessageBroker& broker_; - IObservable oracleObservable_; - ThreadedOracle oracle_; - boost::shared_mutex mutex_; // to serialize messages from the ThreadedOracle -#endif - - void SelectNextTool(); - - /** - This returns a random point in the canvas part of the scene, but in - scene coordinates - */ - ScenePoint2D GetRandomPointInScene() const; - - boost::shared_ptr TrackerHitTest(const PointerEvent& e); - - boost::shared_ptr CreateSuitableTracker( - const SDL_Event& event, - const PointerEvent& e); - - void TakeScreenshot( - const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight); - - /** - This adds the command at the top of the undo stack - */ - void Commit(boost::shared_ptr cmd); - void Undo(); - void Redo(); - - - // TODO private - void Handle(const DicomVolumeImage::GeometryReadyMessage& message); - void Handle(const OracleCommandExceptionMessage& message); - - void SetVolume1( - int depth, - const boost::shared_ptr& volume, - ILayerStyleConfigurator* style); - - void SetVolume2( - int depth, - const boost::shared_ptr& volume, - ILayerStyleConfigurator* style); - - void SetStructureSet( - int depth, - const boost::shared_ptr& volume); - - - - private: - void DisplayFloatingCtrlInfoText(const PointerEvent& e); - void DisplayInfoText(); - void HideInfoText(); - - private: - CoordinateSystem3D plane_; - - boost::shared_ptr source1_, source2_, source3_; - - /** - WARNING: the measuring tools do store a reference to the scene, and it - paramount that the scene gets destroyed AFTER the measurement tools. - */ - boost::shared_ptr controller_; - - std::map infoTextMap_; - boost::shared_ptr activeTracker_; - - //static const int LAYER_POSITION = 150; - - int TEXTURE_2x2_1_ZINDEX; - int TEXTURE_1x1_ZINDEX; - int TEXTURE_2x2_2_ZINDEX; - int LINESET_1_ZINDEX; - int LINESET_2_ZINDEX; - int FLOATING_INFOTEXT_LAYER_ZINDEX; - int FIXED_INFOTEXT_LAYER_ZINDEX; - - FusionMprGuiTool currentTool_; - boost::shared_ptr undoStack_; - SdlOpenGLViewport viewport_; - }; - -} - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/Loader.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/Loader.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,518 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "../../Framework/Loaders/DicomStructureSetLoader.h" -#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" -#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../Framework/Oracle/SleepOracleCommand.h" -#include "../../Framework/Oracle/ThreadedOracle.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" -#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" -#include "../../Framework/Volumes/DicomVolumeImageReslicer.h" - -// From Orthanc framework -#include -#include -#include -#include -#include - - -namespace OrthancStone -{ - class NativeApplicationContext : public IMessageEmitter - { - private: - boost::shared_mutex mutex_; - MessageBroker broker_; - IObservable oracleObservable_; - - public: - NativeApplicationContext() : - oracleObservable_(broker_) - { - } - - - virtual void EmitMessage(const IObserver& observer, - const IMessage& message) ORTHANC_OVERRIDE - { - try - { - boost::unique_lock lock(mutex_); - oracleObservable_.EmitMessage(observer, message); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while emitting a message: " << e.What(); - } - } - - - class ReaderLock : public boost::noncopyable - { - private: - NativeApplicationContext& that_; - boost::shared_lock lock_; - - public: - ReaderLock(NativeApplicationContext& that) : - that_(that), - lock_(that.mutex_) - { - } - }; - - - class WriterLock : public boost::noncopyable - { - private: - NativeApplicationContext& that_; - boost::unique_lock lock_; - - public: - WriterLock(NativeApplicationContext& that) : - that_(that), - lock_(that.mutex_) - { - } - - MessageBroker& GetBroker() - { - return that_.broker_; - } - - IObservable& GetOracleObservable() - { - return that_.oracleObservable_; - } - }; - }; -} - - - -class Toto : public OrthancStone::IObserver -{ -private: - OrthancStone::CoordinateSystem3D plane_; - OrthancStone::IOracle& oracle_; - OrthancStone::Scene2D scene_; - std::unique_ptr source1_, source2_, source3_; - - - void Refresh() - { - if (source1_.get() != NULL) - { - source1_->Update(plane_); - } - - if (source2_.get() != NULL) - { - source2_->Update(plane_); - } - - if (source3_.get() != NULL) - { - source3_->Update(plane_); - } - - scene_.FitContent(1024, 768); - - { - OrthancStone::CairoCompositor compositor(scene_, 1024, 768); - compositor.Refresh(); - - Orthanc::ImageAccessor accessor; - compositor.GetCanvas().GetReadOnlyAccessor(accessor); - - Orthanc::Image tmp(Orthanc::PixelFormat_RGB24, accessor.GetWidth(), accessor.GetHeight(), false); - Orthanc::ImageProcessing::Convert(tmp, accessor); - - static unsigned int count = 0; - char buf[64]; - sprintf(buf, "scene-%06d.png", count++); - - Orthanc::PngWriter writer; - writer.WriteToFile(buf, tmp); - } - } - - - void Handle(const OrthancStone::DicomVolumeImage::GeometryReadyMessage& message) - { - printf("Geometry ready\n"); - - plane_ = message.GetOrigin().GetGeometry().GetSagittalGeometry(); - //plane_ = message.GetOrigin().GetGeometry().GetAxialGeometry(); - //plane_ = message.GetOrigin().GetGeometry().GetCoronalGeometry(); - plane_.SetOrigin(message.GetOrigin().GetGeometry().GetCoordinates(0.5f, 0.5f, 0.5f)); - - Refresh(); - } - - - void Handle(const OrthancStone::SleepOracleCommand::TimeoutMessage& message) - { - if (message.GetOrigin().HasPayload()) - { - printf("TIMEOUT! %d\n", dynamic_cast& >(message.GetOrigin().GetPayload()).GetValue()); - } - else - { - printf("TIMEOUT\n"); - - Refresh(); - - /** - * The sleep() leads to a crash if the oracle is still running, - * while this object is destroyed. Always stop the oracle before - * destroying active objects. (*) - **/ - // boost::this_thread::sleep(boost::posix_time::seconds(2)); - - oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(message.GetOrigin().GetDelay())); - } - } - - void Handle(const OrthancStone::OrthancRestApiCommand::SuccessMessage& message) - { - Json::Value v; - message.ParseJsonBody(v); - - printf("ICI [%s]\n", v.toStyledString().c_str()); - } - - void Handle(const OrthancStone::GetOrthancImageCommand::SuccessMessage& message) - { - printf("IMAGE %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); - } - - void Handle(const OrthancStone::GetOrthancWebViewerJpegCommand::SuccessMessage& message) - { - printf("WebViewer %dx%d\n", message.GetImage().GetWidth(), message.GetImage().GetHeight()); - } - - void Handle(const OrthancStone::OracleCommandExceptionMessage& message) - { - printf("EXCEPTION: [%s] on command type %d\n", message.GetException().What(), message.GetCommand().GetType()); - - switch (message.GetCommand().GetType()) - { - case OrthancStone::IOracleCommand::Type_GetOrthancWebViewerJpeg: - printf("URI: [%s]\n", dynamic_cast - (message.GetCommand()).GetUri().c_str()); - break; - - default: - break; - } - } - -public: - Toto(OrthancStone::IOracle& oracle, - OrthancStone::IObservable& oracleObservable) : - IObserver(oracleObservable.GetBroker()), - oracle_(oracle) - { - oracleObservable.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - - oracleObservable.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - - oracleObservable.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - - oracleObservable.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - - oracleObservable.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - } - - void SetReferenceLoader(OrthancStone::IObservable& loader) - { - loader.RegisterObserverCallback - (new OrthancStone::Callable - (*this, &Toto::Handle)); - } - - void SetVolume1(int depth, - const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - source1_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); - - if (style != NULL) - { - source1_->SetConfigurator(style); - } - } - - void SetVolume2(int depth, - const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - source2_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); - - if (style != NULL) - { - source2_->SetConfigurator(style); - } - } - - void SetStructureSet(int depth, - const boost::shared_ptr& volume) - { - source3_.reset(new OrthancStone::VolumeSceneLayerSource(scene_, depth, volume)); - } - -}; - - -void Run(OrthancStone::NativeApplicationContext& context, - OrthancStone::ThreadedOracle& oracle) -{ - // the oracle has been supplied with the context (as an IEmitter) upon - // creation - boost::shared_ptr ct(new OrthancStone::DicomVolumeImage); - boost::shared_ptr dose(new OrthancStone::DicomVolumeImage); - - - boost::shared_ptr toto; - boost::shared_ptr ctLoader; - boost::shared_ptr doseLoader; - boost::shared_ptr rtstructLoader; - - { - OrthancStone::NativeApplicationContext::WriterLock lock(context); - toto.reset(new Toto(oracle, lock.GetOracleObservable())); - - // the oracle is used to schedule commands - // the oracleObservable is used by the loaders to: - // - request the broker (lifetime mgmt) - // - register the loader callbacks (called indirectly by the oracle) - ctLoader.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct, oracle, lock.GetOracleObservable())); - doseLoader.reset(new OrthancStone::OrthancMultiframeVolumeLoader(dose, oracle, lock.GetOracleObservable())); - rtstructLoader.reset(new OrthancStone::DicomStructureSetLoader(oracle, lock.GetOracleObservable())); - } - - - //toto->SetReferenceLoader(*ctLoader); - toto->SetReferenceLoader(*doseLoader); - - -#if 1 - toto->SetVolume1(0, ctLoader, new OrthancStone::GrayscaleStyleConfigurator); -#else - { - boost::shared_ptr reslicer(new OrthancStone::DicomVolumeImageReslicer(ct)); - toto->SetVolume1(0, reslicer, new OrthancStone::GrayscaleStyleConfigurator); - } -#endif - - - { - std::unique_ptr config(new OrthancStone::LookupTableStyleConfigurator); - config->SetLookupTable(Orthanc::EmbeddedResources::COLORMAP_HOT); - - boost::shared_ptr tmp(new OrthancStone::DicomVolumeImageMPRSlicer(dose)); - toto->SetVolume2(1, tmp, config.release()); - } - - toto->SetStructureSet(2, rtstructLoader); - - oracle.Schedule(*toto, new OrthancStone::SleepOracleCommand(100)); - - if (0) - { - Json::Value v = Json::objectValue; - v["Level"] = "Series"; - v["Query"] = Json::objectValue; - - std::unique_ptr command(new OrthancStone::OrthancRestApiCommand); - command->SetMethod(Orthanc::HttpMethod_Post); - command->SetUri("/tools/find"); - command->SetBody(v); - - oracle.Schedule(*toto, command.release()); - } - - if(0) - { - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); - command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Jpeg))); - command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); - oracle.Schedule(*toto, command.release()); - } - - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); - command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); - command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/preview"); - oracle.Schedule(*toto, command.release()); - } - - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); - command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Png))); - command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); - oracle.Schedule(*toto, command.release()); - } - - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); - command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); - oracle.Schedule(*toto, command.release()); - } - - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancImageCommand); - command->SetHttpHeader("Accept", std::string(Orthanc::EnumerationToString(Orthanc::MimeType_Pam))); - command->SetUri("/instances/6687cc73-07cae193-52ff29c8-f646cb16-0753ed92/image-uint16"); - oracle.Schedule(*toto, command.release()); - } - - if (0) - { - std::unique_ptr command(new OrthancStone::GetOrthancWebViewerJpegCommand); - command->SetHttpHeader("Accept-Encoding", "gzip"); - command->SetInstance("e6c7c20b-c9f65d7e-0d76f2e2-830186f2-3e3c600e"); - command->SetQuality(90); - oracle.Schedule(*toto, command.release()); - } - - - if (0) - { - for (unsigned int i = 0; i < 10; i++) - { - std::unique_ptr command(new OrthancStone::SleepOracleCommand(i * 1000)); - command->SetPayload(new Orthanc::SingleValueObject(42 * i)); - oracle.Schedule(*toto, command.release()); - } - } - } - - // 2017-11-17-Anonymized -#if 0 - // BGO data - ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT - doseLoader->LoadInstance("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"); // RT-DOSE - //rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT -#else - //ctLoader->LoadSeries("cb3ea4d1-d08f3856-ad7b6314-74d88d77-60b05618"); // CT - //doseLoader->LoadInstance("41029085-71718346-811efac4-420e2c15-d39f99b6"); // RT-DOSE - //rtstructLoader->LoadInstance("83d9c0c3-913a7fee-610097d7-cbf0522d-fd75bee6"); // RT-STRUCT - - // 2017-05-16 - ctLoader->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); // CT - doseLoader->LoadInstance("eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad"); // RT-DOSE - rtstructLoader->LoadInstance("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"); // RT-STRUCT -#endif - // 2015-01-28-Multiframe - //doseLoader->LoadInstance("88f71e2a-5fad1c61-96ed14d6-5b3d3cf7-a5825279"); // Multiframe CT - - // Delphine - //ctLoader->LoadSeries("5990e39c-51e5f201-fe87a54c-31a55943-e59ef80e"); // CT - //ctLoader->LoadSeries("67f1b334-02c16752-45026e40-a5b60b6b-030ecab5"); // Lung 1/10mm - - - { - LOG(WARNING) << "...Waiting for Ctrl-C..."; - - oracle.Start(); - - Orthanc::SystemToolbox::ServerBarrier(); - - /** - * WARNING => The oracle must be stopped BEFORE the objects using - * it are destroyed!!! This forces to wait for the completion of - * the running callback methods. Otherwise, the callbacks methods - * might still be running while their parent object is destroyed, - * resulting in crashes. This is very visible if adding a sleep(), - * as in (*). - **/ - - oracle.Stop(); - } -} - - - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - OrthancStone::StoneInitialize(); - //Orthanc::Logging::EnableInfoLevel(true); - - try - { - OrthancStone::NativeApplicationContext context; - - OrthancStone::ThreadedOracle oracle(context); - //oracle.SetThreadsCount(1); - - { - Orthanc::WebServiceParameters p; - //p.SetUrl("http://localhost:8043/"); - p.SetCredentials("orthanc", "orthanc"); - oracle.SetOrthancParameters(p); - } - - //oracle.Start(); - - Run(context, oracle); - - //oracle.Stop(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - OrthancStone::StoneFinalize(); - - return 0; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/RadiographyEditor.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/RadiographyEditor.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../Shared/RadiographyEditorApp.h" - -// From Stone -#include "../../Framework/Oracle/SleepOracleCommand.h" -#include "../../Framework/Oracle/ThreadedOracle.h" -#include "../../Applications/Sdl/SdlOpenGLWindow.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/StoneInitialization.h" - -#include -#include - - -#include -#include - -#include -#include - -using namespace OrthancStone; - -namespace OrthancStone -{ - class NativeApplicationContext : public IMessageEmitter - { - private: - boost::shared_mutex mutex_; - MessageBroker broker_; - IObservable oracleObservable_; - - public: - NativeApplicationContext() : - oracleObservable_(broker_) - { - } - - - virtual void EmitMessage(const IObserver& observer, - const IMessage& message) ORTHANC_OVERRIDE - { - try - { - boost::unique_lock lock(mutex_); - oracleObservable_.EmitMessage(observer, message); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while emitting a message: " << e.What(); - } - } - - - class ReaderLock : public boost::noncopyable - { - private: - NativeApplicationContext& that_; - boost::shared_lock lock_; - - public: - ReaderLock(NativeApplicationContext& that) : - that_(that), - lock_(that.mutex_) - { - } - }; - - - class WriterLock : public boost::noncopyable - { - private: - NativeApplicationContext& that_; - boost::unique_lock lock_; - - public: - WriterLock(NativeApplicationContext& that) : - that_(that), - lock_(that.mutex_) - { - } - - MessageBroker& GetBroker() - { - return that_.broker_; - } - - IObservable& GetOracleObservable() - { - return that_.oracleObservable_; - } - }; - }; -} - -class OpenGlSdlCompositorFactory : public ICompositorFactory -{ - OpenGL::IOpenGLContext& openGlContext_; - -public: - OpenGlSdlCompositorFactory(OpenGL::IOpenGLContext& openGlContext) : - openGlContext_(openGlContext) - {} - - ICompositor* GetCompositor(const Scene2D& scene) - { - - OpenGLCompositor* compositor = new OpenGLCompositor(openGlContext_, scene); - compositor->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_0, Orthanc::Encoding_Latin1); - compositor->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_1, Orthanc::Encoding_Latin1); - return compositor; - } -}; - -static void GLAPIENTRY -OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) -{ - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), - type, severity, message); - } -} - - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - using namespace OrthancStone; - - StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); - // Orthanc::Logging::EnableTraceLevel(true); - - try - { - OrthancStone::NativeApplicationContext context; - OrthancStone::NativeApplicationContext::WriterLock lock(context); - OrthancStone::ThreadedOracle oracle(context); - - // False means we do NOT let Windows treat this as a legacy application - // that needs to be scaled - SdlOpenGLWindow window("Hello", 1024, 1024, false); - - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); - - std::unique_ptr compositorFactory(new OpenGlSdlCompositorFactory(window)); - boost::shared_ptr app(new RadiographyEditorApp(oracle, lock.GetOracleObservable(), compositorFactory.release())); - app->PrepareScene(); - app->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); - - bool stopApplication = false; - - while (!stopApplication) - { - app->Refresh(); - - SDL_Event event; - while (!stopApplication && SDL_PollEvent(&event)) - { - OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; - if (event.key.keysym.mod & KMOD_CTRL) - modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Control)); - if (event.key.keysym.mod & KMOD_ALT) - modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Alt)); - if (event.key.keysym.mod & KMOD_SHIFT) - modifiers = static_cast(static_cast(modifiers) | static_cast(OrthancStone::KeyboardModifiers_Shift)); - - OrthancStone::MouseButton button; - if (event.button.button == SDL_BUTTON_LEFT) - button = OrthancStone::MouseButton_Left; - else if (event.button.button == SDL_BUTTON_MIDDLE) - button = OrthancStone::MouseButton_Middle; - else if (event.button.button == SDL_BUTTON_RIGHT) - button = OrthancStone::MouseButton_Right; - - if (event.type == SDL_QUIT) - { - stopApplication = true; - break; - } - else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) - { - app->DisableTracker(); // was: tracker.reset(NULL); - app->UpdateSize(); - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - window.GetWindow().ToggleMaximize(); - break; - - case SDLK_q: - stopApplication = true; - break; - default: - { - app->OnKeyPressed(event.key.keysym.sym, modifiers); - } - } - } - else if (event.type == SDL_MOUSEBUTTONDOWN) - { - app->OnMouseDown(event.button.x, event.button.y, modifiers, button); - } - else if (event.type == SDL_MOUSEMOTION) - { - app->OnMouseMove(event.button.x, event.button.y, modifiers); - } - else if (event.type == SDL_MOUSEBUTTONUP) - { - app->OnMouseUp(event.button.x, event.button.y, modifiers, button); - } - } - SDL_Delay(1); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - StoneFinalize(); - - return 0; -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSample.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSample.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "TrackerSampleApp.h" - - // From Stone -#include "../../Framework/OpenGL/SdlOpenGLContext.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/StoneInitialization.h" - -#include -#include - - -#include -#include - -#include -#include - -/* -TODO: - -- to decouple the trackers from the sample, we need to supply them with - the scene rather than the app - -- in order to do that, we need a GetNextFreeZIndex function (or something - along those lines) in the scene object - -*/ - -boost::weak_ptr g_app; - -void TrackerSample_SetInfoDisplayMessage(std::string key, std::string value) -{ - boost::shared_ptr app = g_app.lock(); - if (app) - { - app->SetInfoDisplayMessage(key, value); - } -} - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - using namespace OrthancStone; - - StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); -// Orthanc::Logging::EnableTraceLevel(true); - - try - { - MessageBroker broker; - boost::shared_ptr app(new TrackerSampleApp(broker)); - g_app = app; - app->PrepareScene(); - app->Run(); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - StoneFinalize(); - - return 0; -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.cpp --- a/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,733 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "TrackerSampleApp.h" - -#include "../../Framework/OpenGL/SdlOpenGLContext.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/Scene2D.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" -#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" -#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" -#include "../../Framework/StoneInitialization.h" - -// From Orthanc framework -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -namespace OrthancStone -{ - const char* MeasureToolToString(size_t i) - { - static const char* descs[] = { - "GuiTool_Rotate", - "GuiTool_Pan", - "GuiTool_Zoom", - "GuiTool_LineMeasure", - "GuiTool_CircleMeasure", - "GuiTool_AngleMeasure", - "GuiTool_EllipseMeasure", - "GuiTool_LAST" - }; - if (i >= GuiTool_LAST) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); - } - return descs[i]; - } - - void TrackerSampleApp::SelectNextTool() - { - currentTool_ = static_cast(currentTool_ + 1); - if (currentTool_ == GuiTool_LAST) - currentTool_ = static_cast(0);; - printf("Current tool is now: %s\n", MeasureToolToString(currentTool_)); - } - - void TrackerSampleApp::DisplayInfoText() - { - // do not try to use stuff too early! - std::stringstream msg; - - for (std::map::const_iterator kv = infoTextMap_.begin(); - kv != infoTextMap_.end(); ++kv) - { - msg << kv->first << " : " << kv->second << std::endl; - } - std::string msgS = msg.str(); - - TextSceneLayer* layerP = NULL; - if (controller_->GetScene().HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = dynamic_cast( - controller_->GetScene().GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); - layerP = &layer; - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layerP = layer.get(); - layer->SetColor(0, 255, 0); - layer->SetFontIndex(1); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_TopLeft); - //layer->SetPosition(0,0); - controller_->GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - // position the fixed info text in the upper right corner - layerP->SetText(msgS.c_str()); - double cX = GetCompositor().GetCanvasWidth() * (-0.5); - double cY = GetCompositor().GetCanvasHeight() * (-0.5); - controller_->GetScene().GetCanvasToSceneTransform().Apply(cX,cY); - layerP->SetPosition(cX, cY); - } - - void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) - { - ScenePoint2D p = e.GetMainPosition().Apply(controller_->GetScene().GetCanvasToSceneTransform()); - - char buf[128]; - sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", - p.GetX(), p.GetY(), - e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); - - if (controller_->GetScene().HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = - dynamic_cast(controller_->GetScene().GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); - layer.SetText(buf); - layer.SetPosition(p.GetX(), p.GetY()); - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetColor(0, 255, 0); - layer->SetText(buf); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_BottomCenter); - layer->SetPosition(p.GetX(), p.GetY()); - controller_->GetScene().SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - } - - void TrackerSampleApp::HideInfoText() - { - controller_->GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); - } - - ScenePoint2D TrackerSampleApp::GetRandomPointInScene() const - { - unsigned int w = GetCompositor().GetCanvasWidth(); - LOG(TRACE) << "GetCompositor().GetCanvasWidth() = " << - GetCompositor().GetCanvasWidth(); - unsigned int h = GetCompositor().GetCanvasHeight(); - LOG(TRACE) << "GetCompositor().GetCanvasHeight() = " << - GetCompositor().GetCanvasHeight(); - - if ((w >= RAND_MAX) || (h >= RAND_MAX)) - LOG(WARNING) << "Canvas is too big : tools will not be randomly placed"; - - int x = rand() % w; - int y = rand() % h; - LOG(TRACE) << "random x = " << x << "random y = " << y; - - ScenePoint2D p = controller_->GetViewport().GetPixelCenterCoordinates(x, y); - LOG(TRACE) << "--> p.GetX() = " << p.GetX() << " p.GetY() = " << p.GetY(); - - ScenePoint2D r = p.Apply(controller_->GetScene().GetCanvasToSceneTransform()); - LOG(TRACE) << "--> r.GetX() = " << r.GetX() << " r.GetY() = " << r.GetY(); - return r; - } - - void TrackerSampleApp::CreateRandomMeasureTool() - { - static bool srandCalled = false; - if (!srandCalled) - { - srand(42); - srandCalled = true; - } - - int i = rand() % 2; - LOG(TRACE) << "random i = " << i; - switch (i) - { - case 0: - // line measure - { - boost::shared_ptr cmd = - boost::make_shared( - boost::ref(IObserver::GetBroker()), - controller_, - GetRandomPointInScene()); - cmd->SetEnd(GetRandomPointInScene()); - controller_->PushCommand(cmd); - } - break; - case 1: - // angle measure - { - boost::shared_ptr cmd = - boost::make_shared( - boost::ref(IObserver::GetBroker()), - controller_, - GetRandomPointInScene()); - cmd->SetCenter(GetRandomPointInScene()); - cmd->SetSide2End(GetRandomPointInScene()); - controller_->PushCommand(cmd); - } - break; - } - } - - void TrackerSampleApp::HandleApplicationEvent( - const SDL_Event & event) - { - DisplayInfoText(); - - if (event.type == SDL_MOUSEMOTION) - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - if (activeTracker_.get() == NULL && - SDL_SCANCODE_LALT < scancodeCount && - keyboardState[SDL_SCANCODE_LALT]) - { - // The "left-ctrl" key is down, while no tracker is present - // Let's display the info text - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - - DisplayFloatingCtrlInfoText(e); - } - else if (activeTracker_.get() != NULL) - { - HideInfoText(); - //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)"; - if (activeTracker_.get() != NULL) - { - //LOG(TRACE) << "(activeTracker_.get() != NULL)"; - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - - //LOG(TRACE) << "event.button.x = " << event.button.x << " " << - // "event.button.y = " << event.button.y; - LOG(TRACE) << "activeTracker_->PointerMove(e); " << - e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); - - activeTracker_->PointerMove(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - } - else - { - HideInfoText(); - - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - controller_->GetScene().GetCanvasToSceneTransform()); - //auto measureTools = GetController()->HitTestMeasureTools(scenePos); - //LOG(TRACE) << "# of hit tests: " << measureTools.size(); - - // this returns the collection of measuring tools where hit test is true - std::vector > measureTools = controller_->HitTestMeasureTools(scenePos); - - // let's refresh the measuring tools highlighted state - // first let's tag them as "unhighlighted" - controller_->ResetMeasuringToolsHighlight(); - - // then immediately take the first one and ask it to highlight the - // measuring tool UI part that is hot - if (measureTools.size() > 0) - { - measureTools[0]->Highlight(scenePos); - } - } - } - else if (event.type == SDL_MOUSEBUTTONUP) - { - if (activeTracker_) - { - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y)); - activeTracker_->PointerUp(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - } - else if (event.type == SDL_MOUSEBUTTONDOWN) - { - PointerEvent e; - e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates( - event.button.x, event.button.y)); - if (activeTracker_) - { - activeTracker_->PointerDown(e); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - else - { - // we ATTEMPT to create a tracker if need be - activeTracker_ = CreateSuitableTracker(event, e); - } - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_ESCAPE: - if (activeTracker_) - { - activeTracker_->Cancel(); - if (!activeTracker_->IsAlive()) - activeTracker_.reset(); - } - break; - - case SDLK_t: - if (!activeTracker_) - SelectNextTool(); - else - { - LOG(WARNING) << "You cannot change the active tool when an interaction" - " is taking place"; - } - break; - - case SDLK_m: - CreateRandomMeasureTool(); - break; - case SDLK_s: - controller_->FitContent(GetCompositor().GetCanvasWidth(), - GetCompositor().GetCanvasHeight()); - break; - - case SDLK_z: - LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; - if (event.key.keysym.mod & KMOD_CTRL) - { - if (controller_->CanUndo()) - { - LOG(TRACE) << "Undoing..."; - controller_->Undo(); - } - else - { - LOG(WARNING) << "Nothing to undo!!!"; - } - } - break; - - case SDLK_y: - LOG(TRACE) << "SDLK_y has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; - if (event.key.keysym.mod & KMOD_CTRL) - { - if (controller_->CanRedo()) - { - LOG(TRACE) << "Redoing..."; - controller_->Redo(); - } - else - { - LOG(WARNING) << "Nothing to redo!!!"; - } - } - break; - - case SDLK_c: - TakeScreenshot( - "screenshot.png", - GetCompositor().GetCanvasWidth(), - GetCompositor().GetCanvasHeight()); - break; - - default: - break; - } - } - } - - - void TrackerSampleApp::OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message) - { - DisplayInfoText(); - } - - boost::shared_ptr TrackerSampleApp::CreateSuitableTracker( - const SDL_Event & event, - const PointerEvent & e) - { - using namespace Orthanc; - - switch (event.button.button) - { - case SDL_BUTTON_MIDDLE: - return boost::shared_ptr(new PanSceneTracker - (controller_, e)); - - case SDL_BUTTON_RIGHT: - return boost::shared_ptr(new ZoomSceneTracker - (controller_, e, GetCompositor().GetCanvasHeight())); - - case SDL_BUTTON_LEFT: - { - //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; - // TODO: we need to iterate on the set of measuring tool and perform - // a hit test to check if a tracker needs to be created for edition. - // Otherwise, depending upon the active tool, we might want to create - // a "measuring tool creation" tracker - - // TODO: if there are conflicts, we should prefer a tracker that - // pertains to the type of measuring tool currently selected (TBD?) - boost::shared_ptr hitTestTracker = TrackerHitTest(e); - - if (hitTestTracker != NULL) - { - //LOG(TRACE) << "hitTestTracker != NULL"; - return hitTestTracker; - } - else - { - switch (currentTool_) - { - case GuiTool_Rotate: - //LOG(TRACE) << "Creating RotateSceneTracker"; - return boost::shared_ptr(new RotateSceneTracker( - controller_, e)); - case GuiTool_Pan: - return boost::shared_ptr(new PanSceneTracker( - controller_, e)); - case GuiTool_Zoom: - return boost::shared_ptr(new ZoomSceneTracker( - controller_, e, GetCompositor().GetCanvasHeight())); - //case GuiTool_AngleMeasure: - // return new AngleMeasureTracker(GetScene(), e); - //case GuiTool_CircleMeasure: - // return new CircleMeasureTracker(GetScene(), e); - //case GuiTool_EllipseMeasure: - // return new EllipseMeasureTracker(GetScene(), e); - case GuiTool_LineMeasure: - return boost::shared_ptr(new CreateLineMeasureTracker( - IObserver::GetBroker(), controller_, e)); - case GuiTool_AngleMeasure: - return boost::shared_ptr(new CreateAngleMeasureTracker( - IObserver::GetBroker(), controller_, e)); - case GuiTool_CircleMeasure: - LOG(ERROR) << "Not implemented yet!"; - return boost::shared_ptr(); - case GuiTool_EllipseMeasure: - LOG(ERROR) << "Not implemented yet!"; - return boost::shared_ptr(); - default: - throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); - } - } - } - default: - return boost::shared_ptr(); - } - } - - - TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) - , currentTool_(GuiTool_Rotate) - , undoStack_(new UndoStack) - , viewport_("Hello", 1024, 1024, false) // False means we do NOT let Windows treat this as a legacy application that needs to be scaled - { - controller_ = boost::shared_ptr( - new ViewportController(undoStack_, broker, viewport_)); - - controller_->RegisterObserverCallback( - new Callable - (*this, &TrackerSampleApp::OnSceneTransformChanged)); - - TEXTURE_2x2_1_ZINDEX = 1; - TEXTURE_1x1_ZINDEX = 2; - TEXTURE_2x2_2_ZINDEX = 3; - LINESET_1_ZINDEX = 4; - LINESET_2_ZINDEX = 5; - FLOATING_INFOTEXT_LAYER_ZINDEX = 6; - FIXED_INFOTEXT_LAYER_ZINDEX = 7; - } - - void TrackerSampleApp::PrepareScene() - { - // Texture of 2x2 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); - - uint8_t* p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - p[3] = 0; - p[4] = 255; - p[5] = 0; - - p = reinterpret_cast(i.GetRow(1)); - p[0] = 0; - p[1] = 0; - p[2] = 255; - - p[3] = 255; - p[4] = 0; - p[5] = 0; - - controller_->GetScene().SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-3, 2); - l->SetPixelSpacing(1.5, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - controller_->GetScene().SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); - } - - // Texture of 1x1 size - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); - - uint8_t* p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-2, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - controller_->GetScene().SetLayer(TEXTURE_1x1_ZINDEX, l.release()); - } - - // Some lines - { - std::unique_ptr layer(new PolylineSceneLayer); - - layer->SetThickness(1); - - PolylineSceneLayer::Chain chain; - chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); - chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); - layer->AddChain(chain, true, 255, 0, 0); - - chain.clear(); - chain.push_back(ScenePoint2D(-5, -5)); - chain.push_back(ScenePoint2D(5, -5)); - chain.push_back(ScenePoint2D(5, 5)); - chain.push_back(ScenePoint2D(-5, 5)); - layer->AddChain(chain, true, 0, 255, 0); - - double dy = 1.01; - chain.clear(); - chain.push_back(ScenePoint2D(-4, -4)); - chain.push_back(ScenePoint2D(4, -4 + dy)); - chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); - chain.push_back(ScenePoint2D(4, 2)); - layer->AddChain(chain, false, 0, 0, 255); - - controller_->GetScene().SetLayer(LINESET_1_ZINDEX, layer.release()); - } - - // Some text - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetText("Hello"); - controller_->GetScene().SetLayer(LINESET_2_ZINDEX, layer.release()); - } - } - - - void TrackerSampleApp::DisableTracker() - { - if (activeTracker_) - { - activeTracker_->Cancel(); - activeTracker_.reset(); - } - } - - void TrackerSampleApp::TakeScreenshot(const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - CairoCompositor compositor(controller_->GetScene(), canvasWidth, canvasHeight); - compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); - compositor.Refresh(); - - Orthanc::ImageAccessor canvas; - compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); - Orthanc::ImageProcessing::Convert(png, canvas); - - Orthanc::PngWriter writer; - writer.WriteToFile(target, png); - } - - - boost::shared_ptr TrackerSampleApp::TrackerHitTest(const PointerEvent & e) - { - // std::vector> measureTools_; - ScenePoint2D scenePos = e.GetMainPosition().Apply( - controller_->GetScene().GetCanvasToSceneTransform()); - - std::vector > measureTools = controller_->HitTestMeasureTools(scenePos); - - if (measureTools.size() > 0) - { - return measureTools[0]->CreateEditionTracker(e); - } - return boost::shared_ptr(); - } - - static void GLAPIENTRY - OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) - { - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), - type, severity, message); - } - } - - static bool g_stopApplication = false; - - ICompositor& TrackerSampleApp::GetCompositor() - { - using namespace Orthanc; - try - { - SdlViewport& viewport = dynamic_cast(viewport_); - return viewport.GetCompositor(); - } - catch (std::bad_cast e) - { - throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!"); - } - } - - const ICompositor& TrackerSampleApp::GetCompositor() const - { - using namespace Orthanc; - try - { - SdlViewport& viewport = const_cast(dynamic_cast(viewport_)); - return viewport.GetCompositor(); - } - catch (std::bad_cast e) - { - throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!"); - } - } - - - void TrackerSampleApp::Run() - { - controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight()); - - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); - - GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_0, Orthanc::Encoding_Latin1); - GetCompositor().SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE_1, Orthanc::Encoding_Latin1); - - while (!g_stopApplication) - { - GetCompositor().Refresh(); - - SDL_Event event; - while (!g_stopApplication && SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - { - g_stopApplication = true; - break; - } - else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) - { - DisableTracker(); // was: tracker.reset(NULL); - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - viewport_.GetWindow().ToggleMaximize(); - break; - - case SDLK_q: - g_stopApplication = true; - break; - default: - break; - } - } - HandleApplicationEvent(event); - } - SDL_Delay(1); - } - } - - void TrackerSampleApp::SetInfoDisplayMessage( - std::string key, std::string value) - { - if (value == "") - infoTextMap_.erase(key); - else - infoTextMap_[key] = value; - DisplayInfoText(); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.h --- a/Resources/Graveyard/Deprecated/Samples/Sdl/TrackerSampleApp.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,150 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Messages/IObserver.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" -#include "../../Framework/Scene2DViewport/MeasureTool.h" -#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Viewport/SdlViewport.h" - -#include - -#include -#include -#include - -namespace OrthancStone -{ - enum GuiTool - { - GuiTool_Rotate = 0, - GuiTool_Pan, - GuiTool_Zoom, - GuiTool_LineMeasure, - GuiTool_CircleMeasure, - GuiTool_AngleMeasure, - GuiTool_EllipseMeasure, - GuiTool_LAST - }; - - const char* MeasureToolToString(size_t i); - - static const unsigned int FONT_SIZE_0 = 32; - static const unsigned int FONT_SIZE_1 = 24; - - class Scene2D; - class UndoStack; - - class TrackerSampleApp : public IObserver - , public boost::enable_shared_from_this - { - public: - // 12 because. - TrackerSampleApp(MessageBroker& broker); - void PrepareScene(); - void Run(); - void SetInfoDisplayMessage(std::string key, std::string value); - void DisableTracker(); - - void HandleApplicationEvent(const SDL_Event& event); - - /** - This method is called when the scene transform changes. It allows to - recompute the visual elements whose content depend upon the scene transform - */ - void OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message); - - private: - void SelectNextTool(); - void CreateRandomMeasureTool(); - - - /** - In the case of this app, the viewport is an SDL viewport and it has - a OpenGLCompositor& GetCompositor() method - */ - ICompositor& GetCompositor(); - - /** - See the other overload - */ - const ICompositor& GetCompositor() const; - - /** - This returns a random point in the canvas part of the scene, but in - scene coordinates - */ - ScenePoint2D GetRandomPointInScene() const; - - boost::shared_ptr TrackerHitTest(const PointerEvent& e); - - boost::shared_ptr CreateSuitableTracker( - const SDL_Event& event, - const PointerEvent& e); - - void TakeScreenshot( - const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight); - - /** - This adds the command at the top of the undo stack - */ - void Commit(boost::shared_ptr cmd); - void Undo(); - void Redo(); - - private: - void DisplayFloatingCtrlInfoText(const PointerEvent& e); - void DisplayInfoText(); - void HideInfoText(); - - private: - /** - WARNING: the measuring tools do store a reference to the scene, and it - paramount that the scene gets destroyed AFTER the measurement tools. - */ - boost::shared_ptr controller_; - - std::map infoTextMap_; - boost::shared_ptr activeTracker_; - - //static const int LAYER_POSITION = 150; - - int TEXTURE_2x2_1_ZINDEX; - int TEXTURE_1x1_ZINDEX; - int TEXTURE_2x2_2_ZINDEX; - int LINESET_1_ZINDEX; - int LINESET_2_ZINDEX; - int FLOATING_INFOTEXT_LAYER_ZINDEX; - int FIXED_INFOTEXT_LAYER_ZINDEX; - - GuiTool currentTool_; - boost::shared_ptr undoStack_; - SdlOpenGLViewport viewport_; - }; - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/Sdl/cpp.hint --- a/Resources/Graveyard/Deprecated/Samples/Sdl/cpp.hint Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -#define ORTHANC_OVERRIDE -#define ORTHANC_STONE_DEFINE_EMPTY_MESSAGE(FILE, LINE, NAME) class NAME : public ::OrthancStone::IMessage {}; diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.cpp --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,427 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - - -#include "dev.h" - -#include - -#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../Framework/Oracle/SleepOracleCommand.h" -#include "../../Framework/Oracle/WebAssemblyOracle.h" -#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" - - -namespace OrthancStone -{ - class VolumeSlicerWidget : public IObserver - { - private: - OrthancStone::WebAssemblyViewport viewport_; - std::unique_ptr source_; - VolumeProjection projection_; - std::vector planes_; - size_t currentPlane_; - - void Handle(const DicomVolumeImage::GeometryReadyMessage& message) - { - LOG(INFO) << "Geometry is available"; - - const VolumeImageGeometry& geometry = message.GetOrigin().GetGeometry(); - - const unsigned int depth = geometry.GetProjectionDepth(projection_); - currentPlane_ = depth / 2; - - planes_.resize(depth); - - for (unsigned int z = 0; z < depth; z++) - { - planes_[z] = geometry.GetProjectionSlice(projection_, z); - } - - Refresh(); - - viewport_.FitContent(); - } - - public: - VolumeSlicerWidget(MessageBroker& broker, - const std::string& canvas, - VolumeProjection projection) : - IObserver(broker), - viewport_(broker, canvas), - projection_(projection), - currentPlane_(0) - { - } - - void UpdateSize() - { - viewport_.UpdateSize(); - } - - void SetSlicer(int layerDepth, - const boost::shared_ptr& slicer, - IObservable& loader, - ILayerStyleConfigurator* configurator) - { - if (source_.get() != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Only one slicer can be registered"); - } - - loader.RegisterObserverCallback( - new Callable - (*this, &VolumeSlicerWidget::Handle)); - - source_.reset(new VolumeSceneLayerSource(viewport_.GetScene(), layerDepth, slicer)); - - if (configurator != NULL) - { - source_->SetConfigurator(configurator); - } - } - - void Refresh() - { - if (source_.get() != NULL && - currentPlane_ < planes_.size()) - { - source_->Update(planes_[currentPlane_]); - viewport_.Refresh(); - } - } - - size_t GetSlicesCount() const - { - return planes_.size(); - } - - void Scroll(int delta) - { - if (!planes_.empty()) - { - int tmp = static_cast(currentPlane_) + delta; - unsigned int next; - - if (tmp < 0) - { - next = 0; - } - else if (tmp >= static_cast(planes_.size())) - { - next = planes_.size() - 1; - } - else - { - next = static_cast(tmp); - } - - if (next != currentPlane_) - { - currentPlane_ = next; - Refresh(); - } - } - } - }; -} - - - - -boost::shared_ptr ct_(new OrthancStone::DicomVolumeImage); - -boost::shared_ptr loader_; - -std::unique_ptr widget1_; -std::unique_ptr widget2_; -std::unique_ptr widget3_; - -OrthancStone::MessageBroker broker_; -OrthancStone::WebAssemblyOracle oracle_(broker_); - - -EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) -{ - try - { - if (widget1_.get() != NULL) - { - widget1_->UpdateSize(); - } - - if (widget2_.get() != NULL) - { - widget2_->UpdateSize(); - } - - if (widget3_.get() != NULL) - { - widget3_->UpdateSize(); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while updating canvas size: " << e.What(); - } - - return true; -} - - - - -EM_BOOL OnAnimationFrame(double time, void *userData) -{ - try - { - if (widget1_.get() != NULL) - { - widget1_->Refresh(); - } - - if (widget2_.get() != NULL) - { - widget2_->Refresh(); - } - - if (widget3_.get() != NULL) - { - widget3_->Refresh(); - } - - return true; - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception in the animation loop, stopping now: " << e.What(); - return false; - } -} - - -static bool ctrlDown_ = false; - - -EM_BOOL OnMouseWheel(int eventType, - const EmscriptenWheelEvent *wheelEvent, - void *userData) -{ - try - { - if (userData != NULL) - { - int delta = 0; - - if (wheelEvent->deltaY < 0) - { - delta = -1; - } - - if (wheelEvent->deltaY > 0) - { - delta = 1; - } - - OrthancStone::VolumeSlicerWidget& widget = - *reinterpret_cast(userData); - - if (ctrlDown_) - { - delta *= static_cast(widget.GetSlicesCount() / 10); - } - - widget.Scroll(delta); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception in the wheel event: " << e.What(); - } - - return true; -} - - -EM_BOOL OnKeyDown(int eventType, - const EmscriptenKeyboardEvent *keyEvent, - void *userData) -{ - ctrlDown_ = keyEvent->ctrlKey; - return false; -} - - -EM_BOOL OnKeyUp(int eventType, - const EmscriptenKeyboardEvent *keyEvent, - void *userData) -{ - ctrlDown_ = false; - return false; -} - - - - -namespace OrthancStone -{ - class TestSleep : public IObserver - { - private: - WebAssemblyOracle& oracle_; - - void Schedule() - { - oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(2000)); - } - - void Handle(const SleepOracleCommand::TimeoutMessage& message) - { - LOG(INFO) << "TIMEOUT"; - Schedule(); - } - - public: - TestSleep(MessageBroker& broker, - WebAssemblyOracle& oracle) : - IObserver(broker), - oracle_(oracle) - { - oracle.RegisterObserverCallback( - new Callable - (*this, &TestSleep::Handle)); - - LOG(INFO) << "STARTING"; - Schedule(); - } - }; - - //static TestSleep testSleep(broker_, oracle_); -} - - - -static std::map arguments_; - -static bool GetArgument(std::string& value, - const std::string& key) -{ - std::map::const_iterator found = arguments_.find(key); - - if (found == arguments_.end()) - { - return false; - } - else - { - value = found->second; - return true; - } -} - - -extern "C" -{ - int main(int argc, char const *argv[]) - { - OrthancStone::StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); - // Orthanc::Logging::EnableTraceLevel(true); - EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); - } - - EMSCRIPTEN_KEEPALIVE - void SetArgument(const char* key, const char* value) - { - // This is called for each GET argument (cf. "app.js") - LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; - arguments_[key] = value; - } - - EMSCRIPTEN_KEEPALIVE - void Initialize() - { - try - { - oracle_.SetOrthancRoot(".."); - - loader_.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct_, oracle_, oracle_)); - - widget1_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas1", OrthancStone::VolumeProjection_Axial)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget1_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget1_->UpdateSize(); - - widget2_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas2", OrthancStone::VolumeProjection_Coronal)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget2_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget2_->UpdateSize(); - - widget3_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas3", OrthancStone::VolumeProjection_Sagittal)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget3_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget3_->UpdateSize(); - - emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnWindowResize); // DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 !! - - emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnMouseWheel); - emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnMouseWheel); - emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnMouseWheel); - - emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); - emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); - - emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); - - - std::string ct; - if (GetArgument(ct, "ct")) - { - //loader_->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); - loader_->LoadSeries(ct); - } - else - { - LOG(ERROR) << "No Orthanc identifier for the CT series was provided"; - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception during Initialize(): " << e.What(); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.html --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicMPR.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ - - - - - - - - - - - - Stone of Orthanc - - - - - - - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.cpp --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "dev.h" - -#include -#include - -// From Stone -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/StoneInitialization.h" - -// From Orthanc framework -#include -#include -#include - -void PrepareScene(OrthancStone::Scene2D& scene) -{ - using namespace OrthancStone; - - // Texture of 2x2 size - if (1) - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - p[3] = 0; - p[4] = 255; - p[5] = 0; - - p = reinterpret_cast(i.GetRow(1)); - p[0] = 0; - p[1] = 0; - p[2] = 255; - - p[3] = 255; - p[4] = 0; - p[5] = 0; - - scene.SetLayer(12, new ColorTextureSceneLayer(i)); - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-3, 2); - l->SetPixelSpacing(1.5, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - scene.SetLayer(14, l.release()); - } - - // Texture of 1x1 size - if (1) - { - Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); - - uint8_t *p = reinterpret_cast(i.GetRow(0)); - p[0] = 255; - p[1] = 0; - p[2] = 0; - - std::unique_ptr l(new ColorTextureSceneLayer(i)); - l->SetOrigin(-2, 1); - l->SetAngle(20.0 / 180.0 * M_PI); - scene.SetLayer(13, l.release()); - } - - // Some lines - if (1) - { - std::unique_ptr layer(new PolylineSceneLayer); - - layer->SetThickness(1); - - PolylineSceneLayer::Chain chain; - chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); - chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); - chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); - layer->AddChain(chain, true, 255, 0, 0); - - chain.clear(); - chain.push_back(ScenePoint2D(-5, -5)); - chain.push_back(ScenePoint2D(5, -5)); - chain.push_back(ScenePoint2D(5, 5)); - chain.push_back(ScenePoint2D(-5, 5)); - layer->AddChain(chain, true, 0, 255, 0); - - double dy = 1.01; - chain.clear(); - chain.push_back(ScenePoint2D(-4, -4)); - chain.push_back(ScenePoint2D(4, -4 + dy)); - chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); - chain.push_back(ScenePoint2D(4, 2)); - layer->AddChain(chain, false, 0, 0, 255); - - scene.SetLayer(50, layer.release()); - } - - // Some text - if (1) - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetText("Hello"); - scene.SetLayer(100, layer.release()); - } -} - - -std::unique_ptr viewport1_; -std::unique_ptr viewport2_; -std::unique_ptr viewport3_; -boost::shared_ptr controller1_; -boost::shared_ptr controller2_; -boost::shared_ptr controller3_; -OrthancStone::MessageBroker broker_; - - -EM_BOOL OnWindowResize( - int eventType, const EmscriptenUiEvent *uiEvent, void *userData) -{ - if (viewport1_.get() != NULL) - { - viewport1_->UpdateSize(); - } - - if (viewport2_.get() != NULL) - { - viewport2_->UpdateSize(); - } - - if (viewport3_.get() != NULL) - { - viewport3_->UpdateSize(); - } - - return true; -} - -extern "C" -{ - int main(int argc, char const *argv[]) - { - OrthancStone::StoneInitialize(); - // Orthanc::Logging::EnableInfoLevel(true); - // Orthanc::Logging::EnableTraceLevel(true); - EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); - } - - EMSCRIPTEN_KEEPALIVE - void Initialize() - { - viewport1_.reset(new OrthancStone::WebAssemblyViewport("mycanvas1")); - PrepareScene(viewport1_->GetScene()); - viewport1_->UpdateSize(); - - viewport2_.reset(new OrthancStone::WebAssemblyViewport("mycanvas2")); - PrepareScene(viewport2_->GetScene()); - viewport2_->UpdateSize(); - - viewport3_.reset(new OrthancStone::WebAssemblyViewport("mycanvas3")); - PrepareScene(viewport3_->GetScene()); - viewport3_->UpdateSize(); - - viewport1_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE, Orthanc::Encoding_Latin1); - viewport2_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE, Orthanc::Encoding_Latin1); - viewport3_->GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, - FONT_SIZE, Orthanc::Encoding_Latin1); - - controller1_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport1_)); - controller2_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport2_)); - controller3_.reset(new OrthancStone::ViewportController(boost::make_shared(), broker_, *viewport3_)); - - controller1_->FitContent(viewport1_->GetCanvasWidth(), viewport1_->GetCanvasHeight()); - controller2_->FitContent(viewport2_->GetCanvasWidth(), viewport2_->GetCanvasHeight()); - controller3_->FitContent(viewport3_->GetCanvasWidth(), viewport3_->GetCanvasHeight()); - - viewport1_->Refresh(); - viewport2_->Refresh(); - viewport3_->Refresh(); - - SetupEvents("mycanvas1", controller1_); - SetupEvents("mycanvas2", controller2_); - SetupEvents("mycanvas3", controller3_); - - emscripten_set_resize_callback("#window", NULL, false, OnWindowResize); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.html --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/BasicScene.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ - - - - - - - - - - - - Stone of Orthanc - - - - - - - - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/CMakeLists.txt --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - - -##################################################################### -## Configuration of the Emscripten compiler for WebAssembly target -##################################################################### - -set(WASM_FLAGS "-s WASM=1 -s FETCH=1") - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") -#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXIT_RUNTIME=1") - -#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") - - -##################################################################### -## Configuration of the Orthanc framework -##################################################################### - -# This CMake file defines the "ORTHANC_STONE_VERSION" macro, so it -# must be the first inclusion -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/Version.cmake) - -if (ORTHANC_STONE_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_VERSION "mainline") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "hg") -else() - set(ORTHANC_FRAMEWORK_VERSION "1.5.7") - set(ORTHANC_FRAMEWORK_DEFAULT_SOURCE "web") -endif() - -set(ORTHANC_FRAMEWORK_SOURCE "${ORTHANC_FRAMEWORK_DEFAULT_SOURCE}" CACHE STRING "Source of the Orthanc source code (can be \"hg\", \"archive\", \"web\" or \"path\")") -set(ORTHANC_FRAMEWORK_ARCHIVE "" CACHE STRING "Path to the Orthanc archive, if ORTHANC_FRAMEWORK_SOURCE is \"archive\"") -set(ORTHANC_FRAMEWORK_ROOT "" CACHE STRING "Path to the Orthanc source directory, if ORTHANC_FRAMEWORK_SOURCE is \"path\"") - - -##################################################################### -## Configuration of the Stone framework -##################################################################### - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -set(ORTHANC_STONE_APPLICATION_RESOURCES - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) -SET(ORTHANC_SANDBOXED ON) -SET(ENABLE_WASM ON) - -include(${CMAKE_SOURCE_DIR}/../../Resources/CMake/OrthancStoneConfiguration.cmake) - -add_definitions( - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - ) - - -##################################################################### -## Build the samples -##################################################################### - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ) - - -if (ON) - add_executable(BasicScene - BasicScene.cpp - #${CMAKE_CURRENT_LIST_DIR}/../Shared/SharedBasicScene.h - ${CMAKE_CURRENT_LIST_DIR}/../Shared/SharedBasicScene.cpp - ) - - target_link_libraries(BasicScene OrthancStone) - - install( - TARGETS BasicScene - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} - ) -endif() - - -if (ON) - add_executable(BasicMPR - BasicMPR.cpp - ) - - target_link_libraries(BasicMPR OrthancStone) - - install( - TARGETS BasicMPR - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} - ) -endif() - - -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/BasicMPR.wasm - ${CMAKE_CURRENT_BINARY_DIR}/BasicScene.wasm - ${CMAKE_SOURCE_DIR}/BasicMPR.html - ${CMAKE_SOURCE_DIR}/BasicScene.html - ${CMAKE_SOURCE_DIR}/Configuration.json - ${CMAKE_SOURCE_DIR}/app.js - ${CMAKE_SOURCE_DIR}/index.html - DESTINATION ${CMAKE_INSTALL_PREFIX} - ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/Configuration.json --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/Configuration.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -{ - "Plugins": [ - "/usr/local/share/orthanc/plugins/libOrthancWebViewer.so", - "/usr/local/share/orthanc/plugins/libServeFolders.so" - ], - "StorageDirectory" : "/var/lib/orthanc/db", - "IndexDirectory" : "/var/lib/orthanc/db", - "RemoteAccessAllowed" : true, - "AuthenticationEnabled" : false, - "ServeFolders" : { - "AllowCache" : false, - "GenerateETag" : true, - "Folders" : { - "/stone" : "/root/stone" - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/ConfigurationLocalSJO.json --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/ConfigurationLocalSJO.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -{ - "Plugins": [ - "/home/jodogne/Subversion/orthanc-webviewer/r/libOrthancWebViewer.so", - "/home/jodogne/Subversion/orthanc/r/libServeFolders.so" - ], - "StorageDirectory" : "/tmp/orthanc-db", - "IndexDirectory" : "/tmp/orthanc-db", - "RemoteAccessAllowed" : true, - "AuthenticationEnabled" : false, - "ServeFolders" : { - "AllowCache" : false, - "GenerateETag" : true, - "Folders" : { - "/stone" : "/tmp/stone" - } - }, - "WebViewer" : { - "CachePath" : "/tmp/orthanc-db/WebViewerCache" - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/NOTES.txt --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/NOTES.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -Docker SJO -========== - -$ source ~/Downloads/emsdk/emsdk_env.sh -$ cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON .. -DCMAKE_INSTALL_PREFIX=/tmp/stone -$ ninja install -$ docker run -p 4242:4242 -p 8042:8042 --rm -v /tmp/stone:/root/stone:ro -v /tmp/stone-db/:/var/lib/orthanc/db/ jodogne/orthanc-plugins:latest /root/stone/Configuration.json --verbose - -WARNING: This won't work using "orthanc-plugins:1.5.6", as support for -PAM is mandatatory in "/instances/.../image-uint16". - - -Docker BGO -========== - -On Ubuntu WSL -------------- -. ~/apps/emsdk/emsdk_env.sh -cd /mnt/c/osi/dev/ -mkdir -p build_stone_newsamples_wasm_wsl -mkdir -p build_install_stone_newsamples_wasm_wsl -cd build_stone_newsamples_wasm_wsl -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/osi/dev/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/osi/dev/build_install_stone_newsamples_wasm_wsl -ninja install - -Then, on Windows ------------------ -docker run -p 4242:4242 -p 8042:8042 --rm -v "C:/osi/dev/build_install_stone_newsamples_wasm_wsl:/root/stone:ro" jodogne/orthanc-plugins:1.5.6 /root/stone/Configuration.json --verbose - -# WAIT A COUPLE OF SECS -# if the archive has NOT already been unzipped, unzip it -# upload dicom files to running orthanc - -cd C:\osi\dev\twiga-orthanc-viewer\demo\dicomfiles -if (-not (test-path RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57)) { unzip RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57.zip} -ImportDicomFiles.ps1 127.0.0.1 8042 .\RTVIEWER-c8febcc6-eb9e22a4-130f208c-e0a6a4cd-4d432c57\ - ---> localhost:8042 --> Plugins --> serve-folders --> stone --> ... - -Local BGO -========== - -. ~/apps/emsdk/emsdk_env.sh -cd /mnt/c/osi/dev/ -mkdir -p build_stone_newsamples_wasm_wsl -mkdir -p build_install_stone_newsamples_wasm_wsl -cd build_stone_newsamples_wasm_wsl -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/osi/dev/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/osi/dev/build_install_stone_newsamples_wasm_wsl - - - -TODO: Orthanc.exe - - -Local SJO -========== - -$ source ~/Downloads/emsdk/emsdk_env.sh -$ cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON .. -DCMAKE_INSTALL_PREFIX=/tmp/stone -$ ninja install - -$ make -C ~/Subversion/orthanc/r -j4 -$ make -C ~/Subversion/orthanc-webviewer/r -j4 -$ ~/Subversion/orthanc/r/Orthanc ../ConfigurationLocalSJO.json - - -Local AM -======== - -. ~/apps/emsdk/emsdk_env.sh -cd /mnt/c/o/ -mkdir -p build_stone_newsamples_wasm_wsl -mkdir -p build_install_stone_newsamples_wasm_wsl -cd build_stone_newsamples_wasm_wsl -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/fastcomp/emscripten/cmake/Modules/Platform/Emscripten.cmake -DORTHANC_FRAMEWORK_SOURCE=path -DORTHANC_FRAMEWORK_ROOT=/mnt/c/o/orthanc/ -DCMAKE_BUILD_TYPE=Release -DALLOW_DOWNLOADS=ON /mnt/c/o/orthanc-stone/Samples/WebAssembly -DCMAKE_INSTALL_PREFIX=/mnt/c/o/build_install_stone_newsamples_wasm_wsl -ninja diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/app.js --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/app.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/** - * This is a generic bootstrap code that is shared by all the Stone - * sample applications. - **/ - -// Check support for WebAssembly -if (!('WebAssembly' in window)) { - alert('Sorry, your browser does not support WebAssembly :('); -} else { - - // Wait for the module to be loaded (the event "WebAssemblyLoaded" - // must be emitted by the "main" function) - window.addEventListener('WebAssemblyLoaded', function() { - - // Loop over the GET arguments - var parameters = window.location.search.substr(1); - if (parameters != null && parameters != '') { - var tokens = parameters.split('&'); - for (var i = 0; i < tokens.length; i++) { - var arg = tokens[i].split('='); - if (arg.length == 2) { - - // Send each GET argument to WebAssembly - Module.ccall('SetArgument', null, [ 'string', 'string' ], - [ arg[0], decodeURIComponent(arg[1]) ]); - } - } - } - - // Inform the WebAssembly module that it can start - Module.ccall('Initialize', null, null, null); - }); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/dev.h --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/dev.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Viewport/WebAssemblyViewport.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" - -#include - -#include -#include - -static const unsigned int FONT_SIZE = 32; - -namespace OrthancStone -{ - class ActiveTracker : public boost::noncopyable - { - private: - boost::shared_ptr tracker_; - std::string canvasIdentifier_; - bool insideCanvas_; - - public: - ActiveTracker(const boost::shared_ptr& tracker, - const std::string& canvasId) : - tracker_(tracker), - canvasIdentifier_(canvasId), - insideCanvas_(true) - { - if (tracker_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - bool IsAlive() const - { - return tracker_->IsAlive(); - } - - void PointerMove(const PointerEvent& event) - { - tracker_->PointerMove(event); - } - - void PointerUp(const PointerEvent& event) - { - tracker_->PointerUp(event); - } - }; -} - -static OrthancStone::PointerEvent* ConvertMouseEvent( - const EmscriptenMouseEvent& source, - OrthancStone::IViewport& viewport) -{ - std::unique_ptr target( - new OrthancStone::PointerEvent); - - target->AddPosition(viewport.GetPixelCenterCoordinates( - source.targetX, source.targetY)); - target->SetAltModifier(source.altKey); - target->SetControlModifier(source.ctrlKey); - target->SetShiftModifier(source.shiftKey); - - return target.release(); -} - -std::unique_ptr tracker_; - -EM_BOOL OnMouseEvent(int eventType, - const EmscriptenMouseEvent *mouseEvent, - void *userData) -{ - if (mouseEvent != NULL && - userData != NULL) - { - boost::shared_ptr& controller = - *reinterpret_cast*>(userData); - - switch (eventType) - { - case EMSCRIPTEN_EVENT_CLICK: - { - static unsigned int count = 0; - char buf[64]; - sprintf(buf, "click %d", count++); - - std::unique_ptr layer(new OrthancStone::TextSceneLayer); - layer->SetText(buf); - controller->GetViewport().GetScene().SetLayer(100, layer.release()); - controller->GetViewport().Refresh(); - break; - } - - case EMSCRIPTEN_EVENT_MOUSEDOWN: - { - boost::shared_ptr t; - - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - - switch (mouseEvent->button) - { - case 0: // Left button - emscripten_console_log("Creating RotateSceneTracker"); - t.reset(new OrthancStone::RotateSceneTracker( - controller, *event)); - break; - - case 1: // Middle button - emscripten_console_log("Creating PanSceneTracker"); - LOG(INFO) << "Creating PanSceneTracker" ; - t.reset(new OrthancStone::PanSceneTracker( - controller, *event)); - break; - - case 2: // Right button - emscripten_console_log("Creating ZoomSceneTracker"); - t.reset(new OrthancStone::ZoomSceneTracker( - controller, *event, controller->GetViewport().GetCanvasWidth())); - break; - - default: - break; - } - } - - if (t.get() != NULL) - { - tracker_.reset( - new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier())); - controller->GetViewport().Refresh(); - } - - break; - } - - case EMSCRIPTEN_EVENT_MOUSEMOVE: - if (tracker_.get() != NULL) - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - tracker_->PointerMove(*event); - controller->GetViewport().Refresh(); - } - break; - - case EMSCRIPTEN_EVENT_MOUSEUP: - if (tracker_.get() != NULL) - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - tracker_->PointerUp(*event); - controller->GetViewport().Refresh(); - if (!tracker_->IsAlive()) - tracker_.reset(); - } - break; - - default: - break; - } - } - - return true; -} - - -void SetupEvents(const std::string& canvas, - boost::shared_ptr& controller) -{ - emscripten_set_mousedown_callback(canvas.c_str(), &controller, false, OnMouseEvent); - emscripten_set_mousemove_callback(canvas.c_str(), &controller, false, OnMouseEvent); - emscripten_set_mouseup_callback(canvas.c_str(), &controller, false, OnMouseEvent); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Deprecated/Samples/WebAssembly/index.html --- a/Resources/Graveyard/Deprecated/Samples/WebAssembly/index.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - - - - - Stone of Orthanc - - -

Available samples

-
- - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Messaging/CurlOrthancConnection.cpp --- a/Resources/Graveyard/Messaging/CurlOrthancConnection.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "CurlOrthancConnection.h" - -#if ORTHANC_ENABLE_CURL == 1 - -#include "../../Resources/Orthanc/Core/HttpClient.h" -#include "../../Resources/Orthanc/Core/OrthancException.h" - -namespace OrthancStone -{ - void CurlOrthancConnection::RestApiGet(std::string& result, - const std::string& uri) - { - /** - * TODO: This function sometimes crashes if compiled with - * MinGW-W64 (32 bit) in Release mode, on Windows XP. Introducing - * a mutex here fixes the issue. Not sure of what is the - * culprit. Maybe a bug in a old version of MinGW? - **/ - - Orthanc::HttpClient client(parameters_, uri); - - // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) - client.SetRedirectionFollowed(false); - - if (!client.Apply(result)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - } - - - void CurlOrthancConnection::RestApiPost(std::string& result, - const std::string& uri, - const std::string& body) - { - Orthanc::HttpClient client(parameters_, uri); - - // Don't follow 3xx HTTP (avoid redirections to "unsupported.png" in Orthanc) - client.SetRedirectionFollowed(false); - - client.SetBody(body); - client.SetMethod(Orthanc::HttpMethod_Post); - - if (!client.Apply(result)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Messaging/CurlOrthancConnection.h --- a/Resources/Graveyard/Messaging/CurlOrthancConnection.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "IOrthancConnection.h" - -#if ORTHANC_ENABLE_CURL == 1 - -#include "../../Resources/Orthanc/Core/WebServiceParameters.h" - -namespace OrthancStone -{ - class CurlOrthancConnection : public IOrthancConnection - { - private: - Orthanc::WebServiceParameters parameters_; - - public: - CurlOrthancConnection(const Orthanc::WebServiceParameters& parameters) : - parameters_(parameters) - { - } - - const Orthanc::WebServiceParameters& GetParameters() const - { - return parameters_; - } - - virtual void RestApiGet(std::string& result, - const std::string& uri); - - virtual void RestApiPost(std::string& result, - const std::string& uri, - const std::string& body); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Messaging/IOrthancConnection.h --- a/Resources/Graveyard/Messaging/IOrthancConnection.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Toolbox/IThreadSafety.h" - -#include - -namespace OrthancStone -{ - // Derived classes must be thread-safe - class IOrthancConnection : public IThreadSafe - { - public: - virtual void RestApiGet(std::string& result, - const std::string& uri) = 0; - - virtual void RestApiPost(std::string& result, - const std::string& uri, - const std::string& body) = 0; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/ReferenceLineFactory.cpp --- a/Resources/Graveyard/ReferenceLineFactory.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ReferenceLineFactory.h" - -#include "LineLayerRenderer.h" - -namespace OrthancStone -{ - ReferenceLineFactory::ReferenceLineFactory(SliceViewerWidget& owner, - SliceViewerWidget& sibling) : - owner_(owner), - sibling_(sibling), - hasLayerIndex_(false) - { - style_.SetColor(0, 255, 0); - slice_ = sibling.GetSlice(); - sibling_.Register(*this); - } - - - void ReferenceLineFactory::NotifySliceContentChange(const SliceViewerWidget& source, - const SliceGeometry& slice) - { - if (&source == &sibling_) - { - SetSlice(slice); - } - } - - - void ReferenceLineFactory::SetLayerIndex(size_t layerIndex) - { - hasLayerIndex_ = true; - layerIndex_ = layerIndex; - } - - - void ReferenceLineFactory::SetStyle(const RenderStyle& style) - { - style_ = style; - } - - - RenderStyle ReferenceLineFactory::GetRenderStyle() - { - return style_; - } - - - void ReferenceLineFactory::SetSlice(const SliceGeometry& slice) - { - slice_ = slice; - - if (hasLayerIndex_) - { - owner_.InvalidateLayer(layerIndex_); - } - } - - - ILayerRenderer* ReferenceLineFactory::CreateLayerRenderer(const SliceGeometry& viewportSlice) - { - Vector p, d; - - // Compute the line of intersection between the two slices - if (!GeometryToolbox::IntersectTwoPlanes(p, d, - slice_.GetOrigin(), slice_.GetNormal(), - viewportSlice.GetOrigin(), viewportSlice.GetNormal())) - { - // The two slice are parallel, don't try and display the intersection - return NULL; - } - - double x1, y1, x2, y2; - viewportSlice.ProjectPoint(x1, y1, p); - viewportSlice.ProjectPoint(x2, y2, p + 1000.0 * d); - - double sx1, sy1, sx2, sy2; - owner_.GetView().GetSceneExtent(sx1, sy1, sx2, sy2); - - if (GeometryToolbox::ClipLineToRectangle(x1, y1, x2, y2, - x1, y1, x2, y2, - sx1, sy1, sx2, sy2)) - { - std::unique_ptr layer(new LineLayerRenderer(x1, y1, x2, y2)); - layer->SetLayerStyle(style_); - return layer.release(); - } - else - { - // Parallel slices - return NULL; - } - } - - - ISliceableVolume& ReferenceLineFactory::GetSourceVolume() const - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - - void ReferenceLineFactory::Configure(SliceViewerWidget& a, - SliceViewerWidget& b) - { - { - size_t layerIndex; - ILayerRendererFactory& factory = a.AddLayer(layerIndex, new ReferenceLineFactory(a, b)); - dynamic_cast(factory).SetLayerIndex(layerIndex); - } - - { - size_t layerIndex; - ILayerRendererFactory& factory = b.AddLayer(layerIndex, new ReferenceLineFactory(b, a)); - dynamic_cast(factory).SetLayerIndex(layerIndex); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/ReferenceLineFactory.h --- a/Resources/Graveyard/ReferenceLineFactory.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../Widgets/SliceViewerWidget.h" - -namespace OrthancStone -{ - class ReferenceLineFactory : - public ILayerRendererFactory, - public SliceViewerWidget::ISliceObserver - { - private: - SliceViewerWidget& owner_; - SliceViewerWidget& sibling_; - SliceGeometry slice_; - RenderStyle style_; - bool hasLayerIndex_; - size_t layerIndex_; - - - public: - ReferenceLineFactory(SliceViewerWidget& owner, - SliceViewerWidget& sibling); - - virtual void NotifySliceContentChange(const SliceViewerWidget& source, - const SliceGeometry& slice); - - void SetLayerIndex(size_t layerIndex); - - void SetStyle(const RenderStyle& style); - - RenderStyle GetRenderStyle(); - - void SetSlice(const SliceGeometry& slice); - - virtual bool GetExtent(double& x1, - double& y1, - double& x2, - double& y2, - const SliceGeometry& viewportSlice) - { - return false; - } - - virtual ILayerRenderer* CreateLayerRenderer(const SliceGeometry& viewportSlice); - - virtual bool HasSourceVolume() const - { - return false; - } - - virtual ISliceableVolume& GetSourceVolume() const; - - static void Configure(SliceViewerWidget& a, - SliceViewerWidget& b); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/BinarySemaphore.cpp --- a/Resources/Graveyard/Threading/BinarySemaphore.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "BinarySemaphore.h" - -namespace OrthancStone -{ - BinarySemaphore::BinarySemaphore() : - proceed_(false) - { - } - - void BinarySemaphore::Signal() - { - //boost::mutex::scoped_lock lock(mutex_); - - proceed_ = true; - condition_.notify_one(); - } - - void BinarySemaphore::Wait() - { - boost::mutex::scoped_lock lock(mutex_); - - while (!proceed_) - { - condition_.wait(lock); - } - - proceed_ = false; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/BinarySemaphore.h --- a/Resources/Graveyard/Threading/BinarySemaphore.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace OrthancStone -{ - class BinarySemaphore : public boost::noncopyable - { - private: - bool proceed_; - boost::mutex mutex_; - boost::condition_variable condition_; - - public: - explicit BinarySemaphore(); - - void Signal(); - - void Wait(); - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/IThreadSafety.h --- a/Resources/Graveyard/Threading/IThreadSafety.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -namespace OrthancStone -{ - /** - * Dummy interface to explicitely tag the interfaces whose derived - * class must be thread-safe. The different methods of such classes - * might be simlultaneously invoked by several threads, and should - * be properly protected by mutexes. - **/ - class IThreadSafe : public boost::noncopyable - { - public: - virtual ~IThreadSafe() - { - } - }; - - - /** - * Dummy interface to explicitely tag the interfaces that are NOT - * expected to be thread-safe. The Orthanc Stone framework ensures - * that at most one method of such classes will be invoked at a - * given time. Such classes are automatically protected by the - * Orthanc Stone framework wherever required. - **/ - class IThreadUnsafe : public boost::noncopyable - { - public: - virtual ~IThreadUnsafe() - { - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/SdlBuffering.cpp --- a/Resources/Graveyard/Threading/SdlBuffering.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlBuffering.h" - -#if ORTHANC_ENABLE_SDL == 1 - -#include "../../Resources/Orthanc/Core/Logging.h" -#include "../../Resources/Orthanc/Core/OrthancException.h" - -namespace OrthancStone -{ - SdlBuffering::SdlBuffering() : - sdlSurface_(NULL), - pendingFrame_(false) - { - } - - - SdlBuffering::~SdlBuffering() - { - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - } - - - void SdlBuffering::SetSize(unsigned int width, - unsigned int height, - IViewport& viewport) - { - boost::mutex::scoped_lock lock(mutex_); - - viewport.SetSize(width, height); - - if (offscreenSurface_.get() == NULL || - offscreenSurface_->GetWidth() != width || - offscreenSurface_->GetHeight() != height) - { - offscreenSurface_.reset(new CairoSurface(width, height)); - } - - if (onscreenSurface_.get() == NULL || - onscreenSurface_->GetWidth() != width || - onscreenSurface_->GetHeight() != height) - { - onscreenSurface_.reset(new CairoSurface(width, height)); - - // TODO Big endian? - static const uint32_t rmask = 0x00ff0000; - static const uint32_t gmask = 0x0000ff00; - static const uint32_t bmask = 0x000000ff; - - if (sdlSurface_) - { - SDL_FreeSurface(sdlSurface_); - } - - sdlSurface_ = SDL_CreateRGBSurfaceFrom(onscreenSurface_->GetBuffer(), width, height, 32, - onscreenSurface_->GetPitch(), rmask, gmask, bmask, 0); - if (!sdlSurface_) - { - LOG(ERROR) << "Cannot create a SDL surface from a Cairo surface"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - - pendingFrame_ = false; - } - - - bool SdlBuffering::RenderOffscreen(IViewport& viewport) - { - boost::mutex::scoped_lock lock(mutex_); - - if (offscreenSurface_.get() == NULL) - { - return false; - } - - Orthanc::ImageAccessor target = offscreenSurface_->GetAccessor(); - - if (viewport.Render(target) && - !pendingFrame_) - { - pendingFrame_ = true; - return true; - } - else - { - return false; - } - } - - - void SdlBuffering::SwapToScreen(SdlWindow& window) - { - if (!pendingFrame_ || - offscreenSurface_.get() == NULL || - onscreenSurface_.get() == NULL) - { - return; - } - - { - boost::mutex::scoped_lock lock(mutex_); - onscreenSurface_->Copy(*offscreenSurface_); - } - - window.Render(sdlSurface_); - pendingFrame_ = false; - } -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/SdlBuffering.h --- a/Resources/Graveyard/Threading/SdlBuffering.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL == 1 - -#include "SdlWindow.h" -#include "../../Framework/Viewport/CairoSurface.h" -#include "../../Framework/Viewport/IViewport.h" - -#include - -namespace OrthancStone -{ - class SdlBuffering : public boost::noncopyable - { - private: - boost::mutex mutex_; - std::unique_ptr offscreenSurface_; - std::unique_ptr onscreenSurface_; - SDL_Surface* sdlSurface_; - bool pendingFrame_; - - public: - SdlBuffering(); - - ~SdlBuffering(); - - void SetSize(unsigned int width, - unsigned int height, - IViewport& viewport); - - // Returns "true" if a new refresh of the display should be - // triggered afterwards - bool RenderOffscreen(IViewport& viewport); - - void SwapToScreen(SdlWindow& window); - }; -} - -#endif diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Threading/SharedValue.h --- a/Resources/Graveyard/Threading/SharedValue.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace OrthancStone -{ - // A value that is protected by a mutex, in order to be shared by - // multiple threads - template - class SharedValue : public boost::noncopyable - { - private: - boost::mutex mutex_; - T value_; - - public: - class Locker : public boost::noncopyable - { - private: - boost::mutex::scoped_lock lock_; - T& value_; - - public: - Locker(SharedValue& shared) : - lock_(shared.mutex_), - value_(shared.value_) - { - } - - T& GetValue() const - { - return value_; - } - }; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Toolbox/DicomDataset.cpp --- a/Resources/Graveyard/Toolbox/DicomDataset.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,304 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "DicomDataset.h" - -#include "../../Resources/Orthanc/Core/OrthancException.h" -#include "../../Resources/Orthanc/Core/Logging.h" -#include "../../Resources/Orthanc/Core/Toolbox.h" - -#include -#include -#include - -namespace OrthancStone -{ - static uint16_t GetCharValue(char c) - { - if (c >= '0' && c <= '9') - return c - '0'; - else if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - else - return 0; - } - - - static uint16_t GetHexadecimalValue(const char* c) - { - return ((GetCharValue(c[0]) << 12) + - (GetCharValue(c[1]) << 8) + - (GetCharValue(c[2]) << 4) + - GetCharValue(c[3])); - } - - - static DicomDataset::Tag ParseTag(const std::string& tag) - { - if (tag.size() == 9 && - isxdigit(tag[0]) && - isxdigit(tag[1]) && - isxdigit(tag[2]) && - isxdigit(tag[3]) && - (tag[4] == '-' || tag[4] == ',') && - isxdigit(tag[5]) && - isxdigit(tag[6]) && - isxdigit(tag[7]) && - isxdigit(tag[8])) - { - uint16_t group = GetHexadecimalValue(tag.c_str()); - uint16_t element = GetHexadecimalValue(tag.c_str() + 5); - return std::make_pair(group, element); - } - else if (tag.size() == 8 && - isxdigit(tag[0]) && - isxdigit(tag[1]) && - isxdigit(tag[2]) && - isxdigit(tag[3]) && - isxdigit(tag[4]) && - isxdigit(tag[5]) && - isxdigit(tag[6]) && - isxdigit(tag[7])) - { - uint16_t group = GetHexadecimalValue(tag.c_str()); - uint16_t element = GetHexadecimalValue(tag.c_str() + 4); - return std::make_pair(group, element); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - void DicomDataset::Parse(const std::string& content) - { - Json::Value json; - Json::Reader reader; - if (!reader.parse(content, json)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - Parse(json); - } - - - void DicomDataset::Parse(const Json::Value& content) - { - if (content.type() != Json::objectValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - Json::Value::Members members = content.getMemberNames(); - for (size_t i = 0; i < members.size(); i++) - { - Tag tag = ParseTag(members[i]); - - const Json::Value& item = content[members[i]]; - - if (item.type() != Json::objectValue || - !item.isMember("Type") || - !item.isMember("Value") || - !item.isMember("Name") || - item["Type"].type() != Json::stringValue || - item["Name"].type() != Json::stringValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - - if (item["Type"].asString() == "String") - { - if (item["Value"].type() == Json::stringValue) - { - values_[tag] = item["Value"].asString(); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - } - } - - - DicomDataset::DicomDataset(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId) - { - std::string content; - orthanc.RestApiGet(content, "/instances/" + instanceId + "/tags"); - - Parse(content); - } - - - std::string DicomDataset::GetStringValue(const Tag& tag) const - { - Values::const_iterator it = values_.find(tag); - - if (it == values_.end()) - { - LOG(ERROR) << "Trying to access a DICOM tag that is not set in a DICOM dataset"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem); - } - else - { - return it->second; - } - } - - - std::string DicomDataset::GetStringValue(const Tag& tag, - const std::string& defaultValue) const - { - Values::const_iterator it = values_.find(tag); - - if (it == values_.end()) - { - return defaultValue; - } - else - { - return it->second; - } - } - - - float DicomDataset::GetFloatValue(const Tag& tag) const - { - try - { - return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); - } - catch (boost::bad_lexical_cast&) - { - LOG(ERROR) << "Trying to access a DICOM tag that is not a float"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - double DicomDataset::GetDoubleValue(const Tag& tag) const - { - try - { - return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); - } - catch (boost::bad_lexical_cast&) - { - LOG(ERROR) << "Trying to access a DICOM tag that is not a float"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - int DicomDataset::GetIntegerValue(const Tag& tag) const - { - try - { - return boost::lexical_cast(Orthanc::Toolbox::StripSpaces(GetStringValue(tag))); - } - catch (boost::bad_lexical_cast&) - { - LOG(ERROR) << "Trying to access a DICOM tag that is not an integer"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - unsigned int DicomDataset::GetUnsignedIntegerValue(const Tag& tag) const - { - int v = GetIntegerValue(tag); - - if (v < 0) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - else - { - return static_cast(v); - } - } - - - void DicomDataset::GetVectorValue(Vector& vector, - const Tag& tag) const - { - if (!GeometryToolbox::ParseVector(vector, Orthanc::Toolbox::StripSpaces(GetStringValue(tag)))) - { - LOG(ERROR) << "Trying to access a DICOM tag that is not a vector"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void DicomDataset::GetVectorValue(Vector& vector, - const Tag& tag, - size_t expectedSize) const - { - GetVectorValue(vector, tag); - - if (vector.size() != expectedSize) - { - LOG(ERROR) << "A vector in a DICOM tag has a bad size"; - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); - } - } - - - void DicomDataset::Print() const - { - for (Values::const_iterator it = values_.begin(); it != values_.end(); ++it) - { - printf("%04x,%04x = [%s]\n", it->first.first, it->first.second, it->second.c_str()); - } - printf("\n"); - } - - - bool DicomDataset::IsGrayscale() const - { - std::string photometric = Orthanc::Toolbox::StripSpaces(GetStringValue(DICOM_TAG_PHOTOMETRIC_INTERPRETATION)); - - return (photometric == "MONOCHROME1" || - photometric == "MONOCHROME2"); - } - - - void DicomDataset::GetPixelSpacing(double& spacingX, - double& spacingY) const - { - if (HasTag(DICOM_TAG_PIXEL_SPACING)) - { - Vector spacing; - GetVectorValue(spacing, DICOM_TAG_PIXEL_SPACING, 2); - spacingX = spacing[0]; - spacingY = spacing[1]; - } - else - { - spacingX = 1.0; - spacingY = 1.0; - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Graveyard/Toolbox/DicomDataset.h --- a/Resources/Graveyard/Toolbox/DicomDataset.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Resources/Orthanc/Plugins/Samples/Common/IOrthancConnection.h" - -#include -#include -#include - -namespace OrthancStone -{ - // This class is NOT thread-safe - // This is a lightweight alternative to Orthanc::DicomMap - class DicomDataset : public boost::noncopyable - { - public: - typedef std::pair Tag; - - private: - typedef std::map Values; - - Values values_; - - void Parse(const std::string& content); - - void Parse(const Json::Value& content); - - public: - DicomDataset(const std::string& content) - { - Parse(content); - } - - DicomDataset(const Json::Value& content) - { - Parse(content); - } - - DicomDataset(OrthancPlugins::IOrthancConnection& orthanc, - const std::string& instanceId); - - bool HasTag(const Tag& tag) const - { - return values_.find(tag) != values_.end(); - } - - std::string GetStringValue(const Tag& tag) const; - - std::string GetStringValue(const Tag& tag, - const std::string& defaultValue) const; - - float GetFloatValue(const Tag& tag) const; - - double GetDoubleValue(const Tag& tag) const; - - int GetIntegerValue(const Tag& tag) const; - - unsigned int GetUnsignedIntegerValue(const Tag& tag) const; - - void GetVectorValue(Vector& vector, - const Tag& tag, - size_t expectedSize) const; - - void GetVectorValue(Vector& vector, - const Tag& tag) const; - - void Print() const; - - bool IsGrayscale() const; - - void GetPixelSpacing(double& spacingX, - double& spacingY) const; - }; - - - static const DicomDataset::Tag DICOM_TAG_COLUMNS(0x0028, 0x0011); - static const DicomDataset::Tag DICOM_TAG_IMAGE_ORIENTATION_PATIENT(0x0020, 0x0037); - static const DicomDataset::Tag DICOM_TAG_IMAGE_POSITION_PATIENT(0x0020, 0x0032); - static const DicomDataset::Tag DICOM_TAG_NUMBER_OF_FRAMES(0x0028, 0x0008); - static const DicomDataset::Tag DICOM_TAG_PIXEL_REPRESENTATION(0x0028, 0x0103); - static const DicomDataset::Tag DICOM_TAG_PIXEL_SPACING(0x0028, 0x0030); - static const DicomDataset::Tag DICOM_TAG_RESCALE_INTERCEPT(0x0028, 0x1052); - static const DicomDataset::Tag DICOM_TAG_RESCALE_SLOPE(0x0028, 0x1053); - static const DicomDataset::Tag DICOM_TAG_ROWS(0x0028, 0x0010); - static const DicomDataset::Tag DICOM_TAG_SLICE_THICKNESS(0x0018, 0x0050); - static const DicomDataset::Tag DICOM_TAG_WINDOW_CENTER(0x0028, 0x1050); - static const DicomDataset::Tag DICOM_TAG_WINDOW_WIDTH(0x0028, 0x1051); - static const DicomDataset::Tag DICOM_TAG_PHOTOMETRIC_INTERPRETATION(0x0028, 0x0004); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/AutoGeneratedCode.cmake --- a/Resources/Orthanc/CMake/AutoGeneratedCode.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -set(EMBED_RESOURCES_PYTHON "${CMAKE_CURRENT_LIST_DIR}/../EmbedResources.py" - CACHE INTERNAL "Path to the EmbedResources.py script from Orthanc") -set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED") -set(AUTOGENERATED_SOURCES) - -file(MAKE_DIRECTORY ${AUTOGENERATED_DIR}) -include_directories(${AUTOGENERATED_DIR}) - -macro(EmbedResources) - # Convert a semicolon separated list to a whitespace separated string - set(SCRIPT_OPTIONS) - set(SCRIPT_ARGUMENTS) - set(DEPENDENCIES) - set(IS_PATH_NAME false) - - set(TARGET_BASE "${AUTOGENERATED_DIR}/EmbeddedResources") - - # Loop over the arguments of the function - foreach(arg ${ARGN}) - # Extract the first character of the argument - string(SUBSTRING "${arg}" 0 1 FIRST_CHAR) - if (${FIRST_CHAR} STREQUAL "-") - # If the argument starts with a dash "-", this is an option to - # EmbedResources.py - if (${arg} MATCHES "--target=.*") - # Does the argument starts with "--target="? - string(SUBSTRING "${arg}" 9 -1 TARGET) # 9 is the length of "--target=" - set(TARGET_BASE "${AUTOGENERATED_DIR}/${TARGET}") - else() - list(APPEND SCRIPT_OPTIONS ${arg}) - endif() - else() - if (${IS_PATH_NAME}) - list(APPEND SCRIPT_ARGUMENTS "${arg}") - list(APPEND DEPENDENCIES "${arg}") - set(IS_PATH_NAME false) - else() - list(APPEND SCRIPT_ARGUMENTS "${arg}") - set(IS_PATH_NAME true) - endif() - endif() - endforeach() - - add_custom_command( - OUTPUT - "${TARGET_BASE}.h" - "${TARGET_BASE}.cpp" - COMMAND ${PYTHON_EXECUTABLE} ${EMBED_RESOURCES_PYTHON} - ${SCRIPT_OPTIONS} "${TARGET_BASE}" ${SCRIPT_ARGUMENTS} - DEPENDS - ${EMBED_RESOURCES_PYTHON} - ${DEPENDENCIES} - ) - - list(APPEND AUTOGENERATED_SOURCES - "${TARGET_BASE}.cpp" - ) -endmacro() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/Compiler.cmake --- a/Resources/Orthanc/CMake/Compiler.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ -# This file sets all the compiler-related flags - - -# Save the current compiler flags to the cache every time cmake configures the project -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "compiler flags" FORCE) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "compiler flags" FORCE) - - -include(CheckLibraryExists) - -if ((CMAKE_CROSSCOMPILING AND NOT - "${CMAKE_SYSTEM_VERSION}" STREQUAL "CrossToolNg") OR - "${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") - # Cross-compilation necessarily implies standalone and static build - SET(STATIC_BUILD ON) - SET(STANDALONE_BUILD ON) -endif() - - -if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") - # Cache the environment variables "LSB_CC" and "LSB_CXX" for further - # use by "ExternalProject" in CMake - SET(CMAKE_LSB_CC $ENV{LSB_CC} CACHE STRING "") - SET(CMAKE_LSB_CXX $ENV{LSB_CXX} CACHE STRING "") -endif() - - -if (CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-long-long") - - # --std=c99 makes libcurl not to compile - # -pedantic gives a lot of warnings on OpenSSL - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -Wno-variadic-macros") - - if (CMAKE_CROSSCOMPILING) - # http://stackoverflow.com/a/3543845/881731 - set(CMAKE_RC_COMPILE_OBJECT " -O coff -I ") - endif() - -elseif (MSVC) - # Use static runtime under Visual Studio - # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace - # http://stackoverflow.com/a/6510446 - foreach(flag_var - CMAKE_C_FLAGS_DEBUG - CMAKE_CXX_FLAGS_DEBUG - CMAKE_C_FLAGS_RELEASE - CMAKE_CXX_FLAGS_RELEASE - CMAKE_C_FLAGS_MINSIZEREL - CMAKE_CXX_FLAGS_MINSIZEREL - CMAKE_C_FLAGS_RELWITHDEBINFO - CMAKE_CXX_FLAGS_RELWITHDEBINFO) - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") - endforeach(flag_var) - - # Add /Zm256 compiler option to Visual Studio to fix PCH errors - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm256") - - # New in Orthanc 1.5.5 - if (MSVC_MULTIPLE_PROCESSES) - # "If you omit the processMax argument in the /MP option, the - # compiler obtains the number of effective processors from the - # operating system, and then creates one process per effective - # processor" - # https://blog.kitware.com/cmake-building-with-all-your-cores/ - # https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") - endif() - - add_definitions( - -D_CRT_SECURE_NO_WARNINGS=1 - -D_CRT_SECURE_NO_DEPRECATE=1 - ) - - if (MSVC_VERSION LESS 1600) - # Starting with Visual Studio >= 2010 (i.e. macro _MSC_VER >= - # 1600), Microsoft ships a standard-compliant - # header. For earlier versions of Visual Studio, give access to a - # compatibility header. - # http://stackoverflow.com/a/70630/881731 - # https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#External_links - include_directories(${CMAKE_CURRENT_LIST_DIR}/../../Resources/ThirdParty/VisualStudio) - endif() - - link_libraries(netapi32) -endif() - - -if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - # In FreeBSD/OpenBSD, the "/usr/local/" folder contains the ports and need to be imported - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib") -endif() - - -if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "kFreeBSD" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" OR - ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" AND - NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") - # The "--no-undefined" linker flag makes the shared libraries - # (plugins ModalityWorklists and ServeFolders) fail to compile on - # OpenBSD, and make the PostgreSQL plugin complain about missing - # "environ" global variable in FreeBSD - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") - endif() - - # Remove the "-rdynamic" option - # http://www.mail-archive.com/cmake@cmake.org/msg08837.html - set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") - link_libraries(pthread) - - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - link_libraries(rt) - endif() - - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND - NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - link_libraries(dl) - endif() - - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND - NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - # The "--as-needed" linker flag is not available on FreeBSD and OpenBSD - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--as-needed") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--as-needed") - endif() - - if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND - NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - # FreeBSD/OpenBSD have just one single interface for file - # handling, which is 64bit clean, so there is no need to define macro - # for LFS (Large File Support). - # https://ohse.de/uwe/articles/lfs.html - add_definitions( - -D_LARGEFILE64_SOURCE=1 - -D_FILE_OFFSET_BITS=64 - ) - endif() - -elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - if (MSVC) - message("MSVC compiler version = " ${MSVC_VERSION} "\n") - # Starting Visual Studio 2013 (version 1800), it is not possible - # to target Windows XP anymore - if (MSVC_VERSION LESS 1800) - add_definitions( - -DWINVER=0x0501 - -D_WIN32_WINNT=0x0501 - ) - endif() - else() - add_definitions( - -DWINVER=0x0501 - -D_WIN32_WINNT=0x0501 - ) - endif() - - add_definitions( - -D_CRT_SECURE_NO_WARNINGS=1 - ) - link_libraries(rpcrt4 ws2_32) - - if (CMAKE_COMPILER_IS_GNUCXX) - # Some additional C/C++ compiler flags for MinGW - SET(MINGW_NO_WARNINGS "-Wno-unused-function -Wno-unused-variable") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MINGW_NO_WARNINGS} -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MINGW_NO_WARNINGS}") - - if (DYNAMIC_MINGW_STDLIB) - else() - # This is a patch for MinGW64 - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++") - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++") - endif() - - CHECK_LIBRARY_EXISTS(winpthread pthread_create "" HAVE_WIN_PTHREAD) - if (HAVE_WIN_PTHREAD) - if (DYNAMIC_MINGW_STDLIB) - else() - # This line is necessary to compile with recent versions of MinGW, - # otherwise "libwinpthread-1.dll" is not statically linked. - SET(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic") - endif() - add_definitions(-DHAVE_WIN_PTHREAD=1) - else() - add_definitions(-DHAVE_WIN_PTHREAD=0) - endif() - endif() - -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - add_definitions( - -D_XOPEN_SOURCE=1 - ) - link_libraries(iconv) - -elseif (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - message("Building using Emscripten (for WebAssembly or asm.js targets)") - include(${CMAKE_CURRENT_LIST_DIR}/EmscriptenParameters.cmake) - -elseif (CMAKE_SYSTEM_NAME STREQUAL "Android") - -else() - message("Unknown target platform: ${CMAKE_SYSTEM_NAME}") - message(FATAL_ERROR "Support your platform here") -endif() - - -if (DEFINED ENABLE_PROFILING AND ENABLE_PROFILING) - if (CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pg") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") - else() - message(FATAL_ERROR "Don't know how to enable profiling on your configuration") - endif() -endif() - - -if (CMAKE_COMPILER_IS_GNUCXX) - # "When creating a static library using binutils (ar) and there - # exist a duplicate object name (e.g. a/Foo.cpp.o, b/Foo.cpp.o), the - # resulting static library can end up having only one of the - # duplicate objects. [...] This bug only happens if there are many - # objects." The trick consists in replacing the "r" argument - # ("replace") provided to "ar" (as used in CMake < 3.1) by the "q" - # argument ("quick append"). This is because of the fact that CMake - # will invoke "ar" several times with several batches of ".o" - # objects, and using "r" would overwrite symbols defined in - # preceding batches. https://cmake.org/Bug/view.php?id=14874 - set(CMAKE_CXX_ARCHIVE_APPEND " q ") -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/DownloadOrthancFramework.cmake --- a/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,535 +0,0 @@ -# Orthanc - A Lightweight, RESTful DICOM Store -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., 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. -# -# In addition, as a special exception, the copyright holders of this -# program give permission to link the code of its release with the -# OpenSSL project's "OpenSSL" library (or with modified versions of it -# that use the same license as the "OpenSSL" library), and distribute -# the linked executables. You must obey the GNU General Public License -# in all respects for all of the code used other than "OpenSSL". If you -# modify file(s) with this exception, you may extend this exception to -# your version of the file(s), but you are not obligated to do so. If -# you do not wish to do so, delete this exception statement from your -# version. If you delete this exception statement from all source files -# in the program, then also delete it here. -# -# 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 . - - - -## -## Check whether the parent script sets the mandatory variables -## - -if (NOT DEFINED ORTHANC_FRAMEWORK_SOURCE OR - (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system" AND - NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg" AND - NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "web" AND - NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" AND - NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "path")) - message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_SOURCE must be set to \"system\", \"hg\", \"web\", \"archive\" or \"path\"") -endif() - - -## -## Detection of the requested version -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg" OR - ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR - ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") - if (NOT DEFINED ORTHANC_FRAMEWORK_VERSION) - message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_VERSION must be set") - endif() - - if (DEFINED ORTHANC_FRAMEWORK_MAJOR OR - DEFINED ORTHANC_FRAMEWORK_MINOR OR - DEFINED ORTHANC_FRAMEWORK_REVISION OR - DEFINED ORTHANC_FRAMEWORK_MD5) - message(FATAL_ERROR "Some internal variable has been set") - endif() - - set(ORTHANC_FRAMEWORK_MD5 "") - - if (NOT DEFINED ORTHANC_FRAMEWORK_BRANCH) - if (ORTHANC_FRAMEWORK_VERSION STREQUAL "mainline") - set(ORTHANC_FRAMEWORK_BRANCH "default") - set(ORTHANC_FRAMEWORK_MAJOR 999) - set(ORTHANC_FRAMEWORK_MINOR 999) - set(ORTHANC_FRAMEWORK_REVISION 999) - - else() - set(ORTHANC_FRAMEWORK_BRANCH "Orthanc-${ORTHANC_FRAMEWORK_VERSION}") - - set(RE "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$") - string(REGEX REPLACE ${RE} "\\1" ORTHANC_FRAMEWORK_MAJOR ${ORTHANC_FRAMEWORK_VERSION}) - string(REGEX REPLACE ${RE} "\\2" ORTHANC_FRAMEWORK_MINOR ${ORTHANC_FRAMEWORK_VERSION}) - string(REGEX REPLACE ${RE} "\\3" ORTHANC_FRAMEWORK_REVISION ${ORTHANC_FRAMEWORK_VERSION}) - - if (NOT ORTHANC_FRAMEWORK_MAJOR MATCHES "^[0-9]+$" OR - NOT ORTHANC_FRAMEWORK_MINOR MATCHES "^[0-9]+$" OR - NOT ORTHANC_FRAMEWORK_REVISION MATCHES "^[0-9]+$") - message("Bad version of the Orthanc framework: ${ORTHANC_FRAMEWORK_VERSION}") - endif() - - if (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.3.1") - set(ORTHANC_FRAMEWORK_MD5 "dac95bd6cf86fb19deaf4e612961f378") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.3.2") - set(ORTHANC_FRAMEWORK_MD5 "d0ccdf68e855d8224331f13774992750") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.0") - set(ORTHANC_FRAMEWORK_MD5 "81e15f34d97ac32bbd7d26e85698835a") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.1") - set(ORTHANC_FRAMEWORK_MD5 "9b6f6114264b17ed421b574cd6476127") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.4.2") - set(ORTHANC_FRAMEWORK_MD5 "d1ee84927dcf668e60eb5868d24b9394") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.0") - set(ORTHANC_FRAMEWORK_MD5 "4429d8d9dea4ff6648df80ec3c64d79e") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.1") - set(ORTHANC_FRAMEWORK_MD5 "099671538865e5da96208b37494d6718") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.2") - set(ORTHANC_FRAMEWORK_MD5 "8867050f3e9a1ce6157c1ea7a9433b1b") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.3") - set(ORTHANC_FRAMEWORK_MD5 "bf2f5ed1adb8b0fc5f10d278e68e1dfe") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.4") - set(ORTHANC_FRAMEWORK_MD5 "404baef5d4c43e7c5d9410edda8ef5a5") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.5") - set(ORTHANC_FRAMEWORK_MD5 "cfc437e0687ae4bd725fd93dc1f08bc4") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.6") - set(ORTHANC_FRAMEWORK_MD5 "3c29de1e289b5472342947168f0105c0") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.7") - set(ORTHANC_FRAMEWORK_MD5 "e1b76f01116d9b5d4ac8cc39980560e3") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.5.8") - set(ORTHANC_FRAMEWORK_MD5 "82323e8c49a667f658a3639ea4dbc336") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.6.0") - set(ORTHANC_FRAMEWORK_MD5 "eab428d6e53f61e847fa360bb17ebe25") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.6.1") - set(ORTHANC_FRAMEWORK_MD5 "3971f5de96ba71dc9d3f3690afeaa7c0") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.7.0") - set(ORTHANC_FRAMEWORK_MD5 "ce5f689e852b01d3672bd3d2f952a5ef") - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "1.7.1") - set(ORTHANC_FRAMEWORK_MD5 "3c171217f930abe80246997bdbcaf7cc") - - # Below this point are development snapshots that were used to - # release some plugin, before an official release of the Orthanc - # framework was available. Here is the command to be used to - # generate a proper archive: - # - # $ hg archive /tmp/Orthanc-`hg id -i | sed 's/\+//'`.tar.gz - # - elseif (ORTHANC_FRAMEWORK_VERSION STREQUAL "ae0e3fd609df") - # DICOMweb 1.1 (framework pre-1.6.0) - set(ORTHANC_FRAMEWORK_MD5 "7e09e9b530a2f527854f0b782d7e0645") - endif() - endif() - endif() - -elseif (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - message("Using the Orthanc framework from a path of the filesystem. Assuming mainline version.") - set(ORTHANC_FRAMEWORK_MAJOR 999) - set(ORTHANC_FRAMEWORK_MINOR 999) - set(ORTHANC_FRAMEWORK_REVISION 999) -endif() - - - -## -## Detection of the third-party software -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg") - find_program(ORTHANC_FRAMEWORK_HG hg) - - if (${ORTHANC_FRAMEWORK_HG} MATCHES "ORTHANC_FRAMEWORK_HG-NOTFOUND") - message(FATAL_ERROR "Please install Mercurial") - endif() -endif() - - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR - ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - find_program(ORTHANC_FRAMEWORK_7ZIP 7z - PATHS - "$ENV{ProgramFiles}/7-Zip" - "$ENV{ProgramW6432}/7-Zip" - ) - - if (${ORTHANC_FRAMEWORK_7ZIP} MATCHES "ORTHANC_FRAMEWORK_7ZIP-NOTFOUND") - message(FATAL_ERROR "Please install the '7-zip' software (http://www.7-zip.org/)") - endif() - - else() - find_program(ORTHANC_FRAMEWORK_TAR tar) - if (${ORTHANC_FRAMEWORK_TAR} MATCHES "ORTHANC_FRAMEWORK_TAR-NOTFOUND") - message(FATAL_ERROR "Please install the 'tar' package") - endif() - endif() -endif() - - - -## -## Case of the Orthanc framework specified as a path on the filesystem -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "path") - if (NOT DEFINED ORTHANC_FRAMEWORK_ROOT) - message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_ROOT must provide the path to the sources of Orthanc") - endif() - - if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}) - message(FATAL_ERROR "Non-existing directory: ${ORTHANC_FRAMEWORK_ROOT}") - endif() - - if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) - message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_FRAMEWORK_ROOT}") - endif() -endif() - - - -## -## Case of the Orthanc framework cloned using Mercurial -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "hg") - if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) - message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") - endif() - - set(ORTHANC_ROOT ${CMAKE_BINARY_DIR}/orthanc) - - if (EXISTS ${ORTHANC_ROOT}) - message("Updating the Orthanc source repository using Mercurial") - execute_process( - COMMAND ${ORTHANC_FRAMEWORK_HG} pull - WORKING_DIRECTORY ${ORTHANC_ROOT} - RESULT_VARIABLE Failure - ) - else() - message("Forking the Orthanc source repository using Mercurial") - execute_process( - COMMAND ${ORTHANC_FRAMEWORK_HG} clone "https://hg.orthanc-server.com/orthanc/" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - endif() - - if (Failure OR NOT EXISTS ${ORTHANC_ROOT}) - message(FATAL_ERROR "Cannot fork the Orthanc repository") - endif() - - message("Setting branch of the Orthanc repository to: ${ORTHANC_FRAMEWORK_BRANCH}") - - execute_process( - COMMAND ${ORTHANC_FRAMEWORK_HG} update -c ${ORTHANC_FRAMEWORK_BRANCH} - WORKING_DIRECTORY ${ORTHANC_ROOT} - RESULT_VARIABLE Failure - ) - - if (Failure) - message(FATAL_ERROR "Error while running Mercurial") - endif() - - unset(ORTHANC_FRAMEWORK_ROOT CACHE) - set(ORTHANC_FRAMEWORK_ROOT "${ORTHANC_ROOT}/OrthancFramework" CACHE - STRING "Path to the Orthanc framework source directory") - - if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) - message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_ROOT}") - endif() - - unset(ORTHANC_ROOT) -endif() - - - -## -## Case of the Orthanc framework provided as a source archive on the -## filesystem -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive") - if (NOT DEFINED ORTHANC_FRAMEWORK_ARCHIVE) - message(FATAL_ERROR "The variable ORTHANC_FRAMEWORK_ARCHIVE must provide the path to the sources of Orthanc") - endif() -endif() - - - -## -## Case of the Orthanc framework downloaded from the Web -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") - if (DEFINED ORTHANC_FRAMEWORK_URL) - string(REGEX REPLACE "^.*/" "" ORTHANC_FRAMEMORK_FILENAME "${ORTHANC_FRAMEWORK_URL}") - else() - # Default case: Download from the official Web site - set(ORTHANC_FRAMEMORK_FILENAME Orthanc-${ORTHANC_FRAMEWORK_VERSION}.tar.gz) - set(ORTHANC_FRAMEWORK_URL "http://orthanc.osimis.io/ThirdPartyDownloads/orthanc-framework/${ORTHANC_FRAMEMORK_FILENAME}") - endif() - - set(ORTHANC_FRAMEWORK_ARCHIVE "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${ORTHANC_FRAMEMORK_FILENAME}") - - if (NOT EXISTS "${ORTHANC_FRAMEWORK_ARCHIVE}") - if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) - message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") - endif() - - message("Downloading: ${ORTHANC_FRAMEWORK_URL}") - - file(DOWNLOAD - "${ORTHANC_FRAMEWORK_URL}" "${ORTHANC_FRAMEWORK_ARCHIVE}" - SHOW_PROGRESS EXPECTED_MD5 "${ORTHANC_FRAMEWORK_MD5}" - TIMEOUT 60 - INACTIVITY_TIMEOUT 60 - ) - else() - message("Using local copy of: ${ORTHANC_FRAMEWORK_URL}") - endif() -endif() - - - - -## -## Uncompressing the Orthanc framework, if it was retrieved from a -## source archive on the filesystem, or from the official Web site -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "archive" OR - ORTHANC_FRAMEWORK_SOURCE STREQUAL "web") - - if (NOT DEFINED ORTHANC_FRAMEWORK_ARCHIVE OR - NOT DEFINED ORTHANC_FRAMEWORK_VERSION OR - NOT DEFINED ORTHANC_FRAMEWORK_MD5) - message(FATAL_ERROR "Internal error") - endif() - - if (ORTHANC_FRAMEWORK_MD5 STREQUAL "") - message(FATAL_ERROR "Unknown release of Orthanc: ${ORTHANC_FRAMEWORK_VERSION}") - endif() - - file(MD5 ${ORTHANC_FRAMEWORK_ARCHIVE} ActualMD5) - - if (NOT "${ActualMD5}" STREQUAL "${ORTHANC_FRAMEWORK_MD5}") - message(FATAL_ERROR "The MD5 hash of the Orthanc archive is invalid: ${ORTHANC_FRAMEWORK_ARCHIVE}") - endif() - - set(ORTHANC_ROOT "${CMAKE_BINARY_DIR}/Orthanc-${ORTHANC_FRAMEWORK_VERSION}") - - if (NOT IS_DIRECTORY "${ORTHANC_ROOT}") - if (NOT ORTHANC_FRAMEWORK_ARCHIVE MATCHES ".tar.gz$") - message(FATAL_ERROR "Archive should have the \".tar.gz\" extension: ${ORTHANC_FRAMEWORK_ARCHIVE}") - endif() - - message("Uncompressing: ${ORTHANC_FRAMEWORK_ARCHIVE}") - - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - # How to silently extract files using 7-zip - # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly - - execute_process( - COMMAND ${ORTHANC_FRAMEWORK_7ZIP} e -y ${ORTHANC_FRAMEWORK_ARCHIVE} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - get_filename_component(TMP_FILENAME "${ORTHANC_FRAMEWORK_ARCHIVE}" NAME) - string(REGEX REPLACE ".gz$" "" TMP_FILENAME2 "${TMP_FILENAME}") - - execute_process( - COMMAND ${ORTHANC_FRAMEWORK_7ZIP} x -y ${TMP_FILENAME2} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - - else() - execute_process( - COMMAND sh -c "${ORTHANC_FRAMEWORK_TAR} xfz ${ORTHANC_FRAMEWORK_ARCHIVE}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - endif() - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - if (NOT IS_DIRECTORY "${ORTHANC_ROOT}") - message(FATAL_ERROR "The Orthanc framework was not uncompressed at the proper location. Check the CMake instructions.") - endif() - endif() - - unset(ORTHANC_FRAMEWORK_ROOT CACHE) - set(ORTHANC_FRAMEWORK_ROOT "${ORTHANC_ROOT}/OrthancFramework" CACHE - STRING "Path to the Orthanc framework source directory") - - if (NOT EXISTS ${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkParameters.cmake) - message(FATAL_ERROR "Directory not containing the source code of the Orthanc framework: ${ORTHANC_ROOT}") - endif() - - unset(ORTHANC_ROOT) -endif() - - - -## -## Case of the Orthanc framework installed as a shared library in a -## GNU/Linux distribution (typically Debian). New in Orthanc 1.7.2. -## - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - set(ORTHANC_FRAMEWORK_LIBDIR "" CACHE PATH "") - - if (CMAKE_SYSTEM_NAME STREQUAL "Windows" AND - CMAKE_COMPILER_IS_GNUCXX) # MinGW - set(DYNAMIC_MINGW_STDLIB ON) # Disable static linking against libc (to throw exceptions) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libstdc++") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++") - endif() - - include(CheckIncludeFile) - include(CheckIncludeFileCXX) - include(FindPythonInterp) - include(${CMAKE_CURRENT_LIST_DIR}/Compiler.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/DownloadPackage.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/AutoGeneratedCode.cmake) - set(EMBED_RESOURCES_PYTHON ${CMAKE_CURRENT_LIST_DIR}/EmbedResources.py) - - if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR - ORTHANC_FRAMEWORK_STATIC) - include_directories(${ORTHANC_FRAMEWORK_ROOT}/..) - else() - # Look for mandatory dependency JsonCpp (cf. JsonCppConfiguration.cmake) - find_path(JSONCPP_INCLUDE_DIR json/reader.h - /usr/include/jsoncpp - /usr/local/include/jsoncpp - ) - - message("JsonCpp include dir: ${JSONCPP_INCLUDE_DIR}") - include_directories(${JSONCPP_INCLUDE_DIR}) - link_libraries(jsoncpp) - - CHECK_INCLUDE_FILE_CXX(${JSONCPP_INCLUDE_DIR}/json/reader.h HAVE_JSONCPP_H) - if (NOT HAVE_JSONCPP_H) - message(FATAL_ERROR "Please install the libjsoncpp-dev package") - endif() - - # Look for mandatory dependency Boost (cf. BoostConfiguration.cmake) - include(FindBoost) - find_package(Boost COMPONENTS filesystem thread system date_time regex ${ORTHANC_BOOST_COMPONENTS}) - - if (NOT Boost_FOUND) - message(FATAL_ERROR "Unable to locate Boost on this system") - endif() - - include_directories(${Boost_INCLUDE_DIRS}) - link_libraries(${Boost_LIBRARIES}) - - # Optional component - Lua - if (ENABLE_LUA) - include(FindLua) - - if (NOT LUA_FOUND) - message(FATAL_ERROR "Please install the liblua-dev package") - endif() - - include_directories(${LUA_INCLUDE_DIR}) - link_libraries(${LUA_LIBRARIES}) - endif() - - # Optional component - SQLite - if (ENABLE_SQLITE) - CHECK_INCLUDE_FILE(sqlite3.h HAVE_SQLITE_H) - if (NOT HAVE_SQLITE_H) - message(FATAL_ERROR "Please install the libsqlite3-dev package") - endif() - link_libraries(sqlite3) - endif() - - # Optional component - Pugixml - if (ENABLE_PUGIXML) - CHECK_INCLUDE_FILE_CXX(pugixml.hpp HAVE_PUGIXML_H) - if (NOT HAVE_PUGIXML_H) - message(FATAL_ERROR "Please install the libpugixml-dev package") - endif() - link_libraries(pugixml) - endif() - - # Optional component - DCMTK - if (ENABLE_DCMTK) - include(FindDCMTK) - include_directories(${DCMTK_INCLUDE_DIRS}) - link_libraries(${DCMTK_LIBRARIES}) - endif() - endif() - - # Look for Orthanc framework shared library - include(CheckCXXSymbolExists) - - if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - set(ORTHANC_FRAMEWORK_INCLUDE_DIR ${ORTHANC_FRAMEWORK_ROOT}) - else() - find_path(ORTHANC_FRAMEWORK_INCLUDE_DIR OrthancFramework.h - /usr/include/orthanc-framework - /usr/local/include/orthanc-framework - ${ORTHANC_FRAMEWORK_ROOT} - ) - endif() - - if (${ORTHANC_FRAMEWORK_INCLUDE_DIR} STREQUAL "ORTHANC_FRAMEWORK_INCLUDE_DIR-NOTFOUND") - message(FATAL_ERROR "Cannot locate the OrthancFramework.h header") - endif() - - message("Orthanc framework include dir: ${ORTHANC_FRAMEWORK_INCLUDE_DIR}") - include_directories(${ORTHANC_FRAMEWORK_INCLUDE_DIR}) - - if ("${ORTHANC_FRAMEWORK_LIBDIR}" STREQUAL "") - set(ORTHANC_FRAMEWORK_LIBRARIES OrthancFramework) - else() - if (MSVC) - set(Suffix ".lib") - set(Prefix "") - else() - list(GET CMAKE_FIND_LIBRARY_PREFIXES 0 Prefix) - list(GET CMAKE_FIND_LIBRARY_SUFFIXES 0 Suffix) - endif() - set(ORTHANC_FRAMEWORK_LIBRARIES ${ORTHANC_FRAMEWORK_LIBDIR}/${Prefix}OrthancFramework${Suffix}) - endif() - - set(CMAKE_REQUIRED_INCLUDES "${ORTHANC_FRAMEWORK_INCLUDE_DIR}") - set(CMAKE_REQUIRED_LIBRARIES "${ORTHANC_FRAMEWORK_LIBRARIES}") - - check_cxx_symbol_exists("Orthanc::InitializeFramework" "OrthancFramework.h" HAVE_ORTHANC_FRAMEWORK) - if (NOT HAVE_ORTHANC_FRAMEWORK) - message(FATAL_ERROR "Cannot find the Orthanc framework") - endif() - - unset(CMAKE_REQUIRED_INCLUDES) - unset(CMAKE_REQUIRED_LIBRARIES) - - if (NOT "${ORTHANC_FRAMEWORK_ROOT}" STREQUAL "") - include_directories(${ORTHANC_FRAMEWORK_ROOT}) - endif() -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/DownloadPackage.cmake --- a/Resources/Orthanc/CMake/DownloadPackage.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,258 +0,0 @@ -macro(GetUrlFilename TargetVariable Url) - string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${Url}") -endmacro() - - -macro(GetUrlExtension TargetVariable Url) - #string(REGEX REPLACE "^.*/[^.]*\\." "" TMP "${Url}") - string(REGEX REPLACE "^.*\\." "" TMP "${Url}") - string(TOLOWER "${TMP}" "${TargetVariable}") -endmacro() - - - -## -## Setup the patch command-line tool -## - -if (NOT ORTHANC_DISABLE_PATCH) - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - set(PATCH_EXECUTABLE ${CMAKE_CURRENT_LIST_DIR}/../ThirdParty/patch/patch.exe) - if (NOT EXISTS ${PATCH_EXECUTABLE}) - message(FATAL_ERROR "Unable to find the patch.exe tool that is shipped with Orthanc") - endif() - - else () - find_program(PATCH_EXECUTABLE patch) - if (${PATCH_EXECUTABLE} MATCHES "PATCH_EXECUTABLE-NOTFOUND") - message(FATAL_ERROR "Please install the 'patch' standard command-line tool") - endif() - endif() -endif() - - - -## -## Check the existence of the required decompression tools -## - -if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - find_program(ZIP_EXECUTABLE 7z - PATHS - "$ENV{ProgramFiles}/7-Zip" - "$ENV{ProgramW6432}/7-Zip" - ) - - if (${ZIP_EXECUTABLE} MATCHES "ZIP_EXECUTABLE-NOTFOUND") - message(FATAL_ERROR "Please install the '7-zip' software (http://www.7-zip.org/)") - endif() - -else() - find_program(UNZIP_EXECUTABLE unzip) - if (${UNZIP_EXECUTABLE} MATCHES "UNZIP_EXECUTABLE-NOTFOUND") - message(FATAL_ERROR "Please install the 'unzip' package") - endif() - - find_program(TAR_EXECUTABLE tar) - if (${TAR_EXECUTABLE} MATCHES "TAR_EXECUTABLE-NOTFOUND") - message(FATAL_ERROR "Please install the 'tar' package") - endif() - - find_program(GUNZIP_EXECUTABLE gunzip) - if (${GUNZIP_EXECUTABLE} MATCHES "GUNZIP_EXECUTABLE-NOTFOUND") - message(FATAL_ERROR "Please install the 'gzip' package") - endif() -endif() - - -macro(DownloadFile MD5 Url) - GetUrlFilename(TMP_FILENAME "${Url}") - - set(TMP_PATH "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${TMP_FILENAME}") - if (NOT EXISTS "${TMP_PATH}") - message("Downloading ${Url}") - - # This fixes issue 6: "I think cmake shouldn't download the - # packages which are not in the system, it should stop and let - # user know." - # https://code.google.com/p/orthanc/issues/detail?id=6 - if (NOT STATIC_BUILD AND NOT ALLOW_DOWNLOADS) - message(FATAL_ERROR "CMake is not allowed to download from Internet. Please set the ALLOW_DOWNLOADS option to ON") - endif() - - if ("${MD5}" STREQUAL "no-check") - message(WARNING "Not checking the MD5 of: ${Url}") - file(DOWNLOAD "${Url}" "${TMP_PATH}" - SHOW_PROGRESS TIMEOUT 300 INACTIVITY_TIMEOUT 60 - STATUS Failure) - else() - file(DOWNLOAD "${Url}" "${TMP_PATH}" - SHOW_PROGRESS TIMEOUT 300 INACTIVITY_TIMEOUT 60 - EXPECTED_MD5 "${MD5}" STATUS Failure) - endif() - - list(GET Failure 0 Status) - if (NOT Status EQUAL 0) - message(FATAL_ERROR "Cannot download file: ${Url}") - endif() - - else() - message("Using local copy of ${Url}") - - if ("${MD5}" STREQUAL "no-check") - message(WARNING "Not checking the MD5 of: ${Url}") - else() - file(MD5 ${TMP_PATH} ActualMD5) - if (NOT "${ActualMD5}" STREQUAL "${MD5}") - message(FATAL_ERROR "The MD5 hash of a previously download file is invalid: ${TMP_PATH}") - endif() - endif() - endif() -endmacro() - - -macro(DownloadPackage MD5 Url TargetDirectory) - if (NOT IS_DIRECTORY "${TargetDirectory}") - DownloadFile("${MD5}" "${Url}") - - GetUrlExtension(TMP_EXTENSION "${Url}") - #message(${TMP_EXTENSION}) - message("Uncompressing ${TMP_FILENAME}") - - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - # How to silently extract files using 7-zip - # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly - - if (("${TMP_EXTENSION}" STREQUAL "gz") OR - ("${TMP_EXTENSION}" STREQUAL "tgz") OR - ("${TMP_EXTENSION}" STREQUAL "xz")) - execute_process( - COMMAND ${ZIP_EXECUTABLE} e -y ${TMP_PATH} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - if ("${TMP_EXTENSION}" STREQUAL "tgz") - string(REGEX REPLACE ".tgz$" ".tar" TMP_FILENAME2 "${TMP_FILENAME}") - elseif ("${TMP_EXTENSION}" STREQUAL "gz") - string(REGEX REPLACE ".gz$" "" TMP_FILENAME2 "${TMP_FILENAME}") - elseif ("${TMP_EXTENSION}" STREQUAL "xz") - string(REGEX REPLACE ".xz" "" TMP_FILENAME2 "${TMP_FILENAME}") - endif() - - execute_process( - COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_FILENAME2} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - elseif ("${TMP_EXTENSION}" STREQUAL "zip") - execute_process( - COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_PATH} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - else() - message(FATAL_ERROR "Unsupported package extension: ${TMP_EXTENSION}") - endif() - - else() - if ("${TMP_EXTENSION}" STREQUAL "zip") - execute_process( - COMMAND sh -c "${UNZIP_EXECUTABLE} -q ${TMP_PATH}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - elseif (("${TMP_EXTENSION}" STREQUAL "gz") OR ("${TMP_EXTENSION}" STREQUAL "tgz")) - #message("tar xvfz ${TMP_PATH}") - execute_process( - COMMAND sh -c "${TAR_EXECUTABLE} xfz ${TMP_PATH}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - elseif ("${TMP_EXTENSION}" STREQUAL "bz2") - execute_process( - COMMAND sh -c "${TAR_EXECUTABLE} xfj ${TMP_PATH}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - elseif ("${TMP_EXTENSION}" STREQUAL "xz") - execute_process( - COMMAND sh -c "${TAR_EXECUTABLE} xf ${TMP_PATH}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - ) - else() - message(FATAL_ERROR "Unsupported package extension: ${TMP_EXTENSION}") - endif() - endif() - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - if (NOT IS_DIRECTORY "${TargetDirectory}") - message(FATAL_ERROR "The package was not uncompressed at the proper location. Check the CMake instructions.") - endif() - endif() -endmacro() - - - -macro(DownloadCompressedFile MD5 Url TargetFile) - if (NOT EXISTS "${TargetFile}") - DownloadFile("${MD5}" "${Url}") - - GetUrlExtension(TMP_EXTENSION "${Url}") - #message(${TMP_EXTENSION}) - message("Uncompressing ${TMP_FILENAME}") - - if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") - # How to silently extract files using 7-zip - # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly - - if ("${TMP_EXTENSION}" STREQUAL "gz") - execute_process( - # "-so" writes uncompressed file to stdout - COMMAND ${ZIP_EXECUTABLE} e -so -y ${TMP_PATH} - OUTPUT_FILE "${TargetFile}" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - RESULT_VARIABLE Failure - OUTPUT_QUIET - ) - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - else() - message(FATAL_ERROR "Unsupported file extension: ${TMP_EXTENSION}") - endif() - - else() - if ("${TMP_EXTENSION}" STREQUAL "gz") - execute_process( - COMMAND sh -c "${GUNZIP_EXECUTABLE} -c ${TMP_PATH}" - OUTPUT_FILE "${TargetFile}" - RESULT_VARIABLE Failure - ) - else() - message(FATAL_ERROR "Unsupported file extension: ${TMP_EXTENSION}") - endif() - endif() - - if (Failure) - message(FATAL_ERROR "Error while running the uncompression tool") - endif() - - if (NOT EXISTS "${TargetFile}") - message(FATAL_ERROR "The file was not uncompressed at the proper location. Check the CMake instructions.") - endif() - endif() -endmacro() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/EmbedResources.py --- a/Resources/Orthanc/CMake/EmbedResources.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,455 +0,0 @@ -#!/usr/bin/python - -# Orthanc - A Lightweight, RESTful DICOM Store -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., 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. -# -# In addition, as a special exception, the copyright holders of this -# program give permission to link the code of its release with the -# OpenSSL project's "OpenSSL" library (or with modified versions of it -# that use the same license as the "OpenSSL" library), and distribute -# the linked executables. You must obey the GNU General Public License -# in all respects for all of the code used other than "OpenSSL". If you -# modify file(s) with this exception, you may extend this exception to -# your version of the file(s), but you are not obligated to do so. If -# you do not wish to do so, delete this exception statement from your -# version. If you delete this exception statement from all source files -# in the program, then also delete it here. -# -# 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 . - - -import sys -import os -import os.path -import pprint -import re - -UPCASE_CHECK = True -USE_SYSTEM_EXCEPTION = False -EXCEPTION_CLASS = 'OrthancException' -OUT_OF_RANGE_EXCEPTION = '::Orthanc::OrthancException(::Orthanc::ErrorCode_ParameterOutOfRange)' -INEXISTENT_PATH_EXCEPTION = '::Orthanc::OrthancException(::Orthanc::ErrorCode_InexistentItem)' -NAMESPACE = 'Orthanc.EmbeddedResources' -FRAMEWORK_PATH = None - -ARGS = [] -for i in range(len(sys.argv)): - if not sys.argv[i].startswith('--'): - ARGS.append(sys.argv[i]) - elif sys.argv[i].lower() == '--no-upcase-check': - UPCASE_CHECK = False - elif sys.argv[i].lower() == '--system-exception': - USE_SYSTEM_EXCEPTION = True - EXCEPTION_CLASS = '::std::runtime_error' - OUT_OF_RANGE_EXCEPTION = '%s("Parameter out of range")' % EXCEPTION_CLASS - INEXISTENT_PATH_EXCEPTION = '%s("Unknown path in a directory resource")' % EXCEPTION_CLASS - elif sys.argv[i].startswith('--namespace='): - NAMESPACE = sys.argv[i][sys.argv[i].find('=') + 1 : ] - elif sys.argv[i].startswith('--framework-path='): - FRAMEWORK_PATH = sys.argv[i][sys.argv[i].find('=') + 1 : ] - -if len(ARGS) < 2 or len(ARGS) % 2 != 0: - print ('Usage:') - print ('python %s [--no-upcase-check] [--system-exception] [--namespace=] [ ]*' % sys.argv[0]) - exit(-1) - -TARGET_BASE_FILENAME = ARGS[1] -SOURCES = ARGS[2:] - -try: - # Make sure the destination directory exists - os.makedirs(os.path.normpath(os.path.join(TARGET_BASE_FILENAME, '..'))) -except: - pass - - -##################################################################### -## Read each resource file -##################################################################### - -def CheckNoUpcase(s): - global UPCASE_CHECK - if (UPCASE_CHECK and - re.search('[A-Z]', s) != None): - raise Exception("Path in a directory with an upcase letter: %s" % s) - -resources = {} - -counter = 0 -i = 0 -while i < len(SOURCES): - resourceName = SOURCES[i].upper() - pathName = SOURCES[i + 1] - - if not os.path.exists(pathName): - raise Exception("Non existing path: %s" % pathName) - - if resourceName in resources: - raise Exception("Twice the same resource: " + resourceName) - - if os.path.isdir(pathName): - # The resource is a directory: Recursively explore its files - content = {} - for root, dirs, files in os.walk(pathName): - dirs.sort() - files.sort() - base = os.path.relpath(root, pathName) - - # Fix issue #24 (Build fails on OSX when directory has .DS_Store files): - # Ignore folders whose name starts with a dot (".") - if base.find('/.') != -1: - print('Ignoring folder: %s' % root) - continue - - for f in files: - if f.find('~') == -1: # Ignore Emacs backup files - if base == '.': - r = f - else: - r = os.path.join(base, f) - - CheckNoUpcase(r) - r = '/' + r.replace('\\', '/') - if r in content: - raise Exception("Twice the same filename (check case): " + r) - - content[r] = { - 'Filename' : os.path.join(root, f), - 'Index' : counter - } - counter += 1 - - resources[resourceName] = { - 'Type' : 'Directory', - 'Files' : content - } - - elif os.path.isfile(pathName): - resources[resourceName] = { - 'Type' : 'File', - 'Index' : counter, - 'Filename' : pathName - } - counter += 1 - - else: - raise Exception("Not a regular file, nor a directory: " + pathName) - - i += 2 - -#pprint.pprint(resources) - - -##################################################################### -## Write .h header -##################################################################### - -header = open(TARGET_BASE_FILENAME + '.h', 'w') - -header.write(""" -#pragma once - -#include -#include - -#if defined(_MSC_VER) -# pragma warning(disable: 4065) // "Switch statement contains 'default' but no 'case' labels" -#endif - -""") - - -for ns in NAMESPACE.split('.'): - header.write('namespace %s {\n' % ns) - - -header.write(""" - enum FileResourceId - { -""") - -isFirst = True -for name in resources: - if resources[name]['Type'] == 'File': - if isFirst: - isFirst = False - else: - header.write(',\n') - header.write(' %s' % name) - -header.write(""" - }; - - enum DirectoryResourceId - { -""") - -isFirst = True -for name in resources: - if resources[name]['Type'] == 'Directory': - if isFirst: - isFirst = False - else: - header.write(',\n') - header.write(' %s' % name) - -header.write(""" - }; - - const void* GetFileResourceBuffer(FileResourceId id); - size_t GetFileResourceSize(FileResourceId id); - void GetFileResource(std::string& result, FileResourceId id); - - const void* GetDirectoryResourceBuffer(DirectoryResourceId id, const char* path); - size_t GetDirectoryResourceSize(DirectoryResourceId id, const char* path); - void GetDirectoryResource(std::string& result, DirectoryResourceId id, const char* path); - - void ListResources(std::list& result, DirectoryResourceId id); - -""") - - -for ns in NAMESPACE.split('.'): - header.write('}\n') - -header.close() - - - -##################################################################### -## Write the resource content in the .cpp source -##################################################################### - -PYTHON_MAJOR_VERSION = sys.version_info[0] - -def WriteResource(cpp, item): - cpp.write(' static const uint8_t resource%dBuffer[] = {' % item['Index']) - - f = open(item['Filename'], "rb") - content = f.read() - f.close() - - # http://stackoverflow.com/a/1035360 - pos = 0 - buffer = [] # instead of appending a few bytes at a time to the cpp file, - # we first append each chunk to a list, join it and write it - # to the file. We've measured that it was 2-3 times faster in python3. - # Note that speed is important since if generation is too slow, - # cmake might try to compile the EmbeddedResources.cpp file while it is - # still being generated ! - for b in content: - if PYTHON_MAJOR_VERSION == 2: - c = ord(b[0]) - else: - c = b - - if pos > 0: - buffer.append(",") - - if (pos % 16) == 0: - buffer.append("\n") - - if c < 0: - raise Exception("Internal error") - - buffer.append("0x%02x" % c) - pos += 1 - - cpp.write("".join(buffer)) - # Zero-size array are disallowed, so we put one single void character in it. - if pos == 0: - cpp.write(' 0') - - cpp.write(' };\n') - cpp.write(' static const size_t resource%dSize = %d;\n' % (item['Index'], pos)) - - -cpp = open(TARGET_BASE_FILENAME + '.cpp', 'w') - -cpp.write('#include "%s.h"\n' % os.path.basename(TARGET_BASE_FILENAME)) - -if USE_SYSTEM_EXCEPTION: - cpp.write('#include ') -elif FRAMEWORK_PATH != None: - cpp.write('#include "%s/OrthancException.h"' % FRAMEWORK_PATH) -else: - cpp.write('#include ') - -cpp.write(""" -#include -#include - -""") - -for ns in NAMESPACE.split('.'): - cpp.write('namespace %s {\n' % ns) - - -for name in resources: - if resources[name]['Type'] == 'File': - WriteResource(cpp, resources[name]) - else: - for f in resources[name]['Files']: - WriteResource(cpp, resources[name]['Files'][f]) - - - -##################################################################### -## Write the accessors to the file resources in .cpp -##################################################################### - -cpp.write(""" - const void* GetFileResourceBuffer(FileResourceId id) - { - switch (id) - { -""") -for name in resources: - if resources[name]['Type'] == 'File': - cpp.write(' case %s:\n' % name) - cpp.write(' return resource%dBuffer;\n' % resources[name]['Index']) - -cpp.write(""" - default: - throw %s; - } - } - - size_t GetFileResourceSize(FileResourceId id) - { - switch (id) - { -""" % OUT_OF_RANGE_EXCEPTION) - -for name in resources: - if resources[name]['Type'] == 'File': - cpp.write(' case %s:\n' % name) - cpp.write(' return resource%dSize;\n' % resources[name]['Index']) - -cpp.write(""" - default: - throw %s; - } - } -""" % OUT_OF_RANGE_EXCEPTION) - - - -##################################################################### -## Write the accessors to the directory resources in .cpp -##################################################################### - -cpp.write(""" - const void* GetDirectoryResourceBuffer(DirectoryResourceId id, const char* path) - { - switch (id) - { -""") - -for name in resources: - if resources[name]['Type'] == 'Directory': - cpp.write(' case %s:\n' % name) - isFirst = True - for path in resources[name]['Files']: - cpp.write(' if (!strcmp(path, "%s"))\n' % path) - cpp.write(' return resource%dBuffer;\n' % resources[name]['Files'][path]['Index']) - cpp.write(' throw %s;\n\n' % INEXISTENT_PATH_EXCEPTION) - -cpp.write(""" default: - throw %s; - } - } - - size_t GetDirectoryResourceSize(DirectoryResourceId id, const char* path) - { - switch (id) - { -""" % OUT_OF_RANGE_EXCEPTION) - -for name in resources: - if resources[name]['Type'] == 'Directory': - cpp.write(' case %s:\n' % name) - isFirst = True - for path in resources[name]['Files']: - cpp.write(' if (!strcmp(path, "%s"))\n' % path) - cpp.write(' return resource%dSize;\n' % resources[name]['Files'][path]['Index']) - cpp.write(' throw %s;\n\n' % INEXISTENT_PATH_EXCEPTION) - -cpp.write(""" default: - throw %s; - } - } -""" % OUT_OF_RANGE_EXCEPTION) - - - - -##################################################################### -## List the resources in a directory -##################################################################### - -cpp.write(""" - void ListResources(std::list& result, DirectoryResourceId id) - { - result.clear(); - - switch (id) - { -""") - -for name in resources: - if resources[name]['Type'] == 'Directory': - cpp.write(' case %s:\n' % name) - for path in sorted(resources[name]['Files']): - cpp.write(' result.push_back("%s");\n' % path) - cpp.write(' break;\n\n') - -cpp.write(""" default: - throw %s; - } - } -""" % OUT_OF_RANGE_EXCEPTION) - - - - -##################################################################### -## Write the convenience wrappers in .cpp -##################################################################### - -cpp.write(""" - void GetFileResource(std::string& result, FileResourceId id) - { - size_t size = GetFileResourceSize(id); - result.resize(size); - if (size > 0) - memcpy(&result[0], GetFileResourceBuffer(id), size); - } - - void GetDirectoryResource(std::string& result, DirectoryResourceId id, const char* path) - { - size_t size = GetDirectoryResourceSize(id, path); - result.resize(size); - if (size > 0) - memcpy(&result[0], GetDirectoryResourceBuffer(id, path), size); - } -""") - - -for ns in NAMESPACE.split('.'): - cpp.write('}\n') - -cpp.close() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/CMake/GoogleTestConfiguration.cmake --- a/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -if (USE_GOOGLE_TEST_DEBIAN_PACKAGE) - find_path(GOOGLE_TEST_DEBIAN_SOURCES_DIR - NAMES src/gtest-all.cc - PATHS - ${CROSSTOOL_NG_IMAGE}/usr/src/gtest - ${CROSSTOOL_NG_IMAGE}/usr/src/googletest/googletest - PATH_SUFFIXES src - ) - - find_path(GOOGLE_TEST_DEBIAN_INCLUDE_DIR - NAMES gtest.h - PATHS - ${CROSSTOOL_NG_IMAGE}/usr/include/gtest - ) - - message("Path to the Debian Google Test sources: ${GOOGLE_TEST_DEBIAN_SOURCES_DIR}") - message("Path to the Debian Google Test includes: ${GOOGLE_TEST_DEBIAN_INCLUDE_DIR}") - - set(GOOGLE_TEST_SOURCES - ${GOOGLE_TEST_DEBIAN_SOURCES_DIR}/src/gtest-all.cc - ) - - include_directories(${GOOGLE_TEST_DEBIAN_SOURCES_DIR}) - - if (NOT EXISTS ${GOOGLE_TEST_SOURCES} OR - NOT EXISTS ${GOOGLE_TEST_DEBIAN_INCLUDE_DIR}/gtest.h) - message(FATAL_ERROR "Please install the libgtest-dev package") - endif() - -elseif (STATIC_BUILD OR NOT USE_SYSTEM_GOOGLE_TEST) - set(GOOGLE_TEST_SOURCES_DIR ${CMAKE_BINARY_DIR}/googletest-release-1.8.1) - set(GOOGLE_TEST_URL "http://orthanc.osimis.io/ThirdPartyDownloads/gtest-1.8.1.tar.gz") - set(GOOGLE_TEST_MD5 "2e6fbeb6a91310a16efe181886c59596") - - DownloadPackage(${GOOGLE_TEST_MD5} ${GOOGLE_TEST_URL} "${GOOGLE_TEST_SOURCES_DIR}") - - include_directories( - ${GOOGLE_TEST_SOURCES_DIR}/googletest - ${GOOGLE_TEST_SOURCES_DIR}/googletest/include - ${GOOGLE_TEST_SOURCES_DIR} - ) - - set(GOOGLE_TEST_SOURCES - ${GOOGLE_TEST_SOURCES_DIR}/googletest/src/gtest-all.cc - ) - - # https://code.google.com/p/googletest/issues/detail?id=412 - if (MSVC) # VS2012 does not support tuples correctly yet - add_definitions(/D _VARIADIC_MAX=10) - endif() - - if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase") - add_definitions(-DGTEST_HAS_CLONE=0) - endif() - - source_group(ThirdParty\\GoogleTest REGULAR_EXPRESSION ${GOOGLE_TEST_SOURCES_DIR}/.*) - -else() - include(FindGTest) - if (NOT GTEST_FOUND) - message(FATAL_ERROR "Unable to find GoogleTest") - endif() - - include_directories(${GTEST_INCLUDE_DIRS}) - - # The variable GTEST_LIBRARIES contains the shared library of - # Google Test, create an alias for more uniformity - set(GOOGLE_TEST_LIBRARIES ${GTEST_LIBRARIES}) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/README.txt --- a/Resources/Orthanc/README.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -This folder contains an excerpt of the source code of Orthanc. It is -automatically generated using the "../Resources/SyncOrthancFolder.py" -script. diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/Toolchains/LinuxStandardBaseToolchain.cmake --- a/Resources/Orthanc/Toolchains/LinuxStandardBaseToolchain.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -# -# Full build, as used on the BuildBot CIS: -# -# $ LSB_CC=gcc-4.8 LSB_CXX=g++-4.8 cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../Resources/LinuxStandardBaseToolchain.cmake -DUSE_LEGACY_JSONCPP=ON -DUSE_LEGACY_LIBICU=ON -DBOOST_LOCALE_BACKEND=icu -DENABLE_PKCS11=ON -G Ninja -# -# Or, more lightweight version (without libp11 and ICU): -# -# $ LSB_CC=gcc-4.8 LSB_CXX=g++-4.8 cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../Resources/LinuxStandardBaseToolchain.cmake -DUSE_LEGACY_JSONCPP=ON -G Ninja -# - -INCLUDE(CMakeForceCompiler) - -SET(LSB_PATH $ENV{LSB_PATH} CACHE STRING "") -SET(LSB_CC $ENV{LSB_CC} CACHE STRING "") -SET(LSB_CXX $ENV{LSB_CXX} CACHE STRING "") -SET(LSB_TARGET_VERSION "4.0" CACHE STRING "") - -IF ("${LSB_PATH}" STREQUAL "") - SET(LSB_PATH "/opt/lsb") -ENDIF() - -IF (EXISTS ${LSB_PATH}/lib64) - SET(LSB_TARGET_PROCESSOR "x86_64") - SET(LSB_LIBPATH ${LSB_PATH}/lib64-${LSB_TARGET_VERSION}) -ELSEIF (EXISTS ${LSB_PATH}/lib) - SET(LSB_TARGET_PROCESSOR "x86") - SET(LSB_LIBPATH ${LSB_PATH}/lib-${LSB_TARGET_VERSION}) -ELSE() - MESSAGE(FATAL_ERROR "Unable to detect the target processor architecture. Check the LSB_PATH environment variable.") -ENDIF() - -SET(LSB_CPPPATH ${LSB_PATH}/include) -SET(PKG_CONFIG_PATH ${LSB_LIBPATH}/pkgconfig/) - -# the name of the target operating system -SET(CMAKE_SYSTEM_NAME Linux) -SET(CMAKE_SYSTEM_VERSION LinuxStandardBase) -SET(CMAKE_SYSTEM_PROCESSOR ${LSB_TARGET_PROCESSOR}) - -# which compilers to use for C and C++ -SET(CMAKE_C_COMPILER ${LSB_PATH}/bin/lsbcc) - -if (${CMAKE_VERSION} VERSION_LESS "3.6.0") - CMAKE_FORCE_CXX_COMPILER(${LSB_PATH}/bin/lsbc++ GNU) -else() - SET(CMAKE_CXX_COMPILER ${LSB_PATH}/bin/lsbc++) -endif() - -# here is the target environment located -SET(CMAKE_FIND_ROOT_PATH ${LSB_PATH}) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) -SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - -SET(CMAKE_CROSSCOMPILING OFF) - - -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -I${LSB_PATH}/include" CACHE INTERNAL "" FORCE) -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -nostdinc++ -I${LSB_PATH}/include -I${LSB_PATH}/include/c++ -I${LSB_PATH}/include/c++/backward" CACHE INTERNAL "" FORCE) -SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -L${LSB_LIBPATH} --lsb-besteffort" CACHE INTERNAL "" FORCE) -SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -L${LSB_LIBPATH} --lsb-besteffort" CACHE INTERNAL "" FORCE) - -if (NOT "${LSB_CXX}" STREQUAL "") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-cxx=${LSB_CXX}") - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-cxx=${LSB_CXX}") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-cxx=${LSB_CXX}") -endif() - -if (NOT "${LSB_CC}" STREQUAL "") - SET(CMAKE_C_FLAGS "${CMAKE_CC_FLAGS} --lsb-cc=${LSB_CC}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-cc=${LSB_CC}") - SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-cc=${LSB_CC}") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --lsb-cc=${LSB_CC}") -endif() - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/Toolchains/MinGW-W64-Toolchain32.cmake --- a/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain32.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# the name of the target operating system -set(CMAKE_SYSTEM_NAME Windows) - -# which compilers to use for C and C++ -set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) -set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) -set(CMAKE_RC_COMPILER i686-w64-mingw32-windres) - -# here is the target environment located -set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/Toolchains/MinGW-W64-Toolchain64.cmake --- a/Resources/Orthanc/Toolchains/MinGW-W64-Toolchain64.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# the name of the target operating system -set(CMAKE_SYSTEM_NAME Windows) - -# which compilers to use for C and C++ -set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) -set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) -set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) - -# here is the target environment located -set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/Orthanc/Toolchains/MinGWToolchain.cmake --- a/Resources/Orthanc/Toolchains/MinGWToolchain.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# the name of the target operating system -set(CMAKE_SYSTEM_NAME Windows) - -# which compilers to use for C and C++ -set(CMAKE_C_COMPILER i586-mingw32msvc-gcc) -set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++) -set(CMAKE_RC_COMPILER i586-mingw32msvc-windres) - -# here is the target environment located -set(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc) - -# adjust the default behaviour of the FIND_XXX() commands: -# search headers and libraries in the target environment, search -# programs in the host environment -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSTACK_SIZE_PARAM_IS_A_RESERVATION=0x10000" CACHE INTERNAL "" FORCE) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTACK_SIZE_PARAM_IS_A_RESERVATION=0x10000" CACHE INTERNAL "" FORCE) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/OrthancLogoDocumentation.png Binary file Resources/OrthancLogoDocumentation.png has changed diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/OrthancStone.doxygen --- a/Resources/OrthancStone.doxygen Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1795 +0,0 @@ -# Doxyfile 1.8.1.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. - -PROJECT_NAME = OrthancStone - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = @ORTHANC_STONE_VERSION@ - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "Stone of Orthanc API" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = @ORTHANC_STONE_ROOT@/Resources/OrthancLogoDocumentation.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = OrthancStoneDocumentation - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding -# "class=itcl::class" will allow you to use the command class in the -# itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all -# comments according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you -# can mix doxygen, HTML, and XML commands with Markdown formatting. -# Disable only in case of backward compatibilities issues. - -MARKDOWN_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = YES - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields will be shown inline in the documentation -# of the scope in which they are defined (i.e. file, namespace, or group -# documentation), provided this scope is documented. If set to NO (the default), -# structs, classes, and unions are shown on a separate page (for HTML and Man -# pages) or section (for LaTeX and RTF). - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -SYMBOL_CACHE_SIZE = 0 - -# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be -# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given -# their name and scope. Since this can be an expensive process and often the -# same symbol appear multiple times in the code, doxygen keeps a cache of -# pre-resolved symbols. If the cache is too small doxygen will become slower. -# If the cache is too large, memory is wasted. The cache size is given by this -# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal scope will be included in the documentation. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = @ORTHANC_STONE_ROOT@/Applications \ - @ORTHANC_STONE_ROOT@/Framework \ - @ORTHANC_STONE_ROOT@/Platforms - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = *.h - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = @ORTHANC_STONE_ROOT@/Framework/Orthanc/Resources/ \ - @ORTHANC_STONE_ROOT@/Applications/Samples/build-wasm/ - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = Orthanc::Internals - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C, C++ and Fortran comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = doc - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# style sheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of -# entries shown in the various tree structured indices initially; the user -# can expand and collapse entries dynamically later on. Doxygen will expand -# the tree to such a level that at most the specified number of entries are -# visible (unless a fully collapsed tree already exceeds this amount). -# So setting the number of entries 1 will produce a full collapsed tree by -# default. 0 is a special value representing an infinite number of entries -# and will result in a full expanded tree by default. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 1 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you may also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to -# the MathJax Content Delivery Network so you can quickly see the result without -# installing MathJax. -# However, it is strongly recommended to install a local -# copy of MathJax from http://www.mathjax.org before deployment. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. - -MATHJAX_EXTENSIONS = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. - -LATEX_BIB_STYLE = plain - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. For each -# tag file the location of the external documentation should be added. The -# format of a tag file without this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths -# or URLs. Note that each tag file must have a unique name (where the name does -# NOT include the path). If a tag file is not located in the directory in which -# doxygen is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = NO - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside -# the class node. If there are many fields or methods and many nodes the -# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS -# threshold limits the number of items for each type to make the size more -# managable. Set this to 0 for no limit. Note that the threshold may be -# exceeded by 50% before the limit is enforced. - -UML_LIMIT_NUM_FIELDS = 10 - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. - -INTERACTIVE_SVG = NO - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff -r 9dfeee74c1e6 -r 244ad1e4e76a Resources/SyncOrthancFolder.py --- a/Resources/SyncOrthancFolder.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -#!/usr/bin/python - -# -# This maintenance script updates the content of the "Orthanc" folder -# to match the latest version of the Orthanc source code. -# - -import multiprocessing -import os -import stat -import urllib2 - -TARGET = os.path.join(os.path.dirname(__file__), 'Orthanc') -PLUGIN_SDK_VERSION = '1.0.0' -REPOSITORY = 'https://hg.orthanc-server.com/orthanc/raw-file' - -FILES = [ - ('OrthancFramework/Resources/CMake/AutoGeneratedCode.cmake', 'CMake'), - ('OrthancFramework/Resources/CMake/Compiler.cmake', 'CMake'), - ('OrthancFramework/Resources/CMake/DownloadOrthancFramework.cmake', 'CMake'), - ('OrthancFramework/Resources/CMake/DownloadPackage.cmake', 'CMake'), - ('OrthancFramework/Resources/CMake/GoogleTestConfiguration.cmake', 'CMake'), - ('OrthancFramework/Resources/EmbedResources.py', 'CMake'), - - ('OrthancFramework/Resources/Toolchains/LinuxStandardBaseToolchain.cmake', 'Toolchains'), - ('OrthancFramework/Resources/Toolchains/MinGW-W64-Toolchain32.cmake', 'Toolchains'), - ('OrthancFramework/Resources/Toolchains/MinGW-W64-Toolchain64.cmake', 'Toolchains'), - ('OrthancFramework/Resources/Toolchains/MinGWToolchain.cmake', 'Toolchains'), - - ('OrthancServer/Plugins/Samples/Common/OrthancPluginCppWrapper.h', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), - ('OrthancServer/Plugins/Samples/Common/OrthancPluginCppWrapper.cpp', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), - ('OrthancServer/Plugins/Samples/Common/OrthancPluginException.h', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), - ('OrthancServer/Plugins/Samples/Common/ExportedSymbolsPlugins.list', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), - ('OrthancServer/Plugins/Samples/Common/OrthancPluginsExports.cmake', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), - ('OrthancServer/Plugins/Samples/Common/VersionScriptPlugins.map', - '../../StoneWebViewer/Resources/Orthanc/Plugins'), -] - -SDK = [ - 'orthanc/OrthancCPlugin.h', -] - - -def Download(x): - branch = x[0] - source = x[1] - target = os.path.join(TARGET, x[2]) - print target - - try: - os.makedirs(os.path.dirname(target)) - except: - pass - - url = '%s/%s/%s' % (REPOSITORY, branch, source) - - with open(target, 'w') as f: - f.write(urllib2.urlopen(url).read()) - - -commands = [] - -for f in FILES: - commands.append([ 'default', - f[0], - os.path.join(f[1], os.path.basename(f[0])) ]) - -for f in SDK: - commands.append([ - 'Orthanc-%s' % PLUGIN_SDK_VERSION, - 'Plugins/Include/%s' % f, - '../../StoneWebViewer/Resources/OrthancSdk-%s/%s' % (PLUGIN_SDK_VERSION, f) - ]) - -pool = multiprocessing.Pool(10) # simultaneous downloads -pool.map(Download, commands) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Common/RtViewerApp.cpp --- a/Samples/Common/RtViewerApp.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,250 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -// Sample app -#include "RtViewerApp.h" -#include "RtViewerView.h" -#include "SampleHelpers.h" - -// Stone of Orthanc -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" -#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" -#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" -#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" -#include "../../Framework/Scene2DViewport/MeasureTool.h" -#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" -#include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" -#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" -#include "../../Framework/StoneException.h" - -// Orthanc -#include -#include - -// System -#include -#include -#include - -#include - - -namespace OrthancStone -{ - void RtViewerApp::InvalidateAllViewports() - { - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->Invalidate(); - } - } - - const VolumeImageGeometry& RtViewerApp::GetMainGeometry() - { - ORTHANC_ASSERT(geometryProvider_.get() != NULL); - ORTHANC_ASSERT(geometryProvider_->HasGeometry()); - const VolumeImageGeometry& geometry = geometryProvider_->GetImageGeometry(); - return geometry; - } - - RtViewerApp::RtViewerApp() - : undoStack_(new UndoStack) - { - // Create the volumes that will be filled later on - ctVolume_ = boost::make_shared(); - doseVolume_ = boost::make_shared(); - } - - boost::shared_ptr RtViewerApp::Create() - { - boost::shared_ptr thisOne(new RtViewerApp()); - return thisOne; - } - - void RtViewerApp::DisableTracker() - { - if (activeTracker_) - { - activeTracker_->Cancel(); - activeTracker_.reset(); - } - } - - void RtViewerApp::CreateView(const std::string& canvasId, VolumeProjection projection) - { - boost::shared_ptr - view(new RtViewerView(shared_from_this(), canvasId, projection)); - - view->RegisterMessages(); - - view->CreateLayers(ctLoader_, doseLoader_, doseVolume_, rtstructLoader_); - - views_.push_back(view); - } - - void RtViewerApp::CreateLoaders() - { - // the viewport hosts the scene - { - // "true" means use progressive quality (jpeg 50 --> jpeg 90 --> 16-bit raw) - // "false" means only using hi quality - // TODO: add flag for quality - ctLoader_ = OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext_, ctVolume_, true); - - // better priority for CT vs dose and struct - ctLoader_->SetSchedulingPriority(-100); - - - // we need to store the CT loader to ask from geometry details later on when geometry is loaded - geometryProvider_ = ctLoader_; - - doseLoader_ = OrthancMultiframeVolumeLoader::Create(*loadersContext_, doseVolume_); - rtstructLoader_ = DicomStructureSetLoader::Create(*loadersContext_); - } - - /** - Register for notifications issued by the loaders - */ - - Register - (*ctLoader_, &RtViewerApp::HandleGeometryReady); - - Register - (*ctLoader_, &RtViewerApp::HandleCTLoaded); - - Register - (*ctLoader_, &RtViewerApp::HandleCTContentUpdated); - - Register - (*doseLoader_, &RtViewerApp::HandleDoseLoaded); - - Register - (*rtstructLoader_, &RtViewerApp::HandleStructuresReady); - - Register - (*rtstructLoader_, &RtViewerApp::HandleStructuresUpdated); - } - - void RtViewerApp::StartLoaders() - { - ORTHANC_ASSERT(HasArgument("ctseries") && HasArgument("rtdose") && HasArgument("rtstruct")); - - LOG(INFO) << "About to load:"; - LOG(INFO) << " CT : " << GetArgument("ctseries"); - LOG(INFO) << " RTDOSE : " << GetArgument("rtdose"); - LOG(INFO) << " RTSTRUCT : " << GetArgument("rtstruct"); - ctLoader_->LoadSeries(GetArgument("ctseries")); - doseLoader_->LoadInstance(GetArgument("rtdose")); - rtstructLoader_->LoadInstanceFullVisibility(GetArgument("rtstruct")); - } - - void RtViewerApp::HandleGeometryReady(const DicomVolumeImage::GeometryReadyMessage& message) - { - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->RetrieveGeometry(); - } - FitContent(); - UpdateLayersInAllViews(); - } - - void RtViewerApp::FitContent() - { - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->FitContent(); - } - } - - void RtViewerApp::UpdateLayersInAllViews() - { - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->UpdateLayers(); - } - } - - void RtViewerApp::HandleCTLoaded(const OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality& message) - { - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->RetrieveGeometry(); - } - UpdateLayersInAllViews(); - } - - void RtViewerApp::HandleCTContentUpdated(const DicomVolumeImage::ContentUpdatedMessage& message) - { - UpdateLayersInAllViews(); - } - - void RtViewerApp::HandleDoseLoaded(const DicomVolumeImage::ContentUpdatedMessage& message) - { - //TODO: compute dose extent, with outlier rejection - UpdateLayersInAllViews(); - } - - void RtViewerApp::HandleStructuresReady(const DicomStructureSetLoader::StructuresReady& message) - { - UpdateLayersInAllViews(); - } - - void RtViewerApp::HandleStructuresUpdated(const DicomStructureSetLoader::StructuresUpdated& message) - { - UpdateLayersInAllViews(); - } - - void RtViewerApp::SetArgument(const std::string& key, const std::string& value) - { - if (key == "loglevel") - OrthancStoneHelpers::SetLogLevel(value); - else - arguments_[key] = value; - } - - std::string RtViewerApp::GetArgument(const std::string& key) const - { - std::map::const_iterator found = arguments_.find(key); - if (found == arguments_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return found->second; - } - } - - bool RtViewerApp::HasArgument(const std::string& key) const - { - return (arguments_.find(key) != arguments_.end()); - } -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Common/RtViewerApp.h --- a/Samples/Common/RtViewerApp.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Loaders/DicomStructureSetLoader.h" -#include "../../Framework/Loaders/ILoadersContext.h" -#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" -#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../Framework/Messages/IMessageEmitter.h" -#include "../../Framework/Messages/IObserver.h" -#include "../../Framework/Messages/ObserverBase.h" -#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Viewport/IViewport.h" -#include "../../Framework/Volumes/DicomVolumeImage.h" - -#include -#include -#include - -#if ORTHANC_ENABLE_SDL -#include -#endif - -namespace OrthancStone -{ - class OpenGLCompositor; - class IVolumeSlicer; - class ILayerStyleConfigurator; - class DicomStructureSetLoader; - class IOracle; - class ThreadedOracle; - class VolumeSceneLayerSource; - class SdlOpenGLViewport; - class RtViewerView; - - static const unsigned int FONT_SIZE_0 = 32; - static const unsigned int FONT_SIZE_1 = 24; - - class Scene2D; - class UndoStack; - - /** - This application subclasses IMessageEmitter to use a mutex before forwarding Oracle messages (that - can be sent from multiple threads) - */ - class RtViewerApp : public ObserverBase - { - public: - - void PrepareScene(); - -#if ORTHANC_ENABLE_SDL - public: - void RunSdl(int argc, char* argv[]); - void SdlRunLoop(const std::vector >& views, - OrthancStone::IViewportInteractor& interactor); - private: - void ProcessOptions(int argc, char* argv[]); - void HandleApplicationEvent(const SDL_Event& event); -#elif ORTHANC_ENABLE_WASM - public: - void RunWasm(); -#else -# error Either ORTHANC_ENABLE_SDL or ORTHANC_ENABLE_WASM must be enabled -#endif - - public: - void DisableTracker(); - - /** - Called by command-line option processing or when parsing the URL - parameters. - */ - void SetArgument(const std::string& key, const std::string& value); - - const VolumeImageGeometry& GetMainGeometry(); - - static boost::shared_ptr Create(); - - void CreateView(const std::string& canvasId, VolumeProjection projection); - - protected: - RtViewerApp(); - - private: - void CreateLoaders(); - void StartLoaders(); - void SelectNextTool(); - - // argument handling - // SetArgument is above (public section) - std::map arguments_; - - std::string GetArgument(const std::string& key) const; - bool HasArgument(const std::string& key) const; - - /** - This adds the command at the top of the undo stack - */ - //void Commit(boost::shared_ptr cmd); - void Undo(); - void Redo(); - - void HandleGeometryReady(const DicomVolumeImage::GeometryReadyMessage& message); - - // TODO: wire this - void HandleCTLoaded(const OrthancSeriesVolumeProgressiveLoader::VolumeImageReadyInHighQuality& message); - void HandleCTContentUpdated(const OrthancStone::DicomVolumeImage::ContentUpdatedMessage& message); - void HandleDoseLoaded(const OrthancStone::DicomVolumeImage::ContentUpdatedMessage& message); - void HandleStructuresReady(const OrthancStone::DicomStructureSetLoader::StructuresReady& message); - void HandleStructuresUpdated(const OrthancStone::DicomStructureSetLoader::StructuresUpdated& message); - - - private: - void RetrieveGeometry(); - void FitContent(); - void InvalidateAllViewports(); - void UpdateLayersInAllViews(); - - private: - boost::shared_ptr ctVolume_; - boost::shared_ptr doseVolume_; - - std::vector > views_; - - boost::shared_ptr ctLoader_; - boost::shared_ptr doseLoader_; - boost::shared_ptr rtstructLoader_; - - /** encapsulates resources shared by loaders */ - boost::shared_ptr loadersContext_; - - /** - another interface to the ctLoader object (that also implements the IVolumeSlicer interface), that serves as the - reference for the geometry (position and dimensions of the volume + size of each voxel). It could be changed to be - the dose instead, but the CT is chosen because it usually has a better spatial resolution. - */ - boost::shared_ptr geometryProvider_; - - - boost::shared_ptr activeTracker_; - - boost::shared_ptr undoStack_; - }; - -} - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Common/RtViewerView.cpp --- a/Samples/Common/RtViewerView.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,350 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -// Sample app -#include "RtViewerView.h" -#include "RtViewerApp.h" -#include "SampleHelpers.h" - -#include - -// Stone of Orthanc -#include "../../Framework/Oracle/GetOrthancWebViewerJpegCommand.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../Framework/Scene2D/LookupTableStyleConfigurator.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2DViewport/CreateAngleMeasureTracker.h" -#include "../../Framework/Scene2DViewport/CreateLineMeasureTracker.h" -#include "../../Framework/Scene2DViewport/IFlexiblePointerTracker.h" -#include "../../Framework/Scene2DViewport/MeasureTool.h" -#include "../../Framework/Scene2DViewport/PredeclaredTypes.h" -#include "../../Framework/Scene2DViewport/UndoStack.h" -#include "../../Framework/StoneException.h" -#include "../../Framework/StoneInitialization.h" -#include "../../Framework/Volumes/DicomVolumeImageMPRSlicer.h" -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" - -// Orthanc -#include // For std::unique_ptr<> -#include -#include - -// System -#include -#include -#include - -#include - - -namespace OrthancStone -{ - boost::shared_ptr RtViewerView::GetApp() - { - return app_.lock(); - } - - void RtViewerView::DisplayInfoText() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - // do not try to use stuff too early! - OrthancStone::ICompositor& compositor = lock->GetCompositor(); - - std::stringstream msg; - - for (std::map::const_iterator kv = infoTextMap_.begin(); - kv != infoTextMap_.end(); ++kv) - { - msg << kv->first << " : " << kv->second << std::endl; - } - std::string msgS = msg.str(); - - TextSceneLayer* layerP = NULL; - if (scene.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = dynamic_cast( - scene.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); - layerP = &layer; - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layerP = layer.get(); - layer->SetColor(0, 255, 0); - layer->SetFontIndex(1); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_TopLeft); - //layer->SetPosition(0,0); - scene.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - // position the fixed info text in the upper right corner - layerP->SetText(msgS.c_str()); - double cX = compositor.GetCanvasWidth() * (-0.5); - double cY = compositor.GetCanvasHeight() * (-0.5); - scene.GetCanvasToSceneTransform().Apply(cX, cY); - layerP->SetPosition(cX, cY); - lock->Invalidate(); - } - - void RtViewerView::DisplayFloatingCtrlInfoText(const PointerEvent& e) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - - char buf[128]; - sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", - p.GetX(), p.GetY(), - e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); - - if (scene.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) - { - TextSceneLayer& layer = - dynamic_cast(scene.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); - layer.SetText(buf); - layer.SetPosition(p.GetX(), p.GetY()); - } - else - { - std::unique_ptr layer(new TextSceneLayer); - layer->SetColor(0, 255, 0); - layer->SetText(buf); - layer->SetBorder(20); - layer->SetAnchor(BitmapAnchor_BottomCenter); - layer->SetPosition(p.GetX(), p.GetY()); - scene.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); - } - } - - void RtViewerView::HideInfoText() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - scene.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); - } - - void RtViewerView::OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message) - { - DisplayInfoText(); - } - - void RtViewerView::Invalidate() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - - void RtViewerView::FitContent() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - - void RtViewerView::Scroll(int delta) - { - if (!planes_.empty()) - { - int next = 0; - int temp = static_cast(currentPlane_) + delta; - - if (temp < 0) - { - next = 0; - } - else if (temp >= static_cast(planes_.size())) - { - next = static_cast(planes_.size()) - 1; - } - else - { - next = static_cast(temp); - } - LOG(INFO) << "RtViewerView::Scroll(" << delta << ") --> slice is now = " << next; - - if (next != static_cast(currentPlane_)) - { - currentPlane_ = next; - UpdateLayers(); - } - } - } - - void RtViewerView::RetrieveGeometry() - { - const VolumeImageGeometry& geometry = GetApp()->GetMainGeometry(); - - const unsigned int depth = geometry.GetProjectionDepth(projection_); - currentPlane_ = depth / 2; - - planes_.resize(depth); - - for (unsigned int z = 0; z < depth; z++) - { - planes_[z] = geometry.GetProjectionSlice(projection_, z); - } - - UpdateLayers(); - } - - void RtViewerView::UpdateLayers() - { - std::unique_ptr lock(viewport_->Lock()); - - if (planes_.size() == 0) - { - RetrieveGeometry(); - } - - if (currentPlane_ < planes_.size()) - { - if (ctVolumeLayerSource_.get() != NULL) - { - ctVolumeLayerSource_->Update(planes_[currentPlane_]); - } - if (doseVolumeLayerSource_.get() != NULL) - { - doseVolumeLayerSource_->Update(planes_[currentPlane_]); - } - if (structLayerSource_.get() != NULL) - { - structLayerSource_->Update(planes_[currentPlane_]); - } - } - lock->Invalidate(); - } - - void RtViewerView::PrepareViewport() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - ICompositor& compositor = lock->GetCompositor(); - - // False means we do NOT let a hi-DPI aware desktop managedr treat this as a legacy application that requires - // scaling. - controller.FitContent(compositor.GetCanvasWidth(), compositor.GetCanvasHeight()); - - std::string ttf; - Orthanc::EmbeddedResources::GetFileResource(ttf, Orthanc::EmbeddedResources::UBUNTU_FONT); - compositor.SetFont(0, ttf, FONT_SIZE_0, Orthanc::Encoding_Latin1); - compositor.SetFont(1, ttf, FONT_SIZE_1, Orthanc::Encoding_Latin1); - } - - void RtViewerView::SetInfoDisplayMessage( - std::string key, std::string value) - { - if (value == "") - infoTextMap_.erase(key); - else - infoTextMap_[key] = value; - DisplayInfoText(); - } - - void RtViewerView::RegisterMessages() - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Register(controller, &RtViewerView::OnSceneTransformChanged); - } - - void RtViewerView::CreateLayers(boost::shared_ptr ctLoader, - boost::shared_ptr doseLoader, - boost::shared_ptr doseVolume, - boost::shared_ptr rtstructLoader) - { - /** - Configure the CT - */ - std::unique_ptr style(new GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - - this->SetCtVolumeSlicer(ctLoader, style.release()); - - { - std::string lut; - Orthanc::EmbeddedResources::GetFileResource(lut, Orthanc::EmbeddedResources::COLORMAP_HOT); - - std::unique_ptr config(new LookupTableStyleConfigurator); - config->SetLookupTable(lut); - - boost::shared_ptr tmp(new DicomVolumeImageMPRSlicer(doseVolume)); - this->SetDoseVolumeSlicer(tmp, config.release()); - } - - this->SetStructureSet(rtstructLoader); - } - - void RtViewerView::SetCtVolumeSlicer(const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - int depth = scene.GetMaxDepth() + 1; - - ctVolumeLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); - - if (style != NULL) - { - ctVolumeLayerSource_->SetConfigurator(style); - } - } - - void RtViewerView::SetDoseVolumeSlicer(const boost::shared_ptr& volume, - OrthancStone::ILayerStyleConfigurator* style) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - int depth = scene.GetMaxDepth() + 1; - - doseVolumeLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); - - if (style != NULL) - { - doseVolumeLayerSource_->SetConfigurator(style); - } - } - - void RtViewerView::SetStructureSet(const boost::shared_ptr& volume) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - int depth = scene.GetMaxDepth() + 1; - - structLayerSource_.reset(new OrthancStone::VolumeSceneLayerSource(viewport_, depth, volume)); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Common/RtViewerView.h --- a/Samples/Common/RtViewerView.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../Framework/Loaders/DicomStructureSetLoader.h" -#include "../../Framework/Loaders/ILoadersContext.h" -#include "../../Framework/Loaders/OrthancMultiframeVolumeLoader.h" -#include "../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../Framework/Messages/IMessageEmitter.h" -#include "../../Framework/Messages/IObserver.h" -#include "../../Framework/Messages/ObserverBase.h" -#include "../../Framework/Oracle/OracleCommandExceptionMessage.h" -#include "../../Framework/Scene2DViewport/ViewportController.h" -#include "../../Framework/Viewport/IViewport.h" -#include "../../Framework/Volumes/DicomVolumeImage.h" -#include "../../Framework/Volumes/VolumeSceneLayerSource.h" - -#include -#include -#include - -namespace OrthancStone -{ - class RtViewerApp; - - class RtViewerView : public ObserverBase - { - public: - RtViewerView(boost::weak_ptr app, - const std::string& canvasId, - VolumeProjection projection) - : app_(app) - , currentPlane_(0) - , projection_(projection) - { - viewport_ = CreateViewport(canvasId); - FLOATING_INFOTEXT_LAYER_ZINDEX = 6; - FIXED_INFOTEXT_LAYER_ZINDEX = 7; - } - - /** - This method is called when the scene transform changes. It allows to - recompute the visual elements whose content depend upon the scene transform - */ - void OnSceneTransformChanged( - const ViewportController::SceneTransformChanged& message); - - /** - This method will ask the VolumeSceneLayerSource, that are responsible to - generated 2D content based on a volume and a cutting plane, to regenerate - it. This is required if the volume itself changes (during loading) or if - the cutting plane is changed - */ - void UpdateLayers(); - - void Refresh(); - - void TakeScreenshot( - const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight); - - void Scroll(int delta); - - void Invalidate(); - void FitContent(); - void RetrieveGeometry(); - void PrepareViewport(); - void RegisterMessages(); - -#if ORTHANC_ENABLE_SDL == 1 - void EnableGLDebugOutput(); -#endif - - void CreateLayers(boost::shared_ptr ctLoader, - boost::shared_ptr doseLoader, - boost::shared_ptr doseVolume, - boost::shared_ptr rtstructLoader); - - boost::shared_ptr GetViewport() - { - return viewport_; - } - - private: - void SetInfoDisplayMessage(std::string key, std::string value); - boost::shared_ptr GetApp(); - boost::shared_ptr CreateViewport(const std::string& canvasId); - void DisplayInfoText(); - void HideInfoText(); - void DisplayFloatingCtrlInfoText(const PointerEvent& e); - - void SetCtVolumeSlicer(const boost::shared_ptr& volume, - ILayerStyleConfigurator* style); - - void SetDoseVolumeSlicer(const boost::shared_ptr& volume, - ILayerStyleConfigurator* style); - - void SetStructureSet(const boost::shared_ptr& volume); - - private: - boost::weak_ptr app_; - boost::shared_ptr ctVolumeLayerSource_, doseVolumeLayerSource_, structLayerSource_; - - // collection of cutting planes for this particular view - std::vector planes_; - size_t currentPlane_; - - VolumeProjection projection_; - - std::map infoTextMap_; - - int FLOATING_INFOTEXT_LAYER_ZINDEX; - int FIXED_INFOTEXT_LAYER_ZINDEX; - boost::shared_ptr viewport_; - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Common/SampleHelpers.h --- a/Samples/Common/SampleHelpers.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include - -#include - -#include -#include - -namespace OrthancStoneHelpers -{ - inline void SetLogLevel(std::string logLevel) - { - boost::to_lower(logLevel); - if (logLevel == "warning") - { - Orthanc::Logging::EnableInfoLevel(false); - Orthanc::Logging::EnableTraceLevel(false); - } - else if (logLevel == "info") - { - Orthanc::Logging::EnableInfoLevel(true); - Orthanc::Logging::EnableTraceLevel(false); - } - else if (logLevel == "trace") - { - Orthanc::Logging::EnableInfoLevel(true); - Orthanc::Logging::EnableTraceLevel(true); - } - else - { - std::cerr << "Unknown log level \"" << logLevel << "\". Will use TRACE as default!"; - Orthanc::Logging::EnableInfoLevel(true); - Orthanc::Logging::EnableTraceLevel(true); - } - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/README.md --- a/Samples/README.md Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,233 +0,0 @@ -General -======= -These samples assume that a recent version of Orthanc is checked out in an -`orthanc` folder next to the `orthanc-stone` folder. Let's call the top folder -the `devroot` folder. This name does not matter and is not used anywhere. - -Here's the directory layout that we suggest: - -``` -devroot/ - | - +- orthanc/ - | - +- orthanc-stone/ - | - ... -``` - - Orthanc can be retrieved with: - ``` - hg clone https://hg.orthanc-server.com/orthanc - ``` - -Furthermore, the samples usually assume that an Orthanc is running locally, -without authentication, on port 8042. The samples can easily be tweaked if -your setup is different. - -When Dicom resources are to be displayed, their IDs can be supplied in the -various ways suitable for the platform (command-line arguments, URL parameters -or through the GUI) - - -This repo contains two sample projects: - -SingleFrameViewer ------------------ - -This sample application displays a single frame of a Dicom instance that can -be loaded from Orthanc, either by using the Orthanc REST API or through the -Dicomweb server functionality of Orthanc. - -RtViewer --------- - -This sample application displays set of Radiotherapy data: -- a CT scan -- an RT-Dose -- an RT-Struct - -The WebAssembly version displays 3 viewports with MPR data -while the SDL sample displays a single viewport. - - -WebAssembly samples -=================== - -Building the WebAssembly samples require the Emscripten SDK -(https://emscripten.org/). This SDK goes far beyond the simple compilation to -the wasm (Web Assembly) bytecode and provides a comprehensive library that -eases porting native C and C++ programs and libraries. The Emscripten SDK also -makes it easy to generate the companion Javascript files requires to use a -wasm module in a web application. - -Although Emscripten runs on all major platforms, Stone of Orthanc is developed -and tested with the Linux version of Emscripten. - -Emscripten runs perfectly fine under the Windows Subsystem for Linux (that is -the environment used quite often by the Stone of Orthanc team) - -**Important note:** The following examples **and the build scripts** will -assume that you have installed the Emscripten SDK in `~/apps/emsdk`. - -The following packages should get you going (a Debian-like distribution such -as Debian or Ubuntu is assumed) - -``` -sudo apt-get update -sudo apt-get install -y build-essential curl wget git python cmake pkg-config -sudo apt-get install -y mercurial unzip npm ninja-build p7zip-full gettext-base -``` - -To build the Wasm samples, just launch the `build-wasm-samples.sh` script from -this folder. Optionaly, you can pass the build type as an argument. -We suggest that you do *not* use the `Debug` configuration unless you really -need it, for the additional checks that are made will lead to a very long -build time and much slower execution (more severe than with a native non-wasm -target) - -In order to run the sample, you may serve it with the ServeFolders plugin. -You can i.e: add such a section in your orthanc configuration file: - -``` -{ - "Plugins" : ["LibServeFolders.so], - "ServeFolders" : { - "/single-frame-viewer" : "..../out/install-stone-wasm-samples-RelWithDebInfo/SingleFrameViewer", - "/rt-viewer": "..../out/install-stone-wasm-samples-RelWithDebInfo/RtViewer" - } -} -``` - -You'll then be able to open the single-frame-viewer demo at `http://localhost:8042/single-frame-viewer/index.html` - -The rt-viewer demo at -`http://localhost:8044/rt-viewer/index.html?ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=eac822ef-a395f94e-e8121fe0-8411fef8-1f7bffad&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9`. Note that you must provide 3 ids in the url: - -- the CT series Orthanc ID -- the RT-Dose instance Orthanc ID -- the RT-Struct instance Orthanc ID - - -RtViewer ------------------ - -This sample application displays three MPR views of a CT+RTDOSE+RTSTRUCT dataset, loaded from Orthanc. The Orthanc IDs of the dataset must be supplied as URL parameters like: - -``` -http://localhost:9979/rtviewer/index.html?loglevel=info&ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 -``` - -(notice the loglevel parameter that can be `warning`, `info` or `trace`, in increasing verbosity order) - -This sample uses plain Javascript and requires the -Emscripten toolchain and cmake, in addition to a few standard packages. - -To build it, just launch the `build-wasm-RtViewer.sh` script from -this folder. Optionaly, you can pass the build type as an argument. -We suggest that you do *not* use the `Debug` configuration unless you really -need it, for the additional checks that are made will lead to a very long -build time and much slower execution (more severe than with a native non-wasm -target) - -In order to run the sample, you may serve it with the ServeFolders plugin. -You can i.e: add such a section in your orthanc configuration file: - -``` -{ - "Plugins" : ["LibServeFolders.so], - "ServeFolders" : { - "/rt-viewer" : "..../out/install-stone-wasm-RtViewer-RelWithDebInfo" - } -} -``` - -You'll then be able to open the demo at `http://localhost:8042/rt-viewer/index.html` - - -Native samples -================= - -### Windows build - -Here's how to build the SdlSimpleViewer example using Visual Studio 2019 -(the shell is Powershell, but the legacy shell can also be used with some -tweaks). This example is meant to be launched from the folder above -orthanc-stone. - -``` - # create the build folder and navigate to it - $buildDir = "build-stone-sdlviewer-msvc16-x64" - - if (-not (Test-Path $buildDir)) { - mkdir -p $buildDir | Out-Null - } - - cd $buildDir - - # perform the configuration - cmake -G "Visual Studio 16 2019" -A x64 ` - -DMSVC_MULTIPLE_PROCESSES=ON ` - -DALLOW_DOWNLOADS=ON ` - -DSTATIC_BUILD=ON ` - -DOPENSSL_NO_CAPIENG=ON ` - ../orthanc-stone/Samples/Sdl - - $solutionPath = ls -filter *.sln - Write-Host "Solution file(s) available at: $solutionPath" -``` - -The initial configuration step will be quite lengthy, for CMake needs to -setup its internal cache based on your environment and build tools. - -Subsequent runs will be several orders of magnitude faster! - -One the solution (.sln) file is ready, you can open it using the Visual Studio -IDE and choose Build --> Build solution. - -An alternative is to execute `cmake --build .` in the build folder created by -the script. - -In order to run the sample, make sure you've an Orthanc server running i.e. on -port 8042 and launch: - -``` -./SdlSimpleViewer --orthanc http://localhost:8042 --instance 7fc84013-abef174e-3354ca83-b9cdb2a4-f1a74368 - -./RtViewerSdl --orthanc http://localhost:8042 --ctseries a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa --rtdose 830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb --rtstruct 54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 -``` - -RtViewer ---------------- - -### Windows build - -Here's how to build the SdlSimpleViewer example using Visual Studio 2019 -(the shell is Powershell, but the legacy shell can also be used with some -tweaks). This example is meant to be launched from the folder above -orthanc-stone. - -``` - $buildRootDir = "out" - $buildDirName = "build-stone-sdl-RtViewer-msvc16-x64" - $buildDir = Join-Path -Path $buildRootDir -ChildPath $buildDirName - - if (-not (Test-Path $buildDir)) { - mkdir -p $buildDir | Out-Null - } - - cd $buildDir - - cmake -G "Visual Studio 16 2019" -A x64 ` - -DMSVC_MULTIPLE_PROCESSES=ON ` - -DALLOW_DOWNLOADS=ON ` - -DSTATIC_BUILD=ON ` - -DOPENSSL_NO_CAPIENG=ON ` - ../../orthanc-stone/Samples/Sdl/RtViewer -``` - -Executing `cmake --build .` in the build folder will launch the Microsoft -builder on the solution. - -Alternatively, you can open and build the solution using Visual Studio 2019. - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/BoostExtendedConfiguration.cmake --- a/Samples/Sdl/BoostExtendedConfiguration.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -# Stone of Orthanc -# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics -# Department, University Hospital of Liege, Belgium -# Copyright (C) 2017-2020 Osimis S.A., Belgium -# -# This program is free software: you can redistribute it and/or -# modify it under the terms of the GNU Affero 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 -# Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -if (STATIC_BUILD OR NOT USE_SYSTEM_BOOST) - set(BOOST_EXTENDED_SOURCES - ${BOOST_SOURCES_DIR}/libs/program_options/src/cmdline.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/config_file.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/convert.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/options_description.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/parsers.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/positional_options.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/split.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/utf8_codecvt_facet.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/value_semantic.cpp - ${BOOST_SOURCES_DIR}/libs/program_options/src/variables_map.cpp - ${BOOST_SOURCES_DIR}/libs/chrono/src/thread_clock.cpp - ${BOOST_SOURCES_DIR}/libs/chrono/src/chrono.cpp - ${BOOST_SOURCES_DIR}/libs/chrono/src/process_cpu_clocks.cpp - #${BOOST_SOURCES_DIR}/libs/program_options/src/winmain.cpp - ) - add_definitions(-DBOOST_PROGRAM_OPTIONS_NO_LIB) -else() - link_libraries(boost_program_options) -endif() diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/CMakeLists.txt --- a/Samples/Sdl/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -cmake_minimum_required(VERSION 2.8.10) - -project(OrthancStone) - -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) - -if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - set(ORTHANC_BOOST_COMPONENTS program_options) - - set(USE_SYSTEM_GOOGLE_TEST ON CACHE BOOL "Use the system version of Google Test") - set(USE_GOOGLE_TEST_DEBIAN_PACKAGE OFF CACHE BOOL "Use the sources of Google Test shipped with libgtest-dev (Debian only)") - mark_as_advanced(USE_GOOGLE_TEST_DEBIAN_PACKAGE) - include(${STONE_ROOT}/Resources/Orthanc/CMake/GoogleTestConfiguration.cmake) - -else() - set(ENABLE_GOOGLE_TEST ON) - set(ENABLE_LOCALE ON) # Necessary for text rendering - set(ENABLE_OPENGL ON) # <== - set(ENABLE_WEB_CLIENT ON) -endif() - -set(ENABLE_DCMTK ON) # <== -set(ENABLE_SDL ON) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) -include(${CMAKE_SOURCE_DIR}/Utilities.cmake) - -if (NOT ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") - # This include must be after "OrthancStoneConfiguration.cmake" to - # have "BOOST_SOURCES_DIR" defined - include(${CMAKE_SOURCE_DIR}/BoostExtendedConfiguration.cmake) -endif() - - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -EmbedResources( - COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -add_definitions( - -DORTHANC_DEFAULT_DICOM_ENCODING=Encoding_Latin1 - ) - -SortFilesInSourceGroups() - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ${AUTOGENERATED_SOURCES} - ${BOOST_EXTENDED_SOURCES} - ) - -message(${AUTOGENERATED_SOURCES}) - - - -############################# -project(RtViewerSdl) - -add_executable(RtViewerSdl - RtViewer/RtViewerSdl.cpp - SdlHelpers.h - ../Common/RtViewerApp.cpp - ../Common/RtViewerApp.h - ../Common/RtViewerView.cpp - ../Common/RtViewerView.h - ../Common/SampleHelpers.h - ) - -target_link_libraries(RtViewerSdl OrthancStone ${DCMTK_LIBRARIES}) - -############################# -project(SdlSimpleViewer) - -add_executable(SdlSimpleViewer - SdlHelpers.h - ../Common/SampleHelpers.h - SingleFrameViewer/SdlSimpleViewerApplication.h - SingleFrameViewer/SdlSimpleViewer.cpp - ) - -target_link_libraries(SdlSimpleViewer OrthancStone ${DCMTK_LIBRARIES}) - -############################# -project(UnitTests) - -add_executable(UnitTests - ${GOOGLE_TEST_SOURCES} - ${ORTHANC_STONE_ROOT}/UnitTestsSources/GenericToolboxTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/ImageToolboxTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/PixelTestPatternsTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestCommands.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestMessageBroker.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStrategy.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/TestStructureSet.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/SortedFramesTests.cpp - ${ORTHANC_STONE_ROOT}/UnitTestsSources/UnitTestsMain.cpp - ) - -target_link_libraries(UnitTests OrthancStone) - -add_custom_command( - TARGET UnitTests - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - "${ORTHANC_STONE_ROOT}/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" - "$/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json" -) - -target_link_libraries(UnitTests OrthancStone ${DCMTK_LIBRARIES}) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/RtViewer/CMakeLists.txt --- a/Samples/Sdl/RtViewer/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -cmake_minimum_required(VERSION 2.8.10) - -project(RtViewerSdl) - -set(ORTHANC_FRAMEWORK_SOURCE "path") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../orthanc) -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/AutoGeneratedCode.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) - -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) # Necessary for text rendering -SET(ENABLE_SDL ON) -SET(ENABLE_DCMTK ON) # <== -SET(ENABLE_OPENGL ON) # <== -SET(ENABLE_WEB_CLIENT ON) -SET(ORTHANC_SANDBOXED OFF) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) -include(${CMAKE_SOURCE_DIR}/../BoostExtendedConfiguration.cmake) -include(${CMAKE_SOURCE_DIR}/../Utilities.cmake) - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -EmbedResources( - COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -add_definitions( - -DORTHANC_ENABLE_LOGGING=1 - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - -DORTHANC_ENABLE_PUGIXML=0 - -DORTHANC_DEFAULT_DICOM_ENCODING=Encoding_Latin1 - ) - -SortFilesInSourceGroups() - -add_executable(RtViewerSdl - RtViewerSdl.cpp - ../SdlHelpers.h - ../../Common/RtViewerApp.cpp - ../../Common/RtViewerApp.h - ../../Common/RtViewerView.cpp - ../../Common/RtViewerView.h - ../../Common/SampleHelpers.h - ${ORTHANC_STONE_SOURCES} - ${AUTOGENERATED_SOURCES} - ${BOOST_EXTENDED_SOURCES} - ) - -target_link_libraries(RtViewerSdl ${DCMTK_LIBRARIES}) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/RtViewer/CMakeSettings.json --- a/Samples/Sdl/RtViewer/CMakeSettings.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -ο»Ώ{ - // this file is meant to be used with Visual Studio CMake support - // tested with VS 16.5.4+ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}/../../../../out/build-stone-sdl-RtViewer-ninja-msvc16-x64-Debug", - "installRoot": "${projectDir}/../../../../out/install-stone-sdl-RtViewer-ninja-msvc16-x64-Debug", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "", - "variables": [ - { - "name": "ALLOW_DOWNLOADS", - "value": "True", - "type": "BOOL" - }, - { - "name": "MSVC_MULTIPLE_PROCESSES", - "value": "True", - "type": "BOOL" - }, - { - "name": "STATIC_BUILD", - "value": "True", - "type": "BOOL" - } - ] - } - ] -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/RtViewer/RtViewerSdl.cpp --- a/Samples/Sdl/RtViewer/RtViewerSdl.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,458 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../../Common/RtViewerApp.h" -#include "../../Common/RtViewerView.h" -#include "../SdlHelpers.h" - -#include - -// Stone of Orthanc includes -#include "../../../Framework/Loaders/GenericLoadersContext.h" -#include "../../../Framework/OpenGL/OpenGLIncludes.h" -#include "../../../Framework/OpenGL/SdlOpenGLContext.h" -#include "../../../Framework/StoneException.h" -#include "../../../Framework/StoneInitialization.h" - -// Orthanc (a.o. for screenshot capture) -#include // For std::unique_ptr<> -#include -#include -#include - - -#include -#include - -// #include this include might be necessary in more recent boost versions - -#include - -#include - - -#if !defined(__APPLE__) -/** - * OpenGL: "OS X does not seem to support debug output functionality - * (as gathered online)." - * https://learnopengl.com/In-Practice/Debugging - **/ -static void GLAPIENTRY -OpenGLMessageCallback(GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam) -{ - if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) - { - fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), - type, severity, message); - } -} -#endif - -namespace OrthancStone -{ - void RtViewerView::EnableGLDebugOutput() - { -#if !defined(__APPLE__) - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(OpenGLMessageCallback, 0); -#endif - } - - boost::shared_ptr RtViewerView::CreateViewport(const std::string& canvasId) - { - // False means we do NOT let Windows treat this as a legacy application that needs to be scaled - return SdlOpenGLViewport::Create(canvasId, 1024, 1024, false); - } - - void RtViewerApp::ProcessOptions(int argc, char* argv[]) - { - namespace po = boost::program_options; - po::options_description desc("Usage:"); - - desc.add_options() - ("loglevel", po::value()->default_value("WARNING"), - "You can choose WARNING, INFO or TRACE for the logging level: Errors and warnings will always be displayed. (default: WARNING)") - - ("orthanc", po::value()->default_value("http://localhost:8042"), - "Base URL of the Orthanc instance") - - ("ctseries", po::value()->default_value("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"), - "Orthanc ID of the CT series to load") - - ("rtdose", po::value()->default_value("830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb"), - "Orthanc ID of the RTDOSE instance to load") - - ("rtstruct", po::value()->default_value("54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"), - "Orthanc ID of the RTSTRUCT instance to load") - ; - - po::variables_map vm; - try - { - po::store(po::parse_command_line(argc, argv, desc), vm); - po::notify(vm); - } - catch (std::exception& e) - { - std::cerr << "Please check your command line options! (\"" << e.what() << "\")" << std::endl; - } - - for (po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it) - { - std::string key = it->first; - const po::variable_value& value = it->second; - const std::string& strValue = value.as(); - SetArgument(key, strValue); - } - } - - void RtViewerApp::RunSdl(int argc, char* argv[]) - { - ProcessOptions(argc, argv); - - /** - Create the shared loaders context - */ - loadersContext_.reset(new GenericLoadersContext(1, 4, 1)); - - // we are in SDL --> downcast to concrete type - boost::shared_ptr loadersContext = boost::dynamic_pointer_cast(loadersContext_); - - /** - Url of the Orthanc instance - Typically, in a native application (Qt, SDL), it will be an absolute URL like "http://localhost:8042". In - wasm on the browser, it could be an absolute URL, provided you do not have cross-origin problems, or a relative - URL. In our wasm samples, it is set to "..", because we set up either a reverse proxy or an Orthanc ServeFolders - plugin that serves the main web application from an URL like "http://localhost:8042/rtviewer" (with ".." leading - to the main Orthanc root URL) - */ - std::string orthancUrl = arguments_["orthanc"]; - - { - Orthanc::WebServiceParameters p; - if (HasArgument("orthanc")) - { - p.SetUrl(orthancUrl); - } - if (HasArgument("user")) - { - ORTHANC_ASSERT(HasArgument("password")); - p.SetCredentials(GetArgument("user"), GetArgument("password")); - } - else - { - ORTHANC_ASSERT(!HasArgument("password")); - } - loadersContext->SetOrthancParameters(p); - } - - loadersContext->StartOracle(); - - CreateLoaders(); - - /** - Create viewports - */ - CreateView("RtViewer Axial", VolumeProjection_Axial); - CreateView("RtViewer Coronal", VolumeProjection_Coronal); - CreateView("RtViewer Sagittal", VolumeProjection_Sagittal); - - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->PrepareViewport(); - views_[i]->EnableGLDebugOutput(); - } - - DefaultViewportInteractor interactor; - - /** - It is very important that the Oracle (responsible for network I/O) be started before creating and firing the - loaders, for any command scheduled by the loader before the oracle is started will be lost. - */ - StartLoaders(); - - - SdlRunLoop(views_, interactor); - loadersContext->StopOracle(); - } - - void RtViewerView::TakeScreenshot(const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - std::unique_ptr lock(viewport_->Lock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - std::string ttf; - Orthanc::EmbeddedResources::GetFileResource(ttf, Orthanc::EmbeddedResources::UBUNTU_FONT); - - CairoCompositor compositor(canvasWidth, canvasHeight); - compositor.SetFont(0, ttf, FONT_SIZE_0, Orthanc::Encoding_Latin1); - compositor.Refresh(scene); - - Orthanc::ImageAccessor canvas; - compositor.GetCanvas().GetReadOnlyAccessor(canvas); - - Orthanc::Image png(Orthanc::PixelFormat_RGB24, canvas.GetWidth(), canvas.GetHeight(), false); - Orthanc::ImageProcessing::Convert(png, canvas); - - Orthanc::PngWriter writer; - writer.WriteToFile(target, png); - } - - static boost::shared_ptr GetViewFromWindowId( - const std::vector >& views, - Uint32 windowID) - { - using namespace OrthancStone; - for (size_t i = 0; i < views.size(); ++i) - { - boost::shared_ptr view = views[i]; - boost::shared_ptr viewport = view->GetViewport(); - boost::shared_ptr sdlViewport = boost::dynamic_pointer_cast(viewport); - Uint32 curWindowID = sdlViewport->GetSdlWindowId(); - if (windowID == curWindowID) - return view; - } - return boost::shared_ptr(); - } - - void RtViewerApp::SdlRunLoop(const std::vector >& views, - OrthancStone::IViewportInteractor& interactor) - { - using namespace OrthancStone; - - // const std::vector >& views - std::vector > viewports; - for (size_t i = 0; i < views.size(); ++i) - { - boost::shared_ptr view = views[i]; - boost::shared_ptr viewport = view->GetViewport(); - boost::shared_ptr sdlViewport = - boost::dynamic_pointer_cast(viewport); - viewports.push_back(sdlViewport); - } - - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - bool stop = false; - while (!stop) - { - std::vector sdlEvents; - std::map userEventsMap; - SDL_Event sdlEvent; - - // FIRST: collect all pending events - while (SDL_PollEvent(&sdlEvent) != 0) - { - if ( (sdlEvent.type >= SDL_USEREVENT) && - (sdlEvent.type < SDL_LASTEVENT) ) - { - // we don't want to have multiple refresh events , - // and since every refresh event is a user event with a special type, - // we use a map - userEventsMap[sdlEvent.type] = sdlEvent; - } - else - { - sdlEvents.push_back(sdlEvent); - } - } - - // SECOND: add all user events to sdlEvents - for (std::map::const_iterator it = userEventsMap.begin(); it != userEventsMap.end(); ++it) - sdlEvents.push_back(it->second); - - // now process the events - for (std::vector::const_iterator it = sdlEvents.begin(); it != sdlEvents.end(); ++it) - { - const SDL_Event& sdlEvent = *it; - - if (sdlEvent.type == SDL_QUIT) - { - stop = true; - break; - } - else if (sdlEvent.type == SDL_WINDOWEVENT && - (sdlEvent.window.event == SDL_WINDOWEVENT_RESIZED || - sdlEvent.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) - { - boost::shared_ptr view = GetViewFromWindowId( - views, sdlEvent.window.windowID); - - boost::shared_ptr sdlViewport = - boost::dynamic_pointer_cast(view->GetViewport()); - - sdlViewport->UpdateSize(sdlEvent.window.data1, sdlEvent.window.data2); - } - else if (sdlEvent.type == SDL_WINDOWEVENT && - (sdlEvent.window.event == SDL_WINDOWEVENT_SHOWN || - sdlEvent.window.event == SDL_WINDOWEVENT_EXPOSED)) - { - boost::shared_ptr view = GetViewFromWindowId( - views, sdlEvent.window.windowID); - boost::shared_ptr sdlViewport = - boost::dynamic_pointer_cast(view->GetViewport()); - sdlViewport->Paint(); - } - else if (sdlEvent.type == SDL_KEYDOWN && - sdlEvent.key.repeat == 0 /* Ignore key bounce */) - { - boost::shared_ptr view = GetViewFromWindowId( - views, sdlEvent.window.windowID); - - switch (sdlEvent.key.keysym.sym) - { - case SDLK_f: - { - boost::shared_ptr sdlViewport = - boost::dynamic_pointer_cast(view->GetViewport()); - sdlViewport->ToggleMaximize(); - } - break; - - case SDLK_s: - { - std::unique_ptr lock(view->GetViewport()->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - break; - - case SDLK_q: - stop = true; - break; - - default: - break; - } - } - else if (sdlEvent.type == SDL_MOUSEBUTTONDOWN || - sdlEvent.type == SDL_MOUSEMOTION || - sdlEvent.type == SDL_MOUSEBUTTONUP) - { - boost::shared_ptr view = GetViewFromWindowId( - views, sdlEvent.window.windowID); - - std::unique_ptr lock(view->GetViewport()->Lock()); - if (lock->HasCompositor()) - { - OrthancStone::PointerEvent p; - OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), - sdlEvent, keyboardState, scancodeCount); - - switch (sdlEvent.type) - { - case SDL_MOUSEBUTTONDOWN: - lock->GetController().HandleMousePress(interactor, p, - lock->GetCompositor().GetCanvasWidth(), - lock->GetCompositor().GetCanvasHeight()); - lock->Invalidate(); - break; - - case SDL_MOUSEMOTION: - if (lock->GetController().HandleMouseMove(p)) - { - lock->Invalidate(); - } - break; - - case SDL_MOUSEBUTTONUP: - lock->GetController().HandleMouseRelease(p); - lock->Invalidate(); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - else if (sdlEvent.type == SDL_MOUSEWHEEL) - { - boost::shared_ptr view = GetViewFromWindowId( - views, sdlEvent.window.windowID); - - int delta = 0; - if (sdlEvent.wheel.y < 0) - delta = -1; - if (sdlEvent.wheel.y > 0) - delta = 1; - - view->Scroll(delta); - } - else - { - for (size_t i = 0; i < views.size(); ++i) - { - boost::shared_ptr sdlViewport = - boost::dynamic_pointer_cast(views[i]->GetViewport()); - if (sdlViewport->IsRefreshEvent(sdlEvent)) - { - sdlViewport->Paint(); - } - } - } - } - // Small delay to avoid using 100% of CPU - SDL_Delay(1); - } - } - } -} - -boost::weak_ptr g_app; - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - using namespace OrthancStone; - - StoneInitialize(); - - try - { - boost::shared_ptr app = RtViewerApp::Create(); - g_app = app; - app->RunSdl(argc,argv); - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "EXCEPTION: " << e.What(); - } - - StoneFinalize(); - - return 0; -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/SdlHelpers.h --- a/Samples/Sdl/SdlHelpers.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#if ORTHANC_ENABLE_SDL != 1 -# error This file cannot be used if ORTHANC_ENABLE_SDL != 1 -#endif - -#include "../../Framework/Viewport/SdlViewport.h" - -#include - -#include - -#include -#include - -namespace OrthancStoneHelpers -{ - - inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, - const int scancodeCount) - { - using namespace OrthancStone; - int result = KeyboardModifiers_None; - - if (keyboardState != NULL) - { - if (SDL_SCANCODE_LSHIFT < scancodeCount && - keyboardState[SDL_SCANCODE_LSHIFT]) - { - result |= KeyboardModifiers_Shift; - } - - if (SDL_SCANCODE_RSHIFT < scancodeCount && - keyboardState[SDL_SCANCODE_RSHIFT]) - { - result |= KeyboardModifiers_Shift; - } - - if (SDL_SCANCODE_LCTRL < scancodeCount && - keyboardState[SDL_SCANCODE_LCTRL]) - { - result |= KeyboardModifiers_Control; - } - - if (SDL_SCANCODE_RCTRL < scancodeCount && - keyboardState[SDL_SCANCODE_RCTRL]) - { - result |= KeyboardModifiers_Control; - } - - if (SDL_SCANCODE_LALT < scancodeCount && - keyboardState[SDL_SCANCODE_LALT]) - { - result |= KeyboardModifiers_Alt; - } - - if (SDL_SCANCODE_RALT < scancodeCount && - keyboardState[SDL_SCANCODE_RALT]) - { - result |= KeyboardModifiers_Alt; - } - } - - return static_cast(result); - } - - - inline void GetPointerEvent(OrthancStone::PointerEvent& p, - const OrthancStone::ICompositor& compositor, - SDL_Event event, - const uint8_t* keyboardState, - const int scancodeCount) - { - using namespace OrthancStone; - KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); - - switch (event.button.button) - { - case SDL_BUTTON_LEFT: - p.SetMouseButton(OrthancStone::MouseButton_Left); - break; - - case SDL_BUTTON_RIGHT: - p.SetMouseButton(OrthancStone::MouseButton_Right); - break; - - case SDL_BUTTON_MIDDLE: - p.SetMouseButton(OrthancStone::MouseButton_Middle); - break; - - default: - p.SetMouseButton(OrthancStone::MouseButton_None); - break; - } - - p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); - p.SetAltModifier( (modifiers & KeyboardModifiers_Alt) != 0); - p.SetControlModifier( (modifiers & KeyboardModifiers_Control) != 0); - p.SetShiftModifier( (modifiers & KeyboardModifiers_Shift) != 0); - } - - - inline boost::shared_ptr GetSdlViewportFromWindowId( - const std::vector >& viewports, - Uint32 windowID) - { - using namespace OrthancStone; - for (size_t i = 0; i < viewports.size(); ++i) - { - boost::shared_ptr viewport = viewports[i]; - boost::shared_ptr sdlViewport = boost::dynamic_pointer_cast(viewport); - Uint32 curWindowID = sdlViewport->GetSdlWindowId(); - if (windowID == curWindowID) - return sdlViewport; - } - - return boost::shared_ptr(); - } -} - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/SingleFrameViewer/CMakeLists.txt --- a/Samples/Sdl/SingleFrameViewer/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 2.8.10) - -project(SdlSimpleViewer) - -set(ORTHANC_FRAMEWORK_SOURCE "path") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../orthanc) -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) - -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) # Necessary for text rendering -SET(ENABLE_SDL ON) -SET(ENABLE_DCMTK ON) # <== -SET(ENABLE_OPENGL ON) # <== -SET(ENABLE_WEB_CLIENT ON) -SET(ORTHANC_SANDBOXED OFF) - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) -include(${STONE_ROOT}/Resources/CMake/Utilities.cmake) - -add_definitions( - -DORTHANC_ENABLE_LOGGING=1 - -DORTHANC_ENABLE_LOGGING_PLUGIN=0 - -DORTHANC_ENABLE_PUGIXML=0 - -DORTHANC_DEFAULT_DICOM_ENCODING=Encoding_Latin1 - ) - -SortFilesInSourceGroups() - -add_executable(SdlSimpleViewer - ../SdlHelpers.h - ../../Common/SampleHelpers.h - SdlSimpleViewerApplication.h - SdlSimpleViewer.cpp - ${ORTHANC_STONE_SOURCES} - ) - -target_link_libraries(SdlSimpleViewer ${DCMTK_LIBRARIES}) - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/SingleFrameViewer/CMakeSettings.json --- a/Samples/Sdl/SingleFrameViewer/CMakeSettings.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -ο»Ώ{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "", - "variables": [ - { - "name": "MSVC_MULTIPLE_PROCESSES", - "value": "True", - "type": "BOOL" - }, - { - "name": "ALLOW_DOWNLOADS", - "value": "True", - "type": "BOOL" - }, - { - "name": "STATIC_BUILD", - "value": "True", - "type": "BOOL" - }, - { - "name": "OPENSSL_NO_CAPIENG", - "value": "True", - "type": "BOOL" - }, - ] - } - ] -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp --- a/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SdlSimpleViewerApplication.h" -#include "../SdlHelpers.h" -#include "../../Common/SampleHelpers.h" - -#include "../../../Framework/Loaders/GenericLoadersContext.h" -#include "../../../Framework/StoneException.h" -#include "../../../Framework/StoneEnumerations.h" -#include "../../../Framework/StoneInitialization.h" -#include "../../../Framework/Viewport/SdlViewport.h" - -#include // For std::unique_ptr<> -#include - -#include -#include - -#include - - -std::string orthancUrl; -std::string instanceId; -int frameIndex = 0; - - -static void ProcessOptions(int argc, char* argv[]) -{ - namespace po = boost::program_options; - po::options_description desc("Usage:"); - - desc.add_options() - ("loglevel", po::value()->default_value("WARNING"), - "You can choose WARNING, INFO or TRACE for the logging level: Errors and warnings will always be displayed. (default: WARNING)") - - ("orthanc", po::value()->default_value("http://localhost:8042"), - "Base URL of the Orthanc instance") - - ("instance", po::value()->default_value("285dece8-e1956b38-cdc7d084-6ce3371e-536a9ffc"), - "Orthanc ID of the instance to display") - - ("frame_index", po::value()->default_value(0), - "The zero-based index of the frame (for multi-frame instances)") - ; - - po::variables_map vm; - try - { - po::store(po::parse_command_line(argc, argv, desc), vm); - po::notify(vm); - } - catch (std::exception& e) - { - std::cerr << "Please check your command line options! (\"" << e.what() << "\")" << std::endl; - } - - if (vm.count("loglevel") > 0) - { - std::string logLevel = vm["loglevel"].as(); - OrthancStoneHelpers::SetLogLevel(logLevel); - } - - if (vm.count("orthanc") > 0) - { - // maybe check URL validity here - orthancUrl = vm["orthanc"].as(); - } - - if (vm.count("instance") > 0) - { - instanceId = vm["instance"].as(); - } - - if (vm.count("frame_index") > 0) - { - frameIndex = vm["frame_index"].as(); - } - -} - -/** - * IMPORTANT: The full arguments to "main()" are needed for SDL on - * Windows. Otherwise, one gets the linking error "undefined reference - * to `SDL_main'". https://wiki.libsdl.org/FAQWindows - **/ -int main(int argc, char* argv[]) -{ - try - { - OrthancStone::StoneInitialize(); - - ProcessOptions(argc, argv); - - //Orthanc::Logging::EnableInfoLevel(true); - //Orthanc::Logging::EnableTraceLevel(true); - - { - -#if 1 - boost::shared_ptr viewport = - OrthancStone::SdlOpenGLViewport::Create("Stone of Orthanc", 800, 600); -#else - boost::shared_ptr viewport = - OrthancStone::SdlCairoViewport::Create("Stone of Orthanc", 800, 600); -#endif - - OrthancStone::GenericLoadersContext context(1, 4, 1); - - Orthanc::WebServiceParameters orthancWebService; - orthancWebService.SetUrl(orthancUrl); - context.SetOrthancParameters(orthancWebService); - - context.StartOracle(); - - { - - boost::shared_ptr application( - SdlSimpleViewerApplication::Create(context, viewport)); - - OrthancStone::DicomSource source; - - application->LoadOrthancFrame(source, instanceId, frameIndex); - - OrthancStone::DefaultViewportInteractor interactor; - - { - int scancodeCount = 0; - const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); - - bool stop = false; - while (!stop) - { - bool paint = false; - SDL_Event event; - while (SDL_PollEvent(&event)) - { - if (event.type == SDL_QUIT) - { - stop = true; - break; - } - else if (viewport->IsRefreshEvent(event)) - { - paint = true; - } - else if (event.type == SDL_WINDOWEVENT && - (event.window.event == SDL_WINDOWEVENT_RESIZED || - event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) - { - viewport->UpdateSize(event.window.data1, event.window.data2); - } - else if (event.type == SDL_WINDOWEVENT && - (event.window.event == SDL_WINDOWEVENT_SHOWN || - event.window.event == SDL_WINDOWEVENT_EXPOSED)) - { - paint = true; - } - else if (event.type == SDL_KEYDOWN && - event.key.repeat == 0 /* Ignore key bounce */) - { - switch (event.key.keysym.sym) - { - case SDLK_f: - viewport->ToggleMaximize(); - break; - - case SDLK_s: - application->FitContent(); - break; - - case SDLK_q: - stop = true; - break; - - default: - break; - } - } - else if (event.type == SDL_MOUSEBUTTONDOWN || - event.type == SDL_MOUSEMOTION || - event.type == SDL_MOUSEBUTTONUP) - { - std::unique_ptr lock(viewport->Lock()); - if (lock->HasCompositor()) - { - OrthancStone::PointerEvent p; - OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), - event, keyboardState, scancodeCount); - - switch (event.type) - { - case SDL_MOUSEBUTTONDOWN: - lock->GetController().HandleMousePress(interactor, p, - lock->GetCompositor().GetCanvasWidth(), - lock->GetCompositor().GetCanvasHeight()); - lock->Invalidate(); - break; - - case SDL_MOUSEMOTION: - if (lock->GetController().HandleMouseMove(p)) - { - lock->Invalidate(); - } - break; - - case SDL_MOUSEBUTTONUP: - lock->GetController().HandleMouseRelease(p); - lock->Invalidate(); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - } - } - } - - if (paint) - { - viewport->Paint(); - } - - // Small delay to avoid using 100% of CPU - SDL_Delay(1); - } - } - context.StopOracle(); - } - } - - OrthancStone::StoneFinalize(); - return 0; - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "OrthancException: " << e.What(); - return -1; - } - catch (OrthancStone::StoneException& e) - { - LOG(ERROR) << "StoneException: " << e.What(); - return -1; - } - catch (std::runtime_error& e) - { - LOG(ERROR) << "Runtime error: " << e.what(); - return -1; - } - catch (...) - { - LOG(ERROR) << "Native exception"; - return -1; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/SingleFrameViewer/SdlSimpleViewerApplication.h --- a/Samples/Sdl/SingleFrameViewer/SdlSimpleViewerApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../../Framework/Viewport/IViewport.h" -#include "../../../Framework/Loaders/DicomResourcesLoader.h" -#include "../../../Framework/Loaders/ILoadersContext.h" -#include "../../../Framework/Loaders/SeriesFramesLoader.h" -#include "../../../Framework/Loaders/SeriesThumbnailsLoader.h" - -#include // For std::unique_ptr<> - -#include - - -using OrthancStone::ILoadersContext; -using OrthancStone::ObserverBase; -using OrthancStone::IViewport; -using OrthancStone::DicomResourcesLoader; -using OrthancStone::SeriesFramesLoader; -using OrthancStone::TextureBaseSceneLayer; -using OrthancStone::DicomSource; -using OrthancStone::SeriesThumbnailsLoader; -using OrthancStone::LoadedDicomResources; -using OrthancStone::SeriesThumbnailType; -using OrthancStone::OracleScheduler; -using OrthancStone::OrthancRestApiCommand; -using OrthancStone::OracleScheduler; -using OrthancStone::OracleScheduler; -using OrthancStone::OracleScheduler; - - -class SdlSimpleViewerApplication : public ObserverBase -{ - -public: - static boost::shared_ptr Create(ILoadersContext& context, boost::shared_ptr viewport) - { - boost::shared_ptr application(new SdlSimpleViewerApplication(context, viewport)); - - { - std::unique_ptr lock(context.Lock()); - application->dicomLoader_ = DicomResourcesLoader::Create(*lock); - } - - application->Register(*application->dicomLoader_, &SdlSimpleViewerApplication::Handle); - - return application; - } - - void LoadOrthancFrame(const DicomSource& source, const std::string& instanceId, unsigned int frame) - { - std::unique_ptr lock(context_.Lock()); - - dicomLoader_->ScheduleLoadOrthancResource(boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), - 0, source, Orthanc::ResourceType_Instance, instanceId, - new Orthanc::SingleValueObject(frame)); - } - -#if 0 - void LoadDicomWebFrame(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const std::string& sopInstanceUid, - unsigned int frame) - { - std::unique_ptr lock(context_.Lock()); - - // We first must load the "/metadata" to know the number of frames - dicomLoader_->ScheduleGetDicomWeb( - boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), 0, source, - "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/instances/" + sopInstanceUid + "/metadata", - new Orthanc::SingleValueObject(frame)); - } -#endif - - void FitContent() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - -private: - ILoadersContext& context_; - boost::shared_ptr viewport_; - boost::shared_ptr dicomLoader_; - boost::shared_ptr framesLoader_; - - SdlSimpleViewerApplication(ILoadersContext& context, - boost::shared_ptr viewport) : - context_(context), - viewport_(viewport) - { - } - - void Handle(const SeriesFramesLoader::FrameLoadedMessage& message) - { - LOG(INFO) << "Frame decoded! " - << message.GetImage().GetWidth() << "x" << message.GetImage().GetHeight() - << " " << Orthanc::EnumerationToString(message.GetImage().GetFormat()); - - std::unique_ptr layer( - message.GetInstanceParameters().CreateTexture(message.GetImage())); - layer->SetLinearInterpolation(true); - - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().GetScene().SetLayer(0, layer.release()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - } - - void Handle(const DicomResourcesLoader::SuccessMessage& message) - { - if (message.GetResources()->GetSize() != 1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - //message.GetResources()->GetResource(0).Print(stdout); - - { - std::unique_ptr lock(context_.Lock()); - SeriesFramesLoader::Factory f(*message.GetResources()); - - framesLoader_ = boost::dynamic_pointer_cast( - f.Create(*lock)); - - Register( - *framesLoader_, &SdlSimpleViewerApplication::Handle); - - assert(message.HasUserPayload()); - - const Orthanc::SingleValueObject& payload = - dynamic_cast&>( - message.GetUserPayload()); - - LOG(INFO) << "Loading pixel data of frame: " << payload.GetValue(); - framesLoader_->ScheduleLoadFrame( - 0, message.GetDicomSource(), payload.GetValue(), - message.GetDicomSource().GetQualityCount() - 1 /* download best quality available */, - NULL); - } - } - -}; - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/Sdl/Utilities.cmake --- a/Samples/Sdl/Utilities.cmake Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - -macro(GetFilenameFromPath TargetVariable Path) -#message(STATUS "GetFilenameFromPath (1): Path = ${Path} TargetVariable = ${${TargetVariable}}") -string(REPLACE "\\" "/" PathWithFwdSlashes "${Path}") -string(REGEX REPLACE "^.*/" "" ${TargetVariable} "${PathWithFwdSlashes}") -#message(STATUS "GetFilenameFromPath (2): Path = ${Path} Path = ${PathWithFwdSlashes} TargetVariable = ${TargetVariable}") -endmacro() - -macro(GetFilePathWithoutLastExtension TargetVariable FilePath) -string(REGEX REPLACE "(^.*)\\.([^\\.]+)" "\\1" ${TargetVariable} "${FilePath}") -#message(STATUS "GetFileNameWithoutLastExtension: FilePath = ${FilePath} TargetVariable = ${${TargetVariable}}") -endmacro() - -macro(Test_GetFilePathWithoutLastExtension) -set(tmp "/prout/zi/goui.goui.cpp") -GetFilePathWithoutLastExtension(TargetVariable "${tmp}") -if(NOT ("${TargetVariable}" STREQUAL "/prout/zi/goui.goui")) - message(FATAL_ERROR "Test_GetFilePathWithoutLastExtension failed (1)") -else() - #message(STATUS "Test_GetFilePathWithoutLastExtension: <>") -endif() -endmacro() - -Test_GetFilePathWithoutLastExtension() - -macro(Test_GetFilenameFromPath) -set(tmp "/prout/../../dada/zi/goui.goui.cpp") -GetFilenameFromPath(TargetVariable "${tmp}") -if(NOT ("${TargetVariable}" STREQUAL "goui.goui.cpp")) - message(FATAL_ERROR "Test_GetFilenameFromPath failed") -else() - #message(STATUS "Test_GetFilenameFromPath: <>") -endif() -endmacro() - -Test_GetFilenameFromPath() - -macro(SortFilesInSourceGroups) - if(FALSE) - foreach(source IN LISTS ORTHANC_STONE_SOURCES) - # if("${source}" MATCHES ".*/pixman.*\\.c") - # message("pixman source: ${source}") - # elseif("${source}" MATCHES ".*/pixman.*\\.c") - # message("pixman header: ${source}") - # endif() - - if("${source}" MATCHES ".*\\.\\./.*") - message("source raw: ${source}") - #file(TO_CMAKE_PATH ${source} sourceCMakePath) - get_filename_component(sourceCMakePath ${source} ABSOLUTE) - message("source CMake: ${sourceCMakePath}") - endif() - - # returns the containing directory with forward slashes - # get_filename_component(source_path "${source}" PATH) - - # converts / to \ - # string(REPLACE "/" "\\" source_path_msvc "${source_path}") - #source_group("Stone ${source_path_msvc}" FILES "${source}") - endforeach() - endif() - - source_group("Orthanc Framework\\Sources" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*cpp") - source_group("Orthanc Framework\\Headers" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*hpp") - source_group("Orthanc Framework\\Headers" REGULAR_EXPRESSION ".*/orthanc/(Core|Plugins)/.*h") - - source_group("Stone Library\\Sources" REGULAR_EXPRESSION ".*/orthanc-stone/.*cpp") - source_group("Stone Library\\Headers" REGULAR_EXPRESSION ".*/orthanc-stone/.*hpp") - source_group("Stone Library\\Headers" REGULAR_EXPRESSION ".*/orthanc-stone/.*h") - - source_group("Stone Samples\\Source" REGULAR_EXPRESSION ".*orthanc-stone/Samples/.*\\.cpp") - source_group("Stone Samples\\Headers" REGULAR_EXPRESSION ".*orthanc-stone/Samples/.*\\.h") - - source_group("ThirdParty\\cairo" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/cairo[^/]*/.*") - source_group("ThirdParty\\pixman" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/pixman[^/]*/.*") - source_group("ThirdParty\\base64" REGULAR_EXPRESSION ".*ThirdParty/base64.*") - source_group("ThirdParty\\SDL2" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/SDL2.*") - source_group("ThirdParty\\glew" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/glew.*") - source_group("AUTOGENERATED" REGULAR_EXPRESSION ".*${CMAKE_BINARY_DIR}/AUTOGENERATED/.*") - source_group("ThirdParty\\minizip" REGULAR_EXPRESSION ".*ThirdParty/minizip/.*") - source_group("ThirdParty\\md5" REGULAR_EXPRESSION ".*ThirdParty/md5/.*") -endmacro() - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/CMakeLists.txt --- a/Samples/WebAssembly/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(OrthancStone) - -# Configuration of the Emscripten compiler for WebAssembly target -# --------------------------------------------------------------- -set(USE_WASM ON CACHE BOOL "") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../orthanc/OrthancFramework CACHE STRING "") -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../) - -set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") - -set(WASM_FLAGS "-s WASM=1 -s FETCH=1") -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") -endif() - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") -add_definitions( - -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 -) - -# Stone of Orthanc configuration -# --------------------------------------------------------------- -set(ALLOW_DOWNLOADS ON) -set(ORTHANC_FRAMEWORK_SOURCE "path") - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/AutoGeneratedCode.cmake) -include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/DownloadPackage.cmake) - -SET(ENABLE_DCMTK OFF) # Not necessary -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) # Necessary for text rendering -SET(ENABLE_WASM ON) -SET(ORTHANC_SANDBOXED ON) - -# this will set up the build system for Stone of Orthanc and will -# populate the ORTHANC_STONE_SOURCES CMake variable -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) - - -# We embed a font to be used for on-screen overlays -# --------------------------------------------------------------- - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -EmbedResources( - COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -add_library(OrthancStone STATIC - ${ORTHANC_STONE_SOURCES} - ${AUTOGENERATED_SOURCES} - ) - -################################################################################ - -# Define the WASM module -# --------------------------------------------------------------- - -project(RtViewerWasm) - -add_executable(RtViewerWasm - RtViewer/RtViewerWasm.cpp - ../Common/RtViewerApp.cpp - ../Common/RtViewerApp.h - ../Common/RtViewerView.cpp - ../Common/RtViewerView.h - ) - -target_link_libraries(RtViewerWasm OrthancStone) - -# Declare installation files for the module -# --------------------------------------------------------------- -install( - TARGETS RtViewerWasm - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/RtViewer/ - ) - -# Declare installation files for the companion files (web scaffolding) -# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js -# (the generated JS loader for the WASM module) is handled by the `install1` -# section above: it is considered to be the binary output of -# the linker. -# --------------------------------------------------------------- -install( - FILES - ${CMAKE_SOURCE_DIR}/RtViewer/RtViewerWasmApp.js - ${CMAKE_SOURCE_DIR}/RtViewer/index.html - ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.wasm - DESTINATION ${CMAKE_INSTALL_PREFIX}/RtViewer/ - ) - -################################################################################ - -# Define the WASM module -# --------------------------------------------------------------- - -project(SingleFrameViewerWasm) - -add_executable(SingleFrameViewerWasm - SingleFrameViewer/SingleFrameViewer.cpp - ) - -target_link_libraries(SingleFrameViewerWasm OrthancStone) - -# Declare installation files for the module -# --------------------------------------------------------------- -install( - TARGETS SingleFrameViewerWasm - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/SingleFrameViewer/ - ) - -# Declare installation files for the companion files (web scaffolding) -# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js -# (the generated JS loader for the WASM module) is handled by the `install1` -# section above: it is considered to be the binary output of -# the linker. -# --------------------------------------------------------------- -install( - FILES - ${CMAKE_SOURCE_DIR}/SingleFrameViewer/SingleFrameViewerApp.js - ${CMAKE_SOURCE_DIR}/SingleFrameViewer/index.html - ${CMAKE_CURRENT_BINARY_DIR}/SingleFrameViewerWasm.wasm - DESTINATION ${CMAKE_INSTALL_PREFIX}/SingleFrameViewer/ - ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/NOTES.txt --- a/Samples/WebAssembly/NOTES.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - -Building WebAssembly samples using Docker -========================================= - -The script "./docker-build.sh" can be used to quickly build the -WebAssembly samples on any GNU/Linux distribution equipped with -Docker. This avoids newcomers to install Emscripten and learn the -CMake options. Just type: - -$ ./docker-build.sh Release - -After successful build, the binaries will be installed in the -following folder (i.e. in the folder "wasm-binaries" at the root of -the source distribution): - -$ ls -l ../../wasm-binaries - - -NB: The source code of the Docker build environment can be found at -the following location: -https://github.com/jodogne/OrthancDocker/tree/master/wasm-builder - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/CMakeLists.txt --- a/Samples/WebAssembly/RtViewer/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(RtViewerWasm) - -# Configuration of the Emscripten compiler for WebAssembly target -# --------------------------------------------------------------- -set(USE_WASM ON CACHE BOOL "") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../orthanc CACHE STRING "") -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../) - -set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") - -set(WASM_FLAGS "-s WASM=1 -s FETCH=1") -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") -endif() - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") -add_definitions( - -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 -) - -# Stone of Orthanc configuration -# --------------------------------------------------------------- -set(ALLOW_DOWNLOADS ON) -set(ORTHANC_FRAMEWORK_SOURCE "path") - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/AutoGeneratedCode.cmake) -include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake) - -SET(ENABLE_DCMTK OFF) # Not necessary -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) # Necessary for text rendering -SET(ENABLE_WASM ON) -SET(ORTHANC_SANDBOXED ON) - -# this will set up the build system for Stone of Orthanc and will -# populate the ORTHANC_STONE_SOURCES CMake variable -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) - - -# We embed a font to be used for on-screen overlays -# --------------------------------------------------------------- - -DownloadPackage( - "a24b8136b8f3bb93f166baf97d9328de" - "http://orthanc.osimis.io/ThirdPartyDownloads/ubuntu-font-family-0.83.zip" - "${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83") - -EmbedResources( - COLORMAP_HOT ${ORTHANC_STONE_ROOT}/Resources/Colormaps/hot.lut - UBUNTU_FONT ${CMAKE_BINARY_DIR}/ubuntu-font-family-0.83/Ubuntu-R.ttf - ) - -# Define the WASM module -# --------------------------------------------------------------- -add_executable(RtViewerWasm - RtViewerWasm.cpp - ../../Common/RtViewerApp.cpp - ../../Common/RtViewerApp.h - ../../Common/RtViewerView.cpp - ../../Common/RtViewerView.h - ${ORTHANC_STONE_SOURCES} - ${AUTOGENERATED_SOURCES} - ) - -# Declare installation files for the module -# --------------------------------------------------------------- -install( - TARGETS RtViewerWasm - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} - ) - -# Declare installation files for the companion files (web scaffolding) -# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js -# (the generated JS loader for the WASM module) is handled by the `install1` -# section above: it is considered to be the binary output of -# the linker. -# --------------------------------------------------------------- -install( - FILES - ${CMAKE_SOURCE_DIR}/RtViewerWasmApp.js - ${CMAKE_SOURCE_DIR}/index.html - ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.wasm - DESTINATION ${CMAKE_INSTALL_PREFIX} - ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/OBSOLETE.cpp --- a/Samples/WebAssembly/RtViewer/OBSOLETE.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,559 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../../../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../../../Framework/Oracle/SleepOracleCommand.h" -#include "../../../Framework/Oracle/WebAssemblyOracle.h" -#include "../../../Framework/Scene2D/GrayscaleStyleConfigurator.h" -#include "../../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../../Framework/Scene2D/PanSceneTracker.h" -#include "../../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../../Framework/Scene2DViewport/UndoStack.h" -#include "../../../Framework/Scene2DViewport/ViewportController.h" -#include "../../../Framework/StoneInitialization.h" -#include "../../../Framework/Viewport/WebAssemblyViewport.h" -#include "../../../Framework/Volumes/VolumeSceneLayerSource.h" - -#include - -#include -#include - -#include - - -class ViewportManager; - -static const unsigned int FONT_SIZE = 32; - -boost::shared_ptr ct_(new OrthancStone::DicomVolumeImage); -boost::shared_ptr loader_; -std::unique_ptr widget1_; -std::unique_ptr widget2_; -std::unique_ptr widget3_; -//OrthancStone::MessageBroker broker_; -//OrthancStone::WebAssemblyOracle oracle_(broker_); -std::unique_ptr tracker_; -static std::map arguments_; -static bool ctrlDown_ = false; - - -#if 0 - -// use the one from WebAssemblyViewport -static OrthancStone::PointerEvent* ConvertMouseEvent( - const EmscriptenMouseEvent& source, - OrthancStone::IViewport& viewport) -{ - - std::unique_ptr target( - new OrthancStone::PointerEvent); - - target->AddPosition(viewport.GetPixelCenterCoordinates( - source.targetX, source.targetY)); - target->SetAltModifier(source.altKey); - target->SetControlModifier(source.ctrlKey); - target->SetShiftModifier(source.shiftKey); - - return target.release(); -} -#endif - - -EM_BOOL OnMouseEvent(int eventType, - const EmscriptenMouseEvent *mouseEvent, - void *userData) -{ - if (mouseEvent != NULL && - userData != NULL) - { - boost::shared_ptr& viewport = - *reinterpret_cast*>(userData); - - std::unique_ptr lock = (*viewport)->Lock(); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - - switch (eventType) - { - case EMSCRIPTEN_EVENT_CLICK: - { - static unsigned int count = 0; - char buf[64]; - sprintf(buf, "click %d", count++); - - std::unique_ptr layer(new OrthancStone::TextSceneLayer); - layer->SetText(buf); - scene.SetLayer(100, layer.release()); - lock->Invalidate(); - break; - } - - case EMSCRIPTEN_EVENT_MOUSEDOWN: - { - boost::shared_ptr t; - - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - - switch (mouseEvent->button) - { - case 0: // Left button - emscripten_console_log("Creating RotateSceneTracker"); - t.reset(new OrthancStone::RotateSceneTracker( - viewport, *event)); - break; - - case 1: // Middle button - emscripten_console_log("Creating PanSceneTracker"); - LOG(INFO) << "Creating PanSceneTracker" ; - t.reset(new OrthancStone::PanSceneTracker( - viewport, *event)); - break; - - case 2: // Right button - emscripten_console_log("Creating ZoomSceneTracker"); - t.reset(new OrthancStone::ZoomSceneTracker( - viewport, *event, controller->GetViewport().GetCanvasWidth())); - break; - - default: - break; - } - } - - if (t.get() != NULL) - { - tracker_.reset( - new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier())); - controller->GetViewport().Refresh(); - } - - break; - } - - case EMSCRIPTEN_EVENT_MOUSEMOVE: - if (tracker_.get() != NULL) - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - tracker_->PointerMove(*event); - controller->GetViewport().Refresh(); - } - break; - - case EMSCRIPTEN_EVENT_MOUSEUP: - if (tracker_.get() != NULL) - { - std::unique_ptr event( - ConvertMouseEvent(*mouseEvent, controller->GetViewport())); - tracker_->PointerUp(*event); - controller->GetViewport().Refresh(); - if (!tracker_->IsAlive()) - tracker_.reset(); - } - break; - - default: - break; - } - } - - return true; -} - - -void SetupEvents(const std::string& canvas, - boost::shared_ptr& viewport) -{ - emscripten_set_mousedown_callback(canvas.c_str(), &viewport, false, OnMouseEvent); - emscripten_set_mousemove_callback(canvas.c_str(), &viewport, false, OnMouseEvent); - emscripten_set_mouseup_callback(canvas.c_str(), &viewport, false, OnMouseEvent); -} - - class ViewportManager : public OrthanStone::ObserverBase - { - private: - OrthancStone::WebAssemblyViewport viewport_; - std::unique_ptr source_; - VolumeProjection projection_; - std::vector planes_; - size_t currentPlane_; - - void Handle(const DicomVolumeImage::GeometryReadyMessage& message) - { - LOG(INFO) << "Geometry is available"; - - const VolumeImageGeometry& geometry = message.GetOrigin().GetGeometry(); - - const unsigned int depth = geometry.GetProjectionDepth(projection_); - - // select an initial cutting plane halfway through the volume - currentPlane_ = depth / 2; - - planes_.resize(depth); - - for (unsigned int z = 0; z < depth; z++) - { - planes_[z] = geometry.GetProjectionSlice(projection_, z); - } - - Refresh(); - - viewport_.FitContent(); - } - - public: - ViewportManager(const std::string& canvas, - VolumeProjection projection) : - projection_(projection), - currentPlane_(0) - { - viewport_ = OrthancStone::WebGLViewport::Create(canvas); - } - - void UpdateSize() - { - viewport_.UpdateSize(); - } - - void SetSlicer(int layerDepth, - const boost::shared_ptr& slicer, - IObservable& loader, - ILayerStyleConfigurator* configurator) - { - if (source_.get() != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Only one slicer can be registered"); - } - - loader.RegisterObserverCallback( - new Callable - (*this, &ViewportManager::Handle)); - - source_.reset(new VolumeSceneLayerSource(viewport_.GetScene(), layerDepth, slicer)); - - if (configurator != NULL) - { - source_->SetConfigurator(configurator); - } - } - - void Refresh() - { - if (source_.get() != NULL && - currentPlane_ < planes_.size()) - { - source_->Update(planes_[currentPlane_]); - viewport_.Refresh(); - } - } - - size_t GetSlicesCount() const - { - return planes_.size(); - } - - void Scroll(int delta) - { - if (!planes_.empty()) - { - int tmp = static_cast(currentPlane_) + delta; - unsigned int next; - - if (tmp < 0) - { - next = 0; - } - else if (tmp >= static_cast(planes_.size())) - { - next = planes_.size() - 1; - } - else - { - next = static_cast(tmp); - } - - if (next != currentPlane_) - { - currentPlane_ = next; - Refresh(); - } - } - } - }; -} - - -EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) -{ - try - { - if (widget1_.get() != NULL) - { - widget1_->UpdateSize(); - } - - if (widget2_.get() != NULL) - { - widget2_->UpdateSize(); - } - - if (widget3_.get() != NULL) - { - widget3_->UpdateSize(); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception while updating canvas size: " << e.What(); - } - - return true; -} - -EM_BOOL OnAnimationFrame(double time, void *userData) -{ - try - { - if (widget1_.get() != NULL) - { - widget1_->Refresh(); - } - - if (widget2_.get() != NULL) - { - widget2_->Refresh(); - } - - if (widget3_.get() != NULL) - { - widget3_->Refresh(); - } - - return true; - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception in the animation loop, stopping now: " << e.What(); - return false; - } -} - -EM_BOOL OnMouseWheel(int eventType, - const EmscriptenWheelEvent *wheelEvent, - void *userData) -{ - try - { - if (userData != NULL) - { - int delta = 0; - - if (wheelEvent->deltaY < 0) - { - delta = -1; - } - - if (wheelEvent->deltaY > 0) - { - delta = 1; - } - - OrthancStone::ViewportManager& widget = - *reinterpret_cast(userData); - - if (ctrlDown_) - { - delta *= static_cast(widget.GetSlicesCount() / 10); - } - - widget.Scroll(delta); - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception in the wheel event: " << e.What(); - } - - return true; -} - - -EM_BOOL OnKeyDown(int eventType, - const EmscriptenKeyboardEvent *keyEvent, - void *userData) -{ - ctrlDown_ = keyEvent->ctrlKey; - return false; -} - - -EM_BOOL OnKeyUp(int eventType, - const EmscriptenKeyboardEvent *keyEvent, - void *userData) -{ - ctrlDown_ = false; - return false; -} - - - -#if 0 -namespace OrthancStone -{ - class TestSleep : public IObserver - { - private: - WebAssemblyOracle& oracle_; - - void Schedule() - { - oracle_.Schedule(*this, new OrthancStone::SleepOracleCommand(2000)); - } - - void Handle(const SleepOracleCommand::TimeoutMessage& message) - { - LOG(INFO) << "TIMEOUT"; - Schedule(); - } - - public: - TestSleep(MessageBroker& broker, - WebAssemblyOracle& oracle) : - IObserver(broker), - oracle_(oracle) - { - oracle.RegisterObserverCallback( - new Callable - (*this, &TestSleep::Handle)); - - LOG(INFO) << "STARTING"; - Schedule(); - } - }; - - //static TestSleep testSleep(broker_, oracle_); -} -#endif - -static bool GetArgument(std::string& value, - const std::string& key) -{ - std::map::const_iterator found = arguments_.find(key); - - if (found == arguments_.end()) - { - return false; - } - else - { - value = found->second; - return true; - } -} - - -extern "C" -{ - int main(int argc, char const *argv[]) - { - OrthancStone::StoneInitialize(); - Orthanc::Logging::EnableInfoLevel(true); - // Orthanc::Logging::EnableTraceLevel(true); - EM_ASM(window.dispatchEvent(new CustomEvent("WebAssemblyLoaded"));); - } - - EMSCRIPTEN_KEEPALIVE - void SetArgument(const char* key, const char* value) - { - // This is called for each GET argument (cf. "app.js") - LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; - arguments_[key] = value; - } - - EMSCRIPTEN_KEEPALIVE - void Initialize() - { - try - { - oracle_.SetOrthancRoot(".."); - - loader_.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct_, oracle_, oracle_)); - - widget1_.reset(new OrthancStone::ViewportManager("mycanvas1", OrthancStone::VolumeProjection_Axial)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget1_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget1_->UpdateSize(); - - widget2_.reset(new OrthancStone::ViewportManager("mycanvas2", OrthancStone::VolumeProjection_Coronal)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget2_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget2_->UpdateSize(); - - widget3_.reset(new OrthancStone::ViewportManager("mycanvas3", OrthancStone::VolumeProjection_Sagittal)); - { - std::unique_ptr style(new OrthancStone::GrayscaleStyleConfigurator); - style->SetLinearInterpolation(true); - style->SetWindowing(OrthancStone::ImageWindowing_Bone); - widget3_->SetSlicer(0, loader_, *loader_, style.release()); - } - widget3_->UpdateSize(); - - emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnWindowResize); // DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 !! - - emscripten_set_wheel_callback("#mycanvas1", widget1_.get(), false, OnMouseWheel); - emscripten_set_wheel_callback("#mycanvas2", widget2_.get(), false, OnMouseWheel); - emscripten_set_wheel_callback("#mycanvas3", widget3_.get(), false, OnMouseWheel); - - emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyDown); - emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, false, OnKeyUp); - - //emscripten_request_animation_frame_loop(OnAnimationFrame, NULL); - - std::string ct; - if (GetArgument(ct, "ct")) - { - //loader_->LoadSeries("a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"); - loader_->LoadSeries(ct); - } - else - { - LOG(ERROR) << "No Orthanc identifier for the CT series was provided"; - } - } - catch (Orthanc::OrthancException& e) - { - LOG(ERROR) << "Exception during Initialize(): " << e.What(); - } - } -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/RtViewerWasm.cpp --- a/Samples/WebAssembly/RtViewer/RtViewerWasm.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../../Common/RtViewerApp.h" -#include "../../Common/RtViewerView.h" -#include "../../Common/SampleHelpers.h" - -// Stone of Orthanc includes -#include "../../../Framework/Loaders/WebAssemblyLoadersContext.h" -#include "../../../Framework/StoneException.h" -#include "../../../Framework/StoneInitialization.h" -#include "../../../Framework/Viewport/WebGLViewport.h" -//#include "../../../Framework/OpenGL/WebAssemblyOpenGLContext.h" - -#include - -#include -#include -// #include this include might be necessary in more recent boost versions - -#include -#include - - -#define DISPATCH_JAVASCRIPT_EVENT(name) \ - EM_ASM( \ - const customEvent = document.createEvent("CustomEvent"); \ - customEvent.initCustomEvent(name, false, false, undefined); \ - window.dispatchEvent(customEvent); \ - ); - -#define EXTERN_CATCH_EXCEPTIONS \ - catch (Orthanc::OrthancException& e) \ - { \ - LOG(ERROR) << "OrthancException: " << e.What(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (OrthancStone::StoneException& e) \ - { \ - LOG(ERROR) << "StoneException: " << e.What(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (std::exception& e) \ - { \ - LOG(ERROR) << "Runtime error: " << e.what(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (...) \ - { \ - LOG(ERROR) << "Native exception"; \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } - -namespace OrthancStone -{ - // typedef EM_BOOL (*OnMouseWheelFunc)(int eventType, const EmscriptenWheelEvent* wheelEvent, void* userData); - - EM_BOOL RtViewerView_Scroll(int eventType, - const EmscriptenWheelEvent* wheelEvent, - void* userData) - { - RtViewerView* that = reinterpret_cast(userData); - - int delta = 0; - if (wheelEvent->deltaY < 0) - delta = -1; - if (wheelEvent->deltaY > 0) - delta = 1; - - that->Scroll(delta); - - return 1; - } - - boost::shared_ptr RtViewerView::CreateViewport( - const std::string& canvasId) - { - boost::shared_ptr viewport = WebGLViewport::Create(canvasId); - - void* userData = reinterpret_cast(this); - - // manually add the mouse wheel handler - - std::string selector = "#" + canvasId; - - emscripten_set_wheel_callback_on_thread( - selector.c_str(), - userData, - false, - &RtViewerView_Scroll, - EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD); - - return viewport; - } - - void RtViewerView::TakeScreenshot(const std::string& target, - unsigned int canvasWidth, - unsigned int canvasHeight) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - - void RtViewerApp::RunWasm() - { - loadersContext_.reset(new OrthancStone::WebAssemblyLoadersContext(1, 4, 1)); - - // we are in WASM --> downcast to concrete type - boost::shared_ptr loadersContext = - boost::dynamic_pointer_cast(loadersContext_); - - if (HasArgument("orthanc")) - loadersContext->SetLocalOrthanc(GetArgument("orthanc")); - else - loadersContext->SetLocalOrthanc(".."); - - loadersContext->SetDicomCacheSize(128 * 1024 * 1024); // 128MB - - CreateLoaders(); - - CreateView("RtViewer_Axial", VolumeProjection_Axial); - CreateView("RtViewer_Coronal", VolumeProjection_Coronal); - CreateView("RtViewer_Sagittal", VolumeProjection_Sagittal); - - for (size_t i = 0; i < views_.size(); ++i) - { - views_[i]->PrepareViewport(); - } - - StartLoaders(); - - DefaultViewportInteractor interactor; - } -} - -extern "C" -{ - boost::shared_ptr g_app; - - int main(int argc, char const *argv[]) - { - try - { - OrthancStone::StoneInitialize(); - Orthanc::Logging::Initialize(); - Orthanc::Logging::EnableTraceLevel(true); - - LOG(WARNING) << "Initializing native Stone"; - - LOG(WARNING) << "Compiled with Emscripten " << __EMSCRIPTEN_major__ - << "." << __EMSCRIPTEN_minor__ - << "." << __EMSCRIPTEN_tiny__; - - LOG(INFO) << "Endianness: " << Orthanc::EnumerationToString(Orthanc::Toolbox::DetectEndianness()); - - g_app = OrthancStone::RtViewerApp::Create(); - - DISPATCH_JAVASCRIPT_EVENT("WasmModuleInitialized"); - } - EXTERN_CATCH_EXCEPTIONS; - } - - EMSCRIPTEN_KEEPALIVE - void Initialize(const char* canvasId) - { - try - { - g_app->RunWasm(); - } - EXTERN_CATCH_EXCEPTIONS; - } - - EMSCRIPTEN_KEEPALIVE - void SetArgument(const char* key, const char* value) - { - // This is called for each GET argument (cf. "app.js") - LOG(INFO) << "Received GET argument: [" << key << "] = [" << value << "]"; - g_app->SetArgument(key, value); - } - -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/RtViewerWasmApp.js --- a/Samples/WebAssembly/RtViewer/RtViewerWasmApp.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ - -// This object wraps the functions exposed by the wasm module - -const WasmModuleWrapper = function() { - this._InitializeViewport = undefined; -}; - -WasmModuleWrapper.prototype.Setup = function(Module) { - this._SetArgument = Module.cwrap('SetArgument', null, [ 'string', 'string' ]); - this._Initialize = Module.cwrap('Initialize', null, [ 'string' ]); -}; - -WasmModuleWrapper.prototype.SetArgument = function(key, value) { - this._SetArgument(key, value); -}; - -WasmModuleWrapper.prototype.Initialize = function(canvasId) { - this._Initialize(canvasId); -}; - -var wasmModuleWrapper = new WasmModuleWrapper(); - -$(document).ready(function() { - - window.addEventListener('WasmModuleInitialized', function() { - - // bind the C++ global functions - wasmModuleWrapper.Setup(Module); - - console.warn('Native C++ module initialized'); - - // Loop over the GET arguments - var parameters = window.location.search.substr(1); - if (parameters != null && parameters != '') { - var tokens = parameters.split('&'); - for (var i = 0; i < tokens.length; i++) { - var arg = tokens[i].split('='); - if (arg.length == 2) { - // Send each GET argument to WebAssembly - wasmModuleWrapper.SetArgument(arg[0], decodeURIComponent(arg[1])); - } - } - } - wasmModuleWrapper.Initialize(); - }); - - window.addEventListener('StoneException', function() { - alert('Exception caught in C++ code'); - }); - - var scriptSource; - - if ('WebAssembly' in window) { - console.warn('Loading WebAssembly'); - scriptSource = 'RtViewerWasm.js'; - } else { - console.error('Your browser does not support WebAssembly!'); - } - - // Option 1: Loading script using plain HTML - - /* - var script = document.createElement('script'); - script.src = scriptSource; - script.type = 'text/javascript'; - document.body.appendChild(script); - */ - - // Option 2: Loading script using AJAX (gives the opportunity to - // report explicit errors) - - axios.get(scriptSource) - .then(function (response) { - var script = document.createElement('script'); - script.innerHTML = response.data; - script.type = 'text/javascript'; - document.body.appendChild(script); - }) - .catch(function (error) { - alert('Cannot load the WebAssembly framework'); - }); -}); - -// http://localhost:9979/rtviewer/index.html?loglevel=trace&ctseries=a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa&rtdose=830a69ff-8e4b5ee3-b7f966c8-bccc20fb-d322dceb&rtstruct=54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9 - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/RtViewerWasmWrapper.js --- a/Samples/WebAssembly/RtViewer/RtViewerWasmWrapper.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ - -const Stone = function() { - this._InitializeViewport = undefined; - this._LoadOrthanc = undefined; - this._LoadDicomWeb = undefined; -}; - -Stone.prototype.Setup = function(Module) { - this._InitializeViewport = Module.cwrap('InitializeViewport', null, [ 'string' ]); - this._LoadOrthanc = Module.cwrap('LoadOrthanc', null, [ 'string', 'int' ]); - this._LoadDicomWeb = Module.cwrap('LoadDicomWeb', null, [ 'string', 'string', 'string', 'string', 'int' ]); -}; - -Stone.prototype.InitializeViewport = function(canvasId) { - this._InitializeViewport(canvasId); -}; - -Stone.prototype.LoadOrthanc = function(instance, frame) { - this._LoadOrthanc(instance, frame); -}; - -Stone.prototype.LoadDicomWeb = function(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame) { - this._LoadDicomWeb(server, studyInstanceUid, seriesInstanceUid, sopInstanceUid, frame); -}; - -var stone = new Stone(); - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/RtViewer/index.html --- a/Samples/WebAssembly/RtViewer/index.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -ο»Ώ - - - Stone of Orthanc Single Frame Viewer - - - - - - - - - - - - - - - - - - - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/CMakeLists.txt --- a/Samples/WebAssembly/SingleFrameViewer/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) - -project(SingleFrameViewer) - -# Configuration of the Emscripten compiler for WebAssembly target -# --------------------------------------------------------------- -set(USE_WASM ON CACHE BOOL "") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../orthanc CACHE STRING "") -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../) - -set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") - -set(WASM_FLAGS "-s WASM=1 -s FETCH=1") -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(WASM_FLAGS "${WASM_FLAGS} -s SAFE_HEAP=1") -endif() - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WASM_FLAGS}") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WASM_FLAGS}") - -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ERROR_ON_UNDEFINED_SYMBOLS=1") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ASSERTIONS=1 -s DISABLE_EXCEPTION_CATCHING=0") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_MEMORY=268435456") # 256MB + resize -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1") -add_definitions( - -DDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1 -) - -# Stone of Orthanc configuration -# --------------------------------------------------------------- -set(ALLOW_DOWNLOADS ON) -set(ORTHANC_FRAMEWORK_SOURCE "path") - -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) - -SET(ENABLE_DCMTK ON) -SET(ENABLE_GOOGLE_TEST OFF) -SET(ENABLE_LOCALE ON) # Necessary for text rendering -SET(ENABLE_WASM ON) -SET(ORTHANC_SANDBOXED ON) - -# this will set up the build system for Stone of Orthanc and will -# populate the ORTHANC_STONE_SOURCES CMake variable -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) - -# Define the WASM module -# --------------------------------------------------------------- -add_executable(SingleFrameViewerWasm - SingleFrameViewer.cpp - ${ORTHANC_STONE_SOURCES} - ) - -# Declare installation files for the module -# --------------------------------------------------------------- -install( - TARGETS SingleFrameViewerWasm - RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX} - ) - -# Declare installation files for the companion files (web scaffolding) -# please note that ${CMAKE_CURRENT_BINARY_DIR}/RtViewerWasm.js -# (the generated JS loader for the WASM module) is handled by the `install1` -# section above: it is considered to be the binary output of -# the linker. -# --------------------------------------------------------------- -install( - FILES - ${CMAKE_SOURCE_DIR}/SingleFrameViewerApp.js - ${CMAKE_SOURCE_DIR}/index.html - ${CMAKE_CURRENT_BINARY_DIR}/SingleFrameViewerWasm.wasm - DESTINATION ${CMAKE_INSTALL_PREFIX} - ) diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/CMakeSettings.json --- a/Samples/WebAssembly/SingleFrameViewer/CMakeSettings.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -ο»Ώ{ - "configurations": [ - { - "name": "wasm32-RelWithDebInfo", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - //"inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v", - "ctestCommandArgs": "", - "cmakeToolchain": "C:/osi/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake", - "intelliSenseMode": "windows-clang-x64", - "variables": [ - { - "name": "CMAKE_BUILD_TYPE", - "value": "RelWithDebInfo", - "type": "STRING" - }, - { - "name": "ALLOW_DOWNLOADS", - "value": "True", - "type": "BOOL" - }, - { - "name": "STATIC_BUILD", - "value": "True", - "type": "BOOL" - }, - { - "name": "OPENSSL_NO_CAPIENG", - "value": "True", - "type": "BOOL" - } - ] - } - ] -} \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/SingleFrameViewer.cpp --- a/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewer.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "SingleFrameViewerApplication.h" - -#include "../../../Framework/Loaders/WebAssemblyLoadersContext.h" -#include "../../../Framework/StoneException.h" -#include "../../../Framework/StoneInitialization.h" - -#include // For std::unique_ptr<> -#include - -#include -#include - - -#define DISPATCH_JAVASCRIPT_EVENT(name) \ - EM_ASM( \ - const customEvent = document.createEvent("CustomEvent"); \ - customEvent.initCustomEvent(name, false, false, undefined); \ - window.dispatchEvent(customEvent); \ - ); - -#define EXTERN_CATCH_EXCEPTIONS \ - catch (Orthanc::OrthancException& e) \ - { \ - LOG(ERROR) << "OrthancException: " << e.What(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (OrthancStone::StoneException& e) \ - { \ - LOG(ERROR) << "StoneException: " << e.What(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (std::exception& e) \ - { \ - LOG(ERROR) << "Runtime error: " << e.what(); \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } \ - catch (...) \ - { \ - LOG(ERROR) << "Native exception"; \ - DISPATCH_JAVASCRIPT_EVENT("StoneException"); \ - } - - - -namespace OrthancStone -{ -} - -static std::unique_ptr context_; -static boost::shared_ptr application_; - -extern "C" -{ - int main(int argc, char const *argv[]) - { - try - { - Orthanc::Logging::Initialize(); - Orthanc::Logging::EnableInfoLevel(true); - //Orthanc::Logging::EnableTraceLevel(true); - LOG(WARNING) << "Initializing native Stone"; - - LOG(WARNING) << "Compiled with Emscripten " << __EMSCRIPTEN_major__ - << "." << __EMSCRIPTEN_minor__ - << "." << __EMSCRIPTEN_tiny__; - - LOG(INFO) << "Endianness: " << Orthanc::EnumerationToString(Orthanc::Toolbox::DetectEndianness()); - context_.reset(new OrthancStone::WebAssemblyLoadersContext(1, 4, 1)); - context_->SetLocalOrthanc(".."); - context_->SetDicomCacheSize(128 * 1024 * 1024); // 128MB - - DISPATCH_JAVASCRIPT_EVENT("WasmModuleInitialized"); - } - EXTERN_CATCH_EXCEPTIONS; - - return 0; - } - - EMSCRIPTEN_KEEPALIVE - void InitializeViewport(const char* canvasId) - { - try - { - if (context_.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "The loaders context is not available yet"); - } - - if (application_.get() != NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls, - "Only one single viewport is available for this application"); - } - - boost::shared_ptr viewport(OrthancStone::GetWebGLViewportsRegistry().Add(canvasId)); - application_ = OrthancStone::Application::Create(*context_, viewport); - - { - OrthancStone::WebGLViewportsRegistry::Accessor accessor( - OrthancStone::GetWebGLViewportsRegistry(), canvasId); - - if (accessor.IsValid()) - { - accessor.GetViewport().Invalidate(); - } - } - } - EXTERN_CATCH_EXCEPTIONS; - } - - - EMSCRIPTEN_KEEPALIVE - void LoadFromOrthanc(const char* instance, - int frame) - { - try - { - if (application_.get() != NULL) - { - OrthancStone::DicomSource source; - application_->LoadOrthancFrame(source, instance, frame); - } - } - EXTERN_CATCH_EXCEPTIONS; - } - - - EMSCRIPTEN_KEEPALIVE - void LoadFromDicomWeb(const char* server, - const char* studyInstanceUid, - const char* seriesInstanceUid, - const char* sopInstanceUid, - int frame) - { - try - { - if (application_.get() != NULL) - { - OrthancStone::DicomSource source; - source.SetDicomWebThroughOrthancSource(server); - application_->LoadDicomWebFrame(source, studyInstanceUid, seriesInstanceUid, - sopInstanceUid, frame); - } - } - EXTERN_CATCH_EXCEPTIONS; - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApp.js --- a/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApp.js Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ - -// This object wraps the functions exposed by the wasm module - -const WasmModuleWrapper = function() { - this._InitializeViewport = undefined; - this._LoadFromOrthanc = undefined; -}; - -WasmModuleWrapper.prototype.Setup = function(Module) { - this._InitializeViewport = Module.cwrap('InitializeViewport', null, [ 'string' ]); - this._LoadFromOrthanc = Module.cwrap('LoadFromOrthanc', null, [ 'string', 'int' ]); -}; - -WasmModuleWrapper.prototype.InitializeViewport = function(canvasId) { - this._InitializeViewport(canvasId); -}; - -WasmModuleWrapper.prototype.LoadFromOrthanc = function(instance, frame) { - this._LoadFromOrthanc(instance, frame); -}; - -var wasmModuleWrapper = new WasmModuleWrapper(); - -$(document).ready(function() { - - window.addEventListener('WasmModuleInitialized', function() { - wasmModuleWrapper.Setup(Module); - console.warn('Native C++ module initialized'); - - wasmModuleWrapper.InitializeViewport('viewport'); - }); - - window.addEventListener('StoneException', function() { - alert('Exception caught in C++ code'); - }); - - var scriptSource; - - if ('WebAssembly' in window) { - console.warn('Loading WebAssembly'); - scriptSource = 'SingleFrameViewerWasm.js'; - } else { - console.error('Your browser does not support WebAssembly!'); - } - - // Option 1: Loading script using plain HTML - - /* - var script = document.createElement('script'); - script.src = scriptSource; - script.type = 'text/javascript'; - document.body.appendChild(script); - */ - - // Option 2: Loading script using AJAX (gives the opportunity to - // report explicit errors) - - axios.get(scriptSource) - .then(function (response) { - var script = document.createElement('script'); - script.innerHTML = response.data; - script.type = 'text/javascript'; - document.body.appendChild(script); - }) - .catch(function (error) { - alert('Cannot load the WebAssembly framework'); - }); -}); - - -$('#orthancLoad').click(function() { - wasmModuleWrapper.LoadFromOrthanc($('#orthancInstance').val(), - $('#orthancFrame').val()); -}); diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h --- a/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,502 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include "../../../Framework/Loaders/DicomResourcesLoader.h" -#include "../../../Framework/Loaders/ILoadersContext.h" -#include "../../../Framework/Loaders/SeriesFramesLoader.h" -#include "../../../Framework/Loaders/SeriesThumbnailsLoader.h" -#include "../../../Framework/Viewport/IViewport.h" - -#include // For std::unique_ptr<> - -#include - - -namespace OrthancStone -{ - class Application : public ObserverBase - { - private: - ILoadersContext& context_; - boost::shared_ptr viewport_; - boost::shared_ptr dicomLoader_; - boost::shared_ptr framesLoader_; - - Application(ILoadersContext& context, - boost::shared_ptr viewport) : - context_(context), - viewport_(viewport) - { - } - - void Handle(const SeriesFramesLoader::FrameLoadedMessage& message) - { - LOG(INFO) << "Frame decoded! " - << message.GetImage().GetWidth() << "x" << message.GetImage().GetHeight() - << " " << Orthanc::EnumerationToString(message.GetImage().GetFormat()); - - std::unique_ptr layer( - message.GetInstanceParameters().CreateTexture(message.GetImage())); - layer->SetLinearInterpolation(true); - - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetController().GetScene().SetLayer(0, layer.release()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - } - - void Handle(const DicomResourcesLoader::SuccessMessage& message) - { - if (message.GetResources()->GetSize() != 1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - //message.GetResources()->GetResource(0).Print(stdout); - - { - std::unique_ptr lock(context_.Lock()); - SeriesFramesLoader::Factory f(*message.GetResources()); - - framesLoader_ = boost::dynamic_pointer_cast(f.Create(*lock)); - Register(*framesLoader_, &Application::Handle); - - assert(message.HasUserPayload()); - const Orthanc::SingleValueObject& payload = - dynamic_cast&>(message.GetUserPayload()); - - LOG(INFO) << "Loading pixel data of frame: " << payload.GetValue(); - framesLoader_->ScheduleLoadFrame( - 0, message.GetDicomSource(), payload.GetValue(), - message.GetDicomSource().GetQualityCount() - 1 /* download best quality available */, - NULL); - } - } - - public: - static boost::shared_ptr Create(ILoadersContext& context, - boost::shared_ptr viewport) - { - boost::shared_ptr application(new Application(context, viewport)); - - { - std::unique_ptr lock(context.Lock()); - application->dicomLoader_ = DicomResourcesLoader::Create(*lock); - } - - application->Register(*application->dicomLoader_, &Application::Handle); - - return application; - } - - void LoadOrthancFrame(const DicomSource& source, - const std::string& instanceId, - unsigned int frame) - { - std::unique_ptr lock(context_.Lock()); - - dicomLoader_->ScheduleLoadOrthancResource( - boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), - 0, source, Orthanc::ResourceType_Instance, instanceId, - new Orthanc::SingleValueObject(frame)); - } - - void LoadDicomWebFrame(const DicomSource& source, - const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - const std::string& sopInstanceUid, - unsigned int frame) - { - std::unique_ptr lock(context_.Lock()); - - // We first must load the "/metadata" to know the number of frames - dicomLoader_->ScheduleGetDicomWeb( - boost::make_shared(Orthanc::DICOM_TAG_SOP_INSTANCE_UID), 0, source, - "/studies/" + studyInstanceUid + "/series/" + seriesInstanceUid + "/instances/" + sopInstanceUid + "/metadata", - new Orthanc::SingleValueObject(frame)); - } - - void FitContent() - { - std::unique_ptr lock(viewport_->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - }; - - - - class IWebViewerLoadersObserver : public boost::noncopyable - { - public: - virtual ~IWebViewerLoadersObserver() - { - } - - virtual void SignalSeriesUpdated(LoadedDicomResources& series) = 0; - - virtual void SignalThumbnailLoaded(const std::string& studyInstanceUid, - const std::string& seriesInstanceUid, - SeriesThumbnailType type) = 0; - }; - - - class WebViewerLoaders : public ObserverBase - { - private: - static const int PRIORITY_ADD_RESOURCES = 0; - static const int PRIORITY_THUMBNAILS = OracleScheduler::PRIORITY_LOW + 100; - - enum Type - { - Type_Orthanc = 1, - Type_DicomWeb = 2 - }; - - ILoadersContext& context_; - std::unique_ptr observer_; - bool loadThumbnails_; - DicomSource source_; - std::set scheduledSeries_; - std::set scheduledThumbnails_; - std::set scheduledStudies_; - boost::shared_ptr loadedSeries_; - boost::shared_ptr loadedStudies_; - boost::shared_ptr resourcesLoader_; - boost::shared_ptr thumbnailsLoader_; - - WebViewerLoaders(ILoadersContext& context, - IWebViewerLoadersObserver* observer) : - context_(context), - observer_(observer), - loadThumbnails_(false) - { - loadedSeries_ = boost::make_shared(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); - loadedStudies_ = boost::make_shared(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID); - } - - static Orthanc::IDynamicObject* CreatePayload(Type type) - { - return new Orthanc::SingleValueObject(type); - } - - void HandleThumbnail(const SeriesThumbnailsLoader::SuccessMessage& message) - { - if (observer_.get() != NULL) - { - observer_->SignalThumbnailLoaded(message.GetStudyInstanceUid(), - message.GetSeriesInstanceUid(), - message.GetType()); - } - } - - void HandleLoadedResources(const DicomResourcesLoader::SuccessMessage& message) - { - LoadedDicomResources series(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID); - - switch (dynamic_cast&>(message.GetUserPayload()).GetValue()) - { - case Type_DicomWeb: - { - for (size_t i = 0; i < loadedSeries_->GetSize(); i++) - { - std::string study; - if (loadedSeries_->GetResource(i).LookupStringValue( - study, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && - loadedStudies_->HasResource(study)) - { - Orthanc::DicomMap m; - m.Assign(loadedSeries_->GetResource(i)); - loadedStudies_->MergeResource(m, study); - series.AddResource(m); - } - } - - break; - } - - case Type_Orthanc: - { - for (size_t i = 0; i < message.GetResources()->GetSize(); i++) - { - series.AddResource(message.GetResources()->GetResource(i)); - } - - break; - } - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - - if (loadThumbnails_ && - (!source_.IsDicomWeb() || - source_.HasDicomWebRendered())) - { - for (size_t i = 0; i < series.GetSize(); i++) - { - std::string patientId, studyInstanceUid, seriesInstanceUid; - if (series.GetResource(i).LookupStringValue(patientId, Orthanc::DICOM_TAG_PATIENT_ID, false) && - series.GetResource(i).LookupStringValue(studyInstanceUid, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) && - series.GetResource(i).LookupStringValue(seriesInstanceUid, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) && - scheduledThumbnails_.find(seriesInstanceUid) == scheduledThumbnails_.end()) - { - scheduledThumbnails_.insert(seriesInstanceUid); - thumbnailsLoader_->ScheduleLoadThumbnail(source_, patientId, studyInstanceUid, seriesInstanceUid); - } - } - } - - if (observer_.get() != NULL && - series.GetSize() > 0) - { - observer_->SignalSeriesUpdated(series); - } - } - - void HandleOrthancRestApi(const OrthancRestApiCommand::SuccessMessage& message) - { - Json::Value body; - message.ParseJsonBody(body); - - if (body.type() != Json::arrayValue) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - else - { - for (Json::Value::ArrayIndex i = 0; i < body.size(); i++) - { - if (body[i].type() == Json::stringValue) - { - AddOrthancSeries(body[i].asString()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol); - } - } - } - } - - public: - static boost::shared_ptr Create(ILoadersContext& context, - const DicomSource& source, - bool loadThumbnails, - IWebViewerLoadersObserver* observer) - { - boost::shared_ptr application(new WebViewerLoaders(context, observer)); - application->source_ = source; - application->loadThumbnails_ = loadThumbnails; - - { - std::unique_ptr lock(context.Lock()); - - application->resourcesLoader_ = DicomResourcesLoader::Create(*lock); - - { - SeriesThumbnailsLoader::Factory f; - f.SetPriority(PRIORITY_THUMBNAILS); - application->thumbnailsLoader_ = boost::dynamic_pointer_cast(f.Create(*lock)); - } - - application->Register( - lock->GetOracleObservable(), &WebViewerLoaders::HandleOrthancRestApi); - - application->Register( - *application->resourcesLoader_, &WebViewerLoaders::HandleLoadedResources); - - application->Register( - *application->thumbnailsLoader_, &WebViewerLoaders::HandleThumbnail); - - lock->AddLoader(application); - } - - return application; - } - - void AddDicomAllSeries() - { - std::unique_ptr lock(context_.Lock()); - - if (source_.IsDicomWeb()) - { - resourcesLoader_->ScheduleGetDicomWeb(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, - "/series", CreatePayload(Type_DicomWeb)); - resourcesLoader_->ScheduleGetDicomWeb(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, - "/studies", CreatePayload(Type_DicomWeb)); - } - else if (source_.IsOrthanc()) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetMethod(Orthanc::HttpMethod_Get); - command->SetUri("/series"); - lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - - void AddDicomStudy(const std::string& studyInstanceUid) - { - // Avoid adding twice the same study - if (scheduledStudies_.find(studyInstanceUid) == scheduledStudies_.end()) - { - scheduledStudies_.insert(studyInstanceUid); - - if (source_.IsDicomWeb()) - { - Orthanc::DicomMap filter; - filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); - - std::set tags; - - { - std::unique_ptr lock(context_.Lock()); - - resourcesLoader_->ScheduleQido(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, - Orthanc::ResourceType_Study, filter, tags, CreatePayload(Type_DicomWeb)); - - resourcesLoader_->ScheduleQido(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, - Orthanc::ResourceType_Series, filter, tags, CreatePayload(Type_DicomWeb)); - } - } - else if (source_.IsOrthanc()) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetMethod(Orthanc::HttpMethod_Post); - command->SetUri("/tools/find"); - - Json::Value body; - body["Level"] = "Series"; - body["Query"] = Json::objectValue; - body["Query"]["StudyInstanceUID"] = studyInstanceUid; - command->SetBody(body); - - { - std::unique_ptr lock(context_.Lock()); - lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); - } - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - void AddDicomSeries(const std::string& studyInstanceUid, - const std::string& seriesInstanceUid) - { - std::set tags; - - std::unique_ptr lock(context_.Lock()); - - if (scheduledStudies_.find(studyInstanceUid) == scheduledStudies_.end()) - { - scheduledStudies_.insert(studyInstanceUid); - - if (source_.IsDicomWeb()) - { - Orthanc::DicomMap filter; - filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); - - resourcesLoader_->ScheduleQido(loadedStudies_, PRIORITY_ADD_RESOURCES, source_, - Orthanc::ResourceType_Study, filter, tags, CreatePayload(Type_DicomWeb)); - } - } - - if (scheduledSeries_.find(seriesInstanceUid) == scheduledSeries_.end()) - { - scheduledSeries_.insert(seriesInstanceUid); - - if (source_.IsDicomWeb()) - { - Orthanc::DicomMap filter; - filter.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, studyInstanceUid, false); - filter.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, seriesInstanceUid, false); - - resourcesLoader_->ScheduleQido(loadedSeries_, PRIORITY_ADD_RESOURCES, source_, - Orthanc::ResourceType_Series, filter, tags, CreatePayload(Type_DicomWeb)); - } - else if (source_.IsOrthanc()) - { - std::unique_ptr command(new OrthancRestApiCommand); - command->SetMethod(Orthanc::HttpMethod_Post); - command->SetUri("/tools/find"); - - Json::Value body; - body["Level"] = "Series"; - body["Query"] = Json::objectValue; - body["Query"]["StudyInstanceUID"] = studyInstanceUid; - body["Query"]["SeriesInstanceUID"] = seriesInstanceUid; - command->SetBody(body); - - lock->Schedule(GetSharedObserver(), PRIORITY_ADD_RESOURCES, command.release()); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); - } - } - } - - void AddOrthancStudy(const std::string& orthancId) - { - if (source_.IsOrthanc()) - { - std::unique_ptr lock(context_.Lock()); - resourcesLoader_->ScheduleLoadOrthancResources( - loadedSeries_, PRIORITY_ADD_RESOURCES, source_, - Orthanc::ResourceType_Study, orthancId, Orthanc::ResourceType_Series, - CreatePayload(Type_Orthanc)); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, - "Only applicable to Orthanc DICOM sources"); - } - } - - void AddOrthancSeries(const std::string& orthancId) - { - if (source_.IsOrthanc()) - { - std::unique_ptr lock(context_.Lock()); - resourcesLoader_->ScheduleLoadOrthancResource( - loadedSeries_, PRIORITY_ADD_RESOURCES, - source_, Orthanc::ResourceType_Series, orthancId, - CreatePayload(Type_Orthanc)); - } - else - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadParameterType, - "Only applicable to Orthanc DICOM sources"); - } - } - }; -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/SingleFrameViewer/index.html --- a/Samples/WebAssembly/SingleFrameViewer/index.html Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ - - - - Stone of Orthanc Single Frame Viewer - - - - - - - - - - -

Viewport

- - - - -

Load from Orthanc

-

- Orthanc instance: -

-

- Frame number: -

-

- -

- - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/docker-build.sh --- a/Samples/WebAssembly/docker-build.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -#!/bin/bash - -set -ex - -IMAGE=jodogne/wasm-builder:1.39.17-upstream - -if [ "$1" != "Debug" -a "$1" != "Release" ]; then - echo "Please provide build type: Debug or Release" - exit -1 -fi - -if [ -t 1 ]; then - # TTY is available => use interactive mode - DOCKER_FLAGS='-i' -fi - -ROOT_DIR=`dirname $(readlink -f $0)`/../.. - -mkdir -p ${ROOT_DIR}/wasm-binaries - -docker run -t ${DOCKER_FLAGS} --rm \ - --user $(id -u):$(id -g) \ - -v ${ROOT_DIR}:/source:ro \ - -v ${ROOT_DIR}/wasm-binaries:/target:rw ${IMAGE} \ - bash /source/Samples/WebAssembly/docker-internal.sh $1 - -ls -lR ${ROOT_DIR}/wasm-binaries/ diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/WebAssembly/docker-internal.sh --- a/Samples/WebAssembly/docker-internal.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -#!/bin/bash -set -ex - -source /opt/emsdk/emsdk_env.sh - -# Use a folder that is writeable by non-root users for the Emscripten cache -export EM_CACHE=/tmp/emscripten-cache - -# Get the Orthanc framework -cd /tmp/ -hg clone https://hg.orthanc-server.com/orthanc/ - -# Make a copy of the read-only folder containing the source code into -# a writeable folder, because of "DownloadPackage.cmake" that writes -# to the "ThirdPartyDownloads" folder next to the "CMakeLists.txt" -cd /source -hg clone /source /tmp/source-writeable - -mkdir /tmp/build -cd /tmp/build - -cmake /tmp/source-writeable/Samples/WebAssembly \ - -DCMAKE_BUILD_TYPE=$1 \ - -DCMAKE_INSTALL_PREFIX=/target \ - -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \ - -DORTHANC_FRAMEWORK_ROOT=/tmp/orthanc/OrthancFramework \ - -DSTATIC_BUILD=ON \ - -G Ninja - -ninja -j2 install diff -r 9dfeee74c1e6 -r 244ad1e4e76a Samples/build-wasm-samples.sh --- a/Samples/build-wasm-samples.sh Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -#!/bin/bash -# -# usage: -# to build the samples in RelWithDebInfo: -# ./build-wasm-samples.sh -# -# to build the samples in Release: -# ./build-wasm-samples.sh Release - -set -e - -if [ ! -d "WebAssembly" ]; then - echo "This script must be run from the Samples folder one level below orthanc-stone" - exit 1 -fi - - -currentDir=$(pwd) -samplesRootDir=$(pwd) -devrootDir=$(pwd)/../../ - -buildType=${1:-RelWithDebInfo} -buildFolderName="$devrootDir/out/build-stone-wasm-samples-$buildType" -installFolderName="$devrootDir/out/install-stone-wasm-samples-$buildType" - -mkdir -p $buildFolderName -# change current folder to the build folder -pushd $buildFolderName - -# configure the environment to use Emscripten -source ~/apps/emsdk/emsdk_env.sh - -emcmake cmake -G "Ninja" \ - -DCMAKE_BUILD_TYPE=$buildType \ - -DCMAKE_INSTALL_PREFIX=$installFolderName \ - -DSTATIC_BUILD=ON -DALLOW_DOWNLOADS=ON \ - $samplesRootDir/WebAssembly - -# perform build + installation -ninja -ninja install - -# restore the original working folder -popd - -echo "If all went well, the output files can be found in $installFolderName:" - -ls $installFolderName \ No newline at end of file diff -r 9dfeee74c1e6 -r 244ad1e4e76a StoneWebViewer/Plugin/CMakeLists.txt --- a/StoneWebViewer/Plugin/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ b/StoneWebViewer/Plugin/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -32,7 +32,7 @@ # Download and setup the Orthanc framework -include(${CMAKE_SOURCE_DIR}/../../Resources/Orthanc/CMake/DownloadOrthancFramework.cmake) +include(${CMAKE_SOURCE_DIR}/../../OrthancStone/Resources/Orthanc/CMake/DownloadOrthancFramework.cmake) if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system") link_libraries(${ORTHANC_FRAMEWORK_LIBRARIES}) diff -r 9dfeee74c1e6 -r 244ad1e4e76a StoneWebViewer/WebAssembly/CMakeLists.txt --- a/StoneWebViewer/WebAssembly/CMakeLists.txt Tue Jul 07 10:02:59 2020 +0200 +++ b/StoneWebViewer/WebAssembly/CMakeLists.txt Tue Jul 07 16:21:02 2020 +0200 @@ -5,8 +5,6 @@ # Configuration of the Emscripten compiler for WebAssembly target # --------------------------------------------------------------- set(USE_WASM ON CACHE BOOL "") -set(ORTHANC_FRAMEWORK_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../orthanc/OrthancFramework CACHE PATH "") -set(STONE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../) set(EMSCRIPTEN_SET_LLVM_WASM_BACKEND ON CACHE BOOL "") @@ -30,11 +28,8 @@ # Stone of Orthanc configuration # --------------------------------------------------------------- set(ALLOW_DOWNLOADS ON) -set(ORTHANC_FRAMEWORK_SOURCE "path") -include(${STONE_ROOT}/Resources/CMake/OrthancStoneParameters.cmake) -include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/AutoGeneratedCode.cmake) -include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/DownloadPackage.cmake) +include(${CMAKE_SOURCE_DIR}/../../OrthancStone/Resources/CMake/OrthancStoneParameters.cmake) SET(ENABLE_DCMTK ON) SET(ENABLE_DCMTK_NETWORKING OFF) @@ -46,7 +41,7 @@ # this will set up the build system for Stone of Orthanc and will # populate the ORTHANC_STONE_SOURCES CMake variable -include(${STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) +include(${ORTHANC_STONE_ROOT}/Resources/CMake/OrthancStoneConfiguration.cmake) ################################################################################ diff -r 9dfeee74c1e6 -r 244ad1e4e76a StoneWebViewer/WebAssembly/Test.cpp --- a/StoneWebViewer/WebAssembly/Test.cpp Tue Jul 07 10:02:59 2020 +0200 +++ b/StoneWebViewer/WebAssembly/Test.cpp Tue Jul 07 16:21:02 2020 +0200 @@ -61,20 +61,20 @@ #include #include -#include "../../Framework/Loaders/DicomResourcesLoader.h" -#include "../../Framework/Loaders/SeriesMetadataLoader.h" -#include "../../Framework/Loaders/SeriesThumbnailsLoader.h" -#include "../../Framework/Loaders/WebAssemblyLoadersContext.h" -#include "../../Framework/Messages/ObserverBase.h" -#include "../../Framework/Oracle/ParseDicomFromWadoCommand.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/FloatTextureSceneLayer.h" -#include "../../Framework/Scene2D/PolylineSceneLayer.h" -#include "../../Framework/StoneException.h" -#include "../../Framework/Toolbox/DicomInstanceParameters.h" -#include "../../Framework/Toolbox/GeometryToolbox.h" -#include "../../Framework/Toolbox/SortedFrames.h" -#include "../../Framework/Viewport/WebGLViewport.h" +#include "../../OrthancStone/Sources/Loaders/DicomResourcesLoader.h" +#include "../../OrthancStone/Sources/Loaders/SeriesMetadataLoader.h" +#include "../../OrthancStone/Sources/Loaders/SeriesThumbnailsLoader.h" +#include "../../OrthancStone/Sources/Loaders/WebAssemblyLoadersContext.h" +#include "../../OrthancStone/Sources/Messages/ObserverBase.h" +#include "../../OrthancStone/Sources/Oracle/ParseDicomFromWadoCommand.h" +#include "../../OrthancStone/Sources/Scene2D/ColorTextureSceneLayer.h" +#include "../../OrthancStone/Sources/Scene2D/FloatTextureSceneLayer.h" +#include "../../OrthancStone/Sources/Scene2D/PolylineSceneLayer.h" +#include "../../OrthancStone/Sources/StoneException.h" +#include "../../OrthancStone/Sources/Toolbox/DicomInstanceParameters.h" +#include "../../OrthancStone/Sources/Toolbox/GeometryToolbox.h" +#include "../../OrthancStone/Sources/Toolbox/SortedFrames.h" +#include "../../OrthancStone/Sources/Viewport/WebGLViewport.h" #include #include diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json --- a/UnitTestsSources/72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45721 +0,0 @@ -{ - "0008,0005" : { - "Name" : "SpecificCharacterSet", - "Type" : "String", - "Value" : "ISO_IR 100" - }, - "0008,0012" : { - "Name" : "InstanceCreationDate", - "Type" : "String", - "Value" : "20180624" - }, - "0008,0013" : { - "Name" : "InstanceCreationTime", - "Type" : "String", - "Value" : "134156" - }, - "0008,0016" : { - "Name" : "SOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.481.3" - }, - "0008,0018" : { - "Name" : "SOPInstanceUID", - "Type" : "String", - "Value" : "1.2.752.243.1.1.20180802070448020.2000.14574" - }, - "0008,0020" : { - "Name" : "StudyDate", - "Type" : "String", - "Value" : "20180624" - }, - "0008,0021" : { - "Name" : "SeriesDate", - "Type" : "String", - "Value" : "20180624" - }, - "0008,0030" : { - "Name" : "StudyTime", - "Type" : "String", - "Value" : "120802" - }, - "0008,0031" : { - "Name" : "SeriesTime", - "Type" : "String", - "Value" : "134156" - }, - "0008,0050" : { - "Name" : "AccessionNumber", - "Type" : "String", - "Value" : "" - }, - "0008,0060" : { - "Name" : "Modality", - "Type" : "String", - "Value" : "RTSTRUCT" - }, - "0008,0070" : { - "Name" : "Manufacturer", - "Type" : "String", - "Value" : "RaySearch Laboratories" - }, - "0008,0090" : { - "Name" : "ReferringPhysicianName", - "Type" : "String", - "Value" : "" - }, - "0008,1030" : { - "Name" : "StudyDescription", - "Type" : "String", - "Value" : "RT^PCPT_120_KVP (Adult)" - }, - "0008,103e" : { - "Name" : "SeriesDescription", - "Type" : "String", - "Value" : "RS: Approved Structure Set" - }, - "0008,1070" : { - "Name" : "OperatorsName", - "Type" : "String", - "Value" : "" - }, - "0008,1090" : { - "Name" : "ManufacturerModelName", - "Type" : "String", - "Value" : "RayStation" - }, - "0010,0010" : { - "Name" : "PatientName", - "Type" : "String", - "Value" : "Provision^Phantom^QA" - }, - "0010,0020" : { - "Name" : "PatientID", - "Type" : "String", - "Value" : "04041982" - }, - "0010,0030" : { - "Name" : "PatientBirthDate", - "Type" : "String", - "Value" : "19820404" - }, - "0010,0040" : { - "Name" : "PatientSex", - "Type" : "String", - "Value" : "O" - }, - "0018,1020" : { - "Name" : "SoftwareVersions", - "Type" : "String", - "Value" : "8.0.1.6 (Dicom Export)" - }, - "0020,000d" : { - "Name" : "StudyInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412504788800000016" - }, - "0020,000e" : { - "Name" : "SeriesInstanceUID", - "Type" : "String", - "Value" : "1.2.752.243.1.1.20180802070448020.2000.14574.1" - }, - "0020,0010" : { - "Name" : "StudyID", - "Type" : "String", - "Value" : "1" - }, - "0020,0011" : { - "Name" : "SeriesNumber", - "Type" : "String", - "Value" : "1" - }, - "0020,0013" : { - "Name" : "InstanceNumber", - "Type" : "String", - "Value" : "1" - }, - "0020,0052" : { - "Name" : "FrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "0020,1040" : { - "Name" : "PositionReferenceIndicator", - "Type" : "String", - "Value" : "" - }, - "3006,0002" : { - "Name" : "StructureSetLabel", - "Type" : "String", - "Value" : "RS: Approved" - }, - "3006,0008" : { - "Name" : "StructureSetDate", - "Type" : "String", - "Value" : "20180624" - }, - "3006,0009" : { - "Name" : "StructureSetTime", - "Type" : "String", - "Value" : "134156" - }, - "3006,0010" : { - "Name" : "ReferencedFrameOfReferenceSequence", - "Type" : "Sequence", - "Value" : [ - { - "0020,0052" : { - "Name" : "FrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0012" : { - "Name" : "RTReferencedStudySequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.3.1.2.3.1" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412504788800000016" - }, - "3006,0014" : { - "Name" : "RTReferencedSeriesSequence", - "Type" : "Sequence", - "Value" : [ - { - "0020,000e" : { - "Name" : "SeriesInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002193" - }, - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002194" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002195" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002198" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002199" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002388" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002389" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002390" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002391" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002392" - } - }, - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002393" - } - } - ] - } - } - ] - } - } - ] - } - } - ] - }, - "3006,0020" : { - "Name" : "StructureSetROISequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "External" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "CTV" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "PTV" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "PTV Eval" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "Bladder" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "Rectum" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "Air Override" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "CT Isocenter" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - }, - { - "3006,0022" : { - "Name" : "ROINumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0024" : { - "Name" : "ReferencedFrameOfReferenceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412505492400000036" - }, - "3006,0026" : { - "Name" : "ROIName", - "Type" : "String", - "Value" : "Isocenter" - }, - "3006,0036" : { - "Name" : "ROIGenerationAlgorithm", - "Type" : "String", - "Value" : "SEMIAUTOMATIC" - } - } - ] - }, - "3006,0039" : { - "Name" : "ROIContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "0\\128\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002389" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "143" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-131.8359\\-272.7055\\-175\\-133.9264\\-270.5703\\-175\\-135.7422\\-268.5421\\-175\\-136.3525\\-266.6641\\-175\\-137.6953\\-265.4705\\-175\\-138.3168\\-264.7109\\-175\\-139.6484\\-263.4482\\-175\\-140.0744\\-262.7578\\-175\\-141.6016\\-259.7253\\-175\\-141.7969\\-258.8516\\-175\\-142.9287\\-256.8984\\-175\\-143.5547\\-256.1355\\-175\\-144.0694\\-254.9453\\-175\\-145.5078\\-253.7626\\-175\\-146.1325\\-252.9922\\-175\\-146.5718\\-251.0391\\-175\\-147.4609\\-249.871\\-175\\-148.7116\\-247.1328\\-175\\-149.2784\\-245.1797\\-175\\-149.954\\-243.2266\\-175\\-150.7428\\-241.2734\\-175\\-151.3672\\-240.705\\-175\\-152.203\\-239.3203\\-175\\-152.3438\\-237.3672\\-175\\-153.5667\\-235.4141\\-175\\-154.2728\\-231.5078\\-175\\-155.474\\-229.5547\\-175\\-155.6019\\-227.6016\\-175\\-156.6483\\-225.6484\\-175\\-156.9864\\-223.6953\\-175\\-157.1378\\-221.7422\\-175\\-158.2475\\-219.7891\\-175\\-158.3921\\-217.8359\\-175\\-159.6641\\-215.8828\\-175\\-160.0241\\-213.9297\\-175\\-160.1245\\-211.9766\\-175\\-160.1991\\-208.0703\\-175\\-160.4293\\-206.1172\\-175\\-161.4816\\-204.1641\\-175\\-161.4872\\-198.3047\\-175\\-160.4368\\-196.3516\\-175\\-160.2162\\-194.3984\\-175\\-160.1482\\-190.4922\\-175\\-160.0519\\-188.5391\\-175\\-159.6563\\-186.5859\\-175\\-158.4045\\-184.6328\\-175\\-158.1949\\-182.6797\\-175\\-157.0475\\-180.7266\\-175\\-156.6305\\-178.7734\\-175\\-155.7304\\-176.8203\\-175\\-154.1251\\-174.8672\\-175\\-153.5573\\-172.9141\\-175\\-151.3672\\-169.6098\\-175\\-149.4141\\-167.5505\\-175\\-146.9809\\-165.1016\\-175\\-146.1733\\-163.1484\\-175\\-145.5078\\-162.439\\-175\\-143.5547\\-160.7921\\-175\\-141.6016\\-159.9223\\-175\\-138.7921\\-157.2891\\-175\\-137.6953\\-156.5387\\-175\\-135.7422\\-155.4173\\-175\\-133.7891\\-153.8933\\-175\\-132.6069\\-153.3828\\-175\\-131.8359\\-153.2125\\-175\\-129.5856\\-151.4297\\-175\\-127.9297\\-150.8933\\-175\\-125.9766\\-149.1409\\-175\\-124.0234\\-148.9303\\-175\\-122.0703\\-147.9629\\-175\\-121.4844\\-147.5234\\-175\\-120.1172\\-147.1133\\-175\\-118.1641\\-147.0926\\-175\\-116.2109\\-146.791\\-175\\-114.7461\\-145.5703\\-175\\-114.1657\\-145.5703\\-175\\-114.2383\\-149.4766\\-175\\-116.0199\\-151.4297\\-175\\-116.0623\\-155.3359\\-175\\-117.8894\\-157.2891\\-175\\-117.9436\\-161.1953\\-175\\-118.1641\\-161.651\\-175\\-119.4119\\-163.1484\\-175\\-119.3704\\-165.1016\\-175\\-119.5204\\-167.0547\\-175\\-119.5204\\-169.0078\\-175\\-119.6899\\-170.9609\\-175\\-120.1172\\-171.1681\\-175\\-122.0703\\-171.4492\\-175\\-123.4809\\-172.9141\\-175\\-125.2219\\-174.8672\\-175\\-125.2848\\-178.7734\\-175\\-125.8681\\-180.7266\\-175\\-125.9766\\-181.7031\\-175\\-126.9531\\-182.6797\\-175\\-127.9297\\-182.7988\\-175\\-129.4643\\-184.6328\\-175\\-128.479\\-186.5859\\-175\\-127.9297\\-187.3184\\-175\\-125.9766\\-187.7456\\-175\\-125.4688\\-188.5391\\-175\\-126.0851\\-190.4922\\-175\\-126.0986\\-192.4453\\-175\\-126.3428\\-194.3984\\-175\\-127.727\\-196.3516\\-175\\-127.7956\\-202.2109\\-175\\-127.9297\\-202.6131\\-175\\-129.1282\\-204.1641\\-175\\-128.8365\\-206.1172\\-175\\-129.5876\\-208.0703\\-175\\-129.5573\\-211.9766\\-175\\-129.6237\\-213.9297\\-175\\-129.8828\\-214.3999\\-175\\-131.2175\\-215.8828\\-175\\-130.5589\\-217.8359\\-175\\-129.8828\\-218.5684\\-175\\-129.5499\\-219.7891\\-175\\-129.5499\\-221.7422\\-175\\-129.2969\\-223.6953\\-175\\-127.9297\\-225.3229\\-175\\-127.7982\\-225.6484\\-175\\-127.8711\\-227.6016\\-175\\-129.5499\\-229.5547\\-175\\-129.5876\\-235.4141\\-175\\-129.8828\\-236.3209\\-175\\-130.6966\\-237.3672\\-175\\-129.8096\\-239.3203\\-175\\-129.8828\\-241.599\\-175\\-130.7983\\-243.2266\\-175\\-131.1701\\-245.1797\\-175\\-131.4228\\-247.1328\\-175\\-131.1678\\-249.0859\\-175\\-131.2012\\-251.0391\\-175\\-131.8359\\-252.4496\\-175\\-132.2428\\-252.9922\\-175\\-132.512\\-254.9453\\-175\\-132.7428\\-258.8516\\-175\\-132.7428\\-264.7109\\-175\\-132.8125\\-266.6641\\-175\\-133.3365\\-268.6172\\-175\\-132.9102\\-270.5703\\-175\\-131.8359\\-271.5469\\-175\\-131.4523\\-272.5234\\-175" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002388" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "208" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-302.0705\\-173\\-83.00781\\-300.9754\\-173\\-86.91406\\-300.8166\\-173\\-88.86719\\-300.521\\-173\\-90.82031\\-299.9072\\-173\\-92.77344\\-299.5658\\-173\\-94.72656\\-299.0435\\-173\\-96.67969\\-298.3087\\-173\\-98.37431\\-297.9141\\-173\\-100.5859\\-296.6277\\-173\\-102.5391\\-296.1421\\-173\\-104.4922\\-295.0589\\-173\\-106.4453\\-294.7641\\-173\\-108.3984\\-293.6721\\-173\\-110.3516\\-292.811\\-173\\-112.3047\\-290.9783\\-173\\-114.2578\\-290.5478\\-173\\-116.2109\\-289.0671\\-173\\-118.119\\-288.1484\\-173\\-120.1172\\-286.5138\\-173\\-122.0703\\-285.335\\-173\\-124.0234\\-283.4826\\-173\\-127.9297\\-279.9471\\-173\\-131.1599\\-276.4297\\-173\\-133.7891\\-273.7756\\-173\\-136.4906\\-270.5703\\-173\\-138.0115\\-268.6172\\-173\\-139.1138\\-266.6641\\-173\\-140.7258\\-264.7109\\-173\\-142.0506\\-262.7578\\-173\\-142.9807\\-260.8047\\-173\\-144.1303\\-258.8516\\-173\\-145.1157\\-256.8984\\-173\\-145.5078\\-256.391\\-173\\-147.749\\-252.9922\\-173\\-148.4946\\-251.0391\\-173\\-150.2841\\-247.1328\\-173\\-150.9292\\-245.1797\\-173\\-152.0162\\-243.2266\\-173\\-152.7\\-241.2734\\-173\\-153.8602\\-239.3203\\-173\\-154.3324\\-237.3672\\-173\\-155.7617\\-233.4609\\-173\\-156.1929\\-231.5078\\-173\\-156.7742\\-229.5547\\-173\\-158.1292\\-225.6484\\-173\\-159.0056\\-221.7422\\-173\\-159.938\\-219.7891\\-173\\-160.2966\\-217.8359\\-173\\-161.4349\\-213.9297\\-173\\-161.7352\\-211.9766\\-173\\-162.1708\\-206.1172\\-173\\-162.366\\-204.1641\\-173\\-162.4242\\-202.2109\\-173\\-162.4157\\-198.3047\\-173\\-162.2089\\-196.3516\\-173\\-161.8108\\-190.4922\\-173\\-161.5221\\-188.5391\\-173\\-160.2804\\-184.6328\\-173\\-159.8476\\-182.6797\\-173\\-158.7508\\-180.7266\\-173\\-158.17\\-178.7734\\-173\\-157.2947\\-176.8203\\-173\\-156.1256\\-174.8672\\-173\\-155.2734\\-172.9282\\-173\\-154.1372\\-170.9609\\-173\\-151.3672\\-167.5165\\-173\\-149.198\\-165.1016\\-173\\-147.8591\\-163.1484\\-173\\-145.5078\\-160.7521\\-173\\-143.5547\\-159.118\\-173\\-141.6016\\-157.7076\\-173\\-141.1865\\-157.2891\\-173\\-137.6953\\-154.4925\\-173\\-131.8359\\-150.8857\\-173\\-129.7182\\-149.4766\\-173\\-127.9297\\-148.4627\\-173\\-125.9766\\-147.2246\\-173\\-124.0234\\-146.5265\\-173\\-120.1172\\-144.7879\\-173\\-118.1641\\-144.224\\-173\\-116.2109\\-143.181\\-173\\-114.2578\\-142.5557\\-173\\-110.3516\\-141.6247\\-173\\-108.3984\\-140.7968\\-173\\-106.4453\\-140.3998\\-173\\-104.4922\\-140.1908\\-173\\-102.5391\\-139.2664\\-173\\-98.63281\\-138.5217\\-173\\-96.67969\\-137.4128\\-173\\-92.77344\\-136.9472\\-173\\-90.82031\\-135.9013\\-173\\-88.86719\\-135.5287\\-173\\-86.91406\\-135.4302\\-173\\-84.96094\\-134.9024\\-173\\-83.00781\\-134.6305\\-173\\-81.05469\\-134.5352\\-173\\-77.14844\\-133.1644\\-173\\-73.24219\\-132.9727\\-173\\-69.33594\\-132.9144\\-173\\-63.47656\\-132.9329\\-173\\-59.57031\\-133.0063\\-173\\-53.71094\\-133.2785\\-173\\-51.58944\\-133.8516\\-173\\-49.80469\\-134.5417\\-173\\-47.85156\\-134.7486\\-173\\-44.04634\\-135.8047\\-173\\-41.99219\\-136.651\\-173\\-39.58038\\-137.7578\\-173\\-38.08594\\-138.9907\\-173\\-36.13281\\-139.503\\-173\\-34.17969\\-141.2263\\-173\\-33.33333\\-141.6641\\-173\\-32.22656\\-142.5228\\-173\\-30.27344\\-143.5539\\-173\\-28.28664\\-145.5703\\-173\\-27.00893\\-147.5234\\-173\\-26.36719\\-149.1278\\-173\\-25.39063\\-149.4766\\-173\\-24.41406\\-151.1042\\-173\\-24.2513\\-153.3828\\-173\\-24.41406\\-153.8711\\-173\\-25.39063\\-155.3359\\-173\\-25.8789\\-157.2891\\-173\\-25.8789\\-159.2422\\-173\\-26.85547\\-161.1953\\-173\\-27.34375\\-163.1484\\-173\\-26.85547\\-165.1016\\-173\\-28.32031\\-166.5664\\-173\\-29.29687\\-167.0547\\-173\\-30.27344\\-168.0313\\-173\\-30.76172\\-169.0078\\-173\\-31.25\\-170.9609\\-173\\-32.22656\\-171.4492\\-173\\-33.69141\\-172.9141\\-173\\-34.50521\\-174.8672\\-173\\-35.64453\\-176.8203\\-173\\-35.64453\\-178.7734\\-173\\-35.80729\\-180.7266\\-173\\-36.13281\\-181.2148\\-173\\-37.59766\\-182.6797\\-173\\-37.76041\\-184.6328\\-173\\-38.57422\\-186.5859\\-173\\-38.57422\\-188.5391\\-173\\-40.03906\\-191.4688\\-173\\-41.01563\\-194.3984\\-173\\-41.50391\\-196.3516\\-173\\-42.31771\\-198.3047\\-173\\-42.72461\\-200.2578\\-173\\-42.48047\\-202.2109\\-173\\-43.45703\\-204.1641\\-173\\-43.75\\-206.1172\\-173\\-43.70117\\-208.0703\\-173\\-44.18945\\-210.0234\\-173\\-44.27083\\-213.9297\\-173\\-44.92188\\-215.8828\\-173\\-44.43359\\-217.8359\\-173\\-44.43359\\-219.7891\\-173\\-44.92188\\-221.7422\\-173\\-44.92188\\-223.6953\\-173\\-44.43359\\-225.6484\\-173\\-44.92187\\-227.6016\\-173\\-44.92187\\-229.5547\\-173\\-45.89844\\-230.5313\\-173\\-46.22396\\-231.5078\\-173\\-46.22396\\-233.4609\\-173\\-46.38672\\-235.4141\\-173\\-46.38672\\-237.3672\\-173\\-47.36328\\-241.2734\\-173\\-47.36328\\-243.2266\\-173\\-49.31641\\-245.1797\\-173\\-49.07227\\-247.1328\\-173\\-49.47916\\-249.0859\\-173\\-49.31641\\-251.0391\\-173\\-49.47916\\-252.9922\\-173\\-49.80469\\-253.9688\\-173\\-50.78125\\-254.9453\\-173\\-50.78125\\-256.8984\\-173\\-51.75781\\-257.875\\-173\\-52.08333\\-258.8516\\-173\\-52.24609\\-260.8047\\-173\\-51.26953\\-262.7578\\-173\\-51.43229\\-264.7109\\-173\\-52.24609\\-266.6641\\-173\\-51.43229\\-268.6172\\-173\\-51.26953\\-270.5703\\-173\\-50.29297\\-274.4766\\-173\\-50.29297\\-280.3359\\-173\\-49.80469\\-281.3125\\-173\\-49.56055\\-282.2891\\-173\\-49.80469\\-283.2656\\-173\\-50.29297\\-284.2422\\-173\\-49.31641\\-286.1953\\-173\\-50.29297\\-288.1484\\-173\\-50.29297\\-292.0547\\-173\\-49.31641\\-294.0078\\-173\\-49.47917\\-295.9609\\-173\\-49.80469\\-296.0011\\-173\\-51.75781\\-297.9933\\-173\\-53.71094\\-298.1582\\-173\\-55.05371\\-299.8672\\-173\\-55.66406\\-300.2428\\-173\\-59.57031\\-300.5762\\-173\\-61.52344\\-301.8472\\-173\\-63.47656\\-302.0208\\-173\\-67.38281\\-302.1855\\-173\\-73.24219\\-302.2627\\-173\\-77.14844\\-302.2606\\-173" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "174" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-302.0081\\-171\\-88.86719\\-301.4367\\-171\\-92.77344\\-300.6752\\-171\\-94.72656\\-300.1905\\-171\\-96.67969\\-299.3295\\-171\\-98.63281\\-298.7279\\-171\\-102.5391\\-297.0441\\-171\\-104.4922\\-296.4428\\-171\\-106.4453\\-295.4397\\-171\\-108.3984\\-294.8102\\-171\\-112.3047\\-292.7268\\-171\\-114.2578\\-291.4096\\-171\\-116.2109\\-290.3423\\-171\\-118.1641\\-289.0867\\-171\\-120.1172\\-287.6334\\-171\\-122.0703\\-286.3098\\-171\\-124.3734\\-284.2422\\-171\\-127.9297\\-281.1463\\-171\\-129.8828\\-279.1208\\-171\\-134.1316\\-274.4766\\-171\\-135.4813\\-272.5234\\-171\\-140.0099\\-266.6641\\-171\\-141.1802\\-264.7109\\-171\\-142.4703\\-262.7578\\-171\\-144.6404\\-258.8516\\-171\\-145.967\\-256.8984\\-171\\-146.9277\\-254.9453\\-171\\-148.1223\\-252.9922\\-171\\-148.8627\\-251.0391\\-171\\-149.9157\\-249.0859\\-171\\-150.5687\\-247.1328\\-171\\-151.6568\\-245.1797\\-171\\-152.427\\-243.2266\\-171\\-153.4296\\-241.2734\\-171\\-154.184\\-239.3203\\-171\\-154.7985\\-237.3672\\-171\\-155.6626\\-235.4141\\-171\\-156.6319\\-231.5078\\-171\\-157.474\\-229.5547\\-171\\-158.5458\\-225.6484\\-171\\-159.3541\\-223.6953\\-171\\-159.9174\\-221.7422\\-171\\-160.3237\\-219.7891\\-171\\-160.8627\\-217.8359\\-171\\-161.5167\\-215.8828\\-171\\-161.8713\\-213.9297\\-171\\-162.1034\\-211.9766\\-171\\-162.6244\\-206.1172\\-171\\-162.9118\\-202.2109\\-171\\-162.9118\\-198.3047\\-171\\-162.7652\\-196.3516\\-171\\-162.17\\-190.4922\\-171\\-161.9274\\-188.5391\\-171\\-161.5646\\-186.5859\\-171\\-160.8329\\-184.6328\\-171\\-159.6591\\-180.7266\\-171\\-158.6172\\-178.7734\\-171\\-157.8757\\-176.8203\\-171\\-156.6885\\-174.8672\\-171\\-155.8687\\-172.9141\\-171\\-153.3203\\-169.1163\\-171\\-151.3672\\-166.558\\-171\\-148.4169\\-163.1484\\-171\\-146.5129\\-161.1953\\-171\\-142.2288\\-157.2891\\-171\\-139.6484\\-155.2266\\-171\\-135.7422\\-152.569\\-171\\-133.7891\\-151.3195\\-171\\-131.8359\\-150.2282\\-171\\-129.8828\\-148.8443\\-171\\-127.9297\\-147.8585\\-171\\-125.9766\\-146.7584\\-171\\-124.0234\\-146.0825\\-171\\-122.0703\\-145.044\\-171\\-120.1172\\-144.4328\\-171\\-118.1641\\-143.4942\\-171\\-114.2578\\-142.026\\-171\\-112.3047\\-141.1727\\-171\\-108.3984\\-140.1858\\-171\\-106.4453\\-139.4144\\-171\\-104.4922\\-138.919\\-171\\-102.5391\\-138.5402\\-171\\-100.5859\\-137.9576\\-171\\-98.63281\\-137.1797\\-171\\-94.72656\\-136.2451\\-171\\-92.77344\\-135.4857\\-171\\-86.91406\\-134.1339\\-171\\-84.96094\\-133.632\\-171\\-81.05469\\-133.0043\\-171\\-77.14844\\-132.5393\\-171\\-71.28906\\-131.5794\\-171\\-69.33594\\-131.4399\\-171\\-65.42969\\-131.3038\\-171\\-61.52344\\-131.3704\\-171\\-59.57031\\-131.5166\\-171\\-57.61719\\-131.762\\-171\\-53.71094\\-132.4681\\-171\\-49.80469\\-132.9677\\-171\\-47.85156\\-133.3135\\-171\\-43.94531\\-134.7256\\-171\\-41.99219\\-135.2492\\-171\\-38.08594\\-137.0089\\-171\\-34.17969\\-139.2227\\-171\\-28.32031\\-143.4777\\-171\\-24.41406\\-147.0985\\-171\\-22.13762\\-149.4766\\-171\\-21.32469\\-151.4297\\-171\\-19.71436\\-153.3828\\-171\\-19.11169\\-155.3359\\-171\\-18.55469\\-155.9842\\-171\\-17.73649\\-157.2891\\-171\\-17.04821\\-159.2422\\-171\\-15.88611\\-161.1953\\-171\\-15.60925\\-163.1484\\-171\\-14.41825\\-165.1016\\-171\\-14.16949\\-167.0547\\-171\\-13.58247\\-169.0078\\-171\\-13.12663\\-172.9141\\-171\\-12.93721\\-176.8203\\-171\\-12.28376\\-178.7734\\-171\\-11.83297\\-180.7266\\-171\\-11.63358\\-184.6328\\-171\\-11.54175\\-188.5391\\-171\\-10.23392\\-190.4922\\-171\\-10.01862\\-194.3984\\-171\\-9.942289\\-200.2578\\-171\\-9.994507\\-206.1172\\-171\\-9.978141\\-211.9766\\-171\\-10.04093\\-215.8828\\-171\\-10.25102\\-223.6953\\-171\\-10.36516\\-225.6484\\-171\\-11.58531\\-227.6016\\-171\\-11.71875\\-233.4609\\-171\\-11.95098\\-237.3672\\-171\\-12.76507\\-239.3203\\-171\\-13.31329\\-243.2266\\-171\\-13.95723\\-245.1797\\-171\\-14.32729\\-249.0859\\-171\\-15.46224\\-251.0391\\-171\\-15.74468\\-252.9922\\-171\\-16.29144\\-254.9453\\-171\\-17.56779\\-256.8984\\-171\\-17.6883\\-258.8516\\-171\\-18.55469\\-260.2833\\-171\\-19.03161\\-260.8047\\-171\\-19.64052\\-262.7578\\-171\\-20.66443\\-266.6641\\-171\\-21.74549\\-268.6172\\-171\\-23.18869\\-270.5703\\-171\\-23.6969\\-272.5234\\-171\\-25.23942\\-274.4766\\-171\\-25.96933\\-276.4297\\-171\\-27.52183\\-278.3828\\-171\\-28.34932\\-280.3359\\-171\\-32.22656\\-284.4049\\-171\\-33.66341\\-286.1953\\-171\\-34.9985\\-288.1484\\-171\\-37.0666\\-290.1016\\-171\\-39.61955\\-292.0547\\-171\\-41.99219\\-294.3489\\-171\\-43.94531\\-295.4144\\-171\\-45.89844\\-296.5841\\-171\\-47.85156\\-298.2568\\-171\\-49.80469\\-298.9216\\-171\\-51.75781\\-300.2641\\-171\\-53.71094\\-300.8955\\-171\\-57.61719\\-302.3018\\-171\\-61.52344\\-302.8631\\-171\\-67.38281\\-303.4177\\-171\\-69.33594\\-303.5293\\-171\\-71.28906\\-303.5311\\-171\\-75.19531\\-303.3842\\-171\\-83.00781\\-302.638\\-171\\-84.96094\\-302.3959\\-171" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002387" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "55.37684\\-297.9141\\-171\\53.71094\\-296.4235\\-171\\51.75781\\-296.1394\\-171\\51.41195\\-295.9609\\-171\\49.80469\\-294.418\\-171\\47.85156\\-294.2967\\-171\\45.89844\\-292.55\\-171\\43.94531\\-292.3643\\-171\\41.58266\\-290.1016\\-171\\40.03906\\-288.3926\\-171\\38.08594\\-286.6785\\-171\\36.13281\\-286.3474\\-171\\35.97819\\-286.1953\\-171\\35.52698\\-284.2422\\-171\\34.17969\\-282.7574\\-171\\32.22656\\-280.9361\\-171\\31.70277\\-280.3359\\-171\\30.27344\\-279.0781\\-171\\29.68618\\-278.3828\\-171\\29.26358\\-276.4297\\-171\\27.32077\\-274.4766\\-171\\26.66364\\-272.5234\\-171\\25.05208\\-270.5703\\-171\\24.41406\\-269.9568\\-171\\22.46094\\-267.4087\\-171\\21.25822\\-264.7109\\-171\\19.81141\\-260.8047\\-171\\19.42568\\-258.8516\\-171\\18.55469\\-256.8197\\-171\\17.85881\\-254.9453\\-171\\17.71851\\-252.9922\\-171\\16.18481\\-251.0391\\-171\\15.88579\\-249.0859\\-171\\14.97774\\-247.1328\\-171\\14.64844\\-246.1214\\-171\\14.03439\\-243.2266\\-171\\13.54774\\-241.2734\\-171\\13.36785\\-239.3203\\-171\\13.18359\\-233.4609\\-171\\12.69531\\-232.9541\\-171\\11.95817\\-231.5078\\-171\\11.86996\\-229.5547\\-171\\11.98572\\-227.6016\\-171\\11.73855\\-223.6953\\-171\\11.73222\\-221.7422\\-171\\10.54275\\-219.7891\\-171\\11.24108\\-217.8359\\-171\\10.74219\\-217.1895\\-171\\10.20281\\-215.8828\\-171\\10.11827\\-213.9297\\-171\\10.03339\\-208.0703\\-171\\10.04012\\-204.1641\\-171\\9.984334\\-196.3516\\-171\\10.07876\\-188.5391\\-171\\10.25391\\-182.6797\\-171\\11.71875\\-180.7266\\-171\\11.9598\\-172.9141\\-171\\13.23379\\-169.0078\\-171\\13.70216\\-167.0547\\-171\\14.64844\\-163.7909\\-171\\14.91672\\-163.1484\\-171\\16.60156\\-160.0878\\-171\\17.23189\\-159.2422\\-171\\18.01568\\-157.2891\\-171\\19.539\\-155.3359\\-171\\20.50781\\-153.5921\\-171\\21.89556\\-151.4297\\-171\\22.46094\\-150.9216\\-171\\24.41406\\-148.6911\\-171\\25.73482\\-147.5234\\-171\\28.32031\\-145.0642\\-171\\30.27344\\-144.5057\\-171\\32.22656\\-142.5121\\-171\\34.17969\\-140.8306\\-171\\36.13281\\-140.0894\\-171\\36.58466\\-139.7109\\-171\\40.03906\\-137.8083\\-171\\41.99219\\-138.7804\\-171\\43.94531\\-136.887\\-171\\45.89844\\-136.667\\-171\\47.85156\\-135.5117\\-171\\49.80469\\-135.3234\\-171\\51.75781\\-135.3634\\-171\\53.71094\\-134.7305\\-171\\55.66406\\-134.292\\-171\\57.61719\\-134.3295\\-171\\61.52344\\-134.5946\\-171\\63.47656\\-134.2955\\-171\\63.96484\\-133.8516\\-171\\65.42969\\-133.3406\\-171\\67.38281\\-133.4035\\-171\\68.24841\\-133.8516\\-171\\69.33594\\-134.9391\\-171\\71.28906\\-135.0885\\-171\\75.19531\\-135.6199\\-171\\77.63672\\-135.8047\\-171\\78.125\\-137.7578\\-171\\79.10156\\-138.7344\\-171\\79.24107\\-139.7109\\-171\\78.85742\\-141.6641\\-171\\76.9043\\-143.6172\\-171\\78.125\\-145.5703\\-171\\78.125\\-147.5234\\-171\\77.3112\\-151.4297\\-171\\78.40401\\-153.3828\\-171\\78.125\\-155.3359\\-171\\77.14844\\-156.4753\\-171\\75.19531\\-156.8008\\-171\\73.24219\\-157.9866\\-171\\71.28906\\-158.5098\\-171\\70.55664\\-159.2422\\-171\\69.0918\\-161.1953\\-171\\68.35938\\-163.1484\\-171\\67.87109\\-165.1016\\-171\\67.05729\\-167.0547\\-171\\68.35938\\-169.0078\\-171\\67.38281\\-169.9844\\-171\\66.79688\\-170.9609\\-171\\65.42969\\-173.8906\\-171\\65.10416\\-174.8672\\-171\\65.75521\\-176.8203\\-171\\65.18555\\-178.7734\\-171\\65.10416\\-180.7266\\-171\\64.45313\\-182.6797\\-171\\65.10416\\-184.6328\\-171\\63.80209\\-188.5391\\-171\\64.45313\\-190.4922\\-171\\64.45313\\-192.4453\\-171\\63.7207\\-194.3984\\-171\\63.7207\\-198.3047\\-171\\63.80209\\-200.2578\\-171\\62.5\\-202.2109\\-171\\62.5\\-206.1172\\-171\\61.19792\\-208.0703\\-171\\60.79102\\-210.0234\\-171\\60.05859\\-211.9766\\-171\\60.05859\\-217.8359\\-171\\59.24479\\-219.7891\\-171\\59.81445\\-221.7422\\-171\\60.05859\\-223.6953\\-171\\59.57031\\-224.6719\\-171\\59.32617\\-225.6484\\-171\\59.73307\\-227.6016\\-171\\59.24479\\-229.5547\\-171\\60.30273\\-231.5078\\-171\\59.81445\\-235.4141\\-171\\59.81445\\-237.3672\\-171\\59.57031\\-238.3438\\-171\\58.59375\\-239.3203\\-171\\58.34961\\-241.2734\\-171\\58.34961\\-245.1797\\-171\\57.37305\\-247.1328\\-171\\57.29167\\-249.0859\\-171\\56.88477\\-251.0391\\-171\\56.15234\\-252.9922\\-171\\56.64063\\-254.9453\\-171\\55.98959\\-256.8984\\-171\\56.64063\\-258.8516\\-171\\55.9082\\-260.8047\\-171\\55.66406\\-261.7813\\-171\\55.17578\\-262.7578\\-171\\55.17578\\-264.7109\\-171\\53.71094\\-267.6406\\-171\\53.4668\\-268.6172\\-171\\54.03646\\-270.5703\\-171\\53.95508\\-274.4766\\-171\\53.4668\\-276.4297\\-171\\52.73438\\-278.3828\\-171\\53.95508\\-280.3359\\-171\\53.38542\\-282.2891\\-171\\53.38542\\-284.2422\\-171\\54.93164\\-286.1953\\-171\\54.03646\\-290.1016\\-171\\54.85026\\-292.0547\\-171\\55.9082\\-295.9609\\-171\\57.29167\\-297.9141\\-171" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-73.24219\\-303.8542\\-169\\-75.19531\\-303.675\\-169\\-79.10156\\-303.1839\\-169\\-84.96094\\-302.5885\\-169\\-86.91406\\-302.2715\\-169\\-90.82031\\-301.2267\\-169\\-94.72656\\-300.4363\\-169\\-96.67969\\-299.662\\-169\\-100.5859\\-298.3394\\-169\\-102.5391\\-297.3136\\-169\\-104.4922\\-296.6992\\-169\\-106.4453\\-295.7298\\-169\\-108.3984\\-294.9905\\-169\\-110.3516\\-294.1102\\-169\\-112.3047\\-292.9929\\-169\\-114.2578\\-291.7224\\-169\\-116.2109\\-290.6448\\-169\\-122.0703\\-286.5929\\-169\\-124.6476\\-284.2422\\-169\\-127.9297\\-281.3329\\-169\\-129.8828\\-279.3381\\-169\\-131.8359\\-277.196\\-169\\-134.4105\\-274.4766\\-169\\-135.9787\\-272.5234\\-169\\-137.1861\\-270.5703\\-169\\-140.3014\\-266.6641\\-169\\-142.6606\\-262.7578\\-169\\-143.9251\\-260.8047\\-169\\-144.8669\\-258.8516\\-169\\-146.2197\\-256.8984\\-169\\-147.1953\\-254.9453\\-169\\-148.3177\\-252.9922\\-169\\-149.0861\\-251.0391\\-169\\-150.1282\\-249.0859\\-169\\-150.8028\\-247.1328\\-169\\-151.9624\\-245.1797\\-169\\-152.6912\\-243.2266\\-169\\-153.7619\\-241.2734\\-169\\-154.3957\\-239.3203\\-169\\-155.952\\-235.4141\\-169\\-156.367\\-233.4609\\-169\\-157.0253\\-231.5078\\-169\\-157.8465\\-229.5547\\-169\\-158.3226\\-227.6016\\-169\\-159.7611\\-223.6953\\-169\\-160.7096\\-219.7891\\-169\\-161.3966\\-217.8359\\-169\\-161.8514\\-215.8828\\-169\\-162.5682\\-210.0234\\-169\\-163.1557\\-206.1172\\-169\\-163.3599\\-204.1641\\-169\\-163.4646\\-202.2109\\-169\\-163.4961\\-198.3047\\-169\\-163.3954\\-196.3516\\-169\\-163.1406\\-194.3984\\-169\\-162.4244\\-190.4922\\-169\\-161.876\\-186.5859\\-169\\-161.3841\\-184.6328\\-169\\-160.5882\\-182.6797\\-169\\-160.0018\\-180.7266\\-169\\-159.1797\\-178.7865\\-169\\-157.2266\\-174.9214\\-169\\-156.1366\\-172.9141\\-169\\-153.7016\\-169.0078\\-169\\-151.3672\\-166.101\\-169\\-148.7422\\-163.1484\\-169\\-146.9126\\-161.1953\\-169\\-142.6151\\-157.2891\\-169\\-139.6484\\-154.8016\\-169\\-137.581\\-153.3828\\-169\\-133.7891\\-150.8891\\-169\\-131.8359\\-149.7809\\-169\\-129.8828\\-148.5287\\-169\\-127.9297\\-147.3937\\-169\\-125.9766\\-146.5408\\-169\\-124.0234\\-145.8032\\-169\\-122.0703\\-144.8222\\-169\\-120.1172\\-144.2056\\-169\\-118.1641\\-143.1472\\-169\\-116.2109\\-142.4861\\-169\\-114.2578\\-141.6564\\-169\\-112.3047\\-140.9361\\-169\\-110.3516\\-140.4684\\-169\\-108.3984\\-139.8427\\-169\\-106.4453\\-139.1134\\-169\\-102.5391\\-138.2558\\-169\\-100.5859\\-137.443\\-169\\-96.67969\\-136.4423\\-169\\-94.72656\\-135.6962\\-169\\-92.77344\\-135.1299\\-169\\-88.86719\\-134.2272\\-169\\-86.91406\\-133.6111\\-169\\-84.96094\\-133.2155\\-169\\-83.00781\\-132.9478\\-169\\-79.10156\\-132.5555\\-169\\-77.14844\\-132.2146\\-169\\-75.19531\\-131.7228\\-169\\-73.24219\\-131.4399\\-169\\-71.28906\\-131.2669\\-169\\-67.38281\\-131.1162\\-169\\-63.47656\\-131.0934\\-169\\-59.57031\\-131.2457\\-169\\-57.61719\\-131.4219\\-169\\-55.66406\\-131.7087\\-169\\-53.71094\\-132.1744\\-169\\-51.75781\\-132.5232\\-169\\-47.85156\\-133.0592\\-169\\-45.89844\\-133.5819\\-169\\-43.94531\\-134.3728\\-169\\-40.03906\\-135.59\\-169\\-38.08594\\-136.592\\-169\\-36.13281\\-137.4609\\-169\\-32.66398\\-139.7109\\-169\\-30.27344\\-141.3561\\-169\\-27.46302\\-143.6172\\-169\\-24.41406\\-146.4973\\-169\\-21.72112\\-149.4766\\-169\\-20.23199\\-151.4297\\-169\\-19.22526\\-153.3828\\-169\\-18.0161\\-155.3359\\-169\\-17.22301\\-157.2891\\-169\\-16.09281\\-159.2422\\-169\\-15.40612\\-161.1953\\-169\\-14.48328\\-163.1484\\-169\\-13.89492\\-165.1016\\-169\\-13.14041\\-169.0078\\-169\\-12.60938\\-170.9609\\-169\\-12.1844\\-172.9141\\-169\\-11.9687\\-174.8672\\-169\\-11.66539\\-178.7734\\-169\\-11.45089\\-180.7266\\-169\\-11.06542\\-182.6797\\-169\\-10.5806\\-184.6328\\-169\\-10.27135\\-186.5859\\-169\\-9.760791\\-192.4453\\-169\\-9.571362\\-196.3516\\-169\\-9.478082\\-200.2578\\-169\\-9.508928\\-206.1172\\-169\\-9.460802\\-210.0234\\-169\\-9.532335\\-213.9297\\-169\\-9.690118\\-217.8359\\-169\\-9.950508\\-225.6484\\-169\\-10.25391\\-229.5547\\-169\\-10.59358\\-231.5078\\-169\\-11.07449\\-233.4609\\-169\\-11.41036\\-235.4141\\-169\\-11.83877\\-239.3203\\-169\\-12.13458\\-241.2734\\-169\\-13.2393\\-245.1797\\-169\\-13.94413\\-249.0859\\-169\\-14.41988\\-251.0391\\-169\\-15.17519\\-252.9922\\-169\\-16.33103\\-256.8984\\-169\\-17.28678\\-258.8516\\-169\\-17.85562\\-260.8047\\-169\\-18.95229\\-262.7578\\-169\\-20.22182\\-266.6641\\-169\\-21.30418\\-268.6172\\-169\\-22.17134\\-270.5703\\-169\\-23.39124\\-272.5234\\-169\\-25.53991\\-276.4297\\-169\\-26.85205\\-278.3828\\-169\\-27.89142\\-280.3359\\-169\\-29.49089\\-282.2891\\-169\\-31.23146\\-284.2422\\-169\\-34.48683\\-288.1484\\-169\\-40.03906\\-293.359\\-169\\-41.99219\\-294.9531\\-169\\-43.94531\\-296.2575\\-169\\-45.89844\\-297.3216\\-169\\-47.85156\\-298.6786\\-169\\-51.75781\\-300.6086\\-169\\-53.71094\\-301.1629\\-169\\-57.61719\\-302.5222\\-169\\-67.38281\\-303.7811\\-169\\-69.33594\\-303.9089\\-169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "257" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-301.8099\\-169\\59.57031\\-301.3076\\-169\\57.61719\\-300.7721\\-169\\55.66406\\-300.4261\\-169\\54.13187\\-299.8672\\-169\\51.75781\\-298.7472\\-169\\49.80469\\-297.3715\\-169\\47.85156\\-296.6995\\-169\\45.89844\\-295.1841\\-169\\43.94531\\-294.386\\-169\\41.99219\\-292.9022\\-169\\40.03906\\-290.9544\\-169\\38.08594\\-289.1103\\-169\\36.13281\\-287.766\\-169\\34.47951\\-286.1953\\-169\\33.1563\\-284.2422\\-169\\31.40818\\-282.2891\\-169\\30.27344\\-281.1623\\-169\\27.97445\\-278.3828\\-169\\27.07435\\-276.4297\\-169\\25.61549\\-274.4766\\-169\\24.85988\\-272.5234\\-169\\24.41406\\-272.0064\\-169\\22.06643\\-268.6172\\-169\\21.21519\\-266.6641\\-169\\20.14951\\-264.7109\\-169\\18.96624\\-260.8047\\-169\\18.05124\\-258.8516\\-169\\17.19574\\-254.9453\\-169\\16.28675\\-252.9922\\-169\\15.67667\\-251.0391\\-169\\14.16331\\-247.1328\\-169\\13.34417\\-243.2266\\-169\\12.32824\\-239.3203\\-169\\12.07498\\-237.3672\\-169\\11.79778\\-233.4609\\-169\\10.86957\\-227.6016\\-169\\10.46036\\-225.6484\\-169\\10.28022\\-223.6953\\-169\\10.0234\\-219.7891\\-169\\10.0072\\-217.8359\\-169\\9.745173\\-213.9297\\-169\\9.53284\\-208.0703\\-169\\9.534486\\-202.2109\\-169\\9.480081\\-200.2578\\-169\\9.573514\\-192.4453\\-169\\9.709676\\-188.5391\\-169\\9.996536\\-182.6797\\-169\\10.23687\\-180.7266\\-169\\11.00787\\-176.8203\\-169\\11.85116\\-170.9609\\-169\\12.29239\\-169.0078\\-169\\13.09291\\-167.0547\\-169\\14.24864\\-163.1484\\-169\\15.33518\\-161.1953\\-169\\16.12261\\-159.2422\\-169\\17.39839\\-157.2891\\-169\\19.77873\\-153.3828\\-169\\21.21384\\-151.4297\\-169\\24.41406\\-147.6665\\-169\\26.64493\\-145.5703\\-169\\29.01786\\-143.6172\\-169\\31.62977\\-141.6641\\-169\\32.22656\\-141.1152\\-169\\34.47033\\-139.7109\\-169\\38.08594\\-137.6745\\-169\\40.03906\\-136.7691\\-169\\41.99219\\-136.5511\\-169\\43.94531\\-135.1235\\-169\\45.89844\\-134.7874\\-169\\47.85156\\-134.1081\\-169\\49.80469\\-133.5799\\-169\\51.75781\\-133.4423\\-169\\53.71094\\-132.8549\\-169\\55.66406\\-132.5882\\-169\\59.57031\\-132.2212\\-169\\61.52344\\-132.0883\\-169\\63.47656\\-131.8246\\-169\\65.42969\\-131.2578\\-169\\67.38281\\-131.2706\\-169\\69.33594\\-132.0406\\-169\\71.28906\\-132.1682\\-169\\73.24219\\-132.1355\\-169\\75.19531\\-132.212\\-169\\77.14844\\-132.4348\\-169\\81.05469\\-132.7626\\-169\\83.00781\\-133.0155\\-169\\84.96094\\-133.4167\\-169\\86.91406\\-133.5116\\-169\\88.86719\\-133.7043\\-169\\90.82031\\-134.032\\-169\\92.77344\\-134.7932\\-169\\96.67969\\-135.2239\\-169\\97.91396\\-135.8047\\-169\\100.5859\\-137.9317\\-169\\102.5391\\-138.0284\\-169\\104.4922\\-138.2513\\-169\\106.4453\\-139.2837\\-169\\108.3984\\-139.5005\\-169\\110.3516\\-140.4181\\-169\\112.3047\\-140.9561\\-169\\114.2578\\-141.0734\\-169\\116.0889\\-141.6641\\-169\\118.1641\\-142.6668\\-169\\120.1172\\-142.8375\\-169\\121.3257\\-143.6172\\-169\\122.0703\\-144.3712\\-169\\124.0234\\-144.6581\\-169\\125.9766\\-145.737\\-169\\129.8828\\-147.3755\\-169\\131.8359\\-148.7528\\-169\\133.7891\\-149.385\\-169\\135.7422\\-151.3442\\-169\\139.1907\\-153.3828\\-169\\139.6484\\-153.8711\\-169\\142.1509\\-155.3359\\-169\\145.5078\\-158.6642\\-169\\146.1515\\-159.2422\\-169\\147.9492\\-161.1953\\-169\\151.3672\\-164.6892\\-169\\151.6322\\-165.1016\\-169\\152.2311\\-167.0547\\-169\\153.7737\\-169.0078\\-169\\153.9307\\-170.9609\\-169\\154.034\\-174.8672\\-169\\153.3398\\-178.7734\\-169\\151.6602\\-180.7266\\-169\\151.6242\\-182.6797\\-169\\151.3672\\-183.2656\\-169\\149.4141\\-183.3933\\-169\\147.4609\\-182.7836\\-169\\145.5078\\-181.108\\-169\\143.5547\\-181.0573\\-169\\141.6016\\-181.6308\\-169\\139.6484\\-182.7685\\-169\\137.6953\\-181.1923\\-169\\135.9992\\-182.6797\\-169\\137.2255\\-184.6328\\-169\\138.6127\\-186.5859\\-169\\139.6484\\-187.8839\\-169\\140.4969\\-188.5391\\-169\\140.9053\\-190.4922\\-169\\141.6016\\-192.4918\\-169\\142.7455\\-194.3984\\-169\\142.5985\\-196.3516\\-169\\141.9271\\-198.3047\\-169\\141.6016\\-198.6709\\-169\\140.8288\\-200.2578\\-169\\140.0023\\-202.2109\\-169\\137.6953\\-204.3992\\-169\\135.7422\\-205.5854\\-169\\132.3844\\-208.0703\\-169\\133.7891\\-209.5564\\-169\\135.7422\\-209.1831\\-169\\137.6953\\-207.7167\\-169\\138.0157\\-208.0703\\-169\\138.339\\-210.0234\\-169\\138.3534\\-211.9766\\-169\\136.5039\\-213.9297\\-169\\136.3407\\-215.8828\\-169\\137.6953\\-217.5625\\-169\\138.0371\\-217.8359\\-169\\135.7422\\-219.9518\\-169\\133.7891\\-219.2371\\-169\\133.1209\\-219.7891\\-169\\133.7377\\-221.7422\\-169\\135.5591\\-223.6953\\-169\\135.7422\\-224.2813\\-169\\137.6953\\-223.5732\\-169\\139.6484\\-222.7188\\-169\\140.8854\\-221.7422\\-169\\140.408\\-219.7891\\-169\\143.5547\\-219.4318\\-169\\145.1823\\-219.7891\\-169\\148.0067\\-221.7422\\-169\\147.4609\\-222.5856\\-169\\145.5078\\-222.5309\\-169\\144.3434\\-223.6953\\-169\\143.8965\\-225.6484\\-169\\143.5547\\-226.2027\\-169\\141.6016\\-228.6697\\-169\\139.6484\\-228.9398\\-169\\139.0099\\-229.5547\\-169\\138.2042\\-231.5078\\-169\\138.2243\\-233.4609\\-169\\140.103\\-235.4141\\-169\\139.9148\\-237.3672\\-169\\139.5089\\-237.3672\\-169\\137.6953\\-235.7803\\-169\\135.7422\\-234.8607\\-169\\134.7656\\-235.4141\\-169\\133.7891\\-236.7975\\-169\\133.5261\\-237.3672\\-169\\134.2593\\-239.3203\\-169\\135.7422\\-240.9886\\-169\\136.1694\\-241.2734\\-169\\137.6953\\-243.0173\\-169\\139.6484\\-240.8713\\-169\\141.6016\\-240.7852\\-169\\143.5547\\-239.418\\-169\\145.5078\\-241.0022\\-169\\146.8395\\-241.2734\\-169\\147.4609\\-241.957\\-169\\149.4141\\-242.993\\-169\\149.6528\\-243.2266\\-169\\150.4883\\-245.1797\\-169\\151.3672\\-246.0586\\-169\\153.3203\\-246.6158\\-169\\155.2734\\-247.0491\\-169\\155.2734\\-247.2723\\-169\\153.6175\\-249.0859\\-169\\153.1808\\-252.9922\\-169\\151.5625\\-254.9453\\-169\\151.3672\\-255.3987\\-169\\149.9192\\-256.8984\\-169\\148.2928\\-258.8516\\-169\\147.8299\\-260.8047\\-169\\146.1033\\-262.7578\\-169\\145.841\\-264.7109\\-169\\145.5078\\-265.14\\-169\\141.9744\\-268.6172\\-169\\141.6016\\-269.6965\\-169\\139.9374\\-272.5234\\-169\\137.6953\\-274.6259\\-169\\135.7422\\-275.5833\\-169\\134.8958\\-276.4297\\-169\\133.7891\\-277.173\\-169\\132.6633\\-278.3828\\-169\\129.8828\\-281.0427\\-169\\127.9297\\-282.1638\\-169\\125.9766\\-283.597\\-169\\125.3744\\-284.2422\\-169\\122.0703\\-286.47\\-169\\120.1172\\-288.2671\\-169\\118.1641\\-288.6922\\-169\\116.2109\\-290.5596\\-169\\114.2578\\-291.1924\\-169\\113.3955\\-292.0547\\-169\\112.3047\\-292.8496\\-169\\110.3516\\-293.0136\\-169\\108.3984\\-294.2318\\-169\\106.4453\\-294.6619\\-169\\104.4922\\-295.9449\\-169\\102.5391\\-296.0929\\-169\\100.5859\\-297.2137\\-169\\98.63281\\-297.4314\\-169\\96.67969\\-298.5016\\-169\\94.72656\\-299.0335\\-169\\92.77344\\-299.1011\\-169\\90.82031\\-299.9676\\-169\\88.86719\\-300.647\\-169\\84.96094\\-300.7585\\-169\\82.20564\\-301.8203\\-169\\79.10156\\-302.577\\-169\\75.19531\\-302.6948\\-169\\71.28906\\-302.6257\\-169\\69.33594\\-302.2037\\-169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "4" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "143.5547\\-189.3458\\-169\\143.133\\-188.5391\\-169\\143.5547\\-188.2349\\-169\\143.886\\-188.5391\\-169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "4" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "145.5078\\-194.8053\\-169\\144.6036\\-194.3984\\-169\\145.5078\\-193.1777\\-169\\146.7928\\-194.3984\\-169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002386" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "149.4141\\-216.2923\\-169\\149.1319\\-215.8828\\-169\\149.2473\\-213.9297\\-169\\147.4609\\-212.0023\\-169\\145.5078\\-214.0812\\-169\\143.5547\\-211.9014\\-169\\141.6016\\-210.566\\-169\\141.0203\\-210.0234\\-169\\141.6016\\-209.642\\-169\\143.5547\\-209.6297\\-169\\145.4139\\-208.0703\\-169\\145.3879\\-206.1172\\-169\\145.1737\\-204.1641\\-169\\145.3738\\-202.2109\\-169\\145.6533\\-202.2109\\-169\\147.4866\\-204.1641\\-169\\147.966\\-206.1172\\-169\\147.966\\-208.0703\\-169\\148.1934\\-210.0234\\-169\\147.4924\\-211.9766\\-169\\149.573\\-213.9297\\-169\\149.7875\\-215.8828\\-169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "181" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-303.8682\\-167\\-79.10156\\-303.2914\\-167\\-83.00781\\-302.8616\\-167\\-84.96094\\-302.7003\\-167\\-86.91406\\-302.4227\\-167\\-88.86719\\-301.9653\\-167\\-90.82031\\-301.3931\\-167\\-94.72656\\-300.5706\\-167\\-96.67969\\-299.9626\\-167\\-98.63281\\-299.1595\\-167\\-100.5859\\-298.5634\\-167\\-102.5391\\-297.5571\\-167\\-104.4922\\-296.8603\\-167\\-106.4453\\-296.0469\\-167\\-108.3984\\-295.1125\\-167\\-110.3516\\-294.3546\\-167\\-110.8253\\-294.0078\\-167\\-114.2288\\-292.0547\\-167\\-116.2109\\-290.8091\\-167\\-118.1641\\-289.3966\\-167\\-120.1172\\-288.2358\\-167\\-122.0703\\-286.7733\\-167\\-124.8006\\-284.2422\\-167\\-127.9297\\-281.4396\\-167\\-129.8828\\-279.4686\\-167\\-130.8533\\-278.3828\\-167\\-134.6139\\-274.4766\\-167\\-136.2235\\-272.5234\\-167\\-137.4283\\-270.5703\\-167\\-138.8977\\-268.6172\\-167\\-140.5108\\-266.6641\\-167\\-141.8457\\-264.7109\\-167\\-142.8571\\-262.7578\\-167\\-144.1561\\-260.8047\\-167\\-145.0998\\-258.8516\\-167\\-146.3941\\-256.8984\\-167\\-147.5296\\-254.9453\\-167\\-150.2918\\-249.0859\\-167\\-151.0728\\-247.1328\\-167\\-152.173\\-245.1797\\-167\\-152.9857\\-243.2266\\-167\\-154.0079\\-241.2734\\-167\\-154.6203\\-239.3203\\-167\\-155.5324\\-237.3672\\-167\\-156.1422\\-235.4141\\-167\\-156.5817\\-233.4609\\-167\\-157.5103\\-231.5078\\-167\\-158.6326\\-227.6016\\-167\\-159.5202\\-225.6484\\-167\\-160.5314\\-221.7422\\-167\\-161.202\\-219.7891\\-167\\-161.7525\\-217.8359\\-167\\-162.0739\\-215.8828\\-167\\-162.5779\\-211.9766\\-167\\-163.3599\\-208.0703\\-167\\-163.5866\\-206.1172\\-167\\-163.8046\\-202.2109\\-167\\-163.8359\\-198.3047\\-167\\-163.6258\\-194.3984\\-167\\-163.3336\\-192.4453\\-167\\-162.7894\\-190.4922\\-167\\-162.3999\\-188.5391\\-167\\-161.7479\\-184.6328\\-167\\-160.3162\\-180.7266\\-167\\-159.668\\-178.7734\\-167\\-158.5306\\-176.8203\\-167\\-157.6425\\-174.8672\\-167\\-156.3832\\-172.9141\\-167\\-154.0558\\-169.0078\\-167\\-152.4658\\-167.0547\\-167\\-147.3178\\-161.1953\\-167\\-142.9162\\-157.2891\\-167\\-139.6484\\-154.486\\-167\\-137.6953\\-153.0377\\-167\\-135.7422\\-151.9426\\-167\\-135.0999\\-151.4297\\-167\\-132.0143\\-149.4766\\-167\\-129.8828\\-148.2941\\-167\\-127.9297\\-147.0962\\-167\\-125.9766\\-146.3872\\-167\\-122.0703\\-144.6651\\-167\\-120.1172\\-143.9607\\-167\\-118.1641\\-142.9347\\-167\\-116.2109\\-142.2692\\-167\\-114.2578\\-141.3631\\-167\\-112.3047\\-140.7577\\-167\\-110.3516\\-140.2586\\-167\\-108.3984\\-139.4931\\-167\\-106.4453\\-138.919\\-167\\-104.4922\\-138.5426\\-167\\-100.5859\\-137.1515\\-167\\-98.63281\\-136.6768\\-167\\-96.67969\\-136.0983\\-167\\-94.72656\\-135.3253\\-167\\-90.82031\\-134.4635\\-167\\-88.86719\\-133.8125\\-167\\-86.91406\\-133.3207\\-167\\-84.96094\\-133.0084\\-167\\-79.10156\\-132.2986\\-167\\-77.14844\\-131.762\\-167\\-75.19531\\-131.3957\\-167\\-71.28906\\-131.099\\-167\\-67.38281\\-130.9686\\-167\\-63.47656\\-130.9637\\-167\\-59.57031\\-131.1143\\-167\\-55.66406\\-131.4584\\-167\\-51.75781\\-132.3674\\-167\\-47.85156\\-132.9223\\-167\\-45.89844\\-133.3207\\-167\\-41.99219\\-134.7265\\-167\\-40.03906\\-135.3318\\-167\\-38.08594\\-136.3564\\-167\\-36.13281\\-137.183\\-167\\-32.22656\\-139.5298\\-167\\-30.27344\\-140.8895\\-167\\-27.11565\\-143.6172\\-167\\-24.41406\\-146.2332\\-167\\-22.46094\\-148.3173\\-167\\-19.96228\\-151.4297\\-167\\-18.98636\\-153.3828\\-167\\-17.77872\\-155.3359\\-167\\-16.9181\\-157.2891\\-167\\-15.84671\\-159.2422\\-167\\-15.18165\\-161.1953\\-167\\-14.20111\\-163.1484\\-167\\-13.70129\\-165.1016\\-167\\-13.31042\\-167.0547\\-167\\-12.24002\\-170.9609\\-167\\-11.93576\\-172.9141\\-167\\-11.4787\\-178.7734\\-167\\-11.2087\\-180.7266\\-167\\-10.6756\\-182.6797\\-167\\-10.31681\\-184.6328\\-167\\-9.994284\\-188.5391\\-167\\-9.61691\\-192.4453\\-167\\-9.397322\\-196.3516\\-167\\-9.27124\\-202.2109\\-167\\-9.211189\\-210.0234\\-167\\-9.268246\\-213.9297\\-167\\-9.38522\\-215.8828\\-167\\-9.595352\\-221.7422\\-167\\-9.728599\\-223.6953\\-167\\-9.867447\\-227.6016\\-167\\-10.27135\\-231.5078\\-167\\-11.2274\\-235.4141\\-167\\-11.99525\\-241.2734\\-167\\-12.40517\\-243.2266\\-167\\-13.09543\\-245.1797\\-167\\-13.86834\\-249.0859\\-167\\-14.34744\\-251.0391\\-167\\-15.10976\\-252.9922\\-167\\-16.20483\\-256.8984\\-167\\-17.1875\\-258.8516\\-167\\-17.78886\\-260.8047\\-167\\-18.86345\\-262.7578\\-167\\-20.14838\\-266.6641\\-167\\-21.24605\\-268.6172\\-167\\-22.08984\\-270.5703\\-167\\-23.34547\\-272.5234\\-167\\-25.4889\\-276.4297\\-167\\-26.77582\\-278.3828\\-167\\-27.83526\\-280.3359\\-167\\-29.45006\\-282.2891\\-167\\-31.18369\\-284.2422\\-167\\-32.22656\\-285.627\\-167\\-34.17969\\-288.0341\\-167\\-40.03906\\-293.6157\\-167\\-40.4971\\-294.0078\\-167\\-43.94531\\-296.476\\-167\\-45.89844\\-297.5741\\-167\\-47.85156\\-298.8579\\-167\\-49.80469\\-299.875\\-167\\-51.75781\\-300.7254\\-167\\-53.71094\\-301.2894\\-167\\-55.66406\\-302.0497\\-167\\-57.61719\\-302.6075\\-167\\-61.52344\\-303.136\\-167\\-65.48394\\-303.7734\\-167\\-67.38281\\-304.0092\\-167\\-69.33594\\-304.099\\-167\\-73.24219\\-304.0209\\-167" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002385" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "174" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-301.8284\\-167\\57.61719\\-301.2669\\-167\\55.66406\\-300.8209\\-167\\53.71094\\-300.2383\\-167\\51.75781\\-299.2064\\-167\\49.80469\\-298.3557\\-167\\47.85156\\-297.0696\\-167\\43.94531\\-294.8546\\-167\\40.23918\\-292.0547\\-167\\38.08594\\-290.0756\\-167\\36.13281\\-288.4352\\-167\\33.88445\\-286.1953\\-167\\30.76528\\-282.2891\\-167\\30.27344\\-281.7747\\-167\\27.59399\\-278.3828\\-167\\26.36719\\-276.3754\\-167\\25.31226\\-274.4766\\-167\\23.96746\\-272.5234\\-167\\22.99528\\-270.5703\\-167\\21.67411\\-268.6172\\-167\\19.81378\\-264.7109\\-167\\19.32026\\-262.7578\\-167\\17.80149\\-258.8516\\-167\\17.44792\\-256.8984\\-167\\16.90051\\-254.9453\\-167\\16.04432\\-252.9922\\-167\\15.48623\\-251.0391\\-167\\14.64075\\-249.0859\\-167\\13.95256\\-247.1328\\-167\\13.13612\\-243.2266\\-167\\12.50895\\-241.2734\\-167\\12.07886\\-239.3203\\-167\\11.85591\\-237.3672\\-167\\11.59068\\-233.4609\\-167\\11.28203\\-231.5078\\-167\\10.47165\\-227.6016\\-167\\10.19597\\-225.6484\\-167\\10.0297\\-221.7422\\-167\\9.87885\\-219.7891\\-167\\9.453588\\-211.9766\\-167\\9.305334\\-208.0703\\-167\\9.353164\\-204.1641\\-167\\9.280454\\-200.2578\\-167\\9.423553\\-192.4453\\-167\\9.784867\\-184.6328\\-167\\10.33579\\-178.7734\\-167\\11.14695\\-174.8672\\-167\\11.76652\\-170.9609\\-167\\12.14718\\-169.0078\\-167\\12.9115\\-167.0547\\-167\\13.55205\\-165.1016\\-167\\14.05165\\-163.1484\\-167\\15.05859\\-161.1953\\-167\\15.87469\\-159.2422\\-167\\17.13929\\-157.2891\\-167\\18.1425\\-155.3359\\-167\\20.50781\\-151.8898\\-167\\22.3508\\-149.4766\\-167\\24.41406\\-147.2082\\-167\\26.36719\\-145.392\\-167\\28.44881\\-143.6172\\-167\\32.22656\\-140.7331\\-167\\34.17969\\-139.4076\\-167\\36.13281\\-138.5307\\-167\\38.08594\\-137.2415\\-167\\40.03906\\-136.425\\-167\\41.99219\\-135.3853\\-167\\45.89844\\-134.1866\\-167\\47.85156\\-133.3633\\-167\\49.80469\\-133.0172\\-167\\51.75781\\-132.7823\\-167\\56.22746\\-131.8984\\-167\\61.52344\\-130.9404\\-167\\67.38281\\-130.7693\\-167\\69.33594\\-130.8745\\-167\\73.24219\\-130.94\\-167\\77.14844\\-131.5474\\-167\\79.10156\\-131.9699\\-167\\81.05469\\-132.2767\\-167\\84.96094\\-132.7364\\-167\\88.86719\\-133.0913\\-167\\90.82031\\-133.3499\\-167\\92.77344\\-133.7663\\-167\\94.72656\\-134.3028\\-167\\98.63281\\-135.0223\\-167\\100.5859\\-136.0382\\-167\\104.4922\\-136.7813\\-167\\108.3984\\-138.2496\\-167\\113.9147\\-139.7109\\-167\\116.2109\\-140.4336\\-167\\120.1172\\-141.3096\\-167\\122.0703\\-142.3694\\-167\\124.0234\\-142.8761\\-167\\125.9766\\-143.9881\\-167\\127.9297\\-144.6889\\-167\\131.8359\\-146.7352\\-167\\133.4588\\-147.5234\\-167\\135.7422\\-148.9017\\-167\\137.6953\\-150.254\\-167\\139.6169\\-151.4297\\-167\\143.5547\\-154.1716\\-167\\147.105\\-157.2891\\-167\\149.4141\\-159.4714\\-167\\151.3672\\-161.4937\\-167\\153.3203\\-163.74\\-167\\154.3464\\-165.1016\\-167\\157.2266\\-169.2767\\-167\\158.045\\-170.9609\\-167\\160.4167\\-174.8672\\-167\\161.1328\\-176.7629\\-167\\162.0096\\-178.7734\\-167\\162.2523\\-180.7266\\-167\\163.5544\\-182.6797\\-167\\163.7434\\-184.6328\\-167\\163.8744\\-188.5391\\-167\\165.136\\-190.4922\\-167\\165.3985\\-194.3984\\-167\\165.4934\\-198.3047\\-167\\165.5239\\-202.2109\\-167\\165.5031\\-206.1172\\-167\\165.42\\-211.9766\\-167\\165.1517\\-217.8359\\-167\\165.0042\\-219.7891\\-167\\163.7494\\-221.7422\\-167\\163.6955\\-227.6016\\-167\\163.6098\\-229.5547\\-167\\162.7407\\-231.5078\\-167\\162.2759\\-233.4609\\-167\\162.0672\\-235.4141\\-167\\160.7866\\-239.3203\\-167\\160.2766\\-241.2734\\-167\\159.3646\\-243.2266\\-167\\158.0889\\-247.1328\\-167\\156.1468\\-251.0391\\-167\\155.4672\\-252.9922\\-167\\153.3203\\-256.5544\\-167\\151.6493\\-258.8516\\-167\\150.4322\\-260.8047\\-167\\149.0217\\-262.7578\\-167\\148.0278\\-264.7109\\-167\\146.4716\\-266.6641\\-167\\144.6487\\-268.6172\\-167\\143.0995\\-270.5703\\-167\\141.676\\-272.5234\\-167\\139.6484\\-274.6607\\-167\\137.6849\\-276.4297\\-167\\135.7422\\-277.8906\\-167\\131.8359\\-281.3664\\-167\\129.8828\\-282.933\\-167\\127.9297\\-284.1278\\-167\\124.0234\\-287.1297\\-167\\122.0703\\-288.433\\-167\\120.1172\\-289.5267\\-167\\116.1606\\-292.0547\\-167\\112.5632\\-294.0078\\-167\\112.3047\\-294.2061\\-167\\108.3984\\-295.5571\\-167\\106.4453\\-296.4652\\-167\\102.5391\\-297.7011\\-167\\100.5859\\-298.7838\\-167\\98.63281\\-299.1886\\-167\\96.67969\\-300.048\\-167\\94.72656\\-300.6429\\-167\\92.77344\\-300.884\\-167\\90.82031\\-301.2726\\-167\\88.86719\\-301.875\\-167\\86.91406\\-302.1985\\-167\\83.00781\\-302.6582\\-167\\81.05469\\-302.8131\\-167\\75.19531\\-303.0565\\-167\\71.28906\\-302.9643\\-167\\67.38281\\-302.7469\\-167\\63.47656\\-302.461\\-167\\61.52344\\-302.2685\\-167" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "183" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-303.9729\\-165\\-81.05469\\-303.136\\-165\\-86.91406\\-302.53\\-165\\-88.86719\\-302.1411\\-165\\-90.82031\\-301.5382\\-165\\-94.72656\\-300.6905\\-165\\-96.67969\\-300.1794\\-165\\-98.63281\\-299.3523\\-165\\-100.5859\\-298.7287\\-165\\-104.4922\\-296.9863\\-165\\-106.4453\\-296.2888\\-165\\-108.3984\\-295.2131\\-165\\-110.3516\\-294.5291\\-165\\-112.3047\\-293.3054\\-165\\-114.2578\\-292.2541\\-165\\-117.3944\\-290.1016\\-165\\-118.1641\\-289.4879\\-165\\-120.1172\\-288.3963\\-165\\-122.0703\\-286.8789\\-165\\-125.9766\\-283.2656\\-165\\-127.9297\\-281.5332\\-165\\-129.8828\\-279.5642\\-165\\-130.9257\\-278.3828\\-165\\-134.7461\\-274.4766\\-165\\-136.369\\-272.5234\\-165\\-137.6869\\-270.5703\\-165\\-139.1066\\-268.6172\\-165\\-140.6712\\-266.6641\\-165\\-142.0864\\-264.7109\\-165\\-143.0315\\-262.7578\\-165\\-144.3212\\-260.8047\\-165\\-145.5078\\-258.6696\\-165\\-147.4609\\-255.443\\-165\\-147.8254\\-254.9453\\-165\\-148.6217\\-252.9922\\-165\\-149.6601\\-251.0391\\-165\\-150.4608\\-249.0859\\-165\\-151.4619\\-247.1328\\-165\\-153.3582\\-243.2266\\-165\\-154.2127\\-241.2734\\-165\\-154.8733\\-239.3203\\-165\\-155.8018\\-237.3672\\-165\\-156.2968\\-235.4141\\-165\\-156.9081\\-233.4609\\-165\\-157.8159\\-231.5078\\-165\\-158.3344\\-229.5547\\-165\\-159.8362\\-225.6484\\-165\\-160.3027\\-223.6953\\-165\\-160.8869\\-221.7422\\-165\\-161.5851\\-219.7891\\-165\\-161.9724\\-217.8359\\-165\\-162.5089\\-213.9297\\-165\\-163.4069\\-210.0234\\-165\\-163.6801\\-208.0703\\-165\\-164.0421\\-202.2109\\-165\\-164.0778\\-198.3047\\-165\\-163.8892\\-194.3984\\-165\\-163.7042\\-192.4453\\-165\\-163.3085\\-190.4922\\-165\\-162.7189\\-188.5391\\-165\\-161.9948\\-184.6328\\-165\\-161.5329\\-182.6797\\-165\\-160.6638\\-180.7266\\-165\\-159.9823\\-178.7734\\-165\\-159.1797\\-177.1683\\-165\\-157.2266\\-173.6533\\-165\\-156.6695\\-172.9141\\-165\\-155.694\\-170.9609\\-165\\-154.3333\\-169.0078\\-165\\-152.7495\\-167.0547\\-165\\-147.8195\\-161.1953\\-165\\-145.5078\\-159.1504\\-165\\-143.5547\\-157.5625\\-165\\-140.9875\\-155.3359\\-165\\-137.6953\\-152.7741\\-165\\-135.7422\\-151.6423\\-165\\-133.7891\\-150.3928\\-165\\-131.8359\\-149.0263\\-165\\-129.8828\\-148.0806\\-165\\-127.9297\\-146.9131\\-165\\-125.9766\\-146.2652\\-165\\-124.0234\\-145.2309\\-165\\-122.0703\\-144.5386\\-165\\-118.1641\\-142.7839\\-165\\-116.2109\\-142.0612\\-165\\-114.2578\\-141.1511\\-165\\-110.3516\\-140.0602\\-165\\-108.3984\\-139.2328\\-165\\-104.4922\\-138.345\\-165\\-102.5391\\-137.5221\\-165\\-100.5859\\-136.9357\\-165\\-98.63281\\-136.4501\\-165\\-96.67969\\-135.6826\\-165\\-94.72656\\-135.0979\\-165\\-92.77344\\-134.683\\-165\\-90.82031\\-134.1515\\-165\\-88.86719\\-133.4733\\-165\\-86.91406\\-133.1084\\-165\\-83.00781\\-132.6528\\-165\\-81.05469\\-132.3447\\-165\\-77.14844\\-131.4399\\-165\\-75.19531\\-131.2118\\-165\\-71.28906\\-130.9637\\-165\\-67.38281\\-130.8515\\-165\\-61.52344\\-130.9266\\-165\\-57.61719\\-131.1416\\-165\\-55.66406\\-131.3114\\-165\\-53.71094\\-131.6358\\-165\\-51.75781\\-132.2101\\-165\\-49.80469\\-132.5867\\-165\\-47.85156\\-132.8282\\-165\\-45.89844\\-133.1692\\-165\\-43.94531\\-133.7663\\-165\\-41.99219\\-134.5752\\-165\\-40.03906\\-135.1864\\-165\\-38.08594\\-136.2251\\-165\\-36.13281\\-137.0557\\-165\\-34.17969\\-138.2145\\-165\\-32.22656\\-139.2227\\-165\\-30.27344\\-140.6228\\-165\\-28.32031\\-142.2676\\-165\\-24.41406\\-146.0329\\-165\\-22.46094\\-148.0907\\-165\\-19.77379\\-151.4297\\-165\\-16.59393\\-157.2891\\-165\\-15.67613\\-159.2422\\-165\\-14.97176\\-161.1953\\-165\\-14.05531\\-163.1484\\-165\\-13.1638\\-167.0547\\-165\\-12.50895\\-169.0078\\-165\\-12.05842\\-170.9609\\-165\\-11.8207\\-172.9141\\-165\\-11.32111\\-178.7734\\-165\\-10.95998\\-180.7266\\-165\\-10.46036\\-182.6797\\-165\\-10.18807\\-184.6328\\-165\\-9.936063\\-188.5391\\-165\\-9.401483\\-194.3984\\-165\\-9.188863\\-202.2109\\-165\\-9.191176\\-204.1641\\-165\\-9.078664\\-210.0234\\-165\\-9.138778\\-213.9297\\-165\\-9.363839\\-217.8359\\-165\\-9.490317\\-221.7422\\-165\\-9.671271\\-225.6484\\-165\\-9.944898\\-229.5547\\-165\\-10.18807\\-231.5078\\-165\\-10.5806\\-233.4609\\-165\\-11.1341\\-235.4141\\-165\\-11.46376\\-237.3672\\-165\\-11.96435\\-241.2734\\-165\\-12.33082\\-243.2266\\-165\\-13.03469\\-245.1797\\-165\\-13.83846\\-249.0859\\-165\\-14.31418\\-251.0391\\-165\\-15.09123\\-252.9922\\-165\\-16.18562\\-256.8984\\-165\\-17.18298\\-258.8516\\-165\\-17.77242\\-260.8047\\-165\\-18.82234\\-262.7578\\-165\\-20.15953\\-266.6641\\-165\\-21.26034\\-268.6172\\-165\\-22.13319\\-270.5703\\-165\\-23.38637\\-272.5234\\-165\\-25.54515\\-276.4297\\-165\\-26.81843\\-278.3828\\-165\\-27.88412\\-280.3359\\-165\\-29.47329\\-282.2891\\-165\\-31.17811\\-284.2422\\-165\\-34.17969\\-288.1032\\-165\\-40.03906\\-293.7952\\-165\\-43.94531\\-296.5928\\-165\\-47.85156\\-298.9789\\-165\\-49.80469\\-300.0974\\-165\\-51.75781\\-300.8261\\-165\\-53.71094\\-301.4146\\-165\\-55.66406\\-302.2012\\-165\\-57.61719\\-302.6648\\-165\\-61.52344\\-303.2302\\-165\\-65.42969\\-303.9221\\-165\\-67.38281\\-304.1302\\-165\\-69.33594\\-304.1988\\-165\\-73.24219\\-304.1095\\-165" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "170" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.0479\\-165\\57.61719\\-301.4037\\-165\\53.71094\\-300.3893\\-165\\51.75781\\-299.3665\\-165\\49.80469\\-298.5216\\-165\\47.85156\\-297.2251\\-165\\45.89844\\-296.2389\\-165\\43.94531\\-294.9906\\-165\\40.03906\\-292.2198\\-165\\36.13281\\-288.6973\\-165\\33.64258\\-286.1953\\-165\\32.02967\\-284.2422\\-165\\27.45028\\-278.3828\\-165\\26.15957\\-276.4297\\-165\\25.14648\\-274.4766\\-165\\23.76478\\-272.5234\\-165\\22.67718\\-270.5703\\-165\\21.48438\\-268.6172\\-165\\20.48438\\-266.6641\\-165\\19.69203\\-264.7109\\-165\\19.18292\\-262.7578\\-165\\18.27469\\-260.8047\\-165\\17.6959\\-258.8516\\-165\\17.32086\\-256.8984\\-165\\15.90545\\-252.9922\\-165\\15.35135\\-251.0391\\-165\\14.44322\\-249.0859\\-165\\13.84995\\-247.1328\\-165\\12.9996\\-243.2266\\-165\\12.35594\\-241.2734\\-165\\11.98033\\-239.3203\\-165\\11.46205\\-233.4609\\-165\\11.09669\\-231.5078\\-165\\10.5806\\-229.5547\\-165\\10.26257\\-227.6016\\-165\\10.05314\\-225.6484\\-165\\9.874659\\-221.7422\\-165\\9.492842\\-215.8828\\-165\\9.203942\\-211.9766\\-165\\9.057273\\-208.0703\\-165\\9.132544\\-202.2109\\-165\\9.103436\\-200.2578\\-165\\9.331597\\-194.3984\\-165\\9.359195\\-192.4453\\-165\\9.746755\\-184.6328\\-165\\10.24534\\-178.7734\\-165\\10.5806\\-176.8203\\-165\\11.07871\\-174.8672\\-165\\12.07886\\-169.0078\\-165\\12.85429\\-167.0547\\-165\\13.49706\\-165.1016\\-165\\13.9719\\-163.1484\\-165\\15.76987\\-159.2422\\-165\\16.97515\\-157.2891\\-165\\17.96646\\-155.3359\\-165\\20.50781\\-151.5016\\-165\\22.07661\\-149.4766\\-165\\24.41406\\-146.8993\\-165\\28.04487\\-143.6172\\-165\\30.56453\\-141.6641\\-165\\34.17969\\-139.1276\\-165\\36.13281\\-138.2756\\-165\\38.08594\\-137.0114\\-165\\40.03906\\-136.1616\\-165\\41.99219\\-135.1444\\-165\\43.94531\\-134.5885\\-165\\45.89844\\-133.7492\\-165\\47.85156\\-133.1191\\-165\\51.75781\\-132.5845\\-165\\55.66406\\-131.6015\\-165\\61.52344\\-130.7611\\-165\\65.42969\\-130.7187\\-165\\67.38281\\-130.6103\\-165\\71.28906\\-130.5854\\-165\\73.24219\\-130.7049\\-165\\75.19531\\-131.1685\\-165\\77.14844\\-131.3622\\-165\\80.92152\\-131.8984\\-165\\84.96094\\-132.6003\\-165\\88.86719\\-132.946\\-165\\92.77344\\-133.4983\\-165\\96.67969\\-134.4924\\-165\\100.5859\\-135.1858\\-165\\104.4922\\-136.4883\\-165\\106.4453\\-136.9644\\-165\\110.3516\\-138.2899\\-165\\114.2578\\-139.3023\\-165\\116.2109\\-140.022\\-165\\118.1641\\-140.5541\\-165\\120.1172\\-140.9716\\-165\\124.0234\\-142.5744\\-165\\125.9766\\-143.2767\\-165\\127.9297\\-144.3557\\-165\\129.8828\\-145.1282\\-165\\131.8359\\-146.3114\\-165\\133.7891\\-147.0918\\-165\\137.5631\\-149.4766\\-165\\140.5415\\-151.4297\\-165\\141.6016\\-152.2792\\-165\\145.5078\\-155.0381\\-165\\148.0469\\-157.2891\\-165\\151.3672\\-160.5221\\-165\\153.6823\\-163.1484\\-165\\155.2734\\-165.3108\\-165\\157.7981\\-169.0078\\-165\\158.9284\\-170.9609\\-165\\160.1799\\-172.9141\\-165\\161.3069\\-174.8672\\-165\\162.0848\\-176.8203\\-165\\162.7341\\-178.7734\\-165\\163.608\\-180.7266\\-165\\164.1315\\-182.6797\\-165\\164.5477\\-184.6328\\-165\\165.1057\\-186.5859\\-165\\165.8754\\-190.4922\\-165\\166.2099\\-194.3984\\-165\\166.4851\\-198.3047\\-165\\166.6302\\-202.2109\\-165\\166.6439\\-206.1172\\-165\\166.4683\\-210.0234\\-165\\166.0989\\-215.8828\\-165\\165.798\\-219.7891\\-165\\164.7699\\-225.6484\\-165\\164.2103\\-229.5547\\-165\\163.4831\\-233.4609\\-165\\162.7276\\-235.4141\\-165\\162.2106\\-237.3672\\-165\\161.8225\\-239.3203\\-165\\160.2153\\-243.2266\\-165\\159.5741\\-245.1797\\-165\\158.4417\\-247.1328\\-165\\157.7002\\-249.0859\\-165\\156.561\\-251.0391\\-165\\155.8878\\-252.9922\\-165\\154.655\\-254.9453\\-165\\153.6761\\-256.8984\\-165\\153.3203\\-257.317\\-165\\151.3672\\-260.184\\-165\\150.855\\-260.8047\\-165\\149.742\\-262.7578\\-165\\148.4058\\-264.7109\\-165\\146.8963\\-266.6641\\-165\\143.5547\\-270.6868\\-165\\142.1144\\-272.5234\\-165\\139.6484\\-275.0791\\-165\\135.7422\\-278.6692\\-165\\133.7796\\-280.3359\\-165\\131.8359\\-281.7558\\-165\\128.6901\\-284.2422\\-165\\125.9766\\-286.2341\\-165\\122.0703\\-288.8873\\-165\\120.1172\\-289.8972\\-165\\116.2109\\-292.444\\-165\\114.2578\\-293.351\\-165\\112.3047\\-294.4863\\-165\\110.3516\\-295.1248\\-165\\106.4453\\-296.8033\\-165\\104.4922\\-297.4102\\-165\\102.5391\\-298.4052\\-165\\98.63281\\-299.6386\\-165\\96.67969\\-300.3949\\-165\\94.72656\\-300.8209\\-165\\90.82031\\-301.5671\\-165\\88.86719\\-302.1246\\-165\\86.91406\\-302.461\\-165\\83.00781\\-302.7694\\-165\\75.19531\\-303.1282\\-165\\71.28906\\-303.071\\-165\\63.47656\\-302.6097\\-165\\61.52344\\-302.4315\\-165" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.811\\-163\\-81.05469\\-303.1958\\-163\\-86.91406\\-302.6028\\-163\\-88.86719\\-302.2611\\-163\\-92.77344\\-301.1966\\-163\\-96.67969\\-300.3524\\-163\\-98.63281\\-299.5352\\-163\\-102.5391\\-298.1011\\-163\\-104.4922\\-297.0938\\-163\\-106.4453\\-296.446\\-163\\-108.3984\\-295.329\\-163\\-110.3516\\-294.6439\\-163\\-112.3047\\-293.4267\\-163\\-114.2578\\-292.4012\\-163\\-117.4993\\-290.1016\\-163\\-118.1641\\-289.5598\\-163\\-120.1172\\-288.5174\\-163\\-122.0703\\-286.9676\\-163\\-125.9766\\-283.3192\\-163\\-127.2374\\-282.2891\\-163\\-129.8828\\-279.6872\\-163\\-131.046\\-278.3828\\-163\\-134.8503\\-274.4766\\-163\\-136.489\\-272.5234\\-163\\-137.6953\\-270.8145\\-163\\-139.6484\\-268.2672\\-163\\-142.2373\\-264.7109\\-163\\-143.207\\-262.7578\\-163\\-143.5547\\-262.3122\\-163\\-145.5078\\-259.0841\\-163\\-146.7523\\-256.8984\\-163\\-148.0107\\-254.9453\\-163\\-148.7822\\-252.9922\\-163\\-149.9057\\-251.0391\\-163\\-150.6333\\-249.0859\\-163\\-151.7857\\-247.1328\\-163\\-152.5836\\-245.1797\\-163\\-153.6832\\-243.2266\\-163\\-155.1735\\-239.3203\\-163\\-156.0059\\-237.3672\\-163\\-156.4777\\-235.4141\\-163\\-157.3351\\-233.4609\\-163\\-158.0438\\-231.5078\\-163\\-158.6008\\-229.5547\\-163\\-159.5158\\-227.6016\\-163\\-160.5722\\-223.6953\\-163\\-161.315\\-221.7422\\-163\\-161.8304\\-219.7891\\-163\\-162.4042\\-215.8828\\-163\\-162.8059\\-213.9297\\-163\\-163.3478\\-211.9766\\-163\\-163.6963\\-210.0234\\-163\\-163.8892\\-208.0703\\-163\\-164.1555\\-204.1641\\-163\\-164.3163\\-200.2578\\-163\\-164.2333\\-196.3516\\-163\\-163.9326\\-192.4453\\-163\\-163.6801\\-190.4922\\-163\\-163.1851\\-188.5391\\-163\\-162.5551\\-186.5859\\-163\\-161.8189\\-182.6797\\-163\\-161.1328\\-180.873\\-163\\-159.4597\\-176.8203\\-163\\-159.1797\\-176.4461\\-163\\-155.9663\\-170.9609\\-163\\-153.3203\\-167.3031\\-163\\-149.8241\\-163.1484\\-163\\-147.4609\\-160.585\\-163\\-145.5078\\-158.8353\\-163\\-141.3261\\-155.3359\\-163\\-137.6953\\-152.5873\\-163\\-135.7422\\-151.3477\\-163\\-133.7891\\-150.2247\\-163\\-131.8359\\-148.8389\\-163\\-129.8828\\-147.8804\\-163\\-127.9297\\-146.7632\\-163\\-125.9766\\-146.155\\-163\\-124.0234\\-145.0756\\-163\\-122.0703\\-144.431\\-163\\-120.1172\\-143.4178\\-163\\-116.2109\\-141.8834\\-163\\-114.2578\\-141.0071\\-163\\-112.3047\\-140.4934\\-163\\-110.3516\\-139.857\\-163\\-108.3984\\-139.0831\\-163\\-106.4453\\-138.6786\\-163\\-104.4922\\-138.1417\\-163\\-102.5391\\-137.2753\\-163\\-98.63281\\-136.2042\\-163\\-96.67969\\-135.3932\\-163\\-92.77344\\-134.4806\\-163\\-88.86719\\-133.2798\\-163\\-86.91406\\-132.9643\\-163\\-83.00781\\-132.5232\\-163\\-79.10156\\-131.6475\\-163\\-77.14844\\-131.2814\\-163\\-75.19531\\-131.0973\\-163\\-71.28906\\-130.8608\\-163\\-67.38281\\-130.7679\\-163\\-63.47656\\-130.7926\\-163\\-57.61719\\-131.058\\-163\\-55.66406\\-131.2251\\-163\\-53.71094\\-131.5166\\-163\\-51.75781\\-132.0952\\-163\\-49.80469\\-132.5155\\-163\\-45.89844\\-133.0691\\-163\\-43.94531\\-133.5965\\-163\\-41.99219\\-134.4763\\-163\\-40.03906\\-135.096\\-163\\-38.08594\\-136.1004\\-163\\-36.13281\\-136.9184\\-163\\-34.17969\\-138.0858\\-163\\-32.22656\\-139.0621\\-163\\-30.27344\\-140.4566\\-163\\-28.73283\\-141.6641\\-163\\-26.66708\\-143.6172\\-163\\-22.46094\\-147.9066\\-163\\-19.61946\\-151.4297\\-163\\-18.47141\\-153.3828\\-163\\-17.48101\\-155.3359\\-163\\-16.33708\\-157.2891\\-163\\-13.9719\\-163.1484\\-163\\-13.0598\\-167.0547\\-163\\-12.34209\\-169.0078\\-163\\-11.95427\\-170.9609\\-163\\-11.18665\\-178.7734\\-163\\-10.32624\\-182.6797\\-163\\-10.09971\\-184.6328\\-163\\-9.871572\\-188.5391\\-163\\-9.513775\\-192.4453\\-163\\-9.396575\\-194.3984\\-163\\-9.289109\\-198.3047\\-163\\-9.140115\\-206.1172\\-163\\-9.078664\\-211.9766\\-163\\-9.355918\\-217.8359\\-163\\-9.473179\\-221.7422\\-163\\-9.950508\\-229.5547\\-163\\-10.18025\\-231.5078\\-163\\-10.5806\\-233.4609\\-163\\-11.14695\\-235.4141\\-163\\-11.46376\\-237.3672\\-163\\-11.95427\\-241.2734\\-163\\-12.37916\\-243.2266\\-163\\-13.07091\\-245.1797\\-163\\-13.83846\\-249.0859\\-163\\-14.29036\\-251.0391\\-163\\-15.06958\\-252.9922\\-163\\-16.27604\\-256.8984\\-163\\-17.27598\\-258.8516\\-163\\-17.83539\\-260.8047\\-163\\-18.91043\\-262.7578\\-163\\-20.26013\\-266.6641\\-163\\-22.46094\\-270.7345\\-163\\-24.41406\\-274.1271\\-163\\-24.69829\\-274.4766\\-163\\-25.6633\\-276.4297\\-163\\-26.93899\\-278.3828\\-163\\-28.02459\\-280.3359\\-163\\-29.54889\\-282.2891\\-163\\-31.21405\\-284.2422\\-163\\-34.17969\\-288.0341\\-163\\-38.08594\\-291.9826\\-163\\-40.17857\\-294.0078\\-163\\-41.99219\\-295.2055\\-163\\-43.94531\\-296.6683\\-163\\-45.89844\\-297.9368\\-163\\-49.80469\\-300.2277\\-163\\-53.71094\\-301.5138\\-163\\-55.66406\\-302.3186\\-163\\-57.61719\\-302.7065\\-163\\-59.57031\\-302.98\\-163\\-65.42969\\-304.044\\-163\\-67.38281\\-304.2081\\-163\\-69.33594\\-304.2617\\-163\\-73.24219\\-304.1894\\-163\\-75.19531\\-304.0664\\-163" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "180" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.1646\\-163\\57.61719\\-301.5138\\-163\\53.71094\\-300.4924\\-163\\51.75781\\-299.5151\\-163\\49.80469\\-298.6384\\-163\\47.85156\\-297.3659\\-163\\45.89844\\-296.403\\-163\\42.28899\\-294.0078\\-163\\40.03906\\-292.4141\\-163\\36.13281\\-288.8605\\-163\\33.47736\\-286.1953\\-163\\31.83741\\-284.2422\\-163\\30.27344\\-282.2455\\-163\\27.34375\\-278.3828\\-163\\26.02466\\-276.4297\\-163\\25.02359\\-274.4766\\-163\\24.41406\\-273.7382\\-163\\22.40753\\-270.5703\\-163\\20.29803\\-266.6641\\-163\\19.61411\\-264.7109\\-163\\19.07854\\-262.7578\\-163\\18.12275\\-260.8047\\-163\\17.17169\\-256.8984\\-163\\16.33103\\-254.9453\\-163\\15.19739\\-251.0391\\-163\\14.28553\\-249.0859\\-163\\13.77589\\-247.1328\\-163\\12.86677\\-243.2266\\-163\\12.24002\\-241.2734\\-163\\11.89732\\-239.3203\\-163\\11.30281\\-233.4609\\-163\\10.36516\\-229.5547\\-163\\9.973204\\-225.6484\\-163\\9.61691\\-219.7891\\-163\\9.160156\\-213.9297\\-163\\8.942106\\-211.9766\\-163\\8.842889\\-210.0234\\-163\\8.766352\\-206.1172\\-163\\8.781433\\-204.1641\\-163\\8.926505\\-200.2578\\-163\\9.306408\\-194.3984\\-163\\9.522749\\-188.5391\\-163\\9.775061\\-184.6328\\-163\\10.2285\\-178.7734\\-163\\10.53049\\-176.8203\\-163\\11.02218\\-174.8672\\-163\\11.39884\\-172.9141\\-163\\12.03435\\-169.0078\\-163\\13.44883\\-165.1016\\-163\\13.92917\\-163.1484\\-163\\15.71038\\-159.2422\\-163\\16.87168\\-157.2891\\-163\\17.88364\\-155.3359\\-163\\19.1945\\-153.3828\\-163\\20.40375\\-151.4297\\-163\\21.92993\\-149.4766\\-163\\24.41406\\-146.7695\\-163\\27.80512\\-143.6172\\-163\\30.27344\\-141.6085\\-163\\34.17969\\-138.9754\\-163\\36.13281\\-138.0544\\-163\\38.08594\\-136.8666\\-163\\40.12451\\-135.8047\\-163\\41.99219\\-134.9837\\-163\\43.94531\\-134.3631\\-163\\45.89844\\-133.4371\\-163\\47.85156\\-132.9775\\-163\\51.75781\\-132.3669\\-163\\53.71094\\-131.7891\\-163\\55.66406\\-131.3509\\-163\\59.57031\\-130.9421\\-163\\63.47656\\-130.6994\\-163\\67.38281\\-130.5829\\-163\\71.28906\\-130.6301\\-163\\73.24219\\-130.7438\\-163\\75.19531\\-131.0421\\-163\\79.10156\\-131.3788\\-163\\81.05469\\-131.6015\\-163\\84.96094\\-132.4755\\-163\\90.82031\\-133.0642\\-163\\92.77344\\-133.3533\\-163\\94.72656\\-133.7663\\-163\\96.67969\\-134.33\\-163\\100.5859\\-135.0439\\-163\\102.5391\\-135.5323\\-163\\104.4922\\-136.3022\\-163\\108.3984\\-137.3463\\-163\\110.3516\\-138.1442\\-163\\112.3047\\-138.7057\\-163\\114.2578\\-139.062\\-163\\118.1641\\-140.3851\\-163\\120.1172\\-140.811\\-163\\122.0703\\-141.4952\\-163\\124.0234\\-142.3979\\-163\\125.9766\\-143.0798\\-163\\127.9297\\-144.1725\\-163\\129.8828\\-144.9012\\-163\\131.8359\\-146.0514\\-163\\133.7891\\-146.8353\\-163\\135.7422\\-148.1039\\-163\\137.6953\\-149.1487\\-163\\139.6484\\-150.622\\-163\\140.8936\\-151.4297\\-163\\141.6016\\-152.0544\\-163\\143.5547\\-153.3743\\-163\\145.5078\\-154.8062\\-163\\148.32\\-157.2891\\-163\\151.3672\\-160.2911\\-163\\153.905\\-163.1484\\-163\\155.4255\\-165.1016\\-163\\156.6476\\-167.0547\\-163\\157.2266\\-167.7595\\-163\\159.1797\\-170.8389\\-163\\161.522\\-174.8672\\-163\\162.2354\\-176.8203\\-163\\163.8224\\-180.7266\\-163\\164.2765\\-182.6797\\-163\\165.4644\\-186.5859\\-163\\166.0004\\-190.4922\\-163\\166.4265\\-194.3984\\-163\\166.923\\-200.2578\\-163\\167.0588\\-204.1641\\-163\\167.0298\\-206.1172\\-163\\166.8181\\-210.0234\\-163\\166.3392\\-215.8828\\-163\\165.7986\\-221.7422\\-163\\165.5587\\-223.6953\\-163\\165.2135\\-225.6484\\-163\\164.7044\\-227.6016\\-163\\163.6311\\-233.4609\\-163\\162.8698\\-235.4141\\-163\\162.2962\\-237.3672\\-163\\161.9177\\-239.3203\\-163\\161.202\\-241.2734\\-163\\160.3328\\-243.2266\\-163\\159.677\\-245.1797\\-163\\158.5305\\-247.1328\\-163\\157.7919\\-249.0859\\-163\\156.6115\\-251.0391\\-163\\155.9476\\-252.9922\\-163\\154.7126\\-254.9453\\-163\\153.7685\\-256.8984\\-163\\153.3203\\-257.4483\\-163\\151.3672\\-260.3417\\-163\\150.978\\-260.8047\\-163\\149.8504\\-262.7578\\-163\\147.4609\\-266.0663\\-163\\145.5078\\-268.4753\\-163\\143.5547\\-270.7864\\-163\\142.1724\\-272.5234\\-163\\139.6484\\-275.1344\\-163\\138.2025\\-276.4297\\-163\\135.7422\\-278.7921\\-163\\133.7891\\-280.51\\-163\\131.8359\\-281.8464\\-163\\128.8354\\-284.2422\\-163\\125.9766\\-286.4272\\-163\\124.0234\\-287.6534\\-163\\122.0703\\-288.981\\-163\\118.1641\\-291.2153\\-163\\116.2109\\-292.5703\\-163\\114.2578\\-293.4524\\-163\\112.3047\\-294.5938\\-163\\110.3516\\-295.2007\\-163\\108.3984\\-296.1459\\-163\\104.4922\\-297.5247\\-163\\102.5391\\-298.5121\\-163\\100.5859\\-299.0721\\-163\\98.54562\\-299.8672\\-163\\96.67969\\-300.4929\\-163\\92.77344\\-301.2433\\-163\\88.86719\\-302.2012\\-163\\86.91406\\-302.53\\-163\\84.96094\\-302.689\\-163\\79.10156\\-303.0133\\-163\\75.19531\\-303.172\\-163\\73.24219\\-303.1958\\-163\\69.33594\\-303.0637\\-163\\63.47656\\-302.7003\\-163\\61.52344\\-302.5222\\-163" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.8682\\-161\\-81.05469\\-303.2424\\-161\\-86.91406\\-302.6466\\-161\\-88.86719\\-302.3477\\-161\\-92.77344\\-301.293\\-161\\-96.67969\\-300.465\\-161\\-102.5391\\-298.2606\\-161\\-104.4922\\-297.1845\\-161\\-106.4453\\-296.553\\-161\\-108.3984\\-295.4361\\-161\\-110.3516\\-294.7198\\-161\\-112.3047\\-293.5164\\-161\\-114.2578\\-292.492\\-161\\-117.57\\-290.1016\\-161\\-118.1641\\-289.603\\-161\\-120.1172\\-288.577\\-161\\-122.0703\\-287.0459\\-161\\-125.9766\\-283.3854\\-161\\-127.4063\\-282.2891\\-161\\-129.8828\\-279.8858\\-161\\-131.2188\\-278.3828\\-161\\-133.1357\\-276.4297\\-161\\-134.9438\\-274.4766\\-161\\-136.5819\\-272.5234\\-161\\-139.6484\\-268.538\\-161\\-142.3815\\-264.7109\\-161\\-143.4026\\-262.7578\\-161\\-144.6006\\-260.8047\\-161\\-145.9227\\-258.8516\\-161\\-146.9534\\-256.8984\\-161\\-148.1841\\-254.9453\\-161\\-148.9702\\-252.9922\\-161\\-150.1169\\-251.0391\\-161\\-150.8494\\-249.0859\\-161\\-152.031\\-247.1328\\-161\\-152.8258\\-245.1797\\-161\\-153.9208\\-243.2266\\-161\\-154.5874\\-241.2734\\-161\\-155.5304\\-239.3203\\-161\\-156.1726\\-237.3672\\-161\\-156.6992\\-235.4141\\-161\\-157.6613\\-233.4609\\-161\\-158.2391\\-231.5078\\-161\\-158.9373\\-229.5547\\-161\\-159.7744\\-227.6016\\-161\\-160.8646\\-223.6953\\-161\\-161.5982\\-221.7422\\-161\\-162.0094\\-219.7891\\-161\\-162.6143\\-215.8828\\-161\\-163.1995\\-213.9297\\-161\\-163.6431\\-211.9766\\-161\\-163.883\\-210.0234\\-161\\-164.2314\\-206.1172\\-161\\-164.5146\\-202.2109\\-161\\-164.5917\\-198.3047\\-161\\-164.3204\\-194.3984\\-161\\-163.9147\\-190.4922\\-161\\-163.568\\-188.5391\\-161\\-162.9118\\-186.5859\\-161\\-162.3706\\-184.6328\\-161\\-162.0255\\-182.6797\\-161\\-161.4746\\-180.7266\\-161\\-160.5164\\-178.7734\\-161\\-159.782\\-176.8203\\-161\\-158.5032\\-174.8672\\-161\\-157.4288\\-172.9141\\-161\\-156.1862\\-170.9609\\-161\\-154.7654\\-169.0078\\-161\\-153.4641\\-167.0547\\-161\\-150.0583\\-163.1484\\-161\\-147.4609\\-160.3988\\-161\\-145.5078\\-158.6301\\-161\\-141.6016\\-155.2817\\-161\\-137.6953\\-152.4318\\-161\\-135.7422\\-151.1174\\-161\\-133.7891\\-150.0442\\-161\\-131.8359\\-148.6964\\-161\\-127.9297\\-146.6561\\-161\\-125.9766\\-146.0142\\-161\\-124.0234\\-144.9456\\-161\\-122.0703\\-144.3131\\-161\\-120.1172\\-143.2402\\-161\\-118.1641\\-142.5279\\-161\\-114.2578\\-140.9026\\-161\\-112.3047\\-140.3808\\-161\\-108.3984\\-138.962\\-161\\-106.4453\\-138.5716\\-161\\-104.4922\\-137.9016\\-161\\-102.5391\\-137.098\\-161\\-100.5859\\-136.6141\\-161\\-96.67969\\-135.2007\\-161\\-92.77344\\-134.2805\\-161\\-90.82031\\-133.6002\\-161\\-88.86719\\-133.1408\\-161\\-84.96094\\-132.6762\\-161\\-83.00781\\-132.3705\\-161\\-81.05469\\-131.8459\\-161\\-77.14844\\-131.1823\\-161\\-73.24219\\-130.8752\\-161\\-69.33594\\-130.7158\\-161\\-63.47656\\-130.7314\\-161\\-59.57031\\-130.8845\\-161\\-55.66406\\-131.1514\\-161\\-53.71094\\-131.4043\\-161\\-49.80469\\-132.418\\-161\\-45.89844\\-133.0136\\-161\\-43.94531\\-133.4819\\-161\\-41.99219\\-134.3906\\-161\\-40.03906\\-135.0334\\-161\\-36.13281\\-136.8763\\-161\\-34.17969\\-137.9925\\-161\\-32.22656\\-138.9622\\-161\\-28.49212\\-141.6641\\-161\\-26.44231\\-143.6172\\-161\\-22.46094\\-147.7656\\-161\\-19.55645\\-151.4297\\-161\\-18.31055\\-153.3828\\-161\\-17.37723\\-155.3359\\-161\\-16.20206\\-157.2891\\-161\\-15.44596\\-159.2422\\-161\\-14.58135\\-161.1953\\-161\\-13.94087\\-163.1484\\-161\\-12.98757\\-167.0547\\-161\\-12.25322\\-169.0078\\-161\\-11.89076\\-170.9609\\-161\\-11.31766\\-176.8203\\-161\\-11.04526\\-178.7734\\-161\\-10.20397\\-182.6797\\-161\\-10.00855\\-184.6328\\-161\\-9.784138\\-188.5391\\-161\\-9.496942\\-192.4453\\-161\\-9.384246\\-196.3516\\-161\\-9.349575\\-202.2109\\-161\\-9.185987\\-208.0703\\-161\\-9.188565\\-213.9297\\-161\\-9.38707\\-217.8359\\-161\\-9.52657\\-221.7422\\-161\\-9.862439\\-225.6484\\-161\\-9.863281\\-227.6016\\-161\\-10.2285\\-231.5078\\-161\\-11.2087\\-235.4141\\-161\\-12.00701\\-241.2734\\-161\\-12.52254\\-243.2266\\-161\\-13.1638\\-245.1797\\-161\\-13.88442\\-249.0859\\-161\\-14.32512\\-251.0391\\-161\\-15.11261\\-252.9922\\-161\\-15.72414\\-254.9453\\-161\\-16.46613\\-256.8984\\-161\\-17.38178\\-258.8516\\-161\\-17.95069\\-260.8047\\-161\\-19.02636\\-262.7578\\-161\\-19.62595\\-264.7109\\-161\\-20.43915\\-266.6641\\-161\\-21.46792\\-268.6172\\-161\\-24.41406\\-273.863\\-161\\-24.89224\\-274.4766\\-161\\-25.78922\\-276.4297\\-161\\-27.07351\\-278.3828\\-161\\-28.22414\\-280.3359\\-161\\-29.65431\\-282.2891\\-161\\-32.86683\\-286.1953\\-161\\-34.17969\\-287.9343\\-161\\-36.13281\\-289.8998\\-161\\-38.08594\\-291.9821\\-161\\-40.12277\\-294.0078\\-161\\-41.99219\\-295.2423\\-161\\-43.94531\\-296.7361\\-161\\-45.89844\\-298.0638\\-161\\-49.80469\\-300.3271\\-161\\-53.71094\\-301.6041\\-161\\-55.66406\\-302.37\\-161\\-59.57031\\-303.027\\-161\\-63.47656\\-303.7961\\-161\\-65.42969\\-304.1095\\-161\\-69.33594\\-304.2871\\-161\\-73.24219\\-304.2264\\-161\\-75.19531\\-304.12\\-161" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.2369\\-161\\57.61719\\-301.5927\\-161\\53.71094\\-300.5748\\-161\\49.80469\\-298.7261\\-161\\47.85156\\-297.4852\\-161\\45.89844\\-296.5217\\-161\\43.94531\\-295.1913\\-161\\42.04413\\-294.0078\\-161\\40.03906\\-292.5462\\-161\\35.2382\\-288.1484\\-161\\33.35286\\-286.1953\\-161\\30.16076\\-282.2891\\-161\\28.32031\\-279.8561\\-161\\25.91378\\-276.4297\\-161\\24.91259\\-274.4766\\-161\\24.41406\\-273.897\\-161\\22.22909\\-270.5703\\-161\\21.29245\\-268.6172\\-161\\20.18458\\-266.6641\\-161\\19.01307\\-262.7578\\-161\\18.01934\\-260.8047\\-161\\16.98589\\-256.8984\\-161\\16.11328\\-254.9453\\-161\\15.63965\\-252.9922\\-161\\15.03276\\-251.0391\\-161\\14.15094\\-249.0859\\-161\\13.29385\\-245.1797\\-161\\12.13458\\-241.2734\\-161\\11.84353\\-239.3203\\-161\\11.43895\\-235.4141\\-161\\11.11577\\-233.4609\\-161\\10.59358\\-231.5078\\-161\\10.21205\\-229.5547\\-161\\10.02441\\-227.6016\\-161\\9.494067\\-219.7891\\-161\\9.173388\\-215.8828\\-161\\8.766352\\-211.9766\\-161\\8.640455\\-210.0234\\-161\\8.57736\\-204.1641\\-161\\8.751502\\-200.2578\\-161\\9.25948\\-194.3984\\-161\\9.539103\\-188.5391\\-161\\10.23687\\-178.7734\\-161\\10.51839\\-176.8203\\-161\\11.0338\\-174.8672\\-161\\11.41357\\-172.9141\\-161\\12.03435\\-169.0078\\-161\\13.40942\\-165.1016\\-161\\13.88239\\-163.1484\\-161\\14.64844\\-161.2671\\-161\\15.66256\\-159.2422\\-161\\16.79402\\-157.2891\\-161\\17.79812\\-155.3359\\-161\\19.1215\\-153.3828\\-161\\20.31558\\-151.4297\\-161\\21.80364\\-149.4766\\-161\\24.41406\\-146.6593\\-161\\27.6331\\-143.6172\\-161\\30.27344\\-141.4127\\-161\\34.17969\\-138.8662\\-161\\39.75866\\-135.8047\\-161\\40.03906\\-135.6053\\-161\\43.94531\\-134.1232\\-161\\45.89844\\-133.2591\\-161\\49.80469\\-132.5679\\-161\\51.75781\\-132.1261\\-161\\53.71094\\-131.537\\-161\\55.66406\\-131.1943\\-161\\59.57031\\-130.8532\\-161\\61.52344\\-130.8174\\-161\\65.42969\\-130.5647\\-161\\67.38281\\-130.5571\\-161\\71.28906\\-130.7019\\-161\\79.10156\\-131.2352\\-161\\81.05469\\-131.4399\\-161\\83.00781\\-131.8313\\-161\\84.96094\\-132.3435\\-161\\86.91406\\-132.6146\\-161\\90.82031\\-132.9709\\-161\\92.77344\\-133.2152\\-161\\94.72656\\-133.5593\\-161\\96.67969\\-134.1417\\-161\\98.63281\\-134.5782\\-161\\102.5391\\-135.3134\\-161\\104.4922\\-136.071\\-161\\106.4453\\-136.6578\\-161\\108.3984\\-137.1348\\-161\\110.3516\\-137.9051\\-161\\112.3047\\-138.5678\\-161\\114.2578\\-138.9167\\-161\\116.2109\\-139.4267\\-161\\118.1641\\-140.2026\\-161\\120.1172\\-140.6816\\-161\\122.0703\\-141.2721\\-161\\124.0234\\-142.2195\\-161\\125.9766\\-142.9173\\-161\\127.9297\\-143.945\\-161\\129.8828\\-144.7158\\-161\\131.8359\\-145.7641\\-161\\133.7891\\-146.6618\\-161\\135.7422\\-147.8245\\-161\\137.6953\\-148.877\\-161\\141.6016\\-151.7969\\-161\\143.5547\\-153.0829\\-161\\145.5078\\-154.5736\\-161\\148.5021\\-157.2891\\-161\\151.3672\\-160.1254\\-161\\154.1451\\-163.1484\\-161\\155.6858\\-165.1016\\-161\\156.8585\\-167.0547\\-161\\157.2266\\-167.4897\\-161\\159.1797\\-170.5548\\-161\\159.5123\\-170.9609\\-161\\160.4701\\-172.9141\\-161\\161.656\\-174.8672\\-161\\162.3403\\-176.8203\\-161\\163.2709\\-178.7734\\-161\\163.9192\\-180.7266\\-161\\164.3823\\-182.6797\\-161\\165.0618\\-184.6328\\-161\\165.5963\\-186.5859\\-161\\166.58\\-194.3984\\-161\\166.9843\\-198.3047\\-161\\167.1276\\-200.2578\\-161\\167.2664\\-204.1641\\-161\\167.1805\\-208.0703\\-161\\167.0869\\-210.0234\\-161\\165.7195\\-223.6953\\-161\\165.4061\\-225.6484\\-161\\164.4129\\-229.5547\\-161\\163.6847\\-233.4609\\-161\\162.3352\\-237.3672\\-161\\161.9605\\-239.3203\\-161\\161.2882\\-241.2734\\-161\\160.3933\\-243.2266\\-161\\159.715\\-245.1797\\-161\\158.565\\-247.1328\\-161\\157.8193\\-249.0859\\-161\\156.6202\\-251.0391\\-161\\155.9602\\-252.9922\\-161\\154.7486\\-254.9453\\-161\\153.792\\-256.8984\\-161\\153.3203\\-257.4911\\-161\\151.3672\\-260.4192\\-161\\151.0392\\-260.8047\\-161\\149.8956\\-262.7578\\-161\\147.4609\\-266.0951\\-161\\142.1724\\-272.5234\\-161\\139.6484\\-275.1253\\-161\\138.1797\\-276.4297\\-161\\135.7422\\-278.7951\\-161\\133.7891\\-280.5388\\-161\\131.8359\\-281.8941\\-161\\128.9063\\-284.2422\\-161\\125.9766\\-286.5231\\-161\\122.0703\\-289.0323\\-161\\118.1641\\-291.2612\\-161\\116.2109\\-292.6323\\-161\\114.2578\\-293.5227\\-161\\112.3047\\-294.6526\\-161\\110.3516\\-295.249\\-161\\108.3984\\-296.2369\\-161\\104.4922\\-297.6301\\-161\\102.5391\\-298.5848\\-161\\100.5859\\-299.1485\\-161\\98.63281\\-299.9634\\-161\\96.67969\\-300.5548\\-161\\92.77344\\-301.293\\-161\\88.86719\\-302.2611\\-161\\86.91406\\-302.5646\\-161\\83.00781\\-302.84\\-161\\75.19531\\-303.2128\\-161\\71.28906\\-303.2302\\-161\\69.33594\\-303.144\\-161\\63.47656\\-302.7522\\-161\\61.52344\\-302.5765\\-161" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "181" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.9221\\-159\\-81.05469\\-303.2914\\-159\\-83.00781\\-303.0565\\-159\\-86.91406\\-302.689\\-159\\-88.86719\\-302.4139\\-159\\-92.77344\\-301.3619\\-159\\-96.67969\\-300.5589\\-159\\-98.63281\\-299.8903\\-159\\-100.5859\\-299.0534\\-159\\-102.5391\\-298.3877\\-159\\-104.4922\\-297.269\\-159\\-106.4453\\-296.6257\\-159\\-108.3984\\-295.5277\\-159\\-110.3516\\-294.7928\\-159\\-112.3047\\-293.5874\\-159\\-114.2578\\-292.5604\\-159\\-118.1641\\-289.6621\\-159\\-120.1172\\-288.6367\\-159\\-122.0703\\-287.0894\\-159\\-125.9766\\-283.5002\\-159\\-127.493\\-282.2891\\-159\\-129.8828\\-279.9815\\-159\\-131.3194\\-278.3828\\-159\\-133.2545\\-276.4297\\-159\\-135.7422\\-273.6875\\-159\\-137.6953\\-271.1719\\-159\\-139.8161\\-268.6172\\-159\\-141.1036\\-266.6641\\-159\\-142.5093\\-264.7109\\-159\\-144.7397\\-260.8047\\-159\\-146.103\\-258.8516\\-159\\-148.3392\\-254.9453\\-159\\-149.2233\\-252.9922\\-159\\-150.2708\\-251.0391\\-159\\-151.1361\\-249.0859\\-159\\-152.237\\-247.1328\\-159\\-154.1051\\-243.2266\\-159\\-154.7985\\-241.2734\\-159\\-155.785\\-239.3203\\-159\\-156.3155\\-237.3672\\-159\\-156.9843\\-235.4141\\-159\\-157.8829\\-233.4609\\-159\\-158.4432\\-231.5078\\-159\\-159.3541\\-229.5547\\-159\\-160.5067\\-225.6484\\-159\\-161.2312\\-223.6953\\-159\\-161.7942\\-221.7422\\-159\\-162.4453\\-217.8359\\-159\\-162.9132\\-215.8828\\-159\\-163.5164\\-213.9297\\-159\\-163.8318\\-211.9766\\-159\\-164.2589\\-208.0703\\-159\\-164.8452\\-202.2109\\-159\\-164.9558\\-198.3047\\-159\\-164.3638\\-192.4453\\-159\\-163.8156\\-188.5391\\-159\\-163.3599\\-186.5859\\-159\\-162.611\\-184.6328\\-159\\-161.7479\\-180.7266\\-159\\-160.0018\\-176.8203\\-159\\-157.7272\\-172.9141\\-159\\-155.0038\\-169.0078\\-159\\-153.7598\\-167.0547\\-159\\-149.4141\\-162.2509\\-159\\-147.4609\\-160.2391\\-159\\-141.6016\\-155.0009\\-159\\-139.6484\\-153.7411\\-159\\-135.7422\\-150.9477\\-159\\-133.7891\\-149.8552\\-159\\-131.8359\\-148.5705\\-159\\-129.8828\\-147.4679\\-159\\-127.9297\\-146.565\\-159\\-125.9766\\-145.8293\\-159\\-124.0234\\-144.8277\\-159\\-122.0703\\-144.1884\\-159\\-120.1172\\-143.1035\\-159\\-118.1641\\-142.402\\-159\\-116.2109\\-141.4603\\-159\\-114.2578\\-140.7915\\-159\\-112.3047\\-140.2477\\-159\\-110.3516\\-139.4267\\-159\\-108.3984\\-138.8681\\-159\\-106.4453\\-138.4537\\-159\\-104.4922\\-137.6357\\-159\\-102.5391\\-136.9653\\-159\\-100.5859\\-136.4576\\-159\\-98.63281\\-135.6177\\-159\\-96.67969\\-135.0655\\-159\\-94.72656\\-134.6181\\-159\\-92.77344\\-134.0629\\-159\\-90.82031\\-133.4034\\-159\\-88.86719\\-133.0378\\-159\\-84.96094\\-132.5985\\-159\\-83.00781\\-132.2378\\-159\\-81.05469\\-131.6837\\-159\\-77.14844\\-131.1201\\-159\\-75.19531\\-130.9451\\-159\\-71.28906\\-130.7137\\-159\\-67.38281\\-130.6289\\-159\\-63.47656\\-130.6853\\-159\\-59.57031\\-130.8266\\-159\\-55.66406\\-131.1012\\-159\\-53.71094\\-131.3114\\-159\\-51.75781\\-131.762\\-159\\-49.80469\\-132.3244\\-159\\-45.89844\\-132.9654\\-159\\-43.94531\\-133.3836\\-159\\-41.99219\\-134.3201\\-159\\-40.03906\\-134.9826\\-159\\-38.19719\\-135.8047\\-159\\-36.13281\\-136.8432\\-159\\-34.17969\\-137.9774\\-159\\-32.22656\\-138.9464\\-159\\-28.38604\\-141.6641\\-159\\-26.25775\\-143.6172\\-159\\-22.46094\\-147.7378\\-159\\-19.55645\\-151.4297\\-159\\-18.27272\\-153.3828\\-159\\-17.35233\\-155.3359\\-159\\-16.14092\\-157.2891\\-159\\-15.41103\\-159.2422\\-159\\-14.55226\\-161.1953\\-159\\-13.92183\\-163.1484\\-159\\-12.96099\\-167.0547\\-159\\-12.22997\\-169.0078\\-159\\-11.87785\\-170.9609\\-159\\-11.25458\\-176.8203\\-159\\-10.46036\\-180.7266\\-159\\-10.12074\\-182.6797\\-159\\-9.943182\\-184.6328\\-159\\-9.703998\\-188.5391\\-159\\-9.520206\\-192.4453\\-159\\-9.463103\\-196.3516\\-159\\-9.512247\\-202.2109\\-159\\-9.309506\\-208.0703\\-159\\-9.358724\\-210.0234\\-159\\-9.265287\\-213.9297\\-159\\-9.479929\\-219.7891\\-159\\-9.90576\\-225.6484\\-159\\-9.928386\\-227.6016\\-159\\-10.36516\\-231.5078\\-159\\-10.88066\\-233.4609\\-159\\-11.29597\\-235.4141\\-159\\-11.80413\\-239.3203\\-159\\-12.10814\\-241.2734\\-159\\-12.75044\\-243.2266\\-159\\-13.28891\\-245.1797\\-159\\-13.96833\\-249.0859\\-159\\-14.44615\\-251.0391\\-159\\-15.26019\\-252.9922\\-159\\-15.84371\\-254.9453\\-159\\-16.72454\\-256.8984\\-159\\-17.49342\\-258.8516\\-159\\-18.11023\\-260.8047\\-159\\-19.16105\\-262.7578\\-159\\-19.72297\\-264.7109\\-159\\-21.58746\\-268.6172\\-159\\-22.78426\\-270.5703\\-159\\-23.74752\\-272.5234\\-159\\-25.03319\\-274.4766\\-159\\-25.90315\\-276.4297\\-159\\-28.32031\\-280.1747\\-159\\-29.77856\\-282.2891\\-159\\-32.96371\\-286.1953\\-159\\-34.17969\\-287.8201\\-159\\-36.13281\\-289.8125\\-159\\-38.08594\\-291.9498\\-159\\-40.10417\\-294.0078\\-159\\-41.99219\\-295.2625\\-159\\-43.94531\\-296.7989\\-159\\-45.89844\\-298.1548\\-159\\-47.85156\\-299.2102\\-159\\-49.80469\\-300.3835\\-159\\-51.75781\\-300.9875\\-159\\-55.66406\\-302.4315\\-159\\-59.57031\\-303.0669\\-159\\-63.47656\\-303.8682\\-159\\-65.42969\\-304.1404\\-159\\-69.33594\\-304.3196\\-159\\-73.24219\\-304.2531\\-159\\-75.19531\\-304.1404\\-159" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "163" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.3053\\-159\\57.61719\\-301.6754\\-159\\53.71094\\-300.6357\\-159\\49.80469\\-298.7956\\-159\\47.85156\\-297.6002\\-159\\45.89844\\-296.6181\\-159\\43.94531\\-295.2728\\-159\\41.99219\\-294.1528\\-159\\40.03906\\-292.6522\\-159\\35.12186\\-288.1484\\-159\\33.26095\\-286.1953\\-159\\30.03294\\-282.2891\\-159\\28.32031\\-279.9959\\-159\\25.81202\\-276.4297\\-159\\24.79186\\-274.4766\\-159\\24.41406\\-274.0453\\-159\\22.46094\\-270.9819\\-159\\22.12213\\-270.5703\\-159\\21.23442\\-268.6172\\-159\\20.10257\\-266.6641\\-159\\18.94395\\-262.7578\\-159\\17.92769\\-260.8047\\-159\\17.43214\\-258.8516\\-159\\16.75236\\-256.8984\\-159\\15.96264\\-254.9453\\-159\\15.50603\\-252.9922\\-159\\14.86314\\-251.0391\\-159\\14.06371\\-249.0859\\-159\\13.22266\\-245.1797\\-159\\12.57997\\-243.2266\\-159\\12.0503\\-241.2734\\-159\\11.34536\\-235.4141\\-159\\10.9489\\-233.4609\\-159\\10.41667\\-231.5078\\-159\\10.10665\\-229.5547\\-159\\9.253231\\-217.8359\\-159\\8.640455\\-211.9766\\-159\\8.553341\\-210.0234\\-159\\8.4851\\-204.1641\\-159\\8.627473\\-200.2578\\-159\\9.193372\\-194.3984\\-159\\10.24534\\-178.7734\\-159\\10.54275\\-176.8203\\-159\\11.13669\\-174.8672\\-159\\12.07886\\-169.0078\\-159\\13.38935\\-165.1016\\-159\\13.84523\\-163.1484\\-159\\14.62555\\-161.1953\\-159\\15.61433\\-159.2422\\-159\\17.73999\\-155.3359\\-159\\19.06389\\-153.3828\\-159\\20.21708\\-151.4297\\-159\\21.736\\-149.4766\\-159\\24.41406\\-146.5746\\-159\\28.32031\\-142.8973\\-159\\30.27344\\-141.2858\\-159\\32.631\\-139.7109\\-159\\36.13281\\-137.6485\\-159\\38.08594\\-136.6378\\-159\\40.03906\\-135.4559\\-159\\41.99219\\-134.756\\-159\\45.89844\\-133.1487\\-159\\49.80469\\-132.4317\\-159\\51.75781\\-131.8313\\-159\\53.71094\\-131.3509\\-159\\55.66406\\-131.0521\\-159\\59.57031\\-130.7574\\-159\\61.52344\\-130.7318\\-159\\65.42969\\-130.5346\\-159\\67.38281\\-130.5267\\-159\\71.28906\\-130.6945\\-159\\75.19531\\-130.9122\\-159\\79.10156\\-131.185\\-159\\81.05469\\-131.3704\\-159\\83.00781\\-131.6715\\-159\\84.96094\\-132.2005\\-159\\86.91406\\-132.5515\\-159\\92.77344\\-133.113\\-159\\94.72656\\-133.4034\\-159\\98.63281\\-134.435\\-159\\102.5391\\-135.1777\\-159\\106.4453\\-136.4944\\-159\\108.3984\\-136.9413\\-159\\110.3516\\-137.5708\\-159\\112.3047\\-138.4068\\-159\\116.2109\\-139.243\\-159\\118.1641\\-140.0317\\-159\\122.0703\\-141.114\\-159\\124.0234\\-142.0376\\-159\\125.9766\\-142.7733\\-159\\131.8359\\-145.4688\\-159\\133.7891\\-146.5667\\-159\\135.7422\\-147.4988\\-159\\137.6953\\-148.6896\\-159\\139.6484\\-150.1799\\-159\\143.5547\\-152.8521\\-159\\145.5078\\-154.4026\\-159\\148.6656\\-157.2891\\-159\\153.3203\\-161.993\\-159\\155.8676\\-165.1016\\-159\\158.352\\-169.0078\\-159\\159.7106\\-170.9609\\-159\\160.691\\-172.9141\\-159\\161.8178\\-174.8672\\-159\\162.4824\\-176.8203\\-159\\163.4318\\-178.7734\\-159\\164.4766\\-182.6797\\-159\\165.2261\\-184.6328\\-159\\165.6954\\-186.5859\\-159\\166.4622\\-192.4453\\-159\\167.1276\\-198.3047\\-159\\167.3479\\-202.2109\\-159\\167.4017\\-204.1641\\-159\\167.3479\\-208.0703\\-159\\167.1143\\-211.9766\\-159\\166.212\\-219.7891\\-159\\165.793\\-223.6953\\-159\\165.5099\\-225.6484\\-159\\164.4853\\-229.5547\\-159\\163.7351\\-233.4609\\-159\\162.3752\\-237.3672\\-159\\161.9843\\-239.3203\\-159\\161.341\\-241.2734\\-159\\160.4189\\-243.2266\\-159\\159.7319\\-245.1797\\-159\\158.5926\\-247.1328\\-159\\157.8271\\-249.0859\\-159\\156.6202\\-251.0391\\-159\\155.9683\\-252.9922\\-159\\154.7619\\-254.9453\\-159\\153.802\\-256.8984\\-159\\153.3203\\-257.513\\-159\\149.9057\\-262.7578\\-159\\147.4609\\-266.0881\\-159\\145.5078\\-268.493\\-159\\142.1487\\-272.5234\\-159\\139.6484\\-275.098\\-159\\138.149\\-276.4297\\-159\\135.7422\\-278.7573\\-159\\133.7891\\-280.5403\\-159\\131.8359\\-281.9057\\-159\\128.9524\\-284.2422\\-159\\125.9766\\-286.5769\\-159\\120.1172\\-290.2785\\-159\\118.1641\\-291.3082\\-159\\116.2109\\-292.6724\\-159\\114.2578\\-293.5774\\-159\\112.3047\\-294.7018\\-159\\110.3516\\-295.2907\\-159\\108.3984\\-296.3092\\-159\\106.4453\\-296.9637\\-159\\104.4922\\-297.7319\\-159\\102.5391\\-298.6478\\-159\\100.5859\\-299.233\\-159\\98.63281\\-300.0695\\-159\\96.67969\\-300.6039\\-159\\92.77344\\-301.3254\\-159\\88.86719\\-302.325\\-159\\84.96094\\-302.7469\\-159\\75.19531\\-303.2604\\-159\\71.28906\\-303.282\\-159\\67.38281\\-303.0898\\-159\\61.52344\\-302.6214\\-159" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "174" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.9851\\-157\\-81.05469\\-303.3633\\-157\\-83.00781\\-303.1013\\-157\\-86.91406\\-302.7239\\-157\\-88.86719\\-302.4734\\-157\\-90.82031\\-302.0497\\-157\\-92.77344\\-301.4447\\-157\\-96.67969\\-300.6312\\-157\\-98.63281\\-300.0454\\-157\\-100.5859\\-299.1348\\-157\\-102.5391\\-298.4888\\-157\\-104.4922\\-297.364\\-157\\-106.4453\\-296.6862\\-157\\-108.3984\\-295.6117\\-157\\-110.3516\\-294.8422\\-157\\-112.3047\\-293.6643\\-157\\-114.2578\\-292.6036\\-157\\-118.1641\\-289.6982\\-157\\-120.1172\\-288.6805\\-157\\-122.0703\\-287.1215\\-157\\-124.0234\\-285.2981\\-157\\-125.9766\\-283.5757\\-157\\-127.5635\\-282.2891\\-157\\-129.8828\\-280.0858\\-157\\-131.4321\\-278.3828\\-157\\-133.7891\\-275.9914\\-157\\-135.7422\\-273.8176\\-157\\-137.6953\\-271.3175\\-157\\-140.0104\\-268.6172\\-157\\-143.8802\\-262.7578\\-157\\-144.9181\\-260.8047\\-157\\-146.268\\-258.8516\\-157\\-147.469\\-256.8984\\-157\\-149.4141\\-253.1898\\-157\\-150.42\\-251.0391\\-157\\-151.4757\\-249.0859\\-157\\-152.4143\\-247.1328\\-157\\-153.4867\\-245.1797\\-157\\-155.0722\\-241.2734\\-157\\-155.9683\\-239.3203\\-157\\-156.4636\\-237.3672\\-157\\-157.3486\\-235.4141\\-157\\-158.0773\\-233.4609\\-157\\-158.6794\\-231.5078\\-157\\-159.6472\\-229.5547\\-157\\-160.7487\\-225.6484\\-157\\-161.5058\\-223.6953\\-157\\-161.9605\\-221.7422\\-157\\-162.6275\\-217.8359\\-157\\-163.2561\\-215.8828\\-157\\-163.7275\\-213.9297\\-157\\-164.6979\\-206.1172\\-157\\-165.2508\\-202.2109\\-157\\-165.332\\-198.3047\\-157\\-165.1877\\-196.3516\\-157\\-164.3273\\-190.4922\\-157\\-163.6635\\-186.5859\\-157\\-162.9542\\-184.6328\\-157\\-162.3628\\-182.6797\\-157\\-161.9374\\-180.7266\\-157\\-161.2037\\-178.7734\\-157\\-159.2024\\-174.8672\\-157\\-157.2266\\-171.8604\\-157\\-156.5337\\-170.9609\\-157\\-155.3784\\-169.0078\\-157\\-153.978\\-167.0547\\-157\\-151.3672\\-164.2597\\-157\\-149.4141\\-162.0951\\-157\\-147.4609\\-160.111\\-157\\-141.6016\\-154.8075\\-157\\-137.6953\\-152.2122\\-157\\-135.7422\\-150.8088\\-157\\-129.8828\\-147.3073\\-157\\-125.9766\\-145.6577\\-157\\-124.0234\\-144.7422\\-157\\-122.0703\\-144.0461\\-157\\-120.1172\\-142.9928\\-157\\-118.1641\\-142.2977\\-157\\-116.2109\\-141.312\\-157\\-112.3047\\-140.1457\\-157\\-110.3516\\-139.2885\\-157\\-106.4453\\-138.3326\\-157\\-104.4922\\-137.443\\-157\\-100.5859\\-136.2989\\-157\\-98.63281\\-135.4228\\-157\\-94.72656\\-134.4884\\-157\\-90.82031\\-133.2669\\-157\\-88.86719\\-132.9469\\-157\\-84.96094\\-132.5754\\-157\\-83.00781\\-132.2216\\-157\\-81.05469\\-131.6962\\-157\\-77.14844\\-131.0445\\-157\\-71.28906\\-130.6588\\-157\\-67.38281\\-130.584\\-157\\-63.47656\\-130.6294\\-157\\-59.57031\\-130.7817\\-157\\-55.66406\\-131.0527\\-157\\-53.71094\\-131.2669\\-157\\-51.75781\\-131.6715\\-157\\-49.80469\\-132.2823\\-157\\-45.89844\\-132.9229\\-157\\-43.94531\\-133.3267\\-157\\-41.99219\\-134.2759\\-157\\-40.03906\\-134.9385\\-157\\-38.0983\\-135.8047\\-157\\-32.22656\\-138.9436\\-157\\-28.36772\\-141.6641\\-157\\-26.24199\\-143.6172\\-157\\-22.46094\\-147.7833\\-157\\-19.60011\\-151.4297\\-157\\-18.33371\\-153.3828\\-157\\-17.37046\\-155.3359\\-157\\-16.15037\\-157.2891\\-157\\-15.42201\\-159.2422\\-157\\-14.55226\\-161.1953\\-157\\-13.89858\\-163.1484\\-157\\-12.94849\\-167.0547\\-157\\-12.25021\\-169.0078\\-157\\-11.88427\\-170.9609\\-157\\-11.49053\\-174.8672\\-157\\-11.23657\\-176.8203\\-157\\-10.74219\\-178.9362\\-157\\-10.09285\\-182.6797\\-157\\-9.689405\\-188.5391\\-157\\-9.563229\\-192.4453\\-157\\-9.557088\\-194.3984\\-157\\-9.658737\\-198.3047\\-157\\-9.61691\\-204.1641\\-157\\-9.412518\\-208.0703\\-157\\-9.303977\\-213.9297\\-157\\-9.39464\\-217.8359\\-157\\-9.640548\\-221.7422\\-157\\-9.941949\\-225.6484\\-157\\-10.02185\\-227.6016\\-157\\-10.22023\\-229.5547\\-157\\-10.5678\\-231.5078\\-157\\-11.08724\\-233.4609\\-157\\-11.39884\\-235.4141\\-157\\-11.86688\\-239.3203\\-157\\-12.25021\\-241.2734\\-157\\-12.93581\\-243.2266\\-157\\-13.39374\\-245.1797\\-157\\-14.07434\\-249.0859\\-157\\-14.64844\\-250.9805\\-157\\-15.43899\\-252.9922\\-157\\-15.96998\\-254.9453\\-157\\-16.93359\\-256.8984\\-157\\-18.31055\\-260.8047\\-157\\-19.28101\\-262.7578\\-157\\-19.82606\\-264.7109\\-157\\-20.84894\\-266.6641\\-157\\-21.69834\\-268.6172\\-157\\-22.95532\\-270.5703\\-157\\-23.85365\\-272.5234\\-157\\-25.15259\\-274.4766\\-157\\-26.03924\\-276.4297\\-157\\-29.93406\\-282.2891\\-157\\-33.01411\\-286.1953\\-157\\-34.17969\\-287.7394\\-157\\-36.13281\\-289.7335\\-157\\-40.08556\\-294.0078\\-157\\-41.99219\\-295.2994\\-157\\-43.94531\\-296.831\\-157\\-45.89844\\-298.2037\\-157\\-47.85156\\-299.2501\\-157\\-49.80469\\-300.4138\\-157\\-51.75781\\-301.0306\\-157\\-55.66406\\-302.4693\\-157\\-59.57031\\-303.1049\\-157\\-63.47656\\-303.9221\\-157\\-65.42969\\-304.1702\\-157\\-67.38281\\-304.2954\\-157\\-71.28906\\-304.3354\\-157\\-75.19531\\-304.1702\\-157" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "180" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.3477\\-157\\55.66406\\-301.1672\\-157\\53.71094\\-300.6819\\-157\\51.7985\\-299.8672\\-157\\49.80469\\-298.8484\\-157\\47.85156\\-297.7158\\-157\\45.89844\\-296.6903\\-157\\43.94531\\-295.3431\\-157\\41.99219\\-294.2501\\-157\\40.03906\\-292.7451\\-157\\35.03158\\-288.1484\\-157\\33.17759\\-286.1953\\-157\\29.91769\\-282.2891\\-157\\28.32031\\-280.1317\\-157\\25.72692\\-276.4297\\-157\\24.41406\\-274.1963\\-157\\22.46094\\-271.0906\\-157\\22.04333\\-270.5703\\-157\\21.16878\\-268.6172\\-157\\20.03255\\-266.6641\\-157\\18.88489\\-262.7578\\-157\\17.87324\\-260.8047\\-157\\17.34044\\-258.8516\\-157\\16.50682\\-256.8984\\-157\\15.85303\\-254.9453\\-157\\15.38732\\-252.9922\\-157\\13.99148\\-249.0859\\-157\\13.14041\\-245.1797\\-157\\12.45482\\-243.2266\\-157\\11.98774\\-241.2734\\-157\\11.54549\\-237.3672\\-157\\11.26664\\-235.4141\\-157\\10.2983\\-231.5078\\-157\\9.86649\\-227.6016\\-157\\9.487357\\-221.7422\\-157\\9.173388\\-217.8359\\-157\\8.666992\\-213.9297\\-157\\8.565267\\-211.9766\\-157\\8.44254\\-206.1172\\-157\\8.463542\\-202.2109\\-157\\8.694322\\-198.3047\\-157\\9.112384\\-194.3984\\-157\\9.372543\\-192.4453\\-157\\9.480575\\-190.4922\\-157\\9.807478\\-186.5859\\-157\\10.08606\\-180.7266\\-157\\10.28022\\-178.7734\\-157\\10.66142\\-176.8203\\-157\\11.25776\\-174.8672\\-157\\11.82666\\-170.9609\\-157\\12.17831\\-169.0078\\-157\\12.85306\\-167.0547\\-157\\13.40942\\-165.1016\\-157\\13.84995\\-163.1484\\-157\\14.62555\\-161.1953\\-157\\15.59333\\-159.2422\\-157\\17.70154\\-155.3359\\-157\\19.01802\\-153.3828\\-157\\20.12156\\-151.4297\\-157\\21.69279\\-149.4766\\-157\\24.41406\\-146.5192\\-157\\27.43936\\-143.6172\\-157\\30.27344\\-141.1554\\-157\\32.51852\\-139.7109\\-157\\36.13281\\-137.5069\\-157\\38.08594\\-136.5667\\-157\\40.03906\\-135.3563\\-157\\41.99219\\-134.65\\-157\\43.94531\\-133.7516\\-157\\45.89844\\-133.0691\\-157\\49.80469\\-132.2877\\-157\\51.75781\\-131.5904\\-157\\53.71094\\-131.1701\\-157\\55.66406\\-130.9117\\-157\\59.57031\\-130.6474\\-157\\67.38281\\-130.4796\\-157\\71.28906\\-130.6331\\-157\\75.19531\\-130.8486\\-157\\81.05469\\-131.3114\\-157\\83.00781\\-131.5904\\-157\\86.91406\\-132.5754\\-157\\88.86719\\-132.8221\\-157\\92.77344\\-133.0691\\-157\\94.72656\\-133.2835\\-157\\96.67969\\-133.7229\\-157\\98.63281\\-134.3138\\-157\\102.5391\\-135.0655\\-157\\104.4922\\-135.5809\\-157\\106.4453\\-136.3433\\-157\\108.3984\\-136.7865\\-157\\110.3516\\-137.3411\\-157\\112.3047\\-138.2299\\-157\\114.2578\\-138.7121\\-157\\116.2109\\-139.0958\\-157\\118.1641\\-139.8272\\-157\\120.1172\\-140.4524\\-157\\122.0703\\-140.9758\\-157\\127.9297\\-143.4178\\-157\\129.8828\\-144.4681\\-157\\131.8359\\-145.2401\\-157\\133.7891\\-146.4451\\-157\\135.7422\\-147.2476\\-157\\137.6953\\-148.517\\-157\\139.6484\\-149.9902\\-157\\141.6016\\-151.2528\\-157\\143.5547\\-152.7157\\-157\\146.7285\\-155.3359\\-157\\148.8193\\-157.2891\\-157\\152.7843\\-161.1953\\-157\\154.478\\-163.1484\\-157\\156.0241\\-165.1016\\-157\\157.362\\-167.0547\\-157\\158.5685\\-169.0078\\-157\\159.9136\\-170.9609\\-157\\161.1328\\-173.0981\\-157\\161.9576\\-174.8672\\-157\\162.6496\\-176.8203\\-157\\163.5898\\-178.7734\\-157\\164.534\\-182.6797\\-157\\165.2865\\-184.6328\\-157\\165.7469\\-186.5859\\-157\\166.5645\\-192.4453\\-157\\167.1691\\-198.3047\\-157\\167.4269\\-202.2109\\-157\\167.4744\\-206.1172\\-157\\167.4434\\-208.0703\\-157\\167.2531\\-211.9766\\-157\\167.0444\\-213.9297\\-157\\166.5286\\-217.8359\\-157\\165.8372\\-223.6953\\-157\\165.5692\\-225.6484\\-157\\165.1198\\-227.6016\\-157\\164.5235\\-229.5547\\-157\\163.7684\\-233.4609\\-157\\162.4036\\-237.3672\\-157\\161.9962\\-239.3203\\-157\\161.3805\\-241.2734\\-157\\160.4304\\-243.2266\\-157\\159.7402\\-245.1797\\-157\\158.6008\\-247.1328\\-157\\157.8306\\-249.0859\\-157\\156.6241\\-251.0391\\-157\\155.952\\-252.9922\\-157\\154.739\\-254.9453\\-157\\153.792\\-256.8984\\-157\\153.3203\\-257.4962\\-157\\151.3672\\-260.4565\\-157\\151.0639\\-260.8047\\-157\\149.9192\\-262.7578\\-157\\148.5072\\-264.7109\\-157\\145.5078\\-268.4613\\-157\\143.5547\\-270.7185\\-157\\142.0898\\-272.5234\\-157\\139.6484\\-275.0474\\-157\\138.0781\\-276.4297\\-157\\136.0808\\-278.3828\\-157\\133.7891\\-280.5087\\-157\\131.8359\\-281.9057\\-157\\128.9749\\-284.2422\\-157\\125.9766\\-286.6102\\-157\\120.1172\\-290.3285\\-157\\118.1641\\-291.3336\\-157\\116.2109\\-292.7076\\-157\\114.2578\\-293.6004\\-157\\112.3047\\-294.7141\\-157\\110.3516\\-295.3249\\-157\\108.3984\\-296.3556\\-157\\106.4453\\-296.9797\\-157\\102.5391\\-298.6817\\-157\\100.5859\\-299.2985\\-157\\98.63281\\-300.1199\\-157\\96.67969\\-300.6337\\-157\\92.77344\\-301.3691\\-157\\88.86719\\-302.3477\\-157\\84.96094\\-302.7638\\-157\\77.14844\\-303.1923\\-157\\73.24219\\-303.343\\-157\\69.33594\\-303.2514\\-157\\63.47656\\-302.8293\\-157\\61.52344\\-302.6533\\-157" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "179" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-303.4525\\-155\\-84.96094\\-302.9156\\-155\\-88.86719\\-302.5377\\-155\\-90.82031\\-302.1529\\-155\\-92.77344\\-301.5302\\-155\\-96.67969\\-300.7018\\-155\\-98.63281\\-300.1568\\-155\\-100.5859\\-299.2218\\-155\\-102.5391\\-298.5633\\-155\\-104.4922\\-297.4451\\-155\\-106.4453\\-296.7433\\-155\\-108.3984\\-295.7\\-155\\-110.3516\\-294.8806\\-155\\-114.2578\\-292.6464\\-155\\-118.1641\\-289.759\\-155\\-120.1172\\-288.7131\\-155\\-122.0703\\-287.1593\\-155\\-125.9766\\-283.6428\\-155\\-127.6687\\-282.2891\\-155\\-129.8828\\-280.2097\\-155\\-131.5384\\-278.3828\\-155\\-133.5178\\-276.4297\\-155\\-135.7422\\-274.0008\\-155\\-136.7835\\-272.5234\\-155\\-140.1531\\-268.6172\\-155\\-141.6016\\-266.5115\\-155\\-144.056\\-262.7578\\-155\\-145.1407\\-260.8047\\-155\\-145.5078\\-260.3384\\-155\\-147.7306\\-256.8984\\-155\\-148.6316\\-254.9453\\-155\\-149.7977\\-252.9922\\-155\\-150.5564\\-251.0391\\-155\\-151.7515\\-249.0859\\-155\\-152.595\\-247.1328\\-155\\-153.7452\\-245.1797\\-155\\-154.4457\\-243.2266\\-155\\-155.3758\\-241.2734\\-155\\-156.1114\\-239.3203\\-155\\-156.633\\-237.3672\\-155\\-157.633\\-235.4141\\-155\\-158.2591\\-233.4609\\-155\\-158.9886\\-231.5078\\-155\\-159.8578\\-229.5547\\-155\\-160.3636\\-227.6016\\-155\\-161.7188\\-223.6953\\-155\\-162.4005\\-219.7891\\-155\\-162.8698\\-217.8359\\-155\\-163.5264\\-215.8828\\-155\\-163.8787\\-213.9297\\-155\\-164.3824\\-210.0234\\-155\\-165.3539\\-204.1641\\-155\\-165.5187\\-202.2109\\-155\\-165.5692\\-198.3047\\-155\\-165.4738\\-196.3516\\-155\\-164.9857\\-192.4453\\-155\\-164.5631\\-190.4922\\-155\\-163.8683\\-186.5859\\-155\\-163.3459\\-184.6328\\-155\\-162.5682\\-182.6797\\-155\\-162.0911\\-180.7266\\-155\\-161.4911\\-178.7734\\-155\\-160.4062\\-176.8203\\-155\\-159.4966\\-174.8672\\-155\\-157.2266\\-171.5923\\-155\\-156.7108\\-170.9609\\-155\\-155.6568\\-169.0078\\-155\\-154.1471\\-167.0547\\-155\\-150.4957\\-163.1484\\-155\\-149.4141\\-161.9189\\-155\\-146.6957\\-159.2422\\-155\\-145.5078\\-158.2535\\-155\\-141.6016\\-154.6698\\-155\\-139.6484\\-153.2647\\-155\\-137.6953\\-152.131\\-155\\-135.7422\\-150.7031\\-155\\-130.3613\\-147.5234\\-155\\-129.8828\\-147.1792\\-155\\-127.9297\\-146.4309\\-155\\-124.0234\\-144.6667\\-155\\-122.0703\\-143.8912\\-155\\-120.1172\\-142.8874\\-155\\-118.1641\\-142.1829\\-155\\-116.2109\\-141.1915\\-155\\-112.3047\\-140.0294\\-155\\-110.3516\\-139.1765\\-155\\-106.4453\\-138.1867\\-155\\-104.4922\\-137.2813\\-155\\-102.5391\\-136.7761\\-155\\-100.5859\\-136.1148\\-155\\-98.63281\\-135.2673\\-155\\-94.72656\\-134.3591\\-155\\-92.77344\\-133.6418\\-155\\-90.82031\\-133.1736\\-155\\-88.86719\\-132.8929\\-155\\-84.96094\\-132.5188\\-155\\-83.00781\\-132.1764\\-155\\-81.05469\\-131.6475\\-155\\-79.10156\\-131.2562\\-155\\-77.14844\\-130.9823\\-155\\-73.24219\\-130.7098\\-155\\-69.33594\\-130.555\\-155\\-63.47656\\-130.5658\\-155\\-57.61719\\-130.8515\\-155\\-53.71094\\-131.2184\\-155\\-51.75781\\-131.5904\\-155\\-49.80469\\-132.2354\\-155\\-47.85156\\-132.6294\\-155\\-45.89844\\-132.8929\\-155\\-43.94531\\-133.2945\\-155\\-41.99219\\-134.2408\\-155\\-40.03906\\-134.9214\\-155\\-38.08594\\-135.7818\\-155\\-32.22656\\-138.936\\-155\\-28.38542\\-141.6641\\-155\\-26.24199\\-143.6172\\-155\\-22.46094\\-147.7716\\-155\\-19.61263\\-151.4297\\-155\\-18.40049\\-153.3828\\-155\\-17.39708\\-155.3359\\-155\\-16.18214\\-157.2891\\-155\\-15.43298\\-159.2422\\-155\\-14.49764\\-161.1953\\-155\\-13.87533\\-163.1484\\-155\\-12.94849\\-167.0547\\-155\\-12.27392\\-169.0078\\-155\\-11.89732\\-170.9609\\-155\\-11.49462\\-174.8672\\-155\\-11.21511\\-176.8203\\-155\\-10.35525\\-180.7266\\-155\\-10.08606\\-182.6797\\-155\\-9.820642\\-186.5859\\-155\\-9.62822\\-190.4922\\-155\\-9.633789\\-194.3984\\-155\\-9.7891\\-198.3047\\-155\\-9.770412\\-204.1641\\-155\\-9.419988\\-210.0234\\-155\\-9.346277\\-213.9297\\-155\\-9.427584\\-217.8359\\-155\\-9.665096\\-221.7422\\-155\\-10.12074\\-227.6016\\-155\\-10.3752\\-229.5547\\-155\\-11.23946\\-233.4609\\-155\\-11.94018\\-239.3203\\-155\\-12.40306\\-241.2734\\-155\\-13.0598\\-243.2266\\-155\\-13.48016\\-245.1797\\-155\\-14.18488\\-249.0859\\-155\\-15.57593\\-252.9922\\-155\\-16.08788\\-254.9453\\-155\\-17.10771\\-256.8984\\-155\\-17.70833\\-258.8516\\-155\\-19.37737\\-262.7578\\-155\\-19.94344\\-264.7109\\-155\\-21.01164\\-266.6641\\-155\\-21.81551\\-268.6172\\-155\\-23.10627\\-270.5703\\-155\\-23.98606\\-272.5234\\-155\\-25.26558\\-274.4766\\-155\\-26.21755\\-276.4297\\-155\\-27.41392\\-278.3828\\-155\\-30.11924\\-282.2891\\-155\\-31.53456\\-284.2422\\-155\\-34.17969\\-287.64\\-155\\-36.54436\\-290.1016\\-155\\-40.13853\\-294.0078\\-155\\-41.99219\\-295.3163\\-155\\-43.94531\\-296.8492\\-155\\-45.89844\\-298.2396\\-155\\-47.85156\\-299.2704\\-155\\-49.80469\\-300.4261\\-155\\-51.75781\\-301.05\\-155\\-55.66406\\-302.4978\\-155\\-59.57031\\-303.1244\\-155\\-63.47656\\-303.9729\\-155\\-65.42969\\-304.1988\\-155\\-69.33594\\-304.3658\\-155\\-73.24219\\-304.3196\\-155\\-77.14844\\-304.0664\\-155" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "185" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.37\\-155\\55.66406\\-301.1796\\-155\\53.71094\\-300.7001\\-155\\51.75781\\-299.9206\\-155\\47.9798\\-297.9141\\-155\\45.89844\\-296.7338\\-155\\43.94531\\-295.3885\\-155\\41.99219\\-294.3166\\-155\\40.03906\\-292.8026\\-155\\34.97617\\-288.1484\\-155\\33.12653\\-286.1953\\-155\\29.8055\\-282.2891\\-155\\28.32031\\-280.3264\\-155\\25.68423\\-276.4297\\-155\\24.41406\\-274.2795\\-155\\22.46094\\-271.1595\\-155\\22.00101\\-270.5703\\-155\\21.13689\\-268.6172\\-155\\20.00026\\-266.6641\\-155\\19.46654\\-264.7109\\-155\\18.83473\\-262.7578\\-155\\17.83539\\-260.8047\\-155\\17.28622\\-258.8516\\-155\\16.36584\\-256.8984\\-155\\15.7666\\-254.9453\\-155\\15.26839\\-252.9922\\-155\\14.49653\\-251.0391\\-155\\13.92917\\-249.0859\\-155\\13.07091\\-245.1797\\-155\\12.36747\\-243.2266\\-155\\11.94018\\-241.2734\\-155\\11.48802\\-237.3672\\-155\\11.17974\\-235.4141\\-155\\10.62012\\-233.4609\\-155\\10.21205\\-231.5078\\-155\\9.807083\\-227.6016\\-155\\9.571309\\-223.6953\\-155\\9.118895\\-217.8359\\-155\\8.565267\\-213.9297\\-155\\8.565267\\-211.9766\\-155\\8.432241\\-206.1172\\-155\\8.432241\\-202.2109\\-155\\8.4851\\-200.2578\\-155\\8.640455\\-198.3047\\-155\\9.07668\\-194.3984\\-155\\9.367536\\-192.4453\\-155\\9.86236\\-186.5859\\-155\\10.14985\\-180.7266\\-155\\10.38537\\-178.7734\\-155\\11.35685\\-174.8672\\-155\\11.88427\\-170.9609\\-155\\12.2635\\-169.0078\\-155\\12.94663\\-167.0547\\-155\\13.87293\\-163.1484\\-155\\14.61088\\-161.1953\\-155\\16.56371\\-157.2891\\-155\\18.55469\\-153.91\\-155\\18.9927\\-153.3828\\-155\\20.08725\\-151.4297\\-155\\21.65706\\-149.4766\\-155\\24.41406\\-146.485\\-155\\27.38473\\-143.6172\\-155\\30.27344\\-141.0768\\-155\\32.41984\\-139.7109\\-155\\34.17969\\-138.6808\\-155\\36.13281\\-137.4173\\-155\\38.08594\\-136.5039\\-155\\40.03906\\-135.2747\\-155\\41.99219\\-134.5752\\-155\\43.94531\\-133.6256\\-155\\45.89844\\-133.0206\\-155\\47.85156\\-132.6619\\-155\\49.80469\\-132.1641\\-155\\51.75781\\-131.4399\\-155\\53.71094\\-130.9991\\-155\\59.57031\\-130.5267\\-155\\61.52344\\-130.4218\\-155\\67.38281\\-130.4129\\-155\\73.24219\\-130.6608\\-155\\79.10156\\-131.0846\\-155\\83.00781\\-131.4967\\-155\\84.96094\\-131.9536\\-155\\86.91406\\-132.6881\\-155\\88.86719\\-132.9654\\-155\\90.82031\\-133.0941\\-155\\92.77344\\-133.0715\\-155\\94.72656\\-133.1779\\-155\\96.67969\\-133.6111\\-155\\98.63281\\-134.3028\\-155\\100.5859\\-134.5665\\-155\\102.5391\\-134.9792\\-155\\104.4922\\-135.5323\\-155\\106.4453\\-136.2899\\-155\\108.3984\\-136.6852\\-155\\110.3516\\-137.1956\\-155\\112.3047\\-138.1086\\-155\\116.2109\\-138.9695\\-155\\118.1641\\-139.5947\\-155\\120.1172\\-140.3432\\-155\\122.0703\\-140.8629\\-155\\124.0234\\-141.5808\\-155\\125.9766\\-142.505\\-155\\127.9297\\-143.2402\\-155\\129.8828\\-144.3408\\-155\\131.8359\\-145.069\\-155\\133.7891\\-146.2631\\-155\\135.7422\\-147.0489\\-155\\136.3604\\-147.5234\\-155\\141.6016\\-151.0403\\-155\\143.5547\\-152.5565\\-155\\146.9175\\-155.3359\\-155\\148.9709\\-157.2891\\-155\\153.3203\\-161.5555\\-155\\156.1969\\-165.1016\\-155\\157.6084\\-167.0547\\-155\\158.785\\-169.0078\\-155\\160.0978\\-170.9609\\-155\\161.2956\\-172.9141\\-155\\162.7849\\-176.8203\\-155\\163.7079\\-178.7734\\-155\\164.6352\\-182.6797\\-155\\165.3096\\-184.6328\\-155\\165.7662\\-186.5859\\-155\\166.0944\\-188.5391\\-155\\166.6277\\-192.4453\\-155\\166.7668\\-194.3984\\-155\\167.2818\\-198.3047\\-155\\167.4171\\-200.2578\\-155\\167.546\\-206.1172\\-155\\167.5166\\-208.0703\\-155\\167.335\\-211.9766\\-155\\167.1666\\-213.9297\\-155\\166.6054\\-217.8359\\-155\\165.6042\\-225.6484\\-155\\165.1611\\-227.6016\\-155\\164.5416\\-229.5547\\-155\\163.7756\\-233.4609\\-155\\162.4161\\-237.3672\\-155\\162.0028\\-239.3203\\-155\\161.3946\\-241.2734\\-155\\160.4117\\-243.2266\\-155\\159.7319\\-245.1797\\-155\\158.5845\\-247.1328\\-155\\157.8227\\-249.0859\\-155\\156.6074\\-251.0391\\-155\\155.9309\\-252.9922\\-155\\154.6901\\-254.9453\\-155\\153.7685\\-256.8984\\-155\\153.3203\\-257.4577\\-155\\151.3672\\-260.4192\\-155\\151.0392\\-260.8047\\-155\\149.8853\\-262.7578\\-155\\148.4819\\-264.7109\\-155\\146.9265\\-266.6641\\-155\\143.5547\\-270.5974\\-155\\142.0139\\-272.5234\\-155\\139.6484\\-274.979\\-155\\137.9661\\-276.4297\\-155\\136.0085\\-278.3828\\-155\\133.7891\\-280.4192\\-155\\131.8359\\-281.8828\\-155\\128.9749\\-284.2422\\-155\\125.9766\\-286.6202\\-155\\120.1172\\-290.3406\\-155\\118.1641\\-291.3596\\-155\\116.2109\\-292.7192\\-155\\114.2578\\-293.6107\\-155\\112.3047\\-294.7264\\-155\\110.3516\\-295.3466\\-155\\108.3984\\-296.3662\\-155\\106.4453\\-296.9959\\-155\\102.5391\\-298.7131\\-155\\100.5859\\-299.3351\\-155\\98.63281\\-300.1661\\-155\\96.67969\\-300.661\\-155\\92.77344\\-301.4066\\-155\\90.82031\\-301.95\\-155\\88.86719\\-302.37\\-155\\86.91406\\-302.6283\\-155\\83.00781\\-302.8881\\-155\\77.14844\\-303.2215\\-155\\73.24219\\-303.3558\\-155\\69.33594\\-303.2637\\-155\\63.47656\\-302.84\\-155\\61.52344\\-302.6648\\-155" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "175" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.882\\-153\\-81.05469\\-303.5258\\-153\\-84.96094\\-302.956\\-153\\-88.86719\\-302.591\\-153\\-90.82031\\-302.2369\\-153\\-92.77344\\-301.6339\\-153\\-96.67969\\-300.7472\\-153\\-98.63281\\-300.2253\\-153\\-100.5859\\-299.3033\\-153\\-102.5391\\-298.6208\\-153\\-104.4922\\-297.5221\\-153\\-106.4453\\-296.7738\\-153\\-108.3984\\-295.7687\\-153\\-110.3516\\-294.9107\\-153\\-114.2578\\-292.6849\\-153\\-118.1641\\-289.8108\\-153\\-120.1172\\-288.7357\\-153\\-122.0703\\-287.1845\\-153\\-125.9766\\-283.6989\\-153\\-127.7801\\-282.2891\\-153\\-129.8828\\-280.3272\\-153\\-131.6678\\-278.3828\\-153\\-133.6507\\-276.4297\\-153\\-135.7422\\-274.1568\\-153\\-136.8745\\-272.5234\\-153\\-140.2762\\-268.6172\\-153\\-141.7188\\-266.6641\\-153\\-142.8415\\-264.7109\\-153\\-144.2162\\-262.7578\\-153\\-147.4609\\-257.5223\\-153\\-147.9256\\-256.8984\\-153\\-148.7914\\-254.9453\\-153\\-149.9767\\-252.9922\\-153\\-150.7265\\-251.0391\\-153\\-151.9624\\-249.0859\\-153\\-152.795\\-247.1328\\-153\\-153.9263\\-245.1797\\-153\\-154.6161\\-243.2266\\-153\\-155.6458\\-241.2734\\-153\\-156.8569\\-237.3672\\-153\\-157.8362\\-235.4141\\-153\\-158.4446\\-233.4609\\-153\\-159.3667\\-231.5078\\-153\\-160.5756\\-227.6016\\-153\\-161.368\\-225.6484\\-153\\-161.8863\\-223.6953\\-153\\-162.5527\\-219.7891\\-153\\-163.1851\\-217.8359\\-153\\-163.7121\\-215.8828\\-153\\-164.5755\\-210.0234\\-153\\-165.3539\\-206.1172\\-153\\-165.6953\\-202.2109\\-153\\-165.7323\\-198.3047\\-153\\-165.5444\\-194.3984\\-153\\-165.332\\-192.4453\\-153\\-164.4052\\-188.5391\\-153\\-163.6258\\-184.6328\\-153\\-162.8548\\-182.6797\\-153\\-161.6899\\-178.7734\\-153\\-160.6132\\-176.8203\\-153\\-159.715\\-174.8672\\-153\\-156.9336\\-170.9609\\-153\\-155.8459\\-169.0078\\-153\\-154.2969\\-167.0547\\-153\\-150.705\\-163.1484\\-153\\-149.4141\\-161.6644\\-153\\-146.9219\\-159.2422\\-153\\-145.5078\\-158.1235\\-153\\-141.6016\\-154.561\\-153\\-139.6484\\-153.1219\\-153\\-137.6953\\-152.0697\\-153\\-135.7422\\-150.6359\\-153\\-133.7891\\-149.439\\-153\\-130.4785\\-147.5234\\-153\\-129.8828\\-147.1069\\-153\\-127.9297\\-146.3749\\-153\\-125.9766\\-145.4126\\-153\\-122.0703\\-143.7588\\-153\\-120.1172\\-142.7956\\-153\\-118.1641\\-142.0586\\-153\\-116.2109\\-141.0842\\-153\\-114.2578\\-140.5197\\-153\\-112.3047\\-139.8559\\-153\\-110.3516\\-139.0705\\-153\\-108.3984\\-138.6277\\-153\\-106.4453\\-137.9965\\-153\\-104.4922\\-137.1344\\-153\\-102.5391\\-136.638\\-153\\-98.63281\\-135.1664\\-153\\-94.72656\\-134.2381\\-153\\-92.77344\\-133.5008\\-153\\-90.82031\\-133.113\\-153\\-84.96094\\-132.3899\\-153\\-81.05469\\-131.4399\\-153\\-77.14844\\-130.9357\\-153\\-71.28906\\-130.555\\-153\\-69.33594\\-130.4978\\-153\\-63.47656\\-130.5057\\-153\\-57.61719\\-130.8128\\-153\\-53.71094\\-131.1859\\-153\\-51.75781\\-131.537\\-153\\-49.80469\\-132.2123\\-153\\-47.85156\\-132.6367\\-153\\-45.89844\\-132.8929\\-153\\-43.94531\\-133.2982\\-153\\-41.99219\\-134.2272\\-153\\-40.03906\\-134.9104\\-153\\-38.03759\\-135.8047\\-153\\-32.22656\\-138.9436\\-153\\-28.40245\\-141.6641\\-153\\-26.24199\\-143.6172\\-153\\-22.46094\\-147.7432\\-153\\-19.60589\\-151.4297\\-153\\-18.38707\\-153.3828\\-153\\-17.40106\\-155.3359\\-153\\-16.17237\\-157.2891\\-153\\-15.43511\\-159.2422\\-153\\-14.45737\\-161.1953\\-153\\-13.85679\\-163.1484\\-153\\-12.96099\\-167.0547\\-153\\-12.27392\\-169.0078\\-153\\-11.90848\\-170.9609\\-153\\-11.47729\\-174.8672\\-153\\-11.18382\\-176.8203\\-153\\-10.33579\\-180.7266\\-153\\-10.08606\\-182.6797\\-153\\-9.838982\\-186.5859\\-153\\-9.665096\\-190.4922\\-153\\-9.658737\\-192.4453\\-153\\-9.816778\\-196.3516\\-153\\-9.829812\\-200.2578\\-153\\-9.908537\\-204.1641\\-153\\-9.61691\\-208.0703\\-153\\-9.431112\\-211.9766\\-153\\-9.427374\\-215.8828\\-153\\-9.579145\\-219.7891\\-153\\-10.03689\\-225.6484\\-153\\-10.5678\\-229.5547\\-153\\-11.05656\\-231.5078\\-153\\-11.35748\\-233.4609\\-153\\-11.77154\\-237.3672\\-153\\-12.04227\\-239.3203\\-153\\-12.53756\\-241.2734\\-153\\-13.16699\\-243.2266\\-153\\-13.88889\\-247.1328\\-153\\-14.31418\\-249.0859\\-153\\-15.10976\\-251.0391\\-153\\-16.24474\\-254.9453\\-153\\-17.25443\\-256.8984\\-153\\-17.80389\\-258.8516\\-153\\-18.79519\\-260.8047\\-153\\-20.06572\\-264.7109\\-153\\-21.14922\\-266.6641\\-153\\-21.94913\\-268.6172\\-153\\-23.23676\\-270.5703\\-153\\-24.16487\\-272.5234\\-153\\-25.37893\\-274.4766\\-153\\-27.53789\\-278.3828\\-153\\-30.36296\\-282.2891\\-153\\-31.65409\\-284.2422\\-153\\-34.17969\\-287.5105\\-153\\-40.22382\\-294.0078\\-153\\-41.99219\\-295.2581\\-153\\-43.94531\\-296.8428\\-153\\-45.89844\\-298.2418\\-153\\-47.85156\\-299.274\\-153\\-49.80469\\-300.4261\\-153\\-51.75781\\-301.0621\\-153\\-55.66406\\-302.5179\\-153\\-59.57031\\-303.136\\-153\\-63.47656\\-303.9851\\-153\\-65.42969\\-304.2081\\-153\\-69.33594\\-304.3949\\-153\\-73.24219\\-304.3583\\-153\\-77.14844\\-304.12\\-153" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "181" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.3607\\-153\\55.66406\\-301.188\\-153\\53.71094\\-300.7116\\-153\\51.75781\\-299.9505\\-153\\47.90139\\-297.9141\\-153\\45.89844\\-296.7599\\-153\\43.94531\\-295.4116\\-153\\41.99219\\-294.3546\\-153\\40.03906\\-292.8149\\-153\\36.13281\\-289.1987\\-153\\34.93143\\-288.1484\\-153\\33.08823\\-286.1953\\-153\\29.73165\\-282.2891\\-153\\28.19454\\-280.3359\\-153\\26.99498\\-278.3828\\-153\\25.63794\\-276.4297\\-153\\23.33416\\-272.5234\\-153\\21.97266\\-270.5703\\-153\\21.14077\\-268.6172\\-153\\20.00026\\-266.6641\\-153\\19.46023\\-264.7109\\-153\\18.79519\\-262.7578\\-153\\17.80547\\-260.8047\\-153\\17.24718\\-258.8516\\-153\\16.28675\\-256.8984\\-153\\15.16272\\-252.9922\\-153\\14.39398\\-251.0391\\-153\\13.8707\\-249.0859\\-153\\12.99741\\-245.1797\\-153\\12.29795\\-243.2266\\-153\\11.8953\\-241.2734\\-153\\11.43895\\-237.3672\\-153\\11.0919\\-235.4141\\-153\\10.50647\\-233.4609\\-153\\10.14245\\-231.5078\\-153\\9.756369\\-227.6016\\-153\\9.520206\\-223.6953\\-153\\9.083998\\-217.8359\\-153\\8.565267\\-213.9297\\-153\\8.602061\\-211.9766\\-153\\8.47425\\-208.0703\\-153\\8.422074\\-204.1641\\-153\\8.47425\\-200.2578\\-153\\8.614676\\-198.3047\\-153\\9.542989\\-190.4922\\-153\\9.922986\\-186.5859\\-153\\10.09285\\-182.6797\\-153\\10.25391\\-180.7266\\-153\\10.54275\\-178.7734\\-153\\11.43185\\-174.8672\\-153\\11.92882\\-170.9609\\-153\\12.33082\\-169.0078\\-153\\13.01147\\-167.0547\\-153\\13.89146\\-163.1484\\-153\\14.64844\\-161.1628\\-153\\16.50611\\-157.2891\\-153\\18.55469\\-153.8581\\-153\\18.95551\\-153.3828\\-153\\20.04046\\-151.4297\\-153\\22.46094\\-148.5201\\-153\\24.41406\\-146.4575\\-153\\27.3234\\-143.6172\\-153\\30.27344\\-141.028\\-153\\32.31908\\-139.7109\\-153\\34.17969\\-138.6265\\-153\\36.13281\\-137.3437\\-153\\38.08594\\-136.4261\\-153\\40.03906\\-135.206\\-153\\41.99219\\-134.5086\\-153\\43.94531\\-133.5354\\-153\\45.89844\\-132.9654\\-153\\47.85156\\-132.6146\\-153\\51.75781\\-131.3445\\-153\\53.71094\\-130.9582\\-153\\57.61719\\-130.5653\\-153\\61.52344\\-130.2622\\-153\\67.38281\\-130.3247\\-153\\73.24219\\-130.6017\\-153\\79.10156\\-131.0049\\-153\\83.00781\\-131.3704\\-153\\84.96094\\-131.7487\\-153\\86.91406\\-132.6635\\-153\\88.86719\\-132.9286\\-153\\90.82031\\-133.0295\\-153\\94.72656\\-133.0812\\-153\\96.67969\\-133.5673\\-153\\98.63281\\-134.3364\\-153\\100.5859\\-134.435\\-153\\102.5391\\-134.8943\\-153\\104.4922\\-135.4814\\-153\\106.4453\\-136.2579\\-153\\108.3984\\-136.6256\\-153\\110.3516\\-137.1321\\-153\\112.3047\\-138.1387\\-153\\116.2109\\-138.8681\\-153\\118.1641\\-139.3642\\-153\\120.1172\\-140.2058\\-153\\124.0234\\-141.3801\\-153\\125.9766\\-142.3665\\-153\\127.9297\\-143.0944\\-153\\129.8828\\-144.213\\-153\\131.8359\\-144.9377\\-153\\133.7891\\-146.0951\\-153\\135.7422\\-146.9098\\-153\\136.599\\-147.5234\\-153\\139.639\\-149.4766\\-153\\142.3712\\-151.4297\\-153\\147.1139\\-155.3359\\-153\\149.4141\\-157.5291\\-153\\153.3203\\-161.3409\\-153\\155.2734\\-163.7462\\-153\\157.2266\\-166.2751\\-153\\159.1797\\-169.2448\\-153\\161.3957\\-172.9141\\-153\\162.9232\\-176.8203\\-153\\163.7915\\-178.7734\\-153\\164.2722\\-180.7266\\-153\\165.3959\\-184.6328\\-153\\166.1161\\-188.5391\\-153\\166.6794\\-192.4453\\-153\\166.7987\\-194.3984\\-153\\167.1573\\-196.3516\\-153\\167.4071\\-198.3047\\-153\\167.511\\-200.2578\\-153\\167.6018\\-206.1172\\-153\\167.5078\\-210.0234\\-153\\167.2279\\-213.9297\\-153\\166.9922\\-215.8286\\-153\\166.3882\\-219.7891\\-153\\165.6304\\-225.6484\\-153\\165.2007\\-227.6016\\-153\\164.5538\\-229.5547\\-153\\163.7827\\-233.4609\\-153\\162.4204\\-237.3672\\-153\\161.9962\\-239.3203\\-153\\161.368\\-241.2734\\-153\\160.3933\\-243.2266\\-153\\159.7064\\-245.1797\\-153\\158.5381\\-247.1328\\-153\\157.7838\\-249.0859\\-153\\156.5734\\-251.0391\\-153\\155.9095\\-252.9922\\-153\\154.668\\-254.9453\\-153\\153.734\\-256.8984\\-153\\153.3203\\-257.4076\\-153\\151.3672\\-260.3417\\-153\\150.9751\\-260.8047\\-153\\149.8286\\-262.7578\\-153\\148.4375\\-264.7109\\-153\\146.8555\\-266.6641\\-153\\145.104\\-268.6172\\-153\\141.9119\\-272.5234\\-153\\139.6484\\-274.8657\\-153\\137.8706\\-276.4297\\-153\\135.9175\\-278.3828\\-153\\133.78\\-280.3359\\-153\\129.8828\\-283.4195\\-153\\128.9444\\-284.2422\\-153\\125.9766\\-286.6102\\-153\\120.1172\\-290.3406\\-153\\118.1641\\-291.3711\\-153\\116.2109\\-292.7268\\-153\\114.2578\\-293.6211\\-153\\112.3047\\-294.7418\\-153\\110.3516\\-295.3555\\-153\\108.3984\\-296.3898\\-153\\106.4453\\-297.0122\\-153\\102.5391\\-298.7444\\-153\\100.5859\\-299.373\\-153\\98.63281\\-300.2014\\-153\\96.67969\\-300.6724\\-153\\92.77344\\-301.4202\\-153\\90.82031\\-301.9931\\-153\\88.86719\\-302.3793\\-153\\86.91406\\-302.6351\\-153\\84.96094\\-302.7804\\-153\\77.14844\\-303.2336\\-153\\75.19531\\-303.3135\\-153\\71.28906\\-303.333\\-153\\67.38281\\-303.1398\\-153\\61.52344\\-302.6712\\-153" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "186" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.9221\\-151\\-81.05469\\-303.5781\\-151\\-84.96094\\-303.0022\\-151\\-88.86719\\-302.6283\\-151\\-90.82031\\-302.302\\-151\\-94.72656\\-301.2006\\-151\\-98.63281\\-300.2693\\-151\\-100.5859\\-299.3611\\-151\\-102.5391\\-298.6532\\-151\\-104.4922\\-297.5908\\-151\\-106.4453\\-296.7972\\-151\\-110.3516\\-294.9294\\-151\\-114.2578\\-292.7151\\-151\\-116.2109\\-291.2234\\-151\\-118.1641\\-289.8517\\-151\\-120.1172\\-288.758\\-151\\-122.0703\\-287.1971\\-151\\-125.9766\\-283.7715\\-151\\-127.8845\\-282.2891\\-151\\-129.8828\\-280.431\\-151\\-131.7775\\-278.3828\\-151\\-133.7636\\-276.4297\\-151\\-135.7422\\-274.2884\\-151\\-136.9996\\-272.5234\\-151\\-138.6317\\-270.5703\\-151\\-140.3809\\-268.6172\\-151\\-141.8732\\-266.6641\\-151\\-142.9321\\-264.7109\\-151\\-144.3298\\-262.7578\\-151\\-145.6299\\-260.8047\\-151\\-146.7566\\-258.8516\\-151\\-148.0753\\-256.8984\\-151\\-148.9607\\-254.9453\\-151\\-150.116\\-252.9922\\-151\\-150.8955\\-251.0391\\-151\\-152.1163\\-249.0859\\-151\\-153.0016\\-247.1328\\-151\\-154.0728\\-245.1797\\-151\\-154.7985\\-243.2266\\-151\\-155.8211\\-241.2734\\-151\\-156.3436\\-239.3203\\-151\\-158.0068\\-235.4141\\-151\\-158.6391\\-233.4609\\-151\\-159.6225\\-231.5078\\-151\\-160.794\\-227.6016\\-151\\-161.5851\\-225.6484\\-151\\-162.0147\\-223.6953\\-151\\-162.3251\\-221.7422\\-151\\-162.7441\\-219.7891\\-151\\-163.4294\\-217.8359\\-151\\-163.8449\\-215.8828\\-151\\-164.4244\\-211.9766\\-151\\-164.8072\\-210.0234\\-151\\-165.2982\\-208.0703\\-151\\-165.561\\-206.1172\\-151\\-165.8331\\-202.2109\\-151\\-165.8825\\-200.2578\\-151\\-165.8273\\-196.3516\\-151\\-165.5444\\-192.4453\\-151\\-165.2007\\-190.4922\\-151\\-164.6242\\-188.5391\\-151\\-163.8128\\-184.6328\\-151\\-163.1705\\-182.6797\\-151\\-162.3628\\-180.7266\\-151\\-161.8448\\-178.7734\\-151\\-159.8925\\-174.8672\\-151\\-158.4503\\-172.9141\\-151\\-155.9947\\-169.0078\\-151\\-154.4411\\-167.0547\\-151\\-152.7613\\-165.1016\\-151\\-150.897\\-163.1484\\-151\\-149.4141\\-161.4374\\-151\\-147.1382\\-159.2422\\-151\\-145.5078\\-157.9335\\-151\\-141.6016\\-154.4908\\-151\\-139.6484\\-153.031\\-151\\-137.6953\\-152.0433\\-151\\-135.7422\\-150.613\\-151\\-133.7891\\-149.3545\\-151\\-130.5762\\-147.5234\\-151\\-129.8828\\-147.0485\\-151\\-127.9297\\-146.338\\-151\\-125.9766\\-145.3171\\-151\\-124.0234\\-144.566\\-151\\-120.1172\\-142.7122\\-151\\-118.1641\\-141.9203\\-151\\-116.2109\\-140.9834\\-151\\-114.2578\\-140.425\\-151\\-110.3516\\-138.9649\\-151\\-108.3984\\-138.5264\\-151\\-104.4922\\-137.0215\\-151\\-102.5391\\-136.4944\\-151\\-100.5859\\-135.6693\\-151\\-98.63281\\-135.0921\\-151\\-94.72656\\-134.1256\\-151\\-92.77344\\-133.4302\\-151\\-90.82031\\-133.0739\\-151\\-86.91406\\-132.625\\-151\\-84.96094\\-132.3009\\-151\\-83.00781\\-131.7345\\-151\\-81.05469\\-131.3038\\-151\\-79.10156\\-131.0823\\-151\\-75.19531\\-130.7567\\-151\\-71.28906\\-130.4978\\-151\\-67.38281\\-130.401\\-151\\-63.47656\\-130.419\\-151\\-59.57031\\-130.6258\\-151\\-55.66406\\-130.9451\\-151\\-53.71094\\-131.1537\\-151\\-51.75781\\-131.5066\\-151\\-49.80469\\-132.1984\\-151\\-47.85156\\-132.6439\\-151\\-45.89844\\-132.9109\\-151\\-43.94531\\-133.3435\\-151\\-41.99219\\-134.2381\\-151\\-40.03906\\-134.9263\\-151\\-38.08594\\-135.797\\-151\\-32.22656\\-138.9642\\-151\\-28.43896\\-141.6641\\-151\\-26.27458\\-143.6172\\-151\\-22.46094\\-147.6958\\-151\\-19.58101\\-151.4297\\-151\\-18.31055\\-153.3828\\-151\\-17.38175\\-155.3359\\-151\\-16.1438\\-157.2891\\-151\\-15.42426\\-159.2422\\-151\\-14.4322\\-161.1953\\-151\\-13.84523\\-163.1484\\-151\\-12.97331\\-167.0547\\-151\\-12.27392\\-169.0078\\-151\\-11.90848\\-170.9609\\-151\\-11.48395\\-174.8672\\-151\\-11.18382\\-176.8203\\-151\\-10.33579\\-180.7266\\-151\\-10.09971\\-182.6797\\-151\\-9.857321\\-186.5859\\-151\\-9.71398\\-190.4922\\-151\\-9.732441\\-192.4453\\-151\\-9.880786\\-196.3516\\-151\\-9.86649\\-200.2578\\-151\\-9.975228\\-204.1641\\-151\\-9.679033\\-208.0703\\-151\\-9.470016\\-213.9297\\-151\\-9.6268\\-219.7891\\-151\\-10.10665\\-225.6484\\-151\\-10.53049\\-227.6016\\-151\\-10.78033\\-229.5547\\-151\\-11.19626\\-231.5078\\-151\\-11.45583\\-233.4609\\-151\\-11.84353\\-237.3672\\-151\\-12.1563\\-239.3203\\-151\\-13.24142\\-243.2266\\-151\\-13.9608\\-247.1328\\-151\\-14.45875\\-249.0859\\-151\\-15.27544\\-251.0391\\-151\\-15.79255\\-252.9922\\-151\\-16.45296\\-254.9453\\-151\\-17.37968\\-256.8984\\-151\\-17.90926\\-258.8516\\-151\\-18.97608\\-260.8047\\-151\\-19.54309\\-262.7578\\-151\\-20.21976\\-264.7109\\-151\\-21.27041\\-266.6641\\-151\\-22.11217\\-268.6172\\-151\\-23.35394\\-270.5703\\-151\\-24.39135\\-272.5234\\-151\\-27.6753\\-278.3828\\-151\\-30.27344\\-281.9362\\-151\\-30.59156\\-282.2891\\-151\\-31.798\\-284.2422\\-151\\-33.23403\\-286.1953\\-151\\-34.84613\\-288.1484\\-151\\-40.30462\\-294.0078\\-151\\-41.99219\\-295.2254\\-151\\-43.94531\\-296.8177\\-151\\-45.89844\\-298.2171\\-151\\-47.85156\\-299.2538\\-151\\-49.80469\\-300.4261\\-151\\-51.75781\\-301.0621\\-151\\-55.66406\\-302.53\\-151\\-59.57031\\-303.1282\\-151\\-63.47656\\-303.9729\\-151\\-65.42969\\-304.2081\\-151\\-69.33594\\-304.402\\-151\\-73.24219\\-304.3732\\-151\\-77.14844\\-304.1604\\-151" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "179" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.3416\\-151\\55.66406\\-301.1837\\-151\\53.71094\\-300.7051\\-151\\51.75781\\-299.9505\\-151\\47.86163\\-297.9141\\-151\\45.89844\\-296.7718\\-151\\43.94531\\-295.4252\\-151\\41.99219\\-294.3661\\-151\\40.03906\\-292.8273\\-151\\36.13281\\-289.2054\\-151\\34.92273\\-288.1484\\-151\\33.07547\\-286.1953\\-151\\29.68618\\-282.2891\\-151\\28.125\\-280.3359\\-151\\26.95184\\-278.3828\\-151\\25.60484\\-276.4297\\-151\\23.33984\\-272.5234\\-151\\22.00396\\-270.5703\\-151\\21.17283\\-268.6172\\-151\\20.02276\\-266.6641\\-151\\19.46023\\-264.7109\\-151\\18.78231\\-262.7578\\-151\\17.78886\\-260.8047\\-151\\17.21398\\-258.8516\\-151\\16.23457\\-256.8984\\-151\\15.0791\\-252.9922\\-151\\14.30107\\-251.0391\\-151\\13.8172\\-249.0859\\-151\\12.9713\\-245.1797\\-151\\12.2635\\-243.2266\\-151\\11.87151\\-241.2734\\-151\\11.40625\\-237.3672\\-151\\11.02218\\-235.4141\\-151\\10.42737\\-233.4609\\-151\\10.09971\\-231.5078\\-151\\9.728599\\-227.6016\\-151\\9.051724\\-217.8359\\-151\\8.627473\\-213.9297\\-151\\8.614676\\-211.9766\\-151\\8.463542\\-208.0703\\-151\\8.422074\\-202.2109\\-151\\8.44254\\-200.2578\\-151\\8.565267\\-198.3047\\-151\\9.271389\\-192.4453\\-151\\9.553109\\-190.4922\\-151\\9.956287\\-186.5859\\-151\\10.14985\\-182.6797\\-151\\10.32624\\-180.7266\\-151\\10.6756\\-178.7734\\-151\\11.1341\\-176.8203\\-151\\11.48802\\-174.8672\\-151\\11.96145\\-170.9609\\-151\\12.39102\\-169.0078\\-151\\13.04854\\-167.0547\\-151\\13.90301\\-163.1484\\-151\\14.61088\\-161.1953\\-151\\16.47859\\-157.2891\\-151\\18.55469\\-153.7752\\-151\\18.89015\\-153.3828\\-151\\20.00578\\-151.4297\\-151\\22.46094\\-148.4799\\-151\\24.41406\\-146.4222\\-151\\27.26293\\-143.6172\\-151\\30.27344\\-140.9855\\-151\\32.22656\\-139.7026\\-151\\34.17969\\-138.5767\\-151\\36.13281\\-137.2521\\-151\\38.08594\\-136.33\\-151\\40.03906\\-135.1365\\-151\\41.99219\\-134.43\\-151\\43.94531\\-133.4379\\-151\\45.89844\\-132.9109\\-151\\47.85156\\-132.5515\\-151\\51.75781\\-131.2492\\-151\\53.71094\\-130.9465\\-151\\57.61719\\-130.4658\\-151\\61.52344\\-130.0683\\-151\\63.47656\\-130.0124\\-151\\67.38281\\-130.1691\\-151\\71.28906\\-130.401\\-151\\81.05469\\-131.0579\\-151\\84.96094\\-131.5166\\-151\\86.91406\\-132.4135\\-151\\88.86719\\-132.7931\\-151\\90.82031\\-132.9229\\-151\\94.72656\\-132.9948\\-151\\98.63281\\-134.2151\\-151\\100.5859\\-134.2805\\-151\\102.5391\\-134.7552\\-151\\104.4922\\-135.3288\\-151\\106.4453\\-136.0767\\-151\\108.3984\\-136.5103\\-151\\110.3516\\-137.0661\\-151\\112.3047\\-138.1554\\-151\\114.2578\\-138.5285\\-151\\116.2109\\-138.7795\\-151\\118.1641\\-139.1575\\-151\\120.1172\\-140.0032\\-151\\124.0234\\-141.1981\\-151\\125.9766\\-142.1984\\-151\\127.9297\\-142.9569\\-151\\129.8828\\-144.0664\\-151\\131.8359\\-144.8277\\-151\\133.7891\\-145.9595\\-151\\135.7422\\-146.7894\\-151\\137.6953\\-148.0842\\-151\\139.6484\\-149.2408\\-151\\142.5781\\-151.4297\\-151\\147.3832\\-155.3359\\-151\\151.3672\\-159.0991\\-151\\153.4339\\-161.1953\\-151\\157.2266\\-166.103\\-151\\159.2175\\-169.0078\\-151\\161.1328\\-172.4205\\-151\\161.4753\\-172.9141\\-151\\162.2228\\-174.8672\\-151\\163.0939\\-176.8203\\-151\\163.8595\\-178.7734\\-151\\164.3375\\-180.7266\\-151\\165.0391\\-182.7478\\-151\\165.5244\\-184.6328\\-151\\166.7589\\-192.4453\\-151\\167.3087\\-196.3516\\-151\\167.5817\\-200.2578\\-151\\167.649\\-206.1172\\-151\\167.4528\\-211.9766\\-151\\167.073\\-215.8828\\-151\\166.4317\\-219.7891\\-151\\165.6528\\-225.6484\\-151\\165.2261\\-227.6016\\-151\\164.5631\\-229.5547\\-151\\163.7897\\-233.4609\\-151\\162.4079\\-237.3672\\-151\\161.9843\\-239.3203\\-151\\161.3426\\-241.2734\\-151\\160.3751\\-243.2266\\-151\\159.6858\\-245.1797\\-151\\158.5118\\-247.1328\\-151\\157.7439\\-249.0859\\-151\\156.5524\\-251.0391\\-151\\155.8789\\-252.9922\\-151\\154.6502\\-254.9453\\-151\\153.6874\\-256.8984\\-151\\153.3203\\-257.3408\\-151\\151.3672\\-260.2549\\-151\\150.9032\\-260.8047\\-151\\149.7685\\-262.7578\\-151\\148.3931\\-264.7109\\-151\\146.7863\\-266.6641\\-151\\143.3281\\-270.5703\\-151\\141.7827\\-272.5234\\-151\\139.6484\\-274.7589\\-151\\137.7887\\-276.4297\\-151\\135.8193\\-278.3828\\-151\\133.6931\\-280.3359\\-151\\129.8828\\-283.4003\\-151\\128.9216\\-284.2422\\-151\\125.9766\\-286.6001\\-151\\120.1172\\-290.3406\\-151\\118.1641\\-291.3637\\-151\\116.2109\\-292.7232\\-151\\114.2578\\-293.6424\\-151\\112.3047\\-294.7539\\-151\\110.3516\\-295.3776\\-151\\108.3984\\-296.4201\\-151\\106.4453\\-297.0395\\-151\\102.5391\\-298.7666\\-151\\100.5859\\-299.4001\\-151\\98.63281\\-300.2229\\-151\\96.67969\\-300.6838\\-151\\92.77344\\-301.4311\\-151\\90.82031\\-301.9931\\-151\\88.86719\\-302.4012\\-151\\86.91406\\-302.6466\\-151\\81.05469\\-303.0244\\-151\\75.19531\\-303.3135\\-151\\71.28906\\-303.3135\\-151\\67.38281\\-303.1053\\-151\\61.52344\\-302.6648\\-151" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "183" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.9604\\-149\\-83.00781\\-303.3105\\-149\\-84.96094\\-303.0453\\-149\\-88.86719\\-302.6533\\-149\\-90.82031\\-302.3477\\-149\\-94.72656\\-301.2218\\-149\\-98.63281\\-300.3088\\-149\\-100.5859\\-299.4001\\-149\\-102.5391\\-298.6814\\-149\\-104.4922\\-297.6522\\-149\\-106.4453\\-296.8308\\-149\\-110.3516\\-294.9475\\-149\\-114.2578\\-292.7522\\-149\\-116.2109\\-291.2351\\-149\\-118.1641\\-289.8651\\-149\\-120.1172\\-288.7799\\-149\\-122.0703\\-287.2223\\-149\\-125.9766\\-283.8329\\-149\\-127.9297\\-282.347\\-149\\-129.8828\\-280.5279\\-149\\-131.908\\-278.3828\\-149\\-133.8833\\-276.4297\\-149\\-135.7422\\-274.3936\\-149\\-137.0908\\-272.5234\\-149\\-138.7236\\-270.5703\\-149\\-140.4757\\-268.6172\\-149\\-142.002\\-266.6641\\-149\\-143.0092\\-264.7109\\-149\\-145.8008\\-260.8047\\-149\\-146.8949\\-258.8516\\-149\\-148.1981\\-256.8984\\-149\\-149.1361\\-254.9453\\-149\\-150.222\\-252.9922\\-149\\-151.0706\\-251.0391\\-149\\-152.2455\\-249.0859\\-149\\-154.189\\-245.1797\\-149\\-154.9769\\-243.2266\\-149\\-155.952\\-241.2734\\-149\\-156.4512\\-239.3203\\-149\\-157.4136\\-237.3672\\-149\\-158.8477\\-233.4609\\-149\\-159.7991\\-231.5078\\-149\\-160.3353\\-229.5547\\-149\\-161.7362\\-225.6484\\-149\\-162.4288\\-221.7422\\-149\\-162.9552\\-219.7891\\-149\\-163.6136\\-217.8359\\-149\\-164.2439\\-213.9297\\-149\\-164.6142\\-211.9766\\-149\\-165.5099\\-208.0703\\-149\\-165.7056\\-206.1172\\-149\\-165.9614\\-202.2109\\-149\\-166.0156\\-198.3047\\-149\\-165.976\\-196.3516\\-149\\-165.6988\\-192.4453\\-149\\-165.4358\\-190.4922\\-149\\-164.3455\\-186.5859\\-149\\-163.9464\\-184.6328\\-149\\-163.4294\\-182.6797\\-149\\-162.5325\\-180.7266\\-149\\-161.9672\\-178.7734\\-149\\-160.0349\\-174.8672\\-149\\-158.6488\\-172.9141\\-149\\-157.4779\\-170.9609\\-149\\-155.2734\\-167.874\\-149\\-153.3203\\-165.5293\\-149\\-151.0827\\-163.1484\\-149\\-149.4141\\-161.2563\\-149\\-147.2938\\-159.2422\\-149\\-145.5078\\-157.8461\\-149\\-141.6016\\-154.4533\\-149\\-139.6484\\-152.9823\\-149\\-137.6953\\-152.0209\\-149\\-136.9525\\-151.4297\\-149\\-133.7891\\-149.3022\\-149\\-131.8359\\-148.2342\\-149\\-129.8828\\-146.9986\\-149\\-127.9297\\-146.3135\\-149\\-125.9766\\-145.2309\\-149\\-124.0234\\-144.5268\\-149\\-122.0703\\-143.4818\\-149\\-116.2109\\-140.8934\\-149\\-114.2578\\-140.3387\\-149\\-112.3047\\-139.4816\\-149\\-110.3516\\-138.8747\\-149\\-108.3984\\-138.4188\\-149\\-106.4453\\-137.5584\\-149\\-102.5391\\-136.3802\\-149\\-100.5859\\-135.5341\\-149\\-96.67969\\-134.6041\\-149\\-92.77344\\-133.3963\\-149\\-90.82031\\-133.0498\\-149\\-86.91406\\-132.5943\\-149\\-84.96094\\-132.2217\\-149\\-83.00781\\-131.6358\\-149\\-81.05469\\-131.2387\\-149\\-75.19531\\-130.7015\\-149\\-71.28906\\-130.4365\\-149\\-67.38281\\-130.3021\\-149\\-63.47656\\-130.3322\\-149\\-59.57031\\-130.5509\\-149\\-55.66406\\-130.8738\\-149\\-53.71094\\-131.0981\\-149\\-51.75781\\-131.4678\\-149\\-49.80469\\-132.1744\\-149\\-47.85156\\-132.651\\-149\\-45.89844\\-132.9229\\-149\\-43.94531\\-133.3767\\-149\\-41.99219\\-134.2624\\-149\\-40.03906\\-134.9495\\-149\\-38.17033\\-135.8047\\-149\\-36.13281\\-136.8439\\-149\\-34.17969\\-138.0168\\-149\\-32.22656\\-138.9801\\-149\\-28.45721\\-141.6641\\-149\\-26.32398\\-143.6172\\-149\\-22.46094\\-147.6641\\-149\\-19.54369\\-151.4297\\-149\\-18.24951\\-153.3828\\-149\\-17.34484\\-155.3359\\-149\\-16.11628\\-157.2891\\-149\\-15.40006\\-159.2422\\-149\\-14.40774\\-161.1953\\-149\\-13.83846\\-163.1484\\-149\\-12.98545\\-167.0547\\-149\\-12.29519\\-169.0078\\-149\\-11.91518\\-170.9609\\-149\\-11.51399\\-174.8672\\-149\\-11.21841\\-176.8203\\-149\\-10.39567\\-180.7266\\-149\\-10.1279\\-182.6797\\-149\\-9.990618\\-184.6328\\-149\\-9.826078\\-188.5391\\-149\\-9.79366\\-190.4922\\-149\\-9.946986\\-196.3516\\-149\\-9.928386\\-200.2578\\-149\\-9.973204\\-204.1641\\-149\\-9.727515\\-208.0703\\-149\\-9.557088\\-213.9297\\-149\\-9.6952\\-219.7891\\-149\\-9.811908\\-221.7422\\-149\\-10.17253\\-225.6484\\-149\\-11.24563\\-227.6016\\-149\\-10.94593\\-229.5547\\-149\\-11.30106\\-231.5078\\-149\\-11.92197\\-237.3672\\-149\\-12.2635\\-239.3203\\-149\\-12.86677\\-241.2734\\-149\\-13.31505\\-243.2266\\-149\\-14.03073\\-247.1328\\-149\\-14.64844\\-249.0675\\-149\\-15.39924\\-251.0391\\-149\\-15.8864\\-252.9922\\-149\\-17.49717\\-256.8984\\-149\\-18.0603\\-258.8516\\-149\\-19.11542\\-260.8047\\-149\\-19.63909\\-262.7578\\-149\\-20.4094\\-264.7109\\-149\\-22.46094\\-268.8232\\-149\\-24.41406\\-272.2278\\-149\\-24.65278\\-272.5234\\-149\\-25.56046\\-274.4766\\-149\\-26.7817\\-276.4297\\-149\\-27.80404\\-278.3828\\-149\\-30.27344\\-281.7031\\-149\\-30.78562\\-282.2891\\-149\\-31.96565\\-284.2422\\-149\\-33.32753\\-286.1953\\-149\\-34.95708\\-288.1484\\-149\\-36.79456\\-290.1016\\-149\\-40.03906\\-293.6745\\-149\\-43.94531\\-296.7798\\-149\\-45.89844\\-298.1685\\-149\\-47.85156\\-299.226\\-149\\-49.80469\\-300.4138\\-149\\-51.75781\\-301.0621\\-149\\-55.66406\\-302.5179\\-149\\-59.57031\\-303.1166\\-149\\-63.47656\\-303.9478\\-149\\-65.42969\\-304.2081\\-149\\-69.33594\\-304.409\\-149\\-73.24219\\-304.3877\\-149\\-77.14844\\-304.1988\\-149" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "179" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "28" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.3186\\-149\\55.66406\\-301.159\\-149\\53.71094\\-300.6819\\-149\\51.75781\\-299.9206\\-149\\47.85156\\-297.9217\\-149\\45.89844\\-296.7767\\-149\\43.94531\\-295.4289\\-149\\41.99219\\-294.3802\\-149\\40.03906\\-292.8198\\-149\\36.13281\\-289.211\\-149\\34.92606\\-288.1484\\-149\\33.07547\\-286.1953\\-149\\29.66391\\-282.2891\\-149\\28.08679\\-280.3359\\-149\\26.92057\\-278.3828\\-149\\25.57216\\-276.4297\\-149\\23.34449\\-272.5234\\-149\\22.04606\\-270.5703\\-149\\21.21538\\-268.6172\\-149\\20.05558\\-266.6641\\-149\\18.78231\\-262.7578\\-149\\17.78264\\-260.8047\\-149\\17.19527\\-258.8516\\-149\\16.21462\\-256.8984\\-149\\15.0303\\-252.9922\\-149\\14.24893\\-251.0391\\-149\\12.95906\\-245.1797\\-149\\12.24002\\-243.2266\\-149\\11.8606\\-241.2734\\-149\\11.38762\\-237.3672\\-149\\10.98633\\-235.4141\\-149\\10.39567\\-233.4609\\-149\\10.08606\\-231.5078\\-149\\9.709555\\-227.6016\\-149\\9.028081\\-217.8359\\-149\\8.708294\\-213.9297\\-149\\8.452972\\-208.0703\\-149\\8.402122\\-200.2578\\-149\\8.4851\\-198.3047\\-149\\9.190813\\-192.4453\\-149\\9.788877\\-188.5391\\-149\\9.956287\\-186.5859\\-149\\10.16488\\-182.6797\\-149\\10.36516\\-180.7266\\-149\\11.21511\\-176.8203\\-149\\11.53927\\-174.8672\\-149\\11.98774\\-170.9609\\-149\\12.42963\\-169.0078\\-149\\13.08457\\-167.0547\\-149\\13.89591\\-163.1484\\-149\\14.58185\\-161.1953\\-149\\15.55675\\-159.2422\\-149\\16.41323\\-157.2891\\-149\\19.96228\\-151.4297\\-149\\22.46094\\-148.4538\\-149\\24.41406\\-146.3725\\-149\\27.18991\\-143.6172\\-149\\30.27344\\-140.9395\\-149\\32.22656\\-139.6383\\-149\\34.17969\\-138.5181\\-149\\36.13281\\-137.1675\\-149\\38.08594\\-136.2251\\-149\\40.03906\\-135.0652\\-149\\41.99219\\-134.3463\\-149\\43.94531\\-133.3567\\-149\\47.85156\\-132.4645\\-149\\49.80469\\-131.6962\\-149\\51.75781\\-131.1813\\-149\\59.57031\\-130.1081\\-149\\61.52344\\-129.8645\\-149\\63.47656\\-129.7709\\-149\\67.38281\\-129.9529\\-149\\73.24219\\-130.4307\\-149\\79.10156\\-130.8353\\-149\\83.00781\\-131.1416\\-149\\84.96094\\-131.346\\-149\\86.91406\\-132.1028\\-149\\88.86719\\-132.6399\\-149\\90.82031\\-132.8158\\-149\\92.77344\\-132.8221\\-149\\94.72656\\-132.9342\\-149\\96.67969\\-133.6187\\-149\\98.63281\\-134.0677\\-149\\100.5859\\-134.1771\\-149\\102.5391\\-134.6059\\-149\\106.4453\\-135.8126\\-149\\108.3984\\-136.2867\\-149\\110.3516\\-136.9183\\-149\\112.3047\\-137.9943\\-149\\114.2578\\-138.3729\\-149\\118.1641\\-138.9968\\-149\\122.0703\\-140.4588\\-149\\124.0234\\-141.0272\\-149\\125.9766\\-141.9735\\-149\\127.9297\\-142.798\\-149\\129.8828\\-143.8685\\-149\\131.8359\\-144.7228\\-149\\133.7891\\-145.7916\\-149\\135.7422\\-146.6783\\-149\\139.6484\\-149.0432\\-149\\142.775\\-151.4297\\-149\\143.5547\\-152.1154\\-149\\147.4609\\-155.0827\\-149\\151.3672\\-158.872\\-149\\153.6628\\-161.1953\\-149\\156.5194\\-165.1016\\-149\\157.2266\\-165.9561\\-149\\159.3805\\-169.0078\\-149\\160.4167\\-170.9609\\-149\\161.6313\\-172.9141\\-149\\162.2813\\-174.8672\\-149\\163.2136\\-176.8203\\-149\\163.9238\\-178.7734\\-149\\164.4014\\-180.7266\\-149\\165.1611\\-182.6797\\-149\\165.659\\-184.6328\\-149\\166.5039\\-190.4922\\-149\\166.9922\\-192.8848\\-149\\167.4297\\-196.3516\\-149\\167.5563\\-198.3047\\-149\\167.6723\\-202.2109\\-149\\167.6988\\-206.1172\\-149\\167.5981\\-210.0234\\-149\\167.4956\\-211.9766\\-149\\167.1538\\-215.8828\\-149\\166.4686\\-219.7891\\-149\\165.6672\\-225.6484\\-149\\165.2261\\-227.6016\\-149\\164.5538\\-229.5547\\-149\\163.7827\\-233.4609\\-149\\162.3999\\-237.3672\\-149\\161.9724\\-239.3203\\-149\\161.315\\-241.2734\\-149\\160.3504\\-243.2266\\-149\\159.668\\-245.1797\\-149\\158.4861\\-247.1328\\-149\\157.7119\\-249.0859\\-149\\156.5317\\-251.0391\\-149\\155.8475\\-252.9922\\-149\\154.633\\-254.9453\\-149\\153.6505\\-256.8984\\-149\\153.3203\\-257.2874\\-149\\151.3672\\-260.1781\\-149\\150.845\\-260.8047\\-149\\149.6899\\-262.7578\\-149\\148.3367\\-264.7109\\-149\\146.716\\-266.6641\\-149\\143.2192\\-270.5703\\-149\\141.6016\\-272.5145\\-149\\139.6484\\-274.625\\-149\\137.6953\\-276.3708\\-149\\135.6671\\-278.3828\\-149\\133.5954\\-280.3359\\-149\\129.8828\\-283.3734\\-149\\128.9063\\-284.2422\\-149\\125.9766\\-286.5898\\-149\\120.1172\\-290.3525\\-149\\118.1641\\-291.3563\\-149\\116.2109\\-292.7423\\-149\\114.2578\\-293.6778\\-149\\112.3047\\-294.7734\\-149\\110.3516\\-295.4001\\-149\\108.3984\\-296.4619\\-149\\106.4453\\-297.0731\\-149\\104.4922\\-298.0226\\-149\\102.5391\\-298.7769\\-149\\100.5859\\-299.4066\\-149\\98.63281\\-300.2438\\-149\\96.67969\\-300.6953\\-149\\92.77344\\-301.4447\\-149\\90.82031\\-302.0081\\-149\\88.86719\\-302.4101\\-149\\86.91406\\-302.6533\\-149\\81.05469\\-303.0355\\-149\\77.14844\\-303.2336\\-149\\73.24219\\-303.3135\\-149\\71.28906\\-303.2852\\-149\\67.38281\\-303.0678\\-149\\61.52344\\-302.6466\\-149" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "174" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "29" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-304.0209\\-147\\-83.00781\\-303.333\\-147\\-86.91406\\-302.8559\\-147\\-88.86719\\-302.6776\\-147\\-90.82031\\-302.3884\\-147\\-94.72656\\-301.2485\\-147\\-98.63281\\-300.3524\\-147\\-100.5859\\-299.4407\\-147\\-102.5391\\-298.7155\\-147\\-104.4922\\-297.7173\\-147\\-106.4453\\-296.8628\\-147\\-110.3516\\-294.9598\\-147\\-114.2578\\-292.7816\\-147\\-116.2109\\-291.2487\\-147\\-118.1641\\-289.8669\\-147\\-120.1172\\-288.8016\\-147\\-122.0703\\-287.2533\\-147\\-125.9766\\-283.8851\\-147\\-127.9297\\-282.4251\\-147\\-129.8828\\-280.6184\\-147\\-132.0114\\-278.3828\\-147\\-133.9778\\-276.4297\\-147\\-135.7677\\-274.4766\\-147\\-137.1695\\-272.5234\\-147\\-138.8139\\-270.5703\\-147\\-140.557\\-268.6172\\-147\\-142.1102\\-266.6641\\-147\\-143.1013\\-264.7109\\-147\\-145.9246\\-260.8047\\-147\\-147.0349\\-258.8516\\-147\\-148.3077\\-256.8984\\-147\\-149.4141\\-254.7977\\-147\\-151.2798\\-251.0391\\-147\\-153.3203\\-247.34\\-147\\-156.0535\\-241.2734\\-147\\-156.5817\\-239.3203\\-147\\-157.6184\\-237.3672\\-147\\-158.2707\\-235.4141\\-147\\-159.9305\\-231.5078\\-147\\-160.4722\\-229.5547\\-147\\-161.3004\\-227.6016\\-147\\-161.8502\\-225.6484\\-147\\-162.5527\\-221.7422\\-147\\-163.1995\\-219.7891\\-147\\-163.7464\\-217.8359\\-147\\-164.36\\-213.9297\\-147\\-165.332\\-210.0234\\-147\\-165.6567\\-208.0703\\-147\\-165.976\\-204.1641\\-147\\-166.1441\\-200.2578\\-147\\-166.1067\\-196.3516\\-147\\-165.8213\\-192.4453\\-147\\-165.5963\\-190.4922\\-147\\-165.1198\\-188.5391\\-147\\-164.4939\\-186.5859\\-147\\-163.6169\\-182.6797\\-147\\-162.6883\\-180.7266\\-147\\-162.0667\\-178.7734\\-147\\-161.2181\\-176.8203\\-147\\-160.1396\\-174.8672\\-147\\-158.8329\\-172.9141\\-147\\-157.6584\\-170.9609\\-147\\-155.2734\\-167.6746\\-147\\-153.3203\\-165.3625\\-147\\-149.4141\\-161.1168\\-147\\-147.3976\\-159.2422\\-147\\-145.5078\\-157.7738\\-147\\-141.6016\\-154.4216\\-147\\-139.6484\\-152.9465\\-147\\-137.6953\\-152.0077\\-147\\-136.9691\\-151.4297\\-147\\-133.7891\\-149.2649\\-147\\-131.8359\\-148.2076\\-147\\-129.8828\\-146.9663\\-147\\-127.9297\\-146.2856\\-147\\-125.9766\\-145.1947\\-147\\-124.0234\\-144.4809\\-147\\-122.0703\\-143.3934\\-147\\-120.1172\\-142.5724\\-147\\-118.1641\\-141.6107\\-147\\-116.2109\\-140.8161\\-147\\-114.2578\\-140.2513\\-147\\-112.3047\\-139.3642\\-147\\-108.3984\\-138.3239\\-147\\-106.4453\\-137.4217\\-147\\-102.5391\\-136.305\\-147\\-100.5859\\-135.4686\\-147\\-96.67969\\-134.5854\\-147\\-92.77344\\-133.3831\\-147\\-90.82031\\-133.0308\\-147\\-86.91406\\-132.5436\\-147\\-84.96094\\-132.1227\\-147\\-83.00781\\-131.537\\-147\\-81.05469\\-131.1796\\-147\\-75.19531\\-130.6429\\-147\\-71.28906\\-130.3517\\-147\\-67.38281\\-130.181\\-147\\-63.47656\\-130.2159\\-147\\-61.52344\\-130.2964\\-147\\-55.66406\\-130.7381\\-147\\-53.71094\\-131.0054\\-147\\-51.75781\\-131.4131\\-147\\-49.80469\\-132.1114\\-147\\-47.85156\\-132.6439\\-147\\-45.89844\\-132.9349\\-147\\-43.94531\\-133.39\\-147\\-41.99219\\-134.2805\\-147\\-40.03906\\-134.9557\\-147\\-36.13281\\-136.8453\\-147\\-34.17969\\-138.0315\\-147\\-32.22656\\-138.9834\\-147\\-28.42262\\-141.6641\\-147\\-26.30722\\-143.6172\\-147\\-22.46094\\-147.6152\\-147\\-19.50637\\-151.4297\\-147\\-18.21588\\-153.3828\\-147\\-17.3133\\-155.3359\\-147\\-16.08975\\-157.2891\\-147\\-15.38224\\-159.2422\\-147\\-14.39576\\-161.1953\\-147\\-13.82698\\-163.1484\\-147\\-13.00921\\-167.0547\\-147\\-12.33082\\-169.0078\\-147\\-11.92882\\-170.9609\\-147\\-11.54307\\-174.8672\\-147\\-10.97238\\-178.7734\\-147\\-10.4947\\-180.7266\\-147\\-10.18807\\-182.6797\\-147\\-9.94873\\-186.5859\\-147\\-9.896457\\-190.4922\\-147\\-10.03689\\-196.3516\\-147\\-9.994284\\-204.1641\\-147\\-9.789328\\-208.0703\\-147\\-9.658737\\-211.9766\\-147\\-9.72296\\-217.8359\\-147\\-9.86236\\-221.7422\\-147\\-10.01827\\-223.6953\\-147\\-10.64745\\-225.6484\\-147\\-11.57003\\-227.6016\\-147\\-11.04318\\-229.5547\\-147\\-11.38006\\-231.5078\\-147\\-12.01468\\-237.3672\\-147\\-12.36747\\-239.3203\\-147\\-12.98545\\-241.2734\\-147\\-14.09466\\-247.1328\\-147\\-15.50356\\-251.0391\\-147\\-15.99855\\-252.9922\\-147\\-16.95726\\-254.9453\\-147\\-18.24951\\-258.8516\\-147\\-19.23587\\-260.8047\\-147\\-19.72535\\-262.7578\\-147\\-21.51035\\-266.6641\\-147\\-23.57328\\-270.5703\\-147\\-24.84588\\-272.5234\\-147\\-25.6633\\-274.4766\\-147\\-26.92805\\-276.4297\\-147\\-27.95493\\-278.3828\\-147\\-30.27344\\-281.497\\-147\\-30.93957\\-282.2891\\-147\\-33.42223\\-286.1953\\-147\\-35.04284\\-288.1484\\-147\\-40.51947\\-294.0078\\-147\\-43.94531\\-296.741\\-147\\-45.89844\\-298.1038\\-147\\-47.85156\\-299.1987\\-147\\-49.80469\\-300.3959\\-147\\-51.75781\\-301.0574\\-147\\-55.66406\\-302.51\\-147\\-59.57031\\-303.1166\\-147\\-63.47656\\-303.935\\-147\\-65.42969\\-304.1988\\-147\\-67.38281\\-304.3431\\-147\\-71.28906\\-304.4296\\-147\\-75.19531\\-304.3354\\-147" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "30" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.285\\-147\\57.61719\\-301.6489\\-147\\53.71094\\-300.6588\\-147\\51.75781\\-299.875\\-147\\47.86174\\-297.9141\\-147\\45.89844\\-296.7648\\-147\\43.94531\\-295.4058\\-147\\41.99219\\-294.3661\\-147\\40.03906\\-292.8073\\-147\\37.13669\\-290.1016\\-147\\34.94847\\-288.1484\\-147\\33.08823\\-286.1953\\-147\\29.6508\\-282.2891\\-147\\28.07442\\-280.3359\\-147\\26.89807\\-278.3828\\-147\\25.55751\\-276.4297\\-147\\24.5014\\-274.4766\\-147\\22.46094\\-271.0374\\-147\\22.10046\\-270.5703\\-147\\21.24168\\-268.6172\\-147\\20.076\\-266.6641\\-147\\18.78403\\-262.7578\\-147\\17.78264\\-260.8047\\-147\\17.21398\\-258.8516\\-147\\16.20483\\-256.8984\\-147\\15.01778\\-252.9922\\-147\\14.22631\\-251.0391\\-147\\12.9713\\-245.1797\\-147\\12.26054\\-243.2266\\-147\\11.8606\\-241.2734\\-147\\11.38762\\-237.3672\\-147\\10.97238\\-235.4141\\-147\\10.4061\\-233.4609\\-147\\10.08606\\-231.5078\\-147\\9.709555\\-227.6016\\-147\\9.15288\\-219.7891\\-147\\8.518528\\-210.0234\\-147\\8.422074\\-206.1172\\-147\\8.382667\\-200.2578\\-147\\8.44254\\-198.3047\\-147\\9.148186\\-192.4453\\-147\\9.779576\\-188.5391\\-147\\9.946986\\-186.5859\\-147\\10.18025\\-182.6797\\-147\\10.42737\\-180.7266\\-147\\11.28406\\-176.8203\\-147\\11.56649\\-174.8672\\-147\\12.01468\\-170.9609\\-147\\12.48076\\-169.0078\\-147\\13.10614\\-167.0547\\-147\\13.89591\\-163.1484\\-147\\14.56706\\-161.1953\\-147\\15.52998\\-159.2422\\-147\\16.35064\\-157.2891\\-147\\19.92985\\-151.4297\\-147\\22.46094\\-148.4406\\-147\\24.41406\\-146.3306\\-147\\27.13352\\-143.6172\\-147\\30.27344\\-140.8841\\-147\\32.22656\\-139.5327\\-147\\34.17969\\-138.449\\-147\\36.13281\\-137.1156\\-147\\38.08594\\-136.112\\-147\\40.03906\\-134.9955\\-147\\41.99219\\-134.2381\\-147\\43.94531\\-133.2669\\-147\\47.85156\\-132.3507\\-147\\49.80469\\-131.5474\\-147\\51.75781\\-131.1065\\-147\\55.66406\\-130.5766\\-147\\59.57031\\-129.9377\\-147\\61.52344\\-129.7215\\-147\\63.47656\\-129.6198\\-147\\67.38281\\-129.7583\\-147\\69.33594\\-129.8931\\-147\\75.19531\\-130.4733\\-147\\83.00781\\-131.054\\-147\\84.96094\\-131.2387\\-147\\86.91406\\-131.6731\\-147\\88.86719\\-132.3179\\-147\\90.82031\\-132.5889\\-147\\94.72656\\-132.8691\\-147\\96.67969\\-133.4945\\-147\\98.63281\\-133.9076\\-147\\100.5859\\-134.0903\\-147\\102.5391\\-134.4596\\-147\\108.3984\\-135.9589\\-147\\110.3516\\-136.7057\\-147\\112.3047\\-137.5796\\-147\\114.2578\\-137.9485\\-147\\118.1641\\-138.8513\\-147\\120.1172\\-139.4022\\-147\\122.0703\\-140.2773\\-147\\124.0234\\-140.8651\\-147\\125.9341\\-141.6641\\-147\\129.8828\\-143.565\\-147\\131.8359\\-144.5992\\-147\\133.7891\\-145.5303\\-147\\135.7422\\-146.5592\\-147\\139.6484\\-148.8427\\-147\\142.9798\\-151.4297\\-147\\143.5547\\-151.95\\-147\\145.5078\\-153.2779\\-147\\147.4609\\-154.8339\\-147\\151.3672\\-158.6831\\-147\\153.8295\\-161.1953\\-147\\155.3309\\-163.1484\\-147\\156.6145\\-165.1016\\-147\\157.2266\\-165.8199\\-147\\159.4966\\-169.0078\\-147\\160.5202\\-170.9609\\-147\\161.7513\\-172.9141\\-147\\162.3277\\-174.8672\\-147\\163.3085\\-176.8203\\-147\\163.9723\\-178.7734\\-147\\164.4566\\-180.7266\\-147\\165.2508\\-182.6797\\-147\\165.7441\\-184.6328\\-147\\166.6101\\-190.4922\\-147\\167.0588\\-192.4453\\-147\\167.3503\\-194.3984\\-147\\167.5232\\-196.3516\\-147\\167.7289\\-202.2109\\-147\\167.7473\\-206.1172\\-147\\167.6374\\-210.0234\\-147\\167.3891\\-213.9297\\-147\\167.1792\\-215.8828\\-147\\166.4919\\-219.7891\\-147\\165.6672\\-225.6484\\-147\\165.2007\\-227.6016\\-147\\164.5356\\-229.5547\\-147\\163.7612\\-233.4609\\-147\\162.3875\\-237.3672\\-147\\161.9605\\-239.3203\\-147\\161.287\\-241.2734\\-147\\160.3394\\-243.2266\\-147\\159.6375\\-245.1797\\-147\\158.461\\-247.1328\\-147\\157.6796\\-249.0859\\-147\\156.5158\\-251.0391\\-147\\155.8211\\-252.9922\\-147\\154.5993\\-254.9453\\-147\\153.6004\\-256.8984\\-147\\151.3672\\-260.1025\\-147\\150.7892\\-260.8047\\-147\\149.6063\\-262.7578\\-147\\148.2663\\-264.7109\\-147\\146.6585\\-266.6641\\-147\\144.882\\-268.6172\\-147\\141.4577\\-272.5234\\-147\\139.6484\\-274.4524\\-147\\137.6953\\-276.217\\-147\\133.5325\\-280.3359\\-147\\129.8828\\-283.3464\\-147\\128.8837\\-284.2422\\-147\\125.9766\\-286.5689\\-147\\120.1172\\-290.3642\\-147\\118.1641\\-291.3637\\-147\\116.2109\\-292.7498\\-147\\114.2578\\-293.6913\\-147\\112.3047\\-294.7854\\-147\\110.3516\\-295.4325\\-147\\108.3984\\-296.4897\\-147\\106.4453\\-297.1012\\-147\\104.4922\\-298.0627\\-147\\100.5859\\-299.4199\\-147\\98.63281\\-300.2641\\-147\\96.67969\\-300.7067\\-147\\92.77344\\-301.4558\\-147\\90.82031\\-302.0216\\-147\\88.86719\\-302.4227\\-147\\86.91406\\-302.6648\\-147\\81.05469\\-303.0355\\-147\\77.14844\\-303.2249\\-147\\73.24219\\-303.2945\\-147\\71.28906\\-303.2457\\-147\\67.38281\\-303.0453\\-147\\61.52344\\-302.6214\\-147" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "177" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "31" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-304.0553\\-145\\-83.00781\\-303.3633\\-145\\-90.82031\\-302.4189\\-145\\-94.72656\\-301.2835\\-145\\-98.63281\\-300.3828\\-145\\-100.5859\\-299.4703\\-145\\-102.5391\\-298.7489\\-145\\-104.4922\\-297.7863\\-145\\-108.3984\\-295.969\\-145\\-112.1553\\-294.0078\\-145\\-114.2578\\-292.7927\\-145\\-116.2109\\-291.2557\\-145\\-118.1641\\-289.8803\\-145\\-120.1172\\-288.823\\-145\\-123.38\\-286.1953\\-145\\-125.9766\\-283.9241\\-145\\-127.9297\\-282.4844\\-145\\-129.8828\\-280.7002\\-145\\-134.0393\\-276.4297\\-145\\-135.8805\\-274.4766\\-145\\-137.2419\\-272.5234\\-145\\-138.8829\\-270.5703\\-145\\-140.6312\\-268.6172\\-145\\-142.202\\-266.6641\\-145\\-143.2243\\-264.7109\\-145\\-146.0564\\-260.8047\\-145\\-148.4007\\-256.8984\\-145\\-149.4706\\-254.9453\\-145\\-150.374\\-252.9922\\-145\\-151.5046\\-251.0391\\-145\\-152.4665\\-249.0859\\-145\\-153.6501\\-247.1328\\-145\\-154.4124\\-245.1797\\-145\\-155.3601\\-243.2266\\-145\\-156.1422\\-241.2734\\-145\\-156.7253\\-239.3203\\-145\\-157.7755\\-237.3672\\-145\\-158.3739\\-235.4141\\-145\\-159.3667\\-233.4609\\-145\\-160.0438\\-231.5078\\-145\\-160.6198\\-229.5547\\-145\\-161.4898\\-227.6016\\-145\\-161.9486\\-225.6484\\-145\\-162.683\\-221.7422\\-145\\-163.4069\\-219.7891\\-145\\-163.8532\\-217.8359\\-145\\-164.5058\\-213.9297\\-145\\-165.0766\\-211.9766\\-145\\-165.5099\\-210.0234\\-145\\-165.9509\\-206.1172\\-145\\-166.2204\\-202.2109\\-145\\-166.2775\\-200.2578\\-145\\-166.2268\\-196.3516\\-145\\-166.1067\\-194.3984\\-145\\-165.7056\\-190.4922\\-145\\-165.3096\\-188.5391\\-145\\-164.6343\\-186.5859\\-145\\-163.7313\\-182.6797\\-145\\-162.827\\-180.7266\\-145\\-161.3733\\-176.8203\\-145\\-159.1797\\-173.1113\\-145\\-157.7999\\-170.9609\\-145\\-156.2912\\-169.0078\\-145\\-155.2734\\-167.4994\\-145\\-153.3203\\-165.1983\\-145\\-149.4141\\-161.0185\\-145\\-147.4609\\-159.2169\\-145\\-145.5078\\-157.7381\\-145\\-141.6016\\-154.4026\\-145\\-139.6484\\-152.9326\\-145\\-137.6953\\-151.9944\\-145\\-136.9858\\-151.4297\\-145\\-133.7891\\-149.2649\\-145\\-131.8359\\-148.2035\\-145\\-129.8828\\-146.9663\\-145\\-127.9297\\-146.2732\\-145\\-125.9766\\-145.1838\\-145\\-124.0234\\-144.4453\\-145\\-122.0703\\-143.3466\\-145\\-120.1172\\-142.5232\\-145\\-118.1641\\-141.5246\\-145\\-116.2109\\-140.7694\\-145\\-114.2578\\-140.1826\\-145\\-112.3047\\-139.2914\\-145\\-108.3984\\-138.2621\\-145\\-106.4453\\-137.3489\\-145\\-102.5391\\-136.2809\\-145\\-100.5859\\-135.4582\\-145\\-96.67969\\-134.5591\\-145\\-92.77344\\-133.3633\\-145\\-90.82031\\-133.0068\\-145\\-86.91406\\-132.4868\\-145\\-83.00781\\-131.4309\\-145\\-81.05469\\-131.1373\\-145\\-77.14844\\-130.7354\\-145\\-71.28906\\-130.2383\\-145\\-67.38281\\-130.0401\\-145\\-65.42969\\-130.0119\\-145\\-61.52344\\-130.0817\\-145\\-57.61719\\-130.3869\\-145\\-55.66406\\-130.5983\\-145\\-53.71094\\-130.9165\\-145\\-51.75781\\-131.3477\\-145\\-47.85156\\-132.5985\\-145\\-45.89844\\-132.9167\\-145\\-43.94531\\-133.3799\\-145\\-41.99219\\-134.2596\\-145\\-40.03906\\-134.9397\\-145\\-36.13281\\-136.8249\\-145\\-34.17969\\-138.0076\\-145\\-32.22656\\-138.9622\\-145\\-28.34961\\-141.6641\\-145\\-26.20994\\-143.6172\\-145\\-22.45331\\-147.5234\\-145\\-19.46239\\-151.4297\\-145\\-18.15257\\-153.3828\\-145\\-17.28795\\-155.3359\\-145\\-16.06942\\-157.2891\\-145\\-15.37531\\-159.2422\\-145\\-14.41988\\-161.1953\\-145\\-13.83846\\-163.1484\\-145\\-13.0598\\-167.0547\\-145\\-12.39102\\-169.0078\\-145\\-11.96145\\-170.9609\\-145\\-11.72394\\-172.9141\\-145\\-11.36877\\-176.8203\\-145\\-11.10026\\-178.7734\\-145\\-10.2892\\-182.6797\\-145\\-10.02441\\-186.5859\\-145\\-10.00855\\-190.4922\\-145\\-10.18025\\-196.3516\\-145\\-10.07269\\-204.1641\\-145\\-9.732441\\-211.9766\\-145\\-9.79366\\-217.8359\\-145\\-9.932242\\-221.7422\\-145\\-10.06611\\-223.6953\\-145\\-11.2274\\-225.6484\\-145\\-11.58422\\-227.6016\\-145\\-11.09789\\-229.5547\\-145\\-11.42798\\-231.5078\\-145\\-11.81481\\-235.4141\\-145\\-12.07886\\-237.3672\\-145\\-12.46939\\-239.3203\\-145\\-13.07091\\-241.2734\\-145\\-13.77467\\-245.1797\\-145\\-14.18488\\-247.1328\\-145\\-14.99815\\-249.0859\\-145\\-16.1279\\-252.9922\\-145\\-17.12514\\-254.9453\\-145\\-17.68038\\-256.8984\\-145\\-19.31818\\-260.8047\\-145\\-19.80939\\-262.7578\\-145\\-20.78978\\-264.7109\\-145\\-21.61872\\-266.6641\\-145\\-22.75459\\-268.6172\\-145\\-23.68438\\-270.5703\\-145\\-25.00124\\-272.5234\\-145\\-25.77076\\-274.4766\\-145\\-27.06653\\-276.4297\\-145\\-28.13947\\-278.3828\\-145\\-30.27344\\-281.3281\\-145\\-31.05342\\-282.2891\\-145\\-32.375\\-284.2422\\-145\\-33.5095\\-286.1953\\-145\\-35.13137\\-288.1484\\-145\\-40.64289\\-294.0078\\-145\\-43.94531\\-296.6855\\-145\\-45.89844\\-298.0226\\-145\\-49.80469\\-300.3868\\-145\\-51.75781\\-301.0574\\-145\\-55.66406\\-302.51\\-145\\-59.57031\\-303.1013\\-145\\-63.47656\\-303.9221\\-145\\-65.42969\\-304.1988\\-145\\-69.33594\\-304.4159\\-145\\-73.24219\\-304.4159\\-145\\-77.14844\\-304.2531\\-145" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "32" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.2369\\-145\\57.61719\\-301.5944\\-145\\53.71094\\-300.6126\\-145\\51.88519\\-299.8672\\-145\\47.96231\\-297.9141\\-145\\45.89844\\-296.7265\\-145\\43.94531\\-295.383\\-145\\41.99219\\-294.3166\\-145\\40.03906\\-292.7746\\-145\\37.17863\\-290.1016\\-145\\34.98186\\-288.1484\\-145\\33.11377\\-286.1953\\-145\\29.65979\\-282.2891\\-145\\28.08508\\-280.3359\\-145\\26.91118\\-278.3828\\-145\\25.58223\\-276.4297\\-145\\24.41406\\-274.3094\\-145\\22.46094\\-270.9729\\-145\\22.14656\\-270.5703\\-145\\21.26479\\-268.6172\\-145\\20.08928\\-266.6641\\-145\\18.79699\\-262.7578\\-145\\17.79914\\-260.8047\\-145\\17.23987\\-258.8516\\-145\\16.22453\\-256.8984\\-145\\15.0303\\-252.9922\\-145\\14.22631\\-251.0391\\-145\\13.799\\-249.0859\\-145\\13.07091\\-245.1797\\-145\\12.33956\\-243.2266\\-145\\11.89076\\-241.2734\\-145\\11.41357\\-237.3672\\-145\\11.04526\\-235.4141\\-145\\10.47165\\-233.4609\\-145\\10.12074\\-231.5078\\-145\\9.742373\\-227.6016\\-145\\9.170923\\-219.7891\\-145\\8.842468\\-213.9297\\-145\\8.541577\\-210.0234\\-145\\8.354373\\-202.2109\\-145\\8.432241\\-198.3047\\-145\\8.640455\\-196.3516\\-145\\8.965976\\-194.3984\\-145\\9.188286\\-192.4453\\-145\\9.788877\\-188.5391\\-145\\10.21205\\-182.6797\\-145\\10.4947\\-180.7266\\-145\\10.97238\\-178.7734\\-145\\11.59928\\-174.8672\\-145\\12.0503\\-170.9609\\-145\\12.53634\\-169.0078\\-145\\13.14041\\-167.0547\\-145\\13.91457\\-163.1484\\-145\\14.59625\\-161.1953\\-145\\15.50887\\-159.2422\\-145\\16.31394\\-157.2891\\-145\\16.60156\\-156.9108\\-145\\18.55469\\-153.587\\-145\\19.90736\\-151.4297\\-145\\22.46094\\-148.401\\-145\\24.41406\\-146.2939\\-145\\27.08424\\-143.6172\\-145\\30.27344\\-140.8207\\-145\\32.22656\\-139.433\\-145\\34.17969\\-138.3763\\-145\\36.13281\\-137.0385\\-145\\40.03906\\-134.9286\\-145\\41.99219\\-134.1153\\-145\\43.94531\\-133.1817\\-145\\47.85156\\-132.2467\\-145\\49.80469\\-131.4219\\-145\\51.75781\\-131.0457\\-145\\55.66406\\-130.4816\\-145\\59.57031\\-129.7583\\-145\\63.47656\\-129.5106\\-145\\67.38281\\-129.5885\\-145\\71.28906\\-129.8645\\-145\\75.19531\\-130.3347\\-145\\81.05469\\-130.8441\\-145\\84.96094\\-131.1438\\-145\\86.91406\\-131.3788\\-145\\88.86719\\-131.762\\-145\\90.82031\\-132.2517\\-145\\94.72656\\-132.7697\\-145\\100.5859\\-133.7818\\-145\\104.4922\\-134.7543\\-145\\108.3984\\-135.569\\-145\\110.3516\\-136.4921\\-145\\112.3047\\-137.1287\\-145\\114.2578\\-137.4217\\-145\\116.2109\\-138.1926\\-145\\120.1172\\-139.1669\\-145\\122.0703\\-140.0484\\-145\\125.9766\\-141.386\\-145\\127.9297\\-142.435\\-145\\129.8828\\-143.2807\\-145\\131.8359\\-144.4404\\-145\\133.7891\\-145.2542\\-145\\135.7422\\-146.4154\\-145\\137.6953\\-147.4063\\-145\\139.6484\\-148.6498\\-145\\143.5547\\-151.7296\\-145\\145.5078\\-152.982\\-145\\147.4609\\-154.6251\\-145\\152.0908\\-159.2422\\-145\\153.9411\\-161.1953\\-145\\155.5118\\-163.1484\\-145\\156.7034\\-165.1016\\-145\\157.2266\\-165.7069\\-145\\159.5912\\-169.0078\\-145\\160.6099\\-170.9609\\-145\\161.8158\\-172.9141\\-145\\162.384\\-174.8672\\-145\\163.3954\\-176.8203\\-145\\164.5203\\-180.7266\\-145\\165.332\\-182.6797\\-145\\165.7969\\-184.6328\\-145\\166.7668\\-190.4922\\-145\\167.1805\\-192.4453\\-145\\167.4269\\-194.3984\\-145\\167.6764\\-198.3047\\-145\\167.7632\\-202.2109\\-145\\167.7746\\-206.1172\\-145\\167.6607\\-210.0234\\-145\\167.4241\\-213.9297\\-145\\167.1916\\-215.8828\\-145\\166.51\\-219.7891\\-145\\165.6634\\-225.6484\\-145\\165.1877\\-227.6016\\-145\\164.5146\\-229.5547\\-145\\163.7538\\-233.4609\\-145\\162.3796\\-237.3672\\-145\\161.9536\\-239.3203\\-145\\161.2734\\-241.2734\\-145\\160.3172\\-243.2266\\-145\\159.6089\\-245.1797\\-145\\158.4323\\-247.1328\\-145\\157.6425\\-249.0859\\-145\\156.4957\\-251.0391\\-145\\155.7785\\-252.9922\\-145\\154.5581\\-254.9453\\-145\\153.5349\\-256.8984\\-145\\151.3672\\-260.0122\\-145\\150.7269\\-260.8047\\-145\\149.5181\\-262.7578\\-145\\148.1998\\-264.7109\\-145\\146.5949\\-266.6641\\-145\\144.8006\\-268.6172\\-145\\141.3739\\-272.5234\\-145\\139.6484\\-274.3305\\-145\\137.6953\\-276.1321\\-145\\133.7891\\-280.0326\\-145\\129.8828\\-283.3195\\-145\\128.8537\\-284.2422\\-145\\125.9766\\-286.5474\\-145\\120.1172\\-290.3642\\-145\\118.1641\\-291.3711\\-145\\116.2109\\-292.7613\\-145\\114.2578\\-293.7047\\-145\\112.3047\\-294.7903\\-145\\110.3516\\-295.4523\\-145\\108.3984\\-296.511\\-145\\106.4453\\-297.1121\\-145\\104.4922\\-298.1011\\-145\\100.5859\\-299.4423\\-145\\98.63281\\-300.2767\\-145\\96.67969\\-300.7132\\-145\\92.77344\\-301.4671\\-145\\90.82031\\-302.0216\\-145\\88.86719\\-302.4101\\-145\\86.91406\\-302.6466\\-145\\81.05469\\-303.0313\\-145\\77.14844\\-303.2128\\-145\\73.24219\\-303.2546\\-145\\67.38281\\-303.0089\\-145\\61.52344\\-302.5838\\-145" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "191" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "33" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-304.0664\\-143\\-83.00781\\-303.4081\\-143\\-86.91406\\-302.9048\\-143\\-88.86719\\-302.7239\\-143\\-90.82031\\-302.4401\\-143\\-92.77344\\-301.9357\\-143\\-94.72656\\-301.3094\\-143\\-98.63281\\-300.407\\-143\\-100.5859\\-299.5115\\-143\\-102.5391\\-298.7816\\-143\\-108.3984\\-296.0165\\-143\\-112.1798\\-294.0078\\-143\\-114.2578\\-292.8037\\-143\\-116.2109\\-291.2746\\-143\\-118.1641\\-289.9093\\-143\\-120.1172\\-288.823\\-143\\-123.4102\\-286.1953\\-143\\-125.9766\\-283.9772\\-143\\-127.9297\\-282.5428\\-143\\-129.8828\\-280.7556\\-143\\-134.125\\-276.4297\\-143\\-135.9566\\-274.4766\\-143\\-137.3528\\-272.5234\\-143\\-138.9624\\-270.5703\\-143\\-140.6987\\-268.6172\\-143\\-142.2806\\-266.6641\\-143\\-143.3454\\-264.7109\\-143\\-144.6768\\-262.7578\\-143\\-146.1843\\-260.8047\\-143\\-147.4609\\-258.7309\\-143\\-149.6185\\-254.9453\\-143\\-150.4697\\-252.9922\\-143\\-151.6837\\-251.0391\\-143\\-152.5937\\-249.0859\\-143\\-153.8025\\-247.1328\\-143\\-154.5291\\-245.1797\\-143\\-155.5324\\-243.2266\\-143\\-156.8733\\-239.3203\\-143\\-157.8904\\-237.3672\\-143\\-158.4972\\-235.4141\\-143\\-159.5388\\-233.4609\\-143\\-160.7723\\-229.5547\\-143\\-161.6147\\-227.6016\\-143\\-162.0383\\-225.6484\\-143\\-162.352\\-223.6953\\-143\\-162.8454\\-221.7422\\-143\\-163.568\\-219.7891\\-143\\-164.261\\-215.8828\\-143\\-164.668\\-213.9297\\-143\\-165.2982\\-211.9766\\-143\\-165.6528\\-210.0234\\-143\\-165.8911\\-208.0703\\-143\\-166.2332\\-204.1641\\-143\\-166.4367\\-200.2578\\-143\\-166.358\\-196.3516\\-143\\-166.2204\\-194.3984\\-143\\-165.8113\\-190.4922\\-143\\-165.4644\\-188.5391\\-143\\-164.7846\\-186.5859\\-143\\-164.2396\\-184.6328\\-143\\-163.8156\\-182.6797\\-143\\-162.2064\\-178.7734\\-143\\-161.5137\\-176.8203\\-143\\-161.1328\\-176.2778\\-143\\-159.2323\\-172.9141\\-143\\-157.9155\\-170.9609\\-143\\-156.3802\\-169.0078\\-143\\-155.2734\\-167.3169\\-143\\-153.3974\\-165.1016\\-143\\-149.4141\\-160.9268\\-143\\-147.4609\\-159.1201\\-143\\-145.5078\\-157.6869\\-143\\-141.6016\\-154.3907\\-143\\-139.6484\\-152.922\\-143\\-137.6953\\-151.9944\\-143\\-136.9858\\-151.4297\\-143\\-133.7891\\-149.2896\\-143\\-131.8359\\-148.2259\\-143\\-129.8828\\-146.9986\\-143\\-127.9297\\-146.2856\\-143\\-125.9766\\-145.1595\\-143\\-124.0234\\-144.4244\\-143\\-122.0703\\-143.3132\\-143\\-120.1172\\-142.4912\\-143\\-118.1641\\-141.4574\\-143\\-116.2109\\-140.7404\\-143\\-114.2578\\-140.1352\\-143\\-112.3047\\-139.236\\-143\\-108.3984\\-138.2299\\-143\\-106.4453\\-137.3021\\-143\\-102.5391\\-136.2531\\-143\\-100.5859\\-135.4178\\-143\\-96.67969\\-134.5085\\-143\\-92.77344\\-133.3148\\-143\\-90.82031\\-132.9579\\-143\\-86.91406\\-132.4088\\-143\\-84.96094\\-131.8164\\-143\\-83.00781\\-131.3348\\-143\\-81.05469\\-131.0714\\-143\\-75.19531\\-130.4566\\-143\\-69.33594\\-129.9377\\-143\\-65.42969\\-129.7837\\-143\\-61.52344\\-129.7967\\-143\\-59.57031\\-129.9682\\-143\\-53.71094\\-130.8054\\-143\\-51.75781\\-131.238\\-143\\-47.85156\\-132.5353\\-143\\-45.89844\\-132.881\\-143\\-43.94531\\-133.3303\\-143\\-41.99219\\-134.1909\\-143\\-40.03906\\-134.8951\\-143\\-38.08594\\-135.7813\\-143\\-36.13281\\-136.7758\\-143\\-34.17969\\-137.95\\-143\\-32.22656\\-138.9335\\-143\\-30.27344\\-140.3062\\-143\\-28.32031\\-141.5788\\-143\\-26.07579\\-143.6172\\-143\\-22.32247\\-147.5234\\-143\\-19.41076\\-151.4297\\-143\\-18.07251\\-153.3828\\-143\\-17.25447\\-155.3359\\-143\\-16.05261\\-157.2891\\-143\\-15.38495\\-159.2422\\-143\\-14.44615\\-161.1953\\-143\\-13.87293\\-163.1484\\-143\\-13.13008\\-167.0547\\-143\\-12.48238\\-169.0078\\-143\\-12.00701\\-170.9609\\-143\\-11.74472\\-172.9141\\-143\\-11.42082\\-176.8203\\-143\\-11.19626\\-178.7734\\-143\\-10.4061\\-182.6797\\-143\\-10.19597\\-184.6328\\-143\\-10.08606\\-188.5391\\-143\\-10.19597\\-192.4453\\-143\\-10.35525\\-196.3516\\-143\\-10.2983\\-200.2578\\-143\\-10.18025\\-204.1641\\-143\\-10.03062\\-206.1172\\-143\\-10.0297\\-208.0703\\-143\\-9.80788\\-211.9766\\-143\\-9.788877\\-213.9297\\-143\\-9.908424\\-219.7891\\-143\\-10.11366\\-223.6953\\-143\\-10.74219\\-225.5709\\-143\\-11.57715\\-227.6016\\-143\\-11.16161\\-229.5547\\-143\\-11.46656\\-231.5078\\-143\\-11.85438\\-235.4141\\-143\\-12.11684\\-237.3672\\-143\\-12.56662\\-239.3203\\-143\\-13.14041\\-241.2734\\-143\\-13.81382\\-245.1797\\-143\\-14.30107\\-247.1328\\-143\\-15.19165\\-249.0859\\-143\\-16.23457\\-252.9922\\-143\\-17.23214\\-254.9453\\-143\\-17.75568\\-256.8984\\-143\\-18.63994\\-258.8516\\-143\\-19.37737\\-260.8047\\-143\\-19.90539\\-262.7578\\-143\\-20.94822\\-264.7109\\-143\\-21.73504\\-266.6641\\-143\\-22.93044\\-268.6172\\-143\\-23.80732\\-270.5703\\-143\\-25.12267\\-272.5234\\-143\\-25.88232\\-274.4766\\-143\\-27.18406\\-276.4297\\-143\\-28.32031\\-278.3517\\-143\\-29.65943\\-280.3359\\-143\\-31.1561\\-282.2891\\-143\\-32.54229\\-284.2422\\-143\\-33.61328\\-286.1953\\-143\\-35.21845\\-288.1484\\-143\\-38.88768\\-292.0547\\-143\\-40.03906\\-293.3682\\-143\\-41.99219\\-295.0704\\-143\\-43.94531\\-296.6183\\-143\\-45.89844\\-297.9217\\-143\\-49.80469\\-300.3523\\-143\\-51.75781\\-301.0306\\-143\\-55.66406\\-302.4978\\-143\\-59.57031\\-303.0784\\-143\\-61.52344\\-303.4189\\-143\\-63.47656\\-303.8955\\-143\\-65.42969\\-304.1798\\-143\\-67.38281\\-304.3431\\-143\\-71.28906\\-304.4296\\-143\\-73.24219\\-304.4159\\-143\\-77.14844\\-304.2703\\-143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "34" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.1646\\-143\\57.61719\\-301.5138\\-143\\53.71094\\-300.5589\\-143\\49.80469\\-298.8175\\-143\\45.89844\\-296.675\\-143\\43.94531\\-295.3473\\-143\\41.99219\\-294.2372\\-143\\40.03906\\-292.7079\\-143\\37.22796\\-290.1016\\-143\\35.03767\\-288.1484\\-143\\33.15206\\-286.1953\\-143\\29.70489\\-282.2891\\-143\\28.12644\\-280.3359\\-143\\26.93359\\-278.3828\\-143\\25.60695\\-276.4297\\-143\\24.41406\\-274.2586\\-143\\22.46094\\-270.9525\\-143\\22.15787\\-270.5703\\-143\\21.27878\\-268.6172\\-143\\20.11045\\-266.6641\\-143\\18.82234\\-262.7578\\-143\\17.82614\\-260.8047\\-143\\17.25803\\-258.8516\\-143\\16.25504\\-256.8984\\-143\\15.06519\\-252.9922\\-143\\14.25909\\-251.0391\\-143\\13.45351\\-247.1328\\-143\\13.18027\\-245.1797\\-143\\12.45301\\-243.2266\\-143\\11.94018\\-241.2734\\-143\\11.48135\\-237.3672\\-143\\11.16706\\-235.4141\\-143\\10.59358\\-233.4609\\-143\\10.18807\\-231.5078\\-143\\9.784138\\-227.6016\\-143\\9.238401\\-219.7891\\-143\\9.185987\\-217.8359\\-143\\8.965976\\-213.9297\\-143\\8.627473\\-210.0234\\-143\\8.327096\\-202.2109\\-143\\8.44254\\-198.3047\\-143\\8.680555\\-196.3516\\-143\\9.038255\\-194.3984\\-143\\9.606996\\-190.4922\\-143\\9.83042\\-188.5391\\-143\\10.09285\\-184.6328\\-143\\10.28022\\-182.6797\\-143\\10.59358\\-180.7266\\-143\\11.04736\\-178.7734\\-143\\11.37241\\-176.8203\\-143\\12.08726\\-170.9609\\-143\\13.177\\-167.0547\\-143\\13.93769\\-163.1484\\-143\\14.62573\\-161.1953\\-143\\15.51011\\-159.2422\\-143\\16.29352\\-157.2891\\-143\\16.60156\\-156.8756\\-143\\18.55469\\-153.5197\\-143\\19.87206\\-151.4297\\-143\\22.46094\\-148.3273\\-143\\24.41406\\-146.2377\\-143\\27.01595\\-143.6172\\-143\\28.32031\\-142.406\\-143\\30.27344\\-140.7505\\-143\\32.22656\\-139.342\\-143\\34.17969\\-138.3092\\-143\\36.13281\\-136.9545\\-143\\38.16451\\-135.8047\\-143\\40.03906\\-134.8565\\-143\\43.94531\\-133.1084\\-143\\45.89844\\-132.7044\\-143\\47.85156\\-132.1227\\-143\\49.80469\\-131.3158\\-143\\53.71094\\-130.7049\\-143\\55.66406\\-130.342\\-143\\57.61719\\-129.8787\\-143\\59.57031\\-129.5885\\-143\\63.47656\\-129.3912\\-143\\67.38281\\-129.44\\-143\\71.28906\\-129.6523\\-143\\75.19531\\-130.1447\\-143\\79.10156\\-130.5433\\-143\\81.05469\\-130.8024\\-143\\83.00781\\-130.8933\\-143\\86.91406\\-131.2216\\-143\\88.86719\\-131.4773\\-143\\92.77344\\-132.4214\\-143\\98.63281\\-133.1284\\-143\\100.5859\\-133.4733\\-143\\104.4922\\-134.5363\\-143\\108.3984\\-135.3253\\-143\\110.3516\\-136.5194\\-143\\112.3047\\-136.9099\\-143\\114.2578\\-137.1675\\-143\\118.1641\\-138.5542\\-143\\120.1172\\-138.977\\-143\\124.0234\\-140.5227\\-143\\125.9766\\-141.1353\\-143\\127.9297\\-142.1996\\-143\\129.8828\\-143.0374\\-143\\131.8359\\-144.2458\\-143\\133.7891\\-145.0257\\-143\\135.7422\\-146.2368\\-143\\137.6953\\-147.137\\-143\\139.6484\\-148.4383\\-143\\141.6016\\-149.9916\\-143\\145.5078\\-152.7614\\-143\\147.4609\\-154.432\\-143\\152.2481\\-159.2422\\-143\\154.0699\\-161.1953\\-143\\155.6597\\-163.1484\\-143\\156.8287\\-165.1016\\-143\\157.2266\\-165.5529\\-143\\159.6884\\-169.0078\\-143\\160.6937\\-170.9609\\-143\\161.8778\\-172.9141\\-143\\162.4453\\-174.8672\\-143\\163.4857\\-176.8203\\-143\\164.5986\\-180.7266\\-143\\165.4185\\-182.6797\\-143\\165.8537\\-184.6328\\-143\\166.5197\\-188.5391\\-143\\167.2664\\-192.4453\\-143\\167.6334\\-196.3516\\-143\\167.8022\\-202.2109\\-143\\167.7974\\-206.1172\\-143\\167.6018\\-211.9766\\-143\\167.2296\\-215.8828\\-143\\166.5315\\-219.7891\\-143\\165.6561\\-225.6484\\-143\\165.1611\\-227.6016\\-143\\164.4853\\-229.5547\\-143\\163.7351\\-233.4609\\-143\\162.3551\\-237.3672\\-143\\161.9436\\-239.3203\\-143\\161.2455\\-241.2734\\-143\\160.2997\\-243.2266\\-143\\159.5766\\-245.1797\\-143\\158.3974\\-247.1328\\-143\\157.6135\\-249.0859\\-143\\156.4711\\-251.0391\\-143\\155.731\\-252.9922\\-143\\154.518\\-254.9453\\-143\\153.3203\\-257.0323\\-143\\151.3672\\-259.9088\\-143\\150.6587\\-260.8047\\-143\\148.1142\\-264.7109\\-143\\146.5145\\-266.6641\\-143\\144.7119\\-268.6172\\-143\\141.2714\\-272.5234\\-143\\139.6484\\-274.2455\\-143\\137.3125\\-276.4297\\-143\\133.7891\\-279.9815\\-143\\129.8828\\-283.2926\\-143\\128.8236\\-284.2422\\-143\\125.9766\\-286.5118\\-143\\120.1172\\-290.3406\\-143\\118.1641\\-291.3786\\-143\\116.2109\\-292.7697\\-143\\114.2578\\-293.7238\\-143\\112.3047\\-294.8024\\-143\\110.3516\\-295.4659\\-143\\108.3984\\-296.5286\\-143\\106.4453\\-297.1295\\-143\\104.4922\\-298.1258\\-143\\100.5859\\-299.4577\\-143\\98.63281\\-300.2767\\-143\\96.67969\\-300.7181\\-143\\92.77344\\-301.4558\\-143\\90.82031\\-302.0081\\-143\\88.86719\\-302.3884\\-143\\84.96094\\-302.7804\\-143\\81.05469\\-303.0176\\-143\\77.14844\\-303.1839\\-143\\75.19531\\-303.2128\\-143\\71.28906\\-303.1638\\-143\\63.47656\\-302.7239\\-143\\61.52344\\-302.53\\-143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "182" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "35" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-303.811\\-141\\-83.00781\\-303.4055\\-141\\-84.96094\\-303.1166\\-141\\-88.86719\\-302.7239\\-141\\-90.82031\\-302.4441\\-141\\-92.77344\\-301.9357\\-141\\-94.72656\\-301.2999\\-141\\-98.63281\\-300.4157\\-141\\-100.5859\\-299.5439\\-141\\-102.5391\\-298.8023\\-141\\-108.3984\\-296.0318\\-141\\-112.2037\\-294.0078\\-141\\-114.2578\\-292.7969\\-141\\-116.2109\\-291.2794\\-141\\-118.1641\\-289.9233\\-141\\-120.1172\\-288.8359\\-141\\-123.4207\\-286.1953\\-141\\-125.9766\\-284.0038\\-141\\-127.9297\\-282.5561\\-141\\-129.8828\\-280.7826\\-141\\-132.203\\-278.3828\\-141\\-134.2054\\-276.4297\\-141\\-136.0156\\-274.4766\\-141\\-137.4455\\-272.5234\\-141\\-139.0373\\-270.5703\\-141\\-140.7478\\-268.6172\\-141\\-142.3435\\-266.6641\\-141\\-143.4652\\-264.7109\\-141\\-144.7524\\-262.7578\\-141\\-146.2764\\-260.8047\\-141\\-147.5152\\-258.8516\\-141\\-148.5743\\-256.8984\\-141\\-149.7396\\-254.9453\\-141\\-150.5572\\-252.9922\\-141\\-151.8076\\-251.0391\\-141\\-152.7077\\-249.0859\\-141\\-153.9063\\-247.1328\\-141\\-154.6285\\-245.1797\\-141\\-155.6626\\-243.2266\\-141\\-156.2847\\-241.2734\\-141\\-157.0268\\-239.3203\\-141\\-157.9749\\-237.3672\\-141\\-158.6242\\-235.4141\\-141\\-159.6444\\-233.4609\\-141\\-160.2189\\-231.5078\\-141\\-160.915\\-229.5547\\-141\\-161.7113\\-227.6016\\-141\\-162.4246\\-223.6953\\-141\\-163.6766\\-219.7891\\-141\\-164.3566\\-215.8828\\-141\\-164.8466\\-213.9297\\-141\\-165.455\\-211.9766\\-141\\-165.9958\\-208.0703\\-141\\-166.358\\-204.1641\\-141\\-166.6028\\-200.2578\\-141\\-166.4919\\-196.3516\\-141\\-166.3319\\-194.3984\\-141\\-165.8923\\-190.4922\\-141\\-165.5723\\-188.5391\\-141\\-164.3304\\-184.6328\\-141\\-163.8767\\-182.6797\\-141\\-163.1705\\-180.7266\\-141\\-162.2813\\-178.7734\\-141\\-161.6211\\-176.8203\\-141\\-160.4252\\-174.8672\\-141\\-159.3959\\-172.9141\\-141\\-158.0067\\-170.9609\\-141\\-156.4834\\-169.0078\\-141\\-155.2734\\-167.14\\-141\\-153.5382\\-165.1016\\-141\\-149.4141\\-160.8539\\-141\\-147.4609\\-159.0741\\-141\\-145.5078\\-157.684\\-141\\-141.6016\\-154.4091\\-141\\-139.6484\\-152.9326\\-141\\-137.6953\\-152.0077\\-141\\-136.9629\\-151.4297\\-141\\-133.7891\\-149.328\\-141\\-131.8359\\-148.2672\\-141\\-129.8828\\-147.0453\\-141\\-127.9297\\-146.3182\\-141\\-125.9766\\-145.1838\\-141\\-124.0234\\-144.447\\-141\\-122.0703\\-143.3242\\-141\\-120.1172\\-142.4912\\-141\\-118.1641\\-141.4447\\-141\\-116.2109\\-140.7287\\-141\\-114.2578\\-140.1139\\-141\\-112.3047\\-139.2127\\-141\\-108.3984\\-138.207\\-141\\-106.4453\\-137.2813\\-141\\-102.5391\\-136.2016\\-141\\-100.5859\\-135.3608\\-141\\-96.67969\\-134.4436\\-141\\-94.72656\\-133.7824\\-141\\-92.77344\\-133.2278\\-141\\-88.86719\\-132.6554\\-141\\-86.91406\\-132.3009\\-141\\-84.96094\\-131.6475\\-141\\-83.00781\\-131.2387\\-141\\-75.19531\\-130.3147\\-141\\-69.33594\\-129.7096\\-141\\-65.42969\\-129.5683\\-141\\-61.52344\\-129.5783\\-141\\-59.57031\\-129.7215\\-141\\-53.71094\\-130.7074\\-141\\-51.75781\\-131.1161\\-141\\-49.80469\\-131.6594\\-141\\-47.85156\\-132.4466\\-141\\-43.94531\\-133.2412\\-141\\-41.99219\\-134.0742\\-141\\-38.08594\\-135.6371\\-141\\-34.17969\\-137.8619\\-141\\-32.22656\\-138.9003\\-141\\-30.27344\\-140.2565\\-141\\-28.32031\\-141.4462\\-141\\-25.95082\\-143.6172\\-141\\-22.18889\\-147.5234\\-141\\-20.50781\\-149.8081\\-141\\-18.02472\\-153.3828\\-141\\-17.25076\\-155.3359\\-141\\-16.06096\\-157.2891\\-141\\-15.39586\\-159.2422\\-141\\-14.47152\\-161.1953\\-141\\-13.90301\\-163.1484\\-141\\-13.1638\\-167.0547\\-141\\-12.52254\\-169.0078\\-141\\-12.02652\\-170.9609\\-141\\-11.77097\\-172.9141\\-141\\-11.24878\\-178.7734\\-141\\-10.4947\\-182.6797\\-141\\-10.26257\\-184.6328\\-141\\-10.15732\\-188.5391\\-141\\-10.31681\\-192.4453\\-141\\-10.53049\\-196.3516\\-141\\-10.53049\\-200.2578\\-141\\-10.31681\\-202.2109\\-141\\-10.07934\\-206.1172\\-141\\-9.859076\\-211.9766\\-141\\-9.84468\\-213.9297\\-141\\-9.960011\\-219.7891\\-141\\-10.16488\\-223.6953\\-141\\-10.39567\\-225.6484\\-141\\-11.57992\\-227.6016\\-141\\-11.36161\\-229.5547\\-141\\-11.49053\\-231.5078\\-141\\-11.87785\\-235.4141\\-141\\-12.14718\\-237.3672\\-141\\-13.17376\\-241.2734\\-141\\-13.82993\\-245.1797\\-141\\-14.34949\\-247.1328\\-141\\-15.24621\\-249.0859\\-141\\-15.70719\\-251.0391\\-141\\-16.30859\\-252.9922\\-141\\-17.28678\\-254.9453\\-141\\-17.80225\\-256.8984\\-141\\-18.76762\\-258.8516\\-141\\-19.42472\\-260.8047\\-141\\-19.97456\\-262.7578\\-141\\-21.05638\\-264.7109\\-141\\-21.8259\\-266.6641\\-141\\-23.06325\\-268.6172\\-141\\-23.91968\\-270.5703\\-141\\-25.20571\\-272.5234\\-141\\-25.98939\\-274.4766\\-141\\-29.74986\\-280.3359\\-141\\-32.61861\\-284.2422\\-141\\-33.68144\\-286.1953\\-141\\-35.29309\\-288.1484\\-141\\-38.92906\\-292.0547\\-141\\-40.03906\\-293.3044\\-141\\-41.99219\\-295.0212\\-141\\-43.94531\\-296.5574\\-141\\-49.80469\\-300.2976\\-141\\-55.66406\\-302.4693\\-141\\-59.57031\\-303.0524\\-141\\-61.52344\\-303.3973\\-141\\-63.47656\\-303.8542\\-141\\-65.42969\\-304.1604\\-141\\-69.33594\\-304.3877\\-141\\-73.24219\\-304.409\\-141\\-77.14844\\-304.2617\\-141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "179" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "36" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-302.088\\-141\\57.61719\\-301.4394\\-141\\53.71094\\-300.5084\\-141\\51.75781\\-299.5852\\-141\\49.80469\\-298.7653\\-141\\47.85156\\-297.6361\\-141\\45.89844\\-296.6304\\-141\\43.94531\\-295.299\\-141\\41.99219\\-294.1528\\-141\\40.03906\\-292.6522\\-141\\38.08594\\-290.8324\\-141\\35.09347\\-288.1484\\-141\\33.19036\\-286.1953\\-141\\29.75125\\-282.2891\\-141\\28.1808\\-280.3359\\-141\\26.95184\\-278.3828\\-141\\25.61455\\-276.4297\\-141\\24.41406\\-274.2411\\-141\\22.46094\\-270.9593\\-141\\22.14656\\-270.5703\\-141\\21.26736\\-268.6172\\-141\\20.12392\\-266.6641\\-141\\18.80976\\-262.7578\\-141\\17.83265\\-260.8047\\-141\\17.28301\\-258.8516\\-141\\16.28675\\-256.8984\\-141\\15.10336\\-252.9922\\-141\\14.28223\\-251.0391\\-141\\13.48016\\-247.1328\\-141\\13.19019\\-245.1797\\-141\\12.53634\\-243.2266\\-141\\12.00701\\-241.2734\\-141\\11.56039\\-237.3672\\-141\\11.28078\\-235.4141\\-141\\10.2892\\-231.5078\\-141\\9.853148\\-227.6016\\-141\\9.355918\\-219.7891\\-141\\9.309506\\-217.8359\\-141\\9.099187\\-213.9297\\-141\\8.8125\\-210.0234\\-141\\8.736879\\-208.0703\\-141\\8.412035\\-204.1641\\-141\\8.34517\\-200.2578\\-141\\8.47425\\-198.3047\\-141\\9.118895\\-194.3984\\-141\\9.88483\\-188.5391\\-141\\10.13513\\-184.6328\\-141\\10.34546\\-182.6797\\-141\\11.11577\\-178.7734\\-141\\11.40625\\-176.8203\\-141\\12.09955\\-170.9609\\-141\\13.20623\\-167.0547\\-141\\13.93769\\-163.1484\\-141\\14.62573\\-161.1953\\-141\\15.51011\\-159.2422\\-141\\16.29352\\-157.2891\\-141\\16.60156\\-156.8718\\-141\\18.55469\\-153.4842\\-141\\19.84168\\-151.4297\\-141\\22.46094\\-148.2793\\-141\\24.41406\\-146.1807\\-141\\26.96132\\-143.6172\\-141\\28.32031\\-142.3387\\-141\\30.27344\\-140.6938\\-141\\32.22656\\-139.2683\\-141\\34.17969\\-138.2186\\-141\\34.74374\\-137.7578\\-141\\38.08594\\-135.7214\\-141\\41.99219\\-133.8436\\-141\\43.94531\\-133.057\\-141\\45.89844\\-132.6501\\-141\\49.80469\\-131.2316\\-141\\53.71094\\-130.6018\\-141\\57.61719\\-129.6635\\-141\\59.57031\\-129.4316\\-141\\61.52344\\-129.3168\\-141\\65.42969\\-129.2723\\-141\\69.33594\\-129.368\\-141\\73.24219\\-129.6092\\-141\\79.10156\\-130.3733\\-141\\81.05469\\-130.6722\\-141\\83.00781\\-130.7788\\-141\\88.86719\\-131.3348\\-141\\90.82031\\-131.7215\\-141\\92.77344\\-132.2579\\-141\\94.72656\\-132.6018\\-141\\98.63281\\-132.9881\\-141\\100.5859\\-133.2835\\-141\\102.5391\\-133.7524\\-141\\104.4922\\-134.3334\\-141\\108.3984\\-135.1371\\-141\\109.7566\\-135.8047\\-141\\110.3516\\-136.2668\\-141\\114.2578\\-136.9971\\-141\\116.2109\\-137.534\\-141\\118.1641\\-138.3573\\-141\\120.1172\\-138.8257\\-141\\122.0703\\-139.4121\\-141\\124.0234\\-140.3124\\-141\\125.9766\\-140.9197\\-141\\129.8828\\-142.8213\\-141\\131.8359\\-143.959\\-141\\133.7891\\-144.8408\\-141\\135.7422\\-146.0083\\-141\\137.6953\\-146.8919\\-141\\141.4248\\-149.4766\\-141\\145.5078\\-152.5767\\-141\\147.4609\\-154.2736\\-141\\149.4141\\-156.1972\\-141\\152.3969\\-159.2422\\-141\\154.2099\\-161.1953\\-141\\155.8206\\-163.1484\\-141\\157.0139\\-165.1016\\-141\\159.7837\\-169.0078\\-141\\160.7734\\-170.9609\\-141\\161.9228\\-172.9141\\-141\\162.5141\\-174.8672\\-141\\163.568\\-176.8203\\-141\\164.687\\-180.7266\\-141\\165.4764\\-182.6797\\-141\\165.9043\\-184.6328\\-141\\166.5847\\-188.5391\\-141\\167.0298\\-190.4922\\-141\\167.335\\-192.4453\\-141\\167.6647\\-196.3516\\-141\\167.8022\\-200.2578\\-141\\167.8317\\-204.1641\\-141\\167.7723\\-208.0703\\-141\\167.6217\\-211.9766\\-141\\167.2549\\-215.8828\\-141\\166.2268\\-221.7422\\-141\\165.6561\\-225.6484\\-141\\165.1338\\-227.6016\\-141\\164.4684\\-229.5547\\-141\\163.7198\\-233.4609\\-141\\162.9697\\-235.4141\\-141\\162.3428\\-237.3672\\-141\\161.9318\\-239.3203\\-141\\161.2015\\-241.2734\\-141\\160.2919\\-243.2266\\-141\\159.5563\\-245.1797\\-141\\158.3846\\-247.1328\\-141\\157.5936\\-249.0859\\-141\\156.4514\\-251.0391\\-141\\155.685\\-252.9922\\-141\\155.2734\\-253.6051\\-141\\153.3754\\-256.8984\\-141\\151.3672\\-259.8201\\-141\\150.5922\\-260.8047\\-141\\148.0429\\-264.7109\\-141\\145.5078\\-267.73\\-141\\141.185\\-272.5234\\-141\\139.6484\\-274.1632\\-141\\137.2845\\-276.4297\\-141\\133.7891\\-279.9439\\-141\\128.8003\\-284.2422\\-141\\125.9766\\-286.5005\\-141\\120.1172\\-290.3406\\-141\\118.1641\\-291.3826\\-141\\116.2109\\-292.777\\-141\\114.2578\\-293.7377\\-141\\112.3047\\-294.8145\\-141\\110.3516\\-295.4794\\-141\\108.3984\\-296.5372\\-141\\106.4453\\-297.1405\\-141\\104.4922\\-298.1378\\-141\\100.5859\\-299.4577\\-141\\98.63281\\-300.2767\\-141\\96.67969\\-300.7132\\-141\\92.77344\\-301.4447\\-141\\90.82031\\-301.9931\\-141\\88.86719\\-302.3793\\-141\\86.91406\\-302.6214\\-141\\81.05469\\-302.9999\\-141\\77.14844\\-303.1557\\-141\\75.19531\\-303.1839\\-141\\71.28906\\-303.1282\\-141\\63.47656\\-302.689\\-141\\61.52344\\-302.4817\\-141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "182" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "37" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-303.84\\-139\\-83.00781\\-303.3922\\-139\\-84.96094\\-303.0933\\-139\\-88.86719\\-302.7239\\-139\\-90.82031\\-302.4526\\-139\\-92.77344\\-301.951\\-139\\-94.72656\\-301.3094\\-139\\-98.63281\\-300.4278\\-139\\-100.5859\\-299.5682\\-139\\-102.5391\\-298.8071\\-139\\-108.3984\\-296.0469\\-139\\-112.2261\\-294.0078\\-139\\-114.2578\\-292.7899\\-139\\-116.2109\\-291.2794\\-139\\-118.1641\\-289.9093\\-139\\-120.1172\\-288.8441\\-139\\-123.4422\\-286.1953\\-139\\-125.9766\\-283.9924\\-139\\-127.9297\\-282.5692\\-139\\-129.8828\\-280.8092\\-139\\-132.2389\\-278.3828\\-139\\-134.2473\\-276.4297\\-139\\-136.0703\\-274.4766\\-139\\-137.5299\\-272.5234\\-139\\-139.0987\\-270.5703\\-139\\-140.8191\\-268.6172\\-139\\-142.3966\\-266.6641\\-139\\-144.842\\-262.7578\\-139\\-146.3408\\-260.8047\\-139\\-147.6431\\-258.8516\\-139\\-148.6468\\-256.8984\\-139\\-149.858\\-254.9453\\-139\\-150.6392\\-252.9922\\-139\\-151.9104\\-251.0391\\-139\\-152.8256\\-249.0859\\-139\\-153.9848\\-247.1328\\-139\\-154.7181\\-245.1797\\-139\\-155.748\\-243.2266\\-139\\-156.3309\\-241.2734\\-139\\-158.0421\\-237.3672\\-139\\-158.7381\\-235.4141\\-139\\-159.7401\\-233.4609\\-139\\-160.2965\\-231.5078\\-139\\-161.794\\-227.6016\\-139\\-162.4962\\-223.6953\\-139\\-163.1995\\-221.7422\\-139\\-163.7612\\-219.7891\\-139\\-164.465\\-215.8828\\-139\\-165.5723\\-211.9766\\-139\\-166.1123\\-208.0703\\-139\\-166.4919\\-204.1641\\-139\\-166.7636\\-200.2578\\-139\\-166.7498\\-198.3047\\-139\\-166.4418\\-194.3984\\-139\\-165.9708\\-190.4922\\-139\\-165.6638\\-188.5391\\-139\\-165.1611\\-186.5859\\-139\\-164.4287\\-184.6328\\-139\\-163.9488\\-182.6797\\-139\\-163.3102\\-180.7266\\-139\\-162.3488\\-178.7734\\-139\\-161.7213\\-176.8203\\-139\\-160.5286\\-174.8672\\-139\\-159.5294\\-172.9141\\-139\\-157.2266\\-169.7813\\-139\\-156.5863\\-169.0078\\-139\\-155.3319\\-167.0547\\-139\\-153.6536\\-165.1016\\-139\\-149.4141\\-160.8031\\-139\\-147.4609\\-159.0596\\-139\\-145.5078\\-157.6984\\-139\\-141.6016\\-154.4397\\-139\\-139.6484\\-152.9683\\-139\\-137.6953\\-152.0392\\-139\\-135.7422\\-150.6427\\-139\\-133.7891\\-149.41\\-139\\-130.4726\\-147.5234\\-139\\-129.8828\\-147.1039\\-139\\-127.9297\\-146.3503\\-139\\-125.9766\\-145.2425\\-139\\-124.0234\\-144.4809\\-139\\-122.0703\\-143.3581\\-139\\-120.1172\\-142.5019\\-139\\-118.1641\\-141.4574\\-139\\-116.2109\\-140.7169\\-139\\-114.2578\\-140.0892\\-139\\-112.3047\\-139.1897\\-139\\-108.3984\\-138.1603\\-139\\-106.4453\\-137.2466\\-139\\-104.4922\\-136.7301\\-139\\-102.5391\\-136.0923\\-139\\-100.5859\\-135.2797\\-139\\-96.67969\\-134.3463\\-139\\-94.72656\\-133.6402\\-139\\-92.77344\\-133.133\\-139\\-88.86719\\-132.5672\\-139\\-86.91406\\-132.1098\\-139\\-84.96094\\-131.4773\\-139\\-83.00781\\-131.1416\\-139\\-77.14844\\-130.448\\-139\\-73.24219\\-129.8506\\-139\\-71.28906\\-129.6504\\-139\\-67.38281\\-129.3949\\-139\\-65.42969\\-129.3605\\-139\\-61.52344\\-129.4142\\-139\\-59.57031\\-129.5461\\-139\\-57.61719\\-129.8099\\-139\\-55.66406\\-130.2576\\-139\\-51.75781\\-130.9866\\-139\\-49.80469\\-131.4624\\-139\\-47.85156\\-132.2629\\-139\\-43.94531\\-133.116\\-139\\-41.99219\\-133.8436\\-139\\-40.03906\\-134.7126\\-139\\-38.08594\\-135.4526\\-139\\-36.13281\\-136.6285\\-139\\-34.17969\\-137.677\\-139\\-32.22656\\-138.8352\\-139\\-30.27344\\-140.175\\-139\\-28.32031\\-141.329\\-139\\-25.81018\\-143.6172\\-139\\-22.03954\\-147.5234\\-139\\-20.50781\\-149.5829\\-139\\-17.98405\\-153.3828\\-139\\-17.24709\\-155.3359\\-139\\-16.08112\\-157.2891\\-139\\-15.41574\\-159.2422\\-139\\-14.52546\\-161.1953\\-139\\-13.92613\\-163.1484\\-139\\-13.18687\\-167.0547\\-139\\-12.53756\\-169.0078\\-139\\-12.05426\\-170.9609\\-139\\-11.79751\\-172.9141\\-139\\-11.47056\\-176.8203\\-139\\-11.25458\\-178.7734\\-139\\-10.5678\\-182.6797\\-139\\-10.33579\\-184.6328\\-139\\-10.23687\\-188.5391\\-139\\-10.2983\\-190.4922\\-139\\-10.64745\\-194.3984\\-139\\-10.75013\\-196.3516\\-139\\-10.63368\\-200.2578\\-139\\-10.39567\\-202.2109\\-139\\-9.997914\\-208.0703\\-139\\-9.905802\\-211.9766\\-139\\-9.992074\\-219.7891\\-139\\-10.22023\\-223.6953\\-139\\-10.47165\\-225.6484\\-139\\-11.59075\\-227.6016\\-139\\-11.51816\\-231.5078\\-139\\-11.90186\\-235.4141\\-139\\-12.19733\\-237.3672\\-139\\-13.20623\\-241.2734\\-139\\-13.84788\\-245.1797\\-139\\-14.32729\\-247.1328\\-139\\-15.1784\\-249.0859\\-139\\-16.36584\\-252.9922\\-139\\-17.31806\\-254.9453\\-139\\-17.8371\\-256.8984\\-139\\-18.85679\\-258.8516\\-139\\-20.03933\\-262.7578\\-139\\-21.13767\\-264.7109\\-139\\-21.90369\\-266.6641\\-139\\-23.14397\\-268.6172\\-139\\-24.03249\\-270.5703\\-139\\-25.26004\\-272.5234\\-139\\-26.06614\\-274.4766\\-139\\-28.62762\\-278.3828\\-139\\-29.81771\\-280.3359\\-139\\-32.6629\\-284.2422\\-139\\-33.74945\\-286.1953\\-139\\-35.35031\\-288.1484\\-139\\-40.03906\\-293.2498\\-139\\-41.99219\\-294.9782\\-139\\-43.94531\\-296.4795\\-139\\-49.80469\\-300.2301\\-139\\-55.66406\\-302.4485\\-139\\-59.57031\\-303.034\\-139\\-65.42969\\-304.1302\\-139\\-69.33594\\-304.3732\\-139\\-73.24219\\-304.402\\-139\\-77.14844\\-304.2531\\-139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "170" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "38" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "59.57031\\-301.9931\\-139\\57.61719\\-301.3825\\-139\\53.71094\\-300.4483\\-139\\51.75781\\-299.4911\\-139\\49.80469\\-298.7131\\-139\\47.85156\\-297.5411\\-139\\45.89844\\-296.5728\\-139\\43.94531\\-295.2431\\-139\\41.99219\\-294.0316\\-139\\40.03906\\-292.582\\-139\\35.13532\\-288.1484\\-139\\33.2224\\-286.1953\\-139\\29.78857\\-282.2891\\-139\\28.2234\\-280.3359\\-139\\25.62225\\-276.4297\\-139\\24.41406\\-274.2586\\-139\\22.46094\\-270.9758\\-139\\22.13542\\-270.5703\\-139\\21.25594\\-268.6172\\-139\\20.12392\\-266.6641\\-139\\18.80787\\-262.7578\\-139\\17.82614\\-260.8047\\-139\\17.30745\\-258.8516\\-139\\16.31974\\-256.8984\\-139\\15.13076\\-252.9922\\-139\\14.30339\\-251.0391\\-139\\13.87533\\-249.0859\\-139\\13.19661\\-245.1797\\-139\\12.08726\\-241.2734\\-139\\11.38762\\-235.4141\\-139\\10.97238\\-233.4609\\-139\\10.43822\\-231.5078\\-139\\10.10665\\-229.5547\\-139\\9.937686\\-227.6016\\-139\\9.591239\\-221.7422\\-139\\9.243983\\-213.9297\\-139\\8.872335\\-208.0703\\-139\\8.44254\\-204.1641\\-139\\8.373119\\-200.2578\\-139\\8.507236\\-198.3047\\-139\\9.250383\\-194.3984\\-139\\9.941499\\-188.5391\\-139\\10.18025\\-184.6328\\-139\\10.39567\\-182.6797\\-139\\11.14695\\-178.7734\\-139\\11.41357\\-176.8203\\-139\\12.09106\\-170.9609\\-139\\13.21572\\-167.0547\\-139\\13.93769\\-163.1484\\-139\\14.61088\\-161.1953\\-139\\15.50424\\-159.2422\\-139\\16.29352\\-157.2891\\-139\\16.60156\\-156.868\\-139\\18.55469\\-153.4293\\-139\\19.79933\\-151.4297\\-139\\22.46094\\-148.2268\\-139\\24.41406\\-146.1273\\-139\\26.9043\\-143.6172\\-139\\28.32031\\-142.2777\\-139\\30.27344\\-140.6364\\-139\\32.22656\\-139.1888\\-139\\34.17969\\-138.1123\\-139\\34.59944\\-137.7578\\-139\\38.08594\\-135.5853\\-139\\40.03906\\-134.719\\-139\\41.99219\\-133.7088\\-139\\43.94531\\-133.0136\\-139\\45.89844\\-132.5994\\-139\\49.80469\\-131.1685\\-139\\53.71094\\-130.4764\\-139\\55.66406\\-129.9377\\-139\\57.61719\\-129.5014\\-139\\59.57031\\-129.3098\\-139\\63.47656\\-129.1459\\-139\\69.33594\\-129.2265\\-139\\73.24219\\-129.3991\\-139\\77.14844\\-129.7837\\-139\\81.05469\\-130.4426\\-139\\88.86719\\-131.2082\\-139\\90.82031\\-131.5166\\-139\\94.72656\\-132.4696\\-139\\100.5859\\-133.133\\-139\\102.5391\\-133.5008\\-139\\104.4922\\-134.0903\\-139\\108.3984\\-134.9591\\-139\\110.3516\\-135.5171\\-139\\112.3047\\-136.2283\\-139\\114.2578\\-136.8324\\-139\\116.2109\\-137.2374\\-139\\118.1641\\-138.0621\\-139\\120.1172\\-138.6666\\-139\\122.0703\\-139.1315\\-139\\124.0234\\-140.0602\\-139\\125.9766\\-140.7173\\-139\\127.9297\\-141.5235\\-139\\131.8359\\-143.5491\\-139\\135.5405\\-145.5703\\-139\\137.6953\\-146.6767\\-139\\141.6016\\-149.2307\\-139\\145.5078\\-152.4063\\-139\\147.4609\\-154.1119\\-139\\149.4141\\-156.0257\\-139\\152.5563\\-159.2422\\-139\\154.3362\\-161.1953\\-139\\155.971\\-163.1484\\-139\\158.4667\\-167.0547\\-139\\159.8804\\-169.0078\\-139\\161.9743\\-172.9141\\-139\\162.5877\\-174.8672\\-139\\163.6292\\-176.8203\\-139\\164.1372\\-178.7734\\-139\\164.7949\\-180.7266\\-139\\165.5503\\-182.6797\\-139\\165.9555\\-184.6328\\-139\\166.6534\\-188.5391\\-139\\167.0876\\-190.4922\\-139\\167.379\\-192.4453\\-139\\167.6839\\-196.3516\\-139\\167.8251\\-200.2578\\-139\\167.8545\\-204.1641\\-139\\167.786\\-208.0703\\-139\\167.6296\\-211.9766\\-139\\167.2778\\-215.8828\\-139\\166.2332\\-221.7422\\-139\\165.6454\\-225.6484\\-139\\165.1057\\-227.6016\\-139\\164.4601\\-229.5547\\-139\\163.7121\\-233.4609\\-139\\162.9552\\-235.4141\\-139\\162.3305\\-237.3672\\-139\\161.9248\\-239.3203\\-139\\161.1866\\-241.2734\\-139\\160.281\\-243.2266\\-139\\159.5459\\-245.1797\\-139\\158.3739\\-247.1328\\-139\\157.5731\\-249.0859\\-139\\156.4392\\-251.0391\\-139\\155.6485\\-252.9922\\-139\\153.3203\\-256.8673\\-139\\152.0051\\-258.8516\\-139\\150.5452\\-260.8047\\-139\\147.9731\\-264.7109\\-139\\146.3593\\-266.6641\\-139\\143.5547\\-269.834\\-139\\139.6484\\-274.1076\\-139\\135.7422\\-277.9327\\-139\\133.7891\\-279.9381\\-139\\128.7613\\-284.2422\\-139\\125.9766\\-286.5005\\-139\\120.1172\\-290.3406\\-139\\118.1641\\-291.3751\\-139\\116.2109\\-292.777\\-139\\114.2578\\-293.7516\\-139\\112.3047\\-294.8337\\-139\\110.3516\\-295.493\\-139\\108.3984\\-296.5493\\-139\\106.4453\\-297.1515\\-139\\104.4922\\-298.1378\\-139\\100.5859\\-299.4703\\-139\\98.63281\\-300.2866\\-139\\96.67969\\-300.7196\\-139\\92.77344\\-301.4558\\-139\\90.82031\\-301.9931\\-139\\88.86719\\-302.37\\-139\\86.91406\\-302.6167\\-139\\81.05469\\-302.9889\\-139\\75.19531\\-303.1638\\-139\\71.28906\\-303.1013\\-139\\63.47656\\-302.6648\\-139\\61.52344\\-302.4315\\-139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "39" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-303.8542\\-137\\-83.00781\\-303.4276\\-137\\-84.96094\\-303.1244\\-137\\-88.86719\\-302.7351\\-137\\-90.82031\\-302.4526\\-137\\-92.77344\\-301.9653\\-137\\-94.72656\\-301.3223\\-137\\-98.63281\\-300.4278\\-137\\-102.5391\\-298.8071\\-137\\-106.4453\\-296.9375\\-137\\-108.3984\\-296.0617\\-137\\-112.2261\\-294.0078\\-137\\-114.2578\\-292.7942\\-137\\-116.2109\\-291.284\\-137\\-118.1641\\-289.9233\\-137\\-120.1172\\-288.8523\\-137\\-123.4531\\-286.1953\\-137\\-125.9766\\-284.0057\\-137\\-127.9297\\-282.582\\-137\\-129.8828\\-280.8205\\-137\\-136.1224\\-274.4766\\-137\\-137.5895\\-272.5234\\-137\\-139.1635\\-270.5703\\-137\\-140.8803\\-268.6172\\-137\\-142.436\\-266.6641\\-137\\-144.9298\\-262.7578\\-137\\-145.5078\\-262.0614\\-137\\-147.7469\\-258.8516\\-137\\-148.7175\\-256.8984\\-137\\-149.9353\\-254.9453\\-137\\-150.7263\\-252.9922\\-137\\-151.9967\\-251.0391\\-137\\-152.9257\\-249.0859\\-137\\-154.0527\\-247.1328\\-137\\-154.8018\\-245.1797\\-137\\-155.8248\\-243.2266\\-137\\-156.3904\\-241.2734\\-137\\-157.3213\\-239.3203\\-137\\-158.8454\\-235.4141\\-137\\-159.8184\\-233.4609\\-137\\-160.3592\\-231.5078\\-137\\-161.8577\\-227.6016\\-137\\-162.5621\\-223.6953\\-137\\-163.3212\\-221.7422\\-137\\-163.8318\\-219.7891\\-137\\-164.5726\\-215.8828\\-137\\-165.2007\\-213.9297\\-137\\-165.66\\-211.9766\\-137\\-166.2204\\-208.0703\\-137\\-166.6448\\-204.1641\\-137\\-166.9537\\-200.2578\\-137\\-166.776\\-196.3516\\-137\\-166.0457\\-190.4922\\-137\\-165.7424\\-188.5391\\-137\\-165.2865\\-186.5859\\-137\\-164.5114\\-184.6328\\-137\\-163.4206\\-180.7266\\-137\\-162.4242\\-178.7734\\-137\\-161.807\\-176.8203\\-137\\-160.6225\\-174.8672\\-137\\-159.6426\\-172.9141\\-137\\-157.2266\\-169.6615\\-137\\-156.6714\\-169.0078\\-137\\-155.4268\\-167.0547\\-137\\-153.7335\\-165.1016\\-137\\-149.4141\\-160.7789\\-137\\-147.4609\\-159.0755\\-137\\-145.5078\\-157.7239\\-137\\-141.6016\\-154.4699\\-137\\-139.6484\\-153.0428\\-137\\-137.6953\\-152.0872\\-137\\-135.7422\\-150.7031\\-137\\-130.3474\\-147.5234\\-137\\-129.8828\\-147.1767\\-137\\-127.9297\\-146.3821\\-137\\-125.9766\\-145.3046\\-137\\-124.0234\\-144.5208\\-137\\-122.0703\\-143.4055\\-137\\-120.1172\\-142.5232\\-137\\-118.1641\\-141.4702\\-137\\-114.2578\\-140.0552\\-137\\-112.3047\\-139.1575\\-137\\-110.3516\\-138.6658\\-137\\-108.3984\\-138.0695\\-137\\-106.4453\\-137.1863\\-137\\-104.4922\\-136.6862\\-137\\-100.5859\\-135.1882\\-137\\-96.67969\\-134.2023\\-137\\-94.72656\\-133.4733\\-137\\-92.77344\\-133.0498\\-137\\-88.86719\\-132.4305\\-137\\-84.96094\\-131.3191\\-137\\-83.00781\\-131.0299\\-137\\-79.10156\\-130.5875\\-137\\-75.19531\\-129.8931\\-137\\-71.28906\\-129.4241\\-137\\-67.38281\\-129.1764\\-137\\-65.42969\\-129.1608\\-137\\-61.52344\\-129.2524\\-137\\-57.61719\\-129.5965\\-137\\-53.71094\\-130.4609\\-137\\-49.80469\\-131.2675\\-137\\-45.89844\\-132.6037\\-137\\-43.94531\\-132.9895\\-137\\-41.99219\\-133.5715\\-137\\-40.03906\\-134.5413\\-137\\-38.08594\\-135.2615\\-137\\-36.13281\\-136.4808\\-137\\-34.17969\\-137.4498\\-137\\-30.70854\\-139.7109\\-137\\-28.32031\\-141.1826\\-137\\-26.36719\\-142.9138\\-137\\-21.89453\\-147.5234\\-137\\-20.36171\\-149.4766\\-137\\-19.24214\\-151.4297\\-137\\-17.96759\\-153.3828\\-137\\-17.24709\\-155.3359\\-137\\-16.10151\\-157.2891\\-137\\-15.44356\\-159.2422\\-137\\-14.58185\\-161.1953\\-137\\-13.94924\\-163.1484\\-137\\-13.24142\\-167.0547\\-137\\-12.625\\-169.0078\\-137\\-12.10814\\-170.9609\\-137\\-11.83143\\-172.9141\\-137\\-11.49462\\-176.8203\\-137\\-11.2754\\-178.7734\\-137\\-10.66142\\-182.6797\\-137\\-10.41667\\-184.6328\\-137\\-10.31681\\-188.5391\\-137\\-10.55519\\-192.4453\\-137\\-10.86796\\-194.3984\\-137\\-10.96156\\-196.3516\\-137\\-10.69\\-200.2578\\-137\\-10.2892\\-204.1641\\-137\\-10.02798\\-208.0703\\-137\\-9.943182\\-211.9766\\-137\\-10.01578\\-219.7891\\-137\\-10.27135\\-223.6953\\-137\\-10.54275\\-225.6484\\-137\\-11.51021\\-227.6016\\-137\\-11.54119\\-231.5078\\-137\\-11.91518\\-235.4141\\-137\\-12.22997\\-237.3672\\-137\\-13.23785\\-241.2734\\-137\\-13.87747\\-245.1797\\-137\\-14.34039\\-247.1328\\-137\\-15.16025\\-249.0859\\-137\\-16.41456\\-252.9922\\-137\\-17.35476\\-254.9453\\-137\\-17.8689\\-256.8984\\-137\\-18.90542\\-258.8516\\-137\\-20.10769\\-262.7578\\-137\\-21.19814\\-264.7109\\-137\\-21.95562\\-266.6641\\-137\\-23.21\\-268.6172\\-137\\-24.12446\\-270.5703\\-137\\-25.3116\\-272.5234\\-137\\-26.14765\\-274.4766\\-137\\-27.36742\\-276.4297\\-137\\-28.707\\-278.3828\\-137\\-29.8865\\-280.3359\\-137\\-32.69777\\-284.2422\\-137\\-33.82138\\-286.1953\\-137\\-35.39088\\-288.1484\\-137\\-40.03906\\-293.1929\\-137\\-41.99219\\-294.9346\\-137\\-43.94531\\-296.4004\\-137\\-49.80469\\-300.1588\\-137\\-53.71094\\-301.6325\\-137\\-55.66406\\-302.4189\\-137\\-57.61719\\-302.7638\\-137\\-61.52344\\-303.333\\-137\\-65.42969\\-304.099\\-137\\-67.38281\\-304.2703\\-137\\-71.28906\\-304.3949\\-137\\-75.19531\\-304.3507\\-137\\-77.14844\\-304.2443\\-137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "172" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "40" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "57.61719\\-301.3026\\-137\\53.71094\\-300.377\\-137\\51.75781\\-299.4073\\-137\\49.80469\\-298.6412\\-137\\47.85156\\-297.429\\-137\\45.89844\\-296.4873\\-137\\42.12042\\-294.0078\\-137\\40.03906\\-292.51\\-137\\35.17718\\-288.1484\\-137\\33.25486\\-286.1953\\-137\\29.82325\\-282.2891\\-137\\28.2527\\-280.3359\\-137\\25.64264\\-276.4297\\-137\\24.41406\\-274.2605\\-137\\22.46094\\-271.0179\\-137\\22.10046\\-270.5703\\-137\\21.24452\\-268.6172\\-137\\20.11045\\-266.6641\\-137\\18.80787\\-262.7578\\-137\\17.82614\\-260.8047\\-137\\17.30363\\-258.8516\\-137\\16.35408\\-256.8984\\-137\\15.15719\\-252.9922\\-137\\14.34949\\-251.0391\\-137\\13.90301\\-249.0859\\-137\\13.25061\\-245.1797\\-137\\12.78057\\-243.2266\\-137\\12.18776\\-241.2734\\-137\\11.89076\\-239.3203\\-137\\11.47056\\-235.4141\\-137\\11.15437\\-233.4609\\-137\\10.22023\\-229.5547\\-137\\10.02798\\-227.6016\\-137\\9.598775\\-219.7891\\-137\\9.359195\\-213.9297\\-137\\8.901743\\-208.0703\\-137\\8.47425\\-204.1641\\-137\\8.402122\\-202.2109\\-137\\8.432241\\-200.2578\\-137\\8.589623\\-198.3047\\-137\\9.409015\\-194.3984\\-137\\9.986291\\-188.5391\\-137\\10.22023\\-184.6328\\-137\\10.41667\\-182.6797\\-137\\11.1443\\-178.7734\\-137\\11.41357\\-176.8203\\-137\\12.07886\\-170.9609\\-137\\13.20623\\-167.0547\\-137\\13.92613\\-163.1484\\-137\\14.58185\\-161.1953\\-137\\15.49831\\-159.2422\\-137\\16.28041\\-157.2891\\-137\\17.47019\\-155.3359\\-137\\18.51563\\-153.3828\\-137\\19.7532\\-151.4297\\-137\\22.46094\\-148.1676\\-137\\24.41406\\-146.0623\\-137\\28.32031\\-142.1936\\-137\\30.27344\\-140.5598\\-137\\32.22656\\-139.1014\\-137\\37.6279\\-135.8047\\-137\\38.08594\\-135.4502\\-137\\40.03906\\-134.6458\\-137\\41.99219\\-133.6002\\-137\\43.94531\\-132.9643\\-137\\45.89844\\-132.5311\\-137\\47.85156\\-131.6837\\-137\\49.80469\\-131.1065\\-137\\53.71094\\-130.3347\\-137\\55.66406\\-129.7096\\-137\\57.61719\\-129.3757\\-137\\61.52344\\-129.098\\-137\\63.47656\\-129.031\\-137\\67.38281\\-129.0219\\-137\\73.24219\\-129.2166\\-137\\77.14844\\-129.5014\\-137\\79.10156\\-129.7583\\-137\\83.00781\\-130.451\\-137\\88.86719\\-131.0662\\-137\\90.82031\\-131.3114\\-137\\92.77344\\-131.6837\\-137\\94.72656\\-132.224\\-137\\96.67969\\-132.5635\\-137\\100.5859\\-132.9762\\-137\\102.5391\\-133.2618\\-137\\104.4922\\-133.7229\\-137\\106.4453\\-134.3169\\-137\\110.3516\\-135.1517\\-137\\112.3047\\-135.7092\\-137\\114.2578\\-136.5544\\-137\\116.2109\\-136.9413\\-137\\118.1641\\-137.5822\\-137\\120.1172\\-138.4269\\-137\\122.0703\\-138.9071\\-137\\124.0234\\-139.6389\\-137\\125.9766\\-140.476\\-137\\127.9297\\-141.1402\\-137\\129.8828\\-142.2799\\-137\\131.8359\\-143.1477\\-137\\133.7891\\-144.3853\\-137\\135.7422\\-145.328\\-137\\139.4892\\-147.5234\\-137\\141.6016\\-148.9176\\-137\\145.5078\\-152.2275\\-137\\147.0058\\-153.3828\\-137\\149.4141\\-155.6875\\-137\\152.843\\-159.2422\\-137\\156.1151\\-163.1484\\-137\\157.4475\\-165.1016\\-137\\158.6153\\-167.0547\\-137\\160.0052\\-169.0078\\-137\\161.1328\\-171.0722\\-137\\162.0422\\-172.9141\\-137\\162.6912\\-174.8672\\-137\\163.6956\\-176.8203\\-137\\164.1981\\-178.7734\\-137\\165.6337\\-182.6797\\-137\\166.724\\-188.5391\\-137\\167.1419\\-190.4922\\-137\\167.6099\\-194.3984\\-137\\167.8431\\-200.2578\\-137\\167.8545\\-204.1641\\-137\\167.7974\\-208.0703\\-137\\167.6296\\-211.9766\\-137\\167.2891\\-215.8828\\-137\\166.5728\\-219.7891\\-137\\165.6337\\-225.6484\\-137\\164.4554\\-229.5547\\-137\\163.7042\\-233.4609\\-137\\162.3305\\-237.3672\\-137\\161.9057\\-239.3203\\-137\\161.1716\\-241.2734\\-137\\160.2702\\-243.2266\\-137\\159.5225\\-245.1797\\-137\\158.3632\\-247.1328\\-137\\157.5521\\-249.0859\\-137\\156.4148\\-251.0391\\-137\\155.6343\\-252.9922\\-137\\153.3203\\-256.7662\\-137\\151.9704\\-258.8516\\-137\\150.5066\\-260.8047\\-137\\149.4141\\-262.5185\\-137\\147.8834\\-264.7109\\-137\\146.2927\\-266.6641\\-137\\141.0935\\-272.5234\\-137\\139.6484\\-274.0732\\-137\\135.7422\\-277.9174\\-137\\133.7891\\-279.9091\\-137\\128.7371\\-284.2422\\-137\\125.9766\\-286.489\\-137\\120.1172\\-290.3285\\-137\\118.1641\\-291.3637\\-137\\116.2109\\-292.7813\\-137\\112.3047\\-294.8457\\-137\\110.3516\\-295.5139\\-137\\108.3984\\-296.5577\\-137\\106.4453\\-297.1515\\-137\\104.4922\\-298.1378\\-137\\100.5859\\-299.4703\\-137\\98.63281\\-300.2866\\-137\\96.67969\\-300.7196\\-137\\92.77344\\-301.4447\\-137\\90.82031\\-301.9793\\-137\\88.86719\\-302.3571\\-137\\86.91406\\-302.6097\\-137\\84.96094\\-302.7527\\-137\\79.10156\\-303.0424\\-137\\75.19531\\-303.136\\-137\\71.28906\\-303.0607\\-137\\65.42969\\-302.7638\\-137\\63.47656\\-302.6097\\-137\\61.52344\\-302.3571\\-137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "185" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "41" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-303.84\\-135\\-84.96094\\-303.1594\\-135\\-88.86719\\-302.7411\\-135\\-90.82031\\-302.461\\-135\\-92.77344\\-301.951\\-135\\-94.72656\\-301.3223\\-135\\-98.63281\\-300.4157\\-135\\-100.5859\\-299.5591\\-135\\-102.5391\\-298.8127\\-135\\-106.4453\\-296.9268\\-135\\-108.3984\\-296.0469\\-135\\-112.2037\\-294.0078\\-135\\-114.2578\\-292.8011\\-135\\-116.2109\\-291.284\\-135\\-118.1641\\-289.9375\\-135\\-120.1172\\-288.8523\\-135\\-123.4422\\-286.1953\\-135\\-125.9766\\-284.0209\\-135\\-127.9297\\-282.582\\-135\\-129.8828\\-280.8316\\-135\\-136.1607\\-274.4766\\-135\\-137.6374\\-272.5234\\-135\\-140.9225\\-268.6172\\-135\\-142.4731\\-266.6641\\-135\\-144.9992\\-262.7578\\-135\\-145.5078\\-262.1575\\-135\\-147.8229\\-258.8516\\-135\\-148.774\\-256.8984\\-135\\-150.0077\\-254.9453\\-135\\-150.7939\\-252.9922\\-135\\-152.0769\\-251.0391\\-135\\-153.0323\\-249.0859\\-135\\-154.1162\\-247.1328\\-135\\-154.8814\\-245.1797\\-135\\-155.9008\\-243.2266\\-135\\-156.4441\\-241.2734\\-135\\-157.4398\\-239.3203\\-135\\-158.9373\\-235.4141\\-135\\-159.8838\\-233.4609\\-135\\-160.4241\\-231.5078\\-135\\-161.2744\\-229.5547\\-135\\-161.901\\-227.6016\\-135\\-162.6275\\-223.6953\\-135\\-163.4294\\-221.7422\\-135\\-163.8911\\-219.7891\\-135\\-164.2226\\-217.8359\\-135\\-164.6893\\-215.8828\\-135\\-165.343\\-213.9297\\-135\\-165.746\\-211.9766\\-135\\-166.5827\\-206.1172\\-135\\-167.0298\\-202.2109\\-135\\-167.1276\\-200.2578\\-135\\-167.0869\\-198.3047\\-135\\-166.9235\\-196.3516\\-135\\-165.8074\\-188.5391\\-135\\-165.3752\\-186.5859\\-135\\-164.5821\\-184.6328\\-135\\-163.5192\\-180.7266\\-135\\-162.4987\\-178.7734\\-135\\-161.873\\-176.8203\\-135\\-160.7068\\-174.8672\\-135\\-159.7174\\-172.9141\\-135\\-156.7179\\-169.0078\\-135\\-155.4719\\-167.0547\\-135\\-153.7751\\-165.1016\\-135\\-149.4141\\-160.7789\\-135\\-147.4609\\-159.1211\\-135\\-145.5078\\-157.7704\\-135\\-141.6016\\-154.5171\\-135\\-139.6484\\-153.1499\\-135\\-137.6953\\-152.1428\\-135\\-135.7422\\-150.7767\\-135\\-130.2237\\-147.5234\\-135\\-129.8828\\-147.2518\\-135\\-127.9297\\-146.4187\\-135\\-125.9766\\-145.3706\\-135\\-124.0234\\-144.5432\\-135\\-122.0703\\-143.4556\\-135\\-120.1172\\-142.5398\\-135\\-118.1641\\-141.4558\\-135\\-114.2578\\-140.0175\\-135\\-112.3047\\-139.1085\\-135\\-110.3516\\-138.6202\\-135\\-108.3984\\-137.9428\\-135\\-106.4453\\-137.1085\\-135\\-104.4922\\-136.6022\\-135\\-102.5391\\-135.7239\\-135\\-100.5859\\-135.0736\\-135\\-98.63281\\-134.6041\\-135\\-94.72656\\-133.3018\\-135\\-90.82031\\-132.6691\\-135\\-88.86719\\-132.2467\\-135\\-86.91406\\-131.5794\\-135\\-84.96094\\-131.1915\\-135\\-79.10156\\-130.451\\-135\\-75.19531\\-129.6748\\-135\\-71.28906\\-129.2171\\-135\\-67.38281\\-129.0124\\-135\\-65.42969\\-128.9906\\-135\\-61.52344\\-129.0767\\-135\\-57.61719\\-129.431\\-135\\-55.66406\\-129.7336\\-135\\-53.71094\\-130.2597\\-135\\-49.80469\\-131.0981\\-135\\-47.85156\\-131.6015\\-135\\-45.89844\\-132.4128\\-135\\-41.99219\\-133.3303\\-135\\-40.03906\\-134.2997\\-135\\-38.08594\\-135.0636\\-135\\-36.13281\\-136.2279\\-135\\-34.17969\\-137.204\\-135\\-32.22656\\-138.5684\\-135\\-28.32031\\-141.0152\\-135\\-26.36719\\-142.7469\\-135\\-24.41406\\-144.7226\\-135\\-21.75705\\-147.5234\\-135\\-20.21123\\-149.4766\\-135\\-19.19922\\-151.4297\\-135\\-17.94362\\-153.3828\\-135\\-17.25812\\-155.3359\\-135\\-16.11032\\-157.2891\\-135\\-15.4772\\-159.2422\\-135\\-14.61088\\-161.1953\\-135\\-13.96484\\-163.1484\\-135\\-13.29385\\-167.0547\\-135\\-12.17831\\-170.9609\\-135\\-11.87785\\-172.9141\\-135\\-11.32111\\-178.7734\\-135\\-10.53049\\-184.6328\\-135\\-10.4061\\-188.5391\\-135\\-10.50647\\-190.4922\\-135\\-10.70463\\-192.4453\\-135\\-11.02218\\-194.3984\\-135\\-11.08099\\-196.3516\\-135\\-10.81085\\-200.2578\\-135\\-10.15732\\-206.1172\\-135\\-10.05959\\-208.0703\\-135\\-9.971217\\-211.9766\\-135\\-10.04676\\-219.7891\\-135\\-10.32624\\-223.6953\\-135\\-10.59358\\-225.6484\\-135\\-11.22437\\-227.6016\\-135\\-11.56012\\-229.5547\\-135\\-11.55341\\-231.5078\\-135\\-11.94018\\-235.4141\\-135\\-12.25322\\-237.3672\\-135\\-12.80975\\-239.3203\\-135\\-13.25969\\-241.2734\\-135\\-13.9074\\-245.1797\\-135\\-14.39925\\-247.1328\\-135\\-15.21382\\-249.0859\\-135\\-15.76803\\-251.0391\\-135\\-16.49306\\-252.9922\\-135\\-17.40011\\-254.9453\\-135\\-17.91295\\-256.8984\\-135\\-18.94124\\-258.8516\\-135\\-20.16844\\-262.7578\\-135\\-21.24161\\-264.7109\\-135\\-21.99897\\-266.6641\\-135\\-23.24548\\-268.6172\\-135\\-24.19936\\-270.5703\\-135\\-25.33418\\-272.5234\\-135\\-26.21993\\-274.4766\\-135\\-27.41477\\-276.4297\\-135\\-28.75077\\-278.3828\\-135\\-29.93735\\-280.3359\\-135\\-32.73519\\-284.2422\\-135\\-33.87318\\-286.1953\\-135\\-35.43709\\-288.1484\\-135\\-40.03906\\-293.1302\\-135\\-41.99219\\-294.878\\-135\\-43.94531\\-296.3271\\-135\\-45.89844\\-297.5025\\-135\\-47.85156\\-298.8906\\-135\\-49.80469\\-300.099\\-135\\-51.75781\\-300.8973\\-135\\-53.71094\\-301.578\\-135\\-55.66406\\-302.3793\\-135\\-57.61719\\-302.7411\\-135\\-61.52344\\-303.2914\\-135\\-65.42969\\-304.0553\\-135\\-67.38281\\-304.2531\\-135\\-71.28906\\-304.3805\\-135\\-75.19531\\-304.3431\\-135\\-79.10156\\-304.0774\\-135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "171" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "42" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-302.2715\\-135\\57.61719\\-301.2306\\-135\\55.66406\\-300.8267\\-135\\53.71094\\-300.3116\\-135\\51.75781\\-299.3152\\-135\\49.80469\\-298.5596\\-135\\47.85156\\-297.3269\\-135\\45.89844\\-296.4001\\-135\\42.26714\\-294.0078\\-135\\40.03906\\-292.4467\\-135\\36.13281\\-288.9827\\-135\\33.28776\\-286.1953\\-135\\29.86189\\-282.2891\\-135\\28.29742\\-280.3359\\-135\\25.65524\\-276.4297\\-135\\24.6063\\-274.4766\\-135\\22.46094\\-271.0465\\-135\\22.07937\\-270.5703\\-135\\21.2228\\-268.6172\\-135\\20.08642\\-266.6641\\-135\\18.80976\\-262.7578\\-135\\17.81581\\-260.8047\\-135\\17.29986\\-258.8516\\-135\\16.37777\\-256.8984\\-135\\15.18584\\-252.9922\\-135\\14.39576\\-251.0391\\-135\\13.93769\\-249.0859\\-135\\13.32355\\-245.1797\\-135\\12.90666\\-243.2266\\-135\\12.30876\\-241.2734\\-135\\11.973\\-239.3203\\-135\\11.55164\\-235.4141\\-135\\11.2893\\-233.4609\\-135\\10.89523\\-231.5078\\-135\\10.39567\\-229.5547\\-135\\10.12074\\-227.6016\\-135\\9.684245\\-219.7891\\-135\\9.434679\\-213.9297\\-135\\9.028081\\-210.0234\\-135\\8.496094\\-204.1641\\-135\\8.432241\\-202.2109\\-135\\8.781433\\-198.3047\\-135\\9.480575\\-194.3984\\-135\\9.997914\\-188.5391\\-135\\10.2285\\-184.6328\\-135\\10.4061\\-182.6797\\-135\\11.40625\\-176.8203\\-135\\12.0503\\-170.9609\\-135\\12.55035\\-169.0078\\-135\\13.17376\\-167.0547\\-135\\13.91457\\-163.1484\\-135\\14.55298\\-161.1953\\-135\\15.47558\\-159.2422\\-135\\16.2482\\-157.2891\\-135\\17.45412\\-155.3359\\-135\\18.47076\\-153.3828\\-135\\19.70766\\-151.4297\\-135\\22.46094\\-148.0966\\-135\\24.41406\\-146.0068\\-135\\28.32031\\-142.1131\\-135\\30.27344\\-140.4805\\-135\\32.22656\\-139.006\\-135\\36.13281\\-136.6456\\-135\\38.08594\\-135.3387\\-135\\40.03906\\-134.5535\\-135\\41.99219\\-133.4871\\-135\\43.94531\\-132.9105\\-135\\45.89844\\-132.441\\-135\\47.85156\\-131.5267\\-135\\49.80469\\-131.0267\\-135\\51.75781\\-130.6436\\-135\\55.66406\\-129.5294\\-135\\57.61719\\-129.2723\\-135\\59.57031\\-129.1131\\-135\\63.47656\\-128.9104\\-135\\69.33594\\-128.8902\\-135\\75.19531\\-129.1356\\-135\\77.14844\\-129.2684\\-135\\81.05469\\-129.6978\\-135\\84.96094\\-130.4571\\-135\\90.82031\\-131.1162\\-135\\92.77344\\-131.3842\\-135\\94.72656\\-131.7883\\-135\\96.67969\\-132.3302\\-135\\98.63281\\-132.6383\\-135\\102.5391\\-133.0498\\-135\\104.4922\\-133.39\\-135\\108.3984\\-134.454\\-135\\112.3047\\-135.2891\\-135\\114.2578\\-136.1565\\-135\\118.1641\\-137.1696\\-135\\120.1172\\-138.0255\\-135\\122.0703\\-138.6821\\-135\\124.0234\\-139.2058\\-135\\125.9766\\-140.1473\\-135\\127.9297\\-140.8279\\-135\\131.8359\\-142.8005\\-135\\133.7891\\-144.0367\\-135\\135.7422\\-144.9639\\-135\\137.6953\\-146.2147\\-135\\139.6484\\-147.2147\\-135\\141.6016\\-148.6422\\-135\\145.5078\\-151.963\\-135\\147.4609\\-153.3573\\-135\\149.4141\\-155.1916\\-135\\153.3203\\-159.3251\\-135\\155.2734\\-161.7982\\-135\\157.6717\\-165.1016\\-135\\158.8239\\-167.0547\\-135\\160.1453\\-169.0078\\-135\\161.2778\\-170.9609\\-135\\162.1155\\-172.9141\\-135\\162.8143\\-174.8672\\-135\\163.777\\-176.8203\\-135\\164.2857\\-178.7734\\-135\\165.0618\\-180.7266\\-135\\165.7127\\-182.6797\\-135\\166.4051\\-186.5859\\-135\\167.2054\\-190.4922\\-135\\167.6217\\-194.3984\\-135\\167.8022\\-198.3047\\-135\\167.8596\\-204.1641\\-135\\167.8022\\-208.0703\\-135\\167.5078\\-213.9297\\-135\\166.9922\\-217.7086\\-135\\166.5728\\-219.7891\\-135\\165.6413\\-225.6484\\-135\\164.4601\\-229.5547\\-135\\163.7121\\-233.4609\\-135\\162.9552\\-235.4141\\-135\\162.323\\-237.3672\\-135\\161.9057\\-239.3203\\-135\\161.1563\\-241.2734\\-135\\160.2485\\-243.2266\\-135\\159.4898\\-245.1797\\-135\\158.357\\-247.1328\\-135\\157.5195\\-249.0859\\-135\\156.3974\\-251.0391\\-135\\155.6085\\-252.9922\\-135\\153.3203\\-256.6892\\-135\\151.9176\\-258.8516\\-135\\150.47\\-260.8047\\-135\\149.4141\\-262.4449\\-135\\147.8192\\-264.7109\\-135\\146.2447\\-266.6641\\-135\\141.0707\\-272.5234\\-135\\139.6484\\-274.048\\-135\\133.7891\\-279.8726\\-135\\128.7063\\-284.2422\\-135\\125.9766\\-286.4412\\-135\\120.1172\\-290.3039\\-135\\118.1641\\-291.3481\\-135\\116.2109\\-292.7813\\-135\\112.3047\\-294.8457\\-135\\110.3516\\-295.5139\\-135\\108.3984\\-296.566\\-135\\106.4453\\-297.1405\\-135\\104.4922\\-298.1258\\-135\\100.5859\\-299.4603\\-135\\98.63281\\-300.2767\\-135\\96.67969\\-300.7181\\-135\\92.77344\\-301.4337\\-135\\90.82031\\-301.95\\-135\\88.86719\\-302.3381\\-135\\86.91406\\-302.591\\-135\\83.00781\\-302.84\\-135\\79.10156\\-303.0065\\-135\\75.19531\\-303.1013\\-135\\71.28906\\-303.0133\\-135\\65.42969\\-302.7299\\-135\\63.47656\\-302.5497\\-135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "183" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "43" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-303.1594\\-133\\-88.86719\\-302.7299\\-133\\-90.82031\\-302.4526\\-133\\-92.77344\\-301.951\\-133\\-94.72656\\-301.3094\\-133\\-98.63281\\-300.4037\\-133\\-100.5859\\-299.5352\\-133\\-102.5391\\-298.7966\\-133\\-104.4922\\-297.8156\\-133\\-108.3984\\-296.0161\\-133\\-112.1812\\-294.0078\\-133\\-114.2578\\-292.7899\\-133\\-116.2109\\-291.2769\\-133\\-118.1641\\-289.9519\\-133\\-120.1172\\-288.8523\\-133\\-123.4467\\-286.1953\\-133\\-125.9766\\-284.0469\\-133\\-127.9297\\-282.582\\-133\\-129.8828\\-280.8316\\-133\\-136.1867\\-274.4766\\-133\\-139.2927\\-270.5703\\-133\\-141.6016\\-267.8281\\-133\\-142.511\\-266.6641\\-133\\-145.0576\\-262.7578\\-133\\-145.5078\\-262.2289\\-133\\-147.8852\\-258.8516\\-133\\-148.8281\\-256.8984\\-133\\-150.0588\\-254.9453\\-133\\-150.8659\\-252.9922\\-133\\-152.1341\\-251.0391\\-133\\-154.179\\-247.1328\\-133\\-154.9408\\-245.1797\\-133\\-155.952\\-243.2266\\-133\\-156.4897\\-241.2734\\-133\\-157.5215\\-239.3203\\-133\\-158.2031\\-237.3672\\-133\\-159.9375\\-233.4609\\-133\\-160.503\\-231.5078\\-133\\-161.368\\-229.5547\\-133\\-161.9436\\-227.6016\\-133\\-162.7189\\-223.6953\\-133\\-163.5063\\-221.7422\\-133\\-164.2958\\-217.8359\\-133\\-164.7966\\-215.8828\\-133\\-165.455\\-213.9297\\-133\\-165.8253\\-211.9766\\-133\\-166.7277\\-206.1172\\-133\\-167.1792\\-202.2109\\-133\\-167.2531\\-200.2578\\-133\\-167.0869\\-196.3516\\-133\\-165.8627\\-188.5391\\-133\\-165.4455\\-186.5859\\-133\\-164.655\\-184.6328\\-133\\-163.5989\\-180.7266\\-133\\-162.5674\\-178.7734\\-133\\-161.9251\\-176.8203\\-133\\-160.7869\\-174.8672\\-133\\-159.7923\\-172.9141\\-133\\-156.7417\\-169.0078\\-133\\-155.5\\-167.0547\\-133\\-153.79\\-165.1016\\-133\\-149.4141\\-160.7671\\-133\\-147.4609\\-159.1519\\-133\\-145.5078\\-157.8248\\-133\\-141.6016\\-154.5805\\-133\\-139.6484\\-153.2656\\-133\\-137.6953\\-152.202\\-133\\-135.7422\\-150.8366\\-133\\-133.7891\\-149.7953\\-133\\-133.3756\\-149.4766\\-133\\-129.8828\\-147.3073\\-133\\-127.9297\\-146.4431\\-133\\-125.9766\\-145.4113\\-133\\-124.0234\\-144.5545\\-133\\-122.0703\\-143.4556\\-133\\-120.1172\\-142.5232\\-133\\-118.1641\\-141.4164\\-133\\-114.2578\\-139.9403\\-133\\-112.3047\\-139.0249\\-133\\-110.3516\\-138.5426\\-133\\-108.3984\\-137.7056\\-133\\-106.4453\\-136.9858\\-133\\-104.4922\\-136.4421\\-133\\-102.5391\\-135.4878\\-133\\-98.63281\\-134.4212\\-133\\-96.67969\\-133.6652\\-133\\-94.72656\\-133.1408\\-133\\-90.82031\\-132.5271\\-133\\-86.91406\\-131.3428\\-133\\-81.05469\\-130.5624\\-133\\-79.10156\\-130.2534\\-133\\-77.14844\\-129.7967\\-133\\-75.19531\\-129.4745\\-133\\-71.28906\\-129.0492\\-133\\-69.33594\\-128.9308\\-133\\-65.42969\\-128.8237\\-133\\-61.52344\\-128.8846\\-133\\-57.61719\\-129.251\\-133\\-55.66406\\-129.5173\\-133\\-51.75781\\-130.5289\\-133\\-47.85156\\-131.3348\\-133\\-45.89844\\-132.0997\\-133\\-43.94531\\-132.6953\\-133\\-41.99219\\-133.1238\\-133\\-38.08594\\-134.8568\\-133\\-36.19026\\-135.8047\\-133\\-34.17969\\-136.9732\\-133\\-32.22656\\-138.3665\\-133\\-30.27344\\-139.4879\\-133\\-28.32031\\-140.8427\\-133\\-26.36719\\-142.5812\\-133\\-23.4627\\-145.5703\\-133\\-21.6389\\-147.5234\\-133\\-20.12416\\-149.4766\\-133\\-19.16422\\-151.4297\\-133\\-17.90926\\-153.3828\\-133\\-17.23214\\-155.3359\\-133\\-16.11032\\-157.2891\\-133\\-15.47274\\-159.2422\\-133\\-14.58135\\-161.1953\\-133\\-13.95335\\-163.1484\\-133\\-13.30645\\-167.0547\\-133\\-12.22997\\-170.9609\\-133\\-11.92197\\-172.9141\\-133\\-11.36467\\-178.7734\\-133\\-10.63368\\-184.6328\\-133\\-10.50647\\-186.5859\\-133\\-10.50647\\-188.5391\\-133\\-10.82611\\-192.4453\\-133\\-11.0919\\-194.3984\\-133\\-11.15437\\-196.3516\\-133\\-10.9489\\-200.2578\\-133\\-10.75013\\-202.2109\\-133\\-10.20397\\-206.1172\\-133\\-10.07269\\-208.0703\\-133\\-9.980562\\-211.9766\\-133\\-9.997914\\-215.8828\\-133\\-10.07934\\-219.7891\\-133\\-10.3752\\-223.6953\\-133\\-10.64745\\-225.6484\\-133\\-11.41661\\-229.5547\\-133\\-11.56374\\-231.5078\\-133\\-11.973\\-235.4141\\-133\\-12.28448\\-237.3672\\-133\\-12.88027\\-239.3203\\-133\\-13.29001\\-241.2734\\-133\\-13.94924\\-245.1797\\-133\\-14.46144\\-247.1328\\-133\\-15.26786\\-249.0859\\-133\\-15.80529\\-251.0391\\-133\\-17.43645\\-254.9453\\-133\\-17.95504\\-256.8984\\-133\\-18.98358\\-258.8516\\-133\\-19.5372\\-260.8047\\-133\\-20.21767\\-262.7578\\-133\\-21.28364\\-264.7109\\-133\\-22.04499\\-266.6641\\-133\\-23.28643\\-268.6172\\-133\\-24.26327\\-270.5703\\-133\\-25.35088\\-272.5234\\-133\\-26.27985\\-274.4766\\-133\\-27.44498\\-276.4297\\-133\\-28.80233\\-278.3828\\-133\\-29.99161\\-280.3359\\-133\\-32.77209\\-284.2422\\-133\\-33.92651\\-286.1953\\-133\\-35.5013\\-288.1484\\-133\\-40.03906\\-293.0511\\-133\\-41.99219\\-294.8132\\-133\\-43.94531\\-296.2473\\-133\\-45.89844\\-297.4224\\-133\\-47.85156\\-298.8309\\-133\\-49.80469\\-299.993\\-133\\-51.75781\\-300.8438\\-133\\-53.71094\\-301.4995\\-133\\-55.66406\\-302.3186\\-133\\-57.61719\\-302.7127\\-133\\-61.52344\\-303.2424\\-133\\-65.42969\\-303.9851\\-133\\-67.38281\\-304.2173\\-133\\-71.28906\\-304.3583\\-133\\-75.19531\\-304.3116\\-133\\-79.10156\\-304.0664\\-133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "170" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "44" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-302.1874\\-133\\59.57031\\-301.6339\\-133\\55.66406\\-300.7699\\-133\\53.71094\\-300.2253\\-133\\51.75781\\-299.2181\\-133\\49.80469\\-298.4828\\-133\\47.85156\\-297.2293\\-133\\45.89844\\-296.3229\\-133\\43.94531\\-295.0658\\-133\\40.03906\\-292.3734\\-133\\36.13281\\-288.9492\\-133\\33.32682\\-286.1953\\-133\\29.9099\\-282.2891\\-133\\28.32031\\-280.308\\-133\\25.6633\\-276.4297\\-133\\24.41406\\-274.2432\\-133\\22.46094\\-271.0465\\-133\\22.07937\\-270.5703\\-133\\21.21964\\-268.6172\\-133\\20.05558\\-266.6641\\-133\\18.80976\\-262.7578\\-133\\17.80942\\-260.8047\\-133\\17.30363\\-258.8516\\-133\\16.38986\\-256.8984\\-133\\15.74707\\-254.9453\\-133\\15.21053\\-252.9922\\-133\\14.45875\\-251.0391\\-133\\13.96833\\-249.0859\\-133\\13.3728\\-245.1797\\-133\\12.99741\\-243.2266\\-133\\12.42963\\-241.2734\\-133\\12.0503\\-239.3203\\-133\\11.40248\\-233.4609\\-133\\11.08956\\-231.5078\\-133\\10.60675\\-229.5547\\-133\\10.25391\\-227.6016\\-133\\10.07934\\-225.6484\\-133\\9.848933\\-221.7422\\-133\\9.579373\\-215.8828\\-133\\9.294783\\-211.9766\\-133\\8.640455\\-206.1172\\-133\\8.507236\\-204.1641\\-133\\8.47425\\-202.2109\\-133\\8.812689\\-200.2578\\-133\\9.038549\\-198.3047\\-133\\9.165646\\-196.3516\\-133\\9.689405\\-192.4453\\-133\\10.00381\\-188.5391\\-133\\10.38537\\-182.6797\\-133\\10.6756\\-180.7266\\-133\\11.39509\\-176.8203\\-133\\12.01468\\-170.9609\\-133\\12.48238\\-169.0078\\-133\\13.11671\\-167.0547\\-133\\13.87747\\-163.1484\\-133\\14.48449\\-161.1953\\-133\\15.45235\\-159.2422\\-133\\16.21474\\-157.2891\\-133\\17.45279\\-155.3359\\-133\\18.48548\\-153.3828\\-133\\19.66809\\-151.4297\\-133\\22.46094\\-148.0045\\-133\\24.41406\\-145.9505\\-133\\28.32031\\-142.0385\\-133\\30.27344\\-140.4206\\-133\\32.22656\\-138.9335\\-133\\34.17969\\-137.677\\-133\\36.13281\\-136.5648\\-133\\38.08594\\-135.267\\-133\\40.03906\\-134.454\\-133\\41.99219\\-133.39\\-133\\45.89844\\-132.3198\\-133\\47.85156\\-131.3757\\-133\\51.75781\\-130.5074\\-133\\53.71094\\-129.8645\\-133\\55.66406\\-129.3834\\-133\\59.57031\\-129.0072\\-133\\63.47656\\-128.7825\\-133\\69.33594\\-128.6943\\-133\\75.19531\\-128.9393\\-133\\81.05469\\-129.3834\\-133\\83.00781\\-129.6305\\-133\\86.91406\\-130.4454\\-133\\94.72656\\-131.419\\-133\\98.63281\\-132.3867\\-133\\100.5859\\-132.6716\\-133\\104.4922\\-133.116\\-133\\106.4453\\-133.4568\\-133\\110.3516\\-134.5456\\-133\\112.3047\\-134.9523\\-133\\116.2109\\-136.28\\-133\\120.1172\\-137.4217\\-133\\122.0703\\-138.3334\\-133\\124.0234\\-138.8678\\-133\\125.9766\\-139.5928\\-133\\127.9297\\-140.5258\\-133\\129.8828\\-141.2475\\-133\\131.8359\\-142.4101\\-133\\133.7891\\-143.4428\\-133\\137.3355\\-145.5703\\-133\\139.6484\\-146.857\\-133\\141.6016\\-148.3685\\-133\\145.5078\\-151.5843\\-133\\147.4609\\-152.9997\\-133\\149.4141\\-154.84\\-133\\153.6381\\-159.2422\\-133\\155.2734\\-161.3581\\-133\\156.4077\\-163.1484\\-133\\157.8837\\-165.1016\\-133\\159.1797\\-167.1392\\-133\\161.1328\\-170.4824\\-133\\161.4771\\-170.9609\\-133\\162.9836\\-174.8672\\-133\\163.8661\\-176.8203\\-133\\164.3861\\-178.7734\\-133\\165.2135\\-180.7266\\-133\\165.774\\-182.6797\\-133\\166.4709\\-186.5859\\-133\\167.2549\\-190.4922\\-133\\167.4956\\-192.4453\\-133\\167.8136\\-198.3047\\-133\\167.8711\\-202.2109\\-133\\167.8136\\-208.0703\\-133\\167.6374\\-211.9766\\-133\\167.2911\\-215.8828\\-133\\166.9922\\-217.7935\\-133\\166.253\\-221.7422\\-133\\165.6561\\-225.6484\\-133\\165.1338\\-227.6016\\-133\\164.4768\\-229.5547\\-133\\163.7121\\-233.4609\\-133\\162.323\\-237.3672\\-133\\161.9057\\-239.3203\\-133\\161.1328\\-241.2584\\-133\\160.2268\\-243.2266\\-133\\159.4786\\-245.1797\\-133\\158.3344\\-247.1328\\-133\\157.4971\\-249.0859\\-133\\156.3782\\-251.0391\\-133\\155.5451\\-252.9922\\-133\\151.8738\\-258.8516\\-133\\150.4266\\-260.8047\\-133\\147.7817\\-264.7109\\-133\\146.2054\\-266.6641\\-133\\141.0352\\-272.5234\\-133\\139.6484\\-274.0199\\-133\\133.7891\\-279.8371\\-133\\128.666\\-284.2422\\-133\\125.9766\\-286.3629\\-133\\122.0703\\-289.0199\\-133\\120.1172\\-290.2785\\-133\\118.1641\\-291.3366\\-133\\116.2109\\-292.7697\\-133\\112.3047\\-294.8457\\-133\\110.3516\\-295.5139\\-133\\108.3984\\-296.566\\-133\\106.4453\\-297.1295\\-133\\104.4922\\-298.1135\\-133\\100.5859\\-299.4504\\-133\\98.63281\\-300.2667\\-133\\96.67969\\-300.7181\\-133\\92.77344\\-301.4202\\-133\\88.86719\\-302.325\\-133\\86.91406\\-302.572\\-133\\84.96094\\-302.7188\\-133\\79.10156\\-302.9824\\-133\\75.19531\\-303.0565\\-133\\71.28906\\-302.9715\\-133\\65.42969\\-302.689\\-133\\63.47656\\-302.5021\\-133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "186" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "45" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-304.0325\\-131\\-83.00781\\-303.4081\\-131\\-86.91406\\-302.8929\\-131\\-88.86719\\-302.7127\\-131\\-90.82031\\-302.4227\\-131\\-92.77344\\-301.9211\\-131\\-94.72656\\-301.2964\\-131\\-98.63281\\-300.3916\\-131\\-100.5859\\-299.4906\\-131\\-102.5391\\-298.7639\\-131\\-104.4922\\-297.7587\\-131\\-108.3872\\-295.9609\\-131\\-112.1571\\-294.0078\\-131\\-114.2578\\-292.7787\\-131\\-116.2109\\-291.2653\\-131\\-118.1641\\-289.9362\\-131\\-120.1172\\-288.8441\\-131\\-122.0703\\-287.3177\\-131\\-125.9766\\-284.0329\\-131\\-127.9297\\-282.597\\-131\\-129.8828\\-280.8426\\-131\\-132.2943\\-278.3828\\-131\\-134.3356\\-276.4297\\-131\\-136.1979\\-274.4766\\-131\\-139.3066\\-270.5703\\-131\\-141.6016\\-267.8533\\-131\\-142.529\\-266.6641\\-131\\-145.0823\\-262.7578\\-131\\-145.5078\\-262.2572\\-131\\-147.9091\\-258.8516\\-131\\-148.8647\\-256.8984\\-131\\-150.0796\\-254.9453\\-131\\-150.9221\\-252.9922\\-131\\-152.1692\\-251.0391\\-131\\-154.2066\\-247.1328\\-131\\-155.0038\\-245.1797\\-131\\-155.9933\\-243.2266\\-131\\-156.529\\-241.2734\\-131\\-157.5776\\-239.3203\\-131\\-158.2387\\-237.3672\\-131\\-159.9842\\-233.4609\\-131\\-160.5756\\-231.5078\\-131\\-161.4445\\-229.5547\\-131\\-161.9792\\-227.6016\\-131\\-162.3324\\-225.6484\\-131\\-162.8183\\-223.6953\\-131\\-163.5866\\-221.7422\\-131\\-164.3638\\-217.8359\\-131\\-165.5388\\-213.9297\\-131\\-166.8674\\-206.1172\\-131\\-167.1408\\-204.1641\\-131\\-167.3112\\-202.2109\\-131\\-167.3456\\-198.3047\\-131\\-167.2175\\-196.3516\\-131\\-166.9241\\-194.3984\\-131\\-165.9264\\-188.5391\\-131\\-165.5187\\-186.5859\\-131\\-164.7571\\-184.6328\\-131\\-164.1575\\-182.6797\\-131\\-163.66\\-180.7266\\-131\\-162.6496\\-178.7734\\-131\\-161.969\\-176.8203\\-131\\-159.8609\\-172.9141\\-131\\-156.7625\\-169.0078\\-131\\-155.5426\\-167.0547\\-131\\-153.827\\-165.1016\\-131\\-149.4141\\-160.7588\\-131\\-147.4609\\-159.1683\\-131\\-145.5078\\-157.8615\\-131\\-143.5547\\-156.3008\\-131\\-141.6016\\-154.6286\\-131\\-139.6484\\-153.3425\\-131\\-137.6953\\-152.2199\\-131\\-135.7422\\-150.857\\-131\\-133.7891\\-149.7953\\-131\\-129.8828\\-147.3056\\-131\\-127.9297\\-146.4377\\-131\\-125.9766\\-145.3558\\-131\\-124.0234\\-144.4972\\-131\\-122.0703\\-143.3335\\-131\\-120.1172\\-142.431\\-131\\-118.1641\\-141.2936\\-131\\-116.2109\\-140.573\\-131\\-112.3047\\-138.8815\\-131\\-110.3516\\-138.3564\\-131\\-108.3984\\-137.3659\\-131\\-104.4922\\-136.1417\\-131\\-102.5391\\-135.2475\\-131\\-98.63281\\-134.1212\\-131\\-96.67969\\-133.34\\-131\\-92.77344\\-132.6473\\-131\\-90.82031\\-132.2146\\-131\\-88.86719\\-131.5267\\-131\\-86.91406\\-131.1262\\-131\\-83.00781\\-130.6053\\-131\\-81.05469\\-130.2941\\-131\\-79.10156\\-129.836\\-131\\-77.14844\\-129.484\\-131\\-75.19531\\-129.2385\\-131\\-71.28906\\-128.8596\\-131\\-67.38281\\-128.657\\-131\\-63.47656\\-128.6136\\-131\\-61.52344\\-128.6847\\-131\\-57.61719\\-129.0417\\-131\\-55.66406\\-129.2768\\-131\\-53.71094\\-129.6484\\-131\\-51.75781\\-130.2686\\-131\\-47.85156\\-131.0863\\-131\\-45.89844\\-131.6242\\-131\\-43.94531\\-132.4882\\-131\\-41.99219\\-132.9293\\-131\\-40.03906\\-133.5819\\-131\\-38.08594\\-134.6171\\-131\\-36.13281\\-135.4361\\-131\\-32.5728\\-137.7578\\-131\\-30.27344\\-139.1676\\-131\\-28.32031\\-140.681\\-131\\-26.36719\\-142.4116\\-131\\-23.33108\\-145.5703\\-131\\-21.52123\\-147.5234\\-131\\-20.03291\\-149.4766\\-131\\-19.12875\\-151.4297\\-131\\-17.8722\\-153.3828\\-131\\-17.18176\\-155.3359\\-131\\-16.03947\\-157.2891\\-131\\-15.42222\\-159.2422\\-131\\-14.52455\\-161.1953\\-131\\-13.92613\\-163.1484\\-131\\-13.28506\\-167.0547\\-131\\-12.27101\\-170.9609\\-131\\-11.94719\\-172.9141\\-131\\-11.39884\\-178.7734\\-131\\-10.71948\\-184.6328\\-131\\-10.5678\\-186.5859\\-131\\-10.70463\\-190.4922\\-131\\-11.14695\\-194.3984\\-131\\-11.2335\\-196.3516\\-131\\-11.1263\\-200.2578\\-131\\-10.89523\\-202.2109\\-131\\-10.54275\\-204.1641\\-131\\-10.07269\\-208.0703\\-131\\-9.986291\\-211.9766\\-131\\-10.00977\\-215.8828\\-131\\-10.10665\\-219.7891\\-131\\-10.43822\\-223.6953\\-131\\-10.71948\\-225.6484\\-131\\-11.11328\\-227.6016\\-131\\-12.00701\\-235.4141\\-131\\-12.35352\\-237.3672\\-131\\-12.95906\\-239.3203\\-131\\-13.33599\\-241.2734\\-131\\-13.99158\\-245.1797\\-131\\-14.52637\\-247.1328\\-131\\-15.31948\\-249.0859\\-131\\-15.84371\\-251.0391\\-131\\-17.45669\\-254.9453\\-131\\-17.99417\\-256.8984\\-131\\-19.0268\\-258.8516\\-131\\-19.55492\\-260.8047\\-131\\-20.24407\\-262.7578\\-131\\-21.31172\\-264.7109\\-131\\-22.08391\\-266.6641\\-131\\-23.31543\\-268.6172\\-131\\-25.37359\\-272.5234\\-131\\-26.31069\\-274.4766\\-131\\-27.4688\\-276.4297\\-131\\-28.81485\\-278.3828\\-131\\-30.0029\\-280.3359\\-131\\-32.79511\\-284.2422\\-131\\-33.97993\\-286.1953\\-131\\-35.57195\\-288.1484\\-131\\-40.03906\\-292.9914\\-131\\-41.99219\\-294.7595\\-131\\-43.94531\\-296.1517\\-131\\-45.89844\\-297.3346\\-131\\-47.85156\\-298.7597\\-131\\-49.80469\\-299.875\\-131\\-51.75781\\-300.7964\\-131\\-53.71094\\-301.4174\\-131\\-55.66406\\-302.2505\\-131\\-57.61719\\-302.6826\\-131\\-61.52344\\-303.1757\\-131\\-65.42969\\-303.9221\\-131\\-67.38281\\-304.1798\\-131\\-71.28906\\-304.3275\\-131\\-75.19531\\-304.2787\\-131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "173" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "46" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-302.1003\\-131\\59.57031\\-301.5403\\-131\\55.66406\\-300.7196\\-131\\53.71094\\-300.1317\\-131\\51.75781\\-299.132\\-131\\49.80469\\-298.3811\\-131\\47.85156\\-297.1455\\-131\\45.89844\\-296.2266\\-131\\43.94531\\-295.0153\\-131\\40.03906\\-292.2865\\-131\\37.57403\\-290.1016\\-131\\36.13281\\-288.9022\\-131\\33.36042\\-286.1953\\-131\\29.94792\\-282.2891\\-131\\28.32031\\-280.253\\-131\\25.67598\\-276.4297\\-131\\24.41406\\-274.2432\\-131\\22.46094\\-271.0303\\-131\\22.08984\\-270.5703\\-131\\21.21538\\-268.6172\\-131\\20.06869\\-266.6641\\-131\\18.80787\\-262.7578\\-131\\17.8197\\-260.8047\\-131\\17.30745\\-258.8516\\-131\\16.41456\\-256.8984\\-131\\15.75684\\-254.9453\\-131\\15.24554\\-252.9922\\-131\\14.48449\\-251.0391\\-131\\13.99158\\-249.0859\\-131\\13.42163\\-245.1797\\-131\\13.08187\\-243.2266\\-131\\12.55148\\-241.2734\\-131\\12.12565\\-239.3203\\-131\\11.84353\\-237.3672\\-131\\11.49053\\-233.4609\\-131\\11.21511\\-231.5078\\-131\\10.41667\\-227.6016\\-131\\10.17253\\-225.6484\\-131\\10.04044\\-223.6953\\-131\\9.521484\\-213.9297\\-131\\9.370484\\-211.9766\\-131\\8.653626\\-206.1172\\-131\\8.518528\\-204.1641\\-131\\8.496094\\-202.2109\\-131\\8.857727\\-200.2578\\-131\\9.193372\\-196.3516\\-131\\9.859076\\-190.4922\\-131\\10.3752\\-182.6797\\-131\\10.62012\\-180.7266\\-131\\11.36877\\-176.8203\\-131\\11.98033\\-170.9609\\-131\\12.44213\\-169.0078\\-131\\13.07091\\-167.0547\\-131\\13.83653\\-163.1484\\-131\\14.44469\\-161.1953\\-131\\15.42426\\-159.2422\\-131\\16.20464\\-157.2891\\-131\\17.45737\\-155.3359\\-131\\18.48602\\-153.3828\\-131\\19.66105\\-151.4297\\-131\\22.46094\\-147.9273\\-131\\24.41406\\-145.9084\\-131\\28.32031\\-141.9846\\-131\\30.27344\\-140.3685\\-131\\32.22656\\-138.8748\\-131\\34.17969\\-137.5461\\-131\\36.13281\\-136.4768\\-131\\38.08594\\-135.1921\\-131\\40.03906\\-134.3365\\-131\\41.99219\\-133.2889\\-131\\43.94531\\-132.7619\\-131\\45.89844\\-132.1261\\-131\\47.85156\\-131.2421\\-131\\51.75781\\-130.3091\\-131\\53.71094\\-129.5988\\-131\\55.66406\\-129.2392\\-131\\59.57031\\-128.863\\-131\\63.47656\\-128.597\\-131\\69.33594\\-128.4564\\-131\\75.19531\\-128.7299\\-131\\83.00781\\-129.3282\\-131\\84.96094\\-129.5885\\-131\\88.86719\\-130.3841\\-131\\92.77344\\-130.9421\\-131\\96.67969\\-131.4131\\-131\\100.5859\\-132.3435\\-131\\106.4453\\-133.0961\\-131\\108.3984\\-133.4679\\-131\\112.3047\\-134.5885\\-131\\116.2109\\-135.5484\\-131\\118.1641\\-136.3528\\-131\\122.0703\\-137.633\\-131\\124.0234\\-138.4824\\-131\\125.9766\\-139.0836\\-131\\127.9297\\-140.0414\\-131\\129.8828\\-140.8064\\-131\\133.7891\\-142.8848\\-131\\135.7422\\-144.1801\\-131\\137.6953\\-145.2303\\-131\\141.0423\\-147.5234\\-131\\143.5547\\-149.4681\\-131\\147.4609\\-152.6843\\-131\\149.4141\\-154.4877\\-131\\150.1736\\-155.3359\\-131\\153.969\\-159.2422\\-131\\155.558\\-161.1953\\-131\\156.6752\\-163.1484\\-131\\157.2266\\-163.8472\\-131\\159.4442\\-167.0547\\-131\\160.464\\-169.0078\\-131\\161.6478\\-170.9609\\-131\\162.3059\\-172.9141\\-131\\163.2276\\-174.8672\\-131\\163.9569\\-176.8203\\-131\\164.5081\\-178.7734\\-131\\165.3539\\-180.7266\\-131\\165.8335\\-182.6797\\-131\\167.2891\\-190.4922\\-131\\167.5199\\-192.4453\\-131\\167.8251\\-198.3047\\-131\\167.8711\\-202.2109\\-131\\167.8203\\-208.0703\\-131\\167.6374\\-211.9766\\-131\\167.3133\\-215.8828\\-131\\166.9998\\-217.8359\\-131\\166.2666\\-221.7422\\-131\\165.6706\\-225.6484\\-131\\165.1877\\-227.6016\\-131\\164.5146\\-229.5547\\-131\\163.7198\\-233.4609\\-131\\162.9697\\-235.4141\\-131\\162.323\\-237.3672\\-131\\161.8984\\-239.3203\\-131\\161.1328\\-241.2284\\-131\\160.221\\-243.2266\\-131\\159.4673\\-245.1797\\-131\\158.3226\\-247.1328\\-131\\157.474\\-249.0859\\-131\\156.366\\-251.0391\\-131\\155.5045\\-252.9922\\-131\\154.315\\-254.9453\\-131\\151.8242\\-258.8516\\-131\\150.3847\\-260.8047\\-131\\147.7431\\-264.7109\\-131\\146.1568\\-266.6641\\-131\\142.7612\\-270.5703\\-131\\139.6484\\-273.9883\\-131\\133.7891\\-279.8128\\-131\\131.8359\\-281.5251\\-131\\128.625\\-284.2422\\-131\\125.9766\\-286.3221\\-131\\122.0703\\-289.0076\\-131\\120.1172\\-290.2523\\-131\\118.1641\\-291.3336\\-131\\116.2109\\-292.7623\\-131\\112.3047\\-294.8526\\-131\\110.3516\\-295.5246\\-131\\108.3984\\-296.5577\\-131\\106.4453\\-297.1405\\-131\\104.4922\\-298.0884\\-131\\102.5391\\-298.8245\\-131\\100.5859\\-299.4478\\-131\\98.63281\\-300.2767\\-131\\96.67969\\-300.7181\\-131\\92.77344\\-301.4095\\-131\\88.86719\\-302.302\\-131\\86.91406\\-302.5527\\-131\\83.00781\\-302.8023\\-131\\79.10156\\-302.9605\\-131\\75.19531\\-303.0244\\-131\\71.28906\\-302.9372\\-131\\65.42969\\-302.6582\\-131\\63.47656\\-302.461\\-131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "186" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "47" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.9729\\-129\\-83.00781\\-303.366\\-129\\-86.91406\\-302.8716\\-129\\-88.86719\\-302.6826\\-129\\-90.82031\\-302.3884\\-129\\-94.72656\\-301.265\\-129\\-98.63281\\-300.3616\\-129\\-100.5859\\-299.438\\-129\\-102.5391\\-298.7261\\-129\\-104.4922\\-297.6915\\-129\\-106.4453\\-296.8414\\-129\\-110.3516\\-294.9539\\-129\\-114.2578\\-292.7675\\-129\\-116.2109\\-291.2467\\-129\\-118.1641\\-289.9233\\-129\\-120.1172\\-288.8314\\-129\\-122.0703\\-287.3051\\-129\\-125.9766\\-284.0057\\-129\\-127.9297\\-282.597\\-129\\-129.8828\\-280.8426\\-129\\-132.3044\\-278.3828\\-129\\-134.3356\\-276.4297\\-129\\-136.1867\\-274.4766\\-129\\-139.3182\\-270.5703\\-129\\-140.9879\\-268.6172\\-129\\-142.5225\\-266.6641\\-129\\-143.8535\\-264.7109\\-129\\-145.0823\\-262.7578\\-129\\-145.5078\\-262.2614\\-129\\-147.9193\\-258.8516\\-129\\-148.8845\\-256.8984\\-129\\-150.0958\\-254.9453\\-129\\-150.9458\\-252.9922\\-129\\-152.1864\\-251.0391\\-129\\-154.2344\\-247.1328\\-129\\-155.0458\\-245.1797\\-129\\-156.0184\\-243.2266\\-129\\-156.5776\\-241.2734\\-129\\-157.6184\\-239.3203\\-129\\-158.281\\-237.3672\\-129\\-159.2319\\-235.4141\\-129\\-160.0146\\-233.4609\\-129\\-160.6353\\-231.5078\\-129\\-161.5032\\-229.5547\\-129\\-162.0265\\-227.6016\\-129\\-162.3718\\-225.6484\\-129\\-162.9132\\-223.6953\\-129\\-163.66\\-221.7422\\-129\\-164.4403\\-217.8359\\-129\\-165.6196\\-213.9297\\-129\\-166.2735\\-210.0234\\-129\\-167.0149\\-206.1172\\-129\\-167.2759\\-204.1641\\-129\\-167.4241\\-202.2109\\-129\\-167.4557\\-198.3047\\-129\\-167.322\\-196.3516\\-129\\-167.073\\-194.3984\\-129\\-165.6042\\-186.5859\\-129\\-164.2244\\-182.6797\\-129\\-163.7198\\-180.7266\\-129\\-162.7341\\-178.7734\\-129\\-162.031\\-176.8203\\-129\\-161.1328\\-175.0015\\-129\\-159.9212\\-172.9141\\-129\\-156.8316\\-169.0078\\-129\\-155.6115\\-167.0547\\-129\\-153.8834\\-165.1016\\-129\\-149.4141\\-160.7327\\-129\\-147.4609\\-159.1519\\-129\\-145.5078\\-157.8481\\-129\\-143.5547\\-156.2948\\-129\\-141.6016\\-154.6035\\-129\\-139.6484\\-153.2647\\-129\\-137.6953\\-152.1734\\-129\\-135.7422\\-150.7925\\-129\\-133.7891\\-149.6588\\-129\\-129.8828\\-147.1741\\-129\\-127.9297\\-146.3278\\-129\\-125.9766\\-145.146\\-129\\-124.0234\\-144.3191\\-129\\-122.0703\\-143.0652\\-129\\-120.1172\\-142.1803\\-129\\-118.1641\\-141.049\\-129\\-116.2109\\-140.3378\\-129\\-114.2578\\-139.2885\\-129\\-112.3047\\-138.657\\-129\\-110.3516\\-137.8917\\-129\\-108.3984\\-136.9933\\-129\\-106.4453\\-136.3707\\-129\\-104.4922\\-135.493\\-129\\-100.5859\\-134.3028\\-129\\-98.63281\\-133.5116\\-129\\-96.67969\\-133.0224\\-129\\-94.72656\\-132.671\\-129\\-92.77344\\-132.2216\\-129\\-90.82031\\-131.5751\\-129\\-88.86719\\-131.1377\\-129\\-84.96094\\-130.5208\\-129\\-81.05469\\-129.6752\\-129\\-77.14844\\-129.1453\\-129\\-71.28906\\-128.6055\\-129\\-67.38281\\-128.3947\\-129\\-63.47656\\-128.392\\-129\\-59.57031\\-128.6169\\-129\\-55.66406\\-129.0312\\-129\\-53.71094\\-129.3155\\-129\\-51.75781\\-129.7556\\-129\\-49.80469\\-130.4031\\-129\\-45.89844\\-131.2603\\-129\\-43.94531\\-132.1163\\-129\\-40.03906\\-133.242\\-129\\-38.08594\\-134.2711\\-129\\-36.13281\\-135.1046\\-129\\-34.17969\\-136.4244\\-129\\-32.22656\\-137.6024\\-129\\-30.27344\\-138.9183\\-129\\-26.89179\\-141.6641\\-129\\-24.41406\\-144.2197\\-129\\-21.41639\\-147.5234\\-129\\-19.93222\\-149.4766\\-129\\-19.06972\\-151.4297\\-129\\-17.81404\\-153.3828\\-129\\-17.08984\\-155.3359\\-129\\-15.95595\\-157.2891\\-129\\-15.34913\\-159.2422\\-129\\-14.45737\\-161.1953\\-129\\-13.88889\\-163.1484\\-129\\-13.25061\\-167.0547\\-129\\-12.24716\\-170.9609\\-129\\-11.93576\\-172.9141\\-129\\-11.39884\\-178.7734\\-129\\-10.66142\\-184.6328\\-129\\-10.54275\\-186.5859\\-129\\-10.70463\\-190.4922\\-129\\-11.17974\\-194.3984\\-129\\-11.30106\\-196.3516\\-129\\-11.28738\\-200.2578\\-129\\-10.59358\\-204.1641\\-129\\-10.07269\\-208.0703\\-129\\-10.00381\\-210.0234\\-129\\-9.992074\\-213.9297\\-129\\-10.05314\\-217.8359\\-129\\-10.15732\\-219.7891\\-129\\-10.51839\\-223.6953\\-129\\-11.19626\\-227.6016\\-129\\-11.38393\\-229.5547\\-129\\-12.05842\\-235.4141\\-129\\-12.46769\\-237.3672\\-129\\-13.05474\\-239.3203\\-129\\-14.02274\\-245.1797\\-129\\-14.58185\\-247.1328\\-129\\-15.34751\\-249.0859\\-129\\-15.86019\\-251.0391\\-129\\-16.739\\-252.9922\\-129\\-17.46235\\-254.9453\\-129\\-18.01934\\-256.8984\\-129\\-19.06224\\-258.8516\\-129\\-19.57293\\-260.8047\\-129\\-20.2691\\-262.7578\\-129\\-21.33331\\-264.7109\\-129\\-22.10412\\-266.6641\\-129\\-23.33774\\-268.6172\\-129\\-25.3792\\-272.5234\\-129\\-26.32683\\-274.4766\\-129\\-27.46212\\-276.4297\\-129\\-28.81804\\-278.3828\\-129\\-30.0029\\-280.3359\\-129\\-32.82187\\-284.2422\\-129\\-34.03585\\-286.1953\\-129\\-35.64116\\-288.1484\\-129\\-40.03906\\-292.9382\\-129\\-41.99219\\-294.7127\\-129\\-43.94531\\-296.0476\\-129\\-45.89844\\-297.2485\\-129\\-47.85156\\-298.6942\\-129\\-49.96142\\-299.8672\\-129\\-51.75781\\-300.7437\\-129\\-53.71094\\-301.3386\\-129\\-55.66406\\-302.1671\\-129\\-57.61719\\-302.6399\\-129\\-61.52344\\-303.1205\\-129\\-65.42969\\-303.8682\\-129\\-67.38281\\-304.1302\\-129\\-69.33594\\-304.2531\\-129\\-73.24219\\-304.2954\\-129\\-75.19531\\-304.2443\\-129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "169" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "48" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-302.0349\\-129\\59.57031\\-301.4646\\-129\\55.66406\\-300.6698\\-129\\53.71094\\-300.0169\\-129\\51.75781\\-299.0543\\-129\\49.80469\\-298.2674\\-129\\47.85156\\-297.0794\\-129\\45.89844\\-296.1337\\-129\\43.94531\\-294.9598\\-129\\40.03906\\-292.1786\\-129\\37.65462\\-290.1016\\-129\\36.13281\\-288.8677\\-129\\33.39448\\-286.1953\\-129\\29.98708\\-282.2891\\-129\\28.32031\\-280.2162\\-129\\25.68867\\-276.4297\\-129\\24.41406\\-274.2281\\-129\\22.46094\\-271.0142\\-129\\22.10046\\-270.5703\\-129\\21.22708\\-268.6172\\-129\\20.07892\\-266.6641\\-129\\18.82037\\-262.7578\\-129\\17.83265\\-260.8047\\-129\\17.32086\\-258.8516\\-129\\16.41456\\-256.8984\\-129\\15.7666\\-254.9453\\-129\\15.27936\\-252.9922\\-129\\14.53912\\-251.0391\\-129\\14.03073\\-249.0859\\-129\\13.49706\\-245.1797\\-129\\13.1537\\-243.2266\\-129\\12.19733\\-239.3203\\-129\\11.90396\\-237.3672\\-129\\11.55772\\-233.4609\\-129\\11.07449\\-229.5547\\-129\\10.62012\\-227.6016\\-129\\10.3075\\-225.6484\\-129\\10.12074\\-223.6953\\-129\\9.880786\\-219.7891\\-129\\9.595352\\-213.9297\\-129\\9.231852\\-210.0234\\-129\\8.694322\\-206.1172\\-129\\8.507236\\-202.2109\\-129\\9.841108\\-190.4922\\-129\\10.02798\\-188.5391\\-129\\10.21205\\-184.6328\\-129\\10.59358\\-180.7266\\-129\\11.34091\\-176.8203\\-129\\11.95427\\-170.9609\\-129\\12.40517\\-169.0078\\-129\\13.04605\\-167.0547\\-129\\13.82036\\-163.1484\\-129\\14.39576\\-161.1953\\-129\\15.39586\\-159.2422\\-129\\16.19204\\-157.2891\\-129\\17.45144\\-155.3359\\-129\\18.48548\\-153.3828\\-129\\19.65565\\-151.4297\\-129\\21.12815\\-149.4766\\-129\\22.46094\\-147.8589\\-129\\28.56237\\-141.6641\\-129\\31.01223\\-139.7109\\-129\\34.17969\\-137.4113\\-129\\36.13281\\-136.3479\\-129\\38.08594\\-135.0824\\-129\\41.99219\\-133.1692\\-129\\43.94531\\-132.664\\-129\\47.85156\\-131.0904\\-129\\49.80469\\-130.6444\\-129\\51.7759\\-129.9453\\-129\\53.71094\\-129.3583\\-129\\55.66406\\-129.0659\\-129\\59.57031\\-128.6188\\-129\\63.47656\\-128.2911\\-129\\67.38281\\-128.1296\\-129\\69.33594\\-128.1023\\-129\\75.19531\\-128.4463\\-129\\84.96094\\-129.1979\\-129\\88.86719\\-129.6733\\-129\\92.77344\\-130.4857\\-129\\98.63281\\-131.1798\\-129\\104.4922\\-132.404\\-129\\106.4453\\-132.6887\\-129\\110.3516\\-133.3633\\-129\\114.2578\\-134.5635\\-129\\116.2109\\-134.9685\\-129\\118.1641\\-135.5226\\-129\\120.1172\\-136.3581\\-129\\122.0703\\-136.944\\-129\\125.9766\\-138.6266\\-129\\127.9297\\-139.2934\\-129\\129.8828\\-140.3416\\-129\\131.8359\\-141.169\\-129\\133.7891\\-142.3714\\-129\\135.7422\\-143.4734\\-129\\139.6484\\-146.1508\\-129\\141.6016\\-147.295\\-129\\143.5547\\-148.8459\\-129\\146.537\\-151.4297\\-129\\149.4141\\-154.021\\-129\\152.5269\\-157.2891\\-129\\154.3172\\-159.2422\\-129\\155.877\\-161.1953\\-129\\158.3452\\-165.1016\\-129\\159.7524\\-167.0547\\-129\\160.7068\\-169.0078\\-129\\161.8367\\-170.9609\\-129\\162.4499\\-172.9141\\-129\\163.4404\\-174.8672\\-129\\164.6524\\-178.7734\\-129\\165.4738\\-180.7266\\-129\\165.911\\-182.6797\\-129\\167.335\\-190.4922\\-129\\167.6798\\-194.3984\\-129\\167.8317\\-198.3047\\-129\\167.8826\\-202.2109\\-129\\167.8203\\-208.0703\\-129\\167.649\\-211.9766\\-129\\167.3242\\-215.8828\\-129\\167.0298\\-217.8359\\-129\\166.2884\\-221.7422\\-129\\165.6883\\-225.6484\\-129\\165.2261\\-227.6016\\-129\\164.5356\\-229.5547\\-129\\163.7275\\-233.4609\\-129\\162.3352\\-237.3672\\-129\\161.8984\\-239.3203\\-129\\161.1328\\-241.2284\\-129\\160.221\\-243.2266\\-129\\159.4424\\-245.1797\\-129\\158.3122\\-247.1328\\-129\\157.4383\\-249.0859\\-129\\156.347\\-251.0391\\-129\\155.4627\\-252.9922\\-129\\154.2729\\-254.9453\\-129\\152.9558\\-256.8984\\-129\\151.7513\\-258.8516\\-129\\150.3433\\-260.8047\\-129\\147.6788\\-264.7109\\-129\\145.5078\\-267.3606\\-129\\142.7263\\-270.5703\\-129\\139.6484\\-273.9408\\-129\\133.7891\\-279.7691\\-129\\131.8359\\-281.4907\\-129\\128.5728\\-284.2422\\-129\\125.9766\\-286.308\\-129\\122.0703\\-289.0006\\-129\\120.1172\\-290.239\\-129\\118.1641\\-291.3223\\-129\\116.2109\\-292.7654\\-129\\112.3047\\-294.8526\\-129\\110.3516\\-295.5246\\-129\\108.3984\\-296.5577\\-129\\106.4453\\-297.1382\\-129\\104.4922\\-298.0757\\-129\\102.5391\\-298.8143\\-129\\100.5859\\-299.4478\\-129\\98.63281\\-300.2767\\-129\\96.67969\\-300.7067\\-129\\92.77344\\-301.4066\\-129\\88.86719\\-302.2818\\-129\\86.91406\\-302.5377\\-129\\83.00781\\-302.7969\\-129\\79.10156\\-302.9434\\-129\\75.19531\\-303.0065\\-129\\73.24219\\-302.9779\\-129\\67.38281\\-302.7527\\-129\\65.42969\\-302.6283\\-129\\63.47656\\-302.4012\\-129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "49" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.8955\\-127\\-83.00781\\-303.3039\\-127\\-88.86719\\-302.6648\\-127\\-90.82031\\-302.3477\\-127\\-94.72656\\-301.2306\\-127\\-98.63281\\-300.3184\\-127\\-100.5859\\-299.388\\-127\\-102.5391\\-298.6878\\-127\\-104.4922\\-297.6381\\-127\\-106.4453\\-296.8201\\-127\\-110.3516\\-294.9359\\-127\\-114.2578\\-292.7522\\-127\\-116.2109\\-291.2419\\-127\\-118.1641\\-289.9093\\-127\\-120.1172\\-288.823\\-127\\-123.4111\\-286.1953\\-127\\-125.9766\\-284.0057\\-127\\-127.9297\\-282.582\\-127\\-129.8828\\-280.8279\\-127\\-136.1979\\-274.4766\\-127\\-139.33\\-270.5703\\-127\\-141.0143\\-268.6172\\-127\\-142.5159\\-266.6641\\-127\\-143.8535\\-264.7109\\-127\\-145.0684\\-262.7578\\-127\\-145.5078\\-262.2494\\-127\\-147.9326\\-258.8516\\-127\\-148.8882\\-256.8984\\-127\\-150.1116\\-254.9453\\-127\\-150.9671\\-252.9922\\-127\\-152.2035\\-251.0391\\-127\\-154.2571\\-247.1328\\-127\\-155.0871\\-245.1797\\-127\\-156.0385\\-243.2266\\-127\\-156.6193\\-241.2734\\-127\\-157.6599\\-239.3203\\-127\\-158.3239\\-237.3672\\-127\\-159.3413\\-235.4141\\-127\\-160.7079\\-231.5078\\-127\\-161.5617\\-229.5547\\-127\\-162.062\\-227.6016\\-127\\-162.4122\\-225.6484\\-127\\-163.0151\\-223.6953\\-127\\-163.7198\\-221.7422\\-127\\-164.5058\\-217.8359\\-127\\-165.2007\\-215.8828\\-127\\-165.6884\\-213.9297\\-127\\-166.3506\\-210.0234\\-127\\-167.1408\\-206.1172\\-127\\-167.379\\-204.1641\\-127\\-167.5166\\-202.2109\\-127\\-167.5494\\-198.3047\\-127\\-167.2296\\-194.3984\\-127\\-166.4215\\-190.4922\\-127\\-165.6954\\-186.5859\\-127\\-164.3053\\-182.6797\\-127\\-163.7827\\-180.7266\\-127\\-162.838\\-178.7734\\-127\\-162.1033\\-176.8203\\-127\\-161.2031\\-174.8672\\-127\\-159.9765\\-172.9141\\-127\\-158.4188\\-170.9609\\-127\\-156.9616\\-169.0078\\-127\\-155.7034\\-167.0547\\-127\\-153.9783\\-165.1016\\-127\\-149.4141\\-160.6673\\-127\\-147.4609\\-159.0469\\-127\\-145.5078\\-157.7349\\-127\\-141.6016\\-154.4768\\-127\\-139.6484\\-153.0403\\-127\\-137.6953\\-152.0433\\-127\\-136.9124\\-151.4297\\-127\\-133.7891\\-149.2771\\-127\\-131.8359\\-148.1725\\-127\\-129.8828\\-146.9148\\-127\\-127.9297\\-146.0303\\-127\\-125.9766\\-144.8617\\-127\\-123.6842\\-143.6172\\-127\\-120.1172\\-141.5774\\-127\\-114.2578\\-138.9071\\-127\\-112.3047\\-138.1784\\-127\\-110.3516\\-137.1882\\-127\\-108.3984\\-136.487\\-127\\-106.4453\\-135.5205\\-127\\-102.5391\\-134.2974\\-127\\-100.5859\\-133.5459\\-127\\-98.63281\\-132.9899\\-127\\-96.67969\\-132.5561\\-127\\-92.77344\\-131.4041\\-127\\-88.86719\\-130.5902\\-127\\-84.96094\\-129.638\\-127\\-81.05469\\-129.0287\\-127\\-73.24219\\-128.3652\\-127\\-69.33594\\-127.868\\-127\\-65.42969\\-127.7984\\-127\\-63.47656\\-127.8561\\-127\\-59.57031\\-128.1624\\-127\\-53.71094\\-128.9517\\-127\\-51.75781\\-129.2652\\-127\\-49.80469\\-129.7321\\-127\\-47.85156\\-130.4023\\-127\\-45.89844\\-130.9003\\-127\\-43.94531\\-131.5143\\-127\\-41.99219\\-132.356\\-127\\-40.03906\\-132.9177\\-127\\-38.08594\\-133.6578\\-127\\-34.31332\\-135.8047\\-127\\-32.22656\\-137.1564\\-127\\-30.27344\\-138.6859\\-127\\-28.7866\\-139.7109\\-127\\-26.36719\\-141.7256\\-127\\-24.7521\\-143.6172\\-127\\-22.46094\\-146.1592\\-127\\-21.32265\\-147.5234\\-127\\-19.84197\\-149.4766\\-127\\-18.99858\\-151.4297\\-127\\-17.73999\\-153.3828\\-127\\-16.95963\\-155.3359\\-127\\-15.88611\\-157.2891\\-127\\-15.26731\\-159.2422\\-127\\-14.38395\\-161.1953\\-127\\-13.86604\\-163.1484\\-127\\-13.22508\\-167.0547\\-127\\-12.18776\\-170.9609\\-127\\-11.90396\\-172.9141\\-127\\-11.36467\\-178.7734\\-127\\-10.55519\\-184.6328\\-127\\-10.47165\\-186.5859\\-127\\-10.66142\\-190.4922\\-127\\-10.9489\\-192.4453\\-127\\-11.31283\\-196.3516\\-127\\-11.38762\\-198.3047\\-127\\-11.33737\\-200.2578\\-127\\-10.53049\\-204.1641\\-127\\-10.07269\\-208.0703\\-127\\-9.9769\\-211.9766\\-127\\-10.06611\\-217.8359\\-127\\-10.18025\\-219.7891\\-127\\-10.46036\\-221.7422\\-127\\-10.5678\\-223.6953\\-127\\-11.28406\\-227.6016\\-127\\-11.43506\\-229.5547\\-127\\-12.10814\\-235.4141\\-127\\-13.10333\\-239.3203\\-127\\-14.03443\\-245.1797\\-127\\-14.62573\\-247.1328\\-127\\-15.36494\\-249.0859\\-127\\-15.87685\\-251.0391\\-127\\-16.76551\\-252.9922\\-127\\-17.47241\\-254.9453\\-127\\-18.03663\\-256.8984\\-127\\-19.08102\\-258.8516\\-127\\-19.59044\\-260.8047\\-127\\-20.28189\\-262.7578\\-127\\-21.34563\\-264.7109\\-127\\-22.11442\\-266.6641\\-127\\-23.35394\\-268.6172\\-127\\-26.34277\\-274.4766\\-127\\-27.45689\\-276.4297\\-127\\-28.81485\\-278.3828\\-127\\-29.99161\\-280.3359\\-127\\-32.84439\\-284.2422\\-127\\-34.10993\\-286.1953\\-127\\-35.69955\\-288.1484\\-127\\-40.03906\\-292.8663\\-127\\-41.99219\\-294.6567\\-127\\-45.89844\\-297.1832\\-127\\-47.85156\\-298.6288\\-127\\-51.75781\\-300.6732\\-127\\-53.71094\\-301.265\\-127\\-55.66406\\-302.0773\\-127\\-57.61719\\-302.5838\\-127\\-61.52344\\-303.0864\\-127\\-65.42969\\-303.7961\\-127\\-67.38281\\-304.0774\\-127\\-71.28906\\-304.2617\\-127\\-73.24219\\-304.2617\\-127\\-77.14844\\-304.0774\\-127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "169" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "50" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-301.95\\-127\\59.57031\\-301.396\\-127\\55.66406\\-300.5925\\-127\\53.71094\\-299.8899\\-127\\51.75781\\-298.977\\-127\\49.80469\\-298.165\\-127\\47.85156\\-297.0156\\-127\\45.89844\\-296.0318\\-127\\43.94531\\-294.9172\\-127\\40.03906\\-292.0923\\-127\\37.74372\\-290.1016\\-127\\36.13281\\-288.8106\\-127\\33.41571\\-286.1953\\-127\\30.02743\\-282.2891\\-127\\28.32031\\-280.1641\\-127\\25.70544\\-276.4297\\-127\\24.66196\\-274.4766\\-127\\24.41406\\-274.1963\\-127\\22.46094\\-270.9981\\-127\\22.11122\\-270.5703\\-127\\21.23442\\-268.6172\\-127\\20.08928\\-266.6641\\-127\\18.84694\\-262.7578\\-127\\17.84589\\-260.8047\\-127\\17.32746\\-258.8516\\-127\\16.42718\\-256.8984\\-127\\15.78203\\-254.9453\\-127\\15.32616\\-252.9922\\-127\\14.59585\\-251.0391\\-127\\14.08275\\-249.0859\\-127\\13.21916\\-243.2266\\-127\\12.28448\\-239.3203\\-127\\11.96145\\-237.3672\\-127\\11.28882\\-229.5547\\-127\\10.47165\\-225.6484\\-127\\10.07269\\-221.7422\\-127\\9.775061\\-215.8828\\-127\\9.508359\\-211.9766\\-127\\9.309506\\-210.0234\\-127\\8.736879\\-206.1172\\-127\\8.57736\\-204.1641\\-127\\8.553341\\-200.2578\\-127\\8.766352\\-198.3047\\-127\\9.08801\\-196.3516\\-127\\9.822237\\-190.4922\\-127\\10.00977\\-188.5391\\-127\\10.19597\\-184.6328\\-127\\10.53049\\-180.7266\\-127\\11.3246\\-176.8203\\-127\\11.94719\\-170.9609\\-127\\12.36747\\-169.0078\\-127\\13.02316\\-167.0547\\-127\\13.81549\\-163.1484\\-127\\14.37039\\-161.1953\\-127\\15.37812\\-159.2422\\-127\\16.1532\\-157.2891\\-127\\17.44088\\-155.3359\\-127\\18.47076\\-153.3828\\-127\\19.64321\\-151.4297\\-127\\21.06855\\-149.4766\\-127\\22.46094\\-147.7219\\-127\\26.40857\\-143.6172\\-127\\28.40021\\-141.6641\\-127\\30.89334\\-139.7109\\-127\\34.17969\\-137.2936\\-127\\36.13281\\-136.2045\\-127\\38.08594\\-134.9603\\-127\\41.99219\\-133.0327\\-127\\43.94531\\-132.5267\\-127\\45.89844\\-131.5166\\-127\\49.80469\\-130.3448\\-127\\51.75781\\-129.512\\-127\\53.71094\\-129.0972\\-127\\59.57031\\-128.1959\\-127\\63.47656\\-127.7587\\-127\\67.38281\\-127.6328\\-127\\69.33594\\-127.6218\\-127\\73.24219\\-127.739\\-127\\77.14844\\-127.9999\\-127\\81.05469\\-128.4079\\-127\\88.86719\\-128.9238\\-127\\94.72656\\-129.5371\\-127\\100.5859\\-130.651\\-127\\102.5391\\-130.9219\\-127\\106.4453\\-131.7215\\-127\\108.3984\\-132.2656\\-127\\114.2578\\-133.6054\\-127\\116.2109\\-134.2701\\-127\\120.1172\\-135.32\\-127\\122.0703\\-136.214\\-127\\124.0234\\-136.8977\\-127\\129.8828\\-139.5749\\-127\\133.7891\\-141.6071\\-127\\135.7422\\-142.8398\\-127\\137.6953\\-144.2614\\-127\\139.6484\\-145.3962\\-127\\141.6016\\-146.7164\\-127\\143.5547\\-148.2626\\-127\\147.3114\\-151.4297\\-127\\149.4141\\-153.3739\\-127\\153.3203\\-157.497\\-127\\155.2734\\-159.8467\\-127\\157.6001\\-163.1484\\-127\\158.6784\\-165.1016\\-127\\160.0176\\-167.0547\\-127\\162.0123\\-170.9609\\-127\\162.6252\\-172.9141\\-127\\163.6311\\-174.8672\\-127\\164.1692\\-176.8203\\-127\\165.5884\\-180.7266\\-127\\166.317\\-184.6328\\-127\\167.1007\\-188.5391\\-127\\167.379\\-190.4922\\-127\\167.7029\\-194.3984\\-127\\167.8431\\-198.3047\\-127\\167.8941\\-202.2109\\-127\\167.8711\\-206.1172\\-127\\167.649\\-211.9766\\-127\\167.3242\\-215.8828\\-127\\167.0444\\-217.8359\\-127\\166.3174\\-221.7422\\-127\\165.6954\\-225.6484\\-127\\165.2508\\-227.6016\\-127\\164.5447\\-229.5547\\-127\\163.7426\\-233.4609\\-127\\162.3428\\-237.3672\\-127\\161.9104\\-239.3203\\-127\\161.1328\\-241.229\\-127\\160.2153\\-243.2266\\-127\\159.4187\\-245.1797\\-127\\158.2961\\-247.1328\\-127\\157.4136\\-249.0859\\-127\\156.3293\\-251.0391\\-127\\155.4195\\-252.9922\\-127\\154.237\\-254.9453\\-127\\152.8855\\-256.8984\\-127\\151.6859\\-258.8516\\-127\\149.4141\\-262.1575\\-127\\147.5938\\-264.7109\\-127\\145.5078\\-267.2789\\-127\\142.6785\\-270.5703\\-127\\139.6484\\-273.8813\\-127\\133.7891\\-279.7231\\-127\\131.8359\\-281.4567\\-127\\128.546\\-284.2422\\-127\\125.9766\\-286.2792\\-127\\122.0703\\-288.9882\\-127\\120.1172\\-290.2255\\-127\\118.1641\\-291.3294\\-127\\116.2109\\-292.7654\\-127\\112.3047\\-294.8406\\-127\\110.3516\\-295.5139\\-127\\108.3984\\-296.5577\\-127\\106.4453\\-297.1274\\-127\\104.4922\\-298.0627\\-127\\102.5391\\-298.8088\\-127\\100.5859\\-299.4311\\-127\\98.63281\\-300.254\\-127\\96.67969\\-300.7018\\-127\\92.77344\\-301.3931\\-127\\88.86719\\-302.2685\\-127\\86.91406\\-302.5179\\-127\\83.00781\\-302.7859\\-127\\79.10156\\-302.9264\\-127\\75.19531\\-302.9715\\-127\\73.24219\\-302.9417\\-127\\67.38281\\-302.7358\\-127\\65.42969\\-302.5956\\-127\\63.47656\\-302.3477\\-127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "177" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "51" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-303.811\\-125\\-81.05469\\-303.5014\\-125\\-84.96094\\-303.0133\\-125\\-88.86719\\-302.6283\\-125\\-90.82031\\-302.2952\\-125\\-92.77344\\-301.705\\-125\\-96.67969\\-300.7867\\-125\\-98.63281\\-300.2693\\-125\\-100.5859\\-299.3286\\-125\\-102.5391\\-298.6451\\-125\\-104.4922\\-297.5908\\-125\\-106.4453\\-296.808\\-125\\-108.3984\\-295.7982\\-125\\-110.3516\\-294.9237\\-125\\-114.2578\\-292.7299\\-125\\-116.2109\\-291.2351\\-125\\-118.1641\\-289.8803\\-125\\-120.1172\\-288.8102\\-125\\-122.0703\\-287.2727\\-125\\-125.7264\\-284.2422\\-125\\-127.9297\\-282.5692\\-125\\-129.8828\\-280.8168\\-125\\-136.1867\\-274.4766\\-125\\-139.3158\\-270.5703\\-125\\-141.0011\\-268.6172\\-125\\-142.5101\\-266.6641\\-125\\-143.8535\\-264.7109\\-125\\-145.0576\\-262.7578\\-125\\-145.5078\\-262.2332\\-125\\-147.9394\\-258.8516\\-125\\-148.8783\\-256.8984\\-125\\-150.1038\\-254.9453\\-125\\-150.9564\\-252.9922\\-125\\-152.2157\\-251.0391\\-125\\-153.3203\\-249.0515\\-125\\-154.2685\\-247.1328\\-125\\-156.0584\\-243.2266\\-125\\-156.6406\\-241.2734\\-125\\-157.697\\-239.3203\\-125\\-158.3509\\-237.3672\\-125\\-159.3791\\-235.4141\\-125\\-160.7617\\-231.5078\\-125\\-161.6081\\-229.5547\\-125\\-162.0857\\-227.6016\\-125\\-162.4577\\-225.6484\\-125\\-163.7756\\-221.7422\\-125\\-164.5821\\-217.8359\\-125\\-165.3209\\-215.8828\\-125\\-165.7664\\-213.9297\\-125\\-166.4384\\-210.0234\\-125\\-167.2414\\-206.1172\\-125\\-167.4866\\-204.1641\\-125\\-167.6099\\-202.2109\\-125\\-167.6413\\-198.3047\\-125\\-167.379\\-194.3984\\-125\\-165.7883\\-186.5859\\-125\\-165.2261\\-184.6328\\-125\\-164.3899\\-182.6797\\-125\\-163.8704\\-180.7266\\-125\\-162.9979\\-178.7734\\-125\\-161.3751\\-174.8672\\-125\\-160.0669\\-172.9141\\-125\\-158.5515\\-170.9609\\-125\\-155.8344\\-167.0547\\-125\\-154.1029\\-165.1016\\-125\\-149.4141\\-160.5187\\-125\\-147.4609\\-158.8329\\-125\\-145.5078\\-157.4122\\-125\\-142.9932\\-155.3359\\-125\\-139.6484\\-152.7077\\-125\\-137.6953\\-151.5978\\-125\\-135.7422\\-150.2716\\-125\\-133.7891\\-148.7905\\-125\\-128.3137\\-145.5703\\-125\\-125.9766\\-144.3021\\-125\\-124.0234\\-143.0051\\-125\\-122.0703\\-141.9846\\-125\\-120.1172\\-140.7831\\-125\\-118.1641\\-139.9866\\-125\\-116.2109\\-138.9422\\-125\\-114.2578\\-138.1317\\-125\\-112.3047\\-137.1271\\-125\\-110.3516\\-136.3113\\-125\\-108.3984\\-135.3873\\-125\\-104.4922\\-133.9592\\-125\\-102.5391\\-133.1627\\-125\\-100.5859\\-132.7983\\-125\\-96.67969\\-131.4173\\-125\\-94.72656\\-130.8803\\-125\\-92.77344\\-130.4482\\-125\\-88.86719\\-129.2771\\-125\\-86.91406\\-128.9481\\-125\\-81.05469\\-128.081\\-125\\-79.10156\\-127.7312\\-125\\-77.14844\\-127.4837\\-125\\-71.28906\\-127.1297\\-125\\-69.33594\\-127.0584\\-125\\-63.47656\\-127.0859\\-125\\-59.57031\\-127.2722\\-125\\-57.61719\\-127.4373\\-125\\-55.66406\\-127.7167\\-125\\-53.71094\\-128.3056\\-125\\-49.80469\\-129.0516\\-125\\-47.85156\\-129.4991\\-125\\-45.89844\\-130.2755\\-125\\-41.99219\\-131.5198\\-125\\-40.03906\\-132.4804\\-125\\-38.08594\\-133.1029\\-125\\-36.13281\\-134.2465\\-125\\-34.17969\\-135.2174\\-125\\-30.27344\\-138.2024\\-125\\-28.32031\\-139.5141\\-125\\-25.987\\-141.6641\\-125\\-22.46094\\-145.9068\\-125\\-19.75517\\-149.4766\\-125\\-18.90397\\-151.4297\\-125\\-17.68007\\-153.3828\\-125\\-16.80531\\-155.3359\\-125\\-15.82132\\-157.2891\\-125\\-15.18378\\-159.2422\\-125\\-14.31418\\-161.1953\\-125\\-13.8432\\-163.1484\\-125\\-13.18359\\-167.0547\\-125\\-12.16554\\-170.9609\\-125\\-11.87323\\-172.9141\\-125\\-11.31766\\-178.7734\\-125\\-11.0919\\-180.7266\\-125\\-10.46036\\-184.6328\\-125\\-10.39567\\-186.5859\\-125\\-10.59358\\-190.4922\\-125\\-10.88275\\-192.4453\\-125\\-11.2754\\-196.3516\\-125\\-11.36106\\-198.3047\\-125\\-11.24878\\-200.2578\\-125\\-10.70463\\-202.2109\\-125\\-10.21205\\-206.1172\\-125\\-9.988433\\-210.0234\\-125\\-9.9769\\-213.9297\\-125\\-10.14245\\-219.7891\\-125\\-10.5678\\-223.6953\\-125\\-11.31979\\-227.6016\\-125\\-11.8606\\-233.4609\\-125\\-12.12565\\-235.4141\\-125\\-13.11384\\-239.3203\\-125\\-14.02274\\-245.1797\\-125\\-14.61088\\-247.1328\\-125\\-15.36602\\-249.0859\\-125\\-15.87685\\-251.0391\\-125\\-16.77848\\-252.9922\\-125\\-17.48798\\-254.9453\\-125\\-18.03663\\-256.8984\\-125\\-19.09931\\-258.8516\\-125\\-19.59044\\-260.8047\\-125\\-20.2691\\-262.7578\\-125\\-21.3395\\-264.7109\\-125\\-22.13542\\-266.6641\\-125\\-23.35875\\-268.6172\\-125\\-26.3265\\-274.4766\\-125\\-27.45689\\-276.4297\\-125\\-28.80233\\-278.3828\\-125\\-29.98047\\-280.3359\\-125\\-32.85767\\-284.2422\\-125\\-34.15606\\-286.1953\\-125\\-35.74916\\-288.1484\\-125\\-40.03906\\-292.8003\\-125\\-41.99219\\-294.5897\\-125\\-45.89844\\-297.1244\\-125\\-47.85156\\-298.5522\\-125\\-49.80469\\-299.5307\\-125\\-51.75781\\-300.6188\\-125\\-53.71094\\-301.1925\\-125\\-55.66406\\-301.9805\\-125\\-57.61719\\-302.53\\-125\\-61.52344\\-303.0536\\-125\\-67.38281\\-304.0092\\-125\\-71.28906\\-304.2173\\-125\\-75.19531\\-304.1604\\-125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "170" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "52" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-301.86\\-125\\59.57031\\-301.3288\\-125\\55.66406\\-300.5317\\-125\\53.9363\\-299.8672\\-125\\49.80469\\-298.037\\-125\\43.94531\\-294.8615\\-125\\40.11418\\-292.0547\\-125\\37.82038\\-290.1016\\-125\\36.13281\\-288.7656\\-125\\33.45905\\-286.1953\\-125\\30.05559\\-282.2891\\-125\\28.32031\\-280.1317\\-125\\25.71399\\-276.4297\\-125\\24.6878\\-274.4766\\-125\\24.41406\\-274.1624\\-125\\22.46094\\-270.9658\\-125\\22.13319\\-270.5703\\-125\\21.25324\\-268.6172\\-125\\20.076\\-266.6641\\-125\\18.84909\\-262.7578\\-125\\17.84589\\-260.8047\\-125\\17.3236\\-258.8516\\-125\\16.42718\\-256.8984\\-125\\15.80166\\-254.9453\\-125\\15.34673\\-252.9922\\-125\\14.64844\\-250.9352\\-125\\14.11522\\-249.0859\\-125\\13.27237\\-243.2266\\-125\\12.89208\\-241.2734\\-125\\12.39102\\-239.3203\\-125\\12.03435\\-237.3672\\-125\\11.83745\\-235.4141\\-125\\11.36834\\-229.5547\\-125\\11.1183\\-227.6016\\-125\\10.6756\\-225.6484\\-125\\10.36516\\-223.6953\\-125\\10.17253\\-221.7422\\-125\\9.848933\\-215.8828\\-125\\9.577434\\-211.9766\\-125\\9.359195\\-210.0234\\-125\\8.766352\\-206.1172\\-125\\8.57736\\-204.1641\\-125\\8.507236\\-200.2578\\-125\\8.57736\\-198.3047\\-125\\9.80829\\-190.4922\\-125\\9.961872\\-188.5391\\-125\\10.14245\\-184.6328\\-125\\10.4831\\-180.7266\\-125\\11.31283\\-176.8203\\-125\\11.94018\\-170.9609\\-125\\12.34209\\-169.0078\\-125\\12.99741\\-167.0547\\-125\\13.804\\-163.1484\\-125\\14.35884\\-161.1953\\-125\\15.34999\\-159.2422\\-125\\16.11328\\-157.2891\\-125\\17.4136\\-155.3359\\-125\\18.41412\\-153.3828\\-125\\19.59924\\-151.4297\\-125\\22.46094\\-147.5829\\-125\\26.19485\\-143.6172\\-125\\28.32031\\-141.5202\\-125\\30.27344\\-140.1202\\-125\\34.17969\\-137.1707\\-125\\38.08594\\-134.8047\\-125\\40.03906\\-133.6761\\-125\\41.99219\\-132.8868\\-125\\43.94531\\-132.231\\-125\\45.89844\\-131.2088\\-125\\47.85156\\-130.6096\\-125\\49.80469\\-129.6926\\-125\\51.75781\\-129.1198\\-125\\57.61719\\-127.8786\\-125\\59.57031\\-127.5785\\-125\\63.47656\\-127.2769\\-125\\69.33594\\-127.0991\\-125\\77.14844\\-127.0446\\-125\\86.91406\\-127.2704\\-125\\92.77344\\-127.5845\\-125\\94.72656\\-127.7989\\-125\\96.67969\\-128.2409\\-125\\102.5391\\-129.0583\\-125\\104.4922\\-129.5101\\-125\\106.4453\\-130.1406\\-125\\108.3984\\-130.57\\-125\\110.3516\\-131.1601\\-125\\113.2813\\-131.8984\\-125\\118.1641\\-133.3894\\-125\\120.1172\\-134.2724\\-125\\122.0703\\-134.8968\\-125\\124.0234\\-135.7595\\-125\\127.9297\\-137.684\\-125\\133.7891\\-140.7831\\-125\\135.7422\\-142.0804\\-125\\137.6953\\-143.2765\\-125\\139.6484\\-144.7514\\-125\\140.9538\\-145.5703\\-125\\143.5547\\-147.413\\-125\\145.5078\\-148.9883\\-125\\148.2721\\-151.4297\\-125\\151.3672\\-154.5472\\-125\\153.8675\\-157.2891\\-125\\155.4118\\-159.2422\\-125\\156.6102\\-161.1953\\-125\\157.2266\\-161.9713\\-125\\159.1876\\-165.1016\\-125\\161.463\\-169.0078\\-125\\162.8937\\-172.9141\\-125\\163.7866\\-174.8672\\-125\\164.3192\\-176.8203\\-125\\165.0618\\-178.7734\\-125\\165.6813\\-180.7266\\-125\\167.1538\\-188.5391\\-125\\167.4241\\-190.4922\\-125\\167.7145\\-194.3984\\-125\\167.8545\\-198.3047\\-125\\167.8994\\-202.2109\\-125\\167.8251\\-208.0703\\-125\\167.6607\\-211.9766\\-125\\167.3242\\-215.8828\\-125\\167.0444\\-217.8359\\-125\\166.3356\\-221.7422\\-125\\165.7023\\-225.6484\\-125\\165.2748\\-227.6016\\-125\\164.5538\\-229.5547\\-125\\163.7464\\-233.4609\\-125\\162.3428\\-237.3672\\-125\\161.9057\\-239.3203\\-125\\161.1328\\-241.229\\-125\\160.2102\\-243.2266\\-125\\159.4187\\-245.1797\\-125\\158.2858\\-247.1328\\-125\\157.401\\-249.0859\\-125\\156.3171\\-251.0391\\-125\\155.375\\-252.9922\\-125\\154.2065\\-254.9453\\-125\\152.8288\\-256.8984\\-125\\151.6373\\-258.8516\\-125\\149.4141\\-262.0679\\-125\\147.4855\\-264.7109\\-125\\145.5078\\-267.1854\\-125\\142.6116\\-270.5703\\-125\\139.6484\\-273.8146\\-125\\133.7891\\-279.6604\\-125\\131.8359\\-281.4305\\-125\\128.514\\-284.2422\\-125\\125.9766\\-286.2344\\-125\\122.0703\\-288.9757\\-125\\120.1172\\-290.1978\\-125\\118.1641\\-291.318\\-125\\116.2109\\-292.7581\\-125\\112.3047\\-294.8286\\-125\\110.3516\\-295.4897\\-125\\108.3984\\-296.5457\\-125\\106.4453\\-297.1057\\-125\\104.4922\\-298.0361\\-125\\102.5391\\-298.793\\-125\\100.5859\\-299.4094\\-125\\98.63281\\-300.2334\\-125\\96.67969\\-300.6905\\-125\\92.77344\\-301.3691\\-125\\88.86719\\-302.2369\\-125\\86.91406\\-302.5057\\-125\\83.00781\\-302.7694\\-125\\79.10156\\-302.9036\\-125\\75.19531\\-302.9434\\-125\\73.24219\\-302.9143\\-125\\67.38281\\-302.7127\\-125\\65.42969\\-302.5572\\-125\\63.47656\\-302.292\\-125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "184" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "53" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.9221\\-123\\-81.05469\\-303.3867\\-123\\-88.86719\\-302.5765\\-123\\-90.82031\\-302.2123\\-123\\-92.77344\\-301.6058\\-123\\-96.67969\\-300.7295\\-123\\-98.63281\\-300.1905\\-123\\-100.5859\\-299.2675\\-123\\-102.5391\\-298.5922\\-123\\-104.4922\\-297.5221\\-123\\-106.4453\\-296.7802\\-123\\-108.3984\\-295.7549\\-123\\-110.3516\\-294.8994\\-123\\-114.2578\\-292.7039\\-123\\-116.2109\\-291.2102\\-123\\-118.1641\\-289.8387\\-123\\-120.1172\\-288.7887\\-123\\-122.0703\\-287.2475\\-123\\-125.9766\\-283.9621\\-123\\-127.9297\\-282.5408\\-123\\-129.8828\\-280.802\\-123\\-136.1607\\-274.4766\\-123\\-137.6703\\-272.5234\\-123\\-140.9658\\-268.6172\\-123\\-142.5044\\-266.6641\\-123\\-143.8264\\-264.7109\\-123\\-145.047\\-262.7578\\-123\\-145.5078\\-262.2215\\-123\\-147.9162\\-258.8516\\-123\\-148.8647\\-256.8984\\-123\\-150.0835\\-254.9453\\-123\\-150.9458\\-252.9922\\-123\\-152.2035\\-251.0391\\-123\\-153.3203\\-249.0292\\-123\\-154.2685\\-247.1328\\-123\\-156.0658\\-243.2266\\-123\\-156.6585\\-241.2734\\-123\\-157.7236\\-239.3203\\-123\\-158.3739\\-237.3672\\-123\\-159.4154\\-235.4141\\-123\\-160.7963\\-231.5078\\-123\\-161.6661\\-229.5547\\-123\\-162.4912\\-225.6484\\-123\\-163.2287\\-223.6953\\-123\\-163.8277\\-221.7422\\-123\\-164.2027\\-219.7891\\-123\\-164.6786\\-217.8359\\-123\\-165.3959\\-215.8828\\-123\\-165.8253\\-213.9297\\-123\\-166.5286\\-210.0234\\-123\\-167.3456\\-206.1172\\-123\\-167.5614\\-204.1641\\-123\\-167.7447\\-200.2578\\-123\\-167.6452\\-196.3516\\-123\\-167.4988\\-194.3984\\-123\\-167.2191\\-192.4453\\-123\\-166.7395\\-190.4922\\-123\\-165.8929\\-186.5859\\-123\\-165.4084\\-184.6328\\-123\\-164.5203\\-182.6797\\-123\\-163.978\\-180.7266\\-123\\-163.2146\\-178.7734\\-123\\-162.2886\\-176.8203\\-123\\-161.5553\\-174.8672\\-123\\-160.2273\\-172.9141\\-123\\-158.7796\\-170.9609\\-123\\-157.5346\\-169.0078\\-123\\-156.0172\\-167.0547\\-123\\-154.3588\\-165.1016\\-123\\-151.3672\\-162.067\\-123\\-149.4141\\-160.1828\\-123\\-143.5547\\-155.1057\\-123\\-141.3212\\-153.3828\\-123\\-135.7422\\-149.3848\\-123\\-133.7891\\-148.1953\\-123\\-131.8359\\-146.735\\-123\\-129.8828\\-145.5794\\-123\\-125.9766\\-143.0108\\-123\\-124.0234\\-141.9296\\-123\\-122.0703\\-140.6635\\-123\\-120.1172\\-139.5206\\-123\\-114.2578\\-136.4469\\-123\\-110.3516\\-134.5707\\-123\\-108.3984\\-133.8815\\-123\\-106.4453\\-132.9434\\-123\\-104.4922\\-132.2872\\-123\\-102.5391\\-131.4253\\-123\\-100.5859\\-131.0314\\-123\\-98.63281\\-130.1028\\-123\\-96.67969\\-129.6025\\-123\\-94.72656\\-128.8527\\-123\\-92.77344\\-128.4361\\-123\\-90.82031\\-128.1191\\-123\\-88.86719\\-127.4357\\-123\\-86.91406\\-127.0945\\-123\\-83.00781\\-126.6748\\-123\\-81.05469\\-126.5318\\-123\\-79.10156\\-126.221\\-123\\-77.14844\\-125.7493\\-123\\-73.24219\\-125.5813\\-123\\-69.33594\\-125.4824\\-123\\-63.47656\\-125.5906\\-123\\-61.52344\\-125.7615\\-123\\-59.57031\\-126.1042\\-123\\-55.66406\\-126.5186\\-123\\-53.71094\\-126.8893\\-123\\-51.75781\\-127.3608\\-123\\-49.77899\\-127.9922\\-123\\-45.89844\\-129.1174\\-123\\-43.94531\\-129.8485\\-123\\-40.03906\\-131.4861\\-123\\-38.08594\\-132.5186\\-123\\-36.13281\\-133.3417\\-123\\-32.43371\\-135.8047\\-123\\-30.27344\\-137.3933\\-123\\-28.32031\\-138.9939\\-123\\-26.36719\\-140.854\\-123\\-23.97075\\-143.6172\\-123\\-22.3736\\-145.5703\\-123\\-19.65256\\-149.4766\\-123\\-18.77254\\-151.4297\\-123\\-17.61014\\-153.3828\\-123\\-15.7638\\-157.2891\\-123\\-15.10336\\-159.2422\\-123\\-14.23356\\-161.1953\\-123\\-13.79251\\-163.1484\\-123\\-13.10614\\-167.0547\\-123\\-12.53634\\-169.0078\\-123\\-12.09578\\-170.9609\\-123\\-11.62109\\-174.8672\\-123\\-11.08099\\-180.7266\\-123\\-10.69\\-182.6797\\-123\\-10.41667\\-184.6328\\-123\\-10.32624\\-186.5859\\-123\\-10.4947\\-190.4922\\-123\\-11.00852\\-194.3984\\-123\\-11.20575\\-196.3516\\-123\\-11.26342\\-198.3047\\-123\\-11.03584\\-200.2578\\-123\\-10.51839\\-202.2109\\-123\\-10.13513\\-206.1172\\-123\\-10.03418\\-208.0703\\-123\\-9.932242\\-213.9297\\-123\\-10.05959\\-219.7891\\-123\\-10.22023\\-221.7422\\-123\\-10.51839\\-223.6953\\-123\\-11.33055\\-227.6016\\-123\\-11.84353\\-233.4609\\-123\\-12.08726\\-235.4141\\-123\\-13.06831\\-239.3203\\-123\\-14.00321\\-245.1797\\-123\\-14.52637\\-247.1328\\-123\\-15.33746\\-249.0859\\-123\\-15.85629\\-251.0391\\-123\\-17.46795\\-254.9453\\-123\\-18.0161\\-256.8984\\-123\\-19.09022\\-258.8516\\-123\\-19.56676\\-260.8047\\-123\\-20.24213\\-262.7578\\-123\\-21.32704\\-264.7109\\-123\\-22.10412\\-266.6641\\-123\\-23.3435\\-268.6172\\-123\\-25.36224\\-272.5234\\-123\\-26.29515\\-274.4766\\-123\\-27.44498\\-276.4297\\-123\\-28.78981\\-278.3828\\-123\\-29.98047\\-280.3359\\-123\\-32.86661\\-284.2422\\-123\\-34.17969\\-286.1663\\-123\\-35.78856\\-288.1484\\-123\\-38.08594\\-290.5975\\-123\\-39.36349\\-292.0547\\-123\\-41.99219\\-294.5099\\-123\\-43.94531\\-295.7092\\-123\\-47.85156\\-298.4648\\-123\\-49.80469\\-299.4102\\-123\\-51.75781\\-300.5284\\-123\\-53.71094\\-301.1174\\-123\\-55.66406\\-301.86\\-123\\-57.61719\\-302.4693\\-123\\-63.47656\\-303.2789\\-123\\-67.38281\\-303.9221\\-123\\-69.33594\\-304.0774\\-123\\-73.24219\\-304.1404\\-123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "169" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "54" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-302.234\\-123\\59.57031\\-301.2742\\-123\\55.66406\\-300.4731\\-123\\51.75781\\-298.8378\\-123\\47.85156\\-296.9048\\-123\\43.94531\\-294.8102\\-123\\40.19368\\-292.0547\\-123\\37.8854\\-290.1016\\-123\\36.13281\\-288.7289\\-123\\33.49474\\-286.1953\\-123\\30.09796\\-282.2891\\-123\\28.32031\\-280.116\\-123\\25.71829\\-276.4297\\-123\\24.70042\\-274.4766\\-123\\24.41406\\-274.1454\\-123\\22.46094\\-270.9365\\-123\\22.15576\\-270.5703\\-123\\21.26034\\-268.6172\\-123\\20.08928\\-266.6641\\-123\\18.82234\\-262.7578\\-123\\17.83265\\-260.8047\\-123\\17.32746\\-258.8516\\-123\\16.43997\\-256.8984\\-123\\15.82129\\-254.9453\\-123\\15.37047\\-252.9922\\-123\\14.15712\\-249.0859\\-123\\13.83653\\-247.1328\\-123\\13.31505\\-243.2266\\-123\\12.99741\\-241.2734\\-123\\12.1205\\-237.3672\\-123\\11.8953\\-235.4141\\-123\\11.43185\\-229.5547\\-123\\11.2274\\-227.6016\\-123\\10.53049\\-223.6953\\-123\\10.28022\\-221.7422\\-123\\9.924492\\-215.8828\\-123\\9.636739\\-211.9766\\-123\\9.409015\\-210.0234\\-123\\8.766352\\-206.1172\\-123\\8.553341\\-204.1641\\-123\\8.463542\\-200.2578\\-123\\8.4851\\-198.3047\\-123\\8.653626\\-196.3516\\-123\\9.449047\\-192.4453\\-123\\9.74169\\-190.4922\\-123\\10.07934\\-184.6328\\-123\\10.44922\\-180.7266\\-123\\11.26342\\-176.8203\\-123\\11.94018\\-170.9609\\-123\\12.31971\\-169.0078\\-123\\12.9996\\-167.0547\\-123\\13.79251\\-163.1484\\-123\\14.32292\\-161.1953\\-123\\15.32018\\-159.2422\\-123\\16.08351\\-157.2891\\-123\\17.3731\\-155.3359\\-123\\18.33531\\-153.3828\\-123\\20.50781\\-150.0589\\-123\\22.37894\\-147.5234\\-123\\26.00861\\-143.6172\\-123\\28.32031\\-141.3241\\-123\\32.22656\\-138.5115\\-123\\33.13961\\-137.7578\\-123\\36.13281\\-135.6937\\-123\\38.08594\\-134.5871\\-123\\40.03906\\-133.3633\\-123\\41.99219\\-132.6662\\-123\\43.94531\\-131.6048\\-123\\45.89844\\-130.8191\\-123\\47.85156\\-129.8461\\-123\\49.80469\\-129.0843\\-123\\51.75781\\-128.5994\\-123\\55.66406\\-127.5039\\-123\\61.52344\\-126.7887\\-123\\65.42969\\-126.4653\\-123\\71.28906\\-125.6813\\-123\\75.19531\\-125.3601\\-123\\79.10156\\-125.2142\\-123\\86.91406\\-125.1611\\-123\\92.77344\\-125.3092\\-123\\96.67969\\-125.5725\\-123\\98.63281\\-125.856\\-123\\100.5859\\-126.538\\-123\\104.4922\\-126.9512\\-123\\106.4453\\-127.414\\-123\\108.3984\\-128.1201\\-123\\110.3516\\-128.6025\\-123\\112.3047\\-129.3134\\-123\\114.2578\\-129.7861\\-123\\116.2109\\-130.6135\\-123\\118.1641\\-131.3246\\-123\\120.1172\\-132.4442\\-123\\122.0703\\-133.0395\\-123\\125.9766\\-135.1563\\-123\\129.8828\\-137.3625\\-123\\135.7422\\-140.8813\\-123\\141.6016\\-145.0397\\-123\\143.5547\\-146.5469\\-123\\147.086\\-149.4766\\-123\\149.1765\\-151.4297\\-123\\151.3672\\-153.668\\-123\\153.3203\\-155.8458\\-123\\155.9818\\-159.2422\\-123\\158.3582\\-163.1484\\-123\\159.7152\\-165.1016\\-123\\160.6315\\-167.0547\\-123\\161.7606\\-169.0078\\-123\\162.3614\\-170.9609\\-123\\163.2561\\-172.9141\\-123\\163.9358\\-174.8672\\-123\\164.4819\\-176.8203\\-123\\165.2748\\-178.7734\\-123\\165.7907\\-180.7266\\-123\\167.2296\\-188.5391\\-123\\167.4587\\-190.4922\\-123\\167.7376\\-194.3984\\-123\\167.8711\\-198.3047\\-123\\167.8994\\-204.1641\\-123\\167.7677\\-210.0234\\-123\\167.5494\\-213.9297\\-123\\167.073\\-217.8359\\-123\\166.6778\\-219.7891\\-123\\165.7263\\-225.6484\\-123\\165.2865\\-227.6016\\-123\\164.5726\\-229.5547\\-123\\163.7538\\-233.4609\\-123\\162.3428\\-237.3672\\-123\\161.8984\\-239.3203\\-123\\161.1328\\-241.2582\\-123\\160.2051\\-243.2266\\-123\\159.4066\\-245.1797\\-123\\158.2755\\-247.1328\\-123\\157.3752\\-249.0859\\-123\\156.2868\\-251.0391\\-123\\155.3449\\-252.9922\\-123\\154.1837\\-254.9453\\-123\\152.7894\\-256.8984\\-123\\151.3672\\-259.1148\\-123\\149.4141\\-262.0032\\-123\\145.8543\\-266.6641\\-123\\142.5307\\-270.5703\\-123\\140.7636\\-272.5234\\-123\\137.6953\\-275.6955\\-123\\133.7891\\-279.5953\\-123\\131.8359\\-281.3971\\-123\\128.466\\-284.2422\\-123\\125.9766\\-286.2032\\-123\\122.0703\\-288.9685\\-123\\118.1641\\-291.2996\\-123\\116.2109\\-292.7389\\-123\\114.2578\\-293.7121\\-123\\112.3047\\-294.8096\\-123\\110.3516\\-295.4659\\-123\\108.3984\\-296.5198\\-123\\106.4453\\-297.084\\-123\\104.4922\\-297.9948\\-123\\102.5391\\-298.7724\\-123\\100.5859\\-299.3789\\-123\\98.63281\\-300.2122\\-123\\96.67969\\-300.661\\-123\\92.77344\\-301.3588\\-123\\88.86719\\-302.2012\\-123\\86.91406\\-302.4775\\-123\\84.96094\\-302.6466\\-123\\81.05469\\-302.8185\\-123\\77.14844\\-302.9156\\-123\\73.24219\\-302.8823\\-123\\67.38281\\-302.684\\-123\\65.42969\\-302.5179\\-123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "179" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "55" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-303.7961\\-121\\-81.05469\\-303.3039\\-121\\-88.86719\\-302.5179\\-121\\-90.82031\\-302.1147\\-121\\-92.77344\\-301.4901\\-121\\-96.67969\\-300.6657\\-121\\-98.63281\\-300.0957\\-121\\-100.5859\\-299.1961\\-121\\-102.5391\\-298.5265\\-121\\-104.4922\\-297.4579\\-121\\-106.4453\\-296.7499\\-121\\-108.3984\\-295.6872\\-121\\-110.3516\\-294.8806\\-121\\-114.2578\\-292.6736\\-121\\-118.1641\\-289.7982\\-121\\-120.1172\\-288.758\\-121\\-122.0703\\-287.2223\\-121\\-125.9766\\-283.9093\\-121\\-127.9297\\-282.5138\\-121\\-129.8828\\-280.7791\\-121\\-136.1343\\-274.4766\\-121\\-137.6374\\-272.5234\\-121\\-140.944\\-268.6172\\-121\\-142.4854\\-266.6641\\-121\\-145.0229\\-262.7578\\-121\\-145.5078\\-262.1941\\-121\\-147.8957\\-258.8516\\-121\\-148.8551\\-256.8984\\-121\\-150.0672\\-254.9453\\-121\\-150.9221\\-252.9922\\-121\\-152.1801\\-251.0391\\-121\\-153.3203\\-249.0055\\-121\\-154.2512\\-247.1328\\-121\\-155.0993\\-245.1797\\-121\\-156.0584\\-243.2266\\-121\\-156.6495\\-241.2734\\-121\\-157.7323\\-239.3203\\-121\\-158.3802\\-237.3672\\-121\\-159.4388\\-235.4141\\-121\\-160.8184\\-231.5078\\-121\\-161.6972\\-229.5547\\-121\\-162.5216\\-225.6484\\-121\\-163.3212\\-223.6953\\-121\\-163.8682\\-221.7422\\-121\\-164.2589\\-219.7891\\-121\\-164.7727\\-217.8359\\-121\\-165.483\\-215.8828\\-121\\-166.2077\\-211.9766\\-121\\-167.1007\\-208.0703\\-121\\-167.4338\\-206.1172\\-121\\-167.6413\\-204.1641\\-121\\-167.8203\\-200.2578\\-121\\-167.8136\\-198.3047\\-121\\-167.6174\\-194.3984\\-121\\-167.3943\\-192.4453\\-121\\-166.4536\\-188.5391\\-121\\-165.5733\\-184.6328\\-121\\-164.7454\\-182.6797\\-121\\-163.4538\\-178.7734\\-121\\-162.4201\\-176.8203\\-121\\-161.7472\\-174.8672\\-121\\-159.1717\\-170.9609\\-121\\-157.2266\\-168.1651\\-121\\-155.2734\\-165.7098\\-121\\-152.9222\\-163.1484\\-121\\-149.4141\\-159.6146\\-121\\-146.9275\\-157.2891\\-121\\-144.6697\\-155.3359\\-121\\-143.5547\\-154.2297\\-121\\-141.6016\\-152.5535\\-121\\-140.1265\\-151.4297\\-121\\-137.6953\\-149.7544\\-121\\-135.7422\\-148.1718\\-121\\-133.7891\\-146.9422\\-121\\-131.8359\\-145.392\\-121\\-125.9766\\-141.2979\\-121\\-124.0234\\-140.1594\\-121\\-122.0703\\-138.7649\\-121\\-120.1367\\-137.7578\\-121\\-118.1641\\-136.3642\\-121\\-116.2109\\-135.193\\-121\\-114.2578\\-134.1382\\-121\\-109.6021\\-131.8984\\-121\\-108.3984\\-131.2349\\-121\\-106.4453\\-130.4953\\-121\\-104.4922\\-129.4402\\-121\\-102.5391\\-128.8511\\-121\\-100.5859\\-127.9521\\-121\\-98.63281\\-127.4468\\-121\\-94.72656\\-126.3097\\-121\\-92.77344\\-125.937\\-121\\-88.86719\\-124.9448\\-121\\-86.91406\\-124.6651\\-121\\-83.00781\\-124.2603\\-121\\-81.05469\\-123.6431\\-121\\-77.14844\\-123.3372\\-121\\-69.33594\\-123.0864\\-121\\-65.42969\\-123.2314\\-121\\-61.52344\\-123.5172\\-121\\-59.57031\\-124.1627\\-121\\-55.66406\\-124.4657\\-121\\-53.71094\\-124.8184\\-121\\-51.75781\\-125.4242\\-121\\-49.80469\\-126.212\\-121\\-47.85156\\-126.7433\\-121\\-43.94531\\-128.3315\\-121\\-41.99219\\-129.2863\\-121\\-37.1875\\-131.8984\\-121\\-34.17969\\-133.6612\\-121\\-32.22656\\-135.0162\\-121\\-28.9847\\-137.7578\\-121\\-26.91951\\-139.7109\\-121\\-24.41406\\-142.573\\-121\\-21.97944\\-145.5703\\-121\\-20.50781\\-147.7832\\-121\\-19.53125\\-149.4766\\-121\\-16.60156\\-155.1427\\-121\\-15.66984\\-157.2891\\-121\\-14.98047\\-159.2422\\-121\\-14.15094\\-161.1953\\-121\\-12.98545\\-167.0547\\-121\\-12.39102\\-169.0078\\-121\\-11.99944\\-170.9609\\-121\\-11.56811\\-174.8672\\-121\\-11.04526\\-180.7266\\-121\\-10.4061\\-184.6328\\-121\\-10.2892\\-186.5859\\-121\\-10.2983\\-188.5391\\-121\\-10.43822\\-190.4922\\-121\\-10.9489\\-194.3984\\-121\\-11.10026\\-196.3516\\-121\\-11.13669\\-198.3047\\-121\\-10.3752\\-202.2109\\-121\\-10.04963\\-206.1172\\-121\\-9.867447\\-213.9297\\-121\\-9.919085\\-217.8359\\-121\\-10.09971\\-221.7422\\-121\\-10.4061\\-223.6953\\-121\\-11.19536\\-227.6016\\-121\\-12.04227\\-235.4141\\-121\\-12.44213\\-237.3672\\-121\\-12.99526\\-239.3203\\-121\\-13.36513\\-241.2734\\-121\\-13.97996\\-245.1797\\-121\\-14.46144\\-247.1328\\-121\\-15.28653\\-249.0859\\-121\\-15.82132\\-251.0391\\-121\\-17.44792\\-254.9453\\-121\\-17.99916\\-256.8984\\-121\\-19.03654\\-258.8516\\-121\\-19.54309\\-260.8047\\-121\\-20.21767\\-262.7578\\-121\\-21.3143\\-264.7109\\-121\\-22.06421\\-266.6641\\-121\\-23.31674\\-268.6172\\-121\\-24.2513\\-270.5703\\-121\\-25.35088\\-272.5234\\-121\\-26.26397\\-274.4766\\-121\\-27.42661\\-276.4297\\-121\\-28.77055\\-278.3828\\-121\\-29.96947\\-280.3359\\-121\\-32.85767\\-284.2422\\-121\\-34.17969\\-286.1289\\-121\\-35.81437\\-288.1484\\-121\\-38.08594\\-290.5552\\-121\\-39.41761\\-292.0547\\-121\\-41.99219\\-294.4364\\-121\\-43.94531\\-295.6039\\-121\\-44.37641\\-295.9609\\-121\\-47.85156\\-298.3698\\-121\\-49.80469\\-299.3015\\-121\\-51.75781\\-300.442\\-121\\-53.71094\\-301.05\\-121\\-57.61719\\-302.4101\\-121\\-59.57031\\-302.7358\\-121\\-63.47656\\-303.2128\\-121\\-67.38281\\-303.811\\-121\\-69.33594\\-303.9851\\-121\\-73.24219\\-304.0553\\-121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "56" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-302.1646\\-121\\61.52344\\-301.6475\\-121\\55.66406\\-300.421\\-121\\51.75781\\-298.7898\\-121\\47.85156\\-296.8611\\-121\\45.89844\\-295.7397\\-121\\43.94531\\-294.7729\\-121\\40.25519\\-292.0547\\-121\\37.95155\\-290.1016\\-121\\36.13281\\-288.7055\\-121\\33.51727\\-286.1953\\-121\\30.11322\\-282.2891\\-121\\28.32031\\-280.0853\\-121\\25.72692\\-276.4297\\-121\\24.70042\\-274.4766\\-121\\24.41406\\-274.1454\\-121\\22.46094\\-270.9335\\-121\\22.15787\\-270.5703\\-121\\21.26034\\-268.6172\\-121\\20.0998\\-266.6641\\-121\\18.80976\\-262.7578\\-121\\17.82614\\-260.8047\\-121\\17.33398\\-258.8516\\-121\\16.45296\\-256.8984\\-121\\15.83708\\-254.9453\\-121\\15.38732\\-252.9922\\-121\\14.19724\\-249.0859\\-121\\13.8638\\-247.1328\\-121\\13.06831\\-241.2734\\-121\\12.20061\\-237.3672\\-121\\11.94719\\-235.4141\\-121\\11.32929\\-227.6016\\-121\\11.06994\\-225.6484\\-121\\10.4061\\-221.7422\\-121\\10.09285\\-217.8359\\-121\\9.988433\\-215.8828\\-121\\9.678171\\-211.9766\\-121\\9.459779\\-210.0234\\-121\\8.736879\\-206.1172\\-121\\8.529975\\-204.1641\\-121\\8.412035\\-200.2578\\-121\\8.541577\\-196.3516\\-121\\9.359195\\-192.4453\\-121\\9.638034\\-190.4922\\-121\\10.17253\\-182.6797\\-121\\10.36516\\-180.7266\\-121\\11.19338\\-176.8203\\-121\\11.49462\\-174.8672\\-121\\11.92197\\-170.9609\\-121\\12.29519\\-169.0078\\-121\\12.98545\\-167.0547\\-121\\13.78102\\-163.1484\\-121\\14.28796\\-161.1953\\-121\\15.29002\\-159.2422\\-121\\16.03771\\-157.2891\\-121\\17.33124\\-155.3359\\-121\\18.24951\\-153.3828\\-121\\20.50781\\-149.9464\\-121\\22.24314\\-147.5234\\-121\\24.41406\\-145.2529\\-121\\25.86806\\-143.6172\\-121\\28.32031\\-141.1688\\-121\\30.27344\\-139.6377\\-121\\32.22656\\-138.3424\\-121\\32.88535\\-137.7578\\-121\\36.13281\\-135.2784\\-121\\40.03906\\-133.0315\\-121\\41.99219\\-132.0796\\-121\\43.94531\\-130.9768\\-121\\47.85156\\-129.0251\\-121\\49.80469\\-128.3898\\-121\\51.75781\\-127.5822\\-121\\55.66406\\-126.7396\\-121\\57.61719\\-126.4063\\-121\\59.57031\\-125.9517\\-121\\61.52344\\-125.6177\\-121\\63.47656\\-125.1046\\-121\\69.33594\\-124.1765\\-121\\71.28906\\-123.5829\\-121\\73.24219\\-123.3369\\-121\\77.14844\\-122.9483\\-121\\83.00781\\-122.6428\\-121\\86.91406\\-122.6046\\-121\\92.77344\\-122.7591\\-121\\98.63281\\-123.1308\\-121\\100.5859\\-123.3899\\-121\\102.5391\\-123.7528\\-121\\104.4922\\-124.3533\\-121\\106.4453\\-124.6894\\-121\\110.3516\\-125.6064\\-121\\114.2578\\-127.099\\-121\\116.2109\\-127.6959\\-121\\118.1641\\-128.67\\-121\\120.1172\\-129.4422\\-121\\122.0703\\-130.6353\\-121\\124.0234\\-131.6514\\-121\\125.9766\\-132.9545\\-121\\127.9297\\-134.1291\\-121\\130.2472\\-135.8047\\-121\\131.8359\\-136.7813\\-121\\133.7891\\-138.2092\\-121\\135.7422\\-139.3668\\-121\\137.6953\\-140.8421\\-121\\139.6484\\-142.4438\\-121\\141.3574\\-143.6172\\-121\\143.5547\\-145.3197\\-121\\147.4609\\-148.6514\\-121\\152.1144\\-153.3828\\-121\\153.8652\\-155.3359\\-121\\155.282\\-157.2891\\-121\\156.4632\\-159.2422\\-121\\157.8186\\-161.1953\\-121\\158.8754\\-163.1484\\-121\\160.0861\\-165.1016\\-121\\161.1328\\-167.1198\\-121\\162.0069\\-169.0078\\-121\\162.5909\\-170.9609\\-121\\163.5362\\-172.9141\\-121\\164.6737\\-176.8203\\-121\\165.455\\-178.7734\\-121\\165.8998\\-180.7266\\-121\\166.5901\\-184.6328\\-121\\166.9998\\-186.5859\\-121\\167.511\\-190.4922\\-121\\167.653\\-192.4453\\-121\\167.8826\\-198.3047\\-121\\167.911\\-204.1641\\-121\\167.7746\\-210.0234\\-121\\167.5579\\-213.9297\\-121\\167.379\\-215.8828\\-121\\167.1007\\-217.8359\\-121\\166.6891\\-219.7891\\-121\\165.746\\-225.6484\\-121\\165.2982\\-227.6016\\-121\\164.5726\\-229.5547\\-121\\163.7538\\-233.4609\\-121\\162.3428\\-237.3672\\-121\\161.9104\\-239.3203\\-121\\161.1407\\-241.2734\\-121\\160.2108\\-243.2266\\-121\\159.4204\\-245.1797\\-121\\158.2548\\-247.1328\\-121\\157.362\\-249.0859\\-121\\156.2746\\-251.0391\\-121\\155.3295\\-252.9922\\-121\\154.1718\\-254.9453\\-121\\152.7706\\-256.8984\\-121\\151.3672\\-259.0676\\-121\\149.4141\\-261.9396\\-121\\145.7784\\-266.6641\\-121\\142.4644\\-270.5703\\-121\\140.6729\\-272.5234\\-121\\137.6953\\-275.63\\-121\\133.7891\\-279.5352\\-121\\131.8359\\-281.3518\\-121\\128.422\\-284.2422\\-121\\125.9481\\-286.1953\\-121\\122.0703\\-288.9612\\-121\\118.1641\\-291.2882\\-121\\116.2109\\-292.7235\\-121\\114.2578\\-293.6891\\-121\\112.3047\\-294.7903\\-121\\110.3516\\-295.4361\\-121\\108.3984\\-296.4987\\-121\\106.4453\\-297.0778\\-121\\104.4922\\-297.9662\\-121\\102.5391\\-298.7519\\-121\\100.5859\\-299.3554\\-121\\98.63281\\-300.1794\\-121\\96.67969\\-300.6518\\-121\\92.77344\\-301.3386\\-121\\88.86719\\-302.1985\\-121\\84.96094\\-302.6214\\-121\\81.05469\\-302.8023\\-121\\77.14844\\-302.8823\\-121\\73.24219\\-302.8609\\-121\\67.38281\\-302.6533\\-121\\65.42969\\-302.4775\\-121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "180" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "57" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-303.8542\\-119\\-81.05469\\-303.2162\\-119\\-86.91406\\-302.6762\\-119\\-88.86719\\-302.4401\\-119\\-90.82031\\-301.9931\\-119\\-92.77344\\-301.396\\-119\\-96.67969\\-300.5967\\-119\\-98.63281\\-299.9773\\-119\\-100.5859\\-299.1123\\-119\\-102.5391\\-298.4616\\-119\\-104.4922\\-297.3797\\-119\\-106.4453\\-296.7004\\-119\\-108.3984\\-295.5974\\-119\\-110.3516\\-294.8492\\-119\\-112.3047\\-293.6801\\-119\\-114.2578\\-292.6315\\-119\\-118.1641\\-289.7736\\-119\\-120.1172\\-288.7357\\-119\\-122.0703\\-287.1967\\-119\\-125.9766\\-283.8588\\-119\\-127.9297\\-282.4558\\-119\\-129.8828\\-280.7523\\-119\\-132.203\\-278.3828\\-119\\-134.2206\\-276.4297\\-119\\-136.0952\\-274.4766\\-119\\-139.2107\\-270.5703\\-119\\-140.918\\-268.6172\\-119\\-142.4662\\-266.6641\\-119\\-144.9992\\-262.7578\\-119\\-145.5078\\-262.1624\\-119\\-147.8718\\-258.8516\\-119\\-148.8281\\-256.8984\\-119\\-150.0588\\-254.9453\\-119\\-150.9018\\-252.9922\\-119\\-152.1627\\-251.0391\\-119\\-154.263\\-247.1328\\-119\\-155.0722\\-245.1797\\-119\\-156.046\\-243.2266\\-119\\-156.6368\\-241.2734\\-119\\-157.7408\\-239.3203\\-119\\-158.3739\\-237.3672\\-119\\-159.4502\\-235.4141\\-119\\-160.8508\\-231.5078\\-119\\-161.7099\\-229.5547\\-119\\-162.5527\\-225.6484\\-119\\-163.3838\\-223.6953\\-119\\-163.9075\\-221.7422\\-119\\-164.3066\\-219.7891\\-119\\-165.561\\-215.8828\\-119\\-166.2735\\-211.9766\\-119\\-167.2054\\-208.0703\\-119\\-167.5078\\-206.1172\\-119\\-167.7072\\-204.1641\\-119\\-167.8941\\-200.2578\\-119\\-167.8994\\-198.3047\\-119\\-167.7421\\-194.3984\\-119\\-167.5354\\-192.4453\\-119\\-167.2207\\-190.4922\\-119\\-166.6778\\-188.5391\\-119\\-165.7527\\-184.6328\\-119\\-165.0912\\-182.6797\\-119\\-164.2839\\-180.7266\\-119\\-163.6993\\-178.7734\\-119\\-162.6635\\-176.8203\\-119\\-161.9601\\-174.8672\\-119\\-159.6844\\-170.9609\\-119\\-159.1797\\-170.3594\\-119\\-157.2266\\-167.5595\\-119\\-155.366\\-165.1016\\-119\\-153.3203\\-162.6723\\-119\\-151.3672\\-160.5093\\-119\\-148.2115\\-157.2891\\-119\\-145.5078\\-154.6338\\-119\\-143.5547\\-152.833\\-119\\-141.6016\\-151.2588\\-119\\-139.6484\\-149.4863\\-119\\-135.7422\\-146.2182\\-119\\-129.8972\\-141.6641\\-119\\-124.597\\-137.7578\\-119\\-122.0703\\-136.0753\\-119\\-120.1172\\-134.6526\\-119\\-114.2578\\-130.8277\\-119\\-112.3047\\-129.7325\\-119\\-108.3984\\-127.7056\\-119\\-106.4453\\-126.8709\\-119\\-100.5859\\-124.6597\\-119\\-96.67969\\-123.5107\\-119\\-94.72656\\-122.8652\\-119\\-92.77344\\-122.3836\\-119\\-86.91406\\-121.2045\\-119\\-84.96094\\-120.9487\\-119\\-77.14844\\-120.1692\\-119\\-75.19531\\-120.0317\\-119\\-69.33594\\-119.9427\\-119\\-65.42969\\-120.0515\\-119\\-63.47656\\-120.2733\\-119\\-59.57031\\-120.5888\\-119\\-55.66406\\-121.181\\-119\\-53.71094\\-121.7357\\-119\\-49.80469\\-123.1523\\-119\\-45.89844\\-124.8881\\-119\\-43.94531\\-125.904\\-119\\-41.99219\\-127.0376\\-119\\-40.59938\\-127.9922\\-119\\-38.08594\\-129.5568\\-119\\-36.13281\\-130.8873\\-119\\-32.30424\\-133.8516\\-119\\-30.27344\\-135.4766\\-119\\-27.88382\\-137.7578\\-119\\-26.11699\\-139.7109\\-119\\-24.41406\\-141.7827\\-119\\-21.5908\\-145.5703\\-119\\-20.24489\\-147.5234\\-119\\-19.37548\\-149.4766\\-119\\-18.21356\\-151.4297\\-119\\-17.39054\\-153.3828\\-119\\-16.25504\\-155.3359\\-119\\-15.55342\\-157.2891\\-119\\-14.04333\\-161.1953\\-119\\-13.29774\\-165.1016\\-119\\-12.24308\\-169.0078\\-119\\-11.90848\\-170.9609\\-119\\-11.51816\\-174.8672\\-119\\-11.19626\\-178.7734\\-119\\-10.39567\\-184.6328\\-119\\-10.27135\\-186.5859\\-119\\-10.26257\\-188.5391\\-119\\-10.4061\\-190.4922\\-119\\-10.89523\\-194.3984\\-119\\-10.99664\\-196.3516\\-119\\-11.00028\\-198.3047\\-119\\-10.4947\\-200.2578\\-119\\-10.19597\\-202.2109\\-119\\-9.942746\\-206.1172\\-119\\-9.746571\\-213.9297\\-119\\-9.859076\\-219.7891\\-119\\-10.19597\\-223.6953\\-119\\-11.0104\\-227.6016\\-119\\-11.32581\\-229.5547\\-119\\-11.83143\\-233.4609\\-119\\-11.99525\\-235.4141\\-119\\-12.33082\\-237.3672\\-119\\-12.89208\\-239.3203\\-119\\-13.30645\\-241.2734\\-119\\-13.94187\\-245.1797\\-119\\-14.39925\\-247.1328\\-119\\-15.22524\\-249.0859\\-119\\-15.78363\\-251.0391\\-119\\-16.53498\\-252.9922\\-119\\-17.41028\\-254.9453\\-119\\-17.96301\\-256.8984\\-119\\-19.00692\\-258.8516\\-119\\-19.53125\\-260.8047\\-119\\-20.18229\\-262.7578\\-119\\-21.29017\\-264.7109\\-119\\-22.03556\\-266.6641\\-119\\-23.28808\\-268.6172\\-119\\-24.22437\\-270.5703\\-119\\-25.33953\\-272.5234\\-119\\-26.21875\\-274.4766\\-119\\-27.40294\\-276.4297\\-119\\-28.75362\\-278.3828\\-119\\-29.94792\\-280.3359\\-119\\-32.84862\\-284.2422\\-119\\-34.17969\\-286.1474\\-119\\-35.83623\\-288.1484\\-119\\-38.08594\\-290.5123\\-119\\-39.4545\\-292.0547\\-119\\-41.99219\\-294.3596\\-119\\-43.94531\\-295.5293\\-119\\-44.47719\\-295.9609\\-119\\-47.85156\\-298.281\\-119\\-49.80469\\-299.2142\\-119\\-51.75781\\-300.3682\\-119\\-55.66406\\-301.6206\\-119\\-57.61719\\-302.3381\\-119\\-59.57031\\-302.6953\\-119\\-63.47656\\-303.1477\\-119\\-69.33594\\-303.8955\\-119\\-73.24219\\-303.9478\\-119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "171" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "58" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-302.088\\-119\\61.52344\\-301.5423\\-119\\57.61719\\-300.8095\\-119\\55.66406\\-300.3764\\-119\\53.71094\\-299.4911\\-119\\51.75781\\-298.7579\\-119\\49.80469\\-297.6915\\-119\\47.85156\\-296.8188\\-119\\45.89844\\-295.683\\-119\\43.94531\\-294.748\\-119\\40.29895\\-292.0547\\-119\\37.98554\\-290.1016\\-119\\36.13281\\-288.6855\\-119\\33.53092\\-286.1953\\-119\\30.12734\\-282.2891\\-119\\28.32031\\-280.0704\\-119\\25.72692\\-276.4297\\-119\\24.70042\\-274.4766\\-119\\24.41406\\-274.1425\\-119\\22.46094\\-270.904\\-119\\22.18289\\-270.5703\\-119\\21.26736\\-268.6172\\-119\\20.0998\\-266.6641\\-119\\18.82234\\-262.7578\\-119\\17.83265\\-260.8047\\-119\\17.33011\\-258.8516\\-119\\16.47949\\-256.8984\\-119\\15.85681\\-254.9453\\-119\\15.42664\\-252.9922\\-119\\14.22902\\-249.0859\\-119\\13.88638\\-247.1328\\-119\\13.13741\\-241.2734\\-119\\12.28448\\-237.3672\\-119\\11.81959\\-233.4609\\-119\\11.40978\\-227.6016\\-119\\10.93606\\-223.6953\\-119\\10.5806\\-221.7422\\-119\\10.16488\\-217.8359\\-119\\10.04044\\-215.8828\\-119\\9.537407\\-210.0234\\-119\\8.694322\\-206.1172\\-119\\8.496094\\-204.1641\\-119\\8.382667\\-200.2578\\-119\\8.518528\\-196.3516\\-119\\8.766352\\-194.3984\\-119\\9.234619\\-192.4453\\-119\\9.538277\\-190.4922\\-119\\9.74215\\-188.5391\\-119\\10.08606\\-182.6797\\-119\\10.26257\\-180.7266\\-119\\10.62012\\-178.7734\\-119\\11.13154\\-176.8203\\-119\\11.49876\\-174.8672\\-119\\11.89076\\-170.9609\\-119\\12.27392\\-169.0078\\-119\\12.94663\\-167.0547\\-119\\13.76433\\-163.1484\\-119\\14.25653\\-161.1953\\-119\\15.23554\\-159.2422\\-119\\15.97858\\-157.2891\\-119\\17.26944\\-155.3359\\-119\\18.14993\\-153.3828\\-119\\20.50781\\-149.7925\\-119\\22.13093\\-147.5234\\-119\\24.41406\\-145.1214\\-119\\25.72761\\-143.6172\\-119\\28.32031\\-141.0338\\-119\\30.27344\\-139.3307\\-119\\32.22656\\-137.9124\\-119\\36.13281\\-134.8219\\-119\\38.08594\\-133.4299\\-119\\40.03906\\-132.383\\-119\\41.99219\\-131.0784\\-119\\44.00712\\-129.9453\\-119\\47.85156\\-127.9494\\-119\\49.80469\\-127.1561\\-119\\51.75781\\-126.5874\\-119\\53.71094\\-125.8777\\-119\\55.66406\\-125.3949\\-119\\57.61719\\-124.7787\\-119\\59.57031\\-124.2644\\-119\\63.47656\\-122.9633\\-119\\65.42969\\-122.4852\\-119\\67.38281\\-121.784\\-119\\73.24219\\-120.7331\\-119\\77.14844\\-120.0918\\-119\\79.10156\\-119.915\\-119\\83.00781\\-119.7296\\-119\\88.86719\\-119.6872\\-119\\94.72656\\-119.8048\\-119\\98.63281\\-120.1106\\-119\\100.5859\\-120.4936\\-119\\102.5391\\-120.7522\\-119\\106.4453\\-121.5105\\-119\\110.3516\\-122.6893\\-119\\112.3047\\-123.2168\\-119\\116.2109\\-124.865\\-119\\118.1641\\-125.7587\\-119\\122.0703\\-127.8029\\-119\\125.5247\\-129.9453\\-119\\127.9297\\-131.7097\\-119\\129.8828\\-133.002\\-119\\131.8359\\-134.537\\-119\\135.7422\\-137.3312\\-119\\141.6016\\-142.375\\-119\\143.236\\-143.6172\\-119\\147.4609\\-147.2815\\-119\\149.4141\\-149.2813\\-119\\153.3203\\-153.6009\\-119\\156.0126\\-157.2891\\-119\\158.2924\\-161.1953\\-119\\159.5871\\-163.1484\\-119\\160.4715\\-165.1016\\-119\\161.5798\\-167.0547\\-119\\162.9232\\-170.9609\\-119\\163.765\\-172.9141\\-119\\164.2288\\-174.8672\\-119\\165.5995\\-178.7734\\-119\\166.3136\\-182.6797\\-119\\167.1007\\-186.5859\\-119\\167.3584\\-188.5391\\-119\\167.6839\\-192.4453\\-119\\167.8941\\-198.3047\\-119\\167.9171\\-204.1641\\-119\\167.786\\-210.0234\\-119\\167.5494\\-213.9297\\-119\\167.1276\\-217.8359\\-119\\166.716\\-219.7891\\-119\\165.7626\\-225.6484\\-119\\165.3209\\-227.6016\\-119\\164.585\\-229.5547\\-119\\163.7389\\-233.4609\\-119\\162.3428\\-237.3672\\-119\\161.9104\\-239.3203\\-119\\161.1406\\-241.2734\\-119\\160.2159\\-243.2266\\-119\\159.3959\\-245.1797\\-119\\158.2499\\-247.1328\\-119\\157.3213\\-249.0859\\-119\\155.2977\\-252.9922\\-119\\154.1582\\-254.9453\\-119\\152.7485\\-256.8984\\-119\\149.4141\\-261.8849\\-119\\145.7072\\-266.6641\\-119\\143.9968\\-268.6172\\-119\\142.3895\\-270.5703\\-119\\137.6953\\-275.5451\\-119\\134.8985\\-278.3828\\-119\\131.8359\\-281.306\\-119\\128.3736\\-284.2422\\-119\\125.8422\\-286.1953\\-119\\122.0703\\-288.9284\\-119\\118.1641\\-291.2701\\-119\\116.2109\\-292.6998\\-119\\114.2578\\-293.6667\\-119\\112.3047\\-294.7734\\-119\\110.3516\\-295.4133\\-119\\108.3984\\-296.4619\\-119\\106.4453\\-297.0562\\-119\\102.5391\\-298.7313\\-119\\100.5859\\-299.3234\\-119\\98.63281\\-300.1548\\-119\\96.67969\\-300.6337\\-119\\92.77344\\-301.3156\\-119\\88.86719\\-302.1761\\-119\\84.96094\\-302.6028\\-119\\83.00781\\-302.7127\\-119\\79.10156\\-302.8344\\-119\\73.24219\\-302.8396\\-119\\67.38281\\-302.6235\\-119\\65.42969\\-302.4275\\-119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "182" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "59" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-303.7048\\-117\\-83.00781\\-302.9542\\-117\\-86.91406\\-302.6283\\-117\\-88.86719\\-302.3346\\-117\\-92.77344\\-301.293\\-117\\-96.67969\\-300.5163\\-117\\-100.5859\\-299.0191\\-117\\-102.5391\\-298.3579\\-117\\-104.4922\\-297.2926\\-117\\-106.4453\\-296.6411\\-117\\-108.3984\\-295.5139\\-117\\-110.3516\\-294.8001\\-117\\-112.3047\\-293.6211\\-117\\-114.2578\\-292.5774\\-117\\-118.1641\\-289.7238\\-117\\-120.1172\\-288.6998\\-117\\-122.0703\\-287.1719\\-117\\-125.9766\\-283.8105\\-117\\-127.9297\\-282.3793\\-117\\-129.8828\\-280.6719\\-117\\-132.1325\\-278.3828\\-117\\-134.1688\\-276.4297\\-117\\-136.0421\\-274.4766\\-117\\-139.1404\\-270.5703\\-117\\-140.8627\\-268.6172\\-117\\-142.4216\\-266.6641\\-117\\-144.9526\\-262.7578\\-117\\-146.4557\\-260.8047\\-117\\-147.7979\\-258.8516\\-117\\-148.7962\\-256.8984\\-117\\-150.0292\\-254.9453\\-117\\-150.8692\\-252.9922\\-117\\-152.1429\\-251.0391\\-117\\-154.2291\\-247.1328\\-117\\-155.0458\\-245.1797\\-117\\-156.0337\\-243.2266\\-117\\-156.6193\\-241.2734\\-117\\-157.7236\\-239.3203\\-117\\-158.3695\\-237.3672\\-117\\-159.4272\\-235.4141\\-117\\-160.8528\\-231.5078\\-117\\-161.7275\\-229.5547\\-117\\-162.5944\\-225.6484\\-117\\-163.4404\\-223.6953\\-117\\-164.375\\-219.7891\\-117\\-165.6304\\-215.8828\\-117\\-166.362\\-211.9766\\-117\\-167.3133\\-208.0703\\-117\\-167.7653\\-204.1641\\-117\\-167.9629\\-200.2578\\-117\\-167.9746\\-198.3047\\-117\\-167.8467\\-194.3984\\-117\\-167.4395\\-190.4922\\-117\\-166.3935\\-186.5859\\-117\\-165.4309\\-182.6797\\-117\\-164.5603\\-180.7266\\-117\\-163.9334\\-178.7734\\-117\\-163.1098\\-176.8203\\-117\\-161.3404\\-172.9141\\-117\\-160.1199\\-170.9609\\-117\\-158.796\\-169.0078\\-117\\-157.586\\-167.0547\\-117\\-156.136\\-165.1016\\-117\\-153.3203\\-161.5082\\-117\\-147.7318\\-155.3359\\-117\\-145.7607\\-153.3828\\-117\\-143.5547\\-150.8368\\-117\\-139.6484\\-146.9809\\-117\\-137.6953\\-145.2448\\-117\\-135.7422\\-143.7895\\-117\\-133.7891\\-141.9582\\-117\\-131.8359\\-140.3199\\-117\\-128.6501\\-137.7578\\-117\\-127.9297\\-137.3\\-117\\-125.9766\\-135.7429\\-117\\-122.0703\\-132.9669\\-117\\-118.1441\\-129.9453\\-117\\-116.2109\\-128.6297\\-117\\-114.2578\\-127.5108\\-117\\-112.3047\\-126.5921\\-117\\-110.3516\\-125.4731\\-117\\-107.6451\\-124.0859\\-117\\-104.4922\\-122.7518\\-117\\-100.5859\\-121.3763\\-117\\-96.67969\\-120.1933\\-117\\-94.72656\\-119.5251\\-117\\-92.77344\\-119.2854\\-117\\-90.82031\\-118.9292\\-117\\-88.86719\\-118.3301\\-117\\-86.91406\\-117.985\\-117\\-79.10156\\-117.355\\-117\\-77.14844\\-116.838\\-117\\-75.19531\\-116.6541\\-117\\-73.24219\\-116.661\\-117\\-71.28906\\-116.7692\\-117\\-67.38281\\-116.754\\-117\\-61.52344\\-117.033\\-117\\-57.61719\\-117.6817\\-117\\-55.66406\\-117.8422\\-117\\-54.32581\\-118.2266\\-117\\-51.75781\\-119.3199\\-117\\-49.80469\\-119.8667\\-117\\-47.85156\\-120.8187\\-117\\-43.94531\\-122.5448\\-117\\-41.44287\\-124.0859\\-117\\-38.08594\\-126.6173\\-117\\-36.13281\\-128.2863\\-117\\-34.17969\\-130.1021\\-117\\-32.44745\\-131.8984\\-117\\-30.27344\\-134.0143\\-117\\-26.77617\\-137.7578\\-117\\-25.24567\\-139.7109\\-117\\-23.60704\\-141.6641\\-117\\-22.18511\\-143.6172\\-117\\-21.06882\\-145.5703\\-117\\-19.79342\\-147.5234\\-117\\-19.04634\\-149.4766\\-117\\-17.87051\\-151.4297\\-117\\-17.10862\\-153.3828\\-117\\-15.98161\\-155.3359\\-117\\-15.34598\\-157.2891\\-117\\-14.42906\\-159.2422\\-117\\-13.87778\\-161.1953\\-117\\-13.10107\\-165.1016\\-117\\-12.50895\\-167.0547\\-117\\-12.07886\\-169.0078\\-117\\-11.81481\\-170.9609\\-117\\-11.1051\\-178.7734\\-117\\-10.5678\\-182.6797\\-117\\-10.35525\\-184.6328\\-117\\-10.2285\\-188.5391\\-117\\-10.33579\\-190.4922\\-117\\-10.93606\\-196.3516\\-117\\-10.81139\\-198.3047\\-117\\-10.28022\\-200.2578\\-117\\-10.05609\\-202.2109\\-117\\-9.808708\\-206.1172\\-117\\-9.573348\\-213.9297\\-117\\-9.569279\\-215.8828\\-117\\-9.683439\\-219.7891\\-117\\-10.0234\\-223.6953\\-117\\-10.2983\\-225.6484\\-117\\-11.18952\\-229.5547\\-117\\-11.80508\\-233.4609\\-117\\-11.92197\\-235.4141\\-117\\-12.19733\\-237.3672\\-117\\-13.22857\\-241.2734\\-117\\-13.89146\\-245.1797\\-117\\-14.30567\\-247.1328\\-117\\-15.15458\\-249.0859\\-117\\-15.7373\\-251.0391\\-117\\-16.43997\\-252.9922\\-117\\-17.37144\\-254.9453\\-117\\-17.90926\\-256.8984\\-117\\-18.9627\\-258.8516\\-117\\-19.50758\\-260.8047\\-117\\-20.15708\\-262.7578\\-117\\-21.25\\-264.7109\\-117\\-21.99897\\-266.6641\\-117\\-23.27564\\-268.6172\\-117\\-24.22437\\-270.5703\\-117\\-25.33953\\-272.5234\\-117\\-26.20443\\-274.4766\\-117\\-27.3911\\-276.4297\\-117\\-28.73047\\-278.3828\\-117\\-29.91662\\-280.3359\\-117\\-32.84862\\-284.2422\\-117\\-34.17969\\-286.1474\\-117\\-35.82405\\-288.1484\\-117\\-38.08594\\-290.4813\\-117\\-39.51214\\-292.0547\\-117\\-41.99219\\-294.3044\\-117\\-43.94531\\-295.4692\\-117\\-44.55891\\-295.9609\\-117\\-47.85156\\-298.1732\\-117\\-49.80469\\-299.132\\-117\\-51.75781\\-300.2773\\-117\\-55.66406\\-301.516\\-117\\-57.61719\\-302.2581\\-117\\-59.57031\\-302.6466\\-117\\-69.33594\\-303.7344\\-117\\-71.28906\\-303.8256\\-117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "178" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "60" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-302.0067\\-117\\61.52344\\-301.4809\\-117\\57.61719\\-300.7699\\-117\\55.66406\\-300.3372\\-117\\53.71094\\-299.4451\\-117\\51.75781\\-298.7092\\-117\\49.80469\\-297.6162\\-117\\47.85156\\-296.7802\\-117\\45.89844\\-295.6305\\-117\\43.94531\\-294.6945\\-117\\40.38509\\-292.0547\\-117\\38.03944\\-290.1016\\-117\\36.13281\\-288.6613\\-117\\33.54011\\-286.1953\\-117\\30.14168\\-282.2891\\-117\\28.32031\\-280.0656\\-117\\25.73568\\-276.4297\\-117\\24.72744\\-274.4766\\-117\\24.41406\\-274.1146\\-117\\22.46094\\-270.874\\-117\\22.20648\\-270.5703\\-117\\21.28566\\-268.6172\\-117\\20.11317\\-266.6641\\-117\\18.83473\\-262.7578\\-117\\17.84589\\-260.8047\\-117\\17.35711\\-258.8516\\-117\\16.54938\\-256.8984\\-117\\15.88907\\-254.9453\\-117\\15.46474\\-252.9922\\-117\\14.27185\\-249.0859\\-117\\13.92315\\-247.1328\\-117\\13.18359\\-241.2734\\-117\\12.36747\\-237.3672\\-117\\12.06236\\-235.4141\\-117\\11.8606\\-233.4609\\-117\\11.46376\\-227.6016\\-117\\11.0338\\-223.6953\\-117\\10.44922\\-219.7891\\-117\\9.727515\\-211.9766\\-117\\9.495856\\-210.0234\\-117\\8.653626\\-206.1172\\-117\\8.363688\\-202.2109\\-117\\8.363688\\-198.3047\\-117\\8.565267\\-194.3984\\-117\\9.441902\\-190.4922\\-117\\9.654432\\-188.5391\\-117\\10.14245\\-180.7266\\-117\\10.47165\\-178.7734\\-117\\11.05442\\-176.8203\\-117\\11.43185\\-174.8672\\-117\\11.84353\\-170.9609\\-117\\12.1844\\-169.0078\\-117\\12.82401\\-167.0547\\-117\\13.34429\\-165.1016\\-117\\14.17894\\-161.1953\\-117\\15.13365\\-159.2422\\-117\\15.89477\\-157.2891\\-117\\17.16383\\-155.3359\\-117\\18.02147\\-153.3828\\-117\\19.34735\\-151.4297\\-117\\20.50781\\-149.4872\\-117\\21.96296\\-147.5234\\-117\\26.36719\\-142.7119\\-117\\30.27344\\-138.9888\\-117\\34.17969\\-135.4219\\-117\\36.13281\\-134.0372\\-117\\38.92744\\-131.8984\\-117\\41.99219\\-129.8255\\-117\\45.18943\\-127.9922\\-117\\45.89844\\-127.4993\\-117\\47.85156\\-126.5959\\-117\\49.80469\\-125.4417\\-117\\51.75781\\-124.7151\\-117\\53.71094\\-123.7847\\-117\\55.66406\\-123.017\\-117\\61.52344\\-120.885\\-117\\63.47656\\-120.421\\-117\\65.42969\\-119.6137\\-117\\69.33594\\-118.9895\\-117\\71.28906\\-118.1698\\-117\\73.24219\\-117.8668\\-117\\77.14844\\-117.5476\\-117\\81.05469\\-116.9652\\-117\\84.96094\\-116.7823\\-117\\88.86719\\-116.7688\\-117\\94.72656\\-116.9802\\-117\\98.63281\\-117.5356\\-117\\102.5391\\-117.8541\\-117\\104.4922\\-118.1704\\-117\\106.4453\\-119.0058\\-117\\108.3984\\-119.3038\\-117\\110.3516\\-119.7595\\-117\\112.3047\\-120.595\\-117\\114.2578\\-121.1143\\-117\\116.2109\\-122.0569\\-117\\118.1641\\-123.1488\\-117\\120.1172\\-123.8906\\-117\\122.0703\\-125.2871\\-117\\123.3895\\-126.0391\\-117\\127.9297\\-129.0429\\-117\\129.8828\\-130.5724\\-117\\131.8359\\-132.2621\\-117\\133.7891\\-133.3273\\-117\\135.7422\\-135.0057\\-117\\138.6426\\-137.7578\\-117\\141.6016\\-140.4685\\-117\\145.5078\\-144.3125\\-117\\147.1804\\-145.5703\\-117\\149.4141\\-147.849\\-117\\151.3672\\-149.998\\-117\\152.4595\\-151.4297\\-117\\154.1461\\-153.3828\\-117\\155.5733\\-155.3359\\-117\\156.5686\\-157.2891\\-117\\157.8839\\-159.2422\\-117\\160.0691\\-163.1484\\-117\\161.9204\\-167.0547\\-117\\162.4455\\-169.0078\\-117\\163.3599\\-170.9609\\-117\\163.9664\\-172.9141\\-117\\164.425\\-174.8672\\-117\\165.2385\\-176.8203\\-117\\165.7374\\-178.7734\\-117\\166.4167\\-182.6797\\-117\\167.1805\\-186.5859\\-117\\167.4338\\-188.5391\\-117\\167.7145\\-192.4453\\-117\\167.8994\\-198.3047\\-117\\167.9225\\-204.1641\\-117\\167.7907\\-210.0234\\-117\\167.5698\\-213.9297\\-117\\167.1276\\-217.8359\\-117\\166.3925\\-221.7422\\-117\\165.7728\\-225.6484\\-117\\165.332\\-227.6016\\-117\\164.585\\-229.5547\\-117\\163.7464\\-233.4609\\-117\\162.3428\\-237.3672\\-117\\161.9177\\-239.3203\\-117\\161.1407\\-241.2734\\-117\\160.2159\\-243.2266\\-117\\159.3959\\-245.1797\\-117\\158.2553\\-247.1328\\-117\\157.3073\\-249.0859\\-117\\155.2734\\-252.9565\\-117\\154.1199\\-254.9453\\-117\\152.7092\\-256.8984\\-117\\149.4141\\-261.8249\\-117\\145.6163\\-266.6641\\-117\\143.8779\\-268.6172\\-117\\142.2905\\-270.5703\\-117\\140.5119\\-272.5234\\-117\\134.8382\\-278.3828\\-117\\131.8359\\-281.2399\\-117\\128.2826\\-284.2422\\-117\\125.7586\\-286.1953\\-117\\122.0703\\-288.9001\\-117\\120.1172\\-290.0142\\-117\\118.1641\\-291.2455\\-117\\116.2109\\-292.668\\-117\\114.2578\\-293.6317\\-117\\112.3047\\-294.7463\\-117\\110.3516\\-295.3776\\-117\\108.3984\\-296.4201\\-117\\106.4453\\-297.0287\\-117\\102.5391\\-298.6984\\-117\\100.5859\\-299.287\\-117\\98.63281\\-300.1079\\-117\\96.67969\\-300.6153\\-117\\92.77344\\-301.2799\\-117\\88.86719\\-302.1505\\-117\\86.91406\\-302.4101\\-117\\84.96094\\-302.5692\\-117\\81.05469\\-302.7638\\-117\\77.14844\\-302.8344\\-117\\73.24219\\-302.8185\\-117\\69.33594\\-302.7065\\-117\\65.42969\\-302.3793\\-117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "182" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "61" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-302.234\\-115\\-92.77344\\-301.2092\\-115\\-96.67969\\-300.4157\\-115\\-98.63281\\-299.6145\\-115\\-102.5391\\-298.2502\\-115\\-104.4922\\-297.2002\\-115\\-106.4453\\-296.5614\\-115\\-108.3984\\-295.4361\\-115\\-110.3516\\-294.748\\-115\\-112.3047\\-293.5419\\-115\\-114.2578\\-292.5104\\-115\\-117.6427\\-290.1016\\-115\\-118.1641\\-289.6621\\-115\\-120.1172\\-288.667\\-115\\-122.0703\\-287.1346\\-115\\-125.9766\\-283.7505\\-115\\-127.9297\\-282.2975\\-115\\-129.8828\\-280.5861\\-115\\-132.0538\\-278.3828\\-115\\-134.112\\-276.4297\\-115\\-135.9844\\-274.4766\\-115\\-137.4283\\-272.5234\\-115\\-140.8065\\-268.6172\\-115\\-142.3815\\-266.6641\\-115\\-144.9023\\-262.7578\\-115\\-146.4212\\-260.8047\\-115\\-147.731\\-258.8516\\-115\\-148.7608\\-256.8984\\-115\\-150.0077\\-254.9453\\-115\\-150.8246\\-252.9922\\-115\\-152.118\\-251.0391\\-115\\-154.1953\\-247.1328\\-115\\-155.0184\\-245.1797\\-115\\-156.0136\\-243.2266\\-115\\-156.6068\\-241.2734\\-115\\-157.697\\-239.3203\\-115\\-158.3739\\-237.3672\\-115\\-159.4272\\-235.4141\\-115\\-160.8646\\-231.5078\\-115\\-161.7314\\-229.5547\\-115\\-162.6275\\-225.6484\\-115\\-163.4961\\-223.6953\\-115\\-164.4244\\-219.7891\\-115\\-165.1476\\-217.8359\\-115\\-165.7059\\-215.8828\\-115\\-166.4709\\-211.9766\\-115\\-167.4017\\-208.0703\\-115\\-167.653\\-206.1172\\-115\\-167.9629\\-202.2109\\-115\\-168.0462\\-198.3047\\-115\\-167.9513\\-194.3984\\-115\\-167.6213\\-190.4922\\-115\\-167.2683\\-188.5391\\-115\\-166.6534\\-186.5859\\-115\\-165.721\\-182.6797\\-115\\-165.0467\\-180.7266\\-115\\-164.2158\\-178.7734\\-115\\-163.5963\\-176.8203\\-115\\-162.5502\\-174.8672\\-115\\-161.8472\\-172.9141\\-115\\-160.6761\\-170.9609\\-115\\-159.6746\\-169.0078\\-115\\-158.2344\\-167.0547\\-115\\-155.7166\\-163.1484\\-115\\-153.3203\\-159.8966\\-115\\-147.8202\\-153.3828\\-115\\-146.3137\\-151.4297\\-115\\-143.5547\\-148.1783\\-115\\-141.0656\\-145.5703\\-115\\-138.9348\\-143.6172\\-115\\-137.6953\\-142.3281\\-115\\-135.7422\\-140.5002\\-115\\-131.8359\\-137.1028\\-115\\-130.0007\\-135.8047\\-115\\-127.5984\\-133.8516\\-115\\-124.0234\\-131.1766\\-115\\-120.1172\\-127.8387\\-115\\-116.2109\\-125.3132\\-115\\-114.2578\\-124.4313\\-115\\-112.3047\\-123.1094\\-115\\-108.3984\\-121.2841\\-115\\-105.8919\\-120.1797\\-115\\-102.5391\\-118.9678\\-115\\-100.5859\\-118.4501\\-115\\-98.63281\\-117.5647\\-115\\-96.67969\\-117.145\\-115\\-94.72656\\-116.8573\\-115\\-92.77344\\-116.076\\-115\\-90.82031\\-115.7379\\-115\\-84.96094\\-114.991\\-115\\-83.00781\\-114.6012\\-115\\-80.56641\\-114.3203\\-115\\-77.14844\\-114.1339\\-115\\-71.28906\\-113.9376\\-115\\-67.38281\\-113.696\\-115\\-63.47656\\-114.0712\\-115\\-61.52344\\-114.1143\\-115\\-59.57031\\-114.2734\\-115\\-57.61719\\-114.6766\\-115\\-55.66406\\-115.2352\\-115\\-53.71094\\-115.6403\\-115\\-49.80469\\-117.0526\\-115\\-47.85156\\-117.5719\\-115\\-45.89844\\-118.4862\\-115\\-43.94531\\-119.1177\\-115\\-41.99219\\-120.1378\\-115\\-40.03906\\-121.3385\\-115\\-38.08594\\-122.7304\\-115\\-34.47896\\-126.0391\\-115\\-32.22656\\-128.5205\\-115\\-30.27344\\-130.8501\\-115\\-28.12704\\-133.8516\\-115\\-26.36719\\-136.2116\\-115\\-22.46094\\-141.8305\\-115\\-20.14923\\-145.5703\\-115\\-19.29209\\-147.5234\\-115\\-18.23815\\-149.4766\\-115\\-17.44948\\-151.4297\\-115\\-16.42336\\-153.3828\\-115\\-14.88196\\-157.2891\\-115\\-14.05374\\-159.2422\\-115\\-13.2393\\-163.1484\\-115\\-12.17491\\-167.0547\\-115\\-11.90396\\-169.0078\\-115\\-11.12888\\-176.8203\\-115\\-10.4831\\-182.6797\\-115\\-10.31681\\-184.6328\\-115\\-10.26257\\-186.5859\\-115\\-10.26257\\-190.4922\\-115\\-10.35525\\-192.4453\\-115\\-10.66142\\-196.3516\\-115\\-10.44922\\-198.3047\\-115\\-10.13513\\-200.2578\\-115\\-9.765625\\-204.1641\\-115\\-9.544614\\-210.0234\\-115\\-9.357766\\-213.9297\\-115\\-9.324407\\-215.8828\\-115\\-9.44553\\-219.7891\\-115\\-10.0591\\-225.6484\\-115\\-10.3752\\-227.6016\\-115\\-11.3445\\-231.5078\\-115\\-11.61791\\-233.4609\\-115\\-12.04227\\-237.3672\\-115\\-12.4566\\-239.3203\\-115\\-13.09543\\-241.2734\\-115\\-14.19724\\-247.1328\\-115\\-15.04536\\-249.0859\\-115\\-16.31974\\-252.9922\\-115\\-17.32086\\-254.9453\\-115\\-17.85399\\-256.8984\\-115\\-18.89167\\-258.8516\\-115\\-20.11855\\-262.7578\\-115\\-21.20937\\-264.7109\\-115\\-21.98132\\-266.6641\\-115\\-23.26931\\-268.6172\\-115\\-24.1855\\-270.5703\\-115\\-25.33953\\-272.5234\\-115\\-26.17645\\-274.4766\\-115\\-27.37926\\-276.4297\\-115\\-28.69642\\-278.3828\\-115\\-29.89641\\-280.3359\\-115\\-32.83524\\-284.2422\\-115\\-34.17969\\-286.1479\\-115\\-35.82176\\-288.1484\\-115\\-38.08594\\-290.4688\\-115\\-39.5436\\-292.0547\\-115\\-41.99219\\-294.2372\\-115\\-43.94531\\-295.4214\\-115\\-45.89844\\-296.823\\-115\\-47.85156\\-298.0757\\-115\\-49.80469\\-299.0672\\-115\\-51.75781\\-300.1859\\-115\\-53.71094\\-300.8671\\-115\\-55.66406\\-301.4066\\-115\\-57.61719\\-302.1646\\-115\\-59.57031\\-302.5838\\-115\\-67.38281\\-303.4081\\-115\\-69.33594\\-303.5796\\-115\\-73.24219\\-303.6608\\-115\\-75.19531\\-303.5541\\-115\\-84.96094\\-302.7527\\-115\\-86.91406\\-302.5646\\-115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "180" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "62" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-301.95\\-115\\61.52344\\-301.4447\\-115\\57.61719\\-300.7534\\-115\\55.66406\\-300.2964\\-115\\53.71094\\-299.3913\\-115\\51.75781\\-298.6724\\-115\\49.80469\\-297.5706\\-115\\47.85156\\-296.7345\\-115\\45.89844\\-295.5775\\-115\\43.94531\\-294.6567\\-115\\40.44028\\-292.0547\\-115\\38.07655\\-290.1016\\-115\\36.13281\\-288.6577\\-115\\33.54011\\-286.1953\\-115\\30.12734\\-282.2891\\-115\\28.32031\\-280.0808\\-115\\25.73568\\-276.4297\\-115\\24.72744\\-274.4766\\-115\\24.41406\\-274.1146\\-115\\22.46094\\-270.8458\\-115\\21.29021\\-268.6172\\-115\\20.11317\\-266.6641\\-115\\18.84694\\-262.7578\\-115\\17.85942\\-260.8047\\-115\\17.38383\\-258.8516\\-115\\15.91546\\-254.9453\\-115\\15.52586\\-252.9922\\-115\\15.02455\\-251.0391\\-115\\14.30339\\-249.0859\\-115\\13.95742\\-247.1328\\-115\\13.22857\\-241.2734\\-115\\12.44213\\-237.3672\\-115\\12.10814\\-235.4141\\-115\\11.89076\\-233.4609\\-115\\11.64165\\-229.5547\\-115\\11.3246\\-225.6484\\-115\\11.0919\\-223.6953\\-115\\10.4947\\-219.7891\\-115\\9.939341\\-213.9297\\-115\\9.45638\\-210.0234\\-115\\8.589623\\-206.1172\\-115\\8.31822\\-202.2109\\-115\\8.280793\\-198.3047\\-115\\8.452972\\-194.3984\\-115\\9.354441\\-190.4922\\-115\\9.57532\\-188.5391\\-115\\10.02081\\-180.7266\\-115\\10.33579\\-178.7734\\-115\\10.88066\\-176.8203\\-115\\11.31283\\-174.8672\\-115\\11.766\\-170.9609\\-115\\12.05842\\-169.0078\\-115\\13.22266\\-165.1016\\-115\\14.0722\\-161.1953\\-115\\15.75934\\-157.2891\\-115\\16.93157\\-155.3359\\-115\\17.84498\\-153.3828\\-115\\19.18154\\-151.4297\\-115\\20.17032\\-149.4766\\-115\\21.67844\\-147.5234\\-115\\25.30354\\-143.6172\\-115\\26.36719\\-142.2256\\-115\\30.81869\\-137.7578\\-115\\34.17969\\-134.2885\\-115\\36.13281\\-132.5465\\-115\\38.08594\\-130.9128\\-115\\39.42558\\-129.9453\\-115\\41.99219\\-127.7969\\-115\\43.94531\\-126.7227\\-115\\45.89844\\-125.1146\\-115\\47.85156\\-123.7083\\-115\\49.80469\\-122.8355\\-115\\51.75781\\-121.651\\-115\\53.71094\\-120.8352\\-115\\55.66406\\-120.1339\\-115\\57.61719\\-119.1524\\-115\\59.57031\\-118.605\\-115\\61.52344\\-117.6971\\-115\\63.47656\\-117.204\\-115\\65.42969\\-116.8616\\-115\\67.38281\\-116.0325\\-115\\69.33594\\-115.5875\\-115\\71.28906\\-115.3085\\-115\\75.19531\\-114.5609\\-115\\77.28795\\-114.3203\\-115\\81.05469\\-114.0151\\-115\\84.96094\\-113.9124\\-115\\88.86719\\-113.8931\\-115\\94.72656\\-114.0824\\-115\\98.63281\\-114.4194\\-115\\100.5859\\-114.6548\\-115\\102.5391\\-115.1341\\-115\\104.4922\\-115.4066\\-115\\108.1355\\-116.2734\\-115\\110.3516\\-117.1292\\-115\\112.3047\\-117.6136\\-115\\114.2578\\-118.5484\\-115\\116.2109\\-119.3078\\-115\\118.1641\\-120.1695\\-115\\122.0703\\-122.3308\\-115\\124.5209\\-124.0859\\-115\\125.9766\\-124.9626\\-115\\127.9297\\-126.3297\\-115\\129.8828\\-128.0038\\-115\\131.8359\\-129.2655\\-115\\134.8728\\-131.8984\\-115\\137.6953\\-134.4847\\-115\\139.6484\\-136.427\\-115\\142.8199\\-139.7109\\-115\\145.5078\\-142.3703\\-115\\149.4141\\-146.396\\-115\\151.3672\\-148.5248\\-115\\153.6856\\-151.4297\\-115\\155.2734\\-153.7331\\-115\\157.4618\\-157.2891\\-115\\158.4457\\-159.2422\\-115\\159.7457\\-161.1953\\-115\\160.552\\-163.1484\\-115\\161.5936\\-165.1016\\-115\\162.8143\\-169.0078\\-115\\163.6754\\-170.9609\\-115\\164.687\\-174.8672\\-115\\165.4671\\-176.8203\\-115\\165.8783\\-178.7734\\-115\\166.541\\-182.6797\\-115\\167.2778\\-186.5859\\-115\\167.4897\\-188.5391\\-115\\167.7492\\-192.4453\\-115\\167.911\\-198.3047\\-115\\167.9397\\-202.2109\\-115\\167.8826\\-208.0703\\-115\\167.7029\\-211.9766\\-115\\167.4017\\-215.8828\\-115\\167.1419\\-217.8359\\-115\\166.4005\\-221.7422\\-115\\165.779\\-225.6484\\-115\\165.3539\\-227.6016\\-115\\164.5946\\-229.5547\\-115\\163.7389\\-233.4609\\-115\\162.3504\\-237.3672\\-115\\161.9177\\-239.3203\\-115\\161.1407\\-241.2734\\-115\\159.4082\\-245.1797\\-115\\158.2553\\-247.1328\\-115\\157.2932\\-249.0859\\-115\\155.2734\\-252.8863\\-115\\154.0833\\-254.9453\\-115\\152.6755\\-256.8984\\-115\\150.0958\\-260.8047\\-115\\147.4609\\-264.3114\\-115\\145.5454\\-266.6641\\-115\\143.8184\\-268.6172\\-115\\142.2094\\-270.5703\\-115\\140.4381\\-272.5234\\-115\\134.7722\\-278.3828\\-115\\131.8359\\-281.1796\\-115\\127.9297\\-284.4166\\-115\\125.6767\\-286.1953\\-115\\122.0703\\-288.8663\\-115\\120.1172\\-289.9531\\-115\\118.1641\\-291.2057\\-115\\116.2109\\-292.6238\\-115\\114.2578\\-293.5645\\-115\\112.3047\\-294.7141\\-115\\110.3516\\-295.3555\\-115\\108.3984\\-296.3898\\-115\\106.4453\\-296.9959\\-115\\102.5391\\-298.6754\\-115\\100.5859\\-299.2519\\-115\\98.63281\\-300.0569\\-115\\96.67969\\-300.5852\\-115\\92.77344\\-301.2485\\-115\\88.86719\\-302.1126\\-115\\86.91406\\-302.3793\\-115\\84.96094\\-302.5453\\-115\\79.10156\\-302.7969\\-115\\75.19531\\-302.8185\\-115\\71.28906\\-302.758\\-115\\67.38281\\-302.5572\\-115\\65.42969\\-302.3381\\-115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "188" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "63" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-302.1268\\-113\\-90.82031\\-301.5527\\-113\\-94.72656\\-300.7647\\-113\\-96.67969\\-300.2991\\-113\\-98.63281\\-299.4629\\-113\\-100.5859\\-298.8311\\-113\\-102.5391\\-298.1011\\-113\\-104.4922\\-297.1095\\-113\\-106.4453\\-296.4746\\-113\\-108.3984\\-295.3418\\-113\\-110.3516\\-294.6652\\-113\\-112.3047\\-293.4472\\-113\\-114.2578\\-292.4317\\-113\\-117.5537\\-290.1016\\-113\\-118.1641\\-289.5929\\-113\\-120.1172\\-288.6092\\-113\\-122.0703\\-287.078\\-113\\-125.9766\\-283.6697\\-113\\-127.8302\\-282.2891\\-113\\-129.8828\\-280.4778\\-113\\-131.9391\\-278.3828\\-113\\-133.996\\-276.4297\\-113\\-135.8968\\-274.4766\\-113\\-137.3236\\-272.5234\\-113\\-140.7494\\-268.6172\\-113\\-142.3356\\-266.6641\\-113\\-144.813\\-262.7578\\-113\\-146.3702\\-260.8047\\-113\\-147.6692\\-258.8516\\-113\\-148.7175\\-256.8984\\-113\\-149.9859\\-254.9453\\-113\\-150.7887\\-252.9922\\-113\\-152.0883\\-251.0391\\-113\\-154.1902\\-247.1328\\-113\\-154.9913\\-245.1797\\-113\\-155.9933\\-243.2266\\-113\\-156.5859\\-241.2734\\-113\\-157.6879\\-239.3203\\-113\\-158.357\\-237.3672\\-113\\-159.4035\\-235.4141\\-113\\-160.8646\\-231.5078\\-113\\-161.7314\\-229.5547\\-113\\-162.6723\\-225.6484\\-113\\-163.5489\\-223.6953\\-113\\-164.4718\\-219.7891\\-113\\-165.2261\\-217.8359\\-113\\-165.774\\-215.8828\\-113\\-166.1179\\-213.9297\\-113\\-167.1007\\-210.0234\\-113\\-167.4774\\-208.0703\\-113\\-167.7188\\-206.1172\\-113\\-168.0335\\-202.2109\\-113\\-168.1264\\-198.3047\\-113\\-168.0516\\-194.3984\\-113\\-167.7769\\-190.4922\\-113\\-167.5232\\-188.5391\\-113\\-167.0593\\-186.5859\\-113\\-166.4701\\-184.6328\\-113\\-165.5215\\-180.7266\\-113\\-164.6102\\-178.7734\\-113\\-163.2561\\-174.8672\\-113\\-162.2957\\-172.9141\\-113\\-161.5421\\-170.9609\\-113\\-161.1328\\-170.3688\\-113\\-159.2327\\-167.0547\\-113\\-156.68\\-163.1484\\-113\\-155.6716\\-161.1953\\-113\\-153.3203\\-157.7556\\-113\\-149.9889\\-153.3828\\-113\\-149.4141\\-152.4822\\-113\\-145.5994\\-147.5234\\-113\\-143.9978\\-145.5703\\-113\\-140.4315\\-141.6641\\-113\\-138.3751\\-139.7109\\-113\\-133.7891\\-135.2342\\-113\\-131.8359\\-134.1838\\-113\\-129.2128\\-131.8984\\-113\\-127.9297\\-130.4464\\-113\\-125.9766\\-128.9168\\-113\\-122.0703\\-125.7172\\-113\\-119.8556\\-124.0859\\-113\\-116.2109\\-121.8073\\-113\\-113.1218\\-120.1797\\-113\\-108.3984\\-118.0292\\-113\\-102.5391\\-115.7899\\-113\\-100.5859\\-115.3226\\-113\\-98.63281\\-114.6101\\-113\\-96.67969\\-114.0963\\-113\\-94.72656\\-113.7612\\-113\\-92.77344\\-113.2857\\-113\\-87.10938\\-112.3672\\-113\\-84.96094\\-112.159\\-113\\-81.05469\\-111.9296\\-113\\-79.10156\\-111.584\\-113\\-73.24219\\-111.2389\\-113\\-71.28906\\-111.2279\\-113\\-69.33594\\-111.0108\\-113\\-67.38281\\-110.6648\\-113\\-63.47656\\-111.0609\\-113\\-61.52344\\-111.4536\\-113\\-59.57031\\-111.7418\\-113\\-56.10352\\-112.3672\\-113\\-53.71094\\-112.8716\\-113\\-51.75781\\-113.5479\\-113\\-49.80469\\-114.0178\\-113\\-45.89844\\-115.3579\\-113\\-43.94531\\-115.9707\\-113\\-39.38176\\-118.2266\\-113\\-36.32813\\-120.1797\\-113\\-34.17969\\-121.9169\\-113\\-32.22656\\-123.9666\\-113\\-30.27344\\-126.3245\\-113\\-28.32031\\-128.9404\\-113\\-26.36719\\-132.1091\\-113\\-25.53665\\-133.8516\\-113\\-24.41406\\-135.5924\\-113\\-22.15379\\-139.7109\\-113\\-21.26814\\-141.6641\\-113\\-20.10968\\-143.6172\\-113\\-19.34814\\-145.5703\\-113\\-18.30701\\-147.5234\\-113\\-17.51567\\-149.4766\\-113\\-15.70495\\-153.3828\\-113\\-15.03233\\-155.3359\\-113\\-14.11518\\-157.2891\\-113\\-13.26172\\-161.1953\\-113\\-12.13458\\-165.1016\\-113\\-11.87323\\-167.0547\\-113\\-11.52664\\-170.9609\\-113\\-11.0919\\-174.8672\\-113\\-10.60675\\-178.7734\\-113\\-10.46036\\-180.7266\\-113\\-10.2892\\-184.6328\\-113\\-10.2983\\-188.5391\\-113\\-10.20397\\-192.4453\\-113\\-10.25391\\-196.3516\\-113\\-9.907156\\-202.2109\\-113\\-9.667478\\-204.1641\\-113\\-9.412977\\-208.0703\\-113\\-9.357766\\-210.0234\\-113\\-9.01762\\-213.9297\\-113\\-8.930701\\-215.8828\\-113\\-9.099187\\-219.7891\\-113\\-9.625401\\-223.6953\\-113\\-10.09285\\-227.6016\\-113\\-10.46036\\-229.5547\\-113\\-11.02218\\-231.5078\\-113\\-11.41741\\-233.4609\\-113\\-11.89732\\-237.3672\\-113\\-12.22005\\-239.3203\\-113\\-12.85306\\-241.2734\\-113\\-13.33599\\-243.2266\\-113\\-14.07434\\-247.1328\\-113\\-15.57543\\-251.0391\\-113\\-16.17619\\-252.9922\\-113\\-17.23249\\-254.9453\\-113\\-17.78739\\-256.8984\\-113\\-18.7934\\-258.8516\\-113\\-20.07004\\-262.7578\\-113\\-21.16456\\-264.7109\\-113\\-21.95562\\-266.6641\\-113\\-23.23451\\-268.6172\\-113\\-24.12446\\-270.5703\\-113\\-25.32817\\-272.5234\\-113\\-26.14765\\-274.4766\\-113\\-27.34963\\-276.4297\\-113\\-29.86704\\-280.3359\\-113\\-32.8125\\-284.2422\\-113\\-34.15606\\-286.1953\\-113\\-35.80968\\-288.1484\\-113\\-39.59451\\-292.0547\\-113\\-41.99219\\-294.168\\-113\\-43.94531\\-295.3615\\-113\\-45.89844\\-296.7627\\-113\\-47.85156\\-297.9368\\-113\\-51.42558\\-299.8672\\-113\\-51.75781\\-300.1007\\-113\\-53.71094\\-300.8031\\-113\\-55.66406\\-301.3122\\-113\\-57.61719\\-302.0349\\-113\\-59.57031\\-302.5179\\-113\\-61.52344\\-302.7527\\-113\\-67.38281\\-303.3039\\-113\\-71.28906\\-303.5275\\-113\\-73.24219\\-303.5154\\-113\\-77.14844\\-303.2914\\-113\\-84.96094\\-302.7015\\-113\\-86.91406\\-302.4693\\-113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "64" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-301.9211\\-113\\61.52344\\-301.4337\\-113\\57.61719\\-300.7359\\-113\\55.66406\\-300.254\\-113\\53.71094\\-299.3516\\-113\\51.75781\\-298.6368\\-113\\49.80469\\-297.5039\\-113\\47.85156\\-296.6989\\-113\\45.89844\\-295.5293\\-113\\43.94531\\-294.631\\-113\\40.47394\\-292.0547\\-113\\38.08594\\-290.0931\\-113\\36.13281\\-288.6472\\-113\\33.54011\\-286.1953\\-113\\30.09796\\-282.2891\\-113\\28.32031\\-280.094\\-113\\25.73568\\-276.4297\\-113\\24.73958\\-274.4766\\-113\\24.41406\\-274.101\\-113\\22.46094\\-270.86\\-113\\22.21853\\-270.5703\\-113\\21.29021\\-268.6172\\-113\\20.12392\\-266.6641\\-113\\18.87084\\-262.7578\\-113\\17.88027\\-260.8047\\-113\\17.41621\\-258.8516\\-113\\15.94543\\-254.9453\\-113\\15.09766\\-251.0391\\-113\\14.33831\\-249.0859\\-113\\13.99158\\-247.1328\\-113\\13.47778\\-243.2266\\-113\\13.28506\\-241.2734\\-113\\12.94663\\-239.3203\\-113\\12.48238\\-237.3672\\-113\\11.91518\\-233.4609\\-113\\11.52449\\-227.6016\\-113\\11.12376\\-223.6953\\-113\\10.74219\\-221.4004\\-113\\10.27135\\-217.8359\\-113\\9.920561\\-213.9297\\-113\\9.41606\\-210.0234\\-113\\8.900036\\-208.0703\\-113\\8.496094\\-206.1172\\-113\\8.327096\\-204.1641\\-113\\8.22078\\-200.2578\\-113\\8.236608\\-198.3047\\-113\\8.4851\\-194.3984\\-113\\9.326461\\-190.4922\\-113\\9.506226\\-188.5391\\-113\\9.89772\\-180.7266\\-113\\10.16488\\-178.7734\\-113\\11.0919\\-174.8672\\-113\\11.40264\\-172.9141\\-113\\11.88427\\-169.0078\\-113\\12.30605\\-167.0547\\-113\\12.98757\\-165.1016\\-113\\13.88239\\-161.1953\\-113\\14.59418\\-159.2422\\-113\\16.60156\\-155.1309\\-113\\18.55469\\-151.7236\\-113\\19.78181\\-149.4766\\-113\\22.46094\\-145.9626\\-113\\24.44022\\-143.6172\\-113\\25.9011\\-141.6641\\-113\\27.66187\\-139.7109\\-113\\30.27344\\-136.5509\\-113\\34.42881\\-131.8984\\-113\\36.12132\\-129.9453\\-113\\37.9348\\-127.9922\\-113\\40.03906\\-125.8763\\-113\\41.99219\\-124.129\\-113\\44.53125\\-122.1328\\-113\\47.85156\\-120.0285\\-113\\49.80469\\-119.109\\-113\\51.75781\\-118.0736\\-113\\55.85395\\-116.2734\\-113\\59.57031\\-114.8994\\-113\\63.47656\\-113.6801\\-113\\67.38281\\-112.7043\\-113\\71.28906\\-111.9108\\-113\\73.24219\\-111.6504\\-113\\79.10156\\-111.0336\\-113\\83.00781\\-110.8656\\-113\\86.91406\\-110.8236\\-113\\90.82031\\-110.897\\-113\\96.67969\\-111.2686\\-113\\98.63281\\-111.4293\\-113\\100.5859\\-111.726\\-113\\104.4922\\-112.4682\\-113\\110.3516\\-114.0963\\-113\\112.3047\\-114.9804\\-113\\114.2578\\-115.5497\\-113\\115.9824\\-116.2734\\-113\\118.1641\\-117.3795\\-113\\122.0703\\-119.5634\\-113\\124.0234\\-120.9007\\-113\\125.9766\\-122.0221\\-113\\127.9297\\-123.4734\\-113\\131.8359\\-126.8798\\-113\\133.5192\\-127.9922\\-113\\135.7069\\-129.9453\\-113\\139.7569\\-133.8516\\-113\\141.2376\\-135.8047\\-113\\142.9543\\-137.7578\\-113\\147.4609\\-142.4119\\-113\\151.87\\-147.5234\\-113\\153.3203\\-149.4871\\-113\\155.9531\\-153.3828\\-113\\156.9595\\-155.3359\\-113\\159.2924\\-159.2422\\-113\\161.2031\\-163.1484\\-113\\161.9672\\-165.1016\\-113\\162.4715\\-167.0547\\-113\\163.2973\\-169.0078\\-113\\163.9176\\-170.9609\\-113\\164.3595\\-172.9141\\-113\\165.6371\\-176.8203\\-113\\166.3097\\-180.7266\\-113\\167.0869\\-184.6328\\-113\\167.5494\\-188.5391\\-113\\167.7907\\-192.4453\\-113\\167.922\\-198.3047\\-113\\167.9513\\-202.2109\\-113\\167.9171\\-206.1172\\-113\\167.8136\\-210.0234\\-113\\167.6099\\-213.9297\\-113\\167.155\\-217.8359\\-113\\166.4201\\-221.7422\\-113\\165.7853\\-225.6484\\-113\\165.3752\\-227.6016\\-113\\164.6369\\-229.5547\\-113\\163.7313\\-233.4609\\-113\\162.3474\\-237.3672\\-113\\161.9177\\-239.3203\\-113\\161.1716\\-241.2734\\-113\\160.2335\\-243.2266\\-113\\159.4204\\-245.1797\\-113\\158.2553\\-247.1328\\-113\\157.2787\\-249.0859\\-113\\155.2734\\-252.8446\\-113\\154.071\\-254.9453\\-113\\151.2806\\-258.8516\\-113\\150.0714\\-260.8047\\-113\\147.4609\\-264.2356\\-113\\145.5078\\-266.6216\\-113\\143.5547\\-268.8485\\-113\\142.1526\\-270.5703\\-113\\140.3748\\-272.5234\\-113\\137.6953\\-275.3229\\-113\\134.692\\-278.3828\\-113\\131.8359\\-281.1132\\-113\\129.8828\\-282.7598\\-113\\125.5676\\-286.1953\\-113\\122.0703\\-288.8235\\-113\\120.1172\\-289.882\\-113\\118.1641\\-291.1436\\-113\\116.2109\\-292.5522\\-113\\114.2578\\-293.5008\\-113\\112.3047\\-294.6609\\-113\\110.3516\\-295.312\\-113\\108.3984\\-296.3339\\-113\\106.4453\\-296.9746\\-113\\104.4922\\-297.7319\\-113\\102.5391\\-298.6334\\-113\\100.5859\\-299.1996\\-113\\98.63281\\-299.9773\\-113\\96.67969\\-300.5357\\-113\\90.82031\\-301.5671\\-113\\88.86719\\-302.0479\\-113\\86.91406\\-302.325\\-113\\83.00781\\-302.6351\\-113\\79.10156\\-302.7694\\-113\\75.19531\\-302.8023\\-113\\71.28906\\-302.7469\\-113\\67.38281\\-302.5179\\-113\\65.42969\\-302.3053\\-113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "196" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "65" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-301.9931\\-111\\-90.82031\\-301.4421\\-111\\-94.72656\\-300.6791\\-111\\-96.67969\\-300.2014\\-111\\-98.63281\\-299.3201\\-111\\-100.5859\\-298.7304\\-111\\-104.4922\\-297.0139\\-111\\-106.4453\\-296.3556\\-111\\-108.3984\\-295.2581\\-111\\-110.3516\\-294.5834\\-111\\-112.3047\\-293.3433\\-111\\-114.2578\\-292.3252\\-111\\-117.4501\\-290.1016\\-111\\-118.1641\\-289.5236\\-111\\-120.1172\\-288.4977\\-111\\-122.0703\\-287.0081\\-111\\-125.9766\\-283.5757\\-111\\-127.6768\\-282.2891\\-111\\-129.8828\\-280.3273\\-111\\-131.8359\\-278.2918\\-111\\-133.8331\\-276.4297\\-111\\-135.7507\\-274.4766\\-111\\-137.2174\\-272.5234\\-111\\-140.6683\\-268.6172\\-111\\-142.2721\\-266.6641\\-111\\-143.4186\\-264.7109\\-111\\-144.7427\\-262.7578\\-111\\-146.3063\\-260.8047\\-111\\-147.6151\\-258.8516\\-111\\-148.6703\\-256.8984\\-111\\-149.9353\\-254.9453\\-111\\-150.7385\\-252.9922\\-111\\-152.0623\\-251.0391\\-111\\-153.0343\\-249.0859\\-111\\-154.1566\\-247.1328\\-111\\-154.9527\\-245.1797\\-111\\-155.9854\\-243.2266\\-111\\-156.5571\\-241.2734\\-111\\-157.6504\\-239.3203\\-111\\-158.3464\\-237.3672\\-111\\-159.3791\\-235.4141\\-111\\-160.8412\\-231.5078\\-111\\-161.7525\\-229.5547\\-111\\-162.6967\\-225.6484\\-111\\-163.5773\\-223.6953\\-111\\-164.5178\\-219.7891\\-111\\-165.3096\\-217.8359\\-111\\-165.8316\\-215.8828\\-111\\-166.187\\-213.9297\\-111\\-167.193\\-210.0234\\-111\\-167.5442\\-208.0703\\-111\\-167.7838\\-206.1172\\-111\\-168.099\\-202.2109\\-111\\-168.2144\\-198.3047\\-111\\-168.158\\-194.3984\\-111\\-168.07\\-192.4453\\-111\\-167.7202\\-188.5391\\-111\\-167.4198\\-186.5859\\-111\\-166.3314\\-182.6797\\-111\\-165.8936\\-180.7266\\-111\\-165.3152\\-178.7734\\-111\\-164.4482\\-176.8203\\-111\\-163.8429\\-174.8672\\-111\\-163.0859\\-173.0654\\-111\\-161.236\\-169.0078\\-111\\-159.1797\\-165.231\\-111\\-157.9458\\-163.1484\\-111\\-155.7969\\-159.2422\\-111\\-153.3647\\-155.3359\\-111\\-150.6194\\-151.4297\\-111\\-149.0581\\-149.4766\\-111\\-148.0772\\-147.5234\\-111\\-146.4015\\-145.5703\\-111\\-144.5652\\-143.6172\\-111\\-143.5547\\-141.957\\-111\\-139.7461\\-137.7578\\-111\\-135.7422\\-133.7927\\-111\\-133.7891\\-132.8468\\-111\\-131.8359\\-132.2598\\-111\\-131.5044\\-131.8984\\-111\\-131.485\\-129.9453\\-111\\-129.1351\\-127.9922\\-111\\-127.9297\\-127.1155\\-111\\-124.0234\\-123.7683\\-111\\-121.6384\\-122.1328\\-111\\-120.1172\\-121.1911\\-111\\-118.1641\\-120.215\\-111\\-115.0278\\-118.2266\\-111\\-112.3047\\-116.8883\\-111\\-108.3984\\-115.1962\\-111\\-106.4453\\-114.5916\\-111\\-104.4922\\-113.7138\\-111\\-102.5391\\-113.2793\\-111\\-100.5859\\-113.0454\\-111\\-98.63281\\-111.9422\\-111\\-94.72656\\-111.5203\\-111\\-92.77344\\-110.6525\\-111\\-90.82031\\-110.3098\\-111\\-84.96094\\-109.7874\\-111\\-79.10156\\-109.0627\\-111\\-75.19531\\-108.8112\\-111\\-71.28906\\-108.8496\\-111\\-67.38281\\-108.7577\\-111\\-65.42969\\-108.7993\\-111\\-61.52344\\-109.1027\\-111\\-59.57031\\-109.3857\\-111\\-57.61719\\-109.7874\\-111\\-55.66406\\-109.9791\\-111\\-53.71094\\-110.3279\\-111\\-51.75781\\-111.1864\\-111\\-49.80469\\-111.6447\\-111\\-47.85156\\-111.9565\\-111\\-45.89844\\-112.7512\\-111\\-41.99219\\-113.9763\\-111\\-38.08594\\-115.9722\\-111\\-36.13281\\-117.492\\-111\\-34.74935\\-118.2266\\-111\\-32.22656\\-120.4727\\-111\\-30.49207\\-122.1328\\-111\\-28.32031\\-124.7429\\-111\\-27.57772\\-126.0391\\-111\\-26.05252\\-127.9922\\-111\\-25.23226\\-129.9453\\-111\\-23.89152\\-131.8984\\-111\\-23.07722\\-133.8516\\-111\\-22.46094\\-134.8754\\-111\\-21.01452\\-137.7578\\-111\\-20.19133\\-139.7109\\-111\\-19.47428\\-141.6641\\-111\\-18.94039\\-143.6172\\-111\\-17.91561\\-145.5703\\-111\\-17.26423\\-147.5234\\-111\\-16.33453\\-149.4766\\-111\\-14.85443\\-153.3828\\-111\\-14.02638\\-155.3359\\-111\\-13.05241\\-159.2422\\-111\\-12.42566\\-161.1953\\-111\\-12.01831\\-163.1484\\-111\\-11.76813\\-165.1016\\-111\\-11.17265\\-170.9609\\-111\\-10.55519\\-174.8672\\-111\\-10.34546\\-176.8203\\-111\\-10.17391\\-180.7266\\-111\\-10.08235\\-184.6328\\-111\\-10.09648\\-188.5391\\-111\\-9.944898\\-200.2578\\-111\\-9.813262\\-202.2109\\-111\\-9.045323\\-210.0234\\-111\\-8.679746\\-211.9766\\-111\\-8.478938\\-213.9297\\-111\\-8.503402\\-217.8359\\-111\\-8.600725\\-219.7891\\-111\\-9.602013\\-225.6484\\-111\\-10.08941\\-229.5547\\-111\\-10.4831\\-231.5078\\-111\\-11.08332\\-233.4609\\-111\\-11.45089\\-235.4141\\-111\\-12.03824\\-239.3203\\-111\\-12.52254\\-241.2734\\-111\\-13.19019\\-243.2266\\-111\\-13.94924\\-247.1328\\-111\\-14.58083\\-249.0859\\-111\\-15.44319\\-251.0391\\-111\\-16.02872\\-252.9922\\-111\\-17.09883\\-254.9453\\-111\\-17.6976\\-256.8984\\-111\\-18.625\\-258.8516\\-111\\-19.40104\\-260.8047\\-111\\-19.98047\\-262.7578\\-111\\-21.09375\\-264.7109\\-111\\-21.89265\\-266.6641\\-111\\-23.16655\\-268.6172\\-111\\-24.05599\\-270.5703\\-111\\-25.30031\\-272.5234\\-111\\-26.10627\\-274.4766\\-111\\-29.82045\\-280.3359\\-111\\-32.78556\\-284.2422\\-111\\-34.12456\\-286.1953\\-111\\-36.13281\\-288.5099\\-111\\-38.08594\\-290.4219\\-111\\-39.63216\\-292.0547\\-111\\-41.99219\\-294.0938\\-111\\-43.94531\\-295.3209\\-111\\-45.89844\\-296.707\\-111\\-49.80469\\-298.9333\\-111\\-51.75781\\-299.993\\-111\\-53.71094\\-300.7397\\-111\\-55.66406\\-301.2357\\-111\\-57.61719\\-301.9063\\-111\\-59.57031\\-302.4315\\-111\\-61.52344\\-302.7065\\-111\\-67.38281\\-303.2043\\-111\\-71.28906\\-303.3973\\-111\\-75.19531\\-303.3203\\-111\\-84.96094\\-302.6418\\-111\\-86.91406\\-302.3884\\-111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "184" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "66" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-301.9211\\-111\\61.52344\\-301.4337\\-111\\57.61719\\-300.7245\\-111\\55.66406\\-300.2206\\-111\\53.71094\\-299.3049\\-111\\51.75781\\-298.6076\\-111\\49.80469\\-297.4609\\-111\\47.85156\\-296.6737\\-111\\45.89844\\-295.4936\\-111\\43.94531\\-294.6003\\-111\\40.50085\\-292.0547\\-111\\38.08594\\-290.0763\\-111\\36.13281\\-288.6577\\-111\\33.53557\\-286.1953\\-111\\30.08418\\-282.2891\\-111\\28.32031\\-280.1317\\-111\\25.73568\\-276.4297\\-111\\24.72511\\-274.4766\\-111\\24.41406\\-274.1114\\-111\\22.46094\\-270.8625\\-111\\22.21853\\-270.5703\\-111\\21.27878\\-268.6172\\-111\\20.14587\\-266.6641\\-111\\18.88253\\-262.7578\\-111\\17.89455\\-260.8047\\-111\\17.41621\\-258.8516\\-111\\15.95909\\-254.9453\\-111\\15.05055\\-251.0391\\-111\\14.37231\\-249.0859\\-111\\14.00321\\-247.1328\\-111\\13.27237\\-241.2734\\-111\\12.9713\\-239.3203\\-111\\12.46939\\-237.3672\\-111\\11.92882\\-233.4609\\-111\\11.51816\\-227.6016\\-111\\11.06994\\-223.6953\\-111\\10.43822\\-219.7891\\-111\\9.660994\\-211.9766\\-111\\9.319026\\-210.0234\\-111\\8.781433\\-208.0703\\-111\\8.382667\\-206.1172\\-111\\8.244657\\-204.1641\\-111\\8.22078\\-200.2578\\-111\\8.31822\\-198.3047\\-111\\8.666992\\-194.3984\\-111\\9.234619\\-190.4922\\-111\\9.706737\\-180.7266\\-111\\10.22552\\-176.8203\\-111\\10.5678\\-174.8672\\-111\\11.37579\\-170.9609\\-111\\11.96145\\-167.0547\\-111\\12.46769\\-165.1016\\-111\\13.17022\\-163.1484\\-111\\14.13066\\-159.2422\\-111\\15.13046\\-157.2891\\-111\\15.8805\\-155.3359\\-111\\17.0318\\-153.3828\\-111\\17.95226\\-151.4297\\-111\\19.19427\\-149.4766\\-111\\20.13103\\-147.5234\\-111\\24.34957\\-141.6641\\-111\\25.9009\\-139.7109\\-111\\27.13186\\-137.7578\\-111\\30.27344\\-133.3562\\-111\\32.22656\\-130.9494\\-111\\34.17969\\-128.3566\\-111\\36.21557\\-126.0391\\-111\\38.08594\\-123.7651\\-111\\40.03906\\-121.7614\\-111\\41.99219\\-120.064\\-111\\43.94531\\-119.0811\\-111\\45.89844\\-117.5712\\-111\\47.85156\\-116.3725\\-111\\49.80469\\-115.3893\\-111\\53.71094\\-113.7203\\-111\\56.28255\\-112.3672\\-111\\57.61719\\-111.9708\\-111\\59.57031\\-111.7132\\-111\\61.52344\\-110.8955\\-111\\63.47656\\-110.3175\\-111\\65.42969\\-110.0024\\-111\\67.38281\\-109.5822\\-111\\71.28906\\-108.9212\\-111\\73.24219\\-108.7384\\-111\\79.10156\\-108.4054\\-111\\81.05469\\-108.0129\\-111\\84.96094\\-107.9499\\-111\\86.91406\\-108.0129\\-111\\88.86719\\-108.3229\\-111\\90.82031\\-108.3454\\-111\\94.72656\\-108.5395\\-111\\98.63281\\-108.8373\\-111\\100.5859\\-109.0429\\-111\\104.4922\\-109.955\\-111\\106.4453\\-110.347\\-111\\110.3516\\-111.7135\\-111\\112.3047\\-112.2587\\-111\\114.2578\\-113.2461\\-111\\116.2109\\-113.9541\\-111\\118.1641\\-114.8931\\-111\\122.0703\\-117.0489\\-111\\124.0234\\-118.5915\\-111\\125.9766\\-119.5693\\-111\\127.9297\\-121.1183\\-111\\129.8828\\-122.8118\\-111\\131.8218\\-124.0859\\-111\\133.7891\\-125.7451\\-111\\135.7422\\-127.5184\\-111\\138.1051\\-129.9453\\-111\\140.1042\\-131.8984\\-111\\141.9334\\-133.8516\\-111\\143.0966\\-135.8047\\-111\\144.8069\\-137.7578\\-111\\146.7104\\-139.7109\\-111\\148.4536\\-141.6641\\-111\\151.5732\\-145.5703\\-111\\155.6983\\-151.4297\\-111\\156.6349\\-153.3828\\-111\\157.856\\-155.3359\\-111\\158.8073\\-157.2891\\-111\\159.9573\\-159.2422\\-111\\161.7472\\-163.1484\\-111\\162.2445\\-165.1016\\-111\\162.8531\\-167.0547\\-111\\163.6635\\-169.0078\\-111\\164.6086\\-172.9141\\-111\\165.3752\\-174.8672\\-111\\165.793\\-176.8203\\-111\\166.4333\\-180.7266\\-111\\167.193\\-184.6328\\-111\\167.6099\\-188.5391\\-111\\167.8022\\-192.4453\\-111\\167.9337\\-198.3047\\-111\\167.9456\\-204.1641\\-111\\167.8888\\-208.0703\\-111\\167.6018\\-213.9297\\-111\\167.4434\\-215.8828\\-111\\167.1678\\-217.8359\\-111\\166.4283\\-221.7422\\-111\\165.7914\\-225.6484\\-111\\165.4061\\-227.6016\\-111\\164.6575\\-229.5547\\-111\\163.7538\\-233.4609\\-111\\162.9993\\-235.4141\\-111\\162.3474\\-237.3672\\-111\\161.9248\\-239.3203\\-111\\161.1407\\-241.2734\\-111\\159.3708\\-245.1797\\-111\\158.2548\\-247.1328\\-111\\156.2317\\-251.0391\\-111\\154.0588\\-254.9453\\-111\\151.207\\-258.8516\\-111\\150.0204\\-260.8047\\-111\\148.5497\\-262.7578\\-111\\145.5078\\-266.5246\\-111\\142.0934\\-270.5703\\-111\\140.3137\\-272.5234\\-111\\137.6953\\-275.2506\\-111\\134.6175\\-278.3828\\-111\\131.8359\\-281.0383\\-111\\129.8828\\-282.6725\\-111\\124.0234\\-287.2769\\-111\\122.0703\\-288.7663\\-111\\120.1172\\-289.7905\\-111\\118.1641\\-291.0727\\-111\\116.2109\\-292.4894\\-111\\114.2578\\-293.4352\\-111\\112.3047\\-294.619\\-111\\110.3516\\-295.2616\\-111\\108.3984\\-296.263\\-111\\104.4922\\-297.656\\-111\\102.5391\\-298.5881\\-111\\100.5859\\-299.1456\\-111\\98.63281\\-299.905\\-111\\96.67969\\-300.5008\\-111\\90.82031\\-301.5042\\-111\\88.86719\\-301.9781\\-111\\86.91406\\-302.292\\-111\\83.00781\\-302.6214\\-111\\79.10156\\-302.7469\\-111\\75.19531\\-302.7969\\-111\\71.28906\\-302.7239\\-111\\67.38281\\-302.51\\-111\\65.42969\\-302.2818\\-111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "193" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "67" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.82031\\-301.3386\\-109\\-94.72656\\-300.6067\\-109\\-96.67969\\-300.0569\\-109\\-98.63281\\-299.1954\\-109\\-100.5859\\-298.6312\\-109\\-102.5391\\-297.6788\\-109\\-106.4453\\-296.2122\\-109\\-108.3984\\-295.1664\\-109\\-110.3516\\-294.4795\\-109\\-112.3047\\-293.2345\\-109\\-114.2578\\-292.1494\\-109\\-117.3116\\-290.1016\\-109\\-118.1641\\-289.431\\-109\\-120.1172\\-288.3663\\-109\\-122.0703\\-286.9199\\-109\\-125.9766\\-283.406\\-109\\-127.504\\-282.2891\\-109\\-129.8828\\-280.1342\\-109\\-131.8359\\-278.125\\-109\\-133.6167\\-276.4297\\-109\\-135.7422\\-274.2935\\-109\\-137.0817\\-272.5234\\-109\\-138.7601\\-270.5703\\-109\\-140.5628\\-268.6172\\-109\\-142.1701\\-266.6641\\-109\\-143.2897\\-264.7109\\-109\\-144.6734\\-262.7578\\-109\\-146.2271\\-260.8047\\-109\\-147.5152\\-258.8516\\-109\\-148.6162\\-256.8984\\-109\\-149.882\\-254.9453\\-109\\-150.706\\-252.9922\\-109\\-152.0163\\-251.0391\\-109\\-152.9857\\-249.0859\\-109\\-154.1275\\-247.1328\\-109\\-154.9037\\-245.1797\\-109\\-155.9602\\-243.2266\\-109\\-156.529\\-241.2734\\-109\\-157.6184\\-239.3203\\-109\\-158.3252\\-237.3672\\-109\\-159.3541\\-235.4141\\-109\\-160.8412\\-231.5078\\-109\\-161.7525\\-229.5547\\-109\\-162.7189\\-225.6484\\-109\\-163.5957\\-223.6953\\-109\\-164.5538\\-219.7891\\-109\\-165.3752\\-217.8359\\-109\\-165.8638\\-215.8828\\-109\\-166.2504\\-213.9297\\-109\\-167.2664\\-210.0234\\-109\\-167.6055\\-208.0703\\-109\\-167.8366\\-206.1172\\-109\\-168.1436\\-202.2109\\-109\\-168.2795\\-198.3047\\-109\\-168.2879\\-196.3516\\-109\\-168.1946\\-192.4453\\-109\\-167.8986\\-188.5391\\-109\\-167.6728\\-186.5859\\-109\\-167.3222\\-184.6328\\-109\\-166.7427\\-182.6797\\-109\\-165.7992\\-178.7734\\-109\\-165.1898\\-176.8203\\-109\\-164.3654\\-174.8672\\-109\\-163.7634\\-172.9141\\-109\\-162.8557\\-170.9609\\-109\\-161.2067\\-167.0547\\-109\\-159.2636\\-163.1484\\-109\\-158.1114\\-161.1953\\-109\\-157.2266\\-159.3385\\-109\\-153.9688\\-153.3828\\-109\\-152.6838\\-151.4297\\-109\\-151.1816\\-149.4766\\-109\\-150.1864\\-147.5234\\-109\\-148.5707\\-145.5703\\-109\\-147.4709\\-143.6172\\-109\\-145.5078\\-141.182\\-109\\-143.5547\\-138.9373\\-109\\-141.6016\\-136.8667\\-109\\-139.6484\\-134.6934\\-109\\-136.8064\\-131.8984\\-109\\-135.2081\\-129.9453\\-109\\-133.7891\\-128.8768\\-109\\-131.8359\\-127.0034\\-109\\-128.5761\\-124.0859\\-109\\-126.2455\\-122.1328\\-109\\-124.0234\\-120.7494\\-109\\-122.0703\\-119.364\\-109\\-120.1172\\-118.4374\\-109\\-118.1641\\-117.1896\\-109\\-116.2109\\-116.0948\\-109\\-114.2578\\-115.1785\\-109\\-112.3047\\-114.1231\\-109\\-108.3984\\-112.6569\\-109\\-106.4453\\-111.7129\\-109\\-104.4922\\-111.234\\-109\\-102.3763\\-110.4141\\-109\\-100.5859\\-109.9074\\-109\\-98.63281\\-109.5079\\-109\\-94.72656\\-108.4513\\-109\\-88.86719\\-107.759\\-109\\-86.91406\\-107.5779\\-109\\-84.96094\\-107.2005\\-109\\-83.00781\\-107.0013\\-109\\-75.19531\\-106.4832\\-109\\-73.24219\\-106.4279\\-109\\-69.33594\\-106.6033\\-109\\-65.42969\\-106.6429\\-109\\-61.52344\\-106.8265\\-109\\-57.61719\\-107.2483\\-109\\-51.75781\\-108.34\\-109\\-49.80469\\-109.0627\\-109\\-45.89844\\-109.8756\\-109\\-43.94531\\-110.7777\\-109\\-41.99219\\-111.3619\\-109\\-40.03906\\-112.4009\\-109\\-36.13281\\-114.1893\\-109\\-33.08652\\-116.2734\\-109\\-30.93804\\-118.2266\\-109\\-28.9223\\-120.1797\\-109\\-27.23389\\-122.1328\\-109\\-24.41406\\-126.2275\\-109\\-23.4561\\-127.9922\\-109\\-22.18054\\-129.9453\\-109\\-21.42962\\-131.8984\\-109\\-20.37342\\-133.8516\\-109\\-19.7633\\-135.8047\\-109\\-18.55469\\-138.71\\-109\\-17.55411\\-141.6641\\-109\\-17.12295\\-143.6172\\-109\\-16.27361\\-145.5703\\-109\\-15.17078\\-149.4766\\-109\\-14.34375\\-151.4297\\-109\\-13.28823\\-155.3359\\-109\\-12.07618\\-159.2422\\-109\\-10.99537\\-167.0547\\-109\\-10.39567\\-170.9609\\-109\\-10.19464\\-172.9141\\-109\\-9.947432\\-176.8203\\-109\\-9.683331\\-184.6328\\-109\\-9.641438\\-188.5391\\-109\\-9.66957\\-192.4453\\-109\\-9.755711\\-196.3516\\-109\\-9.706737\\-200.2578\\-109\\-9.610615\\-202.2109\\-109\\-9.136431\\-206.1172\\-109\\-8.200699\\-211.9766\\-109\\-8.025568\\-213.9297\\-109\\-8.07408\\-217.8359\\-109\\-8.151666\\-219.7891\\-109\\-8.354335\\-221.7422\\-109\\-8.679746\\-223.6953\\-109\\-9.203942\\-225.6484\\-109\\-9.543919\\-227.6016\\-109\\-10.10346\\-231.5078\\-109\\-10.4831\\-233.4609\\-109\\-11.15234\\-235.4141\\-109\\-11.62163\\-237.3672\\-109\\-12.21686\\-241.2734\\-109\\-13.00182\\-243.2266\\-109\\-13.82698\\-247.1328\\-109\\-14.3319\\-249.0859\\-109\\-15.28293\\-251.0391\\-109\\-15.90835\\-252.9922\\-109\\-16.87961\\-254.9453\\-109\\-18.41412\\-258.8516\\-109\\-19.34186\\-260.8047\\-109\\-19.8927\\-262.7578\\-109\\-21.01164\\-264.7109\\-109\\-21.81168\\-266.6641\\-109\\-23.08664\\-268.6172\\-109\\-23.97933\\-270.5703\\-109\\-25.27773\\-272.5234\\-109\\-26.05381\\-274.4766\\-109\\-29.7822\\-280.3359\\-109\\-32.77972\\-284.2422\\-109\\-34.10881\\-286.1953\\-109\\-36.13281\\-288.4945\\-109\\-38.08594\\-290.3953\\-109\\-40.03906\\-292.4079\\-109\\-42.04102\\-294.0078\\-109\\-45.89844\\-296.6506\\-109\\-49.80469\\-298.8429\\-109\\-51.79908\\-299.8672\\-109\\-53.71094\\-300.6657\\-109\\-55.66406\\-301.1548\\-109\\-59.57031\\-302.3381\\-109\\-61.52344\\-302.6533\\-109\\-67.38281\\-303.1205\\-109\\-71.28906\\-303.2945\\-109\\-73.24219\\-303.2914\\-109\\-77.14844\\-303.1128\\-109\\-83.00781\\-302.7469\\-109\\-86.91406\\-302.292\\-109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "184" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "68" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "63.47656\\-301.8906\\-109\\61.52344\\-301.4095\\-109\\57.61719\\-300.7018\\-109\\55.66406\\-300.1862\\-109\\53.71094\\-299.2613\\-109\\51.75781\\-298.5632\\-109\\49.80469\\-297.4195\\-109\\47.85156\\-296.6519\\-109\\45.89844\\-295.4692\\-109\\43.94531\\-294.5649\\-109\\41.99219\\-293.154\\-109\\40.03906\\-291.553\\-109\\36.13281\\-288.6577\\-109\\33.53557\\-286.1953\\-109\\30.09796\\-282.2891\\-109\\28.32031\\-280.1336\\-109\\25.73568\\-276.4297\\-109\\24.72511\\-274.4766\\-109\\24.41406\\-274.1146\\-109\\22.46094\\-270.8625\\-109\\22.21853\\-270.5703\\-109\\21.29021\\-268.6172\\-109\\20.13482\\-266.6641\\-109\\18.88489\\-262.7578\\-109\\17.88737\\-260.8047\\-109\\17.42208\\-258.8516\\-109\\15.95909\\-254.9453\\-109\\15.06519\\-251.0391\\-109\\14.39752\\-249.0859\\-109\\14.00703\\-247.1328\\-109\\13.28125\\-241.2734\\-109\\12.94663\\-239.3203\\-109\\12.48238\\-237.3672\\-109\\12.14718\\-235.4141\\-109\\11.92197\\-233.4609\\-109\\11.66221\\-229.5547\\-109\\11.48135\\-227.6016\\-109\\10.93606\\-223.6953\\-109\\10.53049\\-221.7422\\-109\\10.31681\\-219.7891\\-109\\9.560601\\-211.9766\\-109\\9.134929\\-210.0234\\-109\\8.529975\\-208.0703\\-109\\8.251664\\-206.1172\\-109\\8.114246\\-204.1641\\-109\\8.128773\\-200.2578\\-109\\8.490115\\-194.3984\\-109\\8.827815\\-190.4922\\-109\\8.954216\\-186.5859\\-109\\8.957942\\-184.6328\\-109\\9.077113\\-182.6797\\-109\\9.63294\\-178.7734\\-109\\10.32366\\-172.9141\\-109\\11.33531\\-169.0078\\-109\\11.99434\\-165.1016\\-109\\12.48076\\-163.1484\\-109\\13.20394\\-161.1953\\-109\\14.26787\\-157.2891\\-109\\15.22786\\-155.3359\\-109\\15.97377\\-153.3828\\-109\\17.08623\\-151.4297\\-109\\17.87751\\-149.4766\\-109\\19.09375\\-147.5234\\-109\\20.04688\\-145.5703\\-109\\21.39353\\-143.6172\\-109\\22.35765\\-141.6641\\-109\\23.68164\\-139.7109\\-109\\24.87768\\-137.7578\\-109\\27.08258\\-133.8516\\-109\\28.59775\\-131.8984\\-109\\29.66049\\-129.9453\\-109\\32.79321\\-126.0391\\-109\\34.00578\\-124.0859\\-109\\36.13281\\-121.6227\\-109\\38.08594\\-119.6112\\-109\\39.53552\\-118.2266\\-109\\41.99219\\-116.0971\\-109\\43.94531\\-115.0026\\-109\\45.89844\\-113.6088\\-109\\47.85156\\-112.7499\\-109\\49.80469\\-111.6259\\-109\\51.75781\\-111.1067\\-109\\53.71094\\-110.0625\\-109\\57.61719\\-108.5883\\-109\\61.52344\\-107.7538\\-109\\63.47656\\-107.2432\\-109\\67.38281\\-106.7031\\-109\\71.28906\\-106.2604\\-109\\73.24219\\-105.7924\\-109\\75.19531\\-105.5855\\-109\\81.05469\\-105.3021\\-109\\86.91406\\-105.3652\\-109\\92.77344\\-105.6693\\-109\\94.72656\\-105.8131\\-109\\96.67969\\-106.2787\\-109\\98.87695\\-106.5078\\-109\\102.5391\\-106.991\\-109\\108.3984\\-108.612\\-109\\110.3516\\-109.4035\\-109\\112.3047\\-109.8869\\-109\\114.2578\\-111.0266\\-109\\116.2109\\-111.694\\-109\\122.0703\\-114.7512\\-109\\124.0234\\-115.8304\\-109\\125.9766\\-117.2592\\-109\\127.9297\\-118.8206\\-109\\131.8359\\-121.7403\\-109\\133.7891\\-123.5055\\-109\\137.6953\\-127.3023\\-109\\140.2911\\-129.9453\\-109\\142.0543\\-131.8984\\-109\\143.6719\\-133.8516\\-109\\144.9282\\-135.8047\\-109\\148.3729\\-139.7109\\-109\\149.8631\\-141.6641\\-109\\151.0918\\-143.6172\\-109\\152.6619\\-145.5703\\-109\\154.12\\-147.5234\\-109\\155.3314\\-149.4766\\-109\\156.3622\\-151.4297\\-109\\157.586\\-153.3828\\-109\\158.4848\\-155.3359\\-109\\159.6774\\-157.2891\\-109\\160.4461\\-159.2422\\-109\\161.4654\\-161.1953\\-109\\162.073\\-163.1484\\-109\\162.5383\\-165.1016\\-109\\163.3838\\-167.0547\\-109\\164.3447\\-170.9609\\-109\\165.5932\\-174.8672\\-109\\166.58\\-180.7266\\-109\\167.3002\\-184.6328\\-109\\167.4866\\-186.5859\\-109\\167.7376\\-190.4922\\-109\\167.8816\\-194.3984\\-109\\167.9454\\-198.3047\\-109\\167.9515\\-204.1641\\-109\\167.9002\\-208.0703\\-109\\167.7217\\-211.9766\\-109\\167.4214\\-215.8828\\-109\\167.1805\\-217.8359\\-109\\166.425\\-221.7422\\-109\\165.7914\\-225.6484\\-109\\165.4161\\-227.6016\\-109\\164.668\\-229.5547\\-109\\164.1499\\-231.5078\\-109\\163.7464\\-233.4609\\-109\\162.3474\\-237.3672\\-109\\161.9057\\-239.3203\\-109\\161.1328\\-241.229\\-109\\159.3448\\-245.1797\\-109\\158.2391\\-247.1328\\-109\\156.2195\\-251.0391\\-109\\155.0752\\-252.9922\\-109\\154.0466\\-254.9453\\-109\\152.5378\\-256.8984\\-109\\151.1493\\-258.8516\\-109\\149.9617\\-260.8047\\-109\\146.9075\\-264.7109\\-109\\143.67\\-268.6172\\-109\\139.6484\\-273.1466\\-109\\134.5232\\-278.3828\\-109\\131.8359\\-280.9259\\-109\\127.7738\\-284.2422\\-109\\124.0234\\-287.2087\\-109\\122.0703\\-288.6978\\-109\\120.1172\\-289.6791\\-109\\116.2109\\-292.378\\-109\\114.2578\\-293.3587\\-109\\112.3047\\-294.5446\\-109\\110.3516\\-295.2083\\-109\\108.3984\\-296.1869\\-109\\104.4922\\-297.5596\\-109\\102.5391\\-298.538\\-109\\100.5859\\-299.0807\\-109\\96.67969\\-300.4496\\-109\\94.72656\\-300.8212\\-109\\90.82031\\-301.4311\\-109\\86.91406\\-302.2232\\-109\\83.00781\\-302.591\\-109\\77.14844\\-302.7638\\-109\\71.28906\\-302.7127\\-109\\67.38281\\-302.4898\\-109\\65.42969\\-302.2581\\-109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "194" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "69" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-302.1761\\-107\\-90.82031\\-301.2256\\-107\\-94.72656\\-300.5239\\-107\\-96.66285\\-299.8672\\-107\\-98.63281\\-299.0934\\-107\\-100.5859\\-298.5244\\-107\\-102.5391\\-297.5116\\-107\\-104.4922\\-296.8543\\-107\\-108.3984\\-295.0989\\-107\\-110.3516\\-294.3404\\-107\\-110.7929\\-294.0078\\-107\\-114.1012\\-292.0547\\-107\\-116.2109\\-290.7467\\-107\\-118.1641\\-289.342\\-107\\-120.1172\\-288.1729\\-107\\-122.0703\\-286.7928\\-107\\-125.9766\\-283.2954\\-107\\-127.3075\\-282.2891\\-107\\-129.4688\\-280.3359\\-107\\-131.3914\\-278.3828\\-107\\-135.7422\\-274.0778\\-107\\-136.8726\\-272.5234\\-107\\-140.4685\\-268.6172\\-107\\-142.0656\\-266.6641\\-107\\-143.1372\\-264.7109\\-107\\-146.1331\\-260.8047\\-107\\-147.4609\\-258.755\\-107\\-149.8117\\-254.9453\\-107\\-150.6747\\-252.9922\\-107\\-151.9603\\-251.0391\\-107\\-152.9257\\-249.0859\\-107\\-154.0843\\-247.1328\\-107\\-154.8814\\-245.1797\\-107\\-155.9309\\-243.2266\\-107\\-156.4897\\-241.2734\\-107\\-157.588\\-239.3203\\-107\\-158.2971\\-237.3672\\-107\\-159.3541\\-235.4141\\-107\\-160.8255\\-231.5078\\-107\\-161.7225\\-229.5547\\-107\\-162.7189\\-225.6484\\-107\\-163.6224\\-223.6953\\-107\\-164.585\\-219.7891\\-107\\-165.426\\-217.8359\\-107\\-166.2954\\-213.9297\\-107\\-167.3242\\-210.0234\\-107\\-167.6607\\-208.0703\\-107\\-168.0452\\-204.1641\\-107\\-168.1824\\-202.2109\\-107\\-168.3751\\-196.3516\\-107\\-168.3093\\-192.4453\\-107\\-168.2021\\-190.4922\\-107\\-167.8583\\-186.5859\\-107\\-167.6086\\-184.6328\\-107\\-167.2567\\-182.6797\\-107\\-166.1987\\-178.7734\\-107\\-165.7538\\-176.8203\\-107\\-165.1476\\-174.8672\\-107\\-164.3261\\-172.9141\\-107\\-163.7666\\-170.9609\\-107\\-162.875\\-169.0078\\-107\\-161.325\\-165.1016\\-107\\-159.5052\\-161.1953\\-107\\-158.418\\-159.2422\\-107\\-157.5835\\-157.2891\\-107\\-156.4716\\-155.3359\\-107\\-155.7213\\-153.3828\\-107\\-152.2859\\-147.5234\\-107\\-150.6143\\-145.5703\\-107\\-149.7116\\-143.6172\\-107\\-148.1761\\-141.6641\\-107\\-145.5078\\-138.011\\-107\\-143.5547\\-135.6148\\-107\\-141.9271\\-133.8516\\-107\\-140.2902\\-131.8984\\-107\\-137.6953\\-129.1182\\-107\\-134.5378\\-126.0391\\-107\\-131.8359\\-123.5434\\-107\\-127.6449\\-120.1797\\-107\\-124.9593\\-118.2266\\-107\\-124.0234\\-117.7001\\-107\\-121.905\\-116.2734\\-107\\-118.1641\\-114.1546\\-107\\-116.2109\\-113.2928\\-107\\-114.5733\\-112.3672\\-107\\-112.3047\\-111.3359\\-107\\-108.3984\\-109.7446\\-107\\-106.4453\\-109.1934\\-107\\-104.4922\\-108.4144\\-107\\-102.5391\\-107.9018\\-107\\-100.5859\\-107.6001\\-107\\-98.63281\\-106.9155\\-107\\-96.67969\\-106.4046\\-107\\-92.77344\\-105.9033\\-107\\-90.82031\\-105.4794\\-107\\-88.86719\\-105.2641\\-107\\-84.96094\\-104.5653\\-107\\-83.00781\\-104.5025\\-107\\-79.10156\\-104.2507\\-107\\-75.19531\\-104.1387\\-107\\-73.24219\\-103.6659\\-107\\-71.28906\\-103.7246\\-107\\-69.33594\\-103.9476\\-107\\-65.42969\\-104.0475\\-107\\-63.47656\\-104.2507\\-107\\-59.22154\\-104.5547\\-107\\-57.61719\\-104.7793\\-107\\-53.71094\\-105.4528\\-107\\-51.75781\\-105.94\\-107\\-48.71545\\-106.5078\\-107\\-45.89844\\-107.3749\\-107\\-43.94531\\-107.8642\\-107\\-42.06543\\-108.4609\\-107\\-38.08594\\-110.1962\\-107\\-34.22852\\-112.3672\\-107\\-32.22656\\-113.7851\\-107\\-30.27344\\-115.3713\\-107\\-28.32031\\-117.2188\\-107\\-25.68742\\-120.1797\\-107\\-24.10419\\-122.1328\\-107\\-22.46094\\-124.7127\\-107\\-21.70139\\-126.0391\\-107\\-20.90774\\-127.9922\\-107\\-19.83964\\-129.9453\\-107\\-19.24272\\-131.8984\\-107\\-18.17057\\-133.8516\\-107\\-16.60156\\-137.9622\\-107\\-16.08297\\-139.7109\\-107\\-15.16281\\-143.6172\\-107\\-14.04693\\-147.5234\\-107\\-13.28402\\-151.4297\\-107\\-12.5921\\-153.3828\\-107\\-11.70706\\-157.2891\\-107\\-11.38286\\-159.2422\\-107\\-10.54275\\-163.1484\\-107\\-10.03928\\-167.0547\\-107\\-9.817295\\-170.9609\\-107\\-9.311124\\-178.7734\\-107\\-8.948038\\-182.6797\\-107\\-8.708294\\-184.6328\\-107\\-8.458647\\-188.5391\\-107\\-8.559718\\-190.4922\\-107\\-8.766352\\-192.4453\\-107\\-9.126045\\-194.3984\\-107\\-9.274194\\-196.3516\\-107\\-9.216707\\-200.2578\\-107\\-9.092134\\-202.2109\\-107\\-8.663293\\-204.1641\\-107\\-8.336829\\-206.1172\\-107\\-7.925638\\-210.0234\\-107\\-7.431239\\-213.9297\\-107\\-7.467049\\-215.8828\\-107\\-7.688959\\-219.7891\\-107\\-8.128447\\-223.6953\\-107\\-8.481019\\-225.6484\\-107\\-9.475447\\-229.5547\\-107\\-10.10665\\-233.4609\\-107\\-11.39904\\-237.3672\\-107\\-11.95427\\-241.2734\\-107\\-13.26712\\-245.1797\\-107\\-14.14461\\-249.0859\\-107\\-15.06255\\-251.0391\\-107\\-15.76803\\-252.9922\\-107\\-17.51677\\-256.8984\\-107\\-18.21588\\-258.8516\\-107\\-19.2752\\-260.8047\\-107\\-19.81738\\-262.7578\\-107\\-20.8945\\-264.7109\\-107\\-21.7272\\-266.6641\\-107\\-22.99194\\-268.6172\\-107\\-23.89849\\-270.5703\\-107\\-25.21255\\-272.5234\\-107\\-25.95564\\-274.4766\\-107\\-27.27096\\-276.4297\\-107\\-28.32031\\-278.1895\\-107\\-29.73485\\-280.3359\\-107\\-32.75986\\-284.2422\\-107\\-34.07813\\-286.1953\\-107\\-36.13281\\-288.5099\\-107\\-40.03906\\-292.3802\\-107\\-42.15337\\-294.0078\\-107\\-45.89844\\-296.5976\\-107\\-47.85156\\-297.5979\\-107\\-49.80469\\-298.7745\\-107\\-53.71094\\-300.601\\-107\\-57.61719\\-301.6206\\-107\\-59.57031\\-302.2476\\-107\\-61.52344\\-302.5838\\-107\\-63.47656\\-302.7804\\-107\\-69.33594\\-303.1477\\-107\\-73.24219\\-303.1958\\-107\\-75.19531\\-303.1282\\-107\\-83.00781\\-302.689\\-107\\-84.96094\\-302.4817\\-107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "183" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "70" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-301.3989\\-107\\57.61719\\-300.697\\-107\\55.66406\\-300.1509\\-107\\53.71094\\-299.2258\\-107\\51.75781\\-298.5251\\-107\\49.80469\\-297.3674\\-107\\47.85156\\-296.6255\\-107\\45.89844\\-295.4388\\-107\\43.94531\\-294.5423\\-107\\41.99219\\-293.1491\\-107\\40.03906\\-291.5238\\-107\\36.13281\\-288.6577\\-107\\33.5126\\-286.1953\\-107\\30.08418\\-282.2891\\-107\\28.32031\\-280.0984\\-107\\25.72692\\-276.4297\\-107\\24.73719\\-274.4766\\-107\\24.41406\\-274.1042\\-107\\22.46094\\-270.865\\-107\\22.21853\\-270.5703\\-107\\21.29481\\-268.6172\\-107\\20.12392\\-266.6641\\-107\\18.88489\\-262.7578\\-107\\17.88737\\-260.8047\\-107\\17.42208\\-258.8516\\-107\\15.95909\\-254.9453\\-107\\15.06786\\-251.0391\\-107\\14.38578\\-249.0859\\-107\\14.00703\\-247.1328\\-107\\13.25969\\-241.2734\\-107\\12.49556\\-237.3672\\-107\\11.91518\\-233.4609\\-107\\11.61541\\-229.5547\\-107\\11.10026\\-225.6484\\-107\\10.34546\\-221.7422\\-107\\10.04249\\-217.8359\\-107\\9.296124\\-211.9766\\-107\\8.653626\\-210.0234\\-107\\8.236839\\-208.0703\\-107\\7.868948\\-204.1641\\-107\\7.789386\\-202.2109\\-107\\7.835614\\-198.3047\\-107\\8.006636\\-194.3984\\-107\\8.140042\\-186.5859\\-107\\8.112059\\-184.6328\\-107\\8.197021\\-182.6797\\-107\\8.507097\\-180.7266\\-107\\9.341033\\-176.8203\\-107\\9.812375\\-172.9141\\-107\\10.10742\\-170.9609\\-107\\10.55519\\-169.0078\\-107\\11.12608\\-167.0547\\-107\\12.28956\\-161.1953\\-107\\12.94513\\-159.2422\\-107\\13.98625\\-155.3359\\-107\\16.3762\\-149.4766\\-107\\17.47037\\-147.5234\\-107\\18.27072\\-145.5703\\-107\\19.4556\\-143.6172\\-107\\20.20418\\-141.6641\\-107\\21.31899\\-139.7109\\-107\\22.25494\\-137.7578\\-107\\23.37957\\-135.8047\\-107\\24.34748\\-133.8516\\-107\\25.56529\\-131.8984\\-107\\26.36719\\-130.3076\\-107\\28.32031\\-127.2907\\-107\\30.27344\\-124.5045\\-107\\32.00605\\-122.1328\\-107\\34.17969\\-119.5245\\-107\\36.13281\\-117.3983\\-107\\37.27214\\-116.2734\\-107\\40.03906\\-113.8493\\-107\\41.99219\\-112.2848\\-107\\43.94531\\-110.9865\\-107\\45.89844\\-109.8965\\-107\\49.80469\\-108.032\\-107\\53.53104\\-106.5078\\-107\\55.66406\\-105.793\\-107\\57.61719\\-105.3668\\-107\\61.52344\\-104.3673\\-107\\65.42969\\-103.6942\\-107\\69.33594\\-103.2559\\-107\\71.28906\\-102.9128\\-107\\75.19531\\-102.4759\\-107\\79.10156\\-102.2731\\-107\\86.91406\\-102.5352\\-107\\90.82031\\-103.0077\\-107\\96.67969\\-103.594\\-107\\98.63281\\-104.0086\\-107\\102.1396\\-104.5547\\-107\\104.4922\\-105.1458\\-107\\106.4453\\-105.9015\\-107\\108.3984\\-106.3323\\-107\\110.3516\\-107.2031\\-107\\112.3047\\-107.7394\\-107\\114.2578\\-108.6922\\-107\\116.2109\\-109.3536\\-107\\118.1641\\-110.2081\\-107\\120.1172\\-111.3281\\-107\\122.0703\\-112.5771\\-107\\124.0234\\-113.648\\-107\\127.9833\\-116.2734\\-107\\129.8828\\-117.7508\\-107\\133.7891\\-121.25\\-107\\135.7422\\-123.1014\\-107\\138.5079\\-126.0391\\-107\\140.4973\\-127.9922\\-107\\142.2203\\-129.9453\\-107\\143.7927\\-131.8984\\-107\\145.208\\-133.8516\\-107\\148.3652\\-137.7578\\-107\\149.7857\\-139.7109\\-107\\151.3672\\-142.0528\\-107\\153.8928\\-145.5703\\-107\\155.2734\\-147.8336\\-107\\157.2266\\-151.4409\\-107\\158.2204\\-153.3828\\-107\\159.3791\\-155.3359\\-107\\160.2019\\-157.2891\\-107\\161.1328\\-159.2574\\-107\\161.908\\-161.1953\\-107\\162.3182\\-163.1484\\-107\\163.7198\\-167.0547\\-107\\164.6369\\-170.9609\\-107\\165.3539\\-172.9141\\-107\\165.7638\\-174.8672\\-107\\166.3925\\-178.7734\\-107\\167.1143\\-182.6797\\-107\\167.5408\\-186.5859\\-107\\167.8416\\-192.4453\\-107\\167.9397\\-196.3516\\-107\\167.9804\\-200.2578\\-107\\167.9002\\-208.0703\\-107\\167.6099\\-213.9297\\-107\\167.1678\\-217.8359\\-107\\166.425\\-221.7422\\-107\\165.7953\\-225.6484\\-107\\165.4161\\-227.6016\\-107\\164.655\\-229.5547\\-107\\164.1452\\-231.5078\\-107\\163.7389\\-233.4609\\-107\\162.9697\\-235.4141\\-107\\162.3277\\-237.3672\\-107\\161.8863\\-239.3203\\-107\\161.1328\\-241.1423\\-107\\159.3436\\-245.1797\\-107\\158.2135\\-247.1328\\-107\\156.1886\\-251.0391\\-107\\154.0064\\-254.9453\\-107\\151.0808\\-258.8516\\-107\\149.9256\\-260.8047\\-107\\148.431\\-262.7578\\-107\\141.9096\\-270.5703\\-107\\139.6484\\-273.0508\\-107\\137.6953\\-275.085\\-107\\134.4286\\-278.3828\\-107\\131.8359\\-280.7872\\-107\\129.8828\\-282.4263\\-107\\124.0234\\-287.135\\-107\\122.0703\\-288.6051\\-107\\120.1172\\-289.5482\\-107\\119.4196\\-290.1016\\-107\\116.2109\\-292.2417\\-107\\114.2578\\-293.2754\\-107\\112.3047\\-294.4631\\-107\\110.3516\\-295.1542\\-107\\108.3984\\-296.0906\\-107\\106.4453\\-296.8539\\-107\\104.4922\\-297.5039\\-107\\102.5391\\-298.4823\\-107\\100.5859\\-299.0338\\-107\\96.67969\\-300.3916\\-107\\94.72656\\-300.7708\\-107\\90.82031\\-301.3619\\-107\\86.91406\\-302.1735\\-107\\84.96094\\-302.4012\\-107\\81.05469\\-302.6466\\-107\\77.14844\\-302.7469\\-107\\73.24219\\-302.7411\\-107\\69.33594\\-302.6028\\-107\\67.38281\\-302.4693\\-107\\65.42969\\-302.2369\\-107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "199" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "71" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-302.0754\\-105\\-88.86719\\-301.5403\\-105\\-94.72656\\-300.4176\\-105\\-98.63281\\-298.994\\-105\\-100.5859\\-298.4194\\-105\\-102.5391\\-297.3674\\-105\\-104.4922\\-296.7615\\-105\\-106.4453\\-295.7731\\-105\\-108.3984\\-295.0203\\-105\\-110.3516\\-294.1528\\-105\\-112.3047\\-293.0152\\-105\\-114.2578\\-291.7002\\-105\\-116.2109\\-290.6146\\-105\\-118.1641\\-289.2384\\-105\\-122.0703\\-286.6435\\-105\\-124.7665\\-284.2422\\-105\\-127.077\\-282.2891\\-105\\-129.8828\\-279.7247\\-105\\-131.1604\\-278.3828\\-105\\-133.1962\\-276.4297\\-105\\-135.7422\\-273.8586\\-105\\-136.7843\\-272.5234\\-105\\-140.3359\\-268.6172\\-105\\-141.9149\\-266.6641\\-105\\-143.0226\\-264.7109\\-105\\-146.0113\\-260.8047\\-105\\-149.7129\\-254.9453\\-105\\-150.6011\\-252.9922\\-105\\-151.9138\\-251.0391\\-105\\-152.8611\\-249.0859\\-105\\-154.0456\\-247.1328\\-105\\-154.8357\\-245.1797\\-105\\-155.9095\\-243.2266\\-105\\-156.4822\\-241.2734\\-105\\-157.5346\\-239.3203\\-105\\-158.2707\\-237.3672\\-105\\-159.2744\\-235.4141\\-105\\-160.8163\\-231.5078\\-105\\-161.744\\-229.5547\\-105\\-162.7302\\-225.6484\\-105\\-163.6224\\-223.6953\\-105\\-164.6295\\-219.7891\\-105\\-165.4455\\-217.8359\\-105\\-166.3319\\-213.9297\\-105\\-167.3891\\-210.0234\\-105\\-167.6839\\-208.0703\\-105\\-168.219\\-202.2109\\-105\\-168.4669\\-196.3516\\-105\\-168.4538\\-192.4453\\-105\\-168.1974\\-188.5391\\-105\\-167.8401\\-184.6328\\-105\\-167.601\\-182.6797\\-105\\-167.2585\\-180.7266\\-105\\-166.6268\\-178.7734\\-105\\-165.7508\\-174.8672\\-105\\-165.1345\\-172.9141\\-105\\-164.3415\\-170.9609\\-105\\-163.7978\\-169.0078\\-105\\-162.2011\\-165.1016\\-105\\-161.6175\\-163.1484\\-105\\-160.623\\-161.1953\\-105\\-159.8238\\-159.2422\\-105\\-158.8058\\-157.2891\\-105\\-157.2266\\-153.8847\\-105\\-154.064\\-147.5234\\-105\\-152.5787\\-145.5703\\-105\\-151.6978\\-143.6172\\-105\\-150.1728\\-141.6641\\-105\\-148.8058\\-139.7109\\-105\\-147.6474\\-137.7578\\-105\\-144.2683\\-133.8516\\-105\\-143.5547\\-132.7471\\-105\\-141.1379\\-129.9453\\-105\\-139.6484\\-128.3597\\-105\\-133.3537\\-122.1328\\-105\\-130.9799\\-120.1797\\-105\\-129.8828\\-119.4201\\-105\\-125.8938\\-116.2734\\-105\\-124.0234\\-115.3461\\-105\\-122.0703\\-113.8953\\-105\\-120.1172\\-113.1214\\-105\\-118.1641\\-111.8038\\-105\\-116.2109\\-110.9537\\-105\\-114.2578\\-109.8193\\-105\\-112.3047\\-108.8686\\-105\\-108.3984\\-107.4504\\-105\\-106.4453\\-107.0304\\-105\\-104.4922\\-106.0953\\-105\\-100.5859\\-105.5381\\-105\\-98.63281\\-104.457\\-105\\-96.67969\\-104.0778\\-105\\-92.77344\\-103.7147\\-105\\-90.82031\\-103.1583\\-105\\-84.96094\\-102.5756\\-105\\-83.00781\\-102.5251\\-105\\-79.10156\\-102.276\\-105\\-75.19531\\-102.0995\\-105\\-73.24219\\-101.6083\\-105\\-71.28906\\-101.5213\\-105\\-67.38281\\-101.6507\\-105\\-63.47656\\-102.2007\\-105\\-59.57031\\-102.3998\\-105\\-57.61719\\-102.558\\-105\\-53.71094\\-103.0853\\-105\\-51.75781\\-103.6229\\-105\\-47.85156\\-104.2981\\-105\\-45.89844\\-105.1286\\-105\\-43.94531\\-105.6989\\-105\\-41.99219\\-106.0821\\-105\\-40.03906\\-107.1672\\-105\\-38.08594\\-107.9041\\-105\\-36.13281\\-108.7699\\-105\\-33.37191\\-110.4141\\-105\\-32.22656\\-111.2424\\-105\\-30.27344\\-112.9188\\-105\\-28.32031\\-113.9846\\-105\\-26.05509\\-116.2734\\-105\\-24.92474\\-118.2266\\-105\\-23.18464\\-120.1797\\-105\\-21.56929\\-122.1328\\-105\\-19.54713\\-126.0391\\-105\\-18.55469\\-128.1143\\-105\\-17.83258\\-129.9453\\-105\\-17.30725\\-131.8984\\-105\\-16.11328\\-133.8516\\-105\\-14.84721\\-137.7578\\-105\\-14.32554\\-139.7109\\-105\\-13.48692\\-143.6172\\-105\\-13.21051\\-145.5703\\-105\\-12.60653\\-147.5234\\-105\\-12.11958\\-149.4766\\-105\\-11.45924\\-153.3828\\-105\\-10.44339\\-157.2891\\-105\\-9.790193\\-161.1953\\-105\\-9.036959\\-167.0547\\-105\\-8.797269\\-170.9609\\-105\\-8.526142\\-172.9141\\-105\\-8.388601\\-174.8672\\-105\\-7.961107\\-178.7734\\-105\\-7.680334\\-180.7266\\-105\\-7.261619\\-184.6328\\-105\\-7.038288\\-188.5391\\-105\\-7.138412\\-190.4922\\-105\\-7.336528\\-192.4453\\-105\\-7.728577\\-194.3984\\-105\\-7.863514\\-196.3516\\-105\\-7.990057\\-200.2578\\-105\\-7.867908\\-202.2109\\-105\\-7.548167\\-204.1641\\-105\\-7.120768\\-208.0703\\-105\\-6.826073\\-210.0234\\-105\\-6.335347\\-211.9766\\-105\\-6.177819\\-215.8828\\-105\\-6.59375\\-219.7891\\-105\\-7.116037\\-221.7422\\-105\\-8.181841\\-227.6016\\-105\\-8.662333\\-229.5547\\-105\\-9.438119\\-231.5078\\-105\\-9.702958\\-233.4609\\-105\\-10.10388\\-235.4141\\-105\\-11.40671\\-239.3203\\-105\\-12.16554\\-243.2266\\-105\\-12.98757\\-245.1797\\-105\\-13.5263\\-247.1328\\-105\\-13.95597\\-249.0859\\-105\\-15.58494\\-252.9922\\-105\\-16.2976\\-254.9453\\-105\\-17.38601\\-256.8984\\-105\\-18.03024\\-258.8516\\-105\\-19.15322\\-260.8047\\-105\\-19.72779\\-262.7578\\-105\\-20.75549\\-264.7109\\-105\\-21.6306\\-266.6641\\-105\\-22.85807\\-268.6172\\-105\\-23.79209\\-270.5703\\-105\\-25.11503\\-272.5234\\-105\\-25.88232\\-274.4766\\-105\\-27.19116\\-276.4297\\-105\\-28.32031\\-278.3314\\-105\\-29.67113\\-280.3359\\-105\\-32.73216\\-284.2422\\-105\\-34.04897\\-286.1953\\-105\\-36.13281\\-288.5194\\-105\\-38.08594\\-290.375\\-105\\-40.03906\\-292.3307\\-105\\-42.2247\\-294.0078\\-105\\-45.89844\\-296.5306\\-105\\-47.85156\\-297.4852\\-105\\-49.80469\\-298.6878\\-105\\-53.71094\\-300.532\\-105\\-57.61719\\-301.4901\\-105\\-59.57031\\-302.1529\\-105\\-61.52344\\-302.51\\-105\\-63.47656\\-302.7299\\-105\\-69.33594\\-303.0607\\-105\\-71.28906\\-303.1128\\-105\\-75.19531\\-303.0607\\-105\\-81.05469\\-302.7804\\-105\\-84.96094\\-302.4012\\-105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "183" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "72" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "61.52344\\-301.3752\\-105\\57.61719\\-300.6678\\-105\\55.66406\\-300.1281\\-105\\53.71094\\-299.199\\-105\\51.75781\\-298.4977\\-105\\49.80469\\-297.3414\\-105\\47.85156\\-296.5942\\-105\\45.89844\\-295.4116\\-105\\43.94531\\-294.5326\\-105\\41.99219\\-293.1379\\-105\\40.03906\\-291.5273\\-105\\36.13281\\-288.6817\\-105\\33.49474\\-286.1953\\-105\\30.05725\\-282.2891\\-105\\28.32031\\-280.1299\\-105\\25.72692\\-276.4297\\-105\\24.75155\\-274.4766\\-105\\24.41406\\-274.0876\\-105\\22.46094\\-270.8958\\-105\\22.19273\\-270.5703\\-105\\21.28791\\-268.6172\\-105\\20.11317\\-266.6641\\-105\\18.84694\\-262.7578\\-105\\17.88027\\-260.8047\\-105\\17.41201\\-258.8516\\-105\\15.93206\\-254.9453\\-105\\15.01225\\-251.0391\\-105\\14.33831\\-249.0859\\-105\\13.7006\\-245.1797\\-105\\13.21572\\-241.2734\\-105\\12.39102\\-237.3672\\-105\\11.82548\\-233.4609\\-105\\11.48961\\-229.5547\\-105\\11.21779\\-227.6016\\-105\\10.71948\\-225.6484\\-105\\10.32366\\-223.6953\\-105\\10.06171\\-221.7422\\-105\\9.718372\\-217.8359\\-105\\9.41155\\-215.8828\\-105\\8.42712\\-211.9766\\-105\\8.032822\\-210.0234\\-105\\7.213246\\-204.1641\\-105\\6.810462\\-202.2109\\-105\\6.587795\\-200.2578\\-105\\6.534755\\-196.3516\\-105\\6.962217\\-194.3984\\-105\\7.012729\\-188.5391\\-105\\7.11158\\-184.6328\\-105\\7.475011\\-180.7266\\-105\\8.506945\\-174.8672\\-105\\9.706439\\-169.0078\\-105\\10.31195\\-165.1016\\-105\\10.91028\\-163.1484\\-105\\11.76314\\-159.2422\\-105\\12.08044\\-157.2891\\-105\\13.39814\\-153.3828\\-105\\13.94024\\-151.4297\\-105\\14.74699\\-149.4766\\-105\\16.25279\\-145.5703\\-105\\17.53065\\-143.6172\\-105\\18.11975\\-141.6641\\-105\\19.2627\\-139.7109\\-105\\19.84156\\-137.7578\\-105\\20.90424\\-135.8047\\-105\\22.46094\\-132.3664\\-105\\23.99327\\-129.9453\\-105\\25.37448\\-127.9922\\-105\\26.35634\\-126.0391\\-105\\27.47881\\-124.0859\\-105\\28.90413\\-122.1328\\-105\\30.65321\\-120.1797\\-105\\31.87779\\-118.2266\\-105\\33.5323\\-116.2734\\-105\\35.40039\\-114.3203\\-105\\38.08594\\-111.8628\\-105\\40.03906\\-110.2374\\-105\\43.94531\\-107.7722\\-105\\47.85156\\-105.8932\\-105\\50.37435\\-104.5547\\-105\\55.66406\\-102.8539\\-105\\61.52344\\-101.5197\\-105\\65.42969\\-101.113\\-105\\67.38281\\-100.4755\\-105\\69.33594\\-100.2259\\-105\\71.28906\\-100.0766\\-105\\75.19531\\-99.92843\\-105\\81.05469\\-99.92416\\-105\\86.91406\\-100.1602\\-105\\88.86719\\-100.3886\\-105\\90.82031\\-100.9769\\-105\\96.67969\\-101.4748\\-105\\98.63281\\-101.9727\\-105\\102.5391\\-102.6309\\-105\\104.4922\\-103.1558\\-105\\106.4453\\-103.8562\\-105\\108.3984\\-104.3331\\-105\\110.3516\\-105.2391\\-105\\112.3047\\-105.83\\-105\\114.2578\\-106.9725\\-105\\116.2109\\-107.4766\\-105\\120.1172\\-109.2015\\-105\\122.0703\\-110.551\\-105\\125.105\\-112.3672\\-105\\127.9297\\-114.386\\-105\\129.8828\\-115.5516\\-105\\133.7891\\-119.2557\\-105\\134.8246\\-120.1797\\-105\\137.6953\\-123.0861\\-105\\139.6484\\-125.1989\\-105\\140.5481\\-126.0391\\-105\\143.5547\\-129.5409\\-105\\146.7056\\-133.8516\\-105\\148.2407\\-135.8047\\-105\\149.6761\\-137.7578\\-105\\150.871\\-139.7109\\-105\\151.3672\\-140.3201\\-105\\153.7095\\-143.6172\\-105\\154.7815\\-145.5703\\-105\\155.9855\\-147.5234\\-105\\156.8788\\-149.4766\\-105\\158.0043\\-151.4297\\-105\\159.9963\\-155.3359\\-105\\160.7436\\-157.2891\\-105\\161.7161\\-159.2422\\-105\\162.6912\\-163.1484\\-105\\163.5164\\-165.1016\\-105\\164.3937\\-169.0078\\-105\\165.6042\\-172.9141\\-105\\166.5315\\-178.7734\\-105\\167.2054\\-182.6797\\-105\\167.5936\\-186.5859\\-105\\167.8467\\-192.4453\\-105\\167.9513\\-196.3516\\-105\\167.9746\\-202.2109\\-105\\167.8763\\-208.0703\\-105\\167.7217\\-211.9766\\-105\\167.5936\\-213.9297\\-105\\167.155\\-217.8359\\-105\\166.4086\\-221.7422\\-105\\165.7914\\-225.6484\\-105\\165.3856\\-227.6016\\-105\\164.6343\\-229.5547\\-105\\163.7198\\-233.4609\\-105\\162.9257\\-235.4141\\-105\\162.3035\\-237.3672\\-105\\161.8743\\-239.3203\\-105\\159.2751\\-245.1797\\-105\\157.1075\\-249.0859\\-105\\156.164\\-251.0391\\-105\\154.9408\\-252.9922\\-105\\153.9566\\-254.9453\\-105\\151.0036\\-258.8516\\-105\\149.8748\\-260.8047\\-105\\148.372\\-262.7578\\-105\\145.0544\\-266.6641\\-105\\141.8142\\-270.5703\\-105\\140.0428\\-272.5234\\-105\\135.7422\\-276.7968\\-105\\134.2209\\-278.3828\\-105\\131.8359\\-280.671\\-105\\125.9766\\-285.4081\\-105\\124.0234\\-287.049\\-105\\122.0703\\-288.4814\\-105\\120.1172\\-289.436\\-105\\118.1641\\-290.8497\\-105\\116.2109\\-292.0623\\-105\\112.8027\\-294.0078\\-105\\112.3047\\-294.3586\\-105\\110.3516\\-295.1003\\-105\\106.4453\\-296.8154\\-105\\104.4922\\-297.4289\\-105\\102.5391\\-298.4194\\-105\\100.5859\\-298.9716\\-105\\96.67969\\-300.3401\\-105\\94.72656\\-300.7147\\-105\\90.82031\\-301.2964\\-105\\86.91406\\-302.088\\-105\\83.00781\\-302.5179\\-105\\81.05469\\-302.6214\\-105\\77.14844\\-302.7239\\-105\\73.24219\\-302.7178\\-105\\69.33594\\-302.5838\\-105\\65.42969\\-302.2123\\-105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "203" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "73" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-301.9211\\-103\\-88.86719\\-301.4095\\-103\\-92.77344\\-300.7309\\-103\\-94.72656\\-300.3156\\-103\\-96.67969\\-299.5329\\-103\\-100.5859\\-298.281\\-103\\-102.5391\\-297.238\\-103\\-104.4922\\-296.6416\\-103\\-106.4453\\-295.6026\\-103\\-108.3984\\-294.9245\\-103\\-110.2661\\-294.0078\\-103\\-112.3047\\-292.8848\\-103\\-114.2578\\-291.5115\\-103\\-116.2109\\-290.4466\\-103\\-120.1172\\-287.7137\\-103\\-122.0703\\-286.4196\\-103\\-127.9297\\-281.3851\\-103\\-129.8828\\-279.4904\\-103\\-130.9079\\-278.3828\\-103\\-134.9542\\-274.4766\\-103\\-137.6953\\-271.3725\\-103\\-140.1961\\-268.6172\\-103\\-141.7488\\-266.6641\\-103\\-142.941\\-264.7109\\-103\\-145.8748\\-260.8047\\-103\\-148.4066\\-256.8984\\-103\\-149.6201\\-254.9453\\-103\\-150.5228\\-252.9922\\-103\\-151.8331\\-251.0391\\-103\\-152.7882\\-249.0859\\-103\\-153.9964\\-247.1328\\-103\\-154.7819\\-245.1797\\-103\\-155.8568\\-243.2266\\-103\\-156.4584\\-241.2734\\-103\\-157.4758\\-239.3203\\-103\\-158.2395\\-237.3672\\-103\\-159.2319\\-235.4141\\-103\\-160.0753\\-233.4609\\-103\\-160.8028\\-231.5078\\-103\\-161.7314\\-229.5547\\-103\\-162.7162\\-225.6484\\-103\\-163.6258\\-223.6953\\-103\\-164.6497\\-219.7891\\-103\\-165.4738\\-217.8359\\-103\\-166.3468\\-213.9297\\-103\\-167.4241\\-210.0234\\-103\\-167.7029\\-208.0703\\-103\\-168.2424\\-202.2109\\-103\\-168.5452\\-196.3516\\-103\\-168.5808\\-192.4453\\-103\\-168.2068\\-186.5859\\-103\\-167.8351\\-182.6797\\-103\\-167.5842\\-180.7266\\-103\\-166.6243\\-176.8203\\-103\\-165.7855\\-172.9141\\-103\\-165.1898\\-170.9609\\-103\\-164.4153\\-169.0078\\-103\\-163.8754\\-167.0547\\-103\\-163.1859\\-165.1016\\-103\\-162.3913\\-163.1484\\-103\\-161.8137\\-161.1953\\-103\\-160.8826\\-159.2422\\-103\\-159.2751\\-155.3359\\-103\\-158.2227\\-153.3828\\-103\\-156.4152\\-149.4766\\-103\\-155.4606\\-147.5234\\-103\\-153.3441\\-143.6172\\-103\\-152.07\\-141.6641\\-103\\-150.665\\-139.7109\\-103\\-149.4774\\-137.7578\\-103\\-148.0223\\-135.8047\\-103\\-146.4608\\-133.8516\\-103\\-145.5078\\-132.5239\\-103\\-143.5547\\-130.181\\-103\\-141.6016\\-127.9808\\-103\\-135.8716\\-122.1328\\-103\\-133.6844\\-120.1797\\-103\\-129.8828\\-116.9278\\-103\\-125.9766\\-114.0984\\-103\\-122.0703\\-111.7189\\-103\\-120.1172\\-110.9232\\-103\\-118.1641\\-109.5084\\-103\\-116.2109\\-108.5525\\-103\\-114.2578\\-107.349\\-103\\-112.3047\\-106.7715\\-103\\-108.3984\\-105.3545\\-103\\-106.4453\\-104.9364\\-103\\-104.4922\\-103.9621\\-103\\-102.5391\\-103.5858\\-103\\-100.5859\\-103.3396\\-103\\-98.63281\\-102.3313\\-103\\-96.67969\\-102.0048\\-103\\-92.77344\\-101.6776\\-103\\-90.82031\\-101.1675\\-103\\-84.96094\\-100.7182\\-103\\-79.10156\\-100.3885\\-103\\-75.19531\\-100.2832\\-103\\-73.24219\\-100.0221\\-103\\-69.33594\\-99.66373\\-103\\-67.38281\\-99.97746\\-103\\-63.47656\\-100.3229\\-103\\-61.52344\\-100.375\\-103\\-57.61719\\-100.6052\\-103\\-53.71094\\-101.0591\\-103\\-49.80469\\-101.8808\\-103\\-47.85156\\-102.1592\\-103\\-43.94531\\-103.4828\\-103\\-41.99219\\-103.9228\\-103\\-40.03906\\-105.03\\-103\\-38.08594\\-105.5934\\-103\\-36.13281\\-106.6003\\-103\\-34.17969\\-107.4844\\-103\\-32.22656\\-108.7832\\-103\\-30.27344\\-109.8496\\-103\\-27.25395\\-112.3672\\-103\\-24.41406\\-115.2636\\-103\\-22.03747\\-118.2266\\-103\\-21.0177\\-120.1797\\-103\\-19.77539\\-122.1328\\-103\\-17.68578\\-126.0391\\-103\\-16.8793\\-127.9922\\-103\\-15.8729\\-129.9453\\-103\\-15.28168\\-131.8984\\-103\\-14.31754\\-133.8516\\-103\\-13.9248\\-135.8047\\-103\\-13.29566\\-137.7578\\-103\\-12.50155\\-141.6641\\-103\\-11.8656\\-143.6172\\-103\\-11.29482\\-147.5234\\-103\\-10.64601\\-149.4766\\-103\\-10.18732\\-151.4297\\-103\\-9.651916\\-155.3359\\-103\\-8.375\\-161.1953\\-103\\-8.08071\\-163.1484\\-103\\-7.903181\\-165.1016\\-103\\-7.58886\\-167.0547\\-103\\-7.252038\\-170.9609\\-103\\-6.835938\\-174.7858\\-103\\-6.51826\\-176.8203\\-103\\-5.489309\\-180.7266\\-103\\-5.151099\\-182.6797\\-103\\-4.185268\\-184.6328\\-103\\-3.021816\\-186.5859\\-103\\-2.08554\\-188.5391\\-103\\-2.166193\\-190.4922\\-103\\-3.714425\\-192.4453\\-103\\-4.882813\\-193.7036\\-103\\-5.312965\\-194.3984\\-103\\-5.581943\\-196.3516\\-103\\-5.683813\\-198.3047\\-103\\-6.081883\\-200.2578\\-103\\-5.334342\\-204.1641\\-103\\-4.507212\\-206.1172\\-103\\-4.236356\\-208.0703\\-103\\-4.167424\\-211.9766\\-103\\-4.9467\\-213.9297\\-103\\-4.664522\\-215.8828\\-103\\-5.18645\\-217.8359\\-103\\-5.190738\\-219.7891\\-103\\-5.389519\\-221.7422\\-103\\-6.835938\\-225.7705\\-103\\-8.959221\\-233.4609\\-103\\-9.582876\\-235.4141\\-103\\-10.07045\\-237.3672\\-103\\-11.47461\\-241.2734\\-103\\-11.9015\\-243.2266\\-103\\-12.52254\\-245.1797\\-103\\-13.33165\\-247.1328\\-103\\-13.80718\\-249.0859\\-103\\-14.44172\\-251.0391\\-103\\-15.3902\\-252.9922\\-103\\-16.07354\\-254.9453\\-103\\-17.2083\\-256.8984\\-103\\-17.8833\\-258.8516\\-103\\-18.98193\\-260.8047\\-103\\-19.63373\\-262.7578\\-103\\-21.52661\\-266.6641\\-103\\-22.68191\\-268.6172\\-103\\-23.6942\\-270.5703\\-103\\-25.00498\\-272.5234\\-103\\-25.79864\\-274.4766\\-103\\-27.09173\\-276.4297\\-103\\-28.2219\\-278.3828\\-103\\-29.61658\\-280.3359\\-103\\-32.69392\\-284.2422\\-103\\-34.01947\\-286.1953\\-103\\-36.13281\\-288.5194\\-103\\-40.03906\\-292.2773\\-103\\-42.29621\\-294.0078\\-103\\-45.89844\\-296.4652\\-103\\-47.85156\\-297.3785\\-103\\-49.80469\\-298.617\\-103\\-51.75781\\-299.4701\\-103\\-53.71094\\-300.4434\\-103\\-57.61719\\-301.3931\\-103\\-59.57031\\-302.0216\\-103\\-61.52344\\-302.4315\\-103\\-63.47656\\-302.6648\\-103\\-67.38281\\-302.9048\\-103\\-71.28906\\-303.0424\\-103\\-75.19531\\-302.9933\\-103\\-81.05469\\-302.7239\\-103\\-84.96094\\-302.3152\\-103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "193" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "74" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "65.42969\\-302.1874\\-103\\61.52344\\-301.355\\-103\\57.61719\\-300.645\\-103\\55.66406\\-300.0926\\-103\\53.71094\\-299.1514\\-103\\51.75781\\-298.4612\\-103\\49.80469\\-297.2926\\-103\\47.85156\\-296.5824\\-103\\45.89844\\-295.3924\\-103\\43.94531\\-294.5326\\-103\\41.99219\\-293.1429\\-103\\40.03906\\-291.5664\\-103\\36.13281\\-288.6716\\-103\\33.48599\\-286.1953\\-103\\30.05559\\-282.2891\\-103\\28.32031\\-280.1461\\-103\\25.73568\\-276.4297\\-103\\24.72744\\-274.4766\\-103\\24.41406\\-274.1114\\-103\\22.46094\\-270.865\\-103\\22.2168\\-270.5703\\-103\\21.2693\\-268.6172\\-103\\20.0998\\-266.6641\\-103\\18.80787\\-262.7578\\-103\\17.85942\\-260.8047\\-103\\17.37767\\-258.8516\\-103\\15.90545\\-254.9453\\-103\\15.4862\\-252.9922\\-103\\14.93217\\-251.0391\\-103\\14.27185\\-249.0859\\-103\\13.65444\\-245.1797\\-103\\13.11671\\-241.2734\\-103\\12.18776\\-237.3672\\-103\\11.2069\\-229.5547\\-103\\10.20479\\-225.6484\\-103\\9.609375\\-221.7422\\-103\\8.932898\\-217.8359\\-103\\7.445371\\-211.9766\\-103\\6.835938\\-209.1515\\-103\\5.46875\\-206.1172\\-103\\5.190642\\-204.1641\\-103\\4.913015\\-200.2578\\-103\\4.171489\\-198.3047\\-103\\4.161488\\-194.3984\\-103\\3.776042\\-190.4922\\-103\\3.802083\\-188.5391\\-103\\4.310826\\-186.5859\\-103\\5.230243\\-184.6328\\-103\\5.73088\\-180.7266\\-103\\7.012729\\-176.8203\\-103\\7.750605\\-172.9141\\-103\\8.042689\\-170.9609\\-103\\9.137835\\-165.1016\\-103\\9.601727\\-163.1484\\-103\\10.10895\\-159.2422\\-103\\10.55582\\-157.2891\\-103\\11.29002\\-155.3359\\-103\\11.67111\\-153.3828\\-103\\13.04155\\-149.4766\\-103\\13.58981\\-147.5234\\-103\\14.30622\\-145.5703\\-103\\15.3021\\-143.6172\\-103\\15.87314\\-141.6641\\-103\\16.81298\\-139.7109\\-103\\17.59541\\-137.7578\\-103\\18.68693\\-135.8047\\-103\\19.40679\\-133.8516\\-103\\20.28761\\-131.8984\\-103\\23.10902\\-127.9922\\-103\\23.61591\\-126.0391\\-103\\24.41406\\-124.7215\\-103\\26.16955\\-122.1328\\-103\\27.29885\\-120.1797\\-103\\28.94737\\-118.2266\\-103\\30.05255\\-116.2734\\-103\\31.96539\\-114.3203\\-103\\33.73579\\-112.3672\\-103\\36.13281\\-110.1275\\-103\\38.08594\\-108.8841\\-103\\40.03906\\-107.31\\-103\\41.99219\\-106.3339\\-103\\44.64518\\-104.5547\\-103\\45.89844\\-103.8175\\-103\\48.39124\\-102.6016\\-103\\53.71094\\-100.813\\-103\\55.66406\\-100.3191\\-103\\57.61719\\-99.65215\\-103\\63.47656\\-98.75018\\-103\\65.42969\\-98.098\\-103\\67.38281\\-97.93377\\-103\\71.28906\\-97.72717\\-103\\75.19531\\-97.6531\\-103\\79.10156\\-97.66272\\-103\\84.96094\\-97.87754\\-103\\86.91406\\-98.047\\-103\\88.86719\\-98.31647\\-103\\90.82031\\-98.92564\\-103\\96.67969\\-99.55698\\-103\\98.63281\\-100.1025\\-103\\102.5391\\-100.8788\\-103\\104.4922\\-101.5258\\-103\\108.3984\\-102.4731\\-103\\110.3516\\-103.3438\\-103\\112.3047\\-103.9214\\-103\\114.2578\\-105.047\\-103\\116.2109\\-105.7678\\-103\\120.1172\\-107.5712\\-103\\124.0234\\-109.6668\\-103\\127.9297\\-112.4725\\-103\\129.8828\\-113.6552\\-103\\131.8359\\-115.3049\\-103\\134.8714\\-118.2266\\-103\\137.6953\\-121.0667\\-103\\140.6101\\-124.0859\\-103\\142.305\\-126.0391\\-103\\143.8469\\-127.9922\\-103\\144.9677\\-129.9453\\-103\\146.6545\\-131.8984\\-103\\148.1596\\-133.8516\\-103\\150.694\\-137.7578\\-103\\151.3672\\-138.6377\\-103\\153.4575\\-141.6641\\-103\\154.541\\-143.6172\\-103\\155.7368\\-145.5703\\-103\\156.6007\\-147.5234\\-103\\157.7378\\-149.4766\\-103\\158.6003\\-151.4297\\-103\\159.7717\\-153.3828\\-103\\160.5086\\-155.3359\\-103\\161.4272\\-157.2891\\-103\\162.0544\\-159.2422\\-103\\162.4796\\-161.1953\\-103\\163.2287\\-163.1484\\-103\\163.8239\\-165.1016\\-103\\164.6786\\-169.0078\\-103\\165.3539\\-170.9609\\-103\\165.7676\\-172.9141\\-103\\166.6365\\-178.7734\\-103\\167.0298\\-180.7266\\-103\\167.4651\\-184.6328\\-103\\167.6255\\-186.5859\\-103\\167.7838\\-190.4922\\-103\\167.9513\\-196.3516\\-103\\167.9803\\-202.2109\\-103\\167.9345\\-206.1172\\-103\\167.7175\\-211.9766\\-103\\167.3991\\-215.8828\\-103\\167.1408\\-217.8359\\-103\\166.3847\\-221.7422\\-103\\165.7914\\-225.6484\\-103\\165.3752\\-227.6016\\-103\\164.6142\\-229.5547\\-103\\163.6963\\-233.4609\\-103\\162.8981\\-235.4141\\-103\\162.2891\\-237.3672\\-103\\161.8546\\-239.3203\\-103\\160.108\\-243.2266\\-103\\159.1797\\-245.1685\\-103\\157.2266\\-248.811\\-103\\156.1272\\-251.0391\\-103\\154.9037\\-252.9922\\-103\\153.9011\\-254.9453\\-103\\150.9586\\-258.8516\\-103\\149.8145\\-260.8047\\-103\\148.3253\\-262.7578\\-103\\144.9758\\-266.6641\\-103\\141.7092\\-270.5703\\-103\\139.9474\\-272.5234\\-103\\135.7422\\-276.7241\\-103\\134.1309\\-278.3828\\-103\\131.8359\\-280.5419\\-103\\127.9297\\-283.6973\\-103\\124.0234\\-286.9308\\-103\\122.0703\\-288.3714\\-103\\120.1172\\-289.3407\\-103\\118.1641\\-290.7467\\-103\\116.2109\\-291.8549\\-103\\114.2578\\-293.0909\\-103\\112.3047\\-294.2191\\-103\\108.3984\\-295.8292\\-103\\106.4453\\-296.7693\\-103\\104.4922\\-297.3586\\-103\\102.5391\\-298.3579\\-103\\98.63281\\-299.5329\\-103\\96.67969\\-300.2667\\-103\\94.72656\\-300.6518\\-103\\88.86719\\-301.5546\\-103\\86.91406\\-301.9931\\-103\\83.00781\\-302.4693\\-103\\79.10156\\-302.6712\\-103\\75.19531\\-302.7127\\-103\\71.28906\\-302.6466\\-103\\67.38281\\-302.4275\\-103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "376" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "75" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-302.2123\\-101\\-88.86719\\-301.3094\\-101\\-92.77344\\-300.6405\\-101\\-94.72656\\-300.197\\-101\\-96.67969\\-299.3972\\-101\\-98.63281\\-298.794\\-101\\-100.5859\\-298.0884\\-101\\-102.5391\\-297.1251\\-101\\-104.4922\\-296.511\\-101\\-106.4453\\-295.4336\\-101\\-108.3984\\-294.8388\\-101\\-110.3516\\-293.7218\\-101\\-112.3047\\-292.7338\\-101\\-114.2578\\-291.3408\\-101\\-116.2109\\-290.2117\\-101\\-118.1641\\-288.9792\\-101\\-121.9918\\-286.1953\\-101\\-125.9766\\-282.9245\\-101\\-127.9297\\-281.2461\\-101\\-130.8023\\-278.3828\\-101\\-134.833\\-274.4766\\-101\\-137.6953\\-271.214\\-101\\-140.0432\\-268.6172\\-101\\-141.6016\\-266.5566\\-101\\-142.832\\-264.7109\\-101\\-145.7195\\-260.8047\\-101\\-148.3255\\-256.8984\\-101\\-149.4867\\-254.9453\\-101\\-150.4417\\-252.9922\\-101\\-151.7241\\-251.0391\\-101\\-152.7039\\-249.0859\\-101\\-153.9217\\-247.1328\\-101\\-154.7127\\-245.1797\\-101\\-155.792\\-243.2266\\-101\\-156.4088\\-241.2734\\-101\\-157.4022\\-239.3203\\-101\\-158.2083\\-237.3672\\-101\\-160.0438\\-233.4609\\-101\\-160.7831\\-231.5078\\-101\\-161.6955\\-229.5547\\-101\\-162.705\\-225.6484\\-101\\-163.6258\\-223.6953\\-101\\-164.6343\\-219.7891\\-101\\-165.4948\\-217.8359\\-101\\-166.3543\\-213.9297\\-101\\-167.4366\\-210.0234\\-101\\-167.7072\\-208.0703\\-101\\-168.1125\\-204.1641\\-101\\-168.6292\\-196.3516\\-101\\-168.7177\\-192.4453\\-101\\-168.521\\-188.5391\\-101\\-168.0398\\-182.6797\\-101\\-167.567\\-178.7734\\-101\\-167.1959\\-176.8203\\-101\\-166.2414\\-172.9141\\-101\\-165.8149\\-170.9609\\-101\\-165.2883\\-169.0078\\-101\\-164.5117\\-167.0547\\-101\\-163.4206\\-163.1484\\-101\\-162.5665\\-161.1953\\-101\\-162.0002\\-159.2422\\-101\\-161.3139\\-157.2891\\-101\\-160.402\\-155.3359\\-101\\-159.7215\\-153.3828\\-101\\-158.6451\\-151.4297\\-101\\-157.2266\\-148.3985\\-101\\-156.7082\\-147.5234\\-101\\-155.8651\\-145.5703\\-101\\-154.6631\\-143.6172\\-101\\-153.7972\\-141.6641\\-101\\-152.3438\\-139.7109\\-101\\-151.3672\\-137.9787\\-101\\-147.4609\\-132.4361\\-101\\-145.5469\\-129.9453\\-101\\-143.7484\\-127.9922\\-101\\-142.2019\\-126.0391\\-101\\-140.4987\\-124.0859\\-101\\-137.6953\\-121.3249\\-101\\-133.7891\\-118.0056\\-101\\-131.8359\\-116.2473\\-101\\-129.3945\\-114.3203\\-101\\-127.9297\\-113.4744\\-101\\-125.9766\\-111.9586\\-101\\-123.6719\\-110.4141\\-101\\-122.0703\\-109.4901\\-101\\-120.1172\\-108.1354\\-101\\-118.1641\\-107.3662\\-101\\-116.2109\\-106.1897\\-101\\-114.2578\\-105.2454\\-101\\-112.3047\\-104.5311\\-101\\-108.3984\\-103.2129\\-101\\-106.4453\\-102.6472\\-101\\-104.4922\\-101.892\\-101\\-100.5859\\-101.3116\\-101\\-98.63281\\-100.3843\\-101\\-96.67969\\-100.1035\\-101\\-92.77344\\-99.75053\\-101\\-90.82031\\-99.29078\\-101\\-84.96094\\-98.65656\\-101\\-81.05469\\-98.4037\\-101\\-77.14844\\-98.27319\\-101\\-73.24219\\-98.22534\\-101\\-69.33594\\-97.89497\\-101\\-67.38281\\-98.18917\\-101\\-63.47656\\-98.24412\\-101\\-59.57031\\-98.39224\\-101\\-55.66406\\-98.74272\\-101\\-51.75781\\-99.35429\\-101\\-49.80469\\-99.83351\\-101\\-47.85156\\-100.1035\\-101\\-45.89844\\-100.4746\\-101\\-43.94531\\-101.3072\\-101\\-41.99219\\-101.8125\\-101\\-40.03906\\-102.4217\\-101\\-35.59352\\-104.5547\\-101\\-32.22656\\-106.2694\\-101\\-30.27344\\-107.5797\\-101\\-28.32031\\-109.0418\\-101\\-26.36719\\-110.3477\\-101\\-24.36756\\-112.3672\\-101\\-22.46094\\-114.6683\\-101\\-19.98853\\-118.2266\\-101\\-19.09543\\-120.1797\\-101\\-16.60156\\-124.4905\\-101\\-15.09734\\-127.9922\\-101\\-14.0144\\-129.9453\\-101\\-13.47229\\-131.8984\\-101\\-12.68682\\-133.8516\\-101\\-12.14014\\-135.8047\\-101\\-11.80474\\-137.7578\\-101\\-10.73431\\-141.6641\\-101\\-9.832974\\-145.5703\\-101\\-9.104331\\-149.4766\\-101\\-8.154654\\-153.3828\\-101\\-7.604721\\-157.2891\\-101\\-7.270813\\-159.2422\\-101\\-6.677351\\-161.1953\\-101\\-6.155095\\-165.1016\\-101\\-5.253544\\-169.0078\\-101\\-4.74462\\-170.9609\\-101\\-3.323228\\-174.8672\\-101\\-2.929688\\-175.6205\\-101\\-1.905488\\-176.8203\\-101\\-0.9765625\\-178.1805\\-101\\0.9765625\\-179.9534\\-101\\2.929688\\-179.6472\\-101\\3.193204\\-178.7734\\-101\\4.882813\\-175.7461\\-101\\5.850656\\-172.9141\\-101\\6.739161\\-169.0078\\-101\\7.401316\\-167.0547\\-101\\8.180589\\-159.2422\\-101\\8.732567\\-157.2891\\-101\\9.635925\\-153.3828\\-101\\10.74219\\-149.9291\\-101\\11.65911\\-147.5234\\-101\\12.69531\\-144.3556\\-101\\13.75325\\-141.6641\\-101\\14.43977\\-139.7109\\-101\\15.92043\\-135.8047\\-101\\16.89265\\-133.8516\\-101\\18.55469\\-130.148\\-101\\19.72472\\-127.9922\\-101\\20.8849\\-126.0391\\-101\\22.46094\\-123.1908\\-101\\24.30664\\-120.1797\\-101\\25.74728\\-118.2266\\-101\\26.36719\\-117.1782\\-101\\28.32031\\-114.4153\\-101\\30.27344\\-112.436\\-101\\32.22656\\-110.3421\\-101\\34.17969\\-108.451\\-101\\38.08594\\-105.5001\\-101\\42.58149\\-102.6016\\-101\\46.36452\\-100.6484\\-101\\47.85156\\-100.149\\-101\\51.67863\\-98.69531\\-101\\55.66406\\-97.56319\\-101\\59.57031\\-96.73425\\-101\\61.52344\\-96.18538\\-101\\63.47656\\-95.8877\\-101\\65.42969\\-95.70959\\-101\\69.33594\\-95.50147\\-101\\75.19531\\-95.41685\\-101\\79.10156\\-95.4931\\-101\\83.00781\\-95.69108\\-101\\86.91406\\-95.98017\\-101\\88.86719\\-96.25391\\-101\\90.82031\\-96.64453\\-101\\96.67969\\-97.64642\\-101\\100.5859\\-98.5558\\-101\\104.4922\\-99.74017\\-101\\106.4453\\-100.1927\\-101\\110.3516\\-101.5965\\-101\\112.3047\\-102.1443\\-101\\114.2578\\-103.101\\-101\\116.2109\\-103.8601\\-101\\118.1641\\-104.9209\\-101\\121.3881\\-106.5078\\-101\\124.0234\\-107.8975\\-101\\129.8828\\-111.856\\-101\\131.8359\\-113.4547\\-101\\133.7891\\-115.1892\\-101\\138.6868\\-120.1797\\-101\\140.6776\\-122.1328\\-101\\142.3432\\-124.0859\\-101\\143.8117\\-126.0391\\-101\\145.046\\-127.9922\\-101\\146.6563\\-129.9453\\-101\\148.1095\\-131.8984\\-101\\149.2844\\-133.8516\\-101\\151.3672\\-136.9057\\-101\\153.3203\\-139.9018\\-101\\155.5405\\-143.6172\\-101\\156.3849\\-145.5703\\-101\\157.4989\\-147.5234\\-101\\158.3547\\-149.4766\\-101\\159.4892\\-151.4297\\-101\\160.2915\\-153.3828\\-101\\161.2037\\-155.3359\\-101\\161.9178\\-157.2891\\-101\\162.3504\\-159.2422\\-101\\163.6431\\-163.1484\\-101\\164.475\\-167.0547\\-101\\165.0912\\-169.0078\\-101\\165.5915\\-170.9609\\-101\\166.7258\\-178.7734\\-101\\167.1143\\-180.7266\\-101\\167.4988\\-184.6328\\-101\\167.7974\\-190.4922\\-101\\167.94\\-196.3516\\-101\\167.9745\\-202.2109\\-101\\167.9116\\-206.1172\\-101\\167.6946\\-211.9766\\-101\\167.3765\\-215.8828\\-101\\167.1007\\-217.8359\\-101\\166.3656\\-221.7422\\-101\\165.7752\\-225.6484\\-101\\165.3539\\-227.6016\\-101\\164.5917\\-229.5547\\-101\\163.6882\\-233.4609\\-101\\162.8714\\-235.4141\\-101\\162.2721\\-237.3672\\-101\\161.8347\\-239.3203\\-101\\160.8766\\-241.2734\\-101\\160.0758\\-243.2266\\-101\\158.1158\\-247.1328\\-101\\156.9255\\-249.0859\\-101\\156.0903\\-251.0391\\-101\\154.8677\\-252.9922\\-101\\153.8536\\-254.9453\\-101\\151.3672\\-258.2672\\-101\\150.8721\\-258.8516\\-101\\149.742\\-260.8047\\-101\\148.2703\\-262.7578\\-101\\144.8852\\-266.6641\\-101\\143.5547\\-268.3024\\-101\\139.7992\\-272.5234\\-101\\137.6953\\-274.7068\\-101\\133.9919\\-278.3828\\-101\\131.8359\\-280.377\\-101\\127.2028\\-284.2422\\-101\\124.0234\\-286.8272\\-101\\122.0703\\-288.1735\\-101\\120.1172\\-289.2471\\-101\\118.1641\\-290.6303\\-101\\116.2109\\-291.6573\\-101\\114.2578\\-293.0044\\-101\\112.3047\\-294.077\\-101\\110.3516\\-294.9601\\-101\\108.3984\\-295.7298\\-101\\106.4453\\-296.7074\\-101\\104.4922\\-297.2728\\-101\\102.5391\\-298.281\\-101\\98.63281\\-299.4504\\-101\\96.67969\\-300.1883\\-101\\94.72656\\-300.5954\\-101\\88.86719\\-301.4809\\-101\\84.96094\\-302.2232\\-101\\83.00781\\-302.4315\\-101\\79.10156\\-302.6533\\-101\\75.19531\\-302.6953\\-101\\71.28906\\-302.6214\\-101\\67.38281\\-302.4101\\-101\\65.42969\\-302.1529\\-101\\61.52344\\-301.3288\\-101\\57.61719\\-300.6153\\-101\\55.66406\\-300.0299\\-101\\53.71094\\-299.1089\\-101\\51.75781\\-298.4202\\-101\\49.80469\\-297.2572\\-101\\47.85156\\-296.5577\\-101\\45.89844\\-295.3697\\-101\\43.94531\\-294.5193\\-101\\40.53852\\-292.0547\\-101\\38.08594\\-290.0765\\-101\\36.13281\\-288.6716\\-101\\33.47736\\-286.1953\\-101\\30.06904\\-282.2891\\-101\\28.32031\\-280.114\\-101\\25.74455\\-276.4297\\-101\\24.72979\\-274.4766\\-101\\24.41406\\-274.1146\\-101\\22.46094\\-270.8765\\-101\\22.20285\\-270.5703\\-101\\21.25047\\-268.6172\\-101\\20.06271\\-266.6641\\-101\\18.80787\\-262.7578\\-101\\17.84589\\-260.8047\\-101\\17.3379\\-258.8516\\-101\\16.53498\\-256.8984\\-101\\15.8754\\-254.9453\\-101\\15.42664\\-252.9922\\-101\\14.20681\\-249.0859\\-101\\13.29385\\-243.2266\\-101\\12.90825\\-241.2734\\-101\\12.31971\\-239.3203\\-101\\11.9687\\-237.3672\\-101\\11.42919\\-233.4609\\-101\\11.07681\\-231.5078\\-101\\10.45653\\-229.5547\\-101\\9.033203\\-223.6953\\-101\\7.536301\\-219.7891\\-101\\6.835938\\-217.2635\\-101\\4.882813\\-214.6892\\-101\\0.9765625\\-214.5924\\-101\\-0.9765625\\-216.9186\\-101\\-2.390392\\-219.7891\\-101\\-2.835181\\-221.7422\\-101\\-3.801243\\-223.6953\\-101\\-5.110981\\-225.6484\\-101\\-6.050728\\-227.6016\\-101\\-6.64719\\-229.5547\\-101\\-7.480197\\-231.5078\\-101\\-8.602695\\-235.4141\\-101\\-9.461938\\-237.3672\\-101\\-10.04861\\-239.3203\\-101\\-10.96644\\-241.2734\\-101\\-11.62946\\-243.2266\\-101\\-12.12198\\-245.1797\\-101\\-13.05362\\-247.1328\\-101\\-14.1825\\-251.0391\\-101\\-15.13672\\-252.9922\\-101\\-15.86383\\-254.9453\\-101\\-16.97266\\-256.8984\\-101\\-17.73314\\-258.8516\\-101\\-18.74394\\-260.8047\\-101\\-20.29647\\-264.7109\\-101\\-20.50781\\-265.0029\\-101\\-22.42338\\-268.6172\\-101\\-24.41406\\-271.9567\\-101\\-24.84883\\-272.5234\\-101\\-25.70106\\-274.4766\\-101\\-26.98084\\-276.4297\\-101\\-28.09934\\-278.3828\\-101\\-30.27344\\-281.29\\-101\\-32.65512\\-284.2422\\-101\\-33.99043\\-286.1953\\-101\\-36.13281\\-288.5316\\-101\\-37.84795\\-290.1016\\-101\\-40.03906\\-292.2355\\-101\\-42.36638\\-294.0078\\-101\\-45.89844\\-296.403\\-101\\-47.85156\\-297.2976\\-101\\-49.80469\\-298.5596\\-101\\-51.75781\\-299.3665\\-101\\-53.71094\\-300.3647\\-101\\-57.61719\\-301.3026\\-101\\-59.57031\\-301.8754\\-101\\-61.52344\\-302.3381\\-101\\-63.47656\\-302.6097\\-101\\-65.42969\\-302.7527\\-101\\-69.33594\\-302.9264\\-101\\-73.24219\\-302.9651\\-101\\-77.14844\\-302.8659\\-101\\-81.05469\\-302.6712\\-101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "368" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "76" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-302.0754\\-99\\-86.91406\\-301.5816\\-99\\-92.77344\\-300.5433\\-99\\-94.72656\\-300.0416\\-99\\-96.67969\\-299.2675\\-99\\-98.63281\\-298.6776\\-99\\-102.5391\\-297.013\\-99\\-104.4922\\-296.369\\-99\\-106.4453\\-295.3036\\-99\\-108.3984\\-294.7027\\-99\\-110.3516\\-293.5322\\-99\\-112.3047\\-292.5824\\-99\\-114.2578\\-291.1885\\-99\\-116.2109\\-289.9204\\-99\\-118.1641\\-288.819\\-99\\-121.6781\\-286.1953\\-99\\-124.0234\\-284.2337\\-99\\-125.9766\\-282.7303\\-99\\-127.9297\\-281.0835\\-99\\-131.8359\\-277.1989\\-99\\-134.6713\\-274.4766\\-99\\-136.4435\\-272.5234\\-99\\-137.6953\\-271.007\\-99\\-139.8226\\-268.6172\\-99\\-141.6016\\-266.2863\\-99\\-145.5305\\-260.8047\\-99\\-148.2156\\-256.8984\\-99\\-149.4141\\-254.8027\\-99\\-150.3348\\-252.9922\\-99\\-151.5739\\-251.0391\\-99\\-152.5937\\-249.0859\\-99\\-153.8269\\-247.1328\\-99\\-154.6408\\-245.1797\\-99\\-155.7098\\-243.2266\\-99\\-156.3553\\-241.2734\\-99\\-157.3079\\-239.3203\\-99\\-159.0539\\-235.4141\\-99\\-160.01\\-233.4609\\-99\\-160.7592\\-231.5078\\-99\\-161.6918\\-229.5547\\-99\\-162.7276\\-225.6484\\-99\\-163.6224\\-223.6953\\-99\\-164.6446\\-219.7891\\-99\\-165.4921\\-217.8359\\-99\\-166.3697\\-213.9297\\-99\\-166.9922\\-211.9014\\-99\\-167.4557\\-210.0234\\-99\\-167.7188\\-208.0703\\-99\\-168.1414\\-204.1641\\-99\\-168.6796\\-196.3516\\-99\\-168.8446\\-192.4453\\-99\\-168.7308\\-188.5391\\-99\\-168.2222\\-182.6797\\-99\\-167.588\\-176.8203\\-99\\-167.2604\\-174.8672\\-99\\-166.2326\\-170.9609\\-99\\-165.3818\\-167.0547\\-99\\-164.5909\\-165.1016\\-99\\-164.0079\\-163.1484\\-99\\-163.5678\\-161.1953\\-99\\-162.7234\\-159.2422\\-99\\-161.6104\\-155.3359\\-99\\-160.6996\\-153.3828\\-99\\-159.9371\\-151.4297\\-99\\-158.9476\\-149.4766\\-99\\-158.0627\\-147.5234\\-99\\-156.8879\\-145.5703\\-99\\-156.0398\\-143.6172\\-99\\-154.9235\\-141.6641\\-99\\-153.9738\\-139.7109\\-99\\-151.5193\\-135.8047\\-99\\-149.4141\\-132.7529\\-99\\-147.4609\\-130.0475\\-99\\-145.5078\\-127.822\\-99\\-143.5547\\-125.3262\\-99\\-140.7035\\-122.1328\\-99\\-136.586\\-118.2266\\-99\\-135.7422\\-117.6188\\-99\\-133.7891\\-115.8961\\-99\\-131.8359\\-114.2747\\-99\\-129.4118\\-112.3672\\-99\\-127.9297\\-111.5648\\-99\\-125.9766\\-109.8755\\-99\\-122.0703\\-107.5781\\-99\\-120.1172\\-106.3411\\-99\\-118.1641\\-105.4321\\-99\\-116.2109\\-104.088\\-99\\-112.3047\\-102.5756\\-99\\-108.3984\\-101.3392\\-99\\-106.4453\\-100.9163\\-99\\-104.4922\\-100.0206\\-99\\-100.5859\\-99.51024\\-99\\-98.63281\\-98.53939\\-99\\-96.67969\\-98.21772\\-99\\-92.77344\\-97.84082\\-99\\-90.82031\\-97.40137\\-99\\-86.91406\\-96.94825\\-99\\-79.10156\\-96.39182\\-99\\-75.19531\\-96.2643\\-99\\-67.38281\\-96.21013\\-99\\-61.52344\\-96.34433\\-99\\-57.61719\\-96.61805\\-99\\-53.71094\\-97.12103\\-99\\-51.75781\\-97.4375\\-99\\-49.80469\\-97.90507\\-99\\-47.85156\\-98.1861\\-99\\-45.89844\\-98.6058\\-99\\-43.94531\\-99.46629\\-99\\-41.99219\\-99.88061\\-99\\-40.03906\\-100.5534\\-99\\-36.13281\\-102.2458\\-99\\-32.22656\\-104.1837\\-99\\-30.27344\\-105.59\\-99\\-28.32031\\-107.1293\\-99\\-26.36719\\-108.1886\\-99\\-24.41406\\-109.956\\-99\\-22.10023\\-112.3672\\-99\\-20.50781\\-114.6743\\-99\\-19.50836\\-116.2734\\-99\\-18.16559\\-118.2266\\-99\\-17.29485\\-120.1797\\-99\\-16.05603\\-122.1328\\-99\\-14.09149\\-126.0391\\-99\\-13.38959\\-127.9922\\-99\\-12.38251\\-129.9453\\-99\\-11.29056\\-133.8516\\-99\\-10.47516\\-135.8047\\-99\\-10.06662\\-137.7578\\-99\\-8.578125\\-143.6172\\-99\\-7.805102\\-147.5234\\-99\\-7.169596\\-151.4297\\-99\\-6.111145\\-155.3359\\-99\\-5.668308\\-159.2422\\-99\\-4.817082\\-161.1953\\-99\\-3.806785\\-165.1016\\-99\\-2.929688\\-166.4548\\-99\\-0.7152289\\-169.0078\\-99\\0.9765625\\-170.8278\\-99\\2.929688\\-170.5514\\-99\\3.727214\\-169.0078\\-99\\4.882813\\-167.3167\\-99\\5.748402\\-165.1016\\-99\\6.305563\\-159.2422\\-99\\6.917318\\-157.2891\\-99\\7.657877\\-153.3828\\-99\\8.780185\\-149.4766\\-99\\10.2761\\-145.5703\\-99\\10.8631\\-143.6172\\-99\\11.81075\\-141.6641\\-99\\12.46197\\-139.7109\\-99\\13.25684\\-137.7578\\-99\\13.73184\\-135.8047\\-99\\14.5678\\-133.8516\\-99\\15.25427\\-131.8984\\-99\\16.60156\\-129.0307\\-99\\17.23069\\-127.9922\\-99\\18.16239\\-126.0391\\-99\\20.61743\\-122.1328\\-99\\22.46094\\-118.6908\\-99\\24.22931\\-116.2734\\-99\\25.87426\\-114.3203\\-99\\27.29181\\-112.3672\\-99\\28.96743\\-110.4141\\-99\\30.92041\\-108.4609\\-99\\34.17969\\-105.9202\\-99\\36.13281\\-104.0743\\-99\\38.13645\\-102.6016\\-99\\40.03906\\-101.625\\-99\\41.99219\\-100.1736\\-99\\43.94531\\-99.49198\\-99\\45.89844\\-98.24866\\-99\\47.85156\\-97.91023\\-99\\49.80469\\-96.64713\\-99\\51.75781\\-96.26806\\-99\\53.71094\\-95.7408\\-99\\55.66406\\-95.33838\\-99\\59.57031\\-94.78042\\-99\\61.52344\\-94.06065\\-99\\63.47656\\-93.79712\\-99\\67.38281\\-93.62755\\-99\\71.28906\\-93.56285\\-99\\77.14844\\-93.5899\\-99\\83.00781\\-93.84232\\-99\\84.96094\\-93.97526\\-99\\88.86719\\-94.47168\\-99\\90.82031\\-94.97055\\-99\\94.72656\\-95.50418\\-99\\98.63281\\-96.33588\\-99\\100.27\\-96.74219\\-99\\102.5391\\-97.49065\\-99\\106.4453\\-98.55811\\-99\\108.3984\\-99.57422\\-99\\110.3516\\-99.94392\\-99\\112.3047\\-100.8455\\-99\\114.2578\\-101.4823\\-99\\116.2109\\-102.2314\\-99\\118.1641\\-103.2958\\-99\\120.1172\\-104.2002\\-99\\124.0234\\-106.6073\\-99\\125.9766\\-107.6666\\-99\\129.8828\\-110.2802\\-99\\131.8359\\-111.8018\\-99\\134.7399\\-114.3203\\-99\\135.7422\\-115.2886\\-99\\139.6484\\-119.3853\\-99\\140.4932\\-120.1797\\-99\\142.2043\\-122.1328\\-99\\143.7188\\-124.0859\\-99\\144.8785\\-126.0391\\-99\\146.5203\\-127.9922\\-99\\147.9943\\-129.9453\\-99\\149.1019\\-131.8984\\-99\\151.7537\\-135.8047\\-99\\155.2819\\-141.6641\\-99\\156.1996\\-143.6172\\-99\\159.1797\\-149.5376\\-99\\160.0701\\-151.4297\\-99\\160.8528\\-153.3828\\-99\\161.7647\\-155.3359\\-99\\162.6912\\-159.2422\\-99\\163.4753\\-161.1953\\-99\\164.2832\\-165.1016\\-99\\164.7551\\-167.0547\\-99\\165.4061\\-169.0078\\-99\\165.7535\\-170.9609\\-99\\166.814\\-178.7734\\-99\\167.1666\\-180.7266\\-99\\167.5254\\-184.6328\\-99\\167.7838\\-190.4922\\-99\\167.9171\\-196.3516\\-99\\167.9171\\-204.1641\\-99\\167.8382\\-208.0703\\-99\\167.649\\-211.9766\\-99\\167.3327\\-215.8828\\-99\\167.0444\\-217.8359\\-99\\166.3319\\-221.7422\\-99\\165.746\\-225.6484\\-99\\165.3209\\-227.6016\\-99\\164.5631\\-229.5547\\-99\\163.6684\\-233.4609\\-99\\162.8309\\-235.4141\\-99\\162.2582\\-237.3672\\-99\\161.7942\\-239.3203\\-99\\160.8508\\-241.2734\\-99\\160.0602\\-243.2266\\-99\\159.0157\\-245.1797\\-99\\158.0733\\-247.1328\\-99\\156.8657\\-249.0859\\-99\\156.0535\\-251.0391\\-99\\154.8055\\-252.9922\\-99\\153.8246\\-254.9453\\-99\\150.797\\-258.8516\\-99\\149.677\\-260.8047\\-99\\148.1753\\-262.7578\\-99\\144.7879\\-266.6641\\-99\\143.5547\\-268.1671\\-99\\139.6484\\-272.5152\\-99\\135.8022\\-276.4297\\-99\\131.8359\\-280.1605\\-99\\129.3861\\-282.2891\\-99\\124.5476\\-286.1953\\-99\\124.0234\\-286.687\\-99\\121.804\\-288.1484\\-99\\120.1172\\-289.1605\\-99\\118.1641\\-290.4474\\-99\\116.2109\\-291.5066\\-99\\114.2578\\-292.8649\\-99\\110.3516\\-294.8928\\-99\\108.3984\\-295.5773\\-99\\106.4453\\-296.614\\-99\\104.4922\\-297.1859\\-99\\102.5391\\-298.1732\\-99\\98.63281\\-299.3641\\-99\\96.67969\\-300.1046\\-99\\94.72656\\-300.5354\\-99\\88.86719\\-301.4095\\-99\\84.96094\\-302.1505\\-99\\83.00781\\-302.3793\\-99\\79.10156\\-302.6283\\-99\\75.19531\\-302.6776\\-99\\71.28906\\-302.6028\\-99\\67.38281\\-302.37\\-99\\65.42969\\-302.1003\\-99\\61.52344\\-301.293\\-99\\57.61719\\-300.5738\\-99\\55.66406\\-299.9198\\-99\\53.71094\\-299.0658\\-99\\51.75781\\-298.3718\\-99\\49.80469\\-297.2305\\-99\\47.85156\\-296.5286\\-99\\45.89844\\-295.3514\\-99\\43.94531\\-294.5061\\-99\\40.54954\\-292.0547\\-99\\38.08594\\-290.0598\\-99\\36.13281\\-288.6679\\-99\\33.49946\\-286.1953\\-99\\30.11196\\-282.2891\\-99\\28.32031\\-280.0482\\-99\\25.75766\\-276.4297\\-99\\24.73958\\-274.4766\\-99\\24.41406\\-274.101\\-99\\22.46094\\-270.9496\\-99\\22.1444\\-270.5703\\-99\\21.23141\\-268.6172\\-99\\20.03933\\-266.6641\\-99\\18.74249\\-262.7578\\-99\\17.81581\\-260.8047\\-99\\17.32086\\-258.8516\\-99\\16.50682\\-256.8984\\-99\\15.84145\\-254.9453\\-99\\15.37162\\-252.9922\\-99\\14.21089\\-249.0859\\-99\\13.79395\\-247.1328\\-99\\13.13308\\-243.2266\\-99\\12.52254\\-241.2734\\-99\\12.03824\\-239.3203\\-99\\11.37514\\-235.4141\\-99\\9.586907\\-229.5547\\-99\\8.789063\\-227.6473\\-99\\6.835938\\-224.6418\\-99\\4.882813\\-223.8739\\-99\\3.662109\\-223.6953\\-99\\0.9765625\\-222.9803\\-99\\-0.9765625\\-224.8136\\-99\\-3.301056\\-227.6016\\-99\\-4.882813\\-229.4129\\-99\\-6.078125\\-231.5078\\-99\\-7.06999\\-233.4609\\-99\\-7.64057\\-235.4141\\-99\\-8.351046\\-237.3672\\-99\\-9.362399\\-239.3203\\-99\\-10.13545\\-241.2734\\-99\\-11.1617\\-243.2266\\-99\\-12.54921\\-247.1328\\-99\\-13.50066\\-249.0859\\-99\\-13.9552\\-251.0391\\-99\\-15.66723\\-254.9453\\-99\\-17.57813\\-258.8516\\-99\\-18.40049\\-260.8047\\-99\\-19.39944\\-262.7578\\-99\\-20.07004\\-264.7109\\-99\\-21.24885\\-266.6641\\-99\\-22.17721\\-268.6172\\-99\\-24.62861\\-272.5234\\-99\\-25.58717\\-274.4766\\-99\\-26.84508\\-276.4297\\-99\\-27.9903\\-278.3828\\-99\\-30.27344\\-281.3791\\-99\\-32.64408\\-284.2422\\-99\\-33.9635\\-286.1953\\-99\\-36.13281\\-288.5165\\-99\\-37.87904\\-290.1016\\-99\\-40.03906\\-292.1795\\-99\\-42.44911\\-294.0078\\-99\\-45.89844\\-296.3117\\-99\\-47.85156\\-297.2293\\-99\\-49.80469\\-298.4746\\-99\\-51.75781\\-299.2415\\-99\\-53.71094\\-300.2487\\-99\\-55.66406\\-300.7986\\-99\\-57.61719\\-301.2006\\-99\\-61.52344\\-302.2123\\-99\\-63.47656\\-302.51\\-99\\-67.38281\\-302.7969\\-99\\-71.28906\\-302.8977\\-99\\-77.14844\\-302.8237\\-99\\-81.05469\\-302.6028\\-99\\-83.00781\\-302.3921\\-99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "368" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "77" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-301.9211\\-97\\-86.91406\\-301.4584\\-97\\-92.77344\\-300.4614\\-97\\-94.72656\\-299.8748\\-97\\-96.67969\\-299.1375\\-97\\-98.63281\\-298.5742\\-97\\-100.5859\\-297.6578\\-97\\-104.4922\\-296.1739\\-97\\-106.4453\\-295.2131\\-97\\-108.3984\\-294.5575\\-97\\-110.3516\\-293.3588\\-97\\-112.3047\\-292.3847\\-97\\-112.7035\\-292.0547\\-97\\-115.7398\\-290.1016\\-97\\-116.2109\\-289.7007\\-97\\-118.1641\\-288.6505\\-97\\-121.3823\\-286.1953\\-97\\-124.0234\\-283.9269\\-97\\-125.9766\\-282.5\\-97\\-127.9297\\-280.891\\-97\\-131.8359\\-277.017\\-97\\-134.4925\\-274.4766\\-97\\-136.2855\\-272.5234\\-97\\-137.6953\\-270.7518\\-97\\-139.6484\\-268.5421\\-97\\-141.1331\\-266.6641\\-97\\-144.0131\\-262.7578\\-97\\-147.4609\\-257.7561\\-97\\-148.1141\\-256.8984\\-97\\-149.1491\\-254.9453\\-97\\-152.4905\\-249.0859\\-97\\-153.7325\\-247.1328\\-97\\-154.5638\\-245.1797\\-97\\-155.6253\\-243.2266\\-97\\-156.3023\\-241.2734\\-97\\-158.9988\\-235.4141\\-97\\-159.9725\\-233.4609\\-97\\-160.7254\\-231.5078\\-97\\-161.6732\\-229.5547\\-97\\-162.7276\\-225.6484\\-97\\-163.5957\\-223.6953\\-97\\-164.6446\\-219.7891\\-97\\-165.4921\\-217.8359\\-97\\-166.3506\\-213.9297\\-97\\-167.4681\\-210.0234\\-97\\-168.1605\\-204.1641\\-97\\-168.8446\\-194.3984\\-97\\-168.9211\\-192.4453\\-97\\-168.9372\\-188.5391\\-97\\-168.703\\-186.5859\\-97\\-168.3772\\-182.6797\\-97\\-167.8217\\-176.8203\\-97\\-167.2604\\-172.9141\\-97\\-166.2188\\-169.0078\\-97\\-165.8815\\-167.0547\\-97\\-165.3602\\-165.1016\\-97\\-164.6282\\-163.1484\\-97\\-163.6306\\-159.2422\\-97\\-162.8147\\-157.2891\\-97\\-161.7077\\-153.3828\\-97\\-159.1879\\-147.5234\\-97\\-158.1633\\-145.5703\\-97\\-157.0031\\-143.6172\\-97\\-156.2072\\-141.6641\\-97\\-155.0729\\-139.7109\\-97\\-154.1174\\-137.7578\\-97\\-153.3203\\-136.3857\\-97\\-151.6113\\-133.8516\\-97\\-150.1968\\-131.8984\\-97\\-148.9049\\-129.9453\\-97\\-147.4609\\-128.0471\\-97\\-145.5078\\-125.8839\\-97\\-143.5547\\-123.4032\\-97\\-141.6016\\-121.127\\-97\\-140.6907\\-120.1797\\-97\\-137.6953\\-117.3299\\-97\\-136.5095\\-116.2734\\-97\\-134.0451\\-114.3203\\-97\\-131.7574\\-112.3672\\-97\\-129.2503\\-110.4141\\-97\\-125.9766\\-108.1066\\-97\\-122.0703\\-105.7734\\-97\\-120.1172\\-105.0109\\-97\\-118.1641\\-103.4886\\-97\\-116.2109\\-102.2874\\-97\\-114.2578\\-101.8159\\-97\\-112.3047\\-100.9131\\-97\\-110.3516\\-100.1686\\-97\\-108.3984\\-99.57503\\-97\\-106.4453\\-99.14538\\-97\\-104.4922\\-98.28531\\-97\\-102.5391\\-97.85091\\-97\\-100.5859\\-97.57619\\-97\\-98.63281\\-96.86665\\-97\\-96.67969\\-96.39703\\-97\\-92.77344\\-95.97697\\-97\\-90.82031\\-95.87177\\-97\\-86.91406\\-95.25611\\-97\\-81.05469\\-94.79893\\-97\\-73.24219\\-94.52808\\-97\\-67.38281\\-94.49693\\-97\\-61.52344\\-94.6571\\-97\\-59.57031\\-94.77994\\-97\\-55.66406\\-95.13218\\-97\\-53.71094\\-95.54688\\-97\\-51.75781\\-95.85762\\-97\\-49.80469\\-96.05415\\-97\\-47.85156\\-96.41386\\-97\\-45.89844\\-97.11461\\-97\\-43.94531\\-97.65412\\-97\\-41.99219\\-98.0625\\-97\\-40.03906\\-99.10783\\-97\\-38.08594\\-99.58841\\-97\\-34.17969\\-101.3312\\-97\\-32.22656\\-102.2789\\-97\\-30.27344\\-103.5541\\-97\\-28.32031\\-105.1423\\-97\\-26.36719\\-106.2329\\-97\\-24.41406\\-107.9358\\-97\\-21.90645\\-110.4141\\-97\\-20.25035\\-112.3672\\-97\\-19.14228\\-114.3203\\-97\\-17.74729\\-116.2734\\-97\\-16.49397\\-118.2266\\-97\\-15.49797\\-120.1797\\-97\\-14.37062\\-122.1328\\-97\\-13.52692\\-124.0859\\-97\\-12.49015\\-126.0391\\-97\\-11.71875\\-127.9922\\-97\\-11.15042\\-129.9453\\-97\\-10.04791\\-131.8984\\-97\\-9.687783\\-133.8516\\-97\\-8.416645\\-137.7578\\-97\\-7.654747\\-141.6641\\-97\\-7.106236\\-143.6172\\-97\\-6.268168\\-147.5234\\-97\\-5.793724\\-149.4766\\-97\\-5.187988\\-153.3828\\-97\\-4.192947\\-155.3359\\-97\\-3.804348\\-157.2891\\-97\\-3.135851\\-159.2422\\-97\\-2.060309\\-161.1953\\-97\\-0.9765625\\-162.8721\\-97\\0.9765625\\-164.051\\-97\\2.929688\\-162.6938\\-97\\3.854305\\-161.1953\\-97\\4.099528\\-159.2422\\-97\\4.951862\\-157.2891\\-97\\5.343967\\-155.3359\\-97\\5.633319\\-153.3828\\-97\\6.826456\\-149.4766\\-97\\8.213141\\-145.5703\\-97\\8.799235\\-143.6172\\-97\\9.726872\\-141.6641\\-97\\10.40649\\-139.7109\\-97\\11.22175\\-137.7578\\-97\\11.62284\\-135.8047\\-97\\12.30277\\-133.8516\\-97\\13.95631\\-129.9453\\-97\\15.81513\\-126.0391\\-97\\17.15829\\-124.0859\\-97\\17.96312\\-122.1328\\-97\\19.32566\\-120.1797\\-97\\20.33841\\-118.2266\\-97\\21.69709\\-116.2734\\-97\\23.30972\\-114.3203\\-97\\24.41406\\-112.5826\\-97\\26.25304\\-110.4141\\-97\\28.32031\\-108.2013\\-97\\30.27344\\-106.3626\\-97\\34.17969\\-102.8957\\-97\\36.13281\\-101.6543\\-97\\38.08594\\-100.275\\-97\\40.03906\\-99.29263\\-97\\41.99219\\-97.92616\\-97\\43.94531\\-97.25663\\-97\\45.89844\\-96.12149\\-97\\47.85156\\-95.26159\\-97\\49.80469\\-94.65216\\-97\\51.75781\\-94.34517\\-97\\53.71094\\-93.67933\\-97\\55.66406\\-93.25849\\-97\\59.57031\\-92.90231\\-97\\61.52344\\-92.16606\\-97\\63.47656\\-91.89752\\-97\\65.42969\\-91.77545\\-97\\69.33594\\-91.66846\\-97\\73.24219\\-91.66261\\-97\\77.14844\\-91.74364\\-97\\83.00781\\-92.06537\\-97\\84.96094\\-92.30264\\-97\\86.91406\\-92.88244\\-97\\92.77344\\-93.60607\\-97\\98.63281\\-94.85295\\-97\\100.5859\\-95.45805\\-97\\104.4922\\-96.38779\\-97\\108.3984\\-97.82646\\-97\\112.3047\\-99.40895\\-97\\114.2578\\-100.0996\\-97\\116.2109\\-101.0762\\-97\\118.1641\\-101.8893\\-97\\122.0703\\-103.9013\\-97\\126.0864\\-106.5078\\-97\\127.9297\\-107.6165\\-97\\129.8828\\-109.0313\\-97\\131.8359\\-110.3238\\-97\\135.7422\\-113.6834\\-97\\137.6953\\-115.6026\\-97\\140.1804\\-118.2266\\-97\\141.8176\\-120.1797\\-97\\143.2264\\-122.1328\\-97\\146.3416\\-126.0391\\-97\\147.7071\\-127.9922\\-97\\153.9418\\-137.7578\\-97\\154.8967\\-139.7109\\-97\\156.0141\\-141.6641\\-97\\156.7524\\-143.6172\\-97\\157.9155\\-145.5703\\-97\\158.7763\\-147.5234\\-97\\159.8522\\-149.4766\\-97\\160.552\\-151.4297\\-97\\161.5192\\-153.3828\\-97\\162.0913\\-155.3359\\-97\\162.4974\\-157.2891\\-97\\163.2136\\-159.2422\\-97\\163.7835\\-161.1953\\-97\\164.5081\\-165.1016\\-97\\165.5932\\-169.0078\\-97\\166.343\\-174.8672\\-97\\167.193\\-180.7266\\-97\\167.5374\\-184.6328\\-97\\167.8431\\-192.4453\\-97\\167.9056\\-200.2578\\-97\\167.8826\\-204.1641\\-97\\167.7217\\-210.0234\\-97\\167.6179\\-211.9766\\-97\\167.2664\\-215.8828\\-97\\166.2735\\-221.7422\\-97\\165.7023\\-225.6484\\-97\\165.2508\\-227.6016\\-97\\164.5267\\-229.5547\\-97\\163.66\\-233.4609\\-97\\162.7915\\-235.4141\\-97\\161.7818\\-239.3203\\-97\\160.8233\\-241.2734\\-97\\160.0483\\-243.2266\\-97\\158.9886\\-245.1797\\-97\\158.0421\\-247.1328\\-97\\156.829\\-249.0859\\-97\\156.0059\\-251.0391\\-97\\154.7619\\-252.9922\\-97\\153.7624\\-254.9453\\-97\\150.7183\\-258.8516\\-97\\149.549\\-260.8047\\-97\\148.096\\-262.7578\\-97\\144.6734\\-266.6641\\-97\\143.5547\\-268.0343\\-97\\141.276\\-270.5703\\-97\\137.6953\\-274.3734\\-97\\135.6471\\-276.4297\\-97\\131.8359\\-279.9841\\-97\\129.2074\\-282.2891\\-97\\124.3035\\-286.1953\\-97\\124.0234\\-286.4839\\-97\\120.1172\\-289.0651\\-97\\116.2109\\-291.3657\\-97\\114.2578\\-292.7585\\-97\\112.3047\\-293.7121\\-97\\110.3516\\-294.8051\\-97\\108.3984\\-295.4727\\-97\\106.4453\\-296.5321\\-97\\104.4922\\-297.1186\\-97\\102.5391\\-298.0226\\-97\\100.5859\\-298.7461\\-97\\98.63281\\-299.2904\\-97\\96.67969\\-299.9893\\-97\\94.72656\\-300.497\\-97\\88.86719\\-301.365\\-97\\84.96094\\-302.1003\\-97\\81.05469\\-302.51\\-97\\77.14844\\-302.6466\\-97\\73.24219\\-302.6351\\-97\\69.33594\\-302.4978\\-97\\65.42969\\-302.0608\\-97\\63.47656\\-301.6206\\-97\\57.61719\\-300.5317\\-97\\51.75781\\-298.3184\\-97\\49.80469\\-297.2075\\-97\\47.85156\\-296.5021\\-97\\45.89844\\-295.3164\\-97\\43.94531\\-294.4622\\-97\\41.99219\\-293.1034\\-97\\38.08594\\-290.0436\\-97\\36.13281\\-288.6577\\-97\\33.5264\\-286.1953\\-97\\30.1875\\-282.2891\\-97\\28.32031\\-279.9989\\-97\\25.76673\\-276.4297\\-97\\24.74201\\-274.4766\\-97\\24.41406\\-274.1042\\-97\\22.46094\\-270.9819\\-97\\22.11981\\-270.5703\\-97\\21.20451\\-268.6172\\-97\\20.00651\\-266.6641\\-97\\18.68541\\-262.7578\\-97\\17.78666\\-260.8047\\-97\\17.28352\\-258.8516\\-97\\16.41456\\-256.8984\\-97\\15.76949\\-254.9453\\-97\\15.28293\\-252.9922\\-97\\14.1129\\-249.0859\\-97\\13.31851\\-245.1797\\-97\\12.12198\\-241.2734\\-97\\11.73598\\-239.3203\\-97\\11.25026\\-237.3672\\-97\\9.8066\\-233.4609\\-97\\8.789063\\-231.4913\\-97\\7.428851\\-229.5547\\-97\\6.835938\\-228.8724\\-97\\4.882813\\-228.3254\\-97\\0.9765625\\-228.3899\\-97\\-0.9765625\\-229.1609\\-97\\-2.929688\\-230.8698\\-97\\-4.882813\\-232.7896\\-97\\-5.375573\\-233.4609\\-97\\-6.187855\\-235.4141\\-97\\-7.397269\\-237.3672\\-97\\-8.260995\\-239.3203\\-97\\-9.433461\\-241.2734\\-97\\-10.30442\\-243.2266\\-97\\-11.41633\\-245.1797\\-97\\-12.0627\\-247.1328\\-97\\-13.07588\\-249.0859\\-97\\-14.4043\\-252.9922\\-97\\-15.43527\\-254.9453\\-97\\-16.2225\\-256.8984\\-97\\-17.38172\\-258.8516\\-97\\-18.07877\\-260.8047\\-97\\-19.20359\\-262.7578\\-97\\-19.85887\\-264.7109\\-97\\-21.03991\\-266.6641\\-97\\-21.93649\\-268.6172\\-97\\-23.27383\\-270.5703\\-97\\-24.31861\\-272.5234\\-97\\-26.36719\\-275.9813\\-97\\-27.86113\\-278.3828\\-97\\-30.27344\\-281.4655\\-97\\-32.62149\\-284.2422\\-97\\-33.94859\\-286.1953\\-97\\-36.13281\\-288.5165\\-97\\-37.92459\\-290.1016\\-97\\-40.03906\\-292.1073\\-97\\-43.94531\\-295.0092\\-97\\-45.89844\\-296.2141\\-97\\-47.85156\\-297.1571\\-97\\-49.80469\\-298.3811\\-97\\-51.75781\\-299.1432\\-97\\-53.71094\\-300.1181\\-97\\-55.66406\\-300.7083\\-97\\-59.57031\\-301.5403\\-97\\-61.52344\\-302.088\\-97\\-63.47656\\-302.4227\\-97\\-65.42969\\-302.6145\\-97\\-69.33594\\-302.7969\\-97\\-73.24219\\-302.8503\\-97\\-77.14844\\-302.7748\\-97\\-81.05469\\-302.53\\-97\\-83.00781\\-302.285\\-97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "351" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "78" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-302.1874\\-95\\-86.91406\\-301.3486\\-95\\-92.77344\\-300.3764\\-95\\-94.72656\\-299.6509\\-95\\-98.63281\\-298.4547\\-95\\-100.5859\\-297.4541\\-95\\-102.5391\\-296.8065\\-95\\-106.4453\\-295.1178\\-95\\-108.3984\\-294.3944\\-95\\-108.9607\\-294.0078\\-95\\-112.3047\\-292.0934\\-95\\-115.4514\\-290.1016\\-95\\-116.2109\\-289.4929\\-95\\-118.1641\\-288.4392\\-95\\-120.1172\\-287.0315\\-95\\-123.4242\\-284.2422\\-95\\-124.0234\\-283.6731\\-95\\-127.9297\\-280.659\\-95\\-132.2091\\-276.4297\\-95\\-133.7891\\-274.9794\\-95\\-136.0627\\-272.5234\\-95\\-137.6043\\-270.5703\\-95\\-139.6484\\-268.2586\\-95\\-142.483\\-264.7109\\-95\\-145.0853\\-260.8047\\-95\\-145.5078\\-260.3124\\-95\\-147.966\\-256.8984\\-95\\-148.9824\\-254.9453\\-95\\-150.1965\\-252.9922\\-95\\-151.1917\\-251.0391\\-95\\-153.6415\\-247.1328\\-95\\-154.4744\\-245.1797\\-95\\-155.5472\\-243.2266\\-95\\-156.2617\\-241.2734\\-95\\-157.1242\\-239.3203\\-95\\-158.0987\\-237.3672\\-95\\-158.9478\\-235.4141\\-95\\-159.9255\\-233.4609\\-95\\-160.6995\\-231.5078\\-95\\-161.6602\\-229.5547\\-95\\-162.705\\-225.6484\\-95\\-163.5773\\-223.6953\\-95\\-164.6015\\-219.7891\\-95\\-165.4644\\-217.8359\\-95\\-166.3392\\-213.9297\\-95\\-167.4463\\-210.0234\\-95\\-167.7376\\-208.0703\\-95\\-168.1507\\-204.1641\\-95\\-168.9056\\-194.3984\\-95\\-169.0162\\-192.4453\\-95\\-169.0461\\-188.5391\\-95\\-168.5561\\-182.6797\\-95\\-168.3262\\-180.7266\\-95\\-167.8167\\-174.8672\\-95\\-167.5684\\-172.9141\\-95\\-167.2084\\-170.9609\\-95\\-166.6352\\-169.0078\\-95\\-165.3796\\-163.1484\\-95\\-164.5898\\-161.1953\\-95\\-163.6658\\-157.2891\\-95\\-162.2933\\-153.3828\\-95\\-161.8034\\-151.4297\\-95\\-160.9116\\-149.4766\\-95\\-160.1563\\-147.5234\\-95\\-159.2663\\-145.5703\\-95\\-158.2277\\-143.6172\\-95\\-157.3671\\-141.6641\\-95\\-156.2709\\-139.7109\\-95\\-155.3976\\-137.7578\\-95\\-153.3203\\-134.2767\\-95\\-151.7086\\-131.8984\\-95\\-150.2539\\-129.9453\\-95\\-149.4141\\-128.5298\\-95\\-147.507\\-126.0391\\-95\\-144.0465\\-122.1328\\-95\\-142.5442\\-120.1797\\-95\\-140.6166\\-118.2266\\-95\\-137.6953\\-115.5067\\-95\\-135.7422\\-113.928\\-95\\-134.0355\\-112.3672\\-95\\-131.5836\\-110.4141\\-95\\-128.9617\\-108.4609\\-95\\-125.9766\\-106.3622\\-95\\-122.0703\\-103.9688\\-95\\-120.1172\\-103.0156\\-95\\-118.1641\\-101.7344\\-95\\-115.9237\\-100.6484\\-95\\-112.3047\\-99.2522\\-95\\-110.3516\\-98.42567\\-95\\-106.4453\\-97.29688\\-95\\-102.5391\\-96.034\\-95\\-98.63281\\-95.38712\\-95\\-94.72656\\-94.46901\\-95\\-92.77344\\-94.23212\\-95\\-88.86719\\-93.94893\\-95\\-86.91406\\-93.7571\\-95\\-84.96094\\-93.4581\\-95\\-79.10156\\-93.05589\\-95\\-73.24219\\-92.79491\\-95\\-67.38281\\-92.7178\\-95\\-61.52344\\-92.98965\\-95\\-55.66406\\-93.53455\\-95\\-53.71094\\-93.90946\\-95\\-49.80469\\-94.35591\\-95\\-47.85156\\-94.81594\\-95\\-45.89844\\-95.41256\\-95\\-41.99219\\-96.27376\\-95\\-40.03906\\-97.11779\\-95\\-38.08594\\-97.74903\\-95\\-32.22656\\-100.4171\\-95\\-30.27344\\-101.601\\-95\\-28.32031\\-103.0007\\-95\\-26.36719\\-104.2411\\-95\\-24.41406\\-105.9533\\-95\\-21.73913\\-108.4609\\-95\\-19.96707\\-110.4141\\-95\\-18.55469\\-112.4052\\-95\\-17.42903\\-114.3203\\-95\\-15.98751\\-116.2734\\-95\\-12.69531\\-122.3653\\-95\\-11.93728\\-124.0859\\-95\\-9.902057\\-127.9922\\-95\\-9.197298\\-129.9453\\-95\\-8.3125\\-131.8984\\-95\\-7.842319\\-133.8516\\-95\\-7.489483\\-135.8047\\-95\\-6.667259\\-137.7578\\-95\\-6.25465\\-139.7109\\-95\\-5.977958\\-141.6641\\-95\\-5.336828\\-143.6172\\-95\\-4.34932\\-147.5234\\-95\\-3.127078\\-151.4297\\-95\\-1.983173\\-153.3828\\-95\\-0.9765625\\-155.3576\\-95\\0.9765625\\-155.9295\\-95\\2.929688\\-153.8489\\-95\\3.831845\\-151.4297\\-95\\4.664902\\-149.4766\\-95\\5.313649\\-147.5234\\-95\\6.069841\\-145.5703\\-95\\6.64605\\-143.6172\\-95\\7.621951\\-141.6641\\-95\\8.009454\\-139.7109\\-95\\8.780103\\-137.7578\\-95\\10.0179\\-133.8516\\-95\\11.5754\\-129.9453\\-95\\12.44469\\-127.9922\\-95\\13.51061\\-126.0391\\-95\\14.32292\\-124.0859\\-95\\15.58291\\-122.1328\\-95\\16.60156\\-120.3424\\-95\\17.95313\\-118.2266\\-95\\19.01245\\-116.2734\\-95\\23.23615\\-110.4141\\-95\\24.41406\\-109.1157\\-95\\26.93315\\-106.5078\\-95\\30.27344\\-103.3109\\-95\\32.22656\\-101.6948\\-95\\33.63121\\-100.6484\\-95\\36.4926\\-98.69531\\-95\\38.08594\\-97.97452\\-95\\41.99219\\-95.73224\\-95\\43.94531\\-95.06428\\-95\\45.89844\\-94.08814\\-95\\47.85156\\-93.27901\\-95\\49.80469\\-92.6548\\-95\\51.75781\\-92.33428\\-95\\53.71094\\-91.72311\\-95\\55.66406\\-91.22286\\-95\\59.57031\\-90.64994\\-95\\61.52344\\-90.18641\\-95\\65.42969\\-89.80498\\-95\\69.33594\\-89.7065\\-95\\73.24219\\-89.74711\\-95\\77.14844\\-89.90625\\-95\\83.00781\\-90.3482\\-95\\88.86719\\-91.45058\\-95\\90.82031\\-91.69784\\-95\\95.93099\\-92.83594\\-95\\98.63281\\-93.60472\\-95\\102.5391\\-94.4159\\-95\\104.4922\\-95.15625\\-95\\108.3984\\-96.21291\\-95\\109.6824\\-96.74219\\-95\\114.2578\\-98.87364\\-95\\118.1641\\-100.6056\\-95\\120.1172\\-101.6181\\-95\\122.0703\\-102.5238\\-95\\129.8828\\-107.6208\\-95\\131.8359\\-109.1\\-95\\135.6938\\-112.3672\\-95\\139.704\\-116.2734\\-95\\143.5547\\-120.8633\\-95\\145.5078\\-123.3205\\-95\\147.4869\\-126.0391\\-95\\148.6398\\-127.9922\\-95\\150.0269\\-129.9453\\-95\\151.1603\\-131.8984\\-95\\153.7598\\-135.8047\\-95\\154.6578\\-137.7578\\-95\\155.8245\\-139.7109\\-95\\156.5867\\-141.6641\\-95\\157.7025\\-143.6172\\-95\\158.4778\\-145.5703\\-95\\159.6172\\-147.5234\\-95\\160.3527\\-149.4766\\-95\\161.2031\\-151.4297\\-95\\161.9301\\-153.3828\\-95\\162.323\\-155.3359\\-95\\162.8698\\-157.2891\\-95\\163.608\\-159.2422\\-95\\164.3273\\-163.1484\\-95\\164.781\\-165.1016\\-95\\165.3646\\-167.0547\\-95\\165.7191\\-169.0078\\-95\\166.6756\\-176.8203\\-95\\167.2431\\-180.7266\\-95\\167.5494\\-184.6328\\-95\\167.8136\\-192.4453\\-95\\167.8596\\-198.3047\\-95\\167.8317\\-204.1641\\-95\\167.6643\\-210.0234\\-95\\167.4143\\-213.9297\\-95\\167.193\\-215.8828\\-95\\166.5222\\-219.7891\\-95\\165.6634\\-225.6484\\-95\\165.2007\\-227.6016\\-95\\164.4939\\-229.5547\\-95\\163.6516\\-233.4609\\-95\\162.7794\\-235.4141\\-95\\161.7525\\-239.3203\\-95\\160.7869\\-241.2734\\-95\\160.0253\\-243.2266\\-95\\158.9373\\-245.1797\\-95\\158.0047\\-247.1328\\-95\\156.7902\\-249.0859\\-95\\155.9564\\-251.0391\\-95\\154.7145\\-252.9922\\-95\\153.6686\\-254.9453\\-95\\150.6426\\-258.8516\\-95\\149.4141\\-260.7947\\-95\\148.016\\-262.7578\\-95\\144.5618\\-266.6641\\-95\\143.5547\\-267.9035\\-95\\141.1482\\-270.5703\\-95\\139.2289\\-272.5234\\-95\\137.6953\\-274.1986\\-95\\135.4691\\-276.4297\\-95\\131.8359\\-279.8138\\-95\\129.0333\\-282.2891\\-95\\124.0234\\-286.2199\\-95\\120.1172\\-288.9458\\-95\\118.1641\\-289.9984\\-95\\116.2109\\-291.2152\\-95\\114.2578\\-292.6201\\-95\\112.3047\\-293.5508\\-95\\110.3516\\-294.7072\\-95\\108.3984\\-295.3634\\-95\\106.4453\\-296.4232\\-95\\104.4922\\-297.0406\\-95\\100.5859\\-298.6742\\-95\\98.63281\\-299.2143\\-95\\94.72656\\-300.4496\\-95\\88.86719\\-301.332\\-95\\84.96094\\-302.0626\\-95\\81.05469\\-302.4693\\-95\\77.14844\\-302.6214\\-95\\73.24219\\-302.6167\\-95\\69.33594\\-302.461\\-95\\67.38281\\-302.2818\\-95\\65.42969\\-301.9793\\-95\\63.47656\\-301.5423\\-95\\59.57031\\-300.8669\\-95\\57.61719\\-300.4768\\-95\\51.75781\\-298.2651\\-95\\49.80469\\-297.1746\\-95\\47.85156\\-296.4713\\-95\\45.89844\\-295.2863\\-95\\43.94531\\-294.438\\-95\\41.99219\\-293.0701\\-95\\40.03906\\-291.492\\-95\\36.13281\\-288.6226\\-95\\33.5719\\-286.1953\\-95\\31.8859\\-284.2422\\-95\\28.32031\\-279.9269\\-95\\25.77993\\-276.4297\\-95\\24.74201\\-274.4766\\-95\\24.41406\\-274.1042\\-95\\22.46094\\-271.0035\\-95\\22.09803\\-270.5703\\-95\\21.17283\\-268.6172\\-95\\19.97103\\-266.6641\\-95\\19.37548\\-264.7109\\-95\\17.74004\\-260.8047\\-95\\17.20908\\-258.8516\\-95\\16.26547\\-256.8984\\-95\\15.14267\\-252.9922\\-95\\14.3821\\-251.0391\\-95\\13.47778\\-247.1328\\-95\\12.96496\\-245.1797\\-95\\12.21035\\-243.2266\\-95\\11.14265\\-239.3203\\-95\\9.146554\\-235.4141\\-95\\8.789063\\-234.8802\\-95\\6.835938\\-233.3541\\-95\\4.882813\\-232.8874\\-95\\2.929688\\-232.5658\\-95\\0.9765625\\-232.8058\\-95\\-0.9765625\\-233.2656\\-95\\-2.929688\\-234.5135\\-95\\-4.882813\\-236.3398\\-95\\-5.771396\\-237.3672\\-95\\-7.234375\\-239.3203\\-95\\-8.244871\\-241.2734\\-95\\-9.571651\\-243.2266\\-95\\-11.61874\\-247.1328\\-95\\-12.45117\\-249.0859\\-95\\-13.43246\\-251.0391\\-95\\-14.06996\\-252.9922\\-95\\-15.13357\\-254.9453\\-95\\-15.92197\\-256.8984\\-95\\-17.09295\\-258.8516\\-95\\-17.82908\\-260.8047\\-95\\-18.9439\\-262.7578\\-95\\-19.65784\\-264.7109\\-95\\-21.73139\\-268.6172\\-95\\-23.07494\\-270.5703\\-95\\-24.04472\\-272.5234\\-95\\-25.32432\\-274.4766\\-95\\-27.72561\\-278.3828\\-95\\-30.27344\\-281.544\\-95\\-32.58366\\-284.2422\\-95\\-33.92075\\-286.1953\\-95\\-36.13281\\-288.5042\\-95\\-37.97259\\-290.1016\\-95\\-40.09699\\-292.0547\\-95\\-43.94531\\-294.9475\\-95\\-45.89844\\-296.1059\\-95\\-47.85156\\-297.0778\\-95\\-49.80469\\-298.2698\\-95\\-51.75781\\-299.0371\\-95\\-53.71094\\-299.9619\\-95\\-55.66406\\-300.6292\\-95\\-59.57031\\-301.4066\\-95\\-61.52344\\-301.951\\-95\\-63.47656\\-302.3152\\-95\\-65.42969\\-302.5497\\-95\\-69.33594\\-302.7522\\-95\\-73.24219\\-302.8023\\-95\\-77.14844\\-302.7178\\-95\\-81.05469\\-302.461\\-95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "360" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "79" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-302.0349\\-93\\-86.91406\\-301.2395\\-93\\-90.82031\\-300.6405\\-93\\-92.77344\\-300.254\\-93\\-94.72656\\-299.4603\\-93\\-98.63281\\-298.3184\\-93\\-100.5859\\-297.2964\\-93\\-102.5391\\-296.7031\\-93\\-104.4922\\-295.7565\\-93\\-108.3984\\-294.1914\\-93\\-110.3516\\-293.0313\\-93\\-112.3047\\-291.759\\-93\\-114.2578\\-290.6886\\-93\\-116.2109\\-289.3089\\-93\\-118.1535\\-288.1484\\-93\\-120.1172\\-286.8523\\-93\\-123.2291\\-284.2422\\-93\\-125.9766\\-281.8558\\-93\\-127.9297\\-280.3441\\-93\\-131.913\\-276.4297\\-93\\-134.0138\\-274.4766\\-93\\-137.33\\-270.5703\\-93\\-140.7948\\-266.6641\\-93\\-142.3404\\-264.7109\\-93\\-144.8975\\-260.8047\\-93\\-146.3982\\-258.8516\\-93\\-147.7347\\-256.8984\\-93\\-148.8105\\-254.9453\\-93\\-150.1038\\-252.9922\\-93\\-151.0204\\-251.0391\\-93\\-151.3672\\-250.5919\\-93\\-153.4947\\-247.1328\\-93\\-154.3904\\-245.1797\\-93\\-155.4362\\-243.2266\\-93\\-157.0511\\-239.3203\\-93\\-158.0659\\-237.3672\\-93\\-158.884\\-235.4141\\-93\\-159.844\\-233.4609\\-93\\-160.6478\\-231.5078\\-93\\-161.6506\\-229.5547\\-93\\-162.6694\\-225.6484\\-93\\-163.568\\-223.6953\\-93\\-164.5821\\-219.7891\\-93\\-165.4161\\-217.8359\\-93\\-165.92\\-215.8828\\-93\\-166.3097\\-213.9297\\-93\\-167.4143\\-210.0234\\-93\\-167.7304\\-208.0703\\-93\\-168.1507\\-204.1641\\-93\\-168.2921\\-202.2109\\-93\\-168.8156\\-196.3516\\-93\\-169.1043\\-192.4453\\-93\\-169.1466\\-188.5391\\-93\\-168.9053\\-184.6328\\-93\\-168.4869\\-180.7266\\-93\\-167.9806\\-174.8672\\-93\\-167.5175\\-170.9609\\-93\\-166.58\\-167.0547\\-93\\-165.7623\\-163.1484\\-93\\-165.2764\\-161.1953\\-93\\-164.5572\\-159.2422\\-93\\-163.6379\\-155.3359\\-93\\-162.8783\\-153.3828\\-93\\-162.2606\\-151.4297\\-93\\-161.8034\\-149.4766\\-93\\-160.9116\\-147.5234\\-93\\-159.2781\\-143.6172\\-93\\-158.2574\\-141.6641\\-93\\-157.3543\\-139.7109\\-93\\-156.3031\\-137.7578\\-93\\-155.4129\\-135.8047\\-93\\-153.3203\\-132.3413\\-93\\-151.7648\\-129.9453\\-93\\-150.2769\\-127.9922\\-93\\-149.4141\\-126.6376\\-93\\-147.5209\\-124.0859\\-93\\-145.8054\\-122.1328\\-93\\-143.8802\\-120.1797\\-93\\-142.0743\\-118.2266\\-93\\-139.6484\\-115.7316\\-93\\-133.7784\\-110.4141\\-93\\-131.8359\\-108.9123\\-93\\-127.9297\\-106.125\\-93\\-125.6553\\-104.5547\\-93\\-124.0234\\-103.656\\-93\\-122.0703\\-102.4348\\-93\\-120.1172\\-101.4163\\-93\\-118.1641\\-100.1757\\-93\\-114.2578\\-98.37959\\-93\\-112.3047\\-97.81702\\-93\\-109.9057\\-96.74219\\-93\\-106.4453\\-95.65466\\-93\\-104.4922\\-95.18129\\-93\\-102.5391\\-94.56561\\-93\\-100.5859\\-94.11679\\-93\\-98.63281\\-93.80542\\-93\\-96.67969\\-93.59626\\-93\\-94.72656\\-93.07594\\-93\\-92.77344\\-92.67696\\-93\\-88.86719\\-92.21274\\-93\\-84.96094\\-92.00299\\-93\\-81.05469\\-91.51166\\-93\\-75.19531\\-91.20557\\-93\\-71.28906\\-91.09511\\-93\\-69.33594\\-91.09328\\-93\\-65.42969\\-91.19757\\-93\\-59.57031\\-91.57338\\-93\\-57.61719\\-91.89577\\-93\\-53.71094\\-92.24741\\-93\\-51.75781\\-92.49595\\-93\\-49.80469\\-92.89808\\-93\\-47.85156\\-93.59087\\-93\\-45.89844\\-93.8125\\-93\\-43.94531\\-94.19101\\-93\\-41.99219\\-94.96896\\-93\\-40.03906\\-95.43756\\-93\\-36.38174\\-96.74219\\-93\\-32.22656\\-98.65358\\-93\\-30.27344\\-99.81683\\-93\\-28.32031\\-101.2147\\-93\\-26.36719\\-102.3369\\-93\\-24.41406\\-103.9655\\-93\\-21.75611\\-106.5078\\-93\\-19.87056\\-108.4609\\-93\\-18.30449\\-110.4141\\-93\\-15.68963\\-114.3203\\-93\\-14.57458\\-116.2734\\-93\\-12.69531\\-119.8259\\-93\\-10.74219\\-123.1354\\-93\\-9.289253\\-126.0391\\-93\\-8.201599\\-127.9922\\-93\\-6.845064\\-131.8984\\-93\\-6.059301\\-133.8516\\-93\\-5.724921\\-135.8047\\-93\\-4.76844\\-137.7578\\-93\\-4.354745\\-139.7109\\-93\\-4.085493\\-141.6641\\-93\\-3.019372\\-143.6172\\-93\\-1.638455\\-147.5234\\-93\\-0.9765625\\-148.5331\\-93\\0.9765625\\-149.3483\\-93\\2.783203\\-147.5234\\-93\\3.922129\\-145.5703\\-93\\4.54635\\-143.6172\\-93\\5.708582\\-141.6641\\-93\\6.024761\\-139.7109\\-93\\6.790304\\-137.7578\\-93\\7.913257\\-133.8516\\-93\\8.540919\\-131.8984\\-93\\9.322555\\-129.9453\\-93\\10.26848\\-127.9922\\-93\\11.43859\\-126.0391\\-93\\12.22358\\-124.0859\\-93\\13.51046\\-122.1328\\-93\\14.51765\\-120.1797\\-93\\15.75567\\-118.2266\\-93\\16.60156\\-116.4857\\-93\\18.23493\\-114.3203\\-93\\20.83965\\-110.4141\\-93\\22.51344\\-108.4609\\-93\\24.41406\\-105.978\\-93\\26.36719\\-103.9833\\-93\\28.09896\\-102.6016\\-93\\30.27344\\-101.0591\\-93\\33.08823\\-98.69531\\-93\\34.17969\\-98.05988\\-93\\36.13281\\-96.59907\\-93\\38.08594\\-95.84461\\-93\\40.03906\\-94.87523\\-93\\41.99219\\-93.79736\\-93\\43.94531\\-93.23805\\-93\\45.89844\\-92.15687\\-93\\49.80469\\-90.625\\-93\\51.75781\\-90.28136\\-93\\55.66406\\-89.41386\\-93\\59.57031\\-88.8552\\-93\\61.52344\\-88.40625\\-93\\65.42969\\-88.15871\\-93\\69.33594\\-88.11227\\-93\\73.24219\\-88.16447\\-93\\77.14844\\-88.37706\\-93\\79.10156\\-88.67188\\-93\\84.96094\\-89.35787\\-93\\88.86719\\-89.91294\\-93\\90.82031\\-90.28328\\-93\\92.77344\\-90.55022\\-93\\94.08482\\-90.88281\\-93\\96.67969\\-91.71891\\-93\\100.5859\\-92.6277\\-93\\102.5391\\-93.28125\\-93\\104.4922\\-93.82655\\-93\\106.4453\\-94.27386\\-93\\108.3984\\-95.17188\\-93\\110.3516\\-95.70689\\-93\\112.3047\\-96.44464\\-93\\118.1641\\-99.53718\\-93\\120.1172\\-100.3332\\-93\\122.0703\\-101.4455\\-93\\124.0234\\-102.4443\\-93\\127.2045\\-104.5547\\-93\\129.8828\\-106.5169\\-93\\131.8359\\-107.7832\\-93\\133.7891\\-109.3573\\-93\\137.0254\\-112.3672\\-93\\139.6484\\-114.9793\\-93\\142.5708\\-118.2266\\-93\\145.6539\\-122.1328\\-93\\147.4609\\-124.5795\\-93\\149.7371\\-127.9922\\-93\\150.8223\\-129.9453\\-93\\153.4712\\-133.8516\\-93\\154.4262\\-135.8047\\-93\\155.5687\\-137.7578\\-93\\156.3721\\-139.7109\\-93\\157.4413\\-141.6641\\-93\\158.2536\\-143.6172\\-93\\159.2331\\-145.5703\\-93\\160.0998\\-147.5234\\-93\\160.8392\\-149.4766\\-93\\161.7084\\-151.4297\\-93\\162.5716\\-155.3359\\-93\\163.3212\\-157.2891\\-93\\163.8443\\-159.2422\\-93\\164.4853\\-163.1484\\-93\\165.0912\\-165.1016\\-93\\165.5359\\-167.0547\\-93\\165.8074\\-169.0078\\-93\\166.2422\\-172.9141\\-93\\167.2414\\-180.7266\\-93\\167.5374\\-184.6328\\-93\\167.7217\\-190.4922\\-93\\167.8088\\-194.3984\\-93\\167.8088\\-198.3047\\-93\\167.7542\\-206.1172\\-93\\167.5046\\-211.9766\\-93\\167.379\\-213.9297\\-93\\167.1276\\-215.8828\\-93\\166.4536\\-219.7891\\-93\\165.6272\\-225.6484\\-93\\165.1338\\-227.6016\\-93\\164.452\\-229.5547\\-93\\163.6136\\-233.4609\\-93\\162.7417\\-235.4141\\-93\\161.7225\\-239.3203\\-93\\160.7303\\-241.2734\\-93\\159.9926\\-243.2266\\-93\\158.8745\\-245.1797\\-93\\157.959\\-247.1328\\-93\\156.7315\\-249.0859\\-93\\155.8871\\-251.0391\\-93\\154.6537\\-252.9922\\-93\\153.5538\\-254.9453\\-93\\152.1254\\-256.8984\\-93\\150.5432\\-258.8516\\-93\\149.4141\\-260.6056\\-93\\147.8909\\-262.7578\\-93\\144.4312\\-266.6641\\-93\\143.5547\\-267.7834\\-93\\141.0011\\-270.5703\\-93\\139.0728\\-272.5234\\-93\\137.6953\\-274.0307\\-93\\135.3214\\-276.4297\\-93\\133.7891\\-277.7664\\-93\\131.8359\\-279.6569\\-93\\128.8342\\-282.2891\\-93\\123.721\\-286.1953\\-93\\120.1172\\-288.8102\\-93\\118.1641\\-289.7736\\-93\\114.2578\\-292.4514\\-93\\112.3047\\-293.41\\-93\\110.3516\\-294.6182\\-93\\108.3984\\-295.2625\\-93\\106.4453\\-296.3092\\-93\\102.5391\\-297.6788\\-93\\100.5859\\-298.5941\\-93\\98.63281\\-299.1321\\-93\\94.72656\\-300.3884\\-93\\88.86719\\-301.2906\\-93\\84.96094\\-302.0081\\-93\\81.05469\\-302.4227\\-93\\77.14844\\-302.5956\\-93\\73.24219\\-302.5765\\-93\\69.33594\\-302.4139\\-93\\67.38281\\-302.2261\\-93\\63.47656\\-301.4696\\-93\\59.57031\\-300.815\\-93\\57.61719\\-300.4329\\-93\\55.66406\\-299.6525\\-93\\51.75781\\-298.209\\-93\\49.80469\\-297.1428\\-93\\47.85156\\-296.4201\\-93\\45.89844\\-295.249\\-93\\43.94531\\-294.3775\\-93\\41.99219\\-293.0367\\-93\\38.08594\\-289.9348\\-93\\36.13281\\-288.5376\\-93\\33.62863\\-286.1953\\-93\\31.9553\\-284.2422\\-93\\28.32031\\-279.8316\\-93\\25.79864\\-276.4297\\-93\\24.74201\\-274.4766\\-93\\24.41406\\-274.1073\\-93\\22.46094\\-271.0313\\-93\\22.07425\\-270.5703\\-93\\21.14868\\-268.6172\\-93\\19.93075\\-266.6641\\-93\\19.34928\\-264.7109\\-93\\17.67932\\-260.8047\\-93\\17.10464\\-258.8516\\-93\\16.12505\\-256.8984\\-93\\15.5894\\-254.9453\\-93\\14.9111\\-252.9922\\-93\\14.12307\\-251.0391\\-93\\13.18359\\-247.1328\\-93\\12.29195\\-245.1797\\-93\\11.66168\\-243.2266\\-93\\10.86426\\-241.2734\\-93\\9.880914\\-239.3203\\-93\\8.789063\\-237.9649\\-93\\6.835938\\-236.5878\\-93\\4.882813\\-236.4004\\-93\\0.9765625\\-236.3276\\-93\\-0.9765625\\-236.509\\-93\\-2.929688\\-237.6801\\-93\\-4.882813\\-238.6064\\-93\\-5.573552\\-239.3203\\-93\\-7.135759\\-241.2734\\-93\\-8.249383\\-243.2266\\-93\\-8.789063\\-243.8881\\-93\\-10.87827\\-247.1328\\-93\\-12.69531\\-250.5281\\-93\\-13.02573\\-251.0391\\-93\\-13.7623\\-252.9922\\-93\\-14.6405\\-254.9453\\-93\\-16.54857\\-258.8516\\-93\\-17.56203\\-260.8047\\-93\\-19.45755\\-264.7109\\-93\\-20.27847\\-266.6641\\-93\\-22.81303\\-270.5703\\-93\\-23.83475\\-272.5234\\-93\\-25.17641\\-274.4766\\-93\\-26.32581\\-276.4297\\-93\\-27.58943\\-278.3828\\-93\\-30.27344\\-281.6308\\-93\\-32.52989\\-284.2422\\-93\\-33.89116\\-286.1953\\-93\\-36.13281\\-288.4891\\-93\\-40.22167\\-292.0547\\-93\\-43.94531\\-294.8861\\-93\\-47.85156\\-296.9979\\-93\\-49.80469\\-298.1038\\-93\\-53.71094\\-299.7703\\-93\\-55.66406\\-300.5317\\-93\\-59.57031\\-301.2835\\-93\\-63.47656\\-302.2012\\-93\\-65.42969\\-302.461\\-93\\-69.33594\\-302.689\\-93\\-73.24219\\-302.7522\\-93\\-77.14844\\-302.6533\\-93\\-81.05469\\-302.3571\\-93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "346" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "80" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-301.4809\\-91\\-90.82031\\-300.5508\\-91\\-92.77344\\-300.0941\\-91\\-94.72656\\-299.3234\\-91\\-96.67969\\-298.7838\\-91\\-98.63281\\-298.1378\\-91\\-100.5859\\-297.1692\\-91\\-102.5391\\-296.5942\\-91\\-104.4922\\-295.5745\\-91\\-106.4453\\-294.907\\-91\\-108.2886\\-294.0078\\-91\\-110.3516\\-292.8958\\-91\\-112.3047\\-291.5237\\-91\\-114.2578\\-290.4934\\-91\\-116.2109\\-289.1436\\-91\\-120.1172\\-286.6494\\-91\\-123.0087\\-284.2422\\-91\\-127.5724\\-280.3359\\-91\\-131.8359\\-276.1321\\-91\\-133.7891\\-274.3219\\-91\\-135.353\\-272.5234\\-91\\-140.601\\-266.6641\\-91\\-142.174\\-264.7109\\-91\\-143.3546\\-262.7578\\-91\\-144.7132\\-260.8047\\-91\\-146.2259\\-258.8516\\-91\\-147.5336\\-256.8984\\-91\\-148.6445\\-254.9453\\-91\\-149.9859\\-252.9922\\-91\\-150.8689\\-251.0391\\-91\\-152.1886\\-249.0859\\-91\\-153.3203\\-247.1216\\-91\\-155.3299\\-243.2266\\-91\\-156.9569\\-239.3203\\-91\\-158.0132\\-237.3672\\-91\\-158.8427\\-235.4141\\-91\\-159.8726\\-233.4609\\-91\\-160.6165\\-231.5078\\-91\\-161.6277\\-229.5547\\-91\\-162.6275\\-225.6484\\-91\\-163.5264\\-223.6953\\-91\\-164.5416\\-219.7891\\-91\\-165.3646\\-217.8359\\-91\\-165.8841\\-215.8828\\-91\\-166.2854\\-213.9297\\-91\\-167.3943\\-210.0234\\-91\\-167.6955\\-208.0703\\-91\\-168.1386\\-204.1641\\-91\\-168.457\\-200.2578\\-91\\-168.8594\\-196.3516\\-91\\-169.1466\\-192.4453\\-91\\-169.2254\\-188.5391\\-91\\-169.0607\\-184.6328\\-91\\-168.2505\\-176.8203\\-91\\-168.1006\\-174.8672\\-91\\-167.6965\\-170.9609\\-91\\-167.3996\\-169.0078\\-91\\-166.4075\\-165.1016\\-91\\-165.6736\\-161.1953\\-91\\-165.1338\\-159.2422\\-91\\-164.4592\\-157.2891\\-91\\-163.5711\\-153.3828\\-91\\-162.7408\\-151.4297\\-91\\-161.7147\\-147.5234\\-91\\-160.8049\\-145.5703\\-91\\-160.0407\\-143.6172\\-91\\-159.1797\\-141.7275\\-91\\-155.2734\\-133.8648\\-91\\-153.3203\\-130.5847\\-91\\-151.6586\\-127.9922\\-91\\-147.4609\\-122.3345\\-91\\-141.6016\\-116.0136\\-91\\-139.6484\\-114.1356\\-91\\-135.4731\\-110.4141\\-91\\-133.1138\\-108.4609\\-91\\-130.4104\\-106.5078\\-91\\-127.8184\\-104.5547\\-91\\-125.9766\\-103.4848\\-91\\-124.0234\\-102.1174\\-91\\-122.0703\\-101.149\\-91\\-120.1172\\-100.0094\\-91\\-116.2109\\-97.97961\\-91\\-112.3047\\-96.25391\\-91\\-110.3516\\-95.67228\\-91\\-107.8074\\-94.78906\\-91\\-104.4922\\-93.83405\\-91\\-100.5859\\-93.07392\\-91\\-98.63281\\-92.35107\\-91\\-96.67969\\-92.00755\\-91\\-92.77344\\-91.54548\\-91\\-90.82031\\-90.89239\\-91\\-88.86719\\-90.57813\\-91\\-84.96094\\-90.21963\\-91\\-83.00781\\-90.10017\\-91\\-77.14844\\-89.88618\\-91\\-75.19531\\-89.69752\\-91\\-71.28906\\-89.61405\\-91\\-67.38281\\-89.66974\\-91\\-63.47656\\-89.93924\\-91\\-59.57031\\-90.09747\\-91\\-55.66406\\-90.43961\\-91\\-53.71094\\-90.74212\\-91\\-51.75781\\-91.15826\\-91\\-49.80469\\-91.70914\\-91\\-45.89844\\-92.30132\\-91\\-43.94531\\-92.95348\\-91\\-40.03906\\-93.99076\\-91\\-38.08594\\-94.65943\\-91\\-34.17969\\-96.16547\\-91\\-32.22656\\-97.26678\\-91\\-30.27344\\-98.11573\\-91\\-28.32031\\-99.52416\\-91\\-24.41406\\-102.1086\\-91\\-21.8011\\-104.5547\\-91\\-19.89632\\-106.5078\\-91\\-18.17255\\-108.4609\\-91\\-16.60156\\-110.6847\\-91\\-14.2985\\-114.3203\\-91\\-13.26834\\-116.2734\\-91\\-12.1213\\-118.2266\\-91\\-11.10734\\-120.1797\\-91\\-8.709882\\-124.0859\\-91\\-6.863839\\-127.9922\\-91\\-5.859375\\-129.9453\\-91\\-5.115327\\-131.8984\\-91\\-4.141671\\-133.8516\\-91\\-3.706135\\-135.8047\\-91\\-2.464117\\-137.7578\\-91\\-1.983643\\-139.7109\\-91\\-0.9765625\\-141.8879\\-91\\0.9765625\\-143.0086\\-91\\2.929688\\-141.3874\\-91\\4.882813\\-137.6633\\-91\\5.916262\\-133.8516\\-91\\6.669922\\-131.8984\\-91\\7.290378\\-129.9453\\-91\\8.203125\\-127.9922\\-91\\9.312855\\-126.0391\\-91\\10.14737\\-124.0859\\-91\\11.43101\\-122.1328\\-91\\12.37305\\-120.1797\\-91\\13.66266\\-118.2266\\-91\\14.61823\\-116.2734\\-91\\16.60156\\-113.2135\\-91\\18.82102\\-110.4141\\-91\\20.07039\\-108.4609\\-91\\21.48438\\-106.5078\\-91\\24.41406\\-103.4621\\-91\\26.36719\\-101.6447\\-91\\27.98412\\-100.6484\\-91\\30.27344\\-98.97852\\-91\\32.22656\\-97.26877\\-91\\36.13281\\-94.74165\\-91\\38.08594\\-93.97246\\-91\\40.03906\\-93.08236\\-91\\41.99219\\-91.9375\\-91\\43.94531\\-91.36295\\-91\\45.89844\\-90.21875\\-91\\47.85156\\-89.87815\\-91\\49.80469\\-89.0692\\-91\\51.75781\\-88.63503\\-91\\53.71094\\-88.38374\\-91\\55.66406\\-87.93799\\-91\\57.61719\\-87.62487\\-91\\59.57031\\-87.43563\\-91\\65.42969\\-87.07334\\-91\\71.28906\\-87.10619\\-91\\73.24219\\-87.17019\\-91\\77.14844\\-87.39735\\-91\\81.05469\\-87.68475\\-91\\84.96094\\-88.08955\\-91\\88.86719\\-88.72792\\-91\\94.72656\\-89.98284\\-91\\96.67969\\-90.30385\\-91\\98.63281\\-90.85777\\-91\\100.5859\\-91.74043\\-91\\102.5391\\-92.09532\\-91\\104.4922\\-92.56194\\-91\\106.4453\\-93.38189\\-91\\110.3516\\-94.71197\\-91\\114.2578\\-96.23608\\-91\\116.2109\\-97.43022\\-91\\118.1641\\-98.29485\\-91\\120.1172\\-99.47795\\-91\\122.0703\\-100.3152\\-91\\125.9766\\-102.5583\\-91\\127.9297\\-103.9059\\-91\\129.8828\\-105.4351\\-91\\133.7891\\-108.2575\\-91\\135.7422\\-109.9184\\-91\\140.2813\\-114.3203\\-91\\141.9168\\-116.2734\\-91\\143.4091\\-118.2266\\-91\\146.603\\-122.1328\\-91\\148.026\\-124.0859\\-91\\149.4141\\-126.2523\\-91\\150.4165\\-127.9922\\-91\\151.7821\\-129.9453\\-91\\152.908\\-131.8984\\-91\\154.1715\\-133.8516\\-91\\156.1479\\-137.7578\\-91\\156.9574\\-139.7109\\-91\\157.9824\\-141.6641\\-91\\158.8126\\-143.6172\\-91\\159.8327\\-145.5703\\-91\\160.4838\\-147.5234\\-91\\161.4108\\-149.4766\\-91\\161.969\\-151.4297\\-91\\162.3504\\-153.3828\\-91\\162.8831\\-155.3359\\-91\\163.6047\\-157.2891\\-91\\164.6343\\-163.1484\\-91\\165.2508\\-165.1016\\-91\\165.6164\\-167.0547\\-91\\166.2706\\-172.9141\\-91\\167.0298\\-178.7734\\-91\\167.2296\\-180.7266\\-91\\167.5828\\-186.5859\\-91\\167.7332\\-194.3984\\-91\\167.77\\-198.3047\\-91\\167.6832\\-206.1172\\-91\\167.4241\\-211.9766\\-91\\167.0298\\-215.8828\\-91\\166.3775\\-219.7891\\-91\\165.561\\-225.6484\\-91\\164.3899\\-229.5547\\-91\\163.5773\\-233.4609\\-91\\162.6939\\-235.4141\\-91\\161.6881\\-239.3203\\-91\\160.6895\\-241.2734\\-91\\159.9576\\-243.2266\\-91\\158.7825\\-245.1797\\-91\\157.8967\\-247.1328\\-91\\156.6619\\-249.0859\\-91\\155.8286\\-251.0391\\-91\\153.4029\\-254.9453\\-91\\152.0203\\-256.8984\\-91\\150.414\\-258.8516\\-91\\149.4141\\-260.442\\-91\\147.7455\\-262.7578\\-91\\146.0925\\-264.7109\\-91\\144.2522\\-266.6641\\-91\\143.5547\\-267.6104\\-91\\140.8675\\-270.5703\\-91\\137.0321\\-274.4766\\-91\\135.1744\\-276.4297\\-91\\133.7891\\-277.6291\\-91\\131.8359\\-279.4854\\-91\\129.8828\\-281.2279\\-91\\127.9297\\-282.8537\\-91\\125.9766\\-284.2171\\-91\\123.4343\\-286.1953\\-91\\120.1172\\-288.6768\\-91\\118.1641\\-289.5794\\-91\\117.5045\\-290.1016\\-91\\114.2578\\-292.2541\\-91\\112.3047\\-293.2726\\-91\\110.3516\\-294.4928\\-91\\108.3984\\-295.1664\\-91\\106.4453\\-296.1324\\-91\\102.5391\\-297.5511\\-91\\100.5859\\-298.5064\\-91\\98.63281\\-299.0368\\-91\\94.72656\\-300.3156\\-91\\92.77344\\-300.6744\\-91\\86.91406\\-301.5546\\-91\\83.00781\\-302.2012\\-91\\81.05469\\-302.3793\\-91\\77.14844\\-302.5572\\-91\\71.28906\\-302.4734\\-91\\67.38281\\-302.1529\\-91\\63.47656\\-301.4066\\-91\\59.57031\\-300.7752\\-91\\57.61719\\-300.3916\\-91\\55.66406\\-299.593\\-91\\51.75781\\-298.1616\\-91\\49.80469\\-297.1076\\-91\\47.85156\\-296.3795\\-91\\45.89844\\-295.216\\-91\\43.94531\\-294.3143\\-91\\41.99219\\-292.9871\\-91\\38.08594\\-289.8478\\-91\\36.13281\\-288.4437\\-91\\33.71635\\-286.1953\\-91\\28.32031\\-279.7768\\-91\\25.83143\\-276.4297\\-91\\24.76591\\-274.4766\\-91\\24.41406\\-274.0778\\-91\\22.46094\\-271.0547\\-91\\22.05078\\-270.5703\\-91\\21.11117\\-268.6172\\-91\\19.90928\\-266.6641\\-91\\19.31014\\-264.7109\\-91\\18.34797\\-262.7578\\-91\\16.96538\\-258.8516\\-91\\15.98566\\-256.8984\\-91\\15.4286\\-254.9453\\-91\\14.49539\\-252.9922\\-91\\13.85161\\-251.0391\\-91\\13.32642\\-249.0859\\-91\\11.5843\\-245.1797\\-91\\10.74219\\-243.6302\\-91\\8.789063\\-241.1496\\-91\\6.835938\\-240.1203\\-91\\4.882813\\-239.9677\\-91\\0.9765625\\-239.8928\\-91\\-0.9765625\\-239.9964\\-91\\-2.929688\\-240.3538\\-91\\-4.882813\\-241.894\\-91\\-6.835938\\-243.6618\\-91\\-8.128979\\-245.1797\\-91\\-8.789063\\-245.805\\-91\\-9.847574\\-247.1328\\-91\\-11.23414\\-249.0859\\-91\\-12.24293\\-251.0391\\-91\\-13.41318\\-252.9922\\-91\\-14.11033\\-254.9453\\-91\\-15.23062\\-256.8984\\-91\\-16.02746\\-258.8516\\-91\\-17.19835\\-260.8047\\-91\\-18.01696\\-262.7578\\-91\\-19.19495\\-264.7109\\-91\\-19.9245\\-266.6641\\-91\\-21.21519\\-268.6172\\-91\\-22.46094\\-270.6914\\-91\\-24.41406\\-273.779\\-91\\-24.98653\\-274.4766\\-91\\-26.08924\\-276.4297\\-91\\-27.45972\\-278.3828\\-91\\-29.06709\\-280.3359\\-91\\-30.84664\\-282.2891\\-91\\-33.84927\\-286.1953\\-91\\-36.13281\\-288.4891\\-91\\-38.07681\\-290.1016\\-91\\-40.30819\\-292.0547\\-91\\-43.94531\\-294.8175\\-91\\-49.80469\\-297.9218\\-91\\-51.75781\\-298.8329\\-91\\-55.66406\\-300.421\\-91\\-61.52344\\-301.5944\\-91\\-63.47656\\-302.0754\\-91\\-65.42969\\-302.3571\\-91\\-69.33594\\-302.6214\\-91\\-73.24219\\-302.689\\-91\\-77.14844\\-302.5765\\-91\\-81.05469\\-302.2476\\-91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "341" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "81" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-302.1003\\-89\\-84.96094\\-301.3619\\-89\\-90.82031\\-300.4496\\-89\\-92.77344\\-299.905\\-89\\-94.72656\\-299.1924\\-89\\-96.67969\\-298.6943\\-89\\-100.5859\\-297.0702\\-89\\-102.5391\\-296.4713\\-89\\-104.4922\\-295.4459\\-89\\-106.4453\\-294.7781\\-89\\-108.3984\\-293.6869\\-89\\-110.3516\\-292.7312\\-89\\-112.3047\\-291.3378\\-89\\-114.2578\\-290.2523\\-89\\-116.2109\\-289.0006\\-89\\-120.1172\\-286.3823\\-89\\-122.7667\\-284.2422\\-89\\-127.3468\\-280.3359\\-89\\-129.8828\\-277.7679\\-89\\-133.7891\\-274.032\\-89\\-137.6953\\-269.7491\\-89\\-140.4047\\-266.6641\\-89\\-141.956\\-264.7109\\-89\\-143.1596\\-262.7578\\-89\\-146.0564\\-258.8516\\-89\\-147.4609\\-256.7237\\-89\\-149.8336\\-252.9922\\-89\\-150.7182\\-251.0391\\-89\\-152.0779\\-249.0859\\-89\\-154.2329\\-245.1797\\-89\\-156.1149\\-241.2734\\-89\\-156.8683\\-239.3203\\-89\\-157.9714\\-237.3672\\-89\\-158.7984\\-235.4141\\-89\\-159.8712\\-233.4609\\-89\\-160.5601\\-231.5078\\-89\\-161.581\\-229.5547\\-89\\-162.5846\\-225.6484\\-89\\-163.4646\\-223.6953\\-89\\-164.4802\\-219.7891\\-89\\-165.2865\\-217.8359\\-89\\-165.8418\\-215.8828\\-89\\-166.2439\\-213.9297\\-89\\-167.3503\\-210.0234\\-89\\-167.6683\\-208.0703\\-89\\-168.1125\\-204.1641\\-89\\-168.4473\\-200.2578\\-89\\-169.0313\\-194.3984\\-89\\-169.2518\\-190.4922\\-89\\-169.2755\\-188.5391\\-89\\-169.1181\\-184.6328\\-89\\-168.8004\\-180.7266\\-89\\-168.3478\\-176.8203\\-89\\-168.0343\\-172.9141\\-89\\-167.6093\\-169.0078\\-89\\-167.2466\\-167.0547\\-89\\-166.7041\\-165.1016\\-89\\-166.2699\\-163.1484\\-89\\-165.5564\\-159.2422\\-89\\-164.3473\\-155.3359\\-89\\-163.4206\\-151.4297\\-89\\-162.6219\\-149.4766\\-89\\-161.583\\-145.5703\\-89\\-160.6611\\-143.6172\\-89\\-159.934\\-141.6641\\-89\\-158.9188\\-139.7109\\-89\\-156.0927\\-133.8516\\-89\\-154.9531\\-131.8984\\-89\\-154.0093\\-129.9453\\-89\\-153.3203\\-128.8752\\-89\\-149.9941\\-124.0859\\-89\\-147.4609\\-120.8338\\-89\\-143.5547\\-116.5082\\-89\\-141.4759\\-114.3203\\-89\\-139.3573\\-112.3672\\-89\\-134.9037\\-108.4609\\-89\\-131.8359\\-106.0996\\-89\\-127.9297\\-103.351\\-89\\-125.9766\\-101.8785\\-89\\-124.0234\\-100.9599\\-89\\-122.0703\\-99.78455\\-89\\-120.1172\\-98.79209\\-89\\-118.1641\\-97.65506\\-89\\-114.2578\\-95.83392\\-89\\-112.3047\\-95.13611\\-89\\-110.3516\\-94.30451\\-89\\-108.3984\\-93.81928\\-89\\-104.4922\\-92.53935\\-89\\-102.5391\\-92.04818\\-89\\-98.63281\\-91.18508\\-89\\-96.67969\\-90.56437\\-89\\-94.72656\\-90.16711\\-89\\-86.91406\\-89.10202\\-89\\-84.96094\\-88.78899\\-89\\-81.05469\\-88.50677\\-89\\-77.14844\\-88.28588\\-89\\-73.24219\\-88.20081\\-89\\-69.33594\\-88.21122\\-89\\-63.47656\\-88.42305\\-89\\-59.57031\\-88.69563\\-89\\-57.61719\\-88.9381\\-89\\-49.80469\\-90.11112\\-89\\-46.28314\\-90.88281\\-89\\-43.94531\\-91.53625\\-89\\-41.99219\\-91.97019\\-89\\-40.03906\\-92.58994\\-89\\-38.08594\\-93.34375\\-89\\-34.17969\\-94.71128\\-89\\-30.27344\\-96.56985\\-89\\-28.32031\\-97.7575\\-89\\-26.36719\\-99.20885\\-89\\-24.41406\\-100.3287\\-89\\-22.46094\\-101.9834\\-89\\-19.86557\\-104.5547\\-89\\-18.16579\\-106.5078\\-89\\-16.60156\\-108.5177\\-89\\-15.3845\\-110.4141\\-89\\-14.02065\\-112.3672\\-89\\-11.92898\\-116.2734\\-89\\-9.707755\\-120.1797\\-89\\-8.444864\\-122.1328\\-89\\-7.458785\\-124.0859\\-89\\-6.276777\\-126.0391\\-89\\-5.33288\\-127.9922\\-89\\-3.957201\\-129.9453\\-89\\-2.95989\\-131.8984\\-89\\-0.9765625\\-134.877\\-89\\0.2335259\\-135.8047\\-89\\0.9765625\\-136.5477\\-89\\2.929688\\-135.5293\\-89\\3.590593\\-133.8516\\-89\\4.48666\\-131.8984\\-89\\5.282738\\-129.9453\\-89\\7.213665\\-126.0391\\-89\\8.019912\\-124.0859\\-89\\9.232133\\-122.1328\\-89\\10.21359\\-120.1797\\-89\\12.53568\\-116.2734\\-89\\14.98028\\-112.3672\\-89\\16.50301\\-110.4141\\-89\\17.68973\\-108.4609\\-89\\21.01452\\-104.5547\\-89\\22.46094\\-103.0215\\-89\\26.36719\\-99.51225\\-89\\28.32031\\-97.90864\\-89\\30.27344\\-96.71375\\-89\\32.22656\\-95.25452\\-89\\36.29557\\-92.83594\\-89\\38.08594\\-92.07468\\-89\\40.03906\\-91.12471\\-89\\41.99219\\-90.02069\\-89\\43.94531\\-89.43815\\-89\\45.89844\\-88.54072\\-89\\49.80469\\-87.71088\\-89\\51.75781\\-87.18076\\-89\\53.71094\\-86.78782\\-89\\59.57031\\-86.02123\\-89\\63.47656\\-85.77408\\-89\\69.33594\\-85.66691\\-89\\71.28906\\-85.70181\\-89\\75.19531\\-85.95959\\-89\\79.10156\\-86.34505\\-89\\81.05469\\-86.47453\\-89\\83.00781\\-86.80846\\-89\\84.96094\\-87.0376\\-89\\88.86719\\-87.7812\\-89\\90.82031\\-88.03507\\-89\\94.72656\\-88.70996\\-89\\96.67969\\-89.32478\\-89\\100.5859\\-90.28241\\-89\\104.4922\\-91.69994\\-89\\106.4453\\-92.2364\\-89\\108.3984\\-93.04284\\-89\\112.3047\\-94.35756\\-89\\114.2578\\-95.3648\\-89\\116.2109\\-96.18716\\-89\\118.1641\\-97.36801\\-89\\120.1172\\-98.24609\\-89\\122.0703\\-99.44705\\-89\\124.0234\\-100.4023\\-89\\125.9766\\-101.5557\\-89\\129.8828\\-104.2633\\-89\\135.2494\\-108.4609\\-89\\139.2402\\-112.3672\\-89\\141.1684\\-114.3203\\-89\\142.7225\\-116.2734\\-89\\146.0033\\-120.1797\\-89\\147.5034\\-122.1328\\-89\\148.7145\\-124.0859\\-89\\150.0767\\-126.0391\\-89\\152.4029\\-129.9453\\-89\\153.7673\\-131.8984\\-89\\154.7388\\-133.8516\\-89\\155.8913\\-135.8047\\-89\\156.5865\\-137.7578\\-89\\157.7025\\-139.7109\\-89\\158.4343\\-141.6641\\-89\\159.5117\\-143.6172\\-89\\160.9086\\-147.5234\\-89\\161.7314\\-149.4766\\-89\\162.5325\\-153.3828\\-89\\163.2276\\-155.3359\\-89\\163.7723\\-157.2891\\-89\\164.3975\\-161.1953\\-89\\164.7828\\-163.1484\\-89\\165.3539\\-165.1016\\-89\\165.888\\-169.0078\\-89\\166.51\\-174.8672\\-89\\167.0149\\-178.7734\\-89\\167.3327\\-182.6797\\-89\\167.5308\\-186.5859\\-89\\167.649\\-192.4453\\-89\\167.6988\\-198.3047\\-89\\167.6062\\-206.1172\\-89\\167.335\\-211.9766\\-89\\166.896\\-215.8828\\-89\\166.5853\\-217.8359\\-89\\165.8053\\-223.6953\\-89\\165.4738\\-225.6484\\-89\\164.3244\\-229.5547\\-89\\163.9546\\-231.5078\\-89\\163.4857\\-233.4609\\-89\\162.6244\\-235.4141\\-89\\161.6498\\-239.3203\\-89\\160.6257\\-241.2734\\-89\\159.9066\\-243.2266\\-89\\158.6699\\-245.1797\\-89\\157.8189\\-247.1328\\-89\\156.582\\-249.0859\\-89\\155.748\\-251.0391\\-89\\153.3203\\-254.84\\-89\\151.9112\\-256.8984\\-89\\150.3551\\-258.8516\\-89\\149.4141\\-260.2632\\-89\\147.583\\-262.7578\\-89\\145.9548\\-264.7109\\-89\\144.1687\\-266.6641\\-89\\143.5547\\-267.4468\\-89\\140.7399\\-270.5703\\-89\\139.6484\\-271.6272\\-89\\137.6953\\-273.7228\\-89\\135.0042\\-276.4297\\-89\\133.7891\\-277.4633\\-89\\129.8828\\-281.0733\\-89\\127.9297\\-282.6954\\-89\\125.9766\\-283.9142\\-89\\122.0703\\-287.0668\\-89\\120.1172\\-288.4859\\-89\\118.1641\\-289.4354\\-89\\116.2109\\-290.7966\\-89\\110.3516\\-294.3121\\-89\\108.3984\\-295.0693\\-89\\104.4922\\-296.7859\\-89\\102.5391\\-297.4011\\-89\\100.5859\\-298.3937\\-89\\96.67969\\-299.5352\\-89\\94.72656\\-300.2515\\-89\\92.77344\\-300.6249\\-89\\86.91406\\-301.4696\\-89\\83.00781\\-302.1147\\-89\\79.10156\\-302.4315\\-89\\75.19531\\-302.4978\\-89\\71.28906\\-302.3884\\-89\\67.38281\\-302.0349\\-89\\63.47656\\-301.3254\\-89\\59.57031\\-300.7196\\-89\\57.61719\\-300.3307\\-89\\55.66406\\-299.5138\\-89\\53.71094\\-298.8702\\-89\\51.75781\\-298.1011\\-89\\49.80469\\-297.0685\\-89\\47.85156\\-296.3229\\-89\\45.89844\\-295.1636\\-89\\43.94531\\-294.2354\\-89\\41.99219\\-292.9319\\-89\\38.08594\\-289.7512\\-89\\36.13281\\-288.3438\\-89\\33.8199\\-286.1953\\-89\\30.5625\\-282.2891\\-89\\28.32031\\-279.7237\\-89\\25.86515\\-276.4297\\-89\\24.78027\\-274.4766\\-89\\24.41406\\-274.0649\\-89\\22.46094\\-271.0701\\-89\\22.03776\\-270.5703\\-89\\21.07219\\-268.6172\\-89\\19.85051\\-266.6641\\-89\\19.24143\\-264.7109\\-89\\18.18359\\-262.7578\\-89\\17.50103\\-260.8047\\-89\\15.79392\\-256.8984\\-89\\15.13983\\-254.9453\\-89\\14.08406\\-252.9922\\-89\\13.48039\\-251.0391\\-89\\12.69531\\-249.3473\\-89\\11.49164\\-247.1328\\-89\\10.74219\\-246.0704\\-89\\8.789063\\-244.0684\\-89\\6.835938\\-243.5419\\-89\\4.882813\\-243.3264\\-89\\2.929688\\-243.2124\\-89\\0.9765625\\-243.2128\\-89\\-0.9765625\\-243.3253\\-89\\-2.929688\\-243.6507\\-89\\-4.882813\\-244.5326\\-89\\-6.835938\\-245.9444\\-89\\-8.789063\\-247.7581\\-89\\-10.74219\\-249.8765\\-89\\-11.5899\\-251.0391\\-89\\-12.7038\\-252.9922\\-89\\-14.64844\\-256.9527\\-89\\-16.60156\\-260.7721\\-89\\-18.55469\\-264.3717\\-89\\-18.80258\\-264.7109\\-89\\-19.6418\\-266.6641\\-89\\-21.93117\\-270.5703\\-89\\-23.38973\\-272.5234\\-89\\-24.72444\\-274.4766\\-89\\-25.8893\\-276.4297\\-89\\-27.32544\\-278.3828\\-89\\-28.93814\\-280.3359\\-89\\-30.78326\\-282.2891\\-89\\-33.82259\\-286.1953\\-89\\-36.13281\\-288.4865\\-89\\-38.08594\\-290.0431\\-89\\-40.38943\\-292.0547\\-89\\-43.94531\\-294.7527\\-89\\-45.89844\\-295.7092\\-89\\-47.85156\\-296.8333\\-89\\-49.80469\\-297.7058\\-89\\-51.75781\\-298.7367\\-89\\-53.71094\\-299.4325\\-89\\-55.66406\\-300.3156\\-89\\-57.61719\\-300.741\\-89\\-61.52344\\-301.4447\\-89\\-63.47656\\-301.9203\\-89\\-65.42969\\-302.234\\-89\\-69.33594\\-302.5377\\-89\\-73.24219\\-302.6028\\-89\\-77.14844\\-302.4898\\-89\\-79.10156\\-302.3442\\-89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "342" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "82" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-301.95\\-87\\-83.00781\\-301.5546\\-87\\-88.86719\\-300.6905\\-87\\-90.82031\\-300.3464\\-87\\-94.72656\\-299.0786\\-87\\-96.67969\\-298.5848\\-87\\-98.63281\\-297.6699\\-87\\-102.5391\\-296.3229\\-87\\-104.4922\\-295.3163\\-87\\-106.4453\\-294.6692\\-87\\-108.3984\\-293.5036\\-87\\-110.3516\\-292.543\\-87\\-110.973\\-292.0547\\-87\\-114.2578\\-289.9375\\-87\\-116.2109\\-288.8497\\-87\\-119.9166\\-286.1953\\-87\\-122.4828\\-284.2422\\-87\\-125.9766\\-281.3446\\-87\\-127.9297\\-279.5614\\-87\\-129.8828\\-277.5714\\-87\\-133.7891\\-273.7957\\-87\\-137.6953\\-269.518\\-87\\-140.1828\\-266.6641\\-87\\-141.6423\\-264.7109\\-87\\-142.9478\\-262.7578\\-87\\-143.5547\\-262.0254\\-87\\-145.8513\\-258.8516\\-87\\-148.4438\\-254.9453\\-87\\-149.6582\\-252.9922\\-87\\-150.5969\\-251.0391\\-87\\-151.965\\-249.0859\\-87\\-152.9833\\-247.1328\\-87\\-154.1466\\-245.1797\\-87\\-156.0903\\-241.2734\\-87\\-156.81\\-239.3203\\-87\\-157.9383\\-237.3672\\-87\\-158.7137\\-235.4141\\-87\\-159.829\\-233.4609\\-87\\-160.5195\\-231.5078\\-87\\-161.5221\\-229.5547\\-87\\-162.0854\\-227.6016\\-87\\-162.5398\\-225.6484\\-87\\-163.4294\\-223.6953\\-87\\-164.4088\\-219.7891\\-87\\-165.2007\\-217.8359\\-87\\-165.7986\\-215.8828\\-87\\-166.671\\-211.9766\\-87\\-167.2818\\-210.0234\\-87\\-167.6296\\-208.0703\\-87\\-168.07\\-204.1641\\-87\\-168.6059\\-198.3047\\-87\\-169.0313\\-194.3984\\-87\\-169.2755\\-190.4922\\-87\\-169.2518\\-186.5859\\-87\\-169.0607\\-182.6797\\-87\\-168.641\\-178.7734\\-87\\-168.1125\\-172.9141\\-87\\-167.7231\\-169.0078\\-87\\-167.4521\\-167.0547\\-87\\-167.03\\-165.1016\\-87\\-166.4975\\-163.1484\\-87\\-165.8045\\-159.2422\\-87\\-165.4084\\-157.2891\\-87\\-164.7181\\-155.3359\\-87\\-164.2012\\-153.3828\\-87\\-163.8028\\-151.4297\\-87\\-163.2146\\-149.4766\\-87\\-162.4627\\-147.5234\\-87\\-161.9725\\-145.5703\\-87\\-161.3622\\-143.6172\\-87\\-160.4553\\-141.6641\\-87\\-159.7545\\-139.7109\\-87\\-158.6393\\-137.7578\\-87\\-157.8182\\-135.8047\\-87\\-156.692\\-133.8516\\-87\\-155.8183\\-131.8984\\-87\\-154.7164\\-129.9453\\-87\\-153.7211\\-127.9922\\-87\\-150.9124\\-124.0859\\-87\\-149.6698\\-122.1328\\-87\\-148.1247\\-120.1797\\-87\\-146.3382\\-118.2266\\-87\\-144.3998\\-116.2734\\-87\\-143.5547\\-115.2896\\-87\\-140.6599\\-112.3672\\-87\\-138.463\\-110.4141\\-87\\-137.6953\\-109.5421\\-87\\-135.7422\\-107.8227\\-87\\-133.7891\\-106.2969\\-87\\-129.8828\\-103.4834\\-87\\-127.9297\\-101.8963\\-87\\-125.5412\\-100.6484\\-87\\-118.1641\\-96.42938\\-87\\-114.2578\\-94.71197\\-87\\-112.3047\\-93.97414\\-87\\-110.3516\\-93.38885\\-87\\-108.3984\\-92.5622\\-87\\-106.4453\\-92.03911\\-87\\-102.5391\\-90.79548\\-87\\-98.63281\\-89.87454\\-87\\-96.67969\\-89.53326\\-87\\-90.82031\\-88.32713\\-87\\-86.91406\\-87.91968\\-87\\-79.10156\\-87.4313\\-87\\-77.14844\\-87.19447\\-87\\-73.24219\\-87.10176\\-87\\-67.38281\\-87.23438\\-87\\-63.47656\\-87.53969\\-87\\-59.57031\\-87.72093\\-87\\-55.66406\\-88.01332\\-87\\-51.75781\\-88.48986\\-87\\-47.85156\\-89.35461\\-87\\-43.94531\\-90.12535\\-87\\-41.99219\\-90.63492\\-87\\-40.03906\\-91.4294\\-87\\-36.13281\\-92.66448\\-87\\-34.17969\\-93.61306\\-87\\-32.22656\\-94.21235\\-87\\-28.32031\\-96.25391\\-87\\-26.36719\\-97.53095\\-87\\-24.41406\\-98.68697\\-87\\-21.95351\\-100.6484\\-87\\-20.50781\\-102.0013\\-87\\-18.11801\\-104.5547\\-87\\-16.60156\\-106.5639\\-87\\-15.32219\\-108.4609\\-87\\-13.90122\\-110.4141\\-87\\-12.8768\\-112.3672\\-87\\-10.44922\\-116.2734\\-87\\-9.427584\\-118.2266\\-87\\-8.28528\\-120.1797\\-87\\-7.370722\\-122.1328\\-87\\-3.431659\\-127.9922\\-87\\-1.726974\\-129.9453\\-87\\-0.9765625\\-130.9219\\-87\\0.9765625\\-131.7129\\-87\\2.929688\\-130.2069\\-87\\4.327948\\-127.9922\\-87\\5.379512\\-126.0391\\-87\\6.11764\\-124.0859\\-87\\7.284628\\-122.1328\\-87\\8.163061\\-120.1797\\-87\\10.47138\\-116.2734\\-87\\11.84264\\-114.3203\\-87\\12.69531\\-112.8169\\-87\\14.37988\\-110.4141\\-87\\15.53858\\-108.4609\\-87\\19.09722\\-104.5547\\-87\\20.79613\\-102.6016\\-87\\22.89807\\-100.6484\\-87\\26.36719\\-97.5284\\-87\\28.32031\\-95.98264\\-87\\30.27344\\-94.81779\\-87\\33.2955\\-92.83594\\-87\\36.66992\\-90.88281\\-87\\40.03906\\-89.40142\\-87\\41.99219\\-88.44551\\-87\\45.89844\\-87.3265\\-87\\47.85156\\-86.65844\\-87\\53.71094\\-85.51563\\-87\\57.61719\\-84.88847\\-87\\61.52344\\-84.5722\\-87\\67.38281\\-84.4375\\-87\\71.28906\\-84.47174\\-87\\75.19531\\-84.80889\\-87\\79.10156\\-85.34121\\-87\\83.00781\\-85.78448\\-87\\84.96094\\-86.10654\\-87\\86.91406\\-86.30196\\-87\\88.86719\\-86.62728\\-87\\92.77344\\-87.57374\\-87\\96.67969\\-88.21631\\-87\\100.5859\\-89.39642\\-87\\102.5391\\-89.91936\\-87\\104.4922\\-90.56666\\-87\\108.3984\\-92.10775\\-87\\110.3516\\-92.72412\\-87\\112.3047\\-93.60763\\-87\\114.2578\\-94.21333\\-87\\116.2109\\-95.37069\\-87\\118.1641\\-96.22274\\-87\\120.1172\\-97.38659\\-87\\122.0703\\-98.34457\\-87\\124.0234\\-99.57627\\-87\\125.9766\\-100.6067\\-87\\127.9297\\-101.8358\\-87\\129.8828\\-103.4006\\-87\\133.7891\\-106.2731\\-87\\135.7422\\-107.8932\\-87\\137.6953\\-109.7175\\-87\\138.2948\\-110.4141\\-87\\140.3256\\-112.3672\\-87\\142.0975\\-114.3203\\-87\\143.6571\\-116.2734\\-87\\145.0763\\-118.2266\\-87\\148.2408\\-122.1328\\-87\\149.4879\\-124.0859\\-87\\150.5657\\-126.0391\\-87\\151.983\\-127.9922\\-87\\155.4243\\-133.8516\\-87\\157.1065\\-137.7578\\-87\\158.0707\\-139.7109\\-87\\158.8937\\-141.6641\\-87\\159.8764\\-143.6172\\-87\\160.4718\\-145.5703\\-87\\161.3571\\-147.5234\\-87\\161.9153\\-149.4766\\-87\\162.7276\\-153.3828\\-87\\163.4513\\-155.3359\\-87\\163.849\\-157.2891\\-87\\164.4768\\-161.1953\\-87\\164.8702\\-163.1484\\-87\\165.4061\\-165.1016\\-87\\165.6849\\-167.0547\\-87\\166.4919\\-174.8672\\-87\\166.9693\\-178.7734\\-87\\167.2871\\-182.6797\\-87\\167.5199\\-188.5391\\-87\\167.6099\\-194.3984\\-87\\167.6062\\-202.2109\\-87\\167.4338\\-208.0703\\-87\\167.2175\\-211.9766\\-87\\165.7395\\-223.6953\\-87\\165.3856\\-225.6484\\-87\\164.736\\-227.6016\\-87\\164.2589\\-229.5547\\-87\\163.9058\\-231.5078\\-87\\163.3719\\-233.4609\\-87\\162.5682\\-235.4141\\-87\\161.5617\\-239.3203\\-87\\160.536\\-241.2734\\-87\\159.8326\\-243.2266\\-87\\158.5855\\-245.1797\\-87\\157.7402\\-247.1328\\-87\\156.502\\-249.0859\\-87\\155.6279\\-251.0391\\-87\\153.3203\\-254.673\\-87\\149.4141\\-260.0723\\-87\\147.4609\\-262.6914\\-87\\143.5547\\-267.3026\\-87\\140.5995\\-270.5703\\-87\\139.6484\\-271.4685\\-87\\137.6953\\-273.5716\\-87\\134.8159\\-276.4297\\-87\\133.7891\\-277.2971\\-87\\130.4321\\-280.3359\\-87\\129.8828\\-280.905\\-87\\127.9297\\-282.4544\\-87\\125.9766\\-283.687\\-87\\122.0703\\-286.9027\\-87\\120.1172\\-288.2045\\-87\\118.1641\\-289.3014\\-87\\116.2109\\-290.6293\\-87\\114.2578\\-291.6786\\-87\\112.3047\\-292.9773\\-87\\110.3516\\-294.0938\\-87\\108.3984\\-294.9844\\-87\\106.4453\\-295.6913\\-87\\104.4922\\-296.6759\\-87\\102.5391\\-297.2688\\-87\\100.5859\\-298.2502\\-87\\96.67969\\-299.4066\\-87\\94.72656\\-300.1621\\-87\\92.77344\\-300.5582\\-87\\86.91406\\-301.3855\\-87\\83.00781\\-302.0349\\-87\\79.10156\\-302.3664\\-87\\75.19531\\-302.4189\\-87\\71.28906\\-302.302\\-87\\67.38281\\-301.9063\\-87\\65.42969\\-301.5546\\-87\\59.57031\\-300.6698\\-87\\57.61719\\-300.2462\\-87\\55.66406\\-299.4311\\-87\\53.71094\\-298.8183\\-87\\51.75781\\-298.0088\\-87\\49.80469\\-297.0297\\-87\\47.85156\\-296.2511\\-87\\45.89844\\-295.1125\\-87\\43.94531\\-294.1528\\-87\\41.99219\\-292.8612\\-87\\36.13281\\-288.1733\\-87\\34.00143\\-286.1953\\-87\\30.70665\\-282.2891\\-87\\28.32031\\-279.6927\\-87\\25.87544\\-276.4297\\-87\\24.78299\\-274.4766\\-87\\24.41406\\-274.0683\\-87\\22.46094\\-271.1273\\-87\\21.98882\\-270.5703\\-87\\20.9763\\-268.6172\\-87\\19.75994\\-266.6641\\-87\\19.11734\\-264.7109\\-87\\17.99581\\-262.7578\\-87\\17.3133\\-260.8047\\-87\\16.22498\\-258.8516\\-87\\15.51589\\-256.8984\\-87\\12.77043\\-251.0391\\-87\\11.35578\\-249.0859\\-87\\10.74219\\-248.3856\\-87\\8.789063\\-247.0694\\-87\\6.835938\\-246.2015\\-87\\4.882813\\-245.8618\\-87\\0.9765625\\-245.7929\\-87\\-0.9765625\\-245.8711\\-87\\-6.835938\\-248.1008\\-87\\-8.789063\\-249.5742\\-87\\-10.74219\\-251.4601\\-87\\-11.86294\\-252.9922\\-87\\-13.10532\\-254.9453\\-87\\-13.99075\\-256.8984\\-87\\-15.13991\\-258.8516\\-87\\-16.04269\\-260.8047\\-87\\-17.31451\\-262.7578\\-87\\-18.18427\\-264.7109\\-87\\-19.39087\\-266.6641\\-87\\-20.32955\\-268.6172\\-87\\-21.64132\\-270.5703\\-87\\-23.11779\\-272.5234\\-87\\-24.36188\\-274.4766\\-87\\-25.70522\\-276.4297\\-87\\-28.32031\\-279.7856\\-87\\-30.6866\\-282.2891\\-87\\-33.80801\\-286.1953\\-87\\-36.13281\\-288.4588\\-87\\-38.08594\\-289.9632\\-87\\-41.99219\\-293.2393\\-87\\-43.94531\\-294.6736\\-87\\-45.89844\\-295.6012\\-87\\-47.85156\\-296.7499\\-87\\-49.80469\\-297.5354\\-87\\-51.75781\\-298.6258\\-87\\-53.71094\\-299.2766\\-87\\-55.66406\\-300.1752\\-87\\-57.61719\\-300.6427\\-87\\-61.52344\\-301.319\\-87\\-65.42969\\-302.088\\-87\\-67.38281\\-302.3152\\-87\\-71.28906\\-302.4978\\-87\\-73.24219\\-302.5179\\-87\\-77.14844\\-302.3884\\-87\\-79.10156\\-302.2232\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "333" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "83" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-302.0735\\-85\\-83.00781\\-301.4202\\-85\\-86.91406\\-300.9008\\-85\\-90.82031\\-300.2229\\-85\\-92.77344\\-299.5461\\-85\\-96.67969\\-298.4503\\-85\\-98.63281\\-297.4965\\-85\\-102.5391\\-296.1337\\-85\\-104.4922\\-295.1884\\-85\\-106.4453\\-294.5411\\-85\\-108.3984\\-293.3349\\-85\\-110.3516\\-292.3109\\-85\\-113.7181\\-290.1016\\-85\\-114.2578\\-289.6652\\-85\\-116.2109\\-288.6679\\-85\\-118.1641\\-287.2744\\-85\\-120.1172\\-285.7268\\-85\\-124.0234\\-282.7558\\-85\\-125.9766\\-281.1497\\-85\\-127.9297\\-279.3659\\-85\\-129.8828\\-277.392\\-85\\-131.8359\\-275.5487\\-85\\-134.7973\\-272.5234\\-85\\-136.5412\\-270.5703\\-85\\-139.8959\\-266.6641\\-85\\-142.7532\\-262.7578\\-85\\-143.5547\\-261.756\\-85\\-146.9038\\-256.8984\\-85\\-148.3311\\-254.9453\\-85\\-150.5172\\-251.0391\\-85\\-151.8524\\-249.0859\\-85\\-152.8416\\-247.1328\\-85\\-154.0864\\-245.1797\\-85\\-154.9871\\-243.2266\\-85\\-156.0658\\-241.2734\\-85\\-156.7219\\-239.3203\\-85\\-157.887\\-237.3672\\-85\\-158.6398\\-235.4141\\-85\\-159.7634\\-233.4609\\-85\\-160.4452\\-231.5078\\-85\\-161.449\\-229.5547\\-85\\-162.0558\\-227.6016\\-85\\-162.4874\\-225.6484\\-85\\-163.3478\\-223.6953\\-85\\-163.9237\\-221.7422\\-85\\-164.3494\\-219.7891\\-85\\-165.0912\\-217.8359\\-85\\-165.7336\\-215.8828\\-85\\-166.5728\\-211.9766\\-85\\-167.1819\\-210.0234\\-85\\-167.5698\\-208.0703\\-85\\-168.0279\\-204.1641\\-85\\-168.7589\\-196.3516\\-85\\-168.9853\\-194.3984\\-85\\-169.2397\\-190.4922\\-85\\-169.2518\\-186.5859\\-85\\-169.1043\\-182.6797\\-85\\-168.5002\\-176.8203\\-85\\-167.9982\\-170.9609\\-85\\-167.589\\-167.0547\\-85\\-167.2702\\-165.1016\\-85\\-166.7517\\-163.1484\\-85\\-166.3392\\-161.1953\\-85\\-165.648\\-157.2891\\-85\\-165.1611\\-155.3359\\-85\\-164.4714\\-153.3828\\-85\\-163.6258\\-149.4766\\-85\\-162.8399\\-147.5234\\-85\\-162.2392\\-145.5703\\-85\\-161.7902\\-143.6172\\-85\\-159.4256\\-137.7578\\-85\\-158.3368\\-135.8047\\-85\\-157.4673\\-133.8516\\-85\\-156.3358\\-131.8984\\-85\\-155.5272\\-129.9453\\-85\\-153.3203\\-126.3074\\-85\\-151.8621\\-124.0859\\-85\\-150.3641\\-122.1328\\-85\\-149.4141\\-120.6781\\-85\\-147.5042\\-118.2266\\-85\\-145.8256\\-116.2734\\-85\\-142.094\\-112.3672\\-85\\-139.6484\\-109.9604\\-85\\-137.6953\\-108.241\\-85\\-135.4797\\-106.5078\\-85\\-133.7891\\-105.4083\\-85\\-131.8359\\-103.7064\\-85\\-129.8828\\-102.183\\-85\\-125.9766\\-99.79311\\-85\\-124.0234\\-98.77449\\-85\\-120.1172\\-96.40673\\-85\\-118.1641\\-95.51968\\-85\\-116.2109\\-94.50658\\-85\\-112.3047\\-93.10009\\-85\\-110.3516\\-92.19567\\-85\\-108.3984\\-91.49225\\-85\\-106.4453\\-90.68153\\-85\\-104.4922\\-90.18153\\-85\\-100.5859\\-89.34821\\-85\\-96.67969\\-88.40162\\-85\\-94.72656\\-88.06088\\-85\\-88.86719\\-87.3125\\-85\\-86.91406\\-86.85347\\-85\\-81.05469\\-86.17361\\-85\\-75.19531\\-85.96461\\-85\\-69.33594\\-85.98595\\-85\\-63.47656\\-86.20229\\-85\\-57.61719\\-86.71875\\-85\\-55.66406\\-87.1489\\-85\\-47.85156\\-88.147\\-85\\-43.94531\\-88.93841\\-85\\-41.99219\\-89.55381\\-85\\-38.08594\\-90.66844\\-85\\-36.13281\\-91.69441\\-85\\-34.17969\\-92.16885\\-85\\-32.22656\\-93.08656\\-85\\-30.27344\\-93.88593\\-85\\-26.36719\\-95.92704\\-85\\-24.41406\\-97.43646\\-85\\-22.46094\\-99.12306\\-85\\-20.50781\\-100.3781\\-85\\-18.55469\\-102.3032\\-85\\-16.60156\\-104.5666\\-85\\-15.32813\\-106.5078\\-85\\-13.88451\\-108.4609\\-85\\-12.79386\\-110.4141\\-85\\-10.23888\\-114.3203\\-85\\-8.079529\\-118.2266\\-85\\-7.106236\\-120.1797\\-85\\-5.817282\\-122.1328\\-85\\-4.27132\\-124.0859\\-85\\-2.929688\\-126.2721\\-85\\-0.9765625\\-127.7083\\-85\\0.9765625\\-128.0736\\-85\\2.929688\\-126.6759\\-85\\3.348214\\-126.0391\\-85\\4.199219\\-124.0859\\-85\\5.449567\\-122.1328\\-85\\6.338266\\-120.1797\\-85\\7.642663\\-118.2266\\-85\\8.53056\\-116.2734\\-85\\10.74219\\-112.8805\\-85\\12.55446\\-110.4141\\-85\\13.62581\\-108.4609\\-85\\15.26663\\-106.5078\\-85\\18.55469\\-102.9866\\-85\\20.82689\\-100.6484\\-85\\22.46094\\-99.21332\\-85\\24.41406\\-97.37943\\-85\\26.36719\\-95.68853\\-85\\28.32031\\-94.50133\\-85\\30.78676\\-92.83594\\-85\\34.17969\\-90.78242\\-85\\36.13281\\-89.87186\\-85\\38.08594\\-88.76549\\-85\\41.99219\\-87.35217\\-85\\43.94531\\-86.49568\\-85\\45.89844\\-86.04954\\-85\\47.85156\\-85.73179\\-85\\49.80469\\-84.92106\\-85\\51.75781\\-84.54213\\-85\\55.66406\\-84.09245\\-85\\57.61719\\-83.7636\\-85\\59.57031\\-83.61869\\-85\\67.38281\\-83.38507\\-85\\69.33594\\-83.36893\\-85\\75.19531\\-83.86872\\-85\\77.14844\\-84.12524\\-85\\81.05469\\-84.43218\\-85\\83.00781\\-84.65176\\-85\\86.91406\\-85.40022\\-85\\88.86719\\-85.89787\\-85\\92.77344\\-86.51252\\-85\\94.72656\\-86.93654\\-85\\96.67969\\-87.57807\\-85\\100.5859\\-88.30953\\-85\\104.4922\\-89.73114\\-85\\106.4453\\-90.31426\\-85\\110.3516\\-91.98917\\-85\\112.3047\\-92.59544\\-85\\114.2578\\-93.54046\\-85\\116.2109\\-94.3158\\-85\\118.1641\\-95.46568\\-85\\120.1172\\-96.34459\\-85\\125.9766\\-99.82162\\-85\\127.9297\\-101.1291\\-85\\129.8828\\-102.3214\\-85\\131.8359\\-103.8413\\-85\\134.9626\\-106.5078\\-85\\137.6953\\-108.9063\\-85\\141.0404\\-112.3672\\-85\\143.5547\\-115.3052\\-85\\145.9284\\-118.2266\\-85\\147.4609\\-120.2524\\-85\\150.0498\\-124.0859\\-85\\151.3672\\-126.3519\\-85\\153.7228\\-129.9453\\-85\\154.701\\-131.8984\\-85\\155.8821\\-133.8516\\-85\\156.5524\\-135.8047\\-85\\157.6335\\-137.7578\\-85\\158.3499\\-139.7109\\-85\\159.4154\\-141.6641\\-85\\160.7489\\-145.5703\\-85\\161.6244\\-147.5234\\-85\\162.3831\\-151.4297\\-85\\162.9118\\-153.3828\\-85\\163.5957\\-155.3359\\-85\\164.5058\\-161.1953\\-85\\165.426\\-165.1016\\-85\\165.7088\\-167.0547\\-85\\166.4568\\-174.8672\\-85\\166.8683\\-178.7734\\-85\\167.2175\\-182.6797\\-85\\167.4338\\-188.5391\\-85\\167.5374\\-194.3984\\-85\\167.5046\\-202.2109\\-85\\167.4116\\-206.1172\\-85\\167.073\\-211.9766\\-85\\165.6672\\-223.6953\\-85\\165.2629\\-225.6484\\-85\\164.6369\\-227.6016\\-85\\163.8292\\-231.5078\\-85\\163.2561\\-233.4609\\-85\\162.4962\\-235.4141\\-85\\162.0558\\-237.3672\\-85\\161.4583\\-239.3203\\-85\\160.4452\\-241.2734\\-85\\159.7301\\-243.2266\\-85\\158.4967\\-245.1797\\-85\\157.6233\\-247.1328\\-85\\156.4097\\-249.0859\\-85\\155.5213\\-251.0391\\-85\\153.3203\\-254.4661\\-85\\150.2114\\-258.8516\\-85\\148.6603\\-260.8047\\-85\\147.4609\\-262.4749\\-85\\143.5547\\-267.1406\\-85\\140.4284\\-270.5703\\-85\\138.453\\-272.5234\\-85\\137.6953\\-273.4023\\-85\\134.583\\-276.4297\\-85\\133.7891\\-277.0945\\-85\\129.8828\\-280.6793\\-85\\127.7875\\-282.2891\\-85\\125.9766\\-283.4847\\-85\\122.0703\\-286.7096\\-85\\120.1172\\-287.8828\\-85\\116.2109\\-290.4206\\-85\\114.2578\\-291.4407\\-85\\112.3047\\-292.8037\\-85\\108.3984\\-294.8562\\-85\\106.4453\\-295.486\\-85\\104.4922\\-296.5321\\-85\\102.5391\\-297.1272\\-85\\100.5859\\-298.0495\\-85\\98.63281\\-298.7329\\-85\\96.67969\\-299.2801\\-85\\94.72656\\-300.0158\\-85\\92.77344\\-300.4695\\-85\\90.82031\\-300.7927\\-85\\84.96094\\-301.5816\\-85\\83.00781\\-301.9211\\-85\\79.10156\\-302.2787\\-85\\75.19531\\-302.325\\-85\\71.28906\\-302.1985\\-85\\67.38281\\-301.7809\\-85\\65.42969\\-301.4447\\-85\\59.57031\\-300.618\\-85\\57.61719\\-300.1548\\-85\\55.66406\\-299.3404\\-85\\53.71094\\-298.7577\\-85\\51.75781\\-297.9217\\-85\\49.80469\\-296.9807\\-85\\47.85156\\-296.1607\\-85\\43.94531\\-294.032\\-85\\41.99219\\-292.7816\\-85\\38.6734\\-290.1016\\-85\\36.39379\\-288.1484\\-85\\34.23762\\-286.1953\\-85\\32.54958\\-284.2422\\-85\\28.32031\\-279.6516\\-85\\25.87544\\-276.4297\\-85\\24.73461\\-274.4766\\-85\\21.87746\\-270.5703\\-85\\19.64043\\-266.6641\\-85\\18.94947\\-264.7109\\-85\\17.79701\\-262.7578\\-85\\16.9987\\-260.8047\\-85\\15.86359\\-258.8516\\-85\\15.05927\\-256.8984\\-85\\13.91258\\-254.9453\\-85\\12.91689\\-252.9922\\-85\\10.74219\\-250.5092\\-85\\8.789063\\-249.3634\\-85\\4.882813\\-248.8981\\-85\\2.929688\\-248.8196\\-85\\-0.9765625\\-249.0447\\-85\\-2.929688\\-249.2487\\-85\\-4.882813\\-249.6457\\-85\\-6.835938\\-250.4469\\-85\\-8.789063\\-251.5826\\-85\\-10.74219\\-253.133\\-85\\-12.17004\\-254.9453\\-85\\-13.45868\\-256.8984\\-85\\-14.38752\\-258.8516\\-85\\-16.60156\\-262.5442\\-85\\-17.78615\\-264.7109\\-85\\-19.03955\\-266.6641\\-85\\-19.941\\-268.6172\\-85\\-22.77261\\-272.5234\\-85\\-24.01456\\-274.4766\\-85\\-25.5028\\-276.4297\\-85\\-28.32031\\-279.9535\\-85\\-30.56483\\-282.2891\\-85\\-33.80238\\-286.1953\\-85\\-36.13281\\-288.4176\\-85\\-38.08594\\-289.9031\\-85\\-41.99219\\-293.1554\\-85\\-43.94531\\-294.5872\\-85\\-45.89844\\-295.4796\\-85\\-47.85156\\-296.6519\\-85\\-49.80469\\-297.3853\\-85\\-51.75781\\-298.5137\\-85\\-53.71094\\-299.1444\\-85\\-55.66406\\-299.9902\\-85\\-57.61719\\-300.5433\\-85\\-59.57031\\-300.9131\\-85\\-63.47656\\-301.516\\-85\\-67.38281\\-302.1761\\-85\\-71.28906\\-302.3884\\-85\\-73.24219\\-302.4189\\-85\\-77.14844\\-302.2476\\-85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "315" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "84" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-301.9056\\-83\\-81.05469\\-301.5671\\-83\\-86.91406\\-300.8099\\-83\\-88.86719\\-300.5163\\-83\\-90.82031\\-300.0941\\-83\\-92.77344\\-299.391\\-83\\-96.67969\\-298.3108\\-83\\-98.63281\\-297.3484\\-83\\-100.5859\\-296.7561\\-83\\-104.4922\\-295.0814\\-83\\-106.4453\\-294.3672\\-83\\-106.9578\\-294.0078\\-83\\-110.3037\\-292.0547\\-83\\-113.4171\\-290.1016\\-83\\-114.2578\\-289.4655\\-83\\-116.2109\\-288.4564\\-83\\-118.1641\\-287.0826\\-83\\-122.0703\\-283.9423\\-83\\-125.9766\\-280.9538\\-83\\-128.7539\\-278.3828\\-83\\-129.8828\\-277.2124\\-83\\-131.8359\\-275.3625\\-83\\-134.6071\\-272.5234\\-83\\-136.3295\\-270.5703\\-83\\-139.5452\\-266.6641\\-83\\-141.0812\\-264.7109\\-83\\-144.0398\\-260.8047\\-83\\-145.3081\\-258.8516\\-83\\-148.2077\\-254.9453\\-83\\-149.2513\\-252.9922\\-83\\-150.4328\\-251.0391\\-83\\-151.7286\\-249.0859\\-83\\-152.7319\\-247.1328\\-83\\-154.0246\\-245.1797\\-83\\-154.8984\\-243.2266\\-83\\-156.0059\\-241.2734\\-83\\-156.6368\\-239.3203\\-83\\-157.8217\\-237.3672\\-83\\-158.562\\-235.4141\\-83\\-159.6994\\-233.4609\\-83\\-160.3777\\-231.5078\\-83\\-161.3571\\-229.5547\\-83\\-162.0135\\-227.6016\\-83\\-162.4412\\-225.6484\\-83\\-163.2561\\-223.6953\\-83\\-163.8682\\-221.7422\\-83\\-164.2891\\-219.7891\\-83\\-165.66\\-215.8828\\-83\\-166.4829\\-211.9766\\-83\\-167.0736\\-210.0234\\-83\\-167.4956\\-208.0703\\-83\\-167.9804\\-204.1641\\-83\\-168.5002\\-198.3047\\-83\\-169.076\\-192.4453\\-83\\-169.2397\\-188.5391\\-83\\-169.1876\\-184.6328\\-83\\-169.1043\\-182.6797\\-83\\-168.7725\\-178.7734\\-83\\-168.5561\\-176.8203\\-83\\-167.6998\\-167.0547\\-83\\-167.3996\\-165.1016\\-83\\-166.5323\\-161.1953\\-83\\-165.4644\\-155.3359\\-83\\-164.7772\\-153.3828\\-83\\-164.2545\\-151.4297\\-83\\-163.8661\\-149.4766\\-83\\-163.3085\\-147.5234\\-83\\-162.5065\\-145.5703\\-83\\-161.5248\\-141.6641\\-83\\-160.6158\\-139.7109\\-83\\-159.9235\\-137.7578\\-83\\-158.8518\\-135.8047\\-83\\-157.959\\-133.8516\\-83\\-156.8112\\-131.8984\\-83\\-156.0484\\-129.9453\\-83\\-153.8928\\-126.0391\\-83\\-152.4682\\-124.0859\\-83\\-149.8473\\-120.1797\\-83\\-148.3251\\-118.2266\\-83\\-145.5078\\-114.9307\\-83\\-141.1865\\-110.4141\\-83\\-139.6484\\-108.9135\\-83\\-137.6953\\-107.2303\\-83\\-134.3839\\-104.5547\\-83\\-131.7792\\-102.6016\\-83\\-127.9297\\-99.9248\\-83\\-124.0234\\-97.73802\\-83\\-122.0703\\-96.48843\\-83\\-120.1172\\-95.52827\\-83\\-118.1641\\-94.46354\\-83\\-114.2578\\-92.72743\\-83\\-110.3516\\-91.28665\\-83\\-108.3984\\-90.34706\\-83\\-102.5391\\-88.65842\\-83\\-94.72656\\-87.23856\\-83\\-90.82031\\-86.41951\\-83\\-86.91406\\-85.83724\\-83\\-83.00781\\-85.48167\\-83\\-81.05469\\-84.98241\\-83\\-79.10156\\-84.81744\\-83\\-75.19531\\-84.62865\\-83\\-71.28906\\-84.60393\\-83\\-69.33594\\-84.64838\\-83\\-63.47656\\-85.10122\\-83\\-61.52344\\-85.43034\\-83\\-57.61719\\-85.69161\\-83\\-55.66406\\-85.89385\\-83\\-53.71094\\-86.23595\\-83\\-51.75781\\-86.45998\\-83\\-48.64211\\-86.97656\\-83\\-43.94531\\-87.82481\\-83\\-40.03906\\-88.83546\\-83\\-38.08594\\-89.56409\\-83\\-36.13281\\-90.13978\\-83\\-34.30176\\-90.88281\\-83\\-30.27344\\-92.63417\\-83\\-26.36719\\-94.57677\\-83\\-24.41406\\-95.74237\\-83\\-23.12859\\-96.74219\\-83\\-20.82376\\-98.69531\\-83\\-18.55469\\-100.9207\\-83\\-16.60156\\-103.0047\\-83\\-15.30198\\-104.5547\\-83\\-13.8718\\-106.5078\\-83\\-11.3801\\-110.4141\\-83\\-10.06944\\-112.3672\\-83\\-5.530895\\-120.1797\\-83\\-2.929688\\-123.1405\\-83\\-0.9765625\\-124.9315\\-83\\0.9765625\\-124.8909\\-83\\2.929688\\-122.7348\\-83\\3.352239\\-122.1328\\-83\\4.347581\\-120.1797\\-83\\6.526067\\-116.2734\\-83\\8.789063\\-112.8027\\-83\\10.5523\\-110.4141\\-83\\11.71875\\-108.4609\\-83\\13.29985\\-106.5078\\-83\\14.983\\-104.5547\\-83\\16.60156\\-102.8066\\-83\\20.79102\\-98.69531\\-83\\24.41406\\-95.47691\\-83\\26.36719\\-94.0629\\-83\\32.22656\\-90.26563\\-83\\34.17969\\-89.32198\\-83\\36.13281\\-88.23328\\-83\\41.99219\\-85.97813\\-83\\43.94531\\-85.45313\\-83\\45.89844\\-84.70289\\-83\\47.85156\\-84.21642\\-83\\49.80469\\-83.8987\\-83\\53.71094\\-83.13028\\-83\\55.66406\\-82.7995\\-83\\57.61719\\-82.62018\\-83\\61.52344\\-82.45908\\-83\\65.42969\\-82.39893\\-83\\69.33594\\-82.39423\\-83\\71.28906\\-82.50349\\-83\\75.19531\\-82.83563\\-83\\79.10156\\-83.36105\\-83\\83.00781\\-83.83429\\-83\\88.86719\\-84.75775\\-83\\90.82031\\-85.33382\\-83\\92.77344\\-85.77927\\-83\\96.67969\\-86.55904\\-83\\100.5859\\-87.71902\\-83\\102.5391\\-88.16048\\-83\\106.4453\\-89.59165\\-83\\108.3984\\-90.19986\\-83\\112.3047\\-91.88457\\-83\\114.2578\\-92.58276\\-83\\116.2109\\-93.63811\\-83\\118.1641\\-94.54294\\-83\\120.1172\\-95.63962\\-83\\122.0703\\-96.56671\\-83\\125.9766\\-99.1729\\-83\\127.9297\\-100.1817\\-83\\131.2328\\-102.6016\\-83\\133.7412\\-104.5547\\-83\\137.6953\\-108.0625\\-83\\140.0905\\-110.4141\\-83\\141.8067\\-112.3672\\-83\\143.5547\\-114.5138\\-83\\144.8775\\-116.2734\\-83\\148.03\\-120.1797\\-83\\149.4141\\-122.3582\\-83\\150.3906\\-124.0859\\-83\\151.7454\\-126.0391\\-83\\154.127\\-129.9453\\-83\\156.1707\\-133.8516\\-83\\156.9132\\-135.8047\\-83\\157.9549\\-137.7578\\-83\\158.6882\\-139.7109\\-83\\159.7385\\-141.6641\\-83\\160.2997\\-143.6172\\-83\\161.8065\\-147.5234\\-83\\162.4835\\-151.4297\\-83\\163.6766\\-155.3359\\-83\\164.5146\\-161.1953\\-83\\165.426\\-165.1016\\-83\\165.6986\\-167.0547\\-83\\166.2585\\-172.9141\\-83\\166.9388\\-180.7266\\-83\\167.2054\\-184.6328\\-83\\167.2871\\-186.5859\\-83\\167.4434\\-194.3984\\-83\\167.4241\\-200.2578\\-83\\167.2982\\-206.1172\\-83\\167.073\\-210.0234\\-83\\166.7026\\-213.9297\\-83\\165.857\\-221.7422\\-83\\165.5853\\-223.6953\\-83\\165.1198\\-225.6484\\-83\\164.5058\\-227.6016\\-83\\163.7612\\-231.5078\\-83\\162.4165\\-235.4141\\-83\\161.9962\\-237.3672\\-83\\161.3164\\-239.3203\\-83\\160.3504\\-241.2734\\-83\\159.6089\\-243.2266\\-83\\158.3951\\-245.1797\\-83\\157.4857\\-247.1328\\-83\\156.3228\\-249.0859\\-83\\155.3615\\-251.0391\\-83\\154.1969\\-252.9922\\-83\\152.7894\\-254.9453\\-83\\150.1098\\-258.8516\\-83\\147.4609\\-262.3038\\-83\\145.3897\\-264.7109\\-83\\142.1606\\-268.6172\\-83\\140.2927\\-270.5703\\-83\\139.6484\\-271.1129\\-83\\137.6953\\-273.221\\-83\\134.4132\\-276.4297\\-83\\129.8828\\-280.4117\\-83\\127.4371\\-282.2891\\-83\\125.9766\\-283.3078\\-83\\122.0703\\-286.4673\\-83\\120.1172\\-287.6117\\-83\\118.1641\\-288.999\\-83\\114.2578\\-291.2527\\-83\\112.3047\\-292.6204\\-83\\110.3516\\-293.5486\\-83\\108.3984\\-294.7231\\-83\\106.4453\\-295.3246\\-83\\104.4922\\-296.3556\\-83\\102.5391\\-297.003\\-83\\98.63281\\-298.6199\\-83\\96.67969\\-299.1485\\-83\\94.57465\\-299.8672\\-83\\92.77344\\-300.3675\\-83\\88.86719\\-300.9908\\-83\\84.96094\\-301.4646\\-83\\81.05469\\-302.0201\\-83\\79.10156\\-302.1505\\-83\\75.19531\\-302.2123\\-83\\71.28906\\-302.0608\\-83\\69.33594\\-301.8906\\-83\\59.57031\\-300.5468\\-83\\57.61719\\-300.0569\\-83\\55.66406\\-299.2597\\-83\\53.71094\\-298.7004\\-83\\47.85156\\-296.0617\\-83\\44.09124\\-294.0078\\-83\\41.99219\\-292.6926\\-83\\38.78021\\-290.1016\\-83\\34.3623\\-286.1953\\-83\\32.63041\\-284.2422\\-83\\28.32031\\-279.6128\\-83\\25.83764\\-276.4297\\-83\\24.625\\-274.4766\\-83\\23.2433\\-272.5234\\-83\\21.72998\\-270.5703\\-83\\20.50781\\-268.6051\\-83\\19.53125\\-266.6641\\-83\\18.6579\\-264.7109\\-83\\14.64844\\-257.4864\\-83\\12.69531\\-254.6587\\-83\\10.74219\\-252.786\\-83\\8.789063\\-252.0156\\-83\\6.835938\\-251.5844\\-83\\2.929688\\-251.3899\\-83\\0.9765625\\-251.4968\\-83\\-0.9765625\\-251.7201\\-83\\-2.929688\\-252.1444\\-83\\-6.835938\\-252.8312\\-83\\-10.74219\\-254.6893\\-83\\-12.69531\\-257.1426\\-83\\-15.02623\\-260.8047\\-83\\-16.07771\\-262.7578\\-83\\-17.42608\\-264.7109\\-83\\-18.47076\\-266.6641\\-83\\-19.63337\\-268.6172\\-83\\-22.2853\\-272.5234\\-83\\-24.41406\\-275.3035\\-83\\-28.32031\\-280.1218\\-83\\-32.22656\\-284.3381\\-83\\-33.80238\\-286.1953\\-83\\-36.13281\\-288.3594\\-83\\-38.08594\\-289.817\\-83\\-41.99219\\-293.0818\\-83\\-43.94531\\-294.4995\\-83\\-45.89844\\-295.3656\\-83\\-47.85156\\-296.5541\\-83\\-49.80469\\-297.2572\\-83\\-51.75781\\-298.3782\\-83\\-53.71094\\-299.0233\\-83\\-55.89489\\-299.8672\\-83\\-57.61719\\-300.4413\\-83\\-59.57031\\-300.8154\\-83\\-63.47656\\-301.3722\\-83\\-67.38281\\-301.9931\\-83\\-71.28906\\-302.2581\\-83\\-73.24219\\-302.2818\\-83\\-77.14844\\-302.1003\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "311" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "85" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-301.9211\\-81\\-81.05469\\-301.4229\\-81\\-84.96094\\-300.9774\\-81\\-88.86719\\-300.4176\\-81\\-90.82031\\-299.9198\\-81\\-92.77344\\-299.2366\\-81\\-94.72656\\-298.7561\\-81\\-96.67969\\-298.1258\\-81\\-98.63281\\-297.2157\\-81\\-100.5859\\-296.6665\\-81\\-102.5391\\-295.702\\-81\\-104.4922\\-294.9722\\-81\\-106.4453\\-294.1205\\-81\\-108.3984\\-293.0094\\-81\\-110.3516\\-291.7292\\-81\\-112.3047\\-290.657\\-81\\-114.2578\\-289.2898\\-81\\-116.2109\\-288.2223\\-81\\-118.1641\\-286.8937\\-81\\-122.0703\\-283.6973\\-81\\-125.9766\\-280.7336\\-81\\-128.52\\-278.3828\\-81\\-131.8359\\-275.168\\-81\\-134.3994\\-272.5234\\-81\\-136.0802\\-270.5703\\-81\\-142.4154\\-262.7578\\-81\\-143.8427\\-260.8047\\-81\\-145.0806\\-258.8516\\-81\\-148.0705\\-254.9453\\-81\\-149.0505\\-252.9922\\-81\\-151.5789\\-249.0859\\-81\\-152.617\\-247.1328\\-81\\-153.9246\\-245.1797\\-81\\-154.7919\\-243.2266\\-81\\-155.9309\\-241.2734\\-81\\-156.5448\\-239.3203\\-81\\-157.7269\\-237.3672\\-81\\-158.4813\\-235.4141\\-81\\-159.6354\\-233.4609\\-81\\-160.3154\\-231.5078\\-81\\-161.232\\-229.5547\\-81\\-161.9656\\-227.6016\\-81\\-162.4079\\-225.6484\\-81\\-163.8143\\-221.7422\\-81\\-164.2376\\-219.7891\\-81\\-164.8324\\-217.8359\\-81\\-165.5773\\-215.8828\\-81\\-166.3925\\-211.9766\\-81\\-167.4116\\-208.0703\\-81\\-167.9281\\-204.1641\\-81\\-168.4275\\-198.3047\\-81\\-169.0009\\-192.4453\\-81\\-169.2004\\-188.5391\\-81\\-169.1599\\-184.6328\\-81\\-169.076\\-182.6797\\-81\\-168.7725\\-178.7734\\-81\\-168.3992\\-174.8672\\-81\\-167.7511\\-167.0547\\-81\\-167.1945\\-163.1484\\-81\\-166.324\\-159.2422\\-81\\-165.6454\\-155.3359\\-81\\-165.1198\\-153.3828\\-81\\-164.4531\\-151.4297\\-81\\-163.6169\\-147.5234\\-81\\-162.8017\\-145.5703\\-81\\-162.2375\\-143.6172\\-81\\-161.8277\\-141.6641\\-81\\-159.4289\\-135.8047\\-81\\-158.3047\\-133.8516\\-81\\-157.4428\\-131.8984\\-81\\-156.3459\\-129.9453\\-81\\-155.5535\\-127.9922\\-81\\-153.3203\\-124.3542\\-81\\-151.871\\-122.1328\\-81\\-148.9444\\-118.2266\\-81\\-147.5483\\-116.2734\\-81\\-145.9615\\-114.3203\\-81\\-141.6016\\-109.6635\\-81\\-139.6484\\-107.7711\\-81\\-137.6953\\-106.1369\\-81\\-135.7422\\-104.7688\\-81\\-131.8359\\-101.6896\\-81\\-127.4414\\-98.69531\\-81\\-125.9766\\-97.94458\\-81\\-120.1172\\-94.48679\\-81\\-118.1641\\-93.67997\\-81\\-116.2109\\-92.69747\\-81\\-114.2578\\-92.02117\\-81\\-110.3516\\-90.23841\\-81\\-108.3984\\-89.64409\\-81\\-106.4453\\-88.88831\\-81\\-104.4922\\-88.25787\\-81\\-100.5859\\-87.61167\\-81\\-96.67969\\-86.60686\\-81\\-92.77344\\-85.97512\\-81\\-86.91406\\-84.70531\\-81\\-83.00781\\-84.31712\\-81\\-81.05469\\-84.02625\\-81\\-79.10156\\-83.8987\\-81\\-75.19531\\-83.77866\\-81\\-69.33594\\-83.72843\\-81\\-63.47656\\-84.07345\\-81\\-61.52344\\-84.27178\\-81\\-57.61719\\-84.48897\\-81\\-55.66406\\-84.72011\\-81\\-51.75781\\-85.52629\\-81\\-49.80469\\-85.75586\\-81\\-47.85156\\-86.1244\\-81\\-45.89844\\-86.31013\\-81\\-43.94531\\-86.68583\\-81\\-41.99219\\-87.47942\\-81\\-38.08594\\-88.32025\\-81\\-36.13281\\-89.08693\\-81\\-32.22656\\-90.49656\\-81\\-30.27344\\-91.47173\\-81\\-28.32031\\-92.31375\\-81\\-26.36719\\-93.42802\\-81\\-24.41406\\-94.34517\\-81\\-22.46094\\-95.72807\\-81\\-20.50781\\-97.31322\\-81\\-19.07723\\-98.69531\\-81\\-16.60156\\-101.2395\\-81\\-15.36923\\-102.6016\\-81\\-13.8747\\-104.5547\\-81\\-12.69531\\-106.4955\\-81\\-10.74219\\-109.2358\\-81\\-8.725767\\-112.3672\\-81\\-7.615613\\-114.3203\\-81\\-6.260016\\-116.2734\\-81\\-5.334165\\-118.2266\\-81\\-2.929688\\-120.9169\\-81\\-0.9765625\\-122.3632\\-81\\0.9765625\\-121.8732\\-81\\2.238724\\-120.1797\\-81\\4.649475\\-116.2734\\-81\\6.034045\\-114.3203\\-81\\6.835938\\-112.9692\\-81\\9.896415\\-108.4609\\-81\\11.50077\\-106.5078\\-81\\14.80962\\-102.6016\\-81\\20.88867\\-96.74219\\-81\\22.46094\\-95.375\\-81\\24.41406\\-93.82078\\-81\\25.79753\\-92.83594\\-81\\30.27344\\-89.87449\\-81\\32.22656\\-88.79405\\-81\\34.17969\\-87.86086\\-81\\36.13281\\-86.80846\\-81\\40.03906\\-85.45119\\-81\\41.99219\\-84.63133\\-81\\45.89844\\-83.61038\\-81\\48.15463\\-83.07031\\-81\\51.75781\\-82.29334\\-81\\57.61719\\-81.80862\\-81\\61.52344\\-81.70454\\-81\\69.33594\\-81.7101\\-81\\73.24219\\-82.00439\\-81\\75.19531\\-82.09375\\-81\\81.05469\\-82.54613\\-81\\84.96094\\-83.35884\\-81\\90.82031\\-84.35731\\-81\\94.72656\\-85.37115\\-81\\98.63281\\-86.26693\\-81\\100.5859\\-86.8138\\-81\\102.5391\\-87.60239\\-81\\104.4922\\-88.06683\\-81\\106.4453\\-88.72369\\-81\\108.3984\\-89.54333\\-81\\110.3516\\-90.19607\\-81\\112.3047\\-91.13458\\-81\\114.2578\\-91.88525\\-81\\118.1641\\-93.87893\\-81\\120.1172\\-94.95054\\-81\\122.0703\\-95.862\\-81\\124.0234\\-97.13135\\-81\\125.9766\\-98.25201\\-81\\131.8359\\-102.2037\\-81\\133.7891\\-103.8071\\-81\\137.6953\\-107.3896\\-81\\139.6484\\-109.2873\\-81\\142.4437\\-112.3672\\-81\\145.546\\-116.2734\\-81\\147.4609\\-118.807\\-81\\149.7919\\-122.1328\\-81\\150.7853\\-124.0859\\-81\\153.4769\\-127.9922\\-81\\154.4495\\-129.9453\\-81\\155.6279\\-131.8984\\-81\\156.3904\\-133.8516\\-81\\157.362\\-135.8047\\-81\\159.0243\\-139.7109\\-81\\159.941\\-141.6641\\-81\\160.4798\\-143.6172\\-81\\161.3164\\-145.5703\\-81\\161.8984\\-147.5234\\-81\\162.5527\\-151.4297\\-81\\163.1705\\-153.3828\\-81\\163.6847\\-155.3359\\-81\\164.5267\\-161.1953\\-81\\165.4061\\-165.1016\\-81\\165.8471\\-169.0078\\-81\\166.1955\\-172.9141\\-81\\167.073\\-184.6328\\-81\\167.2296\\-188.5391\\-81\\167.322\\-196.3516\\-81\\167.2759\\-202.2109\\-81\\167.1143\\-206.1172\\-81\\166.7046\\-211.9766\\-81\\166.1706\\-217.8359\\-81\\165.7589\\-221.7422\\-81\\165.4738\\-223.6953\\-81\\164.3824\\-227.6016\\-81\\163.6684\\-231.5078\\-81\\162.9132\\-233.4609\\-81\\162.3204\\-235.4141\\-81\\161.9225\\-237.3672\\-81\\159.4406\\-243.2266\\-81\\158.277\\-245.1797\\-81\\157.3073\\-247.1328\\-81\\155.2734\\-250.9142\\-81\\154.1051\\-252.9922\\-81\\152.6423\\-254.9453\\-81\\149.996\\-258.8516\\-81\\147.4609\\-262.1414\\-81\\145.1944\\-264.7109\\-81\\142.0495\\-268.6172\\-81\\139.6484\\-270.9647\\-81\\137.6953\\-273.0409\\-81\\135.7422\\-275.0126\\-81\\134.1973\\-276.4297\\-81\\131.8773\\-278.3828\\-81\\129.6609\\-280.3359\\-81\\127.9297\\-281.614\\-81\\124.0234\\-284.6997\\-81\\122.0058\\-286.1953\\-81\\120.1172\\-287.4311\\-81\\118.1641\\-288.819\\-81\\116.2109\\-289.8215\\-81\\115.8854\\-290.1016\\-81\\112.7102\\-292.0547\\-81\\112.3047\\-292.3824\\-81\\110.3516\\-293.3428\\-81\\108.3984\\-294.5575\\-81\\106.4453\\-295.1932\\-81\\104.4922\\-296.1324\\-81\\102.5391\\-296.8829\\-81\\100.5859\\-297.5325\\-81\\98.63281\\-298.4875\\-81\\96.67969\\-299.0009\\-81\\92.77344\\-300.2641\\-81\\88.86719\\-300.9008\\-81\\84.96094\\-301.3454\\-81\\81.05469\\-301.8597\\-81\\77.14844\\-302.0608\\-81\\73.24219\\-302.0201\\-81\\69.33594\\-301.7344\\-81\\63.47656\\-301.0261\\-81\\59.57031\\-300.4695\\-81\\57.61719\\-299.9343\\-81\\55.66406\\-299.182\\-81\\53.71094\\-298.6257\\-81\\51.75781\\-297.6646\\-81\\49.80469\\-296.857\\-81\\45.89844\\-294.9411\\-81\\41.99219\\-292.5751\\-81\\38.92624\\-290.1016\\-81\\34.50521\\-286.1953\\-81\\28.32031\\-279.609\\-81\\25.77718\\-276.4297\\-81\\23.08618\\-272.5234\\-81\\21.57054\\-270.5703\\-81\\20.2469\\-268.6172\\-81\\19.39087\\-266.6641\\-81\\18.22684\\-264.7109\\-81\\17.22935\\-262.7578\\-81\\15.85662\\-260.8047\\-81\\14.64844\\-258.8616\\-81\\12.69531\\-256.5297\\-81\\10.74219\\-255.0517\\-81\\8.789063\\-254.4778\\-81\\6.835938\\-254.3531\\-81\\2.929688\\-254.2459\\-81\\0.9765625\\-254.3228\\-81\\-6.835938\\-255.1459\\-81\\-10.74219\\-256.5698\\-81\\-13.02621\\-258.8516\\-81\\-14.18235\\-260.8047\\-81\\-14.64844\\-261.3851\\-81\\-16.88368\\-264.7109\\-81\\-17.9579\\-266.6641\\-81\\-19.31866\\-268.6172\\-81\\-20.50781\\-270.5594\\-81\\-21.89867\\-272.5234\\-81\\-25.21307\\-276.4297\\-81\\-28.32031\\-280.2907\\-81\\-32.22656\\-284.3707\\-81\\-33.82662\\-286.1953\\-81\\-36.13281\\-288.3138\\-81\\-38.08594\\-289.7363\\-81\\-41.99219\\-292.9981\\-81\\-43.94531\\-294.4054\\-81\\-45.89844\\-295.2735\\-81\\-47.85156\\-296.4428\\-81\\-49.80469\\-297.1428\\-81\\-51.75781\\-298.2201\\-81\\-55.66406\\-299.5891\\-81\\-57.61719\\-300.3278\\-81\\-59.57031\\-300.7309\\-81\\-67.38281\\-301.7806\\-81\\-71.28906\\-302.088\\-81\\-75.19531\\-302.086\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "325" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "86" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-301.9056\\-79\\-81.05469\\-301.3223\\-79\\-86.91406\\-300.6405\\-79\\-88.86719\\-300.325\\-79\\-92.77344\\-299.1188\\-79\\-94.72656\\-298.6414\\-79\\-98.63281\\-297.0948\\-79\\-100.5859\\-296.5541\\-79\\-102.5391\\-295.5277\\-79\\-104.4922\\-294.8631\\-79\\-108.3984\\-292.8522\\-79\\-110.3516\\-291.4922\\-79\\-112.3047\\-290.4339\\-79\\-114.2578\\-289.1429\\-79\\-115.9566\\-288.1484\\-79\\-118.1641\\-286.6836\\-79\\-118.6844\\-286.1953\\-79\\-121.2553\\-284.2422\\-79\\-122.0703\\-283.4997\\-79\\-125.9766\\-280.4646\\-79\\-128.2552\\-278.3828\\-79\\-131.8359\\-274.9048\\-79\\-134.181\\-272.5234\\-79\\-138.9911\\-266.6641\\-79\\-140.6786\\-264.7109\\-79\\-142.2549\\-262.7578\\-79\\-144.8841\\-258.8516\\-79\\-147.9458\\-254.9453\\-79\\-148.8664\\-252.9922\\-79\\-150.2485\\-251.0391\\-79\\-151.4338\\-249.0859\\-79\\-152.5065\\-247.1328\\-79\\-153.8366\\-245.1797\\-79\\-154.694\\-243.2266\\-79\\-155.8568\\-241.2734\\-79\\-156.4777\\-239.3203\\-79\\-157.6361\\-237.3672\\-79\\-158.4104\\-235.4141\\-79\\-159.5691\\-233.4609\\-79\\-160.2689\\-231.5078\\-79\\-161.1407\\-229.5547\\-79\\-161.9104\\-227.6016\\-79\\-162.352\\-225.6484\\-79\\-162.9993\\-223.6953\\-79\\-163.7612\\-221.7422\\-79\\-164.1565\\-219.7891\\-79\\-164.7135\\-217.8359\\-79\\-165.4738\\-215.8828\\-79\\-166.2775\\-211.9766\\-79\\-166.7359\\-210.0234\\-79\\-167.3242\\-208.0703\\-79\\-167.6217\\-206.1172\\-79\\-168.0623\\-202.2109\\-79\\-168.3607\\-198.3047\\-79\\-168.9056\\-192.4453\\-79\\-169.1181\\-188.5391\\-79\\-169.0903\\-184.6328\\-79\\-168.9056\\-180.7266\\-79\\-168.4028\\-174.8672\\-79\\-167.9571\\-169.0078\\-79\\-167.5927\\-165.1016\\-79\\-167.3503\\-163.1484\\-79\\-166.4557\\-159.2422\\-79\\-165.7804\\-155.3359\\-79\\-165.343\\-153.3828\\-79\\-164.6446\\-151.4297\\-79\\-163.7835\\-147.5234\\-79\\-163.1406\\-145.5703\\-79\\-162.3831\\-143.6172\\-79\\-162.0056\\-141.6641\\-79\\-161.3879\\-139.7109\\-79\\-160.4522\\-137.7578\\-79\\-159.7724\\-135.8047\\-79\\-158.6225\\-133.8516\\-79\\-157.8125\\-131.8984\\-79\\-156.6471\\-129.9453\\-79\\-155.9135\\-127.9922\\-79\\-154.7164\\-126.0391\\-79\\-153.6933\\-124.0859\\-79\\-151.3672\\-120.8111\\-79\\-150.8246\\-120.1797\\-79\\-149.6425\\-118.2266\\-79\\-148.2267\\-116.2734\\-79\\-146.5339\\-114.3203\\-79\\-141.2161\\-108.4609\\-79\\-139.0714\\-106.5078\\-79\\-136.7904\\-104.5547\\-79\\-133.7891\\-102.2153\\-79\\-131.8359\\-100.9333\\-79\\-128.7258\\-98.69531\\-79\\-125.9766\\-97.08083\\-79\\-122.0703\\-94.67867\\-79\\-120.1172\\-93.84505\\-79\\-118.1499\\-92.83594\\-79\\-116.2109\\-91.99976\\-79\\-114.1113\\-90.88281\\-79\\-112.3047\\-90.15039\\-79\\-106.4453\\-88.03507\\-79\\-104.4922\\-87.69362\\-79\\-102.5391\\-87.20681\\-79\\-100.5859\\-86.60764\\-79\\-96.67969\\-85.9118\\-79\\-92.77344\\-84.8796\\-79\\-88.86719\\-84.24342\\-79\\-86.91406\\-83.79723\\-79\\-83.00781\\-83.35047\\-79\\-79.10156\\-83.01238\\-79\\-75.19531\\-82.81854\\-79\\-69.33594\\-82.76467\\-79\\-65.42969\\-83.01189\\-79\\-57.61719\\-83.64178\\-79\\-55.66406\\-83.8391\\-79\\-53.71094\\-84.23113\\-79\\-49.80469\\-84.74544\\-79\\-43.94531\\-85.90234\\-79\\-41.99219\\-86.23736\\-79\\-40.03906\\-86.81118\\-79\\-38.08594\\-87.53566\\-79\\-36.13281\\-88.02985\\-79\\-34.17969\\-88.65842\\-79\\-30.27344\\-90.22469\\-79\\-26.36719\\-92.22028\\-79\\-22.46094\\-94.53678\\-79\\-20.50781\\-95.89951\\-79\\-18.55469\\-97.76348\\-79\\-15.72738\\-100.6484\\-79\\-14.05927\\-102.6016\\-79\\-12.81072\\-104.5547\\-79\\-10.74219\\-107.3701\\-79\\-8.610734\\-110.4141\\-79\\-6.835938\\-113.3685\\-79\\-4.704484\\-116.2734\\-79\\-3.503632\\-118.2266\\-79\\-2.929688\\-118.8618\\-79\\-0.9765625\\-120.2565\\-79\\0.9765625\\-119.2599\\-79\\1.756099\\-118.2266\\-79\\2.821181\\-116.2734\\-79\\4.39021\\-114.3203\\-79\\5.648909\\-112.3672\\-79\\8.292644\\-108.4609\\-79\\9.722794\\-106.5078\\-79\\12.69531\\-103.0699\\-79\\14.99924\\-100.6484\\-79\\16.60156\\-99.20073\\-79\\18.55469\\-97.2476\\-79\\20.50781\\-95.39612\\-79\\24.41406\\-92.38929\\-79\\26.36719\\-91.12471\\-79\\28.32031\\-89.69641\\-79\\30.27344\\-88.53401\\-79\\32.22656\\-87.61967\\-79\\34.17969\\-86.50285\\-79\\36.13281\\-85.80894\\-79\\38.08594\\-84.72589\\-79\\40.03906\\-84.17622\\-79\\43.94531\\-82.88314\\-79\\45.89844\\-82.41187\\-79\\47.85156\\-82.04349\\-79\\49.80469\\-81.82806\\-79\\51.75781\\-81.51247\\-79\\55.66406\\-81.17663\\-79\\57.61719\\-80.85016\\-79\\61.52344\\-80.72225\\-79\\65.42969\\-80.73662\\-79\\69.33594\\-80.82866\\-79\\71.28906\\-80.98222\\-79\\73.24219\\-81.31567\\-79\\77.14844\\-81.59829\\-79\\83.00781\\-82.20297\\-79\\86.91406\\-82.83563\\-79\\88.86719\\-83.32013\\-79\\92.77344\\-84.1373\\-79\\94.72656\\-84.46257\\-79\\96.67969\\-84.91076\\-79\\102.5391\\-86.66319\\-79\\104.4922\\-87.46484\\-79\\106.4453\\-88.00555\\-79\\108.3984\\-88.72369\\-79\\110.3516\\-89.58293\\-79\\112.3047\\-90.28136\\-79\\116.2109\\-92.19932\\-79\\118.1641\\-93.3314\\-79\\120.1172\\-94.11349\\-79\\122.0703\\-95.27016\\-79\\124.0234\\-96.26088\\-79\\125.9766\\-97.70131\\-79\\127.63\\-98.69531\\-79\\131.8359\\-101.6115\\-79\\133.7891\\-103.202\\-79\\139.6484\\-108.6771\\-79\\141.2785\\-110.4141\\-79\\144.4774\\-114.3203\\-79\\145.5078\\-115.5156\\-79\\147.5948\\-118.2266\\-79\\150.1294\\-122.1328\\-79\\152.4212\\-126.0391\\-79\\153.8346\\-127.9922\\-79\\154.7032\\-129.9453\\-79\\155.8919\\-131.8984\\-79\\156.5564\\-133.8516\\-79\\157.6425\\-135.8047\\-79\\158.3542\\-137.7578\\-79\\159.3425\\-139.7109\\-79\\160.0623\\-141.6641\\-79\\160.6257\\-143.6172\\-79\\161.4445\\-145.5703\\-79\\161.9274\\-147.5234\\-79\\162.6042\\-151.4297\\-79\\163.2276\\-153.3828\\-79\\163.6927\\-155.3359\\-79\\164.5091\\-161.1953\\-79\\165.3539\\-165.1016\\-79\\165.7914\\-169.0078\\-79\\166.1113\\-172.9141\\-79\\166.882\\-184.6328\\-79\\167.0444\\-188.5391\\-79\\167.1143\\-192.4453\\-79\\167.1276\\-198.3047\\-79\\167.073\\-202.2109\\-79\\166.7636\\-208.0703\\-79\\166.3656\\-213.9297\\-79\\166.0505\\-217.8359\\-79\\165.6388\\-221.7422\\-79\\165.3096\\-223.6953\\-79\\164.7003\\-225.6484\\-79\\164.2718\\-227.6016\\-79\\163.5459\\-231.5078\\-79\\162.7441\\-233.4609\\-79\\162.2344\\-235.4141\\-79\\161.8268\\-237.3672\\-79\\160.1563\\-241.2734\\-79\\159.2173\\-243.2266\\-79\\157.2266\\-246.9454\\-79\\156.1408\\-249.0859\\-79\\155.0236\\-251.0391\\-79\\154.0045\\-252.9922\\-79\\151.1134\\-256.8984\\-79\\149.8814\\-258.8516\\-79\\148.4185\\-260.8047\\-79\\145.0195\\-264.7109\\-79\\141.8772\\-268.6172\\-79\\139.6484\\-270.7866\\-79\\135.7422\\-274.8281\\-79\\133.7891\\-276.5614\\-79\\131.8359\\-278.1199\\-79\\129.333\\-280.3359\\-79\\125.9766\\-283.0056\\-79\\122.0703\\-285.8061\\-79\\121.619\\-286.1953\\-79\\118.1641\\-288.6263\\-79\\116.2109\\-289.572\\-79\\115.5455\\-290.1016\\-79\\112.2947\\-292.0547\\-79\\108.8469\\-294.0078\\-79\\108.3984\\-294.324\\-79\\104.4922\\-295.8281\\-79\\102.5391\\-296.7499\\-79\\100.5859\\-297.3199\\-79\\98.63281\\-298.2959\\-79\\94.72656\\-299.4094\\-79\\92.77344\\-300.1062\\-79\\90.82031\\-300.5317\\-79\\88.86719\\-300.8099\\-79\\83.00781\\-301.4671\\-79\\79.10156\\-301.8123\\-79\\77.14844\\-301.8754\\-79\\73.24219\\-301.8123\\-79\\69.33594\\-301.5546\\-79\\65.42969\\-301.1672\\-79\\61.52344\\-300.6922\\-79\\59.57031\\-300.3764\\-79\\55.66406\\-299.0954\\-79\\53.71094\\-298.5311\\-79\\51.75781\\-297.5116\\-79\\49.80469\\-296.794\\-79\\47.85156\\-295.7281\\-79\\45.89844\\-294.8669\\-79\\41.99219\\-292.4317\\-79\\39.0625\\-290.1016\\-79\\34.63882\\-286.1953\\-79\\28.32031\\-279.629\\-79\\25.66867\\-276.4297\\-79\\24.16314\\-274.4766\\-79\\22.84483\\-272.5234\\-79\\19.99563\\-268.6172\\-79\\19.15111\\-266.6641\\-79\\16.60156\\-262.844\\-79\\14.64844\\-260.2058\\-79\\12.69531\\-258.3485\\-79\\10.74219\\-257.0139\\-79\\8.789063\\-256.6302\\-79\\2.929688\\-256.5838\\-79\\-0.9765625\\-256.714\\-79\\-4.882813\\-256.9386\\-79\\-6.835938\\-256.8886\\-79\\-8.789063\\-257.7717\\-79\\-10.74219\\-258.4126\\-79\\-12.69531\\-260.0611\\-79\\-14.91757\\-262.7578\\-79\\-16.12338\\-264.7109\\-79\\-16.60156\\-265.3087\\-79\\-18.55469\\-268.2319\\-79\\-18.88533\\-268.6172\\-79\\-20.03368\\-270.5703\\-79\\-21.56085\\-272.5234\\-79\\-26.68531\\-278.3828\\-79\\-28.2219\\-280.3359\\-79\\-32.22656\\-284.3853\\-79\\-33.85417\\-286.1953\\-79\\-36.13281\\-288.2534\\-79\\-38.08594\\-289.6603\\-79\\-41.99219\\-292.916\\-79\\-43.94531\\-294.2775\\-79\\-45.89844\\-295.1784\\-79\\-47.85156\\-296.3339\\-79\\-49.80469\\-297.0514\\-79\\-51.75781\\-298.0361\\-79\\-53.71094\\-298.8042\\-79\\-55.66406\\-299.416\\-79\\-57.61719\\-300.2122\\-79\\-59.57031\\-300.6292\\-79\\-61.52344\\-300.907\\-79\\-67.38281\\-301.5798\\-79\\-71.28906\\-301.9063\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "318" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "87" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-300.197\\-77\\-90.82031\\-299.5461\\-77\\-94.72656\\-298.5388\\-77\\-96.67969\\-297.6788\\-77\\-100.5859\\-296.4102\\-77\\-102.5391\\-295.3634\\-77\\-104.4922\\-294.7585\\-77\\-106.4453\\-293.6004\\-77\\-108.3984\\-292.6813\\-77\\-110.3516\\-291.2951\\-77\\-114.2578\\-289.028\\-77\\-118.1641\\-286.4149\\-77\\-120.9961\\-284.2422\\-77\\-125.8079\\-280.3359\\-77\\-127.9543\\-278.3828\\-77\\-131.8359\\-274.6115\\-77\\-133.9265\\-272.5234\\-77\\-137.1779\\-268.6172\\-77\\-140.5015\\-264.7109\\-77\\-142.0898\\-262.7578\\-77\\-143.3421\\-260.8047\\-77\\-144.735\\-258.8516\\-77\\-147.8102\\-254.9453\\-77\\-148.7909\\-252.9922\\-77\\-150.1433\\-251.0391\\-77\\-152.4041\\-247.1328\\-77\\-153.7407\\-245.1797\\-77\\-154.5993\\-243.2266\\-77\\-155.7685\\-241.2734\\-77\\-156.4276\\-239.3203\\-77\\-157.5435\\-237.3672\\-77\\-158.3419\\-235.4141\\-77\\-159.4634\\-233.4609\\-77\\-160.1985\\-231.5078\\-77\\-161.8667\\-227.6016\\-77\\-162.2962\\-225.6484\\-77\\-162.8698\\-223.6953\\-77\\-163.6963\\-221.7422\\-77\\-164.5755\\-217.8359\\-77\\-165.3539\\-215.8828\\-77\\-165.8113\\-213.9297\\-77\\-166.6003\\-210.0234\\-77\\-167.2054\\-208.0703\\-77\\-167.5408\\-206.1172\\-77\\-167.9978\\-202.2109\\-77\\-168.6151\\-194.3984\\-77\\-168.8015\\-192.4453\\-77\\-169.0004\\-188.5391\\-77\\-169.0162\\-184.6328\\-77\\-168.8454\\-180.7266\\-77\\-167.9864\\-169.0078\\-77\\-167.6492\\-165.1016\\-77\\-167.4241\\-163.1484\\-77\\-167.0588\\-161.1953\\-77\\-166.5575\\-159.2422\\-77\\-165.483\\-153.3828\\-77\\-164.8072\\-151.4297\\-77\\-164.2698\\-149.4766\\-77\\-163.898\\-147.5234\\-77\\-163.3719\\-145.5703\\-77\\-162.5179\\-143.6172\\-77\\-162.1094\\-141.6641\\-77\\-161.5943\\-139.7109\\-77\\-160.6638\\-137.7578\\-77\\-160.0006\\-135.8047\\-77\\-158.9284\\-133.8516\\-77\\-158.0305\\-131.8984\\-77\\-156.9676\\-129.9453\\-77\\-156.1202\\-127.9922\\-77\\-154.0064\\-124.0859\\-77\\-151.3077\\-120.1797\\-77\\-150.0355\\-118.2266\\-77\\-147.4609\\-114.7453\\-77\\-145.5078\\-112.377\\-77\\-142.128\\-108.4609\\-77\\-140.1486\\-106.5078\\-77\\-137.6953\\-104.3906\\-77\\-131.8359\\-100.0711\\-77\\-127.9297\\-97.51916\\-77\\-125.9766\\-96.03815\\-77\\-122.0703\\-93.98689\\-77\\-120.1172\\-93.21905\\-77\\-119.5171\\-92.83594\\-77\\-115.8719\\-90.88281\\-77\\-114.2578\\-90.1282\\-77\\-112.3047\\-89.39302\\-77\\-110.3516\\-88.5015\\-77\\-108.3984\\-87.9325\\-77\\-106.4453\\-87.47942\\-77\\-104.4922\\-86.89063\\-77\\-100.5859\\-85.91537\\-77\\-98.63281\\-85.50454\\-77\\-96.67969\\-84.9081\\-77\\-94.72656\\-84.63405\\-77\\-92.77344\\-84.12448\\-77\\-88.86719\\-83.45657\\-77\\-86.91406\\-82.92305\\-77\\-84.96094\\-82.6371\\-77\\-79.10156\\-82.23617\\-77\\-75.19531\\-82.10035\\-77\\-69.33594\\-82.10668\\-77\\-65.42969\\-82.22084\\-77\\-59.57031\\-82.5611\\-77\\-57.61719\\-82.71725\\-77\\-55.66406\\-82.99767\\-77\\-53.71094\\-83.40323\\-77\\-49.80469\\-84.022\\-77\\-47.85156\\-84.25346\\-77\\-43.94531\\-84.95531\\-77\\-38.08594\\-86.44326\\-77\\-36.13281\\-87.21256\\-77\\-32.22656\\-88.32025\\-77\\-28.32031\\-90.04095\\-77\\-26.64812\\-90.88281\\-77\\-24.41406\\-92.15876\\-77\\-20.50781\\-94.78011\\-77\\-18.55469\\-96.50967\\-77\\-14.49033\\-100.6484\\-77\\-12.69531\\-102.9481\\-77\\-8.671514\\-108.4609\\-77\\-6.835938\\-111.2627\\-77\\-4.351021\\-114.3203\\-77\\-2.929688\\-116.4939\\-77\\-0.9765625\\-117.604\\-77\\0.9765625\\-116.2386\\-77\\2.929688\\-113.9032\\-77\\4.046816\\-112.3672\\-77\\4.882813\\-110.9878\\-77\\8.079594\\-106.5078\\-77\\9.598691\\-104.5547\\-77\\12.69531\\-101.1942\\-77\\15.17704\\-98.69531\\-77\\18.55469\\-95.48907\\-77\\20.50781\\-93.86258\\-77\\22.46094\\-92.5438\\-77\\26.36719\\-89.65397\\-77\\28.32031\\-88.36136\\-77\\30.83376\\-86.97656\\-77\\32.22656\\-86.2914\\-77\\34.17969\\-85.46875\\-77\\36.13281\\-84.44699\\-77\\38.08594\\-83.78119\\-77\\40.03906\\-83.00873\\-77\\43.94531\\-81.95119\\-77\\47.85156\\-81.14358\\-77\\51.75781\\-80.51362\\-77\\55.66406\\-80.26599\\-77\\59.57031\\-80.16582\\-77\\65.42969\\-80.18389\\-77\\71.28906\\-80.29713\\-77\\77.14844\\-80.75098\\-77\\79.10156\\-81.04395\\-77\\83.00781\\-81.73924\\-77\\86.91406\\-82.19141\\-77\\90.82031\\-82.87807\\-77\\92.77344\\-83.39826\\-77\\98.63281\\-84.67021\\-77\\100.5859\\-85.37924\\-77\\104.4922\\-86.65104\\-77\\106.4453\\-87.479\\-77\\108.3984\\-88.08078\\-77\\110.3516\\-88.79472\\-77\\112.3047\\-89.69698\\-77\\114.2578\\-90.42364\\-77\\116.2109\\-91.59721\\-77\\118.1641\\-92.47899\\-77\\120.1172\\-93.60555\\-77\\122.0703\\-94.47868\\-77\\127.9297\\-98.1669\\-77\\129.8828\\-99.68535\\-77\\133.7891\\-102.4655\\-77\\135.7422\\-104.2633\\-77\\138.0313\\-106.5078\\-77\\140.1331\\-108.4609\\-77\\141.9345\\-110.4141\\-77\\143.3809\\-112.3672\\-77\\145.5078\\-114.974\\-77\\148.0469\\-118.2266\\-77\\150.3967\\-122.1328\\-77\\151.6927\\-124.0859\\-77\\152.7239\\-126.0391\\-77\\154.0588\\-127.9922\\-77\\154.9503\\-129.9453\\-77\\156.0584\\-131.8984\\-77\\156.7215\\-133.8516\\-77\\157.7962\\-135.8047\\-77\\158.4967\\-137.7578\\-77\\159.5435\\-139.7109\\-77\\160.7567\\-143.6172\\-77\\161.5194\\-145.5703\\-77\\161.9446\\-147.5234\\-77\\162.6347\\-151.4297\\-77\\163.2548\\-153.3828\\-77\\163.7042\\-155.3359\\-77\\164.4636\\-161.1953\\-77\\165.2629\\-165.1016\\-77\\165.5444\\-167.0547\\-77\\165.8923\\-170.9609\\-77\\166.2824\\-176.8203\\-77\\166.6932\\-184.6328\\-77\\166.8127\\-188.5391\\-77\\166.9096\\-194.3984\\-77\\166.776\\-202.2109\\-77\\166.5438\\-208.0703\\-77\\166.3467\\-211.9766\\-77\\166.0804\\-215.8828\\-77\\165.7424\\-219.7891\\-77\\165.501\\-221.7422\\-77\\165.0766\\-223.6953\\-77\\164.5235\\-225.6484\\-77\\163.8555\\-229.5547\\-77\\163.3699\\-231.5078\\-77\\162.5846\\-233.4609\\-77\\161.6881\\-237.3672\\-77\\160.7567\\-239.3203\\-77\\160.0296\\-241.2734\\-77\\158.9603\\-243.2266\\-77\\158.0299\\-245.1797\\-77\\156.8773\\-247.1328\\-77\\156.0434\\-249.0859\\-77\\154.873\\-251.0391\\-77\\153.8844\\-252.9922\\-77\\151.3672\\-256.4061\\-77\\150.9292\\-256.8984\\-77\\149.7445\\-258.8516\\-77\\148.3154\\-260.8047\\-77\\144.8458\\-264.7109\\-77\\143.1894\\-266.6641\\-77\\141.6444\\-268.6172\\-77\\139.6484\\-270.5446\\-77\\135.7422\\-274.6028\\-77\\131.8359\\-277.8533\\-77\\127.9297\\-281.2669\\-77\\125.9766\\-282.8048\\-77\\124.0234\\-284.0453\\-77\\120.1172\\-287.0627\\-77\\118.1641\\-288.3697\\-77\\116.2109\\-289.3756\\-77\\114.2578\\-290.6909\\-77\\112.3047\\-291.6918\\-77\\110.3516\\-292.9702\\-77\\108.3984\\-294.0313\\-77\\106.4453\\-294.9245\\-77\\104.4922\\-295.5745\\-77\\102.5391\\-296.61\\-77\\100.5859\\-297.1582\\-77\\98.63281\\-298.0361\\-77\\96.67969\\-298.7313\\-77\\94.72656\\-299.2254\\-77\\92.77344\\-299.8749\\-77\\90.82031\\-300.4004\\-77\\88.86719\\-300.7147\\-77\\84.96094\\-301.1385\\-77\\81.05469\\-301.4925\\-77\\79.10156\\-301.6074\\-77\\75.19531\\-301.6765\\-77\\73.24219\\-301.6206\\-77\\69.33594\\-301.4095\\-77\\65.42969\\-301.0742\\-77\\61.52344\\-300.618\\-77\\59.57031\\-300.2741\\-77\\57.61719\\-299.5891\\-77\\53.71094\\-298.4223\\-77\\51.75781\\-297.382\\-77\\49.80469\\-296.7091\\-77\\47.85156\\-295.5745\\-77\\45.89844\\-294.7778\\-77\\41.99219\\-292.2664\\-77\\39.21875\\-290.1016\\-77\\36.13281\\-287.4694\\-77\\34.73874\\-286.1953\\-77\\28.32031\\-279.6674\\-77\\24.41406\\-275.0929\\-77\\22.46094\\-272.5143\\-77\\19.75114\\-268.6172\\-77\\18.62917\\-266.6641\\-77\\17.30496\\-264.7109\\-77\\16.60156\\-263.8363\\-77\\14.64844\\-261.6917\\-77\\12.69531\\-260.1865\\-77\\10.74219\\-259.2403\\-77\\8.789063\\-258.9441\\-77\\2.929688\\-258.9451\\-77\\0.9765625\\-258.9958\\-77\\-0.9765625\\-259.477\\-77\\-2.929688\\-259.7295\\-77\\-4.882813\\-259.7988\\-77\\-6.835938\\-259.7623\\-77\\-8.789063\\-260.0417\\-77\\-10.74219\\-260.5324\\-77\\-12.69531\\-261.6624\\-77\\-14.64844\\-263.5306\\-77\\-17.0379\\-266.6641\\-77\\-18.28704\\-268.6172\\-77\\-19.67544\\-270.5703\\-77\\-22.46094\\-273.9661\\-77\\-24.80316\\-276.4297\\-77\\-28.07242\\-280.3359\\-77\\-32.22656\\-284.416\\-77\\-33.89292\\-286.1953\\-77\\-36.14239\\-288.1484\\-77\\-38.08594\\-289.5955\\-77\\-41.99219\\-292.8326\\-77\\-43.94531\\-294.1385\\-77\\-45.89844\\-295.0949\\-77\\-47.85156\\-296.1869\\-77\\-49.80469\\-296.9588\\-77\\-53.71094\\-298.7046\\-77\\-55.66406\\-299.264\\-77\\-57.61719\\-300.0569\\-77\\-59.57031\\-300.5278\\-77\\-61.52344\\-300.8099\\-77\\-65.42969\\-301.2395\\-77\\-69.33594\\-301.5944\\-77\\-73.24219\\-301.735\\-77\\-75.19531\\-301.705\\-77\\-81.05469\\-301.2256\\-77\\-86.91406\\-300.5542\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "308" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "88" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-300.0666\\-75\\-90.82031\\-299.3819\\-75\\-94.72656\\-298.4194\\-75\\-96.67969\\-297.4937\\-75\\-100.5859\\-296.2122\\-75\\-102.5391\\-295.23\\-75\\-104.4922\\-294.6102\\-75\\-106.4453\\-293.4183\\-75\\-108.3984\\-292.488\\-75\\-112.3047\\-289.8387\\-75\\-114.2578\\-288.8934\\-75\\-120.1172\\-284.6861\\-75\\-123.1876\\-282.2891\\-75\\-125.9766\\-279.9184\\-75\\-127.6719\\-278.3828\\-75\\-131.8359\\-274.3892\\-75\\-133.6719\\-272.5234\\-75\\-135.7422\\-270.1814\\-75\\-137.0047\\-268.6172\\-75\\-140.357\\-264.7109\\-75\\-141.9396\\-262.7578\\-75\\-143.131\\-260.8047\\-75\\-144.5769\\-258.8516\\-75\\-146.178\\-256.8984\\-75\\-147.6224\\-254.9453\\-75\\-148.7021\\-252.9922\\-75\\-150.0456\\-251.0391\\-75\\-151.0538\\-249.0859\\-75\\-151.3672\\-248.7007\\-75\\-153.3203\\-245.534\\-75\\-153.6063\\-245.1797\\-75\\-154.5132\\-243.2266\\-75\\-155.6599\\-241.2734\\-75\\-156.3735\\-239.3203\\-75\\-157.426\\-237.3672\\-75\\-158.2504\\-235.4141\\-75\\-159.3161\\-233.4609\\-75\\-160.8869\\-229.5547\\-75\\-161.7981\\-227.6016\\-75\\-162.7417\\-223.6953\\-75\\-163.5957\\-221.7422\\-75\\-164.4484\\-217.8359\\-75\\-165.2007\\-215.8828\\-75\\-165.7191\\-213.9297\\-75\\-166.4798\\-210.0234\\-75\\-167.0444\\-208.0703\\-75\\-167.4557\\-206.1172\\-75\\-167.7145\\-204.1641\\-75\\-168.0938\\-200.2578\\-75\\-168.6673\\-192.4453\\-75\\-168.8594\\-188.5391\\-75\\-168.9056\\-184.6328\\-75\\-168.6531\\-178.7734\\-75\\-167.9982\\-169.0078\\-75\\-167.4557\\-163.1484\\-75\\-167.1143\\-161.1953\\-75\\-166.6236\\-159.2422\\-75\\-166.2314\\-157.2891\\-75\\-165.5527\\-153.3828\\-75\\-164.3415\\-149.4766\\-75\\-163.5063\\-145.5703\\-75\\-162.6482\\-143.6172\\-75\\-161.7264\\-139.7109\\-75\\-160.8448\\-137.7578\\-75\\-160.1246\\-135.8047\\-75\\-159.2173\\-133.8516\\-75\\-158.1874\\-131.8984\\-75\\-157.2932\\-129.9453\\-75\\-156.262\\-127.9922\\-75\\-155.3304\\-126.0391\\-75\\-154.213\\-124.0859\\-75\\-151.6974\\-120.1797\\-75\\-148.857\\-116.2734\\-75\\-147.6497\\-114.3203\\-75\\-145.9997\\-112.3672\\-75\\-144.2077\\-110.4141\\-75\\-143.5547\\-109.5256\\-75\\-140.6691\\-106.5078\\-75\\-135.7422\\-102.194\\-75\\-133.5685\\-100.6484\\-75\\-131.8359\\-99.54478\\-75\\-127.9297\\-96.60611\\-75\\-124.0234\\-94.16378\\-75\\-122.0703\\-93.3908\\-75\\-118.1641\\-91.35607\\-75\\-116.2109\\-90.23396\\-75\\-114.2578\\-89.54256\\-75\\-112.3047\\-88.53758\\-75\\-106.4453\\-86.69444\\-75\\-102.5391\\-85.78516\\-75\\-98.63281\\-84.55608\\-75\\-96.67969\\-84.20731\\-75\\-94.72656\\-84.25946\\-75\\-92.77344\\-83.42025\\-75\\-90.82031\\-82.90755\\-75\\-86.91406\\-82.25105\\-75\\-84.96094\\-82.0612\\-75\\-81.05469\\-81.86588\\-75\\-79.10156\\-81.66606\\-75\\-75.19531\\-81.53571\\-75\\-71.28906\\-81.53259\\-75\\-65.42969\\-81.68031\\-75\\-61.52344\\-81.93099\\-75\\-57.61719\\-82.08724\\-75\\-53.71094\\-82.48869\\-75\\-47.85156\\-83.5825\\-75\\-41.99219\\-84.54499\\-75\\-38.08594\\-85.72195\\-75\\-34.17969\\-86.81635\\-75\\-32.22656\\-87.5625\\-75\\-30.27344\\-88.18331\\-75\\-26.36719\\-89.9266\\-75\\-24.57894\\-90.88281\\-75\\-22.46094\\-92.22907\\-75\\-19.05777\\-94.78906\\-75\\-16.88449\\-96.74219\\-75\\-14.97105\\-98.69531\\-75\\-12.69531\\-101.3759\\-75\\-11.83116\\-102.6016\\-75\\-10.23171\\-104.5547\\-75\\-8.888527\\-106.5078\\-75\\-5.948893\\-110.4141\\-75\\-4.882813\\-111.6683\\-75\\-2.929688\\-113.758\\-75\\-0.9765625\\-115.1228\\-75\\0.9765625\\-114.0839\\-75\\2.459162\\-112.3672\\-75\\3.79357\\-110.4141\\-75\\5.246804\\-108.4609\\-75\\8.02234\\-104.5547\\-75\\9.740797\\-102.6016\\-75\\14.64844\\-97.61859\\-75\\16.60156\\-95.75775\\-75\\18.55469\\-94.08244\\-75\\20.50781\\-92.52376\\-75\\22.69666\\-90.88281\\-75\\26.36719\\-88.40326\\-75\\28.70302\\-86.97656\\-75\\34.17969\\-84.14815\\-75\\36.13281\\-83.50182\\-75\\38.08594\\-82.64539\\-75\\41.99219\\-81.64246\\-75\\43.94531\\-80.99512\\-75\\47.85156\\-80.28677\\-75\\51.75781\\-79.93607\\-75\\55.66406\\-79.52834\\-75\\59.57031\\-79.46395\\-75\\65.42969\\-79.55032\\-75\\73.24219\\-79.87489\\-75\\75.19531\\-80.15247\\-75\\79.10156\\-80.43484\\-75\\81.05469\\-80.64598\\-75\\84.96094\\-81.39729\\-75\\86.91406\\-81.72076\\-75\\92.77344\\-82.53177\\-75\\96.67969\\-83.62347\\-75\\98.63281\\-84.04053\\-75\\100.5859\\-84.60976\\-75\\102.5391\\-85.41837\\-75\\106.4453\\-86.68216\\-75\\108.3984\\-87.62537\\-75\\110.3516\\-88.14193\\-75\\112.2887\\-88.92969\\-75\\116.2109\\-90.78363\\-75\\118.1641\\-91.90006\\-75\\122.0703\\-93.94358\\-75\\124.0234\\-95.12711\\-75\\125.9766\\-96.2113\\-75\\129.3774\\-98.69531\\-75\\129.8828\\-99.14545\\-75\\131.8359\\-100.4341\\-75\\133.7891\\-101.8895\\-75\\135.7422\\-103.6765\\-75\\138.5749\\-106.5078\\-75\\140.6389\\-108.4609\\-75\\142.3788\\-110.4141\\-75\\145.5078\\-114.3482\\-75\\148.3797\\-118.2266\\-75\\149.5938\\-120.1797\\-75\\150.6587\\-122.1328\\-75\\151.9747\\-124.0859\\-75\\153.0215\\-126.0391\\-75\\154.225\\-127.9922\\-75\\155.2734\\-129.9844\\-75\\156.1707\\-131.8984\\-75\\156.8915\\-133.8516\\-75\\157.9034\\-135.8047\\-75\\158.614\\-137.7578\\-75\\159.6559\\-139.7109\\-75\\160.8276\\-143.6172\\-75\\161.5646\\-145.5703\\-75\\162.6557\\-151.4297\\-75\\163.7042\\-155.3359\\-75\\164.4088\\-161.1953\\-75\\165.1611\\-165.1016\\-75\\165.4644\\-167.0547\\-75\\165.8213\\-170.9609\\-75\\166.1792\\-176.8203\\-75\\166.516\\-184.6328\\-75\\166.6841\\-194.3984\\-75\\166.5315\\-202.2109\\-75\\166.358\\-208.0703\\-75\\166.1852\\-211.9766\\-75\\165.8074\\-217.8359\\-75\\165.3096\\-221.7422\\-75\\164.375\\-225.6484\\-75\\163.7351\\-229.5547\\-75\\162.437\\-233.4609\\-75\\162.0495\\-235.4141\\-75\\161.5302\\-237.3672\\-75\\160.5722\\-239.3203\\-75\\159.8726\\-241.2734\\-75\\158.7364\\-243.2266\\-75\\157.8979\\-245.1797\\-75\\156.6957\\-247.1328\\-75\\155.948\\-249.0859\\-75\\154.7163\\-251.0391\\-75\\153.7424\\-252.9922\\-75\\151.3672\\-256.1776\\-75\\150.7451\\-256.8984\\-75\\149.5781\\-258.8516\\-75\\148.2016\\-260.8047\\-75\\144.6681\\-264.7109\\-75\\141.6016\\-268.3859\\-75\\139.6484\\-270.2575\\-75\\137.3954\\-272.5234\\-75\\135.7422\\-274.318\\-75\\133.273\\-276.4297\\-75\\131.8359\\-277.5775\\-75\\127.9297\\-281.0866\\-75\\125.9766\\-282.5256\\-75\\124.0234\\-283.7434\\-75\\123.4597\\-284.2422\\-75\\120.1172\\-286.8483\\-75\\116.2109\\-289.1806\\-75\\114.2578\\-290.4526\\-75\\112.3047\\-291.4173\\-75\\110.3516\\-292.777\\-75\\108.3984\\-293.7121\\-75\\106.4453\\-294.7585\\-75\\104.4922\\-295.3869\\-75\\102.5391\\-296.4102\\-75\\98.63281\\-297.6931\\-75\\96.67969\\-298.5669\\-75\\92.77344\\-299.593\\-75\\90.82031\\-300.2229\\-75\\88.86719\\-300.5841\\-75\\84.96094\\-301.0026\\-75\\81.05469\\-301.3288\\-75\\79.10156\\-301.4311\\-75\\75.19531\\-301.4925\\-75\\69.33594\\-301.287\\-75\\65.42969\\-300.9841\\-75\\61.52344\\-300.5315\\-75\\59.57031\\-300.1396\\-75\\57.61719\\-299.4352\\-75\\53.71094\\-298.2911\\-75\\51.75781\\-297.2571\\-75\\49.80469\\-296.614\\-75\\47.85156\\-295.4494\\-75\\45.89844\\-294.6696\\-75\\41.99219\\-292.0623\\-75\\39.36919\\-290.1016\\-75\\36.13281\\-287.391\\-75\\34.79092\\-286.1953\\-75\\32.22656\\-283.6234\\-75\\28.8669\\-280.3359\\-75\\27.17653\\-278.3828\\-75\\24.41406\\-275.3774\\-75\\22.06643\\-272.5234\\-75\\19.4443\\-268.6172\\-75\\16.60156\\-265.1064\\-75\\14.64844\\-263.285\\-75\\12.69531\\-262.1158\\-75\\10.74219\\-261.3351\\-75\\8.789063\\-261.159\\-75\\2.929688\\-261.2038\\-75\\0.9765625\\-261.3766\\-75\\-0.9765625\\-261.7905\\-75\\-2.929688\\-261.9249\\-75\\-6.835938\\-262.0645\\-75\\-10.74219\\-262.4292\\-75\\-12.69531\\-263.1676\\-75\\-14.64844\\-264.7725\\-75\\-16.60156\\-267.1192\\-75\\-22.42156\\-274.4766\\-75\\-24.41406\\-276.4566\\-75\\-26.12106\\-278.3828\\-75\\-28.32031\\-280.7161\\-75\\-32.22656\\-284.4294\\-75\\-34.17969\\-286.4376\\-75\\-38.08594\\-289.5425\\-75\\-41.99219\\-292.7338\\-75\\-44.00344\\-294.0078\\-75\\-47.85156\\-296.0161\\-75\\-51.75781\\-297.6068\\-75\\-53.71094\\-298.595\\-75\\-55.66406\\-299.128\\-75\\-57.63842\\-299.8672\\-75\\-59.57031\\-300.4124\\-75\\-61.52344\\-300.7098\\-75\\-65.42969\\-301.1263\\-75\\-69.33594\\-301.4447\\-75\\-73.24219\\-301.5546\\-75\\-75.19531\\-301.5302\\-75\\-81.05469\\-301.1306\\-75\\-84.96094\\-300.7371\\-75\\-86.91406\\-300.4739\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "315" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "89" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-299.8748\\-73\\-90.82031\\-299.233\\-73\\-94.72656\\-298.2606\\-73\\-96.67969\\-297.3329\\-73\\-98.63281\\-296.8065\\-73\\-102.5391\\-295.123\\-73\\-104.4922\\-294.4351\\-73\\-106.4453\\-293.2433\\-73\\-108.3984\\-292.2541\\-73\\-111.6793\\-290.1016\\-73\\-112.3047\\-289.6065\\-73\\-114.2578\\-288.7264\\-73\\-118.1641\\-285.7845\\-73\\-120.1172\\-284.4539\\-73\\-124.0234\\-281.4128\\-73\\-127.4161\\-278.3828\\-73\\-129.5226\\-276.4297\\-73\\-133.4372\\-272.5234\\-73\\-135.2434\\-270.5703\\-73\\-136.8612\\-268.6172\\-73\\-137.6953\\-267.7404\\-73\\-141.7842\\-262.7578\\-73\\-142.9879\\-260.8047\\-73\\-144.4319\\-258.8516\\-73\\-146.03\\-256.8984\\-73\\-147.4609\\-254.8945\\-73\\-148.6167\\-252.9922\\-73\\-149.9326\\-251.0391\\-73\\-150.8823\\-249.0859\\-73\\-151.3672\\-248.483\\-73\\-153.448\\-245.1797\\-73\\-154.4303\\-243.2266\\-73\\-155.5598\\-241.2734\\-73\\-156.3147\\-239.3203\\-73\\-160.0414\\-231.5078\\-73\\-160.7567\\-229.5547\\-73\\-161.6935\\-227.6016\\-73\\-162.6347\\-223.6953\\-73\\-163.4753\\-221.7422\\-73\\-164.3487\\-217.8359\\-73\\-165.6272\\-213.9297\\-73\\-166.362\\-210.0234\\-73\\-167.3479\\-206.1172\\-73\\-167.6413\\-204.1641\\-73\\-168.1776\\-198.3047\\-73\\-168.5452\\-192.4453\\-73\\-168.7177\\-188.5391\\-73\\-168.7725\\-184.6328\\-73\\-168.7456\\-182.6797\\-73\\-168.5671\\-178.7734\\-73\\-167.9862\\-169.0078\\-73\\-167.4463\\-163.1484\\-73\\-167.0869\\-161.1953\\-73\\-166.253\\-157.2891\\-73\\-165.5773\\-153.3828\\-73\\-164.3673\\-149.4766\\-73\\-163.5585\\-145.5703\\-73\\-162.7276\\-143.6172\\-73\\-161.7944\\-139.7109\\-73\\-159.3541\\-133.8516\\-73\\-158.2876\\-131.8984\\-73\\-157.474\\-129.9453\\-73\\-156.3525\\-127.9922\\-73\\-155.5099\\-126.0391\\-73\\-153.3203\\-122.3261\\-73\\-151.9112\\-120.1797\\-73\\-150.4149\\-118.2266\\-73\\-149.4141\\-116.5654\\-73\\-147.9201\\-114.3203\\-73\\-146.3005\\-112.3672\\-73\\-144.5555\\-110.4141\\-73\\-143.5547\\-108.9358\\-73\\-141.2564\\-106.5078\\-73\\-139.1134\\-104.5547\\-73\\-137.6953\\-103.4528\\-73\\-135.7422\\-101.6738\\-73\\-133.7891\\-100.1811\\-73\\-129.8828\\-97.49393\\-73\\-127.9297\\-95.90614\\-73\\-125.9766\\-94.69803\\-73\\-122.0703\\-92.67939\\-73\\-120.1172\\-91.88277\\-73\\-118.1641\\-90.58623\\-73\\-114.2578\\-88.82477\\-73\\-112.3047\\-88.0495\\-73\\-110.3516\\-87.43915\\-73\\-108.3984\\-86.55408\\-73\\-106.4453\\-86.11894\\-73\\-98.63281\\-83.8758\\-73\\-94.72656\\-83.18967\\-73\\-92.77344\\-82.58554\\-73\\-90.82031\\-82.23047\\-73\\-88.86719\\-82.10009\\-73\\-84.96094\\-81.57291\\-73\\-81.05469\\-81.28392\\-73\\-79.10156\\-80.86737\\-73\\-75.19531\\-80.71382\\-73\\-71.28906\\-80.72514\\-73\\-65.42969\\-80.8942\\-73\\-63.47656\\-81.19105\\-73\\-59.57031\\-81.50929\\-73\\-57.61719\\-81.60547\\-73\\-53.71094\\-81.95518\\-73\\-49.80469\\-82.4305\\-73\\-47.85156\\-82.74954\\-73\\-43.94531\\-83.56196\\-73\\-41.99219\\-83.90472\\-73\\-38.08594\\-84.80889\\-73\\-36.13281\\-85.51528\\-73\\-32.22656\\-86.62728\\-73\\-30.27344\\-87.48704\\-73\\-28.32031\\-88.1055\\-73\\-26.38346\\-88.92969\\-73\\-22.71412\\-90.88281\\-73\\-20.50781\\-92.47166\\-73\\-18.55469\\-94.08814\\-73\\-16.60156\\-95.86735\\-73\\-13.82097\\-98.69531\\-73\\-10.6083\\-102.6016\\-73\\-7.720226\\-106.5078\\-73\\-4.882813\\-109.7784\\-73\\-2.929688\\-111.8699\\-73\\-0.9765625\\-113.1763\\-73\\0.9765625\\-112.2376\\-73\\2.372742\\-110.4141\\-73\\4.023162\\-108.4609\\-73\\4.882813\\-107.1046\\-73\\6.754557\\-104.5547\\-73\\8.370536\\-102.6016\\-73\\12.69531\\-98.3346\\-73\\14.64844\\-96.28312\\-73\\16.60156\\-94.48924\\-73\\21.01089\\-90.88281\\-73\\22.46094\\-89.76999\\-73\\24.41406\\-88.51228\\-73\\26.36719\\-87.52251\\-73\\28.32031\\-86.19959\\-73\\30.31921\\-85.02344\\-73\\34.17969\\-83.19769\\-73\\38.08594\\-81.87751\\-73\\40.03906\\-81.38134\\-73\\41.99219\\-80.68552\\-73\\43.94531\\-80.30878\\-73\\45.89844\\-80.04425\\-73\\49.80469\\-79.38019\\-73\\53.71094\\-78.93222\\-73\\55.66406\\-78.79048\\-73\\59.57031\\-78.71383\\-73\\65.42969\\-78.79048\\-73\\69.33594\\-78.99644\\-73\\71.28906\\-79.15643\\-73\\73.24219\\-79.17255\\-73\\75.19531\\-79.632\\-73\\77.14844\\-79.87486\\-73\\83.00781\\-80.42675\\-73\\84.96094\\-80.65642\\-73\\86.91406\\-81.02841\\-73\\88.86719\\-81.50924\\-73\\92.77344\\-82.07472\\-73\\94.72656\\-82.41249\\-73\\96.67969\\-82.92535\\-73\\98.63281\\-83.53825\\-73\\100.5859\\-84.00907\\-73\\102.5391\\-84.66769\\-73\\104.4922\\-85.50475\\-73\\106.4453\\-86.13181\\-73\\110.3516\\-87.69579\\-73\\112.3047\\-88.18723\\-73\\114.2578\\-89.20342\\-73\\116.2109\\-90.11723\\-73\\118.1641\\-91.29436\\-73\\120.1172\\-92.25231\\-73\\122.0703\\-93.46122\\-73\\124.0234\\-94.43326\\-73\\125.9766\\-95.71456\\-73\\129.8828\\-98.42567\\-73\\133.7891\\-101.5113\\-73\\135.7422\\-103.2257\\-73\\139.6484\\-107.1426\\-73\\141.0362\\-108.4609\\-73\\142.6345\\-110.4141\\-73\\145.9612\\-114.3203\\-73\\147.4609\\-116.4428\\-73\\149.9126\\-120.1797\\-73\\150.9032\\-122.1328\\-73\\151.3672\\-122.7331\\-73\\153.3203\\-126.0119\\-73\\155.4913\\-129.9453\\-73\\157.0358\\-133.8516\\-73\\158.0088\\-135.8047\\-73\\158.6945\\-137.7578\\-73\\159.6946\\-139.7109\\-73\\160.8528\\-143.6172\\-73\\161.581\\-145.5703\\-73\\161.969\\-147.5234\\-73\\162.6347\\-151.4297\\-73\\163.66\\-155.3359\\-73\\164.3313\\-161.1953\\-73\\164.6396\\-163.1484\\-73\\165.3539\\-167.0547\\-73\\165.7159\\-170.9609\\-73\\166.06\\-176.8203\\-73\\166.3504\\-184.6328\\-73\\166.4201\\-188.5391\\-73\\166.4717\\-194.3984\\-73\\166.3393\\-202.2109\\-73\\166.1994\\-208.0703\\-73\\166.0454\\-211.9766\\-73\\165.6743\\-217.8359\\-73\\165.4455\\-219.7891\\-73\\164.585\\-223.6953\\-73\\163.9512\\-227.6016\\-73\\163.5773\\-229.5547\\-73\\162.8309\\-231.5078\\-73\\161.9416\\-235.4141\\-73\\161.3164\\-237.3672\\-73\\160.3948\\-239.3203\\-73\\159.7055\\-241.2734\\-73\\158.5502\\-243.2266\\-73\\157.7358\\-245.1797\\-73\\156.5529\\-247.1328\\-73\\155.819\\-249.0859\\-73\\154.583\\-251.0391\\-73\\153.5226\\-252.9922\\-73\\152.1588\\-254.9453\\-73\\150.6185\\-256.8984\\-73\\148.083\\-260.8047\\-73\\146.3515\\-262.7578\\-73\\144.4953\\-264.7109\\-73\\141.6016\\-268.1406\\-73\\139.6484\\-270.0035\\-73\\137.1245\\-272.5234\\-73\\135.2699\\-274.4766\\-73\\131.8359\\-277.3577\\-73\\127.9297\\-280.8554\\-73\\124.0234\\-283.5181\\-73\\120.1172\\-286.6174\\-73\\118.1641\\-287.7369\\-73\\116.2109\\-289.0199\\-73\\112.3047\\-291.2029\\-73\\110.3516\\-292.5461\\-73\\108.3984\\-293.4577\\-73\\106.4453\\-294.5759\\-73\\104.4922\\-295.216\\-73\\102.5391\\-296.1473\\-73\\100.5859\\-296.8482\\-73\\98.63281\\-297.4227\\-73\\96.67969\\-298.3698\\-73\\92.77344\\-299.3641\\-73\\90.82031\\-300.0036\\-73\\88.86719\\-300.4261\\-73\\86.91406\\-300.6791\\-73\\83.00781\\-301.0475\\-73\\79.10156\\-301.2706\\-73\\75.19531\\-301.332\\-73\\69.33594\\-301.1796\\-73\\65.42969\\-300.9008\\-73\\61.52344\\-300.4393\\-73\\59.57031\\-299.9619\\-73\\57.61719\\-299.2951\\-73\\55.66406\\-298.7816\\-73\\53.71094\\-298.1378\\-73\\51.75781\\-297.1476\\-73\\49.80469\\-296.5056\\-73\\47.85156\\-295.3205\\-73\\45.89844\\-294.5592\\-73\\40.03906\\-290.4831\\-73\\38.08594\\-288.9656\\-73\\34.82365\\-286.1953\\-73\\30.81939\\-282.2891\\-73\\28.72467\\-280.3359\\-73\\27.02986\\-278.3828\\-73\\24.41406\\-275.6529\\-73\\21.71947\\-272.5234\\-73\\20.19004\\-270.5703\\-73\\18.81343\\-268.6172\\-73\\16.60156\\-266.3295\\-73\\14.64844\\-264.8528\\-73\\12.69531\\-263.8927\\-73\\10.74219\\-263.2092\\-73\\8.789063\\-263.0647\\-73\\2.929688\\-263.0987\\-73\\0.9765625\\-263.2879\\-73\\-0.9765625\\-263.6883\\-73\\-4.882813\\-263.9315\\-73\\-6.835938\\-263.9966\\-73\\-10.74219\\-264.2271\\-73\\-12.69531\\-264.856\\-73\\-14.64844\\-266.0624\\-73\\-16.60156\\-267.9375\\-73\\-18.91327\\-270.5703\\-73\\-20.35938\\-272.5234\\-73\\-21.9585\\-274.4766\\-73\\-23.97576\\-276.4297\\-73\\-28.32031\\-280.8458\\-73\\-32.22656\\-284.4423\\-73\\-34.17969\\-286.4082\\-73\\-38.08594\\-289.4851\\-73\\-38.7703\\-290.1016\\-73\\-41.99219\\-292.6349\\-73\\-45.89844\\-294.9287\\-73\\-49.80469\\-296.772\\-73\\-51.75781\\-297.4385\\-73\\-53.71094\\-298.4554\\-73\\-55.66406\\-299.0043\\-73\\-59.57031\\-300.2767\\-73\\-61.52344\\-300.6094\\-73\\-63.47656\\-300.8438\\-73\\-67.38281\\-301.188\\-73\\-69.33594\\-301.3094\\-73\\-73.24219\\-301.4095\\-73\\-75.19531\\-301.396\\-73\\-81.05469\\-301.0475\\-73\\-84.96094\\-300.6585\\-73\\-86.91406\\-300.3733\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "320" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "90" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-300.2515\\-71\\-90.82031\\-299.1123\\-71\\-92.77344\\-298.6882\\-71\\-94.72656\\-298.0757\\-71\\-96.67969\\-297.2043\\-71\\-98.63281\\-296.7091\\-71\\-100.5859\\-295.7464\\-71\\-104.4922\\-294.2224\\-71\\-104.7726\\-294.0078\\-71\\-108.2403\\-292.0547\\-71\\-110.3516\\-290.8091\\-71\\-112.3047\\-289.4442\\-71\\-114.2578\\-288.5405\\-71\\-116.2109\\-287.1221\\-71\\-118.1641\\-285.5671\\-71\\-122.0703\\-282.767\\-71\\-124.0234\\-281.2339\\-71\\-129.317\\-276.4297\\-71\\-131.8359\\-273.971\\-71\\-135.08\\-270.5703\\-71\\-136.7188\\-268.6172\\-71\\-137.6953\\-267.5769\\-71\\-139.6484\\-265.1622\\-71\\-140.0997\\-264.7109\\-71\\-141.6016\\-262.7477\\-71\\-142.8497\\-260.8047\\-71\\-143.5547\\-259.9531\\-71\\-145.5078\\-257.2937\\-71\\-145.874\\-256.8984\\-71\\-147.4609\\-254.6542\\-71\\-149.8005\\-251.0391\\-71\\-150.7577\\-249.0859\\-71\\-152.1255\\-247.1328\\-71\\-153.3203\\-245.1029\\-71\\-155.4349\\-241.2734\\-71\\-157.0651\\-237.3672\\-71\\-158.0836\\-235.4141\\-71\\-158.9133\\-233.4609\\-71\\-159.9599\\-231.5078\\-71\\-160.6322\\-229.5547\\-71\\-161.5749\\-227.6016\\-71\\-162.1153\\-225.6484\\-71\\-162.5325\\-223.6953\\-71\\-163.3336\\-221.7422\\-71\\-163.8661\\-219.7891\\-71\\-164.2503\\-217.8359\\-71\\-164.7949\\-215.8828\\-71\\-165.5038\\-213.9297\\-71\\-166.2381\\-210.0234\\-71\\-167.2191\\-206.1172\\-71\\-167.7677\\-202.2109\\-71\\-168.0938\\-198.3047\\-71\\-168.521\\-190.4922\\-71\\-168.6035\\-186.5859\\-71\\-168.6175\\-182.6797\\-71\\-168.2798\\-174.8672\\-71\\-168.0753\\-170.9609\\-71\\-167.6255\\-165.1016\\-71\\-167.3917\\-163.1484\\-71\\-166.6028\\-159.2422\\-71\\-165.5527\\-153.3828\\-71\\-164.3638\\-149.4766\\-71\\-163.568\\-145.5703\\-71\\-162.7533\\-143.6172\\-71\\-162.236\\-141.6641\\-71\\-161.8195\\-139.7109\\-71\\-161.1328\\-137.9659\\-71\\-159.4035\\-133.8516\\-71\\-158.3205\\-131.8984\\-71\\-157.5305\\-129.9453\\-71\\-156.3834\\-127.9922\\-71\\-155.5892\\-126.0391\\-71\\-155.2734\\-125.5875\\-71\\-153.3279\\-122.1328\\-71\\-152.0287\\-120.1797\\-71\\-150.5241\\-118.2266\\-71\\-149.4141\\-116.284\\-71\\-148.0824\\-114.3203\\-71\\-145.5078\\-110.9808\\-71\\-143.5547\\-108.6312\\-71\\-141.6282\\-106.5078\\-71\\-139.6213\\-104.5547\\-71\\-137.4489\\-102.6016\\-71\\-135.1004\\-100.6484\\-71\\-133.7891\\-99.74847\\-71\\-129.8828\\-96.7001\\-71\\-127.9297\\-95.44244\\-71\\-125.9766\\-94.07201\\-71\\-124.0234\\-93.21571\\-71\\-123.4253\\-92.83594\\-71\\-118.1641\\-90.0524\\-71\\-114.2578\\-88.21263\\-71\\-112.3047\\-87.63898\\-71\\-110.3516\\-86.76363\\-71\\-108.3984\\-86.05782\\-71\\-106.4453\\-85.55036\\-71\\-104.4922\\-84.88287\\-71\\-100.5859\\-83.90646\\-71\\-96.67969\\-82.75751\\-71\\-92.77344\\-82.06788\\-71\\-88.86719\\-81.69363\\-71\\-84.96094\\-80.86737\\-71\\-81.05469\\-80.56009\\-71\\-75.19531\\-80.26111\\-71\\-71.28906\\-80.27209\\-71\\-67.38281\\-80.35764\\-71\\-61.52344\\-80.62212\\-71\\-57.61719\\-80.92342\\-71\\-51.75781\\-81.77938\\-71\\-45.89844\\-82.42578\\-71\\-43.94531\\-82.75459\\-71\\-40.03906\\-83.70142\\-71\\-38.08594\\-84.09727\\-71\\-36.13281\\-84.60686\\-71\\-34.17969\\-85.36148\\-71\\-32.22656\\-85.98756\\-71\\-30.27344\\-86.49179\\-71\\-28.32031\\-87.40807\\-71\\-26.36719\\-88.07004\\-71\\-24.48918\\-88.92969\\-71\\-22.46094\\-90.04095\\-71\\-21.2279\\-90.88281\\-71\\-18.68557\\-92.83594\\-71\\-16.60156\\-94.62772\\-71\\-14.64844\\-96.44497\\-71\\-12.61684\\-98.69531\\-71\\-9.606482\\-102.6016\\-71\\-6.835938\\-105.9777\\-71\\-4.647391\\-108.4609\\-71\\-2.929688\\-110.0776\\-71\\-0.9765625\\-111.3645\\-71\\0.9765625\\-110.4459\\-71\\2.929688\\-108.0723\\-71\\4.882813\\-105.4104\\-71\\6.835938\\-102.9105\\-71\\8.789063\\-100.8096\\-71\\10.9375\\-98.69531\\-71\\12.80063\\-96.74219\\-71\\14.77798\\-94.78906\\-71\\17.04102\\-92.83594\\-71\\20.50781\\-90.06307\\-71\\22.46094\\-88.67741\\-71\\24.41406\\-87.62512\\-71\\28.54773\\-85.02344\\-71\\32.43132\\-83.07031\\-71\\34.17969\\-82.29604\\-71\\36.13281\\-81.76115\\-71\\38.08594\\-81.05926\\-71\\40.03906\\-80.47737\\-71\\41.99219\\-80.15941\\-71\\45.89844\\-79.33355\\-71\\49.80469\\-78.71183\\-71\\53.71094\\-78.39373\\-71\\57.61719\\-78.21727\\-71\\61.52344\\-78.19949\\-71\\65.42969\\-78.26398\\-71\\69.33594\\-78.41055\\-71\\71.28906\\-78.56175\\-71\\73.24219\\-78.58166\\-71\\75.19531\\-78.78846\\-71\\79.10156\\-79.5943\\-71\\81.05469\\-79.87817\\-71\\84.96094\\-80.21432\\-71\\88.86719\\-80.7797\\-71\\92.77344\\-81.6665\\-71\\96.67969\\-82.36068\\-71\\98.63281\\-82.86749\\-71\\102.5391\\-84.10829\\-71\\104.4922\\-84.7916\\-71\\106.4453\\-85.65533\\-71\\108.3984\\-86.28333\\-71\\110.3516\\-87.0676\\-71\\114.2578\\-88.43423\\-71\\116.2109\\-89.64048\\-71\\118.1641\\-90.49355\\-71\\120.1172\\-91.77847\\-71\\124.0234\\-93.90679\\-71\\125.9766\\-95.24904\\-71\\127.9297\\-96.40717\\-71\\131.8359\\-99.5612\\-71\\133.2921\\-100.6484\\-71\\135.714\\-102.6016\\-71\\141.6016\\-108.5463\\-71\\142.8841\\-110.4141\\-71\\146.2645\\-114.3203\\-71\\147.7266\\-116.2734\\-71\\148.8105\\-118.2266\\-71\\150.1225\\-120.1797\\-71\\151.3672\\-122.3839\\-71\\153.3203\\-125.6798\\-71\\153.5983\\-126.0391\\-71\\154.4935\\-127.9922\\-71\\155.6458\\-129.9453\\-71\\156.3219\\-131.8984\\-71\\157.1392\\-133.8516\\-71\\158.0556\\-135.8047\\-71\\158.7256\\-137.7578\\-71\\159.7033\\-139.7109\\-71\\160.8392\\-143.6172\\-71\\161.5975\\-145.5703\\-71\\161.9759\\-147.5234\\-71\\162.5877\\-151.4297\\-71\\163.5957\\-155.3359\\-71\\163.8555\\-157.2891\\-71\\164.2631\\-161.1953\\-71\\164.7984\\-165.1016\\-71\\165.1611\\-167.0547\\-71\\165.5963\\-170.9609\\-71\\165.9379\\-176.8203\\-71\\166.1472\\-182.6797\\-71\\166.2651\\-188.5391\\-71\\166.2651\\-196.3516\\-71\\166.1767\\-202.2109\\-71\\166.0457\\-208.0703\\-71\\165.9033\\-211.9766\\-71\\165.6884\\-215.8828\\-71\\165.5187\\-217.8359\\-71\\165.2135\\-219.7891\\-71\\164.7551\\-221.7422\\-71\\164.4088\\-223.6953\\-71\\163.8449\\-227.6016\\-71\\163.3719\\-229.5547\\-71\\162.6174\\-231.5078\\-71\\161.8189\\-235.4141\\-71\\160.2253\\-239.3203\\-71\\159.5052\\-241.2734\\-71\\158.3668\\-243.2266\\-71\\157.5586\\-245.1797\\-71\\156.4276\\-247.1328\\-71\\155.6396\\-249.0859\\-71\\153.3203\\-252.8826\\-71\\152.0084\\-254.9453\\-71\\149.0622\\-258.8516\\-71\\147.9143\\-260.8047\\-71\\145.5078\\-263.4533\\-71\\140.911\\-268.6172\\-71\\139.6484\\-269.7502\\-71\\134.9654\\-274.4766\\-71\\127.9297\\-280.5403\\-71\\125.9766\\-281.8389\\-71\\122.9016\\-284.2422\\-71\\120.1172\\-286.29\\-71\\118.1641\\-287.491\\-71\\116.2109\\-288.8534\\-71\\114.2578\\-289.7407\\-71\\113.805\\-290.1016\\-71\\110.3516\\-292.2055\\-71\\106.9388\\-294.0078\\-71\\106.4453\\-294.3333\\-71\\102.5391\\-295.8137\\-71\\100.5859\\-296.6947\\-71\\98.63281\\-297.2116\\-71\\96.67969\\-298.1011\\-71\\94.72656\\-298.7085\\-71\\92.77344\\-299.1565\\-71\\88.86719\\-300.2413\\-71\\86.91406\\-300.5278\\-71\\83.00781\\-300.907\\-71\\81.05469\\-301.0403\\-71\\75.19531\\-301.2006\\-71\\71.28906\\-301.1342\\-71\\67.38281\\-300.9593\\-71\\63.47656\\-300.5954\\-71\\61.52344\\-300.3314\\-71\\57.61719\\-299.1673\\-71\\55.66406\\-298.6742\\-71\\53.71094\\-297.9217\\-71\\51.75781\\-297.0417\\-71\\49.80469\\-296.369\\-71\\47.85156\\-295.2178\\-71\\45.89844\\-294.4273\\-71\\41.99219\\-291.6418\\-71\\40.03906\\-290.3406\\-71\\38.08594\\-288.8809\\-71\\34.85243\\-286.1953\\-71\\32.22656\\-283.6621\\-71\\28.32031\\-280.1621\\-71\\26.36719\\-278.0135\\-71\\22.46094\\-273.8378\\-71\\20.50781\\-271.5081\\-71\\18.55469\\-269.3311\\-71\\16.60156\\-267.6558\\-71\\14.64844\\-266.248\\-71\\12.69531\\-265.7755\\-71\\10.74219\\-265.1898\\-71\\8.789063\\-265.0997\\-71\\2.929688\\-265.1147\\-71\\0.9765625\\-265.3224\\-71\\-0.9765625\\-265.6786\\-71\\-4.882813\\-265.9497\\-71\\-8.789063\\-266.1487\\-71\\-10.74219\\-266.3047\\-71\\-12.69531\\-266.7538\\-71\\-14.64844\\-267.5771\\-71\\-16.60156\\-269.0031\\-71\\-18.55469\\-270.9793\\-71\\-19.8093\\-272.5234\\-71\\-21.58134\\-274.4766\\-71\\-23.63709\\-276.4297\\-71\\-28.32031\\-280.9755\\-71\\-31.99926\\-284.2422\\-71\\-34.17969\\-286.3531\\-71\\-38.08594\\-289.4255\\-71\\-38.85938\\-290.1016\\-71\\-41.99219\\-292.5132\\-71\\-45.89844\\-294.8475\\-71\\-47.85156\\-295.6354\\-71\\-49.80469\\-296.6717\\-71\\-51.75781\\-297.2926\\-71\\-53.71094\\-298.3205\\-71\\-57.61719\\-299.455\\-71\\-59.57031\\-300.1414\\-71\\-61.52344\\-300.5201\\-71\\-63.47656\\-300.7545\\-71\\-69.33594\\-301.1966\\-71\\-73.24219\\-301.2964\\-71\\-75.19531\\-301.2835\\-71\\-79.10156\\-301.0954\\-71\\-83.00781\\-300.7873\\-71\\-84.96094\\-300.5769\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "317" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "91" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-300.1164\\-69\\-88.86719\\-299.4703\\-69\\-92.77344\\-298.5845\\-69\\-96.67969\\-297.0948\\-69\\-98.63281\\-296.5942\\-69\\-100.5859\\-295.5689\\-69\\-102.5391\\-294.9181\\-69\\-104.4541\\-294.0078\\-69\\-106.4453\\-292.9468\\-69\\-108.3984\\-291.6418\\-69\\-110.3516\\-290.6482\\-69\\-112.3047\\-289.3116\\-69\\-114.2578\\-288.2969\\-69\\-116.2109\\-286.9577\\-69\\-120.1172\\-283.876\\-69\\-122.0703\\-282.5692\\-69\\-124.0234\\-281.0468\\-69\\-129.1299\\-276.4297\\-69\\-131.8359\\-273.801\\-69\\-134.9306\\-270.5703\\-69\\-137.6953\\-267.4037\\-69\\-139.9472\\-264.7109\\-69\\-141.6016\\-262.5568\\-69\\-142.7327\\-260.8047\\-69\\-144.2901\\-258.8516\\-69\\-147.4609\\-254.4798\\-69\\-149.6469\\-251.0391\\-69\\-150.6633\\-249.0859\\-69\\-152.02\\-247.1328\\-69\\-153.0851\\-245.1797\\-69\\-154.2495\\-243.2266\\-69\\-155.2816\\-241.2734\\-69\\-156.1716\\-239.3203\\-69\\-156.9034\\-237.3672\\-69\\-157.9942\\-235.4141\\-69\\-158.7477\\-233.4609\\-69\\-159.8726\\-231.5078\\-69\\-160.4992\\-229.5547\\-69\\-161.4306\\-227.6016\\-69\\-162.032\\-225.6484\\-69\\-162.437\\-223.6953\\-69\\-163.7795\\-219.7891\\-69\\-164.6169\\-215.8828\\-69\\-165.332\\-213.9297\\-69\\-165.7804\\-211.9766\\-69\\-166.5193\\-208.0703\\-69\\-167.0448\\-206.1172\\-69\\-167.4143\\-204.1641\\-69\\-167.6647\\-202.2109\\-69\\-168.1195\\-196.3516\\-69\\-168.3262\\-192.4453\\-69\\-168.4504\\-188.5391\\-69\\-168.4768\\-182.6797\\-69\\-168.288\\-176.8203\\-69\\-168.1176\\-172.9141\\-69\\-167.8878\\-169.0078\\-69\\-167.5614\\-165.1016\\-69\\-167.3023\\-163.1484\\-69\\-166.51\\-159.2422\\-69\\-165.8711\\-155.3359\\-69\\-165.501\\-153.3828\\-69\\-164.8582\\-151.4297\\-69\\-164.3384\\-149.4766\\-69\\-163.5391\\-145.5703\\-69\\-162.7189\\-143.6172\\-69\\-161.8108\\-139.7109\\-69\\-159.3667\\-133.8516\\-69\\-158.2992\\-131.8984\\-69\\-157.4857\\-129.9453\\-69\\-156.3766\\-127.9922\\-69\\-155.6039\\-126.0391\\-69\\-154.4167\\-124.0859\\-69\\-153.3579\\-122.1328\\-69\\-152.0735\\-120.1797\\-69\\-150.6145\\-118.2266\\-69\\-149.5332\\-116.2734\\-69\\-148.2034\\-114.3203\\-69\\-143.6554\\-108.4609\\-69\\-141.9601\\-106.5078\\-69\\-140.0876\\-104.5547\\-69\\-137.6953\\-102.2735\\-69\\-135.7422\\-100.6232\\-69\\-133.7891\\-99.2727\\-69\\-130.5938\\-96.74219\\-69\\-129.8828\\-96.11192\\-69\\-127.8701\\-94.78906\\-69\\-125.9766\\-93.7873\\-69\\-124.0234\\-92.63311\\-69\\-122.0703\\-91.62389\\-69\\-120.1172\\-90.45258\\-69\\-118.1641\\-89.63932\\-69\\-116.2109\\-88.5625\\-69\\-114.2578\\-87.90206\\-69\\-112.2233\\-86.97656\\-69\\-110.3516\\-86.25666\\-69\\-106.4453\\-84.85828\\-69\\-104.4922\\-84.27369\\-69\\-102.5391\\-83.89947\\-69\\-100.5859\\-83.41706\\-69\\-98.63281\\-82.68406\\-69\\-96.67969\\-82.21667\\-69\\-88.86719\\-81.10891\\-69\\-86.91406\\-80.72798\\-69\\-83.00781\\-80.28991\\-69\\-79.10156\\-80.0921\\-69\\-75.19531\\-79.81735\\-69\\-73.24219\\-79.78989\\-69\\-67.38281\\-79.93089\\-69\\-65.42969\\-80.085\\-69\\-61.52344\\-80.23334\\-69\\-55.66406\\-80.63901\\-69\\-53.71094\\-80.88251\\-69\\-49.80469\\-81.52648\\-69\\-43.94531\\-82.20864\\-69\\-41.99219\\-82.4709\\-69\\-40.03906\\-82.89346\\-69\\-34.17969\\-84.47174\\-69\\-32.22656\\-85.20605\\-69\\-28.32031\\-86.52734\\-69\\-26.36719\\-87.38092\\-69\\-24.41406\\-88.1113\\-69\\-22.86458\\-88.92969\\-69\\-20.50781\\-90.32372\\-69\\-18.55469\\-91.90343\\-69\\-14.64844\\-95.43197\\-69\\-11.6442\\-98.69531\\-69\\-8.292906\\-102.6016\\-69\\-6.863318\\-104.5547\\-69\\-5.117563\\-106.5078\\-69\\-2.929688\\-108.6689\\-69\\-0.9765625\\-109.7357\\-69\\0.9765625\\-108.8835\\-69\\1.365459\\-108.4609\\-69\\4.336229\\-104.5547\\-69\\6.008469\\-102.6016\\-69\\7.788874\\-100.6484\\-69\\11.68981\\-96.74219\\-69\\12.69531\\-95.6386\\-69\\15.67508\\-92.83594\\-69\\18.55469\\-90.46429\\-69\\20.67814\\-88.92969\\-69\\24.41406\\-86.59031\\-69\\26.36719\\-85.51172\\-69\\28.32031\\-84.22126\\-69\\32.22656\\-82.33262\\-69\\34.17969\\-81.7187\\-69\\36.13281\\-80.95181\\-69\\38.08594\\-80.40404\\-69\\41.99219\\-79.57639\\-69\\43.94531\\-79.05556\\-69\\45.89844\\-78.69195\\-69\\49.80469\\-78.17522\\-69\\53.71094\\-77.89838\\-69\\57.61719\\-77.68584\\-69\\61.52344\\-77.64117\\-69\\67.38281\\-77.79946\\-69\\71.28906\\-78.10847\\-69\\75.19531\\-78.21146\\-69\\77.14844\\-78.51505\\-69\\83.00781\\-79.59733\\-69\\84.96094\\-79.7686\\-69\\90.82031\\-80.62554\\-69\\92.77344\\-81.06022\\-69\\94.72656\\-81.61244\\-69\\98.63281\\-82.34106\\-69\\100.5859\\-82.88536\\-69\\102.5391\\-83.65497\\-69\\104.4922\\-84.25278\\-69\\108.3984\\-85.84423\\-69\\110.3516\\-86.42318\\-69\\114.2578\\-88.05393\\-69\\118.1641\\-89.97903\\-69\\120.1172\\-91.17722\\-69\\122.0703\\-92.26991\\-69\\124.0234\\-93.53934\\-69\\125.9766\\-94.58894\\-69\\127.9297\\-95.95964\\-69\\131.8359\\-99.11384\\-69\\133.7891\\-100.4964\\-69\\135.7422\\-102.1398\\-69\\140.1032\\-106.5078\\-69\\141.9449\\-108.4609\\-69\\143.2746\\-110.4141\\-69\\146.4781\\-114.3203\\-69\\147.999\\-116.2734\\-69\\148.9715\\-118.2266\\-69\\150.2717\\-120.1797\\-69\\151.4338\\-122.1328\\-69\\152.4936\\-124.0859\\-69\\153.7417\\-126.0391\\-69\\154.5944\\-127.9922\\-69\\155.7414\\-129.9453\\-69\\156.3578\\-131.8984\\-69\\158.0672\\-135.8047\\-69\\158.7161\\-137.7578\\-69\\159.6889\\-139.7109\\-69\\160.7783\\-143.6172\\-69\\161.583\\-145.5703\\-69\\161.969\\-147.5234\\-69\\162.5013\\-151.4297\\-69\\162.927\\-153.3828\\-69\\163.4961\\-155.3359\\-69\\163.7827\\-157.2891\\-69\\164.6099\\-165.1016\\-69\\165.2261\\-169.0078\\-69\\165.4455\\-170.9609\\-69\\165.8035\\-176.8203\\-69\\165.9619\\-180.7266\\-69\\166.0904\\-186.5859\\-69\\166.1326\\-192.4453\\-69\\166.0811\\-198.3047\\-69\\165.9958\\-204.1641\\-69\\165.7552\\-211.9766\\-69\\165.5187\\-215.8828\\-69\\165.2982\\-217.8359\\-69\\164.5235\\-221.7422\\-69\\163.7042\\-227.6016\\-69\\162.4748\\-231.5078\\-69\\162.1212\\-233.4609\\-69\\161.6626\\-235.4141\\-69\\160.7783\\-237.3672\\-69\\160.0576\\-239.3203\\-69\\159.2024\\-241.2734\\-69\\158.1926\\-243.2266\\-69\\157.2937\\-245.1797\\-69\\156.2968\\-247.1328\\-69\\155.4219\\-249.0859\\-69\\154.2618\\-251.0391\\-69\\152.9584\\-252.9922\\-69\\151.7991\\-254.9453\\-69\\148.882\\-258.8516\\-69\\147.6653\\-260.8047\\-69\\145.9961\\-262.7578\\-69\\140.6986\\-268.6172\\-69\\138.6148\\-270.5703\\-69\\135.7422\\-273.5269\\-69\\133.7891\\-275.3294\\-69\\129.8828\\-278.6058\\-69\\127.7255\\-280.3359\\-69\\125.9766\\-281.6185\\-69\\122.0703\\-284.6133\\-69\\116.847\\-288.1484\\-69\\116.2109\\-288.6402\\-69\\114.2578\\-289.4738\\-69\\112.3047\\-290.7991\\-69\\110.3516\\-291.7947\\-69\\108.3984\\-292.9985\\-69\\104.4922\\-294.906\\-69\\102.5391\\-295.5171\\-69\\100.5859\\-296.4987\\-69\\98.63281\\-297.0287\\-69\\96.67969\\-297.7188\\-69\\94.72656\\-298.5129\\-69\\90.82031\\-299.4066\\-69\\88.86719\\-299.9765\\-69\\86.91406\\-300.3555\\-69\\83.00781\\-300.7656\\-69\\79.10156\\-300.9791\\-69\\75.19531\\-301.0522\\-69\\71.28906\\-301.0095\\-69\\67.38281\\-300.8438\\-69\\63.47656\\-300.4933\\-69\\61.52344\\-300.1841\\-69\\59.57031\\-299.5641\\-69\\55.66406\\-298.5668\\-69\\53.71094\\-297.6788\\-69\\49.80469\\-296.1739\\-69\\47.85156\\-295.1248\\-69\\45.89844\\-294.292\\-69\\41.99219\\-291.4785\\-69\\38.08594\\-288.8061\\-69\\34.87203\\-286.1953\\-69\\32.22656\\-283.7209\\-69\\28.32031\\-280.4987\\-69\\22.46094\\-274.4509\\-69\\20.50781\\-272.266\\-69\\18.55469\\-270.2624\\-69\\16.60156\\-269.0127\\-69\\14.64844\\-268.09\\-69\\12.69531\\-267.5511\\-69\\10.74219\\-267.1821\\-69\\8.789063\\-267.1523\\-69\\2.929688\\-267.1776\\-69\\0.9765625\\-267.284\\-69\\-0.9765625\\-267.5217\\-69\\-2.929688\\-267.5897\\-69\\-4.882813\\-267.9284\\-69\\-6.835938\\-268.1057\\-69\\-10.74219\\-268.3395\\-69\\-12.69531\\-268.5488\\-69\\-14.64844\\-269.0938\\-69\\-16.60156\\-269.9954\\-69\\-18.55469\\-271.7022\\-69\\-21.121\\-274.4766\\-69\\-24.41406\\-277.4718\\-69\\-28.32031\\-281.1104\\-69\\-31.99527\\-284.2422\\-69\\-34.17969\\-286.2786\\-69\\-36.13281\\-287.7966\\-69\\-38.96012\\-290.1016\\-69\\-41.99219\\-292.4012\\-69\\-43.94531\\-293.4975\\-69\\-45.89844\\-294.7498\\-69\\-47.85156\\-295.4693\\-69\\-49.80469\\-296.5736\\-69\\-51.75781\\-297.1703\\-69\\-53.71094\\-298.1498\\-69\\-55.66406\\-298.7717\\-69\\-57.61719\\-299.2883\\-69\\-59.57031\\-299.9619\\-69\\-61.52344\\-300.4227\\-69\\-65.42969\\-300.8381\\-69\\-71.28906\\-301.1672\\-69\\-75.19531\\-301.1796\\-69\\-79.10156\\-301.0026\\-69\\-83.00781\\-300.7034\\-69\\-84.96094\\-300.4739\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "308" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "92" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-299.9338\\-67\\-88.86719\\-299.3318\\-67\\-92.77344\\-298.4697\\-67\\-94.72656\\-297.6068\\-67\\-98.63281\\-296.4524\\-67\\-100.5859\\-295.4148\\-67\\-102.5391\\-294.8074\\-67\\-106.4453\\-292.7939\\-67\\-108.3984\\-291.4332\\-67\\-110.3516\\-290.4293\\-67\\-112.3047\\-289.1806\\-67\\-116.2109\\-286.7878\\-67\\-116.8791\\-286.1953\\-67\\-120.1172\\-283.6497\\-67\\-122.0703\\-282.3793\\-67\\-124.0234\\-280.8488\\-67\\-124.5326\\-280.3359\\-67\\-128.9503\\-276.4297\\-67\\-131.8359\\-273.6293\\-67\\-134.7656\\-270.5703\\-67\\-137.6953\\-267.2232\\-67\\-141.6016\\-262.3985\\-67\\-142.6708\\-260.8047\\-67\\-144.2037\\-258.8516\\-67\\-145.6241\\-256.8984\\-67\\-148.3647\\-252.9922\\-67\\-150.5822\\-249.0859\\-67\\-151.9134\\-247.1328\\-67\\-152.9417\\-245.1797\\-67\\-154.1599\\-243.2266\\-67\\-156.0974\\-239.3203\\-67\\-156.7722\\-237.3672\\-67\\-157.9006\\-235.4141\\-67\\-158.5926\\-233.4609\\-67\\-159.7484\\-231.5078\\-67\\-160.3683\\-229.5547\\-67\\-161.2734\\-227.6016\\-67\\-161.9416\\-225.6484\\-67\\-162.3399\\-223.6953\\-67\\-162.8981\\-221.7422\\-67\\-163.6719\\-219.7891\\-67\\-164.452\\-215.8828\\-67\\-165.6669\\-211.9766\\-67\\-166.3504\\-208.0703\\-67\\-167.2431\\-204.1641\\-67\\-167.5408\\-202.2109\\-67\\-167.7376\\-200.2578\\-67\\-168.0038\\-196.3516\\-67\\-168.2144\\-192.4453\\-67\\-168.3302\\-188.5391\\-67\\-168.3556\\-182.6797\\-67\\-168.2144\\-176.8203\\-67\\-167.9515\\-170.9609\\-67\\-167.4774\\-165.1016\\-67\\-167.193\\-163.1484\\-67\\-166.4005\\-159.2422\\-67\\-165.8053\\-155.3359\\-67\\-165.4161\\-153.3828\\-67\\-164.761\\-151.4297\\-67\\-164.2849\\-149.4766\\-67\\-163.4538\\-145.5703\\-67\\-162.6378\\-143.6172\\-67\\-161.7691\\-139.7109\\-67\\-160.8833\\-137.7578\\-67\\-159.2605\\-133.8516\\-67\\-158.2504\\-131.8984\\-67\\-157.362\\-129.9453\\-67\\-156.321\\-127.9922\\-67\\-155.5233\\-126.0391\\-67\\-155.2734\\-125.6888\\-67\\-153.3203\\-122.1437\\-67\\-152.0691\\-120.1797\\-67\\-150.6394\\-118.2266\\-67\\-149.5768\\-116.2734\\-67\\-148.2933\\-114.3203\\-67\\-143.8427\\-108.4609\\-67\\-142.2455\\-106.5078\\-67\\-140.4486\\-104.5547\\-67\\-137.6953\\-101.8868\\-67\\-135.7422\\-100.2185\\-67\\-131.2924\\-96.74219\\-67\\-127.9297\\-94.28993\\-67\\-125.9766\\-93.43426\\-67\\-124.0234\\-92.18708\\-67\\-120.1172\\-90.01405\\-67\\-118.1641\\-89.20973\\-67\\-116.2109\\-88.16864\\-67\\-114.2578\\-87.52544\\-67\\-112.3047\\-86.53146\\-67\\-110.3516\\-85.86328\\-67\\-106.4453\\-84.34437\\-67\\-104.4922\\-83.79782\\-67\\-102.5391\\-83.46231\\-67\\-98.63281\\-82.21172\\-67\\-94.72656\\-81.52103\\-67\\-92.77344\\-81.07581\\-67\\-84.96094\\-80.1823\\-67\\-83.00781\\-79.92361\\-67\\-81.05469\\-79.76763\\-67\\-73.24219\\-79.28513\\-67\\-67.38281\\-79.48461\\-67\\-61.52344\\-79.82188\\-67\\-59.57031\\-80.03555\\-67\\-55.66406\\-80.31046\\-67\\-49.80469\\-80.85628\\-67\\-45.89844\\-81.51212\\-67\\-40.03906\\-82.25651\\-67\\-38.08594\\-82.62124\\-67\\-34.17969\\-83.85281\\-67\\-32.22656\\-84.39868\\-67\\-30.36386\\-85.02344\\-67\\-28.32031\\-85.95148\\-67\\-26.36719\\-86.53575\\-67\\-24.41406\\-87.50183\\-67\\-22.46094\\-88.28097\\-67\\-18.55469\\-90.82388\\-67\\-16.60156\\-92.6692\\-67\\-14.64844\\-94.35239\\-67\\-12.69531\\-96.296\\-67\\-10.52782\\-98.69531\\-67\\-9.078721\\-100.6484\\-67\\-5.59677\\-104.5547\\-67\\-2.929688\\-107.2054\\-67\\-0.9765625\\-108.2656\\-67\\0.9765625\\-107.398\\-67\\4.882813\\-102.7597\\-67\\8.536784\\-98.69531\\-67\\10.74219\\-96.42442\\-67\\14.47976\\-92.83594\\-67\\16.71464\\-90.88281\\-67\\18.55469\\-89.64307\\-67\\20.50781\\-88.14984\\-67\\22.46094\\-86.875\\-67\\24.41406\\-85.84183\\-67\\26.36719\\-84.53169\\-67\\30.27344\\-82.48984\\-67\\32.22656\\-81.77985\\-67\\34.17969\\-80.95181\\-67\\36.13281\\-80.38794\\-67\\38.08594\\-79.92287\\-67\\41.99219\\-78.87041\\-67\\45.89844\\-78.18124\\-67\\47.85156\\-77.89453\\-67\\53.71094\\-77.34375\\-67\\57.61719\\-77.11253\\-67\\61.52344\\-77.01563\\-67\\63.47656\\-77.04206\\-67\\67.38281\\-77.21888\\-67\\71.28906\\-77.67995\\-67\\73.24219\\-77.7993\\-67\\75.19531\\-77.80185\\-67\\77.14844\\-78.02271\\-67\\79.10156\\-78.38167\\-67\\84.47266\\-79.16406\\-67\\88.86719\\-80.02749\\-67\\92.77344\\-80.54313\\-67\\94.72656\\-80.98331\\-67\\96.67969\\-81.59508\\-67\\100.5859\\-82.40012\\-67\\104.4922\\-83.82851\\-67\\106.4453\\-84.45581\\-67\\108.3984\\-85.34421\\-67\\112.3047\\-86.63719\\-67\\114.2578\\-87.77896\\-67\\116.2109\\-88.43443\\-67\\118.1641\\-89.56573\\-67\\120.1172\\-90.5199\\-67\\124.0234\\-93.06618\\-67\\125.9766\\-94.07336\\-67\\127.9297\\-95.60066\\-67\\131.8359\\-98.54805\\-67\\133.7891\\-100.1127\\-67\\135.7422\\-101.8217\\-67\\137.6953\\-103.7279\\-67\\139.6484\\-105.8188\\-67\\140.4176\\-106.5078\\-67\\142.2084\\-108.4609\\-67\\143.7124\\-110.4141\\-67\\145.0903\\-112.3672\\-67\\148.1729\\-116.2734\\-67\\149.1382\\-118.2266\\-67\\151.591\\-122.1328\\-67\\152.5908\\-124.0859\\-67\\153.815\\-126.0391\\-67\\154.6639\\-127.9922\\-67\\155.785\\-129.9453\\-67\\156.3766\\-131.8984\\-67\\158.0487\\-135.8047\\-67\\158.6465\\-137.7578\\-67\\159.6252\\-139.7109\\-67\\160.7023\\-143.6172\\-67\\161.499\\-145.5703\\-67\\161.9178\\-147.5234\\-67\\162.4042\\-151.4297\\-67\\162.7581\\-153.3828\\-67\\163.3336\\-155.3359\\-67\\163.6927\\-157.2891\\-67\\163.9075\\-159.2422\\-67\\164.4474\\-165.1016\\-67\\164.6704\\-167.0547\\-67\\165.2385\\-170.9609\\-67\\165.561\\-174.8672\\-67\\165.8273\\-180.7266\\-67\\165.9175\\-184.6328\\-67\\165.966\\-192.4453\\-67\\165.8948\\-202.2109\\-67\\165.7589\\-208.0703\\-67\\165.483\\-213.9297\\-67\\165.2865\\-215.8828\\-67\\164.3423\\-221.7422\\-67\\163.8661\\-225.6484\\-67\\163.5063\\-227.6016\\-67\\162.7794\\-229.5547\\-67\\161.9962\\-233.4609\\-67\\161.4698\\-235.4141\\-67\\160.5481\\-237.3672\\-67\\159.8894\\-239.3203\\-67\\158.8881\\-241.2734\\-67\\158.0324\\-243.2266\\-67\\156.9569\\-245.1797\\-67\\156.1726\\-247.1328\\-67\\154.0838\\-251.0391\\-67\\152.7294\\-252.9922\\-67\\151.5416\\-254.9453\\-67\\150.1888\\-256.8984\\-67\\147.4609\\-260.6652\\-67\\145.7291\\-262.7578\\-67\\142.3124\\-266.6641\\-67\\140.4903\\-268.6172\\-67\\137.6953\\-271.2737\\-67\\135.7422\\-273.3281\\-67\\133.7891\\-275.1253\\-67\\129.8828\\-278.2133\\-67\\127.3682\\-280.3359\\-67\\124.0234\\-282.8969\\-67\\120.1172\\-285.575\\-67\\118.1641\\-287.0468\\-67\\116.2109\\-288.356\\-67\\114.2578\\-289.2757\\-67\\112.3047\\-290.5711\\-67\\110.3516\\-291.4958\\-67\\108.3984\\-292.7746\\-67\\106.4453\\-293.6557\\-67\\104.4922\\-294.7186\\-67\\102.5391\\-295.2868\\-67\\100.5859\\-296.2247\\-67\\98.63281\\-296.8677\\-67\\96.67969\\-297.3978\\-67\\94.72656\\-298.2606\\-67\\92.77344\\-298.7648\\-67\\90.82031\\-299.1595\\-67\\86.91406\\-300.1281\\-67\\83.00781\\-300.6136\\-67\\79.10156\\-300.8438\\-67\\75.19531\\-300.9184\\-67\\71.28906\\-300.8894\\-67\\67.38281\\-300.7321\\-67\\63.47656\\-300.3644\\-67\\61.52344\\-300.0026\\-67\\59.57031\\-299.3759\\-67\\55.66406\\-298.4421\\-67\\53.71094\\-297.4807\\-67\\51.75781\\-296.8543\\-67\\45.89844\\-294.1102\\-67\\43.02979\\-292.0547\\-67\\38.08594\\-288.7705\\-67\\34.85292\\-286.1953\\-67\\32.22656\\-283.841\\-67\\30.27344\\-282.3793\\-67\\28.32031\\-280.7993\\-67\\23.89172\\-276.4297\\-67\\21.79747\\-274.4766\\-67\\18.55469\\-271.3501\\-67\\16.60156\\-270.1317\\-67\\12.69531\\-269.2213\\-67\\10.74219\\-269.0369\\-67\\6.835938\\-268.9634\\-67\\2.929688\\-269.0131\\-67\\-2.929688\\-269.1764\\-67\\-4.882813\\-269.7092\\-67\\-8.789063\\-269.9633\\-67\\-10.74219\\-269.5865\\-67\\-12.69531\\-269.8536\\-67\\-14.64844\\-270.3839\\-67\\-16.60156\\-271.3243\\-67\\-18.55469\\-272.6717\\-67\\-20.50781\\-274.5869\\-67\\-24.41406\\-277.8662\\-67\\-27.19411\\-280.3359\\-67\\-30.27344\\-282.9105\\-67\\-31.95866\\-284.2422\\-67\\-34.17969\\-286.2029\\-67\\-39.0705\\-290.1016\\-67\\-41.99219\\-292.2417\\-67\\-43.94531\\-293.3668\\-67\\-45.89844\\-294.6393\\-67\\-47.85156\\-295.3418\\-67\\-49.80469\\-296.446\\-67\\-51.75781\\-297.0637\\-67\\-55.66406\\-298.6641\\-67\\-57.61719\\-299.1456\\-67\\-61.52344\\-300.3005\\-67\\-63.47656\\-300.5615\\-67\\-67.38281\\-300.8894\\-67\\-71.28906\\-301.0594\\-67\\-75.19531\\-301.0879\\-67\\-81.05469\\-300.7938\\-67\\-84.96094\\-300.3644\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "298" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "93" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-300.2413\\-65\\-88.86719\\-299.1924\\-65\\-92.77344\\-298.3133\\-65\\-94.72656\\-297.4227\\-65\\-96.67969\\-296.8953\\-65\\-98.63281\\-296.263\\-65\\-100.5859\\-295.2792\\-65\\-102.5391\\-294.6858\\-65\\-104.4922\\-293.5322\\-65\\-106.4453\\-292.6152\\-65\\-108.3984\\-291.2679\\-65\\-112.3047\\-289.0446\\-65\\-114.2578\\-287.7537\\-65\\-116.2109\\-286.5873\\-65\\-120.1172\\-283.4383\\-65\\-121.8787\\-282.2891\\-65\\-124.0234\\-280.6487\\-65\\-128.7095\\-276.4297\\-65\\-131.8359\\-273.4312\\-65\\-133.7891\\-271.338\\-65\\-134.6029\\-270.5703\\-65\\-137.6953\\-267.0434\\-65\\-141.6016\\-262.2259\\-65\\-144.1136\\-258.8516\\-65\\-145.4671\\-256.8984\\-65\\-148.2798\\-252.9922\\-65\\-150.4877\\-249.0859\\-65\\-151.8291\\-247.1328\\-65\\-152.832\\-245.1797\\-65\\-154.0766\\-243.2266\\-65\\-154.9408\\-241.2734\\-65\\-156.0136\\-239.3203\\-65\\-156.651\\-237.3672\\-65\\-157.787\\-235.4141\\-65\\-158.4473\\-233.4609\\-65\\-159.5741\\-231.5078\\-65\\-160.2367\\-229.5547\\-65\\-161.8425\\-225.6484\\-65\\-162.6967\\-221.7422\\-65\\-163.5164\\-219.7891\\-65\\-164.3094\\-215.8828\\-65\\-164.8324\\-213.9297\\-65\\-165.5215\\-211.9766\\-65\\-166.5534\\-206.1172\\-65\\-167.3712\\-202.2109\\-65\\-167.6099\\-200.2578\\-65\\-167.9982\\-194.3984\\-65\\-168.2235\\-188.5391\\-65\\-168.239\\-182.6797\\-65\\-168.175\\-178.7734\\-65\\-168.057\\-174.8672\\-65\\-167.866\\-170.9609\\-65\\-167.5698\\-167.0547\\-65\\-167.3712\\-165.1016\\-65\\-167.0588\\-163.1484\\-65\\-166.2884\\-159.2422\\-65\\-165.7124\\-155.3359\\-65\\-165.2982\\-153.3828\\-65\\-164.6396\\-151.4297\\-65\\-163.8359\\-147.5234\\-65\\-163.3212\\-145.5703\\-65\\-162.5179\\-143.6172\\-65\\-161.6825\\-139.7109\\-65\\-160.7276\\-137.7578\\-65\\-160.0236\\-135.8047\\-65\\-156.25\\-127.9922\\-65\\-155.3615\\-126.0391\\-65\\-153.3203\\-122.3302\\-65\\-152.0244\\-120.1797\\-65\\-150.6165\\-118.2266\\-65\\-149.5625\\-116.2734\\-65\\-148.3211\\-114.3203\\-65\\-146.8645\\-112.3672\\-65\\-145.5154\\-110.4141\\-65\\-142.5068\\-106.5078\\-65\\-139.6484\\-103.3814\\-65\\-137.6953\\-101.5303\\-65\\-134.421\\-98.69531\\-65\\-131.8359\\-96.63898\\-65\\-127.9297\\-93.92026\\-65\\-125.9766\\-92.79779\\-65\\-124.0234\\-91.83481\\-65\\-122.0703\\-90.63692\\-65\\-120.1172\\-89.70483\\-65\\-118.1641\\-88.64518\\-65\\-116.2109\\-87.88758\\-65\\-114.2578\\-86.90569\\-65\\-112.3047\\-86.23223\\-65\\-109.375\\-85.02344\\-65\\-106.4453\\-83.94515\\-65\\-104.4922\\-83.45952\\-65\\-100.5859\\-82.36068\\-65\\-96.67969\\-81.4402\\-65\\-94.72656\\-80.92342\\-65\\-92.77344\\-80.69169\\-65\\-86.91406\\-80.13467\\-65\\-83.00781\\-79.57037\\-65\\-77.14844\\-79.05556\\-65\\-73.24219\\-78.8601\\-65\\-67.38281\\-78.96462\\-65\\-61.52344\\-79.36418\\-65\\-53.71094\\-80.14063\\-65\\-51.75781\\-80.25957\\-65\\-47.85156\\-80.59592\\-65\\-45.89844\\-80.82866\\-65\\-40.03906\\-81.82802\\-65\\-38.08594\\-82.10651\\-65\\-36.13281\\-82.48839\\-65\\-32.22656\\-83.80746\\-65\\-30.27344\\-84.30354\\-65\\-26.36719\\-85.98122\\-65\\-24.41406\\-86.67776\\-65\\-22.46094\\-87.74289\\-65\\-20.50781\\-88.61442\\-65\\-18.55469\\-89.95579\\-65\\-15.41516\\-92.83594\\-65\\-12.69531\\-95.43197\\-65\\-9.5628\\-98.69531\\-65\\-6.068638\\-102.6016\\-65\\-2.929688\\-105.8898\\-65\\-0.9765625\\-107.0576\\-65\\0.9765625\\-105.9368\\-65\\2.193622\\-104.5547\\-65\\7.704791\\-98.69531\\-65\\10.74219\\-95.60047\\-65\\13.60212\\-92.83594\\-65\\16.60156\\-90.04867\\-65\\18.55469\\-88.53092\\-65\\20.50781\\-87.40625\\-65\\24.41406\\-84.90625\\-65\\28.32031\\-82.67821\\-65\\32.22656\\-81.07545\\-65\\34.17969\\-80.39453\\-65\\36.13281\\-79.95431\\-65\\40.03906\\-78.7336\\-65\\45.89844\\-77.68546\\-65\\49.80469\\-77.15491\\-65\\53.71094\\-76.72607\\-65\\59.57031\\-76.52276\\-65\\63.47656\\-76.54037\\-65\\67.38281\\-76.66327\\-65\\69.33594\\-76.79642\\-65\\73.24219\\-77.32275\\-65\\75.19531\\-77.37856\\-65\\77.14844\\-77.60558\\-65\\79.10156\\-77.9816\\-65\\83.00781\\-78.43164\\-65\\86.91406\\-79.11188\\-65\\88.86719\\-79.6004\\-65\\94.72656\\-80.51968\\-65\\96.67969\\-80.96875\\-65\\98.63281\\-81.68574\\-65\\102.5391\\-82.5322\\-65\\104.4922\\-83.38421\\-65\\108.3984\\-84.69569\\-65\\110.3516\\-85.60287\\-65\\112.3047\\-86.28757\\-65\\114.2578\\-87.42997\\-65\\116.2109\\-88.06093\\-65\\120.1172\\-90.05183\\-65\\122.0703\\-91.36758\\-65\\124.0234\\-92.45501\\-65\\127.4884\\-94.78906\\-65\\129.8828\\-96.55958\\-65\\134.8208\\-100.6484\\-65\\137.6953\\-103.3975\\-65\\140.6767\\-106.5078\\-65\\142.4132\\-108.4609\\-65\\143.9807\\-110.4141\\-65\\145.3438\\-112.3672\\-65\\148.2706\\-116.2734\\-65\\150.4339\\-120.1797\\-65\\151.682\\-122.1328\\-65\\152.6633\\-124.0859\\-65\\153.8739\\-126.0391\\-65\\154.6862\\-127.9922\\-65\\155.7983\\-129.9453\\-65\\156.3525\\-131.8984\\-65\\158.0028\\-135.8047\\-65\\158.5535\\-137.7578\\-65\\159.518\\-139.7109\\-65\\160.5842\\-143.6172\\-65\\161.3235\\-145.5703\\-65\\161.8357\\-147.5234\\-65\\162.6107\\-153.3828\\-65\\163.5554\\-157.2891\\-65\\163.8075\\-159.2422\\-65\\164.304\\-165.1016\\-65\\164.681\\-169.0078\\-65\\164.9571\\-170.9609\\-65\\165.3752\\-174.8672\\-65\\165.6196\\-178.7734\\-65\\165.8014\\-186.5859\\-65\\165.8074\\-194.3984\\-65\\165.7424\\-200.2578\\-65\\165.7552\\-202.2109\\-65\\165.5963\\-208.0703\\-65\\165.3959\\-211.9766\\-65\\165.2385\\-213.9297\\-65\\164.668\\-217.8359\\-65\\163.7121\\-225.6484\\-65\\163.2425\\-227.6016\\-65\\162.5813\\-229.5547\\-65\\161.8546\\-233.4609\\-65\\161.1871\\-235.4141\\-65\\160.3527\\-237.3672\\-65\\159.7087\\-239.3203\\-65\\158.6225\\-241.2734\\-65\\157.8568\\-243.2266\\-65\\156.6862\\-245.1797\\-65\\156.0184\\-247.1328\\-65\\154.8479\\-249.0859\\-65\\153.8936\\-251.0391\\-65\\151.3672\\-254.7273\\-65\\150.0041\\-256.8984\\-65\\147.4609\\-260.308\\-65\\145.3369\\-262.7578\\-65\\142.0827\\-266.6641\\-65\\140.2358\\-268.6172\\-65\\138.142\\-270.5703\\-65\\135.7422\\-273.0723\\-65\\133.7891\\-274.8539\\-65\\131.8359\\-276.2925\\-65\\129.8828\\-277.8482\\-65\\127.9297\\-279.5891\\-65\\125.9766\\-281.1865\\-65\\124.0234\\-282.6072\\-65\\122.0703\\-283.8559\\-65\\118.1641\\-286.8191\\-65\\116.0048\\-288.1484\\-65\\112.5064\\-290.1016\\-65\\110.3516\\-291.2409\\-65\\108.3984\\-292.5309\\-65\\106.4453\\-293.3783\\-65\\104.4922\\-294.4928\\-65\\100.5859\\-295.8148\\-65\\98.63281\\-296.6833\\-65\\96.67969\\-297.1496\\-65\\92.77344\\-298.5633\\-65\\88.86719\\-299.3351\\-65\\84.96094\\-300.1992\\-65\\81.05469\\-300.6067\\-65\\77.14844\\-300.7534\\-65\\73.24219\\-300.7932\\-65\\67.38281\\-300.618\\-65\\63.47656\\-300.197\\-65\\55.66406\\-298.2523\\-65\\53.71094\\-297.3044\\-65\\51.75781\\-296.7501\\-65\\49.80469\\-295.7298\\-65\\47.85156\\-294.9417\\-65\\46.02944\\-294.0078\\-65\\43.94531\\-292.6956\\-65\\40.03906\\-289.9632\\-65\\38.08594\\-288.7478\\-65\\36.13281\\-287.2623\\-65\\32.22656\\-284.0534\\-65\\30.27344\\-282.6297\\-65\\28.32031\\-281.0566\\-65\\24.41406\\-277.3452\\-65\\22.46094\\-275.5609\\-65\\20.50781\\-273.9152\\-65\\18.55469\\-272.4774\\-65\\16.60156\\-271.6349\\-65\\14.64844\\-271.1817\\-65\\12.69531\\-270.8897\\-65\\8.789063\\-270.8051\\-65\\4.882813\\-270.8239\\-65\\-2.929688\\-271.0764\\-65\\-4.882813\\-271.4879\\-65\\-6.835938\\-271.6732\\-65\\-8.789063\\-271.7574\\-65\\-10.74219\\-270.7534\\-65\\-14.64844\\-272.0941\\-65\\-16.60156\\-272.7033\\-65\\-18.55469\\-273.6277\\-65\\-21.93377\\-276.4297\\-65\\-24.37233\\-278.3828\\-65\\-26.69271\\-280.3359\\-65\\-28.32031\\-281.4985\\-65\\-31.79721\\-284.2422\\-65\\-34.17969\\-286.2182\\-65\\-36.13281\\-287.6534\\-65\\-39.21022\\-290.1016\\-65\\-42.05668\\-292.0547\\-65\\-45.20089\\-294.0078\\-65\\-45.89844\\-294.5095\\-65\\-47.85156\\-295.2378\\-65\\-49.80469\\-296.2888\\-65\\-53.71094\\-297.6682\\-65\\-55.66406\\-298.5457\\-65\\-59.57031\\-299.5461\\-65\\-61.52344\\-300.1621\\-65\\-63.47656\\-300.4624\\-65\\-67.38281\\-300.8045\\-65\\-71.28906\\-300.9542\\-65\\-75.19531\\-300.9709\\-65\\-81.05469\\-300.6987\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "316" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "94" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-300.0666\\-63\\-86.91406\\-299.5138\\-63\\-90.82031\\-298.6759\\-63\\-92.77344\\-298.1011\\-63\\-94.72656\\-297.2649\\-63\\-96.67969\\-296.7802\\-63\\-98.63281\\-296.0313\\-63\\-100.5859\\-295.1664\\-63\\-102.5391\\-294.5317\\-63\\-104.4922\\-293.343\\-63\\-106.4453\\-292.3889\\-63\\-110.3516\\-289.8786\\-63\\-112.3047\\-288.8904\\-63\\-114.2578\\-287.5509\\-63\\-116.2109\\-286.3369\\-63\\-120.1172\\-283.2713\\-63\\-121.5863\\-282.2891\\-63\\-124.0234\\-280.378\\-63\\-128.4888\\-276.4297\\-63\\-131.8359\\-273.2228\\-63\\-133.7891\\-271.1492\\-63\\-134.4467\\-270.5703\\-63\\-136.234\\-268.6172\\-63\\-139.3828\\-264.7109\\-63\\-141.6016\\-262.065\\-63\\-144.0264\\-258.8516\\-63\\-145.5078\\-256.6522\\-63\\-148.1995\\-252.9922\\-63\\-149.2188\\-251.0391\\-63\\-150.4087\\-249.0859\\-63\\-151.7137\\-247.1328\\-63\\-152.7077\\-245.1797\\-63\\-153.9815\\-243.2266\\-63\\-154.7953\\-241.2734\\-63\\-155.9181\\-239.3203\\-63\\-156.5442\\-237.3672\\-63\\-157.6425\\-235.4141\\-63\\-158.3168\\-233.4609\\-63\\-159.3667\\-231.5078\\-63\\-160.8412\\-227.6016\\-63\\-161.7188\\-225.6484\\-63\\-162.5398\\-221.7422\\-63\\-163.3085\\-219.7891\\-63\\-163.8359\\-217.8359\\-63\\-164.5917\\-213.9297\\-63\\-165.3209\\-211.9766\\-63\\-165.7263\\-210.0234\\-63\\-166.3355\\-206.1172\\-63\\-167.1419\\-202.2109\\-63\\-167.4338\\-200.2578\\-63\\-167.8711\\-194.3984\\-63\\-168.0923\\-188.5391\\-63\\-168.1176\\-184.6328\\-63\\-168.0634\\-178.7734\\-63\\-167.963\\-174.8672\\-63\\-167.7677\\-170.9609\\-63\\-167.4651\\-167.0547\\-63\\-167.2312\\-165.1016\\-63\\-166.5009\\-161.1953\\-63\\-165.6164\\-155.3359\\-63\\-165.1338\\-153.3828\\-63\\-164.4886\\-151.4297\\-63\\-163.7464\\-147.5234\\-63\\-162.4122\\-143.6172\\-63\\-162.0495\\-141.6641\\-63\\-161.5357\\-139.7109\\-63\\-160.5668\\-137.7578\\-63\\-159.8973\\-135.8047\\-63\\-158.8565\\-133.8516\\-63\\-158.0174\\-131.8984\\-63\\-156.9569\\-129.9453\\-63\\-156.153\\-127.9922\\-63\\-154.2033\\-124.0859\\-63\\-153.0116\\-122.1328\\-63\\-151.9279\\-120.1797\\-63\\-150.5395\\-118.2266\\-63\\-149.4861\\-116.2734\\-63\\-148.3008\\-114.3203\\-63\\-146.9523\\-112.3672\\-63\\-145.7087\\-110.4141\\-63\\-143.5547\\-107.5724\\-63\\-142.6527\\-106.5078\\-63\\-139.6484\\-103.2251\\-63\\-137.6953\\-101.3217\\-63\\-134.8522\\-98.69531\\-63\\-131.8359\\-96.23975\\-63\\-129.7862\\-94.78906\\-63\\-127.9297\\-93.57363\\-63\\-125.9766\\-92.404\\-63\\-124.0234\\-91.41235\\-63\\-122.0703\\-90.25055\\-63\\-120.1172\\-89.38093\\-63\\-118.1641\\-88.2583\\-63\\-116.2109\\-87.55395\\-63\\-114.2578\\-86.53744\\-63\\-112.3047\\-85.83724\\-63\\-110.3516\\-84.86185\\-63\\-108.3984\\-84.38604\\-63\\-104.47\\-83.07031\\-63\\-102.5391\\-82.47618\\-63\\-98.63281\\-81.65294\\-63\\-96.67969\\-80.95045\\-63\\-94.72656\\-80.60215\\-63\\-90.82031\\-80.2431\\-63\\-88.86719\\-79.98\\-63\\-86.91406\\-79.81726\\-63\\-84.96094\\-79.4548\\-63\\-81.05469\\-78.91658\\-63\\-75.19531\\-78.53583\\-63\\-69.33594\\-78.50252\\-63\\-67.38281\\-78.53627\\-63\\-65.42969\\-78.72937\\-63\\-61.52344\\-78.90498\\-63\\-57.61719\\-79.17263\\-63\\-53.71094\\-79.6899\\-63\\-49.80469\\-80.06322\\-63\\-43.94531\\-80.5732\\-63\\-41.99219\\-80.82866\\-63\\-38.08594\\-81.72173\\-63\\-34.17969\\-82.42578\\-63\\-28.32031\\-84.39918\\-63\\-26.36719\\-85.31868\\-63\\-24.41406\\-86.05708\\-63\\-20.50781\\-87.93927\\-63\\-18.97322\\-88.92969\\-63\\-16.60156\\-90.68893\\-63\\-10.74219\\-96.25787\\-63\\-8.3903\\-98.69531\\-63\\-5.023663\\-102.6016\\-63\\-2.929688\\-104.7666\\-63\\-0.9765625\\-105.7594\\-63\\0.9765625\\-104.8145\\-63\\2.929688\\-102.717\\-63\\4.947917\\-100.6484\\-63\\8.486794\\-96.74219\\-63\\14.64844\\-90.82285\\-63\\16.60156\\-89.22723\\-63\\20.50781\\-86.47371\\-63\\22.46094\\-85.43344\\-63\\24.41406\\-84.17224\\-63\\26.36719\\-83.02822\\-63\\28.32031\\-82.12674\\-63\\30.27344\\-81.37094\\-63\\32.22656\\-80.46838\\-63\\36.13281\\-79.36095\\-63\\38.08594\\-78.69756\\-63\\43.94531\\-77.45694\\-63\\47.85156\\-76.81048\\-63\\49.80469\\-76.61262\\-63\\53.71094\\-76.3295\\-63\\57.61719\\-76.17655\\-63\\61.52344\\-76.14502\\-63\\69.33594\\-76.40854\\-63\\73.24219\\-76.76884\\-63\\77.14844\\-77.06821\\-63\\79.10156\\-77.52261\\-63\\81.05469\\-77.83184\\-63\\86.91406\\-78.59226\\-63\\90.82031\\-79.53912\\-63\\94.72656\\-80.15323\\-63\\96.67969\\-80.55078\\-63\\100.5859\\-81.82913\\-63\\102.5391\\-82.19751\\-63\\104.4922\\-82.80067\\-63\\106.4453\\-83.67542\\-63\\108.3984\\-84.26389\\-63\\110.3516\\-85.07993\\-63\\114.2578\\-86.90625\\-63\\118.1641\\-88.55801\\-63\\122.0703\\-90.79618\\-63\\125.9766\\-93.48019\\-63\\127.9297\\-94.61673\\-63\\129.8828\\-96.17311\\-63\\130.4731\\-96.74219\\-63\\135.2043\\-100.6484\\-63\\137.6953\\-103.0529\\-63\\140.9437\\-106.5078\\-63\\143.5547\\-109.6056\\-63\\147.4609\\-114.9683\\-63\\148.3392\\-116.2734\\-63\\150.4643\\-120.1797\\-63\\151.724\\-122.1328\\-63\\152.6832\\-124.0859\\-63\\153.8792\\-126.0391\\-63\\154.6419\\-127.9922\\-63\\155.7617\\-129.9453\\-63\\156.2979\\-131.8984\\-63\\156.9955\\-133.8516\\-63\\157.9102\\-135.8047\\-63\\158.4432\\-137.7578\\-63\\159.3283\\-139.7109\\-63\\159.9682\\-141.6641\\-63\\160.4458\\-143.6172\\-63\\161.7084\\-147.5234\\-63\\162.0147\\-149.4766\\-63\\162.474\\-153.3828\\-63\\162.8203\\-155.3359\\-63\\163.3459\\-157.2891\\-63\\163.66\\-159.2422\\-63\\163.8703\\-161.1953\\-63\\164.4752\\-169.0078\\-63\\165.0766\\-174.8672\\-63\\165.4358\\-178.7734\\-63\\165.6042\\-184.6328\\-63\\165.6567\\-192.4453\\-63\\165.5692\\-200.2578\\-63\\165.5853\\-202.2109\\-63\\165.3752\\-208.0703\\-63\\165.1057\\-211.9766\\-63\\164.6369\\-215.8828\\-63\\163.8318\\-223.6953\\-63\\163.5063\\-225.6484\\-63\\162.9132\\-227.6016\\-63\\162.4204\\-229.5547\\-63\\162.1094\\-231.5078\\-63\\161.681\\-233.4609\\-63\\160.8508\\-235.4141\\-63\\159.4766\\-239.3203\\-63\\158.3822\\-241.2734\\-63\\157.6504\\-243.2266\\-63\\156.488\\-245.1797\\-63\\155.8152\\-247.1328\\-63\\154.6032\\-249.0859\\-63\\153.6365\\-251.0391\\-63\\151.3672\\-254.34\\-63\\150.855\\-254.9453\\-63\\149.7566\\-256.8984\\-63\\148.3745\\-258.8516\\-63\\146.7859\\-260.8047\\-63\\143.2989\\-264.7109\\-63\\141.7984\\-266.6641\\-63\\139.6484\\-268.873\\-63\\137.7887\\-270.5703\\-63\\135.7422\\-272.7482\\-63\\133.7891\\-274.4847\\-63\\131.8359\\-275.9414\\-63\\129.0283\\-278.3828\\-63\\125.9766\\-280.9455\\-63\\122.0703\\-283.5712\\-63\\121.2749\\-284.2422\\-63\\118.5092\\-286.1953\\-63\\118.1641\\-286.5255\\-63\\116.2109\\-287.6567\\-63\\114.2578\\-288.9384\\-63\\112.3047\\-289.8152\\-63\\111.9385\\-290.1016\\-63\\108.5612\\-292.0547\\-63\\104.7727\\-294.0078\\-63\\102.5391\\-294.9364\\-63\\100.5859\\-295.476\\-63\\98.63281\\-296.433\\-63\\94.72656\\-297.4609\\-63\\92.77344\\-298.2834\\-63\\90.82031\\-298.7329\\-63\\86.91406\\-299.438\\-63\\83.00781\\-300.2182\\-63\\79.10156\\-300.5615\\-63\\73.24219\\-300.654\\-63\\67.38281\\-300.4855\\-63\\65.42969\\-300.2937\\-63\\63.47656\\-299.9893\\-63\\61.52344\\-299.4703\\-63\\57.61719\\-298.6361\\-63\\55.66406\\-297.9807\\-63\\53.71094\\-297.1607\\-63\\51.75781\\-296.6179\\-63\\49.80469\\-295.5662\\-63\\47.85156\\-294.837\\-63\\43.94531\\-292.6799\\-63\\41.99219\\-291.2344\\-63\\40.03906\\-289.9031\\-63\\38.08594\\-288.7478\\-63\\34.65586\\-286.1953\\-63\\32.16019\\-284.2422\\-63\\30.27344\\-282.8736\\-63\\27.16261\\-280.3359\\-63\\24.41406\\-277.7813\\-63\\22.46094\\-276.1795\\-63\\20.50781\\-274.9114\\-63\\18.55469\\-273.8017\\-63\\16.60156\\-273.1719\\-63\\14.64844\\-272.8218\\-63\\10.74219\\-272.5918\\-63\\4.882813\\-272.6671\\-63\\-0.9765625\\-272.8828\\-63\\-2.929688\\-272.9897\\-63\\-6.835938\\-273.3799\\-63\\-8.789063\\-273.4916\\-63\\-10.74219\\-273.2452\\-63\\-12.69531\\-273.4332\\-63\\-14.64844\\-273.8122\\-63\\-16.60156\\-274.0203\\-63\\-18.55469\\-274.7752\\-63\\-20.50781\\-275.8468\\-63\\-22.46094\\-277.3326\\-63\\-26.36719\\-280.5897\\-63\\-28.32031\\-281.8223\\-63\\-30.27344\\-283.2408\\-63\\-34.17969\\-286.3762\\-63\\-36.13281\\-287.6534\\-63\\-40.03906\\-290.5745\\-63\\-41.99219\\-291.7807\\-63\\-45.89844\\-294.3661\\-63\\-47.85156\\-295.1441\\-63\\-49.80469\\-296.0906\\-63\\-51.75781\\-296.872\\-63\\-53.71094\\-297.4836\\-63\\-55.66406\\-297.7172\\-63\\-57.61719\\-298.8857\\-63\\-59.57031\\-299.3699\\-63\\-61.52344\\-299.9619\\-63\\-63.47656\\-300.3525\\-63\\-67.38281\\-300.705\\-63\\-73.24219\\-300.884\\-63\\-77.14844\\-300.8157\\-63\\-81.05469\\-300.5954\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "300" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "95" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-300.2389\\-61\\-84.86643\\-299.8672\\-61\\-86.91406\\-299.3436\\-61\\-90.82031\\-298.5453\\-61\\-94.72656\\-297.1274\\-61\\-96.67969\\-296.6593\\-61\\-98.63281\\-295.7581\\-61\\-102.5391\\-294.3472\\-61\\-103.0273\\-294.0078\\-61\\-106.4453\\-292.0928\\-61\\-109.7621\\-290.1016\\-61\\-110.3516\\-289.6342\\-61\\-112.3047\\-288.7131\\-61\\-116.0049\\-286.1953\\-61\\-118.5918\\-284.2422\\-61\\-121.3359\\-282.2891\\-61\\-123.7382\\-280.3359\\-61\\-127.9297\\-276.7623\\-61\\-129.8828\\-274.9794\\-61\\-133.7891\\-271.0131\\-61\\-134.3056\\-270.5703\\-61\\-136.1103\\-268.6172\\-61\\-139.2182\\-264.7109\\-61\\-140.9354\\-262.7578\\-61\\-142.483\\-260.8047\\-61\\-143.9244\\-258.8516\\-61\\-145.156\\-256.8984\\-61\\-145.5078\\-256.4997\\-61\\-148.1223\\-252.9922\\-61\\-149.1084\\-251.0391\\-61\\-151.5416\\-247.1328\\-61\\-152.5894\\-245.1797\\-61\\-153.8775\\-243.2266\\-61\\-154.6849\\-241.2734\\-61\\-155.8079\\-239.3203\\-61\\-156.4392\\-237.3672\\-61\\-157.4504\\-235.4141\\-61\\-158.193\\-233.4609\\-61\\-159.9792\\-229.5547\\-61\\-160.6384\\-227.6016\\-61\\-161.5408\\-225.6484\\-61\\-162.0495\\-223.6953\\-61\\-162.4084\\-221.7422\\-61\\-163.6927\\-217.8359\\-61\\-164.3975\\-213.9297\\-61\\-165.5557\\-210.0234\\-61\\-166.459\\-204.1641\\-61\\-167.2054\\-200.2578\\-61\\-167.6018\\-196.3516\\-61\\-167.7332\\-194.3984\\-61\\-167.8932\\-190.4922\\-61\\-167.9919\\-186.5859\\-61\\-167.9862\\-182.6797\\-61\\-167.8671\\-174.8672\\-61\\-167.6647\\-170.9609\\-61\\-167.3242\\-167.0547\\-61\\-167.0444\\-165.1016\\-61\\-166.358\\-161.1953\\-61\\-165.8193\\-157.2891\\-61\\-165.501\\-155.3359\\-61\\-164.3527\\-151.4297\\-61\\-163.6345\\-147.5234\\-61\\-162.8831\\-145.5703\\-61\\-162.3305\\-143.6172\\-61\\-161.9517\\-141.6641\\-61\\-161.3311\\-139.7109\\-61\\-160.4105\\-137.7578\\-61\\-159.7418\\-135.8047\\-61\\-158.6331\\-133.8516\\-61\\-157.8605\\-131.8984\\-61\\-156.7416\\-129.9453\\-61\\-156.0309\\-127.9922\\-61\\-154.9553\\-126.0391\\-61\\-154.0838\\-124.0859\\-61\\-152.8156\\-122.1328\\-61\\-151.7932\\-120.1797\\-61\\-150.4498\\-118.2266\\-61\\-149.4141\\-116.2845\\-61\\-148.2671\\-114.3203\\-61\\-145.7452\\-110.4141\\-61\\-144.3374\\-108.4609\\-61\\-142.6974\\-106.5078\\-61\\-139.6484\\-103.0975\\-61\\-135.125\\-98.69531\\-61\\-131.8359\\-95.918\\-61\\-129.8828\\-94.48917\\-61\\-127.318\\-92.83594\\-61\\-125.9766\\-92.14236\\-61\\-123.894\\-90.88281\\-61\\-120.1172\\-88.87225\\-61\\-116.2109\\-87.20869\\-61\\-112.3047\\-85.34121\\-61\\-110.3516\\-84.57719\\-61\\-108.3984\\-84.08907\\-61\\-106.4453\\-83.4103\\-61\\-104.4922\\-82.55984\\-61\\-102.5391\\-82.15929\\-61\\-100.5859\\-81.89717\\-61\\-96.67969\\-80.667\\-61\\-88.86719\\-79.64537\\-61\\-86.91406\\-79.49201\\-61\\-84.96094\\-79.04199\\-61\\-83.00781\\-78.75716\\-61\\-81.05469\\-78.62666\\-61\\-77.14844\\-78.26587\\-61\\-75.19531\\-78.13774\\-61\\-67.38281\\-78.12283\\-61\\-65.42969\\-78.31771\\-61\\-61.52344\\-78.44966\\-61\\-59.57031\\-78.65747\\-61\\-57.61719\\-78.7336\\-61\\-53.71094\\-79.11188\\-61\\-49.80469\\-79.69495\\-61\\-41.99219\\-80.42675\\-61\\-40.03906\\-80.67017\\-61\\-38.08594\\-81.07616\\-61\\-36.13281\\-81.58052\\-61\\-32.22656\\-82.41276\\-61\\-26.36719\\-84.52213\\-61\\-22.46094\\-86.3195\\-61\\-18.55469\\-88.40442\\-61\\-15.55525\\-90.88281\\-61\\-9.40625\\-96.74219\\-61\\-7.564603\\-98.69531\\-61\\-4.024833\\-102.6016\\-61\\-2.929688\\-103.6889\\-61\\-0.9765625\\-104.6506\\-61\\0.9765625\\-103.7103\\-61\\4.882813\\-99.80157\\-61\\8.789063\\-95.63985\\-61\\12.69531\\-91.90891\\-61\\14.64844\\-89.97858\\-61\\16.60156\\-88.34375\\-61\\18.55469\\-87.17019\\-61\\22.46094\\-84.50764\\-61\\24.41406\\-83.51157\\-61\\26.36719\\-82.3718\\-61\\28.32031\\-81.63754\\-61\\30.27344\\-80.667\\-61\\32.22656\\-80.06403\\-61\\36.13281\\-78.70708\\-61\\38.08594\\-78.21727\\-61\\43.94531\\-76.911\\-61\\45.89844\\-76.57583\\-61\\47.85156\\-76.37294\\-61\\53.71094\\-76.04777\\-61\\57.61719\\-75.91524\\-61\\61.52344\\-75.92764\\-61\\69.33594\\-76.18645\\-61\\77.14844\\-76.67057\\-61\\79.10156\\-76.95284\\-61\\81.05469\\-77.43031\\-61\\83.00781\\-77.74866\\-61\\86.91406\\-78.15018\\-61\\90.82031\\-79.09748\\-61\\94.72656\\-79.79041\\-61\\98.63281\\-80.75365\\-61\\100.5859\\-81.46904\\-61\\104.4922\\-82.40877\\-61\\106.4453\\-83.24982\\-61\\110.3516\\-84.62363\\-61\\112.3047\\-85.72534\\-61\\114.2578\\-86.49786\\-61\\116.2109\\-87.48577\\-61\\118.1641\\-88.20218\\-61\\120.1172\\-89.43134\\-61\\122.0703\\-90.37721\\-61\\124.0234\\-91.87151\\-61\\127.9297\\-94.28296\\-61\\135.5202\\-100.6484\\-61\\137.6953\\-102.7536\\-61\\139.6484\\-104.7781\\-61\\141.6016\\-106.9961\\-61\\143.5547\\-109.3815\\-61\\145.5078\\-112.0787\\-61\\145.792\\-112.3672\\-61\\148.3704\\-116.2734\\-61\\150.4578\\-120.1797\\-61\\151.7033\\-122.1328\\-61\\152.6402\\-124.0859\\-61\\153.8399\\-126.0391\\-61\\154.5741\\-127.9922\\-61\\155.6343\\-129.9453\\-61\\156.8071\\-133.8516\\-61\\157.7807\\-135.8047\\-61\\158.3065\\-137.7578\\-61\\159.8252\\-141.6641\\-61\\160.8329\\-145.5703\\-61\\161.5111\\-147.5234\\-61\\161.8937\\-149.4766\\-61\\162.6174\\-155.3359\\-61\\163.4513\\-159.2422\\-61\\163.75\\-161.1953\\-61\\164.7454\\-174.8672\\-61\\165.1611\\-178.7734\\-61\\165.343\\-182.6797\\-61\\165.4358\\-186.5859\\-61\\165.455\\-192.4453\\-61\\165.3959\\-198.3047\\-61\\165.2865\\-204.1641\\-61\\165.0618\\-208.0703\\-61\\164.7571\\-211.9766\\-61\\163.9075\\-221.7422\\-61\\163.6684\\-223.6953\\-61\\163.2276\\-225.6484\\-61\\162.6306\\-227.6016\\-61\\161.9724\\-231.5078\\-61\\161.4538\\-233.4609\\-61\\160.6018\\-235.4141\\-61\\159.9917\\-237.3672\\-61\\158.1877\\-241.2734\\-61\\157.362\\-243.2266\\-61\\156.3404\\-245.1797\\-61\\155.5598\\-247.1328\\-61\\153.3203\\-250.9435\\-61\\152.0569\\-252.9922\\-61\\150.6174\\-254.9453\\-61\\148.1612\\-258.8516\\-61\\146.5414\\-260.8047\\-61\\142.9976\\-264.7109\\-61\\141.3687\\-266.6641\\-61\\139.6484\\-268.4112\\-61\\137.3465\\-270.5703\\-61\\135.4731\\-272.5234\\-61\\133.7891\\-274.096\\-61\\129.8828\\-277.3389\\-61\\128.7273\\-278.3828\\-61\\125.9766\\-280.6402\\-61\\124.0234\\-281.9117\\-61\\120.8577\\-284.2422\\-61\\118.0176\\-286.1953\\-61\\114.2578\\-288.7036\\-61\\112.3047\\-289.513\\-61\\110.3516\\-290.7966\\-61\\108.3984\\-291.7136\\-61\\106.4453\\-292.891\\-61\\102.5391\\-294.7341\\-61\\100.5859\\-295.2513\\-61\\98.63281\\-296.0763\\-61\\96.67969\\-296.7433\\-61\\94.72656\\-297.1872\\-61\\90.82031\\-298.4967\\-61\\84.96094\\-299.4881\\-61\\83.00781\\-299.9048\\-61\\81.05469\\-300.197\\-61\\79.10156\\-300.3853\\-61\\75.19531\\-300.497\\-61\\69.33594\\-300.4227\\-61\\67.38281\\-300.325\\-61\\65.42969\\-300.0804\\-61\\57.61719\\-298.4697\\-61\\55.66406\\-297.6699\\-61\\51.75781\\-296.4619\\-61\\49.80469\\-295.4133\\-61\\47.85156\\-294.7557\\-61\\45.89844\\-293.6348\\-61\\43.94531\\-292.6188\\-61\\41.99219\\-291.1872\\-61\\40.03906\\-289.875\\-61\\38.08594\\-288.7705\\-61\\34.45242\\-286.1953\\-61\\30.27344\\-283.0869\\-61\\28.32031\\-281.56\\-61\\26.6183\\-280.3359\\-61\\24.33559\\-278.3828\\-61\\22.46094\\-276.9737\\-61\\20.50781\\-275.7175\\-61\\18.55469\\-275.04\\-61\\16.60156\\-274.4854\\-61\\10.74219\\-274.2526\\-61\\8.789063\\-274.2526\\-61\\4.882813\\-274.3733\\-61\\0.9765625\\-274.5952\\-61\\-4.882813\\-274.8417\\-61\\-8.789063\\-275.0403\\-61\\-12.69531\\-275.0938\\-61\\-16.60156\\-275.3705\\-61\\-18.55469\\-275.7028\\-61\\-20.50781\\-276.7576\\-61\\-22.46094\\-277.9383\\-61\\-26.36719\\-280.9892\\-61\\-28.32031\\-282.2975\\-61\\-30.27344\\-283.4749\\-61\\-34.17969\\-286.5766\\-61\\-36.13281\\-287.748\\-61\\-40.03906\\-290.4733\\-61\\-41.99219\\-291.6315\\-61\\-43.94531\\-293.0146\\-61\\-45.89844\\-294.224\\-61\\-49.80469\\-295.8586\\-61\\-51.75781\\-296.7766\\-61\\-53.71094\\-297.183\\-61\\-55.66406\\-297.0258\\-61\\-57.61719\\-298.763\\-61\\-63.47656\\-300.2077\\-61\\-67.38281\\-300.6024\\-61\\-71.28906\\-300.7656\\-61\\-73.24219\\-300.7879\\-61\\-77.14844\\-300.7161\\-61\\-81.05469\\-300.4818\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "304" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "96" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-300.0789\\-59\\-86.91406\\-299.1852\\-59\\-90.82031\\-298.3877\\-59\\-92.77344\\-297.584\\-59\\-96.67969\\-296.4987\\-59\\-98.63281\\-295.5307\\-59\\-100.5859\\-294.9252\\-59\\-102.5391\\-294.107\\-59\\-104.4922\\-293.0092\\-59\\-106.4453\\-291.7516\\-59\\-108.3984\\-290.7471\\-59\\-110.3516\\-289.4396\\-59\\-112.3047\\-288.5146\\-59\\-114.2578\\-287.2013\\-59\\-118.2838\\-284.2422\\-59\\-120.1172\\-283.0276\\-59\\-123.4551\\-280.3359\\-59\\-125.9766\\-278.107\\-59\\-127.9297\\-276.5758\\-59\\-129.8828\\-274.8125\\-59\\-135.9724\\-268.6172\\-59\\-137.4688\\-266.6641\\-59\\-139.082\\-264.7109\\-59\\-140.8266\\-262.7578\\-59\\-142.397\\-260.8047\\-59\\-143.7988\\-258.8516\\-59\\-145.0263\\-256.8984\\-59\\-146.5869\\-254.9453\\-59\\-148.038\\-252.9922\\-59\\-149.0107\\-251.0391\\-59\\-150.252\\-249.0859\\-59\\-152.4728\\-245.1797\\-59\\-153.7463\\-243.2266\\-59\\-154.5671\\-241.2734\\-59\\-155.6821\\-239.3203\\-59\\-156.3393\\-237.3672\\-59\\-158.0571\\-233.4609\\-59\\-158.8477\\-231.5078\\-59\\-159.8435\\-229.5547\\-59\\-160.4572\\-227.6016\\-59\\-161.315\\-225.6484\\-59\\-161.908\\-223.6953\\-59\\-162.7441\\-219.7891\\-59\\-163.5164\\-217.8359\\-59\\-163.9223\\-215.8828\\-59\\-164.227\\-213.9297\\-59\\-164.6575\\-211.9766\\-59\\-165.2982\\-210.0234\\-59\\-165.6988\\-208.0703\\-59\\-166.5381\\-202.2109\\-59\\-167.1805\\-198.3047\\-59\\-167.4143\\-196.3516\\-59\\-167.6914\\-192.4453\\-59\\-167.8545\\-186.5859\\-59\\-167.8532\\-180.7266\\-59\\-167.7587\\-174.8672\\-59\\-167.5408\\-170.9609\\-59\\-167.1408\\-167.0547\\-59\\-166.4949\\-163.1484\\-59\\-165.7092\\-157.2891\\-59\\-165.3209\\-155.3359\\-59\\-164.6655\\-153.3828\\-59\\-164.227\\-151.4297\\-59\\-163.4753\\-147.5234\\-59\\-162.6802\\-145.5703\\-59\\-161.8312\\-141.6641\\-59\\-160.2435\\-137.7578\\-59\\-159.5262\\-135.8047\\-59\\-158.4152\\-133.8516\\-59\\-157.6585\\-131.8984\\-59\\-156.5369\\-129.9453\\-59\\-155.8961\\-127.9922\\-59\\-154.7513\\-126.0391\\-59\\-153.9208\\-124.0859\\-59\\-152.6228\\-122.1328\\-59\\-151.5957\\-120.1797\\-59\\-150.3667\\-118.2266\\-59\\-149.4141\\-116.4211\\-59\\-148.1966\\-114.3203\\-59\\-145.5744\\-110.4141\\-59\\-143.5547\\-107.59\\-59\\-141.0251\\-104.5547\\-59\\-139.6484\\-102.9937\\-59\\-135.309\\-98.69531\\-59\\-131.8359\\-95.66866\\-59\\-129.8828\\-94.17699\\-59\\-127.7917\\-92.83594\\-59\\-125.9766\\-91.82386\\-59\\-124.0234\\-90.58841\\-59\\-122.0703\\-89.67162\\-59\\-120.1172\\-88.4131\\-59\\-118.1641\\-87.77204\\-59\\-116.2109\\-86.80379\\-59\\-114.2578\\-85.95443\\-59\\-112.3047\\-85.00072\\-59\\-108.3984\\-83.82493\\-59\\-106.4453\\-82.91823\\-59\\-104.4922\\-82.17686\\-59\\-100.5859\\-81.60893\\-59\\-98.63281\\-80.90957\\-59\\-96.67969\\-80.45988\\-59\\-90.82031\\-79.52657\\-59\\-86.91406\\-79.06932\\-59\\-83.00781\\-78.37671\\-59\\-81.05469\\-78.30587\\-59\\-77.14844\\-77.96167\\-59\\-75.19531\\-77.8556\\-59\\-67.38281\\-77.7889\\-59\\-61.52344\\-77.90647\\-59\\-59.57031\\-78.10778\\-59\\-57.61719\\-78.16657\\-59\\-55.66406\\-78.45877\\-59\\-53.71094\\-78.61047\\-59\\-47.85156\\-79.48959\\-59\\-43.94531\\-79.91952\\-59\\-38.08594\\-80.51083\\-59\\-36.13281\\-80.88068\\-59\\-34.17969\\-81.50344\\-59\\-30.27344\\-82.44347\\-59\\-24.41406\\-84.67918\\-59\\-22.46094\\-85.81846\\-59\\-20.50781\\-86.61946\\-59\\-18.55469\\-87.84997\\-59\\-16.60156\\-89.23683\\-59\\-12.69531\\-92.79491\\-59\\-10.74219\\-94.48795\\-59\\-8.393787\\-96.74219\\-59\\-6.835938\\-98.46402\\-59\\-2.929688\\-102.628\\-59\\-0.9765625\\-103.6313\\-59\\0.9765625\\-102.812\\-59\\3.288595\\-100.6484\\-59\\5.229856\\-98.69531\\-59\\8.789063\\-94.79819\\-59\\10.74219\\-92.9987\\-59\\15.04836\\-88.92969\\-59\\18.55469\\-86.42154\\-59\\22.46094\\-83.89304\\-59\\24.41406\\-82.7374\\-59\\26.36719\\-81.91315\\-59\\28.32031\\-80.95181\\-59\\32.22656\\-79.63478\\-59\\34.17969\\-78.78017\\-59\\36.13281\\-78.22389\\-59\\41.99219\\-76.84052\\-59\\45.89844\\-76.2599\\-59\\47.85156\\-76.12096\\-59\\53.71094\\-75.8112\\-59\\55.66406\\-75.60709\\-59\\61.52344\\-75.62751\\-59\\63.47656\\-75.77822\\-59\\67.38281\\-75.89443\\-59\\71.28906\\-76.09058\\-59\\79.10156\\-76.5368\\-59\\83.00781\\-77.37609\\-59\\84.96094\\-77.69614\\-59\\86.91406\\-77.88794\\-59\\88.86719\\-78.27367\\-59\\96.67969\\-79.92287\\-59\\100.5859\\-80.98331\\-59\\102.5391\\-81.72754\\-59\\104.4922\\-82.15925\\-59\\106.4453\\-82.77037\\-59\\108.3984\\-83.66608\\-59\\110.3516\\-84.32674\\-59\\112.3047\\-85.44774\\-59\\114.2578\\-86.23279\\-59\\116.2109\\-87.17188\\-59\\118.1641\\-87.99093\\-59\\122.0703\\-90.10786\\-59\\124.0234\\-91.5405\\-59\\127.9297\\-94.06984\\-59\\129.8828\\-95.52676\\-59\\135.7422\\-100.5574\\-59\\137.6953\\-102.4144\\-59\\139.7638\\-104.5547\\-59\\141.6016\\-106.7403\\-59\\143.5547\\-109.2115\\-59\\145.5078\\-111.9751\\-59\\145.8775\\-112.3672\\-59\\148.3647\\-116.2734\\-59\\150.4333\\-120.1797\\-59\\151.6377\\-122.1328\\-59\\152.5558\\-124.0859\\-59\\153.7332\\-126.0391\\-59\\154.4717\\-127.9922\\-59\\155.4195\\-129.9453\\-59\\156.1355\\-131.8984\\-59\\156.6291\\-133.8516\\-59\\157.5936\\-135.8047\\-59\\158.7722\\-139.7109\\-59\\159.6467\\-141.6641\\-59\\160.6041\\-145.5703\\-59\\161.2312\\-147.5234\\-59\\161.7323\\-149.4766\\-59\\162.0211\\-151.4297\\-59\\162.4493\\-155.3359\\-59\\162.7557\\-157.2891\\-59\\163.5649\\-161.1953\\-59\\163.9135\\-165.1016\\-59\\165.0467\\-182.6797\\-59\\165.2135\\-188.5391\\-59\\165.1338\\-196.3516\\-59\\165.0154\\-202.2109\\-59\\164.736\\-208.0703\\-59\\164.0929\\-217.8359\\-59\\163.75\\-221.7422\\-59\\163.4294\\-223.6953\\-59\\162.8583\\-225.6484\\-59\\162.4288\\-227.6016\\-59\\161.8103\\-231.5078\\-59\\160.3795\\-235.4141\\-59\\159.7872\\-237.3672\\-59\\158.7352\\-239.3203\\-59\\157.9964\\-241.2734\\-59\\156.9528\\-243.2266\\-59\\156.1707\\-245.1797\\-59\\154.1877\\-249.0859\\-59\\152.8841\\-251.0391\\-59\\151.7979\\-252.9922\\-59\\149.0734\\-256.8984\\-59\\147.8696\\-258.8516\\-59\\146.2751\\-260.8047\\-59\\141.0156\\-266.6641\\-59\\133.7891\\-273.7705\\-59\\131.8359\\-275.4664\\-59\\127.9297\\-278.7128\\-59\\125.8343\\-280.3359\\-59\\120.1172\\-284.4292\\-59\\118.1641\\-285.6749\\-59\\116.2109\\-287.0991\\-59\\114.2578\\-288.368\\-59\\112.3047\\-289.2847\\-59\\110.3516\\-290.5063\\-59\\108.3984\\-291.3711\\-59\\106.4453\\-292.6185\\-59\\104.4922\\-293.4352\\-59\\102.5391\\-294.4863\\-59\\98.63281\\-295.6378\\-59\\96.67969\\-296.511\\-59\\92.77344\\-297.4351\\-59\\90.82031\\-298.1378\\-59\\88.86719\\-298.6086\\-59\\84.96094\\-299.1814\\-59\\81.05469\\-299.8595\\-59\\79.10156\\-300.1164\\-59\\77.14844\\-300.2515\\-59\\73.24219\\-300.3342\\-59\\69.33594\\-300.2515\\-59\\67.38281\\-300.1046\\-59\\59.57031\\-298.7461\\-59\\57.61719\\-298.2606\\-59\\55.66406\\-297.4166\\-59\\53.71094\\-296.9004\\-59\\51.75781\\-296.2865\\-59\\49.80469\\-295.2824\\-59\\47.85156\\-294.6734\\-59\\45.89844\\-293.5131\\-59\\43.94531\\-292.5492\\-59\\41.99219\\-291.1577\\-59\\40.03906\\-289.8906\\-59\\38.08594\\-288.819\\-59\\36.13281\\-287.4536\\-59\\34.18936\\-286.1953\\-59\\32.22656\\-284.7956\\-59\\30.27344\\-283.3025\\-59\\28.32031\\-281.9484\\-59\\26.36719\\-280.7012\\-59\\24.41406\\-279.0937\\-59\\22.46094\\-277.5898\\-59\\18.55469\\-276.0242\\-59\\16.60156\\-275.5661\\-59\\14.64844\\-275.6913\\-59\\8.789063\\-275.7202\\-59\\4.882813\\-275.809\\-59\\2.929688\\-275.9716\\-59\\-0.9765625\\-276.165\\-59\\-2.929688\\-276.3435\\-59\\-10.74219\\-276.6826\\-59\\-16.60156\\-276.7439\\-59\\-18.55469\\-276.9714\\-59\\-20.50781\\-277.5275\\-59\\-24.41406\\-280.0005\\-59\\-28.32031\\-282.7207\\-59\\-30.27344\\-283.7748\\-59\\-34.17969\\-286.7686\\-59\\-36.13281\\-287.9043\\-59\\-40.03906\\-290.4314\\-59\\-41.99219\\-291.5293\\-59\\-43.94531\\-292.9147\\-59\\-45.89844\\-294.0634\\-59\\-47.85156\\-294.9844\\-59\\-49.80469\\-295.6643\\-59\\-51.75781\\-296.6675\\-59\\-53.71094\\-297.0925\\-59\\-55.66406\\-297.1888\\-59\\-57.61719\\-298.6426\\-59\\-61.52344\\-299.5138\\-59\\-63.47656\\-300.0288\\-59\\-67.38281\\-300.4818\\-59\\-71.28906\\-300.6606\\-59\\-73.24219\\-300.6893\\-59\\-77.14844\\-300.6024\\-59\\-81.05469\\-300.3614\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "300" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "97" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-299.8748\\-57\\-84.96094\\-299.4123\\-57\\-88.86719\\-298.6742\\-57\\-90.82031\\-298.1846\\-57\\-92.77344\\-297.3776\\-57\\-96.67969\\-296.2979\\-57\\-98.63281\\-295.3506\\-57\\-100.5859\\-294.7927\\-57\\-104.4922\\-292.8257\\-57\\-106.4453\\-291.4855\\-57\\-108.3984\\-290.5443\\-57\\-110.3516\\-289.2636\\-57\\-112.3047\\-288.2358\\-57\\-114.2578\\-287.0248\\-57\\-118.1641\\-284.0484\\-57\\-120.1172\\-282.8593\\-57\\-122.0703\\-281.3189\\-57\\-124.0234\\-279.6478\\-57\\-125.9766\\-277.867\\-57\\-127.8153\\-276.4297\\-57\\-129.8828\\-274.6039\\-57\\-133.9143\\-270.5703\\-57\\-135.7847\\-268.6172\\-57\\-137.3062\\-266.6641\\-57\\-138.958\\-264.7109\\-57\\-140.7245\\-262.7578\\-57\\-142.3208\\-260.8047\\-57\\-144.9245\\-256.8984\\-57\\-146.4844\\-254.9453\\-57\\-147.9394\\-252.9922\\-57\\-148.912\\-251.0391\\-57\\-150.1601\\-249.0859\\-57\\-151.3672\\-246.8631\\-57\\-153.5924\\-243.2266\\-57\\-154.4577\\-241.2734\\-57\\-155.5176\\-239.3203\\-57\\-156.9322\\-235.4141\\-57\\-157.927\\-233.4609\\-57\\-158.6242\\-231.5078\\-57\\-159.6767\\-229.5547\\-57\\-160.2843\\-227.6016\\-57\\-161.7651\\-223.6953\\-57\\-162.5398\\-219.7891\\-57\\-163.2413\\-217.8359\\-57\\-163.7723\\-215.8828\\-57\\-164.4202\\-211.9766\\-57\\-165.501\\-208.0703\\-57\\-165.7992\\-206.1172\\-57\\-166.5381\\-200.2578\\-57\\-167.1805\\-196.3516\\-57\\-167.5254\\-192.4453\\-57\\-167.6607\\-188.5391\\-57\\-167.7376\\-180.7266\\-57\\-167.6179\\-174.8672\\-57\\-167.3815\\-170.9609\\-57\\-167.2054\\-169.0078\\-57\\-166.3246\\-163.1484\\-57\\-165.5473\\-157.2891\\-57\\-164.4684\\-153.3828\\-57\\-163.7684\\-149.4766\\-57\\-163.2276\\-147.5234\\-57\\-162.5103\\-145.5703\\-57\\-161.6602\\-141.6641\\-57\\-160.7516\\-139.7109\\-57\\-160.0709\\-137.7578\\-57\\-159.2024\\-135.8047\\-57\\-158.219\\-133.8516\\-57\\-157.3763\\-131.8984\\-57\\-156.3735\\-129.9453\\-57\\-155.7129\\-127.9922\\-57\\-154.5522\\-126.0391\\-57\\-153.7148\\-124.0859\\-57\\-152.4478\\-122.1328\\-57\\-148.1142\\-114.3203\\-57\\-145.3617\\-110.4141\\-57\\-143.5547\\-107.6994\\-57\\-141.0369\\-104.5547\\-57\\-139.6484\\-102.9348\\-57\\-137.6953\\-100.9148\\-57\\-133.3766\\-96.74219\\-57\\-129.8828\\-93.92941\\-57\\-127.9297\\-92.61214\\-57\\-124.0234\\-90.29429\\-57\\-122.0703\\-89.33015\\-57\\-120.1172\\-88.20703\\-57\\-118.1641\\-87.55704\\-57\\-116.2109\\-86.48828\\-57\\-112.3047\\-84.73383\\-57\\-108.3984\\-83.5825\\-57\\-106.4453\\-82.46184\\-57\\-104.4922\\-81.98888\\-57\\-102.5391\\-81.77474\\-57\\-100.5068\\-81.11719\\-57\\-98.63281\\-80.63569\\-57\\-94.72656\\-79.78934\\-57\\-92.77344\\-79.54137\\-57\\-88.86719\\-78.89353\\-57\\-86.91406\\-78.71472\\-57\\-83.00781\\-78.02897\\-57\\-79.10156\\-77.90498\\-57\\-75.19531\\-77.52938\\-57\\-73.24219\\-77.46412\\-57\\-65.42969\\-77.42548\\-57\\-63.47656\\-77.50534\\-57\\-57.61719\\-77.6241\\-57\\-55.66406\\-78.0036\\-57\\-53.71094\\-78.18132\\-57\\-47.85156\\-78.94027\\-57\\-43.94531\\-79.51591\\-57\\-38.08594\\-80.17702\\-57\\-34.17969\\-80.82866\\-57\\-32.22656\\-81.45264\\-57\\-28.32031\\-82.48839\\-57\\-24.41406\\-84.10908\\-57\\-20.50781\\-86.09055\\-57\\-16.60156\\-88.44514\\-57\\-14.64844\\-90.18224\\-57\\-12.69531\\-92.06425\\-57\\-8.789063\\-95.64173\\-57\\-2.929688\\-101.75\\-57\\-0.9765625\\-102.6605\\-57\\0.9765625\\-101.9092\\-57\\2.929688\\-100.1532\\-57\\4.387556\\-98.69531\\-57\\8.071437\\-94.78906\\-57\\12.12351\\-90.88281\\-57\\12.69531\\-90.24374\\-57\\14.64844\\-88.49818\\-57\\18.55469\\-85.84183\\-57\\20.50781\\-84.40199\\-57\\24.41406\\-82.21745\\-57\\26.36719\\-81.41708\\-57\\28.32031\\-80.4894\\-57\\30.27344\\-79.83082\\-57\\32.22656\\-79.04199\\-57\\34.17969\\-78.35652\\-57\\36.13281\\-77.79425\\-57\\40.03906\\-76.77767\\-57\\43.94531\\-76.2095\\-57\\49.80469\\-75.74946\\-57\\51.75781\\-75.4375\\-57\\53.71094\\-75.36102\\-57\\55.66406\\-75.05091\\-57\\61.52344\\-75.03809\\-57\\63.47656\\-75.31384\\-57\\65.42969\\-75.40508\\-57\\67.38281\\-75.66864\\-57\\75.19531\\-76.12784\\-57\\79.10156\\-76.26452\\-57\\81.05469\\-76.52419\\-57\\84.96094\\-77.36173\\-57\\88.86719\\-77.94035\\-57\\92.77344\\-78.76714\\-57\\96.67969\\-79.64883\\-57\\100.5859\\-80.64925\\-57\\102.5391\\-81.41824\\-57\\106.4453\\-82.46696\\-57\\108.3984\\-83.36813\\-57\\110.3516\\-84.11462\\-57\\114.2578\\-86\\-57\\116.2109\\-86.80511\\-57\\118.1641\\-87.80536\\-57\\120.1172\\-88.6474\\-57\\123.5968\\-90.88281\\-57\\127.9297\\-93.85182\\-57\\129.3694\\-94.78906\\-57\\131.8078\\-96.74219\\-57\\137.6953\\-102.1492\\-57\\140.0404\\-104.5547\\-57\\141.6605\\-106.5078\\-57\\143.0058\\-108.4609\\-57\\143.5547\\-109.0876\\-57\\145.5078\\-111.9305\\-57\\145.8861\\-112.3672\\-57\\148.3471\\-116.2734\\-57\\149.2959\\-118.2266\\-57\\151.5026\\-122.1328\\-57\\152.436\\-124.0859\\-57\\153.5413\\-126.0391\\-57\\155.1132\\-129.9453\\-57\\156.0012\\-131.8984\\-57\\156.4636\\-133.8516\\-57\\157.2932\\-135.8047\\-57\\158.0089\\-137.7578\\-57\\158.554\\-139.7109\\-57\\159.405\\-141.6641\\-57\\160.0018\\-143.6172\\-57\\160.4004\\-145.5703\\-57\\160.9026\\-147.5234\\-57\\161.5248\\-149.4766\\-57\\161.8697\\-151.4297\\-57\\162.5216\\-157.2891\\-57\\162.8454\\-159.2422\\-57\\163.2813\\-161.1953\\-57\\163.7756\\-165.1016\\-57\\164.1443\\-170.9609\\-57\\164.4623\\-176.8203\\-57\\164.8494\\-186.5859\\-57\\164.8072\\-196.3516\\-57\\164.6979\\-202.2109\\-57\\164.492\\-208.0703\\-57\\164.191\\-213.9297\\-57\\163.9398\\-217.8359\\-57\\163.5264\\-221.7422\\-57\\162.5846\\-225.6484\\-57\\162.0135\\-229.5547\\-57\\161.5851\\-231.5078\\-57\\160.8028\\-233.4609\\-57\\159.5225\\-237.3672\\-57\\158.4569\\-239.3203\\-57\\157.779\\-241.2734\\-57\\156.6564\\-243.2266\\-57\\155.9773\\-245.1797\\-57\\154.8569\\-247.1328\\-57\\153.9651\\-249.0859\\-57\\152.6042\\-251.0391\\-57\\151.4486\\-252.9922\\-57\\149.4141\\-256.0969\\-57\\147.485\\-258.8516\\-57\\145.957\\-260.8047\\-57\\142.5442\\-264.7109\\-57\\140.7271\\-266.6641\\-57\\136.7834\\-270.5703\\-57\\133.7891\\-273.4617\\-57\\131.8359\\-275.18\\-57\\124.0234\\-281.3384\\-57\\122.0703\\-282.8012\\-57\\120.1172\\-283.9167\\-57\\118.1641\\-285.3123\\-57\\116.2109\\-286.8104\\-57\\112.3047\\-289.057\\-57\\108.3984\\-291.0995\\-57\\106.4453\\-292.2316\\-57\\102.5391\\-294.107\\-57\\100.5859\\-294.8646\\-57\\98.63281\\-295.3377\\-57\\96.67969\\-296.1324\\-57\\94.72656\\-296.7455\\-57\\90.82031\\-297.6162\\-57\\88.86719\\-298.281\\-57\\86.91406\\-298.653\\-57\\81.05469\\-299.4531\\-57\\77.14844\\-299.9338\\-57\\73.24219\\-300.0926\\-57\\69.33594\\-299.9893\\-57\\67.38281\\-299.7717\\-57\\59.57031\\-298.5669\\-57\\57.61719\\-297.9516\\-57\\55.66406\\-297.2165\\-57\\53.71094\\-296.7802\\-57\\51.75781\\-296.0462\\-57\\49.80469\\-295.1784\\-57\\47.85156\\-294.5722\\-57\\45.89844\\-293.412\\-57\\43.94531\\-292.4751\\-57\\43.41634\\-292.0547\\-57\\40.03906\\-289.9063\\-57\\38.08594\\-288.8824\\-57\\36.13281\\-287.569\\-57\\34.17969\\-286.4516\\-57\\30.27344\\-283.551\\-57\\28.32031\\-282.4828\\-57\\26.36719\\-281.1158\\-57\\24.41406\\-279.651\\-57\\22.46094\\-278.6157\\-57\\20.50781\\-277.7641\\-57\\18.55469\\-277.3447\\-57\\16.60156\\-277.1345\\-57\\10.74219\\-277.2157\\-57\\4.882813\\-277.3417\\-57\\-0.9765625\\-277.5809\\-57\\-2.929688\\-277.8038\\-57\\-6.835938\\-277.9976\\-57\\-12.69531\\-278.1341\\-57\\-16.60156\\-278.1206\\-57\\-18.55469\\-278.2291\\-57\\-20.50781\\-278.6861\\-57\\-22.46094\\-279.4499\\-57\\-24.41406\\-280.7222\\-57\\-26.36719\\-281.761\\-57\\-27.10978\\-282.2891\\-57\\-30.27344\\-284.2008\\-57\\-32.22656\\-285.4676\\-57\\-34.17969\\-286.9414\\-57\\-36.16688\\-288.1484\\-57\\-38.08594\\-289.2064\\-57\\-40.03906\\-290.4526\\-57\\-41.99219\\-291.4652\\-57\\-43.94531\\-292.8304\\-57\\-46.05914\\-294.0078\\-57\\-47.85156\\-294.8928\\-57\\-49.80469\\-295.4893\\-57\\-51.75781\\-296.5408\\-57\\-55.66406\\-297.5274\\-57\\-57.61719\\-298.5044\\-57\\-65.42969\\-300.1396\\-57\\-69.33594\\-300.4739\\-57\\-73.24219\\-300.583\\-57\\-77.14844\\-300.4974\\-57\\-81.05469\\-300.216\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "313" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "98" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-300.0158\\-55\\-84.96094\\-299.2216\\-55\\-88.86719\\-298.5422\\-55\\-92.77344\\-297.1983\\-55\\-94.72656\\-296.7433\\-55\\-98.63281\\-295.2007\\-55\\-100.5859\\-294.6321\\-55\\-102.5391\\-293.5195\\-55\\-104.4922\\-292.6188\\-55\\-106.4453\\-291.2636\\-55\\-108.3984\\-290.2772\\-55\\-114.2578\\-286.8283\\-55\\-117.6717\\-284.2422\\-55\\-118.1641\\-283.8105\\-55\\-120.1172\\-282.6526\\-55\\-122.0703\\-281.1497\\-55\\-125.9766\\-277.6732\\-55\\-127.5573\\-276.4297\\-55\\-129.8828\\-274.369\\-55\\-135.7422\\-268.45\\-55\\-137.1582\\-266.6641\\-55\\-138.8296\\-264.7109\\-55\\-140.6188\\-262.7578\\-55\\-142.237\\-260.8047\\-55\\-143.4498\\-258.8516\\-55\\-144.813\\-256.8984\\-55\\-146.3831\\-254.9453\\-55\\-147.8092\\-252.9922\\-55\\-148.8054\\-251.0391\\-55\\-150.0672\\-249.0859\\-55\\-150.9975\\-247.1328\\-55\\-151.3672\\-246.6536\\-55\\-153.3884\\-243.2266\\-55\\-155.2816\\-239.3203\\-55\\-156.1302\\-237.3672\\-55\\-156.735\\-235.4141\\-55\\-157.7917\\-233.4609\\-55\\-158.4446\\-231.5078\\-55\\-159.4727\\-229.5547\\-55\\-160.7963\\-225.6484\\-55\\-161.5982\\-223.6953\\-55\\-162.062\\-221.7422\\-55\\-162.3962\\-219.7891\\-55\\-162.8847\\-217.8359\\-55\\-163.5773\\-215.8828\\-55\\-164.2358\\-211.9766\\-55\\-164.6269\\-210.0234\\-55\\-165.2007\\-208.0703\\-55\\-165.6228\\-206.1172\\-55\\-166.3102\\-200.2578\\-55\\-167.1152\\-194.3984\\-55\\-167.3002\\-192.4453\\-55\\-167.4956\\-188.5391\\-55\\-167.5781\\-180.7266\\-55\\-167.4338\\-174.8672\\-55\\-167.1678\\-170.9609\\-55\\-166.3847\\-165.1016\\-55\\-165.6778\\-159.2422\\-55\\-165.3209\\-157.2891\\-55\\-164.7247\\-155.3359\\-55\\-164.3094\\-153.3828\\-55\\-163.6047\\-149.4766\\-55\\-162.8981\\-147.5234\\-55\\-162.3551\\-145.5703\\-55\\-161.9828\\-143.6172\\-55\\-161.4349\\-141.6641\\-55\\-160.5119\\-139.7109\\-55\\-159.8764\\-137.7578\\-55\\-158.8227\\-135.8047\\-55\\-158.0368\\-133.8516\\-55\\-156.9937\\-131.8984\\-55\\-155.4503\\-127.9922\\-55\\-154.3649\\-126.0391\\-55\\-153.4172\\-124.0859\\-55\\-151.125\\-120.1797\\-55\\-150.1687\\-118.2266\\-55\\-148.8845\\-116.2734\\-55\\-148.0141\\-114.3203\\-55\\-145.1991\\-110.4141\\-55\\-143.9909\\-108.4609\\-55\\-142.5849\\-106.5078\\-55\\-139.6484\\-102.9348\\-55\\-137.6953\\-100.8372\\-55\\-133.5867\\-96.74219\\-55\\-129.8828\\-93.76296\\-55\\-128.6286\\-92.83594\\-55\\-125.5047\\-90.88281\\-55\\-121.9779\\-88.92969\\-55\\-118.1641\\-87.19447\\-55\\-116.2109\\-86.15944\\-55\\-113.7022\\-85.02344\\-55\\-112.3047\\-84.51685\\-55\\-108.3984\\-83.31631\\-55\\-106.4453\\-82.17929\\-55\\-102.5391\\-81.47697\\-55\\-100.5859\\-80.79906\\-55\\-94.72656\\-79.58576\\-55\\-92.77344\\-79.28413\\-55\\-90.82031\\-78.88223\\-55\\-84.96094\\-78.13391\\-55\\-83.00781\\-77.80453\\-55\\-79.10156\\-77.62177\\-55\\-75.19531\\-77.11476\\-55\\-73.24219\\-77.03403\\-55\\-69.33594\\-77.03403\\-55\\-65.42969\\-76.98399\\-55\\-59.57031\\-77.3559\\-55\\-57.61719\\-77.43686\\-55\\-55.66406\\-77.69922\\-55\\-47.85156\\-78.48706\\-55\\-43.94531\\-78.96321\\-55\\-40.03906\\-79.60796\\-55\\-36.13281\\-80.10423\\-55\\-32.22656\\-80.78924\\-55\\-30.27344\\-81.48886\\-55\\-26.36719\\-82.61365\\-55\\-24.41406\\-83.5889\\-55\\-22.46094\\-84.39117\\-55\\-20.50781\\-85.55805\\-55\\-18.55469\\-86.55291\\-55\\-16.60156\\-87.95982\\-55\\-14.64844\\-89.59287\\-55\\-10.74219\\-93.17734\\-55\\-8.836013\\-94.78906\\-55\\-6.835938\\-96.82433\\-55\\-5.110116\\-98.69531\\-55\\-2.929688\\-100.8022\\-55\\-0.9765625\\-101.8352\\-55\\0.9765625\\-101.2773\\-55\\2.929688\\-99.56872\\-55\\5.69894\\-96.74219\\-55\\6.835938\\-95.46875\\-55\\9.4846\\-92.83594\\-55\\11.55379\\-90.88281\\-55\\12.69531\\-89.64964\\-55\\16.60156\\-86.45529\\-55\\22.46094\\-82.63864\\-55\\24.41406\\-81.81474\\-55\\26.36719\\-80.77466\\-55\\30.27344\\-79.34375\\-55\\32.22656\\-78.55602\\-55\\38.08594\\-76.83794\\-55\\40.03906\\-76.41546\\-55\\41.99219\\-76.19055\\-55\\47.85156\\-75.63605\\-55\\49.80469\\-75.13153\\-55\\51.75781\\-74.79603\\-55\\55.66406\\-74.69054\\-55\\61.52344\\-74.67468\\-55\\65.42969\\-74.88397\\-55\\69.33594\\-75.36019\\-55\\71.28906\\-75.68506\\-55\\77.14844\\-76.04978\\-55\\79.10156\\-76.10933\\-55\\81.05469\\-76.27605\\-55\\84.96094\\-76.92897\\-55\\94.72656\\-78.8601\\-55\\96.67969\\-79.32682\\-55\\98.63281\\-79.98093\\-55\\100.5859\\-80.41964\\-55\\102.5391\\-80.99905\\-55\\104.4922\\-81.7487\\-55\\106.4453\\-82.26151\\-55\\108.3984\\-82.97035\\-55\\110.3516\\-83.91629\\-55\\112.3047\\-84.70907\\-55\\114.2578\\-85.78693\\-55\\116.2109\\-86.56087\\-55\\118.1641\\-87.643\\-55\\120.1172\\-88.36468\\-55\\120.8852\\-88.92969\\-55\\123.9149\\-90.88281\\-55\\127.9297\\-93.64528\\-55\\129.806\\-94.78906\\-55\\131.8359\\-96.29829\\-55\\133.7891\\-98.32832\\-55\\134.25\\-98.69531\\-55\\137.6953\\-101.897\\-55\\140.3334\\-104.5547\\-55\\141.9144\\-106.5078\\-55\\143.0956\\-108.4609\\-55\\143.5547\\-108.9959\\-55\\145.5078\\-111.9451\\-55\\145.8586\\-112.3672\\-55\\147.0034\\-114.3203\\-55\\148.2989\\-116.2734\\-55\\149.1255\\-118.2266\\-55\\150.2991\\-120.1797\\-55\\152.2847\\-124.0859\\-55\\154.1263\\-127.9922\\-55\\154.851\\-129.9453\\-55\\155.8211\\-131.8984\\-55\\156.3029\\-133.8516\\-55\\156.92\\-135.8047\\-55\\157.8068\\-137.7578\\-55\\158.3686\\-139.7109\\-55\\159.7872\\-143.6172\\-55\\160.6325\\-147.5234\\-55\\161.2297\\-149.4766\\-55\\161.69\\-151.4297\\-55\\161.9673\\-153.3828\\-55\\162.5846\\-159.2422\\-55\\163.2957\\-163.1484\\-55\\163.5866\\-165.1016\\-55\\164.0024\\-170.9609\\-55\\164.2883\\-176.8203\\-55\\164.603\\-186.5859\\-55\\164.5784\\-196.3516\\-55\\164.521\\-200.2578\\-55\\164.2932\\-208.0703\\-55\\164.0425\\-213.9297\\-55\\163.7684\\-217.8359\\-55\\163.5362\\-219.7891\\-55\\163.1851\\-221.7422\\-55\\162.7215\\-223.6953\\-55\\162.3919\\-225.6484\\-55\\161.8469\\-229.5547\\-55\\161.287\\-231.5078\\-55\\160.535\\-233.4609\\-55\\159.962\\-235.4141\\-55\\158.2391\\-239.3203\\-55\\157.4971\\-241.2734\\-55\\156.4392\\-243.2266\\-55\\155.7685\\-245.1797\\-55\\154.6036\\-247.1328\\-55\\153.6933\\-249.0859\\-55\\151.3672\\-252.5553\\-55\\151.0036\\-252.9922\\-55\\149.9389\\-254.9453\\-55\\147.4609\\-258.3455\\-55\\145.5307\\-260.8047\\-55\\142.2502\\-264.7109\\-55\\139.6484\\-267.4648\\-55\\133.7891\\-273.133\\-55\\131.8359\\-274.7971\\-55\\129.8828\\-276.2724\\-55\\127.3468\\-278.3828\\-55\\124.0234\\-281.0288\\-55\\122.0703\\-282.4251\\-55\\120.1172\\-283.5473\\-55\\116.2109\\-286.4212\\-55\\114.2578\\-287.5333\\-55\\112.3047\\-288.793\\-55\\110.3516\\-289.6133\\-55\\108.3984\\-290.8083\\-55\\106.4453\\-291.6942\\-55\\104.4922\\-292.837\\-55\\102.5391\\-293.6292\\-55\\100.5859\\-294.615\\-55\\96.67969\\-295.6378\\-55\\94.72656\\-296.4713\\-55\\90.82031\\-297.2572\\-55\\86.91406\\-298.3326\\-55\\84.96094\\-298.6593\\-55\\81.05469\\-299.1401\\-55\\77.14844\\-299.5115\\-55\\73.24219\\-299.7175\\-55\\69.33594\\-299.6265\\-55\\65.42969\\-299.2402\\-55\\61.52344\\-298.7063\\-55\\59.57031\\-298.3579\\-55\\57.61719\\-297.6089\\-55\\55.66406\\-297.0702\\-55\\53.71094\\-296.6519\\-55\\51.75781\\-295.7855\\-55\\47.85156\\-294.4396\\-55\\45.89844\\-293.3195\\-55\\43.94531\\-292.4176\\-55\\43.48624\\-292.0547\\-55\\40.03906\\-289.9362\\-55\\38.08594\\-288.9685\\-55\\36.13281\\-287.7121\\-55\\34.17969\\-286.6963\\-55\\30.27344\\-283.9047\\-55\\28.32031\\-282.8855\\-55\\26.36719\\-281.5341\\-55\\24.20775\\-280.3359\\-55\\22.46094\\-279.4865\\-55\\20.50781\\-279.0503\\-55\\18.55469\\-278.8211\\-55\\14.64844\\-278.618\\-55\\10.74219\\-278.6785\\-55\\8.789063\\-278.8281\\-55\\-0.9765625\\-279.2016\\-55\\-2.929688\\-279.3015\\-55\\-6.835938\\-279.3947\\-55\\-12.69531\\-279.4718\\-55\\-16.60156\\-279.4296\\-55\\-18.55469\\-279.4858\\-55\\-20.50781\\-279.7219\\-55\\-22.46094\\-280.4254\\-55\\-24.41406\\-281.2663\\-55\\-28.32031\\-283.3328\\-55\\-30.27344\\-284.6496\\-55\\-32.22656\\-285.7514\\-55\\-32.80892\\-286.1953\\-55\\-36.13281\\-288.3513\\-55\\-38.08594\\-289.2636\\-55\\-40.03906\\-290.4834\\-55\\-41.99219\\-291.437\\-55\\-43.94531\\-292.7716\\-55\\-47.85156\\-294.8001\\-55\\-49.80469\\-295.3634\\-55\\-51.75781\\-296.3898\\-55\\-55.66406\\-297.5274\\-55\\-57.61719\\-298.3421\\-55\\-59.57031\\-298.7905\\-55\\-63.47656\\-299.501\\-55\\-65.42969\\-299.9194\\-55\\-67.38281\\-300.1841\\-55\\-69.33594\\-300.3342\\-55\\-73.24219\\-300.4589\\-55\\-77.14844\\-300.3703\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "308" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "99" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-300.0288\\-53\\-86.91406\\-298.7434\\-53\\-88.86719\\-298.3579\\-53\\-90.82031\\-297.5818\\-53\\-94.72656\\-296.5983\\-53\\-96.67969\\-295.7168\\-53\\-100.5859\\-294.4158\\-53\\-102.5391\\-293.2898\\-53\\-104.4922\\-292.3599\\-53\\-104.871\\-292.0547\\-53\\-108.3984\\-289.9093\\-53\\-110.3516\\-288.9435\\-53\\-112.3047\\-287.6869\\-53\\-114.2578\\-286.6102\\-53\\-118.1641\\-283.6107\\-53\\-120.1172\\-282.4072\\-53\\-122.0703\\-280.9892\\-53\\-125.9766\\-277.479\\-53\\-127.3281\\-276.4297\\-53\\-129.8828\\-274.1588\\-53\\-131.4557\\-272.5234\\-53\\-135.7422\\-268.2888\\-53\\-137.0157\\-266.6641\\-53\\-138.6953\\-264.7109\\-53\\-140.5242\\-262.7578\\-53\\-142.1411\\-260.8047\\-53\\-143.3182\\-258.8516\\-53\\-144.7083\\-256.8984\\-53\\-146.295\\-254.9453\\-53\\-147.6405\\-252.9922\\-53\\-148.7044\\-251.0391\\-53\\-149.9675\\-249.0859\\-53\\-150.8494\\-247.1328\\-53\\-152.1322\\-245.1797\\-53\\-154.2222\\-241.2734\\-53\\-155.0458\\-239.3203\\-53\\-156.0136\\-237.3672\\-53\\-156.5859\\-235.4141\\-53\\-157.616\\-233.4609\\-53\\-158.2952\\-231.5078\\-53\\-159.9824\\-227.6016\\-53\\-160.5539\\-225.6484\\-53\\-161.3946\\-223.6953\\-53\\-161.9367\\-221.7422\\-53\\-162.6143\\-217.8359\\-53\\-163.3085\\-215.8828\\-53\\-163.7827\\-213.9297\\-53\\-164.4012\\-210.0234\\-53\\-164.8213\\-208.0703\\-53\\-165.3856\\-206.1172\\-53\\-165.6883\\-204.1641\\-53\\-166.3208\\-198.3047\\-53\\-166.7913\\-194.3984\\-53\\-167.1678\\-190.4922\\-53\\-167.3456\\-186.5859\\-53\\-167.4017\\-180.7266\\-53\\-167.3023\\-176.8203\\-53\\-167.073\\-172.9141\\-53\\-165.9756\\-163.1484\\-53\\-165.4921\\-159.2422\\-53\\-164.4972\\-155.3359\\-53\\-163.8425\\-151.4297\\-53\\-163.3954\\-149.4766\\-53\\-162.6451\\-147.5234\\-53\\-161.8391\\-143.6172\\-53\\-160.2902\\-139.7109\\-53\\-159.6559\\-137.7578\\-53\\-158.5383\\-135.8047\\-53\\-157.8306\\-133.8516\\-53\\-156.7053\\-131.8984\\-53\\-156.078\\-129.9453\\-53\\-154.1756\\-126.0391\\-53\\-153.0546\\-124.0859\\-53\\-152.0769\\-122.1328\\-53\\-150.8896\\-120.1797\\-53\\-150\\-118.2266\\-53\\-148.6962\\-116.2734\\-53\\-147.8354\\-114.3203\\-53\\-147.4609\\-113.8675\\-53\\-145.0296\\-110.4141\\-53\\-143.8664\\-108.4609\\-53\\-142.525\\-106.5078\\-53\\-139.6484\\-102.9844\\-53\\-135.6658\\-98.69531\\-53\\-133.7069\\-96.74219\\-53\\-128.843\\-92.83594\\-53\\-125.8517\\-90.88281\\-53\\-122.0703\\-88.70313\\-53\\-120.1172\\-87.93481\\-53\\-116.2109\\-85.86555\\-53\\-114.2578\\-84.9287\\-53\\-112.3047\\-84.29851\\-53\\-110.3516\\-83.76604\\-53\\-106.4453\\-82.03912\\-53\\-104.4922\\-81.69363\\-53\\-100.5859\\-80.65642\\-53\\-92.77344\\-78.98968\\-53\\-88.86719\\-78.34634\\-53\\-84.96094\\-77.96983\\-53\\-81.05469\\-77.31169\\-53\\-79.10156\\-77.25031\\-53\\-75.19531\\-76.76075\\-53\\-67.38281\\-76.62628\\-53\\-63.47656\\-76.73603\\-53\\-59.57031\\-77.05903\\-53\\-57.61719\\-77.15875\\-53\\-53.71094\\-77.62663\\-53\\-47.85156\\-78.12279\\-53\\-41.99219\\-78.78703\\-53\\-38.08594\\-79.46286\\-53\\-32.22656\\-80.40981\\-53\\-30.27344\\-80.86929\\-53\\-28.32031\\-81.68007\\-53\\-26.36719\\-82.19456\\-53\\-24.19562\\-83.07031\\-53\\-20.50781\\-84.84124\\-53\\-18.55469\\-86.06467\\-53\\-14.64844\\-88.83708\\-53\\-7.990761\\-94.78906\\-53\\-4.173224\\-98.69531\\-53\\-2.929688\\-99.91257\\-53\\-0.9765625\\-101.2242\\-53\\0.9765625\\-100.574\\-53\\2.929688\\-98.8261\\-53\\8.745466\\-92.83594\\-53\\12.69531\\-89.00611\\-53\\15.19775\\-86.97656\\-53\\18.55469\\-84.50125\\-53\\22.46094\\-82.17838\\-53\\24.41406\\-81.35556\\-53\\26.36719\\-80.35484\\-53\\28.32031\\-79.64883\\-53\\30.27344\\-78.79543\\-53\\32.22656\\-78.12608\\-53\\36.13281\\-76.93694\\-53\\38.08594\\-76.46416\\-53\\40.03906\\-76.13925\\-53\\43.94531\\-75.76935\\-53\\45.89844\\-75.36102\\-53\\49.80469\\-74.67046\\-53\\51.75781\\-74.54211\\-53\\55.66406\\-74.49609\\-53\\61.52344\\-74.50114\\-53\\65.42969\\-74.63636\\-53\\69.33594\\-74.89641\\-53\\71.43555\\-75.25781\\-53\\75.19531\\-75.77822\\-53\\81.05469\\-76.14082\\-53\\83.00781\\-76.33438\\-53\\86.91406\\-76.95284\\-53\\88.86719\\-77.45335\\-53\\94.72656\\-78.58997\\-53\\96.67969\\-79.04199\\-53\\98.63281\\-79.76552\\-53\\102.5391\\-80.68392\\-53\\104.4922\\-81.48611\\-53\\108.3984\\-82.6558\\-53\\110.3516\\-83.72335\\-53\\112.3047\\-84.41919\\-53\\114.2578\\-85.56954\\-53\\116.2109\\-86.38452\\-53\\118.1641\\-87.44728\\-53\\120.1172\\-88.19401\\-53\\122.0703\\-89.53922\\-53\\124.0234\\-90.70313\\-53\\125.9766\\-92.17938\\-53\\127.9297\\-93.51202\\-53\\129.8828\\-94.63943\\-53\\131.8359\\-96.04646\\-53\\133.7891\\-98.12615\\-53\\134.5196\\-98.69531\\-53\\137.6953\\-101.6887\\-53\\140.5472\\-104.5547\\-53\\142.1875\\-106.5078\\-53\\143.1478\\-108.4609\\-53\\144.3971\\-110.4141\\-53\\145.7591\\-112.3672\\-53\\146.9001\\-114.3203\\-53\\148.2117\\-116.2734\\-53\\148.9966\\-118.2266\\-53\\150.1743\\-120.1797\\-53\\150.9724\\-122.1328\\-53\\152.0956\\-124.0859\\-53\\152.9257\\-126.0391\\-53\\153.9533\\-127.9922\\-53\\154.6245\\-129.9453\\-53\\155.5722\\-131.8984\\-53\\156.6368\\-135.8047\\-53\\157.5671\\-137.7578\\-53\\158.7227\\-141.6641\\-53\\159.518\\-143.6172\\-53\\160.0056\\-145.5703\\-53\\160.3854\\-147.5234\\-53\\161.4423\\-151.4297\\-53\\162.0502\\-155.3359\\-53\\162.5977\\-161.1953\\-53\\163.2957\\-165.1016\\-53\\163.5554\\-167.0547\\-53\\163.8641\\-170.9609\\-53\\164.1226\\-176.8203\\-53\\164.3935\\-186.5859\\-53\\164.3936\\-196.3516\\-53\\164.3392\\-200.2578\\-53\\164.1388\\-208.0703\\-53\\163.8972\\-213.9297\\-53\\163.5554\\-217.8359\\-53\\163.2413\\-219.7891\\-53\\162.8079\\-221.7422\\-53\\162.4962\\-223.6953\\-53\\162.0147\\-227.6016\\-53\\161.6308\\-229.5547\\-53\\160.9291\\-231.5078\\-53\\159.7191\\-235.4141\\-53\\158.7132\\-237.3672\\-53\\158.0455\\-239.3203\\-53\\157.0938\\-241.2734\\-53\\155.4778\\-245.1797\\-53\\153.3436\\-249.0859\\-53\\152.1312\\-251.0391\\-53\\150.6848\\-252.9922\\-53\\149.6353\\-254.9453\\-53\\148.2693\\-256.8984\\-53\\146.7364\\-258.8516\\-53\\145.0376\\-260.8047\\-53\\141.8438\\-264.7109\\-53\\140.0378\\-266.6641\\-53\\137.6953\\-268.9632\\-53\\133.7891\\-272.7056\\-53\\131.6793\\-274.4766\\-53\\127.9297\\-277.5155\\-53\\126.9233\\-278.3828\\-53\\124.3887\\-280.3359\\-53\\124.0234\\-280.6957\\-53\\120.1172\\-283.2656\\-53\\118.1641\\-284.677\\-53\\116.2109\\-285.8745\\-53\\114.2578\\-287.231\\-53\\112.3047\\-288.4348\\-53\\110.3516\\-289.294\\-53\\108.3984\\-290.4733\\-53\\106.4453\\-291.314\\-53\\104.4922\\-292.4823\\-53\\102.5391\\-293.2668\\-53\\100.5859\\-294.243\\-53\\98.63281\\-294.8765\\-53\\96.67969\\-295.3078\\-53\\92.77344\\-296.6411\\-53\\88.86719\\-297.34\\-53\\84.96094\\-298.3514\\-53\\83.00781\\-298.653\\-53\\79.10156\\-299.0353\\-53\\75.19531\\-299.31\\-53\\71.28906\\-299.3641\\-53\\67.38281\\-299.2033\\-53\\63.47656\\-298.8023\\-53\\61.52344\\-298.535\\-53\\59.57031\\-298.0627\\-53\\57.61719\\-297.3776\\-53\\53.71094\\-296.4987\\-53\\51.75781\\-295.5773\\-53\\49.80469\\-294.9964\\-53\\47.85156\\-294.3173\\-53\\45.89844\\-293.2345\\-53\\43.94531\\-292.3578\\-53\\41.99219\\-291.1091\\-53\\40.03906\\-290.0128\\-53\\38.08594\\-289.0636\\-53\\36.13281\\-287.9191\\-53\\34.17969\\-286.9158\\-53\\32.22656\\-285.5675\\-53\\30.27344\\-284.4375\\-53\\28.32031\\-283.1993\\-53\\26.36719\\-282.1019\\-53\\24.41406\\-281.1871\\-53\\22.46094\\-280.6072\\-53\\20.50781\\-280.1903\\-53\\16.60156\\-279.8255\\-53\\10.74219\\-279.7789\\-53\\6.835938\\-280.2903\\-53\\-0.9765625\\-280.7408\\-53\\-4.882813\\-280.8511\\-53\\-14.64844\\-280.9307\\-53\\-18.55469\\-280.9262\\-53\\-20.50781\\-281.0174\\-53\\-22.46094\\-281.3329\\-53\\-24.41406\\-281.8759\\-53\\-26.36719\\-282.9069\\-53\\-28.32031\\-283.73\\-53\\-29.0314\\-284.2422\\-53\\-34.17969\\-287.2744\\-53\\-36.13281\\-288.5235\\-53\\-38.08594\\-289.3343\\-53\\-40.03906\\-290.5322\\-53\\-41.99219\\-291.4488\\-53\\-43.94531\\-292.7229\\-53\\-45.89844\\-293.6374\\-53\\-47.85156\\-294.7107\\-53\\-49.80469\\-295.2697\\-53\\-51.75781\\-296.2141\\-53\\-53.71094\\-296.8636\\-53\\-55.66406\\-297.3449\\-53\\-57.61719\\-298.1378\\-53\\-59.57031\\-298.6554\\-53\\-63.47656\\-299.2951\\-53\\-67.38281\\-299.9893\\-53\\-69.33594\\-300.1732\\-53\\-73.24219\\-300.31\\-53\\-77.14844\\-300.2055\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "301" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "100" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-299.9893\\-51\\-81.05469\\-299.493\\-51\\-86.91406\\-298.5874\\-51\\-88.86719\\-298.0884\\-51\\-90.82031\\-297.3535\\-51\\-94.72656\\-296.4102\\-51\\-96.67969\\-295.493\\-51\\-98.63281\\-294.937\\-51\\-100.5859\\-294.1336\\-51\\-106.4453\\-290.8987\\-51\\-108.3984\\-289.6408\\-51\\-110.3516\\-288.7753\\-51\\-112.3047\\-287.458\\-51\\-114.2578\\-286.345\\-51\\-118.1641\\-283.442\\-51\\-122.0703\\-280.8101\\-51\\-125.9766\\-277.301\\-51\\-127.0873\\-276.4297\\-51\\-129.8828\\-273.9485\\-51\\-131.257\\-272.5234\\-51\\-135.7422\\-268.1087\\-51\\-136.8556\\-266.6641\\-51\\-139.6484\\-263.5046\\-51\\-140.4102\\-262.7578\\-51\\-142.0332\\-260.8047\\-51\\-143.1858\\-258.8516\\-51\\-144.604\\-256.8984\\-51\\-146.1848\\-254.9453\\-51\\-147.4838\\-252.9922\\-51\\-149.8473\\-249.0859\\-51\\-150.7182\\-247.1328\\-51\\-152.0201\\-245.1797\\-51\\-152.9696\\-243.2266\\-51\\-154.0889\\-241.2734\\-51\\-154.8733\\-239.3203\\-51\\-155.8878\\-237.3672\\-51\\-156.4465\\-235.4141\\-51\\-157.3882\\-233.4609\\-51\\-158.8631\\-229.5547\\-51\\-159.8147\\-227.6016\\-51\\-160.3461\\-225.6484\\-51\\-161.7571\\-221.7422\\-51\\-162.4246\\-217.8359\\-51\\-162.941\\-215.8828\\-51\\-163.5866\\-213.9297\\-51\\-163.9326\\-211.9766\\-51\\-164.5178\\-208.0703\\-51\\-165.4644\\-204.1641\\-51\\-165.7395\\-202.2109\\-51\\-166.6602\\-192.4453\\-51\\-167.0869\\-186.5859\\-51\\-167.155\\-182.6797\\-51\\-167.1152\\-178.7734\\-51\\-166.7636\\-172.9141\\-51\\-166.0256\\-165.1016\\-51\\-165.5915\\-161.1953\\-51\\-165.2135\\-159.2422\\-51\\-164.7025\\-157.2891\\-51\\-164.3066\\-155.3359\\-51\\-163.6684\\-151.4297\\-51\\-162.4286\\-147.5234\\-51\\-161.6532\\-143.6172\\-51\\-160.7759\\-141.6641\\-51\\-159.3294\\-137.7578\\-51\\-158.3029\\-135.8047\\-51\\-157.5648\\-133.8516\\-51\\-156.491\\-131.8984\\-51\\-155.8789\\-129.9453\\-51\\-154.7818\\-127.9922\\-51\\-153.9526\\-126.0391\\-51\\-152.7835\\-124.0859\\-51\\-151.8405\\-122.1328\\-51\\-150.6397\\-120.1797\\-51\\-149.7566\\-118.2266\\-51\\-148.5635\\-116.2734\\-51\\-147.5667\\-114.3203\\-51\\-144.8759\\-110.4141\\-51\\-142.4264\\-106.5078\\-51\\-139.6484\\-103.086\\-51\\-137.6953\\-100.8571\\-51\\-135.6994\\-98.69531\\-51\\-133.7891\\-96.73456\\-51\\-127.9297\\-92.05605\\-51\\-125.9766\\-90.79954\\-51\\-124.0234\\-89.7381\\-51\\-122.0703\\-88.52886\\-51\\-120.1172\\-87.83181\\-51\\-118.1641\\-86.71088\\-51\\-114.2578\\-84.69791\\-51\\-112.3047\\-84.0059\\-51\\-110.3516\\-83.57543\\-51\\-108.3984\\-82.61303\\-51\\-106.4453\\-81.98746\\-51\\-104.4922\\-81.54716\\-51\\-102.5391\\-80.95045\\-51\\-98.63281\\-80.08637\\-51\\-96.67969\\-79.55015\\-51\\-94.72656\\-79.22199\\-51\\-90.82031\\-78.42303\\-51\\-88.86719\\-78.10815\\-51\\-84.96094\\-77.79077\\-51\\-81.05469\\-76.99774\\-51\\-77.14844\\-76.64806\\-51\\-73.24219\\-76.44922\\-51\\-69.33594\\-76.41827\\-51\\-63.47656\\-76.48639\\-51\\-55.66406\\-76.93294\\-51\\-51.75781\\-77.48298\\-51\\-43.94531\\-78.19892\\-51\\-40.03906\\-78.61743\\-51\\-38.08594\\-78.92834\\-51\\-36.13281\\-79.3548\\-51\\-30.27344\\-80.4894\\-51\\-26.36719\\-81.83641\\-51\\-24.41406\\-82.41263\\-51\\-22.46094\\-83.44001\\-51\\-20.50781\\-84.32771\\-51\\-16.60156\\-86.80109\\-51\\-14.64844\\-88.23415\\-51\\-12.69531\\-89.90625\\-51\\-10.74219\\-91.79637\\-51\\-9.432164\\-92.83594\\-51\\-7.340771\\-94.78906\\-51\\-2.929688\\-99.20722\\-51\\-0.9765625\\-100.3555\\-51\\0.9765625\\-99.98135\\-51\\2.929688\\-98.1669\\-51\\6.283309\\-94.78906\\-51\\8.130787\\-92.83594\\-51\\10.74219\\-90.25699\\-51\\12.69531\\-88.42638\\-51\\14.64844\\-86.81759\\-51\\17.04102\\-85.02344\\-51\\20.50781\\-82.7226\\-51\\22.46094\\-81.87386\\-51\\24.41406\\-80.75098\\-51\\26.36719\\-80.01297\\-51\\28.32031\\-79.1265\\-51\\30.27344\\-78.35026\\-51\\34.17969\\-77.05196\\-51\\36.13281\\-76.53634\\-51\\38.08594\\-76.18462\\-51\\41.99219\\-75.75947\\-51\\45.89844\\-74.82631\\-51\\47.85156\\-74.61823\\-51\\51.75781\\-74.39321\\-51\\61.52344\\-74.36723\\-51\\67.38281\\-74.57355\\-51\\71.28906\\-74.84465\\-51\\73.24219\\-75.07064\\-51\\77.14844\\-75.73949\\-51\\83.00781\\-76.1597\\-51\\86.91406\\-76.67193\\-51\\90.82031\\-77.60024\\-51\\94.72656\\-78.30733\\-51\\96.67969\\-78.78703\\-51\\98.63281\\-79.50155\\-51\\102.5391\\-80.48085\\-51\\104.4358\\-81.11719\\-51\\106.4453\\-81.89471\\-51\\108.3984\\-82.4388\\-51\\110.3516\\-83.46767\\-51\\112.3047\\-84.1533\\-51\\114.2578\\-85.30556\\-51\\117.8869\\-86.97656\\-51\\120.1172\\-88.06654\\-51\\122.0703\\-89.36295\\-51\\124.0234\\-90.50776\\-51\\124.4247\\-90.88281\\-51\\127.2593\\-92.83594\\-51\\127.9297\\-93.40095\\-51\\129.8828\\-94.55069\\-51\\131.8359\\-95.92953\\-51\\133.7891\\-97.89222\\-51\\134.7281\\-98.69531\\-51\\137.6953\\-101.5663\\-51\\140.564\\-104.5547\\-51\\142.1296\\-106.5078\\-51\\143.1101\\-108.4609\\-51\\146.7786\\-114.3203\\-51\\148.0807\\-116.2734\\-51\\148.8551\\-118.2266\\-51\\150.0116\\-120.1797\\-51\\150.7349\\-122.1328\\-51\\151.8876\\-124.0859\\-51\\152.6712\\-126.0391\\-51\\153.7579\\-127.9922\\-51\\154.4204\\-129.9453\\-51\\155.9854\\-133.8516\\-51\\156.4324\\-135.8047\\-51\\157.9333\\-139.7109\\-51\\158.4256\\-141.6641\\-51\\159.7734\\-145.5703\\-51\\160.5636\\-149.4766\\-51\\161.592\\-153.3828\\-51\\161.8891\\-155.3359\\-51\\162.6075\\-163.1484\\-51\\163.2548\\-167.0547\\-51\\163.5063\\-169.0078\\-51\\163.8035\\-172.9141\\-51\\164.0376\\-178.7734\\-51\\164.2218\\-186.5859\\-51\\164.2131\\-196.3516\\-51\\164.1435\\-202.2109\\-51\\163.9193\\-210.0234\\-51\\163.7351\\-213.9297\\-51\\163.2681\\-217.8359\\-51\\162.5434\\-221.7422\\-51\\161.8502\\-227.6016\\-51\\161.3554\\-229.5547\\-51\\160.6172\\-231.5078\\-51\\160.0847\\-233.4609\\-51\\159.4154\\-235.4141\\-51\\158.4323\\-237.3672\\-51\\157.8203\\-239.3203\\-51\\156.7619\\-241.2734\\-51\\156.0903\\-243.2266\\-51\\155.0842\\-245.1797\\-51\\154.1929\\-247.1328\\-51\\152.9421\\-249.0859\\-51\\151.8619\\-251.0391\\-51\\150.4257\\-252.9922\\-51\\149.4141\\-254.7339\\-51\\147.9942\\-256.8984\\-51\\144.6717\\-260.8047\\-51\\143.5547\\-262.2171\\-51\\139.6484\\-266.5591\\-51\\137.6953\\-268.4789\\-51\\133.394\\-272.5234\\-51\\131.8359\\-273.9408\\-51\\128.8578\\-276.4297\\-51\\125.9766\\-278.7589\\-51\\123.8591\\-280.3359\\-51\\120.1172\\-283.0077\\-51\\118.1641\\-284.1689\\-51\\116.2109\\-285.4598\\-51\\114.2578\\-286.8963\\-51\\112.3047\\-287.9043\\-51\\110.3516\\-289.0255\\-51\\108.3984\\-289.9247\\-51\\106.4453\\-290.9898\\-51\\104.4922\\-291.9141\\-51\\102.5391\\-292.939\\-51\\100.5859\\-293.7047\\-51\\98.63281\\-294.5849\\-51\\94.72656\\-295.4994\\-51\\92.77344\\-296.2748\\-51\\90.82031\\-296.7254\\-51\\86.91406\\-297.3569\\-51\\83.00781\\-298.323\\-51\\81.05469\\-298.5982\\-51\\75.19531\\-299.0178\\-51\\71.28906\\-299.0995\\-51\\67.38281\\-298.9817\\-51\\63.47656\\-298.6145\\-51\\61.52344\\-298.301\\-51\\59.57031\\-297.6822\\-51\\57.61719\\-297.1844\\-51\\55.66406\\-296.8108\\-51\\53.71094\\-296.3229\\-51\\51.75781\\-295.4301\\-51\\49.80469\\-294.9197\\-51\\47.85156\\-294.1887\\-51\\45.89844\\-293.1684\\-51\\43.94531\\-292.2971\\-51\\41.99219\\-291.1244\\-51\\36.13281\\-288.2199\\-51\\30.27344\\-284.8374\\-51\\28.32031\\-283.5547\\-51\\24.41406\\-281.903\\-51\\22.46094\\-281.5119\\-51\\20.50781\\-281.2709\\-51\\18.55469\\-281.2064\\-51\\12.69531\\-281.2032\\-51\\10.74219\\-281.0991\\-51\\8.789063\\-281.4326\\-51\\6.835938\\-281.6197\\-51\\-0.9765625\\-281.9579\\-51\\-8.789063\\-282.0406\\-51\\-18.55469\\-282.0136\\-51\\-20.50781\\-282.0637\\-51\\-22.46094\\-282.348\\-51\\-24.41406\\-282.7983\\-51\\-26.36719\\-283.3748\\-51\\-30.27344\\-285.3279\\-51\\-32.22656\\-286.5792\\-51\\-34.17969\\-287.4655\\-51\\-36.13281\\-288.6866\\-51\\-38.08594\\-289.4013\\-51\\-40.03906\\-290.5986\\-51\\-41.99219\\-291.4806\\-51\\-43.94531\\-292.7076\\-51\\-45.89844\\-293.5357\\-51\\-47.85156\\-294.6229\\-51\\-49.80469\\-295.1884\\-51\\-53.71094\\-296.7476\\-51\\-55.66406\\-297.1913\\-51\\-59.57031\\-298.4823\\-51\\-61.52344\\-298.8317\\-51\\-69.33594\\-299.9757\\-51\\-73.24219\\-300.1377\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "315" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "101" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-73.24219\\-299.8899\\-49\\-77.14844\\-299.7044\\-49\\-81.05469\\-299.2904\\-49\\-84.96094\\-298.749\\-49\\-86.91406\\-298.4194\\-49\\-88.86719\\-297.7359\\-49\\-90.82031\\-297.1761\\-49\\-92.77344\\-296.7802\\-49\\-94.72656\\-296.1592\\-49\\-96.67969\\-295.2994\\-49\\-98.63281\\-294.7807\\-49\\-100.5859\\-293.79\\-49\\-102.5391\\-292.9078\\-49\\-104.4922\\-291.6371\\-49\\-106.4453\\-290.7012\\-49\\-108.3984\\-289.4104\\-49\\-110.3516\\-288.5518\\-49\\-110.8817\\-288.1484\\-49\\-113.9695\\-286.1953\\-49\\-116.2109\\-284.7112\\-49\\-120.1172\\-281.8211\\-49\\-122.0703\\-280.5838\\-49\\-124.5226\\-278.3828\\-49\\-126.8569\\-276.4297\\-49\\-129.8828\\-273.6993\\-49\\-135.1031\\-268.6172\\-49\\-136.7309\\-266.6641\\-49\\-139.6484\\-263.3847\\-49\\-140.2927\\-262.7578\\-49\\-141.9049\\-260.8047\\-49\\-143.0129\\-258.8516\\-49\\-146.0544\\-254.9453\\-49\\-147.4609\\-252.8193\\-49\\-149.7274\\-249.0859\\-49\\-150.6109\\-247.1328\\-49\\-151.886\\-245.1797\\-49\\-152.794\\-243.2266\\-49\\-153.9615\\-241.2734\\-49\\-154.7181\\-239.3203\\-49\\-155.7549\\-237.3672\\-49\\-156.3202\\-235.4141\\-49\\-157.0958\\-233.4609\\-49\\-158.0027\\-231.5078\\-49\\-158.6208\\-229.5547\\-49\\-159.6327\\-227.6016\\-49\\-160.7723\\-223.6953\\-49\\-161.5381\\-221.7422\\-49\\-161.9976\\-219.7891\\-49\\-162.2771\\-217.8359\\-49\\-162.6587\\-215.8828\\-49\\-163.3085\\-213.9297\\-49\\-163.765\\-211.9766\\-49\\-164.2932\\-208.0703\\-49\\-164.655\\-206.1172\\-49\\-165.5444\\-202.2109\\-49\\-165.9264\\-198.3047\\-49\\-166.2571\\-194.3984\\-49\\-166.7548\\-186.5859\\-49\\-166.827\\-182.6797\\-49\\-166.7652\\-178.7734\\-49\\-166.4891\\-172.9141\\-49\\-165.8529\\-165.1016\\-49\\-165.6494\\-163.1484\\-49\\-165.343\\-161.1953\\-49\\-164.8452\\-159.2422\\-49\\-164.1396\\-155.3359\\-49\\-163.849\\-153.3828\\-49\\-163.4182\\-151.4297\\-49\\-162.7327\\-149.4766\\-49\\-162.2742\\-147.5234\\-49\\-161.9274\\-145.5703\\-49\\-161.3946\\-143.6172\\-49\\-160.4957\\-141.6641\\-49\\-159.87\\-139.7109\\-49\\-158.8881\\-137.7578\\-49\\-158.0906\\-135.8047\\-49\\-156.3163\\-131.8984\\-49\\-155.6227\\-129.9453\\-49\\-154.541\\-127.9922\\-49\\-153.6933\\-126.0391\\-49\\-152.5677\\-124.0859\\-49\\-151.5666\\-122.1328\\-49\\-150.4477\\-120.1797\\-49\\-148.4187\\-116.2734\\-49\\-146.0539\\-112.3672\\-49\\-143.4471\\-108.4609\\-49\\-142.3222\\-106.5078\\-49\\-139.6484\\-103.195\\-49\\-137.6953\\-100.9215\\-49\\-135.7422\\-98.7592\\-49\\-133.7891\\-96.70463\\-49\\-127.9297\\-91.95137\\-49\\-125.9766\\-90.63867\\-49\\-124.0234\\-89.6263\\-49\\-122.0703\\-88.41024\\-49\\-120.1172\\-87.7443\\-49\\-118.1641\\-86.55054\\-49\\-116.2109\\-85.61819\\-49\\-114.2578\\-84.54977\\-49\\-112.3047\\-83.80991\\-49\\-110.3516\\-83.40533\\-49\\-108.3984\\-82.45465\\-49\\-104.4922\\-81.44525\\-49\\-102.5391\\-80.74826\\-49\\-100.5859\\-80.39538\\-49\\-98.63281\\-79.76447\\-49\\-96.67969\\-79.30476\\-49\\-92.77344\\-78.64601\\-49\\-90.82031\\-78.20558\\-49\\-84.96094\\-77.57632\\-49\\-81.05469\\-76.70483\\-49\\-79.10156\\-76.51141\\-49\\-73.24219\\-76.26528\\-49\\-63.47656\\-76.32907\\-49\\-55.66406\\-76.57904\\-49\\-51.75781\\-77.06233\\-49\\-45.89844\\-77.70241\\-49\\-40.03906\\-78.21691\\-49\\-36.13281\\-78.8601\\-49\\-30.27344\\-80.23418\\-49\\-28.32031\\-80.62212\\-49\\-26.36719\\-81.42757\\-49\\-22.46094\\-82.77958\\-49\\-18.55469\\-84.98275\\-49\\-15.65213\\-86.97656\\-49\\-13.14252\\-88.92969\\-49\\-10.74219\\-91.05371\\-49\\-8.580396\\-92.83594\\-49\\-4.882813\\-96.38638\\-49\\-2.929688\\-98.34654\\-49\\-0.9765625\\-99.75326\\-49\\0.9765625\\-99.51804\\-49\\5.836839\\-94.78906\\-49\\7.686038\\-92.83594\\-49\\8.789063\\-91.79999\\-49\\10.74219\\-89.78667\\-49\\12.69531\\-87.95313\\-49\\14.64844\\-86.26318\\-49\\16.60156\\-84.75895\\-49\\20.50781\\-82.27435\\-49\\22.46094\\-81.38632\\-49\\24.41406\\-80.36051\\-49\\27.13341\\-79.16406\\-49\\30.27344\\-77.96069\\-49\\34.17969\\-76.65384\\-49\\36.13281\\-76.25269\\-49\\40.03906\\-75.74609\\-49\\41.99219\\-75.2146\\-49\\43.94531\\-74.79173\\-49\\45.89844\\-74.56026\\-49\\49.80469\\-74.34839\\-49\\51.75781\\-74.29324\\-49\\57.61719\\-74.2339\\-49\\63.47656\\-74.29309\\-49\\69.33594\\-74.54341\\-49\\73.24219\\-74.79868\\-49\\75.19531\\-74.99792\\-49\\79.10156\\-75.74286\\-49\\83.00781\\-76.04024\\-49\\86.91406\\-76.47852\\-49\\88.86719\\-76.77181\\-49\\92.77344\\-77.77339\\-49\\94.72656\\-78.07297\\-49\\96.67969\\-78.53931\\-49\\100.5859\\-79.77274\\-49\\104.4922\\-80.81614\\-49\\106.4453\\-81.74039\\-49\\108.3984\\-82.28036\\-49\\112.3047\\-83.98546\\-49\\116.2109\\-86.07741\\-49\\118.1641\\-86.92143\\-49\\121.7413\\-88.92969\\-49\\124.0234\\-90.34834\\-49\\124.6665\\-90.88281\\-49\\127.4619\\-92.83594\\-49\\127.9297\\-93.25446\\-49\\129.8828\\-94.44135\\-49\\131.8359\\-95.95164\\-49\\134.8524\\-98.69531\\-49\\137.6953\\-101.5424\\-49\\140.5128\\-104.5547\\-49\\141.9519\\-106.5078\\-49\\143.0486\\-108.4609\\-49\\143.5547\\-109.1684\\-49\\145.3501\\-112.3672\\-49\\147.903\\-116.2734\\-49\\148.6962\\-118.2266\\-49\\149.8256\\-120.1797\\-49\\150.5445\\-122.1328\\-49\\151.6317\\-124.0859\\-49\\152.433\\-126.0391\\-49\\153.4577\\-127.9922\\-49\\154.9064\\-131.8984\\-49\\155.7885\\-133.8516\\-49\\156.765\\-137.7578\\-49\\157.6666\\-139.7109\\-49\\158.6853\\-143.6172\\-49\\159.4746\\-145.5703\\-49\\159.9496\\-147.5234\\-49\\160.7281\\-151.4297\\-49\\161.3004\\-153.3828\\-49\\161.6953\\-155.3359\\-49\\161.9177\\-157.2891\\-49\\162.4042\\-163.1484\\-49\\162.86\\-167.0547\\-49\\163.1705\\-169.0078\\-49\\163.6047\\-172.9141\\-49\\163.8929\\-178.7734\\-49\\164.0724\\-186.5859\\-49\\164.0877\\-192.4453\\-49\\164.0224\\-200.2578\\-49\\163.9091\\-206.1172\\-49\\163.7684\\-210.0234\\-49\\163.5164\\-213.9297\\-49\\162.6009\\-219.7891\\-49\\162.1813\\-223.6953\\-49\\161.6371\\-227.6016\\-49\\160.3636\\-231.5078\\-49\\159.8638\\-233.4609\\-49\\158.9745\\-235.4141\\-49\\157.5235\\-239.3203\\-49\\156.5125\\-241.2734\\-49\\155.8871\\-243.2266\\-49\\154.7786\\-245.1797\\-49\\153.9733\\-247.1328\\-49\\152.6184\\-249.0859\\-49\\151.3672\\-251.1799\\-49\\149.4141\\-254.2598\\-49\\147.6435\\-256.8984\\-49\\146.0341\\-258.8516\\-49\\144.3207\\-260.8047\\-49\\143.5547\\-261.8281\\-49\\139.6484\\-266.0699\\-49\\137.6953\\-268.0398\\-49\\135.0644\\-270.5703\\-49\\133.7891\\-271.6873\\-49\\131.8359\\-273.5698\\-49\\129.8828\\-275.2725\\-49\\127.9297\\-276.8106\\-49\\125.7951\\-278.3828\\-49\\122.0703\\-281.2608\\-49\\120.1172\\-282.6641\\-49\\118.1641\\-283.6967\\-49\\117.4762\\-284.2422\\-49\\114.2578\\-286.4984\\-49\\112.3047\\-287.4869\\-49\\110.3516\\-288.7303\\-49\\108.3984\\-289.4655\\-49\\106.4453\\-290.6571\\-49\\104.4922\\-291.4173\\-49\\102.5391\\-292.5783\\-49\\100.5859\\-293.274\\-49\\98.63281\\-294.1644\\-49\\96.67969\\-294.7903\\-49\\94.72656\\-295.198\\-49\\92.77344\\-295.7298\\-49\\90.82031\\-296.4001\\-49\\88.86719\\-296.791\\-49\\84.96094\\-297.3365\\-49\\81.05469\\-298.2502\\-49\\79.10156\\-298.4978\\-49\\75.19531\\-298.774\\-49\\71.28906\\-298.871\\-49\\67.38281\\-298.7617\\-49\\63.47656\\-298.3877\\-49\\61.52344\\-297.9662\\-49\\59.57031\\-297.3985\\-49\\55.66406\\-296.6737\\-49\\53.71094\\-296.0763\\-49\\51.75781\\-295.3036\\-49\\49.80469\\-294.8355\\-49\\47.85156\\-294.0463\\-49\\43.94531\\-292.257\\-49\\41.99219\\-291.1599\\-49\\40.03906\\-290.2913\\-49\\38.08594\\-289.2532\\-49\\36.13281\\-288.474\\-49\\34.17969\\-287.2756\\-49\\32.22656\\-286.3921\\-49\\30.27344\\-285.1799\\-49\\28.32031\\-284.1061\\-49\\26.36719\\-283.2594\\-49\\24.41406\\-282.8248\\-49\\20.50781\\-282.4101\\-49\\16.60156\\-282.3636\\-49\\10.74219\\-282.6297\\-49\\6.835938\\-282.9245\\-49\\2.929688\\-283.0279\\-49\\0.9765625\\-283.2161\\-49\\-4.882813\\-283.3084\\-49\\-8.789063\\-283.3152\\-49\\-14.64844\\-283.2379\\-49\\-20.50781\\-283.2317\\-49\\-22.46094\\-283.3188\\-49\\-24.41406\\-283.5131\\-49\\-26.36719\\-284.0437\\-49\\-26.69711\\-284.2422\\-49\\-30.27344\\-285.7605\\-49\\-32.22656\\-286.9006\\-49\\-34.17969\\-287.7398\\-49\\-36.13281\\-288.827\\-49\\-38.08594\\-289.4742\\-49\\-40.03906\\-290.675\\-49\\-41.99219\\-291.4924\\-49\\-43.94531\\-292.7039\\-49\\-45.89844\\-293.4757\\-49\\-47.85156\\-294.5317\\-49\\-49.80469\\-295.1057\\-49\\-51.75781\\-295.7855\\-49\\-53.71094\\-296.6331\\-49\\-57.61719\\-297.562\\-49\\-59.57031\\-298.2709\\-49\\-61.52344\\-298.6687\\-49\\-63.47656\\-298.9654\\-49\\-69.33594\\-299.689\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "302" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "102" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-298.1959\\-47\\-88.86719\\-297.4765\\-47\\-92.77344\\-296.6294\\-47\\-94.72656\\-295.8148\\-47\\-96.67969\\-295.137\\-47\\-98.63281\\-294.5849\\-47\\-100.5859\\-293.5226\\-47\\-102.5391\\-292.6964\\-47\\-104.4922\\-291.3711\\-47\\-106.4453\\-290.4489\\-47\\-108.3984\\-289.2089\\-47\\-110.3516\\-288.2675\\-47\\-112.3047\\-287.0563\\-47\\-114.2578\\-285.6563\\-47\\-118.1641\\-283.1198\\-47\\-120.1172\\-281.6105\\-47\\-122.0229\\-280.3359\\-47\\-124.2575\\-278.3828\\-47\\-127.9297\\-275.3555\\-47\\-129.8828\\-273.5393\\-47\\-130.823\\-272.5234\\-47\\-132.8929\\-270.5703\\-47\\-135.7422\\-267.7196\\-47\\-139.6484\\-263.2874\\-47\\-140.178\\-262.7578\\-47\\-141.7512\\-260.8047\\-47\\-142.9102\\-258.8516\\-47\\-145.9227\\-254.9453\\-47\\-148.4254\\-251.0391\\-47\\-149.5909\\-249.0859\\-47\\-150.4946\\-247.1328\\-47\\-151.7193\\-245.1797\\-47\\-152.6355\\-243.2266\\-47\\-153.8269\\-241.2734\\-47\\-154.5715\\-239.3203\\-47\\-155.5822\\-237.3672\\-47\\-156.8129\\-233.4609\\-47\\-157.8348\\-231.5078\\-47\\-158.4273\\-229.5547\\-47\\-159.3541\\-227.6016\\-47\\-159.9969\\-225.6484\\-47\\-160.5269\\-223.6953\\-47\\-161.2859\\-221.7422\\-47\\-161.8304\\-219.7891\\-47\\-162.4493\\-215.8828\\-47\\-162.927\\-213.9297\\-47\\-163.5391\\-211.9766\\-47\\-163.8892\\-210.0234\\-47\\-164.3899\\-206.1172\\-47\\-164.7475\\-204.1641\\-47\\-165.2261\\-202.2109\\-47\\-165.7395\\-198.3047\\-47\\-166.0557\\-194.3984\\-47\\-166.4568\\-186.5859\\-47\\-166.5193\\-182.6797\\-47\\-166.4005\\-176.8203\\-47\\-166.2332\\-172.9141\\-47\\-165.9958\\-169.0078\\-47\\-165.4358\\-163.1484\\-47\\-164.5508\\-159.2422\\-47\\-163.6766\\-153.3828\\-47\\-162.4912\\-149.4766\\-47\\-161.7352\\-145.5703\\-47\\-160.2654\\-141.6641\\-47\\-159.6089\\-139.7109\\-47\\-158.5577\\-137.7578\\-47\\-157.8544\\-135.8047\\-47\\-156.7795\\-133.8516\\-47\\-156.1149\\-131.8984\\-47\\-154.315\\-127.9922\\-47\\-152.3198\\-124.0859\\-47\\-151.1875\\-122.1328\\-47\\-150.2557\\-120.1797\\-47\\-149.069\\-118.2266\\-47\\-148.2685\\-116.2734\\-47\\-146.9289\\-114.3203\\-47\\-145.861\\-112.3672\\-47\\-145.5078\\-111.9144\\-47\\-143.5547\\-108.8423\\-47\\-143.2419\\-108.4609\\-47\\-142.1666\\-106.5078\\-47\\-139.6484\\-103.2905\\-47\\-137.6953\\-101.0116\\-47\\-133.7891\\-96.69\\-47\\-127.9297\\-91.91401\\-47\\-125.9766\\-90.55506\\-47\\-124.0234\\-89.52611\\-47\\-122.0703\\-88.31255\\-47\\-120.1172\\-87.62542\\-47\\-118.1641\\-86.374\\-47\\-115.8114\\-85.02344\\-47\\-114.2578\\-84.2407\\-47\\-110.3516\\-83.23307\\-47\\-108.3984\\-82.31448\\-47\\-106.4453\\-81.89458\\-47\\-102.5391\\-80.57539\\-47\\-100.5859\\-80.30436\\-47\\-98.63281\\-79.56571\\-47\\-96.67969\\-79.14135\\-47\\-92.77344\\-78.53748\\-47\\-90.82031\\-78.07832\\-47\\-86.91406\\-77.59505\\-47\\-83.00781\\-76.90576\\-47\\-81.05469\\-76.49756\\-47\\-75.19531\\-76.16068\\-47\\-63.47656\\-76.20565\\-47\\-55.66406\\-76.35275\\-47\\-53.71094\\-76.47074\\-47\\-47.85156\\-77.04456\\-47\\-43.94531\\-77.56544\\-47\\-40.03906\\-77.91954\\-47\\-34.17969\\-78.79785\\-47\\-30.27344\\-79.89957\\-47\\-28.32031\\-80.30338\\-47\\-26.36719\\-80.85628\\-47\\-24.41406\\-81.7487\\-47\\-22.46094\\-82.3363\\-47\\-18.55469\\-84.37891\\-47\\-16.60156\\-85.80338\\-47\\-14.85352\\-86.97656\\-47\\-12.69531\\-88.60679\\-47\\-7.842319\\-92.83594\\-47\\-4.882813\\-95.72347\\-47\\-2.929688\\-97.70547\\-47\\-0.9765625\\-99.27579\\-47\\0.9765625\\-98.91144\\-47\\2.929688\\-97.15535\\-47\\5.419121\\-94.78906\\-47\\10.74219\\-89.35648\\-47\\13.29304\\-86.97656\\-47\\15.625\\-85.02344\\-47\\18.55469\\-83.01238\\-47\\22.46094\\-80.80146\\-47\\24.41406\\-80.06403\\-47\\26.36719\\-79.05556\\-47\\32.22656\\-76.88541\\-47\\34.17969\\-76.38366\\-47\\38.08594\\-75.74609\\-47\\41.99219\\-74.72974\\-47\\45.89844\\-74.39868\\-47\\49.80469\\-74.23905\\-47\\51.75781\\-74.04389\\-47\\55.66406\\-73.98553\\-47\\57.61719\\-73.29706\\-47\\59.57031\\-73.83397\\-47\\63.47656\\-74.08723\\-47\\65.42969\\-74.28125\\-47\\73.24219\\-74.618\\-47\\77.14844\\-74.99792\\-47\\79.10156\\-75.43059\\-47\\81.05469\\-75.76205\\-47\\88.86719\\-76.56196\\-47\\90.82031\\-77.00719\\-47\\92.77344\\-77.56544\\-47\\96.67969\\-78.35123\\-47\\98.63281\\-78.92834\\-47\\100.5859\\-79.61108\\-47\\104.4922\\-80.65248\\-47\\106.4453\\-81.59869\\-47\\108.3984\\-82.16089\\-47\\110.653\\-83.07031\\-47\\114.2578\\-84.81174\\-47\\116.2109\\-85.96449\\-47\\118.1641\\-86.83273\\-47\\122.0129\\-88.92969\\-47\\124.0234\\-90.21299\\-47\\127.9297\\-93.04858\\-47\\129.8828\\-94.3478\\-47\\131.8359\\-95.90054\\-47\\134.9224\\-98.69531\\-47\\139.6484\\-103.6825\\-47\\140.4001\\-104.5547\\-47\\141.8281\\-106.5078\\-47\\142.9478\\-108.4609\\-47\\144.1767\\-110.4141\\-47\\145.1546\\-112.3672\\-47\\145.5078\\-112.82\\-47\\147.6962\\-116.2734\\-47\\148.537\\-118.2266\\-47\\149.5469\\-120.1797\\-47\\151.2199\\-124.0859\\-47\\152.2113\\-126.0391\\-47\\153.9851\\-129.9453\\-47\\154.6203\\-131.8984\\-47\\155.5063\\-133.8516\\-47\\156.1044\\-135.8047\\-47\\156.5092\\-137.7578\\-47\\157.3073\\-139.7109\\-47\\157.9577\\-141.6641\\-47\\158.3932\\-143.6172\\-47\\159.7077\\-147.5234\\-47\\160.4576\\-151.4297\\-47\\161.4265\\-155.3359\\-47\\161.9555\\-159.2422\\-47\\162.5655\\-167.0547\\-47\\162.7698\\-169.0078\\-47\\163.3085\\-172.9141\\-47\\163.5164\\-174.8672\\-47\\163.7275\\-178.7734\\-47\\163.9252\\-186.5859\\-47\\163.9353\\-196.3516\\-47\\163.821\\-204.1641\\-47\\163.6882\\-208.0703\\-47\\163.4069\\-211.9766\\-47\\163.1995\\-213.9297\\-47\\162.6237\\-217.8359\\-47\\162.2532\\-221.7422\\-47\\161.7777\\-225.6484\\-47\\161.3787\\-227.6016\\-47\\160.6572\\-229.5547\\-47\\159.6144\\-233.4609\\-47\\158.6345\\-235.4141\\-47\\158.0067\\-237.3672\\-47\\157.0805\\-239.3203\\-47\\155.6396\\-243.2266\\-47\\154.5516\\-245.1797\\-47\\153.7019\\-247.1328\\-47\\151.3672\\-250.6359\\-47\\151.0392\\-251.0391\\-47\\150.0116\\-252.9922\\-47\\147.4609\\-256.5207\\-47\\143.5547\\-261.3843\\-47\\140.5679\\-264.7109\\-47\\137.6953\\-267.6406\\-47\\134.6354\\-270.5703\\-47\\133.7891\\-271.2464\\-47\\131.8359\\-273.1413\\-47\\129.8828\\-274.8983\\-47\\125.9766\\-277.7513\\-47\\122.0703\\-280.9405\\-47\\120.1172\\-282.0983\\-47\\118.1641\\-283.372\\-47\\116.2109\\-284.7558\\-47\\110.3516\\-288.2823\\-47\\108.3984\\-289.1614\\-47\\102.5391\\-292.0159\\-47\\100.5859\\-292.9279\\-47\\98.63281\\-293.6031\\-47\\96.67969\\-294.4529\\-47\\94.72656\\-294.9484\\-47\\92.77344\\-295.3418\\-47\\90.82031\\-295.8594\\-47\\88.86719\\-296.493\\-47\\86.91406\\-296.8319\\-47\\83.00781\\-297.34\\-47\\79.10156\\-298.1011\\-47\\77.14844\\-298.367\\-47\\75.19531\\-298.5277\\-47\\71.28906\\-298.6275\\-47\\67.38281\\-298.5384\\-47\\65.42969\\-298.376\\-47\\63.47656\\-298.0361\\-47\\59.57031\\-297.1776\\-47\\55.66406\\-296.511\\-47\\53.71094\\-295.7731\\-47\\51.75781\\-295.1906\\-47\\49.80469\\-294.7493\\-47\\43.94531\\-292.2303\\-47\\41.99219\\-291.1804\\-47\\40.03906\\-290.4314\\-47\\38.08594\\-289.3584\\-47\\36.13281\\-288.6606\\-47\\34.17969\\-287.411\\-47\\32.22656\\-286.7825\\-47\\30.27344\\-285.571\\-47\\27.06262\\-284.2422\\-47\\26.36719\\-283.8945\\-47\\24.41406\\-283.4935\\-47\\20.50781\\-283.3443\\-47\\16.60156\\-283.3673\\-47\\4.882813\\-284.2333\\-47\\2.929688\\-284.3167\\-47\\0.9765625\\-284.5201\\-47\\-2.929688\\-284.62\\-47\\-6.835938\\-284.6314\\-47\\-14.64844\\-284.4901\\-47\\-20.50781\\-284.419\\-47\\-24.41406\\-284.6152\\-47\\-26.36719\\-284.927\\-47\\-28.32031\\-285.4225\\-47\\-30.27344\\-286.4147\\-47\\-32.22656\\-287.1839\\-47\\-36.13281\\-288.9407\\-47\\-38.08594\\-289.5576\\-47\\-40.03906\\-290.7435\\-47\\-41.99219\\-291.5043\\-47\\-43.94531\\-292.6889\\-47\\-45.89844\\-293.4194\\-47\\-47.85156\\-294.4499\\-47\\-49.80469\\-294.9489\\-47\\-51.75781\\-295.6026\\-47\\-53.71094\\-296.5021\\-47\\-57.61719\\-297.3449\\-47\\-59.57031\\-297.9948\\-47\\-61.52344\\-298.5244\\-47\\-63.47656\\-298.8121\\-47\\-67.38281\\-299.2632\\-47\\-71.28906\\-299.5461\\-47\\-73.24219\\-299.6027\\-47\\-77.14844\\-299.4434\\-47\\-81.05469\\-299.1036\\-47\\-84.96094\\-298.6109\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "308" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "103" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-298.439\\-45\\-88.86719\\-297.2687\\-45\\-92.77344\\-296.4299\\-45\\-94.72656\\-295.5337\\-45\\-98.63281\\-294.3586\\-45\\-100.5859\\-293.2809\\-45\\-102.5391\\-292.4264\\-45\\-104.4922\\-291.1436\\-45\\-108.3984\\-289.0587\\-45\\-112.3047\\-286.8444\\-45\\-116.2109\\-284.0469\\-45\\-118.1641\\-282.9069\\-45\\-121.6446\\-280.3359\\-45\\-124.0234\\-278.3083\\-45\\-127.9297\\-275.219\\-45\\-129.8828\\-273.3922\\-45\\-130.6702\\-272.5234\\-45\\-134.7587\\-268.6172\\-45\\-135.7422\\-267.5904\\-45\\-139.6484\\-263.1323\\-45\\-141.6016\\-260.7549\\-45\\-142.8287\\-258.8516\\-45\\-145.7802\\-254.9453\\-45\\-147.0018\\-252.9922\\-45\\-148.3215\\-251.0391\\-45\\-149.4141\\-249.0523\\-45\\-150.3683\\-247.1328\\-45\\-151.5336\\-245.1797\\-45\\-152.5018\\-243.2266\\-45\\-153.6631\\-241.2734\\-45\\-154.4372\\-239.3203\\-45\\-155.3601\\-237.3672\\-45\\-156.1302\\-235.4141\\-45\\-156.6147\\-233.4609\\-45\\-157.6381\\-231.5078\\-45\\-158.2489\\-229.5547\\-45\\-158.9886\\-227.6016\\-45\\-159.8433\\-225.6484\\-45\\-160.3308\\-223.6953\\-45\\-161.6371\\-219.7891\\-45\\-162.0081\\-217.8359\\-45\\-162.6206\\-213.9297\\-45\\-163.2425\\-211.9766\\-45\\-163.7042\\-210.0234\\-45\\-164.452\\-204.1641\\-45\\-164.7727\\-202.2109\\-45\\-165.2261\\-200.2578\\-45\\-165.7092\\-196.3516\\-45\\-165.9655\\-192.4453\\-45\\-166.1486\\-188.5391\\-45\\-166.2439\\-184.6328\\-45\\-166.2638\\-180.7266\\-45\\-166.1123\\-174.8672\\-45\\-165.921\\-170.9609\\-45\\-165.638\\-167.0547\\-45\\-165.426\\-165.1016\\-45\\-164.6343\\-161.1953\\-45\\-164.3273\\-159.2422\\-45\\-163.8184\\-155.3359\\-45\\-163.4069\\-153.3828\\-45\\-162.7417\\-151.4297\\-45\\-161.9828\\-147.5234\\-45\\-161.4722\\-145.5703\\-45\\-160.6477\\-143.6172\\-45\\-160.0388\\-141.6641\\-45\\-159.2323\\-139.7109\\-45\\-158.3029\\-137.7578\\-45\\-157.5731\\-135.8047\\-45\\-156.5192\\-133.8516\\-45\\-155.905\\-131.8984\\-45\\-154.8462\\-129.9453\\-45\\-154.1004\\-127.9922\\-45\\-152.9803\\-126.0391\\-45\\-152.024\\-124.0859\\-45\\-150.8082\\-122.1328\\-45\\-150.0105\\-120.1797\\-45\\-148.8321\\-118.2266\\-45\\-148.0614\\-116.2734\\-45\\-146.6809\\-114.3203\\-45\\-145.5917\\-112.3672\\-45\\-143.5547\\-109.1213\\-45\\-143.0486\\-108.4609\\-45\\-141.9493\\-106.5078\\-45\\-140.5291\\-104.5547\\-45\\-137.6953\\-101.1288\\-45\\-133.7801\\-96.74219\\-45\\-129.1101\\-92.83594\\-45\\-125.9766\\-90.5331\\-45\\-122.0703\\-88.19228\\-45\\-120.1172\\-87.38346\\-45\\-118.1641\\-86.29014\\-45\\-116.2109\\-85.0695\\-45\\-114.2578\\-84.1048\\-45\\-112.3047\\-83.80599\\-45\\-108.3984\\-82.20151\\-45\\-106.4453\\-81.78816\\-45\\-104.4922\\-80.8349\\-45\\-102.5391\\-80.45564\\-45\\-100.5859\\-80.22481\\-45\\-98.63281\\-79.51283\\-45\\-96.67969\\-79.02863\\-45\\-88.86719\\-77.69598\\-45\\-86.5009\\-77.21094\\-45\\-83.00781\\-76.6014\\-45\\-81.05469\\-76.37666\\-45\\-75.19531\\-76.08367\\-45\\-65.42969\\-76.04498\\-45\\-61.52344\\-76.07064\\-45\\-55.66406\\-76.21126\\-45\\-51.75781\\-76.35181\\-45\\-45.89844\\-76.84644\\-45\\-41.99219\\-77.39314\\-45\\-38.08594\\-77.87209\\-45\\-34.17969\\-78.43451\\-45\\-32.22656\\-78.87109\\-45\\-30.27344\\-79.51081\\-45\\-26.36719\\-80.4894\\-45\\-24.41406\\-81.35187\\-45\\-20.50781\\-82.8094\\-45\\-18.55469\\-83.97127\\-45\\-14.64844\\-86.49179\\-45\\-12.69531\\-88.06084\\-45\\-9.447675\\-90.88281\\-45\\-7.284841\\-92.83594\\-45\\-5.271709\\-94.78906\\-45\\-2.929688\\-96.95824\\-45\\-0.9765625\\-98.53372\\-45\\0.9765625\\-98.18498\\-45\\2.824768\\-96.74219\\-45\\4.882813\\-94.88412\\-45\\6.835938\\-92.98686\\-45\\8.708294\\-90.88281\\-45\\10.74219\\-88.92148\\-45\\15.14089\\-85.02344\\-45\\18.55469\\-82.54716\\-45\\20.50781\\-81.58739\\-45\\22.46094\\-80.4894\\-45\\24.41406\\-79.68442\\-45\\26.36719\\-78.69505\\-45\\32.22656\\-76.60059\\-45\\36.13281\\-75.86024\\-45\\40.03906\\-74.78817\\-45\\41.99219\\-74.5303\\-45\\47.85156\\-74.20568\\-45\\51.75781\\-73.11768\\-45\\55.66406\\-73.06896\\-45\\57.61719\\-72.87\\-45\\63.47656\\-73.26713\\-45\\65.42969\\-74.05338\\-45\\67.38281\\-74.2636\\-45\\73.24219\\-74.51103\\-45\\77.14844\\-74.78761\\-45\\79.10156\\-75.02757\\-45\\83.00781\\-75.83487\\-45\\88.86719\\-76.39515\\-45\\90.82031\\-76.77181\\-45\\92.77344\\-77.3515\\-45\\96.67969\\-78.1992\\-45\\98.63281\\-78.75188\\-45\\102.5391\\-79.99322\\-45\\104.4922\\-80.52359\\-45\\106.4453\\-81.40355\\-45\\110.3516\\-82.70941\\-45\\112.3047\\-83.76701\\-45\\114.2578\\-84.67692\\-45\\116.2109\\-85.86979\\-45\\118.1641\\-86.73785\\-45\\120.1172\\-87.86157\\-45\\122.0703\\-88.81155\\-45\\124.0234\\-90.11466\\-45\\125.9766\\-91.5603\\-45\\127.9297\\-92.82831\\-45\\129.8828\\-94.23404\\-45\\131.8359\\-95.79733\\-45\\134.9567\\-98.69531\\-45\\137.6953\\-101.625\\-45\\139.6484\\-103.8125\\-45\\141.66\\-106.5078\\-45\\142.78\\-108.4609\\-45\\144.043\\-110.4141\\-45\\144.9653\\-112.3672\\-45\\146.2995\\-114.3203\\-45\\147.4609\\-116.3847\\-45\\148.3704\\-118.2266\\-45\\149.2048\\-120.1797\\-45\\150.1749\\-122.1328\\-45\\150.8625\\-124.0859\\-45\\151.9686\\-126.0391\\-45\\152.7123\\-127.9922\\-45\\153.7352\\-129.9453\\-45\\154.3969\\-131.8984\\-45\\155.9181\\-135.8047\\-45\\156.3329\\-137.7578\\-45\\156.8823\\-139.7109\\-45\\157.7002\\-141.6641\\-45\\158.6275\\-145.5703\\-45\\159.3667\\-147.5234\\-45\\159.8809\\-149.4766\\-45\\160.5756\\-153.3828\\-45\\161.4898\\-157.2891\\-45\\161.7859\\-159.2422\\-45\\162.2702\\-165.1016\\-45\\162.5216\\-169.0078\\-45\\162.9145\\-172.9141\\-45\\163.2136\\-174.8672\\-45\\163.4961\\-178.7734\\-45\\163.6684\\-182.6797\\-45\\163.7684\\-186.5859\\-45\\163.821\\-192.4453\\-45\\163.7897\\-196.3516\\-45\\163.6431\\-204.1641\\-45\\163.4857\\-208.0703\\-45\\163.2957\\-210.0234\\-45\\162.6009\\-215.8828\\-45\\162.127\\-221.7422\\-45\\161.569\\-225.6484\\-45\\160.3933\\-229.5547\\-45\\159.9345\\-231.5078\\-45\\159.2319\\-233.4609\\-45\\158.3677\\-235.4141\\-45\\157.7919\\-237.3672\\-45\\156.735\\-239.3203\\-45\\156.1541\\-241.2734\\-45\\155.3141\\-243.2266\\-45\\153.3203\\-247.1218\\-45\\152.1403\\-249.0859\\-45\\150.714\\-251.0391\\-45\\149.7026\\-252.9922\\-45\\148.3398\\-254.9453\\-45\\145.0872\\-258.8516\\-45\\143.6406\\-260.8047\\-45\\141.9658\\-262.7578\\-45\\140.1367\\-264.7109\\-45\\137.6953\\-267.2106\\-45\\135.7422\\-269.1238\\-45\\129.742\\-274.4766\\-45\\124.7025\\-278.3828\\-45\\122.0703\\-280.5388\\-45\\120.1172\\-281.6617\\-45\\118.1641\\-283.0716\\-45\\114.2578\\-285.451\\-45\\112.3047\\-286.7996\\-45\\110.3516\\-287.7121\\-45\\108.3984\\-288.865\\-45\\106.4453\\-289.5352\\-45\\104.4922\\-290.7119\\-45\\102.5391\\-291.4413\\-45\\100.5859\\-292.5604\\-45\\98.63281\\-293.2013\\-45\\94.72656\\-294.6692\\-45\\90.82031\\-295.4265\\-45\\86.91406\\-296.5743\\-45\\79.10156\\-297.5753\\-45\\75.19531\\-298.1959\\-45\\73.24219\\-298.301\\-45\\69.33594\\-298.3488\\-45\\67.38281\\-298.2396\\-45\\59.57031\\-297.0002\\-45\\57.61719\\-296.527\\-45\\55.66406\\-295.9165\\-45\\53.71094\\-295.5552\\-45\\49.80469\\-294.6444\\-45\\47.85156\\-293.7916\\-45\\43.94531\\-292.2174\\-45\\41.99219\\-291.2256\\-45\\40.03906\\-290.5509\\-45\\38.08594\\-289.4652\\-45\\36.13281\\-288.8777\\-45\\34.17969\\-287.7981\\-45\\32.22656\\-287.0666\\-45\\28.32031\\-285.2655\\-45\\26.36719\\-284.8417\\-45\\24.41406\\-284.5724\\-45\\22.46094\\-284.4292\\-45\\18.55469\\-284.5993\\-45\\16.60156\\-284.4305\\-45\\14.64844\\-284.7768\\-45\\6.835938\\-285.3593\\-45\\0.9765625\\-285.6384\\-45\\-2.929688\\-285.707\\-45\\-6.835938\\-285.7188\\-45\\-10.74219\\-285.666\\-45\\-16.60156\\-285.537\\-45\\-22.46094\\-285.4594\\-45\\-24.41406\\-285.4845\\-45\\-26.36719\\-285.6558\\-45\\-28.2959\\-286.1953\\-45\\-32.22656\\-287.5258\\-45\\-34.17969\\-288.474\\-45\\-36.13281\\-288.9644\\-45\\-38.08594\\-289.6514\\-45\\-40.03906\\-290.8006\\-45\\-41.99219\\-291.5161\\-45\\-43.94531\\-292.6736\\-45\\-45.89844\\-293.3826\\-45\\-47.85156\\-294.3015\\-45\\-49.80469\\-294.6726\\-45\\-53.71094\\-296.3229\\-45\\-55.66406\\-296.8108\\-45\\-57.61719\\-297.1803\\-45\\-59.57031\\-297.6699\\-45\\-61.52344\\-298.3205\\-45\\-63.47656\\-298.654\\-45\\-67.38281\\-299.0724\\-45\\-69.33594\\-299.2216\\-45\\-73.24219\\-299.3554\\-45\\-77.14844\\-299.218\\-45\\-81.05469\\-298.9397\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "306" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "104" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-298.1846\\-43\\-86.91406\\-297.5325\\-43\\-90.82031\\-296.752\\-43\\-92.77344\\-296.1607\\-43\\-94.72656\\-295.3203\\-43\\-96.67969\\-294.8388\\-43\\-98.63281\\-294.0621\\-43\\-102.4892\\-292.0547\\-43\\-104.4922\\-290.9394\\-43\\-106.4453\\-289.6821\\-43\\-108.3984\\-288.8934\\-43\\-110.3516\\-287.6236\\-43\\-112.3047\\-286.5873\\-43\\-112.7809\\-286.1953\\-43\\-115.6494\\-284.2422\\-43\\-116.2109\\-283.7609\\-43\\-118.1641\\-282.6696\\-43\\-120.1172\\-281.2882\\-43\\-124.0234\\-278.0324\\-43\\-127.9297\\-275.0555\\-43\\-129.8828\\-273.228\\-43\\-131.8359\\-271.257\\-43\\-134.6251\\-268.6172\\-43\\-136.4388\\-266.6641\\-43\\-139.6484\\-262.9419\\-43\\-141.6016\\-260.535\\-43\\-142.7493\\-258.8516\\-43\\-145.6026\\-254.9453\\-43\\-148.2212\\-251.0391\\-43\\-151.2806\\-245.1797\\-43\\-153.4819\\-241.2734\\-43\\-155.1285\\-237.3672\\-43\\-156.009\\-235.4141\\-43\\-156.4605\\-233.4609\\-43\\-157.4136\\-231.5078\\-43\\-158.7126\\-227.6016\\-43\\-159.641\\-225.6484\\-43\\-160.6924\\-221.7422\\-43\\-161.4285\\-219.7891\\-43\\-161.8622\\-217.8359\\-43\\-162.4122\\-213.9297\\-43\\-162.8454\\-211.9766\\-43\\-163.4404\\-210.0234\\-43\\-163.7967\\-208.0703\\-43\\-164.467\\-202.2109\\-43\\-165.1745\\-198.3047\\-43\\-165.4738\\-196.3516\\-43\\-165.7728\\-192.4453\\-43\\-165.9371\\-188.5391\\-43\\-166.0405\\-184.6328\\-43\\-166.0509\\-180.7266\\-43\\-165.9712\\-176.8203\\-43\\-165.8313\\-172.9141\\-43\\-165.5884\\-169.0078\\-43\\-165.0912\\-165.1016\\-43\\-164.668\\-163.1484\\-43\\-163.9058\\-157.2891\\-43\\-163.5866\\-155.3359\\-43\\-162.4796\\-151.4297\\-43\\-161.7942\\-147.5234\\-43\\-160.3639\\-143.6172\\-43\\-159.7802\\-141.6641\\-43\\-158.7904\\-139.7109\\-43\\-158.0585\\-137.7578\\-43\\-156.3099\\-133.8516\\-43\\-155.6396\\-131.8984\\-43\\-154.5954\\-129.9453\\-43\\-153.9112\\-127.9922\\-43\\-152.7158\\-126.0391\\-43\\-151.7488\\-124.0859\\-43\\-150.5503\\-122.1328\\-43\\-149.7659\\-120.1797\\-43\\-148.6574\\-118.2266\\-43\\-147.7841\\-116.2734\\-43\\-147.4609\\-115.8589\\-43\\-145.29\\-112.3672\\-43\\-143.5547\\-109.4375\\-43\\-142.8657\\-108.4609\\-43\\-141.7376\\-106.5078\\-43\\-140.384\\-104.5547\\-43\\-137.6953\\-101.2813\\-43\\-137.0915\\-100.6484\\-43\\-133.7891\\-96.8381\\-43\\-131.8359\\-95.10187\\-43\\-129.1167\\-92.83594\\-43\\-125.9766\\-90.51172\\-43\\-122.0703\\-88.13128\\-43\\-120.1172\\-87.28937\\-43\\-118.1641\\-86.25809\\-43\\-116.2109\\-85.05057\\-43\\-114.2578\\-84.14536\\-43\\-112.3047\\-83.79156\\-43\\-110.3516\\-82.89503\\-43\\-108.3984\\-82.14763\\-43\\-106.4453\\-81.69205\\-43\\-104.4922\\-80.63588\\-43\\-102.5391\\-80.36367\\-43\\-98.63281\\-79.46395\\-43\\-96.67969\\-78.95236\\-43\\-92.77344\\-78.20536\\-43\\-90.82031\\-77.89268\\-43\\-86.91406\\-77.00865\\-43\\-83.00781\\-76.40854\\-43\\-81.05469\\-76.25269\\-43\\-79.10156\\-76.21011\\-43\\-75.19531\\-75.99634\\-43\\-69.33594\\-75.90271\\-43\\-63.47656\\-75.85635\\-43\\-51.75781\\-76.17519\\-43\\-47.85156\\-76.36584\\-43\\-43.94531\\-76.70286\\-43\\-40.19326\\-77.21094\\-43\\-34.17969\\-78.14822\\-43\\-32.22656\\-78.52619\\-43\\-30.27344\\-79.00247\\-43\\-28.32031\\-79.6756\\-43\\-24.41406\\-80.84345\\-43\\-22.46094\\-81.80014\\-43\\-20.50781\\-82.40835\\-43\\-16.60156\\-84.67838\\-43\\-13.42989\\-86.97656\\-43\\-8.789063\\-90.77431\\-43\\-2.339377\\-96.74219\\-43\\-0.9765625\\-97.90536\\-43\\0.9765625\\-97.74681\\-43\\2.342224\\-96.74219\\-43\\4.451308\\-94.78906\\-43\\6.835938\\-92.47343\\-43\\8.283944\\-90.88281\\-43\\10.74219\\-88.42305\\-43\\14.64844\\-84.91493\\-43\\18.55469\\-82.21745\\-43\\20.62196\\-81.11719\\-43\\22.46094\\-80.28424\\-43\\24.59039\\-79.16406\\-43\\26.36719\\-78.38873\\-43\\30.27344\\-76.94273\\-43\\32.22656\\-76.35569\\-43\\36.13281\\-75.67921\\-43\\38.08594\\-74.86565\\-43\\40.03906\\-74.59106\\-43\\43.94531\\-74.31102\\-43\\47.94922\\-73.30469\\-43\\49.80469\\-72.94787\\-43\\51.75781\\-72.84272\\-43\\57.61719\\-72.81641\\-43\\63.47656\\-72.88874\\-43\\67.38281\\-73.41319\\-43\\69.33594\\-74.24616\\-43\\77.14844\\-74.65002\\-43\\81.05469\\-75.10057\\-43\\83.00781\\-75.71004\\-43\\86.91406\\-76.116\\-43\\88.86719\\-76.26379\\-43\\90.82031\\-76.56641\\-43\\94.72656\\-77.66412\\-43\\96.67969\\-78.05054\\-43\\100.4519\\-79.16406\\-43\\102.5391\\-79.93693\\-43\\104.4922\\-80.42749\\-43\\108.3984\\-81.96395\\-43\\110.3516\\-82.59213\\-43\\112.3047\\-83.65379\\-43\\114.2578\\-84.54382\\-43\\116.2109\\-85.78693\\-43\\118.1641\\-86.62828\\-43\\120.1172\\-87.79343\\-43\\122.0703\\-88.67987\\-43\\125.9766\\-91.465\\-43\\127.9297\\-92.7005\\-43\\129.8828\\-94.15395\\-43\\131.8359\\-95.72065\\-43\\134.94\\-98.69531\\-43\\138.5102\\-102.6016\\-43\\140.1054\\-104.5547\\-43\\141.6016\\-106.7883\\-43\\143.806\\-110.4141\\-43\\144.7873\\-112.3672\\-43\\146.1009\\-114.3203\\-43\\147.0744\\-116.2734\\-43\\148.2117\\-118.2266\\-43\\148.9223\\-120.1797\\-43\\149.9767\\-122.1328\\-43\\150.6037\\-124.0859\\-43\\151.6433\\-126.0391\\-43\\152.4442\\-127.9922\\-43\\153.3874\\-129.9453\\-43\\154.1969\\-131.8984\\-43\\154.7584\\-133.8516\\-43\\155.7098\\-135.8047\\-43\\156.561\\-139.7109\\-43\\157.3351\\-141.6641\\-43\\157.9307\\-143.6172\\-43\\158.3522\\-145.5703\\-43\\158.8787\\-147.5234\\-43\\159.6354\\-149.4766\\-43\\160.6633\\-155.3359\\-43\\161.5457\\-159.2422\\-43\\161.9792\\-163.1484\\-43\\162.127\\-165.1016\\-43\\162.6107\\-172.9141\\-43\\163.0014\\-176.8203\\-43\\163.4294\\-182.6797\\-43\\163.6047\\-188.5391\\-43\\163.6345\\-194.3984\\-43\\163.5264\\-200.2578\\-43\\163.3954\\-204.1641\\-43\\163.1557\\-208.0703\\-43\\162.9132\\-210.0234\\-43\\162.5562\\-213.9297\\-43\\162.1449\\-219.7891\\-43\\161.7076\\-223.6953\\-43\\161.2723\\-225.6484\\-43\\160.6912\\-227.6016\\-43\\159.7139\\-231.5078\\-43\\158.7978\\-233.4609\\-43\\157.4989\\-237.3672\\-43\\156.5016\\-239.3203\\-43\\155.9773\\-241.2734\\-43\\154.9624\\-243.2266\\-43\\154.1303\\-245.1797\\-43\\152.9123\\-247.1328\\-43\\151.8586\\-249.0859\\-43\\150.4833\\-251.0391\\-43\\148.0781\\-254.9453\\-43\\144.7178\\-258.8516\\-43\\143.5547\\-260.3484\\-43\\141.6016\\-262.6403\\-43\\139.6484\\-264.5857\\-43\\135.7422\\-268.6772\\-43\\131.8359\\-272.0214\\-43\\129.8828\\-273.837\\-43\\125.9766\\-277.0616\\-43\\124.1388\\-278.3828\\-43\\121.6175\\-280.3359\\-43\\118.1641\\-282.6869\\-43\\116.2109\\-283.6989\\-43\\115.5282\\-284.2422\\-43\\112.3047\\-286.3369\\-43\\110.3516\\-287.3226\\-43\\108.3984\\-288.5003\\-43\\106.4453\\-289.2288\\-43\\104.4922\\-290.2255\\-43\\98.63281\\-292.8478\\-43\\96.67969\\-293.4472\\-43\\94.72656\\-294.3035\\-43\\92.77344\\-294.8096\\-43\\88.86719\\-295.5444\\-43\\86.91406\\-296.1852\\-43\\84.96094\\-296.5862\\-43\\83.00781\\-296.8482\\-43\\79.10156\\-297.2205\\-43\\75.19531\\-297.6822\\-43\\73.24219\\-297.8598\\-43\\69.33594\\-297.9368\\-43\\59.57031\\-296.8492\\-43\\55.66406\\-295.3227\\-43\\53.71094\\-295.3801\\-43\\49.80469\\-294.5341\\-43\\47.85156\\-293.6604\\-43\\43.94531\\-292.2291\\-43\\41.99219\\-291.2603\\-43\\40.03906\\-290.6572\\-43\\38.08594\\-289.6003\\-43\\36.13281\\-289.0411\\-43\\34.17969\\-288.3225\\-43\\32.22656\\-287.3561\\-43\\30.27344\\-286.733\\-43\\28.32031\\-285.9758\\-43\\26.36719\\-285.5379\\-43\\22.46094\\-285.317\\-43\\18.55469\\-285.5555\\-43\\16.60156\\-285.5321\\-43\\14.64844\\-285.8281\\-43\\10.74219\\-286.218\\-43\\8.789063\\-286.4795\\-43\\4.882813\\-286.7311\\-43\\0.9765625\\-286.8919\\-43\\-2.929688\\-286.9622\\-43\\-6.835938\\-286.9831\\-43\\-16.60156\\-286.8396\\-43\\-24.41406\\-286.6698\\-43\\-26.36719\\-286.7131\\-43\\-28.32031\\-286.9609\\-43\\-30.27344\\-287.3387\\-43\\-32.22656\\-287.8875\\-43\\-34.17969\\-288.6509\\-43\\-36.13281\\-288.9449\\-43\\-38.08594\\-289.7912\\-43\\-40.03906\\-290.8692\\-43\\-41.99219\\-291.5398\\-43\\-43.94531\\-292.67\\-43\\-45.89844\\-293.3587\\-43\\-47.85156\\-294.1834\\-43\\-49.80469\\-294.5616\\-43\\-53.71094\\-296.1048\\-43\\-55.66406\\-296.6849\\-43\\-59.57031\\-297.4197\\-43\\-61.52344\\-298.0495\\-43\\-63.47656\\-298.4792\\-43\\-67.38281\\-298.9102\\-43\\-69.33594\\-299.0323\\-43\\-73.24219\\-299.1401\\-43\\-77.14844\\-299.0323\\-43\\-81.05469\\-298.7752\\-43\\-83.00781\\-298.5634\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "313" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "105" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-298.3579\\-41\\-86.91406\\-297.3037\\-41\\-90.82031\\-296.5743\\-41\\-92.77344\\-295.802\\-41\\-94.72656\\-295.1736\\-41\\-96.67969\\-294.6692\\-41\\-98.63281\\-293.6755\\-41\\-100.5859\\-292.8224\\-41\\-102.5391\\-291.6214\\-41\\-104.4922\\-290.731\\-41\\-106.4453\\-289.4155\\-41\\-108.3984\\-288.6902\\-41\\-110.3516\\-287.3635\\-41\\-112.3047\\-286.2033\\-41\\-115.3164\\-284.2422\\-41\\-116.2109\\-283.5326\\-41\\-118.1641\\-282.3617\\-41\\-120.1172\\-281.0838\\-41\\-122.0703\\-279.4854\\-41\\-124.0234\\-277.7699\\-41\\-125.9766\\-276.2344\\-41\\-127.9297\\-274.8539\\-41\\-129.8828\\-273.0448\\-41\\-131.8359\\-271.0825\\-41\\-134.4712\\-268.6172\\-41\\-136.2893\\-266.6641\\-41\\-139.6484\\-262.715\\-41\\-141.6016\\-260.3077\\-41\\-144.1002\\-256.8984\\-41\\-148.1182\\-251.0391\\-41\\-149.0451\\-249.0859\\-41\\-150.1988\\-247.1328\\-41\\-151.0728\\-245.1797\\-41\\-152.2615\\-243.2266\\-41\\-154.2127\\-239.3203\\-41\\-154.955\\-237.3672\\-41\\-155.8878\\-235.4141\\-41\\-156.3656\\-233.4609\\-41\\-157.9654\\-229.5547\\-41\\-158.5195\\-227.6016\\-41\\-159.3914\\-225.6484\\-41\\-159.9866\\-223.6953\\-41\\-160.4532\\-221.7422\\-41\\-161.7025\\-217.8359\\-41\\-162.0447\\-215.8828\\-41\\-162.5621\\-211.9766\\-41\\-163.568\\-208.0703\\-41\\-163.8384\\-206.1172\\-41\\-164.2296\\-202.2109\\-41\\-164.7454\\-198.3047\\-41\\-165.1198\\-196.3516\\-41\\-165.5723\\-192.4453\\-41\\-165.8053\\-186.5859\\-41\\-165.8627\\-180.7266\\-41\\-165.7752\\-176.8203\\-41\\-165.6119\\-172.9141\\-41\\-165.3209\\-169.0078\\-41\\-164.3936\\-163.1484\\-41\\-163.7042\\-157.2891\\-41\\-163.2561\\-155.3359\\-41\\-162.6587\\-153.3828\\-41\\-162.0147\\-149.4766\\-41\\-161.5275\\-147.5234\\-41\\-160.7357\\-145.5703\\-41\\-159.4746\\-141.6641\\-41\\-158.4586\\-139.7109\\-41\\-157.8114\\-137.7578\\-41\\-156.7722\\-135.8047\\-41\\-156.1202\\-133.8516\\-41\\-154.3981\\-129.9453\\-41\\-153.6797\\-127.9922\\-41\\-152.4752\\-126.0391\\-41\\-150.3489\\-122.1328\\-41\\-148.4563\\-118.2266\\-41\\-146.3117\\-114.3203\\-41\\-145.0162\\-112.3672\\-41\\-143.9807\\-110.4141\\-41\\-142.6595\\-108.4609\\-41\\-141.6016\\-106.7052\\-41\\-140.1738\\-104.5547\\-41\\-137.6953\\-101.4688\\-41\\-135.2611\\-98.69531\\-41\\-133.7891\\-96.90785\\-41\\-131.8359\\-95.17217\\-41\\-129.0899\\-92.83594\\-41\\-125.9766\\-90.5331\\-41\\-122.0703\\-88.13664\\-41\\-120.1172\\-87.27411\\-41\\-118.1641\\-86.24934\\-41\\-116.2109\\-85.08558\\-41\\-114.2578\\-84.22856\\-41\\-112.3047\\-83.74938\\-41\\-110.3516\\-82.88314\\-41\\-108.3984\\-82.12032\\-41\\-106.4453\\-81.616\\-41\\-104.4922\\-80.595\\-41\\-102.5391\\-80.31123\\-41\\-100.5859\\-79.70413\\-41\\-98.63281\\-79.39063\\-41\\-94.72656\\-78.40382\\-41\\-90.82031\\-77.72871\\-41\\-88.86719\\-77.17338\\-41\\-84.96094\\-76.50245\\-41\\-81.05469\\-76.16335\\-41\\-79.10156\\-76.11455\\-41\\-75.19531\\-75.8736\\-41\\-71.28906\\-75.82047\\-41\\-65.42969\\-75.63874\\-41\\-63.47656\\-75.62231\\-41\\-61.52344\\-75.7263\\-41\\-51.75781\\-76.01869\\-41\\-47.85156\\-76.18079\\-41\\-43.94531\\-76.41863\\-41\\-40.03906\\-76.84052\\-41\\-38.08594\\-77.14384\\-41\\-32.22656\\-78.19866\\-41\\-30.27344\\-78.64362\\-41\\-26.36719\\-79.98292\\-41\\-24.41406\\-80.49399\\-41\\-20.50781\\-82.13155\\-41\\-18.6181\\-83.07031\\-41\\-16.60156\\-84.22388\\-41\\-12.69531\\-87.12093\\-41\\-10.74219\\-88.49818\\-41\\-8.789063\\-90.22062\\-41\\-6.835938\\-92.1123\\-41\\-2.929688\\-95.6427\\-41\\-0.9765625\\-97.19009\\-41\\0.9765625\\-97.30981\\-41\\2.929688\\-95.81877\\-41\\4.076408\\-94.78906\\-41\\6.835938\\-92.1404\\-41\\8.789063\\-90.04867\\-41\\10.74219\\-88.09164\\-41\\14.64844\\-84.51057\\-41\\16.71832\\-83.07031\\-41\\20.50781\\-80.75098\\-41\\22.46094\\-79.94661\\-41\\24.41406\\-78.91457\\-41\\26.36719\\-78.09818\\-41\\28.32031\\-77.41917\\-41\\30.27344\\-76.59654\\-41\\34.17969\\-75.84756\\-41\\36.13281\\-75.13153\\-41\\38.08594\\-74.64574\\-41\\41.99219\\-74.3355\\-41\\43.94531\\-74.06573\\-41\\45.89844\\-72.98988\\-41\\51.75781\\-72.77455\\-41\\61.52344\\-72.78273\\-41\\67.38281\\-72.91775\\-41\\68.84766\\-73.30469\\-41\\71.28906\\-74.25184\\-41\\77.14844\\-74.55653\\-41\\81.05469\\-74.94254\\-41\\83.00781\\-75.41803\\-41\\84.96094\\-75.77822\\-41\\90.82031\\-76.45139\\-41\\92.77344\\-76.92897\\-41\\94.72656\\-77.51825\\-41\\98.63281\\-78.47373\\-41\\100.5859\\-79.09748\\-41\\102.5391\\-79.86503\\-41\\104.4922\\-80.34686\\-41\\106.4453\\-81.04514\\-41\\108.3984\\-81.89969\\-41\\110.3516\\-82.49235\\-41\\112.3047\\-83.56486\\-41\\114.2578\\-84.39774\\-41\\116.2109\\-85.66822\\-41\\118.1641\\-86.51504\\-41\\120.1172\\-87.72729\\-41\\122.0703\\-88.52886\\-41\\125.9766\\-91.37109\\-41\\127.9297\\-92.62424\\-41\\131.8359\\-95.59608\\-41\\134.9432\\-98.69531\\-41\\137.6953\\-101.7679\\-41\\139.9421\\-104.5547\\-41\\142.4689\\-108.4609\\-41\\144.5877\\-112.3672\\-41\\145.8443\\-114.3203\\-41\\146.8039\\-116.2734\\-41\\147.9848\\-118.2266\\-41\\148.6848\\-120.1797\\-41\\149.6857\\-122.1328\\-41\\150.3849\\-124.0859\\-41\\151.2199\\-126.0391\\-41\\152.2003\\-127.9922\\-41\\152.9499\\-129.9453\\-41\\153.961\\-131.8984\\-41\\154.5274\\-133.8516\\-41\\155.4243\\-135.8047\\-41\\156.0106\\-137.7578\\-41\\156.35\\-139.7109\\-41\\156.8483\\-141.6641\\-41\\157.6732\\-143.6172\\-41\\158.5342\\-147.5234\\-41\\159.2319\\-149.4766\\-41\\159.759\\-151.4297\\-41\\160.3812\\-155.3359\\-41\\160.7461\\-157.2891\\-41\\161.2154\\-159.2422\\-41\\161.5588\\-161.1953\\-41\\161.9858\\-165.1016\\-41\\162.4165\\-172.9141\\-41\\162.9282\\-180.7266\\-41\\163.2136\\-184.6328\\-41\\163.3336\\-188.5391\\-41\\163.3719\\-192.4453\\-41\\163.3459\\-196.3516\\-41\\163.2425\\-200.2578\\-41\\163.0466\\-204.1641\\-41\\162.495\\-211.9766\\-41\\162.2771\\-215.8828\\-41\\161.9962\\-219.7891\\-41\\161.794\\-221.7422\\-41\\161.4873\\-223.6953\\-41\\160.4141\\-227.6016\\-41\\159.9866\\-229.5547\\-41\\159.4035\\-231.5078\\-41\\158.4982\\-233.4609\\-41\\157.9564\\-235.4141\\-41\\157.0948\\-237.3672\\-41\\156.35\\-239.3203\\-41\\155.7685\\-241.2734\\-41\\154.6671\\-243.2266\\-41\\153.8844\\-245.1797\\-41\\152.5967\\-247.1328\\-41\\151.4902\\-249.0859\\-41\\150.2646\\-251.0391\\-41\\148.8627\\-252.9922\\-41\\147.7389\\-254.9453\\-41\\145.5078\\-257.5141\\-41\\143.5547\\-259.8571\\-41\\141.0404\\-262.7578\\-41\\139.6484\\-264.0442\\-41\\135.2379\\-268.6172\\-41\\131.8359\\-271.5352\\-41\\129.8828\\-273.4607\\-41\\127.9297\\-275.1479\\-41\\125.9766\\-276.6219\\-41\\124.0234\\-277.9294\\-41\\120.1172\\-281.0512\\-41\\118.1641\\-282.1263\\-41\\116.2109\\-283.3345\\-41\\114.2578\\-284.6687\\-41\\112.3047\\-285.7263\\-41\\110.3516\\-286.9754\\-41\\106.4453\\-288.9458\\-41\\104.4922\\-289.6336\\-41\\102.5391\\-290.7433\\-41\\100.5859\\-291.3906\\-41\\98.63281\\-292.4415\\-41\\94.72656\\-293.7415\\-41\\92.77344\\-294.4929\\-41\\90.82031\\-294.9245\\-41\\86.91406\\-295.6566\\-41\\84.96094\\-296.2122\\-41\\83.00781\\-296.61\\-41\\81.05469\\-296.8445\\-41\\77.14844\\-297.1641\\-41\\73.24219\\-297.4258\\-41\\71.28906\\-297.4793\\-41\\67.38281\\-297.3928\\-41\\63.47656\\-297.0778\\-41\\59.57031\\-296.6849\\-41\\57.61719\\-295.952\\-41\\55.66406\\-295.4554\\-41\\53.71094\\-295.2468\\-41\\51.75781\\-294.9015\\-41\\49.80469\\-294.4103\\-41\\47.85156\\-293.5349\\-41\\45.89844\\-292.9244\\-41\\43.94531\\-292.2033\\-41\\41.99219\\-291.2867\\-41\\40.03906\\-290.7544\\-41\\38.08594\\-289.769\\-41\\36.13281\\-289.1667\\-41\\34.17969\\-288.6635\\-41\\32.22656\\-287.7849\\-41\\30.27344\\-287.1837\\-41\\26.36719\\-286.5341\\-41\\24.41406\\-286.4163\\-41\\22.46094\\-286.4553\\-41\\10.74219\\-287.1719\\-41\\8.789063\\-287.3378\\-41\\4.882813\\-287.5501\\-41\\-0.9765625\\-287.8051\\-41\\-6.835938\\-287.9547\\-41\\-10.74219\\-287.8835\\-41\\-26.36719\\-287.4775\\-41\\-28.32031\\-287.597\\-41\\-30.27344\\-287.9424\\-41\\-32.22656\\-288.1393\\-41\\-34.17969\\-288.6288\\-41\\-36.13281\\-289.3191\\-41\\-40.03906\\-290.9438\\-41\\-41.99219\\-291.5969\\-41\\-43.94531\\-292.6587\\-41\\-45.89844\\-293.3168\\-41\\-47.85156\\-294.2003\\-41\\-49.80469\\-294.6218\\-41\\-53.71094\\-295.802\\-41\\-55.66406\\-296.5408\\-41\\-59.57031\\-297.2388\\-41\\-61.52344\\-297.6947\\-41\\-63.47656\\-298.2606\\-41\\-65.42969\\-298.553\\-41\\-69.33594\\-298.8564\\-41\\-73.24219\\-298.9554\\-41\\-77.14844\\-298.8665\\-41\\-81.05469\\-298.6037\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "321" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "106" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-298.0757\\-39\\-84.96094\\-297.5066\\-39\\-88.86719\\-296.8108\\-39\\-90.82031\\-296.3448\\-39\\-92.77344\\-295.5232\\-39\\-96.67969\\-294.4529\\-39\\-98.63281\\-293.3745\\-39\\-100.5859\\-292.5744\\-39\\-102.5391\\-291.3265\\-39\\-104.4922\\-290.4404\\-39\\-106.4453\\-289.2395\\-39\\-108.3984\\-288.3944\\-39\\-112.3047\\-285.8274\\-39\\-114.2578\\-284.7097\\-39\\-118.1641\\-282.0111\\-39\\-120.1172\\-280.8598\\-39\\-122.0703\\-279.2734\\-39\\-124.0234\\-277.554\\-39\\-125.9766\\-275.9484\\-39\\-127.9297\\-274.5966\\-39\\-129.8828\\-272.7991\\-39\\-131.8359\\-270.8633\\-39\\-134.2995\\-268.6172\\-39\\-136.1047\\-266.6641\\-39\\-137.6701\\-264.7109\\-39\\-141.0407\\-260.8047\\-39\\-142.5529\\-258.8516\\-39\\-143.9495\\-256.8984\\-39\\-145.1823\\-254.9453\\-39\\-145.5078\\-254.5851\\-39\\-147.9883\\-251.0391\\-39\\-148.912\\-249.0859\\-39\\-150.1038\\-247.1328\\-39\\-150.9088\\-245.1797\\-39\\-152.1317\\-243.2266\\-39\\-154.0868\\-239.3203\\-39\\-154.7885\\-237.3672\\-39\\-155.7651\\-235.4141\\-39\\-156.8964\\-231.5078\\-39\\-157.8103\\-229.5547\\-39\\-158.3448\\-227.6016\\-39\\-159.8217\\-223.6953\\-39\\-160.2665\\-221.7422\\-39\\-160.8095\\-219.7891\\-39\\-161.4763\\-217.8359\\-39\\-161.8743\\-215.8828\\-39\\-162.384\\-211.9766\\-39\\-162.7077\\-210.0234\\-39\\-163.2146\\-208.0703\\-39\\-163.6169\\-206.1172\\-39\\-163.8597\\-204.1641\\-39\\-164.4323\\-198.3047\\-39\\-165.2261\\-192.4453\\-39\\-165.3959\\-190.4922\\-39\\-165.5804\\-186.5859\\-39\\-165.6567\\-182.6797\\-39\\-165.564\\-176.8203\\-39\\-165.332\\-172.9141\\-39\\-165.1476\\-170.9609\\-39\\-164.6071\\-167.0547\\-39\\-163.7684\\-159.2422\\-39\\-163.4069\\-157.2891\\-39\\-162.8183\\-155.3359\\-39\\-162.4122\\-153.3828\\-39\\-161.7776\\-149.4766\\-39\\-161.1866\\-147.5234\\-39\\-160.4221\\-145.5703\\-39\\-159.8687\\-143.6172\\-39\\-158.9715\\-141.6641\\-39\\-157.4892\\-137.7578\\-39\\-156.4851\\-135.8047\\-39\\-155.9092\\-133.8516\\-39\\-154.9099\\-131.8984\\-39\\-154.2076\\-129.9453\\-39\\-153.3203\\-127.9818\\-39\\-151.3672\\-124.5742\\-39\\-151.0272\\-124.0859\\-39\\-150.148\\-122.1328\\-39\\-149.091\\-120.1797\\-39\\-148.2737\\-118.2266\\-39\\-147.0414\\-116.2734\\-39\\-146.1014\\-114.3203\\-39\\-144.7132\\-112.3672\\-39\\-143.7396\\-110.4141\\-39\\-141.6016\\-107.0701\\-39\\-139.9065\\-104.5547\\-39\\-137.6953\\-101.6875\\-39\\-133.5112\\-96.74219\\-39\\-129.0376\\-92.83594\\-39\\-127.9297\\-91.95113\\-39\\-125.9766\\-90.56627\\-39\\-122.0703\\-88.14975\\-39\\-120.1172\\-87.24783\\-39\\-115.9882\\-85.02344\\-39\\-112.3047\\-83.72356\\-39\\-108.3984\\-82.08064\\-39\\-106.4453\\-81.62279\\-39\\-104.4922\\-80.61866\\-39\\-102.5391\\-80.29757\\-39\\-100.5859\\-79.59034\\-39\\-98.63281\\-79.27074\\-39\\-94.72656\\-78.32067\\-39\\-92.77344\\-78.04043\\-39\\-90.82031\\-77.63524\\-39\\-88.86719\\-77.03655\\-39\\-86.91406\\-76.59806\\-39\\-84.96094\\-76.3961\\-39\\-81.05469\\-76.1226\\-39\\-77.14844\\-75.92337\\-39\\-75.19531\\-75.74937\\-39\\-73.24219\\-75.69862\\-39\\-69.33594\\-75.43329\\-39\\-67.38281\\-75.40508\\-39\\-65.42969\\-75.21498\\-39\\-63.47656\\-75.23212\\-39\\-61.52344\\-75.43193\\-39\\-55.66406\\-75.73949\\-39\\-53.71094\\-75.77908\\-39\\-49.80469\\-75.99928\\-39\\-45.89844\\-76.12124\\-39\\-43.94531\\-76.23438\\-39\\-40.03906\\-76.57026\\-39\\-36.13281\\-77.08796\\-39\\-34.17969\\-77.56303\\-39\\-30.27344\\-78.36855\\-39\\-28.32031\\-78.90498\\-39\\-26.36719\\-79.68888\\-39\\-22.46094\\-80.86929\\-39\\-20.50781\\-81.86281\\-39\\-18.55469\\-82.65279\\-39\\-14.79492\\-85.02344\\-39\\-12.69531\\-86.51323\\-39\\-10.74219\\-88.06394\\-39\\-8.789063\\-89.80789\\-39\\-6.835938\\-91.75475\\-39\\-4.882813\\-93.43519\\-39\\-2.929688\\-95.00879\\-39\\-0.9765625\\-96.32366\\-39\\0.9765625\\-96.65955\\-39\\2.929688\\-95.53152\\-39\\4.882813\\-93.8323\\-39\\6.248191\\-92.83594\\-39\\6.835938\\-92.2427\\-39\\7.780793\\-90.88281\\-39\\10.74219\\-87.87231\\-39\\14.64844\\-84.22443\\-39\\16.60156\\-82.73529\\-39\\18.55469\\-81.67819\\-39\\20.50781\\-80.51573\\-39\\22.46094\\-79.67986\\-39\\24.41406\\-78.657\\-39\\28.32031\\-77.08887\\-39\\30.27344\\-76.39407\\-39\\34.17969\\-75.59041\\-39\\36.13281\\-74.82963\\-39\\38.08594\\-74.52701\\-39\\41.99219\\-74.24616\\-39\\44.30213\\-73.30469\\-39\\45.89844\\-72.81641\\-39\\51.75781\\-72.73502\\-39\\61.52344\\-72.74275\\-39\\67.38281\\-72.84272\\-39\\69.33594\\-73.03416\\-39\\71.28906\\-74.03377\\-39\\73.24219\\-74.26955\\-39\\79.10156\\-74.59138\\-39\\81.05469\\-74.79868\\-39\\83.00781\\-75.13261\\-39\\84.96094\\-75.65793\\-39\\88.86719\\-76.17659\\-39\\90.82031\\-76.3695\\-39\\92.77344\\-76.75255\\-39\\94.72656\\-77.35045\\-39\\98.63281\\-78.35026\\-39\\100.5859\\-78.97706\\-39\\102.5391\\-79.78832\\-39\\106.4453\\-80.91279\\-39\\108.3984\\-81.86213\\-39\\110.3516\\-82.43456\\-39\\112.3047\\-83.48792\\-39\\114.2578\\-84.33926\\-39\\116.2109\\-85.57682\\-39\\118.1641\\-86.44568\\-39\\120.1172\\-87.61261\\-39\\122.0703\\-88.4131\\-39\\122.6957\\-88.92969\\-39\\125.9766\\-91.28017\\-39\\127.9297\\-92.57685\\-39\\131.8359\\-95.46624\\-39\\133.191\\-96.74219\\-39\\134.9958\\-98.69531\\-39\\137.6953\\-101.9312\\-39\\139.6719\\-104.5547\\-39\\142.3029\\-108.4609\\-39\\143.2028\\-110.4141\\-39\\143.5547\\-110.8974\\-39\\145.5155\\-114.3203\\-39\\147.6835\\-118.2266\\-39\\149.3109\\-122.1328\\-39\\150.2131\\-124.0859\\-39\\150.8557\\-126.0391\\-39\\151.9294\\-127.9922\\-39\\152.6593\\-129.9453\\-39\\153.6549\\-131.8984\\-39\\154.9746\\-135.8047\\-39\\155.7856\\-137.7578\\-39\\156.5376\\-141.6641\\-39\\157.897\\-145.5703\\-39\\158.7656\\-149.4766\\-39\\159.4388\\-151.4297\\-39\\159.878\\-153.3828\\-39\\160.4572\\-157.2891\\-39\\161.2576\\-161.1953\\-39\\161.592\\-163.1484\\-39\\161.9555\\-167.0547\\-39\\162.1868\\-170.9609\\-39\\162.8327\\-184.6328\\-39\\162.9572\\-188.5391\\-39\\163.0007\\-192.4453\\-39\\162.9715\\-196.3516\\-39\\162.873\\-200.2578\\-39\\162.6206\\-206.1172\\-39\\162.2514\\-213.9297\\-39\\161.9843\\-217.8359\\-39\\161.5588\\-221.7422\\-39\\160.5963\\-225.6484\\-39\\159.77\\-229.5547\\-39\\158.965\\-231.5078\\-39\\158.2585\\-233.4609\\-39\\157.7002\\-235.4141\\-39\\156.7317\\-237.3672\\-39\\156.1726\\-239.3203\\-39\\155.4627\\-241.2734\\-39\\154.4355\\-243.2266\\-39\\153.5301\\-245.1797\\-39\\151.3672\\-248.6469\\-39\\151.0127\\-249.0859\\-39\\149.9865\\-251.0391\\-39\\147.4609\\-254.6597\\-39\\145.6889\\-256.8984\\-39\\142.4187\\-260.8047\\-39\\140.6181\\-262.7578\\-39\\139.6484\\-263.6293\\-39\\134.7656\\-268.6172\\-39\\131.8359\\-271.2022\\-39\\129.8828\\-273.062\\-39\\127.9297\\-274.7323\\-39\\125.9766\\-276.0204\\-39\\124.0234\\-277.5155\\-39\\122.0703\\-279.1403\\-39\\120.1172\\-280.5978\\-39\\118.1641\\-281.7072\\-39\\116.2109\\-282.9848\\-39\\114.2578\\-284.0484\\-39\\110.8221\\-286.1953\\-39\\110.3516\\-286.5573\\-39\\108.3984\\-287.4655\\-39\\106.4453\\-288.5848\\-39\\104.4922\\-289.2724\\-39\\102.5391\\-290.2523\\-39\\98.63281\\-291.7786\\-39\\96.67969\\-292.7372\\-39\\94.72656\\-293.292\\-39\\90.82031\\-294.6609\\-39\\86.91406\\-295.3246\\-39\\84.96094\\-295.7059\\-39\\83.00781\\-296.2609\\-39\\81.05469\\-296.5904\\-39\\77.14844\\-296.9427\\-39\\73.24219\\-297.1533\\-39\\71.28906\\-297.1953\\-39\\67.38281\\-297.1403\\-39\\61.52344\\-296.7368\\-39\\59.57031\\-296.4713\\-39\\55.66406\\-295.4242\\-39\\51.75781\\-294.795\\-39\\49.80469\\-294.2779\\-39\\47.85156\\-293.4337\\-39\\45.89844\\-292.8779\\-39\\43.94531\\-292.1901\\-39\\41.99219\\-291.3354\\-39\\40.03906\\-290.8263\\-39\\36.13281\\-289.2907\\-39\\34.17969\\-288.9184\\-39\\32.22656\\-288.3795\\-39\\30.27344\\-287.7046\\-39\\28.32031\\-287.3387\\-39\\26.36719\\-287.1597\\-39\\24.41406\\-287.1476\\-39\\18.55469\\-287.3947\\-39\\14.64844\\-287.6885\\-39\\10.74219\\-288.0426\\-39\\8.789063\\-288.2845\\-39\\4.882813\\-288.5865\\-39\\0.9765625\\-288.6716\\-39\\-0.9765625\\-288.7883\\-39\\-4.882813\\-288.8677\\-39\\-8.789063\\-288.8677\\-39\\-14.64844\\-288.8061\\-39\\-22.46094\\-288.6613\\-39\\-26.36719\\-288.5435\\-39\\-28.32031\\-288.5752\\-39\\-32.22656\\-288.8556\\-39\\-34.17969\\-289.1317\\-39\\-36.13281\\-289.6713\\-39\\-38.08594\\-290.4227\\-39\\-41.99219\\-291.6966\\-39\\-43.94531\\-292.6781\\-39\\-45.89844\\-293.2656\\-39\\-47.85156\\-294.1463\\-39\\-49.80469\\-294.7402\\-39\\-53.71094\\-295.6052\\-39\\-55.66406\\-296.3556\\-39\\-57.61719\\-296.7881\\-39\\-61.52344\\-297.4289\\-39\\-65.42969\\-298.3579\\-39\\-67.38281\\-298.5599\\-39\\-71.28906\\-298.7838\\-39\\-75.19531\\-298.7721\\-39\\-79.10156\\-298.5905\\-39\\-81.05469\\-298.4109\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "327" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "107" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-298.1011\\-37\\-84.96094\\-297.2611\\-37\\-88.86719\\-296.6445\\-37\\-92.77344\\-295.3205\\-37\\-94.72656\\-294.8712\\-37\\-96.67969\\-294.1365\\-37\\-98.63281\\-293.1392\\-37\\-100.5859\\-292.2417\\-37\\-102.5391\\-291.0941\\-37\\-106.4453\\-289.0886\\-37\\-110.3516\\-286.9414\\-37\\-112.3047\\-285.5384\\-37\\-114.2578\\-284.4038\\-37\\-118.1641\\-281.7595\\-37\\-120.1172\\-280.5783\\-37\\-122.0703\\-279.0401\\-37\\-125.9766\\-275.7461\\-37\\-127.6618\\-274.4766\\-37\\-129.8239\\-272.5234\\-37\\-131.8449\\-270.5703\\-37\\-133.7891\\-268.9017\\-37\\-135.8794\\-266.6641\\-37\\-137.3849\\-264.7109\\-37\\-139.072\\-262.7578\\-37\\-140.8803\\-260.8047\\-37\\-142.4647\\-258.8516\\-37\\-145.0027\\-254.9453\\-37\\-145.5078\\-254.3731\\-37\\-147.8419\\-251.0391\\-37\\-148.7872\\-249.0859\\-37\\-149.9859\\-247.1328\\-37\\-150.76\\-245.1797\\-37\\-152.0048\\-243.2266\\-37\\-152.8799\\-241.2734\\-37\\-153.9502\\-239.3203\\-37\\-154.6161\\-237.3672\\-37\\-155.6085\\-235.4141\\-37\\-156.2032\\-233.4609\\-37\\-156.6749\\-231.5078\\-37\\-157.6233\\-229.5547\\-37\\-158.7629\\-225.6484\\-37\\-159.6263\\-223.6953\\-37\\-160.5457\\-219.7891\\-37\\-161.1862\\-217.8359\\-37\\-161.6989\\-215.8828\\-37\\-162.0094\\-213.9297\\-37\\-162.4577\\-210.0234\\-37\\-162.8079\\-208.0703\\-37\\-163.3212\\-206.1172\\-37\\-163.6516\\-204.1641\\-37\\-163.8787\\-202.2109\\-37\\-164.2087\\-198.3047\\-37\\-164.9699\\-190.4922\\-37\\-165.2982\\-186.5859\\-37\\-165.3752\\-182.6797\\-37\\-165.3209\\-178.7734\\-37\\-165.2385\\-176.8203\\-37\\-164.7289\\-170.9609\\-37\\-164.3175\\-167.0547\\-37\\-163.8143\\-161.1953\\-37\\-163.5164\\-159.2422\\-37\\-162.9697\\-157.2891\\-37\\-162.5216\\-155.3359\\-37\\-161.9416\\-151.4297\\-37\\-161.5167\\-149.4766\\-37\\-160.7759\\-147.5234\\-37\\-159.5938\\-143.6172\\-37\\-158.5891\\-141.6641\\-37\\-157.9765\\-139.7109\\-37\\-157.0087\\-137.7578\\-37\\-155.6512\\-133.8516\\-37\\-154.6374\\-131.8984\\-37\\-153.9898\\-129.9453\\-37\\-152.9339\\-127.9922\\-37\\-151.9783\\-126.0391\\-37\\-150.7399\\-124.0859\\-37\\-149.9485\\-122.1328\\-37\\-148.857\\-120.1797\\-37\\-148.0562\\-118.2266\\-37\\-146.7829\\-116.2734\\-37\\-145.8244\\-114.3203\\-37\\-144.5018\\-112.3672\\-37\\-142.3112\\-108.4609\\-37\\-139.6484\\-104.6192\\-37\\-137.6953\\-101.9312\\-37\\-133.7891\\-97.16787\\-37\\-131.8359\\-95.3648\\-37\\-128.9469\\-92.83594\\-37\\-125.9766\\-90.60085\\-37\\-122.0703\\-88.15768\\-37\\-120.1172\\-87.20681\\-37\\-115.9494\\-85.02344\\-37\\-114.2578\\-84.48522\\-37\\-112.3047\\-83.70606\\-37\\-110.3516\\-82.77892\\-37\\-108.3984\\-82.04132\\-37\\-106.4453\\-81.6264\\-37\\-104.4922\\-80.65314\\-37\\-102.5391\\-80.29086\\-37\\-100.5859\\-79.57484\\-37\\-98.63281\\-79.20652\\-37\\-94.72656\\-78.18099\\-37\\-92.77344\\-77.90417\\-37\\-90.82031\\-77.52483\\-37\\-86.91406\\-76.48186\\-37\\-84.96094\\-76.30151\\-37\\-77.14844\\-75.82961\\-37\\-75.19531\\-75.63605\\-37\\-73.24219\\-75.29816\\-37\\-69.33594\\-75.02757\\-37\\-65.42969\\-74.96875\\-37\\-61.52344\\-75\\-37\\-53.71094\\-75.39063\\-37\\-51.75781\\-75.72252\\-37\\-49.80469\\-75.84\\-37\\-45.89844\\-75.96749\\-37\\-41.99219\\-76.21098\\-37\\-38.08594\\-76.53345\\-37\\-36.13281\\-76.76172\\-37\\-34.17969\\-77.17338\\-37\\-28.32031\\-78.56264\\-37\\-26.36719\\-79.32554\\-37\\-22.46094\\-80.56009\\-37\\-20.50781\\-81.54398\\-37\\-18.55469\\-82.31862\\-37\\-16.60156\\-83.52786\\-37\\-14.64844\\-84.62007\\-37\\-12.69531\\-86.12885\\-37\\-9.343552\\-88.92969\\-37\\-4.882813\\-92.84489\\-37\\-0.9765625\\-95.76563\\-37\\0.9765625\\-96.11845\\-37\\2.929688\\-95.11701\\-37\\4.882813\\-93.92446\\-37\\6.240234\\-94.78906\\-37\\6.835938\\-95.36185\\-37\\7.768111\\-96.74219\\-37\\8.209229\\-98.69531\\-37\\8.310355\\-102.6016\\-37\\9.350586\\-104.5547\\-37\\10.74219\\-105.6754\\-37\\12.69531\\-105.6487\\-37\\14.64844\\-104.3634\\-37\\15.61945\\-102.6016\\-37\\15.55287\\-100.6484\\-37\\14.67226\\-98.69531\\-37\\12.41757\\-96.74219\\-37\\8.789063\\-93.44176\\-37\\7.960839\\-92.83594\\-37\\7.618481\\-90.88281\\-37\\9.413775\\-88.92969\\-37\\11.51316\\-86.97656\\-37\\14.64844\\-83.95387\\-37\\16.60156\\-82.41263\\-37\\18.55469\\-81.45972\\-37\\20.50781\\-80.28104\\-37\\22.46094\\-79.45042\\-37\\24.41406\\-78.46974\\-37\\26.36719\\-77.67942\\-37\\28.32031\\-76.79143\\-37\\30.27344\\-76.25224\\-37\\32.22656\\-75.87756\\-37\\34.17969\\-75.2146\\-37\\36.13281\\-74.68874\\-37\\38.08594\\-74.43053\\-37\\40.03906\\-74.29309\\-37\\42.06731\\-73.30469\\-37\\43.94531\\-72.86079\\-37\\45.89844\\-72.77455\\-37\\53.71094\\-72.67616\\-37\\61.52344\\-72.69763\\-37\\65.42969\\-72.74275\\-37\\69.33594\\-72.87\\-37\\71.28906\\-73.16925\\-37\\73.24219\\-74.10484\\-37\\75.19531\\-74.3172\\-37\\79.10156\\-74.49052\\-37\\83.00781\\-74.91179\\-37\\84.96094\\-75.48891\\-37\\86.91406\\-75.84872\\-37\\90.82031\\-76.29832\\-37\\92.77344\\-76.60547\\-37\\96.67969\\-77.75415\\-37\\98.63281\\-78.20494\\-37\\100.5859\\-78.87109\\-37\\102.5391\\-79.73213\\-37\\106.4453\\-80.84551\\-37\\108.3984\\-81.81205\\-37\\110.3516\\-82.38357\\-37\\112.3047\\-83.43323\\-37\\114.2578\\-84.29388\\-37\\116.2109\\-85.52811\\-37\\118.1641\\-86.39573\\-37\\120.1172\\-87.54124\\-37\\122.0703\\-88.37263\\-37\\125.9766\\-91.24476\\-37\\127.9297\\-92.47912\\-37\\131.8359\\-95.45225\\-37\\133.2645\\-96.74219\\-37\\135.026\\-98.69531\\-37\\138.0208\\-102.6016\\-37\\142.1336\\-108.4609\\-37\\142.9228\\-110.4141\\-37\\144.2119\\-112.3672\\-37\\145.1381\\-114.3203\\-37\\146.3487\\-116.2734\\-37\\148.2706\\-120.1797\\-37\\148.9996\\-122.1328\\-37\\150.0038\\-124.0859\\-37\\150.5896\\-126.0391\\-37\\151.6164\\-127.9922\\-37\\154.091\\-133.8516\\-37\\154.6287\\-135.8047\\-37\\155.4794\\-137.7578\\-37\\156.0059\\-139.7109\\-37\\156.7948\\-143.6172\\-37\\157.606\\-145.5703\\-37\\158.4565\\-149.4766\\-37\\158.9774\\-151.4297\\-37\\159.6354\\-153.3828\\-37\\160.5305\\-159.2422\\-37\\161.2992\\-163.1484\\-37\\161.7859\\-167.0547\\-37\\162.0564\\-170.9609\\-37\\162.4005\\-178.7734\\-37\\162.6541\\-188.5391\\-37\\162.6886\\-192.4453\\-37\\162.6438\\-198.3047\\-37\\162.4329\\-206.1172\\-37\\162.2172\\-211.9766\\-37\\161.9792\\-215.8828\\-37\\161.6018\\-219.7891\\-37\\161.2297\\-221.7422\\-37\\160.7357\\-223.6953\\-37\\159.97\\-227.6016\\-37\\159.4945\\-229.5547\\-37\\158.6042\\-231.5078\\-37\\158.0445\\-233.4609\\-37\\157.3752\\-235.4141\\-37\\156.5048\\-237.3672\\-37\\155.9854\\-239.3203\\-37\\154.2022\\-243.2266\\-37\\152.0091\\-247.1328\\-37\\150.6797\\-249.0859\\-37\\149.6353\\-251.0391\\-37\\148.3629\\-252.9922\\-37\\145.1698\\-256.8984\\-37\\142.1044\\-260.8047\\-37\\140.2533\\-262.7578\\-37\\138.2082\\-264.7109\\-37\\135.7422\\-267.3175\\-37\\133.7891\\-269.1722\\-37\\132.0693\\-270.5703\\-37\\129.8828\\-272.532\\-37\\127.5866\\-274.4766\\-37\\125.9766\\-275.6523\\-37\\122.0703\\-278.6785\\-37\\118.1641\\-281.3313\\-37\\116.2109\\-282.5798\\-37\\114.2578\\-283.5383\\-37\\112.3047\\-284.8636\\-37\\110.3516\\-285.903\\-37\\108.3984\\-287.089\\-37\\104.4922\\-288.9757\\-37\\102.5391\\-289.6099\\-37\\100.5859\\-290.6637\\-37\\98.63281\\-291.3006\\-37\\96.67969\\-292.2679\\-37\\94.72656\\-292.9429\\-37\\92.77344\\-293.5012\\-37\\90.82031\\-294.3195\\-37\\88.86719\\-294.7879\\-37\\84.96094\\-295.3585\\-37\\83.00781\\-295.7186\\-37\\81.05469\\-296.2122\\-37\\79.10156\\-296.5286\\-37\\77.14844\\-296.7345\\-37\\73.24219\\-296.9324\\-37\\67.38281\\-296.9273\\-37\\63.47656\\-296.7235\\-37\\61.52344\\-296.5286\\-37\\59.57031\\-296.1607\\-37\\57.61719\\-295.6448\\-37\\53.71094\\-294.9346\\-37\\51.75781\\-294.669\\-37\\49.80469\\-294.0898\\-37\\47.85156\\-293.3248\\-37\\45.89844\\-292.8308\\-37\\43.94531\\-292.1768\\-37\\41.99219\\-291.3587\\-37\\40.03906\\-290.9037\\-37\\38.08594\\-290.2913\\-37\\36.13281\\-289.4773\\-37\\32.22656\\-288.7799\\-37\\28.32031\\-288.0012\\-37\\26.36719\\-287.8134\\-37\\24.41406\\-287.8017\\-37\\14.64844\\-288.6297\\-37\\10.74219\\-288.8792\\-37\\4.882813\\-289.1813\\-37\\2.929688\\-289.2314\\-37\\0.9765625\\-289.1443\\-37\\-0.9765625\\-289.3907\\-37\\-4.882813\\-289.4929\\-37\\-8.789063\\-289.5022\\-37\\-14.64844\\-289.4351\\-37\\-20.50781\\-289.3037\\-37\\-28.32031\\-289.1987\\-37\\-32.22656\\-289.3116\\-37\\-34.17969\\-289.5732\\-37\\-38.08594\\-290.7472\\-37\\-40.03906\\-291.1906\\-37\\-41.99219\\-291.848\\-37\\-43.94531\\-292.7147\\-37\\-45.89844\\-293.2299\\-37\\-47.85156\\-294.0457\\-37\\-49.80469\\-294.7054\\-37\\-53.71094\\-295.4563\\-37\\-55.66406\\-296.1175\\-37\\-57.61719\\-296.6445\\-37\\-61.52344\\-297.2244\\-37\\-63.47656\\-297.5885\\-37\\-65.42969\\-298.0757\\-37\\-67.38281\\-298.376\\-37\\-71.28906\\-298.6073\\-37\\-75.19531\\-298.6102\\-37\\-79.10156\\-298.3849\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "321" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "108" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-79.10156\\-298.0757\\-35\\-81.05469\\-297.642\\-35\\-86.91406\\-296.818\\-35\\-88.86719\\-296.4201\\-35\\-90.82031\\-295.6425\\-35\\-94.72656\\-294.6568\\-35\\-96.67969\\-293.7377\\-35\\-98.63281\\-292.921\\-35\\-100.5859\\-291.7766\\-35\\-102.5391\\-290.8924\\-35\\-104.4922\\-289.6761\\-35\\-106.4453\\-288.9135\\-35\\-108.3984\\-287.6805\\-35\\-110.3516\\-286.7192\\-35\\-111.0053\\-286.1953\\-35\\-114.2578\\-283.9684\\-35\\-116.2109\\-282.9034\\-35\\-119.9544\\-280.3359\\-35\\-122.0703\\-278.7853\\-35\\-127.3548\\-274.4766\\-35\\-129.4728\\-272.5234\\-35\\-131.8359\\-270.2448\\-35\\-133.7891\\-268.5754\\-35\\-135.7422\\-266.4793\\-35\\-137.0959\\-264.7109\\-35\\-140.7439\\-260.8047\\-35\\-142.3404\\-258.8516\\-35\\-144.8632\\-254.9453\\-35\\-146.363\\-252.9922\\-35\\-147.6755\\-251.0391\\-35\\-148.6391\\-249.0859\\-35\\-149.8336\\-247.1328\\-35\\-150.6257\\-245.1797\\-35\\-151.8585\\-243.2266\\-35\\-152.6908\\-241.2734\\-35\\-153.8086\\-239.3203\\-35\\-154.4766\\-237.3672\\-35\\-155.3897\\-235.4141\\-35\\-156.1062\\-233.4609\\-35\\-156.5256\\-231.5078\\-35\\-157.362\\-229.5547\\-35\\-158.0363\\-227.6016\\-35\\-158.5414\\-225.6484\\-35\\-159.3541\\-223.6953\\-35\\-159.907\\-221.7422\\-35\\-160.8297\\-217.8359\\-35\\-161.4873\\-215.8828\\-35\\-161.8381\\-213.9297\\-35\\-162.5252\\-208.0703\\-35\\-163.3699\\-204.1641\\-35\\-163.6801\\-202.2109\\-35\\-164.1865\\-196.3516\\-35\\-164.8353\\-186.5859\\-35\\-164.9429\\-182.6797\\-35\\-164.8883\\-178.7734\\-35\\-164.4238\\-170.9609\\-35\\-163.8143\\-163.1484\\-35\\-163.5489\\-161.1953\\-35\\-162.6075\\-157.2891\\-35\\-162.0739\\-153.3828\\-35\\-161.74\\-151.4297\\-35\\-161.1559\\-149.4766\\-35\\-160.4411\\-147.5234\\-35\\-159.9255\\-145.5703\\-35\\-158.3134\\-141.6641\\-35\\-157.6941\\-139.7109\\-35\\-156.633\\-137.7578\\-35\\-156.1166\\-135.8047\\-35\\-155.298\\-133.8516\\-35\\-154.3818\\-131.8984\\-35\\-153.6969\\-129.9453\\-35\\-152.6062\\-127.9922\\-35\\-151.6811\\-126.0391\\-35\\-150.4369\\-124.0859\\-35\\-149.6878\\-122.1328\\-35\\-148.6087\\-120.1797\\-35\\-147.7286\\-118.2266\\-35\\-146.5428\\-116.2734\\-35\\-144.3224\\-112.3672\\-35\\-143.0325\\-110.4141\\-35\\-142.1274\\-108.4609\\-35\\-139.2865\\-104.5547\\-35\\-137.9428\\-102.6016\\-35\\-134.9273\\-98.69531\\-35\\-133.7891\\-97.33135\\-35\\-131.8359\\-95.46683\\-35\\-128.8152\\-92.83594\\-35\\-125.9766\\-90.6875\\-35\\-122.0703\\-88.17386\\-35\\-115.8447\\-85.02344\\-35\\-114.2578\\-84.50976\\-35\\-110.3516\\-82.70891\\-35\\-108.3984\\-82.02116\\-35\\-106.4453\\-81.63006\\-35\\-104.4922\\-80.68552\\-35\\-102.5391\\-80.29086\\-35\\-100.5859\\-79.64471\\-35\\-96.67969\\-78.61011\\-35\\-94.72656\\-77.98263\\-35\\-90.82031\\-77.3125\\-35\\-86.91406\\-76.38959\\-35\\-77.14844\\-75.71934\\-35\\-75.19531\\-75.18204\\-35\\-73.24219\\-74.95554\\-35\\-65.42969\\-74.80209\\-35\\-61.52344\\-74.79108\\-35\\-55.66406\\-74.97105\\-35\\-53.71094\\-74.95067\\-35\\-49.80469\\-75.64707\\-35\\-47.85156\\-75.77559\\-35\\-43.94531\\-75.93069\\-35\\-40.03906\\-76.18268\\-35\\-36.13281\\-76.53766\\-35\\-34.17969\\-76.82163\\-35\\-28.32031\\-78.31026\\-35\\-26.36719\\-78.95236\\-35\\-24.41406\\-79.75651\\-35\\-22.46094\\-80.35369\\-35\\-18.55469\\-82.09375\\-35\\-14.64844\\-84.2797\\-35\\-12.69531\\-85.84056\\-35\\-10.74219\\-87.54564\\-35\\-8.789063\\-88.90421\\-35\\-6.835938\\-90.45284\\-35\\-4.882813\\-92.3064\\-35\\-2.929688\\-93.88226\\-35\\-0.9765625\\-95.16528\\-35\\0.9765625\\-95.73975\\-35\\2.929688\\-94.57813\\-35\\4.882813\\-93.73689\\-35\\6.177145\\-94.78906\\-35\\6.835938\\-95.52364\\-35\\7.665427\\-96.74219\\-35\\8.215616\\-98.69531\\-35\\8.195466\\-100.6484\\-35\\7.8125\\-102.6016\\-35\\8.375\\-104.5547\\-35\\8.789063\\-105.0048\\-35\\10.74219\\-106.2934\\-35\\12.69531\\-106.062\\-35\\14.51994\\-104.5547\\-35\\15.44009\\-102.6016\\-35\\15.45367\\-100.6484\\-35\\14.62296\\-98.69531\\-35\\12.69531\\-96.71375\\-35\\11.18201\\-94.78906\\-35\\7.521609\\-90.88281\\-35\\9.190286\\-88.92969\\-35\\14.64844\\-83.7417\\-35\\16.60156\\-82.19456\\-35\\18.55469\\-81.09236\\-35\\24.41406\\-78.1814\\-35\\26.36719\\-77.44965\\-35\\28.32031\\-76.57489\\-35\\32.22656\\-75.63017\\-35\\34.17969\\-74.87173\\-35\\36.13281\\-74.54818\\-35\\40.03906\\-74.15841\\-35\\41.99219\\-72.89829\\-35\\43.94531\\-72.74275\\-35\\47.85156\\-72.62606\\-35\\49.80469\\-72.65191\\-35\\51.75781\\-72.3691\\-35\\55.66406\\-72.59789\\-35\\57.61719\\-72.65535\\-35\\63.47656\\-72.67616\\-35\\67.38281\\-72.75057\\-35\\71.28906\\-72.90796\\-35\\73.24219\\-73.92035\\-35\\75.19531\\-74.25786\\-35\\79.10156\\-74.44297\\-35\\83.00781\\-74.80991\\-35\\84.96094\\-75.38957\\-35\\86.91406\\-75.80595\\-35\\92.77344\\-76.5205\\-35\\96.67969\\-77.69922\\-35\\98.63281\\-78.14681\\-35\\100.5859\\-78.82797\\-35\\102.5391\\-79.7066\\-35\\106.4453\\-80.80842\\-35\\108.3984\\-81.77873\\-35\\110.3516\\-82.35171\\-35\\112.3047\\-83.38686\\-35\\114.2578\\-84.25246\\-35\\116.2109\\-85.51832\\-35\\118.1641\\-86.3523\\-35\\120.1172\\-87.54677\\-35\\122.0703\\-88.34375\\-35\\125.9766\\-91.21302\\-35\\128.6669\\-92.83594\\-35\\129.8828\\-93.75463\\-35\\131.8359\\-95.43756\\-35\\133.7891\\-97.34126\\-35\\134.9915\\-98.69531\\-35\\137.8439\\-102.6016\\-35\\139.1314\\-104.5547\\-35\\140.5956\\-106.5078\\-35\\141.9271\\-108.4609\\-35\\142.7624\\-110.4141\\-35\\143.9386\\-112.3672\\-35\\144.8025\\-114.3203\\-35\\146.104\\-116.2734\\-35\\146.9322\\-118.2266\\-35\\148.0456\\-120.1797\\-35\\148.7311\\-122.1328\\-35\\149.6983\\-124.0859\\-35\\150.4025\\-126.0391\\-35\\151.207\\-127.9922\\-35\\152.2132\\-129.9453\\-35\\152.8971\\-131.8984\\-35\\153.8847\\-133.8516\\-35\\155.0058\\-137.7578\\-35\\155.7549\\-139.7109\\-35\\156.2032\\-141.6641\\-35\\156.5222\\-143.6172\\-35\\157.8475\\-147.5234\\-35\\158.6143\\-151.4297\\-35\\159.2463\\-153.3828\\-35\\159.7448\\-155.3359\\-35\\160.2875\\-159.2422\\-35\\160.9043\\-163.1484\\-35\\161.3123\\-165.1016\\-35\\161.586\\-167.0547\\-35\\161.927\\-170.9609\\-35\\162.2652\\-178.7734\\-35\\162.4005\\-184.6328\\-35\\162.4656\\-190.4922\\-35\\162.4533\\-196.3516\\-35\\162.4005\\-202.2109\\-35\\162.2463\\-208.0703\\-35\\162.08\\-211.9766\\-35\\161.814\\-215.8828\\-35\\161.3253\\-219.7891\\-35\\160.8276\\-221.7422\\-35\\160.4385\\-223.6953\\-35\\159.7602\\-227.6016\\-35\\158.3538\\-231.5078\\-35\\157.8547\\-233.4609\\-35\\156.9589\\-235.4141\\-35\\155.7651\\-239.3203\\-35\\154.739\\-241.2734\\-35\\153.9612\\-243.2266\\-35\\152.7491\\-245.1797\\-35\\151.7263\\-247.1328\\-35\\149.1623\\-251.0391\\-35\\148.0841\\-252.9922\\-35\\146.5093\\-254.9453\\-35\\144.7511\\-256.8984\\-35\\143.1393\\-258.8516\\-35\\141.66\\-260.8047\\-35\\139.7736\\-262.7578\\-35\\137.7537\\-264.7109\\-35\\135.9724\\-266.6641\\-35\\133.7891\\-268.7393\\-35\\131.8359\\-270.2173\\-35\\129.8828\\-271.8971\\-35\\127.9297\\-273.7753\\-35\\125.9766\\-275.3382\\-35\\124.0234\\-276.7408\\-35\\122.0703\\-278.0139\\-35\\121.6654\\-278.3828\\-35\\118.1641\\-280.9455\\-35\\110.3516\\-285.4059\\-35\\108.3984\\-286.696\\-35\\106.4453\\-287.5287\\-35\\104.4922\\-288.6401\\-35\\102.5391\\-289.2448\\-35\\98.63281\\-290.9599\\-35\\96.67969\\-291.5882\\-35\\94.72656\\-292.5774\\-35\\92.77344\\-293.1263\\-35\\88.86719\\-294.5088\\-35\\86.91406\\-294.866\\-35\\83.00781\\-295.3624\\-35\\81.05469\\-295.6953\\-35\\79.10156\\-296.1324\\-35\\77.14844\\-296.4619\\-35\\73.24219\\-296.7302\\-35\\69.33594\\-296.7711\\-35\\65.42969\\-296.6519\\-35\\61.52344\\-296.2122\\-35\\57.61719\\-295.4056\\-35\\53.71094\\-294.7674\\-35\\51.75781\\-294.5307\\-35\\47.85156\\-293.2363\\-35\\45.89844\\-292.7936\\-35\\43.94531\\-292.1768\\-35\\41.99219\\-291.3946\\-35\\38.08594\\-290.5033\\-35\\36.13281\\-289.7484\\-35\\34.17969\\-289.2907\\-35\\30.27344\\-288.8441\\-35\\28.32031\\-288.6902\\-35\\24.41406\\-288.6158\\-35\\18.55469\\-288.9633\\-35\\14.64844\\-289.1436\\-35\\10.74219\\-289.3908\\-35\\2.929688\\-290.0436\\-35\\0.9765625\\-290.14\\-35\\-0.9765625\\-290.356\\-35\\-4.882813\\-290.4806\\-35\\-8.789063\\-290.5308\\-35\\-12.69531\\-290.4138\\-35\\-14.64844\\-290.4138\\-35\\-20.50781\\-290.2255\\-35\\-26.36719\\-289.9975\\-35\\-30.27344\\-289.9093\\-35\\-32.22656\\-289.9975\\-35\\-34.17969\\-290.2785\\-35\\-40.03906\\-291.344\\-35\\-43.94531\\-292.7597\\-35\\-45.89844\\-293.2277\\-35\\-49.80469\\-294.6281\\-35\\-53.71094\\-295.3287\\-35\\-55.66406\\-295.8447\\-35\\-57.61719\\-296.4619\\-35\\-59.57031\\-296.7836\\-35\\-63.47656\\-297.3235\\-35\\-67.38281\\-298.0884\\-35\\-71.28906\\-298.4023\\-35\\-75.19531\\-298.4023\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "305" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "109" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-75.19531\\-298.0757\\-33\\-77.14844\\-297.8906\\-33\\-81.05469\\-297.3484\\-33\\-86.91406\\-296.6519\\-33\\-88.86719\\-296.0896\\-33\\-90.82031\\-295.3983\\-33\\-92.77344\\-294.9665\\-33\\-94.72656\\-294.4025\\-33\\-96.67969\\-293.4147\\-33\\-98.63281\\-292.6886\\-33\\-100.5859\\-291.4472\\-33\\-102.5391\\-290.6588\\-33\\-104.4922\\-289.4442\\-33\\-106.4453\\-288.6961\\-33\\-108.3984\\-287.4465\\-33\\-110.3516\\-286.4323\\-33\\-113.5274\\-284.2422\\-33\\-114.2578\\-283.6589\\-33\\-116.2109\\-282.6435\\-33\\-118.1641\\-281.3311\\-33\\-122.0703\\-278.4642\\-33\\-125.9766\\-275.4214\\-33\\-127.9297\\-273.7441\\-33\\-131.8359\\-269.9574\\-33\\-133.3308\\-268.6172\\-33\\-135.2574\\-266.6641\\-33\\-136.9529\\-264.7109\\-33\\-140.5882\\-260.8047\\-33\\-142.1701\\-258.8516\\-33\\-143.3144\\-256.8984\\-33\\-144.696\\-254.9453\\-33\\-146.2085\\-252.9922\\-33\\-147.4609\\-250.9622\\-33\\-149.6452\\-247.1328\\-33\\-150.4894\\-245.1797\\-33\\-151.6509\\-243.2266\\-33\\-152.5093\\-241.2734\\-33\\-153.6193\\-239.3203\\-33\\-155.0993\\-235.4141\\-33\\-155.9683\\-233.4609\\-33\\-156.3971\\-231.5078\\-33\\-157.0402\\-229.5547\\-33\\-157.8585\\-227.6016\\-33\\-158.3303\\-225.6484\\-33\\-159.7129\\-221.7422\\-33\\-160.5504\\-217.8359\\-33\\-161.6465\\-213.9297\\-33\\-161.9367\\-211.9766\\-33\\-162.5977\\-206.1172\\-33\\-163.3699\\-202.2109\\-33\\-163.6684\\-200.2578\\-33\\-163.9862\\-196.3516\\-33\\-164.2192\\-192.4453\\-33\\-164.4868\\-186.5859\\-33\\-164.5387\\-184.6328\\-33\\-164.5329\\-178.7734\\-33\\-164.2131\\-170.9609\\-33\\-163.8006\\-165.1016\\-33\\-163.5649\\-163.1484\\-33\\-162.7215\\-159.2422\\-33\\-162.3919\\-157.2891\\-33\\-161.8937\\-153.3828\\-33\\-161.4674\\-151.4297\\-33\\-160.7357\\-149.4766\\-33\\-159.662\\-145.5703\\-33\\-158.7068\\-143.6172\\-33\\-158.0791\\-141.6641\\-33\\-157.3351\\-139.7109\\-33\\-156.4077\\-137.7578\\-33\\-155.8878\\-135.8047\\-33\\-154.9241\\-133.8516\\-33\\-153.3203\\-129.8694\\-33\\-150.2906\\-124.0859\\-33\\-148.4312\\-120.1797\\-33\\-146.3323\\-116.2734\\-33\\-145.1129\\-114.3203\\-33\\-144.0965\\-112.3672\\-33\\-142.7772\\-110.4141\\-33\\-141.9173\\-108.4609\\-33\\-140.5485\\-106.5078\\-33\\-139.0365\\-104.5547\\-33\\-136.3212\\-100.6484\\-33\\-134.7724\\-98.69531\\-33\\-133.0511\\-96.74219\\-33\\-131.8359\\-95.56308\\-33\\-128.6534\\-92.83594\\-33\\-127.9297\\-92.34766\\-33\\-125.9766\\-90.75511\\-33\\-122.0703\\-88.22252\\-33\\-115.8673\\-85.02344\\-33\\-114.2578\\-84.51812\\-33\\-110.3516\\-82.73704\\-33\\-108.3984\\-82.06076\\-33\\-106.4453\\-81.66048\\-33\\-104.4922\\-80.6393\\-33\\-102.5391\\-80.25484\\-33\\-100.5859\\-79.60236\\-33\\-94.72656\\-77.8304\\-33\\-88.86719\\-76.64367\\-33\\-86.91406\\-76.30599\\-33\\-84.96094\\-76.13485\\-33\\-83.00781\\-76.06454\\-33\\-79.10156\\-75.78166\\-33\\-77.14844\\-75.5544\\-33\\-75.19531\\-74.96405\\-33\\-73.24219\\-74.77315\\-33\\-65.42969\\-74.66368\\-33\\-59.57031\\-74.67734\\-33\\-53.71094\\-74.76235\\-33\\-51.75781\\-74.85659\\-33\\-49.80469\\-75.10057\\-33\\-47.85156\\-75.51675\\-33\\-45.89844\\-75.69258\\-33\\-40.03906\\-76.03787\\-33\\-36.13281\\-76.37472\\-33\\-34.17969\\-76.61517\\-33\\-32.22656\\-77.03273\\-33\\-26.36719\\-78.69114\\-33\\-24.41406\\-79.54771\\-33\\-20.50781\\-80.90957\\-33\\-16.60156\\-82.82617\\-33\\-13.15542\\-85.02344\\-33\\-8.789063\\-88.5015\\-33\\-6.835938\\-90.13004\\-33\\-4.882813\\-91.90851\\-33\\-2.929688\\-93.49376\\-33\\-0.9765625\\-94.56068\\-33\\0.9765625\\-95.23925\\-33\\5.223474\\-92.83594\\-33\\6.835938\\-91.64049\\-33\\7.17926\\-90.88281\\-33\\8.789063\\-88.9389\\-33\\12.81178\\-85.02344\\-33\\15.15447\\-83.07031\\-33\\16.60156\\-82.03667\\-33\\18.55469\\-80.80146\\-33\\20.50781\\-79.94405\\-33\\22.46094\\-78.87109\\-33\\26.36719\\-77.14173\\-33\\28.32031\\-76.40421\\-33\\30.27344\\-76.01869\\-33\\32.22656\\-75.44561\\-33\\34.17969\\-74.71684\\-33\\38.08594\\-74.15755\\-33\\40.03906\\-73.20995\\-33\\41.99219\\-72.79937\\-33\\45.89844\\-72.55756\\-33\\47.85156\\-71.9504\\-33\\49.80469\\-72.34847\\-33\\51.75781\\-71.75673\\-33\\55.66406\\-71.91644\\-33\\57.61719\\-72.51304\\-33\\59.57031\\-72.63519\\-33\\63.47656\\-72.64856\\-33\\67.38281\\-72.71235\\-33\\71.28906\\-72.85171\\-33\\73.24219\\-72.98988\\-33\\75.19531\\-74.22894\\-33\\77.14844\\-74.30492\\-33\\81.05469\\-74.5612\\-33\\83.00781\\-74.76597\\-33\\86.91406\\-75.70703\\-33\\92.77344\\-76.46777\\-33\\94.72656\\-77.02393\\-33\\96.67969\\-77.69614\\-33\\98.63281\\-78.10754\\-33\\100.5859\\-78.78703\\-33\\102.5391\\-79.69383\\-33\\106.4453\\-80.8206\\-33\\108.3984\\-81.77034\\-33\\110.3516\\-82.35171\\-33\\112.3047\\-83.37762\\-33\\114.2578\\-84.25893\\-33\\116.2109\\-85.50512\\-33\\118.1641\\-86.33569\\-33\\120.1172\\-87.52795\\-33\\122.0703\\-88.34375\\-33\\125.9766\\-91.20126\\-33\\128.8035\\-92.83594\\-33\\129.8828\\-93.64333\\-33\\131.8359\\-95.5\\-33\\134.8604\\-98.69531\\-33\\136.3636\\-100.6484\\-33\\137.5722\\-102.6016\\-33\\138.9013\\-104.5547\\-33\\140.3973\\-106.5078\\-33\\141.6098\\-108.4609\\-33\\144.6006\\-114.3203\\-33\\145.7915\\-116.2734\\-33\\146.6604\\-118.2266\\-33\\147.7771\\-120.1797\\-33\\149.3117\\-124.0859\\-33\\150.2087\\-126.0391\\-33\\150.8304\\-127.9922\\-33\\151.8759\\-129.9453\\-33\\152.5678\\-131.8984\\-33\\153.4931\\-133.8516\\-33\\154.2076\\-135.8047\\-33\\154.7054\\-137.7578\\-33\\155.4195\\-139.7109\\-33\\156.0289\\-141.6641\\-33\\156.3488\\-143.6172\\-33\\156.7815\\-145.5703\\-33\\157.5521\\-147.5234\\-33\\158.0166\\-149.4766\\-33\\158.3549\\-151.4297\\-33\\158.7929\\-153.3828\\-33\\159.4615\\-155.3359\\-33\\159.8255\\-157.2891\\-33\\160.6061\\-163.1484\\-33\\161.2859\\-167.0547\\-33\\161.7576\\-170.9609\\-33\\161.9741\\-174.8672\\-33\\162.1922\\-180.7266\\-33\\162.2821\\-184.6328\\-33\\162.3204\\-190.4922\\-33\\162.3204\\-196.3516\\-33\\162.2532\\-202.2109\\-33\\162.0977\\-208.0703\\-33\\161.8019\\-213.9297\\-33\\161.3253\\-217.8359\\-33\\160.5103\\-221.7422\\-33\\159.9006\\-225.6484\\-33\\159.4727\\-227.6016\\-33\\158.6616\\-229.5547\\-33\\157.5834\\-233.4609\\-33\\156.6319\\-235.4141\\-33\\156.1671\\-237.3672\\-33\\155.4627\\-239.3203\\-33\\154.4788\\-241.2734\\-33\\153.6638\\-243.2266\\-33\\153.3203\\-243.7148\\-33\\150.1543\\-249.0859\\-33\\148.8472\\-251.0391\\-33\\147.6607\\-252.9922\\-33\\146.1736\\-254.9453\\-33\\141.6016\\-260.2389\\-33\\139.6484\\-262.2876\\-33\\137.2034\\-264.7109\\-33\\135.3683\\-266.6641\\-33\\133.2571\\-268.6172\\-33\\129.8828\\-271.56\\-33\\127.9297\\-273.3936\\-33\\125.9766\\-274.9718\\-33\\124.0234\\-276.1739\\-33\\122.0703\\-277.5901\\-33\\120.1172\\-279.111\\-33\\118.1641\\-280.4541\\-33\\116.2109\\-281.5782\\-33\\114.2578\\-282.8593\\-33\\112.3047\\-283.7471\\-33\\110.3516\\-285.0407\\-33\\108.275\\-286.1953\\-33\\104.3972\\-288.1484\\-33\\102.5391\\-288.9846\\-33\\100.5859\\-289.5518\\-33\\98.63281\\-290.5988\\-33\\96.67969\\-291.1896\\-33\\92.77344\\-292.8071\\-33\\90.82031\\-293.3317\\-33\\88.86719\\-294.0156\\-33\\86.91406\\-294.5987\\-33\\84.96094\\-294.9079\\-33\\81.05469\\-295.3585\\-33\\79.10156\\-295.6331\\-33\\75.19531\\-296.3117\\-33\\71.28906\\-296.5198\\-33\\67.38281\\-296.4839\\-33\\65.42969\\-296.369\\-33\\63.47656\\-296.1187\\-33\\59.57031\\-295.4694\\-33\\55.66406\\-295.0199\\-33\\51.75781\\-294.3732\\-33\\49.80469\\-293.7068\\-33\\47.85156\\-293.1611\\-33\\45.89844\\-292.7522\\-33\\43.94531\\-292.2033\\-33\\41.99219\\-291.4688\\-33\\38.08594\\-290.7072\\-33\\34.17969\\-289.5372\\-33\\30.27344\\-289.101\\-33\\24.41406\\-289.0636\\-33\\18.55469\\-289.3863\\-33\\14.64844\\-289.7565\\-33\\10.74219\\-290.2913\\-33\\6.835938\\-290.6792\\-33\\-0.9765625\\-291.0558\\-33\\-8.789063\\-291.1735\\-33\\-16.60156\\-291.0454\\-33\\-20.50781\\-290.9287\\-33\\-26.36719\\-290.8174\\-33\\-32.22656\\-290.7768\\-33\\-36.13281\\-290.968\\-33\\-38.08594\\-291.1748\\-33\\-40.03906\\-291.5391\\-33\\-41.99219\\-292.3022\\-33\\-45.89844\\-293.2545\\-33\\-49.80469\\-294.5614\\-33\\-53.71094\\-295.2131\\-33\\-55.66406\\-295.6307\\-33\\-57.61719\\-296.2369\\-33\\-59.57031\\-296.6405\\-33\\-65.42969\\-297.3689\\-33\\-69.33594\\-297.9061\\-33\\-73.24219\\-298.1378\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "299" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "110" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-296.3971\\-31\\-88.86719\\-295.6913\\-31\\-92.77344\\-294.7879\\-31\\-94.72656\\-294.0765\\-31\\-96.67969\\-293.1526\\-31\\-98.63281\\-292.3912\\-31\\-100.5859\\-291.2066\\-31\\-102.5391\\-290.3642\\-31\\-104.4922\\-289.2532\\-31\\-106.4453\\-288.4326\\-31\\-112.3047\\-284.8269\\-31\\-114.2578\\-283.4284\\-31\\-116.2109\\-282.346\\-31\\-118.1641\\-281.1135\\-31\\-121.7317\\-278.3828\\-31\\-122.0703\\-278.0623\\-31\\-125.9766\\-275.2172\\-31\\-127.9297\\-273.5193\\-31\\-129.8828\\-271.6315\\-31\\-133.7891\\-267.9776\\-31\\-135.0666\\-266.6641\\-31\\-136.7996\\-264.7109\\-31\\-140.4039\\-260.8047\\-31\\-141.956\\-258.8516\\-31\\-143.1362\\-256.8984\\-31\\-146.0337\\-252.9922\\-31\\-148.4007\\-249.0859\\-31\\-151.4048\\-243.2266\\-31\\-153.3434\\-239.3203\\-31\\-154.2066\\-237.3672\\-31\\-154.8733\\-235.4141\\-31\\-155.8079\\-233.4609\\-31\\-156.7815\\-229.5547\\-31\\-157.6613\\-227.6016\\-31\\-158.6616\\-223.6953\\-31\\-159.4502\\-221.7422\\-31\\-159.952\\-219.7891\\-31\\-160.7783\\-215.8828\\-31\\-161.3909\\-213.9297\\-31\\-161.7694\\-211.9766\\-31\\-162.0265\\-210.0234\\-31\\-162.4127\\-206.1172\\-31\\-162.9562\\-202.2109\\-31\\-163.3817\\-200.2578\\-31\\-163.6311\\-198.3047\\-31\\-163.9411\\-194.3984\\-31\\-164.1333\\-190.4922\\-31\\-164.2948\\-184.6328\\-31\\-164.3013\\-180.7266\\-31\\-164.191\\-174.8672\\-31\\-164.0172\\-170.9609\\-31\\-163.7612\\-167.0547\\-31\\-163.5459\\-165.1016\\-31\\-163.2276\\-163.1484\\-31\\-162.7675\\-161.1953\\-31\\-162.4577\\-159.2422\\-31\\-161.9707\\-155.3359\\-31\\-161.6684\\-153.3828\\-31\\-160.4353\\-149.4766\\-31\\-159.9515\\-147.5234\\-31\\-159.2882\\-145.5703\\-31\\-158.4017\\-143.6172\\-31\\-157.8212\\-141.6641\\-31\\-156.8915\\-139.7109\\-31\\-155.5966\\-135.8047\\-31\\-154.616\\-133.8516\\-31\\-153.9329\\-131.8984\\-31\\-152.0981\\-127.9922\\-31\\-150.9386\\-126.0391\\-31\\-150.1496\\-124.0859\\-31\\-149.057\\-122.1328\\-31\\-148.2305\\-120.1797\\-31\\-147.0501\\-118.2266\\-31\\-146.088\\-116.2734\\-31\\-144.7833\\-114.3203\\-31\\-143.797\\-112.3672\\-31\\-142.6453\\-110.4141\\-31\\-141.6262\\-108.4609\\-31\\-140.3625\\-106.5078\\-31\\-138.8288\\-104.5547\\-31\\-136.1103\\-100.6484\\-31\\-134.5607\\-98.69531\\-31\\-131.8359\\-95.72089\\-31\\-129.8828\\-94.01194\\-31\\-127.9297\\-92.48942\\-31\\-125.9766\\-90.85918\\-31\\-122.0703\\-88.29899\\-31\\-119.6696\\-86.97656\\-31\\-115.7588\\-85.02344\\-31\\-114.2578\\-84.54382\\-31\\-110.3516\\-82.75\\-31\\-108.3984\\-82.08082\\-31\\-106.4453\\-81.67236\\-31\\-104.4922\\-80.61515\\-31\\-102.5391\\-80.25484\\-31\\-100.5859\\-79.54996\\-31\\-94.72656\\-77.78241\\-31\\-88.86719\\-76.45465\\-31\\-86.91406\\-76.2078\\-31\\-83.00781\\-75.97771\\-31\\-79.10156\\-75.68805\\-31\\-75.19531\\-74.79173\\-31\\-73.24219\\-74.65525\\-31\\-69.33594\\-74.63576\\-31\\-63.47656\\-74.54818\\-31\\-57.61719\\-74.55288\\-31\\-53.71094\\-74.60013\\-31\\-49.80469\\-74.82132\\-31\\-43.94531\\-75.5621\\-31\\-36.13281\\-76.23438\\-31\\-34.17969\\-76.44945\\-31\\-32.22656\\-76.79333\\-31\\-28.32031\\-77.93755\\-31\\-26.36719\\-78.45331\\-31\\-22.46094\\-79.97583\\-31\\-20.50781\\-80.62554\\-31\\-18.55469\\-81.69363\\-31\\-16.60156\\-82.45318\\-31\\-12.69531\\-84.96501\\-31\\-10.74219\\-86.54977\\-31\\-4.882813\\-91.51856\\-31\\-2.929688\\-93.08206\\-31\\-0.9765625\\-94.20313\\-31\\0.9765625\\-94.67372\\-31\\2.929688\\-93.92034\\-31\\4.453462\\-92.83594\\-31\\6.623299\\-90.88281\\-31\\8.789063\\-88.62005\\-31\\12.69531\\-84.80186\\-31\\14.74095\\-83.07031\\-31\\18.55469\\-80.61207\\-31\\20.50781\\-79.79091\\-31\\22.46094\\-78.69322\\-31\\24.41406\\-77.85141\\-31\\26.36719\\-76.89756\\-31\\28.32031\\-76.26989\\-31\\30.27344\\-75.90271\\-31\\34.17969\\-74.62238\\-31\\36.13281\\-74.3728\\-31\\38.08594\\-73.90394\\-31\\40.03906\\-72.85171\\-31\\43.94531\\-72.58971\\-31\\45.89844\\-71.9747\\-31\\47.85156\\-71.6944\\-31\\51.75781\\-71.65284\\-31\\55.66406\\-71.69079\\-31\\59.57031\\-72.17849\\-31\\61.52344\\-72.16933\\-31\\63.47656\\-72.34198\\-31\\65.42969\\-72.64184\\-31\\73.24219\\-72.88874\\-31\\75.19531\\-74.19405\\-31\\77.14844\\-74.26955\\-31\\83.00781\\-74.7207\\-31\\84.96094\\-74.99792\\-31\\86.91406\\-75.63908\\-31\\88.86719\\-75.95788\\-31\\92.77344\\-76.43834\\-31\\96.67969\\-77.68386\\-31\\98.63281\\-78.11369\\-31\\100.5859\\-78.79707\\-31\\102.5391\\-79.68107\\-31\\106.4453\\-80.8206\\-31\\108.3984\\-81.75323\\-31\\110.3516\\-82.34716\\-31\\112.3047\\-83.35428\\-31\\114.2578\\-84.2455\\-31\\116.2109\\-85.47159\\-31\\118.1641\\-86.32349\\-31\\120.1172\\-87.53366\\-31\\122.0703\\-88.34375\\-31\\125.9766\\-91.1871\\-31\\128.7802\\-92.83594\\-31\\129.8828\\-93.67642\\-31\\131.8359\\-95.56551\\-31\\134.7222\\-98.69531\\-31\\136.1576\\-100.6484\\-31\\137.318\\-102.6016\\-31\\137.6953\\-103.0236\\-31\\139.6484\\-105.8645\\-31\\140.1817\\-106.5078\\-31\\141.2483\\-108.4609\\-31\\142.4622\\-110.4141\\-31\\143.2789\\-112.3672\\-31\\144.3991\\-114.3203\\-31\\145.3065\\-116.2734\\-31\\146.435\\-118.2266\\-31\\148.3162\\-122.1328\\-31\\148.9533\\-124.0859\\-31\\149.9581\\-126.0391\\-31\\150.5969\\-127.9922\\-31\\151.5158\\-129.9453\\-31\\152.9744\\-133.8516\\-31\\153.9329\\-135.8047\\-31\\155.0573\\-139.7109\\-31\\155.8079\\-141.6641\\-31\\156.5376\\-145.5703\\-31\\157.7917\\-149.4766\\-31\\158.5053\\-153.3828\\-31\\159.5764\\-157.2891\\-31\\159.9006\\-159.2422\\-31\\160.3632\\-163.1484\\-31\\160.915\\-167.0547\\-31\\161.5326\\-170.9609\\-31\\161.826\\-174.8672\\-31\\162.0626\\-180.7266\\-31\\162.1506\\-184.6328\\-31\\162.1987\\-190.4922\\-31\\162.1933\\-196.3516\\-31\\162.1212\\-202.2109\\-31\\162.0265\\-206.1172\\-31\\161.8726\\-210.0234\\-31\\161.5988\\-213.9297\\-31\\161.2992\\-215.8828\\-31\\160.579\\-219.7891\\-31\\159.6622\\-225.6484\\-31\\158.3849\\-229.5547\\-31\\157.9316\\-231.5078\\-31\\156.4254\\-235.4141\\-31\\155.9808\\-237.3672\\-31\\155.0589\\-239.3203\\-31\\154.2622\\-241.2734\\-31\\153.3203\\-243.1461\\-31\\152.1473\\-245.1797\\-31\\150.8557\\-247.1328\\-31\\149.8643\\-249.0859\\-31\\148.5596\\-251.0391\\-31\\145.7779\\-254.9453\\-31\\142.4984\\-258.8516\\-31\\140.7357\\-260.8047\\-31\\138.7475\\-262.7578\\-31\\134.9376\\-266.6641\\-31\\131.8359\\-269.5264\\-31\\127.9297\\-272.9438\\-31\\125.9464\\-274.4766\\-31\\124.0234\\-275.7901\\-31\\120.1172\\-278.6888\\-31\\118.1641\\-279.9012\\-31\\116.2109\\-281.2369\\-31\\114.2578\\-282.4081\\-31\\112.3047\\-283.3681\\-31\\110.3516\\-284.6237\\-31\\108.3984\\-285.5667\\-31\\106.4453\\-286.7895\\-31\\104.4922\\-287.5987\\-31\\102.5391\\-288.6635\\-31\\100.5859\\-289.2434\\-31\\98.63281\\-289.9853\\-31\\96.67969\\-290.8711\\-31\\94.72656\\-291.455\\-31\\92.77344\\-292.4161\\-31\\88.86719\\-293.5165\\-31\\86.91406\\-294.213\\-31\\84.96094\\-294.6487\\-31\\83.00781\\-294.9134\\-31\\73.24219\\-295.985\\-31\\69.33594\\-296.1723\\-31\\67.38281\\-296.1048\\-31\\61.52344\\-295.45\\-31\\55.66406\\-294.8844\\-31\\53.71094\\-294.6121\\-31\\51.75781\\-294.173\\-31\\49.80469\\-293.5349\\-31\\45.89844\\-292.7075\\-31\\43.94531\\-292.1768\\-31\\41.99219\\-291.5288\\-31\\40.03906\\-291.1318\\-31\\36.13281\\-290.4421\\-31\\34.17969\\-289.8722\\-31\\32.22656\\-289.5245\\-31\\30.27344\\-289.3119\\-31\\24.41406\\-289.4443\\-31\\20.50781\\-289.8278\\-31\\16.60156\\-290.4206\\-31\\12.69531\\-290.8312\\-31\\2.929688\\-291.5471\\-31\\-0.9765625\\-291.7482\\-31\\-6.835938\\-291.9523\\-31\\-10.74219\\-291.9673\\-31\\-16.60156\\-291.6902\\-31\\-18.55469\\-291.5273\\-31\\-22.46094\\-291.4749\\-31\\-30.27344\\-291.2858\\-31\\-34.17969\\-291.2552\\-31\\-36.13281\\-291.3088\\-31\\-38.08594\\-291.463\\-31\\-40.03906\\-291.8228\\-31\\-41.99219\\-292.4611\\-31\\-45.89844\\-293.2796\\-31\\-49.80469\\-294.5056\\-31\\-51.75781\\-294.8474\\-31\\-55.66406\\-295.4277\\-31\\-59.57031\\-296.4587\\-31\\-61.52344\\-296.7368\\-31\\-67.38281\\-297.3317\\-31\\-71.28906\\-297.6321\\-31\\-75.19531\\-297.6321\\-31\\-79.10156\\-297.3235\\-31\\-84.96094\\-296.7476\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "303" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "111" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-295.3891\\-29\\-90.82031\\-295.0435\\-29\\-92.77344\\-294.5739\\-29\\-94.72656\\-293.6961\\-29\\-96.67969\\-292.9198\\-29\\-100.5859\\-290.9996\\-29\\-102.5391\\-289.9261\\-29\\-104.4922\\-289.0707\\-29\\-108.3984\\-287.012\\-29\\-110.3516\\-285.6906\\-29\\-112.3047\\-284.54\\-29\\-114.2578\\-283.2092\\-29\\-118.1641\\-280.844\\-29\\-118.747\\-280.3359\\-29\\-121.3882\\-278.3828\\-29\\-122.0703\\-277.7517\\-29\\-124.0234\\-276.2456\\-29\\-125.9766\\-274.9683\\-29\\-127.9297\\-273.2907\\-29\\-133.7891\\-267.7868\\-29\\-134.882\\-266.6641\\-29\\-140.2001\\-260.8047\\-29\\-141.6567\\-258.8516\\-29\\-142.9618\\-256.8984\\-29\\-143.5547\\-256.1766\\-29\\-145.8047\\-252.9922\\-29\\-146.9632\\-251.0391\\-29\\-148.2633\\-249.0859\\-29\\-149.1699\\-247.1328\\-29\\-150.2418\\-245.1797\\-29\\-151.083\\-243.2266\\-29\\-152.1915\\-241.2734\\-29\\-153.054\\-239.3203\\-29\\-154.0684\\-237.3672\\-29\\-154.6798\\-235.4141\\-29\\-155.6036\\-233.4609\\-29\\-156.1607\\-231.5078\\-29\\-156.5694\\-229.5547\\-29\\-157.401\\-227.6016\\-29\\-157.9988\\-225.6484\\-29\\-158.4379\\-223.6953\\-29\\-159.7786\\-219.7891\\-29\\-160.5108\\-215.8828\\-29\\-161.5791\\-211.9766\\-29\\-161.8963\\-210.0234\\-29\\-162.6408\\-202.2109\\-29\\-163.0308\\-200.2578\\-29\\-163.6136\\-196.3516\\-29\\-163.8929\\-192.4453\\-29\\-164.1026\\-184.6328\\-29\\-164.1121\\-180.7266\\-29\\-164.0228\\-174.8672\\-29\\-163.8449\\-170.9609\\-29\\-163.5063\\-167.0547\\-29\\-162.4874\\-161.1953\\-29\\-162.0614\\-157.2891\\-29\\-161.7942\\-155.3359\\-29\\-161.3787\\-153.3828\\-29\\-160.7096\\-151.4297\\-29\\-159.7129\\-147.5234\\-29\\-158.8135\\-145.5703\\-29\\-157.5084\\-141.6641\\-29\\-156.5818\\-139.7109\\-29\\-156.0509\\-137.7578\\-29\\-154.3752\\-133.8516\\-29\\-153.6503\\-131.8984\\-29\\-152.6515\\-129.9453\\-29\\-151.8138\\-127.9922\\-29\\-150.6145\\-126.0391\\-29\\-149.9581\\-124.0859\\-29\\-148.7608\\-122.1328\\-29\\-147.999\\-120.1797\\-29\\-146.7677\\-118.2266\\-29\\-145.8748\\-116.2734\\-29\\-144.561\\-114.3203\\-29\\-143.4346\\-112.3672\\-29\\-142.511\\-110.4141\\-29\\-140.1565\\-106.5078\\-29\\-139.6484\\-105.9294\\-29\\-137.6953\\-103.2129\\-29\\-137.1582\\-102.6016\\-29\\-135.8955\\-100.6484\\-29\\-133.7891\\-98.07462\\-29\\-131.8359\\-95.88188\\-29\\-130.669\\-94.78906\\-29\\-125.8329\\-90.88281\\-29\\-122.0703\\-88.32612\\-29\\-119.7007\\-86.97656\\-29\\-115.6006\\-85.02344\\-29\\-114.2578\\-84.57046\\-29\\-110.3516\\-82.76317\\-29\\-108.3984\\-82.08733\\-29\\-106.4453\\-81.70571\\-29\\-104.4922\\-80.68552\\-29\\-102.5391\\-80.29086\\-29\\-99.46646\\-79.16406\\-29\\-94.72656\\-77.77595\\-29\\-92.77344\\-77.34375\\-29\\-90.82031\\-76.77444\\-29\\-88.86719\\-76.37905\\-29\\-86.91406\\-76.12951\\-29\\-81.05469\\-75.74268\\-29\\-79.10156\\-75.37691\\-29\\-77.14844\\-74.90054\\-29\\-75.19531\\-74.6563\\-29\\-73.24219\\-74.56498\\-29\\-67.38281\\-74.50035\\-29\\-65.42969\\-74.51588\\-29\\-57.61719\\-74.43577\\-29\\-53.71094\\-74.49546\\-29\\-49.80469\\-74.67325\\-29\\-43.94531\\-75.05933\\-29\\-41.99219\\-75.57878\\-29\\-38.08594\\-75.91878\\-29\\-34.17969\\-76.32469\\-29\\-32.22656\\-76.5857\\-29\\-30.27344\\-77.03403\\-29\\-28.32031\\-77.733\\-29\\-24.41406\\-78.94027\\-29\\-22.46094\\-79.83389\\-29\\-20.50781\\-80.42315\\-29\\-18.55469\\-81.45972\\-29\\-16.60156\\-82.21582\\-29\\-14.64844\\-83.4505\\-29\\-12.69531\\-84.57554\\-29\\-8.789063\\-87.99354\\-29\\-6.835938\\-89.44256\\-29\\-4.882813\\-91.0797\\-29\\-2.929688\\-92.60021\\-29\\-0.9765625\\-93.80022\\-29\\0.9765625\\-94.09863\\-29\\2.929688\\-93.7316\\-29\\4.882813\\-92.19989\\-29\\6.312779\\-90.88281\\-29\\8.789063\\-88.35395\\-29\\12.69531\\-84.51296\\-29\\14.64844\\-82.85419\\-29\\16.60156\\-81.78332\\-29\\18.55469\\-80.40149\\-29\\21.06081\\-79.16406\\-29\\24.41406\\-77.6487\\-29\\26.36719\\-76.70286\\-29\\28.32031\\-76.16966\\-29\\30.27344\\-75.73949\\-29\\32.22656\\-74.91449\\-29\\34.17969\\-74.53181\\-29\\36.13281\\-74.30492\\-29\\38.08594\\-73.81516\\-29\\40.03906\\-72.78273\\-29\\41.99219\\-72.6904\\-29\\43.94531\\-72.48389\\-29\\45.89844\\-71.70185\\-29\\47.85156\\-71.63816\\-29\\57.61719\\-71.69079\\-29\\63.47656\\-71.80933\\-29\\65.42969\\-72.44154\\-29\\67.38281\\-72.68324\\-29\\73.24219\\-72.87\\-29\\75.19531\\-73.06896\\-29\\77.14844\\-74.24056\\-29\\83.00781\\-74.66781\\-29\\84.96094\\-74.94004\\-29\\86.91406\\-75.61476\\-29\\88.86719\\-75.93845\\-29\\92.77344\\-76.42358\\-29\\96.67969\\-77.66792\\-29\\98.63281\\-78.17066\\-29\\100.5859\\-78.84925\\-29\\102.5391\\-79.687\\-29\\106.4453\\-80.83296\\-29\\108.3984\\-81.75766\\-29\\110.3516\\-82.35171\\-29\\112.3047\\-83.35228\\-29\\114.2578\\-84.24987\\-29\\116.2109\\-85.44774\\-29\\118.1641\\-86.30743\\-29\\120.1172\\-87.53366\\-29\\122.0703\\-88.36287\\-29\\124.0234\\-89.73209\\-29\\125.9766\\-91.23355\\-29\\128.5979\\-92.83594\\-29\\129.8828\\-93.8125\\-29\\132.8443\\-96.74219\\-29\\134.6229\\-98.69531\\-29\\135.9825\\-100.6484\\-29\\137.1285\\-102.6016\\-29\\139.8979\\-106.5078\\-29\\140.9943\\-108.4609\\-29\\142.2674\\-110.4141\\-29\\142.9957\\-112.3672\\-29\\144.1876\\-114.3203\\-29\\144.9815\\-116.2734\\-29\\146.1719\\-118.2266\\-29\\147.0056\\-120.1797\\-29\\148.1099\\-122.1328\\-29\\148.7311\\-124.0859\\-29\\149.6582\\-126.0391\\-29\\150.4149\\-127.9922\\-29\\151.0728\\-129.9453\\-29\\152.0275\\-131.8984\\-29\\152.6518\\-133.8516\\-29\\153.6263\\-135.8047\\-29\\154.7625\\-139.7109\\-29\\155.5157\\-141.6641\\-29\\156.0412\\-143.6172\\-29\\156.7845\\-147.5234\\-29\\157.5305\\-149.4766\\-29\\157.9565\\-151.4297\\-29\\158.6507\\-155.3359\\-29\\159.2173\\-157.2891\\-29\\159.685\\-159.2422\\-29\\160.3911\\-165.1016\\-29\\161.4494\\-172.9141\\-29\\161.7697\\-176.8203\\-29\\161.9924\\-182.6797\\-29\\162.0502\\-188.5391\\-29\\162.0743\\-194.3984\\-29\\162.0158\\-200.2578\\-29\\161.8771\\-206.1172\\-29\\161.53\\-211.9766\\-29\\161.2702\\-213.9297\\-29\\160.6084\\-217.8359\\-29\\159.7827\\-223.6953\\-29\\159.3018\\-225.6484\\-29\\158.6192\\-227.6016\\-29\\157.6796\\-231.5078\\-29\\156.7513\\-233.4609\\-29\\155.7205\\-237.3672\\-29\\154.7496\\-239.3203\\-29\\154.0396\\-241.2734\\-29\\152.8223\\-243.2266\\-29\\151.8428\\-245.1797\\-29\\150.5427\\-247.1328\\-29\\149.4867\\-249.0859\\-29\\148.281\\-251.0391\\-29\\145.5078\\-254.625\\-29\\143.5547\\-257.0182\\-29\\142.1566\\-258.8516\\-29\\140.3792\\-260.8047\\-29\\138.3817\\-262.7578\\-29\\133.7891\\-267.3833\\-29\\131.8359\\-269.1518\\-29\\130.0197\\-270.5703\\-29\\125.9766\\-273.9305\\-29\\122.0703\\-276.854\\-29\\120.1172\\-278.041\\-29\\116.2109\\-280.9062\\-29\\114.2578\\-281.8558\\-29\\112.3047\\-283.0814\\-29\\110.0518\\-284.2422\\-29\\106.6272\\-286.1953\\-29\\102.5391\\-288.204\\-29\\100.5859\\-288.9846\\-29\\98.63281\\-289.4982\\-29\\96.67969\\-290.4959\\-29\\92.77344\\-291.814\\-29\\90.82031\\-292.6603\\-29\\88.86719\\-293.1299\\-29\\84.96094\\-294.2779\\-29\\81.05469\\-294.9259\\-29\\79.10156\\-295.1094\\-29\\73.24219\\-295.5396\\-29\\69.33594\\-295.6953\\-29\\67.38281\\-295.6331\\-29\\61.52344\\-295.2468\\-29\\55.66406\\-294.7358\\-29\\53.71094\\-294.4482\\-29\\49.80469\\-293.3702\\-29\\45.89844\\-292.6396\\-29\\41.99219\\-291.5574\\-29\\40.03906\\-291.207\\-29\\36.13281\\-290.6886\\-29\\32.22656\\-289.9709\\-29\\30.27344\\-289.795\\-29\\28.32031\\-289.8093\\-29\\24.41406\\-290.1093\\-29\\22.46094\\-290.4206\\-29\\18.55469\\-290.8531\\-29\\10.74219\\-291.5602\\-29\\6.835938\\-292.1494\\-29\\2.929688\\-292.5104\\-29\\-0.9765625\\-292.6637\\-29\\-6.835938\\-292.7606\\-29\\-10.74219\\-292.7606\\-29\\-16.60156\\-292.5879\\-29\\-18.55469\\-292.393\\-29\\-22.46094\\-292.3824\\-29\\-34.17969\\-291.8353\\-29\\-38.08594\\-291.9162\\-29\\-45.89844\\-293.312\\-29\\-49.80469\\-294.461\\-29\\-51.75781\\-294.7807\\-29\\-55.66406\\-295.2907\\-29\\-57.61719\\-295.6448\\-29\\-59.57031\\-296.1723\\-29\\-61.52344\\-296.5541\\-29\\-63.47656\\-296.7836\\-29\\-67.38281\\-297.0853\\-29\\-71.28906\\-297.3109\\-29\\-73.24219\\-297.3317\\-29\\-77.14844\\-297.2033\\-29\\-83.00781\\-296.7897\\-29\\-84.96094\\-296.5372\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "308" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "112" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.96094\\-296.1459\\-27\\-86.91406\\-295.5717\\-27\\-90.82031\\-294.8145\\-27\\-92.77344\\-294.2537\\-27\\-94.72656\\-293.3433\\-27\\-96.67969\\-292.6736\\-27\\-98.63281\\-291.5366\\-27\\-100.5859\\-290.7716\\-27\\-102.5391\\-289.5999\\-27\\-104.4922\\-288.8809\\-27\\-106.4453\\-287.7195\\-27\\-108.3984\\-286.7967\\-27\\-110.3516\\-285.3893\\-27\\-112.3047\\-284.1241\\-27\\-114.2578\\-283.0426\\-27\\-116.2109\\-281.7183\\-27\\-118.1641\\-280.5267\\-27\\-121.0497\\-278.3828\\-27\\-124.0234\\-275.9818\\-27\\-125.9766\\-274.638\\-27\\-127.9297\\-273.0412\\-27\\-131.8359\\-269.4378\\-27\\-134.6739\\-266.6641\\-27\\-139.965\\-260.8047\\-27\\-143.5547\\-255.9219\\-27\\-145.5155\\-252.9922\\-27\\-146.748\\-251.0391\\-27\\-148.1014\\-249.0859\\-27\\-148.9359\\-247.1328\\-27\\-150.1045\\-245.1797\\-27\\-150.8557\\-243.2266\\-27\\-152.0128\\-241.2734\\-27\\-152.8169\\-239.3203\\-27\\-153.8602\\-237.3672\\-27\\-154.4958\\-235.4141\\-27\\-155.3438\\-233.4609\\-27\\-156.0213\\-231.5078\\-27\\-156.4186\\-229.5547\\-27\\-157.0416\\-227.6016\\-27\\-157.8212\\-225.6484\\-27\\-158.7436\\-221.7422\\-27\\-159.5262\\-219.7891\\-27\\-160.2935\\-215.8828\\-27\\-160.7281\\-213.9297\\-27\\-161.338\\-211.9766\\-27\\-161.7076\\-210.0234\\-27\\-162.1506\\-206.1172\\-27\\-162.4533\\-202.2109\\-27\\-162.6751\\-200.2578\\-27\\-163.3212\\-196.3516\\-27\\-163.6766\\-192.4453\\-27\\-163.7897\\-190.4922\\-27\\-163.9353\\-184.6328\\-27\\-163.8887\\-176.8203\\-27\\-163.7426\\-172.9141\\-27\\-163.4069\\-169.0078\\-27\\-162.7466\\-165.1016\\-27\\-162.5\\-163.1484\\-27\\-162.1094\\-159.2422\\-27\\-161.5485\\-155.3359\\-27\\-160.3837\\-151.4297\\-27\\-159.9681\\-149.4766\\-27\\-159.3541\\-147.5234\\-27\\-158.475\\-145.5703\\-27\\-157.9241\\-143.6172\\-27\\-157.0805\\-141.6641\\-27\\-156.3631\\-139.7109\\-27\\-155.8436\\-137.7578\\-27\\-154.8598\\-135.8047\\-27\\-154.1616\\-133.8516\\-27\\-153.3203\\-131.912\\-27\\-151.5026\\-127.9922\\-27\\-150.4456\\-126.0391\\-27\\-149.6857\\-124.0859\\-27\\-148.6013\\-122.1328\\-27\\-147.7841\\-120.1797\\-27\\-146.5599\\-118.2266\\-27\\-145.5454\\-116.2734\\-27\\-143.5547\\-112.9492\\-27\\-143.1372\\-112.3672\\-27\\-142.3494\\-110.4141\\-27\\-141.0445\\-108.4609\\-27\\-139.8778\\-106.5078\\-27\\-136.993\\-102.6016\\-27\\-135.7422\\-100.7569\\-27\\-134.1122\\-98.69531\\-27\\-131.8359\\-96.24366\\-27\\-129.8828\\-94.35909\\-27\\-127.9297\\-92.67435\\-27\\-125.6206\\-90.88281\\-27\\-122.0703\\-88.37466\\-27\\-120.1172\\-87.40148\\-27\\-118.1641\\-86.286\\-27\\-115.5543\\-85.02344\\-27\\-114.2578\\-84.57046\\-27\\-110.3516\\-82.77655\\-27\\-108.3984\\-82.1263\\-27\\-106.4453\\-81.73502\\-27\\-104.4922\\-80.67136\\-27\\-102.5391\\-80.30242\\-27\\-100.5859\\-79.54028\\-27\\-96.67969\\-78.25393\\-27\\-94.72656\\-77.69204\\-27\\-90.82031\\-76.71568\\-27\\-88.86719\\-76.31749\\-27\\-86.91406\\-76.12515\\-27\\-83.00781\\-75.87694\\-27\\-81.05469\\-75.67149\\-27\\-79.10156\\-74.82813\\-27\\-77.14844\\-74.75835\\-27\\-73.24219\\-74.44506\\-27\\-71.28906\\-74.49052\\-27\\-67.38281\\-74.42866\\-27\\-57.61719\\-74.35962\\-27\\-53.71094\\-74.41637\\-27\\-45.89844\\-74.73466\\-27\\-43.94531\\-74.85397\\-27\\-41.99219\\-75.08971\\-27\\-40.03906\\-75.57171\\-27\\-32.22656\\-76.43783\\-27\\-30.27344\\-76.81643\\-27\\-28.32031\\-77.50666\\-27\\-24.41406\\-78.70708\\-27\\-22.46094\\-79.62877\\-27\\-20.50781\\-80.26722\\-27\\-18.55469\\-81.04333\\-27\\-14.64844\\-83.0463\\-27\\-12.69531\\-84.29932\\-27\\-8.789063\\-87.7002\\-27\\-6.970994\\-88.92969\\-27\\-2.929688\\-92.25231\\-27\\-0.9765625\\-93.55381\\-27\\0.9765625\\-93.85418\\-27\\2.929688\\-93.34627\\-27\\4.882813\\-92.03206\\-27\\12.69531\\-84.33287\\-27\\14.64844\\-82.64539\\-27\\16.60156\\-81.6553\\-27\\18.55469\\-80.24549\\-27\\22.46094\\-78.24741\\-27\\26.36719\\-76.56604\\-27\\30.27344\\-75.62231\\-27\\32.22656\\-74.77671\\-27\\36.13281\\-74.24574\\-27\\38.39518\\-73.30469\\-27\\40.03906\\-72.75057\\-27\\41.99219\\-72.66914\\-27\\43.94531\\-71.71909\\-27\\45.89844\\-71.63816\\-27\\47.85156\\-71.69682\\-27\\53.71094\\-71.63196\\-27\\61.52344\\-71.73242\\-27\\63.47656\\-72.02295\\-27\\65.42969\\-72.56403\\-27\\67.38281\\-72.66914\\-27\\73.24219\\-72.84272\\-27\\75.19531\\-73.00072\\-27\\77.14844\\-74.22894\\-27\\79.10156\\-74.3286\\-27\\83.00781\\-74.64068\\-27\\84.96094\\-74.92454\\-27\\86.91406\\-75.60368\\-27\\88.86719\\-75.91085\\-27\\92.77344\\-76.42125\\-27\\94.72656\\-76.97521\\-27\\96.67969\\-77.65826\\-27\\100.5859\\-78.84925\\-27\\102.5391\\-79.70869\\-27\\104.4922\\-80.23418\\-27\\106.4453\\-80.8602\\-27\\108.3984\\-81.77873\\-27\\110.3516\\-82.37189\\-27\\112.3047\\-83.37338\\-27\\114.2578\\-84.2455\\-27\\116.2109\\-85.44483\\-27\\118.1641\\-86.31541\\-27\\120.1172\\-87.55215\\-27\\122.0703\\-88.37653\\-27\\124.0234\\-89.76409\\-27\\125.9766\\-91.26148\\-27\\127.9297\\-92.62424\\-27\\129.8828\\-94.11724\\-27\\131.8359\\-95.96245\\-27\\134.3068\\-98.69531\\-27\\135.7843\\-100.6484\\-27\\136.9308\\-102.6016\\-27\\137.6953\\-103.621\\-27\\141.6016\\-109.83\\-27\\142.0181\\-110.4141\\-27\\142.793\\-112.3672\\-27\\143.9359\\-114.3203\\-27\\144.7254\\-116.2734\\-27\\145.8997\\-118.2266\\-27\\146.7166\\-120.1797\\-27\\147.8422\\-122.1328\\-27\\149.2959\\-126.0391\\-27\\150.1703\\-127.9922\\-27\\150.7648\\-129.9453\\-27\\151.7358\\-131.8984\\-27\\152.4041\\-133.8516\\-27\\154.0259\\-137.7578\\-27\\154.5006\\-139.7109\\-27\\155.849\\-143.6172\\-27\\156.5496\\-147.5234\\-27\\157.0838\\-149.4766\\-27\\157.7319\\-151.4297\\-27\\158.3995\\-155.3359\\-27\\158.8003\\-157.2891\\-27\\159.3667\\-159.2422\\-27\\159.7416\\-161.1953\\-27\\160.614\\-169.0078\\-27\\161.3752\\-174.8672\\-27\\161.6649\\-178.7734\\-27\\161.8098\\-182.6797\\-27\\161.8891\\-188.5391\\-27\\161.9152\\-194.3984\\-27\\161.849\\-200.2578\\-27\\161.7658\\-204.1641\\-27\\161.5761\\-208.0703\\-27\\161.1854\\-211.9766\\-27\\160.8568\\-213.9297\\-27\\159.8394\\-221.7422\\-27\\159.4727\\-223.6953\\-27\\158.8369\\-225.6484\\-27\\157.941\\-229.5547\\-27\\157.2787\\-231.5078\\-27\\156.5104\\-233.4609\\-27\\156.0923\\-235.4141\\-27\\155.375\\-237.3672\\-27\\154.4675\\-239.3203\\-27\\153.7379\\-241.2734\\-27\\152.4841\\-243.2266\\-27\\151.4206\\-245.1797\\-27\\147.9388\\-251.0391\\-27\\145.5078\\-254.1655\\-27\\144.7921\\-254.9453\\-27\\139.8907\\-260.8047\\-27\\137.8764\\-262.7578\\-27\\133.9688\\-266.6641\\-27\\131.7336\\-268.6172\\-27\\127.9297\\-271.7846\\-27\\125.9766\\-273.4821\\-27\\124.0234\\-275.0316\\-27\\120.1172\\-277.5838\\-27\\118.1641\\-279.0958\\-27\\116.2109\\-280.4068\\-27\\114.2578\\-281.4917\\-27\\112.3047\\-282.7036\\-27\\110.3516\\-283.5383\\-27\\108.3984\\-284.8094\\-27\\106.4453\\-285.7039\\-27\\104.4922\\-286.8878\\-27\\102.5391\\-287.6536\\-27\\100.5859\\-288.6866\\-27\\98.63281\\-289.2328\\-27\\96.67969\\-289.9108\\-27\\94.72656\\-290.8036\\-27\\92.77344\\-291.34\\-27\\90.82031\\-292.1768\\-27\\88.86719\\-292.8079\\-27\\84.96094\\-293.7637\\-27\\83.00781\\-294.3378\\-27\\81.05469\\-294.6848\\-27\\79.10156\\-294.8961\\-27\\73.24219\\-295.2669\\-27\\69.33594\\-295.3585\\-27\\65.42969\\-295.2625\\-27\\61.52344\\-295.0682\\-27\\57.61719\\-294.764\\-27\\53.71094\\-294.2256\\-27\\51.75781\\-293.6643\\-27\\49.80469\\-293.2211\\-27\\45.89844\\-292.5848\\-27\\43.94531\\-292.1355\\-27\\41.99219\\-291.5695\\-27\\38.08594\\-291.0346\\-27\\32.22656\\-290.5131\\-27\\30.27344\\-290.4834\\-27\\26.36719\\-290.6189\\-27\\24.41406\\-290.7654\\-27\\18.55469\\-291.3366\\-27\\14.64844\\-291.8683\\-27\\12.69531\\-292.2303\\-27\\10.74219\\-292.4866\\-27\\6.835938\\-292.8392\\-27\\2.929688\\-293.0593\\-27\\-2.929688\\-293.2325\\-27\\-8.789063\\-293.2798\\-27\\-12.69531\\-293.214\\-27\\-16.60156\\-293.0754\\-27\\-18.55469\\-292.9471\\-27\\-22.46094\\-292.9138\\-27\\-30.27344\\-292.6747\\-27\\-32.22656\\-292.5889\\-27\\-38.08594\\-292.5077\\-27\\-41.99219\\-292.7846\\-27\\-45.89844\\-293.3707\\-27\\-49.80469\\-294.4049\\-27\\-51.75781\\-294.7054\\-27\\-57.61719\\-295.4112\\-27\\-61.52344\\-296.263\\-27\\-63.47656\\-296.566\\-27\\-67.38281\\-296.8853\\-27\\-71.28906\\-297.0524\\-27\\-73.24219\\-297.0762\\-27\\-77.14844\\-296.9886\\-27\\-81.05469\\-296.7497\\-27\\-83.00781\\-296.5457\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "289" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "113" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-296.1869\\-25\\-84.96094\\-295.6566\\-25\\-88.86719\\-294.9783\\-25\\-90.82031\\-294.5595\\-25\\-96.67969\\-292.3607\\-25\\-98.63281\\-291.2639\\-25\\-100.5859\\-290.5131\\-25\\-102.5391\\-289.3434\\-25\\-104.4922\\-288.6571\\-25\\-106.4453\\-287.4714\\-25\\-108.3984\\-286.5054\\-25\\-111.7188\\-284.2422\\-25\\-112.3047\\-283.7743\\-25\\-114.2578\\-282.8272\\-25\\-117.8416\\-280.3359\\-25\\-120.1172\\-278.8175\\-25\\-124.0234\\-275.74\\-25\\-127.9297\\-272.7145\\-25\\-131.8359\\-269.1887\\-25\\-133.7891\\-267.3219\\-25\\-136.2267\\-264.7109\\-25\\-139.6484\\-260.7629\\-25\\-142.6237\\-256.8984\\-25\\-144.0398\\-254.9453\\-25\\-145.1939\\-252.9922\\-25\\-147.9256\\-249.0859\\-25\\-148.7399\\-247.1328\\-25\\-149.9353\\-245.1797\\-25\\-150.6531\\-243.2266\\-25\\-151.8291\\-241.2734\\-25\\-152.5865\\-239.3203\\-25\\-153.6591\\-237.3672\\-25\\-155.0202\\-233.4609\\-25\\-155.862\\-231.5078\\-25\\-156.7415\\-227.6016\\-25\\-157.5834\\-225.6484\\-25\\-158.0897\\-223.6953\\-25\\-158.4806\\-221.7422\\-25\\-159.7667\\-217.8359\\-25\\-160.4912\\-213.9297\\-25\\-161.4873\\-210.0234\\-25\\-161.814\\-208.0703\\-25\\-162.1804\\-204.1641\\-25\\-162.4656\\-200.2578\\-25\\-162.6646\\-198.3047\\-25\\-163.3954\\-192.4453\\-25\\-163.5459\\-190.4922\\-25\\-163.7426\\-184.6328\\-25\\-163.75\\-180.7266\\-25\\-163.7042\\-176.8203\\-25\\-163.6136\\-174.8672\\-25\\-163.2957\\-170.9609\\-25\\-162.6994\\-167.0547\\-25\\-162.4826\\-165.1016\\-25\\-161.9486\\-159.2422\\-25\\-161.6498\\-157.2891\\-25\\-161.2009\\-155.3359\\-25\\-160.5808\\-153.3828\\-25\\-159.7129\\-149.4766\\-25\\-158.8653\\-147.5234\\-25\\-157.6666\\-143.6172\\-25\\-156.6992\\-141.6641\\-25\\-155.5577\\-137.7578\\-25\\-154.5911\\-135.8047\\-25\\-153.9292\\-133.8516\\-25\\-152.9391\\-131.8984\\-25\\-152.1846\\-129.9453\\-25\\-151.1193\\-127.9922\\-25\\-150.2924\\-126.0391\\-25\\-148.456\\-122.1328\\-25\\-147.4609\\-120.1917\\-25\\-145.5078\\-116.7859\\-25\\-145.1407\\-116.2734\\-25\\-144.1794\\-114.3203\\-25\\-142.946\\-112.3672\\-25\\-142.1862\\-110.4141\\-25\\-140.8386\\-108.4609\\-25\\-137.6953\\-103.7409\\-25\\-135.7422\\-101.0298\\-25\\-133.9072\\-98.69531\\-25\\-131.8359\\-96.39447\\-25\\-129.8828\\-94.47379\\-25\\-127.9206\\-92.83594\\-25\\-124.0234\\-89.82047\\-25\\-122.0703\\-88.44859\\-25\\-120.1172\\-87.7292\\-25\\-118.1641\\-86.41946\\-25\\-116.2109\\-85.58845\\-25\\-115.1968\\-85.02344\\-25\\-110.3516\\-82.80831\\-25\\-108.3984\\-82.17838\\-25\\-106.4453\\-81.75262\\-25\\-104.4922\\-80.68552\\-25\\-102.5391\\-80.31606\\-25\\-100.5859\\-79.49772\\-25\\-94.72656\\-77.63586\\-25\\-90.82031\\-76.69875\\-25\\-88.86719\\-76.29457\\-25\\-83.00781\\-75.84247\\-25\\-81.05469\\-75.61104\\-25\\-79.10156\\-74.76575\\-25\\-73.24219\\-74.37396\\-25\\-71.28906\\-74.44813\\-25\\-63.47656\\-74.33484\\-25\\-55.66406\\-74.30492\\-25\\-53.71094\\-74.32293\\-25\\-45.89844\\-74.60457\\-25\\-41.99219\\-74.90744\\-25\\-40.03906\\-75.18204\\-25\\-38.08594\\-75.62231\\-25\\-32.22656\\-76.31856\\-25\\-30.27344\\-76.63612\\-25\\-24.41406\\-78.53015\\-25\\-22.46094\\-79.36846\\-25\\-18.55469\\-80.81614\\-25\\-16.60156\\-81.8512\\-25\\-14.64844\\-82.6872\\-25\\-14.19975\\-83.07031\\-25\\-11.37251\\-85.02344\\-25\\-8.789063\\-87.15489\\-25\\-6.835938\\-88.66769\\-25\\-4.26794\\-90.88281\\-25\\-2.929688\\-91.93318\\-25\\-0.9765625\\-93.28723\\-25\\0.9765625\\-93.63982\\-25\\2.929688\\-92.95892\\-25\\4.882813\\-91.79717\\-25\\11.87525\\-85.02344\\-25\\12.69531\\-84.17057\\-25\\14.64844\\-82.4688\\-25\\18.55469\\-80.14697\\-25\\20.50781\\-79.04199\\-25\\22.46094\\-78.11472\\-25\\26.36719\\-76.4583\\-25\\30.27344\\-75.52155\\-25\\32.22656\\-74.687\\-25\\36.13281\\-74.16672\\-25\\38.08594\\-72.83385\\-25\\41.99219\\-72.64184\\-25\\43.94531\\-71.67709\\-25\\45.89844\\-71.62911\\-25\\47.85156\\-71.69336\\-25\\53.71094\\-71.64548\\-25\\63.47656\\-71.74829\\-25\\65.42969\\-72.3988\\-25\\67.38281\\-72.65535\\-25\\73.24219\\-72.83385\\-25\\75.19531\\-72.97916\\-25\\77.14844\\-74.22894\\-25\\81.05469\\-74.44297\\-25\\83.00781\\-74.609\\-25\\84.96094\\-74.88397\\-25\\86.91406\\-75.61476\\-25\\92.77344\\-76.45742\\-25\\94.72656\\-76.98714\\-25\\96.67969\\-77.67449\\-25\\100.5859\\-78.87109\\-25\\102.5391\\-79.76456\\-25\\104.4922\\-80.24464\\-25\\106.4453\\-80.88784\\-25\\108.3984\\-81.80393\\-25\\110.3516\\-82.38425\\-25\\112.3047\\-83.39584\\-25\\114.2578\\-84.26757\\-25\\116.2109\\-85.45525\\-25\\118.1641\\-86.33167\\-25\\120.1172\\-87.58292\\-25\\122.0703\\-88.38037\\-25\\124.0234\\-89.79569\\-25\\125.9766\\-91.33504\\-25\\127.9297\\-92.71387\\-25\\129.8828\\-94.35909\\-25\\131.8359\\-96.24366\\-25\\134.1266\\-98.69531\\-25\\135.7422\\-100.8523\\-25\\136.7371\\-102.6016\\-25\\138.0847\\-104.5547\\-25\\139.1763\\-106.5078\\-25\\140.5686\\-108.4609\\-25\\141.7015\\-110.4141\\-25\\142.5969\\-112.3672\\-25\\146.4563\\-120.1797\\-25\\147.4687\\-122.1328\\-25\\148.3191\\-124.0859\\-25\\148.9639\\-126.0391\\-25\\149.9449\\-127.9922\\-25\\150.5177\\-129.9453\\-25\\152.1692\\-133.8516\\-25\\152.8383\\-135.8047\\-25\\153.7781\\-137.7578\\-25\\154.8357\\-141.6641\\-25\\155.58\\-143.6172\\-25\\156.068\\-145.5703\\-25\\156.7223\\-149.4766\\-25\\157.4136\\-151.4297\\-25\\157.8863\\-153.3828\\-25\\158.4987\\-157.2891\\-25\\158.9054\\-159.2422\\-25\\159.4727\\-161.1953\\-25\\159.7827\\-163.1484\\-25\\160.7723\\-172.9141\\-25\\161.229\\-176.8203\\-25\\161.401\\-178.7734\\-25\\161.6084\\-182.6797\\-25\\161.6953\\-186.5859\\-25\\161.72\\-194.3984\\-25\\161.6615\\-200.2578\\-25\\161.53\\-204.1641\\-25\\161.2968\\-208.0703\\-25\\160.5504\\-213.9297\\-25\\160.1214\\-217.8359\\-25\\159.6051\\-221.7422\\-25\\158.5053\\-225.6484\\-25\\157.6885\\-229.5547\\-25\\156.8483\\-231.5078\\-25\\155.8789\\-235.4141\\-25\\154.9769\\-237.3672\\-25\\154.2239\\-239.3203\\-25\\153.3203\\-241.2614\\-25\\151.3672\\-244.5957\\-25\\150.9447\\-245.1797\\-25\\150.0165\\-247.1328\\-25\\148.6914\\-249.0859\\-25\\147.4693\\-251.0391\\-25\\146.0785\\-252.9922\\-25\\143.5547\\-256.0648\\-25\\139.6484\\-260.4366\\-25\\135.3441\\-264.7109\\-25\\131.8359\\-268.0481\\-25\\128.9597\\-270.5703\\-25\\125.9766\\-273.0498\\-25\\124.0234\\-274.5186\\-25\\122.0703\\-275.8271\\-25\\118.1641\\-278.6379\\-25\\116.2109\\-279.8409\\-25\\114.2578\\-281.1827\\-25\\112.0914\\-282.2891\\-25\\106.4453\\-285.306\\-25\\104.4922\\-286.4793\\-25\\102.5391\\-287.2939\\-25\\100.5859\\-288.2188\\-25\\98.63281\\-288.9794\\-25\\96.67969\\-289.4652\\-25\\94.72656\\-290.4206\\-25\\90.82031\\-291.5725\\-25\\88.86719\\-292.4706\\-25\\86.91406\\-292.9665\\-25\\84.96094\\-293.3511\\-25\\81.05469\\-294.3707\\-25\\79.10156\\-294.6447\\-25\\75.19531\\-294.9725\\-25\\73.24219\\-295.0499\\-25\\67.38281\\-295.123\\-25\\63.47656\\-295.0022\\-25\\59.57031\\-294.7713\\-25\\55.66406\\-294.3243\\-25\\51.75781\\-293.4472\\-25\\47.85156\\-292.7254\\-25\\45.89844\\-292.543\\-25\\43.94531\\-292.1494\\-25\\41.99219\\-291.6398\\-25\\38.08594\\-291.137\\-25\\34.17969\\-290.9032\\-25\\30.27344\\-290.8778\\-25\\26.36719\\-291.0527\\-25\\22.46094\\-291.437\\-25\\20.50781\\-291.7408\\-25\\16.60156\\-292.4636\\-25\\10.74219\\-293.0424\\-25\\6.835938\\-293.3712\\-25\\0.9765625\\-293.811\\-25\\-0.9765625\\-293.8951\\-25\\-6.835938\\-293.9999\\-25\\-12.69531\\-293.8672\\-25\\-18.55469\\-293.5361\\-25\\-32.22656\\-292.9692\\-25\\-36.13281\\-292.8693\\-25\\-40.03906\\-292.8768\\-25\\-41.99219\\-292.9764\\-25\\-45.89844\\-293.4701\\-25\\-49.80469\\-294.3513\\-25\\-51.75781\\-294.6321\\-25\\-57.61719\\-295.241\\-25\\-61.52344\\-295.8447\\-25\\-63.47656\\-296.263\\-25\\-67.38281\\-296.6737\\-25\\-73.24219\\-296.8596\\-25\\-77.14844\\-296.7774\\-25\\-81.05469\\-296.4897\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "301" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "114" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-81.05469\\-296.1187\\-23\\-83.00781\\-295.683\\-23\\-88.86719\\-294.7807\\-23\\-90.82031\\-294.2659\\-23\\-92.77344\\-293.4337\\-23\\-94.72656\\-292.843\\-23\\-98.63281\\-291.0425\\-23\\-102.5391\\-289.1779\\-23\\-104.4922\\-288.3926\\-23\\-104.8244\\-288.1484\\-23\\-108.328\\-286.1953\\-23\\-110.3516\\-284.9389\\-23\\-112.3047\\-283.5113\\-23\\-114.2578\\-282.5776\\-23\\-116.2109\\-281.2621\\-23\\-118.1641\\-279.7878\\-23\\-120.2098\\-278.3828\\-23\\-122.8896\\-276.4297\\-23\\-125.9766\\-273.9492\\-23\\-127.6474\\-272.5234\\-23\\-129.8828\\-270.4932\\-23\\-131.8359\\-268.8885\\-23\\-133.7891\\-267.0475\\-23\\-135.9566\\-264.7109\\-23\\-137.5394\\-262.7578\\-23\\-139.6484\\-260.4245\\-23\\-142.445\\-256.8984\\-23\\-143.8042\\-254.9453\\-23\\-144.9418\\-252.9922\\-23\\-147.7141\\-249.0859\\-23\\-148.6145\\-247.1328\\-23\\-149.7372\\-245.1797\\-23\\-150.5024\\-243.2266\\-23\\-151.6029\\-241.2734\\-23\\-152.3965\\-239.3203\\-23\\-153.4442\\-237.3672\\-23\\-154.1741\\-235.4141\\-23\\-154.8049\\-233.4609\\-23\\-155.6792\\-231.5078\\-23\\-156.179\\-229.5547\\-23\\-156.5341\\-227.6016\\-23\\-157.2932\\-225.6484\\-23\\-157.9174\\-223.6953\\-23\\-158.3003\\-221.7422\\-23\\-158.8056\\-219.7891\\-23\\-159.5567\\-217.8359\\-23\\-160.295\\-213.9297\\-23\\-160.7134\\-211.9766\\-23\\-161.2438\\-210.0234\\-23\\-161.6431\\-208.0703\\-23\\-162.0564\\-204.1641\\-23\\-162.4451\\-198.3047\\-23\\-163.1851\\-190.4922\\-23\\-163.4513\\-186.5859\\-23\\-163.5264\\-180.7266\\-23\\-163.4294\\-176.8203\\-23\\-163.3085\\-174.8672\\-23\\-162.4451\\-167.0547\\-23\\-161.991\\-161.1953\\-23\\-161.7615\\-159.2422\\-23\\-161.3909\\-157.2891\\-23\\-160.8028\\-155.3359\\-23\\-159.9375\\-151.4297\\-23\\-159.3914\\-149.4766\\-23\\-158.5342\\-147.5234\\-23\\-158.0191\\-145.5703\\-23\\-156.4559\\-141.6641\\-23\\-155.9933\\-139.7109\\-23\\-154.3893\\-135.8047\\-23\\-153.7044\\-133.8516\\-23\\-152.6712\\-131.8984\\-23\\-151.9355\\-129.9453\\-23\\-150.797\\-127.9922\\-23\\-150.0796\\-126.0391\\-23\\-148.9808\\-124.0859\\-23\\-148.2919\\-122.1328\\-23\\-147.0886\\-120.1797\\-23\\-146.1298\\-118.2266\\-23\\-144.892\\-116.2734\\-23\\-143.9779\\-114.3203\\-23\\-142.7901\\-112.3672\\-23\\-141.9573\\-110.4141\\-23\\-138.045\\-104.5547\\-23\\-135.7422\\-101.2788\\-23\\-133.7891\\-98.81622\\-23\\-131.8359\\-96.55808\\-23\\-129.8828\\-94.57115\\-23\\-125.24\\-90.88281\\-23\\-122.0703\\-88.55238\\-23\\-120.1172\\-87.78625\\-23\\-118.1641\\-86.52734\\-23\\-116.2109\\-85.69441\\-23\\-114.2578\\-84.57954\\-23\\-110.6934\\-83.07031\\-23\\-108.3984\\-82.19012\\-23\\-106.4453\\-81.72587\\-23\\-104.4922\\-80.70789\\-23\\-102.5391\\-80.33002\\-23\\-100.5859\\-79.41032\\-23\\-98.63281\\-78.88223\\-23\\-94.72656\\-77.63586\\-23\\-88.86719\\-76.28901\\-23\\-83.00781\\-75.72252\\-23\\-81.05469\\-74.97059\\-23\\-79.10156\\-74.7218\\-23\\-73.24219\\-74.3419\\-23\\-71.28906\\-74.39722\\-23\\-67.38281\\-74.32293\\-23\\-59.57031\\-74.23502\\-23\\-53.71094\\-74.24616\\-23\\-45.89844\\-74.53656\\-23\\-41.99219\\-74.76256\\-23\\-40.03906\\-74.94501\\-23\\-38.08594\\-75.44561\\-23\\-36.13281\\-75.77822\\-23\\-32.22656\\-76.22308\\-23\\-30.27344\\-76.5303\\-23\\-28.32031\\-77.03655\\-23\\-22.46094\\-79.06932\\-23\\-20.50781\\-79.95673\\-23\\-18.55469\\-80.67017\\-23\\-16.60156\\-81.73158\\-23\\-14.64844\\-82.47199\\-23\\-10.9933\\-85.02344\\-23\\-8.789063\\-86.8316\\-23\\-6.389293\\-88.92969\\-23\\-2.929688\\-91.72069\\-23\\-0.9765625\\-92.91303\\-23\\0.9765625\\-93.32107\\-23\\2.929688\\-92.52113\\-23\\4.882813\\-91.45528\\-23\\8.789063\\-87.88151\\-23\\11.74852\\-85.02344\\-23\\12.69531\\-84.02809\\-23\\14.64844\\-82.30927\\-23\\16.60156\\-81.02767\\-23\\18.55469\\-80.07264\\-23\\20.50781\\-78.92834\\-23\\24.41406\\-77.11098\\-23\\26.36719\\-76.36038\\-23\\28.32031\\-75.93956\\-23\\30.27344\\-75.10057\\-23\\32.22656\\-74.61341\\-23\\36.13281\\-74.11349\\-23\\38.08594\\-72.79101\\-23\\41.99219\\-71.74009\\-23\\43.94531\\-71.63816\\-23\\47.85156\\-71.62061\\-23\\49.80469\\-71.66751\\-23\\53.71094\\-71.62921\\-23\\55.66406\\-71.68997\\-23\\61.52344\\-71.72865\\-23\\65.42969\\-71.78898\\-23\\67.38281\\-72.58311\\-23\\73.24219\\-72.82507\\-23\\75.19531\\-72.95817\\-23\\77.14844\\-74.24056\\-23\\81.05469\\-74.41637\\-23\\84.96094\\-74.87173\\-23\\86.91406\\-75.59244\\-23\\92.77344\\-76.48153\\-23\\94.72656\\-77.02393\\-23\\98.63281\\-78.23688\\-23\\100.5859\\-78.92834\\-23\\102.5391\\-79.79702\\-23\\104.4922\\-80.26126\\-23\\106.4453\\-80.92793\\-23\\108.3984\\-81.81205\\-23\\110.3516\\-82.39703\\-23\\112.3047\\-83.42482\\-23\\114.2578\\-84.29376\\-23\\116.2109\\-85.49192\\-23\\118.1641\\-86.34395\\-23\\120.1172\\-87.60435\\-23\\122.0703\\-88.4175\\-23\\124.0234\\-89.85712\\-23\\125.9766\\-91.42182\\-23\\127.9297\\-92.79838\\-23\\129.8828\\-94.47379\\-23\\131.8359\\-96.37051\\-23\\133.8778\\-98.69531\\-23\\135.7422\\-101.163\\-23\\137.8338\\-104.5547\\-23\\138.9292\\-106.5078\\-23\\140.3623\\-108.4609\\-23\\141.3156\\-110.4141\\-23\\142.443\\-112.3672\\-23\\143.2147\\-114.3203\\-23\\144.2734\\-116.2734\\-23\\145.1239\\-118.2266\\-23\\146.2402\\-120.1797\\-23\\147.1102\\-122.1328\\-23\\148.11\\-124.0859\\-23\\148.7229\\-126.0391\\-23\\149.6452\\-127.9922\\-23\\150.9221\\-131.8984\\-23\\151.931\\-133.8516\\-23\\152.5934\\-135.8047\\-23\\153.4433\\-137.7578\\-23\\154.096\\-139.7109\\-23\\154.5917\\-141.6641\\-23\\155.8838\\-145.5703\\-23\\156.4927\\-149.4766\\-23\\156.9896\\-151.4297\\-23\\157.6613\\-153.3828\\-23\\158.0164\\-155.3359\\-23\\158.5904\\-159.2422\\-23\\159.5262\\-163.1484\\-23\\159.8045\\-165.1016\\-23\\160.6599\\-174.8672\\-23\\161.0508\\-178.7734\\-23\\161.349\\-182.6797\\-23\\161.4849\\-188.5391\\-23\\161.4957\\-196.3516\\-23\\161.4128\\-200.2578\\-23\\161.2283\\-204.1641\\-23\\160.9276\\-208.0703\\-23\\160.1313\\-215.8828\\-23\\159.6593\\-219.7891\\-23\\159.2605\\-221.7422\\-23\\158.6561\\-223.6953\\-23\\157.9061\\-227.6016\\-23\\157.3073\\-229.5547\\-23\\156.5496\\-231.5078\\-23\\156.1671\\-233.4609\\-23\\155.606\\-235.4141\\-23\\154.6497\\-237.3672\\-23\\153.996\\-239.3203\\-23\\152.8611\\-241.2734\\-23\\151.9104\\-243.2266\\-23\\150.5896\\-245.1797\\-23\\149.6601\\-247.1328\\-23\\148.4058\\-249.0859\\-23\\145.6586\\-252.9922\\-23\\143.5547\\-255.6208\\-23\\140.6864\\-258.8516\\-23\\137.6953\\-261.9723\\-23\\134.918\\-264.7109\\-23\\131.8359\\-267.6342\\-23\\128.3897\\-270.5703\\-23\\124.0234\\-274.0016\\-23\\120.1172\\-276.8511\\-23\\118.1641\\-278.0072\\-23\\114.2578\\-280.8176\\-23\\112.3047\\-281.7414\\-23\\110.3516\\-282.9337\\-23\\108.3984\\-283.7375\\-23\\106.4453\\-284.9236\\-23\\104.4922\\-285.8653\\-23\\102.5391\\-286.9777\\-23\\100.5859\\-287.6831\\-23\\98.63281\\-288.6829\\-23\\96.67969\\-289.1897\\-23\\94.72656\\-289.8093\\-23\\92.77344\\-290.7325\\-23\\90.82031\\-291.2213\\-23\\86.91406\\-292.6757\\-23\\83.00781\\-293.4161\\-23\\79.10156\\-294.3333\\-23\\77.14844\\-294.5962\\-23\\75.19531\\-294.7595\\-23\\71.28906\\-294.9259\\-23\\65.42969\\-294.9079\\-23\\61.52344\\-294.7358\\-23\\57.61719\\-294.3599\\-23\\53.71094\\-293.6132\\-23\\49.80469\\-293.0012\\-23\\47.85156\\-292.6009\\-23\\45.89844\\-292.5255\\-23\\43.94531\\-292.1768\\-23\\41.99219\\-291.7159\\-23\\40.03906\\-291.4317\\-23\\38.08594\\-291.2683\\-23\\34.17969\\-291.117\\-23\\30.27344\\-291.1763\\-23\\26.36719\\-291.4958\\-23\\22.46094\\-292.2904\\-23\\20.50781\\-292.5797\\-23\\12.69531\\-293.3869\\-23\\8.789063\\-293.9834\\-23\\6.835938\\-294.2256\\-23\\2.929688\\-294.4865\\-23\\-0.9765625\\-294.6159\\-23\\-8.789063\\-294.6447\\-23\\-10.74219\\-294.6074\\-23\\-18.55469\\-294.3489\\-23\\-24.41406\\-293.9846\\-23\\-28.32031\\-293.6186\\-23\\-32.22656\\-293.351\\-23\\-38.08594\\-293.1279\\-23\\-41.99219\\-293.194\\-23\\-43.94531\\-293.3399\\-23\\-45.89844\\-293.5977\\-23\\-49.80469\\-294.3265\\-23\\-51.75781\\-294.5739\\-23\\-57.61719\\-295.1033\\-23\\-61.52344\\-295.5262\\-23\\-67.38281\\-296.4201\\-23\\-73.24219\\-296.6445\\-23\\-77.14844\\-296.5372\\-23\\-79.10156\\-296.387\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "285" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "115" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-77.14844\\-296.1187\\-21\\-83.00781\\-295.3458\\-21\\-86.91406\\-294.8897\\-21\\-88.86719\\-294.5248\\-21\\-92.77344\\-293.1357\\-21\\-94.72656\\-292.5684\\-21\\-96.67969\\-291.5215\\-21\\-98.63281\\-290.8203\\-21\\-100.5859\\-289.6907\\-21\\-102.5391\\-289.0212\\-21\\-106.4453\\-287.0025\\-21\\-108.3984\\-285.7361\\-21\\-110.3516\\-284.6523\\-21\\-112.3047\\-283.302\\-21\\-114.1168\\-282.2891\\-21\\-116.2109\\-281.011\\-21\\-117.0221\\-280.3359\\-21\\-120.1172\\-278.0157\\-21\\-122.0703\\-276.7481\\-21\\-124.0234\\-275.2773\\-21\\-127.3095\\-272.5234\\-21\\-133.7967\\-266.6641\\-21\\-137.2878\\-262.7578\\-21\\-140.7175\\-258.8516\\-21\\-142.2637\\-256.8984\\-21\\-144.7393\\-252.9922\\-21\\-146.189\\-251.0391\\-21\\-147.4609\\-249.0311\\-21\\-148.4911\\-247.1328\\-21\\-152.2111\\-239.3203\\-21\\-154.0154\\-235.4141\\-21\\-154.6123\\-233.4609\\-21\\-155.4184\\-231.5078\\-21\\-156.0535\\-229.5547\\-21\\-156.3985\\-227.6016\\-21\\-156.9245\\-225.6484\\-21\\-157.7234\\-223.6953\\-21\\-158.5673\\-219.7891\\-21\\-159.7786\\-215.8828\\-21\\-160.4949\\-211.9766\\-21\\-161.3909\\-208.0703\\-21\\-161.7163\\-206.1172\\-21\\-161.92\\-204.1641\\-21\\-162.3204\\-198.3047\\-21\\-162.8862\\-188.5391\\-21\\-163.0466\\-186.5859\\-21\\-163.1995\\-180.7266\\-21\\-162.9024\\-174.8672\\-21\\-162.5784\\-170.9609\\-21\\-162.1804\\-165.1016\\-21\\-161.8103\\-161.1953\\-21\\-161.5115\\-159.2422\\-21\\-160.4875\\-155.3359\\-21\\-159.7024\\-151.4297\\-21\\-158.917\\-149.4766\\-21\\-158.2905\\-147.5234\\-21\\-157.7691\\-145.5703\\-21\\-156.8346\\-143.6172\\-21\\-155.7342\\-139.7109\\-21\\-154.8462\\-137.7578\\-21\\-154.1776\\-135.8047\\-21\\-153.3579\\-133.8516\\-21\\-152.427\\-131.8984\\-21\\-151.6281\\-129.9453\\-21\\-150.5726\\-127.9922\\-21\\-149.8473\\-126.0391\\-21\\-148.778\\-124.0859\\-21\\-148.0801\\-122.1328\\-21\\-146.8418\\-120.1797\\-21\\-145.8839\\-118.2266\\-21\\-144.6649\\-116.2734\\-21\\-143.7124\\-114.3203\\-21\\-141.6254\\-110.4141\\-21\\-140.473\\-108.4609\\-21\\-139.0118\\-106.5078\\-21\\-136.5145\\-102.6016\\-21\\-135.0338\\-100.6484\\-21\\-131.8359\\-96.78658\\-21\\-129.8828\\-94.78027\\-21\\-125.0895\\-90.88281\\-21\\-122.0703\\-88.6875\\-21\\-120.1172\\-87.83181\\-21\\-118.1641\\-86.61462\\-21\\-116.2109\\-85.73784\\-21\\-114.2578\\-84.6365\\-21\\-108.3984\\-82.15314\\-21\\-106.4453\\-81.68965\\-21\\-104.4922\\-80.68552\\-21\\-102.5391\\-80.31123\\-21\\-100.5859\\-79.37822\\-21\\-94.72656\\-77.68853\\-21\\-92.77344\\-77.25096\\-21\\-90.82031\\-76.6851\\-21\\-88.86719\\-76.24785\\-21\\-83.00781\\-75.68506\\-21\\-81.05469\\-74.8816\\-21\\-77.14844\\-74.52539\\-21\\-73.24219\\-74.32977\\-21\\-69.33594\\-74.26955\\-21\\-65.42969\\-74.2636\\-21\\-59.57031\\-74.18359\\-21\\-51.75781\\-74.24574\\-21\\-43.94531\\-74.52856\\-21\\-40.03906\\-74.79448\\-21\\-38.08594\\-75.05605\\-21\\-36.13281\\-75.64707\\-21\\-30.27344\\-76.4057\\-21\\-28.32031\\-76.85523\\-21\\-24.41406\\-78.16466\\-21\\-22.46094\\-78.87109\\-21\\-20.50781\\-79.83019\\-21\\-18.55469\\-80.53776\\-21\\-16.60156\\-81.6553\\-21\\-14.64844\\-82.35244\\-21\\-10.74219\\-84.83707\\-21\\-6.835938\\-88.21122\\-21\\-4.882813\\-90.00185\\-21\\-2.929688\\-91.68066\\-21\\-0.9765625\\-92.41056\\-21\\0.9940011\\-92.83594\\-21\\2.929688\\-92.23036\\-21\\4.882813\\-91.01051\\-21\\6.835938\\-89.26296\\-21\\11.15829\\-85.02344\\-21\\13.4639\\-83.07031\\-21\\16.60156\\-80.84136\\-21\\18.55469\\-79.99664\\-21\\20.50781\\-78.77467\\-21\\24.41406\\-76.93694\\-21\\26.36719\\-76.25269\\-21\\28.32031\\-75.85252\\-21\\30.27344\\-74.94004\\-21\\32.22656\\-74.5238\\-21\\34.17969\\-74.28125\\-21\\36.13281\\-72.87\\-21\\40.03906\\-72.66914\\-21\\41.99219\\-71.76109\\-21\\43.94531\\-71.66691\\-21\\47.85156\\-71.60069\\-21\\55.66406\\-71.68666\\-21\\57.61719\\-71.66444\\-21\\61.52344\\-71.76733\\-21\\67.38281\\-71.72717\\-21\\69.33594\\-72.68324\\-21\\73.24219\\-72.82507\\-21\\75.19531\\-72.9686\\-21\\77.14844\\-74.22894\\-21\\81.05469\\-74.41637\\-21\\84.96094\\-74.85659\\-21\\86.91406\\-75.60609\\-21\\90.82031\\-76.17119\\-21\\92.77344\\-76.50806\\-21\\98.63281\\-78.28681\\-21\\102.5391\\-79.83694\\-21\\104.4922\\-80.30436\\-21\\106.4453\\-80.97108\\-21\\108.3984\\-81.84495\\-21\\110.3516\\-82.4377\\-21\\112.3047\\-83.47012\\-21\\114.2578\\-84.32668\\-21\\116.2109\\-85.52474\\-21\\118.1641\\-86.36077\\-21\\120.1172\\-87.64212\\-21\\122.0703\\-88.46233\\-21\\124.0234\\-89.89426\\-21\\125.9766\\-91.48235\\-21\\127.8363\\-92.83594\\-21\\129.8828\\-94.60189\\-21\\131.8359\\-96.63368\\-21\\133.7891\\-98.95753\\-21\\135.0935\\-100.6484\\-21\\136.473\\-102.6016\\-21\\137.4741\\-104.5547\\-21\\138.7165\\-106.5078\\-21\\140.0832\\-108.4609\\-21\\141.0391\\-110.4141\\-21\\142.2505\\-112.3672\\-21\\142.9542\\-114.3203\\-21\\144.0677\\-116.2734\\-21\\144.8272\\-118.2266\\-21\\145.9837\\-120.1797\\-21\\146.7881\\-122.1328\\-21\\147.8529\\-124.0859\\-21\\148.5103\\-126.0391\\-21\\150.116\\-129.9453\\-21\\150.6553\\-131.8984\\-21\\151.6029\\-133.8516\\-21\\153.0287\\-137.7578\\-21\\153.8826\\-139.7109\\-21\\154.8952\\-143.6172\\-21\\155.6085\\-145.5703\\-21\\156.0584\\-147.5234\\-21\\156.673\\-151.4297\\-21\\157.2932\\-153.3828\\-21\\157.8039\\-155.3359\\-21\\158.339\\-159.2422\\-21\\158.6709\\-161.1953\\-21\\159.5365\\-165.1016\\-21\\159.772\\-167.0547\\-21\\160.1166\\-170.9609\\-21\\160.9134\\-182.6797\\-21\\161.1097\\-188.5391\\-21\\161.1251\\-192.4453\\-21\\160.9809\\-200.2578\\-21\\160.5656\\-208.0703\\-21\\160.1072\\-213.9297\\-21\\159.6934\\-217.8359\\-21\\159.3018\\-219.7891\\-21\\158.7656\\-221.7422\\-21\\158.0404\\-225.6484\\-21\\157.6135\\-227.6016\\-21\\156.8185\\-229.5547\\-21\\155.9602\\-233.4609\\-21\\154.3916\\-237.3672\\-21\\153.6654\\-239.3203\\-21\\152.5018\\-241.2734\\-21\\151.3672\\-243.3808\\-21\\148.0455\\-249.0859\\-21\\143.6406\\-254.9453\\-21\\141.9847\\-256.8984\\-21\\137.6953\\-261.5156\\-21\\134.4329\\-264.7109\\-21\\131.8359\\-267.1523\\-21\\129.8828\\-268.8493\\-21\\125.9766\\-271.8579\\-21\\124.0234\\-273.5369\\-21\\122.0703\\-275.0937\\-21\\120.1172\\-276.2514\\-21\\118.1641\\-277.564\\-21\\116.2109\\-279.0359\\-21\\114.1385\\-280.3359\\-21\\110.3516\\-282.5103\\-21\\108.3984\\-283.3722\\-21\\106.4453\\-284.5298\\-21\\104.4922\\-285.4313\\-21\\102.5391\\-286.5948\\-21\\100.5859\\-287.3155\\-21\\98.63281\\-288.2344\\-21\\96.67969\\-288.9602\\-21\\94.72656\\-289.4161\\-21\\92.77344\\-290.2785\\-21\\90.82031\\-290.935\\-21\\88.86719\\-291.4245\\-21\\86.91406\\-292.2033\\-21\\84.96094\\-292.732\\-21\\81.05469\\-293.4011\\-21\\77.14844\\-294.2003\\-21\\75.19531\\-294.4541\\-21\\71.28906\\-294.6968\\-21\\67.38281\\-294.7521\\-21\\61.52344\\-294.5274\\-21\\57.61719\\-294.0608\\-21\\53.71094\\-293.3901\\-21\\47.85156\\-292.697\\-21\\45.89844\\-292.5255\\-21\\43.94531\\-292.2291\\-21\\41.99219\\-291.8123\\-21\\40.03906\\-291.5941\\-21\\36.13281\\-291.3946\\-21\\32.22656\\-291.4745\\-21\\30.27344\\-291.5818\\-21\\28.32031\\-291.8579\\-21\\24.41406\\-292.6168\\-21\\18.55469\\-293.2652\\-21\\14.64844\\-293.805\\-21\\12.69531\\-294.1484\\-21\\8.789063\\-294.5849\\-21\\4.882813\\-294.8145\\-21\\-0.9765625\\-294.9663\\-21\\-8.789063\\-294.9904\\-21\\-16.60156\\-294.8196\\-21\\-24.41406\\-294.5341\\-21\\-30.27344\\-294.046\\-21\\-32.22656\\-293.8096\\-21\\-36.13281\\-293.5133\\-21\\-40.03906\\-293.4126\\-21\\-41.99219\\-293.4472\\-21\\-45.89844\\-293.7852\\-21\\-49.80469\\-294.3466\\-21\\-53.71094\\-294.7054\\-21\\-61.52344\\-295.2911\\-21\\-65.42969\\-295.7059\\-21\\-67.38281\\-295.969\\-21\\-71.28906\\-296.2389\\-21\\-75.19531\\-296.263\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "298" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "116" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.86719\\-294.2017\\-19\\-90.82031\\-293.4387\\-19\\-92.77344\\-292.8896\\-19\\-94.72656\\-292.1768\\-19\\-96.67969\\-291.2365\\-19\\-98.63281\\-290.5432\\-19\\-100.5859\\-289.4006\\-19\\-102.5391\\-288.8186\\-19\\-104.4922\\-287.6536\\-19\\-106.4453\\-286.761\\-19\\-108.3984\\-285.4243\\-19\\-112.3047\\-283.1163\\-19\\-114.2578\\-281.794\\-19\\-116.2109\\-280.7534\\-19\\-120.1172\\-277.6931\\-19\\-124.0234\\-275.0434\\-19\\-125.9766\\-273.4161\\-19\\-129.2641\\-270.5703\\-19\\-133.421\\-266.6641\\-19\\-137.6953\\-262.1043\\-19\\-138.7579\\-260.8047\\-19\\-140.5094\\-258.8516\\-19\\-142.0506\\-256.8984\\-19\\-143.2166\\-254.9453\\-19\\-144.5368\\-252.9922\\-19\\-145.9863\\-251.0391\\-19\\-147.1052\\-249.0859\\-19\\-148.3244\\-247.1328\\-19\\-149.1277\\-245.1797\\-19\\-150.2179\\-243.2266\\-19\\-150.9698\\-241.2734\\-19\\-152.0594\\-239.3203\\-19\\-152.8289\\-237.3672\\-19\\-153.8503\\-235.4141\\-19\\-154.4356\\-233.4609\\-19\\-155.8966\\-229.5547\\-19\\-156.691\\-225.6484\\-19\\-157.474\\-223.6953\\-19\\-157.9949\\-221.7422\\-19\\-158.8607\\-217.8359\\-19\\-159.5861\\-215.8828\\-19\\-160.6476\\-210.0234\\-19\\-161.5221\\-206.1172\\-19\\-161.7658\\-204.1641\\-19\\-162.0564\\-200.2578\\-19\\-162.2842\\-196.3516\\-19\\-162.495\\-190.4922\\-19\\-162.6779\\-186.5859\\-19\\-162.772\\-180.7266\\-19\\-162.6107\\-174.8672\\-19\\-162.3011\\-169.0078\\-19\\-162.0265\\-165.1016\\-19\\-161.589\\-161.1953\\-19\\-161.1713\\-159.2422\\-19\\-160.6383\\-157.2891\\-19\\-159.8712\\-153.3828\\-19\\-159.3541\\-151.4297\\-19\\-158.5644\\-149.4766\\-19\\-158.0702\\-147.5234\\-19\\-157.4383\\-145.5703\\-19\\-156.5491\\-143.6172\\-19\\-156.1166\\-141.6641\\-19\\-155.4349\\-139.7109\\-19\\-154.5786\\-137.7578\\-19\\-153.9498\\-135.8047\\-19\\-152.9833\\-133.8516\\-19\\-152.1801\\-131.8984\\-19\\-151.2211\\-129.9453\\-19\\-149.5625\\-126.0391\\-19\\-148.6044\\-124.0859\\-19\\-147.8392\\-122.1328\\-19\\-145.5078\\-118.2165\\-19\\-143.3893\\-114.3203\\-19\\-142.4731\\-112.3672\\-19\\-141.3215\\-110.4141\\-19\\-140.2856\\-108.4609\\-19\\-138.7707\\-106.5078\\-19\\-137.5016\\-104.5547\\-19\\-136.3551\\-102.6016\\-19\\-133.7891\\-99.37139\\-19\\-131.8359\\-97.05368\\-19\\-129.8828\\-95.01834\\-19\\-127.3519\\-92.83594\\-19\\-124.0234\\-90.17543\\-19\\-122.0703\\-88.85326\\-19\\-120.1172\\-87.88599\\-19\\-118.1641\\-86.69856\\-19\\-116.2109\\-85.78225\\-19\\-114.2578\\-84.75291\\-19\\-112.3047\\-83.83664\\-19\\-108.3984\\-82.15479\\-19\\-106.4453\\-81.68401\\-19\\-104.4922\\-80.64983\\-19\\-102.5391\\-80.29757\\-19\\-100.5859\\-79.37822\\-19\\-96.67969\\-78.28648\\-19\\-92.77344\\-77.31332\\-19\\-90.82031\\-76.66541\\-19\\-88.86719\\-76.23438\\-19\\-83.00781\\-75.68211\\-19\\-81.05469\\-74.84041\\-19\\-79.10156\\-74.59515\\-19\\-77.14844\\-74.4494\\-19\\-71.28906\\-74.33484\\-19\\-67.38281\\-74.22346\\-19\\-61.52344\\-74.20035\\-19\\-59.57031\\-74.01432\\-19\\-57.61719\\-74.00701\\-19\\-55.66406\\-74.16672\\-19\\-51.75781\\-73.99525\\-19\\-49.80469\\-74.29309\\-19\\-43.94531\\-74.44813\\-19\\-40.03906\\-74.68137\\-19\\-38.08594\\-74.90201\\-19\\-34.17969\\-75.78758\\-19\\-30.27344\\-76.31856\\-19\\-28.32031\\-76.68461\\-19\\-22.46094\\-78.72017\\-19\\-20.50781\\-79.67269\\-19\\-18.55469\\-80.38004\\-19\\-16.60156\\-81.43291\\-19\\-14.64844\\-82.21269\\-19\\-13.09275\\-83.07031\\-19\\-10.74219\\-84.57719\\-19\\-8.789063\\-86.3196\\-19\\-7.900551\\-86.97656\\-19\\-5.801505\\-88.92969\\-19\\-4.266401\\-90.88281\\-19\\-2.929688\\-92.05347\\-19\\-0.9765625\\-92.15449\\-19\\0.9765625\\-92.46895\\-19\\2.929688\\-91.9707\\-19\\4.596044\\-90.88281\\-19\\8.789063\\-87.17533\\-19\\10.74219\\-85.15082\\-19\\13.16445\\-83.07031\\-19\\16.60156\\-80.72798\\-19\\18.55469\\-79.906\\-19\\20.50781\\-78.61944\\-19\\22.46094\\-77.78653\\-19\\24.41406\\-76.80843\\-19\\26.36719\\-76.17446\\-19\\28.32031\\-75.77482\\-19\\30.27344\\-74.83611\\-19\\32.22656\\-74.47531\\-19\\34.17969\\-74.25218\\-19\\36.13281\\-72.85171\\-19\\40.03906\\-72.66249\\-19\\41.99219\\-71.77303\\-19\\45.89844\\-71.6513\\-19\\49.80469\\-71.60755\\-19\\51.75781\\-71.671\\-19\\57.61719\\-71.67064\\-19\\61.52344\\-71.76733\\-19\\65.42969\\-71.77303\\-19\\67.38281\\-71.72308\\-19\\69.33594\\-72.67616\\-19\\73.24219\\-72.81641\\-19\\75.19531\\-72.98988\\-19\\77.14844\\-74.21191\\-19\\79.10156\\-74.29295\\-19\\83.00781\\-74.60013\\-19\\84.96094\\-74.85659\\-19\\86.91406\\-75.63081\\-19\\90.82031\\-76.20565\\-19\\92.77344\\-76.55363\\-19\\94.72656\\-77.26352\\-19\\98.63281\\-78.40331\\-19\\102.5391\\-79.9023\\-19\\104.4922\\-80.36095\\-19\\108.3984\\-81.86506\\-19\\110.3516\\-82.46696\\-19\\112.3047\\-83.53323\\-19\\114.2578\\-84.37424\\-19\\116.2109\\-85.57513\\-19\\118.1641\\-86.41219\\-19\\120.1172\\-87.69517\\-19\\122.0703\\-88.52338\\-19\\124.0234\\-89.96616\\-19\\127.6495\\-92.83594\\-19\\129.8372\\-94.78906\\-19\\131.8359\\-96.91898\\-19\\133.7891\\-99.28639\\-19\\136.2953\\-102.6016\\-19\\137.1535\\-104.5547\\-19\\137.6953\\-105.2486\\-19\\139.7578\\-108.4609\\-19\\140.8031\\-110.4141\\-19\\141.9992\\-112.3672\\-19\\142.7471\\-114.3203\\-19\\143.7789\\-116.2734\\-19\\144.6145\\-118.2266\\-19\\145.6575\\-120.1797\\-19\\147.5143\\-124.0859\\-19\\148.335\\-126.0391\\-19\\148.9639\\-127.9922\\-19\\149.9023\\-129.9453\\-19\\150.4592\\-131.8984\\-19\\151.1659\\-133.8516\\-19\\152.0916\\-135.8047\\-19\\152.7063\\-137.7578\\-19\\153.5965\\-139.7109\\-19\\154.1741\\-141.6641\\-19\\154.6452\\-143.6172\\-19\\155.862\\-147.5234\\-19\\156.2088\\-149.4766\\-19\\156.4534\\-151.4297\\-19\\156.8427\\-153.3828\\-19\\157.4857\\-155.3359\\-19\\157.8863\\-157.2891\\-19\\158.6914\\-163.1484\\-19\\159.5158\\-167.0547\\-19\\159.9134\\-170.9609\\-19\\160.3829\\-178.7734\\-19\\160.6599\\-184.6328\\-19\\160.7281\\-192.4453\\-19\\160.6172\\-200.2578\\-19\\160.298\\-208.0703\\-19\\159.8931\\-213.9297\\-19\\159.685\\-215.8828\\-19\\159.3541\\-217.8359\\-19\\158.8286\\-219.7891\\-19\\158.4499\\-221.7422\\-19\\157.8026\\-225.6484\\-19\\156.529\\-229.5547\\-19\\156.1607\\-231.5078\\-19\\155.6792\\-233.4609\\-19\\154.7885\\-235.4141\\-19\\154.1516\\-237.3672\\-19\\152.2066\\-241.2734\\-19\\150.9638\\-243.2266\\-19\\150.0543\\-245.1797\\-19\\148.7523\\-247.1328\\-19\\147.6263\\-249.0859\\-19\\146.2387\\-251.0391\\-19\\144.6337\\-252.9922\\-19\\143.5547\\-254.4489\\-19\\141.6016\\-256.7961\\-19\\137.6953\\-260.9151\\-19\\135.8685\\-262.7578\\-19\\133.815\\-264.7109\\-19\\129.473\\-268.6172\\-19\\127.1045\\-270.5703\\-19\\124.6303\\-272.5234\\-19\\124.0234\\-273.1053\\-19\\122.0703\\-274.6274\\-19\\120.1172\\-275.7595\\-19\\118.1641\\-277.2122\\-19\\116.2109\\-278.5382\\-19\\114.2578\\-279.7287\\-19\\112.3047\\-281.0353\\-19\\110.3516\\-281.9834\\-19\\108.3984\\-283.0979\\-19\\106.4453\\-283.8929\\-19\\104.4922\\-285.0737\\-19\\100.5859\\-287.0063\\-19\\98.63281\\-287.7212\\-19\\96.67969\\-288.6732\\-19\\92.77344\\-289.7123\\-19\\90.82031\\-290.6046\\-19\\86.91406\\-291.5847\\-19\\84.96094\\-292.3365\\-19\\83.00781\\-292.756\\-19\\73.24219\\-294.2256\\-19\\69.33594\\-294.4738\\-19\\65.42969\\-294.4834\\-19\\61.52344\\-294.2641\\-19\\59.57031\\-294.0307\\-19\\53.71094\\-293.2255\\-19\\45.89844\\-292.5077\\-19\\41.99219\\-291.9578\\-19\\40.03906\\-291.802\\-19\\36.13281\\-291.7182\\-19\\32.22656\\-292.0013\\-19\\28.32031\\-292.5574\\-19\\22.46094\\-293.2501\\-19\\20.50781\\-293.5261\\-19\\16.60156\\-294.2798\\-19\\10.74219\\-294.8247\\-19\\4.882813\\-295.1265\\-19\\0.9765625\\-295.2378\\-19\\-2.929688\\-295.2868\\-19\\-8.789063\\-295.2994\\-19\\-16.60156\\-295.1003\\-19\\-24.41406\\-294.8236\\-19\\-30.27344\\-294.4961\\-19\\-36.13281\\-293.9544\\-19\\-40.03906\\-293.7377\\-19\\-43.94531\\-293.8256\\-19\\-47.85156\\-294.2101\\-19\\-55.66406\\-294.7781\\-19\\-61.52344\\-295.123\\-19\\-69.33594\\-295.6643\\-19\\-71.28906\\-295.7316\\-19\\-75.19531\\-295.7448\\-19\\-81.05469\\-295.3078\\-19\\-84.96094\\-294.9314\\-19\\-86.91406\\-294.6649\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "295" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "117" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-294.3814\\-17\\-90.82031\\-293.1252\\-17\\-92.77344\\-292.6295\\-17\\-94.72656\\-291.6478\\-17\\-96.67969\\-290.9908\\-17\\-100.5859\\-289.2238\\-17\\-102.5391\\-288.5349\\-17\\-104.4922\\-287.3803\\-17\\-106.4453\\-286.4498\\-17\\-109.8501\\-284.2422\\-17\\-110.3516\\-283.8388\\-17\\-112.3047\\-282.8803\\-17\\-114.2578\\-281.5364\\-17\\-116.2109\\-280.4068\\-17\\-118.1641\\-278.9852\\-17\\-120.1172\\-277.4233\\-17\\-122.0703\\-276.0376\\-17\\-124.0234\\-274.7567\\-17\\-128.958\\-270.5703\\-17\\-131.8359\\-267.9283\\-17\\-135.0215\\-264.7109\\-17\\-137.6953\\-261.8253\\-17\\-140.2618\\-258.8516\\-17\\-141.7683\\-256.8984\\-17\\-142.9606\\-254.9453\\-17\\-143.5547\\-254.2129\\-17\\-145.5078\\-251.2425\\-17\\-146.8372\\-249.0859\\-17\\-148.1506\\-247.1328\\-17\\-148.9155\\-245.1797\\-17\\-150.0588\\-243.2266\\-17\\-150.7429\\-241.2734\\-17\\-151.8703\\-239.3203\\-17\\-152.622\\-237.3672\\-17\\-153.648\\-235.4141\\-17\\-154.8705\\-231.5078\\-17\\-155.6929\\-229.5547\\-17\\-156.1798\\-227.6016\\-17\\-156.5073\\-225.6484\\-17\\-157.1121\\-223.6953\\-17\\-157.8296\\-221.7422\\-17\\-158.6062\\-217.8359\\-17\\-159.3283\\-215.8828\\-17\\-159.8007\\-213.9297\\-17\\-160.7917\\-208.0703\\-17\\-161.243\\-206.1172\\-17\\-161.583\\-204.1641\\-17\\-161.9339\\-200.2578\\-17\\-162.1511\\-196.3516\\-17\\-162.4127\\-188.5391\\-17\\-162.5038\\-180.7266\\-17\\-162.4127\\-174.8672\\-17\\-162.1567\\-169.0078\\-17\\-161.8652\\-165.1016\\-17\\-161.6524\\-163.1484\\-17\\-161.2992\\-161.1953\\-17\\-160.3702\\-157.2891\\-17\\-159.6263\\-153.3828\\-17\\-158.8716\\-151.4297\\-17\\-157.8179\\-147.5234\\-17\\-156.9972\\-145.5703\\-17\\-156.367\\-143.6172\\-17\\-155.9393\\-141.6641\\-17\\-155.098\\-139.7109\\-17\\-153.6944\\-135.8047\\-17\\-152.6994\\-133.8516\\-17\\-151.9413\\-131.8984\\-17\\-150.8855\\-129.9453\\-17\\-150.1894\\-127.9922\\-17\\-149.1911\\-126.0391\\-17\\-148.4194\\-124.0859\\-17\\-147.5\\-122.1328\\-17\\-146.3712\\-120.1797\\-17\\-145.1348\\-118.2266\\-17\\-144.2562\\-116.2734\\-17\\-143.1089\\-114.3203\\-17\\-142.3215\\-112.3672\\-17\\-141.0973\\-110.4141\\-17\\-140.0706\\-108.4609\\-17\\-138.6041\\-106.5078\\-17\\-137.286\\-104.5547\\-17\\-136.2055\\-102.6016\\-17\\-133.7891\\-99.56608\\-17\\-131.8359\\-97.29688\\-17\\-129.8828\\-95.23296\\-17\\-127.1891\\-92.83594\\-17\\-125.9766\\-92.03645\\-17\\-124.0234\\-90.29556\\-17\\-121.9644\\-88.92969\\-17\\-120.1172\\-87.9593\\-17\\-118.1641\\-86.77681\\-17\\-116.2109\\-85.85183\\-17\\-112.3047\\-83.83611\\-17\\-108.3984\\-82.10741\\-17\\-106.4453\\-81.71551\\-17\\-104.4922\\-80.61159\\-17\\-102.5391\\-80.27931\\-17\\-100.5859\\-79.43717\\-17\\-92.77344\\-77.28358\\-17\\-90.82031\\-76.64806\\-17\\-88.86719\\-76.22768\\-17\\-83.00781\\-75.68805\\-17\\-81.05469\\-74.78876\\-17\\-77.14844\\-74.4882\\-17\\-71.28906\\-74.31066\\-17\\-63.47656\\-74.19405\\-17\\-61.52344\\-74.11437\\-17\\-59.57031\\-73.1303\\-17\\-55.66406\\-73.1431\\-17\\-53.71094\\-73.09299\\-17\\-49.80469\\-74.2283\\-17\\-43.94531\\-74.40257\\-17\\-40.03906\\-74.60457\\-17\\-36.13281\\-75.00967\\-17\\-34.17969\\-75.67634\\-17\\-28.32031\\-76.58618\\-17\\-26.36719\\-77.20331\\-17\\-22.46094\\-78.60995\\-17\\-20.50781\\-79.5276\\-17\\-18.55469\\-80.26347\\-17\\-16.61551\\-81.11719\\-17\\-12.69531\\-83.02893\\-17\\-9.790453\\-85.02344\\-17\\-7.473186\\-86.97656\\-17\\-5.366991\\-88.92969\\-17\\-2.929688\\-91.5542\\-17\\-0.9765625\\-91.94205\\-17\\0.9765625\\-92.15285\\-17\\2.929688\\-91.74593\\-17\\4.254482\\-90.88281\\-17\\6.571785\\-88.92969\\-17\\8.789063\\-86.86031\\-17\\10.74219\\-84.86196\\-17\\12.88859\\-83.07031\\-17\\16.60156\\-80.61866\\-17\\18.55469\\-79.64133\\-17\\20.50781\\-78.46834\\-17\\22.46094\\-77.69262\\-17\\24.41406\\-76.72581\\-17\\26.36719\\-76.11984\\-17\\28.32031\\-75.7162\\-17\\30.27344\\-74.75538\\-17\\34.17969\\-74.23502\\-17\\36.13281\\-72.82507\\-17\\38.08594\\-72.71983\\-17\\40.03906\\-72.29057\\-17\\41.99219\\-71.71135\\-17\\43.94531\\-71.75195\\-17\\45.89844\\-71.68666\\-17\\49.80469\\-71.66143\\-17\\51.75781\\-71.74038\\-17\\53.71094\\-71.68306\\-17\\59.57031\\-71.70033\\-17\\61.52344\\-71.806\\-17\\65.42969\\-71.90269\\-17\\67.38281\\-71.79359\\-17\\69.33594\\-72.66914\\-17\\73.24219\\-72.81641\\-17\\75.19531\\-72.98988\\-17\\77.14844\\-74.20657\\-17\\79.10156\\-74.29295\\-17\\83.00781\\-74.61341\\-17\\84.96094\\-74.84465\\-17\\86.91406\\-75.65517\\-17\\90.82031\\-76.22863\\-17\\92.77344\\-76.56615\\-17\\94.72656\\-77.36063\\-17\\98.63281\\-78.46974\\-17\\102.5391\\-79.95106\\-17\\104.4922\\-80.42749\\-17\\106.4453\\-81.23344\\-17\\110.3516\\-82.54398\\-17\\112.3047\\-83.58589\\-17\\114.2578\\-84.4229\\-17\\116.2109\\-85.61814\\-17\\118.1641\\-86.45615\\-17\\120.1172\\-87.7292\\-17\\122.0703\\-88.61156\\-17\\124.0234\\-90.03646\\-17\\127.476\\-92.83594\\-17\\129.6196\\-94.78906\\-17\\131.8359\\-97.21062\\-17\\134.6198\\-100.6484\\-17\\136.0478\\-102.6016\\-17\\136.8958\\-104.5547\\-17\\138.3124\\-106.5078\\-17\\139.3441\\-108.4609\\-17\\140.5814\\-110.4141\\-17\\141.673\\-112.3672\\-17\\142.5842\\-114.3203\\-17\\143.3919\\-116.2734\\-17\\144.3925\\-118.2266\\-17\\145.2421\\-120.1797\\-17\\146.327\\-122.1328\\-17\\147.14\\-124.0859\\-17\\148.1181\\-126.0391\\-17\\148.7056\\-127.9922\\-17\\149.6033\\-129.9453\\-17\\150.2789\\-131.8984\\-17\\150.8304\\-133.8516\\-17\\151.8584\\-135.8047\\-17\\152.434\\-137.7578\\-17\\153.9542\\-141.6641\\-17\\154.9316\\-145.5703\\-17\\155.6177\\-147.5234\\-17\\156.0631\\-149.4766\\-17\\156.5735\\-153.3828\\-17\\157.0168\\-155.3359\\-17\\157.6425\\-157.2891\\-17\\157.9652\\-159.2422\\-17\\158.4218\\-163.1484\\-17\\158.7003\\-165.1016\\-17\\159.4388\\-169.0078\\-17\\159.6593\\-170.9609\\-17\\160.0688\\-176.8203\\-17\\160.3845\\-184.6328\\-17\\160.4368\\-192.4453\\-17\\160.3505\\-200.2578\\-17\\160.0777\\-208.0703\\-17\\159.668\\-213.9297\\-17\\159.3667\\-215.8828\\-17\\158.8607\\-217.8359\\-17\\158.4913\\-219.7891\\-17\\157.9204\\-223.6953\\-17\\157.4623\\-225.6484\\-17\\156.7319\\-227.6016\\-17\\155.9476\\-231.5078\\-17\\154.5079\\-235.4141\\-17\\153.8635\\-237.3672\\-17\\152.7511\\-239.3203\\-17\\151.8642\\-241.2734\\-17\\150.6145\\-243.2266\\-17\\149.7004\\-245.1797\\-17\\147.4609\\-248.7162\\-17\\145.8571\\-251.0391\\-17\\143.5547\\-253.9455\\-17\\140.9895\\-256.8984\\-17\\139.0084\\-258.8516\\-17\\135.2896\\-262.7578\\-17\\129.8828\\-267.7484\\-17\\127.9297\\-269.4385\\-17\\125.9766\\-271.0136\\-17\\121.4913\\-274.4766\\-17\\118.1641\\-276.7623\\-17\\116.2109\\-277.867\\-17\\115.6106\\-278.3828\\-17\\112.3047\\-280.6119\\-17\\110.3516\\-281.5678\\-17\\108.3984\\-282.7841\\-17\\106.4453\\-283.486\\-17\\104.4922\\-284.6963\\-17\\102.5391\\-285.5268\\-17\\100.5859\\-286.6474\\-17\\98.63281\\-287.3473\\-17\\96.67969\\-288.2638\\-17\\94.72656\\-288.9673\\-17\\92.77344\\-289.3572\\-17\\88.86719\\-290.7924\\-17\\84.96094\\-291.6653\\-17\\83.00781\\-292.3586\\-17\\81.05469\\-292.7347\\-17\\71.28906\\-293.9086\\-17\\69.33594\\-294.0898\\-17\\65.42969\\-294.1597\\-17\\63.47656\\-294.0604\\-17\\59.57031\\-293.6983\\-17\\55.66406\\-293.2578\\-17\\47.85156\\-292.6009\\-17\\45.89844\\-292.4801\\-17\\41.99219\\-292.0923\\-17\\38.08594\\-292.1069\\-17\\32.22656\\-292.5372\\-17\\26.36719\\-293.1622\\-17\\22.46094\\-293.7965\\-17\\20.50781\\-294.2145\\-17\\18.55469\\-294.5215\\-17\\14.64844\\-294.8765\\-17\\8.789063\\-295.241\\-17\\0.9765625\\-295.6566\\-17\\-4.882813\\-295.748\\-17\\-8.789063\\-295.7464\\-17\\-12.69531\\-295.5939\\-17\\-16.60156\\-295.375\\-17\\-24.41406\\-295.045\\-17\\-32.22656\\-294.6281\\-17\\-40.03906\\-294.0886\\-17\\-43.94531\\-294.0604\\-17\\-55.66406\\-294.7054\\-17\\-63.47656\\-295.1018\\-17\\-69.33594\\-295.3412\\-17\\-71.28906\\-295.3839\\-17\\-75.19531\\-295.3662\\-17\\-79.10156\\-295.1959\\-17\\-83.00781\\-294.9134\\-17\\-84.96094\\-294.7045\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "298" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "118" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-296.0313\\-15\\-16.60156\\-295.8171\\-15\\-20.50781\\-295.5026\\-15\\-24.41406\\-295.2536\\-15\\-36.13281\\-294.6083\\-15\\-41.99219\\-294.2605\\-15\\-43.94531\\-294.2605\\-15\\-49.80469\\-294.4023\\-15\\-57.61719\\-294.701\\-15\\-61.52344\\-294.8765\\-15\\-69.33594\\-295.1195\\-15\\-75.19531\\-295.1248\\-15\\-79.10156\\-294.9964\\-15\\-81.05469\\-294.8712\\-15\\-84.96094\\-294.4076\\-15\\-88.86719\\-293.3214\\-15\\-90.82031\\-292.8574\\-15\\-92.77344\\-292.1901\\-15\\-94.72656\\-291.2893\\-15\\-96.67969\\-290.7285\\-15\\-98.63281\\-289.64\\-15\\-100.5859\\-289.0411\\-15\\-102.5005\\-288.1484\\-15\\-104.4922\\-287.1025\\-15\\-108.3984\\-284.8683\\-15\\-110.3516\\-283.5256\\-15\\-112.3047\\-282.5754\\-15\\-115.7272\\-280.3359\\-15\\-118.4082\\-278.3828\\-15\\-121.22\\-276.4297\\-15\\-125.9766\\-272.8329\\-15\\-128.624\\-270.5703\\-15\\-131.8359\\-267.6472\\-15\\-134.7656\\-264.7109\\-15\\-137.6953\\-261.4936\\-15\\-139.974\\-258.8516\\-15\\-141.6016\\-256.6567\\-15\\-142.7313\\-254.9453\\-15\\-144.1515\\-252.9922\\-15\\-145.5078\\-250.7792\\-15\\-147.9362\\-247.1328\\-15\\-148.7523\\-245.1797\\-15\\-149.8684\\-243.2266\\-15\\-150.5777\\-241.2734\\-15\\-151.6181\\-239.3203\\-15\\-152.4201\\-237.3672\\-15\\-153.4011\\-235.4141\\-15\\-154.1049\\-233.4609\\-15\\-154.6623\\-231.5078\\-15\\-155.4612\\-229.5547\\-15\\-156.0486\\-227.6016\\-15\\-156.3771\\-225.6484\\-15\\-156.8264\\-223.6953\\-15\\-157.6036\\-221.7422\\-15\\-158.4201\\-217.8359\\-15\\-158.9423\\-215.8828\\-15\\-159.5956\\-213.9297\\-15\\-159.9398\\-211.9766\\-15\\-160.5188\\-208.0703\\-15\\-161.3253\\-204.1641\\-15\\-161.7697\\-200.2578\\-15\\-162.0975\\-194.3984\\-15\\-162.2344\\-190.4922\\-15\\-162.337\\-184.6328\\-15\\-162.337\\-178.7734\\-15\\-162.2041\\-172.9141\\-15\\-162.0028\\-169.0078\\-15\\-161.6649\\-165.1016\\-15\\-161.3647\\-163.1484\\-15\\-160.8851\\-161.1953\\-15\\-159.8079\\-155.3359\\-15\\-159.2605\\-153.3828\\-15\\-158.5379\\-151.4297\\-15\\-158.0908\\-149.4766\\-15\\-157.5414\\-147.5234\\-15\\-156.6805\\-145.5703\\-15\\-155.7067\\-141.6641\\-15\\-154.7953\\-139.7109\\-15\\-154.1549\\-137.7578\\-15\\-153.3579\\-135.8047\\-15\\-152.432\\-133.8516\\-15\\-151.6905\\-131.8984\\-15\\-150.6378\\-129.9453\\-15\\-149.9987\\-127.9922\\-15\\-148.9467\\-126.0391\\-15\\-148.2384\\-124.0859\\-15\\-147.0965\\-122.1328\\-15\\-146.1568\\-120.1797\\-15\\-144.8709\\-118.2266\\-15\\-144.0979\\-116.2734\\-15\\-142.9058\\-114.3203\\-15\\-142.136\\-112.3672\\-15\\-140.894\\-110.4141\\-15\\-139.797\\-108.4609\\-15\\-137.0733\\-104.5547\\-15\\-136.0397\\-102.6016\\-15\\-134.4819\\-100.6484\\-15\\-131.8359\\-97.54958\\-15\\-129.8828\\-95.43756\\-15\\-126.961\\-92.83594\\-15\\-125.9766\\-92.14628\\-15\\-124.0234\\-90.46225\\-15\\-121.6863\\-88.92969\\-15\\-118.1641\\-86.84584\\-15\\-116.2109\\-85.93171\\-15\\-114.2578\\-84.87483\\-15\\-112.3047\\-83.66578\\-15\\-108.3984\\-82.14915\\-15\\-106.4453\\-81.7523\\-15\\-104.4922\\-80.66811\\-15\\-102.5391\\-80.31818\\-15\\-100.5859\\-79.57567\\-15\\-98.63281\\-79.06932\\-15\\-94.72656\\-77.73022\\-15\\-90.82031\\-76.65591\\-15\\-88.86719\\-76.23438\\-15\\-83.00781\\-75.72252\\-15\\-81.05469\\-74.79688\\-15\\-77.14844\\-74.51897\\-15\\-73.24219\\-74.31102\\-15\\-67.38281\\-74.21107\\-15\\-63.47656\\-73.98026\\-15\\-61.52344\\-73.02286\\-15\\-55.66406\\-72.98988\\-15\\-51.75781\\-72.92766\\-15\\-49.80469\\-74.09493\\-15\\-47.85156\\-74.25218\\-15\\-41.99219\\-74.44813\\-15\\-38.08594\\-74.70076\\-15\\-36.13281\\-74.89923\\-15\\-34.17969\\-75.32986\\-15\\-32.22656\\-75.91089\\-15\\-28.32031\\-76.5303\\-15\\-26.36719\\-77.07349\\-15\\-24.41406\\-77.84001\\-15\\-22.46094\\-78.5076\\-15\\-20.50781\\-79.41196\\-15\\-16.60156\\-80.96875\\-15\\-14.64844\\-81.95691\\-15\\-12.69531\\-82.76926\\-15\\-10.74219\\-84.01517\\-15\\-9.380139\\-85.02344\\-15\\-4.882813\\-89.06048\\-15\\-2.929688\\-90.63362\\-15\\-0.9765625\\-91.70027\\-15\\0.9765625\\-91.86411\\-15\\2.929688\\-91.49316\\-15\\4.882813\\-90.14567\\-15\\6.332632\\-88.92969\\-15\\8.789063\\-86.63719\\-15\\10.74219\\-84.70499\\-15\\12.70581\\-83.07031\\-15\\14.64844\\-81.84961\\-15\\16.60156\\-80.50279\\-15\\18.55469\\-79.5679\\-15\\20.50781\\-78.38911\\-15\\22.46094\\-77.5975\\-15\\24.41406\\-76.64127\\-15\\26.36719\\-76.08367\\-15\\28.32031\\-75.68211\\-15\\30.27344\\-74.74494\\-15\\32.22656\\-74.44094\\-15\\34.17969\\-74.24056\\-15\\36.13281\\-72.84272\\-15\\38.08594\\-72.71983\\-15\\41.99219\\-71.71909\\-15\\45.89844\\-71.67709\\-15\\53.71094\\-71.69899\\-15\\61.52344\\-71.78005\\-15\\63.47656\\-71.93931\\-15\\65.42969\\-72.47699\\-15\\67.38281\\-72.04039\\-15\\69.33594\\-72.67616\\-15\\73.24219\\-72.80784\\-15\\75.19531\\-72.97916\\-15\\77.14844\\-74.21806\\-15\\81.05469\\-74.44094\\-15\\84.96094\\-74.90904\\-15\\86.91406\\-75.68671\\-15\\92.77344\\-76.62119\\-15\\94.72656\\-77.41179\\-15\\98.63281\\-78.53046\\-15\\100.5859\\-79.37384\\-15\\102.5391\\-79.99868\\-15\\104.4922\\-80.48492\\-15\\106.4453\\-81.31847\\-15\\110.3516\\-82.61114\\-15\\112.3047\\-83.67173\\-15\\114.2578\\-84.47903\\-15\\116.2109\\-85.67651\\-15\\118.1641\\-86.50808\\-15\\120.1172\\-87.76887\\-15\\122.0703\\-88.69318\\-15\\124.0234\\-90.10767\\-15\\127.3003\\-92.83594\\-15\\129.8828\\-95.25749\\-15\\131.8359\\-97.45731\\-15\\134.4159\\-100.6484\\-15\\135.7422\\-102.6129\\-15\\136.773\\-104.5547\\-15\\138.0253\\-106.5078\\-15\\139.0281\\-108.4609\\-15\\140.3562\\-110.4141\\-15\\141.3156\\-112.3672\\-15\\142.3966\\-114.3203\\-15\\143.063\\-116.2734\\-15\\144.1918\\-118.2266\\-15\\144.9169\\-120.1797\\-15\\146.065\\-122.1328\\-15\\146.8315\\-124.0859\\-15\\147.8556\\-126.0391\\-15\\149.2112\\-129.9453\\-15\\150.0921\\-131.8984\\-15\\150.6037\\-133.8516\\-15\\151.5026\\-135.8047\\-15\\152.2094\\-137.7578\\-15\\152.8073\\-139.7109\\-15\\153.692\\-141.6641\\-15\\154.2146\\-143.6172\\-15\\154.6368\\-145.5703\\-15\\155.8452\\-149.4766\\-15\\156.6819\\-155.3359\\-15\\157.7062\\-159.2422\\-15\\157.9812\\-161.1953\\-15\\158.6796\\-167.0547\\-15\\159.5764\\-172.9141\\-15\\159.8562\\-176.8203\\-15\\160.0329\\-180.7266\\-15\\160.1313\\-184.6328\\-15\\160.1959\\-190.4922\\-15\\160.1166\\-200.2578\\-15\\159.942\\-206.1172\\-15\\159.7259\\-210.0234\\-15\\159.5365\\-211.9766\\-15\\158.9073\\-215.8828\\-15\\158.5305\\-217.8359\\-15\\157.997\\-221.7422\\-15\\157.633\\-223.6953\\-15\\156.9609\\-225.6484\\-15\\156.4534\\-227.6016\\-15\\156.1355\\-229.5547\\-15\\155.6792\\-231.5078\\-15\\154.8462\\-233.4609\\-15\\154.2398\\-235.4141\\-15\\153.3203\\-237.5733\\-15\\151.4048\\-241.2734\\-15\\148.1981\\-247.1328\\-15\\145.5078\\-250.7513\\-15\\143.9054\\-252.9922\\-15\\142.3001\\-254.9453\\-15\\140.5158\\-256.8984\\-15\\139.6484\\-257.6518\\-15\\135.7422\\-261.7338\\-15\\130.5013\\-266.6641\\-15\\129.8828\\-267.3267\\-15\\127.9297\\-269.0504\\-15\\125.9766\\-270.3718\\-15\\124.0234\\-271.8961\\-15\\122.0703\\-273.5804\\-15\\120.1172\\-275.0861\\-15\\118.1641\\-276.1913\\-15\\116.2109\\-277.5002\\-15\\114.2578\\-278.9485\\-15\\110.3516\\-281.2254\\-15\\108.3862\\-282.2891\\-15\\104.4922\\-284.139\\-15\\100.5859\\-286.1419\\-15\\98.63281\\-287.0364\\-15\\96.67969\\-287.7212\\-15\\94.72656\\-288.6367\\-15\\90.82031\\-289.5426\\-15\\88.86719\\-290.3525\\-15\\86.91406\\-290.912\\-15\\83.00781\\-291.6653\\-15\\81.05469\\-292.3138\\-15\\79.10156\\-292.6569\\-15\\73.24219\\-293.2781\\-15\\69.33594\\-293.5949\\-15\\65.42969\\-293.6869\\-15\\63.47656\\-293.6317\\-15\\59.57031\\-293.4064\\-15\\51.75781\\-292.827\\-15\\49.80469\\-292.2679\\-15\\47.85156\\-292.4611\\-15\\45.89844\\-292.4611\\-15\\41.99219\\-292.2785\\-15\\40.03906\\-292.3365\\-15\\34.17969\\-292.704\\-15\\30.27344\\-293.0626\\-15\\26.36719\\-293.6104\\-15\\22.46094\\-294.4103\\-15\\18.55469\\-294.8406\\-15\\8.789063\\-295.6307\\-15\\4.882813\\-296.0161\\-15\\0.9765625\\-296.2865\\-15\\-4.882813\\-296.3898\\-15\\-8.789063\\-296.3556\\-15\\-10.74219\\-296.2865\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "293" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "119" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-296.1869\\-13\\-24.41406\\-295.4925\\-13\\-30.27344\\-295.0949\\-13\\-34.17969\\-294.8897\\-13\\-40.03906\\-294.5241\\-13\\-43.94531\\-294.3894\\-13\\-49.80469\\-294.4153\\-13\\-55.66406\\-294.5365\\-13\\-65.42969\\-294.8526\\-13\\-71.28906\\-294.9542\\-13\\-75.19531\\-294.9245\\-13\\-79.10156\\-294.7687\\-13\\-81.05469\\-294.6326\\-13\\-83.00781\\-294.3839\\-13\\-86.91406\\-293.4055\\-13\\-90.82031\\-292.5341\\-13\\-92.77344\\-291.6158\\-13\\-96.67969\\-290.3525\\-13\\-98.63281\\-289.363\\-13\\-100.5859\\-288.8226\\-13\\-102.5391\\-287.7046\\-13\\-104.4922\\-286.8403\\-13\\-106.4453\\-285.5502\\-13\\-108.3984\\-284.524\\-13\\-112.3047\\-282.1108\\-13\\-114.2578\\-281.0668\\-13\\-118.1641\\-278.1387\\-13\\-120.1172\\-276.9433\\-13\\-123.392\\-274.4766\\-13\\-128.2193\\-270.5703\\-13\\-129.8828\\-269.1375\\-13\\-131.8359\\-267.335\\-13\\-134.4558\\-264.7109\\-13\\-137.6953\\-261.1356\\-13\\-141.6016\\-256.2738\\-13\\-143.8917\\-252.9922\\-13\\-144.971\\-251.0391\\-13\\-146.4088\\-249.0859\\-13\\-147.6819\\-247.1328\\-13\\-148.5797\\-245.1797\\-13\\-149.6048\\-243.2266\\-13\\-150.4019\\-241.2734\\-13\\-152.2418\\-237.3672\\-13\\-153.9657\\-233.4609\\-13\\-154.4696\\-231.5078\\-13\\-155.8926\\-227.6016\\-13\\-156.6185\\-223.6953\\-13\\-157.8863\\-219.7891\\-13\\-158.6538\\-215.8828\\-13\\-159.3018\\-213.9297\\-13\\-159.759\\-211.9766\\-13\\-160.6445\\-206.1172\\-13\\-161.338\\-202.2109\\-13\\-161.7576\\-198.3047\\-13\\-162.0447\\-192.4453\\-13\\-162.1388\\-188.5391\\-13\\-162.2106\\-182.6797\\-13\\-162.1868\\-178.7734\\-13\\-162.1094\\-174.8672\\-13\\-161.9623\\-170.9609\\-13\\-161.6338\\-167.0547\\-13\\-161.377\\-165.1016\\-13\\-160.5636\\-161.1953\\-13\\-159.925\\-157.2891\\-13\\-159.5365\\-155.3359\\-13\\-158.7981\\-153.3828\\-13\\-158.274\\-151.4297\\-13\\-157.8724\\-149.4766\\-13\\-157.1094\\-147.5234\\-13\\-156.4584\\-145.5703\\-13\\-156.0535\\-143.6172\\-13\\-155.3897\\-141.6641\\-13\\-154.5548\\-139.7109\\-13\\-153.9498\\-137.7578\\-13\\-152.9744\\-135.8047\\-13\\-152.2096\\-133.8516\\-13\\-150.4132\\-129.9453\\-13\\-149.7516\\-127.9922\\-13\\-148.7221\\-126.0391\\-13\\-148.0049\\-124.0859\\-13\\-146.8159\\-122.1328\\-13\\-145.931\\-120.1797\\-13\\-144.6931\\-118.2266\\-13\\-143.8546\\-116.2734\\-13\\-142.7274\\-114.3203\\-13\\-141.8981\\-112.3672\\-13\\-141.6016\\-111.9822\\-13\\-139.6484\\-108.6913\\-13\\-138.2825\\-106.5078\\-13\\-136.8293\\-104.5547\\-13\\-135.7677\\-102.6016\\-13\\-134.3122\\-100.6484\\-13\\-129.8828\\-95.72285\\-13\\-126.6731\\-92.83594\\-13\\-124.0234\\-90.63669\\-13\\-122.0703\\-89.43212\\-13\\-120.1172\\-88.08247\\-13\\-116.2109\\-86.03487\\-13\\-114.2578\\-84.90137\\-13\\-112.3047\\-83.62014\\-13\\-110.3516\\-83.07866\\-13\\-108.3984\\-82.23033\\-13\\-106.4453\\-81.77938\\-13\\-104.4922\\-80.76947\\-13\\-102.5391\\-80.39858\\-13\\-98.63281\\-79.14135\\-13\\-94.72656\\-77.69922\\-13\\-92.77344\\-77.25303\\-13\\-90.82031\\-76.7043\\-13\\-88.86719\\-76.27136\\-13\\-83.00781\\-75.71219\\-13\\-81.05469\\-74.72724\\-13\\-77.14844\\-74.45472\\-13\\-73.24219\\-74.25758\\-13\\-69.33594\\-74.20035\\-13\\-67.38281\\-74.07198\\-13\\-65.42969\\-73.33458\\-13\\-63.47656\\-72.97916\\-13\\-61.52344\\-72.94787\\-13\\-51.75781\\-72.90796\\-13\\-49.80469\\-73.97607\\-13\\-47.85156\\-74.21191\\-13\\-41.99219\\-74.40257\\-13\\-38.08594\\-74.63576\\-13\\-36.13281\\-74.83611\\-13\\-34.17969\\-75.24917\\-13\\-32.22656\\-75.85735\\-13\\-28.32031\\-76.43783\\-13\\-26.36719\\-76.92697\\-13\\-24.41406\\-77.733\\-13\\-22.46094\\-78.32619\\-13\\-20.50781\\-79.26644\\-13\\-18.55469\\-80.0927\\-13\\-16.60156\\-80.80614\\-13\\-14.64844\\-81.86983\\-13\\-12.69531\\-82.57867\\-13\\-10.74219\\-83.8503\\-13\\-9.143391\\-85.02344\\-13\\-4.658048\\-88.92969\\-13\\-2.929688\\-90.27397\\-13\\-0.9765625\\-91.42182\\-13\\0.9765625\\-91.61015\\-13\\2.929688\\-91.19762\\-13\\4.882813\\-89.92632\\-13\\8.789063\\-86.4756\\-13\\10.74219\\-84.57834\\-13\\12.69531\\-82.91439\\-13\\16.60156\\-80.41876\\-13\\18.55469\\-79.49698\\-13\\20.50781\\-78.31567\\-13\\22.46094\\-77.48494\\-13\\24.41406\\-76.50011\\-13\\28.32031\\-75.60456\\-13\\30.27344\\-74.72451\\-13\\32.22656\\-74.42683\\-13\\34.17969\\-74.22955\\-13\\36.13281\\-72.82507\\-13\\38.08594\\-72.72738\\-13\\41.99219\\-71.75673\\-13\\43.94531\\-71.7076\\-13\\55.66406\\-71.72133\\-13\\61.52344\\-71.79546\\-13\\65.42969\\-72.5815\\-13\\67.38281\\-72.4245\\-13\\69.33594\\-72.6904\\-13\\73.24219\\-72.83385\\-13\\75.19531\\-73.00072\\-13\\77.14844\\-74.22346\\-13\\79.10156\\-74.31066\\-13\\83.00781\\-74.64494\\-13\\84.96094\\-74.96642\\-13\\86.91406\\-75.69401\\-13\\90.82031\\-76.30994\\-13\\92.77344\\-76.67415\\-13\\94.72656\\-77.47543\\-13\\98.63281\\-78.60688\\-13\\100.5859\\-79.45211\\-13\\104.4922\\-80.53635\\-13\\106.4453\\-81.43563\\-13\\110.3516\\-82.66781\\-13\\112.3047\\-83.73911\\-13\\114.2578\\-84.54382\\-13\\116.2109\\-85.73527\\-13\\118.1641\\-86.5873\\-13\\120.1172\\-87.80054\\-13\\122.0703\\-88.79581\\-13\\124.0234\\-90.18346\\-13\\127.1217\\-92.83594\\-13\\129.8828\\-95.47343\\-13\\134.2036\\-100.6484\\-13\\136.6328\\-104.5547\\-13\\137.6374\\-106.5078\\-13\\138.7848\\-108.4609\\-13\\140.1098\\-110.4141\\-13\\140.9973\\-112.3672\\-13\\142.1795\\-114.3203\\-13\\142.8145\\-116.2734\\-13\\143.9141\\-118.2266\\-13\\144.6667\\-120.1797\\-13\\145.7316\\-122.1328\\-13\\147.5152\\-126.0391\\-13\\148.3109\\-127.9922\\-13\\148.8928\\-129.9453\\-13\\149.8443\\-131.8984\\-13\\151.051\\-135.8047\\-13\\151.9686\\-137.7578\\-13\\152.5248\\-139.7109\\-13\\153.3203\\-141.6803\\-13\\153.9844\\-143.6172\\-13\\154.8952\\-147.5234\\-13\\155.5657\\-149.4766\\-13\\155.9602\\-151.4297\\-13\\156.451\\-155.3359\\-13\\156.7948\\-157.2891\\-13\\157.3351\\-159.2422\\-13\\157.7402\\-161.1953\\-13\\158.0029\\-163.1484\\-13\\158.8499\\-170.9609\\-13\\159.4388\\-174.8672\\-13\\159.6327\\-176.8203\\-13\\159.8255\\-180.7266\\-13\\159.9459\\-186.5859\\-13\\159.9796\\-190.4922\\-13\\159.9381\\-196.3516\\-13\\159.8597\\-202.2109\\-13\\159.7016\\-206.1172\\-13\\159.3791\\-210.0234\\-13\\158.7656\\-213.9297\\-13\\158.0436\\-219.7891\\-13\\157.7402\\-221.7422\\-13\\156.5979\\-225.6484\\-13\\155.9053\\-229.5547\\-13\\154.5485\\-233.4609\\-13\\153.9615\\-235.4141\\-13\\152.9284\\-237.3672\\-13\\152.101\\-239.3203\\-13\\150.8992\\-241.2734\\-13\\150.046\\-243.2266\\-13\\148.8095\\-245.1797\\-13\\147.8167\\-247.1328\\-13\\146.3917\\-249.0859\\-13\\144.7707\\-251.0391\\-13\\141.8906\\-254.9453\\-13\\140.0681\\-256.8984\\-13\\138.109\\-258.8516\\-13\\135.7422\\-261.3681\\-13\\134.2969\\-262.7578\\-13\\129.8828\\-266.7893\\-13\\127.7513\\-268.6172\\-13\\125.9766\\-269.8643\\-13\\122.0703\\-273.1508\\-13\\120.1172\\-274.5765\\-13\\118.1641\\-275.7675\\-13\\116.2109\\-277.1463\\-13\\112.3047\\-279.5678\\-13\\110.3516\\-280.8873\\-13\\108.3984\\-281.7473\\-13\\106.4453\\-282.9337\\-13\\104.4922\\-283.6318\\-13\\102.5391\\-284.7977\\-13\\100.5859\\-285.6011\\-13\\98.63281\\-286.6836\\-13\\96.67969\\-287.3189\\-13\\92.77344\\-288.8558\\-13\\88.86719\\-289.7096\\-13\\86.91406\\-290.5157\\-13\\84.96094\\-290.9365\\-13\\81.05469\\-291.6091\\-13\\79.10156\\-292.1632\\-13\\77.14844\\-292.5574\\-13\\73.24219\\-292.9705\\-13\\69.33594\\-293.2386\\-13\\67.38281\\-293.2879\\-13\\63.47656\\-293.2838\\-13\\59.57031\\-293.1639\\-13\\55.66406\\-292.9671\\-13\\51.75781\\-292.7212\\-13\\50.32626\\-292.0547\\-13\\49.80469\\-291.6297\\-13\\47.85156\\-292.4416\\-13\\41.99219\\-292.4115\\-13\\34.17969\\-292.9356\\-13\\30.27344\\-293.3982\\-13\\28.32031\\-293.7318\\-13\\26.36719\\-294.1742\\-13\\22.46094\\-294.7493\\-13\\14.64844\\-295.4529\\-13\\10.74219\\-296.0006\\-13\\6.835938\\-296.4001\\-13\\2.929688\\-296.6022\\-13\\-0.9765625\\-296.71\\-13\\-8.789063\\-296.71\\-13\\-14.64844\\-296.511\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "299" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "120" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-296.1473\\-11\\-24.41406\\-295.8456\\-11\\-28.32031\\-295.3965\\-11\\-30.27344\\-295.2456\\-11\\-40.03906\\-294.6609\\-11\\-43.94531\\-294.4992\\-11\\-49.80469\\-294.4153\\-11\\-55.66406\\-294.458\\-11\\-63.47656\\-294.6197\\-11\\-67.38281\\-294.7296\\-11\\-73.24219\\-294.7372\\-11\\-77.14844\\-294.6159\\-11\\-79.10156\\-294.5056\\-11\\-81.05469\\-294.2878\\-11\\-84.96094\\-293.4626\\-11\\-88.86719\\-292.7145\\-11\\-92.77344\\-291.2766\\-11\\-94.72656\\-290.7473\\-11\\-96.67969\\-289.805\\-11\\-100.5859\\-288.5155\\-11\\-102.5391\\-287.3781\\-11\\-104.4922\\-286.5163\\-11\\-104.9057\\-286.1953\\-11\\-108.1473\\-284.2422\\-11\\-110.3516\\-283.0465\\-11\\-112.3047\\-281.7533\\-11\\-114.2578\\-280.778\\-11\\-116.2109\\-279.3413\\-11\\-118.1641\\-277.7725\\-11\\-120.1172\\-276.6161\\-11\\-122.0703\\-275.2513\\-11\\-124.0234\\-273.682\\-11\\-125.9766\\-271.9831\\-11\\-129.8828\\-268.8474\\-11\\-131.8359\\-267.0066\\-11\\-134.1368\\-264.7109\\-11\\-136.0021\\-262.7578\\-11\\-137.6953\\-260.7121\\-11\\-139.1341\\-258.8516\\-11\\-140.8165\\-256.8984\\-11\\-142.3689\\-254.9453\\-11\\-144.7206\\-251.0391\\-11\\-146.1848\\-249.0859\\-11\\-147.4609\\-246.9375\\-11\\-148.3948\\-245.1797\\-11\\-150.26\\-241.2734\\-11\\-150.9752\\-239.3203\\-11\\-152.0759\\-237.3672\\-11\\-152.7926\\-235.4141\\-11\\-153.7816\\-233.4609\\-11\\-154.9177\\-229.5547\\-11\\-155.69\\-227.6016\\-11\\-156.1302\\-225.6484\\-11\\-156.4605\\-223.6953\\-11\\-156.9465\\-221.7422\\-11\\-157.7348\\-219.7891\\-11\\-158.4806\\-215.8828\\-11\\-158.968\\-213.9297\\-11\\-159.5861\\-211.9766\\-11\\-159.9459\\-210.0234\\-11\\-160.4724\\-206.1172\\-11\\-161.1405\\-202.2109\\-11\\-161.6399\\-198.3047\\-11\\-161.8726\\-194.3984\\-11\\-162.0509\\-186.5859\\-11\\-162.0502\\-178.7734\\-11\\-161.9623\\-174.8672\\-11\\-161.7818\\-170.9609\\-11\\-161.377\\-167.0547\\-11\\-160.593\\-163.1484\\-11\\-159.688\\-157.2891\\-11\\-158.4977\\-153.3828\\-11\\-157.5936\\-149.4766\\-11\\-156.7513\\-147.5234\\-11\\-155.862\\-143.6172\\-11\\-155.0078\\-141.6641\\-11\\-153.7122\\-137.7578\\-11\\-152.6673\\-135.8047\\-11\\-151.9897\\-133.8516\\-11\\-150.9752\\-131.8984\\-11\\-149.4385\\-127.9922\\-11\\-148.4938\\-126.0391\\-11\\-147.731\\-124.0859\\-11\\-146.628\\-122.1328\\-11\\-145.6586\\-120.1797\\-11\\-144.5038\\-118.2266\\-11\\-141.6098\\-112.3672\\-11\\-140.4832\\-110.4141\\-11\\-139.1438\\-108.4609\\-11\\-138.0846\\-106.5078\\-11\\-136.7188\\-104.5547\\-11\\-135.7422\\-102.9942\\-11\\-134.0736\\-100.6484\\-11\\-132.4219\\-98.69531\\-11\\-129.8828\\-95.95669\\-11\\-127.9297\\-94.10012\\-11\\-125.9766\\-92.44663\\-11\\-123.9355\\-90.88281\\-11\\-122.0703\\-89.60526\\-11\\-120.1172\\-88.16336\\-11\\-118.1641\\-87.39509\\-11\\-112.3047\\-83.7507\\-11\\-110.3516\\-83.33527\\-11\\-108.3984\\-82.36196\\-11\\-106.4453\\-81.83641\\-11\\-104.4922\\-80.97999\\-11\\-102.5391\\-80.48529\\-11\\-100.5859\\-79.8555\\-11\\-96.67969\\-78.42637\\-11\\-94.72656\\-77.7984\\-11\\-92.77344\\-77.36428\\-11\\-90.82031\\-76.80972\\-11\\-88.86719\\-76.3555\\-11\\-86.91406\\-76.09391\\-11\\-83.00781\\-75.68805\\-11\\-81.05469\\-74.67035\\-11\\-79.10156\\-74.47523\\-11\\-69.33594\\-74.09224\\-11\\-67.38281\\-73.16925\\-11\\-65.42969\\-72.92766\\-11\\-57.61719\\-72.85171\\-11\\-53.71094\\-72.90796\\-11\\-51.75781\\-72.87931\\-11\\-49.80469\\-73.15608\\-11\\-47.85156\\-74.19405\\-11\\-41.99219\\-74.35314\\-11\\-38.08594\\-74.59138\\-11\\-36.13281\\-74.78761\\-11\\-34.17969\\-75.19837\\-11\\-32.22656\\-75.80244\\-11\\-28.32031\\-76.36496\\-11\\-26.36719\\-76.82967\\-11\\-24.41406\\-77.6358\\-11\\-22.46094\\-78.25524\\-11\\-20.50781\\-79.06932\\-11\\-18.55469\\-80.01041\\-11\\-16.60156\\-80.66281\\-11\\-14.64844\\-81.7487\\-11\\-12.69531\\-82.35109\\-11\\-8.889457\\-85.02344\\-11\\-2.929688\\-89.9422\\-11\\-0.9765625\\-90.98199\\-11\\0.9765625\\-91.31081\\-11\\2.929688\\-90.73421\\-11\\4.882813\\-89.72092\\-11\\8.789063\\-86.32349\\-11\\10.74219\\-84.46629\\-11\\12.69531\\-82.75751\\-11\\15.21721\\-81.11719\\-11\\18.55469\\-79.38705\\-11\\20.50781\\-78.27682\\-11\\24.41406\\-76.45426\\-11\\26.36719\\-76.02339\\-11\\30.27344\\-74.69099\\-11\\32.22656\\-74.40257\\-11\\34.17969\\-74.21806\\-11\\36.13281\\-72.81641\\-11\\38.08594\\-72.71983\\-11\\40.03906\\-72.32813\\-11\\41.99219\\-71.75246\\-11\\49.80469\\-71.71777\\-11\\53.71094\\-71.67383\\-11\\55.66406\\-71.7441\\-11\\59.57031\\-71.756\\-11\\63.47656\\-71.91095\\-11\\65.42969\\-72.20313\\-11\\67.38281\\-72.61317\\-11\\73.24219\\-72.82507\\-11\\75.19531\\-73.00072\\-11\\77.14844\\-74.23502\\-11\\79.10156\\-74.3286\\-11\\83.00781\\-74.66368\\-11\\84.96094\\-75.00762\\-11\\86.91406\\-75.72375\\-11\\90.82031\\-76.31625\\-11\\92.77344\\-76.7607\\-11\\94.72656\\-77.56065\\-11\\98.63281\\-78.67886\\-11\\100.5859\\-79.50105\\-11\\104.4922\\-80.60911\\-11\\106.4453\\-81.52294\\-11\\110.3516\\-82.73569\\-11\\112.3047\\-83.79987\\-11\\114.2578\\-84.60749\\-11\\116.2109\\-85.79894\\-11\\118.1641\\-86.66267\\-11\\120.1172\\-87.83181\\-11\\122.0703\\-88.889\\-11\\124.0234\\-90.28639\\-11\\124.5968\\-90.88281\\-11\\126.9393\\-92.83594\\-11\\129.014\\-94.78906\\-11\\129.8828\\-95.70506\\-11\\132.3785\\-98.69531\\-11\\133.9063\\-100.6484\\-11\\136.4425\\-104.5547\\-11\\137.289\\-106.5078\\-11\\137.6953\\-107.0232\\-11\\139.7839\\-110.4141\\-11\\140.7429\\-112.3672\\-11\\141.9126\\-114.3203\\-11\\142.6331\\-116.2734\\-11\\143.5785\\-118.2266\\-11\\145.2933\\-122.1328\\-11\\146.3456\\-124.0859\\-11\\147.1286\\-126.0391\\-11\\148.1099\\-127.9922\\-11\\148.6739\\-129.9453\\-11\\149.5007\\-131.8984\\-11\\150.22\\-133.8516\\-11\\150.7303\\-135.8047\\-11\\151.6641\\-137.7578\\-11\\152.9009\\-141.6641\\-11\\153.7246\\-143.6172\\-11\\154.6123\\-147.5234\\-11\\155.735\\-151.4297\\-11\\156.0752\\-153.3828\\-11\\156.5265\\-157.2891\\-11\\156.8646\\-159.2422\\-11\\157.3882\\-161.1953\\-11\\157.7728\\-163.1484\\-11\\157.997\\-165.1016\\-11\\158.5449\\-170.9609\\-11\\158.9788\\-174.8672\\-11\\159.2605\\-176.8203\\-11\\159.4272\\-178.7734\\-11\\159.6505\\-182.6797\\-11\\159.7678\\-190.4922\\-11\\159.7338\\-196.3516\\-11\\159.6327\\-202.2109\\-11\\159.5365\\-204.1641\\-11\\159.1873\\-208.0703\\-11\\158.6914\\-211.9766\\-11\\158.295\\-215.8828\\-11\\157.8442\\-219.7891\\-11\\157.401\\-221.7422\\-11\\156.7415\\-223.6953\\-11\\156.0872\\-227.6016\\-11\\155.6085\\-229.5547\\-11\\154.8253\\-231.5078\\-11\\153.6193\\-235.4141\\-11\\152.5678\\-237.3672\\-11\\151.7334\\-239.3203\\-11\\150.5584\\-241.2734\\-11\\149.662\\-243.2266\\-11\\147.4609\\-246.8964\\-11\\146.0125\\-249.0859\\-11\\142.8158\\-252.9922\\-11\\141.6016\\-254.5972\\-11\\137.4333\\-258.8516\\-11\\135.7508\\-260.8047\\-11\\133.6559\\-262.7578\\-11\\131.8359\\-264.2744\\-11\\129.3645\\-266.6641\\-11\\127.1052\\-268.6172\\-11\\122.0703\\-272.6061\\-11\\118.1641\\-275.4276\\-11\\116.2109\\-276.7139\\-11\\114.2578\\-277.7677\\-11\\112.3047\\-279.1813\\-11\\110.3516\\-280.4068\\-11\\106.4453\\-282.4798\\-11\\104.4922\\-283.3073\\-11\\102.5391\\-284.3088\\-11\\98.56771\\-286.1953\\-11\\96.67969\\-287.0091\\-11\\94.72656\\-287.6187\\-11\\92.77344\\-288.455\\-11\\90.82031\\-288.9915\\-11\\88.86719\\-289.3309\\-11\\86.91406\\-289.8359\\-11\\84.96094\\-290.5749\\-11\\83.00781\\-290.9336\\-11\\79.10156\\-291.5398\\-11\\75.19531\\-292.4317\\-11\\73.24219\\-292.679\\-11\\69.33594\\-292.9311\\-11\\63.47656\\-293.0061\\-11\\59.57031\\-292.9612\\-11\\55.66406\\-292.8009\\-11\\49.80469\\-292.4986\\-11\\47.85156\\-292.4416\\-11\\43.94531\\-292.4611\\-11\\41.99219\\-292.5343\\-11\\38.08594\\-292.8153\\-11\\34.17969\\-293.179\\-11\\32.22656\\-293.4506\\-11\\28.32031\\-294.2623\\-11\\26.36719\\-294.5703\\-11\\20.50781\\-295.1636\\-11\\16.60156\\-295.6052\\-11\\12.69531\\-296.263\\-11\\10.74219\\-296.4897\\-11\\6.835938\\-296.7455\\-11\\-0.9765625\\-296.9843\\-11\\-6.835938\\-296.9897\\-11\\-10.74219\\-296.9219\\-11\\-14.64844\\-296.7774\\-11\\-18.55469\\-296.5493\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "300" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "121" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-296.2511\\-9\\-28.32031\\-295.6216\\-9\\-30.27344\\-295.3876\\-9\\-36.13281\\-294.9784\\-9\\-41.99219\\-294.6489\\-9\\-45.89844\\-294.5176\\-9\\-53.71094\\-294.3356\\-9\\-63.47656\\-294.4207\\-9\\-65.42969\\-294.4898\\-9\\-69.33594\\-294.5182\\-9\\-73.24219\\-294.464\\-9\\-77.14844\\-294.2779\\-9\\-79.10156\\-294.0754\\-9\\-86.91406\\-292.7897\\-9\\-88.86719\\-292.3138\\-9\\-90.82031\\-291.4991\\-9\\-92.77344\\-291.0034\\-9\\-94.72656\\-290.3872\\-9\\-96.67969\\-289.4443\\-9\\-98.63281\\-288.9087\\-9\\-102.5391\\-287.0963\\-9\\-106.4453\\-284.9539\\-9\\-108.3984\\-283.6537\\-9\\-110.3516\\-282.7603\\-9\\-112.3047\\-281.494\\-9\\-114.2578\\-280.3744\\-9\\-116.2109\\-279.0443\\-9\\-118.1641\\-277.5021\\-9\\-120.1172\\-276.1411\\-9\\-122.0703\\-274.9858\\-9\\-124.0234\\-273.414\\-9\\-125.9766\\-271.6771\\-9\\-129.7291\\-268.6172\\-9\\-133.7158\\-264.7109\\-9\\-135.7422\\-262.6055\\-9\\-138.8425\\-258.8516\\-9\\-140.5628\\-256.8984\\-9\\-142.1311\\-254.9453\\-9\\-143.1626\\-252.9922\\-9\\-145.905\\-249.0859\\-9\\-147.0048\\-247.1328\\-9\\-148.2088\\-245.1797\\-9\\-149.057\\-243.2266\\-9\\-150.1194\\-241.2734\\-9\\-150.7346\\-239.3203\\-9\\-151.8585\\-237.3672\\-9\\-152.5534\\-235.4141\\-9\\-153.5335\\-233.4609\\-9\\-154.1534\\-231.5078\\-9\\-154.671\\-229.5547\\-9\\-155.4312\\-227.6016\\-9\\-155.9842\\-225.6484\\-9\\-156.7383\\-221.7422\\-9\\-157.5414\\-219.7891\\-9\\-157.9949\\-217.8359\\-9\\-158.7369\\-213.9297\\-9\\-159.3791\\-211.9766\\-9\\-159.8113\\-210.0234\\-9\\-160.8921\\-202.2109\\-9\\-161.229\\-200.2578\\-9\\-161.6491\\-196.3516\\-9\\-161.7454\\-194.3984\\-9\\-161.9152\\-186.5859\\-9\\-161.9129\\-180.7266\\-9\\-161.7899\\-174.8672\\-9\\-161.5326\\-170.9609\\-9\\-161.311\\-169.0078\\-9\\-160.3119\\-163.1484\\-9\\-159.7744\\-159.2422\\-9\\-159.3283\\-157.2891\\-9\\-158.6766\\-155.3359\\-9\\-157.8578\\-151.4297\\-9\\-156.506\\-147.5234\\-9\\-156.1166\\-145.5703\\-9\\-155.5942\\-143.6172\\-9\\-154.7108\\-141.6641\\-9\\-154.1255\\-139.7109\\-9\\-153.3879\\-137.7578\\-9\\-152.4251\\-135.8047\\-9\\-151.6927\\-133.8516\\-9\\-150.6854\\-131.8984\\-9\\-150.0878\\-129.9453\\-9\\-149.1107\\-127.9922\\-9\\-148.3436\\-126.0391\\-9\\-147.4688\\-124.0859\\-9\\-145.3605\\-120.1797\\-9\\-144.3666\\-118.2266\\-9\\-143.2292\\-116.2734\\-9\\-142.4537\\-114.3203\\-9\\-140.2902\\-110.4141\\-9\\-138.8922\\-108.4609\\-9\\-137.8697\\-106.5078\\-9\\-136.5838\\-104.5547\\-9\\-135.1335\\-102.6016\\-9\\-133.7976\\-100.6484\\-9\\-132.2417\\-98.69531\\-9\\-129.8828\\-96.15327\\-9\\-127.9297\\-94.28993\\-9\\-120.9001\\-88.92969\\-9\\-120.1172\\-88.24326\\-9\\-118.1641\\-87.55704\\-9\\-116.2109\\-86.43884\\-9\\-114.0839\\-85.02344\\-9\\-112.3047\\-84.01659\\-9\\-110.3516\\-83.53365\\-9\\-108.3984\\-82.50916\\-9\\-104.4922\\-81.31567\\-9\\-102.5391\\-80.48529\\-9\\-100.5859\\-80.19056\\-9\\-98.37891\\-79.16406\\-9\\-96.67969\\-78.66721\\-9\\-94.72656\\-77.97049\\-9\\-90.82031\\-77.06233\\-9\\-88.86719\\-76.47662\\-9\\-86.91406\\-76.13265\\-9\\-83.00781\\-75.70483\\-9\\-81.05469\\-74.69648\\-9\\-79.10156\\-74.46436\\-9\\-75.19531\\-74.32397\\-9\\-71.28906\\-73.92997\\-9\\-69.33594\\-73.00776\\-9\\-67.38281\\-72.86079\\-9\\-61.52344\\-72.79937\\-9\\-57.61719\\-72.81641\\-9\\-53.71094\\-72.89829\\-9\\-51.75781\\-72.84272\\-9\\-49.80469\\-72.9377\\-9\\-47.85156\\-73.96688\\-9\\-43.94531\\-74.24056\\-9\\-38.08594\\-74.55288\\-9\\-36.13281\\-74.74123\\-9\\-34.17969\\-75.15022\\-9\\-32.22656\\-75.77146\\-9\\-28.32031\\-76.32979\\-9\\-26.36719\\-76.75478\\-9\\-24.41406\\-77.52748\\-9\\-20.50781\\-78.91658\\-9\\-18.55469\\-79.92964\\-9\\-16.60156\\-80.53253\\-9\\-14.64844\\-81.48886\\-9\\-12.69531\\-82.21745\\-9\\-8.511413\\-85.02344\\-9\\-6.835938\\-86.33804\\-9\\-3.882998\\-88.92969\\-9\\-2.929688\\-89.6666\\-9\\-0.9765625\\-90.5638\\-9\\0.9765625\\-90.8601\\-9\\2.929688\\-90.35697\\-9\\4.882813\\-89.39642\\-9\\6.835938\\-87.71088\\-9\\9.83538\\-85.02344\\-9\\12.26049\\-83.07031\\-9\\12.69531\\-82.62576\\-9\\15.01465\\-81.11719\\-9\\20.50781\\-78.21089\\-9\\24.41406\\-76.42586\\-9\\26.36719\\-76.00214\\-9\\30.27344\\-74.64494\\-9\\34.17969\\-74.21806\\-9\\36.13281\\-72.81641\\-9\\40.03906\\-72.64856\\-9\\41.99219\\-71.8046\\-9\\47.85156\\-71.70931\\-9\\49.80469\\-71.75533\\-9\\55.66406\\-71.71289\\-9\\61.52344\\-71.79999\\-9\\63.47656\\-71.98767\\-9\\65.42969\\-72.50294\\-9\\67.38281\\-72.66221\\-9\\73.24219\\-72.82507\\-9\\75.19531\\-73.00072\\-9\\77.14844\\-74.25786\\-9\\81.05469\\-74.5032\\-9\\83.00781\\-74.71066\\-9\\84.96094\\-75.10189\\-9\\86.91406\\-75.78414\\-9\\90.82031\\-76.35133\\-9\\92.77344\\-76.80882\\-9\\94.72656\\-77.6414\\-9\\98.63281\\-78.76714\\-9\\100.5859\\-79.53967\\-9\\104.4922\\-80.68695\\-9\\106.4453\\-81.61543\\-9\\108.3984\\-82.15294\\-9\\110.3516\\-82.83508\\-9\\112.3047\\-83.87289\\-9\\114.2578\\-84.67692\\-9\\116.2109\\-85.85806\\-9\\118.1641\\-86.72524\\-9\\121.9161\\-88.92969\\-9\\124.0234\\-90.42941\\-9\\124.4523\\-90.88281\\-9\\126.7241\\-92.83594\\-9\\128.7618\\-94.78906\\-9\\129.8828\\-95.99497\\-9\\132.1303\\-98.69531\\-9\\133.7891\\-100.9709\\-9\\136.2062\\-104.5547\\-9\\137.0465\\-106.5078\\-9\\138.3369\\-108.4609\\-9\\139.2963\\-110.4141\\-9\\140.5268\\-112.3672\\-9\\142.4676\\-116.2734\\-9\\143.1796\\-118.2266\\-9\\144.2506\\-120.1797\\-9\\144.9597\\-122.1328\\-9\\146.0859\\-124.0859\\-9\\146.8119\\-126.0391\\-9\\147.8396\\-127.9922\\-9\\149.1277\\-131.8984\\-9\\150.0165\\-133.8516\\-9\\150.486\\-135.8047\\-9\\151.1957\\-137.7578\\-9\\152.0348\\-139.7109\\-9\\152.5662\\-141.6641\\-9\\153.9465\\-145.5703\\-9\\154.7619\\-149.4766\\-9\\155.3734\\-151.4297\\-9\\155.8581\\-153.3828\\-9\\156.1369\\-155.3359\\-9\\156.5615\\-159.2422\\-9\\156.901\\-161.1953\\-9\\157.4136\\-163.1484\\-9\\157.7648\\-165.1016\\-9\\158.1454\\-169.0078\\-9\\158.4433\\-172.9141\\-9\\158.7954\\-176.8203\\-9\\159.2605\\-182.6797\\-9\\159.3914\\-186.5859\\-9\\159.4388\\-190.4922\\-9\\159.4272\\-194.3984\\-9\\159.4837\\-196.3516\\-9\\159.3151\\-202.2109\\-9\\159.172\\-204.1641\\-9\\158.1122\\-215.8828\\-9\\157.6036\\-219.7891\\-9\\156.9734\\-221.7422\\-9\\156.4794\\-223.6953\\-9\\155.8268\\-227.6016\\-9\\154.5053\\-231.5078\\-9\\154.0033\\-233.4609\\-9\\152.2433\\-237.3672\\-9\\151.1659\\-239.3203\\-9\\150.2722\\-241.2734\\-9\\149.134\\-243.2266\\-9\\148.1855\\-245.1797\\-9\\145.5078\\-249.0226\\-9\\144.0499\\-251.0391\\-9\\142.4888\\-252.9922\\-9\\140.8001\\-254.9453\\-9\\138.7708\\-256.8984\\-9\\135.7422\\-260.09\\-9\\132.9655\\-262.7578\\-9\\131.8359\\-263.7737\\-9\\127.9297\\-267.5169\\-9\\125.9766\\-269.1233\\-9\\122.0703\\-271.9401\\-9\\120.1172\\-273.5571\\-9\\118.1641\\-275.0394\\-9\\116.2109\\-276.1193\\-9\\112.3047\\-278.7174\\-9\\110.3516\\-279.8051\\-9\\108.3984\\-281.0714\\-9\\106.4453\\-281.8943\\-9\\104.4922\\-282.9964\\-9\\102.5391\\-283.7018\\-9\\100.5859\\-284.815\\-9\\98.63281\\-285.562\\-9\\96.67969\\-286.6102\\-9\\92.77344\\-287.8441\\-9\\90.82031\\-288.6635\\-9\\88.86719\\-289.0833\\-9\\86.91406\\-289.3886\\-9\\84.96094\\-289.9152\\-9\\83.00781\\-290.5416\\-9\\81.05469\\-290.8938\\-9\\77.14844\\-291.4358\\-9\\73.24219\\-292.2417\\-9\\71.28906\\-292.4801\\-9\\69.33594\\-292.6009\\-9\\65.42969\\-292.711\\-9\\59.57031\\-292.7248\\-9\\53.71094\\-292.5167\\-9\\47.85156\\-292.3695\\-9\\43.94531\\-292.5077\\-9\\38.08594\\-292.9535\\-9\\34.17969\\-293.4242\\-9\\32.22656\\-293.7868\\-9\\30.27344\\-294.2502\\-9\\28.32031\\-294.5754\\-9\\20.50781\\-295.3945\\-9\\16.60156\\-296.1048\\-9\\14.64844\\-296.4102\\-9\\10.74219\\-296.7972\\-9\\6.835938\\-297.0058\\-9\\0.9765625\\-297.2459\\-9\\-2.929688\\-297.3246\\-9\\-10.74219\\-297.1942\\-9\\-14.64844\\-296.9477\\-9\\-20.50781\\-296.6519\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "286" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "122" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-26.36719\\-296.2511\\-7\\-30.27344\\-295.5636\\-7\\-34.17969\\-295.198\\-7\\-40.03906\\-294.802\\-7\\-45.89844\\-294.5299\\-7\\-47.85156\\-294.4868\\-7\\-53.71094\\-294.2256\\-7\\-55.66406\\-294.1975\\-7\\-63.47656\\-294.186\\-7\\-67.38281\\-294.213\\-7\\-73.24219\\-294.0608\\-7\\-79.10156\\-293.5605\\-7\\-84.96094\\-292.8142\\-7\\-86.91406\\-292.424\\-7\\-88.86719\\-291.6909\\-7\\-92.77344\\-290.6987\\-7\\-94.72656\\-289.8072\\-7\\-98.63281\\-288.6164\\-7\\-100.5859\\-287.584\\-7\\-102.5391\\-286.8042\\-7\\-104.4922\\-285.5623\\-7\\-106.4453\\-284.6084\\-7\\-108.3984\\-283.3735\\-7\\-110.3516\\-282.3623\\-7\\-112.3047\\-281.2332\\-7\\-116.2109\\-278.6568\\-7\\-120.1172\\-275.7894\\-7\\-122.0703\\-274.6406\\-7\\-124.0234\\-273.1147\\-7\\-124.627\\-272.5234\\-7\\-127.0119\\-270.5703\\-7\\-129.8828\\-268.1028\\-7\\-135.2278\\-262.7578\\-7\\-137.6953\\-259.9279\\-7\\-139.6484\\-257.5606\\-7\\-140.293\\-256.8984\\-7\\-141.8108\\-254.9453\\-7\\-142.8805\\-252.9922\\-7\\-144.2979\\-251.0391\\-7\\-147.4609\\-245.9628\\-7\\-148.007\\-245.1797\\-7\\-148.8188\\-243.2266\\-7\\-149.9256\\-241.2734\\-7\\-150.5572\\-239.3203\\-7\\-151.5819\\-237.3672\\-7\\-153.9808\\-231.5078\\-7\\-154.4792\\-229.5547\\-7\\-155.7947\\-225.6484\\-7\\-156.5574\\-221.7422\\-7\\-157.8179\\-217.8359\\-7\\-158.5161\\-213.9297\\-7\\-159.03\\-211.9766\\-7\\-159.6416\\-210.0234\\-7\\-159.9381\\-208.0703\\-7\\-160.6294\\-202.2109\\-7\\-161.2004\\-198.3047\\-7\\-161.556\\-194.3984\\-7\\-161.556\\-192.4453\\-7\\-161.7286\\-186.5859\\-7\\-161.6989\\-178.7734\\-7\\-161.5532\\-174.8672\\-7\\-161.4148\\-172.9141\\-7\\-160.6028\\-167.0547\\-7\\-159.8498\\-161.1953\\-7\\-159.4837\\-159.2422\\-7\\-158.8477\\-157.2891\\-7\\-157.5753\\-151.4297\\-7\\-156.7513\\-149.4766\\-7\\-155.9309\\-145.5703\\-7\\-154.4717\\-141.6641\\-7\\-153.9063\\-139.7109\\-7\\-152.9574\\-137.7578\\-7\\-152.2005\\-135.8047\\-7\\-150.4725\\-131.8984\\-7\\-149.882\\-129.9453\\-7\\-148.8589\\-127.9922\\-7\\-148.1648\\-126.0391\\-7\\-147.161\\-124.0859\\-7\\-146.2693\\-122.1328\\-7\\-145.0534\\-120.1797\\-7\\-144.2238\\-118.2266\\-7\\-143.0361\\-116.2734\\-7\\-142.2852\\-114.3203\\-7\\-141.0499\\-112.3672\\-7\\-140.0764\\-110.4141\\-7\\-138.7121\\-108.4609\\-7\\-136.4397\\-104.5547\\-7\\-133.7891\\-100.9861\\-7\\-131.955\\-98.69531\\-7\\-129.8828\\-96.40853\\-7\\-127.9297\\-94.54294\\-7\\-125.9766\\-93.17926\\-7\\-124.0234\\-91.68066\\-7\\-122.0703\\-90.01547\\-7\\-120.1172\\-88.51891\\-7\\-118.1641\\-87.71902\\-7\\-113.732\\-85.02344\\-7\\-110.3516\\-83.68238\\-7\\-108.3984\\-82.69054\\-7\\-104.4922\\-81.36133\\-7\\-102.5391\\-80.54313\\-7\\-100.5859\\-80.23094\\-7\\-98.07751\\-79.16406\\-7\\-94.72656\\-78.06361\\-7\\-92.77344\\-77.69204\\-7\\-90.82031\\-77.15875\\-7\\-88.86719\\-76.5\\-7\\-86.91406\\-76.17897\\-7\\-83.00781\\-75.74268\\-7\\-81.05469\\-74.87533\\-7\\-79.10156\\-74.52539\\-7\\-75.19531\\-74.33038\\-7\\-73.24219\\-73.52867\\-7\\-71.28906\\-72.41624\\-7\\-69.33594\\-72.73059\\-7\\-67.38281\\-72.76647\\-7\\-59.57031\\-72.77455\\-7\\-55.66406\\-72.86079\\-7\\-51.75781\\-72.82507\\-7\\-47.85156\\-72.91775\\-7\\-43.94531\\-74.21731\\-7\\-41.99219\\-74.28713\\-7\\-38.08594\\-74.55288\\-7\\-36.13281\\-74.73466\\-7\\-34.17969\\-75.15202\\-7\\-32.22656\\-75.7558\\-7\\-28.32031\\-76.3125\\-7\\-26.36719\\-76.69793\\-7\\-20.50781\\-78.82797\\-7\\-18.55469\\-79.76953\\-7\\-16.60156\\-80.41087\\-7\\-14.64844\\-81.32645\\-7\\-12.69531\\-82.11962\\-7\\-11.11779\\-83.07031\\-7\\-8.176492\\-85.02344\\-7\\-5.8922\\-86.97656\\-7\\-2.929688\\-89.39324\\-7\\-0.9765625\\-90.2489\\-7\\0.9765625\\-90.45481\\-7\\2.929688\\-90.10265\\-7\\4.882813\\-89.10938\\-7\\6.835938\\-87.51563\\-7\\9.640625\\-85.02344\\-7\\12.69531\\-82.48575\\-7\\14.86171\\-81.11719\\-7\\20.50781\\-78.17006\\-7\\24.41406\\-76.40854\\-7\\26.36719\\-75.98274\\-7\\28.32031\\-75.23142\\-7\\30.27344\\-74.62238\\-7\\34.17969\\-74.22955\\-7\\36.13281\\-72.83385\\-7\\40.03906\\-72.65535\\-7\\41.99219\\-72.00559\\-7\\43.94531\\-71.7442\\-7\\45.89844\\-71.72027\\-7\\49.80469\\-71.77412\\-7\\55.66406\\-71.70393\\-7\\61.52344\\-71.83008\\-7\\63.47656\\-72.47028\\-7\\65.42969\\-72.64856\\-7\\69.33594\\-72.71235\\-7\\73.24219\\-72.84272\\-7\\75.19531\\-73.15608\\-7\\77.14844\\-74.2636\\-7\\81.05469\\-74.51588\\-7\\83.00781\\-74.74494\\-7\\84.96094\\-75.35938\\-7\\86.91406\\-75.86117\\-7\\90.82031\\-76.39515\\-7\\92.77344\\-76.89657\\-7\\94.72656\\-77.69312\\-7\\96.67969\\-78.32184\\-7\\98.63281\\-78.80724\\-7\\100.5859\\-79.57774\\-7\\104.4922\\-80.75629\\-7\\106.4453\\-81.66118\\-7\\108.3984\\-82.21212\\-7\\110.3516\\-82.94358\\-7\\112.3047\\-83.94263\\-7\\114.2578\\-84.76435\\-7\\116.2109\\-85.8972\\-7\\118.1641\\-86.81881\\-7\\121.7415\\-88.92969\\-7\\124.0234\\-90.57717\\-7\\126.5625\\-92.83594\\-7\\128.6069\\-94.78906\\-7\\130.3573\\-96.74219\\-7\\133.2031\\-100.6484\\-7\\134.6928\\-102.6016\\-7\\135.8895\\-104.5547\\-7\\136.8502\\-106.5078\\-7\\138.0521\\-108.4609\\-7\\138.9574\\-110.4141\\-7\\140.2937\\-112.3672\\-7\\141.1727\\-114.3203\\-7\\142.2674\\-116.2734\\-7\\142.9228\\-118.2266\\-7\\143.9779\\-120.1797\\-7\\144.6959\\-122.1328\\-7\\145.7705\\-124.0859\\-7\\146.5506\\-126.0391\\-7\\147.4687\\-127.9922\\-7\\148.2648\\-129.9453\\-7\\148.8268\\-131.8984\\-7\\149.7372\\-133.8516\\-7\\150.7924\\-137.7578\\-7\\151.7286\\-139.7109\\-7\\152.8568\\-143.6172\\-7\\153.6501\\-145.5703\\-7\\154.1158\\-147.5234\\-7\\154.9432\\-151.4297\\-7\\155.5411\\-153.3828\\-7\\155.935\\-155.3359\\-7\\156.5936\\-161.1953\\-7\\156.9127\\-163.1484\\-7\\157.4136\\-165.1016\\-7\\157.7234\\-167.0547\\-7\\158.0835\\-170.9609\\-7\\158.3534\\-174.8672\\-7\\158.7093\\-180.7266\\-7\\158.9073\\-186.5859\\-7\\158.9152\\-192.4453\\-7\\159.0558\\-196.3516\\-7\\158.8607\\-202.2109\\-7\\158.6709\\-206.1172\\-7\\158.0919\\-213.9297\\-7\\157.633\\-217.8359\\-7\\156.6147\\-221.7422\\-7\\155.9966\\-225.6484\\-7\\155.5011\\-227.6016\\-7\\154.7591\\-229.5547\\-7\\153.6841\\-233.4609\\-7\\152.6912\\-235.4141\\-7\\151.9104\\-237.3672\\-7\\150.7265\\-239.3203\\-7\\149.9581\\-241.2734\\-7\\148.7564\\-243.2266\\-7\\147.796\\-245.1797\\-7\\145.5078\\-248.3906\\-7\\144.9084\\-249.0859\\-7\\142.0934\\-252.9922\\-7\\140.3876\\-254.9453\\-7\\138.3867\\-256.8984\\-7\\134.6331\\-260.8047\\-7\\127.9297\\-267.0446\\-7\\124.0234\\-269.9731\\-7\\120.1172\\-273.1411\\-7\\118.1641\\-274.4849\\-7\\114.2578\\-277.0132\\-7\\112.3047\\-278.062\\-7\\108.3984\\-280.6521\\-7\\106.4453\\-281.5213\\-7\\104.4922\\-282.5901\\-7\\102.5391\\-283.3549\\-7\\100.5859\\-284.2798\\-7\\94.72656\\-286.8823\\-7\\92.77344\\-287.4086\\-7\\90.79996\\-288.1484\\-7\\88.86719\\-288.7628\\-7\\84.96094\\-289.4363\\-7\\83.00781\\-289.9003\\-7\\81.05469\\-290.5033\\-7\\79.10156\\-290.8634\\-7\\69.33594\\-292.0923\\-7\\67.38281\\-292.2417\\-7\\63.47656\\-292.3908\\-7\\59.57031\\-292.4217\\-7\\53.71094\\-292.2785\\-7\\47.85156\\-292.2904\\-7\\43.94531\\-292.5515\\-7\\38.08594\\-293.0913\\-7\\36.13281\\-293.3474\\-7\\30.27344\\-294.5182\\-7\\28.32031\\-294.7713\\-7\\24.41406\\-295.1686\\-7\\20.50781\\-295.7186\\-7\\18.55469\\-296.1607\\-7\\16.60156\\-296.4897\\-7\\10.74219\\-297.0442\\-7\\0.9765625\\-297.6281\\-7\\-2.929688\\-297.7439\\-7\\-10.74219\\-297.4965\\-7\\-14.64844\\-297.1253\\-7\\-20.50781\\-296.8167\\-7\\-24.41406\\-296.5021\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "288" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "123" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-297.9061\\-5\\-14.64844\\-297.3365\\-5\\-24.41406\\-296.6737\\-5\\-26.36719\\-296.4805\\-5\\-28.32031\\-296.1869\\-5\\-30.27344\\-295.776\\-5\\-34.17969\\-295.2872\\-5\\-40.03906\\-294.866\\-5\\-47.85156\\-294.4677\\-5\\-49.80469\\-294.3997\\-5\\-53.71094\\-294.118\\-5\\-57.61719\\-293.9544\\-5\\-61.52344\\-293.9102\\-5\\-67.38281\\-293.79\\-5\\-73.24219\\-293.6057\\-5\\-77.14844\\-293.3511\\-5\\-81.05469\\-293.0061\\-5\\-84.96094\\-292.4732\\-5\\-86.91406\\-291.8002\\-5\\-88.86719\\-291.287\\-5\\-90.82031\\-290.8879\\-5\\-92.77344\\-290.2655\\-5\\-94.72656\\-289.4161\\-5\\-96.67969\\-288.953\\-5\\-98.63281\\-288.1726\\-5\\-102.5391\\-286.4223\\-5\\-106.2207\\-284.2422\\-5\\-108.3984\\-283.1149\\-5\\-110.3516\\-281.9293\\-5\\-112.3047\\-280.9423\\-5\\-115.9307\\-278.3828\\-5\\-118.1641\\-276.9678\\-5\\-121.6996\\-274.4766\\-5\\-124.0234\\-272.731\\-5\\-128.9288\\-268.6172\\-5\\-129.8828\\-267.7559\\-5\\-135.7422\\-261.8188\\-5\\-139.6484\\-257.2192\\-5\\-139.9764\\-256.8984\\-5\\-141.6016\\-254.6893\\-5\\-144.0296\\-251.0391\\-5\\-145.1355\\-249.0859\\-5\\-145.5078\\-248.6319\\-5\\-147.749\\-245.1797\\-5\\-148.6013\\-243.2266\\-5\\-149.6601\\-241.2734\\-5\\-151.2082\\-237.3672\\-5\\-152.1667\\-235.4141\\-5\\-152.8568\\-233.4609\\-5\\-153.781\\-231.5078\\-5\\-154.8253\\-227.6016\\-5\\-155.5411\\-225.6484\\-5\\-156.0535\\-223.6953\\-5\\-156.8427\\-219.7891\\-5\\-157.5521\\-217.8359\\-5\\-157.9949\\-215.8828\\-5\\-158.3177\\-213.9297\\-5\\-158.7463\\-211.9766\\-5\\-159.4154\\-210.0234\\-5\\-159.8045\\-208.0703\\-5\\-160.2585\\-204.1641\\-5\\-160.6353\\-200.2578\\-5\\-160.8904\\-198.3047\\-5\\-161.2713\\-194.3984\\-5\\-161.2847\\-192.4453\\-5\\-161.4739\\-186.5859\\-5\\-161.5089\\-182.6797\\-5\\-161.4494\\-178.7734\\-5\\-161.2148\\-174.8672\\-5\\-160.1114\\-165.1016\\-5\\-159.5956\\-161.1953\\-5\\-159.0028\\-159.2422\\-5\\-158.5086\\-157.2891\\-5\\-157.787\\-153.3828\\-5\\-156.503\\-149.4766\\-5\\-156.1661\\-147.5234\\-5\\-155.6959\\-145.5703\\-5\\-154.8952\\-143.6172\\-5\\-153.6347\\-139.7109\\-5\\-152.6482\\-137.7578\\-5\\-151.9575\\-135.8047\\-5\\-150.9399\\-133.8516\\-5\\-149.5909\\-129.9453\\-5\\-148.6566\\-127.9922\\-5\\-147.9426\\-126.0391\\-5\\-146.8825\\-124.0859\\-5\\-146.0667\\-122.1328\\-5\\-144.8094\\-120.1797\\-5\\-144.0397\\-118.2266\\-5\\-142.859\\-116.2734\\-5\\-142.0864\\-114.3203\\-5\\-140.8099\\-112.3672\\-5\\-139.797\\-110.4141\\-5\\-137.6953\\-107.1136\\-5\\-137.2142\\-106.5078\\-5\\-136.2588\\-104.5547\\-5\\-133.7891\\-101.3135\\-5\\-129.8828\\-96.69739\\-5\\-127.8606\\-94.78906\\-5\\-125.9766\\-93.54557\\-5\\-122.8009\\-90.88281\\-5\\-122.0703\\-90.20258\\-5\\-120.0584\\-88.92969\\-5\\-116.5757\\-86.97656\\-5\\-114.2578\\-85.51172\\-5\\-108.7607\\-83.07031\\-5\\-106.4453\\-82.08724\\-5\\-104.4922\\-81.47025\\-5\\-102.5391\\-80.6393\\-5\\-100.5859\\-80.29266\\-5\\-97.65625\\-79.16406\\-5\\-94.72656\\-78.14277\\-5\\-92.77344\\-77.78241\\-5\\-88.86719\\-76.55721\\-5\\-86.91406\\-76.21314\\-5\\-83.00781\\-75.78987\\-5\\-81.05469\\-75.40508\\-5\\-79.10156\\-74.59954\\-5\\-75.19531\\-74.34924\\-5\\-73.24219\\-73.76934\\-5\\-71.28906\\-72.44147\\-5\\-69.33594\\-72.67561\\-5\\-67.38281\\-72.74275\\-5\\-63.47656\\-72.73502\\-5\\-57.61719\\-72.79101\\-5\\-55.66406\\-72.87931\\-5\\-51.75781\\-72.82507\\-5\\-47.85156\\-72.95817\\-5\\-45.89844\\-73.77747\\-5\\-43.94531\\-74.20035\\-5\\-38.08594\\-74.54466\\-5\\-36.13281\\-74.72451\\-5\\-34.17969\\-75.15113\\-5\\-32.22656\\-75.72993\\-5\\-28.32031\\-76.28489\\-5\\-26.36719\\-76.65376\\-5\\-24.41406\\-77.39045\\-5\\-20.50781\\-78.74812\\-5\\-18.55469\\-79.6791\\-5\\-16.60156\\-80.32522\\-5\\-12.69531\\-81.99027\\-5\\-10.74219\\-83.06224\\-5\\-8.789063\\-84.24632\\-5\\-4.882813\\-87.58863\\-5\\-2.929688\\-89.11938\\-5\\-0.9765625\\-90.02018\\-5\\0.9765625\\-90.21918\\-5\\2.929688\\-89.91187\\-5\\4.638672\\-88.92969\\-5\\6.835938\\-87.30475\\-5\\10.74219\\-83.90446\\-5\\12.69531\\-82.3396\\-5\\14.70727\\-81.11719\\-5\\16.60156\\-80.20308\\-5\\18.55469\\-79.0833\\-5\\22.50402\\-77.21094\\-5\\24.41406\\-76.39407\\-5\\26.36719\\-75.9631\\-5\\28.32031\\-75.18072\\-5\\30.27344\\-74.6267\\-5\\34.17969\\-74.23502\\-5\\36.13281\\-72.82507\\-5\\40.03906\\-72.66914\\-5\\41.99219\\-72.51995\\-5\\43.94531\\-71.7442\\-5\\47.85156\\-71.78667\\-5\\55.66406\\-71.7442\\-5\\59.57031\\-71.83984\\-5\\61.52344\\-72.15057\\-5\\63.47656\\-72.64184\\-5\\67.38281\\-72.67616\\-5\\73.24219\\-72.84272\\-5\\75.19531\\-73.99838\\-5\\77.14844\\-74.26955\\-5\\81.05469\\-74.55752\\-5\\83.00781\\-74.81326\\-5\\84.96094\\-75.45909\\-5\\86.91406\\-75.91896\\-5\\90.82031\\-76.4432\\-5\\92.77344\\-77.00422\\-5\\94.72656\\-77.76981\\-5\\96.67969\\-78.38176\\-5\\98.63281\\-78.83854\\-5\\100.5859\\-79.6153\\-5\\104.4922\\-80.81839\\-5\\106.4453\\-81.72355\\-5\\108.3984\\-82.27131\\-5\\110.3516\\-83.04688\\-5\\114.2578\\-84.87483\\-5\\116.2109\\-85.96026\\-5\\120.1172\\-88.00875\\-5\\121.5163\\-88.92969\\-5\\124.0234\\-90.77876\\-5\\127.9297\\-94.29711\\-5\\130.1193\\-96.74219\\-5\\131.4525\\-98.69531\\-5\\134.4875\\-102.6016\\-5\\135.4943\\-104.5547\\-5\\136.6441\\-106.5078\\-5\\138.7036\\-110.4141\\-5\\139.9694\\-112.3672\\-5\\140.881\\-114.3203\\-5\\142.0288\\-116.2734\\-5\\142.7255\\-118.2266\\-5\\143.6546\\-120.1797\\-5\\145.2996\\-124.0859\\-5\\146.3098\\-126.0391\\-5\\147.0557\\-127.9922\\-5\\148.053\\-129.9453\\-5\\148.5779\\-131.8984\\-5\\150.0712\\-135.8047\\-5\\150.5261\\-137.7578\\-5\\152.0236\\-141.6641\\-5\\152.5232\\-143.6172\\-5\\153.8609\\-147.5234\\-5\\154.6245\\-151.4297\\-5\\155.6431\\-155.3359\\-5\\156.2149\\-159.2422\\-5\\156.5855\\-163.1484\\-5\\157.3351\\-167.0547\\-5\\157.8689\\-170.9609\\-5\\158.1364\\-174.8672\\-5\\158.4258\\-180.7266\\-5\\158.5597\\-186.5859\\-5\\158.5414\\-192.4453\\-5\\158.6592\\-196.3516\\-5\\158.5562\\-202.2109\\-5\\158.3209\\-208.0703\\-5\\157.8689\\-213.9297\\-5\\157.5936\\-215.8828\\-5\\156.7129\\-219.7891\\-5\\156.0993\\-223.6953\\-5\\155.7381\\-225.6484\\-5\\154.4723\\-229.5547\\-5\\153.9999\\-231.5078\\-5\\153.3203\\-233.2423\\-5\\151.4773\\-237.3672\\-5\\150.4249\\-239.3203\\-5\\149.5613\\-241.2734\\-5\\148.4438\\-243.2266\\-5\\146.0549\\-247.1328\\-5\\143.5547\\-250.4192\\-5\\141.6016\\-252.8899\\-5\\139.8831\\-254.9453\\-5\\137.8794\\-256.8984\\-5\\133.7891\\-261.1672\\-5\\129.8828\\-264.5986\\-5\\127.6359\\-266.6641\\-5\\122.8335\\-270.5703\\-5\\120.1172\\-272.6042\\-5\\116.2109\\-275.3568\\-5\\114.2578\\-276.546\\-5\\112.3047\\-277.5956\\-5\\110.3516\\-278.9525\\-5\\106.4453\\-281.1927\\-5\\104.4922\\-282.0262\\-5\\102.5391\\-283.052\\-5\\100.5859\\-283.6689\\-5\\98.63281\\-284.7808\\-5\\96.67969\\-285.4742\\-5\\94.72656\\-286.4343\\-5\\92.77344\\-287.0676\\-5\\90.82031\\-287.6023\\-5\\88.86719\\-288.3497\\-5\\86.91406\\-288.8637\\-5\\83.00781\\-289.4404\\-5\\81.05469\\-289.8484\\-5\\79.10156\\-290.4757\\-5\\75.19531\\-291.0487\\-5\\71.28906\\-291.3836\\-5\\65.42969\\-291.7314\\-5\\61.52344\\-291.8907\\-5\\51.75781\\-291.9865\\-5\\47.85156\\-292.1901\\-5\\41.99219\\-292.7859\\-5\\38.08594\\-293.2488\\-5\\36.13281\\-293.5731\\-5\\32.22656\\-294.418\\-5\\30.27344\\-294.7131\\-5\\24.41406\\-295.3673\\-5\\22.46094\\-295.7078\\-5\\20.50781\\-296.1723\\-5\\18.55469\\-296.4987\\-5\\16.60156\\-296.7235\\-5\\8.789063\\-297.4415\\-5\\2.929688\\-298.0226\\-5\\-0.9765625\\-298.2709\\-5\\-4.882813\\-298.2396\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "285" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "124" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-297.6301\\-3\\-18.55469\\-297.2384\\-3\\-26.36719\\-296.6331\\-3\\-28.32031\\-296.4001\\-3\\-32.22656\\-295.6708\\-3\\-34.17969\\-295.3965\\-3\\-38.08594\\-295.0869\\-3\\-49.80469\\-294.3659\\-3\\-55.66406\\-293.8402\\-3\\-59.57031\\-293.6604\\-3\\-71.28906\\-293.3474\\-3\\-77.14844\\-293.0364\\-3\\-81.05469\\-292.7005\\-3\\-83.00781\\-292.4317\\-3\\-86.91406\\-291.3518\\-3\\-90.82031\\-290.5416\\-3\\-92.77344\\-289.6565\\-3\\-96.67969\\-288.6536\\-3\\-98.63281\\-287.6931\\-3\\-100.5859\\-286.9666\\-3\\-102.5391\\-285.8698\\-3\\-104.4922\\-284.9147\\-3\\-106.4453\\-283.6144\\-3\\-108.3984\\-282.8462\\-3\\-110.3516\\-281.5915\\-3\\-112.3047\\-280.5489\\-3\\-114.2578\\-279.2401\\-3\\-116.2109\\-277.7339\\-3\\-120.1172\\-275.3287\\-3\\-124.0234\\-272.2101\\-3\\-127.9297\\-269.2059\\-3\\-129.8828\\-267.4521\\-3\\-131.8359\\-265.4103\\-3\\-134.5799\\-262.7578\\-3\\-136.382\\-260.8047\\-3\\-137.6953\\-259.1044\\-3\\-139.6484\\-256.7385\\-3\\-142.4921\\-252.9922\\-3\\-144.8217\\-249.0859\\-3\\-146.2586\\-247.1328\\-3\\-147.4609\\-245.0503\\-3\\-148.4129\\-243.2266\\-3\\-150.2386\\-239.3203\\-3\\-150.8756\\-237.3672\\-3\\-151.952\\-235.4141\\-3\\-152.6086\\-233.4609\\-3\\-153.4972\\-231.5078\\-3\\-154.1183\\-229.5547\\-3\\-154.5959\\-227.6016\\-3\\-155.8838\\-223.6953\\-3\\-156.5936\\-219.7891\\-3\\-157.7962\\-215.8828\\-3\\-158.5414\\-211.9766\\-3\\-159.7001\\-208.0703\\-3\\-160.0012\\-206.1172\\-3\\-160.429\\-200.2578\\-3\\-160.901\\-194.3984\\-3\\-161.0652\\-188.5391\\-3\\-161.1707\\-182.6797\\-3\\-161.0798\\-178.7734\\-3\\-160.6633\\-172.9141\\-3\\-159.8995\\-165.1016\\-3\\-159.6236\\-163.1484\\-3\\-158.6225\\-159.2422\\-3\\-157.9464\\-155.3359\\-3\\-157.4504\\-153.3828\\-3\\-156.735\\-151.4297\\-3\\-155.9966\\-147.5234\\-3\\-155.3594\\-145.5703\\-3\\-154.6163\\-143.6172\\-3\\-154.0754\\-141.6641\\-3\\-152.3864\\-137.7578\\-3\\-151.682\\-135.8047\\-3\\-150.6696\\-133.8516\\-3\\-150.0921\\-131.8984\\-3\\-149.1962\\-129.9453\\-3\\-147.7014\\-126.0391\\-3\\-146.6481\\-124.0859\\-3\\-145.8118\\-122.1328\\-3\\-144.6077\\-120.1797\\-3\\-143.7789\\-118.2266\\-3\\-142.6819\\-116.2734\\-3\\-141.8495\\-114.3203\\-3\\-141.6016\\-114.0163\\-3\\-138.3405\\-108.4609\\-3\\-137.0016\\-106.5078\\-3\\-136\\-104.5547\\-3\\-134.5952\\-102.6016\\-3\\-131.8359\\-99.32767\\-3\\-129.5732\\-96.74219\\-3\\-127.5124\\-94.78906\\-3\\-125.9766\\-93.71297\\-3\\-122.0703\\-90.43826\\-3\\-119.7374\\-88.92969\\-3\\-118.1641\\-87.9981\\-3\\-116.2109\\-87.06837\\-3\\-114.2578\\-85.76304\\-3\\-110.3516\\-83.81877\\-3\\-108.3984\\-83.11066\\-3\\-106.4453\\-82.15395\\-3\\-104.4922\\-81.59829\\-3\\-102.5391\\-80.74826\\-3\\-100.5859\\-80.34186\\-3\\-97.22222\\-79.16406\\-3\\-94.72656\\-78.35943\\-3\\-90.82031\\-77.31415\\-3\\-88.86719\\-76.71478\\-3\\-86.91406\\-76.27778\\-3\\-81.05469\\-75.60456\\-3\\-79.10156\\-74.64376\\-3\\-77.14844\\-74.46185\\-3\\-73.24219\\-74.21107\\-3\\-69.33594\\-72.79642\\-3\\-63.47656\\-72.71235\\-3\\-61.52344\\-72.75057\\-3\\-59.57031\\-72.6894\\-3\\-55.66406\\-72.85171\\-3\\-51.75781\\-72.81641\\-3\\-47.85156\\-73.02286\\-3\\-45.89844\\-74.04662\\-3\\-43.94531\\-74.21191\\-3\\-40.03906\\-74.38909\\-3\\-36.13281\\-74.7486\\-3\\-34.17969\\-75.15202\\-3\\-32.22656\\-75.7131\\-3\\-28.32031\\-76.2567\\-3\\-26.36719\\-76.62979\\-3\\-24.41406\\-77.34838\\-3\\-20.50781\\-78.65531\\-3\\-18.55469\\-79.58064\\-3\\-14.64844\\-80.94033\\-3\\-10.74219\\-82.82801\\-3\\-8.789063\\-83.96903\\-3\\-4.882813\\-87.43229\\-3\\-2.625168\\-88.92969\\-3\\-0.9765625\\-89.82108\\-3\\0.9765625\\-90.10051\\-3\\2.929688\\-89.73565\\-3\\6.835938\\-87.05434\\-3\\9.19805\\-85.02344\\-3\\12.69531\\-82.24192\\-3\\14.64844\\-81.05975\\-3\\16.60156\\-80.17991\\-3\\18.55469\\-79.02863\\-3\\22.50402\\-77.21094\\-3\\24.41406\\-76.38889\\-3\\26.36719\\-75.95185\\-3\\28.32031\\-75.11592\\-3\\30.27344\\-74.61777\\-3\\34.17969\\-74.22346\\-3\\36.13281\\-72.83385\\-3\\40.03906\\-72.66914\\-3\\41.99219\\-72.64184\\-3\\43.94531\\-71.8046\\-3\\45.89844\\-71.77303\\-3\\55.66406\\-71.81519\\-3\\57.61719\\-71.88335\\-3\\59.57031\\-72.06886\\-3\\61.52344\\-72.62781\\-3\\67.38281\\-72.6904\\-3\\71.28906\\-72.79937\\-3\\73.24219\\-72.92766\\-3\\75.19531\\-74.20657\\-3\\77.14844\\-74.2989\\-3\\81.05469\\-74.6267\\-3\\83.00781\\-74.91715\\-3\\84.96094\\-75.58802\\-3\\86.91406\\-75.97832\\-3\\90.82031\\-76.50356\\-3\\92.77344\\-77.11328\\-3\\94.72656\\-77.84454\\-3\\96.67969\\-78.43695\\-3\\98.63281\\-78.88223\\-3\\100.5859\\-79.65571\\-3\\104.4922\\-80.89765\\-3\\106.4453\\-81.78303\\-3\\108.3984\\-82.31407\\-3\\110.3516\\-83.15424\\-3\\114.2578\\-85.00072\\-3\\120.1172\\-88.08825\\-3\\121.3117\\-88.92969\\-3\\123.8148\\-90.88281\\-3\\128.2211\\-94.78906\\-3\\129.8828\\-96.88038\\-3\\131.174\\-98.69531\\-3\\134.2209\\-102.6016\\-3\\135.2041\\-104.5547\\-3\\136.4425\\-106.5078\\-3\\137.2559\\-108.4609\\-3\\137.6953\\-109.0469\\-3\\140.6306\\-114.3203\\-3\\141.6563\\-116.2734\\-3\\142.5296\\-118.2266\\-3\\143.2413\\-120.1797\\-3\\144.2716\\-122.1328\\-3\\144.9402\\-124.0859\\-3\\146.041\\-126.0391\\-3\\146.7576\\-127.9922\\-3\\147.7661\\-129.9453\\-3\\148.967\\-133.8516\\-3\\149.8088\\-135.8047\\-3\\150.8316\\-139.7109\\-3\\151.7033\\-141.6641\\-3\\152.7631\\-145.5703\\-3\\153.532\\-147.5234\\-3\\154.032\\-149.4766\\-3\\154.7402\\-153.3828\\-3\\155.7142\\-157.2891\\-3\\156.0166\\-159.2422\\-3\\156.5855\\-165.1016\\-3\\156.84\\-167.0547\\-3\\157.5834\\-170.9609\\-3\\157.9162\\-174.8672\\-3\\158.1936\\-180.7266\\-3\\158.2968\\-186.5859\\-3\\158.2906\\-192.4453\\-3\\158.3793\\-196.3516\\-3\\158.332\\-202.2109\\-3\\158.2711\\-204.1641\\-3\\158.4063\\-208.0703\\-3\\158.0529\\-210.0234\\-3\\157.5936\\-213.9297\\-3\\156.7545\\-217.8359\\-3\\155.8926\\-223.6953\\-3\\155.3734\\-225.6484\\-3\\154.7309\\-227.6016\\-3\\153.7198\\-231.5078\\-3\\152.7737\\-233.4609\\-3\\152.0888\\-235.4141\\-3\\150.9586\\-237.3672\\-3\\150.1989\\-239.3203\\-3\\149.0451\\-241.2734\\-3\\148.1315\\-243.2266\\-3\\145.5305\\-247.1328\\-3\\144.1779\\-249.0859\\-3\\141.0445\\-252.9922\\-3\\139.6484\\-254.5105\\-3\\137.2416\\-256.8984\\-3\\133.7891\\-260.5334\\-3\\129.8828\\-264.0525\\-3\\129.2193\\-264.7109\\-3\\125.9766\\-267.6161\\-3\\122.0703\\-270.5934\\-3\\120.1172\\-271.9375\\-3\\118.1641\\-273.5237\\-3\\116.2109\\-274.9579\\-3\\114.2578\\-275.9276\\-3\\112.3047\\-277.2357\\-3\\108.3984\\-279.53\\-3\\106.4453\\-280.8013\\-3\\104.4922\\-281.5841\\-3\\102.5391\\-282.6526\\-3\\100.5859\\-283.3227\\-3\\96.67969\\-285.0967\\-3\\94.72656\\-285.7906\\-3\\92.77344\\-286.7189\\-3\\88.86719\\-287.7755\\-3\\86.91406\\-288.5042\\-3\\84.96094\\-288.9162\\-3\\81.05469\\-289.4126\\-3\\79.10156\\-289.8236\\-3\\77.14844\\-290.3985\\-3\\75.19531\\-290.7259\\-3\\71.28906\\-291.0633\\-3\\67.38281\\-291.2538\\-3\\61.52344\\-291.4464\\-3\\53.71094\\-291.6406\\-3\\49.80469\\-291.8778\\-3\\43.94531\\-292.6617\\-3\\40.03906\\-293.0907\\-3\\38.08594\\-293.4003\\-3\\34.17969\\-294.2741\\-3\\32.22656\\-294.6121\\-3\\26.36719\\-295.3036\\-3\\24.41406\\-295.6307\\-3\\22.46094\\-296.1187\\-3\\20.50781\\-296.4897\\-3\\18.55469\\-296.7345\\-3\\14.64844\\-297.0869\\-3\\6.835938\\-298.1011\\-3\\4.882813\\-298.3108\\-3\\0.9765625\\-298.5558\\-3\\-0.9765625\\-298.6268\\-3\\-4.882813\\-298.5388\\-3\\-10.74219\\-298.281\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "300" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "125" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-297.9516\\-1\\-18.55469\\-297.432\\-1\\-20.50781\\-297.2277\\-1\\-28.32031\\-296.5493\\-1\\-30.27344\\-296.2511\\-1\\-34.17969\\-295.5087\\-1\\-36.13281\\-295.2996\\-1\\-43.94531\\-294.7809\\-1\\-49.80469\\-294.3443\\-1\\-55.66406\\-293.6935\\-1\\-59.57031\\-293.444\\-1\\-67.38281\\-293.2213\\-1\\-75.19531\\-292.9054\\-1\\-79.10156\\-292.5879\\-1\\-81.05469\\-292.3138\\-1\\-84.96094\\-291.3761\\-1\\-88.86719\\-290.6875\\-1\\-92.77344\\-289.3334\\-1\\-94.72656\\-288.948\\-1\\-96.67969\\-288.2045\\-1\\-98.63281\\-287.3356\\-1\\-100.5859\\-286.6022\\-1\\-102.5391\\-285.4383\\-1\\-104.4922\\-284.5104\\-1\\-106.4453\\-283.3303\\-1\\-108.3984\\-282.4375\\-1\\-110.3516\\-281.2873\\-1\\-112.3047\\-280.036\\-1\\-114.2578\\-278.8984\\-1\\-118.1641\\-276.1091\\-1\\-120.1172\\-275.0506\\-1\\-122.0703\\-273.5062\\-1\\-125.9766\\-270.2349\\-1\\-127.9297\\-268.875\\-1\\-129.8828\\-267.1302\\-1\\-131.8359\\-265.0854\\-1\\-134.266\\-262.7578\\-1\\-136.0802\\-260.8047\\-1\\-137.4688\\-258.8516\\-1\\-140.7724\\-254.9453\\-1\\-142.2677\\-252.9922\\-1\\-143.2897\\-251.0391\\-1\\-145.9961\\-247.1328\\-1\\-147.0247\\-245.1797\\-1\\-148.2212\\-243.2266\\-1\\-149.0136\\-241.2734\\-1\\-150.0588\\-239.3203\\-1\\-150.6542\\-237.3672\\-1\\-151.6712\\-235.4141\\-1\\-153.1041\\-231.5078\\-1\\-153.919\\-229.5547\\-1\\-154.9341\\-225.6484\\-1\\-155.671\\-223.6953\\-1\\-156.1422\\-221.7422\\-1\\-156.4328\\-219.7891\\-1\\-156.8758\\-217.8359\\-1\\-157.5731\\-215.8828\\-1\\-158.0322\\-213.9297\\-1\\-158.3667\\-211.9766\\-1\\-158.824\\-210.0234\\-1\\-160.0157\\-208.0703\\-1\\-160.5596\\-206.1172\\-1\\-160.0985\\-204.1641\\-1\\-160.1214\\-202.2109\\-1\\-160.6116\\-194.3984\\-1\\-160.8073\\-182.6797\\-1\\-160.7179\\-178.7734\\-1\\-160.5067\\-174.8672\\-1\\-160.2381\\-170.9609\\-1\\-159.8969\\-167.0547\\-1\\-159.668\\-165.1016\\-1\\-158.7155\\-161.1953\\-1\\-157.6705\\-155.3359\\-1\\-156.9734\\-153.3828\\-1\\-156.4777\\-151.4297\\-1\\-155.7617\\-147.5234\\-1\\-154.9669\\-145.5703\\-1\\-153.8448\\-141.6641\\-1\\-152.8841\\-139.7109\\-1\\-152.1686\\-137.7578\\-1\\-150.4768\\-133.8516\\-1\\-149.8336\\-131.8984\\-1\\-148.8892\\-129.9453\\-1\\-148.3024\\-127.9922\\-1\\-145.5078\\-122.1446\\-1\\-143.4197\\-118.2266\\-1\\-142.5658\\-116.2734\\-1\\-141.6016\\-114.4262\\-1\\-140.4218\\-112.3672\\-1\\-139.0772\\-110.4141\\-1\\-138.1017\\-108.4609\\-1\\-135.5913\\-104.5547\\-1\\-134.4105\\-102.6016\\-1\\-132.7732\\-100.6484\\-1\\-129.1707\\-96.74219\\-1\\-127.1439\\-94.78906\\-1\\-124.0234\\-92.19567\\-1\\-122.0703\\-90.73438\\-1\\-119.4901\\-88.92969\\-1\\-118.1641\\-88.08421\\-1\\-116.2109\\-87.23646\\-1\\-112.3047\\-84.92426\\-1\\-110.3516\\-83.99373\\-1\\-108.3984\\-83.27471\\-1\\-106.4453\\-82.21233\\-1\\-104.4922\\-81.7523\\-1\\-102.5391\\-80.92188\\-1\\-98.63281\\-79.87976\\-1\\-96.48862\\-79.16406\\-1\\-94.72656\\-78.68445\\-1\\-92.77344\\-77.94863\\-1\\-88.86719\\-76.96346\\-1\\-86.91406\\-76.33203\\-1\\-81.05469\\-75.6526\\-1\\-79.10156\\-74.66889\\-1\\-77.14844\\-74.4833\\-1\\-73.24219\\-74.2283\\-1\\-71.28906\\-73.6273\\-1\\-69.33594\\-72.87\\-1\\-61.52344\\-72.61221\\-1\\-59.57031\\-72.34999\\-1\\-57.61719\\-72.6199\\-1\\-55.66406\\-72.78273\\-1\\-51.75781\\-72.77455\\-1\\-47.85156\\-72.85171\\-1\\-46.0612\\-73.30469\\-1\\-43.94531\\-74.16811\\-1\\-40.03906\\-74.36513\\-1\\-36.13281\\-74.72451\\-1\\-34.17969\\-75.12173\\-1\\-32.22656\\-75.71004\\-1\\-28.32031\\-76.25102\\-1\\-26.36719\\-76.62143\\-1\\-22.46094\\-77.96861\\-1\\-20.50781\\-78.55895\\-1\\-18.55469\\-79.48483\\-1\\-16.60156\\-80.22579\\-1\\-14.64844\\-80.79166\\-1\\-10.74219\\-82.5966\\-1\\-8.789063\\-83.87495\\-1\\-4.882813\\-87.19269\\-1\\-2.302632\\-88.92969\\-1\\-0.9765625\\-89.67072\\-1\\0.9765625\\-90.08115\\-1\\2.929688\\-89.54159\\-1\\6.835938\\-86.74894\\-1\\11.49269\\-83.07031\\-1\\12.69531\\-82.1807\\-1\\14.64844\\-80.98222\\-1\\16.60156\\-80.16295\\-1\\18.55469\\-79.01546\\-1\\24.41406\\-76.4034\\-1\\26.36719\\-75.95972\\-1\\28.32031\\-75.13153\\-1\\30.27344\\-74.63576\\-1\\34.17969\\-74.22346\\-1\\36.13281\\-72.85171\\-1\\41.99219\\-72.64184\\-1\\43.94531\\-71.88867\\-1\\45.89844\\-71.90269\\-1\\49.80469\\-71.77573\\-1\\55.66406\\-71.89729\\-1\\57.61719\\-72.26154\\-1\\59.57031\\-72.51525\\-1\\61.52344\\-72.66221\\-1\\69.33594\\-72.73502\\-1\\71.28906\\-72.80784\\-1\\73.02296\\-73.30469\\-1\\75.19531\\-74.23502\\-1\\77.14844\\-74.3286\\-1\\81.05469\\-74.69681\\-1\\83.00781\\-75.10319\\-1\\84.96094\\-75.7558\\-1\\90.82031\\-76.5998\\-1\\94.72656\\-77.91013\\-1\\98.63281\\-79.02863\\-1\\104.4922\\-80.99905\\-1\\106.4453\\-81.84495\\-1\\108.3984\\-82.36935\\-1\\112.3047\\-84.1608\\-1\\116.2109\\-86.13213\\-1\\118.1641\\-87.27761\\-1\\120.1172\\-88.17705\\-1\\122.0703\\-89.65094\\-1\\123.5428\\-90.88281\\-1\\125.9766\\-93.1227\\-1\\127.9297\\-94.79828\\-1\\129.8828\\-97.24321\\-1\\130.9265\\-98.69531\\-1\\132.4848\\-100.6484\\-1\\133.8577\\-102.6016\\-1\\134.967\\-104.5547\\-1\\136.1989\\-106.5078\\-1\\137.0079\\-108.4609\\-1\\138.2285\\-110.4141\\-1\\139.1197\\-112.3672\\-1\\140.3966\\-114.3203\\-1\\141.2421\\-116.2734\\-1\\142.3418\\-118.2266\\-1\\142.9583\\-120.1797\\-1\\143.998\\-122.1328\\-1\\144.6763\\-124.0859\\-1\\145.6975\\-126.0391\\-1\\148.1673\\-131.8984\\-1\\148.7067\\-133.8516\\-1\\150.151\\-137.7578\\-1\\150.5755\\-139.7109\\-1\\151.2385\\-141.6641\\-1\\152.0092\\-143.6172\\-1\\152.487\\-145.5703\\-1\\153.7816\\-149.4766\\-1\\154.8842\\-155.3359\\-1\\155.7815\\-159.2422\\-1\\156.0486\\-161.1953\\-1\\156.5537\\-167.0547\\-1\\156.7874\\-169.0078\\-1\\157.426\\-172.9141\\-1\\157.6233\\-174.8672\\-1\\157.8896\\-178.7734\\-1\\158.0185\\-182.6797\\-1\\158.0615\\-186.5859\\-1\\158.0726\\-192.4453\\-1\\158.1505\\-196.3516\\-1\\158.1555\\-200.2578\\-1\\158.0853\\-204.1641\\-1\\158.8364\\-206.1172\\-1\\159.8106\\-208.0703\\-1\\158.1569\\-210.0234\\-1\\157.5521\\-211.9766\\-1\\156.7743\\-215.8828\\-1\\156.3078\\-219.7891\\-1\\156.0213\\-221.7422\\-1\\155.6202\\-223.6953\\-1\\154.9713\\-225.6484\\-1\\154.0187\\-229.5547\\-1\\153.3203\\-231.4921\\-1\\152.448\\-233.4609\\-1\\151.7389\\-235.4141\\-1\\150.6117\\-237.3672\\-1\\149.8922\\-239.3203\\-1\\148.6881\\-241.2734\\-1\\147.7597\\-243.2266\\-1\\146.437\\-245.1797\\-1\\144.9544\\-247.1328\\-1\\143.7544\\-249.0859\\-1\\142.3099\\-251.0391\\-1\\139.6484\\-254.0545\\-1\\133.7891\\-260.0467\\-1\\131.8359\\-261.8965\\-1\\128.746\\-264.7109\\-1\\125.9766\\-267.1523\\-1\\122.0703\\-269.9887\\-1\\118.1641\\-273.0861\\-1\\116.1133\\-274.4766\\-1\\114.2578\\-275.5402\\-1\\112.3047\\-276.8273\\-1\\110.3516\\-277.7916\\-1\\108.3984\\-279.1443\\-1\\104.4922\\-281.2332\\-1\\102.5391\\-282.0678\\-1\\100.5859\\-283.05\\-1\\98.63281\\-283.6486\\-1\\96.67969\\-284.7122\\-1\\94.72656\\-285.3575\\-1\\92.72694\\-286.1953\\-1\\90.82031\\-286.8978\\-1\\88.86719\\-287.3637\\-1\\84.96094\\-288.5787\\-1\\83.00781\\-288.948\\-1\\79.10156\\-289.4161\\-1\\77.14844\\-289.7598\\-1\\75.19531\\-290.239\\-1\\73.24219\\-290.5601\\-1\\69.33594\\-290.8696\\-1\\65.42969\\-291.0286\\-1\\57.61719\\-291.2745\\-1\\51.75781\\-291.549\\-1\\49.80469\\-291.7142\\-1\\45.89844\\-292.4012\\-1\\40.03906\\-293.1906\\-1\\38.08594\\-293.5537\\-1\\36.13281\\-294.0749\\-1\\34.17969\\-294.4707\\-1\\32.22656\\-294.764\\-1\\28.32031\\-295.23\\-1\\26.36719\\-295.5128\\-1\\22.46094\\-296.4492\\-1\\20.50781\\-296.7031\\-1\\16.60156\\-297.0628\\-1\\14.64844\\-297.3\\-1\\10.74219\\-298.0226\\-1\\8.789063\\-298.2709\\-1\\4.882813\\-298.5909\\-1\\2.929688\\-298.668\\-1\\0.9765625\\-299.0438\\-1\\-0.9765625\\-299.5279\\-1\\-2.929688\\-298.8224\\-1\\-6.835938\\-298.6884\\-1\\-10.74219\\-298.5022\\-1\\-12.69531\\-298.2911\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "307" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "126" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.9765625\\-301.1765\\1\\-2.116935\\-299.8672\\1\\-2.929688\\-299.1037\\1\\-4.882813\\-298.9106\\1\\-6.835938\\-298.866\\1\\-10.74219\\-298.6588\\1\\-12.69531\\-298.4946\\1\\-16.60156\\-297.9948\\1\\-20.50781\\-297.3864\\1\\-28.32031\\-296.6593\\1\\-30.27344\\-296.4201\\1\\-34.17969\\-295.647\\1\\-36.13281\\-295.3876\\1\\-40.03906\\-295.0682\\1\\-47.85156\\-294.4961\\1\\-49.80469\\-294.2974\\1\\-53.71094\\-293.7671\\1\\-59.57031\\-293.2009\\1\\-67.38281\\-293.0063\\1\\-75.19531\\-292.6417\\1\\-79.10156\\-292.1355\\1\\-81.05469\\-291.6966\\1\\-86.91406\\-290.7756\\1\\-88.86719\\-290.2117\\1\\-90.82031\\-289.503\\1\\-94.72656\\-288.6164\\1\\-96.67969\\-287.7003\\1\\-98.63281\\-287.0072\\1\\-102.5391\\-285.1096\\1\\-104.4922\\-283.9434\\1\\-106.4453\\-283.0836\\1\\-108.3984\\-281.9491\\1\\-110.3516\\-280.9891\\1\\-112.3047\\-279.6393\\1\\-114.2578\\-278.4494\\1\\-117.287\\-276.4297\\1\\-118.1641\\-275.7764\\1\\-120.1172\\-274.6494\\1\\-122.0703\\-273.2139\\1\\-125.9766\\-269.8618\\1\\-127.6618\\-268.6172\\1\\-129.8739\\-266.6641\\1\\-131.8359\\-264.5868\\1\\-133.8501\\-262.7578\\1\\-135.7422\\-260.7202\\1\\-137.0917\\-258.8516\\1\\-138.7522\\-256.8984\\1\\-140.5105\\-254.9453\\1\\-141.9766\\-252.9922\\1\\-143.0054\\-251.0391\\1\\-143.5547\\-250.32\\1\\-145.6694\\-247.1328\\1\\-146.7417\\-245.1797\\1\\-148.0107\\-243.2266\\1\\-148.7609\\-241.2734\\1\\-149.8117\\-239.3203\\1\\-150.4662\\-237.3672\\1\\-152.1723\\-233.4609\\1\\-152.8015\\-231.5078\\1\\-153.6841\\-229.5547\\1\\-154.6825\\-225.6484\\1\\-155.3897\\-223.6953\\1\\-155.9888\\-221.7422\\1\\-156.6357\\-217.8359\\1\\-157.8828\\-213.9297\\1\\-158.6242\\-210.0234\\1\\-159.1797\\-209.3463\\1\\-161.1006\\-208.0703\\1\\-161.6375\\-206.1172\\1\\-160.1563\\-204.1641\\1\\-159.9539\\-202.2109\\1\\-160.0915\\-200.2578\\1\\-160.3697\\-194.3984\\1\\-160.5261\\-182.6797\\1\\-160.4392\\-178.7734\\1\\-160.2699\\-174.8672\\1\\-159.8633\\-169.0078\\1\\-159.6505\\-167.0547\\1\\-159.2744\\-165.1016\\1\\-158.7603\\-163.1484\\1\\-157.8103\\-157.2891\\1\\-156.6223\\-153.3828\\1\\-155.9683\\-149.4766\\1\\-155.4184\\-147.5234\\1\\-154.6662\\-145.5703\\1\\-154.1453\\-143.6172\\1\\-153.5212\\-141.6641\\1\\-152.5722\\-139.7109\\1\\-151.9326\\-137.7578\\1\\-150.9119\\-135.8047\\1\\-150.2918\\-133.8516\\1\\-148.6538\\-129.9453\\1\\-148.1014\\-127.9922\\1\\-147.0501\\-126.0391\\1\\-146.2505\\-124.0859\\1\\-145.1242\\-122.1328\\1\\-144.2242\\-120.1797\\1\\-143.1013\\-118.2266\\1\\-142.4269\\-116.2734\\1\\-141.2014\\-114.3203\\1\\-140.2161\\-112.3672\\1\\-138.8328\\-110.4141\\1\\-137.8174\\-108.4609\\1\\-136.6471\\-106.5078\\1\\-135.2681\\-104.5547\\1\\-134.2096\\-102.6016\\1\\-132.6102\\-100.6484\\1\\-129.0351\\-96.74219\\1\\-127.9297\\-95.65933\\1\\-125.9766\\-93.93787\\1\\-124.0234\\-92.36858\\1\\-120.1172\\-89.51969\\1\\-118.1641\\-88.17386\\1\\-116.2109\\-87.38657\\1\\-114.2578\\-86.33515\\1\\-112.3047\\-84.95686\\1\\-108.3984\\-83.41284\\1\\-106.4453\\-82.34882\\1\\-104.4922\\-81.90743\\1\\-100.5859\\-80.56009\\1\\-98.63281\\-80.1346\\1\\-96.67969\\-79.52385\\1\\-92.77344\\-78.17474\\1\\-86.91406\\-76.50402\\1\\-84.96094\\-76.16179\\1\\-81.05469\\-75.69108\\1\\-79.10156\\-74.70087\\1\\-75.19531\\-74.45703\\1\\-73.24219\\-74.25148\\1\\-71.28906\\-73.64173\\1\\-69.33594\\-72.88874\\1\\-65.42969\\-72.73502\\1\\-63.47656\\-72.59174\\1\\-59.57031\\-71.52805\\1\\-57.61719\\-72.45349\\1\\-55.66406\\-72.72738\\1\\-47.85156\\-72.79937\\1\\-45.89844\\-72.94787\\1\\-43.94531\\-74.02391\\1\\-41.99219\\-74.23502\\1\\-38.08594\\-74.46515\\1\\-36.13281\\-74.66781\\1\\-34.17969\\-75.08971\\1\\-32.22656\\-75.72315\\1\\-28.32031\\-76.26244\\1\\-26.36719\\-76.62621\\1\\-24.41406\\-77.30711\\1\\-20.50781\\-78.5031\\1\\-18.55469\\-79.41914\\1\\-16.60156\\-80.17947\\1\\-14.64844\\-80.75365\\1\\-12.69531\\-81.66825\\1\\-10.74219\\-82.41187\\1\\-8.789063\\-83.87249\\1\\-6.835938\\-85.52629\\1\\-4.820097\\-86.97656\\1\\-0.9765625\\-89.49731\\1\\0.9765625\\-89.93693\\1\\2.929688\\-89.29676\\1\\4.882813\\-87.9325\\1\\11.35254\\-83.07031\\1\\12.69531\\-82.12674\\1\\14.64844\\-80.95313\\1\\16.60156\\-80.15179\\1\\18.55469\\-79.01546\\1\\22.50671\\-77.21094\\1\\24.41406\\-76.41827\\1\\26.36719\\-75.97962\\1\\28.32031\\-75.19678\\1\\30.27344\\-74.66781\\1\\34.17969\\-74.24658\\1\\36.13281\\-72.86079\\1\\41.99219\\-72.65535\\1\\43.94531\\-72.28407\\1\\45.89844\\-72.1875\\1\\47.85156\\-71.83984\\1\\49.80469\\-71.78447\\1\\53.71094\\-71.8046\\1\\55.66406\\-71.94313\\1\\57.61719\\-72.60178\\1\\61.52344\\-72.67616\\1\\63.47656\\-72.66221\\1\\71.28906\\-72.82507\\1\\73.24219\\-73.99363\\1\\75.19531\\-74.27544\\1\\79.10156\\-74.5032\\1\\81.05469\\-74.7841\\1\\83.00781\\-75.24909\\1\\84.96094\\-75.84129\\1\\88.86719\\-76.34995\\1\\90.82031\\-76.73568\\1\\92.77344\\-77.40063\\1\\100.5859\\-79.79476\\1\\102.5391\\-80.45584\\1\\106.4453\\-81.91402\\1\\108.3984\\-82.44165\\1\\110.3516\\-83.44331\\1\\112.3047\\-84.2651\\1\\114.2578\\-85.3693\\1\\116.2109\\-86.23833\\1\\118.1641\\-87.42997\\1\\120.1172\\-88.31934\\1\\122.0703\\-89.80798\\1\\123.2824\\-90.88281\\1\\127.9297\\-95.20067\\1\\130.7586\\-98.69531\\1\\132.2004\\-100.6484\\1\\134.7362\\-104.5547\\1\\135.8918\\-106.5078\\1\\136.7915\\-108.4609\\1\\137.9428\\-110.4141\\1\\138.8459\\-112.3672\\1\\140.1459\\-114.3203\\1\\140.9564\\-116.2734\\1\\142.1096\\-118.2266\\1\\142.745\\-120.1797\\1\\143.6399\\-122.1328\\1\\145.2298\\-126.0391\\1\\146.2728\\-127.9922\\1\\146.9389\\-129.9453\\1\\147.906\\-131.8984\\1\\149.0673\\-135.8047\\1\\149.9221\\-137.7578\\1\\150.8757\\-141.6641\\1\\151.7263\\-143.6172\\1\\152.7614\\-147.5234\\1\\153.4424\\-149.4766\\1\\153.9278\\-151.4297\\1\\154.9691\\-157.2891\\1\\155.4732\\-159.2422\\1\\155.8268\\-161.1953\\1\\156.068\\-163.1484\\1\\156.691\\-170.9609\\1\\157.4136\\-176.8203\\1\\157.5834\\-178.7734\\1\\157.7648\\-182.6797\\1\\157.8369\\-188.5391\\1\\157.8369\\-192.4453\\1\\157.9327\\-196.3516\\1\\157.959\\-200.2578\\1\\157.8653\\-204.1641\\1\\159.1797\\-206.2709\\1\\160.0878\\-208.0703\\1\\159.1797\\-209.2849\\1\\158.1432\\-210.0234\\1\\157.1399\\-211.9766\\1\\156.5222\\-215.8828\\1\\156.1607\\-219.7891\\1\\155.8079\\-221.7422\\1\\154.6787\\-225.6484\\1\\153.7715\\-229.5547\\1\\152.8701\\-231.5078\\1\\152.1623\\-233.4609\\1\\151.2199\\-235.4141\\1\\149.4387\\-239.3203\\1\\148.4062\\-241.2734\\1\\146.0631\\-245.1797\\1\\144.5655\\-247.1328\\1\\143.5547\\-248.69\\1\\141.8438\\-251.0391\\1\\140.1772\\-252.9922\\1\\137.6953\\-255.6481\\1\\135.7422\\-257.5712\\1\\134.5418\\-258.8516\\1\\131.8359\\-261.4855\\1\\128.1438\\-264.7109\\1\\125.7918\\-266.6641\\1\\120.1172\\-271.0891\\1\\118.1641\\-272.4081\\1\\114.2578\\-275.2312\\1\\112.3047\\-276.2067\\1\\108.3984\\-278.6724\\1\\106.4453\\-279.6589\\1\\104.4922\\-280.8633\\1\\102.5391\\-281.61\\1\\100.5859\\-282.6641\\1\\98.63281\\-283.3186\\1\\96.67969\\-284.0807\\1\\94.72656\\-285.0012\\1\\92.77344\\-285.5966\\1\\90.82031\\-286.4714\\1\\86.91406\\-287.4714\\1\\83.00781\\-288.6132\\1\\81.05469\\-288.948\\1\\75.19531\\-289.6036\\1\\71.28906\\-290.3039\\1\\69.33594\\-290.5033\\1\\65.42969\\-290.7328\\1\\53.71094\\-291.2644\\1\\49.80469\\-291.5843\\1\\47.85156\\-291.9326\\1\\45.89844\\-292.4012\\1\\40.03906\\-293.2834\\1\\38.08594\\-293.7026\\1\\36.13281\\-294.2741\\1\\34.17969\\-294.6121\\1\\28.32031\\-295.3624\\1\\26.36719\\-295.7731\\1\\24.41406\\-296.2979\\1\\22.46094\\-296.6445\\1\\16.60156\\-297.235\\1\\14.64844\\-297.5462\\1\\12.69531\\-298.0757\\1\\8.789063\\-298.5317\\1\\4.882813\\-298.7915\\1\\2.929688\\-298.8652\\1\\0.9864268\\-299.8672\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "307" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "127" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.9765625\\-300.7607\\3\\-2.929688\\-299.2102\\3\\-10.74219\\-298.7891\\3\\-16.60156\\-298.2396\\3\\-20.50781\\-297.562\\3\\-24.41406\\-297.102\\3\\-30.27344\\-296.5372\\3\\-32.22656\\-296.2247\\3\\-34.17969\\-295.7895\\3\\-36.13281\\-295.4956\\3\\-40.03906\\-295.1057\\3\\-43.94531\\-294.8206\\3\\-47.85156\\-294.4868\\3\\-49.80469\\-294.2485\\3\\-53.71094\\-293.6312\\3\\-57.61719\\-293.1686\\3\\-59.57031\\-292.6358\\3\\-61.52344\\-292.9155\\3\\-63.47656\\-292.9331\\3\\-67.38281\\-292.7946\\3\\-71.28906\\-292.596\\3\\-75.19531\\-292.2541\\3\\-79.10156\\-291.5694\\3\\-84.96094\\-290.7825\\3\\-86.91406\\-290.3285\\3\\-88.86719\\-289.6231\\3\\-92.77344\\-288.8352\\3\\-96.67969\\-287.3221\\3\\-98.63281\\-286.6648\\3\\-100.5859\\-285.5347\\3\\-102.5391\\-284.7425\\3\\-104.4922\\-283.5428\\3\\-106.4453\\-282.7706\\3\\-108.3984\\-281.5771\\3\\-110.3516\\-280.6076\\3\\-113.6719\\-278.3828\\3\\-114.2578\\-277.9149\\3\\-116.2109\\-276.8326\\3\\-122.0703\\-272.7974\\3\\-127.1779\\-268.6172\\3\\-129.3279\\-266.6641\\3\\-131.8359\\-264.1236\\3\\-133.7891\\-262.2996\\3\\-135.7422\\-260.2155\\3\\-136.8139\\-258.8516\\3\\-140.2092\\-254.9453\\3\\-141.6016\\-252.9195\\3\\-142.78\\-251.0391\\3\\-144.1154\\-249.0859\\3\\-147.4609\\-243.5859\\3\\-147.741\\-243.2266\\3\\-149.4855\\-239.3203\\3\\-150.2906\\-237.3672\\3\\-150.9324\\-235.4141\\3\\-151.9355\\-233.4609\\3\\-152.5534\\-231.5078\\3\\-153.3725\\-229.5547\\3\\-154.0146\\-227.6016\\3\\-154.4771\\-225.6484\\3\\-155.0441\\-223.6953\\3\\-155.8043\\-221.7422\\3\\-156.1853\\-219.7891\\3\\-156.4534\\-217.8359\\3\\-156.8987\\-215.8828\\3\\-157.6705\\-213.9297\\3\\-158.3685\\-210.0234\\3\\-159.1797\\-208.7241\\3\\-160.144\\-208.0703\\3\\-160.6717\\-206.1172\\3\\-159.7669\\-204.1641\\3\\-159.7525\\-202.2109\\3\\-159.8969\\-200.2578\\3\\-160.1662\\-194.3984\\3\\-160.2745\\-184.6328\\3\\-160.2596\\-180.7266\\3\\-160.1513\\-176.8203\\3\\-159.948\\-172.9141\\3\\-159.6144\\-169.0078\\3\\-159.2744\\-167.0547\\3\\-158.7954\\-165.1016\\3\\-158.4565\\-163.1484\\3\\-157.9002\\-159.2422\\3\\-157.474\\-157.2891\\3\\-156.7743\\-155.3359\\3\\-156.1182\\-151.4297\\3\\-155.7142\\-149.4766\\3\\-154.9934\\-147.5234\\3\\-153.919\\-143.6172\\3\\-153.0762\\-141.6641\\3\\-151.6181\\-137.7578\\3\\-150.6245\\-135.8047\\3\\-150.0672\\-133.8516\\3\\-149.1551\\-131.8984\\3\\-147.8392\\-127.9922\\3\\-146.7712\\-126.0391\\3\\-145.9778\\-124.0859\\3\\-144.8423\\-122.1328\\3\\-143.9599\\-120.1797\\3\\-142.8672\\-118.2266\\3\\-142.2194\\-116.2734\\3\\-140.9075\\-114.3203\\3\\-139.9442\\-112.3672\\3\\-137.4001\\-108.4609\\3\\-136.4265\\-106.5078\\3\\-135.08\\-104.5547\\3\\-133.8992\\-102.6016\\3\\-132.3776\\-100.6484\\3\\-128.8508\\-96.74219\\3\\-125.9766\\-94.0985\\3\\-124.0234\\-92.6437\\3\\-122.0703\\-91.28971\\3\\-120.1172\\-89.70695\\3\\-118.1641\\-88.33251\\3\\-116.2109\\-87.50463\\3\\-114.2578\\-86.42114\\3\\-112.3047\\-85.06865\\3\\-108.3984\\-83.54051\\3\\-106.4453\\-82.51768\\3\\-102.5391\\-81.41473\\3\\-100.5859\\-80.72798\\3\\-96.67969\\-79.74051\\3\\-94.72656\\-78.96462\\3\\-92.77344\\-78.42458\\3\\-90.82031\\-77.74424\\3\\-86.91406\\-76.77763\\3\\-84.96094\\-76.24107\\3\\-81.05469\\-75.75947\\3\\-79.10156\\-74.9516\\3\\-77.14844\\-74.58064\\3\\-75.19531\\-74.50198\\3\\-73.24219\\-74.28728\\3\\-71.28906\\-73.68682\\3\\-69.33594\\-72.87931\\3\\-65.42969\\-72.75848\\3\\-61.52344\\-72.17527\\3\\-59.57031\\-72.16817\\3\\-57.61719\\-72.54923\\3\\-55.66406\\-72.74275\\3\\-51.75781\\-72.74275\\3\\-45.89844\\-72.82507\\3\\-43.94531\\-73.96735\\3\\-41.99219\\-74.26381\\3\\-38.08594\\-74.42523\\3\\-36.13281\\-74.63636\\3\\-34.17969\\-75.05605\\3\\-32.22656\\-75.73307\\3\\-28.32031\\-76.25722\\3\\-26.36719\\-76.6189\\3\\-24.41406\\-77.29357\\3\\-20.50781\\-78.49119\\3\\-18.55469\\-79.39169\\3\\-16.60156\\-80.11224\\3\\-14.64844\\-80.73078\\3\\-12.69531\\-81.73006\\3\\-10.74219\\-82.48296\\3\\-7.220929\\-85.02344\\3\\-4.412957\\-86.97656\\3\\-0.9765625\\-89.1684\\3\\0.9765625\\-89.54943\\3\\2.929688\\-88.88966\\3\\4.882813\\-87.78922\\3\\8.453967\\-85.02344\\3\\12.69531\\-82.08715\\3\\14.64844\\-80.92495\\3\\16.60156\\-80.15166\\3\\18.55469\\-79.05556\\3\\22.56775\\-77.21094\\3\\24.41406\\-76.43862\\3\\26.36719\\-76.00671\\3\\30.27344\\-74.7207\\3\\32.22656\\-74.44813\\3\\34.17969\\-74.27544\\3\\36.13281\\-73.28197\\3\\38.08594\\-72.78273\\3\\43.94531\\-72.6274\\3\\45.89844\\-72.34198\\3\\47.85156\\-72.21187\\3\\49.80469\\-72.1875\\3\\53.71094\\-71.99356\\3\\55.66406\\-72.26849\\3\\57.61719\\-72.65535\\3\\63.47656\\-72.68324\\3\\69.33594\\-72.79937\\3\\71.28906\\-73.0456\\3\\73.24219\\-74.08977\\3\\75.19531\\-74.30464\\3\\79.10156\\-74.55288\\3\\81.05469\\-74.85967\\3\\83.00781\\-75.48544\\3\\84.96094\\-75.92258\\3\\88.86719\\-76.45659\\3\\90.82031\\-76.90363\\3\\92.77344\\-77.56303\\3\\96.67969\\-78.6904\\3\\98.63281\\-79.36382\\3\\102.5391\\-80.53253\\3\\104.4922\\-81.38886\\3\\108.3984\\-82.54738\\3\\110.3516\\-83.59664\\3\\112.3047\\-84.37801\\3\\114.2578\\-85.53377\\3\\116.2109\\-86.35566\\3\\118.1641\\-87.57186\\3\\120.1172\\-88.48579\\3\\122.0703\\-89.97903\\3\\127.2252\\-94.78906\\3\\128.9828\\-96.74219\\3\\130.5538\\-98.69531\\3\\133.1275\\-102.6016\\3\\134.502\\-104.5547\\3\\136.6082\\-108.4609\\3\\137.5046\\-110.4141\\3\\139.7714\\-114.3203\\3\\140.7123\\-116.2734\\3\\141.8013\\-118.2266\\3\\143.2683\\-122.1328\\3\\144.2457\\-124.0859\\3\\144.8831\\-126.0391\\3\\146.0109\\-127.9922\\3\\146.657\\-129.9453\\3\\147.5745\\-131.8984\\3\\148.3073\\-133.8516\\3\\148.7949\\-135.8047\\3\\149.6169\\-137.7578\\3\\150.2104\\-139.7109\\3\\150.6261\\-141.6641\\3\\152.0237\\-145.5703\\3\\153.0081\\-149.4766\\3\\153.6818\\-151.4297\\3\\154.0786\\-153.3828\\3\\154.6701\\-157.2891\\3\\155.5391\\-161.1953\\3\\155.8581\\-163.1484\\3\\156.068\\-165.1016\\3\\156.5815\\-172.9141\\3\\157.2641\\-180.7266\\3\\157.3882\\-182.6797\\3\\157.5195\\-188.5391\\3\\157.5731\\-194.3984\\3\\157.6705\\-196.3516\\3\\157.7402\\-200.2578\\3\\157.5627\\-204.1641\\3\\157.685\\-206.1172\\3\\159.0332\\-208.0703\\3\\157.2266\\-210.006\\3\\156.7096\\-211.9766\\3\\155.9639\\-219.7891\\3\\155.5285\\-221.7422\\3\\154.8842\\-223.6953\\3\\154.025\\-227.6016\\3\\153.3874\\-229.5547\\3\\152.5558\\-231.5078\\3\\151.8642\\-233.4609\\3\\150.7954\\-235.4141\\3\\150.0964\\-237.3672\\3\\148.9886\\-239.3203\\3\\148.1355\\-241.2734\\3\\145.5634\\-245.1797\\3\\143.5547\\-248.1508\\3\\141.6016\\-250.6538\\3\\139.6484\\-252.9494\\3\\137.6953\\-255.1039\\3\\134.037\\-258.8516\\3\\131.8359\\-260.9714\\3\\129.7815\\-262.7578\\3\\124.0234\\-267.6279\\3\\122.0703\\-269.2018\\3\\118.1641\\-271.8417\\3\\116.2109\\-273.4254\\3\\114.2578\\-274.8021\\3\\112.3047\\-275.7677\\3\\110.3516\\-277.0488\\3\\108.3984\\-277.988\\3\\106.4453\\-279.2352\\3\\104.4551\\-280.3359\\3\\102.5391\\-281.2761\\3\\100.5859\\-282.058\\3\\98.63281\\-283.0122\\3\\96.67969\\-283.5685\\3\\94.72656\\-284.5699\\3\\90.82031\\-285.8167\\3\\88.86719\\-286.6381\\3\\84.96094\\-287.5327\\3\\81.05469\\-288.6201\\3\\79.10156\\-288.9162\\3\\73.24219\\-289.4689\\3\\67.38281\\-290.0616\\3\\65.42969\\-290.3039\\3\\61.52344\\-290.6572\\3\\53.71094\\-291.1258\\3\\49.80469\\-291.4958\\3\\47.85156\\-291.8931\\3\\45.89844\\-292.4115\\3\\40.03906\\-293.3776\\3\\36.13281\\-294.4227\\3\\28.32031\\-295.5367\\3\\26.36719\\-296.0763\\3\\24.41406\\-296.511\\3\\22.46094\\-296.773\\3\\18.55469\\-297.1803\\3\\16.60156\\-297.4541\\3\\14.64844\\-297.8438\\3\\12.69531\\-298.3579\\3\\10.74219\\-298.553\\3\\4.882813\\-298.9607\\3\\2.929688\\-299.0368\\3\\0.9765625\\-299.7176\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "298" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "128" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-298.1846\\5\\-22.46094\\-297.4381\\5\\-26.36719\\-297.0043\\5\\-30.27344\\-296.6405\\5\\-32.22656\\-296.3556\\5\\-36.13281\\-295.5853\\5\\-38.08594\\-295.3203\\5\\-45.89844\\-294.6648\\5\\-49.80469\\-294.1975\\5\\-53.71094\\-293.5225\\5\\-57.61719\\-293.0265\\5\\-58.87988\\-292.0547\\5\\-59.57031\\-291.0954\\5\\-60.4968\\-292.0547\\5\\-61.52344\\-292.6902\\5\\-63.47656\\-292.7515\\5\\-67.38281\\-292.5684\\5\\-71.28906\\-292.2291\\5\\-73.24219\\-291.9299\\5\\-83.00781\\-290.7686\\5\\-84.96094\\-290.3758\\5\\-86.91406\\-289.7123\\5\\-90.82031\\-288.9846\\5\\-92.77344\\-288.4572\\5\\-94.72656\\-287.6059\\5\\-96.67969\\-287.0025\\5\\-98.4933\\-286.1953\\5\\-102.5069\\-284.2422\\5\\-108.3984\\-281.2942\\5\\-110.3516\\-280.0663\\5\\-112.3047\\-278.9382\\5\\-114.2578\\-277.5432\\5\\-118.1641\\-275.2041\\5\\-121.75\\-272.5234\\5\\-122.0703\\-272.2201\\5\\-125.9766\\-269.3195\\5\\-127.9297\\-267.6472\\5\\-134.8599\\-260.8047\\5\\-136.5746\\-258.8516\\5\\-139.8409\\-254.9453\\5\\-141.1393\\-252.9922\\5\\-142.5529\\-251.0391\\5\\-143.7934\\-249.0859\\5\\-144.8629\\-247.1328\\5\\-146.2301\\-245.1797\\5\\-148.3839\\-241.2734\\5\\-149.1153\\-239.3203\\5\\-150.1081\\-237.3672\\5\\-150.674\\-235.4141\\5\\-151.6621\\-233.4609\\5\\-152.9815\\-229.5547\\5\\-153.8056\\-227.6016\\5\\-154.7688\\-223.6953\\5\\-155.5678\\-221.7422\\5\\-156.0438\\-219.7891\\5\\-156.6481\\-215.8828\\5\\-157.401\\-213.9297\\5\\-157.8653\\-211.9766\\5\\-158.1596\\-210.0234\\5\\-159.052\\-206.1172\\5\\-159.1873\\-204.1641\\5\\-159.4837\\-202.2109\\5\\-159.8045\\-198.3047\\5\\-160.0231\\-192.4453\\5\\-160.0132\\-188.5391\\5\\-160.0625\\-184.6328\\5\\-160.0472\\-180.7266\\5\\-159.9459\\-176.8203\\5\\-159.7259\\-172.9141\\5\\-159.5365\\-170.9609\\5\\-158.4699\\-165.1016\\5\\-157.9627\\-161.1953\\5\\-157.5936\\-159.2422\\5\\-156.9734\\-157.2891\\5\\-156.503\\-155.3359\\5\\-155.9139\\-151.4297\\5\\-155.3587\\-149.4766\\5\\-154.6583\\-147.5234\\5\\-154.184\\-145.5703\\5\\-153.606\\-143.6172\\5\\-152.7261\\-141.6641\\5\\-152.0719\\-139.7109\\5\\-151.1378\\-137.7578\\5\\-150.4187\\-135.8047\\5\\-149.8227\\-133.8516\\5\\-148.8857\\-131.8984\\5\\-148.2648\\-129.9453\\5\\-146.5018\\-126.0391\\5\\-145.6718\\-124.0859\\5\\-144.6195\\-122.1328\\5\\-142.6971\\-118.2266\\5\\-141.932\\-116.2734\\5\\-141.6016\\-115.8426\\5\\-137.6953\\-109.2333\\5\\-137.1094\\-108.4609\\5\\-136.2089\\-106.5078\\5\\-133.7891\\-102.882\\5\\-132.0216\\-100.6484\\5\\-130.3861\\-98.69531\\5\\-127.9297\\-96.0365\\5\\-125.9766\\-94.32728\\5\\-124.0234\\-93.01122\\5\\-122.0703\\-91.58884\\5\\-120.1172\\-89.94505\\5\\-118.1641\\-88.60162\\5\\-116.2109\\-87.61564\\5\\-112.3047\\-85.30613\\5\\-108.3984\\-83.74213\\5\\-106.4453\\-82.77042\\5\\-104.4922\\-82.09375\\5\\-102.5391\\-81.63006\\5\\-100.5859\\-80.83924\\5\\-96.67969\\-79.8569\\5\\-94.72656\\-79.06932\\5\\-92.77344\\-78.52283\\5\\-90.82031\\-77.83109\\5\\-88.86719\\-77.42712\\5\\-84.96094\\-76.29627\\5\\-81.05469\\-75.85026\\5\\-79.10156\\-75.46381\\5\\-77.14844\\-74.71613\\5\\-73.24219\\-74.33038\\5\\-71.28906\\-73.9919\\5\\-69.33594\\-73.16925\\5\\-67.38281\\-73.03416\\5\\-65.42969\\-72.79101\\5\\-61.52344\\-72.74275\\5\\-53.71094\\-72.79937\\5\\-51.75781\\-72.77455\\5\\-45.89844\\-72.84272\\5\\-43.94531\\-73.97651\\5\\-41.99219\\-74.28125\\5\\-38.08594\\-74.43246\\5\\-36.13281\\-74.63199\\5\\-34.17969\\-75.02181\\5\\-32.22656\\-75.73967\\5\\-28.32031\\-76.22842\\5\\-26.36719\\-76.61623\\5\\-24.41406\\-77.29357\\5\\-20.50781\\-78.47928\\5\\-18.55469\\-79.35186\\5\\-14.64844\\-80.6947\\5\\-12.69531\\-81.73006\\5\\-10.74219\\-82.49545\\5\\-6.835938\\-85.21061\\5\\-4.882813\\-86.40012\\5\\-2.929688\\-87.73402\\5\\-0.9765625\\-88.64292\\5\\0.9765625\\-89.32705\\5\\4.882813\\-87.67609\\5\\8.268838\\-85.02344\\5\\11.08502\\-83.07031\\5\\14.64844\\-80.91119\\5\\16.60156\\-80.15727\\5\\18.55469\\-79.06932\\5\\24.41406\\-76.43599\\5\\28.32031\\-75.65793\\5\\30.27344\\-74.76597\\5\\32.22656\\-74.48286\\5\\36.13281\\-74.12548\\5\\38.08594\\-72.79101\\5\\43.94531\\-72.68324\\5\\45.89844\\-72.515\\5\\47.85156\\-72.62373\\5\\49.80469\\-72.60942\\5\\53.71094\\-72.4502\\5\\55.66406\\-72.64184\\5\\65.42969\\-72.73502\\5\\69.33594\\-72.85171\\5\\71.28906\\-73.74136\\5\\73.24219\\-74.25218\\5\\75.19531\\-74.34675\\5\\79.10156\\-74.65424\\5\\81.05469\\-74.97765\\5\\83.00781\\-75.73967\\5\\88.86719\\-76.58186\\5\\90.82031\\-77.06233\\5\\92.77344\\-77.718\\5\\96.67969\\-78.79707\\5\\98.63281\\-79.53114\\5\\102.5391\\-80.65248\\5\\104.4922\\-81.52582\\5\\108.3984\\-82.68101\\5\\110.3516\\-83.73534\\5\\112.3047\\-84.5022\\5\\114.2578\\-85.6844\\5\\116.2109\\-86.51062\\5\\118.1641\\-87.7203\\5\\120.1172\\-88.75691\\5\\122.0703\\-90.18439\\5\\127.0085\\-94.78906\\5\\128.7898\\-96.74219\\5\\130.2807\\-98.69531\\5\\131.4438\\-100.6484\\5\\131.8359\\-101.1065\\5\\134.2353\\-104.5547\\5\\135.22\\-106.5078\\5\\136.4128\\-108.4609\\5\\137.1644\\-110.4141\\5\\138.3856\\-112.3672\\5\\139.3229\\-114.3203\\5\\140.4969\\-116.2734\\5\\142.3791\\-120.1797\\5\\142.9845\\-122.1328\\5\\144.0009\\-124.0859\\5\\144.6478\\-126.0391\\5\\145.6432\\-127.9922\\5\\147.1652\\-131.8984\\5\\148.0976\\-133.8516\\5\\148.6123\\-135.8047\\5\\149.2248\\-137.7578\\5\\150.0126\\-139.7109\\5\\150.9149\\-143.6172\\5\\151.7466\\-145.5703\\5\\152.6824\\-149.4766\\5\\153.8408\\-153.3828\\5\\154.4405\\-157.2891\\5\\155.159\\-161.1953\\5\\155.58\\-163.1484\\5\\155.8581\\-165.1016\\5\\156.1853\\-169.0078\\5\\156.5735\\-176.8203\\5\\156.8896\\-182.6797\\5\\157.0979\\-190.4922\\5\\157.1274\\-194.3984\\5\\157.2932\\-196.3516\\5\\157.4383\\-200.2578\\5\\156.9734\\-206.1172\\5\\156.9058\\-208.0703\\5\\156.6394\\-210.0234\\5\\155.9966\\-217.8359\\5\\155.7247\\-219.7891\\5\\154.6043\\-223.6953\\5\\153.7845\\-227.6016\\5\\152.9442\\-229.5547\\5\\152.2854\\-231.5078\\5\\151.4486\\-233.4609\\5\\150.4959\\-235.4141\\5\\149.7634\\-237.3672\\5\\148.6769\\-239.3203\\5\\147.7794\\-241.2734\\5\\146.4722\\-243.2266\\5\\145.0361\\-245.1797\\5\\143.9141\\-247.1328\\5\\142.4544\\-249.0859\\5\\140.8578\\-251.0391\\5\\139.0169\\-252.9922\\5\\137.6953\\-254.5171\\5\\135.4274\\-256.8984\\5\\131.8359\\-260.3634\\5\\129.2234\\-262.7578\\5\\127.9297\\-263.7806\\5\\124.0234\\-267.2211\\5\\122.0703\\-268.7544\\5\\120.1172\\-269.9128\\5\\116.2109\\-272.9778\\5\\112.3047\\-275.4405\\5\\110.3516\\-276.5758\\5\\108.3984\\-277.5483\\5\\106.4453\\-278.7923\\5\\104.4922\\-279.7423\\5\\102.5391\\-280.9257\\5\\100.5859\\-281.6023\\5\\98.63281\\-282.6024\\5\\94.72656\\-283.912\\5\\92.77344\\-284.8304\\5\\90.82031\\-285.3669\\5\\86.91406\\-286.7789\\5\\83.00781\\-287.5751\\5\\79.10156\\-288.5892\\5\\77.14844\\-288.8762\\5\\73.24219\\-289.2069\\5\\67.38281\\-289.5846\\5\\63.47656\\-289.9862\\5\\61.52344\\-290.3039\\5\\57.61719\\-290.7186\\5\\53.71094\\-291.0171\\5\\49.80469\\-291.445\\5\\47.85156\\-291.8677\\5\\45.89844\\-292.4217\\5\\41.99219\\-293.0808\\5\\40.03906\\-293.4778\\5\\36.13281\\-294.5421\\5\\30.27344\\-295.3498\\5\\28.32031\\-295.7597\\5\\26.36719\\-296.3204\\5\\24.41406\\-296.6737\\5\\18.55469\\-297.3449\\5\\14.64844\\-298.1846\\5\\12.69531\\-298.5388\\5\\10.74219\\-298.7174\\5\\4.882813\\-299.1188\\5\\2.929688\\-299.1996\\5\\-0.9765625\\-299.5932\\5\\-2.929688\\-299.273\\5\\-6.835938\\-299.1814\\5\\-10.74219\\-298.9198\\5\\-16.60156\\-298.4194\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "294" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "129" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-297.6089\\7\\-26.36719\\-297.0837\\7\\-30.27344\\-296.7368\\7\\-32.22656\\-296.4897\\7\\-34.17969\\-296.1324\\7\\-36.13281\\-295.6708\\7\\-38.08594\\-295.375\\7\\-45.89844\\-294.6844\\7\\-49.80469\\-294.1575\\7\\-51.75781\\-293.7354\\7\\-53.71094\\-293.4264\\7\\-57.61719\\-292.9735\\7\\-59.22515\\-292.0547\\7\\-59.57031\\-291.6147\\7\\-60.1423\\-292.0547\\7\\-61.52344\\-292.6009\\7\\-63.47656\\-292.56\\7\\-67.38281\\-292.2541\\7\\-71.28906\\-291.7204\\7\\-79.10156\\-290.9745\\7\\-81.05469\\-290.7579\\7\\-83.00781\\-290.3758\\7\\-84.96094\\-289.7622\\7\\-86.91406\\-289.3691\\7\\-88.86719\\-289.0952\\7\\-90.82031\\-288.6961\\7\\-92.77344\\-287.9355\\7\\-96.67969\\-286.6523\\7\\-98.63281\\-285.5975\\7\\-100.5859\\-284.8581\\7\\-102.5391\\-283.6982\\7\\-104.4922\\-282.9593\\7\\-106.4453\\-281.8109\\7\\-108.3984\\-280.9849\\7\\-110.3516\\-279.6331\\7\\-115.5384\\-276.4297\\7\\-116.2109\\-275.9168\\7\\-118.1641\\-274.8336\\7\\-120.1172\\-273.4168\\7\\-124.0234\\-270.237\\7\\-125.9766\\-268.9102\\7\\-127.9297\\-267.3039\\7\\-133.7891\\-261.6208\\7\\-136.3012\\-258.8516\\7\\-137.6953\\-257.0017\\7\\-139.6484\\-254.6067\\7\\-142.3276\\-251.0391\\7\\-143.4026\\-249.0859\\7\\-144.599\\-247.1328\\7\\-145.944\\-245.1797\\7\\-146.976\\-243.2266\\7\\-148.1827\\-241.2734\\7\\-148.8532\\-239.3203\\7\\-149.889\\-237.3672\\7\\-150.4706\\-235.4141\\7\\-152.1196\\-231.5078\\7\\-152.6978\\-229.5547\\7\\-153.5457\\-227.6016\\7\\-154.1093\\-225.6484\\7\\-154.5561\\-223.6953\\7\\-155.2734\\-221.7214\\7\\-155.8709\\-219.7891\\7\\-156.4651\\-215.8828\\7\\-157.6796\\-211.9766\\7\\-158.0068\\-210.0234\\7\\-158.4499\\-206.1172\\7\\-159.3413\\-200.2578\\7\\-159.7016\\-196.3516\\7\\-159.853\\-192.4453\\7\\-159.815\\-188.5391\\7\\-159.8699\\-184.6328\\7\\-159.8007\\-178.7734\\7\\-159.6144\\-174.8672\\7\\-159.4272\\-172.9141\\7\\-158.7463\\-169.0078\\7\\-158.0108\\-163.1484\\7\\-157.7148\\-161.1953\\7\\-156.6308\\-157.2891\\7\\-156.0608\\-153.3828\\7\\-155.6571\\-151.4297\\7\\-154.9573\\-149.4766\\7\\-153.9343\\-145.5703\\7\\-153.1264\\-143.6172\\7\\-151.7937\\-139.7109\\7\\-150.7813\\-137.7578\\7\\-150.2337\\-135.8047\\7\\-148.649\\-131.8984\\7\\-148.0358\\-129.9453\\7\\-147.0025\\-127.9922\\7\\-146.2271\\-126.0391\\7\\-145.2421\\-124.0859\\7\\-144.3859\\-122.1328\\7\\-143.2594\\-120.1797\\7\\-142.5159\\-118.2266\\7\\-140.4584\\-114.3203\\7\\-139.1537\\-112.3672\\7\\-138.1778\\-110.4141\\7\\-136.8752\\-108.4609\\7\\-135.9233\\-106.5078\\7\\-134.7852\\-104.5547\\7\\-133.7891\\-103.2086\\7\\-131.5487\\-100.6484\\7\\-130.007\\-98.69531\\7\\-127.9297\\-96.33529\\7\\-125.9766\\-94.71264\\7\\-124.0234\\-93.34258\\7\\-123.4524\\-92.83594\\7\\-120.1172\\-90.22539\\7\\-118.1292\\-88.92969\\7\\-116.2109\\-87.81071\\7\\-114.2578\\-86.56855\\7\\-106.4453\\-83.09514\\7\\-104.4922\\-82.19691\\7\\-102.5391\\-81.84799\\7\\-100.5859\\-80.93458\\7\\-96.67969\\-79.86359\\7\\-94.72656\\-79.15643\\7\\-90.82031\\-78.04508\\7\\-86.91406\\-77.04456\\7\\-84.96094\\-76.4283\\7\\-83.00781\\-76.1309\\7\\-81.05469\\-75.94901\\7\\-79.10156\\-75.66936\\7\\-77.14844\\-74.97059\\7\\-75.19531\\-74.62341\\7\\-73.24219\\-74.39466\\7\\-71.28906\\-74.29933\\7\\-67.38281\\-73.80084\\7\\-65.42969\\-72.80784\\7\\-59.57031\\-72.78273\\7\\-55.66406\\-72.82507\\7\\-51.75781\\-72.79101\\7\\-45.89844\\-72.84272\\7\\-43.94531\\-73.97212\\7\\-41.99219\\-74.26381\\7\\-38.08594\\-74.45247\\7\\-36.13281\\-74.64658\\7\\-34.17969\\-75.01781\\7\\-32.22656\\-75.7558\\7\\-28.32031\\-76.20981\\7\\-26.36719\\-76.63151\\7\\-24.41406\\-77.32108\\7\\-20.50781\\-78.47576\\7\\-18.55469\\-79.33684\\7\\-14.64844\\-80.63901\\7\\-12.69531\\-81.67424\\7\\-10.74219\\-82.45744\\7\\-8.789063\\-83.84263\\7\\-6.835938\\-85.08237\\7\\-2.929688\\-87.40654\\7\\0.9765625\\-89.15394\\7\\4.882813\\-87.59297\\7\\8.129223\\-85.02344\\7\\11.00756\\-83.07031\\7\\14.64844\\-80.91119\\7\\16.60156\\-80.16869\\7\\18.55469\\-79.09748\\7\\22.46094\\-77.37731\\7\\24.41406\\-76.466\\7\\28.32031\\-75.68211\\7\\30.27344\\-74.82132\\7\\32.22656\\-74.53181\\7\\36.13281\\-74.14944\\7\\38.08594\\-72.81641\\7\\45.89844\\-72.68324\\7\\55.66406\\-72.66914\\7\\65.42969\\-72.76647\\7\\67.38281\\-72.81641\\7\\69.33594\\-72.97916\\7\\71.28906\\-74.08723\\7\\73.24219\\-74.2989\\7\\75.19531\\-74.39722\\7\\79.10156\\-74.77315\\7\\83.00781\\-75.82027\\7\\88.86719\\-76.6628\\7\\92.77344\\-77.84001\\7\\96.67969\\-78.91658\\7\\98.63281\\-79.67214\\7\\102.5391\\-80.80614\\7\\104.4922\\-81.6553\\7\\106.4453\\-82.18095\\7\\108.3984\\-82.85094\\7\\110.3516\\-83.86413\\7\\112.3047\\-84.67607\\7\\114.2578\\-85.82399\\7\\116.2109\\-86.70058\\7\\119.8832\\-88.92969\\7\\122.0703\\-90.41747\\7\\126.7705\\-94.78906\\7\\128.5468\\-96.74219\\7\\129.9076\\-98.69531\\7\\131.1384\\-100.6484\\7\\132.6184\\-102.6016\\7\\133.8867\\-104.5547\\7\\134.9597\\-106.5078\\7\\136.1848\\-108.4609\\7\\136.9177\\-110.4141\\7\\138.1202\\-112.3672\\7\\138.9875\\-114.3203\\7\\140.2754\\-116.2734\\7\\141.0853\\-118.2266\\7\\142.1624\\-120.1797\\7\\142.7624\\-122.1328\\7\\143.6691\\-124.0859\\7\\145.1939\\-127.9922\\7\\146.1855\\-129.9453\\7\\146.8558\\-131.8984\\7\\147.8529\\-133.8516\\7\\148.9224\\-137.7578\\7\\149.7491\\-139.7109\\7\\150.2714\\-141.6641\\7\\150.6522\\-143.6172\\7\\152.0272\\-147.5234\\7\\152.9036\\-151.4297\\7\\153.5335\\-153.3828\\7\\153.9509\\-155.3359\\7\\154.8212\\-161.1953\\7\\155.5777\\-165.1016\\7\\155.9966\\-169.0078\\7\\156.33\\-174.8672\\7\\156.6345\\-184.6328\\7\\156.7351\\-190.4922\\7\\156.7576\\-194.3984\\7\\156.8671\\-196.3516\\7\\156.9752\\-200.2578\\7\\156.6139\\-206.1172\\7\\156.3078\\-211.9766\\7\\156.0043\\-215.8828\\7\\155.7717\\-217.8359\\7\\155.4021\\-219.7891\\7\\154.8491\\-221.7422\\7\\154.0067\\-225.6484\\7\\153.4424\\-227.6016\\7\\152.6293\\-229.5547\\7\\152.0126\\-231.5078\\7\\150.9487\\-233.4609\\7\\150.262\\-235.4141\\7\\148.3948\\-239.3203\\7\\146.1315\\-243.2266\\7\\144.6563\\-245.1797\\7\\142.1465\\-249.0859\\7\\140.4644\\-251.0391\\7\\138.5719\\-252.9922\\7\\137.6953\\-254.0315\\7\\134.9308\\-256.8984\\7\\133.7891\\-257.9476\\7\\129.8828\\-261.7464\\7\\123.9953\\-266.6641\\7\\121.5059\\-268.6172\\7\\120.1172\\-269.5573\\7\\118.1641\\-271.0185\\7\\113.0914\\-274.4766\\7\\112.3047\\-275.0545\\7\\110.3516\\-275.9997\\7\\108.3984\\-277.205\\7\\106.0929\\-278.3828\\7\\102.5391\\-280.4205\\7\\100.5859\\-281.2827\\7\\98.63281\\-282.0281\\7\\96.67969\\-282.9589\\7\\94.72656\\-283.4715\\7\\90.82031\\-284.9963\\7\\88.86719\\-285.5083\\7\\86.91406\\-286.2479\\7\\84.96094\\-286.8445\\7\\81.05469\\-287.5913\\7\\77.14844\\-288.4927\\7\\73.24219\\-288.9743\\7\\63.47656\\-289.566\\7\\61.52344\\-289.8236\\7\\57.61719\\-290.4733\\7\\55.66406\\-290.7332\\7\\51.75781\\-291.1397\\7\\49.80469\\-291.3984\\7\\47.85156\\-291.8293\\7\\45.89844\\-292.4217\\7\\41.99219\\-293.1314\\7\\40.03906\\-293.5662\\7\\38.08594\\-294.173\\7\\36.13281\\-294.6369\\7\\30.27344\\-295.4596\\7\\26.36719\\-296.4987\\7\\24.41406\\-296.7957\\7\\20.50781\\-297.2462\\7\\18.55469\\-297.5487\\7\\16.60156\\-298.0361\\7\\14.64844\\-298.4109\\7\\10.74219\\-298.862\\7\\4.882813\\-299.2597\\7\\0.9765625\\-299.438\\7\\-0.9765625\\-299.4778\\7\\-4.882813\\-299.4496\\7\\-6.835938\\-299.3669\\7\\-18.55469\\-298.3488\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "291" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "130" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-298.1846\\9\\-24.41406\\-297.4411\\9\\-26.36719\\-297.1682\\9\\-32.22656\\-296.5824\\9\\-34.17969\\-296.249\\9\\-36.13281\\-295.7895\\9\\-38.08594\\-295.4405\\9\\-45.89844\\-294.692\\9\\-49.80469\\-294.1033\\9\\-51.75781\\-293.659\\9\\-53.71094\\-293.3371\\9\\-57.61719\\-292.9062\\9\\-59.57031\\-292.5714\\9\\-61.52344\\-292.5255\\9\\-63.47656\\-292.3365\\9\\-67.38281\\-291.7956\\9\\-71.28906\\-291.3836\\9\\-75.19531\\-291.0831\\9\\-79.10156\\-290.6919\\9\\-81.05469\\-290.3642\\9\\-83.00781\\-289.795\\9\\-84.96094\\-289.4083\\9\\-88.86719\\-288.8308\\9\\-90.82031\\-288.2638\\9\\-92.77344\\-287.4994\\9\\-94.72656\\-286.9487\\9\\-100.5859\\-284.4038\\9\\-102.5391\\-283.3722\\9\\-104.4922\\-282.5901\\9\\-106.4453\\-281.4968\\9\\-108.3984\\-280.5729\\9\\-112.3047\\-277.9244\\9\\-114.2578\\-276.9147\\9\\-116.2109\\-275.5825\\9\\-120.1172\\-273.0447\\9\\-123.228\\-270.5703\\9\\-124.0234\\-269.8708\\9\\-127.9297\\-266.8382\\9\\-131.8359\\-263.1406\\9\\-134.2381\\-260.8047\\9\\-135.8643\\-258.8516\\9\\-137.3367\\-256.8984\\9\\-140.5853\\-252.9922\\9\\-142.041\\-251.0391\\9\\-143.0806\\-249.0859\\9\\-143.5547\\-248.4744\\9\\-146.6881\\-243.2266\\9\\-147.9394\\-241.2734\\9\\-148.6415\\-239.3203\\9\\-149.5895\\-237.3672\\9\\-150.905\\-233.4609\\9\\-151.8821\\-231.5078\\9\\-152.4764\\-229.5547\\9\\-153.92\\-225.6484\\9\\-154.3707\\-223.6953\\9\\-154.9432\\-221.7422\\9\\-155.6431\\-219.7891\\9\\-156.0559\\-217.8359\\9\\-156.3247\\-215.8828\\9\\-156.719\\-213.9297\\9\\-157.3882\\-211.9766\\9\\-157.8147\\-210.0234\\9\\-158.6423\\-202.2109\\9\\-159.4272\\-196.3516\\9\\-159.6505\\-192.4453\\9\\-159.5956\\-188.5391\\9\\-159.6505\\-184.6328\\9\\-159.5365\\-178.7734\\9\\-159.2173\\-174.8672\\9\\-158.6944\\-170.9609\\9\\-158.0322\\-165.1016\\9\\-157.7679\\-163.1484\\9\\-157.3486\\-161.1953\\9\\-156.7612\\-159.2422\\9\\-156.4234\\-157.2891\\9\\-156.1908\\-155.3359\\9\\-155.8398\\-153.3828\\9\\-155.2975\\-151.4297\\9\\-154.6492\\-149.4766\\9\\-154.1964\\-147.5234\\9\\-153.6436\\-145.5703\\9\\-152.7462\\-143.6172\\9\\-152.1827\\-141.6641\\9\\-150.5228\\-137.7578\\9\\-150.0338\\-135.8047\\9\\-149.1255\\-133.8516\\9\\-147.7409\\-129.9453\\9\\-146.7066\\-127.9922\\9\\-145.9383\\-126.0391\\9\\-144.8927\\-124.0859\\9\\-144.1048\\-122.1328\\9\\-142.9879\\-120.1797\\9\\-142.3276\\-118.2266\\9\\-141.1393\\-116.2734\\9\\-140.2109\\-114.3203\\9\\-138.8941\\-112.3672\\9\\-137.8823\\-110.4141\\9\\-136.6882\\-108.4609\\9\\-134.6444\\-104.5547\\9\\-133.0809\\-102.6016\\9\\-131.2275\\-100.6484\\9\\-127.9208\\-96.74219\\9\\-123.1921\\-92.83594\\9\\-120.1172\\-90.5166\\9\\-114.2578\\-86.76202\\9\\-112.3047\\-86.04168\\9\\-110.337\\-85.02344\\9\\-108.3984\\-84.12769\\9\\-106.4453\\-83.37364\\9\\-104.4922\\-82.43555\\9\\-102.5391\\-81.97327\\9\\-100.5859\\-81.34375\\9\\-98.63281\\-80.56009\\9\\-94.11621\\-79.16406\\9\\-86.91406\\-77.23495\\9\\-84.96094\\-76.63449\\9\\-83.00781\\-76.20139\\9\\-79.10156\\-75.82422\\9\\-77.14844\\-75.39169\\9\\-75.19531\\-74.73254\\9\\-73.24219\\-74.4858\\9\\-67.38281\\-74.17618\\9\\-65.42969\\-73.11768\\9\\-63.47656\\-72.81641\\9\\-59.57031\\-72.79937\\9\\-57.61719\\-72.85171\\9\\-51.75781\\-72.79937\\9\\-45.89844\\-72.87931\\9\\-43.94531\\-73.98131\\9\\-41.99219\\-74.25218\\9\\-38.08594\\-74.48042\\9\\-36.13281\\-74.69054\\9\\-34.17969\\-75.06419\\9\\-32.22656\\-75.7946\\9\\-28.32031\\-76.24055\\9\\-26.36719\\-76.67647\\9\\-24.41406\\-77.39045\\9\\-20.50781\\-78.49526\\9\\-18.55469\\-79.31017\\9\\-14.64844\\-80.5863\\9\\-12.69531\\-81.61244\\9\\-10.74219\\-82.41263\\9\\-8.789063\\-83.79631\\9\\-6.835938\\-84.90137\\9\\-4.882813\\-86.14379\\9\\-2.997504\\-86.97656\\9\\-0.9765625\\-88.0566\\9\\0.9765625\\-88.7328\\9\\2.929688\\-88.26293\\9\\4.882813\\-87.53561\\9\\8.06536\\-85.02344\\9\\10.96755\\-83.07031\\9\\14.64844\\-80.91119\\9\\16.60156\\-80.17991\\9\\20.50781\\-78.23428\\9\\22.46094\\-77.44278\\9\\24.41406\\-76.50705\\9\\28.32031\\-75.70291\\9\\30.27344\\-74.85967\\9\\32.22656\\-74.5612\\9\\36.13281\\-74.19839\\9\\38.08594\\-73.16925\\9\\40.03906\\-72.79101\\9\\41.99219\\-72.75057\\9\\51.75781\\-72.6904\\9\\55.66406\\-72.69763\\9\\65.42969\\-72.79101\\9\\67.38281\\-72.88874\\9\\69.33594\\-73.68353\\9\\71.28906\\-74.2636\\9\\75.19531\\-74.47783\\9\\79.10156\\-74.9375\\9\\81.05469\\-75.61976\\9\\86.91406\\-76.44279\\9\\88.86719\\-76.81113\\9\\96.67969\\-79.06932\\9\\98.63281\\-79.80011\\9\\100.5859\\-80.35829\\9\\102.5391\\-81.01481\\9\\104.4922\\-81.78303\\9\\106.4453\\-82.28789\\9\\108.3554\\-83.07031\\9\\112.4657\\-85.02344\\9\\118.1641\\-88.00352\\9\\122.0703\\-90.67609\\9\\125.9766\\-94.26774\\9\\128.2722\\-96.74219\\9\\129.5111\\-98.69531\\9\\132.3425\\-102.6016\\9\\133.4612\\-104.5547\\9\\135.9063\\-108.4609\\9\\136.7364\\-110.4141\\9\\138.7432\\-114.3203\\9\\139.9972\\-116.2734\\9\\140.8237\\-118.2266\\9\\141.896\\-120.1797\\9\\143.283\\-124.0859\\9\\144.2654\\-126.0391\\9\\144.8952\\-127.9922\\9\\145.9263\\-129.9453\\9\\146.5996\\-131.8984\\9\\147.4994\\-133.8516\\9\\148.2244\\-135.8047\\9\\148.7021\\-137.7578\\9\\150.0835\\-141.6641\\9\\150.4568\\-143.6172\\9\\150.9487\\-145.5703\\9\\151.7566\\-147.5234\\9\\152.6027\\-151.4297\\9\\153.6997\\-155.3359\\9\\154.021\\-157.2891\\9\\154.8283\\-163.1484\\9\\155.5266\\-167.0547\\9\\155.9433\\-170.9609\\9\\156.1853\\-174.8672\\9\\156.3071\\-178.7734\\9\\156.497\\-188.5391\\9\\156.5232\\-194.3984\\9\\156.5975\\-196.3516\\9\\156.5695\\-202.2109\\9\\156.3414\\-208.0703\\9\\156.1435\\-211.9766\\9\\155.7912\\-215.8828\\9\\155.4732\\-217.8359\\9\\154.5837\\-221.7422\\9\\153.7564\\-225.6484\\9\\152.9838\\-227.6016\\9\\151.6773\\-231.5078\\9\\150.6245\\-233.4609\\9\\150.0077\\-235.4141\\9\\148.9223\\-237.3672\\9\\148.1014\\-239.3203\\9\\145.6914\\-243.2266\\9\\143.5547\\-246.2921\\9\\142.9014\\-247.1328\\9\\141.66\\-249.0859\\9\\139.9891\\-251.0391\\9\\137.6953\\-253.5406\\9\\134.4763\\-256.8984\\9\\133.7891\\-257.5048\\9\\129.8828\\-261.3152\\9\\127.9297\\-262.9826\\9\\125.9766\\-264.3579\\9\\122.0703\\-267.6938\\9\\120.1172\\-269.235\\9\\118.1641\\-270.3577\\9\\114.2578\\-273.2823\\9\\112.3047\\-274.4848\\9\\110.3516\\-275.5825\\9\\108.3984\\-276.7854\\9\\106.4453\\-277.6266\\9\\104.4922\\-278.8871\\9\\102.5391\\-279.7898\\9\\100.5859\\-280.9144\\9\\98.63281\\-281.5852\\9\\96.67969\\-282.5069\\9\\94.72656\\-283.1668\\9\\92.77344\\-283.6436\\9\\90.82031\\-284.5279\\9\\86.91406\\-285.6058\\9\\84.96094\\-286.3722\\9\\83.00781\\-286.8558\\9\\79.10156\\-287.5118\\9\\75.19531\\-288.3348\\9\\73.24219\\-288.6565\\9\\69.33594\\-288.9915\\9\\63.47656\\-289.3355\\9\\59.57031\\-289.7311\\9\\55.66406\\-290.5509\\9\\49.80469\\-291.344\\9\\47.85156\\-291.7598\\9\\45.89844\\-292.4217\\9\\41.99219\\-293.1729\\9\\40.03906\\-293.6288\\9\\38.08594\\-294.2878\\9\\36.13281\\-294.7121\\9\\32.22656\\-295.2423\\9\\30.27344\\-295.5827\\9\\28.32031\\-296.1996\\9\\26.36719\\-296.6331\\9\\20.50781\\-297.3809\\9\\16.60156\\-298.2709\\9\\12.69531\\-298.8084\\9\\10.74219\\-298.9898\\9\\4.882813\\-299.4066\\9\\0.9765625\\-299.6127\\9\\-2.929688\\-299.6704\\9\\-4.882813\\-299.6462\\9\\-6.835938\\-299.5198\\9\\-12.69531\\-298.9397\\9\\-18.55469\\-298.4682\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "295" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "131" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-297.5325\\11\\-26.36719\\-297.25\\11\\-32.22656\\-296.6479\\11\\-34.17969\\-296.3422\\11\\-38.08594\\-295.4825\\11\\-40.03906\\-295.2468\\11\\-45.89844\\-294.6844\\11\\-47.85156\\-294.4126\\11\\-51.75781\\-293.5771\\11\\-55.66406\\-293.0122\\11\\-59.57031\\-292.6009\\11\\-65.42969\\-291.6956\\11\\-69.33594\\-291.3055\\11\\-75.19531\\-290.8429\\11\\-77.14844\\-290.6073\\11\\-79.10156\\-290.2655\\11\\-81.05469\\-289.7737\\11\\-83.00781\\-289.4161\\11\\-86.91406\\-288.9114\\11\\-88.86719\\-288.455\\11\\-90.82031\\-287.7166\\11\\-94.72656\\-286.5797\\11\\-96.67969\\-285.5939\\11\\-98.63281\\-284.8914\\11\\-100.5859\\-283.8044\\11\\-102.5391\\-283.1029\\11\\-104.4922\\-282.0831\\11\\-106.4453\\-281.2047\\11\\-108.3984\\-280.022\\11\\-110.3516\\-278.9472\\11\\-112.3047\\-277.5551\\11\\-116.2109\\-275.2925\\11\\-120.1172\\-272.5311\\11\\-122.7572\\-270.5703\\11\\-125.9766\\-267.9683\\11\\-127.5068\\-266.6641\\11\\-133.7891\\-260.7785\\11\\-137.0089\\-256.8984\\11\\-137.6953\\-256.1641\\11\\-140.2858\\-252.9922\\11\\-141.6585\\-251.0391\\11\\-142.806\\-249.0859\\11\\-144.1323\\-247.1328\\11\\-145.1239\\-245.1797\\11\\-146.4442\\-243.2266\\11\\-147.6163\\-241.2734\\11\\-149.2097\\-237.3672\\11\\-150.1116\\-235.4141\\11\\-150.6449\\-233.4609\\11\\-151.568\\-231.5078\\11\\-152.2714\\-229.5547\\11\\-152.8444\\-227.6016\\11\\-153.6944\\-225.6484\\11\\-154.6662\\-221.7422\\11\\-155.3286\\-219.7891\\11\\-155.8709\\-217.8359\\11\\-156.4605\\-213.9297\\11\\-156.8964\\-211.9766\\11\\-157.4623\\-210.0234\\11\\-158.0363\\-206.1172\\11\\-158.5638\\-200.2578\\11\\-159.2024\\-194.3984\\11\\-159.3283\\-192.4453\\11\\-159.2882\\-188.5391\\11\\-159.3018\\-184.6328\\11\\-159.2024\\-180.7266\\11\\-159.0989\\-178.7734\\11\\-158.7779\\-174.8672\\11\\-158.0533\\-167.0547\\11\\-157.8071\\-165.1016\\11\\-157.4504\\-163.1484\\11\\-156.901\\-161.1953\\11\\-156.5222\\-159.2422\\11\\-156.009\\-155.3359\\11\\-155.5678\\-153.3828\\11\\-154.9037\\-151.4297\\11\\-153.9694\\-147.5234\\11\\-152.4599\\-143.6172\\11\\-151.9179\\-141.6641\\11\\-150.9535\\-139.7109\\11\\-149.7608\\-135.8047\\11\\-148.84\\-133.8516\\11\\-148.2458\\-131.8984\\11\\-146.4679\\-127.9922\\11\\-144.589\\-124.0859\\11\\-143.7529\\-122.1328\\11\\-142.762\\-120.1797\\11\\-142.0689\\-118.2266\\11\\-140.8472\\-116.2734\\11\\-139.9065\\-114.3203\\11\\-137.4324\\-110.4141\\11\\-136.5349\\-108.4609\\11\\-134.3559\\-104.5547\\11\\-132.8501\\-102.6016\\11\\-131.0124\\-100.6484\\11\\-127.9297\\-97.1443\\11\\-125.9766\\-95.36392\\11\\-122.9467\\-92.83594\\11\\-120.1172\\-90.78807\\11\\-116.2109\\-88.19382\\11\\-113.9109\\-86.97656\\11\\-109.9459\\-85.02344\\11\\-108.3984\\-84.32492\\11\\-106.4453\\-83.62931\\11\\-104.4922\\-82.76926\\11\\-102.5391\\-82.13814\\11\\-100.5859\\-81.74451\\11\\-98.63281\\-80.7394\\11\\-96.67969\\-80.18501\\11\\-88.86719\\-77.81451\\11\\-86.91406\\-77.3559\\11\\-83.00781\\-76.2553\\11\\-81.05469\\-76.11694\\11\\-77.14844\\-75.70596\\11\\-75.19531\\-74.85938\\11\\-73.24219\\-74.58599\\11\\-71.28906\\-74.43443\\11\\-67.38281\\-74.25184\\11\\-65.42969\\-74.00809\\11\\-63.47656\\-73.1431\\11\\-61.52344\\-72.81641\\11\\-55.66406\\-72.86079\\11\\-51.75781\\-72.81641\\11\\-47.85156\\-72.87\\11\\-45.89844\\-73.1431\\11\\-43.94531\\-74.08977\\11\\-38.08594\\-74.50912\\11\\-36.13281\\-74.72581\\11\\-34.17969\\-75.19678\\11\\-32.22656\\-75.83487\\11\\-28.32031\\-76.31274\\11\\-26.36719\\-76.7597\\11\\-24.41406\\-77.47915\\11\\-20.50781\\-78.49904\\11\\-18.55469\\-79.28032\\11\\-14.64844\\-80.55453\\11\\-12.69531\\-81.58791\\11\\-10.74219\\-82.36903\\11\\-8.789063\\-83.70221\\11\\-6.835938\\-84.7047\\11\\-4.882813\\-86.00626\\11\\-2.929688\\-86.86031\\11\\-0.9765625\\-88.01251\\11\\0.9765625\\-88.35649\\11\\2.929688\\-88.14193\\11\\4.882813\\-87.41639\\11\\8.047921\\-85.02344\\11\\11.01047\\-83.07031\\11\\14.64844\\-80.93893\\11\\16.60156\\-80.17991\\11\\20.50781\\-78.26307\\11\\22.46094\\-77.50459\\11\\24.41406\\-76.58361\\11\\28.32031\\-75.74286\\11\\30.27344\\-74.89641\\11\\32.22656\\-74.57818\\11\\36.13281\\-74.25218\\11\\38.08594\\-73.81906\\11\\40.03906\\-72.80784\\11\\43.94531\\-72.74275\\11\\55.66406\\-72.71235\\11\\61.52344\\-72.75057\\11\\65.42969\\-72.82507\\11\\66.95902\\-73.30469\\11\\69.33594\\-74.22894\\11\\73.24219\\-74.40257\\11\\77.14844\\-74.76235\\11\\81.05469\\-75.76814\\11\\86.91406\\-76.53766\\11\\88.86719\\-76.99924\\11\\92.77344\\-78.03056\\11\\96.40842\\-79.16406\\11\\98.63281\\-79.96362\\11\\100.5859\\-80.46821\\11\\102.5391\\-81.25\\11\\104.4922\\-81.92178\\11\\106.4453\\-82.40529\\11\\108.3984\\-83.3463\\11\\110.3516\\-84.14732\\11\\112.3047\\-85.18119\\11\\114.2578\\-86.09032\\11\\116.2109\\-87.22833\\11\\118.1641\\-88.17014\\11\\121.9076\\-90.88281\\11\\125.9766\\-94.63182\\11\\127.9297\\-96.77148\\11\\130.6912\\-100.6484\\11\\132.0103\\-102.6016\\11\\133.1279\\-104.5547\\11\\134.4758\\-106.5078\\11\\136.5784\\-110.4141\\11\\137.3819\\-112.3672\\11\\137.6953\\-112.7914\\11\\139.6484\\-116.37\\11\\141.6016\\-120.3001\\11\\142.4326\\-122.1328\\11\\142.9883\\-124.0859\\11\\144.0139\\-126.0391\\11\\144.6589\\-127.9922\\11\\145.5744\\-129.9453\\11\\147.1015\\-133.8516\\11\\148.0056\\-135.8047\\11\\149.039\\-139.7109\\11\\149.8336\\-141.6641\\11\\150.6789\\-145.5703\\11\\151.9769\\-149.4766\\11\\152.7497\\-153.3828\\11\\153.3279\\-155.3359\\11\\153.7997\\-157.2891\\11\\154.0939\\-159.2422\\11\\154.5725\\-163.1484\\11\\155.1437\\-167.0547\\11\\155.5121\\-169.0078\\11\\155.8798\\-172.9141\\11\\156.1062\\-176.8203\\11\\156.2326\\-180.7266\\11\\156.3528\\-188.5391\\11\\156.3642\\-194.3984\\11\\156.4213\\-196.3516\\11\\156.3985\\-200.2578\\11\\156.3132\\-204.1641\\11\\156.0872\\-210.0234\\11\\155.7584\\-213.9297\\11\\155.4864\\-215.8828\\11\\155.0605\\-217.8359\\11\\153.9617\\-223.6953\\11\\153.3729\\-225.6484\\11\\152.6451\\-227.6016\\11\\152.0916\\-229.5547\\11\\151.1944\\-231.5078\\11\\149.673\\-235.4141\\11\\148.6214\\-237.3672\\11\\147.7389\\-239.3203\\11\\146.5075\\-241.2734\\11\\145.13\\-243.2266\\11\\143.9986\\-245.1797\\11\\141.0991\\-249.0859\\11\\137.5868\\-252.9922\\11\\135.9743\\-254.9453\\11\\133.9674\\-256.8984\\11\\131.8359\\-258.8256\\11\\129.8183\\-260.8047\\11\\127.4889\\-262.7578\\11\\125.9766\\-263.8896\\11\\122.0703\\-267.2904\\11\\120.1172\\-268.706\\11\\118.1641\\-269.8814\\11\\117.3188\\-270.5703\\11\\114.2578\\-272.7898\\11\\112.3047\\-273.9213\\11\\110.3516\\-275.2253\\11\\108.3984\\-276.1367\\11\\106.4453\\-277.2726\\11\\104.4922\\-278.2511\\11\\100.5859\\-280.3744\\11\\98.63281\\-281.2221\\11\\96.67969\\-281.897\\11\\94.72656\\-282.8139\\11\\90.82031\\-283.8364\\11\\88.86719\\-284.6943\\11\\84.96094\\-285.6915\\11\\83.00781\\-286.3962\\11\\81.05469\\-286.8482\\11\\77.14844\\-287.4115\\11\\71.28906\\-288.4786\\11\\69.33594\\-288.7148\\11\\65.42969\\-289.0411\\11\\59.57031\\-289.4768\\11\\57.61719\\-289.7995\\11\\55.66406\\-290.3406\\11\\53.71094\\-290.7259\\11\\49.80469\\-291.2824\\11\\47.85156\\-291.7059\\11\\45.89844\\-292.4217\\11\\41.99219\\-293.2069\\11\\40.03906\\-293.7089\\11\\38.08594\\-294.3707\\11\\36.13281\\-294.7739\\11\\32.22656\\-295.3036\\11\\30.27344\\-295.7078\\11\\28.32031\\-296.3448\\11\\26.36719\\-296.7126\\11\\22.46094\\-297.1994\\11\\20.50781\\-297.5405\\11\\18.55469\\-298.0627\\11\\16.60156\\-298.4277\\11\\10.74219\\-299.11\\11\\4.882813\\-299.5641\\11\\0.9765625\\-299.7266\\11\\-2.929688\\-299.7974\\11\\-4.882813\\-299.7266\\11\\-10.74219\\-299.2363\\11\\-14.64844\\-298.8525\\11\\-18.55469\\-298.5496\\11\\-20.50781\\-298.301\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "296" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "132" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-297.636\\13\\-28.32031\\-297.0778\\13\\-32.22656\\-296.6947\\13\\-34.17969\\-296.4171\\13\\-38.08594\\-295.5158\\13\\-40.03906\\-295.2712\\13\\-45.89844\\-294.6726\\13\\-47.85156\\-294.3683\\13\\-51.75781\\-293.4991\\13\\-53.71094\\-293.1758\\13\\-59.57031\\-292.4514\\13\\-63.47656\\-291.6853\\13\\-67.38281\\-291.2584\\13\\-73.24219\\-290.7789\\13\\-75.19531\\-290.5443\\13\\-79.10156\\-289.7014\\13\\-81.05469\\-289.4006\\13\\-84.96094\\-288.9285\\13\\-86.91406\\-288.5542\\13\\-88.86719\\-287.8788\\13\\-92.77344\\-286.8482\\13\\-98.63281\\-284.4333\\13\\-100.5859\\-283.4342\\13\\-102.5391\\-282.7942\\13\\-104.4922\\-281.6795\\13\\-106.4453\\-280.8657\\13\\-108.3984\\-279.6035\\13\\-112.3047\\-277.2625\\13\\-114.2578\\-275.9276\\13\\-116.2109\\-274.9613\\13\\-118.1641\\-273.5117\\13\\-120.1172\\-271.9627\\13\\-124.0234\\-269.2101\\13\\-127.0672\\-266.6641\\13\\-129.205\\-264.7109\\13\\-133.7891\\-260.2794\\13\\-137.6953\\-255.8211\\13\\-139.9361\\-252.9922\\13\\-141.6016\\-250.5699\\13\\-143.8427\\-247.1328\\13\\-144.8308\\-245.1797\\13\\-146.1926\\-243.2266\\13\\-148.2338\\-239.3203\\13\\-148.9292\\-237.3672\\13\\-149.8922\\-235.4141\\13\\-150.4517\\-233.4609\\13\\-151.1413\\-231.5078\\13\\-152.0453\\-229.5547\\13\\-152.5797\\-227.6016\\13\\-153.328\\-225.6484\\13\\-153.9771\\-223.6953\\13\\-154.9316\\-219.7891\\13\\-155.58\\-217.8359\\13\\-156.0043\\-215.8828\\13\\-156.5412\\-211.9766\\13\\-156.8872\\-210.0234\\13\\-157.426\\-208.0703\\13\\-157.7838\\-206.1172\\13\\-157.997\\-204.1641\\13\\-158.4642\\-198.3047\\13\\-158.8369\\-192.4453\\13\\-158.896\\-188.5391\\13\\-158.7878\\-180.7266\\13\\-158.495\\-174.8672\\13\\-158.0436\\-169.0078\\13\\-157.8547\\-167.0547\\13\\-157.5195\\-165.1016\\13\\-156.6018\\-161.1953\\13\\-156.125\\-157.2891\\13\\-155.7815\\-155.3359\\13\\-154.6121\\-151.4297\\13\\-153.6969\\-147.5234\\13\\-152.8105\\-145.5703\\13\\-151.5416\\-141.6641\\13\\-150.6662\\-139.7109\\13\\-150.1703\\-137.7578\\13\\-148.6167\\-133.8516\\13\\-148.0181\\-131.8984\\13\\-146.9727\\-129.9453\\13\\-146.2277\\-127.9922\\13\\-145.097\\-126.0391\\13\\-144.3232\\-124.0859\\13\\-143.2938\\-122.1328\\13\\-142.5413\\-120.1797\\13\\-141.6576\\-118.2266\\13\\-139.6484\\-114.5339\\13\\-138.4092\\-112.3672\\13\\-137.1251\\-110.4141\\13\\-136.3322\\-108.4609\\13\\-134.01\\-104.5547\\13\\-132.4894\\-102.6016\\13\\-129.1145\\-98.69531\\13\\-127.2364\\-96.74219\\13\\-125.9766\\-95.57994\\13\\-124.0234\\-93.94503\\13\\-122.0703\\-92.4388\\13\\-120.1172\\-91.14175\\13\\-116.2109\\-88.43056\\13\\-114.2578\\-87.62985\\13\\-112.3047\\-86.39713\\13\\-108.3984\\-84.61543\\13\\-102.5391\\-82.30302\\13\\-100.5859\\-81.86983\\13\\-98.63281\\-80.96634\\13\\-90.82031\\-78.58847\\13\\-88.86719\\-77.93304\\13\\-86.91406\\-77.48261\\13\\-83.00781\\-76.38298\\13\\-79.10156\\-76.03068\\13\\-77.14844\\-75.80392\\13\\-75.19531\\-75.16441\\13\\-73.24219\\-74.68634\\13\\-71.28906\\-74.50409\\13\\-67.38281\\-74.27537\\13\\-65.42969\\-74.22894\\13\\-63.47656\\-73.97178\\13\\-61.52344\\-72.86079\\13\\-55.66406\\-72.90796\\13\\-51.75781\\-72.85171\\13\\-47.85156\\-72.87\\13\\-43.94531\\-74.21731\\13\\-41.99219\\-74.28125\\13\\-38.08594\\-74.53369\\13\\-36.13281\\-74.73649\\13\\-34.17969\\-75.50011\\13\\-32.22656\\-75.87814\\13\\-28.32031\\-76.38508\\13\\-26.36719\\-76.82729\\13\\-24.41406\\-77.54974\\13\\-20.50781\\-78.52319\\13\\-18.55469\\-79.32182\\13\\-14.64844\\-80.53253\\13\\-12.69531\\-81.57385\\13\\-10.74219\\-82.33951\\13\\-8.789063\\-83.61068\\13\\-6.835938\\-84.58567\\13\\-4.882813\\-85.75764\\13\\-2.929688\\-86.73607\\13\\-0.9765625\\-88.08529\\13\\0.9765625\\-88.21886\\13\\2.929688\\-88.01613\\13\\4.882813\\-87.11968\\13\\6.835938\\-85.93533\\13\\8.789063\\-84.54382\\13\\12.69531\\-82.08724\\13\\14.64844\\-80.99809\\13\\16.60156\\-80.20236\\13\\20.50781\\-78.31463\\13\\22.46094\\-77.57632\\13\\24.41406\\-76.69393\\13\\26.36719\\-76.16966\\13\\28.32031\\-75.80244\\13\\30.27344\\-74.94817\\13\\32.22656\\-74.60452\\13\\36.13281\\-74.28125\\13\\38.08594\\-73.98077\\13\\40.03906\\-72.95817\\13\\41.99219\\-72.79937\\13\\43.94531\\-72.76647\\13\\51.75781\\-72.73502\\13\\59.57031\\-72.75848\\13\\63.47656\\-72.82507\\13\\65.42969\\-73.06896\\13\\67.38281\\-74.13055\\13\\73.24219\\-74.46279\\13\\75.19531\\-74.63146\\13\\77.14844\\-74.94004\\13\\79.10156\\-75.57171\\13\\81.05469\\-75.86665\\13\\86.91406\\-76.63246\\13\\90.82031\\-77.68654\\13\\92.77344\\-78.14072\\13\\94.72656\\-78.75767\\13\\98.63281\\-80.09384\\13\\100.5859\\-80.5863\\13\\102.5391\\-81.44271\\13\\106.4453\\-82.53477\\13\\108.3984\\-83.53255\\13\\110.3516\\-84.29388\\13\\112.3047\\-85.39904\\13\\114.2578\\-86.25128\\13\\116.2109\\-87.41138\\13\\118.1641\\-88.32515\\13\\121.5328\\-90.88281\\13\\123.6979\\-92.83594\\13\\125.9766\\-95.08895\\13\\127.5204\\-96.74219\\13\\129.0485\\-98.69531\\13\\130.4321\\-100.6484\\13\\133.7891\\-105.9634\\13\\134.2163\\-106.5078\\13\\135.1681\\-108.4609\\13\\136.3824\\-110.4141\\13\\137.1029\\-112.3672\\13\\138.31\\-114.3203\\13\\139.1855\\-116.2734\\13\\140.3642\\-118.2266\\13\\141.183\\-120.1797\\13\\142.2463\\-122.1328\\13\\142.804\\-124.0859\\13\\143.6834\\-126.0391\\13\\145.1509\\-129.9453\\13\\146.1457\\-131.8984\\13\\146.804\\-133.8516\\13\\147.7291\\-135.8047\\13\\148.331\\-137.7578\\13\\148.7997\\-139.7109\\13\\149.5164\\-141.6641\\13\\150.127\\-143.6172\\13\\150.9251\\-147.5234\\13\\151.6927\\-149.4766\\13\\152.1657\\-151.4297\\13\\152.5004\\-153.3828\\13\\152.9335\\-155.3359\\13\\153.5087\\-157.2891\\13\\153.8857\\-159.2422\\13\\154.1504\\-161.1953\\13\\154.8387\\-167.0547\\13\\155.1882\\-169.0078\\13\\155.6517\\-172.9141\\13\\155.9514\\-176.8203\\13\\156.0942\\-180.7266\\13\\156.2149\\-186.5859\\13\\156.2787\\-196.3516\\13\\156.25\\-200.2578\\13\\156.1553\\-204.1641\\13\\155.992\\-208.0703\\13\\155.6764\\-211.9766\\13\\155.4031\\-213.9297\\13\\154.7001\\-217.8359\\13\\154.1158\\-221.7422\\13\\153.6865\\-223.6953\\13\\152.9284\\-225.6484\\13\\151.791\\-229.5547\\13\\150.8065\\-231.5078\\13\\150.2035\\-233.4609\\13\\148.3638\\-237.3672\\13\\146.1879\\-241.2734\\13\\144.7427\\-243.2266\\13\\143.4652\\-245.1797\\13\\142.2897\\-247.1328\\13\\140.6966\\-249.0859\\13\\137.0331\\-252.9922\\13\\135.7422\\-254.5499\\13\\133.3008\\-256.8984\\13\\131.8359\\-258.2168\\13\\129.1985\\-260.8047\\13\\126.9372\\-262.7578\\13\\124.4996\\-264.7109\\13\\122.0703\\-266.7361\\13\\116.2109\\-270.9073\\13\\114.2578\\-272.0992\\13\\110.3516\\-274.7845\\13\\108.3984\\-275.6908\\13\\106.4453\\-276.8881\\13\\104.4922\\-277.6967\\13\\102.5391\\-278.9348\\13\\100.5859\\-279.7719\\13\\98.63281\\-280.8469\\13\\96.67969\\-281.4867\\13\\92.77344\\-282.9714\\13\\90.82031\\-283.4145\\13\\88.86719\\-284.0128\\13\\86.91406\\-284.8109\\13\\83.00781\\-285.7102\\13\\81.05469\\-286.3318\\13\\79.10156\\-286.7708\\13\\73.24219\\-287.6059\\13\\69.33594\\-288.3062\\13\\67.38281\\-288.5997\\13\\63.47656\\-289.0119\\13\\59.57031\\-289.3238\\13\\57.61719\\-289.5786\\13\\53.71094\\-290.6158\\13\\49.80469\\-291.2352\\13\\47.85156\\-291.6853\\13\\45.89844\\-292.4115\\13\\41.99219\\-293.2424\\13\\38.08594\\-294.4383\\13\\36.13281\\-294.8206\\13\\32.22656\\-295.3673\\13\\30.27344\\-295.8602\\13\\28.32031\\-296.4619\\13\\26.36719\\-296.7897\\13\\22.46094\\-297.2994\\13\\20.50781\\-297.7058\\13\\18.55469\\-298.2502\\13\\16.60156\\-298.5426\\13\\10.74219\\-299.1999\\13\\4.882813\\-299.6877\\13\\2.929688\\-299.798\\13\\-0.9765625\\-299.8436\\13\\-4.882813\\-299.7277\\13\\-10.74219\\-299.2779\\13\\-18.55469\\-298.6066\\13\\-20.50781\\-298.4023\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "288" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "133" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.9765625\\-299.9338\\15\\-4.882813\\-299.7695\\15\\-8.789063\\-299.4881\\15\\-18.55469\\-298.6709\\15\\-22.46094\\-298.1846\\15\\-26.36719\\-297.3896\\15\\-28.32031\\-297.1275\\15\\-32.22656\\-296.739\\15\\-34.17969\\-296.4772\\15\\-38.08594\\-295.5608\\15\\-40.03906\\-295.2996\\15\\-45.89844\\-294.6648\\15\\-47.85156\\-294.3333\\15\\-51.75781\\-293.423\\15\\-53.71094\\-293.1196\\15\\-57.61719\\-292.6244\\15\\-59.57031\\-292.2664\\15\\-61.52344\\-291.7729\\15\\-63.47656\\-291.4643\\15\\-71.28906\\-290.7509\\15\\-73.24219\\-290.4859\\15\\-77.14844\\-289.6595\\15\\-79.10156\\-289.3886\\15\\-83.00781\\-288.9622\\15\\-84.96094\\-288.6234\\15\\-88.86719\\-287.4006\\15\\-90.82031\\-287.0128\\15\\-92.77344\\-286.4343\\15\\-94.72656\\-285.5236\\15\\-96.67969\\-284.8839\\15\\-98.63281\\-283.8285\\15\\-100.5859\\-283.1784\\15\\-102.6503\\-282.2891\\15\\-106.4453\\-280.4199\\15\\-108.3984\\-279.268\\15\\-110.3516\\-277.922\\15\\-112.3047\\-276.9313\\15\\-114.2578\\-275.6024\\15\\-116.2109\\-274.5014\\15\\-118.1641\\-273.1598\\15\\-122.0703\\-270.0749\\15\\-124.0234\\-268.7705\\15\\-125.9766\\-267.2321\\15\\-128.8328\\-264.7109\\15\\-131.8359\\-261.8905\\15\\-134.772\\-258.8516\\15\\-138.0381\\-254.9453\\15\\-142.3533\\-249.0859\\15\\-144.5818\\-245.1797\\15\\-145.8971\\-243.2266\\15\\-146.8689\\-241.2734\\15\\-147.9907\\-239.3203\\15\\-148.6895\\-237.3672\\15\\-149.5895\\-235.4141\\15\\-150.289\\-233.4609\\15\\-150.81\\-231.5078\\15\\-151.7591\\-229.5547\\15\\-152.9208\\-225.6484\\15\\-153.7298\\-223.6953\\15\\-154.6285\\-219.7891\\15\\-155.7483\\-215.8828\\15\\-156.1062\\-213.9297\\15\\-156.5656\\-210.0234\\15\\-156.9245\\-208.0703\\15\\-157.4504\\-206.1172\\15\\-157.7679\\-204.1641\\15\\-157.9652\\-202.2109\\15\\-158.2416\\-198.3047\\15\\-158.4447\\-194.3984\\15\\-158.5749\\-190.4922\\15\\-158.586\\-188.5391\\15\\-158.5056\\-180.7266\\15\\-158.2853\\-174.8672\\15\\-157.8513\\-169.0078\\15\\-157.5834\\-167.0547\\15\\-156.6819\\-163.1484\\15\\-155.935\\-157.2891\\15\\-155.4747\\-155.3359\\15\\-154.8491\\-153.3828\\15\\-153.92\\-149.4766\\15\\-153.3203\\-147.6455\\15\\-152.5228\\-145.5703\\15\\-151.9643\\-143.6172\\15\\-151.0651\\-141.6641\\15\\-149.9449\\-137.7578\\15\\-149.0331\\-135.8047\\15\\-147.7349\\-131.8984\\15\\-146.6989\\-129.9453\\15\\-145.9343\\-127.9922\\15\\-144.7917\\-126.0391\\15\\-144.065\\-124.0859\\15\\-142.9714\\-122.1328\\15\\-142.3181\\-120.1797\\15\\-141.2421\\-118.2266\\15\\-140.3939\\-116.2734\\15\\-139.1211\\-114.3203\\15\\-138.1416\\-112.3672\\15\\-136.8764\\-110.4141\\15\\-136.0502\\-108.4609\\15\\-133.7891\\-104.7586\\15\\-129.8828\\-99.79504\\15\\-128.958\\-98.69531\\15\\-125.9766\\-95.81445\\15\\-124.0234\\-94.15466\\15\\-116.2109\\-88.66769\\15\\-114.2578\\-87.8467\\15\\-112.3047\\-86.62081\\15\\-110.3516\\-85.87399\\15\\-106.4453\\-84.0533\\15\\-104.4922\\-83.37908\\15\\-102.5391\\-82.46986\\15\\-100.5859\\-81.98319\\15\\-98.63281\\-81.32813\\15\\-96.67969\\-80.49806\\15\\-94.72656\\-80.0342\\15\\-92.19752\\-79.16406\\15\\-90.82031\\-78.80599\\15\\-88.86719\\-78.0981\\15\\-83.00781\\-76.56227\\15\\-81.05469\\-76.27218\\15\\-77.14844\\-75.89849\\15\\-75.19531\\-75.5621\\15\\-73.24219\\-74.78088\\15\\-71.28906\\-74.57758\\15\\-67.38281\\-74.31102\\15\\-63.47656\\-74.20035\\15\\-61.52344\\-72.9377\\15\\-55.66406\\-72.9686\\15\\-47.85156\\-72.84272\\15\\-43.94531\\-74.22894\\15\\-41.99219\\-74.30492\\15\\-38.08594\\-74.56807\\15\\-36.13281\\-74.78876\\15\\-34.17969\\-75.66864\\15\\-28.32031\\-76.46021\\15\\-26.36719\\-76.9389\\15\\-24.41406\\-77.60545\\15\\-20.50781\\-78.59342\\15\\-18.55469\\-79.3754\\15\\-14.64844\\-80.5416\\15\\-12.69531\\-81.56301\\15\\-10.74219\\-82.32353\\15\\-8.789063\\-83.55527\\15\\-5.872938\\-85.02344\\15\\-2.282715\\-86.97656\\15\\-0.9765625\\-87.80586\\15\\0.9765625\\-88.09354\\15\\2.929688\\-87.9158\\15\\6.835938\\-85.8922\\15\\8.789063\\-84.53516\\15\\10.74219\\-83.38876\\15\\12.69531\\-82.11962\\15\\14.64844\\-81.07616\\15\\18.55469\\-79.3836\\15\\20.50781\\-78.36293\\15\\22.46094\\-77.6414\\15\\24.41406\\-76.79057\\15\\26.36719\\-76.22253\\15\\28.32031\\-75.87044\\15\\32.22656\\-74.65525\\15\\34.17969\\-74.45027\\15\\38.08594\\-74.18539\\15\\40.03906\\-73.23811\\15\\41.99219\\-72.83385\\15\\47.85156\\-72.78273\\15\\55.66406\\-72.76647\\15\\61.52344\\-72.81641\\15\\63.47656\\-73.01172\\15\\65.42969\\-73.89632\\15\\67.38281\\-74.20568\\15\\71.28906\\-74.40409\\15\\75.19531\\-74.72707\\15\\77.14844\\-75.166\\15\\79.10156\\-75.71699\\15\\84.96094\\-76.42394\\15\\86.91406\\-76.78329\\15\\88.86719\\-77.37609\\15\\92.77344\\-78.33904\\15\\94.72656\\-78.91658\\15\\96.67969\\-79.64556\\15\\100.5859\\-80.70856\\15\\102.5391\\-81.56738\\15\\106.4453\\-82.73801\\15\\108.3984\\-83.71532\\15\\110.3516\\-84.46452\\15\\112.3047\\-85.59677\\15\\114.2578\\-86.41246\\15\\116.2109\\-87.59862\\15\\118.1641\\-88.56348\\15\\120.1172\\-89.97559\\15\\123.4345\\-92.83594\\15\\125.9766\\-95.40922\\15\\127.2022\\-96.74219\\15\\128.8099\\-98.69531\\15\\130.1058\\-100.6484\\15\\131.2406\\-102.6016\\15\\131.8359\\-103.3707\\15\\133.7891\\-106.4119\\15\\134.9253\\-108.4609\\15\\136.1314\\-110.4141\\15\\136.898\\-112.3672\\15\\138.0358\\-114.3203\\15\\138.8926\\-116.2734\\15\\140.1149\\-118.2266\\15\\140.9091\\-120.1797\\15\\142.0045\\-122.1328\\15\\143.2957\\-126.0391\\15\\144.2603\\-127.9922\\15\\144.8357\\-129.9453\\15\\145.8635\\-131.8984\\15\\146.5441\\-133.8516\\15\\148.1262\\-137.7578\\15\\149.1444\\-141.6641\\15\\149.899\\-143.6172\\15\\150.6564\\-147.5234\\15\\151.9228\\-151.4297\\15\\152.6455\\-155.3359\\15\\153.0901\\-157.2891\\15\\153.6372\\-159.2422\\15\\153.9433\\-161.1953\\15\\155.0752\\-170.9609\\15\\155.5896\\-174.8672\\15\\155.7451\\-176.8203\\15\\155.9307\\-180.7266\\15\\156.0872\\-186.5859\\15\\156.1369\\-192.4453\\15\\156.0822\\-200.2578\\15\\155.9639\\-204.1641\\15\\155.7451\\-208.0703\\15\\155.3125\\-211.9766\\15\\154.9812\\-213.9297\\15\\154.1938\\-219.7891\\15\\153.8609\\-221.7422\\15\\152.6196\\-225.6484\\15\\152.125\\-227.6016\\15\\150.5457\\-231.5078\\15\\149.9544\\-233.4609\\15\\148.8685\\-235.4141\\15\\148.0928\\-237.3672\\15\\146.8406\\-239.3203\\15\\145.8068\\-241.2734\\15\\143.5547\\-244.4909\\15\\143.0114\\-245.1797\\15\\141.8795\\-247.1328\\15\\140.324\\-249.0859\\15\\137.6953\\-251.8361\\15\\134.8842\\-254.9453\\15\\131.8359\\-257.7892\\15\\129.8828\\-259.7173\\15\\127.9297\\-261.5354\\15\\125.9766\\-263.1231\\15\\124.0234\\-264.4688\\15\\121.4371\\-266.6641\\15\\118.1641\\-269.1441\\15\\116.2109\\-270.268\\15\\112.3047\\-273.0716\\15\\110.3516\\-274.1558\\15\\108.3984\\-275.366\\15\\106.2296\\-276.4297\\15\\100.5859\\-279.3378\\15\\96.67969\\-281.1328\\15\\94.72656\\-281.6955\\15\\92.77344\\-282.5219\\15\\90.82031\\-283.1029\\15\\88.86719\\-283.5053\\15\\84.96094\\-284.8575\\15\\81.05469\\-285.6347\\15\\77.14844\\-286.6745\\15\\69.33594\\-287.7865\\15\\65.42969\\-288.5757\\15\\61.52344\\-289.0421\\15\\57.61719\\-289.4287\\15\\55.66406\\-289.8539\\15\\53.71094\\-290.5131\\15\\49.80469\\-291.21\\15\\47.85156\\-291.6777\\15\\45.89844\\-292.4012\\15\\41.99219\\-293.2727\\15\\38.08594\\-294.493\\15\\36.13281\\-294.8557\\15\\32.22656\\-295.4466\\15\\28.32031\\-296.5457\\15\\22.46094\\-297.4106\\15\\18.55469\\-298.3937\\15\\16.60156\\-298.6416\\15\\10.74219\\-299.2624\\15\\4.882813\\-299.7688\\15\\2.929688\\-299.9048\\15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "134" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.882813\\-299.9048\\17\\-6.835938\\-299.7562\\17\\-18.55469\\-298.7327\\17\\-22.46094\\-298.2911\\17\\-26.36719\\-297.46\\17\\-28.32031\\-297.179\\17\\-34.17969\\-296.5372\\17\\-36.13281\\-296.1324\\17\\-38.08594\\-295.6102\\17\\-40.03906\\-295.3203\\17\\-45.89844\\-294.645\\17\\-47.85156\\-294.3068\\17\\-49.80469\\-293.7671\\17\\-51.75781\\-293.3549\\17\\-57.61719\\-292.5167\\17\\-61.52344\\-291.5693\\17\\-63.47656\\-291.2985\\17\\-67.38281\\-290.9406\\17\\-71.28906\\-290.4834\\17\\-75.19531\\-289.6165\\17\\-81.05469\\-288.9864\\17\\-83.00781\\-288.6852\\17\\-84.96094\\-288.1722\\17\\-86.91406\\-287.5039\\17\\-90.82031\\-286.6715\\17\\-92.77344\\-285.8138\\17\\-94.72656\\-285.1828\\17\\-96.67969\\-284.4539\\17\\-98.63281\\-283.486\\17\\-100.5859\\-282.9254\\17\\-102.5391\\-281.8998\\17\\-104.4922\\-281.1037\\17\\-106.4453\\-279.923\\17\\-108.3984\\-278.928\\17\\-110.3516\\-277.5659\\17\\-114.2578\\-275.3604\\17\\-118.1641\\-272.6849\\17\\-121.0469\\-270.5703\\17\\-122.0703\\-269.7117\\17\\-125.9766\\-266.7918\\17\\-128.3906\\-264.7109\\17\\-131.8359\\-261.5596\\17\\-134.4206\\-258.8516\\17\\-136.098\\-256.8984\\17\\-137.6953\\-254.8853\\17\\-139.0788\\-252.9922\\17\\-140.6544\\-251.0391\\17\\-142.1137\\-249.0859\\17\\-143.0698\\-247.1328\\17\\-143.5547\\-246.4848\\17\\-145.5155\\-243.2266\\17\\-147.6819\\-239.3203\\17\\-149.2233\\-235.4141\\17\\-150.1073\\-233.4609\\17\\-150.5802\\-231.5078\\17\\-152.1244\\-227.6016\\17\\-152.6306\\-225.6484\\17\\-153.3869\\-223.6953\\17\\-153.9994\\-221.7422\\17\\-154.8387\\-217.8359\\17\\-155.4462\\-215.8828\\17\\-155.9182\\-213.9297\\17\\-156.1977\\-211.9766\\17\\-156.6431\\-208.0703\\17\\-157.0152\\-206.1172\\17\\-157.4857\\-204.1641\\17\\-157.7648\\-202.2109\\17\\-158.0643\\-198.3047\\17\\-158.2508\\-194.3984\\17\\-158.3775\\-188.5391\\17\\-158.3003\\-180.7266\\17\\-158.1036\\-174.8672\\17\\-157.8189\\-170.9609\\17\\-157.6036\\-169.0078\\17\\-156.7319\\-165.1016\\17\\-156.0289\\-159.2422\\17\\-155.6792\\-157.2891\\17\\-155.0737\\-155.3359\\17\\-154.5681\\-153.3828\\17\\-153.6586\\-149.4766\\17\\-152.8633\\-147.5234\\17\\-151.6732\\-143.6172\\17\\-150.7507\\-141.6641\\17\\-150.27\\-139.7109\\17\\-149.6452\\-137.7578\\17\\-148.7736\\-135.8047\\17\\-148.2191\\-133.8516\\17\\-147.4609\\-132.1077\\17\\-145.56\\-127.9922\\17\\-144.5483\\-126.0391\\17\\-143.7396\\-124.0859\\17\\-142.7378\\-122.1328\\17\\-142.0831\\-120.1797\\17\\-140.9525\\-118.2266\\17\\-140.1149\\-116.2734\\17\\-138.8307\\-114.3203\\17\\-136.6766\\-110.4141\\17\\-135.7422\\-108.522\\17\\-134.5952\\-106.5078\\17\\-133.2505\\-104.5547\\17\\-130.2517\\-100.6484\\17\\-128.5685\\-98.69531\\17\\-125.9766\\-96.14806\\17\\-124.0234\\-94.45579\\17\\-118.1641\\-90.22147\\17\\-116.1244\\-88.92969\\17\\-112.3047\\-86.90569\\17\\-108.3984\\-85.33681\\17\\-106.4453\\-84.34544\\17\\-104.4922\\-83.60237\\17\\-102.5391\\-82.68111\\17\\-98.63281\\-81.60196\\17\\-96.67969\\-80.65642\\17\\-94.72656\\-80.25986\\17\\-92.77344\\-79.49471\\17\\-90.82031\\-78.96462\\17\\-88.86719\\-78.28783\\17\\-86.91406\\-77.74424\\17\\-81.05469\\-76.395\\17\\-77.14844\\-75.99175\\17\\-75.19531\\-75.7263\\17\\-73.24219\\-74.9592\\17\\-71.28906\\-74.66064\\17\\-67.38281\\-74.3783\\17\\-63.47656\\-74.22894\\17\\-59.57031\\-73.16925\\17\\-57.61719\\-73.0456\\17\\-55.66406\\-73.19618\\17\\-53.71094\\-73.10525\\17\\-51.75781\\-72.90796\\17\\-47.85156\\-72.87\\17\\-45.89844\\-73.69698\\17\\-43.94531\\-74.25786\\17\\-40.03906\\-74.45247\\17\\-38.08594\\-74.63253\\17\\-36.13281\\-74.9567\\17\\-34.17969\\-75.73626\\17\\-28.32031\\-76.52487\\17\\-24.41406\\-77.66117\\17\\-20.50781\\-78.67578\\17\\-18.55469\\-79.42975\\17\\-14.64844\\-80.5638\\17\\-12.69531\\-81.56626\\17\\-10.74219\\-82.298\\17\\-8.789063\\-83.49461\\17\\-5.769428\\-85.02344\\17\\-2.929688\\-86.53744\\17\\-0.9765625\\-87.44982\\17\\0.9765625\\-87.95313\\17\\2.929688\\-87.81628\\17\\6.835938\\-85.85602\\17\\8.789063\\-84.53516\\17\\10.74219\\-83.43481\\17\\12.69531\\-82.17034\\17\\14.76258\\-81.11719\\17\\18.55469\\-79.45259\\17\\20.50781\\-78.4226\\17\\22.46094\\-77.72721\\17\\24.41406\\-76.85643\\17\\26.36719\\-76.27605\\17\\30.27344\\-75.54586\\17\\32.22656\\-74.73363\\17\\34.17969\\-74.51897\\17\\38.08594\\-74.26969\\17\\40.03906\\-73.90958\\17\\41.99219\\-73.06896\\17\\45.89844\\-72.84272\\17\\53.71094\\-72.79937\\17\\57.61719\\-72.83385\\17\\61.52344\\-73.02286\\17\\63.47656\\-73.4628\\17\\65.42969\\-74.21191\\17\\67.38281\\-74.26381\\17\\71.28906\\-74.48286\\17\\75.19531\\-74.84465\\17\\77.14844\\-75.38853\\17\\79.10156\\-75.82027\\17\\84.96094\\-76.52615\\17\\86.91406\\-76.96001\\17\\88.86719\\-77.5583\\17\\90.82031\\-77.97948\\17\\94.72656\\-79.11188\\17\\96.67969\\-79.82149\\17\\98.63281\\-80.28949\\17\\100.5859\\-80.85825\\17\\102.5391\\-81.72266\\17\\104.4922\\-82.24445\\17\\106.4453\\-82.98831\\17\\108.3984\\-83.90493\\17\\110.3516\\-84.69791\\17\\112.3047\\-85.77968\\17\\114.2578\\-86.5953\\17\\118.1641\\-88.85705\\17\\120.1172\\-90.18694\\17\\123.2084\\-92.83594\\17\\125.9766\\-95.68132\\17\\128.5384\\-98.69531\\17\\130.9838\\-102.6016\\17\\132.354\\-104.5547\\17\\133.4683\\-106.5078\\17\\134.7114\\-108.4609\\17\\135.7822\\-110.4141\\17\\137.6703\\-114.3203\\17\\139.7453\\-118.2266\\17\\141.6409\\-122.1328\\17\\142.4515\\-124.0859\\17\\143.0166\\-126.0391\\17\\144.0176\\-127.9922\\17\\144.6109\\-129.9453\\17\\146.3117\\-133.8516\\17\\146.9727\\-135.8047\\17\\147.8738\\-137.7578\\17\\148.8664\\-141.6641\\17\\149.5882\\-143.6172\\17\\150.1346\\-145.5703\\17\\150.8853\\-149.4766\\17\\151.6147\\-151.4297\\17\\152.0919\\-153.3828\\17\\152.7581\\-157.2891\\17\\153.7195\\-161.1953\\17\\153.9951\\-163.1484\\17\\155.0221\\-172.9141\\17\\155.2813\\-174.8672\\17\\155.6242\\-178.7734\\17\\155.8846\\-184.6328\\17\\155.9719\\-192.4453\\17\\155.8846\\-200.2578\\17\\155.7419\\-204.1641\\17\\155.457\\-208.0703\\17\\153.9695\\-219.7891\\17\\153.556\\-221.7422\\17\\152.8662\\-223.6953\\17\\151.8555\\-227.6016\\17\\150.9221\\-229.5547\\17\\150.3389\\-231.5078\\17\\149.5895\\-233.4609\\17\\148.594\\-235.4141\\17\\147.7553\\-237.3672\\17\\147.4609\\-237.7559\\17\\144.1136\\-243.2266\\17\\141.6016\\-246.7551\\17\\139.7945\\-249.0859\\17\\137.6953\\-251.3591\\17\\136.317\\-252.9922\\17\\134.4896\\-254.9453\\17\\132.3594\\-256.8984\\17\\127.9297\\-261.0738\\17\\125.9766\\-262.4929\\17\\124.0234\\-264.0124\\17\\120.1172\\-267.2798\\17\\116.2109\\-269.8227\\17\\114.2578\\-271.2424\\17\\110.3516\\-273.6843\\17\\108.3984\\-275.0183\\17\\106.4453\\-275.8024\\17\\104.4922\\-276.9701\\17\\102.5391\\-277.7505\\17\\100.5859\\-278.9266\\17\\98.63281\\-279.679\\17\\96.67969\\-280.7172\\17\\92.77344\\-281.8998\\17\\90.82031\\-282.7006\\17\\86.91406\\-283.585\\17\\83.00781\\-284.8462\\17\\79.10156\\-285.5658\\17\\75.19531\\-286.5996\\17\\69.33594\\-287.4175\\17\\67.38281\\-287.7299\\17\\63.47656\\-288.6037\\17\\61.52344\\-288.8824\\17\\57.61719\\-289.3285\\17\\55.66406\\-289.6755\\17\\53.71094\\-290.3758\\17\\51.75781\\-290.8539\\17\\49.80469\\-291.1797\\17\\47.85156\\-291.6555\\17\\45.89844\\-292.4217\\17\\41.99219\\-293.301\\17\\38.08594\\-294.5365\\17\\32.22656\\-295.5158\\17\\30.27344\\-296.1324\\17\\28.32031\\-296.6178\\17\\24.41406\\-297.1682\\17\\22.46094\\-297.5325\\17\\20.50781\\-298.1135\\17\\18.55469\\-298.4989\\17\\16.60156\\-298.7342\\17\\6.835938\\-299.7266\\17\\2.929688\\-300.0288\\17\\-0.9765625\\-300.0542\\17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "300" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "135" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-299.8899\\19\\-16.60156\\-298.9535\\19\\-20.50781\\-298.6037\\19\\-22.46094\\-298.367\\19\\-24.41406\\-297.9948\\19\\-26.36719\\-297.5247\\19\\-28.32031\\-297.2283\\19\\-34.17969\\-296.5743\\19\\-36.13281\\-296.1996\\19\\-38.08594\\-295.6588\\19\\-40.03906\\-295.3287\\19\\-45.89844\\-294.6249\\19\\-47.85156\\-294.2705\\19\\-49.80469\\-293.7109\\19\\-51.75781\\-293.3019\\19\\-57.61719\\-292.4012\\19\\-59.57031\\-291.8309\\19\\-61.52344\\-291.4196\\19\\-63.47656\\-291.1734\\19\\-67.38281\\-290.7852\\19\\-69.33594\\-290.4934\\19\\-73.24219\\-289.6295\\19\\-75.19531\\-289.3662\\19\\-79.10156\\-288.9999\\19\\-81.05469\\-288.7331\\19\\-83.00781\\-288.2771\\19\\-84.96094\\-287.6763\\19\\-88.86719\\-286.8183\\19\\-92.77344\\-285.4066\\19\\-94.72656\\-284.8546\\19\\-96.67969\\-283.8613\\19\\-100.5859\\-282.5607\\19\\-102.5391\\-281.5519\\19\\-104.4922\\-280.7872\\19\\-106.4453\\-279.5468\\19\\-108.3984\\-278.4775\\19\\-111.7149\\-276.4297\\19\\-112.3047\\-276.0011\\19\\-114.2578\\-275.0638\\19\\-118.1641\\-272.1154\\19\\-122.0703\\-269.418\\19\\-124.0234\\-267.8584\\19\\-127.8212\\-264.7109\\19\\-131.8359\\-261.1454\\19\\-134.0296\\-258.8516\\19\\-135.7422\\-256.8697\\19\\-138.7684\\-252.9922\\19\\-140.414\\-251.0391\\19\\-141.8092\\-249.0859\\19\\-142.8192\\-247.1328\\19\\-144.158\\-245.1797\\19\\-145.1021\\-243.2266\\19\\-146.3692\\-241.2734\\19\\-148.2937\\-237.3672\\19\\-148.9224\\-235.4141\\19\\-149.8857\\-233.4609\\19\\-150.9564\\-229.5547\\19\\-151.8869\\-227.6016\\19\\-152.9926\\-223.6953\\19\\-153.7724\\-221.7422\\19\\-154.5964\\-217.8359\\19\\-155.0885\\-215.8828\\19\\-155.7007\\-213.9297\\19\\-156.0438\\-211.9766\\19\\-156.6945\\-206.1172\\19\\-157.4623\\-202.2109\\19\\-157.7234\\-200.2578\\19\\-158.0049\\-196.3516\\19\\-158.0805\\-194.3984\\19\\-158.2079\\-188.5391\\19\\-158.1699\\-182.6797\\19\\-158.0697\\-178.7734\\19\\-157.9198\\-174.8672\\19\\-157.5627\\-170.9609\\19\\-156.7874\\-167.0547\\19\\-156.5073\\-165.1016\\19\\-156.1114\\-161.1953\\19\\-155.8174\\-159.2422\\19\\-154.7625\\-155.3359\\19\\-153.935\\-151.4297\\19\\-152.5687\\-147.5234\\19\\-152.0491\\-145.5703\\19\\-150.5374\\-141.6641\\19\\-150.0835\\-139.7109\\19\\-149.2668\\-137.7578\\19\\-147.9965\\-133.8516\\19\\-146.9884\\-131.8984\\19\\-146.2185\\-129.9453\\19\\-145.1239\\-127.9922\\19\\-144.3394\\-126.0391\\19\\-143.3087\\-124.0859\\19\\-141.7757\\-120.1797\\19\\-139.7569\\-116.2734\\19\\-137.6953\\-112.7871\\19\\-137.3796\\-112.3672\\19\\-136.5122\\-110.4141\\19\\-135.3443\\-108.4609\\19\\-134.3076\\-106.5078\\19\\-131.8359\\-103.0989\\19\\-129.9079\\-100.6484\\19\\-128.1795\\-98.69531\\19\\-125.9766\\-96.48035\\19\\-123.9551\\-94.78906\\19\\-121.4164\\-92.83594\\19\\-120.1172\\-91.95407\\19\\-118.1641\\-90.44955\\19\\-116.2109\\-89.34721\\19\\-114.2578\\-88.09541\\19\\-112.3047\\-87.28694\\19\\-110.3516\\-86.29804\\19\\-108.3984\\-85.60809\\19\\-106.4453\\-84.62393\\19\\-100.5859\\-82.24496\\19\\-98.63281\\-81.77487\\19\\-96.67969\\-80.88251\\19\\-94.72656\\-80.34186\\19\\-92.77344\\-79.64133\\19\\-90.82031\\-79.1265\\19\\-86.91406\\-77.87336\\19\\-84.96094\\-77.53878\\19\\-83.00781\\-77.08887\\19\\-81.05469\\-76.5313\\19\\-75.19531\\-75.80951\\19\\-71.28906\\-74.73649\\19\\-65.42969\\-74.3355\\19\\-61.52344\\-74.20035\\19\\-57.61719\\-73.67397\\19\\-55.66406\\-73.9255\\19\\-53.71094\\-73.82301\\19\\-51.75781\\-73.09299\\19\\-49.80469\\-72.89829\\19\\-48.127\\-73.30469\\19\\-45.89844\\-74.06866\\19\\-43.94531\\-74.2872\\19\\-40.03906\\-74.50409\\19\\-38.08594\\-74.70712\\19\\-36.13281\\-75.37407\\19\\-34.17969\\-75.79107\\19\\-28.32031\\-76.56203\\19\\-24.41406\\-77.71477\\19\\-22.46094\\-78.16543\\19\\-20.50781\\-78.72017\\19\\-18.55469\\-79.48251\\19\\-14.64844\\-80.59592\\19\\-12.69531\\-81.57385\\19\\-10.74219\\-82.29033\\19\\-8.789063\\-83.43481\\19\\-5.529626\\-85.02344\\19\\-2.929688\\-86.46623\\19\\-0.9765625\\-87.29183\\19\\0.9765625\\-87.80192\\19\\2.929688\\-87.67318\\19\\6.835938\\-85.83828\\19\\8.789063\\-84.53516\\19\\10.74219\\-83.47323\\19\\12.69531\\-82.21423\\19\\16.60156\\-80.33234\\19\\18.55469\\-79.49448\\19\\20.50781\\-78.48232\\19\\22.46094\\-77.79077\\19\\24.41406\\-76.9389\\19\\26.36719\\-76.32369\\19\\30.27344\\-75.60855\\19\\32.22656\\-74.81799\\19\\34.17969\\-74.57818\\19\\38.08594\\-74.30464\\19\\40.03906\\-74.22955\\19\\43.94531\\-73.6469\\19\\45.89844\\-72.87931\\19\\53.71094\\-72.82507\\19\\57.61719\\-72.86079\\19\\59.57031\\-73.57259\\19\\61.52344\\-73.88631\\19\\63.47656\\-74.01676\\19\\65.42969\\-74.26381\\19\\67.38281\\-74.3286\\19\\71.28906\\-74.5612\\19\\75.19531\\-74.97765\\19\\77.14844\\-75.63081\\19\\79.10156\\-75.91878\\19\\83.00781\\-76.3665\\19\\84.96094\\-76.65734\\19\\88.86719\\-77.70844\\19\\90.82031\\-78.08349\\19\\92.77344\\-78.64848\\19\\96.67969\\-79.95142\\19\\98.63281\\-80.40751\\19\\100.5859\\-81.06069\\19\\102.5391\\-81.8527\\19\\104.4922\\-82.36399\\19\\108.3984\\-84.09625\\19\\112.3047\\-85.96574\\19\\114.2578\\-86.83273\\19\\117.842\\-88.92969\\19\\120.1172\\-90.43162\\19\\122.9425\\-92.83594\\19\\125.9766\\-95.98264\\19\\128.2307\\-98.69531\\19\\129.4383\\-100.6484\\19\\132.0537\\-104.5547\\19\\133.1568\\-106.5078\\19\\134.4831\\-108.4609\\19\\135.4072\\-110.4141\\19\\136.5247\\-112.3672\\19\\137.2808\\-114.3203\\19\\138.433\\-116.2734\\19\\139.305\\-118.2266\\19\\140.453\\-120.1797\\19\\141.2446\\-122.1328\\19\\142.2589\\-124.0859\\19\\142.8145\\-126.0391\\19\\143.6834\\-127.9922\\19\\144.4198\\-129.9453\\19\\145.0291\\-131.8984\\19\\146.0432\\-133.8516\\19\\146.692\\-135.8047\\19\\147.5143\\-137.7578\\19\\148.1978\\-139.7109\\19\\148.6366\\-141.6641\\19\\149.183\\-143.6172\\19\\149.9089\\-145.5703\\19\\150.6376\\-149.4766\\19\\151.1704\\-151.4297\\19\\151.8409\\-153.3828\\19\\152.8884\\-159.2422\\19\\153.4151\\-161.1953\\19\\153.7879\\-163.1484\\19\\154.4211\\-169.0078\\19\\154.7659\\-172.9141\\19\\155.3426\\-178.7734\\19\\155.6013\\-182.6797\\19\\155.735\\-186.5859\\19\\155.7912\\-190.4922\\19\\155.7815\\-194.3984\\19\\155.6627\\-200.2578\\19\\155.4717\\-204.1641\\19\\155.102\\-208.0703\\19\\154.2694\\-215.8828\\19\\153.7122\\-219.7891\\19\\152.577\\-223.6953\\19\\152.1371\\-225.6484\\19\\151.4893\\-227.6016\\19\\150.6392\\-229.5547\\19\\150.1237\\-231.5078\\19\\149.1298\\-233.4609\\19\\148.3515\\-235.4141\\19\\146.207\\-239.3203\\19\\144.8217\\-241.2734\\19\\143.6844\\-243.2266\\19\\142.4208\\-245.1797\\19\\139.6484\\-248.5755\\19\\137.4151\\-251.0391\\19\\135.7507\\-252.9922\\19\\133.7891\\-255.1134\\19\\131.8359\\-256.7743\\19\\127.5276\\-260.8047\\19\\125.0895\\-262.7578\\19\\122.7679\\-264.7109\\19\\120.1172\\-266.7473\\19\\118.1641\\-268.0259\\19\\114.2578\\-270.7973\\19\\112.3047\\-271.8784\\19\\110.3516\\-273.3108\\19\\108.3984\\-274.4847\\19\\106.4453\\-275.484\\19\\100.5859\\-278.2828\\19\\98.63281\\-279.2661\\19\\96.67969\\-280.058\\19\\94.72656\\-280.9646\\19\\92.77344\\-281.467\\19\\90.82031\\-282.0695\\19\\88.86719\\-282.8139\\19\\84.96094\\-283.5974\\19\\81.05469\\-284.7911\\19\\77.14844\\-285.5002\\19\\73.24219\\-286.4922\\19\\71.28906\\-286.8369\\19\\67.38281\\-287.403\\19\\65.42969\\-287.778\\19\\63.47656\\-288.2901\\19\\59.57031\\-289.0052\\19\\55.66406\\-289.5217\\19\\53.71094\\-290.2109\\19\\51.75781\\-290.7991\\19\\49.80469\\-291.1455\\19\\47.85156\\-291.6146\\19\\45.89844\\-292.4115\\19\\41.99219\\-293.322\\19\\38.08594\\-294.5703\\19\\32.22656\\-295.5717\\19\\30.27344\\-296.2266\\19\\28.32031\\-296.6778\\19\\24.41406\\-297.2354\\19\\22.46094\\-297.656\\19\\20.50781\\-298.2396\\19\\18.55469\\-298.5804\\19\\6.835938\\-299.8748\\19\\2.929688\\-300.1377\\19\\-0.9765625\\-300.1602\\19\\-4.882813\\-300.0288\\19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "316" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "136" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-299.8436\\21\\-12.69531\\-299.403\\21\\-20.50781\\-298.6453\\21\\-22.46094\\-298.4194\\21\\-24.41406\\-298.0757\\21\\-26.36719\\-297.5775\\21\\-28.32031\\-297.2538\\21\\-34.17969\\-296.6022\\21\\-36.13281\\-296.2369\\21\\-38.08594\\-295.685\\21\\-40.03906\\-295.3246\\21\\-45.89844\\-294.6046\\21\\-47.85156\\-294.2225\\21\\-49.80469\\-293.6568\\21\\-51.75781\\-293.2506\\21\\-55.66406\\-292.6617\\21\\-57.61719\\-292.2417\\21\\-59.57031\\-291.6458\\21\\-61.52344\\-291.3023\\21\\-67.38281\\-290.5691\\21\\-71.28906\\-289.6727\\21\\-73.24219\\-289.3929\\21\\-77.14844\\-289.0105\\21\\-79.10156\\-288.7635\\21\\-81.05469\\-288.3744\\21\\-83.00781\\-287.7755\\21\\-86.91406\\-286.9345\\21\\-88.86719\\-286.4445\\21\\-90.82031\\-285.6212\\21\\-92.77344\\-285.0785\\21\\-94.72656\\-284.3908\\21\\-96.67969\\-283.4979\\21\\-98.63281\\-282.9714\\21\\-100.5859\\-282.0321\\21\\-102.5391\\-281.2703\\21\\-104.4551\\-280.3359\\21\\-107.8161\\-278.3828\\21\\-108.3984\\-277.942\\21\\-110.3516\\-276.9737\\21\\-112.3047\\-275.6829\\21\\-114.2578\\-274.6343\\21\\-116.2109\\-273.296\\21\\-118.1641\\-271.6872\\21\\-120.1172\\-270.2159\\21\\-122.0703\\-269.0839\\21\\-129.5776\\-262.7578\\21\\-131.8359\\-260.6221\\21\\-135.7422\\-256.4231\\21\\-137.6953\\-254.0284\\21\\-139.6484\\-251.4998\\21\\-140.106\\-251.0391\\21\\-141.6016\\-248.8196\\21\\-143.8448\\-245.1797\\21\\-144.7905\\-243.2266\\21\\-146.088\\-241.2734\\21\\-146.9727\\-239.3203\\21\\-148.0767\\-237.3672\\21\\-148.6816\\-235.4141\\21\\-149.5602\\-233.4609\\21\\-150.2337\\-231.5078\\21\\-150.6824\\-229.5547\\21\\-151.5542\\-227.6016\\21\\-152.1741\\-225.6484\\21\\-152.6827\\-223.6953\\21\\-153.4557\\-221.7422\\21\\-153.9955\\-219.7891\\21\\-154.7852\\-215.8828\\21\\-155.3879\\-213.9297\\21\\-155.8581\\-211.9766\\21\\-156.125\\-210.0234\\21\\-156.4883\\-206.1172\\21\\-157.043\\-202.2109\\21\\-157.426\\-200.2578\\21\\-157.8189\\-196.3516\\21\\-157.9097\\-194.3984\\21\\-158.0412\\-188.5391\\21\\-158.0049\\-182.6797\\21\\-157.8963\\-178.7734\\21\\-157.6885\\-174.8672\\21\\-157.4857\\-172.9141\\21\\-156.7977\\-169.0078\\21\\-156.5341\\-167.0547\\21\\-156.1607\\-163.1484\\21\\-155.9139\\-161.1953\\21\\-155.5411\\-159.2422\\21\\-154.9292\\-157.2891\\21\\-154.1249\\-153.3828\\21\\-153.6523\\-151.4297\\21\\-152.8911\\-149.4766\\21\\-151.791\\-145.5703\\21\\-150.8853\\-143.6172\\21\\-149.8336\\-139.7109\\21\\-148.9533\\-137.7578\\21\\-148.3963\\-135.8047\\21\\-147.7209\\-133.8516\\21\\-146.7172\\-131.8984\\21\\-145.9506\\-129.9453\\21\\-144.8195\\-127.9922\\21\\-144.0993\\-126.0391\\21\\-142.9938\\-124.0859\\21\\-142.3791\\-122.1328\\21\\-141.3902\\-120.1797\\21\\-140.5234\\-118.2266\\21\\-139.3345\\-116.2734\\21\\-138.3523\\-114.3203\\21\\-137.0949\\-112.3672\\21\\-136.3107\\-110.4141\\21\\-135.0579\\-108.4609\\21\\-133.9844\\-106.5078\\21\\-131.8359\\-103.5244\\21\\-129.8828\\-100.9613\\21\\-127.8869\\-98.69531\\21\\-125.9766\\-96.81796\\21\\-123.6273\\-94.78906\\21\\-121.0586\\-92.83594\\21\\-120.1172\\-92.23193\\21\\-118.1641\\-90.72134\\21\\-116.2109\\-89.60876\\21\\-114.2578\\-88.23599\\21\\-112.3047\\-87.54903\\21\\-110.3516\\-86.53146\\21\\-108.3984\\-85.82732\\21\\-106.4453\\-84.9133\\21\\-104.4922\\-84.09798\\21\\-102.5391\\-83.39584\\21\\-100.5859\\-82.4388\\21\\-98.63281\\-81.94977\\21\\-94.72656\\-80.45163\\21\\-92.77344\\-79.94146\\21\\-88.86719\\-78.72017\\21\\-86.91406\\-78.00742\\21\\-84.96094\\-77.71224\\21\\-83.00781\\-77.29486\\21\\-81.05469\\-76.72908\\21\\-79.10156\\-76.36459\\21\\-75.19531\\-75.88207\\21\\-73.24219\\-75.55222\\21\\-71.28906\\-74.83154\\21\\-69.33594\\-74.64658\\21\\-65.42969\\-74.39868\\21\\-57.61719\\-74.14087\\21\\-55.66406\\-74.21191\\21\\-53.71094\\-74.16288\\21\\-51.75781\\-73.87616\\21\\-49.80469\\-73.70016\\21\\-47.85156\\-74.08977\\21\\-45.89844\\-74.2636\\21\\-41.99219\\-74.41986\\21\\-38.08594\\-74.79242\\21\\-36.13281\\-75.60855\\21\\-30.27344\\-76.31825\\21\\-28.32031\\-76.61452\\21\\-24.41406\\-77.77155\\21\\-22.46094\\-78.2206\\21\\-20.50781\\-78.76733\\21\\-18.55469\\-79.53967\\21\\-14.64844\\-80.62891\\21\\-12.69531\\-81.59508\\21\\-10.74219\\-82.28036\\21\\-8.789063\\-83.3746\\21\\-5.234375\\-85.02344\\21\\-2.929688\\-86.33515\\21\\-0.9765625\\-87.00204\\21\\0.9765625\\-87.50349\\21\\2.929688\\-87.42894\\21\\6.835938\\-85.82803\\21\\8.789063\\-84.54382\\21\\10.74219\\-83.50213\\21\\12.69531\\-82.27247\\21\\14.64844\\-81.39729\\21\\16.60156\\-80.37866\\21\\18.55469\\-79.55032\\21\\20.50781\\-78.53627\\21\\22.46094\\-77.85595\\21\\24.41406\\-77.01417\\21\\26.36719\\-76.37302\\21\\30.27344\\-75.67921\\21\\32.22656\\-74.90625\\21\\34.17969\\-74.63636\\21\\38.08594\\-74.33484\\21\\41.99219\\-74.22346\\21\\43.94531\\-74.09464\\21\\45.89844\\-73.67711\\21\\47.85156\\-72.9686\\21\\49.80469\\-72.87\\21\\53.71094\\-72.86079\\21\\55.66406\\-73.644\\21\\57.61719\\-73.6636\\21\\59.57031\\-74.0593\\21\\61.52344\\-74.21272\\21\\65.42969\\-74.31066\\21\\69.33594\\-74.49826\\21\\73.24219\\-74.85967\\21\\77.14844\\-75.81496\\21\\83.00781\\-76.46661\\21\\84.96094\\-76.83227\\21\\86.91406\\-77.40063\\21\\90.82031\\-78.25524\\21\\92.77344\\-78.80836\\21\\94.72656\\-79.51334\\21\\98.63281\\-80.53253\\21\\100.5859\\-81.32159\\21\\104.4922\\-82.5313\\21\\106.4453\\-83.51362\\21\\108.3984\\-84.2786\\21\\110.3516\\-85.34188\\21\\112.3047\\-86.14848\\21\\116.2109\\-88.08804\\21\\120.1172\\-90.76074\\21\\122.5701\\-92.83594\\21\\124.0234\\-94.27789\\21\\126.2999\\-96.74219\\21\\127.9297\\-98.8418\\21\\130.5147\\-102.6016\\21\\131.8359\\-104.8403\\21\\134.2076\\-108.4609\\21\\135.1318\\-110.4141\\21\\136.2974\\-112.3672\\21\\137.0124\\-114.3203\\21\\138.1718\\-116.2734\\21\\138.9878\\-118.2266\\21\\140.2141\\-120.1797\\21\\140.9683\\-122.1328\\21\\142.0259\\-124.0859\\21\\143.281\\-127.9922\\21\\144.2153\\-129.9453\\21\\144.7458\\-131.8984\\21\\145.6706\\-133.8516\\21\\146.4472\\-135.8047\\21\\147.1112\\-137.7578\\21\\147.9524\\-139.7109\\21\\148.8857\\-143.6172\\21\\149.6033\\-145.5703\\21\\150.1465\\-147.5234\\21\\150.8295\\-151.4297\\21\\151.5026\\-153.3828\\21\\151.9843\\-155.3359\\21\\152.6204\\-159.2422\\21\\153.0193\\-161.1953\\21\\153.532\\-163.1484\\21\\153.8346\\-165.1016\\21\\154.2429\\-169.0078\\21\\154.7253\\-174.8672\\21\\155.1735\\-180.7266\\21\\155.43\\-184.6328\\21\\155.5657\\-190.4922\\21\\155.4994\\-196.3516\\21\\155.3726\\-200.2578\\21\\155.1157\\-204.1641\\21\\154.6326\\-210.0234\\21\\154.0677\\-215.8828\\21\\153.7907\\-217.8359\\21\\153.3725\\-219.7891\\21\\152.7903\\-221.7422\\21\\151.8899\\-225.6484\\21\\151.0302\\-227.6016\\21\\149.8443\\-231.5078\\21\\148.8126\\-233.4609\\21\\148.1014\\-235.4141\\21\\146.8966\\-237.3672\\21\\145.8378\\-239.3203\\21\\142.0364\\-245.1797\\21\\140.5105\\-247.1328\\21\\137.6953\\-250.2954\\21\\133.7891\\-254.4906\\21\\131.1406\\-256.8984\\21\\129.1344\\-258.8516\\21\\125.9766\\-261.6836\\21\\122.0703\\-264.7187\\21\\120.1172\\-266.1332\\21\\116.2109\\-269.0729\\21\\114.2578\\-270.1869\\21\\113.7873\\-270.5703\\21\\110.7641\\-272.5234\\21\\110.3516\\-272.8628\\21\\108.3984\\-273.9249\\21\\106.4453\\-275.1468\\21\\104.4922\\-275.8939\\21\\102.5391\\-276.9941\\21\\100.5859\\-277.698\\21\\98.63281\\-278.7977\\21\\96.67969\\-279.5096\\21\\94.72656\\-280.4186\\21\\92.77344\\-281.0894\\21\\90.82031\\-281.5771\\21\\86.91406\\-282.8405\\21\\83.00781\\-283.5727\\21\\79.10156\\-284.7184\\21\\73.24219\\-285.8456\\21\\71.28906\\-286.4223\\21\\69.33594\\-286.8259\\21\\65.42969\\-287.4601\\21\\63.47656\\-287.8971\\21\\61.52344\\-288.474\\21\\59.57031\\-288.8748\\21\\55.66406\\-289.4057\\21\\53.71094\\-290.0163\\21\\51.75781\\-290.7293\\21\\47.85156\\-291.5664\\21\\45.89844\\-292.4012\\21\\41.99219\\-293.3292\\21\\38.08594\\-294.579\\21\\34.17969\\-295.2254\\21\\32.22656\\-295.6216\\21\\30.27344\\-296.2865\\21\\28.32031\\-296.7168\\21\\24.41406\\-297.303\\21\\22.46094\\-297.7735\\21\\20.50781\\-298.3579\\21\\18.55469\\-298.6514\\21\\12.69531\\-299.315\\21\\6.835938\\-300.0288\\21\\4.882813\\-300.149\\21\\0.9765625\\-300.2342\\21\\-2.929688\\-300.2033\\21\\-4.882813\\-300.1377\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "293" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "137" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-299.9619\\23\\-12.69531\\-299.4828\\23\\-22.46094\\-298.4603\\23\\-24.41406\\-298.1258\\23\\-26.36719\\-297.6224\\23\\-28.32031\\-297.2798\\23\\-34.17969\\-296.6178\\23\\-36.13281\\-296.249\\23\\-38.08594\\-295.7096\\23\\-40.03906\\-295.3287\\23\\-45.89844\\-294.584\\23\\-47.85156\\-294.1706\\23\\-49.80469\\-293.584\\23\\-51.75781\\-293.1949\\23\\-55.66406\\-292.5766\\23\\-59.57031\\-291.4991\\23\\-61.52344\\-291.1924\\23\\-65.42969\\-290.6929\\23\\-67.38281\\-290.2772\\23\\-69.33594\\-289.7421\\23\\-71.28906\\-289.4366\\23\\-75.19531\\-289.054\\23\\-79.10156\\-288.4505\\23\\-83.00781\\-287.4175\\23\\-86.91406\\-286.6094\\23\\-88.86719\\-285.8588\\23\\-92.77344\\-284.7334\\23\\-94.72656\\-283.8001\\23\\-98.63281\\-282.6266\\23\\-100.5859\\-281.674\\23\\-102.5391\\-280.9931\\23\\-104.4922\\-279.8509\\23\\-106.4453\\-278.8889\\23\\-108.3984\\-277.5909\\23\\-110.3516\\-276.5746\\23\\-112.3047\\-275.4218\\23\\-116.2109\\-272.9017\\23\\-120.1172\\-269.8101\\23\\-122.0703\\-268.6256\\23\\-124.0234\\-267.1274\\23\\-124.4834\\-266.6641\\23\\-126.8584\\-264.7109\\23\\-129.8828\\-262.0655\\23\\-131.8359\\-260.1469\\23\\-134.9788\\-256.8984\\23\\-137.6953\\-253.6143\\23\\-139.6484\\-251.0299\\23\\-142.436\\-247.1328\\23\\-143.4051\\-245.1797\\23\\-145.7669\\-241.2734\\23\\-146.6944\\-239.3203\\23\\-147.7979\\-237.3672\\23\\-149.1718\\-233.4609\\23\\-150.0423\\-231.5078\\23\\-150.4922\\-229.5547\\23\\-151.1054\\-227.6016\\23\\-151.9531\\-225.6484\\23\\-152.433\\-223.6953\\23\\-153.0307\\-221.7422\\23\\-153.7537\\-219.7891\\23\\-154.5529\\-215.8828\\23\\-155.0184\\-213.9297\\23\\-155.5919\\-211.9766\\23\\-155.9639\\-210.0234\\23\\-156.1853\\-208.0703\\23\\-156.7162\\-202.2109\\23\\-157.5834\\-196.3516\\23\\-157.7807\\-192.4453\\23\\-157.8621\\-188.5391\\23\\-157.8621\\-184.6328\\23\\-157.7648\\-180.7266\\23\\-157.5521\\-176.8203\\23\\-157.3486\\-174.8672\\23\\-156.5341\\-169.0078\\23\\-156.1971\\-165.1016\\23\\-155.9763\\-163.1484\\23\\-155.6544\\-161.1953\\23\\-154.6537\\-157.2891\\23\\-153.9074\\-153.3828\\23\\-152.5987\\-149.4766\\23\\-152.118\\-147.5234\\23\\-151.4338\\-145.5703\\23\\-150.6261\\-143.6172\\23\\-150.1918\\-141.6641\\23\\-148.7229\\-137.7578\\23\\-148.2053\\-135.8047\\23\\-146.4789\\-131.8984\\23\\-144.5975\\-127.9922\\23\\-143.8184\\-126.0391\\23\\-142.7896\\-124.0859\\23\\-142.181\\-122.1328\\23\\-141.0812\\-120.1797\\23\\-140.2779\\-118.2266\\23\\-139.0198\\-116.2734\\23\\-138.0744\\-114.3203\\23\\-136.8878\\-112.3672\\23\\-136.0556\\-110.4141\\23\\-133.7891\\-106.8059\\23\\-132.2331\\-104.5547\\23\\-129.8828\\-101.3394\\23\\-127.5595\\-98.69531\\23\\-124.0234\\-95.3985\\23\\-123.2798\\-94.78906\\23\\-118.0099\\-90.88281\\23\\-116.2109\\-89.79429\\23\\-114.2578\\-88.3831\\23\\-112.3047\\-87.70737\\23\\-110.3516\\-86.76363\\23\\-106.4453\\-85.26215\\23\\-104.4922\\-84.30654\\23\\-102.5391\\-83.63634\\23\\-100.5859\\-82.65663\\23\\-96.67969\\-81.46229\\23\\-94.72656\\-80.59592\\23\\-92.77344\\-80.15247\\23\\-88.86719\\-78.88223\\23\\-84.96094\\-77.83006\\23\\-83.00781\\-77.46903\\23\\-81.05469\\-76.89404\\23\\-79.10156\\-76.46487\\23\\-73.24219\\-75.69558\\23\\-71.28906\\-75.09923\\23\\-69.33594\\-74.73649\\23\\-65.42969\\-74.46515\\23\\-59.57031\\-74.25786\\23\\-49.80469\\-74.20384\\23\\-43.94531\\-74.3728\\23\\-40.03906\\-74.63253\\23\\-38.08594\\-75.10057\\23\\-36.13281\\-75.70703\\23\\-30.27344\\-76.3695\\23\\-28.32031\\-76.72266\\23\\-24.41406\\-77.84834\\23\\-22.46094\\-78.28183\\23\\-20.50781\\-78.83854\\23\\-18.55469\\-79.59588\\23\\-14.64844\\-80.67329\\23\\-12.69531\\-81.62937\\23\\-10.74219\\-82.28781\\23\\-8.789063\\-83.32163\\23\\-5.080764\\-85.02344\\23\\-2.929688\\-86.18311\\23\\0.9765625\\-87.11491\\23\\2.929688\\-87.14466\\23\\4.882813\\-86.52734\\23\\6.835938\\-85.79858\\23\\8.789063\\-84.56147\\23\\10.74219\\-83.55217\\23\\12.69531\\-82.33147\\23\\14.64844\\-81.45264\\23\\16.60156\\-80.42675\\23\\18.55469\\-79.6274\\23\\20.50781\\-78.65747\\23\\24.41406\\-77.11098\\23\\26.36719\\-76.42598\\23\\30.27344\\-75.78414\\23\\32.22656\\-75.18139\\23\\34.17969\\-74.69877\\23\\38.08594\\-74.38501\\23\\41.99219\\-74.25813\\23\\45.89844\\-74.18124\\23\\47.85156\\-73.87006\\23\\49.80469\\-73.77747\\23\\53.71094\\-73.77747\\23\\55.66406\\-74.15771\\23\\59.57031\\-74.20657\\23\\65.42969\\-74.3783\\23\\69.33594\\-74.59562\\23\\71.28906\\-74.79523\\23\\75.19531\\-75.69991\\23\\81.05469\\-76.32575\\23\\83.00781\\-76.59904\\23\\86.91406\\-77.63306\\23\\90.82031\\-78.446\\23\\94.72656\\-79.67269\\23\\98.63281\\-80.6947\\23\\100.5859\\-81.58512\\23\\102.5391\\-82.10574\\23\\104.4922\\-82.75642\\23\\106.4453\\-83.75042\\23\\108.3984\\-84.47121\\23\\110.3516\\-85.58781\\23\\112.3047\\-86.3195\\23\\114.2578\\-87.43323\\23\\116.2109\\-88.28529\\23\\119.7917\\-90.88281\\23\\122.1637\\-92.83594\\23\\124.0234\\-94.64837\\23\\125.9766\\-96.81928\\23\\128.9192\\-100.6484\\23\\130.272\\-102.6016\\23\\131.2657\\-104.5547\\23\\132.6439\\-106.5078\\23\\133.8711\\-108.4609\\23\\135.7422\\-111.9788\\23\\136.0031\\-112.3672\\23\\136.7971\\-114.3203\\23\\137.8439\\-116.2734\\23\\138.7458\\-118.2266\\23\\139.8875\\-120.1797\\23\\140.7341\\-122.1328\\23\\141.6855\\-124.0859\\23\\142.4568\\-126.0391\\23\\142.9938\\-127.9922\\23\\143.9676\\-129.9453\\23\\144.5473\\-131.8984\\23\\145.2421\\-133.8516\\23\\146.2176\\-135.8047\\23\\146.8003\\-137.7578\\23\\147.6548\\-139.7109\\23\\148.2669\\-141.6641\\23\\148.6662\\-143.6172\\23\\149.2248\\-145.5703\\23\\149.9318\\-147.5234\\23\\150.5983\\-151.4297\\23\\151.0694\\-153.3828\\23\\151.7137\\-155.3359\\23\\152.1022\\-157.2891\\23\\152.7207\\-161.1953\\23\\153.6021\\-165.1016\\23\\154.0744\\-169.0078\\23\\154.6814\\-176.8203\\23\\155.1307\\-184.6328\\23\\155.2814\\-190.4922\\23\\155.2813\\-192.4453\\23\\155.1735\\-196.3516\\23\\154.9456\\-202.2109\\23\\154.4324\\-210.0234\\23\\153.8577\\-215.8828\\23\\153.5073\\-217.8359\\23\\152.9517\\-219.7891\\23\\152.114\\-223.6953\\23\\151.5416\\-225.6484\\23\\150.7141\\-227.6016\\23\\150.2337\\-229.5547\\23\\149.4701\\-231.5078\\23\\148.5831\\-233.4609\\23\\147.8027\\-235.4141\\23\\145.3214\\-239.3203\\23\\144.2312\\-241.2734\\23\\141.6016\\-245.1085\\23\\140.1084\\-247.1328\\23\\137.6953\\-249.887\\23\\133.7891\\-254.0434\\23\\131.8359\\-255.9151\\23\\129.8828\\-257.6811\\23\\128.7124\\-258.8516\\23\\125.9766\\-261.241\\23\\124.0136\\-262.7578\\23\\122.0703\\-264.1519\\23\\118.1641\\-267.3215\\23\\116.2109\\-268.6593\\23\\114.2578\\-269.7804\\23\\112.3047\\-271.1671\\23\\110.3516\\-272.2455\\23\\108.3984\\-273.5343\\23\\106.4453\\-274.6895\\23\\100.5859\\-277.3119\\23\\98.63281\\-278.0689\\23\\96.67969\\-279.082\\23\\94.72656\\-279.7525\\23\\92.77344\\-280.6219\\23\\90.82031\\-281.1927\\23\\88.86719\\-281.6317\\23\\84.96094\\-282.8462\\23\\81.05469\\-283.549\\23\\79.10156\\-284.026\\23\\77.14844\\-284.6687\\23\\73.24219\\-285.4022\\23\\71.28906\\-285.8348\\23\\69.33594\\-286.4677\\23\\67.38281\\-286.8843\\23\\63.47656\\-287.6038\\23\\59.57031\\-288.7344\\23\\55.66406\\-289.3376\\23\\53.71094\\-289.8646\\23\\51.75781\\-290.654\\23\\47.85156\\-291.532\\23\\45.89844\\-292.3802\\23\\41.99219\\-293.322\\23\\38.08594\\-294.5876\\23\\34.17969\\-295.2502\\23\\32.22656\\-295.6708\\23\\30.27344\\-296.3448\\23\\28.32031\\-296.7541\\23\\24.41406\\-297.3669\\23\\20.50781\\-298.4523\\23\\14.64844\\-299.1535\\23\\8.789063\\-299.9619\\23\\4.882813\\-300.2365\\23\\0.9765625\\-300.3045\\23\\-2.929688\\-300.2761\\23\\-6.835938\\-300.1147\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "138" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-300.0542\\25\\-10.74219\\-299.8594\\25\\-12.69531\\-299.555\\25\\-16.60156\\-299.1116\\25\\-22.46094\\-298.4989\\25\\-24.41406\\-298.1732\\25\\-26.36719\\-297.6596\\25\\-28.32031\\-297.3065\\25\\-34.17969\\-296.6331\\25\\-36.13281\\-296.2609\\25\\-38.08594\\-295.7096\\25\\-40.03906\\-295.3287\\25\\-45.89844\\-294.5632\\25\\-47.85156\\-294.1033\\25\\-49.80469\\-293.5225\\25\\-51.75781\\-293.1414\\25\\-55.66406\\-292.4801\\25\\-57.61719\\-291.8415\\25\\-59.57031\\-291.3638\\25\\-63.47656\\-290.8277\\25\\-65.42969\\-290.4834\\25\\-67.38281\\-289.9048\\25\\-69.33594\\-289.4807\\25\\-75.19531\\-288.8592\\25\\-77.14844\\-288.5267\\25\\-81.05469\\-287.5313\\25\\-84.96094\\-286.7475\\25\\-88.86719\\-285.4453\\25\\-90.82031\\-284.9693\\25\\-94.72656\\-283.4484\\25\\-96.67969\\-283.0032\\25\\-98.63281\\-282.1573\\25\\-102.5391\\-280.6706\\25\\-103.0324\\-280.3359\\25\\-106.5549\\-278.3828\\25\\-109.9471\\-276.4297\\25\\-110.3516\\-276.1193\\25\\-112.3047\\-275.1341\\25\\-118.1641\\-271.0111\\25\\-121.4985\\-268.6172\\25\\-123.9958\\-266.6641\\25\\-127.9297\\-263.446\\25\\-129.8828\\-261.7056\\25\\-133.7891\\-257.6958\\25\\-134.646\\-256.8984\\25\\-136.3363\\-254.9453\\25\\-139.1869\\-251.0391\\25\\-140.7654\\-249.0859\\25\\-142.198\\-247.1328\\25\\-143.0698\\-245.1797\\25\\-144.3371\\-243.2266\\25\\-145.3229\\-241.2734\\25\\-146.4412\\-239.3203\\25\\-147.4609\\-237.3003\\25\\-148.3057\\-235.4141\\25\\-148.8928\\-233.4609\\25\\-149.8061\\-231.5078\\25\\-150.7996\\-227.6016\\25\\-151.6509\\-225.6484\\25\\-152.7057\\-221.7422\\25\\-153.4288\\-219.7891\\25\\-153.9656\\-217.8359\\25\\-154.7366\\-213.9297\\25\\-155.7451\\-210.0234\\25\\-156.2209\\-206.1172\\25\\-156.5043\\-202.2109\\25\\-156.9149\\-198.3047\\25\\-157.2027\\-196.3516\\25\\-157.5305\\-192.4453\\25\\-157.6425\\-188.5391\\25\\-157.633\\-184.6328\\25\\-157.5084\\-180.7266\\25\\-157.1723\\-176.8203\\25\\-156.7351\\-172.9141\\25\\-156.0364\\-165.1016\\25\\-155.7483\\-163.1484\\25\\-155.3281\\-161.1953\\25\\-154.8018\\-159.2422\\25\\-154.0719\\-155.3359\\25\\-153.6284\\-153.3828\\25\\-152.8662\\-151.4297\\25\\-151.8784\\-147.5234\\25\\-151.0254\\-145.5703\\25\\-150.4295\\-143.6172\\25\\-149.9949\\-141.6641\\25\\-149.1277\\-139.7109\\25\\-147.9619\\-135.8047\\25\\-146.9695\\-133.8516\\25\\-146.2527\\-131.8984\\25\\-145.1399\\-129.9453\\25\\-144.3988\\-127.9922\\25\\-143.4208\\-126.0391\\25\\-142.6208\\-124.0859\\25\\-141.92\\-122.1328\\25\\-140.8309\\-120.1797\\25\\-139.9672\\-118.2266\\25\\-138.7735\\-116.2734\\25\\-135.7422\\-110.5435\\25\\-134.5591\\-108.4609\\25\\-133.7891\\-107.2717\\25\\-130.4792\\-102.6016\\25\\-128.9278\\-100.6484\\25\\-127.1332\\-98.69531\\25\\-124.0234\\-95.71748\\25\\-122.0703\\-94.14925\\25\\-117.6465\\-90.88281\\25\\-114.2578\\-88.68356\\25\\-110.3516\\-87.09763\\25\\-108.3984\\-86.1802\\25\\-106.4453\\-85.49555\\25\\-104.4922\\-84.49243\\25\\-102.5391\\-83.81744\\25\\-100.5859\\-82.90394\\25\\-98.63281\\-82.20828\\25\\-96.67969\\-81.64925\\25\\-94.72656\\-80.7797\\25\\-92.77344\\-80.26194\\25\\-86.91406\\-78.5558\\25\\-84.96094\\-77.94336\\25\\-83.00781\\-77.61074\\25\\-81.05469\\-77.03655\\25\\-79.10156\\-76.562\\25\\-77.14844\\-76.27506\\25\\-73.24219\\-75.83115\\25\\-69.33594\\-74.83489\\25\\-65.42969\\-74.50612\\25\\-59.57031\\-74.31676\\25\\-47.85156\\-74.2989\\25\\-43.94531\\-74.42523\\25\\-40.03906\\-74.71123\\25\\-38.08594\\-75.35938\\25\\-36.13281\\-75.79335\\25\\-32.22656\\-76.1927\\25\\-30.27344\\-76.44364\\25\\-28.32031\\-76.87213\\25\\-26.36719\\-77.44112\\25\\-22.46094\\-78.32944\\25\\-20.50781\\-78.91658\\25\\-18.55469\\-79.64251\\25\\-14.64844\\-80.71959\\25\\-12.69531\\-81.67619\\25\\-10.74219\\-82.30033\\25\\-8.789063\\-83.32163\\25\\-2.929688\\-85.90047\\25\\-0.9765625\\-86.42114\\25\\0.9765625\\-86.71282\\25\\2.929688\\-86.7902\\25\\4.882813\\-86.33994\\25\\6.835938\\-85.64608\\25\\7.902299\\-85.02344\\25\\10.74219\\-83.59664\\25\\12.69531\\-82.38213\\25\\14.64844\\-81.51801\\25\\16.60156\\-80.48529\\25\\18.55469\\-79.71121\\25\\20.50781\\-78.76733\\25\\22.46094\\-77.97443\\25\\26.36719\\-76.51608\\25\\30.27344\\-75.86206\\25\\32.22656\\-75.38853\\25\\34.17969\\-74.75496\\25\\38.08594\\-74.43775\\25\\41.99219\\-74.29295\\25\\49.80469\\-74.20657\\25\\53.71094\\-74.20657\\25\\59.57031\\-74.26381\\25\\65.42969\\-74.47026\\25\\69.33594\\-74.7232\\25\\71.28906\\-75.02376\\25\\73.24219\\-75.62231\\25\\81.05469\\-76.44744\\25\\83.00781\\-76.79803\\25\\84.96094\\-77.37609\\25\\86.91406\\-77.85235\\25\\90.82031\\-78.63635\\25\\92.77344\\-79.26644\\25\\96.67969\\-80.32259\\25\\98.63281\\-80.92645\\25\\100.5859\\-81.79571\\25\\102.5391\\-82.27801\\25\\106.4453\\-83.95361\\25\\108.3984\\-84.70654\\25\\110.3516\\-85.78693\\25\\112.3047\\-86.53447\\25\\114.2578\\-87.69313\\25\\116.2109\\-88.50912\\25\\118.1641\\-89.91228\\25\\121.7835\\-92.83594\\25\\124.0234\\-95.02907\\25\\125.9766\\-97.27276\\25\\128.6703\\-100.6484\\25\\129.9398\\-102.6016\\25\\130.998\\-104.5547\\25\\132.3876\\-106.5078\\25\\133.4706\\-108.4609\\25\\134.6784\\-110.4141\\25\\136.6217\\-114.3203\\25\\137.4236\\-116.2734\\25\\138.5152\\-118.2266\\25\\139.4371\\-120.1797\\25\\140.5063\\-122.1328\\25\\141.2806\\-124.0859\\25\\142.2547\\-126.0391\\25\\142.787\\-127.9922\\25\\144.3768\\-131.8984\\25\\144.9366\\-133.8516\\25\\145.9754\\-135.8047\\25\\146.564\\-137.7578\\25\\148.0614\\-141.6641\\25\\148.9429\\-145.5703\\25\\149.6434\\-147.5234\\25\\150.142\\-149.4766\\25\\150.7704\\-153.3828\\25\\151.8755\\-157.2891\\25\\152.8291\\-163.1484\\25\\153.6458\\-167.0547\\25\\153.8824\\-169.0078\\25\\154.2222\\-172.9141\\25\\154.5069\\-176.8203\\25\\154.795\\-182.6797\\25\\154.9341\\-186.5859\\25\\154.9854\\-192.4453\\25\\154.7787\\-200.2578\\25\\154.4887\\-206.1172\\25\\154.2429\\-210.0234\\25\\153.8824\\-213.9297\\25\\153.604\\-215.8828\\25\\152.6527\\-219.7891\\25\\151.8729\\-223.6953\\25\\151.0912\\-225.6484\\25\\150.485\\-227.6016\\25\\150.0165\\-229.5547\\25\\149.0766\\-231.5078\\25\\148.3783\\-233.4609\\25\\146.3226\\-237.3672\\25\\144.9169\\-239.3203\\25\\143.903\\-241.2734\\25\\142.5523\\-243.2266\\25\\139.6484\\-247.0557\\25\\136.2231\\-251.0391\\25\\134.3844\\-252.9922\\25\\131.8359\\-255.5023\\25\\127.9297\\-259.0613\\25\\125.8752\\-260.8047\\25\\123.4444\\-262.7578\\25\\118.1641\\-266.8836\\25\\114.2578\\-269.5078\\25\\110.3516\\-271.7718\\25\\108.3984\\-273.1449\\25\\106.4453\\-274.0819\\25\\104.4922\\-275.2215\\25\\102.5391\\-275.8842\\25\\100.5859\\-276.9339\\25\\98.63281\\-277.5681\\25\\96.67969\\-278.5076\\25\\94.72656\\-279.2721\\25\\92.77344\\-279.9202\\25\\90.82031\\-280.7516\\25\\86.91406\\-281.6747\\25\\83.00781\\-282.8462\\25\\79.10156\\-283.4979\\25\\77.14844\\-283.9389\\25\\75.19531\\-284.644\\25\\71.28906\\-285.4173\\25\\69.33594\\-285.9173\\25\\67.38281\\-286.5971\\25\\63.47656\\-287.3706\\25\\61.52344\\-287.8725\\25\\59.57031\\-288.5593\\25\\57.61719\\-288.9743\\25\\55.66406\\-289.282\\25\\53.71094\\-289.7286\\25\\51.75781\\-290.5781\\25\\47.85156\\-291.4799\\25\\45.89844\\-292.3365\\25\\41.99219\\-293.308\\25\\40.01872\\-294.0078\\25\\38.08594\\-294.5913\\25\\34.17969\\-295.2749\\25\\32.22656\\-295.7222\\25\\30.27344\\-296.4001\\25\\28.32031\\-296.7957\\25\\24.41406\\-297.4289\\25\\22.46094\\-298.0361\\25\\20.50781\\-298.5284\\25\\14.64844\\-299.2291\\25\\8.789063\\-300.091\\25\\4.882813\\-300.2979\\25\\0.9765625\\-300.3729\\25\\-4.882813\\-300.2761\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "309" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "139" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-299.948\\27\\-12.69531\\-299.637\\27\\-16.60156\\-299.1584\\27\\-22.46094\\-298.5355\\27\\-24.41406\\-298.207\\27\\-26.36719\\-297.6855\\27\\-28.32031\\-297.3224\\27\\-34.17969\\-296.6405\\27\\-36.13281\\-296.2726\\27\\-38.08594\\-295.683\\27\\-40.03906\\-295.3243\\27\\-43.94531\\-294.8274\\27\\-45.89844\\-294.5241\\27\\-49.80469\\-293.4621\\27\\-53.71094\\-292.7645\\27\\-55.66406\\-292.3477\\27\\-57.61719\\-291.6628\\27\\-59.57031\\-291.2508\\27\\-63.47656\\-290.6776\\27\\-67.38281\\-289.6101\\27\\-69.33594\\-289.3285\\27\\-73.24219\\-288.9114\\27\\-75.19531\\-288.6169\\27\\-79.10156\\-287.6221\\27\\-83.00781\\-286.8811\\27\\-84.96094\\-286.3581\\27\\-86.91406\\-285.6348\\27\\-90.82031\\-284.6036\\27\\-92.77344\\-283.7067\\27\\-96.67969\\-282.7086\\27\\-98.63281\\-281.7908\\27\\-100.5859\\-281.1788\\27\\-102.3784\\-280.3359\\27\\-104.4922\\-279.2239\\27\\-106.4453\\-277.9748\\27\\-108.3984\\-277.0827\\27\\-110.3516\\-275.7946\\27\\-112.3047\\-274.7876\\27\\-114.2578\\-273.4598\\27\\-116.2109\\-271.9131\\27\\-118.1641\\-270.5453\\27\\-120.1172\\-269.3303\\27\\-122.0703\\-267.8088\\27\\-125.9766\\-264.5899\\27\\-127.9297\\-263.1323\\27\\-129.8828\\-261.3863\\27\\-133.7891\\-257.39\\27\\-134.3276\\-256.8984\\27\\-136.0421\\-254.9453\\27\\-137.3528\\-252.9922\\27\\-138.8307\\-251.0391\\27\\-140.5119\\-249.0859\\27\\-141.8732\\-247.1328\\27\\-142.8462\\-245.1797\\27\\-144.0717\\-243.2266\\27\\-144.9507\\-241.2734\\27\\-146.183\\-239.3203\\27\\-147.0584\\-237.3672\\27\\-148.114\\-235.4141\\27\\-148.6863\\-233.4609\\27\\-149.5007\\-231.5078\\27\\-150.1657\\-229.5547\\27\\-150.5871\\-227.6016\\27\\-151.2375\\-225.6484\\27\\-151.9981\\-223.6953\\27\\-152.4586\\-221.7422\\27\\-153.0172\\-219.7891\\27\\-153.7371\\-217.8359\\27\\-154.9364\\-211.9766\\27\\-155.4598\\-210.0234\\27\\-155.8581\\-208.0703\\27\\-156.2442\\-204.1641\\27\\-156.497\\-200.2578\\27\\-157.1568\\-192.4453\\27\\-157.3351\\-188.5391\\27\\-157.2641\\-182.6797\\27\\-157.142\\-180.7266\\27\\-156.6554\\-174.8672\\27\\-156.2266\\-169.0078\\27\\-155.8268\\-165.1016\\27\\-154.5485\\-159.2422\\27\\-153.8493\\-155.3359\\27\\-152.5879\\-151.4297\\27\\-151.5542\\-147.5234\\27\\-150.7263\\-145.5703\\27\\-150.265\\-143.6172\\27\\-149.6983\\-141.6641\\27\\-148.8532\\-139.7109\\27\\-148.3244\\-137.7578\\27\\-147.6534\\-135.8047\\27\\-146.674\\-133.8516\\27\\-145.9619\\-131.8984\\27\\-144.8393\\-129.9453\\27\\-144.1643\\-127.9922\\27\\-143.1013\\-126.0391\\27\\-142.4377\\-124.0859\\27\\-140.6024\\-120.1797\\27\\-139.5068\\-118.2266\\27\\-137.6953\\-114.8037\\27\\-137.3382\\-114.3203\\27\\-136.5171\\-112.3672\\27\\-135.2952\\-110.4141\\27\\-134.3175\\-108.4609\\27\\-131.4499\\-104.5547\\27\\-130.2279\\-102.6016\\27\\-128.5926\\-100.6484\\27\\-126.7616\\-98.69531\\27\\-124.6807\\-96.74219\\27\\-124.0234\\-96.02008\\27\\-122.0703\\-94.37366\\27\\-120.1172\\-93.06432\\27\\-118.1641\\-91.51263\\27\\-116.2109\\-90.14397\\27\\-112.3047\\-88.06654\\27\\-110.3516\\-87.40022\\27\\-108.3984\\-86.35947\\27\\-106.4453\\-85.6805\\27\\-104.4922\\-84.7112\\27\\-102.5391\\-83.99043\\27\\-98.63281\\-82.33012\\27\\-96.67969\\-81.81654\\27\\-94.72656\\-80.99905\\27\\-92.77344\\-80.38168\\27\\-88.86719\\-79.43574\\27\\-86.91406\\-78.69409\\27\\-84.96094\\-78.05433\\27\\-83.00781\\-77.73052\\27\\-79.10156\\-76.69393\\27\\-77.14844\\-76.3356\\27\\-73.24219\\-75.91896\\27\\-71.28906\\-75.57626\\27\\-69.33594\\-74.98926\\27\\-67.38281\\-74.70894\\27\\-63.47656\\-74.46515\\27\\-57.61719\\-74.33484\\27\\-53.71094\\-74.37711\\27\\-47.85156\\-74.34756\\27\\-43.94531\\-74.47527\\27\\-40.03906\\-74.7506\\27\\-38.08594\\-75.43329\\27\\-36.13281\\-75.84872\\27\\-32.22656\\-76.25246\\27\\-30.27344\\-76.5181\\27\\-26.36719\\-77.57141\\27\\-22.46094\\-78.4673\\27\\-20.50781\\-79.02863\\27\\-18.55469\\-79.71017\\27\\-14.64844\\-80.78217\\27\\-12.69531\\-81.73083\\27\\-10.74219\\-82.32056\\27\\-8.789063\\-83.33405\\27\\-6.835938\\-84.15213\\27\\-2.929688\\-85.608\\27\\-0.9765625\\-86.12865\\27\\0.9765625\\-86.38344\\27\\2.929688\\-86.44785\\27\\4.882813\\-86.1618\\27\\6.835938\\-85.46605\\27\\7.667336\\-85.02344\\27\\10.74219\\-83.63998\\27\\12.69531\\-82.47389\\27\\14.64844\\-81.68007\\27\\16.60156\\-80.5732\\27\\18.55469\\-79.87721\\27\\20.50781\\-78.84925\\27\\22.46094\\-78.04546\\27\\26.36719\\-76.6124\\27\\28.32031\\-76.19971\\27\\30.27344\\-75.91085\\27\\32.22656\\-75.45909\\27\\34.17969\\-74.81461\\27\\36.13281\\-74.6227\\27\\40.03906\\-74.39722\\27\\45.89844\\-74.28713\\27\\51.75781\\-74.24658\\27\\59.57031\\-74.31676\\27\\63.47656\\-74.47026\\27\\67.38281\\-74.70279\\27\\69.33594\\-74.92454\\27\\71.28906\\-75.47236\\27\\73.24219\\-75.79682\\27\\77.14844\\-76.13672\\27\\81.05469\\-76.6124\\27\\83.00781\\-77.05903\\27\\84.96094\\-77.62312\\27\\88.86719\\-78.38839\\27\\90.82031\\-78.85602\\27\\92.77344\\-79.47744\\27\\94.72656\\-79.90968\\27\\96.67969\\-80.49345\\27\\98.63281\\-81.27866\\27\\100.5859\\-81.94817\\27\\102.5391\\-82.45918\\27\\104.4922\\-83.39354\\27\\106.4453\\-84.14508\\27\\110.3516\\-85.97128\\27\\112.3047\\-86.79161\\27\\114.2578\\-87.85485\\27\\116.2109\\-88.77884\\27\\118.1641\\-90.13208\\27\\121.4554\\-92.83594\\27\\124.0234\\-95.36578\\27\\126.8281\\-98.69531\\27\\128.4038\\-100.6484\\27\\129.5499\\-102.6016\\27\\132.0569\\-106.5078\\27\\133.1401\\-108.4609\\27\\134.4538\\-110.4141\\27\\135.3277\\-112.3672\\27\\136.4379\\-114.3203\\27\\137.1107\\-116.2734\\27\\138.3028\\-118.2266\\27\\139.0983\\-120.1797\\27\\140.2602\\-122.1328\\27\\140.9763\\-124.0859\\27\\142.0152\\-126.0391\\27\\143.2221\\-129.9453\\27\\144.1515\\-131.8984\\27\\144.6893\\-133.8516\\27\\145.6299\\-135.8047\\27\\146.35\\-137.7578\\27\\146.9603\\-139.7109\\27\\147.8214\\-141.6641\\27\\148.7273\\-145.5703\\27\\149.268\\-147.5234\\27\\149.9318\\-149.4766\\27\\150.5692\\-153.3828\\27\\150.944\\-155.3359\\27\\151.591\\-157.2891\\27\\152.0165\\-159.2422\\27\\152.9108\\-165.1016\\27\\153.6794\\-169.0078\\27\\153.9063\\-170.9609\\27\\154.3349\\-176.8203\\27\\154.6043\\-182.6797\\27\\154.7038\\-186.5859\\27\\154.7471\\-192.4453\\27\\154.5498\\-200.2578\\27\\154.3985\\-204.1641\\27\\154.189\\-208.0703\\27\\153.8824\\-211.9766\\27\\153.6351\\-213.9297\\27\\152.7817\\-217.8359\\27\\152.0751\\-221.7422\\27\\151.5416\\-223.6953\\27\\150.7629\\-225.6484\\27\\150.3125\\-227.6016\\27\\149.7251\\-229.5547\\27\\148.7997\\-231.5078\\27\\148.1384\\-233.4609\\27\\146.9791\\-235.4141\\27\\146.0215\\-237.3672\\27\\144.593\\-239.3203\\27\\142.2549\\-243.2266\\27\\140.7463\\-245.1797\\27\\137.6953\\-248.8196\\27\\135.7167\\-251.0391\\27\\133.8743\\-252.9922\\27\\131.8359\\-254.9539\\27\\129.7141\\-256.8984\\27\\125.9766\\-260.2282\\27\\124.0234\\-261.889\\27\\120.1172\\-264.9226\\27\\114.2578\\-269.2217\\27\\112.3047\\-270.0958\\27\\111.6808\\-270.5703\\27\\108.3984\\-272.6196\\27\\104.9389\\-274.4766\\27\\104.4922\\-274.7876\\27\\100.5859\\-276.2969\\27\\98.63281\\-277.2003\\27\\96.67969\\-277.8095\\27\\94.72656\\-278.7897\\27\\90.82031\\-280.05\\27\\88.86719\\-280.8178\\27\\84.96094\\-281.6926\\27\\81.05469\\-282.8555\\27\\79.10156\\-283.1721\\27\\77.14844\\-283.3816\\27\\75.19531\\-283.9411\\27\\73.24219\\-284.6755\\27\\69.33594\\-285.4986\\27\\65.42969\\-286.7688\\27\\61.52344\\-287.6255\\27\\59.57031\\-288.3598\\27\\57.61719\\-288.887\\27\\53.71094\\-289.6165\\27\\51.75781\\-290.4733\\27\\47.85156\\-291.4238\\27\\45.89844\\-292.2664\\27\\43.94531\\-292.845\\27\\41.99219\\-293.2971\\27\\40.03906\\-294.0156\\27\\38.08594\\-294.5999\\27\\34.17969\\-295.2911\\27\\32.22656\\-295.7746\\27\\30.27344\\-296.4524\\27\\28.32031\\-296.8342\\27\\26.36719\\-297.1064\\27\\24.41406\\-297.4892\\27\\22.46094\\-298.1616\\27\\20.50781\\-298.5736\\27\\14.64844\\-299.2985\\27\\10.74219\\-299.9338\\27\\8.789063\\-300.1602\\27\\6.835938\\-300.2857\\27\\0.9765625\\-300.4211\\27\\-4.882813\\-300.3257\\27\\-8.789063\\-300.1377\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "302" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "140" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-300.0026\\29\\-16.60156\\-299.2072\\29\\-22.46094\\-298.5702\\29\\-24.41406\\-298.2502\\29\\-26.36719\\-297.723\\29\\-28.32031\\-297.3304\\29\\-34.17969\\-296.6405\\29\\-36.13281\\-296.2609\\29\\-38.08594\\-295.6588\\29\\-40.03906\\-295.312\\29\\-43.94531\\-294.8042\\29\\-45.89844\\-294.4803\\29\\-49.80469\\-293.3919\\29\\-53.71094\\-292.6829\\29\\-57.61719\\-291.532\\29\\-59.57031\\-291.1448\\29\\-61.52344\\-290.8584\\29\\-63.47656\\-290.463\\29\\-65.42969\\-289.8236\\29\\-67.38281\\-289.4209\\29\\-71.28906\\-288.9999\\29\\-73.24219\\-288.7255\\29\\-77.14844\\-287.7355\\29\\-79.10156\\-287.317\\29\\-81.05469\\-287.003\\29\\-83.00781\\-286.5772\\29\\-84.96094\\-285.8396\\29\\-88.86719\\-284.8661\\29\\-90.82031\\-284.0844\\29\\-92.77344\\-283.4237\\29\\-94.72656\\-283.023\\29\\-98.63281\\-281.5261\\29\\-100.5859\\-280.9086\\29\\-102.5391\\-279.8096\\29\\-104.4922\\-278.9469\\29\\-106.4453\\-277.6562\\29\\-108.3984\\-276.7942\\29\\-110.3516\\-275.5356\\29\\-114.2578\\-273.1647\\29\\-118.1641\\-270.1355\\29\\-120.1172\\-269.0235\\29\\-122.0703\\-267.5398\\29\\-124.0234\\-265.8049\\29\\-125.9766\\-264.1714\\29\\-127.8658\\-262.7578\\29\\-129.8828\\-261.0099\\29\\-133.9297\\-256.8984\\29\\-135.7422\\-254.8255\\29\\-137.0124\\-252.9922\\29\\-140.2306\\-249.0859\\29\\-142.6338\\-245.1797\\29\\-143.7529\\-243.2266\\29\\-144.6959\\-241.2734\\29\\-145.9173\\-239.3203\\29\\-146.7768\\-237.3672\\29\\-147.8795\\-235.4141\\29\\-149.1298\\-231.5078\\29\\-149.973\\-229.5547\\29\\-150.8951\\-225.6484\\29\\-151.7365\\-223.6953\\29\\-152.7092\\-219.7891\\29\\-153.4433\\-217.8359\\29\\-153.9621\\-215.8828\\29\\-154.6863\\-211.9766\\29\\-155.6405\\-208.0703\\29\\-156.1182\\-204.1641\\29\\-156.3806\\-200.2578\\29\\-156.5775\\-196.3516\\29\\-156.8453\\-192.4453\\29\\-156.9526\\-188.5391\\29\\-156.9033\\-182.6797\\29\\-156.7036\\-178.7734\\29\\-156.2442\\-170.9609\\29\\-155.867\\-167.0547\\29\\-155.5535\\-165.1016\\29\\-155.0475\\-163.1484\\29\\-154.0028\\-157.2891\\29\\-153.556\\-155.3359\\29\\-152.8568\\-153.3828\\29\\-151.8755\\-149.4766\\29\\-151.0791\\-147.5234\\29\\-150.5099\\-145.5703\\29\\-150.0754\\-143.6172\\29\\-148.6241\\-139.7109\\29\\-148.0976\\-137.7578\\29\\-146.424\\-133.8516\\29\\-144.596\\-129.9453\\29\\-143.8779\\-127.9922\\29\\-142.8672\\-126.0391\\29\\-142.2463\\-124.0859\\29\\-141.2096\\-122.1328\\29\\-140.3677\\-120.1797\\29\\-139.1197\\-118.2266\\29\\-138.2478\\-116.2734\\29\\-137.0465\\-114.3203\\29\\-136.2877\\-112.3672\\29\\-135.0473\\-110.4141\\29\\-133.9713\\-108.4609\\29\\-132.6005\\-106.5078\\29\\-130.998\\-104.5547\\29\\-129.8828\\-102.6341\\29\\-128.294\\-100.6484\\29\\-126.4648\\-98.69531\\29\\-124.0234\\-96.32257\\29\\-122.0703\\-94.65072\\29\\-120.1172\\-93.36286\\29\\-116.2109\\-90.37721\\29\\-114.2578\\-89.46416\\29\\-112.3047\\-88.272\\29\\-110.3516\\-87.612\\29\\-108.3984\\-86.55054\\29\\-106.4453\\-85.84976\\29\\-102.5391\\-84.15977\\29\\-100.5859\\-83.43819\\29\\-98.63281\\-82.48179\\29\\-96.67969\\-81.95159\\29\\-92.77344\\-80.51968\\29\\-88.86719\\-79.65894\\29\\-86.91406\\-78.86713\\29\\-84.96094\\-78.29276\\29\\-81.05469\\-77.39178\\29\\-79.10156\\-76.83227\\29\\-77.14844\\-76.40635\\29\\-73.24219\\-75.99763\\29\\-69.33594\\-75.45757\\29\\-67.38281\\-74.77326\\29\\-61.52344\\-74.43775\\29\\-57.61719\\-74.39043\\29\\-51.75781\\-74.38501\\29\\-47.85156\\-74.41809\\29\\-43.94531\\-74.56412\\29\\-41.99219\\-74.70295\\29\\-40.03906\\-75.01781\\29\\-38.08594\\-75.66357\\29\\-32.22656\\-76.3339\\29\\-30.27344\\-76.62223\\29\\-26.36719\\-77.71753\\29\\-24.41406\\-78.1052\\29\\-22.46094\\-78.59578\\29\\-18.55469\\-79.7923\\29\\-16.60156\\-80.23094\\29\\-14.64844\\-80.87119\\29\\-12.69531\\-81.78776\\29\\-10.74219\\-82.37096\\29\\-8.789063\\-83.3463\\29\\-2.929688\\-85.39849\\29\\-0.9765625\\-85.76058\\29\\0.9765625\\-85.95087\\29\\2.929688\\-86.03639\\29\\4.882813\\-85.88547\\29\\6.835938\\-85.33681\\29\\10.74219\\-83.66122\\29\\12.69531\\-82.56223\\29\\14.64844\\-81.79571\\29\\16.60156\\-80.67329\\29\\18.55469\\-80.01245\\29\\20.50781\\-78.96462\\29\\22.46094\\-78.14015\\29\\24.41406\\-77.4949\\29\\26.36719\\-76.69662\\29\\28.32031\\-76.24019\\29\\32.22656\\-75.66306\\29\\34.17969\\-74.97765\\29\\36.13281\\-74.70894\\29\\38.08594\\-74.56026\\29\\41.99219\\-74.39181\\29\\49.80469\\-74.29295\\29\\55.66406\\-74.31066\\29\\59.57031\\-74.39043\\29\\63.47656\\-74.55653\\29\\67.38281\\-74.86871\\29\\69.33594\\-75.44276\\29\\71.28906\\-75.73967\\29\\77.14844\\-76.25161\\29\\79.10156\\-76.49358\\29\\81.05469\\-76.85046\\29\\84.96094\\-77.8256\\29\\88.86719\\-78.6151\\29\\90.84744\\-79.16406\\29\\96.67969\\-80.68392\\29\\98.63281\\-81.53967\\29\\102.5391\\-82.6623\\29\\104.4922\\-83.63634\\29\\106.4453\\-84.36315\\29\\108.3984\\-85.35128\\29\\110.3516\\-86.13021\\29\\114.2578\\-87.97769\\29\\115.9397\\-88.92969\\29\\118.1641\\-90.39117\\29\\118.6523\\-90.88281\\29\\121.1448\\-92.83594\\29\\124.0234\\-95.69801\\29\\124.8314\\-96.74219\\29\\126.5536\\-98.69531\\29\\128.0658\\-100.6484\\29\\129.2251\\-102.6016\\29\\130.574\\-104.5547\\29\\131.6112\\-106.5078\\29\\134.1656\\-110.4141\\29\\135.0555\\-112.3672\\29\\136.2095\\-114.3203\\29\\136.8776\\-116.2734\\29\\138.0296\\-118.2266\\29\\138.8264\\-120.1797\\29\\139.9867\\-122.1328\\29\\140.7243\\-124.0859\\29\\141.7015\\-126.0391\\29\\142.4568\\-127.9922\\29\\142.9523\\-129.9453\\29\\143.8546\\-131.8984\\29\\145.1868\\-135.8047\\29\\146.1348\\-137.7578\\29\\146.7008\\-139.7109\\29\\147.5135\\-141.6641\\29\\148.1416\\-143.6172\\29\\148.9975\\-147.5234\\29\\149.6691\\-149.4766\\29\\150.1346\\-151.4297\\29\\150.7064\\-155.3359\\29\\151.7831\\-159.2422\\29\\152.1149\\-161.1953\\29\\152.6638\\-165.1016\\29\\153.4011\\-169.0078\\29\\153.6997\\-170.9609\\29\\154.0595\\-174.8672\\29\\154.2753\\-178.7734\\29\\154.4796\\-184.6328\\29\\154.5352\\-188.5391\\29\\154.5352\\-192.4453\\29\\154.3631\\-200.2578\\29\\154.2106\\-204.1641\\29\\153.9951\\-208.0703\\29\\153.648\\-211.9766\\29\\152.8503\\-215.8828\\29\\152.2092\\-219.7891\\29\\151.8046\\-221.7422\\29\\151.0791\\-223.6953\\29\\150.5357\\-225.6484\\29\\150.1346\\-227.6016\\29\\148.5779\\-231.5078\\29\\147.8556\\-233.4609\\29\\147.4609\\-234.0429\\29\\145.5078\\-237.4676\\29\\143.5547\\-240.5657\\29\\143.0114\\-241.2734\\29\\141.9119\\-243.2266\\29\\140.402\\-245.1797\\29\\138.6895\\-247.1328\\29\\137.6953\\-248.3927\\29\\135.2355\\-251.0391\\29\\131.8359\\-254.4605\\29\\129.2504\\-256.8984\\29\\127.9297\\-258.0021\\29\\125.9766\\-259.8219\\29\\124.0234\\-261.5253\\29\\122.0703\\-263.0933\\29\\120.1172\\-264.3684\\29\\116.2109\\-267.444\\29\\114.2578\\-268.8094\\29\\112.3047\\-269.7679\\29\\110.3516\\-271.0235\\29\\108.3984\\-271.9879\\29\\106.4453\\-273.2614\\29\\104.4922\\-274.1533\\29\\102.5391\\-275.1965\\29\\100.5859\\-275.7808\\29\\98.63281\\-276.7481\\29\\94.72656\\-278.055\\29\\92.77344\\-278.9569\\29\\90.82031\\-279.5013\\29\\86.91406\\-280.8529\\29\\83.00781\\-281.7057\\29\\79.10156\\-282.8517\\29\\75.19531\\-283.4979\\29\\73.24219\\-284.0694\\29\\71.28906\\-284.768\\29\\67.38281\\-285.7191\\29\\65.42969\\-286.5013\\29\\61.52344\\-287.4334\\29\\57.61719\\-288.7848\\29\\53.71094\\-289.5058\\29\\51.75781\\-290.3642\\29\\49.80469\\-290.9379\\29\\47.85156\\-291.3663\\29\\45.89844\\-292.2033\\29\\43.94531\\-292.8249\\29\\41.99219\\-293.2834\\29\\40.01953\\-294.0078\\29\\38.08594\\-294.6121\\29\\34.17969\\-295.312\\29\\32.22656\\-295.8312\\29\\30.27344\\-296.5021\\29\\26.36719\\-297.1468\\29\\24.41406\\-297.5644\\29\\22.46094\\-298.2502\\29\\20.50781\\-298.6102\\29\\14.64844\\-299.373\\29\\10.74219\\-300.0158\\29\\6.835938\\-300.3376\\29\\0.9765625\\-300.4712\\29\\-0.9765625\\-300.4599\\29\\-6.835938\\-300.3073\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "287" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "141" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-300.0666\\31\\-16.60156\\-299.2437\\31\\-22.46094\\-298.5901\\31\\-24.41406\\-298.2911\\31\\-26.36719\\-297.761\\31\\-28.32031\\-297.3304\\31\\-34.17969\\-296.6331\\31\\-36.13281\\-296.2247\\31\\-38.08594\\-295.6331\\31\\-40.03906\\-295.2915\\31\\-43.94531\\-294.7809\\31\\-45.89844\\-294.4254\\31\\-49.80469\\-293.3156\\31\\-53.71094\\-292.596\\31\\-57.61719\\-291.3913\\31\\-61.52344\\-290.7403\\31\\-65.42969\\-289.5879\\31\\-71.28906\\-288.8345\\31\\-73.24219\\-288.4623\\31\\-75.19531\\-287.8745\\31\\-77.14844\\-287.4377\\31\\-81.05469\\-286.7429\\31\\-84.96094\\-285.4846\\31\\-86.91406\\-285.0585\\31\\-88.86719\\-284.4897\\31\\-90.82031\\-283.6674\\31\\-94.72656\\-282.7538\\31\\-96.67969\\-281.8804\\31\\-98.63281\\-281.2891\\31\\-100.5859\\-280.5886\\31\\-102.5391\\-279.4997\\31\\-104.4922\\-278.5753\\31\\-106.4453\\-277.4229\\31\\-110.3516\\-275.3199\\31\\-112.3047\\-274.0106\\31\\-114.2578\\-272.8336\\31\\-118.1641\\-269.8775\\31\\-122.0703\\-267.2565\\31\\-125.9766\\-263.8394\\31\\-127.3774\\-262.7578\\31\\-129.5766\\-260.8047\\31\\-133.7891\\-256.5125\\31\\-135.7422\\-254.3512\\31\\-136.7615\\-252.9922\\31\\-139.8803\\-249.0859\\31\\-141.0718\\-247.1328\\31\\-142.4164\\-245.1797\\31\\-143.5547\\-242.9749\\31\\-145.5309\\-239.3203\\31\\-147.4609\\-235.5536\\31\\-148.3257\\-233.4609\\31\\-148.8796\\-231.5078\\31\\-149.7106\\-229.5547\\31\\-150.2664\\-227.6016\\31\\-150.6755\\-225.6484\\31\\-152.0481\\-221.7422\\31\\-152.484\\-219.7891\\31\\-153.0676\\-217.8359\\31\\-153.7631\\-215.8828\\31\\-154.8387\\-210.0234\\31\\-155.3281\\-208.0703\\31\\-155.6977\\-206.1172\\31\\-155.9639\\-204.1641\\31\\-156.2672\\-200.2578\\31\\-156.5975\\-192.4453\\31\\-156.6888\\-186.5859\\31\\-156.6554\\-182.6797\\31\\-156.3414\\-174.8672\\31\\-156.1011\\-170.9609\\31\\-155.6267\\-167.0547\\31\\-154.7659\\-163.1484\\31\\-153.7659\\-157.2891\\31\\-152.5662\\-153.3828\\31\\-152.1267\\-151.4297\\31\\-151.5542\\-149.4766\\31\\-150.7463\\-147.5234\\31\\-149.8198\\-143.6172\\31\\-148.9808\\-141.6641\\31\\-147.8068\\-137.7578\\31\\-146.8762\\-135.8047\\31\\-146.1721\\-133.8516\\31\\-145.0949\\-131.8984\\31\\-144.3586\\-129.9453\\31\\-143.4515\\-127.9922\\31\\-142.6575\\-126.0391\\31\\-141.9908\\-124.0859\\31\\-140.9168\\-122.1328\\31\\-140.0773\\-120.1797\\31\\-138.8281\\-118.2266\\31\\-137.9544\\-116.2734\\31\\-136.8225\\-114.3203\\31\\-135.9769\\-112.3672\\31\\-133.7891\\-108.7273\\31\\-132.3135\\-106.5078\\31\\-130.7488\\-104.5547\\31\\-129.8828\\-103.2307\\31\\-127.9297\\-100.6968\\31\\-126.0517\\-98.69531\\31\\-124.0143\\-96.74219\\31\\-121.7954\\-94.78906\\31\\-120.1172\\-93.6881\\31\\-118.1641\\-92.12856\\31\\-116.2109\\-90.6875\\31\\-114.2578\\-89.68233\\31\\-112.3047\\-88.50912\\31\\-110.3516\\-87.77966\\31\\-108.3984\\-86.83273\\31\\-104.4922\\-85.32554\\31\\-102.5391\\-84.3317\\31\\-100.5859\\-83.63794\\31\\-98.63281\\-82.70582\\31\\-94.72656\\-81.46904\\31\\-92.77344\\-80.66281\\31\\-88.86719\\-79.77917\\31\\-84.96094\\-78.44791\\31\\-83.00781\\-77.92625\\31\\-81.05469\\-77.53191\\31\\-79.10156\\-76.96504\\31\\-77.14844\\-76.51608\\31\\-75.19531\\-76.25805\\31\\-69.33594\\-75.66306\\31\\-67.38281\\-74.85938\\31\\-65.42969\\-74.68462\\31\\-59.57031\\-74.46515\\31\\-53.71094\\-74.43577\\31\\-49.80469\\-74.47531\\31\\-43.94531\\-74.67046\\31\\-41.99219\\-74.87191\\31\\-40.03906\\-75.52746\\31\\-38.08594\\-75.81311\\31\\-32.22656\\-76.42069\\31\\-30.27344\\-76.80293\\31\\-26.36719\\-77.84834\\31\\-24.41406\\-78.21494\\31\\-22.46094\\-78.71108\\31\\-20.50781\\-79.40636\\31\\-18.55469\\-79.86597\\31\\-16.60156\\-80.1463\\31\\-12.69531\\-81.88717\\31\\-10.74219\\-82.42984\\31\\-8.789063\\-83.38421\\31\\-2.929688\\-85.14063\\31\\-0.9765625\\-85.38698\\31\\2.929688\\-85.61069\\31\\4.882813\\-85.54826\\31\\6.835938\\-85.14063\\31\\10.74219\\-83.6861\\31\\12.69531\\-82.6295\\31\\14.64844\\-81.86213\\31\\16.60156\\-80.79166\\31\\18.55469\\-80.08569\\31\\22.46094\\-78.25381\\31\\24.41406\\-77.62385\\31\\26.36719\\-76.79436\\31\\28.32031\\-76.32262\\31\\32.22656\\-75.82027\\31\\36.13281\\-74.82631\\31\\40.03906\\-74.54341\\31\\45.89844\\-74.39043\\31\\49.80469\\-74.34675\\31\\55.66406\\-74.37167\\31\\59.57031\\-74.47026\\31\\65.42969\\-74.82963\\31\\67.38281\\-75.18139\\31\\69.33594\\-75.70112\\31\\73.24219\\-76.00947\\31\\77.14844\\-76.39321\\31\\79.10156\\-76.68117\\31\\83.00781\\-77.60786\\31\\86.91406\\-78.37299\\31\\88.86719\\-78.8601\\31\\90.82031\\-79.46065\\31\\94.72656\\-80.35369\\31\\96.67969\\-80.94033\\31\\98.63281\\-81.74451\\31\\100.5859\\-82.22906\\31\\102.5391\\-82.91495\\31\\104.4922\\-83.82921\\31\\106.4453\\-84.56852\\31\\108.3984\\-85.58781\\31\\110.3516\\-86.31522\\31\\112.3047\\-87.36861\\31\\114.2578\\-88.12954\\31\\118.1641\\-90.73438\\31\\120.7854\\-92.83594\\31\\122.8275\\-94.78906\\31\\124.0234\\-96.05859\\31\\126.2059\\-98.69531\\31\\127.9297\\-101.0255\\31\\130.2973\\-104.5547\\31\\131.25\\-106.5078\\31\\132.6344\\-108.4609\\31\\133.7891\\-110.4252\\31\\135.7422\\-114.0846\\31\\137.6953\\-118.3446\\31\\139.6484\\-122.2142\\31\\141.3176\\-126.0391\\31\\142.2631\\-127.9922\\31\\142.7601\\-129.9453\\31\\143.4673\\-131.8984\\31\\144.2914\\-133.8516\\31\\144.8864\\-135.8047\\31\\145.8589\\-137.7578\\31\\147.14\\-141.6641\\31\\147.9523\\-143.6172\\31\\148.7903\\-147.5234\\31\\149.9509\\-151.4297\\31\\150.5388\\-155.3359\\31\\150.9012\\-157.2891\\31\\151.4893\\-159.2422\\31\\151.9165\\-161.1953\\31\\152.7207\\-167.0547\\31\\153.7292\\-172.9141\\31\\154.0232\\-176.8203\\31\\154.2115\\-180.7266\\31\\154.324\\-184.6328\\31\\154.3741\\-188.5391\\31\\154.3521\\-192.4453\\31\\154.1842\\-200.2578\\31\\153.9362\\-206.1172\\31\\153.8057\\-208.0703\\31\\153.2974\\-211.9766\\31\\152.9108\\-213.9297\\31\\151.9843\\-219.7891\\31\\150.7583\\-223.6953\\31\\149.9089\\-227.6016\\31\\149.0054\\-229.5547\\31\\148.3783\\-231.5078\\31\\147.4842\\-233.4609\\31\\146.4063\\-235.4141\\31\\145.1269\\-237.3672\\31\\144.0845\\-239.3203\\31\\142.7221\\-241.2734\\31\\141.6016\\-243.0391\\31\\140.0542\\-245.1797\\31\\139.6484\\-245.5743\\31\\137.6953\\-247.9688\\31\\134.8465\\-251.0391\\31\\133.7891\\-252.0219\\31\\131.8359\\-254.0453\\31\\129.8828\\-255.9219\\31\\127.9297\\-257.5978\\31\\124.0234\\-261.1577\\31\\121.9295\\-262.7578\\31\\120.1172\\-263.9583\\31\\116.2109\\-267.0727\\31\\114.2578\\-268.2308\\31\\112.3047\\-269.4873\\31\\110.3516\\-270.4645\\31\\106.4453\\-272.7898\\31\\104.4922\\-273.6666\\31\\102.5391\\-274.7587\\31\\98.63281\\-276.0779\\31\\96.67969\\-277.003\\31\\94.72656\\-277.5304\\31\\90.82031\\-279.0624\\31\\88.86719\\-279.5695\\31\\84.96094\\-280.9144\\31\\81.05469\\-281.7451\\31\\77.14844\\-282.8866\\31\\73.24219\\-283.6053\\31\\69.33594\\-284.9472\\31\\67.38281\\-285.4363\\31\\63.47656\\-286.8298\\31\\61.52344\\-287.281\\31\\59.57031\\-287.9115\\31\\57.61719\\-288.6758\\31\\53.71094\\-289.4445\\31\\51.75781\\-290.2523\\31\\49.80469\\-290.8877\\31\\47.85156\\-291.3392\\31\\45.89844\\-292.1632\\31\\43.94531\\-292.8148\\31\\41.99219\\-293.2767\\31\\38.08594\\-294.6326\\31\\34.17969\\-295.3332\\31\\30.27344\\-296.5493\\31\\26.36719\\-297.1884\\31\\24.41406\\-297.6578\\31\\22.46094\\-298.301\\31\\20.50781\\-298.6391\\31\\14.64844\\-299.4478\\31\\10.74219\\-300.091\\31\\6.835938\\-300.3759\\31\\4.882813\\-300.4474\\31\\-0.9765625\\-300.5014\\31\\-6.835938\\-300.3555\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "297" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "142" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-12.69531\\-299.8899\\33\\-16.60156\\-299.2937\\33\\-22.46094\\-298.6256\\33\\-24.41406\\-298.3394\\33\\-28.32031\\-297.342\\33\\-34.17969\\-296.6139\\33\\-36.13281\\-296.1979\\33\\-38.08594\\-295.6102\\33\\-40.03906\\-295.2669\\33\\-43.94531\\-294.7388\\33\\-45.89844\\-294.3575\\33\\-47.85156\\-293.7354\\33\\-49.80469\\-293.2379\\33\\-53.71094\\-292.5077\\33\\-55.66406\\-291.7729\\33\\-57.61719\\-291.2784\\33\\-61.52344\\-290.5781\\33\\-63.47656\\-289.8773\\33\\-65.42969\\-289.4366\\33\\-69.33594\\-288.9622\\33\\-71.28906\\-288.6301\\33\\-75.19531\\-287.5686\\33\\-79.10156\\-286.8409\\33\\-81.05469\\-286.3947\\33\\-83.00781\\-285.6804\\33\\-86.91406\\-284.7897\\33\\-88.86719\\-283.9803\\33\\-90.82031\\-283.4189\\33\\-92.77344\\-283.0305\\33\\-96.67969\\-281.5986\\33\\-98.63281\\-281.0478\\33\\-102.5391\\-279.2393\\33\\-104.4922\\-278.1028\\33\\-106.4453\\-277.1982\\33\\-108.3984\\-276.0122\\33\\-110.3516\\-275.0944\\33\\-111.1698\\-274.4766\\33\\-116.2109\\-271.0866\\33\\-120.1172\\-268.2171\\33\\-122.0703\\-266.9154\\33\\-124.6109\\-264.7109\\33\\-126.9757\\-262.7578\\33\\-129.8828\\-260.0811\\33\\-131.0298\\-258.8516\\33\\-133.0119\\-256.8984\\33\\-134.8852\\-254.9453\\33\\-136.5222\\-252.9922\\33\\-139.6484\\-248.8057\\33\\-142.194\\-245.1797\\33\\-143.0491\\-243.2266\\33\\-144.2686\\-241.2734\\33\\-145.1185\\-239.3203\\33\\-146.2992\\-237.3672\\33\\-148.1379\\-233.4609\\33\\-148.6709\\-231.5078\\33\\-150.1194\\-227.6016\\33\\-150.501\\-225.6484\\33\\-151.0302\\-223.6953\\33\\-151.8409\\-221.7422\\33\\-152.7817\\-217.8359\\33\\-153.4947\\-215.8828\\33\\-153.9621\\-213.9297\\33\\-154.6244\\-210.0234\\33\\-155.4312\\-206.1172\\33\\-155.7584\\-204.1641\\33\\-156.1435\\-200.2578\\33\\-156.2442\\-198.3047\\33\\-156.4442\\-192.4453\\33\\-156.497\\-188.5391\\33\\-156.497\\-184.6328\\33\\-156.4374\\-180.7266\\33\\-156.3017\\-176.8203\\33\\-156.0872\\-172.9141\\33\\-155.6764\\-169.0078\\33\\-154.8626\\-165.1016\\33\\-153.9039\\-159.2422\\33\\-153.4158\\-157.2891\\33\\-152.7751\\-155.3359\\33\\-151.8729\\-151.4297\\33\\-151.0771\\-149.4766\\33\\-150.5309\\-147.5234\\33\\-150.1237\\-145.5703\\33\\-148.7317\\-141.6641\\33\\-148.1995\\-139.7109\\33\\-146.5766\\-135.8047\\33\\-145.8506\\-133.8516\\33\\-144.7783\\-131.8984\\33\\-144.1239\\-129.9453\\33\\-143.0835\\-127.9922\\33\\-142.4744\\-126.0391\\33\\-141.6095\\-124.0859\\33\\-139.6563\\-120.1797\\33\\-137.5184\\-116.2734\\33\\-136.6205\\-114.3203\\33\\-134.5667\\-110.4141\\33\\-133.1712\\-108.4609\\33\\-131.9074\\-106.5078\\33\\-130.5272\\-104.5547\\33\\-127.9297\\-101.1929\\33\\-125.5383\\-98.69531\\33\\-123.5672\\-96.74219\\33\\-121.3503\\-94.78906\\33\\-118.1641\\-92.3726\\33\\-116.0265\\-90.88281\\33\\-112.3047\\-88.84235\\33\\-110.3516\\-87.94052\\33\\-108.3984\\-87.17188\\33\\-106.4453\\-86.23553\\33\\-104.4922\\-85.56245\\33\\-102.5391\\-84.53212\\33\\-100.5859\\-83.80855\\33\\-96.67969\\-82.20155\\33\\-94.72656\\-81.70571\\33\\-92.77344\\-80.84345\\33\\-88.86719\\-79.87601\\33\\-86.91406\\-79.29688\\33\\-84.96094\\-78.59837\\33\\-83.00781\\-78.05405\\33\\-81.05469\\-77.66016\\33\\-77.14844\\-76.64453\\33\\-75.19531\\-76.33685\\33\\-69.33594\\-75.72993\\33\\-65.42969\\-74.78455\\33\\-59.57031\\-74.54341\\33\\-51.75781\\-74.53994\\33\\-49.80469\\-74.57422\\33\\-43.94531\\-74.81116\\33\\-40.03906\\-75.75912\\33\\-34.17969\\-76.3054\\33\\-32.22656\\-76.57047\\33\\-30.27344\\-76.99623\\33\\-28.32031\\-77.54745\\33\\-24.41406\\-78.36208\\33\\-22.46094\\-78.8601\\33\\-20.50781\\-79.5423\\33\\-18.55469\\-79.99355\\33\\-16.60156\\-80.23714\\33\\-14.64844\\-81.18983\\33\\-12.69531\\-81.95863\\33\\-10.74219\\-82.48179\\33\\-8.789063\\-83.43226\\33\\-6.835938\\-83.98909\\33\\-4.882813\\-84.43981\\33\\-2.929688\\-84.74161\\33\\2.929688\\-84.98588\\33\\4.882813\\-85.00072\\33\\6.835938\\-84.77596\\33\\10.74219\\-83.70693\\33\\12.69531\\-82.70061\\33\\14.64844\\-81.93725\\33\\16.60156\\-80.95313\\33\\18.55469\\-80.17153\\33\\22.46094\\-78.45435\\33\\24.41406\\-77.76453\\33\\26.36719\\-76.97571\\33\\28.32031\\-76.4333\\33\\34.17969\\-75.65517\\33\\38.08594\\-74.81461\\33\\41.99219\\-74.55653\\33\\49.80469\\-74.41637\\33\\53.71094\\-74.42866\\33\\59.57031\\-74.58684\\33\\63.47656\\-74.85659\\33\\65.42969\\-75.16521\\33\\67.38281\\-75.58334\\33\\69.33594\\-75.82544\\33\\73.24219\\-76.12016\\33\\77.14844\\-76.56192\\33\\79.10156\\-76.94273\\33\\81.05469\\-77.45164\\33\\84.96094\\-78.17123\\33\\86.91406\\-78.58727\\33\\90.82031\\-79.6791\\33\\94.72656\\-80.50208\\33\\96.67969\\-81.26682\\33\\98.63281\\-81.90949\\33\\100.5859\\-82.37708\\33\\102.5391\\-83.23919\\33\\106.4453\\-84.8072\\33\\108.3984\\-85.79877\\33\\110.3516\\-86.52433\\33\\112.3047\\-87.60807\\33\\114.2578\\-88.32923\\33\\117.8414\\-90.88281\\33\\120.1172\\-92.57685\\33\\122.5698\\-94.78906\\33\\124.3014\\-96.74219\\33\\125.7176\\-98.69531\\33\\127.2943\\-100.6484\\33\\128.7456\\-102.6016\\33\\129.9235\\-104.5547\\33\\130.9854\\-106.5078\\33\\132.3515\\-108.4609\\33\\133.3866\\-110.4141\\33\\134.6068\\-112.3672\\33\\135.5362\\-114.3203\\33\\136.5662\\-116.2734\\33\\137.2514\\-118.2266\\33\\138.4\\-120.1797\\33\\139.2109\\-122.1328\\33\\140.3013\\-124.0859\\33\\141.0168\\-126.0391\\33\\142.0393\\-127.9922\\33\\143.1599\\-131.8984\\33\\144.1013\\-133.8516\\33\\144.6715\\-135.8047\\33\\146.2816\\-139.7109\\33\\146.8632\\-141.6641\\33\\147.7016\\-143.6172\\33\\148.2387\\-145.5703\\33\\149.047\\-149.4766\\33\\149.7206\\-151.4297\\33\\150.1465\\-153.3828\\33\\150.6987\\-157.2891\\33\\151.132\\-159.2422\\33\\151.682\\-161.1953\\33\\152.0508\\-163.1484\\33\\152.7207\\-169.0078\\33\\153.4819\\-172.9141\\33\\153.7195\\-174.8672\\33\\153.9805\\-178.7734\\33\\154.1748\\-184.6328\\33\\154.2057\\-188.5391\\33\\154.1842\\-192.4453\\33\\154.0093\\-200.2578\\33\\153.7195\\-206.1172\\33\\153.532\\-208.0703\\33\\152.9208\\-211.9766\\33\\152.0957\\-217.8359\\33\\151.6927\\-219.7891\\33\\150.9859\\-221.7422\\33\\150.1965\\-225.6484\\33\\149.6033\\-227.6016\\33\\148.7609\\-229.5547\\33\\148.1706\\-231.5078\\33\\147.0848\\-233.4609\\33\\146.1298\\-235.4141\\33\\144.7815\\-237.3672\\33\\143.7137\\-239.3203\\33\\142.4967\\-241.2734\\33\\141.6016\\-242.5203\\33\\137.6953\\-247.5153\\33\\136.3196\\-249.0859\\33\\134.4788\\-251.0391\\33\\133.7891\\-251.6405\\33\\131.8359\\-253.6712\\33\\129.8828\\-255.5655\\33\\123.8683\\-260.8047\\33\\121.3884\\-262.7578\\33\\118.1641\\-265.1725\\33\\116.0498\\-266.6641\\33\\112.3047\\-269.143\\33\\110.3516\\-269.9709\\33\\108.3984\\-271.2195\\33\\106.4453\\-272.0958\\33\\104.4922\\-273.276\\33\\102.5391\\-274.0927\\33\\100.5859\\-275.0917\\33\\98.63281\\-275.6472\\33\\94.72656\\-277.1635\\33\\92.77344\\-277.6623\\33\\90.82031\\-278.4648\\33\\88.86719\\-279.1166\\33\\86.91406\\-279.6326\\33\\83.00781\\-280.9768\\33\\79.10156\\-281.8109\\33\\77.14844\\-282.4645\\33\\75.19531\\-283.0032\\33\\73.24219\\-283.3508\\33\\71.28906\\-283.8208\\33\\69.33594\\-284.6607\\33\\65.42969\\-285.7759\\33\\63.47656\\-286.6538\\33\\59.57031\\-287.7432\\33\\57.61719\\-288.5593\\33\\55.66406\\-289.0357\\33\\53.71094\\-289.3929\\33\\49.80469\\-290.8562\\33\\47.85156\\-291.33\\33\\45.89844\\-292.1355\\33\\43.94531\\-292.8125\\33\\41.99219\\-293.2874\\33\\40.03906\\-294.0311\\33\\38.08594\\-294.6447\\33\\34.17969\\-295.3673\\33\\30.27344\\-296.5824\\33\\26.36719\\-297.2316\\33\\24.41406\\-297.7346\\33\\22.46094\\-298.3579\\33\\20.50781\\-298.6768\\33\\16.60156\\-299.2071\\33\\10.74219\\-300.1602\\33\\6.835938\\-300.4326\\33\\4.882813\\-300.5051\\33\\-0.9765625\\-300.5536\\33\\-4.882813\\-300.4747\\33\\-8.789063\\-300.2952\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "293" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "143" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-12.69531\\-300.0026\\35\\-16.60156\\-299.3641\\35\\-24.41406\\-298.3849\\35\\-28.32031\\-297.3585\\35\\-34.17969\\-296.5983\\35\\-36.13281\\-296.1723\\35\\-38.08594\\-295.5853\\35\\-40.03906\\-295.2546\\35\\-43.94531\\-294.7003\\35\\-45.89844\\-294.2859\\35\\-47.85156\\-293.6361\\35\\-49.80469\\-293.1658\\35\\-53.71094\\-292.3802\\35\\-55.66406\\-291.599\\35\\-59.57031\\-290.8415\\35\\-61.52344\\-290.3642\\35\\-63.47656\\-289.6523\\35\\-65.42969\\-289.3285\\35\\-69.33594\\-288.8179\\35\\-71.28906\\-288.3727\\35\\-73.24219\\-287.7646\\35\\-75.19531\\-287.3264\\35\\-79.10156\\-286.5647\\35\\-81.05469\\-285.9096\\35\\-83.00781\\-285.3798\\35\\-84.96094\\-284.9746\\35\\-86.91406\\-284.4038\\35\\-88.86719\\-283.6295\\35\\-92.77344\\-282.774\\35\\-94.72656\\-281.9359\\35\\-98.63281\\-280.7763\\35\\-100.5859\\-279.7453\\35\\-102.5391\\-278.9755\\35\\-104.4922\\-277.767\\35\\-106.4453\\-276.9594\\35\\-108.3984\\-275.7303\\35\\-110.3516\\-274.8284\\35\\-112.3047\\-273.4887\\35\\-114.2578\\-272.0159\\35\\-116.2109\\-270.7866\\35\\-118.1641\\-269.4385\\35\\-121.8783\\-266.6641\\35\\-124.1921\\-264.7109\\35\\-125.9766\\-263.3286\\35\\-127.9297\\-261.6274\\35\\-134.6062\\-254.9453\\35\\-136.241\\-252.9922\\35\\-137.5732\\-251.0391\\35\\-140.546\\-247.1328\\35\\-141.8837\\-245.1797\\35\\-142.8158\\-243.2266\\35\\-144.0303\\-241.2734\\35\\-144.8353\\-239.3203\\35\\-146.077\\-237.3672\\35\\-146.8798\\-235.4141\\35\\-147.9239\\-233.4609\\35\\-149.0673\\-229.5547\\35\\-149.9414\\-227.6016\\35\\-150.796\\-223.6953\\35\\-151.5789\\-221.7422\\35\\-152.1434\\-219.7891\\35\\-152.5704\\-217.8359\\35\\-153.7724\\-213.9297\\35\\-154.7402\\-208.0703\\35\\-155.5139\\-204.1641\\35\\-155.992\\-200.2578\\35\\-156.2731\\-194.3984\\35\\-156.3579\\-190.4922\\35\\-156.3806\\-184.6328\\35\\-156.3193\\-180.7266\\35\\-156.1735\\-176.8203\\35\\-155.9098\\-172.9141\\35\\-155.387\\-169.0078\\35\\-154.9341\\-167.0547\\35\\-154.0139\\-161.1953\\35\\-153.6284\\-159.2422\\35\\-152.9729\\-157.2891\\35\\-152.481\\-155.3359\\35\\-152.0996\\-153.3828\\35\\-151.5158\\-151.4297\\35\\-150.7501\\-149.4766\\35\\-149.889\\-145.5703\\35\\-149.0698\\-143.6172\\35\\-147.9556\\-139.7109\\35\\-146.998\\-137.7578\\35\\-146.3092\\-135.8047\\35\\-145.3651\\-133.8516\\35\\-143.7916\\-129.9453\\35\\-142.8269\\-127.9922\\35\\-142.2547\\-126.0391\\35\\-141.2229\\-124.0859\\35\\-140.433\\-122.1328\\35\\-139.2195\\-120.1797\\35\\-138.3445\\-118.2266\\35\\-137.1644\\-116.2734\\35\\-136.4212\\-114.3203\\35\\-135.2573\\-112.3672\\35\\-134.2431\\-110.4141\\35\\-131.8359\\-106.9699\\35\\-131.4438\\-106.5078\\35\\-130.2426\\-104.5547\\35\\-128.7658\\-102.6016\\35\\-127.0487\\-100.6484\\35\\-122.0703\\-95.69827\\35\\-120.1172\\-94.06306\\35\\-116.2109\\-91.50487\\35\\-114.2578\\-90.07006\\35\\-112.3047\\-89.17199\\35\\-110.3516\\-88.09898\\35\\-108.3984\\-87.41138\\35\\-106.4453\\-86.40175\\35\\-104.4922\\-85.72099\\35\\-102.5391\\-84.7285\\35\\-98.63281\\-83.26277\\35\\-96.67969\\-82.35244\\35\\-94.72656\\-81.84808\\35\\-92.77344\\-81.0765\\35\\-90.82031\\-80.46407\\35\\-86.91406\\-79.42497\\35\\-84.96094\\-78.73341\\35\\-83.00781\\-78.1875\\35\\-81.05469\\-77.76808\\35\\-77.14844\\-76.7746\\35\\-75.19531\\-76.3961\\35\\-73.24219\\-76.17043\\35\\-69.33594\\-75.81855\\35\\-67.38281\\-75.5621\\35\\-65.42969\\-74.91361\\35\\-63.47656\\-74.79173\\35\\-59.57031\\-74.65002\\35\\-51.75781\\-74.63146\\35\\-45.89844\\-74.85345\\35\\-43.94531\\-75.00126\\35\\-41.99219\\-75.64707\\35\\-40.03906\\-75.86895\\35\\-34.17969\\-76.41411\\35\\-32.22656\\-76.73568\\35\\-28.32031\\-77.69922\\35\\-24.41406\\-78.5\\35\\-20.50781\\-79.63573\\35\\-16.60156\\-80.50605\\35\\-14.64844\\-81.35006\\35\\-12.69531\\-82.00777\\35\\-10.74219\\-82.5322\\35\\-8.789063\\-83.45687\\35\\-6.835938\\-83.94643\\35\\-4.882813\\-84.22962\\35\\-2.929688\\-84.31815\\35\\0.9765625\\-84.29712\\35\\6.835938\\-84.36626\\35\\8.789063\\-84.13304\\35\\10.74219\\-83.70293\\35\\12.69531\\-82.74718\\35\\14.64844\\-82.00667\\35\\18.55469\\-80.25259\\35\\20.50781\\-79.51591\\35\\22.46094\\-78.61651\\35\\24.41406\\-77.88843\\35\\28.32031\\-76.55779\\35\\30.27344\\-76.24607\\35\\36.13281\\-75.58104\\35\\38.08594\\-74.94563\\35\\40.03906\\-74.76953\\35\\43.94531\\-74.59562\\35\\49.80469\\-74.49052\\35\\57.61719\\-74.63636\\35\\61.52344\\-74.82963\\35\\63.47656\\-75.13261\\35\\65.42969\\-75.5948\\35\\67.38281\\-75.79335\\35\\73.24219\\-76.2458\\35\\75.19531\\-76.43807\\35\\77.14844\\-76.7487\\35\\81.05469\\-77.70532\\35\\84.96094\\-78.38174\\35\\86.91406\\-78.81529\\35\\88.86719\\-79.43574\\35\\92.77344\\-80.24716\\35\\94.72656\\-80.70856\\35\\96.67969\\-81.52055\\35\\100.5859\\-82.54398\\35\\102.5391\\-83.49633\\35\\104.4922\\-84.21888\\35\\108.3984\\-85.97688\\35\\110.3516\\-86.76363\\35\\112.3047\\-87.77896\\35\\114.2578\\-88.57784\\35\\116.2109\\-89.93021\\35\\119.969\\-92.83594\\35\\122.3063\\-94.78906\\35\\124.0234\\-96.85866\\35\\125.3581\\-98.69531\\35\\126.9904\\-100.6484\\35\\128.5077\\-102.6016\\35\\129.4936\\-104.5547\\35\\132.0243\\-108.4609\\35\\133.0857\\-110.4141\\35\\134.3675\\-112.3672\\35\\135.2405\\-114.3203\\35\\136.3782\\-116.2734\\35\\137.0049\\-118.2266\\35\\138.1566\\-120.1797\\35\\138.9286\\-122.1328\\35\\140.0328\\-124.0859\\35\\140.7813\\-126.0391\\35\\141.7593\\-127.9922\\35\\142.4583\\-129.9453\\35\\142.9572\\-131.8984\\35\\143.8779\\-133.8516\\35\\145.1317\\-137.7578\\35\\146.0732\\-139.7109\\35\\146.64\\-141.6641\\35\\148.0736\\-145.5703\\35\\148.8607\\-149.4766\\35\\149.9911\\-153.3828\\35\\150.5325\\-157.2891\\35\\150.882\\-159.2422\\35\\151.8755\\-163.1484\\35\\152.1295\\-165.1016\\35\\152.5236\\-169.0078\\35\\153.4947\\-174.8672\\35\\153.823\\-178.7734\\35\\154.0125\\-184.6328\\35\\154.0232\\-192.4453\\35\\153.823\\-200.2578\\35\\153.6021\\-204.1641\\35\\153.4151\\-206.1172\\35\\152.6345\\-211.9766\\35\\152.1752\\-215.8828\\35\\151.867\\-217.8359\\35\\150.7103\\-221.7422\\35\\149.9949\\-225.6484\\35\\149.2248\\-227.6016\\35\\147.9201\\-231.5078\\35\\146.7733\\-233.4609\\35\\145.7935\\-235.4141\\35\\143.5547\\-238.9505\\35\\143.264\\-239.3203\\35\\142.2721\\-241.2734\\35\\140.7314\\-243.2266\\35\\139.0728\\-245.1797\\35\\135.9883\\-249.0859\\35\\129.8828\\-255.1794\\35\\127.9031\\-256.8984\\35\\125.9766\\-258.4566\\35\\123.3225\\-260.8047\\35\\120.1172\\-263.3851\\35\\118.1641\\-264.6207\\35\\114.2578\\-267.4799\\35\\112.3047\\-268.6254\\35\\110.3516\\-269.6247\\35\\108.3984\\-270.7355\\35\\106.4453\\-271.6477\\35\\104.4922\\-272.7658\\35\\100.5859\\-274.5452\\35\\98.63281\\-275.3057\\35\\96.67969\\-275.8333\\35\\94.72656\\-276.6829\\35\\92.77344\\-277.287\\35\\90.82031\\-277.7833\\35\\88.86719\\-278.6098\\35\\84.96094\\-279.7226\\35\\83.00781\\-280.4879\\35\\81.05469\\-281.0478\\35\\77.14844\\-281.9423\\35\\75.19531\\-282.6727\\35\\71.28906\\-283.5229\\35\\67.38281\\-285\\35\\65.42969\\-285.5424\\35\\63.47656\\-286.431\\35\\59.57031\\-287.5824\\35\\57.61719\\-288.4264\\35\\55.66406\\-288.9692\\35\\53.71094\\-289.3407\\35\\49.80469\\-290.8277\\35\\47.85156\\-291.3133\\35\\45.89844\\-292.1213\\35\\43.94531\\-292.8063\\35\\41.99219\\-293.304\\35\\40.03906\\-294.0612\\35\\38.08594\\-294.6728\\35\\34.17969\\-295.3929\\35\\30.27344\\-296.6255\\35\\26.36719\\-297.2612\\35\\22.46094\\-298.4109\\35\\16.60156\\-299.2589\\35\\12.69531\\-299.9619\\35\\10.74219\\-300.224\\35\\8.789063\\-300.3759\\35\\4.882813\\-300.5389\\35\\0.9765625\\-300.601\\35\\-4.882813\\-300.5313\\35\\-8.789063\\-300.3555\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "303" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "144" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-12.69531\\-300.091\\37\\-16.60156\\-299.4311\\37\\-24.41406\\-298.4109\\37\\-28.32031\\-297.3873\\37\\-34.17969\\-296.5904\\37\\-36.13281\\-296.1324\\37\\-38.08594\\-295.5636\\37\\-43.94531\\-294.6648\\37\\-45.89844\\-294.2115\\37\\-47.85156\\-293.5436\\37\\-49.80469\\-293.0947\\37\\-51.75781\\-292.7449\\37\\-53.71094\\-292.1901\\37\\-55.66406\\-291.4567\\37\\-59.57031\\-290.722\\37\\-63.47656\\-289.4935\\37\\-67.38281\\-288.988\\37\\-69.33594\\-288.6269\\37\\-73.24219\\-287.5034\\37\\-77.14844\\-286.7379\\37\\-81.05469\\-285.5608\\37\\-84.96094\\-284.6795\\37\\-86.91406\\-283.8963\\37\\-88.86719\\-283.3947\\37\\-90.82031\\-283.0305\\37\\-92.77344\\-282.4198\\37\\-94.72656\\-281.6568\\37\\-96.67969\\-281.1507\\37\\-98.63281\\-280.3893\\37\\-100.5859\\-279.4534\\37\\-102.5391\\-278.6437\\37\\-104.4922\\-277.5039\\37\\-106.7096\\-276.4297\\37\\-110.3403\\-274.4766\\37\\-112.3047\\-273.2415\\37\\-114.2578\\-271.7365\\37\\-116.2109\\-270.4022\\37\\-118.1641\\-269.2166\\37\\-121.441\\-266.6641\\37\\-124.0234\\-264.411\\37\\-125.9766\\-262.9547\\37\\-128.4846\\-260.8047\\37\\-134.2879\\-254.9453\\37\\-135.8154\\-252.9922\\37\\-137.1824\\-251.0391\\37\\-140.3052\\-247.1328\\37\\-141.6016\\-245.0132\\37\\-143.7262\\-241.2734\\37\\-144.6076\\-239.3203\\37\\-145.7859\\-237.3672\\37\\-146.6453\\-235.4141\\37\\-147.6506\\-233.4609\\37\\-148.3191\\-231.5078\\37\\-148.8477\\-229.5547\\37\\-149.7085\\-227.6016\\37\\-150.2355\\-225.6484\\37\\-150.6076\\-223.6953\\37\\-151.9619\\-219.7891\\37\\-152.8719\\-215.8828\\37\\-153.532\\-213.9297\\37\\-153.9621\\-211.9766\\37\\-154.8626\\-206.1172\\37\\-155.5777\\-202.2109\\37\\-155.9639\\-198.3047\\37\\-156.1488\\-194.3984\\37\\-156.25\\-190.4922\\37\\-156.2847\\-186.5859\\37\\-156.2558\\-182.6797\\37\\-156.0364\\-176.8203\\37\\-155.7112\\-172.9141\\37\\-154.6913\\-167.0547\\37\\-154.1242\\-163.1484\\37\\-153.7816\\-161.1953\\37\\-152.6599\\-157.2891\\37\\-151.8409\\-153.3828\\37\\-151.0533\\-151.4297\\37\\-150.5168\\-149.4766\\37\\-150.1801\\-147.5234\\37\\-149.5602\\-145.5703\\37\\-148.7997\\-143.6172\\37\\-148.3191\\-141.6641\\37\\-147.6163\\-139.7109\\37\\-146.692\\-137.7578\\37\\-146.0049\\-135.8047\\37\\-144.9577\\-133.8516\\37\\-144.3028\\-131.8984\\37\\-143.3368\\-129.9453\\37\\-141.9936\\-126.0391\\37\\-140.925\\-124.0859\\37\\-140.1602\\-122.1328\\37\\-138.9146\\-120.1797\\37\\-138.0744\\-118.2266\\37\\-136.9105\\-116.2734\\37\\-136.1597\\-114.3203\\37\\-134.9696\\-112.3672\\37\\-133.9111\\-110.4141\\37\\-132.6015\\-108.4609\\37\\-131.1035\\-106.5078\\37\\-128.5087\\-102.6016\\37\\-126.7424\\-100.6484\\37\\-122.0703\\-95.9596\\37\\-120.1172\\-94.35424\\37\\-118.1641\\-93.20403\\37\\-114.2578\\-90.31813\\37\\-112.3047\\-89.42793\\37\\-110.3516\\-88.31186\\37\\-108.3984\\-87.61661\\37\\-106.4453\\-86.59267\\37\\-104.4922\\-85.92004\\37\\-100.5859\\-84.15475\\37\\-98.63281\\-83.53625\\37\\-96.67969\\-82.56866\\37\\-92.77344\\-81.33844\\37\\-90.82031\\-80.5863\\37\\-86.91406\\-79.559\\37\\-84.96094\\-78.87109\\37\\-83.00781\\-78.29534\\37\\-79.10156\\-77.4479\\37\\-75.19531\\-76.49437\\37\\-73.24219\\-76.24593\\37\\-67.38281\\-75.73307\\37\\-63.47656\\-74.97993\\37\\-59.57031\\-74.77315\\37\\-57.61719\\-74.73089\\37\\-51.75781\\-74.70279\\37\\-47.85156\\-74.85345\\37\\-45.89844\\-75.03436\\37\\-43.94531\\-75.47566\\37\\-41.99219\\-75.77822\\37\\-34.17969\\-76.52919\\37\\-32.22656\\-76.90147\\37\\-30.27344\\-77.41917\\37\\-26.36719\\-78.19318\\37\\-24.41406\\-78.63731\\37\\-20.50781\\-79.75766\\37\\-16.60156\\-80.70856\\37\\-14.64844\\-81.49498\\37\\-10.74219\\-82.58881\\37\\-8.789063\\-83.43226\\37\\-6.835938\\-83.83433\\37\\-4.882813\\-83.98369\\37\\-2.929688\\-83.9767\\37\\0.9765625\\-83.85767\\37\\2.929688\\-83.85767\\37\\6.835938\\-83.97498\\37\\8.789063\\-83.93266\\37\\10.74219\\-83.63998\\37\\12.69531\\-82.77151\\37\\14.64844\\-82.08131\\37\\16.60156\\-81.28125\\37\\18.55469\\-80.36257\\37\\20.50781\\-79.69612\\37\\22.46094\\-78.76733\\37\\24.41406\\-78.01766\\37\\26.36719\\-77.45683\\37\\28.32031\\-76.71606\\37\\30.27344\\-76.33685\\37\\36.13281\\-75.73967\\37\\38.08594\\-75.41679\\37\\40.03906\\-74.9375\\37\\43.94531\\-74.70279\\37\\49.80469\\-74.59562\\37\\51.75781\\-74.609\\37\\57.61719\\-74.79523\\37\\59.57031\\-74.89354\\37\\61.52344\\-75.13261\\37\\63.47656\\-75.58334\\37\\65.42969\\-75.7774\\37\\73.24219\\-76.36968\\37\\75.19531\\-76.63246\\37\\77.14844\\-76.9947\\37\\79.10156\\-77.50255\\37\\84.96094\\-78.58387\\37\\88.86719\\-79.65234\\37\\92.77344\\-80.41087\\37\\94.72656\\-80.96875\\37\\96.67969\\-81.74908\\37\\98.63281\\-82.16477\\37\\100.5859\\-82.76084\\37\\102.5391\\-83.71937\\37\\104.4922\\-84.39774\\37\\106.4453\\-85.42355\\37\\108.3984\\-86.1551\\37\\110.3516\\-87.11264\\37\\112.3047\\-87.95313\\37\\114.2456\\-88.92969\\37\\116.2109\\-90.13494\\37\\119.5938\\-92.83594\\37\\121.9383\\-94.78906\\37\\124.0234\\-97.29907\\37\\125.0473\\-98.69531\\37\\126.7641\\-100.6484\\37\\128.2263\\-102.6016\\37\\129.2471\\-104.5547\\37\\130.5703\\-106.5078\\37\\131.573\\-108.4609\\37\\131.8359\\-108.7745\\37\\133.7891\\-111.9965\\37\\134.0771\\-112.3672\\37\\135.0098\\-114.3203\\37\\136.1647\\-116.2734\\37\\136.8401\\-118.2266\\37\\137.8569\\-120.1797\\37\\138.7036\\-122.1328\\37\\139.7155\\-124.0859\\37\\141.3933\\-127.9922\\37\\142.3035\\-129.9453\\37\\142.7821\\-131.8984\\37\\144.3327\\-135.8047\\37\\144.8821\\-137.7578\\37\\145.8247\\-139.7109\\37\\147.0488\\-143.6172\\37\\147.8684\\-145.5703\\37\\148.3387\\-147.5234\\37\\148.6987\\-149.4766\\37\\149.1718\\-151.4297\\37\\149.8061\\-153.3828\\37\\150.1872\\-155.3359\\37\\150.6911\\-159.2422\\37\\151.0832\\-161.1953\\37\\151.649\\-163.1484\\37\\151.9809\\-165.1016\\37\\152.4131\\-169.0078\\37\\152.8965\\-172.9141\\37\\153.4288\\-176.8203\\37\\153.6243\\-178.7734\\37\\153.8028\\-182.6797\\37\\153.8728\\-188.5391\\37\\153.8483\\-192.4453\\37\\153.7457\\-196.3516\\37\\153.5794\\-200.2578\\37\\153.4288\\-202.2109\\37\\152.2174\\-213.9297\\37\\151.9661\\-215.8828\\37\\151.5416\\-217.8359\\37\\150.8916\\-219.7891\\37\\150.2173\\-223.6953\\37\\149.7228\\-225.6484\\37\\148.906\\-227.6016\\37\\148.372\\-229.5547\\37\\147.5886\\-231.5078\\37\\144.2932\\-237.3672\\37\\142.9452\\-239.3203\\37\\141.9705\\-241.2734\\37\\140.4665\\-243.2266\\37\\137.0157\\-247.1328\\37\\135.7422\\-248.8156\\37\\131.5207\\-252.9922\\37\\129.8828\\-254.6833\\37\\127.3837\\-256.8984\\37\\125.9766\\-258.0514\\37\\122.0703\\-261.5421\\37\\120.1172\\-262.9791\\37\\118.1641\\-264.1345\\37\\117.4837\\-264.7109\\37\\114.2578\\-267.0844\\37\\112.3047\\-268.1155\\37\\110.3516\\-269.3303\\37\\108.3984\\-270.1095\\37\\106.4453\\-271.278\\37\\104.4922\\-272.0575\\37\\102.5391\\-273.1991\\37\\100.5859\\-273.9089\\37\\98.63281\\-274.8931\\37\\94.72656\\-276.0181\\37\\92.77344\\-276.8748\\37\\88.86719\\-277.8978\\37\\86.91406\\-278.7672\\37\\83.00781\\-279.8572\\37\\81.05469\\-280.6503\\37\\77.14844\\-281.5986\\37\\75.19531\\-282.2024\\37\\73.24219\\-282.9128\\37\\71.28906\\-283.3281\\37\\69.33594\\-283.8583\\37\\67.38281\\-284.7897\\37\\65.42969\\-285.3545\\37\\61.52344\\-286.9185\\37\\59.57031\\-287.4518\\37\\57.61719\\-288.2771\\37\\55.66406\\-288.9114\\37\\53.71094\\-289.2907\\37\\51.75781\\-289.9275\\37\\49.80469\\-290.7948\\37\\47.85156\\-291.2827\\37\\43.94531\\-292.8187\\37\\41.99219\\-293.322\\37\\40.03906\\-294.1047\\37\\38.08594\\-294.7045\\37\\34.17969\\-295.4312\\37\\32.22656\\-296.1048\\37\\30.27344\\-296.6665\\37\\26.36719\\-297.2952\\37\\22.46094\\-298.4682\\37\\18.55469\\-299.0152\\37\\14.64844\\-299.6494\\37\\12.69531\\-300.0542\\37\\10.74219\\-300.2883\\37\\6.835938\\-300.5126\\37\\2.929688\\-300.6136\\37\\-0.9765625\\-300.6385\\37\\-4.882813\\-300.5647\\37\\-8.789063\\-300.4244\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "287" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "145" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-299.9048\\39\\-18.55469\\-299.2071\\39\\-24.41406\\-298.436\\39\\-28.32031\\-297.4048\\39\\-30.27344\\-297.0909\\39\\-34.17969\\-296.5983\\39\\-38.08594\\-295.5396\\39\\-43.94531\\-294.6331\\39\\-45.89844\\-294.1317\\39\\-47.85156\\-293.4506\\39\\-51.75781\\-292.6503\\39\\-53.71094\\-291.9462\\39\\-55.66406\\-291.3402\\39\\-59.57031\\-290.5691\\39\\-61.52344\\-289.7484\\39\\-63.47656\\-289.3238\\39\\-67.38281\\-288.8425\\39\\-69.33594\\-288.3854\\39\\-71.28906\\-287.7432\\39\\-73.24219\\-287.2871\\39\\-75.19531\\-286.929\\39\\-77.14844\\-286.4428\\39\\-79.10156\\-285.7311\\39\\-83.00781\\-284.8879\\39\\-86.91406\\-283.5734\\39\\-90.82031\\-282.7773\\39\\-92.77344\\-281.9925\\39\\-96.67969\\-280.8914\\39\\-98.63281\\-279.9285\\39\\-100.5859\\-279.1855\\39\\-102.5391\\-278.1569\\39\\-104.4922\\-277.2842\\39\\-106.4453\\-276.1837\\39\\-108.3984\\-275.3426\\39\\-110.3516\\-274.0956\\39\\-112.3047\\-272.9596\\39\\-112.824\\-272.5234\\39\\-115.6494\\-270.5703\\39\\-116.2109\\-270.082\\39\\-118.1641\\-268.9228\\39\\-121.0938\\-266.6641\\39\\-124.0234\\-264.0668\\39\\-127.9297\\-260.8612\\39\\-131.776\\-256.8984\\39\\-133.7972\\-254.9453\\39\\-137.6953\\-250.1176\\39\\-140.0099\\-247.1328\\39\\-141.1393\\-245.1797\\39\\-142.4143\\-243.2266\\39\\-145.3662\\-237.3672\\39\\-146.4304\\-235.4141\\39\\-148.1695\\-231.5078\\39\\-148.6832\\-229.5547\\39\\-150.0712\\-225.6484\\39\\-150.9543\\-221.7422\\39\\-151.7342\\-219.7891\\39\\-152.6345\\-215.8828\\39\\-153.7631\\-211.9766\\39\\-154.0896\\-210.0234\\39\\-154.9341\\-204.1641\\39\\-155.5873\\-200.2578\\39\\-155.7781\\-198.3047\\39\\-155.9966\\-194.3984\\39\\-156.125\\-190.4922\\39\\-156.1553\\-186.5859\\39\\-156.125\\-182.6797\\39\\-155.9842\\-178.7734\\39\\-155.6871\\-174.8672\\39\\-155.4436\\-172.9141\\39\\-155.0605\\-170.9609\\39\\-154.4655\\-167.0547\\39\\-153.9243\\-163.1484\\39\\-153.4947\\-161.1953\\39\\-152.8474\\-159.2422\\39\\-152.027\\-155.3359\\39\\-151.448\\-153.3828\\39\\-150.7463\\-151.4297\\39\\-149.9414\\-147.5234\\39\\-149.1681\\-145.5703\\39\\-148.069\\-141.6641\\39\\-147.1749\\-139.7109\\39\\-145.6026\\-135.8047\\39\\-144.6763\\-133.8516\\39\\-144.0365\\-131.8984\\39\\-143.0143\\-129.9453\\39\\-142.4744\\-127.9922\\39\\-141.6567\\-126.0391\\39\\-139.797\\-122.1328\\39\\-138.6773\\-120.1797\\39\\-136.7247\\-116.2734\\39\\-135.8613\\-114.3203\\39\\-134.7239\\-112.3672\\39\\-132.3085\\-108.4609\\39\\-129.3772\\-104.5547\\39\\-128.1834\\-102.6016\\39\\-126.3873\\-100.6484\\39\\-122.0703\\-96.28981\\39\\-120.0266\\-94.78906\\39\\-118.1641\\-93.52568\\39\\-116.2109\\-91.98872\\39\\-114.2578\\-90.67759\\39\\-112.3047\\-89.68514\\39\\-110.3516\\-88.5897\\39\\-108.3984\\-87.83569\\39\\-106.4453\\-86.84686\\39\\-102.5391\\-85.27662\\39\\-100.5859\\-84.36678\\39\\-98.63281\\-83.73911\\39\\-96.67969\\-82.80067\\39\\-94.72656\\-82.10574\\39\\-92.77344\\-81.59508\\39\\-90.82031\\-80.73078\\39\\-86.91406\\-79.73261\\39\\-83.00781\\-78.51497\\39\\-81.05469\\-78.03056\\39\\-79.10156\\-77.64713\\39\\-75.19531\\-76.61849\\39\\-71.28906\\-76.1597\\39\\-65.42969\\-75.67634\\39\\-63.47656\\-75.41679\\39\\-61.52344\\-75.02181\\39\\-59.57031\\-74.89923\\39\\-55.66406\\-74.7841\\39\\-51.75781\\-74.78055\\39\\-47.85156\\-75.00341\\39\\-45.89844\\-75.49068\\39\\-43.94531\\-75.73599\\39\\-36.13281\\-76.44744\\39\\-34.17969\\-76.68709\\39\\-30.27344\\-77.61838\\39\\-26.36719\\-78.36149\\39\\-24.41406\\-78.81529\\39\\-22.46094\\-79.44206\\39\\-18.55469\\-80.3275\\39\\-16.60156\\-80.85825\\39\\-14.64844\\-81.68187\\39\\-10.74219\\-82.62642\\39\\-8.789063\\-83.39354\\39\\-6.835938\\-83.70327\\39\\-4.882813\\-83.72738\\39\\0.9765625\\-83.39826\\39\\4.882813\\-83.42477\\39\\8.789063\\-83.62003\\39\\10.74219\\-83.44855\\39\\12.69531\\-82.73283\\39\\16.60156\\-81.51212\\39\\18.55469\\-80.49399\\39\\20.50781\\-79.86795\\39\\22.46094\\-78.94027\\39\\24.41406\\-78.16324\\39\\26.36719\\-77.64713\\39\\28.32031\\-76.94645\\39\\30.27344\\-76.44096\\39\\32.22656\\-76.21098\\39\\38.08594\\-75.67634\\39\\40.03906\\-75.19785\\39\\41.99219\\-74.90625\\39\\47.85156\\-74.75868\\39\\51.75781\\-74.75868\\39\\55.66406\\-74.89641\\39\\57.61719\\-75.07064\\39\\61.52344\\-75.61724\\39\\69.33594\\-76.18327\\39\\73.24219\\-76.55779\\39\\76.71067\\-77.21094\\39\\79.10156\\-77.73631\\39\\83.00781\\-78.37943\\39\\84.96094\\-78.82578\\39\\86.91406\\-79.44411\\39\\92.77344\\-80.5732\\39\\96.67969\\-81.89233\\39\\98.63281\\-82.32424\\39\\102.5391\\-83.90493\\39\\104.4922\\-84.616\\39\\106.4453\\-85.66431\\39\\108.3984\\-86.36772\\39\\110.3516\\-87.41138\\39\\112.3047\\-88.12215\\39\\114.2578\\-89.31895\\39\\116.2109\\-90.40791\\39\\119.2062\\-92.83594\\39\\121.5025\\-94.78906\\39\\122.0703\\-95.36578\\39\\125.9766\\-100.0744\\39\\126.4951\\-100.6484\\39\\127.9297\\-102.6951\\39\\130.3223\\-106.5078\\39\\131.2713\\-108.4609\\39\\131.8359\\-109.1955\\39\\133.7891\\-112.4865\\39\\135.8739\\-116.2734\\39\\137.4758\\-120.1797\\39\\138.5135\\-122.1328\\39\\139.3704\\-124.0859\\39\\140.4001\\-126.0391\\39\\141.1133\\-127.9922\\39\\142.1186\\-129.9453\\39\\143.2172\\-133.8516\\39\\144.1525\\-135.8047\\39\\144.6886\\-137.7578\\39\\146.2668\\-141.6641\\39\\146.808\\-143.6172\\39\\147.614\\-145.5703\\39\\148.1771\\-147.5234\\39\\148.9597\\-151.4297\\39\\149.5743\\-153.3828\\39\\150.0423\\-155.3359\\39\\150.5497\\-159.2422\\39\\150.8634\\-161.1953\\39\\151.8111\\-165.1016\\39\\152.0934\\-167.0547\\39\\152.6894\\-172.9141\\39\\153.343\\-178.7734\\39\\153.4947\\-180.7266\\39\\153.6351\\-184.6328\\39\\153.6668\\-188.5391\\39\\153.6243\\-192.4453\\39\\153.4689\\-196.3516\\39\\153.2241\\-200.2578\\39\\152.5866\\-208.0703\\39\\152.0165\\-213.9297\\39\\151.6927\\-215.8828\\39\\151.1195\\-217.8359\\39\\150.6606\\-219.7891\\39\\150.0213\\-223.6953\\39\\148.6863\\-227.6016\\39\\148.1506\\-229.5547\\39\\146.2294\\-233.4609\\39\\144.978\\-235.4141\\39\\144.0364\\-237.3672\\39\\141.6016\\-241.1819\\39\\140.1505\\-243.2266\\39\\139.6484\\-243.7469\\39\\135.0222\\-249.0859\\39\\130.9998\\-252.9922\\39\\129.8828\\-254.2129\\39\\126.9458\\-256.8984\\39\\124.6533\\-258.8516\\39\\122.0703\\-261.1764\\39\\120.1172\\-262.3969\\39\\116.2109\\-265.2843\\39\\114.0685\\-266.6641\\39\\110.7845\\-268.6172\\39\\110.3516\\-268.9353\\39\\108.3984\\-269.7289\\39\\106.4453\\-270.7628\\39\\104.4922\\-271.6072\\39\\102.5391\\-272.6336\\39\\98.63281\\-274.2289\\39\\96.67969\\-275.1212\\39\\94.72656\\-275.6148\\39\\92.77344\\-276.2237\\39\\90.82031\\-277.0255\\39\\88.86719\\-277.4844\\39\\86.91406\\-278.0785\\39\\84.96094\\-278.9096\\39\\81.05469\\-280.0423\\39\\79.10156\\-280.8211\\39\\75.19531\\-281.7908\\39\\73.24219\\-282.5857\\39\\69.33594\\-283.6092\\39\\67.38281\\-284.5371\\39\\63.47656\\-285.8922\\39\\61.52344\\-286.7933\\39\\59.57031\\-287.3365\\39\\55.66406\\-288.8389\\39\\53.71094\\-289.2552\\39\\51.75781\\-289.8319\\39\\49.80469\\-290.7613\\39\\47.85156\\-291.2663\\39\\43.94531\\-292.8165\\39\\41.99219\\-293.333\\39\\40.03906\\-294.1326\\39\\38.08594\\-294.7121\\39\\34.17969\\-295.45\\39\\32.22656\\-296.1459\\39\\30.27344\\-296.692\\39\\26.36719\\-297.3386\\39\\22.46094\\-298.4914\\39\\16.60156\\-299.3523\\39\\12.69531\\-300.1029\\39\\10.74219\\-300.3376\\39\\4.882813\\-300.6136\\39\\-0.9765625\\-300.6782\\39\\-4.882813\\-300.6094\\39\\-8.789063\\-300.4633\\39\\-12.69531\\-300.182\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "146" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-299.9893\\41\\-18.55469\\-299.2478\\41\\-24.41406\\-298.476\\41\\-28.32031\\-297.4168\\41\\-30.27344\\-297.0968\\41\\-34.17969\\-296.5824\\41\\-38.08594\\-295.5158\\41\\-43.94531\\-294.601\\41\\-47.85156\\-293.3733\\41\\-51.75781\\-292.5515\\41\\-53.71094\\-291.7598\\41\\-55.66406\\-291.2393\\41\\-57.61719\\-290.8699\\41\\-59.57031\\-290.3758\\41\\-61.52344\\-289.5355\\41\\-63.47656\\-289.2186\\41\\-65.42969\\-289.0185\\41\\-67.38281\\-288.6817\\41\\-71.28906\\-287.4875\\41\\-75.19531\\-286.7233\\41\\-77.14844\\-286.0184\\41\\-79.10156\\-285.4445\\41\\-83.00781\\-284.5677\\41\\-84.96094\\-283.8001\\41\\-86.91406\\-283.3549\\41\\-88.86719\\-283.023\\41\\-90.82031\\-282.4198\\41\\-92.77344\\-281.6916\\41\\-94.72656\\-281.1869\\41\\-96.67969\\-280.5645\\41\\-98.63281\\-279.5938\\41\\-100.5859\\-278.9191\\41\\-102.5391\\-277.7702\\41\\-104.4922\\-277.0416\\41\\-106.4453\\-275.8633\\41\\-108.3984\\-275.1039\\41\\-115.2836\\-270.5703\\41\\-116.2109\\-269.8247\\41\\-118.0725\\-268.6172\\41\\-120.1172\\-267.1494\\41\\-123.0395\\-264.7109\\41\\-127.5034\\-260.8047\\41\\-131.3365\\-256.8984\\41\\-133.7891\\-254.4532\\41\\-136.6726\\-251.0391\\41\\-138.1805\\-249.0859\\41\\-139.6484\\-246.9984\\41\\-141.6016\\-244.0239\\41\\-142.1928\\-243.2266\\41\\-143.0129\\-241.2734\\41\\-144.2195\\-239.3203\\41\\-145.0357\\-237.3672\\41\\-146.2195\\-235.4141\\41\\-146.9789\\-233.4609\\41\\-147.9839\\-231.5078\\41\\-149.0839\\-227.6016\\41\\-149.889\\-225.6484\\41\\-150.7221\\-221.7422\\41\\-151.4338\\-219.7891\\41\\-152.0412\\-217.8359\\41\\-152.8719\\-213.9297\\41\\-153.5073\\-211.9766\\41\\-153.9397\\-210.0234\\41\\-154.7181\\-204.1641\\41\\-155.5494\\-198.3047\\41\\-155.8415\\-194.3984\\41\\-156.0195\\-188.5391\\41\\-155.9719\\-182.6797\\41\\-155.8008\\-178.7734\\41\\-155.4436\\-174.8672\\41\\-154.7917\\-170.9609\\41\\-154.0132\\-165.1016\\41\\-153.6691\\-163.1484\\41\\-152.5745\\-159.2422\\41\\-151.7639\\-155.3359\\41\\-151.0189\\-153.3828\\41\\-150.5182\\-151.4297\\41\\-150.173\\-149.4766\\41\\-149.6169\\-147.5234\\41\\-148.8664\\-145.5703\\41\\-148.3665\\-143.6172\\41\\-147.7567\\-141.6641\\41\\-146.804\\-139.7109\\41\\-146.1457\\-137.7578\\41\\-145.1317\\-135.8047\\41\\-144.4658\\-133.8516\\41\\-143.6974\\-131.8984\\41\\-142.7917\\-129.9453\\41\\-142.2714\\-127.9922\\41\\-141.2669\\-126.0391\\41\\-140.4455\\-124.0859\\41\\-139.3527\\-122.1328\\41\\-138.4666\\-120.1797\\41\\-137.3175\\-118.2266\\41\\-136.5714\\-116.2734\\41\\-134.4954\\-112.3672\\41\\-133.132\\-110.4141\\41\\-131.9453\\-108.4609\\41\\-130.6253\\-106.5078\\41\\-127.9297\\-102.9271\\41\\-125.9766\\-100.71\\41\\-122.0703\\-96.71875\\41\\-120.1172\\-95.28413\\41\\-116.2109\\-92.24303\\41\\-112.3047\\-89.92456\\41\\-110.3516\\-88.87225\\41\\-106.4453\\-87.15625\\41\\-104.4922\\-86.21836\\41\\-102.5391\\-85.51172\\41\\-100.5859\\-84.57684\\41\\-98.63281\\-83.91629\\41\\-94.72656\\-82.2324\\41\\-92.77344\\-81.74039\\41\\-90.82031\\-80.91279\\41\\-88.86719\\-80.35369\\41\\-84.96094\\-79.36689\\41\\-83.00781\\-78.70555\\41\\-81.05469\\-78.17594\\41\\-79.10156\\-77.82356\\41\\-75.19531\\-76.82159\\41\\-73.24219\\-76.44536\\41\\-71.28906\\-76.24005\\41\\-63.47656\\-75.65245\\41\\-61.52344\\-75.46915\\41\\-59.57031\\-75.02181\\41\\-53.71094\\-74.875\\41\\-49.80469\\-75.00126\\41\\-47.85156\\-75.56658\\41\\-41.99219\\-76.00214\\41\\-36.13281\\-76.57047\\41\\-34.17969\\-76.92133\\41\\-32.22656\\-77.4034\\41\\-26.36719\\-78.51106\\41\\-22.46094\\-79.60916\\41\\-18.55469\\-80.46407\\41\\-16.60156\\-81.02985\\41\\-14.64844\\-81.81291\\41\\-10.74219\\-82.66456\\41\\-8.789063\\-83.28165\\41\\-6.835938\\-83.49921\\41\\-4.882813\\-83.38421\\41\\-0.9765625\\-82.87807\\41\\0.9765625\\-82.73283\\41\\4.882813\\-82.74718\\41\\8.789063\\-83.15836\\41\\10.74219\\-83.111\\41\\16.60156\\-81.65294\\41\\18.55469\\-80.59237\\41\\20.50781\\-79.97375\\41\\24.41406\\-78.40201\\41\\30.27344\\-76.56208\\41\\32.22656\\-76.31625\\41\\40.03906\\-75.60609\\41\\43.94531\\-75.32869\\41\\45.89844\\-74.97533\\41\\51.75781\\-74.93491\\41\\53.71094\\-75.00553\\41\\55.66406\\-75.44276\\41\\65.42969\\-76.06102\\41\\69.33594\\-76.34352\\41\\71.28906\\-76.54111\\41\\73.24219\\-76.85399\\41\\77.14844\\-77.62582\\41\\81.05469\\-78.23801\\41\\83.00781\\-78.62666\\41\\86.91406\\-79.69141\\41\\90.82031\\-80.35631\\41\\92.77344\\-80.7797\\41\\94.72656\\-81.60547\\41\\98.63281\\-82.50224\\41\\100.5859\\-83.40912\\41\\102.5391\\-84.09625\\41\\104.4922\\-84.90046\\41\\106.4453\\-85.85638\\41\\108.3984\\-86.58192\\41\\110.3516\\-87.62981\\41\\112.3047\\-88.30284\\41\\114.2578\\-89.59103\\41\\116.2109\\-90.77184\\41\\118.1641\\-92.2077\\41\\121.1999\\-94.78906\\41\\123.0341\\-96.74219\\41\\126.1644\\-100.6484\\41\\128.8635\\-104.5547\\41\\130.0469\\-106.5078\\41\\131.046\\-108.4609\\41\\132.3556\\-110.4141\\41\\133.3782\\-112.3672\\41\\134.6048\\-114.3203\\41\\136.5519\\-118.2266\\41\\137.2171\\-120.1797\\41\\138.3158\\-122.1328\\41\\139.0778\\-124.0859\\41\\140.2157\\-126.0391\\41\\140.895\\-127.9922\\41\\141.8973\\-129.9453\\41\\142.5062\\-131.8984\\41\\142.9938\\-133.8516\\41\\143.9466\\-135.8047\\41\\145.1317\\-139.7109\\41\\146.0634\\-141.6641\\41\\146.6201\\-143.6172\\41\\148.0076\\-147.5234\\41\\148.799\\-151.4297\\41\\149.2844\\-153.3828\\41\\149.8756\\-155.3359\\41\\150.2307\\-157.2891\\41\\150.6951\\-161.1953\\41\\151.0599\\-163.1484\\41\\151.6029\\-165.1016\\41\\151.94\\-167.0547\\41\\152.3582\\-170.9609\\41\\153.0461\\-178.7734\\41\\153.3579\\-184.6328\\41\\153.3725\\-188.5391\\41\\153.3279\\-192.4453\\41\\153.1964\\-194.3984\\41\\152.9062\\-200.2578\\41\\152.6638\\-204.1641\\41\\152.2326\\-210.0234\\41\\151.7736\\-213.9297\\41\\150.8206\\-217.8359\\41\\150.2057\\-221.7422\\41\\149.7608\\-223.6953\\41\\149.0193\\-225.6484\\41\\147.9102\\-229.5547\\41\\146.8395\\-231.5078\\41\\145.9782\\-233.4609\\41\\144.7115\\-235.4141\\41\\143.7124\\-237.3672\\41\\142.5472\\-239.3203\\41\\139.7199\\-243.2266\\41\\136.4648\\-247.1328\\41\\134.6762\\-249.0859\\41\\130.6728\\-252.9922\\41\\129.8828\\-253.8595\\41\\127.9297\\-255.7033\\41\\121.8985\\-260.8047\\41\\120.1172\\-262.0379\\41\\118.1641\\-263.5115\\41\\114.2578\\-266.0234\\41\\112.3047\\-267.3599\\41\\110.3516\\-268.3455\\41\\108.3984\\-269.4373\\41\\106.4453\\-270.0754\\41\\104.4922\\-271.2155\\41\\102.5391\\-271.9594\\41\\100.5859\\-273.0608\\41\\98.63281\\-273.717\\41\\96.67969\\-274.6355\\41\\94.72656\\-275.3076\\41\\92.77344\\-275.7679\\41\\88.86719\\-277.1707\\41\\86.91406\\-277.6188\\41\\83.00781\\-279.0866\\41\\81.05469\\-279.6021\\41\\77.14844\\-281.0403\\41\\75.19531\\-281.5187\\41\\73.24219\\-282.1441\\41\\71.28906\\-282.9464\\41\\69.33594\\-283.4141\\41\\67.38281\\-284.1724\\41\\65.42969\\-285.0308\\41\\63.47656\\-285.6829\\41\\61.52344\\-286.669\\41\\59.57031\\-287.2329\\41\\57.61719\\-287.9487\\41\\55.66406\\-288.7762\\41\\53.71094\\-289.2197\\41\\51.75781\\-289.7831\\41\\49.80469\\-290.7259\\41\\47.85156\\-291.2502\\41\\43.94531\\-292.8125\\41\\41.99219\\-293.333\\41\\40.03906\\-294.1326\\41\\38.08594\\-294.724\\41\\34.17969\\-295.45\\41\\32.22656\\-296.1739\\41\\30.27344\\-296.7126\\41\\26.36719\\-297.3636\\41\\24.41406\\-298.0226\\41\\22.46094\\-298.5284\\41\\16.60156\\-299.4066\\41\\12.69531\\-300.1602\\41\\10.74219\\-300.3672\\41\\6.835938\\-300.5871\\41\\2.929688\\-300.6987\\41\\-2.929688\\-300.6987\\41\\-8.789063\\-300.5051\\41\\-12.69531\\-300.2365\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "286" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "147" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-300.0542\\43\\-18.55469\\-299.31\\43\\-24.41406\\-298.5138\\43\\-26.36719\\-298.0361\\43\\-28.32031\\-297.4441\\43\\-30.27344\\-297.1132\\43\\-34.17969\\-296.5824\\43\\-38.08594\\-295.4956\\43\\-43.94531\\-294.5632\\43\\-47.85156\\-293.3264\\43\\-51.75781\\-292.4514\\43\\-53.71094\\-291.624\\43\\-57.61719\\-290.7648\\43\\-61.52344\\-289.4287\\43\\-65.42969\\-288.8945\\43\\-67.38281\\-288.4854\\43\\-69.33594\\-287.778\\43\\-71.28906\\-287.2981\\43\\-75.19531\\-286.4544\\43\\-77.14844\\-285.6717\\43\\-81.05469\\-284.7915\\43\\-83.00781\\-284.0856\\43\\-84.96094\\-283.5156\\43\\-88.86719\\-282.774\\43\\-90.82031\\-282.007\\43\\-94.72656\\-280.9616\\43\\-96.67969\\-280.1041\\43\\-100.5859\\-278.5444\\43\\-102.5391\\-277.4945\\43\\-104.4922\\-276.734\\43\\-106.4453\\-275.6522\\43\\-108.3984\\-274.8349\\43\\-110.3516\\-273.5407\\43\\-112.3047\\-272.1473\\43\\-114.2578\\-270.9941\\43\\-120.1172\\-266.8127\\43\\-122.7031\\-264.7109\\43\\-125.9766\\-261.8589\\43\\-127.9297\\-260.0603\\43\\-131.8359\\-256.1158\\43\\-134.753\\-252.9922\\43\\-136.368\\-251.0391\\43\\-137.7908\\-249.0859\\43\\-139.0788\\-247.1328\\43\\-140.5793\\-245.1797\\43\\-141.9149\\-243.2266\\43\\-142.7795\\-241.2734\\43\\-143.9938\\-239.3203\\43\\-144.7885\\-237.3672\\43\\-145.9872\\-235.4141\\43\\-146.7411\\-233.4609\\43\\-147.7449\\-231.5078\\43\\-148.3846\\-229.5547\\43\\-148.857\\-227.6016\\43\\-149.6582\\-225.6484\\43\\-150.2057\\-223.6953\\43\\-150.5692\\-221.7422\\43\\-151.0812\\-219.7891\\43\\-151.8497\\-217.8359\\43\\-152.6274\\-213.9297\\43\\-153.7604\\-210.0234\\43\\-154.0661\\-208.0703\\43\\-154.7688\\-202.2109\\43\\-155.5104\\-196.3516\\43\\-155.7216\\-192.4453\\43\\-155.8415\\-188.5391\\43\\-155.7878\\-182.6797\\43\\-155.5636\\-178.7734\\43\\-155.387\\-176.8203\\43\\-154.8181\\-172.9141\\43\\-154.3353\\-169.0078\\43\\-153.7997\\-165.1016\\43\\-152.7401\\-161.1953\\43\\-151.9694\\-157.2891\\43\\-150.7181\\-153.3828\\43\\-149.9509\\-149.4766\\43\\-149.2112\\-147.5234\\43\\-148.6291\\-145.5703\\43\\-148.1542\\-143.6172\\43\\-146.528\\-139.7109\\43\\-145.8506\\-137.7578\\43\\-144.8357\\-135.8047\\43\\-144.2644\\-133.8516\\43\\-143.2957\\-131.8984\\43\\-142.0288\\-127.9922\\43\\-140.9605\\-126.0391\\43\\-140.2057\\-124.0859\\43\\-139.0072\\-122.1328\\43\\-138.2285\\-120.1797\\43\\-137.0727\\-118.2266\\43\\-136.3911\\-116.2734\\43\\-135.2004\\-114.3203\\43\\-134.2475\\-112.3672\\43\\-133.7891\\-111.7962\\43\\-131.8359\\-108.8959\\43\\-131.4497\\-108.4609\\43\\-130.2921\\-106.5078\\43\\-128.8935\\-104.5547\\43\\-127.2626\\-102.6016\\43\\-123.5098\\-98.69531\\43\\-121.4919\\-96.74219\\43\\-118.1641\\-93.99818\\43\\-116.2109\\-92.64206\\43\\-112.3047\\-90.22977\\43\\-108.3984\\-88.13184\\43\\-106.4453\\-87.44728\\43\\-104.4922\\-86.43194\\43\\-102.5391\\-85.7588\\43\\-100.5859\\-84.84905\\43\\-96.67969\\-83.32349\\43\\-94.72656\\-82.37189\\43\\-92.77344\\-81.86983\\43\\-88.86719\\-80.46407\\43\\-84.96094\\-79.54771\\43\\-83.00781\\-78.88223\\43\\-81.05469\\-78.35409\\43\\-77.14844\\-77.55206\\43\\-73.24219\\-76.54111\\43\\-71.28906\\-76.30994\\43\\-63.47656\\-75.77146\\43\\-59.57031\\-75.5621\\43\\-55.66406\\-75.18003\\43\\-51.75781\\-75.34515\\43\\-47.85156\\-75.79107\\43\\-43.94531\\-75.96749\\43\\-40.03906\\-76.30455\\43\\-36.13281\\-76.72926\\43\\-32.22656\\-77.6157\\43\\-28.32031\\-78.27782\\43\\-26.36719\\-78.71195\\43\\-24.41406\\-79.29478\\43\\-22.46094\\-79.77129\\43\\-18.55469\\-80.57682\\43\\-14.64844\\-81.89721\\43\\-12.69531\\-82.26857\\43\\-8.789063\\-83.12544\\43\\-6.835938\\-83.17027\\43\\-2.929688\\-82.63255\\43\\-0.9765625\\-82.44711\\43\\0.9765625\\-82.37096\\43\\4.882813\\-82.37189\\43\\8.789063\\-82.59213\\43\\10.74219\\-82.6508\\43\\12.69531\\-82.44826\\43\\16.60156\\-81.67424\\43\\18.55469\\-80.67017\\43\\22.46094\\-79.41006\\43\\24.41406\\-78.5949\\43\\30.27344\\-76.8035\\43\\32.22656\\-76.42125\\43\\38.08594\\-75.9231\\43\\41.99219\\-75.71004\\43\\47.85156\\-75.5338\\43\\51.75781\\-75.5338\\43\\61.52344\\-75.95788\\43\\65.42969\\-76.19971\\43\\69.33594\\-76.52552\\43\\71.28906\\-76.79803\\43\\75.19531\\-77.57715\\43\\79.10156\\-78.1544\\43\\83.00781\\-78.90498\\43\\84.96094\\-79.49666\\43\\88.86719\\-80.232\\43\\90.82031\\-80.51083\\43\\92.77344\\-81.06022\\43\\94.72656\\-81.78701\\43\\96.67969\\-82.18961\\43\\98.63281\\-82.74709\\43\\100.5859\\-83.65982\\43\\102.5391\\-84.28821\\43\\104.4922\\-85.28718\\43\\108.3984\\-86.8913\\43\\110.3516\\-87.80914\\43\\112.3047\\-88.57784\\43\\114.2578\\-89.79581\\43\\118.1641\\-92.50092\\43\\120.9491\\-94.78906\\43\\122.8476\\-96.74219\\43\\124.3896\\-98.69531\\43\\125.9766\\-100.9117\\43\\128.6776\\-104.5547\\43\\129.7017\\-106.5078\\43\\132.1065\\-110.4141\\43\\133.1043\\-112.3672\\43\\134.4257\\-114.3203\\43\\135.2705\\-116.2734\\43\\136.3911\\-118.2266\\43\\137.0295\\-120.1797\\43\\138.1392\\-122.1328\\43\\138.847\\-124.0859\\43\\139.9805\\-126.0391\\43\\140.7221\\-127.9922\\43\\142.3719\\-131.8984\\43\\142.7772\\-133.8516\\43\\143.6393\\-135.8047\\43\\144.3925\\-137.7578\\43\\144.8982\\-139.7109\\43\\145.8333\\-141.6641\\43\\147.0588\\-145.5703\\43\\147.832\\-147.5234\\43\\148.2873\\-149.4766\\43\\149.0558\\-153.3828\\43\\149.6817\\-155.3359\\43\\150.0995\\-157.2891\\43\\150.5543\\-161.1953\\43\\150.8451\\-163.1484\\43\\151.7541\\-167.0547\\43\\152.0335\\-169.0078\\43\\152.3826\\-172.9141\\43\\152.7967\\-178.7734\\43\\152.9775\\-182.6797\\43\\153.0442\\-186.5859\\43\\152.9883\\-192.4453\\43\\152.6675\\-200.2578\\43\\152.4627\\-204.1641\\43\\152.0503\\-210.0234\\43\\151.8202\\-211.9766\\43\\151.448\\-213.9297\\43\\150.9468\\-215.8828\\43\\150.0126\\-221.7422\\43\\148.7651\\-225.6484\\43\\148.2971\\-227.6016\\43\\147.4609\\-229.7412\\43\\145.6171\\-233.4609\\43\\143.5547\\-237.0321\\43\\143.2897\\-237.3672\\43\\142.3261\\-239.3203\\43\\140.877\\-241.2734\\43\\137.6035\\-245.1797\\43\\136.1576\\-247.1328\\43\\134.3563\\-249.0859\\43\\131.8359\\-251.4881\\43\\129.8828\\-253.5066\\43\\127.9297\\-255.3785\\43\\125.9766\\-256.84\\43\\124.0234\\-258.4595\\43\\121.334\\-260.8047\\43\\120.1172\\-261.7629\\43\\118.1641\\-263.1295\\43\\116.2109\\-264.2121\\43\\115.6283\\-264.7109\\43\\112.3047\\-266.948\\43\\110.3516\\-267.8909\\43\\108.3984\\-269.0566\\43\\106.4453\\-269.7375\\43\\104.4922\\-270.6951\\43\\100.5859\\-272.3986\\43\\98.63281\\-273.3299\\43\\96.67969\\-274.0174\\43\\94.72656\\-274.9419\\43\\90.82031\\-275.9482\\43\\88.86719\\-276.7691\\43\\84.96094\\-277.8066\\43\\83.00781\\-278.6888\\43\\79.10156\\-279.863\\43\\77.14844\\-280.7535\\43\\73.24219\\-281.8452\\43\\71.28906\\-282.7223\\43\\67.38281\\-283.8718\\43\\65.42969\\-284.8877\\43\\63.47656\\-285.5089\\43\\61.52344\\-286.5208\\43\\57.61719\\-287.8345\\43\\55.66406\\-288.7202\\43\\51.75781\\-289.7233\\43\\49.80469\\-290.6962\\43\\47.85156\\-291.2241\\43\\43.94531\\-292.8148\\43\\41.99219\\-293.3297\\43\\40.03906\\-294.1326\\43\\38.08594\\-294.7196\\43\\34.17969\\-295.4727\\43\\32.22656\\-296.2247\\43\\30.27344\\-296.7259\\43\\26.36719\\-297.3841\\43\\24.41406\\-298.0757\\43\\22.46094\\-298.5565\\43\\18.55469\\-299.1309\\43\\14.64844\\-299.9048\\43\\12.69531\\-300.216\\43\\10.74219\\-300.4078\\43\\6.835938\\-300.6273\\43\\0.9765625\\-300.7656\\43\\-2.929688\\-300.7433\\43\\-6.835938\\-300.6317\\43\\-10.74219\\-300.444\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "148" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-300.1029\\45\\-18.55469\\-299.3404\\45\\-24.41406\\-298.5426\\45\\-26.36719\\-298.0757\\45\\-28.32031\\-297.4629\\45\\-30.27344\\-297.1297\\45\\-34.17969\\-296.5824\\45\\-38.08594\\-295.4596\\45\\-43.94531\\-294.5332\\45\\-47.85156\\-293.2741\\45\\-51.75781\\-292.3365\\45\\-53.71094\\-291.5204\\45\\-57.61719\\-290.646\\45\\-59.57031\\-289.8503\\45\\-61.52344\\-289.3446\\45\\-65.42969\\-288.7382\\45\\-69.33594\\-287.5516\\45\\-73.24219\\-286.7126\\45\\-75.19531\\-285.993\\45\\-77.14844\\-285.413\\45\\-81.05469\\-284.466\\45\\-83.00781\\-283.6976\\45\\-86.91406\\-282.991\\45\\-88.86719\\-282.4198\\45\\-90.82031\\-281.7044\\45\\-94.72656\\-280.668\\45\\-96.67969\\-279.7382\\45\\-98.63281\\-279.0827\\45\\-100.5859\\-278.0174\\45\\-102.5391\\-277.291\\45\\-106.4453\\-275.447\\45\\-108.3161\\-274.4766\\45\\-110.3516\\-273.2869\\45\\-112.3047\\-271.8358\\45\\-116.2109\\-269.3868\\45\\-122.0703\\-264.8484\\45\\-125.9766\\-261.5687\\45\\-128.8231\\-258.8516\\45\\-131.8359\\-255.7998\\45\\-134.3963\\-252.9922\\45\\-135.9844\\-251.0391\\45\\-137.3122\\-249.0859\\45\\-138.7561\\-247.1328\\45\\-140.3213\\-245.1797\\45\\-141.6016\\-243.1267\\45\\-143.67\\-239.3203\\45\\-144.593\\-237.3672\\45\\-145.7072\\-235.4141\\45\\-147.4609\\-231.4338\\45\\-148.2172\\-229.5547\\45\\-148.6987\\-227.6016\\45\\-150.0547\\-223.6953\\45\\-150.8418\\-219.7891\\45\\-151.6029\\-217.8359\\45\\-152.1086\\-215.8828\\45\\-152.4709\\-213.9297\\45\\-152.9335\\-211.9766\\45\\-153.532\\-210.0234\\45\\-153.9096\\-208.0703\\45\\-154.3801\\-204.1641\\45\\-154.9975\\-198.3047\\45\\-155.3726\\-194.3984\\45\\-155.6267\\-188.5391\\45\\-155.5372\\-182.6797\\45\\-155.4162\\-180.7266\\45\\-154.8313\\-174.8672\\45\\-154.3801\\-170.9609\\45\\-153.8693\\-167.0547\\45\\-153.4819\\-165.1016\\45\\-152.9009\\-163.1484\\45\\-152.1227\\-159.2422\\45\\-151.6712\\-157.2891\\45\\-150.9209\\-155.3359\\45\\-150.173\\-151.4297\\45\\-149.6302\\-149.4766\\45\\-148.9025\\-147.5234\\45\\-147.8841\\-143.6172\\45\\-146.9447\\-141.6641\\45\\-146.2814\\-139.7109\\45\\-145.3943\\-137.7578\\45\\-144.6166\\-135.8047\\45\\-144.0108\\-133.8516\\45\\-143.007\\-131.8984\\45\\-142.4942\\-129.9453\\45\\-141.6719\\-127.9922\\45\\-140.7133\\-126.0391\\45\\-139.8754\\-124.0859\\45\\-138.7416\\-122.1328\\45\\-137.9207\\-120.1797\\45\\-136.8733\\-118.2266\\45\\-136.1707\\-116.2734\\45\\-134.9368\\-114.3203\\45\\-133.7891\\-112.2596\\45\\-131.8359\\-109.3014\\45\\-131.1478\\-108.4609\\45\\-128.6053\\-104.5547\\45\\-125.9766\\-101.533\\45\\-123.1752\\-98.69531\\45\\-120.1172\\-95.8763\\45\\-118.1641\\-94.31535\\45\\-116.2109\\-93.14558\\45\\-114.2578\\-91.74297\\45\\-112.3047\\-90.50982\\45\\-110.3516\\-89.50215\\45\\-108.3984\\-88.31255\\45\\-106.4453\\-87.70256\\45\\-104.4922\\-86.65104\\45\\-100.5859\\-85.13699\\45\\-96.67969\\-83.56519\\45\\-94.72656\\-82.51321\\45\\-90.82031\\-81.43056\\45\\-88.86719\\-80.59592\\45\\-84.96094\\-79.71173\\45\\-83.00781\\-79.06932\\45\\-79.10156\\-78.07962\\45\\-77.14844\\-77.71158\\45\\-73.24219\\-76.71295\\45\\-71.28906\\-76.40213\\45\\-65.42969\\-75.99763\\45\\-61.52344\\-75.80244\\45\\-55.66406\\-75.62231\\45\\-51.75781\\-75.68211\\45\\-43.94531\\-76.08367\\45\\-40.03906\\-76.42125\\45\\-36.13281\\-76.95826\\45\\-32.22656\\-77.78503\\45\\-30.27344\\-78.07962\\45\\-26.36719\\-78.91658\\45\\-24.41406\\-79.51729\\45\\-18.55469\\-80.73078\\45\\-16.60156\\-81.49224\\45\\-14.64844\\-81.96716\\45\\-10.74219\\-82.6674\\45\\-8.789063\\-82.91611\\45\\-6.835938\\-82.79027\\45\\-2.929688\\-82.3348\\45\\0.9765625\\-82.14227\\45\\4.882813\\-82.13595\\45\\10.74219\\-82.35837\\45\\12.69531\\-82.29536\\45\\14.64844\\-82.06855\\45\\16.60156\\-81.68965\\45\\18.55469\\-80.76534\\45\\22.46094\\-79.60796\\45\\24.41406\\-78.80599\\45\\28.32031\\-77.63412\\45\\30.27344\\-76.99314\\45\\32.22656\\-76.54075\\45\\34.17969\\-76.33438\\45\\40.03906\\-75.92284\\45\\43.94531\\-75.79335\\45\\47.85156\\-75.73652\\45\\51.75781\\-75.77146\\45\\57.61719\\-75.92661\\45\\61.52344\\-76.10725\\45\\65.42969\\-76.34615\\45\\69.33594\\-76.76763\\45\\71.28906\\-77.07451\\45\\75.19531\\-77.80155\\45\\79.10156\\-78.37061\\45\\81.05469\\-78.76733\\45\\84.96094\\-79.72672\\45\\90.82031\\-80.69169\\45\\92.77344\\-81.41824\\45\\94.72656\\-81.94817\\45\\96.67969\\-82.35171\\45\\100.5859\\-83.86377\\45\\102.5391\\-84.50539\\45\\104.4922\\-85.53099\\45\\106.4453\\-86.23011\\45\\108.3984\\-87.19781\\45\\110.3516\\-87.9593\\45\\112.3047\\-88.90567\\45\\114.2578\\-90.00507\\45\\116.2109\\-91.51432\\45\\120.1172\\-94.29025\\45\\122.6294\\-96.74219\\45\\124.0799\\-98.69531\\45\\125.4097\\-100.6484\\45\\127.0138\\-102.6016\\45\\128.47\\-104.5547\\45\\129.4448\\-106.5078\\45\\130.6846\\-108.4609\\45\\131.7493\\-110.4141\\45\\132.9141\\-112.3672\\45\\134.2151\\-114.3203\\45\\135.0724\\-116.2734\\45\\136.1785\\-118.2266\\45\\136.8713\\-120.1797\\45\\137.907\\-122.1328\\45\\138.677\\-124.0859\\45\\139.6711\\-126.0391\\45\\140.5511\\-127.9922\\45\\141.3196\\-129.9453\\45\\142.2088\\-131.8984\\45\\142.6273\\-133.8516\\45\\143.3105\\-135.8047\\45\\144.2343\\-137.7578\\45\\144.7299\\-139.7109\\45\\146.2758\\-143.6172\\45\\146.827\\-145.5703\\45\\147.5848\\-147.5234\\45\\148.1527\\-149.4766\\45\\148.8773\\-153.3828\\45\\149.9414\\-157.2891\\45\\150.2487\\-159.2422\\45\\150.7066\\-163.1484\\45\\151.0462\\-165.1016\\45\\151.5416\\-167.0547\\45\\151.8891\\-169.0078\\45\\152.2519\\-172.9141\\45\\152.5057\\-176.8203\\45\\152.7389\\-182.6797\\45\\152.7882\\-186.5859\\45\\152.7829\\-190.4922\\45\\152.5567\\-198.3047\\45\\152.2854\\-204.1641\\45\\151.8291\\-210.0234\\45\\151.5026\\-211.9766\\45\\150.6836\\-215.8828\\45\\150.173\\-219.7891\\45\\149.7724\\-221.7422\\45\\149.0558\\-223.6953\\45\\148.0939\\-227.6016\\45\\146.3362\\-231.5078\\45\\145.1667\\-233.4609\\45\\144.2728\\-235.4141\\45\\143.0075\\-237.3672\\45\\142.0518\\-239.3203\\45\\140.5949\\-241.2734\\45\\137.1646\\-245.1797\\45\\135.7422\\-246.9972\\45\\133.9274\\-249.0859\\45\\131.8359\\-251.0129\\45\\129.8828\\-253.0172\\45\\127.8132\\-254.9453\\45\\125.9766\\-256.3356\\45\\122.0703\\-259.8155\\45\\120.1172\\-261.415\\45\\116.2109\\-263.8493\\45\\114.2578\\-265.2495\\45\\112.3047\\-266.2775\\45\\110.3516\\-267.5104\\45\\106.4453\\-269.4586\\45\\104.4922\\-270.0888\\45\\102.5391\\-271.1735\\45\\100.5859\\-271.8331\\45\\98.63281\\-272.8839\\45\\96.67969\\-273.573\\45\\92.77344\\-275.1507\\45\\90.82031\\-275.6148\\45\\88.86719\\-276.1968\\45\\86.91406\\-277.0132\\45\\84.96094\\-277.4835\\45\\83.00781\\-278.1068\\45\\81.05469\\-278.9576\\45\\79.10156\\-279.532\\45\\75.19531\\-281.1045\\45\\73.24219\\-281.6192\\45\\71.28906\\-282.4505\\45\\69.33594\\-283.1501\\45\\67.38281\\-283.6674\\45\\65.42969\\-284.7364\\45\\63.47656\\-285.3895\\45\\61.52344\\-286.3947\\45\\57.61719\\-287.7299\\45\\55.66406\\-288.6628\\45\\51.75781\\-289.6668\\45\\49.80469\\-290.6652\\45\\47.85156\\-291.2027\\45\\43.94531\\-292.8148\\45\\41.99219\\-293.3149\\45\\40.03906\\-294.1473\\45\\38.08594\\-294.724\\45\\34.17969\\-295.4857\\45\\32.22656\\-296.2369\\45\\30.27344\\-296.7368\\45\\26.36719\\-297.4197\\45\\24.41406\\-298.1378\\45\\22.46094\\-298.587\\45\\18.55469\\-299.1613\\45\\16.60156\\-299.5091\\45\\14.64844\\-299.9619\\45\\12.69531\\-300.2566\\45\\10.74219\\-300.444\\45\\6.835938\\-300.654\\45\\0.9765625\\-300.8103\\45\\-2.929688\\-300.776\\45\\-6.835938\\-300.6652\\45\\-10.74219\\-300.4747\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "293" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "149" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-300.1602\\47\\-18.55469\\-299.388\\47\\-20.50781\\-299.0788\\47\\-24.41406\\-298.5634\\47\\-26.36719\\-298.1258\\47\\-28.32031\\-297.4821\\47\\-30.27344\\-297.1464\\47\\-34.17969\\-296.5824\\47\\-38.08594\\-295.4596\\47\\-41.99219\\-294.8507\\47\\-43.94531\\-294.4898\\47\\-45.89844\\-293.8055\\47\\-47.85156\\-293.2338\\47\\-49.80469\\-292.7933\\47\\-51.75781\\-292.2163\\47\\-53.71094\\-291.4273\\47\\-57.61719\\-290.5131\\47\\-59.57031\\-289.6595\\47\\-63.47656\\-288.9984\\47\\-65.42969\\-288.5727\\47\\-67.38281\\-287.8725\\47\\-69.33594\\-287.355\\47\\-71.28906\\-286.9543\\47\\-73.24219\\-286.4544\\47\\-75.19531\\-285.6464\\47\\-79.10156\\-284.7363\\47\\-81.05469\\-283.9682\\47\\-83.00781\\-283.4598\\47\\-86.91406\\-282.7299\\47\\-88.86719\\-281.9968\\47\\-92.77344\\-280.9929\\47\\-96.67969\\-279.4438\\47\\-98.63281\\-278.7672\\47\\-100.5859\\-277.6958\\47\\-102.5391\\-277.0748\\47\\-104.4922\\-275.9795\\47\\-106.4453\\-275.2443\\47\\-108.3984\\-274.0374\\47\\-110.3516\\-272.9955\\47\\-110.9407\\-272.5234\\47\\-113.8229\\-270.5703\\47\\-114.2578\\-270.1897\\47\\-116.2109\\-269.1366\\47\\-118.1641\\-267.6283\\47\\-125.9766\\-261.1744\\47\\-128.3937\\-258.8516\\47\\-129.8828\\-257.2365\\47\\-131.8359\\-255.3255\\47\\-134.0069\\-252.9922\\47\\-135.7422\\-250.7855\\47\\-136.9612\\-249.0859\\47\\-137.6953\\-248.2478\\47\\-139.6484\\-245.5478\\47\\-139.9878\\-245.1797\\47\\-141.1534\\-243.2266\\47\\-142.436\\-241.2734\\47\\-143.2683\\-239.3203\\47\\-144.4184\\-237.3672\\47\\-146.319\\-233.4609\\47\\-147.093\\-231.5078\\47\\-148.0408\\-229.5547\\47\\-149.0956\\-225.6484\\47\\-149.8788\\-223.6953\\47\\-150.6533\\-219.7891\\47\\-151.9355\\-215.8828\\47\\-152.7163\\-211.9766\\47\\-153.7388\\-208.0703\\47\\-154.2263\\-204.1641\\47\\-154.6043\\-200.2578\\47\\-155.1743\\-192.4453\\47\\-155.3281\\-188.5391\\47\\-155.2813\\-184.6328\\47\\-155.2037\\-182.6797\\47\\-154.9364\\-178.7734\\47\\-154.5964\\-174.8672\\47\\-154.1829\\-170.9609\\47\\-153.6152\\-167.0547\\47\\-153.0442\\-165.1016\\47\\-152.6135\\-163.1484\\47\\-151.8784\\-159.2422\\47\\-151.197\\-157.2891\\47\\-150.6491\\-155.3359\\47\\-149.9509\\-151.4297\\47\\-149.1864\\-149.4766\\47\\-148.1859\\-145.5703\\47\\-147.5143\\-143.6172\\47\\-146.6654\\-141.6641\\47\\-146.0314\\-139.7109\\47\\-145.004\\-137.7578\\47\\-144.4151\\-135.8047\\47\\-142.802\\-131.8984\\47\\-142.3112\\-129.9453\\47\\-141.2533\\-127.9922\\47\\-140.4769\\-126.0391\\47\\-139.3922\\-124.0859\\47\\-138.5196\\-122.1328\\47\\-137.5156\\-120.1797\\47\\-135.8623\\-116.2734\\47\\-132.3213\\-110.4141\\47\\-130.9026\\-108.4609\\47\\-128.1993\\-104.5547\\47\\-125.9766\\-101.8655\\47\\-122.814\\-98.69531\\47\\-120.6436\\-96.74219\\47\\-118.1641\\-94.76359\\47\\-115.4278\\-92.83594\\47\\-109.0035\\-88.92969\\47\\-108.3984\\-88.50799\\47\\-106.4453\\-87.81995\\47\\-104.4922\\-86.83273\\47\\-102.5391\\-86.04327\\47\\-100.5859\\-85.39386\\47\\-98.63281\\-84.47147\\47\\-96.67969\\-83.79212\\47\\-94.72656\\-82.74479\\47\\-92.77344\\-82.12389\\47\\-90.82031\\-81.60205\\47\\-88.86719\\-80.78217\\47\\-84.96094\\-79.86694\\47\\-81.05469\\-78.66429\\47\\-79.10156\\-78.20415\\47\\-75.19531\\-77.45164\\47\\-73.24219\\-76.90576\\47\\-71.28906\\-76.55351\\47\\-65.42969\\-76.0873\\47\\-59.57031\\-75.84985\\47\\-55.66406\\-75.77822\\47\\-51.75781\\-75.81311\\47\\-43.94531\\-76.22253\\47\\-40.03906\\-76.54939\\47\\-38.08594\\-76.82424\\47\\-34.17969\\-77.6414\\47\\-30.27344\\-78.24461\\47\\-28.32031\\-78.68159\\47\\-24.41406\\-79.68791\\47\\-20.50781\\-80.42749\\47\\-18.55469\\-80.91279\\47\\-16.60156\\-81.66858\\47\\-12.69531\\-82.3485\\47\\-10.74219\\-82.59864\\47\\-8.789063\\-82.6702\\47\\-2.929688\\-82.14227\\47\\0.9765625\\-81.96935\\47\\6.835938\\-81.96395\\47\\10.74219\\-82.11206\\47\\12.69531\\-82.12466\\47\\14.64844\\-82.00667\\47\\16.60156\\-81.70444\\47\\18.55469\\-80.84345\\47\\22.46094\\-79.74349\\47\\26.36719\\-78.37025\\47\\32.22656\\-76.73927\\47\\34.17969\\-76.42598\\47\\36.13281\\-76.27506\\47\\41.99219\\-75.99318\\47\\47.85156\\-75.89077\\47\\53.71094\\-75.95788\\47\\57.61719\\-76.06779\\47\\61.52344\\-76.24005\\47\\65.42969\\-76.50014\\47\\69.33594\\-77.01009\\47\\73.24219\\-77.72974\\47\\77.14844\\-78.27383\\47\\79.10156\\-78.61333\\47\\83.00781\\-79.58064\\47\\86.91406\\-80.25758\\47\\88.86719\\-80.53253\\47\\90.82031\\-80.92495\\47\\92.77344\\-81.67805\\47\\96.67969\\-82.57233\\47\\98.63281\\-83.40032\\47\\102.5391\\-84.75106\\47\\104.4922\\-85.71667\\47\\106.4453\\-86.37607\\47\\108.3984\\-87.38287\\47\\110.3516\\-88.09711\\47\\114.2578\\-90.24194\\47\\117.6162\\-92.83594\\47\\118.1641\\-93.32422\\47\\120.1172\\-94.60645\\47\\122.346\\-96.74219\\47\\123.6256\\-98.69531\\47\\126.8145\\-102.6016\\47\\128.1915\\-104.5547\\47\\129.2657\\-106.5078\\47\\130.5318\\-108.4609\\47\\131.4302\\-110.4141\\47\\131.8359\\-110.9331\\47\\133.9567\\-114.3203\\47\\134.9094\\-116.2734\\47\\135.96\\-118.2266\\47\\137.5772\\-122.1328\\47\\138.5345\\-124.0859\\47\\139.3548\\-126.0391\\47\\140.3943\\-127.9922\\47\\141.0672\\-129.9453\\47\\142.0569\\-131.8984\\47\\143.1003\\-135.8047\\47\\144.0677\\-137.7578\\47\\144.5739\\-139.7109\\47\\145.2358\\-141.6641\\47\\146.1168\\-143.6172\\47\\146.64\\-145.5703\\47\\148.0095\\-149.4766\\47\\148.7361\\-153.3828\\47\\149.1847\\-155.3359\\47\\149.7811\\-157.2891\\47\\150.142\\-159.2422\\47\\150.6003\\-163.1484\\47\\150.882\\-165.1016\\47\\151.7137\\-169.0078\\47\\152.1218\\-172.9141\\47\\152.3582\\-176.8203\\47\\152.5567\\-182.6797\\47\\152.6038\\-186.5859\\47\\152.584\\-190.4922\\47\\152.383\\-198.3047\\47\\152.2229\\-202.2109\\47\\151.9848\\-206.1172\\47\\151.8019\\-208.0703\\47\\151.5158\\-210.0234\\47\\150.7658\\-213.9297\\47\\150.284\\-217.8359\\47\\149.9821\\-219.7891\\47\\148.8077\\-223.6953\\47\\148.3907\\-225.6484\\47\\147.8554\\-227.6016\\47\\146.8567\\-229.5547\\47\\146.0854\\-231.5078\\47\\144.847\\-233.4609\\47\\144.0108\\-235.4141\\47\\142.7539\\-237.3672\\47\\141.6256\\-239.3203\\47\\140.2933\\-241.2734\\47\\135.189\\-247.1328\\47\\133.7891\\-248.6494\\47\\131.8359\\-250.4902\\47\\127.9297\\-254.3903\\47\\122.0703\\-259.4401\\47\\120.1172\\-260.9577\\47\\118.1641\\-262.187\\47\\116.2109\\-263.5478\\47\\112.3047\\-265.8181\\47\\110.3516\\-267.1232\\47\\108.3984\\-267.9599\\47\\106.4453\\-269.0884\\47\\104.4922\\-269.7341\\47\\100.5859\\-271.476\\47\\98.63281\\-272.2204\\47\\96.67969\\-273.2065\\47\\94.72656\\-273.8471\\47\\92.77344\\-274.726\\47\\90.82031\\-275.3372\\47\\88.86719\\-275.785\\47\\86.91406\\-276.5594\\47\\84.96094\\-277.2189\\47\\83.00781\\-277.7103\\47\\81.05469\\-278.5444\\47\\77.14844\\-279.9706\\47\\75.19531\\-280.9135\\47\\73.24219\\-281.4427\\47\\71.28906\\-282.1859\\47\\69.33594\\-283.0426\\47\\67.38281\\-283.5304\\47\\65.42969\\-284.5887\\47\\63.47656\\-285.2911\\47\\61.52344\\-286.2329\\47\\59.57031\\-287.027\\47\\57.61719\\-287.6537\\47\\55.66406\\-288.6068\\47\\51.75781\\-289.6362\\47\\49.80469\\-290.6378\\47\\47.85156\\-291.1916\\47\\43.94531\\-292.8047\\47\\41.99219\\-293.3259\\47\\40.03906\\-294.1742\\47\\38.08594\\-294.7358\\47\\34.17969\\-295.5087\\47\\32.22656\\-296.2748\\47\\30.27344\\-296.7624\\47\\28.32031\\-297.0718\\47\\26.36719\\-297.4793\\47\\24.41406\\-298.1959\\47\\22.46094\\-298.6194\\47\\18.55469\\-299.2071\\47\\14.64844\\-300.0288\\47\\12.69531\\-300.3073\\47\\10.74219\\-300.4747\\47\\6.835938\\-300.6987\\47\\0.9765625\\-300.8438\\47\\-4.882813\\-300.7708\\47\\-8.789063\\-300.6205\\47\\-12.69531\\-300.3642\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "284" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "150" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-300.2055\\49\\-18.55469\\-299.438\\49\\-20.50781\\-299.114\\49\\-24.41406\\-298.5901\\49\\-26.36719\\-298.1846\\49\\-28.32031\\-297.5222\\49\\-30.27344\\-297.1528\\49\\-34.17969\\-296.5824\\49\\-38.08594\\-295.45\\49\\-41.99219\\-294.8457\\49\\-43.94531\\-294.4355\\49\\-45.89844\\-293.7451\\49\\-47.85156\\-293.1889\\49\\-49.80469\\-292.7443\\49\\-51.75781\\-292.1069\\49\\-53.71094\\-291.343\\49\\-55.66406\\-290.9049\\49\\-57.61719\\-290.3406\\49\\-59.57031\\-289.5444\\49\\-63.47656\\-288.887\\49\\-65.42969\\-288.3598\\49\\-67.38281\\-287.6537\\49\\-71.28906\\-286.7958\\49\\-75.19531\\-285.4192\\49\\-77.14844\\-284.9797\\49\\-79.10156\\-284.3643\\49\\-81.05469\\-283.6288\\49\\-84.96094\\-282.9338\\49\\-86.91406\\-282.36\\49\\-88.86719\\-281.674\\49\\-92.77344\\-280.7253\\49\\-94.72656\\-279.8325\\49\\-96.67969\\-279.1966\\49\\-100.5859\\-277.4585\\49\\-102.5391\\-276.7804\\49\\-104.4922\\-275.7303\\49\\-106.4453\\-275.0004\\49\\-108.3984\\-273.7412\\49\\-110.3516\\-272.6204\\49\\-112.3047\\-271.3348\\49\\-114.2578\\-269.8755\\49\\-116.2109\\-268.8556\\49\\-118.1641\\-267.3714\\49\\-121.3504\\-264.7109\\49\\-122.0703\\-264.0163\\49\\-123.6518\\-262.7578\\49\\-125.9766\\-260.7482\\49\\-127.9862\\-258.8516\\49\\-131.7255\\-254.9453\\49\\-135.1657\\-251.0391\\49\\-138.1894\\-247.1328\\49\\-141.6016\\-242.1268\\49\\-142.2289\\-241.2734\\49\\-143.0107\\-239.3203\\49\\-144.2276\\-237.3672\\49\\-145.0007\\-235.4141\\49\\-146.1175\\-233.4609\\49\\-146.8395\\-231.5078\\49\\-147.8503\\-229.5547\\49\\-148.906\\-225.6484\\49\\-149.6564\\-223.6953\\49\\-150.1872\\-221.7422\\49\\-150.5046\\-219.7891\\49\\-150.9725\\-217.8359\\49\\-151.724\\-215.8828\\49\\-152.1671\\-213.9297\\49\\-152.9335\\-210.0234\\49\\-153.532\\-208.0703\\49\\-153.8514\\-206.1172\\49\\-154.4436\\-200.2578\\49\\-154.815\\-194.3984\\49\\-155.0097\\-188.5391\\49\\-154.9735\\-184.6328\\49\\-154.8283\\-180.7266\\49\\-154.5659\\-176.8203\\49\\-153.9914\\-170.9609\\49\\-153.7267\\-169.0078\\49\\-152.7321\\-165.1016\\49\\-152.0095\\-161.1953\\49\\-151.5416\\-159.2422\\49\\-150.8385\\-157.2891\\49\\-150.4389\\-155.3359\\49\\-150.139\\-153.3828\\49\\-149.6169\\-151.4297\\49\\-148.8532\\-149.4766\\49\\-147.9461\\-145.5703\\49\\-147.0768\\-143.6172\\49\\-145.6694\\-139.7109\\49\\-144.7452\\-137.7578\\49\\-144.2038\\-135.8047\\49\\-143.2316\\-133.8516\\49\\-142.0407\\-129.9453\\49\\-140.9845\\-127.9922\\49\\-140.2344\\-126.0391\\49\\-139.0223\\-124.0859\\49\\-138.2867\\-122.1328\\49\\-137.1867\\-120.1797\\49\\-136.5045\\-118.2266\\49\\-135.353\\-116.2734\\49\\-134.4337\\-114.3203\\49\\-133.0994\\-112.3672\\49\\-131.9714\\-110.4141\\49\\-129.8828\\-107.3335\\49\\-127.9297\\-104.75\\49\\-125.9766\\-102.3029\\49\\-124.0234\\-100.2722\\49\\-122.3931\\-98.69531\\49\\-120.1172\\-96.68961\\49\\-116.2109\\-93.68183\\49\\-114.9053\\-92.83594\\49\\-112.3047\\-91.35075\\49\\-110.3516\\-90.04137\\49\\-108.3984\\-88.85326\\49\\-104.4922\\-87.06917\\49\\-102.5391\\-86.28893\\49\\-100.5859\\-85.61435\\49\\-98.63281\\-84.68463\\49\\-96.67969\\-83.9884\\49\\-92.77344\\-82.30796\\49\\-90.82031\\-81.83376\\49\\-86.91406\\-80.44348\\49\\-83.00781\\-79.55606\\49\\-81.05469\\-78.87109\\49\\-77.14844\\-78.01351\\49\\-75.19531\\-77.65257\\49\\-71.28906\\-76.77474\\49\\-69.33594\\-76.51521\\49\\-65.42969\\-76.18815\\49\\-61.52344\\-76.02635\\49\\-55.66406\\-75.90679\\49\\-49.80469\\-76.00494\\49\\-41.99219\\-76.50356\\49\\-38.08594\\-77.07451\\49\\-36.13281\\-77.50459\\49\\-32.22656\\-78.12129\\49\\-28.32031\\-78.89353\\49\\-26.36719\\-79.46616\\49\\-22.46094\\-80.24977\\49\\-20.50781\\-80.55824\\49\\-16.60156\\-81.78332\\49\\-12.69531\\-82.35296\\49\\-10.74219\\-82.52421\\49\\-8.789063\\-82.47177\\49\\-4.882813\\-82.13014\\49\\-0.9765625\\-81.87674\\49\\2.929688\\-81.75723\\49\\6.835938\\-81.75294\\49\\12.69531\\-81.94634\\49\\14.64844\\-81.90215\\49\\16.60156\\-81.67429\\49\\18.55469\\-80.87119\\49\\22.46094\\-79.82581\\49\\26.36719\\-78.53883\\49\\34.17969\\-76.59729\\49\\36.13281\\-76.39407\\49\\40.03906\\-76.18268\\49\\47.85156\\-76.03092\\49\\53.71094\\-76.11514\\49\\61.52344\\-76.37642\\49\\65.42969\\-76.74802\\49\\67.38281\\-77.01009\\49\\71.28906\\-77.66501\\49\\75.19531\\-78.16543\\49\\77.14844\\-78.46974\\49\\79.10156\\-78.89353\\49\\81.05469\\-79.42975\\49\\84.96094\\-80.13481\\49\\88.86719\\-80.74213\\49\\90.82031\\-81.36508\\49\\94.72656\\-82.27612\\49\\96.67969\\-82.82263\\49\\98.63281\\-83.64791\\49\\100.5859\\-84.22998\\49\\104.4922\\-85.89599\\49\\106.4453\\-86.55804\\49\\108.3984\\-87.5811\\49\\110.3516\\-88.27644\\49\\112.3047\\-89.45946\\49\\114.2578\\-90.5423\\49\\117.3281\\-92.83594\\49\\119.7117\\-94.78906\\49\\121.875\\-96.74219\\49\\123.4063\\-98.69531\\49\\126.6092\\-102.6016\\49\\127.9376\\-104.5547\\49\\130.3404\\-108.4609\\49\\131.2162\\-110.4141\\49\\132.554\\-112.3672\\49\\134.7425\\-116.2734\\49\\136.6028\\-120.1797\\49\\137.2867\\-122.1328\\49\\138.3831\\-124.0859\\49\\139.1066\\-126.0391\\49\\140.2024\\-127.9922\\49\\140.8847\\-129.9453\\49\\141.851\\-131.8984\\49\\142.4689\\-133.8516\\49\\142.914\\-135.8047\\49\\143.8525\\-137.7578\\49\\144.9857\\-141.6641\\49\\145.9096\\-143.6172\\49\\147.0535\\-147.5234\\49\\147.8604\\-149.4766\\49\\148.2824\\-151.4297\\49\\148.9793\\-155.3359\\49\\149.573\\-157.2891\\49\\150.0299\\-159.2422\\49\\150.7415\\-165.1016\\49\\151.0577\\-167.0547\\49\\151.5026\\-169.0078\\49\\151.9886\\-172.9141\\49\\152.3053\\-178.7734\\49\\152.4118\\-182.6797\\49\\152.4484\\-186.5859\\49\\152.4276\\-190.4922\\49\\152.3535\\-194.3984\\49\\152.0503\\-202.2109\\49\\151.7639\\-206.1172\\49\\151.5026\\-208.0703\\49\\151.1054\\-210.0234\\49\\150.5672\\-213.9297\\49\\150.127\\-217.8359\\49\\149.7228\\-219.7891\\49\\149.0583\\-221.7422\\49\\148.2108\\-225.6484\\49\\147.5135\\-227.6016\\49\\145.7623\\-231.5078\\49\\144.5909\\-233.4609\\49\\143.6244\\-235.4141\\49\\142.5218\\-237.3672\\49\\139.9227\\-241.2734\\49\\136.617\\-245.1797\\49\\133.7891\\-248.3088\\49\\129.8828\\-252.0695\\49\\127.9297\\-254.0413\\49\\125.9766\\-255.7965\\49\\122.0703\\-258.9617\\49\\118.1641\\-261.8376\\49\\116.2109\\-263.1784\\49\\114.2578\\-264.1134\\49\\112.3047\\-265.4308\\49\\108.3984\\-267.5774\\49\\104.4922\\-269.432\\49\\102.5391\\-270.0226\\49\\100.5859\\-271.1077\\49\\98.63281\\-271.7389\\49\\96.67969\\-272.7488\\49\\92.77344\\-274.1578\\49\\90.82031\\-275.0392\\49\\86.91406\\-276.0102\\49\\84.96094\\-276.8919\\49\\81.05469\\-278.0174\\49\\79.10156\\-279.0246\\49\\77.14844\\-279.683\\49\\75.19531\\-280.6787\\49\\71.28906\\-281.9635\\49\\69.33594\\-282.9254\\49\\67.38281\\-283.4255\\49\\65.42969\\-284.4166\\49\\63.47656\\-285.2188\\49\\59.57031\\-286.9669\\49\\57.61719\\-287.5877\\49\\55.66406\\-288.5514\\49\\51.75781\\-289.6133\\49\\49.80469\\-290.6128\\49\\47.85156\\-291.1861\\49\\43.94531\\-292.7946\\49\\41.99219\\-293.344\\49\\40.03906\\-294.1873\\49\\38.08594\\-294.7476\\49\\34.17969\\-295.5291\\49\\32.22656\\-296.3314\\49\\30.27344\\-296.7852\\49\\28.32031\\-297.0942\\49\\26.36719\\-297.543\\49\\24.41406\\-298.2502\\49\\22.46094\\-298.6537\\49\\18.55469\\-299.2554\\49\\14.64844\\-300.0789\\49\\12.69531\\-300.3376\\49\\6.835938\\-300.7147\\49\\2.929688\\-300.8438\\49\\-2.929688\\-300.8495\\49\\-8.789063\\-300.6473\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "292" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "151" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-299.948\\51\\-18.55469\\-299.4906\\51\\-20.50781\\-299.1507\\51\\-24.41406\\-298.6158\\51\\-26.36719\\-298.2289\\51\\-28.32031\\-297.5667\\51\\-30.27344\\-297.1423\\51\\-34.17969\\-296.5824\\51\\-38.08594\\-295.4371\\51\\-41.99219\\-294.8274\\51\\-43.94531\\-294.4254\\51\\-45.89844\\-293.7109\\51\\-47.85156\\-293.1514\\51\\-49.80469\\-292.7006\\51\\-53.71094\\-291.2744\\51\\-55.66406\\-290.8365\\51\\-59.57031\\-289.4445\\51\\-63.47656\\-288.747\\51\\-67.38281\\-287.4601\\51\\-71.28906\\-286.5544\\51\\-73.24219\\-285.7469\\51\\-77.14844\\-284.739\\51\\-79.10156\\-283.9401\\51\\-81.05469\\-283.4028\\51\\-83.00781\\-283.1019\\51\\-84.96094\\-282.6588\\51\\-86.91406\\-281.9423\\51\\-90.82031\\-280.9969\\51\\-94.72656\\-279.5257\\51\\-96.67969\\-278.9033\\51\\-98.63281\\-277.8541\\51\\-100.5859\\-277.2381\\51\\-102.5391\\-276.3416\\51\\-106.4453\\-274.6601\\51\\-108.3984\\-273.4832\\51\\-110.3516\\-272.1452\\51\\-112.3047\\-271.049\\51\\-114.2578\\-269.6473\\51\\-115.9473\\-268.6172\\51\\-118.1641\\-267.0185\\51\\-120.9635\\-264.7109\\51\\-124.0234\\-262.0949\\51\\-127.5228\\-258.8516\\51\\-129.8828\\-256.4671\\51\\-131.8359\\-254.3822\\51\\-134.8295\\-251.0391\\51\\-136.3955\\-249.0859\\51\\-137.8174\\-247.1328\\51\\-139.0736\\-245.1797\\51\\-140.5833\\-243.2266\\51\\-141.9391\\-241.2734\\51\\-142.802\\-239.3203\\51\\-143.9704\\-237.3672\\51\\-144.7597\\-235.4141\\51\\-145.8972\\-233.4609\\51\\-146.62\\-231.5078\\51\\-147.5571\\-229.5547\\51\\-148.2621\\-227.6016\\51\\-148.7361\\-225.6484\\51\\-150.0423\\-221.7422\\51\\-150.7621\\-217.8359\\51\\-151.4338\\-215.8828\\51\\-151.992\\-213.9297\\51\\-152.7009\\-210.0234\\51\\-153.6564\\-206.1172\\51\\-153.9051\\-204.1641\\51\\-154.258\\-200.2578\\51\\-154.5731\\-194.3984\\51\\-154.72\\-190.4922\\51\\-154.7659\\-186.5859\\51\\-154.6043\\-180.7266\\51\\-154.3682\\-176.8203\\51\\-154.0132\\-172.9141\\51\\-153.7577\\-170.9609\\51\\-153.3869\\-169.0078\\51\\-152.8474\\-167.0547\\51\\-151.7442\\-161.1953\\51\\-151.0791\\-159.2422\\51\\-150.5871\\-157.2891\\51\\-149.8857\\-153.3828\\51\\-149.1699\\-151.4297\\51\\-148.6415\\-149.4766\\51\\-148.2126\\-147.5234\\51\\-147.614\\-145.5703\\51\\-146.7452\\-143.6172\\51\\-146.1387\\-141.6641\\51\\-145.1983\\-139.7109\\51\\-143.9226\\-135.8047\\51\\-142.9572\\-133.8516\\51\\-142.4377\\-131.8984\\51\\-141.6697\\-129.9453\\51\\-140.7292\\-127.9922\\51\\-139.8891\\-126.0391\\51\\-138.7706\\-124.0859\\51\\-138.0101\\-122.1328\\51\\-136.9613\\-120.1797\\51\\-136.2339\\-118.2266\\51\\-135.0547\\-116.2734\\51\\-134.1217\\-114.3203\\51\\-133.7891\\-113.9031\\51\\-131.8359\\-110.8326\\51\\-130.4014\\-108.4609\\51\\-128.9648\\-106.5078\\51\\-125.9766\\-102.8497\\51\\-124.0234\\-100.7769\\51\\-121.8363\\-98.69531\\51\\-118.1641\\-95.47473\\51\\-116.2109\\-94.00912\\51\\-114.2578\\-92.89538\\51\\-110.3516\\-90.29688\\51\\-108.3984\\-89.33832\\51\\-106.4453\\-88.16286\\51\\-104.4922\\-87.49315\\51\\-102.5391\\-86.44785\\51\\-100.5859\\-85.74334\\51\\-96.67969\\-84.2182\\51\\-94.72656\\-83.54557\\51\\-92.77344\\-82.58545\\51\\-88.86719\\-81.41016\\51\\-86.91406\\-80.63901\\51\\-83.00781\\-79.75651\\51\\-79.10156\\-78.62347\\51\\-77.14844\\-78.20454\\51\\-73.24219\\-77.51401\\51\\-71.28906\\-77.07451\\51\\-67.38281\\-76.47692\\51\\-63.47656\\-76.23438\\51\\-55.66406\\-76.02596\\51\\-49.80469\\-76.13672\\51\\-45.89844\\-76.36968\\51\\-41.99219\\-76.71947\\51\\-40.03906\\-77.01009\\51\\-36.13281\\-77.75415\\51\\-32.22656\\-78.31026\\51\\-30.27344\\-78.68466\\51\\-26.36719\\-79.67838\\51\\-22.46094\\-80.37286\\51\\-20.50781\\-80.77044\\51\\-18.55469\\-81.42052\\51\\-16.60156\\-81.89214\\51\\-14.64844\\-82.17763\\51\\-12.69531\\-82.35296\\51\\-10.74219\\-82.42553\\51\\-8.789063\\-82.31958\\51\\-2.929688\\-81.84319\\51\\2.929688\\-81.45467\\51\\6.835938\\-81.39301\\51\\12.69531\\-81.75745\\51\\14.64844\\-81.74451\\51\\16.60156\\-81.51479\\51\\18.55469\\-80.87119\\51\\24.41406\\-79.39516\\51\\26.36719\\-78.73606\\51\\28.32031\\-78.21556\\51\\32.22656\\-77.37609\\51\\34.17969\\-76.86914\\51\\36.13281\\-76.53634\\51\\38.08594\\-76.38178\\51\\41.99219\\-76.25182\\51\\47.85156\\-76.1597\\51\\51.75781\\-76.19463\\51\\57.61719\\-76.35792\\51\\61.52344\\-76.5451\\51\\65.42969\\-77.0226\\51\\67.38281\\-77.33576\\51\\73.24219\\-78.10847\\51\\77.14844\\-78.74554\\51\\81.05469\\-79.68184\\51\\86.91406\\-80.61894\\51\\88.86719\\-81.06022\\51\\90.82031\\-81.66858\\51\\94.72656\\-82.44165\\51\\98.63281\\-83.88596\\51\\100.5859\\-84.50677\\51\\102.5391\\-85.43145\\51\\106.4453\\-86.84787\\51\\108.3984\\-87.81097\\51\\110.3516\\-88.52039\\51\\110.9437\\-88.92969\\51\\114.2578\\-90.8601\\51\\116.2109\\-92.20404\\51\\118.1641\\-93.74607\\51\\120.1172\\-95.40271\\51\\121.5642\\-96.74219\\51\\123.2676\\-98.69531\\51\\126.3887\\-102.6016\\51\\127.9297\\-104.8904\\51\\130.1307\\-108.4609\\51\\131.0417\\-110.4141\\51\\132.3771\\-112.3672\\51\\133.3861\\-114.3203\\51\\134.5923\\-116.2734\\51\\135.4237\\-118.2266\\51\\136.4746\\-120.1797\\51\\137.0716\\-122.1328\\51\\138.2379\\-124.0859\\51\\138.9257\\-126.0391\\51\\140.0154\\-127.9922\\51\\140.7377\\-129.9453\\51\\142.3523\\-133.8516\\51\\142.7917\\-135.8047\\51\\144.3283\\-139.7109\\51\\144.8135\\-141.6641\\51\\145.6694\\-143.6172\\51\\146.3353\\-145.5703\\51\\146.855\\-147.5234\\51\\147.6618\\-149.4766\\51\\148.1643\\-151.4297\\51\\148.8514\\-155.3359\\51\\149.8857\\-159.2422\\51\\150.2125\\-161.1953\\51\\150.8727\\-167.0547\\51\\151.6263\\-170.9609\\51\\151.9886\\-174.8672\\51\\152.1842\\-178.7734\\51\\152.2815\\-182.6797\\51\\152.3102\\-188.5391\\51\\152.1994\\-194.3984\\51\\152.0669\\-198.3047\\51\\151.864\\-202.2109\\51\\151.4757\\-206.1172\\51\\150.8362\\-210.0234\\51\\150.2193\\-215.8828\\51\\149.9187\\-217.8359\\51\\148.8077\\-221.7422\\51\\147.9953\\-225.6484\\51\\146.3596\\-229.5547\\51\\145.2836\\-231.5078\\51\\144.3676\\-233.4609\\51\\143.2096\\-235.4141\\51\\142.2897\\-237.3672\\51\\139.6484\\-240.9613\\51\\136.3053\\-245.1797\\51\\134.5898\\-247.1328\\51\\131.8359\\-249.9021\\51\\127.9297\\-253.6804\\51\\125.9766\\-255.4372\\51\\122.0703\\-258.3491\\51\\121.5328\\-258.8516\\51\\118.1641\\-261.4708\\51\\116.0482\\-262.7578\\51\\114.2578\\-263.7403\\51\\112.3047\\-264.9568\\51\\110.3516\\-265.9588\\51\\108.3984\\-267.1951\\51\\106.4453\\-268.006\\51\\104.4922\\-269.0674\\51\\102.5391\\-269.6787\\51\\98.63281\\-271.3958\\51\\96.67969\\-272.0801\\51\\94.72656\\-273.1049\\51\\92.77344\\-273.7145\\51\\90.82031\\-274.5618\\51\\88.86719\\-275.2469\\51\\86.91406\\-275.6895\\51\\83.00781\\-277.1917\\51\\81.05469\\-277.7032\\51\\79.10156\\-278.7362\\51\\77.14844\\-279.4457\\51\\75.19531\\-280.3881\\51\\73.24219\\-281.1672\\51\\71.28906\\-281.8178\\51\\69.33594\\-282.8103\\51\\67.38281\\-283.3386\\51\\63.47656\\-285.1561\\51\\61.52344\\-285.9775\\51\\59.57031\\-286.907\\51\\57.61719\\-287.5489\\51\\55.66406\\-288.5267\\51\\51.75781\\-289.6003\\51\\49.80469\\-290.6128\\51\\47.85156\\-291.1916\\51\\43.94531\\-292.8086\\51\\41.99219\\-293.3697\\51\\40.03906\\-294.213\\51\\38.08594\\-294.764\\51\\34.17969\\-295.5636\\51\\32.22656\\-296.387\\51\\30.27344\\-296.8193\\51\\28.32031\\-297.1318\\51\\26.36719\\-297.6089\\51\\24.41406\\-298.3205\\51\\22.46094\\-298.6944\\51\\18.55469\\-299.315\\51\\14.64844\\-300.1263\\51\\12.69531\\-300.3584\\51\\8.789063\\-300.6429\\51\\2.929688\\-300.8721\\51\\-2.929688\\-300.8784\\51\\-6.835938\\-300.7534\\51\\-10.74219\\-300.5647\\51\\-14.64844\\-300.2466\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "292" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "152" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-300.0288\\53\\-18.55469\\-299.555\\53\\-20.50781\\-299.1999\\53\\-24.41406\\-298.638\\53\\-26.36719\\-298.2709\\53\\-28.32031\\-297.5798\\53\\-30.27344\\-297.1763\\53\\-34.17969\\-296.5904\\53\\-38.08594\\-295.45\\53\\-41.99219\\-294.8158\\53\\-43.94531\\-294.4153\\53\\-45.89844\\-293.6867\\53\\-47.85156\\-293.1259\\53\\-49.80469\\-292.669\\53\\-51.75781\\-291.8778\\53\\-53.71094\\-291.2169\\53\\-55.66406\\-290.7816\\53\\-57.61719\\-290.017\\53\\-59.57031\\-289.3766\\53\\-61.52344\\-289.054\\53\\-63.47656\\-288.6169\\53\\-65.42969\\-287.899\\53\\-67.38281\\-287.3106\\53\\-69.33594\\-286.8768\\53\\-71.28906\\-286.2619\\53\\-73.24219\\-285.5172\\53\\-75.19531\\-285.0543\\53\\-77.14844\\-284.4539\\53\\-79.10156\\-283.6379\\53\\-83.00781\\-282.9128\\53\\-86.91406\\-281.6444\\53\\-88.86719\\-281.2378\\53\\-90.82031\\-280.7304\\53\\-92.77344\\-279.8753\\53\\-94.72656\\-279.2664\\53\\-96.67969\\-278.4913\\53\\-98.63281\\-277.5672\\53\\-100.5859\\-277.0009\\53\\-102.5391\\-275.9585\\53\\-104.4922\\-275.2934\\53\\-108.3984\\-273.2218\\53\\-110.3516\\-271.8105\\53\\-114.2578\\-269.4569\\53\\-115.4349\\-268.6172\\53\\-120.1172\\-265.0149\\53\\-124.0234\\-261.7612\\53\\-127.1203\\-258.8516\\53\\-129.1233\\-256.8984\\53\\-131.8359\\-254.0097\\53\\-134.4857\\-251.0391\\53\\-136.0802\\-249.0859\\53\\-137.3119\\-247.1328\\53\\-140.3345\\-243.2266\\53\\-141.6016\\-241.239\\53\\-143.6546\\-237.3672\\53\\-145.5744\\-233.4609\\53\\-148.1061\\-227.6016\\53\\-149.103\\-223.6953\\53\\-149.8518\\-221.7422\\53\\-150.2728\\-219.7891\\53\\-150.5938\\-217.8359\\53\\-151.1054\\-215.8828\\53\\-151.8019\\-213.9297\\53\\-152.8815\\-208.0703\\53\\-153.3869\\-206.1172\\53\\-153.7483\\-204.1641\\53\\-154.1134\\-200.2578\\53\\-154.2146\\-198.3047\\53\\-154.5426\\-188.5391\\53\\-154.5425\\-184.6328\\53\\-154.4196\\-180.7266\\53\\-154.0719\\-176.8203\\53\\-153.9951\\-174.8672\\53\\-153.8057\\-172.9141\\53\\-153.4689\\-170.9609\\53\\-152.9541\\-169.0078\\53\\-152.5745\\-167.0547\\53\\-151.9165\\-163.1484\\53\\-150.7463\\-159.2422\\53\\-150.0952\\-155.3359\\53\\-148.8796\\-151.4297\\53\\-147.968\\-147.5234\\53\\-147.177\\-145.5703\\53\\-145.8439\\-141.6641\\53\\-144.8783\\-139.7109\\53\\-144.3283\\-137.7578\\53\\-142.7429\\-133.8516\\53\\-142.2294\\-131.8984\\53\\-141.2604\\-129.9453\\53\\-140.4894\\-127.9922\\53\\-139.4166\\-126.0391\\53\\-137.6227\\-122.1328\\53\\-135.8906\\-118.2266\\53\\-133.7891\\-114.4614\\53\\-132.5326\\-112.3672\\53\\-131.1574\\-110.4141\\53\\-130.0904\\-108.4609\\53\\-128.7227\\-106.5078\\53\\-125.9766\\-103.2356\\53\\-124.0234\\-101.125\\53\\-121.4563\\-98.69531\\53\\-118.1641\\-95.77891\\53\\-116.2109\\-94.32573\\53\\-114.2578\\-93.29166\\53\\-110.3516\\-90.71394\\53\\-108.3984\\-89.66988\\53\\-106.4453\\-88.42725\\53\\-104.4922\\-87.70728\\53\\-102.5391\\-86.69856\\53\\-100.5859\\-86.08828\\53\\-96.67969\\-84.42767\\53\\-94.72656\\-83.73146\\53\\-92.77344\\-82.83508\\53\\-90.82031\\-82.12505\\53\\-88.86719\\-81.66271\\53\\-86.91406\\-80.81839\\53\\-83.00781\\-79.91868\\53\\-79.10156\\-78.84925\\53\\-75.19531\\-78.03726\\53\\-73.24219\\-77.75757\\53\\-69.33594\\-77.03655\\53\\-65.42969\\-76.44586\\53\\-55.66406\\-76.14718\\53\\-51.75781\\-76.18206\\53\\-45.89844\\-76.51251\\53\\-41.99219\\-76.96346\\53\\-38.08594\\-77.63858\\53\\-34.17969\\-78.17066\\53\\-30.27344\\-78.92834\\53\\-28.32031\\-79.48251\\53\\-22.46094\\-80.53635\\53\\-20.50781\\-81.01398\\53\\-18.55469\\-81.64673\\53\\-16.60156\\-81.99548\\53\\-14.64844\\-82.20553\\53\\-12.69531\\-82.31407\\53\\-10.74219\\-82.30943\\53\\-8.789063\\-82.19498\\53\\-2.929688\\-81.71249\\53\\0.9765625\\-81.33504\\53\\4.882813\\-81.17322\\53\\6.835938\\-81.14181\\53\\10.74219\\-81.25107\\53\\12.69531\\-81.39301\\53\\14.64844\\-81.43056\\53\\16.60156\\-81.23532\\53\\20.50781\\-80.41964\\53\\24.41406\\-79.51334\\53\\26.36719\\-78.87109\\53\\28.32031\\-78.3493\\53\\32.22656\\-77.58452\\53\\34.17969\\-77.13017\\53\\38.08594\\-76.49306\\53\\43.94531\\-76.32793\\53\\51.75781\\-76.32262\\53\\59.57031\\-76.61452\\53\\61.52344\\-76.81643\\53\\65.42969\\-77.33576\\53\\67.38281\\-77.67087\\53\\71.28906\\-78.08705\\53\\75.19531\\-78.69931\\53\\77.14844\\-79.06932\\53\\79.10156\\-79.55332\\53\\83.00781\\-80.2153\\53\\84.96094\\-80.46821\\53\\86.91406\\-80.83296\\53\\90.82031\\-81.89721\\53\\92.77344\\-82.22396\\53\\94.72656\\-82.67836\\53\\96.67969\\-83.48047\\53\\100.5859\\-84.76435\\53\\102.5391\\-85.65639\\53\\104.4922\\-86.26796\\53\\106.4453\\-87.22446\\53\\108.3984\\-87.94702\\53\\110.3516\\-88.85705\\53\\112.3047\\-89.93497\\53\\114.2578\\-91.26646\\53\\116.2109\\-92.49713\\53\\118.1641\\-93.9472\\53\\121.304\\-96.74219\\53\\123.1\\-98.69531\\53\\126.1636\\-102.6016\\53\\128.7802\\-106.5078\\53\\129.9235\\-108.4609\\53\\130.9105\\-110.4141\\53\\132.1929\\-112.3672\\53\\133.1772\\-114.3203\\53\\134.4342\\-116.2734\\53\\135.2572\\-118.2266\\53\\136.3294\\-120.1797\\53\\136.9153\\-122.1328\\53\\138.0568\\-124.0859\\53\\138.7775\\-126.0391\\53\\139.81\\-127.9922\\53\\141.3591\\-131.8984\\53\\142.2422\\-133.8516\\53\\142.7047\\-135.8047\\53\\143.3519\\-137.7578\\53\\144.2038\\-139.7109\\53\\144.6761\\-141.6641\\53\\146.2137\\-145.5703\\53\\146.7026\\-147.5234\\53\\147.4609\\-149.5723\\53\\148.0421\\-151.4297\\53\\148.7317\\-155.3359\\53\\149.1484\\-157.2891\\53\\149.7206\\-159.2422\\53\\150.1073\\-161.1953\\53\\150.7415\\-167.0547\\53\\151.6602\\-172.9141\\53\\151.8468\\-174.8672\\53\\152.0533\\-178.7734\\53\\152.1802\\-184.6328\\53\\152.1762\\-188.5391\\53\\152.0533\\-194.3984\\53\\151.9054\\-198.3047\\53\\151.6263\\-202.2109\\53\\150.6503\\-210.0234\\53\\150.3024\\-213.9297\\53\\150.0507\\-215.8828\\53\\149.6564\\-217.8359\\53\\149.047\\-219.7891\\53\\148.2738\\-223.6953\\53\\147.739\\-225.6484\\53\\146.8348\\-227.6016\\53\\146.1189\\-229.5547\\53\\144.928\\-231.5078\\53\\144.1274\\-233.4609\\53\\142.8885\\-235.4141\\53\\141.956\\-237.3672\\53\\140.5625\\-239.3203\\53\\137.3567\\-243.2266\\53\\135.8325\\-245.1797\\53\\133.7891\\-247.5628\\53\\131.8359\\-249.5242\\53\\128.232\\-252.9922\\53\\125.9669\\-254.9453\\53\\122.0703\\-257.9516\\53\\121.0272\\-258.8516\\53\\118.1641\\-261.0107\\53\\116.2109\\-262.1449\\53\\114.2578\\-263.4363\\53\\112.3047\\-264.3023\\53\\110.3516\\-265.5619\\53\\108.3644\\-266.6641\\53\\106.4453\\-267.618\\53\\102.5391\\-269.4047\\53\\100.5859\\-269.9552\\53\\98.63281\\-271.0119\\53\\96.67969\\-271.6656\\53\\94.72656\\-272.6042\\53\\92.77344\\-273.3719\\53\\90.82031\\-274.0204\\53\\88.86719\\-274.9419\\53\\84.96094\\-276.0042\\53\\83.00781\\-276.9433\\53\\81.05469\\-277.4859\\53\\77.14844\\-279.2701\\53\\75.19531\\-280.1057\\53\\73.24219\\-281.0435\\53\\71.28906\\-281.6787\\53\\69.33594\\-282.6727\\53\\67.38281\\-283.2827\\53\\65.42969\\-284.1259\\53\\63.47656\\-285.0993\\53\\61.52344\\-285.8831\\53\\59.57031\\-286.8705\\53\\57.61719\\-287.5158\\53\\55.66406\\-288.5155\\53\\53.71094\\-289.1074\\53\\51.75781\\-289.5906\\53\\49.80469\\-290.6128\\53\\47.85156\\-291.2027\\53\\43.94531\\-292.8289\\53\\41.99219\\-293.3961\\53\\40.03906\\-294.2641\\53\\38.08594\\-294.795\\53\\34.17969\\-295.6354\\53\\32.22656\\-296.4396\\53\\30.27344\\-296.8557\\53\\28.32031\\-297.1723\\53\\26.36719\\-297.6947\\53\\24.41406\\-298.3937\\53\\18.55469\\-299.3699\\53\\16.42072\\-299.8672\\53\\14.64844\\-300.182\\53\\10.74219\\-300.5608\\53\\2.929688\\-300.8954\\53\\-0.9765625\\-300.9373\\53\\-6.835938\\-300.782\\53\\-12.69531\\-300.4825\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "289" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "153" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-300.091\\55\\-18.55469\\-299.6127\\55\\-20.50781\\-299.2442\\55\\-24.41406\\-298.6671\\55\\-26.36719\\-298.301\\55\\-28.32031\\-297.6224\\55\\-30.27344\\-297.1897\\55\\-34.17969\\-296.6178\\55\\-38.08594\\-295.4694\\55\\-41.99219\\-294.8158\\55\\-43.94531\\-294.4049\\55\\-45.89844\\-293.6673\\55\\-49.80469\\-292.6396\\55\\-51.75781\\-291.792\\55\\-53.71094\\-291.1763\\55\\-55.66406\\-290.7186\\55\\-57.61719\\-289.8773\\55\\-59.57031\\-289.3096\\55\\-61.52344\\-288.9761\\55\\-63.47656\\-288.474\\55\\-65.42969\\-287.7022\\55\\-69.33594\\-286.7066\\55\\-71.28906\\-285.9096\\55\\-73.24219\\-285.3289\\55\\-75.19531\\-284.8492\\55\\-77.14844\\-284.0439\\55\\-79.10156\\-283.4284\\55\\-81.05469\\-283.1019\\55\\-83.00781\\-282.6358\\55\\-84.96094\\-281.9308\\55\\-86.91406\\-281.4125\\55\\-88.86719\\-281.012\\55\\-92.77344\\-279.5515\\55\\-94.72656\\-278.9784\\55\\-96.67969\\-277.9908\\55\\-100.5859\\-276.6684\\55\\-102.5391\\-275.6715\\55\\-104.4922\\-275.0484\\55\\-106.4453\\-273.8942\\55\\-108.3984\\-272.9324\\55\\-112.3047\\-270.1839\\55\\-114.2578\\-269.2031\\55\\-116.2109\\-267.7288\\55\\-120.1172\\-264.5187\\55\\-122.0703\\-263.0933\\55\\-124.0234\\-261.4125\\55\\-127.9297\\-257.5713\\55\\-128.6804\\-256.8984\\55\\-131.8359\\-253.5794\\55\\-134.1271\\-251.0391\\55\\-135.7422\\-248.9806\\55\\-136.9504\\-247.1328\\55\\-139.6484\\-243.6304\\55\\-140.024\\-243.2266\\55\\-142.4377\\-239.3203\\55\\-143.2683\\-237.3672\\55\\-144.3768\\-235.4141\\55\\-145.1801\\-233.4609\\55\\-146.247\\-231.5078\\55\\-146.9389\\-229.5547\\55\\-147.8985\\-227.6016\\55\\-148.8796\\-223.6953\\55\\-149.6153\\-221.7422\\55\\-150.142\\-219.7891\\55\\-150.8328\\-215.8828\\55\\-151.5416\\-213.9297\\55\\-152.0235\\-211.9766\\55\\-152.6384\\-208.0703\\55\\-153.5197\\-204.1641\\55\\-153.9659\\-200.2578\\55\\-154.1795\\-196.3516\\55\\-154.3135\\-192.4453\\55\\-154.2908\\-188.5391\\55\\-154.3674\\-184.6328\\55\\-154.1971\\-180.7266\\55\\-153.3203\\-179.244\\55\\-152.4431\\-178.7734\\55\\-151.6062\\-176.8203\\55\\-153.6873\\-174.8672\\55\\-153.4288\\-172.9141\\55\\-152.6493\\-169.0078\\55\\-152.0235\\-165.1016\\55\\-151.591\\-163.1484\\55\\-150.9209\\-161.1953\\55\\-150.512\\-159.2422\\55\\-150.224\\-157.2891\\55\\-149.817\\-155.3359\\55\\-149.1298\\-153.3828\\55\\-148.6217\\-151.4297\\55\\-148.2457\\-149.4766\\55\\-147.6647\\-147.5234\\55\\-146.839\\-145.5703\\55\\-146.2467\\-143.6172\\55\\-144.6332\\-139.7109\\55\\-144.0979\\-137.7578\\55\\-143.1245\\-135.8047\\55\\-141.9523\\-131.8984\\55\\-140.9486\\-129.9453\\55\\-140.2252\\-127.9922\\55\\-139.0425\\-126.0391\\55\\-138.3118\\-124.0859\\55\\-137.2621\\-122.1328\\55\\-136.5297\\-120.1797\\55\\-135.4047\\-118.2266\\55\\-134.5691\\-116.2734\\55\\-133.284\\-114.3203\\55\\-132.2198\\-112.3672\\55\\-130.821\\-110.4141\\55\\-129.8828\\-108.6746\\55\\-128.4317\\-106.5078\\55\\-125.9766\\-103.5851\\55\\-124.0234\\-101.4488\\55\\-121.1291\\-98.69531\\55\\-118.1641\\-96.11486\\55\\-116.2109\\-94.63572\\55\\-112.3047\\-92.34447\\55\\-110.3516\\-91.27202\\55\\-108.3984\\-89.9866\\55\\-104.4922\\-87.99695\\55\\-98.63281\\-85.55919\\55\\-96.67969\\-84.66662\\55\\-90.82031\\-82.19456\\55\\-88.86719\\-81.76185\\55\\-86.91406\\-80.99905\\55\\-84.96094\\-80.45584\\55\\-81.05469\\-79.58655\\55\\-79.10156\\-79.01546\\55\\-75.19531\\-78.19892\\55\\-71.28906\\-77.62385\\55\\-65.42969\\-76.61681\\55\\-61.52344\\-76.42847\\55\\-55.66406\\-76.26452\\55\\-51.75781\\-76.29429\\55\\-49.80469\\-76.40706\\55\\-45.89844\\-76.73882\\55\\-42.04102\\-77.21094\\55\\-40.03906\\-77.56065\\55\\-34.17969\\-78.37486\\55\\-32.22656\\-78.74812\\55\\-28.32031\\-79.71745\\55\\-22.46094\\-80.74483\\55\\-20.50781\\-81.367\\55\\-18.55469\\-81.84319\\55\\-16.60156\\-82.05824\\55\\-12.69531\\-82.25947\\55\\-8.789063\\-82.06398\\55\\-4.882813\\-81.72173\\55\\-2.929688\\-81.41599\\55\\2.929688\\-81.02985\\55\\6.835938\\-80.94171\\55\\10.74219\\-80.95443\\55\\14.64844\\-81.1254\\55\\16.60156\\-80.99905\\55\\20.50781\\-80.41964\\55\\24.41406\\-79.63527\\55\\26.36719\\-79.02863\\55\\30.27344\\-78.12505\\55\\32.22656\\-77.79567\\55\\36.13281\\-77.02393\\55\\40.03906\\-76.57983\\55\\41.99219\\-76.47852\\55\\51.75781\\-76.48779\\55\\55.66406\\-76.62628\\55\\61.52344\\-77.14436\\55\\67.38281\\-77.92371\\55\\69.33594\\-78.12347\\55\\73.24219\\-78.64211\\55\\77.14844\\-79.44206\\55\\81.05469\\-80.17336\\55\\84.96094\\-80.65248\\55\\86.83268\\-81.11719\\55\\88.86719\\-81.73631\\55\\92.77344\\-82.41724\\55\\96.67969\\-83.73484\\55\\98.63281\\-84.30585\\55\\102.5391\\-85.86758\\55\\104.4922\\-86.47883\\55\\106.4453\\-87.50497\\55\\108.3984\\-88.12215\\55\\110.3516\\-89.21983\\55\\112.3047\\-90.21107\\55\\116.2109\\-92.96114\\55\\118.1641\\-94.21825\\55\\120.1172\\-95.84806\\55\\122.9162\\-98.69531\\55\\124.4801\\-100.6484\\55\\125.9766\\-102.7139\\55\\128.63\\-106.5078\\55\\130.7752\\-110.4141\\55\\131.9627\\-112.3672\\55\\133.0205\\-114.3203\\55\\134.2364\\-116.2734\\55\\135.0932\\-118.2266\\55\\136.1677\\-120.1797\\55\\136.8049\\-122.1328\\55\\137.8046\\-124.0859\\55\\139.4821\\-127.9922\\55\\140.4657\\-129.9453\\55\\141.1513\\-131.8984\\55\\142.1348\\-133.8516\\55\\143.1518\\-137.7578\\55\\144.0677\\-139.7109\\55\\144.5726\\-141.6641\\55\\145.1801\\-143.6172\\55\\146.0779\\-145.5703\\55\\146.5727\\-147.5234\\55\\147.8929\\-151.4297\\55\\148.3004\\-153.3828\\55\\148.9898\\-157.2891\\55\\149.9821\\-161.1953\\55\\150.2551\\-163.1484\\55\\150.824\\-169.0078\\55\\151.4048\\-172.9141\\55\\151.8019\\-176.8203\\55\\151.9742\\-180.7266\\55\\152.0433\\-184.6328\\55\\152.03\\-188.5391\\55\\151.8809\\-194.3984\\55\\151.6712\\-198.3047\\55\\151.3134\\-202.2109\\55\\150.8665\\-206.1172\\55\\150.1684\\-213.9297\\55\\149.8306\\-215.8828\\55\\148.8255\\-219.7891\\55\\148.0862\\-223.6953\\55\\147.4609\\-225.4333\\55\\145.7896\\-229.5547\\55\\144.6574\\-231.5078\\55\\143.7789\\-233.4609\\55\\141.6016\\-237.2491\\55\\140.2391\\-239.3203\\55\\137.6953\\-242.4979\\55\\133.7891\\-246.9756\\55\\129.6794\\-251.0391\\55\\125.9766\\-254.4806\\55\\123.014\\-256.8984\\55\\120.1172\\-259.1221\\55\\116.2109\\-261.7686\\55\\114.2578\\-263.0316\\55\\112.3047\\-263.8747\\55\\110.3516\\-265.1358\\55\\108.3984\\-266.047\\55\\106.4453\\-267.2523\\55\\104.4922\\-268.0053\\55\\102.5391\\-269.0535\\55\\100.5859\\-269.6411\\55\\98.63281\\-270.4231\\55\\96.67969\\-271.3548\\55\\94.72656\\-271.9849\\55\\92.77344\\-272.9997\\55\\90.82031\\-273.6573\\55\\86.91406\\-275.2301\\55\\84.96094\\-275.7223\\55\\83.00781\\-276.5874\\55\\79.10156\\-277.9727\\55\\77.14844\\-279.1044\\55\\75.19531\\-279.8724\\55\\73.24219\\-280.9243\\55\\71.28906\\-281.5783\\55\\69.33594\\-282.5733\\55\\67.38281\\-283.2484\\55\\65.42969\\-284.0409\\55\\63.47656\\-285.0516\\55\\61.52344\\-285.8291\\55\\59.57031\\-286.8558\\55\\57.61719\\-287.5118\\55\\55.66406\\-288.5267\\55\\53.71094\\-289.1074\\55\\51.75781\\-289.5777\\55\\49.80469\\-290.6296\\55\\47.85156\\-291.2226\\55\\43.94531\\-292.8592\\55\\41.99219\\-293.464\\55\\40.03906\\-294.3109\\55\\38.08594\\-294.8323\\55\\36.13281\\-295.1932\\55\\34.17969\\-295.7222\\55\\32.22656\\-296.4897\\55\\28.32031\\-297.2033\\55\\24.41406\\-298.4603\\55\\18.55469\\-299.4188\\55\\16.60156\\-299.9048\\55\\14.64844\\-300.2263\\55\\10.74219\\-300.5759\\55\\6.835938\\-300.7699\\55\\0.9765625\\-300.9503\\55\\-2.929688\\-300.932\\55\\-6.835938\\-300.8154\\55\\-12.69531\\-300.5275\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "299" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "154" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-300.1377\\57\\-20.50781\\-299.2951\\57\\-24.41406\\-298.7001\\57\\-26.36719\\-298.3488\\57\\-28.32031\\-297.6822\\57\\-30.27344\\-297.2142\\57\\-34.17969\\-296.6405\\57\\-36.13281\\-296.1175\\57\\-38.08594\\-295.4825\\57\\-41.99219\\-294.8341\\57\\-43.94531\\-294.4023\\57\\-45.89844\\-293.6521\\57\\-49.80469\\-292.6396\\57\\-51.75781\\-291.7357\\57\\-53.71094\\-291.1216\\57\\-55.66406\\-290.6572\\57\\-57.61719\\-289.7286\\57\\-59.57031\\-289.2537\\57\\-61.52344\\-288.8945\\57\\-63.47656\\-288.3186\\57\\-65.42969\\-287.5479\\57\\-69.33594\\-286.5418\\57\\-71.28906\\-285.6804\\57\\-75.19531\\-284.6291\\57\\-77.14844\\-283.7603\\57\\-81.05469\\-282.9254\\57\\-84.96094\\-281.6486\\57\\-88.86719\\-280.7581\\57\\-90.82031\\-279.8955\\57\\-94.72656\\-278.6066\\57\\-96.67969\\-277.649\\57\\-98.63281\\-277.118\\57\\-100.5859\\-276.16\\57\\-104.4922\\-274.7153\\57\\-104.8177\\-274.4766\\57\\-108.3139\\-272.5234\\57\\-110.3516\\-271.2896\\57\\-112.3047\\-269.8746\\57\\-114.2578\\-268.867\\57\\-116.2109\\-267.4364\\57\\-120.1172\\-264.1055\\57\\-122.0064\\-262.7578\\57\\-124.2247\\-260.8047\\57\\-128.3763\\-256.8984\\57\\-130.2279\\-254.9453\\57\\-133.7891\\-250.823\\57\\-135.7422\\-248.5017\\57\\-136.6828\\-247.1328\\57\\-138.19\\-245.1797\\57\\-139.6484\\-243.1271\\57\\-142.216\\-239.3203\\57\\-143.0092\\-237.3672\\57\\-144.1606\\-235.4141\\57\\-144.8938\\-233.4609\\57\\-146.0202\\-231.5078\\57\\-146.6964\\-229.5547\\57\\-147.6249\\-227.6016\\57\\-148.2689\\-225.6484\\57\\-148.6955\\-223.6953\\57\\-149.9821\\-219.7891\\57\\-150.6575\\-215.8828\\57\\-151.1574\\-213.9297\\57\\-151.8019\\-211.9766\\57\\-152.1752\\-210.0234\\57\\-152.7861\\-206.1172\\57\\-153.556\\-202.2109\\57\\-153.7823\\-200.2578\\57\\-154.031\\-196.3516\\57\\-154.1998\\-190.4922\\57\\-154.1901\\-184.6328\\57\\-154.1491\\-182.6797\\57\\-153.755\\-180.7266\\57\\-153.3203\\-180.2919\\57\\-151.3672\\-179.8018\\57\\-149.4141\\-181.1705\\57\\-147.4609\\-181.0335\\57\\-145.5078\\-180.0368\\57\\-143.5547\\-179.474\\57\\-142.4037\\-178.7734\\57\\-143.5547\\-177.6992\\57\\-144.2871\\-176.8203\\57\\-145.2456\\-174.8672\\57\\-145.5078\\-174.5627\\57\\-147.4609\\-173.087\\57\\-149.4141\\-173.3349\\57\\-151.3672\\-173.9317\\57\\-151.9134\\-172.9141\\57\\-152.491\\-170.9609\\57\\-152.4193\\-169.0078\\57\\-152.1474\\-167.0547\\57\\-151.7639\\-165.1016\\57\\-151.1302\\-163.1484\\57\\-150.6564\\-161.1953\\57\\-150.0423\\-157.2891\\57\\-148.8607\\-153.3828\\57\\-148.0493\\-149.4766\\57\\-147.24\\-147.5234\\57\\-145.9872\\-143.6172\\57\\-145.0133\\-141.6641\\57\\-144.439\\-139.7109\\57\\-143.7645\\-137.7578\\57\\-142.881\\-135.8047\\57\\-142.3816\\-133.8516\\57\\-140.6883\\-129.9453\\57\\-139.9075\\-127.9922\\57\\-138.7906\\-126.0391\\57\\-138.0143\\-124.0859\\57\\-137.0124\\-122.1328\\57\\-136.2953\\-120.1797\\57\\-135.1149\\-118.2266\\57\\-134.3061\\-116.2734\\57\\-132.9773\\-114.3203\\57\\-130.6839\\-110.4141\\57\\-128.1389\\-106.5078\\57\\-126.4986\\-104.5547\\57\\-124.0234\\-101.778\\57\\-120.785\\-98.69531\\57\\-118.4346\\-96.74219\\57\\-118.1641\\-96.4342\\57\\-115.9668\\-94.78906\\57\\-114.2578\\-93.82449\\57\\-112.3047\\-92.59004\\57\\-110.3516\\-91.6725\\57\\-108.3984\\-90.34956\\57\\-106.4453\\-89.43436\\57\\-104.4922\\-88.23599\\57\\-102.5391\\-87.60291\\57\\-100.5859\\-86.61713\\57\\-98.63281\\-85.82076\\57\\-94.72656\\-84.02403\\57\\-92.77344\\-83.27855\\57\\-90.82031\\-82.38287\\57\\-86.91406\\-81.39092\\57\\-84.96094\\-80.65248\\57\\-83.00781\\-80.26481\\57\\-79.10156\\-79.35043\\57\\-77.14844\\-78.80724\\57\\-73.24219\\-78.07589\\57\\-65.42969\\-76.95467\\57\\-61.52344\\-76.61734\\57\\-55.66406\\-76.395\\57\\-53.71094\\-76.37666\\57\\-49.80469\\-76.56208\\57\\-43.94531\\-77.24879\\57\\-40.03906\\-77.81236\\57\\-36.13281\\-78.26307\\57\\-32.22656\\-79.06932\\57\\-30.27344\\-79.58836\\57\\-24.41406\\-80.5863\\57\\-20.50781\\-81.64925\\57\\-18.55469\\-81.94634\\57\\-16.60156\\-82.12352\\57\\-12.69531\\-82.18961\\57\\-8.789063\\-81.95159\\57\\-4.882813\\-81.50924\\57\\-0.9765625\\-81.1254\\57\\2.929688\\-80.91436\\57\\4.882813\\-80.85825\\57\\10.74219\\-80.80614\\57\\14.64844\\-80.88609\\57\\16.60156\\-80.83296\\57\\18.55469\\-80.66281\\57\\22.46094\\-80.21276\\57\\26.36719\\-79.29688\\57\\28.32031\\-78.73869\\57\\32.22656\\-77.97443\\57\\36.13281\\-77.32191\\57\\40.03906\\-76.83794\\57\\41.99219\\-76.71606\\57\\51.75781\\-76.72266\\57\\55.66406\\-76.92911\\57\\59.57031\\-77.24879\\57\\69.33594\\-78.29058\\57\\73.24219\\-78.90498\\57\\75.19531\\-79.36382\\57\\77.14844\\-79.71017\\57\\81.05469\\-80.28257\\57\\83.00781\\-80.51476\\57\\84.96094\\-80.88432\\57\\86.91406\\-81.45467\\57\\88.86719\\-81.89233\\57\\92.77344\\-82.61808\\57\\94.72656\\-83.34431\\57\\98.63281\\-84.50539\\57\\100.5859\\-85.44662\\57\\102.5391\\-86.04414\\57\\104.4922\\-86.76522\\57\\106.4453\\-87.72631\\57\\108.3984\\-88.36501\\57\\110.3516\\-89.54479\\57\\112.3047\\-90.48301\\57\\115.7227\\-92.83594\\57\\116.2109\\-93.26412\\57\\118.1641\\-94.53329\\57\\120.1172\\-96.15244\\57\\122.6232\\-98.69531\\57\\124.1962\\-100.6484\\57\\128.4849\\-106.5078\\57\\129.4994\\-108.4609\\57\\130.677\\-110.4141\\57\\131.6745\\-112.3672\\57\\134.086\\-116.2734\\57\\134.9383\\-118.2266\\57\\135.9751\\-120.1797\\57\\137.5351\\-124.0859\\57\\138.5091\\-126.0391\\57\\139.2513\\-127.9922\\57\\140.3393\\-129.9453\\57\\141.0074\\-131.8984\\57\\141.9881\\-133.8516\\57\\142.5484\\-135.8047\\57\\143.0086\\-137.7578\\57\\143.9116\\-139.7109\\57\\145.0103\\-143.6172\\57\\145.9358\\-145.5703\\57\\146.9974\\-149.4766\\57\\147.739\\-151.4297\\57\\148.1992\\-153.3828\\57\\148.8643\\-157.2891\\57\\149.8413\\-161.1953\\57\\150.1539\\-163.1484\\57\\150.8852\\-170.9609\\57\\151.591\\-176.8203\\57\\151.724\\-178.7734\\57\\151.864\\-182.6797\\57\\151.864\\-188.5391\\57\\151.7442\\-192.4453\\57\\151.5542\\-196.3516\\57\\150.824\\-204.1641\\57\\150.2125\\-211.9766\\57\\149.9602\\-213.9297\\57\\149.559\\-215.8828\\57\\149.0111\\-217.8359\\57\\148.3104\\-221.7422\\57\\147.8581\\-223.6953\\57\\146.9974\\-225.6484\\57\\146.3397\\-227.6016\\57\\144.4246\\-231.5078\\57\\143.2957\\-233.4609\\57\\142.4216\\-235.4141\\57\\139.8186\\-239.3203\\57\\137.6953\\-242.0625\\57\\135.035\\-245.1797\\57\\131.8359\\-248.5474\\57\\129.2894\\-251.0391\\57\\125.9766\\-254.0932\\57\\124.0234\\-255.7173\\57\\122.0703\\-257.1928\\57\\120.1172\\-258.4568\\57\\116.2109\\-261.3919\\57\\114.2578\\-262.3916\\57\\112.3047\\-263.587\\57\\110.0426\\-264.7109\\57\\106.4453\\-266.6718\\57\\100.5859\\-269.3898\\57\\98.63281\\-269.9257\\57\\96.67969\\-270.9341\\57\\94.72656\\-271.6151\\57\\92.77344\\-272.4258\\57\\90.82031\\-273.3472\\57\\88.86719\\-274.004\\57\\86.91406\\-274.9616\\57\\84.96094\\-275.5194\\57\\83.00781\\-276.1855\\57\\81.05469\\-277.1321\\57\\79.10156\\-277.7695\\57\\77.14844\\-278.9064\\57\\75.19531\\-279.7098\\57\\73.24219\\-280.8085\\57\\71.28906\\-281.4945\\57\\69.33594\\-282.4645\\57\\65.42969\\-283.9745\\57\\63.47656\\-285.0308\\57\\61.52344\\-285.806\\57\\59.57031\\-286.8558\\57\\57.61719\\-287.5118\\57\\55.66406\\-288.5155\\57\\51.75781\\-289.6432\\57\\49.80469\\-290.6809\\57\\47.85156\\-291.2442\\57\\45.89844\\-292.1494\\57\\43.94531\\-292.9067\\57\\41.99219\\-293.5136\\57\\40.03906\\-294.3814\\57\\38.08594\\-294.8674\\57\\36.13281\\-295.2423\\57\\34.17969\\-295.8032\\57\\32.22656\\-296.5372\\57\\28.32031\\-297.2612\\57\\24.41406\\-298.5138\\57\\20.50781\\-299.144\\57\\16.60156\\-300.0026\\57\\14.64844\\-300.2787\\57\\10.74219\\-300.5982\\57\\6.835938\\-300.804\\57\\0.9765625\\-300.9908\\57\\-0.9765625\\-300.9976\\57\\-6.835938\\-300.8438\\57\\-12.69531\\-300.5569\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "301" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "155" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-300.1711\\59\\-20.50781\\-299.3404\\59\\-26.36719\\-298.3937\\59\\-28.32031\\-297.7477\\59\\-30.27344\\-297.2465\\59\\-34.17969\\-296.6593\\59\\-36.13281\\-296.1723\\59\\-38.08594\\-295.4956\\59\\-41.99219\\-294.8391\\59\\-43.94531\\-294.4049\\59\\-45.89844\\-293.6392\\59\\-49.80469\\-292.6166\\59\\-51.75781\\-291.6909\\59\\-53.71094\\-291.0877\\59\\-55.66406\\-290.5956\\59\\-57.61719\\-289.6393\\59\\-61.52344\\-288.8098\\59\\-65.42969\\-287.4218\\59\\-67.38281\\-286.9502\\59\\-69.33594\\-286.3174\\59\\-71.28906\\-285.4846\\59\\-73.24219\\-284.9938\\59\\-77.14844\\-283.5463\\59\\-81.05469\\-282.6838\\59\\-83.00781\\-281.9333\\59\\-86.91406\\-281.0044\\59\\-88.86719\\-280.3588\\59\\-90.82031\\-279.5536\\59\\-92.77344\\-278.9987\\59\\-94.72656\\-278.0596\\59\\-98.63281\\-276.7804\\59\\-100.5859\\-275.8146\\59\\-102.5391\\-275.2517\\59\\-106.4453\\-273.3015\\59\\-108.3984\\-271.9698\\59\\-110.3516\\-270.9648\\59\\-116.2109\\-267.0756\\59\\-120.1172\\-263.7461\\59\\-121.5041\\-262.7578\\59\\-123.7146\\-260.8047\\59\\-125.9766\\-258.625\\59\\-127.8865\\-256.8984\\59\\-129.8828\\-254.8477\\59\\-131.3726\\-252.9922\\59\\-134.8778\\-249.0859\\59\\-136.4553\\-247.1328\\59\\-139.1236\\-243.2266\\59\\-140.6136\\-241.2734\\59\\-141.9103\\-239.3203\\59\\-142.7847\\-237.3672\\59\\-143.9006\\-235.4141\\59\\-144.6607\\-233.4609\\59\\-145.721\\-231.5078\\59\\-147.2572\\-227.6016\\59\\-148.0818\\-225.6484\\59\\-149.0331\\-221.7422\\59\\-149.7467\\-219.7891\\59\\-150.1988\\-217.8359\\59\\-150.8634\\-213.9297\\59\\-151.5158\\-211.9766\\59\\-151.9954\\-210.0234\\59\\-152.8503\\-204.1641\\59\\-153.5441\\-200.2578\\59\\-153.8597\\-196.3516\\59\\-153.9477\\-194.3984\\59\\-154.0514\\-188.5391\\59\\-154.0232\\-184.6328\\59\\-153.9368\\-182.6797\\59\\-153.3203\\-181.8437\\59\\-151.3672\\-180.7744\\59\\-149.4141\\-182.2689\\59\\-147.4609\\-182.3821\\59\\-145.0331\\-180.7266\\59\\-143.5547\\-179.9874\\59\\-141.6016\\-179.6632\\59\\-140.479\\-178.7734\\59\\-143.0249\\-174.8672\\59\\-143.5547\\-173.7353\\59\\-144.1569\\-172.9141\\59\\-145.5078\\-171.7221\\59\\-147.4609\\-171.1296\\59\\-149.4141\\-172.0051\\59\\-151.3672\\-171.6743\\59\\-151.9695\\-170.9609\\59\\-152.2021\\-169.0078\\59\\-151.9165\\-167.0547\\59\\-150.8031\\-163.1484\\59\\-150.1918\\-159.2422\\59\\-149.7724\\-157.2891\\59\\-149.0583\\-155.3359\\59\\-148.2457\\-151.4297\\59\\-147.739\\-149.4766\\59\\-146.8918\\-147.5234\\59\\-146.3486\\-145.5703\\59\\-145.6442\\-143.6172\\59\\-144.7477\\-141.6641\\59\\-144.2115\\-139.7109\\59\\-143.2977\\-137.7578\\59\\-142.1513\\-133.8516\\59\\-141.1611\\-131.8984\\59\\-140.4224\\-129.9453\\59\\-139.4149\\-127.9922\\59\\-137.5781\\-124.0859\\59\\-135.9652\\-120.1797\\59\\-134.8748\\-118.2266\\59\\-133.9673\\-116.2734\\59\\-131.8359\\-112.9292\\59\\-131.4135\\-112.3672\\59\\-130.4803\\-110.4141\\59\\-127.9297\\-106.7302\\59\\-126.2008\\-104.5547\\59\\-124.0234\\-102.1133\\59\\-122.5586\\-100.6484\\59\\-120.1172\\-98.44783\\59\\-117.9874\\-96.74219\\59\\-115.4199\\-94.78906\\59\\-114.2578\\-94.02951\\59\\-112.3047\\-93.06432\\59\\-110.3516\\-91.98356\\59\\-108.3984\\-90.78807\\59\\-106.4453\\-89.76421\\59\\-104.4922\\-88.59423\\59\\-102.5391\\-87.86041\\59\\-100.5859\\-86.87581\\59\\-96.67969\\-85.22784\\59\\-94.72656\\-84.21061\\59\\-92.77344\\-83.53625\\59\\-90.82031\\-82.64008\\59\\-88.86719\\-82.09978\\59\\-86.91406\\-81.7005\\59\\-84.96094\\-80.89934\\59\\-83.00781\\-80.40751\\59\\-79.10156\\-79.66537\\59\\-77.14844\\-79.11188\\59\\-73.24219\\-78.27267\\59\\-63.47656\\-77.04935\\59\\-61.52344\\-76.90576\\59\\-57.61719\\-76.79057\\59\\-55.66406\\-76.63197\\59\\-53.71094\\-76.60059\\59\\-49.80469\\-76.87395\\59\\-45.89844\\-77.37856\\59\\-38.08594\\-78.24995\\59\\-36.13281\\-78.56175\\59\\-32.22656\\-79.48959\\59\\-26.36719\\-80.44348\\59\\-24.41406\\-80.87119\\59\\-22.46094\\-81.41824\\59\\-20.50781\\-81.86213\\59\\-16.60156\\-82.15925\\59\\-14.64844\\-82.19498\\59\\-12.69531\\-82.12389\\59\\-8.789063\\-81.83844\\59\\-4.882813\\-81.36319\\59\\-0.9765625\\-81\\59\\2.929688\\-80.84754\\59\\10.74219\\-80.68392\\59\\14.64844\\-80.70856\\59\\18.55469\\-80.59592\\59\\22.46094\\-80.24223\\59\\24.41406\\-79.81726\\59\\26.36719\\-79.49908\\59\\28.32031\\-78.98968\\59\\32.22656\\-78.1875\\59\\36.13281\\-77.62109\\59\\40.03906\\-77.15875\\59\\41.99219\\-77.06233\\59\\45.89844\\-77.02393\\59\\51.75781\\-77.0755\\59\\55.66406\\-77.23419\\59\\59.57031\\-77.55599\\59\\67.38281\\-78.25964\\59\\71.28906\\-78.79707\\59\\75.19531\\-79.61221\\59\\79.10156\\-80.18741\\59\\83.00781\\-80.70856\\59\\86.91406\\-81.72832\\59\\90.82031\\-82.37276\\59\\92.77344\\-82.88947\\59\\94.72656\\-83.59902\\59\\96.67969\\-84.13809\\59\\98.63281\\-84.78442\\59\\100.5859\\-85.68821\\59\\102.5391\\-86.25128\\59\\104.4922\\-87.14063\\59\\108.3984\\-88.63089\\59\\112.2735\\-90.88281\\59\\115.3129\\-92.83594\\59\\117.998\\-94.78906\\59\\120.1172\\-96.51839\\59\\122.2486\\-98.69531\\59\\124.0234\\-100.8349\\59\\125.9766\\-103.3224\\59\\128.3075\\-106.5078\\59\\129.3335\\-108.4609\\59\\130.5565\\-110.4141\\59\\131.4439\\-112.3672\\59\\131.8359\\-112.8923\\59\\133.8412\\-116.2734\\59\\135.7422\\-120.1448\\59\\136.6349\\-122.1328\\59\\137.3033\\-124.0859\\59\\138.3921\\-126.0391\\59\\139.0947\\-127.9922\\59\\140.2213\\-129.9453\\59\\140.8705\\-131.8984\\59\\141.8258\\-133.8516\\59\\142.4583\\-135.8047\\59\\142.9224\\-137.7578\\59\\143.7383\\-139.7109\\59\\144.379\\-141.6641\\59\\144.8817\\-143.6172\\59\\145.7553\\-145.5703\\59\\146.3629\\-147.5234\\59\\146.8307\\-149.4766\\59\\147.5571\\-151.4297\\59\\148.1022\\-153.3828\\59\\149.0979\\-159.2422\\59\\149.6434\\-161.1953\\59\\150.0299\\-163.1484\\59\\150.2615\\-165.1016\\59\\150.7142\\-170.9609\\59\\151.448\\-178.7734\\59\\151.649\\-182.6797\\59\\151.6377\\-188.5391\\59\\151.4893\\-192.4453\\59\\151.0237\\-198.3047\\59\\150.2355\\-210.0234\\59\\150.0338\\-211.9766\\59\\149.7206\\-213.9297\\59\\149.1995\\-215.8828\\59\\148.7903\\-217.8359\\59\\148.1297\\-221.7422\\59\\147.5285\\-223.6953\\59\\146.7203\\-225.6484\\59\\146.0714\\-227.6016\\59\\144.9542\\-229.5547\\59\\144.1833\\-231.5078\\59\\142.9269\\-233.4609\\59\\142.1274\\-235.4141\\59\\139.2645\\-239.3203\\59\\137.8823\\-241.2734\\59\\136.3253\\-243.2266\\59\\134.6608\\-245.1797\\59\\131.8359\\-248.1975\\59\\128.9135\\-251.0391\\59\\125.9766\\-253.6613\\59\\124.0234\\-255.3255\\59\\121.8284\\-256.8984\\59\\120.1172\\-258.0289\\59\\118.1641\\-259.5456\\59\\116.2109\\-260.8761\\59\\114.2578\\-261.9628\\59\\112.3047\\-263.2004\\59\\110.3516\\-264.0024\\59\\108.3984\\-265.2082\\59\\106.4453\\-266.0432\\59\\104.4922\\-267.2087\\59\\102.5391\\-267.9767\\59\\100.5859\\-268.9895\\59\\96.67969\\-270.3374\\59\\94.72656\\-271.2868\\59\\92.77344\\-271.9375\\59\\90.82031\\-272.9934\\59\\88.86719\\-273.6655\\59\\86.91406\\-274.5742\\59\\84.96094\\-275.3197\\59\\83.00781\\-275.9049\\59\\81.05469\\-276.9339\\59\\79.10156\\-277.5848\\59\\77.14844\\-278.7105\\59\\75.19531\\-279.5558\\59\\73.24219\\-280.6771\\59\\71.28906\\-281.4217\\59\\69.33594\\-282.3764\\59\\65.42969\\-283.9237\\59\\63.47656\\-285.014\\59\\61.52344\\-285.7732\\59\\59.57031\\-286.8558\\59\\57.61719\\-287.5242\\59\\55.66406\\-288.5377\\59\\51.75781\\-289.6773\\59\\49.80469\\-290.7259\\59\\47.85156\\-291.2951\\59\\45.89844\\-292.2664\\59\\41.99219\\-293.5786\\59\\40.03906\\-294.4482\\59\\36.13281\\-295.2915\\59\\34.17969\\-295.8906\\59\\32.22656\\-296.5983\\59\\28.32031\\-297.3304\\59\\26.36719\\-298.0226\\59\\24.41406\\-298.5634\\59\\20.50781\\-299.2033\\59\\16.60156\\-300.0789\\59\\12.69531\\-300.5051\\59\\6.835938\\-300.838\\59\\0.9765625\\-301.0095\\59\\-2.929688\\-300.9875\\59\\-8.789063\\-300.7927\\59\\-14.64844\\-300.4244\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "156" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-299.8748\\61\\-20.50781\\-299.385\\61\\-26.36719\\-298.4442\\61\\-30.27344\\-297.2798\\61\\-34.17969\\-296.6878\\61\\-36.13281\\-296.1979\\61\\-38.08594\\-295.5396\\61\\-41.99219\\-294.8457\\61\\-43.94531\\-294.4049\\61\\-45.89844\\-293.621\\61\\-49.80469\\-292.5848\\61\\-51.75781\\-291.6478\\61\\-55.66406\\-290.5227\\61\\-57.61719\\-289.5752\\61\\-61.52344\\-288.7255\\61\\-63.47656\\-287.9387\\61\\-65.42969\\-287.2946\\61\\-67.38281\\-286.8118\\61\\-71.28906\\-285.337\\61\\-73.24219\\-284.817\\61\\-75.19531\\-283.9305\\61\\-77.14844\\-283.3723\\61\\-79.10156\\-283.0109\\61\\-83.00781\\-281.6693\\61\\-86.91406\\-280.7554\\61\\-88.86719\\-279.9138\\61\\-92.77344\\-278.6202\\61\\-94.72656\\-277.6659\\61\\-96.67969\\-277.155\\61\\-98.63281\\-276.2695\\61\\-102.5391\\-274.9745\\61\\-104.4922\\-273.8513\\61\\-106.4453\\-272.9718\\61\\-108.3984\\-271.6283\\61\\-110.3516\\-270.4645\\61\\-112.3047\\-269.4047\\61\\-116.128\\-266.6641\\61\\-121.0556\\-262.7578\\61\\-124.0234\\-260.115\\61\\-125.9766\\-258.1634\\61\\-127.3831\\-256.8984\\61\\-129.8828\\-254.3795\\61\\-131.0179\\-252.9922\\61\\-133.7891\\-249.9031\\61\\-134.5952\\-249.0859\\61\\-136.1515\\-247.1328\\61\\-137.3004\\-245.1797\\61\\-140.3402\\-241.2734\\61\\-141.6016\\-239.1539\\61\\-142.5721\\-237.3672\\61\\-144.4581\\-233.4609\\61\\-145.2743\\-231.5078\\61\\-146.2709\\-229.5547\\61\\-146.931\\-227.6016\\61\\-147.8554\\-225.6484\\61\\-148.8116\\-221.7422\\61\\-150.0547\\-217.8359\\61\\-150.6575\\-213.9297\\61\\-151.1446\\-211.9766\\61\\-151.7736\\-210.0234\\61\\-152.1317\\-208.0703\\61\\-152.6096\\-204.1641\\61\\-153.4557\\-198.3047\\61\\-153.6564\\-196.3516\\61\\-153.8616\\-190.4922\\61\\-153.8696\\-186.5859\\61\\-153.8201\\-184.6328\\61\\-153.6668\\-182.6797\\61\\-153.3203\\-182.3332\\61\\-151.3672\\-181.3812\\61\\-150.1855\\-182.6797\\61\\-149.4141\\-183.2307\\61\\-147.4609\\-183.5457\\61\\-145.6956\\-182.6797\\61\\-143.5547\\-181.1632\\61\\-141.6016\\-180.3197\\61\\-139.474\\-178.7734\\61\\-139.6564\\-176.8203\\61\\-139.513\\-172.9141\\61\\-140.4188\\-170.9609\\61\\-141.6016\\-169.7232\\61\\-143.5547\\-169.1693\\61\\-145.5078\\-170.128\\61\\-147.4609\\-171.3153\\61\\-149.4141\\-171.888\\61\\-151.3672\\-171.2713\\61\\-151.6377\\-170.9609\\61\\-151.9815\\-169.0078\\61\\-151.591\\-167.0547\\61\\-150.9647\\-165.1016\\61\\-150.5737\\-163.1484\\61\\-149.9821\\-159.2422\\61\\-148.8037\\-155.3359\\61\\-148.0336\\-151.4297\\61\\-146.6293\\-147.5234\\61\\-146.1118\\-145.5703\\61\\-145.1755\\-143.6172\\61\\-143.9572\\-139.7109\\61\\-142.992\\-137.7578\\61\\-142.5126\\-135.8047\\61\\-141.8653\\-133.8516\\61\\-140.8636\\-131.8984\\61\\-140.1567\\-129.9453\\61\\-139.0265\\-127.9922\\61\\-138.3064\\-126.0391\\61\\-137.2104\\-124.0859\\61\\-136.5591\\-122.1328\\61\\-134.6656\\-118.2266\\61\\-132.4811\\-114.3203\\61\\-131.1128\\-112.3672\\61\\-130.1962\\-110.4141\\61\\-128.887\\-108.4609\\61\\-127.4414\\-106.5078\\61\\-124.0234\\-102.4063\\61\\-122.0703\\-100.4516\\61\\-116.2109\\-95.67622\\61\\-114.2578\\-94.26591\\61\\-112.3047\\-93.54788\\61\\-110.3516\\-92.23544\\61\\-108.3984\\-91.29082\\61\\-106.4453\\-90.0232\\61\\-102.5391\\-87.99045\\61\\-100.5859\\-87.21494\\61\\-98.63281\\-86.25024\\61\\-96.67969\\-85.49464\\61\\-94.72656\\-84.49847\\61\\-90.82031\\-82.94061\\61\\-88.86719\\-82.27348\\61\\-86.91406\\-81.86983\\61\\-83.00781\\-80.5863\\61\\-81.05469\\-80.25352\\61\\-77.14844\\-79.47796\\61\\-75.19531\\-78.91658\\61\\-71.28906\\-78.20415\\61\\-67.38281\\-77.75209\\61\\-61.52344\\-77.27855\\61\\-57.61719\\-77.10243\\61\\-53.71094\\-77.06125\\61\\-51.75781\\-77.10162\\61\\-49.80469\\-77.24938\\61\\-47.85156\\-77.50875\\61\\-40.03906\\-78.25603\\61\\-36.13281\\-78.90498\\61\\-34.17969\\-79.377\\61\\-26.36719\\-80.64925\\61\\-22.46094\\-81.77915\\61\\-20.50781\\-82.00883\\61\\-16.60156\\-82.18961\\61\\-14.64844\\-82.18307\\61\\-8.789063\\-81.71764\\61\\-6.835938\\-81.41824\\61\\-2.929688\\-81.02985\\61\\0.9765625\\-80.87305\\61\\10.74219\\-80.59592\\61\\12.69531\\-80.61894\\61\\18.55469\\-80.54539\\61\\22.46094\\-80.27769\\61\\26.36719\\-79.64902\\61\\32.22656\\-78.45845\\61\\34.17969\\-78.11193\\61\\38.08594\\-77.66412\\61\\40.03906\\-77.52317\\61\\45.89844\\-77.402\\61\\47.85156\\-77.46539\\61\\51.75781\\-77.47727\\61\\59.57031\\-77.82494\\61\\63.47656\\-78.09209\\61\\65.42969\\-78.28291\\61\\69.33594\\-78.78703\\61\\73.24219\\-79.51729\\61\\79.10156\\-80.36095\\61\\81.05469\\-80.59941\\61\\83.00781\\-80.96992\\61\\84.96094\\-81.56108\\61\\88.86719\\-82.19901\\61\\90.82031\\-82.58527\\61\\92.77344\\-83.28655\\61\\96.67969\\-84.34779\\61\\98.63281\\-85.23016\\61\\102.5391\\-86.48828\\61\\104.4922\\-87.47509\\61\\106.4453\\-88.06909\\61\\108.2571\\-88.92969\\61\\110.3516\\-90.04331\\61\\112.3047\\-91.3381\\61\\114.2578\\-92.42954\\61\\116.2109\\-93.75935\\61\\118.1641\\-95.24144\\61\\119.9236\\-96.74219\\61\\121.9636\\-98.69531\\61\\124.0234\\-101.0853\\61\\125.9766\\-103.5935\\61\\128.108\\-106.5078\\61\\129.1311\\-108.4609\\61\\130.4268\\-110.4141\\61\\131.2825\\-112.3672\\61\\132.5726\\-114.3203\\61\\134.6628\\-118.2266\\61\\136.5345\\-122.1328\\61\\137.1094\\-124.0859\\61\\138.2674\\-126.0391\\61\\138.9732\\-127.9922\\61\\140.1014\\-129.9453\\61\\140.7424\\-131.8984\\61\\141.625\\-133.8516\\61\\142.3523\\-135.8047\\61\\142.8238\\-137.7578\\61\\144.2734\\-141.6641\\61\\144.7822\\-143.6172\\61\\146.2506\\-147.5234\\61\\146.6936\\-149.4766\\61\\148.0008\\-153.3828\\61\\148.9324\\-159.2422\\61\\149.8756\\-163.1484\\61\\150.3361\\-167.0547\\61\\150.5652\\-170.9609\\61\\150.8758\\-174.8672\\61\\151.3438\\-182.6797\\61\\151.3593\\-186.5859\\61\\151.2688\\-190.4922\\61\\150.2728\\-208.0703\\61\\149.8088\\-211.9766\\61\\148.9324\\-215.8828\\61\\148.3054\\-219.7891\\61\\147.9245\\-221.7422\\61\\147.1444\\-223.6953\\61\\145.7669\\-227.6016\\61\\144.678\\-229.5547\\61\\143.8184\\-231.5078\\61\\142.7237\\-233.4609\\61\\141.7908\\-235.4141\\61\\140.4474\\-237.3672\\61\\137.33\\-241.2734\\61\\136\\-243.2266\\61\\134.2564\\-245.1797\\61\\133.7891\\-245.5912\\61\\131.8359\\-247.7691\\61\\130.3986\\-249.0859\\61\\128.4433\\-251.0391\\61\\125.9766\\-253.1904\\61\\123.8281\\-254.9453\\61\\121.251\\-256.8984\\61\\114.2578\\-261.6375\\61\\112.3047\\-262.5963\\61\\110.3516\\-263.6616\\61\\108.1848\\-264.7109\\61\\104.4573\\-266.6641\\61\\102.5391\\-267.6009\\61\\100.5859\\-268.3785\\61\\98.63281\\-269.3417\\61\\96.67969\\-269.8962\\61\\94.72656\\-270.9237\\61\\92.77344\\-271.5985\\61\\88.86719\\-273.3863\\61\\86.91406\\-274.14\\61\\84.96094\\-275.1338\\61\\83.00781\\-275.6912\\61\\81.05469\\-276.7198\\61\\79.10156\\-277.4499\\61\\77.14844\\-278.4913\\61\\75.19531\\-279.4333\\61\\73.24219\\-280.5427\\61\\71.28906\\-281.361\\61\\67.38281\\-283.1721\\61\\65.42969\\-283.9004\\61\\63.47656\\-284.9839\\61\\61.52344\\-285.7634\\61\\59.57031\\-286.8744\\61\\57.61719\\-287.5537\\61\\55.66406\\-288.5862\\61\\51.75781\\-289.7598\\61\\49.80469\\-290.7852\\61\\47.85156\\-291.3526\\61\\45.89844\\-292.3695\\61\\41.99219\\-293.7068\\61\\40.03906\\-294.5241\\61\\36.13281\\-295.3367\\61\\32.22656\\-296.6593\\61\\28.32031\\-297.4228\\61\\26.36719\\-298.1498\\61\\24.41406\\-298.6229\\61\\20.50781\\-299.2836\\61\\16.60156\\-300.1602\\61\\14.64844\\-300.379\\61\\10.74219\\-300.6893\\61\\2.929688\\-301.0115\\61\\-0.9765625\\-301.0257\\61\\-4.882813\\-300.9673\\61\\-8.789063\\-300.8209\\61\\-14.64844\\-300.452\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "310" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "157" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-299.948\\63\\-20.50781\\-299.4677\\63\\-22.46094\\-299.0911\\63\\-26.36719\\-298.4989\\63\\-30.27344\\-297.3386\\63\\-34.17969\\-296.7235\\63\\-36.13281\\-296.2726\\63\\-38.08594\\-295.5501\\63\\-41.99219\\-294.8507\\63\\-43.94531\\-294.4254\\63\\-45.89844\\-293.6312\\63\\-49.80469\\-292.543\\63\\-51.75781\\-291.6091\\63\\-55.66406\\-290.4733\\63\\-57.61719\\-289.5194\\63\\-61.52344\\-288.64\\63\\-63.47656\\-287.7728\\63\\-65.42969\\-287.1829\\63\\-67.38281\\-286.701\\63\\-69.33594\\-285.811\\63\\-73.24219\\-284.591\\63\\-75.19531\\-283.6797\\63\\-79.10156\\-282.7873\\63\\-81.05469\\-282.009\\63\\-84.96094\\-281.036\\63\\-86.91406\\-280.3885\\63\\-88.86719\\-279.5801\\63\\-90.82031\\-279.0134\\63\\-92.77344\\-278.085\\63\\-96.67969\\-276.8377\\63\\-98.63281\\-275.8952\\63\\-100.5859\\-275.3519\\63\\-102.5391\\-274.5313\\63\\-104.4922\\-273.5056\\63\\-108.3984\\-271.3505\\63\\-110.3516\\-270.0132\\63\\-112.3047\\-269.0598\\63\\-114.2578\\-267.6649\\63\\-118.1641\\-264.5313\\63\\-120.1172\\-263.208\\63\\-122.0703\\-261.5873\\63\\-124.8208\\-258.8516\\63\\-126.9464\\-256.8984\\63\\-129.8828\\-253.9185\\63\\-131.8359\\-251.6833\\63\\-134.2632\\-249.0859\\63\\-135.7422\\-247.0638\\63\\-136.9774\\-245.1797\\63\\-140.0065\\-241.2734\\63\\-141.1101\\-239.3203\\63\\-142.3765\\-237.3672\\63\\-143.1542\\-235.4141\\63\\-144.2562\\-233.4609\\63\\-144.9316\\-231.5078\\63\\-146.0283\\-229.5547\\63\\-146.6829\\-227.6016\\63\\-147.5436\\-225.6484\\63\\-148.2008\\-223.6953\\63\\-149.1218\\-219.7891\\63\\-149.8198\\-217.8359\\63\\-150.2307\\-215.8828\\63\\-150.4997\\-213.9297\\63\\-150.8695\\-211.9766\\63\\-151.4757\\-210.0234\\63\\-151.9291\\-208.0703\\63\\-152.1924\\-206.1172\\63\\-153.343\\-196.3516\\63\\-153.6021\\-192.4453\\63\\-153.6668\\-188.5391\\63\\-153.6243\\-186.5859\\63\\-153.2643\\-184.6328\\63\\-151.7729\\-182.6797\\63\\-151.3672\\-182.3127\\63\\-149.4141\\-183.4155\\63\\-147.4609\\-184.017\\63\\-145.5078\\-183.8333\\63\\-143.5547\\-182.3019\\63\\-141.6016\\-181.3258\\63\\-140.7128\\-180.7266\\63\\-139.6484\\-179.5121\\63\\-139.2814\\-178.7734\\63\\-139.7446\\-176.8203\\63\\-139.3019\\-174.8672\\63\\-139.1348\\-172.9141\\63\\-139.6484\\-171.8169\\63\\-140.5854\\-170.9609\\63\\-141.6016\\-170.3446\\63\\-143.5547\\-170.5316\\63\\-145.5078\\-171.4957\\63\\-147.4609\\-171.9102\\63\\-149.4141\\-173.1192\\63\\-151.3672\\-172.871\\63\\-152.0402\\-170.9609\\63\\-151.724\\-169.0078\\63\\-151.1177\\-167.0547\\63\\-150.7024\\-165.1016\\63\\-150.142\\-161.1953\\63\\-149.7085\\-159.2422\\63\\-149.0558\\-157.2891\\63\\-148.2434\\-153.3828\\63\\-147.764\\-151.4297\\63\\-146.9454\\-149.4766\\63\\-145.7802\\-145.5703\\63\\-144.8587\\-143.6172\\63\\-144.3197\\-141.6641\\63\\-142.8068\\-137.7578\\63\\-142.3079\\-135.8047\\63\\-141.4314\\-133.8516\\63\\-139.7839\\-129.9453\\63\\-138.7466\\-127.9922\\63\\-137.981\\-126.0391\\63\\-136.9492\\-124.0859\\63\\-136.3517\\-122.1328\\63\\-135.2336\\-120.1797\\63\\-134.4259\\-118.2266\\63\\-133.1886\\-116.2734\\63\\-132.1964\\-114.3203\\63\\-130.9136\\-112.3672\\63\\-128.6942\\-108.4609\\63\\-127.1601\\-106.5078\\63\\-125.4507\\-104.5547\\63\\-124.0234\\-102.7952\\63\\-121.9207\\-100.6484\\63\\-117.0379\\-96.74219\\63\\-116.2109\\-96.03011\\63\\-114.2578\\-94.64955\\63\\-112.3047\\-93.73689\\63\\-110.3516\\-92.56541\\63\\-108.3984\\-91.6443\\63\\-106.4453\\-90.36476\\63\\-104.4922\\-89.3705\\63\\-102.5391\\-88.18407\\63\\-100.5859\\-87.51606\\63\\-98.63281\\-86.48492\\63\\-96.67969\\-85.7809\\63\\-94.72656\\-84.824\\63\\-92.77344\\-84.01746\\63\\-90.82031\\-83.30903\\63\\-88.86719\\-82.45918\\63\\-84.96094\\-81.58512\\63\\-83.00781\\-80.8602\\63\\-81.05469\\-80.42395\\63\\-77.14844\\-79.7636\\63\\-73.24219\\-78.82797\\63\\-69.33594\\-78.19318\\63\\-65.42969\\-77.84808\\63\\-59.57031\\-77.56303\\63\\-55.66406\\-77.47727\\63\\-51.75781\\-77.52968\\63\\-49.80469\\-77.62109\\63\\-43.94531\\-78.09505\\63\\-40.03906\\-78.54261\\63\\-38.08594\\-78.87109\\63\\-36.13281\\-79.33818\\63\\-34.17969\\-79.68447\\63\\-28.32031\\-80.52744\\63\\-26.36719\\-80.95443\\63\\-24.41406\\-81.60893\\63\\-22.46094\\-81.93725\\63\\-20.50781\\-82.10574\\63\\-16.60156\\-82.20553\\63\\-14.64844\\-82.13543\\63\\-8.789063\\-81.65294\\63\\-6.835938\\-81.30943\\63\\-2.929688\\-80.95571\\63\\0.9765625\\-80.8206\\63\\6.835938\\-80.69768\\63\\10.74219\\-80.57682\\63\\18.55469\\-80.51865\\63\\22.46094\\-80.31398\\63\\24.41406\\-80.12907\\63\\28.32031\\-79.51081\\63\\32.22656\\-78.71108\\63\\36.13281\\-78.12902\\63\\38.08594\\-77.95076\\63\\41.99219\\-77.7801\\63\\45.89844\\-77.72974\\63\\49.80469\\-77.74194\\63\\53.71094\\-77.84079\\63\\59.57031\\-78.06474\\63\\63.47656\\-78.31808\\63\\67.38281\\-78.78703\\63\\71.28906\\-79.48022\\63\\79.10156\\-80.52359\\63\\81.05469\\-80.84551\\63\\84.96094\\-81.77034\\63\\88.86719\\-82.38062\\63\\90.82031\\-82.87354\\63\\92.77344\\-83.58589\\63\\96.67969\\-84.60402\\63\\98.63281\\-85.51491\\63\\100.5859\\-86.09433\\63\\102.5391\\-86.81881\\63\\104.4922\\-87.70581\\63\\106.4453\\-88.29364\\63\\108.3984\\-89.42125\\63\\110.3516\\-90.32207\\63\\112.3047\\-91.68182\\63\\114.2578\\-92.79838\\63\\116.2109\\-94.04845\\63\\118.1641\\-95.54183\\63\\121.593\\-98.69531\\63\\124.0234\\-101.3353\\63\\126.4741\\-104.5547\\63\\127.9297\\-106.7052\\63\\130.2464\\-110.4141\\63\\131.1051\\-112.3672\\63\\132.4171\\-114.3203\\63\\133.3659\\-116.2734\\63\\134.5345\\-118.2266\\63\\135.3698\\-120.1797\\63\\136.4251\\-122.1328\\63\\136.978\\-124.0859\\63\\138.1218\\-126.0391\\63\\138.8258\\-127.9922\\63\\139.919\\-129.9453\\63\\140.6302\\-131.8984\\63\\142.2629\\-135.8047\\63\\142.7358\\-137.7578\\63\\143.3253\\-139.7109\\63\\144.1845\\-141.6641\\63\\144.652\\-143.6172\\63\\145.276\\-145.5703\\63\\146.1317\\-147.5234\\63\\147.1182\\-151.4297\\63\\147.8425\\-153.3828\\63\\148.2135\\-155.3359\\63\\148.7863\\-159.2422\\63\\149.6711\\-163.1484\\63\\150.2193\\-167.0547\\63\\150.6802\\-174.8672\\63\\150.957\\-180.7266\\63\\151.0372\\-186.5859\\63\\150.97\\-190.4922\\63\\150.5371\\-200.2578\\63\\150.2373\\-206.1172\\63\\149.8518\\-210.0234\\63\\149.0583\\-213.9297\\63\\148.1334\\-219.7891\\63\\147.6378\\-221.7422\\63\\146.8273\\-223.6953\\63\\146.231\\-225.6484\\63\\145.2601\\-227.6016\\63\\144.4308\\-229.5547\\63\\143.3906\\-231.5078\\63\\142.5044\\-233.4609\\63\\140.0892\\-237.3672\\63\\139.6484\\-237.8517\\63\\137.6953\\-240.4396\\63\\136.9629\\-241.2734\\63\\135.7422\\-242.9619\\63\\131.8359\\-247.2995\\63\\129.8828\\-249.2445\\63\\127.9208\\-251.0391\\63\\125.9766\\-252.5888\\63\\124.0234\\-254.2831\\63\\122.0703\\-255.8572\\63\\120.1172\\-257.2877\\63\\118.1641\\-258.4045\\63\\117.6169\\-258.8516\\63\\114.2578\\-261.1993\\63\\112.3047\\-262.1003\\63\\110.3516\\-263.2764\\63\\108.3984\\-264.0161\\63\\106.4453\\-265.1962\\63\\104.4922\\-266.0232\\63\\102.5391\\-267.2107\\63\\100.5859\\-267.936\\63\\98.63281\\-268.9547\\63\\94.72656\\-270.3392\\63\\92.77344\\-271.3014\\63\\90.82031\\-272.0014\\63\\88.86719\\-273.0936\\63\\86.91406\\-273.8236\\63\\84.96094\\-274.8979\\63\\83.00781\\-275.549\\63\\81.05469\\-276.3897\\63\\77.14844\\-278.2521\\63\\73.24219\\-280.4344\\63\\67.38281\\-283.1604\\63\\65.42969\\-283.8751\\63\\63.47656\\-284.9905\\63\\61.52344\\-285.8242\\63\\59.57031\\-286.907\\63\\57.61719\\-287.6094\\63\\55.66406\\-288.6334\\63\\53.71094\\-289.1905\\63\\51.75781\\-289.8722\\63\\49.80469\\-290.844\\63\\47.85156\\-291.4238\\63\\45.89844\\-292.4706\\63\\43.94531\\-293.0818\\63\\40.03906\\-294.5962\\63\\36.13281\\-295.3913\\63\\34.17969\\-296.1459\\63\\32.22656\\-296.7193\\63\\30.27344\\-297.057\\63\\28.32031\\-297.5247\\63\\26.36719\\-298.2606\\63\\24.41406\\-298.6904\\63\\20.50781\\-299.385\\63\\16.60156\\-300.2342\\63\\14.64844\\-300.452\\63\\10.74219\\-300.7321\\63\\6.835938\\-300.9202\\63\\2.929688\\-301.05\\63\\-2.929688\\-301.0427\\63\\-6.835938\\-300.9256\\63\\-12.69531\\-300.6273\\63\\-16.60156\\-300.2566\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "290" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "158" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-300.0158\\65\\-22.46094\\-299.144\\65\\-26.36719\\-298.546\\65\\-28.32031\\-298.0495\\65\\-30.27344\\-297.4048\\65\\-34.17969\\-296.7541\\65\\-36.13281\\-296.3204\\65\\-38.08594\\-295.5964\\65\\-43.94531\\-294.4383\\65\\-45.89844\\-293.6235\\65\\-49.80469\\-292.5077\\65\\-51.75781\\-291.5724\\65\\-55.66406\\-290.4096\\65\\-57.61719\\-289.4773\\65\\-61.52344\\-288.5593\\65\\-63.47656\\-287.6602\\65\\-67.38281\\-286.5568\\65\\-69.33594\\-285.6151\\65\\-71.28906\\-285.0449\\65\\-75.19531\\-283.5126\\65\\-77.14844\\-283.1019\\65\\-79.10156\\-282.5441\\65\\-81.05469\\-281.7487\\65\\-84.96094\\-280.7929\\65\\-86.91406\\-279.9414\\65\\-90.82031\\-278.6665\\65\\-92.77344\\-277.718\\65\\-94.72656\\-277.1942\\65\\-98.63281\\-275.6324\\65\\-100.5859\\-275.0885\\65\\-102.5391\\-274.0505\\65\\-104.4922\\-273.1919\\65\\-106.4453\\-271.8973\\65\\-108.3984\\-270.9995\\65\\-110.3516\\-269.6945\\65\\-114.2578\\-267.3373\\65\\-118.1641\\-264.0981\\65\\-120.1074\\-262.7578\\65\\-122.0703\\-261.2714\\65\\-124.5153\\-258.8516\\65\\-126.6154\\-256.8984\\65\\-128.6161\\-254.9453\\65\\-130.3848\\-252.9922\\65\\-133.7891\\-249.077\\65\\-138.2286\\-243.2266\\65\\-139.6484\\-241.1897\\65\\-141.6016\\-238.0882\\65\\-142.1336\\-237.3672\\65\\-142.8723\\-235.4141\\65\\-144.0108\\-233.4609\\65\\-144.6857\\-231.5078\\65\\-145.7072\\-229.5547\\65\\-147.1579\\-225.6484\\65\\-148.0076\\-223.6953\\65\\-148.8997\\-219.7891\\65\\-150.0712\\-215.8828\\65\\-150.6721\\-211.9766\\65\\-151.0932\\-210.0234\\65\\-151.682\\-208.0703\\65\\-152.0165\\-206.1172\\65\\-152.251\\-204.1641\\65\\-152.8172\\-198.3047\\65\\-153.2389\\-192.4453\\65\\-153.3279\\-188.5391\\65\\-153.2673\\-186.5859\\65\\-152.6133\\-184.6328\\65\\-151.3672\\-183.2498\\65\\-149.4141\\-182.9912\\65\\-147.4609\\-183.8879\\65\\-145.5078\\-183.7641\\65\\-143.5547\\-182.414\\65\\-141.6016\\-181.3325\\65\\-140.709\\-180.7266\\65\\-139.6484\\-179.3937\\65\\-139.3445\\-178.7734\\65\\-139.7363\\-176.8203\\65\\-139.4367\\-174.8672\\65\\-139.449\\-172.9141\\65\\-139.6484\\-172.6062\\65\\-141.6016\\-171.1728\\65\\-143.5547\\-171.8167\\65\\-145.5078\\-172.6556\\65\\-147.4609\\-172.9226\\65\\-149.4141\\-173.8383\\65\\-151.3672\\-173.0952\\65\\-151.5288\\-172.9141\\65\\-151.8468\\-170.9609\\65\\-150.8083\\-167.0547\\65\\-149.9089\\-161.1953\\65\\-148.8176\\-157.2891\\65\\-148.0408\\-153.3828\\65\\-146.6808\\-149.4766\\65\\-146.1678\\-147.5234\\65\\-145.311\\-145.5703\\65\\-144.6273\\-143.6172\\65\\-144.0979\\-141.6641\\65\\-143.1683\\-139.7109\\65\\-142.0701\\-135.8047\\65\\-141.0604\\-133.8516\\65\\-140.374\\-131.8984\\65\\-139.3011\\-129.9453\\65\\-138.5073\\-127.9922\\65\\-137.5772\\-126.0391\\65\\-136.7604\\-124.0859\\65\\-136.0556\\-122.1328\\65\\-134.9696\\-120.1797\\65\\-134.1436\\-118.2266\\65\\-132.9229\\-116.2734\\65\\-130.7296\\-112.3672\\65\\-129.4465\\-110.4141\\65\\-128.4849\\-108.4609\\65\\-126.8968\\-106.5078\\65\\-124.0234\\-103.18\\65\\-121.55\\-100.6484\\65\\-120.1172\\-99.5954\\65\\-116.2109\\-96.35593\\65\\-114.2578\\-95.21272\\65\\-112.3047\\-93.94185\\65\\-108.3984\\-91.89324\\65\\-104.4922\\-89.68233\\65\\-102.5391\\-88.4131\\65\\-100.5859\\-87.79662\\65\\-98.63281\\-86.76363\\65\\-94.72656\\-85.26574\\65\\-92.77344\\-84.2683\\65\\-90.82031\\-83.61642\\65\\-88.86719\\-82.72606\\65\\-86.91406\\-82.20029\\65\\-84.96094\\-81.80393\\65\\-81.05469\\-80.64228\\65\\-75.19531\\-79.6683\\65\\-71.28906\\-78.75767\\65\\-67.38281\\-78.29928\\65\\-63.47656\\-78.00014\\65\\-57.61719\\-77.80511\\65\\-55.66406\\-77.78503\\65\\-49.80469\\-77.91429\\65\\-45.89844\\-78.15843\\65\\-40.03906\\-78.8601\\65\\-36.13281\\-79.64574\\65\\-30.27344\\-80.45584\\65\\-28.32031\\-80.78217\\65\\-26.36719\\-81.38011\\65\\-24.41406\\-81.83034\\65\\-22.46094\\-82.06949\\65\\-20.50781\\-82.16393\\65\\-16.60156\\-82.17661\\65\\-10.74219\\-81.78362\\65\\-6.835938\\-81.20524\\65\\-2.929688\\-80.89934\\65\\0.9765625\\-80.78217\\65\\6.835938\\-80.68392\\65\\10.74219\\-80.5638\\65\\18.55469\\-80.50605\\65\\20.50781\\-80.45584\\65\\24.41406\\-80.19294\\65\\28.32031\\-79.71745\\65\\32.22656\\-79.00247\\65\\38.08594\\-78.20494\\65\\43.94531\\-77.96346\\65\\49.80469\\-77.97049\\65\\53.71094\\-78.04719\\65\\59.57031\\-78.32781\\65\\63.47656\\-78.62872\\65\\65.42969\\-78.83854\\65\\69.33594\\-79.45847\\65\\77.14844\\-80.41964\\65\\79.10156\\-80.73354\\65\\83.00781\\-81.6456\\65\\86.91406\\-82.25651\\65\\88.86719\\-82.61808\\65\\92.77344\\-83.84158\\65\\94.72656\\-84.29656\\65\\96.67969\\-84.98588\\65\\98.63281\\-85.77779\\65\\100.5859\\-86.34296\\65\\102.5391\\-87.25239\\65\\106.4453\\-88.61631\\65\\108.3984\\-89.72166\\65\\110.3516\\-90.69925\\65\\114.2578\\-93.24826\\65\\116.2109\\-94.35909\\65\\118.1641\\-95.86596\\65\\121.2542\\-98.69531\\65\\124.0234\\-101.6578\\65\\126.2347\\-104.5547\\65\\128.8624\\-108.4609\\65\\130.0009\\-110.4141\\65\\130.9552\\-112.3672\\65\\132.2228\\-114.3203\\65\\133.172\\-116.2734\\65\\134.3786\\-118.2266\\65\\135.1851\\-120.1797\\65\\136.2936\\-122.1328\\65\\136.8776\\-124.0859\\65\\137.931\\-126.0391\\65\\138.7079\\-127.9922\\65\\139.686\\-129.9453\\65\\140.5217\\-131.8984\\65\\141.2254\\-133.8516\\65\\142.1749\\-135.8047\\65\\143.1738\\-139.7109\\65\\144.0585\\-141.6641\\65\\145.0902\\-145.5703\\65\\145.9726\\-147.5234\\65\\146.9223\\-151.4297\\65\\147.6249\\-153.3828\\65\\148.0866\\-155.3359\\65\\148.9868\\-161.1953\\65\\149.7923\\-165.1016\\65\\150.0671\\-167.0547\\65\\150.2373\\-169.0078\\65\\150.607\\-176.8203\\65\\150.8031\\-182.6797\\65\\150.7415\\-190.4922\\65\\150.4867\\-198.3047\\65\\150.2125\\-204.1641\\65\\150.0793\\-206.1172\\65\\149.5448\\-210.0234\\65\\148.8116\\-213.9297\\65\\148.2689\\-217.8359\\65\\147.9054\\-219.7891\\65\\147.2202\\-221.7422\\65\\145.9627\\-225.6484\\65\\144.8982\\-227.6016\\65\\144.188\\-229.5547\\65\\143.0325\\-231.5078\\65\\142.2505\\-233.4609\\65\\139.6484\\-237.285\\65\\138.196\\-239.3203\\65\\135.7422\\-242.4837\\65\\135.1031\\-243.2266\\65\\131.8359\\-246.7111\\65\\129.8828\\-248.7315\\65\\127.3362\\-251.0391\\65\\125.9766\\-252.1369\\65\\124.0234\\-253.899\\65\\122.0703\\-255.5161\\65\\120.1172\\-256.6772\\65\\118.1641\\-257.9775\\65\\116.2109\\-259.4413\\65\\112.3047\\-261.7448\\65\\110.314\\-262.7578\\65\\106.4453\\-264.5792\\65\\102.5272\\-266.6641\\65\\98.63281\\-268.4043\\65\\96.67969\\-269.3464\\65\\94.72656\\-269.913\\65\\92.77344\\-270.9724\\65\\90.82031\\-271.681\\65\\88.86719\\-272.7472\\65\\86.91406\\-273.5698\\65\\84.96094\\-274.5618\\65\\83.00781\\-275.4172\\65\\81.05469\\-276.1089\\65\\79.10156\\-277.2329\\65\\77.14844\\-278.0785\\65\\76.75228\\-278.3828\\65\\73.22998\\-280.3359\\65\\67.38281\\-283.1604\\65\\65.42969\\-283.8864\\65\\63.47656\\-285.0245\\65\\61.52344\\-285.8964\\65\\59.57031\\-286.9427\\65\\57.61719\\-287.6732\\65\\55.66406\\-288.6982\\65\\53.71094\\-289.2381\\65\\51.75781\\-290\\65\\49.80469\\-290.9096\\65\\47.85156\\-291.5288\\65\\45.89844\\-292.569\\65\\43.94531\\-293.1611\\65\\40.03906\\-294.6728\\65\\36.13281\\-295.4727\\65\\34.17969\\-296.2865\\65\\32.22656\\-296.7774\\65\\30.27344\\-297.1275\\65\\28.32031\\-297.6458\\65\\26.36719\\-298.367\\65\\20.50781\\-299.4856\\65\\18.55469\\-299.9757\\65\\16.60156\\-300.3073\\65\\14.64844\\-300.5126\\65\\10.74219\\-300.782\\65\\6.835938\\-300.9688\\65\\2.929688\\-301.0926\\65\\-2.929688\\-301.0818\\65\\-8.789063\\-300.8666\\65\\-12.69531\\-300.6562\\65\\-16.60156\\-300.3165\\65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "305" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "159" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-300.091\\67\\-22.46094\\-299.2144\\67\\-26.36719\\-298.5941\\67\\-28.32031\\-298.1258\\67\\-30.27344\\-297.4849\\67\\-32.22656\\-297.0778\\67\\-34.17969\\-296.7897\\67\\-36.13281\\-296.3766\\67\\-38.08594\\-295.6448\\67\\-40.03906\\-295.2074\\67\\-43.94531\\-294.4482\\67\\-45.89844\\-293.6109\\67\\-49.80469\\-292.5077\\67\\-51.75781\\-291.5429\\67\\-53.71094\\-290.9907\\67\\-55.66406\\-290.3406\\67\\-57.61719\\-289.4525\\67\\-59.57031\\-289.0238\\67\\-61.52344\\-288.4878\\67\\-63.47656\\-287.5824\\67\\-67.38281\\-286.3709\\67\\-69.33594\\-285.4709\\67\\-71.28906\\-284.9022\\67\\-73.24219\\-283.9927\\67\\-75.19531\\-283.3539\\67\\-77.14844\\-282.9422\\67\\-81.05469\\-281.5505\\67\\-83.00781\\-281.0885\\67\\-84.96094\\-280.4608\\67\\-86.91406\\-279.6172\\67\\-88.86719\\-279.0643\\67\\-90.82031\\-278.1476\\67\\-92.77344\\-277.4551\\67\\-94.72656\\-276.9307\\67\\-96.67969\\-275.9515\\67\\-98.63281\\-275.3995\\67\\-100.5859\\-274.7101\\67\\-104.7852\\-272.5234\\67\\-108.3984\\-270.4353\\67\\-110.3516\\-269.3972\\67\\-112.3047\\-268.0863\\67\\-114.2578\\-266.9031\\67\\-116.2109\\-265.4138\\67\\-120.1172\\-262.2365\\67\\-122.0437\\-260.8047\\67\\-124.0494\\-258.8516\\67\\-128.273\\-254.9453\\67\\-131.4979\\-251.0391\\67\\-133.7891\\-248.5015\\67\\-136.4929\\-245.1797\\67\\-137.8461\\-243.2266\\67\\-139.0967\\-241.2734\\67\\-140.5698\\-239.3203\\67\\-141.8194\\-237.3672\\67\\-142.6752\\-235.4141\\67\\-143.6546\\-233.4609\\67\\-145.2601\\-229.5547\\67\\-146.2233\\-227.6016\\67\\-146.8668\\-225.6484\\67\\-147.7661\\-223.6953\\67\\-148.3038\\-221.7422\\67\\-149.2128\\-217.8359\\67\\-149.8653\\-215.8828\\67\\-150.2487\\-213.9297\\67\\-150.8118\\-210.0234\\67\\-151.8202\\-206.1172\\67\\-152.087\\-204.1641\\67\\-152.4484\\-200.2578\\67\\-152.7121\\-196.3516\\67\\-152.9088\\-192.4453\\67\\-152.9565\\-190.4922\\67\\-152.9208\\-186.5859\\67\\-152.7945\\-184.6328\\67\\-152.2833\\-182.6797\\67\\-151.3672\\-181.5546\\67\\-149.4141\\-181.5181\\67\\-148.1879\\-182.6797\\67\\-147.4609\\-183.183\\67\\-145.5078\\-183.1046\\67\\-143.5547\\-181.867\\67\\-141.94\\-180.7266\\67\\-140.7538\\-178.7734\\67\\-141.8669\\-176.8203\\67\\-143.5547\\-175.3692\\67\\-145.5078\\-174.5446\\67\\-147.4609\\-174.391\\67\\-149.4141\\-174.4487\\67\\-150.9698\\-172.9141\\67\\-151.5158\\-170.9609\\67\\-150.9885\\-169.0078\\67\\-150.6138\\-167.0547\\67\\-150.3632\\-165.1016\\67\\-149.5829\\-163.1484\\67\\-148.9314\\-161.1953\\67\\-148.7706\\-159.2422\\67\\-148.2551\\-155.3359\\67\\-147.8107\\-153.3828\\67\\-147.0588\\-151.4297\\67\\-145.9142\\-147.5234\\67\\-144.9558\\-145.5703\\67\\-144.4477\\-143.6172\\67\\-143.7789\\-141.6641\\67\\-142.9228\\-139.7109\\67\\-142.4515\\-137.7578\\67\\-141.7432\\-135.8047\\67\\-140.8081\\-133.8516\\67\\-140.1184\\-131.8984\\67\\-138.9732\\-129.9453\\67\\-138.2701\\-127.9922\\67\\-137.2378\\-126.0391\\67\\-136.5974\\-124.0859\\67\\-135.7422\\-122.1997\\67\\-133.7891\\-118.2383\\67\\-131.8359\\-114.8489\\67\\-131.4184\\-114.3203\\67\\-130.5317\\-112.3672\\67\\-129.1954\\-110.4141\\67\\-128.2014\\-108.4609\\67\\-126.643\\-106.5078\\67\\-125.9766\\-105.8322\\67\\-124.0234\\-103.5512\\67\\-121.1231\\-100.6484\\67\\-118.1641\\-98.20367\\67\\-116.1397\\-96.74219\\67\\-114.2578\\-95.56138\\67\\-112.3047\\-94.2045\\67\\-110.3516\\-93.36286\\67\\-108.3984\\-92.14764\\67\\-106.4453\\-91.28532\\67\\-104.4922\\-89.94264\\67\\-102.5391\\-88.70996\\67\\-98.63281\\-87.12865\\67\\-96.67969\\-86.24567\\67\\-94.72656\\-85.54471\\67\\-92.77344\\-84.5231\\67\\-90.82031\\-83.8998\\67\\-86.91406\\-82.38425\\67\\-83.00781\\-81.57156\\67\\-81.05469\\-80.92939\\67\\-79.10156\\-80.46821\\67\\-75.19531\\-79.89648\\67\\-71.28906\\-79.14135\\67\\-69.33594\\-78.8601\\67\\-63.47656\\-78.27267\\67\\-57.61719\\-78.05656\\67\\-53.71094\\-78.04878\\67\\-49.80469\\-78.16543\\67\\-45.89844\\-78.44175\\67\\-41.99219\\-78.89353\\67\\-38.08594\\-79.63255\\67\\-34.17969\\-80.11121\\67\\-30.27344\\-80.68695\\67\\-26.36719\\-81.7487\\67\\-24.41406\\-82.0144\\67\\-22.46094\\-82.16477\\67\\-18.55469\\-82.2188\\67\\-14.64844\\-82.03233\\67\\-10.74219\\-81.73006\\67\\-8.789063\\-81.35006\\67\\-4.882813\\-80.96875\\67\\-0.9765625\\-80.84551\\67\\4.882813\\-80.74483\\67\\10.74219\\-80.56747\\67\\14.64844\\-80.50605\\67\\18.55469\\-80.51865\\67\\24.41406\\-80.28424\\67\\26.36719\\-80.11695\\67\\32.22656\\-79.36689\\67\\34.17969\\-79.01546\\67\\38.08594\\-78.52643\\67\\40.03906\\-78.37463\\67\\43.94531\\-78.2386\\67\\49.80469\\-78.20434\\67\\53.71094\\-78.30172\\67\\59.57031\\-78.63295\\67\\63.47656\\-78.95236\\67\\67.38281\\-79.50832\\67\\75.19531\\-80.36553\\67\\77.14844\\-80.63223\\67\\83.00781\\-81.85738\\67\\86.91406\\-82.45057\\67\\88.86719\\-82.95763\\67\\90.82031\\-83.61887\\67\\94.72656\\-84.61193\\67\\96.67969\\-85.43145\\67\\100.5859\\-86.65334\\67\\102.5391\\-87.55453\\67\\104.4922\\-88.13973\\67\\106.4453\\-89.13792\\67\\108.3984\\-90.01413\\67\\110.3516\\-91.23209\\67\\112.3047\\-92.29272\\67\\114.2578\\-93.60049\\67\\116.2109\\-94.74697\\67\\118.1641\\-96.24693\\67\\118.6057\\-96.74219\\67\\120.8221\\-98.69531\\67\\122.7649\\-100.6484\\67\\124.4727\\-102.6016\\67\\127.2512\\-106.5078\\67\\128.692\\-108.4609\\67\\129.7059\\-110.4141\\67\\131.9975\\-114.3203\\67\\133.0112\\-116.2734\\67\\134.2067\\-118.2266\\67\\135.0269\\-120.1797\\67\\136.1286\\-122.1328\\67\\136.7898\\-124.0859\\67\\138.6003\\-127.9922\\67\\139.4337\\-129.9453\\67\\140.4097\\-131.8984\\67\\141.0762\\-133.8516\\67\\142.0334\\-135.8047\\67\\143.0334\\-139.7109\\67\\143.9116\\-141.6641\\67\\144.9386\\-145.5703\\67\\145.7896\\-147.5234\\67\\146.3399\\-149.4766\\67\\146.7572\\-151.4297\\67\\147.9431\\-155.3359\\67\\148.2776\\-157.2891\\67\\149.0956\\-163.1484\\67\\149.8756\\-167.0547\\67\\150.0793\\-169.0078\\67\\150.3083\\-172.9141\\67\\150.4604\\-176.8203\\67\\150.607\\-182.6797\\67\\150.5717\\-190.4922\\67\\150.3526\\-198.3047\\67\\150.1801\\-202.2109\\67\\149.8725\\-206.1172\\67\\148.8773\\-211.9766\\67\\148.3918\\-215.8828\\67\\148.0743\\-217.8359\\67\\147.5984\\-219.7891\\67\\146.8855\\-221.7422\\67\\146.3321\\-223.6953\\67\\145.5454\\-225.6484\\67\\144.6284\\-227.6016\\67\\143.8664\\-229.5547\\67\\142.7847\\-231.5078\\67\\141.8837\\-233.4609\\67\\140.6133\\-235.4141\\67\\139.0728\\-237.3672\\67\\136.391\\-241.2734\\67\\134.7117\\-243.2266\\67\\129.8828\\-248.3004\\67\\126.8248\\-251.0391\\67\\124.5185\\-252.9922\\67\\124.0234\\-253.5014\\67\\122.0703\\-255.0341\\67\\120.1172\\-256.1911\\67\\118.1641\\-257.615\\67\\114.2578\\-260.0558\\67\\112.3047\\-261.36\\67\\110.3516\\-262.1988\\67\\108.3984\\-263.328\\67\\106.4453\\-264.0249\\67\\104.4922\\-265.2055\\67\\102.5391\\-266.056\\67\\100.5859\\-267.2196\\67\\98.63281\\-267.9519\\67\\96.67969\\-269.0176\\67\\94.72656\\-269.6529\\67\\92.77344\\-270.4386\\67\\90.82031\\-271.4235\\67\\88.86719\\-272.2571\\67\\86.91406\\-273.3433\\67\\84.96094\\-274.2065\\67\\83.00781\\-275.2639\\67\\81.05469\\-275.9216\\67\\79.10156\\-277.135\\67\\77.14844\\-277.948\\67\\75.19531\\-279.2071\\67\\71.28906\\-281.264\\67\\67.38281\\-283.1721\\67\\65.42969\\-283.9237\\67\\63.47656\\-285.071\\67\\61.52344\\-285.9668\\67\\59.57031\\-286.9973\\67\\57.61719\\-287.7511\\67\\55.66406\\-288.7548\\67\\53.71094\\-289.2808\\67\\49.80469\\-290.9647\\67\\47.85156\\-291.6282\\67\\45.89844\\-292.6671\\67\\43.94531\\-293.2513\\67\\41.99219\\-294.1171\\67\\40.03906\\-294.7402\\67\\36.13281\\-295.5853\\67\\34.17969\\-296.3971\\67\\32.22656\\-296.8539\\67\\30.27344\\-297.1994\\67\\26.36719\\-298.4603\\67\\22.46094\\-299.175\\67\\18.55469\\-300.0789\\67\\16.60156\\-300.3759\\67\\14.64844\\-300.5719\\67\\10.74219\\-300.8267\\67\\6.835938\\-301.0186\\67\\2.929688\\-301.138\\67\\-0.9765625\\-301.1336\\67\\-4.882813\\-301.0621\\67\\-10.74219\\-300.804\\67\\-14.64844\\-300.5463\\67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "289" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "160" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-300.1602\\69\\-22.46094\\-299.2779\\69\\-26.36719\\-298.6465\\69\\-28.32031\\-298.2289\\69\\-30.27344\\-297.556\\69\\-32.22656\\-297.1275\\69\\-36.13281\\-296.4396\\69\\-38.08594\\-295.6953\\69\\-40.03906\\-295.2102\\69\\-41.99219\\-294.8804\\69\\-43.94531\\-294.4282\\69\\-45.89844\\-293.6083\\69\\-49.80469\\-292.4986\\69\\-51.75781\\-291.5226\\69\\-53.71094\\-290.9669\\69\\-55.66406\\-290.2785\\69\\-57.61719\\-289.4126\\69\\-59.57031\\-288.9932\\69\\-61.52344\\-288.3979\\69\\-63.47656\\-287.5034\\69\\-65.42969\\-286.9453\\69\\-69.33594\\-285.3312\\69\\-71.28906\\-284.7305\\69\\-73.24219\\-283.7635\\69\\-77.14844\\-282.7434\\69\\-79.10156\\-281.9194\\69\\-83.00781\\-280.858\\69\\-84.96094\\-280.0126\\69\\-88.86719\\-278.7189\\69\\-90.82031\\-277.7538\\69\\-92.77344\\-277.2277\\69\\-96.67969\\-275.662\\69\\-98.63281\\-275.1297\\69\\-100.5859\\-274.1245\\69\\-102.5391\\-273.328\\69\\-104.4922\\-272.1105\\69\\-106.4453\\-271.1856\\69\\-108.3984\\-269.9086\\69\\-110.3516\\-269.0378\\69\\-116.2109\\-264.9849\\69\\-118.1641\\-263.5054\\69\\-121.4468\\-260.8047\\69\\-125.9766\\-256.5211\\69\\-127.9297\\-254.7533\\69\\-129.3314\\-252.9922\\69\\-134.6606\\-247.1328\\69\\-136.1515\\-245.1797\\69\\-137.3423\\-243.2266\\69\\-140.2779\\-239.3203\\69\\-142.4799\\-235.4141\\69\\-143.2079\\-233.4609\\69\\-144.277\\-231.5078\\69\\-144.9231\\-229.5547\\69\\-145.9698\\-227.6016\\69\\-146.6018\\-225.6484\\69\\-148.1179\\-221.7422\\69\\-148.9659\\-217.8359\\69\\-149.6019\\-215.8828\\69\\-150.0873\\-213.9297\\69\\-150.6095\\-210.0234\\69\\-150.9779\\-208.0703\\69\\-151.5026\\-206.1172\\69\\-151.8809\\-204.1641\\69\\-152.0971\\-202.2109\\69\\-152.3928\\-198.3047\\69\\-152.6493\\-192.4453\\69\\-152.6422\\-186.5859\\69\\-152.5116\\-182.6797\\69\\-152.2656\\-180.7266\\69\\-152.1658\\-178.7734\\69\\-151.3672\\-177.0645\\69\\-151.1047\\-176.8203\\69\\-150.8409\\-174.8672\\69\\-151.6029\\-172.9141\\69\\-151.1195\\-170.9609\\69\\-150.7377\\-169.0078\\69\\-150.1465\\-165.1016\\69\\-149.4141\\-163.81\\69\\-148.5938\\-163.1484\\69\\-147.4609\\-161.5751\\69\\-146.8124\\-163.1484\\69\\-145.5078\\-164.6345\\69\\-143.5547\\-165.2123\\69\\-141.6016\\-164.8614\\69\\-140.1702\\-163.1484\\69\\-140.8452\\-161.1953\\69\\-142.4576\\-159.2422\\69\\-143.5547\\-158.4694\\69\\-145.5078\\-158.8844\\69\\-146.4587\\-159.2422\\69\\-147.4609\\-160.5117\\69\\-148.0992\\-157.2891\\69\\-148.0818\\-155.3359\\69\\-147.4991\\-153.3828\\69\\-146.7746\\-151.4297\\69\\-146.2531\\-149.4766\\69\\-144.7299\\-145.5703\\69\\-144.2417\\-143.6172\\69\\-143.3792\\-141.6641\\69\\-142.7358\\-139.7109\\69\\-142.2629\\-137.7578\\69\\-141.3416\\-135.8047\\69\\-139.7439\\-131.8984\\69\\-138.7326\\-129.9453\\69\\-138.0208\\-127.9922\\69\\-136.98\\-126.0391\\69\\-136.4124\\-124.0859\\69\\-135.3725\\-122.1328\\69\\-134.5691\\-120.1797\\69\\-133.4078\\-118.2266\\69\\-132.4629\\-116.2734\\69\\-131.1356\\-114.3203\\69\\-130.2347\\-112.3672\\69\\-127.9297\\-108.6151\\69\\-126.3391\\-106.5078\\69\\-124.0234\\-103.8241\\69\\-122.0703\\-101.7715\\69\\-120.1172\\-100.0651\\69\\-116.2109\\-97.27549\\69\\-114.2578\\-95.82863\\69\\-112.3047\\-94.5625\\69\\-110.3516\\-93.62898\\69\\-108.3984\\-92.48942\\69\\-106.4453\\-91.6493\\69\\-104.4922\\-90.29816\\69\\-100.5859\\-88.09354\\69\\-98.63281\\-87.54511\\69\\-96.67969\\-86.51739\\69\\-94.72656\\-85.74799\\69\\-92.77344\\-84.83237\\69\\-88.86719\\-83.54243\\69\\-86.91406\\-82.65663\\69\\-84.96094\\-82.18417\\69\\-83.00781\\-81.82798\\69\\-79.10156\\-80.73354\\69\\-73.24219\\-79.82962\\69\\-65.42969\\-78.80724\\69\\-61.52344\\-78.45435\\69\\-55.66406\\-78.29911\\69\\-53.71094\\-78.3004\\69\\-49.80469\\-78.43451\\69\\-45.89844\\-78.77712\\69\\-38.08594\\-79.87038\\69\\-36.13281\\-80.07591\\69\\-32.22656\\-80.60565\\69\\-28.32031\\-81.56738\\69\\-26.36719\\-81.92178\\69\\-24.41406\\-82.12926\\69\\-22.46094\\-82.22745\\69\\-18.55469\\-82.2272\\69\\-14.64844\\-81.99985\\69\\-10.74219\\-81.70719\\69\\-8.789063\\-81.33672\\69\\-4.882813\\-81.01398\\69\\-0.9765625\\-80.88609\\69\\4.882813\\-80.79406\\69\\12.69531\\-80.55824\\69\\18.55469\\-80.52744\\69\\22.46094\\-80.42749\\69\\26.36719\\-80.25986\\69\\32.22656\\-79.61844\\69\\38.08594\\-78.8601\\69\\41.99219\\-78.63393\\69\\47.85156\\-78.49119\\69\\51.75781\\-78.55299\\69\\57.61719\\-78.83854\\69\\59.57031\\-78.97706\\69\\67.38281\\-79.7878\\69\\73.24219\\-80.36553\\69\\77.14844\\-80.92793\\69\\81.05469\\-81.79953\\69\\84.96094\\-82.32244\\69\\86.91406\\-82.71957\\69\\88.86719\\-83.39584\\69\\92.77344\\-84.32589\\69\\96.67969\\-85.73959\\69\\98.63281\\-86.2765\\69\\100.5859\\-87.07894\\69\\104.4922\\-88.43116\\69\\106.4453\\-89.52173\\69\\108.3984\\-90.35744\\69\\110.3516\\-91.64839\\69\\112.3047\\-92.68174\\69\\115.6078\\-94.78906\\69\\118.1641\\-96.70045\\69\\120.4325\\-98.69531\\69\\122.4985\\-100.6484\\69\\124.1684\\-102.6016\\69\\128.5038\\-108.4609\\69\\129.4603\\-110.4141\\69\\130.712\\-112.3672\\69\\131.8359\\-114.5022\\69\\133.7891\\-117.9489\\69\\134.8735\\-120.1797\\69\\135.9177\\-122.1328\\69\\137.4236\\-126.0391\\69\\138.4734\\-127.9922\\69\\139.2001\\-129.9453\\69\\140.2902\\-131.8984\\69\\140.9295\\-133.8516\\69\\141.8615\\-135.8047\\69\\142.4834\\-137.7578\\69\\142.9057\\-139.7109\\69\\143.7249\\-141.6641\\69\\144.3498\\-143.6172\\69\\144.795\\-145.5703\\69\\145.5454\\-147.5234\\69\\146.1878\\-149.4766\\69\\146.5935\\-151.4297\\69\\147.1052\\-153.3828\\69\\147.7466\\-155.3359\\69\\148.1334\\-157.2891\\69\\148.8997\\-163.1484\\69\\149.6153\\-167.0547\\69\\150.0423\\-170.9609\\69\\150.2615\\-174.8672\\69\\150.4226\\-180.7266\\69\\150.4653\\-184.6328\\69\\150.4282\\-190.4922\\69\\150.2125\\-198.3047\\69\\149.9821\\-202.2109\\69\\149.559\\-206.1172\\69\\148.9192\\-210.0234\\69\\148.1948\\-215.8828\\69\\147.819\\-217.8359\\69\\147.1829\\-219.7891\\69\\146.0683\\-223.6953\\69\\145.0674\\-225.6484\\69\\144.3971\\-227.6016\\69\\143.3906\\-229.5547\\69\\142.529\\-231.5078\\69\\140.2895\\-235.4141\\69\\137.2386\\-239.3203\\69\\136.0652\\-241.2734\\69\\134.3851\\-243.2266\\69\\130.5486\\-247.1328\\69\\129.8828\\-247.8705\\69\\127.9297\\-249.7393\\69\\121.4338\\-254.9453\\69\\118.1641\\-257.1331\\69\\116.2109\\-258.2295\\69\\114.2578\\-259.618\\69\\112.2444\\-260.8047\\69\\108.4828\\-262.7578\\69\\104.4922\\-264.5919\\69\\100.5859\\-266.7162\\69\\94.72656\\-269.4145\\69\\92.77344\\-270.0263\\69\\90.82031\\-271.1645\\69\\88.86719\\-271.9247\\69\\86.91406\\-273.124\\69\\84.96094\\-273.9512\\69\\83.00781\\-275.1255\\69\\81.05469\\-275.7974\\69\\79.10156\\-277.0408\\69\\77.14844\\-277.8815\\69\\75.19531\\-279.163\\69\\71.28906\\-281.2454\\69\\67.38281\\-283.1721\\69\\65.42969\\-283.9871\\69\\63.47656\\-285.1179\\69\\61.52344\\-286.0302\\69\\59.57031\\-287.0409\\69\\57.61719\\-287.8441\\69\\55.66406\\-288.8057\\69\\53.71094\\-289.3239\\69\\51.75781\\-290.2655\\69\\47.85156\\-291.7557\\69\\45.89844\\-292.7712\\69\\43.94531\\-293.3586\\69\\41.99219\\-294.2485\\69\\40.03906\\-294.8117\\69\\38.08594\\-295.2027\\69\\36.13281\\-295.7204\\69\\34.17969\\-296.4987\\69\\30.27344\\-297.2762\\69\\28.32031\\-297.9662\\69\\26.36719\\-298.5493\\69\\22.46094\\-299.2554\\69\\18.55469\\-300.1711\\69\\16.60156\\-300.4359\\69\\12.69531\\-300.7484\\69\\8.789063\\-300.9807\\69\\4.882813\\-301.138\\69\\0.9765625\\-301.1884\\69\\-2.929688\\-301.1418\\69\\-6.835938\\-301.0186\\69\\-10.74219\\-300.8323\\69\\-14.64844\\-300.5871\\69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "277" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "161" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-300.2365\\71\\-22.46094\\-299.3499\\71\\-26.36719\\-298.706\\71\\-28.32031\\-298.33\\71\\-30.27344\\-297.6717\\71\\-32.22656\\-297.1723\\71\\-36.13281\\-296.4805\\71\\-38.08594\\-295.748\\71\\-40.03906\\-295.2546\\71\\-43.94531\\-294.458\\71\\-45.89844\\-293.6497\\71\\-49.80469\\-292.4801\\71\\-51.75781\\-291.4975\\71\\-53.71094\\-290.9309\\71\\-57.61719\\-289.3691\\71\\-59.57031\\-288.9502\\71\\-61.52344\\-288.2762\\71\\-63.47656\\-287.4102\\71\\-65.42969\\-286.8556\\71\\-67.38281\\-285.9362\\71\\-71.28906\\-284.524\\71\\-73.24219\\-283.5852\\71\\-75.19531\\-283.1335\\71\\-77.14844\\-282.4919\\71\\-79.10156\\-281.6955\\71\\-81.05469\\-281.1883\\71\\-83.00781\\-280.5645\\71\\-84.96094\\-279.6792\\71\\-86.91406\\-279.0819\\71\\-88.86719\\-278.1992\\71\\-90.82031\\-277.4784\\71\\-92.77344\\-276.956\\71\\-94.72656\\-275.9964\\71\\-98.63281\\-274.7525\\71\\-100.5859\\-273.7232\\71\\-102.5391\\-272.9128\\71\\-104.4922\\-271.6745\\71\\-106.634\\-270.5703\\71\\-110.2056\\-268.6172\\71\\-112.3047\\-267.3495\\71\\-116.2109\\-264.3932\\71\\-118.1641\\-263.0985\\71\\-120.1172\\-261.5922\\71\\-122.0703\\-259.868\\71\\-125.1283\\-256.8984\\71\\-127.9297\\-254.2775\\71\\-129.8828\\-252.0532\\71\\-131.8359\\-249.9303\\71\\-134.3164\\-247.1328\\71\\-137.0056\\-243.2266\\71\\-137.6953\\-242.4114\\71\\-139.9065\\-239.3203\\71\\-140.9943\\-237.3672\\71\\-142.2331\\-235.4141\\71\\-142.8974\\-233.4609\\71\\-143.9938\\-231.5078\\71\\-144.6747\\-229.5547\\71\\-145.6163\\-227.6016\\71\\-146.3707\\-225.6484\\71\\-147.0205\\-223.6953\\71\\-147.8785\\-221.7422\\71\\-148.3736\\-219.7891\\71\\-148.7568\\-217.8359\\71\\-149.8756\\-213.9297\\71\\-150.2307\\-211.9766\\71\\-150.7298\\-208.0703\\71\\-151.1091\\-206.1172\\71\\-151.6029\\-204.1641\\71\\-151.9054\\-202.2109\\71\\-152.2021\\-198.3047\\71\\-152.4339\\-192.4453\\71\\-152.4239\\-186.5859\\71\\-152.2021\\-180.7266\\71\\-151.8891\\-176.8203\\71\\-151.649\\-174.8672\\71\\-150.8206\\-170.9609\\71\\-150.3361\\-167.0547\\71\\-149.8033\\-165.1016\\71\\-147.9604\\-163.1484\\71\\-147.9221\\-161.1953\\71\\-147.6979\\-159.2422\\71\\-148.2091\\-157.2891\\71\\-147.8858\\-155.3359\\71\\-147.1309\\-153.3828\\71\\-146.0328\\-149.4766\\71\\-145.1342\\-147.5234\\71\\-144.0079\\-143.6172\\71\\-143.0798\\-141.6641\\71\\-142.0437\\-137.7578\\71\\-141.0672\\-135.8047\\71\\-140.3959\\-133.8516\\71\\-139.3474\\-131.8984\\71\\-138.543\\-129.9453\\71\\-136.8347\\-126.0391\\71\\-136.2134\\-124.0859\\71\\-135.1103\\-122.1328\\71\\-134.3498\\-120.1797\\71\\-133.1279\\-118.2266\\71\\-132.1928\\-116.2734\\71\\-130.9521\\-114.3203\\71\\-128.8213\\-110.4141\\71\\-127.9297\\-109.097\\71\\-124.3514\\-104.5547\\71\\-122.0703\\-102.0615\\71\\-120.1172\\-100.3986\\71\\-118.1641\\-99.11072\\71\\-114.2578\\-96.13265\\71\\-112.3047\\-95.11948\\71\\-110.3516\\-93.88317\\71\\-106.4453\\-91.92913\\71\\-102.5391\\-89.63358\\71\\-100.5859\\-88.35483\\71\\-98.63281\\-87.74111\\71\\-94.72656\\-85.9622\\71\\-92.77344\\-85.23798\\71\\-90.82031\\-84.40573\\71\\-88.86719\\-83.82729\\71\\-84.96094\\-82.41301\\71\\-81.05469\\-81.66118\\71\\-77.14844\\-80.65248\\71\\-73.24219\\-80.10554\\71\\-67.38281\\-79.47057\\71\\-63.47656\\-78.94027\\71\\-59.57031\\-78.71108\\71\\-55.66406\\-78.59684\\71\\-53.71094\\-78.61364\\71\\-49.80469\\-78.76733\\71\\-47.85156\\-78.94027\\71\\-43.94531\\-79.45847\\71\\-40.03906\\-79.85892\\71\\-34.17969\\-80.51083\\71\\-32.22656\\-80.87119\\71\\-30.27344\\-81.45972\\71\\-28.32031\\-81.83709\\71\\-24.41406\\-82.2107\\71\\-22.46094\\-82.27612\\71\\-18.55469\\-82.20159\\71\\-10.74219\\-81.70313\\71\\-8.789063\\-81.39092\\71\\-6.835938\\-81.20524\\71\\-0.9765625\\-80.99905\\71\\0.9765625\\-80.98543\\71\\10.74219\\-80.62891\\71\\22.46094\\-80.4724\\71\\28.32031\\-80.23495\\71\\32.22656\\-79.81297\\71\\40.03906\\-79.09748\\71\\41.99219\\-78.96462\\71\\45.89844\\-78.84925\\71\\51.75781\\-78.89353\\71\\59.57031\\-79.41538\\71\\65.42969\\-79.84206\\71\\71.28906\\-80.35829\\71\\73.24219\\-80.56747\\71\\79.10156\\-81.69662\\71\\83.00781\\-82.23754\\71\\84.96094\\-82.56223\\71\\88.86719\\-83.71172\\71\\92.77344\\-84.65171\\71\\94.72656\\-85.46968\\71\\98.63281\\-86.57406\\71\\100.5859\\-87.45806\\71\\102.5391\\-88.01454\\71\\104.6381\\-88.92969\\71\\108.3984\\-90.81623\\71\\111.8262\\-92.83594\\71\\112.3047\\-93.19572\\71\\114.2578\\-94.16271\\71\\117.6196\\-96.74219\\71\\122.0969\\-100.6484\\71\\124.0234\\-102.8743\\71\\125.2346\\-104.5547\\71\\126.8024\\-106.5078\\71\\128.2647\\-108.4609\\71\\129.2426\\-110.4141\\71\\130.5402\\-112.3672\\71\\131.3996\\-114.3203\\71\\132.6614\\-116.2734\\71\\134.7244\\-120.1797\\71\\136.5922\\-124.0859\\71\\137.1971\\-126.0391\\71\\138.3301\\-127.9922\\71\\139.0029\\-129.9453\\71\\140.1155\\-131.8984\\71\\140.7795\\-133.8516\\71\\141.655\\-135.8047\\71\\142.3792\\-137.7578\\71\\142.7965\\-139.7109\\71\\144.2303\\-143.6172\\71\\144.6533\\-145.5703\\71\\145.2637\\-147.5234\\71\\146.054\\-149.4766\\71\\146.8889\\-153.3828\\71\\147.4836\\-155.3359\\71\\147.9675\\-157.2891\\71\\148.2573\\-159.2422\\71\\148.9525\\-165.1016\\71\\149.573\\-169.0078\\71\\149.9911\\-172.9141\\71\\150.1872\\-176.8203\\71\\150.2902\\-180.7266\\71\\150.3418\\-184.6328\\71\\150.3251\\-188.5391\\71\\150.2551\\-192.4453\\71\\150.1346\\-196.3516\\71\\149.899\\-200.2578\\71\\149.7206\\-202.2109\\71\\148.9094\\-208.0703\\71\\148.4904\\-211.9766\\71\\147.9675\\-215.8828\\71\\146.8385\\-219.7891\\71\\146.3617\\-221.7422\\71\\145.6962\\-223.6953\\71\\144.7477\\-225.6484\\71\\144.1406\\-227.6016\\71\\143.0189\\-229.5547\\71\\142.2461\\-231.5078\\71\\140.9889\\-233.4609\\71\\139.8786\\-235.4141\\71\\136.9078\\-239.3203\\71\\135.7422\\-241.0575\\71\\133.9614\\-243.2266\\71\\131.8359\\-245.3638\\71\\129.8828\\-247.4583\\71\\127.9297\\-249.3458\\71\\125.9766\\-250.7036\\71\\122.0703\\-253.9814\\71\\120.1172\\-255.4967\\71\\118.1641\\-256.5359\\71\\114.2578\\-259.1334\\71\\112.3047\\-260.1769\\71\\110.3516\\-261.4232\\71\\108.3984\\-262.2558\\71\\106.4453\\-263.3673\\71\\104.4922\\-264.0836\\71\\102.5391\\-265.2816\\71\\100.5859\\-266.1229\\71\\98.63281\\-267.2767\\71\\96.67969\\-268.0545\\71\\94.72656\\-269.1553\\71\\92.77344\\-269.7757\\71\\90.82031\\-270.8248\\71\\88.86719\\-271.6963\\71\\86.91406\\-272.9\\71\\84.96094\\-273.7658\\71\\83.00781\\-274.9943\\71\\81.05469\\-275.7234\\71\\79.10156\\-276.957\\71\\77.14844\\-277.8184\\71\\75.19531\\-279.1436\\71\\71.28906\\-281.2454\\71\\65.16602\\-284.2422\\71\\61.48897\\-286.1953\\71\\55.66406\\-288.8793\\71\\53.71094\\-289.3798\\71\\51.75781\\-290.4096\\71\\49.80469\\-291.1126\\71\\45.89844\\-292.8556\\71\\43.94531\\-293.4866\\71\\41.99219\\-294.3707\\71\\40.03906\\-294.8778\\71\\38.08594\\-295.259\\71\\36.13281\\-295.8757\\71\\34.17969\\-296.5904\\71\\30.27344\\-297.3669\\71\\28.32031\\-298.1135\\71\\26.36719\\-298.6312\\71\\22.46094\\-299.3467\\71\\18.55469\\-300.2466\\71\\16.60156\\-300.4938\\71\\10.74219\\-300.9256\\71\\4.882813\\-301.1798\\71\\0.9765625\\-301.2279\\71\\-2.929688\\-301.1884\\71\\-6.835938\\-301.0621\\71\\-10.74219\\-300.878\\71\\-14.64844\\-300.6205\\71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "281" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "162" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-299.9338\\73\\-22.46094\\-299.4338\\73\\-28.32031\\-298.4194\\73\\-32.22656\\-297.2212\\73\\-36.13281\\-296.5372\\73\\-38.08594\\-295.8032\\73\\-40.03906\\-295.2792\\73\\-43.94531\\-294.4992\\73\\-45.89844\\-293.6758\\73\\-49.80469\\-292.4706\\73\\-51.75781\\-291.4908\\73\\-53.71094\\-290.8839\\73\\-57.61719\\-289.3309\\73\\-59.57031\\-288.9114\\73\\-63.47656\\-287.3412\\73\\-65.42969\\-286.7755\\73\\-67.38281\\-285.7812\\73\\-69.33594\\-285.0986\\73\\-73.24219\\-283.4484\\73\\-75.19531\\-283.0109\\73\\-77.14844\\-282.2024\\73\\-79.10156\\-281.4994\\73\\-81.05469\\-280.9928\\73\\-84.96094\\-279.4071\\73\\-86.91406\\-278.7647\\73\\-88.86719\\-277.786\\73\\-90.82031\\-277.2435\\73\\-92.77344\\-276.5156\\73\\-94.72656\\-275.6818\\73\\-96.67969\\-275.1464\\73\\-98.63281\\-274.1966\\73\\-100.5859\\-273.3792\\73\\-102.5391\\-272.2616\\73\\-104.4922\\-271.3324\\73\\-106.4453\\-270.0921\\73\\-108.3984\\-269.3138\\73\\-110.3516\\-268.0208\\73\\-112.3047\\-266.9154\\73\\-115.3151\\-264.7109\\73\\-116.2109\\-263.9582\\73\\-120.1172\\-261.1967\\73\\-122.7532\\-258.8516\\73\\-125.9766\\-255.8349\\73\\-127.9297\\-253.9069\\73\\-131.8359\\-249.5209\\73\\-133.8567\\-247.1328\\73\\-138.1747\\-241.2734\\73\\-139.3506\\-239.3203\\73\\-140.6882\\-237.3672\\73\\-141.9247\\-235.4141\\73\\-142.7047\\-233.4609\\73\\-144.4607\\-229.5547\\73\\-145.1557\\-227.6016\\73\\-146.157\\-225.6484\\73\\-146.7369\\-223.6953\\73\\-147.5848\\-221.7422\\73\\-148.1802\\-219.7891\\73\\-148.9868\\-215.8828\\73\\-149.5882\\-213.9297\\73\\-150.063\\-211.9766\\73\\-150.8118\\-206.1172\\73\\-151.6263\\-202.2109\\73\\-152.0025\\-198.3047\\73\\-152.1671\\-194.3984\\73\\-152.2466\\-190.4922\\73\\-152.2217\\-186.5859\\73\\-152.087\\-182.6797\\73\\-151.8291\\-178.7734\\73\\-151.591\\-176.8203\\73\\-150.8634\\-172.9141\\73\\-150.5959\\-170.9609\\73\\-150.1988\\-167.0547\\73\\-149.8413\\-165.1016\\73\\-148.8997\\-163.1484\\73\\-148.7742\\-161.1953\\73\\-148.3907\\-159.2422\\73\\-148.1257\\-157.2891\\73\\-147.6366\\-155.3359\\73\\-146.855\\-153.3828\\73\\-146.3514\\-151.4297\\73\\-145.7316\\-149.4766\\73\\-144.8742\\-147.5234\\73\\-144.3802\\-145.5703\\73\\-143.7249\\-143.6172\\73\\-142.8686\\-141.6641\\73\\-142.4447\\-139.7109\\73\\-141.7969\\-137.7578\\73\\-140.8594\\-135.8047\\73\\-140.2007\\-133.8516\\73\\-139.0533\\-131.8984\\73\\-138.3686\\-129.9453\\73\\-137.3486\\-127.9922\\73\\-135.96\\-124.0859\\73\\-134.9182\\-122.1328\\73\\-134.1284\\-120.1797\\73\\-132.8987\\-118.2266\\73\\-131.8586\\-116.2734\\73\\-129.8828\\-112.7977\\73\\-128.6201\\-110.4141\\73\\-127.1497\\-108.4609\\73\\-122.2098\\-102.6016\\73\\-119.816\\-100.6484\\73\\-118.1641\\-99.47786\\73\\-116.2109\\-97.8869\\73\\-114.2578\\-96.52281\\73\\-112.3047\\-95.42911\\73\\-110.3516\\-94.14925\\73\\-108.3984\\-93.34515\\73\\-106.4453\\-92.20174\\73\\-104.4922\\-91.25842\\73\\-102.5391\\-89.94264\\73\\-100.5859\\-88.76159\\73\\-98.63281\\-87.95939\\73\\-96.67969\\-87.27411\\73\\-94.72656\\-86.29956\\73\\-90.82031\\-84.71539\\73\\-86.91406\\-83.50362\\73\\-84.96094\\-82.69989\\73\\-83.00781\\-82.24261\\73\\-79.10156\\-81.58123\\73\\-77.14844\\-81.02985\\73\\-75.19531\\-80.62231\\73\\-71.28906\\-80.14063\\73\\-65.42969\\-79.62559\\73\\-63.47656\\-79.41914\\73\\-59.57031\\-79.11188\\73\\-55.66406\\-78.96462\\73\\-53.71094\\-78.98968\\73\\-49.80469\\-79.18828\\73\\-45.89844\\-79.56982\\73\\-41.99219\\-79.898\\73\\-38.08594\\-80.31818\\73\\-36.13281\\-80.4724\\73\\-34.17969\\-80.76534\\73\\-30.27344\\-81.75723\\73\\-28.32031\\-82.00883\\73\\-24.41406\\-82.27131\\73\\-20.50781\\-82.25452\\73\\-16.60156\\-82.08772\\73\\-14.64844\\-81.93406\\73\\-10.74219\\-81.73502\\73\\-8.789063\\-81.48073\\73\\-4.882813\\-81.25\\73\\0.9765625\\-81.15754\\73\\6.835938\\-80.88432\\73\\8.789063\\-80.71959\\73\\14.64844\\-80.64228\\73\\18.55469\\-80.52359\\73\\22.46094\\-80.51476\\73\\28.32031\\-80.32554\\73\\30.27344\\-80.20837\\73\\32.22656\\-79.9789\\73\\36.13281\\-79.70217\\73\\41.99219\\-79.38025\\73\\45.89844\\-79.3079\\73\\51.75781\\-79.33684\\73\\59.57031\\-79.71576\\73\\63.47656\\-79.93693\\73\\71.28906\\-80.54539\\73\\73.24219\\-80.80842\\73\\75.19531\\-81.26329\\73\\77.14844\\-81.61225\\73\\83.00781\\-82.43805\\73\\84.96094\\-82.91376\\73\\86.91406\\-83.53682\\73\\90.82031\\-84.42027\\73\\94.72656\\-85.76886\\73\\96.67969\\-86.23391\\73\\100.5859\\-87.74916\\73\\102.5391\\-88.24673\\73\\104.4922\\-89.26667\\73\\106.4453\\-90.11391\\73\\108.3984\\-91.32491\\73\\110.3516\\-92.26474\\73\\112.3047\\-93.57967\\73\\114.2578\\-94.53729\\73\\116.2109\\-95.97018\\73\\118.1641\\-97.63297\\73\\121.5665\\-100.6484\\73\\124.0234\\-103.3096\\73\\124.9075\\-104.5547\\73\\126.5638\\-106.5078\\73\\127.9691\\-108.4609\\73\\130.3298\\-112.3672\\73\\131.187\\-114.3203\\73\\132.4815\\-116.2734\\73\\133.4212\\-118.2266\\73\\134.5762\\-120.1797\\73\\135.4214\\-122.1328\\73\\136.4621\\-124.0859\\73\\137.0422\\-126.0391\\73\\138.1601\\-127.9922\\73\\138.8372\\-129.9453\\73\\139.9111\\-131.8984\\73\\141.3949\\-135.8047\\73\\142.2587\\-137.7578\\73\\142.686\\-139.7109\\73\\143.2482\\-141.6641\\73\\144.0768\\-143.6172\\73\\145.0413\\-147.5234\\73\\145.8748\\-149.4766\\73\\146.6978\\-153.3828\\73\\147.1673\\-155.3359\\73\\147.7486\\-157.2891\\73\\148.3398\\-161.1953\\73\\148.7525\\-165.1016\\73\\149.2143\\-169.0078\\73\\149.7467\\-172.9141\\73\\150.0213\\-176.8203\\73\\150.1801\\-182.6797\\73\\150.1465\\-190.4922\\73\\150.0126\\-194.3984\\73\\149.7838\\-198.3047\\73\\149.5882\\-200.2578\\73\\148.8867\\-206.1172\\73\\148.3054\\-211.9766\\73\\148.0504\\-213.9297\\73\\147.6506\\-215.8828\\73\\147.0388\\-217.8359\\73\\146.0761\\-221.7422\\73\\145.1868\\-223.6953\\73\\143.766\\-227.6016\\73\\142.7346\\-229.5547\\73\\141.8732\\-231.5078\\73\\140.6691\\-233.4609\\73\\139.3042\\-235.4141\\73\\138.0573\\-237.3672\\73\\135.7422\\-240.5003\\73\\133.7891\\-242.8183\\73\\131.4259\\-245.1797\\73\\129.6072\\-247.1328\\73\\127.5645\\-249.0859\\73\\125.9766\\-250.2718\\73\\122.0703\\-253.5548\\73\\120.0853\\-254.9453\\73\\118.1641\\-256.1237\\73\\116.2109\\-257.4388\\73\\114.2578\\-258.4429\\73\\113.7091\\-258.8516\\73\\110.3516\\-260.921\\73\\106.4453\\-262.9206\\73\\104.4922\\-263.7586\\73\\100.5859\\-265.7307\\73\\98.63281\\-266.8579\\73\\96.67969\\-267.7225\\73\\94.72656\\-268.7774\\73\\90.82031\\-270.4076\\73\\90.61726\\-270.5703\\73\\84.96094\\-273.6291\\73\\83.00781\\-274.9038\\73\\81.05469\\-275.6667\\73\\79.10156\\-276.8912\\73\\77.14844\\-277.7843\\73\\75.19531\\-279.122\\73\\71.28906\\-281.2761\\73\\69.29977\\-282.2891\\73\\65.42969\\-284.1104\\73\\61.66847\\-286.1953\\73\\55.66406\\-288.943\\73\\53.71094\\-289.4485\\73\\51.75781\\-290.5416\\73\\49.80469\\-291.1939\\73\\47.85156\\-292.1768\\73\\43.94531\\-293.6263\\73\\41.99219\\-294.5023\\73\\38.08594\\-295.3203\\73\\34.17969\\-296.6634\\73\\30.27344\\-297.4724\\73\\28.32031\\-298.2502\\73\\26.36719\\-298.6983\\73\\22.46094\\-299.4434\\73\\20.50781\\-299.948\\73\\18.55469\\-300.3257\\73\\14.64844\\-300.7034\\73\\8.789063\\-301.0818\\73\\4.882813\\-301.2279\\73\\-0.9765625\\-301.2595\\73\\-4.882813\\-301.184\\73\\-10.74219\\-300.9351\\73\\-16.60156\\-300.4974\\73\\-18.55469\\-300.2883\\73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "272" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "163" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-300.0416\\75\\-22.46094\\-299.5374\\75\\-24.41406\\-299.1401\\75\\-28.32031\\-298.4946\\75\\-32.22656\\-297.2798\\75\\-36.13281\\-296.5983\\75\\-38.08594\\-295.861\\75\\-40.03906\\-295.2994\\75\\-43.94531\\-294.5208\\75\\-45.89844\\-293.6845\\75\\-49.80469\\-292.4894\\75\\-51.75781\\-291.4758\\75\\-53.71094\\-290.8287\\75\\-55.66406\\-289.9555\\75\\-57.61719\\-289.3074\\75\\-59.57031\\-288.8716\\75\\-63.47656\\-287.2835\\75\\-65.42969\\-286.6836\\75\\-67.38281\\-285.6431\\75\\-69.33594\\-284.9938\\75\\-71.28906\\-284.0572\\75\\-73.24219\\-283.3386\\75\\-75.19531\\-282.8517\\75\\-77.14844\\-281.9565\\75\\-81.05469\\-280.7581\\75\\-83.00781\\-279.8171\\75\\-84.96094\\-279.1566\\75\\-86.91406\\-278.2844\\75\\-88.86719\\-277.5117\\75\\-90.82031\\-276.9433\\75\\-92.77344\\-276.0211\\75\\-96.67969\\-274.7688\\75\\-98.63281\\-273.7441\\75\\-100.5859\\-272.9819\\75\\-102.5391\\-271.7867\\75\\-104.4922\\-270.9224\\75\\-106.4453\\-269.7393\\75\\-108.3984\\-268.8801\\75\\-110.3516\\-267.6223\\75\\-112.3047\\-266.2532\\75\\-114.2578\\-265.0365\\75\\-117.3459\\-262.7578\\75\\-119.8621\\-260.8047\\75\\-122.1837\\-258.8516\\75\\-125.9766\\-255.419\\75\\-128.3864\\-252.9922\\75\\-133.7891\\-246.6285\\75\\-136.4435\\-243.2266\\75\\-138.956\\-239.3203\\75\\-140.4099\\-237.3672\\75\\-142.5126\\-233.4609\\75\\-143.1683\\-231.5078\\75\\-144.2268\\-229.5547\\75\\-144.8282\\-227.6016\\75\\-145.8795\\-225.6484\\75\\-146.495\\-223.6953\\75\\-147.9707\\-219.7891\\75\\-148.7568\\-215.8828\\75\\-149.2413\\-213.9297\\75\\-149.8413\\-211.9766\\75\\-150.173\\-210.0234\\75\\-150.6027\\-206.1172\\75\\-151.5158\\-200.2578\\75\\-151.8809\\-196.3516\\75\\-152.0199\\-192.4453\\75\\-152.0165\\-186.5859\\75\\-151.8725\\-182.6797\\75\\-151.4757\\-178.7734\\75\\-150.8601\\-174.8672\\75\\-150.2664\\-169.0078\\75\\-150.0126\\-167.0547\\75\\-149.6169\\-165.1016\\75\\-149.047\\-163.1484\\75\\-147.9886\\-157.2891\\75\\-146.6462\\-153.3828\\75\\-146.1643\\-151.4297\\75\\-145.3402\\-149.4766\\75\\-144.6823\\-147.5234\\75\\-144.2077\\-145.5703\\75\\-143.3806\\-143.6172\\75\\-142.7409\\-141.6641\\75\\-142.292\\-139.7109\\75\\-140.6883\\-135.8047\\75\\-139.9633\\-133.8516\\75\\-138.8576\\-131.8984\\75\\-138.212\\-129.9453\\75\\-137.1107\\-127.9922\\75\\-136.5446\\-126.0391\\75\\-133.8281\\-120.1797\\75\\-131.8359\\-116.7279\\75\\-131.4984\\-116.2734\\75\\-130.5768\\-114.3203\\75\\-129.3395\\-112.3672\\75\\-128.3881\\-110.4141\\75\\-126.904\\-108.4609\\75\\-121.6474\\-102.6016\\75\\-118.1641\\-99.73126\\75\\-116.2109\\-98.22118\\75\\-113.9803\\-96.74219\\75\\-110.3516\\-94.47626\\75\\-108.3984\\-93.63378\\75\\-106.4453\\-92.50391\\75\\-104.4922\\-91.61818\\75\\-102.5391\\-90.23803\\75\\-100.5859\\-89.3615\\75\\-98.63281\\-88.21886\\75\\-96.67969\\-87.56527\\75\\-94.72656\\-86.55054\\75\\-90.82031\\-85.13969\\75\\-88.86719\\-84.32508\\75\\-86.91406\\-83.80701\\75\\-83.00781\\-82.49698\\75\\-79.10156\\-81.88226\\75\\-77.14844\\-81.50639\\75\\-75.19531\\-81.01481\\75\\-73.24219\\-80.62891\\75\\-71.28906\\-80.40751\\75\\-63.47656\\-79.76649\\75\\-59.57031\\-79.53376\\75\\-55.66406\\-79.44618\\75\\-53.71094\\-79.45847\\75\\-47.85156\\-79.70443\\75\\-41.99219\\-80.12864\\75\\-36.13281\\-80.76791\\75\\-32.22656\\-81.66271\\75\\-30.27344\\-81.95863\\75\\-26.36719\\-82.26151\\75\\-22.46094\\-82.30216\\75\\-16.60156\\-82.08176\\75\\-10.74219\\-81.78776\\75\\-6.835938\\-81.46647\\75\\-4.882813\\-81.39092\\75\\0.9765625\\-81.34828\\75\\6.835938\\-81.02914\\75\\8.789063\\-80.80381\\75\\10.74219\\-80.71959\\75\\14.64844\\-80.68695\\75\\18.55469\\-80.5863\\75\\24.41406\\-80.53253\\75\\30.27344\\-80.32775\\75\\36.13281\\-79.91381\\75\\41.99219\\-79.66918\\75\\47.85156\\-79.62559\\75\\51.75781\\-79.6756\\75\\61.52344\\-80.0394\\75\\69.33594\\-80.59941\\75\\73.24219\\-81.17322\\75\\75.19531\\-81.58512\\75\\81.05469\\-82.33179\\75\\83.00781\\-82.71957\\75\\84.96094\\-83.3503\\75\\88.86719\\-84.22395\\75\\90.82031\\-84.76435\\75\\92.77344\\-85.51491\\75\\96.67969\\-86.55054\\75\\98.63281\\-87.39108\\75\\102.5391\\-88.56879\\75\\104.4922\\-89.63065\\75\\106.4453\\-90.45362\\75\\108.3984\\-91.69279\\75\\110.3516\\-92.7005\\75\\113.8942\\-94.78906\\75\\116.2109\\-96.32162\\75\\118.8263\\-98.69531\\75\\121.0869\\-100.6484\\75\\123.0007\\-102.6016\\75\\124.6806\\-104.5547\\75\\126.2395\\-106.5078\\75\\127.9297\\-108.8939\\75\\128.9243\\-110.4141\\75\\130.075\\-112.3672\\75\\131.0139\\-114.3203\\75\\132.2706\\-116.2734\\75\\133.1764\\-118.2266\\75\\134.3971\\-120.1797\\75\\135.1851\\-122.1328\\75\\136.2899\\-124.0859\\75\\136.908\\-126.0391\\75\\137.931\\-127.9922\\75\\138.6769\\-129.9453\\75\\140.5029\\-133.8516\\75\\141.1683\\-135.8047\\75\\142.0995\\-137.7578\\75\\143.0369\\-141.6641\\75\\143.8525\\-143.6172\\75\\144.4092\\-145.5703\\75\\144.8474\\-147.5234\\75\\145.5744\\-149.4766\\75\\146.1356\\-151.4297\\75\\146.8952\\-155.3359\\75\\147.8957\\-159.2422\\75\\148.1717\\-161.1953\\75\\148.7903\\-167.0547\\75\\149.1464\\-170.9609\\75\\149.6169\\-174.8672\\75\\149.7698\\-176.8203\\75\\149.9694\\-182.6797\\75\\149.9784\\-186.5859\\75\\149.9187\\-190.4922\\75\\149.6019\\-196.3516\\75\\149.1864\\-200.2578\\75\\148.3296\\-210.0234\\75\\147.7505\\-213.9297\\75\\147.1848\\-215.8828\\75\\146.2777\\-219.7891\\75\\145.6822\\-221.7422\\75\\144.8161\\-223.6953\\75\\144.2613\\-225.6484\\75\\143.2316\\-227.6016\\75\\142.491\\-229.5547\\75\\140.3315\\-233.4609\\75\\138.8636\\-235.4141\\75\\137.5407\\-237.3672\\75\\136.35\\-239.3203\\75\\134.7591\\-241.2734\\75\\132.9278\\-243.2266\\75\\127.9297\\-248.271\\75\\125.9766\\-249.9661\\75\\122.0255\\-252.9922\\75\\118.1641\\-255.7613\\75\\114.2578\\-257.9881\\75\\112.3047\\-259.2747\\75\\110.3516\\-260.2825\\75\\108.3984\\-261.5324\\75\\106.4453\\-262.3574\\75\\104.4922\\-263.4535\\75\\102.5391\\-264.2124\\75\\100.5859\\-265.3929\\75\\98.63281\\-266.3096\\75\\96.67969\\-267.4488\\75\\94.72656\\-268.3151\\75\\92.77344\\-269.4022\\75\\90.82031\\-270.1095\\75\\88.86719\\-271.3548\\75\\86.91406\\-272.3182\\75\\83.41098\\-274.4766\\75\\83.00781\\-274.7973\\75\\81.05469\\-275.6279\\75\\79.10156\\-276.8434\\75\\77.14844\\-277.7546\\75\\75.19531\\-279.1084\\75\\71.28906\\-281.3004\\75\\69.33594\\-282.3135\\75\\65.42969\\-284.2015\\75\\63.47656\\-285.2508\\75\\61.52344\\-286.4085\\75\\59.57031\\-287.2218\\75\\57.61719\\-288.2036\\75\\55.66406\\-289.0172\\75\\53.71094\\-289.5319\\75\\51.75781\\-290.6637\\75\\49.80469\\-291.2911\\75\\47.85156\\-292.3496\\75\\43.94531\\-293.7654\\75\\41.99219\\-294.584\\75\\38.08594\\-295.4148\\75\\36.13281\\-296.1979\\75\\34.17969\\-296.7455\\75\\32.22656\\-297.0959\\75\\30.27344\\-297.6224\\75\\28.32031\\-298.3579\\75\\24.41406\\-299.1204\\75\\20.50781\\-300.0789\\75\\18.55469\\-300.3961\\75\\14.64844\\-300.7596\\75\\10.74219\\-301.0208\\75\\4.882813\\-301.2858\\75\\0.9765625\\-301.3221\\75\\-4.882813\\-301.2357\\75\\-10.74219\\-300.9774\\75\\-16.60156\\-300.5463\\75\\-18.55469\\-300.3555\\75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "271" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "164" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-300.1377\\77\\-24.41406\\-299.2071\\77\\-28.32031\\-298.5599\\77\\-30.27344\\-298.0088\\77\\-32.22656\\-297.3351\\77\\-36.13281\\-296.6405\\77\\-40.03906\\-295.3332\\77\\-43.94531\\-294.5332\\77\\-45.89844\\-293.7182\\77\\-49.80469\\-292.4986\\77\\-51.75781\\-291.4711\\77\\-53.71094\\-290.8419\\77\\-55.66406\\-289.9426\\77\\-57.61719\\-289.2887\\77\\-59.57031\\-288.8469\\77\\-61.52344\\-287.9531\\77\\-65.42969\\-286.5821\\77\\-67.38281\\-285.5239\\77\\-69.33594\\-284.8915\\77\\-71.28906\\-283.8583\\77\\-75.19531\\-282.6727\\77\\-77.14844\\-281.7357\\77\\-79.10156\\-281.1804\\77\\-81.05469\\-280.4724\\77\\-83.00781\\-279.5449\\77\\-84.96094\\-278.8889\\77\\-86.91406\\-277.8665\\77\\-88.86719\\-277.2738\\77\\-90.82031\\-276.546\\77\\-92.77344\\-275.7098\\77\\-94.72656\\-275.1794\\77\\-96.67969\\-274.2026\\77\\-98.63281\\-273.3969\\77\\-100.5859\\-272.3571\\77\\-102.5391\\-271.4282\\77\\-104.4922\\-270.3074\\77\\-106.4453\\-269.464\\77\\-108.3984\\-268.2797\\77\\-110.3516\\-267.2305\\77\\-114.2578\\-264.4157\\77\\-116.2109\\-263.2145\\77\\-118.1641\\-261.7424\\77\\-121.5567\\-258.8516\\77\\-125.9766\\-254.8125\\77\\-127.8265\\-252.9922\\77\\-131.2355\\-249.0859\\77\\-131.8359\\-248.4765\\77\\-134.6325\\-245.1797\\77\\-136.1195\\-243.2266\\77\\-137.2462\\-241.2734\\77\\-137.6953\\-240.7476\\77\\-139.6484\\-237.8715\\77\\-140.067\\-237.3672\\77\\-141.066\\-235.4141\\77\\-142.2714\\-233.4609\\77\\-142.8973\\-231.5078\\77\\-143.944\\-229.5547\\77\\-144.5946\\-227.6016\\77\\-146.2794\\-223.6953\\77\\-146.8833\\-221.7422\\77\\-147.7136\\-219.7891\\77\\-148.227\\-217.8359\\77\\-148.9763\\-213.9297\\77\\-149.5448\\-211.9766\\77\\-149.9821\\-210.0234\\77\\-150.2551\\-208.0703\\77\\-151.0715\\-200.2578\\77\\-151.5789\\-196.3516\\77\\-151.7639\\-192.4453\\77\\-151.8019\\-190.4922\\77\\-151.7639\\-186.5859\\77\\-151.5542\\-182.6797\\77\\-151.0462\\-178.7734\\77\\-150.6138\\-174.8672\\77\\-150.3074\\-170.9609\\77\\-149.7811\\-167.0547\\77\\-149.2551\\-165.1016\\77\\-148.8268\\-163.1484\\77\\-148.1963\\-159.2422\\77\\-147.7732\\-157.2891\\77\\-147.0165\\-155.3359\\77\\-145.9572\\-151.4297\\77\\-145.0508\\-149.4766\\77\\-144.0079\\-145.5703\\77\\-143.1169\\-143.6172\\77\\-142.1477\\-139.7109\\77\\-141.2542\\-137.7578\\77\\-140.532\\-135.8047\\77\\-138.7128\\-131.8984\\77\\-137.9883\\-129.9453\\77\\-136.98\\-127.9922\\77\\-136.4296\\-126.0391\\77\\-135.3725\\-124.0859\\77\\-134.6168\\-122.1328\\77\\-133.509\\-120.1797\\77\\-132.5335\\-118.2266\\77\\-131.2657\\-116.2734\\77\\-130.3745\\-114.3203\\77\\-129.1311\\-112.3672\\77\\-128.0136\\-110.4141\\77\\-126.617\\-108.4609\\77\\-123.174\\-104.5547\\77\\-121.2993\\-102.6016\\77\\-118.1641\\-100.0186\\77\\-112.3047\\-95.94378\\77\\-110.2189\\-94.78906\\77\\-104.4922\\-91.89286\\77\\-102.5391\\-90.62286\\77\\-100.5859\\-89.69318\\77\\-98.63281\\-88.58197\\77\\-96.67969\\-87.83672\\77\\-94.72656\\-86.8913\\77\\-92.77344\\-86.08932\\77\\-90.82031\\-85.53152\\77\\-88.86719\\-84.65723\\77\\-84.96094\\-83.58064\\77\\-83.00781\\-82.85897\\77\\-81.05469\\-82.38062\\77\\-77.14844\\-81.82568\\77\\-73.24219\\-81.03056\\77\\-71.28906\\-80.70856\\77\\-69.33594\\-80.49345\\77\\-63.47656\\-80.05131\\77\\-59.57031\\-79.86249\\77\\-55.66406\\-79.77917\\77\\-53.71094\\-79.79185\\77\\-47.85156\\-79.98292\\77\\-43.94531\\-80.25107\\77\\-40.03906\\-80.59592\\77\\-38.08594\\-80.84345\\77\\-34.17969\\-81.62937\\77\\-32.22656\\-81.91221\\77\\-28.32031\\-82.25947\\77\\-26.36719\\-82.3409\\77\\-22.46094\\-82.31407\\77\\-10.74219\\-81.86694\\77\\-4.882813\\-81.61225\\77\\0.9765625\\-81.58839\\77\\4.882813\\-81.38886\\77\\6.835938\\-81.20524\\77\\8.789063\\-80.91119\\77\\10.74219\\-80.80381\\77\\12.69531\\-80.81839\\77\\16.60156\\-80.70061\\77\\26.36719\\-80.57682\\77\\34.17969\\-80.28911\\77\\36.13281\\-80.15261\\77\\41.99219\\-79.92914\\77\\47.85156\\-79.89957\\77\\53.71094\\-79.98292\\77\\61.52344\\-80.29572\\77\\65.42969\\-80.50996\\77\\69.33594\\-80.91591\\77\\75.19531\\-81.8325\\77\\79.10156\\-82.25947\\77\\81.05469\\-82.55939\\77\\84.96094\\-83.66809\\77\\88.86719\\-84.50852\\77\\90.82031\\-85.23478\\77\\94.72656\\-86.30092\\77\\96.67969\\-86.93687\\77\\98.63281\\-87.68045\\77\\100.5859\\-88.15217\\77\\104.4922\\-89.92348\\77\\108.3984\\-91.99485\\77\\110.3516\\-93.21325\\77\\112.3047\\-94.10943\\77\\116.1056\\-96.74219\\77\\120.1172\\-100.0933\\77\\122.7426\\-102.6016\\77\\124.3985\\-104.5547\\77\\128.7364\\-110.4141\\77\\129.732\\-112.3672\\77\\132.0103\\-116.2734\\77\\132.9753\\-118.2266\\77\\134.1943\\-120.1797\\77\\135.019\\-122.1328\\77\\136.0653\\-124.0859\\77\\136.773\\-126.0391\\77\\138.5174\\-129.9453\\77\\139.2927\\-131.8984\\77\\140.3491\\-133.8516\\77\\140.9642\\-135.8047\\77\\141.8896\\-137.7578\\77\\142.4689\\-139.7109\\77\\142.8686\\-141.6641\\77\\144.2746\\-145.5703\\77\\144.679\\-147.5234\\77\\145.2258\\-149.4766\\77\\145.9358\\-151.4297\\77\\146.6551\\-155.3359\\77\\147.0898\\-157.2891\\77\\147.6237\\-159.2422\\77\\147.9797\\-161.1953\\77\\148.6053\\-167.0547\\77\\148.8867\\-170.9609\\77\\149.39\\-176.8203\\77\\149.6691\\-182.6797\\77\\149.6691\\-188.5391\\77\\149.4696\\-192.4453\\77\\148.4843\\-206.1172\\77\\148.11\\-210.0234\\77\\147.7975\\-211.9766\\77\\146.8194\\-215.8828\\77\\145.9754\\-219.7891\\77\\145.1185\\-221.7422\\77\\143.9251\\-225.6484\\77\\142.8889\\-227.6016\\77\\142.202\\-229.5547\\77\\140.9485\\-231.5078\\77\\139.8994\\-233.4609\\77\\137.6953\\-236.6348\\77\\137.097\\-237.3672\\77\\135.9089\\-239.3203\\77\\134.4154\\-241.2734\\77\\130.671\\-245.1797\\77\\127.9297\\-247.8939\\77\\125.9766\\-249.5635\\77\\124.0234\\-250.8696\\77\\122.0703\\-252.3302\\77\\120.1172\\-253.8941\\77\\118.1641\\-255.317\\77\\116.2109\\-256.3294\\77\\114.2578\\-257.6048\\77\\112.3047\\-258.6205\\77\\108.3984\\-261.097\\77\\106.4453\\-261.9679\\77\\104.4922\\-263.0611\\77\\102.5391\\-263.8625\\77\\100.5859\\-265.0039\\77\\98.63281\\-265.9071\\77\\96.67969\\-267.1523\\77\\94.72656\\-268.0014\\77\\92.77344\\-269.2005\\77\\90.82031\\-269.9301\\77\\88.86719\\-271.1786\\77\\86.91406\\-272.1086\\77\\83.00781\\-274.6644\\77\\81.05469\\-275.5918\\77\\79.10156\\-276.7942\\77\\77.14844\\-277.7133\\77\\75.19531\\-279.1056\\77\\73.07381\\-280.3359\\77\\69.33594\\-282.3764\\77\\67.38281\\-283.2599\\77\\63.47656\\-285.3051\\77\\61.52344\\-286.523\\77\\59.57031\\-287.2848\\77\\57.61719\\-288.3087\\77\\55.66406\\-289.0833\\77\\53.71094\\-289.6463\\77\\51.75781\\-290.7726\\77\\49.80469\\-291.4128\\77\\47.85156\\-292.504\\77\\45.89844\\-293.1403\\77\\41.99219\\-294.6728\\77\\38.08594\\-295.5367\\77\\36.13281\\-296.3556\\77\\34.17969\\-296.8272\\77\\32.22656\\-297.1844\\77\\28.32031\\-298.4792\\77\\24.41406\\-299.218\\77\\20.50781\\-300.1949\\77\\16.60156\\-300.654\\77\\12.69531\\-300.9542\\77\\6.835938\\-301.2763\\77\\0.9765625\\-301.3752\\77\\-2.929688\\-301.3386\\77\\-8.789063\\-301.114\\77\\-12.69531\\-300.878\\77\\-18.55469\\-300.4078\\77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "267" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "165" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-300.216\\79\\-24.41406\\-299.2632\\79\\-28.32031\\-298.6102\\79\\-30.27344\\-298.1378\\79\\-32.22656\\-297.3985\\79\\-36.13281\\-296.6737\\79\\-40.03906\\-295.3634\\79\\-43.94531\\-294.5579\\79\\-45.89844\\-293.7551\\79\\-49.80469\\-292.5167\\79\\-51.75781\\-291.4826\\79\\-53.71094\\-290.8919\\79\\-55.66406\\-290.0156\\79\\-57.61719\\-289.2887\\79\\-59.57031\\-288.8389\\79\\-61.52344\\-287.9132\\79\\-65.42969\\-286.4714\\79\\-67.38281\\-285.4299\\79\\-69.33594\\-284.7835\\79\\-71.28906\\-283.7159\\79\\-73.24219\\-283.1616\\79\\-75.19531\\-282.4783\\79\\-77.14844\\-281.5627\\79\\-79.10156\\-281.0084\\79\\-81.05469\\-280.1057\\79\\-84.96094\\-278.5325\\79\\-86.91406\\-277.5782\\79\\-88.86719\\-277.0265\\79\\-90.82031\\-276.0752\\79\\-94.72656\\-274.8159\\79\\-96.67969\\-273.769\\79\\-98.63281\\-273.0178\\79\\-100.5859\\-271.8331\\79\\-102.5391\\-271.0495\\79\\-104.4922\\-269.87\\79\\-106.4453\\-269.1122\\79\\-108.3984\\-267.8372\\79\\-110.3516\\-266.6721\\79\\-112.3047\\-265.3838\\79\\-114.2578\\-263.9108\\79\\-116.1194\\-262.7578\\79\\-118.1641\\-261.3305\\79\\-121.1007\\-258.8516\\79\\-123.3068\\-256.8984\\79\\-125.9766\\-254.3648\\79\\-129.1681\\-251.0391\\79\\-131.8359\\-248.0584\\79\\-134.2739\\-245.1797\\79\\-135.7422\\-243.135\\79\\-136.8952\\-241.2734\\79\\-138.3329\\-239.3203\\79\\-141.9548\\-233.4609\\79\\-142.6575\\-231.5078\\79\\-144.3818\\-227.6016\\79\\-145.0258\\-225.6484\\79\\-146.0314\\-223.6953\\79\\-146.6064\\-221.7422\\79\\-148.0164\\-217.8359\\79\\-149.1718\\-211.9766\\79\\-149.7206\\-210.0234\\79\\-150.0873\\-208.0703\\79\\-150.3024\\-206.1172\\79\\-150.9339\\-198.3047\\79\\-151.1195\\-196.3516\\79\\-151.3593\\-192.4453\\79\\-151.4194\\-188.5391\\79\\-151.3593\\-186.5859\\79\\-151.1072\\-182.6797\\79\\-150.7621\\-178.7734\\79\\-150.1465\\-170.9609\\79\\-149.8653\\-169.0078\\79\\-148.9975\\-165.1016\\79\\-148.629\\-163.1484\\79\\-148.0164\\-159.2422\\79\\-147.4686\\-157.2891\\79\\-146.7779\\-155.3359\\79\\-146.3087\\-153.3828\\79\\-145.6822\\-151.4297\\79\\-144.8399\\-149.4766\\79\\-144.388\\-147.5234\\79\\-143.7773\\-145.5703\\79\\-142.9396\\-143.6172\\79\\-142.5308\\-141.6641\\79\\-141.9772\\-139.7109\\79\\-141.0444\\-137.7578\\79\\-140.3809\\-135.8047\\79\\-139.3885\\-133.8516\\79\\-136.8835\\-127.9922\\79\\-136.3051\\-126.0391\\79\\-135.2113\\-124.0859\\79\\-134.4666\\-122.1328\\79\\-133.2617\\-120.1797\\79\\-132.3547\\-118.2266\\79\\-131.0757\\-116.2734\\79\\-130.1041\\-114.3203\\79\\-128.9185\\-112.3672\\79\\-126.3089\\-108.4609\\79\\-122.9162\\-104.5547\\79\\-120.1172\\-101.8609\\79\\-118.1641\\-100.3927\\79\\-116.2109\\-99.12023\\79\\-114.2578\\-97.58588\\79\\-112.3047\\-96.25054\\79\\-110.3516\\-95.21904\\79\\-108.3984\\-94.04228\\79\\-106.4453\\-93.26761\\79\\-105.7978\\-92.83594\\79\\-102.5391\\-91.1323\\79\\-100.5859\\-89.95193\\79\\-96.67969\\-88.06802\\79\\-92.77344\\-86.37231\\79\\-90.82031\\-85.83627\\79\\-86.91406\\-84.38535\\79\\-83.00781\\-83.36397\\79\\-81.05469\\-82.71957\\79\\-79.10156\\-82.3485\\79\\-73.24219\\-81.51479\\79\\-69.33594\\-80.83296\\79\\-63.47656\\-80.33234\\79\\-57.61719\\-80.10511\\79\\-53.71094\\-80.08768\\79\\-49.80469\\-80.16374\\79\\-43.94531\\-80.49345\\79\\-40.03906\\-80.92645\\79\\-36.13281\\-81.66271\\79\\-34.17969\\-81.89969\\79\\-30.27344\\-82.25452\\79\\-26.36719\\-82.39703\\79\\-22.46094\\-82.32598\\79\\-14.64844\\-82.05736\\79\\-6.835938\\-81.83709\\79\\0.9765625\\-81.80393\\79\\4.882813\\-81.63223\\79\\6.835938\\-81.45718\\79\\8.789063\\-81.09236\\79\\10.74219\\-80.98222\\79\\14.64844\\-80.91279\\79\\18.55469\\-80.75888\\79\\22.46094\\-80.75888\\79\\30.27344\\-80.60565\\79\\38.08594\\-80.30242\\79\\45.89844\\-80.18084\\79\\53.71094\\-80.23944\\79\\61.52344\\-80.49744\\79\\65.42969\\-80.79642\\79\\71.28906\\-81.59537\\79\\77.14844\\-82.20689\\79\\79.10156\\-82.45452\\79\\81.05469\\-82.8908\\79\\83.00781\\-83.48322\\79\\86.91406\\-84.34148\\79\\88.86719\\-84.90137\\79\\90.82031\\-85.60327\\79\\92.77344\\-86.02806\\79\\94.72656\\-86.57406\\79\\96.67969\\-87.37993\\79\\100.5859\\-88.40487\\79\\102.5391\\-89.45354\\79\\104.4922\\-90.22977\\79\\106.4453\\-91.43478\\79\\108.3984\\-92.31236\\79\\110.3516\\-93.56006\\79\\112.3047\\-94.50896\\79\\114.2578\\-95.79693\\79\\115.4665\\-96.74219\\79\\118.1641\\-99.04134\\79\\120.1172\\-100.591\\79\\122.3281\\-102.6016\\79\\125.4075\\-106.5078\\79\\125.9766\\-107.1406\\79\\128.5105\\-110.4141\\79\\129.456\\-112.3672\\79\\130.6824\\-114.3203\\79\\131.6452\\-116.2734\\79\\133.9296\\-120.1797\\79\\135.7982\\-124.0859\\79\\136.6404\\-126.0391\\79\\137.3117\\-127.9922\\79\\138.355\\-129.9453\\79\\139.0374\\-131.8984\\79\\140.1602\\-133.8516\\79\\140.7823\\-135.8047\\79\\141.625\\-137.7578\\79\\142.3401\\-139.7109\\79\\142.7288\\-141.6641\\79\\143.287\\-143.6172\\79\\144.0979\\-145.5703\\79\\144.9626\\-149.4766\\79\\145.6299\\-151.4297\\79\\146.1356\\-153.3828\\79\\146.8231\\-157.2891\\79\\147.7119\\-161.1953\\79\\148.0061\\-163.1484\\79\\148.4318\\-167.0547\\79\\148.9356\\-174.8672\\79\\149.2143\\-180.7266\\79\\149.2691\\-188.5391\\79\\148.8029\\-198.3047\\79\\148.2776\\-206.1172\\79\\147.806\\-210.0234\\79\\146.8971\\-213.9297\\79\\146.1461\\-217.8359\\79\\144.7519\\-221.7422\\79\\144.2829\\-223.6953\\79\\143.3932\\-225.6484\\79\\141.8044\\-229.5547\\79\\140.6193\\-231.5078\\79\\139.289\\-233.4609\\79\\137.6953\\-236.1398\\79\\133.9505\\-241.2734\\79\\130.179\\-245.1797\\79\\127.9297\\-247.3937\\79\\125.7999\\-249.0859\\79\\124.0234\\-250.3995\\79\\120.1172\\-253.4338\\79\\114.2578\\-257.1407\\79\\112.3047\\-258.0934\\79\\110.3516\\-259.4249\\79\\108.3984\\-260.4721\\79\\106.4453\\-261.6478\\79\\104.4922\\-262.5231\\79\\102.5391\\-263.5767\\79\\100.5859\\-264.4393\\79\\100.221\\-264.7109\\79\\96.67969\\-266.761\\79\\94.72656\\-267.7678\\79\\92.77344\\-268.9781\\79\\90.82031\\-269.7679\\79\\88.86719\\-271.0037\\79\\86.91406\\-271.9612\\79\\84.96094\\-273.324\\79\\83.00781\\-274.5317\\79\\81.05469\\-275.5435\\79\\79.10156\\-276.7458\\79\\77.14844\\-277.7133\\79\\75.19531\\-279.1056\\79\\73.09792\\-280.3359\\79\\69.52898\\-282.2891\\79\\67.38281\\-283.2829\\79\\65.42969\\-284.4049\\79\\63.47656\\-285.3606\\79\\61.52344\\-286.6233\\79\\59.57031\\-287.3683\\79\\57.61719\\-288.445\\79\\53.71094\\-289.7973\\79\\51.75781\\-290.8839\\79\\49.80469\\-291.5429\\79\\47.85156\\-292.6373\\79\\45.89844\\-293.2537\\79\\43.94531\\-294.1196\\79\\41.99219\\-294.7713\\79\\40.03906\\-295.1785\\79\\38.08594\\-295.6933\\79\\36.13281\\-296.4987\\79\\32.22656\\-297.2958\\79\\30.27344\\-298.0088\\79\\28.32031\\-298.5839\\79\\24.41406\\-299.3298\\79\\20.50781\\-300.2787\\79\\16.60156\\-300.7098\\79\\10.74219\\-301.1255\\79\\6.835938\\-301.3221\\79\\0.9765625\\-301.4123\\79\\-4.882813\\-301.3386\\79\\-8.789063\\-301.1588\\79\\-14.64844\\-300.7873\\79\\-18.55469\\-300.4474\\79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "264" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "166" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-299.8748\\81\\-24.41406\\-299.3351\\81\\-28.32031\\-298.6611\\81\\-30.27344\\-298.2396\\81\\-32.22656\\-297.4793\\81\\-34.17969\\-297.0443\\81\\-36.13281\\-296.7126\\81\\-38.08594\\-296.1324\\81\\-40.03906\\-295.4076\\81\\-43.94531\\-294.5999\\81\\-47.85156\\-293.116\\81\\-49.80469\\-292.56\\81\\-51.75781\\-291.5109\\81\\-53.71094\\-290.9252\\81\\-57.61719\\-289.282\\81\\-59.57031\\-288.8264\\81\\-61.52344\\-287.8745\\81\\-65.42969\\-286.3722\\81\\-67.38281\\-285.3473\\81\\-69.33594\\-284.6769\\81\\-71.28906\\-283.5972\\81\\-73.24219\\-283.0644\\81\\-77.14844\\-281.4256\\81\\-79.10156\\-280.818\\81\\-81.05469\\-279.7974\\81\\-83.00781\\-279.1044\\81\\-84.96094\\-278.0711\\81\\-88.86719\\-276.681\\81\\-90.82031\\-275.7551\\81\\-92.77344\\-275.1952\\81\\-94.72656\\-274.2588\\81\\-96.67969\\-273.4338\\81\\-98.63281\\-272.3977\\81\\-106.3368\\-268.6172\\81\\-108.3984\\-267.4631\\81\\-110.3516\\-266.0716\\81\\-112.5127\\-264.7109\\81\\-115.4423\\-262.7578\\81\\-118.1152\\-260.8047\\81\\-120.5673\\-258.8516\\81\\-124.0234\\-255.8095\\81\\-125.9766\\-253.9057\\81\\-128.7697\\-251.0391\\81\\-131.8359\\-247.566\\81\\-133.7891\\-245.1327\\81\\-135.7422\\-242.5724\\81\\-137.9516\\-239.3203\\81\\-139.0412\\-237.3672\\81\\-140.4469\\-235.4141\\81\\-142.4255\\-231.5078\\81\\-143.1077\\-229.5547\\81\\-144.1323\\-227.6016\\81\\-144.7188\\-225.6484\\81\\-145.6432\\-223.6953\\81\\-146.3649\\-221.7422\\81\\-146.9397\\-219.7891\\81\\-147.7409\\-217.8359\\81\\-148.2153\\-215.8828\\81\\-148.8832\\-211.9766\\81\\-149.8413\\-208.0703\\81\\-150.1346\\-206.1172\\81\\-150.4503\\-202.2109\\81\\-150.8852\\-194.3984\\81\\-150.9752\\-190.4922\\81\\-150.957\\-186.5859\\81\\-150.7945\\-182.6797\\81\\-150.3024\\-174.8672\\81\\-149.9187\\-170.9609\\81\\-149.1075\\-167.0547\\81\\-148.4558\\-163.1484\\81\\-148.1919\\-161.1953\\81\\-147.7865\\-159.2422\\81\\-146.5794\\-155.3359\\81\\-146.1278\\-153.3828\\81\\-145.3256\\-151.4297\\81\\-144.6852\\-149.4766\\81\\-144.2411\\-147.5234\\81\\-142.8068\\-143.6172\\81\\-142.4173\\-141.6641\\81\\-141.7717\\-139.7109\\81\\-140.8663\\-137.7578\\81\\-140.2322\\-135.8047\\81\\-139.1539\\-133.8516\\81\\-138.4461\\-131.8984\\81\\-137.4153\\-129.9453\\81\\-136.1256\\-126.0391\\81\\-135.0393\\-124.0859\\81\\-134.2741\\-122.1328\\81\\-133.0582\\-120.1797\\81\\-132.0818\\-118.2266\\81\\-130.8833\\-116.2734\\81\\-128.7122\\-112.3672\\81\\-125.9766\\-108.5723\\81\\-124.3057\\-106.5078\\81\\-122.5956\\-104.5547\\81\\-120.1172\\-102.2152\\81\\-118.1641\\-100.8906\\81\\-115.34\\-98.69531\\81\\-112.3047\\-96.55582\\81\\-110.3516\\-95.53976\\81\\-108.3984\\-94.29381\\81\\-106.4453\\-93.55251\\81\\-104.4922\\-92.41107\\81\\-102.5391\\-91.51996\\81\\-100.5859\\-90.24158\\81\\-98.63281\\-89.4018\\81\\-96.67969\\-88.30334\\81\\-94.72656\\-87.57912\\81\\-92.77344\\-86.66267\\81\\-88.86719\\-85.55898\\81\\-86.91406\\-84.7285\\81\\-84.96094\\-84.17166\\81\\-81.05469\\-83.23793\\81\\-79.10156\\-82.6385\\81\\-75.19531\\-82.06398\\81\\-71.28906\\-81.62231\\81\\-69.33594\\-81.29404\\81\\-65.42969\\-80.80614\\81\\-61.52344\\-80.52359\\81\\-55.66406\\-80.36095\\81\\-49.80469\\-80.41528\\81\\-43.94531\\-80.80614\\81\\-38.08594\\-81.70844\\81\\-36.13281\\-81.93923\\81\\-30.27344\\-82.38062\\81\\-26.36719\\-82.44998\\81\\-16.60156\\-82.17116\\81\\-6.835938\\-81.98319\\81\\2.929688\\-81.94116\\81\\6.835938\\-81.7487\\81\\8.789063\\-81.47429\\81\\14.64844\\-81.14181\\81\\18.55469\\-80.87119\\81\\28.32031\\-80.83296\\81\\32.22656\\-80.75629\\81\\38.08594\\-80.49345\\81\\45.89844\\-80.40424\\81\\55.66406\\-80.51865\\81\\61.52344\\-80.80842\\81\\63.47656\\-80.98543\\81\\71.28906\\-81.84808\\81\\75.19531\\-82.18731\\81\\77.14844\\-82.41313\\81\\79.10156\\-82.75642\\81\\81.05469\\-83.31799\\81\\84.96094\\-84.15955\\81\\86.91406\\-84.63157\\81\\88.86719\\-85.38882\\81\\92.77344\\-86.28893\\81\\96.67969\\-87.68045\\81\\98.63281\\-88.10571\\81\\100.5859\\-88.81435\\81\\102.5391\\-89.77912\\81\\104.4922\\-90.62286\\81\\106.4453\\-91.76505\\81\\108.3984\\-92.72743\\81\\110.3516\\-93.83177\\81\\112.3047\\-95.06701\\81\\114.2578\\-96.14173\\81\\116.2109\\-97.74462\\81\\121.6935\\-102.6016\\81\\126.7541\\-108.4609\\81\\128.2037\\-110.4141\\81\\129.2251\\-112.3672\\81\\130.4713\\-114.3203\\81\\131.3343\\-116.2734\\81\\132.5684\\-118.2266\\81\\134.6784\\-122.1328\\81\\135.5017\\-124.0859\\81\\136.4948\\-126.0391\\81\\137.0716\\-127.9922\\81\\138.1778\\-129.9453\\81\\138.8408\\-131.8984\\81\\139.919\\-133.8516\\81\\141.3216\\-137.7578\\81\\142.1749\\-139.7109\\81\\143.0404\\-143.6172\\81\\143.8407\\-145.5703\\81\\144.3623\\-147.5234\\81\\145.2026\\-151.4297\\81\\145.8748\\-153.3828\\81\\146.2719\\-155.3359\\81\\146.8987\\-159.2422\\81\\147.7599\\-163.1484\\81\\148.0301\\-165.1016\\81\\148.3804\\-169.0078\\81\\148.7044\\-174.8672\\81\\148.8773\\-180.7266\\81\\148.9324\\-188.5391\\81\\148.7442\\-194.3984\\81\\148.5745\\-198.3047\\81\\148.2064\\-204.1641\\81\\147.7486\\-208.0703\\81\\146.9191\\-211.9766\\81\\146.2298\\-215.8828\\81\\145.7435\\-217.8359\\81\\144.9626\\-219.7891\\81\\143.944\\-223.6953\\81\\142.9791\\-225.6484\\81\\142.4062\\-227.6016\\81\\141.2737\\-229.5547\\81\\140.2814\\-231.5078\\81\\138.8504\\-233.4609\\81\\136.4663\\-237.3672\\81\\133.7891\\-240.7656\\81\\129.5185\\-245.1797\\81\\127.5156\\-247.1328\\81\\124.0234\\-250.0163\\81\\122.0703\\-251.4853\\81\\116.9976\\-254.9453\\81\\116.2109\\-255.5394\\81\\114.2578\\-256.5122\\81\\113.713\\-256.8984\\81\\108.3984\\-259.9959\\81\\106.4453\\-261.2498\\81\\104.4922\\-262.1267\\81\\102.5391\\-263.2764\\81\\100.5859\\-264.0454\\81\\98.63281\\-265.3077\\81\\96.67969\\-266.3223\\81\\96.21957\\-266.6641\\81\\92.77344\\-268.6886\\81\\90.82031\\-269.6365\\81\\88.86719\\-270.823\\81\\86.91406\\-271.8517\\81\\84.96094\\-273.2617\\81\\82.93269\\-274.4766\\81\\77.14844\\-277.7215\\81\\75.19531\\-279.1344\\81\\73.16451\\-280.3359\\81\\69.33594\\-282.4951\\81\\67.38281\\-283.3173\\81\\65.42969\\-284.5183\\81\\63.47656\\-285.4376\\81\\61.52344\\-286.7066\\81\\59.57031\\-287.4637\\81\\57.61719\\-288.5787\\81\\55.66406\\-289.2015\\81\\53.71094\\-290.0008\\81\\51.75781\\-290.9759\\81\\49.80469\\-291.7119\\81\\47.85156\\-292.7589\\81\\45.89844\\-293.3776\\81\\43.94531\\-294.3015\\81\\41.99219\\-294.8608\\81\\40.03906\\-295.2749\\81\\38.08594\\-295.875\\81\\36.13281\\-296.61\\81\\32.22656\\-297.4166\\81\\30.27344\\-298.207\\81\\28.32031\\-298.6709\\81\\24.41406\\-299.4504\\81\\22.46094\\-300.0026\\81\\20.50781\\-300.3584\\81\\18.55469\\-300.5941\\81\\12.69531\\-301.0355\\81\\8.789063\\-301.2669\\81\\2.929688\\-301.4696\\81\\-0.9765625\\-301.4809\\81\\-4.882813\\-301.3989\\81\\-10.74219\\-301.0972\\81\\-14.64844\\-300.8209\\81\\-18.55469\\-300.4938\\81\\-20.50781\\-300.2664\\81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "259" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "167" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-299.9619\\83\\-24.41406\\-299.4123\\83\\-30.27344\\-298.33\\83\\-32.22656\\-297.5644\\83\\-34.17969\\-297.0822\\83\\-36.13281\\-296.7624\\83\\-38.08594\\-296.2369\\83\\-40.03906\\-295.4694\\83\\-43.94531\\-294.6489\\83\\-47.85156\\-293.1426\\83\\-49.80469\\-292.5929\\83\\-51.75781\\-291.5574\\83\\-53.71094\\-290.9407\\83\\-57.61719\\-289.2887\\83\\-59.57031\\-288.8264\\83\\-61.52344\\-287.8604\\83\\-65.42969\\-286.3183\\83\\-67.38281\\-285.2896\\83\\-69.33594\\-284.5783\\83\\-71.28906\\-283.5142\\83\\-73.24219\\-282.9628\\83\\-75.19531\\-282.0214\\83\\-79.10156\\-280.6179\\83\\-81.05469\\-279.5968\\83\\-83.00781\\-278.8622\\83\\-84.96094\\-277.7378\\83\\-86.91406\\-277.1331\\83\\-88.86719\\-276.1968\\83\\-92.77344\\-274.8658\\83\\-94.72656\\-273.8351\\83\\-96.67969\\-273.072\\83\\-98.63281\\-271.8782\\83\\-100.5859\\-271.1211\\83\\-102.5391\\-269.9648\\83\\-104.4922\\-269.2308\\83\\-106.4453\\-268.006\\83\\-108.3984\\-267.0294\\83\\-111.7205\\-264.7109\\83\\-112.3047\\-264.2436\\83\\-114.2578\\-263.1973\\83\\-116.2109\\-261.7617\\83\\-122.0703\\-257.0739\\83\\-124.0234\\-255.3434\\83\\-128.3218\\-251.0391\\83\\-130.0639\\-249.0859\\83\\-131.6216\\-247.1328\\83\\-134.8705\\-243.2266\\83\\-136.3416\\-241.2734\\83\\-137.4046\\-239.3203\\83\\-140.0761\\-235.4141\\83\\-141.0289\\-233.4609\\83\\-142.1587\\-231.5078\\83\\-142.8097\\-229.5547\\83\\-143.7789\\-227.6016\\83\\-145.1266\\-223.6953\\83\\-146.0859\\-221.7422\\83\\-146.657\\-219.7891\\83\\-147.9953\\-215.8828\\83\\-149.0083\\-210.0234\\83\\-149.8958\\-206.1172\\83\\-150.2852\\-202.2109\\83\\-150.4828\\-198.3047\\83\\-150.6721\\-192.4453\\83\\-150.6721\\-186.5859\\83\\-150.5561\\-182.6797\\83\\-150.3688\\-178.7734\\83\\-150.115\\-174.8672\\83\\-149.9089\\-172.9141\\83\\-149.6019\\-170.9609\\83\\-148.8514\\-167.0547\\83\\-148.0129\\-161.1953\\83\\-146.882\\-157.2891\\83\\-145.9167\\-153.3828\\83\\-145.0479\\-151.4297\\83\\-144.0768\\-147.5234\\83\\-143.2339\\-145.5703\\83\\-142.2791\\-141.6641\\83\\-140.7104\\-137.7578\\83\\-140.0548\\-135.8047\\83\\-138.9541\\-133.8516\\83\\-138.2835\\-131.8984\\83\\-137.2236\\-129.9453\\83\\-136.6652\\-127.9922\\83\\-135.8918\\-126.0391\\83\\-134.8855\\-124.0859\\83\\-134.0209\\-122.1328\\83\\-131.8359\\-118.424\\83\\-128.4944\\-112.3672\\83\\-125.9766\\-108.9984\\83\\-124.0234\\-106.675\\83\\-122.1454\\-104.5547\\83\\-120.0149\\-102.6016\\83\\-116.2109\\-99.63749\\83\\-114.9368\\-98.69531\\83\\-112.0016\\-96.74219\\83\\-108.3984\\-94.60645\\83\\-106.4453\\-93.77655\\83\\-102.5391\\-91.79903\\83\\-100.5859\\-90.61228\\83\\-98.63281\\-89.70743\\83\\-96.67969\\-88.62405\\83\\-94.72656\\-87.89171\\83\\-92.58823\\-86.97656\\83\\-90.82031\\-86.33968\\83\\-88.86719\\-85.82457\\83\\-84.96094\\-84.48485\\83\\-81.05469\\-83.63947\\83\\-77.14844\\-82.63119\\83\\-75.19531\\-82.32424\\83\\-69.33594\\-81.69515\\83\\-67.38281\\-81.5317\\83\\-63.47656\\-81.06069\\83\\-61.52344\\-80.89934\\83\\-57.61719\\-80.70856\\83\\-55.66406\\-80.66281\\83\\-49.80469\\-80.71959\\83\\-47.85156\\-80.84345\\83\\-43.94531\\-81.28257\\83\\-40.03906\\-81.81748\\83\\-36.13281\\-82.14227\\83\\-30.27344\\-82.50224\\83\\-26.36719\\-82.50065\\83\\-16.60156\\-82.24952\\83\\-4.882813\\-82.11183\\83\\0.9765625\\-82.15846\\83\\2.929688\\-82.11771\\83\\10.74219\\-81.71764\\83\\16.60156\\-81.29404\\83\\18.55469\\-81.04455\\83\\22.46094\\-80.99905\\83\\28.32031\\-81.02985\\83\\32.22656\\-81.01398\\83\\36.13281\\-80.8206\\83\\40.03906\\-80.71959\\83\\45.89844\\-80.66281\\83\\49.80469\\-80.69768\\83\\55.66406\\-80.84551\\83\\59.57031\\-81.09277\\83\\67.38281\\-81.75323\\83\\71.28906\\-82.02904\\83\\75.19531\\-82.39282\\83\\77.14844\\-82.69989\\83\\79.10156\\-83.22568\\83\\84.96094\\-84.41237\\83\\88.86719\\-85.67253\\83\\92.77344\\-86.60614\\83\\94.72656\\-87.39905\\83\\98.63281\\-88.3541\\83\\100.5859\\-89.31095\\83\\102.5391\\-90.05955\\83\\104.4922\\-91.1485\\83\\106.4453\\-92.08949\\83\\108.3984\\-93.25959\\83\\110.3516\\-94.14466\\83\\112.3047\\-95.4245\\83\\114.2578\\-96.59723\\83\\116.2109\\-98.10938\\83\\118.1641\\-99.76748\\83\\121.3686\\-102.6016\\83\\122.0703\\-103.3247\\83\\124.8328\\-106.5078\\83\\126.455\\-108.4609\\83\\127.9297\\-110.648\\83\\130.2108\\-114.3203\\83\\131.0974\\-116.2734\\83\\132.3636\\-118.2266\\83\\133.3174\\-120.1797\\83\\134.5009\\-122.1328\\83\\135.2505\\-124.0859\\83\\136.3294\\-126.0391\\83\\136.9034\\-127.9922\\83\\137.9191\\-129.9453\\83\\138.6719\\-131.8984\\83\\140.4286\\-135.8047\\83\\141.0651\\-137.7578\\83\\141.9635\\-139.7109\\83\\142.4888\\-141.6641\\83\\142.8643\\-143.6172\\83\\144.1767\\-147.5234\\83\\144.8895\\-151.4297\\83\\146.041\\-155.3359\\83\\146.9485\\-161.1953\\83\\147.7486\\-165.1016\\83\\148.179\\-169.0078\\83\\148.4898\\-174.8672\\83\\148.6123\\-178.7734\\83\\148.6709\\-182.6797\\83\\148.6832\\-188.5391\\83\\148.5204\\-194.3984\\83\\148.3566\\-198.3047\\83\\147.9399\\-204.1641\\83\\147.652\\-206.1172\\83\\147.2307\\-208.0703\\83\\146.2799\\-213.9297\\83\\145.9045\\-215.8828\\83\\145.1778\\-217.8359\\83\\144.6487\\-219.7891\\83\\144.2303\\-221.7422\\83\\143.4366\\-223.6953\\83\\142.0998\\-227.6016\\83\\139.6484\\-231.6966\\83\\137.6953\\-234.7602\\83\\137.162\\-235.4141\\83\\136.0652\\-237.3672\\83\\134.6071\\-239.3203\\83\\131.8359\\-242.4152\\83\\129.103\\-245.1797\\83\\126.9747\\-247.1328\\83\\124.0234\\-249.6129\\83\\120.1172\\-252.1937\\83\\118.1641\\-253.7324\\83\\116.2109\\-255.0186\\83\\114.2578\\-256.0931\\83\\112.3047\\-257.3209\\83\\110.3516\\-258.2511\\83\\108.3984\\-259.6222\\83\\102.5391\\-262.8769\\83\\100.5859\\-263.7806\\83\\96.67969\\-266.0151\\83\\94.72656\\-267.3706\\83\\92.4193\\-268.6172\\83\\86.91406\\-271.7522\\83\\84.96094\\-273.2004\\83\\79.50246\\-276.4297\\83\\77.14844\\-277.7255\\83\\75.19531\\-279.1718\\83\\73.24219\\-280.3596\\83\\71.28906\\-281.4108\\83\\69.33594\\-282.5628\\83\\67.38281\\-283.3863\\83\\65.42969\\-284.6237\\83\\63.47656\\-285.5384\\83\\61.52344\\-286.789\\83\\59.57031\\-287.5751\\83\\57.61719\\-288.6961\\83\\55.66406\\-289.2654\\83\\53.71094\\-290.2523\\83\\49.80469\\-291.9308\\83\\47.85156\\-292.8627\\83\\45.89844\\-293.5256\\83\\43.94531\\-294.4511\\83\\40.03906\\-295.3673\\83\\38.08594\\-296.1048\\83\\36.13281\\-296.7058\\83\\34.17969\\-297.0733\\83\\32.22656\\-297.5753\\83\\30.27344\\-298.3579\\83\\26.36719\\-299.11\\83\\22.46094\\-300.1377\\83\\20.50781\\-300.4277\\83\\16.60156\\-300.804\\83\\12.69531\\-301.0771\\83\\6.835938\\-301.3989\\83\\2.929688\\-301.5302\\83\\-0.9765625\\-301.569\\83\\-4.882813\\-301.4584\\83\\-10.74219\\-301.1462\\83\\-14.64844\\-300.8666\\83\\-20.50781\\-300.3165\\83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "270" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "168" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-300.0542\\85\\-24.41406\\-299.493\\85\\-26.36719\\-299.0973\\85\\-30.27344\\-298.4194\\85\\-32.22656\\-297.6822\\85\\-34.17969\\-297.1445\\85\\-36.13281\\-296.8193\\85\\-38.08594\\-296.3339\\85\\-40.03906\\-295.5262\\85\\-43.94531\\-294.6884\\85\\-45.8816\\-294.0078\\85\\-47.85156\\-293.1966\\85\\-49.80469\\-292.6244\\85\\-51.75781\\-291.6158\\85\\-53.71094\\-290.9713\\85\\-57.61719\\-289.3074\\85\\-59.57031\\-288.8264\\85\\-61.52344\\-287.8625\\85\\-63.47656\\-287.1173\\85\\-65.42969\\-286.2619\\85\\-67.38281\\-285.254\\85\\-69.33594\\-284.466\\85\\-71.28906\\-283.4458\\85\\-73.24219\\-282.8737\\85\\-75.19531\\-281.8409\\85\\-77.14844\\-281.2021\\85\\-79.10156\\-280.3592\\85\\-81.05469\\-279.4056\\85\\-83.00781\\-278.5572\\85\\-84.96094\\-277.5016\\85\\-86.91406\\-276.8718\\85\\-88.86719\\-275.8595\\85\\-90.82031\\-275.2812\\85\\-96.67969\\-272.576\\85\\-98.63281\\-271.5361\\85\\-102.5391\\-269.6423\\85\\-104.4922\\-268.7511\\85\\-108.0097\\-266.6641\\85\\-110.3516\\-265.2185\\85\\-112.3047\\-263.8339\\85\\-116.2109\\-261.3657\\85\\-118.1641\\-259.7667\\85\\-120.1172\\-258.0448\\85\\-121.6426\\-256.8984\\85\\-124.0234\\-254.7758\\85\\-127.7328\\-251.0391\\85\\-129.8828\\-248.7347\\85\\-131.0922\\-247.1328\\85\\-134.5048\\-243.2266\\85\\-135.9233\\-241.2734\\85\\-136.995\\-239.3203\\85\\-138.3836\\-237.3672\\85\\-140.6905\\-233.4609\\85\\-141.7605\\-231.5078\\85\\-142.5721\\-229.5547\\85\\-143.2559\\-227.6016\\85\\-144.2308\\-225.6484\\85\\-144.7754\\-223.6953\\85\\-145.7072\\-221.7422\\85\\-146.3867\\-219.7891\\85\\-146.9124\\-217.8359\\85\\-147.6772\\-215.8828\\85\\-148.1375\\-213.9297\\85\\-149.0815\\-208.0703\\85\\-149.5303\\-206.1172\\85\\-149.8756\\-204.1641\\85\\-150.2307\\-200.2578\\85\\-150.3798\\-196.3516\\85\\-150.472\\-192.4453\\85\\-150.4877\\-188.5391\\85\\-150.3688\\-182.6797\\85\\-150.1872\\-178.7734\\85\\-149.8518\\-174.8672\\85\\-149.1847\\-170.9609\\85\\-148.3846\\-165.1016\\85\\-147.7732\\-161.1953\\85\\-147.1332\\-159.2422\\85\\-146.2325\\-155.3359\\85\\-145.6432\\-153.3828\\85\\-144.8435\\-151.4297\\85\\-144.4279\\-149.4766\\85\\-143.8757\\-147.5234\\85\\-143.0369\\-145.5703\\85\\-142.1279\\-141.6641\\85\\-141.2604\\-139.7109\\85\\-139.8354\\-135.8047\\85\\-138.7716\\-133.8516\\85\\-138.0796\\-131.8984\\85\\-137.0889\\-129.9453\\85\\-136.5591\\-127.9922\\85\\-135.5794\\-126.0391\\85\\-134.7239\\-124.0859\\85\\-132.6231\\-120.1797\\85\\-131.368\\-118.2266\\85\\-130.5191\\-116.2734\\85\\-129.2657\\-114.3203\\85\\-128.216\\-112.3672\\85\\-125.9766\\-109.3265\\85\\-124.0234\\-107.0441\\85\\-121.6986\\-104.5547\\85\\-120.1172\\-103.0831\\85\\-118.1641\\-101.4283\\85\\-116.2109\\-99.95089\\85\\-114.2578\\-98.57324\\85\\-110.3516\\-96.05793\\85\\-106.4453\\-93.96178\\85\\-104.4922\\-93.19304\\85\\-102.5391\\-92.04282\\85\\-100.5859\\-91.11137\\85\\-98.63281\\-89.97921\\85\\-94.72656\\-88.10631\\85\\-92.77344\\-87.53362\\85\\-90.82031\\-86.67446\\85\\-86.91406\\-85.59464\\85\\-83.00781\\-84.35938\\85\\-79.10156\\-83.57414\\85\\-75.19531\\-82.66507\\85\\-73.24219\\-82.39232\\85\\-69.33594\\-82.00777\\85\\-63.47656\\-81.56738\\85\\-57.61719\\-81.20524\\85\\-55.66406\\-81.12547\\85\\-49.80469\\-81.18923\\85\\-45.89844\\-81.56626\\85\\-36.13281\\-82.34716\\85\\-32.22656\\-82.57875\\85\\-30.27344\\-82.62216\\85\\-26.36719\\-82.58203\\85\\-20.50781\\-82.40085\\85\\-4.882813\\-82.27075\\85\\0.9765625\\-82.39661\\85\\12.69531\\-81.80463\\85\\16.60156\\-81.58839\\85\\18.55469\\-81.34018\\85\\22.46094\\-81.18983\\85\\28.32031\\-81.2204\\85\\32.22656\\-81.27995\\85\\40.03906\\-81.0765\\85\\47.85156\\-81.06116\\85\\53.71094\\-81.23438\\85\\59.57031\\-81.51479\\85\\69.33594\\-82.08205\\85\\73.24219\\-82.40085\\85\\75.19531\\-82.68642\\85\\79.10156\\-83.59902\\85\\81.05469\\-83.90179\\85\\84.96094\\-84.77251\\85\\86.91406\\-85.48938\\85\\90.82031\\-86.35947\\85\\94.72656\\-87.69188\\85\\96.67969\\-88.09351\\85\\98.63281\\-88.72686\\85\\100.5859\\-89.66355\\85\\102.5391\\-90.38217\\85\\104.4922\\-91.56888\\85\\106.4453\\-92.44659\\85\\108.3984\\-93.62102\\85\\110.3516\\-94.52203\\85\\113.7376\\-96.74219\\85\\118.1641\\-100.1232\\85\\120.9925\\-102.6016\\85\\122.8966\\-104.5547\\85\\126.0447\\-108.4609\\85\\128.7748\\-112.3672\\85\\130.8884\\-116.2734\\85\\132.0818\\-118.2266\\85\\133.0717\\-120.1797\\85\\134.2929\\-122.1328\\85\\135.0598\\-124.0859\\85\\136.1172\\-126.0391\\85\\136.7655\\-127.9922\\85\\137.5504\\-129.9453\\85\\138.4943\\-131.8984\\85\\139.1982\\-133.8516\\85\\140.2278\\-135.8047\\85\\140.839\\-137.7578\\85\\141.6406\\-139.7109\\85\\142.3157\\-141.6641\\85\\143.1489\\-145.5703\\85\\143.8893\\-147.5234\\85\\144.3455\\-149.4766\\85\\144.652\\-151.4297\\85\\145.0703\\-153.3828\\85\\145.6948\\-155.3359\\85\\146.1025\\-157.2891\\85\\146.6533\\-161.1953\\85\\147.6772\\-167.0547\\85\\147.915\\-169.0078\\85\\148.2776\\-174.8672\\85\\148.4433\\-180.7266\\85\\148.4666\\-186.5859\\85\\148.3503\\-192.4453\\85\\148.1061\\-198.3047\\85\\147.7843\\-202.2109\\85\\147.4988\\-204.1641\\85\\146.8155\\-208.0703\\85\\146.3022\\-211.9766\\85\\145.9635\\-213.9297\\85\\144.7991\\-217.8359\\85\\144.3864\\-219.7891\\85\\143.8642\\-221.7422\\85\\143.0107\\-223.6953\\85\\142.4877\\-225.6484\\85\\141.6409\\-227.6016\\85\\140.5611\\-229.5547\\85\\139.2327\\-231.5078\\85\\138.1718\\-233.4609\\85\\136.807\\-235.4141\\85\\135.7422\\-237.0811\\85\\134.1384\\-239.3203\\85\\131.8359\\-241.9269\\85\\128.6029\\-245.1797\\85\\125.9766\\-247.5137\\85\\123.9926\\-249.0859\\85\\122.0703\\-250.363\\85\\121.251\\-251.0391\\85\\118.4043\\-252.9922\\85\\114.2578\\-255.7559\\85\\112.3047\\-256.7188\\85\\110.3516\\-257.8689\\85\\108.3984\\-259.1659\\85\\106.4453\\-260.1804\\85\\104.4922\\-261.4793\\85\\102.5391\\-262.4127\\85\\100.5859\\-263.5617\\85\\98.63281\\-264.5202\\85\\96.67969\\-265.78\\85\\94.72656\\-267.1584\\85\\92.77344\\-268.1721\\85\\90.82031\\-269.4196\\85\\88.86719\\-270.4815\\85\\86.91406\\-271.6572\\85\\84.96094\\-273.1353\\85\\82.79639\\-274.4766\\85\\79.49829\\-276.4297\\85\\77.14844\\-277.7465\\85\\75.19531\\-279.2112\\85\\73.24219\\-280.4495\\85\\71.28906\\-281.4547\\85\\69.33594\\-282.6641\\85\\67.38281\\-283.4644\\85\\65.42969\\-284.7397\\85\\63.47656\\-285.6632\\85\\61.52344\\-286.8913\\85\\59.57031\\-287.7137\\85\\57.61719\\-288.8058\\85\\55.66406\\-289.3472\\85\\53.71094\\-290.4678\\85\\51.75781\\-291.1849\\85\\49.80469\\-292.2163\\85\\45.89844\\-293.6845\\85\\43.94531\\-294.5703\\85\\40.03906\\-295.4661\\85\\38.08594\\-296.2748\\85\\36.13281\\-296.7852\\85\\34.17969\\-297.1575\\85\\32.22656\\-297.7599\\85\\30.27344\\-298.4837\\85\\26.36719\\-299.2033\\85\\22.46094\\-300.224\\85\\20.50781\\-300.4938\\85\\16.60156\\-300.8438\\85\\10.74219\\-301.2409\\85\\6.835938\\-301.4584\\85\\2.929688\\-301.5944\\85\\-0.9765625\\-301.6489\\85\\-6.835938\\-301.4337\\85\\-10.74219\\-301.21\\85\\-16.60156\\-300.7484\\85\\-20.50781\\-300.3759\\85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "267" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "169" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-300.1377\\87\\-24.41406\\-299.6009\\87\\-26.36719\\-299.1719\\87\\-30.27344\\-298.4989\\87\\-34.17969\\-297.2244\\87\\-38.08594\\-296.4428\\87\\-40.03906\\-295.6216\\87\\-43.94531\\-294.7476\\87\\-45.89844\\-294.1196\\87\\-47.85156\\-293.2635\\87\\-49.80469\\-292.6795\\87\\-51.75781\\-291.6885\\87\\-55.66406\\-290.2655\\87\\-57.61719\\-289.3381\\87\\-59.57031\\-288.8389\\87\\-61.52344\\-287.8866\\87\\-63.47656\\-287.1064\\87\\-65.42969\\-286.218\\87\\-67.38281\\-285.2238\\87\\-69.33594\\-284.3776\\87\\-71.28906\\-283.3993\\87\\-73.24219\\-282.7971\\87\\-75.19531\\-281.7135\\87\\-77.14844\\-281.0903\\87\\-79.10156\\-280.1057\\87\\-81.05469\\-279.2354\\87\\-83.00781\\-278.1831\\87\\-86.91406\\-276.515\\87\\-88.86719\\-275.623\\87\\-90.82031\\-275.0169\\87\\-92.77344\\-273.9456\\87\\-94.72656\\-273.18\\87\\-96.67969\\-272.0164\\87\\-98.63281\\-271.196\\87\\-100.5859\\-270.0206\\87\\-102.5391\\-269.3512\\87\\-104.4922\\-268.1764\\87\\-106.4453\\-267.2317\\87\\-108.3984\\-265.8463\\87\\-110.3516\\-264.6051\\87\\-112.3047\\-263.4805\\87\\-114.2578\\-262.0696\\87\\-116.2009\\-260.8047\\87\\-118.1641\\-259.3156\\87\\-118.6382\\-258.8516\\87\\-121.0861\\-256.8984\\87\\-124.0234\\-254.2129\\87\\-125.126\\-252.9922\\87\\-127.1605\\-251.0391\\87\\-129.8828\\-248.2016\\87\\-130.7055\\-247.1328\\87\\-134.0714\\-243.2266\\87\\-135.7422\\-240.7852\\87\\-137.989\\-237.3672\\87\\-139.0118\\-235.4141\\87\\-140.3531\\-233.4609\\87\\-141.2495\\-231.5078\\87\\-142.3135\\-229.5547\\87\\-142.8805\\-227.6016\\87\\-143.8546\\-225.6484\\87\\-145.1643\\-221.7422\\87\\-146.0938\\-219.7891\\87\\-146.5971\\-217.8359\\87\\-147.8657\\-213.9297\\87\\-148.2641\\-211.9766\\87\\-148.7949\\-208.0703\\87\\-149.5\\-204.1641\\87\\-149.9949\\-200.2578\\87\\-150.2125\\-196.3516\\87\\-150.2963\\-192.4453\\87\\-150.3074\\-188.5391\\87\\-150.173\\-182.6797\\87\\-149.9221\\-178.7734\\87\\-149.7206\\-176.8203\\87\\-148.8701\\-170.9609\\87\\-148.2081\\-165.1016\\87\\-147.8758\\-163.1484\\87\\-147.4609\\-161.3348\\87\\-146.8622\\-159.2422\\87\\-146.041\\-155.3359\\87\\-145.2884\\-153.3828\\87\\-144.6896\\-151.4297\\87\\-144.2803\\-149.4766\\87\\-142.9099\\-145.5703\\87\\-142.4953\\-143.6172\\87\\-141.9585\\-141.6641\\87\\-141.0496\\-139.7109\\87\\-140.4202\\-137.7578\\87\\-138.631\\-133.8516\\87\\-137.8569\\-131.8984\\87\\-136.9371\\-129.9453\\87\\-136.3867\\-127.9922\\87\\-135.3277\\-126.0391\\87\\-134.5305\\-124.0859\\87\\-133.3971\\-122.1328\\87\\-132.4219\\-120.1797\\87\\-131.1455\\-118.2266\\87\\-130.3161\\-116.2734\\87\\-127.9297\\-112.4415\\87\\-125.9766\\-109.7004\\87\\-124.0234\\-107.3505\\87\\-121.3718\\-104.5547\\87\\-118.1641\\-101.7047\\87\\-116.2109\\-100.2535\\87\\-110.3516\\-96.34725\\87\\-108.3984\\-95.38151\\87\\-106.4453\\-94.18452\\87\\-104.4922\\-93.48914\\87\\-102.5391\\-92.30379\\87\\-100.5859\\-91.50896\\87\\-98.63281\\-90.27687\\87\\-96.67969\\-89.51686\\87\\-94.72656\\-88.39258\\87\\-92.77344\\-87.81451\\87\\-88.86719\\-86.37978\\87\\-84.96094\\-85.46256\\87\\-83.00781\\-84.76257\\87\\-81.05469\\-84.27181\\87\\-77.14844\\-83.57738\\87\\-73.24219\\-82.77037\\87\\-71.28906\\-82.47672\\87\\-69.33594\\-82.28535\\87\\-65.42969\\-82.02661\\87\\-61.52344\\-81.83376\\87\\-55.66406\\-81.61572\\87\\-49.80469\\-81.62582\\87\\-45.89844\\-81.92028\\87\\-40.03906\\-82.25344\\87\\-34.17969\\-82.71456\\87\\-32.22656\\-82.80848\\87\\-28.32031\\-82.78635\\87\\-22.46094\\-82.53352\\87\\-20.50781\\-82.48948\\87\\-14.64844\\-82.50391\\87\\-8.789063\\-82.45521\\87\\-4.882813\\-82.50391\\87\\-0.9765625\\-82.74247\\87\\0.9765625\\-82.78017\\87\\2.929688\\-82.68105\\87\\4.882813\\-82.45248\\87\\10.74219\\-82.08147\\87\\16.60156\\-81.78303\\87\\20.50781\\-81.52055\\87\\26.36719\\-81.38011\\87\\32.22656\\-81.54269\\87\\38.08594\\-81.50639\\87\\45.89844\\-81.49498\\87\\53.71094\\-81.60883\\87\\65.42969\\-82.0761\\87\\71.28906\\-82.45057\\87\\73.24219\\-82.71957\\87\\77.14844\\-83.54591\\87\\81.05469\\-84.15977\\87\\83.00781\\-84.62421\\87\\84.96094\\-85.28339\\87\\86.91406\\-85.78549\\87\\88.86719\\-86.16741\\87\\90.82031\\-86.67662\\87\\92.77344\\-87.4445\\87\\96.67969\\-88.33218\\87\\98.63281\\-89.25291\\87\\100.5859\\-89.96021\\87\\102.572\\-90.88281\\87\\110.045\\-94.78906\\87\\112.3047\\-96.10644\\87\\114.2578\\-97.56557\\87\\116.2109\\-99.19478\\87\\118.1641\\-100.6399\\87\\120.1172\\-102.2182\\87\\122.4685\\-104.5547\\87\\125.9766\\-108.9413\\87\\128.5077\\-112.3672\\87\\131.8359\\-118.4159\\87\\134.0176\\-122.1328\\87\\134.8709\\-124.0859\\87\\135.8446\\-126.0391\\87\\136.6283\\-127.9922\\87\\137.2369\\-129.9453\\87\\138.2915\\-131.8984\\87\\138.9327\\-133.8516\\87\\139.9524\\-135.8047\\87\\141.2495\\-139.7109\\87\\142.0866\\-141.6641\\87\\142.8931\\-145.5703\\87\\144.1033\\-149.4766\\87\\144.7672\\-153.3828\\87\\145.2026\\-155.3359\\87\\145.7784\\-157.2891\\87\\146.1283\\-159.2422\\87\\146.9105\\-165.1016\\87\\147.528\\-169.0078\\87\\147.9179\\-172.9141\\87\\148.0504\\-174.8672\\87\\148.2179\\-180.7266\\87\\148.2108\\-188.5391\\87\\148.0336\\-194.3984\\87\\147.9274\\-196.3516\\87\\147.5423\\-200.2578\\87\\146.9757\\-204.1641\\87\\146.2736\\-210.0234\\87\\145.9815\\-211.9766\\87\\144.8938\\-215.8828\\87\\144.1101\\-219.7891\\87\\143.3253\\-221.7422\\87\\142.2167\\-225.6484\\87\\141.1197\\-227.6016\\87\\140.2074\\-229.5547\\87\\138.8318\\-231.5078\\87\\136.4859\\-235.4141\\87\\133.7891\\-238.966\\87\\131.8359\\-241.2646\\87\\129.8828\\-243.32\\87\\127.9561\\-245.1797\\87\\124.0234\\-248.4834\\87\\122.0703\\-249.972\\87\\120.1172\\-251.3513\\87\\118.1641\\-252.5514\\87\\114.2578\\-255.3402\\87\\112.3047\\-256.2584\\87\\110.3516\\-257.5169\\87\\108.3984\\-258.5236\\87\\107.9839\\-258.8516\\87\\104.8664\\-260.8047\\87\\104.4922\\-261.1035\\87\\102.5391\\-262.0612\\87\\100.5859\\-263.328\\87\\98.63281\\-264.1959\\87\\97.97894\\-264.7109\\87\\94.72656\\-266.9249\\87\\92.77344\\-268.01\\87\\90.82031\\-269.3257\\87\\88.86719\\-270.3224\\87\\86.91406\\-271.5848\\87\\84.96094\\-273.0878\\87\\79.10156\\-276.7623\\87\\77.14844\\-277.8072\\87\\76.45313\\-278.3828\\87\\73.24219\\-280.5457\\87\\71.28906\\-281.5191\\87\\69.33594\\-282.7466\\87\\67.38281\\-283.5532\\87\\65.42969\\-284.8436\\87\\63.47656\\-285.8141\\87\\61.52344\\-286.9967\\87\\59.57031\\-287.8684\\87\\57.61719\\-288.9135\\87\\55.66406\\-289.4565\\87\\53.71094\\-290.6252\\87\\51.75781\\-291.3022\\87\\49.80469\\-292.4115\\87\\47.85156\\-293.0866\\87\\43.94531\\-294.669\\87\\40.03906\\-295.5608\\87\\38.08594\\-296.4201\\87\\34.17969\\-297.25\\87\\30.27344\\-298.5668\\87\\26.36719\\-299.3067\\87\\22.46094\\-300.2979\\87\\18.55469\\-300.721\\87\\10.74219\\-301.299\\87\\6.835938\\-301.5302\\87\\0.9765625\\-301.735\\87\\-2.929688\\-301.6906\\87\\-6.835938\\-301.5064\\87\\-10.74219\\-301.2669\\87\\-16.60156\\-300.7986\\87\\-20.50781\\-300.4359\\87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "275" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "170" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.9765625\\-301.8441\\89\\-4.882813\\-301.705\\89\\-10.74219\\-301.3254\\89\\-14.64844\\-301.0186\\89\\-20.50781\\-300.4897\\89\\-22.46094\\-300.224\\89\\-26.36719\\-299.2667\\89\\-30.27344\\-298.5804\\89\\-32.22656\\-298.0226\\89\\-34.17969\\-297.3189\\89\\-38.08594\\-296.5577\\89\\-40.03906\\-295.7746\\89\\-41.99219\\-295.2149\\89\\-43.94531\\-294.8138\\89\\-45.89844\\-294.2537\\89\\-47.85156\\-293.3475\\89\\-49.80469\\-292.7552\\89\\-51.75781\\-291.7902\\89\\-55.66406\\-290.3525\\89\\-57.61719\\-289.3647\\89\\-59.57031\\-288.8716\\89\\-61.52344\\-287.9258\\89\\-63.47656\\-287.1167\\89\\-67.38281\\-285.2137\\89\\-71.28906\\-283.3644\\89\\-73.24219\\-282.7086\\89\\-75.19531\\-281.6318\\89\\-77.14844\\-280.981\\89\\-79.10156\\-279.8886\\89\\-81.05469\\-279.0743\\89\\-83.00781\\-277.9107\\89\\-84.96094\\-277.1577\\89\\-86.91406\\-276.1331\\89\\-90.82031\\-274.6763\\89\\-92.77344\\-273.6152\\89\\-94.72656\\-272.7709\\89\\-96.67969\\-271.6352\\89\\-98.63281\\-270.7379\\89\\-100.5859\\-269.7003\\89\\-102.5391\\-268.9834\\89\\-103.0525\\-268.6172\\89\\-106.4347\\-266.6641\\89\\-109.5133\\-264.7109\\89\\-110.3516\\-264.0576\\89\\-112.3047\\-263.0096\\89\\-114.2578\\-261.7182\\89\\-118.1641\\-258.6406\\89\\-120.1172\\-257.231\\89\\-122.0703\\-255.608\\89\\-124.0234\\-253.7194\\89\\-124.6564\\-252.9922\\89\\-126.6972\\-251.0391\\89\\-128.6303\\-249.0859\\89\\-130.3779\\-247.1328\\89\\-131.8359\\-245.2413\\89\\-133.7891\\-242.8411\\89\\-136.3866\\-239.3203\\89\\-137.4283\\-237.3672\\89\\-139.9227\\-233.4609\\89\\-140.849\\-231.5078\\89\\-141.9599\\-229.5547\\89\\-143.3218\\-225.6484\\89\\-144.2423\\-223.6953\\89\\-144.7939\\-221.7422\\89\\-145.6835\\-219.7891\\89\\-146.3092\\-217.8359\\89\\-146.8042\\-215.8828\\89\\-148.0076\\-211.9766\\89\\-148.3271\\-210.0234\\89\\-149.0532\\-204.1641\\89\\-149.6302\\-200.2578\\89\\-149.9602\\-196.3516\\89\\-150.0916\\-192.4453\\89\\-150.0873\\-188.5391\\89\\-149.9821\\-184.6328\\89\\-149.7348\\-180.7266\\89\\-149.0221\\-174.8672\\89\\-148.4726\\-169.0078\\89\\-148.0008\\-165.1016\\89\\-147.5974\\-163.1484\\89\\-147.0588\\-161.1953\\89\\-146.2634\\-157.2891\\89\\-145.7784\\-155.3359\\89\\-145.0195\\-153.3828\\89\\-144.1239\\-149.4766\\89\\-143.3519\\-147.5234\\89\\-142.7844\\-145.5703\\89\\-142.3816\\-143.6172\\89\\-141.7558\\-141.6641\\89\\-140.8734\\-139.7109\\89\\-140.2794\\-137.7578\\89\\-139.2263\\-135.8047\\89\\-138.5065\\-133.8516\\89\\-137.5492\\-131.8984\\89\\-136.7772\\-129.9453\\89\\-136.1677\\-127.9922\\89\\-135.1061\\-126.0391\\89\\-134.3515\\-124.0859\\89\\-133.1648\\-122.1328\\89\\-132.2253\\-120.1797\\89\\-130.9606\\-118.2266\\89\\-130.0456\\-116.2734\\89\\-128.875\\-114.3203\\89\\-126.2139\\-110.4141\\89\\-124.0234\\-107.7067\\89\\-122.9626\\-106.5078\\89\\-121.008\\-104.5547\\89\\-118.1641\\-102.0074\\89\\-116.2109\\-100.6234\\89\\-114.2578\\-99.3624\\89\\-113.3807\\-98.69531\\89\\-110.3516\\-96.68569\\89\\-108.3984\\-95.62347\\89\\-106.4453\\-94.44135\\89\\-104.4922\\-93.68104\\89\\-102.5391\\-92.6365\\89\\-100.5859\\-91.79671\\89\\-98.63281\\-90.66344\\89\\-96.67969\\-89.82629\\89\\-94.72656\\-88.80762\\89\\-92.77344\\-88.04021\\89\\-90.82031\\-87.57186\\89\\-88.86719\\-86.73785\\89\\-86.91406\\-86.17601\\89\\-84.96094\\-85.79198\\89\\-83.00781\\-85.30144\\89\\-81.05469\\-84.66431\\89\\-79.10156\\-84.22289\\89\\-73.24219\\-83.31445\\89\\-71.28906\\-82.90144\\89\\-69.33594\\-82.61502\\89\\-65.42969\\-82.30737\\89\\-59.57031\\-82.0331\\89\\-53.71094\\-81.93725\\89\\-49.80469\\-81.96774\\89\\-43.94531\\-82.23591\\89\\-40.03906\\-82.48566\\89\\-34.17969\\-83.00165\\89\\-32.22656\\-83.07813\\89\\-30.27344\\-83.0476\\89\\-22.46094\\-82.68375\\89\\-18.55469\\-82.6623\\89\\-16.60156\\-82.71456\\89\\-8.789063\\-82.7401\\89\\-4.882813\\-82.91256\\89\\-0.9765625\\-83.33405\\89\\0.9765625\\-83.4073\\89\\2.929688\\-83.27007\\89\\6.835938\\-82.67826\\89\\8.789063\\-82.45667\\89\\12.69531\\-82.13647\\89\\18.55469\\-81.83376\\89\\26.36719\\-81.61225\\89\\28.32031\\-81.69662\\89\\34.17969\\-81.79953\\89\\40.03906\\-81.79518\\89\\51.75781\\-81.88493\\89\\55.66406\\-81.93798\\89\\65.42969\\-82.28062\\89\\67.38281\\-82.40897\\89\\71.28906\\-82.80657\\89\\75.19531\\-83.58659\\89\\79.10156\\-84.13515\\89\\81.05469\\-84.49807\\89\\84.96094\\-85.64053\\89\\88.86719\\-86.45119\\89\\90.82031\\-87.13932\\89\\92.77344\\-87.7292\\89\\94.72656\\-88.11282\\89\\96.67969\\-88.70034\\89\\98.63281\\-89.62638\\89\\100.5859\\-90.25259\\89\\102.5391\\-91.39982\\89\\104.4922\\-92.20647\\89\\106.4453\\-93.39111\\89\\108.3984\\-94.16222\\89\\110.3516\\-95.40113\\89\\112.3047\\-96.52764\\89\\115.2182\\-98.69531\\89\\120.1172\\-102.7683\\89\\121.875\\-104.5547\\89\\124.0234\\-107.0003\\89\\125.9766\\-109.3688\\89\\128.1626\\-112.3672\\89\\129.243\\-114.3203\\89\\130.5106\\-116.2734\\89\\131.3712\\-118.2266\\89\\132.6319\\-120.1797\\89\\134.6866\\-124.0859\\89\\135.5128\\-126.0391\\89\\136.4588\\-127.9922\\89\\137.0099\\-129.9453\\89\\138.0251\\-131.8984\\89\\138.6976\\-133.8516\\89\\140.3835\\-137.7578\\89\\140.9486\\-139.7109\\89\\141.7569\\-141.6641\\89\\142.343\\-143.6172\\89\\143.0697\\-147.5234\\89\\143.7515\\-149.4766\\89\\144.2303\\-151.4297\\89\\144.8474\\-155.3359\\89\\145.2516\\-157.2891\\89\\145.7896\\-159.2422\\89\\146.1317\\-161.1953\\89\\147.528\\-172.9141\\89\\147.832\\-176.8203\\89\\147.9492\\-180.7266\\89\\147.9616\\-184.6328\\89\\147.9179\\-188.5391\\89\\147.6632\\-194.3984\\89\\146.2061\\-208.0703\\89\\145.9358\\-210.0234\\89\\144.9421\\-213.9297\\89\\144.2603\\-217.8359\\89\\143.6546\\-219.7891\\89\\142.9396\\-221.7422\\89\\142.4988\\-223.6953\\89\\141.8275\\-225.6484\\89\\139.6866\\-229.5547\\89\\138.4938\\-231.5078\\89\\137.1173\\-233.4609\\89\\136.0899\\-235.4141\\89\\134.6214\\-237.3672\\89\\131.8359\\-240.5906\\89\\129.8828\\-242.7031\\89\\127.2714\\-245.1797\\89\\124.0234\\-248.0378\\89\\122.0703\\-249.592\\89\\120.1172\\-250.682\\89\\118.1641\\-252.0811\\89\\116.2109\\-253.5858\\89\\114.2578\\-254.7048\\89\\112.3047\\-255.9409\\89\\110.3516\\-257.0739\\89\\108.3984\\-258.0913\\89\\106.4453\\-259.4687\\89\\100.9663\\-262.7578\\89\\98.63281\\-263.9785\\89\\96.67969\\-265.4076\\89\\92.77344\\-267.8954\\89\\90.82031\\-269.235\\89\\88.86719\\-270.2424\\89\\86.91406\\-271.5631\\89\\84.96094\\-273.0695\\89\\82.81653\\-274.4766\\89\\77.14844\\-277.9116\\89\\76.5822\\-278.3828\\89\\73.24219\\-280.6592\\89\\71.28906\\-281.6145\\89\\69.33594\\-282.8462\\89\\67.38281\\-283.66\\89\\65.42969\\-284.9561\\89\\63.47656\\-285.9727\\89\\61.52344\\-287.1078\\89\\57.61719\\-289.0037\\89\\55.66406\\-289.6133\\89\\53.71094\\-290.7654\\89\\51.75781\\-291.44\\89\\49.80469\\-292.5684\\89\\47.85156\\-293.2088\\89\\45.89844\\-294.0765\\89\\43.94531\\-294.7713\\89\\41.99219\\-295.1785\\89\\40.03906\\-295.7078\\89\\38.08594\\-296.5372\\89\\34.17969\\-297.3603\\89\\32.22656\\-298.1378\\89\\30.27344\\-298.6626\\89\\26.36719\\-299.4094\\89\\24.41406\\-299.9619\\89\\22.46094\\-300.3759\\89\\18.55469\\-300.7656\\89\\10.74219\\-301.3619\\89\\2.929688\\-301.8123\\89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "262" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "171" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.882813\\-301.8123\\91\\-12.69531\\-301.2539\\91\\-20.50781\\-300.5575\\91\\-22.46094\\-300.3165\\91\\-24.41406\\-299.9194\\91\\-26.36719\\-299.391\\91\\-30.27344\\-298.6626\\91\\-32.22656\\-298.1959\\91\\-34.17969\\-297.4411\\91\\-38.08594\\-296.6405\\91\\-41.99219\\-295.2872\\91\\-43.94531\\-294.8961\\91\\-45.89844\\-294.3732\\91\\-47.85156\\-293.444\\91\\-49.80469\\-292.839\\91\\-51.75781\\-291.9039\\91\\-53.71094\\-291.1123\\91\\-55.66406\\-290.4421\\91\\-57.61719\\-289.404\\91\\-59.57031\\-288.9114\\91\\-65.42969\\-286.2479\\91\\-67.38281\\-285.2137\\91\\-69.33594\\-284.323\\91\\-71.28906\\-283.3296\\91\\-73.24219\\-282.6122\\91\\-75.19531\\-281.5673\\91\\-77.14844\\-280.8771\\91\\-79.10156\\-279.7219\\91\\-81.05469\\-278.9108\\91\\-83.00781\\-277.7022\\91\\-84.96094\\-276.9652\\91\\-86.91406\\-275.8726\\91\\-88.86719\\-275.2663\\91\\-92.77344\\-273.3363\\91\\-94.72656\\-272.2069\\91\\-96.67969\\-271.3305\\91\\-98.63281\\-270.1588\\91\\-100.5859\\-269.4603\\91\\-104.4922\\-267.398\\91\\-106.4453\\-266.0393\\91\\-108.3984\\-264.9986\\91\\-112.3047\\-262.3744\\91\\-114.2578\\-261.2829\\91\\-116.2109\\-259.7457\\91\\-120.1172\\-256.5387\\91\\-122.0703\\-255.0999\\91\\-125.9766\\-251.2005\\91\\-128.1494\\-249.0859\\91\\-131.2849\\-245.1797\\91\\-134.6071\\-241.2734\\91\\-135.9359\\-239.3203\\91\\-136.9978\\-237.3672\\91\\-138.3057\\-235.4141\\91\\-139.2831\\-233.4609\\91\\-140.5022\\-231.5078\\91\\-142.3693\\-227.6016\\91\\-142.9274\\-225.6484\\91\\-143.8779\\-223.6953\\91\\-145.0977\\-219.7891\\91\\-145.9811\\-217.8359\\91\\-146.988\\-213.9297\\91\\-147.6391\\-211.9766\\91\\-148.0614\\-210.0234\\91\\-148.345\\-208.0703\\91\\-149.1464\\-200.2578\\91\\-149.573\\-196.3516\\91\\-149.7838\\-192.4453\\91\\-149.7583\\-188.5391\\91\\-149.6019\\-184.6328\\91\\-149.0583\\-178.7734\\91\\-148.2641\\-169.0078\\91\\-147.7254\\-165.1016\\91\\-146.7823\\-161.1953\\91\\-146.0522\\-157.2891\\91\\-144.8103\\-153.3828\\91\\-144.4105\\-151.4297\\91\\-143.9116\\-149.4766\\91\\-143.1245\\-147.5234\\91\\-142.2546\\-143.6172\\91\\-140.7162\\-139.7109\\91\\-140.1217\\-137.7578\\91\\-139.0106\\-135.8047\\91\\-138.3805\\-133.8516\\91\\-137.3005\\-131.8984\\91\\-135.9882\\-127.9922\\91\\-134.9696\\-126.0391\\91\\-134.1836\\-124.0859\\91\\-132.9695\\-122.1328\\91\\-131.9598\\-120.1797\\91\\-129.7059\\-116.2734\\91\\-128.6814\\-114.3203\\91\\-124.3136\\-108.4609\\91\\-122.6273\\-106.5078\\91\\-120.6192\\-104.5547\\91\\-118.1641\\-102.3786\\91\\-115.767\\-100.6484\\91\\-114.2578\\-99.70872\\91\\-112.3047\\-98.28448\\91\\-108.3984\\-95.86267\\91\\-104.4922\\-93.8747\\91\\-102.5391\\-93.08383\\91\\-100.5859\\-92.04539\\91\\-98.63281\\-91.19012\\91\\-96.67969\\-90.10042\\91\\-94.72656\\-89.32705\\91\\-92.77344\\-88.27644\\91\\-90.82031\\-87.82872\\91\\-88.86719\\-87.23949\\91\\-86.91406\\-86.48828\\91\\-83.00781\\-85.69672\\91\\-81.05469\\-85.2098\\91\\-79.10156\\-84.58588\\91\\-77.14844\\-84.2389\\91\\-71.28906\\-83.45962\\91\\-67.38281\\-82.84606\\91\\-63.47656\\-82.49326\\91\\-59.57031\\-82.29998\\91\\-53.71094\\-82.17973\\91\\-49.80469\\-82.23236\\91\\-43.94531\\-82.49235\\91\\-41.99219\\-82.63554\\91\\-36.13281\\-83.16797\\91\\-32.22656\\-83.28811\\91\\-22.46094\\-82.90394\\91\\-18.55469\\-82.91727\\91\\-16.60156\\-83.03156\\91\\-10.74219\\-83.06244\\91\\-4.882813\\-83.46495\\91\\-2.929688\\-83.66235\\91\\0.9765625\\-83.85041\\91\\4.882813\\-83.54876\\91\\8.789063\\-82.87807\\91\\12.69531\\-82.32537\\91\\16.60156\\-82.05736\\91\\22.46094\\-81.84961\\91\\26.36719\\-81.81205\\91\\30.27344\\-81.84034\\91\\34.17969\\-81.94996\\91\\40.03906\\-81.95844\\91\\55.66406\\-82.15223\\91\\63.47656\\-82.42553\\91\\67.38281\\-82.74709\\91\\73.24219\\-83.64791\\91\\77.14844\\-84.14883\\91\\79.10156\\-84.46117\\91\\83.00781\\-85.56116\\91\\86.91406\\-86.30446\\91\\88.86719\\-86.83383\\91\\90.82031\\-87.52795\\91\\94.72656\\-88.3763\\91\\96.67969\\-89.21568\\91\\100.5859\\-90.66811\\91\\102.5391\\-91.76286\\91\\104.4922\\-92.58326\\91\\106.4453\\-93.68966\\91\\108.3984\\-94.5241\\91\\111.8503\\-96.74219\\91\\114.2578\\-98.40234\\91\\118.1641\\-101.5021\\91\\120.1172\\-103.2363\\91\\121.445\\-104.5547\\91\\124.0234\\-107.3933\\91\\126.421\\-110.4141\\91\\127.9297\\-112.6591\\91\\130.2464\\-116.2734\\91\\131.1051\\-118.2266\\91\\132.4086\\-120.1797\\91\\133.3307\\-122.1328\\91\\134.4883\\-124.0859\\91\\135.2209\\-126.0391\\91\\136.2508\\-127.9922\\91\\136.8343\\-129.9453\\91\\138.4797\\-133.8516\\91\\139.1304\\-135.8047\\91\\140.1034\\-137.7578\\91\\141.3196\\-141.6641\\91\\142.0963\\-143.6172\\91\\142.8162\\-147.5234\\91\\143.2482\\-149.4766\\91\\143.9006\\-151.4297\\91\\144.3021\\-153.3828\\91\\144.8702\\-157.2891\\91\\145.2516\\-159.2422\\91\\145.7784\\-161.1953\\91\\146.3225\\-165.1016\\91\\146.8727\\-170.9609\\91\\147.35\\-176.8203\\91\\147.5285\\-180.7266\\91\\147.5429\\-184.6328\\91\\147.4532\\-188.5391\\91\\147.1136\\-194.3984\\91\\146.5046\\-202.2109\\91\\146.1168\\-206.1172\\91\\145.8543\\-208.0703\\91\\144.9746\\-211.9766\\91\\144.3478\\-215.8828\\91\\143.9006\\-217.8359\\91\\143.1381\\-219.7891\\91\\142.2119\\-223.6953\\91\\140.4153\\-227.6016\\91\\139.0931\\-229.5547\\91\\138.0951\\-231.5078\\91\\136.7679\\-233.4609\\91\\135.7422\\-235.1776\\91\\134.1812\\-237.3672\\91\\132.4764\\-239.3203\\91\\129.8828\\-242.1777\\91\\126.7108\\-245.1797\\91\\124.0234\\-247.5596\\91\\121.9991\\-249.0859\\91\\120.1172\\-250.2367\\91\\118.1641\\-251.6838\\91\\116.2109\\-253.0156\\91\\114.2578\\-254.2345\\91\\112.3047\\-255.603\\91\\110.3516\\-256.5481\\91\\106.4453\\-259.0583\\91\\104.4922\\-260.1896\\91\\102.5391\\-261.5747\\91\\98.63281\\-263.8326\\91\\96.67969\\-265.2305\\91\\91.55054\\-268.6172\\91\\90.82031\\-269.184\\91\\88.86719\\-270.2159\\91\\86.91406\\-271.5631\\91\\84.96094\\-273.0952\\91\\82.89591\\-274.4766\\91\\81.05469\\-275.5813\\91\\79.10156\\-276.9009\\91\\77.14844\\-278.031\\91\\76.73592\\-278.3828\\91\\73.7894\\-280.3359\\91\\73.24219\\-280.7648\\91\\71.28906\\-281.7205\\91\\69.33594\\-282.938\\91\\67.38281\\-283.7838\\91\\65.42969\\-285.0643\\91\\63.46628\\-286.1953\\91\\59.57031\\-288.2638\\91\\57.61719\\-289.0952\\91\\55.66406\\-289.8093\\91\\53.71094\\-290.8879\\91\\51.75781\\-291.6102\\91\\49.80469\\-292.7005\\91\\47.85156\\-293.3364\\91\\45.89844\\-294.2659\\91\\43.94531\\-294.8608\\91\\41.99219\\-295.2625\\91\\38.08594\\-296.6479\\91\\36.13281\\-297.0202\\91\\34.17969\\-297.5093\\91\\32.22656\\-298.301\\91\\30.27344\\-298.763\\91\\28.32031\\-299.0932\\91\\24.41406\\-300.0789\\91\\22.46094\\-300.4359\\91\\18.55469\\-300.8157\\91\\14.64844\\-301.1423\\91\\8.789063\\-301.5423\\91\\6.835938\\-301.7203\\91\\2.929688\\-301.9203\\91\\0.9765625\\-301.9641\\91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "269" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "172" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-301.7965\\93\\-12.69531\\-301.3254\\93\\-18.55469\\-300.8154\\93\\-22.46094\\-300.4161\\93\\-24.41406\\-300.091\\93\\-26.36719\\-299.5352\\93\\-28.32031\\-299.0932\\93\\-32.22656\\-298.3394\\93\\-34.17969\\-297.5775\\93\\-36.13281\\-297.0985\\93\\-38.08594\\-296.7193\\93\\-40.03906\\-296.1459\\93\\-41.99219\\-295.3576\\93\\-45.89844\\-294.4961\\93\\-47.85156\\-293.569\\93\\-49.80469\\-292.9266\\93\\-53.71094\\-291.1817\\93\\-55.66406\\-290.5416\\93\\-57.61719\\-289.4693\\93\\-59.57031\\-288.9572\\93\\-65.42969\\-286.3046\\93\\-67.38281\\-285.2239\\93\\-71.28906\\-283.3124\\93\\-73.24219\\-282.5351\\93\\-75.19531\\-281.5162\\93\\-77.14844\\-280.7822\\93\\-79.10156\\-279.5869\\93\\-81.05469\\-278.7316\\93\\-83.00781\\-277.5482\\93\\-84.96094\\-276.7575\\93\\-86.91406\\-275.6973\\93\\-88.86719\\-275.0625\\93\\-90.82031\\-273.923\\93\\-92.77344\\-273.0599\\93\\-94.72656\\-271.8291\\93\\-96.67969\\-270.9924\\93\\-98.63281\\-269.8301\\93\\-100.5859\\-269.1456\\93\\-102.5391\\-267.926\\93\\-104.4922\\-266.9542\\93\\-108.3984\\-264.3539\\93\\-110.3516\\-263.2973\\93\\-114.0704\\-260.8047\\93\\-116.2109\\-259.2681\\93\\-121.518\\-254.9453\\93\\-125.9766\\-250.4862\\93\\-127.9297\\-248.6175\\93\\-132.5503\\-243.2266\\93\\-134.1673\\-241.2734\\93\\-135.353\\-239.3203\\93\\-136.6549\\-237.3672\\93\\-137.8581\\-235.4141\\93\\-138.8264\\-233.4609\\93\\-140.1144\\-231.5078\\93\\-140.9565\\-229.5547\\93\\-142.0181\\-227.6016\\93\\-143.32\\-223.6953\\93\\-144.1883\\-221.7422\\93\\-144.7188\\-219.7891\\93\\-146.168\\-215.8828\\93\\-147.1029\\-211.9766\\93\\-147.6787\\-210.0234\\93\\-148.0698\\-208.0703\\93\\-148.4904\\-204.1641\\93\\-148.8077\\-200.2578\\93\\-149.2128\\-194.3984\\93\\-149.2833\\-192.4453\\93\\-149.2551\\-188.5391\\93\\-149.1075\\-184.6328\\93\\-148.6292\\-176.8203\\93\\-148.2224\\-170.9609\\93\\-147.7619\\-167.0547\\93\\-146.882\\-163.1484\\93\\-146.2195\\-159.2422\\93\\-145.7784\\-157.2891\\93\\-145.0576\\-155.3359\\93\\-144.2562\\-151.4297\\93\\-142.9396\\-147.5234\\93\\-142.0866\\-143.6172\\93\\-141.2254\\-141.6641\\93\\-139.8976\\-137.7578\\93\\-138.8683\\-135.8047\\93\\-138.2379\\-133.8516\\93\\-137.1838\\-131.8984\\93\\-136.6096\\-129.9453\\93\\-135.8603\\-127.9922\\93\\-134.844\\-126.0391\\93\\-133.9686\\-124.0859\\93\\-131.8359\\-120.4487\\93\\-130.6603\\-118.2266\\93\\-129.3979\\-116.2734\\93\\-128.4419\\-114.3203\\93\\-127.9297\\-113.72\\93\\-124.0234\\-108.5743\\93\\-122.2591\\-106.5078\\93\\-120.1172\\-104.5025\\93\\-117.8757\\-102.6016\\93\\-115.2625\\-100.6484\\93\\-110.3516\\-97.48103\\93\\-108.3984\\-96.1144\\93\\-106.4453\\-95.2254\\93\\-104.4922\\-94.07591\\93\\-102.5391\\-93.41925\\93\\-100.5859\\-92.31319\\93\\-98.63281\\-91.55889\\93\\-96.67969\\-90.4199\\93\\-94.72656\\-89.67955\\93\\-92.77344\\-88.67987\\93\\-90.82031\\-88.04021\\93\\-88.86719\\-87.61683\\93\\-86.91406\\-86.92143\\93\\-84.96094\\-86.3882\\93\\-81.05469\\-85.63534\\93\\-77.14844\\-84.62906\\93\\-73.24219\\-84.06297\\93\\-61.52344\\-82.78226\\93\\-57.61719\\-82.54297\\93\\-53.71094\\-82.46886\\93\\-49.80469\\-82.54447\\93\\-47.85156\\-82.69207\\93\\-41.99219\\-83.03217\\93\\-40.03906\\-83.21088\\93\\-36.13281\\-83.43079\\93\\-32.22656\\-83.43895\\93\\-26.36719\\-83.22222\\93\\-22.46094\\-83.12414\\93\\-20.50781\\-83.12457\\93\\-16.60156\\-83.31799\\93\\-10.74219\\-83.40262\\93\\-6.835938\\-83.64151\\93\\-0.9765625\\-84.15977\\93\\0.9765625\\-84.25893\\93\\4.882813\\-83.94806\\93\\8.789063\\-83.47323\\93\\12.69531\\-82.61907\\93\\14.64844\\-82.37189\\93\\18.55469\\-82.09978\\93\\22.46094\\-81.96716\\93\\28.32031\\-81.91893\\93\\34.17969\\-82.06468\\93\\45.89844\\-82.20553\\93\\49.80469\\-82.29745\\93\\55.66406\\-82.37276\\93\\61.52344\\-82.63554\\93\\65.42969\\-82.98639\\93\\69.33594\\-83.52055\\93\\75.19531\\-84.17636\\93\\77.14844\\-84.47633\\93\\79.10156\\-84.90046\\93\\81.05469\\-85.50529\\93\\84.96094\\-86.19643\\93\\86.91406\\-86.61713\\93\\88.86719\\-87.32841\\93\\92.77344\\-88.18949\\93\\94.72656\\-88.80099\\93\\96.67969\\-89.61447\\93\\98.63281\\-90.23759\\93\\100.5859\\-91.24573\\93\\102.5391\\-92.0513\\93\\104.4922\\-93.11604\\93\\106.4453\\-93.93144\\93\\108.3984\\-95.0798\\93\\110.3516\\-96.11954\\93\\116.2109\\-100.313\\93\\118.1641\\-101.8932\\93\\120.9733\\-104.5547\\93\\122.833\\-106.5078\\93\\124.4685\\-108.4609\\93\\125.9766\\-110.4589\\93\\128.7381\\-114.3203\\93\\129.891\\-116.2734\\93\\130.8891\\-118.2266\\93\\132.0904\\-120.1797\\93\\133.0537\\-122.1328\\93\\134.2431\\-124.0859\\93\\134.9745\\-126.0391\\93\\135.9751\\-127.9922\\93\\136.6776\\-129.9453\\93\\137.2338\\-131.8984\\93\\138.2212\\-133.8516\\93\\138.8346\\-135.8047\\93\\140.435\\-139.7109\\93\\140.9409\\-141.6641\\93\\141.6855\\-143.6172\\93\\142.2422\\-145.5703\\93\\142.9099\\-149.4766\\93\\143.3806\\-151.4297\\93\\143.998\\-153.3828\\93\\144.3498\\-155.3359\\93\\144.8587\\-159.2422\\93\\145.2142\\-161.1953\\93\\145.6948\\-163.1484\\93\\146.0191\\-165.1016\\93\\146.5505\\-170.9609\\93\\146.7969\\-174.8672\\93\\146.9974\\-180.7266\\93\\146.9818\\-186.5859\\93\\146.7896\\-192.4453\\93\\146.4693\\-198.3047\\93\\146.2061\\-202.2109\\93\\146.0161\\-204.1641\\93\\145.7072\\-206.1172\\93\\144.9289\\-210.0234\\93\\144.394\\-213.9297\\93\\144.0206\\-215.8828\\93\\143.3253\\-217.8359\\93\\142.8284\\-219.7891\\93\\142.4395\\-221.7422\\93\\141.8013\\-223.6953\\93\\140.842\\-225.6484\\93\\140.0018\\-227.6016\\93\\138.6999\\-229.5547\\93\\137.5\\-231.5078\\93\\136.4682\\-233.4609\\93\\135.0754\\-235.4141\\93\\133.7891\\-237.0795\\93\\130.2545\\-241.2734\\93\\127.9297\\-243.642\\93\\123.7382\\-247.1328\\93\\121.2908\\-249.0859\\93\\120.1172\\-249.9381\\93\\116.2109\\-252.3958\\93\\114.2578\\-253.8635\\93\\112.3047\\-255.1513\\93\\110.3516\\-256.1913\\93\\108.3984\\-257.4893\\93\\106.4453\\-258.545\\93\\104.4922\\-259.8991\\93\\102.5391\\-261.3581\\93\\100.5859\\-262.363\\93\\91.47418\\-268.6172\\93\\90.82031\\-269.1505\\93\\88.86719\\-270.2014\\93\\86.91406\\-271.5905\\93\\84.96094\\-273.1385\\93\\83.00781\\-274.4847\\93\\81.05469\\-275.6179\\93\\79.10156\\-276.9944\\93\\76.89558\\-278.3828\\93\\73.24219\\-280.8749\\93\\71.28906\\-281.8324\\93\\69.33594\\-283.0351\\93\\67.38281\\-283.9357\\93\\66.99036\\-284.2422\\93\\63.47656\\-286.4191\\93\\61.52344\\-287.3479\\93\\59.57031\\-288.455\\93\\57.61719\\-289.1779\\93\\53.71094\\-290.9988\\93\\51.75781\\-291.8123\\93\\49.80469\\-292.8227\\93\\47.85156\\-293.4692\\93\\45.89844\\-294.431\\93\\43.94531\\-294.9432\\93\\41.99219\\-295.3537\\93\\40.03906\\-296.1459\\93\\38.08594\\-296.7476\\93\\36.13281\\-297.1189\\93\\34.17969\\-297.6822\\93\\32.22656\\-298.4442\\93\\28.32031\\-299.1999\\93\\24.41406\\-300.216\\93\\22.46094\\-300.4974\\93\\18.55469\\-300.884\\93\\14.64844\\-301.2179\\93\\8.789063\\-301.6489\\93\\6.835938\\-301.8441\\93\\0.9765625\\-302.0462\\93\\-2.929688\\-301.9918\\93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "257" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "173" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-301.9203\\95\\-18.55469\\-300.8954\\95\\-22.46094\\-300.5014\\95\\-24.41406\\-300.2263\\95\\-28.32031\\-299.2106\\95\\-32.22656\\-298.4682\\95\\-34.17969\\-297.7746\\95\\-36.13281\\-297.1897\\95\\-38.08594\\-296.7988\\95\\-40.03906\\-296.2979\\95\\-41.99219\\-295.4405\\95\\-45.89844\\-294.5913\\95\\-47.85156\\-293.7298\\95\\-51.75781\\-292.2904\\95\\-53.71094\\-291.2663\\95\\-55.66406\\-290.646\\95\\-57.61719\\-289.5555\\95\\-59.57031\\-288.9932\\95\\-61.52344\\-288.1563\\95\\-65.42969\\-286.3593\\95\\-67.38281\\-285.2392\\95\\-71.28906\\-283.3007\\95\\-73.24219\\-282.4798\\95\\-75.19531\\-281.4614\\95\\-77.14844\\-280.6818\\95\\-79.10156\\-279.4733\\95\\-81.05469\\-278.5049\\95\\-83.00781\\-277.4174\\95\\-86.91406\\-275.5623\\95\\-88.86719\\-274.8273\\95\\-90.82031\\-273.6646\\95\\-96.67969\\-270.4971\\95\\-100.5859\\-268.6572\\95\\-102.5391\\-267.5696\\95\\-104.4922\\-266.3133\\95\\-106.4453\\-265.2202\\95\\-108.3984\\-263.8909\\95\\-110.3516\\-262.7831\\95\\-112.3047\\-261.5642\\95\\-118.1641\\-257.1676\\95\\-120.1172\\-255.6645\\95\\-122.0703\\-253.9283\\95\\-124.0234\\-251.9275\\95\\-126.9601\\-249.0859\\95\\-128.8132\\-247.1328\\95\\-132.0237\\-243.2266\\95\\-133.7891\\-240.9419\\95\\-136.2755\\-237.3672\\95\\-137.2353\\-235.4141\\95\\-137.6953\\-234.7917\\95\\-140.5798\\-229.5547\\95\\-142.3618\\-225.6484\\95\\-142.9015\\-223.6953\\95\\-143.766\\-221.7422\\95\\-144.4221\\-219.7891\\95\\-144.9351\\-217.8359\\95\\-145.7435\\-215.8828\\95\\-146.288\\-213.9297\\95\\-147.1005\\-210.0234\\95\\-147.6534\\-208.0703\\95\\-148.0042\\-206.1172\\95\\-148.227\\-204.1641\\95\\-148.5387\\-200.2578\\95\\-148.7442\\-196.3516\\95\\-148.8832\\-192.4453\\95\\-148.8607\\-188.5391\\95\\-148.7609\\-184.6328\\95\\-148.3852\\-176.8203\\95\\-147.9523\\-170.9609\\95\\-147.6772\\-169.0078\\95\\-146.9124\\-165.1016\\95\\-146.3369\\-161.1953\\95\\-145.9726\\-159.2422\\95\\-144.8248\\-155.3359\\95\\-144.0677\\-151.4297\\95\\-143.3271\\-149.4766\\95\\-142.7965\\-147.5234\\95\\-142.4274\\-145.5703\\95\\-141.8615\\-143.6172\\95\\-141.024\\-141.6641\\95\\-140.4412\\-139.7109\\95\\-138.749\\-135.8047\\95\\-138.092\\-133.8516\\95\\-137.0939\\-131.8984\\95\\-136.5247\\-129.9453\\95\\-135.7422\\-128.1762\\95\\-133.7891\\-124.2603\\95\\-132.6138\\-122.1328\\95\\-131.358\\-120.1797\\95\\-130.4701\\-118.2266\\95\\-129.1743\\-116.2734\\95\\-128.1357\\-114.3203\\95\\-126.6589\\-112.3672\\95\\-125.0529\\-110.4141\\95\\-124.0234\\-109.0133\\95\\-121.7924\\-106.5078\\95\\-118.1641\\-103.237\\95\\-116.2109\\-101.6649\\95\\-114.2578\\-100.2679\\95\\-112.3047\\-99.21476\\95\\-108.3984\\-96.44009\\95\\-106.4453\\-95.50438\\95\\-104.4922\\-94.34645\\95\\-102.5391\\-93.65991\\95\\-100.5859\\-92.68625\\95\\-98.63281\\-91.83803\\95\\-94.72656\\-89.94509\\95\\-92.77344\\-89.2275\\95\\-90.82031\\-88.30334\\95\\-86.91406\\-87.39713\\95\\-84.96094\\-86.73785\\95\\-83.00781\\-86.28409\\95\\-79.10156\\-85.62769\\95\\-75.19531\\-84.70863\\95\\-73.24219\\-84.41237\\95\\-69.33594\\-83.9872\\95\\-63.47656\\-83.53625\\95\\-57.61719\\-83.03125\\95\\-53.71094\\-82.92648\\95\\-49.80469\\-83.0461\\95\\-45.89844\\-83.34042\\95\\-36.13281\\-83.61218\\95\\-32.22656\\-83.59155\\95\\-26.36719\\-83.37338\\95\\-22.46094\\-83.3005\\95\\-20.50781\\-83.31621\\95\\-16.60156\\-83.51072\\95\\-10.74219\\-83.66344\\95\\-6.835938\\-83.9114\\95\\-0.9765625\\-84.56646\\95\\0.9765625\\-84.69791\\95\\4.882813\\-84.36247\\95\\8.789063\\-83.87627\\95\\10.74219\\-83.56519\\95\\14.64844\\-82.6674\\95\\18.55469\\-82.24116\\95\\22.46094\\-82.0878\\95\\26.36719\\-82.02825\\95\\30.27344\\-82.0761\\95\\40.03906\\-82.31866\\95\\45.89844\\-82.39661\\95\\49.80469\\-82.5313\\95\\55.66406\\-82.6702\\95\\59.57031\\-82.94261\\95\\71.28906\\-84.04145\\95\\75.19531\\-84.51419\\95\\79.10156\\-85.42868\\95\\81.05469\\-85.82601\\95\\84.96094\\-86.50755\\95\\88.86719\\-87.66776\\95\\90.82031\\-88.01943\\95\\92.77344\\-88.47845\\95\\94.72656\\-89.30836\\95\\98.63281\\-90.65097\\95\\100.5859\\-91.63358\\95\\102.5391\\-92.38187\\95\\104.4922\\-93.4979\\95\\106.4453\\-94.22618\\95\\108.3984\\-95.49035\\95\\110.3516\\-96.54995\\95\\112.3047\\-97.91779\\95\\114.2578\\-99.42095\\95\\116.0432\\-100.6484\\95\\118.1641\\-102.3574\\95\\120.5252\\-104.5547\\95\\122.3881\\-106.5078\\95\\124.0234\\-108.4702\\95\\125.431\\-110.4141\\95\\128.4455\\-114.3203\\95\\129.4653\\-116.2734\\95\\130.6728\\-118.2266\\95\\131.8359\\-120.446\\95\\133.8852\\-124.0859\\95\\136.4699\\-129.9453\\95\\136.9614\\-131.8984\\95\\137.8439\\-133.8516\\95\\138.5651\\-135.8047\\95\\139.1509\\-137.7578\\95\\140.1217\\-139.7109\\95\\141.1968\\-143.6172\\95\\141.9271\\-145.5703\\95\\142.3792\\-147.5234\\95\\142.992\\-151.4297\\95\\144.0398\\-155.3359\\95\\144.337\\-157.2891\\95\\144.8103\\-161.1953\\95\\145.1133\\-163.1484\\95\\145.8646\\-167.0547\\95\\146.2402\\-170.9609\\95\\146.5355\\-176.8203\\95\\146.6097\\-180.7266\\95\\146.5981\\-186.5859\\95\\146.454\\-192.4453\\95\\146.1712\\-198.3047\\95\\145.8333\\-202.2109\\95\\145.1367\\-206.1172\\95\\144.4092\\-211.9766\\95\\144.1067\\-213.9297\\95\\142.9396\\-217.8359\\95\\142.59\\-219.7891\\95\\142.1384\\-221.7422\\95\\141.2311\\-223.6953\\95\\140.4926\\-225.6484\\95\\139.339\\-227.6016\\95\\138.3522\\-229.5547\\95\\137.0421\\-231.5078\\95\\136.0603\\-233.4609\\95\\134.6821\\-235.4141\\95\\129.8828\\-241.0102\\95\\127.7097\\-243.2266\\95\\125.9766\\-244.6007\\95\\122.0703\\-248.0117\\95\\120.1172\\-249.5285\\95\\118.1641\\-250.5723\\95\\114.2578\\-253.4647\\95\\112.3047\\-254.5946\\95\\108.3984\\-257.1407\\95\\106.4453\\-258.1902\\95\\102.5391\\-261.1112\\95\\100.5859\\-262.1603\\95\\98.63281\\-263.5885\\95\\94.72656\\-266.2322\\95\\91.45171\\-268.6172\\95\\90.82031\\-269.1366\\95\\88.86719\\-270.2374\\95\\86.91406\\-271.6352\\95\\84.96094\\-273.2058\\95\\83.00781\\-274.5938\\95\\81.05469\\-275.6571\\95\\79.10156\\-277.0914\\95\\75.19531\\-279.6006\\95\\73.24219\\-280.9766\\95\\71.28906\\-281.9586\\95\\69.33594\\-283.1186\\95\\67.38281\\-284.1259\\95\\65.42969\\-285.2901\\95\\63.47656\\-286.6022\\95\\61.52344\\-287.4756\\95\\59.57031\\-288.6132\\95\\57.61719\\-289.2671\\95\\55.66406\\-290.3148\\95\\53.71094\\-291.1126\\95\\49.80469\\-292.9301\\95\\47.85156\\-293.6392\\95\\45.89844\\-294.5524\\95\\41.99219\\-295.4727\\95\\40.03906\\-296.3422\\95\\38.08594\\-296.8377\\95\\36.13281\\-297.2205\\95\\32.22656\\-298.5598\\95\\28.32031\\-299.3298\\95\\26.36719\\-299.9048\\95\\24.41406\\-300.3285\\95\\18.55469\\-300.9607\\95\\6.835938\\-301.95\\95\\2.929688\\-302.1003\\95\\-0.9765625\\-302.1246\\95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "265" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "174" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-301.8906\\97\\-16.60156\\-301.1714\\97\\-22.46094\\-300.5941\\97\\-24.41406\\-300.3405\\97\\-26.36719\\-299.9194\\97\\-28.32031\\-299.3404\\97\\-32.22656\\-298.5841\\97\\-34.17969\\-298.0088\\97\\-36.13281\\-297.2988\\97\\-40.03906\\-296.4299\\97\\-41.99219\\-295.5853\\97\\-45.89844\\-294.689\\97\\-49.80469\\-293.1186\\97\\-51.75781\\-292.4636\\97\\-53.71094\\-291.377\\97\\-55.66406\\-290.7473\\97\\-57.61719\\-289.6534\\97\\-59.57031\\-289.0476\\97\\-61.52344\\-288.262\\97\\-63.47656\\-287.2673\\97\\-65.42969\\-286.4377\\97\\-67.38281\\-285.265\\97\\-71.28906\\-283.3011\\97\\-73.24219\\-282.4352\\97\\-75.19531\\-281.4137\\97\\-77.14844\\-280.5695\\97\\-77.44962\\-280.3359\\97\\-81.05469\\-278.2286\\97\\-83.00781\\-277.2835\\97\\-84.96094\\-276.2101\\97\\-86.91406\\-275.4233\\97\\-88.86719\\-274.5\\97\\-90.82031\\-273.433\\97\\-92.77344\\-272.1869\\97\\-94.72656\\-271.2771\\97\\-96.67969\\-270.0581\\97\\-98.63281\\-269.3257\\97\\-100.5859\\-268.1355\\97\\-102.5391\\-267.2087\\97\\-104.4922\\-265.8395\\97\\-108.3984\\-263.5478\\97\\-110.3516\\-262.2207\\97\\-112.3047\\-261.0784\\97\\-114.2578\\-259.6269\\97\\-118.1641\\-256.4972\\97\\-120.1172\\-255.0803\\97\\-122.0703\\-253.3547\\97\\-124.0234\\-251.3594\\97\\-125.9766\\-249.5023\\97\\-128.3014\\-247.1328\\97\\-131.3365\\-243.2266\\97\\-131.8359\\-242.6902\\97\\-134.493\\-239.3203\\97\\-135.7422\\-237.3331\\97\\-136.807\\-235.4141\\97\\-137.9902\\-233.4609\\97\\-138.9146\\-231.5078\\97\\-140.1614\\-229.5547\\97\\-140.9644\\-227.6016\\97\\-141.9825\\-225.6484\\97\\-143.1683\\-221.7422\\97\\-144.0618\\-219.7891\\97\\-145.0977\\-215.8828\\97\\-145.8589\\-213.9297\\97\\-146.3155\\-211.9766\\97\\-147.0535\\-208.0703\\97\\-147.5571\\-206.1172\\97\\-147.8886\\-204.1641\\97\\-148.11\\-202.2109\\97\\-148.379\\-198.3047\\97\\-148.5641\\-192.4453\\97\\-148.5387\\-186.5859\\97\\-148.4259\\-182.6797\\97\\-148.11\\-176.8203\\97\\-147.7865\\-172.9141\\97\\-147.5285\\-170.9609\\97\\-147.1713\\-169.0078\\97\\-146.0871\\-161.1953\\97\\-145.6163\\-159.2422\\97\\-144.998\\-157.2891\\97\\-144.3088\\-153.3828\\97\\-143.8024\\-151.4297\\97\\-143.0534\\-149.4766\\97\\-142.2833\\-145.5703\\97\\-140.8457\\-141.6641\\97\\-140.2903\\-139.7109\\97\\-139.3011\\-137.7578\\97\\-137.907\\-133.8516\\97\\-136.9504\\-131.8984\\97\\-136.3954\\-129.9453\\97\\-135.3644\\-127.9922\\97\\-134.5426\\-126.0391\\97\\-133.381\\-124.0859\\97\\-132.4066\\-122.1328\\97\\-131.1275\\-120.1797\\97\\-130.2228\\-118.2266\\97\\-127.9297\\-114.5894\\97\\-126.3401\\-112.3672\\97\\-124.0234\\-109.4453\\97\\-121.3414\\-106.5078\\97\\-120.1172\\-105.4585\\97\\-118.1641\\-103.6037\\97\\-116.2109\\-101.9574\\97\\-114.2036\\-100.6484\\97\\-112.3047\\-99.55293\\97\\-110.3516\\-98.11066\\97\\-108.1414\\-96.74219\\97\\-104.4922\\-94.73209\\97\\-102.5391\\-93.86743\\97\\-100.5859\\-93.15671\\97\\-98.63281\\-92.09267\\97\\-96.67969\\-91.37109\\97\\-94.72656\\-90.25711\\97\\-92.77344\\-89.58273\\97\\-90.82031\\-88.71875\\97\\-88.86719\\-88.08997\\97\\-86.91406\\-87.7185\\97\\-84.96094\\-87.24152\\97\\-83.00781\\-86.61713\\97\\-81.05469\\-86.23279\\97\\-77.14844\\-85.65605\\97\\-73.24219\\-84.888\\97\\-69.33594\\-84.34434\\97\\-61.52344\\-83.78838\\97\\-59.57031\\-83.68294\\97\\-53.71094\\-83.47556\\97\\-49.80469\\-83.55233\\97\\-47.85156\\-83.65146\\97\\-40.03906\\-83.73849\\97\\-32.22656\\-83.71564\\97\\-24.41406\\-83.47775\\97\\-20.50781\\-83.49068\\97\\-16.60156\\-83.67625\\97\\-12.69531\\-83.79559\\97\\-8.789063\\-83.99107\\97\\-6.835938\\-84.16473\\97\\-2.929688\\-84.74161\\97\\-0.9765625\\-85.13969\\97\\0.9765625\\-85.3157\\97\\2.929688\\-85.22626\\97\\6.835938\\-84.48571\\97\\8.789063\\-84.2456\\97\\12.69531\\-83.58123\\97\\16.60156\\-82.70324\\97\\18.55469\\-82.42578\\97\\22.46094\\-82.21358\\97\\28.32031\\-82.17023\\97\\34.17969\\-82.30216\\97\\47.85156\\-82.74479\\97\\53.71094\\-83.07806\\97\\55.66406\\-83.15295\\97\\63.47656\\-83.71554\\97\\67.38281\\-83.9705\\97\\73.24219\\-84.58736\\97\\77.14844\\-85.42868\\97\\83.00781\\-86.40033\\97\\86.91406\\-87.52423\\97\\90.82031\\-88.26385\\97\\94.72656\\-89.66639\\97\\96.67969\\-90.24921\\97\\98.63281\\-91.2263\\97\\100.5859\\-91.97205\\97\\106.4453\\-94.66997\\97\\108.3984\\-95.81001\\97\\112.3047\\-98.34209\\97\\115.4494\\-100.6484\\97\\118.1641\\-102.9168\\97\\119.9268\\-104.5547\\97\\121.8669\\-106.5078\\97\\124.0234\\-109.0081\\97\\125.0179\\-110.4141\\97\\126.6255\\-112.3672\\97\\128.0329\\-114.3203\\97\\129.1488\\-116.2734\\97\\130.3914\\-118.2266\\97\\131.2447\\-120.1797\\97\\132.5077\\-122.1328\\97\\133.4078\\-124.0859\\97\\134.4977\\-126.0391\\97\\135.2077\\-127.9922\\97\\136.1861\\-129.9453\\97\\137.346\\-133.8516\\97\\138.2857\\-135.8047\\97\\138.8152\\-137.7578\\97\\140.3689\\-141.6641\\97\\140.8347\\-143.6172\\97\\142.0898\\-147.5234\\97\\142.4515\\-149.4766\\97\\143.0466\\-153.3828\\97\\144.0272\\-157.2891\\97\\144.3239\\-159.2422\\97\\144.9746\\-165.1016\\97\\145.5744\\-169.0078\\97\\146.0221\\-172.9141\\97\\146.2166\\-176.8203\\97\\146.2942\\-180.7266\\97\\146.2839\\-186.5859\\97\\146.1243\\-192.4453\\97\\145.9142\\-196.3516\\97\\145.7553\\-198.3047\\97\\145.2278\\-202.2109\\97\\144.7645\\-206.1172\\97\\144.3773\\-210.0234\\97\\144.089\\-211.9766\\97\\143.6094\\-213.9297\\97\\143.0202\\-215.8828\\97\\142.3279\\-219.7891\\97\\141.6558\\-221.7422\\97\\140.8031\\-223.6953\\97\\140.0761\\-225.6484\\97\\138.8504\\-227.6016\\97\\137.8976\\-229.5547\\97\\134.2564\\-235.4141\\97\\129.8828\\-240.4226\\97\\127.0828\\-243.2266\\97\\122.0703\\-247.5473\\97\\118.1641\\-250.2067\\97\\116.2109\\-251.6338\\97\\114.2578\\-252.875\\97\\111.2225\\-254.9453\\97\\110.3516\\-255.6075\\97\\108.3984\\-256.6875\\97\\106.4453\\-257.9328\\97\\104.4922\\-259.4401\\97\\102.5391\\-260.8283\\97\\100.5859\\-262.0379\\97\\98.63281\\-263.4853\\97\\94.72656\\-266.1824\\97\\90.82031\\-269.1743\\97\\88.86719\\-270.3319\\97\\86.91406\\-271.7115\\97\\84.96094\\-273.2864\\97\\83.00781\\-274.7375\\97\\81.05469\\-275.7268\\97\\79.10156\\-277.1948\\97\\77.14844\\-278.5203\\97\\75.19531\\-279.7364\\97\\73.24219\\-281.0941\\97\\69.33594\\-283.2139\\97\\67.38281\\-284.3806\\97\\65.42969\\-285.4288\\97\\63.47656\\-286.7694\\97\\61.52344\\-287.6221\\97\\59.57031\\-288.7716\\97\\57.61719\\-289.3875\\97\\55.66406\\-290.5227\\97\\53.71094\\-291.2315\\97\\51.75781\\-292.3138\\97\\49.80469\\-293.0569\\97\\45.89844\\-294.6811\\97\\41.99219\\-295.6588\\97\\40.03906\\-296.4987\\97\\36.13281\\-297.3434\\97\\34.17969\\-298.1378\\97\\32.22656\\-298.6742\\97\\28.32031\\-299.4828\\97\\26.36719\\-300.0681\\97\\24.41406\\-300.431\\97\\22.46094\\-300.6606\\97\\16.60156\\-301.2228\\97\\8.789063\\-301.9203\\97\\6.835938\\-302.0608\\97\\2.929688\\-302.1985\\97\\-0.9765625\\-302.2123\\97\\-6.835938\\-302.0332\\97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "258" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "175" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-300.6782\\99\\-24.41406\\-300.4359\\99\\-26.36719\\-300.0926\\99\\-28.32031\\-299.501\\99\\-32.22656\\-298.6943\\99\\-34.17969\\-298.218\\99\\-36.13281\\-297.4228\\99\\-40.03906\\-296.5623\\99\\-41.99219\\-295.7746\\99\\-43.94531\\-295.1858\\99\\-45.89844\\-294.776\\99\\-47.85156\\-294.1326\\99\\-49.80469\\-293.2471\\99\\-51.75781\\-292.6086\\99\\-53.71094\\-291.5121\\99\\-55.66406\\-290.8377\\99\\-57.61719\\-289.7714\\99\\-61.52344\\-288.3744\\99\\-63.47656\\-287.3105\\99\\-65.42969\\-286.4984\\99\\-67.38281\\-285.2967\\99\\-71.28906\\-283.3068\\99\\-73.24219\\-282.4063\\99\\-77.30359\\-280.3359\\99\\-80.59776\\-278.3828\\99\\-81.05469\\-278.0417\\99\\-83.00781\\-277.1735\\99\\-84.96094\\-276.0292\\99\\-86.91406\\-275.2904\\99\\-88.86719\\-274.1556\\99\\-90.82031\\-273.2\\99\\-92.77344\\-271.863\\99\\-94.72656\\-270.9871\\99\\-96.67969\\-269.7679\\99\\-98.63281\\-268.9834\\99\\-99.14102\\-268.6172\\99\\-102.5391\\-266.7025\\99\\-104.4922\\-265.4672\\99\\-106.4453\\-264.0966\\99\\-108.3984\\-263.1641\\99\\-112.3047\\-260.3961\\99\\-114.2578\\-259.094\\99\\-118.1641\\-256.0311\\99\\-120.1172\\-254.3751\\99\\-122.0703\\-252.5539\\99\\-125.9766\\-248.7579\\99\\-127.9297\\-246.7238\\99\\-131.8359\\-242.0659\\99\\-133.9198\\-239.3203\\99\\-135.1115\\-237.3672\\99\\-136.4304\\-235.4141\\99\\-137.2808\\-233.4609\\99\\-138.5091\\-231.5078\\99\\-140.5545\\-227.6016\\99\\-142.2674\\-223.6953\\99\\-142.7747\\-221.7422\\99\\-143.4523\\-219.7891\\99\\-144.2348\\-217.8359\\99\\-145.1868\\-213.9297\\99\\-145.8795\\-211.9766\\99\\-146.2838\\-210.0234\\99\\-146.9575\\-206.1172\\99\\-147.7034\\-202.2109\\99\\-147.9399\\-200.2578\\99\\-148.1728\\-196.3516\\99\\-148.2669\\-192.4453\\99\\-148.2573\\-186.5859\\99\\-148.025\\-180.7266\\99\\-147.7273\\-176.8203\\99\\-146.7673\\-169.0078\\99\\-146.0871\\-163.1484\\99\\-145.7072\\-161.1953\\99\\-145.1317\\-159.2422\\99\\-144.7363\\-157.2891\\99\\-144.0768\\-153.3828\\99\\-143.3957\\-151.4297\\99\\-142.8528\\-149.4766\\99\\-142.1091\\-145.5703\\99\\-141.2828\\-143.6172\\99\\-140.0885\\-139.7109\\99\\-139.0896\\-137.7578\\99\\-138.5091\\-135.8047\\99\\-137.6073\\-133.8516\\99\\-136.8037\\-131.8984\\99\\-136.2134\\-129.9453\\99\\-135.1327\\-127.9922\\99\\-134.3444\\-126.0391\\99\\-133.1199\\-124.0859\\99\\-132.1528\\-122.1328\\99\\-130.9387\\-120.1797\\99\\-128.7818\\-116.2734\\99\\-124.4287\\-110.4141\\99\\-122.8337\\-108.4609\\99\\-120.9168\\-106.5078\\99\\-118.7022\\-104.5547\\99\\-118.1641\\-103.9937\\99\\-116.2109\\-102.3438\\99\\-114.2578\\-101.1473\\99\\-110.3516\\-98.5\\99\\-108.3984\\-97.37042\\99\\-106.4453\\-96.06519\\99\\-104.4922\\-95.16412\\99\\-102.5391\\-94.08057\\99\\-100.5859\\-93.48905\\99\\-98.63281\\-92.39038\\99\\-96.67969\\-91.70027\\99\\-94.72656\\-90.66811\\99\\-92.77344\\-89.87786\\99\\-90.82031\\-89.25066\\99\\-88.86719\\-88.38037\\99\\-84.96094\\-87.60807\\99\\-81.05469\\-86.57406\\99\\-79.10156\\-86.25128\\99\\-71.28906\\-85.207\\99\\-69.33594\\-84.82115\\99\\-67.38281\\-84.59696\\99\\-61.52344\\-84.12917\\99\\-53.71094\\-83.85041\\99\\-47.85156\\-83.93295\\99\\-40.03906\\-83.90659\\99\\-32.22656\\-83.82618\\99\\-24.41406\\-83.63093\\99\\-20.50781\\-83.68364\\99\\-14.64844\\-83.88596\\99\\-8.789063\\-84.21152\\99\\-4.882813\\-84.79808\\99\\-2.929688\\-85.30348\\99\\-0.9765625\\-85.63457\\99\\0.9765625\\-85.76035\\99\\2.929688\\-85.70143\\99\\4.882813\\-85.46854\\99\\8.789063\\-84.65723\\99\\12.69531\\-83.90992\\99\\14.64844\\-83.58732\\99\\18.55469\\-82.74479\\99\\20.50781\\-82.48438\\99\\22.46094\\-82.37911\\99\\28.32031\\-82.29998\\99\\36.13281\\-82.52421\\99\\45.89844\\-83.09357\\99\\47.85156\\-83.16649\\99\\51.75781\\-83.43079\\99\\59.57031\\-83.78721\\99\\67.38281\\-84.28017\\99\\71.28906\\-84.75106\\99\\75.19531\\-85.47266\\99\\81.05469\\-86.36324\\99\\83.00781\\-86.793\\99\\84.96094\\-87.42358\\99\\88.86719\\-88.1251\\99\\90.82031\\-88.60892\\99\\92.77344\\-89.40529\\99\\94.72656\\-89.98179\\99\\96.67969\\-90.67907\\99\\98.63281\\-91.62823\\99\\100.5859\\-92.31549\\99\\102.5391\\-93.35812\\99\\104.4922\\-94.05022\\99\\106.4453\\-95.20061\\99\\108.3984\\-96.16422\\99\\112.3047\\-98.92556\\99\\114.2578\\-100.1739\\99\\116.2109\\-101.7081\\99\\118.1641\\-103.4851\\99\\120.1172\\-105.4633\\99\\121.2877\\-106.5078\\99\\124.0234\\-109.5505\\99\\126.1534\\-112.3672\\99\\128.8689\\-116.2734\\99\\130.9465\\-120.1797\\99\\132.155\\-122.1328\\99\\133.0321\\-124.0859\\99\\134.1916\\-126.0391\\99\\134.9094\\-127.9922\\99\\136.5345\\-131.8984\\99\\137.0049\\-133.8516\\99\\137.8823\\-135.8047\\99\\139.1152\\-139.7109\\99\\140.0076\\-141.6641\\99\\140.9801\\-145.5703\\99\\141.625\\-147.5234\\99\\142.1659\\-149.4766\\99\\142.5126\\-151.4297\\99\\143.0404\\-155.3359\\99\\143.988\\-159.2422\\99\\144.2705\\-161.1953\\99\\144.8287\\-167.0547\\99\\144.9713\\-169.0078\\99\\145.6822\\-174.8672\\99\\145.9167\\-180.7266\\99\\145.907\\-186.5859\\99\\145.7784\\-190.4922\\99\\145.5154\\-194.3984\\99\\145.1262\\-198.3047\\99\\144.3197\\-208.0703\\99\\144.0585\\-210.0234\\99\\143.073\\-213.9297\\99\\142.4223\\-217.8359\\99\\141.9498\\-219.7891\\99\\141.0977\\-221.7422\\99\\140.4464\\-223.6953\\99\\139.3885\\-225.6484\\99\\138.4713\\-227.6016\\99\\137.283\\-229.5547\\99\\136.3642\\-231.5078\\99\\133.7891\\-235.208\\99\\130.4277\\-239.3203\\99\\127.9297\\-241.974\\99\\125.9766\\-243.7327\\99\\121.7731\\-247.1328\\99\\118.1641\\-249.879\\99\\114.2578\\-252.3685\\99\\110.7405\\-254.9453\\99\\110.3516\\-255.293\\99\\108.3984\\-256.3651\\99\\104.4922\\-259.2125\\99\\100.5859\\-261.9481\\99\\98.63281\\-263.4155\\99\\96.74737\\-264.7109\\99\\91.53427\\-268.6172\\99\\90.82031\\-269.2113\\99\\86.91406\\-271.7968\\99\\83.00781\\-274.8829\\99\\81.05469\\-275.8633\\99\\77.14844\\-278.7216\\99\\75.19531\\-279.907\\99\\73.24219\\-281.2166\\99\\71.28906\\-282.3301\\99\\69.33594\\-283.3296\\99\\67.38281\\-284.6212\\99\\65.42969\\-285.6069\\99\\63.47656\\-286.9277\\99\\61.52344\\-287.7839\\99\\59.57031\\-288.8963\\99\\57.61719\\-289.5389\\99\\55.66406\\-290.6886\\99\\53.71094\\-291.3657\\99\\51.75781\\-292.5251\\99\\49.80469\\-293.1976\\99\\47.85156\\-294.1047\\99\\45.89844\\-294.7998\\99\\43.94531\\-295.2224\\99\\41.99219\\-295.8757\\99\\40.03906\\-296.6331\\99\\38.08594\\-297.0154\\99\\36.13281\\-297.5196\\99\\34.17969\\-298.3421\\99\\30.27344\\-299.1643\\99\\26.36719\\-300.2077\\99\\24.41406\\-300.5201\\99\\20.50781\\-300.9362\\99\\14.64844\\-301.4833\\99\\10.74219\\-301.9056\\99\\6.835938\\-302.1505\\99\\2.929688\\-302.2818\\99\\-0.9765625\\-302.292\\99\\-4.882813\\-302.2123\\99\\-8.789063\\-302.0201\\99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "252" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "176" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-302.0201\\101\\-14.64844\\-301.5566\\101\\-22.46094\\-300.7596\\101\\-26.36719\\-300.2413\\101\\-30.27344\\-299.1961\\101\\-34.17969\\-298.3788\\101\\-36.13281\\-297.5997\\101\\-38.08594\\-297.0688\\101\\-40.03906\\-296.6778\\101\\-43.94531\\-295.2872\\101\\-45.89844\\-294.8778\\101\\-47.85156\\-294.313\\101\\-49.80469\\-293.3853\\101\\-51.75781\\-292.7399\\101\\-53.71094\\-291.683\\101\\-55.66406\\-290.9309\\101\\-57.61719\\-289.9413\\101\\-61.52344\\-288.5016\\101\\-63.47656\\-287.3803\\101\\-65.42969\\-286.5898\\101\\-67.38281\\-285.3454\\101\\-69.33594\\-284.3908\\101\\-71.28906\\-283.3186\\101\\-73.24219\\-282.4063\\101\\-77.14844\\-280.3747\\101\\-79.10156\\-279.2066\\101\\-81.05469\\-277.9103\\101\\-83.00781\\-277.0668\\101\\-84.96094\\-275.8879\\101\\-86.91406\\-275.1213\\101\\-88.86719\\-273.9054\\101\\-90.82031\\-272.9206\\101\\-92.77344\\-271.6265\\101\\-94.72656\\-270.5621\\101\\-98.47986\\-268.6172\\101\\-100.5859\\-267.4646\\101\\-102.5391\\-266.1367\\101\\-104.4922\\-265.0365\\101\\-106.4453\\-263.7464\\101\\-110.3516\\-261.4176\\101\\-114.2578\\-258.346\\101\\-116.2109\\-257.0166\\101\\-118.1641\\-255.5557\\101\\-120.1172\\-253.8474\\101\\-123.0839\\-251.0391\\101\\-125.9766\\-248.164\\101\\-128.7206\\-245.1797\\101\\-131.8359\\-241.2274\\101\\-134.6507\\-237.3672\\101\\-135.9089\\-235.4141\\101\\-136.8347\\-233.4609\\101\\-138.0231\\-231.5078\\101\\-138.8941\\-229.5547\\101\\-140.0901\\-227.6016\\101\\-140.8517\\-225.6484\\101\\-141.7894\\-223.6953\\101\\-142.4636\\-221.7422\\101\\-142.9274\\-219.7891\\101\\-143.7262\\-217.8359\\101\\-144.3124\\-215.8828\\101\\-145.1732\\-211.9766\\101\\-145.8247\\-210.0234\\101\\-146.2415\\-208.0703\\101\\-147.0768\\-202.2109\\101\\-147.3928\\-200.2578\\101\\-147.7887\\-196.3516\\101\\-147.9555\\-190.4922\\101\\-147.9112\\-186.5859\\101\\-147.5858\\-180.7266\\101\\-147.3361\\-178.7734\\101\\-146.4439\\-169.0078\\101\\-146.0191\\-165.1016\\101\\-145.6694\\-163.1484\\101\\-145.1557\\-161.1953\\101\\-144.7879\\-159.2422\\101\\-144.2076\\-155.3359\\101\\-143.7112\\-153.3828\\101\\-143.0598\\-151.4297\\101\\-142.3551\\-147.5234\\101\\-141.851\\-145.5703\\101\\-141.0324\\-143.6172\\101\\-140.4907\\-141.6641\\101\\-139.797\\-139.7109\\101\\-138.9469\\-137.7578\\101\\-138.3409\\-135.8047\\101\\-137.3089\\-133.8516\\101\\-135.9751\\-129.9453\\101\\-134.9472\\-127.9922\\101\\-134.0835\\-126.0391\\101\\-132.8636\\-124.0859\\101\\-130.7419\\-120.1797\\101\\-129.5139\\-118.2266\\101\\-128.5392\\-116.2734\\101\\-123.9014\\-110.4141\\101\\-122.4835\\-108.4609\\101\\-120.4234\\-106.5078\\101\\-115.8332\\-102.6016\\101\\-112.3047\\-100.0914\\101\\-110.3516\\-99.00812\\101\\-109.9808\\-98.69531\\101\\-106.4453\\-96.43488\\101\\-104.4922\\-95.51361\\101\\-102.5391\\-94.37154\\101\\-100.5859\\-93.72862\\101\\-96.67969\\-91.96495\\101\\-94.72656\\-91.21056\\101\\-92.77344\\-90.19518\\101\\-90.82031\\-89.60256\\101\\-88.86719\\-88.79581\\101\\-86.91406\\-88.20844\\101\\-83.00781\\-87.52795\\101\\-79.10156\\-86.61713\\101\\-77.14844\\-86.30003\\101\\-71.28906\\-85.67249\\101\\-67.38281\\-85.1684\\101\\-61.52344\\-84.51105\\101\\-57.61719\\-84.31876\\101\\-53.71094\\-84.17596\\101\\-47.85156\\-84.18716\\101\\-38.08594\\-84.00372\\101\\-34.17969\\-83.97217\\101\\-26.36719\\-83.80134\\101\\-22.46094\\-83.81676\\101\\-14.64844\\-84.05791\\101\\-8.789063\\-84.50786\\101\\-6.835938\\-84.79964\\101\\-4.882813\\-85.29108\\101\\-0.9765625\\-86.00574\\101\\0.9765625\\-86.13706\\101\\2.929688\\-86.11557\\101\\6.835938\\-85.60049\\101\\8.789063\\-85.25453\\101\\10.74219\\-84.71331\\101\\14.64844\\-83.91975\\101\\20.50781\\-82.88251\\101\\22.46094\\-82.66168\\101\\26.36719\\-82.47672\\101\\28.32031\\-82.47281\\101\\34.17969\\-82.62216\\101\\36.13281\\-82.74247\\101\\40.03906\\-83.10816\\101\\43.94531\\-83.36192\\101\\51.75781\\-83.7346\\101\\59.57031\\-84.06822\\101\\63.47656\\-84.31171\\101\\67.38281\\-84.6541\\101\\71.28906\\-85.3074\\101\\77.14844\\-86.0511\\101\\81.05469\\-86.76522\\101\\83.00781\\-87.31405\\101\\84.96094\\-87.7215\\101\\88.86719\\-88.42161\\101\\90.82031\\-89.14906\\101\\94.72656\\-90.31075\\101\\96.67969\\-91.25842\\101\\98.63281\\-91.96972\\101\\102.5391\\-93.67566\\101\\104.4922\\-94.40567\\101\\108.3984\\-96.62775\\101\\110.3516\\-97.9613\\101\\112.3047\\-99.45412\\101\\114.1851\\-100.6484\\101\\116.2109\\-102.1283\\101\\118.7212\\-104.5547\\101\\120.8357\\-106.5078\\101\\122.7001\\-108.4609\\101\\124.2511\\-110.4141\\101\\125.548\\-112.3672\\101\\128.5441\\-116.2734\\101\\129.4765\\-118.2266\\101\\130.6653\\-120.1797\\101\\133.7891\\-126.1998\\101\\134.6319\\-127.9922\\101\\135.294\\-129.9453\\101\\136.2271\\-131.8984\\101\\137.3033\\-135.8047\\101\\138.2041\\-137.7578\\101\\139.406\\-141.6641\\101\\140.1992\\-143.6172\\101\\141.1009\\-147.5234\\101\\141.7569\\-149.4766\\101\\142.2298\\-151.4297\\101\\143.0179\\-157.2891\\101\\143.8893\\-161.1953\\101\\144.1525\\-163.1484\\101\\144.5104\\-167.0547\\101\\144.7495\\-170.9609\\101\\145.0413\\-174.8672\\101\\145.3154\\-182.6797\\101\\145.2884\\-186.5859\\101\\145.1604\\-190.4922\\101\\144.6461\\-200.2578\\101\\144.219\\-206.1172\\101\\143.9572\\-208.0703\\101\\143.05\\-211.9766\\101\\142.4583\\-215.8828\\101\\142.08\\-217.8359\\101\\141.3435\\-219.7891\\101\\140.0171\\-223.6953\\101\\138.8683\\-225.6484\\101\\138.0623\\-227.6016\\101\\136.8646\\-229.5547\\101\\135.8772\\-231.5078\\101\\134.613\\-233.4609\\101\\131.8359\\-236.8906\\101\\127.9297\\-241.3622\\101\\123.48\\-245.1797\\101\\120.1172\\-247.9948\\101\\118.1641\\-249.4983\\101\\116.2109\\-250.6174\\101\\112.3047\\-253.5582\\101\\110.3002\\-254.9453\\101\\108.3984\\-256.1339\\101\\104.6404\\-258.8516\\101\\98.63281\\-263.3842\\101\\94.72656\\-266.2057\\101\\90.82031\\-269.2705\\101\\88.86719\\-270.6523\\101\\86.91406\\-271.9192\\101\\83.00781\\-275.0356\\101\\81.05469\\-276.0662\\101\\79.10156\\-277.4299\\101\\77.14844\\-278.9115\\101\\71.28906\\-282.5649\\101\\69.33594\\-283.4813\\101\\67.38281\\-284.819\\101\\65.42969\\-285.8249\\101\\63.47656\\-287.0703\\101\\59.57031\\-289.0225\\101\\57.61719\\-289.7179\\101\\55.66406\\-290.8391\\101\\53.71094\\-291.5574\\101\\51.75781\\-292.7039\\101\\49.80469\\-293.378\\101\\47.85156\\-294.3265\\101\\45.89844\\-294.9134\\101\\43.94531\\-295.3498\\101\\41.99219\\-296.1324\\101\\40.03906\\-296.7585\\101\\38.08594\\-297.1253\\101\\36.13281\\-297.7464\\101\\34.17969\\-298.5011\\101\\30.27344\\-299.31\\101\\28.32031\\-299.8899\\101\\26.36719\\-300.325\\101\\24.41406\\-300.6052\\101\\14.64844\\-301.609\\101\\10.74219\\-302.0332\\101\\6.835938\\-302.2581\\101\\2.929688\\-302.37\\101\\-2.929688\\-302.3571\\101\\-6.835938\\-302.2369\\101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "255" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "177" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-301.4584\\103\\-24.41406\\-300.6429\\103\\-26.36719\\-300.3733\\103\\-28.32031\\-299.9194\\103\\-30.27344\\-299.3351\\103\\-34.17969\\-298.5163\\103\\-38.08594\\-297.1776\\103\\-40.03906\\-296.7864\\103\\-41.99219\\-296.2247\\103\\-43.94531\\-295.402\\103\\-47.85156\\-294.4738\\103\\-49.80469\\-293.5319\\103\\-51.75781\\-292.8598\\103\\-53.71094\\-291.8803\\103\\-57.61719\\-290.1692\\103\\-59.57031\\-289.2568\\103\\-61.52344\\-288.6201\\103\\-63.47656\\-287.4709\\103\\-65.42969\\-286.6773\\103\\-67.38281\\-285.413\\103\\-69.33594\\-284.4897\\103\\-71.28906\\-283.3366\\103\\-73.43301\\-282.2891\\103\\-77.13721\\-280.3359\\103\\-79.10156\\-279.1517\\103\\-81.05469\\-277.8102\\103\\-83.00781\\-276.9652\\103\\-84.96094\\-275.7591\\103\\-86.91406\\-274.945\\103\\-87.58076\\-274.4766\\103\\-94.17499\\-270.5703\\103\\-94.72656\\-270.1478\\103\\-96.67969\\-269.3384\\103\\-98.63281\\-268.0959\\103\\-100.5859\\-267.1085\\103\\-104.4922\\-264.4202\\103\\-106.4453\\-263.424\\103\\-108.3984\\-262.0735\\103\\-110.3516\\-260.8621\\103\\-112.3047\\-259.418\\103\\-114.2578\\-257.8445\\103\\-118.0396\\-254.9453\\103\\-120.1172\\-253.2274\\103\\-122.4365\\-251.0391\\103\\-125.9766\\-247.513\\103\\-128.0704\\-245.1797\\103\\-129.8828\\-242.9041\\103\\-131.0587\\-241.2734\\103\\-132.658\\-239.3203\\103\\-134.1316\\-237.3672\\103\\-135.2293\\-235.4141\\103\\-136.4634\\-233.4609\\103\\-137.3004\\-231.5078\\103\\-138.4487\\-229.5547\\103\\-139.3138\\-227.6016\\103\\-140.4054\\-225.6484\\103\\-141.1133\\-223.6953\\103\\-142.0424\\-221.7422\\103\\-143.0596\\-217.8359\\103\\-143.8165\\-215.8828\\103\\-144.3304\\-213.9297\\103\\-145.0846\\-210.0234\\103\\-145.7316\\-208.0703\\103\\-146.1196\\-206.1172\\103\\-146.8118\\-200.2578\\103\\-147.1579\\-196.3516\\103\\-147.3928\\-190.4922\\103\\-147.3214\\-186.5859\\103\\-146.985\\-180.7266\\103\\-146.8156\\-178.7734\\103\\-146.4278\\-172.9141\\103\\-146.1243\\-169.0078\\103\\-145.8669\\-167.0547\\103\\-145.0802\\-163.1484\\103\\-144.2562\\-157.2891\\103\\-143.8525\\-155.3359\\103\\-143.2197\\-153.3828\\103\\-142.8238\\-151.4297\\103\\-142.1313\\-147.5234\\103\\-140.7806\\-143.6172\\103\\-140.2609\\-141.6641\\103\\-139.3802\\-139.7109\\103\\-138.092\\-135.8047\\103\\-137.0721\\-133.8516\\103\\-136.4919\\-131.8984\\103\\-134.7414\\-127.9922\\103\\-133.7891\\-126.1884\\103\\-131.8359\\-122.748\\103\\-131.3996\\-122.1328\\103\\-130.5013\\-120.1797\\103\\-129.2206\\-118.2266\\103\\-128.159\\-116.2734\\103\\-126.6897\\-114.3203\\103\\-123.3746\\-110.4141\\103\\-121.8767\\-108.4609\\103\\-116.2109\\-103.395\\103\\-114.2578\\-101.8008\\103\\-112.3047\\-100.5435\\103\\-110.3516\\-99.40134\\103\\-108.3984\\-98.02321\\103\\-104.4922\\-95.81988\\103\\-102.4978\\-94.78906\\103\\-100.5859\\-93.94067\\103\\-98.63281\\-93.30714\\103\\-96.67969\\-92.25574\\103\\-94.72656\\-91.59252\\103\\-92.77344\\-90.58182\\103\\-88.86719\\-89.31095\\103\\-86.91406\\-88.5922\\103\\-84.96094\\-88.12954\\103\\-81.05469\\-87.55062\\103\\-77.14844\\-86.70058\\103\\-75.19531\\-86.4074\\103\\-69.33594\\-85.80828\\103\\-63.47656\\-85.32554\\103\\-61.52344\\-85.04707\\103\\-57.61719\\-84.71539\\103\\-53.71094\\-84.53212\\103\\-47.85156\\-84.48284\\103\\-38.08594\\-84.13416\\103\\-34.17969\\-84.09966\\103\\-26.36719\\-83.94492\\103\\-22.46094\\-83.98141\\103\\-16.60156\\-84.18235\\103\\-12.69531\\-84.42471\\103\\-8.789063\\-84.90137\\103\\-2.929688\\-86.02941\\103\\0.9765625\\-86.52041\\103\\2.929688\\-86.51062\\103\\8.789063\\-85.71018\\103\\10.74219\\-85.28237\\103\\14.64844\\-84.27531\\103\\16.60156\\-83.90326\\103\\22.46094\\-83.09357\\103\\26.36719\\-82.79027\\103\\28.32031\\-82.75416\\103\\34.17969\\-82.90144\\103\\38.08594\\-83.28811\\103\\41.99219\\-83.54623\\103\\49.80469\\-83.89907\\103\\53.71094\\-84.04688\\103\\59.57031\\-84.35584\\103\\63.47656\\-84.67239\\103\\69.33594\\-85.46674\\103\\73.24219\\-85.85152\\103\\77.14844\\-86.3808\\103\\79.10156\\-86.76522\\103\\81.05469\\-87.29733\\103\\86.91406\\-88.29779\\103\\90.82031\\-89.57878\\103\\92.77344\\-90.08083\\103\\94.72656\\-90.81623\\103\\96.67969\\-91.68805\\103\\98.63281\\-92.32036\\103\\100.5859\\-93.29349\\103\\102.5391\\-93.94396\\103\\106.4453\\-95.90778\\103\\108.3984\\-97.21291\\103\\110.3516\\-98.39651\\103\\113.435\\-100.6484\\103\\116.001\\-102.6016\\103\\120.3125\\-106.5078\\103\\122.2276\\-108.4609\\103\\123.5822\\-110.4141\\103\\126.6851\\-114.3203\\103\\128.0735\\-116.2734\\103\\129.1261\\-118.2266\\103\\130.3223\\-120.1797\\103\\131.1492\\-122.1328\\103\\132.3692\\-124.0859\\103\\133.1818\\-126.0391\\103\\134.2961\\-127.9922\\103\\134.9383\\-129.9453\\103\\136.4996\\-133.8516\\103\\136.9418\\-135.8047\\103\\138.4436\\-139.7109\\103\\138.9337\\-141.6641\\103\\140.3233\\-145.5703\\103\\141.184\\-149.4766\\103\\141.8258\\-151.4297\\103\\142.2213\\-153.3828\\103\\142.9662\\-159.2422\\103\\143.6244\\-163.1484\\103\\144.1883\\-167.0547\\103\\144.3478\\-169.0078\\103\\144.6487\\-174.8672\\103\\144.8287\\-182.6797\\103\\144.8175\\-186.5859\\103\\144.6913\\-192.4453\\103\\144.5519\\-196.3516\\103\\144.245\\-202.2109\\103\\143.7899\\-206.1172\\103\\143.3385\\-208.0703\\103\\143.005\\-210.0234\\103\\142.4888\\-213.9297\\103\\142.1477\\-215.8828\\103\\140.8395\\-219.7891\\103\\140.3051\\-221.7422\\103\\139.3138\\-223.6953\\103\\138.4733\\-225.6484\\103\\137.3943\\-227.6016\\103\\136.5196\\-229.5547\\103\\134.1261\\-233.4609\\103\\131.8359\\-236.3604\\103\\129.1794\\-239.3203\\103\\127.3304\\-241.2734\\103\\122.9616\\-245.1797\\103\\120.1172\\-247.5633\\103\\118.0115\\-249.0859\\103\\116.2109\\-250.2699\\103\\115.2751\\-251.0391\\103\\110.3516\\-254.5561\\103\\106.4453\\-257.4329\\103\\104.4922\\-258.7783\\103\\101.9641\\-260.8047\\103\\98.63281\\-263.3793\\103\\94.72656\\-266.2748\\103\\90.82031\\-269.3529\\103\\88.86719\\-270.811\\103\\86.91406\\-272.0974\\103\\83.00781\\-275.1647\\103\\81.05469\\-276.3106\\103\\79.10156\\-277.567\\103\\77.14844\\-279.1033\\103\\75.19531\\-280.4035\\103\\73.24219\\-281.524\\103\\71.28906\\-282.7841\\103\\69.33594\\-283.6666\\103\\68.58016\\-284.2422\\103\\65.35619\\-286.1953\\103\\61.52344\\-288.3348\\103\\57.61719\\-289.9698\\103\\55.66406\\-290.979\\103\\53.71094\\-291.8157\\103\\51.75781\\-292.8561\\103\\49.80469\\-293.5731\\103\\47.85156\\-294.5182\\103\\43.94531\\-295.5128\\103\\41.99219\\-296.3556\\103\\40.03906\\-296.8692\\103\\38.08594\\-297.2611\\103\\36.13281\\-298.0361\\103\\34.17969\\-298.6312\\103\\30.27344\\-299.4629\\103\\28.32031\\-300.0804\\103\\26.36719\\-300.4344\\103\\24.41406\\-300.6875\\103\\16.60156\\-301.5182\\103\\12.69531\\-301.9931\\103\\10.74219\\-302.1505\\103\\6.835938\\-302.3571\\103\\2.929688\\-302.4526\\103\\-2.929688\\-302.4485\\103\\-6.835938\\-302.3477\\103\\-10.74219\\-302.1505\\103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "255" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "178" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-301.9056\\105\\-16.60156\\-301.5944\\105\\-26.36719\\-300.4818\\105\\-28.32031\\-300.1046\\105\\-30.27344\\-299.501\\105\\-34.17969\\-298.6312\\105\\-36.13281\\-298.0627\\105\\-38.08594\\-297.2958\\105\\-41.99219\\-296.4102\\105\\-43.94531\\-295.5444\\105\\-47.85156\\-294.6121\\105\\-49.80469\\-293.7162\\105\\-51.75781\\-292.9699\\105\\-53.71094\\-292.1213\\105\\-55.66406\\-291.1521\\105\\-57.61719\\-290.3642\\105\\-59.57031\\-289.3386\\105\\-61.52344\\-288.7293\\105\\-63.47656\\-287.5714\\105\\-65.42969\\-286.7715\\105\\-67.38281\\-285.4978\\105\\-69.33594\\-284.5677\\105\\-71.28906\\-283.3669\\105\\-73.47523\\-282.2891\\105\\-77.09418\\-280.3359\\105\\-79.10156\\-279.1195\\105\\-81.05469\\-277.726\\105\\-83.00781\\-276.8511\\105\\-84.96094\\-275.6472\\105\\-86.91406\\-274.7525\\105\\-90.42794\\-272.5234\\105\\-90.82031\\-272.2118\\105\\-92.77344\\-271.188\\105\\-94.72656\\-269.8674\\105\\-96.67969\\-269.0598\\105\\-97.277\\-268.6172\\105\\-102.5391\\-265.3875\\105\\-104.4922\\-263.9801\\105\\-106.4453\\-262.9375\\105\\-108.3984\\-261.6735\\105\\-112.3047\\-258.7166\\105\\-114.2578\\-257.3766\\105\\-116.2109\\-255.8276\\105\\-118.1641\\-254.1733\\105\\-121.6202\\-251.0391\\105\\-124.0234\\-248.7197\\105\\-127.281\\-245.1797\\105\\-128.969\\-243.2266\\105\\-130.5493\\-241.2734\\105\\-132.0101\\-239.3203\\105\\-134.7086\\-235.4141\\105\\-135.8302\\-233.4609\\105\\-137.8864\\-229.5547\\105\\-138.7432\\-227.6016\\105\\-139.7611\\-225.6484\\105\\-140.6022\\-223.6953\\105\\-141.3135\\-221.7422\\105\\-142.1718\\-219.7891\\105\\-143.0939\\-215.8828\\105\\-143.7916\\-213.9297\\105\\-144.2654\\-211.9766\\105\\-144.9667\\-208.0703\\105\\-145.9246\\-204.1641\\105\\-146.3682\\-200.2578\\105\\-146.6417\\-196.3516\\105\\-146.7666\\-192.4453\\105\\-146.808\\-188.5391\\105\\-146.5372\\-180.7266\\105\\-146.0699\\-172.9141\\105\\-145.6163\\-169.0078\\105\\-145.2121\\-167.0547\\105\\-144.6931\\-163.1484\\105\\-144.2343\\-159.2422\\105\\-143.8779\\-157.2891\\105\\-143.2996\\-155.3359\\105\\-142.8849\\-153.3828\\105\\-142.2913\\-149.4766\\105\\-141.7704\\-147.5234\\105\\-141.0253\\-145.5703\\105\\-140.5227\\-143.6172\\105\\-139.919\\-141.6641\\105\\-139.0265\\-139.7109\\105\\-138.4948\\-137.7578\\105\\-136.8401\\-133.8516\\105\\-136.2742\\-131.8984\\105\\-135.2539\\-129.9453\\105\\-134.4954\\-127.9922\\105\\-133.2942\\-126.0391\\105\\-132.3303\\-124.0859\\105\\-131.0833\\-122.1328\\105\\-130.1437\\-120.1797\\105\\-128.938\\-118.2266\\105\\-126.2403\\-114.3203\\105\\-124.6585\\-112.3672\\105\\-122.0703\\-109.2925\\105\\-121.2818\\-108.4609\\105\\-116.2109\\-103.8103\\105\\-114.2578\\-102.184\\105\\-112.3047\\-101.0608\\105\\-108.3984\\-98.43082\\105\\-106.4453\\-97.40721\\105\\-104.4922\\-96.12244\\105\\-102.5391\\-95.28759\\105\\-100.5859\\-94.2111\\105\\-98.63281\\-93.61346\\105\\-96.67969\\-92.6476\\105\\-92.77344\\-91.14091\\105\\-90.82031\\-90.24175\\105\\-86.91406\\-89.17558\\105\\-84.96094\\-88.45516\\105\\-83.00781\\-88.08825\\105\\-79.10156\\-87.60807\\105\\-77.14844\\-87.28994\\105\\-73.24219\\-86.55054\\105\\-71.28906\\-86.33144\\105\\-65.42969\\-85.82664\\105\\-63.47656\\-85.73527\\105\\-53.71094\\-85.00072\\105\\-47.85156\\-84.83643\\105\\-43.94531\\-84.58065\\105\\-36.13281\\-84.25217\\105\\-30.27344\\-84.14399\\105\\-26.36719\\-84.11091\\105\\-22.46094\\-84.16209\\105\\-16.60156\\-84.42471\\105\\-12.69531\\-84.72651\\105\\-8.789063\\-85.36523\\105\\-6.835938\\-85.60809\\105\\-2.929688\\-86.38565\\105\\0.9765625\\-87.06534\\105\\2.929688\\-87.034\\105\\4.882813\\-86.67446\\105\\8.789063\\-86.13021\\105\\12.69531\\-85.3157\\105\\14.64844\\-84.67007\\105\\18.55469\\-83.90155\\105\\20.50781\\-83.66985\\105\\24.41406\\-83.35228\\105\\28.32031\\-83.19704\\105\\32.22656\\-83.19514\\105\\36.13281\\-83.37131\\105\\40.03906\\-83.65741\\105\\51.75781\\-84.1669\\105\\59.57031\\-84.6936\\105\\61.52344\\-84.90137\\105\\65.42969\\-85.44381\\105\\73.24219\\-86.14677\\105\\77.14844\\-86.80511\\105\\79.10156\\-87.31158\\105\\81.05469\\-87.6507\\105\\84.96094\\-88.22231\\105\\86.91406\\-88.72993\\105\\88.86719\\-89.43352\\105\\92.77344\\-90.45087\\105\\94.72656\\-91.38345\\105\\96.67969\\-92.02029\\105\\100.5859\\-93.65281\\105\\102.5391\\-94.27327\\105\\104.4922\\-95.39774\\105\\106.4453\\-96.32851\\105\\109.8861\\-98.69531\\105\\110.3516\\-99.08748\\105\\112.3047\\-100.2415\\105\\114.2578\\-101.6781\\105\\116.2109\\-103.3587\\105\\121.5598\\-108.4609\\105\\122.0703\\-109.032\\105\\124.7116\\-112.3672\\105\\126.2008\\-114.3203\\105\\128.7928\\-118.2266\\105\\131.8437\\-124.0859\\105\\133.7891\\-128.0056\\105\\134.6269\\-129.9453\\105\\135.2439\\-131.8984\\105\\136.1427\\-133.8516\\105\\136.689\\-135.8047\\105\\137.1364\\-137.7578\\105\\138.0358\\-139.7109\\105\\139.066\\-143.6172\\105\\139.8631\\-145.5703\\105\\140.3795\\-147.5234\\105\\141.2149\\-151.4297\\105\\141.7851\\-153.3828\\105\\142.1786\\-155.3359\\105\\142.4583\\-157.2891\\105\\143.2459\\-165.1016\\105\\143.6824\\-167.0547\\105\\143.9545\\-169.0078\\105\\144.3148\\-174.8672\\105\\144.4304\\-178.7734\\105\\144.4895\\-182.6797\\105\\144.4949\\-186.5859\\105\\144.442\\-190.4922\\105\\144.2634\\-196.3516\\105\\144.1606\\-198.3047\\105\\143.7899\\-202.2109\\105\\143.1518\\-206.1172\\105\\142.4703\\-211.9766\\105\\142.1348\\-213.9297\\105\\141.6016\\-215.8596\\105\\140.9368\\-217.8359\\105\\140.4351\\-219.7891\\105\\139.7298\\-221.7422\\105\\138.7933\\-223.6953\\105\\138.0076\\-225.6484\\105\\136.903\\-227.6016\\105\\136.0899\\-229.5547\\105\\134.847\\-231.5078\\105\\132.0426\\-235.4141\\105\\128.7179\\-239.3203\\105\\125.9766\\-242.0724\\105\\122.3232\\-245.1797\\105\\117.4229\\-249.0859\\105\\114.2578\\-251.4412\\105\\112.3047\\-252.7663\\105\\108.3984\\-255.8394\\105\\106.4453\\-257.2989\\105\\104.4922\\-258.6423\\105\\100.5859\\-261.8606\\105\\88.86719\\-270.9547\\105\\86.65751\\-272.5234\\105\\83.00781\\-275.2979\\105\\81.05469\\-276.6025\\105\\79.10156\\-277.7338\\105\\77.14844\\-279.2829\\105\\75.19531\\-280.6794\\105\\73.24219\\-281.7018\\105\\71.28906\\-282.9632\\105\\69.33594\\-283.9072\\105\\68.92613\\-284.2422\\105\\65.77485\\-286.1953\\105\\65.42969\\-286.4813\\105\\63.47656\\-287.4099\\105\\61.52344\\-288.5892\\105\\59.57031\\-289.2878\\105\\57.61719\\-290.3039\\105\\55.66406\\-291.1287\\105\\53.71094\\-292.164\\105\\49.80469\\-293.7916\\105\\47.85156\\-294.6769\\105\\45.89844\\-295.1401\\105\\43.94531\\-295.7059\\105\\41.99219\\-296.5372\\105\\38.08594\\-297.4166\\105\\36.13281\\-298.2606\\105\\32.22656\\-299.1321\\105\\28.32031\\-300.2182\\105\\26.36719\\-300.5389\\105\\16.60156\\-301.6489\\105\\12.69531\\-302.1388\\105\\8.789063\\-302.3793\\105\\4.882813\\-302.51\\105\\-0.9765625\\-302.5497\\105\\-6.835938\\-302.461\\105\\-10.74219\\-302.2685\\105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "249" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "179" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-302.0608\\107\\-18.55469\\-301.4925\\107\\-26.36719\\-300.5728\\107\\-28.32031\\-300.2389\\107\\-32.22656\\-299.1468\\107\\-36.13281\\-298.2606\\107\\-38.08594\\-297.4351\\107\\-41.99219\\-296.566\\107\\-43.94531\\-295.7186\\107\\-45.89844\\-295.1421\\107\\-47.85156\\-294.724\\107\\-51.75781\\-293.0884\\107\\-53.71094\\-292.3516\\107\\-55.66406\\-291.2561\\107\\-57.61719\\-290.5349\\107\\-59.57031\\-289.4236\\107\\-61.52344\\-288.81\\107\\-63.47656\\-287.68\\107\\-65.42969\\-286.8601\\107\\-67.38281\\-285.577\\107\\-69.33594\\-284.6389\\107\\-71.28906\\-283.4163\\107\\-73.57124\\-282.2891\\107\\-77.03168\\-280.3359\\107\\-79.10156\\-279.0862\\107\\-81.05469\\-277.6689\\107\\-83.00781\\-276.7575\\107\\-84.96094\\-275.5514\\107\\-86.91406\\-274.5156\\107\\-88.86719\\-273.3519\\107\\-90.82031\\-271.94\\107\\-92.77344\\-270.9138\\107\\-94.72656\\-269.6712\\107\\-96.67969\\-268.6746\\107\\-98.63281\\-267.4679\\107\\-100.5859\\-266.0552\\107\\-102.5391\\-264.9162\\107\\-106.4453\\-262.3044\\107\\-108.3984\\-261.2272\\107\\-112.3047\\-258.1048\\107\\-116.2109\\-255.3039\\107\\-118.1641\\-253.5894\\107\\-118.7326\\-252.9922\\107\\-120.9322\\-251.0391\\107\\-124.0234\\-248.005\\107\\-128.3993\\-243.2266\\107\\-129.8912\\-241.2734\\107\\-131.2008\\-239.3203\\107\\-134.15\\-235.4141\\107\\-135.1497\\-233.4609\\107\\-136.3458\\-231.5078\\107\\-137.1189\\-229.5547\\107\\-138.2457\\-227.6016\\107\\-138.956\\-225.6484\\107\\-140.0482\\-223.6953\\107\\-140.7392\\-221.7422\\107\\-142.2289\\-217.8359\\107\\-143.0397\\-213.9297\\107\\-143.6691\\-211.9766\\107\\-144.1838\\-210.0234\\107\\-145.1159\\-204.1641\\107\\-145.8398\\-200.2578\\107\\-146.1936\\-196.3516\\107\\-146.3216\\-192.4453\\107\\-146.3741\\-188.5391\\107\\-146.1348\\-180.7266\\107\\-145.8772\\-176.8203\\107\\-145.5078\\-173.4311\\107\\-145.1643\\-170.9609\\107\\-144.7409\\-167.0547\\107\\-144.1767\\-161.1953\\107\\-143.7916\\-159.2422\\107\\-143.2705\\-157.2891\\107\\-142.8974\\-155.3359\\107\\-142.3598\\-151.4297\\107\\-141.9498\\-149.4766\\107\\-141.2362\\-147.5234\\107\\-140.2186\\-143.6172\\107\\-139.3684\\-141.6641\\107\\-138.1806\\-137.7578\\107\\-137.1872\\-135.8047\\107\\-136.6272\\-133.8516\\107\\-135.9634\\-131.8984\\107\\-134.967\\-129.9453\\107\\-134.173\\-127.9922\\107\\-132.9614\\-126.0391\\107\\-131.9328\\-124.0859\\107\\-130.7883\\-122.1328\\107\\-128.6048\\-118.2266\\107\\-125.9766\\-114.7842\\107\\-125.5516\\-114.3203\\107\\-122.5972\\-110.4141\\107\\-120.1172\\-107.8541\\107\\-116.2109\\-104.3385\\107\\-114.0185\\-102.6016\\107\\-110.3516\\-100.0531\\107\\-108.3984\\-99.02326\\107\\-107.9839\\-98.69531\\107\\-104.7247\\-96.74219\\107\\-100.5859\\-94.59833\\107\\-96.67969\\-93.19948\\107\\-94.72656\\-92.22768\\107\\-92.77344\\-91.56292\\107\\-90.82031\\-90.7033\\107\\-88.86719\\-90.04819\\107\\-86.91406\\-89.60979\\107\\-83.00781\\-88.40487\\107\\-81.05469\\-88.12\\107\\-75.19531\\-87.40983\\107\\-71.28906\\-86.73785\\107\\-67.38281\\-86.28555\\107\\-61.52344\\-85.90567\\107\\-53.71094\\-85.46854\\107\\-47.85156\\-85.2797\\107\\-43.94531\\-84.888\\107\\-40.03906\\-84.63405\\107\\-36.13281\\-84.45473\\107\\-30.27344\\-84.30067\\107\\-26.36719\\-84.30067\\107\\-20.50781\\-84.46293\\107\\-16.60156\\-84.68515\\107\\-12.69531\\-85.1234\\107\\-6.835938\\-85.95265\\107\\-4.882813\\-86.3156\\107\\-0.9765625\\-87.31909\\107\\0.9765625\\-87.59021\\107\\2.929688\\-87.5811\\107\\4.882813\\-87.2673\\107\\8.789063\\-86.53744\\107\\12.69531\\-85.72534\\107\\16.60156\\-84.58338\\107\\18.55469\\-84.19574\\107\\22.46094\\-83.78957\\107\\24.41406\\-83.66344\\107\\28.32031\\-83.55233\\107\\32.22656\\-83.51477\\107\\36.13281\\-83.60682\\107\\40.03906\\-83.82865\\107\\45.89844\\-84.08485\\107\\49.80469\\-84.28963\\107\\53.71094\\-84.55587\\107\\57.61719\\-84.9287\\107\\63.47656\\-85.58754\\107\\69.33594\\-86.05968\\107\\73.24219\\-86.46623\\107\\77.14844\\-87.29969\\107\\79.10156\\-87.6507\\107\\83.00781\\-88.16675\\107\\84.96094\\-88.55999\\107\\86.91406\\-89.2926\\107\\90.82031\\-90.26815\\107\\92.77344\\-91.06102\\107\\96.67969\\-92.3971\\107\\98.63281\\-93.3208\\107\\100.5859\\-93.92306\\107\\102.5391\\-94.73209\\107\\104.4922\\-95.75945\\107\\108.3984\\-98.1364\\107\\112.3047\\-100.9197\\107\\114.2578\\-102.1061\\107\\116.2109\\-103.7804\\107\\121.0801\\-108.4609\\107\\122.7944\\-110.4141\\107\\125.5132\\-114.3203\\107\\125.9766\\-114.8493\\107\\128.3736\\-118.2266\\107\\129.312\\-120.1797\\107\\130.5191\\-122.1328\\107\\131.2695\\-124.0859\\107\\132.4327\\-126.0391\\107\\133.2069\\-127.9922\\107\\134.2711\\-129.9453\\107\\134.8943\\-131.8984\\107\\136.408\\-135.8047\\107\\136.8266\\-137.7578\\107\\137.4111\\-139.7109\\107\\138.2041\\-141.6641\\107\\139.1849\\-145.5703\\107\\139.9208\\-147.5234\\107\\140.4097\\-149.4766\\107\\141.1668\\-153.3828\\107\\141.6855\\-155.3359\\107\\142.08\\-157.2891\\107\\142.3598\\-159.2422\\107\\143.05\\-167.0547\\107\\143.6974\\-172.9141\\107\\143.9909\\-176.8203\\107\\144.1606\\-182.6797\\107\\144.1153\\-190.4922\\107\\143.8042\\-196.3516\\107\\142.9523\\-204.1641\\107\\142.6079\\-208.0703\\107\\142.1029\\-211.9766\\107\\140.9875\\-215.8828\\107\\140.5289\\-217.8359\\107\\139.9565\\-219.7891\\107\\139.0381\\-221.7422\\107\\138.3929\\-223.6953\\107\\137.3175\\-225.6484\\107\\136.5642\\-227.6016\\107\\134.3763\\-231.5078\\107\\131.8359\\-234.8234\\107\\129.8828\\-237.2451\\107\\128.0692\\-239.3203\\107\\125.9766\\-241.4402\\107\\122.0703\\-244.7534\\107\\118.1641\\-248.1411\\107\\116.2109\\-249.7166\\107\\112.3047\\-252.4461\\107\\108.3984\\-255.7279\\107\\104.4922\\-258.5586\\107\\101.8905\\-260.8047\\107\\94.59577\\-266.6641\\107\\89.58549\\-270.5703\\107\\83.00781\\-275.4341\\107\\81.05469\\-276.8405\\107\\79.10156\\-277.9556\\107\\75.19531\\-280.9181\\107\\73.24219\\-281.8998\\107\\72.68847\\-282.2891\\107\\69.33594\\-284.2798\\107\\67.38281\\-285.3732\\107\\65.42969\\-286.7274\\107\\63.47656\\-287.6176\\107\\61.52344\\-288.8016\\107\\59.57031\\-289.4274\\107\\57.61719\\-290.5629\\107\\55.66406\\-291.2957\\107\\53.71094\\-292.4516\\107\\51.75781\\-293.1654\\107\\49.80469\\-294.0765\\107\\47.85156\\-294.8138\\107\\45.89844\\-295.2546\\107\\41.99219\\-296.6737\\107\\40.03906\\-297.0642\\107\\38.08594\\-297.6089\\107\\36.13281\\-298.4277\\107\\32.22656\\-299.2519\\107\\30.20198\\-299.8672\\107\\28.32031\\-300.3405\\107\\26.36719\\-300.6136\\107\\18.55469\\-301.5302\\107\\14.64844\\-302.0735\\107\\12.69531\\-302.2581\\107\\8.789063\\-302.4734\\107\\4.882813\\-302.5956\\107\\-2.929688\\-302.6145\\107\\-6.835938\\-302.5497\\107\\-10.74219\\-302.3921\\107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "245" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "180" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-301.9931\\109\\-20.50781\\-301.3722\\109\\-26.36719\\-300.654\\109\\-28.32031\\-300.3525\\109\\-30.27344\\-299.8748\\109\\-32.22656\\-299.264\\109\\-36.13281\\-298.4277\\109\\-38.08594\\-297.6068\\109\\-40.03906\\-297.0628\\109\\-41.99219\\-296.6808\\109\\-45.89844\\-295.2456\\109\\-47.85156\\-294.8187\\109\\-49.80469\\-294.1473\\109\\-51.75781\\-293.2103\\109\\-53.71094\\-292.528\\109\\-55.66406\\-291.3803\\109\\-57.61719\\-290.6797\\109\\-59.57031\\-289.5207\\109\\-61.52344\\-288.8963\\109\\-63.47656\\-287.8323\\109\\-65.42969\\-286.9363\\109\\-67.38281\\-285.6709\\109\\-69.33594\\-284.7334\\109\\-71.28906\\-283.4622\\109\\-73.24219\\-282.5754\\109\\-73.64309\\-282.2891\\109\\-77.0529\\-280.3359\\109\\-79.10156\\-279.0753\\109\\-81.05469\\-277.632\\109\\-83.32987\\-276.4297\\109\\-88.86719\\-273.2025\\109\\-90.82031\\-271.7365\\109\\-92.77344\\-270.562\\109\\-94.72656\\-269.5088\\109\\-96.67969\\-268.2537\\109\\-98.63281\\-267.1458\\109\\-99.20313\\-266.6641\\109\\-102.0713\\-264.7109\\109\\-102.5391\\-264.3016\\109\\-104.4922\\-263.2531\\109\\-108.0698\\-260.8047\\109\\-110.3516\\-259.1649\\109\\-116.2109\\-254.5138\\109\\-120.1172\\-250.8534\\109\\-122.0703\\-249.3057\\109\\-124.0234\\-247.2142\\109\\-127.9297\\-242.7993\\109\\-129.8828\\-240.3321\\109\\-132.0555\\-237.3672\\109\\-134.6079\\-233.4609\\109\\-136.6166\\-229.5547\\109\\-137.4152\\-227.6016\\109\\-138.4277\\-225.6484\\109\\-139.1569\\-223.6953\\109\\-140.2039\\-221.7422\\109\\-140.7936\\-219.7891\\109\\-142.194\\-215.8828\\109\\-142.941\\-211.9766\\109\\-143.9909\\-208.0703\\109\\-144.3257\\-206.1172\\109\\-145.6835\\-194.3984\\109\\-145.8268\\-190.4922\\109\\-145.8047\\-186.5859\\109\\-145.6163\\-182.6797\\109\\-145.1185\\-176.8203\\109\\-144.2192\\-165.1016\\109\\-143.988\\-163.1484\\109\\-143.1461\\-159.2422\\109\\-142.3523\\-153.3828\\109\\-141.9772\\-151.4297\\109\\-140.797\\-147.5234\\109\\-140.3562\\-145.5703\\109\\-138.9216\\-141.6641\\109\\-138.4318\\-139.7109\\109\\-136.8695\\-135.8047\\109\\-136.369\\-133.8516\\109\\-135.4411\\-131.8984\\109\\-134.6763\\-129.9453\\109\\-132.616\\-126.0391\\109\\-131.392\\-124.0859\\109\\-130.5106\\-122.1328\\109\\-129.2477\\-120.1797\\109\\-128.1357\\-118.2266\\109\\-126.6819\\-116.2734\\109\\-121.8921\\-110.4141\\109\\-120.1172\\-108.581\\109\\-115.7148\\-104.5547\\109\\-112.3047\\-101.8008\\109\\-110.3516\\-100.5284\\109\\-108.3984\\-99.45766\\109\\-106.4453\\-98.12962\\109\\-104.4922\\-97.1451\\109\\-102.5391\\-95.95972\\109\\-100.5859\\-95.13581\\109\\-98.63281\\-94.11446\\109\\-96.67969\\-93.57145\\109\\-94.72656\\-92.64893\\109\\-92.77344\\-91.92484\\109\\-90.82031\\-91.29851\\109\\-88.86719\\-90.43258\\109\\-84.96094\\-89.52173\\109\\-81.05469\\-88.45151\\109\\-79.10156\\-88.15217\\109\\-73.24219\\-87.54511\\109\\-71.28906\\-87.30451\\109\\-67.38281\\-86.66267\\109\\-61.52344\\-86.20766\\109\\-55.66406\\-85.93226\\109\\-53.71094\\-85.78164\\109\\-47.85156\\-85.59753\\109\\-40.03906\\-84.94267\\109\\-36.13281\\-84.69791\\109\\-30.27344\\-84.5322\\109\\-26.36719\\-84.5322\\109\\-22.46094\\-84.6365\\109\\-16.60156\\-85.01581\\109\\-10.74219\\-85.68062\\109\\-6.835938\\-86.29178\\109\\-4.882813\\-86.70058\\109\\-2.929688\\-87.38287\\109\\-0.9765625\\-87.73611\\109\\0.9765625\\-87.90399\\109\\2.929688\\-87.88599\\109\\6.835938\\-87.47182\\109\\8.789063\\-87.08148\\109\\10.74219\\-86.52734\\109\\14.64844\\-85.62679\\109\\18.55469\\-84.616\\109\\22.46094\\-84.07594\\109\\24.41406\\-83.939\\109\\32.22656\\-83.76786\\109\\36.13281\\-83.80979\\109\\45.89844\\-84.25653\\109\\51.75781\\-84.69791\\109\\57.61719\\-85.37553\\109\\69.33594\\-86.33533\\109\\71.28906\\-86.57132\\109\\75.19531\\-87.32584\\109\\77.14844\\-87.6424\\109\\81.05469\\-88.11588\\109\\83.00781\\-88.49492\\109\\86.91406\\-89.68131\\109\\88.86719\\-90.10262\\109\\90.82031\\-90.71886\\109\\92.77344\\-91.54734\\109\\94.72656\\-92.07334\\109\\96.67969\\-92.92471\\109\\98.63281\\-93.66509\\109\\100.5859\\-94.23389\\109\\102.5391\\-95.26695\\109\\104.4922\\-96.15887\\109\\106.4453\\-97.49194\\109\\110.3516\\-100.0042\\109\\114.0527\\-102.6016\\109\\116.2109\\-104.3691\\109\\120.1172\\-108.0509\\109\\122.2796\\-110.4141\\109\\123.5574\\-112.3672\\109\\126.5892\\-116.2734\\109\\127.9297\\-118.4374\\109\\130.075\\-122.1328\\109\\130.8945\\-124.0859\\109\\131.9328\\-126.0391\\109\\133.7891\\-130.0945\\109\\134.5576\\-131.8984\\109\\135.1318\\-133.8516\\109\\135.9863\\-135.8047\\109\\136.5519\\-137.7578\\109\\136.9644\\-139.7109\\109\\137.5625\\-141.6641\\109\\138.3188\\-143.6172\\109\\139.1944\\-147.5234\\109\\139.9208\\-149.4766\\109\\140.3902\\-151.4297\\109\\141.0461\\-155.3359\\109\\141.9155\\-159.2422\\109\\142.4033\\-163.1484\\109\\142.56\\-165.1016\\109\\143.285\\-176.8203\\109\\143.5785\\-182.6797\\109\\143.5785\\-186.5859\\109\\143.4991\\-190.4922\\109\\143.2339\\-194.3984\\109\\143.0238\\-198.3047\\109\\142.4888\\-206.1172\\109\\142.2956\\-208.0703\\109\\141.9772\\-210.0234\\109\\140.9563\\-213.9297\\109\\140.0776\\-217.8359\\109\\139.1982\\-219.7891\\109\\138.5874\\-221.7422\\109\\137.8192\\-223.6953\\109\\136.8556\\-225.6484\\109\\136.1228\\-227.6016\\109\\133.7891\\-231.3145\\109\\132.3369\\-233.4609\\109\\129.8828\\-236.4982\\109\\127.314\\-239.3203\\109\\124.0234\\-242.578\\109\\122.0703\\-244.2506\\109\\121.1215\\-245.1797\\109\\118.8217\\-247.1328\\109\\118.1641\\-247.7861\\109\\116.2109\\-249.3987\\109\\114.2578\\-250.6646\\109\\112.3047\\-252.2193\\109\\108.3984\\-255.6209\\109\\104.4922\\-258.5285\\109\\101.9149\\-260.8047\\109\\94.72656\\-266.7448\\109\\90.82031\\-269.6927\\109\\89.79762\\-270.5703\\109\\86.91406\\-272.8213\\109\\81.05469\\-277.0423\\109\\79.10156\\-278.2665\\109\\75.19531\\-281.1184\\109\\71.28906\\-283.3083\\109\\69.33594\\-284.6241\\109\\67.38281\\-285.6227\\109\\65.42969\\-286.938\\109\\63.47656\\-287.8914\\109\\61.52344\\-288.9673\\109\\59.57031\\-289.6033\\109\\57.61719\\-290.7835\\109\\55.66406\\-291.5109\\109\\53.71094\\-292.6664\\109\\51.75781\\-293.3549\\109\\49.80469\\-294.3401\\109\\47.85156\\-294.9432\\109\\45.89844\\-295.3983\\109\\43.94531\\-296.2369\\109\\41.99219\\-296.7836\\109\\40.03906\\-297.1953\\109\\36.13281\\-298.5599\\109\\32.22656\\-299.3972\\109\\30.27344\\-300.0416\\109\\28.32031\\-300.4474\\109\\20.50781\\-301.4066\\109\\16.60156\\-301.9931\\109\\12.69531\\-302.37\\109\\6.835938\\-302.6263\\109\\0.9765625\\-302.7003\\109\\-4.882813\\-302.6697\\109\\-10.74219\\-302.5021\\109\\-14.64844\\-302.2232\\109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "181" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-301.4925\\111\\-28.32031\\-300.4589\\111\\-30.27344\\-300.0666\\111\\-32.22656\\-299.4227\\111\\-36.13281\\-298.5668\\111\\-40.03906\\-297.1857\\111\\-41.99219\\-296.7791\\111\\-43.94531\\-296.1723\\111\\-45.89844\\-295.3724\\111\\-47.85156\\-294.9134\\111\\-49.80469\\-294.3265\\111\\-51.75781\\-293.3357\\111\\-53.71094\\-292.6629\\111\\-55.66406\\-291.5141\\111\\-57.61719\\-290.8045\\111\\-59.57031\\-289.6331\\111\\-61.52344\\-288.9984\\111\\-65.42969\\-287.0299\\111\\-67.38281\\-285.8008\\111\\-69.33594\\-284.817\\111\\-71.28906\\-283.5067\\111\\-73.24219\\-282.6146\\111\\-75.19531\\-281.4029\\111\\-77.09478\\-280.3359\\111\\-79.10156\\-279.0598\\111\\-81.05469\\-277.6095\\111\\-83.00781\\-276.5746\\111\\-84.96094\\-275.404\\111\\-86.91406\\-274.1354\\111\\-88.86719\\-273.0384\\111\\-90.82031\\-271.5807\\111\\-92.77344\\-270.221\\111\\-94.72656\\-269.3257\\111\\-96.67969\\-267.9381\\111\\-98.63281\\-266.6883\\111\\-101.5302\\-264.7109\\111\\-102.5391\\-263.9131\\111\\-106.4453\\-261.4967\\111\\-112.3047\\-256.89\\111\\-114.2578\\-255.5617\\111\\-116.2109\\-253.8641\\111\\-120.1172\\-250.1471\\111\\-122.0703\\-248.4273\\111\\-126.847\\-243.2266\\111\\-128.5453\\-241.2734\\111\\-131.1826\\-237.3672\\111\\-131.8359\\-236.5184\\111\\-133.8882\\-233.4609\\111\\-136.0092\\-229.5547\\111\\-136.8001\\-227.6016\\111\\-138.5448\\-223.6953\\111\\-139.284\\-221.7422\\111\\-140.2196\\-219.7891\\111\\-141.3756\\-215.8828\\111\\-142.0591\\-213.9297\\111\\-142.4786\\-211.9766\\111\\-143.1183\\-208.0703\\111\\-144.0397\\-204.1641\\111\\-144.2929\\-202.2109\\111\\-144.6094\\-198.3047\\111\\-144.8468\\-194.3984\\111\\-144.9632\\-190.4922\\111\\-144.9667\\-186.5859\\111\\-144.7052\\-178.7734\\111\\-144.3988\\-172.9141\\111\\-144.1048\\-169.0078\\111\\-143.5941\\-165.1016\\111\\-142.9532\\-161.1953\\111\\-142.2796\\-155.3359\\111\\-141.8796\\-153.3828\\111\\-141.3058\\-151.4297\\111\\-140.4026\\-147.5234\\111\\-139.8253\\-145.5703\\111\\-139.019\\-143.6172\\111\\-138.0034\\-139.7109\\111\\-137.0939\\-137.7578\\111\\-136.589\\-135.8047\\111\\-135.9219\\-133.8516\\111\\-134.9847\\-131.8984\\111\\-134.2678\\-129.9453\\111\\-133.0906\\-127.9922\\111\\-132.1706\\-126.0391\\111\\-130.9792\\-124.0859\\111\\-130.0904\\-122.1328\\111\\-128.8737\\-120.1797\\111\\-126.1561\\-116.2734\\111\\-123.0259\\-112.3672\\111\\-121.2773\\-110.4141\\111\\-118.1641\\-107.2963\\111\\-115.1199\\-104.5547\\111\\-112.3047\\-102.2834\\111\\-109.7636\\-100.6484\\111\\-106.4453\\-98.6277\\111\\-104.4922\\-97.61349\\111\\-102.5391\\-96.32366\\111\\-100.5859\\-95.52759\\111\\-98.63281\\-94.47569\\111\\-94.72656\\-93.23354\\111\\-92.77344\\-92.3147\\111\\-90.82031\\-91.75893\\111\\-86.91406\\-90.31217\\111\\-83.00781\\-89.49731\\111\\-79.10156\\-88.51517\\111\\-75.19531\\-87.98952\\111\\-71.28906\\-87.67591\\111\\-65.42969\\-87.03306\\111\\-61.52344\\-86.54037\\111\\-59.57031\\-86.40033\\111\\-55.66406\\-86.21889\\111\\-49.80469\\-85.88214\\111\\-47.85156\\-85.82345\\111\\-41.99219\\-85.46384\\111\\-36.13281\\-85.01581\\111\\-32.22656\\-84.90137\\111\\-26.36719\\-84.79964\\111\\-22.46094\\-84.98588\\111\\-16.60156\\-85.37553\\111\\-12.69531\\-85.72013\\111\\-8.789063\\-86.30003\\111\\-6.835938\\-86.63958\\111\\-2.929688\\-87.73891\\111\\0.9765625\\-88.15971\\111\\2.929688\\-88.12729\\111\\6.835938\\-87.84116\\111\\8.789063\\-87.60341\\111\\12.69531\\-86.44102\\111\\14.64844\\-85.93529\\111\\20.50781\\-84.71331\\111\\22.46094\\-84.43871\\111\\26.36719\\-84.11901\\111\\32.22656\\-83.97635\\111\\38.08594\\-84.04688\\111\\45.89844\\-84.46948\\111\\49.80469\\-84.81174\\111\\53.71094\\-85.31709\\111\\55.66406\\-85.51172\\111\\61.52344\\-85.94032\\111\\67.38281\\-86.42993\\111\\69.33594\\-86.67662\\111\\73.24219\\-87.37416\\111\\75.19531\\-87.65508\\111\\79.10156\\-88.09692\\111\\81.05469\\-88.3929\\111\\84.96094\\-89.55539\\111\\88.86719\\-90.4687\\111\\90.82031\\-91.32322\\111\\94.72656\\-92.49317\\111\\96.67969\\-93.4139\\111\\98.63281\\-93.94934\\111\\102.5391\\-95.69676\\111\\104.4806\\-96.74219\\111\\107.5627\\-98.69531\\111\\108.3984\\-99.32059\\111\\112.3047\\-101.7969\\111\\115.6586\\-104.5547\\111\\120.1172\\-108.789\\111\\121.582\\-110.4141\\111\\124.6378\\-114.3203\\111\\125.9996\\-116.2734\\111\\128.5608\\-120.1797\\111\\129.448\\-122.1328\\111\\130.5857\\-124.0859\\111\\131.3039\\-126.0391\\111\\132.4016\\-127.9922\\111\\133.1281\\-129.9453\\111\\134.1302\\-131.8984\\111\\135.3698\\-135.8047\\111\\136.1677\\-137.7578\\111\\136.646\\-139.7109\\111\\137.0136\\-141.6641\\111\\138.3334\\-145.5703\\111\\139.1478\\-149.4766\\111\\139.8241\\-151.4297\\111\\140.275\\-153.3828\\111\\140.8395\\-157.2891\\111\\141.9409\\-163.1484\\111\\142.1913\\-165.1016\\111\\142.4756\\-169.0078\\111\\142.686\\-172.9141\\111\\142.97\\-182.6797\\111\\142.9572\\-188.5391\\111\\142.8889\\-192.4453\\111\\142.5781\\-200.2578\\111\\142.3\\-204.1641\\111\\142.0931\\-206.1172\\111\\141.7581\\-208.0703\\111\\141.2581\\-210.0234\\111\\140.5029\\-213.9297\\111\\140.0679\\-215.8828\\111\\139.2723\\-217.8359\\111\\138.1022\\-221.7422\\111\\137.1041\\-223.6953\\111\\136.4841\\-225.6484\\111\\135.3903\\-227.6016\\111\\134.4069\\-229.5547\\111\\133.7891\\-230.3376\\111\\130.1804\\-235.4141\\111\\128.5335\\-237.3672\\111\\124.0234\\-242.0475\\111\\120.6167\\-245.1797\\111\\118.1641\\-247.3594\\111\\116.1066\\-249.0859\\111\\114.2578\\-250.3902\\111\\112.3047\\-252.0099\\111\\110.3516\\-253.819\\111\\108.3984\\-255.5243\\111\\104.4922\\-258.5412\\111\\101.9546\\-260.8047\\111\\99.57862\\-262.7578\\111\\94.72656\\-266.9557\\111\\90.82031\\-269.8532\\111\\86.91406\\-273.0422\\111\\84.96094\\-274.5504\\111\\83.00781\\-275.8033\\111\\82.23815\\-276.4297\\111\\79.40383\\-278.3828\\111\\79.10156\\-278.667\\111\\75.19531\\-281.3125\\111\\73.24219\\-282.5237\\111\\71.28906\\-283.505\\111\\69.33594\\-284.8801\\111\\63.47656\\-288.25\\111\\59.57031\\-289.8854\\111\\57.61719\\-290.9586\\111\\55.66406\\-291.814\\111\\53.71094\\-292.8537\\111\\51.75781\\-293.5802\\111\\49.80469\\-294.5468\\111\\45.89844\\-295.5689\\111\\43.94531\\-296.4396\\111\\40.03906\\-297.3434\\111\\38.08594\\-298.1616\\111\\36.13281\\-298.6904\\111\\34.17969\\-299.0808\\111\\32.22656\\-299.5891\\111\\30.27344\\-300.216\\111\\28.32031\\-300.5463\\111\\20.50781\\-301.5423\\111\\16.60156\\-302.1621\\111\\12.69531\\-302.4817\\111\\6.835938\\-302.7003\\111\\0.9765625\\-302.7748\\111\\-4.882813\\-302.7411\\111\\-10.74219\\-302.5956\\111\\-14.64844\\-302.3477\\111\\-16.60156\\-302.1505\\111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "252" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "182" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-302.0201\\113\\-20.50781\\-301.6353\\113\\-24.41406\\-301.0594\\113\\-28.32031\\-300.5575\\113\\-30.27344\\-300.216\\113\\-32.22656\\-299.599\\113\\-36.13281\\-298.6807\\113\\-38.08594\\-298.1258\\113\\-40.03906\\-297.3144\\113\\-43.94531\\-296.3662\\113\\-45.89844\\-295.5097\\113\\-49.80469\\-294.4865\\113\\-51.75781\\-293.4857\\113\\-53.71094\\-292.7712\\113\\-55.66406\\-291.6703\\113\\-57.61719\\-290.9128\\113\\-59.57031\\-289.7831\\113\\-61.52344\\-289.0895\\113\\-63.47656\\-288.2036\\113\\-69.33594\\-284.9023\\113\\-71.28906\\-283.5555\\113\\-73.24219\\-282.6755\\113\\-75.19531\\-281.4391\\113\\-77.14844\\-280.3439\\113\\-79.10156\\-279.0676\\113\\-81.05469\\-277.5869\\113\\-83.00781\\-276.5305\\113\\-84.96094\\-275.3412\\113\\-86.91406\\-274.0106\\113\\-88.86719\\-272.8722\\113\\-92.06543\\-270.5703\\113\\-92.77344\\-270.0001\\113\\-94.72656\\-269.0845\\113\\-98.63281\\-266.2018\\113\\-100.5859\\-264.9833\\113\\-104.4922\\-262.2309\\113\\-106.4453\\-260.9788\\113\\-108.3984\\-259.5005\\113\\-112.3047\\-256.2726\\113\\-114.0498\\-254.9453\\113\\-116.2109\\-253.125\\113\\-118.4372\\-251.0391\\113\\-120.1172\\-249.592\\113\\-122.6519\\-247.1328\\113\\-126.0173\\-243.2266\\113\\-127.9297\\-240.9326\\113\\-130.5496\\-237.3672\\113\\-133.7891\\-232.2136\\113\\-134.2876\\-231.5078\\113\\-135.1617\\-229.5547\\113\\-136.2817\\-227.6016\\113\\-136.9128\\-225.6484\\113\\-137.8762\\-223.6953\\113\\-139.2755\\-219.7891\\113\\-140.1772\\-217.8359\\113\\-141.183\\-213.9297\\113\\-141.8566\\-211.9766\\113\\-142.31\\-210.0234\\113\\-143.1655\\-204.1641\\113\\-143.8802\\-200.2578\\113\\-144.1083\\-198.3047\\113\\-144.3325\\-194.3984\\113\\-144.427\\-190.4922\\113\\-144.439\\-186.5859\\113\\-144.3894\\-182.6797\\113\\-144.1799\\-176.8203\\113\\-143.8802\\-172.9141\\113\\-143.6546\\-170.9609\\113\\-143.1003\\-167.0547\\113\\-142.5781\\-161.1953\\113\\-142.1193\\-157.2891\\113\\-141.716\\-155.3359\\113\\-141.1553\\-153.3828\\113\\-140.3795\\-149.4766\\113\\-139.8507\\-147.5234\\113\\-139.0553\\-145.5703\\113\\-138.0772\\-141.6641\\113\\-137.3119\\-139.7109\\113\\-136.188\\-135.8047\\113\\-135.2782\\-133.8516\\113\\-134.6029\\-131.8984\\113\\-132.6788\\-127.9922\\113\\-131.5178\\-126.0391\\113\\-130.6431\\-124.0859\\113\\-129.4592\\-122.1328\\113\\-128.463\\-120.1797\\113\\-127.0203\\-118.2266\\113\\-125.4433\\-116.2734\\113\\-124.0316\\-114.3203\\113\\-122.4594\\-112.3672\\113\\-120.7092\\-110.4141\\113\\-118.1641\\-107.8793\\113\\-114.2578\\-104.4445\\113\\-111.8738\\-102.6016\\113\\-108.3984\\-100.2058\\113\\-106.4453\\-99.23711\\113\\-104.4922\\-97.96733\\113\\-100.5859\\-95.83943\\113\\-96.67969\\-94.09334\\113\\-94.72656\\-93.62078\\113\\-90.82031\\-92.10491\\113\\-88.86719\\-91.5676\\113\\-86.91406\\-90.83023\\113\\-84.96094\\-90.23748\\113\\-81.05469\\-89.55059\\113\\-77.14844\\-88.64116\\113\\-75.19531\\-88.27649\\113\\-69.33594\\-87.76887\\113\\-65.42969\\-87.52423\\113\\-61.52344\\-87.03306\\113\\-57.61719\\-86.61713\\113\\-45.89844\\-85.92276\\113\\-41.99219\\-85.72179\\113\\-36.13281\\-85.35574\\113\\-30.27344\\-85.30343\\113\\-26.36719\\-85.17999\\113\\-16.60156\\-85.62855\\113\\-14.64844\\-85.79441\\113\\-10.74219\\-86.25967\\113\\-8.789063\\-86.60614\\113\\-4.882813\\-87.61683\\113\\-2.929688\\-87.96526\\113\\0.9765625\\-88.46892\\113\\2.929688\\-88.45516\\113\\8.789063\\-87.89819\\113\\10.74219\\-87.5811\\113\\14.64844\\-86.29178\\113\\16.60156\\-85.86787\\113\\18.55469\\-85.58418\\113\\22.46094\\-84.84779\\113\\26.36719\\-84.43522\\113\\30.27344\\-84.23447\\113\\34.17969\\-84.16964\\113\\38.08594\\-84.24331\\113\\45.89844\\-84.67692\\113\\47.85156\\-84.824\\113\\51.75781\\-85.37315\\113\\55.66406\\-85.73214\\113\\59.57031\\-85.9839\\113\\63.47656\\-86.31595\\113\\67.38281\\-86.77979\\113\\71.28906\\-87.43094\\113\\73.24219\\-87.69188\\113\\77.14844\\-88.07295\\113\\79.10156\\-88.33115\\113\\81.05469\\-88.78696\\113\\83.00781\\-89.43352\\113\\86.91406\\-90.28571\\113\\88.86719\\-91.06232\\113\\90.82031\\-91.71289\\113\\92.77344\\-92.23978\\113\\94.72656\\-93.10967\\113\\96.67969\\-93.75185\\113\\98.63281\\-94.29053\\113\\100.5859\\-95.31033\\113\\102.5391\\-96.08476\\113\\104.4922\\-97.38223\\113\\106.4453\\-98.5\\113\\112.3047\\-102.3613\\113\\115.0625\\-104.5547\\113\\118.1641\\-107.4042\\113\\120.1172\\-109.3887\\113\\122.7144\\-112.3672\\113\\124.1101\\-114.3203\\113\\125.3451\\-116.2734\\113\\126.7913\\-118.2266\\113\\128.0625\\-120.1797\\113\\129.0394\\-122.1328\\113\\130.1437\\-124.0859\\113\\130.92\\-126.0391\\113\\132.7046\\-129.9453\\113\\133.4383\\-131.8984\\113\\134.3858\\-133.8516\\113\\135.5378\\-137.7578\\113\\136.284\\-139.7109\\113\\137.0546\\-143.6172\\113\\138.3036\\-147.5234\\113\\139.0417\\-151.4297\\113\\140.1155\\-155.3359\\113\\141.2018\\-163.1484\\113\\141.5482\\-165.1016\\113\\142.0569\\-169.0078\\113\\142.3355\\-172.9141\\113\\142.5302\\-178.7734\\113\\142.6079\\-182.6797\\113\\142.5901\\-188.5391\\113\\142.5359\\-192.4453\\113\\142.4223\\-196.3516\\113\\142.2127\\-200.2578\\113\\141.7581\\-204.1641\\113\\141.0304\\-208.0703\\113\\140.4026\\-211.9766\\113\\139.9696\\-213.9297\\113\\139.2437\\-215.8828\\113\\138.2102\\-219.7891\\113\\137.3061\\-221.7422\\113\\136.6819\\-223.6953\\113\\135.9205\\-225.6484\\113\\133.7891\\-229.3988\\113\\132.3836\\-231.5078\\113\\130.8281\\-233.4609\\113\\129.8828\\-234.8138\\113\\127.9297\\-237.1592\\113\\125.9014\\-239.3203\\113\\124.0234\\-241.4203\\113\\122.0703\\-243.3661\\113\\120.1172\\-245.0263\\113\\115.673\\-249.0859\\113\\114.2578\\-250.1496\\113\\111.0397\\-252.9922\\113\\108.3984\\-255.4408\\113\\104.4922\\-258.554\\113\\102.0358\\-260.8047\\113\\99.6933\\-262.7578\\113\\94.72656\\-267.1555\\113\\90.82031\\-270.0357\\113\\86.91406\\-273.2804\\113\\84.96094\\-274.8363\\113\\81.05469\\-277.4173\\113\\79.10156\\-278.9764\\113\\77.14844\\-280.3753\\113\\75.19531\\-281.509\\113\\73.24219\\-282.8211\\113\\71.28906\\-283.7677\\113\\70.69798\\-284.2422\\113\\67.38281\\-286.3735\\113\\65.42969\\-287.3565\\113\\63.47656\\-288.5571\\113\\61.52344\\-289.2368\\113\\59.57031\\-290.2523\\113\\57.61719\\-291.1194\\113\\55.66406\\-292.2033\\113\\49.80469\\-294.7054\\113\\47.85156\\-295.1736\\113\\45.89844\\-295.802\\113\\43.94531\\-296.5983\\113\\41.99219\\-297.0043\\113\\40.03906\\-297.5247\\113\\38.08594\\-298.367\\113\\34.17969\\-299.2253\\113\\30.27344\\-300.3525\\113\\28.32031\\-300.6429\\113\\22.46094\\-301.3855\\113\\18.55469\\-302.0349\\113\\16.60156\\-302.302\\113\\12.69531\\-302.5765\\113\\6.835938\\-302.7638\\113\\0.9765625\\-302.8344\\113\\-4.882813\\-302.8023\\113\\-8.789063\\-302.7291\\113\\-12.69531\\-302.5838\\113\\-16.60156\\-302.2818\\113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "183" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-302.1505\\115\\-22.46094\\-301.4337\\115\\-28.32031\\-300.6495\\115\\-30.27344\\-300.3434\\115\\-32.11031\\-299.8672\\115\\-34.17969\\-299.2216\\115\\-38.08594\\-298.3205\\115\\-40.03906\\-297.4793\\115\\-43.94531\\-296.5457\\115\\-45.89844\\-295.6665\\115\\-49.80469\\-294.6036\\115\\-51.75781\\-293.6473\\115\\-53.71094\\-292.8736\\115\\-55.66406\\-291.8538\\115\\-57.61719\\-291.0065\\115\\-59.57031\\-289.9853\\115\\-63.47656\\-288.3778\\115\\-69.33594\\-284.9987\\115\\-71.28906\\-283.623\\115\\-73.24219\\-282.7329\\115\\-75.19531\\-281.4651\\115\\-77.14844\\-280.375\\115\\-79.10156\\-279.0718\\115\\-81.05469\\-277.5802\\115\\-83.00781\\-276.5006\\115\\-84.96094\\-275.3163\\115\\-86.91406\\-273.9177\\115\\-88.86719\\-272.7104\\115\\-92.77344\\-269.8664\\115\\-94.72656\\-268.7954\\115\\-96.67969\\-267.4318\\115\\-98.63281\\-265.8512\\115\\-100.5859\\-264.45\\115\\-102.5391\\-263.28\\115\\-108.3984\\-258.8594\\115\\-112.3047\\-255.793\\115\\-114.2578\\-254.0867\\115\\-120.1172\\-248.6674\\115\\-121.6872\\-247.1328\\115\\-125.1157\\-243.2266\\115\\-125.9766\\-242.3115\\115\\-128.4539\\-239.3203\\115\\-130.938\\-235.4141\\115\\-132.3178\\-233.4609\\115\\-133.2705\\-231.5078\\115\\-134.5408\\-229.5547\\115\\-135.3616\\-227.6016\\115\\-136.3685\\-225.6484\\115\\-136.9893\\-223.6953\\115\\-137.9005\\-221.7422\\115\\-139.17\\-217.8359\\115\\-139.9896\\-215.8828\\115\\-140.9444\\-211.9766\\115\\-142.0379\\-208.0703\\115\\-142.3562\\-206.1172\\115\\-143.2096\\-198.3047\\115\\-143.5941\\-194.3984\\115\\-143.8042\\-190.4922\\115\\-143.8525\\-186.5859\\115\\-143.7916\\-182.6797\\115\\-143.5627\\-178.7734\\115\\-143.2002\\-174.8672\\115\\-142.6575\\-167.0547\\115\\-142.1456\\-161.1953\\115\\-140.9525\\-155.3359\\115\\-140.2552\\-151.4297\\115\\-139.7155\\-149.4766\\115\\-139.0033\\-147.5234\\115\\-138.0591\\-143.6172\\115\\-137.3147\\-141.6641\\115\\-136.3281\\-137.7578\\115\\-135.4813\\-135.8047\\115\\-134.0792\\-131.8984\\115\\-133.0042\\-129.9453\\115\\-132.1637\\-127.9922\\115\\-131.0106\\-126.0391\\115\\-130.1586\\-124.0859\\115\\-127.9297\\-120.3424\\115\\-126.5206\\-118.2266\\115\\-124.0234\\-115.0671\\115\\-121.7599\\-112.3672\\115\\-120.1172\\-110.5403\\115\\-118.1641\\-108.5189\\115\\-115.9712\\-106.5078\\115\\-113.5938\\-104.5547\\115\\-110.3516\\-101.9757\\115\\-108.214\\-100.6484\\115\\-106.4453\\-99.66585\\115\\-104.4922\\-98.40932\\115\\-102.5391\\-97.40747\\115\\-100.5859\\-96.19022\\115\\-98.63281\\-95.4632\\115\\-96.67969\\-94.48801\\115\\-94.72656\\-93.86609\\115\\-92.77344\\-93.39304\\115\\-90.82031\\-92.51479\\115\\-86.91406\\-91.43823\\115\\-84.96094\\-90.7059\\115\\-83.00781\\-90.2489\\115\\-77.14844\\-89.26431\\115\\-75.19531\\-88.75283\\115\\-73.24219\\-88.4111\\115\\-69.33594\\-88.02591\\115\\-65.42969\\-87.818\\115\\-59.57031\\-87.3401\\115\\-55.66406\\-86.84787\\115\\-49.80469\\-86.39896\\115\\-45.89844\\-86.18105\\115\\-38.08594\\-85.69592\\115\\-36.13281\\-85.62022\\115\\-30.27344\\-85.5857\\115\\-26.36719\\-85.52117\\115\\-20.50781\\-85.68423\\115\\-16.60156\\-85.8467\\115\\-12.69531\\-86.25256\\115\\-10.74219\\-86.54037\\115\\-6.835938\\-87.55849\\115\\-2.929688\\-88.20979\\115\\0.9765625\\-89.04237\\115\\2.929688\\-89.05838\\115\\8.789063\\-88.13973\\115\\10.74219\\-87.89092\\115\\12.69531\\-87.44728\\115\\14.64844\\-86.64194\\115\\16.60156\\-86.18521\\115\\24.56826\\-85.02344\\115\\26.36719\\-84.78771\\115\\30.27344\\-84.51469\\115\\36.13281\\-84.39359\\115\\40.03906\\-84.53226\\115\\45.89844\\-84.86185\\115\\47.85156\\-85.04688\\115\\51.75781\\-85.58062\\115\\59.57031\\-86.18105\\115\\63.47656\\-86.56365\\115\\67.38281\\-87.19275\\115\\71.28906\\-87.69971\\115\\77.14844\\-88.28071\\115\\79.10156\\-88.67837\\115\\81.05469\\-89.30327\\115\\84.96094\\-90.15314\\115\\86.91406\\-90.75983\\115\\88.86719\\-91.54343\\115\\90.82031\\-92.03645\\115\\92.77344\\-92.69951\\115\\94.72656\\-93.54332\\115\\96.67969\\-94.01411\\115\\100.5859\\-95.6946\\115\\102.5391\\-96.64063\\115\\104.4922\\-97.87327\\115\\106.4453\\-99.22861\\115\\108.3984\\-100.2421\\115\\111.7374\\-102.6016\\115\\114.2578\\-104.5171\\115\\118.1641\\-108.0108\\115\\120.4542\\-110.4141\\115\\122.096\\-112.3672\\115\\126.3248\\-118.2266\\115\\127.4111\\-120.1797\\115\\128.6716\\-122.1328\\115\\129.5022\\-124.0859\\115\\130.5446\\-126.0391\\115\\131.2086\\-127.9922\\115\\132.2428\\-129.9453\\115\\132.9129\\-131.8984\\115\\133.7968\\-133.8516\\115\\134.5127\\-135.8047\\115\\135.019\\-137.7578\\115\\136.3386\\-141.6641\\115\\137.038\\-145.5703\\115\\138.2127\\-149.4766\\115\\138.8683\\-153.3828\\115\\139.2723\\-155.3359\\115\\139.8112\\-157.2891\\115\\140.1838\\-159.2422\\115\\141.0762\\-167.0547\\115\\141.7717\\-172.9141\\115\\142.0229\\-176.8203\\115\\142.1605\\-180.7266\\115\\142.2079\\-186.5859\\115\\142.1642\\-190.4922\\115\\141.9294\\-196.3516\\115\\141.7717\\-198.3047\\115\\140.7731\\-206.1172\\115\\140.2321\\-210.0234\\115\\139.7586\\-211.9766\\115\\139.0999\\-213.9297\\115\\138.2166\\-217.8359\\115\\137.409\\-219.7891\\115\\136.1989\\-223.6953\\115\\135.1509\\-225.6484\\115\\134.2839\\-227.6016\\115\\131.4468\\-231.5078\\115\\128.7458\\-235.4141\\115\\125.1518\\-239.3203\\115\\124.0234\\-240.6148\\115\\121.5439\\-243.2266\\115\\120.1172\\-244.4522\\115\\116.2109\\-248.2654\\115\\112.3047\\-251.7176\\115\\108.3984\\-255.4155\\115\\104.4922\\-258.6094\\115\\102.1949\\-260.8047\\115\\100.5859\\-262.1046\\115\\98.63281\\-263.8069\\115\\94.72656\\-267.3378\\115\\92.77344\\-268.8973\\115\\90.82031\\-270.268\\115\\86.91406\\-273.5229\\115\\84.96094\\-275.0894\\115\\82.99842\\-276.4297\\115\\81.05469\\-277.6475\\115\\79.10156\\-279.2307\\115\\77.14844\\-280.7083\\115\\75.19531\\-281.7227\\115\\73.24219\\-283.0591\\115\\71.28906\\-284.1221\\115\\69.33594\\-285.3415\\115\\67.38281\\-286.6805\\115\\65.42969\\-287.5895\\115\\63.47656\\-288.7758\\115\\61.52344\\-289.3766\\115\\59.57031\\-290.5432\\115\\57.61719\\-291.2964\\115\\55.66406\\-292.4706\\115\\53.71094\\-293.202\\115\\51.75781\\-294.1494\\115\\49.80469\\-294.8423\\115\\47.85156\\-295.3036\\115\\45.89844\\-296.0754\\115\\43.94531\\-296.7302\\115\\41.99219\\-297.1296\\115\\40.03906\\-297.761\\115\\38.08594\\-298.5171\\115\\34.17969\\-299.403\\115\\32.22656\\-300.0428\\115\\30.27344\\-300.4624\\115\\22.46094\\-301.5182\\115\\18.55469\\-302.1985\\115\\16.60156\\-302.4101\\115\\12.69531\\-302.6648\\115\\4.882813\\-302.8503\\115\\-0.9765625\\-302.8929\\115\\-4.882813\\-302.8716\\115\\-12.69531\\-302.6648\\115\\-16.60156\\-302.3884\\115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "184" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-301.9781\\117\\-22.46094\\-301.5566\\117\\-30.27344\\-300.4427\\117\\-32.22656\\-300.0428\\117\\-34.17969\\-299.3611\\117\\-38.08594\\-298.4792\\117\\-40.03906\\-297.6699\\117\\-41.99219\\-297.0628\\117\\-43.94531\\-296.6737\\117\\-45.89844\\-295.8594\\117\\-47.85156\\-295.198\\117\\-49.80469\\-294.7131\\117\\-55.66406\\-292.1069\\117\\-57.61719\\-291.0988\\117\\-61.52344\\-289.2303\\117\\-63.47656\\-288.5208\\117\\-65.42969\\-287.3356\\117\\-67.54701\\-286.1953\\117\\-70.63526\\-284.2422\\117\\-71.28906\\-283.7174\\117\\-73.24219\\-282.8139\\117\\-75.19531\\-281.5115\\117\\-77.14844\\-280.4504\\117\\-79.10156\\-279.0914\\117\\-81.05469\\-277.5936\\117\\-84.96094\\-275.2841\\117\\-86.91406\\-273.8557\\117\\-88.86719\\-272.561\\117\\-92.77344\\-269.7555\\117\\-96.67969\\-267.1853\\117\\-97.26414\\-266.6641\\117\\-100.5859\\-264.0451\\117\\-102.5391\\-262.8317\\117\\-104.4922\\-261.4398\\117\\-105.16\\-260.8047\\117\\-107.6547\\-258.8516\\117\\-108.3984\\-258.1755\\117\\-112.3047\\-255.1614\\117\\-114.2578\\-253.4285\\117\\-118.1641\\-249.7394\\117\\-120.8512\\-247.1328\\117\\-122.6651\\-245.1797\\117\\-126.0006\\-241.2734\\117\\-128.9272\\-237.3672\\117\\-130.2749\\-235.4141\\117\\-131.2002\\-233.4609\\117\\-132.5479\\-231.5078\\117\\-134.6717\\-227.6016\\117\\-135.4772\\-225.6484\\117\\-136.3955\\-223.6953\\117\\-136.9645\\-221.7422\\117\\-137.7792\\-219.7891\\117\\-138.4452\\-217.8359\\117\\-138.9266\\-215.8828\\117\\-140.2565\\-211.9766\\117\\-141.0683\\-208.0703\\117\\-141.9794\\-204.1641\\117\\-142.4467\\-200.2578\\117\\-142.715\\-196.3516\\117\\-142.8841\\-192.4453\\117\\-142.9728\\-186.5859\\117\\-142.9321\\-182.6797\\117\\-142.8207\\-178.7734\\117\\-142.572\\-172.9141\\117\\-142.3418\\-169.0078\\117\\-141.9599\\-165.1016\\117\\-140.9525\\-159.2422\\117\\-140.3906\\-155.3359\\117\\-140.03\\-153.3828\\117\\-139.3885\\-151.4297\\117\\-137.948\\-145.5703\\117\\-137.2208\\-143.6172\\117\\-136.3642\\-139.7109\\117\\-135.5781\\-137.7578\\117\\-134.2773\\-133.8516\\117\\-133.274\\-131.8984\\117\\-132.4811\\-129.9453\\117\\-131.376\\-127.9922\\117\\-130.571\\-126.0391\\117\\-129.4511\\-124.0859\\117\\-128.5517\\-122.1328\\117\\-124.4154\\-116.2734\\117\\-122.8612\\-114.3203\\117\\-121.1462\\-112.3672\\117\\-118.1641\\-109.1424\\117\\-115.282\\-106.5078\\117\\-112.3047\\-104.0129\\117\\-110.3516\\-102.5271\\117\\-106.4453\\-100.0258\\117\\-104.4922\\-99.0551\\117\\-102.5391\\-97.80392\\117\\-100.5859\\-96.7345\\117\\-98.63281\\-95.80631\\117\\-96.67969\\-95.04605\\117\\-94.72656\\-94.1488\\117\\-92.77344\\-93.69118\\117\\-90.82031\\-93.06881\\117\\-88.86719\\-92.31859\\117\\-84.96094\\-91.34274\\117\\-81.05469\\-90.2922\\117\\-75.19531\\-89.36588\\117\\-71.28906\\-88.58543\\117\\-67.38281\\-88.16195\\117\\-65.42969\\-88.06368\\117\\-57.61719\\-87.52795\\117\\-55.66406\\-87.27989\\117\\-49.80469\\-86.72707\\117\\-43.94531\\-86.29297\\117\\-38.08594\\-85.92188\\117\\-36.13281\\-85.8467\\117\\-32.22656\\-85.797\\117\\-26.36719\\-85.77156\\117\\-20.50781\\-85.88214\\117\\-16.60156\\-86.09327\\117\\-12.69531\\-86.53032\\117\\-10.74219\\-86.95255\\117\\-8.789063\\-87.54511\\117\\-4.882813\\-88.15971\\117\\-2.929688\\-88.57523\\117\\-0.9765625\\-89.237\\117\\0.9765625\\-89.55492\\117\\2.929688\\-89.55059\\117\\4.882813\\-89.37593\\117\\6.835938\\-89.04503\\117\\8.789063\\-88.47628\\117\\12.69531\\-87.78191\\117\\16.60156\\-86.50096\\117\\22.46094\\-85.63148\\117\\30.27344\\-84.83643\\117\\36.13281\\-84.63157\\117\\40.03906\\-84.71947\\117\\45.89844\\-85.07769\\117\\49.80469\\-85.51172\\117\\53.71094\\-85.87193\\117\\55.66406\\-86\\117\\61.52344\\-86.57406\\117\\65.42969\\-87.21886\\117\\69.33594\\-87.69971\\117\\75.19531\\-88.25598\\117\\77.14844\\-88.57895\\117\\79.10156\\-89.17737\\117\\81.05469\\-89.66492\\117\\84.96094\\-90.52945\\117\\86.91406\\-91.35873\\117\\90.82031\\-92.40675\\117\\92.77344\\-93.27227\\117\\96.67969\\-94.39413\\117\\98.63281\\-95.36312\\117\\100.5859\\-96.06419\\117\\102.5391\\-97.32411\\117\\104.4922\\-98.38142\\117\\106.4453\\-99.69644\\117\\108.1461\\-100.6484\\117\\110.3516\\-102.0425\\117\\113.5274\\-104.5547\\117\\115.8255\\-106.5078\\117\\118.1641\\-108.7111\\117\\121.4126\\-112.3672\\117\\122.9858\\-114.3203\\117\\124.4236\\-116.2734\\117\\125.5732\\-118.2266\\117\\126.9348\\-120.1797\\117\\128.1684\\-122.1328\\117\\130.0167\\-126.0391\\117\\131.5226\\-129.9453\\117\\132.4654\\-131.8984\\117\\133.1001\\-133.8516\\117\\133.9554\\-135.8047\\117\\134.5833\\-137.7578\\117\\135.0555\\-139.7109\\117\\136.3163\\-143.6172\\117\\136.9845\\-147.5234\\117\\137.4111\\-149.4766\\117\\138.0165\\-151.4297\\117\\138.3882\\-153.3828\\117\\139.3073\\-159.2422\\117\\139.7723\\-161.1953\\117\\140.1184\\-163.1484\\117\\140.5268\\-167.0547\\117\\140.9686\\-172.9141\\117\\141.3176\\-178.7734\\117\\141.4327\\-182.6797\\117\\141.4588\\-186.5859\\117\\141.3156\\-192.4453\\117\\140.9725\\-198.3047\\117\\140.663\\-202.2109\\117\\140.2588\\-206.1172\\117\\139.877\\-208.0703\\117\\139.3411\\-210.0234\\117\\138.1147\\-215.8828\\117\\137.3796\\-217.8359\\117\\136.3147\\-221.7422\\117\\135.3559\\-223.6953\\117\\134.5262\\-225.6484\\117\\132.0858\\-229.5547\\117\\130.7189\\-231.5078\\117\\129.2341\\-233.4609\\117\\127.9382\\-235.4141\\117\\122.8966\\-241.2734\\117\\121.0375\\-243.2266\\117\\120.1172\\-244.0466\\117\\115.0836\\-249.0859\\117\\112.3047\\-251.5884\\117\\108.3984\\-255.419\\117\\104.4922\\-258.7132\\117\\102.3934\\-260.8047\\117\\100.5859\\-262.2064\\117\\98.63281\\-263.9283\\117\\94.72656\\-267.5232\\117\\92.77344\\-269.1682\\117\\90.86772\\-270.5703\\117\\84.96094\\-275.3294\\117\\83.00781\\-276.7715\\117\\81.05469\\-277.945\\117\\77.14844\\-280.972\\117\\75.19531\\-282.0431\\117\\71.28906\\-284.5222\\117\\69.33594\\-285.5911\\117\\67.38281\\-286.9164\\117\\65.42969\\-287.854\\117\\63.47656\\-288.9384\\117\\61.52344\\-289.5777\\117\\59.57031\\-290.7694\\117\\57.61719\\-291.5182\\117\\55.66406\\-292.6718\\117\\53.71094\\-293.3895\\117\\51.75781\\-294.3917\\117\\49.80469\\-294.9665\\117\\47.85156\\-295.4371\\117\\45.89844\\-296.3204\\117\\41.99219\\-297.2725\\117\\40.03906\\-298.0627\\117\\38.08594\\-298.6516\\117\\34.17969\\-299.6063\\117\\32.22656\\-300.231\\117\\30.27344\\-300.58\\117\\24.41406\\-301.3619\\117\\20.50781\\-302.0735\\117\\16.60156\\-302.5179\\117\\10.74219\\-302.7969\\117\\2.929688\\-302.9479\\117\\-0.9765625\\-302.9803\\117\\-6.835938\\-302.9036\\117\\-12.69531\\-302.7239\\117\\-16.60156\\-302.4817\\117\\-18.55469\\-302.2818\\117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "244" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "185" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-302.1365\\119\\-24.41406\\-301.3619\\119\\-30.27344\\-300.5468\\119\\-32.22656\\-300.1992\\119\\-34.17969\\-299.5352\\119\\-36.13281\\-299.0165\\119\\-38.08594\\-298.6182\\119\\-41.99219\\-297.1749\\119\\-43.94531\\-296.7667\\119\\-45.89844\\-296.1048\\119\\-47.85156\\-295.2911\\119\\-49.80469\\-294.8046\\119\\-51.75781\\-294.0314\\119\\-53.71094\\-293.0988\\119\\-55.66406\\-292.3477\\119\\-57.61719\\-291.2048\\119\\-59.57031\\-290.4249\\119\\-61.52344\\-289.3052\\119\\-63.47656\\-288.6401\\119\\-65.42969\\-287.4431\\119\\-67.38281\\-286.4869\\119\\-70.80503\\-284.2422\\119\\-71.28906\\-283.8417\\119\\-73.24219\\-282.9034\\119\\-75.19531\\-281.5771\\119\\-77.14844\\-280.5357\\119\\-79.10156\\-279.1372\\119\\-81.05469\\-277.6258\\119\\-83.00781\\-276.5163\\119\\-84.96094\\-275.2565\\119\\-88.78941\\-272.5234\\119\\-94.18688\\-268.6172\\119\\-96.67969\\-266.9172\\119\\-99.33143\\-264.7109\\119\\-100.5859\\-263.7459\\119\\-104.4922\\-260.9888\\119\\-108.3984\\-257.6713\\119\\-109.4396\\-256.8984\\119\\-112.3047\\-254.3982\\119\\-115.9769\\-251.0391\\119\\-118.1641\\-248.9618\\119\\-120.1172\\-246.9921\\119\\-121.7751\\-245.1797\\119\\-124.0234\\-242.5952\\119\\-128.1758\\-237.3672\\119\\-129.2813\\-235.4141\\119\\-130.6074\\-233.4609\\119\\-131.8359\\-231.1966\\119\\-133.8736\\-227.6016\\119\\-136.3866\\-221.7422\\119\\-136.8826\\-219.7891\\119\\-137.5156\\-217.8359\\119\\-138.2491\\-215.8828\\119\\-139.1862\\-211.9766\\119\\-139.9185\\-210.0234\\119\\-140.3795\\-208.0703\\119\\-141.0181\\-204.1641\\119\\-141.716\\-200.2578\\119\\-141.9992\\-198.3047\\119\\-142.2928\\-194.3984\\119\\-142.4112\\-190.4922\\119\\-142.4553\\-184.6328\\119\\-142.3915\\-180.7266\\119\\-142.2547\\-176.8203\\119\\-141.8917\\-170.9609\\119\\-140.8534\\-163.1484\\119\\-140.6411\\-161.1953\\119\\-140.0929\\-157.2891\\119\\-139.0758\\-153.3828\\119\\-138.3259\\-149.4766\\119\\-137.7624\\-147.5234\\119\\-137.0809\\-145.5703\\119\\-136.3426\\-141.6641\\119\\-134.9325\\-137.7578\\119\\-134.4088\\-135.8047\\119\\-133.4706\\-133.8516\\119\\-132.6819\\-131.8984\\119\\-131.7479\\-129.9453\\119\\-129.9869\\-126.0391\\119\\-127.9297\\-122.1669\\119\\-126.6556\\-120.1797\\119\\-125.0719\\-118.2266\\119\\-122.3617\\-114.3203\\119\\-120.1172\\-111.9281\\119\\-118.1641\\-109.7418\\119\\-116.2109\\-107.8461\\119\\-114.2578\\-106.187\\119\\-109.6259\\-102.6016\\119\\-108.3984\\-101.7214\\119\\-106.4453\\-100.5284\\119\\-104.4922\\-99.51334\\119\\-102.5391\\-98.23467\\119\\-100.5859\\-97.32567\\119\\-98.63281\\-96.1454\\119\\-96.67969\\-95.46706\\119\\-94.72656\\-94.54492\\119\\-92.77344\\-93.93534\\119\\-90.82031\\-93.49748\\119\\-86.91406\\-92.18674\\119\\-83.00781\\-91.40161\\119\\-79.10156\\-90.34959\\119\\-77.14844\\-90.02901\\119\\-71.28906\\-89.20369\\119\\-67.38281\\-88.51311\\119\\-63.47656\\-88.14233\\119\\-55.66406\\-87.66331\\119\\-53.71094\\-87.44777\\119\\-47.85156\\-86.98463\\119\\-41.99219\\-86.41246\\119\\-34.17969\\-86.02774\\119\\-28.32031\\-85.95586\\119\\-22.46094\\-86.03274\\119\\-16.60156\\-86.33134\\119\\-14.64844\\-86.53032\\119\\-12.69531\\-86.90625\\119\\-8.789063\\-87.818\\119\\-4.882813\\-88.46892\\119\\-2.929688\\-89.19343\\119\\-0.9765625\\-89.66917\\119\\0.9765625\\-89.88467\\119\\2.929688\\-89.88443\\119\\4.882813\\-89.77863\\119\\6.835938\\-89.53773\\119\\8.789063\\-89.11325\\119\\10.74219\\-88.44141\\119\\14.64844\\-87.53944\\119\\16.60156\\-86.92143\\119\\18.55469\\-86.48828\\119\\22.46094\\-85.89474\\119\\30.27344\\-85.24281\\119\\36.13281\\-84.9287\\119\\41.99219\\-85.04688\\119\\47.85156\\-85.42057\\119\\51.75781\\-85.80138\\119\\57.61719\\-86.31981\\119\\59.57031\\-86.54037\\119\\63.47656\\-87.21886\\119\\67.38281\\-87.69067\\119\\73.24219\\-88.22778\\119\\75.19531\\-88.51601\\119\\79.10156\\-89.54739\\119\\83.00781\\-90.371\\119\\84.96094\\-91.12522\\119\\86.91406\\-91.73269\\119\\88.86719\\-92.21599\\119\\92.77344\\-93.64562\\119\\94.72656\\-94.11446\\119\\98.63281\\-95.74731\\119\\100.5859\\-96.64453\\119\\102.5391\\-97.7547\\119\\104.4922\\-99.03597\\119\\106.4453\\-100.0625\\119\\108.3984\\-101.3909\\119\\110.3408\\-102.6016\\119\\112.3047\\-104.1077\\119\\115.1002\\-106.5078\\119\\118.1641\\-109.4573\\119\\120.1172\\-111.668\\119\\120.8895\\-112.3672\\119\\122.5294\\-114.3203\\119\\123.7131\\-116.2734\\119\\125.0234\\-118.2266\\119\\126.4381\\-120.1797\\119\\127.4827\\-122.1328\\119\\128.6371\\-124.0859\\119\\129.4049\\-126.0391\\119\\130.3914\\-127.9922\\119\\131.0152\\-129.9453\\119\\132.6072\\-133.8516\\119\\133.1959\\-135.8047\\119\\134.071\\-137.7578\\119\\135.0518\\-141.6641\\119\\136.2338\\-145.5703\\119\\136.6028\\-147.5234\\119\\137.168\\-151.4297\\119\\138.1806\\-155.3359\\119\\139.2137\\-163.1484\\119\\139.9129\\-167.0547\\119\\140.1457\\-169.0078\\119\\140.5263\\-174.8672\\119\\140.679\\-178.7734\\119\\140.7559\\-182.6797\\119\\140.7292\\-190.4922\\119\\140.625\\-194.3984\\119\\140.435\\-198.3047\\119\\140.1276\\-202.2109\\119\\139.7992\\-204.1641\\119\\138.9732\\-208.0703\\119\\138.3882\\-211.9766\\119\\137.958\\-213.9297\\119\\137.2204\\-215.8828\\119\\136.3997\\-219.7891\\119\\135.4685\\-221.7422\\119\\134.7034\\-223.6953\\119\\133.7891\\-225.4676\\119\\131.8359\\-228.658\\119\\131.1364\\-229.5547\\119\\128.6654\\-233.4609\\119\\127.1282\\-235.4141\\119\\125.374\\-237.3672\\119\\123.8393\\-239.3203\\119\\122.4261\\-241.2734\\119\\120.5754\\-243.2266\\119\\118.6207\\-245.1797\\119\\116.2109\\-247.7957\\119\\114.2578\\-249.698\\119\\112.3047\\-251.4627\\119\\108.3984\\-255.4226\\119\\104.5009\\-258.8516\\119\\102.5391\\-260.8773\\119\\98.63281\\-264.0576\\119\\95.9109\\-266.6641\\119\\92.77344\\-269.4024\\119\\88.86719\\-272.5756\\119\\83.83875\\-276.4297\\119\\79.10156\\-279.7487\\119\\77.14844\\-281.213\\119\\75.19531\\-282.4518\\119\\73.24219\\-283.3958\\119\\71.28906\\-284.8046\\119\\67.38281\\-287.1161\\119\\65.42969\\-288.1726\\119\\63.47656\\-289.0891\\119\\61.52344\\-289.8611\\119\\59.57031\\-290.9496\\119\\57.61719\\-291.7984\\119\\55.66406\\-292.8532\\119\\53.71094\\-293.6004\\119\\51.75781\\-294.5811\\119\\47.85156\\-295.6191\\119\\45.89844\\-296.4987\\119\\41.99219\\-297.4411\\119\\40.03906\\-298.3108\\119\\36.13281\\-299.2513\\119\\32.22656\\-300.3733\\119\\26.36719\\-301.2092\\119\\20.50781\\-302.234\\119\\18.55469\\-302.4526\\119\\14.64844\\-302.7065\\119\\6.835938\\-302.9695\\119\\-0.9765625\\-303.0791\\119\\-6.835938\\-302.9651\\119\\-12.69531\\-302.7859\\119\\-16.60156\\-302.5765\\119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "249" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "186" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-301.9203\\121\\-24.41406\\-301.4785\\121\\-30.27344\\-300.6473\\121\\-32.22656\\-300.3342\\121\\-36.13281\\-299.144\\121\\-38.08594\\-298.7362\\121\\-40.03906\\-298.1616\\121\\-41.99219\\-297.303\\121\\-43.94531\\-296.8587\\121\\-45.89844\\-296.2865\\121\\-47.85156\\-295.3929\\121\\-49.80469\\-294.907\\121\\-51.75781\\-294.243\\121\\-53.71094\\-293.2428\\121\\-55.66406\\-292.5255\\121\\-57.61719\\-291.3291\\121\\-59.57031\\-290.6019\\121\\-61.52344\\-289.3854\\121\\-63.47656\\-288.758\\121\\-65.42969\\-287.5804\\121\\-67.38281\\-286.6369\\121\\-71.28906\\-283.9943\\121\\-73.24219\\-283.001\\121\\-75.19531\\-281.6659\\121\\-77.14844\\-280.6282\\121\\-81.05469\\-277.6938\\121\\-83.00781\\-276.546\\121\\-84.96094\\-275.2692\\121\\-85.96978\\-274.4766\\121\\-92.77344\\-269.5493\\121\\-94.72656\\-268.0157\\121\\-96.58203\\-266.6641\\121\\-98.98868\\-264.7109\\121\\-101.6101\\-262.7578\\121\\-104.0761\\-260.8047\\121\\-106.4453\\-258.8267\\121\\-108.3984\\-257.2767\\121\\-110.3516\\-255.6127\\121\\-114.2578\\-251.9542\\121\\-115.3122\\-251.0391\\121\\-118.1641\\-248.174\\121\\-119.0956\\-247.1328\\121\\-121.0273\\-245.1797\\121\\-122.7481\\-243.2266\\121\\-124.2993\\-241.2734\\121\\-125.6021\\-239.3203\\121\\-127.1821\\-237.3672\\121\\-128.6331\\-235.4141\\121\\-131.8359\\-229.704\\121\\-133.934\\-225.6484\\121\\-134.7404\\-223.6953\\121\\-135.4389\\-221.7422\\121\\-136.2478\\-219.7891\\121\\-137.2246\\-215.8828\\121\\-137.9849\\-213.9297\\121\\-138.8568\\-210.0234\\121\\-139.9304\\-206.1172\\121\\-140.3209\\-204.1641\\121\\-140.5804\\-202.2109\\121\\-141.2233\\-196.3516\\121\\-141.517\\-192.4453\\121\\-141.7031\\-188.5391\\121\\-141.7188\\-184.6328\\121\\-141.6096\\-180.7266\\121\\-141.2533\\-174.8672\\121\\-140.9763\\-170.9609\\121\\-140.4769\\-165.1016\\121\\-139.9935\\-161.1953\\121\\-139.086\\-157.2891\\121\\-138.4603\\-153.3828\\121\\-138.0615\\-151.4297\\121\\-137.4344\\-149.4766\\121\\-136.9708\\-147.5234\\121\\-136.2271\\-143.6172\\121\\-135.5362\\-141.6641\\121\\-134.3954\\-137.7578\\121\\-132.7951\\-133.8516\\121\\-132.0522\\-131.8984\\121\\-131.051\\-129.9453\\121\\-130.3468\\-127.9922\\121\\-129.2707\\-126.0391\\121\\-128.4678\\-124.0859\\121\\-124.6068\\-118.2266\\121\\-122.0703\\-114.857\\121\\-119.7018\\-112.3672\\121\\-116.2109\\-108.5733\\121\\-113.7821\\-106.5078\\121\\-110.3516\\-103.6961\\121\\-108.3984\\-102.1982\\121\\-106.4453\\-101.1679\\121\\-104.4922\\-99.86845\\121\\-98.78229\\-96.74219\\121\\-96.67969\\-95.81185\\121\\-94.72656\\-95.10751\\121\\-92.77344\\-94.23767\\121\\-88.86719\\-93.35371\\121\\-86.91406\\-92.6476\\121\\-84.96094\\-92.13216\\121\\-81.05469\\-91.41932\\121\\-77.14844\\-90.44808\\121\\-75.19531\\-90.12265\\121\\-69.33594\\-89.41482\\121\\-63.47656\\-88.44801\\121\\-61.52344\\-88.24734\\121\\-55.66406\\-87.87378\\121\\-45.89844\\-87.21706\\121\\-41.99219\\-86.75231\\121\\-40.03906\\-86.58461\\121\\-34.17969\\-86.28893\\121\\-28.32031\\-86.21397\\121\\-22.46094\\-86.27821\\121\\-16.60156\\-86.5953\\121\\-14.64844\\-86.90625\\121\\-10.74219\\-87.73402\\121\\-6.835938\\-88.39394\\121\\-2.929688\\-89.62975\\121\\-0.9765625\\-90.00446\\121\\0.9765625\\-90.19581\\121\\2.929688\\-90.21828\\121\\6.835938\\-89.90063\\121\\8.789063\\-89.60256\\121\\10.74219\\-89.03044\\121\\12.69531\\-88.29858\\121\\16.60156\\-87.37993\\121\\18.55469\\-86.84686\\121\\20.50781\\-86.47883\\121\\24.41406\\-85.95377\\121\\28.32031\\-85.65251\\121\\30.27344\\-85.5926\\121\\36.13281\\-85.24603\\121\\40.03906\\-85.25528\\121\\43.94531\\-85.33075\\121\\47.85156\\-85.5305\\121\\51.75781\\-85.86128\\121\\57.61719\\-86.4545\\121\\59.57031\\-86.75231\\121\\61.52344\\-87.14934\\121\\65.42969\\-87.667\\121\\69.33594\\-88.02415\\121\\73.24219\\-88.4713\\121\\77.14844\\-89.45506\\121\\81.05469\\-90.21522\\121\\83.00781\\-90.83063\\121\\84.96094\\-91.56191\\121\\86.91406\\-92.0204\\121\\88.86719\\-92.62424\\121\\90.82031\\-93.46326\\121\\92.77344\\-93.92993\\121\\94.72656\\-94.52815\\121\\96.67969\\-95.45519\\121\\98.63281\\-96.12708\\121\\100.5859\\-97.28472\\121\\102.5391\\-98.21687\\121\\104.4922\\-99.5539\\121\\108.3984\\-101.7922\\121\\112.0269\\-104.5547\\121\\114.2578\\-106.3065\\121\\116.2109\\-107.9955\\121\\118.1641\\-110.067\\121\\120.2239\\-112.3672\\121\\122.0703\\-114.649\\121\\124.5768\\-118.2266\\121\\125.6584\\-120.1797\\121\\126.9472\\-122.1328\\121\\128.0713\\-124.0859\\121\\128.9315\\-126.0391\\121\\129.6859\\-127.9922\\121\\130.5981\\-129.9453\\121\\131.1331\\-131.8984\\121\\131.9999\\-133.8516\\121\\132.6769\\-135.8047\\121\\133.2355\\-137.7578\\121\\134.0332\\-139.7109\\121\\134.5622\\-141.6641\\121\\135.4685\\-145.5703\\121\\136.0677\\-147.5234\\121\\136.4415\\-149.4766\\121\\136.9446\\-153.3828\\121\\137.2758\\-155.3359\\121\\138.1595\\-159.2422\\121\\138.6099\\-163.1484\\121\\139.1789\\-169.0078\\121\\139.8631\\-174.8672\\121\\140.0776\\-178.7734\\121\\140.1923\\-184.6328\\121\\140.189\\-188.5391\\121\\140.0146\\-194.3984\\121\\139.6713\\-198.3047\\121\\138.8994\\-204.1641\\121\\138.4436\\-208.0703\\121\\138.1314\\-210.0234\\121\\137.0762\\-213.9297\\121\\136.3107\\-217.8359\\121\\134.7842\\-221.7422\\121\\133.9208\\-223.6953\\121\\132.7876\\-225.6484\\121\\131.536\\-227.6016\\121\\130.4633\\-229.5547\\121\\127.9297\\-233.3083\\121\\126.4511\\-235.4141\\121\\123.2646\\-239.3203\\121\\122.0703\\-240.8573\\121\\120.1172\\-243.1014\\121\\118.1641\\-245.1888\\121\\116.6001\\-247.1328\\121\\114.7239\\-249.0859\\121\\112.3047\\-251.3797\\121\\108.3984\\-255.4734\\121\\106.7818\\-256.8984\\121\\104.7066\\-258.8516\\121\\102.5391\\-261.087\\121\\98.63281\\-264.3188\\121\\96.17683\\-266.6641\\121\\94.72656\\-267.951\\121\\90.82031\\-271.2409\\121\\88.86719\\-272.9568\\121\\86.86474\\-274.4766\\121\\84.96094\\-275.8039\\121\\81.05469\\-278.7917\\121\\75.19531\\-282.7706\\121\\73.24219\\-283.6486\\121\\71.28906\\-285.0522\\121\\69.33594\\-286.29\\121\\65.89227\\-288.1484\\121\\65.42969\\-288.474\\121\\63.47656\\-289.2133\\121\\61.52344\\-290.239\\121\\59.57031\\-291.1035\\121\\57.61719\\-292.1768\\121\\51.75781\\-294.7219\\121\\49.80469\\-295.2027\\121\\45.89844\\-296.6445\\121\\43.94531\\-297.0702\\121\\41.99219\\-297.6839\\121\\40.03906\\-298.4823\\121\\36.13281\\-299.4216\\121\\34.17969\\-300.0804\\121\\32.22656\\-300.4933\\121\\26.36719\\-301.3386\\121\\22.46094\\-302.0735\\121\\20.50781\\-302.3664\\121\\16.60156\\-302.6776\\121\\10.74219\\-302.925\\121\\2.929688\\-303.1638\\121\\-0.9765625\\-303.1923\\121\\-4.882813\\-303.1243\\121\\-10.74219\\-302.925\\121\\-16.60156\\-302.6582\\121\\-20.50781\\-302.2581\\121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "251" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "187" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-302.088\\123\\-26.36719\\-301.293\\123\\-32.22656\\-300.4344\\123\\-34.17969\\-299.9765\\123\\-36.13281\\-299.2824\\123\\-40.03906\\-298.3326\\123\\-41.99219\\-297.4629\\123\\-45.89844\\-296.4619\\123\\-47.85156\\-295.5337\\123\\-51.75781\\-294.4131\\123\\-53.71094\\-293.3853\\123\\-55.66406\\-292.6718\\123\\-57.61719\\-291.489\\123\\-59.57031\\-290.7545\\123\\-61.52344\\-289.5282\\123\\-63.47656\\-288.8809\\123\\-65.42969\\-287.7212\\123\\-67.38281\\-286.7542\\123\\-69.33594\\-285.404\\123\\-73.24219\\-283.0864\\123\\-75.19531\\-281.7874\\123\\-77.14844\\-280.7417\\123\\-81.05469\\-277.7664\\123\\-83.00781\\-276.5899\\123\\-84.96094\\-275.2966\\123\\-88.86719\\-272.3089\\123\\-92.77344\\-269.4717\\123\\-96.30036\\-266.6641\\123\\-98.63281\\-264.7026\\123\\-100.5859\\-263.3319\\123\\-102.5391\\-261.7491\\123\\-106.4453\\-258.2848\\123\\-108.1997\\-256.8984\\123\\-110.3516\\-255.0884\\123\\-116.5938\\-249.0859\\123\\-120.1766\\-245.1797\\123\\-122.0703\\-242.9872\\123\\-126.36\\-237.3672\\123\\-128.9195\\-233.4609\\123\\-130.0349\\-231.5078\\123\\-130.9429\\-229.5547\\123\\-132.094\\-227.6016\\123\\-132.8964\\-225.6484\\123\\-133.8914\\-223.6953\\123\\-134.6648\\-221.7422\\123\\-135.2366\\-219.7891\\123\\-136.0502\\-217.8359\\123\\-136.5729\\-215.8828\\123\\-136.9904\\-213.9297\\123\\-137.5127\\-211.9766\\123\\-138.1582\\-210.0234\\123\\-139.2348\\-204.1641\\123\\-139.7171\\-202.2109\\123\\-140.3015\\-198.3047\\123\\-140.6541\\-192.4453\\123\\-140.7907\\-186.5859\\123\\-140.7406\\-180.7266\\123\\-140.552\\-174.8672\\123\\-140.3245\\-170.9609\\123\\-139.965\\-167.0547\\123\\-139.2672\\-163.1484\\123\\-138.4555\\-157.2891\\123\\-137.6953\\-153.469\\123\\-137.1268\\-151.4297\\123\\-136.4968\\-147.5234\\123\\-136.0051\\-145.5703\\123\\-135.3671\\-143.6172\\123\\-134.3609\\-139.7109\\123\\-133.5321\\-137.7578\\123\\-132.1729\\-133.8516\\123\\-131.1695\\-131.8984\\123\\-130.5446\\-129.9453\\123\\-129.5573\\-127.9922\\123\\-128.7435\\-126.0391\\123\\-126.5924\\-122.1328\\123\\-123.8091\\-118.2266\\123\\-122.6294\\-116.2734\\123\\-120.9845\\-114.3203\\123\\-117.213\\-110.4141\\123\\-116.2109\\-109.2867\\123\\-114.2578\\-107.4778\\123\\-110.3516\\-104.2581\\123\\-106.4453\\-101.5543\\123\\-104.4922\\-100.3033\\123\\-102.5391\\-99.38731\\123\\-100.5859\\-98.11983\\123\\-98.63281\\-97.25919\\123\\-96.67969\\-96.15382\\123\\-94.72656\\-95.51087\\123\\-90.82031\\-94.05192\\123\\-86.91406\\-93.23885\\123\\-84.96094\\-92.57507\\123\\-83.00781\\-92.13216\\123\\-79.10156\\-91.46875\\123\\-75.19531\\-90.57477\\123\\-73.24219\\-90.23365\\123\\-65.42969\\-89.32949\\123\\-61.52344\\-88.57394\\123\\-59.57031\\-88.36328\\123\\-53.71094\\-87.92336\\123\\-45.89844\\-87.54463\\123\\-41.99219\\-87.21706\\123\\-38.08594\\-86.83383\\123\\-34.17969\\-86.5953\\123\\-30.27344\\-86.48202\\123\\-26.36719\\-86.46029\\123\\-22.46094\\-86.55054\\123\\-18.55469\\-86.80511\\123\\-16.60156\\-87.00098\\123\\-12.69531\\-87.68045\\123\\-8.789063\\-88.27649\\123\\-4.882813\\-89.49935\\123\\-0.9765625\\-90.37357\\123\\0.9765625\\-90.64379\\123\\2.929688\\-90.71886\\123\\6.835938\\-90.29688\\123\\8.789063\\-89.95141\\123\\10.74219\\-89.50674\\123\\12.69531\\-88.69318\\123\\14.64844\\-88.09898\\123\\18.55469\\-87.34277\\123\\20.50781\\-86.86122\\123\\22.46094\\-86.50096\\123\\24.41406\\-86.25425\\123\\28.32031\\-85.89839\\123\\30.27344\\-85.828\\123\\36.13281\\-85.50214\\123\\41.99219\\-85.47662\\123\\45.89844\\-85.55554\\123\\47.85156\\-85.65639\\123\\51.75781\\-85.95586\\123\\57.61719\\-86.60868\\123\\61.52344\\-87.32082\\123\\65.42969\\-87.80054\\123\\67.38281\\-87.95908\\123\\71.28906\\-88.45124\\123\\73.24219\\-88.81613\\123\\75.19531\\-89.33984\\123\\79.10156\\-90.07078\\123\\81.05469\\-90.56592\\123\\83.00781\\-91.34274\\123\\86.91406\\-92.34766\\123\\88.86719\\-93.19948\\123\\92.77344\\-94.22438\\123\\94.72656\\-95.12408\\123\\96.67969\\-95.84399\\123\\98.63281\\-96.70313\\123\\102.5391\\-98.9237\\123\\104.4922\\-99.9556\\123\\106.4453\\-101.2468\\123\\108.3984\\-102.2512\\123\\110.3516\\-103.7721\\123\\113.6147\\-106.5078\\123\\116.2109\\-108.8341\\123\\117.5795\\-110.4141\\123\\121.2\\-114.3203\\123\\122.7726\\-116.2734\\123\\123.8393\\-118.2266\\123\\126.4026\\-122.1328\\123\\127.3322\\-124.0859\\123\\128.4383\\-126.0391\\123\\129.0926\\-127.9922\\123\\130.0019\\-129.9453\\123\\130.6874\\-131.8984\\123\\131.1913\\-133.8516\\123\\132.0522\\-135.8047\\123\\133.1818\\-139.7109\\123\\133.9148\\-141.6641\\123\\134.4421\\-143.6172\\123\\135.2236\\-147.5234\\123\\136.1707\\-151.4297\\123\\136.4968\\-153.3828\\123\\137.2003\\-159.2422\\123\\137.948\\-163.1484\\123\\138.1866\\-165.1016\\123\\138.527\\-169.0078\\123\\138.8844\\-174.8672\\123\\139.0564\\-178.7734\\123\\139.1794\\-184.6328\\123\\139.1794\\-188.5391\\123\\139.0895\\-192.4453\\123\\138.6932\\-200.2578\\123\\138.3332\\-204.1641\\123\\138.0694\\-206.1172\\123\\137.2003\\-210.0234\\123\\136.5748\\-213.9297\\123\\136.1597\\-215.8828\\123\\135.3997\\-217.8359\\123\\134.7782\\-219.7891\\123\\134.0069\\-221.7422\\123\\131.8763\\-225.6484\\123\\130.7357\\-227.6016\\123\\129.4847\\-229.5547\\123\\128.4746\\-231.5078\\123\\125.9766\\-234.913\\123\\125.5466\\-235.4141\\123\\122.8555\\-239.3203\\123\\121.2523\\-241.2734\\123\\117.726\\-245.1797\\123\\116.3167\\-247.1328\\123\\114.5784\\-249.0859\\123\\112.3047\\-251.3147\\123\\110.3516\\-253.492\\123\\108.3984\\-255.5269\\123\\104.896\\-258.8516\\123\\102.5391\\-261.293\\123\\100.5859\\-263.0508\\123\\98.63281\\-264.6689\\123\\96.60326\\-266.6641\\123\\94.29348\\-268.6172\\123\\92.77344\\-269.7983\\123\\88.86719\\-273.2589\\123\\86.91406\\-274.8401\\123\\84.96094\\-276.0766\\123\\83.00781\\-277.5252\\123\\81.99426\\-278.3828\\123\\79.10156\\-280.5252\\123\\77.14844\\-281.667\\123\\75.19531\\-282.9998\\123\\73.24219\\-283.958\\123\\72.89907\\-284.2422\\123\\69.33594\\-286.5922\\123\\67.38281\\-287.5158\\123\\65.42969\\-288.6998\\123\\63.47656\\-289.3601\\123\\61.52344\\-290.5254\\123\\59.57031\\-291.2851\\123\\57.61719\\-292.4565\\123\\55.66406\\-293.1869\\123\\53.71094\\-294.19\\123\\51.75781\\-294.8593\\123\\49.80469\\-295.3203\\123\\47.85156\\-296.1473\\123\\45.89844\\-296.7847\\123\\43.94531\\-297.1983\\123\\41.99219\\-297.9948\\123\\40.03906\\-298.6219\\123\\38.08594\\-299.0542\\123\\36.13281\\-299.593\\123\\34.17969\\-300.2515\\123\\32.22656\\-300.6024\\123\\26.36719\\-301.4671\\123\\22.46094\\-302.234\\123\\20.50781\\-302.4693\\123\\16.60156\\-302.7469\\123\\6.835938\\-303.1675\\123\\2.929688\\-303.3105\\123\\-0.9765625\\-303.3301\\123\\-6.835938\\-303.1757\\123\\-16.60156\\-302.7351\\123\\-20.50781\\-302.37\\123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "245" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "188" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-302.2232\\125\\-26.36719\\-301.4066\\125\\-32.22656\\-300.5428\\125\\-34.17969\\-300.1396\\125\\-36.13281\\-299.4531\\125\\-40.03906\\-298.4934\\125\\-41.99219\\-297.6458\\125\\-43.94531\\-297.0419\\125\\-45.89844\\-296.6022\\125\\-47.85156\\-295.7186\\125\\-51.75781\\-294.5595\\125\\-53.71094\\-293.5662\\125\\-55.66406\\-292.8165\\125\\-57.61719\\-291.6918\\125\\-59.57031\\-290.8881\\125\\-61.52344\\-289.7123\\125\\-63.47656\\-288.9968\\125\\-67.38281\\-286.8823\\125\\-69.33594\\-285.5152\\125\\-71.5332\\-284.2422\\125\\-75.19531\\-281.9282\\125\\-77.14844\\-280.8607\\125\\-77.76563\\-280.3359\\125\\-81.05469\\-277.8599\\125\\-83.00781\\-276.659\\125\\-84.96094\\-275.3145\\125\\-88.86719\\-272.2664\\125\\-92.77344\\-269.384\\125\\-94.72656\\-267.788\\125\\-98.63281\\-264.3928\\125\\-100.5859\\-263.0858\\125\\-102.5391\\-261.5118\\125\\-106.4453\\-257.875\\125\\-110.3516\\-254.4716\\125\\-111.7986\\-252.9922\\125\\-116.2109\\-248.7135\\125\\-118.1641\\-246.4744\\125\\-119.1998\\-245.1797\\125\\-121.1267\\-243.2266\\125\\-122.7601\\-241.2734\\125\\-124.1108\\-239.3203\\125\\-125.3101\\-237.3672\\125\\-126.8467\\-235.4141\\125\\-128.1573\\-233.4609\\125\\-129.1587\\-231.5078\\125\\-130.3034\\-229.5547\\125\\-131.0813\\-227.6016\\125\\-132.1411\\-225.6484\\125\\-132.8881\\-223.6953\\125\\-133.8127\\-221.7422\\125\\-134.5546\\-219.7891\\125\\-135.1019\\-217.8359\\125\\-135.8302\\-215.8828\\125\\-136.4042\\-213.9297\\125\\-137.112\\-210.0234\\125\\-138.1712\\-206.1172\\125\\-138.4776\\-204.1641\\125\\-139.6719\\-194.3984\\125\\-139.965\\-190.4922\\125\\-140.0761\\-186.5859\\125\\-140.066\\-182.6797\\125\\-139.9762\\-178.7734\\125\\-139.7594\\-174.8672\\125\\-139.1174\\-169.0078\\125\\-138.5732\\-163.1484\\125\\-138.0744\\-159.2422\\125\\-137.1419\\-155.3359\\125\\-136.3386\\-149.4766\\125\\-135.8446\\-147.5234\\125\\-135.187\\-145.5703\\125\\-134.2961\\-141.6641\\125\\-133.487\\-139.7109\\125\\-132.2304\\-135.8047\\125\\-131.2487\\-133.8516\\125\\-130.6479\\-131.8984\\125\\-128.1189\\-126.0391\\125\\-124.6545\\-120.1797\\125\\-122.0703\\-116.5645\\125\\-120.3419\\-114.3203\\125\\-118.1641\\-112.007\\125\\-116.2109\\-109.8251\\125\\-114.2578\\-107.9019\\125\\-110.3516\\-105.075\\125\\-108.3984\\-103.4323\\125\\-106.4453\\-101.9483\\125\\-100.5753\\-98.69531\\125\\-96.83891\\-96.74219\\125\\-94.72656\\-95.84375\\125\\-92.77344\\-95.22987\\125\\-90.82031\\-94.40266\\125\\-88.86719\\-93.93382\\125\\-86.91406\\-93.61127\\125\\-84.96094\\-93.15438\\125\\-83.00781\\-92.55221\\125\\-81.05469\\-92.16888\\125\\-75.19531\\-91.21056\\125\\-73.24219\\-90.65746\\125\\-71.28906\\-90.34857\\125\\-65.42969\\-89.68555\\125\\-63.47656\\-89.42407\\125\\-59.57031\\-88.71514\\125\\-57.61719\\-88.45478\\125\\-53.71094\\-88.09692\\125\\-43.94531\\-87.65831\\125\\-34.17969\\-87.03214\\125\\-30.27344\\-86.86212\\125\\-26.36719\\-86.81881\\125\\-24.41406\\-86.8766\\125\\-16.60156\\-87.37702\\125\\-10.74219\\-88.18652\\125\\-8.789063\\-88.60416\\125\\-6.835938\\-89.3377\\125\\-2.929688\\-90.33385\\125\\-0.9765625\\-90.93707\\125\\0.9765625\\-91.26693\\125\\2.929688\\-91.35534\\125\\4.882813\\-91.18799\\125\\6.835938\\-90.80143\\125\\10.74219\\-89.84846\\125\\12.69531\\-89.28291\\125\\14.64844\\-88.43116\\125\\16.60156\\-87.97739\\125\\20.50781\\-87.31655\\125\\24.41406\\-86.56087\\125\\30.27344\\-86.01116\\125\\34.17969\\-85.79198\\125\\38.08594\\-85.69592\\125\\43.94531\\-85.64489\\125\\45.89844\\-85.68846\\125\\51.75781\\-86.07554\\125\\55.66406\\-86.47273\\125\\57.61719\\-86.75231\\125\\59.57031\\-87.17939\\125\\63.47656\\-87.72263\\125\\67.38281\\-88.08334\\125\\69.33594\\-88.34375\\125\\71.28906\\-88.73438\\125\\75.19531\\-89.61607\\125\\79.10156\\-90.34222\\125\\81.05469\\-91.07669\\125\\83.00781\\-91.66297\\125\\84.96094\\-92.14307\\125\\88.86719\\-93.54673\\125\\90.82031\\-93.99911\\125\\92.77344\\-94.66997\\125\\94.72656\\-95.53223\\125\\96.67969\\-96.19965\\125\\98.63281\\-97.30114\\125\\100.5859\\-98.23114\\125\\102.5391\\-99.44904\\125\\104.4922\\-100.4101\\125\\107.9699\\-102.6016\\125\\110.3516\\-104.3009\\125\\114.2578\\-107.558\\125\\116.2109\\-109.4163\\125\\118.1641\\-111.6132\\125\\120.6782\\-114.3203\\125\\122.1591\\-116.2734\\125\\123.2993\\-118.2266\\125\\124.6094\\-120.1797\\125\\125.579\\-122.1328\\125\\126.7998\\-124.0859\\125\\128.6621\\-127.9922\\125\\129.2602\\-129.9453\\125\\130.1437\\-131.8984\\125\\130.7292\\-133.8516\\125\\131.1786\\-135.8047\\125\\131.9867\\-137.7578\\125\\132.5824\\-139.7109\\125\\133.0625\\-141.6641\\125\\134.252\\-145.5703\\125\\135.3227\\-151.4297\\125\\136.203\\-155.3359\\125\\136.676\\-159.2422\\125\\136.9934\\-163.1484\\125\\137.207\\-165.1016\\125\\137.9943\\-170.9609\\125\\138.2508\\-174.8672\\125\\138.4421\\-180.7266\\125\\138.4837\\-188.5391\\125\\138.3805\\-194.3984\\125\\138.2015\\-198.3047\\125\\138.0615\\-200.2578\\125\\137.7773\\-202.2109\\125\\137.1017\\-206.1172\\125\\136.6638\\-210.0234\\125\\136.3824\\-211.9766\\125\\135.9037\\-213.9297\\125\\135.2336\\-215.8828\\125\\134.7114\\-217.8359\\125\\134.0278\\-219.7891\\125\\132.9845\\-221.7422\\125\\132.0854\\-223.6953\\125\\130.9291\\-225.6484\\125\\129.9561\\-227.6016\\125\\128.8545\\-229.5547\\125\\126.3997\\-233.4609\\125\\123.5532\\-237.3672\\125\\122.376\\-239.3203\\125\\120.902\\-241.2734\\125\\117.4844\\-245.1797\\125\\116.2109\\-246.9248\\125\\114.4501\\-249.0859\\125\\112.3047\\-251.2731\\125\\109.0566\\-254.9453\\125\\105.0453\\-258.8516\\125\\102.5391\\-261.5042\\125\\98.96609\\-264.7109\\125\\96.67969\\-266.972\\125\\94.72656\\-268.6589\\125\\92.77344\\-270.0332\\125\\90.82031\\-271.7233\\125\\88.86719\\-273.5309\\125\\86.91406\\-275.1427\\125\\83.00781\\-277.7969\\125\\82.36417\\-278.3828\\125\\79.69365\\-280.3359\\125\\79.10156\\-280.8475\\125\\71.28906\\-285.5063\\125\\69.33594\\-286.8289\\125\\67.38281\\-287.7376\\125\\65.42969\\-288.8809\\125\\63.47656\\-289.5426\\125\\61.52344\\-290.7293\\125\\59.57031\\-291.4826\\125\\57.61719\\-292.6622\\125\\55.66406\\-293.3858\\125\\53.71094\\-294.4103\\125\\49.80469\\-295.4893\\125\\47.85156\\-296.3795\\125\\43.94531\\-297.3689\\125\\41.99219\\-298.2396\\125\\38.08594\\-299.189\\125\\36.02184\\-299.8672\\125\\34.17969\\-300.3644\\125\\28.32031\\-301.2577\\125\\26.36719\\-301.609\\125\\24.41406\\-302.0608\\125\\22.46094\\-302.3477\\125\\18.55469\\-302.7065\\125\\4.882813\\-303.3973\\125\\0.9765625\\-303.5033\\125\\-2.929688\\-303.4661\\125\\-10.74219\\-303.1053\\125\\-18.55469\\-302.6648\\125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "243" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "189" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-302.0067\\127\\-26.36719\\-301.5423\\127\\-28.32031\\-301.1966\\127\\-32.22656\\-300.6249\\127\\-34.17969\\-300.2616\\127\\-38.08594\\-299.05\\127\\-40.03906\\-298.6086\\127\\-43.94531\\-297.1491\\127\\-45.89844\\-296.7143\\127\\-49.80469\\-295.1906\\127\\-51.75781\\-294.6975\\127\\-53.71094\\-293.7551\\127\\-55.66406\\-292.955\\127\\-59.57031\\-291.0018\\127\\-61.52344\\-289.9152\\127\\-63.47656\\-289.0771\\127\\-65.34529\\-288.1484\\127\\-67.38281\\-287.0268\\127\\-69.33594\\-285.6943\\127\\-71.28906\\-284.5919\\127\\-75.19531\\-282.0712\\127\\-77.14844\\-280.9633\\127\\-77.90024\\-280.3359\\127\\-81.05469\\-277.9643\\127\\-83.00781\\-276.7481\\127\\-84.96094\\-275.3453\\127\\-88.86719\\-272.2268\\127\\-92.77344\\-269.31\\127\\-94.72656\\-267.7013\\127\\-98.63281\\-264.1814\\127\\-100.5859\\-262.7662\\127\\-102.5391\\-261.2427\\127\\-105.067\\-258.8516\\127\\-108.3984\\-255.8625\\127\\-110.3516\\-253.9824\\127\\-111.2421\\-252.9922\\127\\-116.2109\\-248.0359\\127\\-120.477\\-243.2266\\127\\-122.0703\\-241.1255\\127\\-123.2778\\-239.3203\\127\\-124.6985\\-237.3672\\127\\-127.9297\\-232.3379\\127\\-128.5022\\-231.5078\\127\\-129.3521\\-229.5547\\127\\-130.4342\\-227.6016\\127\\-131.1147\\-225.6484\\127\\-132.1482\\-223.6953\\127\\-132.8522\\-221.7422\\127\\-134.438\\-217.8359\\127\\-135.4852\\-213.9297\\127\\-136.1342\\-211.9766\\127\\-136.5222\\-210.0234\\127\\-137.0989\\-206.1172\\127\\-137.936\\-202.2109\\127\\-138.2392\\-200.2578\\127\\-138.4386\\-198.3047\\127\\-138.688\\-194.3984\\127\\-138.9608\\-186.5859\\127\\-138.946\\-180.7266\\127\\-138.7798\\-174.8672\\127\\-138.4649\\-169.0078\\127\\-138.1121\\-165.1016\\127\\-137.8461\\-163.1484\\127\\-137.3965\\-161.1953\\127\\-136.8506\\-157.2891\\127\\-136.4334\\-153.3828\\127\\-136.0677\\-151.4297\\127\\-135.0348\\-147.5234\\127\\-134.1706\\-143.6172\\127\\-133.3866\\-141.6641\\127\\-132.2095\\-137.7578\\127\\-131.3147\\-135.8047\\127\\-130.7419\\-133.8516\\127\\-130.0019\\-131.8984\\127\\-129.0953\\-129.9453\\127\\-128.3976\\-127.9922\\127\\-127.2599\\-126.0391\\127\\-126.32\\-124.0859\\127\\-123.8675\\-120.1797\\127\\-122.7371\\-118.2266\\127\\-121.2086\\-116.2734\\127\\-115.878\\-110.4141\\127\\-114.2578\\-108.7301\\127\\-108.3984\\-103.8974\\127\\-106.4453\\-102.5318\\127\\-104.4922\\-101.3941\\127\\-102.5391\\-100.1263\\127\\-100.5859\\-99.28891\\127\\-98.63281\\-98.07386\\127\\-96.67969\\-97.25584\\127\\-94.72656\\-96.2036\\127\\-92.77344\\-95.6203\\127\\-88.86719\\-94.2282\\127\\-84.96094\\-93.53436\\127\\-83.00781\\-93.1282\\127\\-81.05469\\-92.55411\\127\\-79.10156\\-92.17596\\127\\-75.19531\\-91.64592\\127\\-73.24219\\-91.30494\\127\\-69.33594\\-90.47388\\127\\-67.38281\\-90.17693\\127\\-63.47656\\-89.75064\\127\\-59.57031\\-89.2213\\127\\-57.61719\\-88.87543\\127\\-53.71094\\-88.34503\\127\\-51.75781\\-88.20654\\127\\-34.17969\\-87.41737\\127\\-32.22656\\-87.31158\\127\\-28.32031\\-87.24621\\127\\-24.41406\\-87.28761\\127\\-18.55469\\-87.54677\\127\\-14.64844\\-87.84937\\127\\-12.69531\\-88.07444\\127\\-10.74219\\-88.43144\\127\\-8.789063\\-89.125\\127\\-4.882813\\-90.14745\\127\\-2.872243\\-90.88281\\127\\-0.9765625\\-91.47232\\127\\0.9765625\\-91.66517\\127\\2.929688\\-91.72989\\127\\4.882813\\-91.625\\127\\6.835938\\-91.36794\\127\\10.74219\\-90.21779\\127\\12.69531\\-89.70035\\127\\16.60156\\-88.20514\\127\\20.50781\\-87.65952\\127\\24.41406\\-86.95274\\127\\28.32031\\-86.42114\\127\\34.17969\\-86.02839\\127\\40.03906\\-85.82399\\127\\45.89844\\-85.84976\\127\\53.71094\\-86.32744\\127\\55.66406\\-86.57406\\127\\59.57031\\-87.33487\\127\\63.47656\\-87.82132\\127\\67.38281\\-88.22001\\127\\69.33594\\-88.54313\\127\\73.24219\\-89.47825\\127\\77.14844\\-90.18295\\127\\79.10156\\-90.69581\\127\\81.05469\\-91.45691\\127\\84.96094\\-92.47681\\127\\86.91406\\-93.28718\\127\\90.82031\\-94.29053\\127\\92.77344\\-95.19482\\127\\94.72656\\-95.86032\\127\\96.66666\\-96.74219\\127\\98.63281\\-97.73661\\127\\100.5859\\-98.88755\\127\\102.5391\\-99.8807\\127\\104.4922\\-101.0286\\127\\106.4453\\-102.0445\\127\\109.829\\-104.5547\\127\\114.2578\\-108.09\\127\\116.5613\\-110.4141\\127\\118.1384\\-112.3672\\127\\120.1172\\-114.5889\\127\\122.8711\\-118.2266\\127\\123.9168\\-120.1797\\127\\126.169\\-124.0859\\127\\127.0414\\-126.0391\\127\\128.0441\\-127.9922\\127\\128.7971\\-129.9453\\127\\129.3433\\-131.8984\\127\\130.2083\\-133.8516\\127\\131.1252\\-137.7578\\127\\132.4542\\-141.6641\\127\\133.2976\\-145.5703\\127\\133.9139\\-147.5234\\127\\134.3738\\-149.4766\\127\\135.294\\-155.3359\\127\\136.0556\\-159.2422\\127\\136.5197\\-163.1484\\127\\137.1159\\-172.9141\\127\\137.4364\\-178.7734\\127\\137.608\\-182.6797\\127\\137.6546\\-188.5391\\127\\137.5031\\-192.4453\\127\\137.1705\\-198.3047\\127\\136.5836\\-206.1172\\127\\136.0285\\-210.0234\\127\\135.4705\\-211.9766\\127\\134.5572\\-215.8828\\127\\133.8882\\-217.8359\\127\\132.9733\\-219.7891\\127\\132.1637\\-221.7422\\127\\131.0585\\-223.6953\\127\\130.2399\\-225.6484\\127\\129.1183\\-227.6016\\127\\128.1906\\-229.5547\\127\\126.9234\\-231.5078\\127\\125.5388\\-233.4609\\127\\124.4888\\-235.4141\\127\\121.7963\\-239.3203\\127\\120.5448\\-241.2734\\127\\118.8996\\-243.2266\\127\\115.8023\\-247.1328\\127\\114.3438\\-249.0859\\127\\112.3047\\-251.2893\\127\\109.1648\\-254.9453\\127\\105.2007\\-258.8516\\127\\102.5391\\-261.6856\\127\\99.25426\\-264.7109\\127\\96.67969\\-267.2709\\127\\94.72656\\-269.018\\127\\92.77344\\-270.4022\\127\\88.86719\\-273.806\\127\\86.91406\\-275.3775\\127\\80.07813\\-280.3359\\127\\79.10156\\-281.0934\\127\\77.13783\\-282.2891\\127\\75.19531\\-283.3592\\127\\73.24219\\-284.7117\\127\\71.28906\\-285.7635\\127\\69.33594\\-287.0428\\127\\65.42969\\-289.0346\\127\\63.47656\\-289.7784\\127\\61.52344\\-290.9037\\127\\59.57031\\-291.7336\\127\\57.61719\\-292.8649\\127\\55.66406\\-293.5929\\127\\53.71094\\-294.5739\\127\\49.80469\\-295.6933\\127\\47.85156\\-296.5577\\127\\45.89844\\-296.9952\\127\\43.94531\\-297.5536\\127\\41.99219\\-298.4109\\127\\38.08594\\-299.3234\\127\\36.13281\\-300.0416\\127\\34.17969\\-300.4704\\127\\28.32031\\-301.3588\\127\\24.41406\\-302.2012\\127\\22.46094\\-302.4441\\127\\18.55469\\-302.7804\\127\\14.64844\\-302.9651\\127\\10.74219\\-303.2162\\127\\2.929688\\-303.6599\\127\\-0.9765625\\-303.7042\\127\\-4.882813\\-303.5767\\127\\-10.74219\\-303.2249\\127\\-14.64844\\-302.9542\\127\\-18.55469\\-302.7351\\127\\-22.46094\\-302.3381\\127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "253" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "190" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.882813\\-303.8256\\129\\-12.69531\\-303.1875\\129\\-20.50781\\-302.6516\\129\\-24.41406\\-302.1761\\129\\-26.36719\\-301.6916\\129\\-28.32031\\-301.3156\\129\\-34.17969\\-300.394\\129\\-36.06912\\-299.8672\\129\\-38.08594\\-299.1852\\129\\-40.03906\\-298.7221\\129\\-41.99219\\-298.1378\\129\\-43.94531\\-297.2802\\129\\-45.89844\\-296.808\\129\\-47.85156\\-296.1607\\129\\-49.80469\\-295.2915\\129\\-51.75781\\-294.8096\\129\\-53.69636\\-294.0078\\129\\-57.61719\\-292.2417\\129\\-59.57031\\-291.119\\129\\-63.47656\\-289.1605\\129\\-65.42969\\-288.2813\\129\\-71.28906\\-284.7709\\129\\-73.24219\\-283.3669\\129\\-75.16347\\-282.2891\\129\\-77.14844\\-281.0572\\129\\-81.05469\\-278.0927\\129\\-83.00781\\-276.8615\\129\\-84.96094\\-275.4148\\129\\-91.0443\\-270.5703\\129\\-92.77344\\-269.2794\\129\\-94.72656\\-267.6345\\129\\-98.63281\\-264.0533\\129\\-100.5859\\-262.4467\\129\\-102.5391\\-260.9984\\129\\-104.7678\\-258.8516\\129\\-108.3984\\-255.594\\129\\-110.3516\\-253.6062\\129\\-112.3047\\-251.4948\\129\\-114.7498\\-249.0859\\129\\-116.5213\\-247.1328\\129\\-117.9497\\-245.1797\\129\\-121.245\\-241.2734\\129\\-122.7553\\-239.3203\\129\\-123.8839\\-237.3672\\129\\-125.1134\\-235.4141\\129\\-126.4812\\-233.4609\\129\\-127.5152\\-231.5078\\129\\-128.6834\\-229.5547\\129\\-129.4735\\-227.6016\\129\\-130.4874\\-225.6484\\129\\-131.1478\\-223.6953\\129\\-132.0886\\-221.7422\\129\\-133.4194\\-217.8359\\129\\-134.2238\\-215.8828\\129\\-134.7355\\-213.9297\\129\\-135.1376\\-211.9766\\129\\-136.1707\\-208.0703\\129\\-136.5017\\-206.1172\\129\\-137.1596\\-200.2578\\129\\-137.4435\\-198.3047\\129\\-137.91\\-194.3984\\129\\-138.0487\\-192.4453\\129\\-138.2694\\-186.5859\\129\\-138.2859\\-180.7266\\129\\-138.1686\\-176.8203\\129\\-137.981\\-172.9141\\129\\-137.8183\\-170.9609\\129\\-137.3291\\-167.0547\\129\\-136.3911\\-157.2891\\129\\-136.1057\\-155.3359\\129\\-135.2041\\-151.4297\\129\\-134.4702\\-147.5234\\129\\-133.9567\\-145.5703\\129\\-133.2409\\-143.6172\\129\\-132.1857\\-139.7109\\129\\-131.2941\\-137.7578\\129\\-130.1193\\-133.8516\\129\\-129.2164\\-131.8984\\129\\-128.5786\\-129.9453\\129\\-127.5405\\-127.9922\\129\\-126.6297\\-126.0391\\129\\-125.4157\\-124.0859\\129\\-124.4888\\-122.1328\\129\\-122.0703\\-118.3646\\129\\-120.5716\\-116.2734\\129\\-117.1162\\-112.3672\\129\\-114.2578\\-109.3282\\129\\-112.3047\\-107.539\\129\\-110.3516\\-105.9745\\129\\-108.3984\\-104.5316\\129\\-104.4922\\-101.7802\\129\\-102.5042\\-100.6484\\129\\-98.63281\\-98.64191\\129\\-94.71241\\-96.74219\\129\\-92.77344\\-95.95979\\129\\-90.82031\\-95.4002\\129\\-88.86719\\-94.6573\\129\\-86.91406\\-94.12322\\129\\-83.00781\\-93.51393\\129\\-81.05469\\-93.13034\\129\\-79.10156\\-92.57685\\129\\-77.14844\\-92.21599\\129\\-71.28906\\-91.45488\\129\\-69.33594\\-91.07388\\129\\-67.38281\\-90.5638\\129\\-65.42969\\-90.25983\\129\\-57.61719\\-89.36724\\129\\-51.75781\\-88.49335\\129\\-49.80469\\-88.33609\\129\\-41.99219\\-87.94128\\129\\-32.22656\\-87.62547\\129\\-28.32031\\-87.58691\\129\\-24.41406\\-87.62122\\129\\-16.60156\\-87.89321\\129\\-14.64844\\-88.03247\\129\\-12.69531\\-88.3112\\129\\-10.74219\\-88.87366\\129\\-8.789063\\-89.54231\\129\\-6.835938\\-90.00277\\129\\-4.882813\\-90.57974\\129\\-2.929688\\-91.45197\\129\\-0.9765625\\-91.84882\\129\\0.9765625\\-92.04717\\129\\2.929688\\-92.11317\\129\\4.882813\\-92.00586\\129\\8.789063\\-91.41492\\129\\10.74219\\-90.70461\\129\\14.64844\\-89.44669\\129\\16.60156\\-88.56348\\129\\18.55469\\-88.14967\\129\\22.46094\\-87.74164\\129\\26.36719\\-87.0639\\129\\28.32031\\-86.77979\\129\\32.22656\\-86.41246\\129\\38.08594\\-86.13242\\129\\40.03906\\-86.07554\\129\\45.89844\\-86.08828\\129\\51.75781\\-86.33515\\129\\53.71094\\-86.48202\\129\\55.66406\\-86.75231\\129\\59.57031\\-87.45147\\129\\61.52344\\-87.71509\\129\\65.42969\\-88.10199\\129\\67.38281\\-88.37439\\129\\71.28906\\-89.34187\\129\\75.19531\\-90.03751\\129\\77.14844\\-90.4687\\129\\79.10156\\-91.19718\\129\\83.00781\\-92.20536\\129\\84.96094\\-92.9677\\129\\86.91406\\-93.60627\\129\\88.86719\\-94.02399\\129\\90.82031\\-94.70101\\129\\92.77344\\-95.5493\\129\\94.72656\\-96.23186\\129\\96.67969\\-97.30859\\129\\98.63281\\-98.21687\\129\\100.5859\\-99.43848\\129\\102.5391\\-100.2706\\129\\106.2861\\-102.6016\\129\\108.3984\\-104.005\\129\\110.3516\\-105.5859\\129\\113.7494\\-108.4609\\129\\115.7048\\-110.4141\\129\\118.1641\\-113.1438\\129\\120.8972\\-116.2734\\129\\122.237\\-118.2266\\129\\123.2778\\-120.1797\\129\\124.4857\\-122.1328\\129\\125.3443\\-124.0859\\129\\126.4743\\-126.0391\\129\\127.2234\\-127.9922\\129\\128.2077\\-129.9453\\129\\128.8499\\-131.8984\\129\\129.3876\\-133.8516\\129\\130.1157\\-135.8047\\129\\130.6106\\-137.7578\\129\\131.0049\\-139.7109\\129\\131.5104\\-141.6641\\129\\132.2021\\-143.6172\\129\\133.4246\\-149.4766\\129\\133.9815\\-151.4297\\129\\134.3725\\-153.3828\\129\\134.6539\\-155.3359\\129\\135.1149\\-159.2422\\129\\135.9482\\-165.1016\\129\\136.3334\\-169.0078\\129\\136.5423\\-172.9141\\129\\136.7373\\-178.7734\\129\\136.817\\-182.6797\\129\\136.8195\\-188.5391\\129\\136.7496\\-192.4453\\129\\136.5497\\-198.3047\\129\\136.3051\\-202.2109\\129\\135.7422\\-206.1579\\129\\134.7355\\-211.9766\\129\\134.3281\\-213.9297\\129\\133.7891\\-215.4959\\129\\132.1771\\-219.7891\\129\\131.1393\\-221.7422\\129\\130.438\\-223.6953\\129\\129.3395\\-225.6484\\129\\128.5786\\-227.6016\\129\\127.3541\\-229.5547\\129\\126.3323\\-231.5078\\129\\125\\-233.4609\\129\\122.793\\-237.3672\\129\\122.0703\\-238.3438\\129\\120.1172\\-241.2644\\129\\117.2319\\-245.1797\\129\\114.2658\\-249.0859\\129\\112.3047\\-251.3377\\129\\109.2613\\-254.9453\\129\\107.3694\\-256.8984\\129\\106.4453\\-257.7484\\129\\101.6507\\-262.7578\\129\\100.5859\\-263.665\\129\\96.67969\\-267.5329\\129\\94.72656\\-269.2881\\129\\93.10176\\-270.5703\\129\\88.47128\\-274.4766\\129\\86.91406\\-275.599\\129\\83.00781\\-278.6006\\129\\79.10156\\-281.3248\\129\\77.14844\\-282.617\\129\\75.19531\\-283.5932\\129\\73.24219\\-284.965\\129\\71.19846\\-286.1953\\129\\67.38281\\-288.3646\\129\\65.42969\\-289.1793\\129\\61.52344\\-291.0781\\129\\59.57031\\-292.1069\\129\\57.61719\\-293.026\\129\\53.71094\\-294.7447\\129\\51.75781\\-295.2178\\129\\47.85156\\-296.7074\\129\\45.89844\\-297.123\\129\\43.94531\\-297.7883\\129\\41.99219\\-298.553\\129\\40.03906\\-298.9661\\129\\38.08594\\-299.5034\\129\\36.13281\\-300.1949\\129\\34.17969\\-300.5759\\129\\28.32031\\-301.4809\\129\\26.36719\\-301.95\\129\\24.41406\\-302.3152\\129\\22.46094\\-302.5421\\129\\18.55469\\-302.8293\\129\\16.60156\\-302.9189\\129\\8.789063\\-303.4756\\129\\4.882813\\-303.811\\129\\0.9765625\\-303.9478\\129\\-2.929688\\-303.9221\\129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "255" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "191" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-303.9221\\131\\-12.69531\\-303.3039\\131\\-16.60156\\-302.9759\\131\\-20.50781\\-302.7239\\131\\-24.41406\\-302.3152\\131\\-28.32031\\-301.4447\\131\\-34.17969\\-300.5086\\131\\-36.13281\\-300.0542\\131\\-38.08594\\-299.3234\\131\\-41.99219\\-298.33\\131\\-43.94531\\-297.4289\\131\\-47.85156\\-296.3556\\131\\-49.80469\\-295.4184\\131\\-51.75781\\-294.9181\\131\\-53.71094\\-294.2537\\131\\-55.66406\\-293.2363\\131\\-57.61719\\-292.4441\\131\\-59.57031\\-291.2409\\131\\-61.52344\\-290.3872\\131\\-63.47656\\-289.2485\\131\\-65.42969\\-288.4618\\131\\-65.85385\\-288.1484\\131\\-69.22743\\-286.1953\\131\\-71.28906\\-284.9151\\131\\-73.24219\\-283.4766\\131\\-75.19531\\-282.4813\\131\\-77.14844\\-281.1793\\131\\-80.94524\\-278.3828\\131\\-83.00781\\-276.9652\\131\\-84.96094\\-275.5117\\131\\-92.77344\\-269.2928\\131\\-94.72656\\-267.6223\\131\\-98.63281\\-263.9868\\131\\-100.5859\\-262.2562\\131\\-102.5124\\-260.8047\\131\\-104.4922\\-258.7926\\131\\-106.5421\\-256.8984\\131\\-108.3984\\-255.2886\\131\\-110.5183\\-252.9922\\131\\-112.2289\\-251.0391\\131\\-114.2578\\-249.0254\\131\\-117.4216\\-245.1797\\131\\-120.7205\\-241.2734\\131\\-122.0703\\-239.2667\\131\\-123.2382\\-237.3672\\131\\-124.5473\\-235.4141\\131\\-125.5049\\-233.4609\\131\\-126.8043\\-231.5078\\131\\-128.8757\\-227.6016\\131\\-129.5965\\-225.6484\\131\\-130.5658\\-223.6953\\131\\-131.1286\\-221.7422\\131\\-132.0141\\-219.7891\\131\\-133.2409\\-215.8828\\131\\-134.0209\\-213.9297\\131\\-134.4858\\-211.9766\\131\\-135.2174\\-208.0703\\131\\-136.0822\\-204.1641\\131\\-136.3954\\-202.2109\\131\\-136.7249\\-198.3047\\131\\-137.0216\\-192.4453\\131\\-137.2204\\-186.5859\\131\\-137.2681\\-180.7266\\131\\-137.0929\\-174.8672\\131\\-136.8266\\-169.0078\\131\\-136.615\\-165.1016\\131\\-136.4588\\-163.1484\\131\\-135.9992\\-159.2422\\131\\-135.2439\\-155.3359\\131\\-134.3168\\-149.4766\\131\\-133.109\\-145.5703\\131\\-132.0766\\-141.6641\\131\\-131.2641\\-139.7109\\131\\-130.7635\\-137.7578\\131\\-130.1565\\-135.8047\\131\\-129.2834\\-133.8516\\131\\-128.7197\\-131.8984\\131\\-126.9124\\-127.9922\\131\\-125.8138\\-126.0391\\131\\-124.8498\\-124.0859\\131\\-123.6757\\-122.1328\\131\\-122.7327\\-120.1797\\131\\-121.2928\\-118.2266\\131\\-118.1641\\-114.4171\\131\\-116.4288\\-112.3672\\131\\-114.6603\\-110.4141\\131\\-112.3047\\-108.1657\\131\\-110.2283\\-106.5078\\131\\-108.3984\\-105.1989\\131\\-106.4453\\-103.661\\131\\-104.4922\\-102.2445\\131\\-102.5391\\-101.2249\\131\\-100.5859\\-100.0206\\131\\-98.63281\\-99.2709\\131\\-96.67969\\-98.08496\\131\\-94.72656\\-97.33531\\131\\-92.77344\\-96.32006\\131\\-88.86719\\-95.21336\\131\\-86.91406\\-94.47801\\131\\-84.96094\\-94.04887\\131\\-81.05469\\-93.52563\\131\\-79.10156\\-93.15907\\131\\-77.14844\\-92.64893\\131\\-75.19531\\-92.26765\\131\\-69.33594\\-91.52455\\131\\-65.42969\\-90.68196\\131\\-61.52344\\-90.0814\\131\\-53.71094\\-89.30078\\131\\-51.75781\\-89.05451\\131\\-49.80469\\-88.69859\\131\\-47.85156\\-88.50829\\131\\-43.94531\\-88.23214\\131\\-40.03906\\-88.03599\\131\\-32.22656\\-87.85727\\131\\-26.36719\\-87.82132\\131\\-22.46094\\-87.88763\\131\\-16.60156\\-88.08493\\131\\-14.64844\\-88.2595\\131\\-12.69531\\-88.70034\\131\\-10.74219\\-89.3987\\131\\-6.835938\\-90.3541\\131\\-4.882813\\-91.21282\\131\\-2.929688\\-91.82902\\131\\-0.9765625\\-92.21202\\131\\0.9765625\\-92.45651\\131\\2.929688\\-92.58675\\131\\4.882813\\-92.46421\\131\\6.835938\\-92.19785\\131\\10.74219\\-91.33504\\131\\12.69531\\-90.44662\\131\\16.60156\\-89.16322\\131\\18.55469\\-88.44819\\131\\20.50781\\-88.15709\\131\\26.36719\\-87.49783\\131\\32.22656\\-86.71473\\131\\36.13281\\-86.4545\\131\\40.03906\\-86.32359\\131\\43.94531\\-86.27501\\131\\47.85156\\-86.34671\\131\\51.75781\\-86.52041\\131\\53.71094\\-86.71473\\131\\59.57031\\-87.59167\\131\\65.42969\\-88.20788\\131\\67.38281\\-88.54313\\131\\69.33594\\-89.13343\\131\\71.28906\\-89.54004\\131\\75.19531\\-90.23738\\131\\79.10156\\-91.51266\\131\\81.05469\\-91.95161\\131\\83.00781\\-92.52113\\131\\84.96094\\-93.33418\\131\\88.86719\\-94.28043\\131\\90.82031\\-95.18385\\131\\92.77344\\-95.85387\\131\\94.72656\\-96.70434\\131\\96.67969\\-97.73045\\131\\98.63281\\-98.87079\\131\\100.5859\\-99.77713\\131\\104.4922\\-101.8591\\131\\110.3516\\-106.1416\\131\\112.3047\\-107.6756\\131\\115.2018\\-110.4141\\131\\118.1641\\-113.7658\\131\\120.2005\\-116.2734\\131\\122.832\\-120.1797\\131\\123.7178\\-122.1328\\131\\124.8151\\-124.0859\\131\\125.6183\\-126.0391\\131\\126.6716\\-127.9922\\131\\127.36\\-129.9453\\131\\128.2942\\-131.8984\\131\\128.8689\\-133.8516\\131\\129.3009\\-135.8047\\131\\130.506\\-139.7109\\131\\131.25\\-143.6172\\131\\132.383\\-147.5234\\131\\133.4321\\-153.3828\\131\\133.9286\\-155.3359\\131\\134.268\\-157.2891\\131\\134.7078\\-161.1953\\131\\135.905\\-174.8672\\131\\136.094\\-178.7734\\131\\136.2271\\-182.6797\\131\\136.2062\\-188.5391\\131\\136.1084\\-192.4453\\131\\135.905\\-196.3516\\131\\135.3306\\-202.2109\\131\\134.6954\\-208.0703\\131\\134.41\\-210.0234\\131\\133.9958\\-211.9766\\131\\133.3201\\-213.9297\\131\\132.7673\\-215.8828\\131\\132.106\\-217.8359\\131\\131.1618\\-219.7891\\131\\130.5658\\-221.7422\\131\\129.6049\\-223.6953\\131\\128.8203\\-225.6484\\131\\126.8402\\-229.5547\\131\\125.5552\\-231.5078\\131\\124.6405\\-233.4609\\131\\123.3617\\-235.4141\\131\\122.4958\\-237.3672\\131\\119.7225\\-241.2734\\131\\118.5162\\-243.2266\\131\\117.1245\\-245.1797\\131\\115.6276\\-247.1328\\131\\114.2578\\-249.0766\\131\\111.0383\\-252.9922\\131\\109.3684\\-254.9453\\131\\107.5604\\-256.8984\\131\\105.618\\-258.8516\\131\\104.4922\\-260.1232\\131\\101.98\\-262.7578\\131\\100.5859\\-263.936\\131\\95.7459\\-268.6172\\131\\91.26157\\-272.5234\\131\\88.86719\\-274.5653\\131\\86.91406\\-275.7939\\131\\83.00781\\-278.9489\\131\\81.02448\\-280.3359\\131\\79.10156\\-281.5551\\131\\77.14844\\-282.8945\\131\\75.19531\\-283.8698\\131\\74.74525\\-284.2422\\131\\71.64797\\-286.1953\\131\\71.28906\\-286.491\\131\\69.33594\\-287.4475\\131\\67.38281\\-288.6401\\131\\65.42969\\-289.3489\\131\\63.47656\\-290.4834\\131\\61.52344\\-291.2557\\131\\59.57031\\-292.4313\\131\\57.61719\\-293.1886\\131\\55.66406\\-294.1742\\131\\53.71094\\-294.8726\\131\\51.75781\\-295.3673\\131\\49.80469\\-296.2247\\131\\47.85156\\-296.8154\\131\\45.89844\\-297.2687\\131\\43.94531\\-298.0757\\131\\41.99219\\-298.6709\\131\\40.03906\\-299.0954\\131\\36.13281\\-300.31\\131\\34.17969\\-300.6718\\131\\30.27344\\-301.2614\\131\\28.32031\\-301.6353\\131\\26.36719\\-302.1126\\131\\24.41406\\-302.4101\\131\\20.50781\\-302.7748\\131\\16.60156\\-303.0042\\131\\12.69531\\-303.3232\\131\\6.835938\\-303.882\\131\\4.882813\\-304.0325\\131\\0.9765625\\-304.1404\\131\\-2.929688\\-304.12\\131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "252" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "192" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-303.9221\\133\\-14.64844\\-303.2336\\133\\-18.55469\\-302.9036\\133\\-22.46094\\-302.6466\\133\\-24.41406\\-302.4315\\133\\-26.36719\\-302.0754\\133\\-30.27344\\-301.214\\133\\-34.17969\\-300.6136\\133\\-36.13281\\-300.216\\133\\-38.08594\\-299.4804\\133\\-41.99219\\-298.4713\\133\\-43.94531\\-297.5975\\133\\-45.89844\\-297.0002\\133\\-47.85156\\-296.5021\\133\\-49.80469\\-295.5827\\133\\-53.71094\\-294.4235\\133\\-55.66406\\-293.3812\\133\\-57.61719\\-292.6201\\133\\-59.57031\\-291.3689\\133\\-61.52344\\-290.5629\\133\\-63.47656\\-289.3508\\133\\-65.42969\\-288.6333\\133\\-67.38281\\-287.3896\\133\\-69.33594\\-286.3439\\133\\-71.28906\\-285.0569\\133\\-73.24219\\-283.6224\\133\\-75.19531\\-282.6641\\133\\-79.10156\\-279.8541\\133\\-83.94299\\-276.4297\\133\\-88.86719\\-272.561\\133\\-92.77344\\-269.3243\\133\\-94.72656\\-267.6406\\133\\-98.63281\\-263.9633\\133\\-100.5859\\-262.2007\\133\\-102.25\\-260.8047\\133\\-104.4922\\-258.5055\\133\\-108.3984\\-254.9028\\133\\-111.7881\\-251.0391\\133\\-114.2578\\-248.4607\\133\\-117.0753\\-245.1797\\133\\-120.1172\\-241.195\\133\\-122.7716\\-237.3672\\133\\-123.7697\\-235.4141\\133\\-126.0901\\-231.5078\\133\\-127.1101\\-229.5547\\133\\-128.2552\\-227.6016\\133\\-129.7489\\-223.6953\\133\\-130.5812\\-221.7422\\133\\-131.1306\\-219.7891\\133\\-131.903\\-217.8359\\133\\-132.5546\\-215.8828\\133\\-133.0202\\-213.9297\\133\\-134.1912\\-210.0234\\133\\-134.5783\\-208.0703\\133\\-135.1486\\-204.1641\\133\\-135.8288\\-200.2578\\133\\-136.3216\\-196.3516\\133\\-136.5345\\-192.4453\\133\\-136.6828\\-186.5859\\133\\-136.7069\\-182.6797\\133\\-136.6469\\-176.8203\\133\\-136.5345\\-172.9141\\133\\-136.2101\\-167.0547\\133\\-135.9992\\-165.1016\\133\\-135.3777\\-161.1953\\133\\-134.4267\\-153.3828\\133\\-134.0281\\-151.4297\\133\\-133.437\\-149.4766\\133\\-132.5457\\-145.5703\\133\\-131.958\\-143.6172\\133\\-131.2117\\-141.6641\\133\\-130.7594\\-139.7109\\133\\-130.2083\\-137.7578\\133\\-129.3678\\-135.8047\\133\\-128.7818\\-133.8516\\133\\-128.0851\\-131.8984\\133\\-127.0951\\-129.9453\\133\\-126.2489\\-127.9922\\133\\-125.1131\\-126.0391\\133\\-124.2511\\-124.0859\\133\\-123.0907\\-122.1328\\133\\-122.0703\\-120.2378\\133\\-120.6853\\-118.2266\\133\\-118.1641\\-115.1541\\133\\-115.7011\\-112.3672\\133\\-112.3047\\-108.8826\\133\\-109.5133\\-106.5078\\133\\-106.4453\\-104.1576\\133\\-102.5391\\-101.6438\\133\\-100.5859\\-100.5156\\133\\-98.63281\\-99.65401\\133\\-96.67969\\-98.64313\\133\\-94.72656\\-97.73987\\133\\-90.82031\\-96.08922\\133\\-86.91406\\-95.05871\\133\\-84.96094\\-94.36658\\133\\-83.00781\\-94.01646\\133\\-79.10156\\-93.54889\\133\\-77.14844\\-93.23605\\133\\-75.19531\\-92.7005\\133\\-73.24219\\-92.3058\\133\\-67.38281\\-91.56426\\133\\-65.42969\\-91.26963\\133\\-61.52344\\-90.41806\\133\\-55.66406\\-89.79357\\133\\-51.75781\\-89.4768\\133\\-47.85156\\-89.0266\\133\\-43.94531\\-88.48344\\133\\-40.03906\\-88.23999\\133\\-36.13281\\-88.10199\\133\\-28.32031\\-87.9948\\133\\-24.41406\\-88.02415\\133\\-18.55469\\-88.18822\\133\\-16.60156\\-88.30994\\133\\-14.64844\\-88.59709\\133\\-12.69531\\-89.22334\\133\\-8.789063\\-90.16005\\133\\-4.882813\\-91.64972\\133\\-0.9765625\\-92.67435\\133\\0.9765625\\-93.1282\\133\\2.929688\\-93.27071\\133\\4.882813\\-93.14245\\133\\8.789063\\-92.26309\\133\\10.74219\\-91.76505\\133\\12.69531\\-91.10873\\133\\14.64844\\-90.17946\\133\\16.60156\\-89.63726\\133\\20.50781\\-88.41465\\133\\22.46094\\-88.10383\\133\\30.27344\\-87.40983\\133\\32.22656\\-87.12383\\133\\36.13281\\-86.793\\133\\41.99219\\-86.55338\\133\\45.89844\\-86.55338\\133\\49.80469\\-86.67662\\133\\51.75781\\-86.82001\\133\\59.57031\\-87.72729\\133\\63.47656\\-88.09517\\133\\65.42969\\-88.33878\\133\\67.38281\\-88.77314\\133\\69.33594\\-89.35181\\133\\73.24219\\-90.02832\\133\\75.19531\\-90.47642\\133\\77.14844\\-91.26438\\133\\81.05469\\-92.24458\\133\\84.96094\\-93.58667\\133\\86.91406\\-94.00171\\133\\88.86719\\-94.64296\\133\\90.82031\\-95.52759\\133\\92.77344\\-96.15128\\133\\94.72656\\-97.23689\\133\\96.67969\\-98.1044\\133\\98.63281\\-99.36087\\133\\100.5859\\-100.1044\\133\\102.5391\\-101.2928\\133\\104.4922\\-102.3517\\133\\106.4453\\-103.7307\\133\\112.3047\\-108.3418\\133\\114.5339\\-110.4141\\133\\116.2694\\-112.3672\\133\\118.1641\\-114.6265\\133\\120.9449\\-118.2266\\133\\122.25\\-120.1797\\133\\123.1408\\-122.1328\\133\\124.2098\\-124.0859\\133\\125\\-126.0391\\133\\126.7785\\-129.9453\\133\\127.4034\\-131.8984\\133\\128.2691\\-133.8516\\133\\128.7834\\-135.8047\\133\\129.6768\\-139.7109\\133\\130.3267\\-141.6641\\133\\130.7257\\-143.6172\\133\\131.3982\\-147.5234\\133\\131.9589\\-149.4766\\133\\132.4013\\-151.4297\\133\\133.2637\\-157.2891\\133\\133.9647\\-161.1953\\133\\134.2403\\-163.1484\\133\\134.5669\\-167.0547\\133\\134.8943\\-172.9141\\133\\135.1537\\-180.7266\\133\\135.1982\\-184.6328\\133\\135.1888\\-188.5391\\133\\134.9573\\-196.3516\\133\\134.7366\\-200.2578\\133\\134.4342\\-204.1641\\133\\134.2238\\-206.1172\\133\\133.8984\\-208.0703\\133\\133.3997\\-210.0234\\133\\132.5967\\-213.9297\\133\\131.9589\\-215.8828\\133\\131.1375\\-217.8359\\133\\130.6213\\-219.7891\\133\\128.999\\-223.6953\\133\\128.3027\\-225.6484\\133\\127.2116\\-227.6016\\133\\126.3735\\-229.5547\\133\\125.1371\\-231.5078\\133\\124.2084\\-233.4609\\133\\123.1197\\-235.4141\\133\\122.1576\\-237.3672\\133\\120.9581\\-239.3203\\133\\119.492\\-241.2734\\133\\118.3257\\-243.2266\\133\\117.0489\\-245.1797\\133\\115.5918\\-247.1328\\133\\114.2578\\-249.0583\\133\\110.3516\\-253.9764\\133\\107.777\\-256.8984\\133\\105.8824\\-258.8516\\133\\104.4922\\-260.4404\\133\\102.3339\\-262.7578\\133\\100.5859\\-264.2761\\133\\96.17486\\-268.6172\\133\\94.72656\\-269.692\\133\\91.55599\\-272.5234\\133\\90.82031\\-273.264\\133\\88.86719\\-274.9256\\133\\86.91406\\-276.1668\\133\\84.96094\\-277.6003\\133\\83.00781\\-279.2292\\133\\81.05469\\-280.7172\\133\\79.10156\\-281.8076\\133\\77.14844\\-283.0836\\133\\73.24219\\-285.3953\\133\\71.28906\\-286.765\\133\\69.33594\\-287.6862\\133\\67.38281\\-288.8352\\133\\65.42969\\-289.526\\133\\63.47656\\-290.7105\\133\\61.52344\\-291.462\\133\\59.57031\\-292.6736\\133\\57.61719\\-293.3901\\133\\55.66406\\-294.4207\\133\\51.75781\\-295.5201\\133\\49.80469\\-296.4299\\133\\45.89844\\-297.4197\\133\\43.94531\\-298.2911\\133\\40.03906\\-299.2402\\133\\38.08594\\-299.9338\\133\\36.13281\\-300.4393\\133\\30.27344\\-301.3752\\133\\26.36719\\-302.2476\\133\\22.46094\\-302.7127\\133\\16.60156\\-303.1053\\133\\12.69531\\-303.4777\\133\\10.74219\\-303.75\\133\\6.835938\\-304.0883\\133\\2.929688\\-304.2531\\133\\-2.929688\\-304.2617\\133\\-6.835938\\-304.0883\\133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "193" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.74219\\-303.9089\\135\\-14.64844\\-303.366\\135\\-18.55469\\-302.9824\\135\\-24.41406\\-302.5377\\135\\-26.36719\\-302.2232\\135\\-30.27344\\-301.3288\\135\\-34.17969\\-300.705\\135\\-36.13281\\-300.3405\\135\\-40.03906\\-299.0645\\135\\-41.99219\\-298.5905\\135\\-45.89844\\-297.0976\\135\\-47.85156\\-296.637\\135\\-49.80469\\-295.7597\\135\\-51.75781\\-295.111\\135\\-53.71094\\-294.5649\\135\\-55.66406\\-293.5413\\135\\-57.61719\\-292.7624\\135\\-59.57031\\-291.5193\\135\\-61.52344\\-290.7146\\135\\-63.47656\\-289.4865\\135\\-65.42969\\-288.7758\\135\\-67.38281\\-287.5242\\135\\-69.33594\\-286.5591\\135\\-72.69498\\-284.2422\\135\\-73.24219\\-283.8014\\135\\-75.19531\\-282.8367\\135\\-79.10156\\-280.0722\\135\\-81.05469\\-278.7622\\135\\-88.86719\\-272.7351\\135\\-90.82031\\-271.0173\\135\\-94.72656\\-267.7036\\135\\-99.92767\\-262.7578\\135\\-102.1589\\-260.8047\\135\\-103.9254\\-258.8516\\135\\-106.4453\\-256.3627\\135\\-108.3984\\-254.5441\\135\\-111.5274\\-251.0391\\135\\-114.2578\\-248.1375\\135\\-116.7134\\-245.1797\\135\\-118.0081\\-243.2266\\135\\-119.4231\\-241.2734\\135\\-120.947\\-239.3203\\135\\-122.2344\\-237.3672\\135\\-123.2256\\-235.4141\\135\\-124.4523\\-233.4609\\135\\-125.3152\\-231.5078\\135\\-126.5613\\-229.5547\\135\\-127.3999\\-227.6016\\135\\-128.457\\-225.6484\\135\\-129.1155\\-223.6953\\135\\-130.6243\\-219.7891\\135\\-131.0608\\-217.8359\\135\\-131.6757\\-215.8828\\135\\-132.3897\\-213.9297\\135\\-133.2056\\-210.0234\\135\\-133.7891\\-208.0446\\135\\-134.2586\\-206.1172\\135\\-134.5434\\-204.1641\\135\\-135.4096\\-196.3516\\135\\-135.9314\\-190.4922\\135\\-136.1031\\-186.5859\\135\\-136.1286\\-180.7266\\135\\-135.9466\\-174.8672\\135\\-135.3044\\-167.0547\\135\\-134.597\\-159.2422\\135\\-134.0901\\-155.3359\\135\\-133.1439\\-151.4297\\135\\-132.4161\\-147.5234\\135\\-131.1584\\-143.6172\\135\\-130.2437\\-139.7109\\135\\-129.4188\\-137.7578\\135\\-128.8879\\-135.8047\\135\\-128.2436\\-133.8516\\135\\-127.2766\\-131.8984\\135\\-126.5542\\-129.9453\\135\\-125.3971\\-127.9922\\135\\-124.622\\-126.0391\\135\\-123.4606\\-124.0859\\135\\-122.6428\\-122.1328\\135\\-121.2801\\-120.1797\\135\\-118.3879\\-116.2734\\135\\-116.8038\\-114.3203\\135\\-115.1055\\-112.3672\\135\\-114.2578\\-111.5796\\135\\-112.3047\\-109.5233\\135\\-110.3516\\-107.7614\\135\\-108.3984\\-106.2421\\135\\-102.5391\\-102.0658\\135\\-100.5859\\-101.1435\\135\\-98.63281\\-100.0082\\135\\-96.67969\\-99.27474\\135\\-94.72656\\-98.12994\\135\\-92.77344\\-97.44463\\135\\-90.82031\\-96.52439\\135\\-88.86719\\-95.89621\\135\\-86.91406\\-95.45462\\135\\-83.00781\\-94.33151\\135\\-81.05469\\-93.99676\\135\\-77.14844\\-93.59029\\135\\-75.19531\\-93.27803\\135\\-71.28906\\-92.35632\\135\\-69.33594\\-92.0859\\135\\-65.42969\\-91.64822\\135\\-63.47656\\-91.33401\\135\\-59.57031\\-90.56166\\135\\-55.66406\\-90.06358\\135\\-47.85156\\-89.45644\\135\\-41.99219\\-88.71835\\135\\-40.03906\\-88.53233\\135\\-36.13281\\-88.33498\\135\\-30.27344\\-88.20337\\135\\-24.41406\\-88.23999\\135\\-20.50781\\-88.36162\\135\\-18.55469\\-88.48154\\135\\-16.60156\\-88.74474\\135\\-10.74219\\-90.0023\\135\\-8.789063\\-90.54672\\135\\-6.835938\\-91.39582\\135\\-2.929688\\-92.57685\\135\\-0.9765625\\-93.30442\\135\\0.9765625\\-93.56535\\135\\2.929688\\-93.63494\\135\\4.882813\\-93.56226\\135\\6.835938\\-93.31084\\135\\8.660567\\-92.83594\\135\\12.69531\\-91.60207\\135\\14.64844\\-90.68337\\135\\16.60156\\-89.99242\\135\\18.55469\\-89.54231\\135\\22.46094\\-88.38789\\135\\24.41406\\-88.1251\\135\\30.27344\\-87.72443\\135\\34.17969\\-87.3401\\135\\40.03906\\-87.00078\\135\\45.89844\\-86.95274\\135\\49.80469\\-87.06319\\135\\61.52344\\-88.00047\\135\\65.42969\\-88.49787\\135\\67.38281\\-89.06713\\135\\69.33594\\-89.52386\\135\\73.24219\\-90.21522\\135\\75.19531\\-90.76074\\135\\77.14844\\-91.48875\\135\\81.05469\\-92.49985\\135\\83.00781\\-93.29031\\135\\86.91406\\-94.215\\135\\88.86719\\-95.09783\\135\\92.77344\\-96.53547\\135\\94.72656\\-97.62223\\135\\98.63281\\-99.66592\\135\\100.5859\\-100.5604\\135\\102.5391\\-101.6694\\135\\106.4453\\-104.259\\135\\109.3427\\-106.5078\\135\\112.3047\\-109.0278\\135\\113.7517\\-110.4141\\135\\115.625\\-112.3672\\135\\118.1641\\-115.3594\\135\\120.3169\\-118.2266\\135\\122.7192\\-122.1328\\135\\123.4189\\-124.0859\\135\\124.485\\-126.0391\\135\\125.1489\\-127.9922\\135\\126.0431\\-129.9453\\135\\126.7818\\-131.8984\\135\\127.3489\\-133.8516\\135\\128.1279\\-135.8047\\135\\128.6621\\-137.7578\\135\\129.4511\\-141.6641\\135\\130.0872\\-143.6172\\135\\130.5151\\-145.5703\\135\\131.0559\\-149.4766\\135\\131.4273\\-151.4297\\135\\132.3089\\-155.3359\\135\\132.585\\-157.2891\\135\\132.9859\\-161.1953\\135\\134.0827\\-170.9609\\135\\134.2838\\-174.8672\\135\\134.434\\-180.7266\\135\\134.4543\\-186.5859\\135\\134.38\\-192.4453\\135\\134.2282\\-196.3516\\135\\133.9017\\-200.2578\\135\\132.6534\\-210.0234\\135\\132.3059\\-211.9766\\135\\131.0608\\-215.8828\\135\\130.6183\\-217.8359\\135\\129.9393\\-219.7891\\135\\129.1426\\-221.7422\\135\\128.562\\-223.6953\\135\\127.5997\\-225.6484\\135\\126.7849\\-227.6016\\135\\125.7378\\-229.5547\\135\\124.8629\\-231.5078\\135\\123.7518\\-233.4609\\135\\122.9431\\-235.4141\\135\\120.7886\\-239.3203\\135\\119.3438\\-241.2734\\135\\116.9909\\-245.1797\\135\\115.5746\\-247.1328\\135\\114.2656\\-249.0859\\135\\112.3047\\-251.5502\\135\\110.3516\\-254.1406\\135\\108.3984\\-256.4671\\135\\106.1695\\-258.8516\\135\\104.5003\\-260.8047\\135\\102.7129\\-262.7578\\135\\100.5859\\-264.7488\\135\\96.59677\\-268.6172\\135\\94.72656\\-270.0749\\135\\90.82031\\-273.545\\135\\88.86719\\-275.1958\\135\\86.91406\\-276.6065\\135\\84.96094\\-277.8945\\135\\81.05469\\-280.9931\\135\\79.10156\\-282.0695\\135\\75.19531\\-284.6192\\135\\73.24219\\-285.6433\\135\\71.28906\\-286.966\\135\\67.38281\\-289.0037\\135\\65.42969\\-289.7548\\135\\63.47656\\-290.9067\\135\\61.52344\\-291.7446\\135\\59.57031\\-292.858\\135\\57.61719\\-293.6107\\135\\55.66406\\-294.6074\\135\\51.75781\\-295.7039\\135\\49.80469\\-296.5904\\135\\47.85156\\-297.0315\\135\\45.89844\\-297.6341\\135\\43.94531\\-298.4713\\135\\40.03906\\-299.4283\\135\\38.08594\\-300.1396\\135\\36.13281\\-300.5615\\135\\32.22656\\-301.1548\\135\\30.27344\\-301.516\\135\\28.32031\\-302.0067\\135\\26.36719\\-302.3571\\135\\24.41406\\-302.6097\\135\\18.55469\\-303.0286\\135\\14.64844\\-303.3948\\135\\10.74219\\-303.9729\\135\\6.835938\\-304.2531\\135\\2.929688\\-304.3805\\135\\-2.929688\\-304.3877\\135\\-6.835938\\-304.2443\\135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "257" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "194" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-303.5014\\137\\-18.55469\\-303.0678\\137\\-24.41406\\-302.6097\\137\\-26.36719\\-302.3477\\137\\-28.32031\\-301.95\\137\\-30.27344\\-301.4447\\137\\-36.13281\\-300.4393\\137\\-38.08594\\-299.8748\\137\\-40.03906\\-299.1788\\137\\-41.99219\\-298.7041\\137\\-43.94531\\-298.0495\\137\\-45.89844\\-297.1983\\137\\-47.85156\\-296.7455\\137\\-51.75781\\-295.1906\\137\\-53.71094\\-294.6811\\137\\-55.66406\\-293.7142\\137\\-57.61719\\-292.8694\\137\\-59.57031\\-291.7096\\137\\-61.52344\\-290.8315\\137\\-63.47656\\-289.6472\\137\\-65.42969\\-288.8934\\137\\-67.38281\\-287.6931\\137\\-69.33594\\-286.7405\\137\\-73.24219\\-283.998\\137\\-75.19531\\-282.9795\\137\\-77.14844\\-281.5962\\137\\-79.09139\\-280.3359\\137\\-81.05469\\-278.9272\\137\\-84.96094\\-275.8706\\137\\-86.86572\\-274.4766\\137\\-88.86719\\-272.897\\137\\-90.82031\\-271.1428\\137\\-94.72656\\-267.7792\\137\\-98.63281\\-263.9853\\137\\-102.1205\\-260.8047\\137\\-103.8886\\-258.8516\\137\\-105.8057\\-256.8984\\137\\-108.3984\\-254.3757\\137\\-110.3516\\-252.1395\\137\\-112.3047\\-250.0266\\137\\-114.8776\\-247.1328\\137\\-116.2836\\-245.1797\\137\\-117.5851\\-243.2266\\137\\-118.1641\\-242.5567\\137\\-120.5039\\-239.3203\\137\\-121.6355\\-237.3672\\137\\-122.8831\\-235.4141\\137\\-123.7645\\-233.4609\\137\\-124.9023\\-231.5078\\137\\-126.85\\-227.6016\\137\\-128.6483\\-223.6953\\137\\-129.2087\\-221.7422\\137\\-129.9702\\-219.7891\\137\\-130.5857\\-217.8359\\137\\-131.4494\\-213.9297\\137\\-132.1658\\-211.9766\\137\\-132.599\\-210.0234\\137\\-133.335\\-206.1172\\137\\-134.1886\\-202.2109\\137\\-134.4305\\-200.2578\\137\\-134.7656\\-196.3516\\137\\-135.1096\\-190.4922\\137\\-135.2539\\-186.5859\\137\\-135.2737\\-180.7266\\137\\-135.1303\\-174.8672\\137\\-134.7433\\-167.0547\\137\\-134.442\\-163.1484\\137\\-133.9928\\-159.2422\\137\\-133.2234\\-155.3359\\137\\-132.2377\\-149.4766\\137\\-131.5703\\-147.5234\\137\\-131.0816\\-145.5703\\137\\-130.7373\\-143.6172\\137\\-130.2437\\-141.6641\\137\\-129.4852\\-139.7109\\137\\-128.4277\\-135.8047\\137\\-127.4805\\-133.8516\\137\\-126.7499\\-131.8984\\137\\-125.7215\\-129.9453\\137\\-124.9075\\-127.9922\\137\\-123.9034\\-126.0391\\137\\-123.0283\\-124.0859\\137\\-122.0703\\-122.3051\\137\\-120.7357\\-120.1797\\137\\-119.0828\\-118.2266\\137\\-117.5795\\-116.2734\\137\\-116.2109\\-114.3682\\137\\-114.4287\\-112.3672\\137\\-112.3047\\-110.1738\\137\\-110.3516\\-108.319\\137\\-104.4922\\-103.9144\\137\\-102.5278\\-102.6016\\137\\-98.63281\\-100.4577\\137\\-96.67969\\-99.63069\\137\\-92.77344\\-97.80801\\137\\-90.82031\\-97.11007\\137\\-88.86719\\-96.20784\\137\\-84.96094\\-95.33517\\137\\-81.05469\\-94.26779\\137\\-79.10156\\-93.97021\\137\\-75.19531\\-93.58136\\137\\-73.24219\\-93.29818\\137\\-69.33594\\-92.38296\\137\\-63.47656\\-91.65239\\137\\-59.57031\\-91.09905\\137\\-55.66406\\-90.38277\\137\\-53.71094\\-90.17602\\137\\-45.89844\\-89.58624\\137\\-40.03906\\-89.02586\\137\\-38.08594\\-88.80199\\137\\-34.17969\\-88.56519\\137\\-30.27344\\-88.45802\\137\\-24.41406\\-88.50539\\137\\-22.46094\\-88.56261\\137\\-20.50781\\-88.71835\\137\\-16.60156\\-89.2597\\137\\-12.69531\\-89.87971\\137\\-10.74219\\-90.2901\\137\\-6.835938\\-91.75026\\137\\-4.882813\\-92.34766\\137\\-2.929688\\-93.20301\\137\\-0.9765625\\-93.64877\\137\\2.929688\\-93.87241\\137\\4.882813\\-93.83036\\137\\6.835938\\-93.68229\\137\\8.789063\\-93.40927\\137\\12.69531\\-91.98745\\137\\14.64844\\-91.36483\\137\\16.60156\\-90.40063\\137\\18.55469\\-89.8896\\137\\20.50781\\-89.50089\\137\\24.41406\\-88.44819\\137\\28.32031\\-88.03804\\137\\34.17969\\-87.69188\\137\\36.13281\\-87.6255\\137\\38.08594\\-87.45474\\137\\41.99219\\-87.33487\\137\\45.89844\\-87.33487\\137\\51.75781\\-87.48123\\137\\57.61719\\-87.81617\\137\\61.52344\\-88.1139\\137\\63.47656\\-88.34375\\137\\65.42969\\-88.71991\\137\\67.38281\\-89.32159\\137\\71.28906\\-89.98981\\137\\73.24219\\-90.39453\\137\\75.19531\\-91.11465\\137\\77.14844\\-91.67178\\137\\79.10156\\-92.13005\\137\\83.00781\\-93.51768\\137\\84.96094\\-93.90292\\137\\86.91406\\-94.47569\\137\\88.86719\\-95.4254\\137\\90.82031\\-96.04122\\137\\92.77344\\-97.05386\\137\\94.72656\\-97.92641\\137\\96.67969\\-99.13921\\137\\98.63281\\-99.92068\\137\\100.5859\\-101.1333\\137\\102.5391\\-102.0196\\137\\106.4453\\-104.9495\\137\\108.3984\\-106.2278\\137\\110.3516\\-107.8168\\137\\112.3047\\-109.619\\137\\114.2578\\-111.6871\\137\\115.0351\\-112.3672\\137\\116.7417\\-114.3203\\137\\118.2306\\-116.2734\\137\\119.4765\\-118.2266\\137\\120.95\\-120.1797\\137\\122.0703\\-122.1714\\137\\122.9855\\-124.0859\\137\\123.6637\\-126.0391\\137\\124.6399\\-127.9922\\137\\125.2125\\-129.9453\\137\\126.0442\\-131.8984\\137\\126.7455\\-133.8516\\137\\127.2727\\-135.8047\\137\\127.9533\\-137.7578\\137\\128.5282\\-139.7109\\137\\129.6768\\-145.5703\\137\\130.2203\\-147.5234\\137\\130.5768\\-149.4766\\137\\131.3155\\-155.3359\\137\\132.075\\-159.2422\\137\\132.3452\\-161.1953\\137\\132.701\\-165.1016\\137\\133.0752\\-170.9609\\137\\133.2881\\-176.8203\\137\\133.3866\\-180.7266\\137\\133.4104\\-188.5391\\137\\133.2728\\-194.3984\\137\\132.8125\\-202.2109\\137\\132.4998\\-206.1172\\137\\132.2554\\-208.0703\\137\\131.8586\\-210.0234\\137\\131.338\\-211.9766\\137\\130.6091\\-215.8828\\137\\130\\-217.8359\\137\\129.2892\\-219.7891\\137\\128.776\\-221.7422\\137\\128.0703\\-223.6953\\137\\127.1342\\-225.6484\\137\\126.4166\\-227.6016\\137\\125.3196\\-229.5547\\137\\124.6192\\-231.5078\\137\\123.4426\\-233.4609\\137\\122.8058\\-235.4141\\137\\121.6241\\-237.3672\\137\\120.6727\\-239.3203\\137\\119.2558\\-241.2734\\137\\118.028\\-243.2266\\137\\116.9782\\-245.1797\\137\\115.5831\\-247.1328\\137\\114.3265\\-249.0859\\137\\112.8673\\-251.0391\\137\\111.283\\-252.9922\\137\\110.3516\\-254.335\\137\\108.3984\\-256.7628\\137\\104.4922\\-261.1906\\137\\103.0087\\-262.7578\\137\\98.63281\\-267.0858\\137\\96.67969\\-268.9063\\137\\92.77344\\-272.0932\\137\\90.82031\\-273.8545\\137\\86.91406\\-276.9412\\137\\84.96094\\-278.2787\\137\\81.05469\\-281.2113\\137\\79.10156\\-282.4229\\137\\77.14844\\-283.4924\\137\\75.19531\\-284.8731\\137\\69.33594\\-288.3087\\137\\67.38281\\-289.1552\\137\\63.47656\\-291.073\\137\\61.52344\\-292.1355\\137\\55.66406\\-294.7447\\137\\53.71094\\-295.2378\\137\\49.80469\\-296.7126\\137\\47.85156\\-297.136\\137\\43.94531\\-298.6182\\137\\41.99219\\-299.0542\\137\\40.03906\\-299.6265\\137\\38.08594\\-300.3127\\137\\36.13281\\-300.6652\\137\\32.22656\\-301.265\\137\\28.32031\\-302.1646\\137\\26.36719\\-302.4817\\137\\24.41406\\-302.6762\\137\\18.55469\\-303.1205\\137\\14.64844\\-303.5767\\137\\12.69531\\-303.9221\\137\\10.74219\\-304.1404\\137\\6.835938\\-304.3732\\137\\2.929688\\-304.4752\\137\\-2.929688\\-304.4752\\137\\-6.835938\\-304.3583\\137\\-10.74219\\-304.0664\\137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "255" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "195" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-303.6735\\139\\-20.50781\\-302.9739\\139\\-24.41406\\-302.6826\\139\\-26.36719\\-302.461\\139\\-28.32031\\-302.1003\\139\\-30.27344\\-301.5816\\139\\-32.22656\\-301.1796\\139\\-36.13281\\-300.5164\\139\\-38.08594\\-300.0666\\139\\-40.03906\\-299.31\\139\\-43.94531\\-298.2606\\139\\-45.89844\\-297.3281\\139\\-47.85156\\-296.8272\\139\\-49.80469\\-296.1996\\139\\-51.75781\\-295.3036\\139\\-53.71094\\-294.7879\\139\\-57.61719\\-292.9941\\139\\-63.18547\\-290.1016\\139\\-63.47656\\-289.8687\\139\\-65.42969\\-289.0037\\139\\-67.38281\\-287.9061\\139\\-69.33594\\-286.9103\\139\\-71.28906\\-285.53\\139\\-76.4695\\-282.2891\\139\\-77.14844\\-281.7798\\139\\-79.10156\\-280.6201\\139\\-81.05469\\-279.1362\\139\\-84.96094\\-276.0228\\139\\-86.91406\\-274.6331\\139\\-88.86719\\-273.0878\\139\\-90.82031\\-271.2847\\139\\-94.72656\\-267.8959\\139\\-96.0264\\-266.6641\\139\\-98.63281\\-264.0349\\139\\-102.1237\\-260.8047\\139\\-103.8744\\-258.8516\\139\\-105.7556\\-256.8984\\139\\-108.3984\\-254.2918\\139\\-110.3516\\-252.0156\\139\\-112.3047\\-249.8447\\139\\-114.6123\\-247.1328\\139\\-115.9144\\-245.1797\\139\\-118.1641\\-242.1259\\139\\-119.9105\\-239.3203\\139\\-122.5518\\-235.4141\\139\\-123.3003\\-233.4609\\139\\-124.5085\\-231.5078\\139\\-125.2573\\-229.5547\\139\\-126.3733\\-227.6016\\139\\-127.1451\\-225.6484\\139\\-128.0851\\-223.6953\\139\\-128.7827\\-221.7422\\139\\-129.2509\\-219.7891\\139\\-129.9543\\-217.8359\\139\\-130.5523\\-215.8828\\139\\-131.2699\\-211.9766\\139\\-132.4132\\-208.0703\\139\\-133.2856\\-202.2109\\139\\-134.0008\\-198.3047\\139\\-134.2291\\-196.3516\\139\\-134.5801\\-190.4922\\139\\-134.7053\\-186.5859\\139\\-134.7492\\-182.6797\\139\\-134.7053\\-178.7734\\139\\-134.5606\\-172.9141\\139\\-134.3659\\-169.0078\\139\\-134.0365\\-165.1016\\139\\-133.418\\-161.1953\\139\\-132.6867\\-155.3359\\139\\-132.4075\\-153.3828\\139\\-131.9845\\-151.4297\\139\\-131.3837\\-149.4766\\139\\-130.9821\\-147.5234\\139\\-130.686\\-145.5703\\139\\-130.2552\\-143.6172\\139\\-129.5361\\-141.6641\\139\\-128.5666\\-137.7578\\139\\-127.7199\\-135.8047\\139\\-126.1676\\-131.8984\\139\\-125.1468\\-129.9453\\139\\-124.4181\\-127.9922\\139\\-123.3222\\-126.0391\\139\\-122.5586\\-124.0859\\139\\-120.1172\\-120.3696\\139\\-118.5959\\-118.2266\\139\\-116.2109\\-115.2248\\139\\-113.6407\\-112.3672\\139\\-110.3516\\-109.0138\\139\\-109.7301\\-108.4609\\139\\-106.4453\\-105.8671\\139\\-104.4922\\-104.4832\\139\\-100.5859\\-101.8908\\139\\-98.63281\\-101.0434\\139\\-96.67969\\-99.94212\\139\\-94.72656\\-99.28125\\139\\-92.77344\\-98.1804\\139\\-90.82031\\-97.52682\\139\\-88.86719\\-96.67561\\139\\-86.91406\\-96.01987\\139\\-83.00781\\-95.25377\\139\\-81.05469\\-94.64523\\139\\-79.10156\\-94.22266\\139\\-77.14844\\-93.95115\\139\\-73.24219\\-93.5858\\139\\-71.28906\\-93.29818\\139\\-67.38281\\-92.43921\\139\\-63.47656\\-91.92073\\139\\-57.61719\\-91.22333\\139\\-53.71094\\-90.49587\\139\\-49.80469\\-90.11445\\139\\-41.99219\\-89.59728\\139\\-36.13281\\-89.18237\\139\\-32.22656\\-88.9973\\139\\-28.32031\\-88.93732\\139\\-26.36719\\-89.04066\\139\\-24.41406\\-89.02734\\139\\-20.50781\\-89.24406\\139\\-16.60156\\-89.60491\\139\\-12.69531\\-90.13286\\139\\-10.74219\\-90.66962\\139\\-8.789063\\-91.50052\\139\\-6.835938\\-92.0776\\139\\-4.882813\\-92.89197\\139\\-2.929688\\-93.59743\\139\\0.9765625\\-94.06916\\139\\2.929688\\-94.13176\\139\\4.882813\\-94.08619\\139\\8.789063\\-93.71484\\139\\10.74219\\-93.29433\\139\\12.69531\\-92.35971\\139\\14.64844\\-91.76068\\139\\18.55469\\-90.28665\\139\\24.41406\\-89.0816\\139\\26.36719\\-88.56615\\139\\28.32031\\-88.29779\\139\\30.27344\\-88.14967\\139\\38.08594\\-87.77339\\139\\43.94531\\-87.66626\\139\\47.85156\\-87.65831\\139\\51.75781\\-87.71803\\139\\57.61719\\-87.94128\\139\\61.52344\\-88.24427\\139\\63.47656\\-88.52168\\139\\67.38281\\-89.52933\\139\\71.28906\\-90.16124\\139\\73.24219\\-90.63362\\139\\75.19531\\-91.37109\\139\\79.10156\\-92.3298\\139\\81.05469\\-93.14023\\139\\83.00781\\-93.66871\\139\\84.96094\\-94.08517\\139\\88.86719\\-95.66562\\139\\90.82031\\-96.35563\\139\\92.77344\\-97.4519\\139\\94.72656\\-98.31828\\139\\96.67969\\-99.50412\\139\\98.63281\\-100.262\\139\\100.5859\\-101.4685\\139\\102.5391\\-102.4992\\139\\104.4922\\-103.8762\\139\\106.4453\\-105.43\\139\\108.0095\\-106.5078\\139\\110.3516\\-108.3347\\139\\112.3047\\-110.1738\\139\\114.445\\-112.3672\\139\\116.2109\\-114.388\\139\\120.3649\\-120.1797\\139\\121.3379\\-122.1328\\139\\122.5318\\-124.0859\\139\\123.8594\\-127.9922\\139\\124.725\\-129.9453\\139\\125.2214\\-131.8984\\139\\126.0287\\-133.8516\\139\\126.6902\\-135.8047\\139\\127.1652\\-137.7578\\139\\128.373\\-141.6641\\139\\128.771\\-143.6172\\139\\129.3747\\-147.5234\\139\\130.2804\\-151.4297\\139\\130.5682\\-153.3828\\139\\131.1435\\-159.2422\\139\\131.9307\\-165.1016\\139\\132.2889\\-169.0078\\139\\132.4564\\-172.9141\\139\\132.6119\\-180.7266\\139\\132.6392\\-188.5391\\139\\132.5552\\-194.3984\\139\\132.3901\\-198.3047\\139\\132.1289\\-202.2109\\139\\131.8881\\-204.1641\\139\\131.2858\\-208.0703\\139\\130.5804\\-213.9297\\139\\130.0583\\-215.8828\\139\\129.3713\\-217.8359\\139\\128.4211\\-221.7422\\139\\127.5249\\-223.6953\\139\\126.8246\\-225.6484\\139\\125.0483\\-229.5547\\139\\124.3234\\-231.5078\\139\\123.3003\\-233.4609\\139\\122.6601\\-235.4141\\139\\121.4489\\-237.3672\\139\\120.575\\-239.3203\\139\\119.1996\\-241.2734\\139\\117.9844\\-243.2266\\139\\116.9733\\-245.1797\\139\\115.6173\\-247.1328\\139\\114.4531\\-249.0859\\139\\112.9702\\-251.0391\\139\\111.3504\\-252.9922\\139\\110.3516\\-254.5529\\139\\108.5825\\-256.8984\\139\\106.8945\\-258.8516\\139\\104.4922\\-261.4676\\139\\101.3338\\-264.7109\\139\\99.26022\\-266.6641\\139\\98.63281\\-267.4029\\139\\95.15625\\-270.5703\\139\\90.50674\\-274.4766\\139\\88.86719\\-275.637\\139\\84.96094\\-278.6939\\139\\82.69794\\-280.3359\\139\\79.10156\\-282.7466\\139\\77.14844\\-283.7236\\139\\76.51654\\-284.2422\\139\\73.45448\\-286.1953\\139\\71.28906\\-287.3803\\139\\69.33594\\-288.5817\\139\\67.38281\\-289.3047\\139\\65.42969\\-290.4549\\139\\63.47656\\-291.2576\\139\\61.52344\\-292.4636\\139\\59.57031\\-293.217\\139\\57.61719\\-294.2031\\139\\55.66406\\-294.8712\\139\\53.71094\\-295.3891\\139\\51.75781\\-296.263\\139\\49.80469\\-296.8388\\139\\47.85156\\-297.303\\139\\45.89844\\-298.1959\\139\\43.94531\\-298.7617\\139\\41.99219\\-299.2216\\139\\40.03906\\-299.9194\\139\\38.08594\\-300.4427\\139\\32.22656\\-301.4066\\139\\28.32031\\-302.325\\139\\26.36719\\-302.591\\139\\22.46094\\-302.8813\\139\\18.55469\\-303.2514\\139\\12.69531\\-304.1505\\139\\8.789063\\-304.4159\\139\\0.9765625\\-304.5951\\139\\-4.882813\\-304.525\\139\\-8.789063\\-304.3658\\139\\-10.74219\\-304.2354\\139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "245" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "196" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-303.5781\\141\\-20.50781\\-303.0607\\141\\-26.36719\\-302.5527\\141\\-28.32031\\-302.234\\141\\-32.22656\\-301.2835\\141\\-36.13281\\-300.6136\\141\\-38.08594\\-300.2286\\141\\-40.03906\\-299.4703\\141\\-43.94531\\-298.4194\\141\\-45.89844\\-297.4965\\141\\-49.80469\\-296.3766\\141\\-51.75781\\-295.4265\\141\\-53.71094\\-294.8897\\141\\-55.66406\\-294.1336\\141\\-57.61719\\-293.138\\141\\-59.57031\\-292.257\\141\\-61.52344\\-291.1178\\141\\-67.38281\\-288.2036\\141\\-69.33594\\-287.0857\\141\\-71.28906\\-285.7605\\141\\-73.24219\\-284.6101\\141\\-75.19531\\-283.2369\\141\\-79.10156\\-280.8607\\141\\-79.69501\\-280.3359\\141\\-82.27361\\-278.3828\\141\\-83.00781\\-277.7122\\141\\-84.96094\\-276.217\\141\\-86.91406\\-274.9224\\141\\-88.86719\\-273.2837\\141\\-90.82031\\-271.4563\\141\\-94.72656\\-268.0259\\141\\-98.63281\\-264.166\\141\\-102.2461\\-260.8047\\141\\-103.9103\\-258.8516\\141\\-105.7651\\-256.8984\\141\\-108.3984\\-254.2771\\141\\-112.8415\\-249.0859\\141\\-114.3932\\-247.1328\\141\\-115.6994\\-245.1797\\141\\-118.4789\\-241.2734\\141\\-119.5076\\-239.3203\\141\\-120.9551\\-237.3672\\141\\-122.1563\\-235.4141\\141\\-124.939\\-229.5547\\141\\-125.7026\\-227.6016\\141\\-126.7324\\-225.6484\\141\\-127.3885\\-223.6953\\141\\-128.3322\\-221.7422\\141\\-129.2864\\-217.8359\\141\\-130.494\\-213.9297\\141\\-131.1427\\-210.0234\\141\\-132.1742\\-206.1172\\141\\-132.4961\\-204.1641\\141\\-133.405\\-196.3516\\141\\-133.8838\\-192.4453\\141\\-134.1529\\-188.5391\\141\\-134.2279\\-186.5859\\141\\-134.2804\\-180.7266\\141\\-134.1986\\-176.8203\\141\\-133.9899\\-172.9141\\141\\-133.6506\\-169.0078\\141\\-133.2115\\-165.1016\\141\\-132.6663\\-159.2422\\141\\-132.1508\\-155.3359\\141\\-131.2488\\-151.4297\\141\\-130.6463\\-147.5234\\141\\-130.2411\\-145.5703\\141\\-129.5597\\-143.6172\\141\\-128.6438\\-139.7109\\141\\-127.9529\\-137.7578\\141\\-127.1405\\-135.8047\\141\\-126.4921\\-133.8516\\141\\-125.4213\\-131.8984\\141\\-124.7104\\-129.9453\\141\\-123.6905\\-127.9922\\141\\-122.9137\\-126.0391\\141\\-121.7923\\-124.0859\\141\\-120.7785\\-122.1328\\141\\-117.7572\\-118.2266\\141\\-116.539\\-116.2734\\141\\-114.9018\\-114.3203\\141\\-111.0715\\-110.4141\\141\\-110.3516\\-109.6176\\141\\-108.3984\\-107.803\\141\\-106.4453\\-106.4054\\141\\-104.4922\\-105.153\\141\\-102.5391\\-103.65\\141\\-100.5859\\-102.3521\\141\\-98.63281\\-101.4234\\141\\-96.67969\\-100.3351\\141\\-94.72656\\-99.62018\\141\\-90.82031\\-97.84151\\141\\-88.86719\\-97.18843\\141\\-86.91406\\-96.35549\\141\\-84.96094\\-95.88626\\141\\-81.05469\\-95.09335\\141\\-79.10156\\-94.54676\\141\\-77.14844\\-94.19156\\141\\-75.19531\\-93.93909\\141\\-71.28906\\-93.54562\\141\\-67.38281\\-92.92188\\141\\-65.42969\\-92.51041\\141\\-61.52344\\-91.93249\\141\\-57.61719\\-91.55041\\141\\-55.66406\\-91.3066\\141\\-51.75781\\-90.63533\\141\\-47.85156\\-90.21602\\141\\-38.08594\\-89.61935\\141\\-34.17969\\-89.46828\\141\\-28.32031\\-89.39324\\141\\-22.46094\\-89.50378\\141\\-16.60156\\-89.86402\\141\\-14.64844\\-90.10262\\141\\-12.69531\\-90.47591\\141\\-10.74219\\-91.21512\\141\\-6.835938\\-92.49985\\141\\-4.882813\\-93.38566\\141\\-2.929688\\-93.82449\\141\\0.9765625\\-94.41936\\141\\2.929688\\-94.52338\\141\\4.882813\\-94.44727\\141\\8.789063\\-93.95991\\141\\10.74219\\-93.62791\\141\\12.69531\\-92.93915\\141\\14.64844\\-92.08916\\141\\16.60156\\-91.53947\\141\\18.55469\\-90.78664\\141\\20.50781\\-90.21107\\141\\24.41406\\-89.55539\\141\\28.32031\\-88.78473\\141\\30.27344\\-88.49642\\141\\32.22656\\-88.31056\\141\\38.08594\\-88.00105\\141\\43.94531\\-87.86381\\141\\49.80469\\-87.85727\\141\\55.66406\\-87.99431\\141\\57.61719\\-88.08843\\141\\61.52344\\-88.4317\\141\\63.47656\\-88.81613\\141\\65.42969\\-89.34457\\141\\71.28906\\-90.36476\\141\\75.19531\\-91.55455\\141\\79.10156\\-92.57685\\141\\81.05469\\-93.35721\\141\\84.96094\\-94.30078\\141\\86.91406\\-95.27402\\141\\88.86719\\-95.88258\\141\\90.73154\\-96.74219\\141\\96.67969\\-99.7429\\141\\100.5859\\-101.769\\141\\104.4922\\-104.364\\141\\107.3649\\-106.5078\\141\\110.3516\\-108.9642\\141\\113.6947\\-112.3672\\141\\115.5104\\-114.3203\\141\\117.0489\\-116.2734\\141\\118.401\\-118.2266\\141\\119.5378\\-120.1797\\141\\120.8643\\-122.1328\\141\\122.7409\\-126.0391\\141\\123.2767\\-127.9922\\141\\124.0786\\-129.9453\\141\\124.753\\-131.8984\\141\\125.2339\\-133.8516\\141\\126.6142\\-137.7578\\141\\127.5112\\-141.6641\\141\\128.1523\\-143.6172\\141\\128.5828\\-145.5703\\141\\129.1177\\-149.4766\\141\\129.4465\\-151.4297\\141\\130.2321\\-155.3359\\141\\130.4979\\-157.2891\\141\\130.8363\\-161.1953\\141\\131.3244\\-169.0078\\141\\131.4776\\-172.9141\\141\\131.7042\\-182.6797\\141\\131.7486\\-186.5859\\141\\131.7344\\-190.4922\\141\\131.6467\\-194.3984\\141\\131.4715\\-198.3047\\141\\130.8481\\-208.0703\\141\\130.4455\\-211.9766\\141\\130.0569\\-213.9297\\141\\129.4526\\-215.8828\\141\\128.6373\\-219.7891\\141\\128.0117\\-221.7422\\141\\127.1738\\-223.6953\\141\\126.5848\\-225.6484\\141\\125.539\\-227.6016\\141\\124.8921\\-229.5547\\141\\123.2146\\-233.4609\\141\\122.5619\\-235.4141\\141\\121.3833\\-237.3672\\141\\120.504\\-239.3203\\141\\119.1833\\-241.2734\\141\\117.9858\\-243.2266\\141\\116.9934\\-245.1797\\141\\115.7096\\-247.1328\\141\\114.6061\\-249.0859\\141\\111.5271\\-252.9922\\141\\110.3516\\-254.8058\\141\\108.8365\\-256.8984\\141\\104.4922\\-261.8106\\141\\101.6846\\-264.7109\\141\\98.63281\\-267.7182\\141\\95.53205\\-270.5703\\141\\90.82031\\-274.5997\\141\\86.91406\\-277.4005\\141\\84.96094\\-279.0231\\141\\83.00781\\-280.5223\\141\\81.05469\\-281.6232\\141\\79.10156\\-283.0103\\141\\77.14844\\-284.1061\\141\\75.19531\\-285.3353\\141\\73.24219\\-286.6992\\141\\71.28906\\-287.6369\\141\\69.33594\\-288.8314\\141\\67.38281\\-289.4733\\141\\65.42969\\-290.7119\\141\\63.47656\\-291.5128\\141\\61.52344\\-292.6897\\141\\59.57031\\-293.4254\\141\\57.61719\\-294.4396\\141\\53.71094\\-295.558\\141\\51.75781\\-296.4713\\141\\47.85156\\-297.512\\141\\45.89844\\-298.4052\\141\\41.99219\\-299.4001\\141\\40.03906\\-300.1529\\141\\38.08594\\-300.5769\\141\\34.17969\\-301.1966\\141\\32.22656\\-301.5798\\141\\30.27344\\-302.1003\\141\\28.32031\\-302.4693\\141\\26.36719\\-302.689\\141\\22.46094\\-302.9824\\141\\18.55469\\-303.4189\\141\\14.64844\\-304.0774\\141\\12.69531\\-304.2954\\141\\8.789063\\-304.5287\\141\\4.882813\\-304.642\\141\\0.9765625\\-304.7033\\141\\-4.882813\\-304.6232\\141\\-8.789063\\-304.4625\\141\\-12.69531\\-304.1798\\141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "241" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "197" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-303.1557\\143\\-26.36719\\-302.6283\\143\\-28.32031\\-302.3477\\143\\-30.27344\\-301.9203\\143\\-32.22656\\-301.3825\\143\\-38.08594\\-300.3405\\143\\-41.99219\\-299.0424\\143\\-43.94531\\-298.5528\\143\\-45.89844\\-297.6682\\143\\-47.85156\\-297.0258\\143\\-49.80469\\-296.511\\143\\-51.75781\\-295.5523\\143\\-55.66406\\-294.3513\\143\\-57.61719\\-293.2838\\143\\-59.57031\\-292.5059\\143\\-61.52344\\-291.2703\\143\\-63.47656\\-290.4421\\143\\-65.42969\\-289.2948\\143\\-67.38281\\-288.5208\\143\\-67.89526\\-288.1484\\143\\-73.24219\\-284.8717\\143\\-75.19531\\-283.4195\\143\\-77.14844\\-282.3301\\143\\-79.10156\\-281.0838\\143\\-82.53817\\-278.3828\\143\\-83.00781\\-277.9402\\143\\-86.91406\\-275.1516\\143\\-88.86719\\-273.4938\\143\\-92.77344\\-269.8595\\143\\-94.25813\\-268.6172\\143\\-96.42392\\-266.6641\\143\\-98.63281\\-264.3829\\143\\-102.5391\\-260.742\\143\\-103.98\\-258.8516\\143\\-105.8282\\-256.8984\\143\\-108.3984\\-254.2918\\143\\-112.7539\\-249.0859\\143\\-114.2578\\-247.1049\\143\\-116.9577\\-243.2266\\143\\-118.1717\\-241.2734\\143\\-119.2871\\-239.3203\\143\\-120.7252\\-237.3672\\143\\-121.7471\\-235.4141\\143\\-122.8962\\-233.4609\\143\\-123.5871\\-231.5078\\143\\-124.6647\\-229.5547\\143\\-125.271\\-227.6016\\143\\-126.2888\\-225.6484\\143\\-127.6855\\-221.7422\\143\\-128.4973\\-219.7891\\143\\-129.3351\\-215.8828\\143\\-130.4852\\-211.9766\\143\\-131.3997\\-206.1172\\143\\-132.276\\-202.2109\\143\\-132.5312\\-200.2578\\143\\-133.0473\\-194.3984\\143\\-133.5014\\-186.5859\\143\\-133.5713\\-180.7266\\143\\-133.4635\\-176.8203\\143\\-133.0432\\-169.0078\\143\\-132.6018\\-163.1484\\143\\-132.1951\\-159.2422\\143\\-131.3968\\-155.3359\\143\\-131.1093\\-153.3828\\143\\-130.6345\\-149.4766\\143\\-130.2296\\-147.5234\\143\\-129.5965\\-145.5703\\143\\-128.7287\\-141.6641\\143\\-128.1896\\-139.7109\\143\\-127.3246\\-137.7578\\143\\-126.7265\\-135.8047\\143\\-124.9943\\-131.8984\\143\\-124.2604\\-129.9453\\143\\-123.2308\\-127.9922\\143\\-122.4624\\-126.0391\\143\\-122.0703\\-125.4796\\143\\-120.1172\\-122.2005\\143\\-118.7397\\-120.1797\\143\\-116.2109\\-116.8697\\143\\-114.2578\\-114.4009\\143\\-112.2615\\-112.3672\\143\\-110.3516\\-110.2403\\143\\-108.3984\\-108.3691\\143\\-106.4453\\-107.0786\\143\\-102.5391\\-104.0632\\143\\-98.63281\\-101.7516\\143\\-96.67969\\-100.8714\\143\\-94.72656\\-99.88494\\143\\-92.77344\\-99.23785\\143\\-90.82031\\-98.17651\\143\\-88.86719\\-97.54675\\143\\-84.96094\\-96.16951\\143\\-81.05469\\-95.42133\\143\\-77.14844\\-94.50694\\143\\-75.19531\\-94.15717\\143\\-67.38281\\-93.31762\\143\\-65.42969\\-93.00871\\143\\-63.47656\\-92.56541\\143\\-61.52344\\-92.23113\\143\\-53.71094\\-91.39462\\143\\-49.80469\\-90.77431\\143\\-45.89844\\-90.3335\\143\\-41.99219\\-90.05074\\143\\-38.08594\\-89.86577\\143\\-34.17969\\-89.75561\\143\\-26.36719\\-89.69926\\143\\-20.50781\\-89.85899\\143\\-16.60156\\-90.13286\\143\\-14.64844\\-90.40341\\143\\-8.789063\\-92.19041\\143\\-6.835938\\-93.06703\\143\\-4.882813\\-93.66871\\143\\-2.929688\\-94.05192\\143\\0.9765625\\-94.96184\\143\\2.929688\\-95.09557\\143\\4.882813\\-95.00361\\143\\6.835938\\-94.67462\\143\\10.74219\\-93.87315\\143\\12.69531\\-93.40774\\143\\14.64844\\-92.449\\143\\18.55469\\-91.30768\\143\\20.50781\\-90.59715\\143\\22.46094\\-90.15594\\143\\30.27344\\-89.05642\\143\\32.22656\\-88.68739\\143\\36.13281\\-88.35635\\143\\40.03906\\-88.15936\\143\\43.94531\\-88.06097\\143\\49.80469\\-88.03599\\143\\55.66406\\-88.18079\\143\\59.57031\\-88.46745\\143\\61.52344\\-88.73292\\143\\63.47656\\-89.21165\\143\\65.42969\\-89.59013\\143\\69.33594\\-90.18994\\143\\71.28906\\-90.62015\\143\\73.24219\\-91.27216\\143\\77.14844\\-92.21945\\143\\81.05469\\-93.56226\\143\\83.00781\\-93.97729\\143\\84.96094\\-94.58307\\143\\86.91406\\-95.49874\\143\\88.86719\\-96.11311\\143\\90.82031\\-97.2112\\143\\92.77344\\-98.03487\\143\\94.72656\\-99.21916\\143\\96.67969\\-99.98689\\143\\98.63281\\-101.1743\\143\\100.5859\\-102.0969\\143\\103.9997\\-104.5547\\143\\104.4922\\-104.9753\\143\\106.4453\\-106.2361\\143\\108.3984\\-107.7051\\143\\110.3516\\-109.4652\\143\\115.0377\\-114.3203\\143\\116.649\\-116.2734\\143\\117.6793\\-118.2266\\143\\118.1641\\-118.8391\\143\\120.2691\\-122.1328\\143\\122.1719\\-126.0391\\143\\122.9171\\-127.9922\\143\\123.3874\\-129.9453\\143\\124.1936\\-131.8984\\143\\124.7991\\-133.8516\\143\\125.2258\\-135.8047\\143\\126.5321\\-139.7109\\143\\127.3621\\-143.6172\\143\\128.4084\\-147.5234\\143\\128.6978\\-149.4766\\143\\129.4556\\-155.3359\\143\\130.1139\\-159.2422\\143\\130.361\\-161.1953\\143\\130.6391\\-165.1016\\143\\130.8247\\-170.9609\\143\\130.9685\\-182.6797\\143\\131.0096\\-188.5391\\143\\130.9548\\-196.3516\\143\\130.8142\\-202.2109\\143\\130.6345\\-206.1172\\143\\130.2637\\-210.0234\\143\\129.4526\\-213.9297\\143\\128.7726\\-217.8359\\143\\128.3713\\-219.7891\\143\\127.58\\-221.7422\\143\\126.3171\\-225.6484\\143\\125.3084\\-227.6016\\143\\124.7614\\-229.5547\\143\\123.8222\\-231.5078\\143\\122.4783\\-235.4141\\143\\121.3421\\-237.3672\\143\\120.4514\\-239.3203\\143\\119.1879\\-241.2734\\143\\118.0753\\-243.2266\\143\\117.0647\\-245.1797\\143\\115.7973\\-247.1328\\143\\114.7263\\-249.0859\\143\\111.6599\\-252.9922\\143\\110.4707\\-254.9453\\143\\109.0205\\-256.8984\\143\\104.4922\\-262.084\\143\\101.9744\\-264.7109\\143\\98.63281\\-267.9865\\143\\95.86828\\-270.5703\\143\\94.72656\\-271.4946\\143\\92.77344\\-273.2789\\143\\90.82031\\-274.9323\\143\\86.91406\\-277.6642\\143\\83.00781\\-280.8411\\143\\81.05469\\-281.8943\\143\\77.14844\\-284.5146\\143\\75.19531\\-285.5948\\143\\73.24219\\-286.9363\\143\\69.33594\\-289.0158\\143\\67.38281\\-289.7345\\143\\65.42969\\-290.9225\\143\\63.47656\\-291.8353\\143\\61.52344\\-292.891\\143\\59.57031\\-293.6736\\143\\57.61719\\-294.636\\143\\55.66406\\-295.1421\\143\\53.71094\\-295.816\\143\\51.75781\\-296.6445\\143\\49.80469\\-297.102\\143\\47.85156\\-297.7883\\143\\45.89844\\-298.5848\\143\\41.99219\\-299.6525\\143\\40.03906\\-300.325\\143\\34.17969\\-301.3518\\143\\30.27344\\-302.2818\\143\\28.32031\\-302.5838\\143\\22.46094\\-303.0938\\143\\18.55469\\-303.6467\\143\\16.60156\\-304.0325\\143\\12.69531\\-304.4228\\143\\8.789063\\-304.6326\\143\\4.882813\\-304.75\\143\\0.9765625\\-304.7927\\143\\-4.882813\\-304.7077\\143\\-10.74219\\-304.456\\143\\-12.69531\\-304.3275\\143\\-14.64844\\-304.099\\143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "247" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "198" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-304.0092\\145\\-20.50781\\-303.282\\145\\-22.46094\\-303.0466\\145\\-26.36719\\-302.6826\\145\\-28.32031\\-302.4401\\145\\-30.27344\\-302.0735\\145\\-32.22656\\-301.5115\\145\\-34.17969\\-301.1184\\145\\-38.08594\\-300.4543\\145\\-40.01991\\-299.8672\\145\\-41.99219\\-299.1681\\145\\-43.94531\\-298.6554\\145\\-47.85156\\-297.1233\\145\\-49.80469\\-296.6255\\145\\-51.75781\\-295.7168\\145\\-55.66406\\-294.5121\\145\\-57.61719\\-293.4472\\145\\-59.57031\\-292.6926\\145\\-61.52344\\-291.4464\\145\\-63.47656\\-290.6572\\145\\-65.42969\\-289.4569\\145\\-67.38281\\-288.7279\\145\\-69.33594\\-287.479\\145\\-71.28906\\-286.443\\145\\-74.44473\\-284.2422\\145\\-75.19531\\-283.6486\\145\\-77.14844\\-282.6048\\145\\-79.10156\\-281.2761\\145\\-81.05469\\-279.7663\\145\\-86.91406\\-275.3649\\145\\-88.86719\\-273.6915\\145\\-92.77344\\-270.021\\145\\-94.64518\\-268.6172\\145\\-96.78728\\-266.6641\\145\\-98.57388\\-264.7109\\145\\-100.5859\\-262.8636\\145\\-102.7072\\-260.8047\\145\\-104.2519\\-258.8516\\145\\-108.3984\\-254.3564\\145\\-112.7045\\-249.0859\\145\\-114.2578\\-246.9777\\145\\-116.8729\\-243.2266\\145\\-117.8903\\-241.2734\\145\\-119.1406\\-239.3203\\145\\-120.5143\\-237.3672\\145\\-121.4955\\-235.4141\\145\\-122.7193\\-233.4609\\145\\-123.3576\\-231.5078\\145\\-124.3604\\-229.5547\\145\\-125.6946\\-225.6484\\145\\-126.6694\\-223.6953\\145\\-127.225\\-221.7422\\145\\-128.0398\\-219.7891\\145\\-128.6256\\-217.8359\\145\\-129.3815\\-213.9297\\145\\-129.9844\\-211.9766\\145\\-130.4852\\-210.0234\\145\\-130.7761\\-208.0703\\145\\-131.2145\\-204.1641\\145\\-131.5619\\-202.2109\\145\\-132.0229\\-200.2578\\145\\-132.3242\\-198.3047\\145\\-132.6555\\-194.3984\\145\\-132.8621\\-190.4922\\145\\-133.0027\\-186.5859\\145\\-133.0553\\-182.6797\\145\\-132.9702\\-176.8203\\145\\-132.8323\\-172.9141\\145\\-132.6399\\-169.0078\\145\\-132.3442\\-165.1016\\145\\-132.1399\\-163.1484\\145\\-131.1947\\-157.2891\\145\\-130.6002\\-151.4297\\145\\-130.2411\\-149.4766\\145\\-129.6258\\-147.5234\\145\\-129.1629\\-145.5703\\145\\-128.3799\\-141.6641\\145\\-127.5536\\-139.7109\\145\\-126.2471\\-135.8047\\145\\-125.2959\\-133.8516\\145\\-124.6438\\-131.8984\\145\\-123.6119\\-129.9453\\145\\-122.8957\\-127.9922\\145\\-120.8089\\-124.0859\\145\\-119.3683\\-122.1328\\145\\-116.7759\\-118.2266\\145\\-114.2578\\-115.1971\\145\\-108.3984\\-109.0455\\145\\-106.4453\\-107.4333\\145\\-104.4922\\-105.9547\\145\\-98.63281\\-102.0648\\145\\-96.67969\\-101.2437\\145\\-94.72656\\-100.1602\\145\\-92.77344\\-99.54623\\145\\-90.82031\\-98.62873\\145\\-88.86719\\-97.84216\\145\\-86.91406\\-97.29075\\145\\-84.96094\\-96.53696\\145\\-83.00781\\-96.01691\\145\\-79.10156\\-95.34245\\145\\-77.14844\\-94.94804\\145\\-75.19531\\-94.44231\\145\\-73.24219\\-94.13591\\145\\-65.42969\\-93.37148\\145\\-63.47656\\-93.03569\\145\\-61.52344\\-92.57685\\145\\-57.61719\\-92.02213\\145\\-49.80469\\-91.23963\\145\\-45.89844\\-90.67111\\145\\-41.99219\\-90.3023\\145\\-38.08594\\-90.08654\\145\\-34.17969\\-89.99548\\145\\-26.36719\\-89.93661\\145\\-20.50781\\-90.10051\\145\\-16.60156\\-90.45481\\145\\-14.64844\\-90.87518\\145\\-12.69531\\-91.44169\\145\\-10.74219\\-91.90302\\145\\-8.789063\\-92.60021\\145\\-6.835938\\-93.48905\\145\\-2.929688\\-94.36955\\145\\-0.9765625\\-95.06911\\145\\0.9765625\\-95.42568\\145\\2.929688\\-95.52148\\145\\4.882813\\-95.45435\\145\\6.835938\\-95.21631\\145\\10.74219\\-94.12731\\145\\12.69531\\-93.68433\\145\\16.60156\\-92.15234\\145\\20.50781\\-91.11465\\145\\22.46094\\-90.53404\\145\\24.41406\\-90.14216\\145\\30.27344\\-89.51083\\145\\36.13281\\-88.70377\\145\\40.03906\\-88.41877\\145\\43.94531\\-88.28075\\145\\47.85156\\-88.23214\\145\\51.75781\\-88.27251\\145\\55.66406\\-88.39992\\145\\59.57031\\-88.81701\\145\\63.47656\\-89.50729\\145\\67.38281\\-90.07951\\145\\69.33594\\-90.42983\\145\\73.24219\\-91.50939\\145\\77.14844\\-92.41999\\145\\79.10156\\-93.20564\\145\\81.05469\\-93.73693\\145\\83.00781\\-94.11054\\145\\84.96094\\-94.93402\\145\\88.86719\\-96.37109\\145\\90.82031\\-97.50174\\145\\92.77344\\-98.32668\\145\\94.72656\\-99.49644\\145\\96.67969\\-100.2966\\145\\100.5859\\-102.5787\\145\\102.5391\\-103.8417\\145\\104.4922\\-105.4123\\145\\106.4453\\-106.8308\\145\\108.3984\\-108.1106\\145\\110.3516\\-109.9371\\145\\114.5531\\-114.3203\\145\\116.2109\\-116.5957\\145\\118.5974\\-120.1797\\145\\119.5337\\-122.1328\\145\\120.7738\\-124.0859\\145\\121.5006\\-126.0391\\145\\122.5185\\-127.9922\\145\\123.5119\\-131.8984\\145\\124.3467\\-133.8516\\145\\124.8461\\-135.8047\\145\\125.2413\\-137.7578\\145\\125.7813\\-139.7109\\145\\126.459\\-141.6641\\145\\127.254\\-145.5703\\145\\128.253\\-149.4766\\145\\128.563\\-151.4297\\145\\129.0298\\-155.3359\\145\\129.3846\\-159.2422\\145\\129.8909\\-163.1484\\145\\130.0841\\-165.1016\\145\\130.3267\\-170.9609\\145\\130.3811\\-174.8672\\145\\130.5804\\-182.6797\\145\\130.6345\\-188.5391\\145\\130.6152\\-196.3516\\145\\130.4546\\-202.2109\\145\\130.2271\\-206.1172\\145\\129.3815\\-211.9766\\145\\128.8947\\-215.8828\\145\\128.5671\\-217.8359\\145\\128.0794\\-219.7891\\145\\127.3035\\-221.7422\\145\\126.7609\\-223.6953\\145\\126.0287\\-225.6484\\145\\125.1708\\-227.6016\\145\\124.6802\\-229.5547\\145\\123.7169\\-231.5078\\145\\122.4542\\-235.4141\\145\\121.3408\\-237.3672\\145\\120.4834\\-239.3203\\145\\119.2415\\-241.2734\\145\\117.1448\\-245.1797\\145\\114.8425\\-249.0859\\145\\111.8164\\-252.9922\\145\\110.6916\\-254.9453\\145\\109.2122\\-256.8984\\145\\106.4453\\-260.1466\\145\\104.4922\\-262.3496\\145\\100.5859\\-266.4462\\145\\96.13962\\-270.5703\\145\\94.72656\\-271.7434\\145\\92.77344\\-273.5359\\145\\90.82031\\-275.1972\\145\\88.86719\\-276.6829\\145\\86.91406\\-277.9496\\145\\83.00781\\-281.0748\\145\\79.10156\\-283.4253\\145\\77.14844\\-284.8233\\145\\71.28906\\-288.3112\\145\\69.33594\\-289.1724\\145\\65.42969\\-291.1095\\145\\63.47656\\-292.2417\\145\\59.55574\\-294.0078\\145\\57.61719\\-294.8046\\145\\55.66406\\-295.2705\\145\\53.71094\\-296.1324\\145\\51.75781\\-296.8019\\145\\49.80469\\-297.2649\\145\\47.85156\\-298.1258\\145\\45.89844\\-298.7446\\145\\43.94531\\-299.2406\\145\\41.99219\\-299.9619\\145\\40.03906\\-300.4739\\145\\34.17969\\-301.528\\145\\32.22656\\-302.0754\\145\\30.27344\\-302.4526\\145\\28.32031\\-302.7003\\145\\24.41406\\-303.0244\\145\\22.46094\\-303.2514\\145\\16.60156\\-304.2173\\145\\14.64844\\-304.3877\\145\\8.789063\\-304.7265\\145\\4.882813\\-304.8366\\145\\-0.9765625\\-304.8666\\145\\-4.882813\\-304.7927\\145\\-10.74219\\-304.5461\\145\\-14.64844\\-304.2531\\145" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "241" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "199" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-303.4165\\147\\-24.41406\\-302.9264\\147\\-28.32031\\-302.5421\\147\\-30.27344\\-302.2012\\147\\-34.17969\\-301.2344\\147\\-38.08594\\-300.5656\\147\\-40.03906\\-300.0819\\147\\-41.99219\\-299.31\\147\\-43.94531\\-298.7805\\147\\-45.89844\\-298.1498\\147\\-47.85156\\-297.2388\\147\\-49.80469\\-296.7368\\147\\-53.71094\\-295.2055\\147\\-55.66406\\-294.6609\\147\\-57.61719\\-293.6667\\147\\-59.57031\\-292.8561\\147\\-61.52344\\-291.6909\\147\\-63.47656\\-290.8499\\147\\-65.42969\\-289.644\\147\\-67.38281\\-288.921\\147\\-69.33594\\-287.7107\\147\\-71.28906\\-286.7286\\147\\-71.95345\\-286.1953\\147\\-75.19531\\-283.9434\\147\\-77.14844\\-282.8763\\147\\-80.73821\\-280.3359\\147\\-83.00781\\-278.6744\\147\\-88.23438\\-274.4766\\147\\-92.77344\\-270.3577\\147\\-94.72656\\-268.8863\\147\\-96.67969\\-267.0501\\147\\-98.89063\\-264.7109\\147\\-100.9627\\-262.7578\\147\\-102.9072\\-260.8047\\147\\-104.4669\\-258.8516\\147\\-108.3984\\-254.4807\\147\\-112.7148\\-249.0859\\147\\-116.8155\\-243.2266\\147\\-117.7749\\-241.2734\\147\\-118.1641\\-240.7981\\147\\-120.1172\\-237.6072\\147\\-121.3321\\-235.4141\\147\\-122.5456\\-233.4609\\147\\-123.2096\\-231.5078\\147\\-124.8311\\-227.6016\\147\\-125.3706\\-225.6484\\147\\-126.3507\\-223.6953\\147\\-127.5378\\-219.7891\\147\\-128.3138\\-217.8359\\147\\-128.7493\\-215.8828\\147\\-129.4908\\-211.9766\\147\\-130.0841\\-210.0234\\147\\-130.5025\\-208.0703\\147\\-131.3997\\-200.2578\\147\\-132.0597\\-196.3516\\147\\-132.2889\\-194.3984\\147\\-132.5531\\-190.4922\\147\\-132.6793\\-186.5859\\147\\-132.7242\\-182.6797\\147\\-132.6892\\-178.7734\\147\\-132.5027\\-172.9141\\147\\-132.2613\\-169.0078\\147\\-132.0717\\-167.0547\\147\\-131.4901\\-163.1484\\147\\-131.2647\\-161.1953\\147\\-130.5442\\-153.3828\\147\\-130.2059\\-151.4297\\147\\-129.6535\\-149.4766\\147\\-129.213\\-147.5234\\147\\-128.4886\\-143.6172\\147\\-127.1076\\-139.7109\\147\\-126.55\\-137.7578\\147\\-125.5713\\-135.8047\\147\\-124.9107\\-133.8516\\147\\-123.182\\-129.9453\\147\\-122.4958\\-127.9922\\147\\-121.3\\-126.0391\\147\\-120.229\\-124.0859\\147\\-118.1641\\-121.0818\\147\\-117.4091\\-120.1797\\147\\-116.2109\\-118.4013\\147\\-114.6415\\-116.2734\\147\\-112.8976\\-114.3203\\147\\-109.2687\\-110.4141\\147\\-108.3984\\-109.5378\\147\\-106.4453\\-107.8351\\147\\-102.5391\\-105.1991\\147\\-100.5859\\-103.7362\\147\\-98.63281\\-102.5163\\147\\-94.72656\\-100.577\\147\\-92.77344\\-99.75907\\147\\-90.82031\\-99.12555\\147\\-88.86719\\-98.14489\\147\\-84.96094\\-96.98633\\147\\-83.00781\\-96.29773\\147\\-81.05469\\-95.9011\\147\\-77.14844\\-95.32232\\147\\-73.24219\\-94.39146\\147\\-69.33594\\-93.93233\\147\\-65.42969\\-93.60198\\147\\-63.47656\\-93.38056\\147\\-61.52344\\-93.03419\\147\\-59.57031\\-92.57685\\147\\-55.66406\\-92.03783\\147\\-51.75781\\-91.67336\\147\\-47.85156\\-91.36514\\147\\-40.03906\\-90.43892\\147\\-36.13281\\-90.26913\\147\\-28.32031\\-90.16917\\147\\-26.36719\\-90.18681\\147\\-20.50781\\-90.40048\\147\\-18.55469\\-90.58984\\147\\-16.60156\\-90.92066\\147\\-12.69531\\-91.7313\\147\\-10.74219\\-92.25\\147\\-8.789063\\-93.15671\\147\\-6.835938\\-93.73509\\147\\-4.882813\\-94.17467\\147\\-2.929688\\-94.89144\\147\\-0.9765625\\-95.49538\\147\\0.9765625\\-95.76008\\147\\2.929688\\-95.86987\\147\\4.882813\\-95.80976\\147\\6.835938\\-95.61359\\147\\8.789063\\-95.21336\\147\\10.74219\\-94.46354\\147\\14.64844\\-93.28176\\147\\16.60156\\-92.44407\\147\\18.55469\\-91.91905\\147\\20.50781\\-91.54734\\147\\24.41406\\-90.5638\\147\\26.36719\\-90.22237\\147\\28.32031\\-90.0082\\147\\34.17969\\-89.49538\\147\\38.08594\\-89.06815\\147\\41.99219\\-88.78473\\147\\47.85156\\-88.56261\\147\\51.75781\\-88.58543\\147\\55.66406\\-88.81525\\147\\59.57031\\-89.31638\\147\\65.42969\\-90.01651\\147\\67.38281\\-90.29801\\147\\69.33594\\-90.73421\\147\\71.28906\\-91.312\\147\\75.19531\\-92.11664\\147\\77.14844\\-92.67435\\147\\79.10156\\-93.42059\\147\\83.00781\\-94.27402\\147\\84.96094\\-95.19198\\147\\86.91406\\-95.84558\\147\\88.86719\\-96.73456\\147\\96.57749\\-100.6484\\147\\98.63281\\-101.7342\\147\\100.5859\\-103.0631\\147\\102.5391\\-104.2359\\147\\106.4453\\-107.2724\\147\\108.1181\\-108.4609\\147\\110.1406\\-110.4141\\147\\114.2578\\-114.7516\\147\\116.9302\\-118.2266\\147\\120.1172\\-123.9963\\147\\121.0769\\-126.0391\\147\\122.7564\\-129.9453\\147\\123.1873\\-131.8984\\147\\123.7246\\-133.8516\\147\\124.4894\\-135.8047\\147\\125.2741\\-139.7109\\147\\125.82\\-141.6641\\147\\126.4963\\-143.6172\\147\\127.1671\\-147.5234\\147\\128.0816\\-151.4297\\147\\128.4395\\-153.3828\\147\\128.8834\\-157.2891\\147\\129.3239\\-163.1484\\147\\129.5741\\-169.0078\\147\\129.7238\\-174.8672\\147\\129.9228\\-178.7734\\147\\130.099\\-184.6328\\147\\130.1649\\-188.5391\\147\\130.1398\\-196.3516\\147\\129.9384\\-202.2109\\147\\129.6552\\-206.1172\\147\\128.9353\\-213.9297\\147\\128.3997\\-217.8359\\147\\127.1389\\-221.7422\\147\\126.6473\\-223.6953\\147\\125.1149\\-227.6016\\147\\124.6454\\-229.5547\\147\\123.6792\\-231.5078\\147\\122.5124\\-235.4141\\147\\121.4058\\-237.3672\\147\\120.6203\\-239.3203\\147\\119.3217\\-241.2734\\147\\118.3758\\-243.2266\\147\\116.2109\\-247.056\\147\\114.9764\\-249.0859\\147\\112.0458\\-252.9922\\147\\110.88\\-254.9453\\147\\109.3814\\-256.8984\\147\\106.4453\\-260.4461\\147\\102.6293\\-264.7109\\147\\100.5859\\-266.841\\147\\96.67969\\-270.3469\\147\\92.77344\\-273.7817\\147\\88.86719\\-276.9594\\147\\84.96094\\-279.8111\\147\\83.00781\\-281.3125\\147\\81.05469\\-282.6669\\147\\79.10156\\-283.6497\\147\\78.35478\\-284.2422\\147\\75.19531\\-286.3962\\147\\73.24219\\-287.3995\\147\\71.28906\\-288.623\\147\\69.33594\\-289.336\\147\\67.38281\\-290.5308\\147\\65.42969\\-291.3278\\147\\63.47656\\-292.5517\\147\\61.52344\\-293.3001\\147\\59.57031\\-294.3311\\147\\57.61719\\-294.9665\\147\\55.66406\\-295.4596\\147\\53.71094\\-296.4102\\147\\49.80469\\-297.4864\\147\\47.85156\\-298.4081\\147\\43.94531\\-299.4753\\147\\41.99219\\-300.2286\\147\\40.03906\\-300.6337\\147\\36.13281\\-301.3094\\147\\32.22656\\-302.285\\147\\30.27344\\-302.5956\\147\\24.41406\\-303.1638\\147\\22.46094\\-303.4661\\147\\18.55469\\-304.1702\\147\\14.64844\\-304.5071\\147\\8.789063\\-304.827\\147\\2.929688\\-304.9813\\147\\-0.9765625\\-304.9687\\147\\-4.882813\\-304.8888\\147\\-10.74219\\-304.6378\\147\\-14.64844\\-304.3732\\147\\-16.60156\\-304.1604\\147" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "249" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "200" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-18.55469\\-304.044\\149\\-20.50781\\-303.6181\\149\\-24.41406\\-302.9999\\149\\-28.32031\\-302.6399\\149\\-30.27344\\-302.3284\\149\\-32.22656\\-301.9056\\149\\-34.17969\\-301.3619\\149\\-38.08594\\-300.6631\\149\\-40.03906\\-300.231\\149\\-41.99219\\-299.4906\\149\\-45.89844\\-298.3514\\149\\-47.85156\\-297.3809\\149\\-49.80469\\-296.8482\\149\\-51.75781\\-296.2122\\149\\-53.71094\\-295.3205\\149\\-55.66406\\-294.7903\\149\\-57.48981\\-294.0078\\149\\-61.53311\\-292.0547\\149\\-65.2073\\-290.1016\\149\\-67.38281\\-289.0891\\149\\-71.28906\\-286.9609\\149\\-73.24219\\-285.5582\\149\\-75.19531\\-284.3908\\149\\-81.05469\\-280.4744\\149\\-83.00781\\-278.9814\\149\\-86.91406\\-275.7248\\149\\-88.61205\\-274.4766\\149\\-92.95654\\-270.5703\\149\\-94.72656\\-269.1543\\149\\-96.67969\\-267.2888\\149\\-99.13163\\-264.7109\\149\\-101.2106\\-262.7578\\149\\-103.0941\\-260.8047\\149\\-106.3874\\-256.8984\\149\\-108.3984\\-254.6947\\149\\-109.6477\\-252.9922\\149\\-112.7608\\-249.0859\\149\\-114.2578\\-246.9747\\149\\-116.2109\\-244.0132\\149\\-116.7969\\-243.2266\\149\\-117.717\\-241.2734\\149\\-118.1641\\-240.7067\\149\\-120.1698\\-237.3672\\149\\-122.0703\\-233.9094\\149\\-122.3798\\-233.4609\\149\\-123.7684\\-229.5547\\149\\-124.6991\\-227.6016\\149\\-125.1771\\-225.6484\\149\\-126.709\\-221.7422\\149\\-127.2439\\-219.7891\\149\\-128.5275\\-215.8828\\149\\-129.2173\\-211.9766\\149\\-129.6152\\-210.0234\\149\\-130.1649\\-208.0703\\149\\-130.5151\\-206.1172\\149\\-130.7401\\-204.1641\\149\\-131.0714\\-200.2578\\149\\-131.5036\\-196.3516\\149\\-132.0476\\-192.4453\\149\\-132.213\\-190.4922\\149\\-132.401\\-186.5859\\149\\-132.4496\\-182.6797\\149\\-132.4088\\-178.7734\\149\\-132.2613\\-174.8672\\149\\-131.9845\\-170.9609\\149\\-131.7224\\-169.0078\\149\\-131.1294\\-163.1484\\149\\-130.6976\\-157.2891\\149\\-130.1794\\-153.3828\\149\\-129.2764\\-149.4766\\149\\-128.5666\\-145.5703\\149\\-128.0407\\-143.6172\\149\\-127.3035\\-141.6641\\149\\-126.7761\\-139.7109\\149\\-126.0437\\-137.7578\\149\\-125.172\\-135.8047\\149\\-124.5859\\-133.8516\\149\\-123.5455\\-131.8984\\149\\-122.9118\\-129.9453\\149\\-120.9211\\-126.0391\\149\\-119.535\\-124.0859\\149\\-118.3998\\-122.1328\\149\\-115.5001\\-118.2266\\149\\-114.2578\\-116.6523\\149\\-112.3047\\-114.3974\\149\\-108.7216\\-110.4141\\149\\-106.4453\\-108.3883\\149\\-100.5859\\-104.1159\\149\\-98.63281\\-103.0407\\149\\-96.67969\\-101.824\\149\\-94.72656\\-101.0093\\149\\-92.77344\\-99.9995\\149\\-90.82031\\-99.42925\\149\\-88.86719\\-98.52093\\149\\-86.91406\\-97.84082\\149\\-84.96094\\-97.33636\\149\\-81.05469\\-96.13258\\149\\-77.14844\\-95.56916\\149\\-75.19531\\-95.23416\\149\\-73.24219\\-94.74937\\149\\-71.28906\\-94.36955\\149\\-67.38281\\-93.90182\\149\\-63.47656\\-93.59743\\149\\-61.52344\\-93.36804\\149\\-59.57031\\-93.03419\\149\\-57.61719\\-92.57685\\149\\-55.66406\\-92.28182\\149\\-51.75781\\-91.86949\\149\\-43.94531\\-91.33854\\149\\-41.99219\\-91.15334\\149\\-40.03906\\-90.84525\\149\\-36.13281\\-90.57885\\149\\-30.27344\\-90.45744\\149\\-26.36719\\-90.51109\\149\\-22.46094\\-90.69581\\149\\-20.50781\\-90.87518\\149\\-16.60156\\-91.35904\\149\\-12.69531\\-92.0239\\149\\-10.74219\\-92.63365\\149\\-8.789063\\-93.50964\\149\\-6.835938\\-93.95991\\149\\-4.882813\\-94.53207\\149\\-2.929688\\-95.35547\\149\\-0.9765625\\-95.81614\\149\\0.9765625\\-96.06356\\149\\2.929688\\-96.16874\\149\\4.882813\\-96.11161\\149\\6.835938\\-95.92011\\149\\8.789063\\-95.58807\\149\\10.74219\\-94.9798\\149\\12.69531\\-94.14021\\149\\14.64844\\-93.57967\\149\\18.55469\\-92.25786\\149\\24.41406\\-91.12871\\149\\26.36719\\-90.64379\\149\\30.27344\\-90.12265\\149\\34.17969\\-89.79232\\149\\41.99219\\-89.35733\\149\\47.85156\\-89.13491\\149\\53.71094\\-89.21929\\149\\57.61719\\-89.48687\\149\\61.52344\\-89.81123\\149\\65.42969\\-90.26339\\149\\67.38281\\-90.59908\\149\\69.33594\\-91.15705\\149\\75.19531\\-92.31398\\149\\77.14844\\-93.02519\\149\\79.10156\\-93.58945\\149\\81.05469\\-93.94431\\149\\83.00781\\-94.50484\\149\\84.96094\\-95.4128\\149\\86.91406\\-96.04212\\149\\88.86719\\-97.11007\\149\\90.82031\\-97.93945\\149\\92.77344\\-99.11671\\149\\94.72656\\-99.9145\\149\\96.67969\\-101.0833\\149\\98.63281\\-102.026\\149\\99.38859\\-102.6016\\149\\104.4922\\-106.073\\149\\106.4453\\-107.5422\\149\\108.3984\\-109.19\\149\\112.3047\\-113.1833\\149\\115.0904\\-116.2734\\149\\116.4889\\-118.2266\\149\\117.4628\\-120.1797\\149\\118.7079\\-122.1328\\149\\119.5277\\-124.0859\\149\\120.7031\\-126.0391\\149\\121.4134\\-127.9922\\149\\122.382\\-129.9453\\149\\122.939\\-131.8984\\149\\123.3619\\-133.8516\\149\\124.633\\-137.7578\\149\\125.3546\\-141.6641\\149\\126.5241\\-145.5703\\149\\127.5302\\-151.4297\\149\\128.3518\\-155.3359\\149\\128.5865\\-157.2891\\149\\129.018\\-163.1484\\149\\129.2091\\-169.0078\\149\\129.2637\\-172.9141\\149\\129.541\\-184.6328\\149\\129.5906\\-192.4453\\149\\129.5157\\-200.2578\\149\\129.2982\\-206.1172\\149\\129.074\\-210.0234\\149\\128.7708\\-213.9297\\149\\128.5517\\-215.8828\\149\\128.2266\\-217.8359\\149\\127.574\\-219.7891\\149\\126.5821\\-223.6953\\149\\125.7464\\-225.6484\\149\\125.093\\-227.6016\\149\\124.6374\\-229.5547\\149\\123.705\\-231.5078\\149\\122.5779\\-235.4141\\149\\121.5131\\-237.3672\\149\\120.7406\\-239.3203\\149\\119.4642\\-241.2734\\149\\118.5509\\-243.2266\\149\\117.3331\\-245.1797\\149\\116.4017\\-247.1328\\149\\115.1078\\-249.0859\\149\\113.6545\\-251.0391\\149\\112.3718\\-252.9922\\149\\110.3516\\-255.8873\\149\\108.3984\\-258.3885\\149\\106.4453\\-260.7792\\149\\102.9914\\-264.7109\\149\\100.5859\\-267.1491\\149\\98.63281\\-268.9702\\149\\94.63629\\-272.5234\\149\\89.90832\\-276.4297\\149\\86.91406\\-278.7826\\149\\84.79656\\-280.3359\\149\\81.05469\\-282.9506\\149\\79.10156\\-283.9962\\149\\75.19531\\-286.7166\\149\\73.24219\\-287.6602\\149\\71.28906\\-288.8697\\149\\69.33594\\-289.59\\149\\67.38281\\-290.7937\\149\\65.42969\\-291.6006\\149\\63.47656\\-292.8005\\149\\61.52344\\-293.5759\\149\\59.57031\\-294.59\\149\\57.61719\\-295.1162\\149\\55.66406\\-295.7612\\149\\53.71094\\-296.6411\\149\\51.75781\\-297.1076\\149\\47.85156\\-298.6182\\149\\45.89844\\-299.1106\\149\\41.99219\\-300.4427\\149\\36.13281\\-301.5182\\149\\34.17969\\-302.0626\\149\\32.22656\\-302.461\\149\\30.27344\\-302.7239\\149\\28.32031\\-302.8724\\149\\24.41406\\-303.3633\\149\\20.50781\\-304.1095\\149\\18.55469\\-304.3507\\149\\10.74219\\-304.8462\\149\\6.835938\\-305.0045\\149\\2.929688\\-305.1031\\149\\-0.9765625\\-305.1031\\149\\-6.835938\\-304.9185\\149\\-10.74219\\-304.7311\\149\\-14.64844\\-304.4912\\149" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "243" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "201" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-303.882\\151\\-22.46094\\-303.4214\\151\\-24.41406\\-303.0938\\151\\-28.32031\\-302.7239\\151\\-32.22656\\-302.088\\151\\-34.17969\\-301.5302\\151\\-40.03906\\-300.3853\\151\\-43.94531\\-299.0413\\151\\-45.89844\\-298.5154\\151\\-47.85156\\-297.5975\\151\\-51.75781\\-296.4232\\151\\-53.71094\\-295.4661\\151\\-55.66406\\-294.9308\\151\\-57.61719\\-294.2573\\151\\-59.57031\\-293.1976\\151\\-61.52344\\-292.424\\151\\-63.47656\\-291.2094\\151\\-65.42969\\-290.3178\\151\\-67.38281\\-289.2328\\151\\-69.33594\\-288.4074\\151\\-73.24219\\-285.888\\151\\-75.19531\\-284.7392\\151\\-77.14844\\-283.3154\\151\\-79.10156\\-281.9983\\151\\-81.05469\\-280.8242\\151\\-83.00781\\-279.2488\\151\\-86.91406\\-275.9414\\151\\-88.86719\\-274.6719\\151\\-90.82031\\-272.9155\\151\\-93.31939\\-270.5703\\151\\-94.72656\\-269.3709\\151\\-96.67969\\-267.5314\\151\\-99.34938\\-264.7109\\151\\-101.4259\\-262.7578\\151\\-103.2815\\-260.8047\\151\\-106.4453\\-257.1163\\151\\-108.4227\\-254.9453\\151\\-109.7591\\-252.9922\\151\\-112.8493\\-249.0859\\151\\-114.2578\\-247.1231\\151\\-115.477\\-245.1797\\151\\-116.8246\\-243.2266\\151\\-117.7097\\-241.2734\\151\\-118.1641\\-240.6732\\151\\-120.1172\\-237.3573\\151\\-122.2642\\-233.4609\\151\\-123.029\\-231.5078\\151\\-123.6177\\-229.5547\\151\\-124.5841\\-227.6016\\151\\-125.0565\\-225.6484\\151\\-125.6714\\-223.6953\\151\\-126.5259\\-221.7422\\151\\-127.5954\\-217.8359\\151\\-128.3063\\-215.8828\\151\\-128.7256\\-213.9297\\151\\-129.3367\\-210.0234\\151\\-130.2525\\-206.1172\\151\\-130.7701\\-202.2109\\151\\-131.034\\-198.3047\\151\\-131.3539\\-194.3984\\151\\-131.752\\-190.4922\\151\\-132.0717\\-186.5859\\151\\-132.1399\\-184.6328\\151\\-132.1289\\-180.7266\\151\\-131.9714\\-176.8203\\151\\-131.6392\\-172.9141\\151\\-130.9077\\-163.1484\\151\\-130.6629\\-159.2422\\151\\-130.1649\\-155.3359\\151\\-129.6964\\-153.3828\\151\\-129.3257\\-151.4297\\151\\-128.6937\\-147.5234\\151\\-128.2441\\-145.5703\\151\\-127.5148\\-143.6172\\151\\-126.4259\\-139.7109\\151\\-125.4636\\-137.7578\\151\\-124.8873\\-135.8047\\151\\-124.1379\\-133.8516\\151\\-123.221\\-131.8984\\151\\-122.5784\\-129.9453\\151\\-121.4461\\-127.9922\\151\\-120.4791\\-126.0391\\151\\-120.1172\\-125.6004\\151\\-118.1641\\-122.6254\\151\\-117.7455\\-122.1328\\151\\-116.5213\\-120.1797\\151\\-115.0632\\-118.2266\\151\\-112.3047\\-114.9935\\151\\-109.9266\\-112.3672\\151\\-108.0604\\-110.4141\\151\\-106.4453\\-108.9458\\151\\-104.4922\\-107.342\\151\\-102.5391\\-105.8673\\151\\-97.38394\\-102.6016\\151\\-96.67969\\-102.1033\\151\\-94.72656\\-101.3143\\151\\-92.77344\\-100.2761\\151\\-88.86719\\-98.97536\\151\\-86.91406\\-98.11723\\151\\-83.00781\\-97.11328\\151\\-81.05469\\-96.43414\\151\\-79.10156\\-96.03658\\151\\-75.19531\\-95.49337\\151\\-71.28906\\-94.67372\\151\\-67.38281\\-94.05817\\151\\-61.52344\\-93.57417\\151\\-59.57031\\-93.34959\\151\\-57.61719\\-93.00739\\151\\-55.66406\\-92.56541\\151\\-53.71094\\-92.28662\\151\\-49.80469\\-91.92481\\151\\-41.99219\\-91.49588\\151\\-38.08594\\-91.1473\\151\\-34.17969\\-90.96481\\151\\-30.27344\\-90.87518\\151\\-26.36719\\-90.99463\\151\\-18.55469\\-91.44666\\151\\-14.64844\\-91.9201\\151\\-12.69531\\-92.33321\\151\\-10.74219\\-93.15671\\151\\-8.789063\\-93.74779\\151\\-6.835938\\-94.20181\\151\\-4.882813\\-95.0086\\151\\-2.929688\\-95.67317\\151\\0.9765625\\-96.41453\\151\\2.929688\\-96.5678\\151\\4.882813\\-96.49471\\151\\8.789063\\-95.88215\\151\\10.74219\\-95.39052\\151\\12.69531\\-94.43196\\151\\16.60156\\-93.331\\151\\18.55469\\-92.64893\\151\\20.50781\\-92.16029\\151\\22.46094\\-91.81\\151\\26.36719\\-91.22162\\151\\30.27344\\-90.50095\\151\\34.17969\\-90.09827\\151\\36.13281\\-89.97601\\151\\41.99219\\-89.70985\\151\\47.85156\\-89.59422\\151\\53.71094\\-89.62401\\151\\57.61719\\-89.78755\\151\\61.52344\\-90.06461\\151\\65.42969\\-90.58788\\151\\69.33594\\-91.42341\\151\\73.24219\\-92.11123\\151\\75.19531\\-92.55411\\151\\77.14844\\-93.27675\\151\\81.05469\\-94.07375\\151\\83.00781\\-94.76485\\151\\84.96094\\-95.59294\\151\\86.91406\\-96.26324\\151\\88.86719\\-97.36789\\151\\90.82031\\-98.15344\\151\\92.77344\\-99.3765\\151\\94.72656\\-100.1334\\151\\96.67969\\-101.3581\\151\\98.63281\\-102.3722\\151\\101.7624\\-104.5547\\151\\102.5391\\-105.2167\\151\\106.4453\\-107.8481\\151\\108.3984\\-109.5467\\151\\112.3047\\-113.5405\\151\\114.6926\\-116.2734\\151\\116.2109\\-118.611\\151\\118.2162\\-122.1328\\151\\120.1698\\-126.0391\\151\\121.0724\\-127.9922\\151\\122.6901\\-131.8984\\151\\123.5518\\-135.8047\\151\\124.2974\\-137.7578\\151\\124.7993\\-139.7109\\151\\125.4944\\-143.6172\\151\\126.1636\\-145.5703\\151\\126.6119\\-147.5234\\151\\127.5228\\-153.3828\\151\\127.9672\\-155.3359\\151\\128.3038\\-157.2891\\151\\128.5203\\-159.2422\\151\\128.7984\\-163.1484\\151\\128.9756\\-167.0547\\151\\129.1642\\-178.7734\\151\\129.2421\\-184.6328\\151\\129.2843\\-192.4453\\151\\129.238\\-200.2578\\151\\129.1489\\-204.1641\\151\\128.9998\\-208.0703\\151\\128.7772\\-211.9766\\151\\128.4059\\-215.8828\\151\\128.0651\\-217.8359\\151\\127.4535\\-219.7891\\151\\126.5526\\-223.6953\\151\\125.7324\\-225.6484\\151\\125.1195\\-227.6016\\151\\124.6726\\-229.5547\\151\\123.7558\\-231.5078\\151\\122.6525\\-235.4141\\151\\121.6527\\-237.3672\\151\\120.864\\-239.3203\\151\\119.6382\\-241.2734\\151\\118.7263\\-243.2266\\151\\117.4409\\-245.1797\\151\\116.6225\\-247.1328\\151\\113.8632\\-251.0391\\151\\112.6452\\-252.9922\\151\\110.3516\\-256.1506\\151\\108.3984\\-258.7295\\151\\106.4453\\-261.1535\\151\\103.2612\\-264.7109\\151\\101.3555\\-266.6641\\151\\98.63281\\-269.2753\\151\\94.72656\\-272.8224\\151\\92.68811\\-274.4766\\151\\88.86719\\-277.4548\\151\\84.96094\\-280.6139\\151\\82.40897\\-282.2891\\151\\77.14844\\-285.6131\\151\\75.19531\\-286.9912\\151\\71.28906\\-289.0643\\151\\69.15039\\-290.1016\\151\\63.47656\\-293.0419\\151\\59.57031\\-294.795\\151\\57.61719\\-295.2872\\151\\55.66406\\-296.1607\\151\\53.71094\\-296.8188\\151\\51.75781\\-297.3127\\151\\49.80469\\-298.2289\\151\\45.89844\\-299.3491\\151\\43.94531\\-300.1164\\151\\41.99219\\-300.5996\\151\\38.08594\\-301.2964\\151\\34.17969\\-302.2818\\151\\32.22656\\-302.5956\\151\\28.32031\\-302.9824\\151\\26.36719\\-303.2604\\151\\22.46094\\-304.044\\151\\18.55469\\-304.4912\\151\\12.69531\\-304.8612\\151\\4.882813\\-305.2148\\151\\-0.9765625\\-305.2533\\151\\-8.789063\\-304.9463\\151\\-14.64844\\-304.5965\\151\\-18.55469\\-304.2264\\151" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "238" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "202" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-304.1095\\153\\-24.41406\\-303.2424\\153\\-26.36719\\-302.9715\\153\\-30.27344\\-302.5838\\153\\-32.22656\\-302.2715\\153\\-36.13281\\-301.2614\\153\\-40.03906\\-300.5278\\153\\-41.99219\\-300.0026\\153\\-43.94531\\-299.1958\\153\\-45.89844\\-298.6776\\153\\-49.80469\\-297.1209\\153\\-51.75781\\-296.6022\\153\\-53.71094\\-295.7059\\153\\-57.61719\\-294.4961\\153\\-59.57031\\-293.4254\\153\\-61.52344\\-292.6825\\153\\-63.47656\\-291.4479\\153\\-65.42969\\-290.6293\\153\\-67.38281\\-289.3997\\153\\-69.33594\\-288.6902\\153\\-71.28906\\-287.4331\\153\\-73.24219\\-286.3519\\153\\-76.32396\\-284.2422\\153\\-77.14844\\-283.5671\\153\\-79.10156\\-282.3931\\153\\-81.05469\\-281.116\\153\\-83.00781\\-279.5253\\153\\-84.96094\\-277.8009\\153\\-88.86719\\-274.979\\153\\-90.82031\\-273.2355\\153\\-91.50849\\-272.5234\\153\\-96.67969\\-267.7635\\153\\-97.68113\\-266.6641\\153\\-100.5859\\-263.6932\\153\\-101.6422\\-262.7578\\153\\-103.444\\-260.8047\\153\\-106.4453\\-257.3721\\153\\-108.6593\\-254.9453\\153\\-109.9152\\-252.9922\\153\\-112.9859\\-249.0859\\153\\-114.4064\\-247.1328\\153\\-115.5536\\-245.1797\\153\\-116.8729\\-243.2266\\153\\-117.7416\\-241.2734\\153\\-118.1641\\-240.7269\\153\\-120.1172\\-237.3379\\153\\-122.2234\\-233.4609\\153\\-122.9814\\-231.5078\\153\\-123.5385\\-229.5547\\153\\-124.4894\\-227.6016\\153\\-125.5292\\-223.6953\\153\\-126.4113\\-221.7422\\153\\-127.3708\\-217.8359\\153\\-128.0794\\-215.8828\\153\\-128.5749\\-213.9297\\153\\-129.5183\\-208.0703\\153\\-130.3678\\-204.1641\\153\\-130.6345\\-202.2109\\153\\-131.2668\\-192.4453\\153\\-131.6806\\-186.5859\\153\\-131.7817\\-182.6797\\153\\-131.6954\\-178.7734\\153\\-131.4814\\-174.8672\\153\\-130.6417\\-161.1953\\153\\-130.1649\\-157.2891\\153\\-129.3979\\-153.3828\\153\\-128.8086\\-149.4766\\153\\-128.4485\\-147.5234\\153\\-127.1932\\-143.6172\\153\\-126.6997\\-141.6641\\153\\-125.1481\\-137.7578\\153\\-124.6046\\-135.8047\\153\\-123.6342\\-133.8516\\153\\-122.9806\\-131.8984\\153\\-122.125\\-129.9453\\153\\-121.0767\\-127.9922\\153\\-119.833\\-126.0391\\153\\-118.7027\\-124.0859\\153\\-116.2109\\-120.4629\\153\\-114.5809\\-118.2266\\153\\-112.3047\\-115.5056\\153\\-109.5215\\-112.3672\\153\\-106.4453\\-109.3436\\153\\-104.4922\\-107.673\\153\\-102.5391\\-106.2177\\153\\-100.5859\\-105.0879\\153\\-98.63281\\-103.6695\\153\\-96.67969\\-102.4166\\153\\-90.82031\\-99.82576\\153\\-88.86719\\-99.28622\\153\\-86.91406\\-98.41158\\153\\-84.96094\\-97.83823\\153\\-83.00781\\-97.41006\\153\\-79.10156\\-96.26596\\153\\-73.24219\\-95.40552\\153\\-71.28906\\-95.06706\\153\\-69.33594\\-94.6027\\153\\-67.38281\\-94.25227\\153\\-65.42969\\-94.03086\\153\\-59.57031\\-93.54777\\153\\-57.61719\\-93.3369\\153\\-53.71094\\-92.62424\\153\\-49.80469\\-92.16151\\153\\-45.89844\\-91.92673\\153\\-41.99219\\-91.75785\\153\\-40.03906\\-91.61655\\153\\-36.13281\\-91.45152\\153\\-30.27344\\-91.34637\\153\\-26.36719\\-91.43324\\153\\-20.50781\\-91.61523\\153\\-16.60156\\-91.90028\\153\\-14.64844\\-92.18307\\153\\-12.69531\\-92.72743\\153\\-10.74219\\-93.50964\\153\\-8.789063\\-93.92703\\153\\-6.835938\\-94.54492\\153\\-4.882813\\-95.40819\\153\\0.9765625\\-96.98808\\153\\2.929688\\-97.1598\\153\\4.882813\\-97.08099\\153\\6.835938\\-96.67561\\153\\10.74219\\-95.68915\\153\\14.64844\\-94.05981\\153\\18.55469\\-93.14699\\153\\20.50781\\-92.53197\\153\\22.46094\\-92.11904\\153\\24.41406\\-91.82664\\153\\28.32031\\-91.34274\\153\\32.22656\\-90.70843\\153\\36.13281\\-90.29572\\153\\40.03906\\-90.09174\\153\\43.94531\\-89.97028\\153\\47.85156\\-89.92235\\153\\53.71094\\-89.9276\\153\\57.61719\\-90.06811\\153\\61.52344\\-90.38554\\153\\63.47656\\-90.68337\\153\\67.38281\\-91.38895\\153\\71.28906\\-91.94584\\153\\73.24219\\-92.31625\\153\\77.14844\\-93.45968\\153\\81.05469\\-94.21886\\153\\83.00781\\-95.04414\\153\\86.91406\\-96.48951\\153\\88.86719\\-97.5769\\153\\90.82031\\-98.43265\\153\\92.77344\\-99.57942\\153\\94.72656\\-100.4156\\153\\98.3347\\-102.6016\\153\\100.5859\\-104.038\\153\\104.4922\\-106.9443\\153\\106.4453\\-108.2533\\153\\108.8797\\-110.4141\\153\\112.5636\\-114.3203\\153\\114.2578\\-116.3392\\153\\116.8815\\-120.1797\\153\\117.7033\\-122.1328\\153\\118.8519\\-124.0859\\153\\119.6512\\-126.0391\\153\\120.803\\-127.9922\\153\\121.4761\\-129.9453\\153\\122.4211\\-131.8984\\153\\122.963\\-133.8516\\153\\123.3337\\-135.8047\\153\\124.6212\\-139.7109\\153\\125.2869\\-143.6172\\153\\125.7827\\-145.5703\\153\\126.4113\\-147.5234\\153\\127.2768\\-153.3828\\153\\128.0382\\-157.2891\\153\\128.5203\\-161.1953\\153\\128.8498\\-167.0547\\153\\128.9119\\-169.0078\\153\\129.0583\\-182.6797\\153\\129.1028\\-190.4922\\153\\129.0601\\-200.2578\\153\\128.9291\\-206.1172\\153\\128.6537\\-211.9766\\153\\128.2807\\-215.8828\\153\\127.9297\\-217.6154\\153\\127.3692\\-219.7891\\153\\126.5448\\-223.6953\\153\\125.7713\\-225.6484\\153\\125.1418\\-227.6016\\153\\124.7025\\-229.5547\\153\\123.8632\\-231.5078\\153\\123.2217\\-233.4609\\153\\122.7398\\-235.4141\\153\\120.9755\\-239.3203\\153\\119.8471\\-241.2734\\153\\118.8881\\-243.2266\\153\\117.5666\\-245.1797\\153\\116.785\\-247.1328\\153\\115.4284\\-249.0859\\153\\112.8305\\-252.9922\\153\\111.3404\\-254.9453\\153\\108.5848\\-258.8516\\153\\106.4453\\-261.4288\\153\\103.4617\\-264.7109\\153\\101.5818\\-266.6641\\153\\98.63281\\-269.4968\\153\\94.72656\\-273.1094\\153\\92.77344\\-274.7673\\153\\90.82031\\-276.1836\\153\\84.96094\\-280.8988\\153\\82.85985\\-282.2891\\153\\81.05469\\-283.3342\\153\\79.10156\\-284.7812\\153\\73.24219\\-288.4222\\153\\71.28906\\-289.2532\\153\\69.33594\\-290.3872\\153\\67.38281\\-291.2348\\153\\65.42969\\-292.4362\\153\\63.47656\\-293.2683\\153\\61.52344\\-294.3035\\153\\59.57031\\-294.9607\\153\\57.61719\\-295.5066\\153\\55.66406\\-296.4619\\153\\53.71094\\-296.9692\\153\\51.75781\\-297.6068\\153\\49.80469\\-298.4934\\153\\47.85156\\-299.0101\\153\\43.94531\\-300.3616\\153\\40.03906\\-301.094\\153\\38.08594\\-301.516\\153\\36.13281\\-302.1003\\153\\32.22656\\-302.7127\\153\\28.32031\\-303.132\\153\\26.36719\\-303.4777\\153\\24.41406\\-303.9972\\153\\22.46094\\-304.2787\\153\\18.55469\\-304.6232\\153\\6.835938\\-305.317\\153\\2.929688\\-305.4122\\153\\-0.9765625\\-305.4143\\153\\-6.835938\\-305.1726\\153\\-12.69531\\-304.827\\153\\-18.55469\\-304.3805\\153" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "241" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "203" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-303.9221\\155\\-24.41406\\-303.43\\155\\-26.36719\\-303.0824\\155\\-30.27344\\-302.689\\155\\-32.22656\\-302.4227\\155\\-34.17969\\-301.9931\\155\\-36.13281\\-301.4174\\155\\-40.03906\\-300.6631\\155\\-41.99219\\-300.2182\\155\\-43.94531\\-299.388\\155\\-47.85156\\-298.207\\155\\-49.80469\\-297.2764\\155\\-51.75781\\-296.772\\155\\-55.66406\\-295.227\\155\\-57.61719\\-294.6896\\155\\-59.57031\\-293.6956\\155\\-61.52344\\-292.8795\\155\\-63.47656\\-291.7631\\155\\-65.42969\\-290.8617\\155\\-67.38281\\-289.6299\\155\\-69.33594\\-288.9059\\155\\-71.28906\\-287.7182\\155\\-73.24219\\-286.7057\\155\\-77.14844\\-283.8824\\155\\-79.10156\\-282.7564\\155\\-82.42516\\-280.3359\\155\\-84.96094\\-278.232\\155\\-86.91406\\-276.7841\\155\\-88.86719\\-275.2354\\155\\-90.82031\\-273.4869\\155\\-91.77734\\-272.5234\\155\\-94.72656\\-269.8007\\155\\-96.11192\\-268.6172\\155\\-97.94387\\-266.6641\\155\\-100.5859\\-263.9612\\155\\-101.8903\\-262.7578\\155\\-106.4453\\-257.5781\\155\\-108.8797\\-254.9453\\155\\-111.5374\\-251.0391\\155\\-113.1205\\-249.0859\\155\\-114.579\\-247.1328\\155\\-115.6741\\-245.1797\\155\\-116.945\\-243.2266\\155\\-117.8266\\-241.2734\\155\\-118.1641\\-240.8524\\155\\-120.1694\\-237.3672\\155\\-122.0703\\-233.6999\\155\\-122.9576\\-231.5078\\155\\-123.4831\\-229.5547\\155\\-124.4154\\-227.6016\\155\\-125.4521\\-223.6953\\155\\-126.3127\\-221.7422\\155\\-127.2329\\-217.8359\\155\\-128.4421\\-213.9297\\155\\-129.3367\\-208.0703\\155\\-130.1893\\-204.1641\\155\\-130.4986\\-202.2109\\155\\-130.8048\\-198.3047\\155\\-130.9921\\-194.3984\\155\\-131.4285\\-186.5859\\155\\-131.5059\\-182.6797\\155\\-131.4285\\-178.7734\\155\\-131.0801\\-170.9609\\155\\-130.7701\\-165.1016\\155\\-130.4509\\-161.1953\\155\\-130.1893\\-159.2422\\155\\-129.445\\-155.3359\\155\\-128.6098\\-149.4766\\155\\-128.1566\\-147.5234\\155\\-127.4414\\-145.5703\\155\\-126.4139\\-141.6641\\155\\-125.504\\-139.7109\\155\\-124.9302\\-137.7578\\155\\-124.2477\\-135.8047\\155\\-123.3322\\-133.8516\\155\\-122.7362\\-131.8984\\155\\-121.6443\\-129.9453\\155\\-120.7429\\-127.9922\\155\\-119.3683\\-126.0391\\155\\-118.2467\\-124.0859\\155\\-116.2109\\-121.0408\\155\\-112.4663\\-116.2734\\155\\-110.8434\\-114.3203\\155\\-109.098\\-112.3672\\155\\-106.4453\\-109.7323\\155\\-104.4922\\-108.0164\\155\\-102.4009\\-106.5078\\155\\-100.5859\\-105.3558\\155\\-98.63281\\-103.9016\\155\\-94.72656\\-101.7154\\155\\-92.77344\\-100.9835\\155\\-90.82031\\-100.0121\\155\\-88.86719\\-99.4938\\155\\-84.96094\\-98.06438\\155\\-81.05469\\-97.18382\\155\\-79.10156\\-96.53049\\155\\-77.14844\\-96.15289\\155\\-71.28906\\-95.312\\155\\-67.38281\\-94.48696\\155\\-65.42969\\-94.20823\\155\\-61.52344\\-93.8242\\155\\-55.66406\\-93.34018\\155\\-49.80469\\-92.46895\\155\\-45.89844\\-92.14873\\155\\-40.03906\\-91.85938\\155\\-36.13281\\-91.72346\\155\\-30.27344\\-91.64779\\155\\-24.41406\\-91.75029\\155\\-18.55469\\-91.97759\\155\\-16.60156\\-92.17231\\155\\-14.64844\\-92.52113\\155\\-12.69531\\-93.20564\\155\\-8.789063\\-94.15717\\155\\-6.835938\\-95.00691\\155\\-4.882813\\-95.71331\\155\\-2.929688\\-96.2569\\155\\-0.9765625\\-97.00214\\155\\0.9765625\\-97.42522\\155\\2.929688\\-97.54983\\155\\4.882813\\-97.48135\\155\\6.835938\\-97.22114\\155\\8.789063\\-96.5399\\155\\12.69531\\-95.27734\\155\\14.64844\\-94.34645\\155\\18.55469\\-93.50613\\155\\22.46094\\-92.49985\\155\\24.41406\\-92.13839\\155\\26.36719\\-91.8862\\155\\34.17969\\-91.04919\\155\\36.13281\\-90.74738\\155\\41.99219\\-90.37357\\155\\49.80469\\-90.21143\\155\\53.71094\\-90.21494\\155\\57.61719\\-90.37974\\155\\59.57031\\-90.5638\\155\\63.47656\\-91.20396\\155\\69.33594\\-91.88507\\155\\71.28906\\-92.14754\\155\\73.24219\\-92.54297\\155\\75.19531\\-93.15438\\155\\77.14844\\-93.60627\\155\\79.10156\\-93.93909\\155\\81.05469\\-94.41401\\155\\83.00781\\-95.31641\\155\\84.96094\\-95.93961\\155\\86.82291\\-96.74219\\155\\92.77344\\-99.72482\\155\\96.67969\\-101.7888\\155\\98.63281\\-103.1533\\155\\100.5859\\-104.3538\\155\\103.6099\\-106.5078\\155\\106.0846\\-108.4609\\155\\108.373\\-110.4141\\155\\112.3047\\-114.596\\155\\114.2578\\-116.8848\\155\\115.2893\\-118.2266\\155\\116.5915\\-120.1797\\155\\117.4286\\-122.1328\\155\\118.6096\\-124.0859\\155\\119.3638\\-126.0391\\155\\120.5287\\-127.9922\\155\\121.2477\\-129.9453\\155\\122.0939\\-131.8984\\155\\122.8164\\-133.8516\\155\\123.6816\\-137.7578\\155\\124.4596\\-139.7109\\155\\125.1628\\-143.6172\\155\\125.5644\\-145.5703\\155\\126.2123\\-147.5234\\155\\126.598\\-149.4766\\155\\127.4474\\-155.3359\\155\\128.155\\-159.2422\\155\\128.3967\\-161.1953\\155\\128.6692\\-165.1016\\155\\128.8272\\-169.0078\\155\\128.8834\\-172.9141\\155\\128.946\\-182.6797\\155\\128.9756\\-190.4922\\155\\128.9291\\-200.2578\\155\\128.8221\\-206.1172\\155\\128.5522\\-211.9766\\155\\128.415\\-213.9297\\155\\128.1654\\-215.8828\\155\\127.3103\\-219.7891\\155\\126.5603\\-223.6953\\155\\125.1795\\-227.6016\\155\\124.7709\\-229.5547\\155\\123.2774\\-233.4609\\155\\122.8285\\-235.4141\\155\\122.0703\\-237.236\\155\\120.1248\\-241.2734\\155\\118.1641\\-244.6777\\155\\117.7777\\-245.1797\\155\\116.9355\\-247.1328\\155\\115.5973\\-249.0859\\155\\114.4319\\-251.0391\\155\\112.3047\\-253.9765\\155\\111.512\\-254.9453\\155\\108.815\\-258.8516\\155\\106.4453\\-261.6548\\155\\105.3731\\-262.7578\\155\\101.7953\\-266.6641\\155\\97.71412\\-270.5703\\155\\94.72656\\-273.3649\\155\\92.77344\\-275.0844\\155\\88.86719\\-277.9966\\155\\88.45313\\-278.3828\\155\\84.96094\\-281.1465\\155\\83.00781\\-282.5256\\155\\81.05469\\-283.5766\\155\\77.14844\\-286.402\\155\\75.19531\\-287.4465\\155\\73.24219\\-288.7225\\155\\71.28906\\-289.4742\\155\\69.33594\\-290.6875\\155\\67.38281\\-291.5076\\155\\65.42969\\-292.7343\\155\\63.47656\\-293.5353\\155\\61.52344\\-294.5775\\155\\59.57031\\-295.1178\\155\\57.61719\\-295.7995\\155\\55.66406\\-296.6665\\155\\53.71094\\-297.1405\\155\\51.75781\\-297.9948\\155\\49.80469\\-298.6964\\155\\47.85156\\-299.2293\\155\\45.89844\\-300.0046\\155\\43.94531\\-300.5433\\155\\40.03906\\-301.2706\\155\\36.13281\\-302.325\\155\\34.17969\\-302.6097\\155\\30.27344\\-303.0382\\155\\28.32031\\-303.343\\155\\24.41406\\-304.2354\\155\\20.50781\\-304.6071\\155\\6.835938\\-305.5355\\155\\2.929688\\-305.6281\\155\\-2.929688\\-305.5484\\155\\-6.835938\\-305.3322\\155\\-16.60156\\-304.6745\\155\\-20.50781\\-304.2787\\155" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "237" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "204" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.929688\\-305.8073\\157\\-6.835938\\-305.5614\\157\\-12.69531\\-305.0666\\157\\-18.55469\\-304.622\\157\\-22.46094\\-304.1604\\157\\-26.36719\\-303.2391\\157\\-28.32031\\-302.9651\\157\\-32.22656\\-302.5572\\157\\-34.17969\\-302.1874\\157\\-38.08594\\-301.1505\\157\\-41.99219\\-300.3764\\157\\-45.89844\\-298.9951\\157\\-47.85156\\-298.4534\\157\\-49.80469\\-297.4937\\157\\-53.71094\\-296.3339\\157\\-55.66406\\-295.3839\\157\\-57.61719\\-294.8526\\157\\-59.57031\\-294.0469\\157\\-63.47656\\-292.1901\\157\\-67.38281\\-290\\157\\-71.18317\\-288.1484\\157\\-73.24219\\-286.9708\\157\\-75.19531\\-285.5544\\157\\-79.10156\\-283.0328\\157\\-81.05469\\-281.5806\\157\\-82.92165\\-280.3359\\157\\-86.91406\\-277.0912\\157\\-90.03751\\-274.4766\\157\\-94.72656\\-270.1603\\157\\-96.54772\\-268.6172\\157\\-100.5859\\-264.3428\\157\\-102.2084\\-262.7578\\157\\-104.4922\\-260.1263\\157\\-105.4921\\-258.8516\\157\\-107.3453\\-256.8984\\157\\-109.0694\\-254.9453\\157\\-110.4854\\-252.9922\\157\\-111.7042\\-251.0391\\157\\-112.3047\\-250.3393\\157\\-114.7585\\-247.1328\\157\\-115.8189\\-245.1797\\157\\-117.033\\-243.2266\\157\\-117.9872\\-241.2734\\157\\-120.3195\\-237.3672\\157\\-121.2356\\-235.4141\\157\\-122.2897\\-233.4609\\157\\-122.9759\\-231.5078\\157\\-123.4608\\-229.5547\\157\\-124.3804\\-227.6016\\157\\-125.4025\\-223.6953\\157\\-126.224\\-221.7422\\157\\-127.1537\\-217.8359\\157\\-128.334\\-213.9297\\157\\-128.6778\\-211.9766\\157\\-129.555\\-206.1172\\157\\-130.0266\\-204.1641\\157\\-130.3645\\-202.2109\\157\\-130.7352\\-198.3047\\157\\-130.9116\\-194.3984\\157\\-131.2256\\-188.5391\\157\\-131.3321\\-184.6328\\157\\-131.3262\\-180.7266\\157\\-131.1489\\-174.8672\\157\\-130.7821\\-167.0547\\157\\-130.49\\-163.1484\\157\\-130.2748\\-161.1953\\157\\-129.5296\\-157.2891\\157\\-128.7529\\-151.4297\\157\\-128.4119\\-149.4766\\157\\-127.1671\\-145.5703\\157\\-126.7051\\-143.6172\\157\\-126.0431\\-141.6641\\157\\-125.2275\\-139.7109\\157\\-124.7185\\-137.7578\\157\\-123.819\\-135.8047\\157\\-122.4512\\-131.8984\\157\\-121.3265\\-129.9453\\157\\-120.3425\\-127.9922\\157\\-118.1641\\-124.6701\\157\\-117.7\\-124.0859\\157\\-116.6922\\-122.1328\\157\\-115.2018\\-120.1797\\157\\-112.3047\\-116.6563\\157\\-110.4574\\-114.3203\\157\\-108.724\\-112.3672\\157\\-106.4453\\-110.1141\\157\\-104.4922\\-108.4015\\157\\-102.0255\\-106.5078\\157\\-99.12109\\-104.5547\\157\\-98.63281\\-104.1467\\157\\-96.67969\\-103.0832\\157\\-94.72656\\-101.8919\\157\\-92.77344\\-101.1961\\157\\-90.82031\\-100.2045\\157\\-86.91406\\-99.15449\\157\\-84.96094\\-98.30592\\157\\-81.05469\\-97.43819\\157\\-77.14844\\-96.3528\\157\\-75.19531\\-96.03928\\157\\-71.28906\\-95.51138\\157\\-69.33594\\-95.19707\\157\\-65.42969\\-94.4025\\157\\-61.52344\\-93.95629\\157\\-53.71094\\-93.37709\\157\\-51.75781\\-93.18668\\157\\-47.85156\\-92.6365\\157\\-43.94531\\-92.3058\\157\\-38.08594\\-92.0238\\157\\-30.27344\\-91.88563\\157\\-22.46094\\-92.06196\\157\\-18.55469\\-92.2489\\157\\-16.60156\\-92.48942\\157\\-12.69531\\-93.5015\\157\\-10.74219\\-93.88991\\157\\-8.789063\\-94.46593\\157\\-6.835938\\-95.37759\\157\\-2.929688\\-96.64745\\157\\-0.9765625\\-97.42178\\157\\0.9765625\\-97.74392\\157\\2.929688\\-97.85755\\157\\4.882813\\-97.79273\\157\\6.835938\\-97.55599\\157\\8.789063\\-97.0495\\157\\10.74219\\-96.20103\\157\\12.69531\\-95.58862\\157\\14.64844\\-94.78078\\157\\16.60156\\-94.10232\\157\\20.50781\\-93.41537\\157\\24.41406\\-92.52995\\157\\26.36719\\-92.23455\\157\\30.27344\\-91.77799\\157\\36.13281\\-91.33688\\157\\38.08594\\-91.25391\\157\\43.94531\\-90.83063\\157\\49.80469\\-90.55515\\157\\53.71094\\-90.59908\\157\\57.61719\\-90.84525\\157\\61.52344\\-91.36221\\157\\65.42969\\-91.68182\\157\\69.33594\\-92.09564\\157\\71.28906\\-92.38021\\157\\75.19531\\-93.37273\\157\\79.10156\\-94.06916\\157\\81.05469\\-94.68585\\157\\83.00781\\-95.53619\\157\\84.96094\\-96.10828\\157\\86.91406\\-97.10026\\157\\88.86719\\-97.91086\\157\\90.82031\\-99.05621\\157\\92.77344\\-99.87329\\157\\94.72656\\-101.06\\157\\96.67969\\-101.9742\\157\\97.51062\\-102.6016\\157\\102.5391\\-106.0036\\157\\104.4922\\-107.4582\\157\\107.9317\\-110.4141\\157\\109.8968\\-112.3672\\157\\112.3047\\-114.9352\\157\\115.033\\-118.2266\\157\\116.2842\\-120.1797\\157\\118.3138\\-124.0859\\157\\119.1774\\-126.0391\\157\\120.2526\\-127.9922\\157\\121.8401\\-131.8984\\157\\122.7069\\-133.8516\\157\\123.5418\\-137.7578\\157\\124.3115\\-139.7109\\157\\124.7972\\-141.6641\\157\\125.4762\\-145.5703\\157\\126.0851\\-147.5234\\157\\126.5385\\-149.4766\\157\\127.3562\\-155.3359\\157\\128.0382\\-159.2422\\157\\128.3241\\-161.1953\\157\\128.6127\\-165.1016\\157\\128.7884\\-169.0078\\157\\128.8445\\-172.9141\\157\\128.8894\\-182.6797\\157\\128.8779\\-196.3516\\157\\128.8221\\-202.2109\\157\\128.7453\\-206.1172\\157\\128.594\\-210.0234\\157\\128.3535\\-213.9297\\157\\128.0651\\-215.8828\\157\\127.2731\\-219.7891\\157\\126.5902\\-223.6953\\157\\125.2441\\-227.6016\\157\\124.8355\\-229.5547\\157\\124.1949\\-231.5078\\157\\123.3497\\-233.4609\\157\\122.927\\-235.4141\\157\\122.2269\\-237.3672\\157\\121.231\\-239.3203\\157\\120.399\\-241.2734\\157\\119.1567\\-243.2266\\157\\118.0459\\-245.1797\\157\\117.0662\\-247.1328\\157\\115.8046\\-249.0859\\157\\114.6715\\-251.0391\\157\\114.2578\\-251.5045\\157\\112.3047\\-254.2358\\157\\111.6869\\-254.9453\\157\\109.0299\\-258.8516\\157\\107.3727\\-260.8047\\157\\105.5434\\-262.7578\\157\\102.0033\\-266.6641\\157\\94.72656\\-273.6189\\157\\92.77344\\-275.3424\\157\\88.86719\\-278.4204\\157\\83.00781\\-282.8211\\157\\81.05469\\-283.8954\\157\\77.14844\\-286.7379\\157\\75.19531\\-287.7564\\157\\73.24219\\-288.9581\\157\\71.28906\\-289.776\\157\\69.33594\\-290.9424\\157\\67.38281\\-291.8907\\157\\65.42969\\-292.9722\\157\\61.52344\\-294.776\\157\\59.57031\\-295.2742\\157\\57.61719\\-296.1739\\157\\55.66406\\-296.8272\\157\\53.71094\\-297.3655\\157\\51.75781\\-298.3352\\157\\47.85156\\-299.4986\\157\\45.89844\\-300.2991\\157\\40.03906\\-301.4901\\157\\38.08594\\-302.0773\\157\\36.13281\\-302.51\\157\\32.22656\\-302.9514\\157\\30.27344\\-303.2302\\157\\26.36719\\-304.12\\157\\24.41406\\-304.4262\\157\\12.69531\\-305.3524\\157\\10.74219\\-305.5484\\157\\6.835938\\-305.8213\\157\\0.9765625\\-305.9009\\157" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "236" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "205" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-305.862\\159\\-12.69531\\-305.2561\\159\\-18.55469\\-304.7595\\159\\-22.46094\\-304.3507\\159\\-24.41406\\-304.0092\\159\\-26.36719\\-303.4756\\159\\-28.32031\\-303.0938\\159\\-32.22656\\-302.6648\\159\\-34.17969\\-302.37\\159\\-38.08594\\-301.3156\\159\\-41.99219\\-300.5468\\159\\-43.94531\\-299.9765\\159\\-45.89844\\-299.1881\\159\\-47.85156\\-298.649\\159\\-51.75781\\-297.0731\\159\\-53.71094\\-296.5698\\159\\-55.66406\\-295.6167\\159\\-59.57031\\-294.3808\\159\\-61.52344\\-293.3142\\159\\-63.47656\\-292.5251\\159\\-65.42969\\-291.2657\\159\\-67.38281\\-290.4249\\159\\-69.33594\\-289.2501\\159\\-71.28906\\-288.4518\\159\\-71.6816\\-288.1484\\159\\-77.14844\\-284.7178\\159\\-81.05469\\-281.8496\\159\\-83.00781\\-280.6639\\159\\-85.64661\\-278.3828\\159\\-88.86719\\-275.7056\\159\\-90.46599\\-274.4766\\159\\-92.77344\\-272.3222\\159\\-96.67969\\-268.8792\\159\\-100.5859\\-264.7923\\159\\-102.599\\-262.7578\\159\\-105.8275\\-258.8516\\159\\-109.2715\\-254.9453\\159\\-110.7661\\-252.9922\\159\\-111.9358\\-251.0391\\159\\-114.9503\\-247.1328\\159\\-118.1641\\-241.4129\\159\\-119.2336\\-239.3203\\159\\-120.4962\\-237.3672\\159\\-121.3351\\-235.4141\\159\\-122.3776\\-233.4609\\159\\-122.9995\\-231.5078\\159\\-123.4961\\-229.5547\\159\\-124.4127\\-227.6016\\159\\-125.4059\\-223.6953\\159\\-126.2004\\-221.7422\\159\\-126.7251\\-219.7891\\159\\-127.6536\\-215.8828\\159\\-128.2911\\-213.9297\\159\\-128.6436\\-211.9766\\159\\-129.4855\\-206.1172\\159\\-130.2965\\-202.2109\\159\\-130.5318\\-200.2578\\159\\-130.81\\-196.3516\\159\\-131.1603\\-188.5391\\159\\-131.25\\-184.6328\\159\\-131.25\\-180.7266\\159\\-131.0801\\-174.8672\\159\\-130.7174\\-167.0547\\159\\-130.3971\\-163.1484\\159\\-130.1233\\-161.1953\\159\\-129.3879\\-157.2891\\159\\-128.6173\\-151.4297\\159\\-128.2021\\-149.4766\\159\\-127.4852\\-147.5234\\159\\-126.5046\\-143.6172\\159\\-125.6466\\-141.6641\\159\\-124.4924\\-137.7578\\159\\-123.5057\\-135.8047\\159\\-122.9553\\-133.8516\\159\\-122.1097\\-131.8984\\159\\-121.0562\\-129.9453\\159\\-119.8392\\-127.9922\\159\\-118.7729\\-126.0391\\159\\-117.3941\\-124.0859\\159\\-116.3005\\-122.1328\\159\\-114.9022\\-120.1797\\159\\-111.5987\\-116.2734\\159\\-110.3516\\-114.6255\\159\\-108.2935\\-112.3672\\159\\-104.4922\\-108.7239\\159\\-101.7197\\-106.5078\\159\\-98.80371\\-104.5547\\159\\-94.72656\\-102.0569\\159\\-92.77344\\-101.3558\\159\\-90.82031\\-100.444\\159\\-88.86719\\-99.78609\\159\\-86.91406\\-99.36008\\159\\-84.96094\\-98.57324\\159\\-83.00781\\-97.98743\\159\\-79.10156\\-97.22437\\159\\-77.14844\\-96.60675\\159\\-75.19531\\-96.19463\\159\\-69.33594\\-95.39711\\159\\-63.47656\\-94.34396\\159\\-59.57031\\-93.94946\\159\\-55.66406\\-93.6788\\159\\-49.80469\\-93.32422\\159\\-43.94531\\-92.67435\\159\\-41.99219\\-92.51041\\159\\-38.08594\\-92.3058\\159\\-30.27344\\-92.14628\\159\\-22.46094\\-92.35632\\159\\-18.55469\\-92.60021\\159\\-16.60156\\-92.92188\\159\\-10.74219\\-94.0942\\159\\-6.835938\\-95.64208\\159\\-4.882813\\-96.2298\\159\\-2.929688\\-97.16256\\159\\-0.9765625\\-97.72389\\159\\0.9765625\\-98.02852\\159\\2.929688\\-98.1491\\159\\4.882813\\-98.06715\\159\\6.835938\\-97.81995\\159\\8.789063\\-97.41036\\159\\10.74219\\-96.55112\\159\\12.69531\\-95.81921\\159\\14.64844\\-95.18666\\159\\16.60156\\-94.3886\\159\\18.55469\\-93.98447\\159\\22.46094\\-93.40614\\159\\26.36719\\-92.64893\\159\\30.27344\\-92.10491\\159\\34.17969\\-91.82301\\159\\40.03906\\-91.55762\\159\\45.89844\\-91.21484\\159\\49.80469\\-91.08656\\159\\53.71094\\-91.13549\\159\\55.66406\\-91.21707\\159\\61.52344\\-91.65486\\159\\63.47656\\-91.72952\\159\\67.38281\\-92.09213\\159\\71.28906\\-92.7005\\159\\73.24219\\-93.20301\\159\\79.10156\\-94.26065\\159\\83.00781\\-95.71569\\159\\84.96094\\-96.30056\\159\\86.91406\\-97.3328\\159\\88.86719\\-98.09821\\159\\90.82031\\-99.27997\\159\\92.77344\\-100.034\\159\\94.72656\\-101.2799\\159\\96.67969\\-102.1683\\159\\100.0176\\-104.5547\\159\\100.5859\\-105.0329\\159\\102.5391\\-106.2691\\159\\104.4922\\-107.6941\\159\\106.4453\\-109.3526\\159\\109.6316\\-112.3672\\159\\112.3047\\-115.219\\159\\114.8039\\-118.2266\\159\\116.2109\\-120.454\\159\\117.1332\\-122.1328\\159\\120.9666\\-129.9453\\159\\121.6682\\-131.8984\\159\\122.6184\\-133.8516\\159\\123.4681\\-137.7578\\159\\124.2217\\-139.7109\\159\\124.7531\\-141.6641\\159\\125.438\\-145.5703\\159\\126.0431\\-147.5234\\159\\126.5228\\-149.4766\\159\\127.0677\\-153.3828\\159\\127.667\\-157.2891\\159\\128.0382\\-159.2422\\159\\128.4819\\-163.1484\\159\\128.7835\\-169.0078\\159\\128.8445\\-174.8672\\159\\128.8837\\-184.6328\\159\\128.8724\\-190.4922\\159\\128.7946\\-202.2109\\159\\128.5826\\-210.0234\\159\\128.3314\\-213.9297\\159\\128.0518\\-215.8828\\159\\127.2842\\-219.7891\\159\\126.6398\\-223.6953\\159\\126.0713\\-225.6484\\159\\125.335\\-227.6016\\159\\124.9164\\-229.5547\\159\\124.3717\\-231.5078\\159\\123.4591\\-233.4609\\159\\123.0171\\-235.4141\\159\\122.4297\\-237.3672\\159\\121.38\\-239.3203\\159\\120.5997\\-241.2734\\159\\119.3126\\-243.2266\\159\\118.1641\\-245.3956\\159\\116.2109\\-248.8234\\159\\114.8564\\-251.0391\\159\\114.2578\\-251.7527\\159\\112.3047\\-254.4807\\159\\111.881\\-254.9453\\159\\110.6145\\-256.8984\\159\\109.1835\\-258.8516\\159\\107.5393\\-260.8047\\159\\103.9411\\-264.7109\\159\\102.238\\-266.6641\\159\\98.63281\\-270.082\\159\\94.72656\\-273.8629\\159\\92.77344\\-275.5521\\159\\88.86719\\-278.795\\159\\83.00781\\-283.0541\\159\\79.10156\\-285.5627\\159\\77.14844\\-287.0091\\159\\75.19531\\-288.1884\\159\\71.28906\\-290.2117\\159\\69.33594\\-291.1684\\159\\67.38281\\-292.3648\\159\\65.42969\\-293.1857\\159\\63.47656\\-294.2176\\159\\61.52344\\-294.937\\159\\59.57031\\-295.4727\\159\\57.61719\\-296.4619\\159\\55.66406\\-297.0009\\159\\53.71094\\-297.656\\159\\51.75781\\-298.5814\\159\\49.80469\\-299.1064\\159\\47.83381\\-299.8672\\159\\45.89844\\-300.5008\\159\\41.99219\\-301.2447\\159\\38.08594\\-302.3186\\159\\36.13281\\-302.6516\\159\\32.22656\\-303.1049\\159\\30.27344\\-303.5014\\159\\28.32031\\-304.0209\\159\\26.36719\\-304.3615\\159\\24.41406\\-304.5825\\159\\14.64844\\-305.4409\\159\\10.74219\\-305.9009\\159\\6.835938\\-306.0731\\159\\0.9765625\\-306.1233\\159\\-4.882813\\-305.9741\\159" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "241" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "206" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-305.2782\\161\\-22.46094\\-304.5144\\161\\-24.41406\\-304.2703\\161\\-28.32031\\-303.3009\\161\\-30.27344\\-302.9889\\161\\-34.17969\\-302.53\\161\\-36.13281\\-302.1388\\161\\-38.08594\\-301.516\\161\\-43.94531\\-300.2438\\161\\-45.89844\\-299.4325\\161\\-49.80469\\-298.2289\\161\\-51.75781\\-297.2767\\161\\-53.71094\\-296.7655\\161\\-57.61719\\-295.1421\\161\\-59.57031\\-294.6236\\161\\-61.52344\\-293.5983\\161\\-63.47656\\-292.7694\\161\\-65.42969\\-291.5359\\161\\-67.38281\\-290.7245\\161\\-69.33594\\-289.4738\\161\\-71.28906\\-288.7397\\161\\-73.24219\\-287.4587\\161\\-75.19531\\-286.385\\161\\-77.14844\\-285.0057\\161\\-79.10156\\-283.5082\\161\\-83.00781\\-280.9981\\161\\-86.91406\\-277.5882\\161\\-88.50828\\-276.4297\\161\\-90.82031\\-274.586\\161\\-93.03793\\-272.5234\\161\\-95.24094\\-270.5703\\161\\-98.63281\\-267.2656\\161\\-99.1452\\-266.6641\\161\\-102.9554\\-262.7578\\161\\-104.6229\\-260.8047\\161\\-106.1695\\-258.8516\\161\\-108.3984\\-256.3044\\161\\-110.9962\\-252.9922\\161\\-112.3047\\-251.0485\\161\\-115.1461\\-247.1328\\161\\-116.3291\\-245.1797\\161\\-117.2926\\-243.2266\\161\\-118.5209\\-241.2734\\161\\-119.3875\\-239.3203\\161\\-120.671\\-237.3672\\161\\-121.4644\\-235.4141\\161\\-122.5065\\-233.4609\\161\\-123.5722\\-229.5547\\161\\-124.4894\\-227.6016\\161\\-125.4731\\-223.6953\\161\\-126.2805\\-221.7422\\161\\-127.1813\\-217.8359\\161\\-128.3241\\-213.9297\\161\\-128.6621\\-211.9766\\161\\-129.4827\\-206.1172\\161\\-130.2857\\-202.2109\\161\\-130.686\\-198.3047\\161\\-130.8911\\-194.3984\\161\\-131.1344\\-188.5391\\161\\-131.214\\-184.6328\\161\\-131.214\\-180.7266\\161\\-131.1232\\-176.8203\\161\\-130.799\\-169.0078\\161\\-130.5318\\-165.1016\\161\\-130.334\\-163.1484\\161\\-129.5927\\-159.2422\\161\\-129.2982\\-157.2891\\161\\-128.8097\\-153.3828\\161\\-128.5073\\-151.4297\\161\\-128.0105\\-149.4766\\161\\-127.3108\\-147.5234\\161\\-126.2826\\-143.6172\\161\\-125.399\\-141.6641\\161\\-124.8933\\-139.7109\\161\\-124.2217\\-137.7578\\161\\-123.3206\\-135.8047\\161\\-122.7777\\-133.8516\\161\\-121.7403\\-131.8984\\161\\-120.8348\\-129.9453\\161\\-119.5007\\-127.9922\\161\\-118.4441\\-126.0391\\161\\-116.2109\\-122.5486\\161\\-114.624\\-120.1797\\161\\-111.3281\\-116.2734\\161\\-110.3516\\-114.9469\\161\\-107.9636\\-112.3672\\161\\-104.4922\\-108.9701\\161\\-101.4657\\-106.5078\\161\\-100.5859\\-105.8704\\161\\-94.72656\\-102.2255\\161\\-88.86719\\-99.91152\\161\\-86.91406\\-99.50912\\161\\-84.96094\\-98.90825\\161\\-83.00781\\-98.16213\\161\\-79.10156\\-97.44992\\161\\-75.19531\\-96.39567\\161\\-73.24219\\-96.06776\\161\\-67.38281\\-95.30271\\161\\-65.42969\\-95.0004\\161\\-63.47656\\-94.59081\\161\\-59.57031\\-94.09502\\161\\-53.71094\\-93.70724\\161\\-47.85156\\-93.42798\\161\\-40.03906\\-92.79838\\161\\-36.13281\\-92.55411\\161\\-32.22656\\-92.45891\\161\\-28.32031\\-92.45891\\161\\-22.46094\\-92.68733\\161\\-20.50781\\-92.82831\\161\\-16.60156\\-93.28409\\161\\-12.69531\\-93.89638\\161\\-10.74219\\-94.35883\\161\\-8.789063\\-95.22683\\161\\-4.882813\\-96.56398\\161\\-2.929688\\-97.49805\\161\\-0.9765625\\-97.98943\\161\\0.9765625\\-98.3805\\161\\2.929688\\-98.57324\\161\\4.882813\\-98.44783\\161\\8.789063\\-97.6925\\161\\10.74219\\-97.00214\\161\\12.69531\\-96.06891\\161\\14.64844\\-95.51221\\161\\16.66667\\-94.78906\\161\\18.55469\\-94.215\\161\\20.50781\\-93.93382\\161\\26.36719\\-93.20564\\161\\30.27344\\-92.54297\\161\\34.17969\\-92.15073\\161\\41.99219\\-91.71607\\161\\47.85156\\-91.51304\\161\\51.75781\\-91.49033\\161\\55.66406\\-91.5686\\161\\61.52344\\-91.89355\\161\\63.47656\\-91.94205\\161\\67.38281\\-92.34476\\161\\69.33594\\-92.67435\\161\\73.24219\\-93.45173\\161\\77.14844\\-94.02132\\161\\79.10156\\-94.50484\\161\\81.05469\\-95.32232\\161\\83.00781\\-95.86987\\161\\84.96094\\-96.5399\\161\\86.91406\\-97.53326\\161\\88.86719\\-98.29858\\161\\90.82031\\-99.43848\\161\\92.77344\\-100.1805\\161\\94.72656\\-101.3982\\161\\96.67969\\-102.3574\\161\\98.63281\\-103.7185\\161\\100.5859\\-105.2408\\161\\104.4922\\-107.8764\\161\\106.4453\\-109.5864\\161\\109.3959\\-112.3672\\161\\112.3047\\-115.4791\\161\\114.574\\-118.2266\\161\\116.2109\\-120.7245\\161\\117.0524\\-122.1328\\161\\117.8315\\-124.0859\\161\\118.9761\\-126.0391\\161\\119.8215\\-127.9922\\161\\120.883\\-129.9453\\161\\121.5759\\-131.8984\\161\\122.5424\\-133.8516\\161\\123.4464\\-137.7578\\161\\124.2084\\-139.7109\\161\\124.749\\-141.6641\\161\\125.4642\\-145.5703\\161\\126.112\\-147.5234\\161\\126.5462\\-149.4766\\161\\127.1006\\-153.3828\\161\\127.7274\\-157.2891\\161\\128.0913\\-159.2422\\161\\128.5052\\-163.1484\\161\\128.7996\\-169.0078\\161\\128.8557\\-172.9141\\161\\128.9177\\-184.6328\\161\\128.9006\\-190.4922\\161\\128.7884\\-202.2109\\161\\128.575\\-210.0234\\161\\128.3216\\-213.9297\\161\\128.0651\\-215.8828\\161\\127.6652\\-217.8359\\161\\126.6937\\-223.6953\\161\\126.2004\\-225.6484\\161\\125.4261\\-227.6016\\161\\124.5212\\-231.5078\\161\\123.6233\\-233.4609\\161\\122.5716\\-237.3672\\161\\121.5371\\-239.3203\\161\\120.7555\\-241.2734\\161\\119.4681\\-243.2266\\161\\118.5245\\-245.1797\\161\\117.2577\\-247.1328\\161\\116.2358\\-249.0859\\161\\114.9918\\-251.0391\\161\\112.0644\\-254.9453\\161\\110.7942\\-256.8984\\161\\109.3179\\-258.8516\\161\\107.6981\\-260.8047\\161\\104.1059\\-264.7109\\161\\102.5472\\-266.6641\\161\\100.5859\\-268.5772\\161\\98.63281\\-270.3281\\161\\96.44501\\-272.5234\\161\\94.72656\\-274.1298\\161\\90.82031\\-277.38\\161\\88.86719\\-279.0682\\161\\86.91406\\-280.6119\\161\\84.96094\\-281.8737\\161\\81.05469\\-284.6795\\161\\79.10156\\-285.9073\\161\\75.19531\\-288.56\\161\\73.24219\\-289.3537\\161\\71.28906\\-290.5745\\161\\69.33594\\-291.4094\\161\\67.38281\\-292.6552\\161\\65.42969\\-293.41\\161\\63.47656\\-294.4929\\161\\59.57031\\-295.7448\\161\\57.61719\\-296.6675\\161\\55.66406\\-297.1942\\161\\53.71094\\-298.0897\\161\\51.75781\\-298.7827\\161\\49.80469\\-299.3637\\161\\47.85156\\-300.1992\\161\\45.89844\\-300.6631\\161\\41.99219\\-301.4506\\161\\40.03906\\-302.088\\161\\38.08594\\-302.51\\161\\34.17969\\-302.9955\\161\\32.22656\\-303.3203\\161\\28.32031\\-304.2954\\161\\26.36719\\-304.54\\161\\20.50781\\-305.1176\\161\\14.64844\\-305.8073\\161\\10.74219\\-306.1425\\161\\4.882813\\-306.2838\\161\\0.9765625\\-306.2759\\161\\-4.882813\\-306.1795\\161\\-8.789063\\-305.9503\\161" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "242" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "207" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-12.69531\\-305.8351\\163\\-18.55469\\-305.0737\\163\\-24.41406\\-304.4695\\163\\-26.36719\\-304.1505\\163\\-30.27344\\-303.1638\\163\\-34.17969\\-302.6648\\163\\-36.13281\\-302.3477\\163\\-40.03906\\-301.2539\\163\\-43.94531\\-300.465\\163\\-47.85156\\-299.0517\\163\\-49.80469\\-298.4934\\163\\-51.75781\\-297.5354\\163\\-55.66406\\-296.2266\\163\\-57.61719\\-295.2824\\163\\-59.57031\\-294.8236\\163\\-61.42849\\-294.0078\\163\\-63.47656\\-292.9937\\163\\-65.42969\\-291.9152\\163\\-68.92825\\-290.1016\\163\\-69.33594\\-289.7905\\163\\-71.28906\\-288.9508\\163\\-73.24219\\-287.7455\\163\\-75.19531\\-286.723\\163\\-78.55631\\-284.2422\\163\\-79.10156\\-283.7814\\163\\-81.05469\\-282.7146\\163\\-83.00781\\-281.2547\\163\\-86.91406\\-277.9543\\163\\-88.86719\\-276.5313\\163\\-90.82031\\-274.9279\\163\\-92.77344\\-273.1723\\163\\-94.72656\\-271.2646\\163\\-95.57846\\-270.5703\\163\\-98.63281\\-267.614\\163\\-99.46903\\-266.6641\\163\\-101.408\\-264.7109\\163\\-104.4922\\-261.3705\\163\\-108.3984\\-256.7418\\163\\-110.3516\\-254.2107\\163\\-111.1861\\-252.9922\\163\\-112.7104\\-251.0391\\163\\-114.2578\\-248.8188\\163\\-116.6395\\-245.1797\\163\\-117.4721\\-243.2266\\163\\-118.7356\\-241.2734\\163\\-119.6106\\-239.3203\\163\\-120.851\\-237.3672\\163\\-121.6328\\-235.4141\\163\\-122.6488\\-233.4609\\163\\-123.7147\\-229.5547\\163\\-124.6129\\-227.6016\\163\\-125.0571\\-225.6484\\163\\-125.6161\\-223.6953\\163\\-126.4205\\-221.7422\\163\\-127.2694\\-217.8359\\163\\-128.3967\\-213.9297\\163\\-129.5321\\-206.1172\\163\\-130.3206\\-202.2109\\163\\-130.7109\\-198.3047\\163\\-130.9828\\-192.4453\\163\\-131.2219\\-184.6328\\163\\-131.2182\\-180.7266\\163\\-131.1529\\-176.8203\\163\\-130.8048\\-169.0078\\163\\-130.5359\\-165.1016\\163\\-130.2994\\-163.1484\\163\\-129.5321\\-159.2422\\163\\-128.7463\\-153.3828\\163\\-128.4149\\-151.4297\\163\\-127.1839\\-147.5234\\163\\-126.709\\-145.5703\\163\\-126.0287\\-143.6172\\163\\-125.2497\\-141.6641\\163\\-124.7656\\-139.7109\\163\\-123.9219\\-137.7578\\163\\-123.1995\\-135.8047\\163\\-122.6107\\-133.8516\\163\\-121.4905\\-131.8984\\163\\-120.6284\\-129.9453\\163\\-119.2809\\-127.9922\\163\\-118.0745\\-126.0391\\163\\-117.0382\\-124.0859\\163\\-115.6424\\-122.1328\\163\\-114.3451\\-120.1797\\163\\-112.8094\\-118.2266\\163\\-111.1624\\-116.2734\\163\\-110.3516\\-115.1945\\163\\-107.7584\\-112.3672\\163\\-104.4922\\-109.1319\\163\\-102.5391\\-107.4973\\163\\-100.5859\\-105.9975\\163\\-98.63281\\-104.8989\\163\\-96.67969\\-103.5724\\163\\-94.72656\\-102.3978\\163\\-92.77344\\-101.6016\\163\\-90.82031\\-100.9181\\163\\-88.86719\\-100.046\\163\\-84.96094\\-99.16065\\163\\-83.00781\\-98.3805\\163\\-81.05469\\-97.95056\\163\\-77.14844\\-97.23047\\163\\-75.19531\\-96.67561\\163\\-73.24219\\-96.23946\\163\\-65.42969\\-95.2513\\163\\-61.52344\\-94.5521\\163\\-59.57031\\-94.27474\\163\\-53.71094\\-93.84801\\163\\-43.94531\\-93.43643\\163\\-38.08594\\-93.12399\\163\\-34.17969\\-92.86015\\163\\-28.32031\\-92.81322\\163\\-26.36719\\-92.87563\\163\\-20.50781\\-93.21418\\163\\-16.60156\\-93.55454\\163\\-12.69531\\-94.0942\\163\\-10.74219\\-94.7038\\163\\-8.789063\\-95.50767\\163\\-6.835938\\-96.09309\\163\\-4.882813\\-97.0495\\163\\-2.929688\\-97.75965\\163\\0.9765625\\-98.90825\\163\\2.929688\\-99.10332\\163\\4.882813\\-98.98336\\163\\8.789063\\-97.94697\\163\\10.74219\\-97.3473\\163\\12.69531\\-96.36352\\163\\14.64844\\-95.74839\\163\\16.60156\\-95.26751\\163\\18.55469\\-94.58466\\163\\20.50781\\-94.17057\\163\\22.46094\\-93.92034\\163\\30.27344\\-93.16615\\163\\34.17969\\-92.56541\\163\\36.13281\\-92.36837\\163\\40.03906\\-92.08598\\163\\47.85156\\-91.81262\\163\\51.75781\\-91.77012\\163\\55.66406\\-91.83395\\163\\63.47656\\-92.21202\\163\\65.42969\\-92.3866\\163\\67.38281\\-92.67435\\163\\69.33594\\-93.08912\\163\\71.28906\\-93.39124\\163\\75.19531\\-93.87169\\163\\77.14844\\-94.18761\\163\\81.05469\\-95.52148\\163\\83.00781\\-96.02232\\163\\84.80748\\-96.74219\\163\\88.86719\\-98.52093\\163\\90.82031\\-99.5694\\163\\92.77344\\-100.3496\\163\\96.67969\\-102.5773\\163\\98.63281\\-103.8894\\163\\100.5859\\-105.4026\\163\\104.4922\\-108.0836\\163\\106.4453\\-109.8052\\163\\109.1588\\-112.3672\\163\\112.3047\\-115.7334\\163\\114.3444\\-118.2266\\163\\116.9934\\-122.1328\\163\\117.7338\\-124.0859\\163\\118.914\\-126.0391\\163\\119.7305\\-127.9922\\163\\120.8288\\-129.9453\\163\\121.5338\\-131.8984\\163\\122.5094\\-133.8516\\163\\123.4554\\-137.7578\\163\\124.2217\\-139.7109\\163\\124.7734\\-141.6641\\163\\125.5321\\-145.5703\\163\\126.224\\-147.5234\\163\\126.6121\\-149.4766\\163\\127.1684\\-153.3828\\163\\128.1772\\-159.2422\\163\\128.5558\\-163.1484\\163\\128.8333\\-169.0078\\163\\128.9288\\-174.8672\\163\\128.9818\\-180.7266\\163\\128.964\\-188.5391\\163\\128.8159\\-202.2109\\163\\128.6053\\-210.0234\\163\\128.3535\\-213.9297\\163\\128.1167\\-215.8828\\163\\127.3775\\-219.7891\\163\\126.7488\\-223.6953\\163\\126.3231\\-225.6484\\163\\125.5517\\-227.6016\\163\\124.6491\\-231.5078\\163\\123.7958\\-233.4609\\163\\122.6814\\-237.3672\\163\\121.7017\\-239.3203\\163\\120.8826\\-241.2734\\163\\119.6226\\-243.2266\\163\\118.6796\\-245.1797\\163\\117.3602\\-247.1328\\163\\116.4186\\-249.0859\\163\\115.116\\-251.0391\\163\\113.6407\\-252.9922\\163\\110.9416\\-256.8984\\163\\107.8566\\-260.8047\\163\\104.355\\-264.7109\\163\\102.8343\\-266.6641\\163\\100.5859\\-268.9526\\163\\98.74321\\-270.5703\\163\\96.86379\\-272.5234\\163\\94.69866\\-274.4766\\163\\92.77344\\-275.9205\\163\\88.86719\\-279.3051\\163\\86.91406\\-280.893\\163\\83.00781\\-283.4699\\163\\82.0625\\-284.2422\\163\\79.10156\\-286.3681\\163\\77.14844\\-287.4995\\163\\75.19531\\-288.8058\\163\\73.24219\\-289.5612\\163\\71.28906\\-290.8256\\163\\69.33594\\-291.705\\163\\67.38281\\-292.8702\\163\\65.42969\\-293.6913\\163\\63.47656\\-294.7097\\163\\61.52344\\-295.2224\\163\\59.57031\\-296.1048\\163\\57.61719\\-296.8393\\163\\55.66406\\-297.4166\\163\\53.71094\\-298.4023\\163\\51.75781\\-298.9789\\163\\47.85156\\-300.4176\\163\\43.94531\\-301.1925\\163\\40.03906\\-302.3152\\163\\38.08594\\-302.6648\\163\\34.17969\\-303.1638\\163\\32.22656\\-303.6181\\163\\30.27344\\-304.1702\\163\\28.32031\\-304.4796\\163\\20.50781\\-305.3755\\163\\16.60156\\-305.926\\163\\12.69531\\-306.2234\\163\\8.789063\\-306.3616\\163\\4.882813\\-306.4144\\163\\0.9765625\\-306.4144\\163\\-4.882813\\-306.3288\\163\\-8.789063\\-306.1704\\163" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "242" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "208" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-305.926\\165\\-18.55469\\-305.3223\\165\\-26.36719\\-304.3944\\165\\-28.32031\\-304.0325\\165\\-30.27344\\-303.4165\\165\\-32.22656\\-303.034\\165\\-36.13281\\-302.5377\\165\\-38.08594\\-302.1169\\165\\-40.03906\\-301.4877\\165\\-43.94531\\-300.6427\\165\\-45.89844\\-300.1216\\165\\-47.85156\\-299.287\\165\\-49.80469\\-298.7168\\165\\-53.71094\\-297.0994\\165\\-55.66406\\-296.4839\\165\\-57.61719\\-295.5075\\165\\-59.57031\\-294.9844\\165\\-61.52344\\-294.3401\\165\\-63.47656\\-293.2232\\165\\-65.42969\\-292.3557\\165\\-67.38281\\-291.1617\\165\\-69.33594\\-290.238\\165\\-75.19531\\-286.9823\\165\\-77.14844\\-285.5255\\165\\-79.10156\\-284.1696\\165\\-81.05469\\-282.9795\\165\\-84.51087\\-280.3359\\165\\-88.86719\\-276.8511\\165\\-92.77344\\-273.4631\\165\\-94.72656\\-271.5891\\165\\-95.89705\\-270.5703\\165\\-98.63281\\-267.91\\165\\-101.7464\\-264.7109\\165\\-104.4922\\-261.7431\\165\\-105.2291\\-260.8047\\165\\-108.6983\\-256.8984\\165\\-110.3516\\-254.6413\\165\\-111.3921\\-252.9922\\165\\-112.9908\\-251.0391\\165\\-114.4546\\-249.0859\\165\\-115.5831\\-247.1328\\165\\-116.8855\\-245.1797\\165\\-117.7107\\-243.2266\\165\\-118.9506\\-241.2734\\165\\-119.9247\\-239.3203\\165\\-121.0133\\-237.3672\\165\\-122.7877\\-233.4609\\165\\-123.2652\\-231.5078\\165\\-123.9368\\-229.5547\\165\\-124.7352\\-227.6016\\165\\-125.1708\\-225.6484\\165\\-126.5754\\-221.7422\\165\\-127.4294\\-217.8359\\165\\-128.0382\\-215.8828\\165\\-128.5003\\-213.9297\\165\\-129.3275\\-208.0703\\165\\-129.6441\\-206.1172\\165\\-130.0974\\-204.1641\\165\\-130.3971\\-202.2109\\165\\-130.7589\\-198.3047\\165\\-131.0911\\-190.4922\\165\\-131.2176\\-186.5859\\165\\-131.2788\\-182.6797\\165\\-131.1983\\-176.8203\\165\\-130.8214\\-169.0078\\165\\-130.5603\\-165.1016\\165\\-130.2965\\-163.1484\\165\\-129.5296\\-159.2422\\165\\-128.7052\\-153.3828\\165\\-128.3392\\-151.4297\\165\\-127.0875\\-147.5234\\165\\-126.6186\\-145.5703\\165\\-125.8102\\-143.6172\\165\\-125.1341\\-141.6641\\165\\-124.6491\\-139.7109\\165\\-123.7027\\-137.7578\\165\\-122.4486\\-133.8516\\165\\-121.297\\-131.8984\\165\\-120.3896\\-129.9453\\165\\-118.1641\\-126.4625\\165\\-117.8096\\-126.0391\\165\\-116.8984\\-124.0859\\165\\-114.2578\\-120.3348\\165\\-112.6718\\-118.2266\\165\\-110.3516\\-115.3584\\165\\-107.6497\\-112.3672\\165\\-104.4922\\-109.2016\\165\\-102.5391\\-107.549\\165\\-100.5859\\-106.1105\\165\\-98.63281\\-105.0364\\165\\-96.67969\\-103.6735\\165\\-94.72656\\-102.5788\\165\\-92.77344\\-101.7122\\165\\-90.82031\\-101.0923\\165\\-88.86719\\-100.2045\\165\\-84.96094\\-99.35628\\165\\-81.05469\\-98.11045\\165\\-77.14844\\-97.43121\\165\\-75.19531\\-97.00668\\165\\-73.24219\\-96.44922\\165\\-69.33594\\-95.89548\\165\\-63.47656\\-95.19707\\165\\-59.57031\\-94.52338\\165\\-57.61719\\-94.28776\\165\\-53.71094\\-93.98732\\165\\-49.80469\\-93.8008\\165\\-38.08594\\-93.43643\\165\\-34.17969\\-93.24962\\165\\-26.36719\\-93.21418\\165\\-22.46094\\-93.36328\\165\\-18.55469\\-93.59414\\165\\-14.64844\\-93.97729\\165\\-12.69531\\-94.33782\\165\\-10.74219\\-95.10751\\165\\-6.835938\\-96.36062\\165\\-4.882813\\-97.39516\\165\\-2.929688\\-98.01066\\165\\-0.9765625\\-98.76677\\165\\0.9765625\\-99.29108\\165\\2.929688\\-99.42192\\165\\4.882813\\-99.32827\\165\\6.835938\\-98.97331\\165\\8.789063\\-98.24233\\165\\10.74219\\-97.63737\\165\\14.64844\\-96.00549\\165\\18.55469\\-95.10983\\165\\20.50781\\-94.51942\\165\\22.46094\\-94.16994\\165\\24.41406\\-93.93909\\165\\30.27344\\-93.52493\\165\\34.17969\\-93.16378\\165\\36.13281\\-92.89152\\165\\40.03906\\-92.48717\\165\\47.85156\\-92.11835\\165\\51.75781\\-92.06216\\165\\55.66406\\-92.10883\\165\\63.47656\\-92.51041\\165\\65.42969\\-92.71387\\165\\67.38281\\-93.06528\\165\\71.28906\\-93.58945\\165\\75.19531\\-94.00171\\165\\77.14844\\-94.4167\\165\\79.10156\\-95.15614\\165\\83.00781\\-96.18666\\165\\84.96094\\-97.08567\\165\\86.91406\\-97.83745\\165\\88.86719\\-98.79769\\165\\92.77344\\-100.5452\\165\\96.37841\\-102.6016\\165\\98.63281\\-104.0369\\165\\100.5859\\-105.5759\\165\\104.4922\\-108.2915\\165\\106.4453\\-110.0012\\165\\108.9254\\-112.3672\\165\\112.5865\\-116.2734\\165\\115.5981\\-120.1797\\165\\116.9194\\-122.1328\\165\\117.6892\\-124.0859\\165\\118.8687\\-126.0391\\165\\119.6699\\-127.9922\\165\\120.8147\\-129.9453\\165\\121.5251\\-131.8984\\165\\122.5124\\-133.8516\\165\\123.4773\\-137.7578\\165\\124.2853\\-139.7109\\165\\124.8162\\-141.6641\\165\\125.1795\\-143.6172\\165\\125.6622\\-145.5703\\165\\126.3536\\-147.5234\\165\\126.7053\\-149.4766\\165\\127.2805\\-153.3828\\165\\128.0244\\-157.2891\\165\\128.2807\\-159.2422\\165\\128.6394\\-163.1484\\165\\128.964\\-170.9609\\165\\129.072\\-178.7734\\165\\129.0483\\-188.5391\\165\\128.8837\\-202.2109\\165\\128.7884\\-206.1172\\165\\128.575\\-211.9766\\165\\128.2246\\-215.8828\\165\\127.4785\\-219.7891\\165\\126.4562\\-225.6484\\165\\125.7084\\-227.6016\\165\\125.1601\\-229.5547\\165\\124.7614\\-231.5078\\165\\123.2774\\-235.4141\\165\\122.7766\\-237.3672\\165\\120.9893\\-241.2734\\165\\119.7984\\-243.2266\\165\\118.798\\-245.1797\\165\\117.47\\-247.1328\\165\\116.5654\\-249.0859\\165\\113.7888\\-252.9922\\165\\112.5041\\-254.9453\\165\\111.084\\-256.8984\\165\\108.3984\\-260.3753\\165\\104.4922\\-264.8924\\165\\103.0415\\-266.6641\\165\\101.1691\\-268.6172\\165\\99.05243\\-270.5703\\165\\96.67969\\-272.9976\\165\\94.72656\\-274.7971\\165\\92.77344\\-276.1779\\165\\90.82031\\-277.808\\165\\88.86719\\-279.556\\165\\86.91406\\-281.1487\\165\\84.96094\\-282.5256\\165\\83.00781\\-283.7366\\165\\82.4375\\-284.2422\\165\\79.69962\\-286.1953\\165\\79.10156\\-286.7062\\165\\77.14844\\-287.7992\\165\\75.19531\\-288.9899\\165\\73.24219\\-289.8574\\165\\72.92624\\-290.1016\\165\\69.4423\\-292.0547\\165\\65.42969\\-294.0472\\165\\63.47656\\-294.8831\\165\\61.52344\\-295.4148\\165\\59.57031\\-296.4232\\165\\57.61719\\-297.008\\165\\55.66406\\-297.7332\\165\\53.71094\\-298.6267\\165\\51.75781\\-299.1847\\165\\49.80469\\-300.0036\\165\\47.85156\\-300.5925\\165\\43.94531\\-301.396\\165\\41.99219\\-302.0479\\165\\40.03906\\-302.5222\\165\\36.13281\\-303.0201\\165\\34.17969\\-303.3948\\165\\32.22656\\-304.0092\\165\\30.27344\\-304.3911\\165\\24.41406\\-305.0992\\165\\18.55469\\-306.0084\\165\\16.60156\\-306.1795\\165\\12.69531\\-306.3864\\165\\8.789063\\-306.5068\\165\\2.929688\\-306.5882\\165\\-4.882813\\-306.4774\\165\\-8.789063\\-306.347\\165" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "229" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "209" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-305.9971\\167\\-22.46094\\-305.0737\\167\\-28.32031\\-304.3147\\167\\-32.22656\\-303.2757\\167\\-38.08594\\-302.383\\167\\-41.99219\\-301.2267\\167\\-45.89844\\-300.386\\167\\-47.85156\\-299.5911\\167\\-51.75781\\-298.3256\\167\\-53.71094\\-297.3163\\167\\-55.66406\\-296.7322\\167\\-59.57031\\-295.1664\\167\\-61.52344\\-294.5987\\167\\-63.47656\\-293.4882\\167\\-65.42969\\-292.6687\\167\\-67.38281\\-291.4131\\167\\-69.33594\\-290.5657\\167\\-71.28906\\-289.3266\\167\\-73.24219\\-288.4618\\167\\-75.19531\\-287.2126\\167\\-79.10156\\-284.584\\167\\-82.33696\\-282.2891\\167\\-84.96094\\-280.3612\\167\\-89.72749\\-276.4297\\167\\-92.77344\\-273.7394\\167\\-94.72656\\-271.8789\\167\\-96.2136\\-270.5703\\167\\-98.63281\\-268.2049\\167\\-102.0542\\-264.7109\\167\\-104.4922\\-262.0888\\167\\-105.5376\\-260.8047\\167\\-109.0062\\-256.8984\\167\\-110.4865\\-254.9453\\167\\-111.6815\\-252.9922\\167\\-114.7852\\-249.0859\\167\\-115.8642\\-247.1328\\167\\-117.0959\\-245.1797\\167\\-118.0591\\-243.2266\\167\\-120.1172\\-239.6059\\167\\-122.198\\-235.4141\\167\\-122.9337\\-233.4609\\167\\-123.4083\\-231.5078\\167\\-124.2477\\-229.5547\\167\\-124.8582\\-227.6016\\167\\-125.3274\\-225.6484\\167\\-126.1509\\-223.6953\\167\\-126.7384\\-221.7422\\167\\-127.1495\\-219.7891\\167\\-128.2508\\-215.8828\\167\\-128.6248\\-213.9297\\167\\-129.448\\-208.0703\\167\\-130.2411\\-204.1641\\167\\-130.511\\-202.2109\\167\\-130.8157\\-198.3047\\167\\-131.0801\\-192.4453\\167\\-131.2994\\-186.5859\\167\\-131.373\\-182.6797\\167\\-131.2702\\-176.8203\\167\\-130.7527\\-167.0547\\167\\-130.3645\\-163.1484\\167\\-129.5785\\-159.2422\\167\\-128.6723\\-153.3828\\167\\-128.2854\\-151.4297\\167\\-127.5954\\-149.4766\\167\\-126.5592\\-145.5703\\167\\-125.6966\\-143.6172\\167\\-125.0633\\-141.6641\\167\\-124.5488\\-139.7109\\167\\-123.5722\\-137.7578\\167\\-123.0229\\-135.8047\\167\\-122.2832\\-133.8516\\167\\-122.0703\\-133.5596\\167\\-120.1399\\-129.9453\\167\\-118.1641\\-126.6581\\167\\-117.6723\\-126.0391\\167\\-116.7889\\-124.0859\\167\\-114.2578\\-120.4549\\167\\-112.6112\\-118.2266\\167\\-110.3516\\-115.4219\\167\\-107.6054\\-112.3672\\167\\-104.4922\\-109.2487\\167\\-102.5391\\-107.5951\\167\\-100.5859\\-106.1917\\167\\-98.63281\\-105.1369\\167\\-96.67969\\-103.7609\\167\\-92.77344\\-101.8238\\167\\-90.82031\\-101.2279\\167\\-88.86719\\-100.3914\\167\\-86.91406\\-99.84731\\167\\-84.96094\\-99.50253\\167\\-83.00781\\-99.00921\\167\\-81.05469\\-98.29858\\167\\-79.10156\\-97.9031\\167\\-75.19531\\-97.24526\\167\\-71.28906\\-96.32366\\167\\-69.33594\\-96.06074\\167\\-63.47656\\-95.41772\\167\\-61.52344\\-95.16467\\167\\-57.61719\\-94.52338\\167\\-53.71094\\-94.14428\\167\\-49.80469\\-93.93233\\167\\-45.89844\\-93.78911\\167\\-40.03906\\-93.64117\\167\\-32.22656\\-93.48083\\167\\-26.36719\\-93.47227\\167\\-22.46094\\-93.57446\\167\\-16.60156\\-93.93909\\167\\-14.64844\\-94.1827\\167\\-12.69531\\-94.65936\\167\\-10.74219\\-95.38377\\167\\-8.789063\\-95.94218\\167\\-4.882813\\-97.64899\\167\\-2.929688\\-98.30837\\167\\-0.9765625\\-99.18359\\167\\0.9765625\\-99.52511\\167\\2.929688\\-99.62194\\167\\4.882813\\-99.55402\\167\\6.835938\\-99.32007\\167\\8.69864\\-98.69531\\167\\12.69531\\-97.23047\\167\\14.64844\\-96.29099\\167\\18.55469\\-95.43396\\167\\22.46094\\-94.46829\\167\\24.41406\\-94.14859\\167\\28.32031\\-93.83015\\167\\34.17969\\-93.51712\\167\\40.03906\\-93.08912\\167\\43.94531\\-92.72743\\167\\47.85156\\-92.52113\\167\\53.71094\\-92.40125\\167\\55.66406\\-92.45891\\167\\61.52344\\-92.84401\\167\\63.47656\\-92.92257\\167\\75.19531\\-94.17871\\167\\79.10156\\-95.37881\\167\\83.00781\\-96.36805\\167\\84.96094\\-97.2709\\167\\86.91406\\-97.99461\\167\\88.86719\\-99.02791\\167\\90.82031\\-99.79319\\167\\94.72656\\-101.741\\167\\98.63281\\-104.2104\\167\\100.5859\\-105.719\\167\\104.4245\\-108.4609\\167\\106.4453\\-110.1753\\167\\108.7815\\-112.3672\\167\\110.6721\\-114.3203\\167\\112.4401\\-116.2734\\167\\115.5313\\-120.1797\\167\\116.8771\\-122.1328\\167\\117.6463\\-124.0859\\167\\118.8576\\-126.0391\\167\\119.6699\\-127.9922\\167\\120.8354\\-129.9453\\167\\121.5579\\-131.8984\\167\\122.5488\\-133.8516\\167\\123.5221\\-137.7578\\167\\124.3804\\-139.7109\\167\\124.8805\\-141.6641\\167\\125.2688\\-143.6172\\167\\126.4902\\-147.5234\\167\\127.4444\\-153.3828\\167\\128.1906\\-157.2891\\167\\128.4089\\-159.2422\\167\\128.7323\\-163.1484\\167\\129.067\\-170.9609\\167\\129.1765\\-176.8203\\167\\129.1931\\-182.6797\\167\\129.0909\\-194.3984\\167\\128.9764\\-200.2578\\167\\128.9756\\-202.2109\\167\\128.8159\\-208.0703\\167\\128.6466\\-211.9766\\167\\128.3438\\-215.8828\\167\\128.0651\\-217.8359\\167\\127.2337\\-221.7422\\167\\126.5679\\-225.6484\\167\\125.275\\-229.5547\\167\\124.8613\\-231.5078\\167\\124.2348\\-233.4609\\167\\123.3621\\-235.4141\\167\\122.8721\\-237.3672\\167\\122.0703\\-239.2772\\167\\121.0938\\-241.2734\\167\\118.9006\\-245.1797\\167\\117.5705\\-247.1328\\167\\116.6922\\-249.0859\\167\\116.2109\\-249.7099\\167\\112.6661\\-254.9453\\167\\109.6765\\-258.8516\\167\\108.3984\\-260.6313\\167\\103.2146\\-266.6641\\167\\101.3849\\-268.6172\\167\\99.30463\\-270.5703\\167\\96.67969\\-273.2542\\167\\94.72656\\-275.0707\\167\\90.82031\\-278.1387\\167\\88.27311\\-280.3359\\167\\84.96094\\-282.8559\\167\\81.05469\\-285.4835\\167\\79.10156\\-286.9635\\167\\77.14844\\-288.1567\\167\\75.19531\\-289.1548\\167\\73.24219\\-290.2546\\167\\71.28906\\-291.2279\\167\\69.33594\\-292.4854\\167\\67.38281\\-293.295\\167\\65.42969\\-294.3834\\167\\61.52344\\-295.7059\\167\\59.57031\\-296.6527\\167\\57.61719\\-297.193\\167\\55.66406\\-298.1378\\167\\51.75781\\-299.4352\\167\\49.80469\\-300.2667\\167\\47.85156\\-300.7534\\167\\45.89844\\-301.1423\\167\\41.99219\\-302.3053\\167\\40.03906\\-302.6648\\167\\36.13281\\-303.2008\\167\\32.22656\\-304.2703\\167\\24.41406\\-305.3447\\167\\20.50781\\-306.0414\\167\\16.60156\\-306.3509\\167\\10.74219\\-306.6196\\167\\6.835938\\-306.7031\\167\\0.9765625\\-306.7463\\167\\-4.882813\\-306.6447\\167\\-8.789063\\-306.5089\\167\\-14.64844\\-306.1885\\167" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "230" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "210" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-305.7932\\169\\-22.46094\\-305.3708\\169\\-24.41406\\-305.0522\\169\\-30.27344\\-304.2264\\169\\-34.17969\\-303.1601\\169\\-38.08594\\-302.5956\\169\\-40.03906\\-302.1646\\169\\-41.99219\\-301.4901\\169\\-45.89844\\-300.5938\\169\\-47.85156\\-300.0046\\169\\-49.80469\\-299.1555\\169\\-51.75781\\-298.5885\\169\\-53.71094\\-297.6301\\169\\-57.61719\\-296.3229\\169\\-59.57031\\-295.3634\\169\\-61.52344\\-294.7998\\169\\-65.42969\\-292.9112\\169\\-67.38281\\-291.7336\\169\\-69.33594\\-290.8014\\169\\-71.28906\\-289.5464\\169\\-73.24219\\-288.7449\\169\\-75.19531\\-287.4343\\169\\-77.14844\\-286.293\\169\\-79.10156\\-284.8994\\169\\-81.05469\\-283.3892\\169\\-82.76139\\-282.2891\\169\\-84.96094\\-280.7104\\169\\-88.86719\\-277.3513\\169\\-90.04688\\-276.4297\\169\\-92.77344\\-274.0358\\169\\-96.5721\\-270.5703\\169\\-100.6381\\-266.6641\\169\\-104.1613\\-262.7578\\169\\-107.6109\\-258.8516\\169\\-109.2773\\-256.8984\\169\\-110.8156\\-254.9453\\169\\-112.0438\\-252.9922\\169\\-115.0551\\-249.0859\\169\\-116.2516\\-247.1328\\169\\-117.2858\\-245.1797\\169\\-118.461\\-243.2266\\169\\-119.3777\\-241.2734\\169\\-120.6493\\-239.3203\\169\\-121.4173\\-237.3672\\169\\-122.4811\\-235.4141\\169\\-123.5932\\-231.5078\\169\\-124.499\\-229.5547\\169\\-125.5489\\-225.6484\\169\\-126.4232\\-223.6953\\169\\-127.3508\\-219.7891\\169\\-127.9823\\-217.8359\\169\\-128.4574\\-215.8828\\169\\-129.302\\-210.0234\\169\\-130.4102\\-204.1641\\169\\-130.6299\\-202.2109\\169\\-130.9996\\-196.3516\\169\\-131.4285\\-186.5859\\169\\-131.4838\\-180.7266\\169\\-131.376\\-176.8203\\169\\-130.7932\\-167.0547\\169\\-130.4599\\-163.1484\\169\\-130.0974\\-161.1953\\169\\-129.6296\\-159.2422\\169\\-128.684\\-153.3828\\169\\-128.2854\\-151.4297\\169\\-127.5823\\-149.4766\\169\\-126.5241\\-145.5703\\169\\-125.6378\\-143.6172\\169\\-124.4796\\-139.7109\\169\\-123.4961\\-137.7578\\169\\-122.9806\\-135.8047\\169\\-122.1556\\-133.8516\\169\\-118.8992\\-127.9922\\169\\-117.5916\\-126.0391\\169\\-116.7295\\-124.0859\\169\\-114.2578\\-120.4904\\169\\-112.5969\\-118.2266\\169\\-110.3516\\-115.4375\\169\\-107.5868\\-112.3672\\169\\-104.4922\\-109.2617\\169\\-102.5391\\-107.6155\\169\\-100.5859\\-106.2421\\169\\-98.63281\\-105.2037\\169\\-96.67969\\-103.8324\\169\\-92.77344\\-101.9246\\169\\-90.82031\\-101.3433\\169\\-86.91406\\-99.95874\\169\\-83.00781\\-99.21825\\169\\-81.05469\\-98.54671\\169\\-79.10156\\-98.05659\\169\\-75.19531\\-97.43059\\169\\-73.24219\\-97.0612\\169\\-71.28906\\-96.55518\\169\\-69.33594\\-96.21416\\169\\-61.52344\\-95.37997\\169\\-55.66406\\-94.52338\\169\\-53.71094\\-94.34091\\169\\-49.80469\\-94.07827\\169\\-45.89844\\-93.91373\\169\\-40.03906\\-93.76019\\169\\-28.32031\\-93.65862\\169\\-22.46094\\-93.75891\\169\\-18.55469\\-93.95808\\169\\-16.60156\\-94.13176\\169\\-14.64844\\-94.44727\\169\\-10.74219\\-95.62856\\169\\-8.789063\\-96.16199\\169\\-6.835938\\-97.14469\\169\\-4.882813\\-97.87885\\169\\-2.929688\\-98.75089\\169\\-0.9765625\\-99.44966\\169\\0.9765625\\-99.71116\\169\\2.929688\\-99.78609\\169\\4.882813\\-99.73962\\169\\6.835938\\-99.54129\\169\\8.789063\\-99.10614\\169\\10.74219\\-98.1835\\169\\12.69531\\-97.50174\\169\\14.64844\\-96.61921\\169\\16.60156\\-96.01691\\169\\20.50781\\-95.30684\\169\\24.41406\\-94.39428\\169\\26.36719\\-94.15717\\169\\30.27344\\-93.85985\\169\\38.08594\\-93.54025\\169\\45.89844\\-93.14023\\169\\53.71094\\-92.81322\\169\\57.61719\\-93.11192\\169\\65.42969\\-93.39859\\169\\71.28906\\-93.88352\\169\\73.24219\\-94.08619\\169\\75.19531\\-94.42199\\169\\77.14844\\-95.05475\\169\\79.10156\\-95.56439\\169\\81.05469\\-95.95755\\169\\83.00781\\-96.55385\\169\\84.96094\\-97.41919\\169\\86.91406\\-98.15472\\169\\88.86719\\-99.19998\\169\\90.82031\\-99.90527\\169\\92.77344\\-100.9884\\169\\94.72656\\-101.8365\\169\\98.8023\\-104.5547\\169\\101.6195\\-106.5078\\169\\104.2434\\-108.4609\\169\\106.4453\\-110.3432\\169\\108.6604\\-112.3672\\169\\110.5781\\-114.3203\\169\\112.3047\\-116.2819\\169\\115.4801\\-120.1797\\169\\116.8555\\-122.1328\\169\\117.6367\\-124.0859\\169\\118.8687\\-126.0391\\169\\119.7097\\-127.9922\\169\\120.8704\\-129.9453\\169\\121.6162\\-131.8984\\169\\122.6071\\-133.8516\\169\\123.6205\\-137.7578\\169\\124.499\\-139.7109\\169\\125.3698\\-143.6172\\169\\126.0986\\-145.5703\\169\\126.6224\\-147.5234\\169\\127.2583\\-151.4297\\169\\128.0783\\-155.3359\\169\\128.3562\\-157.2891\\169\\128.703\\-161.1953\\169\\129.0415\\-167.0547\\169\\129.1844\\-170.9609\\169\\129.3147\\-176.8203\\169\\129.3367\\-182.6797\\169\\129.2091\\-194.3984\\169\\128.9987\\-206.1172\\169\\128.6167\\-213.9297\\169\\128.2246\\-217.8359\\169\\127.3658\\-221.7422\\169\\126.6807\\-225.6484\\169\\126.176\\-227.6016\\169\\125.4109\\-229.5547\\169\\124.4154\\-233.4609\\169\\123.4645\\-235.4141\\169\\122.951\\-237.3672\\169\\122.0703\\-239.522\\169\\120.1838\\-243.2266\\169\\118.1641\\-246.5299\\169\\117.6859\\-247.1328\\169\\116.7929\\-249.0859\\169\\112.8113\\-254.9453\\169\\109.8022\\-258.8516\\169\\108.4984\\-260.8047\\169\\104.4922\\-265.3594\\169\\103.3936\\-266.6641\\169\\101.5693\\-268.6172\\169\\99.50725\\-270.5703\\169\\96.67969\\-273.4661\\169\\94.72656\\-275.285\\169\\88.69538\\-280.3359\\169\\86.91406\\-281.6185\\169\\83.00781\\-284.5544\\169\\81.05469\\-285.8141\\169\\77.14844\\-288.4789\\169\\75.19531\\-289.3096\\169\\73.24219\\-290.5805\\169\\71.28906\\-291.4785\\169\\69.33594\\-292.7405\\169\\67.38281\\-293.5703\\169\\65.42969\\-294.6316\\169\\63.47656\\-295.2131\\169\\61.52344\\-296.1048\\169\\59.57031\\-296.8333\\169\\57.61719\\-297.4385\\169\\55.66406\\-298.439\\169\\53.71094\\-299.0279\\169\\49.80469\\-300.4731\\169\\45.89844\\-301.3354\\169\\43.94531\\-302.0067\\169\\41.99219\\-302.51\\169\\38.08594\\-303.0524\\169\\36.13281\\-303.4547\\169\\34.17969\\-304.0774\\169\\32.22656\\-304.4601\\169\\26.36719\\-305.2716\\169\\22.46094\\-306.0305\\169\\18.55469\\-306.39\\169\\12.69531\\-306.6979\\169\\6.835938\\-306.8838\\169\\0.9765625\\-306.9415\\169\\-2.929688\\-306.8791\\169\\-8.789063\\-306.6818\\169\\-14.64844\\-306.39\\169\\-18.55469\\-306.0731\\169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "234" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "211" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-305.8073\\171\\-24.41406\\-305.3627\\171\\-26.36719\\-305.0237\\171\\-30.27344\\-304.4804\\171\\-32.22656\\-304.099\\171\\-34.17969\\-303.4618\\171\\-36.13281\\-303.041\\171\\-40.03906\\-302.4354\\171\\-43.94531\\-301.2228\\171\\-47.85156\\-300.3213\\171\\-49.80469\\-299.4624\\171\\-53.71094\\-298.0768\\171\\-55.66406\\-297.1539\\171\\-57.61719\\-296.5981\\171\\-59.57031\\-295.6142\\171\\-61.52344\\-294.9784\\171\\-63.47656\\-294.2191\\171\\-67.53943\\-292.0547\\171\\-70.96041\\-290.1016\\171\\-71.28906\\-289.8387\\171\\-73.24219\\-288.9581\\171\\-75.19531\\-287.6869\\171\\-77.14844\\-286.6476\\171\\-81.05469\\-283.6358\\171\\-83.00781\\-282.4544\\171\\-84.96094\\-280.9758\\171\\-88.03923\\-278.3828\\171\\-88.86719\\-277.616\\171\\-92.77344\\-274.3913\\171\\-94.72656\\-272.7131\\171\\-97.00259\\-270.5703\\171\\-101.0322\\-266.6641\\171\\-102.8519\\-264.7109\\171\\-108.3984\\-258.3063\\171\\-110.3516\\-255.9135\\171\\-112.5194\\-252.9922\\171\\-115.29\\-249.0859\\171\\-116.6255\\-247.1328\\171\\-117.4855\\-245.1797\\171\\-118.7547\\-243.2266\\171\\-119.6709\\-241.2734\\171\\-120.8868\\-239.3203\\171\\-121.6942\\-237.3672\\171\\-122.7066\\-235.4141\\171\\-123.2337\\-233.4609\\171\\-123.9063\\-231.5078\\171\\-124.7218\\-229.5547\\171\\-125.1964\\-227.6016\\171\\-126.6473\\-223.6953\\171\\-127.6266\\-219.7891\\171\\-128.2747\\-217.8359\\171\\-128.6447\\-215.8828\\171\\-129.4936\\-210.0234\\171\\-130.3101\\-206.1172\\171\\-130.7465\\-202.2109\\171\\-131.1232\\-196.3516\\171\\-131.5402\\-188.5391\\171\\-131.6671\\-182.6797\\171\\-131.6683\\-180.7266\\171\\-131.5172\\-176.8203\\171\\-130.5481\\-163.1484\\171\\-130.213\\-161.1953\\171\\-129.739\\-159.2422\\171\\-129.0838\\-155.3359\\171\\-128.3518\\-151.4297\\171\\-127.6175\\-149.4766\\171\\-126.5191\\-145.5703\\171\\-125.6268\\-143.6172\\171\\-124.4596\\-139.7109\\171\\-123.4737\\-137.7578\\171\\-122.9565\\-135.8047\\171\\-122.0941\\-133.8516\\171\\-121.0455\\-131.8984\\171\\-119.873\\-129.9453\\171\\-118.8816\\-127.9922\\171\\-117.5781\\-126.0391\\171\\-116.7295\\-124.0859\\171\\-114.2578\\-120.4753\\171\\-112.5969\\-118.2266\\171\\-110.3516\\-115.4045\\171\\-107.6212\\-112.3672\\171\\-104.4922\\-109.254\\171\\-102.5391\\-107.6211\\171\\-100.5859\\-106.2949\\171\\-98.63281\\-105.2665\\171\\-96.67969\\-103.9173\\171\\-94.72656\\-103.042\\171\\-92.77344\\-102.0132\\171\\-88.86719\\-100.8087\\171\\-86.91406\\-100.0766\\171\\-83.00781\\-99.38295\\171\\-81.05469\\-98.86547\\171\\-79.10156\\-98.23056\\171\\-77.14844\\-97.87738\\171\\-73.24219\\-97.28791\\171\\-69.33594\\-96.4061\\171\\-67.38281\\-96.15515\\171\\-61.52344\\-95.57146\\171\\-57.61719\\-95.1398\\171\\-55.66406\\-94.82844\\171\\-51.75781\\-94.38895\\171\\-47.85156\\-94.14428\\171\\-41.99219\\-93.93087\\171\\-36.13281\\-93.84191\\171\\-28.32031\\-93.82434\\171\\-24.41406\\-93.86609\\171\\-20.50781\\-93.99447\\171\\-16.60156\\-94.37538\\171\\-14.73999\\-94.78906\\171\\-10.74219\\-95.8539\\171\\-8.789063\\-96.44725\\171\\-6.835938\\-97.45294\\171\\-4.882813\\-98.13979\\171\\-2.929688\\-99.1638\\171\\-0.9765625\\-99.64929\\171\\0.9765625\\-99.8922\\171\\2.929688\\-99.99532\\171\\4.882813\\-99.91903\\171\\6.835938\\-99.71756\\171\\8.789063\\-99.3606\\171\\12.69531\\-97.72991\\171\\16.60156\\-96.24469\\171\\18.55469\\-95.84558\\171\\22.46094\\-95.24983\\171\\26.36719\\-94.40266\\171\\30.27344\\-94.02882\\171\\41.99219\\-93.58307\\171\\43.94531\\-93.55209\\171\\53.71094\\-93.23885\\171\\57.61719\\-93.44019\\171\\61.52344\\-93.50507\\171\\65.42969\\-93.63277\\171\\71.28906\\-94.03361\\171\\73.24219\\-94.29082\\171\\75.19531\\-94.73438\\171\\77.14844\\-95.29037\\171\\81.05469\\-96.061\\171\\86.91406\\-98.29581\\171\\88.86719\\-99.31444\\171\\90.82031\\-99.9995\\171\\92.77344\\-101.1367\\171\\94.72656\\-101.9357\\171\\96.67969\\-103.3\\171\\100.5859\\-105.8745\\171\\104.4922\\-108.7743\\171\\108.557\\-112.3672\\171\\110.4899\\-114.3203\\171\\112.3047\\-116.3637\\171\\115.4413\\-120.1797\\171\\116.8555\\-122.1328\\171\\117.6658\\-124.0859\\171\\118.9047\\-126.0391\\171\\119.7962\\-127.9922\\171\\120.9284\\-129.9453\\171\\121.7206\\-131.8984\\171\\122.6854\\-133.8516\\171\\123.1682\\-135.8047\\171\\123.7538\\-137.7578\\171\\124.5961\\-139.7109\\171\\125.5101\\-143.6172\\171\\126.3021\\-145.5703\\171\\126.7608\\-147.5234\\171\\127.4505\\-151.4297\\171\\127.9297\\-153.4165\\171\\128.2935\\-155.3359\\171\\128.5121\\-157.2891\\171\\128.9525\\-163.1484\\171\\129.2677\\-169.0078\\171\\129.4011\\-172.9141\\171\\129.5157\\-178.7734\\171\\129.5183\\-182.6797\\171\\129.472\\-186.5859\\171\\129.1219\\-206.1172\\171\\128.7143\\-213.9297\\171\\128.3535\\-217.8359\\171\\128.0244\\-219.7891\\171\\127.5302\\-221.7422\\171\\126.7987\\-225.6484\\171\\126.3733\\-227.6016\\171\\125.5691\\-229.5547\\171\\124.5488\\-233.4609\\171\\123.5722\\-235.4141\\171\\123.029\\-237.3672\\171\\122.3424\\-239.3203\\171\\121.2748\\-241.2734\\171\\120.3545\\-243.2266\\171\\118.1641\\-246.6959\\171\\117.8032\\-247.1328\\171\\116.8729\\-249.0859\\171\\115.5286\\-251.0391\\171\\114.3392\\-252.9922\\171\\112.9338\\-254.9453\\171\\109.9121\\-258.8516\\171\\108.6972\\-260.8047\\171\\104.4922\\-265.5573\\171\\102.5391\\-267.8117\\171\\100.5859\\-269.6665\\171\\97.71767\\-272.5234\\171\\95.83144\\-274.4766\\171\\88.86719\\-280.5949\\171\\86.91406\\-281.8527\\171\\83.00781\\-284.8593\\171\\81.05469\\-286.2332\\171\\79.10156\\-287.4298\\171\\77.14844\\-288.7344\\171\\75.19531\\-289.5298\\171\\73.24219\\-290.8284\\171\\71.28906\\-291.807\\171\\69.33594\\-292.9779\\171\\65.42969\\-294.8267\\171\\63.47656\\-295.4169\\171\\61.52344\\-296.4201\\171\\59.57031\\-297.0023\\171\\55.66406\\-298.6554\\171\\53.71094\\-299.264\\171\\51.75781\\-300.1079\\171\\49.80469\\-300.6564\\171\\45.89844\\-301.578\\171\\43.94531\\-302.2715\\171\\41.99219\\-302.6582\\171\\40.03906\\-302.9011\\171\\38.08594\\-303.2481\\171\\34.17969\\-304.3228\\171\\28.32031\\-305.179\\171\\24.41406\\-306.0084\\171\\22.46094\\-306.2485\\171\\18.55469\\-306.5421\\171\\10.74219\\-306.9647\\171\\6.835938\\-307.1012\\171\\2.929688\\-307.1721\\171\\-2.929688\\-307.11\\171\\-8.789063\\-306.8859\\171\\-16.60156\\-306.4564\\171\\-20.50781\\-306.1425\\171" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "232" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "212" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-305.7787\\173\\-26.36719\\-305.3028\\173\\-28.32031\\-304.963\\173\\-32.22656\\-304.3905\\173\\-34.17969\\-303.9221\\173\\-36.13281\\-303.2852\\173\\-40.03906\\-302.6399\\173\\-41.99219\\-302.2039\\173\\-43.94531\\-301.4995\\173\\-47.85156\\-300.5623\\173\\-49.80469\\-299.8749\\173\\-51.75781\\-299.048\\173\\-53.71094\\-298.4345\\173\\-55.66406\\-297.4195\\173\\-57.61719\\-296.8113\\173\\-61.52344\\-295.1521\\173\\-63.47656\\-294.5125\\173\\-65.42969\\-293.3666\\173\\-67.38281\\-292.5309\\173\\-69.33594\\-291.2547\\173\\-71.56033\\-290.1016\\173\\-75.05267\\-288.1484\\173\\-77.14844\\-286.9216\\173\\-81.05469\\-283.9434\\173\\-83.00781\\-282.7317\\173\\-84.96094\\-281.209\\173\\-88.38264\\-278.3828\\173\\-88.86719\\-277.9161\\173\\-92.77344\\-274.812\\173\\-95.33435\\-272.5234\\173\\-101.381\\-266.6641\\173\\-103.2157\\-264.7109\\173\\-104.9045\\-262.7578\\173\\-106.7016\\-260.8047\\173\\-108.3984\\-258.7858\\173\\-112.3047\\-253.75\\173\\-114.2982\\-251.0391\\173\\-116.9067\\-247.1328\\173\\-117.7636\\-245.1797\\173\\-118.1641\\-244.6546\\173\\-120.1248\\-241.2734\\173\\-122.0783\\-237.3672\\173\\-122.9013\\-235.4141\\173\\-123.421\\-233.4609\\173\\-124.3234\\-231.5078\\173\\-125.4401\\-227.6016\\173\\-126.3148\\-225.6484\\173\\-127.3391\\-221.7422\\173\\-127.9968\\-219.7891\\173\\-128.4989\\-217.8359\\173\\-129.3815\\-211.9766\\173\\-130.2154\\-208.0703\\173\\-130.7109\\-204.1641\\173\\-131.2927\\-196.3516\\173\\-131.8123\\-188.5391\\173\\-131.9444\\-182.6797\\173\\-131.9167\\-180.7266\\173\\-131.7375\\-176.8203\\173\\-131.058\\-169.0078\\173\\-130.6299\\-163.1484\\173\\-130.3545\\-161.1953\\173\\-129.4691\\-157.2891\\173\\-128.8138\\-153.3828\\173\\-128.4241\\-151.4297\\173\\-127.0739\\-147.5234\\173\\-126.5659\\-145.5703\\173\\-125.6714\\-143.6172\\173\\-124.4894\\-139.7109\\173\\-123.4961\\-137.7578\\173\\-122.9685\\-135.8047\\173\\-122.1406\\-133.8516\\173\\-118.9248\\-127.9922\\173\\-117.6147\\-126.0391\\173\\-116.7756\\-124.0859\\173\\-114.2578\\-120.375\\173\\-112.6604\\-118.2266\\173\\-110.3516\\-115.335\\173\\-107.6827\\-112.3672\\173\\-104.4922\\-109.2278\\173\\-102.5391\\-107.6211\\173\\-100.5859\\-106.335\\173\\-98.63281\\-105.3117\\173\\-96.67969\\-103.9975\\173\\-94.72656\\-103.1359\\173\\-92.77344\\-102.0886\\173\\-88.86719\\-100.981\\173\\-86.91406\\-100.2076\\173\\-84.96094\\-99.79752\\173\\-83.00781\\-99.50636\\173\\-81.05469\\-99.11101\\173\\-79.10156\\-98.43623\\173\\-77.14844\\-98.01843\\173\\-71.28906\\-97.13657\\173\\-69.33594\\-96.66142\\173\\-67.38281\\-96.32366\\173\\-65.42969\\-96.09293\\173\\-57.61719\\-95.37125\\173\\-53.71094\\-94.93179\\173\\-51.75781\\-94.66037\\173\\-47.85156\\-94.32058\\173\\-41.99219\\-94.07495\\173\\-36.13281\\-93.98026\\173\\-24.41406\\-94.01392\\173\\-20.50781\\-94.19662\\173\\-18.55469\\-94.39706\\173\\-16.60156\\-94.70448\\173\\-10.74219\\-96.08174\\173\\-9.036847\\-96.74219\\173\\-4.882813\\-98.49303\\173\\-2.929688\\-99.43068\\173\\0.9765625\\-100.1307\\173\\2.929688\\-100.2787\\173\\4.882813\\-100.1602\\173\\6.835938\\-99.90697\\173\\8.789063\\-99.5535\\173\\10.74219\\-98.88605\\173\\12.69531\\-97.96576\\173\\14.64844\\-97.31842\\173\\16.60156\\-96.56654\\173\\18.55469\\-96.0574\\173\\24.41406\\-95.2193\\173\\28.32031\\-94.46354\\173\\32.22656\\-94.13164\\173\\41.99219\\-93.74316\\173\\53.71094\\-93.51343\\173\\55.66406\\-93.57859\\173\\63.47656\\-93.71894\\173\\69.33594\\-93.9895\\173\\71.28906\\-94.19156\\173\\73.24219\\-94.53588\\173\\77.14844\\-95.46234\\173\\81.05469\\-96.21586\\173\\83.00781\\-97.00028\\173\\84.96094\\-97.67197\\173\\86.91406\\-98.4529\\173\\88.86719\\-99.39466\\173\\90.82031\\-100.1008\\173\\92.77344\\-101.2357\\173\\94.72656\\-102.0445\\173\\98.63281\\-104.7952\\173\\100.5859\\-105.9366\\173\\104.4922\\-108.8672\\173\\106.4453\\-110.6319\\173\\108.4927\\-112.3672\\173\\110.4267\\-114.3203\\173\\112.3047\\-116.4095\\173\\115.4441\\-120.1797\\173\\116.89\\-122.1328\\173\\117.7308\\-124.0859\\173\\118.9616\\-126.0391\\173\\121.0054\\-129.9453\\173\\122.7607\\-133.8516\\173\\123.2311\\-135.8047\\173\\124.6955\\-139.7109\\173\\125.1281\\-141.6641\\173\\125.6946\\-143.6172\\173\\126.4793\\-145.5703\\173\\127.2583\\-149.4766\\173\\128.1924\\-153.3828\\173\\128.4629\\-155.3359\\173\\128.8272\\-159.2422\\173\\129.098\\-163.1484\\173\\129.5296\\-170.9609\\173\\129.7531\\-176.8203\\173\\129.7675\\-182.6797\\173\\129.71\\-186.5859\\173\\129.541\\-190.4922\\173\\129.555\\-192.4453\\173\\129.2465\\-206.1172\\173\\129.0551\\-210.0234\\173\\128.8097\\-213.9297\\173\\128.4768\\-217.8359\\173\\128.1906\\-219.7891\\173\\127.2879\\-223.6953\\173\\126.5228\\-227.6016\\173\\125.7556\\-229.5547\\173\\125.1267\\-231.5078\\173\\124.6491\\-233.4609\\173\\123.6884\\-235.4141\\173\\122.465\\-239.3203\\173\\121.3679\\-241.2734\\173\\120.4834\\-243.2266\\173\\119.1617\\-245.1797\\173\\117.9445\\-247.1328\\173\\116.945\\-249.0859\\173\\115.6315\\-251.0391\\173\\114.4968\\-252.9922\\173\\110.0757\\-258.8516\\173\\108.8625\\-260.8047\\173\\103.6794\\-266.6641\\173\\102.011\\-268.6172\\173\\100.5859\\-269.8912\\173\\97.94081\\-272.5234\\173\\96.08624\\-274.4766\\173\\92.77344\\-277.3448\\173\\90.82031\\-279.1734\\173\\88.86719\\-280.8891\\173\\84.96094\\-283.5493\\173\\84.14713\\-284.2422\\173\\81.05469\\-286.5821\\173\\79.10156\\-287.6735\\173\\77.14844\\-288.9234\\173\\75.19531\\-289.8174\\173\\74.84267\\-290.1016\\173\\71.28906\\-292.2055\\173\\67.80876\\-294.0078\\173\\67.38281\\-294.2918\\173\\63.47656\\-295.6767\\173\\61.52344\\-296.6445\\173\\59.57031\\-297.1859\\173\\57.61719\\-298.1846\\173\\53.71094\\-299.5329\\173\\51.75781\\-300.3555\\173\\47.85156\\-301.2485\\173\\43.94531\\-302.4651\\173\\40.03906\\-303.034\\173\\38.08594\\-303.4995\\173\\36.13281\\-304.1302\\173\\34.17969\\-304.4996\\173\\30.27344\\-305.0451\\173\\28.32031\\-305.4097\\173\\26.36719\\-305.9009\\173\\24.41406\\-306.2062\\173\\18.55469\\-306.6926\\173\\10.74219\\-307.1754\\173\\6.835938\\-307.3427\\173\\2.929688\\-307.441\\173\\-2.929688\\-307.3776\\173\\-8.789063\\-307.128\\173\\-14.64844\\-306.7787\\173\\-20.50781\\-306.3651\\173\\-22.46094\\-306.1425\\173" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "233" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "213" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.882813\\-307.6246\\175\\-8.789063\\-307.414\\175\\-14.64844\\-306.9991\\175\\-20.50781\\-306.5481\\175\\-24.41406\\-306.1135\\175\\-28.32031\\-305.2235\\175\\-34.17969\\-304.2817\\175\\-38.08594\\-303.1087\\175\\-41.99219\\-302.4651\\175\\-45.89844\\-301.2052\\175\\-49.80469\\-300.2358\\175\\-51.75781\\-299.3362\\175\\-53.71094\\-298.6922\\175\\-57.61719\\-297.0088\\175\\-59.57031\\-296.3583\\175\\-61.52344\\-295.3287\\175\\-63.47656\\-294.731\\175\\-65.42969\\-293.6643\\175\\-67.38281\\-292.7831\\175\\-69.33594\\-291.5326\\175\\-71.28906\\-290.6113\\175\\-73.24219\\-289.329\\175\\-75.19531\\-288.4472\\175\\-77.14844\\-287.1417\\175\\-79.10156\\-285.6472\\175\\-81.05469\\-284.3515\\175\\-83.00781\\-282.9465\\175\\-84.96094\\-281.4436\\175\\-92.77344\\-275.139\\175\\-94.72656\\-273.3772\\175\\-101.6576\\-266.6641\\175\\-106.4453\\-261.5064\\175\\-108.7708\\-258.8516\\175\\-111.611\\-254.9453\\175\\-112.3047\\-254.1595\\175\\-114.2578\\-251.5385\\175\\-114.7122\\-251.0391\\175\\-117.1091\\-247.1328\\175\\-119.2522\\-243.2266\\175\\-120.5627\\-241.2734\\175\\-121.3637\\-239.3203\\175\\-122.4623\\-237.3672\\175\\-123.7027\\-233.4609\\175\\-124.6202\\-231.5078\\175\\-125.1079\\-229.5547\\175\\-125.8089\\-227.6016\\175\\-126.6149\\-225.6484\\175\\-127.0919\\-223.6953\\175\\-128.319\\-219.7891\\175\\-128.6982\\-217.8359\\175\\-129.2717\\-213.9297\\175\\-129.6405\\-211.9766\\175\\-130.1122\\-210.0234\\175\\-130.4599\\-208.0703\\175\\-130.6792\\-206.1172\\175\\-131.0075\\-202.2109\\175\\-131.5499\\-196.3516\\175\\-132.0354\\-190.4922\\175\\-132.1825\\-186.5859\\175\\-132.2229\\-182.6797\\175\\-132.1508\\-178.7734\\175\\-131.8735\\-174.8672\\175\\-131.1868\\-169.0078\\175\\-130.7239\\-163.1484\\175\\-130.49\\-161.1953\\175\\-130.1251\\-159.2422\\175\\-129.6152\\-157.2891\\175\\-128.5073\\-151.4297\\175\\-127.1474\\-147.5234\\175\\-126.6402\\-145.5703\\175\\-125.7957\\-143.6172\\175\\-125.0893\\-141.6641\\175\\-124.5488\\-139.7109\\175\\-123.5619\\-137.7578\\175\\-122.9984\\-135.8047\\175\\-122.0703\\-133.6176\\175\\-120.1399\\-129.9453\\175\\-118.1641\\-126.6161\\175\\-117.7107\\-126.0391\\175\\-116.8512\\-124.0859\\175\\-114.2578\\-120.209\\175\\-110.3516\\-115.2188\\175\\-107.7542\\-112.3672\\175\\-104.4922\\-109.1934\\175\\-102.5391\\-107.6081\\175\\-100.5859\\-106.3781\\175\\-98.63281\\-105.3485\\175\\-96.67969\\-104.0603\\175\\-94.72656\\-103.2193\\175\\-92.77344\\-102.1739\\175\\-88.86719\\-101.1201\\175\\-86.91406\\-100.3663\\175\\-84.96094\\-99.8922\\175\\-81.05469\\-99.27155\\175\\-77.14844\\-98.16213\\175\\-71.28906\\-97.33149\\175\\-67.38281\\-96.53049\\175\\-65.42969\\-96.24242\\175\\-53.71094\\-95.20476\\175\\-47.85156\\-94.53588\\175\\-41.99219\\-94.25227\\175\\-36.13281\\-94.14428\\175\\-28.32031\\-94.17396\\175\\-24.41406\\-94.21347\\175\\-20.50781\\-94.45404\\175\\-18.55469\\-94.74969\\175\\-12.69531\\-95.8539\\175\\-10.74219\\-96.32808\\175\\-8.789063\\-97.23047\\175\\-6.835938\\-97.92606\\175\\-4.882813\\-98.93761\\175\\-2.929688\\-99.63259\\175\\0.9765625\\-100.4456\\175\\2.929688\\-100.6242\\175\\4.882813\\-100.4882\\175\\8.789063\\-99.76657\\175\\10.74219\\-99.15608\\175\\12.69531\\-98.21636\\175\\16.60156\\-97.0123\\175\\18.55469\\-96.34768\\175\\20.50781\\-95.99232\\175\\26.36719\\-95.25059\\175\\30.27344\\-94.58307\\175\\32.22656\\-94.39986\\175\\36.13281\\-94.21347\\175\\41.99219\\-93.88352\\175\\51.75781\\-93.70596\\175\\57.61719\\-93.73693\\175\\63.47656\\-93.83015\\175\\69.33594\\-94.11924\\175\\71.28906\\-94.38331\\175\\75.19531\\-95.25755\\175\\79.10156\\-95.91411\\175\\81.05469\\-96.42782\\175\\83.00781\\-97.21471\\175\\84.96094\\-97.84784\\175\\88.86719\\-99.49263\\175\\90.82031\\-100.2121\\175\\92.77344\\-101.3186\\175\\94.72656\\-102.14\\175\\98.63281\\-104.9104\\175\\100.5859\\-106.0069\\175\\103.8959\\-108.4609\\175\\108.4073\\-112.3672\\175\\110.3937\\-114.3203\\175\\112.3047\\-116.4546\\175\\115.4735\\-120.1797\\175\\116.9241\\-122.1328\\175\\117.8148\\-124.0859\\175\\118.1641\\-124.5417\\175\\120.1399\\-127.9922\\175\\122.0703\\-132.0277\\175\\122.8455\\-133.8516\\175\\123.3048\\-135.8047\\175\\124.1379\\-137.7578\\175\\124.8014\\-139.7109\\175\\125.2497\\-141.6641\\175\\126.6365\\-145.5703\\175\\127.469\\-149.4766\\175\\128.0105\\-151.4297\\175\\128.4026\\-153.3828\\175\\128.9818\\-159.2422\\175\\129.8125\\-170.9609\\175\\130.0692\\-176.8203\\175\\130.0974\\-178.7734\\175\\130.0125\\-186.5859\\175\\129.7969\\-190.4922\\175\\129.8119\\-192.4453\\175\\129.71\\-196.3516\\175\\129.5526\\-200.2578\\175\\129.4585\\-204.1641\\175\\129.2804\\-208.0703\\175\\128.9235\\-213.9297\\175\\128.5903\\-217.8359\\175\\128.3562\\-219.7891\\175\\127.9819\\-221.7422\\175\\127.4384\\-223.6953\\175\\126.6396\\-227.6016\\175\\125.9993\\-229.5547\\175\\125.2116\\-231.5078\\175\\124.7321\\-233.4609\\175\\123.8206\\-235.4141\\175\\122.565\\-239.3203\\175\\121.4644\\-241.2734\\175\\120.5901\\-243.2266\\175\\119.2367\\-245.1797\\175\\117.0258\\-249.0859\\175\\115.7294\\-251.0391\\175\\114.632\\-252.9922\\175\\112.3047\\-256.0668\\175\\111.5951\\-256.8984\\175\\109.0071\\-260.8047\\175\\107.3255\\-262.7578\\175\\105.5415\\-264.7109\\175\\103.8793\\-266.6641\\175\\102.5391\\-268.3688\\175\\100.5859\\-270.2173\\175\\98.26753\\-272.5234\\175\\96.67969\\-274.2568\\175\\94.17628\\-276.4297\\175\\92.77344\\-277.5627\\175\\90.82031\\-279.4044\\175\\88.86719\\-281.1367\\175\\86.91406\\-282.5947\\175\\84.96094\\-283.8154\\175\\84.48476\\-284.2422\\175\\81.05469\\-286.8289\\175\\75.35629\\-290.1016\\175\\73.24219\\-291.2292\\175\\71.28906\\-292.5242\\175\\69.33594\\-293.4158\\175\\67.38281\\-294.5559\\175\\65.42969\\-295.1686\\175\\63.47656\\-296.0462\\175\\61.52344\\-296.8141\\175\\59.57031\\-297.4289\\175\\57.61719\\-298.4648\\175\\55.66406\\-299.0551\\175\\53.6941\\-299.8672\\175\\51.75781\\-300.5357\\175\\47.85156\\-301.4532\\175\\45.89844\\-302.1529\\175\\43.94531\\-302.6145\\175\\40.03906\\-303.218\\175\\38.08594\\-303.84\\175\\36.13281\\-304.3507\\175\\30.27344\\-305.2533\\175\\26.36719\\-306.133\\175\\22.46094\\-306.5438\\175\\18.55469\\-306.8529\\175\\8.789063\\-307.537\\175\\2.929688\\-307.7484\\175\\-0.9765625\\-307.7484\\175" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "243" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "214" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-307.7636\\177\\-20.50781\\-306.7191\\177\\-24.41406\\-306.3396\\177\\-26.36719\\-306.0627\\177\\-30.27344\\-305.1418\\177\\-34.17969\\-304.5196\\177\\-36.13281\\-304.12\\177\\-38.08594\\-303.3922\\177\\-40.03906\\-302.9596\\177\\-41.99219\\-302.6582\\177\\-43.94531\\-302.2261\\177\\-45.89844\\-301.4646\\177\\-49.80469\\-300.4924\\177\\-53.71094\\-298.927\\177\\-55.66406\\-298.2523\\177\\-57.61719\\-297.2339\\177\\-59.57031\\-296.6338\\177\\-61.52344\\-295.5912\\177\\-63.47656\\-294.9237\\177\\-65.42969\\-294.0475\\177\\-71.28906\\-290.8636\\177\\-73.24219\\-289.5313\\177\\-75.19531\\-288.717\\177\\-81.05469\\-284.6729\\177\\-84.22636\\-282.2891\\177\\-89.21712\\-278.3828\\177\\-92.77344\\-275.3867\\177\\-94.72656\\-273.6386\\177\\-101.9304\\-266.6641\\177\\-105.5242\\-262.7578\\177\\-106.4453\\-261.8301\\177\\-109.0913\\-258.8516\\177\\-110.5763\\-256.8984\\177\\-111.9366\\-254.9453\\177\\-114.998\\-251.0391\\177\\-116.2848\\-249.0859\\177\\-117.3073\\-247.1328\\177\\-118.6336\\-245.1797\\177\\-119.5636\\-243.2266\\177\\-120.862\\-241.2734\\177\\-121.6916\\-239.3203\\177\\-122.7445\\-237.3672\\177\\-123.2879\\-235.4141\\177\\-124.1234\\-233.4609\\177\\-124.8455\\-231.5078\\177\\-125.3551\\-229.5547\\177\\-126.2695\\-227.6016\\177\\-127.364\\-223.6953\\177\\-128.0805\\-221.7422\\177\\-128.5549\\-219.7891\\177\\-129.5046\\-213.9297\\177\\-130.0135\\-211.9766\\177\\-130.4006\\-210.0234\\177\\-130.6676\\-208.0703\\177\\-131.2188\\-202.2109\\177\\-131.7368\\-198.3047\\177\\-132.1289\\-194.3984\\177\\-132.3932\\-188.5391\\177\\-132.4463\\-182.6797\\177\\-132.3853\\-178.7734\\177\\-132.1928\\-174.8672\\177\\-131.9975\\-172.9141\\177\\-131.4026\\-169.0078\\177\\-130.9781\\-165.1016\\177\\-130.6345\\-161.1953\\177\\-130.3236\\-159.2422\\177\\-129.3425\\-155.3359\\177\\-128.6139\\-151.4297\\177\\-128.039\\-149.4766\\177\\-127.2579\\-147.5234\\177\\-126.7338\\-145.5703\\177\\-125.179\\-141.6641\\177\\-124.6449\\-139.7109\\177\\-123.6792\\-137.7578\\177\\-122.3888\\-133.8516\\177\\-121.2658\\-131.8984\\177\\-120.3664\\-129.9453\\177\\-118.1641\\-126.395\\177\\-117.8733\\-126.0391\\177\\-116.9529\\-124.0859\\177\\-115.6237\\-122.1328\\177\\-114.4333\\-120.1797\\177\\-112.8956\\-118.2266\\177\\-111.2241\\-116.2734\\177\\-110.3516\\-115.0647\\177\\-107.8575\\-112.3672\\177\\-104.4922\\-109.1406\\177\\-102.5391\\-107.5807\\177\\-100.5859\\-106.3925\\177\\-98.63281\\-105.3845\\177\\-96.67969\\-104.1255\\177\\-94.72656\\-103.2817\\177\\-92.77344\\-102.2542\\177\\-90.82031\\-101.6835\\177\\-88.86719\\-101.2331\\177\\-86.91406\\-100.5177\\177\\-84.96094\\-99.97897\\177\\-81.05469\\-99.3904\\177\\-79.10156\\-98.93227\\177\\-77.14844\\-98.32832\\177\\-75.19531\\-97.98282\\177\\-69.33594\\-97.19711\\177\\-65.42969\\-96.41666\\177\\-63.47656\\-96.20592\\177\\-53.71094\\-95.40169\\177\\-49.80469\\-95.05475\\177\\-45.89844\\-94.64633\\177\\-41.99219\\-94.43584\\177\\-38.08594\\-94.34091\\177\\-34.17969\\-94.33377\\177\\-28.32031\\-94.37823\\177\\-24.41406\\-94.47062\\177\\-22.46094\\-94.58624\\177\\-20.50781\\-94.82876\\177\\-14.64844\\-95.71511\\177\\-12.69531\\-96.06696\\177\\-10.74219\\-96.67561\\177\\-8.789063\\-97.49805\\177\\-6.835938\\-98.16856\\177\\-4.882813\\-99.25969\\177\\0.9765625\\-100.8362\\177\\2.929688\\-100.9927\\177\\4.882813\\-100.8646\\177\\8.789063\\-99.97473\\177\\10.74219\\-99.39561\\177\\12.69531\\-98.54562\\177\\14.64844\\-97.82909\\177\\16.60156\\-97.34361\\177\\18.55469\\-96.73456\\177\\20.50781\\-96.23512\\177\\22.46094\\-95.9342\\177\\26.36719\\-95.53339\\177\\30.27344\\-95.06706\\177\\38.08594\\-94.28098\\177\\41.99219\\-94.0613\\177\\49.80469\\-93.87169\\177\\53.71094\\-93.84191\\177\\59.57031\\-93.86609\\177\\65.42969\\-94.01873\\177\\69.33594\\-94.3041\\177\\71.28906\\-94.6027\\177\\75.19531\\-95.42168\\177\\79.10156\\-96.04971\\177\\81.05469\\-96.66142\\177\\83.00781\\-97.41067\\177\\84.96094\\-97.99696\\177\\86.91406\\-98.88311\\177\\90.82031\\-100.3351\\177\\92.77344\\-101.4059\\177\\94.72656\\-102.2533\\177\\98.07832\\-104.5547\\177\\98.63281\\-105.0028\\177\\100.5859\\-106.0818\\177\\104.4922\\-108.9967\\177\\108.3567\\-112.3672\\177\\110.377\\-114.3203\\177\\114.2578\\-118.695\\177\\115.5086\\-120.1797\\177\\116.9577\\-122.1328\\177\\117.9181\\-124.0859\\177\\120.3166\\-127.9922\\177\\122.1549\\-131.8984\\177\\122.9377\\-133.8516\\177\\123.4037\\-135.8047\\177\\124.3234\\-137.7578\\177\\125.4025\\-141.6641\\177\\126.2374\\-143.6172\\177\\127.219\\-147.5234\\177\\128.2725\\-151.4297\\177\\128.5749\\-153.3828\\177\\129.1367\\-159.2422\\177\\129.4347\\-163.1484\\177\\129.9991\\-169.0078\\177\\130.1379\\-170.9609\\177\\130.331\\-176.8203\\177\\130.331\\-182.6797\\177\\130.2748\\-186.5859\\177\\130.1525\\-190.4922\\177\\130.0841\\-194.3984\\177\\129.8125\\-200.2578\\177\\129.6699\\-204.1641\\177\\129.0415\\-213.9297\\177\\128.5003\\-219.7891\\177\\128.2021\\-221.7422\\177\\127.6287\\-223.6953\\177\\126.7488\\-227.6016\\177\\126.2004\\-229.5547\\177\\125.2975\\-231.5078\\177\\124.8079\\-233.4609\\177\\123.2167\\-237.3672\\177\\122.665\\-239.3203\\177\\121.5728\\-241.2734\\177\\120.7031\\-243.2266\\177\\119.3305\\-245.1797\\177\\118.2726\\-247.1328\\177\\114.7702\\-252.9922\\177\\112.3047\\-256.2347\\177\\111.7188\\-256.8984\\177\\110.5453\\-258.8516\\177\\109.1551\\-260.8047\\177\\105.7414\\-264.7109\\177\\104.1297\\-266.6641\\177\\102.6476\\-268.6172\\177\\100.5859\\-270.5936\\177\\98.67126\\-272.5234\\177\\96.67969\\-274.6489\\177\\92.77344\\-277.8772\\177\\90.82031\\-279.6737\\177\\88.86719\\-281.3575\\177\\86.91406\\-282.875\\177\\84.96094\\-284.1519\\177\\81.05469\\-287.0413\\177\\79.10156\\-288.2823\\177\\77.14844\\-289.2601\\177\\75.19531\\-290.5227\\177\\73.24219\\-291.4605\\177\\71.28906\\-292.7842\\177\\69.33594\\-293.71\\177\\67.38281\\-294.7613\\177\\65.42969\\-295.3685\\177\\63.47656\\-296.3795\\177\\61.52344\\-297.0015\\177\\59.57031\\-297.7873\\177\\57.61719\\-298.6859\\177\\55.66406\\-299.2965\\177\\53.71094\\-300.1794\\177\\49.80469\\-301.1428\\177\\47.85156\\-301.705\\177\\45.89844\\-302.37\\177\\43.94531\\-302.7411\\177\\41.99219\\-303.0022\\177\\40.03906\\-303.4661\\177\\38.08594\\-304.1404\\177\\36.13281\\-304.5182\\177\\32.22656\\-305.0953\\177\\28.32031\\-306.0084\\177\\26.36719\\-306.2948\\177\\22.46094\\-306.6823\\177\\12.69531\\-307.5231\\177\\10.74219\\-307.7184\\177\\6.835938\\-307.9274\\177\\0.9765625\\-308.0416\\177\\-4.882813\\-307.9557\\177" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "244" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "215" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-12.69531\\-307.7484\\179\\-20.50781\\-306.9019\\179\\-26.36719\\-306.3059\\179\\-28.32031\\-305.9971\\179\\-30.27344\\-305.4739\\179\\-32.22656\\-305.0484\\179\\-36.13281\\-304.4158\\179\\-40.03906\\-303.1851\\179\\-43.94531\\-302.4898\\179\\-47.85156\\-301.163\\179\\-49.80469\\-300.7282\\179\\-51.75781\\-300.1472\\179\\-53.71094\\-299.2029\\179\\-55.66406\\-298.5669\\179\\-57.61719\\-297.5546\\179\\-59.57031\\-296.8492\\179\\-63.47656\\-295.1072\\179\\-65.42969\\-294.3998\\179\\-67.38281\\-293.2614\\179\\-69.33594\\-292.3607\\179\\-72.88954\\-290.1016\\179\\-73.24219\\-289.8152\\179\\-75.19531\\-288.926\\179\\-77.14844\\-287.6164\\179\\-79.10156\\-286.4247\\179\\-82.00097\\-284.2422\\179\\-83.00781\\-283.3988\\179\\-86.91406\\-280.6139\\179\\-89.59029\\-278.3828\\179\\-94.72656\\-273.908\\179\\-96.2021\\-272.5234\\179\\-98.63281\\-270.1077\\179\\-102.2611\\-266.6641\\179\\-103.9931\\-264.7109\\179\\-107.666\\-260.8047\\179\\-109.3686\\-258.8516\\179\\-112.4148\\-254.9453\\179\\-115.2649\\-251.0391\\179\\-116.6346\\-249.0859\\179\\-117.5626\\-247.1328\\179\\-118.9242\\-245.1797\\179\\-121.1379\\-241.2734\\179\\-122.1401\\-239.3203\\179\\-122.9741\\-237.3672\\179\\-123.5453\\-235.4141\\179\\-124.5021\\-233.4609\\179\\-125.0647\\-231.5078\\179\\-125.7289\\-229.5547\\179\\-126.5855\\-227.6016\\179\\-127.1042\\-225.6484\\179\\-128.4056\\-221.7422\\179\\-129.3945\\-215.8828\\179\\-130.3443\\-211.9766\\179\\-130.6345\\-210.0234\\179\\-131.2476\\-204.1641\\179\\-131.9167\\-200.2578\\179\\-132.172\\-198.3047\\179\\-132.4348\\-194.3984\\179\\-132.6082\\-188.5391\\179\\-132.6201\\-180.7266\\179\\-132.4496\\-174.8672\\179\\-132.1178\\-170.9609\\179\\-131.7368\\-169.0078\\179\\-131.1335\\-165.1016\\179\\-130.7527\\-161.1953\\179\\-130.494\\-159.2422\\179\\-130.0841\\-157.2891\\179\\-129.5046\\-155.3359\\179\\-128.726\\-151.4297\\179\\-128.2286\\-149.4766\\179\\-127.4231\\-147.5234\\179\\-126.2374\\-143.6172\\179\\-125.3045\\-141.6641\\179\\-124.7672\\-139.7109\\179\\-123.8632\\-137.7578\\179\\-123.1439\\-135.8047\\179\\-122.5318\\-133.8516\\179\\-121.4095\\-131.8984\\179\\-120.5665\\-129.9453\\179\\-119.246\\-127.9922\\179\\-117.0631\\-124.0859\\179\\-115.7964\\-122.1328\\179\\-114.6356\\-120.1797\\179\\-111.3641\\-116.2734\\179\\-110.3516\\-114.9095\\179\\-107.9685\\-112.3672\\179\\-104.4922\\-109.083\\179\\-102.5391\\-107.5541\\179\\-100.5859\\-106.3781\\179\\-98.63281\\-105.3845\\179\\-96.67969\\-104.1603\\179\\-94.72656\\-103.3268\\179\\-92.77344\\-102.3254\\179\\-90.82031\\-101.7354\\179\\-88.86719\\-101.2974\\179\\-84.96094\\-100.046\\179\\-81.05469\\-99.47767\\179\\-79.10156\\-99.08727\\179\\-77.14844\\-98.49587\\179\\-75.19531\\-98.10297\\179\\-69.33594\\-97.36919\\179\\-65.42969\\-96.63368\\179\\-61.52344\\-96.14418\\179\\-49.80469\\-95.27734\\179\\-45.89844\\-94.9329\\179\\-41.99219\\-94.65936\\179\\-38.08594\\-94.53774\\179\\-32.22656\\-94.56481\\179\\-28.32031\\-94.61761\\179\\-24.41406\\-94.79707\\179\\-22.46094\\-94.96052\\179\\-16.60156\\-95.63801\\179\\-12.69531\\-96.30611\\179\\-10.74219\\-97.08099\\179\\-8.789063\\-97.71875\\179\\-6.835938\\-98.45795\\179\\-4.882813\\-99.47305\\179\\-2.929688\\-99.98288\\179\\-0.9494357\\-100.6484\\179\\0.9765625\\-101.1266\\179\\2.929688\\-101.2548\\179\\4.882813\\-101.16\\179\\6.835938\\-100.8239\\179\\10.74219\\-99.65974\\179\\12.69531\\-98.95824\\179\\14.64844\\-98.10822\\179\\18.55469\\-97.13932\\179\\20.50781\\-96.56268\\179\\22.46094\\-96.16737\\179\\24.41406\\-95.92936\\179\\28.32031\\-95.57149\\179\\34.17969\\-95.10522\\179\\38.08594\\-94.53399\\179\\40.03906\\-94.35883\\179\\45.89844\\-94.1235\\179\\49.80469\\-94.0066\\179\\59.57031\\-93.95115\\179\\65.42969\\-94.14012\\179\\69.33594\\-94.52338\\179\\73.24219\\-95.24435\\179\\77.14844\\-95.82666\\179\\79.10156\\-96.22012\\179\\83.00781\\-97.55965\\179\\84.96094\\-98.11291\\179\\86.91406\\-99.03957\\179\\88.86719\\-99.68372\\179\\90.82031\\-100.4562\\179\\92.77344\\-101.4776\\179\\94.72656\\-102.3334\\179\\96.67969\\-103.6188\\179\\98.63281\\-105.0594\\179\\100.5859\\-106.1348\\179\\102.5391\\-107.5227\\179\\104.4922\\-109.0161\\179\\108.3246\\-112.3672\\179\\110.377\\-114.3203\\179\\114.2578\\-118.6508\\179\\115.5354\\-120.1797\\179\\116.9859\\-122.1328\\179\\119.1782\\-126.0391\\179\\120.4533\\-127.9922\\179\\121.2792\\-129.9453\\179\\122.309\\-131.8984\\179\\123.0167\\-133.8516\\179\\123.5188\\-135.8047\\179\\124.4796\\-137.7578\\179\\125.5691\\-141.6641\\179\\126.4531\\-143.6172\\179\\127.4116\\-147.5234\\179\\128.039\\-149.4766\\179\\128.4629\\-151.4297\\179\\128.7302\\-153.3828\\179\\129.1246\\-157.2891\\179\\129.4691\\-161.1953\\179\\129.9537\\-165.1016\\179\\130.1379\\-167.0547\\179\\130.4509\\-172.9141\\179\\130.54\\-178.7734\\179\\130.4814\\-186.5859\\179\\130.3777\\-192.4453\\179\\130.213\\-198.3047\\179\\129.9531\\-204.1641\\179\\129.6048\\-208.0703\\179\\129.1565\\-213.9297\\179\\128.6207\\-219.7891\\179\\128.3464\\-221.7422\\179\\127.2916\\-225.6484\\179\\126.3436\\-229.5547\\179\\125.3976\\-231.5078\\179\\124.8657\\-233.4609\\179\\124.1379\\-235.4141\\179\\123.2879\\-237.3672\\179\\122.7521\\-239.3203\\179\\121.6758\\-241.2734\\179\\120.8082\\-243.2266\\179\\119.4269\\-245.1797\\179\\118.4115\\-247.1328\\179\\115.9948\\-251.0391\\179\\114.8952\\-252.9922\\179\\112.3047\\-256.4338\\179\\111.8841\\-256.8984\\179\\110.7465\\-258.8516\\179\\109.2926\\-260.8047\\179\\105.9502\\-264.7109\\179\\102.9251\\-268.6172\\179\\100.5859\\-270.9284\\179\\96.67969\\-274.9462\\179\\94.72656\\-276.672\\179\\92.77344\\-278.2628\\179\\90.45516\\-280.3359\\179\\87.97269\\-282.2891\\179\\84.96094\\-284.5079\\179\\82.57473\\-286.1953\\179\\79.62536\\-288.1484\\179\\79.10156\\-288.563\\179\\77.14844\\-289.457\\179\\75.19531\\-290.7508\\179\\73.24219\\-291.7516\\179\\71.28906\\-292.9924\\179\\69.33594\\-294.107\\179\\67.38281\\-294.9427\\179\\65.42969\\-295.6117\\179\\63.47656\\-296.614\\179\\61.52344\\-297.2085\\179\\59.57031\\-298.1997\\179\\55.66406\\-299.5891\\179\\53.71094\\-300.4037\\179\\49.80469\\-301.3288\\179\\47.85156\\-302.0216\\179\\45.89844\\-302.5497\\179\\41.99219\\-303.1757\\179\\38.08594\\-304.3539\\179\\34.17969\\-304.9423\\179\\32.22656\\-305.2986\\179\\30.27344\\-305.8213\\179\\28.32031\\-306.2002\\179\\26.36719\\-306.4278\\179\\14.64844\\-307.6105\\179\\10.74219\\-307.9796\\179\\4.882813\\-308.1906\\179\\0.9765625\\-308.253\\179\\-2.929688\\-308.2222\\179\\-6.835938\\-308.1319\\179\\-10.74219\\-307.9149\\179" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "248" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "216" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-14.64844\\-307.8619\\181\\-20.50781\\-307.1261\\181\\-28.32031\\-306.2628\\181\\-30.27344\\-305.9009\\181\\-32.22656\\-305.35\\181\\-34.17969\\-304.9402\\181\\-38.08594\\-304.2354\\181\\-40.03906\\-303.524\\181\\-41.99219\\-303.0001\\181\\-43.94531\\-302.6826\\181\\-45.89844\\-302.2179\\181\\-47.85156\\-301.4506\\181\\-51.75781\\-300.447\\181\\-53.71094\\-299.5528\\181\\-57.61719\\-298.0361\\181\\-59.57031\\-297.0527\\181\\-61.52344\\-296.3898\\181\\-63.47656\\-295.312\\181\\-65.42969\\-294.6693\\181\\-67.38281\\-293.5479\\181\\-69.33594\\-292.6587\\181\\-71.28906\\-291.3022\\181\\-76.86492\\-288.1484\\181\\-79.10156\\-286.745\\181\\-79.72569\\-286.1953\\181\\-82.37457\\-284.2422\\181\\-83.00781\\-283.6714\\181\\-86.91406\\-280.9503\\181\\-89.90077\\-278.3828\\181\\-92.77344\\-275.8314\\181\\-94.46101\\-274.4766\\181\\-96.60645\\-272.5234\\181\\-98.63281\\-270.4627\\181\\-100.5859\\-268.768\\181\\-102.7202\\-266.6641\\181\\-104.3691\\-264.7109\\181\\-108.3984\\-260.3571\\181\\-112.3047\\-255.5829\\181\\-114.2578\\-252.9824\\181\\-116.9159\\-249.0859\\181\\-117.9445\\-247.1328\\181\\-119.179\\-245.1797\\181\\-120.5246\\-243.2266\\181\\-121.4293\\-241.2734\\181\\-122.542\\-239.3203\\181\\-123.1873\\-237.3672\\181\\-124.7836\\-233.4609\\181\\-125.3275\\-231.5078\\181\\-126.2489\\-229.5547\\181\\-127.402\\-225.6484\\181\\-128.1738\\-223.6953\\181\\-128.6563\\-221.7422\\181\\-129.3072\\-217.8359\\181\\-129.7511\\-215.8828\\181\\-130.2994\\-213.9297\\181\\-130.6077\\-211.9766\\181\\-131.0379\\-208.0703\\181\\-131.6246\\-204.1641\\181\\-132.0476\\-202.2109\\181\\-132.3184\\-200.2578\\181\\-132.4888\\-198.3047\\181\\-132.6695\\-194.3984\\181\\-132.847\\-186.5859\\181\\-132.8273\\-180.7266\\181\\-132.7295\\-176.8203\\181\\-132.5504\\-172.9141\\181\\-132.4088\\-170.9609\\181\\-132.1399\\-169.0078\\181\\-131.37\\-165.1016\\181\\-131.0852\\-163.1484\\181\\-130.6417\\-159.2422\\181\\-130.3101\\-157.2891\\181\\-129.2591\\-153.3828\\181\\-128.4395\\-149.4766\\181\\-127.6615\\-147.5234\\181\\-126.4531\\-143.6172\\181\\-125.4945\\-141.6641\\181\\-124.9007\\-139.7109\\181\\-124.1521\\-137.7578\\181\\-123.241\\-135.8047\\181\\-122.6894\\-133.8516\\181\\-121.5978\\-131.8984\\181\\-120.7406\\-129.9453\\181\\-119.4171\\-127.9922\\181\\-118.3803\\-126.0391\\181\\-116.2109\\-122.3582\\181\\-114.8358\\-120.1797\\181\\-114.2578\\-119.555\\181\\-110.3516\\-114.7424\\181\\-108.1139\\-112.3672\\181\\-104.4922\\-109.0238\\181\\-102.5391\\-107.5288\\181\\-100.5859\\-106.3501\\181\\-98.63281\\-105.3958\\181\\-96.67969\\-104.183\\181\\-94.72656\\-103.3636\\181\\-92.77344\\-102.3853\\181\\-90.82031\\-101.7819\\181\\-88.86719\\-101.3389\\181\\-84.96094\\-100.1176\\181\\-83.00781\\-99.77348\\181\\-81.05469\\-99.54239\\181\\-79.10156\\-99.21159\\181\\-75.19531\\-98.22447\\181\\-73.24219\\-97.95056\\181\\-67.38281\\-97.24526\\181\\-63.47656\\-96.53049\\181\\-59.57031\\-96.10387\\181\\-45.89844\\-95.18918\\181\\-41.99219\\-94.94682\\181\\-38.08594\\-94.82813\\181\\-32.22656\\-94.84332\\181\\-28.32031\\-94.9329\\181\\-24.41406\\-95.12843\\181\\-18.55469\\-95.63015\\181\\-14.64844\\-96.13818\\181\\-12.69531\\-96.64745\\181\\-10.74219\\-97.38377\\181\\-8.789063\\-97.93172\\181\\-6.835938\\-98.84027\\181\\-4.882813\\-99.63721\\181\\-2.929688\\-100.1837\\181\\-0.9765625\\-100.9572\\181\\0.9765625\\-101.3396\\181\\2.929688\\-101.448\\181\\4.882813\\-101.3886\\181\\6.835938\\-101.1401\\181\\8.789063\\-100.487\\181\\12.69531\\-99.30971\\181\\14.64844\\-98.42478\\181\\16.60156\\-97.86523\\181\\22.46094\\-96.48773\\181\\26.36719\\-95.93898\\181\\32.22656\\-95.55055\\181\\36.13281\\-95.17562\\181\\40.03906\\-94.70243\\181\\43.94531\\-94.41936\\181\\47.85156\\-94.21726\\181\\57.61719\\-94.05355\\181\\59.57031\\-94.05355\\181\\63.47656\\-94.16127\\181\\67.38281\\-94.45885\\181\\69.33594\\-94.73481\\181\\73.24219\\-95.39242\\181\\77.14844\\-95.95536\\181\\79.10156\\-96.38412\\181\\81.05469\\-97.12376\\181\\84.96094\\-98.24696\\181\\86.91406\\-99.16698\\181\\88.86719\\-99.78883\\181\\90.82031\\-100.5919\\181\\94.72656\\-102.4105\\181\\96.67969\\-103.6537\\181\\98.63281\\-105.1044\\181\\100.5859\\-106.1708\\181\\102.5391\\-107.5354\\181\\104.4922\\-109.0482\\181\\108.3405\\-112.3672\\181\\110.3516\\-114.2598\\181\\114.2578\\-118.5928\\181\\115.5802\\-120.1797\\181\\117.0185\\-122.1328\\181\\119.262\\-126.0391\\181\\120.5665\\-127.9922\\181\\121.3793\\-129.9453\\181\\122.4459\\-131.8984\\181\\123.6651\\-135.8047\\181\\124.6166\\-137.7578\\181\\125.1248\\-139.7109\\181\\125.7957\\-141.6641\\181\\126.6151\\-143.6172\\181\\127.0812\\-145.5703\\181\\128.2831\\-149.4766\\181\\128.8775\\-153.3828\\181\\129.5046\\-159.2422\\181\\130.0418\\-163.1484\\181\\130.3875\\-167.0547\\181\\130.5603\\-170.9609\\181\\130.6676\\-176.8203\\181\\130.6745\\-182.6797\\181\\130.5958\\-190.4922\\181\\130.4289\\-198.3047\\181\\130.2857\\-202.2109\\181\\130.0556\\-206.1172\\181\\129.4585\\-211.9766\\181\\128.7369\\-219.7891\\181\\128.4801\\-221.7422\\181\\128.0527\\-223.6953\\181\\127.4235\\-225.6484\\181\\126.459\\-229.5547\\181\\125.5006\\-231.5078\\181\\124.2872\\-235.4141\\181\\123.3788\\-237.3672\\181\\122.8285\\-239.3203\\181\\121.814\\-241.2734\\181\\120.8995\\-243.2266\\181\\119.5431\\-245.1797\\181\\118.551\\-247.1328\\181\\117.2668\\-249.0859\\181\\115.0264\\-252.9922\\181\\112.1094\\-256.8984\\181\\110.9106\\-258.8516\\181\\108.3984\\-262.1475\\181\\106.2124\\-264.7109\\181\\104.7823\\-266.6641\\181\\103.1599\\-268.6172\\181\\101.2968\\-270.5703\\181\\100.5859\\-271.1674\\181\\98.63281\\-273.2509\\181\\95.33039\\-276.4297\\181\\93.04926\\-278.3828\\181\\90.82031\\-280.3944\\181\\86.91406\\-283.2478\\181\\84.96094\\-284.7731\\181\\82.97937\\-286.1953\\181\\81.05469\\-287.419\\181\\79.10156\\-288.7799\\181\\77.14844\\-289.6953\\181\\76.64696\\-290.1016\\181\\73.37182\\-292.0547\\181\\71.28906\\-293.2093\\181\\69.33594\\-294.4321\\181\\67.38281\\-295.111\\181\\63.47656\\-296.8065\\181\\61.52344\\-297.4638\\181\\59.57031\\-298.4828\\181\\57.61719\\-299.0849\\181\\55.66406\\-299.9338\\181\\53.71094\\-300.5895\\181\\51.75781\\-301.0235\\181\\49.80469\\-301.5652\\181\\47.85156\\-302.2818\\181\\45.89844\\-302.6826\\181\\43.94531\\-302.9734\\181\\41.99219\\-303.3867\\181\\40.03906\\-304.099\\181\\38.08594\\-304.5059\\181\\34.17969\\-305.1066\\181\\30.27344\\-306.0521\\181\\28.32031\\-306.3362\\181\\20.50781\\-307.1946\\181\\16.60156\\-307.6875\\181\\12.69531\\-308.0501\\181\\6.835938\\-308.312\\181\\0.9765625\\-308.406\\181\\-2.929688\\-308.3983\\181\\-6.835938\\-308.312\\181\\-10.74219\\-308.1581\\181" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "247" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "217" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.60156\\-307.9292\\183\\-20.50781\\-307.3937\\183\\-30.27344\\-306.1974\\183\\-32.22656\\-305.7641\\183\\-34.17969\\-305.203\\183\\-38.08594\\-304.497\\183\\-40.03906\\-303.9851\\183\\-41.99219\\-303.2447\\183\\-45.89844\\-302.494\\183\\-49.80469\\-301.1505\\183\\-51.75781\\-300.6683\\183\\-53.71094\\-300.0191\\183\\-55.66406\\-299.0826\\183\\-57.61719\\-298.4228\\183\\-59.57031\\-297.309\\183\\-61.52344\\-296.6519\\183\\-63.47656\\-295.5859\\183\\-65.42969\\-294.8752\\183\\-69.33594\\-292.8848\\183\\-71.28906\\-291.5664\\183\\-73.24219\\-290.5547\\183\\-75.19531\\-289.262\\183\\-77.14844\\-288.2981\\183\\-79.10156\\-286.9992\\183\\-83.00781\\-283.9864\\183\\-84.96094\\-282.684\\183\\-86.91406\\-281.2117\\183\\-88.86719\\-279.5585\\183\\-90.82031\\-277.7526\\183\\-92.77344\\-276.1217\\183\\-94.72656\\-274.6978\\183\\-96.67969\\-272.8738\\183\\-98.961\\-270.5703\\183\\-100.5859\\-269.1543\\183\\-103.1081\\-266.6641\\183\\-104.4922\\-265.0609\\183\\-108.4699\\-260.8047\\183\\-109.8737\\-258.8516\\183\\-112.3047\\-255.9673\\183\\-114.6782\\-252.9922\\183\\-118.4346\\-247.1328\\183\\-119.4761\\-245.1797\\183\\-120.8511\\-243.2266\\183\\-121.7863\\-241.2734\\183\\-122.8381\\-239.3203\\183\\-123.427\\-237.3672\\183\\-124.4154\\-235.4141\\183\\-125.7045\\-231.5078\\183\\-126.6071\\-229.5547\\183\\-127.1517\\-227.6016\\183\\-128.5009\\-223.6953\\183\\-129.213\\-219.7891\\183\\-129.6535\\-217.8359\\183\\-130.2178\\-215.8828\\183\\-130.5958\\-213.9297\\183\\-131.3382\\-208.0703\\183\\-132.1615\\-204.1641\\183\\-132.4273\\-202.2109\\183\\-132.7431\\-198.3047\\183\\-132.9283\\-194.3984\\183\\-133.0686\\-188.5391\\183\\-133.0862\\-182.6797\\183\\-132.9542\\-176.8203\\183\\-132.63\\-170.9609\\183\\-132.172\\-167.0547\\183\\-131.2982\\-163.1484\\183\\-130.5065\\-157.2891\\183\\-130.0278\\-155.3359\\183\\-129.4316\\-153.3828\\183\\-128.6139\\-149.4766\\183\\-128.0117\\-147.5234\\183\\-127.2015\\-145.5703\\183\\-126.6506\\-143.6172\\183\\-125.7668\\-141.6641\\183\\-125.038\\-139.7109\\183\\-124.4154\\-137.7578\\183\\-123.3871\\-135.8047\\183\\-122.8503\\-133.8516\\183\\-120.923\\-129.9453\\183\\-119.665\\-127.9922\\183\\-118.6586\\-126.0391\\183\\-117.3279\\-124.0859\\183\\-116.3618\\-122.1328\\183\\-115.0076\\-120.1797\\183\\-110.3516\\-114.5383\\183\\-108.2601\\-112.3672\\183\\-104.4922\\-108.9595\\183\\-102.5391\\-107.5096\\183\\-100.5859\\-106.3081\\183\\-98.63281\\-105.3893\\183\\-96.67969\\-104.1728\\183\\-94.72656\\-103.3905\\183\\-92.77344\\-102.4376\\183\\-90.82031\\-101.8168\\183\\-86.91406\\-100.8497\\183\\-84.96094\\-100.1941\\183\\-83.00781\\-99.82882\\183\\-79.10156\\-99.31302\\183\\-77.14844\\-98.89208\\183\\-75.19531\\-98.36979\\183\\-73.24219\\-98.04256\\183\\-67.38281\\-97.39141\\183\\-65.42969\\-97.1084\\183\\-61.52344\\-96.43822\\183\\-59.57031\\-96.2225\\183\\-55.66406\\-95.94939\\183\\-47.85156\\-95.47324\\183\\-41.99219\\-95.19989\\183\\-38.08594\\-95.11459\\183\\-32.22656\\-95.10296\\183\\-26.36719\\-95.27411\\183\\-22.46094\\-95.51266\\183\\-18.55469\\-95.82465\\183\\-16.60156\\-96.05001\\183\\-14.64844\\-96.38306\\183\\-12.69531\\-97.07645\\183\\-8.789063\\-98.15905\\183\\-6.835938\\-99.17376\\183\\-2.929688\\-100.4606\\183\\-0.9765625\\-101.1998\\183\\0.9765625\\-101.5172\\183\\2.929688\\-101.6191\\183\\4.882813\\-101.5833\\183\\6.835938\\-101.373\\183\\8.789063\\-100.8407\\183\\10.74219\\-100.069\\183\\12.69531\\-99.5437\\183\\16.60156\\-98.11389\\183\\18.55469\\-97.64063\\183\\20.50781\\-97.28882\\183\\24.41406\\-96.4777\\183\\26.36719\\-96.18677\\183\\30.27344\\-95.90126\\183\\41.99219\\-94.94928\\183\\43.94531\\-94.70313\\183\\47.85156\\-94.42457\\183\\53.71094\\-94.23934\\183\\57.61719\\-94.17871\\183\\61.52344\\-94.22266\\183\\65.42969\\-94.43331\\183\\67.38281\\-94.61629\\183\\71.28906\\-95.27411\\183\\77.14844\\-96.08543\\183\\79.10156\\-96.57703\\183\\81.05469\\-97.29441\\183\\83.00781\\-97.7765\\183\\84.96094\\-98.38932\\183\\86.91406\\-99.28125\\183\\88.86719\\-99.86127\\183\\90.69653\\-100.6484\\183\\94.72656\\-102.5202\\183\\96.67969\\-103.6937\\183\\98.63281\\-105.1532\\183\\100.5859\\-106.2177\\183\\102.5391\\-107.5482\\183\\104.4922\\-109.0664\\183\\108.34\\-112.3672\\183\\110.3516\\-114.2109\\183\\114.2578\\-118.5354\\183\\116.2109\\-120.9165\\183\\118.3025\\-124.0859\\183\\119.3326\\-126.0391\\183\\120.6727\\-127.9922\\183\\121.4844\\-129.9453\\183\\122.575\\-131.8984\\183\\123.1439\\-133.8516\\183\\123.848\\-135.8047\\183\\124.7403\\-137.7578\\183\\125.2484\\-139.7109\\183\\126.0851\\-141.6641\\183\\126.7588\\-143.6172\\183\\127.2427\\-145.5703\\183\\127.9373\\-147.5234\\183\\128.4716\\-149.4766\\183\\129.0128\\-153.3828\\183\\129.4585\\-157.2891\\183\\130.099\\-161.1953\\183\\130.3236\\-163.1484\\183\\130.5804\\-167.0547\\183\\130.7043\\-170.9609\\183\\130.7932\\-176.8203\\183\\130.799\\-182.6797\\183\\130.7527\\-188.5391\\183\\130.6417\\-196.3516\\183\\130.4814\\-202.2109\\183\\130.2748\\-206.1172\\183\\130.1104\\-208.0703\\183\\129.4244\\-213.9297\\183\\128.8491\\-219.7891\\183\\128.2508\\-223.6953\\183\\127.5823\\-225.6484\\183\\126.5669\\-229.5547\\183\\125.6378\\-231.5078\\183\\124.4363\\-235.4141\\183\\123.4663\\-237.3672\\183\\122.9082\\-239.3203\\183\\122.0703\\-241.1798\\183\\120.9834\\-243.2266\\183\\119.6699\\-245.1797\\183\\118.686\\-247.1328\\183\\117.3816\\-249.0859\\183\\116.4032\\-251.0391\\183\\115.1482\\-252.9922\\183\\113.7174\\-254.9453\\183\\111.0647\\-258.8516\\183\\108.3984\\-262.4622\\183\\104.4922\\-267.3177\\183\\101.5562\\-270.5703\\183\\100.5859\\-271.439\\183\\98.63281\\-273.5255\\183\\95.62296\\-276.4297\\183\\94.72656\\-277.1321\\183\\90.82031\\-280.7161\\183\\88.65327\\-282.2891\\183\\86.91406\\-283.4304\\183\\83.00781\\-286.5026\\183\\81.05469\\-287.6375\\183\\79.10156\\-288.9757\\183\\77.14844\\-290.0121\\183\\75.19531\\-291.1763\\183\\73.24219\\-292.5272\\183\\71.28906\\-293.4723\\183\\69.33594\\-294.6651\\183\\67.38281\\-295.2786\\183\\65.42969\\-296.3092\\183\\63.47656\\-296.9807\\183\\59.57031\\-298.6922\\183\\57.61719\\-299.3134\\183\\55.66406\\-300.21\\183\\53.71094\\-300.7524\\183\\51.75781\\-301.188\\183\\47.85156\\-302.4734\\183\\43.94531\\-303.136\\183\\40.03906\\-304.2984\\183\\36.13281\\-304.9303\\183\\34.17969\\-305.308\\183\\32.22656\\-305.8213\\183\\30.27344\\-306.2148\\183\\28.32031\\-306.4694\\183\\20.50781\\-307.3776\\183\\16.60156\\-307.9274\\183\\12.69531\\-308.2222\\183\\6.835938\\-308.45\\183\\-0.9765625\\-308.5417\\183\\-6.835938\\-308.4622\\183\\-10.74219\\-308.341\\183\\-14.64844\\-308.1115\\183" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "218" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-20.50781\\-307.7181\\185\\-24.41406\\-307.1261\\185\\-30.27344\\-306.3936\\185\\-32.22656\\-306.106\\185\\-36.13281\\-305.0701\\185\\-40.03906\\-304.3178\\185\\-41.99219\\-303.6033\\185\\-43.94531\\-303.0183\\185\\-45.89844\\-302.6813\\185\\-47.85156\\-302.2012\\185\\-49.80469\\-301.4146\\185\\-53.71094\\-300.3586\\185\\-55.66406\\-299.3977\\185\\-57.61719\\-298.6814\\185\\-59.57031\\-297.6281\\185\\-61.52344\\-296.8521\\185\\-65.42969\\-295.0637\\185\\-67.38281\\-294.2838\\185\\-67.7562\\-294.0078\\185\\-73.24219\\-290.8214\\185\\-75.19531\\-289.4738\\185\\-77.14844\\-288.5801\\185\\-79.10156\\-287.2192\\185\\-81.05469\\-285.7361\\185\\-83.00781\\-284.4061\\185\\-84.96094\\-282.96\\185\\-88.29886\\-280.3359\\185\\-90.82031\\-278.1072\\185\\-92.87383\\-276.4297\\185\\-94.72656\\-275.0237\\185\\-96.67969\\-273.1861\\185\\-99.29574\\-270.5703\\185\\-101.4579\\-268.6172\\185\\-108.876\\-260.8047\\185\\-111.7497\\-256.8984\\185\\-112.3047\\-256.2957\\185\\-114.9947\\-252.9922\\185\\-116.2523\\-251.0391\\185\\-117.4074\\-249.0859\\185\\-118.7654\\-247.1328\\185\\-119.882\\-245.1797\\185\\-121.1221\\-243.2266\\185\\-122.2567\\-241.2734\\185\\-123.0589\\-239.3203\\185\\-123.7497\\-237.3672\\185\\-124.7145\\-235.4141\\185\\-125.2741\\-233.4609\\185\\-126.2275\\-231.5078\\185\\-127.4852\\-227.6016\\185\\-128.2574\\-225.6484\\185\\-128.7474\\-223.6953\\185\\-129.5245\\-219.7891\\185\\-130.1398\\-217.8359\\185\\-130.5603\\-215.8828\\185\\-131.065\\-211.9766\\185\\-131.37\\-210.0234\\185\\-132.2545\\-206.1172\\185\\-132.5063\\-204.1641\\185\\-132.8779\\-200.2578\\185\\-133.2401\\-194.3984\\185\\-133.4022\\-188.5391\\185\\-133.4022\\-182.6797\\185\\-133.3067\\-178.7734\\185\\-133.1109\\-174.8672\\185\\-132.8273\\-170.9609\\185\\-132.4348\\-167.0547\\185\\-132.1178\\-165.1016\\185\\-131.5741\\-163.1484\\185\\-131.1908\\-161.1953\\185\\-130.6535\\-157.2891\\185\\-130.2776\\-155.3359\\185\\-129.6405\\-153.3828\\185\\-129.1519\\-151.4297\\185\\-128.3033\\-147.5234\\185\\-127.4351\\-145.5703\\185\\-126.8452\\-143.6172\\185\\-126.1382\\-141.6641\\185\\-125.2032\\-139.7109\\185\\-124.6405\\-137.7578\\185\\-123.6258\\-135.8047\\185\\-123.0105\\-133.8516\\185\\-122.2141\\-131.8984\\185\\-120.1172\\-128.1007\\185\\-118.8833\\-126.0391\\185\\-117.5194\\-124.0859\\185\\-116.6426\\-122.1328\\185\\-115.1966\\-120.1797\\185\\-110.3516\\-114.3295\\185\\-108.4589\\-112.3672\\185\\-106.273\\-110.4141\\185\\-104.4922\\-108.9111\\185\\-102.5391\\-107.4906\\185\\-100.5859\\-106.2691\\185\\-98.63281\\-105.3713\\185\\-96.67969\\-104.1653\\185\\-94.72656\\-103.4145\\185\\-92.77344\\-102.4914\\185\\-90.82031\\-101.8401\\185\\-86.91406\\-100.9035\\185\\-84.96094\\-100.2427\\185\\-83.00781\\-99.86601\\185\\-79.10156\\-99.39367\\185\\-77.14844\\-99.04118\\185\\-75.19531\\-98.49587\\185\\-73.24219\\-98.13338\\185\\-65.42969\\-97.26263\\185\\-61.52344\\-96.63368\\185\\-57.61719\\-96.19778\\185\\-53.71094\\-95.94743\\185\\-47.85156\\-95.62691\\185\\-41.99219\\-95.37997\\185\\-34.17969\\-95.2933\\185\\-30.27344\\-95.34266\\185\\-24.41406\\-95.57826\\185\\-20.50781\\-95.83388\\185\\-16.60156\\-96.26567\\185\\-14.71819\\-96.74219\\185\\-12.69531\\-97.38006\\185\\-10.74219\\-97.83219\\185\\-8.789063\\-98.43623\\185\\-6.835938\\-99.40826\\185\\-4.882813\\-99.97044\\185\\-2.929688\\-100.8074\\185\\-0.9765625\\-101.3934\\185\\0.9765625\\-101.6828\\185\\2.929688\\-101.7868\\185\\4.882813\\-101.7471\\185\\6.835938\\-101.5707\\185\\8.789063\\-101.1706\\185\\10.74219\\-100.2992\\185\\14.64844\\-99.12858\\185\\16.60156\\-98.38932\\185\\18.55469\\-97.90424\\185\\26.36719\\-96.51363\\185\\32.22656\\-95.90747\\185\\34.17969\\-95.75446\\185\\41.99219\\-95.26397\\185\\47.85156\\-94.71986\\185\\53.71094\\-94.37249\\185\\55.66406\\-94.31786\\185\\61.52344\\-94.36182\\185\\65.42969\\-94.61629\\185\\67.38281\\-94.82844\\185\\71.28906\\-95.42202\\185\\75.19531\\-95.90279\\185\\77.14844\\-96.22095\\185\\81.05469\\-97.43121\\185\\83.00781\\-97.89201\\185\\84.96094\\-98.53372\\185\\86.91406\\-99.3765\\185\\88.86719\\-99.92663\\185\\92.77344\\-101.6429\\185\\94.71451\\-102.6016\\185\\96.67969\\-103.7399\\185\\98.63281\\-105.1913\\185\\100.5859\\-106.2441\\185\\102.5391\\-107.5679\\185\\104.4922\\-109.0624\\185\\108.3732\\-112.3672\\185\\110.3516\\-114.1784\\185\\112.3047\\-116.2647\\185\\114.2578\\-118.4579\\185\\116.2109\\-120.8516\\185\\118.3942\\-124.0859\\185\\119.4096\\-126.0391\\185\\120.7548\\-127.9922\\185\\121.6038\\-129.9453\\185\\122.6639\\-131.8984\\185\\123.2239\\-133.8516\\185\\124.8318\\-137.7578\\185\\125.3715\\-139.7109\\185\\126.3231\\-141.6641\\185\\127.4322\\-145.5703\\185\\128.1924\\-147.5234\\185\\128.6321\\-149.4766\\185\\129.4111\\-155.3359\\185\\130.0974\\-159.2422\\185\\130.5318\\-163.1484\\185\\130.7174\\-167.0547\\185\\130.8266\\-170.9609\\185\\130.9133\\-176.8203\\185\\130.9077\\-182.6797\\185\\130.8594\\-188.5391\\185\\130.7589\\-196.3516\\185\\130.6226\\-202.2109\\185\\130.3206\\-208.0703\\185\\129.9225\\-211.9766\\185\\129.6048\\-213.9297\\185\\128.9702\\-219.7891\\185\\128.3997\\-223.6953\\185\\127.1666\\-227.6016\\185\\126.6892\\-229.5547\\185\\125.836\\-231.5078\\185\\125.094\\-233.4609\\185\\124.5754\\-235.4141\\185\\123.5764\\-237.3672\\185\\122.987\\-239.3203\\185\\122.2257\\-241.2734\\185\\120.1172\\-244.7944\\185\\118.8064\\-247.1328\\185\\117.5109\\-249.0859\\185\\116.603\\-251.0391\\185\\112.6489\\-256.8984\\185\\109.7887\\-260.8047\\185\\108.488\\-262.7578\\185\\104.4922\\-267.6181\\185\\101.8212\\-270.5703\\185\\99.841\\-272.5234\\185\\98.63281\\-273.8233\\185\\95.94167\\-276.4297\\185\\94.72656\\-277.3944\\185\\92.77344\\-279.2207\\185\\90.82031\\-280.948\\185\\88.86719\\-282.4544\\185\\86.91406\\-283.6589\\185\\83.00781\\-286.7724\\185\\79.10156\\-289.1499\\185\\77.14844\\-290.3892\\185\\75.19531\\-291.4294\\185\\73.24219\\-292.7969\\185\\69.33594\\-294.8562\\185\\67.38281\\-295.5066\\185\\65.42969\\-296.5652\\185\\63.47656\\-297.1703\\185\\61.52344\\-298.207\\185\\57.61719\\-299.5756\\185\\55.66406\\-300.4157\\185\\51.75781\\-301.3795\\185\\49.80469\\-302.1529\\185\\47.85156\\-302.6214\\185\\45.89844\\-302.9023\\185\\43.94531\\-303.3203\\185\\41.99219\\-303.9851\\185\\40.03906\\-304.4535\\185\\36.13281\\-305.0845\\185\\32.22656\\-306.0627\\185\\30.27344\\-306.3616\\185\\24.41406\\-307.0588\\185\\18.55469\\-307.9007\\185\\14.64844\\-308.2441\\185\\8.789063\\-308.5176\\185\\2.929688\\-308.6384\\185\\-2.929688\\-308.6503\\185\\-6.835938\\-308.5963\\185\\-12.69531\\-308.4106\\185\\-16.60156\\-308.145\\185" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "246" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "219" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-22.46094\\-307.7484\\187\\-26.36719\\-307.0876\\187\\-32.22656\\-306.3169\\187\\-34.17969\\-305.9857\\187\\-36.13281\\-305.3651\\187\\-40.03906\\-304.5497\\187\\-41.99219\\-304.044\\187\\-43.94531\\-303.2505\\187\\-47.85156\\-302.461\\187\\-51.75781\\-301.0848\\187\\-53.71094\\-300.5981\\187\\-55.53288\\-299.8672\\187\\-59.57031\\-298.078\\187\\-61.52344\\-297.0562\\187\\-63.47656\\-296.3229\\187\\-65.42969\\-295.2697\\187\\-67.38281\\-294.5539\\187\\-69.33594\\-293.339\\187\\-71.28906\\-292.3347\\187\\-71.63128\\-292.0547\\187\\-74.79581\\-290.1016\\187\\-75.19531\\-289.7736\\187\\-77.14844\\-288.819\\187\\-83.00781\\-284.7525\\187\\-86.91406\\-281.6622\\187\\-88.71488\\-280.3359\\187\\-93.25761\\-276.4297\\187\\-94.72656\\-275.2565\\187\\-96.67969\\-273.4596\\187\\-98.63281\\-271.4655\\187\\-102.5391\\-267.793\\187\\-105.3863\\-264.7109\\187\\-107.3276\\-262.7578\\187\\-109.1595\\-260.8047\\187\\-110.7407\\-258.8516\\187\\-112.1501\\-256.8984\\187\\-114.2578\\-254.3232\\187\\-116.6458\\-251.0391\\187\\-117.726\\-249.0859\\187\\-118.1641\\-248.5634\\187\\-120.1172\\-245.5106\\187\\-120.4012\\-245.1797\\187\\-121.4012\\-243.2266\\187\\-122.6048\\-241.2734\\187\\-123.2605\\-239.3203\\187\\-124.2084\\-237.3672\\187\\-125.6087\\-233.4609\\187\\-126.5841\\-231.5078\\187\\-127.154\\-229.5547\\187\\-127.9297\\-227.5835\\187\\-128.5747\\-225.6484\\187\\-129.3846\\-221.7422\\187\\-130.0146\\-219.7891\\187\\-130.5025\\-217.8359\\187\\-131.0535\\-213.9297\\187\\-131.3968\\-211.9766\\187\\-132.3184\\-208.0703\\187\\-132.5852\\-206.1172\\187\\-133.1894\\-200.2578\\187\\-133.6929\\-194.3984\\187\\-133.8698\\-190.4922\\187\\-133.9245\\-186.5859\\187\\-133.8976\\-182.6797\\187\\-133.722\\-178.7734\\187\\-133.4252\\-174.8672\\187\\-133.062\\-170.9609\\187\\-132.6481\\-167.0547\\187\\-132.3853\\-165.1016\\187\\-131.9714\\-163.1484\\187\\-131.4202\\-161.1953\\187\\-131.0513\\-159.2422\\187\\-130.4764\\-155.3359\\187\\-129.3257\\-151.4297\\187\\-128.5181\\-147.5234\\187\\-127.054\\-143.6172\\187\\-126.447\\-141.6641\\187\\-125.4502\\-139.7109\\187\\-124.8485\\-137.7578\\187\\-123.189\\-133.8516\\187\\-122.5382\\-131.8984\\187\\-121.3938\\-129.9453\\187\\-120.4622\\-127.9922\\187\\-118.1641\\-124.5249\\187\\-117.8096\\-124.0859\\187\\-116.8553\\-122.1328\\187\\-115.4125\\-120.1797\\187\\-112.3047\\-116.3668\\187\\-110.5197\\-114.3203\\187\\-108.6446\\-112.3672\\187\\-106.4189\\-110.4141\\187\\-103.9855\\-108.4609\\187\\-100.5859\\-106.2298\\187\\-98.63281\\-105.3394\\187\\-96.67969\\-104.1555\\187\\-94.72656\\-103.4316\\187\\-92.77344\\-102.5196\\187\\-90.82031\\-101.8706\\187\\-86.91406\\-100.9646\\187\\-84.96094\\-100.2901\\187\\-83.00781\\-99.88494\\187\\-79.10156\\-99.44176\\187\\-77.14844\\-99.10822\\187\\-75.19531\\-98.60057\\187\\-73.24219\\-98.2157\\187\\-69.33594\\-97.76226\\187\\-65.42969\\-97.37668\\187\\-59.57031\\-96.54275\\187\\-57.61719\\-96.31681\\187\\-53.71094\\-96.05067\\187\\-45.89844\\-95.66138\\187\\-41.99219\\-95.53448\\187\\-38.08594\\-95.4697\\187\\-34.17969\\-95.46194\\187\\-28.32031\\-95.5737\\187\\-24.41406\\-95.74953\\187\\-20.50781\\-95.99789\\187\\-18.55469\\-96.21944\\187\\-16.60156\\-96.55518\\187\\-14.64844\\-97.16705\\187\\-10.74219\\-98.01802\\187\\-6.835938\\-99.57942\\187\\-4.882813\\-100.1703\\187\\-2.929688\\-101.0955\\187\\-0.9765625\\-101.5771\\187\\0.9765625\\-101.849\\187\\2.929688\\-101.9563\\187\\4.882813\\-101.9098\\187\\6.835938\\-101.7354\\187\\8.789063\\-101.4059\\187\\12.69531\\-99.89298\\187\\14.64844\\-99.35686\\187\\18.55469\\-98.15472\\187\\20.50781\\-97.77331\\187\\26.36719\\-96.95998\\187\\28.32031\\-96.60675\\187\\32.22656\\-96.06208\\187\\34.17969\\-95.9011\\187\\41.99219\\-95.47448\\187\\49.80469\\-94.90262\\187\\53.71094\\-94.54492\\187\\57.61719\\-94.49248\\187\\61.52344\\-94.56314\\187\\65.42969\\-94.81288\\187\\71.28906\\-95.55308\\187\\75.19531\\-96.00422\\187\\77.14844\\-96.36313\\187\\79.10156\\-97.02981\\187\\83.00781\\-98.00691\\187\\86.91406\\-99.45421\\187\\88.86719\\-99.98288\\187\\90.82031\\-100.9093\\187\\92.77344\\-101.696\\187\\94.59556\\-102.6016\\187\\96.67969\\-103.7932\\187\\98.63281\\-105.228\\187\\100.5859\\-106.2691\\187\\102.5391\\-107.5807\\187\\104.4922\\-109.0534\\187\\108.4428\\-112.3672\\187\\110.3516\\-114.1465\\187\\112.3047\\-116.1816\\187\\114.2578\\-118.3761\\187\\116.2109\\-120.7674\\187\\118.4784\\-124.0859\\187\\119.5001\\-126.0391\\187\\120.8412\\-127.9922\\187\\121.7098\\-129.9453\\187\\122.7445\\-131.8984\\187\\123.3206\\-133.8516\\187\\124.2604\\-135.8047\\187\\125.5333\\-139.7109\\187\\126.5015\\-141.6641\\187\\127.0255\\-143.6172\\187\\127.6516\\-145.5703\\187\\128.3838\\-147.5234\\187\\128.7578\\-149.4766\\187\\129.3202\\-153.3828\\187\\130.0569\\-157.2891\\187\\130.3545\\-159.2422\\187\\130.686\\-163.1484\\187\\130.7761\\-165.1016\\187\\130.9903\\-172.9141\\187\\131.047\\-176.8203\\187\\131.0359\\-182.6797\\187\\130.9842\\-188.5391\\187\\130.854\\-196.3516\\187\\130.7288\\-202.2109\\187\\130.4986\\-208.0703\\187\\130.1772\\-211.9766\\187\\129.5667\\-215.8828\\187\\129.086\\-219.7891\\187\\128.5239\\-223.6953\\187\\128.039\\-225.6484\\187\\127.3072\\-227.6016\\187\\126.7997\\-229.5547\\187\\126.0851\\-231.5078\\187\\125.2116\\-233.4609\\187\\124.7065\\-235.4141\\187\\123.7392\\-237.3672\\187\\122.3724\\-241.2734\\187\\122.0703\\-241.6811\\187\\118.1641\\-248.4263\\187\\117.6419\\-249.0859\\187\\116.7661\\-251.0391\\187\\114.2578\\-254.8608\\187\\112.8673\\-256.8984\\187\\111.3641\\-258.8516\\187\\108.7963\\-262.7578\\187\\105.4511\\-266.6641\\187\\104.4922\\-267.9077\\187\\102.1027\\-270.5703\\187\\98.63281\\-274.1315\\187\\96.24301\\-276.4297\\187\\90.82031\\-281.1552\\187\\88.86719\\-282.7317\\187\\86.91406\\-283.9664\\187\\84.96094\\-285.4324\\187\\83.00781\\-287.0122\\187\\81.05469\\-288.3377\\187\\79.10156\\-289.342\\187\\77.14844\\-290.6792\\187\\71.28906\\-294.1956\\187\\67.38281\\-295.8438\\187\\65.42969\\-296.7682\\187\\63.47656\\-297.4131\\187\\61.52344\\-298.4713\\187\\59.57031\\-299.0658\\187\\57.61719\\-299.9202\\187\\55.66406\\-300.601\\187\\51.75781\\-301.591\\187\\49.80469\\-302.3607\\187\\45.89844\\-303.0227\\187\\43.94531\\-303.5525\\187\\41.99219\\-304.2173\\187\\36.13281\\-305.2681\\187\\34.17969\\-305.8351\\187\\32.22656\\-306.2348\\187\\24.41406\\-307.2205\\187\\20.50781\\-307.8619\\187\\18.55469\\-308.0982\\187\\14.64844\\-308.3894\\187\\8.789063\\-308.6207\\187\\0.9765625\\-308.7551\\187\\-6.835938\\-308.6974\\187\\-12.69531\\-308.5484\\187\\-18.55469\\-308.2001\\187" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "248" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "220" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-26.36719\\-307.3427\\189\\-30.27344\\-306.7463\\189\\-34.17969\\-306.2546\\189\\-36.13281\\-305.7932\\189\\-38.08594\\-305.1579\\189\\-41.99219\\-304.3307\\189\\-43.94531\\-303.5752\\189\\-45.89844\\-303.0025\\189\\-47.85156\\-302.6582\\189\\-49.80469\\-302.1553\\189\\-51.75781\\-301.332\\189\\-55.66406\\-300.1905\\189\\-57.61719\\-299.1392\\189\\-59.57031\\-298.3806\\189\\-61.52344\\-297.2805\\189\\-63.47656\\-296.5942\\189\\-65.42969\\-295.4897\\189\\-67.38281\\-294.7708\\189\\-69.33594\\-293.6185\\189\\-71.28906\\-292.6515\\189\\-73.24219\\-291.2636\\189\\-75.19531\\-290.1978\\189\\-77.14844\\-289.0199\\189\\-79.10156\\-287.7289\\189\\-81.05469\\-286.5534\\189\\-86.91406\\-281.9491\\189\\-88.86719\\-280.6097\\189\\-96.67969\\-273.686\\189\\-100.5859\\-269.8737\\189\\-102.5391\\-268.1403\\189\\-105.6706\\-264.7109\\189\\-107.6213\\-262.7578\\189\\-109.4012\\-260.8047\\189\\-111.0528\\-258.8516\\189\\-114.2578\\-254.8624\\189\\-116.9727\\-251.0391\\189\\-119.3438\\-247.1328\\189\\-120.7546\\-245.1797\\189\\-121.7542\\-243.2266\\189\\-122.8676\\-241.2734\\189\\-123.4986\\-239.3203\\189\\-124.577\\-237.3672\\189\\-125.1919\\-235.4141\\189\\-126.113\\-233.4609\\189\\-126.8523\\-231.5078\\189\\-127.4893\\-229.5547\\189\\-128.3268\\-227.6016\\189\\-129.2468\\-223.6953\\189\\-130.4232\\-219.7891\\189\\-131.0354\\-215.8828\\189\\-131.3968\\-213.9297\\189\\-131.9444\\-211.9766\\189\\-132.3753\\-210.0234\\189\\-132.6447\\-208.0703\\189\\-133.3407\\-202.2109\\189\\-133.8976\\-198.3047\\189\\-134.0709\\-196.3516\\189\\-134.2891\\-190.4922\\189\\-134.318\\-186.5859\\189\\-134.2861\\-182.6797\\189\\-134.1584\\-178.7734\\189\\-133.8838\\-174.8672\\189\\-133.0754\\-169.0078\\189\\-132.5899\\-165.1016\\189\\-132.2825\\-163.1484\\189\\-131.2354\\-159.2422\\189\\-130.6463\\-155.3359\\189\\-130.2178\\-153.3828\\189\\-129.562\\-151.4297\\189\\-129.0782\\-149.4766\\189\\-128.7121\\-147.5234\\189\\-128.1105\\-145.5703\\189\\-127.2961\\-143.6172\\189\\-126.7198\\-141.6641\\189\\-125.8176\\-139.7109\\189\\-125.0721\\-137.7578\\189\\-124.4495\\-135.8047\\189\\-123.4455\\-133.8516\\189\\-122.8201\\-131.8984\\189\\-121.7244\\-129.9453\\189\\-120.782\\-127.9922\\189\\-119.4042\\-126.0391\\189\\-117.0435\\-122.1328\\189\\-116.2109\\-120.9075\\189\\-114.2578\\-118.3984\\189\\-112.3047\\-116.0451\\189\\-108.7935\\-112.3672\\189\\-106.4453\\-110.3005\\189\\-103.9855\\-108.4609\\189\\-100.5859\\-106.2057\\189\\-98.63281\\-105.3162\\189\\-96.67969\\-104.1458\\189\\-94.72656\\-103.4208\\189\\-92.77344\\-102.534\\189\\-90.82031\\-101.894\\189\\-86.91406\\-100.9902\\189\\-84.96094\\-100.3158\\189\\-83.00781\\-99.90411\\189\\-79.10156\\-99.47099\\189\\-77.14844\\-99.15147\\189\\-73.24219\\-98.26994\\189\\-71.28906\\-98.01884\\189\\-63.47656\\-97.2571\\189\\-57.61719\\-96.46036\\189\\-53.71094\\-96.14752\\189\\-49.80469\\-95.93274\\189\\-45.89844\\-95.77094\\189\\-41.99219\\-95.66138\\189\\-34.17969\\-95.60287\\189\\-28.32031\\-95.7388\\189\\-24.41406\\-95.90739\\189\\-20.50781\\-96.18655\\189\\-18.55469\\-96.4831\\189\\-14.64844\\-97.43895\\189\\-10.74219\\-98.23959\\189\\-8.789063\\-99.1506\\189\\-4.882813\\-100.4173\\189\\-2.929688\\-101.3146\\189\\-0.9765625\\-101.7368\\189\\0.9765625\\-102.0156\\189\\2.929688\\-102.1409\\189\\4.882813\\-102.0771\\189\\6.835938\\-101.8823\\189\\8.789063\\-101.5707\\189\\10.74219\\-100.9789\\189\\12.69531\\-100.082\\189\\16.60156\\-99.05106\\189\\18.55469\\-98.42294\\189\\22.46094\\-97.70808\\189\\26.36719\\-97.29441\\189\\28.32031\\-96.99487\\189\\30.27344\\-96.56654\\189\\32.22656\\-96.25706\\189\\34.17969\\-96.05389\\189\\41.99219\\-95.63654\\189\\49.80469\\-95.10751\\189\\53.71094\\-94.79707\\189\\55.66406\\-94.71761\\189\\61.52344\\-94.78112\\189\\65.42969\\-95.01498\\189\\73.24219\\-95.87354\\189\\75.19531\\-96.1197\\189\\77.14844\\-96.5525\\189\\79.10156\\-97.19711\\189\\83.00781\\-98.1349\\189\\84.96094\\-98.90825\\189\\86.91406\\-99.52826\\189\\88.86719\\-100.0421\\189\\90.82031\\-101.0003\\189\\92.77344\\-101.7315\\189\\94.48242\\-102.6016\\189\\96.67969\\-103.8397\\189\\98.63281\\-105.2633\\189\\100.5859\\-106.3081\\189\\102.5391\\-107.5936\\189\\104.4922\\-109.0443\\189\\108.5108\\-112.3672\\189\\110.3516\\-114.0863\\189\\112.3047\\-116.0893\\189\\114.2578\\-118.2899\\189\\116.2109\\-120.677\\189\\118.556\\-124.0859\\189\\119.5851\\-126.0391\\189\\120.9062\\-127.9922\\189\\122.8258\\-131.8984\\189\\123.431\\-133.8516\\189\\124.4259\\-135.8047\\189\\125.0159\\-137.7578\\189\\125.7147\\-139.7109\\189\\126.6436\\-141.6641\\189\\127.1647\\-143.6172\\189\\127.9297\\-145.6642\\189\\128.5228\\-147.5234\\189\\128.889\\-149.4766\\189\\129.5157\\-153.3828\\189\\130.3206\\-157.2891\\189\\130.6995\\-161.1953\\189\\130.8862\\-165.1016\\189\\131.0965\\-170.9609\\189\\131.2102\\-176.8203\\189\\131.2182\\-180.7266\\189\\131.1303\\-188.5391\\189\\130.9184\\-198.3047\\189\\130.7174\\-206.1172\\189\\130.3875\\-211.9766\\189\\130.1505\\-213.9297\\189\\129.4691\\-217.8359\\189\\128.6404\\-223.6953\\189\\128.2266\\-225.6484\\189\\127.469\\-227.6016\\189\\126.3148\\-231.5078\\189\\125.3662\\-233.4609\\189\\124.8273\\-235.4141\\189\\123.1667\\-239.3203\\189\\122.484\\-241.2734\\189\\121.2925\\-243.2266\\189\\120.1172\\-245.3938\\189\\118.1641\\-248.6798\\189\\117.8215\\-249.0859\\189\\116.9194\\-251.0391\\189\\115.6212\\-252.9922\\189\\114.4913\\-254.9453\\189\\113.0703\\-256.8984\\189\\111.5369\\-258.8516\\189\\110.3599\\-260.8047\\189\\109.0113\\-262.7578\\189\\105.6802\\-266.6641\\189\\104.4922\\-268.1929\\189\\102.4228\\-270.5703\\189\\100.609\\-272.5234\\189\\98.63281\\-274.4853\\189\\96.56634\\-276.4297\\189\\90.82031\\-281.3851\\189\\88.86719\\-282.9465\\189\\84.96094\\-285.7274\\189\\81.05469\\-288.6571\\189\\79.10156\\-289.533\\189\\78.37975\\-290.1016\\189\\75.19531\\-292.2163\\189\\73.24219\\-293.2855\\189\\71.28906\\-294.5095\\189\\69.33594\\-295.2055\\189\\67.38281\\-296.2266\\189\\63.47656\\-297.7439\\189\\61.52344\\-298.668\\189\\59.57031\\-299.2883\\189\\57.61719\\-300.2169\\189\\53.71094\\-301.2131\\189\\49.80469\\-302.51\\189\\45.89844\\-303.172\\189\\41.99219\\-304.3877\\189\\38.08594\\-305.0351\\189\\36.13281\\-305.4908\\189\\34.17969\\-306.0731\\189\\32.22656\\-306.3794\\189\\28.32031\\-306.8576\\189\\24.41406\\-307.4178\\189\\22.46094\\-307.7915\\189\\18.55469\\-308.2441\\189\\14.64844\\-308.5005\\189\\8.789063\\-308.7154\\189\\4.882813\\-308.8065\\189\\0.9765625\\-308.8458\\189\\-4.882813\\-308.8296\\189\\-12.69531\\-308.6621\\189\\-16.60156\\-308.4814\\189\\-20.50781\\-308.2222\\189\\-22.46094\\-308.028\\189" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "241" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "221" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-24.41406\\-307.9914\\191\\-30.27344\\-306.9487\\191\\-34.17969\\-306.4459\\191\\-36.13281\\-306.133\\191\\-38.08594\\-305.4639\\191\\-40.03906\\-304.9402\\191\\-41.99219\\-304.5319\\191\\-43.94531\\-304.0092\\191\\-45.89844\\-303.2234\\191\\-49.80469\\-302.4227\\191\\-51.75781\\-301.619\\191\\-55.66406\\-300.4483\\191\\-57.61719\\-299.1766\\191\\-59.57031\\-298.4283\\191\\-61.52344\\-297.5596\\191\\-63.47656\\-296.8004\\191\\-65.42969\\-295.7687\\191\\-67.38281\\-294.9604\\191\\-69.29977\\-294.0078\\191\\-71.28906\\-292.8893\\191\\-73.24219\\-291.5215\\191\\-75.19531\\-290.5322\\191\\-77.14844\\-289.2054\\191\\-79.00391\\-288.1484\\191\\-81.05469\\-286.8483\\191\\-84.31244\\-284.2422\\191\\-84.96094\\-283.6617\\191\\-86.91406\\-282.3623\\191\\-88.86719\\-280.9259\\191\\-92.77344\\-277.3624\\191\\-96.19928\\-274.4766\\191\\-100.5859\\-270.2473\\191\\-102.478\\-268.6172\\191\\-106.0217\\-264.7109\\191\\-108.3984\\-262.3015\\191\\-112.3047\\-257.6547\\191\\-114.6361\\-254.9453\\191\\-115.8526\\-252.9922\\191\\-118.5988\\-249.0859\\191\\-119.7043\\-247.1328\\191\\-121.0438\\-245.1797\\191\\-122.2176\\-243.2266\\191\\-123.8906\\-239.3203\\191\\-124.8372\\-237.3672\\191\\-125.4979\\-235.4141\\191\\-126.5077\\-233.4609\\191\\-127.1277\\-231.5078\\191\\-128.6222\\-227.6016\\191\\-129.584\\-223.6953\\191\\-130.2886\\-221.7422\\191\\-130.6908\\-219.7891\\191\\-131.3445\\-215.8828\\191\\-131.958\\-213.9297\\191\\-132.3996\\-211.9766\\191\\-133.2101\\-206.1172\\191\\-133.8698\\-202.2109\\191\\-134.1482\\-200.2578\\191\\-134.4085\\-196.3516\\191\\-134.5735\\-190.4922\\191\\-134.5949\\-186.5859\\191\\-134.5147\\-180.7266\\191\\-134.2448\\-174.8672\\191\\-134.0709\\-172.9141\\191\\-133.054\\-167.0547\\191\\-132.4992\\-163.1484\\191\\-132.1289\\-161.1953\\191\\-131.5104\\-159.2422\\191\\-131.067\\-157.2891\\191\\-130.4764\\-153.3828\\191\\-129.2637\\-149.4766\\191\\-128.8944\\-147.5234\\191\\-128.4084\\-145.5703\\191\\-127.6381\\-143.6172\\191\\-126.3193\\-139.7109\\191\\-125.3355\\-137.7578\\191\\-124.7403\\-135.8047\\191\\-123.8158\\-133.8516\\191\\-122.2141\\-129.9453\\191\\-121.0706\\-127.9922\\191\\-119.7527\\-126.0391\\191\\-118.5889\\-124.0859\\191\\-116.2109\\-120.5374\\191\\-114.4907\\-118.2266\\191\\-112.3047\\-115.7958\\191\\-108.9331\\-112.3672\\191\\-106.4453\\-110.2319\\191\\-104.4922\\-108.9277\\191\\-102.5391\\-107.478\\191\\-100.5859\\-106.1823\\191\\-98.63281\\-105.2973\\191\\-96.67969\\-104.124\\191\\-94.72656\\-103.4163\\191\\-92.77344\\-102.534\\191\\-90.82031\\-101.894\\191\\-86.91406\\-101.0267\\191\\-84.96094\\-100.3419\\191\\-83.00781\\-99.93108\\191\\-79.10156\\-99.48877\\191\\-77.14844\\-99.19305\\191\\-73.24219\\-98.31828\\191\\-71.28906\\-98.05977\\191\\-63.47656\\-97.34619\\191\\-59.57031\\-96.89079\\191\\-57.61719\\-96.60675\\191\\-53.71094\\-96.24242\\191\\-49.80469\\-96.019\\191\\-43.94531\\-95.8074\\191\\-38.08594\\-95.73325\\191\\-32.22656\\-95.76031\\191\\-26.36719\\-95.95988\\191\\-22.46094\\-96.18974\\191\\-20.50781\\-96.4061\\191\\-16.60156\\-97.30756\\191\\-12.69531\\-98.0038\\191\\-10.74219\\-98.54671\\191\\-8.789063\\-99.37231\\191\\-6.835938\\-99.88756\\191\\-4.882813\\-100.7358\\191\\-2.929688\\-101.4724\\191\\-0.9765625\\-101.8973\\191\\0.9765625\\-102.192\\191\\2.929688\\-102.3762\\191\\4.882813\\-102.2804\\191\\6.835938\\-102.053\\191\\8.789063\\-101.725\\191\\10.74219\\-101.2036\\191\\12.69531\\-100.2849\\191\\20.50781\\-98.24871\\191\\22.46094\\-97.91949\\191\\26.36719\\-97.5203\\191\\28.32031\\-97.24833\\191\\32.22656\\-96.50317\\191\\36.13281\\-96.09706\\191\\40.03906\\-95.88904\\191\\47.85156\\-95.39242\\191\\53.71094\\-95.0528\\191\\57.61719\\-94.94561\\191\\61.52344\\-94.98731\\191\\65.42969\\-95.22088\\191\\69.33594\\-95.57146\\191\\73.24219\\-95.98807\\191\\75.19531\\-96.2569\\191\\79.10156\\-97.31696\\191\\83.00781\\-98.26994\\191\\84.96094\\-99.05726\\191\\88.86719\\-100.0951\\191\\90.82031\\-101.0739\\191\\92.77344\\-101.7789\\191\\96.67969\\-103.8822\\191\\98.63281\\-105.2973\\191\\100.5859\\-106.364\\191\\102.5391\\-107.5936\\191\\104.4922\\-109.0534\\191\\108.5598\\-112.3672\\191\\110.3516\\-114.0289\\191\\112.3047\\-116.0177\\191\\114.2662\\-118.2266\\191\\116.2109\\-120.5758\\191\\118.6276\\-124.0859\\191\\119.6781\\-126.0391\\191\\120.9772\\-127.9922\\191\\122.9065\\-131.8984\\191\\123.5522\\-133.8516\\191\\124.5667\\-135.8047\\191\\125.1309\\-137.7578\\191\\126.7671\\-141.6641\\191\\127.3193\\-143.6172\\191\\128.1334\\-145.5703\\191\\128.649\\-147.5234\\191\\129.3164\\-151.4297\\191\\130.2013\\-155.3359\\191\\130.511\\-157.2891\\191\\130.6928\\-159.2422\\191\\131.0167\\-165.1016\\191\\131.2805\\-170.9609\\191\\131.4361\\-176.8203\\191\\131.4573\\-180.7266\\191\\131.4026\\-184.6328\\191\\131.0404\\-198.3047\\191\\130.8157\\-206.1172\\191\\130.6629\\-210.0234\\191\\130.3678\\-213.9297\\191\\130.1104\\-215.8828\\191\\129.3331\\-219.7891\\191\\128.7511\\-223.6953\\191\\128.3809\\-225.6484\\191\\127.0358\\-229.5547\\191\\126.5024\\-231.5078\\191\\125.5418\\-233.4609\\191\\124.936\\-235.4141\\191\\124.1936\\-237.3672\\191\\123.2557\\-239.3203\\191\\122.6071\\-241.2734\\191\\121.4252\\-243.2266\\191\\120.5117\\-245.1797\\191\\119.2082\\-247.1328\\191\\118.0753\\-249.0859\\191\\117.0755\\-251.0391\\191\\115.808\\-252.9922\\191\\114.7494\\-254.9453\\191\\111.7763\\-258.8516\\191\\110.6649\\-260.8047\\191\\109.21\\-262.7578\\191\\102.7517\\-270.5703\\191\\100.9498\\-272.5234\\191\\98.63281\\-274.8021\\191\\94.6841\\-278.3828\\191\\90.00788\\-282.2891\\191\\86.91406\\-284.6826\\191\\81.05469\\-288.8777\\191\\79.10156\\-289.813\\191\\77.14844\\-291.1406\\191\\75.19531\\-292.5665\\191\\73.24219\\-293.5645\\191\\71.28906\\-294.7402\\191\\69.33594\\-295.4169\\191\\67.38281\\-296.493\\191\\65.42969\\-297.1095\\191\\63.47656\\-298.1258\\191\\59.57031\\-299.5439\\191\\57.61719\\-300.4192\\191\\53.71094\\-301.3722\\191\\51.75781\\-302.1147\\191\\49.80469\\-302.6214\\191\\47.85156\\-302.9156\\191\\45.89844\\-303.3401\\191\\43.94531\\-304.0553\\191\\41.99219\\-304.5168\\191\\38.08594\\-305.2007\\191\\36.13281\\-305.7787\\191\\34.17969\\-306.2515\\191\\28.32031\\-306.9991\\191\\22.46094\\-307.9892\\191\\18.55469\\-308.3615\\191\\14.64844\\-308.5916\\191\\8.789063\\-308.8065\\191\\4.882813\\-308.8847\\191\\-0.9765625\\-308.9452\\191\\-6.835938\\-308.8918\\191\\-12.69531\\-308.7667\\191\\-20.50781\\-308.3938\\191" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "239" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "222" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-26.36719\\-307.9292\\193\\-28.32031\\-307.4829\\193\\-30.27344\\-307.1688\\193\\-36.13281\\-306.3322\\193\\-38.08594\\-305.8486\\193\\-40.03906\\-305.1497\\193\\-43.94531\\-304.2984\\193\\-45.89844\\-303.5116\\193\\-47.85156\\-302.9403\\193\\-49.80469\\-302.591\\193\\-51.75781\\-301.9375\\193\\-53.71094\\-301.1714\\193\\-55.66406\\-300.6427\\193\\-56.91964\\-299.8672\\193\\-57.61719\\-299.1953\\193\\-59.57031\\-298.4194\\193\\-61.52344\\-297.9368\\193\\-63.47656\\-296.9702\\193\\-65.42969\\-296.1473\\193\\-67.38281\\-295.1299\\193\\-69.33594\\-294.338\\193\\-72.99107\\-292.0547\\193\\-75.19531\\-290.7868\\193\\-77.14844\\-289.431\\193\\-79.10156\\-288.4518\\193\\-82.24655\\-286.1953\\193\\-84.96094\\-283.9884\\193\\-86.91406\\-282.6984\\193\\-88.86719\\-281.1758\\193\\-92.77344\\-277.6311\\193\\-94.72656\\-275.9884\\193\\-96.67039\\-274.4766\\193\\-98.60689\\-272.5234\\193\\-102.5391\\-268.9375\\193\\-104.4922\\-266.8894\\193\\-106.437\\-264.7109\\193\\-108.3984\\-262.7486\\193\\-110.3516\\-260.4395\\193\\-111.553\\-258.8516\\193\\-114.9369\\-254.9453\\193\\-116.299\\-252.9922\\193\\-117.4759\\-251.0391\\193\\-118.1641\\-250.1551\\193\\-120.2257\\-247.1328\\193\\-122.0703\\-243.959\\193\\-122.5789\\-243.2266\\193\\-123.2879\\-241.2734\\193\\-124.349\\-239.3203\\193\\-125.0603\\-237.3672\\193\\-126.7965\\-233.4609\\193\\-127.4507\\-231.5078\\193\\-128.3529\\-229.5547\\193\\-129.3351\\-225.6484\\193\\-130.0721\\-223.6953\\193\\-130.6033\\-221.7422\\193\\-131.2913\\-217.8359\\193\\-132.4107\\-213.9297\\193\\-133.0046\\-210.0234\\193\\-134.0614\\-204.1641\\193\\-134.4604\\-200.2578\\193\\-134.7332\\-194.3984\\193\\-134.8489\\-186.5859\\193\\-134.7547\\-180.7266\\193\\-134.4889\\-174.8672\\193\\-134.1167\\-170.9609\\193\\-133.3069\\-167.0547\\193\\-132.401\\-161.1953\\193\\-131.9167\\-159.2422\\193\\-131.2982\\-157.2891\\193\\-130.6723\\-153.3828\\193\\-130.2296\\-151.4297\\193\\-129.5131\\-149.4766\\193\\-128.6621\\-145.5703\\193\\-128.1092\\-143.6172\\193\\-127.2846\\-141.6641\\193\\-126.6781\\-139.7109\\193\\-125.7506\\-137.7578\\193\\-124.3115\\-133.8516\\193\\-123.2926\\-131.8984\\193\\-122.618\\-129.9453\\193\\-121.3763\\-127.9922\\193\\-120.2325\\-126.0391\\193\\-117.4497\\-122.1328\\193\\-116.2195\\-120.1797\\193\\-114.7629\\-118.2266\\193\\-112.3047\\-115.5101\\193\\-109.1291\\-112.3672\\193\\-106.4453\\-110.1682\\193\\-100.5859\\-106.1348\\193\\-98.63281\\-105.2739\\193\\-96.67969\\-104.1026\\193\\-94.72656\\-103.4055\\193\\-92.77344\\-102.534\\193\\-90.82031\\-101.894\\193\\-86.91406\\-101.0486\\193\\-84.96094\\-100.3934\\193\\-83.00781\\-99.95089\\193\\-77.14844\\-99.23853\\193\\-73.24219\\-98.36979\\193\\-71.28906\\-98.10297\\193\\-63.47656\\-97.41661\\193\\-59.57031\\-97.01456\\193\\-55.66406\\-96.49471\\193\\-53.71094\\-96.32624\\193\\-49.80469\\-96.10367\\193\\-43.94531\\-95.89548\\193\\-38.08594\\-95.83874\\193\\-34.17969\\-95.84354\\193\\-28.32031\\-96.00845\\193\\-24.41406\\-96.21722\\193\\-22.46094\\-96.39567\\193\\-20.50781\\-96.73456\\193\\-18.55469\\-97.19054\\193\\-14.64844\\-97.83894\\193\\-12.69531\\-98.23056\\193\\-10.74219\\-98.95905\\193\\-6.835938\\-100.0509\\193\\-4.882813\\-101.029\\193\\-2.929688\\-101.6309\\193\\0.9765625\\-102.4247\\193\\2.929688\\-102.6713\\193\\4.882813\\-102.5494\\193\\8.789063\\-101.8472\\193\\10.74219\\-101.3523\\193\\12.69531\\-100.5156\\193\\14.64844\\-99.8922\\193\\18.55469\\-99.04854\\193\\20.50781\\-98.52093\\193\\22.46094\\-98.15278\\193\\28.32031\\-97.43506\\193\\34.17969\\-96.52748\\193\\38.08594\\-96.14948\\193\\49.80469\\-95.40485\\193\\53.71094\\-95.21796\\193\\57.61719\\-95.13086\\193\\61.52344\\-95.18106\\193\\67.38281\\-95.50521\\193\\73.24219\\-96.07459\\193\\75.19531\\-96.39342\\193\\77.14844\\-96.94304\\193\\81.05469\\-97.7848\\193\\83.00781\\-98.39135\\193\\84.96094\\-99.19002\\193\\88.86719\\-100.1703\\193\\90.82031\\-101.147\\193\\92.77344\\-101.8334\\193\\96.67969\\-103.9295\\193\\98.63281\\-105.3394\\193\\100.5859\\-106.4071\\193\\102.5391\\-107.6064\\193\\106.2073\\-110.4141\\193\\108.5904\\-112.3672\\193\\110.3516\\-114.0025\\193\\112.3047\\-115.9631\\193\\114.3627\\-118.2266\\193\\116.2109\\-120.4896\\193\\118.6908\\-124.0859\\193\\119.7664\\-126.0391\\193\\121.0438\\-127.9922\\193\\122.1542\\-129.9453\\193\\122.9797\\-131.8984\\193\\123.6834\\-133.8516\\193\\124.6802\\-135.8047\\193\\125.2441\\-137.7578\\193\\126.2356\\-139.7109\\193\\127.4921\\-143.6172\\193\\128.3008\\-145.5703\\193\\128.7676\\-147.5234\\193\\129.4992\\-151.4297\\193\\130.0278\\-153.3828\\193\\130.4196\\-155.3359\\193\\130.6676\\-157.2891\\193\\131.183\\-165.1016\\193\\131.6406\\-172.9141\\193\\131.828\\-178.7734\\193\\131.7082\\-184.6328\\193\\131.2382\\-196.3516\\193\\130.7761\\-210.0234\\193\\130.5442\\-213.9297\\193\\130.3443\\-215.8828\\193\\129.9688\\-217.8359\\193\\129.4936\\-219.7891\\193\\128.5156\\-225.6484\\193\\127.9297\\-227.5441\\193\\127.1797\\-229.5547\\193\\126.651\\-231.5078\\193\\125.7324\\-233.4609\\193\\124.3581\\-237.3672\\193\\123.3454\\-239.3203\\193\\122.7193\\-241.2734\\193\\121.5758\\-243.2266\\193\\120.6913\\-245.1797\\193\\119.3656\\-247.1328\\193\\118.3758\\-249.0859\\193\\116.2109\\-252.8912\\193\\114.981\\-254.9453\\193\\112.0718\\-258.8516\\193\\110.8897\\-260.8047\\193\\109.3945\\-262.7578\\193\\103.0238\\-270.5703\\193\\101.1955\\-272.5234\\193\\98.63281\\-275.0597\\193\\95.03455\\-278.3828\\193\\90.31042\\-282.2891\\193\\88.86719\\-283.3278\\193\\84.96094\\-286.5087\\193\\81.05469\\-289.0522\\193\\77.14844\\-291.4098\\193\\75.19531\\-292.8458\\193\\71.28906\\-294.9294\\193\\69.33594\\-295.6872\\193\\67.38281\\-296.6862\\193\\65.42969\\-297.297\\193\\63.47656\\-298.3788\\193\\61.52344\\-299.0101\\193\\59.52229\\-299.8672\\193\\57.61719\\-300.563\\193\\53.71094\\-301.5671\\193\\51.75781\\-302.3186\\193\\49.80469\\-302.7239\\193\\47.85156\\-303.0133\\193\\45.89844\\-303.524\\193\\43.94531\\-304.2443\\193\\40.03906\\-304.9852\\193\\38.08594\\-305.4076\\193\\36.13281\\-306.0414\\193\\34.17969\\-306.39\\193\\30.27344\\-306.8817\\193\\26.36719\\-307.4961\\193\\24.41406\\-307.875\\193\\22.46094\\-308.145\\193\\18.55469\\-308.4573\\193\\12.69531\\-308.7498\\193\\4.882813\\-308.9916\\193\\-0.9765625\\-309.0862\\193\\-4.882813\\-309.0481\\193\\-12.69531\\-308.8458\\193\\-20.50781\\-308.5193\\193\\-24.41406\\-308.1906\\193" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "238" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "223" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-28.32031\\-307.7344\\195\\-36.13281\\-306.5047\\195\\-38.08594\\-306.133\\195\\-40.03906\\-305.4256\\195\\-41.99219\\-304.8917\\195\\-43.94531\\-304.5046\\195\\-45.89844\\-303.882\\195\\-47.85156\\-303.1087\\195\\-49.80469\\-302.7127\\195\\-51.75781\\-302.2039\\195\\-53.71094\\-301.3659\\195\\-55.66406\\-300.8035\\195\\-57.60528\\-299.8672\\195\\-59.57031\\-298.7537\\195\\-61.52344\\-298.2834\\195\\-63.47656\\-297.1362\\195\\-65.42969\\-296.4263\\195\\-67.38281\\-295.2824\\195\\-69.33594\\-294.5925\\195\\-71.28906\\-293.3345\\195\\-73.55368\\-292.0547\\195\\-76.69442\\-290.1016\\195\\-77.14844\\-289.7153\\195\\-79.10156\\-288.7397\\195\\-82.6656\\-286.1953\\195\\-85.15083\\-284.2422\\195\\-86.91406\\-282.9727\\195\\-90.13052\\-280.3359\\195\\-92.77344\\-277.9402\\195\\-96.67969\\-274.8504\\195\\-99.00145\\-272.5234\\195\\-101.1429\\-270.5703\\195\\-104.4922\\-267.2294\\195\\-106.4453\\-265.0892\\195\\-108.7752\\-262.7578\\195\\-110.4574\\-260.8047\\195\\-111.8699\\-258.8516\\195\\-115.1966\\-254.9453\\195\\-116.6676\\-252.9922\\195\\-117.7215\\-251.0391\\195\\-120.6352\\-247.1328\\195\\-121.6784\\-245.1797\\195\\-122.8453\\-243.2266\\195\\-123.5318\\-241.2734\\195\\-124.6487\\-239.3203\\195\\-125.3078\\-237.3672\\195\\-126.3977\\-235.4141\\195\\-127.0752\\-233.4609\\195\\-128.6426\\-229.5547\\195\\-129.1274\\-227.6016\\195\\-129.7226\\-225.6484\\195\\-130.4362\\-223.6953\\195\\-131.175\\-219.7891\\195\\-132.3442\\-215.8828\\195\\-133.3696\\-210.0234\\195\\-133.8412\\-208.0703\\195\\-134.4079\\-204.1641\\195\\-134.8386\\-198.3047\\195\\-134.9995\\-194.3984\\195\\-135.1427\\-186.5859\\195\\-135.0068\\-180.7266\\195\\-134.8311\\-176.8203\\195\\-134.3592\\-170.9609\\195\\-134.1146\\-169.0078\\195\\-133.2368\\-165.1016\\195\\-132.2798\\-159.2422\\195\\-131.6658\\-157.2891\\195\\-131.1594\\-155.3359\\195\\-130.4803\\-151.4297\\195\\-129.8421\\-149.4766\\195\\-129.3351\\-147.5234\\195\\-128.4618\\-143.6172\\195\\-127.6659\\-141.6641\\195\\-126.2999\\-137.7578\\195\\-125.269\\-135.8047\\195\\-124.6525\\-133.8516\\195\\-123.57\\-131.8984\\195\\-122.9047\\-129.9453\\195\\-120.6481\\-126.0391\\195\\-119.096\\-124.0859\\195\\-117.7228\\-122.1328\\195\\-116.4932\\-120.1797\\195\\-115.0145\\-118.2266\\195\\-112.3047\\-115.2765\\195\\-109.2948\\-112.3672\\195\\-106.4453\\-110.0511\\195\\-104.1379\\-108.4609\\195\\-100.5859\\-106.1026\\195\\-98.63281\\-105.2623\\195\\-96.67969\\-104.0905\\195\\-94.72656\\-103.3991\\195\\-92.77344\\-102.5486\\195\\-90.82031\\-101.9057\\195\\-86.91406\\-101.0698\\195\\-84.96094\\-100.4191\\195\\-83.00781\\-99.96669\\195\\-77.14844\\-99.26799\\195\\-75.19531\\-98.90509\\195\\-73.24219\\-98.43623\\195\\-71.28906\\-98.1412\\195\\-59.57031\\-97.09324\\195\\-55.66406\\-96.59358\\195\\-51.75781\\-96.28022\\195\\-43.94531\\-95.98899\\195\\-38.08594\\-95.92063\\195\\-34.17969\\-95.94743\\195\\-30.27344\\-96.06123\\195\\-26.36719\\-96.24242\\195\\-24.41406\\-96.4061\\195\\-22.46094\\-96.69\\195\\-20.50781\\-97.106\\195\\-14.64844\\-98.03902\\195\\-12.69531\\-98.54671\\195\\-10.74219\\-99.27013\\195\\-8.789063\\-99.71703\\195\\-6.835938\\-100.2734\\195\\-4.882813\\-101.2489\\195\\-2.929688\\-101.7887\\195\\0.9765625\\-102.7421\\195\\2.929688\\-102.9669\\195\\4.882813\\-102.8615\\195\\6.835938\\-102.4388\\195\\10.74219\\-101.4794\\195\\14.64844\\-100.0247\\195\\20.50781\\-98.85186\\195\\22.46094\\-98.36979\\195\\24.41406\\-98.06715\\195\\32.22656\\-97.12376\\195\\36.13281\\-96.52899\\195\\38.08594\\-96.29559\\195\\45.89844\\-95.72765\\195\\53.71094\\-95.3498\\195\\59.57031\\-95.27734\\195\\61.52344\\-95.32585\\195\\67.38281\\-95.61581\\195\\73.24219\\-96.16077\\195\\75.19531\\-96.50646\\195\\77.14844\\-97.09324\\195\\79.10156\\-97.42175\\195\\81.05469\\-97.84834\\195\\83.00781\\-98.50831\\195\\84.96094\\-99.28735\\195\\86.91406\\-99.71116\\195\\88.86719\\-100.2398\\195\\90.82031\\-101.2036\\195\\92.77344\\-101.8886\\195\\94.72656\\-102.9857\\195\\96.67969\\-103.9616\\195\\98.63281\\-105.3695\\195\\100.5859\\-106.4375\\195\\102.5391\\-107.6321\\195\\106.2073\\-110.4141\\195\\108.6053\\-112.3672\\195\\110.3516\\-113.977\\195\\112.3047\\-115.9137\\195\\114.4516\\-118.2266\\195\\116.2109\\-120.3999\\195\\117.344\\-122.1328\\195\\118.7443\\-124.0859\\195\\122.2929\\-129.9453\\195\\123.8312\\-133.8516\\195\\124.7667\\-135.8047\\195\\125.3834\\-137.7578\\195\\126.4287\\-139.7109\\195\\127.0109\\-141.6641\\195\\128.4335\\-145.5703\\195\\129.2509\\-149.4766\\195\\130.2637\\-153.3828\\195\\130.5804\\-155.3359\\195\\130.7872\\-157.2891\\195\\131.2226\\-163.1484\\195\\131.9167\\-170.9609\\195\\132.1178\\-174.8672\\195\\132.2029\\-178.7734\\195\\132.1399\\-182.6797\\195\\131.9167\\-188.5391\\195\\131.5381\\-194.3984\\195\\131.2718\\-200.2578\\195\\130.7932\\-211.9766\\195\\130.5194\\-215.8828\\195\\130.2154\\-217.8359\\195\\129.302\\-221.7422\\195\\128.633\\-225.6484\\195\\128.1305\\-227.6016\\195\\127.3345\\-229.5547\\195\\126.7568\\-231.5078\\195\\125.102\\-235.4141\\195\\124.4894\\-237.3672\\195\\123.421\\-239.3203\\195\\122.8333\\-241.2734\\195\\121.7493\\-243.2266\\195\\120.8469\\-245.1797\\195\\119.5348\\-247.1328\\195\\118.6096\\-249.0859\\195\\117.3765\\-251.0391\\195\\116.4952\\-252.9922\\195\\115.1801\\-254.9453\\195\\113.7463\\-256.8984\\195\\112.4453\\-258.8516\\195\\110.3516\\-261.7898\\195\\106.5119\\-266.6641\\195\\103.2597\\-270.5703\\195\\101.4359\\-272.5234\\195\\98.63281\\-275.3008\\195\\95.32374\\-278.3828\\195\\92.77344\\-280.6223\\195\\90.66068\\-282.2891\\195\\88.86719\\-283.5844\\195\\88.13852\\-284.2422\\195\\84.96094\\-286.8097\\195\\82.93431\\-288.1484\\195\\81.05469\\-289.2015\\195\\79.10156\\-290.6186\\195\\73.24219\\-294.3001\\195\\71.28906\\-295.1003\\195\\67.38281\\-296.8355\\195\\65.42969\\-297.5116\\195\\63.47656\\-298.5597\\195\\61.52344\\-299.1847\\195\\59.57031\\-300.1199\\195\\57.61719\\-300.6887\\195\\55.66406\\-301.1505\\195\\51.75781\\-302.4651\\195\\47.85156\\-303.1282\\195\\43.94531\\-304.3805\\195\\40.03906\\-305.1218\\195\\36.13281\\-306.2234\\195\\30.27344\\-307.0306\\195\\28.32031\\-307.3403\\195\\26.36719\\-307.7484\\195\\22.46094\\-308.2744\\195\\16.60156\\-308.6739\\195\\4.882813\\-309.1445\\195\\-0.9765625\\-309.2982\\195\\-4.882813\\-309.2408\\195\\-20.50781\\-308.6326\\195\\-24.41406\\-308.3658\\195\\-26.36719\\-308.1381\\195" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "247" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "224" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-30.27344\\-307.763\\197\\-32.22656\\-307.3451\\197\\-38.08594\\-306.3169\\197\\-40.03906\\-305.7932\\197\\-41.99219\\-305.0996\\197\\-45.89844\\-304.1604\\197\\-47.85156\\-303.2979\\197\\-51.75781\\-302.405\\197\\-53.71094\\-301.5927\\197\\-57.61719\\-300.2932\\197\\-59.57031\\-299.1782\\197\\-61.52344\\-298.5054\\197\\-63.47656\\-297.3516\\197\\-65.42969\\-296.6338\\197\\-67.38281\\-295.4828\\197\\-69.33594\\-294.7952\\197\\-71.28906\\-293.6132\\197\\-73.24219\\-292.6323\\197\\-75.19531\\-291.2572\\197\\-79.10156\\-288.9738\\197\\-81.05469\\-287.5751\\197\\-83.00781\\-286.3221\\197\\-85.5625\\-284.2422\\197\\-90.50336\\-280.3359\\197\\-92.77344\\-278.3258\\197\\-94.72656\\-276.7715\\197\\-96.67969\\-275.1159\\197\\-98.63281\\-273.2721\\197\\-99.27455\\-272.5234\\197\\-101.4202\\-270.5703\\197\\-104.4922\\-267.4711\\197\\-105.1839\\-266.6641\\197\\-109.0518\\-262.7578\\197\\-110.7942\\-260.8047\\197\\-112.2963\\-258.8516\\197\\-115.4413\\-254.9453\\197\\-116.9241\\-252.9922\\197\\-118.1227\\-251.0391\\197\\-119.4558\\-249.0859\\197\\-120.9375\\-247.1328\\197\\-122.11\\-245.1797\\197\\-123.059\\-243.2266\\197\\-123.9053\\-241.2734\\197\\-124.8644\\-239.3203\\197\\-125.6533\\-237.3672\\197\\-126.6981\\-235.4141\\197\\-127.3878\\-233.4609\\197\\-128.3322\\-231.5078\\197\\-129.4181\\-227.6016\\197\\-130.2178\\-225.6484\\197\\-130.7091\\-223.6953\\197\\-131.0467\\-221.7422\\197\\-131.5458\\-219.7891\\197\\-132.2733\\-217.8359\\197\\-133.3921\\-211.9766\\197\\-133.9111\\-210.0234\\197\\-134.4898\\-206.1172\\197\\-134.8447\\-202.2109\\197\\-135.1303\\-198.3047\\197\\-135.3074\\-194.3984\\197\\-135.5052\\-186.5859\\197\\-135.3001\\-180.7266\\197\\-135.0812\\-176.8203\\197\\-134.5564\\-170.9609\\197\\-134.3479\\-169.0078\\197\\-134.0248\\-167.0547\\197\\-133.1473\\-163.1484\\197\\-132.5409\\-159.2422\\197\\-132.1289\\-157.2891\\197\\-131.4765\\-155.3359\\197\\-130.7123\\-151.4297\\197\\-130.272\\-149.4766\\197\\-129.1551\\-145.5703\\197\\-128.7356\\-143.6172\\197\\-128.1615\\-141.6641\\197\\-127.3049\\-139.7109\\197\\-126.6629\\-137.7578\\197\\-125.6745\\-135.8047\\197\\-124.9158\\-133.8516\\197\\-122.2331\\-127.9922\\197\\-120.938\\-126.0391\\197\\-119.4196\\-124.0859\\197\\-116.7817\\-120.1797\\197\\-115.2536\\-118.2266\\197\\-112.3047\\-115.0527\\197\\-109.4416\\-112.3672\\197\\-106.4453\\-109.9166\\197\\-104.3586\\-108.4609\\197\\-100.5859\\-106.0687\\197\\-98.63281\\-105.2472\\197\\-96.67969\\-104.0724\\197\\-94.72656\\-103.4055\\197\\-92.77344\\-102.5785\\197\\-90.82031\\-101.9209\\197\\-86.91406\\-101.0935\\197\\-84.96094\\-100.4456\\197\\-83.00781\\-99.98709\\197\\-77.14844\\-99.29673\\197\\-73.24219\\-98.49587\\197\\-71.28906\\-98.18163\\197\\-67.38281\\-97.80534\\197\\-59.57031\\-97.15171\\197\\-55.66406\\-96.69\\197\\-51.75781\\-96.34546\\197\\-45.89844\\-96.12513\\197\\-38.08594\\-96.01239\\197\\-34.17969\\-96.04012\\197\\-30.27344\\-96.18494\\197\\-26.36719\\-96.43822\\197\\-24.41406\\-96.69\\197\\-22.46094\\-97.06334\\197\\-16.60156\\-97.89941\\197\\-14.64844\\-98.26994\\197\\-12.69531\\-98.961\\197\\-10.74219\\-99.49586\\197\\-8.789063\\-99.8922\\197\\-6.835938\\-100.6081\\197\\-4.882813\\-101.4384\\197\\0.9765625\\-103.0363\\197\\2.929688\\-103.2003\\197\\4.882813\\-103.093\\197\\6.835938\\-102.6855\\197\\12.69531\\-101.0003\\197\\14.64844\\-100.1735\\197\\16.60156\\-99.74568\\197\\20.50781\\-99.09782\\197\\22.46094\\-98.61455\\197\\24.41406\\-98.23335\\197\\28.32031\\-97.72384\\197\\32.22656\\-97.33835\\197\\36.13281\\-96.78063\\197\\38.08594\\-96.44922\\197\\43.94531\\-95.9427\\197\\51.75781\\-95.5273\\197\\53.71094\\-95.45409\\197\\59.57031\\-95.3886\\197\\61.52344\\-95.43396\\197\\67.38281\\-95.71167\\197\\71.28906\\-96.0363\\197\\73.24219\\-96.24809\\197\\75.19531\\-96.64745\\197\\77.14844\\-97.21841\\197\\81.05469\\-98.00275\\197\\84.96094\\-99.36411\\197\\86.91406\\-99.76325\\197\\88.86719\\-100.3158\\197\\90.82031\\-101.2758\\197\\92.77344\\-101.9324\\197\\94.72656\\-103.0449\\197\\96.67969\\-104.0237\\197\\98.63281\\-105.4056\\197\\102.5391\\-107.6503\\197\\104.4922\\-109.0801\\197\\108.3984\\-112.1788\\197\\110.3516\\-113.9401\\197\\112.3047\\-115.8756\\197\\114.5187\\-118.2266\\197\\116.2109\\-120.3247\\197\\117.3816\\-122.1328\\197\\118.8022\\-124.0859\\197\\122.3958\\-129.9453\\197\\123.1384\\-131.8984\\197\\124.8826\\-135.8047\\197\\125.5562\\-137.7578\\197\\126.5806\\-139.7109\\197\\127.1561\\-141.6641\\197\\127.9374\\-143.6172\\197\\128.5588\\-145.5703\\197\\129.3913\\-149.4766\\197\\130.4325\\-153.3828\\197\\130.7158\\-155.3359\\197\\131.0404\\-159.2422\\197\\131.4598\\-163.1484\\197\\131.9714\\-167.0547\\197\\132.1508\\-169.0078\\197\\132.3496\\-172.9141\\197\\132.4463\\-176.8203\\197\\132.3979\\-182.6797\\197\\132.2229\\-188.5391\\197\\132.0229\\-192.4453\\197\\131.6007\\-198.3047\\197\\131.284\\-204.1641\\197\\131.0012\\-210.0234\\197\\130.6606\\-215.8828\\197\\130.4196\\-217.8359\\197\\129.9982\\-219.7891\\197\\129.4585\\-221.7422\\197\\128.7511\\-225.6484\\197\\128.2935\\-227.6016\\197\\127.4881\\-229.5547\\197\\126.1382\\-233.4609\\197\\125.1746\\-235.4141\\197\\124.5961\\-237.3672\\197\\123.5057\\-239.3203\\197\\122.9323\\-241.2734\\197\\120.9823\\-245.1797\\197\\119.7486\\-247.1328\\197\\118.8019\\-249.0859\\197\\117.5152\\-251.0391\\197\\116.726\\-252.9922\\197\\116.2109\\-253.6949\\197\\112.7223\\-258.8516\\197\\111.2203\\-260.8047\\197\\108.3984\\-264.6621\\197\\106.7814\\-266.6641\\197\\103.4483\\-270.5703\\197\\101.6474\\-272.5234\\197\\98.63281\\-275.4875\\197\\96.67969\\-277.2697\\197\\95.57427\\-278.3828\\197\\92.77344\\-280.9084\\197\\90.82031\\-282.4558\\197\\88.86719\\-283.8864\\197\\84.96094\\-287.0506\\197\\83.00781\\-288.4564\\197\\81.05469\\-289.4236\\197\\79.10156\\-290.8954\\197\\77.14844\\-292.2444\\197\\75.19531\\-293.347\\197\\73.24219\\-294.5796\\197\\71.28906\\-295.2697\\197\\69.33594\\-296.3092\\197\\67.38281\\-296.9692\\197\\63.47656\\-298.7192\\197\\61.52344\\-299.3789\\197\\59.57031\\-300.2991\\197\\55.66406\\-301.2706\\197\\53.71094\\-302.0349\\197\\51.75781\\-302.5646\\197\\47.85156\\-303.2391\\197\\45.89844\\-303.9729\\197\\43.94531\\-304.4959\\197\\40.03906\\-305.2932\\197\\38.08594\\-305.9623\\197\\36.13281\\-306.3582\\197\\30.27344\\-307.185\\197\\26.36719\\-307.9537\\197\\24.41406\\-308.2222\\197\\18.55469\\-308.6739\\197\\12.69531\\-308.9262\\197\\10.74219\\-309.0602\\197\\2.929688\\-309.436\\197\\-0.9765625\\-309.5938\\197\\-6.835938\\-309.4102\\197\\-14.64844\\-308.9527\\197\\-22.46094\\-308.6386\\197\\-26.36719\\-308.3245\\197" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "239" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "225" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.835938\\-309.6707\\199\\-10.74219\\-309.3608\\199\\-16.60156\\-308.976\\199\\-22.46094\\-308.7381\\199\\-28.32031\\-308.2908\\199\\-30.27344\\-308.0167\\199\\-34.17969\\-307.185\\199\\-40.03906\\-306.0753\\199\\-41.99219\\-305.3297\\199\\-45.89844\\-304.3715\\199\\-47.85156\\-303.5492\\199\\-49.80469\\-302.9293\\199\\-51.75781\\-302.5497\\199\\-55.66406\\-301.0668\\199\\-57.61719\\-300.463\\199\\-59.57031\\-299.4296\\199\\-61.52344\\-298.6719\\199\\-63.47656\\-297.5885\\199\\-65.42969\\-296.802\\199\\-67.38281\\-295.7298\\199\\-69.33594\\-294.9542\\199\\-73.24219\\-292.8567\\199\\-75.19531\\-291.489\\199\\-77.14844\\-290.4781\\199\\-80.6776\\-288.1484\\199\\-83.00781\\-286.667\\199\\-86.91406\\-283.3869\\199\\-88.46457\\-282.2891\\199\\-90.82031\\-280.459\\199\\-93.12529\\-278.3828\\199\\-95.47244\\-276.4297\\199\\-98.63281\\-273.5578\\199\\-99.5857\\-272.5234\\199\\-101.7198\\-270.5703\\199\\-104.4922\\-267.8034\\199\\-105.5001\\-266.6641\\199\\-107.4345\\-264.7109\\199\\-110.3516\\-261.6172\\199\\-114.2578\\-256.8891\\199\\-116.2109\\-254.3092\\199\\-122.5036\\-245.1797\\199\\-123.2767\\-243.2266\\199\\-124.3234\\-241.2734\\199\\-125.0933\\-239.3203\\199\\-126.1535\\-237.3672\\199\\-128.6272\\-231.5078\\199\\-129.1675\\-229.5547\\199\\-130.5442\\-225.6484\\199\\-131.3737\\-221.7422\\199\\-132.1197\\-219.7891\\199\\-132.5995\\-217.8359\\199\\-133.3769\\-213.9297\\199\\-133.9388\\-211.9766\\199\\-134.3095\\-210.0234\\199\\-134.9574\\-204.1641\\199\\-135.4765\\-198.3047\\199\\-135.7342\\-194.3984\\199\\-135.8849\\-190.4922\\199\\-135.9404\\-186.5859\\199\\-135.7969\\-182.6797\\199\\-135.5035\\-178.7734\\199\\-134.7281\\-170.9609\\199\\-134.2918\\-167.0547\\199\\-133.9377\\-165.1016\\199\\-133.0853\\-161.1953\\199\\-132.4599\\-157.2891\\199\\-131.9714\\-155.3359\\199\\-131.3223\\-153.3828\\199\\-130.6002\\-149.4766\\199\\-130.1398\\-147.5234\\199\\-129.4284\\-145.5703\\199\\-128.5082\\-141.6641\\199\\-127.7054\\-139.7109\\199\\-126.224\\-135.8047\\199\\-125.1754\\-133.8516\\199\\-124.4236\\-131.8984\\199\\-123.3241\\-129.9453\\199\\-122.5825\\-127.9922\\199\\-118.4896\\-122.1328\\199\\-115.4521\\-118.2266\\199\\-113.7028\\-116.2734\\199\\-112.3047\\-114.8652\\199\\-109.5963\\-112.3672\\199\\-106.4453\\-109.7688\\199\\-104.4922\\-108.3871\\199\\-102.5391\\-107.2801\\199\\-100.5859\\-106.0163\\199\\-98.63281\\-105.2353\\199\\-96.67969\\-104.0694\\199\\-94.72656\\-103.4099\\199\\-92.77344\\-102.5785\\199\\-90.82031\\-101.9328\\199\\-86.91406\\-101.1201\\199\\-84.96094\\-100.4606\\199\\-83.00781\\-100.0078\\199\\-77.14844\\-99.30492\\199\\-75.19531\\-98.96735\\199\\-73.24219\\-98.52093\\199\\-71.28906\\-98.20703\\199\\-67.38281\\-97.82458\\199\\-59.57031\\-97.20924\\199\\-53.71094\\-96.55518\\199\\-51.75781\\-96.39567\\199\\-45.89844\\-96.19598\\199\\-40.03906\\-96.10014\\199\\-34.17969\\-96.13998\\199\\-30.27344\\-96.31681\\199\\-28.32031\\-96.49471\\199\\-22.46094\\-97.33041\\199\\-18.55469\\-97.81061\\199\\-16.60156\\-98.09972\\199\\-14.64844\\-98.64313\\199\\-12.69531\\-99.29108\\199\\-8.789063\\-100.1369\\199\\-6.835938\\-100.9884\\199\\-4.882813\\-101.613\\199\\-2.929688\\-102.1226\\199\\-0.9765625\\-102.8083\\199\\0.9765625\\-103.2618\\199\\2.929688\\-103.3963\\199\\4.882813\\-103.284\\199\\6.835938\\-102.911\\199\\8.789063\\-102.2122\\199\\12.69531\\-101.1768\\199\\14.64844\\-100.3788\\199\\16.60156\\-99.86601\\199\\20.50781\\-99.28004\\199\\24.41406\\-98.42478\\199\\28.32031\\-97.86043\\199\\32.22656\\-97.50174\\199\\36.13281\\-97.00668\\199\\40.03906\\-96.36516\\199\\43.94531\\-96.0246\\199\\49.80469\\-95.70595\\199\\55.66406\\-95.50832\\199\\59.57031\\-95.48494\\199\\63.47656\\-95.60287\\199\\67.38281\\-95.81339\\199\\71.28906\\-96.10014\\199\\73.24219\\-96.32624\\199\\75.11393\\-96.74219\\199\\77.14844\\-97.30604\\199\\81.05469\\-98.08102\\199\\84.96094\\-99.43635\\199\\86.91406\\-99.79752\\199\\88.86719\\-100.4043\\199\\90.82031\\-101.327\\199\\92.77344\\-101.9686\\199\\94.72656\\-103.1025\\199\\96.67969\\-104.0788\\199\\98.63281\\-105.4234\\199\\102.5391\\-107.6578\\199\\104.4922\\-109.0928\\199\\108.6219\\-112.3672\\199\\110.3516\\-113.9372\\199\\112.3047\\-115.8418\\199\\114.5712\\-118.2266\\199\\116.2109\\-120.2487\\199\\117.43\\-122.1328\\199\\118.1641\\-123.061\\199\\120.1172\\-126.0678\\199\\122.5021\\-129.9453\\199\\123.2159\\-131.8984\\199\\124.2084\\-133.8516\\199\\125.754\\-137.7578\\199\\126.709\\-139.7109\\199\\127.304\\-141.6641\\199\\128.1704\\-143.6172\\199\\128.6932\\-145.5703\\199\\129.5644\\-149.4766\\199\\130.1629\\-151.4297\\199\\130.5603\\-153.3828\\199\\131.1791\\-159.2422\\199\\131.4466\\-161.1953\\199\\132.0834\\-165.1016\\199\\132.4208\\-169.0078\\199\\132.5658\\-172.9141\\199\\132.6358\\-176.8203\\199\\132.5783\\-182.6797\\199\\132.4208\\-188.5391\\199\\132.0717\\-196.3516\\199\\131.8436\\-200.2578\\199\\131.4055\\-206.1172\\199\\130.7761\\-215.8828\\199\\130.576\\-217.8359\\199\\130.2386\\-219.7891\\199\\129.6831\\-221.7422\\199\\129.2255\\-223.6953\\199\\128.4241\\-227.6016\\199\\127.6401\\-229.5547\\199\\126.2826\\-233.4609\\199\\125.2526\\-235.4141\\199\\124.6725\\-237.3672\\199\\123.6177\\-239.3203\\199\\122.9989\\-241.2734\\199\\122.1556\\-243.2266\\199\\118.9528\\-249.0859\\199\\117.6758\\-251.0391\\199\\116.8727\\-252.9922\\199\\115.5363\\-254.9453\\199\\114.3138\\-256.8984\\199\\112.9034\\-258.8516\\199\\111.3645\\-260.8047\\199\\108.6554\\-264.7109\\199\\106.4453\\-267.3462\\199\\103.6173\\-270.5703\\199\\101.8317\\-272.5234\\199\\98.63281\\-275.6554\\199\\95.78394\\-278.3828\\199\\92.77344\\-281.1421\\199\\90.82031\\-282.7349\\199\\83.00781\\-288.7478\\199\\81.05469\\-289.7523\\199\\77.14844\\-292.58\\199\\73.24219\\-294.7755\\199\\71.28906\\-295.4558\\199\\69.33594\\-296.4987\\199\\67.38281\\-297.1057\\199\\65.42969\\-298.1135\\199\\61.52344\\-299.5796\\199\\59.57031\\-300.421\\199\\55.66406\\-301.4066\\199\\53.71094\\-302.1874\\199\\51.75781\\-302.6418\\199\\49.80469\\-302.9278\\199\\47.85156\\-303.3633\\199\\45.89844\\-304.1302\\199\\43.94531\\-304.6001\\199\\41.99219\\-304.9687\\199\\40.03906\\-305.4892\\199\\38.08594\\-306.1425\\199\\30.27344\\-307.3658\\199\\26.36719\\-308.1086\\199\\24.41406\\-308.3492\\199\\18.55469\\-308.7615\\199\\12.69531\\-309.0481\\199\\6.835938\\-309.4912\\199\\0.9765625\\-309.7956\\199\\-2.929688\\-309.8337\\199" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "243" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "226" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.789063\\-309.6854\\201\\-10.74219\\-309.5021\\201\\-16.60156\\-309.0739\\201\\-22.46094\\-308.7949\\201\\-28.32031\\-308.3983\\201\\-32.22656\\-307.8486\\201\\-36.13281\\-306.9415\\201\\-40.03906\\-306.2323\\201\\-43.94531\\-304.9443\\201\\-45.89844\\-304.502\\201\\-49.80469\\-303.0297\\201\\-51.75781\\-302.6399\\201\\-53.71094\\-302.0081\\201\\-55.66406\\-301.1588\\201\\-57.61719\\-300.552\\201\\-59.57031\\-299.5971\\201\\-61.52344\\-298.7748\\201\\-63.47656\\-297.8141\\201\\-67.38281\\-296.0161\\201\\-69.33594\\-295.0627\\201\\-71.28906\\-294.2372\\201\\-71.58015\\-294.0078\\201\\-77.14844\\-290.7198\\201\\-79.10156\\-289.3499\\201\\-81.05469\\-288.2508\\201\\-83.00781\\-286.9199\\201\\-86.91406\\-283.6327\\201\\-88.86719\\-282.3304\\201\\-90.82031\\-280.7951\\201\\-91.27269\\-280.3359\\201\\-94.72656\\-277.276\\201\\-95.79258\\-276.4297\\201\\-98.63281\\-273.8233\\201\\-100.5859\\-271.8411\\201\\-102.0121\\-270.5703\\201\\-104.4922\\-268.1139\\201\\-105.8102\\-266.6641\\201\\-107.7275\\-264.7109\\201\\-110.3516\\-261.9262\\201\\-114.2578\\-257.2335\\201\\-114.6055\\-256.8984\\201\\-116.2109\\-254.6842\\201\\-117.2467\\-252.9922\\201\\-120.1992\\-249.0859\\201\\-122.7533\\-245.1797\\201\\-123.5214\\-243.2266\\201\\-124.6212\\-241.2734\\201\\-125.3595\\-239.3203\\201\\-126.5251\\-237.3672\\201\\-127.2609\\-235.4141\\201\\-128.2708\\-233.4609\\201\\-129.4936\\-229.5547\\201\\-130.3236\\-227.6016\\201\\-131.1991\\-223.6953\\201\\-131.9025\\-221.7422\\201\\-132.503\\-219.7891\\201\\-133.3131\\-215.8828\\201\\-133.8976\\-213.9297\\201\\-134.3297\\-211.9766\\201\\-135.5163\\-202.2109\\201\\-135.9271\\-198.3047\\201\\-136.0583\\-196.3516\\201\\-136.26\\-190.4922\\201\\-136.2731\\-186.5859\\201\\-136.1451\\-182.6797\\201\\-135.8699\\-178.7734\\201\\-135.3475\\-174.8672\\201\\-134.2566\\-165.1016\\201\\-133.9111\\-163.1484\\201\\-133.4022\\-161.1953\\201\\-132.3496\\-155.3359\\201\\-131.1909\\-151.4297\\201\\-130.494\\-147.5234\\201\\-129.2254\\-143.6172\\201\\-128.7812\\-141.6641\\201\\-128.2017\\-139.7109\\201\\-127.3049\\-137.7578\\201\\-126.6257\\-135.8047\\201\\-125.5253\\-133.8516\\201\\-124.7484\\-131.8984\\201\\-123.6484\\-129.9453\\201\\-122.827\\-127.9922\\201\\-120.2848\\-124.0859\\201\\-118.1641\\-121.3015\\201\\-114.2578\\-116.6336\\201\\-112.3047\\-114.6856\\201\\-109.7656\\-112.3672\\201\\-106.4453\\-109.6061\\201\\-104.4922\\-108.2244\\201\\-102.5391\\-107.2127\\201\\-100.5859\\-105.9701\\201\\-98.63281\\-105.2195\\201\\-96.67969\\-104.0905\\201\\-94.72656\\-103.4099\\201\\-92.77344\\-102.5938\\201\\-90.82031\\-101.9406\\201\\-86.91406\\-101.1367\\201\\-84.96094\\-100.4882\\201\\-83.00781\\-100.0247\\201\\-81.05469\\-99.75606\\201\\-77.14844\\-99.3286\\201\\-75.19531\\-98.98131\\201\\-73.24219\\-98.53372\\201\\-71.28906\\-98.22447\\201\\-67.38281\\-97.84383\\201\\-59.57031\\-97.28278\\201\\-51.75781\\-96.49471\\201\\-45.89844\\-96.26257\\201\\-41.99219\\-96.20397\\201\\-36.13281\\-96.22552\\201\\-32.22656\\-96.36516\\201\\-30.27344\\-96.51839\\201\\-26.36719\\-97.1084\\201\\-18.55469\\-98.02877\\201\\-16.60156\\-98.41348\\201\\-14.64844\\-99.09543\\201\\-12.69531\\-99.54129\\201\\-10.74219\\-99.88756\\201\\-8.789063\\-100.5167\\201\\-6.835938\\-101.306\\201\\-2.929688\\-102.3869\\201\\-0.9765625\\-103.1171\\201\\0.9765625\\-103.4702\\201\\2.929688\\-103.5732\\201\\4.882813\\-103.4805\\201\\6.835938\\-103.1501\\201\\8.789063\\-102.4388\\201\\10.74219\\-101.8517\\201\\12.69531\\-101.373\\201\\16.60156\\-100.0078\\201\\20.50781\\-99.45045\\201\\22.46094\\-99.11568\\201\\26.36719\\-98.26731\\201\\28.32031\\-98.00507\\201\\34.17969\\-97.41661\\201\\36.13281\\-97.17826\\201\\40.03906\\-96.50646\\201\\41.99219\\-96.27462\\201\\47.85156\\-95.8877\\201\\51.75781\\-95.71167\\201\\55.66406\\-95.60287\\201\\59.57031\\-95.59164\\201\\63.47656\\-95.71625\\201\\69.33594\\-96.02569\\201\\73.24219\\-96.4061\\201\\77.14844\\-97.38028\\201\\81.05469\\-98.1491\\201\\83.00781\\-98.92123\\201\\84.96094\\-99.47995\\201\\86.91406\\-99.84731\\201\\88.86719\\-100.4882\\201\\90.82031\\-101.3683\\201\\92.77344\\-102.0095\\201\\94.72656\\-103.164\\201\\96.67969\\-104.1227\\201\\98.63281\\-105.4635\\201\\102.5391\\-107.6655\\201\\104.4922\\-109.1099\\201\\108.3984\\-112.154\\201\\110.3516\\-113.9134\\201\\112.3047\\-115.7989\\201\\114.6214\\-118.2266\\201\\116.2195\\-120.1797\\201\\117.4805\\-122.1328\\201\\118.1641\\-122.9873\\201\\120.1172\\-125.9359\\201\\122.575\\-129.9453\\201\\123.2894\\-131.8984\\201\\124.3717\\-133.8516\\201\\125.0755\\-135.8047\\201\\126.8144\\-139.7109\\201\\127.4572\\-141.6641\\201\\128.319\\-143.6172\\201\\129.2087\\-147.5234\\201\\130.3101\\-151.4297\\201\\130.6676\\-153.3828\\201\\131.3382\\-159.2422\\201\\132.095\\-163.1484\\201\\132.3496\\-165.1016\\201\\132.5057\\-167.0547\\201\\132.6959\\-170.9609\\201\\132.8125\\-176.8203\\201\\132.7787\\-180.7266\\201\\132.6959\\-184.6328\\201\\132.1825\\-200.2578\\201\\131.9025\\-204.1641\\201\\131.7082\\-206.1172\\201\\130.6995\\-217.8359\\201\\130.4102\\-219.7891\\201\\129.3202\\-223.6953\\201\\128.5156\\-227.6016\\201\\127.0207\\-231.5078\\201\\126.3758\\-233.4609\\201\\125.3236\\-235.4141\\201\\124.7373\\-237.3672\\201\\123.729\\-239.3203\\201\\122.3108\\-243.2266\\201\\122.0703\\-243.5623\\201\\120.1172\\-247.2865\\201\\118.1641\\-250.6284\\201\\117.8409\\-251.0391\\201\\116.9835\\-252.9922\\201\\115.6924\\-254.9453\\201\\114.5399\\-256.8984\\201\\111.4898\\-260.8047\\201\\108.8455\\-264.7109\\201\\106.4453\\-267.5575\\201\\101.9744\\-272.5234\\201\\100.5859\\-273.9214\\201\\96.67969\\-277.6343\\201\\95.95758\\-278.3828\\201\\92.77344\\-281.2863\\201\\88.86719\\-284.524\\201\\86.69411\\-286.1953\\201\\83.00781\\-288.9258\\201\\79.10156\\-291.3281\\201\\77.14844\\-292.7945\\201\\75.00989\\-294.0078\\201\\73.24219\\-294.8861\\201\\71.28906\\-295.5804\\201\\69.33594\\-296.6022\\201\\67.38281\\-297.193\\201\\65.42969\\-298.218\\201\\61.52344\\-299.6053\\201\\59.57031\\-300.4398\\201\\55.66406\\-301.4532\\201\\53.71094\\-302.1927\\201\\51.75781\\-302.6123\\201\\49.80469\\-302.9245\\201\\47.85156\\-303.3788\\201\\45.89844\\-304.1404\\201\\41.99219\\-304.9807\\201\\38.08594\\-306.1613\\201\\32.22656\\-307.1041\\201\\28.32031\\-307.8765\\201\\26.36719\\-308.1614\\201\\22.46094\\-308.5281\\201\\18.55469\\-308.8016\\201\\16.60156\\-308.8803\\201\\12.69531\\-309.1381\\201\\6.835938\\-309.6557\\201\\0.9765625\\-309.8937\\201\\-2.929688\\-309.9277\\201" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "271" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "227" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-32.22656\\-307.4844\\203\\-34.17969\\-306.6061\\203\\-38.08594\\-306.3246\\203\\-40.03906\\-306.0857\\203\\-41.99219\\-304.6846\\203\\-43.94531\\-304.5751\\203\\-47.85156\\-302.925\\203\\-49.80469\\-302.7671\\203\\-51.75781\\-302.2629\\203\\-53.71094\\-301.4862\\203\\-55.66406\\-300.5088\\203\\-57.61719\\-300.2839\\203\\-59.57031\\-299.0259\\203\\-61.52344\\-298.5941\\203\\-63.47656\\-296.9858\\203\\-65.42969\\-296.3446\\203\\-67.38281\\-295.4615\\203\\-71.28906\\-293.4809\\203\\-73.24219\\-292.8369\\203\\-75.19531\\-291.0544\\203\\-77.14844\\-290.5085\\203\\-79.10156\\-288.8061\\203\\-81.05469\\-288.1211\\203\\-83.31948\\-286.1953\\203\\-86.04677\\-284.2422\\203\\-86.91406\\-283.4522\\203\\-88.86719\\-281.9794\\203\\-90.82031\\-280.8991\\203\\-91.36746\\-280.3359\\203\\-94.72656\\-277.4311\\203\\-95.9744\\-276.4297\\203\\-98.63281\\-274.0024\\203\\-100.5859\\-272.0284\\203\\-102.201\\-270.5703\\203\\-104.4922\\-268.305\\203\\-110.3516\\-262.1147\\203\\-114.2578\\-257.4031\\203\\-114.7911\\-256.8984\\203\\-116.2684\\-254.9453\\203\\-117.3937\\-252.9922\\203\\-120.4826\\-249.0859\\203\\-121.6211\\-247.1328\\203\\-122.9309\\-245.1797\\203\\-123.7755\\-243.2266\\203\\-124.8519\\-241.2734\\203\\-125.6419\\-239.3203\\203\\-126.7545\\-237.3672\\203\\-127.5618\\-235.4141\\203\\-128.5707\\-233.4609\\203\\-129.1302\\-231.5078\\203\\-129.9232\\-229.5547\\203\\-130.6122\\-227.6016\\203\\-130.9933\\-225.6484\\203\\-131.56\\-223.6953\\203\\-132.3412\\-221.7422\\203\\-133.202\\-217.8359\\203\\-133.8412\\-215.8828\\203\\-134.2861\\-213.9297\\203\\-134.5993\\-211.9766\\203\\-135.3692\\-206.1172\\203\\-135.9535\\-202.2109\\203\\-136.2565\\-198.3047\\203\\-136.4159\\-194.3984\\203\\-136.5004\\-190.4922\\203\\-136.5125\\-186.5859\\203\\-136.3011\\-180.7266\\203\\-135.9535\\-176.8203\\203\\-135.3369\\-172.9141\\203\\-135.0812\\-170.9609\\203\\-134.4851\\-165.1016\\203\\-134.2448\\-163.1484\\203\\-133.8557\\-161.1953\\203\\-133.3313\\-159.2422\\203\\-132.2706\\-153.3828\\203\\-131.5499\\-151.4297\\203\\-131.0379\\-149.4766\\203\\-130.7465\\-147.5234\\203\\-130.313\\-145.5703\\203\\-129.5386\\-143.6172\\203\\-128.5539\\-139.7109\\203\\-127.6945\\-137.7578\\203\\-126.9585\\-135.8047\\203\\-124.9777\\-131.8984\\203\\-124.0938\\-129.9453\\203\\-123.0217\\-127.9922\\203\\-120.6055\\-124.0859\\203\\-114.2578\\-116.4031\\203\\-112.3047\\-114.5029\\203\\-109.9466\\-112.3672\\203\\-106.4453\\-109.4492\\203\\-104.4922\\-108.0689\\203\\-102.5391\\-107.1523\\203\\-100.5859\\-105.9316\\203\\-98.63281\\-105.2195\\203\\-96.67969\\-104.1026\\203\\-94.72656\\-103.4208\\203\\-92.756\\-102.6016\\203\\-90.82031\\-101.9446\\203\\-86.91406\\-101.1367\\203\\-84.96094\\-100.5035\\203\\-83.00781\\-100.0373\\203\\-77.14844\\-99.33655\\203\\-73.24219\\-98.54671\\203\\-71.28906\\-98.22447\\203\\-69.33594\\-98.03246\\203\\-57.61719\\-97.20924\\203\\-51.75781\\-96.63368\\203\\-47.85156\\-96.41666\\203\\-41.99219\\-96.29829\\203\\-36.13281\\-96.35525\\203\\-32.22656\\-96.5806\\203\\-26.36719\\-97.36919\\203\\-22.46094\\-97.75259\\203\\-18.55469\\-98.30837\\203\\-14.64844\\-99.38361\\203\\-10.74219\\-100.1602\\203\\-8.789063\\-100.945\\203\\-6.835938\\-101.5643\\203\\-4.882813\\-102.0426\\203\\-2.929688\\-102.8334\\203\\-0.9765625\\-103.386\\203\\0.9765625\\-103.6674\\203\\2.929688\\-103.7764\\203\\4.882813\\-103.6674\\203\\6.835938\\-103.3817\\203\\8.789063\\-102.7983\\203\\10.74219\\-102.0253\\203\\12.69531\\-101.5579\\203\\14.64844\\-100.9595\\203\\16.60156\\-100.1735\\203\\18.55469\\-99.79752\\203\\22.46094\\-99.30125\\203\\24.41406\\-98.95526\\203\\26.36719\\-98.43623\\203\\30.27344\\-97.90337\\203\\36.13281\\-97.30428\\203\\41.99219\\-96.42738\\203\\43.94531\\-96.21416\\203\\47.85156\\-95.96622\\203\\51.75781\\-95.80278\\203\\55.66406\\-95.7066\\203\\59.57031\\-95.68514\\203\\63.47656\\-95.81899\\203\\69.33594\\-96.10742\\203\\73.24219\\-96.50646\\203\\77.14844\\-97.45869\\203\\81.05469\\-98.23335\\203\\83.00781\\-99.01854\\203\\84.96094\\-99.52679\\203\\86.91406\\-99.88494\\203\\88.86719\\-100.5618\\203\\90.82031\\-101.4135\\203\\92.77344\\-102.0604\\203\\94.72656\\-103.218\\203\\96.67969\\-104.1653\\203\\98.63281\\-105.4974\\203\\100.5859\\-106.6563\\203\\102.5391\\-107.6759\\203\\104.4922\\-109.1351\\203\\106.4453\\-110.7042\\203\\108.3984\\-112.154\\203\\110.3516\\-113.9018\\203\\112.3047\\-115.7648\\203\\114.6554\\-118.2266\\203\\116.2694\\-120.1797\\203\\117.5197\\-122.1328\\203\\120.327\\-126.0391\\203\\121.4012\\-127.9922\\203\\122.6367\\-129.9453\\203\\123.3573\\-131.8984\\203\\124.4796\\-133.8516\\203\\125.1563\\-135.8047\\203\\126.1405\\-137.7578\\203\\127.6131\\-141.6641\\203\\128.4363\\-143.6172\\203\\129.311\\-147.5234\\203\\130.4232\\-151.4297\\203\\130.7465\\-153.3828\\203\\131.1907\\-157.2891\\203\\131.515\\-159.2422\\203\\131.9975\\-161.1953\\203\\132.3242\\-163.1484\\203\\132.5291\\-165.1016\\203\\132.7883\\-169.0078\\203\\132.9371\\-172.9141\\203\\132.9845\\-176.8203\\203\\132.9216\\-182.6797\\203\\132.5671\\-192.4453\\203\\132.3901\\-200.2578\\203\\132.172\\-204.1641\\203\\131.8359\\-208.0006\\203\\131.3664\\-211.9766\\203\\130.7761\\-217.8359\\203\\130.5151\\-219.7891\\203\\130.0289\\-221.7422\\203\\129.3912\\-223.6953\\203\\128.5592\\-227.6016\\203\\127.9297\\-229.3431\\203\\127.0336\\-231.5078\\203\\126.3758\\-233.4609\\203\\125.3196\\-235.4141\\203\\124.7342\\-237.3672\\203\\123.7497\\-239.3203\\203\\122.3524\\-243.2266\\203\\121.2357\\-245.1797\\203\\120.1172\\-247.3281\\203\\118.1641\\-250.6848\\203\\117.8861\\-251.0391\\203\\116.9705\\-252.9922\\203\\114.5442\\-256.8984\\203\\112.9729\\-258.8516\\203\\109.5332\\-262.7578\\203\\108.6629\\-264.7109\\203\\106.4453\\-267.3049\\203\\105.0548\\-268.6172\\203\\103.2715\\-270.5703\\203\\102.5391\\-271.2273\\203\\101.4367\\-272.5234\\203\\99.28191\\-274.4766\\203\\98.63281\\-275.214\\203\\96.67969\\-277.0342\\203\\95.47822\\-278.3828\\203\\93.33062\\-280.3359\\203\\92.77344\\-280.9455\\203\\90.82031\\-282.6043\\203\\88.86719\\-283.395\\203\\88.01997\\-284.2422\\203\\85.80405\\-286.1953\\203\\84.96094\\-287.1251\\203\\81.05469\\-289.3565\\203\\80.26886\\-290.1016\\203\\77.20686\\-292.0547\\203\\75.19531\\-293.6079\\203\\73.24219\\-294.3265\\203\\71.28906\\-294.8228\\203\\69.33594\\-295.4371\\203\\68.75394\\-295.9609\\203\\67.38281\\-296.7642\\203\\65.42969\\-297.2329\\203\\64.50861\\-297.9141\\203\\63.47656\\-298.4514\\203\\61.52344\\-298.7007\\203\\59.57031\\-299.9348\\203\\57.61719\\-300.2876\\203\\55.66406\\-300.9439\\203\\53.71094\\-301.3079\\203\\51.75781\\-301.4839\\203\\49.80469\\-302.4272\\203\\47.85156\\-302.6891\\203\\45.89844\\-302.8178\\203\\43.94531\\-303.9881\\203\\41.99219\\-304.4516\\203\\40.03906\\-304.5427\\203\\38.08594\\-305.1461\\203\\36.13281\\-306.1109\\203\\32.22656\\-306.3443\\203\\30.27344\\-306.8688\\203\\28.32031\\-307.2518\\203\\26.36719\\-307.4506\\203\\22.46094\\-307.6659\\203\\20.50781\\-307.6878\\203\\18.55469\\-308.202\\203\\16.60156\\-308.4886\\203\\14.64844\\-308.5761\\203\\6.835938\\-308.7249\\203\\-2.929688\\-308.7946\\203\\-8.789063\\-308.7884\\203\\-16.60156\\-308.7051\\203\\-22.46094\\-308.547\\203\\-24.41406\\-307.8235\\203\\-28.32031\\-307.8064\\203" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002199" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "280" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "228" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.91406\\-280.4469\\205\\-88.86719\\-279.2467\\205\\-90.82031\\-278.8235\\205\\-92.77344\\-276.9073\\205\\-94.6841\\-276.4297\\205\\-96.77124\\-274.4766\\205\\-98.63281\\-272.8665\\205\\-100.9994\\-270.5703\\205\\-102.5391\\-268.9271\\205\\-104.4922\\-267.121\\205\\-106.9137\\-264.7109\\205\\-110.6663\\-260.8047\\205\\-111.259\\-258.8516\\205\\-115.2433\\-254.9453\\205\\-116.8887\\-252.9922\\205\\-117.6227\\-251.0391\\205\\-119.4949\\-249.0859\\205\\-120.1172\\-248.2164\\205\\-120.6275\\-247.1328\\205\\-122.2237\\-245.1797\\205\\-123.0844\\-243.2266\\205\\-124.4343\\-241.2734\\205\\-124.7816\\-239.3203\\205\\-125.4198\\-237.3672\\205\\-125.9766\\-236.6317\\205\\-126.578\\-235.4141\\205\\-127.9835\\-233.4609\\205\\-129.0248\\-231.5078\\205\\-129.9072\\-229.5547\\205\\-131.4745\\-223.6953\\205\\-132.4185\\-221.7422\\205\\-133.148\\-217.8359\\205\\-134.0008\\-215.8828\\205\\-134.4161\\-213.9297\\205\\-135.0281\\-208.0703\\205\\-135.6211\\-206.1172\\205\\-135.8838\\-204.1641\\205\\-136.1873\\-200.2578\\205\\-136.387\\-194.3984\\205\\-136.4731\\-188.5391\\205\\-136.453\\-186.5859\\205\\-136.5247\\-182.6797\\205\\-136.323\\-178.7734\\205\\-135.9258\\-174.8672\\205\\-135.2637\\-170.9609\\205\\-134.4601\\-163.1484\\205\\-134.1883\\-161.1953\\205\\-133.2335\\-157.2891\\205\\-132.558\\-153.3828\\205\\-132.0476\\-151.4297\\205\\-131.335\\-149.4766\\205\\-130.5925\\-145.5703\\205\\-129.2555\\-141.6641\\205\\-128.7984\\-139.7109\\205\\-128.1756\\-137.7578\\205\\-127.233\\-135.8047\\205\\-126.4335\\-133.8516\\205\\-125.2294\\-131.8984\\205\\-124.4181\\-129.9453\\205\\-123.1658\\-127.9922\\205\\-122.0787\\-126.0391\\205\\-120.7702\\-124.0859\\205\\-118.1641\\-120.8794\\205\\-117.5106\\-120.1797\\205\\-114.3244\\-116.2734\\205\\-112.3047\\-114.362\\205\\-107.7946\\-110.4141\\205\\-106.4453\\-109.3682\\205\\-104.4922\\-108.0043\\205\\-102.5391\\-107.1305\\205\\-100.5859\\-105.9316\\205\\-98.63281\\-105.2506\\205\\-96.67969\\-104.124\\205\\-94.72656\\-103.4486\\205\\-92.72112\\-102.6016\\205\\-90.82031\\-101.9564\\205\\-86.91406\\-101.16\\205\\-84.96094\\-100.5322\\205\\-83.00781\\-100.0587\\205\\-81.05469\\-99.77975\\205\\-77.14844\\-99.35217\\205\\-75.19531\\-99.02762\\205\\-71.28906\\-98.26994\\205\\-69.33594\\-98.06678\\205\\-57.61719\\-97.30428\\205\\-49.80469\\-96.64745\\205\\-45.89844\\-96.46036\\205\\-41.99219\\-96.42738\\205\\-36.13281\\-96.55518\\205\\-34.17969\\-96.67561\\205\\-26.36719\\-97.57277\\205\\-22.46094\\-97.96541\\205\\-20.50781\\-98.24233\\205\\-16.60156\\-99.26651\\205\\-12.69531\\-99.96237\\205\\-8.789063\\-101.327\\205\\-6.835938\\-101.8119\\205\\-4.882813\\-102.4485\\205\\-2.929688\\-103.2352\\205\\-0.9765625\\-103.6287\\205\\0.9765625\\-103.8879\\205\\2.929688\\-104.0054\\205\\4.882813\\-103.8983\\205\\6.835938\\-103.6095\\205\\8.789063\\-103.1113\\205\\10.74219\\-102.2581\\205\\14.64844\\-101.1829\\205\\16.60156\\-100.4061\\205\\18.55469\\-99.91152\\205\\24.41406\\-99.14849\\205\\28.32031\\-98.29858\\205\\30.27344\\-98.022\\205\\38.08594\\-97.16333\\205\\41.99219\\-96.55518\\205\\43.94531\\-96.31681\\205\\47.85156\\-96.05001\\205\\53.71094\\-95.83874\\205\\57.61719\\-95.79188\\205\\63.47656\\-95.91788\\205\\69.33594\\-96.24242\\205\\71.28906\\-96.4061\\205\\73.24219\\-96.71947\\205\\75.19531\\-97.17826\\205\\79.10156\\-97.89542\\205\\81.05469\\-98.33849\\205\\83.00781\\-99.10056\\205\\84.96094\\-99.58769\\205\\86.91406\\-99.93108\\205\\90.82031\\-101.4653\\205\\92.77344\\-102.126\\205\\94.72656\\-103.274\\205\\96.67969\\-104.1861\\205\\98.63281\\-105.5029\\205\\100.5859\\-106.6563\\205\\102.5391\\-107.6759\\205\\104.4922\\-109.1225\\205\\106.4453\\-110.6778\\205\\108.3984\\-112.1298\\205\\112.3047\\-115.7353\\205\\114.6803\\-118.2266\\205\\116.2694\\-120.1797\\205\\117.5197\\-122.1328\\205\\118.1641\\-122.9093\\205\\120.1172\\-125.7674\\205\\120.379\\-126.0391\\205\\121.4377\\-127.9922\\205\\122.6807\\-129.9453\\205\\123.409\\-131.8984\\205\\124.5212\\-133.8516\\205\\125.2009\\-135.8047\\205\\126.2642\\-137.7578\\205\\126.9745\\-139.7109\\205\\128.5192\\-143.6172\\205\\129.3519\\-147.5234\\205\\129.9688\\-149.4766\\205\\130.4102\\-151.4297\\205\\130.9673\\-155.3359\\205\\131.4361\\-159.2422\\205\\131.7368\\-161.1953\\205\\132.6201\\-165.1016\\205\\132.8316\\-169.0078\\205\\132.9643\\-174.8672\\205\\132.9036\\-182.6797\\205\\132.5092\\-194.3984\\205\\132.3822\\-200.2578\\205\\131.8359\\-202.1914\\205\\130.8335\\-204.1641\\205\\130.7189\\-211.9766\\205\\130.5664\\-215.8828\\205\\129.2646\\-219.7891\\205\\129.1297\\-221.7422\\205\\128.0296\\-225.6484\\205\\127.7061\\-227.6016\\205\\126.937\\-229.5547\\205\\126.3043\\-231.5078\\205\\124.6721\\-233.4609\\205\\124.5117\\-235.4141\\205\\124.0234\\-236.6305\\205\\123.4482\\-237.3672\\205\\122.794\\-239.3203\\205\\122.0703\\-240.7423\\205\\121.6185\\-241.2734\\205\\120.8283\\-243.2266\\205\\120.3021\\-245.1797\\205\\118.5238\\-247.1328\\205\\118.1641\\-248.3921\\205\\117.657\\-249.0859\\205\\116.2109\\-251.8235\\205\\115.1778\\-252.9922\\205\\114.5591\\-254.9453\\205\\112.3047\\-257.1378\\205\\110.3516\\-257.0538\\205\\108.3984\\-258.6074\\205\\106.4453\\-258.2656\\205\\104.4922\\-259.0957\\205\\102.5391\\-259.0469\\205\\100.5859\\-259.0957\\205\\98.63281\\-260.0723\\205\\94.72656\\-260.0723\\205\\92.77344\\-261.0488\\205\\90.82031\\-260.9674\\205\\88.86719\\-261.0488\\205\\86.91406\\-261.3906\\205\\84.96094\\-261.5371\\205\\83.00781\\-262.0254\\205\\81.05469\\-262.0254\\205\\79.10156\\-262.1719\\205\\77.14844\\-262.4323\\205\\75.19531\\-262.5625\\205\\73.24219\\-263.002\\205\\69.33594\\-263.002\\205\\67.38281\\-263.7344\\205\\65.42969\\-263.3438\\205\\63.47656\\-263.4902\\205\\61.52344\\-264.3854\\205\\59.57031\\-263.7344\\205\\55.66406\\-264.2227\\205\\55.17578\\-264.7109\\205\\53.71094\\-265.1992\\205\\51.75781\\-265.2969\\205\\49.80469\\-265.0365\\205\\47.85156\\-265.6875\\205\\45.89844\\-265.6875\\205\\43.94531\\-266.2979\\205\\41.99219\\-266.5664\\205\\39.55078\\-266.6641\\205\\36.13281\\-268.1289\\205\\32.22656\\-267.6406\\205\\30.27344\\-268.9427\\205\\26.36719\\-268.9427\\205\\24.41406\\-269.8379\\205\\22.46094\\-269.8379\\205\\20.50781\\-270.2448\\205\\18.55469\\-270.8145\\205\\16.60156\\-271.1563\\205\\14.64844\\-270.8958\\205\\12.69531\\-271.0586\\205\\10.74219\\-271.5469\\205\\8.789063\\-272.3281\\205\\6.835938\\-272.3839\\205\\4.882813\\-272.7188\\205\\2.929688\\-272.2793\\205\\0.9765625\\-272.7676\\205\\-0.9765625\\-273.1094\\205\\-2.929688\\-273.2559\\205\\-4.882813\\-273.5\\205\\-6.835938\\-273.8906\\205\\-8.789063\\-273.6628\\205\\-10.74219\\-274.2324\\205\\-14.64844\\-274.151\\205\\-16.60156\\-274.7207\\205\\-18.55469\\-274.7207\\205\\-20.50781\\-275.4531\\205\\-28.32031\\-275.4531\\205\\-32.22656\\-276.7552\\205\\-34.17969\\-276.918\\205\\-36.13281\\-277.4063\\205\\-38.08594\\-276.7552\\205\\-40.03906\\-278.0573\\205\\-41.99219\\-278.0573\\205\\-43.94531\\-278.7083\\205\\-47.85156\\-278.7083\\205\\-49.80469\\-279.3594\\205\\-51.75781\\-279.3594\\205\\-53.71094\\-279.6035\\205\\-55.66406\\-280.5313\\205\\-57.61719\\-280.5313\\205\\-59.57031\\-280.9219\\205\\-60.30273\\-280.3359\\205\\-61.52344\\-279.7934\\205\\-63.15104\\-280.3359\\205\\-63.47656\\-280.5801\\205\\-65.42969\\-280.1406\\205\\-69.33594\\-280.1964\\205\\-71.28906\\-280.5801\\205\\-77.14844\\-280.5801\\205\\-79.10156\\-280.1964\\205\\-81.05469\\-280.9219\\205\\-83.00781\\-281.3125\\205\\-84.96094\\-281.8008\\205" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002198" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "282" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "229" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-126.6741\\-227.6016\\207\\-127.9297\\-226.9738\\207\\-128.5482\\-225.6484\\207\\-128.9063\\-223.6953\\207\\-129.8828\\-222.7861\\207\\-130.3415\\-221.7422\\207\\-130.7828\\-219.7891\\207\\-130.9204\\-217.8359\\207\\-131.8359\\-216.7896\\207\\-132.2368\\-215.8828\\207\\-132.6238\\-213.9297\\207\\-132.872\\-208.0703\\207\\-133.7891\\-207.1304\\207\\-134.476\\-206.1172\\207\\-134.6393\\-200.2578\\207\\-134.7892\\-188.5391\\207\\-134.7969\\-186.5859\\207\\-135.7422\\-183.7999\\207\\-136.0307\\-182.6797\\207\\-135.9435\\-178.7734\\207\\-135.7107\\-174.8672\\207\\-135.4465\\-172.9141\\207\\-134.8763\\-170.9609\\207\\-134.6866\\-169.0078\\207\\-134.4125\\-163.1484\\207\\-134.0728\\-161.1953\\207\\-133.0357\\-159.2422\\207\\-132.803\\-155.3359\\207\\-132.5966\\-153.3828\\207\\-131.7274\\-151.4297\\207\\-131.1512\\-149.4766\\207\\-130.6956\\-145.5703\\207\\-130.2059\\-143.6172\\207\\-129.4358\\-141.6641\\207\\-128.4018\\-137.7578\\207\\-127.4515\\-135.8047\\207\\-126.6413\\-133.8516\\207\\-125.4085\\-131.8984\\207\\-124.543\\-129.9453\\207\\-123.2747\\-127.9922\\207\\-122.2199\\-126.0391\\207\\-120.8761\\-124.0859\\207\\-118.1641\\-120.7434\\207\\-117.6348\\-120.1797\\207\\-114.4695\\-116.2734\\207\\-112.3047\\-114.2633\\207\\-107.8525\\-110.4141\\207\\-104.4922\\-107.983\\207\\-102.5391\\-107.1347\\207\\-100.5859\\-105.9701\\207\\-98.63281\\-105.2665\\207\\-96.67969\\-104.1529\\207\\-94.72656\\-103.4702\\207\\-92.65351\\-102.6016\\207\\-90.82031\\-101.9605\\207\\-86.91406\\-101.1733\\207\\-84.96094\\-100.5776\\207\\-83.00781\\-100.0895\\207\\-81.05469\\-99.79752\\207\\-77.14844\\-99.40189\\207\\-75.19531\\-99.14156\\207\\-71.28906\\-98.40234\\207\\-69.33594\\-98.17336\\207\\-65.42969\\-97.91505\\207\\-55.66406\\-97.31898\\207\\-49.80469\\-96.87963\\207\\-45.89844\\-96.64745\\207\\-43.94531\\-96.62012\\207\\-38.08594\\-96.8098\\207\\-34.17969\\-97.07422\\207\\-28.32031\\-97.59159\\207\\-24.41406\\-97.98088\\207\\-22.46094\\-98.26062\\207\\-18.55469\\-99.20896\\207\\-14.64844\\-99.84943\\207\\-12.69531\\-100.4005\\207\\-10.74219\\-101.2344\\207\\-6.835938\\-102.2233\\207\\-4.882813\\-103.0964\\207\\-2.929688\\-103.5999\\207\\0.9765625\\-104.2507\\207\\2.929688\\-104.4599\\207\\4.882813\\-104.2956\\207\\6.835938\\-103.9353\\207\\8.789063\\-103.4362\\207\\12.69531\\-101.9075\\207\\14.64844\\-101.426\\207\\18.55469\\-100.1176\\207\\20.50781\\-99.81549\\207\\26.36719\\-99.02994\\207\\28.32031\\-98.55988\\207\\30.27344\\-98.19846\\207\\32.22656\\-97.93976\\207\\38.08594\\-97.31898\\207\\40.03906\\-97.07422\\207\\43.94531\\-96.47166\\207\\47.85156\\-96.1801\\207\\53.71094\\-95.97908\\207\\57.61719\\-95.9451\\207\\63.47656\\-96.07487\\207\\69.33594\\-96.47166\\207\\71.28906\\-96.70463\\207\\73.24219\\-97.06994\\207\\79.10156\\-98.02164\\207\\81.05469\\-98.55988\\207\\83.00781\\-99.25246\\207\\86.91406\\-100.0333\\207\\88.86719\\-100.8544\\207\\92.77344\\-102.2716\\207\\94.72656\\-103.4048\\207\\96.67969\\-104.3415\\207\\100.5859\\-106.7836\\207\\102.5391\\-107.7767\\207\\104.4922\\-109.2126\\207\\108.3984\\-112.2442\\207\\110.6491\\-114.3203\\207\\111.8601\\-116.2734\\207\\115.6734\\-120.1797\\207\\117.2406\\-122.1328\\207\\118.248\\-124.0859\\207\\120.1172\\-126.4878\\207\\122.0703\\-129.5432\\207\\122.4073\\-129.9453\\207\\122.9452\\-131.8984\\207\\123.83\\-133.8516\\207\\124.9012\\-135.8047\\207\\125.4391\\-137.7578\\207\\126.7034\\-139.7109\\207\\127.0116\\-141.6641\\207\\128.2097\\-143.6172\\207\\128.5015\\-145.5703\\207\\129.3855\\-149.4766\\207\\129.351\\-151.4297\\207\\129.4899\\-153.3828\\207\\130.1651\\-155.3359\\207\\130.2299\\-161.1953\\207\\130.3275\\-163.1484\\207\\131.3065\\-165.1016\\207\\131.4314\\-169.0078\\207\\131.4364\\-170.9609\\207\\131.3477\\-174.8672\\207\\131.121\\-180.7266\\207\\130.9136\\-184.6328\\207\\130.4139\\-192.4453\\207\\130.2426\\-196.3516\\207\\130.0746\\-198.3047\\207\\129.8828\\-198.7523\\207\\127.9297\\-198.5091\\207\\125.9766\\-198.4675\\207\\124.0234\\-198.5488\\207\\118.1641\\-198.5488\\207\\116.2109\\-198.9395\\207\\114.7461\\-200.2578\\207\\114.2578\\-200.4301\\207\\108.3984\\-200.502\\207\\106.4453\\-201.1646\\207\\104.4922\\-200.6205\\207\\102.5391\\-200.5675\\207\\100.5859\\-201.4514\\207\\98.63281\\-201.5895\\207\\97.26563\\-202.2109\\207\\94.72656\\-202.7188\\207\\90.82031\\-202.7188\\207\\88.86719\\-202.2342\\207\\86.91406\\-201.9446\\207\\84.96094\\-201.9668\\207\\83.00781\\-202.1133\\207\\81.05469\\-202.7399\\207\\79.10156\\-202.7399\\207\\75.19531\\-202.875\\207\\73.24219\\-203.0015\\207\\71.95724\\-204.1641\\207\\71.28906\\-204.4814\\207\\70.58377\\-204.1641\\207\\69.33594\\-203.0945\\207\\67.38281\\-202.9855\\207\\65.42969\\-203.3503\\207\\64.45313\\-204.1641\\207\\63.47656\\-204.5213\\207\\59.57031\\-204.5213\\207\\57.61719\\-205.2555\\207\\56.57087\\-206.1172\\207\\55.66406\\-206.3523\\207\\54.25347\\-206.1172\\207\\53.71094\\-205.7103\\207\\51.75781\\-204.641\\207\\49.80469\\-206.177\\207\\45.89844\\-206.6473\\207\\43.94531\\-208.2426\\207\\41.99219\\-208.1313\\207\\40.03906\\-206.4485\\207\\38.08594\\-206.9375\\207\\36.59539\\-208.0703\\207\\36.13281\\-208.2426\\207\\30.27344\\-208.2769\\207\\28.32031\\-208.6563\\207\\26.36719\\-208.4558\\207\\24.41406\\-209.0469\\207\\23.38867\\-210.0234\\207\\22.46094\\-210.5249\\207\\20.50781\\-210.8122\\207\\19.19158\\-211.9766\\207\\18.55469\\-212.2583\\207\\14.64844\\-212.3202\\207\\12.69531\\-212.8404\\207\\10.74219\\-214.8656\\207\\9.632458\\-215.8828\\207\\8.789063\\-216.4451\\207\\6.835938\\-216.9082\\207\\5.67627\\-217.8359\\207\\4.882813\\-218.1119\\207\\2.929688\\-218.1544\\207\\1.464844\\-217.8359\\207\\0.9765625\\-217.4603\\207\\-0.9765625\\-216.5634\\207\\-2.476283\\-217.8359\\207\\-2.792969\\-219.7891\\207\\-3.78418\\-219.7891\\207\\-4.882813\\-219.1613\\207\\-8.789063\\-218.3583\\207\\-12.69531\\-218.2225\\207\\-14.64844\\-219.1613\\207\\-15.38086\\-219.7891\\207\\-16.60156\\-220.0554\\207\\-20.50781\\-220.0909\\207\\-22.46094\\-218.3242\\207\\-24.41406\\-218.427\\207\\-25.85178\\-219.7891\\207\\-26.36719\\-220.1146\\207\\-32.22656\\-220.0909\\207\\-34.17969\\-220.6726\\207\\-36.13281\\-220.1688\\207\\-38.08594\\-221.7625\\207\\-40.03906\\-221.6608\\207\\-41.99219\\-222.4049\\207\\-43.94531\\-222.4746\\207\\-47.85156\\-222.3807\\207\\-51.75781\\-222.5167\\207\\-53.71094\\-222.5017\\207\\-55.17578\\-223.6953\\207\\-55.66406\\-223.9573\\207\\-57.61719\\-222.5167\\207\\-59.57031\\-222.6141\\207\\-60.94638\\-223.6953\\207\\-61.52344\\-224.005\\207\\-63.47656\\-224.0814\\207\\-64.58334\\-223.6953\\207\\-65.42969\\-222.99\\207\\-66.48763\\-223.6953\\207\\-67.38281\\-223.9573\\207\\-69.33594\\-223.8479\\207\\-71.28906\\-222.5444\\207\\-72.9852\\-223.6953\\207\\-73.52941\\-223.6953\\207\\-75.19531\\-222.6061\\207\\-77.14844\\-223.47\\207\\-81.05469\\-224.0906\\207\\-83.00781\\-224.0441\\207\\-84.05413\\-223.6953\\207\\-84.96094\\-223.0271\\207\\-86.01888\\-223.6953\\207\\-86.91406\\-225.4857\\207\\-88.86719\\-224.0906\\207\\-90.82031\\-224.4684\\207\\-92.77344\\-224.1836\\207\\-94.72656\\-224.0912\\207\\-96.67969\\-224.557\\207\\-98.63281\\-224.0906\\207\\-100.5859\\-224.1614\\207\\-102.5391\\-225.8835\\207\\-104.4922\\-225.8835\\207\\-106.4453\\-224.2568\\207\\-108.3984\\-225.5597\\207\\-110.3516\\-224.5498\\207\\-112.3047\\-224.3024\\207\\-114.2578\\-224.2908\\207\\-116.2109\\-225.9449\\207\\-118.1641\\-225.9449\\207\\-120.1172\\-227.6602\\207\\-122.0703\\-226.3809\\207\\-124.0234\\-226.3356\\207\\-125.7324\\-227.6016\\207" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "263" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "230" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-131.8359\\-171.1004\\209\\-132.0539\\-167.0547\\209\\-132.1875\\-163.1484\\209\\-132.0247\\-161.1953\\209\\-130.4726\\-159.2422\\209\\-130.6424\\-153.3828\\209\\-129.862\\-151.4297\\209\\-129.289\\-149.4766\\209\\-129.7689\\-147.5234\\209\\-129.9253\\-145.5703\\209\\-129.2623\\-143.6172\\209\\-128.8806\\-141.6641\\209\\-128.3138\\-139.7109\\209\\-128.0671\\-137.7578\\209\\-126.7183\\-135.8047\\209\\-125.9844\\-133.8516\\209\\-124.0234\\-130.5744\\209\\-123.4444\\-129.9453\\209\\-122.8793\\-127.9922\\209\\-121.2713\\-126.0391\\209\\-120.6172\\-124.0859\\209\\-118.1641\\-121.3917\\209\\-116.2109\\-119.4688\\209\\-115.1808\\-118.2266\\209\\-114.2578\\-117.4084\\209\\-112.3047\\-115.3205\\209\\-111.1424\\-114.3203\\209\\-109.2832\\-112.3672\\209\\-108.3984\\-111.6388\\209\\-106.4453\\-109.6491\\209\\-104.4922\\-108.3361\\209\\-102.5391\\-107.4777\\209\\-100.5859\\-106.9095\\209\\-100.1332\\-106.5078\\209\\-98.63281\\-105.6109\\209\\-94.72656\\-103.7609\\209\\-92.77344\\-103.4784\\209\\-90.82031\\-102.1804\\209\\-86.91406\\-101.8259\\209\\-84.96094\\-100.9606\\209\\-83.00781\\-100.7106\\209\\-81.05469\\-100.5645\\209\\-79.10156\\-99.71162\\209\\-73.24219\\-99.02552\\209\\-69.33594\\-98.40234\\209\\-63.47656\\-97.95643\\209\\-47.85156\\-97.0487\\209\\-45.89844\\-97.01386\\209\\-43.94531\\-97.58422\\209\\-41.99219\\-97.71875\\209\\-32.22656\\-97.79561\\209\\-28.32031\\-97.9567\\209\\-26.36719\\-98.116\\209\\-24.41406\\-99.1729\\209\\-22.46094\\-99.47305\\209\\-18.55469\\-99.67776\\209\\-16.60156\\-99.9035\\209\\-14.64844\\-100.8187\\209\\-12.69531\\-101.2523\\209\\-10.74219\\-101.9525\\209\\-8.789063\\-102.31\\209\\-6.835938\\-103.3208\\209\\-4.882813\\-103.8055\\209\\-2.929688\\-104.1379\\209\\-0.9765625\\-105.5084\\209\\2.929688\\-105.6174\\209\\6.835938\\-105.5371\\209\\8.789063\\-104.1227\\209\\10.74219\\-103.6436\\209\\12.69531\\-102.3978\\209\\14.64844\\-102.0545\\209\\16.60156\\-101.317\\209\\18.55469\\-100.9362\\209\\20.50781\\-100.7161\\209\\22.46094\\-99.89098\\209\\26.36719\\-99.6134\\209\\30.27344\\-99.485\\209\\32.22656\\-98.88697\\209\\34.17969\\-98.04603\\209\\40.03906\\-97.80795\\209\\43.94531\\-97.77141\\209\\45.89844\\-97.30946\\209\\47.85156\\-96.51839\\209\\53.71094\\-96.31153\\209\\57.61719\\-96.28368\\209\\63.47656\\-96.4362\\209\\65.42969\\-96.5806\\209\\67.38281\\-97.703\\209\\69.33594\\-97.78677\\209\\73.24219\\-97.83308\\209\\77.14844\\-98.03548\\209\\78.48987\\-98.69531\\209\\79.10156\\-99.17518\\209\\81.05469\\-99.59724\\209\\83.00781\\-99.7275\\209\\88.86719\\-101.4531\\209\\90.82031\\-102.1475\\209\\92.77344\\-103.56\\209\\94.72656\\-103.9665\\209\\96.67969\\-105.6141\\209\\100.5859\\-107.4283\\209\\102.5391\\-108.8961\\209\\104.4922\\-109.8518\\209\\107.3242\\-112.3672\\209\\108.3984\\-113.5711\\209\\109.2262\\-114.3203\\209\\109.7841\\-116.2734\\209\\111.414\\-118.2266\\209\\113.3827\\-120.1797\\209\\115.2344\\-122.1328\\209\\115.6561\\-124.0859\\209\\117.207\\-126.0391\\209\\118.1641\\-127.0572\\209\\118.5272\\-127.9922\\209\\120.3906\\-129.9453\\209\\120.3451\\-131.8984\\209\\120.4007\\-133.8516\\209\\120.1172\\-134.6506\\209\\118.1641\\-134.5276\\209\\116.5039\\-135.8047\\209\\116.2109\\-136.3906\\209\\114.2578\\-136.7813\\209\\110.3516\\-136.7813\\209\\108.3984\\-137.5137\\209\\104.4922\\-137.5625\\209\\102.5391\\-137.9531\\209\\98.63281\\-137.9531\\209\\96.67969\\-138.4902\\209\\92.77344\\-138.4902\\209\\90.82031\\-138.3438\\209\\88.86719\\-137.9206\\209\\86.91406\\-138.9785\\209\\84.96094\\-138.7344\\209\\83.00781\\-139.0134\\209\\81.05469\\-138.7344\\209\\78.125\\-139.7109\\209\\77.14844\\-139.9551\\209\\75.19531\\-139.9063\\209\\73.24219\\-139.5156\\209\\71.28906\\-140.2969\\209\\69.33594\\-140.0365\\209\\67.38281\\-140.4434\\209\\65.42969\\-141.3385\\209\\63.47656\\-141.4199\\209\\61.52344\\-141.9896\\209\\59.57031\\-143.1289\\209\\57.61719\\-143.373\\209\\55.66406\\-143.4219\\209\\53.71094\\-143.8613\\209\\51.75781\\-143.9427\\209\\49.80469\\-143.8613\\209\\47.85156\\-144.5938\\209\\43.94531\\-145.3262\\209\\41.99219\\-145.082\\209\\39.0625\\-145.5703\\209\\38.08594\\-145.8958\\209\\36.13281\\-145.9365\\209\\34.17969\\-146.5469\\209\\30.27344\\-147.2793\\209\\28.32031\\-147.849\\209\\27.83203\\-147.5234\\209\\26.36719\\-147.1049\\209\\23.92578\\-147.5234\\209\\22.46094\\-148.9883\\209\\20.50781\\-149.151\\209\\18.55469\\-148.221\\209\\16.60156\\-147.4014\\209\\16.40625\\-147.5234\\209\\15.25879\\-149.4766\\209\\17.57813\\-151.4297\\209\\18.35938\\-153.3828\\209\\18.55469\\-153.5223\\209\\19.22286\\-155.3359\\209\\18.55469\\-156.7465\\209\\18.14779\\-157.2891\\209\\16.60156\\-160.6319\\209\\16.11328\\-161.1953\\209\\14.64844\\-162.2173\\209\\13.49198\\-161.1953\\209\\13.73106\\-159.2422\\209\\14.64844\\-158.0313\\209\\15.625\\-157.2891\\209\\15.93339\\-155.3359\\209\\15.80256\\-153.3828\\209\\15.23438\\-151.4297\\209\\14.64844\\-150.6973\\209\\12.69531\\-150.6973\\209\\11.71875\\-147.5234\\209\\10.74219\\-146.73\\209\\9.684245\\-147.5234\\209\\8.789063\\-151.1042\\209\\5.859377\\-151.4297\\209\\4.882813\\-152.4063\\209\\2.929688\\-152.8945\\209\\0.9765625\\-152.4063\\209\\-0.9765625\\-152.4063\\209\\-3.906252\\-151.4297\\209\\-6.835938\\-150.8193\\209\\-8.789063\\-150.7321\\209\\-8.957436\\-151.4297\\209\\-8.789063\\-152.2435\\209\\-8.029513\\-153.3828\\209\\-7.93457\\-155.3359\\209\\-8.32648\\-157.2891\\209\\-8.789063\\-158.7539\\209\\-12.36979\\-157.2891\\209\\-12.69531\\-157.228\\209\\-14.07138\\-155.3359\\209\\-14.64844\\-154.278\\209\\-15.31982\\-153.3828\\209\\-16.60156\\-150.9414\\209\\-20.50781\\-152.1272\\209\\-22.46094\\-152.8945\\209\\-24.41406\\-153.5223\\209\\-26.36719\\-153.9688\\209\\-28.32031\\-155.4754\\209\\-30.27344\\-155.8242\\209\\-32.22656\\-157.0449\\209\\-34.17969\\-157.5332\\209\\-36.13281\\-157.5332\\209\\-40.03906\\-158.998\\209\\-41.01562\\-159.2422\\209\\-40.85286\\-161.1953\\209\\-40.03906\\-162.416\\209\\-38.57422\\-165.1016\\209\\-40.03906\\-165.6875\\209\\-41.99219\\-166.0781\\209\\-43.94531\\-166.7292\\209\\-47.85156\\-166.8105\\209\\-51.75781\\-167.8685\\209\\-53.71094\\-167.8685\\209\\-55.66406\\-168.4219\\209\\-59.57031\\-169.2031\\209\\-65.42969\\-169.9844\\209\\-65.84821\\-169.0078\\209\\-66.16211\\-167.0547\\209\\-67.38281\\-165.4271\\209\\-69.33594\\-165.6875\\209\\-71.28906\\-165.6875\\209\\-73.24219\\-165.9154\\209\\-79.10156\\-165.834\\209\\-81.05469\\-165.6875\\209\\-83.00781\\-164.9063\\209\\-88.86719\\-166.0781\\209\\-90.82031\\-166.3223\\209\\-92.77344\\-166.4688\\209\\-94.72656\\-166.4688\\209\\-96.67969\\-167.2175\\209\\-98.63281\\-167.6406\\209\\-100.5859\\-167.6406\\209\\-102.5391\\-168.0313\\209\\-104.4922\\-168.0313\\209\\-106.4453\\-168.2754\\209\\-108.3984\\-168.4219\\209\\-110.3516\\-168.4219\\209\\-112.3047\\-168.6823\\209\\-114.2578\\-169.1473\\209\\-118.1641\\-169.2031\\209\\-120.1172\\-168.5195\\209\\-122.0703\\-169.1706\\209\\-124.0234\\-169.7054\\209\\-125.9766\\-169.5938\\209\\-129.8828\\-170.4727\\209" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002197" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "231" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "51.75781\\-192.8374\\209\\47.85156\\-191.9751\\209\\45.89844\\-191.3626\\209\\43.94531\\-189.9756\\209\\41.99219\\-188.0658\\209\\40.6562\\-186.5859\\209\\39.25341\\-184.6328\\209\\38.76101\\-182.6797\\209\\38.01957\\-180.7266\\209\\37.71973\\-178.7734\\209\\37.64416\\-176.8203\\209\\37.83308\\-174.8672\\209\\39.07697\\-170.9609\\209\\40.4077\\-169.0078\\209\\41.99219\\-167.0938\\209\\43.94531\\-165.3\\209\\45.89844\\-163.7719\\209\\47.85156\\-162.8125\\209\\51.75781\\-161.8297\\209\\53.71094\\-161.7799\\209\\55.66406\\-161.8635\\209\\57.61719\\-162.2324\\209\\61.52344\\-163.3738\\209\\63.47656\\-165.071\\209\\65.42969\\-167.1659\\209\\66.8288\\-169.0078\\209\\67.50036\\-170.9609\\209\\68.29279\\-172.9141\\209\\68.82983\\-174.8672\\209\\69.01041\\-176.8203\\209\\68.90412\\-178.7734\\209\\68.52979\\-180.7266\\209\\67.87456\\-182.6797\\209\\65.75801\\-186.5859\\209\\64.19906\\-188.5391\\209\\63.47656\\-189.2616\\209\\61.52344\\-190.8434\\209\\59.57031\\-191.5836\\209\\57.61719\\-192.0448\\209\\55.66406\\-192.721\\209\\53.71094\\-192.9473\\209" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "232" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-83.00781\\-104.6361\\211\\-83.00781\\-104.4937\\211\\-81.05469\\-104.4896\\211\\-79.92188\\-102.6016\\211\\-79.10156\\-102.0473\\211\\-78.125\\-100.6484\\211\\-77.14844\\-100.2377\\211\\-73.24219\\-100.1109\\211\\-65.42969\\-100.105\\211\\-63.47656\\-99.59558\\211\\-61.55599\\-98.69531\\211\\-55.66406\\-98.38308\\211\\-45.89844\\-98.39959\\211\\-45.37354\\-98.69531\\211\\-43.94531\\-100.3512\\211\\-41.99219\\-100.5539\\211\\-39.0625\\-100.6484\\211\\-40.03906\\-100.7569\\211\\-43.94531\\-102.1133\\211\\-45.89844\\-102.5625\\211\\-47.85156\\-102.8269\\211\\-49.80469\\-103.5171\\211\\-51.75781\\-103.8385\\211\\-53.71094\\-104.3594\\211\\-55.66406\\-104.4849\\211\\-59.57031\\-104.4937\\211\\-61.52344\\-104.7988\\211\\-63.47656\\-104.4462\\211\\-67.38281\\-104.4896\\211\\-69.33594\\-104.78\\211\\-71.28906\\-105.1761\\211\\-73.24219\\-105.165\\211\\-77.14844\\-104.4896\\211\\-79.10156\\-104.4659\\211\\-81.05469\\-104.6435\\211" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002196" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "233" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "45.89844\\-191.2246\\211\\43.94531\\-189.441\\211\\43.23557\\-188.5391\\211\\41.29895\\-186.5859\\211\\40.03906\\-184.5932\\211\\39.17034\\-182.6797\\211\\38.04656\\-178.7734\\211\\38.06212\\-176.8203\\211\\38.71783\\-174.8672\\211\\39.1344\\-172.9141\\211\\39.90834\\-170.9609\\211\\41.09792\\-169.0078\\211\\43.94531\\-165.7084\\211\\45.89844\\-164.3343\\211\\51.75781\\-162.8821\\211\\53.71094\\-162.8119\\211\\55.66406\\-163.0798\\211\\57.61719\\-163.2176\\211\\59.57031\\-163.7488\\211\\61.52344\\-164.6063\\211\\62.06092\\-165.1016\\211\\63.73312\\-167.0547\\211\\65.42969\\-169.2883\\211\\66.36002\\-170.9609\\211\\67.10085\\-172.9141\\211\\68.543\\-174.8672\\211\\69.14247\\-176.8203\\211\\68.88458\\-178.7734\\211\\67.82362\\-180.7266\\211\\66.90079\\-182.6797\\211\\66.20002\\-184.6328\\211\\64.85324\\-186.5859\\211\\63.47656\\-189.0774\\211\\62.42559\\-190.4922\\211\\61.52344\\-191.2623\\211\\59.57031\\-191.6682\\211\\57.61719\\-191.6891\\211\\53.71094\\-192.2084\\211\\49.80469\\-191.8809\\211\\47.85156\\-191.8428\\211" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002195" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "234" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "45.89844\\-191.5885\\213\\43.94531\\-189.3946\\213\\42.22552\\-186.5859\\213\\40.52734\\-184.6328\\213\\39.52474\\-182.6797\\213\\38.42298\\-180.7266\\213\\38.04688\\-178.7734\\213\\38.09524\\-176.8203\\213\\38.88434\\-174.8672\\213\\39.47303\\-172.9141\\213\\40.57943\\-170.9609\\213\\41.3769\\-169.0078\\213\\43.09824\\-167.0547\\213\\43.94531\\-165.9517\\213\\45.89844\\-164.2711\\213\\47.85156\\-164.0427\\213\\51.75781\\-163.7856\\213\\53.71094\\-163.7527\\213\\55.66406\\-163.8592\\213\\59.57031\\-163.6367\\213\\61.52344\\-164.8556\\213\\64.68461\\-169.0078\\213\\65.85217\\-170.9609\\213\\66.52222\\-172.9141\\213\\68.27126\\-174.8672\\213\\69.87601\\-176.8203\\213\\68.8829\\-178.7734\\213\\66.91108\\-180.7266\\213\\66.41228\\-182.6797\\213\\65.77897\\-184.6328\\213\\64.27361\\-186.5859\\213\\63.60427\\-188.5391\\213\\62.11605\\-190.4922\\213\\61.52344\\-191.0425\\213\\59.57031\\-191.7453\\213\\57.61719\\-191.4547\\213\\53.71094\\-191.7867\\213\\49.80469\\-191.6541\\213\\47.85156\\-192.1294\\213" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "1" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "255\\128\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.822617\\-185.532\\-53\\-3.217159\\-185.016\\-53\\-4.008816\\-184.5845\\-53\\-5.647892\\-183.1425\\-53\\-6.398726\\-182.0491\\-53\\-7.210587\\-180.1176\\-53\\-7.346458\\-179.2563\\-53\\-7.377643\\-177.2732\\-53\\-7.126414\\-176.1662\\-53\\-6.619712\\-174.8111\\-53\\-5.605105\\-173.2615\\-53\\-4.617378\\-172.2797\\-53\\-2.766951\\-171.1722\\-53\\-1.271545\\-170.6588\\-53\\-0.0942254\\-170.4699\\-53\\2.401256\\-170.6252\\-53\\4.452537\\-171.345\\-53\\5.834437\\-172.2258\\-53\\6.781363\\-173.1533\\-53\\7.660157\\-174.3542\\-53\\8.380367\\-175.9948\\-53\\8.713982\\-178.0575\\-53\\8.469196\\-180.1765\\-53\\7.653542\\-182.0623\\-53\\6.902081\\-183.148\\-53\\5.191735\\-184.6208\\-53\\4.422974\\-185.0313\\-53\\3.000576\\-185.5425\\-53\\1.200459\\-185.8655\\-53\\0.01856305\\-185.8689\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.341555\\-188.6337\\-51\\-3.535146\\-188.3137\\-51\\-5.369791\\-187.5508\\-51\\-7.173401\\-186.3121\\-51\\-8.14281\\-185.3723\\-51\\-8.990662\\-184.2822\\-51\\-9.847253\\-182.7528\\-51\\-10.39609\\-181.203\\-51\\-10.71813\\-179.6096\\-51\\-10.77989\\-177.9484\\-51\\-10.54996\\-176.1485\\-51\\-10.1444\\-174.7373\\-51\\-9.088316\\-172.5497\\-51\\-8.272603\\-171.4671\\-51\\-7.298368\\-170.4557\\-51\\-6.209515\\-169.5924\\-51\\-4.749192\\-168.7345\\-51\\-2.19852\\-167.8273\\-51\\-0.6399968\\-167.5823\\-51\\1.771882\\-167.5708\\-51\\4.245574\\-168.0636\\-51\\5.91089\\-168.708\\-51\\7.559203\\-169.6802\\-51\\8.420381\\-170.3498\\-51\\9.505224\\-171.4484\\-51\\10.31162\\-172.5158\\-51\\11.35321\\-174.6068\\-51\\11.81211\\-176.1853\\-51\\11.97659\\-177.2013\\-51\\11.94348\\-179.7251\\-51\\11.63167\\-181.2601\\-51\\10.85321\\-183.1923\\-51\\10.08713\\-184.4571\\-51\\8.580834\\-186.1377\\-51\\6.968125\\-187.3102\\-51\\4.756684\\-188.2898\\-51\\3.254199\\-188.6678\\-51\\1.365167\\-188.914\\-51\\-0.09017476\\-188.9274\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.608414\\-190.8814\\-49\\-2.645632\\-190.735\\-49\\-4.589392\\-190.2724\\-49\\-7.0136\\-189.2481\\-49\\-8.287686\\-188.4489\\-49\\-9.628903\\-187.2869\\-49\\-10.3438\\-186.5149\\-49\\-11.82217\\-184.2494\\-49\\-12.70732\\-181.9412\\-49\\-12.98179\\-180.6998\\-49\\-13.16898\\-178.4189\\-49\\-13.05518\\-176.7242\\-49\\-12.85543\\-175.5786\\-49\\-12.08132\\-173.2456\\-49\\-11.03628\\-171.3663\\-49\\-9.825652\\-169.8201\\-49\\-8.695223\\-168.7595\\-49\\-7.077835\\-167.6154\\-49\\-5.095147\\-166.6542\\-49\\-3.767403\\-166.1914\\-49\\-2.059778\\-165.8097\\-49\\-0.6657854\\-165.6538\\-49\\1.859423\\-165.656\\-49\\3.165309\\-165.8142\\-49\\4.951316\\-166.2173\\-49\\6.370563\\-166.7074\\-49\\8.303261\\-167.6476\\-49\\9.938641\\-168.799\\-49\\11.07829\\-169.8779\\-49\\12.73386\\-172.1206\\-49\\13.48909\\-173.6905\\-49\\14.06981\\-175.5351\\-49\\14.36629\\-177.6962\\-49\\14.37679\\-179.1843\\-49\\13.92681\\-181.9256\\-49\\13.02016\\-184.2536\\-49\\11.53705\\-186.488\\-49\\10.66682\\-187.4052\\-49\\8.596537\\-188.9759\\-49\\7.012528\\-189.7673\\-49\\5.771133\\-190.215\\-49\\3.820653\\-190.6934\\-49\\0.915529\\-190.9782\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.766109\\-192.449\\-47\\-4.545334\\-192.0033\\-47\\-6.383731\\-191.4537\\-47\\-8.912426\\-190.2184\\-47\\-10.74276\\-188.8016\\-47\\-11.76466\\-187.7107\\-47\\-12.85325\\-186.2136\\-47\\-13.4939\\-185.0675\\-47\\-14.16497\\-183.4894\\-47\\-14.80652\\-181.0453\\-47\\-14.9981\\-178.2717\\-47\\-14.73243\\-175.6446\\-47\\-14.22203\\-173.7833\\-47\\-13.71214\\-172.5214\\-47\\-12.9784\\-171.1141\\-47\\-12.20102\\-169.9789\\-47\\-11.17459\\-168.7754\\-47\\-9.609863\\-167.3787\\-47\\-7.623668\\-166.1301\\-47\\-5.717514\\-165.303\\-47\\-3.140729\\-164.6207\\-47\\-0.2983212\\-164.2986\\-47\\1.37434\\-164.3013\\-47\\4.332889\\-164.6626\\-47\\6.884155\\-165.3468\\-47\\8.175083\\-165.8712\\-47\\9.766849\\-166.7243\\-47\\11.6268\\-168.0956\\-47\\13.3617\\-169.9562\\-47\\14.39541\\-171.511\\-47\\15.38894\\-173.6825\\-47\\15.94131\\-175.6663\\-47\\16.11355\\-176.7408\\-47\\16.20782\\-178.5872\\-47\\16.01542\\-181.0023\\-47\\15.35206\\-183.5091\\-47\\14.85419\\-184.6912\\-47\\13.86121\\-186.4645\\-47\\12.95067\\-187.6651\\-47\\11.65571\\-188.9811\\-47\\10.10412\\-190.1278\\-47\\7.54406\\-191.3674\\-47\\5.612908\\-191.9473\\-47\\2.955307\\-192.4017\\-47\\0.9817407\\-192.5283\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.140761\\-193.7074\\-45\\-4.687198\\-193.3627\\-45\\-6.623366\\-192.8527\\-45\\-8.896114\\-191.9043\\-45\\-10.65378\\-190.7969\\-45\\-11.66073\\-189.9634\\-45\\-12.79229\\-188.8113\\-45\\-13.77693\\-187.5283\\-45\\-14.69869\\-185.9812\\-45\\-15.44591\\-184.3086\\-45\\-16.02585\\-182.3833\\-45\\-16.37223\\-180.4318\\-45\\-16.45874\\-179.1066\\-45\\-16.41418\\-177.2073\\-45\\-16.11909\\-175.2643\\-45\\-15.4728\\-173.0481\\-45\\-14.9034\\-171.7483\\-45\\-13.86018\\-169.9272\\-45\\-12.73055\\-168.4862\\-45\\-11.96184\\-167.6871\\-45\\-10.60552\\-166.5473\\-45\\-9.521469\\-165.8239\\-45\\-7.886041\\-164.9711\\-45\\-6.418256\\-164.3974\\-45\\-4.860384\\-163.9617\\-45\\-2.930271\\-163.5989\\-45\\-0.72114\\-163.4032\\-45\\1.8841\\-163.4224\\-45\\3.771169\\-163.6114\\-45\\5.364509\\-163.879\\-45\\7.559484\\-164.4669\\-45\\9.085904\\-165.0659\\-45\\10.46447\\-165.765\\-45\\11.71759\\-166.56\\-45\\13.49652\\-168.0904\\-45\\15.06668\\-169.9921\\-45\\15.72351\\-171.0691\\-45\\16.67154\\-173.0784\\-45\\17.31111\\-175.2739\\-45\\17.6105\\-177.2485\\-45\\17.65084\\-179.2095\\-45\\17.33424\\-181.8578\\-45\\16.62098\\-184.3224\\-45\\15.88099\\-185.9563\\-45\\14.61162\\-187.969\\-45\\12.93161\\-189.8138\\-45\\11.82021\\-190.7118\\-45\\10.06631\\-191.7967\\-45\\7.79474\\-192.7375\\-45\\5.85596\\-193.2606\\-45\\2.902209\\-193.6915\\-45\\0.6107318\\-193.8097\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.947727\\-194.6507\\-43\\-6.683777\\-194.0739\\-43\\-8.366441\\-193.4799\\-43\\-10.49791\\-192.3744\\-43\\-11.74501\\-191.4837\\-43\\-12.83203\\-190.5254\\-43\\-14.53089\\-188.5235\\-43\\-15.66893\\-186.6947\\-43\\-16.35616\\-185.2073\\-43\\-16.88515\\-183.6866\\-43\\-17.36\\-181.7038\\-43\\-17.58575\\-179.8169\\-43\\-17.60777\\-177.949\\-43\\-17.42749\\-176.0556\\-43\\-16.99187\\-174.0566\\-43\\-16.29703\\-172.1052\\-43\\-15.68627\\-170.8136\\-43\\-14.61173\\-169.1167\\-43\\-13.76594\\-168.0586\\-43\\-12.5461\\-166.8405\\-43\\-10.72443\\-165.4708\\-43\\-9.581362\\-164.8218\\-43\\-8.044\\-164.128\\-43\\-6.546018\\-163.6264\\-43\\-3.792288\\-163.0456\\-43\\-2.35171\\-162.8714\\-43\\0.1365536\\-162.7499\\-43\\3.502366\\-162.9258\\-43\\5.039333\\-163.1376\\-43\\7.561336\\-163.6948\\-43\\9.051079\\-164.1841\\-43\\10.7699\\-164.9427\\-43\\12.85463\\-166.232\\-43\\14.07534\\-167.2561\\-43\\15.80034\\-169.1895\\-43\\16.66054\\-170.4831\\-43\\17.49128\\-172.1681\\-43\\18.18336\\-174.1126\\-43\\18.61912\\-176.1209\\-43\\18.7822\\-177.8264\\-43\\18.76648\\-179.8252\\-43\\18.54255\\-181.6972\\-43\\18.06285\\-183.6877\\-43\\17.53193\\-185.1978\\-43\\16.81882\\-186.7126\\-43\\16.17732\\-187.8007\\-43\\14.8746\\-189.5352\\-43\\13.99732\\-190.4683\\-43\\12.89922\\-191.4061\\-43\\11.12269\\-192.5905\\-43\\9.515988\\-193.361\\-43\\7.735961\\-193.9766\\-43\\5.124373\\-194.5478\\-43\\2.327199\\-194.8432\\-43\\0.5318326\\-194.9219\\-43\\-1.1571\\-194.8876\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.27534\\-195.8569\\-41\\-4.335244\\-195.623\\-41\\-5.918368\\-195.3287\\-41\\-8.253383\\-194.6237\\-41\\-9.518801\\-194.0752\\-41\\-11.41795\\-192.9626\\-41\\-12.81964\\-191.8723\\-41\\-14.07298\\-190.6338\\-41\\-14.98739\\-189.5319\\-41\\-16.48104\\-187.1359\\-41\\-17.2977\\-185.3021\\-41\\-18.10059\\-182.599\\-41\\-18.4371\\-180.3407\\-41\\-18.50148\\-178.2657\\-41\\-18.35611\\-176.4015\\-41\\-17.94641\\-174.1963\\-41\\-17.14885\\-171.8785\\-41\\-16.44548\\-170.4306\\-41\\-15.30129\\-168.6468\\-41\\-13.39483\\-166.5619\\-41\\-11.68497\\-165.2527\\-41\\-9.149891\\-163.9167\\-41\\-6.475635\\-163.0583\\-41\\-4.695973\\-162.7053\\-41\\-2.095681\\-162.4253\\-41\\0.1862088\\-162.355\\-41\\3.279232\\-162.4901\\-41\\6.518366\\-162.9473\\-41\\8.719695\\-163.4903\\-41\\11.35423\\-164.5342\\-41\\12.86096\\-165.3879\\-41\\14.68143\\-166.7743\\-41\\15.8761\\-168.0039\\-41\\16.82797\\-169.203\\-41\\17.62696\\-170.5009\\-41\\18.75608\\-173.0168\\-41\\19.35952\\-175.256\\-41\\19.67778\\-178.2775\\-41\\19.61115\\-180.3702\\-41\\19.05021\\-183.5517\\-41\\18.46996\\-185.3001\\-41\\17.93382\\-186.5632\\-41\\17.15242\\-188.0015\\-41\\16.15121\\-189.4989\\-41\\15.2311\\-190.5983\\-41\\13.99592\\-191.7868\\-41\\12.5863\\-192.862\\-41\\10.68986\\-193.9503\\-41\\8.988591\\-194.651\\-41\\7.111657\\-195.1968\\-41\\5.070956\\-195.5813\\-41\\3.444153\\-195.7864\\-41\\0.9071178\\-195.934\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "6.883477\\-196.1855\\-39\\3.31687\\-196.7449\\-39\\0.1840343\\-196.8911\\-39\\-2.168188\\-196.8065\\-39\\-5.131364\\-196.4182\\-39\\-6.865339\\-196.0183\\-39\\-8.391089\\-195.5025\\-39\\-10.35013\\-194.5941\\-39\\-12.31495\\-193.3082\\-39\\-14.41963\\-191.373\\-39\\-15.44767\\-190.1358\\-39\\-17.01392\\-187.6382\\-39\\-17.95422\\-185.5337\\-39\\-18.60554\\-183.4256\\-39\\-18.94471\\-181.7539\\-39\\-19.14719\\-179.9703\\-39\\-19.15868\\-177.733\\-39\\-18.9477\\-175.797\\-39\\-18.21297\\-172.8511\\-39\\-17.34949\\-170.792\\-39\\-16.36503\\-169.1001\\-39\\-14.84135\\-167.176\\-39\\-13.37627\\-165.8261\\-39\\-11.26581\\-164.4245\\-39\\-9.478131\\-163.5988\\-39\\-7.785415\\-163.0387\\-39\\-5.800844\\-162.5915\\-39\\-2.845564\\-162.2306\\-39\\-0.296187\\-162.1483\\-39\\2.879539\\-162.2264\\-39\\5.571328\\-162.5124\\-39\\7.021233\\-162.7483\\-39\\8.998903\\-163.2188\\-39\\10.64914\\-163.7668\\-39\\12.47289\\-164.611\\-39\\14.57109\\-165.9861\\-39\\16.06158\\-167.3453\\-39\\16.83329\\-168.2302\\-39\\17.80139\\-169.6003\\-39\\18.5317\\-170.8773\\-39\\19.2148\\-172.4211\\-39\\19.70044\\-173.9077\\-39\\20.11936\\-175.8158\\-39\\20.33403\\-177.7819\\-39\\20.32064\\-179.9968\\-39\\20.11448\\-181.7866\\-39\\19.77521\\-183.4439\\-39\\19.11833\\-185.5512\\-39\\18.17838\\-187.6401\\-39\\16.6192\\-190.1019\\-39\\15.58879\\-191.3326\\-39\\14.57395\\-192.329\\-39\\12.9265\\-193.6254\\-39\\11.5263\\-194.4823\\-39\\9.278243\\-195.4815\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "58" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.3652583\\-197.7523\\-37\\-2.84042\\-197.6062\\-37\\-5.249024\\-197.2277\\-37\\-7.959698\\-196.4566\\-37\\-9.176228\\-195.9621\\-37\\-10.75031\\-195.1422\\-37\\-12.37077\\-194.0488\\-37\\-14.18201\\-192.4338\\-37\\-15.01975\\-191.5288\\-37\\-16.36035\\-189.7464\\-37\\-17.25987\\-188.2488\\-37\\-18.20497\\-186.2015\\-37\\-18.99448\\-183.8128\\-37\\-19.40045\\-181.9088\\-37\\-19.62643\\-179.4507\\-37\\-19.59429\\-177.4891\\-37\\-19.37653\\-175.6184\\-37\\-19.02017\\-174.0032\\-37\\-18.41396\\-172.151\\-37\\-17.85656\\-170.8487\\-37\\-16.68548\\-168.8338\\-37\\-14.89802\\-166.6857\\-37\\-13.4893\\-165.4794\\-37\\-12.39336\\-164.7149\\-37\\-10.0785\\-163.5587\\-37\\-8.660318\\-163.0602\\-37\\-7.077616\\-162.6559\\-37\\-5.030459\\-162.3145\\-37\\-2.545675\\-162.0878\\-37\\-0.6050572\\-162.0288\\-37\\1.834189\\-162.0677\\-37\\4.870774\\-162.2885\\-37\\7.004755\\-162.5879\\-37\\9.824748\\-163.2504\\-37\\11.28433\\-163.7707\\-37\\13.48506\\-164.8479\\-37\\14.67924\\-165.6614\\-37\\16.14462\\-166.9021\\-37\\17.85059\\-168.9353\\-37\\19.03722\\-170.9476\\-37\\19.58371\\-172.214\\-37\\20.18371\\-174.0237\\-37\\20.55072\\-175.665\\-37\\20.76628\\-177.5179\\-37\\20.79492\\-179.6206\\-37\\20.55993\\-181.9842\\-37\\20.1623\\-183.8388\\-37\\19.37411\\-186.2137\\-37\\18.41123\\-188.2842\\-37\\16.8483\\-190.6992\\-37\\15.76595\\-191.9756\\-37\\13.64206\\-193.9089\\-37\\11.95624\\-195.0376\\-37\\9.522807\\-196.2016\\-37\\7.614946\\-196.8369\\-37\\6.393201\\-197.1375\\-37\\4.028552\\-197.5366\\-37\\1.585741\\-197.7315\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.011054\\-198.45\\-35\\-3.515336\\-198.2757\\-35\\-5.820865\\-197.8132\\-35\\-8.492883\\-196.9121\\-35\\-10.33341\\-195.9786\\-35\\-11.73128\\-195.1129\\-35\\-12.78396\\-194.3101\\-35\\-15.02464\\-192.1009\\-35\\-16.20895\\-190.5655\\-35\\-17.17096\\-189.049\\-35\\-18.33889\\-186.6698\\-35\\-19.16713\\-184.2496\\-35\\-19.6025\\-182.3057\\-35\\-19.795\\-180.8852\\-35\\-19.87189\\-178.8853\\-35\\-19.79253\\-176.8255\\-35\\-19.60343\\-175.46\\-35\\-19.16522\\-173.5886\\-35\\-18.36777\\-171.3731\\-35\\-16.93981\\-168.8086\\-35\\-15.47414\\-166.9951\\-35\\-14.23786\\-165.8372\\-35\\-12.23188\\-164.456\\-35\\-10.69007\\-163.6889\\-35\\-9.492958\\-163.2328\\-35\\-7.84963\\-162.7676\\-35\\-5.719952\\-162.3644\\-35\\-4.173187\\-162.184\\-35\\-1.681149\\-162.0459\\-35\\0.144162\\-162.037\\-35\\3.238762\\-162.1386\\-35\\6.88022\\-162.5323\\-35\\9.023931\\-162.9675\\-35\\10.75736\\-163.476\\-35\\13.31658\\-164.6056\\-35\\15.37676\\-165.9858\\-35\\16.63979\\-167.1398\\-35\\18.14849\\-168.9837\\-35\\19.53145\\-171.4421\\-35\\20.56552\\-174.5061\\-35\\20.96635\\-176.8945\\-35\\21.0423\\-179.024\\-35\\20.97064\\-180.8634\\-35\\20.77291\\-182.3294\\-35\\20.33835\\-184.2698\\-35\\19.50653\\-186.6964\\-35\\18.34611\\-189.0515\\-35\\16.86303\\-191.2905\\-35\\15.80127\\-192.5407\\-35\\13.99531\\-194.2418\\-35\\12.40674\\-195.3945\\-35\\9.707335\\-196.8209\\-35\\6.990014\\-197.741\\-35\\4.667814\\-198.2197\\-35\\3.190203\\-198.4089\\-35\\0.5833686\\-198.547\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.9237666\\-199.18\\-33\\2.717184\\-199.114\\-33\\4.315667\\-198.9167\\-33\\6.102829\\-198.5715\\-33\\9.199105\\-197.5732\\-33\\11.28817\\-196.5405\\-33\\12.50523\\-195.7674\\-33\\13.84302\\-194.7506\\-33\\14.92268\\-193.7848\\-33\\16.81388\\-191.6602\\-33\\18.52025\\-189.0442\\-33\\19.76457\\-186.3371\\-33\\20.14809\\-185.2369\\-33\\20.77979\\-182.741\\-33\\21.00422\\-181.1959\\-33\\21.12359\\-179.018\\-33\\20.98653\\-176.5416\\-33\\20.55878\\-174.2877\\-33\\19.96604\\-172.3991\\-33\\19.5264\\-171.3693\\-33\\18.52998\\-169.5264\\-33\\17.69972\\-168.3344\\-33\\16.80214\\-167.3034\\-33\\14.96535\\-165.6799\\-33\\13.39843\\-164.6786\\-33\\10.90186\\-163.5725\\-33\\8.356034\\-162.8876\\-33\\5.223742\\-162.3858\\-33\\2.483041\\-162.1695\\-33\\-1.293987\\-162.1078\\-33\\-4.056855\\-162.244\\-33\\-6.059783\\-162.4789\\-33\\-9.004567\\-163.121\\-33\\-10.69523\\-163.7302\\-33\\-12.17222\\-164.4402\\-33\\-14.42947\\-165.9964\\-33\\-15.65638\\-167.1688\\-33\\-16.65851\\-168.3688\\-33\\-17.57818\\-169.775\\-33\\-18.79206\\-172.3076\\-33\\-19.40941\\-174.2853\\-33\\-19.81692\\-176.4846\\-33\\-19.95404\\-178.8181\\-33\\-19.83517\\-181.1443\\-33\\-19.61795\\-182.6488\\-33\\-19.2083\\-184.4238\\-33\\-18.59839\\-186.2833\\-33\\-17.35473\\-188.9958\\-33\\-15.65456\\-191.6227\\-33\\-13.85898\\-193.6727\\-33\\-11.72565\\-195.4899\\-33\\-9.805804\\-196.7376\\-33\\-7.863381\\-197.6676\\-33\\-4.901328\\-198.6204\\-33\\-1.986058\\-199.0976\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "57" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "2.660912\\-199.6445\\-31\\4.226826\\-199.4462\\-31\\6.097453\\-199.0435\\-31\\7.896241\\-198.4689\\-31\\9.824241\\-197.6435\\-31\\10.8982\\-197.066\\-31\\12.3295\\-196.118\\-31\\14.01524\\-194.7723\\-31\\16.01427\\-192.7027\\-31\\17.05584\\-191.3518\\-31\\18.34218\\-189.2645\\-31\\19.24446\\-187.4211\\-31\\20.12814\\-184.9806\\-31\\20.54638\\-183.3534\\-31\\20.95838\\-180.4412\\-31\\20.9555\\-177.5709\\-31\\20.55608\\-174.8552\\-31\\19.94983\\-172.7844\\-31\\18.795\\-170.2538\\-31\\17.86502\\-168.8378\\-31\\16.46647\\-167.1849\\-31\\15.38389\\-166.2226\\-31\\13.51335\\-164.9364\\-31\\12.64582\\-164.4844\\-31\\10.32381\\-163.5727\\-31\\8.893404\\-163.1776\\-31\\6.505832\\-162.7141\\-31\\5.050382\\-162.527\\-31\\2.347314\\-162.3247\\-31\\-0.4595994\\-162.2558\\-31\\-3.967167\\-162.3983\\-31\\-7.341415\\-162.8928\\-31\\-9.122101\\-163.3443\\-31\\-11.0698\\-164.0863\\-31\\-12.28379\\-164.6953\\-31\\-13.70665\\-165.6371\\-31\\-15.32403\\-167.0487\\-31\\-16.68543\\-168.6904\\-31\\-17.64228\\-170.1695\\-31\\-18.78241\\-172.7049\\-31\\-19.38939\\-174.796\\-31\\-19.78473\\-177.5036\\-31\\-19.78773\\-180.3918\\-31\\-19.37545\\-183.3009\\-31\\-18.95291\\-184.9476\\-31\\-18.09381\\-187.3181\\-31\\-17.18\\-189.1844\\-31\\-15.88642\\-191.2932\\-31\\-14.81701\\-192.6714\\-31\\-12.63814\\-194.9186\\-31\\-11.07162\\-196.1511\\-31\\-9.025517\\-197.4393\\-31\\-7.531065\\-198.1386\\-31\\-4.926319\\-199.056\\-31\\-3.031982\\-199.4621\\-31\\-1.515858\\-199.6529\\-31\\0.7690603\\-199.7182\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "58" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "1.412349\\-200.0875\\-29\\3.219846\\-199.9358\\-29\\4.670805\\-199.6858\\-29\\6.861041\\-199.0859\\-29\\8.47685\\-198.4476\\-29\\10.25429\\-197.5354\\-29\\12.7034\\-195.8563\\-29\\14.17598\\-194.5401\\-29\\15.33043\\-193.2992\\-29\\16.49088\\-191.8359\\-29\\17.56162\\-190.1828\\-29\\18.38729\\-188.6836\\-29\\19.47412\\-186.0897\\-29\\20.10225\\-183.965\\-29\\20.55823\\-181.4346\\-29\\20.65493\\-178.4025\\-29\\20.54999\\-176.7789\\-29\\20.19482\\-174.8399\\-29\\19.77271\\-173.3128\\-29\\19.15315\\-171.7258\\-29\\18.3006\\-170.0972\\-29\\16.83395\\-168.0862\\-29\\15.78183\\-167.0124\\-29\\13.85394\\-165.5461\\-29\\12.41315\\-164.7274\\-29\\11.27372\\-164.2252\\-29\\8.254211\\-163.3058\\-29\\6.320167\\-162.9473\\-29\\3.673314\\-162.647\\-29\\-0.3223828\\-162.4922\\-29\\-2.568819\\-162.5553\\-29\\-5.216539\\-162.7949\\-29\\-7.057449\\-163.1081\\-29\\-8.775189\\-163.5559\\-29\\-11.27512\\-164.5356\\-29\\-12.69376\\-165.3564\\-29\\-14.61176\\-166.8408\\-29\\-15.66345\\-167.9321\\-29\\-17.1428\\-169.9929\\-29\\-17.98554\\-171.6288\\-29\\-18.60535\\-173.2359\\-29\\-19.0226\\-174.7456\\-29\\-19.3792\\-176.7111\\-29\\-19.47831\\-179.7989\\-29\\-19.3891\\-181.3425\\-29\\-18.92397\\-183.9145\\-29\\-18.26879\\-186.1048\\-29\\-17.17722\\-188.6788\\-29\\-15.81327\\-191.0266\\-29\\-14.4059\\-192.9133\\-29\\-13.07098\\-194.3863\\-29\\-11.61316\\-195.7147\\-29\\-10.07028\\-196.856\\-29\\-8.101531\\-198.0305\\-29\\-5.634142\\-199.0816\\-29\\-3.475472\\-199.68\\-29\\-2.032731\\-199.9321\\-29\\-0.2768756\\-200.085\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.481232\\-199.746\\-27\\-5.013044\\-199.3006\\-27\\-7.25056\\-198.3716\\-27\\-8.585252\\-197.6228\\-27\\-11.1061\\-195.8249\\-27\\-13.23437\\-193.7473\\-27\\-14.42582\\-192.315\\-27\\-15.43683\\-190.8579\\-27\\-16.57709\\-188.8754\\-27\\-17.785\\-186.0533\\-27\\-18.49081\\-183.6031\\-27\\-18.79461\\-181.9119\\-27\\-18.9603\\-180.2495\\-27\\-18.93498\\-177.6739\\-27\\-18.7735\\-176.2413\\-27\\-18.40058\\-174.4273\\-27\\-17.72743\\-172.4099\\-27\\-16.46043\\-169.93\\-27\\-14.82731\\-167.8201\\-27\\-13.49565\\-166.5749\\-27\\-11.70075\\-165.3324\\-27\\-10.14801\\-164.5412\\-27\\-7.98289\\-163.7732\\-27\\-5.466483\\-163.2217\\-27\\-3.201627\\-162.9633\\-27\\0.7001616\\-162.8449\\-27\\4.365788\\-163.0684\\-27\\6.65586\\-163.3797\\-27\\9.191432\\-163.975\\-27\\11.30018\\-164.7283\\-27\\12.86595\\-165.5231\\-27\\14.7683\\-166.832\\-27\\15.99012\\-167.9712\\-27\\17.62197\\-170.0456\\-27\\18.37139\\-171.3631\\-27\\19.12995\\-173.1078\\-27\\19.56762\\-174.4957\\-27\\19.94318\\-176.3027\\-27\\20.10716\\-177.7353\\-27\\20.13619\\-180.2916\\-27\\19.96795\\-181.9967\\-27\\19.67255\\-183.6552\\-27\\18.95786\\-186.1509\\-27\\17.99604\\-188.4773\\-27\\17.21602\\-189.968\\-27\\15.59781\\-192.4395\\-27\\13.60563\\-194.7172\\-27\\12.31807\\-195.9032\\-27\\9.974627\\-197.5729\\-27\\8.451646\\-198.4279\\-27\\6.240468\\-199.333\\-27\\4.03852\\-199.9206\\-27\\1.516819\\-200.2208\\-27\\-0.3991877\\-200.2114\\-27\\-1.633978\\-200.0908\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.185663\\-200.1234\\-25\\3.256205\\-199.9214\\-25\\5.832376\\-199.2668\\-25\\7.611921\\-198.543\\-25\\9.582726\\-197.4335\\-25\\11.26943\\-196.23\\-25\\13.54712\\-194.0715\\-25\\14.58444\\-192.8494\\-25\\16.24645\\-190.4324\\-25\\17.27654\\-188.506\\-25\\18.34132\\-185.8458\\-25\\18.95859\\-183.5814\\-25\\19.33558\\-181.1944\\-25\\19.4011\\-178.3316\\-25\\19.10145\\-175.8849\\-25\\18.66952\\-174.1868\\-25\\18.18242\\-172.7807\\-25\\17.34504\\-171.055\\-25\\16.17856\\-169.3289\\-25\\15.37545\\-168.4019\\-25\\13.35405\\-166.6551\\-25\\11.90313\\-165.7527\\-25\\10.7535\\-165.1932\\-25\\8.61746\\-164.4069\\-25\\5.583602\\-163.7381\\-25\\3.198856\\-163.44\\-25\\-0.4785639\\-163.3213\\-25\\-2.008536\\-163.3704\\-25\\-4.400415\\-163.6136\\-25\\-6.264466\\-163.9456\\-25\\-8.370073\\-164.5317\\-25\\-10.745\\-165.5811\\-25\\-12.508\\-166.7241\\-25\\-14.22305\\-168.2729\\-25\\-15.58332\\-169.9987\\-25\\-16.36557\\-171.3024\\-25\\-17.02022\\-172.7041\\-25\\-17.50209\\-174.1138\\-25\\-17.93183\\-175.8206\\-25\\-18.22518\\-178.2495\\-25\\-18.15415\\-181.1573\\-25\\-17.76797\\-183.5519\\-25\\-17.16986\\-185.7233\\-25\\-16.08179\\-188.4207\\-25\\-15.03626\\-190.3443\\-25\\-13.43329\\-192.6635\\-25\\-12.3151\\-193.9789\\-25\\-10.12761\\-196.0521\\-25\\-8.417209\\-197.3008\\-25\\-6.853009\\-198.2316\\-25\\-5.414006\\-198.8908\\-25\\-3.802698\\-199.4691\\-25\\-2.132722\\-199.8714\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.07837604\\-199.6779\\-23\\2.431958\\-199.5861\\-23\\3.436413\\-199.4285\\-23\\5.20365\\-198.9564\\-23\\7.654629\\-197.9007\\-23\\9.649947\\-196.6496\\-23\\11.49915\\-195.1177\\-23\\13.54391\\-192.9075\\-23\\15.02104\\-190.8191\\-23\\15.83574\\-189.4024\\-23\\16.74062\\-187.5359\\-23\\17.30989\\-186.0417\\-23\\18.07808\\-183.1658\\-23\\18.38577\\-180.8733\\-23\\18.4127\\-178.3936\\-23\\18.31808\\-177.3272\\-23\\17.8785\\-175.0415\\-23\\17.33068\\-173.4198\\-23\\16.54432\\-171.714\\-23\\15.48916\\-170.0771\\-23\\14.27016\\-168.6671\\-23\\13.16352\\-167.6805\\-23\\11.8863\\-166.7685\\-23\\9.741194\\-165.6643\\-23\\7.9375\\-165.0112\\-23\\5.268491\\-164.3885\\-23\\3.180732\\-164.1257\\-23\\1.261507\\-163.9848\\-23\\-1.996709\\-164.0643\\-23\\-4.110225\\-164.2878\\-23\\-5.502007\\-164.5465\\-23\\-7.774304\\-165.1954\\-23\\-9.37663\\-165.8759\\-23\\-11.09252\\-166.86\\-23\\-12.16324\\-167.671\\-23\\-13.86175\\-169.3726\\-23\\-14.94153\\-170.859\\-23\\-16.12964\\-173.227\\-23\\-16.70781\\-174.972\\-23\\-17.14531\\-177.2835\\-23\\-17.23403\\-178.3416\\-23\\-17.20185\\-180.8079\\-23\\-16.88508\\-183.0977\\-23\\-16.4387\\-184.8998\\-23\\-15.76538\\-186.8796\\-23\\-14.99123\\-188.5945\\-23\\-13.77763\\-190.7324\\-23\\-12.35614\\-192.7228\\-23\\-10.27783\\-194.9755\\-23\\-8.84327\\-196.1978\\-23\\-7.384455\\-197.2179\\-23\\-5.427882\\-198.2863\\-23\\-3.656532\\-198.9833\\-23\\-2.284822\\-199.3635\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "3.98182\\-198.4269\\-21\\6.29082\\-197.5728\\-21\\8.083325\\-196.583\\-21\\10.44217\\-194.7254\\-21\\11.96358\\-193.1431\\-21\\12.87122\\-192.0051\\-21\\14.05624\\-190.2481\\-21\\14.88011\\-188.7763\\-21\\15.85204\\-186.5755\\-21\\16.48686\\-184.6488\\-21\\16.99897\\-182.1364\\-21\\17.16245\\-179.1668\\-21\\17.01657\\-177.2991\\-21\\16.78024\\-176.0205\\-21\\16.03852\\-173.6517\\-21\\15.37458\\-172.2917\\-21\\14.54147\\-170.9638\\-21\\12.82453\\-169.0054\\-21\\11.20515\\-167.7301\\-21\\9.962468\\-166.9923\\-21\\8.206527\\-166.1958\\-21\\6.75092\\-165.7118\\-21\\3.521514\\-165.0587\\-21\\1.543854\\-164.8992\\-21\\-1.192336\\-164.9101\\-21\\-3.46555\\-165.1579\\-21\\-5.75534\\-165.6519\\-21\\-6.99636\\-166.0598\\-21\\-8.731181\\-166.8276\\-21\\-10.02547\\-167.5912\\-21\\-11.61092\\-168.8404\\-21\\-13.01537\\-170.375\\-21\\-13.91475\\-171.6831\\-21\\-14.86979\\-173.5788\\-21\\-15.60217\\-175.9473\\-21\\-15.8355\\-177.2316\\-21\\-15.97555\\-179.0813\\-21\\-15.79508\\-182.1241\\-21\\-15.27197\\-184.5975\\-21\\-14.67615\\-186.379\\-21\\-13.42753\\-189.0896\\-21\\-12.10266\\-191.2193\\-21\\-10.72468\\-192.9962\\-21\\-9.042567\\-194.7226\\-21\\-7.785137\\-195.7792\\-21\\-6.413276\\-196.7185\\-21\\-4.173418\\-197.8622\\-21\\-2.440898\\-198.4348\\-21\\-1.164569\\-198.7136\\-21\\0.6191094\\-198.8593\\-21\\2.335062\\-198.7626\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.5889828\\-197.5246\\-19\\2.835643\\-197.332\\-19\\4.30677\\-196.9336\\-19\\5.709937\\-196.3677\\-19\\6.881927\\-195.7212\\-19\\8.124926\\-194.8623\\-19\\9.839561\\-193.3575\\-19\\11.40593\\-191.5383\\-19\\12.70374\\-189.6326\\-19\\13.74795\\-187.6603\\-19\\14.58252\\-185.5632\\-19\\15.29049\\-182.7444\\-19\\15.53867\\-180.3367\\-19\\15.42756\\-177.9723\\-19\\15.19261\\-176.5847\\-19\\14.69539\\-174.8309\\-19\\14.00282\\-173.2608\\-19\\13.13703\\-171.8342\\-19\\12.05496\\-170.5098\\-19\\10.70214\\-169.2813\\-19\\8.479903\\-167.8711\\-19\\6.386815\\-167.0245\\-19\\4.919351\\-166.608\\-19\\3.045448\\-166.272\\-19\\0.8626077\\-166.1093\\-19\\-2.075699\\-166.2534\\-19\\-3.758297\\-166.5414\\-19\\-5.2565\\-166.9532\\-19\\-6.887741\\-167.5745\\-19\\-8.371519\\-168.3612\\-19\\-9.530785\\-169.1743\\-19\\-10.88979\\-170.4183\\-19\\-11.98201\\-171.7669\\-19\\-12.83368\\-173.1905\\-19\\-13.52013\\-174.7657\\-19\\-14.02571\\-176.6176\\-19\\-14.24492\\-177.9435\\-19\\-14.33936\\-180.3024\\-19\\-14.20106\\-181.9133\\-19\\-13.86696\\-183.7047\\-19\\-13.20319\\-185.8977\\-19\\-12.73275\\-187.054\\-19\\-11.75172\\-188.9993\\-19\\-10.82458\\-190.48\\-19\\-9.554393\\-192.1282\\-19\\-8.637105\\-193.1485\\-19\\-7.039917\\-194.587\\-19\\-5.717835\\-195.5364\\-19\\-4.517857\\-196.2186\\-19\\-3.186833\\-196.7988\\-19\\-1.669466\\-197.257\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.1235377\\-195.474\\-17\\1.804056\\-195.4358\\-17\\3.193761\\-195.1728\\-17\\4.936379\\-194.5104\\-17\\7.081278\\-193.1535\\-17\\8.424042\\-191.9718\\-17\\9.772861\\-190.4307\\-17\\10.66149\\-189.1545\\-17\\11.48567\\-187.7544\\-17\\12.26737\\-185.9685\\-17\\12.8173\\-184.3466\\-17\\13.29074\\-182.0984\\-17\\13.40055\\-179.3775\\-17\\13.07205\\-176.968\\-17\\12.53151\\-175.2713\\-17\\11.47048\\-173.2201\\-17\\10.42338\\-171.8802\\-17\\8.871119\\-170.4704\\-17\\7.842943\\-169.7776\\-17\\6.013384\\-168.8929\\-17\\4.277493\\-168.3248\\-17\\1.7721\\-167.9162\\-17\\-0.6045735\\-167.9008\\-17\\-3.11303\\-168.2811\\-17\\-4.849556\\-168.8343\\-17\\-6.437299\\-169.5556\\-17\\-7.709316\\-170.4028\\-17\\-9.257141\\-171.8151\\-17\\-10.29888\\-173.159\\-17\\-11.35214\\-175.2177\\-17\\-11.87741\\-176.882\\-17\\-12.19843\\-179.3271\\-17\\-12.07064\\-182.0387\\-17\\-11.39801\\-184.8957\\-17\\-10.33594\\-187.4394\\-17\\-9.433351\\-188.9828\\-17\\-8.49837\\-190.3111\\-17\\-7.219549\\-191.7679\\-17\\-5.795415\\-193.0425\\-17\\-3.744724\\-194.3721\\-17\\-1.994946\\-195.0855\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.7068194\\-192.3193\\-15\\1.778206\\-192.2554\\-15\\3.278348\\-191.8488\\-15\\5.270322\\-190.8209\\-15\\6.444961\\-189.8547\\-15\\7.695644\\-188.4697\\-15\\9.096697\\-186.2276\\-15\\9.615885\\-185.0309\\-15\\10.12963\\-183.4464\\-15\\10.33149\\-182.4313\\-15\\10.51023\\-180.2237\\-15\\10.3229\\-178.3365\\-15\\9.868426\\-176.6739\\-15\\8.912128\\-174.7967\\-15\\7.811391\\-173.4004\\-15\\6.810744\\-172.5222\\-15\\5.713912\\-171.8099\\-15\\3.66125\\-170.9448\\-15\\1.180124\\-170.5237\\-15\\-1.314152\\-170.6611\\-15\\-2.488662\\-170.9164\\-15\\-4.607367\\-171.8135\\-15\\-6.15391\\-172.9093\\-15\\-6.968218\\-173.7279\\-15\\-7.729516\\-174.7539\\-15\\-8.665351\\-176.588\\-15\\-9.117551\\-178.2786\\-15\\-9.292521\\-180.2088\\-15\\-9.125008\\-182.1612\\-15\\-8.899356\\-183.3273\\-15\\-8.361764\\-184.9581\\-15\\-7.812262\\-186.1729\\-15\\-6.460924\\-188.2952\\-15\\-5.798864\\-189.1324\\-15\\-4.021014\\-190.7058\\-15\\-3.00817\\-191.3242\\-15\\-1.225947\\-192.0618\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.09172209\\-186.5479\\-13\\1.081909\\-186.5705\\-13\\2.730814\\-186.019\\-13\\4.171261\\-184.7574\\-13\\5.077491\\-183.1443\\-13\\5.434966\\-181.8303\\-13\\5.467434\\-179.6536\\-13\\5.072665\\-178.4028\\-13\\4.113387\\-177.0428\\-13\\3.520375\\-176.4499\\-13\\2.286752\\-175.7327\\-13\\1.468056\\-175.5158\\-13\\-0.2742291\\-175.5056\\-13\\-1.488022\\-175.9041\\-13\\-2.364897\\-176.4514\\-13\\-3.28625\\-177.5044\\-13\\-4.115311\\-178.9828\\-13\\-4.307397\\-180.078\\-13\\-4.283947\\-181.0146\\-13\\-3.822874\\-183.088\\-13\\-2.927249\\-184.6766\\-13\\-1.546395\\-185.9364\\-13" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "2" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "0\\0\\255" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.0846473\\-179.8274\\-61\\-1.105887\\-178.6369\\-61\\-1.105887\\-177.6369\\-61\\0.0846473\\-176.4464\\-61\\1.084647\\-176.4464\\-61\\2.275181\\-177.6369\\-61\\2.275181\\-178.6369\\-61\\1.084647\\-179.8274\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.415353\\-186.8274\\-59\\-2.915353\\-186.3274\\-59\\-3.415353\\-186.3274\\-59\\-3.915353\\-185.8274\\-59\\-4.415353\\-185.8274\\-59\\-7.605886\\-182.6369\\-59\\-7.605886\\-182.1369\\-59\\-8.105886\\-181.6369\\-59\\-8.105886\\-180.1369\\-59\\-8.605886\\-179.6369\\-59\\-8.605886\\-177.1369\\-59\\-8.105886\\-176.6369\\-59\\-8.105886\\-175.1369\\-59\\-7.605886\\-174.6369\\-59\\-7.605886\\-174.1369\\-59\\-4.915353\\-171.4464\\-59\\-4.415353\\-171.4464\\-59\\-3.915353\\-170.9464\\-59\\-3.415353\\-170.9464\\-59\\-2.915353\\-170.4464\\-59\\-2.415353\\-170.4464\\-59\\-1.915353\\-169.9464\\-59\\3.084647\\-169.9464\\-59\\3.584647\\-170.4464\\-59\\4.084647\\-170.4464\\-59\\4.584647\\-170.9464\\-59\\5.084647\\-170.9464\\-59\\5.584647\\-171.4464\\-59\\6.084647\\-171.4464\\-59\\8.775181\\-174.1369\\-59\\8.775181\\-174.6369\\-59\\9.275181\\-175.1369\\-59\\9.275181\\-176.1369\\-59\\9.775181\\-176.6369\\-59\\9.775181\\-180.6369\\-59\\9.275181\\-181.1369\\-59\\9.275181\\-181.6369\\-59\\8.775181\\-182.1369\\-59\\8.775181\\-182.6369\\-59\\5.084647\\-186.3274\\-59\\4.084647\\-186.3274\\-59\\3.584647\\-186.8274\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "74" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.415353\\-190.8274\\-57\\-1.915353\\-190.3274\\-57\\-3.915353\\-190.3274\\-57\\-4.415353\\-189.8274\\-57\\-4.915353\\-189.8274\\-57\\-5.415353\\-189.3274\\-57\\-5.915353\\-189.3274\\-57\\-6.415353\\-188.8274\\-57\\-6.915353\\-188.8274\\-57\\-7.915353\\-187.8274\\-57\\-8.415353\\-187.8274\\-57\\-9.605886\\-186.6369\\-57\\-9.605886\\-186.1369\\-57\\-10.60589\\-185.1369\\-57\\-10.60589\\-184.6369\\-57\\-11.10589\\-184.1369\\-57\\-11.10589\\-183.6369\\-57\\-11.60589\\-183.1369\\-57\\-11.60589\\-182.6369\\-57\\-12.10589\\-182.1369\\-57\\-12.10589\\-175.1369\\-57\\-11.60589\\-174.6369\\-57\\-11.60589\\-173.6369\\-57\\-10.60589\\-172.6369\\-57\\-10.60589\\-172.1369\\-57\\-7.415353\\-168.9464\\-57\\-6.915353\\-168.9464\\-57\\-6.415353\\-168.4464\\-57\\-5.915353\\-168.4464\\-57\\-5.415353\\-167.9464\\-57\\-4.915353\\-167.9464\\-57\\-4.415353\\-167.4464\\-57\\-3.915353\\-167.4464\\-57\\-3.415353\\-166.9464\\-57\\-1.415353\\-166.9464\\-57\\-0.9153527\\-166.4464\\-57\\2.084647\\-166.4464\\-57\\2.584647\\-166.9464\\-57\\4.584647\\-166.9464\\-57\\5.084647\\-167.4464\\-57\\5.584647\\-167.4464\\-57\\6.084647\\-167.9464\\-57\\6.584647\\-167.9464\\-57\\7.084647\\-168.4464\\-57\\7.584647\\-168.4464\\-57\\8.084647\\-168.9464\\-57\\8.584647\\-168.9464\\-57\\12.27518\\-172.6369\\-57\\12.27518\\-173.1369\\-57\\12.77518\\-173.6369\\-57\\12.77518\\-174.6369\\-57\\13.27518\\-175.1369\\-57\\13.27518\\-176.6369\\-57\\13.77518\\-177.1369\\-57\\13.77518\\-180.1369\\-57\\13.27518\\-180.6369\\-57\\13.27518\\-182.1369\\-57\\12.77518\\-182.6369\\-57\\12.77518\\-183.6369\\-57\\12.27518\\-184.1369\\-57\\12.27518\\-184.6369\\-57\\11.27518\\-185.6369\\-57\\11.27518\\-186.1369\\-57\\9.584647\\-187.8274\\-57\\9.084647\\-187.8274\\-57\\8.084647\\-188.8274\\-57\\7.584647\\-188.8274\\-57\\7.084647\\-189.3274\\-57\\6.584647\\-189.3274\\-57\\6.084647\\-189.8274\\-57\\5.584647\\-189.8274\\-57\\5.084647\\-190.3274\\-57\\3.084647\\-190.3274\\-57\\2.584647\\-190.8274\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.415353\\-192.8274\\-55\\-4.915353\\-192.3274\\-55\\-5.915353\\-192.3274\\-55\\-6.415353\\-191.8274\\-55\\-6.915353\\-191.8274\\-55\\-7.415353\\-191.3274\\-55\\-7.915353\\-191.3274\\-55\\-8.415353\\-190.8274\\-55\\-8.915353\\-190.8274\\-55\\-9.915353\\-189.8274\\-55\\-10.41535\\-189.8274\\-55\\-12.10589\\-188.1369\\-55\\-12.10589\\-187.6369\\-55\\-13.10589\\-186.6369\\-55\\-13.10589\\-186.1369\\-55\\-13.60589\\-185.6369\\-55\\-13.60589\\-185.1369\\-55\\-14.10589\\-184.6369\\-55\\-14.10589\\-184.1369\\-55\\-14.60589\\-183.6369\\-55\\-14.60589\\-182.1369\\-55\\-15.10589\\-181.6369\\-55\\-15.10589\\-175.6369\\-55\\-14.60589\\-175.1369\\-55\\-14.60589\\-174.1369\\-55\\-14.10589\\-173.6369\\-55\\-14.10589\\-172.6369\\-55\\-13.60589\\-172.1369\\-55\\-13.60589\\-171.6369\\-55\\-12.60589\\-170.6369\\-55\\-12.60589\\-170.1369\\-55\\-10.41535\\-167.9464\\-55\\-9.915353\\-167.9464\\-55\\-8.415353\\-166.4464\\-55\\-7.915353\\-166.4464\\-55\\-7.415353\\-165.9464\\-55\\-6.415353\\-165.9464\\-55\\-5.915353\\-165.4464\\-55\\-5.415353\\-165.4464\\-55\\-4.915353\\-164.9464\\-55\\-3.415353\\-164.9464\\-55\\-2.915353\\-164.4464\\-55\\4.084647\\-164.4464\\-55\\4.584647\\-164.9464\\-55\\6.084647\\-164.9464\\-55\\6.584647\\-165.4464\\-55\\7.084647\\-165.4464\\-55\\7.584647\\-165.9464\\-55\\8.584647\\-165.9464\\-55\\9.084647\\-166.4464\\-55\\9.584647\\-166.4464\\-55\\10.58465\\-167.4464\\-55\\11.08465\\-167.4464\\-55\\13.77518\\-170.1369\\-55\\13.77518\\-170.6369\\-55\\14.77518\\-171.6369\\-55\\14.77518\\-172.1369\\-55\\15.27518\\-172.6369\\-55\\15.27518\\-173.1369\\-55\\15.77518\\-173.6369\\-55\\15.77518\\-175.1369\\-55\\16.27518\\-175.6369\\-55\\16.27518\\-182.1369\\-55\\15.77518\\-182.6369\\-55\\15.77518\\-183.6369\\-55\\15.27518\\-184.1369\\-55\\15.27518\\-184.6369\\-55\\14.77518\\-185.1369\\-55\\14.77518\\-185.6369\\-55\\14.27518\\-186.1369\\-55\\14.27518\\-186.6369\\-55\\12.77518\\-188.1369\\-55\\12.77518\\-188.6369\\-55\\11.58465\\-189.8274\\-55\\11.08465\\-189.8274\\-55\\10.08465\\-190.8274\\-55\\9.584647\\-190.8274\\-55\\8.584647\\-191.8274\\-55\\7.584647\\-191.8274\\-55\\7.084647\\-192.3274\\-55\\6.084647\\-192.3274\\-55\\5.584647\\-192.8274\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "80" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.915353\\-194.8274\\-53\\-5.415353\\-194.3869\\-53\\-6.915353\\-194.3274\\-53\\-7.415353\\-193.8274\\-53\\-7.915353\\-193.8274\\-53\\-8.415353\\-193.3274\\-53\\-8.915353\\-193.3274\\-53\\-9.415353\\-192.8274\\-53\\-9.915353\\-192.8274\\-53\\-10.91535\\-191.8274\\-53\\-11.41535\\-191.8274\\-53\\-14.10589\\-189.1369\\-53\\-14.10589\\-188.6369\\-53\\-15.10589\\-187.6369\\-53\\-15.10589\\-187.1369\\-53\\-16.10589\\-186.1369\\-53\\-16.10589\\-185.1369\\-53\\-16.60589\\-184.6369\\-53\\-16.60589\\-183.6369\\-53\\-17.10589\\-183.1369\\-53\\-17.10589\\-174.6369\\-53\\-16.60589\\-174.1369\\-53\\-16.60589\\-173.1369\\-53\\-16.10589\\-172.6369\\-53\\-16.10589\\-172.1369\\-53\\-15.60589\\-171.6369\\-53\\-15.60589\\-171.1369\\-53\\-15.10589\\-170.6369\\-53\\-15.10589\\-170.1369\\-53\\-10.41535\\-165.4464\\-53\\-9.915353\\-165.4464\\-53\\-9.415353\\-164.9464\\-53\\-8.915353\\-164.9464\\-53\\-8.415353\\-164.4464\\-53\\-7.915353\\-164.4464\\-53\\-7.415353\\-163.9464\\-53\\-6.415353\\-163.9464\\-53\\-5.915353\\-163.4464\\-53\\-4.415353\\-163.3869\\-53\\-3.915353\\-162.9464\\-53\\-1.915353\\-162.8869\\-53\\3.084647\\-162.8869\\-53\\5.084647\\-162.9464\\-53\\5.584647\\-163.3869\\-53\\7.084647\\-163.4464\\-53\\7.584647\\-163.9464\\-53\\8.584647\\-163.9464\\-53\\9.084647\\-164.4464\\-53\\9.584647\\-164.4464\\-53\\10.08465\\-164.9464\\-53\\10.58465\\-164.9464\\-53\\11.08465\\-165.4464\\-53\\11.58465\\-165.4464\\-53\\16.27518\\-170.1369\\-53\\16.27518\\-170.6369\\-53\\17.27518\\-171.6369\\-53\\17.27518\\-172.6369\\-53\\17.77518\\-173.1369\\-53\\17.77518\\-174.1369\\-53\\18.27518\\-174.6369\\-53\\18.27518\\-183.1369\\-53\\17.77518\\-183.6369\\-53\\17.77518\\-185.1369\\-53\\17.27518\\-185.6369\\-53\\17.27518\\-186.1369\\-53\\16.27518\\-187.1369\\-53\\16.27518\\-187.6369\\-53\\15.27518\\-188.6369\\-53\\15.27518\\-189.1369\\-53\\13.08465\\-191.3274\\-53\\12.58465\\-191.3274\\-53\\11.08465\\-192.8274\\-53\\10.58465\\-192.8274\\-53\\10.08465\\-193.3274\\-53\\9.584647\\-193.3274\\-53\\9.084647\\-193.8274\\-53\\8.584647\\-193.8274\\-53\\8.084647\\-194.3274\\-53\\6.584647\\-194.3274\\-53\\6.084647\\-194.8274\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "93" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.415353\\-196.8274\\-51\\-3.915353\\-196.3869\\-51\\-5.915353\\-196.3274\\-51\\-6.415353\\-195.8869\\-51\\-7.915353\\-195.8274\\-51\\-8.415353\\-195.3274\\-51\\-8.915353\\-195.3274\\-51\\-9.415353\\-194.8274\\-51\\-9.915353\\-194.8274\\-51\\-10.41535\\-194.3274\\-51\\-10.91535\\-194.3274\\-51\\-12.41535\\-192.8274\\-51\\-12.91535\\-192.8274\\-51\\-15.60589\\-190.1369\\-51\\-15.60589\\-189.6369\\-51\\-17.10589\\-188.1369\\-51\\-17.10589\\-187.6369\\-51\\-17.60589\\-187.1369\\-51\\-17.60589\\-186.6369\\-51\\-18.10589\\-186.1369\\-51\\-18.16535\\-185.1369\\-51\\-18.60589\\-184.6369\\-51\\-18.66535\\-183.1369\\-51\\-19.10589\\-182.6369\\-51\\-19.10589\\-175.1369\\-51\\-18.66535\\-174.6369\\-51\\-18.60589\\-173.1369\\-51\\-18.10589\\-172.6369\\-51\\-18.10589\\-172.1369\\-51\\-17.60589\\-171.6369\\-51\\-17.60589\\-171.1369\\-51\\-17.10589\\-170.6369\\-51\\-17.10589\\-170.1369\\-51\\-16.10589\\-169.1369\\-51\\-16.10589\\-168.6369\\-51\\-12.41535\\-164.9464\\-51\\-11.91535\\-164.9464\\-51\\-11.41535\\-164.4464\\-51\\-10.91535\\-164.3869\\-51\\-9.915353\\-163.4464\\-51\\-8.915353\\-163.3869\\-51\\-8.415353\\-162.9464\\-51\\-7.415353\\-162.8869\\-51\\-6.915353\\-162.4464\\-51\\-5.915353\\-162.3869\\-51\\-5.415353\\-161.9464\\-51\\-3.415353\\-161.8869\\-51\\-2.915353\\-161.4464\\-51\\3.584647\\-161.4464\\-51\\4.084647\\-161.8869\\-51\\6.584647\\-161.9464\\-51\\7.084647\\-162.3869\\-51\\8.084647\\-162.4464\\-51\\8.584647\\-162.8869\\-51\\9.584647\\-162.9464\\-51\\11.08465\\-163.8869\\-51\\12.58465\\-164.4464\\-51\\13.58465\\-165.3869\\-51\\14.08465\\-165.4464\\-51\\17.27518\\-168.6369\\-51\\17.27518\\-169.1369\\-51\\18.27518\\-170.1369\\-51\\18.27518\\-170.6369\\-51\\18.77518\\-171.1369\\-51\\19.27518\\-172.1369\\-51\\19.27518\\-172.6369\\-51\\19.77518\\-173.1369\\-51\\19.77518\\-174.1369\\-51\\20.27518\\-174.6369\\-51\\20.27518\\-182.6369\\-51\\19.83465\\-183.1369\\-51\\19.77518\\-184.6369\\-51\\19.33465\\-185.1369\\-51\\19.27518\\-186.1369\\-51\\18.77518\\-186.6369\\-51\\18.77518\\-187.1369\\-51\\18.27518\\-187.6369\\-51\\18.27518\\-188.1369\\-51\\15.77518\\-190.6369\\-51\\15.77518\\-191.1369\\-51\\14.58465\\-192.3274\\-51\\14.08465\\-192.3274\\-51\\12.08465\\-194.3274\\-51\\11.58465\\-194.3274\\-51\\11.08465\\-194.8274\\-51\\10.58465\\-194.8274\\-51\\10.08465\\-195.3274\\-51\\9.084647\\-195.3869\\-51\\8.584647\\-195.8274\\-51\\7.084647\\-195.8869\\-51\\6.584647\\-196.3274\\-51\\5.084647\\-196.3869\\-51\\4.584647\\-196.8274\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "87" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.915353\\-198.3274\\-49\\-3.415353\\-197.8869\\-49\\-5.915353\\-197.8274\\-49\\-6.415353\\-197.3869\\-49\\-7.415353\\-197.3274\\-49\\-7.915353\\-196.8869\\-49\\-8.915353\\-196.8274\\-49\\-9.415353\\-196.3869\\-49\\-10.41535\\-196.3274\\-49\\-10.91535\\-195.8274\\-49\\-11.41535\\-195.8274\\-49\\-12.41535\\-194.8274\\-49\\-12.91535\\-194.8274\\-49\\-17.10589\\-190.6369\\-49\\-17.16535\\-190.1369\\-49\\-18.10589\\-189.1369\\-49\\-19.60589\\-186.1369\\-49\\-19.66535\\-185.1369\\-49\\-20.10589\\-184.6369\\-49\\-20.16535\\-183.1369\\-49\\-20.60589\\-182.6369\\-49\\-20.66535\\-177.6369\\-49\\-20.60589\\-174.6369\\-49\\-20.16535\\-174.1369\\-49\\-20.10589\\-173.1369\\-49\\-19.66535\\-172.6369\\-49\\-19.60589\\-171.6369\\-49\\-19.10589\\-170.6369\\-49\\-18.60589\\-170.1369\\-49\\-18.60589\\-169.6369\\-49\\-17.16535\\-168.1369\\-49\\-17.10589\\-167.6369\\-49\\-13.91535\\-164.4464\\-49\\-13.41535\\-164.3869\\-49\\-12.41535\\-163.4464\\-49\\-9.915353\\-162.3869\\-49\\-9.415353\\-161.9464\\-49\\-8.415353\\-161.8869\\-49\\-7.915353\\-161.4464\\-49\\-6.415353\\-161.3869\\-49\\-5.915353\\-160.9464\\-49\\-3.415353\\-160.8869\\-49\\-2.915353\\-160.4464\\-49\\4.084647\\-160.4464\\-49\\4.584647\\-160.8869\\-49\\7.084647\\-160.9464\\-49\\7.584647\\-161.3869\\-49\\9.084647\\-161.4464\\-49\\10.58465\\-162.3869\\-49\\11.58465\\-162.4464\\-49\\12.08465\\-162.9464\\-49\\12.58465\\-162.9464\\-49\\13.58465\\-163.4464\\-49\\15.08465\\-164.8869\\-49\\15.58465\\-164.9464\\-49\\18.27518\\-167.6369\\-49\\18.33465\\-168.1369\\-49\\19.77518\\-169.6369\\-49\\19.77518\\-170.1369\\-49\\20.27518\\-170.6369\\-49\\20.77518\\-171.6369\\-49\\20.83465\\-172.6369\\-49\\21.27518\\-173.1369\\-49\\21.33465\\-174.1369\\-49\\21.77518\\-174.6369\\-49\\21.83465\\-176.6369\\-49\\21.83465\\-180.6369\\-49\\21.77518\\-183.1369\\-49\\21.33465\\-183.6369\\-49\\21.27518\\-184.6369\\-49\\20.83465\\-185.1369\\-49\\20.77518\\-186.1369\\-49\\20.33465\\-186.6369\\-49\\19.27518\\-189.1369\\-49\\18.27518\\-190.1369\\-49\\18.27518\\-190.6369\\-49\\14.58465\\-194.3274\\-49\\14.08465\\-194.3274\\-49\\13.08465\\-195.3274\\-49\\11.58465\\-195.8869\\-49\\10.08465\\-196.8274\\-49\\9.084647\\-196.8869\\-49\\8.584647\\-197.3274\\-49\\7.084647\\-197.3869\\-49\\6.584647\\-197.8274\\-49\\4.084647\\-197.8869\\-49\\3.584647\\-198.3274\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "85" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.415353\\-199.3274\\-47\\-4.915353\\-198.8869\\-47\\-6.915353\\-198.8274\\-47\\-7.415353\\-198.3869\\-47\\-8.415353\\-198.3274\\-47\\-8.915353\\-197.8869\\-47\\-9.915353\\-197.8274\\-47\\-11.41535\\-196.8869\\-47\\-12.91535\\-196.3274\\-47\\-13.91535\\-195.3869\\-47\\-14.41535\\-195.3274\\-47\\-17.60589\\-192.1369\\-47\\-17.66535\\-191.6369\\-47\\-19.10589\\-190.1369\\-47\\-19.16535\\-189.6369\\-47\\-20.60589\\-187.1369\\-47\\-20.66535\\-186.1369\\-47\\-21.10589\\-185.6369\\-47\\-21.16535\\-184.6369\\-47\\-21.60589\\-184.1369\\-47\\-21.66535\\-182.1369\\-47\\-22.10589\\-181.6369\\-47\\-22.10589\\-176.1369\\-47\\-21.66535\\-175.6369\\-47\\-21.60589\\-173.6369\\-47\\-21.16535\\-173.1369\\-47\\-21.10589\\-172.1369\\-47\\-19.66535\\-169.6369\\-47\\-19.60589\\-169.1369\\-47\\-18.66535\\-168.1369\\-47\\-18.60589\\-167.6369\\-47\\-16.41535\\-165.3869\\-47\\-14.41535\\-163.4464\\-47\\-13.91535\\-163.3869\\-47\\-12.41535\\-162.4464\\-47\\-9.915353\\-161.3869\\-47\\-9.415353\\-160.9464\\-47\\-7.915353\\-160.8869\\-47\\-7.415353\\-160.4464\\-47\\-5.915353\\-160.3869\\-47\\-5.415353\\-159.9464\\-47\\-4.415353\\-159.8869\\-47\\5.584647\\-159.8869\\-47\\6.584647\\-160.3869\\-47\\8.584647\\-160.4464\\-47\\9.084647\\-160.8869\\-47\\10.08465\\-160.9464\\-47\\10.58465\\-161.3869\\-47\\11.58465\\-161.4464\\-47\\12.08465\\-161.8869\\-47\\14.58465\\-162.9464\\-47\\15.58465\\-163.8869\\-47\\16.08465\\-163.9464\\-47\\19.77518\\-167.6369\\-47\\19.83465\\-168.1369\\-47\\20.77518\\-169.1369\\-47\\20.83465\\-169.6369\\-47\\22.27518\\-172.1369\\-47\\22.33465\\-173.1369\\-47\\22.77518\\-173.6369\\-47\\22.83465\\-175.6369\\-47\\23.27518\\-176.1369\\-47\\23.27518\\-182.1369\\-47\\22.83465\\-182.6369\\-47\\22.77518\\-184.1369\\-47\\22.33465\\-184.6369\\-47\\22.27518\\-185.6369\\-47\\21.83465\\-186.1369\\-47\\21.77518\\-187.1369\\-47\\21.33465\\-187.6369\\-47\\20.27518\\-190.1369\\-47\\18.33465\\-192.1369\\-47\\18.27518\\-192.6369\\-47\\16.08465\\-194.8274\\-47\\15.58465\\-194.8869\\-47\\14.08465\\-196.3274\\-47\\13.58465\\-196.3274\\-47\\13.08465\\-196.8274\\-47\\12.08465\\-197.3274\\-47\\11.08465\\-197.3869\\-47\\9.584647\\-198.3274\\-47\\8.084647\\-198.3869\\-47\\7.584647\\-198.8274\\-47\\5.584647\\-198.8869\\-47\\5.084647\\-199.3274\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "96" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.415353\\-200.3274\\-45\\-5.915353\\-199.8869\\-45\\-7.415353\\-199.8274\\-45\\-7.915353\\-199.3869\\-45\\-8.915353\\-199.3274\\-45\\-9.415353\\-198.8869\\-45\\-10.41535\\-198.8274\\-45\\-10.91535\\-198.3869\\-45\\-13.41535\\-197.3274\\-45\\-14.41535\\-196.3869\\-45\\-14.91535\\-196.3274\\-45\\-19.10589\\-192.1369\\-45\\-19.16535\\-191.6369\\-45\\-20.10589\\-190.6369\\-45\\-21.60589\\-187.6369\\-45\\-21.66535\\-186.6369\\-45\\-22.10589\\-186.1369\\-45\\-22.16535\\-185.1369\\-45\\-22.60589\\-184.6369\\-45\\-22.66535\\-182.6369\\-45\\-23.10589\\-182.1369\\-45\\-23.10589\\-175.6369\\-45\\-22.66535\\-175.1369\\-45\\-22.60589\\-173.6369\\-45\\-22.16535\\-173.1369\\-45\\-22.10589\\-172.1369\\-45\\-20.66535\\-169.6369\\-45\\-20.60589\\-169.1369\\-45\\-19.66535\\-167.6369\\-45\\-19.60589\\-167.1369\\-45\\-16.41535\\-163.9464\\-45\\-15.91535\\-163.8869\\-45\\-14.91535\\-162.9464\\-45\\-14.41535\\-162.8869\\-45\\-13.41535\\-161.9464\\-45\\-12.91535\\-161.8869\\-45\\-11.41535\\-160.9464\\-45\\-10.41535\\-160.8869\\-45\\-9.915353\\-160.4464\\-45\\-8.915353\\-160.3869\\-45\\-8.415353\\-159.9464\\-45\\-6.915353\\-159.8869\\-45\\-6.415353\\-159.4464\\-45\\-5.415353\\-159.3869\\-45\\-1.915353\\-159.3869\\-45\\-1.415353\\-158.9464\\-45\\1.584647\\-158.9464\\-45\\2.084647\\-159.3869\\-45\\6.084647\\-159.3869\\-45\\7.084647\\-159.4464\\-45\\7.584647\\-159.8869\\-45\\9.084647\\-159.9464\\-45\\9.584647\\-160.3869\\-45\\10.58465\\-160.4464\\-45\\11.08465\\-160.8869\\-45\\12.08465\\-160.9464\\-45\\12.58465\\-161.3869\\-45\\13.08465\\-161.3869\\-45\\13.58465\\-161.8869\\-45\\14.08465\\-161.8869\\-45\\14.58465\\-162.3869\\-45\\16.08465\\-162.9464\\-45\\17.58465\\-164.3869\\-45\\18.08465\\-164.4464\\-45\\20.27518\\-166.6369\\-45\\20.33465\\-167.1369\\-45\\21.27518\\-168.1369\\-45\\21.83465\\-169.6369\\-45\\23.27518\\-172.1369\\-45\\23.33465\\-173.1369\\-45\\23.77518\\-173.6369\\-45\\23.83465\\-175.1369\\-45\\24.27518\\-175.6369\\-45\\24.27518\\-182.6369\\-45\\23.83465\\-183.1369\\-45\\23.77518\\-184.6369\\-45\\23.33465\\-185.1369\\-45\\23.27518\\-186.1369\\-45\\22.83465\\-186.6369\\-45\\22.77518\\-187.6369\\-45\\21.27518\\-190.6369\\-45\\19.83465\\-192.1369\\-45\\19.77518\\-192.6369\\-45\\16.58465\\-195.8274\\-45\\16.08465\\-195.8869\\-45\\14.58465\\-197.3274\\-45\\12.08465\\-198.3869\\-45\\11.58465\\-198.8274\\-45\\10.58465\\-198.8869\\-45\\10.08465\\-199.3274\\-45\\8.584647\\-199.3869\\-45\\8.084647\\-199.8274\\-45\\6.084647\\-199.8869\\-45\\5.584647\\-200.3274\\-45\\3.084647\\-200.3869\\-45\\-2.915353\\-200.3869\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "103" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.415353\\-201.3274\\-43\\-5.915353\\-200.8869\\-43\\-7.415353\\-200.8274\\-43\\-7.915353\\-200.3869\\-43\\-9.415353\\-200.3274\\-43\\-10.91535\\-199.3869\\-43\\-11.91535\\-199.3274\\-43\\-12.91535\\-198.8274\\-43\\-13.91535\\-197.8869\\-43\\-14.41535\\-197.8274\\-43\\-15.41535\\-196.8869\\-43\\-15.91535\\-196.8274\\-43\\-19.10589\\-193.6369\\-43\\-19.16535\\-193.1369\\-43\\-20.10589\\-192.1369\\-43\\-20.16535\\-191.6369\\-43\\-21.10589\\-190.6369\\-43\\-21.66535\\-189.1369\\-43\\-22.10589\\-188.6369\\-43\\-22.16535\\-187.6369\\-43\\-22.60589\\-187.1369\\-43\\-22.66535\\-186.1369\\-43\\-23.10589\\-185.6369\\-43\\-23.16535\\-184.6369\\-43\\-23.60589\\-184.1369\\-43\\-23.66535\\-182.1369\\-43\\-24.10589\\-181.6369\\-43\\-24.10589\\-176.6369\\-43\\-23.66535\\-176.1369\\-43\\-23.60589\\-173.6369\\-43\\-23.16535\\-173.1369\\-43\\-23.10589\\-172.1369\\-43\\-21.66535\\-169.6369\\-43\\-21.10589\\-168.1369\\-43\\-20.16535\\-167.1369\\-43\\-20.10589\\-166.6369\\-43\\-16.91535\\-163.4464\\-43\\-16.41535\\-163.3869\\-43\\-15.41535\\-162.4464\\-43\\-14.91535\\-162.3869\\-43\\-14.41535\\-161.8869\\-43\\-13.91535\\-161.8869\\-43\\-12.91535\\-160.9464\\-43\\-11.91535\\-160.8869\\-43\\-11.41535\\-160.3869\\-43\\-10.91535\\-160.3869\\-43\\-10.41535\\-159.9464\\-43\\-8.915353\\-159.8869\\-43\\-8.415353\\-159.4464\\-43\\-6.415353\\-159.3869\\-43\\-5.415353\\-158.8869\\-43\\6.084647\\-158.8869\\-43\\7.084647\\-159.3869\\-43\\9.084647\\-159.4464\\-43\\9.584647\\-159.8869\\-43\\11.08465\\-159.9464\\-43\\11.58465\\-160.3869\\-43\\12.58465\\-160.4464\\-43\\15.08465\\-161.8869\\-43\\15.58465\\-161.9464\\-43\\16.58465\\-162.8869\\-43\\17.08465\\-162.9464\\-43\\18.08465\\-163.8869\\-43\\18.58465\\-163.9464\\-43\\21.27518\\-166.6369\\-43\\21.33465\\-167.1369\\-43\\22.27518\\-168.1369\\-43\\22.83465\\-169.6369\\-43\\24.27518\\-172.1369\\-43\\24.33465\\-173.1369\\-43\\24.77518\\-173.6369\\-43\\24.83465\\-176.1369\\-43\\25.27518\\-176.6369\\-43\\25.27518\\-181.6369\\-43\\24.83465\\-182.1369\\-43\\24.77518\\-184.1369\\-43\\24.33465\\-184.6369\\-43\\24.27518\\-185.6369\\-43\\23.83465\\-186.1369\\-43\\23.77518\\-187.1369\\-43\\23.33465\\-187.6369\\-43\\23.27518\\-188.6369\\-43\\22.83465\\-189.1369\\-43\\22.27518\\-190.6369\\-43\\21.33465\\-191.6369\\-43\\21.27518\\-192.1369\\-43\\19.83465\\-193.6369\\-43\\19.77518\\-194.1369\\-43\\17.58465\\-196.3274\\-43\\17.08465\\-196.3869\\-43\\15.58465\\-197.8274\\-43\\14.08465\\-198.3869\\-43\\13.58465\\-198.8274\\-43\\12.08465\\-199.3869\\-43\\11.58465\\-199.8274\\-43\\10.58465\\-199.8869\\-43\\10.08465\\-200.3274\\-43\\8.584647\\-200.3869\\-43\\8.084647\\-200.8274\\-43\\6.084647\\-200.8869\\-43\\5.584647\\-201.3274\\-43\\3.084647\\-201.3869\\-43\\-3.415353\\-201.3869\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "109" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.915353\\-202.3274\\-41\\-5.415353\\-201.8869\\-41\\-7.415353\\-201.8274\\-41\\-7.915353\\-201.3869\\-41\\-8.915353\\-201.3274\\-41\\-9.415353\\-200.8869\\-41\\-10.41535\\-200.8274\\-41\\-12.91535\\-199.3869\\-41\\-14.41535\\-198.8274\\-41\\-15.91535\\-197.3869\\-41\\-16.41535\\-197.3274\\-41\\-19.60589\\-194.1369\\-41\\-19.66535\\-193.6369\\-41\\-20.60589\\-192.6369\\-41\\-20.66535\\-192.1369\\-41\\-21.60589\\-191.1369\\-41\\-22.16535\\-189.6369\\-41\\-23.10589\\-188.1369\\-41\\-23.16535\\-187.1369\\-41\\-23.60589\\-186.6369\\-41\\-23.66535\\-185.6369\\-41\\-24.10589\\-185.1369\\-41\\-24.16535\\-183.1369\\-41\\-24.60589\\-182.6369\\-41\\-24.66535\\-181.6369\\-41\\-24.66535\\-176.6369\\-41\\-24.60589\\-175.1369\\-41\\-24.16535\\-174.6369\\-41\\-24.10589\\-173.1369\\-41\\-23.66535\\-172.6369\\-41\\-23.60589\\-171.6369\\-41\\-22.66535\\-170.1369\\-41\\-22.66535\\-169.6369\\-41\\-22.16535\\-169.1369\\-41\\-22.10589\\-168.6369\\-41\\-21.16535\\-167.6369\\-41\\-21.10589\\-167.1369\\-41\\-20.16535\\-166.1369\\-41\\-20.10589\\-165.6369\\-41\\-18.41535\\-163.9464\\-41\\-17.91535\\-163.8869\\-41\\-16.41535\\-162.4464\\-41\\-15.91535\\-162.3869\\-41\\-15.41535\\-161.8869\\-41\\-14.91535\\-161.8869\\-41\\-13.91535\\-160.9464\\-41\\-12.91535\\-160.4464\\-41\\-11.91535\\-160.3869\\-41\\-11.41535\\-159.8869\\-41\\-10.41535\\-159.8869\\-41\\-9.915353\\-159.3869\\-41\\-8.415353\\-159.3869\\-41\\-7.915353\\-158.9464\\-41\\-4.415353\\-158.8869\\-41\\-3.915353\\-158.4464\\-41\\-2.915353\\-158.3869\\-41\\3.584647\\-158.3869\\-41\\4.584647\\-158.4464\\-41\\5.084647\\-158.8869\\-41\\8.084647\\-158.9464\\-41\\8.584647\\-159.3869\\-41\\10.58465\\-159.3869\\-41\\11.08465\\-159.8869\\-41\\12.08465\\-159.8869\\-41\\12.58465\\-160.3869\\-41\\13.58465\\-160.4464\\-41\\16.58465\\-161.9464\\-41\\17.58465\\-162.8869\\-41\\18.58465\\-163.3869\\-41\\21.83465\\-166.6369\\-41\\22.33465\\-167.6369\\-41\\23.27518\\-168.6369\\-41\\23.83465\\-170.1369\\-41\\24.77518\\-171.6369\\-41\\24.83465\\-172.6369\\-41\\25.27518\\-173.1369\\-41\\25.33465\\-174.6369\\-41\\25.77518\\-175.1369\\-41\\25.83465\\-176.1369\\-41\\25.83465\\-181.6369\\-41\\25.77518\\-182.6369\\-41\\25.33465\\-183.1369\\-41\\25.27518\\-185.1369\\-41\\24.83465\\-185.6369\\-41\\24.77518\\-186.6369\\-41\\24.33465\\-187.1369\\-41\\24.27518\\-188.1369\\-41\\23.33465\\-189.6369\\-41\\22.77518\\-191.1369\\-41\\21.83465\\-192.1369\\-41\\21.77518\\-192.6369\\-41\\20.83465\\-193.6369\\-41\\20.77518\\-194.1369\\-41\\18.08465\\-196.8274\\-41\\17.58465\\-196.8869\\-41\\16.08465\\-198.3274\\-41\\15.58465\\-198.3869\\-41\\14.58465\\-199.3274\\-41\\12.58465\\-200.3274\\-41\\11.58465\\-200.3869\\-41\\11.08465\\-200.8274\\-41\\10.08465\\-200.8869\\-41\\9.584647\\-201.3274\\-41\\8.584647\\-201.3869\\-41\\8.084647\\-201.8274\\-41\\5.584647\\-201.8869\\-41\\5.084647\\-202.3274\\-41\\3.084647\\-202.3869\\-41\\-2.415353\\-202.3869\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "135" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.415353\\-203.3274\\-39\\-3.915353\\-202.8869\\-39\\-6.415353\\-202.8274\\-39\\-6.915353\\-202.3869\\-39\\-8.415353\\-202.3274\\-39\\-8.915353\\-201.8869\\-39\\-9.915353\\-201.8274\\-39\\-11.41535\\-200.8869\\-39\\-11.91535\\-200.8869\\-39\\-12.41535\\-200.3869\\-39\\-12.91535\\-200.3869\\-39\\-13.41535\\-199.8869\\-39\\-13.91535\\-199.8274\\-39\\-14.91535\\-198.8869\\-39\\-15.41535\\-198.8274\\-39\\-16.91535\\-197.3869\\-39\\-17.41535\\-197.3274\\-39\\-19.10589\\-195.6369\\-39\\-19.16535\\-195.1369\\-39\\-20.60589\\-193.6369\\-39\\-20.66535\\-193.1369\\-39\\-21.60589\\-192.1369\\-39\\-21.66535\\-191.6369\\-39\\-22.16535\\-191.1369\\-39\\-22.16535\\-190.6369\\-39\\-22.66535\\-190.1369\\-39\\-22.66535\\-189.6369\\-39\\-23.16535\\-189.1369\\-39\\-23.16535\\-188.6369\\-39\\-23.60589\\-188.1369\\-39\\-23.66535\\-187.1369\\-39\\-24.16535\\-186.6369\\-39\\-24.16535\\-185.6369\\-39\\-24.60589\\-185.1369\\-39\\-24.66535\\-183.1369\\-39\\-25.10589\\-182.6369\\-39\\-25.16535\\-181.6369\\-39\\-25.16535\\-176.6369\\-39\\-25.10589\\-175.6369\\-39\\-24.66535\\-175.1369\\-39\\-24.60589\\-173.1369\\-39\\-24.16535\\-172.6369\\-39\\-24.10589\\-171.6369\\-39\\-23.66535\\-171.1369\\-39\\-23.66535\\-170.6369\\-39\\-23.16535\\-170.1369\\-39\\-23.10589\\-169.1369\\-39\\-22.16535\\-168.1369\\-39\\-22.10589\\-167.6369\\-39\\-21.16535\\-166.6369\\-39\\-21.10589\\-166.1369\\-39\\-17.91535\\-162.9464\\-39\\-17.41535\\-162.8869\\-39\\-16.41535\\-161.9464\\-39\\-15.91535\\-161.8869\\-39\\-15.41535\\-161.3869\\-39\\-14.91535\\-161.3869\\-39\\-14.41535\\-160.8869\\-39\\-13.91535\\-160.8869\\-39\\-13.41535\\-160.3869\\-39\\-12.91535\\-160.3869\\-39\\-12.41535\\-159.8869\\-39\\-11.41535\\-159.8869\\-39\\-10.91535\\-159.3869\\-39\\-9.415353\\-159.3869\\-39\\-8.915353\\-158.8869\\-39\\-6.415353\\-158.8869\\-39\\-5.415353\\-158.3869\\-39\\5.584647\\-158.3869\\-39\\6.584647\\-158.8869\\-39\\9.084647\\-158.8869\\-39\\9.584647\\-159.3869\\-39\\11.58465\\-159.4464\\-39\\12.08465\\-159.8869\\-39\\13.08465\\-159.8869\\-39\\13.58465\\-160.3869\\-39\\14.08465\\-160.3869\\-39\\14.58465\\-160.8869\\-39\\15.08465\\-160.8869\\-39\\15.58465\\-161.3869\\-39\\16.08465\\-161.3869\\-39\\16.58465\\-161.8869\\-39\\17.08465\\-161.8869\\-39\\17.58465\\-162.3869\\-39\\18.08465\\-162.4464\\-39\\19.58465\\-163.8869\\-39\\20.08465\\-163.9464\\-39\\21.77518\\-165.6369\\-39\\21.83465\\-166.1369\\-39\\23.27518\\-167.6369\\-39\\23.33465\\-168.1369\\-39\\23.83465\\-168.6369\\-39\\23.83465\\-169.1369\\-39\\24.33465\\-169.6369\\-39\\24.33465\\-170.1369\\-39\\24.83465\\-170.6369\\-39\\24.83465\\-171.1369\\-39\\25.27518\\-171.6369\\-39\\25.33465\\-172.6369\\-39\\25.77518\\-173.1369\\-39\\25.83465\\-175.1369\\-39\\26.33465\\-176.1369\\-39\\26.33465\\-181.6369\\-39\\26.27518\\-182.6369\\-39\\25.83465\\-183.1369\\-39\\25.77518\\-185.1369\\-39\\25.33465\\-185.6369\\-39\\25.33465\\-186.6369\\-39\\24.83465\\-187.1369\\-39\\24.77518\\-188.1369\\-39\\23.83465\\-189.6369\\-39\\23.83465\\-190.1369\\-39\\23.33465\\-190.6369\\-39\\23.33465\\-191.1369\\-39\\22.83465\\-191.6369\\-39\\22.77518\\-192.1369\\-39\\21.83465\\-193.1369\\-39\\21.77518\\-193.6369\\-39\\19.83465\\-195.6369\\-39\\19.77518\\-196.1369\\-39\\19.08465\\-196.8274\\-39\\18.58465\\-196.8869\\-39\\16.58465\\-198.8274\\-39\\16.08465\\-198.8869\\-39\\15.08465\\-199.8274\\-39\\12.58465\\-200.8869\\-39\\12.08465\\-201.3274\\-39\\11.08465\\-201.3869\\-39\\10.58465\\-201.8274\\-39\\9.584647\\-201.8869\\-39\\9.084647\\-202.3274\\-39\\7.584647\\-202.3869\\-39\\7.084647\\-202.8274\\-39\\4.584647\\-202.8869\\-39\\4.084647\\-203.3274\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "134" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.915353\\-203.8274\\-37\\-5.415353\\-203.3869\\-37\\-6.915353\\-203.3274\\-37\\-7.415353\\-202.8869\\-37\\-8.915353\\-202.8274\\-37\\-9.415353\\-202.3869\\-37\\-10.41535\\-202.3274\\-37\\-12.91535\\-200.8869\\-37\\-13.41535\\-200.8274\\-37\\-14.41535\\-199.8869\\-37\\-14.91535\\-199.8274\\-37\\-16.41535\\-198.3869\\-37\\-16.91535\\-198.3274\\-37\\-19.10589\\-196.1369\\-37\\-19.16535\\-195.6369\\-37\\-21.10589\\-193.6369\\-37\\-21.16535\\-193.1369\\-37\\-22.10589\\-192.1369\\-37\\-22.66535\\-190.6369\\-37\\-23.16535\\-190.1369\\-37\\-23.16535\\-189.6369\\-37\\-23.66535\\-189.1369\\-37\\-23.66535\\-188.1369\\-37\\-24.16535\\-187.6369\\-37\\-24.16535\\-187.1369\\-37\\-24.60589\\-186.6369\\-37\\-24.66535\\-185.1369\\-37\\-25.10589\\-184.6369\\-37\\-25.16535\\-182.1369\\-37\\-25.60589\\-181.6369\\-37\\-25.66535\\-180.6369\\-37\\-25.66535\\-177.1369\\-37\\-25.60589\\-176.1369\\-37\\-25.16535\\-175.6369\\-37\\-25.10589\\-173.6369\\-37\\-24.66535\\-173.1369\\-37\\-24.66535\\-172.1369\\-37\\-24.16535\\-171.6369\\-37\\-24.10589\\-170.6369\\-37\\-23.66535\\-170.1369\\-37\\-23.66535\\-169.6369\\-37\\-23.16535\\-169.1369\\-37\\-23.16535\\-168.6369\\-37\\-22.66535\\-168.1369\\-37\\-22.60589\\-167.6369\\-37\\-21.16535\\-166.1369\\-37\\-21.10589\\-165.6369\\-37\\-18.91535\\-163.4464\\-37\\-18.41535\\-163.3869\\-37\\-17.41535\\-162.3869\\-37\\-16.91535\\-162.3869\\-37\\-15.91535\\-161.4464\\-37\\-15.41535\\-161.3869\\-37\\-14.91535\\-160.8869\\-37\\-14.41535\\-160.8869\\-37\\-13.91535\\-160.3869\\-37\\-13.41535\\-160.3869\\-37\\-12.91535\\-159.9464\\-37\\-11.91535\\-159.8869\\-37\\-11.41535\\-159.3869\\-37\\-9.915353\\-159.3869\\-37\\-9.415353\\-158.8869\\-37\\-7.415353\\-158.8869\\-37\\-6.415353\\-158.3869\\-37\\-2.915353\\-158.3869\\-37\\-2.415353\\-157.8869\\-37\\2.584647\\-157.8869\\-37\\3.084647\\-158.3869\\-37\\6.584647\\-158.3869\\-37\\7.584647\\-158.8869\\-37\\9.584647\\-158.8869\\-37\\10.08465\\-159.3869\\-37\\11.58465\\-159.3869\\-37\\12.08465\\-159.8869\\-37\\13.58465\\-159.8869\\-37\\14.08465\\-160.3869\\-37\\14.58465\\-160.3869\\-37\\15.08465\\-160.8869\\-37\\15.58465\\-160.8869\\-37\\16.08465\\-161.3869\\-37\\16.58465\\-161.3869\\-37\\17.08465\\-161.8869\\-37\\17.58465\\-161.8869\\-37\\18.58465\\-162.8869\\-37\\19.08465\\-162.8869\\-37\\23.33465\\-167.1369\\-37\\23.33465\\-167.6369\\-37\\24.33465\\-168.6369\\-37\\24.33465\\-169.1369\\-37\\24.83465\\-169.6369\\-37\\24.83465\\-170.1369\\-37\\25.27518\\-170.6369\\-37\\25.33465\\-171.6369\\-37\\25.77518\\-172.1369\\-37\\25.83465\\-173.6369\\-37\\26.33465\\-174.1369\\-37\\26.33465\\-175.6369\\-37\\26.83465\\-176.6369\\-37\\26.83465\\-180.6369\\-37\\26.77518\\-181.6369\\-37\\26.33465\\-182.1369\\-37\\26.27518\\-184.6369\\-37\\25.83465\\-185.1369\\-37\\25.77518\\-186.6369\\-37\\25.33465\\-187.1369\\-37\\25.33465\\-187.6369\\-37\\24.83465\\-188.1369\\-37\\24.77518\\-189.1369\\-37\\24.33465\\-189.6369\\-37\\24.33465\\-190.1369\\-37\\23.83465\\-190.6369\\-37\\23.83465\\-191.1369\\-37\\23.33465\\-191.6369\\-37\\23.27518\\-192.1369\\-37\\22.33465\\-193.1369\\-37\\22.27518\\-193.6369\\-37\\20.33465\\-195.6369\\-37\\20.27518\\-196.1369\\-37\\18.08465\\-198.3274\\-37\\17.58465\\-198.3869\\-37\\16.08465\\-199.8274\\-37\\14.58465\\-200.3869\\-37\\13.58465\\-201.3274\\-37\\12.58465\\-201.8274\\-37\\11.58465\\-201.8869\\-37\\11.08465\\-202.3274\\-37\\10.08465\\-202.3869\\-37\\9.584647\\-202.8274\\-37\\8.584647\\-202.8869\\-37\\8.084647\\-203.3274\\-37\\6.584647\\-203.3869\\-37\\6.084647\\-203.8274\\-37\\4.584647\\-203.8869\\-37\\-3.915353\\-203.8869\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "128" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.415353\\-204.8274\\-35\\-2.915353\\-204.3869\\-35\\-5.415353\\-204.3274\\-35\\-5.915353\\-203.8869\\-35\\-7.415353\\-203.8274\\-35\\-7.915353\\-203.3869\\-35\\-8.915353\\-203.3274\\-35\\-9.415353\\-202.8869\\-35\\-10.41535\\-202.8274\\-35\\-12.91535\\-201.3869\\-35\\-13.41535\\-201.3274\\-35\\-14.41535\\-200.3869\\-35\\-15.41535\\-199.8869\\-35\\-20.66535\\-194.6369\\-35\\-21.16535\\-193.6369\\-35\\-22.10589\\-192.6369\\-35\\-22.16535\\-192.1369\\-35\\-22.66535\\-191.6369\\-35\\-22.66535\\-191.1369\\-35\\-23.16535\\-190.6369\\-35\\-23.16535\\-190.1369\\-35\\-23.66535\\-189.6369\\-35\\-23.66535\\-188.6369\\-35\\-24.16535\\-188.1369\\-35\\-24.16535\\-187.6369\\-35\\-24.66535\\-187.1369\\-35\\-24.66535\\-185.6369\\-35\\-25.16535\\-185.1369\\-35\\-25.16535\\-183.6369\\-35\\-25.66535\\-182.6369\\-35\\-25.66535\\-175.1369\\-35\\-25.16535\\-174.1369\\-35\\-25.16535\\-173.1369\\-35\\-24.66535\\-172.6369\\-35\\-24.66535\\-171.6369\\-35\\-24.16535\\-171.1369\\-35\\-24.16535\\-170.1369\\-35\\-23.66535\\-169.6369\\-35\\-23.66535\\-169.1369\\-35\\-23.16535\\-168.6369\\-35\\-23.16535\\-168.1369\\-35\\-22.16535\\-167.1369\\-35\\-21.66535\\-166.1369\\-35\\-18.41535\\-162.8869\\-35\\-17.91535\\-162.8869\\-35\\-16.91535\\-161.8869\\-35\\-16.41535\\-161.8869\\-35\\-15.91535\\-161.3869\\-35\\-15.41535\\-161.3869\\-35\\-14.91535\\-160.8869\\-35\\-14.41535\\-160.8869\\-35\\-13.91535\\-160.3869\\-35\\-13.41535\\-160.3869\\-35\\-12.91535\\-159.8869\\-35\\-11.91535\\-159.8869\\-35\\-11.41535\\-159.3869\\-35\\-9.915353\\-159.3869\\-35\\-9.415353\\-158.8869\\-35\\-7.415353\\-158.8869\\-35\\-6.915353\\-158.3869\\-35\\-3.415353\\-158.3869\\-35\\-2.915353\\-157.8869\\-35\\3.084647\\-157.8869\\-35\\3.584647\\-158.3869\\-35\\7.084647\\-158.3869\\-35\\7.584647\\-158.8869\\-35\\9.584647\\-158.8869\\-35\\10.08465\\-159.3869\\-35\\11.58465\\-159.3869\\-35\\12.08465\\-159.8869\\-35\\13.58465\\-159.8869\\-35\\14.08465\\-160.3869\\-35\\14.58465\\-160.3869\\-35\\15.08465\\-160.8869\\-35\\15.58465\\-160.8869\\-35\\16.08465\\-161.3869\\-35\\16.58465\\-161.3869\\-35\\17.08465\\-161.8869\\-35\\17.58465\\-161.8869\\-35\\18.08465\\-162.3869\\-35\\18.58465\\-162.3869\\-35\\20.08465\\-163.8869\\-35\\20.58465\\-163.8869\\-35\\22.77518\\-166.1369\\-35\\22.83465\\-166.6369\\-35\\23.83465\\-167.6369\\-35\\23.83465\\-168.1369\\-35\\24.83465\\-169.1369\\-35\\24.83465\\-169.6369\\-35\\25.27518\\-170.1369\\-35\\25.33465\\-171.1369\\-35\\25.83465\\-171.6369\\-35\\25.83465\\-172.6369\\-35\\26.33465\\-173.1369\\-35\\26.33465\\-174.1369\\-35\\26.83465\\-175.1369\\-35\\26.83465\\-182.6369\\-35\\26.33465\\-183.6369\\-35\\26.33465\\-185.1369\\-35\\25.83465\\-185.6369\\-35\\25.83465\\-187.1369\\-35\\25.33465\\-187.6369\\-35\\25.27518\\-188.6369\\-35\\24.83465\\-189.1369\\-35\\24.83465\\-189.6369\\-35\\24.33465\\-190.1369\\-35\\24.33465\\-190.6369\\-35\\23.83465\\-191.1369\\-35\\23.83465\\-191.6369\\-35\\23.33465\\-192.1369\\-35\\23.27518\\-192.6369\\-35\\22.33465\\-193.6369\\-35\\21.83465\\-194.6369\\-35\\16.58465\\-199.8869\\-35\\15.58465\\-200.3869\\-35\\15.08465\\-200.8869\\-35\\14.58465\\-200.8869\\-35\\13.58465\\-201.8274\\-35\\12.08465\\-202.3869\\-35\\11.58465\\-202.8274\\-35\\10.58465\\-202.8869\\-35\\10.08465\\-203.3274\\-35\\9.084647\\-203.3869\\-35\\8.584647\\-203.8274\\-35\\7.084647\\-203.8869\\-35\\6.584647\\-204.3274\\-35\\4.084647\\-204.3869\\-35\\3.584647\\-204.8274\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "151" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.415353\\-205.3274\\-33\\-2.915353\\-204.8869\\-33\\-5.415353\\-204.8274\\-33\\-5.915353\\-204.3869\\-33\\-7.415353\\-204.3274\\-33\\-7.915353\\-203.8869\\-33\\-8.915353\\-203.8274\\-33\\-9.415353\\-203.3869\\-33\\-9.915353\\-203.3869\\-33\\-10.41535\\-202.8869\\-33\\-10.91535\\-202.8869\\-33\\-11.41535\\-202.3869\\-33\\-11.91535\\-202.3869\\-33\\-12.41535\\-201.8869\\-33\\-12.91535\\-201.8869\\-33\\-13.41535\\-201.3869\\-33\\-13.91535\\-201.3274\\-33\\-15.91535\\-199.3869\\-33\\-16.41535\\-199.3869\\-33\\-19.10589\\-196.6369\\-33\\-19.16535\\-196.1369\\-33\\-21.16535\\-194.1369\\-33\\-21.16535\\-193.6369\\-33\\-22.16535\\-192.6369\\-33\\-22.16535\\-192.1369\\-33\\-22.66535\\-191.6369\\-33\\-22.66535\\-191.1369\\-33\\-23.16535\\-190.6369\\-33\\-23.16535\\-190.1369\\-33\\-23.66535\\-189.6369\\-33\\-23.66535\\-189.1369\\-33\\-24.16535\\-188.6369\\-33\\-24.16535\\-187.6369\\-33\\-24.66535\\-187.1369\\-33\\-24.66535\\-185.6369\\-33\\-25.16535\\-185.1369\\-33\\-25.16535\\-183.6369\\-33\\-25.66535\\-183.1369\\-33\\-25.66535\\-179.6369\\-33\\-26.16535\\-179.1369\\-33\\-26.16535\\-178.6369\\-33\\-25.66535\\-178.1369\\-33\\-25.66535\\-174.6369\\-33\\-25.16535\\-174.1369\\-33\\-25.16535\\-173.1369\\-33\\-24.66535\\-172.6369\\-33\\-24.66535\\-171.6369\\-33\\-24.16535\\-171.1369\\-33\\-24.16535\\-170.1369\\-33\\-23.66535\\-169.6369\\-33\\-23.66535\\-169.1369\\-33\\-23.16535\\-168.6369\\-33\\-23.16535\\-168.1369\\-33\\-22.16535\\-167.1369\\-33\\-22.16535\\-166.6369\\-33\\-18.41535\\-162.8869\\-33\\-17.91535\\-162.8869\\-33\\-16.91535\\-161.8869\\-33\\-16.41535\\-161.8869\\-33\\-15.91535\\-161.3869\\-33\\-15.41535\\-161.3869\\-33\\-14.91535\\-160.8869\\-33\\-14.41535\\-160.8869\\-33\\-13.91535\\-160.3869\\-33\\-13.41535\\-160.3869\\-33\\-12.91535\\-159.8869\\-33\\-11.91535\\-159.8869\\-33\\-11.41535\\-159.3869\\-33\\-9.915353\\-159.3869\\-33\\-9.415353\\-158.8869\\-33\\-6.915353\\-158.8274\\-33\\-6.415353\\-158.3869\\-33\\-2.415353\\-158.3869\\-33\\-1.415353\\-157.8869\\-33\\0.0846473\\-157.8869\\-33\\0.5846473\\-158.3274\\-33\\1.584647\\-158.3869\\-33\\6.584647\\-158.3869\\-33\\7.084647\\-158.8869\\-33\\9.584647\\-158.8869\\-33\\10.08465\\-159.3869\\-33\\11.58465\\-159.3869\\-33\\12.08465\\-159.8869\\-33\\13.58465\\-159.8869\\-33\\14.08465\\-160.3869\\-33\\14.58465\\-160.3869\\-33\\15.08465\\-160.8869\\-33\\15.58465\\-160.8869\\-33\\16.08465\\-161.3869\\-33\\16.58465\\-161.3869\\-33\\17.08465\\-161.8869\\-33\\17.58465\\-161.8869\\-33\\18.08465\\-162.3869\\-33\\18.58465\\-162.3869\\-33\\20.08465\\-163.8869\\-33\\20.58465\\-163.8869\\-33\\22.83465\\-166.1369\\-33\\22.83465\\-166.6369\\-33\\23.83465\\-167.6369\\-33\\23.89411\\-168.1369\\-33\\24.83465\\-169.1369\\-33\\24.83465\\-169.6369\\-33\\25.33465\\-170.1369\\-33\\25.33465\\-171.1369\\-33\\25.83465\\-171.6369\\-33\\25.83465\\-172.6369\\-33\\26.33465\\-173.1369\\-33\\26.33465\\-174.1369\\-33\\26.83465\\-174.6369\\-33\\26.83465\\-177.6369\\-33\\27.33465\\-178.1369\\-33\\27.33465\\-179.1369\\-33\\26.83465\\-179.6369\\-33\\26.83465\\-183.1369\\-33\\26.33465\\-183.6369\\-33\\26.33465\\-185.1369\\-33\\25.83465\\-185.6369\\-33\\25.83465\\-187.1369\\-33\\25.33465\\-187.6369\\-33\\25.33465\\-188.6369\\-33\\24.83465\\-189.1369\\-33\\24.83465\\-189.6369\\-33\\24.33465\\-190.1369\\-33\\24.33465\\-190.6369\\-33\\23.83465\\-191.1369\\-33\\23.83465\\-191.6369\\-33\\23.33465\\-192.1369\\-33\\23.33465\\-192.6369\\-33\\22.33465\\-193.6369\\-33\\22.33465\\-194.1369\\-33\\20.83465\\-195.6369\\-33\\20.77518\\-196.1369\\-33\\17.58465\\-199.3869\\-33\\17.08465\\-199.3869\\-33\\15.08465\\-201.3274\\-33\\14.58465\\-201.3869\\-33\\14.08465\\-201.8869\\-33\\13.58465\\-201.8869\\-33\\13.08465\\-202.3869\\-33\\12.58465\\-202.3869\\-33\\12.08465\\-202.8869\\-33\\11.58465\\-202.8869\\-33\\11.08465\\-203.3869\\-33\\10.58465\\-203.3869\\-33\\10.08465\\-203.8274\\-33\\9.084647\\-203.8869\\-33\\8.584647\\-204.3274\\-33\\7.084647\\-204.3869\\-33\\6.584647\\-204.8274\\-33\\4.084647\\-204.8869\\-33\\3.584647\\-205.3274\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "136" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.415353\\-205.8274\\-31\\-1.915353\\-205.3869\\-31\\-4.915353\\-205.3274\\-31\\-5.415353\\-204.8869\\-31\\-6.915353\\-204.8274\\-31\\-7.415353\\-204.3869\\-31\\-8.415353\\-204.3869\\-31\\-8.915353\\-203.8869\\-31\\-9.415353\\-203.8869\\-31\\-9.915353\\-203.3869\\-31\\-10.41535\\-203.3869\\-31\\-10.91535\\-202.8869\\-31\\-11.41535\\-202.8869\\-31\\-11.91535\\-202.3869\\-31\\-12.41535\\-202.3869\\-31\\-13.41535\\-201.3869\\-31\\-13.91535\\-201.3869\\-31\\-15.91535\\-199.3869\\-31\\-16.41535\\-199.3869\\-31\\-19.16535\\-196.6369\\-31\\-19.16535\\-196.1369\\-31\\-21.16535\\-194.1369\\-31\\-21.16535\\-193.6369\\-31\\-22.16535\\-192.6369\\-31\\-22.16535\\-192.1369\\-31\\-22.66535\\-191.6369\\-31\\-22.66535\\-191.1369\\-31\\-23.16535\\-190.6369\\-31\\-23.16535\\-190.1369\\-31\\-23.66535\\-189.6369\\-31\\-23.72482\\-188.6369\\-31\\-24.16535\\-188.1369\\-31\\-24.16535\\-187.6369\\-31\\-24.66535\\-187.1369\\-31\\-24.66535\\-185.6369\\-31\\-25.16535\\-185.1369\\-31\\-25.22482\\-183.1369\\-31\\-25.66535\\-182.6369\\-31\\-25.66535\\-175.1369\\-31\\-25.16535\\-174.6369\\-31\\-25.16535\\-173.6369\\-31\\-24.72482\\-173.1369\\-31\\-24.66535\\-171.6369\\-31\\-24.16535\\-171.1369\\-31\\-24.16535\\-170.6369\\-31\\-23.72482\\-170.1369\\-31\\-23.16535\\-168.6369\\-31\\-22.66535\\-168.1369\\-31\\-22.66535\\-167.6369\\-31\\-21.22482\\-166.1369\\-31\\-21.16535\\-165.6369\\-31\\-18.91535\\-163.3869\\-31\\-18.41535\\-163.3869\\-31\\-17.41535\\-162.3869\\-31\\-16.91535\\-162.3274\\-31\\-15.91535\\-161.3869\\-31\\-15.41535\\-161.3869\\-31\\-14.91535\\-160.8869\\-31\\-14.41535\\-160.8869\\-31\\-13.91535\\-160.3869\\-31\\-12.91535\\-160.3869\\-31\\-12.41535\\-159.8869\\-31\\-11.41535\\-159.8274\\-31\\-10.91535\\-159.3869\\-31\\-9.415353\\-159.3869\\-31\\-8.915353\\-158.8869\\-31\\-5.915353\\-158.8274\\-31\\-5.415353\\-158.3869\\-31\\5.584647\\-158.3869\\-31\\6.084647\\-158.8869\\-31\\9.084647\\-158.8869\\-31\\9.584647\\-159.3869\\-31\\11.58465\\-159.3869\\-31\\12.08465\\-159.8869\\-31\\13.08465\\-159.8869\\-31\\13.58465\\-160.3869\\-31\\14.58465\\-160.3869\\-31\\15.08465\\-160.8869\\-31\\15.58465\\-160.8869\\-31\\16.08465\\-161.3869\\-31\\16.58465\\-161.3869\\-31\\17.08465\\-161.8869\\-31\\17.58465\\-161.8869\\-31\\18.58465\\-162.8869\\-31\\19.08465\\-162.8869\\-31\\23.83465\\-167.6369\\-31\\23.83465\\-168.1369\\-31\\24.33465\\-168.6369\\-31\\24.33465\\-169.1369\\-31\\24.83465\\-169.6369\\-31\\24.83465\\-170.1369\\-31\\25.33465\\-170.6369\\-31\\25.33465\\-171.1369\\-31\\25.83465\\-171.6369\\-31\\25.89411\\-173.1369\\-31\\26.33465\\-173.6369\\-31\\26.33465\\-174.6369\\-31\\26.83465\\-175.1369\\-31\\26.83465\\-182.6369\\-31\\26.39411\\-183.1369\\-31\\26.33465\\-185.1369\\-31\\25.83465\\-185.6369\\-31\\25.83465\\-187.1369\\-31\\25.33465\\-187.6369\\-31\\25.33465\\-188.6369\\-31\\24.83465\\-189.1369\\-31\\24.83465\\-189.6369\\-31\\24.33465\\-190.1369\\-31\\24.33465\\-190.6369\\-31\\23.83465\\-191.1369\\-31\\23.83465\\-191.6369\\-31\\23.33465\\-192.1369\\-31\\23.33465\\-192.6369\\-31\\22.33465\\-193.6369\\-31\\22.33465\\-194.1369\\-31\\20.83465\\-195.6369\\-31\\20.83465\\-196.1369\\-31\\17.08465\\-199.8869\\-31\\16.58465\\-199.8869\\-31\\14.58465\\-201.8869\\-31\\14.08465\\-201.8869\\-31\\13.58465\\-202.3869\\-31\\13.08465\\-202.3869\\-31\\12.58465\\-202.8869\\-31\\12.08465\\-202.8869\\-31\\11.58465\\-203.3869\\-31\\11.08465\\-203.3869\\-31\\10.58465\\-203.8869\\-31\\10.08465\\-203.8869\\-31\\9.584647\\-204.3274\\-31\\8.584647\\-204.3869\\-31\\8.084647\\-204.8274\\-31\\6.584647\\-204.8869\\-31\\6.084647\\-205.3274\\-31\\3.084647\\-205.3869\\-31\\2.584647\\-205.8274\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.415353\\-205.8869\\-29\\-3.915353\\-205.3869\\-29\\-5.415353\\-205.3869\\-29\\-5.915353\\-204.8869\\-29\\-7.415353\\-204.8869\\-29\\-7.915353\\-204.3869\\-29\\-8.415353\\-204.3869\\-29\\-8.915353\\-203.8869\\-29\\-9.415353\\-203.8869\\-29\\-9.915353\\-203.3869\\-29\\-10.41535\\-203.3869\\-29\\-10.91535\\-202.8869\\-29\\-11.41535\\-202.8869\\-29\\-11.91535\\-202.3869\\-29\\-12.41535\\-202.3869\\-29\\-13.41535\\-201.3869\\-29\\-13.91535\\-201.3869\\-29\\-16.41535\\-198.9464\\-29\\-16.91535\\-198.8869\\-29\\-18.16535\\-197.6369\\-29\\-18.22482\\-197.1369\\-29\\-20.66535\\-194.6369\\-29\\-20.66535\\-194.1369\\-29\\-21.66535\\-193.1369\\-29\\-21.66535\\-192.6369\\-29\\-22.16535\\-192.1369\\-29\\-22.16535\\-191.6369\\-29\\-22.66535\\-191.1369\\-29\\-22.66535\\-190.6369\\-29\\-23.16535\\-190.1369\\-29\\-23.16535\\-189.6369\\-29\\-23.66535\\-189.1369\\-29\\-23.72482\\-188.1369\\-29\\-24.16535\\-187.6369\\-29\\-24.22482\\-186.6369\\-29\\-24.66535\\-186.1369\\-29\\-24.72482\\-184.6369\\-29\\-25.16535\\-184.1369\\-29\\-25.22482\\-180.6369\\-29\\-25.66535\\-180.1369\\-29\\-25.66535\\-178.1369\\-29\\-25.22482\\-177.6369\\-29\\-25.16535\\-174.6369\\-29\\-24.72482\\-174.1369\\-29\\-24.66535\\-172.6369\\-29\\-24.16535\\-172.1369\\-29\\-24.16535\\-171.1369\\-29\\-23.66535\\-170.6369\\-29\\-23.66535\\-170.1369\\-29\\-23.16535\\-169.1369\\-29\\-22.66535\\-168.6369\\-29\\-22.66535\\-168.1369\\-29\\-21.22482\\-166.6369\\-29\\-21.16535\\-166.1369\\-29\\-18.41535\\-163.3869\\-29\\-17.91535\\-163.3274\\-29\\-16.91535\\-162.3869\\-29\\-16.41535\\-162.3274\\-29\\-15.41535\\-161.3869\\-29\\-14.91535\\-161.3869\\-29\\-14.41535\\-160.8869\\-29\\-13.41535\\-160.8274\\-29\\-11.91535\\-159.8869\\-29\\-10.91535\\-159.8869\\-29\\-10.41535\\-159.3869\\-29\\-7.915353\\-159.3274\\-29\\-7.415353\\-158.8869\\-29\\-3.415353\\-158.8274\\-29\\-2.915353\\-158.3869\\-29\\2.584647\\-158.3869\\-29\\3.084647\\-158.8274\\-29\\4.084647\\-158.8869\\-29\\7.584647\\-158.8869\\-29\\8.084647\\-159.3274\\-29\\10.58465\\-159.3869\\-29\\11.08465\\-159.8274\\-29\\12.58465\\-159.8869\\-29\\13.08465\\-160.3869\\-29\\14.08465\\-160.3869\\-29\\14.58465\\-160.8869\\-29\\15.08465\\-160.8869\\-29\\15.58465\\-161.3869\\-29\\16.08465\\-161.3869\\-29\\16.58465\\-161.8869\\-29\\17.08465\\-161.8869\\-29\\18.08465\\-162.8274\\-29\\18.58465\\-162.8869\\-29\\20.08465\\-164.3274\\-29\\20.58465\\-164.3869\\-29\\21.83465\\-165.6369\\-29\\21.89411\\-166.1369\\-29\\23.33465\\-167.6369\\-29\\23.39411\\-168.1369\\-29\\24.33465\\-169.1369\\-29\\24.33465\\-169.6369\\-29\\24.83465\\-170.1369\\-29\\24.89411\\-171.1369\\-29\\25.33465\\-171.6369\\-29\\25.33465\\-172.1369\\-29\\25.83465\\-172.6369\\-29\\25.89411\\-174.1369\\-29\\26.33465\\-174.6369\\-29\\26.39411\\-177.1369\\-29\\26.83465\\-177.6369\\-29\\26.83465\\-180.1369\\-29\\26.39411\\-180.6369\\-29\\26.33465\\-184.1369\\-29\\25.89411\\-184.6369\\-29\\25.83465\\-186.1369\\-29\\25.39411\\-186.6369\\-29\\25.33465\\-188.1369\\-29\\24.83465\\-188.6369\\-29\\24.83465\\-189.1369\\-29\\24.33465\\-189.6369\\-29\\24.33465\\-190.1369\\-29\\23.83465\\-190.6369\\-29\\23.83465\\-191.1369\\-29\\23.33465\\-191.6369\\-29\\23.33465\\-192.1369\\-29\\22.83465\\-192.6369\\-29\\22.83465\\-193.1369\\-29\\21.89411\\-194.1369\\-29\\21.83465\\-194.6369\\-29\\20.39411\\-196.1369\\-29\\20.33465\\-196.6369\\-29\\17.08465\\-199.8869\\-29\\16.58465\\-199.8869\\-29\\14.58465\\-201.8869\\-29\\14.08465\\-201.8869\\-29\\13.58465\\-202.3869\\-29\\13.08465\\-202.3869\\-29\\12.58465\\-202.8869\\-29\\12.08465\\-202.8869\\-29\\11.58465\\-203.3869\\-29\\11.08465\\-203.3869\\-29\\10.58465\\-203.8869\\-29\\10.08465\\-203.8869\\-29\\9.584647\\-204.3869\\-29\\9.084647\\-204.3869\\-29\\8.584647\\-204.8869\\-29\\7.084647\\-204.8869\\-29\\6.584647\\-205.3869\\-29\\5.084647\\-205.3869\\-29\\4.584647\\-205.8869\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "128" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.4153527\\-206.3869\\-27\\-0.9153527\\-205.8869\\-27\\-3.415353\\-205.8869\\-27\\-3.915353\\-205.3869\\-27\\-5.415353\\-205.3869\\-27\\-5.915353\\-204.8869\\-27\\-7.415353\\-204.8869\\-27\\-7.915353\\-204.3869\\-27\\-8.415353\\-204.3869\\-27\\-8.915353\\-203.8869\\-27\\-9.415353\\-203.8869\\-27\\-9.915353\\-203.3869\\-27\\-10.41535\\-203.3869\\-27\\-10.91535\\-202.8869\\-27\\-11.41535\\-202.8869\\-27\\-11.91535\\-202.3869\\-27\\-12.41535\\-202.3869\\-27\\-13.91535\\-200.9464\\-27\\-14.41535\\-200.8869\\-27\\-19.16535\\-196.1369\\-27\\-19.22482\\-195.6369\\-27\\-20.66535\\-194.1369\\-27\\-21.22482\\-192.6369\\-27\\-22.16535\\-191.6369\\-27\\-22.16535\\-191.1369\\-27\\-22.66535\\-190.6369\\-27\\-22.72482\\-189.6369\\-27\\-23.66535\\-188.1369\\-27\\-23.72482\\-187.1369\\-27\\-24.16535\\-186.6369\\-27\\-24.22482\\-185.1369\\-27\\-24.66535\\-184.6369\\-27\\-24.72482\\-181.6369\\-27\\-25.16535\\-181.1369\\-27\\-25.16535\\-177.6369\\-27\\-24.72482\\-177.1369\\-27\\-24.66535\\-174.1369\\-27\\-24.22482\\-173.6369\\-27\\-24.16535\\-172.6369\\-27\\-23.72482\\-172.1369\\-27\\-23.66535\\-171.1369\\-27\\-22.72482\\-169.6369\\-27\\-22.66535\\-169.1369\\-27\\-21.72482\\-168.1369\\-27\\-21.66535\\-167.6369\\-27\\-20.72482\\-166.6369\\-27\\-20.66535\\-166.1369\\-27\\-18.41535\\-163.8869\\-27\\-17.91535\\-163.8274\\-27\\-16.91535\\-162.8869\\-27\\-16.41535\\-162.8274\\-27\\-15.41535\\-161.8869\\-27\\-14.91535\\-161.8869\\-27\\-14.41535\\-161.3869\\-27\\-13.91535\\-161.3869\\-27\\-13.41535\\-160.8869\\-27\\-12.91535\\-160.8869\\-27\\-12.41535\\-160.3869\\-27\\-11.41535\\-160.3869\\-27\\-10.91535\\-159.8869\\-27\\-9.415353\\-159.8274\\-27\\-8.915353\\-159.3869\\-27\\-5.915353\\-159.3274\\-27\\-5.415353\\-158.8869\\-27\\5.084647\\-158.8869\\-27\\5.584647\\-159.3274\\-27\\9.084647\\-159.3869\\-27\\9.584647\\-159.8274\\-27\\11.08465\\-159.8869\\-27\\11.58465\\-160.3274\\-27\\13.08465\\-160.3869\\-27\\13.58465\\-160.8869\\-27\\14.08465\\-160.8869\\-27\\17.08465\\-162.3869\\-27\\18.08465\\-163.3274\\-27\\18.58465\\-163.3869\\-27\\19.39411\\-164.1369\\-27\\22.83465\\-167.6369\\-27\\22.89411\\-168.1369\\-27\\23.83465\\-169.1369\\-27\\23.83465\\-169.6369\\-27\\24.33465\\-170.1369\\-27\\24.33465\\-170.6369\\-27\\24.83465\\-171.1369\\-27\\24.89411\\-172.1369\\-27\\25.33465\\-172.6369\\-27\\25.39411\\-173.6369\\-27\\25.83465\\-174.1369\\-27\\25.89411\\-176.6369\\-27\\26.33465\\-177.1369\\-27\\26.33465\\-181.1369\\-27\\25.89411\\-181.6369\\-27\\25.83465\\-184.6369\\-27\\25.39411\\-185.1369\\-27\\25.33465\\-186.6369\\-27\\24.89411\\-187.1369\\-27\\24.83465\\-188.1369\\-27\\24.39411\\-188.6369\\-27\\24.33465\\-189.6369\\-27\\23.83465\\-190.1369\\-27\\23.83465\\-190.6369\\-27\\23.33465\\-191.1369\\-27\\23.33465\\-191.6369\\-27\\22.83465\\-192.1369\\-27\\22.83465\\-192.6369\\-27\\21.89411\\-193.6369\\-27\\21.83465\\-194.1369\\-27\\20.89411\\-195.1369\\-27\\20.83465\\-195.6369\\-27\\15.08465\\-201.3869\\-27\\14.58465\\-201.3869\\-27\\13.58465\\-202.3869\\-27\\13.08465\\-202.3869\\-27\\12.58465\\-202.8869\\-27\\12.08465\\-202.8869\\-27\\11.58465\\-203.3869\\-27\\11.08465\\-203.3869\\-27\\10.58465\\-203.8869\\-27\\10.08465\\-203.8869\\-27\\9.584647\\-204.3869\\-27\\9.084647\\-204.3869\\-27\\8.584647\\-204.8869\\-27\\7.584647\\-204.8869\\-27\\7.084647\\-205.3869\\-27\\5.584647\\-205.3869\\-27\\5.084647\\-205.8869\\-27\\2.584647\\-205.8869\\-27\\2.084647\\-206.3869\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "118" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.915353\\-205.8869\\-25\\-3.415353\\-205.3869\\-25\\-5.415353\\-205.3869\\-25\\-5.915353\\-204.8869\\-25\\-6.915353\\-204.8869\\-25\\-7.415353\\-204.3869\\-25\\-7.915353\\-204.3869\\-25\\-10.41535\\-202.9464\\-25\\-10.91535\\-202.8869\\-25\\-11.41535\\-202.3869\\-25\\-11.91535\\-202.3869\\-25\\-13.41535\\-200.9464\\-25\\-13.91535\\-200.8869\\-25\\-17.41535\\-197.4464\\-25\\-18.66535\\-196.1369\\-25\\-18.72482\\-195.6369\\-25\\-19.66535\\-194.6369\\-25\\-19.72482\\-194.1369\\-25\\-20.66535\\-193.1369\\-25\\-21.22482\\-191.6369\\-25\\-21.66535\\-191.1369\\-25\\-22.22482\\-189.6369\\-25\\-22.66535\\-189.1369\\-25\\-22.72482\\-188.1369\\-25\\-23.16535\\-187.6369\\-25\\-23.22482\\-186.6369\\-25\\-23.66535\\-186.1369\\-25\\-23.72482\\-185.1369\\-25\\-24.16535\\-184.6369\\-25\\-24.22482\\-181.1369\\-25\\-24.66535\\-180.6369\\-25\\-24.66535\\-178.1369\\-25\\-24.22482\\-177.6369\\-25\\-24.16535\\-174.6369\\-25\\-23.72482\\-174.1369\\-25\\-23.66535\\-172.6369\\-25\\-22.66535\\-170.6369\\-25\\-22.22482\\-170.1369\\-25\\-21.66535\\-168.6369\\-25\\-20.72482\\-167.6369\\-25\\-20.66535\\-167.1369\\-25\\-19.91535\\-166.3274\\-25\\-17.41535\\-163.8869\\-25\\-16.91535\\-163.8274\\-25\\-15.91535\\-162.8869\\-25\\-15.41535\\-162.8274\\-25\\-14.41535\\-161.8869\\-25\\-13.91535\\-161.8869\\-25\\-13.41535\\-161.3869\\-25\\-12.41535\\-161.3274\\-25\\-10.91535\\-160.3869\\-25\\-9.415353\\-160.3274\\-25\\-8.915353\\-159.8869\\-25\\-6.915353\\-159.8274\\-25\\-6.415353\\-159.3869\\-25\\6.584647\\-159.3869\\-25\\7.084647\\-159.8274\\-25\\9.584647\\-159.8869\\-25\\10.08465\\-160.3274\\-25\\11.58465\\-160.3869\\-25\\12.08465\\-160.8869\\-25\\12.58465\\-160.8869\\-25\\13.08465\\-161.3274\\-25\\14.08465\\-161.3869\\-25\\14.58465\\-161.8869\\-25\\15.08465\\-161.8869\\-25\\16.08465\\-162.3869\\-25\\17.08465\\-163.3274\\-25\\17.58465\\-163.3869\\-25\\18.58465\\-164.3274\\-25\\19.08465\\-164.3869\\-25\\21.33465\\-166.6369\\-25\\21.39411\\-167.1369\\-25\\22.83465\\-168.6369\\-25\\23.39411\\-170.1369\\-25\\24.33465\\-171.6369\\-25\\24.39411\\-172.6369\\-25\\24.83465\\-173.1369\\-25\\24.89411\\-174.1369\\-25\\25.33465\\-174.6369\\-25\\25.39411\\-177.6369\\-25\\25.83465\\-178.1369\\-25\\25.83465\\-181.1369\\-25\\25.39411\\-181.6369\\-25\\25.33465\\-184.6369\\-25\\24.89411\\-185.1369\\-25\\24.83465\\-186.6369\\-25\\24.39411\\-187.1369\\-25\\24.33465\\-188.1369\\-25\\23.83465\\-188.6369\\-25\\23.83465\\-189.1369\\-25\\23.39411\\-189.6369\\-25\\23.33465\\-190.6369\\-25\\22.83465\\-191.1369\\-25\\22.83465\\-191.6369\\-25\\21.89411\\-192.6369\\-25\\21.33465\\-194.1369\\-25\\20.39411\\-195.1369\\-25\\20.33465\\-195.6369\\-25\\18.39411\\-197.6369\\-25\\18.33465\\-198.1369\\-25\\17.08465\\-199.3869\\-25\\16.58465\\-199.4464\\-25\\14.58465\\-201.3869\\-25\\14.08465\\-201.4464\\-25\\13.08465\\-202.3869\\-25\\12.58465\\-202.4464\\-25\\11.58465\\-203.3869\\-25\\11.08465\\-203.3869\\-25\\10.58465\\-203.8869\\-25\\10.08465\\-203.8869\\-25\\9.584647\\-204.3869\\-25\\8.584647\\-204.4464\\-25\\8.084647\\-204.8869\\-25\\7.084647\\-204.8869\\-25\\6.584647\\-205.3869\\-25\\4.584647\\-205.4464\\-25\\4.084647\\-205.8869\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "102" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.915353\\-205.3869\\-23\\-4.415353\\-204.9464\\-23\\-5.915353\\-204.8869\\-23\\-6.415353\\-204.3869\\-23\\-6.915353\\-204.3869\\-23\\-8.415353\\-203.4464\\-23\\-9.415353\\-203.3869\\-23\\-10.41535\\-202.4464\\-23\\-10.91535\\-202.3869\\-23\\-11.91535\\-201.4464\\-23\\-12.41535\\-201.3869\\-23\\-13.41535\\-200.4464\\-23\\-13.91535\\-200.3869\\-23\\-17.16535\\-197.1369\\-23\\-17.22482\\-196.6369\\-23\\-18.66535\\-195.1369\\-23\\-18.72482\\-194.6369\\-23\\-19.66535\\-193.6369\\-23\\-20.22482\\-192.1369\\-23\\-21.16535\\-191.1369\\-23\\-21.22482\\-190.1369\\-23\\-22.16535\\-188.6369\\-23\\-22.22482\\-187.6369\\-23\\-22.66535\\-187.1369\\-23\\-22.72482\\-186.1369\\-23\\-23.16535\\-185.6369\\-23\\-23.22482\\-183.6369\\-23\\-23.66535\\-183.1369\\-23\\-23.66535\\-175.6369\\-23\\-23.22482\\-175.1369\\-23\\-23.16535\\-173.6369\\-23\\-22.72482\\-173.1369\\-23\\-22.66535\\-172.1369\\-23\\-21.22482\\-169.6369\\-23\\-21.16535\\-169.1369\\-23\\-20.22482\\-168.1369\\-23\\-20.16535\\-167.6369\\-23\\-19.41535\\-166.8274\\-23\\-16.41535\\-163.8869\\-23\\-15.91535\\-163.8274\\-23\\-14.91535\\-162.8869\\-23\\-11.91535\\-161.3869\\-23\\-10.91535\\-161.3274\\-23\\-10.41535\\-160.8869\\-23\\-9.415353\\-160.8274\\-23\\-8.915353\\-160.3869\\-23\\-6.915353\\-160.3274\\-23\\-6.415353\\-159.8869\\-23\\-2.915353\\-159.8274\\-23\\2.584647\\-159.8274\\-23\\3.084647\\-159.8869\\-23\\7.084647\\-159.8869\\-23\\7.584647\\-160.3274\\-23\\9.084647\\-160.3869\\-23\\9.584647\\-160.8274\\-23\\11.08465\\-160.8869\\-23\\11.58465\\-161.3274\\-23\\12.58465\\-161.3869\\-23\\15.08465\\-162.8274\\-23\\16.58465\\-163.3869\\-23\\18.08465\\-164.8274\\-23\\18.58465\\-164.8869\\-23\\20.83465\\-167.1369\\-23\\20.89411\\-167.6369\\-23\\21.83465\\-168.6369\\-23\\22.39411\\-170.1369\\-23\\22.83465\\-170.6369\\-23\\23.89411\\-173.1369\\-23\\24.33465\\-173.6369\\-23\\24.39411\\-175.6369\\-23\\24.83465\\-176.1369\\-23\\24.83465\\-183.1369\\-23\\24.39411\\-183.6369\\-23\\24.33465\\-185.6369\\-23\\23.89411\\-186.1369\\-23\\23.83465\\-187.1369\\-23\\23.39411\\-187.6369\\-23\\23.33465\\-188.6369\\-23\\22.39411\\-190.1369\\-23\\22.33465\\-191.1369\\-23\\21.83465\\-192.1369\\-23\\20.89411\\-193.1369\\-23\\20.33465\\-194.6369\\-23\\18.89411\\-196.1369\\-23\\18.83465\\-196.6369\\-23\\16.39411\\-199.1369\\-23\\14.58465\\-200.8869\\-23\\14.08465\\-200.9464\\-23\\13.08465\\-201.8869\\-23\\12.58465\\-201.9464\\-23\\11.58465\\-202.8869\\-23\\11.08465\\-202.8869\\-23\\10.58465\\-203.3869\\-23\\10.08465\\-203.3869\\-23\\9.584647\\-203.8869\\-23\\9.084647\\-203.8869\\-23\\8.584647\\-204.3869\\-23\\7.584647\\-204.4464\\-23\\7.084647\\-204.8869\\-23\\5.584647\\-204.9464\\-23\\5.084647\\-205.3869\\-23\\-0.9153527\\-205.4464\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "99" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.415353\\-204.8869\\-21\\-3.915353\\-204.4464\\-21\\-5.415353\\-204.3869\\-21\\-5.915353\\-203.9464\\-21\\-6.915353\\-203.8869\\-21\\-8.415353\\-202.9464\\-21\\-9.915353\\-202.3869\\-21\\-10.91535\\-201.4464\\-21\\-11.41535\\-201.3869\\-21\\-13.41535\\-199.4464\\-21\\-13.91535\\-199.3869\\-21\\-16.16535\\-197.1369\\-21\\-16.22482\\-196.6369\\-21\\-17.66535\\-195.1369\\-21\\-17.72482\\-194.6369\\-21\\-18.66535\\-193.6369\\-21\\-19.22482\\-192.1369\\-21\\-20.16535\\-191.1369\\-21\\-20.66535\\-190.1369\\-21\\-20.72482\\-189.1369\\-21\\-21.16535\\-188.6369\\-21\\-21.22482\\-187.6369\\-21\\-21.66535\\-187.1369\\-21\\-21.72482\\-186.1369\\-21\\-22.16535\\-185.6369\\-21\\-22.22482\\-184.1369\\-21\\-22.66535\\-183.6369\\-21\\-22.72482\\-181.1369\\-21\\-22.72482\\-177.6369\\-21\\-22.66535\\-175.6369\\-21\\-22.22482\\-175.1369\\-21\\-22.16535\\-173.6369\\-21\\-21.22482\\-172.1369\\-21\\-21.16535\\-171.1369\\-21\\-20.66535\\-170.1369\\-21\\-19.72482\\-169.1369\\-21\\-19.66535\\-168.6369\\-21\\-18.72482\\-167.6369\\-21\\-18.66535\\-167.1369\\-21\\-17.41535\\-165.8869\\-21\\-16.91535\\-165.8274\\-21\\-14.91535\\-163.8869\\-21\\-10.91535\\-161.8869\\-21\\-9.915353\\-161.8274\\-21\\-9.415353\\-161.3869\\-21\\-8.415353\\-161.3274\\-21\\-7.915353\\-160.8869\\-21\\-5.915353\\-160.8274\\-21\\-5.415353\\-160.3869\\-21\\5.584647\\-160.3869\\-21\\6.084647\\-160.8274\\-21\\8.584647\\-160.8869\\-21\\9.084647\\-161.3274\\-21\\10.08465\\-161.3869\\-21\\10.58465\\-161.8274\\-21\\11.58465\\-161.8869\\-21\\12.08465\\-162.3274\\-21\\13.08465\\-162.3869\\-21\\14.58465\\-163.3274\\-21\\15.08465\\-163.3869\\-21\\16.08465\\-164.3274\\-21\\16.58465\\-164.3869\\-21\\20.58465\\-168.3274\\-21\\21.39411\\-170.1369\\-21\\21.83465\\-170.6369\\-21\\22.39411\\-172.1369\\-21\\22.83465\\-172.6369\\-21\\22.89411\\-173.6369\\-21\\23.33465\\-174.1369\\-21\\23.39411\\-175.1369\\-21\\23.83465\\-175.6369\\-21\\23.89411\\-177.6369\\-21\\23.89411\\-181.6369\\-21\\23.83465\\-183.6369\\-21\\23.39411\\-184.1369\\-21\\23.33465\\-185.6369\\-21\\22.89411\\-186.1369\\-21\\22.83465\\-187.6369\\-21\\21.89411\\-189.1369\\-21\\21.83465\\-190.1369\\-21\\20.39411\\-192.6369\\-21\\20.33465\\-193.1369\\-21\\19.39411\\-194.1369\\-21\\19.33465\\-194.6369\\-21\\17.89411\\-196.1369\\-21\\17.83465\\-196.6369\\-21\\17.08465\\-197.4464\\-21\\14.08465\\-200.3869\\-21\\13.58465\\-200.4464\\-21\\12.08465\\-201.8869\\-21\\10.08465\\-202.8869\\-21\\9.584647\\-202.9464\\-21\\8.084647\\-203.8869\\-21\\7.084647\\-203.9464\\-21\\6.584647\\-204.3869\\-21\\5.584647\\-204.4464\\-21\\5.084647\\-204.8869\\-21\\3.084647\\-204.9464\\-21\\-1.915353\\-204.9464\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "100" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.915353\\-204.3869\\-19\\-2.415353\\-203.9464\\-19\\-4.415353\\-203.8869\\-19\\-4.915353\\-203.4464\\-19\\-5.915353\\-203.3869\\-19\\-6.415353\\-202.9464\\-19\\-8.915353\\-201.8869\\-19\\-9.915353\\-200.9464\\-19\\-10.41535\\-200.8869\\-19\\-11.91535\\-199.4464\\-19\\-12.41535\\-199.3869\\-19\\-15.16535\\-196.6369\\-19\\-15.22482\\-196.1369\\-19\\-17.16535\\-194.1369\\-19\\-17.22482\\-193.6369\\-19\\-18.16535\\-192.6369\\-19\\-18.22482\\-192.1369\\-19\\-19.66535\\-189.6369\\-19\\-19.72482\\-188.6369\\-19\\-20.16535\\-188.1369\\-19\\-20.22482\\-187.1369\\-19\\-20.66535\\-186.6369\\-19\\-20.72482\\-185.6369\\-19\\-21.16535\\-185.1369\\-19\\-21.22482\\-183.1369\\-19\\-21.66535\\-182.6369\\-19\\-21.66535\\-176.6369\\-19\\-21.22482\\-176.1369\\-19\\-21.16535\\-174.6369\\-19\\-20.72482\\-174.1369\\-19\\-20.66535\\-173.1369\\-19\\-20.22482\\-172.6369\\-19\\-20.16535\\-171.6369\\-19\\-19.66535\\-170.6369\\-19\\-18.72482\\-169.6369\\-19\\-18.41535\\-168.8274\\-19\\-14.72482\\-165.1369\\-19\\-13.91535\\-164.8274\\-19\\-12.91535\\-163.8869\\-19\\-12.41535\\-163.8274\\-19\\-10.91535\\-162.8869\\-19\\-9.915353\\-162.8274\\-19\\-9.415353\\-162.3869\\-19\\-8.415353\\-162.3274\\-19\\-7.915353\\-161.8869\\-19\\-6.415353\\-161.8274\\-19\\-5.915353\\-161.3869\\-19\\-3.915353\\-161.3274\\-19\\5.084647\\-161.3274\\-19\\6.584647\\-161.3869\\-19\\7.084647\\-161.8274\\-19\\8.584647\\-161.8869\\-19\\9.084647\\-162.3274\\-19\\10.08465\\-162.3869\\-19\\10.58465\\-162.8274\\-19\\11.58465\\-162.8869\\-19\\13.08465\\-163.8274\\-19\\13.58465\\-163.8274\\-19\\14.08465\\-164.3274\\-19\\14.58465\\-164.3869\\-19\\15.58465\\-165.3274\\-19\\16.39411\\-165.6369\\-19\\19.08465\\-168.3274\\-19\\19.39411\\-169.1369\\-19\\20.39411\\-170.1369\\-19\\20.39411\\-170.6369\\-19\\20.89411\\-171.1369\\-19\\20.89411\\-171.6369\\-19\\21.39411\\-172.1369\\-19\\21.39411\\-172.6369\\-19\\21.83465\\-173.1369\\-19\\21.89411\\-174.1369\\-19\\22.33465\\-174.6369\\-19\\22.39411\\-176.1369\\-19\\22.83465\\-176.6369\\-19\\22.83465\\-182.6369\\-19\\22.39411\\-183.1369\\-19\\22.33465\\-185.1369\\-19\\21.89411\\-185.6369\\-19\\21.83465\\-187.1369\\-19\\21.39411\\-187.6369\\-19\\21.33465\\-188.6369\\-19\\19.89411\\-191.1369\\-19\\19.89411\\-191.6369\\-19\\19.39411\\-192.1369\\-19\\18.83465\\-193.6369\\-19\\17.39411\\-195.1369\\-19\\17.08465\\-195.9464\\-19\\12.89411\\-200.1369\\-19\\12.08465\\-200.4464\\-19\\11.08465\\-201.3869\\-19\\10.58465\\-201.4464\\-19\\9.584647\\-202.3869\\-19\\8.584647\\-202.8869\\-19\\7.584647\\-202.9464\\-19\\7.084647\\-203.3869\\-19\\6.084647\\-203.4464\\-19\\5.584647\\-203.8869\\-19\\3.584647\\-203.9464\\-19\\3.084647\\-204.3869\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "104" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.9153527\\-203.3869\\-17\\-1.415353\\-202.9464\\-17\\-3.415353\\-202.8869\\-17\\-3.915353\\-202.4464\\-17\\-4.915353\\-202.3869\\-17\\-5.415353\\-201.9464\\-17\\-6.415353\\-201.8869\\-17\\-7.915353\\-200.9464\\-17\\-8.415353\\-200.8869\\-17\\-9.915353\\-199.4464\\-17\\-10.41535\\-199.4464\\-17\\-14.91535\\-194.9464\\-17\\-15.22482\\-194.1369\\-17\\-16.22482\\-193.1369\\-17\\-16.22482\\-192.6369\\-17\\-17.22482\\-191.6369\\-17\\-17.22482\\-191.1369\\-17\\-17.72482\\-190.6369\\-17\\-17.72482\\-190.1369\\-17\\-18.66535\\-188.6369\\-17\\-18.72482\\-187.6369\\-17\\-19.16535\\-187.1369\\-17\\-19.22482\\-185.6369\\-17\\-19.66535\\-185.1369\\-17\\-19.72482\\-183.6369\\-17\\-20.16535\\-183.1369\\-17\\-20.22482\\-182.1369\\-17\\-20.22482\\-177.6369\\-17\\-20.16535\\-176.6369\\-17\\-19.72482\\-176.1369\\-17\\-19.72482\\-174.6369\\-17\\-19.22482\\-174.1369\\-17\\-19.22482\\-173.1369\\-17\\-18.72482\\-172.6369\\-17\\-18.72482\\-172.1369\\-17\\-18.22482\\-171.6369\\-17\\-18.22482\\-171.1369\\-17\\-17.72482\\-170.6369\\-17\\-17.72482\\-170.1369\\-17\\-12.91535\\-165.3274\\-17\\-12.41535\\-165.3274\\-17\\-11.91535\\-164.8274\\-17\\-11.41535\\-164.8274\\-17\\-10.91535\\-164.3274\\-17\\-10.41535\\-164.3274\\-17\\-9.915353\\-163.8274\\-17\\-9.415353\\-163.8274\\-17\\-8.915353\\-163.3869\\-17\\-7.915353\\-163.3274\\-17\\-7.415353\\-162.8869\\-17\\-5.915353\\-162.8274\\-17\\-5.415353\\-162.3869\\-17\\-3.915353\\-162.3274\\-17\\4.584647\\-162.3274\\-17\\6.084647\\-162.3869\\-17\\6.584647\\-162.8274\\-17\\8.084647\\-162.8869\\-17\\8.584647\\-163.3274\\-17\\9.584647\\-163.3869\\-17\\10.08465\\-163.8274\\-17\\11.08465\\-163.8869\\-17\\12.58465\\-164.8274\\-17\\13.08465\\-164.8869\\-17\\14.08465\\-165.8274\\-17\\14.89411\\-166.1369\\-17\\18.39411\\-169.6369\\-17\\18.39411\\-170.1369\\-17\\19.39411\\-171.1369\\-17\\19.39411\\-171.6369\\-17\\19.89411\\-172.1369\\-17\\19.89411\\-172.6369\\-17\\20.39411\\-173.1369\\-17\\20.39411\\-174.1369\\-17\\20.89411\\-174.6369\\-17\\20.89411\\-176.1369\\-17\\21.33465\\-176.6369\\-17\\21.39411\\-177.6369\\-17\\21.39411\\-182.6369\\-17\\20.89411\\-183.6369\\-17\\20.83465\\-185.6369\\-17\\20.39411\\-186.1369\\-17\\20.39411\\-187.1369\\-17\\19.89411\\-187.6369\\-17\\19.89411\\-188.6369\\-17\\19.39411\\-189.1369\\-17\\19.33465\\-190.1369\\-17\\18.83465\\-191.1369\\-17\\17.89411\\-192.1369\\-17\\17.89411\\-192.6369\\-17\\16.89411\\-193.6369\\-17\\16.89411\\-194.1369\\-17\\10.89411\\-200.1369\\-17\\10.08465\\-200.4464\\-17\\9.584647\\-200.9464\\-17\\9.084647\\-200.9464\\-17\\8.584647\\-201.4464\\-17\\8.084647\\-201.4464\\-17\\7.584647\\-201.9464\\-17\\7.084647\\-201.9464\\-17\\6.584647\\-202.3869\\-17\\5.584647\\-202.4464\\-17\\5.084647\\-202.8869\\-17\\3.084647\\-202.9464\\-17\\2.584647\\-203.3869\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "93" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.915353\\-200.9464\\-15\\-4.915353\\-200.9464\\-15\\-5.415353\\-200.4464\\-15\\-6.415353\\-200.3869\\-15\\-7.415353\\-199.4464\\-15\\-7.915353\\-199.4464\\-15\\-9.415353\\-197.9464\\-15\\-9.915353\\-197.9464\\-15\\-13.22482\\-194.6369\\-15\\-13.22482\\-194.1369\\-15\\-15.22482\\-192.1369\\-15\\-15.22482\\-191.6369\\-15\\-15.72482\\-191.1369\\-15\\-15.72482\\-190.6369\\-15\\-16.22482\\-190.1369\\-15\\-16.22482\\-189.6369\\-15\\-16.72482\\-189.1369\\-15\\-16.72482\\-188.6369\\-15\\-17.22482\\-188.1369\\-15\\-17.22482\\-187.1369\\-15\\-17.72482\\-186.6369\\-15\\-17.72482\\-185.1369\\-15\\-18.22482\\-184.6369\\-15\\-18.22482\\-176.1369\\-15\\-17.72482\\-175.6369\\-15\\-17.72482\\-174.1369\\-15\\-17.22482\\-173.6369\\-15\\-17.22482\\-172.6369\\-15\\-16.22482\\-171.6369\\-15\\-16.22482\\-171.1369\\-15\\-15.72482\\-170.6369\\-15\\-15.72482\\-170.1369\\-15\\-12.41535\\-166.8274\\-15\\-11.91535\\-166.8274\\-15\\-10.91535\\-165.8274\\-15\\-10.41535\\-165.8274\\-15\\-9.915353\\-165.3274\\-15\\-9.415353\\-165.3274\\-15\\-8.915353\\-164.8869\\-15\\-7.915353\\-164.8274\\-15\\-7.415353\\-164.3869\\-15\\-6.415353\\-164.3274\\-15\\-5.915353\\-163.8869\\-15\\-4.415353\\-163.8274\\-15\\-3.915353\\-163.3869\\-15\\-2.915353\\-163.3274\\-15\\3.584647\\-163.3274\\-15\\4.584647\\-163.3869\\-15\\5.084647\\-163.8274\\-15\\6.584647\\-163.8869\\-15\\7.084647\\-164.3274\\-15\\8.084647\\-164.3274\\-15\\8.584647\\-164.8274\\-15\\9.584647\\-164.8274\\-15\\10.08465\\-165.3274\\-15\\11.08465\\-165.3869\\-15\\12.08465\\-165.8869\\-15\\13.58465\\-167.3274\\-15\\14.08465\\-167.3274\\-15\\16.39411\\-169.6369\\-15\\16.39411\\-170.1369\\-15\\17.39411\\-171.1369\\-15\\17.39411\\-171.6369\\-15\\17.89411\\-172.1369\\-15\\17.89411\\-172.6369\\-15\\18.39411\\-173.1369\\-15\\18.39411\\-173.6369\\-15\\18.89411\\-174.1369\\-15\\18.89411\\-175.1369\\-15\\19.39411\\-175.6369\\-15\\19.39411\\-184.6369\\-15\\18.89411\\-185.6369\\-15\\18.83465\\-187.1369\\-15\\18.39411\\-187.6369\\-15\\18.39411\\-188.1369\\-15\\17.89411\\-188.6369\\-15\\17.89411\\-189.6369\\-15\\17.39411\\-190.1369\\-15\\17.39411\\-190.6369\\-15\\16.39411\\-191.6369\\-15\\16.39411\\-192.1369\\-15\\15.39411\\-193.1369\\-15\\15.39411\\-193.6369\\-15\\10.08465\\-198.9464\\-15\\9.584647\\-198.9464\\-15\\8.584647\\-199.9464\\-15\\8.084647\\-199.9464\\-15\\7.584647\\-200.4464\\-15\\7.084647\\-200.4464\\-15\\6.584647\\-200.9464\\-15\\5.584647\\-200.9464\\-15\\4.584647\\-201.4464\\-15\\-2.915353\\-201.4464\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "90" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.915353\\-199.4464\\-13\\-3.415353\\-198.9464\\-13\\-4.415353\\-198.9464\\-13\\-4.915353\\-198.4464\\-13\\-5.415353\\-198.4464\\-13\\-5.915353\\-197.9464\\-13\\-6.415353\\-197.9464\\-13\\-6.915353\\-197.4464\\-13\\-7.415353\\-197.4464\\-13\\-8.915353\\-195.9464\\-13\\-9.415353\\-195.9464\\-13\\-11.22482\\-194.1369\\-13\\-11.22482\\-193.6369\\-13\\-12.72482\\-192.1369\\-13\\-12.72482\\-191.6369\\-13\\-13.72482\\-190.6369\\-13\\-13.72482\\-190.1369\\-13\\-14.22482\\-189.6369\\-13\\-14.22482\\-189.1369\\-13\\-14.72482\\-188.6369\\-13\\-14.72482\\-188.1369\\-13\\-15.22482\\-187.6369\\-13\\-15.22482\\-186.6369\\-13\\-15.72482\\-186.1369\\-13\\-15.72482\\-184.6369\\-13\\-16.22482\\-184.1369\\-13\\-16.22482\\-176.6369\\-13\\-15.72482\\-176.1369\\-13\\-15.72482\\-174.6369\\-13\\-15.22482\\-174.1369\\-13\\-15.22482\\-173.6369\\-13\\-14.72482\\-173.1369\\-13\\-14.72482\\-172.6369\\-13\\-14.22482\\-172.1369\\-13\\-14.22482\\-171.6369\\-13\\-10.41535\\-167.8274\\-13\\-9.915353\\-167.8274\\-13\\-8.915353\\-166.8274\\-13\\-8.415353\\-166.8274\\-13\\-7.915353\\-166.3274\\-13\\-6.915353\\-166.3274\\-13\\-6.415353\\-165.8274\\-13\\-5.415353\\-165.8274\\-13\\-4.915353\\-165.3274\\-13\\-2.915353\\-165.3274\\-13\\-2.415353\\-164.8274\\-13\\3.084647\\-164.8274\\-13\\4.084647\\-165.3274\\-13\\6.084647\\-165.3274\\-13\\6.584647\\-165.8274\\-13\\7.584647\\-165.8274\\-13\\8.084647\\-166.3274\\-13\\8.584647\\-166.3274\\-13\\9.084647\\-166.8274\\-13\\9.584647\\-166.8274\\-13\\10.08465\\-167.3274\\-13\\10.58465\\-167.3274\\-13\\11.08465\\-167.8274\\-13\\11.58465\\-167.8274\\-13\\15.39411\\-171.6369\\-13\\15.39411\\-172.1369\\-13\\15.89411\\-172.6369\\-13\\15.89411\\-173.1369\\-13\\16.39411\\-173.6369\\-13\\16.39411\\-174.1369\\-13\\16.89411\\-174.6369\\-13\\16.89411\\-176.1369\\-13\\17.39411\\-176.6369\\-13\\17.39411\\-184.1369\\-13\\16.89411\\-184.6369\\-13\\16.89411\\-186.1369\\-13\\16.39411\\-186.6369\\-13\\16.39411\\-187.6369\\-13\\15.89411\\-188.1369\\-13\\15.89411\\-189.1369\\-13\\15.39411\\-189.6369\\-13\\15.39411\\-190.1369\\-13\\14.39411\\-191.1369\\-13\\14.39411\\-191.6369\\-13\\13.39411\\-192.6369\\-13\\13.39411\\-193.1369\\-13\\9.584647\\-196.9464\\-13\\9.084647\\-196.9464\\-13\\8.084647\\-197.9464\\-13\\7.584647\\-197.9464\\-13\\7.084647\\-198.4464\\-13\\6.584647\\-198.4464\\-13\\6.084647\\-198.9464\\-13\\5.084647\\-198.9464\\-13\\4.584647\\-199.4464\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.915353\\-196.9464\\-11\\-2.415353\\-196.4464\\-11\\-3.415353\\-196.4464\\-11\\-3.915353\\-195.9464\\-11\\-4.415353\\-195.9464\\-11\\-4.915353\\-195.4464\\-11\\-5.415353\\-195.4464\\-11\\-5.915353\\-194.9464\\-11\\-6.415353\\-194.9464\\-11\\-10.72482\\-190.6369\\-11\\-10.72482\\-190.1369\\-11\\-11.22482\\-189.6369\\-11\\-11.22482\\-189.1369\\-11\\-11.72482\\-188.6369\\-11\\-11.72482\\-188.1369\\-11\\-12.22482\\-187.6369\\-11\\-12.22482\\-187.1369\\-11\\-12.72482\\-186.6369\\-11\\-12.72482\\-186.1369\\-11\\-13.22482\\-185.6369\\-11\\-13.22482\\-184.1369\\-11\\-13.72482\\-183.6369\\-11\\-13.72482\\-177.1369\\-11\\-13.22482\\-176.6369\\-11\\-13.22482\\-175.6369\\-11\\-12.72482\\-175.1369\\-11\\-12.72482\\-174.6369\\-11\\-12.22482\\-174.1369\\-11\\-12.22482\\-173.6369\\-11\\-10.72482\\-172.1369\\-11\\-10.72482\\-171.6369\\-11\\-9.415353\\-170.3274\\-11\\-8.915353\\-170.3274\\-11\\-7.915353\\-169.3274\\-11\\-7.415353\\-169.3274\\-11\\-6.915353\\-168.8274\\-11\\-6.415353\\-168.8274\\-11\\-5.915353\\-168.3274\\-11\\-5.415353\\-168.3274\\-11\\-4.915353\\-167.8274\\-11\\-4.415353\\-167.8274\\-11\\-3.915353\\-167.3274\\-11\\-1.415353\\-167.3274\\-11\\-0.9153527\\-166.8274\\-11\\2.084647\\-166.8274\\-11\\2.584647\\-167.3274\\-11\\4.584647\\-167.3274\\-11\\5.084647\\-167.8274\\-11\\6.084647\\-167.8274\\-11\\6.584647\\-168.3274\\-11\\7.084647\\-168.3274\\-11\\7.584647\\-168.8274\\-11\\8.084647\\-168.8274\\-11\\8.584647\\-169.3274\\-11\\9.084647\\-169.3274\\-11\\13.39411\\-173.6369\\-11\\13.39411\\-174.1369\\-11\\13.89411\\-174.6369\\-11\\13.89411\\-175.1369\\-11\\14.39411\\-175.6369\\-11\\14.39411\\-176.6369\\-11\\14.89411\\-177.1369\\-11\\14.89411\\-184.1369\\-11\\14.39411\\-184.6369\\-11\\14.39411\\-185.6369\\-11\\13.89411\\-186.1369\\-11\\13.89411\\-187.1369\\-11\\13.39411\\-187.6369\\-11\\13.39411\\-188.1369\\-11\\12.89411\\-188.6369\\-11\\12.89411\\-189.1369\\-11\\12.39411\\-189.6369\\-11\\12.39411\\-190.1369\\-11\\10.89411\\-191.6369\\-11\\10.89411\\-192.1369\\-11\\9.084647\\-193.9464\\-11\\8.584647\\-193.9464\\-11\\7.084647\\-195.4464\\-11\\6.584647\\-195.4464\\-11\\6.084647\\-195.9464\\-11\\5.584647\\-195.9464\\-11\\5.084647\\-196.4464\\-11\\4.084647\\-196.4464\\-11\\3.584647\\-196.9464\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.915353\\-192.9464\\-9\\-2.415353\\-192.4464\\-9\\-3.415353\\-192.4464\\-9\\-4.415353\\-191.4464\\-9\\-4.915353\\-191.4464\\-9\\-7.724819\\-188.6369\\-9\\-7.724819\\-188.1369\\-9\\-8.724819\\-187.1369\\-9\\-8.724819\\-186.6369\\-9\\-9.224819\\-186.1369\\-9\\-9.224819\\-185.6369\\-9\\-9.724819\\-185.1369\\-9\\-9.724819\\-183.6369\\-9\\-10.22482\\-183.1369\\-9\\-10.22482\\-178.1369\\-9\\-9.724819\\-177.6369\\-9\\-9.724819\\-176.6369\\-9\\-9.224819\\-176.1369\\-9\\-9.224819\\-175.6369\\-9\\-8.724819\\-175.1369\\-9\\-8.724819\\-174.6369\\-9\\-5.915353\\-171.8274\\-9\\-5.415353\\-171.8274\\-9\\-4.915353\\-171.3274\\-9\\-4.415353\\-171.3274\\-9\\-3.915353\\-170.8274\\-9\\-2.915353\\-170.8274\\-9\\-2.415353\\-170.3274\\-9\\-0.4153527\\-170.3274\\-9\\0.0846473\\-169.8274\\-9\\1.084647\\-169.8274\\-9\\1.584647\\-170.3274\\-9\\3.584647\\-170.3274\\-9\\4.084647\\-170.8274\\-9\\5.084647\\-170.8274\\-9\\5.584647\\-171.3274\\-9\\6.084647\\-171.3274\\-9\\6.584647\\-171.8274\\-9\\7.084647\\-171.8274\\-9\\9.894114\\-174.6369\\-9\\9.894114\\-175.1369\\-9\\10.39411\\-175.6369\\-9\\10.39411\\-176.1369\\-9\\10.89411\\-176.6369\\-9\\10.89411\\-177.6369\\-9\\11.39411\\-178.1369\\-9\\11.39411\\-183.6369\\-9\\10.89411\\-184.1369\\-9\\10.89411\\-185.1369\\-9\\10.39411\\-185.6369\\-9\\10.39411\\-186.1369\\-9\\9.894114\\-186.6369\\-9\\9.894114\\-187.1369\\-9\\9.394114\\-187.6369\\-9\\9.394114\\-188.1369\\-9\\5.584647\\-191.9464\\-9\\5.084647\\-191.9464\\-9\\4.584647\\-192.4464\\-9\\4.084647\\-192.4464\\-9\\3.584647\\-192.9464\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.4153527\\-185.9464\\-7\\-0.9153527\\-185.4464\\-7\\-1.415353\\-185.4464\\-7\\-2.724819\\-184.1369\\-7\\-2.724819\\-183.6369\\-7\\-3.224819\\-183.1369\\-7\\-3.224819\\-182.6369\\-7\\-3.724819\\-182.1369\\-7\\-3.724819\\-179.1369\\-7\\-3.224819\\-178.6369\\-7\\-3.224819\\-178.1369\\-7\\-1.415353\\-176.3274\\-7\\-0.4153527\\-176.3274\\-7\\0.0846473\\-175.8274\\-7\\1.084647\\-175.8274\\-7\\1.584647\\-176.3274\\-7\\2.584647\\-176.3274\\-7\\4.394114\\-178.1369\\-7\\4.394114\\-178.6369\\-7\\4.894114\\-179.1369\\-7\\4.894114\\-182.6369\\-7\\4.394114\\-183.1369\\-7\\4.394114\\-183.6369\\-7\\2.584647\\-185.4464\\-7\\2.084647\\-185.4464\\-7\\1.584647\\-185.9464\\-7" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "3" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "0\\255\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.915353\\-179.8274\\-61\\-6.105886\\-178.6369\\-61\\-6.105886\\-177.6369\\-61\\-4.915353\\-176.4464\\-61\\6.084647\\-176.4464\\-61\\7.275181\\-177.6369\\-61\\7.275181\\-178.6369\\-61\\6.084647\\-179.8274\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.415353\\-186.8274\\-59\\-7.915353\\-186.3274\\-59\\-8.415353\\-186.3274\\-59\\-8.915353\\-185.8274\\-59\\-9.415353\\-185.8274\\-59\\-12.60589\\-182.6369\\-59\\-12.60589\\-182.1369\\-59\\-13.10589\\-181.6369\\-59\\-13.10589\\-180.1369\\-59\\-13.60589\\-179.6369\\-59\\-13.60589\\-177.1369\\-59\\-13.10589\\-176.6369\\-59\\-13.10589\\-175.1369\\-59\\-12.60589\\-174.6369\\-59\\-12.60589\\-174.1369\\-59\\-9.915353\\-171.4464\\-59\\-9.415353\\-171.4464\\-59\\-8.915353\\-170.9464\\-59\\-8.415353\\-170.9464\\-59\\-7.915353\\-170.4464\\-59\\-7.415353\\-170.4464\\-59\\-6.915353\\-169.9464\\-59\\8.084647\\-169.9464\\-59\\8.584647\\-170.4464\\-59\\9.084647\\-170.4464\\-59\\9.584647\\-170.9464\\-59\\10.08465\\-170.9464\\-59\\10.58465\\-171.4464\\-59\\11.08465\\-171.4464\\-59\\13.77518\\-174.1369\\-59\\13.77518\\-174.6369\\-59\\14.27518\\-175.1369\\-59\\14.27518\\-176.1369\\-59\\14.77518\\-176.6369\\-59\\14.77518\\-180.6369\\-59\\14.27518\\-181.1369\\-59\\14.27518\\-181.6369\\-59\\13.77518\\-182.1369\\-59\\13.77518\\-182.6369\\-59\\10.08465\\-186.3274\\-59\\9.084647\\-186.3274\\-59\\8.584647\\-186.8274\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "74" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.415353\\-190.8274\\-57\\-6.915353\\-190.3274\\-57\\-8.915353\\-190.3274\\-57\\-9.415353\\-189.8274\\-57\\-9.915353\\-189.8274\\-57\\-10.41535\\-189.3274\\-57\\-10.91535\\-189.3274\\-57\\-11.41535\\-188.8274\\-57\\-11.91535\\-188.8274\\-57\\-12.91535\\-187.8274\\-57\\-13.41535\\-187.8274\\-57\\-14.60589\\-186.6369\\-57\\-14.60589\\-186.1369\\-57\\-15.60589\\-185.1369\\-57\\-15.60589\\-184.6369\\-57\\-16.10589\\-184.1369\\-57\\-16.10589\\-183.6369\\-57\\-16.60589\\-183.1369\\-57\\-16.60589\\-182.6369\\-57\\-17.10589\\-182.1369\\-57\\-17.10589\\-175.1369\\-57\\-16.60589\\-174.6369\\-57\\-16.60589\\-173.6369\\-57\\-15.60589\\-172.6369\\-57\\-15.60589\\-172.1369\\-57\\-12.41535\\-168.9464\\-57\\-11.91535\\-168.9464\\-57\\-11.41535\\-168.4464\\-57\\-10.91535\\-168.4464\\-57\\-10.41535\\-167.9464\\-57\\-9.915353\\-167.9464\\-57\\-9.415353\\-167.4464\\-57\\-8.915353\\-167.4464\\-57\\-8.415353\\-166.9464\\-57\\-6.415353\\-166.9464\\-57\\-5.915353\\-166.4464\\-57\\7.084647\\-166.4464\\-57\\7.584647\\-166.9464\\-57\\9.584647\\-166.9464\\-57\\10.08465\\-167.4464\\-57\\10.58465\\-167.4464\\-57\\11.08465\\-167.9464\\-57\\11.58465\\-167.9464\\-57\\12.08465\\-168.4464\\-57\\12.58465\\-168.4464\\-57\\13.08465\\-168.9464\\-57\\13.58465\\-168.9464\\-57\\17.27518\\-172.6369\\-57\\17.27518\\-173.1369\\-57\\17.77518\\-173.6369\\-57\\17.77518\\-174.6369\\-57\\18.27518\\-175.1369\\-57\\18.27518\\-176.6369\\-57\\18.77518\\-177.1369\\-57\\18.77518\\-180.1369\\-57\\18.27518\\-180.6369\\-57\\18.27518\\-182.1369\\-57\\17.77518\\-182.6369\\-57\\17.77518\\-183.6369\\-57\\17.27518\\-184.1369\\-57\\17.27518\\-184.6369\\-57\\16.27518\\-185.6369\\-57\\16.27518\\-186.1369\\-57\\14.58465\\-187.8274\\-57\\14.08465\\-187.8274\\-57\\13.08465\\-188.8274\\-57\\12.58465\\-188.8274\\-57\\12.08465\\-189.3274\\-57\\11.58465\\-189.3274\\-57\\11.08465\\-189.8274\\-57\\10.58465\\-189.8274\\-57\\10.08465\\-190.3274\\-57\\8.084647\\-190.3274\\-57\\7.584647\\-190.8274\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-9.415353\\-192.8274\\-55\\-9.915353\\-192.3274\\-55\\-10.91535\\-192.3274\\-55\\-11.41535\\-191.8274\\-55\\-11.91535\\-191.8274\\-55\\-12.41535\\-191.3274\\-55\\-12.91535\\-191.3274\\-55\\-13.41535\\-190.8274\\-55\\-13.91535\\-190.8274\\-55\\-14.91535\\-189.8274\\-55\\-15.41535\\-189.8274\\-55\\-17.10589\\-188.1369\\-55\\-17.10589\\-187.6369\\-55\\-18.10589\\-186.6369\\-55\\-18.10589\\-186.1369\\-55\\-18.60589\\-185.6369\\-55\\-18.60589\\-185.1369\\-55\\-19.10589\\-184.6369\\-55\\-19.10589\\-184.1369\\-55\\-19.60589\\-183.6369\\-55\\-19.60589\\-182.1369\\-55\\-20.10589\\-181.6369\\-55\\-20.10589\\-175.6369\\-55\\-19.60589\\-175.1369\\-55\\-19.60589\\-174.1369\\-55\\-19.10589\\-173.6369\\-55\\-19.10589\\-172.6369\\-55\\-18.60589\\-172.1369\\-55\\-18.60589\\-171.6369\\-55\\-17.60589\\-170.6369\\-55\\-17.60589\\-170.1369\\-55\\-15.41535\\-167.9464\\-55\\-14.91535\\-167.9464\\-55\\-13.41535\\-166.4464\\-55\\-12.91535\\-166.4464\\-55\\-12.41535\\-165.9464\\-55\\-11.41535\\-165.9464\\-55\\-10.91535\\-165.4464\\-55\\-10.41535\\-165.4464\\-55\\-9.915353\\-164.9464\\-55\\-8.415353\\-164.9464\\-55\\-7.915353\\-164.4464\\-55\\9.084647\\-164.4464\\-55\\9.584647\\-164.9464\\-55\\11.08465\\-164.9464\\-55\\11.58465\\-165.4464\\-55\\12.08465\\-165.4464\\-55\\12.58465\\-165.9464\\-55\\13.58465\\-165.9464\\-55\\14.08465\\-166.4464\\-55\\14.58465\\-166.4464\\-55\\15.58465\\-167.4464\\-55\\16.08465\\-167.4464\\-55\\18.77518\\-170.1369\\-55\\18.77518\\-170.6369\\-55\\19.77518\\-171.6369\\-55\\19.77518\\-172.1369\\-55\\20.27518\\-172.6369\\-55\\20.27518\\-173.1369\\-55\\20.77518\\-173.6369\\-55\\20.77518\\-175.1369\\-55\\21.27518\\-175.6369\\-55\\21.27518\\-182.1369\\-55\\20.77518\\-182.6369\\-55\\20.77518\\-183.6369\\-55\\20.27518\\-184.1369\\-55\\20.27518\\-184.6369\\-55\\19.77518\\-185.1369\\-55\\19.77518\\-185.6369\\-55\\19.27518\\-186.1369\\-55\\19.27518\\-186.6369\\-55\\17.77518\\-188.1369\\-55\\17.77518\\-188.6369\\-55\\16.58465\\-189.8274\\-55\\16.08465\\-189.8274\\-55\\15.08465\\-190.8274\\-55\\14.58465\\-190.8274\\-55\\13.58465\\-191.8274\\-55\\12.58465\\-191.8274\\-55\\12.08465\\-192.3274\\-55\\11.08465\\-192.3274\\-55\\10.58465\\-192.8274\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "80" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-9.915353\\-194.8274\\-53\\-10.41535\\-194.3869\\-53\\-11.91535\\-194.3274\\-53\\-12.41535\\-193.8274\\-53\\-12.91535\\-193.8274\\-53\\-13.41535\\-193.3274\\-53\\-13.91535\\-193.3274\\-53\\-14.41535\\-192.8274\\-53\\-14.91535\\-192.8274\\-53\\-15.91535\\-191.8274\\-53\\-16.41535\\-191.8274\\-53\\-19.10589\\-189.1369\\-53\\-19.10589\\-188.6369\\-53\\-20.10589\\-187.6369\\-53\\-20.10589\\-187.1369\\-53\\-21.10589\\-186.1369\\-53\\-21.10589\\-185.1369\\-53\\-21.60589\\-184.6369\\-53\\-21.60589\\-183.6369\\-53\\-22.10589\\-183.1369\\-53\\-22.10589\\-174.6369\\-53\\-21.60589\\-174.1369\\-53\\-21.60589\\-173.1369\\-53\\-21.10589\\-172.6369\\-53\\-21.10589\\-172.1369\\-53\\-20.60589\\-171.6369\\-53\\-20.60589\\-171.1369\\-53\\-20.10589\\-170.6369\\-53\\-20.10589\\-170.1369\\-53\\-15.41535\\-165.4464\\-53\\-14.91535\\-165.4464\\-53\\-14.41535\\-164.9464\\-53\\-13.91535\\-164.9464\\-53\\-13.41535\\-164.4464\\-53\\-12.91535\\-164.4464\\-53\\-12.41535\\-163.9464\\-53\\-11.41535\\-163.9464\\-53\\-10.91535\\-163.4464\\-53\\-9.415353\\-163.3869\\-53\\-8.915353\\-162.9464\\-53\\-6.915353\\-162.8869\\-53\\8.084647\\-162.8869\\-53\\10.08465\\-162.9464\\-53\\10.58465\\-163.3869\\-53\\12.08465\\-163.4464\\-53\\12.58465\\-163.9464\\-53\\13.58465\\-163.9464\\-53\\14.08465\\-164.4464\\-53\\14.58465\\-164.4464\\-53\\15.08465\\-164.9464\\-53\\15.58465\\-164.9464\\-53\\16.08465\\-165.4464\\-53\\16.58465\\-165.4464\\-53\\21.27518\\-170.1369\\-53\\21.27518\\-170.6369\\-53\\22.27518\\-171.6369\\-53\\22.27518\\-172.6369\\-53\\22.77518\\-173.1369\\-53\\22.77518\\-174.1369\\-53\\23.27518\\-174.6369\\-53\\23.27518\\-183.1369\\-53\\22.77518\\-183.6369\\-53\\22.77518\\-185.1369\\-53\\22.27518\\-185.6369\\-53\\22.27518\\-186.1369\\-53\\21.27518\\-187.1369\\-53\\21.27518\\-187.6369\\-53\\20.27518\\-188.6369\\-53\\20.27518\\-189.1369\\-53\\18.08465\\-191.3274\\-53\\17.58465\\-191.3274\\-53\\16.08465\\-192.8274\\-53\\15.58465\\-192.8274\\-53\\15.08465\\-193.3274\\-53\\14.58465\\-193.3274\\-53\\14.08465\\-193.8274\\-53\\13.58465\\-193.8274\\-53\\13.08465\\-194.3274\\-53\\11.58465\\-194.3274\\-53\\11.08465\\-194.8274\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "92" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.415353\\-196.8274\\-51\\-8.915353\\-196.3869\\-51\\-10.91535\\-196.3274\\-51\\-11.41535\\-195.8869\\-51\\-12.91535\\-195.8274\\-51\\-13.41535\\-195.3274\\-51\\-13.91535\\-195.3274\\-51\\-14.41535\\-194.8274\\-51\\-14.91535\\-194.8274\\-51\\-15.41535\\-194.3274\\-51\\-15.91535\\-194.3274\\-51\\-17.41535\\-192.8274\\-51\\-17.91535\\-192.8274\\-51\\-20.60589\\-190.1369\\-51\\-20.60589\\-189.6369\\-51\\-22.10589\\-188.1369\\-51\\-22.10589\\-187.6369\\-51\\-22.60589\\-187.1369\\-51\\-22.60589\\-186.6369\\-51\\-23.10589\\-186.1369\\-51\\-23.16535\\-185.1369\\-51\\-23.60589\\-184.6369\\-51\\-23.66535\\-183.1369\\-51\\-24.10589\\-182.6369\\-51\\-24.10589\\-175.1369\\-51\\-23.66535\\-174.6369\\-51\\-23.60589\\-173.1369\\-51\\-23.10589\\-172.6369\\-51\\-23.10589\\-172.1369\\-51\\-22.60589\\-171.6369\\-51\\-22.60589\\-171.1369\\-51\\-22.10589\\-170.6369\\-51\\-22.10589\\-170.1369\\-51\\-21.10589\\-169.1369\\-51\\-21.10589\\-168.6369\\-51\\-17.41535\\-164.9464\\-51\\-16.91535\\-164.9464\\-51\\-16.41535\\-164.4464\\-51\\-15.91535\\-164.3869\\-51\\-14.91535\\-163.4464\\-51\\-13.91535\\-163.3869\\-51\\-13.41535\\-162.9464\\-51\\-12.41535\\-162.8869\\-51\\-11.91535\\-162.4464\\-51\\-10.91535\\-162.3869\\-51\\-10.41535\\-161.9464\\-51\\-8.415353\\-161.8869\\-51\\-7.915353\\-161.4464\\-51\\8.584647\\-161.4464\\-51\\9.084647\\-161.8869\\-51\\11.58465\\-161.9464\\-51\\12.08465\\-162.3869\\-51\\13.08465\\-162.4464\\-51\\13.58465\\-162.8869\\-51\\14.58465\\-162.9464\\-51\\17.58465\\-164.4464\\-51\\18.58465\\-165.3869\\-51\\19.08465\\-165.4464\\-51\\22.27518\\-168.6369\\-51\\22.27518\\-169.1369\\-51\\23.27518\\-170.1369\\-51\\23.27518\\-170.6369\\-51\\23.77518\\-171.1369\\-51\\24.27518\\-172.1369\\-51\\24.27518\\-172.6369\\-51\\24.77518\\-173.1369\\-51\\24.77518\\-174.1369\\-51\\25.27518\\-174.6369\\-51\\25.27518\\-182.6369\\-51\\24.83465\\-183.1369\\-51\\24.77518\\-184.6369\\-51\\24.33465\\-185.1369\\-51\\24.27518\\-186.1369\\-51\\23.77518\\-186.6369\\-51\\23.77518\\-187.1369\\-51\\23.27518\\-187.6369\\-51\\23.27518\\-188.1369\\-51\\20.77518\\-190.6369\\-51\\20.77518\\-191.1369\\-51\\19.58465\\-192.3274\\-51\\19.08465\\-192.3274\\-51\\17.08465\\-194.3274\\-51\\16.58465\\-194.3274\\-51\\16.08465\\-194.8274\\-51\\15.58465\\-194.8274\\-51\\15.08465\\-195.3274\\-51\\14.08465\\-195.3869\\-51\\13.58465\\-195.8274\\-51\\12.08465\\-195.8869\\-51\\11.58465\\-196.3274\\-51\\10.08465\\-196.3869\\-51\\9.584647\\-196.8274\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "88" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.915353\\-198.3274\\-49\\-8.415353\\-197.8869\\-49\\-10.91535\\-197.8274\\-49\\-11.41535\\-197.3869\\-49\\-12.41535\\-197.3274\\-49\\-12.91535\\-196.8869\\-49\\-13.91535\\-196.8274\\-49\\-14.41535\\-196.3869\\-49\\-15.41535\\-196.3274\\-49\\-15.91535\\-195.8274\\-49\\-16.41535\\-195.8274\\-49\\-17.41535\\-194.8274\\-49\\-17.91535\\-194.8274\\-49\\-22.10589\\-190.6369\\-49\\-22.16535\\-190.1369\\-49\\-23.10589\\-189.1369\\-49\\-23.66535\\-187.6369\\-49\\-24.60589\\-186.1369\\-49\\-24.66535\\-185.1369\\-49\\-25.10589\\-184.6369\\-49\\-25.16535\\-183.1369\\-49\\-25.60589\\-182.6369\\-49\\-25.66535\\-177.6369\\-49\\-25.60589\\-174.6369\\-49\\-25.16535\\-174.1369\\-49\\-25.10589\\-173.1369\\-49\\-24.66535\\-172.6369\\-49\\-24.60589\\-171.6369\\-49\\-24.10589\\-170.6369\\-49\\-23.60589\\-170.1369\\-49\\-23.60589\\-169.6369\\-49\\-22.16535\\-168.1369\\-49\\-22.10589\\-167.6369\\-49\\-18.91535\\-164.4464\\-49\\-18.41535\\-164.3869\\-49\\-17.41535\\-163.4464\\-49\\-16.91535\\-163.3869\\-49\\-14.41535\\-161.9464\\-49\\-13.41535\\-161.8869\\-49\\-12.91535\\-161.4464\\-49\\-11.41535\\-161.3869\\-49\\-10.91535\\-160.9464\\-49\\-8.415353\\-160.8869\\-49\\-7.915353\\-160.4464\\-49\\9.084647\\-160.4464\\-49\\9.584647\\-160.8869\\-49\\12.08465\\-160.9464\\-49\\12.58465\\-161.3869\\-49\\14.08465\\-161.4464\\-49\\15.58465\\-162.3869\\-49\\16.58465\\-162.4464\\-49\\17.08465\\-162.9464\\-49\\17.58465\\-162.9464\\-49\\18.58465\\-163.4464\\-49\\20.08465\\-164.8869\\-49\\20.58465\\-164.9464\\-49\\23.27518\\-167.6369\\-49\\23.33465\\-168.1369\\-49\\24.77518\\-169.6369\\-49\\24.77518\\-170.1369\\-49\\25.27518\\-170.6369\\-49\\25.77518\\-171.6369\\-49\\25.83465\\-172.6369\\-49\\26.27518\\-173.1369\\-49\\26.33465\\-174.1369\\-49\\26.77518\\-174.6369\\-49\\26.83465\\-176.6369\\-49\\26.83465\\-180.6369\\-49\\26.77518\\-183.1369\\-49\\26.33465\\-183.6369\\-49\\26.27518\\-184.6369\\-49\\25.83465\\-185.1369\\-49\\25.77518\\-186.1369\\-49\\25.33465\\-186.6369\\-49\\24.27518\\-189.1369\\-49\\23.27518\\-190.1369\\-49\\23.27518\\-190.6369\\-49\\19.58465\\-194.3274\\-49\\19.08465\\-194.3274\\-49\\18.08465\\-195.3274\\-49\\16.58465\\-195.8869\\-49\\15.08465\\-196.8274\\-49\\14.08465\\-196.8869\\-49\\13.58465\\-197.3274\\-49\\12.08465\\-197.3869\\-49\\11.58465\\-197.8274\\-49\\9.084647\\-197.8869\\-49\\8.584647\\-198.3274\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-9.415353\\-199.3274\\-47\\-9.915353\\-198.8869\\-47\\-11.91535\\-198.8274\\-47\\-12.41535\\-198.3869\\-47\\-13.41535\\-198.3274\\-47\\-13.91535\\-197.8869\\-47\\-14.91535\\-197.8274\\-47\\-15.41535\\-197.3869\\-47\\-17.91535\\-196.3274\\-47\\-18.91535\\-195.3869\\-47\\-19.41535\\-195.3274\\-47\\-22.60589\\-192.1369\\-47\\-22.66535\\-191.6369\\-47\\-24.10589\\-190.1369\\-47\\-24.16535\\-189.6369\\-47\\-25.60589\\-187.1369\\-47\\-25.66535\\-186.1369\\-47\\-26.10589\\-185.6369\\-47\\-26.16535\\-184.6369\\-47\\-26.60589\\-184.1369\\-47\\-26.66535\\-182.1369\\-47\\-27.10589\\-181.6369\\-47\\-27.10589\\-176.1369\\-47\\-26.66535\\-175.6369\\-47\\-26.60589\\-173.6369\\-47\\-26.16535\\-173.1369\\-47\\-26.10589\\-172.1369\\-47\\-24.66535\\-169.6369\\-47\\-24.60589\\-169.1369\\-47\\-23.66535\\-168.1369\\-47\\-23.60589\\-167.6369\\-47\\-21.41535\\-165.3869\\-47\\-19.41535\\-163.4464\\-47\\-15.91535\\-161.8869\\-47\\-14.41535\\-160.9464\\-47\\-12.91535\\-160.8869\\-47\\-12.41535\\-160.4464\\-47\\-10.91535\\-160.3869\\-47\\-10.41535\\-159.9464\\-47\\-9.415353\\-159.8869\\-47\\10.58465\\-159.8869\\-47\\11.58465\\-160.3869\\-47\\13.58465\\-160.4464\\-47\\14.08465\\-160.8869\\-47\\15.08465\\-160.9464\\-47\\15.58465\\-161.3869\\-47\\16.58465\\-161.4464\\-47\\17.08465\\-161.8869\\-47\\19.08465\\-162.8869\\-47\\19.58465\\-162.9464\\-47\\20.58465\\-163.8869\\-47\\21.08465\\-163.9464\\-47\\24.77518\\-167.6369\\-47\\24.83465\\-168.1369\\-47\\25.77518\\-169.1369\\-47\\25.83465\\-169.6369\\-47\\27.27518\\-172.1369\\-47\\27.33465\\-173.1369\\-47\\27.77518\\-173.6369\\-47\\27.83465\\-175.6369\\-47\\28.27518\\-176.1369\\-47\\28.27518\\-182.1369\\-47\\27.83465\\-182.6369\\-47\\27.77518\\-184.1369\\-47\\27.33465\\-184.6369\\-47\\27.27518\\-185.6369\\-47\\26.83465\\-186.1369\\-47\\26.77518\\-187.1369\\-47\\25.33465\\-189.6369\\-47\\25.27518\\-190.1369\\-47\\23.33465\\-192.1369\\-47\\23.27518\\-192.6369\\-47\\21.08465\\-194.8274\\-47\\20.58465\\-194.8869\\-47\\19.08465\\-196.3274\\-47\\18.58465\\-196.3274\\-47\\18.08465\\-196.8274\\-47\\17.08465\\-197.3274\\-47\\16.08465\\-197.3869\\-47\\14.58465\\-198.3274\\-47\\13.08465\\-198.3869\\-47\\12.58465\\-198.8274\\-47\\10.58465\\-198.8869\\-47\\10.08465\\-199.3274\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "97" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.41535\\-200.3274\\-45\\-10.91535\\-199.8869\\-45\\-12.41535\\-199.8274\\-45\\-12.91535\\-199.3869\\-45\\-13.91535\\-199.3274\\-45\\-14.41535\\-198.8869\\-45\\-15.41535\\-198.8274\\-45\\-15.91535\\-198.3869\\-45\\-18.41535\\-197.3274\\-45\\-19.41535\\-196.3869\\-45\\-19.91535\\-196.3274\\-45\\-24.10589\\-192.1369\\-45\\-24.16535\\-191.6369\\-45\\-25.10589\\-190.6369\\-45\\-26.60589\\-187.6369\\-45\\-26.66535\\-186.6369\\-45\\-27.10589\\-186.1369\\-45\\-27.16535\\-185.1369\\-45\\-27.60589\\-184.6369\\-45\\-27.66535\\-182.6369\\-45\\-28.10589\\-182.1369\\-45\\-28.10589\\-175.6369\\-45\\-27.66535\\-175.1369\\-45\\-27.60589\\-173.6369\\-45\\-27.16535\\-173.1369\\-45\\-27.10589\\-172.1369\\-45\\-25.66535\\-169.6369\\-45\\-25.60589\\-169.1369\\-45\\-24.66535\\-167.6369\\-45\\-24.60589\\-167.1369\\-45\\-21.41535\\-163.9464\\-45\\-20.91535\\-163.8869\\-45\\-19.91535\\-162.9464\\-45\\-19.41535\\-162.8869\\-45\\-18.41535\\-161.9464\\-45\\-16.91535\\-161.3869\\-45\\-16.41535\\-160.9464\\-45\\-15.41535\\-160.8869\\-45\\-14.91535\\-160.4464\\-45\\-13.91535\\-160.3869\\-45\\-13.41535\\-159.9464\\-45\\-11.91535\\-159.8869\\-45\\-11.41535\\-159.4464\\-45\\-10.41535\\-159.3869\\-45\\-6.915353\\-159.3869\\-45\\-6.415353\\-158.9464\\-45\\6.584647\\-158.9464\\-45\\7.084647\\-159.3869\\-45\\11.08465\\-159.3869\\-45\\12.08465\\-159.4464\\-45\\12.58465\\-159.8869\\-45\\14.08465\\-159.9464\\-45\\14.58465\\-160.3869\\-45\\15.58465\\-160.4464\\-45\\16.08465\\-160.8869\\-45\\17.08465\\-160.9464\\-45\\17.58465\\-161.3869\\-45\\18.08465\\-161.3869\\-45\\18.58465\\-161.8869\\-45\\19.08465\\-161.8869\\-45\\19.58465\\-162.3869\\-45\\21.08465\\-162.9464\\-45\\22.58465\\-164.3869\\-45\\23.08465\\-164.4464\\-45\\25.27518\\-166.6369\\-45\\25.33465\\-167.1369\\-45\\26.27518\\-168.1369\\-45\\26.83465\\-169.6369\\-45\\28.27518\\-172.1369\\-45\\28.33465\\-173.1369\\-45\\28.77518\\-173.6369\\-45\\28.83465\\-175.1369\\-45\\29.27518\\-175.6369\\-45\\29.27518\\-182.6369\\-45\\28.83465\\-183.1369\\-45\\28.77518\\-184.6369\\-45\\28.33465\\-185.1369\\-45\\28.27518\\-186.1369\\-45\\27.83465\\-186.6369\\-45\\27.77518\\-187.6369\\-45\\26.83465\\-189.1369\\-45\\26.27518\\-190.6369\\-45\\24.83465\\-192.1369\\-45\\24.77518\\-192.6369\\-45\\21.58465\\-195.8274\\-45\\21.08465\\-195.8869\\-45\\19.58465\\-197.3274\\-45\\17.08465\\-198.3869\\-45\\16.58465\\-198.8274\\-45\\15.58465\\-198.8869\\-45\\15.08465\\-199.3274\\-45\\13.58465\\-199.3869\\-45\\13.08465\\-199.8274\\-45\\11.08465\\-199.8869\\-45\\10.58465\\-200.3274\\-45\\8.084647\\-200.3869\\-45\\-7.915353\\-200.3869\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "102" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.41535\\-201.3274\\-43\\-10.91535\\-200.8869\\-43\\-12.41535\\-200.8274\\-43\\-12.91535\\-200.3869\\-43\\-14.41535\\-200.3274\\-43\\-15.91535\\-199.3869\\-43\\-16.91535\\-199.3274\\-43\\-17.91535\\-198.8274\\-43\\-18.91535\\-197.8869\\-43\\-19.41535\\-197.8274\\-43\\-20.41535\\-196.8869\\-43\\-20.91535\\-196.8274\\-43\\-24.10589\\-193.6369\\-43\\-24.16535\\-193.1369\\-43\\-25.10589\\-192.1369\\-43\\-25.16535\\-191.6369\\-43\\-26.10589\\-190.6369\\-43\\-26.66535\\-189.1369\\-43\\-27.10589\\-188.6369\\-43\\-27.16535\\-187.6369\\-43\\-27.60589\\-187.1369\\-43\\-27.66535\\-186.1369\\-43\\-28.10589\\-185.6369\\-43\\-28.16535\\-184.6369\\-43\\-28.60589\\-184.1369\\-43\\-28.66535\\-182.1369\\-43\\-29.10589\\-181.6369\\-43\\-29.10589\\-176.6369\\-43\\-28.66535\\-176.1369\\-43\\-28.60589\\-173.6369\\-43\\-28.16535\\-173.1369\\-43\\-28.10589\\-172.1369\\-43\\-26.66535\\-169.6369\\-43\\-26.10589\\-168.1369\\-43\\-25.16535\\-167.1369\\-43\\-25.10589\\-166.6369\\-43\\-21.91535\\-163.4464\\-43\\-21.41535\\-163.3869\\-43\\-20.41535\\-162.4464\\-43\\-19.91535\\-162.3869\\-43\\-19.41535\\-161.8869\\-43\\-18.91535\\-161.8869\\-43\\-17.91535\\-160.9464\\-43\\-16.91535\\-160.8869\\-43\\-16.41535\\-160.3869\\-43\\-15.91535\\-160.3869\\-43\\-15.41535\\-159.9464\\-43\\-13.91535\\-159.8869\\-43\\-13.41535\\-159.4464\\-43\\-11.41535\\-159.3869\\-43\\-10.41535\\-158.8869\\-43\\11.08465\\-158.8869\\-43\\12.08465\\-159.3869\\-43\\14.08465\\-159.4464\\-43\\14.58465\\-159.8869\\-43\\16.08465\\-159.9464\\-43\\16.58465\\-160.3869\\-43\\17.58465\\-160.4464\\-43\\20.08465\\-161.8869\\-43\\20.58465\\-161.9464\\-43\\21.58465\\-162.8869\\-43\\22.08465\\-162.9464\\-43\\23.08465\\-163.8869\\-43\\23.58465\\-163.9464\\-43\\26.27518\\-166.6369\\-43\\26.33465\\-167.1369\\-43\\27.27518\\-168.1369\\-43\\27.83465\\-169.6369\\-43\\29.27518\\-172.1369\\-43\\29.33465\\-173.1369\\-43\\29.77518\\-173.6369\\-43\\29.83465\\-176.1369\\-43\\30.27518\\-176.6369\\-43\\30.27518\\-181.6369\\-43\\29.83465\\-182.1369\\-43\\29.77518\\-184.1369\\-43\\29.33465\\-184.6369\\-43\\29.27518\\-185.6369\\-43\\28.83465\\-186.1369\\-43\\28.77518\\-187.1369\\-43\\28.33465\\-187.6369\\-43\\28.27518\\-188.6369\\-43\\27.27518\\-190.6369\\-43\\26.33465\\-191.6369\\-43\\26.27518\\-192.1369\\-43\\24.83465\\-193.6369\\-43\\24.77518\\-194.1369\\-43\\22.58465\\-196.3274\\-43\\22.08465\\-196.3869\\-43\\20.58465\\-197.8274\\-43\\19.08465\\-198.3869\\-43\\18.58465\\-198.8274\\-43\\17.08465\\-199.3869\\-43\\16.58465\\-199.8274\\-43\\15.58465\\-199.8869\\-43\\15.08465\\-200.3274\\-43\\13.58465\\-200.3869\\-43\\13.08465\\-200.8274\\-43\\11.08465\\-200.8869\\-43\\10.58465\\-201.3274\\-43\\8.084647\\-201.3869\\-43\\-8.415353\\-201.3869\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "109" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-9.915353\\-202.3274\\-41\\-10.41535\\-201.8869\\-41\\-12.41535\\-201.8274\\-41\\-12.91535\\-201.3869\\-41\\-13.91535\\-201.3274\\-41\\-14.41535\\-200.8869\\-41\\-15.41535\\-200.8274\\-41\\-16.91535\\-199.8869\\-41\\-19.41535\\-198.8274\\-41\\-20.91535\\-197.3869\\-41\\-21.41535\\-197.3274\\-41\\-24.60589\\-194.1369\\-41\\-24.66535\\-193.6369\\-41\\-25.60589\\-192.6369\\-41\\-25.66535\\-192.1369\\-41\\-26.60589\\-191.1369\\-41\\-27.16535\\-189.6369\\-41\\-28.10589\\-188.1369\\-41\\-28.16535\\-187.1369\\-41\\-28.60589\\-186.6369\\-41\\-28.66535\\-185.6369\\-41\\-29.10589\\-185.1369\\-41\\-29.16535\\-183.1369\\-41\\-29.60589\\-182.6369\\-41\\-29.66535\\-181.6369\\-41\\-29.66535\\-176.6369\\-41\\-29.60589\\-175.1369\\-41\\-29.16535\\-174.6369\\-41\\-29.10589\\-173.1369\\-41\\-28.66535\\-172.6369\\-41\\-28.60589\\-171.6369\\-41\\-27.66535\\-170.1369\\-41\\-27.66535\\-169.6369\\-41\\-27.16535\\-169.1369\\-41\\-27.10589\\-168.6369\\-41\\-26.16535\\-167.6369\\-41\\-26.10589\\-167.1369\\-41\\-25.16535\\-166.1369\\-41\\-25.10589\\-165.6369\\-41\\-23.41535\\-163.9464\\-41\\-22.91535\\-163.8869\\-41\\-21.41535\\-162.4464\\-41\\-20.91535\\-162.3869\\-41\\-20.41535\\-161.8869\\-41\\-19.91535\\-161.8869\\-41\\-18.91535\\-160.9464\\-41\\-17.91535\\-160.4464\\-41\\-16.91535\\-160.3869\\-41\\-16.41535\\-159.8869\\-41\\-15.41535\\-159.8869\\-41\\-14.91535\\-159.3869\\-41\\-13.41535\\-159.3869\\-41\\-12.91535\\-158.9464\\-41\\-9.415353\\-158.8869\\-41\\-8.915353\\-158.4464\\-41\\-7.915353\\-158.3869\\-41\\8.584647\\-158.3869\\-41\\9.584647\\-158.4464\\-41\\10.08465\\-158.8869\\-41\\13.08465\\-158.9464\\-41\\13.58465\\-159.3869\\-41\\15.58465\\-159.3869\\-41\\16.08465\\-159.8869\\-41\\17.08465\\-159.8869\\-41\\17.58465\\-160.3869\\-41\\18.58465\\-160.4464\\-41\\21.58465\\-161.9464\\-41\\22.58465\\-162.8869\\-41\\23.58465\\-163.3869\\-41\\26.83465\\-166.6369\\-41\\27.33465\\-167.6369\\-41\\28.27518\\-168.6369\\-41\\28.83465\\-170.1369\\-41\\29.77518\\-171.6369\\-41\\29.83465\\-172.6369\\-41\\30.27518\\-173.1369\\-41\\30.33465\\-174.6369\\-41\\30.77518\\-175.1369\\-41\\30.83465\\-176.1369\\-41\\30.83465\\-181.6369\\-41\\30.77518\\-182.6369\\-41\\30.33465\\-183.1369\\-41\\30.27518\\-185.1369\\-41\\29.83465\\-185.6369\\-41\\29.77518\\-186.6369\\-41\\29.33465\\-187.1369\\-41\\29.27518\\-188.1369\\-41\\28.33465\\-189.6369\\-41\\27.77518\\-191.1369\\-41\\26.83465\\-192.1369\\-41\\26.77518\\-192.6369\\-41\\25.83465\\-193.6369\\-41\\25.77518\\-194.1369\\-41\\23.08465\\-196.8274\\-41\\22.58465\\-196.8869\\-41\\21.08465\\-198.3274\\-41\\20.58465\\-198.3869\\-41\\19.58465\\-199.3274\\-41\\17.58465\\-200.3274\\-41\\16.58465\\-200.3869\\-41\\16.08465\\-200.8274\\-41\\15.08465\\-200.8869\\-41\\14.58465\\-201.3274\\-41\\13.58465\\-201.3869\\-41\\13.08465\\-201.8274\\-41\\10.58465\\-201.8869\\-41\\10.08465\\-202.3274\\-41\\8.084647\\-202.3869\\-41\\-7.415353\\-202.3869\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "135" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.415353\\-203.3274\\-39\\-8.915353\\-202.8869\\-39\\-11.41535\\-202.8274\\-39\\-11.91535\\-202.3869\\-39\\-13.41535\\-202.3274\\-39\\-13.91535\\-201.8869\\-39\\-14.91535\\-201.8274\\-39\\-16.41535\\-200.8869\\-39\\-16.91535\\-200.8869\\-39\\-17.41535\\-200.3869\\-39\\-17.91535\\-200.3869\\-39\\-18.41535\\-199.8869\\-39\\-18.91535\\-199.8274\\-39\\-19.91535\\-198.8869\\-39\\-20.41535\\-198.8274\\-39\\-21.91535\\-197.3869\\-39\\-22.41535\\-197.3274\\-39\\-24.10589\\-195.6369\\-39\\-24.16535\\-195.1369\\-39\\-25.60589\\-193.6369\\-39\\-25.66535\\-193.1369\\-39\\-26.60589\\-192.1369\\-39\\-26.66535\\-191.6369\\-39\\-27.16535\\-191.1369\\-39\\-27.16535\\-190.6369\\-39\\-27.66535\\-190.1369\\-39\\-27.66535\\-189.6369\\-39\\-28.16535\\-189.1369\\-39\\-28.16535\\-188.6369\\-39\\-28.60589\\-188.1369\\-39\\-28.66535\\-187.1369\\-39\\-29.16535\\-186.6369\\-39\\-29.16535\\-185.6369\\-39\\-29.60589\\-185.1369\\-39\\-29.66535\\-183.1369\\-39\\-30.10589\\-182.6369\\-39\\-30.16535\\-181.6369\\-39\\-30.16535\\-176.6369\\-39\\-30.10589\\-175.6369\\-39\\-29.66535\\-175.1369\\-39\\-29.60589\\-173.1369\\-39\\-29.16535\\-172.6369\\-39\\-29.10589\\-171.6369\\-39\\-28.66535\\-171.1369\\-39\\-28.66535\\-170.6369\\-39\\-28.16535\\-170.1369\\-39\\-28.10589\\-169.1369\\-39\\-27.16535\\-168.1369\\-39\\-27.10589\\-167.6369\\-39\\-26.16535\\-166.6369\\-39\\-26.10589\\-166.1369\\-39\\-22.91535\\-162.9464\\-39\\-22.41535\\-162.8869\\-39\\-21.41535\\-161.9464\\-39\\-20.91535\\-161.8869\\-39\\-20.41535\\-161.3869\\-39\\-19.91535\\-161.3869\\-39\\-19.41535\\-160.8869\\-39\\-18.91535\\-160.8869\\-39\\-18.41535\\-160.3869\\-39\\-17.91535\\-160.3869\\-39\\-17.41535\\-159.8869\\-39\\-16.41535\\-159.8869\\-39\\-15.91535\\-159.3869\\-39\\-14.41535\\-159.3869\\-39\\-13.91535\\-158.8869\\-39\\-11.41535\\-158.8869\\-39\\-10.41535\\-158.3869\\-39\\10.58465\\-158.3869\\-39\\11.58465\\-158.8869\\-39\\14.08465\\-158.8869\\-39\\14.58465\\-159.3869\\-39\\16.58465\\-159.4464\\-39\\17.08465\\-159.8869\\-39\\18.08465\\-159.8869\\-39\\18.58465\\-160.3869\\-39\\19.08465\\-160.3869\\-39\\19.58465\\-160.8869\\-39\\20.08465\\-160.8869\\-39\\20.58465\\-161.3869\\-39\\21.08465\\-161.3869\\-39\\21.58465\\-161.8869\\-39\\22.08465\\-161.8869\\-39\\22.58465\\-162.3869\\-39\\23.08465\\-162.4464\\-39\\24.58465\\-163.8869\\-39\\25.08465\\-163.9464\\-39\\26.77518\\-165.6369\\-39\\26.83465\\-166.1369\\-39\\28.27518\\-167.6369\\-39\\28.33465\\-168.1369\\-39\\28.83465\\-168.6369\\-39\\28.83465\\-169.1369\\-39\\29.33465\\-169.6369\\-39\\29.33465\\-170.1369\\-39\\29.83465\\-170.6369\\-39\\29.83465\\-171.1369\\-39\\30.27518\\-171.6369\\-39\\30.33465\\-172.6369\\-39\\30.77518\\-173.1369\\-39\\30.83465\\-175.1369\\-39\\31.33465\\-176.1369\\-39\\31.33465\\-181.6369\\-39\\31.27518\\-182.6369\\-39\\30.83465\\-183.1369\\-39\\30.77518\\-185.1369\\-39\\30.33465\\-185.6369\\-39\\30.33465\\-186.6369\\-39\\29.83465\\-187.1369\\-39\\29.77518\\-188.1369\\-39\\28.83465\\-189.6369\\-39\\28.83465\\-190.1369\\-39\\28.33465\\-190.6369\\-39\\28.33465\\-191.1369\\-39\\27.83465\\-191.6369\\-39\\27.77518\\-192.1369\\-39\\26.83465\\-193.1369\\-39\\26.77518\\-193.6369\\-39\\24.83465\\-195.6369\\-39\\24.77518\\-196.1369\\-39\\24.08465\\-196.8274\\-39\\23.58465\\-196.8869\\-39\\21.58465\\-198.8274\\-39\\21.08465\\-198.8869\\-39\\20.08465\\-199.8274\\-39\\17.58465\\-200.8869\\-39\\17.08465\\-201.3274\\-39\\16.08465\\-201.3869\\-39\\15.58465\\-201.8274\\-39\\14.58465\\-201.8869\\-39\\14.08465\\-202.3274\\-39\\12.58465\\-202.3869\\-39\\12.08465\\-202.8274\\-39\\9.584647\\-202.8869\\-39\\9.084647\\-203.3274\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "134" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-9.915353\\-203.8274\\-37\\-10.41535\\-203.3869\\-37\\-11.91535\\-203.3274\\-37\\-12.41535\\-202.8869\\-37\\-13.91535\\-202.8274\\-37\\-14.41535\\-202.3869\\-37\\-15.41535\\-202.3274\\-37\\-17.91535\\-200.8869\\-37\\-18.41535\\-200.8274\\-37\\-19.41535\\-199.8869\\-37\\-19.91535\\-199.8274\\-37\\-21.41535\\-198.3869\\-37\\-21.91535\\-198.3274\\-37\\-24.10589\\-196.1369\\-37\\-24.16535\\-195.6369\\-37\\-26.10589\\-193.6369\\-37\\-26.16535\\-193.1369\\-37\\-27.10589\\-192.1369\\-37\\-27.66535\\-190.6369\\-37\\-28.16535\\-190.1369\\-37\\-28.16535\\-189.6369\\-37\\-28.66535\\-189.1369\\-37\\-28.66535\\-188.1369\\-37\\-29.16535\\-187.6369\\-37\\-29.16535\\-187.1369\\-37\\-29.60589\\-186.6369\\-37\\-29.66535\\-185.1369\\-37\\-30.10589\\-184.6369\\-37\\-30.16535\\-182.1369\\-37\\-30.60589\\-181.6369\\-37\\-30.66535\\-180.6369\\-37\\-30.66535\\-177.1369\\-37\\-30.60589\\-176.1369\\-37\\-30.16535\\-175.6369\\-37\\-30.10589\\-173.6369\\-37\\-29.66535\\-173.1369\\-37\\-29.66535\\-172.1369\\-37\\-29.16535\\-171.6369\\-37\\-29.10589\\-170.6369\\-37\\-28.66535\\-170.1369\\-37\\-28.66535\\-169.6369\\-37\\-28.16535\\-169.1369\\-37\\-28.16535\\-168.6369\\-37\\-27.66535\\-168.1369\\-37\\-27.60589\\-167.6369\\-37\\-26.16535\\-166.1369\\-37\\-26.10589\\-165.6369\\-37\\-23.91535\\-163.4464\\-37\\-23.41535\\-163.3869\\-37\\-22.41535\\-162.3869\\-37\\-21.91535\\-162.3869\\-37\\-20.91535\\-161.4464\\-37\\-20.41535\\-161.3869\\-37\\-19.91535\\-160.8869\\-37\\-19.41535\\-160.8869\\-37\\-18.91535\\-160.3869\\-37\\-18.41535\\-160.3869\\-37\\-17.91535\\-159.9464\\-37\\-16.91535\\-159.8869\\-37\\-16.41535\\-159.3869\\-37\\-14.91535\\-159.3869\\-37\\-14.41535\\-158.8869\\-37\\-12.41535\\-158.8869\\-37\\-11.41535\\-158.3869\\-37\\-7.915353\\-158.3869\\-37\\-7.415353\\-157.8869\\-37\\7.584647\\-157.8869\\-37\\8.084647\\-158.3869\\-37\\11.58465\\-158.3869\\-37\\12.58465\\-158.8869\\-37\\14.58465\\-158.8869\\-37\\15.08465\\-159.3869\\-37\\16.58465\\-159.3869\\-37\\17.08465\\-159.8869\\-37\\18.58465\\-159.8869\\-37\\19.08465\\-160.3869\\-37\\19.58465\\-160.3869\\-37\\20.08465\\-160.8869\\-37\\20.58465\\-160.8869\\-37\\21.08465\\-161.3869\\-37\\21.58465\\-161.3869\\-37\\22.08465\\-161.8869\\-37\\22.58465\\-161.8869\\-37\\23.58465\\-162.8869\\-37\\24.08465\\-162.8869\\-37\\28.33465\\-167.1369\\-37\\28.33465\\-167.6369\\-37\\29.33465\\-168.6369\\-37\\29.33465\\-169.1369\\-37\\29.83465\\-169.6369\\-37\\29.83465\\-170.1369\\-37\\30.27518\\-170.6369\\-37\\30.33465\\-171.6369\\-37\\30.77518\\-172.1369\\-37\\30.83465\\-173.6369\\-37\\31.33465\\-174.1369\\-37\\31.33465\\-175.6369\\-37\\31.83465\\-176.6369\\-37\\31.83465\\-180.6369\\-37\\31.77518\\-181.6369\\-37\\31.33465\\-182.1369\\-37\\31.27518\\-184.6369\\-37\\30.83465\\-185.1369\\-37\\30.77518\\-186.6369\\-37\\30.33465\\-187.1369\\-37\\30.33465\\-187.6369\\-37\\29.83465\\-188.1369\\-37\\29.77518\\-189.1369\\-37\\29.33465\\-189.6369\\-37\\29.33465\\-190.1369\\-37\\28.83465\\-190.6369\\-37\\28.83465\\-191.1369\\-37\\28.33465\\-191.6369\\-37\\28.27518\\-192.1369\\-37\\27.33465\\-193.1369\\-37\\27.27518\\-193.6369\\-37\\25.33465\\-195.6369\\-37\\25.27518\\-196.1369\\-37\\23.08465\\-198.3274\\-37\\22.58465\\-198.3869\\-37\\21.08465\\-199.8274\\-37\\19.58465\\-200.3869\\-37\\18.58465\\-201.3274\\-37\\17.58465\\-201.8274\\-37\\16.58465\\-201.8869\\-37\\16.08465\\-202.3274\\-37\\15.08465\\-202.3869\\-37\\14.58465\\-202.8274\\-37\\13.58465\\-202.8869\\-37\\13.08465\\-203.3274\\-37\\11.58465\\-203.3869\\-37\\11.08465\\-203.8274\\-37\\9.584647\\-203.8869\\-37\\-8.915353\\-203.8869\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "128" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.415353\\-204.8274\\-35\\-7.915353\\-204.3869\\-35\\-10.41535\\-204.3274\\-35\\-10.91535\\-203.8869\\-35\\-12.41535\\-203.8274\\-35\\-12.91535\\-203.3869\\-35\\-13.91535\\-203.3274\\-35\\-14.41535\\-202.8869\\-35\\-15.41535\\-202.8274\\-35\\-16.91535\\-201.8869\\-35\\-18.41535\\-201.3274\\-35\\-19.41535\\-200.3869\\-35\\-20.41535\\-199.8869\\-35\\-25.66535\\-194.6369\\-35\\-26.16535\\-193.6369\\-35\\-27.10589\\-192.6369\\-35\\-27.16535\\-192.1369\\-35\\-27.66535\\-191.6369\\-35\\-27.66535\\-191.1369\\-35\\-28.16535\\-190.6369\\-35\\-28.16535\\-190.1369\\-35\\-28.66535\\-189.6369\\-35\\-28.66535\\-188.6369\\-35\\-29.16535\\-188.1369\\-35\\-29.16535\\-187.6369\\-35\\-29.66535\\-187.1369\\-35\\-29.66535\\-185.6369\\-35\\-30.16535\\-185.1369\\-35\\-30.16535\\-183.6369\\-35\\-30.66535\\-182.6369\\-35\\-30.66535\\-175.1369\\-35\\-30.16535\\-174.1369\\-35\\-30.16535\\-173.1369\\-35\\-29.66535\\-172.6369\\-35\\-29.66535\\-171.6369\\-35\\-29.16535\\-171.1369\\-35\\-29.16535\\-170.1369\\-35\\-28.66535\\-169.6369\\-35\\-28.66535\\-169.1369\\-35\\-28.16535\\-168.6369\\-35\\-28.16535\\-168.1369\\-35\\-27.16535\\-167.1369\\-35\\-26.66535\\-166.1369\\-35\\-23.41535\\-162.8869\\-35\\-22.91535\\-162.8869\\-35\\-21.91535\\-161.8869\\-35\\-21.41535\\-161.8869\\-35\\-20.91535\\-161.3869\\-35\\-20.41535\\-161.3869\\-35\\-19.91535\\-160.8869\\-35\\-19.41535\\-160.8869\\-35\\-18.91535\\-160.3869\\-35\\-18.41535\\-160.3869\\-35\\-17.91535\\-159.8869\\-35\\-16.91535\\-159.8869\\-35\\-16.41535\\-159.3869\\-35\\-14.91535\\-159.3869\\-35\\-14.41535\\-158.8869\\-35\\-12.41535\\-158.8869\\-35\\-11.91535\\-158.3869\\-35\\-8.415353\\-158.3869\\-35\\-7.915353\\-157.8869\\-35\\8.084647\\-157.8869\\-35\\8.584647\\-158.3869\\-35\\12.08465\\-158.3869\\-35\\12.58465\\-158.8869\\-35\\14.58465\\-158.8869\\-35\\15.08465\\-159.3869\\-35\\16.58465\\-159.3869\\-35\\17.08465\\-159.8869\\-35\\18.58465\\-159.8869\\-35\\19.08465\\-160.3869\\-35\\19.58465\\-160.3869\\-35\\20.08465\\-160.8869\\-35\\20.58465\\-160.8869\\-35\\21.08465\\-161.3869\\-35\\21.58465\\-161.3869\\-35\\22.08465\\-161.8869\\-35\\22.58465\\-161.8869\\-35\\23.08465\\-162.3869\\-35\\23.58465\\-162.3869\\-35\\25.08465\\-163.8869\\-35\\25.58465\\-163.8869\\-35\\27.77518\\-166.1369\\-35\\27.83465\\-166.6369\\-35\\28.83465\\-167.6369\\-35\\28.83465\\-168.1369\\-35\\29.83465\\-169.1369\\-35\\29.83465\\-169.6369\\-35\\30.27518\\-170.1369\\-35\\30.33465\\-171.1369\\-35\\30.83465\\-171.6369\\-35\\30.83465\\-172.6369\\-35\\31.33465\\-173.1369\\-35\\31.33465\\-174.1369\\-35\\31.83465\\-175.1369\\-35\\31.83465\\-182.6369\\-35\\31.33465\\-183.6369\\-35\\31.33465\\-185.1369\\-35\\30.83465\\-185.6369\\-35\\30.83465\\-187.1369\\-35\\30.33465\\-187.6369\\-35\\30.27518\\-188.6369\\-35\\29.83465\\-189.1369\\-35\\29.83465\\-189.6369\\-35\\29.33465\\-190.1369\\-35\\29.33465\\-190.6369\\-35\\28.83465\\-191.1369\\-35\\28.83465\\-191.6369\\-35\\28.33465\\-192.1369\\-35\\28.27518\\-192.6369\\-35\\27.33465\\-193.6369\\-35\\26.83465\\-194.6369\\-35\\21.58465\\-199.8869\\-35\\20.58465\\-200.3869\\-35\\20.08465\\-200.8869\\-35\\19.58465\\-200.8869\\-35\\18.58465\\-201.8274\\-35\\17.08465\\-202.3869\\-35\\16.58465\\-202.8274\\-35\\15.58465\\-202.8869\\-35\\15.08465\\-203.3274\\-35\\14.08465\\-203.3869\\-35\\13.58465\\-203.8274\\-35\\12.08465\\-203.8869\\-35\\11.58465\\-204.3274\\-35\\9.084647\\-204.3869\\-35\\8.584647\\-204.8274\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "151" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.415353\\-205.3274\\-33\\-7.915353\\-204.8869\\-33\\-10.41535\\-204.8274\\-33\\-10.91535\\-204.3869\\-33\\-12.41535\\-204.3274\\-33\\-12.91535\\-203.8869\\-33\\-13.91535\\-203.8274\\-33\\-14.41535\\-203.3869\\-33\\-14.91535\\-203.3869\\-33\\-15.41535\\-202.8869\\-33\\-15.91535\\-202.8869\\-33\\-16.41535\\-202.3869\\-33\\-16.91535\\-202.3869\\-33\\-17.41535\\-201.8869\\-33\\-17.91535\\-201.8869\\-33\\-18.41535\\-201.3869\\-33\\-18.91535\\-201.3274\\-33\\-20.91535\\-199.3869\\-33\\-21.41535\\-199.3869\\-33\\-24.10589\\-196.6369\\-33\\-24.16535\\-196.1369\\-33\\-26.16535\\-194.1369\\-33\\-26.16535\\-193.6369\\-33\\-27.16535\\-192.6369\\-33\\-27.16535\\-192.1369\\-33\\-27.66535\\-191.6369\\-33\\-27.66535\\-191.1369\\-33\\-28.16535\\-190.6369\\-33\\-28.16535\\-190.1369\\-33\\-28.66535\\-189.6369\\-33\\-28.66535\\-189.1369\\-33\\-29.16535\\-188.6369\\-33\\-29.16535\\-187.6369\\-33\\-29.66535\\-187.1369\\-33\\-29.66535\\-185.6369\\-33\\-30.16535\\-185.1369\\-33\\-30.16535\\-183.6369\\-33\\-30.66535\\-183.1369\\-33\\-30.66535\\-179.6369\\-33\\-31.16535\\-179.1369\\-33\\-31.16535\\-178.6369\\-33\\-30.66535\\-178.1369\\-33\\-30.66535\\-174.6369\\-33\\-30.16535\\-174.1369\\-33\\-30.16535\\-173.1369\\-33\\-29.66535\\-172.6369\\-33\\-29.66535\\-171.6369\\-33\\-29.16535\\-171.1369\\-33\\-29.16535\\-170.1369\\-33\\-28.66535\\-169.6369\\-33\\-28.66535\\-169.1369\\-33\\-28.16535\\-168.6369\\-33\\-28.16535\\-168.1369\\-33\\-27.16535\\-167.1369\\-33\\-27.16535\\-166.6369\\-33\\-23.41535\\-162.8869\\-33\\-22.91535\\-162.8869\\-33\\-21.91535\\-161.8869\\-33\\-21.41535\\-161.8869\\-33\\-20.91535\\-161.3869\\-33\\-20.41535\\-161.3869\\-33\\-19.91535\\-160.8869\\-33\\-19.41535\\-160.8869\\-33\\-18.91535\\-160.3869\\-33\\-18.41535\\-160.3869\\-33\\-17.91535\\-159.8869\\-33\\-16.91535\\-159.8869\\-33\\-16.41535\\-159.3869\\-33\\-14.91535\\-159.3869\\-33\\-14.41535\\-158.8869\\-33\\-11.91535\\-158.8274\\-33\\-11.41535\\-158.3869\\-33\\-7.415353\\-158.3869\\-33\\-6.415353\\-157.8869\\-33\\5.084647\\-157.8869\\-33\\5.584647\\-158.3274\\-33\\6.584647\\-158.3869\\-33\\11.58465\\-158.3869\\-33\\12.08465\\-158.8869\\-33\\14.58465\\-158.8869\\-33\\15.08465\\-159.3869\\-33\\16.58465\\-159.3869\\-33\\17.08465\\-159.8869\\-33\\18.58465\\-159.8869\\-33\\19.08465\\-160.3869\\-33\\19.58465\\-160.3869\\-33\\20.08465\\-160.8869\\-33\\20.58465\\-160.8869\\-33\\21.08465\\-161.3869\\-33\\21.58465\\-161.3869\\-33\\22.08465\\-161.8869\\-33\\22.58465\\-161.8869\\-33\\23.08465\\-162.3869\\-33\\23.58465\\-162.3869\\-33\\25.08465\\-163.8869\\-33\\25.58465\\-163.8869\\-33\\27.83465\\-166.1369\\-33\\27.83465\\-166.6369\\-33\\28.83465\\-167.6369\\-33\\28.89411\\-168.1369\\-33\\29.83465\\-169.1369\\-33\\29.83465\\-169.6369\\-33\\30.33465\\-170.1369\\-33\\30.33465\\-171.1369\\-33\\30.83465\\-171.6369\\-33\\30.83465\\-172.6369\\-33\\31.33465\\-173.1369\\-33\\31.33465\\-174.1369\\-33\\31.83465\\-174.6369\\-33\\31.83465\\-177.6369\\-33\\32.33465\\-178.1369\\-33\\32.33465\\-179.1369\\-33\\31.83465\\-179.6369\\-33\\31.83465\\-183.1369\\-33\\31.33465\\-183.6369\\-33\\31.33465\\-185.1369\\-33\\30.83465\\-185.6369\\-33\\30.83465\\-187.1369\\-33\\30.33465\\-187.6369\\-33\\30.33465\\-188.6369\\-33\\29.83465\\-189.1369\\-33\\29.83465\\-189.6369\\-33\\29.33465\\-190.1369\\-33\\29.33465\\-190.6369\\-33\\28.83465\\-191.1369\\-33\\28.83465\\-191.6369\\-33\\28.33465\\-192.1369\\-33\\28.33465\\-192.6369\\-33\\27.33465\\-193.6369\\-33\\27.33465\\-194.1369\\-33\\25.83465\\-195.6369\\-33\\25.77518\\-196.1369\\-33\\22.58465\\-199.3869\\-33\\22.08465\\-199.3869\\-33\\20.08465\\-201.3274\\-33\\19.58465\\-201.3869\\-33\\19.08465\\-201.8869\\-33\\18.58465\\-201.8869\\-33\\18.08465\\-202.3869\\-33\\17.58465\\-202.3869\\-33\\17.08465\\-202.8869\\-33\\16.58465\\-202.8869\\-33\\16.08465\\-203.3869\\-33\\15.58465\\-203.3869\\-33\\15.08465\\-203.8274\\-33\\14.08465\\-203.8869\\-33\\13.58465\\-204.3274\\-33\\12.08465\\-204.3869\\-33\\11.58465\\-204.8274\\-33\\9.084647\\-204.8869\\-33\\8.584647\\-205.3274\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "135" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.415353\\-205.8274\\-31\\-6.915353\\-205.3869\\-31\\-9.915353\\-205.3274\\-31\\-10.41535\\-204.8869\\-31\\-11.91535\\-204.8274\\-31\\-12.41535\\-204.3869\\-31\\-13.41535\\-204.3869\\-31\\-13.91535\\-203.8869\\-31\\-14.41535\\-203.8869\\-31\\-14.91535\\-203.3869\\-31\\-15.41535\\-203.3869\\-31\\-15.91535\\-202.8869\\-31\\-16.41535\\-202.8869\\-31\\-16.91535\\-202.3869\\-31\\-17.41535\\-202.3869\\-31\\-18.41535\\-201.3869\\-31\\-18.91535\\-201.3869\\-31\\-20.91535\\-199.3869\\-31\\-21.41535\\-199.3869\\-31\\-24.16535\\-196.6369\\-31\\-24.16535\\-196.1369\\-31\\-26.16535\\-194.1369\\-31\\-26.16535\\-193.6369\\-31\\-27.16535\\-192.6369\\-31\\-27.16535\\-192.1369\\-31\\-27.66535\\-191.6369\\-31\\-27.66535\\-191.1369\\-31\\-28.16535\\-190.6369\\-31\\-28.16535\\-190.1369\\-31\\-28.66535\\-189.6369\\-31\\-28.72482\\-188.6369\\-31\\-29.16535\\-188.1369\\-31\\-29.16535\\-187.6369\\-31\\-29.66535\\-187.1369\\-31\\-29.66535\\-185.6369\\-31\\-30.16535\\-185.1369\\-31\\-30.22482\\-183.1369\\-31\\-30.66535\\-182.6369\\-31\\-30.66535\\-175.1369\\-31\\-30.16535\\-174.6369\\-31\\-30.16535\\-173.6369\\-31\\-29.72482\\-173.1369\\-31\\-29.66535\\-171.6369\\-31\\-29.16535\\-171.1369\\-31\\-29.16535\\-170.6369\\-31\\-28.16535\\-168.6369\\-31\\-27.66535\\-168.1369\\-31\\-27.66535\\-167.6369\\-31\\-26.22482\\-166.1369\\-31\\-26.16535\\-165.6369\\-31\\-23.91535\\-163.3869\\-31\\-23.41535\\-163.3869\\-31\\-22.41535\\-162.3869\\-31\\-21.91535\\-162.3274\\-31\\-20.91535\\-161.3869\\-31\\-20.41535\\-161.3869\\-31\\-19.91535\\-160.8869\\-31\\-19.41535\\-160.8869\\-31\\-18.91535\\-160.3869\\-31\\-17.91535\\-160.3869\\-31\\-17.41535\\-159.8869\\-31\\-16.41535\\-159.8274\\-31\\-15.91535\\-159.3869\\-31\\-14.41535\\-159.3869\\-31\\-13.91535\\-158.8869\\-31\\-10.91535\\-158.8274\\-31\\-10.41535\\-158.3869\\-31\\10.58465\\-158.3869\\-31\\11.08465\\-158.8869\\-31\\14.08465\\-158.8869\\-31\\14.58465\\-159.3869\\-31\\16.58465\\-159.3869\\-31\\17.08465\\-159.8869\\-31\\18.08465\\-159.8869\\-31\\18.58465\\-160.3869\\-31\\19.58465\\-160.3869\\-31\\20.08465\\-160.8869\\-31\\20.58465\\-160.8869\\-31\\21.08465\\-161.3869\\-31\\21.58465\\-161.3869\\-31\\22.08465\\-161.8869\\-31\\22.58465\\-161.8869\\-31\\23.58465\\-162.8869\\-31\\24.08465\\-162.8869\\-31\\28.83465\\-167.6369\\-31\\28.83465\\-168.1369\\-31\\29.33465\\-168.6369\\-31\\29.33465\\-169.1369\\-31\\29.83465\\-169.6369\\-31\\29.83465\\-170.1369\\-31\\30.33465\\-170.6369\\-31\\30.33465\\-171.1369\\-31\\30.83465\\-171.6369\\-31\\30.89411\\-173.1369\\-31\\31.33465\\-173.6369\\-31\\31.33465\\-174.6369\\-31\\31.83465\\-175.1369\\-31\\31.83465\\-182.6369\\-31\\31.39411\\-183.1369\\-31\\31.33465\\-185.1369\\-31\\30.83465\\-185.6369\\-31\\30.83465\\-187.1369\\-31\\30.33465\\-187.6369\\-31\\30.33465\\-188.6369\\-31\\29.83465\\-189.1369\\-31\\29.83465\\-189.6369\\-31\\29.33465\\-190.1369\\-31\\29.33465\\-190.6369\\-31\\28.83465\\-191.1369\\-31\\28.83465\\-191.6369\\-31\\28.33465\\-192.1369\\-31\\28.33465\\-192.6369\\-31\\27.33465\\-193.6369\\-31\\27.33465\\-194.1369\\-31\\25.83465\\-195.6369\\-31\\25.83465\\-196.1369\\-31\\22.08465\\-199.8869\\-31\\21.58465\\-199.8869\\-31\\19.58465\\-201.8869\\-31\\19.08465\\-201.8869\\-31\\18.58465\\-202.3869\\-31\\18.08465\\-202.3869\\-31\\17.58465\\-202.8869\\-31\\17.08465\\-202.8869\\-31\\16.58465\\-203.3869\\-31\\16.08465\\-203.3869\\-31\\15.58465\\-203.8869\\-31\\15.08465\\-203.8869\\-31\\14.58465\\-204.3274\\-31\\13.58465\\-204.3869\\-31\\13.08465\\-204.8274\\-31\\11.58465\\-204.8869\\-31\\11.08465\\-205.3274\\-31\\8.084647\\-205.3869\\-31\\7.584647\\-205.8274\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.415353\\-205.8869\\-29\\-8.915353\\-205.3869\\-29\\-10.41535\\-205.3869\\-29\\-10.91535\\-204.8869\\-29\\-12.41535\\-204.8869\\-29\\-12.91535\\-204.3869\\-29\\-13.41535\\-204.3869\\-29\\-13.91535\\-203.8869\\-29\\-14.41535\\-203.8869\\-29\\-14.91535\\-203.3869\\-29\\-15.41535\\-203.3869\\-29\\-15.91535\\-202.8869\\-29\\-16.41535\\-202.8869\\-29\\-16.91535\\-202.3869\\-29\\-17.41535\\-202.3869\\-29\\-18.41535\\-201.3869\\-29\\-18.91535\\-201.3869\\-29\\-21.41535\\-198.9464\\-29\\-21.91535\\-198.8869\\-29\\-23.16535\\-197.6369\\-29\\-23.22482\\-197.1369\\-29\\-25.66535\\-194.6369\\-29\\-25.66535\\-194.1369\\-29\\-26.66535\\-193.1369\\-29\\-26.66535\\-192.6369\\-29\\-27.16535\\-192.1369\\-29\\-27.16535\\-191.6369\\-29\\-27.66535\\-191.1369\\-29\\-27.66535\\-190.6369\\-29\\-28.16535\\-190.1369\\-29\\-28.16535\\-189.6369\\-29\\-28.66535\\-189.1369\\-29\\-28.72482\\-188.1369\\-29\\-29.16535\\-187.6369\\-29\\-29.22482\\-186.6369\\-29\\-29.66535\\-186.1369\\-29\\-29.72482\\-184.6369\\-29\\-30.16535\\-184.1369\\-29\\-30.22482\\-180.6369\\-29\\-30.66535\\-180.1369\\-29\\-30.66535\\-178.1369\\-29\\-30.22482\\-177.6369\\-29\\-30.16535\\-174.6369\\-29\\-29.72482\\-174.1369\\-29\\-29.66535\\-172.6369\\-29\\-29.16535\\-172.1369\\-29\\-29.16535\\-171.1369\\-29\\-28.66535\\-170.6369\\-29\\-28.66535\\-170.1369\\-29\\-28.16535\\-169.1369\\-29\\-27.66535\\-168.6369\\-29\\-27.66535\\-168.1369\\-29\\-26.22482\\-166.6369\\-29\\-26.16535\\-166.1369\\-29\\-23.41535\\-163.3869\\-29\\-22.91535\\-163.3274\\-29\\-21.91535\\-162.3869\\-29\\-21.41535\\-162.3274\\-29\\-20.41535\\-161.3869\\-29\\-19.91535\\-161.3869\\-29\\-19.41535\\-160.8869\\-29\\-18.41535\\-160.8274\\-29\\-16.91535\\-159.8869\\-29\\-15.91535\\-159.8869\\-29\\-15.41535\\-159.3869\\-29\\-12.91535\\-159.3274\\-29\\-12.41535\\-158.8869\\-29\\-8.415353\\-158.8274\\-29\\-7.915353\\-158.3869\\-29\\7.584647\\-158.3869\\-29\\8.084647\\-158.8274\\-29\\9.084647\\-158.8869\\-29\\12.58465\\-158.8869\\-29\\13.08465\\-159.3274\\-29\\15.58465\\-159.3869\\-29\\16.08465\\-159.8274\\-29\\17.58465\\-159.8869\\-29\\18.08465\\-160.3869\\-29\\19.08465\\-160.3869\\-29\\19.58465\\-160.8869\\-29\\20.08465\\-160.8869\\-29\\20.58465\\-161.3869\\-29\\21.08465\\-161.3869\\-29\\21.58465\\-161.8869\\-29\\22.08465\\-161.8869\\-29\\23.08465\\-162.8274\\-29\\23.58465\\-162.8869\\-29\\25.08465\\-164.3274\\-29\\25.58465\\-164.3869\\-29\\26.83465\\-165.6369\\-29\\26.89411\\-166.1369\\-29\\28.33465\\-167.6369\\-29\\28.39411\\-168.1369\\-29\\29.33465\\-169.1369\\-29\\29.33465\\-169.6369\\-29\\29.83465\\-170.1369\\-29\\29.89411\\-171.1369\\-29\\30.33465\\-171.6369\\-29\\30.33465\\-172.1369\\-29\\30.83465\\-172.6369\\-29\\30.89411\\-174.1369\\-29\\31.33465\\-174.6369\\-29\\31.39411\\-177.1369\\-29\\31.83465\\-177.6369\\-29\\31.83465\\-180.1369\\-29\\31.39411\\-180.6369\\-29\\31.33465\\-184.1369\\-29\\30.89411\\-184.6369\\-29\\30.83465\\-186.1369\\-29\\30.39411\\-186.6369\\-29\\30.33465\\-188.1369\\-29\\29.83465\\-188.6369\\-29\\29.83465\\-189.1369\\-29\\29.33465\\-189.6369\\-29\\29.33465\\-190.1369\\-29\\28.83465\\-190.6369\\-29\\28.83465\\-191.1369\\-29\\28.33465\\-191.6369\\-29\\28.33465\\-192.1369\\-29\\27.83465\\-192.6369\\-29\\27.83465\\-193.1369\\-29\\26.89411\\-194.1369\\-29\\26.83465\\-194.6369\\-29\\25.39411\\-196.1369\\-29\\25.33465\\-196.6369\\-29\\22.08465\\-199.8869\\-29\\21.58465\\-199.8869\\-29\\19.58465\\-201.8869\\-29\\19.08465\\-201.8869\\-29\\18.58465\\-202.3869\\-29\\18.08465\\-202.3869\\-29\\17.58465\\-202.8869\\-29\\17.08465\\-202.8869\\-29\\16.58465\\-203.3869\\-29\\16.08465\\-203.3869\\-29\\15.58465\\-203.8869\\-29\\15.08465\\-203.8869\\-29\\14.58465\\-204.3869\\-29\\14.08465\\-204.3869\\-29\\13.58465\\-204.8869\\-29\\12.08465\\-204.8869\\-29\\11.58465\\-205.3869\\-29\\10.08465\\-205.3869\\-29\\9.584647\\-205.8869\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "128" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.415353\\-206.3869\\-27\\-5.915353\\-205.8869\\-27\\-8.415353\\-205.8869\\-27\\-8.915353\\-205.3869\\-27\\-10.41535\\-205.3869\\-27\\-10.91535\\-204.8869\\-27\\-12.41535\\-204.8869\\-27\\-12.91535\\-204.3869\\-27\\-13.41535\\-204.3869\\-27\\-13.91535\\-203.8869\\-27\\-14.41535\\-203.8869\\-27\\-14.91535\\-203.3869\\-27\\-15.41535\\-203.3869\\-27\\-15.91535\\-202.8869\\-27\\-16.41535\\-202.8869\\-27\\-16.91535\\-202.3869\\-27\\-17.41535\\-202.3869\\-27\\-18.91535\\-200.9464\\-27\\-19.41535\\-200.8869\\-27\\-24.16535\\-196.1369\\-27\\-24.22482\\-195.6369\\-27\\-25.66535\\-194.1369\\-27\\-26.22482\\-192.6369\\-27\\-27.16535\\-191.6369\\-27\\-27.16535\\-191.1369\\-27\\-27.66535\\-190.6369\\-27\\-27.72482\\-189.6369\\-27\\-28.66535\\-188.1369\\-27\\-28.72482\\-187.1369\\-27\\-29.16535\\-186.6369\\-27\\-29.22482\\-185.1369\\-27\\-29.66535\\-184.6369\\-27\\-29.72482\\-181.6369\\-27\\-30.16535\\-181.1369\\-27\\-30.16535\\-177.6369\\-27\\-29.72482\\-177.1369\\-27\\-29.66535\\-174.1369\\-27\\-29.22482\\-173.6369\\-27\\-29.16535\\-172.6369\\-27\\-28.72482\\-172.1369\\-27\\-28.66535\\-171.1369\\-27\\-27.72482\\-169.6369\\-27\\-27.66535\\-169.1369\\-27\\-26.72482\\-168.1369\\-27\\-26.66535\\-167.6369\\-27\\-25.72482\\-166.6369\\-27\\-25.66535\\-166.1369\\-27\\-23.41535\\-163.8869\\-27\\-22.91535\\-163.8274\\-27\\-21.91535\\-162.8869\\-27\\-21.41535\\-162.8274\\-27\\-20.41535\\-161.8869\\-27\\-19.91535\\-161.8869\\-27\\-19.41535\\-161.3869\\-27\\-18.91535\\-161.3869\\-27\\-18.41535\\-160.8869\\-27\\-17.91535\\-160.8869\\-27\\-17.41535\\-160.3869\\-27\\-16.41535\\-160.3869\\-27\\-15.91535\\-159.8869\\-27\\-14.41535\\-159.8274\\-27\\-13.91535\\-159.3869\\-27\\-10.91535\\-159.3274\\-27\\-10.41535\\-158.8869\\-27\\10.08465\\-158.8869\\-27\\10.58465\\-159.3274\\-27\\14.08465\\-159.3869\\-27\\14.58465\\-159.8274\\-27\\16.08465\\-159.8869\\-27\\16.58465\\-160.3274\\-27\\18.08465\\-160.3869\\-27\\18.58465\\-160.8869\\-27\\19.08465\\-160.8869\\-27\\22.08465\\-162.3869\\-27\\23.08465\\-163.3274\\-27\\23.58465\\-163.3869\\-27\\24.39411\\-164.1369\\-27\\27.83465\\-167.6369\\-27\\27.89411\\-168.1369\\-27\\28.83465\\-169.1369\\-27\\28.83465\\-169.6369\\-27\\29.33465\\-170.1369\\-27\\29.33465\\-170.6369\\-27\\29.83465\\-171.1369\\-27\\29.89411\\-172.1369\\-27\\30.33465\\-172.6369\\-27\\30.39411\\-173.6369\\-27\\30.83465\\-174.1369\\-27\\30.89411\\-176.6369\\-27\\31.33465\\-177.1369\\-27\\31.33465\\-181.1369\\-27\\30.89411\\-181.6369\\-27\\30.83465\\-184.6369\\-27\\30.39411\\-185.1369\\-27\\30.33465\\-186.6369\\-27\\29.89411\\-187.1369\\-27\\29.83465\\-188.1369\\-27\\29.39411\\-188.6369\\-27\\29.33465\\-189.6369\\-27\\28.83465\\-190.1369\\-27\\28.83465\\-190.6369\\-27\\28.33465\\-191.1369\\-27\\28.33465\\-191.6369\\-27\\27.83465\\-192.1369\\-27\\27.83465\\-192.6369\\-27\\26.89411\\-193.6369\\-27\\26.83465\\-194.1369\\-27\\25.89411\\-195.1369\\-27\\25.83465\\-195.6369\\-27\\20.08465\\-201.3869\\-27\\19.58465\\-201.3869\\-27\\18.58465\\-202.3869\\-27\\18.08465\\-202.3869\\-27\\17.58465\\-202.8869\\-27\\17.08465\\-202.8869\\-27\\16.58465\\-203.3869\\-27\\16.08465\\-203.3869\\-27\\15.58465\\-203.8869\\-27\\15.08465\\-203.8869\\-27\\14.58465\\-204.3869\\-27\\14.08465\\-204.3869\\-27\\13.58465\\-204.8869\\-27\\12.58465\\-204.8869\\-27\\12.08465\\-205.3869\\-27\\10.58465\\-205.3869\\-27\\10.08465\\-205.8869\\-27\\7.584647\\-205.8869\\-27\\7.084647\\-206.3869\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "120" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.915353\\-205.8869\\-25\\-8.415353\\-205.3869\\-25\\-10.41535\\-205.3869\\-25\\-10.91535\\-204.8869\\-25\\-11.91535\\-204.8869\\-25\\-12.41535\\-204.3869\\-25\\-12.91535\\-204.3869\\-25\\-14.41535\\-203.4464\\-25\\-15.91535\\-202.8869\\-25\\-16.41535\\-202.3869\\-25\\-16.91535\\-202.3869\\-25\\-18.41535\\-200.9464\\-25\\-18.91535\\-200.8869\\-25\\-22.41535\\-197.4464\\-25\\-23.66535\\-196.1369\\-25\\-23.72482\\-195.6369\\-25\\-24.66535\\-194.6369\\-25\\-24.72482\\-194.1369\\-25\\-25.66535\\-193.1369\\-25\\-26.22482\\-191.6369\\-25\\-26.66535\\-191.1369\\-25\\-27.22482\\-189.6369\\-25\\-27.66535\\-189.1369\\-25\\-27.72482\\-188.1369\\-25\\-28.16535\\-187.6369\\-25\\-28.22482\\-186.6369\\-25\\-28.66535\\-186.1369\\-25\\-28.72482\\-185.1369\\-25\\-29.16535\\-184.6369\\-25\\-29.22482\\-181.1369\\-25\\-29.66535\\-180.6369\\-25\\-29.66535\\-178.1369\\-25\\-29.22482\\-177.6369\\-25\\-29.16535\\-174.6369\\-25\\-28.72482\\-174.1369\\-25\\-28.66535\\-172.6369\\-25\\-27.66535\\-170.6369\\-25\\-27.22482\\-170.1369\\-25\\-26.66535\\-168.6369\\-25\\-25.72482\\-167.6369\\-25\\-25.66535\\-167.1369\\-25\\-23.22482\\-164.6369\\-25\\-22.41535\\-163.8869\\-25\\-21.91535\\-163.8274\\-25\\-20.91535\\-162.8869\\-25\\-20.41535\\-162.8274\\-25\\-19.41535\\-161.8869\\-25\\-18.91535\\-161.8869\\-25\\-18.41535\\-161.3869\\-25\\-17.41535\\-161.3274\\-25\\-15.91535\\-160.3869\\-25\\-14.41535\\-160.3274\\-25\\-13.91535\\-159.8869\\-25\\-11.91535\\-159.8274\\-25\\-11.41535\\-159.3869\\-25\\11.58465\\-159.3869\\-25\\12.08465\\-159.8274\\-25\\14.58465\\-159.8869\\-25\\15.08465\\-160.3274\\-25\\16.58465\\-160.3869\\-25\\17.08465\\-160.8869\\-25\\17.58465\\-160.8869\\-25\\18.08465\\-161.3274\\-25\\19.08465\\-161.3869\\-25\\19.58465\\-161.8869\\-25\\20.08465\\-161.8869\\-25\\21.08465\\-162.3869\\-25\\22.08465\\-163.3274\\-25\\22.58465\\-163.3869\\-25\\23.58465\\-164.3274\\-25\\24.08465\\-164.3869\\-25\\26.33465\\-166.6369\\-25\\26.39411\\-167.1369\\-25\\27.83465\\-168.6369\\-25\\29.33465\\-171.6369\\-25\\29.39411\\-172.6369\\-25\\29.83465\\-173.1369\\-25\\29.89411\\-174.1369\\-25\\30.33465\\-174.6369\\-25\\30.39411\\-177.6369\\-25\\30.83465\\-178.1369\\-25\\30.83465\\-181.1369\\-25\\30.39411\\-181.6369\\-25\\30.33465\\-184.6369\\-25\\29.89411\\-185.1369\\-25\\29.83465\\-186.6369\\-25\\29.39411\\-187.1369\\-25\\29.33465\\-188.1369\\-25\\28.83465\\-188.6369\\-25\\28.83465\\-189.1369\\-25\\28.39411\\-189.6369\\-25\\28.33465\\-190.6369\\-25\\27.83465\\-191.1369\\-25\\27.83465\\-191.6369\\-25\\26.89411\\-192.6369\\-25\\26.33465\\-194.1369\\-25\\25.39411\\-195.1369\\-25\\25.33465\\-195.6369\\-25\\23.39411\\-197.6369\\-25\\23.33465\\-198.1369\\-25\\22.08465\\-199.3869\\-25\\21.58465\\-199.4464\\-25\\19.58465\\-201.3869\\-25\\19.08465\\-201.4464\\-25\\18.08465\\-202.3869\\-25\\17.58465\\-202.4464\\-25\\16.58465\\-203.3869\\-25\\16.08465\\-203.3869\\-25\\15.58465\\-203.8869\\-25\\15.08465\\-203.8869\\-25\\14.58465\\-204.3869\\-25\\13.58465\\-204.4464\\-25\\13.08465\\-204.8869\\-25\\12.08465\\-204.8869\\-25\\11.58465\\-205.3869\\-25\\9.584647\\-205.4464\\-25\\9.084647\\-205.8869\\-25\\5.584647\\-205.8869\\-25\\5.084647\\-205.9464\\-25\\-4.915353\\-205.9464\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "103" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.915353\\-205.3869\\-23\\-9.415353\\-204.9464\\-23\\-10.91535\\-204.8869\\-23\\-11.41535\\-204.3869\\-23\\-11.91535\\-204.3869\\-23\\-13.41535\\-203.4464\\-23\\-14.41535\\-203.3869\\-23\\-15.41535\\-202.4464\\-23\\-15.91535\\-202.3869\\-23\\-16.91535\\-201.4464\\-23\\-17.41535\\-201.3869\\-23\\-18.41535\\-200.4464\\-23\\-18.91535\\-200.3869\\-23\\-22.16535\\-197.1369\\-23\\-22.22482\\-196.6369\\-23\\-23.66535\\-195.1369\\-23\\-23.72482\\-194.6369\\-23\\-24.66535\\-193.6369\\-23\\-25.22482\\-192.1369\\-23\\-26.16535\\-191.1369\\-23\\-26.22482\\-190.1369\\-23\\-27.16535\\-188.6369\\-23\\-27.22482\\-187.6369\\-23\\-27.66535\\-187.1369\\-23\\-27.72482\\-186.1369\\-23\\-28.16535\\-185.6369\\-23\\-28.22482\\-183.6369\\-23\\-28.66535\\-183.1369\\-23\\-28.66535\\-175.6369\\-23\\-28.22482\\-175.1369\\-23\\-28.16535\\-173.6369\\-23\\-27.72482\\-173.1369\\-23\\-27.66535\\-172.1369\\-23\\-26.22482\\-169.6369\\-23\\-26.16535\\-169.1369\\-23\\-25.22482\\-168.1369\\-23\\-25.16535\\-167.6369\\-23\\-24.41535\\-166.8274\\-23\\-21.41535\\-163.8869\\-23\\-20.91535\\-163.8274\\-23\\-19.91535\\-162.8869\\-23\\-19.41535\\-162.8274\\-23\\-16.91535\\-161.3869\\-23\\-15.91535\\-161.3274\\-23\\-15.41535\\-160.8869\\-23\\-14.41535\\-160.8274\\-23\\-13.91535\\-160.3869\\-23\\-11.91535\\-160.3274\\-23\\-11.41535\\-159.8869\\-23\\-7.915353\\-159.8274\\-23\\7.584647\\-159.8274\\-23\\8.084647\\-159.8869\\-23\\12.08465\\-159.8869\\-23\\12.58465\\-160.3274\\-23\\14.08465\\-160.3869\\-23\\14.58465\\-160.8274\\-23\\16.08465\\-160.8869\\-23\\16.58465\\-161.3274\\-23\\17.58465\\-161.3869\\-23\\21.58465\\-163.3869\\-23\\23.08465\\-164.8274\\-23\\23.58465\\-164.8869\\-23\\25.83465\\-167.1369\\-23\\25.89411\\-167.6369\\-23\\26.83465\\-168.6369\\-23\\27.39411\\-170.1369\\-23\\27.83465\\-170.6369\\-23\\28.39411\\-172.1369\\-23\\29.33465\\-173.6369\\-23\\29.39411\\-175.6369\\-23\\29.83465\\-176.1369\\-23\\29.83465\\-183.1369\\-23\\29.39411\\-183.6369\\-23\\29.33465\\-185.6369\\-23\\28.89411\\-186.1369\\-23\\28.83465\\-187.1369\\-23\\28.39411\\-187.6369\\-23\\28.33465\\-188.6369\\-23\\27.39411\\-190.1369\\-23\\27.33465\\-191.1369\\-23\\26.83465\\-192.1369\\-23\\25.89411\\-193.1369\\-23\\25.33465\\-194.6369\\-23\\23.89411\\-196.1369\\-23\\23.83465\\-196.6369\\-23\\22.58465\\-197.9464\\-23\\19.58465\\-200.8869\\-23\\19.08465\\-200.9464\\-23\\18.08465\\-201.8869\\-23\\17.58465\\-201.9464\\-23\\16.58465\\-202.8869\\-23\\16.08465\\-202.8869\\-23\\15.58465\\-203.3869\\-23\\15.08465\\-203.3869\\-23\\14.58465\\-203.8869\\-23\\14.08465\\-203.8869\\-23\\13.58465\\-204.3869\\-23\\12.58465\\-204.4464\\-23\\12.08465\\-204.8869\\-23\\10.58465\\-204.9464\\-23\\10.08465\\-205.3869\\-23\\7.084647\\-205.4464\\-23\\-5.915353\\-205.4464\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "99" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.415353\\-204.8869\\-21\\-8.915353\\-204.4464\\-21\\-10.41535\\-204.3869\\-21\\-10.91535\\-203.9464\\-21\\-11.91535\\-203.8869\\-21\\-12.41535\\-203.4464\\-21\\-14.91535\\-202.3869\\-21\\-15.91535\\-201.4464\\-21\\-16.41535\\-201.3869\\-21\\-18.41535\\-199.4464\\-21\\-18.91535\\-199.3869\\-21\\-21.16535\\-197.1369\\-21\\-21.22482\\-196.6369\\-21\\-22.66535\\-195.1369\\-21\\-22.72482\\-194.6369\\-21\\-23.66535\\-193.6369\\-21\\-24.22482\\-192.1369\\-21\\-25.16535\\-191.1369\\-21\\-25.66535\\-190.1369\\-21\\-25.72482\\-189.1369\\-21\\-26.16535\\-188.6369\\-21\\-26.22482\\-187.6369\\-21\\-26.66535\\-187.1369\\-21\\-26.72482\\-186.1369\\-21\\-27.16535\\-185.6369\\-21\\-27.22482\\-184.1369\\-21\\-27.66535\\-183.6369\\-21\\-27.72482\\-181.1369\\-21\\-27.72482\\-177.6369\\-21\\-27.66535\\-175.6369\\-21\\-27.22482\\-175.1369\\-21\\-27.16535\\-173.6369\\-21\\-26.22482\\-172.1369\\-21\\-26.16535\\-171.1369\\-21\\-25.66535\\-170.1369\\-21\\-24.72482\\-169.1369\\-21\\-24.66535\\-168.6369\\-21\\-23.72482\\-167.6369\\-21\\-23.66535\\-167.1369\\-21\\-22.41535\\-165.8869\\-21\\-21.91535\\-165.8274\\-21\\-19.91535\\-163.8869\\-21\\-19.41535\\-163.8274\\-21\\-17.91535\\-162.8869\\-21\\-15.91535\\-161.8869\\-21\\-14.91535\\-161.8274\\-21\\-14.41535\\-161.3869\\-21\\-13.41535\\-161.3274\\-21\\-12.91535\\-160.8869\\-21\\-10.91535\\-160.8274\\-21\\-10.41535\\-160.3869\\-21\\10.58465\\-160.3869\\-21\\11.08465\\-160.8274\\-21\\13.58465\\-160.8869\\-21\\14.08465\\-161.3274\\-21\\15.08465\\-161.3869\\-21\\15.58465\\-161.8274\\-21\\16.58465\\-161.8869\\-21\\17.08465\\-162.3274\\-21\\18.08465\\-162.3869\\-21\\19.58465\\-163.3274\\-21\\20.08465\\-163.3869\\-21\\21.08465\\-164.3274\\-21\\21.58465\\-164.3869\\-21\\25.58465\\-168.3274\\-21\\26.39411\\-170.1369\\-21\\27.83465\\-172.6369\\-21\\27.89411\\-173.6369\\-21\\28.33465\\-174.1369\\-21\\28.39411\\-175.1369\\-21\\28.83465\\-175.6369\\-21\\28.89411\\-177.6369\\-21\\28.89411\\-181.6369\\-21\\28.83465\\-183.6369\\-21\\28.39411\\-184.1369\\-21\\28.33465\\-185.6369\\-21\\27.89411\\-186.1369\\-21\\27.83465\\-187.6369\\-21\\26.89411\\-189.1369\\-21\\26.83465\\-190.1369\\-21\\25.33465\\-193.1369\\-21\\24.39411\\-194.1369\\-21\\24.33465\\-194.6369\\-21\\22.89411\\-196.1369\\-21\\22.83465\\-196.6369\\-21\\22.08465\\-197.4464\\-21\\19.08465\\-200.3869\\-21\\18.58465\\-200.4464\\-21\\17.08465\\-201.8869\\-21\\16.58465\\-201.9464\\-21\\15.08465\\-202.8869\\-21\\13.58465\\-203.4464\\-21\\13.08465\\-203.8869\\-21\\12.08465\\-203.9464\\-21\\11.58465\\-204.3869\\-21\\10.58465\\-204.4464\\-21\\10.08465\\-204.8869\\-21\\8.084647\\-204.9464\\-21\\-6.915353\\-204.9464\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "101" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.915353\\-204.3869\\-19\\-7.415353\\-203.9464\\-19\\-9.415353\\-203.8869\\-19\\-9.915353\\-203.4464\\-19\\-10.91535\\-203.3869\\-19\\-13.41535\\-201.9464\\-19\\-13.91535\\-201.8869\\-19\\-14.91535\\-200.9464\\-19\\-15.41535\\-200.8869\\-19\\-16.91535\\-199.4464\\-19\\-17.41535\\-199.3869\\-19\\-20.16535\\-196.6369\\-19\\-20.22482\\-196.1369\\-19\\-22.16535\\-194.1369\\-19\\-22.22482\\-193.6369\\-19\\-23.16535\\-192.6369\\-19\\-23.22482\\-192.1369\\-19\\-24.66535\\-189.6369\\-19\\-24.72482\\-188.6369\\-19\\-25.16535\\-188.1369\\-19\\-25.22482\\-187.1369\\-19\\-25.66535\\-186.6369\\-19\\-25.72482\\-185.6369\\-19\\-26.16535\\-185.1369\\-19\\-26.22482\\-183.1369\\-19\\-26.66535\\-182.6369\\-19\\-26.66535\\-176.6369\\-19\\-26.22482\\-176.1369\\-19\\-26.16535\\-174.6369\\-19\\-25.72482\\-174.1369\\-19\\-25.66535\\-173.1369\\-19\\-25.22482\\-172.6369\\-19\\-25.16535\\-171.6369\\-19\\-24.66535\\-170.6369\\-19\\-23.72482\\-169.6369\\-19\\-23.41535\\-168.8274\\-19\\-19.72482\\-165.1369\\-19\\-18.91535\\-164.8274\\-19\\-17.91535\\-163.8869\\-19\\-17.41535\\-163.8274\\-19\\-15.91535\\-162.8869\\-19\\-14.91535\\-162.8274\\-19\\-14.41535\\-162.3869\\-19\\-13.41535\\-162.3274\\-19\\-12.91535\\-161.8869\\-19\\-11.41535\\-161.8274\\-19\\-10.91535\\-161.3869\\-19\\-8.915353\\-161.3274\\-19\\10.08465\\-161.3274\\-19\\11.58465\\-161.3869\\-19\\12.08465\\-161.8274\\-19\\13.58465\\-161.8869\\-19\\14.08465\\-162.3274\\-19\\15.08465\\-162.3869\\-19\\15.58465\\-162.8274\\-19\\16.58465\\-162.8869\\-19\\18.08465\\-163.8274\\-19\\18.58465\\-163.8274\\-19\\19.08465\\-164.3274\\-19\\19.58465\\-164.3869\\-19\\20.58465\\-165.3274\\-19\\21.39411\\-165.6369\\-19\\24.08465\\-168.3274\\-19\\24.39411\\-169.1369\\-19\\25.39411\\-170.1369\\-19\\25.39411\\-170.6369\\-19\\25.89411\\-171.1369\\-19\\25.89411\\-171.6369\\-19\\26.39411\\-172.1369\\-19\\26.39411\\-172.6369\\-19\\26.83465\\-173.1369\\-19\\26.89411\\-174.1369\\-19\\27.33465\\-174.6369\\-19\\27.39411\\-176.1369\\-19\\27.83465\\-176.6369\\-19\\27.83465\\-182.6369\\-19\\27.39411\\-183.1369\\-19\\27.33465\\-185.1369\\-19\\26.89411\\-185.6369\\-19\\26.83465\\-187.1369\\-19\\26.39411\\-187.6369\\-19\\26.33465\\-188.6369\\-19\\25.33465\\-190.6369\\-19\\24.89411\\-191.1369\\-19\\24.89411\\-191.6369\\-19\\24.39411\\-192.1369\\-19\\23.83465\\-193.6369\\-19\\22.39411\\-195.1369\\-19\\22.08465\\-195.9464\\-19\\17.89411\\-200.1369\\-19\\17.08465\\-200.4464\\-19\\16.08465\\-201.3869\\-19\\15.58465\\-201.4464\\-19\\14.58465\\-202.3869\\-19\\13.58465\\-202.8869\\-19\\12.58465\\-202.9464\\-19\\12.08465\\-203.3869\\-19\\11.08465\\-203.4464\\-19\\10.58465\\-203.8869\\-19\\8.584647\\-203.9464\\-19\\8.084647\\-204.3869\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "103" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.915353\\-203.3869\\-17\\-6.415353\\-202.9464\\-17\\-8.415353\\-202.8869\\-17\\-8.915353\\-202.4464\\-17\\-9.915353\\-202.3869\\-17\\-10.41535\\-201.9464\\-17\\-11.41535\\-201.8869\\-17\\-13.41535\\-200.8869\\-17\\-14.91535\\-199.4464\\-17\\-15.41535\\-199.4464\\-17\\-19.91535\\-194.9464\\-17\\-20.22482\\-194.1369\\-17\\-21.22482\\-193.1369\\-17\\-21.22482\\-192.6369\\-17\\-22.22482\\-191.6369\\-17\\-22.22482\\-191.1369\\-17\\-22.72482\\-190.6369\\-17\\-22.72482\\-190.1369\\-17\\-23.66535\\-188.6369\\-17\\-23.72482\\-187.6369\\-17\\-24.16535\\-187.1369\\-17\\-24.22482\\-185.6369\\-17\\-24.66535\\-185.1369\\-17\\-24.72482\\-183.6369\\-17\\-25.16535\\-183.1369\\-17\\-25.22482\\-182.1369\\-17\\-25.22482\\-177.6369\\-17\\-25.16535\\-176.6369\\-17\\-24.72482\\-176.1369\\-17\\-24.72482\\-174.6369\\-17\\-24.22482\\-174.1369\\-17\\-24.22482\\-173.1369\\-17\\-23.72482\\-172.6369\\-17\\-23.72482\\-172.1369\\-17\\-23.22482\\-171.6369\\-17\\-23.22482\\-171.1369\\-17\\-22.72482\\-170.6369\\-17\\-22.72482\\-170.1369\\-17\\-17.91535\\-165.3274\\-17\\-17.41535\\-165.3274\\-17\\-16.91535\\-164.8274\\-17\\-16.41535\\-164.8274\\-17\\-15.91535\\-164.3274\\-17\\-15.41535\\-164.3274\\-17\\-14.91535\\-163.8274\\-17\\-14.41535\\-163.8274\\-17\\-13.91535\\-163.3869\\-17\\-12.91535\\-163.3274\\-17\\-12.41535\\-162.8869\\-17\\-10.91535\\-162.8274\\-17\\-10.41535\\-162.3869\\-17\\-8.915353\\-162.3274\\-17\\9.584647\\-162.3274\\-17\\11.08465\\-162.3869\\-17\\11.58465\\-162.8274\\-17\\13.08465\\-162.8869\\-17\\13.58465\\-163.3274\\-17\\14.58465\\-163.3869\\-17\\15.08465\\-163.8274\\-17\\16.08465\\-163.8869\\-17\\17.58465\\-164.8274\\-17\\18.08465\\-164.8869\\-17\\19.08465\\-165.8274\\-17\\19.89411\\-166.1369\\-17\\23.39411\\-169.6369\\-17\\23.39411\\-170.1369\\-17\\24.39411\\-171.1369\\-17\\24.39411\\-171.6369\\-17\\24.89411\\-172.1369\\-17\\24.89411\\-172.6369\\-17\\25.39411\\-173.1369\\-17\\25.39411\\-174.1369\\-17\\25.89411\\-174.6369\\-17\\25.89411\\-176.1369\\-17\\26.33465\\-176.6369\\-17\\26.39411\\-177.6369\\-17\\26.39411\\-182.6369\\-17\\25.89411\\-183.6369\\-17\\25.83465\\-185.6369\\-17\\25.39411\\-186.1369\\-17\\25.39411\\-187.1369\\-17\\24.89411\\-187.6369\\-17\\24.89411\\-188.6369\\-17\\24.39411\\-189.1369\\-17\\24.33465\\-190.1369\\-17\\23.83465\\-191.1369\\-17\\22.89411\\-192.1369\\-17\\22.89411\\-192.6369\\-17\\21.89411\\-193.6369\\-17\\21.89411\\-194.1369\\-17\\15.89411\\-200.1369\\-17\\15.08465\\-200.4464\\-17\\14.58465\\-200.9464\\-17\\14.08465\\-200.9464\\-17\\13.58465\\-201.4464\\-17\\13.08465\\-201.4464\\-17\\12.58465\\-201.9464\\-17\\12.08465\\-201.9464\\-17\\11.58465\\-202.3869\\-17\\10.58465\\-202.4464\\-17\\10.08465\\-202.8869\\-17\\8.084647\\-202.9464\\-17\\7.584647\\-203.3869\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "93" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.915353\\-200.9464\\-15\\-9.915353\\-200.9464\\-15\\-10.41535\\-200.4464\\-15\\-11.41535\\-200.3869\\-15\\-12.41535\\-199.4464\\-15\\-12.91535\\-199.4464\\-15\\-14.41535\\-197.9464\\-15\\-14.91535\\-197.9464\\-15\\-18.22482\\-194.6369\\-15\\-18.22482\\-194.1369\\-15\\-20.22482\\-192.1369\\-15\\-20.22482\\-191.6369\\-15\\-20.72482\\-191.1369\\-15\\-20.72482\\-190.6369\\-15\\-21.22482\\-190.1369\\-15\\-21.22482\\-189.6369\\-15\\-21.72482\\-189.1369\\-15\\-21.72482\\-188.6369\\-15\\-22.22482\\-188.1369\\-15\\-22.22482\\-187.1369\\-15\\-22.72482\\-186.6369\\-15\\-22.72482\\-185.1369\\-15\\-23.22482\\-184.6369\\-15\\-23.22482\\-176.1369\\-15\\-22.72482\\-175.6369\\-15\\-22.72482\\-174.1369\\-15\\-22.22482\\-173.6369\\-15\\-22.22482\\-172.6369\\-15\\-21.22482\\-171.6369\\-15\\-21.22482\\-171.1369\\-15\\-20.72482\\-170.6369\\-15\\-20.72482\\-170.1369\\-15\\-17.41535\\-166.8274\\-15\\-16.91535\\-166.8274\\-15\\-15.91535\\-165.8274\\-15\\-15.41535\\-165.8274\\-15\\-14.91535\\-165.3274\\-15\\-14.41535\\-165.3274\\-15\\-13.91535\\-164.8869\\-15\\-12.91535\\-164.8274\\-15\\-12.41535\\-164.3869\\-15\\-11.41535\\-164.3274\\-15\\-10.91535\\-163.8869\\-15\\-9.415353\\-163.8274\\-15\\-8.915353\\-163.3869\\-15\\-7.915353\\-163.3274\\-15\\8.584647\\-163.3274\\-15\\9.584647\\-163.3869\\-15\\10.08465\\-163.8274\\-15\\11.58465\\-163.8869\\-15\\12.08465\\-164.3274\\-15\\13.08465\\-164.3274\\-15\\13.58465\\-164.8274\\-15\\14.58465\\-164.8274\\-15\\15.08465\\-165.3274\\-15\\16.08465\\-165.3869\\-15\\17.08465\\-165.8869\\-15\\18.58465\\-167.3274\\-15\\19.08465\\-167.3274\\-15\\21.39411\\-169.6369\\-15\\21.39411\\-170.1369\\-15\\22.39411\\-171.1369\\-15\\22.39411\\-171.6369\\-15\\22.89411\\-172.1369\\-15\\22.89411\\-172.6369\\-15\\23.39411\\-173.1369\\-15\\23.39411\\-173.6369\\-15\\23.89411\\-174.1369\\-15\\23.89411\\-175.1369\\-15\\24.39411\\-175.6369\\-15\\24.39411\\-184.6369\\-15\\23.89411\\-185.6369\\-15\\23.83465\\-187.1369\\-15\\23.39411\\-187.6369\\-15\\23.39411\\-188.1369\\-15\\22.89411\\-188.6369\\-15\\22.89411\\-189.6369\\-15\\22.39411\\-190.1369\\-15\\22.39411\\-190.6369\\-15\\21.39411\\-191.6369\\-15\\21.39411\\-192.1369\\-15\\20.39411\\-193.1369\\-15\\20.39411\\-193.6369\\-15\\15.08465\\-198.9464\\-15\\14.58465\\-198.9464\\-15\\13.58465\\-199.9464\\-15\\13.08465\\-199.9464\\-15\\12.58465\\-200.4464\\-15\\12.08465\\-200.4464\\-15\\11.58465\\-200.9464\\-15\\10.58465\\-200.9464\\-15\\9.584647\\-201.4464\\-15\\-7.915353\\-201.4464\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "90" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.915353\\-199.4464\\-13\\-8.415353\\-198.9464\\-13\\-9.415353\\-198.9464\\-13\\-9.915353\\-198.4464\\-13\\-10.41535\\-198.4464\\-13\\-10.91535\\-197.9464\\-13\\-11.41535\\-197.9464\\-13\\-11.91535\\-197.4464\\-13\\-12.41535\\-197.4464\\-13\\-13.91535\\-195.9464\\-13\\-14.41535\\-195.9464\\-13\\-16.22482\\-194.1369\\-13\\-16.22482\\-193.6369\\-13\\-17.72482\\-192.1369\\-13\\-17.72482\\-191.6369\\-13\\-18.72482\\-190.6369\\-13\\-18.72482\\-190.1369\\-13\\-19.22482\\-189.6369\\-13\\-19.22482\\-189.1369\\-13\\-19.72482\\-188.6369\\-13\\-19.72482\\-188.1369\\-13\\-20.22482\\-187.6369\\-13\\-20.22482\\-186.6369\\-13\\-20.72482\\-186.1369\\-13\\-20.72482\\-184.6369\\-13\\-21.22482\\-184.1369\\-13\\-21.22482\\-176.6369\\-13\\-20.72482\\-176.1369\\-13\\-20.72482\\-174.6369\\-13\\-20.22482\\-174.1369\\-13\\-20.22482\\-173.6369\\-13\\-19.72482\\-173.1369\\-13\\-19.72482\\-172.6369\\-13\\-19.22482\\-172.1369\\-13\\-19.22482\\-171.6369\\-13\\-15.41535\\-167.8274\\-13\\-14.91535\\-167.8274\\-13\\-13.91535\\-166.8274\\-13\\-13.41535\\-166.8274\\-13\\-12.91535\\-166.3274\\-13\\-11.91535\\-166.3274\\-13\\-11.41535\\-165.8274\\-13\\-10.41535\\-165.8274\\-13\\-9.915353\\-165.3274\\-13\\-7.915353\\-165.3274\\-13\\-7.415353\\-164.8274\\-13\\8.084647\\-164.8274\\-13\\9.084647\\-165.3274\\-13\\11.08465\\-165.3274\\-13\\11.58465\\-165.8274\\-13\\12.58465\\-165.8274\\-13\\13.08465\\-166.3274\\-13\\13.58465\\-166.3274\\-13\\14.08465\\-166.8274\\-13\\14.58465\\-166.8274\\-13\\15.08465\\-167.3274\\-13\\15.58465\\-167.3274\\-13\\16.08465\\-167.8274\\-13\\16.58465\\-167.8274\\-13\\20.39411\\-171.6369\\-13\\20.39411\\-172.1369\\-13\\20.89411\\-172.6369\\-13\\20.89411\\-173.1369\\-13\\21.39411\\-173.6369\\-13\\21.39411\\-174.1369\\-13\\21.89411\\-174.6369\\-13\\21.89411\\-176.1369\\-13\\22.39411\\-176.6369\\-13\\22.39411\\-184.1369\\-13\\21.89411\\-184.6369\\-13\\21.89411\\-186.1369\\-13\\21.39411\\-186.6369\\-13\\21.39411\\-187.6369\\-13\\20.89411\\-188.1369\\-13\\20.89411\\-189.1369\\-13\\20.39411\\-189.6369\\-13\\20.39411\\-190.1369\\-13\\19.39411\\-191.1369\\-13\\19.39411\\-191.6369\\-13\\18.39411\\-192.6369\\-13\\18.39411\\-193.1369\\-13\\14.58465\\-196.9464\\-13\\14.08465\\-196.9464\\-13\\13.08465\\-197.9464\\-13\\12.58465\\-197.9464\\-13\\12.08465\\-198.4464\\-13\\11.58465\\-198.4464\\-13\\11.08465\\-198.9464\\-13\\10.08465\\-198.9464\\-13\\9.584647\\-199.4464\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.915353\\-196.9464\\-11\\-7.415353\\-196.4464\\-11\\-8.415353\\-196.4464\\-11\\-8.915353\\-195.9464\\-11\\-9.415353\\-195.9464\\-11\\-9.915353\\-195.4464\\-11\\-10.41535\\-195.4464\\-11\\-10.91535\\-194.9464\\-11\\-11.41535\\-194.9464\\-11\\-15.72482\\-190.6369\\-11\\-15.72482\\-190.1369\\-11\\-16.22482\\-189.6369\\-11\\-16.22482\\-189.1369\\-11\\-16.72482\\-188.6369\\-11\\-16.72482\\-188.1369\\-11\\-17.22482\\-187.6369\\-11\\-17.22482\\-187.1369\\-11\\-17.72482\\-186.6369\\-11\\-17.72482\\-186.1369\\-11\\-18.22482\\-185.6369\\-11\\-18.22482\\-184.1369\\-11\\-18.72482\\-183.6369\\-11\\-18.72482\\-177.1369\\-11\\-18.22482\\-176.6369\\-11\\-18.22482\\-175.6369\\-11\\-17.72482\\-175.1369\\-11\\-17.72482\\-174.6369\\-11\\-17.22482\\-174.1369\\-11\\-17.22482\\-173.6369\\-11\\-15.72482\\-172.1369\\-11\\-15.72482\\-171.6369\\-11\\-14.41535\\-170.3274\\-11\\-13.91535\\-170.3274\\-11\\-12.91535\\-169.3274\\-11\\-12.41535\\-169.3274\\-11\\-11.91535\\-168.8274\\-11\\-11.41535\\-168.8274\\-11\\-10.91535\\-168.3274\\-11\\-10.41535\\-168.3274\\-11\\-9.915353\\-167.8274\\-11\\-9.415353\\-167.8274\\-11\\-8.915353\\-167.3274\\-11\\-6.415353\\-167.3274\\-11\\-5.915353\\-166.8274\\-11\\7.084647\\-166.8274\\-11\\7.584647\\-167.3274\\-11\\9.584647\\-167.3274\\-11\\10.08465\\-167.8274\\-11\\11.08465\\-167.8274\\-11\\11.58465\\-168.3274\\-11\\12.08465\\-168.3274\\-11\\12.58465\\-168.8274\\-11\\13.08465\\-168.8274\\-11\\13.58465\\-169.3274\\-11\\14.08465\\-169.3274\\-11\\18.39411\\-173.6369\\-11\\18.39411\\-174.1369\\-11\\18.89411\\-174.6369\\-11\\18.89411\\-175.1369\\-11\\19.39411\\-175.6369\\-11\\19.39411\\-176.6369\\-11\\19.89411\\-177.1369\\-11\\19.89411\\-184.1369\\-11\\19.39411\\-184.6369\\-11\\19.39411\\-185.6369\\-11\\18.89411\\-186.1369\\-11\\18.89411\\-187.1369\\-11\\18.39411\\-187.6369\\-11\\18.39411\\-188.1369\\-11\\17.89411\\-188.6369\\-11\\17.89411\\-189.1369\\-11\\17.39411\\-189.6369\\-11\\17.39411\\-190.1369\\-11\\15.89411\\-191.6369\\-11\\15.89411\\-192.1369\\-11\\14.08465\\-193.9464\\-11\\13.58465\\-193.9464\\-11\\12.08465\\-195.4464\\-11\\11.58465\\-195.4464\\-11\\11.08465\\-195.9464\\-11\\10.58465\\-195.9464\\-11\\10.08465\\-196.4464\\-11\\9.084647\\-196.4464\\-11\\8.584647\\-196.9464\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.915353\\-192.9464\\-9\\-7.415353\\-192.4464\\-9\\-8.415353\\-192.4464\\-9\\-9.415353\\-191.4464\\-9\\-9.915353\\-191.4464\\-9\\-12.72482\\-188.6369\\-9\\-12.72482\\-188.1369\\-9\\-13.72482\\-187.1369\\-9\\-13.72482\\-186.6369\\-9\\-14.22482\\-186.1369\\-9\\-14.22482\\-185.6369\\-9\\-14.72482\\-185.1369\\-9\\-14.72482\\-183.6369\\-9\\-15.22482\\-183.1369\\-9\\-15.22482\\-178.1369\\-9\\-14.72482\\-177.6369\\-9\\-14.72482\\-176.6369\\-9\\-14.22482\\-176.1369\\-9\\-14.22482\\-175.6369\\-9\\-13.72482\\-175.1369\\-9\\-13.72482\\-174.6369\\-9\\-10.91535\\-171.8274\\-9\\-10.41535\\-171.8274\\-9\\-9.915353\\-171.3274\\-9\\-9.415353\\-171.3274\\-9\\-8.915353\\-170.8274\\-9\\-7.915353\\-170.8274\\-9\\-7.415353\\-170.3274\\-9\\-5.415353\\-170.3274\\-9\\-4.915353\\-169.8274\\-9\\6.084647\\-169.8274\\-9\\6.584647\\-170.3274\\-9\\8.584647\\-170.3274\\-9\\9.084647\\-170.8274\\-9\\10.08465\\-170.8274\\-9\\10.58465\\-171.3274\\-9\\11.08465\\-171.3274\\-9\\11.58465\\-171.8274\\-9\\12.08465\\-171.8274\\-9\\14.89411\\-174.6369\\-9\\14.89411\\-175.1369\\-9\\15.39411\\-175.6369\\-9\\15.39411\\-176.1369\\-9\\15.89411\\-176.6369\\-9\\15.89411\\-177.6369\\-9\\16.39411\\-178.1369\\-9\\16.39411\\-183.6369\\-9\\15.89411\\-184.1369\\-9\\15.89411\\-185.1369\\-9\\15.39411\\-185.6369\\-9\\15.39411\\-186.1369\\-9\\14.89411\\-186.6369\\-9\\14.89411\\-187.1369\\-9\\14.39411\\-187.6369\\-9\\14.39411\\-188.1369\\-9\\10.58465\\-191.9464\\-9\\10.08465\\-191.9464\\-9\\9.584647\\-192.4464\\-9\\9.084647\\-192.4464\\-9\\8.584647\\-192.9464\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.415353\\-185.9464\\-7\\-5.915353\\-185.4464\\-7\\-6.415353\\-185.4464\\-7\\-7.724819\\-184.1369\\-7\\-7.724819\\-183.6369\\-7\\-8.224819\\-183.1369\\-7\\-8.224819\\-182.6369\\-7\\-8.724819\\-182.1369\\-7\\-8.724819\\-179.1369\\-7\\-8.224819\\-178.6369\\-7\\-8.224819\\-178.1369\\-7\\-6.415353\\-176.3274\\-7\\-5.415353\\-176.3274\\-7\\-4.915353\\-175.8274\\-7\\6.084647\\-175.8274\\-7\\6.584647\\-176.3274\\-7\\7.584647\\-176.3274\\-7\\9.394114\\-178.1369\\-7\\9.394114\\-178.6369\\-7\\9.894114\\-179.1369\\-7\\9.894114\\-182.6369\\-7\\9.394114\\-183.1369\\-7\\9.394114\\-183.6369\\-7\\7.584647\\-185.4464\\-7\\7.084647\\-185.4464\\-7\\6.584647\\-185.9464\\-7" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "4" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "255\\255\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "58" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "2.118783\\-200.688\\-7\\3.688119\\-200.4978\\-7\\5.064636\\-200.0758\\-7\\6.460264\\-200.0264\\-7\\7.564238\\-199.5488\\-7\\8.963009\\-199.3706\\-7\\9.836956\\-198.8362\\-7\\10.55657\\-198.8968\\-7\\11.28211\\-198.4411\\-7\\12.275\\-198.3316\\-7\\14.16791\\-197.7549\\-7\\15.50114\\-197.832\\-7\\16.29665\\-197.6216\\-7\\17.00278\\-197.7832\\-7\\17.45366\\-198.2698\\-7\\18.59054\\-199.0016\\-7\\19.21973\\-200.6346\\-7\\19.49258\\-202.3157\\-7\\18.92627\\-204.8141\\-7\\18.22073\\-206.092\\-7\\17.54166\\-207.0491\\-7\\15.64322\\-209.0824\\-7\\12.91953\\-210.7655\\-7\\10.07212\\-212.0289\\-7\\8.292524\\-212.4787\\-7\\5.70048\\-212.8561\\-7\\4.445841\\-213.1447\\-7\\3.398423\\-213.1118\\-7\\1.34725\\-213.295\\-7\\-0.371215\\-213.2948\\-7\\-2.35529\\-213.1097\\-7\\-3.460436\\-213.138\\-7\\-4.730655\\-212.8487\\-7\\-7.296126\\-212.4844\\-7\\-9.096278\\-212.0284\\-7\\-11.94889\\-210.7569\\-7\\-14.66847\\-209.0861\\-7\\-16.56054\\-207.0503\\-7\\-17.24433\\-206.0919\\-7\\-17.94979\\-204.8142\\-7\\-18.51423\\-202.3195\\-7\\-18.27359\\-200.6581\\-7\\-17.40776\\-198.7672\\-7\\-16.49381\\-198.2694\\-7\\-16.00928\\-197.7922\\-7\\-15.31869\\-197.6215\\-7\\-14.52699\\-197.8338\\-7\\-13.31736\\-197.6794\\-7\\-12.22724\\-198.1126\\-7\\-10.58196\\-198.3851\\-7\\-9.658433\\-198.8586\\-7\\-8.861181\\-198.8359\\-7\\-7.989448\\-199.3696\\-7\\-6.621591\\-199.5406\\-7\\-5.501807\\-200.0241\\-7\\-4.076972\\-200.0788\\-7\\-2.811528\\-200.4866\\-7\\-1.550765\\-200.6176\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "2.638206\\-193.8351\\-5\\4.27789\\-193.5854\\-5\\9.087528\\-191.5363\\-5\\9.707728\\-190.9396\\-5\\10.19323\\-190.836\\-5\\12.97652\\-189.1775\\-5\\14.22778\\-188.5783\\-5\\16.42825\\-188.1113\\-5\\17.89869\\-188.0158\\-5\\20.06059\\-188.6115\\-5\\21.94577\\-189.9909\\-5\\23.19127\\-191.2707\\-5\\24.221\\-193.0529\\-5\\24.8614\\-194.5046\\-5\\25.38822\\-196.4797\\-5\\25.65618\\-199.9844\\-5\\25.18298\\-203.4908\\-5\\24.5757\\-205.3404\\-5\\23.86917\\-206.8904\\-5\\22.57464\\-209.1143\\-5\\20.08956\\-211.9573\\-5\\18.50864\\-213.2627\\-5\\16.59299\\-214.5708\\-5\\14.02119\\-215.888\\-5\\12.57855\\-216.4844\\-5\\9.800355\\-217.3315\\-5\\6.525309\\-217.9846\\-5\\2.20525\\-218.3889\\-5\\0.6021065\\-218.4633\\-5\\-1.300326\\-218.398\\-5\\-5.548341\\-217.9847\\-5\\-8.823057\\-217.3318\\-5\\-11.60107\\-216.4846\\-5\\-13.04884\\-215.8828\\-5\\-15.23056\\-214.7541\\-5\\-17.54913\\-213.2539\\-5\\-19.11278\\-211.9575\\-5\\-21.59816\\-209.1141\\-5\\-22.92257\\-206.836\\-5\\-23.62809\\-205.2501\\-5\\-24.20657\\-203.4767\\-5\\-24.67878\\-199.9896\\-5\\-24.41169\\-196.4795\\-5\\-23.8864\\-194.508\\-5\\-23.25277\\-193.0608\\-5\\-22.21377\\-191.2699\\-5\\-20.96932\\-189.9909\\-5\\-19.08403\\-188.6115\\-5\\-16.92213\\-188.0158\\-5\\-14.26493\\-188.3163\\-5\\-12.09743\\-189.1377\\-5\\-11.23366\\-189.693\\-5\\-8.731774\\-190.9395\\-5\\-8.110901\\-191.5363\\-5\\-3.304572\\-193.5722\\-5\\-0.8416062\\-193.8936\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.864589\\-221.8821\\-3\\-4.262839\\-221.705\\-3\\-6.966069\\-221.2908\\-3\\-10.64893\\-220.3757\\-3\\-14.25606\\-219.1237\\-3\\-17.98728\\-217.0966\\-3\\-19.8985\\-215.6573\\-3\\-21.56731\\-214.2381\\-3\\-23.44175\\-212.1059\\-3\\-24.59382\\-210.5732\\-3\\-26.01821\\-207.9047\\-3\\-26.77742\\-206.1993\\-3\\-27.35131\\-204.3581\\-3\\-27.84531\\-201.8294\\-3\\-27.98084\\-200.0783\\-3\\-28.03899\\-197.6873\\-3\\-27.82421\\-195.3723\\-3\\-27.39288\\-193.1793\\-3\\-26.38541\\-190.2343\\-3\\-25.9979\\-189.3203\\-3\\-24.23606\\-186.2188\\-3\\-23.11403\\-184.7514\\-3\\-22.14576\\-183.6978\\-3\\-20.29444\\-181.9018\\-3\\-17.92085\\-180.2553\\-3\\-14.91576\\-178.7754\\-3\\-12.09181\\-178.0114\\-3\\-10.41864\\-177.6524\\-3\\-8.380567\\-177.7356\\-3\\-7.821159\\-177.5995\\-3\\-6.256923\\-177.9025\\-3\\-5.568405\\-177.6836\\-3\\-3.728723\\-178.3027\\-3\\-2.461752\\-178.4334\\-3\\-1.873984\\-178.2949\\-3\\-1.278085\\-178.617\\-3\\-0.6892607\\-178.5616\\-3\\0.915863\\-178.7556\\-3\\1.413679\\-178.5143\\-3\\2.260312\\-178.6259\\-3\\2.849585\\-178.2998\\-3\\3.442821\\-178.436\\-3\\5.749365\\-178.0533\\-3\\6.584952\\-177.6623\\-3\\7.209674\\-177.8984\\-3\\8.797851\\-177.5999\\-3\\9.35713\\-177.7356\\-3\\11.3952\\-177.6524\\-3\\13.06837\\-178.0114\\-3\\15.89232\\-178.7754\\-3\\16.71202\\-179.1062\\-3\\19.12932\\-180.402\\-3\\20.75851\\-181.5704\\-3\\22.18242\\-182.7463\\-3\\24.09221\\-184.7533\\-3\\25.21266\\-186.2189\\-3\\26.97704\\-189.3233\\-3\\27.36121\\-190.2331\\-3\\28.37042\\-193.1835\\-3\\28.76588\\-195.0818\\-3\\29.0182\\-197.6763\\-3\\28.96166\\-200.9124\\-3\\28.38528\\-204.1257\\-3\\27.75371\\-206.1993\\-3\\26.99477\\-207.9047\\-3\\25.57038\\-210.5732\\-3\\24.41832\\-212.1058\\-3\\22.54387\\-214.2381\\-3\\19.49674\\-216.7331\\-3\\17.89876\\-217.7106\\-3\\15.2332\\-219.1235\\-3\\11.62549\\-220.3757\\-3\\7.942632\\-221.2908\\-3\\5.239401\\-221.705\\-3\\2.843655\\-221.8819\\-3\\0.4587926\\-221.9557\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "69" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.505893\\-224.659\\-1\\-3.872592\\-224.5329\\-1\\-6.075192\\-224.2514\\-1\\-10.10377\\-223.4046\\-1\\-12.09372\\-222.8099\\-1\\-15.40204\\-221.5276\\-1\\-17.30988\\-220.5775\\-1\\-19.52165\\-219.2113\\-1\\-21.64827\\-217.6772\\-1\\-24.03179\\-215.3864\\-1\\-25.01208\\-214.2589\\-1\\-27.05294\\-211.3666\\-1\\-28.61117\\-208.2582\\-1\\-29.29426\\-206.4117\\-1\\-29.91546\\-204.106\\-1\\-30.2992\\-201.8872\\-1\\-30.53119\\-198.9491\\-1\\-30.3863\\-195.7051\\-1\\-29.95169\\-192.8636\\-1\\-29.52408\\-191.1825\\-1\\-28.35457\\-187.8148\\-1\\-27.50398\\-185.9839\\-1\\-26.57295\\-184.29\\-1\\-25.47632\\-182.5485\\-1\\-24.10098\\-180.6762\\-1\\-22.8449\\-179.206\\-1\\-21.20982\\-177.5157\\-1\\-18.44579\\-175.1434\\-1\\-15.26518\\-172.9597\\-1\\-13.75686\\-172.1249\\-1\\-10.84213\\-170.7385\\-1\\-7.96404\\-169.6793\\-1\\-5.895551\\-169.0958\\-1\\-2.046023\\-168.4893\\-1\\-0.101065\\-168.4183\\-1\\2.370644\\-168.4714\\-1\\4.407464\\-168.665\\-1\\6.877327\\-169.0973\\-1\\8.940471\\-169.6793\\-1\\11.81951\\-170.7388\\-1\\14.7207\\-172.1159\\-1\\17.70461\\-173.9061\\-1\\20.25886\\-175.7929\\-1\\22.28488\\-177.589\\-1\\24.25022\\-179.6929\\-1\\26.49762\\-182.5952\\-1\\27.66922\\-184.4665\\-1\\29.33005\\-187.8129\\-1\\30.50064\\-191.1825\\-1\\30.92746\\-192.861\\-1\\31.27184\\-194.9045\\-1\\31.47488\\-197.6931\\-1\\31.41817\\-200.4838\\-1\\31.26016\\-201.9663\\-1\\30.82529\\-204.4017\\-1\\30.27291\\-206.4079\\-1\\29.58772\\-208.2582\\-1\\28.02929\\-211.3663\\-1\\25.97207\\-214.2774\\-1\\24.95238\\-215.4348\\-1\\22.62433\\-217.678\\-1\\20.50612\\-219.2063\\-1\\18.28639\\-220.5776\\-1\\16.3786\\-221.5276\\-1\\13.07029\\-222.8099\\-1\\11.08033\\-223.4046\\-1\\7.05121\\-224.2515\\-1\\4.857371\\-224.5319\\-1\\0.9292888\\-224.704\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "74" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.230072\\-226.988\\1\\1.617026\\-227.0116\\1\\5.893857\\-226.7186\\1\\9.422059\\-226.1311\\1\\12.82796\\-225.243\\1\\16.03768\\-224.1147\\1\\19.40093\\-222.4731\\1\\21.62452\\-221.1039\\1\\22.9313\\-220.1671\\1\\25.06567\\-218.3331\\1\\27.12967\\-216.1705\\1\\28.78583\\-213.9369\\1\\29.86313\\-212.229\\1\\30.97235\\-210.1181\\1\\32.10492\\-207.151\\1\\32.72127\\-205.0031\\1\\33.13824\\-202.708\\1\\33.44806\\-199.6716\\1\\33.46246\\-198.0082\\1\\33.29013\\-195.2014\\1\\33.01165\\-193.3288\\1\\32.51138\\-190.9886\\1\\31.80636\\-188.4967\\1\\30.6123\\-185.512\\1\\29.06974\\-182.4883\\1\\27.56436\\-180.0939\\1\\26.32525\\-178.4071\\1\\24.40985\\-176.106\\1\\22.75132\\-174.4283\\1\\21.24067\\-173.0551\\1\\19.72177\\-171.8311\\1\\17.56783\\-170.317\\1\\15.52231\\-169.1041\\1\\12.61545\\-167.7029\\1\\10.1143\\-166.806\\1\\7.618216\\-166.143\\1\\5.625355\\-165.7783\\1\\1.528728\\-165.3489\\1\\-0.7995239\\-165.3682\\1\\-4.667117\\-165.7833\\1\\-6.629262\\-166.138\\1\\-9.138115\\-166.8062\\1\\-11.63889\\-167.7029\\1\\-14.54575\\-169.1041\\1\\-16.59123\\-170.317\\1\\-18.74592\\-171.832\\1\\-20.28835\\-173.0799\\1\\-22.52108\\-175.159\\1\\-24.25586\\-177.0566\\1\\-25.41307\\-178.4684\\1\\-26.59302\\-180.0987\\1\\-28.58984\\-183.391\\1\\-29.63597\\-185.512\\1\\-30.8298\\-188.4967\\1\\-31.53481\\-190.9886\\1\\-32.0358\\-193.3289\\1\\-32.30801\\-195.136\\1\\-32.47206\\-199.6432\\1\\-32.34568\\-201.3506\\1\\-31.75202\\-204.9769\\1\\-31.12837\\-207.1509\\1\\-29.99633\\-210.1172\\1\\-29.05882\\-211.905\\1\\-27.81673\\-213.929\\1\\-25.93152\\-216.4034\\1\\-24.09339\\-218.3303\\1\\-21.59067\\-220.4518\\1\\-19.56627\\-221.7962\\1\\-17.17303\\-223.1198\\1\\-15.05823\\-224.1127\\1\\-12.72814\\-224.9722\\1\\-10.90476\\-225.5172\\1\\-8.454619\\-226.1279\\1\\-4.813118\\-226.7221\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.3135906\\-228.9314\\3\\1.290305\\-228.9303\\3\\4.793899\\-228.7583\\3\\7.307244\\-228.4516\\3\\10.98056\\-227.7123\\3\\13.59094\\-226.9913\\3\\15.95373\\-226.1736\\3\\19.26485\\-224.678\\3\\20.92691\\-223.7265\\3\\22.81876\\-222.4889\\3\\24.3543\\-221.3317\\3\\26.22543\\-219.7086\\3\\27.37218\\-218.5479\\3\\29.24239\\-216.3239\\3\\30.38726\\-214.6923\\3\\31.41593\\-213.0145\\3\\32.74849\\-210.2846\\3\\33.9155\\-206.9134\\3\\34.60811\\-204.0022\\3\\35.0148\\-200.3019\\3\\35.01503\\-196.413\\3\\34.80304\\-194.4035\\3\\34.45737\\-192.2376\\3\\34.00693\\-190.1625\\3\\33.21647\\-187.5761\\3\\32.32428\\-185.2765\\3\\31.40952\\-183.2593\\3\\30.05162\\-180.7046\\3\\28.06799\\-177.6877\\3\\25.71058\\-174.7955\\3\\23.80749\\-172.8204\\3\\22.07121\\-171.2518\\3\\19.2796\\-169.1515\\3\\17.22806\\-167.8832\\3\\15.05452\\-166.7691\\3\\11.73059\\-165.5063\\3\\8.736152\\-164.6779\\3\\5.936163\\-164.1722\\3\\2.654293\\-163.8878\\3\\-1.301358\\-163.8856\\3\\-4.962992\\-164.1727\\3\\-7.758486\\-164.6777\\3\\-9.65784\\-165.1808\\3\\-12.71687\\-166.1844\\3\\-14.08671\\-166.7715\\3\\-16.24262\\-167.8787\\3\\-18.67115\\-169.4019\\3\\-20.83492\\-171.025\\3\\-22.69699\\-172.6715\\3\\-24.68094\\-174.731\\3\\-27.11776\\-177.7423\\3\\-29.0754\\-180.7054\\3\\-30.43284\\-183.2591\\3\\-31.34771\\-185.2765\\3\\-32.23991\\-187.5761\\3\\-33.03045\\-190.1627\\3\\-33.55018\\-192.5997\\3\\-34.03828\\-196.4082\\3\\-34.04025\\-200.2078\\3\\-33.79142\\-202.9676\\3\\-33.52932\\-204.4788\\3\\-32.93048\\-206.9364\\3\\-31.77195\\-210.2846\\3\\-30.43933\\-213.0145\\3\\-29.41279\\-214.6913\\3\\-28.21924\\-216.381\\3\\-25.89614\\-219.083\\3\\-23.44763\\-221.2687\\3\\-21.03433\\-223.0565\\3\\-18.62058\\-224.47\\3\\-17.00047\\-225.3025\\3\\-14.29901\\-226.427\\3\\-12.64971\\-226.9758\\3\\-10.00135\\-227.7132\\3\\-6.330335\\-228.4518\\3\\-3.812125\\-228.7596\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "79" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.252691\\-230.4623\\5\\-6.212992\\-230.1293\\5\\-9.146994\\-229.5928\\5\\-12.73069\\-228.6603\\5\\-16.33685\\-227.3569\\5\\-18.70528\\-226.2385\\5\\-21.84462\\-224.3979\\5\\-23.28526\\-223.3784\\5\\-25.33088\\-221.7136\\5\\-26.99786\\-220.1182\\5\\-28.97999\\-217.8698\\5\\-30.75214\\-215.3696\\5\\-31.29977\\-214.4659\\5\\-32.71239\\-211.6962\\5\\-33.4382\\-209.9144\\5\\-34.49167\\-206.6018\\5\\-34.82876\\-205.0423\\5\\-35.27651\\-202.1661\\5\\-35.44458\\-199.6658\\5\\-35.37939\\-196.1625\\5\\-34.99789\\-192.9438\\5\\-34.52095\\-190.5999\\5\\-33.75994\\-187.8714\\5\\-32.98402\\-185.629\\5\\-32.15805\\-183.6363\\5\\-31.00288\\-181.3047\\5\\-29.33825\\-178.5006\\5\\-26.90814\\-175.1217\\5\\-24.91504\\-172.884\\5\\-22.77211\\-170.8369\\5\\-20.66631\\-169.1362\\5\\-18.51003\\-167.6791\\5\\-17.01823\\-166.8163\\5\\-15.51472\\-166.0764\\5\\-13.59794\\-165.2959\\5\\-12.13263\\-164.8016\\5\\-9.508026\\-164.0994\\5\\-7.533429\\-163.7547\\5\\-4.755338\\-163.3887\\5\\0.6029193\\-163.1679\\5\\5.724001\\-163.3857\\5\\9.877586\\-163.9805\\5\\11.77233\\-164.418\\5\\14.50093\\-165.2692\\5\\16.44098\\-166.0604\\5\\19.38646\\-167.6241\\5\\21.63471\\-169.1293\\5\\23.75167\\-170.84\\5\\26.22358\\-173.2368\\5\\27.8851\\-175.1225\\5\\29.46671\\-177.2436\\5\\31.12628\\-179.8239\\5\\31.9417\\-181.2482\\5\\33.13614\\-183.6406\\5\\33.96057\\-185.6289\\5\\34.7365\\-187.8714\\5\\35.49983\\-190.6069\\5\\35.93556\\-192.8452\\5\\36.35567\\-196.16\\5\\36.42181\\-199.6032\\5\\36.25412\\-202.1605\\5\\35.66015\\-205.7325\\5\\35.12953\\-207.7594\\5\\34.41796\\-209.9017\\5\\33.69498\\-211.6962\\5\\32.27636\\-214.4658\\5\\31.7289\\-215.3694\\5\\29.95662\\-217.8699\\5\\28.03683\\-220.076\\5\\26.30546\\-221.7157\\5\\24.27489\\-223.3727\\5\\21.71678\\-225.0882\\5\\19.68466\\-226.2368\\5\\17.31322\\-227.357\\5\\13.70726\\-228.6603\\5\\10.12356\\-229.5928\\5\\7.206679\\-230.1255\\5\\4.211326\\-230.461\\5\\0.4916681\\-230.5871\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "79" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.113355\\-231.9815\\7\\1.78387\\-231.9958\\7\\5.839989\\-231.6794\\7\\7.611424\\-231.4675\\7\\9.987147\\-231.0579\\7\\12.91806\\-230.3536\\7\\15.50904\\-229.5385\\7\\17.72618\\-228.6717\\7\\20.56344\\-227.3343\\7\\23.81407\\-225.377\\7\\26.31833\\-223.4626\\7\\27.75669\\-222.2016\\7\\29.74725\\-220.1285\\7\\31.10832\\-218.4566\\7\\32.34916\\-216.7125\\7\\33.77028\\-214.3543\\7\\34.78714\\-212.3056\\7\\35.90201\\-209.4008\\7\\36.51296\\-207.3902\\7\\36.98742\\-205.3055\\7\\37.47757\\-201.6117\\7\\37.56797\\-197.5989\\7\\37.3562\\-194.4153\\7\\36.79647\\-191.0921\\7\\36.2218\\-188.8031\\7\\35.06652\\-185.2823\\7\\33.42091\\-181.5529\\7\\31.93871\\-178.8714\\7\\29.70436\\-175.5734\\7\\28.22831\\-173.7659\\7\\26.38695\\-171.7636\\7\\24.68287\\-170.174\\7\\22.94795\\-168.7995\\7\\21.15678\\-167.5496\\7\\18.40044\\-166.0376\\7\\15.17508\\-164.7411\\7\\12.34891\\-163.9888\\7\\9.686124\\-163.5579\\7\\6.619918\\-163.267\\7\\2.036601\\-163.1488\\7\\-3.364203\\-163.1777\\7\\-5.648504\\-163.267\\7\\-10.16484\\-163.7568\\7\\-12.99839\\-164.3995\\7\\-14.20547\\-164.7418\\7\\-16.97895\\-165.8251\\7\\-18.19831\\-166.4128\\7\\-20.17971\\-167.5494\\7\\-21.97139\\-168.7995\\7\\-23.70631\\-170.174\\7\\-25.41785\\-171.7746\\7\\-27.25049\\-173.7628\\7\\-28.72779\\-175.5734\\7\\-30.96593\\-178.8796\\7\\-32.72195\\-182.1051\\7\\-34.08269\\-185.2576\\7\\-35.24524\\-188.8031\\7\\-35.82001\\-191.0926\\7\\-36.37973\\-194.4156\\7\\-36.62768\\-198.1999\\7\\-36.50275\\-201.6698\\7\\-36.01051\\-205.3088\\7\\-35.53661\\-207.3902\\7\\-34.92545\\-209.401\\7\\-33.70901\\-212.5259\\7\\-32.53335\\-214.8377\\7\\-30.92758\\-217.3744\\7\\-28.79788\\-220.1051\\7\\-26.66315\\-222.302\\7\\-25.34836\\-223.4622\\7\\-22.82267\\-225.3763\\7\\-20.65603\\-226.7433\\7\\-18.55426\\-227.8498\\7\\-16.74965\\-228.6716\\7\\-14.53247\\-229.5385\\7\\-11.94139\\-230.3536\\7\\-9.010533\\-231.0579\\7\\-6.634991\\-231.4674\\7\\-4.863411\\-231.6793\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "83" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.4003342\\-233.2461\\9\\4.02504\\-233.0949\\9\\6.533574\\-232.8296\\9\\9.712001\\-232.3584\\9\\11.8706\\-231.8688\\9\\15.03886\\-230.9707\\9\\18.33954\\-229.7097\\9\\20.95532\\-228.458\\9\\24.30868\\-226.4386\\9\\26.23126\\-225.0348\\9\\28.40893\\-223.133\\9\\29.68939\\-221.8814\\9\\31.66967\\-219.5752\\9\\33.24977\\-217.3623\\9\\34.16417\\-215.841\\9\\35.29821\\-213.738\\9\\36.0014\\-212.1932\\9\\37.10344\\-209.0577\\9\\37.45719\\-207.8224\\9\\38.05902\\-205.1721\\9\\38.5475\\-201.1462\\9\\38.59718\\-197.9972\\9\\38.44669\\-195.317\\9\\38.12399\\-192.9546\\9\\37.68431\\-190.6108\\9\\36.4941\\-186.3636\\9\\35.53729\\-183.8625\\9\\34.36541\\-181.2518\\9\\32.9718\\-178.722\\9\\32.24244\\-177.5356\\9\\30.71769\\-175.3617\\9\\28.87608\\-173.0675\\9\\26.74139\\-170.8697\\9\\25.37294\\-169.6574\\9\\23.92429\\-168.5262\\9\\21.80225\\-167.1184\\9\\19.61738\\-165.9521\\9\\18.3121\\-165.3829\\9\\16.36147\\-164.7129\\9\\14.34965\\-164.2001\\9\\11.1674\\-163.7356\\9\\7.199081\\-163.5224\\9\\1.372858\\-163.5936\\9\\-4.748299\\-163.5675\\9\\-6.222456\\-163.5224\\9\\-10.19083\\-163.7356\\9\\-13.36962\\-164.1991\\9\\-15.38274\\-164.7125\\9\\-17.3416\\-165.3844\\9\\-19.30886\\-166.2719\\9\\-20.82355\\-167.1171\\9\\-22.94773\\-168.5262\\9\\-24.39638\\-169.6574\\9\\-25.76461\\-170.8695\\9\\-27.89928\\-173.0672\\9\\-29.74113\\-175.3617\\9\\-31.26588\\-177.5356\\9\\-33.38591\\-181.2446\\9\\-34.55597\\-183.8606\\9\\-35.51778\\-186.3646\\9\\-36.7073\\-190.5943\\9\\-37.14925\\-192.93\\9\\-37.47027\\-195.3165\\9\\-37.62305\\-197.996\\9\\-37.55172\\-201.3841\\9\\-37.08222\\-205.1741\\9\\-36.47828\\-207.8301\\9\\-36.1259\\-209.0615\\9\\-35.02481\\-212.1933\\9\\-33.73475\\-214.8871\\9\\-32.56988\\-216.9276\\9\\-30.68651\\-219.584\\9\\-28.7129\\-221.8813\\9\\-26.32982\\-224.1456\\9\\-24.95306\\-225.2711\\9\\-22.80794\\-226.7836\\9\\-20.11026\\-228.3863\\9\\-17.95666\\-229.4615\\9\\-13.97597\\-231.0012\\9\\-10.92568\\-231.8589\\9\\-8.734808\\-232.3585\\9\\-5.55708\\-232.8296\\9\\-3.048317\\-233.0951\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "86" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.347774\\-234.2774\\11\\2.076297\\-234.2512\\11\\5.315486\\-234.076\\11\\8.891184\\-233.5704\\11\\12.76923\\-232.7454\\11\\15.01874\\-232.092\\11\\18.17616\\-230.8951\\11\\19.70145\\-230.2389\\11\\22.5713\\-228.7495\\11\\24.2843\\-227.6906\\11\\26.40683\\-226.1659\\11\\27.72368\\-225.0999\\11\\29.91719\\-223.0515\\11\\31.85921\\-220.8909\\11\\32.75888\\-219.7371\\11\\34.06079\\-217.8211\\11\\35.67154\\-215.0535\\11\\36.85835\\-212.443\\11\\38.08195\\-208.9933\\11\\38.54485\\-207.0529\\11\\39.00657\\-204.5316\\11\\39.21459\\-202.9322\\11\\39.45261\\-199.6305\\11\\39.32095\\-195.9739\\11\\38.9065\\-192.5048\\11\\38.4711\\-190.3198\\11\\37.71616\\-187.4484\\11\\37.20184\\-185.9004\\11\\35.70038\\-182.1832\\11\\34.86518\\-180.4969\\11\\33.22965\\-177.6419\\11\\31.78922\\-175.481\\11\\29.46731\\-172.6306\\11\\27.50459\\-170.6222\\11\\25.57172\\-168.9939\\11\\23.93461\\-167.8008\\11\\22.10848\\-166.709\\11\\18.96548\\-165.3339\\11\\17.47947\\-164.8615\\11\\15.0394\\-164.3373\\11\\12.10361\\-164.052\\11\\9.684925\\-164.0091\\11\\5.773968\\-164.1576\\11\\3.828449\\-164.3023\\11\\-2.873777\\-164.3022\\11\\-4.768305\\-164.1588\\11\\-8.708386\\-164.0091\\11\\-11.12704\\-164.052\\11\\-14.12973\\-164.3563\\11\\-16.50329\\-164.8615\\11\\-17.98896\\-165.3339\\11\\-21.13229\\-166.7092\\11\\-22.95804\\-167.8008\\11\\-24.59516\\-168.9939\\11\\-26.52803\\-170.6222\\11\\-28.49075\\-172.6306\\11\\-30.81266\\-175.481\\11\\-32.25309\\-177.6419\\11\\-33.88862\\-180.4969\\11\\-34.72403\\-182.1839\\11\\-36.22878\\-185.9097\\11\\-36.74054\\-187.4451\\11\\-37.49325\\-190.3164\\11\\-37.92682\\-192.4971\\11\\-38.34434\\-195.973\\11\\-38.47602\\-199.6328\\11\\-38.2383\\-202.9321\\11\\-38.03004\\-204.5313\\11\\-37.56659\\-207.1261\\11\\-37.10224\\-209.0008\\11\\-35.87864\\-212.4493\\11\\-34.08095\\-216.1853\\11\\-33.06963\\-217.8515\\11\\-31.78241\\-219.737\\11\\-30.88265\\-220.8909\\11\\-28.94056\\-223.0516\\11\\-27.72459\\-224.2173\\11\\-25.42918\\-226.166\\11\\-23.30767\\-227.6906\\11\\-21.59467\\-228.7496\\11\\-18.74289\\-230.2425\\11\\-15.78055\\-231.4655\\11\\-14.02753\\-232.0893\\11\\-11.78584\\-232.7469\\11\\-7.914277\\-233.5708\\11\\-4.331664\\-234.077\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "85" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "8.493884\\-234.5764\\13\\11.79889\\-233.9312\\13\\14.11177\\-233.2976\\13\\17.48217\\-232.1583\\13\\21.00282\\-230.5951\\13\\23.41281\\-229.274\\13\\26.76602\\-226.9787\\13\\28.83936\\-225.2561\\13\\30.94899\\-223.165\\13\\32.75066\\-221.0801\\13\\34.07261\\-219.2731\\13\\35.24554\\-217.4447\\13\\36.50222\\-215.1296\\13\\37.28791\\-213.442\\13\\38.0702\\-211.4309\\13\\38.88156\\-208.9017\\13\\39.72481\\-205.0045\\13\\40.0441\\-202.2794\\13\\40.19049\\-199.5818\\13\\40.13769\\-197.0911\\13\\39.80278\\-193.6548\\13\\39.22738\\-190.4314\\13\\38.45135\\-187.5511\\13\\37.5313\\-184.8195\\13\\36.23561\\-181.7441\\13\\35.25876\\-179.8088\\13\\34.27408\\-178.0789\\13\\32.52323\\-175.4213\\13\\30.94167\\-173.3975\\13\\29.6861\\-172.0036\\13\\27.91198\\-170.2863\\13\\25.3169\\-168.2355\\13\\23.68431\\-167.2091\\13\\21.5541\\-166.1696\\13\\19.30247\\-165.3401\\13\\16.11502\\-164.7093\\13\\13.49307\\-164.5035\\13\\11.23911\\-164.5566\\13\\6.408697\\-165.0268\\13\\3.100249\\-165.2863\\13\\-0.7164387\\-165.3562\\13\\-5.432432\\-165.0266\\13\\-10.26396\\-164.5568\\13\\-12.51007\\-164.5049\\13\\-15.12665\\-164.7087\\13\\-16.3662\\-164.8919\\13\\-18.32609\\-165.3402\\13\\-20.57754\\-166.1696\\13\\-22.70788\\-167.2092\\13\\-24.3404\\-168.2355\\13\\-26.93542\\-170.2863\\13\\-28.70954\\-172.0036\\13\\-29.96511\\-173.3975\\13\\-31.54667\\-175.4213\\13\\-33.29752\\-178.0789\\13\\-34.2822\\-179.8088\\13\\-35.25905\\-181.7441\\13\\-36.81007\\-185.4838\\13\\-37.62061\\-188.0353\\13\\-38.25008\\-190.4274\\13\\-38.82615\\-193.6542\\13\\-39.16125\\-197.0911\\13\\-39.21392\\-199.5818\\13\\-39.06759\\-202.2792\\13\\-38.7482\\-205.0048\\13\\-37.90586\\-208.8992\\13\\-36.99252\\-211.729\\13\\-36.31318\\-213.4341\\13\\-35.52634\\-215.1275\\13\\-34.27116\\-217.4413\\13\\-33.09589\\-219.2734\\13\\-31.7741\\-221.0801\\13\\-29.97243\\-223.165\\13\\-27.86122\\-225.2573\\13\\-25.7893\\-226.9787\\13\\-22.43624\\-229.274\\13\\-20.01815\\-230.5973\\13\\-17.40203\\-231.8029\\13\\-15.30777\\-232.6044\\13\\-10.82813\\-233.929\\13\\-7.524759\\-234.5817\\13\\-5.269984\\-234.904\\13\\-2.816839\\-235.1104\\13\\0.9473966\\-235.236\\13\\6.244745\\-234.9043\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "91" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.352428\\-235.8766\\15\\-0.2751435\\-236.0274\\15\\4.346042\\-235.8818\\15\\8.495686\\-235.379\\15\\11.06613\\-234.9151\\15\\14.32617\\-234.0538\\15\\16.99848\\-233.1746\\15\\19.38593\\-232.2192\\15\\21.40554\\-231.223\\15\\24.18315\\-229.6686\\15\\25.36932\\-228.9052\\15\\27.42297\\-227.392\\15\\28.83851\\-226.2276\\15\\30.91222\\-224.2525\\15\\33.00831\\-221.88\\15\\35.25417\\-218.7149\\15\\36.24412\\-217.0504\\15\\37.27632\\-215.0163\\15\\38.14688\\-213.0815\\15\\39.25492\\-209.8866\\15\\40.14484\\-206.1315\\15\\40.53278\\-203.5353\\15\\40.65158\\-202.2302\\15\\40.73747\\-199.5977\\15\\40.61519\\-195.4557\\15\\40.04453\\-191.5536\\15\\39.27789\\-188.2651\\15\\38.71294\\-186.3867\\15\\38.02491\\-184.4544\\15\\36.27225\\-180.55\\15\\35.15323\\-178.4959\\15\\33.48592\\-175.8985\\15\\31.2849\\-173.0847\\15\\29.07742\\-170.8158\\15\\27.71301\\-169.6174\\15\\25.43394\\-167.971\\15\\23.93298\\-167.1358\\15\\22.13282\\-166.3177\\15\\20.29844\\-165.7189\\15\\18.72643\\-165.3374\\15\\16.12563\\-165.0569\\15\\14.06328\\-165.0467\\15\\11.78314\\-165.1992\\15\\10.041\\-165.4037\\15\\6.943377\\-165.9\\15\\3.907112\\-166.2342\\15\\0.8798413\\-166.412\\15\\-0.6704234\\-166.3927\\15\\-3.197479\\-166.2017\\15\\-5.896914\\-165.9104\\15\\-9.107254\\-165.3954\\15\\-10.80505\\-165.199\\15\\-13.10921\\-165.0527\\15\\-15.15511\\-165.0575\\15\\-17.74988\\-165.3374\\15\\-19.32188\\-165.719\\15\\-21.15606\\-166.3176\\15\\-22.4703\\-166.8992\\15\\-24.35965\\-167.9235\\15\\-26.73643\\-169.6174\\15\\-28.10086\\-170.8158\\15\\-30.30834\\-173.0847\\15\\-32.50935\\-175.8985\\15\\-34.17667\\-178.4959\\15\\-35.29569\\-180.55\\15\\-37.04974\\-184.456\\15\\-37.73783\\-186.3914\\15\\-38.29824\\-188.2576\\15\\-39.0706\\-191.5646\\15\\-39.6387\\-195.4538\\15\\-39.74317\\-197.4321\\15\\-39.76262\\-199.6461\\15\\-39.67511\\-202.2437\\15\\-39.1681\\-206.1319\\15\\-38.27806\\-209.8794\\15\\-37.17265\\-213.073\\15\\-36.29976\\-215.0163\\15\\-35.26755\\-217.0504\\15\\-34.27761\\-218.7149\\15\\-32.03175\\-221.88\\15\\-29.93566\\-224.2525\\15\\-27.86196\\-226.2276\\15\\-26.44641\\-227.392\\15\\-24.39276\\-228.9052\\15\\-23.2063\\-229.6688\\15\\-20.88731\\-230.9883\\15\\-19.11937\\-231.8959\\15\\-16.00317\\-233.187\\15\\-13.31468\\-234.0595\\15\\-10.09784\\-234.9124\\15\\-7.404643\\-235.3997\\15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "91" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.029942\\-236.6653\\17\\2.010749\\-236.6631\\17\\4.446617\\-236.5433\\17\\7.80014\\-236.192\\17\\11.24284\\-235.5591\\17\\14.3904\\-234.7445\\17\\16.36345\\-234.1138\\17\\18.94065\\-233.0963\\17\\22.1008\\-231.612\\17\\24.14786\\-230.4455\\17\\25.90031\\-229.2962\\17\\28.79989\\-227.0577\\17\\30.52427\\-225.4877\\17\\32.30814\\-223.6189\\17\\33.45079\\-222.2632\\17\\34.81234\\-220.4238\\17\\36.2802\\-218.109\\17\\37.21424\\-216.3908\\17\\38.1212\\-214.5175\\17\\39.37437\\-211.2721\\17\\40.25782\\-208.0095\\17\\40.97256\\-204.1384\\17\\41.16975\\-201.4004\\17\\41.194\\-197.9985\\17\\40.995\\-194.4936\\17\\40.12784\\-189.6766\\17\\38.99094\\-185.823\\17\\37.74787\\-182.6521\\17\\36.88046\\-180.7916\\17\\35.49171\\-178.2528\\17\\34.59517\\-176.8215\\17\\33.08762\\-174.694\\17\\31.4337\\-172.7147\\17\\29.65073\\-170.9631\\17\\28.23744\\-169.74\\17\\26.13827\\-168.256\\17\\23.89013\\-167.0711\\17\\21.29716\\-166.1405\\17\\19.91508\\-165.8356\\17\\17.64164\\-165.5893\\17\\16.16661\\-165.5578\\17\\13.18897\\-165.7594\\17\\9.827169\\-166.2907\\17\\9.030597\\-166.4862\\17\\5.331411\\-167.0857\\17\\2.805104\\-167.2884\\17\\0.5181172\\-167.3798\\17\\-2.145707\\-167.2692\\17\\-4.359952\\-167.0851\\17\\-8.052878\\-166.4862\\17\\-8.839521\\-166.2936\\17\\-12.21871\\-165.7586\\17\\-14.4383\\-165.5712\\17\\-16.64768\\-165.5859\\17\\-18.93849\\-165.8356\\17\\-20.32041\\-166.1404\\17\\-22.96261\\-167.1066\\17\\-25.16241\\-168.2557\\17\\-27.26087\\-169.74\\17\\-28.67417\\-170.9631\\17\\-30.45713\\-172.7147\\17\\-32.11098\\-174.694\\17\\-33.61861\\-176.8215\\17\\-34.51515\\-178.2528\\17\\-35.90389\\-180.7916\\17\\-36.77374\\-182.6609\\17\\-38.05385\\-185.9387\\17\\-39.1563\\-189.6925\\17\\-40.01937\\-194.4906\\17\\-40.22412\\-197.8868\\17\\-40.25567\\-200.0251\\17\\-39.99991\\-204.1131\\17\\-39.27728\\-208.04\\17\\-38.3979\\-211.2717\\17\\-37.14464\\-214.5175\\17\\-36.23768\\-216.3908\\17\\-35.30364\\-218.109\\17\\-33.83577\\-220.4238\\17\\-32.47423\\-222.2632\\17\\-31.33158\\-223.6189\\17\\-29.5477\\-225.4877\\17\\-27.82333\\-227.0577\\17\\-24.92375\\-229.2962\\17\\-23.1713\\-230.4455\\17\\-21.11721\\-231.6143\\17\\-17.96264\\-233.0968\\17\\-15.38684\\-234.1138\\17\\-12.07484\\-235.1296\\17\\-8.607195\\-235.8893\\17\\-6.823508\\-236.192\\17\\-3.461445\\-236.5527\\17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "91" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.683462\\-237.1808\\19\\-0.3255929\\-237.2869\\19\\1.98873\\-237.2744\\19\\6.102846\\-236.9748\\19\\8.808264\\-236.6017\\19\\11.8226\\-236.0039\\19\\15.15961\\-235.084\\19\\17.59692\\-234.2435\\19\\21.17103\\-232.6884\\19\\23.70801\\-231.3148\\19\\25.63118\\-230.0909\\19\\27.22925\\-228.9643\\19\\29.64411\\-226.9581\\19\\31.27211\\-225.3938\\19\\32.6134\\-223.9785\\19\\33.65456\\-222.7374\\19\\34.92638\\-221.0197\\19\\36.92345\\-217.8707\\19\\37.80421\\-216.1634\\19\\39.01139\\-213.4186\\19\\40.21777\\-209.8514\\19\\40.93425\\-206.8082\\19\\41.44651\\-203.388\\19\\41.53868\\-201.9218\\19\\41.58962\\-198.2017\\19\\41.47086\\-195.6101\\19\\40.99016\\-192.0179\\19\\40.49805\\-189.7695\\19\\39.78902\\-187.1465\\19\\38.0587\\-182.4983\\19\\37.23079\\-180.7453\\19\\35.86929\\-178.3167\\19\\34.26572\\-175.836\\19\\33.18003\\-174.382\\19\\31.90347\\-172.8926\\19\\29.2744\\-170.4186\\19\\27.71636\\-169.2266\\19\\26.30185\\-168.3265\\19\\24.7761\\-167.5538\\19\\23.44883\\-167.0246\\19\\21.57928\\-166.4988\\19\\19.73483\\-166.2275\\19\\17.51628\\-166.082\\19\\13.82242\\-166.4349\\19\\11.24808\\-166.8884\\19\\6.648745\\-167.8427\\19\\2.705294\\-168.2977\\19\\-0.3347399\\-168.3679\\19\\-2.307163\\-168.2352\\19\\-5.671096\\-167.8429\\19\\-10.26944\\-166.8886\\19\\-14.32032\\-166.2309\\19\\-16.49104\\-166.0875\\19\\-19.59993\\-166.3339\\19\\-21.13187\\-166.6263\\19\\-23.80653\\-167.5589\\19\\-25.32434\\-168.3261\\19\\-26.7399\\-169.2267\\19\\-28.29752\\-170.4184\\19\\-30.92687\\-172.8926\\19\\-32.10453\\-174.2648\\19\\-33.28954\\-175.8364\\19\\-34.89272\\-178.3167\\19\\-36.25507\\-180.7468\\19\\-37.08184\\-182.4977\\19\\-38.81234\\-187.1461\\19\\-39.53094\\-189.7971\\19\\-39.99321\\-191.935\\19\\-40.49356\\-195.5714\\19\\-40.61342\\-198.1896\\19\\-40.60046\\-200.9537\\19\\-40.46983\\-203.3885\\19\\-39.96544\\-206.7779\\19\\-39.24426\\-209.8392\\19\\-38.03483\\-213.4186\\19\\-36.82764\\-216.1634\\19\\-35.94689\\-217.8707\\19\\-33.94993\\-221.0195\\19\\-32.68019\\-222.7339\\19\\-31.6368\\-223.9785\\19\\-30.29556\\-225.3937\\19\\-28.66755\\-226.958\\19\\-26.25268\\-228.9643\\19\\-24.65469\\-230.0906\\19\\-22.73081\\-231.3152\\19\\-20.19467\\-232.6883\\19\\-16.62036\\-234.2435\\19\\-14.18234\\-235.0842\\19\\-10.84966\\-236.0035\\19\\-7.831686\\-236.6017\\19\\-5.126106\\-236.9749\\19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "89" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-7.395645\\-237.1539\\21\\-5.306133\\-237.4465\\21\\-1.839133\\-237.7328\\21\\-0.2842809\\-237.7869\\21\\2.888096\\-237.7201\\21\\6.287021\\-237.4457\\21\\8.372333\\-237.1539\\21\\12.0181\\-236.4454\\21\\15.61547\\-235.4113\\21\\19.22269\\-234.0662\\21\\21.98839\\-232.7559\\21\\25.03997\\-231.0009\\21\\26.98458\\-229.6644\\21\\29.05565\\-227.992\\21\\31.54506\\-225.6577\\21\\32.48167\\-224.6909\\21\\34.09058\\-222.7743\\21\\35.60046\\-220.6714\\21\\37.31148\\-217.8795\\21\\38.7951\\-214.7482\\21\\39.74943\\-212.3699\\21\\40.51642\\-209.866\\21\\40.99348\\-208.0448\\21\\41.45464\\-205.5703\\21\\41.80071\\-202.592\\21\\41.88151\\-201.3297\\21\\41.88874\\-197.8653\\21\\41.81102\\-196.4728\\21\\41.45572\\-193.2742\\21\\40.96309\\-190.6114\\21\\40.59074\\-189.0445\\21\\39.74879\\-186.2077\\21\\38.86715\\-183.821\\21\\37.84655\\-181.5504\\21\\36.43913\\-178.8346\\21\\34.43165\\-175.7988\\21\\33.05247\\-174.0063\\21\\31.33508\\-172.1742\\21\\29.6805\\-170.6856\\21\\27.39972\\-169.0863\\21\\24.77579\\-167.7686\\21\\22.22219\\-166.998\\21\\20.05033\\-166.6939\\21\\17.04919\\-166.7386\\21\\13.51682\\-167.2449\\21\\6.849967\\-168.7165\\21\\4.290162\\-169.1081\\21\\1.848251\\-169.3105\\21\\-1.52107\\-169.2661\\21\\-4.729115\\-168.9312\\21\\-8.234799\\-168.2235\\21\\-12.55383\\-167.2427\\21\\-16.22912\\-166.7331\\21\\-19.07346\\-166.6938\\21\\-21.30426\\-167.0212\\21\\-23.31525\\-167.5782\\21\\-24.7057\\-168.1694\\21\\-26.43823\\-169.0961\\21\\-28.71857\\-170.7057\\21\\-30.35854\\-172.1742\\21\\-32.07625\\-174.0068\\21\\-33.45519\\-175.7989\\21\\-35.46249\\-178.8344\\21\\-37.13916\\-182.1024\\21\\-37.89063\\-183.8214\\21\\-38.77219\\-186.2077\\21\\-39.61443\\-189.0458\\21\\-39.98876\\-190.6182\\21\\-40.47935\\-193.2755\\21\\-40.83527\\-196.4711\\21\\-40.92815\\-199.0401\\21\\-40.82614\\-202.5875\\21\\-40.47823\\-205.5696\\21\\-40.01206\\-208.064\\21\\-39.53767\\-209.8693\\21\\-38.77287\\-212.3699\\21\\-37.81854\\-214.7482\\21\\-36.33566\\-217.8782\\21\\-34.62394\\-220.6713\\21\\-32.88985\\-223.0571\\21\\-31.49877\\-224.6991\\21\\-30.56858\\-225.6576\\21\\-28.07457\\-227.9989\\21\\-26.00935\\-229.6635\\21\\-24.12276\\-230.9619\\21\\-21.01183\\-232.7559\\21\\-18.24613\\-234.0662\\21\\-14.63894\\-235.4113\\21\\-11.04153\\-236.4454\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "87" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.753596\\-237.9068\\23\\-7.798041\\-237.4943\\23\\-12.49881\\-236.4653\\23\\-14.92717\\-235.7205\\23\\-17.91876\\-234.5966\\23\\-20.97709\\-233.1124\\23\\-23.39151\\-231.7868\\23\\-24.52939\\-231.0763\\23\\-26.46242\\-229.6994\\23\\-28.32055\\-228.1715\\23\\-30.59839\\-226.0416\\23\\-32.9426\\-223.4142\\23\\-34.19903\\-221.718\\23\\-35.41452\\-219.9157\\23\\-37.05581\\-216.9329\\23\\-37.93576\\-215.1135\\23\\-39.16697\\-211.8353\\23\\-40.049\\-208.7443\\23\\-40.48323\\-206.6258\\23\\-40.93272\\-203.2229\\23\\-41.04909\\-198.6833\\23\\-40.91858\\-195.6227\\23\\-40.51166\\-192.5473\\23\\-40.11248\\-190.5581\\23\\-39.25061\\-187.2482\\23\\-38.19663\\-184.3367\\23\\-37.45996\\-182.5188\\23\\-35.485\\-178.6937\\23\\-33.64775\\-175.9321\\23\\-32.37863\\-174.3356\\23\\-30.103\\-171.9627\\23\\-27.50261\\-169.9239\\23\\-24.99735\\-168.5609\\23\\-23.94234\\-168.1558\\23\\-22.20877\\-167.6713\\23\\-20.17484\\-167.3306\\23\\-17.85983\\-167.2667\\23\\-15.82807\\-167.4507\\23\\-12.94633\\-167.9768\\23\\-7.278864\\-169.34\\23\\-5.3747\\-169.7353\\23\\-2.782075\\-170.1234\\23\\-0.1803772\\-170.3169\\23\\1.211557\\-170.3144\\23\\3.757592\\-170.1218\\23\\6.351666\\-169.7354\\23\\8.256512\\-169.3402\\23\\13.90996\\-167.9789\\23\\16.61414\\-167.4835\\23\\18.83676\\-167.2667\\23\\21.15127\\-167.3306\\23\\23.17904\\-167.6704\\23\\25.95107\\-168.5521\\23\\28.50536\\-169.9458\\23\\30.09743\\-171.1355\\23\\31.61209\\-172.4674\\23\\33.33221\\-174.3126\\23\\34.67731\\-175.9927\\23\\36.46438\\-178.6976\\23\\38.05774\\-181.6987\\23\\38.93901\\-183.6968\\23\\40.22915\\-187.2592\\23\\41.07985\\-190.5024\\23\\41.47528\\-192.4789\\23\\41.89619\\-195.6398\\23\\42.01239\\-198.1642\\23\\42.0208\\-200.5878\\23\\41.90052\\-203.3836\\23\\41.46058\\-206.6285\\23\\41.02722\\-208.7396\\23\\40.14355\\-211.8357\\23\\38.91092\\-215.1169\\23\\38.04168\\-216.9199\\23\\36.39198\\-219.9142\\23\\35.17476\\-221.7196\\23\\33.90102\\-223.4383\\23\\31.57782\\-226.0384\\23\\28.89132\\-228.5272\\23\\27.4328\\-229.703\\23\\24.36909\\-231.7857\\23\\21.95364\\-233.1124\\23\\18.89659\\-234.5961\\23\\15.90339\\-235.7207\\23\\13.48157\\-236.4646\\23\\8.774865\\-237.4942\\23\\5.767869\\-237.9031\\23\\0.4896935\\-238.1725\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "88" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "4.048399\\-238.3469\\25\\7.277422\\-238.0141\\25\\9.884943\\-237.5736\\25\\13.97069\\-236.601\\25\\16.38051\\-235.8169\\25\\19.9451\\-234.3963\\25\\21.37597\\-233.7215\\25\\24.86881\\-231.7308\\25\\26.40133\\-230.7061\\25\\28.8117\\-228.8449\\25\\31.13347\\-226.7313\\25\\33.31998\\-224.3756\\25\\35.48628\\-221.5382\\25\\36.58189\\-219.8341\\25\\38.12429\\-217.0754\\25\\38.92406\\-215.3398\\25\\39.79585\\-213.1714\\25\\40.99886\\-209.2183\\25\\41.42735\\-207.3092\\25\\41.85594\\-204.6539\\25\\42.12229\\-200.6738\\25\\42.12553\\-198.9667\\25\\41.89124\\-194.9655\\25\\41.41027\\-191.7418\\25\\40.62634\\-188.4188\\25\\39.39574\\-184.7328\\25\\38.24226\\-182.1304\\25\\36.95335\\-179.5813\\25\\35.21127\\-176.7896\\25\\33.375\\-174.4627\\25\\32.22188\\-173.2283\\25\\29.96692\\-171.2278\\25\\27.81486\\-169.8414\\25\\25.13781\\-168.6561\\25\\23.87956\\-168.305\\25\\21.90726\\-167.9758\\25\\19.20375\\-167.9256\\25\\17.32254\\-168.1313\\25\\14.95999\\-168.5373\\25\\12.37971\\-169.1585\\25\\8.008792\\-170.3103\\25\\4.971269\\-170.8907\\25\\2.334427\\-171.2197\\25\\0.4871397\\-171.2889\\25\\-1.371287\\-171.2183\\25\\-4.08017\\-170.8727\\25\\-7.032401\\-170.3103\\25\\-11.41537\\-169.1541\\25\\-15.55213\\-168.2392\\25\\-18.22731\\-167.9256\\25\\-20.93111\\-167.9758\\25\\-22.83704\\-168.2807\\25\\-24.13958\\-168.6436\\25\\-25.78547\\-169.3058\\25\\-27.90437\\-170.4867\\25\\-29.13807\\-171.3391\\25\\-31.32607\\-173.3061\\25\\-32.48741\\-174.5445\\25\\-34.35188\\-176.9543\\25\\-35.94552\\-179.5131\\25\\-37.20418\\-181.9399\\25\\-38.41994\\-184.7355\\25\\-39.65216\\-188.4303\\25\\-40.46104\\-191.8705\\25\\-40.91464\\-194.9659\\25\\-41.14793\\-198.68\\25\\-41.16267\\-199.9126\\25\\-40.88074\\-204.6442\\25\\-40.42034\\-207.4778\\25\\-40.06873\\-209.0601\\25\\-38.82009\\-213.1691\\25\\-38.15368\\-214.8128\\25\\-36.54058\\-218.1881\\25\\-35.60959\\-219.8293\\25\\-34.50632\\-221.5435\\25\\-32.34322\\-224.3759\\25\\-30.18397\\-226.7013\\25\\-27.83978\\-228.8404\\25\\-25.41993\\-230.7106\\25\\-23.88605\\-231.7353\\25\\-20.39869\\-233.722\\25\\-18.95782\\-234.4007\\25\\-15.40254\\-235.8178\\25\\-12.97344\\-236.5978\\25\\-10.60687\\-237.2122\\25\\-6.377011\\-238.0053\\25\\-2.883398\\-238.3622\\25\\0.4586823\\-238.4255\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "93" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.03459688\\-238.6139\\27\\4.904679\\-238.4729\\27\\7.818363\\-238.1249\\27\\9.986352\\-237.7584\\27\\13.27563\\-236.9786\\27\\16.60685\\-235.917\\27\\18.22424\\-235.2912\\27\\22.26905\\-233.4154\\27\\24.6817\\-231.9871\\27\\25.95901\\-231.1438\\27\\28.17739\\-229.4771\\27\\29.45213\\-228.4237\\27\\31.67609\\-226.2693\\27\\33.61864\\-224.0833\\27\\35.45016\\-221.6339\\27\\36.9472\\-219.2343\\27\\38.94528\\-215.2966\\27\\39.83692\\-213.0724\\27\\40.61589\\-210.6761\\27\\41.40452\\-207.3687\\27\\41.89172\\-204.0721\\27\\42.06532\\-200.765\\27\\42.08072\\-198.9393\\27\\41.88657\\-195.2258\\27\\41.48308\\-192.4421\\27\\41.03865\\-190.2398\\27\\40.21426\\-187.2357\\27\\39.06013\\-184.1378\\27\\38.06069\\-181.8863\\27\\36.43656\\-178.8604\\27\\35.03962\\-176.8033\\27\\33.86467\\-175.2868\\27\\32.52273\\-173.8039\\27\\31.52626\\-172.8636\\27\\29.41476\\-171.2155\\27\\27.92555\\-170.3192\\27\\26.40118\\-169.5958\\27\\24.98025\\-169.1189\\27\\22.60722\\-168.6688\\27\\20.19957\\-168.5711\\27\\17.88089\\-168.7913\\27\\16.07779\\-169.0979\\27\\14.02724\\-169.5716\\27\\9.145086\\-170.916\\27\\6.601874\\-171.5438\\27\\2.729523\\-172.1479\\27\\0.1094743\\-172.2408\\27\\-1.757627\\-172.1476\\27\\-5.622898\\-171.5443\\27\\-8.136178\\-170.9295\\27\\-13.40357\\-169.4913\\27\\-15.09846\\-169.0974\\27\\-16.90388\\-168.7914\\27\\-19.22301\\-168.5711\\27\\-21.63097\\-168.6688\\27\\-23.58984\\-169.0176\\27\\-25.42688\\-169.5959\\27\\-26.93791\\-170.3158\\27\\-28.22816\\-171.0692\\27\\-29.96432\\-172.3705\\27\\-31.69272\\-173.9609\\27\\-32.89073\\-175.2887\\27\\-34.87782\\-177.9464\\27\\-36.23392\\-180.1901\\27\\-37.38808\\-182.5407\\27\\-38.08374\\-184.1379\\27\\-39.23799\\-187.2373\\27\\-40.11014\\-190.525\\27\\-40.51105\\-192.4794\\27\\-40.91004\\-195.2247\\27\\-41.02796\\-197.2805\\27\\-41.10802\\-200.3053\\27\\-40.91162\\-204.097\\27\\-40.4935\\-206.9815\\27\\-39.98569\\-209.3535\\27\\-38.86222\\-213.0662\\27\\-37.98161\\-215.2875\\27\\-37.17999\\-217.013\\27\\-35.96891\\-219.2391\\27\\-34.90492\\-220.9825\\27\\-33.97001\\-222.3341\\27\\-32.40631\\-224.3739\\27\\-30.68747\\-226.2804\\27\\-28.80373\\-228.136\\27\\-27.8726\\-228.9475\\27\\-25.56764\\-230.7291\\27\\-23.38526\\-232.1795\\27\\-21.05225\\-233.5269\\27\\-16.71018\\-235.533\\27\\-13.36723\\-236.6658\\27\\-8.980839\\-237.7621\\27\\-6.912771\\-238.1162\\27\\-3.682885\\-238.4816\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "86" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.413155\\-238.7541\\29\\5.023041\\-238.5659\\29\\8.150431\\-238.1874\\29\\10.27469\\-237.7945\\29\\13.26938\\-237.0727\\29\\17.56068\\-235.6528\\29\\21.21932\\-233.993\\29\\22.79973\\-233.1467\\29\\26.12589\\-231.0507\\29\\28.66479\\-229.0784\\29\\30.45506\\-227.4759\\29\\33.03888\\-224.7294\\29\\33.99401\\-223.5474\\29\\36.15505\\-220.4792\\29\\37.20221\\-218.6946\\29\\38.90091\\-215.2383\\29\\39.80353\\-212.8287\\29\\41.01338\\-208.7018\\29\\41.45699\\-206.4105\\29\\41.84095\\-203.4432\\29\\41.95745\\-200.293\\29\\41.83922\\-196.0952\\29\\41.4432\\-193.0125\\29\\40.96298\\-190.5797\\29\\40.09978\\-187.421\\29\\38.52546\\-183.272\\29\\37.61929\\-181.3711\\29\\35.48587\\-177.8592\\29\\34.25529\\-176.1794\\29\\32.52202\\-174.2382\\29\\30.02571\\-172.1448\\29\\28.87105\\-171.3671\\29\\26.30465\\-170.1524\\29\\23.79359\\-169.4824\\29\\22.00226\\-169.2916\\29\\20.29381\\-169.3234\\29\\18.33458\\-169.5027\\29\\14.76035\\-170.2191\\29\\11.33772\\-171.2109\\29\\7.438661\\-172.2641\\29\\5.378239\\-172.7119\\29\\3.424526\\-172.9936\\29\\0.4580991\\-173.1884\\29\\-2.457453\\-172.9929\\29\\-4.401687\\-172.7118\\29\\-6.824599\\-172.1784\\29\\-11.68959\\-170.7874\\29\\-15.42822\\-169.8439\\29\\-17.35658\\-169.503\\29\\-19.31737\\-169.3233\\29\\-21.02546\\-169.2916\\29\\-22.81627\\-169.4822\\29\\-25.33453\\-170.1537\\29\\-27.89765\\-171.3699\\29\\-29.0554\\-172.1488\\29\\-31.54563\\-174.2385\\29\\-33.27873\\-176.1794\\29\\-34.50931\\-177.8592\\29\\-36.64312\\-181.3722\\29\\-37.54911\\-183.2725\\29\\-39.12331\\-187.4211\\29\\-39.98946\\-190.5872\\29\\-40.46658\\-193.0122\\29\\-40.86082\\-196.0722\\29\\-40.97685\\-198.9644\\29\\-40.93272\\-202.2657\\29\\-40.85752\\-203.4983\\29\\-40.4788\\-206.4231\\29\\-40.03172\\-208.7132\\29\\-38.82713\\-212.8279\\29\\-37.92532\\-215.2365\\29\\-36.22628\\-218.6937\\29\\-35.17873\\-220.4788\\29\\-33.01707\\-223.5479\\29\\-32.06234\\-224.7295\\29\\-29.65695\\-227.3036\\29\\-27.79914\\-228.9852\\29\\-26.26655\\-230.21\\29\\-24.12762\\-231.7298\\29\\-22.121\\-232.9879\\29\\-20.16258\\-234.0261\\29\\-16.4124\\-235.7099\\29\\-12.28331\\-237.077\\29\\-9.271958\\-237.7982\\29\\-7.467124\\-238.1452\\29\\-4.080799\\-238.5643\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.4901226\\-238.7366\\31\\4.307921\\-238.6424\\31\\7.446903\\-238.2924\\31\\9.917973\\-237.8726\\31\\13.9465\\-236.8512\\31\\17.67932\\-235.5356\\31\\21.27737\\-233.9167\\31\\25.13845\\-231.6337\\31\\27.64256\\-229.787\\31\\28.9626\\-228.6737\\31\\31.36633\\-226.3819\\31\\33.49854\\-223.9586\\31\\35.39708\\-221.2745\\31\\37.55659\\-217.6499\\31\\38.74607\\-215.0237\\31\\39.73824\\-212.4469\\31\\40.47105\\-209.8965\\31\\40.98198\\-207.8148\\31\\41.40693\\-205.2838\\31\\41.68865\\-201.8148\\31\\41.75964\\-199.5409\\31\\41.41822\\-194.4963\\31\\40.99544\\-191.8885\\31\\40.09607\\-188.3015\\31\\39.31947\\-186.007\\31\\37.98592\\-182.7767\\31\\37.09343\\-181.0414\\31\\35.54602\\-178.4887\\31\\33.86545\\-176.2896\\31\\32.62204\\-174.9317\\31\\31.27496\\-173.7163\\31\\29.66087\\-172.4931\\31\\28.41368\\-171.7478\\31\\26.78667\\-171.0172\\31\\24.1816\\-170.2549\\31\\21.31641\\-170.0368\\31\\19.59637\\-170.1471\\31\\17.39042\\-170.4745\\31\\15.19672\\-170.9739\\31\\7.979877\\-173.0299\\31\\4.596751\\-173.7646\\31\\1.916388\\-174.0483\\31\\-0.6310761\\-174.0825\\31\\-3.613085\\-173.7657\\31\\-7.004896\\-173.0296\\31\\-12.193\\-171.526\\31\\-16.41236\\-170.4641\\31\\-18.61145\\-170.1465\\31\\-20.35093\\-170.0359\\31\\-23.20504\\-170.2549\\31\\-25.8102\\-171.0172\\31\\-27.43696\\-171.7478\\31\\-28.6843\\-172.4931\\31\\-30.2984\\-173.7163\\31\\-31.64548\\-174.9317\\31\\-32.88889\\-176.2896\\31\\-34.56945\\-178.4887\\31\\-36.11686\\-181.0414\\31\\-37.00936\\-182.7767\\31\\-38.34291\\-186.007\\31\\-39.11985\\-188.3023\\31\\-39.98562\\-191.7552\\31\\-40.4445\\-194.524\\31\\-40.76713\\-198.9238\\31\\-40.70885\\-201.8533\\31\\-40.46113\\-205.0827\\31\\-40.02164\\-207.7572\\31\\-39.20723\\-210.9518\\31\\-38.76167\\-212.4469\\31\\-37.76955\\-215.0235\\31\\-36.58002\\-217.6499\\31\\-34.42748\\-221.2671\\31\\-32.52197\\-223.9586\\31\\-30.99468\\-225.7379\\31\\-28.32024\\-228.3686\\31\\-26.19358\\-230.1669\\31\\-24.15025\\-231.641\\31\\-20.29691\\-233.9186\\31\\-17.91772\\-235.0095\\31\\-15.4289\\-236.0352\\31\\-12.9876\\-236.8521\\31\\-8.942101\\-237.8723\\31\\-6.478204\\-238.292\\31\\-3.542845\\-238.6289\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "90" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.4953977\\-238.7004\\33\\2.750556\\-238.6575\\33\\6.656632\\-238.3173\\33\\9.024737\\-237.942\\33\\13.48291\\-236.8813\\33\\16.08524\\-236.0259\\33\\19.23837\\-234.7399\\33\\21.7297\\-233.4525\\33\\24.23479\\-231.9745\\33\\26.6918\\-230.2872\\33\\29.07076\\-228.273\\33\\32.02996\\-225.3131\\33\\33.16754\\-223.9576\\33\\35.50502\\-220.6669\\33\\37.07004\\-217.9509\\33\\37.89184\\-216.2903\\33\\39.45831\\-212.2763\\33\\40.24522\\-209.568\\33\\40.99987\\-205.9013\\33\\41.36486\\-202.1829\\33\\41.44279\\-200.4987\\33\\41.33272\\-197.2349\\33\\40.95243\\-193.6895\\33\\40.10103\\-189.631\\33\\39.23831\\-186.8839\\33\\38.54536\\-184.9983\\33\\37.7583\\-183.2423\\33\\36.59358\\-180.9804\\33\\35.20951\\-178.8038\\33\\33.4445\\-176.5375\\33\\32.18155\\-175.2398\\33\\30.51949\\-173.8254\\33\\28.40141\\-172.493\\33\\26.19894\\-171.5501\\33\\25.01247\\-171.2166\\33\\23.32162\\-170.953\\33\\20.72319\\-170.8793\\33\\18.1765\\-171.1597\\33\\16.3128\\-171.5532\\33\\12.56025\\-172.5728\\33\\9.754065\\-173.4435\\33\\7.603109\\-174.0198\\33\\5.220454\\-174.5403\\33\\3.43474\\-174.8145\\33\\1.153885\\-174.9719\\33\\-0.3174352\\-174.9824\\33\\-2.459932\\-174.8144\\33\\-4.238948\\-174.5412\\33\\-6.626546\\-174.0198\\33\\-8.777449\\-173.4435\\33\\-13.63095\\-171.9926\\33\\-16.07005\\-171.3863\\33\\-18.26521\\-171.0082\\33\\-19.89178\\-170.8556\\33\\-22.34499\\-170.953\\33\\-24.03591\\-171.2166\\33\\-25.73358\\-171.7285\\33\\-28.26204\\-172.9639\\33\\-29.54293\\-173.8254\\33\\-31.20499\\-175.2398\\33\\-32.46794\\-176.5375\\33\\-34.23293\\-178.8041\\33\\-35.61702\\-180.9804\\33\\-36.78174\\-183.2423\\33\\-37.56881\\-184.9983\\33\\-38.26184\\-186.884\\33\\-39.12965\\-189.6468\\33\\-40.01433\\-193.8777\\33\\-40.3143\\-196.8376\\33\\-40.4475\\-198.8009\\33\\-40.38829\\-202.2036\\33\\-40.04157\\-205.8176\\33\\-39.26876\\-209.5669\\33\\-38.48176\\-212.2762\\33\\-36.91528\\-216.2903\\33\\-36.09344\\-217.9508\\33\\-34.97908\\-219.9547\\33\\-33.6489\\-221.9684\\33\\-32.19098\\-223.9576\\33\\-30.47704\\-225.9456\\33\\-28.08905\\-228.2809\\33\\-25.72135\\-230.283\\33\\-23.94052\\-231.5493\\33\\-21.15728\\-233.2631\\33\\-18.26126\\-234.7402\\33\\-15.10819\\-236.0256\\33\\-12.51236\\-236.8809\\33\\-8.047938\\-237.9421\\33\\-5.483054\\-238.3414\\33\\-2.218568\\-238.6264\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "85" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.000859\\-238.4568\\35\\2.036119\\-238.4849\\35\\4.143352\\-238.3752\\35\\6.613834\\-238.1095\\35\\9.514951\\-237.627\\35\\12.33269\\-236.9785\\35\\15.53581\\-235.954\\35\\19.42916\\-234.3671\\35\\22.94777\\-232.4604\\35\\25.02822\\-231.1092\\35\\27.5958\\-229.1517\\35\\29.03459\\-227.8704\\35\\31.28551\\-225.6089\\35\\32.91689\\-223.6862\\35\\35.34478\\-220.2166\\35\\36.57921\\-218.0723\\35\\37.74644\\-215.6492\\35\\38.42889\\-213.9913\\35\\39.35489\\-211.3383\\35\\40.40844\\-206.7554\\35\\40.92302\\-202.2714\\35\\41.00206\\-199.7695\\35\\40.93535\\-197.9866\\35\\40.66289\\-195.0022\\35\\40.07468\\-191.502\\35\\39.24739\\-188.4096\\35\\38.50623\\-186.2061\\35\\36.90047\\-182.6232\\35\\36.08315\\-181.1808\\35\\34.83999\\-179.2665\\35\\32.98299\\-176.9483\\35\\30.91133\\-174.9926\\35\\29.24399\\-173.817\\35\\26.68323\\-172.5698\\35\\25.37802\\-172.1649\\35\\23.34433\\-171.7898\\35\\20.98104\\-171.7251\\35\\19.32048\\-171.8611\\35\\16.92815\\-172.2928\\35\\14.67541\\-172.8482\\35\\10.65421\\-174.0508\\35\\8.156789\\-174.7474\\35\\4.922141\\-175.4625\\35\\2.723269\\-175.7374\\35\\0.4495099\\-175.8301\\35\\-1.732899\\-175.7384\\35\\-3.945446\\-175.4625\\35\\-7.180226\\-174.7474\\35\\-12.94566\\-173.0651\\35\\-15.53978\\-172.3788\\35\\-18.24297\\-171.8915\\35\\-20.00237\\-171.7255\\35\\-22.36777\\-171.7898\\35\\-24.40134\\-172.1649\\35\\-25.7159\\-172.5713\\35\\-28.26852\\-173.8174\\35\\-29.93477\\-174.9926\\35\\-32.00647\\-176.9484\\35\\-33.86517\\-179.27\\35\\-35.10661\\-181.1808\\35\\-35.92391\\-182.6232\\35\\-37.53215\\-186.2058\\35\\-38.27248\\-188.4124\\35\\-39.10156\\-191.5144\\35\\-39.68585\\-194.9945\\35\\-39.97252\\-198.107\\35\\-40.01736\\-201.139\\35\\-39.59502\\-205.6914\\35\\-39.2518\\-207.7293\\35\\-38.3785\\-211.3382\\35\\-37.45229\\-213.9914\\35\\-36.76987\\-215.6492\\35\\-35.60251\\-218.0725\\35\\-34.37028\\-220.2115\\35\\-31.94033\\-223.6862\\35\\-30.30895\\-225.6089\\35\\-28.05807\\-227.8703\\35\\-26.61924\\-229.1517\\35\\-24.0249\\-231.129\\35\\-21.98286\\-232.4527\\35\\-18.45258\\-234.3672\\35\\-14.5715\\-235.9517\\35\\-11.35603\\-236.9786\\35\\-8.538386\\-237.627\\35\\-5.602347\\-238.1122\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "87" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.61614\\-237.6672\\37\\-10.98535\\-236.7354\\37\\-14.51257\\-235.6436\\37\\-17.65323\\-234.3289\\37\\-21.22044\\-232.4753\\37\\-23.51953\\-231.0013\\37\\-24.98857\\-229.9255\\37\\-27.8242\\-227.5122\\37\\-29.54052\\-225.7867\\37\\-30.79133\\-224.3732\\37\\-32.45856\\-222.2233\\37\\-33.85873\\-220.1125\\37\\-35.11557\\-217.9072\\37\\-35.85318\\-216.4401\\37\\-37.16885\\-213.3141\\37\\-38.003\\-210.7243\\37\\-38.43382\\-209.0325\\37\\-39.0409\\-205.897\\37\\-39.43265\\-202.0462\\37\\-39.37213\\-197.2073\\37\\-38.91679\\-193.5749\\37\\-38.23898\\-190.3668\\37\\-37.60628\\-188.2453\\37\\-36.71917\\-185.776\\37\\-35.76009\\-183.722\\37\\-34.08898\\-180.7492\\37\\-33.02569\\-179.2651\\37\\-31.76208\\-177.7688\\37\\-30.65273\\-176.6622\\37\\-29.07246\\-175.3406\\37\\-27.88852\\-174.5473\\37\\-26.47118\\-173.8304\\37\\-25.22582\\-173.3481\\37\\-23.84299\\-172.9659\\37\\-21.62577\\-172.6531\\37\\-20.26233\\-172.6532\\37\\-17.86761\\-172.8491\\37\\-14.26632\\-173.589\\37\\-8.348366\\-175.2729\\37\\-4.379842\\-176.2158\\37\\-2.388492\\-176.495\\37\\0.1449418\\-176.6609\\37\\1.875269\\-176.6272\\37\\5.358457\\-176.2152\\37\\9.324851\\-175.2729\\37\\15.23803\\-173.5915\\37\\18.02307\\-172.979\\37\\21.24292\\-172.6531\\37\\22.60233\\-172.6531\\37\\24.81956\\-172.9659\\37\\26.86782\\-173.5768\\37\\28.85266\\-174.5411\\37\\30.04928\\-175.3407\\37\\31.6293\\-176.6622\\37\\32.73854\\-177.7687\\37\\33.68728\\-178.8876\\37\\35.07052\\-180.757\\37\\36.73661\\-183.7219\\37\\37.72141\\-185.852\\37\\38.25498\\-187.2657\\37\\39.2155\\-190.3667\\37\\39.89351\\-193.5759\\37\\40.34883\\-197.2083\\37\\40.40963\\-202.048\\37\\40.01748\\-205.8969\\37\\39.41037\\-209.0326\\37\\38.99327\\-210.6581\\37\\37.94262\\-213.8319\\37\\36.82975\\-216.4401\\37\\36.09213\\-217.9072\\37\\34.83552\\-220.1121\\37\\33.43513\\-222.2233\\37\\31.76789\\-224.3732\\37\\30.51708\\-225.7867\\37\\28.80077\\-227.5122\\37\\25.96513\\-229.9255\\37\\24.49606\\-231.0013\\37\\22.19667\\-232.4754\\37\\18.62989\\-234.3289\\37\\16.48496\\-235.2552\\37\\14.84352\\-235.8546\\37\\11.9587\\-236.7358\\37\\7.592703\\-237.6672\\37\\5.001103\\-237.9932\\37\\2.409481\\-238.1873\\37\\-1.532403\\-238.1847\\37\\-4.024491\\-237.9932\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "83" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.702011\\-237.6129\\39\\-1.211487\\-237.7944\\39\\2.181149\\-237.7945\\39\\4.685203\\-237.6135\\39\\7.860736\\-237.1998\\39\\11.88129\\-236.3153\\39\\14.14131\\-235.6363\\39\\16.36092\\-234.8151\\39\\18.63998\\-233.816\\39\\20.80708\\-232.6991\\39\\23.50611\\-231.068\\39\\26.56095\\-228.7745\\39\\28.37767\\-227.1652\\39\\30.90448\\-224.5071\\39\\32.53694\\-222.4393\\39\\33.87878\\-220.5102\\39\\35.12926\\-218.4678\\39\\36.53879\\-215.611\\39\\37.93586\\-211.9901\\39\\38.7508\\-209.0889\\39\\39.34272\\-205.9254\\39\\39.67249\\-203.3363\\39\\39.78941\\-200.5734\\39\\39.75761\\-198.8169\\39\\39.51723\\-195.7409\\39\\39.00574\\-192.5483\\39\\38.46976\\-190.2929\\39\\37.64039\\-187.6277\\39\\36.67556\\-185.2806\\39\\35.34\\-182.7097\\39\\33.48629\\-179.905\\39\\32.07675\\-178.2744\\39\\29.92944\\-176.3831\\39\\28.30461\\-175.3548\\39\\26.20537\\-174.3951\\39\\23.68919\\-173.7934\\39\\22.16423\\-173.6378\\39\\19.27844\\-173.7463\\39\\15.70568\\-174.3975\\39\\8.223543\\-176.3965\\39\\5.378874\\-177.0056\\39\\3.461764\\-177.2816\\39\\1.472076\\-177.4337\\39\\-0.4933432\\-177.4327\\39\\-2.466461\\-177.2858\\39\\-4.045619\\-177.0645\\39\\-7.23469\\-176.3978\\39\\-14.72956\\-174.3975\\39\\-18.29946\\-173.7507\\39\\-21.1878\\-173.6378\\39\\-22.71219\\-173.7935\\39\\-24.21482\\-174.0921\\39\\-26.08353\\-174.7365\\39\\-27.50921\\-175.4565\\39\\-28.95288\\-176.3831\\39\\-31.10019\\-178.2744\\39\\-32.50885\\-179.9039\\39\\-34.01783\\-182.1251\\39\\-35.48392\\-184.8132\\39\\-36.6627\\-187.6236\\39\\-37.48743\\-190.283\\39\\-38.03294\\-192.571\\39\\-38.54067\\-195.7409\\39\\-38.78103\\-198.8165\\39\\-38.81285\\-200.5735\\39\\-38.69593\\-203.3363\\39\\-38.36618\\-205.9219\\39\\-37.77484\\-209.0889\\39\\-36.61217\\-212.9868\\39\\-35.56226\\-215.6108\\39\\-34.15272\\-218.4678\\39\\-32.90222\\-220.5102\\39\\-31.56038\\-222.4393\\39\\-29.92792\\-224.5071\\39\\-27.40102\\-227.1654\\39\\-25.58439\\-228.7745\\39\\-22.52944\\-231.0681\\39\\-19.83947\\-232.6957\\39\\-17.66599\\-233.815\\39\\-15.3811\\-234.8158\\39\\-13.51527\\-235.513\\39\\-10.39749\\-236.4391\\39\\-6.884175\\-237.1998\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.3400956\\-237.2985\\41\\-3.233385\\-237.1493\\41\\-7.737672\\-236.492\\41\\-10.04799\\-235.9853\\41\\-14.54029\\-234.5463\\41\\-17.77674\\-233.0933\\41\\-19.93046\\-231.9582\\41\\-21.18027\\-231.2044\\41\\-24.37808\\-228.9078\\41\\-25.76576\\-227.7526\\41\\-27.87546\\-225.7523\\41\\-28.98915\\-224.5288\\41\\-30.57085\\-222.6016\\41\\-32.3194\\-220.1352\\41\\-33.69656\\-217.7817\\41\\-35.36361\\-214.1454\\41\\-36.01065\\-212.458\\41\\-36.9594\\-209.23\\41\\-37.35035\\-207.4368\\41\\-37.71606\\-205.0721\\41\\-37.97752\\-202.5728\\41\\-38.0004\\-198.8415\\41\\-37.85862\\-196.5713\\41\\-37.44385\\-193.8403\\41\\-36.6803\\-190.4399\\41\\-35.73935\\-187.5616\\41\\-34.26327\\-184.3181\\41\\-33.04035\\-182.2709\\41\\-32.26568\\-181.1462\\41\\-30.9919\\-179.5856\\41\\-29.96336\\-178.5467\\41\\-28.67622\\-177.472\\41\\-26.37898\\-176.059\\41\\-24.77358\\-175.3962\\41\\-22.06712\\-174.7763\\41\\-20.15941\\-174.6766\\41\\-18.57177\\-174.7414\\41\\-16.59039\\-174.9821\\41\\-14.53618\\-175.3825\\41\\-7.747453\\-177.0903\\41\\-6.204718\\-177.444\\41\\-3.500894\\-177.9178\\41\\-0.8682781\\-178.1636\\41\\1.530129\\-178.186\\41\\4.511961\\-177.9179\\41\\8.733384\\-177.0879\\41\\15.51274\\-175.3825\\41\\17.56694\\-174.9821\\41\\19.54817\\-174.7414\\41\\21.12675\\-174.676\\41\\23.05467\\-174.777\\41\\25.82758\\-175.4239\\41\\27.34306\\-176.0523\\41\\29.65279\\-177.472\\41\\30.93995\\-178.5467\\41\\31.96724\\-179.5837\\41\\33.43142\\-181.3729\\41\\34.50909\\-182.9986\\41\\35.295\\-184.4318\\41\\36.3792\\-186.71\\41\\37.36567\\-189.5115\\41\\37.84663\\-191.1509\\41\\38.42079\\-193.8375\\41\\38.83489\\-196.5692\\41\\38.97879\\-198.8264\\41\\38.95415\\-202.5714\\41\\38.69285\\-205.0701\\41\\38.26485\\-207.6837\\41\\37.50433\\-210.8386\\41\\36.33387\\-214.1667\\41\\34.67833\\-217.7717\\41\\33.29601\\-220.1352\\41\\31.54742\\-222.6016\\41\\29.96554\\-224.5292\\41\\28.83795\\-225.7647\\41\\26.74392\\-227.7472\\41\\25.35453\\-228.9079\\41\\22.14914\\-231.209\\41\\18.73229\\-233.1064\\41\\15.43164\\-234.5793\\41\\11.00961\\-235.9893\\41\\8.710009\\-236.4923\\41\\4.328912\\-237.12\\41\\1.313616\\-237.2967\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.955154\\-236.2846\\43\\-2.707301\\-236.501\\43\\1.202072\\-236.6001\\43\\4.107514\\-236.4532\\43\\5.930137\\-236.2856\\43\\8.445067\\-235.865\\43\\10.48218\\-235.4241\\43\\14.03991\\-234.3177\\43\\16.11947\\-233.5263\\43\\19.04493\\-232.1423\\43\\20.98556\\-231.0457\\43\\22.73697\\-229.8897\\43\\24.68273\\-228.4667\\43\\27.00895\\-226.4374\\43\\29.76091\\-223.5387\\43\\30.65047\\-222.4255\\43\\32.23809\\-220.2175\\43\\33.41503\\-218.2785\\43\\34.36595\\-216.4765\\43\\36.01795\\-212.5974\\43\\36.93511\\-209.5831\\43\\37.32171\\-207.9585\\43\\37.70532\\-205.8017\\43\\37.97639\\-203.3611\\43\\38.06329\\-201.6431\\43\\38.00877\\-197.9967\\43\\37.66869\\-194.8309\\43\\36.87068\\-191.1074\\43\\35.73542\\-187.7982\\43\\34.77942\\-185.6406\\43\\33.44427\\-183.2631\\43\\32.25814\\-181.6049\\43\\30.33052\\-179.5509\\43\\28.85168\\-178.3182\\43\\27.01671\\-177.2258\\43\\25.64424\\-176.63\\43\\23.84089\\-176.1033\\43\\21.49493\\-175.8133\\43\\19.59134\\-175.8229\\43\\17.38559\\-176.0377\\43\\13.4158\\-176.8141\\43\\10.13593\\-177.6155\\43\\6.292988\\-178.4255\\43\\2.716954\\-178.8667\\43\\0.65814\\-178.9406\\43\\-1.74198\\-178.8663\\43\\-5.316413\\-178.4255\\43\\-9.159284\\-177.6155\\43\\-12.43955\\-176.814\\43\\-16.40882\\-176.0378\\43\\-18.61486\\-175.8229\\43\\-20.53669\\-175.8165\\43\\-23.13804\\-176.1575\\43\\-25.36633\\-176.8953\\43\\-27.03267\\-177.7669\\43\\-28.30706\\-178.6481\\43\\-29.3285\\-179.5227\\43\\-31.2833\\-181.6073\\43\\-32.51058\\-183.3202\\43\\-33.80414\\-185.6419\\43\\-34.75871\\-187.798\\43\\-35.8939\\-191.1069\\43\\-36.69219\\-194.8313\\43\\-36.99111\\-197.5941\\43\\-37.11143\\-201.0014\\43\\-36.99994\\-203.3603\\43\\-36.72874\\-205.8024\\43\\-36.33923\\-207.9854\\43\\-35.95862\\-209.5827\\43\\-35.04138\\-212.5974\\43\\-33.80167\\-215.5842\\43\\-32.58022\\-218.0595\\43\\-31.28763\\-220.1815\\43\\-29.67391\\-222.4255\\43\\-28.78436\\-223.5386\\43\\-26.7344\\-225.7667\\43\\-25.59165\\-226.8523\\43\\-23.70625\\-228.4667\\43\\-21.76042\\-229.8897\\43\\-18.66968\\-231.825\\43\\-15.93942\\-233.1724\\43\\-13.06401\\-234.3177\\43\\-10.81817\\-235.0614\\43\\-7.545309\\-235.8298\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.100227\\-235.7332\\45\\1.437713\\-235.8003\\45\\5.294383\\-235.5499\\45\\6.804339\\-235.3395\\45\\10.51384\\-234.5422\\45\\12.7683\\-233.8944\\45\\15.00934\\-233.0731\\45\\17.38166\\-232.0212\\45\\19.0458\\-231.1523\\45\\21.10321\\-229.9139\\45\\22.53\\-228.9478\\45\\25.12174\\-226.8947\\45\\26.87385\\-225.2957\\45\\28.26976\\-223.7979\\45\\30.55404\\-220.9503\\45\\32.14964\\-218.4886\\45\\33.48821\\-216.0404\\45\\34.92249\\-212.6543\\45\\35.88692\\-209.5876\\45\\36.32925\\-207.7695\\45\\36.75126\\-205.1409\\45\\37.04799\\-201.5114\\45\\36.95938\\-197.8098\\45\\36.60044\\-195.1116\\45\\35.8653\\-191.5822\\45\\35.50805\\-190.383\\45\\34.59135\\-187.9586\\45\\33.69322\\-186.0481\\45\\32.8547\\-184.5539\\45\\31.87257\\-183.0983\\45\\30.4122\\-181.36\\45\\28.13129\\-179.4048\\45\\26.90944\\-178.656\\45\\25.15255\\-177.8439\\45\\22.8357\\-177.2106\\45\\21.33761\\-177.023\\45\\19.37333\\-176.983\\45\\17.72774\\-177.0813\\45\\14.55401\\-177.5571\\45\\8.662991\\-178.7782\\45\\6.573238\\-179.168\\45\\3.933375\\-179.5311\\45\\1.705158\\-179.6717\\45\\-0.7371299\\-179.6709\\45\\-2.78506\\-179.5449\\45\\-5.572783\\-179.1703\\45\\-9.201396\\-178.4734\\45\\-11.53369\\-177.9544\\45\\-14.97319\\-177.3044\\45\\-17.92788\\-176.9971\\45\\-19.54189\\-176.9788\\45\\-22.29094\\-177.2938\\45\\-23.63145\\-177.659\\45\\-25.80092\\-178.5809\\45\\-27.11061\\-179.3631\\45\\-28.40954\\-180.3949\\45\\-29.43712\\-181.3611\\45\\-30.89596\\-183.0981\\45\\-31.87783\\-184.5536\\45\\-32.71107\\-186.0414\\45\\-33.5854\\-187.8715\\45\\-34.5313\\-190.3825\\45\\-34.88872\\-191.5822\\45\\-35.62388\\-195.1116\\45\\-35.9823\\-197.8023\\45\\-36.07149\\-201.5149\\45\\-35.77505\\-205.1384\\45\\-35.35269\\-207.7695\\45\\-34.91042\\-209.5873\\45\\-33.94565\\-212.6538\\45\\-33.03407\\-214.8826\\45\\-31.68403\\-217.6209\\45\\-29.57736\\-220.9505\\45\\-27.29504\\-223.796\\45\\-25.75001\\-225.4355\\45\\-24.14528\\-226.8943\\45\\-21.55342\\-228.9478\\45\\-18.6119\\-230.8521\\45\\-15.63765\\-232.3666\\45\\-11.795\\-233.8934\\45\\-9.539515\\-234.5415\\45\\-5.827325\\-235.3395\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.352002\\-234.8572\\47\\2.327949\\-234.8578\\47\\6.529886\\-234.396\\47\\9.582994\\-233.7909\\47\\12.01802\\-233.087\\47\\15.29542\\-231.8733\\47\\17.26853\\-230.9367\\47\\19.22566\\-229.8668\\47\\21.95089\\-228.0791\\47\\24.28699\\-226.2204\\47\\26.61855\\-223.9811\\47\\28.56215\\-221.7475\\47\\30.8011\\-218.5682\\47\\31.86789\\-216.702\\47\\32.7491\\-214.9375\\47\\33.90556\\-212.0882\\47\\34.85136\\-208.8762\\47\\35.32409\\-206.7744\\47\\35.58638\\-205.0795\\47\\35.87545\\-200.8659\\47\\35.82267\\-198.8716\\47\\35.271\\-194.4814\\47\\34.67645\\-191.9465\\47\\34.05193\\-189.9698\\47\\33.10344\\-187.7412\\47\\31.68133\\-185.2255\\47\\30.37927\\-183.4487\\47\\28.38676\\-181.4048\\47\\26.35579\\-179.9827\\47\\24.27835\\-179.0401\\47\\21.92644\\-178.4214\\47\\20.46898\\-178.2515\\47\\17.62013\\-178.2567\\47\\15.58224\\-178.4631\\47\\12.7661\\-178.8753\\47\\6.619486\\-179.9942\\47\\4.355937\\-180.2575\\47\\2.18924\\-180.4008\\47\\-0.1275444\\-180.4426\\47\\-2.663076\\-180.3201\\47\\-5.576665\\-179.9965\\47\\-13.10967\\-178.669\\47\\-16.73705\\-178.2459\\47\\-19.49224\\-178.2496\\47\\-20.9081\\-178.4081\\47\\-22.83438\\-178.8881\\47\\-23.87511\\-179.2603\\47\\-25.36547\\-179.9907\\47\\-27.41222\\-181.4064\\47\\-29.4066\\-183.4528\\47\\-30.70476\\-185.2254\\47\\-32.12716\\-187.7414\\47\\-33.07545\\-189.9703\\47\\-33.69988\\-191.9465\\47\\-34.29444\\-194.4814\\47\\-34.77962\\-198.0478\\47\\-34.90196\\-200.4547\\47\\-34.76553\\-203.2309\\47\\-34.6021\\-205.0937\\47\\-34.34883\\-206.7671\\47\\-33.87418\\-208.8779\\47\\-32.91704\\-212.0867\\47\\-31.77262\\-214.9375\\47\\-30.89486\\-216.6933\\47\\-29.81977\\-218.5779\\47\\-28.30831\\-220.8152\\47\\-27.15636\\-222.2609\\47\\-25.6508\\-223.9763\\47\\-23.54604\\-225.994\\47\\-21.40775\\-227.7592\\47\\-18.25686\\-229.8614\\47\\-16.29125\\-230.9366\\47\\-14.3218\\-231.8719\\47\\-11.04131\\-233.0871\\47\\-8.609464\\-233.7895\\47\\-5.532891\\-234.4047\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "78" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "28" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.586367\\-233.7692\\49\\-4.514985\\-233.403\\49\\-6.729055\\-233.0348\\49\\-9.032927\\-232.5018\\49\\-11.84868\\-231.6054\\49\\-14.23164\\-230.625\\49\\-16.59274\\-229.4488\\49\\-18.94414\\-227.9973\\49\\-20.4453\\-226.9577\\49\\-22.41385\\-225.3631\\49\\-23.49748\\-224.362\\49\\-25.29828\\-222.4891\\49\\-26.95232\\-220.4763\\49\\-28.30385\\-218.5452\\49\\-29.14141\\-217.1767\\49\\-30.57886\\-214.3882\\49\\-31.96657\\-210.8574\\49\\-32.92613\\-207.0903\\49\\-33.33209\\-204.6764\\49\\-33.51704\\-201.9398\\49\\-33.51541\\-199.7307\\49\\-33.34029\\-197.3005\\49\\-32.72715\\-193.7449\\49\\-32.17788\\-191.8219\\49\\-31.63612\\-190.2728\\49\\-30.92518\\-188.6159\\49\\-29.47046\\-186.1052\\49\\-28.73272\\-185.0459\\49\\-27.46505\\-183.6122\\49\\-26.28099\\-182.5291\\49\\-24.96325\\-181.5919\\49\\-23.78745\\-180.9234\\49\\-21.21263\\-179.9911\\49\\-19.43706\\-179.6503\\49\\-17.06289\\-179.5035\\49\\-15.2568\\-179.5542\\49\\-10.79308\\-180.0697\\49\\-5.359003\\-180.8951\\49\\-1.9823\\-181.1865\\49\\0.4868818\\-181.2394\\49\\2.957352\\-181.1866\\49\\6.328884\\-180.896\\49\\11.76956\\-180.0697\\49\\16.23252\\-179.5542\\49\\18.03996\\-179.5037\\49\\20.36407\\-179.6425\\49\\21.90669\\-179.9239\\49\\23.59489\\-180.4357\\49\\25.01028\\-181.059\\49\\27.27857\\-182.5436\\49\\29.04501\\-184.2726\\49\\30.44515\\-186.1025\\49\\31.90175\\-188.6159\\49\\32.61268\\-190.2728\\49\\33.15444\\-191.8219\\49\\33.70371\\-193.7449\\49\\34.31683\\-197.3083\\49\\34.47989\\-199.67\\49\\34.49369\\-201.9434\\49\\34.28286\\-204.7752\\49\\33.90208\\-207.0959\\49\\32.94308\\-210.8574\\49\\31.5554\\-214.3883\\49\\30.11962\\-217.1731\\49\\29.28031\\-218.5453\\49\\27.86812\\-220.5497\\49\\26.73426\\-221.9643\\49\\25.34393\\-223.4911\\49\\23.36901\\-225.3817\\49\\21.38063\\-226.9917\\49\\20.11714\\-227.8702\\49\\17.56931\\-229.4488\\49\\15.2082\\-230.625\\49\\12.82524\\-231.6054\\49\\10.00915\\-232.502\\49\\8.02219\\-232.9743\\49\\5.513772\\-233.3979\\49\\1.782654\\-233.7549\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "29" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.4788265\\-232.4674\\51\\2.913418\\-232.3855\\51\\6.284549\\-231.978\\51\\8.513913\\-231.5119\\51\\11.24444\\-230.7303\\51\\13.76363\\-229.7963\\51\\15.26823\\-229.0834\\51\\17.53312\\-227.8738\\51\\18.91449\\-227.01\\51\\21.63127\\-224.9897\\51\\23.28301\\-223.5265\\51\\25.27138\\-221.4612\\51\\26.79997\\-219.5609\\51\\28.04951\\-217.7491\\51\\29.70911\\-214.8422\\51\\30.93\\-212.0411\\51\\31.59792\\-210.1046\\51\\32.29706\\-207.4125\\51\\32.70765\\-205.1378\\51\\32.94046\\-202.5233\\51\\32.93384\\-200.3055\\51\\32.72424\\-197.1287\\51\\32.5313\\-195.9349\\51\\31.93222\\-193.2978\\51\\31.28674\\-191.4237\\51\\30.51685\\-189.5914\\51\\29.52436\\-187.8418\\51\\28.43461\\-186.2404\\51\\27.58209\\-185.2284\\51\\26.11936\\-183.8802\\51\\24.04256\\-182.4999\\51\\22.06322\\-181.6479\\51\\20.61372\\-181.2627\\51\\18.3985\\-180.9224\\51\\15.66515\\-180.8663\\51\\12.95305\\-181.0412\\51\\9.919917\\-181.4013\\51\\4.926303\\-181.9264\\51\\1.477127\\-182.1143\\51\\-0.5807838\\-182.1148\\51\\-3.949467\\-181.9264\\51\\-8.943355\\-181.4013\\51\\-11.97649\\-181.0412\\51\\-14.68858\\-180.8663\\51\\-17.42187\\-180.9224\\51\\-19.65405\\-181.2605\\51\\-21.64181\\-181.8331\\51\\-23.06819\\-182.5018\\51\\-24.66653\\-183.5275\\51\\-26.08599\\-184.7231\\51\\-27.03238\\-185.7309\\51\\-27.99373\\-186.9772\\51\\-29.54024\\-189.5913\\51\\-30.31016\\-191.4237\\51\\-30.95569\\-193.298\\51\\-31.53636\\-195.8363\\51\\-31.81158\\-197.7394\\51\\-31.94215\\-199.3501\\51\\-31.99932\\-201.6339\\51\\-31.73083\\-205.139\\51\\-31.32049\\-207.4125\\51\\-30.62136\\-210.1046\\51\\-29.95344\\-212.0411\\51\\-28.74346\\-214.8272\\51\\-27.77425\\-216.5827\\51\\-25.86349\\-219.496\\51\\-24.07564\\-221.6938\\51\\-22.29071\\-223.5446\\51\\-19.51143\\-225.896\\51\\-16.55571\\-227.8749\\51\\-14.29134\\-229.0836\\51\\-12.78707\\-229.7963\\51\\-10.26788\\-230.7303\\51\\-7.537351\\-231.5119\\51\\-5.307986\\-231.978\\51\\-1.734085\\-232.4022\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "74" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "30" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.9877779\\-230.9355\\53\\4.486869\\-230.7041\\53\\7.022734\\-230.2955\\53\\8.944558\\-229.8163\\53\\10.94564\\-229.1848\\53\\13.6383\\-228.0975\\53\\15.52082\\-227.1861\\53\\17.23051\\-226.1865\\53\\18.89039\\-225.078\\53\\21.45873\\-222.9931\\53\\23.6603\\-220.7808\\53\\25.06766\\-219.0926\\53\\26.45644\\-217.1164\\53\\27.6746\\-215.0903\\53\\28.86301\\-212.6291\\53\\29.64749\\-210.5279\\53\\30.28515\\-208.4486\\53\\30.71211\\-206.6179\\53\\31.02842\\-204.5966\\53\\31.20989\\-201.864\\53\\31.16084\\-199.3531\\53\\30.97486\\-197.6067\\53\\30.34172\\-194.4462\\53\\29.17732\\-191.1388\\53\\28.60739\\-189.9997\\53\\27.51967\\-188.2268\\53\\25.83354\\-186.2561\\53\\24.35108\\-184.9746\\53\\22.45431\\-183.8206\\53\\21.29148\\-183.3188\\53\\18.45971\\-182.5389\\53\\15.78529\\-182.2691\\53\\12.69964\\-182.2955\\53\\10.08759\\-182.4671\\53\\7.137596\\-182.7626\\53\\4.822176\\-182.9205\\53\\0.9723852\\-183.0581\\53\\-2.462666\\-182.9866\\53\\-6.189179\\-182.7598\\53\\-9.111023\\-182.4671\\53\\-11.72274\\-182.2956\\53\\-14.80881\\-182.269\\53\\-17.48314\\-182.5389\\53\\-20.3146\\-183.3187\\53\\-21.47771\\-183.8207\\53\\-23.37465\\-184.9749\\53\\-24.86145\\-186.2602\\53\\-26.54256\\-188.2262\\53\\-27.63078\\-189.9996\\53\\-28.20084\\-191.1387\\53\\-28.92394\\-193.0278\\53\\-29.51733\\-195.0057\\53\\-30.0009\\-197.6103\\53\\-30.18413\\-199.3416\\53\\-30.23373\\-201.8548\\53\\-30.08429\\-204.2943\\53\\-29.73396\\-206.6251\\53\\-29.30851\\-208.4488\\53\\-28.67107\\-210.5275\\53\\-27.88404\\-212.6292\\53\\-26.69554\\-215.0875\\53\\-25.48743\\-217.1053\\53\\-24.0894\\-219.0945\\53\\-22.66061\\-220.8107\\53\\-21.50497\\-222.0081\\53\\-19.70906\\-223.6477\\53\\-17.32664\\-225.4926\\53\\-14.55236\\-227.1779\\53\\-12.72484\\-228.0808\\53\\-9.971407\\-229.1838\\53\\-7.967996\\-229.8163\\53\\-6.046172\\-230.2955\\53\\-3.510362\\-230.704\\53\\-1.326811\\-230.8918\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "69" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "31" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.931477\\-229.067\\55\\0.5037407\\-229.1619\\55\\2.909452\\-229.0665\\55\\5.040643\\-228.8164\\55\\7.295846\\-228.3616\\55\\9.425772\\-227.8119\\55\\10.72097\\-227.3606\\55\\13.64646\\-226.1012\\55\\15.88495\\-224.8573\\55\\17.84682\\-223.5394\\55\\18.95674\\-222.6789\\55\\20.60209\\-221.2146\\55\\22.42559\\-219.3141\\55\\23.7379\\-217.6922\\55\\25.53761\\-214.9379\\55\\27.12781\\-211.6854\\55\\28.24475\\-208.4618\\55\\28.70173\\-206.5608\\55\\28.94021\\-205.0969\\55\\29.18653\\-202.0917\\55\\29.12651\\-199.624\\55\\28.92341\\-197.6218\\55\\28.32661\\-194.9262\\55\\27.77718\\-193.2782\\55\\27.01268\\-191.6519\\55\\25.54392\\-189.1922\\55\\24.37959\\-187.8965\\55\\22.95992\\-186.6362\\55\\21.97119\\-185.944\\55\\20.49822\\-185.1757\\55\\19.20589\\-184.6393\\55\\17.796\\-184.2572\\55\\15.15539\\-183.8459\\55\\13.55124\\-183.7513\\55\\10.2443\\-183.7425\\55\\6.348239\\-183.9617\\55\\2.780094\\-184.0823\\55\\-1.817295\\-184.082\\55\\-5.387124\\-183.9629\\55\\-9.268621\\-183.7425\\55\\-13.67699\\-183.7912\\55\\-16.81925\\-184.2571\\55\\-18.22933\\-184.6393\\55\\-19.52166\\-185.1757\\55\\-20.99463\\-185.944\\55\\-21.98336\\-186.6362\\55\\-23.40302\\-187.8965\\55\\-24.56736\\-189.1922\\55\\-26.03612\\-191.6519\\55\\-26.80019\\-193.2778\\55\\-27.45898\\-195.3237\\55\\-27.97836\\-197.8177\\55\\-28.14787\\-199.8485\\55\\-28.2149\\-202.0984\\55\\-28.04641\\-204.4785\\55\\-27.72893\\-206.5652\\55\\-27.26824\\-208.4617\\55\\-26.16336\\-211.6632\\55\\-24.561\\-214.9381\\55\\-22.76068\\-217.6932\\55\\-21.01845\\-219.8008\\55\\-18.59926\\-222.1508\\55\\-16.87041\\-223.5393\\55\\-14.90805\\-224.8582\\55\\-12.66214\\-226.1062\\55\\-10.89876\\-226.896\\55\\-8.444405\\-227.8139\\55\\-6.309231\\-228.363\\55\\-4.051909\\-228.8174\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "32" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.793279\\-226.9717\\57\\-4.598895\\-226.615\\57\\-6.08763\\-226.2953\\57\\-7.991784\\-225.7051\\57\\-10.11324\\-224.9261\\57\\-12.81841\\-223.5908\\57\\-15.02908\\-222.19\\57\\-17.59372\\-220.1392\\57\\-19.75173\\-217.8914\\57\\-21.63069\\-215.4707\\57\\-23.34215\\-212.4236\\57\\-24.35789\\-210.0593\\57\\-25.18137\\-207.4173\\57\\-25.57248\\-205.6027\\57\\-25.89632\\-202.1783\\57\\-25.83419\\-200.2823\\57\\-25.43758\\-197.2175\\57\\-24.93854\\-195.3036\\57\\-24.36317\\-193.7866\\57\\-23.64673\\-192.3625\\57\\-22.72882\\-190.9226\\57\\-21.80332\\-189.8069\\57\\-20.65436\\-188.7135\\57\\-19.54524\\-187.8382\\57\\-17.39332\\-186.6967\\57\\-15.7959\\-186.1086\\57\\-13.6237\\-185.6334\\57\\-11.70106\\-185.3875\\57\\-7.609021\\-185.2267\\57\\-2.400037\\-185.3348\\57\\3.371206\\-185.3348\\57\\8.579274\\-185.2257\\57\\12.67692\\-185.3876\\57\\14.59939\\-185.6335\\57\\16.77251\\-186.1086\\57\\18.36988\\-186.6967\\57\\20.5218\\-187.8382\\57\\21.63092\\-188.7135\\57\\22.77989\\-189.8069\\57\\23.70539\\-190.9226\\57\\24.62329\\-192.3625\\57\\25.33991\\-193.7872\\57\\25.94422\\-195.4058\\57\\26.41677\\-197.2344\\57\\26.81017\\-200.1715\\57\\26.86265\\-201.6363\\57\\26.79383\\-203.5401\\57\\26.54897\\-205.6027\\57\\26.15793\\-207.4173\\57\\25.33446\\-210.0593\\57\\24.31871\\-212.4236\\57\\22.60739\\-215.4704\\57\\21.03864\\-217.5256\\57\\18.57056\\-220.1393\\57\\16.00564\\-222.19\\57\\13.79497\\-223.5908\\57\\11.0898\\-224.9261\\57\\8.967829\\-225.7052\\57\\7.060122\\-226.2962\\57\\4.792458\\-226.7433\\57\\1.316508\\-227.0675\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "57" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "33" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.007898\\-224.1842\\59\\-5.633465\\-223.823\\59\\-7.388333\\-223.2772\\59\\-9.525916\\-222.4253\\59\\-12.24367\\-220.9544\\59\\-13.77391\\-219.9508\\59\\-15.91024\\-218.1614\\59\\-17.46073\\-216.5652\\59\\-19.10684\\-214.4567\\59\\-20.66047\\-211.8987\\59\\-21.75287\\-209.5192\\59\\-22.54363\\-206.882\\59\\-23.04093\\-204.2319\\59\\-23.13367\\-202.0268\\59\\-22.94877\\-199.426\\59\\-22.45282\\-196.7966\\59\\-21.77791\\-195.0977\\59\\-20.90553\\-193.3357\\59\\-20.24132\\-192.3807\\59\\-18.98284\\-190.9573\\59\\-18.16468\\-190.2555\\59\\-15.7657\\-188.727\\59\\-14.14937\\-188.0709\\59\\-11.10525\\-187.3542\\59\\-8.265779\\-187.0049\\59\\-5.726636\\-186.851\\59\\-3.29828\\-186.8177\\59\\6.715771\\-186.8536\\59\\9.642008\\-187.0367\\59\\12.08205\\-187.3533\\59\\15.13399\\-188.0757\\59\\16.74223\\-188.727\\59\\19.14125\\-190.2555\\59\\19.9594\\-190.9573\\59\\21.21788\\-192.3807\\59\\21.88209\\-193.3357\\59\\22.75447\\-195.0977\\59\\23.42877\\-196.7948\\59\\23.92281\\-199.4456\\59\\24.06277\\-200.9095\\59\\24.08795\\-202.9561\\59\\24.00546\\-204.2538\\59\\23.47472\\-207.0727\\59\\22.7294\\-209.5192\\59\\21.63708\\-211.8987\\59\\20.11054\\-214.439\\59\\18.78767\\-216.1893\\59\\16.33028\\-218.6924\\59\\14.76846\\-219.9596\\59\\13.21276\\-220.966\\59\\10.50257\\-222.4254\\59\\8.364835\\-223.2772\\59\\6.610652\\-223.823\\59\\4.977284\\-224.1879\\59\\2.007368\\-224.5406\\59\\0.4325693\\-224.6072\\59\\-1.004857\\-224.5432\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "34" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "1.764367\\-221.4984\\61\\3.654794\\-221.3179\\61\\7.203878\\-220.4183\\61\\9.339288\\-219.5722\\61\\11.9681\\-218.0688\\61\\13.79902\\-216.7584\\61\\16.1487\\-214.3184\\61\\17.52622\\-212.6309\\61\\18.7694\\-210.4807\\61\\19.94951\\-207.6994\\61\\20.42612\\-205.7367\\61\\20.73337\\-203.3174\\61\\20.80488\\-201.5498\\61\\20.64866\\-200.0113\\61\\20.26042\\-198.1714\\61\\19.07385\\-195.3121\\61\\17.64525\\-193.3923\\61\\15.65859\\-191.6211\\61\\13.04623\\-190.3073\\61\\10.32528\\-189.4553\\61\\8.439642\\-189.1374\\61\\5.345034\\-188.8738\\61\\0.4571372\\-188.6552\\61\\-4.352931\\-188.8738\\61\\-7.530559\\-189.145\\61\\-9.348761\\-189.4554\\61\\-10.60953\\-189.7913\\61\\-12.46985\\-190.4942\\61\\-14.68204\\-191.6211\\61\\-16.66868\\-193.3923\\61\\-18.09729\\-195.3121\\61\\-19.2845\\-198.1844\\61\\-19.66375\\-199.9591\\61\\-19.83198\\-201.5849\\61\\-19.75667\\-203.3159\\61\\-19.45048\\-205.7354\\61\\-18.97295\\-207.6994\\61\\-17.77633\\-210.5106\\61\\-16.50928\\-212.6572\\61\\-15.1487\\-214.3571\\61\\-12.88452\\-216.7218\\61\\-11.55351\\-217.7256\\61\\-9.578808\\-218.9419\\61\\-7.648614\\-219.8824\\61\\-5.095757\\-220.774\\61\\-2.682042\\-221.3173\\61\\-0.5944416\\-221.5246\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "35" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.116315\\-217.5211\\63\\2.525019\\-217.4579\\63\\4.246804\\-217.1772\\63\\6.333959\\-216.5989\\63\\8.590102\\-215.5211\\63\\10.15074\\-214.5676\\63\\11.27054\\-213.6739\\63\\13.19327\\-211.6382\\63\\14.96154\\-208.9368\\63\\15.64968\\-207.4078\\63\\16.21769\\-205.4836\\63\\16.57324\\-202.9722\\63\\16.40019\\-202.2493\\63\\16.41231\\-200.831\\63\\15.95592\\-199.0985\\63\\14.74458\\-196.5793\\63\\13.62659\\-195.1967\\63\\12.09371\\-194.0262\\63\\10.4419\\-193.0549\\63\\8.833938\\-192.4071\\63\\7.166197\\-191.9658\\63\\4.288877\\-191.4669\\63\\2.13356\\-191.2932\\63\\-0.7566112\\-191.2767\\63\\-3.418837\\-191.4973\\63\\-6.217521\\-191.9706\\63\\-7.865997\\-192.4099\\63\\-9.935484\\-193.2915\\63\\-11.92157\\-194.5695\\63\\-12.6587\\-195.2066\\63\\-13.77571\\-196.5776\\63\\-14.97968\\-199.098\\63\\-15.43575\\-200.8311\\63\\-15.42365\\-202.2478\\63\\-15.59671\\-202.9725\\63\\-15.24105\\-205.483\\63\\-14.67312\\-207.4078\\63\\-13.985\\-208.9368\\63\\-12.4394\\-211.3325\\63\\-10.295\\-213.6731\\63\\-9.101588\\-214.6196\\63\\-8.217945\\-215.14\\63\\-5.360232\\-216.5986\\63\\-3.26926\\-217.1783\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "36" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.5933019\\-211.6764\\65\\1.5833\\-211.6789\\65\\2.160541\\-211.4577\\65\\2.975951\\-211.5574\\65\\5.119955\\-210.6432\\65\\6.759023\\-209.634\\65\\7.755369\\-208.6972\\65\\8.492185\\-207.7591\\65\\9.450212\\-205.9687\\65\\9.887464\\-204.6694\\65\\10.13643\\-203.2983\\65\\9.873201\\-201.1\\65\\8.385763\\-198.5388\\65\\7.587423\\-197.7187\\65\\6.257915\\-197.046\\65\\3.591137\\-196.0411\\65\\2.492168\\-195.7818\\65\\0.6393334\\-195.6101\\65\\-1.485472\\-195.7764\\65\\-2.646059\\-196.0535\\65\\-4.571265\\-196.7523\\65\\-6.576953\\-197.6478\\65\\-7.758991\\-199.0457\\65\\-8.613137\\-200.4699\\65\\-9.128022\\-201.8906\\65\\-9.161495\\-203.2404\\65\\-8.908936\\-204.6779\\65\\-8.082075\\-206.8487\\65\\-6.786169\\-208.657\\65\\-5.777151\\-209.6353\\65\\-4.145667\\-210.6442\\65\\-1.99099\\-211.5607\\65\\-1.183566\\-211.4585\\65" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "5" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "128\\64\\64" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "13.69339\\-153.7846\\-71\\13.55374\\-151.832\\-71\\13.13763\\-149.9193\\-71\\12.45355\\-148.0851\\-71\\11.5154\\-146.3671\\-71\\10.34229\\-144.8\\-71\\8.958109\\-143.4158\\-71\\7.391023\\-142.2427\\-71\\5.672937\\-141.3045\\-71\\3.838827\\-140.6204\\-71\\1.92603\\-140.2043\\-71\\-0.02651533\\-140.0647\\-71\\-1.979061\\-140.2043\\-71\\-3.891858\\-140.6204\\-71\\-5.725968\\-141.3045\\-71\\-7.444054\\-142.2427\\-71\\-9.01114\\-143.4158\\-71\\-10.39532\\-144.8\\-71\\-11.56843\\-146.3671\\-71\\-12.50658\\-148.0851\\-71\\-13.19066\\-149.9193\\-71\\-13.60677\\-151.832\\-71\\-13.74642\\-153.7846\\-71\\-13.60677\\-155.7371\\-71\\-13.19066\\-157.6499\\-71\\-12.50658\\-159.484\\-71\\-11.56843\\-161.2021\\-71\\-10.39532\\-162.7692\\-71\\-9.01114\\-164.1534\\-71\\-7.444054\\-165.3265\\-71\\-5.725968\\-166.2646\\-71\\-3.891858\\-166.9487\\-71\\-1.979061\\-167.3648\\-71\\-0.02651533\\-167.5045\\-71\\1.92603\\-167.3648\\-71\\3.838827\\-166.9487\\-71\\5.672937\\-166.2646\\-71\\7.391023\\-165.3265\\-71\\8.958109\\-164.1534\\-71\\10.34229\\-162.7692\\-71\\11.5154\\-161.2021\\-71\\12.45355\\-159.484\\-71\\13.13763\\-157.6499\\-71\\13.55374\\-155.7371\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-5.148041\\-165.9794\\-69\\-5.15705\\-165.9716\\-69\\-7.148041\\-164.7573\\-69\\-8.215205\\-163.9716\\-69\\-9.148041\\-163.2319\\-69\\-10.30565\\-161.9716\\-69\\-11.14804\\-160.8723\\-69\\-11.81296\\-159.9716\\-69\\-12.55688\\-157.9716\\-69\\-13.14804\\-156.3745\\-69\\-13.33953\\-155.9716\\-69\\-13.65681\\-153.9716\\-69\\-13.60259\\-151.9716\\-69\\-13.14804\\-150.3049\\-69\\-13.03693\\-149.9716\\-69\\-12.3037\\-147.9716\\-69\\-11.47041\\-145.9716\\-69\\-11.14804\\-145.6113\\-69\\-9.866431\\-143.9716\\-69\\-9.148041\\-143.2319\\-69\\-7.387711\\-141.9716\\-69\\-7.148041\\-141.7673\\-69\\-5.148041\\-140.745\\-69\\-3.148041\\-140.1884\\-69\\-2.488467\\-139.9716\\-69\\-1.148041\\-139.5753\\-69\\0.8519591\\-139.5077\\-69\\2.851959\\-139.9034\\-69\\2.99712\\-139.9716\\-69\\4.851959\\-140.5932\\-69\\6.851959\\-141.3352\\-69\\7.781647\\-141.9716\\-69\\8.851959\\-142.7456\\-69\\10.12097\\-143.9716\\-69\\10.85196\\-144.7939\\-69\\11.71669\\-145.9716\\-69\\12.59853\\-147.9716\\-69\\12.85196\\-148.4069\\-69\\13.53753\\-149.9716\\-69\\13.78946\\-151.9716\\-69\\13.81931\\-153.9716\\-69\\13.66591\\-155.9716\\-69\\13.09334\\-157.9716\\-69\\12.85196\\-158.3018\\-69\\11.97572\\-159.9716\\-69\\10.85196\\-161.759\\-69\\10.66047\\-161.9716\\-69\\8.851959\\-163.8889\\-69\\8.764658\\-163.9716\\-69\\6.851959\\-165.1415\\-69\\5.351959\\-165.9716\\-69\\4.851959\\-166.3369\\-69\\2.851959\\-166.7397\\-69\\0.8519591\\-166.9805\\-69\\-1.148041\\-166.9536\\-69\\-3.148041\\-166.6639\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.148041\\-166.1237\\-67\\-3.431825\\-165.9716\\-67\\-5.148041\\-165.3066\\-67\\-7.148041\\-164.225\\-67\\-7.434863\\-163.9716\\-67\\-9.148041\\-162.6639\\-67\\-9.816612\\-161.9716\\-67\\-11.14804\\-160.2064\\-67\\-11.36482\\-159.9716\\-67\\-12.2759\\-157.9716\\-67\\-12.84804\\-155.9716\\-67\\-13.14804\\-154.8466\\-67\\-13.38942\\-153.9716\\-67\\-13.40147\\-151.9716\\-67\\-13.14804\\-150.9438\\-67\\-12.90666\\-149.9716\\-67\\-12.30225\\-147.9716\\-67\\-11.58362\\-145.9716\\-67\\-11.14804\\-145.4571\\-67\\-10.01544\\-143.9716\\-67\\-9.148041\\-143.0314\\-67\\-7.83693\\-141.9716\\-67\\-7.148041\\-141.4371\\-67\\-5.148041\\-140.4261\\-67\\-4.0451\\-139.9716\\-67\\-3.148041\\-139.5855\\-67\\-1.148041\\-139.1744\\-67\\0.8519591\\-139.11\\-67\\2.851959\\-139.2997\\-67\\4.851959\\-139.9637\\-67\\4.86206\\-139.9716\\-67\\6.851959\\-140.9232\\-67\\8.587959\\-141.9716\\-67\\8.851959\\-142.2007\\-67\\10.66047\\-143.9716\\-67\\10.85196\\-144.1746\\-67\\12.02353\\-145.9716\\-67\\12.85196\\-147.522\\-67\\13.17433\\-147.9716\\-67\\13.73354\\-149.9716\\-67\\13.90175\\-151.9716\\-67\\13.89704\\-153.9716\\-67\\13.70846\\-155.9716\\-67\\13.08113\\-157.9716\\-67\\12.85196\\-158.2662\\-67\\11.89696\\-159.9716\\-67\\10.85196\\-161.4538\\-67\\10.40684\\-161.9716\\-67\\8.851959\\-163.5077\\-67\\8.281589\\-163.9716\\-67\\6.851959\\-164.8777\\-67\\4.851959\\-165.7181\\-67\\4.140421\\-165.9716\\-67\\2.851959\\-166.3877\\-67\\0.8519591\\-166.6966\\-67\\-1.148041\\-166.6365\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.148041\\-166.0397\\-65\\-1.321118\\-165.9716\\-65\\-3.148041\\-165.4287\\-65\\-5.148041\\-164.9246\\-65\\-6.640688\\-163.9716\\-65\\-7.148041\\-163.5456\\-65\\-9.148041\\-162.025\\-65\\-9.201476\\-161.9716\\-65\\-10.73189\\-159.9716\\-65\\-11.14804\\-159.4678\\-65\\-12.04444\\-157.9716\\-65\\-12.52642\\-155.9716\\-65\\-13.00935\\-153.9716\\-65\\-13.14804\\-152.0716\\-65\\-13.15585\\-151.9716\\-65\\-13.14804\\-151.9345\\-65\\-12.80389\\-149.9716\\-65\\-12.30082\\-147.9716\\-65\\-11.6909\\-145.9716\\-65\\-11.14804\\-145.293\\-65\\-10.164\\-143.9716\\-65\\-9.148041\\-142.8279\\-65\\-8.18831\\-141.9716\\-65\\-7.148041\\-141.1767\\-65\\-5.221811\\-139.9716\\-65\\-5.148041\\-139.9034\\-65\\-3.148041\\-139.2216\\-65\\-1.148041\\-138.9093\\-65\\0.8519591\\-138.8471\\-65\\2.851959\\-138.9716\\-65\\4.851959\\-139.3425\\-65\\6.070709\\-139.9716\\-65\\6.851959\\-140.4261\\-65\\8.851959\\-141.5456\\-65\\9.302939\\-141.9716\\-65\\10.85196\\-143.5105\\-65\\11.28754\\-143.9716\\-65\\12.42603\\-145.9716\\-65\\12.85196\\-146.648\\-65\\13.54427\\-147.9716\\-65\\13.89451\\-149.9716\\-65\\14.03251\\-151.9716\\-65\\13.98028\\-153.9716\\-65\\13.74326\\-155.9716\\-65\\13.08113\\-157.9716\\-65\\12.85196\\-158.2512\\-65\\11.81625\\-159.9716\\-65\\10.85196\\-161.1988\\-65\\10.16805\\-161.9716\\-65\\8.851959\\-163.2094\\-65\\7.791809\\-163.9716\\-65\\6.851959\\-164.6295\\-65\\4.851959\\-165.2928\\-65\\2.851959\\-165.7801\\-65\\1.951959\\-165.9716\\-65\\0.8519591\\-166.2007\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "14.39637\\-151.9821\\-63\\14.25672\\-150.0296\\-63\\13.84062\\-148.1168\\-63\\13.15653\\-146.2827\\-63\\12.21838\\-144.5646\\-63\\11.04528\\-142.9975\\-63\\9.661092\\-141.6133\\-63\\8.094006\\-140.4402\\-63\\6.37592\\-139.5021\\-63\\4.54181\\-138.818\\-63\\2.629012\\-138.4019\\-63\\0.6764669\\-138.2622\\-63\\-1.276079\\-138.4019\\-63\\-3.188876\\-138.818\\-63\\-5.022986\\-139.5021\\-63\\-6.741072\\-140.4402\\-63\\-8.308158\\-141.6133\\-63\\-9.692343\\-142.9975\\-63\\-10.86545\\-144.5646\\-63\\-11.80359\\-146.2827\\-63\\-12.48768\\-148.1168\\-63\\-12.90379\\-150.0296\\-63\\-13.04343\\-151.9821\\-63\\-12.90379\\-153.9347\\-63\\-12.48768\\-155.8475\\-63\\-11.80359\\-157.6816\\-63\\-10.86545\\-159.3997\\-63\\-9.692343\\-160.9668\\-63\\-8.308158\\-162.351\\-63\\-6.741072\\-163.524\\-63\\-5.022986\\-164.4622\\-63\\-3.188876\\-165.1463\\-63\\-1.276079\\-165.5624\\-63\\0.6764669\\-165.702\\-63\\2.629012\\-165.5624\\-63\\4.54181\\-165.1463\\-63\\6.37592\\-164.4622\\-63\\8.094006\\-163.524\\-63\\9.661092\\-162.351\\-63\\11.04528\\-160.9668\\-63\\12.21838\\-159.3997\\-63\\13.15653\\-157.6816\\-63\\13.84062\\-155.8475\\-63\\14.25672\\-153.9347\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.148041\\-164.6571\\-61\\-4.969959\\-163.9716\\-61\\-5.148041\\-163.8745\\-61\\-7.148041\\-162.5874\\-61\\-7.833576\\-161.9716\\-61\\-9.148041\\-160.7201\\-61\\-9.838649\\-159.9716\\-61\\-11.14804\\-158.1054\\-61\\-11.27304\\-157.9716\\-61\\-12.02598\\-155.9716\\-61\\-12.46928\\-153.9716\\-61\\-12.6306\\-151.9716\\-61\\-12.52642\\-149.9716\\-61\\-12.24496\\-147.9716\\-61\\-11.77707\\-145.9716\\-61\\-11.14804\\-145.1358\\-61\\-10.32063\\-143.9716\\-61\\-9.148041\\-142.4618\\-61\\-8.679291\\-141.9716\\-61\\-7.148041\\-140.6614\\-61\\-6.170768\\-139.9716\\-61\\-5.148041\\-139.2793\\-61\\-3.148041\\-138.6705\\-61\\-1.148041\\-138.2129\\-61\\0.6940643\\-137.9716\\-61\\0.8519591\\-137.9483\\-61\\1.001959\\-137.9716\\-61\\2.851959\\-138.225\\-61\\4.851959\\-138.6772\\-61\\6.851959\\-139.3499\\-61\\7.771959\\-139.9716\\-61\\8.851959\\-140.7093\\-61\\10.2605\\-141.9716\\-61\\10.85196\\-142.6314\\-61\\11.90543\\-143.9716\\-61\\12.85196\\-145.4344\\-61\\13.25821\\-145.9716\\-61\\13.83077\\-147.9716\\-61\\14.03251\\-149.9716\\-61\\14.09586\\-151.9716\\-61\\14.00061\\-153.9716\\-61\\13.68758\\-155.9716\\-61\\12.85196\\-157.6818\\-61\\12.63518\\-157.9716\\-61\\11.36073\\-159.9716\\-61\\10.85196\\-160.5119\\-61\\9.33583\\-161.9716\\-61\\8.851959\\-162.4261\\-61\\6.851959\\-163.7063\\-61\\6.393136\\-163.9716\\-61\\4.851959\\-164.6503\\-61\\2.851959\\-164.9941\\-61\\0.8519591\\-165.1151\\-61\\-1.148041\\-165.0168\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.148041\\-164.1102\\-59\\-3.415647\\-163.9716\\-59\\-5.148041\\-163.3031\\-59\\-7.139911\\-161.9716\\-59\\-7.148041\\-161.9637\\-59\\-9.148041\\-160.1237\\-59\\-9.300215\\-159.9716\\-59\\-10.63927\\-157.9716\\-59\\-11.14804\\-157.143\\-59\\-11.79883\\-155.9716\\-59\\-12.29669\\-153.9716\\-59\\-12.42945\\-151.9716\\-59\\-12.39194\\-149.9716\\-59\\-12.19465\\-147.9716\\-59\\-11.7844\\-145.9716\\-59\\-11.14804\\-145.1216\\-59\\-10.34304\\-143.9716\\-59\\-9.148041\\-142.2765\\-59\\-8.85945\\-141.9716\\-59\\-7.148041\\-140.4537\\-59\\-6.520134\\-139.9716\\-59\\-5.148041\\-139.1406\\-59\\-3.148041\\-138.3474\\-59\\-1.991178\\-137.9716\\-59\\-1.148041\\-137.683\\-59\\0.8519591\\-137.4541\\-59\\2.851959\\-137.6274\\-59\\3.891175\\-137.9716\\-59\\4.851959\\-138.2939\\-59\\6.851959\\-139.111\\-59\\8.356161\\-139.9716\\-59\\8.851959\\-140.3474\\-59\\10.64773\\-141.9716\\-59\\10.85196\\-142.1999\\-59\\12.09505\\-143.9716\\-59\\12.85196\\-145.1132\\-59\\13.42738\\-145.9716\\-59\\13.85196\\-147.9716\\-59\\13.99546\\-149.9716\\-59\\14.01105\\-151.9716\\-59\\13.92004\\-153.9716\\-59\\13.57055\\-155.9716\\-59\\12.85196\\-157.1732\\-59\\12.3091\\-157.9716\\-59\\10.87521\\-159.9716\\-59\\10.85196\\-159.9948\\-59\\8.851959\\-161.8061\\-59\\8.677716\\-161.9716\\-59\\6.851959\\-163.2535\\-59\\5.143098\\-163.9716\\-59\\4.851959\\-164.137\\-59\\2.851959\\-164.6902\\-59\\0.8519591\\-164.8609\\-59\\-1.148041\\-164.7154\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.271281\\-164.1144\\-57\\-3.771281\\-163.4351\\-57\\-5.271281\\-162.8887\\-57\\-7.271281\\-161.4484\\-57\\-8.981404\\-159.8185\\-57\\-9.903447\\-158.8185\\-57\\-11.98291\\-154.8185\\-57\\-12.37776\\-152.3185\\-57\\-12.43219\\-150.3185\\-57\\-12.01284\\-146.8185\\-57\\-11.32857\\-145.3185\\-57\\-9.486599\\-142.3185\\-57\\-7.271281\\-140.0635\\-57\\-5.271281\\-139.0502\\-57\\-3.771281\\-138.1114\\-57\\-2.771281\\-137.7305\\-57\\0.7287188\\-137.2339\\-57\\2.728719\\-137.3661\\-57\\4.728719\\-137.7029\\-57\\6.728719\\-138.6215\\-57\\8.728719\\-139.7457\\-57\\9.228719\\-140.1428\\-57\\11.37872\\-142.3185\\-57\\12.43545\\-143.8185\\-57\\13.40675\\-145.8185\\-57\\13.82006\\-147.3185\\-57\\14.01332\\-148.8185\\-57\\14.06249\\-150.8185\\-57\\13.93082\\-153.3185\\-57\\13.4018\\-155.8185\\-57\\12.34539\\-157.8185\\-57\\10.72872\\-159.8165\\-57\\8.228719\\-161.9943\\-57\\6.728719\\-163.0251\\-57\\5.728719\\-163.4045\\-57\\3.728719\\-163.957\\-57\\0.7287188\\-164.4045\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.7712812\\-162.3907\\-55\\-2.771281\\-161.903\\-55\\-5.271281\\-160.9637\\-55\\-7.271281\\-159.5261\\-55\\-9.465337\\-157.3185\\-55\\-10.46659\\-155.8185\\-55\\-11.481\\-153.8185\\-55\\-11.95412\\-152.3185\\-55\\-12.15075\\-150.3185\\-55\\-12.18795\\-148.8185\\-55\\-12.09488\\-146.8185\\-55\\-11.85187\\-145.3185\\-55\\-11.49982\\-144.3185\\-55\\-10.3678\\-142.3185\\-55\\-9.396281\\-140.8185\\-55\\-7.771281\\-138.9171\\-55\\-6.771281\\-138.0685\\-55\\-4.771281\\-137.0019\\-55\\-3.271281\\-136.0665\\-55\\-1.271281\\-135.5645\\-55\\0.7287188\\-135.3013\\-55\\2.728719\\-135.3946\\-55\\4.728719\\-135.7281\\-55\\6.296901\\-136.3185\\-55\\8.728719\\-137.673\\-55\\10.72872\\-139.5331\\-55\\11.93449\\-140.8185\\-55\\12.9705\\-142.3185\\-55\\13.44804\\-143.3185\\-55\\13.92794\\-144.8185\\-55\\14.32267\\-146.8185\\-55\\14.48337\\-148.3185\\-55\\14.39841\\-150.3185\\-55\\13.92515\\-152.8185\\-55\\13.32778\\-154.8185\\-55\\12.44833\\-156.3185\\-55\\11.34338\\-157.8185\\-55\\10.22872\\-158.9868\\-55\\6.728719\\-161.3464\\-55\\4.728719\\-161.9753\\-55\\2.728719\\-162.3988\\-55\\0.7287188\\-162.5742\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.771281\\-160.4794\\-53\\-3.271281\\-160.0187\\-53\\-5.271281\\-159.106\\-53\\-6.271281\\-158.4856\\-53\\-7.67889\\-157.3185\\-53\\-8.771281\\-156.216\\-53\\-9.921006\\-154.8185\\-53\\-10.53123\\-153.8185\\-53\\-11.45093\\-151.8185\\-53\\-11.91314\\-150.3185\\-53\\-12.10858\\-148.8185\\-53\\-12.22991\\-146.8185\\-53\\-11.97614\\-144.3185\\-53\\-11.38256\\-142.3185\\-53\\-10.95748\\-141.3185\\-53\\-9.791958\\-139.3185\\-53\\-8.771281\\-138.0747\\-53\\-7.271281\\-136.6074\\-53\\-5.271281\\-135.212\\-53\\-3.271281\\-134.2706\\-53\\-1.271281\\-133.6957\\-53\\1.228719\\-133.4974\\-53\\3.228719\\-133.5724\\-53\\4.228719\\-133.7169\\-53\\5.728719\\-134.1446\\-53\\7.228719\\-134.7095\\-53\\8.228719\\-135.2521\\-53\\9.728719\\-136.2738\\-53\\11.39702\\-137.8185\\-53\\12.27336\\-138.8185\\-53\\13.30653\\-140.3185\\-53\\13.8515\\-141.3185\\-53\\14.40837\\-142.8185\\-53\\14.82524\\-144.3185\\-53\\15.06075\\-146.8185\\-53\\14.99249\\-148.8185\\-53\\14.8515\\-149.8185\\-53\\13.90512\\-152.8185\\-53\\12.42455\\-155.3185\\-53\\11.72872\\-156.1313\\-53\\9.728719\\-158.0586\\-53\\7.228719\\-159.5793\\-53\\4.728719\\-160.4521\\-53\\1.228719\\-160.8757\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.7287188\\-160.9344\\-51\\-1.271281\\-160.5247\\-51\\-3.771281\\-159.6612\\-51\\-4.771281\\-159.4098\\-51\\-6.271281\\-158.4668\\-51\\-8.125693\\-156.8185\\-51\\-9.964287\\-154.8185\\-51\\-11.27128\\-152.3339\\-51\\-11.95253\\-150.8185\\-51\\-12.24703\\-148.3185\\-51\\-12.30253\\-146.8185\\-51\\-11.91314\\-143.3185\\-51\\-11.51654\\-142.3185\\-51\\-10.61775\\-140.8185\\-51\\-9.846281\\-139.3185\\-51\\-9.099493\\-138.3185\\-51\\-7.624832\\-136.8185\\-51\\-6.771281\\-136.1162\\-51\\-4.771281\\-135.0282\\-51\\-3.271281\\-134.1122\\-51\\-1.271281\\-133.6372\\-51\\0.7287188\\-133.5338\\-51\\2.728719\\-133.5591\\-51\\4.728719\\-133.7492\\-51\\6.228719\\-134.2942\\-51\\8.728719\\-135.6202\\-51\\10.72872\\-137.3014\\-51\\11.72872\\-138.4046\\-51\\13.27978\\-140.3185\\-51\\13.9018\\-141.8185\\-51\\14.16837\\-142.8185\\-51\\14.92515\\-144.8185\\-51\\15.12716\\-146.8185\\-51\\14.91313\\-149.3185\\-51\\13.94546\\-152.3185\\-51\\13.2565\\-153.8185\\-51\\12.34769\\-155.3185\\-51\\11.22872\\-156.6797\\-51\\9.728719\\-157.9801\\-51\\8.228719\\-158.9643\\-51\\7.228719\\-159.4562\\-51\\4.228719\\-160.4297\\-51\\2.228719\\-160.8631\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.771281\\-160.5362\\-49\\-2.771281\\-160.126\\-49\\-4.771281\\-159.5163\\-49\\-5.771281\\-158.9917\\-49\\-7.211929\\-157.8185\\-49\\-8.849406\\-156.3185\\-49\\-10.43012\\-154.3185\\-49\\-11.48175\\-152.3185\\-49\\-12.01805\\-150.8185\\-49\\-12.32234\\-148.8185\\-49\\-12.37034\\-146.3185\\-49\\-11.85732\\-142.8185\\-49\\-9.880177\\-139.3185\\-49\\-9.118665\\-138.3185\\-49\\-7.771281\\-136.9865\\-49\\-6.771281\\-136.1436\\-49\\-3.771281\\-134.5172\\-49\\-3.271281\\-134.1488\\-49\\-1.271281\\-133.6807\\-49\\0.7287188\\-133.5674\\-49\\2.728719\\-133.5993\\-49\\4.728719\\-133.9018\\-49\\6.728719\\-134.6891\\-49\\8.728719\\-135.7245\\-49\\10.53541\\-137.3185\\-49\\12.38943\\-139.3185\\-49\\13.43509\\-140.8185\\-49\\14.43647\\-143.8185\\-49\\14.85372\\-145.3185\\-49\\15.01849\\-146.8185\\-49\\14.93082\\-148.8185\\-49\\14.57146\\-149.8185\\-49\\13.91313\\-152.3185\\-49\\12.94924\\-154.3185\\-49\\11.22872\\-156.6811\\-49\\9.728719\\-157.9994\\-49\\8.228719\\-159.0063\\-49\\6.228719\\-159.8848\\-49\\2.728719\\-160.9662\\-49\\0.7287188\\-161.0388\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.771281\\-160.4273\\-47\\-5.271281\\-159.399\\-47\\-6.771281\\-158.4478\\-47\\-8.083393\\-157.3185\\-47\\-9.921006\\-155.3185\\-47\\-11.39847\\-152.8185\\-47\\-11.96031\\-151.3185\\-47\\-12.41907\\-149.3185\\-47\\-12.5203\\-147.3185\\-47\\-12.42292\\-145.3185\\-47\\-11.97885\\-143.3185\\-47\\-11.42669\\-141.8185\\-47\\-10.32234\\-139.8185\\-47\\-9.271281\\-138.4354\\-47\\-7.643116\\-136.8185\\-47\\-6.271281\\-135.7706\\-47\\-4.271281\\-134.6848\\-47\\-2.771281\\-134.1192\\-47\\-0.7712812\\-133.6766\\-47\\1.228719\\-133.5776\\-47\\3.228719\\-133.6957\\-47\\5.228719\\-134.1505\\-47\\6.728719\\-134.7169\\-47\\9.228719\\-136.1891\\-47\\10.22872\\-137.0286\\-47\\11.50725\\-138.3185\\-47\\12.32524\\-139.3185\\-47\\13.50587\\-141.3185\\-47\\14.31205\\-143.3185\\-47\\14.83276\\-145.8185\\-47\\14.92659\\-147.3185\\-47\\14.82524\\-148.8185\\-47\\14.42075\\-150.8185\\-47\\13.92515\\-152.3185\\-47\\12.93467\\-154.3185\\-47\\11.90026\\-155.8185\\-47\\10.22872\\-157.5495\\-47\\8.228719\\-159.0278\\-47\\6.68751\\-159.8185\\-47\\4.728719\\-160.5219\\-47\\2.728719\\-160.9249\\-47\\1.228719\\-161.0191\\-47\\-0.2712812\\-160.9273\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.271281\\-159.9757\\-45\\-3.771281\\-159.5566\\-45\\-5.271281\\-158.9994\\-45\\-7.271281\\-157.4532\\-45\\-9.347207\\-155.3185\\-45\\-10.43747\\-153.8185\\-45\\-11.92669\\-150.8185\\-45\\-12.27323\\-148.3185\\-45\\-12.34628\\-146.8185\\-45\\-11.90907\\-142.8185\\-45\\-9.771281\\-138.8207\\-45\\-9.434689\\-138.3185\\-45\\-7.271281\\-136.186\\-45\\-3.771281\\-134.1264\\-45\\-1.771281\\-133.5841\\-45\\0.7287188\\-133.3391\\-45\\4.728719\\-133.6122\\-45\\6.728719\\-134.2219\\-45\\8.228719\\-135.0745\\-45\\9.728719\\-136.1583\\-45\\10.93011\\-137.3185\\-45\\12.29208\\-138.8185\\-45\\13.36414\\-140.3185\\-45\\13.92369\\-141.8185\\-45\\14.89841\\-144.8185\\-45\\15.05232\\-146.8185\\-45\\14.91468\\-148.8185\\-45\\14.05397\\-151.3185\\-45\\13.82778\\-152.3185\\-45\\13.3352\\-153.3185\\-45\\12.36054\\-154.8185\\-45\\10.72872\\-156.8978\\-45\\9.228719\\-158.0096\\-45\\7.728719\\-158.9456\\-45\\6.728719\\-159.4321\\-45\\4.728719\\-160.0075\\-45\\2.728719\\-160.4175\\-45\\0.7287188\\-160.512\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.771281\\-159.4847\\-43\\-4.271281\\-158.9249\\-43\\-5.271281\\-158.3877\\-43\\-7.271281\\-156.9082\\-43\\-9.271281\\-154.7764\\-43\\-9.98719\\-153.8185\\-43\\-11.37284\\-151.3185\\-43\\-11.90907\\-149.8185\\-43\\-12.18524\\-146.8185\\-43\\-12.11402\\-144.8185\\-43\\-11.89628\\-142.8185\\-43\\-10.0982\\-139.3185\\-43\\-9.946152\\-138.8185\\-43\\-9.271281\\-137.9948\\-43\\-7.636188\\-136.3185\\-43\\-5.271281\\-134.5922\\-43\\-3.271281\\-133.6026\\-43\\-1.271281\\-133.154\\-43\\0.7287188\\-132.9175\\-43\\2.728719\\-132.9981\\-43\\4.228719\\-133.1668\\-43\\6.228719\\-133.6325\\-43\\7.728719\\-134.2674\\-43\\9.228719\\-135.2188\\-43\\10.50267\\-136.3185\\-43\\12.3939\\-138.3185\\-43\\13.36443\\-139.8185\\-43\\13.87455\\-140.8185\\-43\\14.14001\\-141.8185\\-43\\14.90512\\-143.8185\\-43\\15.10372\\-144.8185\\-43\\15.27336\\-146.8185\\-43\\14.97543\\-148.8185\\-43\\13.49547\\-152.8185\\-43\\12.9028\\-153.8185\\-43\\10.87266\\-156.3185\\-43\\8.728719\\-158.0166\\-43\\6.728719\\-159.0696\\-43\\5.228719\\-159.5479\\-43\\2.728719\\-159.9478\\-43\\0.7287188\\-159.9829\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.271281\\-159.4829\\-41\\-3.271281\\-158.8726\\-41\\-5.271281\\-157.8497\\-41\\-7.170254\\-156.3185\\-41\\-9.271281\\-154.1263\\-41\\-10.52356\\-152.3185\\-41\\-11.41514\\-150.3185\\-41\\-12\\-148.3185\\-41\\-12.06371\\-144.8185\\-41\\-11.85187\\-142.8185\\-41\\-11.44603\\-141.8185\\-41\\-10.63766\\-140.3185\\-41\\-10.02244\\-138.8185\\-41\\-9.346281\\-137.8185\\-41\\-8.45844\\-136.8185\\-41\\-7.271281\\-135.6967\\-41\\-5.271281\\-134.136\\-41\\-4.271281\\-133.6913\\-41\\-1.271281\\-132.634\\-41\\0.7287188\\-132.2002\\-41\\2.728719\\-132.2521\\-41\\4.228719\\-132.5902\\-41\\6.228719\\-133.2351\\-41\\8.728719\\-134.2072\\-41\\11.22872\\-136.4643\\-41\\12.93227\\-138.3185\\-41\\13.27336\\-138.8185\\-41\\14.95854\\-142.8185\\-41\\15.38781\\-144.8185\\-41\\15.35591\\-147.3185\\-41\\14.89841\\-149.3185\\-41\\14.60818\\-149.8185\\-41\\13.44638\\-152.8185\\-41\\12.36761\\-154.3185\\-41\\10.72872\\-156.067\\-41\\9.728719\\-156.979\\-41\\8.228719\\-157.9997\\-41\\6.228719\\-158.8818\\-41\\4.728719\\-159.42\\-41\\2.728719\\-159.5921\\-41\\0.7287188\\-159.5993\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.771281\\-158.5638\\-39\\-4.271281\\-157.9542\\-39\\-5.271281\\-157.4098\\-39\\-7.271281\\-155.9649\\-39\\-8.426606\\-154.8185\\-39\\-9.965292\\-152.8185\\-39\\-10.96479\\-150.8185\\-39\\-11.49531\\-149.3185\\-39\\-11.92669\\-147.3185\\-39\\-12.00115\\-145.3185\\-39\\-11.91711\\-143.8185\\-39\\-11.48019\\-141.8185\\-39\\-10.93575\\-140.3185\\-39\\-9.924596\\-138.3185\\-39\\-8.367061\\-136.3185\\-39\\-7.271281\\-135.2373\\-39\\-5.771281\\-134.128\\-39\\-4.271281\\-133.2804\\-39\\-2.771281\\-132.6462\\-39\\-0.7712812\\-132.1057\\-39\\1.728719\\-131.9249\\-39\\4.728719\\-132.2144\\-39\\6.228719\\-132.6575\\-39\\7.728719\\-133.2907\\-39\\9.228719\\-134.136\\-39\\10.72872\\-135.2581\\-39\\11.79798\\-136.3185\\-39\\13.37057\\-138.3185\\-39\\14.37844\\-140.3185\\-39\\14.91622\\-141.8185\\-39\\15.35591\\-143.8185\\-39\\15.45033\\-145.3185\\-39\\15.36855\\-147.3185\\-39\\14.93494\\-149.3185\\-39\\14.39841\\-150.8185\\-39\\13.40526\\-152.8185\\-39\\11.86842\\-154.8185\\-39\\10.72872\\-155.9523\\-39\\8.728719\\-157.3934\\-39\\7.728719\\-157.9435\\-39\\6.228719\\-158.5452\\-39\\4.728719\\-159.0044\\-39\\1.728719\\-159.3126\\-39\\-0.7712812\\-159.0847\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.7287188\\-159.3848\\-37\\-1.771281\\-158.9603\\-37\\-3.271281\\-158.2324\\-37\\-5.271281\\-157.495\\-37\\-7.271281\\-155.9742\\-37\\-8.921281\\-154.3185\\-37\\-10.37284\\-152.3185\\-37\\-11.50318\\-149.8185\\-37\\-11.98151\\-148.3185\\-37\\-12.13145\\-146.3185\\-37\\-12.13145\\-144.8185\\-37\\-11.98019\\-142.8185\\-37\\-11.50073\\-141.3185\\-37\\-10.35461\\-138.8185\\-37\\-8.905896\\-136.8185\\-37\\-7.271281\\-135.195\\-37\\-5.271281\\-133.6869\\-37\\-3.271281\\-132.899\\-37\\-1.771281\\-132.1869\\-37\\0.7287188\\-131.8088\\-37\\2.728719\\-131.8531\\-37\\4.728719\\-132.115\\-37\\9.228719\\-134.2643\\-37\\10.72872\\-135.5533\\-37\\12.39024\\-137.3185\\-37\\13.45081\\-138.8185\\-37\\14.88598\\-142.3185\\-37\\15.37257\\-144.8185\\-37\\15.32006\\-146.8185\\-37\\14.89319\\-148.8185\\-37\\13.22872\\-152.718\\-37\\12.41455\\-153.8185\\-37\\10.72872\\-155.604\\-37\\9.228719\\-156.9263\\-37\\8.228719\\-157.5148\\-37\\6.228719\\-158.2907\\-37\\4.728719\\-159.0273\\-37\\2.728719\\-159.3427\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.771281\\-159.0158\\-35\\-5.271281\\-157.5469\\-35\\-6.271281\\-156.92\\-35\\-8.624831\\-154.8185\\-35\\-9.88938\\-153.3185\\-35\\-11.4067\\-150.8185\\-35\\-12.0138\\-148.8185\\-35\\-12.33163\\-146.3185\\-35\\-12.33163\\-144.8185\\-35\\-11.90907\\-141.8185\\-35\\-11.39551\\-140.3185\\-35\\-9.870337\\-137.8185\\-35\\-9.08514\\-136.8185\\-35\\-7.271281\\-135.0657\\-35\\-5.271281\\-133.6168\\-35\\-3.271281\\-132.7297\\-35\\-1.271281\\-132.0256\\-35\\0.7287188\\-131.7838\\-35\\2.228719\\-131.8318\\-35\\4.728719\\-132.163\\-35\\5.228719\\-132.4882\\-35\\8.728719\\-134.0483\\-35\\10.72872\\-135.6626\\-35\\11.83157\\-136.8185\\-35\\13.27336\\-138.8185\\-35\\13.90837\\-140.3185\\-35\\14.93358\\-143.8185\\-35\\15.04747\\-144.8185\\-35\\14.93762\\-147.3185\\-35\\13.91653\\-150.8185\\-35\\13.27009\\-152.3185\\-35\\11.40592\\-154.8185\\-35\\10.22872\\-155.9404\\-35\\8.728719\\-157.1197\\-35\\5.228719\\-158.637\\-35\\4.728719\\-158.9682\\-35\\2.228719\\-159.3631\\-35\\0.7287188\\-159.4045\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.271281\\-159.154\\-33\\-2.271281\\-158.8963\\-33\\-4.771281\\-157.8877\\-33\\-6.271281\\-157.0421\\-33\\-7.249963\\-156.3185\\-33\\-9.418083\\-154.3185\\-33\\-10.43271\\-152.8185\\-33\\-11.88725\\-150.3185\\-33\\-12.46331\\-146.8185\\-33\\-12.4049\\-143.8185\\-33\\-11.90064\\-140.8185\\-33\\-10.41773\\-138.3185\\-33\\-9.417235\\-136.8185\\-33\\-7.224985\\-134.8185\\-33\\-6.271281\\-134.1172\\-33\\-4.771281\\-133.2907\\-33\\-3.271281\\-132.608\\-33\\-1.271281\\-132.0029\\-33\\0.7287188\\-131.7838\\-33\\2.728719\\-131.9018\\-33\\4.728719\\-132.2521\\-33\\7.228719\\-133.5129\\-33\\8.728719\\-134.1408\\-33\\11.22872\\-136.3506\\-33\\12.36761\\-137.8185\\-33\\13.25297\\-139.3185\\-33\\13.91925\\-140.8185\\-33\\14.77978\\-144.8185\\-33\\14.76339\\-146.3185\\-33\\14.39495\\-148.3185\\-33\\13.92369\\-150.3185\\-33\\13.2494\\-151.8185\\-33\\12.37586\\-153.3185\\-33\\11.23067\\-154.8185\\-33\\8.728719\\-157.0105\\-33\\7.228719\\-157.6488\\-33\\4.728719\\-158.8663\\-33\\2.228719\\-159.3243\\-33\\0.7287188\\-159.4045\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.271281\\-158.9682\\-31\\-4.771281\\-158.0707\\-31\\-6.771281\\-156.9828\\-31\\-8.207413\\-155.8185\\-31\\-9.271281\\-154.7684\\-31\\-10.4375\\-153.3185\\-31\\-11.31592\\-151.8185\\-31\\-11.98703\\-150.3185\\-31\\-12.44267\\-148.8185\\-31\\-12.79196\\-145.8185\\-31\\-12.42669\\-142.3185\\-31\\-11.97057\\-140.8185\\-31\\-11.50733\\-139.8185\\-31\\-10.38256\\-137.8185\\-31\\-9.271281\\-136.4691\\-31\\-8.108529\\-135.3185\\-31\\-6.771281\\-134.2297\\-31\\-4.771281\\-133.1206\\-31\\-3.771281\\-132.7169\\-31\\-1.771281\\-132.142\\-31\\0.7287188\\-131.9273\\-31\\3.728719\\-132.1786\\-31\\5.228719\\-132.6087\\-31\\6.728719\\-133.1848\\-31\\9.228719\\-134.7156\\-31\\10.95849\\-136.3185\\-31\\11.80931\\-137.3185\\-31\\13.3515\\-139.8185\\-31\\13.92262\\-141.3185\\-31\\14.41468\\-143.3185\\-31\\14.54431\\-145.8185\\-31\\14.4777\\-147.3185\\-31\\13.94017\\-149.8185\\-31\\13.38225\\-151.3185\\-31\\11.88404\\-153.8185\\-31\\11.02568\\-154.8185\\-31\\9.228719\\-156.5063\\-31\\7.728719\\-157.4932\\-31\\5.728719\\-158.439\\-31\\4.228719\\-158.9367\\-31\\2.728719\\-159.1575\\-31\\0.7287188\\-159.3165\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.271281\\-159.3757\\-29\\-3.771281\\-158.9072\\-29\\-7.271281\\-156.9045\\-29\\-9.034212\\-155.3185\\-29\\-9.911112\\-154.3185\\-29\\-10.66724\\-152.8185\\-29\\-11.93037\\-150.8185\\-29\\-12.41111\\-148.3185\\-29\\-12.51099\\-146.8185\\-29\\-12.40064\\-143.8185\\-29\\-11.92292\\-141.3185\\-29\\-11.49616\\-140.3185\\-29\\-8.98694\\-136.8185\\-29\\-7.271281\\-135.1918\\-29\\-5.771281\\-134.1362\\-29\\-4.771281\\-133.6505\\-29\\-1.771281\\-132.6557\\-29\\0.7287188\\-132.2219\\-29\\2.728719\\-132.4542\\-29\\3.728719\\-132.6766\\-29\\6.728719\\-133.7219\\-29\\7.728719\\-134.2144\\-29\\9.228719\\-135.1466\\-29\\10.72872\\-136.3355\\-29\\12.88855\\-139.3185\\-29\\13.43467\\-140.3185\\-29\\13.90346\\-141.8185\\-29\\14.47372\\-144.8185\\-29\\14.50832\\-146.8185\\-29\\14.33276\\-148.3185\\-29\\13.94284\\-150.3185\\-29\\12.92477\\-152.8185\\-29\\11.72872\\-154.6072\\-29\\10.56778\\-155.8185\\-29\\8.728719\\-157.3243\\-29\\5.728719\\-158.8726\\-29\\4.228719\\-159.4175\\-29\\3.228719\\-159.5526\\-29\\0.7287188\\-159.6249\\-29\\-1.271281\\-159.5563\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.271281\\-159.506\\-27\\-5.271281\\-158.516\\-27\\-6.771281\\-157.5182\\-27\\-8.271281\\-156.361\\-27\\-9.371599\\-155.3185\\-27\\-10.33163\\-153.8185\\-27\\-11.96123\\-150.8185\\-27\\-12.3491\\-148.3185\\-27\\-12.44603\\-146.8185\\-27\\-12.39182\\-144.8185\\-27\\-11.92101\\-142.3185\\-27\\-11.38492\\-140.8185\\-27\\-10.37532\\-139.3185\\-27\\-8.444246\\-136.8185\\-27\\-7.271281\\-135.6999\\-27\\-5.771281\\-134.6592\\-27\\-4.771281\\-134.0937\\-27\\-3.271281\\-133.5775\\-27\\-1.271281\\-133.1454\\-27\\0.7287188\\-132.9997\\-27\\2.728719\\-133.073\\-27\\3.728719\\-133.2095\\-27\\5.728719\\-133.7351\\-27\\6.728719\\-134.1015\\-27\\8.728719\\-135.2194\\-27\\10.72872\\-136.7478\\-27\\12.35372\\-138.8185\\-27\\13.3515\\-140.3185\\-27\\13.84925\\-141.8185\\-27\\14.46155\\-144.3185\\-27\\14.71167\\-146.8185\\-27\\14.36022\\-149.3185\\-27\\13.84468\\-151.3185\\-27\\13.22872\\-152.8884\\-27\\12.4242\\-154.3185\\-27\\10.57499\\-156.3185\\-27\\9.228719\\-157.42\\-27\\7.228719\\-158.6128\\-27\\6.728719\\-159.0187\\-27\\5.228719\\-159.5343\\-27\\2.728719\\-159.972\\-27\\0.7287188\\-160.0351\\-27\\-0.7712812\\-159.9249\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.7712812\\-160.42\\-25\\-2.771281\\-159.9478\\-25\\-5.271281\\-159.0036\\-25\\-7.271281\\-157.4827\\-25\\-8.612997\\-156.3185\\-25\\-9.927359\\-154.8185\\-25\\-11.28464\\-152.3185\\-25\\-11.98175\\-150.8185\\-25\\-12.28464\\-148.3185\\-25\\-12.3678\\-146.3185\\-25\\-12.22991\\-144.8185\\-25\\-11.84628\\-142.8185\\-25\\-10.96144\\-140.8185\\-25\\-9.932618\\-139.3185\\-25\\-7.271281\\-136.2379\\-25\\-4.771281\\-134.6192\\-25\\-3.771281\\-134.1612\\-25\\-1.271281\\-133.5674\\-25\\0.7287188\\-133.4603\\-25\\2.728719\\-133.509\\-25\\4.728719\\-133.6979\\-25\\6.728719\\-134.5803\\-25\\8.728719\\-135.5917\\-25\\10.22872\\-136.6485\\-25\\11.34035\\-137.8185\\-25\\12.88855\\-139.8185\\-25\\13.4633\\-140.8185\\-25\\14.39495\\-143.8185\\-25\\14.84698\\-145.8185\\-25\\14.94911\\-146.8185\\-25\\14.85591\\-148.3185\\-25\\14.38412\\-150.3185\\-25\\13.92515\\-151.8185\\-25\\12.87651\\-154.3185\\-25\\10.67515\\-156.8185\\-25\\7.728719\\-158.9521\\-25\\6.728719\\-159.509\\-25\\5.228719\\-159.9542\\-25\\2.728719\\-160.5299\\-25\\0.7287188\\-160.6023\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.271281\\-160.9965\\-23\\-3.271281\\-160.126\\-23\\-5.271281\\-159.3818\\-23\\-7.271281\\-157.8565\\-23\\-9.432798\\-155.8185\\-23\\-10.39628\\-154.3185\\-23\\-11.44267\\-152.3185\\-23\\-11.99461\\-150.8185\\-23\\-12.23324\\-148.3185\\-23\\-12.26933\\-146.8185\\-23\\-12.08845\\-144.8185\\-23\\-11.90064\\-143.8185\\-23\\-10.8491\\-141.3185\\-23\\-9.915627\\-139.8185\\-23\\-9.054068\\-138.8185\\-23\\-7.103042\\-136.8185\\-23\\-5.771281\\-135.7379\\-23\\-4.771281\\-135.1522\\-23\\-2.271281\\-134.1766\\-23\\-0.2712812\\-133.7738\\-23\\0.7287188\\-133.6746\\-23\\2.728719\\-133.7245\\-23\\4.728719\\-134.0765\\-23\\9.228719\\-136.2086\\-23\\10.72872\\-137.5296\\-23\\12.33653\\-139.3185\\-23\\13.40512\\-140.8185\\-23\\14.42369\\-143.8185\\-23\\14.86443\\-145.3185\\-23\\15.05069\\-146.8185\\-23\\14.92515\\-149.3185\\-23\\14.37455\\-151.3185\\-23\\13.28601\\-154.3185\\-23\\12.95635\\-154.8185\\-23\\11.22872\\-156.7847\\-23\\8.728719\\-158.9846\\-23\\5.228719\\-160.5397\\-23\\3.728719\\-160.9997\\-23\\2.728719\\-161.131\\-23\\0.7287188\\-161.1848\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.771281\\-160.9757\\-21\\-4.271281\\-160.3818\\-21\\-5.771281\\-159.5609\\-21\\-7.271281\\-158.5038\\-21\\-8.97267\\-156.8185\\-21\\-10.39847\\-154.8185\\-21\\-11.36523\\-152.8185\\-21\\-11.96771\\-150.8185\\-21\\-12.24003\\-147.8185\\-21\\-11.93575\\-144.8185\\-21\\-11.47738\\-143.3185\\-21\\-10.82857\\-141.8185\\-21\\-9.974161\\-140.3185\\-21\\-8.81017\\-138.8185\\-21\\-7.771281\\-137.7722\\-21\\-5.771281\\-136.2324\\-21\\-3.771281\\-135.2169\\-21\\-2.271281\\-134.6827\\-21\\-0.2712812\\-134.3355\\-21\\1.228719\\-134.1807\\-21\\2.728719\\-134.2771\\-21\\4.728719\\-134.5972\\-21\\6.728719\\-135.2907\\-21\\7.728719\\-135.7492\\-21\\9.228719\\-136.6324\\-21\\10.65908\\-137.8185\\-21\\11.6509\\-138.8185\\-21\\12.87137\\-140.3185\\-21\\13.93647\\-142.3185\\-21\\14.34\\-143.3185\\-21\\14.89841\\-145.3185\\-21\\15.09936\\-147.8185\\-21\\14.99106\\-149.8185\\-21\\14.40512\\-152.3185\\-21\\13.82267\\-153.8185\\-21\\13.27978\\-154.8185\\-21\\11.86333\\-156.8185\\-21\\10.22872\\-158.4379\\-21\\8.728719\\-159.5296\\-21\\6.728719\\-160.556\\-21\\5.728719\\-160.9456\\-21\\3.228719\\-161.5219\\-21\\1.228719\\-161.5954\\-21\\-0.7712812\\-161.472\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.271281\\-161.5534\\-19\\-4.771281\\-160.8663\\-19\\-6.271281\\-159.9966\\-19\\-7.735567\\-158.8185\\-19\\-9.957422\\-156.3185\\-19\\-11.92669\\-152.3185\\-19\\-12.13978\\-150.3185\\-19\\-12.20202\\-148.8185\\-19\\-12.12156\\-146.8185\\-19\\-11.82234\\-144.8185\\-19\\-10.01287\\-141.3185\\-19\\-9.386007\\-140.3185\\-19\\-7.271281\\-138.1688\\-19\\-5.771281\\-137.0964\\-19\\-4.271281\\-136.212\\-19\\-3.271281\\-135.7674\\-19\\-0.2712812\\-135.2581\\-19\\0.7287188\\-135.1522\\-19\\2.728719\\-135.2095\\-19\\5.228719\\-135.6612\\-19\\6.728719\\-136.2492\\-19\\9.228719\\-137.6523\\-19\\10.72872\\-138.99\\-19\\11.95741\\-140.3185\\-19\\12.95755\\-141.8185\\-19\\13.87844\\-143.8185\\-19\\14.38036\\-145.3185\\-19\\14.84468\\-147.3185\\-19\\14.9691\\-148.8185\\-19\\14.79798\\-150.3185\\-19\\14.04122\\-152.8185\\-19\\13.86234\\-153.8185\\-19\\13.4655\\-154.8185\\-19\\12.8352\\-155.8185\\-19\\10.72872\\-158.3604\\-19\\8.728719\\-160.0485\\-19\\7.228719\\-161.0219\\-19\\6.228719\\-161.4297\\-19\\4.228719\\-161.9045\\-19\\0.7287188\\-162.2838\\-19\\-1.271281\\-162.0142\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.7287188\\-163.3243\\-17\\-1.271281\\-163.0501\\-17\\-3.271281\\-162.1979\\-17\\-5.271281\\-161.5221\\-17\\-6.771281\\-160.4306\\-17\\-8.50683\\-158.8185\\-17\\-9.446281\\-157.8185\\-17\\-10.45298\\-156.3185\\-17\\-11.50469\\-154.3185\\-17\\-12.0158\\-152.8185\\-17\\-12.26933\\-150.3185\\-17\\-12.2435\\-148.8185\\-17\\-12.08075\\-146.8185\\-17\\-11.52916\\-144.8185\\-17\\-10.47753\\-142.8185\\-17\\-9.4785\\-141.3185\\-17\\-8.542588\\-140.3185\\-17\\-6.771281\\-138.6381\\-17\\-5.271281\\-137.5829\\-17\\-3.271281\\-136.6444\\-17\\-1.771281\\-136.1133\\-17\\0.7287188\\-135.7907\\-17\\2.728719\\-135.9098\\-17\\4.728719\\-136.2706\\-17\\7.228719\\-137.5503\\-17\\8.728719\\-138.1269\\-17\\10.63472\\-139.8185\\-17\\11.9027\\-141.3185\\-17\\13.34235\\-143.8185\\-17\\13.82006\\-144.8185\\-17\\14.47193\\-147.8185\\-17\\14.55733\\-148.8185\\-17\\14.47661\\-150.8185\\-17\\14.04431\\-152.8185\\-17\\13.83276\\-154.3185\\-17\\12.77009\\-156.3185\\-17\\10.93237\\-158.8185\\-17\\8.702775\\-160.8185\\-17\\6.228719\\-162.039\\-17\\3.728719\\-162.9273\\-17\\2.728719\\-163.1253\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "28" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-2.771281\\-163.415\\-15\\-3.771281\\-163.0526\\-15\\-5.771281\\-162.0211\\-15\\-7.271281\\-161.0078\\-15\\-9.487383\\-158.8185\\-15\\-9.865231\\-158.3185\\-15\\-10.55003\\-156.8185\\-15\\-11.49003\\-155.3185\\-15\\-11.96479\\-154.3185\\-15\\-12.29196\\-152.3185\\-15\\-12.40064\\-150.8185\\-15\\-12.30253\\-148.8185\\-15\\-11.94436\\-146.3185\\-15\\-10.41907\\-143.3185\\-15\\-9.365459\\-141.8185\\-15\\-7.271281\\-139.6763\\-15\\-5.271281\\-138.2872\\-15\\-3.771281\\-137.642\\-15\\-1.771281\\-137.1167\\-15\\0.7287188\\-136.7095\\-15\\4.228719\\-137.1707\\-15\\5.728719\\-137.6113\\-15\\7.228719\\-138.2463\\-15\\9.228719\\-139.5954\\-15\\10.72872\\-141.0194\\-15\\11.40098\\-141.8185\\-15\\13.44035\\-144.8185\\-15\\13.85808\\-146.3185\\-15\\14.33028\\-148.8185\\-15\\14.34\\-150.8185\\-15\\13.91155\\-154.3185\\-15\\13.3515\\-155.8185\\-15\\12.84496\\-156.8185\\-15\\11.8352\\-158.3185\\-15\\10.48431\\-159.8185\\-15\\8.728719\\-161.4933\\-15\\6.228719\\-162.8427\\-15\\4.728719\\-163.4562\\-15\\1.728719\\-163.8757\\-15\\0.2287188\\-163.9072\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "29" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.2287188\\-164.9321\\-13\\-1.771281\\-164.4738\\-13\\-3.771281\\-163.7219\\-13\\-5.271281\\-163.3877\\-13\\-8.271281\\-160.965\\-13\\-9.417254\\-159.8185\\-13\\-10.50711\\-158.3185\\-13\\-11.94267\\-155.3185\\-13\\-12.39406\\-153.3185\\-13\\-12.47885\\-150.3185\\-13\\-12.35461\\-148.8185\\-13\\-12.00426\\-146.8185\\-13\\-10.96429\\-144.8185\\-13\\-9.271281\\-142.3204\\-13\\-7.230683\\-140.3185\\-13\\-5.271281\\-139.1205\\-13\\-3.271281\\-138.0825\\-13\\-1.271281\\-137.647\\-13\\0.7287188\\-137.5495\\-13\\2.728719\\-137.6101\\-13\\5.228719\\-138.1193\\-13\\6.728719\\-139.0432\\-13\\8.228719\\-139.663\\-13\\9.119103\\-140.3185\\-13\\10.72872\\-141.954\\-13\\11.8889\\-143.3185\\-13\\12.88036\\-144.8185\\-13\\13.3352\\-145.8185\\-13\\13.82267\\-147.3185\\-13\\14.03229\\-148.8185\\-13\\14.13477\\-150.8185\\-13\\13.95154\\-154.3185\\-13\\13.41925\\-156.3185\\-13\\11.9081\\-158.8185\\-13\\10.72872\\-160.2131\\-13\\8.228719\\-162.4987\\-13\\6.728719\\-163.4898\\-13\\4.228719\\-164.1097\\-13\\3.228719\\-164.5408\\-13\\1.228719\\-164.9478\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "30" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-3.271281\\-164.9709\\-11\\-5.771281\\-163.9072\\-11\\-7.271281\\-162.9867\\-11\\-9.974498\\-160.3185\\-11\\-10.99843\\-158.8185\\-11\\-11.91907\\-156.8185\\-11\\-12.46479\\-154.8185\\-11\\-12.60681\\-152.8185\\-11\\-12.58378\\-150.8185\\-11\\-12.41111\\-148.8185\\-11\\-11.95093\\-146.8185\\-11\\-10.35999\\-144.3185\\-11\\-9.271281\\-142.9763\\-11\\-6.771281\\-140.6415\\-11\\-5.271281\\-139.6891\\-11\\-2.271281\\-138.6746\\-11\\0.7287188\\-138.1454\\-11\\3.728719\\-138.6207\\-11\\6.728719\\-139.6786\\-11\\8.228719\\-140.5795\\-11\\10.72872\\-142.9246\\-11\\11.92113\\-144.3185\\-11\\12.89775\\-145.8185\\-11\\13.40837\\-146.8185\\-11\\13.92515\\-148.8185\\-11\\14.06075\\-152.8185\\-11\\13.94156\\-154.8185\\-11\\13.44924\\-156.8185\\-11\\12.40628\\-158.8185\\-11\\11.41015\\-160.3185\\-11\\8.728719\\-162.9957\\-11\\7.228719\\-163.8848\\-11\\4.728719\\-165.0337\\-11\\2.728719\\-165.5326\\-11\\0.7287188\\-165.6231\\-11\\-1.271281\\-165.5318\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "31" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.271281\\-166.4273\\-9\\-3.271281\\-165.9847\\-9\\-5.771281\\-164.939\\-9\\-7.271281\\-164.0142\\-9\\-8.676523\\-162.8185\\-9\\-9.771281\\-161.6935\\-9\\-10.87478\\-160.3185\\-9\\-11.96709\\-158.3185\\-9\\-12.48344\\-156.8185\\-9\\-12.95724\\-154.8185\\-9\\-13.04846\\-152.8185\\-9\\-12.96479\\-150.8185\\-9\\-12.34343\\-148.3185\\-9\\-11.9691\\-147.3185\\-9\\-10.89628\\-145.3185\\-9\\-9.690689\\-143.8185\\-9\\-8.715526\\-142.8185\\-9\\-6.771281\\-141.2406\\-9\\-4.771281\\-140.1786\\-9\\-3.271281\\-139.63\\-9\\-1.271281\\-139.1786\\-9\\0.7287188\\-139.0809\\-9\\2.228719\\-139.154\\-9\\4.728719\\-139.7072\\-9\\5.728719\\-140.0908\\-9\\7.728719\\-141.0915\\-9\\9.228719\\-142.1443\\-9\\11.36866\\-144.3185\\-9\\12.40709\\-145.8185\\-9\\13.37844\\-147.8185\\-9\\13.87057\\-149.3185\\-9\\14.30931\\-152.8185\\-9\\13.86443\\-156.3185\\-9\\13.36443\\-157.8185\\-9\\12.39588\\-159.8185\\-9\\10.92024\\-161.8185\\-9\\9.228719\\-163.4804\\-9\\7.728719\\-164.5341\\-9\\5.728719\\-165.5333\\-9\\4.228719\\-166.0497\\-9\\2.228719\\-166.4542\\-9\\0.7287188\\-166.5329\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "32" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.7712812\\-167.3848\\-7\\-2.771281\\-166.9757\\-7\\-5.271281\\-165.8391\\-7\\-6.771281\\-165.0282\\-7\\-9.377184\\-162.8185\\-7\\-11.43931\\-159.8185\\-7\\-11.97152\\-158.8185\\-7\\-12.35732\\-157.3185\\-7\\-12.6648\\-154.3185\\-7\\-12.66\\-152.8185\\-7\\-12.45093\\-150.3185\\-7\\-11.84343\\-148.3185\\-7\\-11.01359\\-146.8185\\-7\\-9.969198\\-145.3185\\-7\\-9.271281\\-144.5486\\-7\\-7.271281\\-142.6365\\-7\\-4.771281\\-141.212\\-7\\-3.271281\\-140.5793\\-7\\-1.771281\\-140.1044\\-7\\0.7287188\\-139.9124\\-7\\3.228719\\-140.0975\\-7\\5.228719\\-140.7643\\-7\\7.228719\\-141.7025\\-7\\8.728719\\-142.6048\\-7\\10.72872\\-144.4036\\-7\\11.83761\\-145.8185\\-7\\12.8665\\-147.3185\\-7\\13.41432\\-148.3185\\-7\\13.93221\\-150.3185\\-7\\14.27336\\-152.8185\\-7\\14.28601\\-154.3185\\-7\\13.88036\\-157.3185\\-7\\13.4552\\-158.8185\\-7\\12.39896\\-160.8185\\-7\\10.91778\\-162.8185\\-7\\9.728719\\-163.9124\\-7\\8.228719\\-165.0588\\-7\\6.728719\\-165.8906\\-7\\4.228719\\-166.9775\\-7\\2.728719\\-167.3391\\-7\\0.7287188\\-167.4811\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "33" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-1.771281\\-167.9542\\-5\\-3.271281\\-167.5379\\-5\\-4.771281\\-166.9847\\-5\\-7.271281\\-165.4656\\-5\\-8.271281\\-164.5796\\-5\\-9.94198\\-162.8185\\-5\\-10.94446\\-161.3185\\-5\\-11.89406\\-159.3185\\-5\\-12.46626\\-157.3185\\-5\\-12.71399\\-154.3185\\-5\\-12.38018\\-151.3185\\-5\\-11.51171\\-148.8185\\-5\\-10.39793\\-146.8185\\-5\\-9.271281\\-145.478\\-5\\-8.107374\\-144.3185\\-5\\-6.771281\\-143.1866\\-5\\-4.771281\\-142.0776\\-5\\-2.271281\\-141.2072\\-5\\0.7287188\\-140.8663\\-5\\2.728719\\-140.9959\\-5\\4.228719\\-141.2169\\-5\\6.728719\\-142.0831\\-5\\8.728719\\-143.2324\\-5\\10.04348\\-144.3185\\-5\\11.22872\\-145.5048\\-5\\12.29798\\-146.8185\\-5\\13.44351\\-148.8185\\-5\\13.84\\-149.8185\\-5\\14.39669\\-151.8185\\-5\\14.59722\\-154.3185\\-5\\14.37455\\-157.3185\\-5\\13.95258\\-158.8185\\-5\\13.39582\\-160.3185\\-5\\11.85145\\-162.8185\\-5\\10.22872\\-164.5365\\-5\\9.228719\\-165.4269\\-5\\6.728719\\-166.9591\\-5\\5.228719\\-167.5221\\-5\\3.728719\\-167.939\\-5\\2.728719\\-168.0805\\-5\\0.7287188\\-168.1593\\-5" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "6" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "0\\0\\255" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002384" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4995\\-203.5678\\-165\\-120.5937\\-201.6146\\-165\\-120.5044\\-199.6615\\-165\\-119.4168\\-198.4154\\-165\\-117.7781\\-199.6615\\-165\\-117.4883\\-201.6146\\-165\\-119.3273\\-203.5678\\-165" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002383" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-204.4669\\-163\\-120.5383\\-203.5678\\-163\\-120.7776\\-201.6146\\-163\\-119.8859\\-199.6615\\-163\\-119.4168\\-199.1956\\-163\\-118.7628\\-199.6615\\-163\\-117.4637\\-201.0101\\-163\\-117.067\\-201.6146\\-163\\-118.4403\\-203.5678\\-163" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002382" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-204.5322\\-161\\-120.6583\\-203.5678\\-161\\-120.7851\\-201.6146\\-161\\-119.4168\\-199.7137\\-161\\-117.4637\\-200.5271\\-161\\-116.7459\\-201.6146\\-161\\-118.3749\\-203.5678\\-161" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002381" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "6" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-204.3647\\-159\\-120.2877\\-203.5678\\-159\\-120.7776\\-201.6146\\-159\\-119.4168\\-199.7281\\-159\\-117.4637\\-199.9097\\-159\\-116.4779\\-201.6146\\-159" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002380" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "6" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-203.5156\\-157\\-120.993\\-201.6146\\-157\\-119.4168\\-199.7281\\-157\\-117.4637\\-199.6877\\-157\\-116.4161\\-201.6146\\-157\\-117.4637\\-202.5824\\-157" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002379" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-202.397\\-155\\-122.0797\\-201.6146\\-155\\-121.37\\-200.5042\\-155\\-119.4168\\-199.6994\\-155\\-117.4637\\-199.8824\\-155\\-116.637\\-201.6146\\-155\\-117.4637\\-202.3495\\-155\\-119.4168\\-202.8882\\-155" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002378" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-203.1456\\-153\\-122.5448\\-201.6146\\-153\\-122.4594\\-199.6615\\-153\\-123.3231\\-198.3154\\-153\\-125.2762\\-197.9441\\-153\\-127.2293\\-198.8704\\-153\\-128.3016\\-197.7084\\-153\\-127.2293\\-196.5592\\-153\\-125.2762\\-196.9653\\-153\\-123.3231\\-196.9339\\-153\\-121.37\\-197.3683\\-153\\-119.6871\\-199.6615\\-153\\-118.0209\\-201.6146\\-153\\-119.4168\\-202.6304\\-153" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002377" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-203.344\\-151\\-122.6089\\-201.6146\\-151\\-122.4269\\-199.6615\\-151\\-121.37\\-198.3038\\-151\\-120.3819\\-199.6615\\-151\\-118.5777\\-201.6146\\-151\\-119.4168\\-202.4454\\-151" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002376" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-171.2091\\-149\\-43.15147\\-170.3646\\-149\\-45.1981\\-168.3139\\-149\\-46.11063\\-166.4584\\-149\\-45.1981\\-165.2122\\-149\\-42.53649\\-162.5521\\-149\\-41.29185\\-161.6277\\-149\\-39.33873\\-161.7262\\-149\\-37.3856\\-163.6955\\-149\\-36.4542\\-164.5053\\-149\\-34.88807\\-166.4584\\-149\\-36.44037\\-168.4115\\-149\\-38.3279\\-170.3646\\-149\\-39.33873\\-171.1723\\-149" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002375" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-173.0039\\-147\\-46.62139\\-172.3178\\-147\\-47.15123\\-171.9095\\-147\\-49.10435\\-171.6348\\-147\\-51.05748\\-170.9334\\-147\\-51.39357\\-170.3646\\-147\\-50.16919\\-168.4115\\-147\\-49.36344\\-166.4584\\-147\\-49.10435\\-166.172\\-147\\-46.74353\\-164.5053\\-147\\-45.1981\\-163.6972\\-147\\-43.24498\\-161.7185\\-147\\-41.29185\\-161.0959\\-147\\-39.33873\\-161.5796\\-147\\-37.3856\\-163.5331\\-147\\-35.54006\\-164.5053\\-147\\-34.40963\\-166.4584\\-147\\-38.14181\\-170.3646\\-147\\-39.33873\\-171.3974\\-147\\-41.29185\\-172.114\\-147\\-43.24498\\-173.6062\\-147" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002374" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "10" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-172.2589\\-145\\-51.88936\\-170.3646\\-145\\-49.9113\\-166.4584\\-145\\-49.10435\\-165.6514\\-145\\-45.1981\\-163.6128\\-145\\-43.24498\\-161.6333\\-145\\-41.29185\\-161.015\\-145\\-39.33873\\-161.5001\\-145\\-37.3856\\-162.8581\\-145\\-35.43248\\-163.8162\\-145\\-34.65681\\-164.5053\\-145\\-34.33782\\-166.4584\\-145\\-37.3856\\-169.495\\-145\\-39.33873\\-170.5286\\-145\\-41.29185\\-170.5388\\-145\\-45.1981\\-169.2225\\-145\\-47.15123\\-169.6139\\-145\\-49.10435\\-171.4739\\-145" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "11" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-204.958\\-143\\-124.2414\\-203.5678\\-143\\-123.3231\\-202.4856\\-143\\-121.37\\-201.0149\\-143\\-119.4168\\-200.6575\\-143\\-117.4637\\-200.6332\\-143\\-116.4622\\-201.6146\\-143\\-117.4637\\-202.5912\\-143\\-119.4168\\-202.5718\\-143\\-120.4331\\-203.5678\\-143\\-121.37\\-204.7359\\-143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002373" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "12" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-172.1929\\-143\\-51.86792\\-170.3646\\-143\\-51.05748\\-168.578\\-143\\-49.93924\\-166.4584\\-143\\-49.10435\\-165.6278\\-143\\-45.1981\\-163.6128\\-143\\-43.24498\\-161.6333\\-143\\-41.29185\\-161.0054\\-143\\-39.33873\\-161.0699\\-143\\-37.3856\\-161.6558\\-143\\-34.47985\\-164.5053\\-143\\-34.13548\\-166.4584\\-143\\-36.05906\\-168.4115\\-143\\-37.3856\\-169.4889\\-143\\-39.33873\\-170.3873\\-143\\-41.29185\\-170.3873\\-143\\-45.1981\\-168.52\\-143\\-47.15123\\-169.4972\\-143\\-49.10435\\-171.4468\\-143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "13" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-206.564\\-141\\-124.4056\\-205.5209\\-141\\-124.8603\\-203.5678\\-141\\-123.4396\\-201.6146\\-141\\-123.1701\\-201.6146\\-141\\-121.37\\-202.3617\\-141\\-119.4168\\-201.3438\\-141\\-117.4637\\-200.4936\\-141\\-116.4512\\-201.6146\\-141\\-117.4637\\-202.6\\-141\\-119.4168\\-203.9364\\-141\\-120.4755\\-205.5209\\-141\\-121.37\\-206.4524\\-141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002372" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "14" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-171.144\\-141\\-51.53709\\-170.3646\\-141\\-50.94897\\-168.4115\\-141\\-49.93924\\-166.4584\\-141\\-49.10435\\-165.6278\\-141\\-45.1981\\-163.6128\\-141\\-43.24498\\-161.6333\\-141\\-41.29185\\-161.0054\\-141\\-39.33873\\-161.0054\\-141\\-37.3856\\-161.782\\-141\\-35.43248\\-163.8127\\-141\\-34.65681\\-164.5053\\-141\\-33.71507\\-166.4584\\-141\\-35.50452\\-168.4115\\-141\\-37.3856\\-169.4889\\-141\\-39.33873\\-170.3873\\-141\\-41.29185\\-170.3873\\-141\\-45.06961\\-168.4115\\-141\\-45.335\\-168.4115\\-141\\-47.15123\\-169.4397\\-141\\-49.10435\\-171.4324\\-141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "15" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-208.2524\\-139\\-124.6333\\-207.474\\-139\\-125.2762\\-206.9345\\-139\\-126.2388\\-205.5209\\-139\\-126.9103\\-203.5678\\-139\\-127.987\\-201.6146\\-139\\-129.8008\\-199.6615\\-139\\-129.9937\\-197.7084\\-139\\-129.1825\\-196.8613\\-139\\-127.2293\\-195.7637\\-139\\-126.0461\\-197.7084\\-139\\-126.0514\\-199.6615\\-139\\-125.2762\\-200.3583\\-139\\-123.3231\\-200.6518\\-139\\-120.1878\\-203.5678\\-139\\-120.3096\\-205.5209\\-139\\-121.37\\-206.5723\\-139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002371" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "16" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.06511\\-170.3646\\-139\\-50.9465\\-168.4115\\-139\\-49.93924\\-166.4584\\-139\\-49.10435\\-165.6278\\-139\\-45.1981\\-163.6128\\-139\\-43.24498\\-161.6333\\-139\\-41.29185\\-161.0054\\-139\\-39.33873\\-161.0054\\-139\\-37.3856\\-162.4204\\-139\\-35.33741\\-164.5053\\-139\\-33.62796\\-166.4584\\-139\\-35.38265\\-168.4115\\-139\\-37.3856\\-169.4889\\-139\\-39.33873\\-170.3873\\-139\\-41.29185\\-170.3873\\-139\\-43.24498\\-169.3976\\-139\\-45.1981\\-167.7354\\-139\\-47.15123\\-168.4348\\-139\\-49.10435\\-171.2141\\-139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "17" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-125.2762\\-208.1304\\-137\\-125.9399\\-207.474\\-137\\-127.3648\\-205.5209\\-137\\-129.1825\\-202.1513\\-137\\-129.5619\\-201.6146\\-137\\-130.3909\\-199.6615\\-137\\-130.0337\\-197.7084\\-137\\-129.1825\\-196.8433\\-137\\-127.2293\\-195.7629\\-137\\-125.2762\\-196.6599\\-137\\-124.2997\\-197.7084\\-137\\-122.2621\\-199.6615\\-137\\-121.0577\\-201.6146\\-137\\-120.2314\\-203.5678\\-137\\-119.9222\\-205.5209\\-137\\-121.37\\-206.7067\\-137\\-123.3231\\-208.4724\\-137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002370" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "18" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-170.5765\\-137\\-50.00279\\-170.3646\\-137\\-50.9301\\-168.4115\\-137\\-49.93924\\-166.4584\\-137\\-49.10435\\-165.6278\\-137\\-47.15123\\-164.4677\\-137\\-45.1981\\-163.5647\\-137\\-43.24498\\-161.6333\\-137\\-41.29185\\-161.0054\\-137\\-39.33873\\-161.0054\\-137\\-37.39323\\-162.5521\\-137\\-33.62796\\-166.4584\\-137\\-35.38265\\-168.4115\\-137\\-37.3856\\-169.4889\\-137\\-39.33873\\-170.3873\\-137\\-41.29185\\-170.3873\\-137\\-43.24498\\-169.3929\\-137\\-45.1981\\-167.5378\\-137\\-47.15123\\-167.6395\\-137\\-47.95702\\-168.4115\\-137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "19" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-125.2762\\-207.7558\\-135\\-127.2293\\-206.295\\-135\\-127.9764\\-205.5209\\-135\\-129.4864\\-203.5678\\-135\\-130.3591\\-201.6146\\-135\\-130.6917\\-199.6615\\-135\\-130.0337\\-197.7084\\-135\\-129.1825\\-196.8433\\-135\\-127.2293\\-195.8907\\-135\\-125.2762\\-196.606\\-135\\-123.3231\\-197.1559\\-135\\-121.37\\-198.1381\\-135\\-119.4268\\-199.6615\\-135\\-118.9955\\-201.6146\\-135\\-119.7529\\-203.5678\\-135\\-119.2814\\-205.5209\\-135\\-121.37\\-206.9043\\-135\\-123.3231\\-208.0513\\-135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002369" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "20" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-170.3873\\-135\\-43.24498\\-169.3881\\-135\\-45.1981\\-167.478\\-135\\-47.15123\\-167.5463\\-135\\-48.03013\\-168.4115\\-135\\-49.10435\\-169.7198\\-135\\-50.92669\\-168.4115\\-135\\-49.93924\\-166.4584\\-135\\-47.15123\\-163.8424\\-135\\-45.1981\\-163.3728\\-135\\-43.24498\\-161.624\\-135\\-41.29185\\-161.0054\\-135\\-39.33873\\-161.0054\\-135\\-37.3856\\-162.3643\\-135\\-35.28936\\-164.5053\\-135\\-33.62796\\-166.4584\\-135\\-35.38265\\-168.4115\\-135\\-37.3856\\-169.4064\\-135\\-39.33873\\-170.2561\\-135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "21" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-206.3476\\-133\\-129.9039\\-203.5678\\-133\\-130.6826\\-201.6146\\-133\\-130.7586\\-199.6615\\-133\\-130.0337\\-197.7084\\-133\\-129.1825\\-196.8433\\-133\\-127.2293\\-196.3109\\-133\\-125.2762\\-197.0659\\-133\\-121.37\\-196.7771\\-133\\-119.4168\\-198.278\\-133\\-117.4864\\-199.6615\\-133\\-118.4003\\-201.6146\\-133\\-119.06\\-203.5678\\-133\\-120.1311\\-205.5209\\-133\\-121.37\\-206.6685\\-133\\-123.3231\\-207.17\\-133\\-125.2762\\-207.1172\\-133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002368" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "22" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.32029\\-170.3646\\-133\\-43.24498\\-169.3881\\-133\\-45.1981\\-167.478\\-133\\-47.15123\\-167.5463\\-133\\-49.10435\\-169.5208\\-133\\-50.92669\\-168.4115\\-133\\-49.93924\\-166.4584\\-133\\-47.15123\\-163.7041\\-133\\-45.1981\\-162.9292\\-133\\-43.24498\\-161.624\\-133\\-41.29185\\-161.0054\\-133\\-39.33873\\-161.0054\\-133\\-37.3856\\-161.7295\\-133\\-35.43248\\-163.7582\\-133\\-34.61152\\-164.5053\\-133\\-33.62796\\-166.4584\\-133\\-35.43248\\-168.2761\\-133\\-37.3856\\-168.9142\\-133\\-39.33873\\-169.7291\\-133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "23" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-206.4227\\-131\\-129.9608\\-203.5678\\-131\\-130.7389\\-201.6146\\-131\\-130.7586\\-199.6615\\-131\\-130.0337\\-197.7084\\-131\\-129.1825\\-196.8433\\-131\\-127.2293\\-196.497\\-131\\-125.2762\\-197.4609\\-131\\-123.3231\\-197.1387\\-131\\-121.37\\-197.1465\\-131\\-119.4168\\-197.8169\\-131\\-118.1332\\-199.6615\\-131\\-118.973\\-203.5678\\-131\\-119.4168\\-204.0694\\-131\\-120.3186\\-205.5209\\-131\\-121.37\\-206.5767\\-131\\-123.3231\\-207.0393\\-131\\-125.2762\\-207.0393\\-131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002367" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "24" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.30143\\-170.3646\\-131\\-43.24498\\-169.3881\\-131\\-45.1981\\-167.478\\-131\\-47.15123\\-167.5463\\-131\\-49.10435\\-169.4972\\-131\\-50.92669\\-168.4115\\-131\\-49.93924\\-166.4584\\-131\\-47.15123\\-163.6592\\-131\\-45.15527\\-162.5521\\-131\\-43.24498\\-161.5885\\-131\\-41.29185\\-161.0054\\-131\\-39.33873\\-161.0054\\-131\\-37.3856\\-161.5968\\-131\\-34.46535\\-164.5053\\-131\\-33.63014\\-166.4584\\-131\\-35.43248\\-167.7284\\-131\\-37.3856\\-167.776\\-131\\-39.33873\\-169.5411\\-131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "25" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-206.6955\\-129\\-128.4934\\-205.5209\\-129\\-129.9666\\-203.5678\\-129\\-130.7389\\-201.6146\\-129\\-130.7586\\-199.6615\\-129\\-130.128\\-197.7084\\-129\\-129.1825\\-196.7371\\-129\\-127.2293\\-196.4582\\-129\\-125.2762\\-196.9323\\-129\\-123.3231\\-196.8128\\-129\\-121.37\\-197.6276\\-129\\-119.4168\\-197.7471\\-129\\-118.2459\\-199.6615\\-129\\-118.7921\\-201.6146\\-129\\-118.973\\-203.5678\\-129\\-120.262\\-205.5209\\-129\\-121.37\\-206.7145\\-129\\-123.3231\\-207.2035\\-129\\-125.2762\\-207.0486\\-129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002366" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "26" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.30143\\-170.3646\\-129\\-43.24498\\-169.3881\\-129\\-45.1981\\-167.478\\-129\\-47.15123\\-167.5463\\-129\\-49.10435\\-169.4972\\-129\\-50.92669\\-168.4115\\-129\\-49.93924\\-166.4584\\-129\\-48.09834\\-164.5053\\-129\\-45.1981\\-161.8307\\-129\\-41.29185\\-161.0054\\-129\\-39.33873\\-161.0054\\-129\\-37.3856\\-161.584\\-129\\-34.45126\\-164.5053\\-129\\-33.64341\\-166.4584\\-129\\-35.43248\\-167.5284\\-129\\-37.3856\\-167.6038\\-129\\-39.33873\\-169.5001\\-129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "27" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-208.1576\\-127\\-125.2762\\-207.3932\\-127\\-127.2293\\-207.097\\-127\\-128.6942\\-205.5209\\-127\\-129.9666\\-203.5678\\-127\\-130.7389\\-201.6146\\-127\\-130.7586\\-199.6615\\-127\\-130.5285\\-197.7084\\-127\\-129.1825\\-196.2082\\-127\\-127.2293\\-196.0701\\-127\\-123.3231\\-196.5014\\-127\\-121.37\\-197.5201\\-127\\-119.4168\\-197.7459\\-127\\-117.7998\\-199.6615\\-127\\-118.4891\\-201.6146\\-127\\-118.9639\\-203.5678\\-127\\-119.6406\\-205.5209\\-127\\-120.7763\\-207.474\\-127\\-121.37\\-208.0513\\-127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "28" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-115.5106\\-206.2984\\-127\\-116.1531\\-205.5209\\-127\\-115.2401\\-203.5678\\-127\\-113.5575\\-201.7094\\-127\\-111.6043\\-203.2542\\-127\\-111.3686\\-203.5678\\-127\\-112.5125\\-205.5209\\-127\\-113.5575\\-206.5467\\-127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002365" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "29" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.30143\\-170.3646\\-127\\-43.24498\\-169.3881\\-127\\-45.1981\\-167.478\\-127\\-47.15123\\-167.5463\\-127\\-49.10435\\-169.4972\\-127\\-50.92669\\-168.4115\\-127\\-49.95071\\-166.4584\\-127\\-48.54872\\-164.5053\\-127\\-45.1981\\-161.6746\\-127\\-43.24498\\-161.0873\\-127\\-39.33873\\-161.0054\\-127\\-37.3856\\-161.584\\-127\\-34.45126\\-164.5053\\-127\\-33.64745\\-166.4584\\-127\\-35.43248\\-167.5004\\-127\\-37.3856\\-167.5673\\-127\\-39.33873\\-169.5001\\-127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "30" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.0329\\-125\\-127.8083\\-207.474\\-125\\-128.8464\\-205.5209\\-125\\-130.0424\\-203.5678\\-125\\-130.7389\\-201.6146\\-125\\-130.7292\\-197.7084\\-125\\-129.1825\\-195.8907\\-125\\-127.2293\\-195.7928\\-125\\-125.2762\\-195.8218\\-125\\-123.3231\\-196.0701\\-125\\-119.4168\\-197.5075\\-125\\-117.4637\\-199.5872\\-125\\-118.3749\\-201.6146\\-125\\-118.8051\\-203.5678\\-125\\-118.8259\\-205.5209\\-125\\-121.37\\-207.9114\\-125\\-123.3231\\-208.5313\\-125\\-125.2762\\-208.6126\\-125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "31" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-115.5106\\-206.6492\\-125\\-116.367\\-205.5209\\-125\\-115.2515\\-203.5678\\-125\\-113.5575\\-201.6223\\-125\\-111.6043\\-203.1936\\-125\\-111.3338\\-203.5678\\-125\\-112.5125\\-205.5209\\-125\\-113.5575\\-206.5515\\-125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002364" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "32" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.30143\\-170.3646\\-125\\-43.24498\\-169.3321\\-125\\-45.1981\\-167.4105\\-125\\-47.15123\\-167.5463\\-125\\-49.10435\\-169.4972\\-125\\-50.92669\\-168.4115\\-125\\-49.95635\\-166.4584\\-125\\-48.84526\\-164.5053\\-125\\-46.73161\\-162.5521\\-125\\-45.1981\\-161.6434\\-125\\-43.24498\\-161.0054\\-125\\-39.33873\\-161.0054\\-125\\-37.3856\\-161.584\\-125\\-34.45126\\-164.5053\\-125\\-33.64745\\-166.4584\\-125\\-35.43248\\-167.5004\\-125\\-37.3856\\-167.5673\\-125\\-39.33873\\-169.5001\\-125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "33" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2358\\-123\\-127.9872\\-207.474\\-123\\-129.6649\\-205.5209\\-123\\-130.5003\\-203.5678\\-123\\-130.7487\\-201.6146\\-123\\-130.7586\\-197.7084\\-123\\-129.1825\\-195.7928\\-123\\-125.2762\\-195.7476\\-123\\-123.3231\\-195.7928\\-123\\-121.37\\-196.152\\-123\\-119.4168\\-196.8409\\-123\\-118.4508\\-197.7084\\-123\\-118.2183\\-199.6615\\-123\\-118.3101\\-201.6146\\-123\\-118.1062\\-203.5678\\-123\\-117.6253\\-205.5209\\-123\\-119.9837\\-207.474\\-123\\-121.37\\-208.3961\\-123\\-123.3231\\-208.7068\\-123\\-125.2762\\-208.873\\-123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "34" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-115.5106\\-205.8584\\-123\\-116.822\\-205.5209\\-123\\-115.5106\\-204.4777\\-123\\-115.2401\\-203.5678\\-123\\-113.5575\\-201.6223\\-123\\-111.6043\\-203.1936\\-123\\-111.3338\\-203.5678\\-123\\-112.4254\\-205.5209\\-123\\-113.5575\\-206.5646\\-123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002363" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "35" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.30133\\-170.3646\\-123\\-43.24498\\-168.7758\\-123\\-45.1981\\-166.9525\\-123\\-47.15123\\-167.5463\\-123\\-49.10435\\-169.4972\\-123\\-50.92669\\-168.4115\\-123\\-49.10435\\-164.8212\\-123\\-48.88055\\-164.5053\\-123\\-46.83384\\-162.5521\\-123\\-45.1981\\-161.6434\\-123\\-43.24498\\-161.0054\\-123\\-39.33873\\-161.0054\\-123\\-37.3856\\-161.584\\-123\\-34.45126\\-164.5053\\-123\\-33.64745\\-166.4584\\-123\\-35.43248\\-167.5004\\-123\\-37.3856\\-167.5673\\-123\\-39.33873\\-169.5001\\-123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "36" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-121\\-129.9137\\-205.5209\\-121\\-130.7197\\-203.5678\\-121\\-130.7586\\-197.7084\\-121\\-129.1825\\-195.7928\\-121\\-127.2293\\-195.7476\\-121\\-125.2762\\-195.5669\\-121\\-123.3231\\-195.5026\\-121\\-121.37\\-195.7928\\-121\\-119.4168\\-196.8074\\-121\\-118.6712\\-197.7084\\-121\\-118.6107\\-199.6615\\-121\\-118.2693\\-201.6146\\-121\\-117.4637\\-203.2483\\-121\\-116.5873\\-203.5678\\-121\\-116.3163\\-205.5209\\-121\\-117.4637\\-206.4771\\-121\\-117.7984\\-207.474\\-121\\-119.4168\\-208.5975\\-121\\-123.3231\\-208.9218\\-121\\-125.2762\\-208.9652\\-121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "37" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-206.7537\\-121\\-115.2868\\-205.5209\\-121\\-115.2288\\-203.5678\\-121\\-113.5575\\-201.6223\\-121\\-111.6043\\-203.1646\\-121\\-111.3114\\-203.5678\\-121\\-111.8038\\-205.5209\\-121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002362" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "38" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.4972\\-121\\-50.92669\\-168.4115\\-121\\-49.10435\\-164.8212\\-121\\-48.88055\\-164.5053\\-121\\-46.83384\\-162.5521\\-121\\-45.1981\\-161.6434\\-121\\-43.24498\\-161.0054\\-121\\-41.29185\\-160.7476\\-121\\-39.33873\\-160.7211\\-121\\-37.3856\\-161.584\\-121\\-34.45126\\-164.5053\\-121\\-33.64745\\-166.4584\\-121\\-35.43248\\-167.5004\\-121\\-37.3856\\-167.5673\\-121\\-39.33873\\-169.5001\\-121\\-41.29185\\-170.1529\\-121\\-43.24498\\-167.9797\\-121\\-45.1981\\-166.5805\\-121\\-47.15123\\-167.5463\\-121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "39" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-119\\-129.9453\\-205.5209\\-119\\-130.7487\\-203.5678\\-119\\-130.7586\\-197.7084\\-119\\-129.1825\\-195.7928\\-119\\-127.2293\\-195.7476\\-119\\-125.2762\\-195.0465\\-119\\-123.3231\\-194.7631\\-119\\-121.37\\-195.4791\\-119\\-119.4168\\-197.0306\\-119\\-118.8949\\-197.7084\\-119\\-118.7468\\-199.6615\\-119\\-118.1528\\-201.6146\\-119\\-117.4637\\-202.9998\\-119\\-116.6329\\-203.5678\\-119\\-116.3504\\-205.5209\\-119\\-117.1308\\-207.474\\-119\\-117.4637\\-207.8147\\-119\\-119.4168\\-208.8809\\-119\\-125.2762\\-208.9652\\-119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "40" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-207.2149\\-119\\-115.2288\\-205.5209\\-119\\-115.0493\\-203.5678\\-119\\-113.5575\\-201.8908\\-119\\-111.6043\\-203.1683\\-119\\-111.3114\\-203.5678\\-119\\-111.3453\\-205.5209\\-119\\-111.6043\\-205.828\\-119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002361" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "41" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.4972\\-119\\-50.92669\\-168.4115\\-119\\-50.07069\\-166.4584\\-119\\-49.11198\\-164.5053\\-119\\-46.83384\\-162.5521\\-119\\-45.1981\\-161.6434\\-119\\-43.24498\\-160.9957\\-119\\-41.29185\\-159.8112\\-119\\-39.33873\\-159.76\\-119\\-37.3856\\-161.5756\\-119\\-34.45126\\-164.5053\\-119\\-33.64745\\-166.4584\\-119\\-35.43248\\-167.5004\\-119\\-37.3856\\-167.5673\\-119\\-39.33873\\-169.5001\\-119\\-41.29185\\-169.5997\\-119\\-43.24498\\-167.5473\\-119\\-45.1981\\-166.5106\\-119\\-47.15123\\-167.5463\\-119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "42" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-117\\-129.9453\\-205.5209\\-117\\-130.7487\\-203.5678\\-117\\-131.1759\\-199.6615\\-117\\-130.7718\\-197.7084\\-117\\-129.1825\\-196.0314\\-117\\-127.2293\\-195.553\\-117\\-125.2762\\-194.7524\\-117\\-123.3231\\-194.0859\\-117\\-121.37\\-194.8409\\-117\\-120.3395\\-195.7553\\-117\\-118.7856\\-197.7084\\-117\\-118.3291\\-199.6615\\-117\\-117.5159\\-201.6146\\-117\\-117.0219\\-203.5678\\-117\\-116.3504\\-205.5209\\-117\\-117.4095\\-207.474\\-117\\-119.4168\\-208.8575\\-117\\-121.37\\-208.9652\\-117\\-125.2762\\-208.9652\\-117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "43" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-208.0864\\-117\\-114.3155\\-207.474\\-117\\-115.2288\\-205.5209\\-117\\-114.5537\\-203.5678\\-117\\-113.5575\\-202.5511\\-117\\-111.5522\\-203.5678\\-117\\-111.3114\\-205.5209\\-117\\-112.867\\-207.474\\-117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002360" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "44" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.4972\\-117\\-50.95982\\-168.4115\\-117\\-50.57807\\-166.4584\\-117\\-49.75014\\-164.5053\\-117\\-49.10435\\-163.8304\\-117\\-47.15123\\-162.8112\\-117\\-45.1981\\-161.6434\\-117\\-43.24498\\-160.9859\\-117\\-41.29185\\-159.6522\\-117\\-39.33873\\-159.6019\\-117\\-34.45126\\-164.5053\\-117\\-33.64745\\-166.4584\\-117\\-35.43248\\-167.5004\\-117\\-37.3856\\-167.5673\\-117\\-39.33873\\-169.5001\\-117\\-41.29185\\-169.4247\\-117\\-43.24498\\-167.5004\\-117\\-45.1981\\-166.5106\\-117\\-47.15123\\-167.5463\\-117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "45" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-115\\-129.9453\\-205.5209\\-115\\-130.7487\\-203.5678\\-115\\-131.7007\\-201.6146\\-115\\-132.2463\\-199.6615\\-115\\-130.8465\\-197.7084\\-115\\-129.1825\\-196.596\\-115\\-127.2293\\-195.0877\\-115\\-125.2762\\-194.1382\\-115\\-123.3231\\-193.7355\\-115\\-121.37\\-194.6252\\-115\\-120.121\\-195.7553\\-115\\-118.3182\\-197.7084\\-115\\-117.3951\\-199.6615\\-115\\-116.941\\-201.6146\\-115\\-117.0851\\-203.5678\\-115\\-116.3504\\-205.5209\\-115\\-117.4637\\-206.0411\\-115\\-118.2116\\-207.474\\-115\\-119.4168\\-208.6022\\-115\\-121.37\\-208.9652\\-115\\-125.2762\\-208.9652\\-115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002359" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "46" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.4972\\-115\\-50.95982\\-168.4115\\-115\\-50.90887\\-166.4584\\-115\\-49.92955\\-164.5053\\-115\\-49.10435\\-163.6801\\-115\\-47.15123\\-162.8112\\-115\\-45.1981\\-161.6434\\-115\\-43.24498\\-160.9859\\-115\\-41.29185\\-159.6437\\-115\\-39.33873\\-159.5937\\-115\\-34.45126\\-164.5053\\-115\\-33.95162\\-166.4584\\-115\\-35.43248\\-167.3662\\-115\\-37.3856\\-167.5621\\-115\\-39.33873\\-169.3595\\-115\\-41.29185\\-169.2801\\-115\\-43.24498\\-167.4954\\-115\\-45.1981\\-166.5106\\-115\\-47.15123\\-167.5463\\-115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "47" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-113\\-129.9453\\-205.5209\\-113\\-130.7487\\-203.5678\\-113\\-131.8924\\-201.6146\\-113\\-132.6823\\-199.6615\\-113\\-131.1356\\-197.5845\\-113\\-129.1825\\-196.6416\\-113\\-127.2293\\-194.9086\\-113\\-125.2762\\-193.7945\\-113\\-123.3231\\-193.7074\\-113\\-121.37\\-194.4888\\-113\\-119.582\\-195.7553\\-113\\-117.4637\\-198.2539\\-113\\-116.4872\\-199.6615\\-113\\-116.5007\\-201.6146\\-113\\-117.0718\\-203.5678\\-113\\-115.5106\\-205.3607\\-113\\-113.5575\\-203.3808\\-113\\-111.6043\\-205.1102\\-113\\-111.3114\\-205.5209\\-113\\-111.6043\\-205.8753\\-113\\-113.5575\\-207.4218\\-113\\-115.5106\\-205.7301\\-113\\-117.4637\\-206.4975\\-113\\-118.0847\\-207.474\\-113\\-119.4168\\-208.5933\\-113\\-121.37\\-208.9652\\-113\\-125.2762\\-208.9652\\-113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002358" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "48" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.4972\\-113\\-50.95982\\-168.4115\\-113\\-50.68089\\-166.4584\\-113\\-49.79962\\-164.5053\\-113\\-49.10435\\-163.7985\\-113\\-47.15123\\-162.8112\\-113\\-45.1981\\-161.6434\\-113\\-41.29185\\-159.5836\\-113\\-39.33873\\-159.5937\\-113\\-34.45126\\-164.5053\\-113\\-34.84488\\-166.4584\\-113\\-35.43248\\-166.8838\\-113\\-37.3856\\-167.557\\-113\\-39.33873\\-168.8179\\-113\\-41.29185\\-168.7909\\-113\\-43.24498\\-167.4905\\-113\\-45.1981\\-166.5106\\-113\\-47.15123\\-167.5463\\-113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "29" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "49" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-111\\-129.9453\\-205.5209\\-111\\-130.7487\\-203.5678\\-111\\-131.9022\\-201.6146\\-111\\-132.7319\\-199.6615\\-111\\-131.8204\\-197.7084\\-111\\-131.1356\\-197.0592\\-111\\-129.1825\\-195.967\\-111\\-127.2293\\-194.7032\\-111\\-125.2762\\-193.7355\\-111\\-123.3231\\-193.6936\\-111\\-121.37\\-194.0379\\-111\\-119.4168\\-195.0982\\-111\\-118.8086\\-195.7553\\-111\\-117.9774\\-197.7084\\-111\\-116.2356\\-199.6615\\-111\\-115.7705\\-201.6146\\-111\\-116.1515\\-203.5678\\-111\\-115.5106\\-204.0484\\-111\\-113.5575\\-202.8835\\-111\\-112.7051\\-203.5678\\-111\\-111.3225\\-205.5209\\-111\\-112.6888\\-207.474\\-111\\-113.5575\\-208.2721\\-111\\-115.5106\\-207.8906\\-111\\-117.4637\\-207.9017\\-111\\-119.4168\\-208.6526\\-111\\-121.37\\-208.9652\\-111\\-125.2762\\-208.9652\\-111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002357" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "50" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-169.3309\\-111\\-50.62059\\-168.4115\\-111\\-50.16104\\-166.4584\\-111\\-49.25296\\-164.5053\\-111\\-46.83384\\-162.5521\\-111\\-45.1981\\-161.6434\\-111\\-43.24498\\-159.8717\\-111\\-41.29185\\-159.3601\\-111\\-39.33873\\-159.5937\\-111\\-37.3856\\-161.567\\-111\\-34.35008\\-164.5053\\-111\\-35.27732\\-166.4584\\-111\\-37.3856\\-167.552\\-111\\-39.33873\\-168.4491\\-111\\-41.29185\\-168.4342\\-111\\-43.24498\\-167.4856\\-111\\-45.1981\\-166.1635\\-111\\-47.15123\\-167.4729\\-111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "27" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "51" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-109\\-129.9453\\-205.5209\\-109\\-130.7487\\-203.5678\\-109\\-131.9022\\-201.6146\\-109\\-132.7319\\-199.6615\\-109\\-131.9704\\-197.7084\\-109\\-131.1356\\-196.8599\\-109\\-129.1825\\-195.125\\-109\\-127.2293\\-194.159\\-109\\-125.2762\\-193.6936\\-109\\-121.37\\-193.7074\\-109\\-119.4168\\-194.6904\\-109\\-118.4125\\-195.7553\\-109\\-117.5445\\-197.7084\\-109\\-116.0821\\-199.6615\\-109\\-115.5106\\-200.2234\\-109\\-113.5575\\-201.53\\-109\\-111.7398\\-203.5678\\-109\\-111.6991\\-205.5209\\-109\\-112.6791\\-207.474\\-109\\-113.5575\\-208.3844\\-109\\-115.5106\\-208.7021\\-109\\-117.4637\\-207.7397\\-109\\-119.4168\\-208.0972\\-109\\-121.37\\-208.8129\\-109\\-123.3231\\-208.9652\\-109\\-125.2762\\-208.9652\\-109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "52" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-54.96373\\-192.6368\\-109\\-55.80775\\-191.849\\-109\\-54.17596\\-189.8959\\-109\\-53.0106\\-188.7382\\-109\\-51.05748\\-187.0464\\-109\\-50.31601\\-187.9428\\-109\\-51.71575\\-189.8959\\-109\\-53.0106\\-191.1812\\-109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002356" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "53" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.8554\\-109\\-49.75251\\-168.4115\\-109\\-49.97186\\-166.4584\\-109\\-48.88175\\-164.5053\\-109\\-46.83384\\-162.5521\\-109\\-45.1981\\-161.6392\\-109\\-43.24498\\-159.7\\-109\\-41.29185\\-159.1512\\-109\\-39.33873\\-159.5937\\-109\\-37.3856\\-161.567\\-109\\-36.10386\\-162.5521\\-109\\-33.99061\\-164.5053\\-109\\-35.32818\\-166.4584\\-109\\-37.3856\\-167.552\\-109\\-39.33873\\-168.4039\\-109\\-41.29185\\-168.4039\\-109\\-43.24498\\-167.4768\\-109\\-45.1981\\-165.68\\-109\\-46.38026\\-166.4584\\-109\\-48.51841\\-168.4115\\-109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "27" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "54" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-107\\-129.9453\\-205.5209\\-107\\-130.7487\\-203.5678\\-107\\-131.9022\\-201.6146\\-107\\-132.7319\\-199.6615\\-107\\-131.9764\\-197.7084\\-107\\-129.1825\\-194.9174\\-107\\-127.2293\\-193.8098\\-107\\-125.2762\\-193.6936\\-107\\-121.37\\-193.6936\\-107\\-119.4168\\-194.6292\\-107\\-118.2575\\-195.7553\\-107\\-116.8657\\-197.7084\\-107\\-116.2258\\-199.6615\\-107\\-115.5106\\-200.6055\\-107\\-113.5575\\-201.0835\\-107\\-112.8797\\-201.6146\\-107\\-111.3453\\-203.5678\\-107\\-112.3242\\-205.5209\\-107\\-113.0408\\-207.474\\-107\\-113.5575\\-208.0827\\-107\\-115.5106\\-208.9052\\-107\\-117.4637\\-207.0967\\-107\\-119.4168\\-206.8859\\-107\\-121.37\\-208.6377\\-107\\-123.3231\\-208.9652\\-107\\-125.2762\\-208.9652\\-107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "55" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-56.91685\\-192.1797\\-107\\-57.38867\\-191.849\\-107\\-56.91685\\-191.3772\\-107\\-55.89487\\-189.8959\\-107\\-51.96428\\-185.9896\\-107\\-51.05748\\-185.2972\\-107\\-49.10435\\-183.5184\\-107\\-48.11643\\-184.0365\\-107\\-48.47075\\-185.9896\\-107\\-53.0106\\-190.5408\\-107\\-55.64436\\-191.849\\-107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002355" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "56" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.11422\\-168.4115\\-107\\-49.95635\\-166.4584\\-107\\-48.85258\\-164.5053\\-107\\-46.83384\\-162.5521\\-107\\-45.1981\\-161.6349\\-107\\-43.24498\\-159.6909\\-107\\-41.29185\\-159.1255\\-107\\-39.33873\\-159.5937\\-107\\-37.3856\\-161.567\\-107\\-35.70213\\-162.5521\\-107\\-33.64094\\-164.5053\\-107\\-35.32716\\-166.4584\\-107\\-37.3856\\-167.552\\-107\\-39.33873\\-168.4039\\-107\\-41.29185\\-168.4039\\-107\\-43.24498\\-167.4678\\-107\\-45.1981\\-165.5566\\-107\\-46.73043\\-166.4584\\-107\\-47.15123\\-166.9124\\-107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "29" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "57" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-105\\-129.9453\\-205.5209\\-105\\-131.1356\\-203.4433\\-105\\-132.0776\\-201.6146\\-105\\-132.7319\\-199.6615\\-105\\-132.1379\\-197.7084\\-105\\-131.1356\\-196.5612\\-105\\-129.1825\\-194.7032\\-105\\-127.2293\\-193.7646\\-105\\-125.2762\\-193.6936\\-105\\-121.37\\-193.6936\\-105\\-119.4168\\-194.6198\\-105\\-118.1341\\-195.7553\\-105\\-116.36\\-197.7084\\-105\\-115.9417\\-201.6146\\-105\\-115.5106\\-202.1463\\-105\\-114.7388\\-201.6146\\-105\\-113.5575\\-201.1625\\-105\\-112.962\\-201.6146\\-105\\-111.3338\\-203.5678\\-105\\-112.3467\\-205.5209\\-105\\-113.0634\\-207.474\\-105\\-113.5575\\-208.0504\\-105\\-115.5106\\-208.9074\\-105\\-116.9113\\-207.474\\-105\\-117.4637\\-206.4344\\-105\\-119.4168\\-206.9057\\-105\\-121.37\\-208.6487\\-105\\-125.2762\\-208.8498\\-105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "58" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-196.3584\\-105\\-61.56079\\-195.7553\\-105\\-61.42183\\-193.8021\\-105\\-53.0106\\-185.4116\\-105\\-51.05748\\-184.5899\\-105\\-49.10435\\-183.4166\\-105\\-48.51028\\-184.0365\\-105\\-50.05766\\-185.9896\\-105\\-53.99479\\-189.8959\\-105\\-56.91685\\-192.4655\\-105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002354" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "59" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.4001\\-105\\-49.95635\\-166.4584\\-105\\-49.10435\\-164.8212\\-105\\-46.83384\\-162.5521\\-105\\-45.1981\\-161.6349\\-105\\-43.24498\\-159.6909\\-105\\-41.29185\\-159.1255\\-105\\-39.33873\\-159.5937\\-105\\-37.3856\\-161.5102\\-105\\-35.43248\\-162.3404\\-105\\-33.62796\\-164.5053\\-105\\-35.73611\\-166.4584\\-105\\-37.3856\\-167.4548\\-105\\-39.33873\\-168.4039\\-105\\-41.29185\\-168.4039\\-105\\-43.24498\\-167.4633\\-105\\-45.1981\\-165.5472\\-105\\-46.74631\\-166.4584\\-105\\-47.15123\\-166.8991\\-105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "60" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2563\\-103\\-129.9453\\-205.5209\\-103\\-131.6929\\-203.5678\\-103\\-132.4907\\-201.6146\\-103\\-132.7422\\-199.6615\\-103\\-132.5094\\-197.7084\\-103\\-131.4611\\-195.7553\\-103\\-131.1356\\-195.4274\\-103\\-129.1825\\-194.1965\\-103\\-127.2293\\-193.6936\\-103\\-123.3231\\-193.6667\\-103\\-121.37\\-193.4453\\-103\\-119.4168\\-194.4794\\-103\\-115.5106\\-197.454\\-103\\-115.2912\\-197.7084\\-103\\-114.7308\\-199.6615\\-103\\-113.5575\\-200.5302\\-103\\-112.4907\\-201.6146\\-103\\-111.3225\\-203.5678\\-103\\-112.8672\\-207.474\\-103\\-113.5575\\-208.2587\\-103\\-115.5106\\-208.9013\\-103\\-117.3107\\-207.474\\-103\\-117.4637\\-206.6852\\-103\\-119.4168\\-207.4069\\-103\\-121.37\\-208.5536\\-103\\-123.3231\\-208.3438\\-103\\-125.2762\\-208.6277\\-103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "61" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-195.0559\\-103\\-62.08502\\-193.8021\\-103\\-53.0106\\-184.7531\\-103\\-51.05748\\-183.0235\\-103\\-49.67312\\-182.0834\\-103\\-49.10435\\-181.5269\\-103\\-48.71519\\-182.0834\\-103\\-50.10823\\-184.0365\\-103\\-51.74948\\-185.9896\\-103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002353" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "62" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.4001\\-103\\-49.95635\\-166.4584\\-103\\-49.10435\\-164.8212\\-103\\-46.85012\\-162.5521\\-103\\-45.1981\\-161.6301\\-103\\-43.24498\\-159.6909\\-103\\-41.29185\\-159.1255\\-103\\-39.33873\\-159.5937\\-103\\-37.3856\\-161.2653\\-103\\-35.43248\\-161.7527\\-103\\-34.58307\\-162.5521\\-103\\-33.63471\\-164.5053\\-103\\-36.67002\\-166.4584\\-103\\-39.33873\\-168.4039\\-103\\-41.29185\\-168.4039\\-103\\-43.24498\\-167.4633\\-103\\-45.1981\\-165.5472\\-103\\-46.74631\\-166.4584\\-103\\-47.15123\\-166.8991\\-103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "24" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "63" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2624\\-101\\-131.8849\\-203.5678\\-101\\-132.7319\\-201.6146\\-101\\-132.7526\\-197.7084\\-101\\-131.9734\\-195.7553\\-101\\-131.1356\\-194.9128\\-101\\-129.1825\\-193.7945\\-101\\-127.2293\\-193.6801\\-101\\-123.3231\\-193.1769\\-101\\-121.37\\-192.8527\\-101\\-119.4168\\-193.4477\\-101\\-117.4637\\-195.3288\\-101\\-115.5106\\-196.5167\\-101\\-114.4045\\-197.7084\\-101\\-113.6395\\-199.6615\\-101\\-112.3942\\-201.6146\\-101\\-111.3225\\-203.5678\\-101\\-113.3678\\-207.474\\-101\\-113.5575\\-207.685\\-101\\-115.5106\\-208.7848\\-101\\-117.4637\\-208.6312\\-101\\-121.37\\-208.5206\\-101\\-123.3231\\-208.156\\-101\\-125.2762\\-208.6141\\-101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "64" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-194.7142\\-101\\-63.36574\\-193.8021\\-101\\-59.63448\\-189.8959\\-101\\-58.86998\\-188.8507\\-101\\-53.0106\\-183.0145\\-101\\-49.10435\\-179.2079\\-101\\-47.96503\\-180.1303\\-101\\-48.494\\-182.0834\\-101\\-60.8231\\-194.3927\\-101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002352" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "65" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.4001\\-101\\-49.95635\\-166.4584\\-101\\-49.10435\\-164.8212\\-101\\-47.15123\\-162.3651\\-101\\-45.1981\\-161.5396\\-101\\-43.24498\\-159.6812\\-101\\-41.29185\\-159.1255\\-101\\-39.33873\\-159.5937\\-101\\-37.77495\\-160.599\\-101\\-37.3856\\-160.976\\-101\\-35.43248\\-161.5799\\-101\\-34.43372\\-162.5521\\-101\\-33.99295\\-164.5053\\-101\\-35.43248\\-165.4307\\-101\\-37.293\\-166.4584\\-101\\-39.33873\\-168.4039\\-101\\-41.29185\\-168.4039\\-101\\-43.24498\\-167.4586\\-101\\-45.1981\\-165.5423\\-101\\-46.74958\\-166.4584\\-101\\-47.15123\\-166.8991\\-101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "66" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.2803\\-99\\-130.1688\\-205.5209\\-99\\-131.8909\\-203.5678\\-99\\-132.7319\\-201.6146\\-99\\-132.7526\\-197.7084\\-99\\-132.1435\\-195.7553\\-99\\-131.1356\\-194.613\\-99\\-129.1825\\-193.381\\-99\\-127.2293\\-193.4304\\-99\\-125.2762\\-192.8424\\-99\\-123.3231\\-192.3532\\-99\\-121.37\\-192.1117\\-99\\-119.4168\\-192.7555\\-99\\-117.4637\\-194.8091\\-99\\-115.8185\\-195.7553\\-99\\-113.6522\\-197.7084\\-99\\-113.2535\\-199.6615\\-99\\-112.3999\\-201.6146\\-99\\-111.3453\\-203.5678\\-99\\-112.5082\\-205.5209\\-99\\-113.5575\\-206.7403\\-99\\-115.5106\\-208.4259\\-99\\-117.4637\\-208.7847\\-99\\-119.4168\\-208.9475\\-99\\-123.3231\\-208.6553\\-99\\-125.2762\\-208.839\\-99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "67" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-194.5872\\-99\\-63.49121\\-193.8021\\-99\\-62.77623\\-192.7485\\-99\\-60.8231\\-190.4311\\-99\\-60.17585\\-189.8959\\-99\\-59.65918\\-187.9428\\-99\\-58.86998\\-186.8823\\-99\\-54.96373\\-182.9913\\-99\\-51.05748\\-179.1537\\-99\\-49.10435\\-177.7188\\-99\\-48.43719\\-178.1771\\-99\\-48.30838\\-180.1303\\-99\\-49.10435\\-181.0674\\-99\\-58.86998\\-190.7943\\-99\\-60.8231\\-192.9747\\-99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002351" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "68" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.4003\\-99\\-49.96194\\-166.4584\\-99\\-48.86409\\-164.5053\\-99\\-47.88497\\-162.5521\\-99\\-47.15123\\-161.8377\\-99\\-45.1981\\-161.262\\-99\\-43.24498\\-159.667\\-99\\-41.29185\\-159.1255\\-99\\-39.33873\\-159.5898\\-99\\-37.75181\\-160.599\\-99\\-37.3856\\-160.9558\\-99\\-35.43248\\-161.5799\\-99\\-34.42916\\-162.5521\\-99\\-34.7133\\-164.5053\\-99\\-37.30297\\-166.4584\\-99\\-39.33873\\-168.4039\\-99\\-41.29185\\-168.4039\\-99\\-43.24498\\-167.3163\\-99\\-45.1981\\-165.4048\\-99\\-46.7823\\-166.4584\\-99\\-47.15123\\-166.8991\\-99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "27" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "69" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.4694\\-97\\-129.1825\\-207.0796\\-97\\-130.5641\\-205.5209\\-97\\-131.9121\\-203.5678\\-97\\-132.7319\\-201.6146\\-97\\-132.7526\\-197.7084\\-97\\-132.5153\\-195.7553\\-97\\-131.1356\\-193.6792\\-97\\-129.1825\\-192.9335\\-97\\-127.2293\\-192.8198\\-97\\-125.2762\\-192.0154\\-97\\-123.3231\\-191.6133\\-97\\-121.37\\-191.6496\\-97\\-119.4168\\-192.6976\\-97\\-117.4637\\-194.4226\\-97\\-115.5106\\-195.3097\\-97\\-113.5575\\-196.9853\\-97\\-113.0067\\-197.7084\\-97\\-112.9671\\-199.6615\\-97\\-112.5857\\-201.6146\\-97\\-111.6991\\-203.5678\\-97\\-112.3305\\-205.5209\\-97\\-113.5575\\-206.8959\\-97\\-115.5106\\-208.2563\\-97\\-117.4637\\-208.5615\\-97\\-121.37\\-208.9652\\-97\\-125.2762\\-208.9652\\-97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "70" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-193.2986\\-97\\-63.35246\\-191.849\\-97\\-61.40206\\-189.8959\\-97\\-60.8231\\-188.3665\\-97\\-60.50223\\-187.9428\\-97\\-59.94572\\-185.9896\\-97\\-58.86998\\-185.0267\\-97\\-53.93615\\-180.1303\\-97\\-52.02604\\-178.1771\\-97\\-51.05748\\-177.4293\\-97\\-49.10435\\-178.0053\\-97\\-48.94843\\-178.1771\\-97\\-50.15179\\-180.1303\\-97\\-51.05748\\-181.0287\\-97\\-51.90258\\-182.0834\\-97\\-53.74945\\-184.0365\\-97\\-54.96373\\-185.1758\\-97\\-56.01004\\-185.9896\\-97\\-58.86998\\-188.8354\\-97\\-60.09288\\-189.8959\\-97\\-60.8231\\-191.6205\\-97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002350" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "71" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.3654\\-97\\-50.15721\\-166.4584\\-97\\-49.23979\\-164.5053\\-97\\-48.00927\\-162.5521\\-97\\-47.15123\\-161.6899\\-97\\-45.1981\\-160.9957\\-97\\-43.24498\\-159.6578\\-97\\-41.29185\\-159.0989\\-97\\-39.33873\\-159.5058\\-97\\-37.3856\\-160.4221\\-97\\-35.43248\\-161.4912\\-97\\-34.16401\\-162.5521\\-97\\-35.16996\\-164.5053\\-97\\-35.43248\\-164.6796\\-97\\-39.33873\\-168.4039\\-97\\-41.29185\\-168.4039\\-97\\-43.24498\\-167.103\\-97\\-45.1981\\-165.2288\\-97\\-46.83469\\-166.4584\\-97\\-47.15123\\-166.8646\\-97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "72" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.0542\\-95\\-129.7661\\-207.474\\-95\\-131.1356\\-205.4564\\-95\\-132.1169\\-203.5678\\-95\\-132.7422\\-201.6146\\-95\\-132.8069\\-197.7084\\-95\\-132.7848\\-195.7553\\-95\\-131.9804\\-193.8021\\-95\\-131.1356\\-193.0497\\-95\\-129.1825\\-192.6535\\-95\\-127.2293\\-191.7676\\-95\\-125.2762\\-191.1773\\-95\\-123.3231\\-191.3522\\-95\\-121.37\\-191.6746\\-95\\-119.4168\\-192.7123\\-95\\-117.4637\\-193.9507\\-95\\-115.5106\\-194.8503\\-95\\-113.5575\\-196.658\\-95\\-112.6116\\-197.7084\\-95\\-112.4406\\-199.6615\\-95\\-112.8113\\-201.6146\\-95\\-112.2396\\-203.5678\\-95\\-111.7659\\-205.5209\\-95\\-112.9203\\-207.474\\-95\\-113.5575\\-208.1073\\-95\\-115.5106\\-208.6448\\-95\\-117.4637\\-208.5421\\-95\\-119.4168\\-208.6712\\-95\\-121.37\\-208.9652\\-95\\-125.2762\\-208.9652\\-95\\-127.2293\\-208.7847\\-95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "73" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-189.7594\\-95\\-62.74294\\-187.9428\\-95\\-61.8286\\-185.9896\\-95\\-58.86998\\-183.4462\\-95\\-55.50892\\-180.1303\\-95\\-53.0106\\-177.4369\\-95\\-51.05748\\-177.3568\\-95\\-50.34042\\-178.1771\\-95\\-51.9435\\-180.1303\\-95\\-53.12157\\-182.0834\\-95\\-55.0764\\-184.0365\\-95\\-56.91685\\-185.3731\\-95\\-58.86998\\-187.3188\\-95\\-59.64987\\-187.9428\\-95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002349" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "74" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-168.0558\\-95\\-50.6214\\-166.4584\\-95\\-49.76434\\-164.5053\\-95\\-47.15123\\-161.6794\\-95\\-45.1981\\-160.9558\\-95\\-43.24498\\-159.6357\\-95\\-41.29185\\-158.5933\\-95\\-39.33873\\-158.4476\\-95\\-37.3856\\-159.5415\\-95\\-35.43248\\-160.7746\\-95\\-33.47935\\-161.8704\\-95\\-32.62582\\-162.5521\\-95\\-33.47935\\-163.9784\\-95\\-34.45591\\-164.5053\\-95\\-35.43248\\-164.7758\\-95\\-39.33873\\-168.4039\\-95\\-41.29185\\-168.4039\\-95\\-43.24498\\-167.3163\\-95\\-45.1981\\-165.3988\\-95\\-47.15123\\-166.3658\\-95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "75" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.2248\\-93\\-131.688\\-205.5209\\-93\\-132.5172\\-203.5678\\-93\\-132.7848\\-201.6146\\-93\\-133.4882\\-197.7084\\-93\\-133.1263\\-195.7553\\-93\\-132.4845\\-193.8021\\-93\\-131.1356\\-192.334\\-93\\-129.1825\\-191.8723\\-93\\-127.2293\\-190.9495\\-93\\-125.2762\\-190.3471\\-93\\-123.3231\\-190.9319\\-93\\-121.37\\-192.0106\\-93\\-119.4168\\-192.9018\\-93\\-117.4637\\-193.6277\\-93\\-115.5106\\-194.6485\\-93\\-112.4275\\-197.7084\\-93\\-111.7137\\-199.6615\\-93\\-112.6352\\-201.6146\\-93\\-112.6331\\-203.5678\\-93\\-111.7398\\-205.5209\\-93\\-112.5382\\-207.474\\-93\\-113.5575\\-208.4834\\-93\\-115.5106\\-208.9563\\-93\\-117.4637\\-208.7847\\-93\\-119.4168\\-208.8201\\-93\\-121.37\\-208.9652\\-93\\-127.2293\\-208.9563\\-93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "76" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-190.9084\\-93\\-63.79619\\-189.8959\\-93\\-64.03902\\-187.9428\\-93\\-63.5418\\-185.9896\\-93\\-62.77623\\-185.247\\-93\\-60.8231\\-183.7641\\-93\\-58.86998\\-182.6535\\-93\\-56.91685\\-180.4785\\-93\\-56.50862\\-180.1303\\-93\\-54.96373\\-178.1414\\-93\\-53.0106\\-177.1517\\-93\\-52.19029\\-178.1771\\-93\\-53.44375\\-180.1303\\-93\\-54.25634\\-182.0834\\-93\\-56.91685\\-184.6781\\-93\\-60.17767\\-187.9428\\-93\\-61.95661\\-189.8959\\-93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002348" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "77" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-168.5063\\-93\\-43.24498\\-167.4916\\-93\\-45.1981\\-165.5616\\-93\\-47.15123\\-165.7385\\-93\\-49.10435\\-167.6698\\-93\\-50.98299\\-166.4584\\-93\\-49.96546\\-164.5053\\-93\\-48.23468\\-162.5521\\-93\\-47.15123\\-161.5249\\-93\\-45.1981\\-160.3858\\-93\\-43.24498\\-159.3859\\-93\\-42.35884\\-158.6459\\-93\\-41.29185\\-157.4286\\-93\\-39.33873\\-156.562\\-93\\-37.3856\\-157.5049\\-93\\-36.12515\\-158.6459\\-93\\-33.47935\\-160.6804\\-93\\-31.52623\\-161.8348\\-93\\-30.62537\\-162.5521\\-93\\-31.52623\\-163.9868\\-93\\-32.10945\\-164.5053\\-93\\-33.47935\\-165.0689\\-93\\-35.43248\\-165.3591\\-93\\-36.77838\\-166.4584\\-93\\-37.3856\\-167.1208\\-93\\-39.33873\\-168.5063\\-93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "78" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.2248\\-91\\-131.8729\\-205.5209\\-91\\-132.7739\\-203.5678\\-91\\-133.2503\\-201.6146\\-91\\-133.9235\\-199.6615\\-91\\-134.2849\\-197.7084\\-91\\-133.7454\\-195.7553\\-91\\-132.8069\\-193.8021\\-91\\-131.1356\\-191.662\\-91\\-129.1825\\-191.2717\\-91\\-127.2293\\-190.5699\\-91\\-125.2762\\-189.6484\\-91\\-123.3231\\-190.7419\\-91\\-121.37\\-192.3373\\-91\\-119.4168\\-193.1257\\-91\\-117.4637\\-193.3957\\-91\\-115.5106\\-194.4589\\-91\\-112.401\\-197.7084\\-91\\-111.3004\\-199.6615\\-91\\-112.4751\\-201.6146\\-91\\-113.4345\\-203.5678\\-91\\-112.3213\\-205.5209\\-91\\-112.5432\\-207.474\\-91\\-113.5575\\-208.4834\\-91\\-115.5106\\-208.9652\\-91\\-119.4168\\-208.9218\\-91\\-123.3231\\-208.9652\\-91\\-127.2293\\-208.9563\\-91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "79" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-190.1274\\-91\\-64.89211\\-189.8959\\-91\\-65.32645\\-187.9428\\-91\\-65.17381\\-185.9896\\-91\\-64.72935\\-184.9991\\-91\\-63.81877\\-184.0365\\-91\\-62.77623\\-183.2329\\-91\\-60.64872\\-182.0834\\-91\\-59.31023\\-180.1303\\-91\\-58.86998\\-179.2777\\-91\\-57.92017\\-178.1771\\-91\\-55.45201\\-176.224\\-91\\-54.96373\\-175.987\\-91\\-54.58008\\-176.224\\-91\\-54.11892\\-178.1771\\-91\\-54.96373\\-180.0446\\-91\\-56.04308\\-182.0834\\-91\\-58.86998\\-184.9236\\-91\\-59.72149\\-185.9896\\-91\\-61.476\\-187.9428\\-91\\-61.98135\\-189.8959\\-91\\-62.77623\\-191.2522\\-91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002347" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "29" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "80" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-169.2568\\-91\\-43.24498\\-167.7991\\-91\\-45.1981\\-165.6988\\-91\\-47.15123\\-165.4679\\-91\\-49.10435\\-167.3957\\-91\\-51.05748\\-166.9141\\-91\\-51.37229\\-166.4584\\-91\\-51.05748\\-166.0349\\-91\\-49.10435\\-162.6928\\-91\\-47.15123\\-160.7874\\-91\\-45.1981\\-159.5259\\-91\\-44.07686\\-158.6459\\-91\\-43.51702\\-156.6928\\-91\\-43.24498\\-156.3081\\-91\\-41.29185\\-154.7006\\-91\\-37.3856\\-154.6704\\-91\\-35.43248\\-155.4899\\-91\\-34.00301\\-156.6928\\-91\\-33.47935\\-157.5331\\-91\\-33.14473\\-158.6459\\-91\\-31.52623\\-160.5746\\-91\\-29.5731\\-161.8005\\-91\\-28.62636\\-162.5521\\-91\\-28.72675\\-164.5053\\-91\\-31.52623\\-164.769\\-91\\-33.47935\\-166.1177\\-91\\-35.43248\\-167.1242\\-91\\-37.3856\\-168.843\\-91\\-39.33873\\-169.3881\\-91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "81" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.2248\\-89\\-131.8729\\-205.5209\\-89\\-133.1553\\-203.5678\\-89\\-133.9641\\-201.6146\\-89\\-134.4482\\-199.6615\\-89\\-134.6953\\-197.7084\\-89\\-134.0749\\-195.7553\\-89\\-133.2108\\-193.8021\\-89\\-131.7747\\-191.849\\-89\\-131.1356\\-191.3407\\-89\\-129.1825\\-191.2871\\-89\\-127.2293\\-190.5764\\-89\\-125.2762\\-189.5598\\-89\\-123.3231\\-190.7252\\-89\\-121.37\\-192.2837\\-89\\-119.4168\\-193.0469\\-89\\-117.4637\\-193.0139\\-89\\-115.5106\\-193.2997\\-89\\-115.0745\\-193.8021\\-89\\-113.9156\\-195.7553\\-89\\-112.1745\\-197.7084\\-89\\-111.0315\\-199.6615\\-89\\-112.2177\\-201.6146\\-89\\-113.5575\\-202.759\\-89\\-115.5106\\-203.4448\\-89\\-117.4637\\-203.168\\-89\\-118.7048\\-203.5678\\-89\\-119.4168\\-204.4915\\-89\\-119.6777\\-205.5209\\-89\\-119.4168\\-205.864\\-89\\-117.4637\\-205.9586\\-89\\-116.7884\\-205.5209\\-89\\-115.5106\\-203.8049\\-89\\-113.5575\\-204.7265\\-89\\-112.7127\\-205.5209\\-89\\-112.5382\\-207.474\\-89\\-113.5575\\-208.4834\\-89\\-115.5106\\-208.9652\\-89\\-117.4637\\-208.8473\\-89\\-119.4168\\-208.5378\\-89\\-123.3231\\-208.9303\\-89\\-127.2293\\-208.9563\\-89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "82" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-192.9191\\-89\\-66.3895\\-189.8959\\-89\\-67.20176\\-187.9428\\-89\\-67.21145\\-184.0365\\-89\\-66.68247\\-182.6259\\-89\\-66.21297\\-182.0834\\-89\\-67.30222\\-180.1303\\-89\\-67.51163\\-178.1771\\-89\\-66.68247\\-177.742\\-89\\-64.72935\\-179.6383\\-89\\-62.77623\\-180.8028\\-89\\-60.8231\\-180.4755\\-89\\-58.86998\\-178.6086\\-89\\-56.95053\\-178.1771\\-89\\-57.11739\\-180.1303\\-89\\-57.88578\\-182.0834\\-89\\-58.86998\\-183.0235\\-89\\-60.8231\\-183.8326\\-89\\-60.96261\\-184.0365\\-89\\-61.8792\\-187.9428\\-89\\-61.9398\\-189.8959\\-89\\-62.14433\\-191.849\\-89\\-62.77623\\-192.6421\\-89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002346" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "83" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-172.592\\-89\\-43.24498\\-169.8198\\-89\\-45.75188\\-166.4584\\-89\\-47.15123\\-165.3223\\-89\\-49.10435\\-166.551\\-89\\-51.05748\\-167.6263\\-89\\-51.96246\\-166.4584\\-89\\-50.05957\\-162.5521\\-89\\-45.96318\\-158.6459\\-89\\-43.70415\\-154.7396\\-89\\-43.24498\\-154.2865\\-89\\-41.29185\\-153.5093\\-89\\-37.3856\\-153.5093\\-89\\-35.43248\\-153.7893\\-89\\-33.47935\\-155.4951\\-89\\-32.43875\\-156.6928\\-89\\-31.69385\\-158.6459\\-89\\-29.5731\\-160.6219\\-89\\-27.61998\\-161.9449\\-89\\-27.05613\\-162.5521\\-89\\-27.61998\\-164.3738\\-89\\-29.5731\\-163.9172\\-89\\-30.63755\\-164.5053\\-89\\-31.52623\\-165.589\\-89\\-32.06223\\-166.4584\\-89\\-32.80389\\-168.4115\\-89\\-33.47935\\-169.2386\\-89\\-35.43248\\-171.1522\\-89\\-36.8222\\-172.3178\\-89\\-37.3856\\-172.6167\\-89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "84" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.2312\\-87\\-131.1356\\-206.319\\-87\\-133.6917\\-203.5678\\-87\\-134.4548\\-201.6146\\-87\\-134.6953\\-199.6615\\-87\\-134.7058\\-197.7084\\-87\\-134.4559\\-195.7553\\-87\\-133.931\\-193.8021\\-87\\-133.0887\\-192.1611\\-87\\-132.8058\\-191.849\\-87\\-131.1356\\-190.8984\\-87\\-129.1825\\-191.1179\\-87\\-127.2293\\-189.8583\\-87\\-125.2762\\-189.1465\\-87\\-123.3231\\-190.3842\\-87\\-121.37\\-192.311\\-87\\-119.4168\\-192.9202\\-87\\-117.4637\\-192.6685\\-87\\-115.5106\\-192.7573\\-87\\-112.7466\\-195.7553\\-87\\-111.5668\\-197.7084\\-87\\-110.6376\\-199.6615\\-87\\-110.196\\-201.6146\\-87\\-111.6043\\-203.1012\\-87\\-113.5575\\-202.6755\\-87\\-115.5106\\-202.5357\\-87\\-117.4637\\-201.5475\\-87\\-119.4168\\-201.1874\\-87\\-120.8817\\-201.6146\\-87\\-120.8671\\-203.5678\\-87\\-120.6791\\-205.5209\\-87\\-121.0684\\-207.474\\-87\\-123.3231\\-208.7778\\-87\\-125.2762\\-208.9652\\-87\\-127.2293\\-208.9563\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "85" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-188.7396\\-87\\-122.7666\\-187.9428\\-87\\-122.1597\\-185.9896\\-87\\-121.37\\-185.4677\\-87\\-119.4168\\-185.8676\\-87\\-118.4684\\-187.9428\\-87\\-119.4168\\-189.1095\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "86" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-117.4637\\-208.4865\\-87\\-118.626\\-207.474\\-87\\-115.7982\\-205.5209\\-87\\-115.5106\\-205.2052\\-87\\-113.5575\\-205.0111\\-87\\-111.6043\\-204.3045\\-87\\-111.1359\\-205.5209\\-87\\-112.5333\\-207.474\\-87\\-113.5575\\-208.4834\\-87\\-115.5106\\-208.9563\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "87" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-196.2396\\-87\\-66.11471\\-195.7553\\-87\\-66.34738\\-193.8021\\-87\\-66.68247\\-192.9685\\-87\\-67.80195\\-191.849\\-87\\-70.29349\\-189.8959\\-87\\-70.58872\\-189.5432\\-87\\-71.07291\\-187.9428\\-87\\-71.10316\\-184.0365\\-87\\-71.62538\\-182.0834\\-87\\-71.92943\\-180.1303\\-87\\-71.94951\\-178.1771\\-87\\-72.54185\\-176.6716\\-87\\-72.54185\\-176.1085\\-87\\-70.58872\\-175.5968\\-87\\-69.88737\\-176.224\\-87\\-69.48196\\-178.1771\\-87\\-68.6356\\-178.7995\\-87\\-66.68247\\-179.3808\\-87\\-66.12685\\-180.1303\\-87\\-66.77637\\-182.0834\\-87\\-63.25056\\-184.0365\\-87\\-62.77623\\-184.1821\\-87\\-61.74595\\-185.9896\\-87\\-60.8231\\-188.9193\\-87\\-59.91312\\-187.9428\\-87\\-59.01359\\-185.9896\\-87\\-58.42608\\-185.9896\\-87\\-56.91685\\-186.8338\\-87\\-54.16853\\-187.9428\\-87\\-53.81932\\-189.8959\\-87\\-56.15433\\-191.849\\-87\\-58.86998\\-193.7716\\-87\\-60.8231\\-193.5186\\-87\\-62.77623\\-197.0927\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "88" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-174.5184\\-87\\-39.33873\\-174.1701\\-87\\-41.29185\\-173.2812\\-87\\-43.24498\\-172.6167\\-87\\-43.64448\\-172.3178\\-87\\-45.1981\\-170.0705\\-87\\-46.04807\\-168.4115\\-87\\-46.57315\\-166.4584\\-87\\-47.15123\\-165.7923\\-87\\-49.10435\\-165.4072\\-87\\-51.05748\\-167.1669\\-87\\-51.84871\\-166.4584\\-87\\-51.90926\\-164.5053\\-87\\-51.31656\\-162.5521\\-87\\-47.02916\\-158.6459\\-87\\-45.9049\\-156.6928\\-87\\-43.24498\\-153.8864\\-87\\-41.29185\\-153.1832\\-87\\-37.3856\\-153.1832\\-87\\-35.43248\\-153.3247\\-87\\-33.47935\\-154.195\\-87\\-32.92405\\-154.7396\\-87\\-31.37762\\-156.6928\\-87\\-30.47495\\-158.6459\\-87\\-29.5731\\-159.6167\\-87\\-28.32689\\-160.599\\-87\\-26.81325\\-162.5521\\-87\\-27.61998\\-163.192\\-87\\-29.5731\\-163.7615\\-87\\-30.38875\\-164.5053\\-87\\-31.2444\\-168.4115\\-87\\-32.49636\\-170.3646\\-87\\-33.47935\\-171.5319\\-87\\-35.43248\\-173.4851\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002345" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "89" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.20655\\-189.8959\\-87\\58.02259\\-187.9428\\-87\\59.41157\\-185.9896\\-87\\60.00053\\-184.0365\\-87\\60.27065\\-183.7757\\-87\\62.22377\\-183.7757\\-87\\62.49389\\-184.0365\\-87\\62.80058\\-185.9896\\-87\\62.79063\\-187.9428\\-87\\62.22377\\-189.2237\\-87\\61.54275\\-189.8959\\-87\\60.27065\\-190.5001\\-87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "90" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-208.2827\\-85\\-131.1356\\-206.5541\\-85\\-132.1589\\-205.5209\\-85\\-133.8307\\-203.5678\\-85\\-134.6749\\-201.6146\\-85\\-134.7058\\-195.7553\\-85\\-134.4638\\-193.8021\\-85\\-133.7707\\-191.849\\-85\\-133.0887\\-191.1351\\-85\\-131.1356\\-190.7262\\-85\\-129.1825\\-190.9919\\-85\\-127.2293\\-189.0407\\-85\\-125.8004\\-187.9428\\-85\\-124.026\\-185.9896\\-85\\-123.3231\\-185.3697\\-85\\-121.37\\-183.9557\\-85\\-119.4168\\-183.7045\\-85\\-118.8444\\-184.0365\\-85\\-117.6764\\-185.9896\\-85\\-117.2399\\-187.9428\\-85\\-118.2866\\-189.8959\\-85\\-116.6546\\-191.849\\-85\\-115.5106\\-192.5474\\-85\\-112.4242\\-195.7553\\-85\\-111.2374\\-197.7084\\-85\\-110.4394\\-199.6615\\-85\\-109.2842\\-201.6146\\-85\\-109.3151\\-203.5678\\-85\\-110.6422\\-205.5209\\-85\\-113.5575\\-208.4834\\-85\\-115.5106\\-208.9218\\-85\\-117.5722\\-207.474\\-85\\-115.5106\\-205.2372\\-85\\-113.5575\\-203.9157\\-85\\-113.2772\\-203.5678\\-85\\-115.5106\\-202.3856\\-85\\-117.4637\\-200.5849\\-85\\-118.796\\-199.6615\\-85\\-118.9535\\-197.7084\\-85\\-119.4168\\-196.1602\\-85\\-119.9051\\-195.7553\\-85\\-121.37\\-195.4232\\-85\\-122.2923\\-195.7553\\-85\\-123.3231\\-196.9922\\-85\\-123.5654\\-197.7084\\-85\\-123.3231\\-198.4578\\-85\\-122.6141\\-199.6615\\-85\\-122.4686\\-201.6146\\-85\\-122.0193\\-205.5209\\-85\\-122.3811\\-207.474\\-85\\-123.3231\\-208.4609\\-85\\-125.2762\\-209.0501\\-85\\-127.2293\\-209.0112\\-85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "91" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-200.1789\\-85\\-63.93182\\-199.6615\\-85\\-64.72935\\-199.0986\\-85\\-67.31564\\-197.7084\\-85\\-69.4494\\-195.7553\\-85\\-71.3535\\-193.8021\\-85\\-72.54185\\-192.33\\-85\\-74.49497\\-188.6034\\-85\\-74.65656\\-187.9428\\-85\\-74.61704\\-185.9896\\-85\\-73.571\\-182.0834\\-85\\-72.75703\\-180.1303\\-85\\-72.5576\\-178.1771\\-85\\-73.53934\\-176.224\\-85\\-72.54185\\-174.6189\\-85\\-70.58872\\-175.3977\\-85\\-69.77938\\-176.224\\-85\\-70.58872\\-177.7586\\-85\\-72.48441\\-178.1771\\-85\\-71.98988\\-180.1303\\-85\\-70.58872\\-180.4493\\-85\\-68.6356\\-181.1068\\-85\\-68.05533\\-180.1303\\-85\\-67.44541\\-178.1771\\-85\\-66.68247\\-176.7123\\-85\\-64.72935\\-176.383\\-85\\-62.39588\\-178.1771\\-85\\-60.60991\\-180.1303\\-85\\-60.45522\\-182.0834\\-85\\-58.44318\\-184.0365\\-85\\-57.31445\\-185.9896\\-85\\-55.26031\\-187.9428\\-85\\-54.15371\\-189.8959\\-85\\-54.51583\\-193.8021\\-85\\-53.51923\\-195.7553\\-85\\-53.062\\-197.7084\\-85\\-54.96373\\-197.9683\\-85\\-56.91685\\-197.857\\-85\\-58.86998\\-196.4682\\-85\\-60.8231\\-196.7683\\-85\\-61.61045\\-197.7084\\-85\\-62.27012\\-199.6615\\-85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "92" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-174.836\\-85\\-43.24498\\-174.2\\-85\\-45.36086\\-172.3178\\-85\\-46.26588\\-170.3646\\-85\\-46.7921\\-168.4115\\-85\\-47.51505\\-166.4584\\-85\\-49.10435\\-164.2151\\-85\\-51.05748\\-164.6861\\-85\\-52.45744\\-162.5521\\-85\\-51.68159\\-160.599\\-85\\-51.05748\\-160.0959\\-85\\-49.10435\\-159.6415\\-85\\-47.91771\\-158.6459\\-85\\-46.06449\\-156.6928\\-85\\-43.24498\\-153.8864\\-85\\-41.29185\\-153.1832\\-85\\-35.43248\\-153.1832\\-85\\-33.47935\\-153.7925\\-85\\-32.40846\\-154.7396\\-85\\-30.45743\\-156.6928\\-85\\-29.3584\\-158.6459\\-85\\-27.61998\\-160.1497\\-85\\-26.65626\\-160.599\\-85\\-25.66685\\-161.4734\\-85\\-23.71373\\-162.5761\\-85\\-25.66685\\-163.0915\\-85\\-27.61998\\-162.9292\\-85\\-29.63968\\-164.5053\\-85\\-30.42159\\-168.4115\\-85\\-31.18571\\-170.3646\\-85\\-32.46399\\-172.3178\\-85\\-34.22523\\-174.2709\\-85\\-35.43248\\-175.273\\-85\\-37.3856\\-175.9339\\-85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002344" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "93" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-196.7531\\-85\\52.82857\\-195.7553\\-85\\54.04394\\-193.8021\\-85\\54.41127\\-192.0613\\-85\\55.88823\\-189.8959\\-85\\55.92752\\-185.9896\\-85\\56.3644\\-185.0499\\-85\\57.10017\\-184.0365\\-85\\58.12075\\-182.0834\\-85\\60.27065\\-180.014\\-85\\64.1769\\-179.7319\\-85\\66.13003\\-179.8174\\-85\\66.74976\\-180.1303\\-85\\68.08315\\-181.5453\\-85\\68.27015\\-182.0834\\-85\\66.68667\\-184.0365\\-85\\66.13003\\-185.0486\\-85\\65.33375\\-185.9896\\-85\\64.56055\\-187.9428\\-85\\64.49564\\-189.8959\\-85\\62.6981\\-191.849\\-85\\62.22377\\-192.1901\\-85\\60.27065\\-192.6464\\-85\\58.31752\\-194.102\\-85\\56.3644\\-195.8627\\-85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "94" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-209.4498\\-83\\-129.1825\\-208.4828\\-83\\-130.7785\\-207.474\\-83\\-132.6034\\-205.5209\\-83\\-133.869\\-203.5678\\-83\\-134.6749\\-201.6146\\-83\\-134.8548\\-195.7553\\-83\\-134.8548\\-193.8021\\-83\\-134.1254\\-191.849\\-83\\-133.0887\\-190.8123\\-83\\-131.1356\\-190.7395\\-83\\-129.1825\\-190.8499\\-83\\-128.3447\\-189.8959\\-83\\-127.2293\\-188.152\\-83\\-125.2762\\-185.841\\-83\\-123.3231\\-184.7318\\-83\\-121.37\\-183.0988\\-83\\-119.4168\\-182.622\\-83\\-117.4637\\-183.0668\\-83\\-116.6902\\-184.0365\\-83\\-116.5641\\-185.9896\\-83\\-116.4494\\-189.8959\\-83\\-115.551\\-191.849\\-83\\-114.3584\\-193.8021\\-83\\-112.4182\\-195.7553\\-83\\-110.9622\\-197.7084\\-83\\-110.1906\\-199.6615\\-83\\-109.2742\\-201.6146\\-83\\-109.3257\\-203.5678\\-83\\-110.6324\\-205.5209\\-83\\-113.5575\\-208.4506\\-83\\-115.5106\\-208.873\\-83\\-117.0384\\-207.474\\-83\\-115.6614\\-205.5209\\-83\\-113.9143\\-203.5678\\-83\\-115.5106\\-202.3589\\-83\\-118.0031\\-199.6615\\-83\\-118.3705\\-195.7553\\-83\\-119.4168\\-194.7983\\-83\\-121.37\\-194.2591\\-83\\-123.3231\\-194.4555\\-83\\-125.2762\\-195.122\\-83\\-126.357\\-195.7553\\-83\\-126.6735\\-197.7084\\-83\\-125.2762\\-198.459\\-83\\-124.3997\\-199.6615\\-83\\-123.3231\\-201.7774\\-83\\-122.6912\\-203.5678\\-83\\-122.6322\\-205.5209\\-83\\-123.4178\\-207.474\\-83\\-124.8329\\-209.4271\\-83\\-125.2762\\-209.8457\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "95" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-53.0106\\-201.7632\\-83\\-54.96373\\-200.4173\\-83\\-56.91685\\-199.8972\\-83\\-58.86998\\-198.7744\\-83\\-60.8231\\-197.214\\-83\\-62.77623\\-196.9594\\-83\\-63.90371\\-195.7553\\-83\\-64.72935\\-194.5758\\-83\\-66.24302\\-195.7553\\-83\\-66.68247\\-196.7318\\-83\\-68.6356\\-197.5066\\-83\\-70.58872\\-196.5803\\-83\\-71.71024\\-195.7553\\-83\\-73.64672\\-193.8021\\-83\\-74.99562\\-191.849\\-83\\-76.06877\\-189.8959\\-83\\-76.64754\\-187.9428\\-83\\-76.18176\\-185.9896\\-83\\-74.49497\\-184.3167\\-83\\-72.54185\\-183.9297\\-83\\-71.45778\\-182.0834\\-83\\-71.66675\\-180.1303\\-83\\-71.29819\\-178.1771\\-83\\-71.60017\\-176.224\\-83\\-70.58872\\-175.0033\\-83\\-68.6356\\-173.9363\\-83\\-64.72935\\-173.9047\\-83\\-62.77623\\-175.1421\\-83\\-60.8231\\-177.2901\\-83\\-60.235\\-178.1771\\-83\\-59.48398\\-180.1303\\-83\\-58.05363\\-182.0834\\-83\\-57.25434\\-184.0365\\-83\\-56.89414\\-185.9896\\-83\\-55.79869\\-187.9428\\-83\\-54.31802\\-189.8959\\-83\\-53.75125\\-191.849\\-83\\-51.06705\\-195.7553\\-83\\-50.68137\\-197.7084\\-83\\-50.72488\\-199.6615\\-83\\-51.05748\\-200.7047\\-83\\-52.34906\\-201.6146\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "96" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-176.5601\\-83\\-41.29185\\-175.8917\\-83\\-43.24498\\-175.3425\\-83\\-44.59356\\-174.2709\\-83\\-46.23733\\-172.3178\\-83\\-47.24597\\-170.3646\\-83\\-47.84209\\-168.4115\\-83\\-48.2009\\-166.4584\\-83\\-48.82253\\-164.5053\\-83\\-49.10435\\-164.1942\\-83\\-51.05748\\-163.624\\-83\\-53.0106\\-163.1879\\-83\\-53.54882\\-162.5521\\-83\\-53.18499\\-160.599\\-83\\-51.05748\\-159.3758\\-83\\-49.10435\\-159.2031\\-83\\-47.15123\\-157.7373\\-83\\-43.24498\\-153.8864\\-83\\-41.29185\\-153.1832\\-83\\-37.3856\\-153.1832\\-83\\-35.43248\\-153.133\\-83\\-33.47935\\-153.5905\\-83\\-31.52623\\-154.7018\\-83\\-29.33574\\-156.6928\\-83\\-28.29412\\-158.6459\\-83\\-27.61998\\-159.299\\-83\\-25.66685\\-159.8874\\-83\\-23.71373\\-160.0616\\-83\\-23.03087\\-160.599\\-83\\-22.73716\\-162.5521\\-83\\-23.71373\\-163.3007\\-83\\-25.66685\\-162.9895\\-83\\-27.61998\\-163.291\\-83\\-28.79086\\-164.5053\\-83\\-29.06779\\-166.4584\\-83\\-29.5731\\-168.1967\\-83\\-30.34645\\-170.3646\\-83\\-31.1545\\-172.3178\\-83\\-32.43212\\-174.2709\\-83\\-33.47935\\-175.3113\\-83\\-35.43248\\-176.6207\\-83\\-37.3856\\-176.9683\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "97" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "32.9269\\-201.9917\\-83\\32.45412\\-201.6146\\-83\\32.30545\\-199.6615\\-83\\33.9982\\-197.7084\\-83\\34.88002\\-196.8331\\-83\\36.83315\\-195.3577\\-83\\38.47033\\-195.7553\\-83\\37.98462\\-197.7084\\-83\\36.83315\\-198.512\\-83\\35.96424\\-199.6615\\-83\\34.88002\\-200.6521\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002343" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "98" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-199.8684\\-83\\48.37751\\-199.6615\\-83\\47.7168\\-197.7084\\-83\\48.5519\\-196.2787\\-83\\49.11595\\-195.7553\\-83\\50.50502\\-194.0591\\-83\\50.83494\\-193.8021\\-83\\51.98537\\-191.849\\-83\\52.71585\\-189.8959\\-83\\53.32094\\-187.9428\\-83\\53.13131\\-185.9896\\-83\\54.20611\\-184.0365\\-83\\56.09991\\-182.0834\\-83\\56.21579\\-180.1303\\-83\\56.07587\\-178.1771\\-83\\56.3644\\-177.6482\\-83\\58.31752\\-175.5232\\-83\\60.27065\\-174.0622\\-83\\62.22377\\-173.9562\\-83\\64.1769\\-173.9728\\-83\\64.96358\\-174.2709\\-83\\66.13003\\-175.0208\\-83\\68.08315\\-176.9643\\-83\\68.65281\\-178.1771\\-83\\69.21423\\-180.1303\\-83\\69.32159\\-182.0834\\-83\\68.91592\\-184.0365\\-83\\67.72424\\-185.9896\\-83\\66.79269\\-187.9428\\-83\\66.48325\\-189.8959\\-83\\64.1769\\-192.6319\\-83\\62.22377\\-194.25\\-83\\60.27065\\-195.1848\\-83\\59.52237\\-195.7553\\-83\\58.31752\\-196.4179\\-83\\56.3644\\-197.87\\-83\\54.41127\\-198.8713\\-83\\52.45815\\-199.6282\\-83\\50.50502\\-199.8869\\-83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "99" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-210.0347\\-81\\-129.1825\\-208.6141\\-81\\-131.1356\\-207.7577\\-81\\-133.1695\\-205.5209\\-81\\-134.0745\\-203.5678\\-81\\-134.76\\-201.6146\\-81\\-134.7944\\-199.6615\\-81\\-135.2656\\-197.7084\\-81\\-135.5881\\-195.7553\\-81\\-135.596\\-193.8021\\-81\\-134.9586\\-191.849\\-81\\-133.0887\\-190.4466\\-81\\-131.1356\\-190.8396\\-81\\-129.1825\\-189.9716\\-81\\-128.19\\-187.9428\\-81\\-126.2583\\-185.9896\\-81\\-123.9723\\-184.0365\\-81\\-123.3231\\-183.3945\\-81\\-119.4168\\-181.5029\\-81\\-117.4637\\-181.4127\\-81\\-115.5261\\-182.0834\\-81\\-115.0678\\-184.0365\\-81\\-115.6758\\-185.9896\\-81\\-115.7633\\-187.9428\\-81\\-115.2401\\-191.849\\-81\\-114.3584\\-193.8021\\-81\\-112.412\\-195.7553\\-81\\-110.6476\\-197.7084\\-81\\-109.6589\\-199.6615\\-81\\-109.2742\\-201.6146\\-81\\-109.6512\\-203.033\\-81\\-109.9507\\-203.5678\\-81\\-111.6043\\-205.3395\\-81\\-112.5658\\-203.5678\\-81\\-113.5575\\-202.8836\\-81\\-115.5106\\-202.0493\\-81\\-115.948\\-201.6146\\-81\\-117.2893\\-199.6615\\-81\\-117.6754\\-197.7084\\-81\\-118.3098\\-195.7553\\-81\\-119.4168\\-194.6697\\-81\\-121.37\\-193.8248\\-81\\-123.3231\\-194.3403\\-81\\-125.2762\\-193.7794\\-81\\-127.2293\\-193.8918\\-81\\-128.8313\\-195.7553\\-81\\-129.4284\\-197.7084\\-81\\-129.3876\\-199.6615\\-81\\-129.1825\\-200.131\\-81\\-127.2293\\-200.9004\\-81\\-125.2762\\-201.1527\\-81\\-123.9408\\-203.5678\\-81\\-123.9067\\-205.5209\\-81\\-124.2997\\-207.474\\-81\\-124.5015\\-209.4271\\-81\\-125.2762\\-210.375\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "100" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-201.5572\\-81\\-60.8231\\-201.2977\\-81\\-59.75113\\-199.6615\\-81\\-60.8231\\-198.4735\\-81\\-66.68247\\-194.9925\\-81\\-68.6356\\-194.2346\\-81\\-69.42997\\-195.7553\\-81\\-70.58872\\-196.757\\-81\\-72.54185\\-196.2496\\-81\\-73.03623\\-195.7553\\-81\\-74.31528\\-193.8021\\-81\\-72.1246\\-191.849\\-81\\-71.94786\\-189.8959\\-81\\-71.45998\\-187.9428\\-81\\-71.25248\\-185.9896\\-81\\-72.10472\\-184.0365\\-81\\-74.70424\\-180.1303\\-81\\-73.45385\\-178.1771\\-81\\-72.43947\\-176.224\\-81\\-71.53477\\-174.2709\\-81\\-70.58872\\-173.1328\\-81\\-68.6356\\-171.9412\\-81\\-66.68247\\-171.8859\\-81\\-64.72935\\-170.844\\-81\\-64.28245\\-170.3646\\-81\\-64.72935\\-169.9825\\-81\\-65.70591\\-168.4115\\-81\\-64.72935\\-167.7991\\-81\\-62.77623\\-168.2499\\-81\\-62.61464\\-168.4115\\-81\\-62.21378\\-170.3646\\-81\\-62.77623\\-171.1242\\-81\\-64.01205\\-172.3178\\-81\\-62.77623\\-173.3012\\-81\\-60.8231\\-175.3719\\-81\\-60.12989\\-176.224\\-81\\-59.72098\\-178.1771\\-81\\-58.04842\\-180.1303\\-81\\-56.52746\\-182.0834\\-81\\-56.07909\\-184.0365\\-81\\-55.98298\\-185.9896\\-81\\-54.96373\\-187.8005\\-81\\-53.19321\\-189.8959\\-81\\-52.26085\\-191.849\\-81\\-50.98827\\-193.8021\\-81\\-49.84701\\-195.7553\\-81\\-48.92997\\-199.6615\\-81\\-48.70699\\-201.6146\\-81\\-49.10435\\-202.174\\-81\\-51.05748\\-202.9323\\-81\\-53.0106\\-202.8313\\-81\\-54.96373\\-202.1608\\-81\\-56.91685\\-201.0769\\-81\\-58.86998\\-202.0731\\-81\\-60.8231\\-202.0348\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "101" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-43.24498\\-176.2316\\-81\\-45.1981\\-175.0004\\-81\\-45.94076\\-174.2709\\-81\\-46.75936\\-172.3178\\-81\\-48.01753\\-170.3646\\-81\\-48.54882\\-168.4115\\-81\\-48.72492\\-166.4584\\-81\\-49.48592\\-164.5053\\-81\\-51.05748\\-163.4066\\-81\\-53.0106\\-163.5333\\-81\\-54.39732\\-162.5521\\-81\\-53.98716\\-160.599\\-81\\-53.0106\\-159.6274\\-81\\-51.05748\\-159.1512\\-81\\-49.55896\\-158.6459\\-81\\-47.15123\\-157.5346\\-81\\-45.1981\\-155.7849\\-81\\-43.24498\\-153.8864\\-81\\-41.29185\\-153.1832\\-81\\-37.3856\\-153.057\\-81\\-35.43248\\-152.6249\\-81\\-33.47935\\-152.7638\\-81\\-31.52623\\-153.7027\\-81\\-29.5731\\-155.3201\\-81\\-27.61998\\-157.4725\\-81\\-25.62035\\-158.6459\\-81\\-23.71373\\-159.3095\\-81\\-21.7606\\-160.1295\\-81\\-21.31671\\-160.599\\-81\\-21.7606\\-161.253\\-81\\-23.71373\\-162.1868\\-81\\-25.66685\\-162.1868\\-81\\-27.86587\\-164.5053\\-81\\-28.43645\\-166.4584\\-81\\-29.18616\\-170.3646\\-81\\-30.32123\\-172.3178\\-81\\-31.1419\\-174.2709\\-81\\-33.00609\\-176.224\\-81\\-33.47935\\-176.6109\\-81\\-35.43248\\-177.3291\\-81\\-37.3856\\-177.8118\\-81\\-41.29185\\-176.8163\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "102" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "34.88002\\-202.0114\\-81\\34.12435\\-201.6146\\-81\\34.19485\\-199.6615\\-81\\35.43225\\-197.7084\\-81\\36.04395\\-195.7553\\-81\\36.83315\\-194.8681\\-81\\38.78627\\-193.75\\-81\\40.7394\\-193.7214\\-81\\41.58379\\-195.7553\\-81\\41.54834\\-197.7084\\-81\\40.7394\\-198.8145\\-81\\38.78627\\-199.6122\\-81\\36.83315\\-200.5883\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002342" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "103" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-204.0421\\-81\\46.25997\\-203.5678\\-81\\46.66327\\-199.6615\\-81\\48.5519\\-194.2567\\-81\\50.84096\\-189.8959\\-81\\51.96987\\-185.9896\\-81\\53.19732\\-184.0365\\-81\\54.90598\\-182.0834\\-81\\55.1587\\-180.1303\\-81\\54.80864\\-178.1771\\-81\\55.37571\\-176.224\\-81\\56.3644\\-174.5659\\-81\\58.31752\\-172.6827\\-81\\60.27065\\-171.2191\\-81\\62.22377\\-170.6389\\-81\\64.1769\\-170.995\\-81\\66.13003\\-171.6546\\-81\\66.9379\\-172.3178\\-81\\68.90415\\-174.2709\\-81\\70.30865\\-176.224\\-81\\69.74331\\-180.1303\\-81\\69.75445\\-182.0834\\-81\\69.99813\\-184.0365\\-81\\68.60355\\-187.9428\\-81\\68.46408\\-189.8959\\-81\\66.99706\\-191.849\\-81\\66.13003\\-192.7001\\-81\\65.24026\\-193.8021\\-81\\64.1769\\-195.4334\\-81\\63.77802\\-195.7553\\-81\\62.22377\\-196.4672\\-81\\58.31752\\-197.9078\\-81\\56.3644\\-198.8767\\-81\\54.41127\\-200.6451\\-81\\52.45815\\-202.141\\-81\\49.87207\\-203.5678\\-81\\48.5519\\-204.0368\\-81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "104" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-210.1278\\-79\\-129.1825\\-208.3059\\-79\\-131.1356\\-207.1275\\-79\\-133.0887\\-206.1664\\-79\\-133.7063\\-205.5209\\-79\\-135.3237\\-201.6146\\-79\\-135.3779\\-199.6615\\-79\\-136.3014\\-195.7553\\-79\\-136.3086\\-193.8021\\-79\\-135.7573\\-191.849\\-79\\-135.0419\\-191.1057\\-79\\-133.0887\\-190.6644\\-79\\-131.1356\\-191.1408\\-79\\-130.2142\\-189.8959\\-79\\-129.1825\\-188.205\\-79\\-127.2293\\-185.7305\\-79\\-125.2762\\-184.9163\\-79\\-123.3231\\-183.0816\\-79\\-121.37\\-181.5105\\-79\\-119.4168\\-181.0426\\-79\\-117.4637\\-180.0073\\-79\\-115.5106\\-179.6673\\-79\\-113.9264\\-180.1303\\-79\\-113.5575\\-180.5559\\-79\\-113.1681\\-182.0834\\-79\\-114.2067\\-184.0365\\-79\\-114.75\\-185.9896\\-79\\-115.0759\\-187.9428\\-79\\-115.2288\\-191.849\\-79\\-114.3356\\-193.8021\\-79\\-112.4582\\-195.7553\\-79\\-111.0086\\-197.7084\\-79\\-110.7374\\-199.6615\\-79\\-110.694\\-201.6146\\-79\\-111.6043\\-202.1985\\-79\\-113.3947\\-201.6146\\-79\\-115.5106\\-200.6686\\-79\\-116.8423\\-199.6615\\-79\\-117.4637\\-198.9243\\-79\\-118.1131\\-197.7084\\-79\\-118.7678\\-195.7553\\-79\\-119.4168\\-195.0228\\-79\\-121.37\\-194.4018\\-79\\-123.3231\\-195.3082\\-79\\-124.6515\\-193.8021\\-79\\-125.2762\\-192.7321\\-79\\-127.2293\\-192.6432\\-79\\-128.9023\\-193.8021\\-79\\-130.7986\\-195.7553\\-79\\-131.1356\\-196.6208\\-79\\-132.0376\\-199.6615\\-79\\-131.7443\\-201.6146\\-79\\-131.1356\\-202.3199\\-79\\-129.1825\\-203.2748\\-79\\-127.2293\\-202.8803\\-79\\-126.288\\-203.5678\\-79\\-124.9623\\-205.5209\\-79\\-125.371\\-207.474\\-79\\-124.9944\\-209.4271\\-79\\-125.2762\\-209.8089\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "105" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-203.9958\\-79\\-53.0106\\-202.8427\\-79\\-54.96373\\-202.2775\\-79\\-56.91685\\-201.4152\\-79\\-58.86998\\-202.2605\\-79\\-60.8231\\-202.6199\\-79\\-61.88458\\-201.6146\\-79\\-60.8231\\-199.6532\\-79\\-63.33072\\-197.7084\\-79\\-64.72935\\-196.8577\\-79\\-66.68247\\-195.8907\\-79\\-68.6356\\-194.7728\\-79\\-70.58872\\-195.2975\\-79\\-72.25797\\-193.8021\\-79\\-71.48299\\-191.849\\-79\\-72.25462\\-189.8959\\-79\\-73.41774\\-187.9428\\-79\\-73.21502\\-185.9896\\-79\\-73.94266\\-184.0365\\-79\\-75.04393\\-182.0834\\-79\\-75.19252\\-180.1303\\-79\\-74.79708\\-178.1771\\-79\\-73.58245\\-176.224\\-79\\-72.63659\\-174.2709\\-79\\-71.50681\\-172.3178\\-79\\-70.58872\\-171.3713\\-79\\-68.6356\\-170.3569\\-79\\-66.68247\\-169.9184\\-79\\-64.72935\\-168.59\\-79\\-62.77623\\-168.164\\-79\\-62.52874\\-168.4115\\-79\\-61.99596\\-170.3646\\-79\\-62.62762\\-172.3178\\-79\\-61.58008\\-174.2709\\-79\\-60.8231\\-174.9587\\-79\\-59.81733\\-176.224\\-79\\-59.44282\\-178.1771\\-79\\-57.78831\\-180.1303\\-79\\-55.94937\\-182.0834\\-79\\-54.78934\\-184.0365\\-79\\-54.02016\\-185.9896\\-79\\-52.42334\\-187.9428\\-79\\-51.57035\\-189.8959\\-79\\-50.3869\\-191.849\\-79\\-49.10435\\-194.502\\-79\\-48.64862\\-195.7553\\-79\\-48.29313\\-197.7084\\-79\\-47.83186\\-199.6615\\-79\\-46.88069\\-201.6146\\-79\\-46.72475\\-203.5678\\-79\\-47.15123\\-204.0525\\-79\\-49.10435\\-204.348\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "106" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-178.4246\\-79\\-39.33873\\-178.0957\\-79\\-41.29185\\-177.2997\\-79\\-43.24498\\-176.8013\\-79\\-45.1981\\-175.4757\\-79\\-46.37101\\-174.2709\\-79\\-47.45721\\-172.3178\\-79\\-48.35908\\-170.3646\\-79\\-48.89265\\-168.4115\\-79\\-49.02358\\-166.4584\\-79\\-50.00079\\-164.5053\\-79\\-51.05748\\-163.4952\\-79\\-53.0106\\-163.4462\\-79\\-54.96373\\-162.7444\\-79\\-55.13811\\-162.5521\\-79\\-54.72471\\-160.599\\-79\\-53.0106\\-159.2596\\-79\\-51.05748\\-159.1167\\-79\\-50.34485\\-158.6459\\-79\\-45.1981\\-155.5607\\-79\\-43.24498\\-153.8311\\-79\\-41.29185\\-153.0456\\-79\\-37.3856\\-152.1489\\-79\\-35.43248\\-151.7496\\-79\\-33.47935\\-151.7227\\-79\\-31.52623\\-152.2602\\-79\\-29.5731\\-153.5517\\-79\\-26.41407\\-156.6928\\-79\\-25.66685\\-157.3332\\-79\\-23.50575\\-158.6459\\-79\\-21.7606\\-159.5564\\-79\\-20.7796\\-160.599\\-79\\-21.7606\\-161.7409\\-79\\-23.71373\\-161.571\\-79\\-25.66685\\-161.9719\\-79\\-26.23371\\-162.5521\\-79\\-27.03946\\-164.5053\\-79\\-27.59727\\-166.4584\\-79\\-27.92729\\-168.4115\\-79\\-28.4131\\-170.3646\\-79\\-29.22433\\-172.3178\\-79\\-30.37311\\-174.2709\\-79\\-32.30362\\-176.224\\-79\\-33.47935\\-177.1312\\-79\\-35.43248\\-178.1393\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "107" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "36.83315\\-200.1202\\-79\\36.52736\\-199.6615\\-79\\37.28888\\-197.7084\\-79\\37.48234\\-195.7553\\-79\\38.78627\\-194.1726\\-79\\40.7394\\-193.6801\\-79\\42.27658\\-195.7553\\-79\\42.32553\\-197.7084\\-79\\41.12875\\-199.6615\\-79\\40.7394\\-200.0385\\-79\\38.78627\\-200.3446\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002341" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "108" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "44.64565\\-206.2478\\-79\\44.07695\\-205.5209\\-79\\44.08056\\-203.5678\\-79\\45.00275\\-201.6146\\-79\\45.74487\\-199.6615\\-79\\46.06864\\-197.7084\\-79\\47.3462\\-195.7553\\-79\\47.94485\\-193.8021\\-79\\49.15864\\-191.849\\-79\\49.95091\\-189.8959\\-79\\50.51271\\-187.9428\\-79\\51.52553\\-185.9896\\-79\\52.89284\\-184.0365\\-79\\53.76894\\-182.0834\\-79\\54.50602\\-180.1303\\-79\\54.33051\\-178.1771\\-79\\54.8511\\-174.2709\\-79\\55.79193\\-172.3178\\-79\\56.3644\\-171.7569\\-79\\58.41306\\-170.3646\\-79\\60.27065\\-169.3936\\-79\\62.22377\\-169.3076\\-79\\64.1769\\-169.6403\\-79\\66.13003\\-170.1529\\-79\\68.08315\\-171.379\\-79\\70.03628\\-173.2674\\-79\\70.90758\\-174.2709\\-79\\71.37539\\-176.224\\-79\\70.65973\\-180.1303\\-79\\70.66685\\-182.0834\\-79\\71.28091\\-184.0365\\-79\\71.18975\\-185.9896\\-79\\70.45876\\-187.9428\\-79\\70.42017\\-189.8959\\-79\\70.72195\\-191.849\\-79\\70.03628\\-193.0885\\-79\\68.08315\\-192.8511\\-79\\65.07786\\-195.7553\\-79\\64.1769\\-196.4826\\-79\\62.22377\\-197.4208\\-79\\60.27065\\-198.1431\\-79\\58.31752\\-198.7206\\-79\\56.3644\\-200.2893\\-79\\54.41127\\-202.1366\\-79\\52.45815\\-202.9741\\-79\\50.50502\\-204.3039\\-79\\48.5519\\-205.0116\\-79\\46.59877\\-206.2034\\-79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "109" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-208.5668\\-77\\-128.2271\\-207.474\\-77\\-129.1825\\-206.2184\\-77\\-131.1356\\-206.6456\\-77\\-133.0887\\-206.281\\-77\\-133.8224\\-205.5209\\-77\\-135.2034\\-203.5678\\-77\\-135.9283\\-201.6146\\-77\\-136.2015\\-199.6615\\-77\\-136.5517\\-195.7553\\-77\\-136.6341\\-193.8021\\-77\\-136.1186\\-191.849\\-77\\-135.0419\\-190.7381\\-77\\-133.0887\\-190.7433\\-77\\-132.0353\\-191.849\\-77\\-133.5369\\-193.8021\\-77\\-133.5016\\-195.7553\\-77\\-133.6109\\-197.7084\\-77\\-133.9916\\-199.6615\\-77\\-133.0887\\-201.4559\\-77\\-131.6354\\-203.5678\\-77\\-131.1356\\-204.1497\\-77\\-129.1825\\-205.2692\\-77\\-127.2293\\-204.7572\\-77\\-126.764\\-205.5209\\-77\\-126.8708\\-207.474\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "32" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "110" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-117.4637\\-198.8086\\-77\\-119.3181\\-197.7084\\-77\\-121.37\\-195.8224\\-77\\-123.3231\\-196.4303\\-77\\-124.0027\\-195.7553\\-77\\-124.5931\\-193.8021\\-77\\-123.3805\\-191.849\\-77\\-125.2762\\-190.2377\\-77\\-129.1825\\-192.1664\\-77\\-129.6708\\-191.849\\-77\\-130.9848\\-189.8959\\-77\\-129.8644\\-187.9428\\-77\\-127.2293\\-185.2153\\-77\\-125.2762\\-183.7416\\-77\\-123.3231\\-182.7904\\-77\\-121.37\\-181.0335\\-77\\-119.4168\\-179.8222\\-77\\-117.4637\\-179.085\\-77\\-115.5106\\-178.5846\\-77\\-113.5575\\-178.6262\\-77\\-111.6043\\-179.3191\\-77\\-110.9637\\-180.1303\\-77\\-113.0408\\-184.0365\\-77\\-114.2384\\-185.9896\\-77\\-114.5714\\-187.9428\\-77\\-114.7658\\-189.8959\\-77\\-115.1111\\-191.849\\-77\\-114.2106\\-193.8021\\-77\\-113.1712\\-195.7553\\-77\\-113.5575\\-196.3178\\-77\\-115.5106\\-196.9991\\-77\\-116.0768\\-197.7084\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "111" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-47.15123\\-205.7356\\-77\\-51.05748\\-204.3519\\-77\\-53.0106\\-202.5313\\-77\\-56.91685\\-200.9793\\-77\\-58.86998\\-200.8426\\-77\\-60.8231\\-200.9506\\-77\\-61.05005\\-199.6615\\-77\\-62.77623\\-198.2025\\-77\\-66.68247\\-196.5188\\-77\\-68.6356\\-195.5642\\-77\\-70.58872\\-194.711\\-77\\-71.51359\\-193.8021\\-77\\-73.09895\\-191.849\\-77\\-75.00531\\-189.8959\\-77\\-75.77381\\-187.9428\\-77\\-75.79456\\-185.9896\\-77\\-75.94746\\-182.0834\\-77\\-75.94746\\-180.1303\\-77\\-75.50069\\-178.1771\\-77\\-74.69441\\-176.224\\-77\\-73.29428\\-174.2709\\-77\\-72.2207\\-172.3178\\-77\\-70.58872\\-170.2561\\-77\\-68.6356\\-169.2667\\-77\\-66.68247\\-168.7485\\-77\\-64.72935\\-168.5077\\-77\\-62.77623\\-169.7219\\-77\\-62.3205\\-170.3646\\-77\\-62.46141\\-172.3178\\-77\\-61.86571\\-174.2709\\-77\\-60.26101\\-176.224\\-77\\-59.23932\\-178.1771\\-77\\-57.68977\\-180.1303\\-77\\-54.00111\\-184.0365\\-77\\-53.22379\\-185.9896\\-77\\-51.9593\\-187.9428\\-77\\-51.05748\\-189.864\\-77\\-49.99645\\-191.849\\-77\\-48.56809\\-193.8021\\-77\\-47.86094\\-195.7553\\-77\\-46.81294\\-197.7084\\-77\\-46.42155\\-199.6615\\-77\\-45.1981\\-203.6073\\-77\\-46.80721\\-205.5209\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "112" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-178.4477\\-77\\-41.29185\\-178.1543\\-77\\-43.24498\\-177.0851\\-77\\-45.1981\\-176.2616\\-77\\-47.15123\\-173.7783\\-77\\-48.04818\\-172.3178\\-77\\-48.75558\\-170.3646\\-77\\-48.91735\\-168.4115\\-77\\-49.49622\\-166.4584\\-77\\-50.31509\\-164.5053\\-77\\-51.05748\\-163.5221\\-77\\-53.0106\\-162.2798\\-77\\-54.96373\\-163.4174\\-77\\-55.79869\\-162.5521\\-77\\-55.48568\\-160.599\\-77\\-54.96373\\-160.0384\\-77\\-53.0106\\-159.0644\\-77\\-51.05748\\-159.0328\\-77\\-49.10435\\-157.7348\\-77\\-47.15123\\-155.8996\\-77\\-45.25969\\-154.7396\\-77\\-41.29185\\-152.1374\\-77\\-39.33873\\-151.5475\\-77\\-37.3856\\-150.4254\\-77\\-35.43248\\-150.3071\\-77\\-33.47935\\-150.2979\\-77\\-31.52623\\-150.4016\\-77\\-29.5731\\-151.5603\\-77\\-25.66685\\-155.4519\\-77\\-24.66661\\-156.6928\\-77\\-23.71373\\-157.6286\\-77\\-21.7606\\-159.1376\\-77\\-20.56261\\-160.599\\-77\\-21.7606\\-161.5399\\-77\\-23.71373\\-161.2309\\-77\\-25.55754\\-162.5521\\-77\\-26.44915\\-164.5053\\-77\\-27.02109\\-166.4584\\-77\\-27.65783\\-170.3646\\-77\\-29.5731\\-174.1413\\-77\\-31.33808\\-176.224\\-77\\-33.47935\\-177.2595\\-77\\-35.43248\\-178.459\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002340" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "113" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "44.64565\\-208.097\\-77\\43.35519\\-207.474\\-77\\42.69252\\-206.8818\\-77\\42.01205\\-205.5209\\-77\\42.08616\\-203.5678\\-77\\43.51398\\-201.6146\\-77\\43.88173\\-199.6615\\-77\\42.69252\\-198.4626\\-77\\40.7394\\-200.1639\\-77\\40.03904\\-199.6615\\-77\\39.32449\\-197.7084\\-77\\39.46862\\-195.7553\\-77\\40.7394\\-194.5891\\-77\\42.39142\\-195.7553\\-77\\43.58458\\-197.7084\\-77\\44.64565\\-198.7594\\-77\\45.33535\\-197.7084\\-77\\46.29073\\-195.7553\\-77\\47.55489\\-193.8021\\-77\\48.29281\\-191.849\\-77\\49.54891\\-189.8959\\-77\\50.25754\\-187.9428\\-77\\51.40537\\-185.9896\\-77\\52.96642\\-184.0365\\-77\\53.7383\\-182.0834\\-77\\54.2892\\-180.1303\\-77\\54.49204\\-176.224\\-77\\54.4189\\-174.2709\\-77\\55.36158\\-172.3178\\-77\\56.3644\\-171.3661\\-77\\58.31752\\-169.8504\\-77\\60.27065\\-168.6839\\-77\\62.22377\\-167.8896\\-77\\64.1769\\-167.9407\\-77\\66.13003\\-169.1019\\-77\\68.08315\\-169.8008\\-77\\68.76958\\-170.3646\\-77\\70.65273\\-172.3178\\-77\\71.59502\\-174.2709\\-77\\71.82781\\-176.224\\-77\\71.54315\\-180.1303\\-77\\71.93243\\-182.0834\\-77\\73.31968\\-184.0365\\-77\\73.1822\\-185.9896\\-77\\72.43271\\-187.9428\\-77\\71.94802\\-189.8959\\-77\\71.59248\\-191.849\\-77\\70.03628\\-193.7634\\-77\\68.08315\\-194.3646\\-77\\65.80138\\-195.7553\\-77\\64.1769\\-196.5834\\-77\\62.22377\\-197.7459\\-77\\60.27065\\-198.4716\\-77\\58.31752\\-199.8485\\-77\\56.3644\\-200.6561\\-77\\54.41127\\-202.2841\\-77\\52.45815\\-202.8207\\-77\\50.50502\\-204.4176\\-77\\48.5519\\-205.88\\-77\\46.59877\\-206.7899\\-77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "114" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-206.281\\-75\\-135.7113\\-203.5678\\-75\\-136.4182\\-201.6146\\-75\\-136.1452\\-199.6615\\-75\\-136.4872\\-197.7084\\-75\\-136.5141\\-195.7553\\-75\\-137.2541\\-193.8021\\-75\\-137.4918\\-191.849\\-75\\-136.995\\-191.2197\\-75\\-135.0419\\-189.5704\\-75\\-133.0887\\-189.7738\\-75\\-131.1356\\-189.5288\\-75\\-130.0004\\-187.9428\\-75\\-128.1431\\-185.9896\\-75\\-125.2762\\-183.1492\\-75\\-123.3231\\-181.3216\\-75\\-121.37\\-179.9433\\-75\\-119.4168\\-179.0627\\-75\\-117.4637\\-177.9163\\-75\\-115.5106\\-177.4091\\-75\\-113.5575\\-177.3659\\-75\\-111.6043\\-177.4365\\-75\\-110.0349\\-178.1771\\-75\\-109.6512\\-178.7425\\-75\\-109.1776\\-180.1303\\-75\\-110.5958\\-182.0834\\-75\\-112.4655\\-184.0365\\-75\\-113.3705\\-185.9896\\-75\\-113.6395\\-187.9428\\-75\\-114.2352\\-189.8959\\-75\\-114.4514\\-191.849\\-75\\-113.4627\\-193.8021\\-75\\-113.5575\\-193.967\\-75\\-115.5106\\-193.8835\\-75\\-116.2885\\-191.849\\-75\\-117.4637\\-190.8037\\-75\\-119.4168\\-189.6602\\-75\\-125.2762\\-189.6602\\-75\\-127.2293\\-191.0068\\-75\\-129.1825\\-191.6496\\-75\\-131.1356\\-190.4295\\-75\\-132.447\\-191.849\\-75\\-133.0887\\-192.3202\\-75\\-134.1326\\-193.8021\\-75\\-134.1519\\-197.7084\\-75\\-134.5361\\-199.6615\\-75\\-133.7966\\-201.6146\\-75\\-131.9486\\-203.5678\\-75\\-131.1356\\-204.8881\\-75\\-130.5938\\-205.5209\\-75\\-131.1356\\-206.0819\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "115" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-198.4368\\-75\\-121.37\\-196.9922\\-75\\-122.7679\\-195.7553\\-75\\-123.8397\\-193.8021\\-75\\-123.3231\\-193.3036\\-75\\-121.37\\-194.1731\\-75\\-119.4168\\-194.8215\\-75\\-118.5807\\-195.7553\\-75\\-118.5013\\-197.7084\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "116" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-208.8291\\-75\\-114.8337\\-207.474\\-75\\-113.5575\\-206.1414\\-75\\-111.6043\\-204.7806\\-75\\-109.6512\\-203.0729\\-75\\-109.1496\\-203.5678\\-75\\-109.6512\\-205.4458\\-75\\-110.7531\\-207.474\\-75\\-111.6043\\-208.3344\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "117" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-205.857\\-75\\-51.05748\\-204.4188\\-75\\-53.0106\\-202.4576\\-75\\-54.96373\\-201.3789\\-75\\-56.91685\\-200.5598\\-75\\-58.86998\\-199.8652\\-75\\-60.8231\\-198.69\\-75\\-62.77623\\-197.2618\\-75\\-66.68247\\-196.6046\\-75\\-68.6356\\-196.0592\\-75\\-70.58872\\-194.696\\-75\\-73.88613\\-191.849\\-75\\-75.57207\\-189.8959\\-75\\-76.36733\\-187.9428\\-75\\-76.39592\\-184.0365\\-75\\-76.51469\\-182.0834\\-75\\-76.38152\\-180.1303\\-75\\-76.10759\\-178.1771\\-75\\-75.31549\\-176.224\\-75\\-73.44608\\-174.2709\\-75\\-72.54185\\-172.3929\\-75\\-71.35563\\-170.3646\\-75\\-70.58872\\-169.5\\-75\\-68.6356\\-167.8342\\-75\\-66.68247\\-167.9147\\-75\\-64.72935\\-168.5217\\-75\\-63.18773\\-170.3646\\-75\\-63.16809\\-172.3178\\-75\\-61.98853\\-174.2709\\-75\\-60.8231\\-175.7683\\-75\\-58.24606\\-178.1771\\-75\\-57.58635\\-180.1303\\-75\\-55.84002\\-182.0834\\-75\\-53.91997\\-184.0365\\-75\\-53.11911\\-185.9896\\-75\\-51.94481\\-187.9428\\-75\\-51.05748\\-189.8224\\-75\\-49.99069\\-191.849\\-75\\-48.14371\\-193.8021\\-75\\-46.66006\\-195.7553\\-75\\-45.93727\\-197.7084\\-75\\-44.77273\\-199.6615\\-75\\-44.4538\\-201.6146\\-75\\-44.32273\\-203.5678\\-75\\-44.44733\\-205.5209\\-75\\-45.1981\\-206.4044\\-75\\-47.15123\\-206.5244\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "118" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-178.459\\-75\\-43.24498\\-177.1534\\-75\\-45.1981\\-176.517\\-75\\-47.42176\\-174.2709\\-75\\-48.33207\\-172.3178\\-75\\-48.90491\\-170.3646\\-75\\-49.02358\\-168.4115\\-75\\-50.0202\\-166.4584\\-75\\-50.80999\\-164.5053\\-75\\-51.23127\\-162.5521\\-75\\-53.0106\\-161.5846\\-75\\-54.96373\\-163.1827\\-75\\-55.78114\\-162.5521\\-75\\-55.94494\\-160.599\\-75\\-54.96373\\-159.3349\\-75\\-53.0106\\-158.2247\\-75\\-51.05748\\-158.3054\\-75\\-49.10435\\-157.3493\\-75\\-45.1981\\-153.4683\\-75\\-43.24498\\-151.5841\\-75\\-41.29185\\-150.3549\\-75\\-39.33873\\-149.634\\-75\\-37.3856\\-148.4211\\-75\\-31.52623\\-148.3984\\-75\\-29.5731\\-149.356\\-75\\-27.61998\\-151.2834\\-75\\-25.66685\\-153.3997\\-75\\-23.17185\\-156.6928\\-75\\-21.7606\\-157.9173\\-75\\-20.64113\\-158.6459\\-75\\-20.9038\\-160.599\\-75\\-21.7606\\-161.124\\-75\\-23.71373\\-161.412\\-75\\-25.01754\\-162.5521\\-75\\-25.54478\\-164.5053\\-75\\-26.42171\\-166.4584\\-75\\-27.01365\\-168.4115\\-75\\-27.36089\\-170.3646\\-75\\-29.09063\\-174.2709\\-75\\-30.78185\\-176.224\\-75\\-31.52623\\-176.8089\\-75\\-33.47935\\-177.4589\\-75\\-35.43248\\-178.459\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "119" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-212.6675\\-75\\-38.97663\\-211.3803\\-75\\-38.77942\\-209.4271\\-75\\-40.71965\\-207.474\\-75\\-39.99188\\-205.5209\\-75\\-39.33873\\-204.9461\\-75\\-37.3856\\-206.485\\-75\\-35.76817\\-207.474\\-75\\-35.43248\\-207.8872\\-75\\-34.73412\\-209.4271\\-75\\-35.43248\\-210.7768\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002339" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "120" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-210.2787\\-75\\39.44636\\-209.4271\\-75\\39.17891\\-207.474\\-75\\40.13042\\-205.5209\\-75\\40.04552\\-203.5678\\-75\\41.91685\\-201.6146\\-75\\41.77662\\-199.6615\\-75\\40.50755\\-197.7084\\-75\\40.7394\\-197.3105\\-75\\42.69252\\-195.9748\\-75\\44.64565\\-196.6708\\-75\\45.67855\\-195.7553\\-75\\47.21819\\-193.8021\\-75\\47.93761\\-191.849\\-75\\49.44199\\-189.8959\\-75\\50.25754\\-187.9428\\-75\\50.50502\\-187.6201\\-75\\52.52473\\-184.0365\\-75\\54.34469\\-180.1303\\-75\\54.88212\\-178.1771\\-75\\55.18678\\-176.224\\-75\\55.18501\\-174.2709\\-75\\55.9753\\-172.3178\\-75\\56.3644\\-171.9719\\-75\\58.31752\\-171.2158\\-75\\60.91588\\-168.4115\\-75\\62.22377\\-167.2961\\-75\\64.1769\\-166.9086\\-75\\66.13003\\-167.4933\\-75\\68.08315\\-168.2121\\-75\\70.03628\\-170.4572\\-75\\71.14304\\-172.3178\\-75\\72.1764\\-174.2709\\-75\\72.61331\\-176.224\\-75\\72.73133\\-180.1303\\-75\\74.74574\\-182.0834\\-75\\75.35311\\-184.0365\\-75\\74.87685\\-185.9896\\-75\\74.0646\\-187.9428\\-75\\73.04388\\-189.8959\\-75\\72.15099\\-191.849\\-75\\70.03628\\-193.7214\\-75\\68.08315\\-194.6264\\-75\\66.13003\\-195.7629\\-75\\64.1769\\-196.5529\\-75\\62.10826\\-197.7084\\-75\\60.27065\\-198.5107\\-75\\58.31752\\-200.0775\\-75\\56.3644\\-200.7502\\-75\\52.45815\\-202.5106\\-75\\48.5519\\-206.3289\\-75\\46.59877\\-208.1492\\-75\\44.64565\\-209.3419\\-75\\42.69252\\-209.969\\-75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "121" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-206.315\\-73\\-135.8035\\-203.5678\\-73\\-136.5796\\-201.6146\\-73\\-136.2788\\-199.6615\\-73\\-136.1555\\-197.7084\\-73\\-135.9191\\-195.7553\\-73\\-136.995\\-195.1449\\-73\\-137.7261\\-193.8021\\-73\\-138.2989\\-191.849\\-73\\-136.995\\-189.9205\\-73\\-135.0419\\-189.0748\\-73\\-133.47\\-189.8959\\-73\\-134.6401\\-193.8021\\-73\\-134.6991\\-195.7553\\-73\\-134.6401\\-197.7084\\-73\\-134.685\\-199.6615\\-73\\-134.0835\\-201.6146\\-73\\-132.3589\\-203.5678\\-73\\-131.3221\\-205.5209\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "122" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-206.4117\\-73\\-122.2831\\-205.5209\\-73\\-122.5685\\-203.5678\\-73\\-121.37\\-201.8966\\-73\\-119.4168\\-201.8141\\-73\\-117.4637\\-203.5045\\-73\\-118.4046\\-205.5209\\-73\\-119.4168\\-206.4975\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "123" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-208.5717\\-73\\-114.3147\\-207.474\\-73\\-112.2386\\-205.5209\\-73\\-109.6512\\-202.6777\\-73\\-108.7274\\-203.5678\\-73\\-109.1893\\-205.5209\\-73\\-110.6229\\-207.474\\-73\\-111.6043\\-208.4313\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "29" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "124" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-193.957\\-73\\-115.5106\\-193.2341\\-73\\-116.2483\\-191.849\\-73\\-117.4637\\-190.7419\\-73\\-119.4168\\-189.6484\\-73\\-121.37\\-189.6484\\-73\\-125.2762\\-189.5289\\-73\\-127.2293\\-190.9589\\-73\\-129.1825\\-191.5279\\-73\\-130.5259\\-189.8959\\-73\\-130.015\\-187.9428\\-73\\-128.5678\\-185.9896\\-73\\-124.6165\\-182.0834\\-73\\-121.37\\-179.2264\\-73\\-119.4168\\-177.8915\\-73\\-117.4637\\-177.0816\\-73\\-115.5106\\-176.0357\\-73\\-113.5575\\-175.5675\\-73\\-111.6043\\-175.5675\\-73\\-109.6512\\-175.892\\-73\\-109.2181\\-176.224\\-73\\-107.5627\\-178.1771\\-73\\-108.3004\\-180.1303\\-73\\-109.6512\\-181.9643\\-73\\-111.7671\\-184.0365\\-73\\-112.8151\\-185.9896\\-73\\-113.1607\\-187.9428\\-73\\-113.5053\\-191.849\\-73\\-113.4627\\-193.8021\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "125" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-208.1927\\-73\\-47.15123\\-206.6477\\-73\\-49.10435\\-206.1272\\-73\\-51.05748\\-204.3919\\-73\\-53.0106\\-202.43\\-73\\-54.96373\\-200.9085\\-73\\-56.91685\\-200.2612\\-73\\-58.86998\\-198.961\\-73\\-60.8231\\-198.3403\\-73\\-62.77623\\-196.6874\\-73\\-64.72935\\-196.0352\\-73\\-66.68247\\-196.4542\\-73\\-68.6356\\-196.2772\\-73\\-70.58872\\-194.9567\\-73\\-72.54185\\-193.9765\\-73\\-74.49497\\-192.5546\\-73\\-75.19653\\-191.849\\-73\\-76.4481\\-189.3857\\-73\\-76.99432\\-187.9428\\-73\\-76.97005\\-184.0365\\-73\\-77.19821\\-182.0834\\-73\\-76.99432\\-180.1303\\-73\\-76.4481\\-178.3061\\-73\\-75.57109\\-176.224\\-73\\-73.91025\\-174.2709\\-73\\-72.95779\\-172.3178\\-73\\-71.49218\\-170.3646\\-73\\-70.35177\\-168.4115\\-73\\-68.6356\\-166.8019\\-73\\-66.68247\\-167.5251\\-73\\-65.40209\\-168.4115\\-73\\-64.72935\\-169.0602\\-73\\-63.84714\\-170.3646\\-73\\-63.66721\\-172.3178\\-73\\-60.02756\\-176.224\\-73\\-59.35244\\-178.1771\\-73\\-57.75454\\-180.1303\\-73\\-55.8448\\-182.0834\\-73\\-54.12996\\-184.0365\\-73\\-53.52428\\-185.9896\\-73\\-51.97979\\-187.9428\\-73\\-51.08018\\-189.8959\\-73\\-49.99069\\-191.849\\-73\\-46.17466\\-195.7553\\-73\\-44.93901\\-197.7084\\-73\\-44.2021\\-199.6615\\-73\\-42.69086\\-201.6146\\-73\\-42.52568\\-203.5678\\-73\\-42.47607\\-205.5209\\-73\\-41.29185\\-207.3941\\-73\\-41.29185\\-207.7182\\-73\\-43.24498\\-209.4158\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "126" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-178.459\\-73\\-43.24498\\-177.1534\\-73\\-45.1981\\-176.4357\\-73\\-47.15123\\-174.8887\\-73\\-47.67925\\-174.2709\\-73\\-48.49067\\-172.3178\\-73\\-48.91735\\-170.3646\\-73\\-49.52549\\-168.4115\\-73\\-50.32877\\-166.4584\\-73\\-50.97671\\-164.5053\\-73\\-51.00529\\-162.5521\\-73\\-53.0106\\-161.1483\\-73\\-54.96373\\-161.7758\\-73\\-56.51209\\-160.599\\-73\\-55.86871\\-158.6459\\-73\\-54.96373\\-157.7313\\-73\\-53.0106\\-157.5801\\-73\\-51.05748\\-157.5989\\-73\\-49.8256\\-156.6928\\-73\\-47.85458\\-154.7396\\-73\\-45.1981\\-151.6358\\-73\\-43.24498\\-149.6111\\-73\\-41.29185\\-148.3336\\-73\\-39.33873\\-147.6403\\-73\\-37.3856\\-146.3819\\-73\\-29.5731\\-146.3786\\-73\\-27.61998\\-147.5417\\-73\\-25.66685\\-149.6718\\-73\\-25.0434\\-150.8334\\-73\\-24.58868\\-152.7865\\-73\\-21.7606\\-156.6257\\-73\\-19.80748\\-157.6793\\-73\\-18.83091\\-158.6459\\-73\\-18.958\\-160.599\\-73\\-19.80748\\-161.2552\\-73\\-21.7606\\-160.9245\\-73\\-23.71373\\-161.774\\-73\\-24.47158\\-162.5521\\-73\\-25.50526\\-166.4584\\-73\\-26.39004\\-168.4115\\-73\\-27.03622\\-170.3646\\-73\\-27.58242\\-172.3178\\-73\\-28.61788\\-174.2709\\-73\\-31.52623\\-177.1702\\-73\\-33.47935\\-178.2579\\-73\\-35.43248\\-178.459\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "127" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-215.6929\\-73\\-39.48958\\-213.3334\\-73\\-39.92275\\-211.3803\\-73\\-39.33873\\-210.9454\\-73\\-37.3856\\-210.1075\\-73\\-36.88252\\-209.4271\\-73\\-37.61021\\-207.474\\-73\\-37.21633\\-205.5209\\-73\\-35.43248\\-204.8167\\-73\\-34.41892\\-205.5209\\-73\\-33.02159\\-207.474\\-73\\-32.69705\\-209.4271\\-73\\-32.70338\\-211.3803\\-73\\-33.47935\\-212.7877\\-73\\-35.43248\\-214.6752\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002338" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "128" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-210.8636\\-73\\38.83886\\-209.4271\\-73\\37.76113\\-207.474\\-73\\38.74813\\-205.5209\\-73\\39.84422\\-203.5678\\-73\\41.64118\\-201.6146\\-73\\41.79734\\-199.6615\\-73\\41.66924\\-197.7084\\-73\\42.69252\\-196.5461\\-73\\44.64565\\-196.2935\\-73\\45.27298\\-195.7553\\-73\\47.6057\\-191.849\\-73\\49.44199\\-189.8959\\-73\\50.31802\\-187.9428\\-73\\51.45243\\-185.9896\\-73\\52.85737\\-184.0365\\-73\\53.66274\\-182.0834\\-73\\54.86426\\-180.1303\\-73\\55.85287\\-178.1771\\-73\\57.25677\\-176.224\\-73\\58.9395\\-174.2709\\-73\\59.77006\\-172.3178\\-73\\60.27065\\-171.5128\\-73\\61.6511\\-168.4115\\-73\\62.22377\\-167.8492\\-73\\64.1769\\-167.0344\\-73\\66.13003\\-166.6223\\-73\\68.08315\\-167.3594\\-73\\69.1746\\-168.4115\\-73\\70.8186\\-170.3646\\-73\\71.62794\\-172.3178\\-73\\72.77173\\-174.2709\\-73\\73.49921\\-176.224\\-73\\74.03726\\-178.1771\\-73\\74.84856\\-180.1303\\-73\\75.54688\\-182.0834\\-73\\75.70865\\-184.0365\\-73\\75.54688\\-185.9896\\-73\\74.97739\\-187.9428\\-73\\74.09113\\-189.8959\\-73\\72.71759\\-191.849\\-73\\71.9894\\-192.5857\\-73\\69.76799\\-193.8021\\-73\\68.08315\\-194.6264\\-73\\66.13003\\-195.7629\\-73\\64.1769\\-196.3466\\-73\\62.22377\\-197.1203\\-73\\60.27065\\-198.3509\\-73\\58.31752\\-198.7817\\-73\\56.3644\\-199.9688\\-73\\54.41127\\-200.8502\\-73\\52.45815\\-202.3851\\-73\\46.59877\\-208.3534\\-73\\44.64565\\-210.2114\\-73\\42.69252\\-211.2375\\-73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "129" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-136.995\\-195.3323\\-71\\-137.9204\\-193.8021\\-71\\-138.4512\\-191.849\\-71\\-137.5271\\-189.8959\\-71\\-136.995\\-189.3822\\-71\\-135.0419\\-188.8947\\-71\\-133.9586\\-189.8959\\-71\\-134.65\\-191.849\\-71\\-135.5115\\-193.8021\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "130" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-131.1356\\-208.3379\\-71\\-133.0887\\-206.7127\\-71\\-135.0419\\-204.7114\\-71\\-136.0366\\-203.5678\\-71\\-137.4109\\-201.6146\\-71\\-137.6967\\-199.6615\\-71\\-137.4014\\-197.7084\\-71\\-136.995\\-196.6358\\-71\\-135.0419\\-198.8692\\-71\\-134.76\\-199.6615\\-71\\-134.5653\\-201.6146\\-71\\-133.7457\\-203.5678\\-71\\-131.8905\\-205.5209\\-71\\-130.1651\\-207.474\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "131" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-191.1576\\-71\\-130.0827\\-189.8959\\-71\\-129.8677\\-185.9896\\-71\\-125.2762\\-181.3496\\-71\\-123.3231\\-179.8134\\-71\\-121.37\\-178.8333\\-71\\-119.4168\\-177.099\\-71\\-117.4637\\-176.0246\\-71\\-115.5106\\-175.1328\\-71\\-113.5575\\-174.7001\\-71\\-111.6043\\-174.6804\\-71\\-109.6512\\-175.0007\\-71\\-108.2722\\-176.224\\-71\\-107.2098\\-178.1771\\-71\\-107.362\\-180.1303\\-71\\-108.6896\\-182.0834\\-71\\-110.6179\\-184.0365\\-71\\-112.1892\\-185.9896\\-71\\-112.5809\\-187.9428\\-71\\-112.8325\\-189.8959\\-71\\-113.5575\\-191.3314\\-71\\-115.5106\\-191.8109\\-71\\-117.4637\\-190.5022\\-71\\-119.4168\\-189.6484\\-71\\-121.37\\-189.6484\\-71\\-123.3231\\-189.2264\\-71\\-125.2762\\-189.0859\\-71\\-127.2293\\-190.4581\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "132" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-205.8242\\-71\\-123.5955\\-205.5209\\-71\\-122.4817\\-203.5678\\-71\\-121.37\\-202.3226\\-71\\-119.4168\\-202.1448\\-71\\-117.969\\-203.5678\\-71\\-118.3928\\-205.5209\\-71\\-119.4168\\-206.5272\\-71\\-121.37\\-206.8315\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "133" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-121.37\\-198.1614\\-71\\-121.8489\\-197.7084\\-71\\-122.0953\\-195.7553\\-71\\-121.37\\-195.1025\\-71\\-119.4168\\-194.4584\\-71\\-117.4637\\-194.6383\\-71\\-116.0995\\-195.7553\\-71\\-117.4637\\-197.3093\\-71\\-117.9573\\-197.7084\\-71\\-119.4168\\-198.4191\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "134" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.8104\\-207.474\\-71\\-111.4073\\-205.5209\\-71\\-110.7921\\-203.5678\\-71\\-109.6512\\-202.4214\\-71\\-108.2874\\-203.5678\\-71\\-108.7494\\-205.5209\\-71\\-109.6512\\-206.6209\\-71\\-111.3575\\-207.474\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "135" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-212.4209\\-71\\-44.08998\\-209.4271\\-71\\-47.15123\\-206.4649\\-71\\-49.10435\\-205.2061\\-71\\-51.05748\\-204.1185\\-71\\-53.63406\\-201.6146\\-71\\-54.96373\\-200.4886\\-71\\-56.91685\\-199.0052\\-71\\-60.8231\\-197.775\\-71\\-62.77623\\-196.5764\\-71\\-64.72935\\-195.7629\\-71\\-66.68247\\-195.8907\\-71\\-68.6356\\-195.8638\\-71\\-70.58872\\-195.5796\\-71\\-72.54185\\-194.5866\\-71\\-75.35576\\-191.849\\-71\\-76.95341\\-189.8959\\-71\\-77.45631\\-187.9428\\-71\\-77.29089\\-185.9896\\-71\\-77.29594\\-184.0365\\-71\\-77.93417\\-182.0834\\-71\\-76.95341\\-178.1771\\-71\\-76.4481\\-176.8799\\-71\\-75.25808\\-174.2709\\-71\\-72.10854\\-170.3646\\-71\\-71.29661\\-168.4115\\-71\\-70.58872\\-167.5647\\-71\\-68.6356\\-166.5938\\-71\\-66.68247\\-167.5341\\-71\\-65.76791\\-168.4115\\-71\\-64.31341\\-170.3646\\-71\\-63.76729\\-172.3178\\-71\\-61.84233\\-174.2709\\-71\\-60.45611\\-176.224\\-71\\-59.74255\\-178.1771\\-71\\-55.86683\\-182.0834\\-71\\-53.87813\\-185.9896\\-71\\-52.26585\\-187.9428\\-71\\-51.49483\\-189.8959\\-71\\-49.99069\\-191.849\\-71\\-46.09674\\-195.7553\\-71\\-44.49281\\-197.7084\\-71\\-43.86203\\-199.6615\\-71\\-43.24498\\-200.33\\-71\\-40.57408\\-203.5678\\-71\\-40.49991\\-205.5209\\-71\\-40.09035\\-207.474\\-71\\-39.19489\\-209.4271\\-71\\-38.83542\\-211.3803\\-71\\-39.33873\\-211.9395\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "136" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-178.3641\\-71\\-44.66209\\-176.224\\-71\\-46.6485\\-174.2709\\-71\\-48.18058\\-172.3178\\-71\\-48.92997\\-170.3646\\-71\\-50.00858\\-168.4115\\-71\\-50.84577\\-166.4584\\-71\\-50.97671\\-164.5053\\-71\\-51.00529\\-162.5521\\-71\\-53.0106\\-160.9245\\-71\\-54.96373\\-161.4695\\-71\\-56.13679\\-160.599\\-71\\-56.64448\\-158.6459\\-71\\-54.96373\\-157.2177\\-71\\-51.05748\\-157.181\\-71\\-49.10435\\-155.6864\\-71\\-48.32798\\-154.7396\\-71\\-47.40042\\-152.7865\\-71\\-45.90886\\-150.8334\\-71\\-43.24498\\-147.6437\\-71\\-41.29185\\-146.3445\\-71\\-39.33873\\-145.6769\\-71\\-37.3856\\-144.3643\\-71\\-35.43248\\-144.3248\\-71\\-29.5731\\-144.3569\\-71\\-27.61998\\-145.4807\\-71\\-25.66685\\-147.4154\\-71\\-24.57868\\-148.8803\\-71\\-23.56512\\-150.8334\\-71\\-23.13642\\-152.7865\\-71\\-22.57853\\-154.7396\\-71\\-21.7606\\-155.625\\-71\\-20.32108\\-156.6928\\-71\\-17.96367\\-158.6459\\-71\\-19.80748\\-160.0823\\-71\\-21.7606\\-160.1194\\-71\\-22.28018\\-160.599\\-71\\-23.71373\\-162.7498\\-71\\-24.47383\\-164.5053\\-71\\-25.54478\\-168.4115\\-71\\-26.62252\\-170.3646\\-71\\-27.34944\\-172.3178\\-71\\-28.53319\\-174.2709\\-71\\-31.52623\\-177.2358\\-71\\-33.47935\\-178.459\\-71\\-39.33873\\-178.459\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "137" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-217.6743\\-71\\-35.86716\\-217.2396\\-71\\-36.3024\\-215.2865\\-71\\-36.41446\\-213.3334\\-71\\-36.38306\\-211.3803\\-71\\-36.12399\\-209.4271\\-71\\-35.57317\\-207.474\\-71\\-34.42262\\-205.5209\\-71\\-33.47935\\-205.0208\\-71\\-32.92963\\-205.5209\\-71\\-31.4862\\-207.474\\-71\\-30.72405\\-209.4271\\-71\\-30.75418\\-213.3334\\-71\\-31.52623\\-214.7378\\-71\\-33.47935\\-216.6264\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002337" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "138" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-211.8422\\-71\\38.78627\\-210.515\\-71\\37.81871\\-209.4271\\-71\\37.88586\\-207.474\\-71\\38.65084\\-205.5209\\-71\\39.66735\\-203.5678\\-71\\41.57061\\-201.6146\\-71\\42.12286\\-199.6615\\-71\\43.38929\\-197.7084\\-71\\45.48643\\-195.7553\\-71\\46.93706\\-193.8021\\-71\\47.80107\\-191.849\\-71\\49.50249\\-189.8959\\-71\\50.89441\\-187.9428\\-71\\51.93771\\-185.9896\\-71\\53.83504\\-184.0365\\-71\\55.05\\-182.0834\\-71\\55.47879\\-180.1303\\-71\\57.12844\\-178.1771\\-71\\58.00063\\-176.224\\-71\\59.2135\\-174.2709\\-71\\60.84795\\-172.3178\\-71\\61.29649\\-170.3646\\-71\\62.22377\\-169.3172\\-71\\64.1769\\-167.4163\\-71\\66.13003\\-165.8513\\-71\\68.08315\\-166.0237\\-71\\68.5748\\-166.4584\\-71\\70.19904\\-168.4115\\-71\\71.18723\\-170.3646\\-71\\72.34622\\-172.3178\\-71\\73.80709\\-176.224\\-71\\74.74107\\-178.1771\\-71\\75.56799\\-180.1303\\-71\\75.78714\\-182.0834\\-71\\75.78714\\-184.0365\\-71\\75.56799\\-187.9428\\-71\\74.7121\\-189.8959\\-71\\73.94253\\-190.6959\\-71\\71.9894\\-192.4126\\-71\\70.03628\\-193.2032\\-71\\68.08315\\-194.6054\\-71\\66.13003\\-195.6605\\-71\\64.1769\\-195.8773\\-71\\62.22377\\-196.6207\\-71\\60.27065\\-197.6418\\-71\\58.31752\\-197.8828\\-71\\56.3644\\-198.6242\\-71\\54.41127\\-200.3036\\-71\\52.5279\\-201.6146\\-71\\50.49733\\-203.5678\\-71\\49.04599\\-205.5209\\-71\\47.39098\\-207.474\\-71\\44.64565\\-210.2193\\-71\\42.69252\\-211.7268\\-71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "139" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-208.1307\\-69\\-135.7049\\-205.5209\\-69\\-137.2425\\-203.5678\\-69\\-137.9537\\-201.6146\\-69\\-138.4024\\-199.6615\\-69\\-138.2607\\-197.7084\\-69\\-137.5646\\-195.7553\\-69\\-138.2992\\-193.8021\\-69\\-138.5711\\-191.849\\-69\\-137.7673\\-189.8959\\-69\\-136.995\\-189.1575\\-69\\-135.0419\\-188.8344\\-69\\-134.2122\\-189.8959\\-69\\-135.4189\\-191.849\\-69\\-136.665\\-195.7553\\-69\\-135.4414\\-199.6615\\-69\\-133.8381\\-203.5678\\-69\\-132.195\\-205.5209\\-69\\-131.1356\\-206.5947\\-69\\-130.0678\\-207.474\\-69\\-131.1356\\-208.7696\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "140" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-190.8336\\-69\\-129.987\\-189.8959\\-69\\-130.002\\-185.9896\\-69\\-125.2762\\-181.2064\\-69\\-121.37\\-177.4358\\-69\\-119.4168\\-176.6134\\-69\\-117.4637\\-175.4358\\-69\\-115.5106\\-174.7175\\-69\\-113.5575\\-174.4947\\-69\\-111.6043\\-174.4947\\-69\\-109.6512\\-174.6277\\-69\\-107.6981\\-175.862\\-69\\-107.4163\\-176.224\\-69\\-107.2098\\-178.1771\\-69\\-107.2917\\-180.1303\\-69\\-108.6191\\-182.0834\\-69\\-110.5075\\-184.0365\\-69\\-111.3806\\-185.9896\\-69\\-111.5378\\-187.9428\\-69\\-112.2243\\-189.8959\\-69\\-113.5575\\-191.207\\-69\\-115.5106\\-190.8518\\-69\\-117.4637\\-189.7605\\-69\\-119.4168\\-189.6484\\-69\\-121.37\\-189.6484\\-69\\-123.3231\\-188.8677\\-69\\-125.2762\\-187.9506\\-69\\-127.2293\\-189.1635\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "141" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-206.3011\\-69\\-124.0755\\-205.5209\\-69\\-121.37\\-202.8622\\-69\\-119.4168\\-202.3113\\-69\\-118.476\\-203.5678\\-69\\-119.2258\\-205.5209\\-69\\-119.4168\\-205.7106\\-69\\-121.37\\-206.5426\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "142" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-200.5468\\-69\\-119.9875\\-199.6615\\-69\\-122.3289\\-197.7084\\-69\\-122.1838\\-195.7553\\-69\\-121.37\\-195.4623\\-69\\-119.4168\\-195.882\\-69\\-117.4637\\-194.7918\\-69\\-116.3846\\-195.7553\\-69\\-116.7832\\-197.7084\\-69\\-118.8173\\-199.6615\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "143" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-109.6512\\-207.9681\\-69\\-110.3261\\-207.474\\-69\\-111.2638\\-205.5209\\-69\\-111.1335\\-203.5678\\-69\\-109.6512\\-201.7501\\-69\\-107.6981\\-202.9767\\-69\\-107.2822\\-203.5678\\-69\\-107.4163\\-205.5209\\-69\\-109.0941\\-207.474\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "144" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-213.5204\\-69\\-41.50111\\-213.3334\\-69\\-43.24498\\-210.8343\\-69\\-44.12101\\-209.4271\\-69\\-46.01353\\-207.474\\-69\\-48.06578\\-205.5209\\-69\\-50.41875\\-203.5678\\-69\\-52.10506\\-201.6146\\-69\\-53.0106\\-200.8638\\-69\\-54.96373\\-199.7281\\-69\\-56.91685\\-198.3788\\-69\\-58.86998\\-197.6708\\-69\\-62.77623\\-196.3656\\-69\\-64.72935\\-195.7629\\-69\\-68.6356\\-195.6067\\-69\\-70.58872\\-195.5937\\-69\\-72.54185\\-194.6177\\-69\\-74.49497\\-192.7188\\-69\\-77.29414\\-189.8959\\-69\\-78.002\\-187.9428\\-69\\-77.34256\\-185.9896\\-69\\-77.33937\\-184.0365\\-69\\-78.1194\\-182.0834\\-69\\-78.0218\\-180.1303\\-69\\-77.32793\\-178.1771\\-69\\-75.60079\\-174.2709\\-69\\-74.95694\\-172.3178\\-69\\-73.58523\\-170.3646\\-69\\-72.85667\\-168.4115\\-69\\-72.54185\\-168.0571\\-69\\-70.58872\\-166.5861\\-69\\-68.6356\\-167.1181\\-69\\-66.68247\\-168.1035\\-69\\-66.37235\\-168.4115\\-69\\-65.20876\\-170.3646\\-69\\-63.93415\\-172.3178\\-69\\-62.3919\\-174.2709\\-69\\-61.45839\\-176.224\\-69\\-59.77108\\-178.1771\\-69\\-57.81529\\-180.1303\\-69\\-56.08044\\-182.0834\\-69\\-55.62658\\-184.0365\\-69\\-54.14993\\-185.9896\\-69\\-53.44529\\-187.9428\\-69\\-51.9261\\-189.8959\\-69\\-50.02813\\-191.849\\-69\\-45.1981\\-196.6483\\-69\\-42.53697\\-199.6615\\-69\\-41.4558\\-201.6146\\-69\\-40.10569\\-203.5678\\-69\\-38.50617\\-205.5209\\-69\\-38.35792\\-209.4271\\-69\\-38.37479\\-211.3803\\-69\\-39.33873\\-212.9441\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "145" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-178.3766\\-69\\-41.29185\\-177.5486\\-69\\-43.24498\\-176.9071\\-69\\-45.1981\\-175.2525\\-69\\-48.12254\\-172.3178\\-69\\-48.92997\\-170.3646\\-69\\-50.07079\\-168.4115\\-69\\-50.97671\\-166.4584\\-69\\-51.00529\\-162.5521\\-69\\-52.28399\\-160.599\\-69\\-53.0106\\-159.9531\\-69\\-54.96373\\-160.146\\-69\\-56.80835\\-158.6459\\-69\\-55.34197\\-156.6928\\-69\\-54.96373\\-156.3462\\-69\\-53.0106\\-156.2045\\-69\\-51.05748\\-156.2768\\-69\\-49.36344\\-154.7396\\-69\\-48.27501\\-152.7865\\-69\\-46.63631\\-150.8334\\-69\\-45.53419\\-148.8803\\-69\\-44.24221\\-146.9271\\-69\\-43.24498\\-145.9556\\-69\\-41.29185\\-144.5301\\-69\\-39.33873\\-143.9975\\-69\\-37.3856\\-142.5413\\-69\\-35.43248\\-142.3031\\-69\\-31.52623\\-142.3129\\-69\\-29.5731\\-142.5862\\-69\\-29.03303\\-143.0209\\-69\\-26.05595\\-144.974\\-69\\-25.66685\\-145.3631\\-69\\-23.12886\\-148.8803\\-69\\-22.61865\\-152.7865\\-69\\-21.15839\\-154.7396\\-69\\-19.80748\\-155.8108\\-69\\-18.48168\\-156.6928\\-69\\-17.85435\\-157.3842\\-69\\-17.03901\\-158.6459\\-69\\-17.85435\\-159.4498\\-69\\-21.7606\\-159.6849\\-69\\-22.68316\\-160.599\\-69\\-23.37764\\-162.5521\\-69\\-23.57829\\-164.5053\\-69\\-24.68067\\-166.4584\\-69\\-25.32033\\-168.4115\\-69\\-26.32655\\-170.3646\\-69\\-27.01292\\-172.3178\\-69\\-28.53319\\-174.2709\\-69\\-31.52623\\-177.2056\\-69\\-33.47935\\-178.3888\\-69\\-37.3856\\-178.459\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "146" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-31.52623\\-219.8064\\-69\\-33.47935\\-218.4551\\-69\\-34.37799\\-217.2396\\-69\\-33.96763\\-215.2865\\-69\\-33.47935\\-214.7827\\-69\\-32.58854\\-213.3334\\-69\\-32.58417\\-211.3803\\-69\\-34.43372\\-207.474\\-69\\-33.66291\\-205.5209\\-69\\-31.52623\\-204.455\\-69\\-29.5731\\-204.5255\\-69\\-28.81935\\-205.5209\\-69\\-28.78344\\-213.3334\\-69\\-28.69089\\-217.2396\\-69\\-29.5731\\-218.9624\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002336" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "147" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "36.83315\\-210.2154\\-69\\36.22009\\-209.4271\\-69\\37.74612\\-207.474\\-69\\38.80898\\-205.5209\\-69\\39.5479\\-203.5678\\-69\\41.02313\\-201.6146\\-69\\41.89561\\-199.6615\\-69\\43.63098\\-197.7084\\-69\\47.47339\\-193.8021\\-69\\48.88799\\-191.849\\-69\\50.01974\\-189.8959\\-69\\50.50502\\-189.3888\\-69\\53.26329\\-185.9896\\-69\\55.17788\\-184.0365\\-69\\56.10631\\-182.0834\\-69\\56.29731\\-180.1303\\-69\\58.22278\\-176.224\\-69\\59.26122\\-174.2709\\-69\\61.10706\\-172.3178\\-69\\61.68248\\-170.3646\\-69\\63.24141\\-168.4115\\-69\\66.13003\\-165.5566\\-69\\68.08315\\-165.436\\-69\\69.44424\\-166.4584\\-69\\71.12982\\-168.4115\\-69\\72.28237\\-170.3646\\-69\\73.06313\\-172.3178\\-69\\73.62563\\-174.2709\\-69\\76.40096\\-182.0834\\-69\\76.43387\\-184.0365\\-69\\75.78714\\-185.9896\\-69\\75.63656\\-187.9428\\-69\\74.74341\\-189.8959\\-69\\73.94253\\-190.7276\\-69\\70.03628\\-192.7354\\-69\\68.08315\\-194.3134\\-69\\66.13003\\-195.0858\\-69\\64.1769\\-195.6745\\-69\\62.22377\\-196.3696\\-69\\58.31752\\-197.0523\\-69\\56.3644\\-198.3403\\-69\\54.41127\\-198.9517\\-69\\52.45815\\-200.5127\\-69\\49.41714\\-203.5678\\-69\\46.59877\\-207.0846\\-69\\44.23671\\-209.4271\\-69\\42.69252\\-210.6813\\-69\\40.7394\\-210.9183\\-69\\38.78627\\-210.834\\-69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "148" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-208.5296\\-67\\-135.0419\\-206.7921\\-67\\-139.3735\\-201.6146\\-67\\-139.4189\\-199.6615\\-67\\-138.9481\\-198.7626\\-67\\-137.9505\\-197.7084\\-67\\-137.4395\\-195.7553\\-67\\-137.912\\-193.8021\\-67\\-138.9481\\-193.1486\\-67\\-139.7376\\-191.849\\-67\\-138.9481\\-190.8493\\-67\\-136.995\\-189.2816\\-67\\-135.8637\\-189.8959\\-67\\-135.9193\\-191.849\\-67\\-136.5392\\-193.8021\\-67\\-136.618\\-195.7553\\-67\\-136.4783\\-197.7084\\-67\\-135.7606\\-199.6615\\-67\\-134.598\\-201.6146\\-67\\-133.8091\\-203.5678\\-67\\-133.0887\\-204.8786\\-67\\-131.3965\\-207.474\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "149" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-190.9792\\-67\\-130.6509\\-189.8959\\-67\\-130.002\\-185.9896\\-67\\-126.23\\-182.0834\\-67\\-121.37\\-177.354\\-67\\-119.4168\\-176.6109\\-67\\-117.4637\\-175.6589\\-67\\-115.5106\\-175.0058\\-67\\-113.5575\\-174.5964\\-67\\-111.6043\\-174.5414\\-67\\-109.6512\\-174.8923\\-67\\-108.1689\\-176.224\\-67\\-107.3413\\-178.1771\\-67\\-108.8451\\-182.0834\\-67\\-110.4589\\-184.0365\\-67\\-111.1697\\-185.9896\\-67\\-111.1884\\-187.9428\\-67\\-111.3686\\-189.8959\\-67\\-111.6043\\-190.2183\\-67\\-113.5575\\-191.556\\-67\\-115.5106\\-190.7634\\-67\\-117.4637\\-189.6484\\-67\\-121.37\\-189.6484\\-67\\-123.3231\\-188.8259\\-67\\-125.2762\\-187.6953\\-67\\-127.2293\\-189.0711\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "150" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-119.4168\\-201.3056\\-67\\-120.4992\\-199.6615\\-67\\-121.37\\-198.9458\\-67\\-123.3231\\-198.4348\\-67\\-124.1515\\-197.7084\\-67\\-125.1355\\-195.7553\\-67\\-123.3231\\-194.5046\\-67\\-121.8379\\-195.7553\\-67\\-119.7712\\-197.7084\\-67\\-119.4168\\-198.1686\\-67\\-118.7333\\-199.6615\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "151" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-109.6512\\-208.4313\\-67\\-111.1814\\-207.474\\-67\\-110.6529\\-203.5678\\-67\\-109.6512\\-201.5608\\-67\\-107.6981\\-201.3003\\-67\\-107.3941\\-201.6146\\-67\\-106.9538\\-203.5678\\-67\\-107.1761\\-205.5209\\-67\\-108.6939\\-207.474\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "152" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-214.1275\\-67\\-42.11936\\-213.3334\\-67\\-42.89845\\-211.3803\\-67\\-43.83964\\-209.4271\\-67\\-44.90513\\-207.474\\-67\\-47.15123\\-205.27\\-67\\-48.99421\\-203.5678\\-67\\-51.05748\\-201.3445\\-67\\-53.0106\\-200.2931\\-67\\-54.96373\\-198.5604\\-67\\-56.91685\\-197.0453\\-67\\-60.8231\\-196.4221\\-67\\-62.77623\\-195.8638\\-67\\-64.72935\\-195.6468\\-67\\-66.68247\\-195.0662\\-67\\-68.6356\\-194.8169\\-67\\-70.58872\\-194.8003\\-67\\-72.54185\\-194.3465\\-67\\-74.49497\\-192.7188\\-67\\-77.32939\\-189.8959\\-67\\-78.1194\\-187.9428\\-67\\-77.5021\\-185.9896\\-67\\-77.4929\\-184.0365\\-67\\-78.13069\\-182.0834\\-67\\-78.14214\\-180.1303\\-67\\-77.5042\\-178.1771\\-67\\-77.26413\\-176.224\\-67\\-76.89199\\-174.2709\\-67\\-75.51739\\-172.3178\\-67\\-75.20918\\-170.3646\\-67\\-74.17421\\-168.4115\\-67\\-72.54185\\-166.7301\\-67\\-70.58872\\-165.8586\\-67\\-68.6356\\-167.3949\\-67\\-65.64996\\-170.3646\\-67\\-64.00902\\-172.3178\\-67\\-63.34132\\-174.2709\\-67\\-61.73425\\-176.224\\-67\\-59.77584\\-178.1771\\-67\\-57.98976\\-180.1303\\-67\\-57.54538\\-182.0834\\-67\\-56.02463\\-184.0365\\-67\\-55.47741\\-185.9896\\-67\\-52.244\\-189.8959\\-67\\-51.05748\\-191.5325\\-67\\-48.7766\\-193.8021\\-67\\-47.15123\\-195.0381\\-67\\-45.1981\\-196.6563\\-67\\-43.24498\\-198.5966\\-67\\-38.5166\\-203.5678\\-67\\-38.0998\\-205.5209\\-67\\-36.61515\\-207.474\\-67\\-36.48756\\-209.4271\\-67\\-36.75057\\-211.3803\\-67\\-38.23501\\-213.3334\\-67\\-39.33873\\-214.4201\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "153" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-178.2293\\-67\\-39.33873\\-177.4945\\-67\\-41.29185\\-176.9786\\-67\\-43.24498\\-175.6621\\-67\\-45.1981\\-174.9442\\-67\\-47.15123\\-173.2372\\-67\\-48.08054\\-172.3178\\-67\\-48.86863\\-170.3646\\-67\\-50.03561\\-168.4115\\-67\\-50.90887\\-166.4584\\-67\\-50.99089\\-162.5521\\-67\\-51.73477\\-160.599\\-67\\-53.0106\\-159.5004\\-67\\-54.96373\\-159.6801\\-67\\-56.67455\\-158.6459\\-67\\-55.9969\\-156.6928\\-67\\-54.96373\\-155.634\\-67\\-51.05748\\-155.5678\\-67\\-50.00813\\-154.7396\\-67\\-48.88055\\-152.7865\\-67\\-48.24146\\-150.8334\\-67\\-46.6474\\-148.8803\\-67\\-45.57513\\-146.9271\\-67\\-43.24498\\-144.4857\\-67\\-41.29185\\-143.5881\\-67\\-39.33873\\-142.2708\\-67\\-37.3856\\-141.5277\\-67\\-35.43248\\-140.3281\\-67\\-33.47935\\-140.3221\\-67\\-31.52623\\-140.6331\\-67\\-29.5731\\-141.9855\\-67\\-27.61998\\-142.2708\\-67\\-25.66685\\-143.2711\\-67\\-23.12139\\-146.9271\\-67\\-22.62394\\-148.8803\\-67\\-21.61199\\-150.8334\\-67\\-21.47878\\-152.7865\\-67\\-20.39213\\-154.7396\\-67\\-19.80748\\-155.2563\\-67\\-17.85435\\-155.8328\\-67\\-16.98136\\-156.6928\\-67\\-16.3178\\-158.6459\\-67\\-17.85435\\-159.5889\\-67\\-19.80748\\-159.0523\\-67\\-21.7606\\-159.8023\\-67\\-22.50625\\-160.599\\-67\\-23.3672\\-164.5053\\-67\\-24.40037\\-166.4584\\-67\\-25.53142\\-170.3646\\-67\\-26.64861\\-172.3178\\-67\\-29.5731\\-175.2997\\-67\\-31.52623\\-176.9711\\-67\\-33.47935\\-177.5278\\-67\\-35.43248\\-178.2437\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "154" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-31.52623\\-222.677\\-67\\-32.17556\\-221.1459\\-67\\-32.41527\\-219.1928\\-67\\-32.48144\\-217.2396\\-67\\-31.60332\\-215.2865\\-67\\-30.62365\\-213.3334\\-67\\-30.62818\\-211.3803\\-67\\-31.47364\\-209.4271\\-67\\-32.54763\\-207.474\\-67\\-32.24493\\-205.5209\\-67\\-31.52623\\-204.8062\\-67\\-29.5731\\-203.8304\\-67\\-27.73011\\-205.5209\\-67\\-27.61235\\-207.474\\-67\\-27.07376\\-209.4271\\-67\\-26.82652\\-211.3803\\-67\\-26.32018\\-213.3334\\-67\\-25.17857\\-215.2865\\-67\\-25.004\\-217.2396\\-67\\-25.66685\\-218.819\\-67\\-27.75086\\-221.1459\\-67\\-29.5731\\-222.7675\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002335" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "155" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "38.78627\\-210.4719\\-67\\37.05252\\-209.4271\\-67\\38.78627\\-207.3505\\-67\\39.5479\\-205.5209\\-67\\39.59183\\-203.5678\\-67\\40.57545\\-201.6146\\-67\\42.34147\\-199.6615\\-67\\48.5519\\-193.4048\\-67\\52.80467\\-187.9428\\-67\\53.62342\\-185.9896\\-67\\56.89453\\-182.0834\\-67\\57.45505\\-178.1771\\-67\\58.92458\\-176.224\\-67\\59.39807\\-174.2709\\-67\\61.00065\\-172.3178\\-67\\61.37712\\-170.3646\\-67\\64.1769\\-167.4536\\-67\\66.13003\\-165.5049\\-67\\68.08315\\-164.789\\-67\\70.03628\\-165.7116\\-67\\70.80782\\-166.4584\\-67\\72.28237\\-168.4115\\-67\\73.07716\\-170.3646\\-67\\73.61486\\-172.3178\\-67\\73.73082\\-174.2709\\-67\\74.7185\\-176.224\\-67\\75.57875\\-178.1771\\-67\\75.73406\\-180.1303\\-67\\76.70015\\-182.0834\\-67\\76.87222\\-184.0365\\-67\\76.29238\\-185.9896\\-67\\75.07949\\-187.9428\\-67\\74.38258\\-189.8959\\-67\\73.94253\\-190.3842\\-67\\71.27325\\-191.849\\-67\\68.08315\\-193.2098\\-67\\66.13003\\-194.4331\\-67\\64.1769\\-195.0991\\-67\\62.22377\\-195.8773\\-67\\60.27065\\-195.979\\-67\\58.31752\\-196.601\\-67\\56.3644\\-197.716\\-67\\54.41127\\-198.3506\\-67\\52.45815\\-199.3204\\-67\\46.11049\\-205.5209\\-67\\44.64565\\-206.8967\\-67\\42.69252\\-208.8809\\-67\\40.7394\\-210.3455\\-67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "156" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-136.995\\-197.4864\\-65\\-137.2558\\-195.7553\\-65\\-137.3706\\-193.8021\\-65\\-138.9481\\-193.2228\\-65\\-140.1579\\-191.849\\-65\\-138.9481\\-189.9037\\-65\\-136.995\\-190.7138\\-65\\-136.4479\\-191.849\\-65\\-136.7458\\-193.8021\\-65\\-136.5572\\-195.7553\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "157" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-131.1356\\-210.0249\\-65\\-133.0887\\-208.8885\\-65\\-135.0419\\-208.1378\\-65\\-137.5087\\-205.5209\\-65\\-138.4128\\-203.5678\\-65\\-138.9481\\-203.0053\\-65\\-139.8952\\-201.6146\\-65\\-139.8087\\-199.6615\\-65\\-138.9481\\-198.685\\-65\\-136.995\\-197.7481\\-65\\-135.8003\\-199.6615\\-65\\-134.1702\\-201.6146\\-65\\-132.7526\\-205.5209\\-65\\-131.8203\\-207.474\\-65\\-131.1356\\-208.5695\\-65\\-129.1825\\-209.3324\\-65\\-129.1825\\-209.5942\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "158" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-199.2377\\-65\\-124.521\\-197.7084\\-65\\-124.4706\\-195.7553\\-65\\-123.3231\\-194.7215\\-65\\-121.7619\\-195.7553\\-65\\-120.6426\\-197.7084\\-65\\-121.2922\\-199.6615\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "159" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-192.2359\\-65\\-115.5106\\-190.7634\\-65\\-117.4637\\-189.6484\\-65\\-121.37\\-189.5391\\-65\\-123.3231\\-188.723\\-65\\-125.2762\\-187.4291\\-65\\-127.2293\\-188.9525\\-65\\-129.1825\\-190.2261\\-65\\-129.8996\\-189.8959\\-65\\-130.2623\\-187.9428\\-65\\-129.7052\\-185.9896\\-65\\-127.2293\\-182.5447\\-65\\-125.2762\\-180.9743\\-65\\-123.3231\\-179.2833\\-65\\-121.37\\-177.8389\\-65\\-119.4168\\-177.0024\\-65\\-117.4637\\-176.517\\-65\\-115.5106\\-175.6075\\-65\\-113.5575\\-175.0337\\-65\\-111.6043\\-174.927\\-65\\-109.6512\\-175.9603\\-65\\-109.3855\\-176.224\\-65\\-108.6068\\-178.1771\\-65\\-108.8014\\-180.1303\\-65\\-109.1982\\-182.0834\\-65\\-110.1042\\-184.0365\\-65\\-110.5453\\-185.9896\\-65\\-110.5502\\-187.9428\\-65\\-110.8298\\-189.8959\\-65\\-111.6043\\-191.2397\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "160" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-208.0998\\-65\\-112.118\\-207.474\\-65\\-110.9349\\-205.5209\\-65\\-110.5918\\-203.5678\\-65\\-110.5882\\-201.6146\\-65\\-109.6512\\-199.5338\\-65\\-107.6981\\-200.234\\-65\\-106.707\\-201.6146\\-65\\-106.3835\\-203.5678\\-65\\-106.9621\\-205.5209\\-65\\-108.6606\\-207.474\\-65\\-109.6512\\-208.4841\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "59" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "161" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-214.1861\\-65\\-42.17027\\-213.3334\\-65\\-42.89845\\-211.3803\\-65\\-43.16421\\-209.4271\\-65\\-44.32954\\-207.474\\-65\\-48.06494\\-203.5678\\-65\\-49.59574\\-201.6146\\-65\\-50.5419\\-199.6615\\-65\\-51.05748\\-199.089\\-65\\-53.0106\\-198.5322\\-65\\-54.96373\\-197.2695\\-65\\-56.91685\\-196.4045\\-65\\-58.86998\\-195.991\\-65\\-60.8231\\-195.8773\\-65\\-62.77623\\-195.6332\\-65\\-66.68247\\-194.4295\\-65\\-68.6356\\-193.9765\\-65\\-70.58872\\-193.8543\\-65\\-72.54185\\-193.5904\\-65\\-74.49497\\-192.5998\\-65\\-77.21042\\-189.8959\\-65\\-77.89591\\-187.9428\\-65\\-77.90438\\-185.9896\\-65\\-78.14214\\-182.0834\\-65\\-78.14214\\-180.1303\\-65\\-77.88997\\-176.224\\-65\\-77.327\\-174.2709\\-65\\-76.41025\\-172.3178\\-65\\-76.24435\\-170.3646\\-65\\-75.52061\\-168.4115\\-65\\-74.49497\\-166.8535\\-65\\-74.10287\\-166.4584\\-65\\-72.54185\\-165.4677\\-65\\-70.58872\\-165.5147\\-65\\-69.57169\\-166.4584\\-65\\-63.7963\\-172.3178\\-65\\-62.50569\\-174.2709\\-65\\-61.76228\\-176.224\\-65\\-59.78056\\-178.1771\\-65\\-58.48304\\-180.1303\\-65\\-57.79107\\-182.0834\\-65\\-56.65776\\-184.0365\\-65\\-55.81591\\-185.9896\\-65\\-53.92886\\-187.9428\\-65\\-52.94402\\-189.8959\\-65\\-52.1772\\-191.849\\-65\\-51.05748\\-193.6769\\-65\\-49.10435\\-195.5131\\-65\\-47.15123\\-196.4248\\-65\\-45.1981\\-197.0591\\-65\\-43.24498\\-198.6138\\-65\\-38.28736\\-203.5678\\-65\\-36.58275\\-205.5209\\-65\\-35.40885\\-207.474\\-65\\-34.54149\\-209.4271\\-65\\-35.25163\\-211.3803\\-65\\-36.4379\\-213.3334\\-65\\-37.3856\\-214.3904\\-65\\-39.33873\\-214.8996\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "162" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-176.9589\\-65\\-41.29185\\-175.6243\\-65\\-43.24498\\-174.9788\\-65\\-45.1981\\-173.7012\\-65\\-47.15123\\-172.3101\\-65\\-49.68696\\-168.4115\\-65\\-50.36843\\-166.4584\\-65\\-50.89589\\-164.5053\\-65\\-51.13824\\-160.599\\-65\\-52.39147\\-158.6459\\-65\\-53.0106\\-158.0983\\-65\\-54.96373\\-159.1044\\-65\\-55.61196\\-158.6459\\-65\\-56.64448\\-156.6928\\-65\\-54.96373\\-155.2308\\-65\\-53.0106\\-155.1035\\-65\\-51.05748\\-154.2847\\-65\\-49.6131\\-152.7865\\-65\\-48.85686\\-150.8334\\-65\\-48.246\\-148.8803\\-65\\-47.15123\\-147.4842\\-65\\-45.1981\\-145.4102\\-65\\-41.29185\\-141.6411\\-65\\-40.63358\\-141.0678\\-65\\-39.33873\\-140.2432\\-65\\-37.3856\\-139.7242\\-65\\-33.47935\\-139.659\\-65\\-31.52623\\-140.0157\\-65\\-29.5731\\-140.2509\\-65\\-27.61998\\-140.3341\\-65\\-25.66685\\-141.3195\\-65\\-23.71373\\-143.2556\\-65\\-22.89769\\-144.974\\-65\\-22.51681\\-146.9271\\-65\\-21.13207\\-148.8803\\-65\\-20.86715\\-150.8334\\-65\\-20.85053\\-152.7865\\-65\\-19.80748\\-154.1636\\-65\\-17.85435\\-155.5008\\-65\\-16.71274\\-156.6928\\-65\\-16.32115\\-158.6459\\-65\\-17.85435\\-159.4012\\-65\\-19.80748\\-157.7135\\-65\\-20.82755\\-158.6459\\-65\\-21.7606\\-160.6571\\-65\\-22.54474\\-162.5521\\-65\\-22.96945\\-164.5053\\-65\\-23.59166\\-166.4584\\-65\\-24.69517\\-168.4115\\-65\\-25.38503\\-170.3646\\-65\\-26.59119\\-172.3178\\-65\\-29.5731\\-175.2475\\-65\\-31.52623\\-176.5058\\-65\\-33.47935\\-176.9906\\-65\\-35.43248\\-177.2006\\-65\\-37.3856\\-177.1961\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "163" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-225.3561\\-65\\-33.79158\\-225.0521\\-65\\-34.0205\\-223.099\\-65\\-31.56437\\-221.1459\\-65\\-29.5731\\-219.0097\\-65\\-28.76395\\-217.2396\\-65\\-28.64767\\-213.3334\\-65\\-28.65308\\-211.3803\\-65\\-29.1574\\-209.4271\\-65\\-30.40928\\-207.474\\-65\\-29.83408\\-205.5209\\-65\\-29.18989\\-205.5209\\-65\\-27.61998\\-206.9464\\-65\\-27.31601\\-207.474\\-65\\-25.66685\\-209.5023\\-65\\-24.87197\\-211.3803\\-65\\-24.7754\\-213.3334\\-65\\-24.23496\\-215.2865\\-65\\-23.51429\\-217.2396\\-65\\-24.40804\\-219.1928\\-65\\-24.91832\\-221.1459\\-65\\-25.66685\\-222.0342\\-65\\-27.36645\\-223.099\\-65\\-30.28925\\-225.0521\\-65\\-31.52623\\-225.7251\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002334" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "164" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-200.9465\\-65\\45.63759\\-199.6615\\-65\\46.59877\\-198.6\\-65\\48.77726\\-195.7553\\-65\\49.72486\\-193.8021\\-65\\50.90175\\-191.849\\-65\\51.754\\-189.8959\\-65\\53.30886\\-187.9428\\-65\\54.24968\\-185.9896\\-65\\55.31516\\-184.0365\\-65\\56.92633\\-182.0834\\-65\\57.39815\\-180.1303\\-65\\57.98986\\-178.1771\\-65\\59.15923\\-176.224\\-65\\59.86171\\-174.2709\\-65\\60.20406\\-172.3178\\-65\\61.25177\\-170.3646\\-65\\63.22274\\-168.4115\\-65\\64.85419\\-166.4584\\-65\\66.13003\\-165.312\\-65\\68.08315\\-164.6407\\-65\\70.03628\\-165.3749\\-65\\71.5737\\-166.4584\\-65\\73.07827\\-168.4115\\-65\\73.61486\\-170.3646\\-65\\73.95016\\-174.2709\\-65\\75.70865\\-178.1771\\-65\\75.73406\\-180.1303\\-65\\76.70177\\-182.0834\\-65\\76.8599\\-184.0365\\-65\\75.68394\\-185.9896\\-65\\73.12958\\-189.8959\\-65\\71.9894\\-191.0301\\-65\\70.03628\\-191.2871\\-65\\68.96621\\-191.849\\-65\\65.99915\\-193.8021\\-65\\62.22377\\-195.5436\\-65\\60.27065\\-195.6332\\-65\\56.3644\\-196.9339\\-65\\54.41127\\-197.0243\\-65\\52.45815\\-197.2708\\-65\\50.50502\\-198.8909\\-65\\49.44775\\-199.6615\\-65\\48.5519\\-200.5084\\-65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "165" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-136.995\\-194.1552\\-63\\-138.9481\\-193.2639\\-63\\-140.2798\\-191.849\\-63\\-138.9481\\-189.6964\\-63\\-136.995\\-190.7995\\-63\\-136.1376\\-191.849\\-63\\-136.5014\\-193.8021\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "166" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-209.953\\-63\\-135.0419\\-208.5647\\-63\\-136.4148\\-207.474\\-63\\-138.9481\\-204.825\\-63\\-139.873\\-203.5678\\-63\\-140.2909\\-201.6146\\-63\\-139.9626\\-199.6615\\-63\\-138.9481\\-198.5868\\-63\\-136.995\\-198.7759\\-63\\-135.0419\\-200.4841\\-63\\-133.8944\\-201.6146\\-63\\-132.6633\\-203.5678\\-63\\-132.575\\-205.5209\\-63\\-131.799\\-207.474\\-63\\-131.1356\\-208.1837\\-63\\-129.563\\-209.4271\\-63\\-131.1356\\-210.5018\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "167" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-198.7583\\-63\\-124.3633\\-197.7084\\-63\\-124.2078\\-195.7553\\-63\\-123.3231\\-194.8792\\-63\\-121.37\\-194.8143\\-63\\-120.4482\\-195.7553\\-63\\-120.4755\\-197.7084\\-63\\-121.37\\-198.7612\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "168" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-192.5405\\-63\\-115.5106\\-190.7634\\-63\\-117.4637\\-189.6484\\-63\\-119.4168\\-189.6254\\-63\\-121.37\\-189.1458\\-63\\-123.3231\\-187.4045\\-63\\-125.1276\\-185.9896\\-63\\-127.2293\\-184.1166\\-63\\-126.6176\\-182.0834\\-63\\-125.2762\\-181.0273\\-63\\-123.3231\\-180.6011\\-63\\-121.37\\-180.4558\\-63\\-119.4168\\-179.1293\\-63\\-118.7244\\-178.1771\\-63\\-117.4637\\-177.1575\\-63\\-115.5106\\-176.686\\-63\\-113.5575\\-175.8372\\-63\\-111.6043\\-176.1096\\-63\\-110.0182\\-178.1771\\-63\\-109.2448\\-180.1303\\-63\\-109.2742\\-182.0834\\-63\\-109.5026\\-185.9896\\-63\\-109.5026\\-187.9428\\-63\\-110.8668\\-191.849\\-63\\-111.6043\\-193.3396\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "169" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-208.8154\\-63\\-112.7265\\-207.474\\-63\\-112.1012\\-205.5209\\-63\\-111.8281\\-203.5678\\-63\\-113.5575\\-200.5985\\-63\\-113.9828\\-199.6615\\-63\\-114.5232\\-197.7084\\-63\\-113.5575\\-196.6485\\-63\\-112.2496\\-195.7553\\-63\\-111.6043\\-194.874\\-63\\-111.0308\\-195.7553\\-63\\-109.6512\\-196.4736\\-63\\-107.2542\\-199.6615\\-63\\-106.5506\\-201.6146\\-63\\-105.3386\\-203.5678\\-63\\-106.717\\-205.5209\\-63\\-107.6981\\-206.6021\\-63\\-109.6512\\-208.5304\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "170" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-194.3968\\-63\\-66.68247\\-193.6936\\-63\\-68.6356\\-193.5092\\-63\\-70.58872\\-193.0219\\-63\\-72.54185\\-192.7645\\-63\\-74.49497\\-191.3125\\-63\\-76.4481\\-189.2644\\-63\\-77.33311\\-187.9428\\-63\\-77.50824\\-185.9896\\-63\\-78.14214\\-184.0365\\-63\\-78.13069\\-176.224\\-63\\-77.55184\\-174.2709\\-63\\-77.31379\\-172.3178\\-63\\-77.30902\\-170.3646\\-63\\-76.95341\\-168.4115\\-63\\-75.3062\\-166.4584\\-63\\-74.49497\\-165.6879\\-63\\-72.54185\\-164.854\\-63\\-70.58872\\-165.2757\\-63\\-69.16235\\-166.4584\\-63\\-67.57723\\-168.4115\\-63\\-63.74297\\-172.3178\\-63\\-62.35085\\-174.2709\\-63\\-61.76228\\-176.224\\-63\\-59.8205\\-178.1771\\-63\\-58.77523\\-180.1303\\-63\\-57.83474\\-182.0834\\-63\\-56.99762\\-184.0365\\-63\\-55.85853\\-185.9896\\-63\\-54.17959\\-187.9428\\-63\\-52.94402\\-191.849\\-63\\-53.46467\\-193.8021\\-63\\-54.96373\\-195.203\\-63\\-56.91685\\-195.6198\\-63\\-60.8231\\-195.5078\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "171" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-214.1077\\-63\\-42.08626\\-213.3334\\-63\\-42.78301\\-211.3803\\-63\\-43.75325\\-209.4271\\-63\\-44.41962\\-207.474\\-63\\-46.03582\\-205.5209\\-63\\-47.4236\\-203.5678\\-63\\-47.96593\\-201.6146\\-63\\-46.98685\\-199.6615\\-63\\-45.1981\\-198.7254\\-63\\-43.24498\\-199.0195\\-63\\-41.29185\\-200.5626\\-63\\-39.33873\\-202.4944\\-63\\-34.40828\\-207.474\\-63\\-33.83847\\-209.4271\\-63\\-32.92382\\-211.3803\\-63\\-32.80878\\-213.3334\\-63\\-33.47935\\-213.943\\-63\\-37.3856\\-214.9071\\-63\\-39.33873\\-214.9095\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "172" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-176.4357\\-63\\-39.33873\\-175.5612\\-63\\-41.29185\\-174.9341\\-63\\-45.1981\\-172.3575\\-63\\-47.19093\\-170.3646\\-63\\-49.70145\\-166.4584\\-63\\-50.33714\\-164.5053\\-63\\-50.87048\\-162.5521\\-63\\-50.97671\\-160.599\\-63\\-51.67794\\-158.6459\\-63\\-53.0106\\-157.5027\\-63\\-54.96373\\-157.8656\\-63\\-56.81364\\-156.6928\\-63\\-55.37741\\-154.7396\\-63\\-54.96373\\-154.3626\\-63\\-51.05748\\-153.2377\\-63\\-50.59153\\-152.7865\\-63\\-49.53904\\-150.8334\\-63\\-48.77669\\-148.8803\\-63\\-47.89039\\-146.9271\\-63\\-45.1981\\-143.5726\\-63\\-42.6472\\-141.0678\\-63\\-39.90595\\-139.1146\\-63\\-39.33873\\-138.5764\\-63\\-37.3856\\-138.1852\\-63\\-33.47935\\-138.1719\\-63\\-31.52623\\-138.2371\\-63\\-29.5731\\-138.7129\\-63\\-27.61998\\-139.7844\\-63\\-25.66685\\-140.0955\\-63\\-24.0271\\-141.0678\\-63\\-23.71373\\-141.3859\\-63\\-21.7606\\-144.2775\\-63\\-21.22238\\-144.974\\-63\\-20.89019\\-146.9271\\-63\\-20.7045\\-148.8803\\-63\\-20.02067\\-150.8334\\-63\\-19.14778\\-152.7865\\-63\\-17.44067\\-154.7396\\-63\\-16.26065\\-156.6928\\-63\\-17.85435\\-157.9607\\-63\\-19.80748\\-157.3853\\-63\\-21.24393\\-158.6459\\-63\\-21.72304\\-162.5521\\-63\\-22.75936\\-164.5053\\-63\\-23.40976\\-166.4584\\-63\\-24.64072\\-168.4115\\-63\\-25.49246\\-170.3646\\-63\\-26.70816\\-172.3178\\-63\\-27.61998\\-173.2346\\-63\\-29.5731\\-174.8698\\-63\\-31.52623\\-175.5161\\-63\\-33.47935\\-176.3325\\-63\\-35.43248\\-176.4478\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "173" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-225.9411\\-63\\-34.43244\\-225.0521\\-63\\-33.7769\\-223.099\\-63\\-33.47935\\-222.8399\\-63\\-31.52623\\-222.5658\\-63\\-30.12439\\-223.099\\-63\\-29.5731\\-223.7826\\-63\\-29.17637\\-225.0521\\-63\\-29.5731\\-225.4643\\-63\\-31.52623\\-226.2046\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "174" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-25.66685\\-223.7275\\-63\\-26.86043\\-223.099\\-63\\-27.5238\\-221.1459\\-63\\-26.73169\\-219.1928\\-63\\-26.64866\\-217.2396\\-63\\-26.70689\\-211.3803\\-63\\-25.92125\\-209.4271\\-63\\-25.66685\\-209.2154\\-63\\-23.71373\\-210.5843\\-63\\-23.09228\\-211.3803\\-63\\-22.8773\\-213.3334\\-63\\-22.79019\\-219.1928\\-63\\-22.90291\\-221.1459\\-63\\-23.71373\\-222.3734\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002333" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "175" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-196.3028\\-63\\52.45815\\-195.1457\\-63\\51.44193\\-193.8021\\-63\\51.66188\\-191.849\\-63\\52.84509\\-189.8959\\-63\\53.66889\\-187.9428\\-63\\54.95749\\-185.9896\\-63\\55.57655\\-184.0365\\-63\\57.22897\\-180.1303\\-63\\57.992\\-178.1771\\-63\\59.20152\\-176.224\\-63\\60.00011\\-174.2709\\-63\\60.01156\\-172.3178\\-63\\61.18242\\-170.3646\\-63\\63.182\\-168.4115\\-63\\63.89507\\-166.4584\\-63\\64.1769\\-166.1606\\-63\\66.13003\\-164.7982\\-63\\68.08315\\-164.6273\\-63\\70.03628\\-164.7982\\-63\\71.9894\\-165.7364\\-63\\72.71919\\-166.4584\\-63\\73.5834\\-168.4115\\-63\\73.82046\\-170.3646\\-63\\74.48874\\-172.3178\\-63\\75.09058\\-176.224\\-63\\75.70865\\-178.1771\\-63\\75.72126\\-180.1303\\-63\\76.42578\\-182.0834\\-63\\76.46531\\-184.0365\\-63\\74.90414\\-185.9896\\-63\\73.23837\\-187.9428\\-63\\71.9894\\-189.7006\\-63\\70.03628\\-190.6475\\-63\\68.08315\\-191.039\\-63\\66.13003\\-193.0896\\-63\\64.1769\\-194.2933\\-63\\62.22377\\-194.7333\\-63\\60.27065\\-194.9806\\-63\\58.23476\\-195.7553\\-63\\56.3644\\-196.3616\\-63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "176" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-209.8563\\-61\\-136.995\\-208.1972\\-61\\-139.696\\-205.5209\\-61\\-140.4482\\-203.5678\\-61\\-141.5843\\-201.6146\\-61\\-141.4817\\-199.6615\\-61\\-140.9012\\-199.0204\\-61\\-138.9481\\-198.278\\-61\\-136.995\\-199.1403\\-61\\-136.4705\\-199.6615\\-61\\-133.7684\\-201.6146\\-61\\-133.0887\\-202.1861\\-61\\-131.9083\\-203.5678\\-61\\-131.8909\\-205.5209\\-61\\-131.3473\\-207.474\\-61\\-129.8577\\-209.4271\\-61\\-131.1356\\-210.7908\\-61\\-133.0887\\-210.5557\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "177" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-198.126\\-61\\-123.7223\\-197.7084\\-61\\-123.7346\\-195.7553\\-61\\-123.3231\\-195.3161\\-61\\-121.37\\-194.7133\\-61\\-119.713\\-195.7553\\-61\\-119.954\\-197.7084\\-61\\-121.37\\-198.6479\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "178" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-208.8274\\-61\\-113.0866\\-207.474\\-61\\-112.7475\\-205.5209\\-61\\-112.6849\\-203.5678\\-61\\-114.2471\\-201.6146\\-61\\-114.9712\\-199.6615\\-61\\-116.1857\\-197.7084\\-61\\-115.5106\\-196.794\\-61\\-114.4719\\-195.7553\\-61\\-113.5575\\-195.1837\\-61\\-112.2777\\-193.8021\\-61\\-113.5575\\-192.2333\\-61\\-115.5106\\-190.7634\\-61\\-117.4637\\-189.6368\\-61\\-119.4168\\-189.4895\\-61\\-121.37\\-188.4341\\-61\\-121.8404\\-187.9428\\-61\\-122.3095\\-185.9896\\-61\\-121.37\\-184.3779\\-61\\-121.034\\-184.0365\\-61\\-119.4168\\-182.9837\\-61\\-117.4637\\-182.4726\\-61\\-116.7931\\-182.0834\\-61\\-115.5106\\-179.743\\-61\\-113.5575\\-178.1998\\-61\\-111.6043\\-178.7567\\-61\\-110.5804\\-180.1303\\-61\\-109.9218\\-182.0834\\-61\\-109.5846\\-184.0365\\-61\\-109.3473\\-185.9896\\-61\\-109.2742\\-187.9428\\-61\\-109.3694\\-189.8959\\-61\\-110.1525\\-191.849\\-61\\-110.1829\\-193.8021\\-61\\-109.6512\\-194.2452\\-61\\-108.8358\\-195.7553\\-61\\-106.8551\\-199.6615\\-61\\-105.1988\\-203.5678\\-61\\-106.1916\\-205.5209\\-61\\-107.3992\\-207.474\\-61\\-107.6981\\-207.7771\\-61\\-109.6512\\-208.6851\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "179" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-193.8248\\-61\\-66.68247\\-193.0722\\-61\\-68.6356\\-192.7758\\-61\\-70.58872\\-192.3138\\-61\\-72.54185\\-191.1676\\-61\\-74.49497\\-189.5959\\-61\\-77.32656\\-185.9896\\-61\\-78.00449\\-184.0365\\-61\\-78.13069\\-182.0834\\-61\\-78.13069\\-174.2709\\-61\\-77.85191\\-170.3646\\-61\\-77.4639\\-168.4115\\-61\\-76.39297\\-166.4584\\-61\\-74.49497\\-165.3586\\-61\\-72.54185\\-164.6539\\-61\\-70.58872\\-164.7758\\-61\\-68.6356\\-165.8092\\-61\\-68.03587\\-166.4584\\-61\\-66.5604\\-168.4115\\-61\\-65.22359\\-170.3646\\-61\\-63.69448\\-172.3178\\-61\\-62.35085\\-174.2709\\-61\\-61.76711\\-176.224\\-61\\-59.99055\\-178.1771\\-61\\-59.62952\\-180.1303\\-61\\-58.0083\\-182.0834\\-61\\-57.63719\\-184.0365\\-61\\-55.88152\\-185.9896\\-61\\-54.96373\\-187.8958\\-61\\-53.88462\\-189.8959\\-61\\-53.68668\\-191.849\\-61\\-54.96373\\-193.9123\\-61\\-56.91685\\-194.6969\\-61\\-60.8231\\-194.6928\\-61\\-62.77623\\-194.3434\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "180" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-174.9132\\-61\\-43.23722\\-172.3178\\-61\\-45.34536\\-170.3646\\-61\\-47.15123\\-168.3884\\-61\\-49.67913\\-164.5053\\-61\\-50.87048\\-160.599\\-61\\-51.15222\\-158.6459\\-61\\-52.43921\\-156.6928\\-61\\-53.0106\\-156.3394\\-61\\-54.96373\\-157.7391\\-61\\-56.81017\\-156.6928\\-61\\-55.74394\\-154.7396\\-61\\-54.96373\\-153.9676\\-61\\-53.0106\\-153.3176\\-61\\-51.05748\\-152.114\\-61\\-49.9138\\-150.8334\\-61\\-48.99585\\-148.8803\\-61\\-48.36438\\-146.9271\\-61\\-47.48732\\-144.974\\-61\\-45.98239\\-143.0209\\-61\\-43.24498\\-140.2451\\-61\\-41.29185\\-138.5574\\-61\\-39.33873\\-138.0671\\-61\\-37.3856\\-137.831\\-61\\-35.43248\\-137.7077\\-61\\-33.47935\\-137.7077\\-61\\-31.52623\\-137.8278\\-61\\-29.5731\\-138.0481\\-61\\-27.61998\\-138.4549\\-61\\-25.66685\\-139.7144\\-61\\-23.71373\\-140.2418\\-61\\-22.87996\\-141.0678\\-61\\-21.16826\\-143.0209\\-61\\-20.69566\\-144.974\\-61\\-20.01918\\-146.9271\\-61\\-18.98535\\-150.8334\\-61\\-18.60369\\-152.7865\\-61\\-16.86397\\-154.7396\\-61\\-16.08685\\-156.6928\\-61\\-17.85435\\-157.6738\\-61\\-19.80748\\-157.4983\\-61\\-20.91919\\-158.6459\\-61\\-21.52488\\-160.599\\-61\\-21.52488\\-162.5521\\-61\\-22.72372\\-164.5053\\-61\\-23.39891\\-166.4584\\-61\\-24.64072\\-168.4115\\-61\\-26.24163\\-170.3646\\-61\\-27.61998\\-172.2943\\-61\\-29.5731\\-173.6974\\-61\\-31.52623\\-174.9132\\-61\\-33.47935\\-175.1986\\-61\\-37.3856\\-175.1897\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "181" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-215.5795\\-61\\-37.3856\\-214.8996\\-61\\-39.33873\\-214.4772\\-61\\-41.29185\\-212.9664\\-61\\-42.44474\\-211.3803\\-61\\-43.68887\\-209.4271\\-61\\-44.36167\\-207.474\\-61\\-45.39754\\-205.5209\\-61\\-46.0315\\-203.5678\\-61\\-45.25555\\-201.6146\\-61\\-43.24498\\-200.5646\\-61\\-41.29185\\-200.8343\\-61\\-39.33873\\-202.5956\\-61\\-38.38377\\-203.5678\\-61\\-37.3856\\-204.8568\\-61\\-34.73739\\-207.474\\-61\\-33.92324\\-209.4271\\-61\\-33.47935\\-209.9617\\-61\\-31.09154\\-213.3334\\-61\\-31.52623\\-213.9037\\-61\\-33.47935\\-215.4481\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "182" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-23.71373\\-221.5727\\-61\\-24.18216\\-221.1459\\-61\\-24.54181\\-219.1928\\-61\\-24.6098\\-217.2396\\-61\\-24.4793\\-215.2865\\-61\\-24.52407\\-213.3334\\-61\\-23.71373\\-211.4905\\-61\\-22.92027\\-213.3334\\-61\\-22.49781\\-215.2865\\-61\\-21.7606\\-216.0166\\-61\\-21.10447\\-217.2396\\-61\\-20.86286\\-219.1928\\-61\\-21.7606\\-220.7816\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002332" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "183" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-195.0069\\-61\\53.05957\\-193.8021\\-61\\52.45815\\-191.8149\\-61\\54.17555\\-187.9428\\-61\\55.23944\\-185.9896\\-61\\56.11691\\-184.0365\\-61\\56.25589\\-182.0834\\-61\\56.93406\\-180.1303\\-61\\57.48114\\-178.1771\\-61\\59.14207\\-176.224\\-61\\59.85471\\-174.2709\\-61\\60.01156\\-172.3178\\-61\\60.93021\\-170.3646\\-61\\62.80618\\-168.4115\\-61\\63.64677\\-166.4584\\-61\\64.1769\\-165.8927\\-61\\66.13003\\-164.6407\\-61\\70.03628\\-164.6407\\-61\\71.9894\\-165.3403\\-61\\73.15832\\-166.4584\\-61\\74.51983\\-170.3646\\-61\\75.06605\\-172.3178\\-61\\75.46765\\-174.2709\\-61\\75.58083\\-176.224\\-61\\75.81488\\-178.1771\\-61\\75.82906\\-182.0834\\-61\\75.69621\\-184.0365\\-61\\74.7208\\-185.9896\\-61\\71.9894\\-188.8699\\-61\\68.08315\\-190.7841\\-61\\66.13003\\-192.7209\\-61\\64.1769\\-193.6667\\-61\\62.22377\\-193.9376\\-61\\60.27065\\-194.3672\\-61\\56.3644\\-195.5683\\-61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "184" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-210.5507\\-59\\-136.5067\\-209.4271\\-59\\-138.5876\\-207.474\\-59\\-140.9012\\-205.1264\\-59\\-141.8737\\-203.5678\\-59\\-142.0104\\-201.6146\\-59\\-142.027\\-199.6615\\-59\\-141.6536\\-197.7084\\-59\\-140.9012\\-196.88\\-59\\-138.9481\\-197.3807\\-59\\-136.995\\-199.1112\\-59\\-135.0419\\-201.2681\\-59\\-133.0887\\-201.6522\\-59\\-131.1356\\-203.2313\\-59\\-130.8651\\-203.5678\\-59\\-130.8101\\-207.474\\-59\\-129.8893\\-209.4271\\-59\\-131.1356\\-211.1492\\-59\\-133.0887\\-210.9094\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "185" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-208.5122\\-59\\-112.6179\\-207.474\\-59\\-113.1045\\-205.5209\\-59\\-113.1805\\-203.5678\\-59\\-114.2911\\-201.6146\\-59\\-115.0759\\-199.6615\\-59\\-115.3362\\-197.7084\\-59\\-114.4863\\-195.7553\\-59\\-112.5298\\-193.8021\\-59\\-113.433\\-191.849\\-59\\-115.5106\\-190.7578\\-59\\-117.4637\\-189.5089\\-59\\-119.4168\\-188.8539\\-59\\-120.2364\\-187.9428\\-59\\-119.9936\\-185.9896\\-59\\-119.4168\\-185.5403\\-59\\-117.4637\\-185.1927\\-59\\-115.5106\\-184.9526\\-59\\-113.5575\\-183.9033\\-59\\-111.6043\\-183.9601\\-59\\-110.202\\-185.9896\\-59\\-109.3364\\-187.9428\\-59\\-109.2742\\-189.8959\\-59\\-109.3473\\-191.849\\-59\\-108.8611\\-193.8021\\-59\\-107.9799\\-195.7553\\-59\\-106.8631\\-197.7084\\-59\\-105.1753\\-201.6146\\-59\\-105.0956\\-203.5678\\-59\\-105.2313\\-205.5209\\-59\\-106.7826\\-207.474\\-59\\-107.6981\\-208.4214\\-59\\-109.6512\\-208.8809\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "186" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-193.9242\\-59\\-64.72935\\-193.4766\\-59\\-68.73325\\-191.849\\-59\\-72.54185\\-190.45\\-59\\-74.49497\\-188.8944\\-59\\-75.40043\\-187.9428\\-59\\-77.04784\\-185.9896\\-59\\-77.4935\\-184.0365\\-59\\-78.13069\\-182.0834\\-59\\-78.14214\\-176.224\\-59\\-79.05056\\-174.2709\\-59\\-79.00096\\-172.3178\\-59\\-78.13069\\-170.3646\\-59\\-77.95734\\-168.4115\\-59\\-77.23978\\-166.4584\\-59\\-76.4481\\-165.6628\\-59\\-74.49497\\-164.8518\\-59\\-72.54185\\-164.6407\\-59\\-70.58872\\-164.6273\\-59\\-68.6356\\-165.5319\\-59\\-65.85463\\-168.4115\\-59\\-64.05327\\-170.3646\\-59\\-63.37089\\-172.3178\\-59\\-62.26254\\-174.2709\\-59\\-61.74464\\-176.224\\-59\\-60.33482\\-178.1771\\-59\\-59.78285\\-180.1303\\-59\\-58.48304\\-182.0834\\-59\\-57.80425\\-184.0365\\-59\\-56.11235\\-185.9896\\-59\\-55.61985\\-187.9428\\-59\\-54.21898\\-189.8959\\-59\\-54.29005\\-191.849\\-59\\-54.96373\\-192.6463\\-59\\-56.91685\\-193.6801\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "187" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-174.393\\-59\\-39.33873\\-173.5712\\-59\\-43.24498\\-170.9994\\-59\\-44.00669\\-170.3646\\-59\\-45.79081\\-168.4115\\-59\\-47.18998\\-166.4584\\-59\\-49.64565\\-162.5521\\-59\\-50.30957\\-160.599\\-59\\-50.87048\\-158.6459\\-59\\-51.20861\\-156.6928\\-59\\-53.0106\\-155.8919\\-59\\-54.96373\\-157.7391\\-59\\-56.64103\\-156.6928\\-59\\-55.73209\\-154.7396\\-59\\-54.96373\\-153.9345\\-59\\-53.0106\\-153.1384\\-59\\-51.05748\\-151.692\\-59\\-50.36968\\-150.8334\\-59\\-49.10435\\-147.6386\\-59\\-47.89891\\-144.974\\-59\\-45.1981\\-141.4942\\-59\\-42.75381\\-139.1146\\-59\\-41.29185\\-138.0542\\-59\\-39.33873\\-137.804\\-59\\-37.3856\\-136.5122\\-59\\-35.43248\\-136.1602\\-59\\-33.47935\\-136.1602\\-59\\-31.52623\\-136.6472\\-59\\-29.5731\\-137.8757\\-59\\-27.61998\\-138.0357\\-59\\-25.66685\\-138.4346\\-59\\-23.71373\\-139.9702\\-59\\-22.46759\\-141.0678\\-59\\-20.87084\\-143.0209\\-59\\-19.80748\\-145.0895\\-59\\-19.00135\\-146.9271\\-59\\-18.6689\\-150.8334\\-59\\-17.21932\\-152.7865\\-59\\-16.66077\\-154.7396\\-59\\-16.37376\\-156.6928\\-59\\-17.85435\\-157.4137\\-59\\-19.80748\\-157.5443\\-59\\-20.77979\\-158.6459\\-59\\-21.38357\\-160.599\\-59\\-21.52488\\-162.5521\\-59\\-22.72372\\-164.5053\\-59\\-23.53934\\-166.4584\\-59\\-24.70992\\-168.4115\\-59\\-27.61998\\-171.4285\\-59\\-29.5731\\-172.9459\\-59\\-31.52623\\-173.6109\\-59\\-33.47935\\-174.393\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "188" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-215.557\\-59\\-37.3856\\-214.482\\-59\\-39.33873\\-213.7588\\-59\\-41.29185\\-212.2712\\-59\\-42.16484\\-211.3803\\-59\\-43.80222\\-207.474\\-59\\-44.28257\\-205.5209\\-59\\-44.20285\\-203.5678\\-59\\-43.24498\\-202.2593\\-59\\-41.29185\\-202.282\\-59\\-39.33873\\-204.9941\\-59\\-37.3856\\-207.0719\\-59\\-35.06138\\-209.4271\\-59\\-33.47935\\-211.3564\\-59\\-31.65593\\-213.3334\\-59\\-33.1634\\-215.2865\\-59\\-33.47935\\-215.5103\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "189" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-222.3654\\-59\\-19.80748\\-219.9523\\-59\\-21.21487\\-219.1928\\-59\\-21.7606\\-218.5301\\-59\\-22.40201\\-217.2396\\-59\\-21.7606\\-216.5663\\-59\\-20.3343\\-217.2396\\-59\\-19.80748\\-217.6656\\-59\\-19.0675\\-219.1928\\-59\\-17.85435\\-220.1495\\-59\\-16.87779\\-221.1459\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "190" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-11.99498\\-231.8804\\-59\\-14.91694\\-228.9584\\-59\\-12.96382\\-227.0053\\-59\\-12.96382\\-225.0521\\-59\\-11.99498\\-224.0833\\-59\\-10.04185\\-224.0833\\-59\\-7.119884\\-227.0053\\-59\\-9.073009\\-228.9584\\-59\\-9.073009\\-230.9115\\-59\\-10.04185\\-231.8804\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002331" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "191" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-194.655\\-59\\54.41127\\-193.7432\\-59\\53.42152\\-191.849\\-59\\53.72223\\-189.8959\\-59\\54.41127\\-188.0106\\-59\\56.25589\\-184.0365\\-59\\56.25589\\-182.0834\\-59\\56.51301\\-180.1303\\-59\\57.34096\\-178.1771\\-59\\58.90239\\-176.224\\-59\\59.3246\\-174.2709\\-59\\59.87392\\-172.3178\\-59\\60.20406\\-170.3646\\-59\\61.46481\\-168.4115\\-59\\62.22377\\-167.7098\\-59\\64.1769\\-165.5836\\-59\\66.13003\\-164.6407\\-59\\68.08315\\-164.4387\\-59\\70.03628\\-164.4825\\-59\\71.9894\\-164.8092\\-59\\73.596\\-166.4584\\-59\\74.45621\\-168.4115\\-59\\75.08105\\-170.3646\\-59\\75.58083\\-172.3178\\-59\\75.82906\\-176.224\\-59\\76.44977\\-178.1771\\-59\\76.44977\\-180.1303\\-59\\75.70865\\-182.0834\\-59\\75.0711\\-184.0365\\-59\\73.48476\\-185.9896\\-59\\72.35638\\-187.9428\\-59\\71.9894\\-188.3696\\-59\\69.67355\\-189.8959\\-59\\68.08315\\-190.7702\\-59\\66.13003\\-192.2864\\-59\\62.22377\\-193.5783\\-59\\60.27065\\-193.7794\\-59\\58.31752\\-194.3323\\-59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "192" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-133.0887\\-211.9092\\-57\\-135.0419\\-210.8749\\-57\\-136.995\\-210.166\\-57\\-138.9481\\-208.6972\\-57\\-140.9012\\-206.9713\\-57\\-141.9532\\-205.5209\\-57\\-142.2188\\-203.5678\\-57\\-143.4291\\-201.6146\\-57\\-143.8433\\-199.6615\\-57\\-143.2487\\-197.7084\\-57\\-141.9858\\-195.7553\\-57\\-141.8613\\-193.8021\\-57\\-141.5331\\-191.849\\-57\\-139.8363\\-189.8959\\-57\\-138.9481\\-189.0502\\-57\\-136.995\\-189.5729\\-57\\-136.7132\\-189.8959\\-57\\-137.7153\\-191.849\\-57\\-139.0207\\-193.8021\\-57\\-138.5238\\-195.7553\\-57\\-137.4297\\-197.7084\\-57\\-136.5696\\-199.6615\\-57\\-135.0419\\-201.4402\\-57\\-133.0887\\-201.5339\\-57\\-131.1356\\-202.4664\\-57\\-130.2049\\-203.5678\\-57\\-130.2901\\-205.5209\\-57\\-130.6917\\-207.474\\-57\\-129.8893\\-209.4271\\-57\\-129.3593\\-211.3803\\-57\\-131.1356\\-212.3873\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "193" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-207.8464\\-57\\-111.9404\\-207.474\\-57\\-112.6306\\-205.5209\\-57\\-113.1705\\-203.5678\\-57\\-114.0194\\-201.6146\\-57\\-115.2176\\-197.7084\\-57\\-114.7207\\-195.7553\\-57\\-113.5575\\-193.8568\\-57\\-114.0943\\-191.849\\-57\\-116.2735\\-189.8959\\-57\\-116.9594\\-187.9428\\-57\\-113.5575\\-185.6126\\-57\\-111.6043\\-186.1474\\-57\\-110.2068\\-187.9428\\-57\\-109.3473\\-189.8959\\-57\\-109.1982\\-191.849\\-57\\-108.4826\\-193.8021\\-57\\-106.8947\\-195.7553\\-57\\-105.9807\\-197.7084\\-57\\-104.8865\\-199.6615\\-57\\-104.6564\\-201.6146\\-57\\-104.6654\\-203.5678\\-57\\-104.941\\-205.5209\\-57\\-106.6504\\-207.474\\-57\\-107.6981\\-208.5217\\-57\\-109.6512\\-208.9475\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "194" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-66.68247\\-192.265\\-57\\-70.58872\\-190.7634\\-57\\-72.54185\\-189.7089\\-57\\-74.49497\\-188.8446\\-57\\-75.36571\\-187.9428\\-57\\-76.47081\\-185.9896\\-57\\-77.34399\\-184.0365\\-57\\-78.1194\\-182.0834\\-57\\-78.14214\\-176.224\\-57\\-79.20678\\-174.2709\\-57\\-79.16853\\-172.3178\\-57\\-78.14214\\-170.3646\\-57\\-78.1194\\-168.4115\\-57\\-77.57001\\-166.4584\\-57\\-76.4481\\-165.2931\\-57\\-74.49497\\-164.6539\\-57\\-70.58872\\-164.4387\\-57\\-68.6356\\-165.4673\\-57\\-64.72935\\-169.3261\\-57\\-63.77649\\-170.3646\\-57\\-62.50569\\-172.3178\\-57\\-61.47931\\-176.224\\-57\\-60.43616\\-178.1771\\-57\\-59.79536\\-180.1303\\-57\\-58.63425\\-182.0834\\-57\\-57.83081\\-184.0365\\-57\\-55.8323\\-187.9428\\-57\\-54.97136\\-189.8959\\-57\\-55.83376\\-191.849\\-57\\-56.91685\\-192.692\\-57\\-58.86998\\-193.0844\\-57\\-60.8231\\-193.5904\\-57\\-62.77623\\-193.0551\\-57\\-64.72935\\-192.7195\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "195" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-173.1018\\-57\\-39.08441\\-172.3178\\-57\\-43.24498\\-169.6426\\-57\\-46.21432\\-166.4584\\-57\\-47.65395\\-164.5053\\-57\\-48.46881\\-162.5521\\-57\\-49.65056\\-160.599\\-57\\-50.32877\\-158.6459\\-57\\-50.88309\\-156.6928\\-57\\-51.05748\\-156.4786\\-57\\-53.0106\\-155.855\\-57\\-54.96373\\-157.6985\\-57\\-55.98468\\-156.6928\\-57\\-55.47741\\-154.7396\\-57\\-53.0106\\-152.3706\\-57\\-51.05748\\-150.4149\\-57\\-49.85114\\-148.8803\\-57\\-47.96167\\-144.974\\-57\\-46.70733\\-143.0209\\-57\\-45.89492\\-141.0678\\-57\\-43.24498\\-138.3847\\-57\\-41.29185\\-137.8819\\-57\\-39.33873\\-136.6819\\-57\\-37.3856\\-136.0562\\-57\\-35.43248\\-135.9348\\-57\\-33.47935\\-135.9348\\-57\\-31.52623\\-136.2604\\-57\\-29.5731\\-137.6997\\-57\\-25.66685\\-138.0366\\-57\\-23.71373\\-138.6149\\-57\\-21.13207\\-141.0678\\-57\\-20.57646\\-143.0209\\-57\\-19.05372\\-144.974\\-57\\-18.70448\\-146.9271\\-57\\-18.23138\\-148.8803\\-57\\-17.94909\\-150.8334\\-57\\-16.88687\\-152.7865\\-57\\-16.23353\\-154.7396\\-57\\-17.85435\\-155.9745\\-57\\-19.34602\\-156.6928\\-57\\-19.80748\\-157.2049\\-57\\-20.43937\\-158.6459\\-57\\-20.89491\\-160.599\\-57\\-21.67983\\-162.5521\\-57\\-22.76392\\-164.5053\\-57\\-24.35952\\-166.4584\\-57\\-25.66685\\-168.2596\\-57\\-27.77652\\-170.3646\\-57\\-29.5731\\-171.7172\\-57\\-31.52623\\-172.806\\-57\\-33.47935\\-173.1794\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "196" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-11.99498\\-231.8881\\-57\\-12.97154\\-230.9115\\-57\\-12.95598\\-228.9584\\-57\\-11.00285\\-227.0053\\-57\\-11.00285\\-225.0521\\-57\\-12.97154\\-223.099\\-57\\-11.99498\\-222.1225\\-57\\-7.127726\\-227.0053\\-57\\-7.127726\\-228.9584\\-57\\-10.04185\\-231.8725\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002330" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "197" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-192.1346\\-57\\54.19957\\-191.849\\-57\\54.18748\\-189.8959\\-57\\54.98734\\-187.9428\\-57\\55.68832\\-185.9896\\-57\\56.25589\\-184.0365\\-57\\56.25589\\-182.0834\\-57\\57.0339\\-180.1303\\-57\\57.5925\\-178.1771\\-57\\58.94606\\-174.2709\\-57\\59.39807\\-172.3178\\-57\\60.02316\\-170.3646\\-57\\61.25656\\-168.4115\\-57\\64.1769\\-165.4953\\-57\\66.13003\\-164.4387\\-57\\68.08315\\-163.6944\\-57\\70.03628\\-163.8628\\-57\\71.9894\\-164.8308\\-57\\73.5857\\-166.4584\\-57\\74.67495\\-168.4115\\-57\\75.58083\\-170.3646\\-57\\75.70865\\-172.3178\\-57\\75.70865\\-174.2709\\-57\\76.39249\\-176.224\\-57\\76.67413\\-178.1771\\-57\\76.32102\\-180.1303\\-57\\75.69621\\-182.0834\\-57\\74.82825\\-184.0365\\-57\\72.92631\\-185.9896\\-57\\71.78996\\-187.9428\\-57\\70.03628\\-189.7473\\-57\\68.08315\\-190.8575\\-57\\66.13003\\-191.7405\\-57\\64.1769\\-192.2508\\-57\\62.22377\\-193.0542\\-57\\60.27065\\-193.6801\\-57\\56.3644\\-193.7945\\-57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "198" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-211.7721\\-55\\-136.995\\-210.6419\\-55\\-138.9481\\-210.4731\\-55\\-140.9012\\-208.9244\\-55\\-143.3514\\-205.5209\\-55\\-143.9109\\-203.5678\\-55\\-144.2455\\-199.6615\\-55\\-144.0126\\-197.7084\\-55\\-143.3855\\-195.7553\\-55\\-142.1279\\-193.8021\\-55\\-141.9487\\-191.849\\-55\\-140.9826\\-189.8959\\-55\\-138.9481\\-188.5815\\-55\\-136.995\\-189.4312\\-55\\-136.628\\-189.8959\\-55\\-137.4297\\-191.849\\-55\\-137.7392\\-193.8021\\-55\\-137.4833\\-195.7553\\-55\\-136.8595\\-197.7084\\-55\\-136.8206\\-199.6615\\-55\\-135.0419\\-201.3328\\-55\\-133.0887\\-201.3328\\-55\\-131.1356\\-202.1366\\-55\\-129.1443\\-203.5678\\-55\\-129.4182\\-205.5209\\-55\\-130.3496\\-207.474\\-55\\-129.8893\\-209.4271\\-55\\-128.2376\\-211.3803\\-55\\-129.1825\\-212.4937\\-55\\-131.1356\\-212.8365\\-55\\-133.0887\\-212.5855\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "199" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-109.6512\\-208.9475\\-55\\-111.3686\\-207.474\\-55\\-111.9509\\-205.5209\\-55\\-112.6709\\-203.5678\\-55\\-114.1099\\-201.6146\\-55\\-114.8138\\-199.6615\\-55\\-115.2288\\-197.7084\\-55\\-115.1436\\-195.7553\\-55\\-114.3043\\-193.8021\\-55\\-114.2643\\-191.849\\-55\\-114.6088\\-189.8959\\-55\\-113.5575\\-187.9701\\-55\\-111.6043\\-188.1116\\-55\\-109.6512\\-190.4975\\-55\\-107.7057\\-193.8021\\-55\\-106.4648\\-195.7553\\-55\\-104.8693\\-197.7084\\-55\\-103.2836\\-201.6146\\-55\\-103.348\\-203.5678\\-55\\-104.7596\\-205.5209\\-55\\-105.932\\-207.474\\-55\\-107.6981\\-208.7129\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "200" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-64.72935\\-191.8566\\-55\\-66.68247\\-191.7405\\-55\\-68.6356\\-191.1536\\-55\\-74.49497\\-188.8446\\-55\\-75.36571\\-187.9428\\-55\\-77.33002\\-184.0365\\-55\\-78.1194\\-182.0834\\-55\\-78.14214\\-176.224\\-55\\-79.00096\\-174.2709\\-55\\-78.94744\\-172.3178\\-55\\-78.33464\\-170.3646\\-55\\-78.26579\\-168.4115\\-55\\-77.85993\\-166.4584\\-55\\-76.4481\\-164.961\\-55\\-74.49497\\-164.6407\\-55\\-72.54185\\-163.8838\\-55\\-70.58872\\-163.7176\\-55\\-68.6356\\-165.1108\\-55\\-66.68247\\-166.1635\\-55\\-64.42538\\-168.4115\\-55\\-63.29897\\-170.3646\\-55\\-62.36028\\-172.3178\\-55\\-61.80431\\-174.2709\\-55\\-60.6114\\-176.224\\-55\\-60.44608\\-178.1771\\-55\\-59.82948\\-180.1303\\-55\\-58.83242\\-182.0834\\-55\\-58.02214\\-184.0365\\-55\\-57.6706\\-185.9896\\-55\\-55.94029\\-187.9428\\-55\\-55.7153\\-189.8959\\-55\\-56.91685\\-191.228\\-55\\-58.86998\\-192.4141\\-55\\-60.8231\\-193.0672\\-55\\-62.77623\\-192.7284\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "201" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-171.2701\\-55\\-39.33873\\-170.2398\\-55\\-41.29185\\-169.3176\\-55\\-43.24498\\-168.1295\\-55\\-45.1981\\-166.0771\\-55\\-46.39963\\-164.5053\\-55\\-48.1137\\-162.5521\\-55\\-49.10435\\-160.1422\\-55\\-50.33656\\-156.6928\\-55\\-51.05748\\-155.8731\\-55\\-53.0106\\-155.855\\-55\\-54.96373\\-157.5639\\-55\\-55.75813\\-156.6928\\-55\\-55.07223\\-154.7396\\-55\\-53.77135\\-152.7865\\-55\\-49.90144\\-148.8803\\-55\\-48.86863\\-146.9271\\-55\\-47.96753\\-144.974\\-55\\-46.8047\\-143.0209\\-55\\-46.0111\\-141.0678\\-55\\-43.24498\\-138.2742\\-55\\-41.29185\\-137.6997\\-55\\-39.33873\\-136.2556\\-55\\-37.3856\\-135.9287\\-55\\-33.47935\\-135.8645\\-55\\-31.52623\\-136.0033\\-55\\-29.5731\\-136.5712\\-55\\-27.61998\\-137.6997\\-55\\-25.66685\\-137.8757\\-55\\-23.71373\\-138.2636\\-55\\-20.91425\\-141.0678\\-55\\-19.96906\\-143.0209\\-55\\-18.90974\\-144.974\\-55\\-18.15831\\-146.9271\\-55\\-17.75961\\-148.8803\\-55\\-17.06633\\-150.8334\\-55\\-16.59027\\-152.7865\\-55\\-16.24263\\-154.7396\\-55\\-19.68438\\-156.6928\\-55\\-20.03127\\-158.6459\\-55\\-20.85379\\-160.599\\-55\\-22.49791\\-162.5521\\-55\\-23.0576\\-164.5053\\-55\\-24.7002\\-166.4584\\-55\\-27.61998\\-169.4426\\-55\\-29.5731\\-170.8355\\-55\\-33.47935\\-171.7261\\-55\\-35.43248\\-171.713\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "202" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-25.66685\\-222.1225\\-55\\-26.64341\\-221.1459\\-55\\-26.59939\\-217.2396\\-55\\-25.66685\\-216.3071\\-55\\-23.71373\\-216.3071\\-55\\-20.74001\\-219.1928\\-55\\-20.74001\\-221.1459\\-55\\-21.7606\\-222.1665\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002329" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "203" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-193.1212\\-55\\55.10583\\-191.849\\-55\\54.61071\\-189.8959\\-55\\55.29066\\-187.9428\\-55\\56.1406\\-185.9896\\-55\\56.37203\\-182.0834\\-55\\57.25096\\-180.1303\\-55\\58.02456\\-178.1771\\-55\\58.15593\\-176.224\\-55\\58.10582\\-174.2709\\-55\\59.18838\\-172.3178\\-55\\60.01156\\-170.3646\\-55\\61.16964\\-168.4115\\-55\\62.22377\\-166.9561\\-55\\64.1769\\-165.1041\\-55\\66.13003\\-163.6855\\-55\\68.08315\\-163.4792\\-55\\70.03628\\-163.7728\\-55\\73.06748\\-166.4584\\-55\\74.7248\\-168.4115\\-55\\75.68394\\-170.3646\\-55\\75.70865\\-172.3178\\-55\\75.84347\\-174.2709\\-55\\76.39249\\-176.224\\-55\\76.36649\\-178.1771\\-55\\75.81488\\-180.1303\\-55\\75.69621\\-182.0834\\-55\\74.79071\\-184.0365\\-55\\72.92245\\-185.9896\\-55\\71.9894\\-187.7348\\-55\\70.67695\\-189.8959\\-55\\70.03628\\-190.4707\\-55\\68.08315\\-191.2347\\-55\\66.13003\\-191.6373\\-55\\64.1769\\-191.2171\\-55\\60.27065\\-193.543\\-55\\58.31752\\-193.6936\\-55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "204" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-212.2074\\-53\\-136.995\\-211.1097\\-53\\-138.9481\\-211.0442\\-53\\-140.9012\\-210.745\\-53\\-142.0854\\-209.4271\\-53\\-143.3547\\-207.474\\-53\\-144.0995\\-205.5209\\-53\\-145.1816\\-203.5678\\-53\\-145.8219\\-201.6146\\-53\\-145.8672\\-199.6615\\-53\\-145.2313\\-197.7084\\-53\\-143.9711\\-195.7553\\-53\\-143.4674\\-193.8021\\-53\\-142.2258\\-191.849\\-53\\-141.6968\\-189.8959\\-53\\-140.9012\\-189.123\\-53\\-138.9481\\-188.0521\\-53\\-136.9142\\-189.8959\\-53\\-137.1447\\-193.8021\\-53\\-137.0325\\-195.7553\\-53\\-137.6545\\-197.7084\\-53\\-137.9715\\-199.6615\\-53\\-136.995\\-200.9616\\-53\\-135.0419\\-200.9085\\-53\\-133.0887\\-200.6605\\-53\\-131.1356\\-201.2935\\-53\\-129.1825\\-202.1144\\-53\\-128.0279\\-203.5678\\-53\\-128.4525\\-205.5209\\-53\\-130.1544\\-207.474\\-53\\-129.8316\\-209.4271\\-53\\-129.1825\\-210.0801\\-53\\-127.2293\\-210.9375\\-53\\-125.2762\\-210.9402\\-53\\-123.3231\\-210.6441\\-53\\-121.37\\-210.7017\\-53\\-120.6958\\-211.3803\\-53\\-121.37\\-212.0135\\-53\\-123.3231\\-212.4358\\-53\\-125.2762\\-212.3061\\-53\\-127.2293\\-212.3061\\-53\\-129.1825\\-212.8811\\-53\\-133.0887\\-212.9869\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "205" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-109.6512\\-208.9475\\-53\\-111.3806\\-207.474\\-53\\-111.6271\\-205.5209\\-53\\-112.5428\\-203.5678\\-53\\-113.5575\\-202.4956\\-53\\-114.6672\\-201.6146\\-53\\-116.0944\\-199.6615\\-53\\-115.5632\\-197.7084\\-53\\-115.503\\-195.7553\\-53\\-114.4487\\-193.8021\\-53\\-113.5575\\-191.3711\\-53\\-112.7871\\-189.8959\\-53\\-111.6043\\-189.311\\-53\\-109.6512\\-190.7088\\-53\\-107.6981\\-192.7965\\-53\\-105.745\\-195.1208\\-53\\-105.1141\\-195.7553\\-53\\-102.872\\-199.6615\\-53\\-102.7245\\-201.6146\\-53\\-102.9021\\-203.5678\\-53\\-104.9426\\-207.474\\-53\\-105.745\\-208.3641\\-53\\-107.6981\\-208.9052\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "206" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-192.2058\\-53\\-64.72935\\-191.6496\\-53\\-66.68247\\-191.6496\\-53\\-68.6356\\-191.2871\\-53\\-70.58872\\-190.6373\\-53\\-74.49497\\-188.8446\\-53\\-75.36571\\-187.9428\\-53\\-77.33002\\-184.0365\\-53\\-78.1194\\-182.0834\\-53\\-78.15374\\-176.224\\-53\\-78.26579\\-174.2709\\-53\\-78.25262\\-172.3178\\-53\\-79.1396\\-170.3646\\-53\\-79.02975\\-168.4115\\-53\\-77.45142\\-166.4584\\-53\\-76.4481\\-165.4411\\-53\\-72.54185\\-163.665\\-53\\-70.58872\\-163.3898\\-53\\-68.6356\\-163.7537\\-53\\-66.68247\\-165.5366\\-53\\-63.89027\\-168.4115\\-53\\-62.48326\\-170.3646\\-53\\-62.27091\\-172.3178\\-53\\-61.73804\\-174.2709\\-53\\-60.46628\\-176.224\\-53\\-60.45611\\-178.1771\\-53\\-59.65215\\-182.0834\\-53\\-58.53389\\-184.0365\\-53\\-57.98806\\-185.9896\\-53\\-57.23586\\-187.9428\\-53\\-56.19908\\-189.8959\\-53\\-56.91685\\-190.7403\\-53\\-58.86998\\-191.7543\\-53\\-60.8231\\-192.371\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "207" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-170.7806\\-53\\-37.3856\\-169.6648\\-53\\-39.33873\\-168.8998\\-53\\-41.29185\\-167.7045\\-53\\-43.07736\\-166.4584\\-53\\-45.1981\\-164.2936\\-53\\-47.15123\\-162.2086\\-53\\-48.34203\\-160.599\\-53\\-48.90491\\-158.6459\\-53\\-49.59263\\-156.6928\\-53\\-51.05748\\-155.3539\\-53\\-53.0106\\-155.8491\\-53\\-54.96373\\-157.2903\\-53\\-55.51415\\-156.6928\\-53\\-54.95477\\-154.7396\\-53\\-53.8034\\-152.7865\\-53\\-49.90144\\-148.8803\\-53\\-48.86863\\-146.9271\\-53\\-47.96753\\-144.974\\-53\\-46.8047\\-143.0209\\-53\\-46.0111\\-141.0678\\-53\\-43.24498\\-138.2702\\-53\\-41.29185\\-136.6617\\-53\\-39.33873\\-136.0139\\-53\\-37.3856\\-135.8577\\-53\\-31.52623\\-135.8974\\-53\\-29.5731\\-136.0192\\-53\\-27.61998\\-136.5559\\-53\\-25.66685\\-137.7156\\-53\\-23.71373\\-138.2011\\-53\\-20.86933\\-141.0678\\-53\\-19.64589\\-143.0209\\-53\\-18.85291\\-144.974\\-53\\-17.12565\\-148.8803\\-53\\-16.59027\\-150.8334\\-53\\-15.9091\\-152.7865\\-53\\-18.06577\\-154.7396\\-53\\-19.80748\\-156.8503\\-53\\-20.60268\\-158.6459\\-53\\-21.0464\\-160.599\\-53\\-22.77823\\-162.5521\\-53\\-23.71373\\-163.7438\\-53\\-25.66685\\-166.0102\\-53\\-28.16072\\-168.4115\\-53\\-29.5731\\-169.2493\\-53\\-31.52623\\-169.7077\\-53\\-33.47935\\-170.7806\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "208" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-23.71373\\-224.0756\\-53\\-26.57366\\-221.1459\\-53\\-23.71373\\-218.2162\\-53\\-19.80748\\-218.2162\\-53\\-16.80803\\-221.1459\\-53\\-16.80803\\-223.099\\-53\\-17.85435\\-224.1453\\-53\\-21.7606\\-224.1453\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002328" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "209" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-192.6763\\-53\\55.6949\\-191.849\\-53\\55.41756\\-189.8959\\-53\\55.70827\\-187.9428\\-53\\56.25589\\-185.9896\\-53\\56.38711\\-184.0365\\-53\\57.62789\\-180.1303\\-53\\58.15593\\-178.1771\\-53\\58.15593\\-176.224\\-53\\57.45399\\-174.2709\\-53\\57.55581\\-172.3178\\-53\\59.70627\\-170.3646\\-53\\60.74149\\-168.4115\\-53\\61.29929\\-166.4584\\-53\\62.22377\\-165.4679\\-53\\64.1769\\-163.7901\\-53\\66.13003\\-163.3757\\-53\\68.08315\\-163.5503\\-53\\70.03628\\-164.2462\\-53\\71.9894\\-165.7525\\-53\\74.67361\\-168.4115\\-53\\75.68394\\-170.3646\\-53\\75.82906\\-172.3178\\-53\\76.53417\\-174.2709\\-53\\76.62685\\-176.224\\-53\\75.94783\\-178.1771\\-53\\75.70865\\-180.1303\\-53\\75.69621\\-182.0834\\-53\\74.85429\\-184.0365\\-53\\73.3884\\-185.9896\\-53\\72.60182\\-187.9428\\-53\\71.0018\\-189.8959\\-53\\70.03628\\-190.8001\\-53\\68.08315\\-191.5235\\-53\\66.13003\\-191.6252\\-53\\64.1769\\-191.0073\\-53\\62.22377\\-190.96\\-53\\60.27065\\-193.0219\\-53\\58.31752\\-193.6667\\-53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "210" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-213.4621\\-51\\-136.995\\-212.6192\\-51\\-140.9012\\-212.5855\\-51\\-142.8544\\-210.9456\\-51\\-143.9466\\-209.4271\\-51\\-144.4405\\-207.474\\-51\\-145.8763\\-205.5209\\-51\\-146.0845\\-201.6146\\-51\\-146.0845\\-199.6615\\-51\\-145.6966\\-197.7084\\-51\\-144.186\\-195.7553\\-51\\-143.9711\\-193.8021\\-51\\-143.3656\\-191.849\\-51\\-140.9012\\-189.2783\\-51\\-138.9481\\-188.8579\\-51\\-138.1103\\-189.8959\\-51\\-137.9847\\-195.7553\\-51\\-138.0536\\-197.7084\\-51\\-139.2842\\-199.6615\\-51\\-138.3048\\-201.6146\\-51\\-136.995\\-202.3931\\-51\\-135.7056\\-201.6146\\-51\\-135.0419\\-200.9509\\-51\\-133.0887\\-200.1668\\-51\\-129.1825\\-200.6931\\-51\\-128.2108\\-201.6146\\-51\\-127.9027\\-203.5678\\-51\\-128.5331\\-205.5209\\-51\\-130.037\\-207.474\\-51\\-129.1825\\-209.2729\\-51\\-127.2293\\-210.1714\\-51\\-125.2762\\-210.2166\\-51\\-123.3231\\-209.898\\-51\\-121.37\\-209.1123\\-51\\-119.0275\\-211.3803\\-51\\-119.4168\\-211.8535\\-51\\-121.37\\-212.9973\\-51\\-123.3231\\-213.1339\\-51\\-131.1356\\-213.198\\-51\\-133.0887\\-214.0516\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "211" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-208.052\\-51\\-112.1131\\-207.474\\-51\\-112.6101\\-205.5209\\-51\\-113.6607\\-203.5678\\-51\\-115.5106\\-202.5954\\-51\\-116.549\\-201.6146\\-51\\-116.6635\\-199.6615\\-51\\-116.5232\\-195.7553\\-51\\-115.5106\\-194.3557\\-51\\-113.5575\\-192.8479\\-51\\-111.6043\\-190.7035\\-51\\-109.6512\\-190.7993\\-51\\-108.4898\\-191.849\\-51\\-105.745\\-194.529\\-51\\-103.7918\\-196.5691\\-51\\-102.9171\\-197.7084\\-51\\-101.404\\-201.6146\\-51\\-102.2257\\-203.5678\\-51\\-102.8901\\-205.5209\\-51\\-105.745\\-208.4792\\-51\\-107.6981\\-208.9652\\-51\\-109.6512\\-209.0806\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "212" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-191.8566\\-51\\-62.77623\\-191.7136\\-51\\-68.6356\\-191.5785\\-51\\-70.58872\\-191.2276\\-51\\-72.54185\\-190.5129\\-51\\-74.49497\\-188.8896\\-51\\-75.45644\\-187.9428\\-51\\-76.59671\\-185.9896\\-51\\-78.1194\\-182.0834\\-51\\-78.14214\\-180.1303\\-51\\-78.42393\\-176.224\\-51\\-78.14214\\-172.3178\\-51\\-79.26781\\-170.3646\\-51\\-79.18523\\-168.4115\\-51\\-76.4481\\-165.6338\\-51\\-74.49497\\-163.9279\\-51\\-70.58872\\-162.909\\-51\\-68.6356\\-163.3583\\-51\\-66.68247\\-164.0893\\-51\\-66.26395\\-164.5053\\-51\\-65.10349\\-166.4584\\-51\\-64.72935\\-166.905\\-51\\-62.77623\\-169.908\\-51\\-62.3795\\-170.3646\\-51\\-61.94886\\-172.3178\\-51\\-61.33678\\-174.2709\\-51\\-60.46628\\-176.224\\-51\\-60.46628\\-178.1771\\-51\\-60.36113\\-180.1303\\-51\\-59.79667\\-182.0834\\-51\\-58.67054\\-184.0365\\-51\\-58.54446\\-185.9896\\-51\\-57.81436\\-187.9428\\-51\\-56.91685\\-189.9428\\-51\\-58.86998\\-191.7968\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "213" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-169.2139\\-51\\-37.3856\\-168.0648\\-51\\-39.33873\\-167.3146\\-51\\-41.29185\\-166.9552\\-51\\-43.24498\\-165.5245\\-51\\-46.20753\\-162.5521\\-51\\-47.51822\\-160.599\\-51\\-48.3465\\-158.6459\\-51\\-48.79212\\-156.6928\\-51\\-49.10435\\-155.9403\\-51\\-50.15067\\-154.7396\\-51\\-51.05748\\-154.3353\\-51\\-53.0106\\-155.8833\\-51\\-54.76361\\-154.7396\\-51\\-53.75236\\-152.7865\\-51\\-49.90144\\-148.8803\\-51\\-48.77669\\-146.9271\\-51\\-47.90443\\-144.974\\-51\\-46.8047\\-143.0209\\-51\\-46.0111\\-141.0678\\-51\\-43.24498\\-138.1816\\-51\\-41.29185\\-136.2768\\-51\\-39.33873\\-135.7466\\-51\\-37.3856\\-135.6614\\-51\\-31.52623\\-135.6614\\-51\\-27.61998\\-136.0139\\-51\\-25.66685\\-136.5932\\-51\\-23.71373\\-138.0176\\-51\\-21.7606\\-138.8197\\-51\\-21.46763\\-139.1146\\-51\\-20.54351\\-141.0678\\-51\\-19.0253\\-143.0209\\-51\\-18.55331\\-144.974\\-51\\-17.94909\\-146.9271\\-51\\-16.94127\\-148.8803\\-51\\-15.23051\\-150.8334\\-51\\-14.79014\\-152.7865\\-51\\-15.90123\\-154.1915\\-51\\-17.85435\\-153.4819\\-51\\-19.55999\\-154.7396\\-51\\-19.87406\\-156.6928\\-51\\-20.78404\\-158.6459\\-51\\-22.47309\\-160.599\\-51\\-23.71373\\-162.2201\\-51\\-28.10038\\-166.4584\\-51\\-29.5731\\-167.3449\\-51\\-31.52623\\-167.9436\\-51\\-32.06964\\-168.4115\\-51\\-33.47935\\-169.2245\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "5" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "214" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-27.61998\\-229.8381\\-51\\-28.49972\\-228.9584\\-51\\-28.49972\\-225.0521\\-51\\-27.61998\\-224.1724\\-51\\-24.7871\\-227.0053\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "215" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-19.80748\\-227.9818\\-51\\-24.69029\\-223.099\\-51\\-24.59347\\-219.1928\\-51\\-23.71373\\-218.313\\-51\\-19.80748\\-218.2162\\-51\\-17.85435\\-220.1693\\-51\\-15.90123\\-220.1693\\-51\\-12.87472\\-223.099\\-51\\-12.87472\\-225.0521\\-51\\-15.90123\\-228.0786\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002327" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "216" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.1774\\-191.849\\-51\\56.08257\\-189.8959\\-51\\56.28363\\-185.9896\\-51\\57.00687\\-184.0365\\-51\\58.05844\\-180.1303\\-51\\58.15593\\-176.224\\-51\\57.13308\\-172.3178\\-51\\57.65618\\-170.3646\\-51\\59.43569\\-168.4115\\-51\\60.83258\\-166.4584\\-51\\61.63674\\-164.5053\\-51\\62.22377\\-163.9279\\-51\\64.1769\\-163.3614\\-51\\66.13003\\-163.0434\\-51\\70.03628\\-165.8811\\-51\\71.9894\\-167.241\\-51\\73.94253\\-168.2121\\-51\\75.55913\\-170.3646\\-51\\76.4794\\-172.3178\\-51\\77.08388\\-174.2709\\-51\\77.07806\\-176.224\\-51\\76.59247\\-178.1771\\-51\\75.84347\\-180.1303\\-51\\75.81488\\-182.0834\\-51\\75.33372\\-184.0365\\-51\\74.49974\\-185.9896\\-51\\72.21037\\-189.8959\\-51\\70.03628\\-191.2793\\-51\\68.08315\\-191.6496\\-51\\66.13003\\-191.6133\\-51\\64.1769\\-191.0099\\-51\\62.22377\\-190.9005\\-51\\60.27065\\-192.8404\\-51\\58.31752\\-193.7945\\-51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "217" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-140.9012\\-214.4141\\-49\\-142.4306\\-213.3334\\-49\\-144.0143\\-211.3803\\-49\\-145.144\\-209.4271\\-49\\-145.9674\\-207.474\\-49\\-146.0911\\-205.5209\\-49\\-146.1181\\-199.6615\\-49\\-146.0105\\-197.7084\\-49\\-145.3449\\-195.7553\\-49\\-144.0933\\-193.8021\\-49\\-143.2545\\-191.849\\-49\\-142.8544\\-191.482\\-49\\-140.9012\\-191.543\\-49\\-140.5847\\-191.849\\-49\\-139.3545\\-195.7553\\-49\\-138.3062\\-197.7084\\-49\\-136.995\\-199.5038\\-49\\-135.0419\\-198.5107\\-49\\-133.0887\\-198.7993\\-49\\-131.1356\\-199.8231\\-49\\-129.1825\\-200.5269\\-49\\-128.0783\\-201.6146\\-49\\-128.052\\-203.5678\\-49\\-129.0701\\-207.474\\-49\\-127.2293\\-208.9185\\-49\\-123.3231\\-209.1342\\-49\\-121.37\\-209.1566\\-49\\-119.4168\\-210.3402\\-49\\-118.3663\\-211.3803\\-49\\-119.4168\\-212.8451\\-49\\-121.37\\-214.1057\\-49\\-123.3231\\-214.4616\\-49\\-131.1356\\-214.472\\-49\\-133.0887\\-214.7016\\-49\\-135.0419\\-214.6372\\-49\\-136.995\\-214.4375\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "218" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-209.451\\-49\\-112.8397\\-207.474\\-49\\-113.2645\\-205.5209\\-49\\-114.909\\-203.5678\\-49\\-115.5106\\-203.1093\\-49\\-116.9275\\-201.6146\\-49\\-117.9939\\-199.6615\\-49\\-118.3699\\-197.7084\\-49\\-118.0019\\-195.7553\\-49\\-117.4637\\-195.1914\\-49\\-115.3938\\-193.8021\\-49\\-113.5575\\-192.9176\\-49\\-111.6043\\-191.4051\\-49\\-109.6512\\-191.2793\\-49\\-108.1864\\-191.849\\-49\\-105.745\\-193.1353\\-49\\-103.1083\\-195.7553\\-49\\-101.8387\\-198.1536\\-49\\-101.2594\\-199.6615\\-49\\-100.8795\\-201.6146\\-49\\-100.8792\\-203.5678\\-49\\-102.1748\\-205.5209\\-49\\-105.745\\-208.5122\\-49\\-107.6981\\-209.091\\-49\\-109.6512\\-210.1992\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "219" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-60.8231\\-192.5511\\-49\\-62.77623\\-191.7543\\-49\\-64.72935\\-191.6496\\-49\\-68.6356\\-191.6496\\-49\\-70.58872\\-191.5235\\-49\\-72.54185\\-190.8153\\-49\\-74.49497\\-189.3906\\-49\\-76.4481\\-188.42\\-49\\-76.89199\\-187.9428\\-49\\-77.51467\\-185.9896\\-49\\-77.75189\\-184.0365\\-49\\-78.33464\\-182.0834\\-49\\-78.27915\\-180.1303\\-49\\-79.11543\\-178.1771\\-49\\-79.38596\\-176.224\\-49\\-79.1409\\-174.2709\\-49\\-78.40122\\-172.5335\\-49\\-78.40122\\-172.1393\\-49\\-79.27597\\-170.3646\\-49\\-79.17394\\-168.4115\\-49\\-76.4481\\-165.6577\\-49\\-74.49497\\-164.1383\\-49\\-70.58872\\-162.834\\-49\\-68.6356\\-162.7759\\-49\\-66.68247\\-163.5287\\-49\\-65.77196\\-164.5053\\-49\\-64.40383\\-166.4584\\-49\\-63.74791\\-168.4115\\-49\\-62.28213\\-170.3646\\-49\\-61.76648\\-172.3178\\-49\\-60.56401\\-174.2709\\-49\\-60.46628\\-176.224\\-49\\-60.46628\\-178.1771\\-49\\-60.36113\\-180.1303\\-49\\-59.76978\\-182.0834\\-49\\-58.67054\\-184.0365\\-49\\-58.65827\\-185.9896\\-49\\-58.10835\\-187.9428\\-49\\-57.69136\\-189.8959\\-49\\-58.05433\\-191.849\\-49\\-58.86998\\-192.574\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "220" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-167.3151\\-49\\-37.3856\\-166.0563\\-49\\-39.33873\\-165.4334\\-49\\-41.29185\\-165.3846\\-49\\-42.62292\\-164.5053\\-49\\-45.1981\\-161.9878\\-49\\-46.34792\\-160.599\\-49\\-47.41031\\-158.6459\\-49\\-47.80398\\-156.6928\\-49\\-48.38117\\-154.7396\\-49\\-49.10435\\-153.9337\\-49\\-51.05748\\-154.4191\\-49\\-53.0106\\-156.5533\\-49\\-54.07902\\-154.7396\\-49\\-53.37759\\-152.7865\\-49\\-51.83551\\-150.8334\\-49\\-49.8888\\-148.8803\\-49\\-48.25538\\-146.9271\\-49\\-47.32561\\-144.974\\-49\\-46.8047\\-143.0209\\-49\\-46.07939\\-141.0678\\-49\\-44.56957\\-139.1146\\-49\\-43.25311\\-137.1615\\-49\\-41.2841\\-135.2084\\-49\\-39.33873\\-134.0736\\-49\\-35.43248\\-134.009\\-49\\-31.52623\\-134.1152\\-49\\-29.5731\\-134.6349\\-49\\-27.61998\\-135.8227\\-49\\-25.66685\\-136.2821\\-49\\-23.71373\\-137.7686\\-49\\-21.7606\\-138.2191\\-49\\-20.87322\\-139.1146\\-49\\-19.74089\\-141.0678\\-49\\-18.09007\\-144.974\\-49\\-17.90653\\-146.9271\\-49\\-16.60252\\-148.8803\\-49\\-15.90123\\-149.4576\\-49\\-14.63715\\-150.8334\\-49\\-14.44017\\-152.7865\\-49\\-15.90123\\-154.548\\-49\\-17.85435\\-153.205\\-49\\-19.55828\\-154.7396\\-49\\-20.60648\\-156.6928\\-49\\-20.9933\\-158.6459\\-49\\-23.71373\\-161.6262\\-49\\-25.66685\\-163.3074\\-49\\-27.61998\\-164.1438\\-49\\-29.5731\\-165.4776\\-49\\-31.52623\\-165.9884\\-49\\-33.47935\\-167.3338\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "221" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-230.0652\\-49\\-19.80748\\-228.112\\-49\\-20.78404\\-227.0053\\-49\\-24.69029\\-223.099\\-49\\-24.69029\\-221.1459\\-49\\-21.7606\\-218.3464\\-49\\-19.80748\\-218.3464\\-49\\-17.85435\\-220.1693\\-49\\-15.90123\\-220.1693\\-49\\-13.9481\\-222.1225\\-49\\-11.99498\\-222.1225\\-49\\-11.01841\\-223.099\\-49\\-10.88821\\-225.0521\\-49\\-15.90123\\-230.0652\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "222" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-233.2251\\-49\\18.75305\\-232.8646\\-49\\18.07058\\-230.9115\\-49\\17.81223\\-227.0053\\-49\\19.25502\\-226.0536\\-49\\20.80803\\-227.0053\\-49\\21.60002\\-228.9584\\-49\\20.3627\\-230.9115\\-49\\19.63595\\-232.8646\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002326" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "223" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.31752\\-194.5622\\-49\\57.41286\\-193.8021\\-49\\56.25589\\-191.849\\-49\\56.25589\\-187.9428\\-49\\56.40196\\-185.9896\\-49\\58.07004\\-182.0834\\-49\\58.15593\\-180.1303\\-49\\58.15593\\-176.224\\-49\\58.0818\\-174.2709\\-49\\57.61577\\-172.3178\\-49\\57.72518\\-170.3646\\-49\\58.87164\\-168.4115\\-49\\59.42592\\-166.4584\\-49\\61.12089\\-164.5053\\-49\\62.22377\\-163.5579\\-49\\64.1769\\-162.8987\\-49\\66.13003\\-163.83\\-49\\66.76192\\-164.5053\\-49\\66.96124\\-166.4584\\-49\\67.93011\\-168.4115\\-49\\70.03628\\-170.3262\\-49\\71.9894\\-170.2545\\-49\\73.94253\\-169.7119\\-49\\75.89565\\-171.4604\\-49\\76.67176\\-172.3178\\-49\\77.55581\\-174.2709\\-49\\77.55581\\-176.224\\-49\\77.17546\\-178.1771\\-49\\76.64561\\-180.1303\\-49\\76.49274\\-184.0365\\-49\\75.34943\\-185.9896\\-49\\74.58279\\-187.9428\\-49\\73.43426\\-189.8959\\-49\\71.9894\\-191.3754\\-49\\70.03628\\-191.7136\\-49\\66.13003\\-191.6373\\-49\\64.1769\\-191.3522\\-49\\62.22377\\-192.0607\\-49\\60.27065\\-194.0016\\-49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "224" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-142.8544\\-213.9684\\-47\\-143.5072\\-213.3334\\-47\\-145.1064\\-211.3803\\-47\\-145.9692\\-209.4271\\-47\\-146.2144\\-205.5209\\-47\\-146.2305\\-203.5678\\-47\\-146.1181\\-201.6146\\-47\\-146.0977\\-197.7084\\-47\\-145.5835\\-195.7553\\-47\\-142.8544\\-192.5765\\-47\\-140.9012\\-194.3389\\-47\\-139.7873\\-195.7553\\-47\\-138.9481\\-196.6263\\-47\\-136.995\\-198.3187\\-47\\-135.0419\\-198.4646\\-47\\-129.1825\\-200.4978\\-47\\-128.1327\\-201.6146\\-47\\-127.3648\\-203.5678\\-47\\-127.6337\\-205.5209\\-47\\-126.4914\\-207.474\\-47\\-125.2762\\-208.4924\\-47\\-123.3231\\-209.9583\\-47\\-121.37\\-210.5641\\-47\\-119.4168\\-210.6977\\-47\\-117.4637\\-210.7174\\-47\\-116.4236\\-211.3803\\-47\\-116.2162\\-213.3334\\-47\\-117.4637\\-214.3965\\-47\\-119.4168\\-214.5451\\-47\\-121.37\\-214.8996\\-47\\-123.3231\\-214.9935\\-47\\-125.2762\\-214.9095\\-47\\-131.1356\\-214.9195\\-47\\-133.0887\\-215.0995\\-47\\-135.0419\\-215.1644\\-47\\-136.995\\-214.9935\\-47\\-140.9012\\-214.8996\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "225" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-210.7452\\-47\\-112.9906\\-209.4271\\-47\\-113.358\\-207.474\\-47\\-114.0014\\-205.5209\\-47\\-115.0194\\-203.5678\\-47\\-116.4782\\-201.6146\\-47\\-118.2196\\-199.6615\\-47\\-118.4106\\-197.7084\\-47\\-117.7567\\-195.7553\\-47\\-115.4994\\-193.8021\\-47\\-113.5575\\-192.9268\\-47\\-111.6043\\-191.6496\\-47\\-109.6512\\-191.5899\\-47\\-107.6981\\-191.6874\\-47\\-105.745\\-192.7222\\-47\\-102.5953\\-195.7553\\-47\\-100.8938\\-197.7084\\-47\\-100.5909\\-199.6615\\-47\\-100.1447\\-201.6146\\-47\\-100.3593\\-203.5678\\-47\\-100.9313\\-205.5209\\-47\\-103.7918\\-208.2445\\-47\\-105.745\\-208.7511\\-47\\-107.6981\\-210.1827\\-47\\-109.6512\\-210.7073\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "226" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-76.4481\\-192.0105\\-47\\-76.62959\\-191.849\\-47\\-77.47892\\-189.8959\\-47\\-78.40122\\-188.4465\\-47\\-78.97308\\-187.9428\\-47\\-80.34634\\-185.9896\\-47\\-79.50335\\-184.0365\\-47\\-79.51012\\-182.0834\\-47\\-79.24345\\-180.1303\\-47\\-79.29966\\-178.1771\\-47\\-79.79242\\-176.224\\-47\\-79.10923\\-172.3178\\-47\\-78.62502\\-168.4115\\-47\\-77.20924\\-166.4584\\-47\\-76.4481\\-165.6972\\-47\\-74.33746\\-164.5053\\-47\\-72.54185\\-163.6985\\-47\\-70.58872\\-162.9733\\-47\\-68.6356\\-161.837\\-47\\-66.68247\\-161.5712\\-47\\-65.4269\\-162.5521\\-47\\-64.96671\\-164.5053\\-47\\-64.2293\\-166.4584\\-47\\-63.13203\\-168.4115\\-47\\-62.77623\\-168.7237\\-47\\-61.64907\\-170.3646\\-47\\-61.23204\\-172.3178\\-47\\-60.46628\\-174.2709\\-47\\-60.44608\\-178.1771\\-47\\-59.43191\\-182.0834\\-47\\-58.65827\\-184.0365\\-47\\-58.65827\\-185.9896\\-47\\-58.55516\\-187.9428\\-47\\-58.1184\\-189.8959\\-47\\-58.21041\\-191.849\\-47\\-58.86998\\-192.5857\\-47\\-60.8231\\-193.1529\\-47\\-62.77623\\-192.3284\\-47\\-64.72935\\-191.6496\\-47\\-68.6356\\-191.9041\\-47\\-70.58872\\-191.7682\\-47\\-72.54185\\-191.3933\\-47\\-74.49497\\-191.2408\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "227" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-165.0415\\-47\\-39.33873\\-163.7946\\-47\\-41.29185\\-163.4651\\-47\\-42.71424\\-162.5521\\-47\\-44.69606\\-160.599\\-47\\-45.86153\\-158.6459\\-47\\-46.47791\\-156.6928\\-47\\-47.53309\\-154.7396\\-47\\-49.10435\\-153.3854\\-47\\-51.03441\\-154.7396\\-47\\-52.46077\\-156.6928\\-47\\-53.0106\\-157.0992\\-47\\-53.4917\\-156.6928\\-47\\-53.87811\\-154.7396\\-47\\-53.04816\\-152.7865\\-47\\-51.83551\\-150.8334\\-47\\-49.88238\\-148.8803\\-47\\-48.08731\\-146.9271\\-47\\-47.02916\\-144.974\\-47\\-46.83641\\-143.0209\\-47\\-46.53362\\-141.0678\\-47\\-45.73436\\-139.1146\\-47\\-43.24498\\-135.3735\\-47\\-41.29185\\-133.955\\-47\\-39.33873\\-132.8108\\-47\\-37.3856\\-132.2275\\-47\\-35.43248\\-132.2096\\-47\\-33.47935\\-132.7887\\-47\\-31.52623\\-133.6992\\-47\\-29.5731\\-133.9317\\-47\\-27.61998\\-134.6122\\-47\\-25.66685\\-135.8403\\-47\\-23.71373\\-136.4476\\-47\\-21.7606\\-137.9268\\-47\\-20.40307\\-139.1146\\-47\\-18.9605\\-141.0678\\-47\\-18.54691\\-143.0209\\-47\\-17.94909\\-144.974\\-47\\-17.74504\\-146.9271\\-47\\-16.10177\\-148.8803\\-47\\-14.04966\\-150.8334\\-47\\-15.90123\\-152.4748\\-47\\-17.85435\\-153.0108\\-47\\-18.91045\\-154.7396\\-47\\-20.69234\\-156.6928\\-47\\-21.33523\\-158.6459\\-47\\-22.86349\\-160.599\\-47\\-23.71373\\-161.3976\\-47\\-25.66685\\-161.8396\\-47\\-27.61998\\-163.6109\\-47\\-29.5731\\-164.6669\\-47\\-31.52623\\-165.1683\\-47\\-33.47935\\-165.4565\\-47\\-35.43248\\-165.4016\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "228" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-232.0486\\-47\\-18.83091\\-230.9115\\-47\\-20.78404\\-228.9584\\-47\\-20.78404\\-227.0053\\-47\\-23.71373\\-224.0756\\-47\\-24.85082\\-223.099\\-47\\-24.52976\\-221.1459\\-47\\-23.71373\\-220.3298\\-47\\-21.7606\\-220.1693\\-47\\-19.80748\\-220.1693\\-47\\-17.85435\\-220.3298\\-47\\-15.90123\\-220.3298\\-47\\-13.9481\\-222.1225\\-47\\-11.99498\\-222.283\\-47\\-9.065289\\-225.0521\\-47\\-10.85788\\-227.0053\\-47\\-10.85788\\-230.9115\\-47\\-11.99498\\-232.0486\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "229" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-234.0953\\-47\\17.56823\\-232.8646\\-47\\17.46087\\-227.0053\\-47\\19.25502\\-226.0162\\-47\\21.20815\\-227.8363\\-47\\22.19295\\-228.9584\\-47\\22.2507\\-230.9115\\-47\\21.2314\\-232.8646\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002325" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "230" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.31752\\-195.2386\\-47\\56.82915\\-193.8021\\-47\\56.25589\\-191.849\\-47\\56.28363\\-187.9428\\-47\\57.70717\\-184.0365\\-47\\58.01154\\-182.0834\\-47\\58.01154\\-180.1303\\-47\\58.15593\\-178.1771\\-47\\58.15593\\-174.2709\\-47\\57.9458\\-170.3646\\-47\\58.12919\\-168.4115\\-47\\58.83121\\-166.4584\\-47\\57.72034\\-164.5053\\-47\\56.3644\\-163.4523\\-47\\55.48389\\-162.5521\\-47\\56.3644\\-161.6668\\-47\\58.31752\\-161.5954\\-47\\60.36972\\-162.5521\\-47\\62.22377\\-163.2184\\-47\\64.1769\\-162.8227\\-47\\65.42828\\-164.5053\\-47\\65.48069\\-166.4584\\-47\\67.14334\\-168.4115\\-47\\70.03628\\-171.4226\\-47\\71.9894\\-171.3196\\-47\\73.94253\\-170.4601\\-47\\75.89565\\-171.5207\\-47\\76.68421\\-172.3178\\-47\\77.75404\\-174.2709\\-47\\77.90874\\-176.224\\-47\\78.61651\\-178.1771\\-47\\78.25369\\-180.1303\\-47\\77.26945\\-182.0834\\-47\\77.21005\\-184.0365\\-47\\76.8479\\-185.9896\\-47\\76.72197\\-187.9428\\-47\\75.89565\\-189.7689\\-47\\74.80606\\-191.849\\-47\\73.94253\\-192.8256\\-47\\71.9894\\-193.0971\\-47\\70.03628\\-192.7562\\-47\\68.08315\\-191.9432\\-47\\64.1769\\-191.6252\\-47\\62.22377\\-192.6102\\-47\\60.27065\\-194.5308\\-47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "231" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-136.995\\-215.7574\\-45\\-138.9481\\-215.0047\\-45\\-140.9012\\-214.9935\\-45\\-142.8544\\-214.0375\\-45\\-145.4927\\-211.3803\\-45\\-146.1987\\-209.4271\\-45\\-146.3447\\-207.474\\-45\\-147.2874\\-205.5209\\-45\\-147.3476\\-203.5678\\-45\\-146.1321\\-201.6146\\-45\\-146.1181\\-197.7084\\-45\\-145.2138\\-195.7553\\-45\\-144.8075\\-195.3938\\-45\\-142.8544\\-194.9912\\-45\\-141.3784\\-195.7553\\-45\\-136.995\\-198.3577\\-45\\-135.0419\\-198.9842\\-45\\-133.0887\\-200.2388\\-45\\-131.1356\\-200.4993\\-45\\-129.1825\\-200.8805\\-45\\-128.5911\\-201.6146\\-45\\-127.7706\\-203.5678\\-45\\-126.3638\\-205.5209\\-45\\-124.0407\\-209.4271\\-45\\-123.3231\\-210.118\\-45\\-121.37\\-210.7805\\-45\\-119.4168\\-210.8749\\-45\\-117.4637\\-210.7588\\-45\\-115.5106\\-210.2021\\-45\\-114.8242\\-209.4271\\-45\\-113.9237\\-205.5209\\-45\\-114.6131\\-203.5678\\-45\\-116.3058\\-201.6146\\-45\\-118.229\\-199.6615\\-45\\-118.3634\\-197.7084\\-45\\-117.4637\\-196.2249\\-45\\-115.5106\\-193.979\\-45\\-113.5575\\-192.9268\\-45\\-111.6043\\-191.6746\\-45\\-107.6981\\-191.6496\\-45\\-105.745\\-192.6056\\-45\\-103.7918\\-193.9386\\-45\\-101.8387\\-195.054\\-45\\-101.1337\\-195.7553\\-45\\-98.94222\\-199.6615\\-45\\-98.90456\\-201.6146\\-45\\-99.37321\\-203.5678\\-45\\-100.1916\\-205.5209\\-45\\-102.4447\\-207.474\\-45\\-103.7918\\-208.519\\-45\\-105.745\\-209.091\\-45\\-107.6981\\-210.4579\\-45\\-109.6512\\-210.9007\\-45\\-111.6043\\-212.0517\\-45\\-113.5575\\-212.5196\\-45\\-115.5106\\-214.2445\\-45\\-119.4168\\-216.0081\\-45\\-121.37\\-216.4019\\-45\\-125.2762\\-215.2945\\-45\\-131.1356\\-215.3103\\-45\\-133.0887\\-216.0538\\-45\\-135.0419\\-216.3777\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "232" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.2606\\-202.4949\\-45\\-85.56919\\-201.6146\\-45\\-85.19905\\-199.6615\\-45\\-82.30747\\-196.8648\\-45\\-81.41229\\-197.7084\\-45\\-81.85449\\-199.6615\\-45\\-83.37642\\-201.6146\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "233" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-78.40122\\-192.1607\\-45\\-78.69419\\-191.849\\-45\\-79.20146\\-189.8959\\-45\\-80.35435\\-188.3587\\-45\\-82.43137\\-185.9896\\-45\\-83.16133\\-184.0365\\-45\\-82.5045\\-182.0834\\-45\\-80.86704\\-180.1303\\-45\\-80.35435\\-179.38\\-45\\-79.7971\\-178.1771\\-45\\-80.25961\\-176.224\\-45\\-80.01826\\-174.2709\\-45\\-79.21117\\-172.3178\\-45\\-78.06071\\-170.3646\\-45\\-77.43903\\-168.4115\\-45\\-76.64754\\-166.4584\\-45\\-74.49497\\-164.8586\\-45\\-72.54185\\-164.0893\\-45\\-70.58872\\-163.5065\\-45\\-68.6356\\-161.7344\\-45\\-66.68247\\-161.0054\\-45\\-64.72935\\-161.4458\\-45\\-63.91251\\-162.5521\\-45\\-64.25605\\-164.5053\\-45\\-63.57355\\-166.4584\\-45\\-61.29522\\-168.4115\\-45\\-60.64872\\-170.3646\\-45\\-60.46628\\-174.2709\\-45\\-60.45611\\-178.1771\\-45\\-59.70385\\-182.0834\\-45\\-58.65827\\-184.0365\\-45\\-58.65827\\-187.9428\\-45\\-58.42338\\-189.8959\\-45\\-58.3669\\-191.849\\-45\\-58.86998\\-192.4594\\-45\\-60.8231\\-192.719\\-45\\-62.77623\\-191.1998\\-45\\-64.72935\\-191.8263\\-45\\-66.68247\\-192.714\\-45\\-68.6356\\-193.2197\\-45\\-70.58872\\-192.6744\\-45\\-72.54185\\-192.7509\\-45\\-74.49497\\-193.1304\\-45\\-76.4481\\-193.2016\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "234" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-164.7871\\-45\\-35.43248\\-163.8222\\-45\\-37.3856\\-163.4992\\-45\\-39.33873\\-163.3015\\-45\\-41.29185\\-161.8596\\-45\\-42.81697\\-160.599\\-45\\-46.263\\-156.6928\\-45\\-46.90374\\-154.7396\\-45\\-47.15123\\-154.4141\\-45\\-49.10435\\-152.9609\\-45\\-51.16337\\-154.7396\\-45\\-52.58714\\-156.6928\\-45\\-53.0106\\-157.0076\\-45\\-53.38739\\-156.6928\\-45\\-53.82182\\-154.7396\\-45\\-53.0106\\-152.8231\\-45\\-51.83551\\-150.8334\\-45\\-49.98486\\-148.8803\\-45\\-48.61607\\-146.9271\\-45\\-46.98964\\-143.0209\\-45\\-46.7742\\-141.0678\\-45\\-46.08281\\-139.1146\\-45\\-44.90513\\-137.1615\\-45\\-44.06221\\-135.2084\\-45\\-43.24498\\-134.3457\\-45\\-41.29185\\-132.7546\\-45\\-39.33873\\-132.0297\\-45\\-37.3856\\-131.746\\-45\\-35.43248\\-131.6382\\-45\\-31.52623\\-132.1686\\-45\\-29.5731\\-132.7243\\-45\\-27.61998\\-133.8235\\-45\\-25.66685\\-134.0682\\-45\\-23.71373\\-134.9465\\-45\\-21.7606\\-136.4845\\-45\\-19.07384\\-139.1146\\-45\\-18.04135\\-143.0209\\-45\\-17.73138\\-144.974\\-45\\-16.98452\\-146.9271\\-45\\-15.90123\\-148.1584\\-45\\-13.9481\\-149.4212\\-45\\-12.80689\\-150.8334\\-45\\-13.9481\\-152.3669\\-45\\-15.90123\\-151.4897\\-45\\-17.84648\\-152.7865\\-45\\-18.78984\\-154.7396\\-45\\-20.27223\\-156.6928\\-45\\-20.90666\\-158.6459\\-45\\-21.7606\\-159.5484\\-45\\-23.71373\\-161.061\\-45\\-25.66685\\-161.6482\\-45\\-27.61998\\-163.2673\\-45\\-29.5731\\-163.7839\\-45\\-31.52623\\-164.729\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "24" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "235" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-233.8412\\-45\\-18.83091\\-232.8646\\-45\\-18.83091\\-230.9115\\-45\\-20.78404\\-228.9584\\-45\\-20.9766\\-227.0053\\-45\\-23.71373\\-224.2681\\-45\\-25.66685\\-224.0756\\-45\\-26.64341\\-223.099\\-45\\-25.66685\\-222.1225\\-45\\-23.71373\\-221.9299\\-45\\-21.7606\\-220.1693\\-45\\-19.80748\\-220.3619\\-45\\-19.02348\\-221.1459\\-45\\-18.83091\\-223.099\\-45\\-17.85435\\-224.0756\\-45\\-15.90123\\-224.2681\\-45\\-13.9481\\-222.315\\-45\\-11.99498\\-224.0756\\-45\\-10.04185\\-224.0756\\-45\\-9.065289\\-225.0521\\-45\\-8.872726\\-227.0053\\-45\\-8.872726\\-232.8646\\-45\\-10.04185\\-234.0338\\-45\\-15.90123\\-234.0338\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "236" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-234.2876\\-45\\17.38267\\-232.8646\\-45\\17.38267\\-230.9115\\-45\\17.20716\\-228.9584\\-45\\17.26405\\-227.0053\\-45\\19.25502\\-226.0201\\-45\\22.28464\\-228.9584\\-45\\22.97427\\-230.9115\\-45\\22.09071\\-232.8646\\-45\\21.20815\\-233.6898\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002324" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "237" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.28636\\-195.7553\\-45\\56.35677\\-193.8021\\-45\\56.25589\\-191.849\\-45\\56.25589\\-189.8959\\-45\\56.44517\\-187.9428\\-45\\57.26985\\-185.9896\\-45\\57.92813\\-184.0365\\-45\\57.369\\-182.0834\\-45\\57.42686\\-180.1303\\-45\\58.14314\\-178.1771\\-45\\58.15593\\-172.3178\\-45\\57.46362\\-170.3646\\-45\\57.46064\\-168.4115\\-45\\58.05666\\-166.4584\\-45\\56.3644\\-164.513\\-45\\54.41127\\-162.6858\\-45\\54.41127\\-162.4454\\-45\\55.62523\\-160.599\\-45\\56.3644\\-159.8985\\-45\\58.31752\\-160.0466\\-45\\60.27065\\-161.6943\\-45\\62.22377\\-162.8987\\-45\\64.1769\\-162.8227\\-45\\66.13003\\-164.055\\-45\\66.58025\\-164.5053\\-45\\67.36084\\-166.4584\\-45\\69.62216\\-170.3646\\-45\\70.03628\\-170.9191\\-45\\71.9894\\-171.6057\\-45\\73.94253\\-170.9283\\-45\\75.89565\\-171.4362\\-45\\76.82757\\-172.3178\\-45\\78.5942\\-174.2709\\-45\\80.02726\\-176.224\\-45\\80.68081\\-178.1771\\-45\\80.61118\\-180.1303\\-45\\79.8019\\-181.691\\-45\\78.23571\\-184.0365\\-45\\76.83553\\-185.9896\\-45\\75.87103\\-189.8959\\-45\\74.82407\\-191.849\\-45\\73.94253\\-192.7704\\-45\\71.9894\\-194.2064\\-45\\70.03628\\-194.9661\\-45\\68.08315\\-194.1326\\-45\\66.13003\\-192.6234\\-45\\64.1769\\-191.6496\\-45\\62.22377\\-192.1081\\-45\\60.27065\\-194.1834\\-45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "238" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-138.4763\\-215.2865\\-43\\-138.9481\\-215.0047\\-43\\-140.9012\\-214.8437\\-43\\-142.8544\\-213.8187\\-43\\-145.4336\\-211.3803\\-43\\-147.1163\\-209.4271\\-43\\-147.8309\\-207.474\\-43\\-147.9813\\-205.5209\\-43\\-147.6239\\-203.5678\\-43\\-146.1391\\-201.6146\\-43\\-146.1181\\-197.7084\\-43\\-145.1813\\-195.7553\\-43\\-144.8075\\-195.4183\\-43\\-142.8544\\-196.0409\\-43\\-140.9012\\-197.0884\\-43\\-138.9481\\-197.6418\\-43\\-136.995\\-198.4621\\-43\\-134.7736\\-199.6615\\-43\\-133.0887\\-200.4168\\-43\\-131.1356\\-201.0386\\-43\\-129.1825\\-202.0168\\-43\\-126.1653\\-205.5209\\-43\\-123.3231\\-209.4348\\-43\\-121.37\\-210.4913\\-43\\-119.4168\\-210.9183\\-43\\-117.4637\\-210.8001\\-43\\-116.1224\\-209.4271\\-43\\-115.9291\\-207.474\\-43\\-114.6537\\-205.5209\\-43\\-114.9774\\-203.5678\\-43\\-116.4414\\-201.6146\\-43\\-118.3001\\-199.6615\\-43\\-118.3333\\-197.7084\\-43\\-115.5106\\-194.634\\-43\\-113.5575\\-192.938\\-43\\-111.6043\\-191.6746\\-43\\-107.6981\\-191.6496\\-43\\-105.745\\-192.0744\\-43\\-103.7918\\-192.9728\\-43\\-101.8387\\-194.6002\\-43\\-100.5885\\-195.7553\\-43\\-98.88557\\-197.7084\\-43\\-98.13191\\-199.6615\\-43\\-98.13191\\-201.6146\\-43\\-98.47869\\-203.5678\\-43\\-98.9419\\-205.5209\\-43\\-101.8387\\-208.2641\\-43\\-103.7918\\-208.9135\\-43\\-105.745\\-210.2427\\-43\\-107.6981\\-210.766\\-43\\-109.6512\\-211.1328\\-43\\-111.6043\\-212.5288\\-43\\-113.5575\\-214.0772\\-43\\-115.5106\\-214.7897\\-43\\-117.4637\\-216.0215\\-43\\-119.4168\\-216.7095\\-43\\-121.37\\-216.9141\\-43\\-123.3231\\-216.5764\\-43\\-125.2762\\-216.4369\\-43\\-131.1356\\-216.4471\\-43\\-135.0419\\-216.8626\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "239" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.2606\\-202.3638\\-43\\-85.32527\\-201.6146\\-43\\-85.09549\\-199.6615\\-43\\-82.30747\\-196.789\\-43\\-80.99861\\-197.7084\\-43\\-81.48116\\-199.6615\\-43\\-82.30747\\-200.5395\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "240" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-74.49497\\-194.0016\\-43\\-76.4481\\-192.493\\-43\\-76.99667\\-191.849\\-43\\-77.74773\\-189.8959\\-43\\-79.44796\\-187.9428\\-43\\-82.30747\\-185.1096\\-43\\-83.22574\\-184.0365\\-43\\-84.56864\\-182.0834\\-43\\-84.43607\\-180.1303\\-43\\-82.30747\\-177.8852\\-43\\-81.54018\\-176.224\\-43\\-81.07419\\-174.2709\\-43\\-79.24163\\-172.3178\\-43\\-77.51636\\-170.3646\\-43\\-76.97005\\-168.4115\\-43\\-75.51041\\-166.4584\\-43\\-74.49497\\-165.4771\\-43\\-72.54185\\-164.3698\\-43\\-70.58872\\-163.5897\\-43\\-66.68247\\-159.9118\\-43\\-64.72935\\-159.8781\\-43\\-64.01591\\-160.599\\-43\\-63.65513\\-162.5521\\-43\\-63.59584\\-164.5053\\-43\\-62.77623\\-165.2456\\-43\\-60.8231\\-165.8923\\-43\\-60.30035\\-166.4584\\-43\\-60.53013\\-168.4115\\-43\\-60.46628\\-170.3646\\-43\\-60.46628\\-178.1771\\-43\\-60.26585\\-180.1303\\-43\\-59.72777\\-182.0834\\-43\\-58.67054\\-184.0365\\-43\\-58.65827\\-187.9428\\-43\\-57.95642\\-189.8959\\-43\\-57.66113\\-191.849\\-43\\-58.86998\\-193.5904\\-43\\-61.26456\\-191.849\\-43\\-62.77623\\-191.1133\\-43\\-63.58764\\-191.849\\-43\\-66.19761\\-193.8021\\-43\\-66.68247\\-194.2495\\-43\\-68.6356\\-195.0943\\-43\\-70.58872\\-195.0797\\-43\\-72.54185\\-194.8329\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "241" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-162.8882\\-43\\-41.29185\\-161.6211\\-43\\-46.23355\\-156.6928\\-43\\-46.82571\\-154.7396\\-43\\-47.53462\\-152.7865\\-43\\-49.10435\\-151.6533\\-43\\-50.46278\\-152.7865\\-43\\-51.83429\\-154.7396\\-43\\-53.0106\\-155.8813\\-43\\-53.86847\\-154.7396\\-43\\-53.14703\\-152.7865\\-43\\-50.61192\\-148.8803\\-43\\-49.63238\\-146.9271\\-43\\-48.52504\\-144.974\\-43\\-47.84799\\-143.0209\\-43\\-47.02916\\-141.0678\\-43\\-46.55149\\-139.1146\\-43\\-45.76496\\-137.1615\\-43\\-43.24498\\-133.2014\\-43\\-41.29185\\-132.0235\\-43\\-39.33873\\-131.6891\\-43\\-37.3856\\-130.715\\-43\\-35.43248\\-130.2409\\-43\\-33.47935\\-130.7825\\-43\\-31.52623\\-131.584\\-43\\-27.61998\\-132.1105\\-43\\-25.66685\\-132.7332\\-43\\-21.7606\\-134.8345\\-43\\-21.42123\\-135.2084\\-43\\-20.3102\\-137.1615\\-43\\-18.82659\\-139.1146\\-43\\-18.06605\\-141.0678\\-43\\-17.69159\\-143.0209\\-43\\-17.03069\\-144.974\\-43\\-15.90123\\-146.6429\\-43\\-13.25238\\-148.8803\\-43\\-12.34269\\-150.8334\\-43\\-13.34956\\-152.7865\\-43\\-14.08354\\-152.7865\\-43\\-15.90123\\-151.1902\\-43\\-17.89191\\-152.7865\\-43\\-18.76673\\-154.7396\\-43\\-20.81008\\-158.6459\\-43\\-21.7606\\-159.6049\\-43\\-23.71373\\-160.9859\\-43\\-25.66685\\-161.6253\\-43\\-27.61998\\-162.8987\\-43\\-29.5731\\-163.5853\\-43\\-31.52623\\-164.3968\\-43\\-33.47935\\-164.3698\\-43\\-35.43248\\-163.5377\\-43\\-37.3856\\-162.9775\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "242" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-15.90123\\-235.7943\\-43\\-16.87779\\-234.8178\\-43\\-18.59863\\-232.8646\\-43\\-18.83091\\-230.9115\\-43\\-26.64341\\-223.099\\-43\\-23.71373\\-220.1693\\-43\\-21.7606\\-220.1693\\-43\\-20.78404\\-221.1459\\-43\\-19.80748\\-222.3547\\-43\\-17.11008\\-225.0521\\-43\\-15.90123\\-226.0287\\-43\\-13.9481\\-224.3079\\-43\\-11.99498\\-224.0756\\-43\\-10.04185\\-224.0756\\-43\\-7.112164\\-227.0053\\-43\\-7.112164\\-232.8646\\-43\\-8.088726\\-234.0735\\-43\\-10.04185\\-236.0266\\-43\\-13.9481\\-236.0266\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "243" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-234.4712\\-43\\17.38267\\-232.8646\\-43\\17.16547\\-230.9115\\-43\\16.48725\\-228.9584\\-43\\16.6683\\-227.0053\\-43\\17.3019\\-226.4106\\-43\\19.25502\\-226.1186\\-43\\21.20815\\-227.9859\\-43\\23.29491\\-228.9584\\-43\\24.37201\\-230.9115\\-43\\23.40358\\-232.8646\\-43\\23.16127\\-233.1288\\-43\\21.20815\\-234.3441\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002323" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "244" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.31752\\-196.3834\\-43\\57.11947\\-195.7553\\-43\\56.26966\\-193.8021\\-43\\56.26966\\-189.8959\\-43\\56.94815\\-187.9428\\-43\\57.49542\\-185.9896\\-43\\57.36467\\-184.0365\\-43\\56.9417\\-182.0834\\-43\\57.34096\\-180.1303\\-43\\58.14314\\-178.1771\\-43\\58.15593\\-172.3178\\-43\\57.59396\\-170.3646\\-43\\57.17744\\-168.4115\\-43\\57.45419\\-166.4584\\-43\\56.42282\\-164.5053\\-43\\54.41127\\-163.5574\\-43\\53.83843\\-162.5521\\-43\\55.43998\\-160.599\\-43\\56.3644\\-159.6965\\-43\\58.31752\\-159.7428\\-43\\60.27065\\-161.6609\\-43\\62.22377\\-162.8227\\-43\\64.1769\\-162.8227\\-43\\66.13003\\-163.6042\\-43\\68.08315\\-165.1179\\-43\\70.03628\\-166.3703\\-43\\72.07154\\-168.4115\\-43\\73.94253\\-169.7115\\-43\\75.89565\\-170.6769\\-43\\77.84878\\-171.7888\\-43\\79.8019\\-173.745\\-43\\80.57095\\-174.2709\\-43\\81.75503\\-175.3986\\-43\\82.19949\\-176.224\\-43\\81.33908\\-178.1771\\-43\\80.69708\\-180.1303\\-43\\79.8019\\-181.2217\\-43\\78.85406\\-182.0834\\-43\\76.94238\\-184.0365\\-43\\76.03108\\-185.9896\\-43\\75.01514\\-187.9428\\-43\\74.43081\\-189.8959\\-43\\73.1654\\-191.849\\-43\\70.34965\\-195.7553\\-43\\70.03628\\-196.039\\-43\\68.08315\\-195.2746\\-43\\67.1015\\-193.8021\\-43\\66.13003\\-192.8742\\-43\\64.1769\\-191.6496\\-43\\62.22377\\-191.6874\\-43\\60.07121\\-193.8021\\-43\\58.97408\\-195.7553\\-43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "64" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "245" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-217.2952\\-41\\-125.2762\\-217.0402\\-41\\-127.2293\\-216.9141\\-41\\-135.0419\\-216.9578\\-41\\-136.995\\-216\\-41\\-138.9481\\-214.8132\\-41\\-140.9012\\-214.2431\\-41\\-142.8544\\-212.4783\\-41\\-144.7132\\-211.3803\\-41\\-146.7606\\-209.9826\\-41\\-147.2992\\-209.4271\\-41\\-147.9679\\-207.474\\-41\\-148.0679\\-205.5209\\-41\\-147.7277\\-203.5678\\-41\\-146.3259\\-201.6146\\-41\\-146.1181\\-199.6615\\-41\\-146.1181\\-197.7084\\-41\\-145.9722\\-195.7553\\-41\\-144.8075\\-194.47\\-41\\-142.8544\\-195.3955\\-41\\-140.9012\\-197.6418\\-41\\-138.9481\\-197.7459\\-41\\-136.995\\-198.4906\\-41\\-134.9169\\-199.6615\\-41\\-133.0887\\-200.4399\\-41\\-131.1356\\-201.4152\\-41\\-129.1825\\-201.9294\\-41\\-127.0299\\-203.5678\\-41\\-126.126\\-205.5209\\-41\\-125.2762\\-206.6467\\-41\\-123.3231\\-208.8284\\-41\\-121.37\\-210.0873\\-41\\-119.4168\\-210.7349\\-41\\-117.4637\\-210.1612\\-41\\-116.8589\\-209.4271\\-41\\-116.4224\\-207.474\\-41\\-115.5106\\-205.6062\\-41\\-116.201\\-203.5678\\-41\\-117.8859\\-201.6146\\-41\\-118.6423\\-199.6615\\-41\\-118.3365\\-197.7084\\-41\\-115.5106\\-194.8542\\-41\\-113.5575\\-192.9496\\-41\\-111.6043\\-191.6746\\-41\\-107.6981\\-191.6496\\-41\\-105.745\\-191.6874\\-41\\-103.7918\\-192.6354\\-41\\-101.8387\\-193.8687\\-41\\-99.8856\\-194.9568\\-41\\-98.99256\\-195.7553\\-41\\-96.82784\\-199.6615\\-41\\-96.39086\\-201.6146\\-41\\-96.93359\\-203.5678\\-41\\-98.09406\\-205.5209\\-41\\-100.3232\\-207.474\\-41\\-103.7918\\-210.2453\\-41\\-107.6981\\-211.1097\\-41\\-109.6512\\-212.1848\\-41\\-111.6043\\-213.878\\-41\\-113.5575\\-214.7324\\-41\\-115.5106\\-215.2489\\-41\\-117.4637\\-216.3226\\-41\\-119.4168\\-217.2169\\-41\\-121.37\\-217.3835\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "246" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-70.58872\\-196.7539\\-41\\-71.84233\\-195.7553\\-41\\-73.05276\\-193.8021\\-41\\-74.10594\\-191.849\\-41\\-75.64347\\-189.8959\\-41\\-77.50365\\-187.9428\\-41\\-78.97456\\-185.9896\\-41\\-80.35435\\-184.636\\-41\\-82.30747\\-183.2341\\-41\\-84.4484\\-182.0834\\-41\\-85.43736\\-180.1303\\-41\\-84.74504\\-178.1771\\-41\\-84.2606\\-177.6889\\-41\\-81.47768\\-174.2709\\-41\\-79.41415\\-172.3178\\-41\\-77.88154\\-170.3646\\-41\\-77.16587\\-168.4115\\-41\\-74.49497\\-165.6477\\-41\\-72.54185\\-163.8127\\-41\\-70.58872\\-163.2418\\-41\\-68.6356\\-161.7036\\-41\\-66.68247\\-159.7517\\-41\\-64.72935\\-159.6584\\-41\\-63.82223\\-160.599\\-41\\-61.95633\\-164.5053\\-41\\-60.16354\\-166.4584\\-41\\-60.67449\\-168.4115\\-41\\-60.74233\\-170.3646\\-41\\-60.46628\\-172.3178\\-41\\-60.44608\\-178.1771\\-41\\-59.91661\\-180.1303\\-41\\-59.2268\\-182.0834\\-41\\-58.65827\\-184.0365\\-41\\-58.65827\\-185.9896\\-41\\-58.44883\\-187.9428\\-41\\-57.02536\\-191.849\\-41\\-57.2374\\-193.8021\\-41\\-58.86998\\-195.0173\\-41\\-60.8231\\-194.2064\\-41\\-62.77623\\-193.0381\\-41\\-64.72935\\-193.2075\\-41\\-66.68247\\-194.719\\-41\\-68.6356\\-196.466\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "247" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-162.8227\\-41\\-39.33873\\-162.5294\\-41\\-41.29185\\-161.5542\\-41\\-46.23355\\-156.6928\\-41\\-46.82571\\-154.7396\\-41\\-46.9155\\-152.7865\\-41\\-47.15123\\-152.5017\\-41\\-49.10435\\-151.2104\\-41\\-50.90887\\-152.7865\\-41\\-51.9084\\-154.7396\\-41\\-53.0106\\-155.7316\\-41\\-54.1669\\-154.7396\\-41\\-53.64912\\-152.7865\\-41\\-52.40424\\-150.8334\\-41\\-51.60001\\-148.8803\\-41\\-49.87423\\-146.9271\\-41\\-48.84526\\-144.974\\-41\\-48.53607\\-143.0209\\-41\\-47.77602\\-141.0678\\-41\\-46.79441\\-139.1146\\-41\\-46.08452\\-137.1615\\-41\\-44.96238\\-135.2084\\-41\\-43.96256\\-133.2553\\-41\\-43.24498\\-132.5494\\-41\\-41.29185\\-131.8241\\-41\\-39.33873\\-130.7772\\-41\\-37.3856\\-130.0255\\-41\\-35.43248\\-129.8543\\-41\\-31.52623\\-130.2142\\-41\\-29.5731\\-130.2525\\-41\\-27.61998\\-130.7432\\-41\\-25.66685\\-131.8815\\-41\\-23.71373\\-132.1969\\-41\\-21.7606\\-133.0406\\-41\\-21.5459\\-133.2553\\-41\\-18.97963\\-137.1615\\-41\\-17.92093\\-141.0678\\-41\\-17.05491\\-143.0209\\-41\\-16.55056\\-144.974\\-41\\-15.90123\\-145.8008\\-41\\-12.57178\\-148.8803\\-41\\-12.21896\\-150.8334\\-41\\-12.85886\\-152.7865\\-41\\-13.9481\\-153.1277\\-41\\-14.14754\\-152.7865\\-41\\-15.90123\\-150.9555\\-41\\-17.89191\\-152.7865\\-41\\-19.71273\\-156.6928\\-41\\-20.79712\\-158.6459\\-41\\-21.7606\\-159.6094\\-41\\-23.71373\\-160.9859\\-41\\-25.66685\\-161.6253\\-41\\-27.61998\\-162.8112\\-41\\-31.52623\\-163.6786\\-41\\-33.47935\\-163.6634\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "24" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "248" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-13.9481\\-237.7475\\-41\\-14.92466\\-236.7709\\-41\\-16.60923\\-234.8178\\-41\\-16.60923\\-232.8646\\-41\\-18.56236\\-230.9115\\-41\\-21.05259\\-228.9584\\-41\\-23.71373\\-226.2973\\-41\\-25.66685\\-223.807\\-41\\-26.37486\\-223.099\\-41\\-24.69029\\-221.1459\\-41\\-23.71373\\-220.1693\\-41\\-21.7606\\-220.1693\\-41\\-20.78404\\-221.1459\\-41\\-20.78404\\-223.099\\-41\\-17.85435\\-226.0287\\-41\\-15.90123\\-226.2973\\-41\\-13.9481\\-226.2973\\-41\\-11.99498\\-224.3441\\-41\\-10.04185\\-224.3441\\-41\\-8.088726\\-226.0287\\-41\\-7.112164\\-227.0053\\-41\\-7.112164\\-234.8178\\-41\\-8.088726\\-236.0629\\-41\\-10.04185\\-237.7475\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "249" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-235.4552\\-41\\18.56828\\-234.8178\\-41\\16.90622\\-232.8646\\-41\\15.61931\\-228.9584\\-41\\16.16167\\-227.0053\\-41\\17.3019\\-226.0941\\-41\\19.25502\\-226.0663\\-41\\21.20815\\-227.8738\\-41\\23.16127\\-228.2988\\-41\\25.1144\\-228.3159\\-41\\26.15774\\-228.9584\\-41\\25.81728\\-230.9115\\-41\\25.1144\\-231.8628\\-41\\23.33813\\-234.8178\\-41\\21.20815\\-235.9657\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002322" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "250" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-196.1773\\-41\\56.01611\\-195.7553\\-41\\56.04325\\-193.8021\\-41\\56.25589\\-191.849\\-41\\56.26966\\-189.8959\\-41\\56.66836\\-187.9428\\-41\\56.96413\\-185.9896\\-41\\56.78977\\-184.0365\\-41\\57.05983\\-182.0834\\-41\\58.15593\\-178.1771\\-41\\58.15593\\-172.3178\\-41\\57.43103\\-170.3646\\-41\\56.88636\\-168.4115\\-41\\57.29911\\-166.4584\\-41\\57.55415\\-164.5053\\-41\\55.19648\\-162.5521\\-41\\55.88193\\-160.599\\-41\\56.3644\\-160.0692\\-41\\58.31752\\-159.7284\\-41\\60.27065\\-161.6609\\-41\\62.22377\\-162.8227\\-41\\64.1769\\-162.8227\\-41\\68.08315\\-163.7728\\-41\\70.03628\\-165.0257\\-41\\71.9894\\-166.0939\\-41\\73.94253\\-167.9649\\-41\\75.89565\\-168.9722\\-41\\77.84878\\-169.1811\\-41\\79.8019\\-170.2728\\-41\\81.75503\\-172.361\\-41\\82.81818\\-174.2709\\-41\\82.83186\\-176.224\\-41\\82.16653\\-178.1771\\-41\\79.8019\\-180.5172\\-41\\77.84878\\-181.3992\\-41\\77.04977\\-182.0834\\-41\\75.12396\\-184.0365\\-41\\74.31666\\-185.9896\\-41\\73.90079\\-187.9428\\-41\\72.95398\\-189.8959\\-41\\71.22108\\-191.849\\-41\\70.03628\\-194.2793\\-41\\68.08315\\-194.6795\\-41\\67.36784\\-193.8021\\-41\\66.13003\\-192.7847\\-41\\64.1769\\-191.5107\\-41\\62.22377\\-191.4797\\-41\\61.76649\\-191.849\\-41\\60.00011\\-193.8021\\-41\\59.11742\\-195.7553\\-41\\58.31752\\-196.5512\\-41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "64" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "251" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-129.1825\\-217.4098\\-39\\-133.0887\\-217.0158\\-39\\-135.0419\\-216.7605\\-39\\-136.995\\-215.8845\\-39\\-138.9481\\-214.3147\\-39\\-140.9012\\-213.341\\-39\\-144.2215\\-211.3803\\-39\\-144.8075\\-210.9643\\-39\\-146.4566\\-209.4271\\-39\\-147.1575\\-207.474\\-39\\-147.636\\-205.5209\\-39\\-147.9468\\-203.5678\\-39\\-147.3954\\-201.6146\\-39\\-146.1321\\-199.6615\\-39\\-146.101\\-195.7553\\-39\\-144.8075\\-194.0275\\-39\\-142.8544\\-195.1795\\-39\\-140.9012\\-197.7311\\-39\\-138.9481\\-197.7606\\-39\\-136.995\\-198.4906\\-39\\-135.0419\\-199.797\\-39\\-133.0887\\-200.5453\\-39\\-131.1356\\-201.4926\\-39\\-129.1825\\-201.8356\\-39\\-127.2293\\-203.3517\\-39\\-126.1513\\-205.5209\\-39\\-125.2762\\-206.432\\-39\\-123.3231\\-208.0622\\-39\\-121.37\\-208.5245\\-39\\-119.4168\\-209.7229\\-39\\-117.4637\\-207.9297\\-39\\-117.1447\\-207.474\\-39\\-116.8385\\-205.5209\\-39\\-118.5913\\-201.6146\\-39\\-118.8949\\-199.6615\\-39\\-118.3355\\-197.7084\\-39\\-113.5575\\-192.9496\\-39\\-111.6043\\-191.6746\\-39\\-107.6981\\-191.3765\\-39\\-105.745\\-191.4647\\-39\\-103.7918\\-192.0622\\-39\\-101.8387\\-192.8515\\-39\\-100.0151\\-193.8021\\-39\\-97.93247\\-195.0103\\-39\\-96.98767\\-195.7553\\-39\\-96.26118\\-197.7084\\-39\\-94.94582\\-199.6615\\-39\\-94.37728\\-201.6146\\-39\\-95.05374\\-203.5678\\-39\\-95.97935\\-204.9324\\-39\\-97.19562\\-207.474\\-39\\-97.93247\\-208.0108\\-39\\-99.8856\\-208.7882\\-39\\-101.8387\\-210.1113\\-39\\-103.7918\\-210.7378\\-39\\-105.745\\-210.9007\\-39\\-107.6981\\-212.1277\\-39\\-109.6512\\-212.927\\-39\\-111.6043\\-214.3944\\-39\\-117.4637\\-216.9805\\-39\\-119.4168\\-218.0877\\-39\\-121.37\\-218.3851\\-39\\-123.3231\\-218.3807\\-39\\-127.2293\\-217.4232\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "252" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-70.58872\\-196.0238\\-39\\-70.81567\\-195.7553\\-39\\-71.52361\\-193.8021\\-39\\-72.72885\\-191.849\\-39\\-73.77373\\-189.8959\\-39\\-75.14374\\-187.9428\\-39\\-78.62978\\-184.0365\\-39\\-80.35435\\-182.6856\\-39\\-82.30747\\-181.4669\\-39\\-84.2606\\-180.714\\-39\\-84.93913\\-180.1303\\-39\\-86.41197\\-178.1771\\-39\\-86.47072\\-176.224\\-39\\-86.21372\\-175.9915\\-39\\-84.2606\\-175.4361\\-39\\-83.54852\\-174.2709\\-39\\-82.30747\\-173.1539\\-39\\-80.35435\\-171.9586\\-39\\-79.04015\\-170.3646\\-39\\-76.4481\\-167.435\\-39\\-73.52367\\-164.5053\\-39\\-72.54185\\-163.6188\\-39\\-70.58872\\-162.6742\\-39\\-68.6356\\-161.6227\\-39\\-66.68247\\-159.8248\\-39\\-64.72935\\-159.7325\\-39\\-63.89164\\-160.599\\-39\\-62.4297\\-162.5521\\-39\\-61.85584\\-164.5053\\-39\\-60.44608\\-166.4584\\-39\\-61.53098\\-168.4115\\-39\\-61.70345\\-170.3646\\-39\\-60.78554\\-172.3178\\-39\\-60.46628\\-174.2709\\-39\\-60.44608\\-178.1771\\-39\\-59.87281\\-180.1303\\-39\\-59.03157\\-182.0834\\-39\\-58.65827\\-184.0365\\-39\\-58.65827\\-185.9896\\-39\\-57.93336\\-187.9428\\-39\\-57.31358\\-189.8959\\-39\\-56.83608\\-191.849\\-39\\-56.0233\\-193.8021\\-39\\-55.51841\\-195.7553\\-39\\-56.91685\\-196.9777\\-39\\-58.86998\\-195.6332\\-39\\-62.51772\\-193.8021\\-39\\-62.77623\\-193.6151\\-39\\-64.72935\\-192.9402\\-39\\-66.16109\\-193.8021\\-39\\-68.6356\\-196.3697\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "253" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-162.7879\\-39\\-39.33873\\-161.746\\-39\\-41.29185\\-161.2786\\-39\\-43.24498\\-159.6401\\-39\\-44.28142\\-158.6459\\-39\\-46.09674\\-156.6928\\-39\\-46.72057\\-154.7396\\-39\\-46.85826\\-152.7865\\-39\\-47.15123\\-152.4292\\-39\\-49.10435\\-150.9419\\-39\\-50.97671\\-152.7865\\-39\\-52.15434\\-154.7396\\-39\\-53.0106\\-155.3682\\-39\\-53.82553\\-154.7396\\-39\\-53.80115\\-152.7865\\-39\\-53.0106\\-151.0078\\-39\\-51.78856\\-148.8803\\-39\\-49.8949\\-146.9271\\-39\\-48.90491\\-144.974\\-39\\-48.82253\\-143.0209\\-39\\-47.95238\\-141.0678\\-39\\-46.85826\\-139.1146\\-39\\-46.45802\\-137.1615\\-39\\-45.64089\\-135.2084\\-39\\-44.02309\\-133.2553\\-39\\-43.24498\\-132.4894\\-39\\-41.29185\\-131.799\\-39\\-39.33873\\-130.5469\\-39\\-37.3856\\-129.8286\\-39\\-33.47935\\-129.4711\\-39\\-31.52623\\-129.5234\\-39\\-29.5731\\-129.6851\\-39\\-27.61998\\-130.0429\\-39\\-25.66685\\-130.6689\\-39\\-23.71373\\-131.6792\\-39\\-21.7606\\-132.4572\\-39\\-19.09031\\-135.2084\\-39\\-18.47914\\-137.1615\\-39\\-17.64116\\-141.0678\\-39\\-16.85518\\-143.0209\\-39\\-15.96781\\-144.974\\-39\\-13.9481\\-147.0131\\-39\\-12.30445\\-148.8803\\-39\\-12.34593\\-150.8334\\-39\\-12.85886\\-152.7865\\-39\\-13.61626\\-154.7396\\-39\\-14.19578\\-154.7396\\-39\\-14.14754\\-152.7865\\-39\\-14.80259\\-150.8334\\-39\\-15.90123\\-150.0927\\-39\\-16.6722\\-150.8334\\-39\\-17.89191\\-152.7865\\-39\\-18.76673\\-154.7396\\-39\\-19.99581\\-156.6928\\-39\\-20.95089\\-158.6459\\-39\\-21.7606\\-159.4556\\-39\\-23.71373\\-160.7075\\-39\\-27.61998\\-162.4996\\-39\\-31.52623\\-163.2152\\-39\\-33.47935\\-163.2352\\-39\\-35.43248\\-162.8882\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "254" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-21.7606\\-229.6212\\-39\\-24.37657\\-227.0053\\-39\\-24.37657\\-225.0521\\-39\\-22.42345\\-223.099\\-39\\-24.37657\\-221.1459\\-39\\-23.71373\\-220.483\\-39\\-21.7606\\-220.483\\-39\\-21.09775\\-221.1459\\-39\\-21.09775\\-223.099\\-39\\-17.1915\\-227.0053\\-39\\-19.80748\\-229.6212\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "255" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-13.9481\\-237.4337\\-39\\-14.61095\\-236.7709\\-39\\-12.65782\\-234.8178\\-39\\-12.65782\\-232.8646\\-39\\-14.61095\\-230.9115\\-39\\-14.61095\\-228.9584\\-39\\-11.99498\\-226.3424\\-39\\-8.088726\\-226.3424\\-39\\-7.425878\\-227.0053\\-39\\-7.425878\\-236.7709\\-39\\-8.088726\\-237.4337\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "256" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "21.20815\\-237.2592\\-39\\19.25502\\-236.4316\\-39\\17.3019\\-234.5248\\-39\\15.34877\\-233.8678\\-39\\13.39565\\-233.3834\\-39\\12.59235\\-232.8646\\-39\\13.04913\\-230.9115\\-39\\13.20368\\-228.9584\\-39\\13.39565\\-228.55\\-39\\15.02951\\-227.0053\\-39\\17.3019\\-226.2083\\-39\\19.25502\\-226.1869\\-39\\23.16127\\-227.9278\\-39\\25.1144\\-228.0937\\-39\\27.06752\\-228.0516\\-39\\28.16195\\-228.9584\\-39\\27.32128\\-230.9115\\-39\\25.1144\\-233.8412\\-39\\24.48661\\-234.8178\\-39\\23.16127\\-236.0676\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "257" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-197.4521\\-39\\54.92309\\-195.7553\\-39\\55.45724\\-193.8021\\-39\\56.25589\\-191.849\\-39\\56.34169\\-187.9428\\-39\\56.60012\\-185.9896\\-39\\56.60012\\-184.0365\\-39\\56.76113\\-182.0834\\-39\\57.38203\\-180.1303\\-39\\58.14314\\-178.1771\\-39\\58.15593\\-172.3178\\-39\\57.19072\\-168.4115\\-39\\57.3649\\-166.4584\\-39\\58.04699\\-164.5053\\-39\\56.97145\\-162.5521\\-39\\56.20281\\-160.599\\-39\\56.3644\\-160.4179\\-39\\58.31752\\-159.7233\\-39\\60.27065\\-161.61\\-39\\62.22377\\-162.3454\\-39\\64.1769\\-162.3583\\-39\\66.13003\\-162.6469\\-39\\70.03628\\-163.8456\\-39\\71.9894\\-165.1365\\-39\\73.94253\\-166.0476\\-39\\75.89565\\-167.1272\\-39\\77.84878\\-167.675\\-39\\79.8019\\-168.7906\\-39\\82.54697\\-172.3178\\-39\\83.02151\\-174.2709\\-39\\82.5782\\-176.224\\-39\\81.75503\\-177.2067\\-39\\79.8019\\-179.079\\-39\\77.84878\\-180.4871\\-39\\75.89565\\-181.3824\\-39\\73.31683\\-184.0365\\-39\\72.44638\\-185.9896\\-39\\72.28632\\-187.9428\\-39\\71.01284\\-189.8959\\-39\\70.03628\\-190.9053\\-39\\68.08315\\-192.2498\\-39\\66.13003\\-191.792\\-39\\64.1769\\-190.9722\\-39\\62.22377\\-190.9025\\-39\\61.17508\\-191.849\\-39\\59.78832\\-193.8021\\-39\\59.05503\\-195.7553\\-39\\58.31752\\-196.5045\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002321" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "258" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-205.8244\\-39\\71.83709\\-201.6146\\-39\\71.72717\\-199.6615\\-39\\71.9894\\-199.4064\\-39\\73.94253\\-199.5988\\-39\\75.89565\\-200.9761\\-39\\77.33986\\-199.6615\\-39\\77.84878\\-199.3857\\-39\\79.8019\\-199.0826\\-39\\83.70815\\-198.9655\\-39\\85.66128\\-200.6855\\-39\\86.9602\\-201.6146\\-39\\87.6144\\-202.6056\\-39\\88.56265\\-203.5678\\-39\\87.6144\\-204.3375\\-39\\85.66128\\-204.4393\\-39\\81.75503\\-204.4393\\-39\\79.8019\\-205.6997\\-39\\77.84878\\-206.1434\\-39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "79" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "259" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-219.0312\\-37\\-125.2762\\-218.5227\\-37\\-127.2293\\-218.3833\\-37\\-129.1825\\-218.364\\-37\\-131.1356\\-217.9039\\-37\\-132.9492\\-217.2396\\-37\\-136.995\\-215.2941\\-37\\-140.9012\\-212.9464\\-37\\-142.8544\\-212.2721\\-37\\-144.8075\\-211.0984\\-37\\-146.1321\\-209.4271\\-37\\-146.1833\\-207.474\\-37\\-146.5249\\-205.5209\\-37\\-147.6042\\-203.5678\\-37\\-147.4559\\-201.6146\\-37\\-146.1321\\-199.6615\\-37\\-146.0786\\-195.7553\\-37\\-144.8075\\-194.4089\\-37\\-142.8544\\-196.4395\\-37\\-140.9012\\-198.1029\\-37\\-138.9481\\-198.1333\\-37\\-136.995\\-198.6901\\-37\\-135.0419\\-200.4459\\-37\\-131.1356\\-201.5199\\-37\\-129.1825\\-202.2716\\-37\\-128.1023\\-203.5678\\-37\\-126.2262\\-205.5209\\-37\\-125.2762\\-206.3736\\-37\\-123.3231\\-207.1485\\-37\\-121.37\\-207.5825\\-37\\-119.4168\\-207.5128\\-37\\-118.5201\\-205.5209\\-37\\-118.5976\\-203.5678\\-37\\-119.1129\\-201.6146\\-37\\-119.3075\\-199.6615\\-37\\-118.2565\\-197.7084\\-37\\-115.5106\\-194.8855\\-37\\-113.5575\\-192.9496\\-37\\-111.6043\\-191.543\\-37\\-107.6981\\-190.5638\\-37\\-105.745\\-190.8777\\-37\\-103.7918\\-191.4773\\-37\\-101.8387\\-191.9304\\-37\\-99.8856\\-192.732\\-37\\-97.93247\\-193.8543\\-37\\-95.97935\\-194.5022\\-37\\-93.36704\\-195.7553\\-37\\-92.0731\\-196.8804\\-37\\-90.11997\\-196.2435\\-37\\-87.67857\\-193.8021\\-37\\-85.83813\\-191.849\\-37\\-84.17182\\-189.8959\\-37\\-82.30747\\-189.419\\-37\\-78.40122\\-189.6029\\-37\\-78.09964\\-189.8959\\-37\\-78.12409\\-193.8021\\-37\\-78.00684\\-195.7553\\-37\\-78.40122\\-197.8711\\-37\\-79.81467\\-199.6615\\-37\\-79.82851\\-203.5678\\-37\\-82.30747\\-205.7256\\-37\\-84.2606\\-205.6051\\-37\\-86.21372\\-204.0041\\-37\\-90.11997\\-203.9863\\-37\\-92.0731\\-205.6914\\-37\\-93.80087\\-207.474\\-37\\-95.97935\\-208.8547\\-37\\-97.93247\\-209.168\\-37\\-99.8856\\-210.2559\\-37\\-101.8387\\-210.7275\\-37\\-103.7918\\-210.9007\\-37\\-105.745\\-211.1933\\-37\\-109.6512\\-214.1472\\-37\\-111.6043\\-214.8069\\-37\\-113.5575\\-216.0414\\-37\\-115.5106\\-216.7688\\-37\\-117.4637\\-217.9936\\-37\\-119.4168\\-218.6874\\-37\\-121.3483\\-219.1928\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "260" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-56.91685\\-197.8528\\-37\\-59.0976\\-195.7553\\-37\\-62.77623\\-193.4831\\-37\\-64.72935\\-192.6271\\-37\\-66.68247\\-192.9678\\-37\\-68.6356\\-194.1684\\-37\\-70.58872\\-192.9984\\-37\\-71.52256\\-191.849\\-37\\-72.46673\\-189.8959\\-37\\-74.49497\\-186.185\\-37\\-76.03642\\-184.0365\\-37\\-76.4481\\-183.6366\\-37\\-80.35435\\-181.101\\-37\\-82.30747\\-180.3893\\-37\\-84.2606\\-179.1306\\-37\\-86.22222\\-178.1771\\-37\\-87.18278\\-176.224\\-37\\-85.39088\\-174.2709\\-37\\-84.2606\\-173.4405\\-37\\-82.30747\\-172.7409\\-37\\-80.35435\\-171.4633\\-37\\-79.30804\\-170.3646\\-37\\-77.92793\\-168.4115\\-37\\-76.72047\\-166.4584\\-37\\-74.49497\\-164.2462\\-37\\-72.54185\\-163.0404\\-37\\-70.58872\\-161.7326\\-37\\-68.6356\\-161.3168\\-37\\-66.68247\\-160.3858\\-37\\-64.72935\\-160.2607\\-37\\-62.36983\\-162.5521\\-37\\-61.85084\\-164.5053\\-37\\-60.8231\\-166.4503\\-37\\-61.79966\\-168.4115\\-37\\-62.09363\\-170.3646\\-37\\-61.6498\\-172.3178\\-37\\-60.47658\\-174.2709\\-37\\-60.45611\\-178.1771\\-37\\-60.17035\\-180.1303\\-37\\-59.63896\\-182.0834\\-37\\-58.67054\\-184.0365\\-37\\-58.65827\\-185.9896\\-37\\-57.84841\\-187.9428\\-37\\-56.93956\\-189.8959\\-37\\-56.82211\\-191.849\\-37\\-55.86255\\-193.8021\\-37\\-54.69739\\-195.7553\\-37\\-54.02353\\-197.7084\\-37\\-54.96373\\-199.2454\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "261" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-162.7996\\-37\\-37.3856\\-162.4292\\-37\\-41.29185\\-160.786\\-37\\-43.24498\\-159.4158\\-37\\-44.04889\\-158.6459\\-37\\-46.39568\\-154.7396\\-37\\-46.84726\\-152.7865\\-37\\-48.25713\\-150.8334\\-37\\-49.10435\\-150.0896\\-37\\-50.22654\\-150.8334\\-37\\-50.97671\\-152.7865\\-37\\-52.3792\\-154.7396\\-37\\-53.0106\\-155.1835\\-37\\-53.55719\\-154.7396\\-37\\-53.81575\\-152.7865\\-37\\-53.0106\\-150.8944\\-37\\-51.77618\\-148.8803\\-37\\-50.03416\\-146.9271\\-37\\-49.11204\\-144.974\\-37\\-48.671\\-143.0209\\-37\\-47.85169\\-141.0678\\-37\\-46.84726\\-139.1146\\-37\\-46.22681\\-137.1615\\-37\\-45.1981\\-135.4245\\-37\\-43.70789\\-133.2553\\-37\\-43.24498\\-132.7983\\-37\\-41.29185\\-131.9118\\-37\\-39.33873\\-130.5257\\-37\\-37.3856\\-129.802\\-37\\-35.43248\\-128.8293\\-37\\-33.47935\\-128.3001\\-37\\-31.52623\\-128.2945\\-37\\-29.5731\\-128.6999\\-37\\-27.61998\\-129.6308\\-37\\-25.66685\\-130.0326\\-37\\-23.71373\\-130.77\\-37\\-21.7606\\-132.4203\\-37\\-18.93371\\-135.2084\\-37\\-18.00296\\-137.1615\\-37\\-17.90653\\-139.1146\\-37\\-17.05706\\-141.0678\\-37\\-16.52976\\-143.0209\\-37\\-15.17651\\-144.974\\-37\\-13.29103\\-146.9271\\-37\\-12.262\\-148.8803\\-37\\-12.69688\\-150.8334\\-37\\-13.08795\\-154.7396\\-37\\-13.9481\\-155.5268\\-37\\-14.67778\\-154.7396\\-37\\-14.1351\\-152.7865\\-37\\-14.22615\\-150.8334\\-37\\-15.90123\\-149.4706\\-37\\-17.2875\\-150.8334\\-37\\-18.16034\\-152.7865\\-37\\-18.85416\\-154.7396\\-37\\-20.62606\\-156.6928\\-37\\-22.18097\\-158.6459\\-37\\-25.66685\\-161.3043\\-37\\-27.61998\\-161.6964\\-37\\-29.5731\\-162.4567\\-37\\-31.52623\\-162.8669\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "262" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.22887\\-238.724\\-37\\17.3019\\-236.797\\-37\\15.34877\\-235.9698\\-37\\13.39565\\-235.4037\\-37\\11.44252\\-234.1687\\-37\\10.19276\\-232.8646\\-37\\10.64013\\-230.9115\\-37\\11.74851\\-228.9584\\-37\\13.39565\\-226.8309\\-37\\15.34877\\-226.467\\-37\\19.25502\\-226.2478\\-37\\21.20815\\-226.2715\\-37\\23.16127\\-226.8814\\-37\\25.1144\\-227.9043\\-37\\27.06752\\-227.9118\\-37\\28.7964\\-228.9584\\-37\\28.54103\\-230.9115\\-37\\25.73149\\-234.8178\\-37\\25.1144\\-235.4667\\-37\\23.16127\\-236.5234\\-37\\21.20815\\-238.0343\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "263" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-199.5235\\-37\\53.26749\\-197.7084\\-37\\53.57496\\-195.7553\\-37\\55.2799\\-193.8021\\-37\\56.25589\\-191.849\\-37\\56.28363\\-187.9428\\-37\\57.02763\\-185.9896\\-37\\57.2319\\-184.0365\\-37\\56.75631\\-182.0834\\-37\\57.35947\\-180.1303\\-37\\58.14314\\-178.1771\\-37\\58.15593\\-172.3178\\-37\\58.0818\\-170.3646\\-37\\57.72286\\-168.4115\\-37\\57.73701\\-166.4584\\-37\\58.11808\\-164.5053\\-37\\57.18272\\-162.5521\\-37\\56.3644\\-160.5245\\-37\\58.31752\\-159.7183\\-37\\60.27065\\-161.37\\-37\\64.1769\\-161.4302\\-37\\66.13003\\-161.7408\\-37\\68.08315\\-162.3713\\-37\\70.03628\\-163.4814\\-37\\72.63463\\-164.5053\\-37\\75.89565\\-165.6953\\-37\\77.84878\\-166.835\\-37\\79.8019\\-167.6489\\-37\\80.53564\\-168.4115\\-37\\81.5193\\-170.3646\\-37\\82.62257\\-172.3178\\-37\\82.55833\\-174.2709\\-37\\81.75503\\-175.3695\\-37\\78.94282\\-178.1771\\-37\\75.89565\\-180.4451\\-37\\73.98009\\-182.0834\\-37\\71.9894\\-184.6648\\-37\\70.81079\\-185.9896\\-37\\70.03628\\-187.3934\\-37\\68.08315\\-189.4607\\-37\\66.13003\\-190.3011\\-37\\64.1769\\-189.8238\\-37\\62.22377\\-189.9035\\-37\\60.27065\\-192.2321\\-37\\59.30334\\-193.8021\\-37\\58.65361\\-195.7553\\-37\\56.3644\\-198.396\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "264" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-213.7995\\-37\\75.32599\\-213.3334\\-37\\74.4308\\-211.3803\\-37\\74.07616\\-209.4271\\-37\\73.01937\\-207.474\\-37\\72.48379\\-205.5209\\-37\\71.75038\\-203.5678\\-37\\70.51546\\-201.6146\\-37\\70.18488\\-199.6615\\-37\\71.9894\\-198.1243\\-37\\73.94253\\-198.2466\\-37\\75.89565\\-199.0709\\-37\\77.84878\\-198.9572\\-37\\79.8019\\-199.0475\\-37\\81.75503\\-198.7263\\-37\\83.36192\\-199.6615\\-37\\83.70815\\-200.0624\\-37\\85.78104\\-201.6146\\-37\\87.6144\\-202.7126\\-37\\88.61024\\-203.5678\\-37\\89.56753\\-205.1324\\-37\\89.95605\\-205.5209\\-37\\91.14334\\-207.474\\-37\\91.52065\\-207.8513\\-37\\92.21238\\-207.474\\-37\\93.47378\\-207.2481\\-37\\93.81393\\-207.474\\-37\\94.20836\\-209.4271\\-37\\93.58503\\-211.3803\\-37\\93.47378\\-212.3568\\-37\\92.67477\\-213.3334\\-37\\91.52065\\-215.147\\-37\\89.54874\\-213.3334\\-37\\89.36484\\-211.3803\\-37\\89.78725\\-209.4271\\-37\\89.56753\\-209.2074\\-37\\87.6144\\-208.3405\\-37\\85.66128\\-208.3725\\-37\\83.70815\\-209.4106\\-37\\81.75503\\-209.9254\\-37\\79.8019\\-210.2664\\-37\\77.84878\\-211.2624\\-37\\77.3605\\-211.3803\\-37\\76.36173\\-213.3334\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002320" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "265" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "87.6144\\-194.0768\\-37\\87.38904\\-193.8021\\-37\\88.67167\\-191.849\\-37\\89.56753\\-191.091\\-37\\90.85798\\-191.849\\-37\\91.52065\\-192.6676\\-37\\92.0564\\-193.8021\\-37\\91.52065\\-194.7098\\-37\\89.56753\\-194.9929\\-37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "90" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "266" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-123.3231\\-219.6781\\-35\\-125.2762\\-218.9337\\-35\\-129.1825\\-218.8888\\-35\\-131.1356\\-218.5187\\-35\\-133.0887\\-217.719\\-35\\-135.0419\\-216.0215\\-35\\-136.995\\-214.9717\\-35\\-138.9481\\-214.0781\\-35\\-140.9012\\-212.9367\\-35\\-142.8544\\-212.5997\\-35\\-144.7113\\-211.3803\\-35\\-145.9468\\-209.4271\\-35\\-146.1321\\-205.5209\\-35\\-146.5131\\-203.5678\\-35\\-146.5489\\-201.6146\\-35\\-146.1251\\-199.6615\\-35\\-146.1043\\-197.7084\\-35\\-145.7338\\-195.7553\\-35\\-144.8075\\-194.9319\\-35\\-142.8544\\-197.5863\\-35\\-140.9012\\-198.7272\\-35\\-138.9481\\-198.8916\\-35\\-137.2946\\-199.6615\\-35\\-135.0419\\-200.9907\\-35\\-133.0887\\-201.4402\\-35\\-131.1356\\-201.5339\\-35\\-129.1825\\-201.9612\\-35\\-127.2669\\-203.5678\\-35\\-125.9587\\-205.5209\\-35\\-125.2762\\-206.1919\\-35\\-123.3231\\-207.012\\-35\\-121.37\\-206.9377\\-35\\-119.4168\\-205.8319\\-35\\-119.135\\-205.5209\\-35\\-119.1694\\-203.5678\\-35\\-120.2248\\-201.6146\\-35\\-120.2616\\-199.6615\\-35\\-119.4168\\-198.8965\\-35\\-117.4637\\-197.7943\\-35\\-116.2377\\-195.7553\\-35\\-113.5575\\-192.9554\\-35\\-111.6043\\-191.1783\\-35\\-109.6512\\-190.3074\\-35\\-107.6981\\-189.7343\\-35\\-105.745\\-190.1451\\-35\\-103.7918\\-190.862\\-35\\-99.8856\\-191.0617\\-35\\-97.93247\\-192.5251\\-35\\-95.97935\\-193.2017\\-35\\-94.02622\\-193.0051\\-35\\-92.0731\\-192.141\\-35\\-89.33598\\-189.8959\\-35\\-88.16685\\-188.7742\\-35\\-86.21372\\-187.924\\-35\\-84.2606\\-186.3664\\-35\\-82.30747\\-186.3567\\-35\\-80.35435\\-186.6385\\-35\\-78.40122\\-187.3481\\-35\\-76.4481\\-187.3781\\-35\\-75.69348\\-187.9428\\-35\\-75.89451\\-189.8959\\-35\\-75.73863\\-193.8021\\-35\\-75.10277\\-195.7553\\-35\\-75.31027\\-197.7084\\-35\\-76.64754\\-199.6615\\-35\\-76.69559\\-203.5678\\-35\\-76.84288\\-205.5209\\-35\\-78.40122\\-207.4483\\-35\\-80.35435\\-209.282\\-35\\-82.30747\\-210.0026\\-35\\-84.2606\\-210.1389\\-35\\-87.67857\\-209.4271\\-35\\-90.11997\\-209.1467\\-35\\-92.0731\\-209.0057\\-35\\-92.86186\\-209.4271\\-35\\-94.02622\\-210.3004\\-35\\-95.97935\\-210.9309\\-35\\-97.93247\\-210.9739\\-35\\-99.8856\\-211.2059\\-35\\-101.8387\\-210.9094\\-35\\-103.7918\\-210.834\\-35\\-105.745\\-212.1018\\-35\\-107.6981\\-213.9302\\-35\\-109.6512\\-214.7483\\-35\\-111.6043\\-215.0047\\-35\\-113.5575\\-216.2529\\-35\\-115.5106\\-217.0402\\-35\\-115.759\\-217.2396\\-35\\-119.2569\\-219.1928\\-35\\-121.37\\-220.0747\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "267" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-54.96373\\-200.9616\\-35\\-56.29595\\-199.6615\\-35\\-57.67428\\-197.7084\\-35\\-59.59977\\-195.7553\\-35\\-61.86001\\-193.8021\\-35\\-62.77623\\-192.9011\\-35\\-64.72935\\-191.6668\\-35\\-66.68247\\-191.6707\\-35\\-68.6356\\-192.15\\-35\\-69.19187\\-191.849\\-35\\-70.58872\\-190.2948\\-35\\-71.56528\\-187.9428\\-35\\-72.9435\\-185.9896\\-35\\-73.67995\\-184.0365\\-35\\-74.49497\\-183.3715\\-35\\-76.4481\\-181.4975\\-35\\-78.40122\\-180.6604\\-35\\-80.35435\\-179.4977\\-35\\-82.30747\\-178.7184\\-35\\-83.27407\\-178.1771\\-35\\-84.38067\\-176.224\\-35\\-83.06852\\-174.2709\\-35\\-79.86026\\-170.3646\\-35\\-79.1896\\-168.4115\\-35\\-77.44578\\-166.4584\\-35\\-73.20489\\-162.5521\\-35\\-72.54185\\-161.8856\\-35\\-70.58872\\-161.3106\\-35\\-68.6356\\-161.061\\-35\\-66.68247\\-160.5913\\-35\\-64.72935\\-160.5176\\-35\\-62.77623\\-161.9594\\-35\\-62.20657\\-162.5521\\-35\\-61.72136\\-164.5053\\-35\\-61.54926\\-166.4584\\-35\\-62.10673\\-168.4115\\-35\\-62.31426\\-170.3646\\-35\\-61.8607\\-172.3178\\-35\\-60.9051\\-174.2709\\-35\\-60.46628\\-176.224\\-35\\-60.39773\\-180.1303\\-35\\-59.85492\\-182.0834\\-35\\-59.01859\\-184.0365\\-35\\-58.68298\\-185.9896\\-35\\-57.15421\\-189.8959\\-35\\-56.82211\\-191.849\\-35\\-55.84214\\-193.8021\\-35\\-54.06648\\-195.7553\\-35\\-53.39754\\-197.7084\\-35\\-53.57134\\-199.6615\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "268" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-161.3586\\-35\\-42.70438\\-158.6459\\-35\\-44.47339\\-156.6928\\-35\\-46.09591\\-154.7396\\-35\\-46.71387\\-152.7865\\-35\\-47.46346\\-150.8334\\-35\\-49.10435\\-149.4706\\-35\\-50.90443\\-150.8334\\-35\\-51.27577\\-152.7865\\-35\\-52.74837\\-154.7396\\-35\\-53.26122\\-154.7396\\-35\\-53.79916\\-152.7865\\-35\\-53.0106\\-150.896\\-35\\-52.635\\-150.8334\\-35\\-51.72565\\-148.8803\\-35\\-50.52324\\-146.9271\\-35\\-49.55927\\-144.974\\-35\\-48.09104\\-143.0209\\-35\\-47.15123\\-140.7805\\-35\\-46.6485\\-139.1146\\-35\\-45.8964\\-137.1615\\-35\\-44.29406\\-135.2084\\-35\\-42.41464\\-133.2553\\-35\\-41.29185\\-132.236\\-35\\-39.33873\\-130.6812\\-35\\-37.3856\\-129.9437\\-35\\-35.43248\\-128.6191\\-35\\-33.47935\\-127.8842\\-35\\-31.52623\\-127.8578\\-35\\-29.5731\\-128.0898\\-35\\-27.61998\\-128.8398\\-35\\-25.66685\\-129.8199\\-35\\-23.71373\\-130.381\\-35\\-20.92836\\-133.2553\\-35\\-18.92436\\-135.2084\\-35\\-17.90653\\-137.1615\\-35\\-17.89191\\-139.1146\\-35\\-16.90338\\-141.0678\\-35\\-16.18305\\-143.0209\\-35\\-14.94932\\-144.974\\-35\\-12.97154\\-146.9271\\-35\\-12.2411\\-148.8803\\-35\\-11.89952\\-150.8334\\-35\\-11.79269\\-152.7865\\-35\\-13.00705\\-154.7396\\-35\\-13.9481\\-155.6219\\-35\\-14.82535\\-154.7396\\-35\\-14.29687\\-152.7865\\-35\\-14.1598\\-150.8334\\-35\\-15.90123\\-149.1732\\-35\\-17.77358\\-150.8334\\-35\\-18.63849\\-152.7865\\-35\\-19.37948\\-154.7396\\-35\\-20.97223\\-156.6928\\-35\\-23.71373\\-159.4323\\-35\\-25.66685\\-160.6938\\-35\\-27.61998\\-161.3106\\-35\\-29.5731\\-161.6804\\-35\\-31.52623\\-162.2179\\-35\\-35.43248\\-162.2071\\-35\\-37.3856\\-161.713\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "269" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-239.6371\\-35\\17.3019\\-238.4071\\-35\\13.39565\\-236.4669\\-35\\11.44252\\-235.3436\\-35\\9.380892\\-232.8646\\-35\\9.761773\\-230.9115\\-35\\10.89999\\-228.9584\\-35\\11.44252\\-228.4701\\-35\\13.39565\\-227.7592\\-35\\15.34877\\-226.6587\\-35\\17.3019\\-226.4055\\-35\\21.20815\\-225.6172\\-35\\23.16127\\-225.9236\\-35\\25.20318\\-227.0053\\-35\\27.06752\\-227.8598\\-35\\29.02065\\-228.3019\\-35\\29.75917\\-228.9584\\-35\\29.55279\\-230.9115\\-35\\27.97433\\-232.8646\\-35\\26.5293\\-234.8178\\-35\\25.1144\\-236.5118\\-35\\23.16127\\-237.5291\\-35\\21.20815\\-239.3961\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "270" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-201.9136\\-35\\53.59747\\-201.6146\\-35\\52.45815\\-199.9956\\-35\\52.36341\\-197.7084\\-35\\53.33706\\-195.7553\\-35\\55.26383\\-193.8021\\-35\\56.25589\\-191.849\\-35\\56.28363\\-187.9428\\-35\\57.22063\\-185.9896\\-35\\57.7793\\-184.0365\\-35\\57.51123\\-182.0834\\-35\\57.76821\\-180.1303\\-35\\58.15593\\-178.1771\\-35\\58.16891\\-170.3646\\-35\\58.10582\\-168.4115\\-35\\58.13052\\-164.5053\\-35\\57.31749\\-162.5521\\-35\\57.2233\\-160.599\\-35\\58.31752\\-160.0584\\-35\\60.27065\\-161.061\\-35\\64.1769\\-161.0873\\-35\\66.13003\\-161.3469\\-35\\68.08315\\-161.4144\\-35\\70.03628\\-162.1307\\-35\\71.9894\\-163.2013\\-35\\73.94253\\-163.7067\\-35\\75.89565\\-164.9122\\-35\\77.84878\\-165.6412\\-35\\79.8019\\-166.8141\\-35\\81.22079\\-168.4115\\-35\\82.55313\\-170.3646\\-35\\82.60838\\-172.3178\\-35\\81.75503\\-173.4959\\-35\\80.85863\\-174.2709\\-35\\76.94675\\-178.1771\\-35\\75.89565\\-179.0117\\-35\\73.94253\\-180.8627\\-35\\71.9894\\-182.478\\-35\\69.76888\\-184.0365\\-35\\68.08315\\-186.4474\\-35\\66.61831\\-187.9428\\-35\\66.13003\\-188.2821\\-35\\64.1769\\-188.3293\\-35\\62.22377\\-188.9602\\-35\\61.30258\\-189.8959\\-35\\60.07121\\-191.849\\-35\\58.31752\\-195.5859\\-35\\57.17006\\-197.7084\\-35\\55.78962\\-199.6615\\-35\\54.7082\\-201.6146\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "271" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "83.70815\\-197.1969\\-35\\82.93191\\-195.7553\\-35\\83.70815\\-194.6741\\-35\\84.81788\\-193.8021\\-35\\85.66128\\-193.622\\-35\\86.85485\\-191.849\\-35\\87.6144\\-191.1654\\-35\\89.56753\\-190.1796\\-35\\91.52065\\-190.451\\-35\\92.70728\\-191.849\\-35\\92.86343\\-193.8021\\-35\\91.52065\\-195.6323\\-35\\89.56753\\-195.6605\\-35\\85.66128\\-196.2834\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002319" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "272" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "87.6144\\-230.2388\\-35\\85.91978\\-228.9584\\-35\\85.71731\\-227.0053\\-35\\83.70815\\-224.9795\\-35\\79.8019\\-224.8611\\-35\\77.84878\\-223.0255\\-35\\76.00873\\-221.1459\\-35\\74.92722\\-219.1928\\-35\\74.13476\\-217.2396\\-35\\72.71243\\-215.2865\\-35\\72.33817\\-213.3334\\-35\\74.01433\\-209.4271\\-35\\73.93465\\-207.474\\-35\\73.04331\\-203.5678\\-35\\71.34611\\-201.6146\\-35\\70.73045\\-199.6615\\-35\\71.9894\\-198.647\\-35\\73.94253\\-198.6292\\-35\\75.89565\\-199.6522\\-35\\77.84878\\-201.0786\\-35\\79.8019\\-200.6496\\-35\\81.25401\\-199.6615\\-35\\81.75503\\-198.7322\\-35\\82.30376\\-199.6615\\-35\\82.78518\\-201.6146\\-35\\83.70815\\-202.9309\\-35\\85.66128\\-203.1446\\-35\\86.27755\\-203.5678\\-35\\87.6144\\-205.0977\\-35\\89.56753\\-207.7792\\-35\\91.32534\\-209.4271\\-35\\92.09264\\-211.3803\\-35\\93.47378\\-213.1381\\-35\\94.11066\\-215.2865\\-35\\95.4269\\-216.9378\\-35\\97.04266\\-219.1928\\-35\\96.71542\\-221.1459\\-35\\96.02049\\-223.099\\-35\\95.4269\\-224.1802\\-35\\95.19438\\-225.0521\\-35\\94.07109\\-227.0053\\-35\\93.47378\\-228.287\\-35\\91.68341\\-228.9584\\-35\\89.56753\\-230.5816\\-35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "94" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "273" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-125.2762\\-219.3414\\-33\\-129.1825\\-218.9811\\-33\\-131.1356\\-218.8998\\-33\\-133.0887\\-217.8853\\-33\\-135.0419\\-215.9915\\-33\\-136.995\\-214.9504\\-33\\-138.9481\\-214.0781\\-33\\-140.9012\\-212.9367\\-33\\-142.8544\\-212.3946\\-33\\-143.9366\\-211.3803\\-33\\-145.2811\\-209.4271\\-33\\-146.0367\\-205.5209\\-33\\-146.1321\\-203.5678\\-33\\-146.0824\\-197.7084\\-33\\-144.8075\\-196.1472\\-33\\-142.8544\\-197.9559\\-33\\-140.9012\\-198.7036\\-33\\-136.995\\-200.4174\\-33\\-135.0419\\-201.3789\\-33\\-133.0887\\-201.5339\\-33\\-131.1356\\-201.5199\\-33\\-129.1825\\-201.2741\\-33\\-127.2293\\-201.4268\\-33\\-126.7598\\-201.6146\\-33\\-125.5307\\-203.5678\\-33\\-125.2762\\-204.1505\\-33\\-124.3322\\-205.5209\\-33\\-123.3231\\-206.2777\\-33\\-121.37\\-206.104\\-33\\-120.6831\\-205.5209\\-33\\-120.6131\\-203.5678\\-33\\-121.37\\-202.2122\\-33\\-121.9766\\-201.6146\\-33\\-120.6297\\-199.6615\\-33\\-119.4168\\-199.2085\\-33\\-117.4637\\-198.6468\\-33\\-116.5253\\-197.7084\\-33\\-114.2613\\-193.8021\\-33\\-111.6043\\-191.0171\\-33\\-109.6512\\-189.7089\\-33\\-105.745\\-189.3403\\-33\\-103.7918\\-189.6673\\-33\\-99.8856\\-189.8437\\-33\\-95.97935\\-191.3452\\-33\\-94.02622\\-191.078\\-33\\-92.0731\\-190.0478\\-33\\-90.11997\\-188.8513\\-33\\-89.36838\\-187.9428\\-33\\-87.50687\\-185.9896\\-33\\-86.21372\\-183.9893\\-33\\-84.2606\\-182.353\\-33\\-82.30747\\-182.8104\\-33\\-80.83612\\-184.0365\\-33\\-80.35435\\-184.2983\\-33\\-78.40122\\-186.0272\\-33\\-76.4481\\-186.1653\\-33\\-74.49497\\-186.4413\\-33\\-73.67226\\-187.9428\\-33\\-74.64359\\-189.8959\\-33\\-74.09286\\-191.849\\-33\\-73.10116\\-193.8021\\-33\\-72.87837\\-195.7553\\-33\\-72.85409\\-197.7084\\-33\\-73.07223\\-199.6615\\-33\\-73.46656\\-201.6146\\-33\\-74.49497\\-203.9625\\-33\\-74.93887\\-205.5209\\-33\\-75.83857\\-207.474\\-33\\-76.4481\\-208.2006\\-33\\-78.40122\\-210.173\\-33\\-80.35435\\-212.0443\\-33\\-82.30747\\-212.8906\\-33\\-84.1835\\-213.3334\\-33\\-86.21372\\-214.0824\\-33\\-88.16685\\-214.1863\\-33\\-89.48808\\-213.3334\\-33\\-90.11997\\-213.0714\\-33\\-92.0731\\-212.5814\\-33\\-94.02622\\-212.56\\-33\\-95.97935\\-212.6978\\-33\\-97.93247\\-212.6573\\-33\\-99.8856\\-212.5172\\-33\\-101.8387\\-211.6124\\-33\\-103.7918\\-211.2175\\-33\\-106.2083\\-213.3334\\-33\\-107.6981\\-214.4307\\-33\\-109.6512\\-214.9825\\-33\\-111.6043\\-215.0274\\-33\\-113.5575\\-216.2682\\-33\\-115.5106\\-217.0652\\-33\\-117.4637\\-218.076\\-33\\-119.4168\\-219.6752\\-33\\-121.37\\-220.2895\\-33\\-123.3231\\-219.7484\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "274" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-54.96373\\-202.3925\\-33\\-55.65693\\-201.6146\\-33\\-56.91685\\-199.3943\\-33\\-57.75587\\-197.7084\\-33\\-61.61751\\-193.8021\\-33\\-62.81692\\-191.849\\-33\\-64.72935\\-190.6218\\-33\\-66.68247\\-189.9035\\-33\\-68.6356\\-188.1451\\-33\\-70.46767\\-185.9896\\-33\\-72.54185\\-183.7442\\-33\\-74.49497\\-182.4217\\-33\\-76.4481\\-180.9667\\-33\\-78.40122\\-179.3165\\-33\\-80.35435\\-178.5465\\-33\\-80.89283\\-178.1771\\-33\\-82.22671\\-176.224\\-33\\-81.60573\\-172.3178\\-33\\-81.18067\\-170.3646\\-33\\-79.87784\\-168.4115\\-33\\-78.68305\\-166.4584\\-33\\-78.40122\\-166.1766\\-33\\-74.49497\\-163.4722\\-33\\-72.54185\\-161.5184\\-33\\-70.58872\\-160.3923\\-33\\-68.6356\\-160.5176\\-33\\-66.68247\\-159.8754\\-33\\-64.72935\\-159.7939\\-33\\-61.91152\\-162.5521\\-33\\-61.15076\\-164.5053\\-33\\-62.29661\\-168.4115\\-33\\-62.36028\\-170.3646\\-33\\-62.12689\\-172.3178\\-33\\-61.65126\\-174.2709\\-33\\-60.46628\\-176.224\\-33\\-60.45611\\-180.1303\\-33\\-59.2669\\-185.9896\\-33\\-58.39346\\-187.9428\\-33\\-56.91685\\-191.7164\\-33\\-55.84214\\-193.8021\\-33\\-53.91166\\-195.7553\\-33\\-53.04816\\-197.7084\\-33\\-53.04816\\-199.6615\\-33\\-53.76918\\-201.6146\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "58" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "275" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-161.1403\\-33\\-38.84293\\-160.599\\-33\\-41.29185\\-159.4142\\-33\\-44.04049\\-156.6928\\-33\\-45.29284\\-154.7396\\-33\\-46.24857\\-152.7865\\-33\\-46.76184\\-150.8334\\-33\\-47.15123\\-150.381\\-33\\-49.10435\\-149.1508\\-33\\-50.96273\\-150.8334\\-33\\-52.3475\\-152.7865\\-33\\-53.0106\\-153.3519\\-33\\-53.38102\\-152.7865\\-33\\-53.0106\\-150.9961\\-33\\-52.46807\\-150.8334\\-33\\-50.89589\\-146.9271\\-33\\-49.3189\\-144.974\\-33\\-47.28666\\-143.0209\\-33\\-46.65713\\-141.0678\\-33\\-46.12841\\-139.1146\\-33\\-45.1981\\-137.4312\\-33\\-43.68829\\-135.2084\\-33\\-41.29185\\-132.8233\\-33\\-39.33873\\-131.619\\-33\\-37.3856\\-130.3114\\-33\\-35.43248\\-128.7742\\-33\\-33.47935\\-128.0049\\-33\\-31.52623\\-127.8118\\-33\\-29.5731\\-127.8306\\-33\\-27.61998\\-128.5794\\-33\\-25.66685\\-129.7929\\-33\\-23.71373\\-130.0122\\-33\\-22.27795\\-131.3021\\-33\\-20.9067\\-133.2553\\-33\\-18.92436\\-135.2084\\-33\\-17.90653\\-137.1615\\-33\\-17.58382\\-139.1146\\-33\\-16.12502\\-143.0209\\-33\\-14.70356\\-144.974\\-33\\-12.56649\\-146.9271\\-33\\-12.19843\\-148.8803\\-33\\-11.35688\\-150.8334\\-33\\-11.22344\\-152.7865\\-33\\-13.9481\\-155.5176\\-33\\-14.93164\\-154.7396\\-33\\-14.65225\\-152.7865\\-33\\-14.1598\\-150.8334\\-33\\-15.94602\\-148.8803\\-33\\-17.86198\\-150.8334\\-33\\-18.74681\\-152.7865\\-33\\-20.57584\\-154.7396\\-33\\-21.7606\\-156.3061\\-33\\-24.13324\\-158.6459\\-33\\-25.66685\\-159.7348\\-33\\-27.61998\\-160.6366\\-33\\-29.5731\\-161.3043\\-33\\-31.52623\\-161.425\\-33\\-35.43248\\-161.4197\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "276" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "15.34877\\-239.1022\\-33\\13.39565\\-237.9395\\-33\\11.85485\\-236.7709\\-33\\10.44438\\-234.8178\\-33\\9.315013\\-232.8646\\-33\\9.598716\\-230.9115\\-33\\10.95786\\-228.9584\\-33\\11.44252\\-228.552\\-33\\13.39565\\-228.0795\\-33\\15.34877\\-227.354\\-33\\17.3019\\-226.4055\\-33\\19.25502\\-225.9254\\-33\\21.20815\\-224.6751\\-33\\25.1144\\-225.975\\-33\\29.02065\\-227.4666\\-33\\30.97377\\-228.9288\\-33\\29.02065\\-232.8121\\-33\\27.81247\\-234.8178\\-33\\26.42274\\-236.7709\\-33\\25.1144\\-237.9048\\-33\\21.20815\\-240.0244\\-33\\19.25502\\-240.0486\\-33\\17.3019\\-239.77\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "277" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.34964\\-201.6146\\-33\\52.27115\\-199.6615\\-33\\52.55289\\-197.7084\\-33\\53.46571\\-195.7553\\-33\\55.12597\\-193.8021\\-33\\55.93793\\-191.849\\-33\\56.25589\\-189.8959\\-33\\56.28363\\-187.9428\\-33\\58.11808\\-184.0365\\-33\\58.05844\\-182.0834\\-33\\58.15593\\-178.1771\\-33\\58.15593\\-174.2709\\-33\\58.50452\\-172.3178\\-33\\58.50452\\-170.3646\\-33\\58.16891\\-168.4115\\-33\\58.15593\\-164.5053\\-33\\57.79557\\-162.5521\\-33\\58.31752\\-161.8589\\-33\\60.27065\\-160.9957\\-33\\64.1769\\-160.319\\-33\\68.08315\\-160.4182\\-33\\70.03628\\-160.8714\\-33\\71.9894\\-161.634\\-33\\73.94253\\-162.7928\\-33\\75.89565\\-163.5897\\-33\\77.84878\\-164.8691\\-33\\79.8019\\-165.6863\\-33\\81.75503\\-167.5254\\-33\\82.48745\\-168.4115\\-33\\82.84544\\-170.3646\\-33\\81.88372\\-172.3178\\-33\\79.8019\\-173.6295\\-33\\77.84878\\-175.579\\-33\\75.89565\\-177.4045\\-33\\74.66261\\-178.1771\\-33\\73.94253\\-178.8561\\-33\\71.9894\\-180.211\\-33\\70.03628\\-180.8627\\-33\\68.08315\\-183.0457\\-33\\66.13003\\-184.6414\\-33\\64.1769\\-186.0129\\-33\\62.22377\\-187.609\\-33\\60.27065\\-191.4682\\-33\\59.16356\\-193.8021\\-33\\58.14314\\-195.7553\\-33\\56.3644\\-199.3952\\-33\\55.35366\\-201.6146\\-33\\54.41127\\-202.8796\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "18" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "278" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "79.8019\\-197.4398\\-33\\78.11733\\-195.7553\\-33\\78.22855\\-193.8021\\-33\\79.8019\\-192.7979\\-33\\81.75503\\-192.1081\\-33\\83.70815\\-192.1745\\-33\\85.66128\\-191.8261\\-33\\87.6144\\-190.6442\\-33\\89.56753\\-189.6842\\-33\\91.52065\\-190.1349\\-33\\93.47378\\-191.1016\\-33\\93.93442\\-191.849\\-33\\92.93954\\-193.8021\\-33\\91.52065\\-195.3891\\-33\\89.56753\\-195.7629\\-33\\87.6144\\-196.4263\\-33\\85.66128\\-197.3573\\-33\\83.70815\\-198.0123\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "279" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "81.75503\\-249.0608\\-33\\81.15356\\-248.4896\\-33\\80.59066\\-246.5365\\-33\\79.8019\\-245.56\\-33\\79.27152\\-244.5834\\-33\\77.69067\\-242.6303\\-33\\76.53547\\-238.724\\-33\\77.23124\\-236.7709\\-33\\76.4201\\-234.8178\\-33\\74.38197\\-232.8646\\-33\\74.62612\\-230.9115\\-33\\75.09541\\-228.9584\\-33\\75.30634\\-227.0053\\-33\\75.22546\\-225.0521\\-33\\74.67494\\-223.099\\-33\\75.33533\\-221.1459\\-33\\75.56055\\-219.1928\\-33\\75.63273\\-217.2396\\-33\\75.60352\\-215.2865\\-33\\75.76389\\-213.3334\\-33\\77.23124\\-211.3803\\-33\\77.46664\\-209.4271\\-33\\77.12178\\-207.474\\-33\\75.89565\\-205.8976\\-33\\75.89565\\-205.0814\\-33\\77.25117\\-203.5678\\-33\\79.8019\\-202.2848\\-33\\80.48346\\-203.5678\\-33\\81.75503\\-205.0039\\-33\\83.70815\\-205.2409\\-33\\84.63929\\-205.5209\\-33\\85.66128\\-206.5672\\-33\\85.94763\\-207.474\\-33\\86.01722\\-209.4271\\-33\\86.8657\\-211.3803\\-33\\87.6144\\-212.1548\\-33\\87.97801\\-213.3334\\-33\\88.98159\\-215.2865\\-33\\89.56753\\-215.8725\\-33\\90.02325\\-217.2396\\-33\\91.52065\\-218.737\\-33\\91.83713\\-219.1928\\-33\\92.2802\\-221.1459\\-33\\92.9448\\-223.099\\-33\\93.47378\\-223.628\\-33\\93.71792\\-225.0521\\-33\\93.74081\\-232.8646\\-33\\93.55515\\-234.8178\\-33\\91.99537\\-236.7709\\-33\\91.52065\\-237.9102\\-33\\90.70685\\-238.724\\-33\\90.20048\\-240.6771\\-33\\90.04893\\-242.6303\\-33\\89.56753\\-243.3898\\-33\\85.66128\\-247.0323\\-33\\83.70815\\-249.1578\\-33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "89" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "280" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-219.6928\\-31\\-129.1825\\-218.6723\\-31\\-131.1356\\-218.524\\-31\\-133.0887\\-217.7514\\-31\\-135.0419\\-215.9915\\-31\\-136.995\\-214.9504\\-31\\-138.9481\\-214.0781\\-31\\-140.9012\\-212.9367\\-31\\-142.8544\\-211.9764\\-31\\-143.4505\\-211.3803\\-31\\-144.1057\\-209.4271\\-31\\-144.5837\\-207.474\\-31\\-145.6569\\-205.5209\\-31\\-146.0306\\-203.5678\\-31\\-146.1181\\-201.6146\\-31\\-146.0786\\-197.7084\\-31\\-144.8075\\-196.4851\\-31\\-142.8544\\-197.9559\\-31\\-140.9012\\-198.6382\\-31\\-138.883\\-199.6615\\-31\\-135.0419\\-201.1442\\-31\\-133.0887\\-201.2057\\-31\\-131.1356\\-201.0489\\-31\\-129.1825\\-200.6632\\-31\\-127.2293\\-200.4288\\-31\\-125.2762\\-200.4878\\-31\\-123.3231\\-200.1997\\-31\\-121.37\\-199.6991\\-31\\-119.4168\\-199.6239\\-31\\-117.4637\\-198.8394\\-31\\-116.2655\\-197.7084\\-31\\-114.578\\-195.7553\\-31\\-113.7445\\-193.8021\\-31\\-112.451\\-191.849\\-31\\-111.6043\\-191.0023\\-31\\-109.6512\\-189.5189\\-31\\-107.6981\\-189.0296\\-31\\-105.745\\-188.6928\\-31\\-101.8387\\-188.6951\\-31\\-99.8856\\-189.0489\\-31\\-97.93247\\-189.7089\\-31\\-95.97935\\-190.1316\\-31\\-94.02622\\-189.5598\\-31\\-92.0731\\-189.1843\\-31\\-90.11997\\-189.0322\\-31\\-89.07288\\-187.9428\\-31\\-87.44096\\-185.9896\\-31\\-85.9319\\-182.0834\\-31\\-84.2606\\-180.6604\\-31\\-82.30747\\-180.4558\\-31\\-80.35435\\-181.0629\\-31\\-79.73653\\-182.0834\\-31\\-77.74393\\-184.0365\\-31\\-76.4481\\-185.0732\\-31\\-74.49497\\-185.0459\\-31\\-72.99659\\-185.9896\\-31\\-72.57941\\-187.9428\\-31\\-72.63659\\-189.8959\\-31\\-71.31686\\-191.849\\-31\\-70.82445\\-193.8021\\-31\\-70.80043\\-195.7553\\-31\\-71.21017\\-199.6615\\-31\\-71.63504\\-201.6146\\-31\\-72.70344\\-203.5678\\-31\\-73.58108\\-205.5209\\-31\\-75.78197\\-209.4271\\-31\\-77.59383\\-211.3803\\-31\\-80.35435\\-213.794\\-31\\-82.30747\\-214.6583\\-31\\-84.21257\\-215.2865\\-31\\-86.21372\\-216.0712\\-31\\-88.16685\\-216.3721\\-31\\-90.11997\\-215.6844\\-31\\-92.0731\\-214.8136\\-31\\-94.02622\\-214.1318\\-31\\-95.97935\\-214.1618\\-31\\-97.93247\\-214.0367\\-31\\-99.8856\\-213.159\\-31\\-101.8387\\-212.9766\\-31\\-103.7918\\-213.3613\\-31\\-105.745\\-214.4544\\-31\\-107.6981\\-214.7982\\-31\\-109.6512\\-215.0047\\-31\\-111.6043\\-215.016\\-31\\-113.5575\\-216.103\\-31\\-117.4637\\-217.5862\\-31\\-121.37\\-219.6896\\-31\\-123.3231\\-219.2303\\-31\\-125.2762\\-219.9428\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "281" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-54.96373\\-203.7509\\-31\\-56.78141\\-199.6615\\-31\\-57.76504\\-197.7084\\-31\\-59.73958\\-195.7553\\-31\\-61.10683\\-193.8021\\-31\\-61.91074\\-191.849\\-31\\-62.77623\\-190.9077\\-31\\-64.72935\\-189.4895\\-31\\-66.68247\\-188.5299\\-31\\-70.58872\\-184.6664\\-31\\-72.54185\\-183.5101\\-31\\-73.51841\\-182.0834\\-31\\-74.49497\\-181.2054\\-31\\-76.4481\\-180.7151\\-31\\-78.40122\\-179.4772\\-31\\-80.35435\\-177.767\\-31\\-81.42586\\-176.224\\-31\\-81.82787\\-174.2709\\-31\\-81.79379\\-172.3178\\-31\\-81.59946\\-170.3646\\-31\\-81.15025\\-168.4115\\-31\\-79.4509\\-166.4584\\-31\\-76.4481\\-163.8098\\-31\\-74.7307\\-162.5521\\-31\\-72.54185\\-160.4066\\-31\\-70.58872\\-159.4619\\-31\\-68.6356\\-159.7387\\-31\\-66.68247\\-159.7262\\-31\\-64.72935\\-159.5576\\-31\\-62.77623\\-161.5088\\-31\\-61.90291\\-162.5521\\-31\\-61.22522\\-164.5053\\-31\\-62.34154\\-168.4115\\-31\\-62.33233\\-172.3178\\-31\\-61.7668\\-174.2709\\-31\\-60.46628\\-176.224\\-31\\-60.46628\\-180.1303\\-31\\-60.81547\\-182.0834\\-31\\-60.27378\\-184.0365\\-31\\-60.19531\\-185.9896\\-31\\-59.8581\\-187.9428\\-31\\-57.88843\\-189.8959\\-31\\-55.84214\\-193.8021\\-31\\-54.03829\\-195.7553\\-31\\-53.26969\\-197.7084\\-31\\-53.00297\\-199.6615\\-31\\-53.05666\\-201.6146\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "57" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "282" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-159.4514\\-31\\-41.29185\\-158.1486\\-31\\-43.24498\\-156.2358\\-31\\-44.46059\\-154.7396\\-31\\-45.50206\\-152.7865\\-31\\-46.26005\\-150.8334\\-31\\-47.15123\\-149.7388\\-31\\-49.10435\\-148.8879\\-31\\-51.05748\\-150.9863\\-31\\-52.46807\\-150.8334\\-31\\-51.9134\\-148.8803\\-31\\-51.05748\\-146.808\\-31\\-47.15123\\-143.6895\\-31\\-46.63997\\-143.0209\\-31\\-46.11813\\-141.0678\\-31\\-44.99866\\-139.1146\\-31\\-44.17576\\-137.1615\\-31\\-42.40722\\-135.2084\\-31\\-39.33873\\-132.2182\\-31\\-37.3856\\-130.516\\-31\\-35.27766\\-129.349\\-31\\-33.47935\\-128.5388\\-31\\-31.52623\\-128.1554\\-31\\-29.5731\\-128.1484\\-31\\-27.61998\\-128.7584\\-31\\-25.66685\\-129.7837\\-31\\-23.71373\\-129.811\\-31\\-21.7606\\-130.9452\\-31\\-21.42451\\-131.3021\\-31\\-20.78873\\-133.2553\\-31\\-18.91927\\-135.2084\\-31\\-17.85435\\-137.241\\-31\\-17.07215\\-139.1146\\-31\\-16.56407\\-141.0678\\-31\\-15.77916\\-143.0209\\-31\\-13.9481\\-144.9816\\-31\\-12.26551\\-146.9271\\-31\\-12.17466\\-148.8803\\-31\\-11.29743\\-150.8334\\-31\\-11.50302\\-152.7865\\-31\\-11.99498\\-153.1929\\-31\\-13.9481\\-154.211\\-31\\-14.76533\\-152.7865\\-31\\-14.38279\\-150.8334\\-31\\-15.36007\\-148.8803\\-31\\-15.90123\\-148.3715\\-31\\-16.76818\\-148.8803\\-31\\-17.85435\\-150.2277\\-31\\-18.16916\\-150.8334\\-31\\-18.8496\\-152.7865\\-31\\-23.71373\\-157.717\\-31\\-25.66685\\-159.3539\\-31\\-27.61998\\-159.7187\\-31\\-29.5731\\-160.3427\\-31\\-31.52623\\-160.3923\\-31\\-35.43248\\-160.3672\\-31\\-37.3856\\-159.7738\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "283" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "13.39565\\-238.9597\\-31\\11.44252\\-237.5856\\-31\\10.6466\\-236.7709\\-31\\9.866426\\-234.8178\\-31\\9.58414\\-232.8646\\-31\\10.31266\\-230.9115\\-31\\12.01738\\-228.9584\\-31\\13.39565\\-228.0947\\-31\\17.3019\\-226.4204\\-31\\19.25502\\-225.912\\-31\\21.20815\\-224.3524\\-31\\23.16127\\-224.3463\\-31\\27.06752\\-225.3581\\-31\\29.02065\\-225.577\\-31\\31.37942\\-227.0053\\-31\\32.42626\\-228.9584\\-31\\31.35626\\-230.9115\\-31\\30.60756\\-232.8646\\-31\\29.36881\\-234.8178\\-31\\27.81126\\-236.7709\\-31\\27.06752\\-237.4728\\-31\\25.1144\\-238.7906\\-31\\23.16127\\-239.6912\\-31\\21.20815\\-239.9238\\-31\\17.3019\\-240.2242\\-31\\15.34877\\-239.8147\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "284" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-205.1077\\-31\\52.84725\\-203.5678\\-31\\52.28376\\-201.6146\\-31\\52.27115\\-199.6615\\-31\\53.8946\\-195.7553\\-31\\54.85517\\-193.8021\\-31\\56.25589\\-189.8959\\-31\\56.28363\\-187.9428\\-31\\58.15593\\-184.0365\\-31\\58.15593\\-174.2709\\-31\\59.06606\\-172.3178\\-31\\59.15105\\-170.3646\\-31\\58.71425\\-168.4115\\-31\\58.68687\\-162.5521\\-31\\60.27065\\-160.8599\\-31\\62.22377\\-159.7708\\-31\\64.1769\\-159.4514\\-31\\70.03628\\-159.4567\\-31\\71.9894\\-160.1437\\-31\\72.69869\\-160.599\\-31\\75.89565\\-162.2024\\-31\\79.8019\\-165.0333\\-31\\81.75503\\-166.1766\\-31\\82.04069\\-166.4584\\-31\\82.87807\\-168.4115\\-31\\82.66936\\-170.3646\\-31\\81.75503\\-171.3839\\-31\\79.8019\\-172.9037\\-31\\77.84878\\-175.1852\\-31\\75.89565\\-176.7036\\-31\\73.94253\\-176.7036\\-31\\71.9894\\-176.8089\\-31\\70.40326\\-178.1771\\-31\\69.19024\\-180.1303\\-31\\68.08315\\-181.3523\\-31\\66.13003\\-183.028\\-31\\62.22377\\-185.121\\-31\\61.33549\\-185.9896\\-31\\60.58546\\-189.8959\\-31\\59.74481\\-191.849\\-31\\59.06133\\-193.8021\\-31\\58.14314\\-195.7553\\-31\\56.3644\\-200.101\\-31\\55.83943\\-201.6146\\-31\\55.67833\\-203.5678\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002317" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "24" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "285" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-199.2474\\-31\\74.0535\\-197.7084\\-31\\73.55559\\-195.7553\\-31\\73.94253\\-195.1338\\-31\\74.24147\\-193.8021\\-31\\75.89565\\-191.738\\-31\\77.84878\\-191.8566\\-31\\79.8019\\-191.7004\\-31\\83.70815\\-191.6874\\-31\\85.66128\\-191.0043\\-31\\87.6144\\-190.1316\\-31\\89.56753\\-190.1244\\-31\\91.52065\\-190.8572\\-31\\93.47378\\-191.4362\\-31\\93.76603\\-191.849\\-31\\92.53769\\-193.8021\\-31\\91.52065\\-194.8298\\-31\\89.56753\\-195.778\\-31\\87.6144\\-196.0592\\-31\\85.66128\\-196.8476\\-31\\83.70815\\-197.4727\\-31\\81.75503\\-197.1921\\-31\\79.8019\\-198.3816\\-31\\77.84878\\-199.2474\\-31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "139" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "286" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-127.2293\\-219.3881\\-29\\-129.1825\\-217.7076\\-29\\-131.1356\\-217.5695\\-29\\-133.0887\\-217.2623\\-29\\-135.0419\\-216.1757\\-29\\-138.9481\\-214.2551\\-29\\-140.9012\\-213.1848\\-29\\-142.5838\\-211.3803\\-29\\-143.7007\\-209.4271\\-29\\-144.5484\\-205.5209\\-29\\-145.6394\\-203.5678\\-29\\-146.0233\\-201.6146\\-29\\-146.0464\\-199.6615\\-29\\-145.6587\\-197.7084\\-29\\-144.8075\\-196.8956\\-29\\-142.8544\\-198.2997\\-29\\-140.9012\\-199.1202\\-29\\-138.9202\\-199.6615\\-29\\-136.995\\-200.0775\\-29\\-135.0419\\-200.6522\\-29\\-133.0887\\-200.7648\\-29\\-131.1356\\-200.3177\\-29\\-129.1825\\-200.1172\\-29\\-125.2762\\-200.3819\\-29\\-123.3231\\-199.7281\\-29\\-119.4168\\-199.6842\\-29\\-117.4637\\-199.3127\\-29\\-115.5106\\-197.4582\\-29\\-113.5575\\-194.4404\\-29\\-113.0632\\-193.8021\\-29\\-112.2835\\-191.849\\-29\\-109.6512\\-189.3186\\-29\\-107.6981\\-188.6497\\-29\\-105.745\\-187.7433\\-29\\-101.8387\\-187.7558\\-29\\-99.8856\\-188.7409\\-29\\-97.93247\\-189.3932\\-29\\-95.97935\\-189.6721\\-29\\-94.02622\\-189.4163\\-29\\-92.0731\\-189.3546\\-29\\-90.11997\\-189.4134\\-29\\-88.16685\\-188.1985\\-29\\-87.93829\\-187.9428\\-29\\-86.97095\\-185.9896\\-29\\-85.76984\\-184.0365\\-29\\-85.34517\\-182.0834\\-29\\-84.2606\\-180.5551\\-29\\-82.30747\\-178.4983\\-29\\-81.75746\\-178.1771\\-29\\-81.58187\\-176.224\\-29\\-81.82787\\-174.2709\\-29\\-82.26991\\-172.3178\\-29\\-82.47636\\-170.3646\\-29\\-81.70446\\-168.4115\\-29\\-80.70771\\-166.4584\\-29\\-80.35435\\-166.1119\\-29\\-78.40122\\-164.8563\\-29\\-76.4481\\-163.446\\-29\\-73.58817\\-160.599\\-29\\-72.54185\\-159.6563\\-29\\-70.58872\\-159.176\\-29\\-68.6356\\-159.552\\-29\\-66.68247\\-159.6225\\-29\\-64.72935\\-159.3055\\-29\\-62.8992\\-160.599\\-29\\-62.30538\\-162.5521\\-29\\-62.41241\\-164.5053\\-29\\-62.32963\\-166.4584\\-29\\-62.36028\\-172.3178\\-29\\-61.87077\\-174.2709\\-29\\-60.98705\\-176.224\\-29\\-60.46628\\-178.1771\\-29\\-60.48701\\-180.1303\\-29\\-61.40361\\-182.0834\\-29\\-61.33678\\-185.9896\\-29\\-61.00002\\-187.9428\\-29\\-58.86998\\-189.3262\\-29\\-58.19538\\-189.8959\\-29\\-56.82211\\-191.849\\-29\\-55.97481\\-193.8021\\-29\\-54.7128\\-195.7553\\-29\\-53.352\\-199.6615\\-29\\-53.00297\\-201.6146\\-29\\-53.65265\\-205.5209\\-29\\-54.10408\\-207.474\\-29\\-54.96373\\-208.9447\\-29\\-56.68303\\-207.474\\-29\\-57.83916\\-205.5209\\-29\\-56.76494\\-203.5678\\-29\\-56.716\\-201.6146\\-29\\-56.83393\\-199.6615\\-29\\-57.8499\\-197.7084\\-29\\-59.73958\\-195.7553\\-29\\-60.49758\\-193.8021\\-29\\-61.7668\\-191.849\\-29\\-62.77623\\-190.689\\-29\\-66.68247\\-187.2467\\-29\\-68.6356\\-185.1923\\-29\\-70.58872\\-183.2676\\-29\\-72.54185\\-182.4605\\-29\\-72.81197\\-182.0834\\-29\\-74.49497\\-180.9693\\-29\\-76.4481\\-180.8152\\-29\\-78.20403\\-182.0834\\-29\\-76.4481\\-183.928\\-29\\-74.49497\\-184.2497\\-29\\-72.54185\\-185.4969\\-29\\-72.19533\\-185.9896\\-29\\-71.60244\\-187.9428\\-29\\-70.40759\\-189.8959\\-29\\-69.31756\\-191.849\\-29\\-68.8763\\-195.7553\\-29\\-69.35323\\-197.7084\\-29\\-69.95803\\-199.6615\\-29\\-70.66949\\-201.6146\\-29\\-72.66392\\-205.5209\\-29\\-73.54439\\-207.474\\-29\\-75.73962\\-211.3803\\-29\\-76.4481\\-212.0707\\-29\\-78.40122\\-213.0516\\-29\\-80.35435\\-214.4009\\-29\\-82.30747\\-215.9606\\-29\\-84.2606\\-216.4498\\-29\\-88.16685\\-216.9691\\-29\\-92.0731\\-216.4129\\-29\\-94.02622\\-215.7748\\-29\\-95.97935\\-215.3408\\-29\\-97.93247\\-215.2039\\-29\\-99.8856\\-214.2021\\-29\\-101.8387\\-214.1805\\-29\\-103.7918\\-214.7615\\-29\\-105.745\\-214.9717\\-29\\-111.6043\\-215.0047\\-29\\-113.5575\\-215.5239\\-29\\-115.5106\\-216.3011\\-29\\-117.4637\\-216.6363\\-29\\-121.37\\-218.796\\-29\\-123.3231\\-218.9933\\-29\\-125.2762\\-219.9931\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "287" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-158.8329\\-29\\-41.29185\\-157.4291\\-29\\-44.01146\\-154.7396\\-29\\-45.50409\\-150.8334\\-29\\-46.72636\\-148.8803\\-29\\-47.15123\\-148.4554\\-29\\-49.10435\\-148.323\\-29\\-49.71157\\-148.8803\\-29\\-51.05748\\-150.6596\\-29\\-52.44794\\-148.8803\\-29\\-51.81953\\-146.9271\\-29\\-51.05748\\-146.1562\\-29\\-49.10435\\-145.2792\\-29\\-47.15123\\-144.0797\\-29\\-46.24071\\-143.0209\\-29\\-45.1981\\-140.9655\\-29\\-43.36705\\-137.1615\\-29\\-42.13788\\-135.2084\\-29\\-37.3856\\-130.5278\\-29\\-35.43248\\-129.7837\\-29\\-33.47935\\-129.4575\\-29\\-31.52623\\-129.0213\\-29\\-29.5731\\-128.8293\\-29\\-27.61998\\-129.1874\\-29\\-25.66685\\-129.7837\\-29\\-23.71373\\-129.802\\-29\\-21.7606\\-130.5762\\-29\\-21.0609\\-131.3021\\-29\\-20.36789\\-133.2553\\-29\\-18.89936\\-135.2084\\-29\\-16.90338\\-139.1146\\-29\\-16.13695\\-141.0678\\-29\\-15.18139\\-143.0209\\-29\\-13.46939\\-144.974\\-29\\-12.46539\\-146.9271\\-29\\-11.88647\\-148.8803\\-29\\-11.68485\\-150.8334\\-29\\-11.99498\\-151.3491\\-29\\-13.84903\\-152.7865\\-29\\-14.00507\\-152.7865\\-29\\-14.67919\\-150.8334\\-29\\-15.65203\\-148.8803\\-29\\-15.90123\\-148.6146\\-29\\-17.85435\\-148.9837\\-29\\-18.62507\\-150.8334\\-29\\-19.18269\\-152.7865\\-29\\-20.75573\\-154.7396\\-29\\-23.71373\\-157.5982\\-29\\-25.66685\\-158.7813\\-29\\-27.61998\\-159.3476\\-29\\-29.5731\\-159.452\\-29\\-35.43248\\-159.452\\-29\\-37.3856\\-159.3783\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "288" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "15.34877\\-239.3692\\-29\\13.39565\\-238.2391\\-29\\11.44252\\-237.7928\\-29\\10.24829\\-236.7709\\-29\\9.367329\\-234.8178\\-29\\10.06285\\-232.8646\\-29\\11.18166\\-230.9115\\-29\\12.6981\\-228.9584\\-29\\13.39565\\-228.3855\\-29\\15.34877\\-227.7235\\-29\\17.3019\\-226.7013\\-29\\19.25502\\-225.965\\-29\\21.20815\\-224.2344\\-29\\23.16127\\-223.9589\\-29\\29.02065\\-223.5282\\-29\\30.97377\\-224.3023\\-29\\31.81362\\-225.0521\\-29\\32.9269\\-225.4738\\-29\\34.33071\\-227.0053\\-29\\34.34568\\-228.9584\\-29\\33.27812\\-230.9115\\-29\\32.51946\\-232.8646\\-29\\31.52018\\-234.8178\\-29\\30.97377\\-235.1629\\-29\\29.02065\\-236.8251\\-29\\27.06752\\-237.938\\-29\\25.1144\\-238.1484\\-29\\23.16127\\-238.6441\\-29\\21.20815\\-238.7318\\-29\\17.3019\\-239.7875\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "289" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-208.4091\\-29\\53.34546\\-207.474\\-29\\52.88194\\-203.5678\\-29\\52.86768\\-199.6615\\-29\\53.46507\\-197.7084\\-29\\55.85613\\-191.849\\-29\\56.25589\\-189.8959\\-29\\56.28363\\-187.9428\\-29\\58.15593\\-184.0365\\-29\\58.15593\\-176.224\\-29\\58.52923\\-174.2709\\-29\\59.32267\\-172.3178\\-29\\59.60761\\-170.3646\\-29\\59.41675\\-168.4115\\-29\\59.42618\\-162.5521\\-29\\60.13422\\-160.599\\-29\\62.22377\\-159.3902\\-29\\64.1769\\-159.1596\\-29\\66.13003\\-159.1512\\-29\\68.08315\\-158.7125\\-29\\70.03628\\-158.8453\\-29\\73.94253\\-159.8\\-29\\75.89565\\-161.2234\\-29\\77.84878\\-162.2334\\-29\\79.8019\\-163.6743\\-29\\81.75503\\-165.4409\\-29\\82.64648\\-166.4584\\-29\\83.00285\\-168.4115\\-29\\81.79572\\-170.3646\\-29\\79.8019\\-171.607\\-29\\79.07087\\-172.3178\\-29\\77.8409\\-174.2709\\-29\\77.28845\\-176.224\\-29\\75.89565\\-177.2006\\-29\\73.94253\\-176.7041\\-29\\71.9894\\-177.0067\\-29\\70.03628\\-179.1818\\-29\\69.29144\\-180.1303\\-29\\68.08315\\-181.1735\\-29\\66.13003\\-182.5917\\-29\\64.1769\\-183.0012\\-29\\62.22377\\-183.9411\\-29\\60.54118\\-185.9896\\-29\\60.05895\\-187.9428\\-29\\59.74481\\-189.8959\\-29\\58.14314\\-195.7553\\-29\\57.73049\\-197.7084\\-29\\56.77333\\-201.6146\\-29\\57.27012\\-203.5678\\-29\\57.08311\\-205.5209\\-29\\55.59129\\-207.474\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002316" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "290" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "71.9894\\-198.5184\\-29\\71.27856\\-197.7084\\-29\\70.70387\\-195.7553\\-29\\71.38668\\-193.8021\\-29\\72.36353\\-191.849\\-29\\72.36806\\-187.9428\\-29\\72.94026\\-185.9896\\-29\\73.94253\\-184.7611\\-29\\75.89565\\-184.3207\\-29\\77.6159\\-185.9896\\-29\\77.43024\\-187.9428\\-29\\77.38654\\-189.8959\\-29\\77.84878\\-190.4689\\-29\\79.8019\\-190.8054\\-29\\81.75503\\-190.8144\\-29\\83.70815\\-190.9335\\-29\\87.6144\\-190.1366\\-29\\89.56753\\-190.888\\-29\\91.52065\\-191.3933\\-29\\92.11744\\-191.849\\-29\\92.33535\\-193.8021\\-29\\91.52065\\-194.6124\\-29\\89.56753\\-195.7629\\-29\\87.6144\\-195.7928\\-29\\85.66128\\-196.4399\\-29\\83.70815\\-196.9004\\-29\\81.75503\\-196.6508\\-29\\79.8019\\-197.2083\\-29\\77.84878\\-198.6445\\-29\\75.89565\\-199.235\\-29\\73.94253\\-199.4007\\-29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "151" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "291" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-125.2762\\-219.4967\\-27\\-127.2293\\-217.7481\\-27\\-127.6596\\-217.2396\\-27\\-129.1825\\-215.9198\\-27\\-131.1356\\-216.5164\\-27\\-133.0887\\-216.9921\\-27\\-135.0419\\-216.6382\\-27\\-136.995\\-215.8062\\-27\\-138.9481\\-214.6962\\-27\\-140.9012\\-213.8417\\-27\\-141.428\\-213.3334\\-27\\-142.205\\-211.3803\\-27\\-142.6069\\-209.4271\\-27\\-143.6791\\-207.474\\-27\\-143.9654\\-205.5209\\-27\\-144.3728\\-203.5678\\-27\\-145.5919\\-201.6146\\-27\\-145.5236\\-199.6615\\-27\\-144.8075\\-198.7237\\-27\\-142.8544\\-198.6354\\-27\\-140.9012\\-199.8485\\-27\\-138.9481\\-200.0285\\-27\\-136.995\\-199.7137\\-27\\-135.0419\\-200.3512\\-27\\-133.0887\\-200.5191\\-27\\-131.1356\\-199.77\\-27\\-129.1825\\-199.7137\\-27\\-127.2293\\-199.9976\\-27\\-125.2762\\-200.1411\\-27\\-123.3231\\-199.6842\\-27\\-117.4637\\-199.6691\\-27\\-115.5106\\-198.3067\\-27\\-114.9988\\-197.7084\\-27\\-114.0393\\-195.7553\\-27\\-112.4778\\-193.8021\\-27\\-111.385\\-191.849\\-27\\-109.6512\\-189.8732\\-27\\-107.6981\\-188.9807\\-27\\-105.745\\-188.3536\\-27\\-101.8387\\-188.0648\\-27\\-99.8856\\-188.6324\\-27\\-95.97935\\-189.6254\\-27\\-90.11997\\-189.6254\\-27\\-88.16685\\-188.9139\\-27\\-87.29282\\-187.9428\\-27\\-86.17616\\-185.9896\\-27\\-85.03078\\-182.0834\\-27\\-83.76376\\-180.1303\\-27\\-83.52172\\-178.1771\\-27\\-82.61695\\-176.224\\-27\\-81.95065\\-174.2709\\-27\\-83.18839\\-172.3178\\-27\\-83.43243\\-170.3646\\-27\\-83.01521\\-168.4115\\-27\\-81.70111\\-166.4584\\-27\\-80.35435\\-165.1624\\-27\\-77.03101\\-162.5521\\-27\\-74.49497\\-160.0464\\-27\\-72.54185\\-159.0176\\-27\\-68.6356\\-159.3055\\-27\\-64.72935\\-159.3135\\-27\\-63.09238\\-160.599\\-27\\-63.57523\\-162.5521\\-27\\-63.92945\\-164.5053\\-27\\-63.65615\\-166.4584\\-27\\-62.81437\\-168.4115\\-27\\-62.36028\\-170.3646\\-27\\-62.36028\\-172.3178\\-27\\-62.14433\\-174.2709\\-27\\-61.66219\\-176.224\\-27\\-60.47658\\-178.1771\\-27\\-60.48701\\-180.1303\\-27\\-61.01144\\-182.0834\\-27\\-60.99874\\-185.9896\\-27\\-60.64619\\-187.9428\\-27\\-58.27997\\-189.8959\\-27\\-56.80835\\-191.849\\-27\\-56.38059\\-193.8021\\-27\\-55.82082\\-195.7553\\-27\\-55.67208\\-197.7084\\-27\\-56.21931\\-199.6615\\-27\\-54.96373\\-200.061\\-27\\-53.90662\\-201.6146\\-27\\-53.83652\\-203.5678\\-27\\-53.60294\\-205.5209\\-27\\-53.04816\\-207.474\\-27\\-52.64678\\-209.4271\\-27\\-52.49282\\-211.3803\\-27\\-51.95355\\-213.3334\\-27\\-51.65712\\-215.2865\\-27\\-51.01309\\-217.2396\\-27\\-50.76622\\-219.1928\\-27\\-51.05748\\-219.6414\\-27\\-53.0106\\-220.7318\\-27\\-54.96373\\-220.5057\\-27\\-58.86998\\-216.7158\\-27\\-60.8231\\-215.1252\\-27\\-62.31625\\-213.3334\\-27\\-62.25743\\-211.3803\\-27\\-61.61656\\-209.4271\\-27\\-60.2921\\-207.474\\-27\\-59.84184\\-205.5209\\-27\\-58.73354\\-203.5678\\-27\\-58.03182\\-201.6146\\-27\\-57.07607\\-199.6615\\-27\\-58.12752\\-197.7084\\-27\\-58.86998\\-196.9857\\-27\\-59.74472\\-195.7553\\-27\\-60.46628\\-193.8021\\-27\\-61.60739\\-191.849\\-27\\-62.60211\\-189.8959\\-27\\-64.72935\\-187.8906\\-27\\-66.68247\\-186.5608\\-27\\-67.2431\\-185.9896\\-27\\-68.6356\\-183.9174\\-27\\-70.82627\\-182.0834\\-27\\-72.54185\\-181.1312\\-27\\-74.49497\\-181.0165\\-27\\-75.98344\\-182.0834\\-27\\-74.49497\\-183.0651\\-27\\-71.714\\-185.9896\\-27\\-70.8611\\-187.9428\\-27\\-70.58872\\-188.2657\\-27\\-68.21445\\-191.849\\-27\\-67.62594\\-193.8021\\-27\\-67.2347\\-195.7553\\-27\\-67.41784\\-197.7084\\-27\\-68.26725\\-199.6615\\-27\\-68.6356\\-200.113\\-27\\-70.62658\\-203.5678\\-27\\-71.59183\\-205.5209\\-27\\-73.67287\\-209.4271\\-27\\-74.8942\\-211.3803\\-27\\-76.4481\\-213.061\\-27\\-78.40122\\-214.3549\\-27\\-84.2606\\-217.3204\\-27\\-86.21372\\-217.6011\\-27\\-92.0731\\-217.5907\\-27\\-94.02622\\-217.1715\\-27\\-95.97935\\-216.6131\\-27\\-97.93247\\-216.4275\\-27\\-99.8856\\-215.8123\\-27\\-101.8387\\-214.9805\\-27\\-107.6981\\-215.0047\\-27\\-109.6512\\-214.7491\\-27\\-111.6043\\-214.6217\\-27\\-113.5575\\-214.6255\\-27\\-117.4637\\-215.3262\\-27\\-119.4168\\-215.6225\\-27\\-121.37\\-217.7923\\-27\\-123.3231\\-218.7113\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "292" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-158.433\\-27\\-39.33873\\-157.827\\-27\\-40.76208\\-156.6928\\-27\\-43.24498\\-154.2701\\-27\\-44.43799\\-152.7865\\-27\\-44.89414\\-150.8334\\-27\\-46.08444\\-148.8803\\-27\\-47.15123\\-147.8579\\-27\\-49.10435\\-147.9297\\-27\\-50.08091\\-148.8803\\-27\\-51.05748\\-150.1043\\-27\\-52.91905\\-148.8803\\-27\\-52.49569\\-146.9271\\-27\\-51.05748\\-145.4156\\-27\\-49.10435\\-144.9218\\-27\\-47.15123\\-144.1736\\-27\\-46.06563\\-143.0209\\-27\\-44.84128\\-141.0678\\-27\\-44.24905\\-139.1146\\-27\\-42.24936\\-135.2084\\-27\\-39.33873\\-132.4541\\-27\\-37.3856\\-130.5377\\-27\\-35.43248\\-129.7929\\-27\\-33.47935\\-129.7744\\-27\\-31.52623\\-129.536\\-27\\-29.5731\\-128.6689\\-27\\-27.61998\\-128.6498\\-27\\-25.66685\\-129.536\\-27\\-23.71373\\-129.802\\-27\\-21.7606\\-130.4982\\-27\\-20.9647\\-131.3021\\-27\\-19.46919\\-133.2553\\-27\\-18.78506\\-135.2084\\-27\\-17.90653\\-137.1615\\-27\\-16.89485\\-139.1146\\-27\\-16.08823\\-141.0678\\-27\\-14.93419\\-143.0209\\-27\\-13.30669\\-144.974\\-27\\-12.72488\\-146.9271\\-27\\-11.35688\\-148.8803\\-27\\-11.70591\\-150.8334\\-27\\-11.99498\\-151.0843\\-27\\-13.9481\\-151.101\\-27\\-14.24186\\-150.8334\\-27\\-15.90123\\-148.6641\\-27\\-17.85435\\-148.8907\\-27\\-18.71984\\-150.8334\\-27\\-20.0465\\-152.7865\\-27\\-21.03783\\-154.7396\\-27\\-21.7606\\-155.4624\\-27\\-23.71373\\-157.0797\\-27\\-25.66685\\-157.8051\\-27\\-27.61998\\-158.7544\\-27\\-29.5731\\-159.1512\\-27\\-33.47935\\-159.1427\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "293" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "13.39565\\-236.7789\\-27\\11.44252\\-236.5551\\-27\\10.10847\\-234.8178\\-27\\10.51706\\-232.8646\\-27\\13.39565\\-229.7172\\-27\\15.34877\\-228.3374\\-27\\17.3019\\-227.7036\\-27\\19.25502\\-226.3665\\-27\\23.16127\\-224.5351\\-27\\25.1144\\-224.0101\\-27\\27.06752\\-223.1512\\-27\\29.02065\\-222.1225\\-27\\30.97377\\-221.3591\\-27\\32.9269\\-220.0133\\-27\\34.88002\\-219.4197\\-27\\36.83315\\-220.8651\\-27\\37.02512\\-221.1459\\-27\\36.84078\\-223.099\\-27\\36.31656\\-225.0521\\-27\\36.33517\\-228.9584\\-27\\35.30938\\-230.9115\\-27\\34.50136\\-232.8646\\-27\\34.27472\\-234.8178\\-27\\32.9269\\-236.1121\\-27\\30.97377\\-236.3067\\-27\\29.02065\\-237.2529\\-27\\27.06752\\-237.6118\\-27\\25.1144\\-237.1499\\-27\\23.16127\\-237.1314\\-27\\21.20815\\-236.9262\\-27\\19.25502\\-236.3932\\-27\\17.3019\\-237.4667\\-27\\15.34877\\-237.4587\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002315" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "294" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-208.0812\\-27\\53.65948\\-207.474\\-27\\53.6699\\-199.6615\\-27\\53.92591\\-197.7084\\-27\\54.55988\\-195.7553\\-27\\56.24233\\-191.849\\-27\\56.25589\\-189.8959\\-27\\56.56384\\-187.9428\\-27\\58.15593\\-184.0365\\-27\\58.15593\\-178.1771\\-27\\57.96182\\-176.224\\-27\\59.05275\\-174.2709\\-27\\59.65696\\-172.3178\\-27\\59.97768\\-170.3646\\-27\\59.95584\\-162.5521\\-27\\60.01156\\-160.599\\-27\\60.27065\\-160.3105\\-27\\62.22377\\-159.1255\\-27\\66.13003\\-159.1167\\-27\\68.08315\\-157.8222\\-27\\70.03628\\-157.8445\\-27\\71.9894\\-158.8203\\-27\\75.89565\\-159.8854\\-27\\77.84878\\-161.197\\-27\\79.8019\\-162.3148\\-27\\82.00594\\-164.5053\\-27\\83.08379\\-166.4584\\-27\\82.87041\\-168.4115\\-27\\81.75503\\-169.5492\\-27\\78.74603\\-172.3178\\-27\\76.94695\\-174.2709\\-27\\77.83701\\-176.224\\-27\\79.82461\\-178.1771\\-27\\80.71855\\-180.1303\\-27\\81.24747\\-182.0834\\-27\\81.25704\\-184.0365\\-27\\81.47904\\-185.9896\\-27\\81.75503\\-186.443\\-27\\83.10961\\-187.9428\\-27\\83.70815\\-188.4354\\-27\\85.66128\\-189.1942\\-27\\86.41307\\-189.8959\\-27\\87.6144\\-190.7185\\-27\\90.8877\\-191.849\\-27\\91.52065\\-192.3669\\-27\\92.10179\\-193.8021\\-27\\91.52065\\-194.4094\\-27\\89.56753\\-195.7476\\-27\\87.6144\\-195.778\\-27\\85.66128\\-196.039\\-27\\83.70815\\-196.6156\\-27\\81.75503\\-197.0169\\-27\\79.8019\\-197.5444\\-27\\77.84878\\-198.4282\\-27\\75.89565\\-198.9076\\-27\\73.94253\\-200.3108\\-27\\71.9894\\-200.3555\\-27\\71.24378\\-199.6615\\-27\\70.18707\\-197.7084\\-27\\69.65925\\-195.7553\\-27\\70.04402\\-193.8021\\-27\\70.97857\\-191.849\\-27\\70.95181\\-189.8959\\-27\\70.54552\\-187.9428\\-27\\71.15025\\-185.9896\\-27\\72.16379\\-184.0365\\-27\\73.94253\\-180.2\\-27\\73.94253\\-179.9983\\-27\\71.9894\\-179.0535\\-27\\70.72964\\-180.1303\\-27\\68.08315\\-181.598\\-27\\66.13003\\-182.232\\-27\\62.22377\\-183.1925\\-27\\61.32703\\-184.0365\\-27\\60.55247\\-185.9896\\-27\\60.37915\\-187.9428\\-27\\59.32186\\-189.8959\\-27\\58.63234\\-191.849\\-27\\58.13562\\-193.8021\\-27\\58.13052\\-197.7084\\-27\\57.52531\\-201.6146\\-27\\58.18008\\-203.5678\\-27\\57.86819\\-205.5209\\-27\\56.3644\\-207.0247\\-27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "156" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "295" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-54.96373\\-224.1935\\-25\\-56.09627\\-223.099\\-25\\-57.65989\\-221.1459\\-25\\-60.8231\\-217.9649\\-25\\-62.77623\\-216.4808\\-25\\-64.09531\\-215.2865\\-25\\-63.70653\\-211.3803\\-25\\-62.57537\\-209.4271\\-25\\-61.78003\\-207.474\\-25\\-60.55073\\-205.5209\\-25\\-60.0093\\-203.5678\\-25\\-59.72324\\-201.6146\\-25\\-59.06942\\-199.6615\\-25\\-58.86998\\-198.748\\-25\\-58.33287\\-197.7084\\-25\\-58.86998\\-197.3656\\-25\\-59.63446\\-195.7553\\-25\\-60.8231\\-192.2717\\-25\\-61.9118\\-189.8959\\-25\\-64.72935\\-186.9662\\-25\\-66.68247\\-185.17\\-25\\-67.71182\\-184.0365\\-25\\-70.58872\\-181.1996\\-25\\-72.54185\\-180.3556\\-25\\-74.47208\\-182.0834\\-25\\-73.28047\\-184.0365\\-25\\-71.46908\\-185.9896\\-25\\-70.2117\\-187.9428\\-25\\-69.35138\\-189.8959\\-25\\-67.8008\\-191.849\\-25\\-66.67484\\-193.8021\\-25\\-66.72062\\-195.7553\\-25\\-67.3728\\-199.6615\\-25\\-68.21966\\-201.6146\\-25\\-69.62296\\-203.5678\\-25\\-71.58157\\-207.474\\-25\\-73.17171\\-209.4271\\-25\\-74.12084\\-211.3803\\-25\\-75.64489\\-213.3334\\-25\\-78.40122\\-215.842\\-25\\-80.35435\\-216.4938\\-25\\-82.30747\\-217.0264\\-25\\-84.2606\\-218.09\\-25\\-86.21372\\-218.3858\\-25\\-94.02622\\-218.3652\\-25\\-95.97935\\-217.8079\\-25\\-97.93247\\-216.9921\\-25\\-99.8856\\-216.7022\\-25\\-101.8387\\-216.0666\\-25\\-103.7918\\-215.2199\\-25\\-107.6981\\-214.7343\\-25\\-111.6043\\-213.5347\\-25\\-113.5575\\-213.3741\\-25\\-115.5106\\-213.3741\\-25\\-117.4637\\-213.5866\\-25\\-119.4168\\-213.5757\\-25\\-121.37\\-214.3625\\-25\\-122.5833\\-215.2865\\-25\\-123.5383\\-217.2396\\-25\\-125.2762\\-218.1552\\-25\\-126.1307\\-217.2396\\-25\\-127.2293\\-216.2912\\-25\\-129.1825\\-215.6758\\-25\\-131.1356\\-216.4509\\-25\\-133.0887\\-217.0039\\-25\\-135.0419\\-216.9357\\-25\\-136.995\\-216\\-25\\-138.9481\\-214.739\\-25\\-140.9012\\-213.6524\\-25\\-141.2267\\-213.3334\\-25\\-142.0834\\-211.3803\\-25\\-142.1982\\-209.4271\\-25\\-142.5725\\-207.474\\-25\\-143.1574\\-205.5209\\-25\\-143.8527\\-203.5678\\-25\\-144.31\\-201.6146\\-25\\-142.8544\\-199.7019\\-25\\-140.9012\\-200.4417\\-25\\-138.9481\\-200.6279\\-25\\-136.995\\-200.2072\\-25\\-135.0419\\-200.3569\\-25\\-133.0887\\-200.3975\\-25\\-131.1356\\-200.1835\\-25\\-127.2293\\-200.1835\\-25\\-125.2762\\-200.26\\-25\\-123.3231\\-200.4825\\-25\\-119.4168\\-200.1782\\-25\\-117.4637\\-200.1668\\-25\\-115.5106\\-199.057\\-25\\-112.8103\\-195.7553\\-25\\-111.385\\-193.8021\\-25\\-110.5036\\-191.849\\-25\\-109.6512\\-190.9331\\-25\\-107.6981\\-189.7462\\-25\\-105.745\\-189.5176\\-25\\-103.7918\\-188.9656\\-25\\-101.8387\\-188.8032\\-25\\-99.8856\\-189.1921\\-25\\-97.93247\\-189.3466\\-25\\-95.97935\\-189.9625\\-25\\-94.02622\\-190.2851\\-25\\-92.0731\\-190.296\\-25\\-90.11997\\-190.1137\\-25\\-88.16685\\-189.0049\\-25\\-87.1417\\-187.9428\\-25\\-85.74288\\-185.9896\\-25\\-85.33709\\-184.0365\\-25\\-84.25297\\-182.0834\\-25\\-83.77232\\-180.1303\\-25\\-83.75529\\-178.1771\\-25\\-82.80235\\-176.224\\-25\\-82.60188\\-174.2709\\-25\\-83.90955\\-172.3178\\-25\\-84.39132\\-170.3646\\-25\\-83.75488\\-168.4115\\-25\\-83.30586\\-166.4584\\-25\\-82.30747\\-164.8036\\-25\\-80.35435\\-163.3049\\-25\\-79.12255\\-162.5521\\-25\\-77.13937\\-160.599\\-25\\-76.4481\\-160.0863\\-25\\-74.49497\\-158.2735\\-25\\-72.54185\\-157.8801\\-25\\-70.58872\\-159.1078\\-25\\-66.68247\\-159.1342\\-25\\-64.72935\\-159.7496\\-25\\-63.96576\\-160.599\\-25\\-64.26739\\-164.5053\\-25\\-64.10082\\-166.4584\\-25\\-63.67012\\-168.4115\\-25\\-62.81467\\-170.3646\\-25\\-62.36028\\-172.3178\\-25\\-62.35085\\-174.2709\\-25\\-61.87514\\-176.224\\-25\\-61.00002\\-178.1771\\-25\\-60.47658\\-180.1303\\-25\\-60.48701\\-185.9896\\-25\\-59.91788\\-187.9428\\-25\\-57.93967\\-189.8959\\-25\\-56.82211\\-191.849\\-25\\-56.79478\\-193.8021\\-25\\-56.40559\\-195.7553\\-25\\-56.47129\\-199.6615\\-25\\-55.86839\\-201.6146\\-25\\-54.08537\\-203.5678\\-25\\-51.9585\\-209.4271\\-25\\-51.25833\\-213.3334\\-25\\-50.99089\\-215.2865\\-25\\-49.76937\\-217.2396\\-25\\-49.10435\\-217.9481\\-25\\-47.40409\\-219.1928\\-25\\-45.67188\\-221.1459\\-25\\-45.83106\\-223.099\\-25\\-47.15123\\-224.1322\\-25\\-49.10435\\-224.4339\\-25\\-53.0106\\-224.5505\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "296" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-157.0992\\-25\\-41.29185\\-155.6278\\-25\\-44.29094\\-152.7865\\-25\\-44.86201\\-150.8334\\-25\\-45.78632\\-148.8803\\-25\\-47.15123\\-147.6518\\-25\\-49.10435\\-147.5052\\-25\\-50.76587\\-148.8803\\-25\\-51.05748\\-149.2392\\-25\\-52.05729\\-148.8803\\-25\\-52.91142\\-146.9271\\-25\\-51.65363\\-144.974\\-25\\-51.05748\\-144.3947\\-25\\-47.15123\\-143.8718\\-25\\-46.33833\\-143.0209\\-25\\-45.1981\\-140.2688\\-25\\-44.06762\\-137.1615\\-25\\-42.81432\\-135.2084\\-25\\-40.7348\\-133.2553\\-25\\-39.33873\\-132.2929\\-25\\-37.3856\\-130.5377\\-25\\-35.43248\\-129.802\\-25\\-33.47935\\-129.7837\\-25\\-29.5731\\-128.0487\\-25\\-27.61998\\-128.0416\\-25\\-25.66685\\-128.8254\\-25\\-23.71373\\-129.7929\\-25\\-21.7606\\-130.4924\\-25\\-19.0675\\-133.2553\\-25\\-18.39565\\-135.2084\\-25\\-17.57062\\-137.1615\\-25\\-16.07561\\-141.0678\\-25\\-14.69523\\-143.0209\\-25\\-12.69252\\-144.974\\-25\\-12.48033\\-146.9271\\-25\\-11.1333\\-148.8803\\-25\\-11.58427\\-150.8334\\-25\\-11.99498\\-151.1264\\-25\\-13.9481\\-150.1693\\-25\\-15.90123\\-148.0655\\-25\\-17.85435\\-148.479\\-25\\-18.19044\\-148.8803\\-25\\-18.85922\\-150.8334\\-25\\-20.58372\\-152.7865\\-25\\-21.7606\\-154.2576\\-25\\-23.71373\\-155.9999\\-25\\-25.66685\\-157.3455\\-25\\-27.61998\\-157.7901\\-25\\-29.5731\\-158.4054\\-25\\-33.47935\\-158.3821\\-25\\-35.43248\\-157.7933\\-25\\-37.3856\\-157.4955\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "297" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "32.9269\\-237.5271\\-25\\30.97377\\-236.7028\\-25\\29.02065\\-236.1876\\-25\\27.06752\\-236.1487\\-25\\25.1144\\-235.7356\\-25\\23.16127\\-235.69\\-25\\21.20815\\-235.3868\\-25\\19.25502\\-234.3295\\-25\\17.3019\\-233.8725\\-25\\15.34877\\-234.0141\\-25\\13.39565\\-234.4516\\-25\\12.24153\\-232.8646\\-25\\13.39565\\-231.6637\\-25\\13.86738\\-230.9115\\-25\\16.3593\\-228.9584\\-25\\17.3019\\-228.3595\\-25\\19.25502\\-227.7169\\-25\\21.20815\\-226.4064\\-25\\23.16127\\-226.0909\\-25\\25.1144\\-225.3842\\-25\\28.04409\\-223.099\\-25\\29.02065\\-222.2595\\-25\\30.97377\\-221.2267\\-25\\32.9269\\-219.9973\\-25\\34.88002\\-218.9811\\-25\\36.83315\\-218.4977\\-25\\38.78627\\-218.403\\-25\\39.96576\\-219.1928\\-25\\39.22261\\-221.1459\\-25\\38.78627\\-221.7673\\-25\\38.4655\\-223.099\\-25\\38.42274\\-228.9584\\-25\\37.55447\\-230.9115\\-25\\37.34058\\-232.8646\\-25\\36.84219\\-234.8178\\-25\\34.56535\\-236.7709\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002314" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "85" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "298" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-206.5494\\-25\\53.80323\\-205.5209\\-25\\54.26266\\-201.6146\\-25\\54.2892\\-197.7084\\-25\\54.58566\\-195.7553\\-25\\55.59083\\-193.8021\\-25\\56.25589\\-191.849\\-25\\56.26966\\-189.8959\\-25\\57.05658\\-187.9428\\-25\\58.48291\\-184.0365\\-25\\58.46613\\-182.0834\\-25\\57.76939\\-180.1303\\-25\\57.69229\\-178.1771\\-25\\57.42917\\-176.224\\-25\\58.31752\\-175.0571\\-25\\59.21824\\-174.2709\\-25\\59.96334\\-172.3178\\-25\\60.00616\\-164.5053\\-25\\60.39272\\-162.5521\\-25\\60.63764\\-160.599\\-25\\62.22377\\-159.2884\\-25\\64.1769\\-159.1167\\-25\\66.13003\\-158.6228\\-25\\68.08315\\-157.5581\\-25\\70.03628\\-157.3728\\-25\\71.9894\\-158.0229\\-25\\73.94253\\-159.1342\\-25\\75.89565\\-159.393\\-25\\77.84878\\-159.8922\\-25\\79.8019\\-161.6518\\-25\\82.60168\\-164.5053\\-25\\84.27828\\-166.4584\\-25\\83.46025\\-168.4115\\-25\\81.75503\\-169.5035\\-25\\78.73067\\-172.3178\\-25\\77.10165\\-174.2709\\-25\\77.84878\\-175.6489\\-25\\78.55779\\-176.224\\-25\\79.8019\\-176.9564\\-25\\82.23705\\-180.1303\\-25\\82.82344\\-182.0834\\-25\\82.83311\\-184.0365\\-25\\83.70815\\-185.4973\\-25\\85.66128\\-188.0419\\-25\\86.80216\\-189.8959\\-25\\87.6144\\-190.8725\\-25\\89.56753\\-191.6133\\-25\\89.90594\\-191.849\\-25\\91.17094\\-193.8021\\-25\\89.56753\\-195.5999\\-25\\87.6144\\-196.0592\\-25\\85.66128\\-195.778\\-25\\83.70815\\-196.562\\-25\\81.74087\\-197.7084\\-25\\79.8019\\-198.398\\-25\\75.89565\\-199.4578\\-25\\73.94253\\-200.6231\\-25\\71.9894\\-200.9274\\-25\\70.5125\\-199.6615\\-25\\69.67945\\-197.7084\\-25\\69.64934\\-193.8021\\-25\\70.37679\\-189.8959\\-25\\70.36648\\-187.9428\\-25\\71.71886\\-184.0365\\-25\\72.13801\\-182.0834\\-25\\71.9894\\-181.8135\\-25\\70.03628\\-181.0168\\-25\\68.08315\\-182.1781\\-25\\66.13003\\-182.2055\\-25\\64.1769\\-182.8987\\-25\\62.22377\\-183.4872\\-25\\61.63065\\-184.0365\\-25\\60.95969\\-185.9896\\-25\\60.41926\\-187.9428\\-25\\59.0652\\-189.8959\\-25\\58.31752\\-191.6255\\-25\\57.22607\\-191.849\\-25\\58.04361\\-193.8021\\-25\\58.15593\\-195.7553\\-25\\58.16891\\-199.6615\\-25\\58.51696\\-201.6146\\-25\\59.24401\\-203.5678\\-25\\59.07882\\-205.5209\\-25\\58.31752\\-206.2989\\-25\\56.3644\\-207.012\\-25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "164" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "299" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-47.15123\\-227.1093\\-23\\-49.10435\\-226.5907\\-23\\-51.05748\\-226.5689\\-23\\-53.0106\\-226.2757\\-23\\-54.96373\\-225.7192\\-23\\-57.76161\\-223.099\\-23\\-59.34524\\-221.1459\\-23\\-61.19404\\-219.1928\\-23\\-62.77623\\-217.9992\\-23\\-64.11523\\-217.2396\\-23\\-64.72935\\-216.7305\\-23\\-65.65255\\-215.2865\\-23\\-65.02594\\-213.3334\\-23\\-64.75418\\-211.3803\\-23\\-63.92181\\-209.4271\\-23\\-61.71828\\-205.5209\\-23\\-60.47658\\-203.5678\\-23\\-60.17723\\-201.6146\\-23\\-59.67336\\-199.6615\\-23\\-58.86998\\-197.9627\\-23\\-58.39127\\-197.7084\\-23\\-58.86998\\-197.0302\\-23\\-59.79229\\-193.8021\\-23\\-60.24259\\-191.849\\-23\\-61.77641\\-189.8959\\-23\\-63.52301\\-187.9428\\-23\\-64.49363\\-185.9896\\-23\\-66.68247\\-184.0136\\-23\\-68.6356\\-182.8735\\-23\\-70.58872\\-181.0116\\-23\\-72.54185\\-179.2795\\-23\\-74.49497\\-179.3348\\-23\\-75.06183\\-180.1303\\-23\\-73.61894\\-182.0834\\-23\\-72.54185\\-184.0108\\-23\\-71.32114\\-185.9896\\-23\\-69.75533\\-187.9428\\-23\\-68.8138\\-189.8959\\-23\\-67.7435\\-191.849\\-23\\-67.0056\\-193.8021\\-23\\-67.57581\\-195.7553\\-23\\-67.89613\\-197.7084\\-23\\-67.9116\\-199.6615\\-23\\-68.13876\\-201.6146\\-23\\-68.82394\\-203.5678\\-23\\-70.58872\\-207.1006\\-23\\-71.94506\\-209.4271\\-23\\-75.46655\\-213.3334\\-23\\-78.40122\\-216.2212\\-23\\-80.35435\\-217.0039\\-23\\-82.30747\\-217.9475\\-23\\-84.2606\\-218.6987\\-23\\-86.21372\\-218.9811\\-23\\-92.0731\\-218.9811\\-23\\-94.02622\\-218.9222\\-23\\-97.58595\\-217.2396\\-23\\-97.93247\\-217.0158\\-23\\-99.8856\\-217.0039\\-23\\-101.8387\\-216.716\\-23\\-103.7918\\-215.7926\\-23\\-107.6981\\-214.2834\\-23\\-109.6512\\-212.9598\\-23\\-111.6043\\-211.9807\\-23\\-113.5575\\-211.3887\\-23\\-115.5106\\-211.4216\\-23\\-117.4637\\-212.015\\-23\\-119.4168\\-212.1066\\-23\\-121.37\\-212.5196\\-23\\-123.3231\\-214.1431\\-23\\-127.2293\\-216.2523\\-23\\-131.1356\\-216.7875\\-23\\-133.0887\\-216.9921\\-23\\-135.0419\\-216.6907\\-23\\-136.995\\-215.5966\\-23\\-138.9481\\-214.1649\\-23\\-140.9012\\-212.3442\\-23\\-141.6794\\-211.3803\\-23\\-141.9652\\-209.4271\\-23\\-142.1783\\-205.5209\\-23\\-143.4966\\-203.5678\\-23\\-143.2294\\-201.6146\\-23\\-142.8544\\-201.2527\\-23\\-140.9012\\-201.0399\\-23\\-138.9481\\-201.2057\\-23\\-136.995\\-200.9117\\-23\\-133.0887\\-200.8678\\-23\\-129.1825\\-201.2728\\-23\\-127.2293\\-201.3325\\-23\\-126.0392\\-201.6146\\-23\\-123.3231\\-203.0634\\-23\\-121.37\\-202.4988\\-23\\-120.087\\-201.6146\\-23\\-119.4168\\-201.3577\\-23\\-117.4637\\-201.3202\\-23\\-115.5106\\-200.667\\-23\\-114.4664\\-199.6615\\-23\\-113.1482\\-197.7084\\-23\\-112.0257\\-195.7553\\-23\\-110.4907\\-193.8021\\-23\\-109.2892\\-191.849\\-23\\-107.6981\\-190.7821\\-23\\-105.745\\-190.8943\\-23\\-103.7918\\-190.1324\\-23\\-101.8387\\-189.9214\\-23\\-99.8856\\-190.0703\\-23\\-97.93247\\-189.6721\\-23\\-95.97935\\-190.5666\\-23\\-94.02622\\-191.1466\\-23\\-92.0731\\-191.1729\\-23\\-90.11997\\-190.6529\\-23\\-87.40479\\-187.9428\\-23\\-86.06512\\-185.9896\\-23\\-84.5011\\-182.0834\\-23\\-84.46035\\-178.1771\\-23\\-82.89341\\-176.224\\-23\\-83.02246\\-174.2709\\-23\\-84.98217\\-172.3178\\-23\\-85.38496\\-170.3646\\-23\\-84.99583\\-168.4115\\-23\\-84.02488\\-166.4584\\-23\\-83.29312\\-164.5053\\-23\\-82.30747\\-163.4073\\-23\\-81.31326\\-162.5521\\-23\\-80.35435\\-161.105\\-23\\-78.40122\\-159.4227\\-23\\-76.4481\\-158.1875\\-23\\-74.49497\\-157.4126\\-23\\-72.54185\\-157.6693\\-23\\-70.58872\\-159.0989\\-23\\-68.6356\\-159.1167\\-23\\-66.68247\\-159.2635\\-23\\-64.70664\\-160.599\\-23\\-64.32295\\-162.5521\\-23\\-64.30398\\-166.4584\\-23\\-64.1223\\-168.4115\\-23\\-63.56479\\-170.3646\\-23\\-62.36983\\-172.3178\\-23\\-62.36028\\-174.2709\\-23\\-62.15526\\-176.224\\-23\\-61.75482\\-178.1771\\-23\\-60.87609\\-180.1303\\-23\\-60.47658\\-182.0834\\-23\\-60.45611\\-185.9896\\-23\\-59.82454\\-187.9428\\-23\\-57.84177\\-189.8959\\-23\\-56.82211\\-191.849\\-23\\-56.78141\\-195.7553\\-23\\-56.45553\\-197.7084\\-23\\-55.90431\\-199.6615\\-23\\-55.5226\\-201.6146\\-23\\-53.94186\\-203.5678\\-23\\-52.67009\\-205.5209\\-23\\-52.023\\-207.474\\-23\\-50.94734\\-209.4271\\-23\\-50.48782\\-211.3803\\-23\\-50.35295\\-213.3334\\-23\\-50.1132\\-215.2865\\-23\\-49.10435\\-216.4717\\-23\\-47.10545\\-217.2396\\-23\\-45.1981\\-219.5218\\-23\\-44.37714\\-221.1459\\-23\\-43.6841\\-223.099\\-23\\-44.55576\\-225.0521\\-23\\-45.1981\\-226.1151\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "300" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1724\\-23\\-39.33873\\-155.9552\\-23\\-41.29185\\-155.382\\-23\\-43.24498\\-153.787\\-23\\-44.28631\\-152.7865\\-23\\-45.33761\\-150.8334\\-23\\-46.17466\\-148.8803\\-23\\-47.15123\\-147.8982\\-23\\-49.10435\\-147.1746\\-23\\-51.05748\\-148.2273\\-23\\-52.91957\\-146.9271\\-23\\-51.81369\\-144.974\\-23\\-51.05748\\-144.2178\\-23\\-49.10435\\-143.6559\\-23\\-47.78377\\-143.0209\\-23\\-47.15123\\-142.4223\\-23\\-46.42722\\-141.0678\\-23\\-46.01733\\-139.1146\\-23\\-44.82108\\-137.1615\\-23\\-44.05787\\-135.2084\\-23\\-43.24498\\-134.3816\\-23\\-41.29185\\-132.7095\\-23\\-39.33873\\-131.9652\\-23\\-37.3856\\-130.5317\\-23\\-35.43248\\-129.802\\-23\\-33.47935\\-129.7837\\-23\\-31.52623\\-128.6246\\-23\\-29.5731\\-127.8118\\-23\\-27.61998\\-127.8118\\-23\\-25.66685\\-128.3979\\-23\\-23.71373\\-129.5234\\-23\\-21.7606\\-130.3305\\-23\\-18.93995\\-133.2553\\-23\\-17.85435\\-135.2907\\-23\\-17.07798\\-137.1615\\-23\\-16.44744\\-139.1146\\-23\\-15.70179\\-141.0678\\-23\\-12.24246\\-144.974\\-23\\-12.15892\\-146.9271\\-23\\-11.12286\\-148.8803\\-23\\-11.59505\\-150.8334\\-23\\-11.99498\\-151.1152\\-23\\-13.9481\\-149.8852\\-23\\-14.85308\\-148.8803\\-23\\-15.90123\\-147.3039\\-23\\-17.85435\\-147.6351\\-23\\-18.60142\\-148.8803\\-23\\-19.54482\\-150.8334\\-23\\-21.03373\\-152.7865\\-23\\-23.71373\\-155.4565\\-23\\-25.66685\\-156.7875\\-23\\-27.61998\\-157.3317\\-23\\-29.5731\\-157.4918\\-23\\-33.47935\\-157.4979\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "301" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "30.97377\\-235.3968\\-23\\27.06752\\-233.9508\\-23\\25.1144\\-233.3478\\-23\\23.16127\\-233.4291\\-23\\21.20815\\-233.2568\\-23\\19.25502\\-232.8728\\-23\\17.3019\\-231.9436\\-23\\16.19433\\-230.9115\\-23\\18.77784\\-228.9584\\-23\\21.20815\\-227.8925\\-23\\23.16127\\-226.7936\\-23\\25.1144\\-226.011\\-23\\27.06752\\-224.5972\\-23\\29.02065\\-223.6345\\-23\\30.97377\\-222.0842\\-23\\32.9269\\-220.3263\\-23\\34.96807\\-219.1928\\-23\\38.16992\\-217.2396\\-23\\38.78627\\-216.7811\\-23\\40.7394\\-216.9684\\-23\\42.69252\\-218.6726\\-23\\43.83185\\-219.1928\\-23\\44.64565\\-219.744\\-23\\46.25517\\-221.1459\\-23\\45.94065\\-223.099\\-23\\44.64565\\-224.709\\-23\\44.11131\\-227.0053\\-23\\42.69252\\-228.4797\\-23\\42.41509\\-228.9584\\-23\\40.59676\\-230.9115\\-23\\38.4258\\-234.8178\\-23\\36.83315\\-236.1075\\-23\\34.88002\\-236.4175\\-23\\32.9269\\-236.5221\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "302" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-164.754\\-23\\50.99331\\-164.5053\\-23\\50.50502\\-164.1537\\-23\\49.3274\\-162.5521\\-23\\50.50502\\-161.3009\\-23\\52.45815\\-160.9859\\-23\\53.14174\\-160.599\\-23\\56.3644\\-159.7905\\-23\\57.38123\\-160.599\\-23\\57.65292\\-162.5521\\-23\\56.3644\\-163.6566\\-23\\54.41127\\-163.1518\\-23\\52.95564\\-164.5053\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002313" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "97" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "303" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-208.0585\\-23\\53.53459\\-207.474\\-23\\52.96848\\-205.5209\\-23\\53.52657\\-203.5678\\-23\\54.27584\\-201.6146\\-23\\54.30277\\-197.7084\\-23\\53.85413\\-195.7553\\-23\\55.22931\\-193.8021\\-23\\56.25589\\-191.849\\-23\\56.28363\\-189.8959\\-23\\57.31985\\-187.9428\\-23\\58.16891\\-185.9896\\-23\\59.39174\\-184.0365\\-23\\59.07165\\-182.0834\\-23\\58.31752\\-181.2849\\-23\\56.43013\\-180.1303\\-23\\56.67004\\-178.1771\\-23\\56.71092\\-176.224\\-23\\56.26966\\-174.2709\\-23\\56.3644\\-174.1488\\-23\\58.31752\\-174.5261\\-23\\58.99816\\-174.2709\\-23\\59.96732\\-172.3178\\-23\\59.97904\\-166.4584\\-23\\59.59171\\-164.5053\\-23\\60.27065\\-163.9011\\-23\\61.07867\\-162.5521\\-23\\61.3761\\-160.599\\-23\\62.22377\\-159.7108\\-23\\64.1769\\-159.1078\\-23\\66.13003\\-157.8296\\-23\\68.08315\\-157.3137\\-23\\70.03628\\-157.1896\\-23\\71.9894\\-157.8389\\-23\\73.94253\\-159.1167\\-23\\77.84878\\-159.5015\\-23\\79.36307\\-160.599\\-23\\80.84717\\-162.5521\\-23\\83.70815\\-165.4157\\-23\\84.65247\\-166.4584\\-23\\84.47995\\-168.4115\\-23\\83.70815\\-169.1592\\-23\\81.75503\\-169.9557\\-23\\79.8019\\-171.294\\-23\\78.73163\\-172.3178\\-23\\78.51503\\-174.2709\\-23\\79.8019\\-175.1768\\-23\\80.97234\\-176.224\\-23\\82.28937\\-178.1771\\-23\\82.96024\\-180.1303\\-23\\83.19447\\-182.0834\\-23\\83.54656\\-184.0365\\-23\\83.70815\\-184.2148\\-23\\85.66128\\-187.63\\-23\\85.93741\\-187.9428\\-23\\86.94036\\-189.8959\\-23\\87.6144\\-190.6521\\-23\\89.56753\\-191.4596\\-23\\90.02666\\-191.849\\-23\\90.57542\\-193.8021\\-23\\89.56753\\-195.2746\\-23\\89.04168\\-195.7553\\-23\\87.6144\\-196.683\\-23\\85.66128\\-196.0914\\-23\\83.70815\\-196.562\\-23\\81.75503\\-197.7311\\-23\\79.8019\\-198.5183\\-23\\77.75383\\-199.6615\\-23\\75.89565\\-200.3547\\-23\\73.94253\\-201.3483\\-23\\71.9894\\-201.1417\\-23\\70.54552\\-199.6615\\-23\\69.66929\\-197.7084\\-23\\69.62988\\-193.8021\\-23\\69.66929\\-191.849\\-23\\70.65514\\-189.8959\\-23\\71.24992\\-187.9428\\-23\\71.70757\\-184.0365\\-23\\71.67367\\-182.0834\\-23\\70.03628\\-181.0313\\-23\\68.08315\\-182.2055\\-23\\66.13003\\-182.2188\\-23\\64.1769\\-182.9185\\-23\\62.22377\\-183.4418\\-23\\61.28178\\-184.0365\\-23\\60.58546\\-185.9896\\-23\\59.40323\\-187.9428\\-23\\58.59935\\-189.8959\\-23\\58.31752\\-191.2081\\-23\\57.1782\\-191.849\\-23\\58.11245\\-193.8021\\-23\\58.16891\\-197.7084\\-23\\58.55325\\-199.6615\\-23\\59.7479\\-203.5678\\-23\\59.96965\\-205.5209\\-23\\58.31752\\-206.7838\\-23\\56.3644\\-207.3655\\-23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "169" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "304" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-53.0106\\-227.5592\\-21\\-54.96373\\-226.1876\\-21\\-56.91685\\-225.2759\\-21\\-59.09534\\-223.099\\-21\\-60.33482\\-221.1459\\-21\\-60.8231\\-220.5966\\-21\\-62.77623\\-218.8217\\-21\\-64.72935\\-217.8117\\-21\\-65.3374\\-217.2396\\-21\\-66.33595\\-215.2865\\-21\\-66.43833\\-213.3334\\-21\\-66.15406\\-211.3803\\-21\\-65.46329\\-209.4271\\-21\\-64.19847\\-207.474\\-21\\-62.49623\\-205.5209\\-21\\-60.48701\\-203.5678\\-21\\-60.46628\\-201.6146\\-21\\-59.9268\\-199.6615\\-21\\-59.16294\\-197.7084\\-21\\-58.86998\\-196.3767\\-21\\-58.46786\\-195.7553\\-21\\-58.86998\\-195.1338\\-21\\-59.16491\\-193.8021\\-21\\-59.91133\\-191.849\\-21\\-61.74802\\-189.8959\\-21\\-62.81437\\-187.9428\\-21\\-63.67012\\-185.9896\\-21\\-65.66708\\-184.0365\\-21\\-66.68247\\-183.1732\\-21\\-68.6356\\-182.5207\\-21\\-70.58872\\-181.0116\\-21\\-72.54185\\-179.2539\\-21\\-74.49497\\-179.2344\\-21\\-75.10056\\-180.1303\\-21\\-74.49497\\-180.7497\\-21\\-71.89597\\-184.0365\\-21\\-70.82943\\-185.9896\\-21\\-69.35319\\-187.9428\\-21\\-68.37651\\-189.8959\\-21\\-67.91329\\-193.8021\\-21\\-68.33163\\-197.7084\\-21\\-68.36507\\-203.5678\\-21\\-69.62116\\-205.5209\\-21\\-70.38929\\-207.474\\-21\\-71.57017\\-209.4271\\-21\\-77.4295\\-215.2865\\-21\\-78.40122\\-216.2212\\-21\\-80.35435\\-217.0158\\-21\\-82.30747\\-218.1557\\-21\\-84.2606\\-218.9811\\-21\\-86.21372\\-219.0058\\-21\\-88.16685\\-219.3544\\-21\\-90.11997\\-219.5871\\-21\\-92.0731\\-219.2593\\-21\\-94.02622\\-218.6554\\-21\\-97.93247\\-217.0279\\-21\\-101.8387\\-217.0039\\-21\\-103.7918\\-216.0124\\-21\\-107.6981\\-213.4783\\-21\\-110.0802\\-211.3803\\-21\\-111.6043\\-209.9241\\-21\\-113.5575\\-209.2222\\-21\\-115.5106\\-209.0589\\-21\\-117.4637\\-209.2876\\-21\\-119.4168\\-209.6321\\-21\\-121.37\\-210.4508\\-21\\-123.3231\\-212.1103\\-21\\-124.082\\-213.3334\\-21\\-125.2762\\-214.4409\\-21\\-127.2293\\-216.0381\\-21\\-129.1825\\-216.5321\\-21\\-133.0887\\-216.513\\-21\\-135.0419\\-215.8818\\-21\\-136.995\\-214.2638\\-21\\-138.9481\\-212.9672\\-21\\-140.3839\\-211.3803\\-21\\-141.1298\\-209.4271\\-21\\-141.6735\\-207.474\\-21\\-142.0398\\-205.5209\\-21\\-142.5078\\-203.5678\\-21\\-141.5997\\-201.6146\\-21\\-140.9012\\-201.0195\\-21\\-138.9481\\-201.0973\\-21\\-136.995\\-201.4926\\-21\\-135.0419\\-201.5771\\-21\\-133.0887\\-201.9446\\-21\\-131.1356\\-202.7964\\-21\\-129.6774\\-203.5678\\-21\\-129.1825\\-204.0696\\-21\\-127.2293\\-205.3146\\-21\\-123.3231\\-205.4185\\-21\\-117.4637\\-205.3146\\-21\\-115.5106\\-203.839\\-21\\-115.4264\\-203.5678\\-21\\-112.3086\\-199.6615\\-21\\-111.5084\\-197.7084\\-21\\-110.5948\\-195.7553\\-21\\-109.3137\\-193.8021\\-21\\-107.6981\\-192.0157\\-21\\-105.745\\-191.7964\\-21\\-103.7918\\-191.2039\\-21\\-101.8387\\-191.1689\\-21\\-99.8856\\-190.8404\\-21\\-97.93247\\-190.3809\\-21\\-95.97935\\-190.9464\\-21\\-94.02622\\-191.6133\\-21\\-92.0731\\-191.9711\\-21\\-90.11997\\-190.757\\-21\\-89.56602\\-189.8959\\-21\\-88.55616\\-187.9428\\-21\\-86.87736\\-185.9896\\-21\\-85.56785\\-184.0365\\-21\\-85.40793\\-182.0834\\-21\\-85.40793\\-180.1303\\-21\\-85.29142\\-178.1771\\-21\\-84.2606\\-177.024\\-21\\-82.55456\\-176.224\\-21\\-82.83589\\-174.2709\\-21\\-84.2606\\-173.2256\\-21\\-85.19186\\-172.3178\\-21\\-85.72544\\-170.3646\\-21\\-85.52651\\-168.4115\\-21\\-84.88002\\-166.4584\\-21\\-83.54811\\-164.5053\\-21\\-82.69682\\-162.5521\\-21\\-81.47997\\-160.599\\-21\\-80.35435\\-159.4303\\-21\\-78.40122\\-157.986\\-21\\-76.4481\\-157.4089\\-21\\-74.49497\\-157.1896\\-21\\-72.54185\\-157.6646\\-21\\-70.58872\\-159.0989\\-21\\-68.6356\\-159.1342\\-21\\-66.68247\\-159.5973\\-21\\-65.6088\\-160.599\\-21\\-65.08009\\-162.5521\\-21\\-64.7672\\-164.5053\\-21\\-64.34241\\-166.4584\\-21\\-64.30398\\-168.4115\\-21\\-63.87786\\-170.3646\\-21\\-62.85886\\-172.3178\\-21\\-62.36983\\-174.2709\\-21\\-62.35085\\-176.224\\-21\\-62.16254\\-178.1771\\-21\\-61.57703\\-180.1303\\-21\\-60.46628\\-182.0834\\-21\\-60.46628\\-184.0365\\-21\\-60.19831\\-185.9896\\-21\\-59.67505\\-187.9428\\-21\\-57.83238\\-189.8959\\-21\\-56.82211\\-191.849\\-21\\-56.79478\\-193.8021\\-21\\-56.43745\\-195.7553\\-21\\-55.29982\\-199.6615\\-21\\-53.71313\\-203.5678\\-21\\-52.12775\\-205.5209\\-21\\-51.35241\\-207.474\\-21\\-50.18649\\-209.4271\\-21\\-48.72342\\-213.3334\\-21\\-47.66029\\-215.2865\\-21\\-45.75984\\-217.2396\\-21\\-46.34647\\-219.1928\\-21\\-45.8412\\-221.1459\\-21\\-45.00279\\-223.099\\-21\\-44.86201\\-227.0053\\-21\\-45.1981\\-227.3698\\-21\\-47.15123\\-228.2083\\-21\\-49.10435\\-228.0702\\-21\\-51.05748\\-228.0512\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "305" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1636\\-21\\-39.33873\\-155.6987\\-21\\-41.29185\\-155.2193\\-21\\-43.24498\\-153.787\\-21\\-44.28631\\-152.7865\\-21\\-46.03439\\-150.8334\\-21\\-46.69824\\-148.8803\\-21\\-47.15123\\-148.3581\\-21\\-49.10435\\-146.8186\\-21\\-51.05748\\-147.9601\\-21\\-52.89986\\-146.9271\\-21\\-52.01878\\-144.974\\-21\\-51.05748\\-144.0512\\-21\\-49.10435\\-143.0285\\-21\\-47.21781\\-141.0678\\-21\\-46.60501\\-139.1146\\-21\\-45.82156\\-137.1615\\-21\\-44.60344\\-135.2084\\-21\\-43.24498\\-133.7257\\-21\\-41.29185\\-132.2692\\-21\\-39.33873\\-131.5138\\-21\\-37.3856\\-130.3448\\-21\\-35.43248\\-129.802\\-21\\-33.47935\\-129.7837\\-21\\-31.52623\\-128.6206\\-21\\-29.5731\\-127.8306\\-21\\-27.61998\\-127.8213\\-21\\-25.66685\\-128.0523\\-21\\-23.71373\\-128.8116\\-21\\-21.7606\\-129.9806\\-21\\-19.80748\\-131.5183\\-21\\-17.85435\\-134.8322\\-21\\-17.54836\\-135.2084\\-21\\-16.04983\\-139.1146\\-21\\-15.12101\\-141.0678\\-21\\-13.09217\\-143.0209\\-21\\-12.20668\\-144.974\\-21\\-12.17183\\-146.9271\\-21\\-11.12286\\-148.8803\\-21\\-11.59505\\-150.8334\\-21\\-11.99498\\-151.1152\\-21\\-13.9481\\-149.544\\-21\\-14.45685\\-148.8803\\-21\\-15.23716\\-146.9271\\-21\\-15.90123\\-146.2743\\-21\\-17.85435\\-146.978\\-21\\-18.71171\\-148.8803\\-21\\-20.54885\\-150.8334\\-21\\-21.7606\\-152.3363\\-21\\-24.21983\\-154.7396\\-21\\-25.66685\\-155.841\\-21\\-27.61998\\-156.7875\\-21\\-29.5731\\-157.1724\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "32" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "306" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "34.88002\\-235.6556\\-21\\33.40501\\-234.8178\\-21\\30.97377\\-233.0349\\-21\\29.02065\\-232.656\\-21\\25.1144\\-230.6243\\-21\\23.16127\\-231.1312\\-21\\21.20815\\-231.0792\\-21\\20.74699\\-230.9115\\-21\\21.20815\\-230.5506\\-21\\22.35256\\-228.9584\\-21\\23.16127\\-228.4559\\-21\\25.07684\\-227.0053\\-21\\28.89123\\-225.0521\\-21\\30.97377\\-223.81\\-21\\33.66528\\-221.1459\\-21\\38.78627\\-216.7107\\-21\\40.7394\\-215.9801\\-21\\42.69252\\-216.4365\\-21\\44.64565\\-216.6189\\-21\\46.59877\\-215.5286\\-21\\48.5519\\-214.084\\-21\\50.50502\\-213.4699\\-21\\51.81468\\-215.2865\\-21\\52.194\\-217.2396\\-21\\52.00371\\-219.1928\\-21\\50.50502\\-221.6799\\-21\\48.82271\\-225.0521\\-21\\47.22656\\-227.0053\\-21\\43.32031\\-230.9115\\-21\\40.7394\\-233.1291\\-21\\38.78627\\-235.152\\-21\\36.83315\\-235.9552\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "307" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-209.5356\\-21\\52.25871\\-207.474\\-21\\52.27115\\-205.5209\\-21\\52.45815\\-205.2673\\-21\\54.23689\\-201.6146\\-21\\54.30277\\-197.7084\\-21\\53.91657\\-195.7553\\-21\\56.25589\\-191.849\\-21\\56.28363\\-189.8959\\-21\\57.33559\\-187.9428\\-21\\58.18982\\-185.9896\\-21\\58.91044\\-185.9896\\-21\\59.23399\\-187.9428\\-21\\58.55325\\-189.8959\\-21\\58.31752\\-191.2105\\-21\\57.27993\\-191.849\\-21\\58.15757\\-193.8021\\-21\\58.20902\\-197.7084\\-21\\59.0575\\-199.6615\\-21\\59.68361\\-201.6146\\-21\\61.1935\\-205.5209\\-21\\61.30825\\-207.474\\-21\\60.27065\\-208.0311\\-21\\58.31752\\-207.8711\\-21\\56.3644\\-208.3778\\-21\\54.41127\\-209.8334\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002312" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "84" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "308" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "71.9894\\-202.1803\\-21\\71.41673\\-201.6146\\-21\\70.46963\\-199.6615\\-21\\69.64934\\-195.7553\\-21\\69.67945\\-191.849\\-21\\70.69672\\-189.8959\\-21\\71.30522\\-187.9428\\-21\\71.68543\\-184.0365\\-21\\71.67367\\-182.0834\\-21\\70.03628\\-181.0313\\-21\\68.08315\\-182.2055\\-21\\66.13003\\-182.2055\\-21\\62.22377\\-182.8006\\-21\\60.27065\\-182.5991\\-21\\59.93805\\-182.0834\\-21\\58.31752\\-180.7362\\-21\\56.3644\\-181.5362\\-21\\54.80344\\-180.1303\\-21\\55.93105\\-176.224\\-21\\56.26966\\-174.2709\\-21\\57.03257\\-174.2709\\-21\\58.31752\\-174.9889\\-21\\59.05734\\-174.2709\\-21\\59.94789\\-172.3178\\-21\\59.99065\\-170.3646\\-21\\59.50939\\-168.4115\\-21\\59.6626\\-166.4584\\-21\\58.31752\\-165.2702\\-21\\57.45862\\-166.4584\\-21\\56.3644\\-167.3152\\-21\\54.41127\\-166.666\\-21\\51.0853\\-164.5053\\-21\\52.45815\\-162.5721\\-21\\54.41127\\-163.2888\\-21\\54.77642\\-162.5521\\-21\\55.00981\\-160.599\\-21\\56.3644\\-159.7362\\-21\\57.88219\\-160.599\\-21\\58.31752\\-161.0143\\-21\\59.00716\\-162.5521\\-21\\60.27065\\-164.4671\\-21\\61.55399\\-162.5521\\-21\\61.82705\\-160.599\\-21\\62.22377\\-160.1069\\-21\\64.1769\\-158.3599\\-21\\66.13003\\-157.5359\\-21\\68.08315\\-157.181\\-21\\70.03628\\-157.1896\\-21\\71.9894\\-157.6693\\-21\\73.94253\\-158.8329\\-21\\75.89565\\-159.4873\\-21\\77.84878\\-159.4722\\-21\\79.8019\\-159.9283\\-21\\80.44778\\-160.599\\-21\\81.75503\\-162.2572\\-21\\83.99976\\-164.5053\\-21\\85.11555\\-166.4584\\-21\\84.74125\\-168.4115\\-21\\83.70815\\-169.3418\\-21\\81.75503\\-170.3723\\-21\\79.8019\\-171.3038\\-21\\78.73701\\-172.3178\\-21\\79.4277\\-174.2709\\-21\\79.8019\\-174.5414\\-21\\81.75503\\-175.3479\\-21\\82.55357\\-176.224\\-21\\82.97451\\-178.1771\\-21\\83.58608\\-180.1303\\-21\\83.99011\\-182.0834\\-21\\84.50065\\-184.0365\\-21\\85.17592\\-185.9896\\-21\\86.41714\\-187.9428\\-21\\87.9562\\-189.8959\\-21\\90.42767\\-191.849\\-21\\90.44939\\-193.8021\\-21\\88.9183\\-195.7553\\-21\\87.6144\\-197.0592\\-21\\85.66128\\-196.7318\\-21\\83.70815\\-196.7919\\-21\\81.75503\\-197.775\\-21\\79.8019\\-198.5291\\-21\\77.84878\\-199.9433\\-21\\75.89565\\-200.8121\\-21\\73.94253\\-202.4672\\-21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "24" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "309" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-135.0419\\-214.1947\\-19\\-136.995\\-212.9466\\-19\\-138.9481\\-211.9582\\-19\\-139.4693\\-211.3803\\-19\\-139.9778\\-209.4271\\-19\\-140.3785\\-207.474\\-19\\-141.6436\\-205.5209\\-19\\-141.9344\\-203.5678\\-19\\-141.7852\\-201.6146\\-19\\-140.9012\\-200.6225\\-19\\-138.9481\\-200.5324\\-19\\-136.995\\-201.1146\\-19\\-135.0419\\-201.9186\\-19\\-133.0887\\-202.9292\\-19\\-132.397\\-203.5678\\-19\\-131.1356\\-205.9623\\-19\\-129.6029\\-207.474\\-19\\-127.4037\\-209.4271\\-19\\-125.8437\\-211.3803\\-19\\-125.7645\\-213.3334\\-19\\-127.2293\\-214.5001\\-19\\-129.1825\\-215.0359\\-19\\-131.1356\\-215.1293\\-19\\-133.0887\\-215.0978\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "139" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "310" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-53.0106\\-227.8294\\-19\\-54.96373\\-226.391\\-19\\-56.91685\\-225.8719\\-19\\-59.69734\\-223.099\\-19\\-60.8231\\-221.7481\\-19\\-62.77623\\-219.7976\\-19\\-65.79623\\-217.2396\\-19\\-67.43683\\-215.2865\\-19\\-67.88847\\-213.3334\\-19\\-67.41067\\-211.3803\\-19\\-66.09544\\-209.4271\\-19\\-65.48421\\-207.474\\-19\\-64.72935\\-206.6982\\-19\\-62.77623\\-205.1242\\-19\\-60.8231\\-203.88\\-19\\-60.51914\\-203.5678\\-19\\-60.46628\\-201.6146\\-19\\-60.19493\\-199.6615\\-19\\-59.76802\\-197.7084\\-19\\-58.86998\\-194.4092\\-19\\-57.62215\\-193.8021\\-19\\-58.86998\\-193.5498\\-19\\-59.63834\\-191.849\\-19\\-61.35961\\-189.8959\\-19\\-61.92243\\-187.9428\\-19\\-61.55552\\-185.9896\\-19\\-62.77623\\-185.4262\\-19\\-64.72935\\-184.3425\\-19\\-66.68247\\-183.0327\\-19\\-68.6356\\-182.1642\\-19\\-72.2249\\-180.1303\\-19\\-72.54185\\-179.8776\\-19\\-73.05804\\-180.1303\\-19\\-73.42841\\-182.0834\\-19\\-72.12332\\-184.0365\\-19\\-70.96432\\-185.9896\\-19\\-68.83091\\-187.9428\\-19\\-68.36507\\-189.8959\\-19\\-68.33163\\-193.8021\\-19\\-68.34263\\-201.6146\\-19\\-68.78421\\-203.5678\\-19\\-69.77013\\-205.5209\\-19\\-70.41434\\-207.474\\-19\\-71.57017\\-209.4271\\-19\\-77.4295\\-215.2865\\-19\\-78.40122\\-216.2212\\-19\\-80.35435\\-217.0158\\-19\\-82.30747\\-218.1557\\-19\\-84.2606\\-218.9811\\-19\\-86.21372\\-218.9933\\-19\\-88.16685\\-219.6724\\-19\\-90.11997\\-219.988\\-19\\-92.0731\\-219.5183\\-19\\-94.02622\\-218.2011\\-19\\-95.97935\\-217.7016\\-19\\-99.8856\\-217.0158\\-19\\-101.8387\\-216.7309\\-19\\-103.7918\\-215.8014\\-19\\-105.745\\-214.2834\\-19\\-106.7732\\-213.3334\\-19\\-108.0497\\-211.3803\\-19\\-109.2163\\-209.4271\\-19\\-111.0111\\-207.474\\-19\\-111.1824\\-205.5209\\-19\\-110.3649\\-203.5678\\-19\\-110.4584\\-201.6146\\-19\\-109.7985\\-197.7084\\-19\\-109.13\\-195.7553\\-19\\-107.9992\\-193.8021\\-19\\-107.6981\\-193.5154\\-19\\-103.7918\\-192.076\\-19\\-101.8387\\-191.6496\\-19\\-97.93247\\-191.1922\\-19\\-95.97935\\-191.2032\\-19\\-94.02622\\-191.3549\\-19\\-92.0731\\-192.4679\\-19\\-90.32809\\-191.849\\-19\\-90.11997\\-191.6049\\-19\\-89.59723\\-189.8959\\-19\\-88.8307\\-187.9428\\-19\\-87.14356\\-185.9896\\-19\\-85.76074\\-184.0365\\-19\\-85.75176\\-180.1303\\-19\\-85.46362\\-178.1771\\-19\\-84.2606\\-176.932\\-19\\-82.46818\\-176.224\\-19\\-82.8161\\-174.2709\\-19\\-84.2606\\-173.2256\\-19\\-85.19186\\-172.3178\\-19\\-85.73412\\-170.3646\\-19\\-85.70841\\-168.4115\\-19\\-85.26575\\-166.4584\\-19\\-84.11199\\-164.5053\\-19\\-83.33243\\-162.5521\\-19\\-82.30747\\-160.7022\\-19\\-79.79335\\-158.6459\\-19\\-78.40122\\-157.7413\\-19\\-76.4481\\-157.2147\\-19\\-74.49497\\-157.181\\-19\\-72.54185\\-157.6646\\-19\\-70.58872\\-159.1078\\-19\\-68.6356\\-159.2986\\-19\\-66.68247\\-160.3567\\-19\\-66.45712\\-160.599\\-19\\-65.95005\\-162.5521\\-19\\-65.6312\\-164.5053\\-19\\-64.81136\\-166.4584\\-19\\-64.33262\\-168.4115\\-19\\-64.13701\\-170.3646\\-19\\-63.69012\\-172.3178\\-19\\-62.85823\\-174.2709\\-19\\-62.36028\\-176.224\\-19\\-62.34154\\-178.1771\\-19\\-61.79098\\-180.1303\\-19\\-60.50829\\-182.0834\\-19\\-61.00501\\-184.0365\\-19\\-60.52817\\-185.9896\\-19\\-59.58988\\-187.9428\\-19\\-58.86998\\-188.6112\\-19\\-57.83734\\-189.8959\\-19\\-56.86467\\-191.849\\-19\\-56.82211\\-193.8021\\-19\\-56.00441\\-195.7553\\-19\\-55.29982\\-197.7084\\-19\\-54.91154\\-199.6615\\-19\\-53.29243\\-203.5678\\-19\\-51.88593\\-205.5209\\-19\\-50.67561\\-207.474\\-19\\-49.77195\\-209.4271\\-19\\-48.21412\\-211.3803\\-19\\-48.13282\\-213.3334\\-19\\-47.83418\\-215.2865\\-19\\-47.88108\\-217.2396\\-19\\-48.81829\\-219.1928\\-19\\-47.8364\\-221.1459\\-19\\-45.25028\\-227.0053\\-19\\-47.15123\\-228.6654\\-19\\-49.10435\\-228.3298\\-19\\-51.05748\\-228.3228\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "311" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1636\\-19\\-39.33873\\-155.6987\\-19\\-41.29185\\-155.2193\\-19\\-43.24498\\-153.787\\-19\\-46.25096\\-150.8334\\-19\\-46.89214\\-148.8803\\-19\\-48.38509\\-146.9271\\-19\\-49.10435\\-146.2561\\-19\\-51.05748\\-147.2168\\-19\\-51.83429\\-146.9271\\-19\\-52.50354\\-144.974\\-19\\-51.05748\\-143.6923\\-19\\-49.10435\\-142.2946\\-19\\-48.00776\\-141.0678\\-19\\-47.20341\\-139.1146\\-19\\-45.1981\\-135.2176\\-19\\-43.77708\\-133.2553\\-19\\-43.24498\\-132.746\\-19\\-41.29185\\-131.9549\\-19\\-39.33873\\-130.7577\\-19\\-37.3856\\-129.9948\\-19\\-35.43248\\-129.7929\\-19\\-33.47935\\-129.7837\\-19\\-31.52623\\-128.8577\\-19\\-29.5731\\-128.2246\\-19\\-25.66685\\-128.2246\\-19\\-23.71373\\-128.7869\\-19\\-21.7606\\-129.7929\\-19\\-19.80748\\-130.5685\\-19\\-19.07379\\-131.3021\\-19\\-18.35412\\-133.2553\\-19\\-17.10431\\-135.2084\\-19\\-16.42318\\-137.1615\\-19\\-16.04983\\-139.1146\\-19\\-14.73917\\-141.0678\\-19\\-12.5407\\-143.0209\\-19\\-12.16936\\-144.974\\-19\\-12.18372\\-146.9271\\-19\\-11.12286\\-148.8803\\-19\\-11.59505\\-150.8334\\-19\\-11.99498\\-151.1152\\-19\\-12.38743\\-150.8334\\-19\\-14.18382\\-148.8803\\-19\\-15.02482\\-146.9271\\-19\\-15.90123\\-146.0975\\-19\\-17.85435\\-147.0356\\-19\\-18.71171\\-148.8803\\-19\\-23.71373\\-153.8677\\-19\\-25.66685\\-155.3539\\-19\\-27.61998\\-156.0398\\-19\\-29.5731\\-157.181\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "312" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "36.81145\\-234.8178\\-19\\34.88002\\-234.2057\\-19\\32.9269\\-233.0119\\-19\\30.97377\\-231.5347\\-19\\29.58074\\-230.9115\\-19\\27.28036\\-228.9584\\-19\\28.81407\\-227.0053\\-19\\30.97377\\-225.7943\\-19\\39.55684\\-217.2396\\-19\\40.7394\\-216.2816\\-19\\42.69252\\-215.7574\\-19\\44.64565\\-215.0356\\-19\\46.59877\\-214.043\\-19\\48.5519\\-212.3889\\-19\\50.50502\\-210.9881\\-19\\51.56514\\-209.4271\\-19\\52.25871\\-207.474\\-19\\52.27115\\-205.5209\\-19\\53.13816\\-203.5678\\-19\\53.73917\\-201.6146\\-19\\54.26266\\-197.7084\\-19\\54.2892\\-195.7553\\-19\\56.25589\\-191.849\\-19\\56.28363\\-189.8959\\-19\\58.31752\\-185.8501\\-19\\60.27065\\-185.6641\\-19\\60.43224\\-185.9896\\-19\\59.38612\\-187.9428\\-19\\59.03173\\-189.8959\\-19\\58.84336\\-191.849\\-19\\58.22278\\-195.7553\\-19\\58.61049\\-197.7084\\-19\\60.08365\\-201.6146\\-19\\61.03761\\-203.5678\\-19\\63.16068\\-207.474\\-19\\62.22377\\-209.3197\\-19\\60.27065\\-209.1123\\-19\\58.31752\\-208.6595\\-19\\56.3644\\-209.7131\\-19\\52.94643\\-211.3803\\-19\\52.45815\\-212.0778\\-19\\51.9445\\-213.3334\\-19\\53.17505\\-215.2865\\-19\\53.92651\\-217.2396\\-19\\53.90207\\-219.1928\\-19\\53.033\\-221.1459\\-19\\51.63068\\-223.099\\-19\\50.56774\\-225.0521\\-19\\48.86805\\-227.0053\\-19\\46.59877\\-229.2404\\-19\\44.48406\\-230.9115\\-19\\42.69252\\-232.0644\\-19\\40.7394\\-233.6469\\-19\\38.78627\\-234.5703\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002311" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "73" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "313" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "71.9894\\-202.4704\\-19\\71.1731\\-201.6146\\-19\\70.85835\\-199.6615\\-19\\70.92355\\-197.7084\\-19\\70.38456\\-195.7553\\-19\\70.35017\\-193.8021\\-19\\69.99871\\-191.849\\-19\\70.07442\\-189.8959\\-19\\70.47105\\-187.9428\\-19\\71.9894\\-181.9362\\-19\\70.03628\\-181.0262\\-19\\68.08315\\-182.2188\\-19\\66.13003\\-182.245\\-19\\62.22377\\-182.8429\\-19\\61.09436\\-182.0834\\-19\\59.48779\\-180.1303\\-19\\59.83066\\-178.1771\\-19\\59.84747\\-174.2709\\-19\\59.98817\\-172.3178\\-19\\59.74422\\-170.3646\\-19\\58.31752\\-168.83\\-19\\57.5513\\-168.4115\\-19\\56.10088\\-166.4584\\-19\\56.01563\\-164.5053\\-19\\56.3644\\-162.4148\\-19\\58.31752\\-161.0906\\-19\\59.31192\\-162.5521\\-19\\58.73004\\-164.5053\\-19\\60.27065\\-166.6415\\-19\\61.44638\\-164.5053\\-19\\62.34675\\-162.5521\\-19\\62.27596\\-160.599\\-19\\63.00613\\-158.6459\\-19\\64.1769\\-157.6358\\-19\\66.13003\\-157.2958\\-19\\68.08315\\-157.1547\\-19\\70.03628\\-157.1547\\-19\\71.9894\\-157.356\\-19\\73.94253\\-158.0704\\-19\\75.89565\\-159.3349\\-19\\77.84878\\-159.4998\\-19\\79.8019\\-159.9051\\-19\\81.75503\\-161.6609\\-19\\84.78385\\-164.5053\\-19\\86.38114\\-166.4584\\-19\\85.20889\\-168.4115\\-19\\83.70815\\-169.3608\\-19\\81.75503\\-170.3873\\-19\\79.8019\\-171.3086\\-19\\78.73701\\-172.3178\\-19\\78.8724\\-174.2709\\-19\\79.8019\\-174.7328\\-19\\81.75503\\-174.8071\\-19\\83.01203\\-176.224\\-19\\83.22854\\-178.1771\\-19\\84.42907\\-180.1303\\-19\\84.8049\\-182.0834\\-19\\84.91337\\-184.0365\\-19\\85.98894\\-185.9896\\-19\\86.78736\\-187.9428\\-19\\87.6144\\-188.9138\\-19\\89.56753\\-190.7993\\-19\\91.04338\\-191.849\\-19\\91.03711\\-193.8021\\-19\\89.56753\\-194.7541\\-19\\87.6144\\-197.0517\\-19\\85.66128\\-197.9884\\-19\\83.70815\\-197.9377\\-19\\81.75503\\-198.3913\\-19\\79.8019\\-199.0988\\-19\\76.72258\\-201.6146\\-19\\75.89565\\-202.422\\-19\\73.94253\\-203.35\\-19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "16" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "314" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-137.1171\\-211.3803\\-17\\-138.5074\\-209.4271\\-17\\-138.9481\\-208.6489\\-17\\-140.2362\\-205.5209\\-17\\-140.6116\\-203.5678\\-17\\-140.617\\-201.6146\\-17\\-138.9481\\-200.4499\\-17\\-136.995\\-201.0657\\-17\\-135.0419\\-202.6575\\-17\\-134.0843\\-203.5678\\-17\\-133.1596\\-205.5209\\-17\\-132.7705\\-207.474\\-17\\-131.4954\\-209.4271\\-17\\-131.2492\\-211.3803\\-17\\-133.0887\\-212.6162\\-17\\-135.0419\\-212.3648\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "83" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "315" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.11997\\-219.2593\\-17\\-92.0731\\-218.5923\\-17\\-94.02622\\-217.819\\-17\\-97.93247\\-217.6167\\-17\\-101.8387\\-216.2631\\-17\\-103.3931\\-215.2865\\-17\\-105.9432\\-213.3334\\-17\\-109.2874\\-207.474\\-17\\-108.7178\\-203.5678\\-17\\-109.2165\\-201.6146\\-17\\-109.0829\\-199.6615\\-17\\-108.5843\\-197.7084\\-17\\-107.9698\\-195.7553\\-17\\-106.2019\\-193.8021\\-17\\-105.745\\-193.4723\\-17\\-103.7918\\-192.6823\\-17\\-101.8387\\-191.6373\\-17\\-97.93247\\-191.5899\\-17\\-95.97935\\-191.1052\\-17\\-94.02622\\-190.7742\\-17\\-92.08296\\-191.849\\-17\\-90.11997\\-190.964\\-17\\-88.53619\\-187.9428\\-17\\-87.29612\\-185.9896\\-17\\-86.58984\\-184.0365\\-17\\-86.56823\\-182.0834\\-17\\-86.16154\\-180.1303\\-17\\-85.87764\\-178.1771\\-17\\-84.2606\\-176.7622\\-17\\-83.42231\\-176.224\\-17\\-83.14529\\-174.2709\\-17\\-85.212\\-172.3178\\-17\\-85.77904\\-170.3646\\-17\\-85.76984\\-168.4115\\-17\\-85.55743\\-166.4584\\-17\\-85.0601\\-164.5053\\-17\\-83.8326\\-162.5521\\-17\\-82.97427\\-160.599\\-17\\-82.30747\\-159.9138\\-17\\-80.35435\\-159.1167\\-17\\-78.40122\\-157.7413\\-17\\-76.4481\\-157.2147\\-17\\-74.49497\\-157.181\\-17\\-72.54185\\-157.6506\\-17\\-70.58872\\-159.0806\\-17\\-68.6356\\-159.6122\\-17\\-67.59429\\-160.599\\-17\\-66.68247\\-162.8384\\-17\\-66.13626\\-164.5053\\-17\\-65.64753\\-166.4584\\-17\\-64.82553\\-168.4115\\-17\\-64.33262\\-170.3646\\-17\\-64.13701\\-172.3178\\-17\\-63.53933\\-174.2709\\-17\\-62.36028\\-176.224\\-17\\-62.34154\\-178.1771\\-17\\-61.80399\\-180.1303\\-17\\-61.03604\\-182.0834\\-17\\-62.77623\\-183.5863\\-17\\-64.72935\\-183.3221\\-17\\-66.68247\\-182.8924\\-17\\-68.6356\\-181.6527\\-17\\-70.58872\\-181.0414\\-17\\-72.54185\\-180.7399\\-17\\-73.77341\\-182.0834\\-17\\-71.9966\\-185.9896\\-17\\-68.79556\\-187.9428\\-17\\-69.01427\\-189.8959\\-17\\-68.36507\\-193.8021\\-17\\-68.74574\\-195.7553\\-17\\-68.73106\\-197.7084\\-17\\-68.39988\\-199.6615\\-17\\-68.79836\\-201.6146\\-17\\-69.55821\\-203.5678\\-17\\-70.82445\\-207.474\\-17\\-71.72296\\-209.4271\\-17\\-73.51841\\-211.3803\\-17\\-78.40122\\-216.2119\\-17\\-80.35435\\-216.9921\\-17\\-82.30747\\-218.1464\\-17\\-84.2606\\-218.957\\-17\\-86.21372\\-218.9811\\-17\\-88.16685\\-219.3414\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "316" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-49.10435\\-228.3298\\-17\\-51.05748\\-228.2955\\-17\\-53.0106\\-227.8199\\-17\\-54.96373\\-226.3697\\-17\\-56.91685\\-225.8561\\-17\\-60.8231\\-221.952\\-17\\-62.77623\\-220.1267\\-17\\-64.72935\\-219.2321\\-17\\-66.95213\\-217.2396\\-17\\-68.0588\\-215.2865\\-17\\-68.33163\\-213.3334\\-17\\-67.69952\\-211.3803\\-17\\-66.29554\\-209.4271\\-17\\-65.74294\\-207.474\\-17\\-64.72935\\-206.4884\\-17\\-61.02539\\-203.5678\\-17\\-60.47658\\-201.6146\\-17\\-60.46628\\-199.6615\\-17\\-60.21275\\-197.7084\\-17\\-59.78306\\-195.7553\\-17\\-58.86998\\-192.6059\\-17\\-56.91685\\-193.6122\\-17\\-55.82909\\-195.7553\\-17\\-54.9561\\-197.7084\\-17\\-54.89714\\-199.6615\\-17\\-53.85358\\-201.6146\\-17\\-52.59909\\-203.5678\\-17\\-51.74412\\-205.5209\\-17\\-50.16829\\-207.474\\-17\\-49.28127\\-209.4271\\-17\\-47.98754\\-211.3803\\-17\\-48.19532\\-213.3334\\-17\\-48.62495\\-215.2865\\-17\\-49.56499\\-217.2396\\-17\\-50.23367\\-219.1928\\-17\\-49.69965\\-221.1459\\-17\\-47.52232\\-225.0521\\-17\\-46.06794\\-227.0053\\-17\\-47.06154\\-228.9584\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "317" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1636\\-17\\-39.33873\\-155.6987\\-17\\-41.29185\\-155.2193\\-17\\-43.24498\\-153.787\\-17\\-46.23538\\-150.8334\\-17\\-46.8694\\-148.8803\\-17\\-48.2033\\-146.9271\\-17\\-49.10435\\-146.0353\\-17\\-51.05748\\-146.2705\\-17\\-52.92182\\-144.974\\-17\\-51.05748\\-142.9982\\-17\\-49.10435\\-141.3907\\-17\\-48.83198\\-141.0678\\-17\\-46.60501\\-137.1615\\-17\\-45.78978\\-135.2084\\-17\\-43.24498\\-132.4894\\-17\\-41.29185\\-131.799\\-17\\-39.33873\\-130.5199\\-17\\-37.3856\\-129.802\\-17\\-33.47935\\-129.7837\\-17\\-31.52623\\-129.5106\\-17\\-29.5731\\-129.048\\-17\\-25.66685\\-129.048\\-17\\-21.7606\\-129.811\\-17\\-19.80748\\-130.4899\\-17\\-18.97111\\-131.3021\\-17\\-17.85435\\-133.3414\\-17\\-16.06281\\-137.1615\\-17\\-16.04983\\-139.1146\\-17\\-14.75201\\-141.0678\\-17\\-12.51772\\-143.0209\\-17\\-12.17062\\-144.974\\-17\\-12.21095\\-146.9271\\-17\\-11.12286\\-148.8803\\-17\\-11.59505\\-150.8334\\-17\\-11.99498\\-151.1152\\-17\\-12.38743\\-150.8334\\-17\\-14.1719\\-148.8803\\-17\\-14.94076\\-146.9271\\-17\\-15.90123\\-146.1065\\-17\\-17.2255\\-146.9271\\-17\\-17.85435\\-147.6075\\-17\\-18.61925\\-148.8803\\-17\\-19.80748\\-150.3246\\-17\\-22.26443\\-152.7865\\-17\\-23.71373\\-154.072\\-17\\-25.66685\\-155.2533\\-17\\-27.61998\\-155.8344\\-17\\-29.5731\\-157.181\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002310" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "138" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "318" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "36.83315\\-233.6978\\-17\\35.35854\\-232.8646\\-17\\33.23978\\-230.9115\\-17\\31.31392\\-228.9584\\-17\\32.07369\\-227.0053\\-17\\32.9269\\-226.143\\-17\\33.7407\\-225.0521\\-17\\36.83315\\-221.9442\\-17\\39.19058\\-219.1928\\-17\\40.7394\\-217.6439\\-17\\42.69252\\-216.1708\\-17\\44.64565\\-214.4409\\-17\\46.59877\\-212.5936\\-17\\48.5519\\-211.3137\\-17\\50.50502\\-210.6114\\-17\\51.70302\\-209.4271\\-17\\52.27115\\-207.474\\-17\\52.27115\\-205.5209\\-17\\52.96198\\-201.6146\\-17\\53.37067\\-199.6615\\-17\\53.94086\\-197.7084\\-17\\54.26266\\-195.7553\\-17\\56.25589\\-191.849\\-17\\56.28363\\-189.8959\\-17\\57.31985\\-187.9428\\-17\\58.18209\\-185.9896\\-17\\59.33341\\-184.0365\\-17\\60.05441\\-182.0834\\-17\\60.00011\\-180.1303\\-17\\60.01156\\-174.2709\\-17\\60.51814\\-172.3178\\-17\\60.58877\\-170.3646\\-17\\60.90039\\-168.4115\\-17\\61.83514\\-166.4584\\-17\\62.22377\\-165.922\\-17\\62.79855\\-164.5053\\-17\\63.08373\\-162.5521\\-17\\63.05312\\-160.599\\-17\\63.19042\\-158.6459\\-17\\64.1769\\-157.6594\\-17\\68.08315\\-156.6546\\-17\\70.03628\\-156.7875\\-17\\71.9894\\-157.1724\\-17\\73.94253\\-157.6645\\-17\\75.89565\\-158.7945\\-17\\79.8019\\-160.1901\\-17\\80.21601\\-160.599\\-17\\83.03527\\-162.5521\\-17\\83.70815\\-163.1652\\-17\\85.66128\\-164.2508\\-17\\85.91936\\-164.5053\\-17\\86.89456\\-166.4584\\-17\\86.0736\\-168.4115\\-17\\85.66128\\-168.7706\\-17\\83.70815\\-169.5365\\-17\\81.75503\\-170.6902\\-17\\79.8019\\-171.4744\\-17\\78.85844\\-172.3178\\-17\\77.18762\\-174.2709\\-17\\77.84878\\-175.7093\\-17\\81.75503\\-174.7328\\-17\\83.70815\\-175.7594\\-17\\84.08473\\-176.224\\-17\\84.17232\\-178.1771\\-17\\84.73679\\-180.1303\\-17\\85.07641\\-182.0834\\-17\\84.917\\-184.0365\\-17\\85.22392\\-185.9896\\-17\\86.68501\\-187.9428\\-17\\87.6144\\-188.9771\\-17\\89.56753\\-190.2124\\-17\\91.52065\\-191.1958\\-17\\92.21122\\-191.849\\-17\\92.47233\\-193.8021\\-17\\91.52065\\-194.7599\\-17\\89.56753\\-195.2851\\-17\\89.15534\\-195.7553\\-17\\88.10614\\-197.7084\\-17\\87.6144\\-198.2587\\-17\\85.66128\\-199.6351\\-17\\83.70815\\-199.6527\\-17\\81.75503\\-200.283\\-17\\79.75224\\-201.6146\\-17\\77.84878\\-202.5059\\-17\\75.89565\\-204.3767\\-17\\73.94253\\-204.2095\\-17\\73.2971\\-203.5678\\-17\\71.88089\\-201.6146\\-17\\71.45828\\-199.6615\\-17\\71.49255\\-197.7084\\-17\\71.25117\\-195.7553\\-17\\71.24227\\-193.8021\\-17\\70.87253\\-191.849\\-17\\70.40166\\-189.8959\\-17\\70.47363\\-185.9896\\-17\\71.14887\\-184.0365\\-17\\72.69065\\-182.0834\\-17\\73.07583\\-180.1303\\-17\\71.9894\\-179.5659\\-17\\71.36858\\-180.1303\\-17\\68.08315\\-182.3191\\-17\\66.13003\\-182.5832\\-17\\64.1769\\-183.1031\\-17\\62.68181\\-184.0365\\-17\\62.22377\\-184.4905\\-17\\61.23018\\-185.9896\\-17\\59.36029\\-187.9428\\-17\\59.19199\\-189.8959\\-17\\59.53555\\-191.849\\-17\\58.8956\\-195.7553\\-17\\59.18391\\-197.7084\\-17\\59.73641\\-199.6615\\-17\\60.27065\\-200.9778\\-17\\61.54282\\-203.5678\\-17\\63.1381\\-205.5209\\-17\\63.9899\\-207.474\\-17\\64.27531\\-209.4271\\-17\\62.22377\\-210.8817\\-17\\60.27065\\-210.2174\\-17\\58.31752\\-208.9742\\-17\\56.3644\\-210.0466\\-17\\54.41127\\-210.598\\-17\\52.33775\\-211.3803\\-17\\51.80149\\-213.3334\\-17\\53.09076\\-215.2865\\-17\\55.01177\\-217.2396\\-17\\55.23677\\-219.1928\\-17\\54.23176\\-221.1459\\-17\\53.56688\\-223.099\\-17\\52.43077\\-225.0521\\-17\\50.50502\\-226.131\\-17\\47.1824\\-228.9584\\-17\\46.59877\\-229.5318\\-17\\44.64565\\-230.4468\\-17\\44.10615\\-230.9115\\-17\\41.33185\\-232.8646\\-17\\40.7394\\-233.3874\\-17\\38.78627\\-233.9887\\-17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "319" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-136.995\\-208.4831\\-15\\-137.683\\-207.474\\-15\\-138.9481\\-205.1901\\-15\\-139.5132\\-203.5678\\-15\\-139.0866\\-201.6146\\-15\\-138.9481\\-201.4662\\-15\\-136.995\\-202.4243\\-15\\-135.8214\\-203.5678\\-15\\-134.6833\\-205.5209\\-15\\-134.668\\-207.474\\-15\\-135.0419\\-208.431\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "88" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "320" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-217.3229\\-15\\-94.02622\\-217.0499\\-15\\-95.97935\\-217.0249\\-15\\-97.93247\\-216.6642\\-15\\-99.8856\\-216.4795\\-15\\-101.8387\\-215.839\\-15\\-103.7918\\-214.294\\-15\\-104.8503\\-213.3334\\-15\\-106.5205\\-211.3803\\-15\\-107.3162\\-209.4271\\-15\\-108.5007\\-207.474\\-15\\-108.3152\\-203.5678\\-15\\-108.863\\-201.6146\\-15\\-108.5656\\-199.6615\\-15\\-107.4257\\-197.7084\\-15\\-106.9219\\-195.7553\\-15\\-105.745\\-194.215\\-15\\-103.7918\\-192.9335\\-15\\-101.8387\\-191.4143\\-15\\-99.8856\\-191.1854\\-15\\-97.93247\\-191.0901\\-15\\-95.97935\\-190.5641\\-15\\-94.02622\\-189.7215\\-15\\-92.0731\\-189.745\\-15\\-90.11997\\-188.7125\\-15\\-89.55103\\-187.9428\\-15\\-88.46344\\-185.9896\\-15\\-87.68867\\-184.0365\\-15\\-87.11391\\-180.1303\\-15\\-87.09702\\-178.1771\\-15\\-86.21372\\-176.9583\\-15\\-84.2606\\-176.749\\-15\\-83.36139\\-176.224\\-15\\-83.39693\\-174.2709\\-15\\-85.59602\\-172.3178\\-15\\-86.77087\\-170.3646\\-15\\-86.69886\\-168.4115\\-15\\-85.54041\\-164.5053\\-15\\-84.89536\\-162.5521\\-15\\-83.19733\\-160.599\\-15\\-82.30747\\-159.7133\\-15\\-80.35435\\-159.1167\\-15\\-78.40122\\-157.7503\\-15\\-76.4481\\-157.239\\-15\\-74.49497\\-157.181\\-15\\-72.54185\\-157.5542\\-15\\-70.58872\\-158.5933\\-15\\-68.6356\\-160.055\\-15\\-68.15599\\-160.599\\-15\\-67.487\\-162.5521\\-15\\-66.35696\\-164.5053\\-15\\-66.12836\\-166.4584\\-15\\-65.66368\\-168.4115\\-15\\-64.82553\\-170.3646\\-15\\-63.74791\\-174.2709\\-15\\-62.3992\\-176.224\\-15\\-62.35085\\-178.1771\\-15\\-61.87779\\-180.1303\\-15\\-62.42999\\-182.0834\\-15\\-62.77623\\-182.3479\\-15\\-64.72935\\-182.6931\\-15\\-66.4536\\-182.0834\\-15\\-68.6356\\-181.0824\\-15\\-72.54185\\-181.0926\\-15\\-74.49497\\-181.9338\\-15\\-74.49497\\-182.2111\\-15\\-73.30249\\-184.0365\\-15\\-72.50215\\-185.9896\\-15\\-70.11341\\-187.9428\\-15\\-69.90266\\-189.8959\\-15\\-69.30377\\-191.849\\-15\\-68.46121\\-193.8021\\-15\\-69.36663\\-195.7553\\-15\\-69.49346\\-197.7084\\-15\\-69.13287\\-199.6615\\-15\\-69.5746\\-201.6146\\-15\\-70.14484\\-203.5678\\-15\\-70.44012\\-205.5209\\-15\\-71.3771\\-207.474\\-15\\-73.66592\\-211.3803\\-15\\-75.48649\\-213.3334\\-15\\-78.40122\\-216.024\\-15\\-80.35435\\-216.7485\\-15\\-82.30747\\-217.9632\\-15\\-84.2606\\-218.6815\\-15\\-86.21372\\-218.9222\\-15\\-88.16685\\-218.6134\\-15\\-90.11997\\-218.031\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "321" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-53.0106\\-227.5311\\-15\\-54.96373\\-226.1485\\-15\\-56.91685\\-225.3227\\-15\\-58.86998\\-223.6913\\-15\\-60.8231\\-221.9466\\-15\\-62.77623\\-220.5411\\-15\\-64.72935\\-220.3907\\-15\\-66.21176\\-219.1928\\-15\\-67.77906\\-217.2396\\-15\\-68.79955\\-215.2865\\-15\\-68.37651\\-213.3334\\-15\\-67.85538\\-211.3803\\-15\\-66.68247\\-209.3788\\-15\\-65.76199\\-207.474\\-15\\-61.67041\\-203.5678\\-15\\-60.49758\\-201.6146\\-15\\-60.46628\\-197.7084\\-15\\-60.22009\\-195.7553\\-15\\-59.64622\\-193.8021\\-15\\-58.86998\\-192.9469\\-15\\-56.91685\\-193.7681\\-15\\-55.82909\\-195.7553\\-15\\-54.9561\\-197.7084\\-15\\-54.89714\\-199.6615\\-15\\-53.85757\\-201.6146\\-15\\-52.11256\\-203.5678\\-15\\-51.2932\\-205.5209\\-15\\-49.92955\\-207.474\\-15\\-48.6643\\-209.4271\\-15\\-48.05839\\-211.3803\\-15\\-48.35355\\-213.3334\\-15\\-48.96891\\-215.2865\\-15\\-50.49554\\-219.1928\\-15\\-50.57219\\-221.1459\\-15\\-49.72084\\-223.099\\-15\\-47.98488\\-225.0521\\-15\\-46.62927\\-227.0053\\-15\\-47.15123\\-227.8162\\-15\\-49.10435\\-228.2823\\-15\\-51.05748\\-228.1363\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "322" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1636\\-15\\-39.33873\\-155.7074\\-15\\-41.29185\\-155.2365\\-15\\-43.24498\\-153.787\\-15\\-44.28631\\-152.7865\\-15\\-46.06785\\-150.8334\\-15\\-46.68648\\-148.8803\\-15\\-48.01753\\-146.9271\\-15\\-49.10435\\-145.9164\\-15\\-51.05748\\-146.125\\-15\\-52.92182\\-144.974\\-15\\-51.67397\\-143.0209\\-15\\-49.57477\\-141.0678\\-15\\-47.7609\\-139.1146\\-15\\-46.8047\\-137.1615\\-15\\-45.96798\\-135.2084\\-15\\-43.24498\\-132.4894\\-15\\-41.29185\\-131.799\\-15\\-39.33873\\-130.5314\\-15\\-37.3856\\-129.8199\\-15\\-35.43248\\-129.7837\\-15\\-23.71373\\-129.7929\\-15\\-21.7606\\-129.9772\\-15\\-19.80748\\-130.6999\\-15\\-19.17725\\-131.3021\\-15\\-17.85435\\-133.3414\\-15\\-16.06281\\-137.1615\\-15\\-16.04983\\-139.1146\\-15\\-14.93375\\-141.0678\\-15\\-12.91205\\-143.0209\\-15\\-12.21595\\-144.974\\-15\\-12.36319\\-146.9271\\-15\\-11.99498\\-147.1636\\-15\\-11.12286\\-148.8803\\-15\\-11.59505\\-150.8334\\-15\\-11.99498\\-151.1152\\-15\\-12.38743\\-150.8334\\-15\\-14.14754\\-148.8803\\-15\\-14.66425\\-146.9271\\-15\\-15.90123\\-146.1357\\-15\\-16.79423\\-146.9271\\-15\\-18.17987\\-148.8803\\-15\\-19.08219\\-150.8334\\-15\\-21.7606\\-153.5058\\-15\\-23.71373\\-155.0234\\-15\\-27.61998\\-156.0289\\-15\\-29.5731\\-157.239\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "323" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "38.78627\\-233.0212\\-15\\36.83315\\-232.4572\\-15\\35.26672\\-230.9115\\-15\\34.88002\\-229.0529\\-15\\34.98761\\-227.0053\\-15\\36.09553\\-225.0521\\-15\\36.83315\\-224.2902\\-15\\39.08934\\-221.1459\\-15\\39.95486\\-219.1928\\-15\\40.7394\\-218.4169\\-15\\42.69252\\-217.091\\-15\\45.50202\\-213.3334\\-15\\46.59877\\-212.2137\\-15\\48.5519\\-210.7699\\-15\\50.0104\\-211.3803\\-15\\50.50502\\-212.0856\\-15\\50.96031\\-213.3334\\-15\\51.90843\\-215.2865\\-15\\52.45815\\-215.8362\\-15\\54.41127\\-216.8453\\-15\\54.88453\\-217.2396\\-15\\55.83226\\-219.1928\\-15\\55.27875\\-221.1459\\-15\\54.58566\\-223.099\\-15\\53.06448\\-225.0521\\-15\\52.45815\\-225.6585\\-15\\50.50502\\-226.1021\\-15\\46.59877\\-228.4387\\-15\\44.64565\\-229.7125\\-15\\42.69252\\-231.1991\\-15\\40.7394\\-232.3793\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "73" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "324" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "62.22377\\-212.1544\\-15\\61.3937\\-211.3803\\-15\\58.97418\\-209.4271\\-15\\58.31752\\-208.8129\\-15\\56.3644\\-209.0086\\-15\\54.41127\\-209.7665\\-15\\53.71777\\-209.4271\\-15\\52.45815\\-207.9786\\-15\\52.24645\\-207.474\\-15\\52.27115\\-203.5678\\-15\\52.63253\\-201.6146\\-15\\53.67759\\-197.7084\\-15\\54.27584\\-195.7553\\-15\\56.25589\\-191.849\\-15\\56.28363\\-189.8959\\-15\\57.36303\\-187.9428\\-15\\58.16891\\-185.9896\\-15\\58.55325\\-184.0365\\-15\\59.33994\\-182.0834\\-15\\59.97768\\-180.1303\\-15\\60.01156\\-174.2709\\-15\\61.03297\\-172.3178\\-15\\61.55498\\-170.3646\\-15\\62.22377\\-168.9678\\-15\\63.57201\\-166.4584\\-15\\63.69749\\-164.5053\\-15\\63.52077\\-162.5521\\-15\\63.48785\\-160.599\\-15\\63.92941\\-158.6459\\-15\\64.1769\\-158.3821\\-15\\66.13003\\-157.3246\\-15\\68.08315\\-155.9297\\-15\\70.03628\\-156.0976\\-15\\71.9894\\-157.1547\\-15\\73.94253\\-157.3728\\-15\\75.89565\\-157.8551\\-15\\77.84878\\-159.0952\\-15\\79.8019\\-159.8087\\-15\\81.75503\\-161.4994\\-15\\83.70815\\-162.3651\\-15\\85.66128\\-163.6636\\-15\\86.51933\\-164.5053\\-15\\87.35531\\-166.4584\\-15\\86.97044\\-168.4115\\-15\\85.66128\\-169.3987\\-15\\83.70815\\-170.0285\\-15\\81.75503\\-171.1429\\-15\\79.8019\\-171.9667\\-15\\77.84878\\-173.3048\\-15\\76.93169\\-174.2709\\-15\\75.89565\\-175.9717\\-15\\73.86475\\-178.1771\\-15\\71.9894\\-179.3677\\-15\\70.03628\\-181.3032\\-15\\68.08315\\-182.8739\\-15\\66.13003\\-183.4955\\-15\\64.1769\\-184.7245\\-15\\62.22377\\-186.5942\\-15\\60.27065\\-187.4487\\-15\\59.62718\\-187.9428\\-15\\59.21078\\-189.8959\\-15\\60.03493\\-191.849\\-15\\59.69587\\-193.8021\\-15\\59.57078\\-195.7553\\-15\\59.69587\\-197.7084\\-15\\60.57664\\-199.6615\\-15\\61.32716\\-201.6146\\-15\\63.06747\\-203.5678\\-15\\64.58182\\-205.5209\\-15\\65.75842\\-207.474\\-15\\66.15365\\-209.4271\\-15\\64.90556\\-211.3803\\-15\\64.1769\\-212.0118\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002309" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "325" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-205.9208\\-15\\73.87594\\-203.5678\\-15\\72.92881\\-201.6146\\-15\\72.17773\\-199.6615\\-15\\71.75368\\-197.7084\\-15\\71.69643\\-193.8021\\-15\\71.25553\\-189.8959\\-15\\71.25117\\-187.9428\\-15\\70.92061\\-185.9896\\-15\\71.2934\\-184.0365\\-15\\73.08142\\-182.0834\\-15\\73.94253\\-180.861\\-15\\75.89565\\-178.5922\\-15\\77.84878\\-177.3308\\-15\\79.8019\\-176.3188\\-15\\81.75503\\-175.0531\\-15\\83.70815\\-174.8797\\-15\\84.80801\\-176.224\\-15\\84.73267\\-178.1771\\-15\\84.81986\\-180.1303\\-15\\85.08397\\-182.0834\\-15\\84.81492\\-184.0365\\-15\\84.82484\\-185.9896\\-15\\87.6144\\-189.0032\\-15\\90.70685\\-189.8959\\-15\\95.4269\\-191.5235\\-15\\95.59499\\-191.849\\-15\\93.85659\\-193.8021\\-15\\91.52065\\-196.1182\\-15\\89.56753\\-197.1151\\-15\\87.93992\\-199.6615\\-15\\85.66128\\-202.0076\\-15\\83.70815\\-203.6985\\-15\\79.8019\\-204.1018\\-15\\78.20856\\-205.5209\\-15\\77.84878\\-205.9766\\-15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "92" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "326" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-218.0109\\-13\\-90.10603\\-217.2396\\-13\\-92.0731\\-216.0833\\-13\\-94.02622\\-216.3377\\-13\\-95.97935\\-216.1181\\-13\\-97.93247\\-215.4804\\-13\\-99.8856\\-215.6708\\-13\\-101.8387\\-214.9588\\-13\\-103.8764\\-213.3334\\-13\\-105.745\\-210.8443\\-13\\-106.7165\\-209.4271\\-13\\-107.5111\\-207.474\\-13\\-107.6173\\-205.5209\\-13\\-107.5627\\-203.5678\\-13\\-108.0054\\-201.6146\\-13\\-107.6173\\-199.6615\\-13\\-106.9717\\-197.7084\\-13\\-106.1607\\-195.7553\\-13\\-104.6195\\-193.8021\\-13\\-101.8387\\-191.0982\\-13\\-99.8856\\-190.1171\\-13\\-97.93247\\-189.4665\\-13\\-95.97935\\-189.0013\\-13\\-94.02622\\-188.7705\\-13\\-92.59736\\-187.9428\\-13\\-92.0731\\-187.0204\\-13\\-91.0791\\-185.9896\\-13\\-90.11997\\-184.5762\\-13\\-88.84167\\-182.0834\\-13\\-88.48586\\-180.1303\\-13\\-88.3308\\-178.1771\\-13\\-88.16685\\-177.9632\\-13\\-86.21372\\-176.7653\\-13\\-84.2606\\-177.2696\\-13\\-82.30747\\-177.9981\\-13\\-81.5631\\-176.224\\-13\\-82.30747\\-175.5237\\-13\\-84.2606\\-174.1093\\-13\\-86.21372\\-173.1779\\-13\\-87.42758\\-172.3178\\-13\\-88.62413\\-170.3646\\-13\\-88.10941\\-168.4115\\-13\\-86.84793\\-166.4584\\-13\\-85.70841\\-164.5053\\-13\\-85.12502\\-162.5521\\-13\\-82.30747\\-159.7133\\-13\\-80.35435\\-159.1167\\-13\\-78.40122\\-157.9297\\-13\\-76.4481\\-157.4043\\-13\\-74.49497\\-157.1896\\-13\\-72.54185\\-157.4429\\-13\\-70.58872\\-158.2902\\-13\\-70.21831\\-158.6459\\-13\\-68.6356\\-160.8149\\-13\\-67.83444\\-162.5521\\-13\\-66.81891\\-164.5053\\-13\\-66.29554\\-166.4584\\-13\\-66.12836\\-168.4115\\-13\\-65.50739\\-170.3646\\-13\\-64.35233\\-172.3178\\-13\\-63.88204\\-174.2709\\-13\\-63.00159\\-176.224\\-13\\-62.3992\\-178.1771\\-13\\-62.18388\\-180.1303\\-13\\-62.77623\\-180.8677\\-13\\-64.65739\\-182.0834\\-13\\-66.68247\\-181.2955\\-13\\-68.6356\\-180.8383\\-13\\-70.58872\\-181.0201\\-13\\-72.54185\\-181.3745\\-13\\-74.16567\\-182.0834\\-13\\-73.80919\\-184.0365\\-13\\-72.91888\\-185.9896\\-13\\-71.56528\\-187.9428\\-13\\-70.83792\\-189.8959\\-13\\-69.77927\\-191.849\\-13\\-69.19601\\-193.8021\\-13\\-69.786\\-195.7553\\-13\\-70.09167\\-197.7084\\-13\\-69.90862\\-199.6615\\-13\\-70.44012\\-203.5678\\-13\\-70.85926\\-205.5209\\-13\\-71.73383\\-207.474\\-13\\-73.3488\\-209.4271\\-13\\-74.49497\\-211.3208\\-13\\-75.85973\\-213.3334\\-13\\-76.4481\\-213.9075\\-13\\-78.65292\\-215.2865\\-13\\-80.35435\\-216.1884\\-13\\-82.30747\\-217.0513\\-13\\-84.2606\\-218.1035\\-13\\-86.21372\\-218.3649\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "327" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-227.4428\\-13\\-53.0106\\-226.3138\\-13\\-54.96373\\-225.4113\\-13\\-58.86998\\-222.5434\\-13\\-62.77623\\-220.8311\\-13\\-64.72935\\-220.4966\\-13\\-66.68247\\-219.4727\\-13\\-68.83688\\-217.2396\\-13\\-69.61765\\-215.2865\\-13\\-69.12096\\-213.3334\\-13\\-68.51171\\-211.3803\\-13\\-67.60853\\-209.4271\\-13\\-66.05949\\-207.474\\-13\\-64.72935\\-206.3925\\-13\\-61.8628\\-203.5678\\-13\\-60.50829\\-201.6146\\-13\\-60.46628\\-195.7553\\-13\\-59.66898\\-193.8021\\-13\\-58.86998\\-193.0475\\-13\\-56.91685\\-194.2668\\-13\\-55.84843\\-195.7553\\-13\\-55.00129\\-197.7084\\-13\\-54.91154\\-199.6615\\-13\\-54.04433\\-201.6146\\-13\\-51.99478\\-203.5678\\-13\\-50.65108\\-205.5209\\-13\\-49.79522\\-207.474\\-13\\-48.22544\\-209.4271\\-13\\-48.15245\\-211.3803\\-13\\-48.72492\\-213.3334\\-13\\-50.12456\\-217.2396\\-13\\-50.71095\\-219.1928\\-13\\-50.88309\\-221.1459\\-13\\-49.87271\\-223.099\\-13\\-47.86002\\-225.0521\\-13\\-47.21989\\-227.0053\\-13\\-49.10435\\-228.0821\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "328" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-157.1981\\-13\\-39.33873\\-155.9223\\-13\\-41.29185\\-155.3682\\-13\\-43.24498\\-153.7823\\-13\\-44.26593\\-152.7865\\-13\\-45.39056\\-150.8334\\-13\\-47.15123\\-147.2947\\-13\\-47.39712\\-146.9271\\-13\\-49.10435\\-145.5475\\-13\\-51.05748\\-146.1309\\-13\\-52.92182\\-144.974\\-13\\-51.82026\\-143.0209\\-13\\-51.05748\\-142.2581\\-13\\-49.10435\\-141.1199\\-13\\-47.20341\\-139.1146\\-13\\-46.59398\\-137.1615\\-13\\-45.7749\\-135.2084\\-13\\-43.24498\\-132.5255\\-13\\-41.29185\\-131.8158\\-13\\-39.33873\\-130.7417\\-13\\-37.3856\\-130.0052\\-13\\-35.43248\\-129.811\\-13\\-33.47935\\-129.7837\\-13\\-23.71373\\-129.7929\\-13\\-21.7606\\-130.3207\\-13\\-20.05374\\-131.3021\\-13\\-18.00296\\-133.2553\\-13\\-16.94754\\-135.2084\\-13\\-16.06281\\-137.1615\\-13\\-16.04983\\-139.1146\\-13\\-14.96885\\-141.0678\\-13\\-13.09361\\-143.0209\\-13\\-12.23912\\-144.974\\-13\\-12.32528\\-146.9271\\-13\\-11.99498\\-147.1636\\-13\\-11.12286\\-148.8803\\-13\\-11.59505\\-150.8334\\-13\\-11.99498\\-151.1152\\-13\\-12.38743\\-150.8334\\-13\\-14.15039\\-148.8803\\-13\\-15.16076\\-146.9271\\-13\\-15.90123\\-146.506\\-13\\-16.32237\\-146.9271\\-13\\-17.3019\\-148.8803\\-13\\-18.63084\\-150.8334\\-13\\-19.80748\\-152.3132\\-13\\-21.7606\\-154.2731\\-13\\-23.71373\\-155.8123\\-13\\-27.61998\\-157.0722\\-13\\-29.5731\\-157.4731\\-13\\-33.47935\\-157.2469\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "329" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "38.78627\\-231.8831\\-13\\37.11584\\-230.9115\\-13\\36.92933\\-228.9584\\-13\\37.36175\\-227.0053\\-13\\38.89641\\-225.0521\\-13\\39.7032\\-223.099\\-13\\40.95564\\-221.1459\\-13\\41.60499\\-219.1928\\-13\\42.69252\\-218.3121\\-13\\43.64255\\-217.2396\\-13\\44.78208\\-215.2865\\-13\\45.71938\\-213.3334\\-13\\46.59877\\-212.3233\\-13\\48.5519\\-210.4738\\-13\\49.85159\\-211.3803\\-13\\50.1795\\-213.3334\\-13\\51.49734\\-215.2865\\-13\\52.45815\\-216.2422\\-13\\54.41127\\-217.4405\\-13\\55.95546\\-219.1928\\-13\\55.81867\\-221.1459\\-13\\54.85787\\-223.099\\-13\\54.41127\\-223.5456\\-13\\52.45815\\-224.5788\\-13\\50.50502\\-224.9147\\-13\\48.5519\\-225.7162\\-13\\46.59877\\-227.4712\\-13\\44.64565\\-228.334\\-13\\43.45546\\-228.9584\\-13\\40.7394\\-231.3231\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002308" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "117" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "330" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "62.22377\\-212.3613\\-13\\60.27065\\-210.431\\-13\\58.31752\\-208.6598\\-13\\56.3644\\-208.6059\\-13\\54.41127\\-208.9218\\-13\\52.45815\\-207.9728\\-13\\52.03278\\-207.474\\-13\\51.97853\\-205.5209\\-13\\52.25871\\-203.5678\\-13\\53.13544\\-201.6146\\-13\\53.73427\\-199.6615\\-13\\53.94711\\-197.7084\\-13\\54.33051\\-195.7553\\-13\\56.25589\\-191.849\\-13\\56.28363\\-189.8959\\-13\\57.28024\\-187.9428\\-13\\58.15593\\-185.9896\\-13\\58.16891\\-184.0365\\-13\\59.19084\\-182.0834\\-13\\59.97768\\-180.1303\\-13\\60.07121\\-174.2709\\-13\\62.22377\\-170.7046\\-13\\64.1769\\-168.7052\\-13\\66.13003\\-166.9513\\-13\\66.53439\\-166.4584\\-13\\66.27314\\-164.5053\\-13\\64.13934\\-162.5521\\-13\\63.74221\\-160.599\\-13\\64.96527\\-158.6459\\-13\\66.13003\\-157.555\\-13\\68.08315\\-155.9617\\-13\\70.03628\\-155.7683\\-13\\71.9894\\-156.8544\\-13\\73.94253\\-157.1896\\-13\\75.89565\\-157.4115\\-13\\77.84878\\-158.03\\-13\\79.8019\\-159.5325\\-13\\83.70815\\-161.8524\\-13\\86.51398\\-164.5053\\-13\\88.17825\\-166.4584\\-13\\88.57803\\-168.4115\\-13\\87.6144\\-169.585\\-13\\85.66128\\-170.0717\\-13\\81.75503\\-171.4841\\-13\\79.95609\\-172.3178\\-13\\77.84878\\-173.6977\\-13\\77.36349\\-174.2709\\-13\\76.32455\\-176.224\\-13\\74.39175\\-178.1771\\-13\\73.94253\\-179.041\\-13\\72.9189\\-180.1303\\-13\\73.94253\\-181.8295\\-13\\75.89565\\-180.3173\\-13\\78.51196\\-178.1771\\-13\\79.8019\\-177.2428\\-13\\81.75503\\-175.5674\\-13\\83.70815\\-174.977\\-13\\84.91193\\-176.224\\-13\\84.81002\\-178.1771\\-13\\84.82484\\-180.1303\\-13\\85.173\\-182.0834\\-13\\85.29429\\-184.0365\\-13\\86.04783\\-185.9896\\-13\\87.6144\\-188.0494\\-13\\89.56753\\-189.138\\-13\\91.52065\\-189.2261\\-13\\93.47378\\-189.4612\\-13\\95.4269\\-190.2689\\-13\\96.53684\\-191.849\\-13\\95.4269\\-193.4978\\-13\\91.52065\\-197.325\\-13\\89.56753\\-198.6917\\-13\\88.80442\\-199.6615\\-13\\88.2495\\-201.6146\\-13\\88.50844\\-203.5678\\-13\\89.70809\\-205.5209\\-13\\89.74722\\-207.474\\-13\\89.56753\\-207.7817\\-13\\87.6144\\-209.9229\\-13\\86.17915\\-211.3803\\-13\\85.66128\\-211.6581\\-13\\83.70815\\-211.4994\\-13\\81.75503\\-209.9192\\-13\\80.45959\\-209.4271\\-13\\79.8019\\-208.7826\\-13\\77.84878\\-208.1576\\-13\\77.09415\\-207.474\\-13\\73.55559\\-201.6146\\-13\\72.95517\\-199.6615\\-13\\72.45696\\-197.7084\\-13\\71.73031\\-193.8021\\-13\\71.69643\\-191.849\\-13\\71.81376\\-185.9896\\-13\\72.73434\\-184.0365\\-13\\73.81806\\-182.0834\\-13\\71.9894\\-180.7017\\-13\\70.03628\\-182.7282\\-13\\68.36331\\-184.0365\\-13\\66.13003\\-186.2984\\-13\\64.1769\\-187.0883\\-13\\63.18749\\-187.9428\\-13\\62.22377\\-188.4343\\-13\\60.27065\\-189.8817\\-13\\60.58546\\-191.849\\-13\\60.10906\\-193.8021\\-13\\60.14858\\-197.7084\\-13\\62.22377\\-200.6292\\-13\\63.66909\\-201.6146\\-13\\64.1769\\-202.1511\\-13\\66.13003\\-203.2446\\-13\\66.48159\\-203.5678\\-13\\66.84103\\-205.5209\\-13\\67.56279\\-207.474\\-13\\68.13614\\-209.4271\\-13\\67.24458\\-211.3803\\-13\\66.13003\\-212.7849\\-13\\64.1769\\-213.0743\\-13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "90" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "331" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.21372\\-217.5757\\-11\\-88.16685\\-217.173\\-11\\-90.11997\\-216.6341\\-11\\-91.6662\\-215.2865\\-11\\-92.0731\\-214.6388\\-11\\-93.49454\\-213.3334\\-11\\-94.02622\\-212.9988\\-11\\-95.47627\\-213.3334\\-11\\-97.93247\\-214.2303\\-11\\-99.8856\\-214.5062\\-11\\-101.8387\\-214.1204\\-11\\-103.7918\\-212.3952\\-11\\-104.7183\\-211.3803\\-11\\-106.2856\\-209.4271\\-11\\-107.042\\-207.474\\-11\\-107.1928\\-205.5209\\-11\\-107.2098\\-199.6615\\-11\\-107.0838\\-197.7084\\-11\\-105.745\\-195.8773\\-11\\-103.7691\\-193.8021\\-11\\-102.7486\\-191.849\\-11\\-100.701\\-189.8959\\-11\\-99.8856\\-189.0191\\-11\\-97.93247\\-187.5081\\-11\\-95.97935\\-186.8588\\-11\\-94.62132\\-185.9896\\-11\\-94.29933\\-184.0365\\-11\\-94.02622\\-183.1158\\-11\\-92.99386\\-182.0834\\-11\\-92.0731\\-181.785\\-11\\-90.11997\\-179.8802\\-11\\-89.33982\\-178.1771\\-11\\-88.16685\\-177.1428\\-11\\-86.21372\\-177.2255\\-11\\-84.2606\\-178.4811\\-11\\-82.30747\\-179.2836\\-11\\-78.40122\\-182.0183\\-11\\-77.30596\\-180.1303\\-11\\-78.93234\\-178.1771\\-11\\-82.30747\\-175.4236\\-11\\-86.21372\\-174.1624\\-11\\-88.16685\\-173.6327\\-11\\-89.28761\\-172.3178\\-11\\-89.42455\\-170.3646\\-11\\-88.74365\\-168.4115\\-11\\-87.07685\\-166.4584\\-11\\-85.70841\\-164.5053\\-11\\-85.12502\\-162.5521\\-11\\-82.30747\\-159.7133\\-11\\-80.35435\\-159.1167\\-11\\-78.40122\\-158.2299\\-11\\-76.4481\\-157.5266\\-11\\-74.49497\\-157.2229\\-11\\-72.54185\\-157.5938\\-11\\-71.19757\\-158.6459\\-11\\-69.4281\\-160.599\\-11\\-68.14732\\-162.5521\\-11\\-67.48943\\-164.5053\\-11\\-66.35696\\-166.4584\\-11\\-66.28574\\-168.4115\\-11\\-65.86295\\-170.3646\\-11\\-64.72935\\-172.6123\\-11\\-64.15205\\-174.2709\\-11\\-63.73255\\-176.224\\-11\\-63.04676\\-178.1771\\-11\\-62.97708\\-180.1303\\-11\\-64.72935\\-181.694\\-11\\-66.68247\\-182.2717\\-11\\-68.6356\\-181.2269\\-11\\-70.58872\\-180.8745\\-11\\-74.49497\\-181.7092\\-11\\-76.4481\\-181.6091\\-11\\-78.1655\\-182.0834\\-11\\-76.4481\\-182.5669\\-11\\-75.38959\\-184.0365\\-11\\-73.63131\\-185.9896\\-11\\-71.57072\\-189.8959\\-11\\-70.16734\\-193.8021\\-11\\-70.2319\\-195.7553\\-11\\-70.49399\\-197.7084\\-11\\-70.49399\\-201.6146\\-11\\-70.89269\\-203.5678\\-11\\-71.55998\\-205.5209\\-11\\-72.54185\\-207.4226\\-11\\-73.91383\\-209.4271\\-11\\-76.4481\\-212.3343\\-11\\-77.43958\\-213.3334\\-11\\-78.40122\\-214.1062\\-11\\-82.30747\\-216.1611\\-11\\-84.2606\\-216.9904\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "332" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-225.9568\\-11\\-53.0106\\-224.7625\\-11\\-54.96373\\-223.982\\-11\\-56.91685\\-222.5164\\-11\\-58.86998\\-221.543\\-11\\-60.8231\\-220.4452\\-11\\-62.77623\\-220.2908\\-11\\-64.72935\\-219.8974\\-11\\-66.68247\\-218.7527\\-11\\-68.6356\\-217.7369\\-11\\-69.16193\\-217.2396\\-11\\-70.14484\\-215.2865\\-11\\-69.92024\\-213.3334\\-11\\-69.58984\\-211.3803\\-11\\-68.6356\\-209.6225\\-11\\-67.33552\\-207.474\\-11\\-66.68247\\-206.8404\\-11\\-64.72935\\-205.7701\\-11\\-62.77623\\-204.5017\\-11\\-61.86226\\-203.5678\\-11\\-60.6361\\-201.6146\\-11\\-60.46628\\-195.7553\\-11\\-59.26758\\-193.8021\\-11\\-58.86998\\-193.4453\\-11\\-56.91685\\-194.7074\\-11\\-55.99802\\-195.7553\\-11\\-55.37967\\-197.7084\\-11\\-54.48721\\-201.6146\\-11\\-51.05748\\-204.7777\\-11\\-50.42894\\-205.5209\\-11\\-49.57801\\-207.474\\-11\\-48.24123\\-209.4271\\-11\\-48.35908\\-211.3803\\-11\\-49.34007\\-213.3334\\-11\\-50.12456\\-215.2865\\-11\\-50.69049\\-217.2396\\-11\\-50.88309\\-219.1928\\-11\\-50.49363\\-221.1459\\-11\\-49.10435\\-222.9837\\-11\\-47.15123\\-224.7577\\-11\\-46.24125\\-225.0521\\-11\\-47.15123\\-225.4781\\-11\\-49.10435\\-226.6328\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "333" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-156.8414\\-11\\-41.29185\\-155.627\\-11\\-44.15931\\-152.7865\\-11\\-44.68442\\-150.8334\\-11\\-46.21905\\-148.8803\\-11\\-46.85826\\-146.9271\\-11\\-47.15123\\-146.5891\\-11\\-49.10435\\-145.2215\\-11\\-52.65456\\-146.9271\\-11\\-53.0106\\-147.2689\\-11\\-53.25474\\-146.9271\\-11\\-52.92182\\-144.974\\-11\\-51.82026\\-143.0209\\-11\\-51.05748\\-142.2581\\-11\\-49.10435\\-141.5731\\-11\\-48.44088\\-141.0678\\-11\\-46.8047\\-139.1146\\-11\\-46.18961\\-137.1615\\-11\\-45.1981\\-135.6666\\-11\\-43.24498\\-133.2316\\-11\\-41.29185\\-131.965\\-11\\-39.33873\\-131.5259\\-11\\-37.3856\\-130.542\\-11\\-35.43248\\-130.0188\\-11\\-33.47935\\-129.8199\\-11\\-31.52623\\-129.7837\\-11\\-25.66685\\-129.7837\\-11\\-23.71373\\-129.8199\\-11\\-21.7606\\-130.5022\\-11\\-19.80748\\-131.9617\\-11\\-18.47196\\-133.2553\\-11\\-16.95255\\-135.2084\\-11\\-16.06281\\-137.1615\\-11\\-16.06281\\-139.1146\\-11\\-15.13255\\-141.0678\\-11\\-13.25452\\-143.0209\\-11\\-12.2307\\-144.974\\-11\\-12.14869\\-146.9271\\-11\\-11.10109\\-148.8803\\-11\\-11.55785\\-150.8334\\-11\\-11.99498\\-151.1373\\-11\\-12.41606\\-150.8334\\-11\\-14.21891\\-148.8803\\-11\\-15.90123\\-147.7163\\-11\\-16.87779\\-148.8803\\-11\\-18.24129\\-150.8334\\-11\\-19.09058\\-152.7865\\-11\\-21.7606\\-155.4372\\-11\\-23.71373\\-156.8013\\-11\\-25.66685\\-157.3882\\-11\\-27.61998\\-157.7695\\-11\\-29.5731\\-158.2672\\-11\\-31.52623\\-157.7426\\-11\\-33.47935\\-157.4876\\-11\\-37.3856\\-157.3818\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "334" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "44.64565\\-224.9301\\-11\\42.90179\\-223.099\\-11\\42.97257\\-221.1459\\-11\\43.63094\\-219.1928\\-11\\45.10629\\-217.2396\\-11\\45.74352\\-215.2865\\-11\\46.59877\\-214.0233\\-11\\48.5519\\-211.4418\\-11\\51.20257\\-215.2865\\-11\\52.45815\\-216.4807\\-11\\54.41127\\-218.0042\\-11\\55.5177\\-219.1928\\-11\\55.77846\\-221.1459\\-11\\54.41127\\-222.6698\\-11\\52.45815\\-223.8608\\-11\\48.5519\\-224.0199\\-11\\46.59877\\-224.8262\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "75" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "335" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "64.1769\\-218.3464\\-11\\62.99107\\-217.2396\\-11\\64.15419\\-215.2865\\-11\\63.50618\\-213.3334\\-11\\62.31995\\-211.3803\\-11\\60.27065\\-209.4195\\-11\\58.31752\\-208.5614\\-11\\56.3644\\-208.6008\\-11\\54.41127\\-208.7381\\-11\\52.45815\\-207.8042\\-11\\52.15419\\-207.474\\-11\\51.79858\\-205.5209\\-11\\52.45815\\-203.4213\\-11\\54.26266\\-199.6615\\-11\\54.35909\\-197.7084\\-11\\54.6931\\-195.7553\\-11\\55.41225\\-193.8021\\-11\\56.25589\\-191.849\\-11\\56.34169\\-189.8959\\-11\\58.15593\\-185.9896\\-11\\58.23676\\-184.0365\\-11\\59.20414\\-182.0834\\-11\\59.97768\\-180.1303\\-11\\60.07121\\-176.224\\-11\\61.30172\\-172.3178\\-11\\62.22377\\-171.2744\\-11\\64.1769\\-169.8284\\-11\\66.13003\\-168.9596\\-11\\66.67816\\-168.4115\\-11\\67.46886\\-166.4584\\-11\\67.39793\\-164.5053\\-11\\66.13003\\-163.2087\\-11\\65.26278\\-162.5521\\-11\\64.44743\\-160.599\\-11\\65.29626\\-158.6459\\-11\\66.13003\\-157.7394\\-11\\68.08315\\-156.7735\\-11\\70.03628\\-155.7068\\-11\\71.9894\\-156.1509\\-11\\73.94253\\-157.2229\\-11\\75.89565\\-157.4192\\-11\\77.84878\\-158.0294\\-11\\79.8019\\-159.6225\\-11\\81.63296\\-160.599\\-11\\83.70815\\-161.9618\\-11\\88.40881\\-166.4584\\-11\\89.30843\\-168.4115\\-11\\87.86594\\-170.3646\\-11\\85.66128\\-170.771\\-11\\83.70815\\-171.3623\\-11\\79.8019\\-172.7337\\-11\\77.84878\\-174.6687\\-11\\76.77754\\-176.224\\-11\\74.83076\\-178.1771\\-11\\71.80106\\-182.0834\\-11\\70.5537\\-184.0365\\-11\\68.08315\\-185.7899\\-11\\66.34956\\-187.9428\\-11\\64.1769\\-190.1696\\-11\\62.22377\\-191.5663\\-11\\61.20039\\-193.8021\\-11\\62.22377\\-195.444\\-11\\64.1769\\-197.3793\\-11\\64.40624\\-197.7084\\-11\\65.13468\\-199.6615\\-11\\66.13003\\-200.5695\\-11\\67.52903\\-203.5678\\-11\\68.08315\\-205.3943\\-11\\68.99936\\-207.474\\-11\\69.57404\\-209.4271\\-11\\69.89828\\-211.3803\\-11\\68.58047\\-213.3334\\-11\\68.63614\\-215.2865\\-11\\68.52517\\-217.2396\\-11\\68.08315\\-217.5677\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002307" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "336" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "83.70815\\-211.9255\\-11\\81.75503\\-210.305\\-11\\79.8019\\-209.1016\\-11\\77.84878\\-207.3302\\-11\\76.69903\\-205.5209\\-11\\75.08022\\-203.5678\\-11\\73.94253\\-199.7572\\-11\\73.26189\\-197.7084\\-11\\72.93323\\-195.7553\\-11\\72.16379\\-193.8021\\-11\\71.77769\\-191.849\\-11\\72.47768\\-187.9428\\-11\\72.91871\\-185.9896\\-11\\73.82162\\-184.0365\\-11\\75.05593\\-182.0834\\-11\\75.89565\\-181.3124\\-11\\80.48006\\-178.1771\\-11\\81.75503\\-177.1793\\-11\\83.70815\\-176.0362\\-11\\83.9116\\-176.224\\-11\\84.92886\\-178.1771\\-11\\85.31475\\-180.1303\\-11\\86.24503\\-182.0834\\-11\\86.6557\\-184.0365\\-11\\87.6144\\-185.5059\\-11\\89.56753\\-187.4955\\-11\\90.18101\\-187.9428\\-11\\91.52065\\-188.5685\\-11\\93.47378\\-189.311\\-11\\95.4269\\-190.9452\\-11\\96.22202\\-191.849\\-11\\95.80847\\-193.8021\\-11\\94.40965\\-195.7553\\-11\\93.47378\\-196.8105\\-11\\91.52065\\-198.7521\\-11\\90.40136\\-199.6615\\-11\\90.07508\\-201.6146\\-11\\91.52065\\-204.7295\\-11\\91.97964\\-205.5209\\-11\\93.77239\\-207.474\\-11\\93.9883\\-209.4271\\-11\\93.47378\\-209.8829\\-11\\91.52065\\-210.6762\\-11\\90.87653\\-211.3803\\-11\\89.56753\\-211.8804\\-11\\85.66128\\-212.4506\\-11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "337" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.11997\\-215.9824\\-9\\-92.0731\\-214.0085\\-9\\-94.02622\\-212.6292\\-9\\-95.97935\\-212.8114\\-9\\-97.93247\\-213.3712\\-9\\-99.8856\\-213.6761\\-9\\-101.8387\\-212.927\\-9\\-103.7918\\-211.3726\\-9\\-105.2654\\-209.4271\\-9\\-106.5095\\-207.474\\-9\\-107.0353\\-205.5209\\-9\\-107.1844\\-203.5678\\-9\\-107.2098\\-197.7084\\-9\\-106.1667\\-195.7553\\-9\\-103.8873\\-193.8021\\-9\\-102.9201\\-191.849\\-9\\-101.1635\\-189.8959\\-9\\-100.2471\\-187.9428\\-9\\-99.8856\\-186.8723\\-9\\-98.96764\\-185.9896\\-9\\-97.95518\\-184.0365\\-9\\-96.45859\\-182.0834\\-9\\-95.97935\\-181.7056\\-9\\-92.0731\\-179.4604\\-9\\-88.16685\\-178.1057\\-9\\-86.21372\\-178.4129\\-9\\-84.2606\\-179.4413\\-9\\-82.30747\\-180.6271\\-9\\-80.35435\\-181.4872\\-9\\-78.40122\\-183.1601\\-9\\-76.4481\\-184.5954\\-9\\-75.01055\\-185.9896\\-9\\-73.53976\\-187.9428\\-9\\-72.59403\\-189.8959\\-9\\-71.95094\\-191.849\\-9\\-71.15066\\-195.7553\\-9\\-71.21352\\-201.6146\\-9\\-71.60326\\-203.5678\\-9\\-72.54185\\-205.4041\\-9\\-73.75124\\-207.474\\-9\\-75.32597\\-209.4271\\-9\\-77.08549\\-211.3803\\-9\\-78.40122\\-212.6728\\-9\\-80.35435\\-214.2312\\-9\\-82.30747\\-215.0627\\-9\\-84.2606\\-216.1552\\-9\\-86.21372\\-216.4434\\-9\\-88.16685\\-216.4292\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "338" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-68.6356\\-182.5779\\-9\\-70.58872\\-180.9519\\-9\\-72.54185\\-181.1673\\-9\\-74.49497\\-181.7536\\-9\\-76.4481\\-180.9587\\-9\\-78.40122\\-179.0653\\-9\\-80.35435\\-177.3449\\-9\\-82.30747\\-176.4732\\-9\\-84.2606\\-175.3529\\-9\\-86.21372\\-174.9798\\-9\\-88.16685\\-174.7684\\-9\\-88.87948\\-174.2709\\-9\\-90.11997\\-172.3584\\-9\\-89.19936\\-170.3646\\-9\\-87.07685\\-166.4584\\-9\\-85.70841\\-164.5053\\-9\\-85.12502\\-162.5521\\-9\\-82.30747\\-159.7224\\-9\\-80.35435\\-159.176\\-9\\-78.40122\\-157.9352\\-9\\-76.4481\\-157.3723\\-9\\-74.49497\\-157.3623\\-9\\-72.54185\\-157.8321\\-9\\-70.58872\\-159.6225\\-9\\-69.64884\\-160.599\\-9\\-68.4118\\-162.5521\\-9\\-67.83222\\-164.5053\\-9\\-66.87081\\-166.4584\\-9\\-66.29554\\-168.4115\\-9\\-66.13626\\-170.3646\\-9\\-65.52016\\-172.3178\\-9\\-64.35233\\-174.2709\\-9\\-64.14126\\-176.224\\-9\\-63.72837\\-178.1771\\-9\\-63.71272\\-180.1303\\-9\\-65.3623\\-182.0834\\-9\\-66.68247\\-183.1474\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "339" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-225.803\\-9\\-46.77088\\-225.0521\\-9\\-47.15123\\-224.0198\\-9\\-49.10435\\-224.4334\\-9\\-51.05748\\-224.3915\\-9\\-53.0106\\-223.4985\\-9\\-56.91685\\-221.4759\\-9\\-58.86998\\-220.0427\\-9\\-60.8231\\-219.0707\\-9\\-64.72935\\-218.4809\\-9\\-66.68247\\-217.9388\\-9\\-68.6356\\-216.7697\\-9\\-69.99163\\-215.2865\\-9\\-70.66949\\-213.3334\\-9\\-70.55058\\-211.3803\\-9\\-69.60101\\-209.4271\\-9\\-68.0991\\-207.474\\-9\\-66.68247\\-206.3707\\-9\\-64.72935\\-205.1539\\-9\\-62.77623\\-204.5713\\-9\\-61.85735\\-203.5678\\-9\\-61.51031\\-201.6146\\-9\\-61.48633\\-199.6615\\-9\\-61.18222\\-197.7084\\-9\\-60.54128\\-195.7553\\-9\\-58.86998\\-193.6667\\-9\\-56.91685\\-195.188\\-9\\-56.44355\\-195.7553\\-9\\-54.92617\\-199.6615\\-9\\-54.45247\\-201.6146\\-9\\-52.68983\\-203.5678\\-9\\-51.03476\\-205.5209\\-9\\-49.8198\\-207.474\\-9\\-48.74523\\-209.4271\\-9\\-48.81138\\-211.3803\\-9\\-49.91724\\-213.3334\\-9\\-50.67805\\-215.2865\\-9\\-50.4921\\-217.2396\\-9\\-49.87165\\-219.1928\\-9\\-49.10435\\-220.4992\\-9\\-47.87739\\-221.1459\\-9\\-47.15123\\-222.0594\\-9\\-45.75007\\-223.099\\-9\\-45.1981\\-223.252\\-9\\-43.24498\\-224.7027\\-9\\-43.24498\\-225.3242\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "340" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-158.4233\\-9\\-35.43248\\-158.3249\\-9\\-37.3856\\-157.763\\-9\\-39.33873\\-157.4822\\-9\\-41.29185\\-156.1456\\-9\\-42.48266\\-154.7396\\-9\\-43.98736\\-152.7865\\-9\\-44.54876\\-150.8334\\-9\\-46.03299\\-148.8803\\-9\\-46.66294\\-146.9271\\-9\\-47.15123\\-146.2837\\-9\\-49.10435\\-144.8519\\-9\\-52.05497\\-146.9271\\-9\\-53.0106\\-148.5587\\-9\\-53.72605\\-146.9271\\-9\\-53.0106\\-145.1192\\-9\\-51.82026\\-143.0209\\-9\\-51.05748\\-142.2581\\-9\\-49.10435\\-141.5731\\-9\\-47.15123\\-139.8664\\-9\\-46.57392\\-139.1146\\-9\\-45.78404\\-137.1615\\-9\\-44.18106\\-135.2084\\-9\\-43.24498\\-134.2102\\-9\\-41.29185\\-132.53\\-9\\-39.33873\\-131.9782\\-9\\-37.3856\\-131.5379\\-9\\-35.43248\\-130.56\\-9\\-33.47935\\-130.0392\\-9\\-31.52623\\-129.8459\\-9\\-25.66685\\-129.8459\\-9\\-23.71373\\-130.0223\\-9\\-21.7606\\-130.7274\\-9\\-19.80748\\-132.2598\\-9\\-16.96786\\-135.2084\\-9\\-16.06281\\-137.1615\\-9\\-16.06281\\-139.1146\\-9\\-15.6655\\-141.0678\\-9\\-12.28794\\-144.974\\-9\\-11.77118\\-146.9271\\-9\\-10.89822\\-148.8803\\-9\\-11.01841\\-150.8334\\-9\\-11.99498\\-151.3471\\-9\\-12.67335\\-150.8334\\-9\\-14.38523\\-148.8803\\-9\\-15.90123\\-148.0883\\-9\\-16.68924\\-148.8803\\-9\\-17.85435\\-150.9579\\-9\\-18.74681\\-152.7865\\-9\\-21.7606\\-155.7683\\-9\\-23.71373\\-157.3556\\-9\\-25.66685\\-157.7795\\-9\\-27.6412\\-158.6459\\-9\\-29.5731\\-159.1596\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "341" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-222.4143\\-9\\45.34478\\-221.1459\\-9\\45.58283\\-219.1928\\-9\\46.32264\\-217.2396\\-9\\47.48111\\-215.2865\\-9\\48.5519\\-213.9149\\-9\\50.50502\\-215.9644\\-9\\52.45815\\-217.5427\\-9\\54.41127\\-218.6319\\-9\\54.94337\\-219.1928\\-9\\54.95894\\-221.1459\\-9\\54.41127\\-221.6722\\-9\\52.45815\\-222.4276\\-9\\50.50502\\-222.5002\\-9\\48.5519\\-222.4051\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "79" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "342" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "62.22377\\-218.765\\-9\\61.24202\\-217.2396\\-9\\63.20499\\-215.2865\\-9\\63.59203\\-213.3334\\-9\\63.76826\\-211.3803\\-9\\64.32186\\-209.4271\\-9\\64.1769\\-207.8809\\-9\\63.91991\\-207.474\\-9\\62.22377\\-207.0609\\-9\\60.27065\\-207.0412\\-9\\58.31752\\-207.19\\-9\\56.3644\\-207.4997\\-9\\54.41127\\-207.5004\\-9\\52.96907\\-205.5209\\-9\\53.05049\\-203.5678\\-9\\53.50582\\-201.6146\\-9\\54.33051\\-199.6615\\-9\\54.71524\\-197.7084\\-9\\55.91604\\-193.8021\\-9\\56.40196\\-191.849\\-9\\56.78034\\-189.8959\\-9\\57.36873\\-187.9428\\-9\\58.31752\\-185.7611\\-9\\59.3476\\-182.0834\\-9\\59.98882\\-180.1303\\-9\\60.08365\\-178.1771\\-9\\60.71454\\-176.224\\-9\\61.65549\\-172.3178\\-9\\62.22377\\-171.693\\-9\\64.39519\\-170.3646\\-9\\66.13003\\-169.5966\\-9\\67.23997\\-168.4115\\-9\\67.64846\\-166.4584\\-9\\67.66721\\-164.5053\\-9\\66.47428\\-162.5521\\-9\\65.12976\\-160.599\\-9\\65.51573\\-158.6459\\-9\\66.13003\\-157.9449\\-9\\68.08315\\-157.181\\-9\\70.03628\\-155.9229\\-9\\71.9894\\-156.1574\\-9\\73.94253\\-157.407\\-9\\75.89565\\-157.8678\\-9\\79.8019\\-159.7068\\-9\\83.09109\\-162.5521\\-9\\83.70815\\-163.2246\\-9\\85.66128\\-164.2815\\-9\\88.10863\\-166.4584\\-9\\89.43109\\-168.4115\\-9\\90.35722\\-170.3646\\-9\\89.56753\\-171.3193\\-9\\87.6144\\-171.1323\\-9\\85.66128\\-171.3895\\-9\\83.70815\\-172.4125\\-9\\81.75503\\-173.0266\\-9\\79.8019\\-173.5211\\-9\\75.23869\\-178.1771\\-9\\73.84561\\-180.1303\\-9\\71.9894\\-183.3302\\-9\\70.03628\\-185.8245\\-9\\68.08315\\-187.6051\\-9\\66.57704\\-189.8959\\-9\\66.13003\\-191.1405\\-9\\65.43517\\-191.849\\-9\\64.44115\\-193.8021\\-9\\65.91139\\-195.7553\\-9\\67.09179\\-197.7084\\-9\\68.08315\\-199.1624\\-9\\68.24474\\-199.6615\\-9\\68.69141\\-203.5678\\-9\\69.2129\\-205.5209\\-9\\70.49466\\-207.474\\-9\\70.996\\-209.4271\\-9\\71.25698\\-211.3803\\-9\\70.03628\\-213.9086\\-9\\68.55933\\-217.2396\\-9\\68.08315\\-217.6454\\-9\\66.13003\\-218.4376\\-9\\64.1769\\-218.7742\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002306" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "343" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-211.4495\\-9\\83.70815\\-210.4292\\-9\\81.75503\\-209.0703\\-9\\79.8019\\-208.1431\\-9\\77.27467\\-205.5209\\-9\\76.26499\\-203.5678\\-9\\73.58107\\-195.7553\\-9\\72.94932\\-193.8021\\-9\\72.54352\\-191.849\\-9\\73.27004\\-187.9428\\-9\\73.53728\\-185.9896\\-9\\74.79986\\-184.0365\\-9\\75.89565\\-182.8731\\-9\\77.84878\\-182.0183\\-9\\79.96828\\-180.1303\\-9\\83.70815\\-177.2977\\-9\\84.68472\\-178.1771\\-9\\86.35278\\-180.1303\\-9\\87.11132\\-182.0834\\-9\\88.29189\\-184.0365\\-9\\91.65608\\-187.9428\\-9\\93.47378\\-189.1458\\-9\\94.36615\\-189.8959\\-9\\95.50767\\-191.849\\-9\\95.46446\\-193.8021\\-9\\95.7592\\-195.7553\\-9\\95.4269\\-196.6253\\-9\\94.72607\\-197.7084\\-9\\92.64891\\-199.6615\\-9\\92.10659\\-201.6146\\-9\\92.65371\\-203.5678\\-9\\94.67228\\-207.474\\-9\\95.03751\\-209.4271\\-9\\93.47378\\-210.7997\\-9\\91.52065\\-211.5638\\-9\\89.56753\\-211.9756\\-9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "344" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-215.5428\\-7\\-90.11997\\-214.8071\\-7\\-94.02622\\-212.8804\\-7\\-97.93247\\-212.8804\\-7\\-99.8856\\-212.7086\\-7\\-101.8387\\-211.7576\\-7\\-104.1463\\-209.4271\\-7\\-105.2567\\-207.474\\-7\\-106.5051\\-205.5209\\-7\\-107.012\\-203.5678\\-7\\-107.1599\\-201.6146\\-7\\-107.1599\\-197.7084\\-7\\-106.5095\\-195.7553\\-7\\-104.7125\\-193.8021\\-7\\-103.5787\\-191.849\\-7\\-102.5964\\-189.8959\\-7\\-101.3758\\-187.9428\\-7\\-100.8881\\-185.9896\\-7\\-99.8856\\-184.3924\\-7\\-97.47471\\-182.0834\\-7\\-95.97935\\-181.034\\-7\\-94.02622\\-180.6356\\-7\\-92.0731\\-179.3896\\-7\\-90.11997\\-179.2144\\-7\\-86.21372\\-179.4293\\-7\\-84.2606\\-180.9506\\-7\\-82.30747\\-182.1927\\-7\\-80.35435\\-183.2191\\-7\\-79.25083\\-184.0365\\-7\\-76.4481\\-185.8435\\-7\\-74.49497\\-188.0502\\-7\\-73.50266\\-189.8959\\-7\\-73.14159\\-191.849\\-7\\-71.98826\\-195.7553\\-7\\-71.98826\\-197.7084\\-7\\-72.97921\\-203.5678\\-7\\-73.81534\\-205.5209\\-7\\-75.36236\\-207.474\\-7\\-76.4481\\-209.1231\\-7\\-78.19683\\-211.3803\\-7\\-80.35435\\-213.386\\-7\\-82.30747\\-215.022\\-7\\-84.2606\\-215.4874\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "345" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-66.68247\\-184.5489\\-7\\-68.6356\\-183.1339\\-7\\-70.58872\\-181.0262\\-7\\-72.54185\\-181.1838\\-7\\-74.49497\\-182.7153\\-7\\-76.4481\\-181.4304\\-7\\-78.40122\\-179.5004\\-7\\-80.35435\\-178.4721\\-7\\-82.30747\\-177.2737\\-7\\-85.93202\\-176.224\\-7\\-88.16685\\-175.3604\\-7\\-90.11997\\-174.4826\\-7\\-90.36024\\-174.2709\\-7\\-90.78426\\-172.3178\\-7\\-89.23356\\-170.3646\\-7\\-87.07685\\-166.4584\\-7\\-85.70841\\-164.5053\\-7\\-85.12502\\-162.5521\\-7\\-82.30747\\-159.8957\\-7\\-80.35435\\-159.396\\-7\\-78.40122\\-157.7743\\-7\\-76.4481\\-157.3142\\-7\\-74.49497\\-157.5868\\-7\\-70.58872\\-159.7775\\-7\\-69.81236\\-160.599\\-7\\-68.6356\\-163.1078\\-7\\-67.47723\\-166.4584\\-7\\-66.30545\\-168.4115\\-7\\-66.27608\\-170.3646\\-7\\-65.85463\\-172.3178\\-7\\-64.89094\\-174.2709\\-7\\-64.29466\\-176.224\\-7\\-64.12634\\-178.1771\\-7\\-64.09746\\-180.1303\\-7\\-64.52991\\-182.0834\\-7\\-65.95434\\-184.0365\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "346" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-223.7642\\-7\\-46.17466\\-223.099\\-7\\-47.15123\\-222.7165\\-7\\-51.05748\\-222.6532\\-7\\-53.0106\\-221.7591\\-7\\-58.86998\\-218.511\\-7\\-60.8231\\-217.9776\\-7\\-62.77623\\-217.1042\\-7\\-66.68247\\-216.5321\\-7\\-68.6356\\-215.6958\\-7\\-70.9281\\-213.3334\\-7\\-71.56528\\-211.3803\\-7\\-70.59635\\-209.4271\\-7\\-69.51389\\-207.474\\-7\\-68.6356\\-206.6173\\-7\\-66.68247\\-205.7933\\-7\\-62.77623\\-204.65\\-7\\-61.87896\\-203.5678\\-7\\-62.09893\\-201.6146\\-7\\-62.15627\\-199.6615\\-7\\-61.79966\\-197.7084\\-7\\-61.22485\\-195.7553\\-7\\-59.41166\\-193.8021\\-7\\-58.86998\\-193.3768\\-7\\-58.35638\\-193.8021\\-7\\-56.87929\\-195.7553\\-7\\-55.83749\\-197.7084\\-7\\-54.04433\\-201.6146\\-7\\-51.80223\\-205.5209\\-7\\-50.22997\\-207.474\\-7\\-49.75014\\-209.4271\\-7\\-49.72532\\-211.3803\\-7\\-50.3359\\-213.3334\\-7\\-50.62947\\-215.2865\\-7\\-49.10435\\-217.4812\\-7\\-47.15123\\-218.8067\\-7\\-44.99436\\-221.1459\\-7\\-44.7846\\-223.099\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "347" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-158.8329\\-7\\-39.33873\\-158.4609\\-7\\-41.29185\\-157.4171\\-7\\-42.0452\\-156.6928\\-7\\-43.46122\\-154.7396\\-7\\-44.27691\\-152.7865\\-7\\-44.70125\\-150.8334\\-7\\-45.36325\\-148.8803\\-7\\-46.37498\\-146.9271\\-7\\-47.15123\\-145.8223\\-7\\-49.11223\\-144.974\\-7\\-51.49039\\-146.9271\\-7\\-52.44047\\-148.8803\\-7\\-53.0106\\-149.6219\\-7\\-54.7719\\-148.8803\\-7\\-53.77071\\-146.9271\\-7\\-53.0106\\-145.2322\\-7\\-51.79111\\-143.0209\\-7\\-51.05748\\-142.2761\\-7\\-49.10435\\-141.5731\\-7\\-47.15123\\-140.1873\\-7\\-46.1795\\-139.1146\\-7\\-45.1981\\-137.657\\-7\\-43.24498\\-135.2004\\-7\\-41.29185\\-133.7606\\-7\\-39.33873\\-132.5384\\-7\\-37.3856\\-131.9982\\-7\\-35.43248\\-131.5727\\-7\\-33.47935\\-130.5997\\-7\\-31.52623\\-130.2254\\-7\\-25.66685\\-130.2209\\-7\\-23.71373\\-130.5669\\-7\\-19.80748\\-132.4055\\-7\\-16.97306\\-135.2084\\-7\\-16.06281\\-137.1615\\-7\\-16.04983\\-141.0678\\-7\\-14.76841\\-143.0209\\-7\\-12.5764\\-144.974\\-7\\-11.28426\\-146.9271\\-7\\-10.49119\\-148.8803\\-7\\-9.518917\\-150.8334\\-7\\-9.726502\\-152.7865\\-7\\-10.04185\\-153.0091\\-7\\-11.99498\\-151.8699\\-7\\-13.9481\\-149.6287\\-7\\-15.90123\\-148.5482\\-7\\-16.23106\\-148.8803\\-7\\-17.27503\\-150.8334\\-7\\-19.80748\\-154.3477\\-7\\-22.49913\\-156.6928\\-7\\-23.71373\\-157.6271\\-7\\-25.66685\\-158.6535\\-7\\-27.61998\\-159.1678\\-7\\-29.5731\\-159.3902\\-7\\-31.52623\\-159.4671\\-7\\-35.43248\\-159.3662\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "77" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "348" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "62.22377\\-217.2758\\-7\\63.47535\\-215.2865\\-7\\64.33966\\-213.3334\\-7\\65.05782\\-211.3803\\-7\\66.27386\\-209.4271\\-7\\66.66463\\-207.474\\-7\\66.13003\\-206.1891\\-7\\65.47337\\-205.5209\\-7\\64.4169\\-203.5678\\-7\\64.1769\\-203.3532\\-7\\60.27065\\-203.3499\\-7\\58.31752\\-203.7267\\-7\\56.3644\\-205.1102\\-7\\54.41127\\-204.056\\-7\\54.20528\\-203.5678\\-7\\54.07924\\-201.6146\\-7\\54.7578\\-199.6615\\-7\\55.2958\\-197.7084\\-7\\55.93521\\-195.7553\\-7\\56.68992\\-193.8021\\-7\\57.27361\\-189.8959\\-7\\57.8626\\-187.9428\\-7\\58.80581\\-185.9896\\-7\\59.73439\\-182.0834\\-7\\60.00011\\-180.1303\\-7\\60.68659\\-178.1771\\-7\\61.64446\\-174.2709\\-7\\62.61841\\-172.3178\\-7\\64.1769\\-171.1075\\-7\\66.13003\\-170.5262\\-7\\67.48013\\-168.4115\\-7\\68.14973\\-166.4584\\-7\\68.61942\\-164.5053\\-7\\65.82606\\-160.599\\-7\\65.68613\\-158.6459\\-7\\66.13003\\-158.1408\\-7\\68.08315\\-157.231\\-7\\70.03628\\-156.7449\\-7\\71.9894\\-156.9165\\-7\\73.94253\\-157.6935\\-7\\75.89565\\-158.7813\\-7\\77.84878\\-159.1512\\-7\\79.8019\\-159.7165\\-7\\83.70815\\-163.7716\\-7\\85.66128\\-164.729\\-7\\87.09245\\-166.4584\\-7\\88.55164\\-168.4115\\-7\\89.56753\\-169.3072\\-7\\90.51811\\-170.3646\\-7\\90.39913\\-172.3178\\-7\\89.56753\\-172.9366\\-7\\87.6144\\-172.3985\\-7\\85.66128\\-172.4805\\-7\\83.70815\\-173.3649\\-7\\81.75503\\-174.0994\\-7\\79.8019\\-175.3062\\-7\\75.89565\\-179.1613\\-7\\73.27824\\-182.0834\\-7\\72.2354\\-184.0365\\-7\\71.08337\\-185.9896\\-7\\70.03628\\-188.2023\\-7\\68.78591\\-189.8959\\-7\\68.22925\\-191.849\\-7\\68.20034\\-193.8021\\-7\\68.62222\\-195.7553\\-7\\69.25373\\-197.7084\\-7\\69.37598\\-199.6615\\-7\\69.67932\\-201.6146\\-7\\70.25725\\-203.5678\\-7\\71.11522\\-205.5209\\-7\\72.53359\\-207.474\\-7\\72.3439\\-209.4271\\-7\\71.71886\\-211.3803\\-7\\70.77847\\-213.3334\\-7\\68.08315\\-216.1316\\-7\\66.13003\\-216.7894\\-7\\64.1769\\-217.1645\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002305" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "349" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-210.0676\\-7\\83.70815\\-208.7741\\-7\\81.51376\\-207.474\\-7\\79.56344\\-205.5209\\-7\\78.04101\\-203.5678\\-7\\76.31418\\-199.6615\\-7\\75.18125\\-197.7084\\-7\\74.54554\\-195.7553\\-7\\74.29935\\-193.8021\\-7\\73.6075\\-191.849\\-7\\73.5787\\-189.8959\\-7\\74.22435\\-187.9428\\-7\\74.67051\\-185.9896\\-7\\75.89565\\-184.5661\\-7\\77.84878\\-183.3055\\-7\\81.75503\\-179.5199\\-7\\83.70815\\-178.7103\\-7\\85.66128\\-179.4585\\-7\\88.26724\\-182.0834\\-7\\88.9288\\-184.0365\\-7\\90.43613\\-185.9896\\-7\\91.52065\\-187.1953\\-7\\93.47378\\-188.405\\-7\\94.8628\\-189.8959\\-7\\95.16781\\-191.849\\-7\\95.17941\\-193.8021\\-7\\96.03932\\-195.7553\\-7\\95.89732\\-197.7084\\-7\\94.58891\\-199.6615\\-7\\93.16981\\-203.5678\\-7\\93.48141\\-205.5209\\-7\\94.0532\\-207.474\\-7\\93.9252\\-209.4271\\-7\\93.47378\\-209.8396\\-7\\91.52065\\-210.1408\\-7\\89.56753\\-210.2841\\-7\\87.6144\\-210.5696\\-7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "350" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.11997\\-213.9453\\-5\\-92.0731\\-212.8365\\-5\\-94.02622\\-212.5237\\-5\\-97.93247\\-212.4659\\-5\\-99.8856\\-211.7401\\-5\\-100.2911\\-211.3803\\-5\\-104.1198\\-207.474\\-5\\-106.398\\-203.5678\\-5\\-106.8126\\-201.6146\\-5\\-106.808\\-197.7084\\-5\\-106.2364\\-195.7553\\-5\\-105.0489\\-193.8021\\-5\\-104.4925\\-191.849\\-5\\-103.0344\\-189.8959\\-5\\-102.5058\\-187.9428\\-5\\-99.8856\\-184.6744\\-5\\-97.93247\\-183.4881\\-5\\-95.97935\\-182.4308\\-5\\-92.0731\\-180.7653\\-5\\-90.11997\\-180.6439\\-5\\-88.16685\\-180.7076\\-5\\-86.21372\\-181.0043\\-5\\-84.2606\\-182.4322\\-5\\-82.30747\\-183.3874\\-5\\-80.35435\\-185.1782\\-5\\-79.27248\\-185.9896\\-5\\-78.40122\\-186.8609\\-5\\-76.4481\\-188.2683\\-5\\-74.71692\\-189.8959\\-5\\-74.69441\\-191.849\\-5\\-73.27281\\-195.7553\\-5\\-73.19814\\-197.7084\\-5\\-73.80215\\-199.6615\\-5\\-74.68198\\-201.6146\\-5\\-74.70817\\-203.5678\\-5\\-75.65649\\-205.5209\\-5\\-77.01537\\-207.474\\-5\\-78.40122\\-208.994\\-5\\-79.04064\\-209.4271\\-5\\-80.35435\\-210.9598\\-5\\-81.40325\\-213.3334\\-5\\-82.30747\\-214.8041\\-5\\-84.2606\\-214.689\\-5\\-86.21372\\-214.4655\\-5\\-88.16685\\-214.4456\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "351" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-66.68247\\-187.0116\\-5\\-68.6356\\-185.2572\\-5\\-69.75458\\-184.0365\\-5\\-70.58872\\-181.9538\\-5\\-71.80943\\-182.0834\\-5\\-72.54185\\-182.435\\-5\\-74.49497\\-183.8568\\-5\\-76.4481\\-183.1792\\-5\\-79.48058\\-180.1303\\-5\\-80.35435\\-179.4217\\-5\\-82.30747\\-178.5048\\-5\\-88.16685\\-176.7894\\-5\\-90.11997\\-175.8818\\-5\\-91.29795\\-174.2709\\-5\\-91.1775\\-172.3178\\-5\\-89.89142\\-170.3646\\-5\\-88.78934\\-168.4115\\-5\\-87.07685\\-166.4584\\-5\\-85.70841\\-164.5053\\-5\\-85.10917\\-162.5521\\-5\\-84.2606\\-161.7157\\-5\\-82.30747\\-160.7476\\-5\\-80.35435\\-159.5846\\-5\\-78.40122\\-158.0037\\-5\\-76.4481\\-157.5228\\-5\\-74.49497\\-157.8518\\-5\\-72.54185\\-159.3154\\-5\\-70.58872\\-160.559\\-5\\-68.36507\\-164.5053\\-5\\-67.65421\\-166.4584\\-5\\-66.31549\\-168.4115\\-5\\-66.28574\\-170.3646\\-5\\-66.13807\\-172.3178\\-5\\-65.51168\\-174.2709\\-5\\-64.30398\\-176.224\\-5\\-64.28546\\-178.1771\\-5\\-64.05327\\-180.1303\\-5\\-63.94535\\-182.0834\\-5\\-64.13701\\-184.0365\\-5\\-64.18214\\-185.9896\\-5\\-64.72935\\-187.2851\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "352" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-47.2832\\-221.1459\\-5\\-49.10435\\-219.9207\\-5\\-51.05748\\-219.8952\\-5\\-53.1815\\-219.1928\\-5\\-54.96373\\-217.9421\\-5\\-57.09674\\-217.2396\\-5\\-58.86998\\-216.7514\\-5\\-60.8231\\-216.5448\\-5\\-62.77623\\-215.9594\\-5\\-66.68247\\-215.0596\\-5\\-68.6356\\-214.1713\\-5\\-70.58872\\-213.1296\\-5\\-72.40338\\-211.3803\\-5\\-71.86101\\-209.4271\\-5\\-70.58872\\-206.3773\\-5\\-69.81561\\-205.5209\\-5\\-68.6356\\-204.5094\\-5\\-66.68247\\-204.0811\\-5\\-64.72935\\-204.0878\\-5\\-63.39471\\-203.5678\\-5\\-64.07298\\-201.6146\\-5\\-64.18829\\-199.6615\\-5\\-63.53435\\-197.7084\\-5\\-62.77623\\-196.268\\-5\\-61.74464\\-193.8021\\-5\\-60.8231\\-193.173\\-5\\-58.86998\\-192.9892\\-5\\-58.05703\\-193.8021\\-5\\-57.33279\\-195.7553\\-5\\-55.98701\\-197.7084\\-5\\-55.40762\\-199.6615\\-5\\-54.093\\-201.6146\\-5\\-53.43597\\-203.5678\\-5\\-52.18428\\-205.5209\\-5\\-50.84293\\-209.4271\\-5\\-50.57877\\-211.3803\\-5\\-51.34144\\-213.3334\\-5\\-51.41555\\-215.2865\\-5\\-51.05748\\-216.1817\\-5\\-49.10435\\-218.1106\\-5\\-47.10802\\-219.1928\\-5\\-47.01559\\-221.1459\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "353" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.33873\\-159.4619\\-5\\-41.29185\\-158.17\\-5\\-43.24498\\-156.1867\\-5\\-44.28836\\-154.7396\\-5\\-44.69833\\-152.7865\\-5\\-44.89414\\-148.8803\\-5\\-46.29364\\-146.9271\\-5\\-47.15123\\-145.978\\-5\\-49.10435\\-145.9099\\-5\\-50.14642\\-146.9271\\-5\\-53.0106\\-150.2348\\-5\\-54.77498\\-148.8803\\-5\\-53.73794\\-146.9271\\-5\\-52.45338\\-144.974\\-5\\-51.62714\\-143.0209\\-5\\-51.05748\\-142.435\\-5\\-49.10435\\-141.5731\\-5\\-47.15123\\-140.4362\\-5\\-45.77742\\-139.1146\\-5\\-44.17146\\-137.1615\\-5\\-43.24498\\-136.1743\\-5\\-41.29185\\-134.5363\\-5\\-39.33873\\-133.7689\\-5\\-37.3856\\-132.5569\\-5\\-35.43248\\-132.0183\\-5\\-31.52623\\-131.3397\\-5\\-29.5731\\-131.2941\\-5\\-25.66685\\-131.3248\\-5\\-21.7606\\-131.8562\\-5\\-19.80748\\-132.4576\\-5\\-17.02501\\-135.2084\\-5\\-16.17176\\-137.1615\\-5\\-16.06281\\-139.1146\\-5\\-16.06281\\-141.0678\\-5\\-15.13134\\-143.0209\\-5\\-13.9481\\-144.2773\\-5\\-11.99498\\-146.0388\\-5\\-11.15419\\-146.9271\\-5\\-9.153595\\-150.8334\\-5\\-8.331031\\-152.7865\\-5\\-9.525399\\-154.7396\\-5\\-10.04185\\-155.1346\\-5\\-10.5583\\-154.7396\\-5\\-11.99498\\-152.6208\\-5\\-13.08894\\-150.8334\\-5\\-13.9481\\-149.9501\\-5\\-15.90123\\-149.7514\\-5\\-16.85816\\-150.8334\\-5\\-18.21347\\-152.7865\\-5\\-19.03151\\-154.7396\\-5\\-19.80748\\-155.4952\\-5\\-21.7606\\-157.1274\\-5\\-23.71373\\-157.9277\\-5\\-25.66685\\-159.1596\\-5\\-27.61998\\-159.396\\-5\\-29.5731\\-159.7697\\-5\\-31.52623\\-160.2735\\-5\\-33.47935\\-160.2493\\-5\\-35.43248\\-159.722\\-5\\-37.3856\\-159.4722\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "77" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "354" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "66.13003\\-215.1115\\-5\\65.1328\\-213.3334\\-5\\65.58562\\-211.3803\\-5\\66.99429\\-209.4271\\-5\\67.74487\\-207.474\\-5\\67.38285\\-205.5209\\-5\\66.49197\\-203.5678\\-5\\66.13003\\-203.157\\-5\\64.1769\\-201.6395\\-5\\62.22377\\-201.2173\\-5\\58.31752\\-201.2679\\-5\\56.3644\\-201.8421\\-5\\56.13698\\-201.6146\\-5\\55.62872\\-199.6615\\-5\\56.03888\\-197.7084\\-5\\56.77079\\-195.7553\\-5\\57.73769\\-191.849\\-5\\57.95131\\-189.8959\\-5\\58.78837\\-187.9428\\-5\\59.75939\\-184.0365\\-5\\60.00011\\-182.0834\\-5\\60.09626\\-180.1303\\-5\\61.08216\\-178.1771\\-5\\61.59219\\-176.224\\-5\\62.22377\\-174.7714\\-5\\63.51947\\-172.3178\\-5\\64.1769\\-171.7295\\-5\\66.13003\\-171.3825\\-5\\67.13202\\-170.3646\\-5\\67.57784\\-168.4115\\-5\\68.82745\\-166.4584\\-5\\69.27905\\-164.5053\\-5\\68.79929\\-162.5521\\-5\\66.82603\\-160.599\\-5\\66.22476\\-158.6459\\-5\\68.08315\\-157.3623\\-5\\70.03628\\-157.1724\\-5\\71.9894\\-157.1896\\-5\\73.94253\\-157.8254\\-5\\75.89565\\-159.1078\\-5\\77.84878\\-159.1596\\-5\\79.8019\\-159.7417\\-5\\80.63577\\-160.599\\-5\\81.55559\\-162.5521\\-5\\83.70815\\-164.4105\\-5\\85.66128\\-165.4747\\-5\\86.4154\\-166.4584\\-5\\87.16311\\-168.4115\\-5\\87.6144\\-168.7958\\-5\\89.56753\\-169.7719\\-5\\90.20441\\-170.3646\\-5\\91.88259\\-172.3178\\-5\\92.48559\\-174.2709\\-5\\91.52065\\-175.0428\\-5\\89.56753\\-174.6459\\-5\\87.6144\\-173.8524\\-5\\85.66128\\-173.5706\\-5\\83.70815\\-174.8229\\-5\\81.75503\\-175.5366\\-5\\80.89853\\-176.224\\-5\\77.84878\\-179.1394\\-5\\74.94846\\-182.0834\\-5\\73.19382\\-184.0365\\-5\\71.9894\\-187.2148\\-5\\70.87791\\-189.8959\\-5\\70.27858\\-191.849\\-5\\70.26219\\-193.8021\\-5\\70.59515\\-197.7084\\-5\\70.62222\\-199.6615\\-5\\71.22768\\-201.6146\\-5\\73.13251\\-205.5209\\-5\\73.88869\\-207.474\\-5\\73.04226\\-209.4271\\-5\\71.9894\\-211.3709\\-5\\70.72327\\-213.3334\\-5\\70.03628\\-214.0204\\-5\\68.08315\\-215.1249\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002304" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "355" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.08929\\-207.474\\-5\\83.70815\\-205.2846\\-5\\82.30756\\-203.5678\\-5\\81.75503\\-203.2635\\-5\\79.8019\\-202.5912\\-5\\79.04765\\-201.6146\\-5\\76.0994\\-195.7553\\-5\\76.05724\\-193.8021\\-5\\75.42392\\-191.849\\-5\\75.05183\\-189.8959\\-5\\75.63097\\-187.9428\\-5\\75.89565\\-187.4932\\-5\\77.22983\\-185.9896\\-5\\77.84878\\-185.5221\\-5\\79.8019\\-183.5099\\-5\\80.94763\\-182.0834\\-5\\81.75503\\-181.2946\\-5\\83.70815\\-180.5284\\-5\\85.66128\\-180.8186\\-5\\87.6144\\-181.4486\\-5\\88.26359\\-182.0834\\-5\\89.02131\\-184.0365\\-5\\90.46053\\-185.9896\\-5\\91.52065\\-186.9247\\-5\\93.47378\\-187.4374\\-5\\94.02737\\-187.9428\\-5\\95.14507\\-189.8959\\-5\\95.16781\\-193.8021\\-5\\95.46475\\-195.7553\\-5\\95.46446\\-197.7084\\-5\\95.11208\\-199.6615\\-5\\94.24628\\-201.6146\\-5\\93.08684\\-203.5678\\-5\\92.80046\\-205.5209\\-5\\91.97757\\-207.474\\-5\\91.52065\\-207.9352\\-5\\89.56753\\-208.8809\\-5\\87.6144\\-209.2304\\-5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "356" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-211.8482\\-3\\-94.02622\\-211.1194\\-3\\-97.93247\\-210.7319\\-3\\-99.8856\\-209.669\\-3\\-101.8387\\-207.8052\\-3\\-104.0131\\-205.5209\\-3\\-104.8674\\-203.5678\\-3\\-105.186\\-201.6146\\-3\\-105.1897\\-197.7084\\-3\\-105.0043\\-195.7553\\-3\\-104.9949\\-193.8021\\-3\\-104.4528\\-191.849\\-3\\-102.7308\\-189.8959\\-3\\-101.8778\\-187.9428\\-3\\-99.8856\\-186.817\\-3\\-98.6942\\-185.9896\\-3\\-95.97935\\-184.9987\\-3\\-94.67076\\-184.0365\\-3\\-92.0731\\-183.0874\\-3\\-90.11997\\-182.9558\\-3\\-88.16685\\-182.561\\-3\\-86.21372\\-182.7005\\-3\\-84.2606\\-183.6872\\-3\\-82.30747\\-185.1478\\-3\\-81.45976\\-185.9896\\-3\\-80.35435\\-187.4773\\-3\\-78.40122\\-189.4459\\-3\\-77.83458\\-189.8959\\-3\\-76.78614\\-191.849\\-3\\-76.70719\\-193.8021\\-3\\-76.4481\\-194.5346\\-3\\-75.69243\\-195.7553\\-3\\-75.1335\\-197.7084\\-3\\-76.71864\\-201.6146\\-3\\-76.72047\\-203.5678\\-3\\-77.68043\\-205.5209\\-3\\-78.40122\\-206.3777\\-3\\-80.35435\\-208.0075\\-3\\-81.82858\\-209.4271\\-3\\-82.30747\\-210.1002\\-3\\-84.2606\\-212.0028\\-3\\-86.21372\\-212.7379\\-3\\-88.16685\\-212.805\\-3\\-90.11997\\-212.46\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "357" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-66.68247\\-213.9319\\-3\\-68.6356\\-213.0977\\-3\\-70.58872\\-212.663\\-3\\-72.54185\\-211.6402\\-3\\-72.80368\\-211.3803\\-3\\-73.43423\\-209.4271\\-3\\-72.89063\\-207.474\\-3\\-72.85923\\-205.5209\\-3\\-72.54185\\-204.7885\\-3\\-71.74839\\-203.5678\\-3\\-70.96714\\-201.6146\\-3\\-70.83485\\-197.7084\\-3\\-70.58872\\-196.9876\\-3\\-69.46355\\-195.7553\\-3\\-69.33964\\-193.8021\\-3\\-70.58872\\-193.0005\\-3\\-71.40945\\-191.849\\-3\\-73.35565\\-189.8959\\-3\\-74.65903\\-187.9428\\-3\\-75.35177\\-185.9896\\-3\\-76.4481\\-185.1351\\-3\\-80.35435\\-181.2209\\-3\\-82.30747\\-179.4813\\-3\\-84.2606\\-178.9748\\-3\\-86.21372\\-178.7896\\-3\\-88.16685\\-178.3058\\-3\\-90.11997\\-178.3607\\-3\\-92.0731\\-178.5824\\-3\\-94.02622\\-178.5159\\-3\\-94.47091\\-178.1771\\-3\\-94.92838\\-176.224\\-3\\-92.97231\\-174.2709\\-3\\-92.0731\\-173.1213\\-3\\-90.75388\\-170.3646\\-3\\-88.9763\\-168.4115\\-3\\-87.07132\\-166.4584\\-3\\-85.65961\\-164.5053\\-3\\-84.90613\\-162.5521\\-3\\-84.2606\\-161.9278\\-3\\-82.30747\\-161.3586\\-3\\-80.35435\\-159.6517\\-3\\-78.40122\\-158.8576\\-3\\-76.4481\\-158.4637\\-3\\-74.49497\\-158.7406\\-3\\-72.54185\\-159.4408\\-3\\-71.14285\\-160.599\\-3\\-69.62142\\-162.5521\\-3\\-68.37651\\-164.5053\\-3\\-67.66387\\-166.4584\\-3\\-66.31549\\-168.4115\\-3\\-66.27608\\-172.3178\\-3\\-65.68048\\-174.2709\\-3\\-64.30398\\-176.224\\-3\\-64.28546\\-178.1771\\-3\\-63.83036\\-180.1303\\-3\\-63.02571\\-182.0834\\-3\\-63.02391\\-184.0365\\-3\\-62.31426\\-185.9896\\-3\\-61.37951\\-189.8959\\-3\\-60.8231\\-190.4459\\-3\\-60.09214\\-191.849\\-3\\-58.45586\\-193.8021\\-3\\-57.71454\\-195.7553\\-3\\-56.64072\\-197.7084\\-3\\-55.15073\\-201.6146\\-3\\-54.03939\\-203.5678\\-3\\-53.0106\\-207.198\\-3\\-52.09507\\-209.4271\\-3\\-51.95266\\-211.3803\\-3\\-53.0106\\-212.7494\\-3\\-54.96373\\-212.9681\\-3\\-56.07655\\-213.3334\\-3\\-56.91685\\-213.8284\\-3\\-58.86998\\-214.4904\\-3\\-60.8231\\-214.5346\\-3\\-64.72935\\-214.4487\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "358" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-160.5754\\-3\\-39.33873\\-160.56\\-3\\-41.29185\\-159.6774\\-3\\-42.56138\\-158.6459\\-3\\-44.26426\\-156.6928\\-3\\-44.82638\\-154.7396\\-3\\-44.9864\\-152.7865\\-3\\-45.02372\\-148.8803\\-3\\-46.5379\\-146.9271\\-3\\-47.15123\\-146.3457\\-3\\-49.10435\\-146.7595\\-3\\-51.05748\\-149.5346\\-3\\-52.13983\\-150.8334\\-3\\-53.0106\\-151.448\\-3\\-53.76779\\-150.8334\\-3\\-54.36663\\-148.8803\\-3\\-53.21289\\-146.9271\\-3\\-51.80393\\-144.974\\-3\\-51.01992\\-143.0209\\-3\\-49.10435\\-141.7033\\-3\\-47.15123\\-141.4348\\-3\\-45.1981\\-139.6796\\-3\\-43.24498\\-137.0631\\-3\\-41.29185\\-135.7932\\-3\\-39.33873\\-134.284\\-3\\-37.3856\\-133.6712\\-3\\-35.43248\\-132.6338\\-3\\-33.47935\\-132.184\\-3\\-23.71373\\-132.1653\\-3\\-21.7606\\-132.2071\\-3\\-19.80748\\-133.0642\\-3\\-17.63338\\-135.2084\\-3\\-16.53677\\-137.1615\\-3\\-16.17176\\-139.1146\\-3\\-16.06281\\-141.0678\\-3\\-15.72558\\-143.0209\\-3\\-14.77082\\-144.974\\-3\\-13.9481\\-145.6724\\-3\\-11.99498\\-146.3147\\-3\\-11.32585\\-146.9271\\-3\\-9.818055\\-148.8803\\-3\\-8.036543\\-152.7865\\-3\\-8.288477\\-154.7396\\-3\\-9.065289\\-156.6928\\-3\\-10.04185\\-157.6568\\-3\\-10.55338\\-156.6928\\-3\\-11.79522\\-154.7396\\-3\\-12.15657\\-152.7865\\-3\\-13.30763\\-150.8334\\-3\\-13.9481\\-150.2566\\-3\\-15.90123\\-150.2586\\-3\\-16.49641\\-150.8334\\-3\\-17.85435\\-153.0168\\-3\\-18.74084\\-154.7396\\-3\\-21.7606\\-157.6182\\-3\\-23.71373\\-158.8576\\-3\\-25.66685\\-159.396\\-3\\-27.61998\\-159.7753\\-3\\-29.5731\\-160.7606\\-3\\-31.52623\\-161.1372\\-3\\-33.47935\\-161.1292\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "359" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-131.9597\\-3\\48.93942\\-131.3021\\-3\\48.5519\\-131.0007\\-3\\46.59877\\-128.3217\\-3\\46.16409\\-127.3959\\-3\\46.35129\\-125.4428\\-3\\46.59877\\-125.1172\\-3\\48.5519\\-124.3478\\-3\\49.92403\\-125.4428\\-3\\51.86971\\-127.3959\\-3\\53.03798\\-129.349\\-3\\52.29835\\-131.3021\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "73" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "360" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "68.08315\\-214.3036\\-3\\66.66016\\-213.3334\\-3\\66.6872\\-211.3803\\-3\\67.19069\\-209.4271\\-3\\68.41081\\-207.474\\-3\\68.76727\\-205.5209\\-3\\68.08315\\-204.0835\\-3\\66.3684\\-201.6146\\-3\\66.13003\\-201.3999\\-3\\64.1769\\-200.5941\\-3\\62.22377\\-200.0613\\-3\\60.27065\\-199.9847\\-3\\58.31752\\-199.4502\\-3\\57.05591\\-197.7084\\-3\\57.3723\\-195.7553\\-3\\58.67434\\-191.849\\-3\\59.25706\\-187.9428\\-3\\59.78529\\-185.9896\\-3\\60.09626\\-184.0365\\-3\\60.20406\\-182.0834\\-3\\61.7984\\-176.224\\-3\\62.86611\\-174.2709\\-3\\63.27794\\-172.3178\\-3\\64.1769\\-171.2404\\-3\\66.13003\\-171.5767\\-3\\67.1401\\-170.3646\\-3\\67.41365\\-168.4115\\-3\\68.67483\\-166.4584\\-3\\69.17584\\-164.5053\\-3\\69.0092\\-162.5521\\-3\\68.08315\\-161.6858\\-3\\66.59676\\-160.599\\-3\\66.92857\\-158.6459\\-3\\68.08315\\-157.5645\\-3\\70.03628\\-157.181\\-3\\71.9894\\-157.1981\\-3\\73.94253\\-157.8312\\-3\\75.89565\\-159.1167\\-3\\77.84878\\-159.2232\\-3\\79.8019\\-159.9831\\-3\\80.39749\\-160.599\\-3\\80.9489\\-162.5521\\-3\\81.75503\\-163.4612\\-3\\85.07867\\-166.4584\\-3\\86.5738\\-168.4115\\-3\\87.6144\\-169.4191\\-3\\89.56753\\-170.2019\\-3\\91.52065\\-171.5419\\-3\\92.29647\\-172.3178\\-3\\93.77976\\-174.2709\\-3\\94.28345\\-176.224\\-3\\93.47378\\-177.7116\\-3\\91.52065\\-177.0094\\-3\\89.56753\\-176.6732\\-3\\87.6144\\-176.0421\\-3\\85.66128\\-175.6543\\-3\\84.69997\\-176.224\\-3\\81.75503\\-177.3768\\-3\\79.8019\\-179.0542\\-3\\77.84878\\-180.892\\-3\\75.04298\\-184.0365\\-3\\74.23266\\-185.9896\\-3\\73.19691\\-187.9428\\-3\\72.45273\\-189.8959\\-3\\72.25905\\-191.849\\-3\\72.2299\\-197.7084\\-3\\72.31773\\-199.6615\\-3\\73.33547\\-201.6146\\-3\\75.24734\\-205.5209\\-3\\74.95837\\-207.474\\-3\\73.94253\\-209.2069\\-3\\72.2299\\-211.3803\\-3\\70.03628\\-213.3258\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002303" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "361" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-207.5643\\-3\\88.97073\\-207.474\\-3\\87.6144\\-206.8142\\-3\\87.00092\\-205.5209\\-3\\85.66128\\-204.1982\\-3\\85.20012\\-203.5678\\-3\\83.70815\\-202.0618\\-3\\81.75503\\-201.0578\\-3\\80.20507\\-199.6615\\-3\\78.43722\\-195.7553\\-3\\78.32543\\-193.8021\\-3\\78.36345\\-191.849\\-3\\78.94411\\-189.8959\\-3\\79.8019\\-188.6264\\-3\\80.97136\\-185.9896\\-3\\82.29911\\-184.0365\\-3\\83.70815\\-183.1316\\-3\\85.66128\\-182.8142\\-3\\87.6144\\-182.8983\\-3\\88.57954\\-184.0365\\-3\\89.56753\\-185.6008\\-3\\90.0341\\-185.9896\\-3\\91.52065\\-186.6901\\-3\\93.47378\\-187.0511\\-3\\94.40594\\-187.9428\\-3\\95.04987\\-189.8959\\-3\\95.04987\\-191.849\\-3\\95.16781\\-195.7553\\-3\\95.16781\\-197.7084\\-3\\95.07008\\-199.6615\\-3\\94.04855\\-201.6146\\-3\\92.55432\\-203.5678\\-3\\91.61092\\-205.5209\\-3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "362" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-94.02622\\-209.5792\\-1\\-95.97935\\-208.5367\\-1\\-97.93247\\-207.8496\\-1\\-99.8856\\-206.7079\\-1\\-101.0236\\-205.5209\\-1\\-102.2647\\-203.5678\\-1\\-103.0446\\-201.6146\\-1\\-103.1754\\-199.6615\\-1\\-102.8346\\-195.7553\\-1\\-103.9427\\-193.8021\\-1\\-103.7918\\-193.4766\\-1\\-102.3193\\-191.849\\-1\\-101.8387\\-191.505\\-1\\-99.8856\\-191.1194\\-1\\-99.12083\\-191.849\\-1\\-98.65269\\-193.8021\\-1\\-98.52271\\-195.7553\\-1\\-97.78599\\-197.7084\\-1\\-95.97935\\-200.0269\\-1\\-94.02622\\-200.952\\-1\\-92.0731\\-201.0165\\-1\\-88.16685\\-201.0165\\-1\\-86.67149\\-201.6146\\-1\\-85.7412\\-201.6146\\-1\\-84.2606\\-200.8975\\-1\\-83.39135\\-199.6615\\-1\\-82.86357\\-197.7084\\-1\\-82.67738\\-195.7553\\-1\\-83.39135\\-193.8021\\-1\\-82.30747\\-192.451\\-1\\-80.35435\\-192.4322\\-1\\-79.15151\\-193.8021\\-1\\-79.13667\\-201.6146\\-1\\-78.26324\\-203.5678\\-1\\-80.35435\\-204.5254\\-1\\-81.54667\\-205.5209\\-1\\-86.21372\\-209.9417\\-1\\-88.16685\\-210.4953\\-1\\-90.11997\\-209.608\\-1\\-92.0731\\-209.8089\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "363" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-84.2606\\-191.4421\\-1\\-85.13036\\-189.8959\\-1\\-86.56468\\-187.9428\\-1\\-87.17549\\-185.9896\\-1\\-86.21372\\-185.3143\\-1\\-84.2606\\-186.8091\\-1\\-82.97965\\-187.9428\\-1\\-83.5648\\-189.8959\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "68" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "364" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-70.58872\\-211.6859\\-1\\-72.54185\\-210.6365\\-1\\-73.85007\\-209.4271\\-1\\-75.21622\\-207.474\\-1\\-75.44078\\-205.5209\\-1\\-74.97029\\-203.5678\\-1\\-74.86733\\-201.6146\\-1\\-73.84047\\-199.6615\\-1\\-73.15801\\-197.7084\\-1\\-72.92398\\-195.7553\\-1\\-72.94061\\-193.8021\\-1\\-73.90552\\-191.849\\-1\\-75.13455\\-189.8959\\-1\\-75.92774\\-187.9428\\-1\\-77.59229\\-185.9896\\-1\\-80.35435\\-183.2286\\-1\\-82.30747\\-181.4403\\-1\\-84.2606\\-180.7474\\-1\\-86.21372\\-180.64\\-1\\-88.16685\\-179.6857\\-1\\-90.11997\\-179.8861\\-1\\-92.0731\\-180.658\\-1\\-94.02622\\-180.658\\-1\\-95.97935\\-181.2958\\-1\\-96.96479\\-180.1303\\-1\\-96.51257\\-178.1771\\-1\\-95.65383\\-176.224\\-1\\-94.10071\\-174.2709\\-1\\-92.0731\\-172.1016\\-1\\-90.92139\\-170.3646\\-1\\-87.06573\\-166.4584\\-1\\-85.50396\\-164.5053\\-1\\-83.63584\\-162.5521\\-1\\-82.30747\\-161.5931\\-1\\-80.35435\\-159.6647\\-1\\-78.40122\\-159.1427\\-1\\-74.49497\\-158.9607\\-1\\-72.54185\\-159.1078\\-1\\-70.58872\\-160.6595\\-1\\-69.58466\\-162.5521\\-1\\-68.33163\\-164.5053\\-1\\-67.6252\\-166.4584\\-1\\-66.31549\\-168.4115\\-1\\-66.28574\\-172.3178\\-1\\-65.71095\\-174.2709\\-1\\-64.37253\\-176.224\\-1\\-64.28546\\-178.1771\\-1\\-63.77519\\-180.1303\\-1\\-62.45071\\-182.0834\\-1\\-62.36983\\-184.0365\\-1\\-61.88647\\-185.9896\\-1\\-60.98586\\-187.9428\\-1\\-60.48701\\-189.8959\\-1\\-59.30733\\-193.8021\\-1\\-57.96317\\-195.7553\\-1\\-57.61228\\-197.7084\\-1\\-57.11629\\-199.6615\\-1\\-55.95509\\-201.6146\\-1\\-55.01591\\-205.5209\\-1\\-54.05692\\-207.474\\-1\\-53.73061\\-209.4271\\-1\\-54.96373\\-210.6708\\-1\\-56.91685\\-210.8954\\-1\\-60.8231\\-210.9057\\-1\\-61.90992\\-211.3803\\-1\\-62.77623\\-211.9397\\-1\\-64.72935\\-212.6748\\-1\\-68.6356\\-212.4707\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "365" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-161.4469\\-1\\-42.66662\\-160.599\\-1\\-44.57525\\-158.6459\\-1\\-45.71111\\-156.6928\\-1\\-45.80561\\-154.7396\\-1\\-45.83934\\-150.8334\\-1\\-46.00028\\-148.8803\\-1\\-47.15123\\-147.7766\\-1\\-49.10435\\-148.4652\\-1\\-49.48746\\-148.8803\\-1\\-50.62275\\-150.8334\\-1\\-51.05748\\-151.3857\\-1\\-53.0106\\-152.6001\\-1\\-54.01752\\-150.8334\\-1\\-53.4082\\-148.8803\\-1\\-51.835\\-146.9271\\-1\\-50.66309\\-144.974\\-1\\-50.17363\\-143.0209\\-1\\-49.10435\\-142.1633\\-1\\-47.15123\\-142.0311\\-1\\-45.83106\\-141.0678\\-1\\-44.13769\\-139.1146\\-1\\-42.26305\\-137.1615\\-1\\-41.29185\\-136.2821\\-1\\-39.33873\\-134.7872\\-1\\-37.3856\\-134.1631\\-1\\-33.47935\\-133.491\\-1\\-23.71373\\-133.479\\-1\\-21.7606\\-133.6668\\-1\\-19.80748\\-134.4509\\-1\\-17.85435\\-136.2688\\-1\\-17.07205\\-137.1615\\-1\\-16.55735\\-139.1146\\-1\\-16.17176\\-141.0678\\-1\\-16.06281\\-143.0209\\-1\\-15.74586\\-144.974\\-1\\-13.9481\\-146.7449\\-1\\-11.99498\\-147.0887\\-1\\-10.04185\\-148.1778\\-1\\-9.347532\\-148.8803\\-1\\-8.317284\\-150.8334\\-1\\-8.022142\\-152.7865\\-1\\-7.993985\\-156.6928\\-1\\-7.927136\\-158.6459\\-1\\-8.088726\\-159.6668\\-1\\-10.04185\\-159.0057\\-1\\-10.84403\\-156.6928\\-1\\-11.73411\\-154.7396\\-1\\-12.28794\\-152.7865\\-1\\-13.9481\\-151.0328\\-1\\-15.90123\\-151.3283\\-1\\-17.02529\\-152.7865\\-1\\-18.16659\\-154.7396\\-1\\-20.13749\\-156.6928\\-1\\-22.59665\\-158.6459\\-1\\-23.71373\\-159.396\\-1\\-25.66685\\-159.827\\-1\\-27.61998\\-160.892\\-1\\-29.5731\\-161.3756\\-1\\-31.52623\\-161.4895\\-1\\-37.3856\\-161.5096\\-1\\-39.33873\\-161.6152\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "366" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "13.39565\\-202.0426\\-1\\12.88583\\-201.6146\\-1\\11.90029\\-199.6615\\-1\\13.39565\\-198.7108\\-1\\15.34877\\-198.2541\\-1\\19.25502\\-198.084\\-1\\25.1144\\-198.084\\-1\\27.06752\\-198.6713\\-1\\29.02065\\-199.0695\\-1\\32.9269\\-199.0974\\-1\\34.1219\\-199.6615\\-1\\34.88002\\-201.1777\\-1\\34.88002\\-201.7367\\-1\\32.9269\\-202.3099\\-1\\27.06752\\-202.3339\\-1\\25.1144\\-202.5349\\-1\\21.20815\\-202.4577\\-1\\19.25502\\-202.5529\\-1\\17.3019\\-202.3339\\-1\\15.34877\\-202.3301\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "367" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-135.5953\\-1\\53.61227\\-135.2084\\-1\\52.45815\\-134.4005\\-1\\50.50502\\-133.8558\\-1\\48.5519\\-133.1144\\-1\\46.59877\\-131.1608\\-1\\45.86635\\-129.349\\-1\\45.38741\\-127.3959\\-1\\45.80323\\-125.4428\\-1\\46.59877\\-123.5464\\-1\\48.5519\\-121.859\\-1\\50.50502\\-121.3352\\-1\\52.45815\\-122.5673\\-1\\54.41127\\-124.5735\\-1\\56.5882\\-127.3959\\-1\\56.68992\\-131.3021\\-1\\56.6813\\-133.2553\\-1\\56.3644\\-134.0528\\-1\\55.32953\\-135.2084\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "71" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "368" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "68.08315\\-211.4204\\-1\\67.59779\\-209.4271\\-1\\67.92156\\-207.474\\-1\\68.71473\\-205.5209\\-1\\68.64824\\-203.5678\\-1\\67.22237\\-201.6146\\-1\\66.13003\\-200.5334\\-1\\62.22377\\-199.0964\\-1\\60.27065\\-198.7754\\-1\\58.88784\\-197.7084\\-1\\58.82284\\-195.7553\\-1\\58.98702\\-193.8021\\-1\\59.27914\\-191.849\\-1\\59.82143\\-189.8959\\-1\\59.93014\\-187.9428\\-1\\60.21847\\-185.9896\\-1\\60.74149\\-184.0365\\-1\\61.21556\\-180.1303\\-1\\61.63241\\-178.1771\\-1\\61.81738\\-176.224\\-1\\62.15719\\-174.2709\\-1\\62.12903\\-172.3178\\-1\\61.85678\\-170.3646\\-1\\62.22377\\-169.9531\\-1\\66.13003\\-168.9799\\-1\\66.42757\\-168.4115\\-1\\67.07376\\-166.4584\\-1\\66.89825\\-164.5053\\-1\\64.40578\\-162.5521\\-1\\65.22246\\-160.599\\-1\\66.78658\\-158.6459\\-1\\68.08315\\-157.5264\\-1\\70.03628\\-157.181\\-1\\71.9894\\-157.1981\\-1\\73.94253\\-157.7982\\-1\\75.89565\\-159.0618\\-1\\77.84878\\-159.4393\\-1\\79.19632\\-160.599\\-1\\80.70034\\-162.5521\\-1\\84.62864\\-166.4584\\-1\\87.6144\\-169.5699\\-1\\89.50571\\-170.3646\\-1\\91.52065\\-171.5619\\-1\\92.26807\\-172.3178\\-1\\94.38208\\-176.224\\-1\\95.29\\-178.1771\\-1\\94.13042\\-180.1303\\-1\\93.47378\\-180.3893\\-1\\91.52065\\-179.2306\\-1\\89.56753\\-178.688\\-1\\85.66128\\-178.6333\\-1\\83.70815\\-178.7588\\-1\\81.75503\\-179.4608\\-1\\79.8019\\-180.8481\\-1\\78.44041\\-182.0834\\-1\\77.00667\\-184.0365\\-1\\75.89565\\-186.7859\\-1\\75.24178\\-187.9428\\-1\\74.43081\\-189.8959\\-1\\74.28672\\-191.849\\-1\\74.24247\\-193.8021\\-1\\74.30143\\-195.7553\\-1\\74.50917\\-197.7084\\-1\\75.27611\\-199.6615\\-1\\76.41136\\-201.6146\\-1\\77.07683\\-203.5678\\-1\\77.55038\\-205.5209\\-1\\76.29515\\-207.474\\-1\\73.94253\\-209.7437\\-1\\70.96401\\-211.3803\\-1\\70.03628\\-212.0245\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002302" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "22" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "369" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-202.2695\\-1\\87.6144\\-200.7336\\-1\\85.66128\\-200.309\\-1\\83.70815\\-198.8292\\-1\\82.44363\\-197.7084\\-1\\82.41812\\-191.849\\-1\\82.45963\\-189.8959\\-1\\82.94975\\-187.9428\\-1\\84.34617\\-185.9896\\-1\\85.66128\\-185.0591\\-1\\87.6144\\-185.6099\\-1\\89.56753\\-187.6471\\-1\\93.47378\\-187.3475\\-1\\94.06103\\-187.9428\\-1\\94.32325\\-191.849\\-1\\94.77034\\-193.8021\\-1\\95.04987\\-195.7553\\-1\\95.10138\\-197.7084\\-1\\94.7473\\-199.6615\\-1\\93.47378\\-200.8849\\-1\\91.82969\\-201.6146\\-1\\91.52065\\-201.9088\\-1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "370" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.11997\\-206.1372\\1\\-90.82527\\-205.5209\\1\\-92.0731\\-204.7771\\1\\-97.93247\\-204.7592\\1\\-99.09293\\-203.5678\\1\\-100.5667\\-201.6146\\1\\-101.0587\\-199.6615\\1\\-99.8856\\-198.0905\\1\\-97.93247\\-198.8695\\1\\-95.97935\\-200.8639\\1\\-94.02622\\-202.4542\\1\\-88.16685\\-202.4821\\1\\-86.40903\\-203.5678\\1\\-87.23167\\-205.5209\\1\\-88.16685\\-206.4805\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "64" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "371" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-70.58872\\-210.0848\\1\\-72.54185\\-208.9652\\1\\-74.49497\\-208.5975\\1\\-76.4481\\-207.6156\\1\\-77.66117\\-205.5209\\1\\-78.01282\\-203.5678\\1\\-77.25401\\-201.6146\\1\\-77.21608\\-199.6615\\1\\-77.03256\\-197.7084\\1\\-75.87424\\-195.7553\\1\\-75.7938\\-193.8021\\1\\-76.4481\\-192.9058\\1\\-76.93638\\-191.849\\1\\-77.54881\\-189.8959\\1\\-78.40122\\-188.8589\\1\\-78.92397\\-187.9428\\1\\-79.58008\\-185.9896\\1\\-80.35435\\-185.2263\\1\\-82.30747\\-184.3446\\1\\-84.2606\\-182.9425\\1\\-86.21372\\-182.7215\\1\\-92.0731\\-182.7143\\1\\-94.02622\\-182.8581\\1\\-95.97935\\-183.618\\1\\-97.93247\\-182.1367\\1\\-97.53325\\-180.1303\\1\\-96.80605\\-178.1771\\1\\-95.31612\\-176.224\\1\\-94.49039\\-174.2709\\1\\-92.76669\\-172.3178\\1\\-90.92139\\-170.3646\\1\\-88.16685\\-167.6064\\1\\-85.25603\\-164.5053\\1\\-80.35435\\-159.6692\\1\\-74.49497\\-158.0185\\1\\-72.54185\\-158.0111\\1\\-71.65613\\-158.6459\\1\\-70.58872\\-159.8228\\1\\-70.06375\\-160.599\\1\\-69.32647\\-162.5521\\1\\-68.06594\\-164.5053\\1\\-67.38155\\-166.4584\\1\\-66.30545\\-168.4115\\1\\-66.28574\\-172.3178\\1\\-65.85167\\-174.2709\\1\\-64.87796\\-176.224\\1\\-64.29466\\-178.1771\\1\\-63.88513\\-180.1303\\1\\-62.44014\\-184.0365\\1\\-61.90769\\-185.9896\\1\\-60.67449\\-189.8959\\1\\-60.36737\\-191.849\\1\\-59.83737\\-193.8021\\1\\-58.39103\\-197.7084\\1\\-57.87038\\-199.6615\\1\\-56.01658\\-205.5209\\1\\-55.74346\\-207.474\\1\\-56.91685\\-208.6474\\1\\-58.86998\\-208.7087\\1\\-60.8231\\-208.5935\\1\\-62.77623\\-208.6234\\1\\-64.72935\\-209.8755\\1\\-66.68247\\-210.6797\\1\\-68.6356\\-210.7525\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "372" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-130.7763\\1\\-63.3634\\-129.349\\1\\-63.286\\-127.3959\\1\\-61.93801\\-125.4428\\1\\-58.86998\\-122.4178\\1\\-56.91685\\-121.0974\\1\\-54.96373\\-121.1496\\1\\-54.41927\\-121.5365\\1\\-52.82091\\-123.4896\\1\\-52.40635\\-125.4428\\1\\-53.0106\\-127.4072\\1\\-54.96373\\-128.196\\1\\-56.71053\\-127.3959\\1\\-56.91685\\-127.1773\\1\\-58.86998\\-127.5194\\1\\-59.91037\\-129.349\\1\\-60.8231\\-131.2361\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "373" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-133.9364\\1\\-46.5775\\-133.2553\\1\\-47.15123\\-132.515\\1\\-47.77267\\-131.3021\\1\\-47.76482\\-129.349\\1\\-47.15123\\-128.6342\\1\\-45.1981\\-127.0559\\1\\-44.39286\\-127.3959\\1\\-43.24498\\-128.131\\1\\-42.57996\\-129.349\\1\\-42.64524\\-131.3021\\1\\-43.24498\\-132.8786\\1\\-43.62165\\-133.2553\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "374" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-43.24498\\-163.5058\\1\\-44.61655\\-162.5521\\1\\-45.1981\\-161.7173\\1\\-46.75211\\-158.6459\\1\\-47.06245\\-156.6928\\1\\-46.69205\\-154.7396\\1\\-47.28086\\-152.7865\\1\\-48.68266\\-150.8334\\1\\-49.10435\\-150.66\\1\\-51.05748\\-152.2913\\1\\-51.87319\\-152.7865\\1\\-53.0106\\-153.9801\\1\\-53.59654\\-152.7865\\1\\-51.81011\\-148.8803\\1\\-49.10435\\-144.4715\\1\\-47.15123\\-143.7874\\1\\-46.07939\\-143.0209\\1\\-45.1981\\-141.9786\\1\\-43.34189\\-139.1146\\1\\-41.29185\\-137.1081\\1\\-39.33873\\-136.0368\\1\\-37.3856\\-135.7167\\1\\-35.43248\\-134.6774\\1\\-33.47935\\-134.2066\\1\\-23.71373\\-134.2066\\1\\-21.7606\\-134.6343\\1\\-19.80748\\-135.8332\\1\\-18.4116\\-137.1615\\1\\-17.04806\\-139.1146\\1\\-16.18305\\-143.0209\\1\\-16.06281\\-144.974\\1\\-14.70477\\-146.9271\\1\\-13.9481\\-147.5515\\1\\-11.99498\\-147.8012\\1\\-10.04185\\-148.407\\1\\-9.517032\\-148.8803\\1\\-8.126287\\-150.8334\\1\\-7.980219\\-154.7396\\1\\-7.635742\\-156.6928\\1\\-7.394166\\-158.6459\\1\\-7.600445\\-160.599\\1\\-8.088726\\-162.4436\\1\\-10.04185\\-161.116\\1\\-10.17729\\-158.6459\\1\\-10.44107\\-156.6928\\1\\-11.63407\\-154.7396\\1\\-13.03523\\-152.7865\\1\\-13.9481\\-151.9353\\1\\-15.00673\\-152.7865\\1\\-16.38566\\-154.7396\\1\\-17.85435\\-156.3203\\1\\-20.41783\\-158.6459\\1\\-21.7606\\-159.4048\\1\\-23.71373\\-159.8893\\1\\-25.66685\\-161.2379\\1\\-29.5731\\-161.8538\\1\\-31.52623\\-163.0345\\1\\-33.47935\\-163.2559\\1\\-37.3856\\-163.2679\\1\\-39.33873\\-163.8813\\1\\-41.29185\\-163.9193\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "375" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "21.20815\\-204.5516\\1\\19.25502\\-203.405\\1\\17.3019\\-202.8367\\1\\15.34877\\-202.6388\\1\\13.39565\\-202.3164\\1\\11.44252\\-200.8517\\1\\9.489399\\-200.3363\\1\\5.583149\\-200.1498\\1\\4.975681\\-199.6615\\1\\5.583149\\-198.9197\\1\\7.536274\\-198.4197\\1\\9.489399\\-198.4103\\1\\11.44252\\-198.1967\\1\\15.34877\\-197.5598\\1\\17.3019\\-197.1528\\1\\19.25502\\-196.8705\\1\\21.20815\\-196.7194\\1\\23.16127\\-196.7318\\1\\27.06752\\-197.0399\\1\\30.97377\\-197.9702\\1\\32.9269\\-198.0407\\1\\34.88002\\-198.2267\\1\\36.83315\\-198.7853\\1\\38.78627\\-199.1361\\1\\39.8643\\-199.6615\\1\\40.7394\\-200.56\\1\\41.35259\\-201.6146\\1\\40.7394\\-202.0883\\1\\38.78627\\-202.3378\\1\\34.88002\\-202.3037\\1\\32.9269\\-202.0287\\1\\30.97377\\-202.1117\\1\\29.02065\\-202.4068\\1\\25.1144\\-203.3392\\1\\23.16127\\-204.5588\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "376" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "36.83315\\-132.5473\\1\\34.94183\\-131.3021\\1\\33.29051\\-129.349\\1\\33.66871\\-127.3959\\1\\34.88002\\-126.623\\1\\36.83315\\-126.2553\\1\\38.78627\\-126.2725\\1\\40.70184\\-127.3959\\1\\40.45551\\-129.349\\1\\39.62865\\-131.3021\\1\\38.78627\\-132.2701\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "377" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-135.5014\\1\\46.59877\\-134.4866\\1\\44.85061\\-133.2553\\1\\43.8305\\-131.3021\\1\\44.45865\\-127.3959\\1\\45.71391\\-125.4428\\1\\46.11916\\-123.4896\\1\\47.49631\\-121.5365\\1\\48.5519\\-120.3733\\1\\50.50502\\-118.6949\\1\\52.45815\\-118.8305\\1\\55.18501\\-121.5365\\1\\56.66836\\-123.4896\\1\\57.12273\\-125.4428\\1\\57.82282\\-127.3959\\1\\57.94192\\-129.349\\1\\58.34024\\-131.3021\\1\\58.54132\\-133.2553\\1\\57.42815\\-135.2084\\1\\56.3644\\-136.3467\\1\\54.41127\\-136.5779\\1\\52.45815\\-135.8986\\1\\50.50502\\-135.5549\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "65" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "378" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "70.03628\\-210.5771\\1\\68.732\\-209.4271\\1\\67.98841\\-205.5209\\1\\68.48238\\-203.5678\\1\\68.09084\\-201.6146\\1\\66.13003\\-199.4241\\1\\62.22377\\-198.2708\\1\\61.47066\\-197.7084\\1\\60.47009\\-195.7553\\1\\59.85774\\-193.8021\\1\\60.99099\\-189.8959\\1\\61.00307\\-185.9896\\1\\61.22481\\-184.0365\\1\\61.57458\\-182.0834\\1\\61.81738\\-178.1771\\1\\61.82705\\-170.3646\\1\\63.21777\\-168.4115\\1\\63.70605\\-166.4584\\1\\63.78017\\-164.5053\\1\\63.64677\\-162.5521\\1\\64.72131\\-160.599\\1\\65.55718\\-158.6459\\1\\66.13003\\-158.005\\1\\68.08315\\-157.1513\\1\\71.9894\\-157.1896\\1\\73.94253\\-157.6089\\1\\77.84878\\-159.6922\\1\\80.63329\\-162.5521\\1\\84.55672\\-166.4584\\1\\87.6144\\-169.5761\\1\\89.36989\\-170.3646\\1\\91.52065\\-171.8229\\1\\91.97842\\-172.3178\\1\\92.83875\\-174.2709\\1\\94.24107\\-176.224\\1\\96.23444\\-178.1771\\1\\98.09297\\-180.1303\\1\\97.96243\\-182.0834\\1\\97.38003\\-182.7236\\1\\95.4269\\-182.6993\\1\\93.8328\\-182.0834\\1\\91.52065\\-181.0098\\1\\89.56753\\-180.7334\\1\\87.6144\\-180.7878\\1\\85.66128\\-180.9685\\1\\83.70815\\-181.3998\\1\\81.75503\\-182.9719\\1\\79.8019\\-183.3302\\1\\79.16399\\-184.0365\\1\\78.38732\\-185.9896\\1\\78.27525\\-187.9428\\1\\78.31998\\-189.8959\\1\\77.84878\\-191.0005\\1\\77.28619\\-191.849\\1\\76.58778\\-193.8021\\1\\77.84878\\-194.9937\\1\\79.12582\\-195.7553\\1\\79.8019\\-196.4112\\1\\80.63761\\-197.7084\\1\\80.55376\\-201.6146\\1\\80.40353\\-203.5678\\1\\79.8019\\-204.0082\\1\\77.84878\\-205.9447\\1\\75.89565\\-207.5498\\1\\71.9894\\-210.1062\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "379" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "93.47378\\-199.4174\\1\\91.5904\\-197.7084\\1\\90.12726\\-195.7553\\1\\89.56753\\-195.3663\\1\\87.6144\\-194.8044\\1\\86.62085\\-193.8021\\1\\87.6144\\-192.2787\\1\\89.56753\\-192.1393\\1\\91.52065\\-193.0149\\1\\93.47378\\-194.1362\\1\\94.52847\\-195.7553\\1\\94.68011\\-197.7084\\1" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "380" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-80.454\\-207.474\\3\\-81.68516\\-205.5209\\3\\-81.23916\\-203.5678\\3\\-81.57505\\-201.6146\\3\\-81.68603\\-199.6615\\3\\-80.13606\\-197.7084\\3\\-79.20023\\-195.7553\\3\\-79.20824\\-191.849\\3\\-79.99364\\-189.8959\\3\\-81.23454\\-187.9428\\3\\-81.82733\\-185.9896\\3\\-82.30747\\-185.5923\\3\\-84.2606\\-184.9198\\3\\-86.21372\\-184.8189\\3\\-88.16685\\-184.9135\\3\\-90.11997\\-184.8058\\3\\-92.0731\\-184.866\\3\\-94.02622\\-185.7243\\3\\-95.97935\\-186.9007\\3\\-97.93247\\-187.5544\\3\\-98.34428\\-187.9428\\3\\-98.98875\\-189.8959\\3\\-99.06674\\-191.849\\3\\-99.8856\\-192.8403\\3\\-100.8695\\-191.849\\3\\-100.814\\-189.8959\\3\\-100.6003\\-187.9428\\3\\-100.1693\\-185.9896\\3\\-98.79784\\-184.0365\\3\\-98.47869\\-182.0834\\3\\-97.15599\\-180.1303\\3\\-96.61464\\-178.1771\\3\\-94.94684\\-176.224\\3\\-94.02622\\-174.3828\\3\\-92.84267\\-172.3178\\3\\-88.16685\\-167.6064\\3\\-86.21372\\-165.5415\\3\\-84.2606\\-163.3053\\3\\-82.30747\\-161.5154\\3\\-80.35435\\-159.6266\\3\\-78.40122\\-159.0806\\3\\-76.4481\\-157.8248\\3\\-74.49497\\-157.3345\\3\\-72.54185\\-157.2465\\3\\-70.58872\\-158.1946\\3\\-70.20686\\-158.6459\\3\\-69.36247\\-160.599\\3\\-68.23887\\-162.5521\\3\\-67.47956\\-164.5053\\3\\-66.53387\\-166.4584\\3\\-66.28574\\-168.4115\\3\\-66.24779\\-172.3178\\3\\-65.95745\\-174.2709\\3\\-65.28976\\-176.224\\3\\-64.30398\\-178.1771\\3\\-64.18806\\-180.1303\\3\\-63.8094\\-182.0834\\3\\-63.18773\\-184.0365\\3\\-62.30538\\-185.9896\\3\\-61.84509\\-187.9428\\3\\-61.63145\\-189.8959\\3\\-61.24163\\-191.849\\3\\-60.46398\\-193.8021\\3\\-59.37825\\-197.7084\\3\\-58.58432\\-199.6615\\3\\-58.08553\\-201.6146\\3\\-57.89341\\-203.5678\\3\\-58.7709\\-205.5209\\3\\-58.96626\\-205.5209\\3\\-60.8231\\-204.4036\\3\\-62.83601\\-203.5678\\3\\-64.72935\\-203.0315\\3\\-65.74884\\-203.5678\\3\\-66.68247\\-204.6432\\3\\-67.16734\\-205.5209\\3\\-67.34594\\-207.474\\3\\-68.6356\\-208.6233\\3\\-70.58872\\-208.5698\\3\\-72.54185\\-208.0851\\3\\-74.49497\\-207.287\\3\\-76.4481\\-208.1233\\3\\-78.40122\\-207.7215\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "381" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.1981\\-135.9117\\3\\-46.7327\\-135.2084\\3\\-49.10435\\-133.7309\\3\\-51.05748\\-132.0067\\3\\-53.0106\\-131.4106\\3\\-54.96373\\-130.5955\\3\\-56.91685\\-130.1079\\3\\-58.86998\\-131.2673\\3\\-60.8231\\-133.2276\\3\\-62.77623\\-133.9861\\3\\-64.03022\\-133.2553\\3\\-64.72935\\-132.6637\\3\\-65.71269\\-131.3021\\3\\-65.57247\\-129.349\\3\\-65.21456\\-127.3959\\3\\-64.72935\\-125.8529\\3\\-63.53646\\-123.4896\\3\\-62.77623\\-122.6064\\3\\-59.714\\-119.5834\\3\\-58.86998\\-118.9377\\3\\-56.91685\\-118.8931\\3\\-54.96373\\-119.1842\\3\\-54.17027\\-119.5834\\3\\-53.0106\\-120.4424\\3\\-52.33921\\-121.5365\\3\\-51.64722\\-123.4896\\3\\-50.34789\\-125.4428\\3\\-49.10435\\-126.9329\\3\\-47.15123\\-126.1425\\3\\-45.1981\\-124.7469\\3\\-43.24498\\-124.2536\\3\\-39.33873\\-124.4208\\3\\-37.3856\\-124.4208\\3\\-36.48262\\-125.4428\\3\\-37.3856\\-126.6983\\3\\-38.08315\\-127.3959\\3\\-39.33873\\-128.2748\\3\\-40.39881\\-129.349\\3\\-41.21108\\-131.3021\\3\\-42.20807\\-133.2553\\3\\-43.24498\\-134.546\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "70" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "382" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.088726\\-169.0701\\3\\-8.438359\\-168.4115\\3\\-9.104879\\-166.4584\\3\\-9.515021\\-164.5053\\3\\-10.02829\\-162.5521\\3\\-10.17729\\-160.599\\3\\-10.64058\\-158.6459\\3\\-10.95776\\-156.6928\\3\\-11.99498\\-155.6555\\3\\-13.9481\\-155.6021\\3\\-14.96452\\-156.6928\\3\\-15.90123\\-158.2755\\3\\-16.31439\\-158.6459\\3\\-17.85435\\-159.463\\3\\-19.80748\\-160.2597\\3\\-21.7606\\-161.405\\3\\-23.71373\\-161.5815\\3\\-25.66685\\-162.2922\\3\\-27.61998\\-163.3176\\3\\-29.5731\\-163.4141\\3\\-31.52623\\-164.1865\\3\\-33.47935\\-165.2601\\3\\-37.3856\\-165.3547\\3\\-39.33873\\-166.1469\\3\\-41.29185\\-167.1691\\3\\-43.24498\\-167.1622\\3\\-44.69298\\-166.4584\\3\\-46.67312\\-164.5053\\3\\-47.15123\\-163.7767\\3\\-48.4973\\-160.599\\3\\-49.52753\\-158.6459\\3\\-48.40766\\-156.6928\\3\\-47.96503\\-154.7396\\3\\-49.10435\\-153.5173\\3\\-51.05748\\-153.5601\\3\\-52.79269\\-154.7396\\3\\-53.0106\\-155.1453\\3\\-53.38728\\-154.7396\\3\\-53.49888\\-152.7865\\3\\-51.93584\\-150.8334\\3\\-50.53454\\-148.8803\\3\\-49.10435\\-146.7407\\3\\-47.15123\\-145.9193\\3\\-45.49436\\-144.974\\3\\-45.1981\\-144.6525\\3\\-43.51263\\-141.0678\\3\\-41.29185\\-138.7475\\3\\-39.33873\\-137.8493\\3\\-37.58627\\-137.1615\\3\\-35.43248\\-136.118\\3\\-33.47935\\-135.9379\\3\\-27.61998\\-135.9307\\3\\-23.71373\\-135.8757\\3\\-21.7606\\-135.9886\\3\\-19.80748\\-136.807\\3\\-19.44805\\-137.1615\\3\\-18.4647\\-139.1146\\3\\-17.10276\\-141.0678\\3\\-16.18305\\-144.974\\3\\-14.95534\\-146.9271\\3\\-13.9481\\-147.9344\\3\\-11.99498\\-149.2253\\3\\-10.04185\\-149.6923\\3\\-8.669558\\-150.8334\\3\\-7.763205\\-154.7396\\3\\-6.401283\\-158.6459\\3\\-6.920053\\-160.599\\3\\-7.32562\\-162.5521\\3\\-7.590744\\-166.4584\\3\\-7.869189\\-168.4115\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "383" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "21.20815\\-211.9906\\3\\19.96923\\-211.3803\\3\\19.25502\\-210.8601\\3\\17.66664\\-209.4271\\3\\15.34877\\-207.1286\\3\\14.45799\\-205.5209\\3\\13.50416\\-203.5678\\3\\11.44252\\-201.6067\\3\\9.489399\\-200.4787\\3\\7.536274\\-200.1498\\3\\5.583149\\-200.0458\\3\\3.630024\\-200.0679\\3\\1.676899\\-200.4874\\3\\-0.276226\\-200.3291\\3\\-0.9219313\\-199.6615\\3\\-0.276226\\-198.2548\\3\\0.3702308\\-197.7084\\3\\1.676899\\-197.1461\\3\\5.583149\\-196.9996\\3\\7.536274\\-197.2057\\3\\9.489399\\-197.573\\3\\11.44252\\-197.573\\3\\15.34877\\-196.8154\\3\\17.3019\\-195.9629\\3\\19.25502\\-194.1657\\3\\19.83434\\-193.8021\\3\\21.20815\\-193.2724\\3\\23.16127\\-193.2724\\3\\25.1144\\-194.4092\\3\\27.06752\\-195.127\\3\\29.02065\\-196.307\\3\\30.97377\\-196.8821\\3\\32.9269\\-197.1941\\3\\34.88002\\-197.6708\\3\\36.83315\\-197.9322\\3\\40.7394\\-198.1738\\3\\42.69252\\-198.7731\\3\\44.06948\\-199.6615\\3\\44.64565\\-200.2494\\3\\46.59877\\-200.8736\\3\\47.83384\\-201.6146\\3\\46.59877\\-202.6388\\3\\44.64565\\-202.6599\\3\\42.69252\\-202.4698\\3\\40.7394\\-202.5345\\3\\38.78627\\-202.4862\\3\\36.83315\\-202.0855\\3\\34.88002\\-201.9816\\3\\30.97377\\-202.5796\\3\\29.7368\\-203.5678\\3\\29.68845\\-205.5209\\3\\28.28823\\-207.474\\3\\27.786\\-209.4271\\3\\27.06752\\-210.4749\\3\\26.0569\\-211.3803\\3\\25.1144\\-211.9807\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "384" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-137.9012\\3\\52.45815\\-136.6403\\3\\50.50502\\-136.1081\\3\\48.5519\\-136.1214\\3\\46.59877\\-135.9182\\3\\44.64565\\-134.6992\\3\\42.69252\\-133.6992\\3\\40.7394\\-133.467\\3\\36.83315\\-133.894\\3\\34.88002\\-133.9241\\3\\33.32578\\-133.2553\\3\\32.9269\\-132.8326\\3\\32.2523\\-131.3021\\3\\30.97377\\-129.215\\3\\30.35528\\-127.3959\\3\\30.57166\\-125.4428\\3\\30.97377\\-125.2003\\3\\32.9269\\-126.1736\\3\\36.83315\\-125.8681\\3\\38.78627\\-125.8957\\3\\40.7394\\-126.7128\\3\\42.69252\\-128.5666\\3\\44.64565\\-126.5905\\3\\45.50788\\-125.4428\\3\\45.96751\\-121.5365\\3\\47.52493\\-119.5834\\3\\49.82143\\-117.6303\\3\\50.50502\\-116.7758\\3\\52.45815\\-116.5173\\3\\53.44105\\-117.6303\\3\\56.3644\\-120.6325\\3\\57.12891\\-121.5365\\3\\57.93097\\-123.4896\\3\\58.07512\\-125.4428\\3\\58.7429\\-127.3959\\3\\59.05614\\-129.349\\3\\59.4491\\-133.2553\\3\\58.95942\\-135.2084\\3\\58.31752\\-136.1605\\3\\57.37172\\-137.1615\\3\\56.3644\\-137.8244\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002300" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "68" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "385" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "70.03628\\-207.9998\\3\\69.671\\-207.474\\3\\68.79072\\-205.5209\\3\\69.11625\\-203.5678\\3\\69.15737\\-201.6146\\3\\68.08315\\-200.4744\\3\\66.13003\\-198.725\\3\\64.1769\\-197.5173\\3\\62.22377\\-196.4402\\3\\61.60732\\-195.7553\\3\\61.08524\\-193.8021\\3\\61.28608\\-191.849\\3\\61.76022\\-189.8959\\3\\61.61135\\-185.9896\\3\\61.81738\\-182.0834\\3\\61.81738\\-180.1303\\3\\62.01207\\-176.224\\3\\61.81738\\-172.3178\\3\\61.81738\\-170.3646\\3\\62.12903\\-168.4115\\3\\63.07074\\-166.4584\\3\\63.30359\\-164.5053\\3\\63.42678\\-162.5521\\3\\65.11239\\-160.599\\3\\65.54516\\-158.6459\\3\\66.13003\\-157.7662\\3\\67.16909\\-156.6928\\3\\68.08315\\-156.0509\\3\\71.9894\\-157.0496\\3\\73.94253\\-157.261\\3\\75.89565\\-157.9569\\3\\78.66029\\-160.599\\3\\84.55672\\-166.4584\\3\\87.6144\\-169.5761\\3\\89.56753\\-170.9235\\3\\90.97811\\-172.3178\\3\\92.42168\\-174.2709\\3\\94.00275\\-176.224\\3\\97.38003\\-179.4378\\3\\98.02192\\-180.1303\\3\\98.43613\\-182.0834\\3\\98.48789\\-185.9896\\3\\97.38003\\-187.4226\\3\\96.43156\\-185.9896\\3\\95.4269\\-185.0062\\3\\93.47378\\-184.9405\\3\\91.52065\\-184.5464\\3\\89.56753\\-182.9682\\3\\88.02209\\-184.0365\\3\\85.66128\\-186.0458\\3\\83.70815\\-186.9662\\3\\81.75503\\-187.4598\\3\\81.27211\\-187.9428\\3\\82.41909\\-189.8959\\3\\84.31746\\-191.849\\3\\84.65661\\-193.8021\\3\\84.59296\\-201.6146\\3\\84.55218\\-203.5678\\3\\86.53008\\-205.5209\\3\\86.2871\\-207.474\\3\\85.66128\\-208.0061\\3\\83.70815\\-207.5119\\3\\81.75503\\-206.2238\\3\\79.8019\\-204.6647\\3\\77.84878\\-204.7063\\3\\76.2881\\-205.5209\\3\\73.94253\\-207.9387\\3\\71.9894\\-209.1943\\3" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "386" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-86.21372\\-212.4242\\5\\-86.82738\\-211.3803\\5\\-85.14561\\-209.4271\\5\\-84.97034\\-207.474\\5\\-85.32027\\-205.5209\\5\\-86.80949\\-203.5678\\5\\-86.29362\\-201.6146\\5\\-85.18223\\-199.6615\\5\\-85.21789\\-195.7553\\5\\-84.92736\\-193.8021\\5\\-84.96292\\-191.849\\5\\-85.70127\\-189.8959\\5\\-86.21372\\-189.3834\\5\\-88.16685\\-189.0451\\5\\-90.11997\\-188.4155\\5\\-92.0731\\-188.708\\5\\-95.97935\\-192.2821\\5\\-97.02608\\-193.8021\\5\\-95.7373\\-195.7553\\5\\-95.13648\\-197.7084\\5\\-95.97935\\-198.6046\\5\\-97.93247\\-199.1075\\5\\-99.03481\\-197.7084\\5\\-98.99458\\-195.7553\\5\\-100.4749\\-193.8021\\5\\-101.1894\\-191.849\\5\\-100.6543\\-187.9428\\5\\-99.56008\\-185.9896\\5\\-98.82766\\-184.0365\\5\\-97.27627\\-182.0834\\5\\-96.70669\\-180.1303\\5\\-95.97935\\-178.2173\\5\\-94.85529\\-176.224\\5\\-93.38389\\-174.2709\\5\\-92.60422\\-172.3178\\5\\-90.92139\\-170.3646\\5\\-87.07132\\-166.4584\\5\\-85.59612\\-164.5053\\5\\-84.88406\\-162.5521\\5\\-84.2606\\-161.9251\\5\\-82.30747\\-160.5043\\5\\-80.35435\\-159.5341\\5\\-78.40122\\-158.3378\\5\\-76.4481\\-157.5357\\5\\-74.49497\\-156.4626\\5\\-72.54185\\-155.8402\\5\\-70.58872\\-157.0764\\5\\-69.18919\\-158.6459\\5\\-67.93145\\-160.599\\5\\-67.47303\\-162.5521\\5\\-66.52089\\-164.5053\\5\\-66.28574\\-166.4584\\5\\-66.20287\\-170.3646\\5\\-66.02291\\-172.3178\\5\\-65.49065\\-174.2709\\5\\-64.51765\\-176.224\\5\\-64.30398\\-178.1771\\5\\-64.30398\\-180.1303\\5\\-64.19922\\-182.0834\\5\\-63.82322\\-184.0365\\5\\-63.21628\\-185.9896\\5\\-62.38929\\-187.9428\\5\\-62.33344\\-189.8959\\5\\-61.88025\\-191.849\\5\\-61.69067\\-193.8021\\5\\-61.14\\-195.7553\\5\\-59.92713\\-197.7084\\5\\-59.78369\\-199.6615\\5\\-60.56711\\-201.6146\\5\\-60.8231\\-201.8565\\5\\-62.77623\\-202.5187\\5\\-64.72935\\-202.2039\\5\\-66.68247\\-202.4919\\5\\-68.15868\\-203.5678\\5\\-68.6356\\-204.1271\\5\\-70.58872\\-205.6651\\5\\-72.54185\\-206.6008\\5\\-74.49497\\-206.561\\5\\-78.40122\\-207.1379\\5\\-80.35435\\-208.4192\\5\\-82.30747\\-210.1181\\5\\-84.2606\\-211.4333\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "387" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-62.77623\\-137.5134\\5\\-64.72935\\-136.9432\\5\\-65.57198\\-135.2084\\5\\-67.34611\\-131.3021\\5\\-67.25261\\-129.349\\5\\-66.68247\\-127.6484\\5\\-65.77135\\-125.4428\\5\\-65.31528\\-123.4896\\5\\-63.84916\\-121.5365\\5\\-62.00195\\-119.5834\\5\\-60.8231\\-118.5709\\5\\-58.86998\\-117.7264\\5\\-56.91685\\-118.348\\5\\-53.0106\\-118.5363\\5\\-51.31261\\-119.5834\\5\\-50.77948\\-121.5365\\5\\-49.10435\\-123.0076\\5\\-47.15123\\-123.3619\\5\\-45.1981\\-123.4669\\5\\-43.24498\\-122.9123\\5\\-41.29185\\-123.2191\\5\\-39.33873\\-123.8465\\5\\-37.3856\\-123.915\\5\\-35.69156\\-125.4428\\5\\-36.19805\\-127.3959\\5\\-37.3856\\-128.3825\\5\\-38.86967\\-129.349\\5\\-39.33873\\-129.7838\\5\\-40.33398\\-131.3021\\5\\-40.86972\\-133.2553\\5\\-42.40419\\-135.2084\\5\\-42.91946\\-137.1615\\5\\-43.24498\\-137.4754\\5\\-45.1981\\-137.9018\\5\\-47.15123\\-137.7825\\5\\-48.20917\\-137.1615\\5\\-49.10435\\-136.0991\\5\\-49.60162\\-135.2084\\5\\-50.39719\\-133.2553\\5\\-51.05748\\-132.5509\\5\\-53.0106\\-132.0308\\5\\-54.96373\\-132.1696\\5\\-56.91685\\-132.0866\\5\\-58.74477\\-133.2553\\5\\-60.8231\\-135.3533\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "78" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "388" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.182476\\-183.1748\\5\\-5.68691\\-182.0834\\5\\-6.135601\\-181.9268\\5\\-8.088726\\-180.7864\\5\\-8.76602\\-180.1303\\5\\-7.852215\\-178.1771\\5\\-7.293704\\-176.224\\5\\-7.413866\\-174.2709\\5\\-7.774056\\-172.3178\\5\\-7.726453\\-170.3646\\5\\-8.088726\\-170.0294\\5\\-8.745687\\-168.4115\\5\\-9.257484\\-166.4584\\5\\-9.318666\\-164.5053\\5\\-9.732377\\-162.5521\\5\\-10.72544\\-160.599\\5\\-11.99498\\-159.4449\\5\\-13.1086\\-160.599\\5\\-13.9481\\-162.2682\\5\\-14.22872\\-162.5521\\5\\-15.90123\\-163.4131\\5\\-19.80748\\-163.4299\\5\\-21.7606\\-164.3228\\5\\-23.71373\\-165.3818\\5\\-29.5731\\-165.424\\5\\-31.56285\\-166.4584\\5\\-33.47935\\-167.2528\\5\\-35.43248\\-167.3149\\5\\-37.54429\\-168.4115\\5\\-39.33873\\-169.1592\\5\\-45.1981\\-169.1128\\5\\-46.36479\\-168.4115\\5\\-48.38356\\-166.4584\\5\\-49.60162\\-164.5053\\5\\-49.66661\\-162.5521\\5\\-50.25634\\-160.599\\5\\-51.05748\\-159.1125\\5\\-53.0106\\-158.2455\\5\\-54.50362\\-156.6928\\5\\-53.01823\\-152.7865\\5\\-51.53916\\-150.8334\\5\\-51.05748\\-150.3613\\5\\-49.10435\\-149.2918\\5\\-47.79576\\-148.8803\\5\\-45.1981\\-147.7222\\5\\-44.39275\\-146.9271\\5\\-42.70057\\-144.974\\5\\-42.53627\\-143.0209\\5\\-42.08984\\-141.0678\\5\\-41.29185\\-140.0843\\5\\-39.33873\\-139.1373\\5\\-37.3856\\-139.8508\\5\\-35.52126\\-139.1146\\5\\-33.47935\\-137.968\\5\\-27.61998\\-137.8441\\5\\-25.66685\\-137.7538\\5\\-23.71373\\-137.2423\\5\\-21.7606\\-137.1221\\5\\-19.54753\\-139.1146\\5\\-18.67753\\-141.0678\\5\\-17.48897\\-143.0209\\5\\-16.6101\\-144.974\\5\\-15.00851\\-146.9271\\5\\-13.04792\\-148.8803\\5\\-11.99498\\-150.0366\\5\\-10.04185\\-151.6351\\5\\-9.00561\\-152.7865\\5\\-8.088726\\-154.7281\\5\\-6.812478\\-156.6928\\5\\-6.127972\\-158.6459\\5\\-5.799511\\-160.599\\5\\-5.59622\\-162.5521\\5\\-5.511343\\-170.3646\\5\\-4.630898\\-172.3178\\5\\-4.182476\\-172.9547\\5\\-3.654451\\-174.2709\\5\\-3.630021\\-180.1303\\5\\-3.823353\\-182.0834\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "389" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "21.20815\\-215.7338\\5\\19.25502\\-214.6054\\5\\17.3019\\-213.8975\\5\\16.25799\\-213.3334\\5\\15.34877\\-212.6515\\5\\12.00451\\-209.4271\\5\\10.11973\\-207.474\\5\\9.489399\\-206.6583\\5\\8.906991\\-205.5209\\5\\8.836396\\-201.6146\\5\\7.536274\\-200.4727\\5\\3.630024\\-199.9433\\5\\1.676899\\-200.4398\\5\\-0.276226\\-200.6015\\5\\-2.095468\\-199.6615\\5\\-3.212173\\-197.7084\\5\\-3.399192\\-195.7553\\5\\-2.229351\\-194.2579\\5\\-0.8597816\\-195.7553\\5\\-0.276226\\-196.132\\5\\1.676899\\-196.0718\\5\\5.583149\\-196.0718\\5\\7.536274\\-196.5458\\5\\9.489399\\-196.8459\\5\\11.44252\\-196.8101\\5\\13.39565\\-196.2106\\5\\13.97653\\-195.7553\\5\\15.95808\\-193.8021\\5\\17.3019\\-192.7469\\5\\19.25502\\-191.543\\5\\21.20815\\-191.2869\\5\\23.16127\\-191.2869\\5\\25.1144\\-191.5882\\5\\27.06752\\-192.753\\5\\29.02065\\-194.3895\\5\\30.97377\\-195.1318\\5\\32.9269\\-196.2532\\5\\34.88002\\-197.164\\5\\36.83315\\-197.573\\5\\40.7394\\-197.573\\5\\44.64565\\-197.9525\\5\\46.59877\\-198.6339\\5\\48.5519\\-198.8953\\5\\50.50502\\-198.9379\\5\\51.65914\\-199.6615\\5\\52.8858\\-201.6146\\5\\52.45815\\-202.1103\\5\\50.50502\\-202.4947\\5\\48.5519\\-202.4368\\5\\46.59877\\-202.6383\\5\\44.64565\\-202.6464\\5\\42.69252\\-202.5164\\5\\40.7394\\-202.0493\\5\\38.78627\\-202.3774\\5\\34.88002\\-202.5602\\5\\33.73973\\-203.5678\\5\\33.55513\\-207.474\\5\\32.9269\\-208.5346\\5\\32.21743\\-209.4271\\5\\27.06752\\-214.5741\\5\\25.1144\\-215.7338\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "390" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-137.3371\\5\\44.64565\\-136.0736\\5\\42.69252\\-134.476\\5\\40.7394\\-133.9877\\5\\38.78627\\-134.1585\\5\\36.58241\\-135.2084\\5\\34.88002\\-135.8857\\5\\32.9269\\-135.0776\\5\\30.97377\\-133.2799\\5\\29.02065\\-131.1987\\5\\27.07958\\-129.349\\5\\27.87319\\-127.3959\\5\\29.02065\\-126.005\\5\\29.86404\\-125.4428\\5\\30.97377\\-124.9962\\5\\32.9269\\-125.9224\\5\\34.88002\\-125.9729\\5\\38.78627\\-125.931\\5\\40.7394\\-126.4417\\5\\42.4728\\-127.3959\\5\\42.94606\\-127.3959\\5\\44.51021\\-125.4428\\5\\44.7154\\-121.5365\\5\\45.94946\\-119.5834\\5\\46.59877\\-118.9163\\5\\48.5916\\-117.6303\\5\\49.7673\\-115.6771\\5\\49.85202\\-113.724\\5\\50.50502\\-113.0109\\5\\52.45815\\-112.9555\\5\\53.36642\\-113.724\\5\\54.85683\\-115.6771\\5\\55.42335\\-117.6303\\5\\57.21334\\-119.5834\\5\\58.52923\\-121.5365\\5\\59.06227\\-123.4896\\5\\59.08413\\-125.4428\\5\\59.44685\\-127.3959\\5\\60.87366\\-129.349\\5\\60.97866\\-133.2553\\5\\60.90957\\-135.2084\\5\\60.27065\\-136.81\\5\\60.00431\\-137.1615\\5\\56.3644\\-139.0595\\5\\54.41127\\-138.9889\\5\\52.45815\\-137.938\\5\\50.50502\\-137.6235\\5\\48.5519\\-137.7968\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "391" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "77.84878\\-212.1099\\5\\75.89565\\-211.1117\\5\\73.94253\\-210.436\\5\\71.9894\\-209.6204\\5\\71.9894\\-208.8814\\5\\73.94253\\-208.1145\\5\\75.89565\\-208.1313\\5\\77.84878\\-208.6281\\5\\79.8019\\-210.3924\\5\\81.12669\\-211.3803\\5\\79.8019\\-212.3458\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002299" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "392" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-209.604\\5\\83.70815\\-208.2945\\5\\82.92401\\-207.474\\5\\79.8019\\-204.6005\\5\\77.84878\\-203.0912\\5\\75.89565\\-203.6341\\5\\74.93359\\-205.5209\\5\\73.94253\\-207.0261\\5\\71.9894\\-207.0429\\5\\70.97166\\-205.5209\\5\\70.71281\\-203.5678\\5\\70.62689\\-201.6146\\5\\70.03628\\-200.8441\\5\\68.08315\\-199.2598\\5\\66.13003\\-198.2752\\5\\63.45903\\-195.7553\\5\\62.98609\\-193.8021\\5\\63.08263\\-189.8959\\5\\62.73204\\-187.9428\\5\\61.99998\\-185.9896\\5\\61.99998\\-184.0365\\5\\61.81738\\-180.1303\\5\\62.6008\\-178.1771\\5\\63.05893\\-176.224\\5\\62.66113\\-174.2709\\5\\61.89825\\-172.3178\\5\\61.81738\\-168.4115\\5\\62.26222\\-164.5053\\5\\63.391\\-162.5521\\5\\65.28603\\-160.599\\5\\65.62471\\-158.6459\\5\\65.52297\\-156.6928\\5\\66.13003\\-155.2343\\5\\66.61831\\-154.7396\\5\\68.08315\\-154.0472\\5\\70.03628\\-155.3763\\5\\73.94253\\-156.6851\\5\\75.89565\\-157.8414\\5\\82.60673\\-164.5053\\5\\85.66128\\-167.6076\\5\\90.45776\\-172.3178\\5\\92.31172\\-174.2709\\5\\93.35171\\-176.224\\5\\94.67932\\-178.1771\\5\\95.4269\\-178.7793\\5\\96.72032\\-180.1303\\5\\97.82166\\-182.0834\\5\\98.49413\\-184.0365\\5\\98.82784\\-185.9896\\5\\98.4703\\-189.8959\\5\\98.42684\\-191.849\\5\\97.78955\\-193.8021\\5\\96.58173\\-195.7553\\5\\95.52308\\-197.7084\\5\\94.14386\\-199.6615\\5\\93.51134\\-201.6146\\5\\92.33256\\-203.5678\\5\\91.52065\\-204.6178\\5\\90.63744\\-205.5209\\5\\89.56753\\-206.362\\5\\88.42916\\-207.474\\5\\87.6144\\-208.5172\\5" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "70" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "393" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-213.3593\\7\\-87.30246\\-211.3803\\7\\-84.71083\\-209.4271\\7\\-84.91364\\-207.474\\7\\-86.21372\\-206.4352\\7\\-88.16685\\-205.6294\\7\\-90.11997\\-203.4351\\7\\-91.18853\\-201.6146\\7\\-92.0731\\-200.7171\\7\\-94.02622\\-199.9976\\7\\-95.97935\\-199.5394\\7\\-97.93247\\-199.5129\\7\\-99.28587\\-197.7084\\7\\-99.02781\\-195.7553\\7\\-99.62112\\-193.8021\\7\\-100.8957\\-191.849\\7\\-100.5853\\-189.8959\\7\\-99.54951\\-187.9428\\7\\-98.96771\\-185.9896\\7\\-98.63422\\-184.0365\\7\\-96.88046\\-182.0834\\7\\-95.95664\\-180.1303\\7\\-95.68638\\-178.1771\\7\\-94.83075\\-176.224\\7\\-92.97175\\-174.2709\\7\\-92.0731\\-172.4345\\7\\-90.92139\\-170.3646\\7\\-87.06008\\-166.4584\\7\\-85.50571\\-164.5053\\7\\-84.90294\\-162.5521\\7\\-82.30747\\-159.7789\\7\\-78.40122\\-157.4577\\7\\-76.4481\\-155.9528\\7\\-75.0955\\-154.7396\\7\\-74.49497\\-153.5522\\7\\-72.54185\\-151.2259\\7\\-70.58872\\-150.9998\\7\\-69.79865\\-152.7865\\7\\-69.46192\\-154.7396\\7\\-68.27878\\-156.6928\\7\\-67.4649\\-158.6459\\7\\-66.47077\\-160.599\\7\\-66.19419\\-164.5053\\7\\-66.18563\\-166.4584\\7\\-65.8627\\-170.3646\\7\\-65.46965\\-172.3178\\7\\-64.48186\\-174.2709\\7\\-64.30398\\-176.224\\7\\-64.27637\\-184.0365\\7\\-63.85759\\-185.9896\\7\\-63.6534\\-187.9428\\7\\-63.64954\\-189.8959\\7\\-63.08019\\-191.849\\7\\-62.34154\\-193.8021\\7\\-61.96994\\-195.7553\\7\\-61.79966\\-197.7084\\7\\-62.77623\\-198.7252\\7\\-66.68247\\-200.7211\\7\\-68.6356\\-201.56\\7\\-70.58872\\-202.7197\\7\\-72.54185\\-202.7573\\7\\-73.9843\\-203.5678\\7\\-75.90089\\-205.5209\\7\\-76.4481\\-205.9385\\7\\-78.40122\\-206.6093\\7\\-80.35435\\-208.3945\\7\\-82.30747\\-210.0097\\7\\-83.38914\\-211.3803\\7\\-84.2606\\-212.8414\\7\\-86.21372\\-214.4032\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "126" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "394" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.182476\\-183.8035\\7\\-5.037658\\-182.0834\\7\\-5.527342\\-180.1303\\7\\-5.535071\\-178.1771\\7\\-5.764507\\-176.224\\7\\-6.915818\\-174.2709\\7\\-7.32549\\-172.3178\\7\\-7.312359\\-170.3646\\7\\-7.439473\\-168.4115\\7\\-7.975172\\-166.4584\\7\\-8.868942\\-164.5053\\7\\-10.04185\\-163.0274\\7\\-11.99498\\-164.2306\\7\\-14.02852\\-166.4584\\7\\-15.90123\\-167.3282\\7\\-19.80748\\-167.3577\\7\\-21.8628\\-168.4115\\7\\-23.71373\\-169.2034\\7\\-29.5731\\-169.2074\\7\\-33.47935\\-169.3076\\7\\-35.43248\\-170.553\\7\\-37.3856\\-171.1336\\7\\-41.29185\\-171.1336\\7\\-43.24498\\-171.0824\\7\\-45.1981\\-170.6794\\7\\-47.15123\\-169.5614\\7\\-49.10435\\-167.8079\\7\\-50.20853\\-166.4584\\7\\-51.30496\\-164.5053\\7\\-51.67054\\-162.5521\\7\\-53.0106\\-160.8168\\7\\-54.96373\\-161.3162\\7\\-55.74609\\-160.599\\7\\-55.59849\\-158.6459\\7\\-54.28371\\-156.6928\\7\\-53.54998\\-154.7396\\7\\-52.33656\\-152.7865\\7\\-51.05748\\-151.4643\\7\\-49.10435\\-149.9707\\7\\-47.15123\\-148.6565\\7\\-45.1981\\-147.8239\\7\\-43.92923\\-146.9271\\7\\-41.46073\\-144.974\\7\\-40.30947\\-143.0209\\7\\-40.84525\\-141.0678\\7\\-41.29185\\-140.4865\\7\\-43.24498\\-139.9008\\7\\-45.1981\\-139.9145\\7\\-47.15123\\-138.7381\\7\\-50.98317\\-137.1615\\7\\-52.52232\\-135.2084\\7\\-53.0106\\-134.8693\\7\\-53.6366\\-135.2084\\7\\-54.96373\\-135.5489\\7\\-56.91685\\-134.193\\7\\-58.86998\\-135.8354\\7\\-60.04876\\-137.1615\\7\\-60.64619\\-139.1146\\7\\-62.77623\\-141.1935\\7\\-64.72935\\-141.8996\\7\\-66.68247\\-141.4307\\7\\-67.03584\\-141.0678\\7\\-67.5247\\-139.1146\\7\\-68.6356\\-137.1444\\7\\-69.23862\\-135.2084\\7\\-69.18491\\-131.3021\\7\\-68.6356\\-129.4064\\7\\-67.75818\\-127.3959\\7\\-67.33523\\-125.4428\\7\\-66.68247\\-123.5917\\7\\-65.71111\\-121.5365\\7\\-65.39565\\-119.5834\\7\\-63.61245\\-117.6303\\7\\-62.77623\\-116.9214\\7\\-60.8231\\-116.3756\\7\\-58.86998\\-116.1688\\7\\-56.91685\\-116.7729\\7\\-54.96373\\-116.8966\\7\\-53.0106\\-117.8541\\7\\-51.05748\\-118.7036\\7\\-49.68598\\-119.5834\\7\\-49.10435\\-120.2426\\7\\-47.15123\\-120.5599\\7\\-46.4394\\-121.5365\\7\\-45.1981\\-122.5319\\7\\-43.24498\\-122.1931\\7\\-41.29185\\-122.5755\\7\\-37.3856\\-123.1967\\7\\-34.96163\\-125.4428\\7\\-34.55678\\-127.3959\\7\\-35.02097\\-129.349\\7\\-37.3856\\-131.8682\\7\\-38.50814\\-133.2553\\7\\-38.79161\\-135.2084\\7\\-40.19159\\-137.1615\\7\\-39.33873\\-138.0624\\7\\-38.59905\\-139.1146\\7\\-37.3856\\-140.3716\\7\\-35.43248\\-141.6837\\7\\-33.47935\\-141.8824\\7\\-31.52623\\-141.1212\\7\\-29.58446\\-139.1146\\7\\-27.61998\\-138.1302\\7\\-25.66685\\-138.0319\\7\\-23.71373\\-136.5087\\7\\-21.7606\\-136.1739\\7\\-20.81058\\-137.1615\\7\\-22.15733\\-139.1146\\7\\-20.77829\\-141.0678\\7\\-19.83054\\-143.0209\\7\\-17.85435\\-144.3167\\7\\-15.90123\\-146.0851\\7\\-13.08643\\-148.8803\\7\\-12.03254\\-150.8334\\7\\-11.65729\\-152.7865\\7\\-10.55233\\-154.7396\\7\\-7.999948\\-156.6928\\7\\-7.040816\\-158.6459\\7\\-5.588048\\-160.599\\7\\-4.454518\\-162.5521\\7\\-3.825655\\-164.5053\\7\\-3.2901\\-168.4115\\7\\-2.512554\\-170.3646\\7\\-2.424664\\-174.2709\\7\\-2.426121\\-180.1303\\7\\-2.5191\\-182.0834\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "64" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "395" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-217.7221\\7\\17.3019\\-216.5036\\7\\15.34877\\-215.8032\\7\\13.39565\\-214.5879\\7\\11.44252\\-213.9139\\7\\10.36528\\-213.3334\\7\\9.489399\\-212.5319\\7\\8.840089\\-211.3803\\7\\8.033275\\-209.4271\\7\\7.536274\\-208.8086\\7\\6.893936\\-207.474\\7\\6.859801\\-203.5678\\7\\5.872132\\-201.6146\\7\\3.630024\\-200.3074\\7\\1.676899\\-199.909\\7\\-0.276226\\-199.9545\\7\\-2.229351\\-198.7676\\7\\-3.245571\\-197.7084\\7\\-3.934333\\-195.7553\\7\\-3.127789\\-193.8021\\7\\-2.229351\\-192.3047\\7\\-2.067761\\-193.8021\\7\\-0.276226\\-195.7476\\7\\5.583149\\-195.7476\\7\\7.536274\\-195.85\\7\\9.489399\\-195.3984\\7\\11.44252\\-195.0627\\7\\13.39565\\-194.2832\\7\\15.34877\\-192.6079\\7\\17.3019\\-191.3607\\7\\21.20815\\-190.0103\\7\\23.16127\\-190.0103\\7\\25.1144\\-190.7138\\7\\27.06752\\-191.1629\\7\\28.30631\\-191.849\\7\\29.02065\\-192.4001\\7\\32.9269\\-194.6121\\7\\34.88002\\-196.1842\\7\\36.83315\\-196.7454\\7\\42.69252\\-196.6986\\7\\46.59877\\-196.851\\7\\50.50502\\-197.8967\\7\\52.45815\\-198.543\\7\\53.79414\\-199.6615\\7\\54.97956\\-201.6146\\7\\54.92253\\-203.5678\\7\\54.41127\\-204.3043\\7\\52.45815\\-204.2438\\7\\51.96376\\-203.5678\\7\\50.50502\\-202.4872\\7\\48.5519\\-202.0114\\7\\46.59877\\-202.3742\\7\\44.64565\\-202.5291\\7\\42.69252\\-202.5422\\7\\40.7394\\-202.7788\\7\\39.82666\\-203.5678\\7\\39.51991\\-205.5209\\7\\38.78627\\-207.2975\\7\\36.83315\\-208.9298\\7\\34.32805\\-211.3803\\7\\30.97377\\-214.5541\\7\\29.02065\\-216.4801\\7\\27.06752\\-217.7479\\7\\21.20815\\-217.7728\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "396" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-141.8694\\7\\54.41127\\-140.5088\\7\\52.45815\\-139.4156\\7\\52.16122\\-139.1146\\7\\50.50502\\-138.0847\\7\\46.59877\\-139.632\\7\\45.04674\\-139.1146\\7\\42.69252\\-137.5545\\7\\42.46873\\-137.1615\\7\\42.09771\\-135.2084\\7\\40.7394\\-134.4382\\7\\38.78627\\-135.9235\\7\\36.83315\\-136.563\\7\\34.88002\\-137.6584\\7\\32.9269\\-136.6599\\7\\29.16199\\-135.2084\\7\\28.26367\\-133.2553\\7\\27.06752\\-132.1626\\7\\25.00508\\-131.3021\\7\\24.45136\\-129.349\\7\\25.1144\\-128.1139\\7\\25.7404\\-127.3959\\7\\27.06752\\-126.6458\\7\\30.97377\\-125.7996\\7\\32.9269\\-126.2818\\7\\34.88002\\-126.4458\\7\\36.83315\\-126.4368\\7\\40.7394\\-126.0064\\7\\42.69252\\-126.9558\\7\\44.22451\\-125.4428\\7\\44.27866\\-121.5365\\7\\45.54954\\-119.5834\\7\\47.3939\\-117.6303\\7\\47.89914\\-115.6771\\7\\47.26253\\-113.724\\7\\47.98611\\-111.7709\\7\\48.5519\\-111.3308\\7\\50.50502\\-111.1356\\7\\52.45815\\-111.3429\\7\\54.41127\\-112.7413\\7\\55.27044\\-113.724\\7\\56.53878\\-115.6771\\7\\57.36902\\-117.6303\\7\\58.93897\\-119.5834\\7\\59.43876\\-121.5365\\7\\60.91999\\-123.4896\\7\\60.95675\\-125.4428\\7\\61.14258\\-127.3959\\7\\62.43548\\-129.349\\7\\62.81187\\-131.3021\\7\\61.80966\\-133.2553\\7\\62.48286\\-135.2084\\7\\62.99449\\-137.1615\\7\\62.99829\\-139.1146\\7\\62.27676\\-141.0678\\7\\60.27065\\-141.9412\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "397" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "73.94253\\-210.4491\\7\\72.74183\\-209.4271\\7\\72.33161\\-207.474\\7\\71.69643\\-205.5209\\7\\71.9894\\-205.1063\\7\\73.94253\\-204.352\\7\\75.36243\\-205.5209\\7\\77.25278\\-207.474\\7\\79.58897\\-209.4271\\7\\77.84878\\-210.7728\\7\\75.89565\\-210.5313\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002298" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "69" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "398" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-210.8023\\7\\84.77466\\-209.4271\\7\\83.98997\\-207.474\\7\\81.75503\\-205.3593\\7\\79.8019\\-204.4518\\7\\77.84878\\-202.4357\\7\\75.6515\\-201.6146\\7\\73.94253\\-201.0949\\7\\71.9894\\-200.3884\\7\\71.30856\\-199.6615\\7\\70.03628\\-198.7971\\7\\68.08315\\-198.3143\\7\\65.44643\\-195.7553\\7\\64.97066\\-193.8021\\7\\64.9591\\-191.849\\7\\64.45872\\-189.8959\\7\\63.31356\\-187.9428\\7\\63.11353\\-185.9896\\7\\63.10569\\-184.0365\\7\\62.78571\\-182.0834\\7\\62.01207\\-180.1303\\7\\62.97535\\-178.1771\\7\\63.26627\\-176.224\\7\\63.21342\\-174.2709\\7\\62.65846\\-172.3178\\7\\61.81738\\-170.3646\\7\\61.81738\\-166.4584\\7\\61.95324\\-164.5053\\7\\64.42867\\-162.5521\\7\\65.55272\\-160.599\\7\\65.56809\\-158.6459\\7\\64.77003\\-156.6928\\7\\63.06376\\-154.7396\\7\\63.00357\\-152.7865\\7\\63.44326\\-150.8334\\7\\61.92483\\-148.8803\\7\\62.22377\\-147.3649\\7\\64.1769\\-147.3829\\7\\66.13003\\-148.2452\\7\\67.22636\\-148.8803\\7\\68.08315\\-149.5898\\7\\70.03628\\-151.6591\\7\\72.50031\\-154.7396\\7\\73.94253\\-155.9631\\7\\75.89565\\-157.8038\\7\\79.8019\\-161.6807\\7\\85.66128\\-167.6076\\7\\87.6144\\-169.2962\\7\\88.68813\\-170.3646\\7\\90.36505\\-172.3178\\7\\92.31172\\-174.2709\\7\\93.19195\\-176.224\\7\\94.27769\\-178.1771\\7\\95.98741\\-180.1303\\7\\96.1487\\-182.0834\\7\\96.63982\\-184.0365\\7\\97.38003\\-184.7451\\7\\98.31627\\-185.9896\\7\\98.32523\\-191.849\\7\\97.88829\\-193.8021\\7\\96.54778\\-195.7553\\7\\95.4269\\-197.0555\\7\\94.62789\\-197.7084\\7\\93.43621\\-199.6615\\7\\92.88642\\-205.5209\\7\\92.05715\\-207.474\\7\\90.88274\\-209.4271\\7\\89.56753\\-210.6442\\7\\87.6144\\-211.2739\\7" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "399" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-214.3782\\9\\-89.17902\\-213.3334\\9\\-88.52826\\-211.3803\\9\\-88.16685\\-211.0763\\9\\-86.21372\\-210.6419\\9\\-84.2606\\-210.4738\\9\\-83.28941\\-211.3803\\9\\-83.25271\\-213.3334\\9\\-84.2606\\-214.3863\\9\\-86.21372\\-214.9916\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "121" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "400" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-82.30747\\-208.3292\\9\\-84.2606\\-206.7979\\9\\-86.21372\\-206.5585\\9\\-88.16685\\-205.9828\\9\\-90.11997\\-204.3694\\9\\-92.0731\\-202.5149\\9\\-94.02622\\-200.9081\\9\\-95.97935\\-200.1411\\9\\-97.93247\\-198.863\\9\\-98.8963\\-197.7084\\9\\-98.68775\\-195.7553\\9\\-98.08333\\-193.8021\\9\\-98.81633\\-191.849\\9\\-99.08444\\-189.8959\\9\\-98.95495\\-187.9428\\9\\-98.65025\\-185.9896\\9\\-96.81705\\-182.0834\\9\\-95.77991\\-180.1303\\9\\-94.57868\\-176.224\\9\\-92.8913\\-174.2709\\9\\-90.92139\\-170.3646\\9\\-87.06573\\-166.4584\\9\\-85.42603\\-164.5053\\9\\-84.64754\\-162.5521\\9\\-83.1932\\-160.599\\9\\-80.35435\\-157.756\\9\\-79.18748\\-156.6928\\9\\-77.24952\\-154.7396\\9\\-76.69559\\-152.7865\\9\\-75.3296\\-150.8334\\9\\-74.96582\\-148.8803\\9\\-74.49497\\-147.9605\\9\\-73.55953\\-146.9271\\9\\-72.54185\\-146.2911\\9\\-71.36423\\-144.974\\9\\-71.18107\\-141.0678\\9\\-71.18846\\-137.1615\\9\\-71.11886\\-133.2553\\9\\-70.65531\\-131.3021\\9\\-69.73932\\-129.349\\9\\-69.29173\\-127.3959\\9\\-68.6356\\-125.4872\\9\\-67.76367\\-123.4896\\9\\-67.38422\\-121.5365\\9\\-66.68247\\-119.7688\\9\\-65.64257\\-117.6303\\9\\-62.77623\\-114.7834\\9\\-60.8231\\-113.1621\\9\\-58.86998\\-112.9993\\9\\-56.91685\\-112.5471\\9\\-54.96373\\-112.7259\\9\\-54.16991\\-113.724\\9\\-54.08911\\-115.6771\\9\\-53.43439\\-117.6303\\9\\-53.0106\\-118.054\\9\\-51.05748\\-117.7966\\9\\-49.10435\\-116.2264\\9\\-47.15123\\-117.3496\\9\\-45.96045\\-119.5834\\9\\-45.1981\\-120.404\\9\\-43.24498\\-121.1018\\9\\-41.29185\\-122.0728\\9\\-39.33873\\-122.1362\\9\\-37.3856\\-122.4654\\9\\-36.03101\\-123.4896\\9\\-33.93464\\-125.4428\\9\\-32.68685\\-127.3959\\9\\-32.29679\\-129.349\\9\\-31.26714\\-131.3021\\9\\-33.08149\\-133.2553\\9\\-35.43248\\-135.4081\\9\\-36.9858\\-137.1615\\9\\-36.32223\\-139.1146\\9\\-35.37989\\-141.0678\\9\\-37.3856\\-142.8181\\9\\-39.33873\\-142.5955\\9\\-41.29185\\-141.9029\\9\\-43.24498\\-141.8077\\9\\-45.1981\\-142.2355\\9\\-47.15123\\-140.6211\\9\\-49.75909\\-139.1146\\9\\-51.05748\\-138.4386\\9\\-53.0106\\-137.8939\\9\\-56.91685\\-137.8694\\9\\-58.67321\\-139.1146\\9\\-60.8231\\-141.2645\\9\\-62.31267\\-143.0209\\9\\-64.1669\\-144.974\\9\\-65.8264\\-146.9271\\9\\-66.01269\\-148.8803\\9\\-66.04694\\-150.8334\\9\\-66.61589\\-152.7865\\9\\-67.71275\\-154.7396\\9\\-67.1216\\-156.6928\\9\\-65.93237\\-158.6459\\9\\-65.84605\\-160.599\\9\\-65.84605\\-166.4584\\9\\-65.47216\\-168.4115\\9\\-64.69179\\-170.3646\\9\\-64.30398\\-174.2709\\9\\-64.30398\\-176.224\\9\\-64.47026\\-180.1303\\9\\-64.48186\\-182.0834\\9\\-65.17324\\-184.0365\\9\\-65.04417\\-185.9896\\9\\-64.29466\\-187.9428\\9\\-64.97684\\-189.8959\\9\\-63.74307\\-193.8021\\9\\-64.72935\\-195.6209\\9\\-66.14899\\-197.7084\\9\\-66.68247\\-198.2051\\9\\-68.6356\\-198.8557\\9\\-70.58872\\-198.8965\\9\\-72.05357\\-199.6615\\9\\-72.54185\\-200.0905\\9\\-74.49497\\-201.0366\\9\\-75.28699\\-201.6146\\9\\-76.4481\\-202.7577\\9\\-77.03513\\-203.5678\\9\\-79.04356\\-205.5209\\9\\-80.35435\\-206.9628\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "401" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-219.4518\\9\\17.3019\\-218.269\\9\\15.34877\\-217.4266\\9\\13.39565\\-216.3543\\9\\11.44252\\-215.8085\\9\\9.489399\\-214.7558\\9\\7.880472\\-213.3334\\9\\5.583149\\-210.8403\\9\\4.947608\\-209.4271\\9\\4.900552\\-205.5209\\9\\3.95229\\-203.5678\\9\\3.630024\\-203.1748\\9\\2.967176\\-201.6146\\9\\1.676899\\-200.331\\9\\-0.276226\\-199.7836\\9\\-2.229351\\-198.6189\\9\\-3.181253\\-197.7084\\9\\-3.934333\\-195.7553\\9\\-3.127789\\-193.8021\\9\\-3.127789\\-184.0365\\9\\-4.182476\\-182.4855\\9\\-4.485547\\-180.1303\\9\\-4.574386\\-178.1771\\9\\-5.098585\\-176.224\\9\\-6.367447\\-172.3178\\9\\-6.449974\\-170.3646\\9\\-6.966408\\-168.4115\\9\\-8.088726\\-166.6491\\9\\-10.04185\\-165.3312\\9\\-11.49332\\-166.4584\\9\\-12.88338\\-168.4115\\9\\-13.9481\\-170.5143\\9\\-15.90123\\-171.1941\\9\\-17.85435\\-171.232\\9\\-29.5731\\-171.3111\\9\\-31.52623\\-172.3553\\9\\-33.47935\\-173.0266\\9\\-37.3856\\-173.0693\\9\\-41.29185\\-173.0442\\9\\-43.24498\\-172.6848\\9\\-45.1981\\-171.6353\\9\\-47.15123\\-170.8355\\9\\-49.10435\\-169.3019\\9\\-49.95953\\-168.4115\\9\\-51.4143\\-166.4584\\9\\-52.58335\\-164.5053\\9\\-53.0106\\-163.9794\\9\\-54.96373\\-163.2819\\9\\-55.69747\\-162.5521\\9\\-55.97411\\-160.599\\9\\-55.51304\\-158.6459\\9\\-53.84983\\-156.6928\\9\\-52.38963\\-154.7396\\9\\-51.2834\\-152.7865\\9\\-47.88365\\-148.8803\\9\\-47.15123\\-148.1765\\9\\-45.1981\\-147.3165\\9\\-43.24498\\-146.9937\\9\\-41.29185\\-146.243\\9\\-39.33873\\-145.7922\\9\\-37.3856\\-145.7409\\9\\-35.43248\\-145.085\\9\\-33.47935\\-143.647\\9\\-31.52623\\-142.9458\\9\\-30.31894\\-141.0678\\9\\-30.31148\\-139.1146\\9\\-29.5731\\-138.3008\\9\\-27.61998\\-137.8939\\9\\-25.66685\\-137.8633\\9\\-23.71373\\-136.6674\\9\\-21.7606\\-136.1382\\9\\-20.72381\\-137.1615\\9\\-20.74135\\-139.1146\\9\\-21.34466\\-141.0678\\9\\-21.7606\\-141.6859\\9\\-23.30856\\-143.0209\\9\\-21.7606\\-145.0979\\9\\-19.80748\\-145.7995\\9\\-17.85435\\-145.9358\\9\\-15.90123\\-146.4965\\9\\-13.9481\\-148.098\\9\\-13.14861\\-148.8803\\9\\-12.28794\\-150.8334\\9\\-11.62799\\-152.7865\\9\\-10.79806\\-154.7396\\9\\-9.711435\\-156.6928\\9\\-9.14881\\-158.6459\\9\\-7.924354\\-160.599\\9\\-6.135601\\-161.4432\\9\\-4.893168\\-162.5521\\9\\-3.546935\\-164.5053\\9\\-3.120012\\-166.4584\\9\\-2.46671\\-168.4115\\9\\-2.067761\\-170.3646\\9\\-2.067761\\-193.8021\\9\\-0.276226\\-195.7476\\9\\3.630024\\-195.7476\\9\\5.583149\\-195.6605\\9\\7.536274\\-195.1555\\9\\9.489399\\-194.4662\\9\\11.44252\\-193.9131\\9\\13.39565\\-192.8925\\9\\15.34877\\-191.3694\\9\\17.3019\\-190.6617\\9\\19.25502\\-189.8011\\9\\21.20815\\-189.4895\\9\\23.16127\\-189.4895\\9\\27.06752\\-190.0501\\9\\29.02065\\-190.7621\\9\\30.97377\\-192.35\\9\\32.9269\\-193.3582\\9\\34.88002\\-194.5346\\9\\36.83315\\-193.958\\9\\38.78627\\-193.1326\\9\\40.7394\\-193.0736\\9\\44.64565\\-193.1195\\9\\46.13219\\-193.8021\\9\\48.5519\\-196.0013\\9\\50.50502\\-196.7502\\9\\52.45815\\-197.2288\\9\\54.41127\\-198.5184\\9\\55.80938\\-199.6615\\9\\58.31752\\-202.3471\\9\\59.11653\\-203.5678\\9\\58.31752\\-204.7345\\9\\56.3644\\-204.4216\\9\\54.41127\\-205.0706\\9\\52.45815\\-203.2818\\9\\50.50502\\-202.5036\\9\\48.5519\\-202.611\\9\\47.43665\\-203.5678\\9\\47.35645\\-205.5209\\9\\46.59877\\-207.1897\\9\\44.34047\\-209.4271\\9\\40.7394\\-211.1063\\9\\40.4621\\-211.3803\\9\\36.83315\\-212.929\\9\\36.42459\\-213.3334\\9\\34.88002\\-214.2914\\9\\33.05181\\-215.2865\\9\\30.97377\\-216.6318\\9\\29.02065\\-218.5484\\9\\27.06752\\-219.681\\9\\21.20815\\-219.6896\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "402" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-208.741\\9\\73.94253\\-207.8181\\9\\73.62833\\-207.474\\9\\71.9894\\-206.4715\\9\\70.99101\\-205.5209\\9\\71.9894\\-204.2444\\9\\73.94253\\-203.7042\\9\\75.89565\\-204.5341\\9\\78.55679\\-207.474\\9\\77.85884\\-209.4271\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002297" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "130" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "403" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-212.1512\\9\\84.98519\\-211.3803\\9\\84.61135\\-207.474\\9\\81.75503\\-204.7387\\9\\80.19128\\-203.5678\\9\\77.84878\\-201.0527\\9\\75.89565\\-200.6426\\9\\73.94253\\-200.0244\\9\\71.9894\\-198.5004\\9\\68.08315\\-196.1475\\9\\67.69093\\-195.7553\\9\\66.90614\\-193.8021\\9\\66.87\\-191.849\\9\\65.70863\\-189.8959\\9\\65.00914\\-187.9428\\9\\64.91552\\-185.9896\\9\\64.46987\\-184.0365\\9\\63.24787\\-182.0834\\9\\62.9598\\-178.1771\\9\\63.28798\\-174.2709\\9\\63.02322\\-172.3178\\9\\61.81738\\-170.3646\\9\\61.83683\\-166.4584\\9\\62.81439\\-164.5053\\9\\64.1769\\-163.5073\\9\\65.23405\\-162.5521\\9\\65.56036\\-160.599\\9\\65.32447\\-158.6459\\9\\64.1769\\-157.3818\\9\\62.22377\\-155.6831\\9\\61.42477\\-154.7396\\9\\60.17299\\-152.7865\\9\\59.52069\\-150.8334\\9\\59.45595\\-148.8803\\9\\58.31752\\-147.2318\\9\\56.0904\\-144.974\\9\\55.30812\\-143.0209\\9\\54.41127\\-142.2408\\9\\52.45815\\-141.8816\\9\\50.50502\\-141.2996\\9\\48.5519\\-140.866\\9\\46.59877\\-141.8583\\9\\44.64565\\-141.7346\\9\\42.69252\\-139.9935\\9\\40.7394\\-137.7251\\9\\38.78627\\-137.8819\\9\\34.88002\\-138.0898\\9\\32.9269\\-138.0029\\9\\30.97377\\-137.804\\9\\27.60607\\-135.2084\\9\\27.06752\\-134.6271\\9\\25.1144\\-133.5027\\9\\23.16127\\-131.8641\\9\\21.99167\\-131.3021\\9\\22.10798\\-129.349\\9\\23.16127\\-128.5343\\9\\25.1144\\-127.7903\\9\\27.06752\\-127.5703\\9\\29.02065\\-126.6257\\9\\30.97377\\-126.3093\\9\\34.85783\\-127.3959\\9\\36.83315\\-127.2605\\9\\38.78627\\-126.4809\\9\\40.7394\\-125.8867\\9\\42.39956\\-127.3959\\9\\42.69252\\-127.8585\\9\\43.34842\\-127.3959\\9\\44.22186\\-125.4428\\9\\44.22971\\-123.4896\\9\\44.35268\\-121.5365\\9\\44.82129\\-119.5834\\9\\46.01826\\-117.6303\\9\\46.77829\\-115.6771\\9\\46.4767\\-113.724\\9\\46.51801\\-109.8178\\9\\47.97943\\-107.8646\\9\\48.5519\\-107.5391\\9\\50.50502\\-107.6289\\9\\52.45815\\-108.9115\\9\\54.95647\\-111.7709\\9\\56.5882\\-113.724\\9\\57.52672\\-115.6771\\9\\59.0997\\-117.6303\\9\\60.50637\\-119.5834\\9\\61.18586\\-121.5365\\9\\62.39816\\-123.4896\\9\\62.95248\\-125.4428\\9\\63.01364\\-127.3959\\9\\63.40923\\-129.349\\9\\64.1769\\-131.3268\\9\\63.12899\\-133.2553\\9\\63.91991\\-135.2084\\9\\64.92694\\-137.1615\\9\\64.93475\\-139.1146\\9\\65.46495\\-141.0678\\9\\66.13003\\-141.7956\\9\\66.83209\\-143.0209\\9\\67.38811\\-144.974\\9\\68.08315\\-145.6391\\9\\70.03628\\-147.9319\\9\\70.59039\\-148.8803\\9\\71.30976\\-150.8334\\9\\72.60369\\-152.7865\\9\\73.3438\\-154.7396\\9\\75.20347\\-156.6928\\9\\79.8019\\-161.3752\\9\\80.82186\\-162.5521\\9\\83.70815\\-165.6338\\9\\85.66128\\-167.6076\\9\\87.6144\\-168.6262\\9\\89.01507\\-170.3646\\9\\90.36505\\-172.3178\\9\\92.31172\\-174.2709\\9\\93.47378\\-176.9001\\9\\94.80545\\-180.1303\\9\\95.22746\\-182.0834\\9\\96.52617\\-185.9896\\9\\96.49952\\-191.849\\9\\96.38821\\-193.8021\\9\\95.4269\\-195.5768\\9\\93.47378\\-198.4803\\9\\92.82444\\-199.6615\\9\\92.84525\\-201.6146\\9\\93.18081\\-203.5678\\9\\93.18081\\-205.5209\\9\\92.59714\\-207.474\\9\\92.16998\\-209.4271\\9\\91.52065\\-210.2485\\9\\89.56753\\-211.6277\\9\\87.6144\\-212.4301\\9" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "404" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-215.4609\\11\\-89.73811\\-213.3334\\11\\-88.93459\\-211.3803\\11\\-88.16685\\-210.7378\\11\\-84.97777\\-209.4271\\11\\-83.98716\\-207.474\\11\\-86.21372\\-205.8659\\11\\-88.16685\\-204.8413\\11\\-90.11997\\-204.5914\\11\\-92.0731\\-203.9863\\11\\-94.02622\\-202.2603\\11\\-96.50832\\-199.6615\\11\\-97.3269\\-197.7084\\11\\-97.85171\\-195.7553\\11\\-97.21999\\-191.849\\11\\-98.12217\\-189.8959\\11\\-98.64404\\-187.9428\\11\\-97.10126\\-184.0365\\11\\-96.62868\\-182.0834\\11\\-94.02622\\-176.2345\\11\\-92.8913\\-174.2709\\11\\-90.92139\\-170.3646\\11\\-87.07132\\-166.4584\\11\\-85.63642\\-164.5053\\11\\-85.04087\\-162.5521\\11\\-83.28403\\-160.599\\11\\-81.42473\\-158.6459\\11\\-80.35435\\-157.2124\\11\\-79.82538\\-156.6928\\11\\-78.84512\\-154.7396\\11\\-77.443\\-152.7865\\11\\-77.1307\\-150.8334\\11\\-76.69559\\-148.8803\\11\\-75.48679\\-146.9271\\11\\-74.56156\\-143.0209\\11\\-73.44824\\-141.0678\\11\\-73.14159\\-139.1146\\11\\-73.10378\\-137.1615\\11\\-72.25989\\-133.2553\\11\\-71.63853\\-131.3021\\11\\-71.25157\\-129.349\\11\\-70.66949\\-127.3959\\11\\-69.72794\\-125.4428\\11\\-69.34361\\-123.4896\\11\\-68.6356\\-121.6265\\11\\-67.68321\\-119.5834\\11\\-65.65255\\-115.6771\\11\\-64.72935\\-114.6715\\11\\-60.8231\\-110.9007\\11\\-58.86998\\-109.5703\\11\\-56.91685\\-109.6183\\11\\-55.12368\\-111.7709\\11\\-54.62947\\-113.724\\11\\-54.5769\\-115.6771\\11\\-54.1465\\-117.6303\\11\\-53.36742\\-119.5834\\11\\-53.0106\\-120.743\\11\\-51.96033\\-119.5834\\11\\-51.05748\\-119.0575\\11\\-50.37746\\-117.6303\\11\\-49.10435\\-116.5199\\11\\-47.15123\\-116.8308\\11\\-45.1981\\-118.7352\\11\\-43.24498\\-120.2286\\11\\-41.29185\\-120.8162\\11\\-37.3856\\-120.894\\11\\-35.43248\\-122.1634\\11\\-32.58228\\-123.4896\\11\\-31.52623\\-124.3005\\11\\-30.78675\\-125.4428\\11\\-30.56243\\-127.3959\\11\\-29.5731\\-128.8655\\11\\-27.77671\\-131.3021\\11\\-28.42869\\-133.2553\\11\\-29.5731\\-133.7046\\11\\-33.47935\\-136.5131\\11\\-34.19198\\-137.1615\\11\\-33.47935\\-138.0213\\11\\-31.52623\\-138.2097\\11\\-29.5731\\-137.7363\\11\\-27.61998\\-137.6498\\11\\-25.66685\\-137.783\\11\\-23.71373\\-137.8109\\11\\-21.7606\\-137.6997\\11\\-20.22342\\-139.1146\\11\\-20.87008\\-141.0678\\11\\-21.7606\\-142.0213\\11\\-23.48348\\-143.0209\\11\\-23.71373\\-143.2856\\11\\-25.66685\\-143.4595\\11\\-27.61998\\-143.4595\\11\\-31.52623\\-143.6303\\11\\-33.47935\\-142.2492\\11\\-35.43248\\-142.2345\\11\\-37.3856\\-142.9401\\11\\-39.33873\\-142.8988\\11\\-41.29185\\-142.2332\\11\\-45.1981\\-143.9544\\11\\-47.1024\\-143.0209\\11\\-48.05736\\-141.0678\\11\\-49.10435\\-140.0868\\11\\-51.05748\\-139.951\\11\\-53.0106\\-140.757\\11\\-54.96373\\-141.1945\\11\\-56.91685\\-139.9866\\11\\-58.24131\\-141.0678\\11\\-60.01615\\-143.0209\\11\\-60.56044\\-144.974\\11\\-62.11594\\-146.9271\\11\\-62.77623\\-148.715\\11\\-63.97474\\-150.8334\\11\\-64.22404\\-152.7865\\11\\-65.35347\\-154.7396\\11\\-65.50719\\-156.6928\\11\\-64.72172\\-158.6459\\11\\-64.72172\\-166.4584\\11\\-64.51765\\-170.3646\\11\\-64.50555\\-176.224\\11\\-65.26254\\-178.1771\\11\\-65.61507\\-180.1303\\11\\-65.61507\\-182.0834\\11\\-65.87681\\-184.0365\\11\\-65.87854\\-185.9896\\11\\-65.63986\\-187.9428\\11\\-66.2477\\-189.8959\\11\\-67.36064\\-191.849\\11\\-67.3735\\-193.8021\\11\\-67.74988\\-195.7553\\11\\-68.6356\\-196.5893\\11\\-70.58872\\-196.8594\\11\\-72.54185\\-196.9646\\11\\-73.80848\\-197.7084\\11\\-74.49497\\-198.4232\\11\\-75.20996\\-199.6615\\11\\-77.41924\\-201.6146\\11\\-78.96316\\-203.5678\\11\\-79.48978\\-205.5209\\11\\-80.35435\\-206.4314\\11\\-82.30747\\-208.1301\\11\\-83.95663\\-209.4271\\11\\-82.97111\\-211.3803\\11\\-83.12363\\-213.3334\\11\\-84.2606\\-215.0388\\11\\-86.21372\\-216.0069\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "132" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "405" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "17.3019\\-219.4967\\11\\15.34877\\-218.3028\\11\\11.44252\\-216.8875\\11\\7.536274\\-215.9008\\11\\6.252478\\-215.2865\\11\\5.583149\\-214.7298\\11\\3.141743\\-211.3803\\11\\2.934593\\-209.4271\\11\\2.928273\\-207.474\\11\\2.594985\\-205.5209\\11\\1.124444\\-203.5678\\11\\0.918452\\-201.6146\\11\\-0.276226\\-200.3628\\11\\-3.181253\\-197.7084\\11\\-3.934333\\-195.7553\\11\\-3.127789\\-193.8021\\11\\-3.127789\\-184.0365\\11\\-3.726747\\-182.0834\\11\\-4.182476\\-181.9843\\11\\-4.845324\\-180.1303\\11\\-5.101333\\-178.1771\\11\\-5.192569\\-176.224\\11\\-5.597382\\-174.2709\\11\\-6.858785\\-170.3646\\11\\-8.088726\\-168.8062\\11\\-10.04185\\-167.6463\\11\\-10.76396\\-168.4115\\11\\-11.19699\\-170.3646\\11\\-11.82059\\-172.3178\\11\\-13.9481\\-174.4703\\11\\-15.90123\\-175.0405\\11\\-17.85435\\-175.103\\11\\-21.7606\\-175.103\\11\\-23.71373\\-175.1593\\11\\-27.61998\\-175.4071\\11\\-31.52623\\-175.2407\\11\\-35.43248\\-175.1827\\11\\-37.3856\\-175.076\\11\\-41.29185\\-175.0021\\11\\-43.24498\\-174.0196\\11\\-45.1981\\-173.2025\\11\\-46.5728\\-172.3178\\11\\-49.10435\\-170.0369\\11\\-51.05748\\-167.676\\11\\-53.0106\\-165.7146\\11\\-54.96373\\-165.9658\\11\\-55.7688\\-164.5053\\11\\-55.84177\\-162.5521\\11\\-55.51618\\-160.599\\11\\-54.96373\\-159.8553\\11\\-51.69197\\-154.7396\\11\\-50.05317\\-152.7865\\11\\-47.83761\\-148.8803\\11\\-47.15123\\-148.2016\\11\\-45.1981\\-147.2737\\11\\-41.29185\\-147.0079\\11\\-39.33873\\-146.7897\\11\\-35.43248\\-146.9647\\11\\-31.52623\\-146.7792\\11\\-29.5731\\-147.3716\\11\\-27.61998\\-147.6281\\11\\-23.71373\\-147.6507\\11\\-21.7606\\-147.512\\11\\-19.80748\\-147.5447\\11\\-17.85435\\-147.7784\\11\\-15.90123\\-147.8988\\11\\-13.9481\\-148.975\\11\\-12.67106\\-150.8334\\11\\-11.53301\\-152.7865\\11\\-10.75605\\-154.7396\\11\\-10.20344\\-156.6928\\11\\-9.918877\\-158.6459\\11\\-9.283515\\-160.599\\11\\-8.088726\\-162.2964\\11\\-6.135601\\-163.4776\\11\\-5.153613\\-164.5053\\11\\-2.98999\\-168.4115\\11\\-2.39094\\-170.3646\\11\\-2.067761\\-174.2709\\11\\-2.067761\\-193.8021\\11\\-0.276226\\-195.7476\\11\\3.630024\\-195.5558\\11\\5.583149\\-195.0991\\11\\7.536274\\-194.4476\\11\\9.489399\\-193.272\\11\\11.44252\\-192.9374\\11\\13.39565\\-192.4947\\11\\15.34877\\-190.9173\\11\\17.3019\\-189.8437\\11\\19.25502\\-189.2816\\11\\21.20815\\-189.0851\\11\\23.16127\\-189.0696\\11\\25.1144\\-189.2744\\11\\27.06752\\-189.6484\\11\\29.02065\\-189.8732\\11\\30.97377\\-191.0556\\11\\32.9269\\-192.5933\\11\\34.88002\\-192.9357\\11\\36.8712\\-191.849\\11\\38.78627\\-191.081\\11\\40.7394\\-189.8437\\11\\42.69252\\-189.8293\\11\\44.64565\\-190.9372\\11\\46.59877\\-191.1258\\11\\48.4315\\-191.849\\11\\50.76396\\-193.8021\\11\\52.35939\\-195.7553\\11\\56.3644\\-198.4839\\11\\58.31752\\-200.262\\11\\60.90619\\-203.5678\\11\\60.27065\\-204.4777\\11\\59.23535\\-205.5209\\11\\58.31752\\-206.1668\\11\\57.59946\\-205.5209\\11\\56.3644\\-204.0423\\11\\54.41127\\-202.7896\\11\\52.22418\\-203.5678\\11\\50.50502\\-206.7721\\11\\48.5519\\-209.0831\\11\\46.23668\\-211.3803\\11\\43.72949\\-213.3334\\11\\42.69252\\-213.8985\\11\\40.7394\\-214.2021\\11\\38.55117\\-215.2865\\11\\36.83315\\-215.8167\\11\\34.88002\\-215.9883\\11\\32.9269\\-216.7547\\11\\30.28882\\-219.1928\\11\\29.02065\\-220.139\\11\\27.06752\\-220.6021\\11\\21.20815\\-220.6021\\11\\19.25502\\-220.2104\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "406" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "73.94253\\-206.3512\\11\\71.9894\\-204.7855\\11\\70.70183\\-203.5678\\11\\71.9894\\-202.567\\11\\73.94253\\-202.8184\\11\\75.89565\\-203.9512\\11\\76.8251\\-205.5209\\11\\75.89565\\-206.6664\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002296" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "125" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "407" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "87.6144\\-213.5691\\11\\85.66128\\-212.1205\\11\\85.03983\\-211.3803\\11\\84.95953\\-209.4271\\11\\84.65392\\-207.474\\11\\80.67241\\-203.5678\\11\\78.91703\\-201.6146\\11\\77.84878\\-200.2272\\11\\75.89565\\-198.617\\11\\73.94253\\-197.3829\\11\\71.9894\\-196.7372\\11\\70.87246\\-195.7553\\11\\69.3879\\-193.8021\\11\\68.23176\\-189.8959\\11\\67.04948\\-187.9428\\11\\66.37751\\-185.9896\\11\\65.2443\\-184.0365\\11\\64.98492\\-182.0834\\11\\64.51518\\-180.1303\\11\\63.29355\\-178.1771\\11\\63.21235\\-176.224\\11\\63.24436\\-174.2709\\11\\63.03911\\-172.3178\\11\\62.08834\\-170.3646\\11\\61.86695\\-166.4584\\11\\64.1769\\-164.2347\\11\\65.46053\\-162.5521\\11\\65.314\\-160.599\\11\\64.1769\\-159.0426\\11\\61.70949\\-156.6928\\11\\59.92952\\-154.7396\\11\\58.95893\\-152.7865\\11\\56.3644\\-148.9517\\11\\52.37221\\-144.974\\11\\50.50502\\-143.2949\\11\\48.5519\\-142.4374\\11\\46.59877\\-143.6874\\11\\44.64565\\-142.4316\\11\\42.69252\\-140.484\\11\\40.7394\\-139.9402\\11\\38.78627\\-139.7743\\11\\36.83315\\-139.9094\\11\\34.88002\\-140.2096\\11\\32.9269\\-139.8208\\11\\30.97377\\-138.5657\\11\\29.02065\\-137.409\\11\\27.06752\\-135.9348\\11\\25.1144\\-135.4559\\11\\23.16127\\-134.4065\\11\\22.30825\\-133.2553\\11\\20.16333\\-131.3021\\11\\21.02596\\-129.349\\11\\23.16127\\-128.2673\\11\\25.1144\\-127.8667\\11\\27.06752\\-128.1649\\11\\29.1268\\-127.3959\\11\\30.97377\\-126.8902\\11\\32.9269\\-127.6777\\11\\34.88002\\-127.1484\\11\\36.83315\\-126.7534\\11\\40.7394\\-125.8297\\11\\42.08547\\-127.3959\\11\\42.69252\\-128.5419\\11\\43.91323\\-127.3959\\11\\44.35803\\-125.4428\\11\\44.51021\\-123.4896\\11\\45.3913\\-121.5365\\11\\45.57636\\-119.5834\\11\\46.77316\\-117.6303\\11\\47.50624\\-115.6771\\11\\47.46832\\-113.724\\11\\45.82586\\-109.8178\\11\\45.28569\\-107.8646\\11\\46.11049\\-105.9115\\11\\46.59877\\-105.5445\\11\\48.5519\\-105.4956\\11\\50.50502\\-106.1792\\11\\52.45815\\-107.3701\\11\\54.59827\\-109.8178\\11\\55.71907\\-111.7709\\11\\58.31752\\-114.6295\\11\\60.57461\\-117.6303\\11\\61.35305\\-119.5834\\11\\62.99245\\-121.5365\\11\\63.19605\\-123.4896\\11\\64.21446\\-125.4428\\11\\64.89133\\-127.3959\\11\\65.10439\\-129.349\\11\\65.47327\\-131.3021\\11\\65.98781\\-133.2553\\11\\66.76855\\-135.2084\\11\\67.01118\\-139.1146\\11\\68.08315\\-141.1776\\11\\68.9455\\-143.0209\\11\\72.04158\\-148.8803\\11\\72.98171\\-150.8334\\11\\74.09113\\-152.7865\\11\\74.93484\\-154.7396\\11\\76.54481\\-156.6928\\11\\80.45811\\-160.599\\11\\82.01411\\-162.5521\\11\\82.82481\\-164.5053\\11\\85.66128\\-167.5655\\11\\87.707\\-168.4115\\11\\89.56753\\-171.0695\\11\\90.36505\\-172.3178\\11\\92.31172\\-174.2709\\11\\93.18081\\-176.224\\11\\93.32516\\-178.1771\\11\\94.36733\\-180.1303\\11\\94.73785\\-182.0834\\11\\94.79837\\-184.0365\\11\\95.40419\\-185.9896\\11\\94.80545\\-187.9428\\11\\94.83655\\-189.8959\\11\\94.24107\\-193.8021\\11\\94.07971\\-195.7553\\11\\93.29939\\-197.7084\\11\\92.71788\\-199.6615\\11\\92.74136\\-201.6146\\11\\93.18081\\-203.5678\\11\\93.18081\\-205.5209\\11\\92.93317\\-209.4271\\11\\91.65453\\-211.3803\\11\\89.56753\\-212.5843\\11" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "160" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "408" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-88.16685\\-216.3311\\13\\-89.53915\\-215.2865\\13\\-90.59082\\-213.3334\\13\\-89.05895\\-211.3803\\13\\-87.0754\\-209.4271\\13\\-86.32387\\-207.474\\13\\-88.16685\\-205.9128\\13\\-90.11997\\-204.9747\\13\\-92.0731\\-204.5399\\13\\-93.1522\\-203.5678\\13\\-94.85468\\-201.6146\\13\\-96.00206\\-199.6615\\13\\-96.91049\\-197.7084\\13\\-97.61766\\-195.7553\\13\\-97.15976\\-193.8021\\13\\-96.88828\\-191.849\\13\\-97.17786\\-189.8959\\13\\-97.83774\\-187.9428\\13\\-97.60696\\-185.9896\\13\\-96.87308\\-184.0365\\13\\-95.97172\\-182.0834\\13\\-95.75555\\-180.1303\\13\\-94.02622\\-176.3165\\13\\-91.8614\\-172.3178\\13\\-90.92139\\-170.3646\\13\\-88.16685\\-167.5872\\13\\-87.13763\\-166.4584\\13\\-85.78835\\-164.5053\\13\\-85.21065\\-162.5521\\13\\-83.4204\\-160.599\\13\\-82.67682\\-158.6459\\13\\-82.30747\\-158.2159\\13\\-80.35435\\-155.2547\\13\\-79.87233\\-154.7396\\13\\-79.1455\\-152.7865\\13\\-78.67176\\-150.8334\\13\\-77.443\\-148.8803\\13\\-77.1623\\-146.9271\\13\\-76.70719\\-144.974\\13\\-75.49985\\-143.0209\\13\\-75.19672\\-141.0678\\13\\-74.76551\\-139.1146\\13\\-74.10563\\-137.1615\\13\\-73.55544\\-135.2084\\13\\-73.30915\\-133.2553\\13\\-72.87794\\-131.3021\\13\\-72.14493\\-129.349\\13\\-71.61246\\-127.3959\\13\\-71.28416\\-125.4428\\13\\-70.64091\\-123.4896\\13\\-68.71637\\-119.5834\\13\\-66.73466\\-115.6771\\13\\-65.64188\\-113.724\\13\\-64.72935\\-112.8262\\13\\-63.33723\\-111.7709\\13\\-60.8231\\-109.4795\\13\\-58.86998\\-108.672\\13\\-56.91685\\-108.9622\\13\\-55.92995\\-109.8178\\13\\-55.25669\\-111.7709\\13\\-55.22281\\-115.6771\\13\\-54.94084\\-117.6303\\13\\-54.15158\\-119.5834\\13\\-53.81084\\-121.5365\\13\\-53.63205\\-123.4896\\13\\-53.13267\\-125.4428\\13\\-52.94611\\-127.3959\\13\\-52.92065\\-129.349\\13\\-51.05748\\-131.2888\\13\\-50.33502\\-129.349\\13\\-50.09035\\-127.3959\\13\\-49.36244\\-123.4896\\13\\-50.27523\\-121.5365\\13\\-50.83368\\-119.5834\\13\\-49.44373\\-117.6303\\13\\-49.10435\\-117.3091\\13\\-47.15123\\-117.1449\\13\\-45.1981\\-118.4603\\13\\-43.24498\\-118.7099\\13\\-41.29185\\-119.3596\\13\\-39.33873\\-120.2432\\13\\-37.54358\\-119.5834\\13\\-37.23214\\-119.5834\\13\\-35.43248\\-120.3288\\13\\-29.72682\\-123.4896\\13\\-27.61998\\-124.8857\\13\\-25.66685\\-125.0789\\13\\-24.07645\\-125.4428\\13\\-21.7606\\-126.6311\\13\\-19.80748\\-126.6311\\13\\-17.85435\\-126.9113\\13\\-17.22587\\-127.3959\\13\\-15.90123\\-129.3881\\13\\-17.85435\\-130.0786\\13\\-19.80748\\-130.5697\\13\\-20.65383\\-131.3021\\13\\-21.7606\\-131.7006\\13\\-24.26936\\-133.2553\\13\\-27.61998\\-134.4987\\13\\-28.70815\\-135.2084\\13\\-27.61998\\-135.9701\\13\\-25.66685\\-137.6054\\13\\-23.71373\\-138.1339\\13\\-21.7606\\-138.4294\\13\\-21.07158\\-139.1146\\13\\-21.39126\\-141.0678\\13\\-21.7606\\-141.4468\\13\\-23.71373\\-142.3994\\13\\-25.66685\\-143.1156\\13\\-27.61998\\-143.2914\\13\\-29.5731\\-143.8454\\13\\-31.52623\\-144.0401\\13\\-33.47935\\-143.7242\\13\\-35.43248\\-142.3648\\13\\-37.3856\\-142.1946\\13\\-39.33873\\-142.2206\\13\\-41.29185\\-142.524\\13\\-43.24498\\-144.0813\\13\\-45.1981\\-144.9663\\13\\-47.15123\\-144.2375\\13\\-48.35439\\-143.0209\\13\\-49.10435\\-141.8089\\13\\-50.04762\\-141.0678\\13\\-51.05748\\-140.5481\\13\\-53.0106\\-142.4204\\13\\-54.96373\\-143.3716\\13\\-56.91685\\-143.4921\\13\\-58.17825\\-144.974\\13\\-59.52766\\-146.9271\\13\\-61.98277\\-150.8334\\13\\-62.66772\\-152.7865\\13\\-63.85582\\-154.7396\\13\\-64.04031\\-156.6928\\13\\-64.32295\\-162.5521\\13\\-64.41454\\-166.4584\\13\\-65.24303\\-168.4115\\13\\-65.61507\\-170.3646\\13\\-65.66743\\-176.224\\13\\-66.36374\\-178.1771\\13\\-66.95301\\-180.1303\\13\\-66.97741\\-182.0834\\13\\-67.51588\\-184.0365\\13\\-67.46042\\-187.9428\\13\\-68.2405\\-189.8959\\13\\-68.6356\\-190.4407\\13\\-70.41212\\-193.8021\\13\\-72.54185\\-194.8723\\13\\-74.49497\\-195.9913\\13\\-76.4481\\-198.1486\\13\\-77.46783\\-199.6615\\13\\-79.05735\\-201.6146\\13\\-79.49187\\-203.5678\\13\\-81.07314\\-205.5209\\13\\-81.50352\\-207.474\\13\\-82.53339\\-209.4271\\13\\-83.10648\\-211.3803\\13\\-83.42419\\-213.3334\\13\\-83.87366\\-215.2865\\13\\-84.2606\\-215.7167\\13\\-86.21372\\-216.7396\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "409" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "9.489399\\-131.584\\13\\7.536274\\-130.3194\\13\\5.583149\\-129.7434\\13\\5.196209\\-129.349\\13\\5.583149\\-128.4168\\13\\6.469765\\-127.3959\\13\\7.536274\\-126.9163\\13\\8.933768\\-127.3959\\13\\9.489399\\-127.7351\\13\\11.33663\\-129.349\\13\\11.64196\\-131.3021\\13\\11.44252\\-131.5016\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "148" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "410" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "17.3019\\-219.9909\\13\\15.34877\\-218.844\\13\\13.39565\\-218.3167\\13\\11.44252\\-217.9955\\13\\7.536274\\-217.8245\\13\\5.583149\\-216.8744\\13\\3.630024\\-214.9182\\13\\2.808824\\-213.3334\\13\\2.011525\\-211.3803\\13\\0.9145823\\-209.4271\\13\\0.7895203\\-205.5209\\13\\0.4536789\\-203.5678\\13\\-0.8742334\\-201.6146\\13\\-1.418709\\-199.6615\\13\\-3.186284\\-197.7084\\13\\-3.945965\\-195.7553\\13\\-3.469849\\-193.8021\\13\\-3.127789\\-191.849\\13\\-3.127789\\-187.9428\\13\\-3.726747\\-185.9896\\13\\-4.182476\\-185.3682\\13\\-4.290983\\-184.0365\\13\\-4.890484\\-182.0834\\13\\-5.797315\\-178.1771\\13\\-5.923899\\-176.224\\13\\-7.711942\\-172.3178\\13\\-8.088726\\-171.8486\\13\\-10.04185\\-173.7493\\13\\-11.88054\\-176.224\\13\\-13.9481\\-178.4352\\13\\-15.90123\\-178.9937\\13\\-17.85435\\-179.2359\\13\\-19.80748\\-179.0296\\13\\-21.7606\\-179.0084\\13\\-23.71373\\-180.342\\13\\-25.66685\\-180.6185\\13\\-29.5731\\-180.6185\\13\\-31.52623\\-180.2657\\13\\-33.47935\\-179.0016\\13\\-35.43248\\-178.8677\\13\\-37.3856\\-178.2992\\13\\-39.33873\\-177.0975\\13\\-41.29185\\-176.9846\\13\\-43.24498\\-175.8467\\13\\-45.1981\\-175.0511\\13\\-46.22085\\-174.2709\\13\\-48.05844\\-172.3178\\13\\-49.99673\\-170.3646\\13\\-51.69774\\-168.4115\\13\\-53.0106\\-167.4103\\13\\-54.96373\\-167.2947\\13\\-55.74033\\-166.4584\\13\\-55.54424\\-164.5053\\13\\-54.29364\\-162.5521\\13\\-53.98716\\-160.599\\13\\-53.01841\\-158.6459\\13\\-51.73707\\-156.6928\\13\\-51.05748\\-154.877\\13\\-49.8651\\-152.7865\\13\\-47.15123\\-149.2696\\13\\-45.1981\\-147.7989\\13\\-43.24498\\-147.371\\13\\-39.33873\\-147.3525\\13\\-37.3856\\-147.7822\\13\\-35.43248\\-147.9691\\13\\-31.52623\\-148.016\\13\\-29.5731\\-148.371\\13\\-27.61998\\-149.0023\\13\\-23.71373\\-149.0023\\13\\-21.7606\\-148.5012\\13\\-19.80748\\-148.395\\13\\-15.90123\\-149.5295\\13\\-13.9481\\-150.7258\\13\\-11.4195\\-154.7396\\13\\-10.71135\\-156.6928\\13\\-10.21624\\-158.6459\\13\\-9.933344\\-160.599\\13\\-8.99727\\-162.5521\\13\\-7.259236\\-164.5053\\13\\-6.189427\\-166.4584\\13\\-4.182476\\-168.5092\\13\\-3.22873\\-170.3646\\13\\-2.999805\\-172.3178\\13\\-2.403737\\-174.2709\\13\\-2.403737\\-176.224\\13\\-2.067761\\-180.1303\\13\\-2.067761\\-191.849\\13\\-1.925388\\-193.8021\\13\\-0.276226\\-195.5195\\13\\1.676899\\-195.0535\\13\\3.630024\\-194.7545\\13\\5.583149\\-193.9599\\13\\7.536274\\-192.9644\\13\\9.489399\\-192.5722\\13\\11.44252\\-191.9592\\13\\13.39565\\-191.6252\\13\\15.34877\\-190.8123\\13\\17.3019\\-189.6368\\13\\21.20815\\-188.7324\\13\\23.16127\\-188.1713\\13\\25.1144\\-189.0231\\13\\27.06752\\-189.6368\\13\\29.02065\\-189.6602\\13\\30.97377\\-190.6141\\13\\32.9269\\-191.3189\\13\\34.88002\\-191.2784\\13\\36.86761\\-189.8959\\13\\38.78627\\-189.0638\\13\\40.7394\\-187.9052\\13\\42.69252\\-187.3003\\13\\44.64565\\-187.3965\\13\\46.59877\\-187.9052\\13\\48.5519\\-188.9779\\13\\50.50502\\-189.3183\\13\\51.64631\\-189.8959\\13\\53.73674\\-191.849\\13\\54.41127\\-192.6879\\13\\54.91659\\-193.8021\\13\\55.17438\\-195.7553\\13\\56.3644\\-197.0363\\13\\58.31752\\-198.8282\\13\\60.91999\\-201.6146\\13\\61.34531\\-203.5678\\13\\60.97594\\-205.5209\\13\\60.27065\\-206.2407\\13\\58.31752\\-206.734\\13\\57.24286\\-205.5209\\13\\57.46904\\-203.5678\\13\\56.3644\\-202.567\\13\\54.41127\\-202.7669\\13\\53.57035\\-203.5678\\13\\53.12765\\-205.5209\\13\\52.45815\\-206.7579\\13\\50.50502\\-209.5636\\13\\49.42894\\-211.3803\\13\\48.5519\\-212.2409\\13\\46.59877\\-213.3856\\13\\42.69252\\-215.3673\\13\\40.7394\\-215.9883\\13\\38.78627\\-216.2966\\13\\36.83315\\-216.7335\\13\\34.88002\\-217.2918\\13\\32.9269\\-218.2212\\13\\30.97377\\-219.7959\\13\\29.02065\\-220.7344\\13\\27.06752\\-220.8754\\13\\21.20815\\-220.8754\\13\\19.25502\\-220.7274\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002295" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "136" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "411" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "87.6144\\-214.1497\\13\\86.72513\\-213.3334\\13\\85.09934\\-211.3803\\13\\84.86104\\-209.4271\\13\\84.43317\\-207.474\\13\\82.71524\\-205.5209\\13\\80.73618\\-203.5678\\13\\79.49591\\-201.6146\\13\\78.60432\\-199.6615\\13\\77.84878\\-198.864\\13\\75.89565\\-197.1773\\13\\73.94253\\-196.1445\\13\\73.48249\\-195.7553\\13\\71.8063\\-193.8021\\13\\70.81194\\-191.849\\13\\69.63052\\-189.8959\\13\\68.9047\\-187.9428\\13\\67.68851\\-185.9896\\13\\66.96781\\-184.0365\\13\\66.87486\\-182.0834\\13\\66.13003\\-180.1727\\13\\65.01755\\-178.1771\\13\\64.50893\\-176.224\\13\\63.36609\\-174.2709\\13\\63.14466\\-170.3646\\13\\62.90025\\-168.4115\\13\\61.99998\\-166.4584\\13\\63.84506\\-164.5053\\13\\64.1769\\-164.2646\\13\\65.28219\\-162.5521\\13\\64.1769\\-161.0511\\13\\57.96924\\-154.7396\\13\\57.31605\\-152.7865\\13\\56.3644\\-151.2943\\13\\52.32845\\-146.9271\\13\\50.1257\\-144.974\\13\\48.5519\\-144.0496\\13\\46.59877\\-144.3837\\13\\44.64565\\-143.8733\\13\\43.89712\\-143.0209\\13\\40.7394\\-140.2002\\13\\38.78627\\-139.9659\\13\\36.83315\\-140.1748\\13\\34.88002\\-141.3496\\13\\32.9269\\-140.422\\13\\30.97377\\-139.9025\\13\\29.02065\\-138.1381\\13\\27.06752\\-136.2561\\13\\25.1144\\-135.8509\\13\\23.16127\\-135.6051\\13\\22.75437\\-135.2084\\13\\20.15997\\-133.2553\\13\\19.90778\\-131.3021\\13\\21.20815\\-130.0286\\13\\23.16127\\-128.8096\\13\\25.1144\\-128.2166\\13\\27.06752\\-128.2635\\13\\29.02065\\-128.0984\\13\\30.97377\\-127.6664\\13\\32.9269\\-127.7107\\13\\34.88002\\-126.6301\\13\\36.83315\\-126.0081\\13\\38.78627\\-125.1172\\13\\40.7394\\-125.0081\\13\\41.18219\\-125.4428\\13\\41.74892\\-127.3959\\13\\42.47782\\-129.349\\13\\42.97545\\-129.349\\13\\44.64565\\-127.0161\\13\\45.36444\\-125.4428\\13\\45.59521\\-123.4896\\13\\46.62221\\-121.5365\\13\\47.40599\\-119.5834\\13\\48.5519\\-117.2006\\13\\49.16619\\-115.6771\\13\\48.5519\\-114.2489\\13\\47.12874\\-111.7709\\13\\44.64565\\-108.885\\13\\43.88403\\-107.8646\\13\\43.86165\\-105.9115\\13\\44.64565\\-104.1537\\13\\46.59877\\-103.4875\\13\\48.5519\\-103.5617\\13\\50.50502\\-104.6559\\13\\52.45815\\-106.4886\\13\\56.3644\\-110.5952\\13\\57.23616\\-111.7709\\13\\58.95584\\-113.724\\13\\60.57461\\-115.6771\\13\\61.18567\\-117.6303\\13\\62.9271\\-119.5834\\13\\63.46803\\-121.5365\\13\\64.1769\\-123.4495\\13\\65.17146\\-125.4428\\13\\65.45001\\-127.3959\\13\\65.58873\\-129.349\\13\\66.44484\\-131.3021\\13\\67.1349\\-133.2553\\13\\67.50837\\-135.2084\\13\\68.08315\\-137.1062\\13\\68.84975\\-139.1146\\13\\69.15407\\-141.0678\\13\\70.21066\\-143.0209\\13\\71.10561\\-144.974\\13\\72.22512\\-146.9271\\13\\73.05967\\-148.8803\\13\\74.25734\\-150.8334\\13\\75.01186\\-152.7865\\13\\76.30205\\-154.7396\\13\\77.30021\\-156.6928\\13\\78.92715\\-158.6459\\13\\80.68772\\-160.599\\13\\82.6167\\-162.5521\\13\\83.93195\\-164.5053\\13\\85.03387\\-166.4584\\13\\85.66128\\-167.0965\\13\\87.6144\\-167.9768\\13\\88.09936\\-168.4115\\13\\89.16113\\-170.3646\\13\\90.4174\\-172.3178\\13\\92.31172\\-174.2709\\13\\93.18081\\-176.224\\13\\93.19195\\-178.1771\\13\\94.28349\\-180.1303\\13\\94.65398\\-182.0834\\13\\94.69689\\-185.9896\\13\\94.13015\\-187.9428\\13\\94.06844\\-191.849\\13\\93.55515\\-193.8021\\13\\93.18081\\-197.7084\\13\\93.0484\\-199.6615\\13\\93.18081\\-203.5678\\13\\93.16981\\-209.4271\\13\\92.55202\\-211.3803\\13\\91.52065\\-212.4012\\13\\89.56753\\-213.7483\\13" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "412" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-90.11997\\-216.2631\\15\\-91.12308\\-215.2865\\15\\-91.28856\\-213.3334\\15\\-88.73223\\-211.3803\\15\\-87.43196\\-209.4271\\15\\-87.33182\\-207.474\\15\\-88.16685\\-206.4632\\15\\-90.11997\\-205.0156\\15\\-92.0731\\-204.8681\\15\\-94.02622\\-203.9128\\15\\-94.36231\\-203.5678\\15\\-95.08379\\-201.6146\\15\\-96.48466\\-199.6615\\15\\-97.61766\\-195.7553\\15\\-97.12798\\-193.8021\\15\\-97.03949\\-191.849\\15\\-97.48588\\-189.8959\\15\\-97.6395\\-187.9428\\15\\-97.59639\\-185.9896\\15\\-96.11478\\-182.0834\\15\\-95.89858\\-180.1303\\15\\-95.10873\\-178.1771\\15\\-94.47012\\-176.224\\15\\-92.9474\\-174.2709\\15\\-90.92139\\-170.3646\\15\\-89.05784\\-168.4115\\15\\-87.3885\\-166.4584\\15\\-86.54981\\-164.5053\\15\\-85.40068\\-162.5521\\15\\-84.47231\\-160.599\\15\\-83.37241\\-158.6459\\15\\-82.54649\\-156.6928\\15\\-81.35719\\-154.7396\\15\\-80.49078\\-152.7865\\15\\-79.36505\\-150.8334\\15\\-78.84512\\-148.8803\\15\\-77.87011\\-146.9271\\15\\-76.90108\\-143.0209\\15\\-76.01475\\-141.0678\\15\\-75.48045\\-139.1146\\15\\-75.05691\\-137.1615\\15\\-74.44239\\-135.2084\\15\\-74.12084\\-133.2553\\15\\-72.46047\\-127.3959\\15\\-72.14747\\-125.4428\\15\\-71.56055\\-123.4896\\15\\-70.58872\\-121.4361\\15\\-68.61271\\-117.6303\\15\\-67.69222\\-115.6771\\15\\-66.68247\\-113.8684\\15\\-64.56396\\-111.7709\\15\\-62.77623\\-110.7446\\15\\-58.86998\\-109.2919\\15\\-57.90403\\-109.8178\\15\\-56.91685\\-110.6995\\15\\-56.22715\\-111.7709\\15\\-55.99509\\-113.724\\15\\-55.76928\\-117.6303\\15\\-55.0858\\-121.5365\\15\\-54.32952\\-123.4896\\15\\-53.18499\\-127.3959\\15\\-53.00156\\-129.349\\15\\-51.05748\\-130.9277\\15\\-49.74522\\-129.349\\15\\-48.96891\\-127.3959\\15\\-49.27874\\-125.4428\\15\\-49.11198\\-123.4896\\15\\-50.09943\\-121.5365\\15\\-50.18571\\-119.5834\\15\\-49.10435\\-118.5475\\15\\-47.15123\\-118.2588\\15\\-45.1981\\-118.4143\\15\\-43.24498\\-118.3898\\15\\-41.29185\\-118.6477\\15\\-39.33873\\-118.7688\\15\\-37.3856\\-118.6606\\15\\-35.43248\\-118.9341\\15\\-33.47935\\-120.6116\\15\\-29.5731\\-121.0146\\15\\-27.61998\\-121.266\\15\\-25.66685\\-121.8262\\15\\-23.71373\\-122.7399\\15\\-21.7606\\-124.5042\\15\\-19.80748\\-124.7164\\15\\-17.85435\\-125.1388\\15\\-15.90123\\-126.777\\15\\-13.9481\\-128.1088\\15\\-11.99498\\-128.379\\15\\-10.04185\\-129.0235\\15\\-8.088726\\-129.2824\\15\\-5.915087\\-129.349\\15\\-4.182476\\-130.659\\15\\-2.229351\\-130.9458\\15\\-0.276226\\-130.7162\\15\\1.005512\\-129.349\\15\\3.630024\\-128.5235\\15\\5.583149\\-126.8186\\15\\7.536274\\-126.7328\\15\\9.489399\\-128.1821\\15\\11.44252\\-129.1734\\15\\13.32477\\-131.3021\\15\\12.89368\\-133.2553\\15\\11.44252\\-134.1131\\15\\9.489399\\-133.3638\\15\\7.536274\\-132.3701\\15\\3.630024\\-132.2787\\15\\1.676899\\-132.0466\\15\\-0.276226\\-131.6491\\15\\-6.135601\\-131.6277\\15\\-10.04185\\-131.5631\\15\\-13.9481\\-131.0336\\15\\-17.85435\\-131.6989\\15\\-19.80748\\-131.773\\15\\-21.7606\\-132.337\\15\\-23.71373\\-133.6806\\15\\-25.66685\\-134.7237\\15\\-26.115\\-135.2084\\15\\-26.33008\\-137.1615\\15\\-26.05885\\-139.1146\\15\\-25.66685\\-140.2743\\15\\-24.78113\\-141.0678\\15\\-29.5731\\-142.8214\\15\\-31.52623\\-143.1258\\15\\-33.47935\\-142.7562\\15\\-34.73396\\-141.0678\\15\\-35.43248\\-140.483\\15\\-37.3856\\-140.6784\\15\\-37.77254\\-141.0678\\15\\-40.69408\\-143.0209\\15\\-41.29185\\-143.5977\\15\\-43.24498\\-144.4915\\15\\-45.1981\\-145.8648\\15\\-47.15123\\-145.6808\\15\\-47.89071\\-144.974\\15\\-49.58653\\-143.0209\\15\\-51.05748\\-141.8615\\15\\-52.34355\\-143.0209\\15\\-53.92696\\-144.974\\15\\-54.96373\\-145.839\\15\\-56.91685\\-146.1626\\15\\-57.58859\\-146.9271\\15\\-58.97236\\-148.8803\\15\\-60.10064\\-150.8334\\15\\-61.48339\\-152.7865\\15\\-62.14769\\-154.7396\\15\\-63.46344\\-156.6928\\15\\-63.83141\\-158.6459\\15\\-63.94535\\-160.599\\15\\-64.29466\\-162.5521\\15\\-64.41454\\-164.5053\\15\\-65.28347\\-166.4584\\15\\-65.85023\\-168.4115\\15\\-66.29309\\-170.3646\\15\\-66.31313\\-172.3178\\15\\-67.0145\\-174.2709\\15\\-67.49352\\-176.224\\15\\-67.84505\\-178.1771\\15\\-67.99007\\-180.1303\\15\\-69.42243\\-184.0365\\15\\-69.58595\\-187.9428\\15\\-70.7642\\-189.8959\\15\\-72.54185\\-191.9543\\15\\-74.49497\\-193.0222\\15\\-75.38474\\-193.8021\\15\\-76.82513\\-195.7553\\15\\-77.62968\\-197.7084\\15\\-79.07072\\-199.6615\\15\\-79.5959\\-201.6146\\15\\-81.07938\\-203.5678\\15\\-81.73017\\-207.474\\15\\-82.98079\\-209.4271\\15\\-83.42805\\-211.3803\\15\\-83.91408\\-215.2865\\15\\-84.2606\\-215.6621\\15\\-86.21372\\-216.9141\\15\\-88.16685\\-216.8602\\15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "145" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "413" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "17.3019\\-220.0581\\15\\15.34877\\-219.0058\\15\\13.39565\\-218.9204\\15\\9.489399\\-218.8826\\15\\7.536274\\-218.7663\\15\\5.583149\\-218.2551\\15\\4.048551\\-217.2396\\15\\1.676899\\-214.7342\\15\\0.8592031\\-213.3334\\15\\0.07952174\\-211.3803\\15\\-1.099892\\-209.4271\\15\\-1.149214\\-205.5209\\15\\-1.248309\\-203.5678\\15\\-1.573059\\-201.6146\\15\\-2.221722\\-199.6615\\15\\-3.248997\\-197.7084\\15\\-3.969283\\-195.7553\\15\\-3.921415\\-193.8021\\15\\-3.469849\\-191.849\\15\\-3.726747\\-189.8959\\15\\-4.182476\\-189.4076\\15\\-4.331083\\-187.9428\\15\\-4.897635\\-185.9896\\15\\-5.186291\\-184.0365\\15\\-5.626853\\-182.0834\\15\\-7.908274\\-178.1771\\15\\-8.088726\\-177.0704\\15\\-8.396162\\-178.1771\\15\\-9.859416\\-180.1303\\15\\-11.99498\\-182.2633\\15\\-13.9481\\-183.7296\\15\\-14.51348\\-184.0365\\15\\-15.90123\\-184.274\\15\\-17.85435\\-184.4012\\15\\-19.80748\\-184.2393\\15\\-21.7606\\-183.1373\\15\\-23.71373\\-184.1662\\15\\-25.66685\\-184.505\\15\\-29.5731\\-184.505\\15\\-31.52623\\-184.0912\\15\\-33.47935\\-182.8934\\15\\-35.43248\\-182.5909\\15\\-37.3856\\-182.1803\\15\\-39.33873\\-180.2888\\15\\-43.24498\\-178.2453\\15\\-45.1981\\-176.7639\\15\\-47.15123\\-174.8621\\15\\-49.10435\\-172.4445\\15\\-51.57777\\-170.3646\\15\\-53.0106\\-169.3179\\15\\-53.90627\\-168.4115\\15\\-54.71453\\-166.4584\\15\\-54.05616\\-164.5053\\15\\-52.87417\\-162.5521\\15\\-52.14312\\-160.599\\15\\-51.57954\\-158.6459\\15\\-50.25758\\-154.7396\\15\\-49.43201\\-152.7865\\15\\-47.15123\\-150.4388\\15\\-44.75342\\-148.8803\\15\\-43.24498\\-148.0641\\15\\-39.33873\\-148.0752\\15\\-37.3856\\-148.6412\\15\\-35.43248\\-149.6509\\15\\-33.47935\\-149.9231\\15\\-29.5731\\-150.1802\\15\\-23.71373\\-150.2238\\15\\-19.80748\\-150.1802\\15\\-17.85435\\-150.3105\\15\\-15.90123\\-151.3992\\15\\-14.45656\\-152.7865\\15\\-13.1964\\-154.7396\\15\\-12.26551\\-156.6928\\15\\-10.80768\\-158.6459\\15\\-10.22885\\-160.599\\15\\-9.198874\\-162.5521\\15\\-8.036141\\-164.5053\\15\\-7.658267\\-166.4584\\15\\-6.551004\\-168.4115\\15\\-5.024696\\-170.3646\\15\\-4.252789\\-172.3178\\15\\-3.257997\\-174.2709\\15\\-3.231726\\-176.224\\15\\-3.024892\\-178.1771\\15\\-2.441053\\-180.1303\\15\\-2.447145\\-182.0834\\15\\-2.067761\\-185.9896\\15\\-2.067761\\-189.8959\\15\\-1.925388\\-191.849\\15\\-1.269247\\-193.8021\\15\\-0.276226\\-194.6949\\15\\3.630024\\-192.9554\\15\\5.583149\\-192.4623\\15\\7.536274\\-191.8263\\15\\9.489399\\-191.6252\\15\\11.44252\\-191.1795\\15\\13.39565\\-190.9466\\15\\15.34877\\-190.5344\\15\\17.3019\\-189.6368\\15\\19.25502\\-189.4799\\15\\21.20815\\-188.9281\\15\\23.16127\\-188.0648\\15\\25.1144\\-189.0085\\15\\27.06752\\-189.6368\\15\\29.02065\\-189.6484\\15\\30.97377\\-189.8583\\15\\32.9269\\-190.6085\\15\\34.88002\\-189.6797\\15\\36.88681\\-187.9428\\15\\38.78627\\-187.1313\\15\\40.7394\\-186.68\\15\\42.69252\\-185.4677\\15\\44.64565\\-185.1948\\15\\46.59877\\-185.2632\\15\\48.5519\\-185.4843\\15\\50.50502\\-186.5569\\15\\52.45815\\-188.2808\\15\\54.41127\\-190.1826\\15\\56.01403\\-191.849\\15\\57.0339\\-193.8021\\15\\57.09682\\-195.7553\\15\\57.97166\\-197.7084\\15\\60.27065\\-200.0351\\15\\62.89709\\-203.5678\\15\\60.27065\\-206.0003\\15\\58.38728\\-205.5209\\15\\59.10152\\-203.5678\\15\\58.31752\\-202.6651\\15\\56.3644\\-202.4406\\15\\55.19347\\-203.5678\\15\\54.61951\\-205.5209\\15\\53.49543\\-207.474\\15\\51.93081\\-209.4271\\15\\50.80397\\-211.3803\\15\\48.5519\\-213.4419\\15\\46.59877\\-214.4037\\15\\44.64565\\-215.4982\\15\\42.69252\\-216.3008\\15\\40.7394\\-216.7426\\15\\36.83315\\-217.0039\\15\\36.43103\\-217.2396\\15\\32.9269\\-218.8034\\15\\30.97377\\-219.9771\\15\\29.02065\\-220.8868\\15\\19.25502\\-220.8868\\15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002294" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "142" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "414" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "87.6144\\-213.8827\\15\\85.66128\\-212.0553\\15\\85.09934\\-211.3803\\15\\84.70711\\-209.4271\\15\\83.39333\\-207.474\\15\\82.72752\\-205.5209\\15\\80.92381\\-203.5678\\15\\80.50365\\-201.6146\\15\\77.84878\\-197.9066\\15\\75.73431\\-195.7553\\15\\73.94253\\-192.5366\\15\\71.91093\\-189.8959\\15\\70.854\\-187.9428\\15\\70.03628\\-186.0574\\15\\68.90276\\-184.0365\\15\\68.73224\\-180.1303\\15\\68.08315\\-178.9258\\15\\66.13003\\-176.1788\\15\\65.08406\\-174.2709\\15\\64.95287\\-172.3178\\15\\64.50242\\-170.3646\\15\\63.33535\\-168.4115\\15\\62.78886\\-166.4584\\15\\61.34808\\-164.5053\\15\\62.22377\\-163.4081\\15\\63.47815\\-162.5521\\15\\62.22377\\-161.253\\15\\61.76885\\-160.599\\15\\60.27065\\-158.8883\\15\\56.20785\\-154.7396\\15\\55.13308\\-152.7865\\15\\53.84405\\-150.8334\\15\\52.97938\\-148.8803\\15\\50.50502\\-146.4731\\15\\48.5519\\-145.966\\15\\46.59877\\-145.7523\\15\\44.64565\\-144.2921\\15\\43.57235\\-143.0209\\15\\42.69252\\-142.1692\\15\\40.7394\\-140.5541\\15\\38.78627\\-140.1324\\15\\36.83315\\-140.4116\\15\\34.88002\\-141.5474\\15\\32.9269\\-141.3933\\15\\30.97377\\-140.2156\\15\\29.75179\\-139.1146\\15\\27.06752\\-136.3792\\15\\25.1144\\-135.7703\\15\\23.85707\\-135.2084\\15\\21.20815\\-133.7689\\15\\20.61963\\-133.2553\\15\\20.52349\\-131.3021\\15\\21.20815\\-130.6061\\15\\25.1144\\-128.8263\\15\\27.06752\\-128.2543\\15\\29.02065\\-127.8927\\15\\30.97377\\-127.7926\\15\\34.88002\\-126.3124\\15\\36.83315\\-125.0657\\15\\38.78627\\-124.4001\\15\\40.56435\\-123.4896\\15\\40.89149\\-123.4896\\15\\41.80597\\-125.4428\\15\\41.63987\\-127.3959\\15\\40.7394\\-128.8404\\15\\40.28164\\-129.349\\15\\39.94805\\-131.3021\\15\\40.7394\\-132.8669\\15\\42.69252\\-134.1601\\15\\43.53554\\-133.2553\\15\\43.58553\\-131.3021\\15\\44.00755\\-129.349\\15\\45.39647\\-127.3959\\15\\45.85777\\-125.4428\\15\\47.18209\\-123.4896\\15\\48.5519\\-122.3743\\15\\49.38971\\-121.5365\\15\\49.38706\\-115.6771\\15\\48.5519\\-114.0438\\15\\47.16104\\-111.7709\\15\\44.64565\\-109.2505\\15\\41.76271\\-105.9115\\15\\41.83018\\-103.9584\\15\\42.69252\\-102.8413\\15\\44.64565\\-101.6183\\15\\46.59877\\-101.5344\\15\\48.0113\\-102.0053\\15\\50.50502\\-103.1137\\15\\51.65431\\-103.9584\\15\\52.45815\\-104.7257\\15\\54.41127\\-107.168\\15\\55.05629\\-107.8646\\15\\57.18329\\-109.8178\\15\\58.57661\\-111.7709\\15\\59.54747\\-113.724\\15\\61.19342\\-115.6771\\15\\62.27596\\-117.6303\\15\\63.23758\\-119.5834\\15\\63.74221\\-121.5365\\15\\64.95124\\-123.4896\\15\\65.46372\\-125.4428\\15\\65.61634\\-127.3959\\15\\66.13003\\-128.8292\\15\\67.15774\\-131.3021\\15\\67.56648\\-133.2553\\15\\68.4342\\-135.2084\\15\\69.13729\\-137.1615\\15\\69.52502\\-139.1146\\15\\70.03628\\-140.5632\\15\\71.13251\\-143.0209\\15\\72.27122\\-144.974\\15\\73.07716\\-146.9271\\15\\74.29935\\-148.8803\\15\\75.02597\\-150.8334\\15\\76.31159\\-152.7865\\15\\77.20736\\-154.7396\\15\\77.84878\\-155.4301\\15\\80.33203\\-158.6459\\15\\81.07455\\-160.599\\15\\81.75503\\-161.2831\\15\\85.66128\\-165.8203\\15\\88.3817\\-168.4115\\15\\89.80325\\-170.3646\\15\\90.72658\\-172.3178\\15\\92.35996\\-174.2709\\15\\93.18081\\-176.224\\15\\93.28677\\-178.1771\\15\\94.32827\\-180.1303\\15\\95.0205\\-182.0834\\15\\95.0205\\-184.0365\\15\\94.6392\\-185.9896\\15\\94.02789\\-187.9428\\15\\94.06612\\-189.8959\\15\\94.3102\\-191.849\\15\\94.25226\\-193.8021\\15\\93.92676\\-195.7553\\15\\93.39301\\-197.7084\\15\\93.16981\\-201.6146\\15\\93.18081\\-209.4271\\15\\93.03642\\-211.3803\\15\\91.52065\\-212.8336\\15\\89.56753\\-213.661\\15" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "189" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "415" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-215.6211\\17\\-92.38792\\-215.2865\\17\\-92.78111\\-213.3334\\17\\-92.0731\\-212.5997\\17\\-90.11997\\-212.5331\\17\\-88.12929\\-211.3803\\17\\-87.69601\\-209.4271\\17\\-87.68724\\-207.474\\17\\-89.08141\\-205.5209\\17\\-90.11997\\-204.6523\\17\\-92.0731\\-204.7387\\17\\-94.02622\\-204.6534\\17\\-95.01635\\-203.5678\\17\\-95.65383\\-201.6146\\17\\-96.79315\\-199.6615\\17\\-97.42421\\-197.7084\\17\\-97.61766\\-195.7553\\17\\-97.59639\\-193.8021\\17\\-97.77089\\-191.849\\17\\-97.62851\\-187.9428\\17\\-97.60696\\-185.9896\\17\\-97.03875\\-184.0365\\17\\-96.61489\\-180.1303\\17\\-94.83424\\-176.224\\17\\-93.26\\-174.2709\\17\\-92.46983\\-172.3178\\17\\-90.9886\\-170.3646\\17\\-89.36993\\-168.4115\\17\\-88.40257\\-166.4584\\17\\-88.16685\\-166.2033\\17\\-86.21372\\-163.1958\\17\\-85.71688\\-162.5521\\17\\-85.15205\\-160.599\\17\\-83.73047\\-158.6459\\17\\-83.19147\\-156.6928\\17\\-81.77734\\-154.7396\\17\\-81.21575\\-152.7865\\17\\-79.86607\\-150.8334\\17\\-79.37361\\-148.8803\\17\\-79.02267\\-146.9271\\17\\-78.01184\\-144.974\\17\\-77.42899\\-143.0209\\17\\-77.06955\\-141.0678\\17\\-76.17573\\-139.1146\\17\\-75.51186\\-137.1615\\17\\-75.32637\\-135.2084\\17\\-74.94796\\-133.2553\\17\\-74.17808\\-131.3021\\17\\-73.59673\\-129.349\\17\\-73.37701\\-127.3959\\17\\-72.94825\\-125.4428\\17\\-71.30589\\-121.5365\\17\\-70.22961\\-119.5834\\17\\-69.32647\\-117.6303\\17\\-68.24622\\-115.6771\\17\\-67.32437\\-113.724\\17\\-65.78301\\-111.7709\\17\\-64.72935\\-110.7943\\17\\-62.77623\\-110.3829\\17\\-60.8231\\-110.6802\\17\\-59.71695\\-111.7709\\17\\-58.26036\\-113.724\\17\\-57.82141\\-115.6771\\17\\-57.63105\\-119.5834\\17\\-57.03892\\-121.5365\\17\\-55.92085\\-123.4896\\17\\-55.12532\\-125.4428\\17\\-53.74174\\-127.3959\\17\\-53.18499\\-129.349\\17\\-53.0106\\-129.6173\\17\\-51.05748\\-130.6145\\17\\-49.86932\\-129.349\\17\\-49.77089\\-127.3959\\17\\-49.99991\\-125.4428\\17\\-49.52029\\-123.4896\\17\\-49.75023\\-121.5365\\17\\-49.4124\\-119.5834\\17\\-49.10435\\-119.2733\\17\\-47.15123\\-118.4754\\17\\-45.1981\\-118.4087\\17\\-43.24498\\-117.4675\\17\\-41.29185\\-117.1956\\17\\-39.33873\\-118.3454\\17\\-37.3856\\-118.4087\\17\\-35.43248\\-118.6897\\17\\-33.47935\\-120.2497\\17\\-31.52623\\-120.4979\\17\\-29.5731\\-120.5795\\17\\-25.66685\\-120.483\\17\\-23.71373\\-120.7015\\17\\-22.30843\\-121.5365\\17\\-21.7606\\-122.0213\\17\\-19.65155\\-123.4896\\17\\-17.85435\\-124.4618\\17\\-16.44376\\-125.4428\\17\\-15.90123\\-125.9616\\17\\-13.9481\\-126.9895\\17\\-11.99498\\-127.6228\\17\\-8.088726\\-128.0083\\17\\-6.135601\\-128.0193\\17\\-2.229351\\-128.5668\\17\\-0.276226\\-128.3585\\17\\1.676899\\-127.9773\\17\\3.630024\\-127.7573\\17\\5.583149\\-126.9612\\17\\7.536274\\-127.2089\\17\\9.489399\\-128.8058\\17\\11.44252\\-129.9339\\17\\13.39565\\-130.7809\\17\\13.89542\\-131.3021\\17\\14.21776\\-133.2553\\17\\13.39565\\-134.3016\\17\\11.44252\\-135.8577\\17\\9.489399\\-134.7514\\17\\7.536274\\-134.3769\\17\\5.583149\\-134.3851\\17\\3.630024\\-135.1043\\17\\-0.276226\\-135.1043\\17\\-2.229351\\-135.2618\\17\\-6.135601\\-135.1827\\17\\-8.088726\\-134.0396\\17\\-10.04185\\-133.5914\\17\\-11.99498\\-132.3689\\17\\-13.9481\\-131.7275\\17\\-15.90123\\-131.6382\\17\\-19.80748\\-131.7551\\17\\-21.7606\\-132.1098\\17\\-23.71373\\-132.9583\\17\\-25.66685\\-134.1602\\17\\-26.62933\\-135.2084\\17\\-27.61998\\-136.9399\\17\\-29.5731\\-137.4244\\17\\-31.52623\\-137.1371\\17\\-33.47935\\-137.6691\\17\\-35.43248\\-139.047\\17\\-37.3856\\-140.6331\\17\\-39.33873\\-142.3784\\17\\-41.29185\\-144.3926\\17\\-42.03145\\-144.974\\17\\-44.9201\\-146.9271\\17\\-45.1981\\-147.2093\\17\\-47.15123\\-147.7\\17\\-47.86296\\-146.9271\\17\\-48.10264\\-144.974\\17\\-48.68379\\-143.0209\\17\\-49.10435\\-142.6539\\17\\-51.05748\\-141.7706\\17\\-52.12225\\-143.0209\\17\\-53.38232\\-144.974\\17\\-54.27126\\-146.9271\\17\\-54.96373\\-147.5727\\17\\-56.91685\\-148.5295\\17\\-58.86998\\-150.2052\\17\\-59.43359\\-150.8334\\17\\-60.03344\\-152.7865\\17\\-61.79514\\-154.7396\\17\\-62.52874\\-156.6928\\17\\-62.96456\\-158.6459\\17\\-63.845\\-160.599\\17\\-64.40383\\-162.5521\\17\\-65.3364\\-164.5053\\17\\-65.87512\\-166.4584\\17\\-67.09842\\-168.4115\\17\\-67.631\\-170.3646\\17\\-67.67828\\-172.3178\\17\\-69.47975\\-176.224\\17\\-69.56947\\-178.1771\\17\\-70.24935\\-180.1303\\17\\-71.30914\\-182.0834\\17\\-71.44252\\-184.0365\\17\\-72.07852\\-185.9896\\17\\-74.30683\\-189.8959\\17\\-76.4481\\-192.0372\\17\\-77.34708\\-193.8021\\17\\-78.18829\\-195.7553\\17\\-79.29175\\-197.7084\\17\\-80.03781\\-199.6615\\17\\-80.35435\\-199.9965\\17\\-81.30576\\-201.6146\\17\\-81.52716\\-203.5678\\17\\-82.0145\\-205.5209\\17\\-82.14589\\-207.474\\17\\-83.2976\\-209.4271\\17\\-83.67574\\-211.3803\\17\\-83.76376\\-213.3334\\17\\-84.88002\\-215.2865\\17\\-86.21372\\-216.5413\\17\\-88.16685\\-217.0039\\17\\-90.11997\\-216.8503\\17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "137" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "416" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "7.536274\\-219.7851\\17\\3.630024\\-218.0355\\17\\0.7859116\\-215.2865\\17\\-0.8051974\\-213.3334\\17\\-1.498207\\-211.3803\\17\\-2.027063\\-209.4271\\17\\-2.792967\\-207.474\\17\\-3.128943\\-205.5209\\17\\-3.27073\\-199.6615\\17\\-3.557686\\-197.7084\\17\\-4.304546\\-195.7553\\17\\-4.331083\\-191.849\\17\\-4.92867\\-189.8959\\17\\-5.305997\\-187.9428\\17\\-6.135601\\-185.8776\\17\\-7.890362\\-184.0365\\17\\-8.226719\\-184.0365\\17\\-10.04185\\-187.0664\\17\\-11.99498\\-189.1104\\17\\-13.9481\\-189.941\\17\\-15.90123\\-190.1648\\17\\-17.85435\\-189.7114\\17\\-19.80748\\-188.5429\\17\\-23.71373\\-187.1311\\17\\-29.5731\\-187.1438\\17\\-31.52623\\-187.0218\\17\\-33.47935\\-186.6473\\17\\-37.3856\\-185.1708\\17\\-39.33873\\-184.677\\17\\-41.29185\\-183.8906\\17\\-45.1981\\-179.9791\\17\\-46.05814\\-178.1771\\17\\-47.15123\\-176.3958\\17\\-49.10435\\-174.2629\\17\\-51.05748\\-173.2712\\17\\-53.0106\\-173.882\\17\\-54.38082\\-172.3178\\17\\-54.42051\\-170.3646\\17\\-54.09196\\-168.4115\\17\\-53.0106\\-166.5168\\17\\-51.74646\\-164.5053\\17\\-51.18518\\-162.5521\\17\\-51.01992\\-160.599\\17\\-50.25354\\-158.6459\\17\\-50.01116\\-156.6928\\17\\-49.3313\\-154.7396\\17\\-47.98164\\-152.7865\\17\\-47.15123\\-152.0642\\17\\-45.1981\\-151.4082\\17\\-43.24498\\-150.0349\\17\\-41.29185\\-149.9501\\17\\-39.33873\\-150.0004\\17\\-37.3856\\-151.0197\\17\\-35.43248\\-151.8567\\17\\-33.47935\\-152.5236\\17\\-31.52623\\-153.58\\17\\-27.61998\\-153.9133\\17\\-25.66685\\-153.943\\17\\-23.71373\\-153.7559\\17\\-21.7606\\-153.6833\\17\\-19.80748\\-153.7559\\17\\-17.85435\\-154.5115\\17\\-15.90123\\-156.4178\\17\\-13.72412\\-158.6459\\17\\-11.99498\\-159.6592\\17\\-10.96063\\-160.599\\17\\-9.545004\\-162.5521\\17\\-8.088726\\-166.3272\\17\\-7.143166\\-168.4115\\17\\-5.743732\\-170.3646\\17\\-5.414683\\-172.3178\\17\\-4.746325\\-174.2709\\17\\-3.805449\\-176.224\\17\\-3.454937\\-178.1771\\17\\-3.270161\\-180.1303\\17\\-3.270161\\-182.0834\\17\\-2.972705\\-184.0365\\17\\-2.093915\\-185.9896\\17\\-1.707395\\-189.8959\\17\\-1.166621\\-191.849\\17\\-0.276226\\-192.7447\\17\\1.676899\\-192.4211\\17\\3.630024\\-191.2717\\17\\5.583149\\-190.9557\\17\\9.489399\\-190.9035\\17\\11.44252\\-190.6179\\17\\13.39565\\-190.0323\\17\\17.3019\\-189.6484\\17\\19.25502\\-189.6141\\17\\21.20815\\-189.1659\\17\\23.16127\\-188.975\\17\\25.1144\\-189.2163\\17\\27.06752\\-189.6368\\17\\30.97377\\-189.6484\\17\\32.9269\\-189.272\\17\\36.83315\\-186.7404\\17\\38.78627\\-185.3973\\17\\42.69252\\-184.7415\\17\\44.64565\\-183.4451\\17\\46.59877\\-183.1328\\17\\48.5519\\-183.4302\\17\\50.50502\\-184.8855\\17\\52.20833\\-185.9896\\17\\56.3644\\-190.1225\\17\\57.46552\\-191.849\\17\\58.08897\\-193.8021\\17\\58.14061\\-195.7553\\17\\59.13804\\-197.7084\\17\\60.27065\\-198.8237\\17\\62.22377\\-200.4831\\17\\63.15769\\-201.6146\\17\\63.37017\\-203.5678\\17\\62.22377\\-204.5819\\17\\60.81124\\-203.5678\\17\\60.27065\\-203.0106\\17\\58.31752\\-202.4115\\17\\56.69423\\-203.5678\\17\\55.55145\\-205.5209\\17\\54.82021\\-207.474\\17\\53.51652\\-209.4271\\17\\51.87467\\-211.3803\\17\\48.5519\\-214.103\\17\\46.59877\\-215.4481\\17\\44.64565\\-216.3291\\17\\42.69252\\-216.8602\\17\\40.7394\\-217.0039\\17\\36.83315\\-217.0158\\17\\36.48663\\-217.2396\\17\\32.54286\\-219.1928\\17\\29.02065\\-220.7891\\17\\27.06752\\-220.8984\\17\\21.20815\\-220.8984\\17\\19.25502\\-220.7891\\17\\15.44753\\-219.1928\\17\\13.39565\\-219.7701\\17\\11.44252\\-220.0088\\17\\9.489399\\-220.0088\\17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002293" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "417" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-212.0553\\17\\85.09934\\-211.3803\\17\\84.66671\\-209.4271\\17\\83.17802\\-207.474\\17\\82.43811\\-203.5678\\17\\80.91332\\-201.6146\\17\\80.64825\\-199.6615\\17\\79.8019\\-198.2715\\17\\79.29434\\-197.7084\\17\\78.2056\\-195.7553\\17\\76.98643\\-193.8021\\17\\75.60268\\-191.849\\17\\74.71587\\-189.8959\\17\\73.49014\\-187.9428\\17\\72.72182\\-185.9896\\17\\71.54238\\-184.0365\\17\\70.8613\\-182.0834\\17\\70.34431\\-180.1303\\17\\69.28235\\-178.1771\\17\\68.83221\\-176.224\\17\\67.64234\\-174.2709\\17\\66.9384\\-172.3178\\17\\66.13003\\-170.701\\17\\64.68304\\-168.4115\\17\\63.10539\\-166.4584\\17\\61.34748\\-164.5053\\17\\61.10186\\-160.599\\17\\58.31752\\-157.7028\\17\\55.29858\\-154.7396\\17\\53.69306\\-152.7865\\17\\52.91307\\-150.8334\\17\\51.43052\\-148.8803\\17\\50.50502\\-148.131\\17\\48.5519\\-147.9469\\17\\46.59877\\-146.6512\\17\\44.64565\\-145.8377\\17\\43.90962\\-144.974\\17\\43.36549\\-143.0209\\17\\42.69252\\-142.3444\\17\\40.7394\\-141.899\\17\\38.78627\\-141.8421\\17\\36.83315\\-141.6675\\17\\34.88002\\-141.7881\\17\\32.9269\\-141.6748\\17\\29.02065\\-139.5189\\17\\28.62392\\-139.1146\\17\\27.49552\\-137.1615\\17\\25.1144\\-134.936\\17\\23.16127\\-134.0956\\17\\22.12891\\-133.2553\\17\\22.08191\\-131.3021\\17\\23.16127\\-130.2279\\17\\25.1144\\-129.7457\\17\\27.06752\\-128.451\\17\\29.02065\\-127.8118\\17\\30.97377\\-127.8023\\17\\32.9269\\-126.6661\\17\\34.88002\\-125.8681\\17\\36.83315\\-124.6365\\17\\38.78627\\-123.0367\\17\\40.7394\\-122.5846\\17\\41.91895\\-123.4896\\17\\42.22168\\-125.4428\\17\\41.75068\\-127.3959\\17\\40.16789\\-129.349\\17\\39.70515\\-131.3021\\17\\39.87773\\-133.2553\\17\\40.7394\\-134.1933\\17\\42.09502\\-135.2084\\17\\44.43893\\-137.1615\\17\\44.64565\\-138.5101\\17\\44.95017\\-137.1615\\17\\45.59247\\-135.2084\\17\\45.03752\\-133.2553\\17\\45.23935\\-131.3021\\17\\45.96005\\-127.3959\\17\\47.27925\\-125.4428\\17\\47.88181\\-123.4896\\17\\49.24154\\-121.5365\\17\\49.00763\\-119.5834\\17\\48.35246\\-117.6303\\17\\47.83156\\-115.6771\\17\\47.51817\\-113.724\\17\\46.59877\\-111.9949\\17\\44.48406\\-109.8178\\17\\42.69252\\-107.4881\\17\\40.06293\\-103.9584\\17\\41.53359\\-102.0053\\17\\42.69252\\-101.1228\\17\\44.64565\\-100.8659\\17\\46.59877\\-100.7969\\17\\48.5519\\-101.1097\\17\\50.35131\\-102.0053\\17\\52.45815\\-103.4356\\17\\54.70424\\-105.9115\\17\\56.26034\\-107.8646\\17\\58.42603\\-109.8178\\17\\59.27229\\-111.7709\\17\\60.93369\\-113.724\\17\\61.69059\\-115.6771\\17\\63.08049\\-117.6303\\17\\63.52756\\-119.5834\\17\\64.55392\\-121.5365\\17\\65.24184\\-123.4896\\17\\65.5918\\-125.4428\\17\\65.71408\\-127.3959\\17\\66.83977\\-129.349\\17\\67.48013\\-131.3021\\17\\68.08315\\-132.8138\\17\\69.18689\\-135.2084\\17\\69.59238\\-137.1615\\17\\71.15838\\-141.0678\\17\\72.31492\\-143.0209\\17\\73.06778\\-144.974\\17\\74.21306\\-146.9271\\17\\74.99814\\-148.8803\\17\\76.22117\\-150.8334\\17\\76.98654\\-152.7865\\17\\77.84878\\-153.9343\\17\\80.21784\\-156.6928\\17\\80.86022\\-158.6459\\17\\84.10738\\-162.5521\\17\\84.81344\\-164.5053\\17\\86.55565\\-166.4584\\17\\88.48525\\-168.4115\\17\\90.2713\\-170.3646\\17\\91.69504\\-172.3178\\17\\92.65675\\-174.2709\\17\\94.59588\\-180.1303\\17\\95.15636\\-182.0834\\17\\95.15636\\-184.0365\\17\\95.03017\\-185.9896\\17\\94.5251\\-187.9428\\17\\94.61552\\-189.8959\\17\\94.96839\\-191.849\\17\\94.90721\\-193.8021\\17\\94.548\\-195.7553\\17\\93.95338\\-199.6615\\17\\93.40719\\-201.6146\\17\\93.39301\\-203.5678\\17\\93.22629\\-205.5209\\17\\93.16981\\-211.3803\\17\\91.52065\\-212.927\\17\\87.6144\\-213.0859\\17" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "185" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "418" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-216.3833\\19\\-93.12147\\-215.2865\\19\\-93.44157\\-213.3334\\19\\-92.0731\\-212.3087\\19\\-90.11997\\-212.5749\\19\\-88.84089\\-211.3803\\19\\-87.87388\\-209.4271\\19\\-87.77012\\-207.474\\19\\-89.07183\\-205.5209\\19\\-90.11997\\-204.6428\\19\\-92.0731\\-205.6448\\19\\-94.02622\\-206.4309\\19\\-95.01241\\-205.5209\\19\\-95.97935\\-203.3123\\19\\-96.57909\\-201.6146\\19\\-97.0855\\-199.6615\\19\\-97.9401\\-197.7084\\19\\-97.98466\\-195.7553\\19\\-98.57495\\-193.8021\\19\\-98.81683\\-191.849\\19\\-98.59532\\-189.8959\\19\\-97.98466\\-187.9428\\19\\-97.98466\\-185.9896\\19\\-97.77089\\-184.0365\\19\\-97.45\\-182.0834\\19\\-96.61489\\-178.1771\\19\\-95.19321\\-176.224\\19\\-94.40325\\-174.2709\\19\\-91.33559\\-170.3646\\19\\-90.43479\\-168.4115\\19\\-87.43196\\-164.5053\\19\\-86.75195\\-162.5521\\19\\-85.44844\\-160.599\\19\\-84.81785\\-158.6459\\19\\-83.46743\\-156.6928\\19\\-82.89884\\-154.7396\\19\\-81.47739\\-152.7865\\19\\-81.00366\\-150.8334\\19\\-79.85751\\-148.8803\\19\\-79.38603\\-146.9271\\19\\-79.05056\\-144.974\\19\\-78.03424\\-143.0209\\19\\-77.4374\\-141.0678\\19\\-77.08364\\-139.1146\\19\\-76.20061\\-137.1615\\19\\-75.98335\\-135.2084\\19\\-74.48734\\-131.3021\\19\\-74.202\\-129.349\\19\\-74.04838\\-127.3959\\19\\-70.91425\\-119.5834\\19\\-69.80283\\-117.6303\\19\\-68.90797\\-115.6771\\19\\-67.84417\\-113.724\\19\\-66.68247\\-111.7786\\19\\-64.72935\\-109.8848\\19\\-62.77623\\-109.045\\19\\-60.8231\\-110.2484\\19\\-58.86998\\-112.2936\\19\\-57.82185\\-113.724\\19\\-57.84438\\-115.6771\\19\\-58.20367\\-117.6303\\19\\-58.32066\\-119.5834\\19\\-57.99242\\-121.5365\\19\\-57.78254\\-123.4896\\19\\-56.91685\\-124.7853\\19\\-54.36757\\-127.3959\\19\\-53.73452\\-129.349\\19\\-53.0106\\-130.3126\\19\\-51.05748\\-130.4928\\19\\-50.25847\\-129.349\\19\\-50.40127\\-127.3959\\19\\-50.66809\\-125.4428\\19\\-49.78437\\-123.4896\\19\\-48.29055\\-119.5834\\19\\-47.15123\\-118.6193\\19\\-45.1981\\-118.4032\\19\\-43.24498\\-116.9016\\19\\-41.29185\\-116.6042\\19\\-39.33873\\-116.6782\\19\\-37.3856\\-117.2143\\19\\-36.94229\\-117.6303\\19\\-35.43248\\-118.5945\\19\\-33.47935\\-119.1964\\19\\-31.52623\\-120.5515\\19\\-29.5731\\-120.7153\\19\\-27.61998\\-120.6048\\19\\-26.67118\\-119.5834\\19\\-27.36089\\-117.6303\\19\\-25.66685\\-117.1272\\19\\-23.71373\\-117.4897\\19\\-22.35838\\-119.5834\\19\\-21.7606\\-120.1812\\19\\-19.80748\\-122.5536\\19\\-17.85435\\-123.9692\\19\\-15.90123\\-124.7724\\19\\-13.9481\\-126.3188\\19\\-10.04185\\-126.9429\\19\\-8.088726\\-127.6076\\19\\-6.135601\\-127.6076\\19\\-2.229351\\-127.8239\\19\\-0.276226\\-127.7214\\19\\1.676899\\-126.9992\\19\\3.630024\\-126.6064\\19\\5.583149\\-126.8906\\19\\7.536274\\-128.2262\\19\\8.5174\\-129.349\\19\\9.489399\\-131.4339\\19\\11.44252\\-131.8196\\19\\13.39565\\-133.0925\\19\\13.47703\\-133.2553\\19\\12.20774\\-135.2084\\19\\11.44252\\-135.778\\19\\9.489399\\-135.9926\\19\\7.536274\\-136.3064\\19\\5.583149\\-136.4591\\19\\3.630024\\-136.9313\\19\\1.676899\\-136.9951\\19\\-0.276226\\-137.561\\19\\-2.229351\\-138.2724\\19\\-4.182476\\-138.2438\\19\\-6.135601\\-137.3853\\19\\-8.45982\\-135.2084\\19\\-10.04185\\-134.073\\19\\-11.99498\\-132.4538\\19\\-13.9481\\-131.0092\\19\\-15.90123\\-130.4448\\19\\-17.85435\\-130.4539\\19\\-19.80748\\-131.0092\\19\\-21.7606\\-131.8562\\19\\-23.71373\\-132.4406\\19\\-25.66685\\-133.6926\\19\\-29.5731\\-135.9712\\19\\-31.52623\\-135.9433\\19\\-33.47935\\-136.7748\\19\\-33.84634\\-137.1615\\19\\-34.60543\\-139.1146\\19\\-36.4337\\-141.0678\\19\\-38.4722\\-143.0209\\19\\-39.33873\\-143.9531\\19\\-41.29185\\-145.7956\\19\\-43.24498\\-146.3543\\19\\-45.1981\\-148.007\\19\\-47.15123\\-148.7983\\19\\-48.68321\\-146.9271\\19\\-47.26109\\-143.0209\\19\\-49.10435\\-142.2836\\19\\-51.05748\\-141.0983\\19\\-53.0106\\-141.6956\\19\\-53.89561\\-144.974\\19\\-54.14756\\-146.9271\\19\\-55.57124\\-148.8803\\19\\-57.93016\\-150.8334\\19\\-61.70439\\-154.7396\\19\\-62.36028\\-156.6928\\19\\-63.33664\\-158.6459\\19\\-63.95643\\-160.599\\19\\-65.36124\\-162.5521\\19\\-65.90218\\-164.5053\\19\\-67.19982\\-166.4584\\19\\-67.93353\\-168.4115\\19\\-69.03991\\-170.3646\\19\\-69.54391\\-172.3178\\19\\-71.4848\\-176.224\\19\\-71.51192\\-178.1771\\19\\-71.88187\\-180.1303\\19\\-73.00602\\-182.0834\\19\\-73.52402\\-184.0365\\19\\-74.49497\\-185.8729\\19\\-76.4481\\-188.3928\\19\\-77.32999\\-189.8959\\19\\-79.28013\\-193.8021\\19\\-79.57014\\-195.7553\\19\\-80.98593\\-197.7084\\19\\-81.51019\\-199.6615\\19\\-81.84551\\-201.6146\\19\\-83.03989\\-203.5678\\19\\-83.32128\\-205.5209\\19\\-83.32128\\-207.474\\19\\-83.47842\\-209.4271\\19\\-83.76376\\-211.3803\\19\\-83.89362\\-213.3334\\19\\-85.26134\\-215.2865\\19\\-86.21372\\-216.2885\\19\\-88.16685\\-217.0158\\19\\-90.11997\\-217.0158\\19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "146" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "419" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-219.7547\\19\\1.803628\\-217.2396\\19\\-0.276226\\-215.2189\\19\\-2.229351\\-213.1188\\19\\-3.249316\\-211.3803\\19\\-3.302256\\-209.4271\\19\\-3.547185\\-207.474\\19\\-3.969283\\-205.5209\\19\\-3.970774\\-199.6615\\19\\-4.856516\\-197.7084\\19\\-5.26414\\-195.7553\\19\\-5.37659\\-193.8021\\19\\-5.662298\\-191.849\\19\\-6.135601\\-190.5843\\19\\-8.115359\\-189.8959\\19\\-10.08394\\-191.849\\19\\-11.99498\\-194.1953\\19\\-13.9481\\-195.3367\\19\\-15.90123\\-195.2791\\19\\-17.85435\\-194.7244\\19\\-19.80748\\-193.3304\\19\\-21.7606\\-191.6377\\19\\-23.71373\\-191.0544\\19\\-25.66685\\-190.8206\\19\\-31.52623\\-190.6956\\19\\-33.47935\\-189.7672\\19\\-35.43248\\-189.1946\\19\\-37.3856\\-188.8578\\19\\-39.33873\\-187.7058\\19\\-41.29185\\-187.2356\\19\\-43.24498\\-185.7914\\19\\-45.1981\\-184.9548\\19\\-45.82589\\-184.0365\\19\\-48.03736\\-180.1303\\19\\-48.30195\\-178.1771\\19\\-49.10435\\-176.5825\\19\\-49.54686\\-176.224\\19\\-51.05748\\-175.5751\\19\\-53.0106\\-176.8431\\19\\-54.96373\\-180.0473\\19\\-55.90326\\-178.1771\\19\\-55.64329\\-176.224\\19\\-55.63981\\-174.2709\\19\\-55.21121\\-172.3178\\19\\-55.59226\\-170.3646\\19\\-54.96373\\-169.346\\19\\-53.0106\\-168.1335\\19\\-51.05748\\-167.3223\\19\\-50.11033\\-166.4584\\19\\-49.94775\\-164.5053\\19\\-49.91108\\-160.599\\19\\-49.34171\\-158.6459\\19\\-48.2442\\-156.6928\\19\\-47.15123\\-155.1646\\19\\-45.1981\\-154.0507\\19\\-43.1562\\-152.7865\\19\\-41.29185\\-152.1375\\19\\-39.42751\\-152.7865\\19\\-37.3856\\-153.8202\\19\\-35.43248\\-153.8851\\19\\-33.58275\\-154.7396\\19\\-31.52623\\-155.8301\\19\\-29.5731\\-156.454\\19\\-27.61998\\-157.8661\\19\\-25.66685\\-157.9172\\19\\-23.71373\\-156.6213\\19\\-21.7606\\-156.0832\\19\\-19.80748\\-156.7012\\19\\-17.62899\\-158.6459\\19\\-13.9481\\-160.8137\\19\\-11.99498\\-161.638\\19\\-10.83105\\-162.5521\\19\\-9.152741\\-164.5053\\19\\-7.245331\\-168.4115\\19\\-6.127972\\-170.3646\\19\\-5.853774\\-172.3178\\19\\-5.459128\\-174.2709\\19\\-4.902313\\-176.224\\19\\-3.867663\\-178.1771\\19\\-3.729492\\-180.1303\\19\\-3.711633\\-182.0834\\19\\-3.210352\\-184.0365\\19\\-1.776367\\-185.9896\\19\\-1.315637\\-187.9428\\19\\-0.276226\\-189.8343\\19\\1.676899\\-190.7383\\19\\3.630024\\-190.3929\\19\\5.583149\\-189.7605\\19\\9.489399\\-189.9913\\19\\13.39565\\-189.6602\\19\\19.25502\\-189.6368\\19\\23.16127\\-189.425\\19\\25.1144\\-189.5704\\19\\29.02065\\-189.6484\\19\\30.97377\\-189.5289\\19\\32.9269\\-188.847\\19\\34.88002\\-186.9815\\19\\36.83315\\-185.2693\\19\\38.78627\\-184.8149\\19\\40.7394\\-183.3667\\19\\42.69252\\-183.0764\\19\\44.64565\\-182.95\\19\\46.59877\\-182.5717\\19\\50.50502\\-183.2849\\19\\52.45815\\-184.8535\\19\\54.14559\\-185.9896\\19\\56.3644\\-188.1335\\19\\57.49233\\-189.8959\\19\\58.98037\\-191.849\\19\\59.19263\\-193.8021\\19\\59.19727\\-195.7553\\19\\59.44755\\-197.7084\\19\\60.27065\\-198.5814\\19\\62.22377\\-199.8359\\19\\63.59959\\-201.6146\\19\\64.86411\\-203.5678\\19\\64.1769\\-204.2737\\19\\62.22377\\-204.4171\\19\\60.27065\\-202.4589\\19\\58.31752\\-202.6106\\19\\57.41432\\-203.5678\\19\\57.19072\\-205.5209\\19\\55.93105\\-207.474\\19\\54.81558\\-209.4271\\19\\52.45815\\-212.0139\\19\\50.50502\\-213.5724\\19\\48.5519\\-214.5349\\19\\46.59877\\-215.9466\\19\\44.64565\\-216.7867\\19\\42.69252\\-217.0158\\19\\36.83315\\-217.0158\\19\\36.46694\\-217.2396\\19\\32.9269\\-218.8672\\19\\30.97377\\-219.6547\\19\\29.02065\\-220.2476\\19\\27.06752\\-220.6663\\19\\25.1144\\-220.7891\\19\\23.16127\\-220.7789\\19\\21.20815\\-220.6663\\19\\19.25502\\-220.2552\\19\\17.3019\\-219.7064\\19\\15.34877\\-219.731\\19\\13.39565\\-220.2593\\19\\11.44252\\-220.6292\\19\\9.489399\\-220.6292\\19\\7.536274\\-220.2733\\19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002292" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "145" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "420" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-212.0553\\19\\85.09934\\-211.3803\\19\\84.70255\\-209.4271\\19\\83.46066\\-207.474\\19\\83.21987\\-205.5209\\19\\82.45755\\-201.6146\\19\\81.30843\\-199.6615\\19\\80.63124\\-197.7084\\19\\79.07986\\-195.7553\\19\\78.71832\\-193.8021\\19\\77.61768\\-191.849\\19\\76.78484\\-189.8959\\19\\75.72018\\-187.9428\\19\\74.82886\\-185.9896\\19\\73.76033\\-184.0365\\19\\72.88548\\-182.0834\\19\\71.86458\\-180.1303\\19\\70.99281\\-178.1771\\19\\70.39675\\-176.224\\19\\69.3424\\-174.2709\\19\\68.9295\\-172.3178\\19\\67.84962\\-170.3646\\19\\64.1769\\-166.4506\\19\\62.84813\\-164.5053\\19\\61.41227\\-162.5521\\19\\61.01492\\-160.599\\19\\58.31752\\-157.7836\\19\\55.19357\\-154.7396\\19\\53.26838\\-152.7865\\19\\51.52951\\-150.8334\\19\\50.50502\\-150.0067\\19\\48.5519\\-149.89\\19\\46.59877\\-149.1523\\19\\44.64565\\-148.0865\\19\\42.69252\\-147.457\\19\\42.36269\\-146.9271\\19\\43.20987\\-144.974\\19\\43.60608\\-143.0209\\19\\42.69252\\-142.0491\\19\\40.7394\\-142.1165\\19\\38.78627\\-142.5561\\19\\36.83315\\-142.2812\\19\\32.9269\\-142.0102\\19\\30.97377\\-141.4348\\19\\29.02065\\-140.1099\\19\\28.05317\\-139.1146\\19\\26.6905\\-137.1615\\19\\25.8309\\-135.2084\\19\\25.1144\\-134.4958\\19\\23.29303\\-133.2553\\19\\23.32643\\-131.3021\\19\\25.1144\\-130.1102\\19\\27.06752\\-128.5361\\19\\29.02065\\-127.8118\\19\\30.97377\\-127.8023\\19\\32.9269\\-126.5777\\19\\34.88002\\-125.0121\\19\\37.06424\\-123.4896\\19\\38.78627\\-122.4642\\19\\40.7394\\-122.584\\19\\41.71148\\-123.4896\\19\\42.27658\\-125.4428\\19\\41.98096\\-127.3959\\19\\41.55091\\-129.349\\19\\40.38028\\-131.3021\\19\\40.39288\\-133.2553\\19\\41.94087\\-135.2084\\19\\42.69252\\-135.8936\\19\\43.72627\\-137.1615\\19\\43.57414\\-139.1146\\19\\44.64565\\-140.3523\\19\\46.0832\\-139.1146\\19\\46.00606\\-135.2084\\19\\45.47918\\-133.2553\\19\\45.7667\\-131.3021\\19\\47.16415\\-129.349\\19\\47.58402\\-127.3959\\19\\48.08993\\-123.4896\\19\\48.22638\\-121.5365\\19\\48.10801\\-119.5834\\19\\47.70671\\-117.6303\\19\\46.91779\\-115.6771\\19\\45.79205\\-113.724\\19\\45.48341\\-111.7709\\19\\43.60434\\-109.8178\\19\\42.65496\\-107.8646\\19\\41.86797\\-105.9115\\19\\40.87684\\-103.9584\\19\\41.10982\\-102.0053\\19\\44.25055\\-100.0521\\19\\44.64565\\-99.71604\\19\\46.59877\\-99.24658\\19\\48.41965\\-100.0521\\19\\50.50502\\-101.3843\\19\\52.45815\\-102.9818\\19\\53.94007\\-103.9584\\19\\56.3644\\-106.4224\\19\\57.43192\\-107.8646\\19\\59.02365\\-109.8178\\19\\60.47009\\-111.7709\\19\\61.25132\\-113.724\\19\\62.22377\\-115.2172\\19\\62.66113\\-115.6771\\19\\63.26627\\-117.6303\\19\\63.67159\\-119.5834\\19\\64.92165\\-121.5365\\19\\65.48069\\-123.4896\\19\\65.62471\\-125.4428\\19\\67.26482\\-129.349\\19\\67.65778\\-131.3021\\19\\68.78693\\-133.2553\\19\\70.4548\\-137.1615\\19\\71.16203\\-139.1146\\19\\72.24849\\-141.0678\\19\\73.08917\\-143.0209\\19\\73.64956\\-144.974\\19\\73.94253\\-145.427\\19\\75.60268\\-148.8803\\19\\76.648\\-150.8334\\19\\78.25517\\-152.7865\\19\\78.96281\\-154.7396\\19\\82.24619\\-158.6459\\19\\82.87045\\-160.599\\19\\84.61873\\-162.5521\\19\\87.17277\\-166.4584\\19\\87.6144\\-166.9057\\19\\89.56753\\-169.3759\\19\\92.29022\\-172.3178\\19\\93.95338\\-176.224\\19\\95.11208\\-180.1303\\19\\95.41927\\-182.0834\\19\\95.43453\\-185.9896\\19\\95.27829\\-187.9428\\19\\95.92374\\-189.8959\\19\\95.94058\\-191.849\\19\\95.44961\\-193.8021\\19\\95.11\\-197.7084\\19\\94.60677\\-199.6615\\19\\94.33835\\-201.6146\\19\\94.32938\\-203.5678\\19\\93.84076\\-205.5209\\19\\93.18081\\-207.474\\19\\93.18081\\-211.3803\\19\\91.52065\\-212.927\\19\\87.6144\\-212.9367\\19" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "188" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "421" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-216.8828\\21\\-93.69014\\-215.2865\\21\\-92.60489\\-213.3334\\21\\-92.0731\\-212.9869\\21\\-90.11997\\-212.6489\\21\\-89.42386\\-211.3803\\21\\-88.76907\\-209.4271\\21\\-87.77012\\-207.474\\21\\-89.48633\\-205.5209\\21\\-90.11997\\-205.0326\\21\\-90.70869\\-205.5209\\21\\-93.58846\\-207.474\\21\\-94.02622\\-207.8758\\21\\-95.97935\\-206.1287\\21\\-96.48466\\-205.5209\\21\\-96.8591\\-203.5678\\21\\-96.97268\\-201.6146\\21\\-98.42075\\-199.6615\\21\\-98.83487\\-197.7084\\21\\-98.92135\\-193.8021\\21\\-99.2161\\-191.849\\21\\-98.92552\\-189.8959\\21\\-98.83929\\-187.9428\\21\\-98.83487\\-184.0365\\21\\-98.63422\\-182.0834\\21\\-97.60696\\-180.1303\\21\\-96.52557\\-176.224\\21\\-93.27387\\-172.3178\\21\\-92.46004\\-170.3646\\21\\-92.0731\\-169.9461\\21\\-89.40653\\-166.4584\\21\\-88.6377\\-164.5053\\21\\-87.40942\\-162.5521\\21\\-86.57055\\-160.599\\21\\-85.42056\\-158.6459\\21\\-84.61166\\-156.6928\\21\\-83.4204\\-154.7396\\21\\-82.78399\\-152.7865\\21\\-81.44759\\-150.8334\\21\\-81.01739\\-148.8803\\21\\-79.85751\\-146.9271\\21\\-79.38999\\-144.974\\21\\-79.07072\\-143.0209\\21\\-78.0547\\-141.0678\\21\\-77.44981\\-139.1146\\21\\-77.07663\\-137.1615\\21\\-76.4481\\-135.3152\\21\\-75.57552\\-133.2553\\21\\-75.07984\\-131.3021\\21\\-74.47227\\-129.349\\21\\-74.35954\\-127.3959\\21\\-73.02146\\-123.4896\\21\\-72.21633\\-121.5365\\21\\-70.58872\\-118.1028\\21\\-70.29575\\-117.6303\\21\\-67.32034\\-111.7709\\21\\-65.83307\\-109.8178\\21\\-64.72935\\-108.8182\\21\\-62.77623\\-108.4343\\21\\-60.8231\\-109.0138\\21\\-58.86998\\-110.9034\\21\\-57.83121\\-111.7709\\21\\-56.16064\\-113.724\\21\\-57.48651\\-115.6771\\21\\-57.85289\\-117.6303\\21\\-58.35629\\-119.5834\\21\\-58.42608\\-121.5365\\21\\-58.36466\\-123.4896\\21\\-57.74591\\-125.4428\\21\\-55.71377\\-127.3959\\21\\-53.0106\\-131.0828\\21\\-51.05748\\-131.3687\\21\\-50.39444\\-129.349\\21\\-50.89589\\-127.3959\\21\\-50.89589\\-125.4428\\21\\-48.77883\\-121.5365\\21\\-47.8591\\-119.5834\\21\\-47.15123\\-118.8866\\21\\-45.1981\\-118.4552\\21\\-43.24498\\-116.8291\\21\\-41.29185\\-116.5235\\21\\-39.33873\\-116.5332\\21\\-37.3856\\-116.7365\\21\\-35.43248\\-118.3919\\21\\-33.47935\\-118.8281\\21\\-31.52623\\-120.6218\\21\\-29.5731\\-121.3627\\21\\-27.61998\\-120.0885\\21\\-27.61998\\-119.4741\\21\\-29.5731\\-118.5542\\21\\-30.5108\\-117.6303\\21\\-31.19639\\-115.6771\\21\\-29.5731\\-114.6296\\21\\-25.66685\\-116.5123\\21\\-23.71373\\-116.5985\\21\\-22.32598\\-117.6303\\21\\-21.05885\\-119.5834\\21\\-19.80748\\-120.9903\\21\\-17.85435\\-123.0249\\21\\-15.90123\\-124.4054\\21\\-13.9481\\-125.0268\\21\\-11.99498\\-125.8681\\21\\-10.04185\\-126.2467\\21\\-8.088726\\-126.4828\\21\\-2.229351\\-126.4926\\21\\-0.276226\\-126.5345\\21\\1.676899\\-126.3651\\21\\3.630024\\-126.0425\\21\\5.583149\\-126.388\\21\\6.745723\\-127.3959\\21\\8.369536\\-131.3021\\21\\9.962703\\-133.2553\\21\\10.04185\\-135.2084\\21\\8.843969\\-137.1615\\21\\7.536274\\-138.2101\\21\\5.583149\\-139.047\\21\\3.630024\\-140.3442\\21\\1.676899\\-140.4943\\21\\-2.229351\\-140.4622\\21\\-4.182476\\-140.2327\\21\\-5.441728\\-139.1146\\21\\-8.088726\\-136.2525\\21\\-11.18475\\-133.2553\\21\\-13.9481\\-130.5074\\21\\-15.90123\\-129.9109\\21\\-17.85435\\-129.9187\\21\\-19.80748\\-130.4915\\21\\-21.7606\\-131.6277\\21\\-23.71373\\-132.0522\\21\\-25.66685\\-132.3221\\21\\-27.61998\\-133.3917\\21\\-29.5731\\-134.2926\\21\\-30.96536\\-135.2084\\21\\-31.52623\\-135.7145\\21\\-34.30672\\-139.1146\\21\\-39.33873\\-144.158\\21\\-41.29185\\-146.0698\\21\\-43.21414\\-146.9271\\21\\-45.1981\\-148.0512\\21\\-46.92831\\-148.8803\\21\\-47.38969\\-148.8803\\21\\-49.10435\\-147.3442\\21\\-50.05766\\-146.9271\\21\\-49.10435\\-146.3205\\21\\-48.46959\\-144.974\\21\\-48.23876\\-143.0209\\21\\-51.05748\\-142.0874\\21\\-53.0106\\-142.4212\\21\\-53.887\\-144.974\\21\\-53.0106\\-146.1261\\21\\-51.78148\\-146.9271\\21\\-52.53833\\-148.8803\\21\\-53.0106\\-149.2618\\21\\-54.96373\\-149.3849\\21\\-56.91685\\-150.3451\\21\\-58.86998\\-151.9488\\21\\-61.69913\\-154.7396\\21\\-62.45071\\-156.6928\\21\\-63.71133\\-158.6459\\21\\-65.28181\\-160.599\\21\\-65.93683\\-162.5521\\21\\-67.19122\\-164.5053\\21\\-68.30785\\-166.4584\\21\\-69.61695\\-168.4115\\21\\-70.38787\\-170.3646\\21\\-71.53524\\-172.3178\\21\\-72.40542\\-174.2709\\21\\-73.42314\\-176.224\\21\\-73.49796\\-178.1771\\21\\-74.23232\\-180.1303\\21\\-75.42576\\-182.0834\\21\\-76.06377\\-184.0365\\21\\-77.33466\\-185.9896\\21\\-79.32834\\-189.8959\\21\\-79.52589\\-191.849\\21\\-80.90681\\-193.8021\\21\\-81.36723\\-195.7553\\21\\-81.57145\\-197.7084\\21\\-83.05223\\-199.6615\\21\\-83.34997\\-201.6146\\21\\-83.74692\\-205.5209\\21\\-83.78099\\-209.4271\\21\\-83.86387\\-211.3803\\21\\-84.96107\\-213.3334\\21\\-85.55088\\-215.2865\\21\\-86.21372\\-216.0714\\21\\-88.16685\\-217.0158\\21\\-90.11997\\-217.0111\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "142" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "422" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-220.0305\\21\\3.630024\\-218.9453\\21\\1.676899\\-218.072\\21\\-0.276226\\-216.5036\\21\\-1.980159\\-215.2865\\21\\-3.452471\\-213.3334\\21\\-3.95868\\-211.3803\\21\\-4.746092\\-209.4271\\21\\-5.252857\\-207.474\\21\\-5.295405\\-203.5678\\21\\-5.370314\\-201.6146\\21\\-5.555089\\-199.6615\\21\\-5.910241\\-197.7084\\21\\-6.135601\\-197.2545\\21\\-7.656249\\-195.7553\\21\\-8.088726\\-195.5327\\21\\-10.37779\\-197.7084\\21\\-13.9481\\-200.9571\\21\\-15.90123\\-200.9108\\21\\-17.85435\\-200.2583\\21\\-19.80748\\-198.9695\\21\\-21.7606\\-197.1403\\21\\-23.71373\\-196.4945\\21\\-24.69029\\-195.7553\\21\\-25.66685\\-195.2208\\21\\-27.61998\\-194.7713\\21\\-31.52623\\-194.7225\\21\\-33.47935\\-194.5694\\21\\-35.43248\\-193.2891\\21\\-37.3856\\-192.776\\21\\-39.33873\\-192.6381\\21\\-41.29185\\-191.349\\21\\-43.24498\\-190.8173\\21\\-45.1981\\-190.4416\\21\\-47.15123\\-189.2423\\21\\-48.46088\\-187.9428\\21\\-49.77532\\-185.9896\\21\\-50.18467\\-182.0834\\21\\-50.79114\\-180.1303\\21\\-51.05748\\-179.8481\\21\\-53.0106\\-180.6111\\21\\-54.96373\\-182.2461\\21\\-55.15247\\-182.0834\\21\\-55.9747\\-180.1303\\21\\-55.11234\\-176.224\\21\\-55.31025\\-174.2709\\21\\-56.0923\\-170.3646\\21\\-56.31454\\-168.4115\\21\\-54.96373\\-167.4433\\21\\-53.0106\\-167.7901\\21\\-51.95414\\-168.4115\\21\\-49.10435\\-170.3548\\21\\-48.08104\\-168.4115\\21\\-48.02421\\-166.4584\\21\\-48.02421\\-162.5521\\21\\-47.96676\\-160.599\\21\\-47.0931\\-158.6459\\21\\-45.1981\\-157.7566\\21\\-43.24498\\-156.4128\\21\\-41.29185\\-155.7656\\21\\-35.43248\\-155.9062\\21\\-33.79756\\-156.6928\\21\\-31.52623\\-158.3719\\21\\-29.0675\\-160.599\\21\\-27.61998\\-161.6195\\21\\-25.66685\\-161.6481\\21\\-23.71373\\-160.3074\\21\\-21.7606\\-159.7932\\21\\-19.80748\\-159.825\\21\\-17.85435\\-160.9652\\21\\-15.90123\\-161.729\\21\\-13.9481\\-161.9532\\21\\-13.20053\\-162.5521\\21\\-10.39394\\-164.5053\\21\\-8.833998\\-166.4584\\21\\-7.609112\\-168.4115\\21\\-6.083418\\-172.3178\\21\\-5.865067\\-174.2709\\21\\-5.217927\\-176.224\\21\\-4.115892\\-178.1771\\21\\-3.923388\\-182.0834\\21\\-2.981784\\-184.0365\\21\\-2.229351\\-184.7426\\21\\-0.3588582\\-185.9896\\21\\1.676899\\-188.1937\\21\\3.630024\\-188.9103\\21\\5.583149\\-188.9279\\21\\7.536274\\-189.1659\\21\\9.489399\\-189.5704\\21\\11.44252\\-189.6484\\21\\23.16127\\-189.6484\\21\\27.06752\\-189.8883\\21\\29.02065\\-189.7343\\21\\30.97377\\-189.161\\21\\32.58185\\-187.9428\\21\\34.88002\\-185.6641\\21\\36.83315\\-184.8533\\21\\38.78627\\-183.2506\\21\\40.7394\\-182.9384\\21\\42.69252\\-182.5273\\21\\46.59877\\-182.2055\\21\\48.5519\\-182.3652\\21\\50.50502\\-182.9185\\21\\52.45815\\-183.3151\\21\\54.41127\\-185.1612\\21\\56.3644\\-186.7797\\21\\57.48249\\-187.9428\\21\\59.01295\\-189.8959\\21\\59.43424\\-191.849\\21\\59.96669\\-193.8021\\21\\60.00011\\-195.7553\\21\\60.23309\\-197.7084\\21\\62.33712\\-199.6615\\21\\64.1769\\-200.7517\\21\\64.97244\\-201.6146\\21\\65.26755\\-203.5678\\21\\64.1769\\-204.5609\\21\\62.22377\\-202.7915\\21\\60.27065\\-202.3986\\21\\58.86374\\-203.5678\\21\\57.11293\\-207.474\\21\\55.51709\\-209.4271\\21\\54.41127\\-210.6144\\21\\52.45815\\-212.2315\\21\\50.50502\\-214.074\\21\\48.5519\\-214.9195\\21\\46.59877\\-215.5905\\21\\44.64565\\-216.3598\\21\\42.69252\\-216.8429\\21\\38.78627\\-217.0158\\21\\36.83315\\-217.0158\\21\\32.9269\\-218.3054\\21\\30.97377\\-218.8672\\21\\29.02065\\-219.6087\\21\\25.1144\\-220.2407\\21\\23.16127\\-220.2503\\21\\19.25502\\-219.6981\\21\\17.3019\\-219.098\\21\\13.39565\\-220.7689\\21\\11.44252\\-220.8984\\21\\9.489399\\-220.8984\\21\\7.536274\\-220.7689\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "423" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-148.3082\\21\\39.66383\\-146.9271\\21\\38.78627\\-145.2115\\21\\36.83315\\-144.1881\\21\\34.88002\\-143.8736\\21\\32.9269\\-142.2387\\21\\30.97377\\-141.6601\\21\\29.02065\\-140.2855\\21\\27.82597\\-139.1146\\21\\26.24632\\-137.1615\\21\\25.41133\\-135.2084\\21\\23.89761\\-133.2553\\21\\23.85515\\-131.3021\\21\\25.1144\\-130.0998\\21\\27.06752\\-128.5361\\21\\29.02065\\-127.8118\\21\\30.97377\\-127.8023\\21\\32.9269\\-126.5777\\21\\34.04371\\-125.4428\\21\\36.83315\\-122.009\\21\\38.78627\\-121.2325\\21\\40.7394\\-122.7223\\21\\41.51782\\-123.4896\\21\\42.24863\\-125.4428\\21\\43.18369\\-127.3959\\21\\42.7887\\-129.349\\21\\41.59719\\-131.3021\\21\\41.4057\\-133.2553\\21\\42.01605\\-135.2084\\21\\43.43588\\-137.1615\\21\\43.25446\\-139.1146\\21\\42.40491\\-141.0678\\21\\40.27523\\-143.0209\\21\\39.46236\\-144.974\\21\\40.7394\\-145.3175\\21\\42.69252\\-146.4686\\21\\43.66909\\-146.9271\\21\\42.69252\\-147.7023\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002291" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "108" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "424" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "85.66128\\-212.0553\\21\\85.09934\\-211.3803\\21\\84.85046\\-209.4271\\21\\84.73334\\-207.474\\21\\84.48656\\-205.5209\\21\\83.35133\\-203.5678\\21\\82.95071\\-201.6146\\21\\82.7438\\-199.6615\\21\\80.78746\\-195.7553\\21\\80.40163\\-193.8021\\21\\79.01577\\-191.849\\21\\78.72324\\-189.8959\\21\\77.72107\\-187.9428\\21\\76.82213\\-185.9896\\21\\74.87331\\-182.0834\\21\\73.83321\\-180.1303\\21\\71.03152\\-174.2709\\21\\70.39919\\-172.3178\\21\\69.32839\\-170.3646\\21\\68.08315\\-168.5402\\21\\64.04047\\-164.5053\\21\\63.22068\\-162.5521\\21\\62.22377\\-161.4792\\21\\59.19322\\-158.6459\\21\\58.31752\\-157.7448\\21\\54.41127\\-153.9488\\21\\52.45815\\-152.5274\\21\\50.50502\\-151.5796\\21\\48.5519\\-150.8856\\21\\46.59877\\-149.7722\\21\\45.90914\\-148.8803\\21\\45.11562\\-146.9271\\21\\45.54745\\-144.974\\21\\45.87123\\-141.0678\\21\\46.1734\\-139.1146\\21\\46.17077\\-135.2084\\21\\45.81477\\-133.2553\\21\\46.98812\\-131.3021\\21\\47.85934\\-129.349\\21\\48.02177\\-127.3959\\21\\48.13596\\-123.4896\\21\\47.72453\\-121.5365\\21\\47.48039\\-119.5834\\21\\46.73421\\-117.6303\\21\\45.70474\\-115.6771\\21\\44.1488\\-113.724\\21\\43.13912\\-109.8178\\21\\43.57187\\-107.8646\\21\\43.72677\\-105.9115\\21\\43.77808\\-102.0053\\21\\44.42185\\-100.0521\\21\\44.64565\\-99.82834\\21\\46.59877\\-99.1113\\21\\48.5519\\-99.53845\\21\\50.50502\\-101.0584\\21\\52.45815\\-101.8968\\21\\54.41127\\-103.0358\\21\\55.72835\\-103.9584\\21\\56.3644\\-104.5626\\21\\58.71425\\-107.8646\\21\\59.33711\\-109.8178\\21\\60.91652\\-111.7709\\21\\61.63891\\-113.724\\21\\62.96713\\-115.6771\\21\\63.56985\\-117.6303\\21\\63.7705\\-119.5834\\21\\65.02263\\-121.5365\\21\\65.58381\\-123.4896\\21\\65.70465\\-125.4428\\21\\66.87432\\-127.3959\\21\\67.4761\\-129.349\\21\\69.2653\\-133.2553\\21\\70.35317\\-135.2084\\21\\71.19081\\-137.1615\\21\\71.62241\\-139.1146\\21\\72.74624\\-141.0678\\21\\74.46448\\-144.974\\21\\75.1252\\-146.9271\\21\\76.45758\\-148.8803\\21\\77.04539\\-150.8334\\21\\79.8019\\-154.2223\\21\\80.30721\\-154.7396\\21\\80.84271\\-156.6928\\21\\82.60047\\-158.6459\\21\\84.22482\\-160.599\\21\\84.84007\\-162.5521\\21\\87.6144\\-165.7141\\21\\88.3547\\-166.4584\\21\\91.20191\\-170.3646\\21\\92.6935\\-172.3178\\21\\93.90846\\-174.2709\\21\\95.13393\\-178.1771\\21\\95.95703\\-180.1303\\21\\96.29447\\-182.0834\\21\\96.29836\\-187.9428\\21\\96.51545\\-189.8959\\21\\96.48936\\-191.849\\21\\96.29836\\-193.8021\\21\\96.2896\\-197.7084\\21\\95.94058\\-199.6615\\21\\95.14507\\-201.6146\\21\\94.99221\\-203.5678\\21\\94.25212\\-205.5209\\21\\93.23805\\-207.474\\21\\93.18081\\-211.3803\\21\\91.52065\\-212.9869\\21\\89.56753\\-213.0294\\21\\87.6144\\-212.9367\\21" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "184" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "425" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-216.9096\\23\\-93.73051\\-215.2865\\23\\-92.0731\\-213.9568\\23\\-90.11997\\-213.3967\\23\\-89.72324\\-211.3803\\23\\-89.00608\\-209.4271\\23\\-88.16685\\-208.1584\\23\\-87.51824\\-207.474\\23\\-88.16685\\-206.8054\\23\\-90.11997\\-205.3214\\23\\-92.0731\\-206.58\\23\\-94.02622\\-208.4186\\23\\-95.97935\\-207.9928\\23\\-96.46763\\-207.474\\23\\-97.58595\\-203.5678\\23\\-97.72077\\-201.6146\\23\\-98.76503\\-199.6615\\23\\-99.22947\\-197.7084\\23\\-99.25707\\-195.7553\\23\\-99.41476\\-193.8021\\23\\-99.6739\\-191.849\\23\\-99.42364\\-187.9428\\23\\-99.25006\\-184.0365\\23\\-98.62152\\-180.1303\\23\\-97.61766\\-178.1771\\23\\-97.03069\\-176.224\\23\\-95.97935\\-174.4558\\23\\-94.52599\\-172.3178\\23\\-92.88005\\-170.3646\\23\\-91.37556\\-168.4115\\23\\-90.58472\\-166.4584\\23\\-89.38878\\-164.5053\\23\\-88.52367\\-162.5521\\23\\-88.16685\\-162.176\\23\\-86.21372\\-159.2757\\23\\-85.70841\\-158.6459\\23\\-85.11084\\-156.6928\\23\\-83.73047\\-154.7396\\23\\-83.43428\\-152.7865\\23\\-82.69686\\-150.8334\\23\\-81.42312\\-148.8803\\23\\-81.01392\\-146.9271\\23\\-79.87474\\-144.974\\23\\-79.38989\\-143.0209\\23\\-79.07072\\-141.0678\\23\\-78.07571\\-139.1146\\23\\-77.45848\\-137.1615\\23\\-77.00222\\-135.2084\\23\\-76.14413\\-133.2553\\23\\-74.38647\\-127.3959\\23\\-74.18016\\-125.4428\\23\\-73.22142\\-123.4896\\23\\-72.39324\\-121.5365\\23\\-71.78658\\-119.5834\\23\\-70.93525\\-117.6303\\23\\-69.84445\\-115.6771\\23\\-69.01746\\-113.724\\23\\-68.6356\\-113.1673\\23\\-66.86068\\-109.8178\\23\\-64.72935\\-107.8262\\23\\-62.77623\\-106.9621\\23\\-60.8231\\-108.1138\\23\\-58.86998\\-108.9286\\23\\-56.91685\\-109.1396\\23\\-56.20299\\-109.8178\\23\\-55.72535\\-111.7709\\23\\-55.54859\\-113.724\\23\\-56.0186\\-115.6771\\23\\-57.45507\\-117.6303\\23\\-57.7681\\-119.5834\\23\\-57.91464\\-121.5365\\23\\-58.39036\\-123.4896\\23\\-57.90258\\-125.4428\\23\\-56.24706\\-127.3959\\23\\-55.67889\\-129.349\\23\\-53.88053\\-131.3021\\23\\-53.0106\\-132.0552\\23\\-51.05748\\-132.488\\23\\-49.50812\\-133.2553\\23\\-49.10435\\-133.5912\\23\\-48.61607\\-133.2553\\23\\-48.77883\\-131.3021\\23\\-50.27729\\-129.349\\23\\-50.97671\\-127.3959\\23\\-50.82175\\-125.4428\\23\\-49.78164\\-123.4896\\23\\-48.26661\\-121.5365\\23\\-46.51313\\-119.5834\\23\\-44.00508\\-117.6303\\23\\-43.24498\\-116.8855\\23\\-41.29185\\-116.488\\23\\-39.33873\\-116.472\\23\\-37.3856\\-116.5751\\23\\-35.43248\\-117.2023\\23\\-33.47935\\-118.726\\23\\-31.52623\\-120.3885\\23\\-30.26639\\-119.5834\\23\\-30.7061\\-117.6303\\23\\-30.37769\\-115.6771\\23\\-29.5731\\-115.0143\\23\\-27.61998\\-114.9176\\23\\-25.66685\\-116.3912\\23\\-24.79737\\-117.6303\\23\\-23.71373\\-118.8534\\23\\-21.7606\\-119.1487\\23\\-19.80748\\-120.6925\\23\\-17.85435\\-122.7093\\23\\-15.90123\\-124.0279\\23\\-13.9481\\-124.4228\\23\\-11.99498\\-124.5888\\23\\-8.088726\\-124.5463\\23\\-6.135601\\-124.6117\\23\\-2.229351\\-124.6388\\23\\1.676899\\-125.7893\\23\\3.630024\\-125.7246\\23\\5.583149\\-125.9564\\23\\7.022591\\-127.3959\\23\\7.26574\\-129.349\\23\\8.265953\\-131.3021\\23\\8.875712\\-133.2553\\23\\8.730388\\-135.2084\\23\\9.122411\\-137.1615\\23\\8.434081\\-139.1146\\23\\7.536274\\-139.9982\\23\\5.583149\\-142.2752\\23\\3.642544\\-143.0209\\23\\1.676899\\-144.1685\\23\\-2.229351\\-144.19\\23\\-4.115892\\-143.0209\\23\\-5.142557\\-141.0678\\23\\-5.507069\\-139.1146\\23\\-7.284788\\-137.1615\\23\\-11.19356\\-133.2553\\23\\-12.64431\\-131.3021\\23\\-13.9481\\-130.0632\\23\\-15.90123\\-129.6638\\23\\-17.85435\\-129.6638\\23\\-21.7606\\-130.3121\\23\\-25.66685\\-131.7641\\23\\-27.61998\\-132.0843\\23\\-29.03886\\-133.2553\\23\\-32.34325\\-137.1615\\23\\-39.33873\\-144.158\\23\\-41.29185\\-145.8285\\23\\-43.24498\\-146.373\\23\\-45.1981\\-147.6787\\23\\-47.15123\\-148.4066\\23\\-49.10435\\-149.6064\\23\\-51.05748\\-149.5771\\23\\-53.0106\\-149.954\\23\\-54.96373\\-150.4564\\23\\-56.91685\\-150.7249\\23\\-58.86998\\-151.9985\\23\\-61.69913\\-154.7396\\23\\-63.33507\\-156.6928\\23\\-64.47026\\-158.6459\\23\\-65.96828\\-160.599\\23\\-68.38293\\-164.5053\\23\\-70.58872\\-166.8412\\23\\-71.55566\\-168.4115\\23\\-72.31805\\-170.3646\\23\\-73.51363\\-172.3178\\23\\-73.75747\\-174.2709\\23\\-75.03237\\-176.224\\23\\-75.48116\\-178.1771\\23\\-77.43861\\-182.0834\\23\\-77.55304\\-184.0365\\23\\-78.97729\\-185.9896\\23\\-79.49874\\-187.9428\\23\\-80.92913\\-189.8959\\23\\-81.44179\\-191.849\\23\\-81.54585\\-193.8021\\23\\-82.83961\\-195.7553\\23\\-83.41425\\-197.7084\\23\\-83.78099\\-201.6146\\23\\-84.95448\\-203.5678\\23\\-85.34332\\-205.5209\\23\\-85.40817\\-207.474\\23\\-84.83868\\-209.4271\\23\\-84.96107\\-211.3803\\23\\-85.4813\\-213.3334\\23\\-85.77904\\-215.2865\\23\\-86.21372\\-215.7957\\23\\-88.16685\\-216.9578\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "426" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-47.15123\\-112.0964\\23\\-47.57691\\-111.7709\\23\\-48.59969\\-109.8178\\23\\-47.15123\\-108.6254\\23\\-45.1981\\-108.7699\\23\\-43.24498\\-108.4188\\23\\-41.29185\\-109.2332\\23\\-40.7948\\-109.8178\\23\\-40.94308\\-111.7709\\23\\-41.29185\\-112.129\\23\\-43.24498\\-112.5901\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "141" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "427" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "3.630024\\-219.7547\\23\\1.676899\\-218.4812\\23\\-0.276226\\-217.7616\\23\\-2.229351\\-216.097\\23\\-3.061238\\-215.2865\\23\\-4.718739\\-213.3334\\23\\-5.304203\\-211.3803\\23\\-5.500061\\-209.4271\\23\\-6.000165\\-207.474\\23\\-6.143948\\-205.5209\\23\\-6.948161\\-203.5678\\23\\-8.088726\\-202.7468\\23\\-10.04185\\-202.9902\\23\\-11.99498\\-204.9085\\23\\-13.9481\\-204.9448\\23\\-15.90123\\-204.5401\\23\\-17.85435\\-203.2401\\23\\-19.80748\\-202.6241\\23\\-21.7606\\-202.5817\\23\\-23.71373\\-200.9804\\23\\-25.66685\\-200.5858\\23\\-27.61998\\-199.1183\\23\\-29.5731\\-198.6908\\23\\-33.47935\\-198.5746\\23\\-35.43248\\-197.289\\23\\-37.3856\\-196.7318\\23\\-41.29185\\-196.5932\\23\\-43.24498\\-195.2028\\23\\-45.1981\\-194.7432\\23\\-47.15123\\-194.6067\\23\\-49.10435\\-193.2046\\23\\-50.43373\\-191.849\\23\\-51.89688\\-189.8959\\23\\-52.10274\\-185.9896\\23\\-52.77488\\-184.0365\\23\\-53.0106\\-183.7991\\23\\-54.96373\\-183.3976\\23\\-56.70456\\-184.0365\\23\\-57.02536\\-184.0365\\23\\-56.69149\\-182.0834\\23\\-55.87247\\-180.1303\\23\\-54.28325\\-178.1771\\23\\-54.96373\\-176.3231\\23\\-55.86994\\-174.2709\\23\\-56.02387\\-172.3178\\23\\-56.43745\\-170.3646\\23\\-55.70225\\-168.4115\\23\\-54.96373\\-167.783\\23\\-53.0106\\-167.9495\\23\\-52.43054\\-168.4115\\23\\-50.80999\\-170.3646\\23\\-51.21907\\-172.3178\\23\\-51.05748\\-172.5097\\23\\-49.10435\\-173.3939\\23\\-47.57553\\-172.3178\\23\\-46.43139\\-170.3646\\23\\-46.16598\\-168.4115\\23\\-46.03447\\-162.5521\\23\\-45.1981\\-160.6539\\23\\-42.7053\\-158.6459\\23\\-41.29185\\-157.8402\\23\\-37.3856\\-157.8305\\23\\-35.43248\\-158.5645\\23\\-33.47935\\-159.7723\\23\\-31.87366\\-160.599\\23\\-29.5731\\-162.6361\\23\\-27.61998\\-163.7158\\23\\-23.71373\\-163.705\\23\\-21.7606\\-162.5761\\23\\-19.80748\\-162.4855\\23\\-17.85435\\-163.608\\23\\-13.9481\\-163.7436\\23\\-11.99498\\-164.8464\\23\\-10.04185\\-166.726\\23\\-8.798469\\-168.4115\\23\\-7.558592\\-170.3646\\23\\-6.069017\\-174.2709\\23\\-4.954981\\-178.1771\\23\\-4.087735\\-180.1303\\23\\-3.463686\\-182.0834\\23\\-2.229351\\-183.2754\\23\\-0.276226\\-184.8495\\23\\1.676899\\-185.7288\\23\\3.630024\\-187.3115\\23\\5.583149\\-187.8762\\23\\7.536274\\-188.6318\\23\\9.489399\\-189.1934\\23\\11.44252\\-189.6484\\23\\19.25502\\-189.6484\\23\\23.16127\\-189.8583\\23\\25.1144\\-190.6505\\23\\27.06752\\-190.9929\\23\\29.02065\\-190.5452\\23\\30.97377\\-188.9917\\23\\34.88002\\-185.0798\\23\\38.78627\\-183.0348\\23\\40.7394\\-182.3425\\23\\42.69252\\-182.2055\\23\\44.64565\\-182.2055\\23\\46.59877\\-182.091\\23\\48.5519\\-182.0758\\23\\50.50502\\-182.3539\\23\\52.45815\\-183.168\\23\\54.41127\\-184.8035\\23\\56.3644\\-185.3754\\23\\58.87164\\-187.9428\\23\\59.43943\\-189.8959\\23\\60.89918\\-191.849\\23\\61.20702\\-193.8021\\23\\61.21896\\-197.7084\\23\\62.22377\\-198.9062\\23\\64.1769\\-200.3446\\23\\65.35535\\-201.6146\\23\\64.1769\\-203.4303\\23\\62.22377\\-202.4254\\23\\60.27065\\-202.5771\\23\\59.3589\\-203.5678\\23\\58.97365\\-205.5209\\23\\57.56899\\-207.474\\23\\56.87315\\-209.4271\\23\\54.41127\\-211.8163\\23\\52.45815\\-212.6192\\23\\50.50502\\-214.1135\\23\\48.5519\\-215.0047\\23\\46.59877\\-215.039\\23\\44.64565\\-215.6433\\23\\40.7394\\-216.3598\\23\\38.78627\\-216.8503\\23\\34.88002\\-216.9227\\23\\32.9269\\-217.5652\\23\\30.97377\\-217.8958\\23\\29.02065\\-217.9351\\23\\27.06752\\-218.3656\\23\\25.1144\\-219.4633\\23\\23.16127\\-219.4402\\23\\21.20815\\-218.3763\\23\\19.25502\\-218.3305\\23\\17.3019\\-218.8888\\23\\15.34877\\-219.9927\\23\\13.39565\\-220.8868\\23\\7.536274\\-220.8868\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "428" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.59117\\-148.8803\\23\\38.78627\\-147.7816\\23\\36.83315\\-145.849\\23\\34.88002\\-144.5032\\23\\32.9269\\-143.5307\\23\\32.40732\\-143.0209\\23\\29.3989\\-141.0678\\23\\29.02065\\-140.7212\\23\\27.06752\\-139.7386\\23\\26.44361\\-139.1146\\23\\25.46317\\-137.1615\\23\\24.2742\\-135.2084\\23\\23.63494\\-133.2553\\23\\23.16127\\-131.2201\\23\\25.80514\\-129.349\\23\\27.06752\\-128.5361\\23\\29.02065\\-127.8118\\23\\30.97377\\-127.8023\\23\\32.9269\\-126.5777\\23\\34.00917\\-125.4428\\23\\35.02863\\-123.4896\\23\\35.66431\\-121.5365\\23\\36.83315\\-120.6043\\23\\38.78627\\-120.8285\\23\\41.48275\\-123.4896\\23\\42.30558\\-125.4428\\23\\43.49988\\-127.3959\\23\\43.67356\\-129.349\\23\\41.98096\\-131.3021\\23\\41.79206\\-133.2553\\23\\41.85736\\-135.2084\\23\\41.77856\\-137.1615\\23\\43.4441\\-139.1146\\23\\43.73884\\-141.0678\\23\\41.78302\\-144.974\\23\\42.4107\\-146.9271\\23\\40.89602\\-148.8803\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002290" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "109" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "429" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-213.9257\\23\\85.66128\\-211.8248\\23\\85.28425\\-211.3803\\23\\84.94707\\-207.474\\23\\84.75888\\-203.5678\\23\\84.75888\\-201.6146\\23\\84.30616\\-199.6615\\23\\82.92783\\-197.7084\\23\\82.75211\\-195.7553\\23\\81.58987\\-193.8021\\23\\80.80982\\-191.849\\23\\80.28725\\-189.8959\\23\\78.99195\\-187.9428\\23\\78.8159\\-185.9896\\23\\72.94202\\-174.2709\\23\\71.02653\\-170.3646\\23\\70.03628\\-168.6418\\23\\65.94302\\-164.5053\\23\\64.68871\\-162.5521\\23\\62.22377\\-159.9358\\23\\60.27065\\-158.7544\\23\\58.18982\\-156.6928\\23\\56.3644\\-155.4758\\23\\54.41127\\-153.8929\\23\\52.45815\\-153.1013\\23\\50.50502\\-151.9639\\23\\48.22006\\-150.8334\\23\\47.25861\\-148.8803\\23\\47.08706\\-146.9271\\23\\45.89077\\-144.974\\23\\46.24772\\-143.0209\\23\\46.28065\\-141.0678\\23\\46.1734\\-137.1615\\23\\46.18283\\-133.2553\\23\\47.64545\\-131.3021\\23\\48.09892\\-129.349\\23\\48.15517\\-125.4428\\23\\48.06362\\-123.4896\\23\\47.38503\\-121.5365\\23\\45.75599\\-119.5834\\23\\45.54743\\-117.6303\\23\\44.00734\\-115.6771\\23\\43.05165\\-113.724\\23\\42.39956\\-111.7709\\23\\42.42199\\-109.8178\\23\\43.75909\\-107.8646\\23\\45.40248\\-105.9115\\23\\45.69197\\-103.9584\\23\\45.71442\\-102.0053\\23\\46.59877\\-100.613\\23\\48.5519\\-100.1329\\23\\50.50502\\-100.8306\\23\\52.45815\\-101.0545\\23\\54.41127\\-101.8959\\23\\56.3644\\-103.3544\\23\\58.55325\\-105.9115\\23\\59.31513\\-107.8646\\23\\59.87392\\-109.8178\\23\\61.02372\\-111.7709\\23\\61.80783\\-113.724\\23\\63.00407\\-115.6771\\23\\63.69728\\-117.6303\\23\\64.62079\\-119.5834\\23\\65.27832\\-121.5365\\23\\65.59989\\-123.4896\\23\\66.51941\\-125.4428\\23\\67.29369\\-127.3959\\23\\67.63926\\-129.349\\23\\68.77673\\-131.3021\\23\\69.58329\\-133.2553\\23\\70.67048\\-135.2084\\23\\71.62241\\-137.1615\\23\\72.33592\\-139.1146\\23\\73.21499\\-141.0678\\23\\74.43369\\-143.0209\\23\\75.05663\\-144.974\\23\\76.33954\\-146.9271\\23\\76.99658\\-148.8803\\23\\78.38699\\-150.8334\\23\\78.9602\\-152.7865\\23\\80.59333\\-154.7396\\23\\81.23307\\-156.6928\\23\\82.64568\\-158.6459\\23\\84.59881\\-160.599\\23\\86.15833\\-162.5521\\23\\87.30428\\-164.5053\\23\\87.6144\\-164.8196\\23\\90.37083\\-168.4115\\23\\92.22839\\-170.3646\\23\\93.15896\\-172.3178\\23\\94.26234\\-174.2709\\23\\95.4269\\-176.8326\\23\\95.96317\\-178.1771\\23\\96.4942\\-180.1303\\23\\96.90918\\-182.0834\\23\\97.07606\\-185.9896\\23\\97.07606\\-187.9428\\23\\97.20564\\-189.8959\\23\\97.19302\\-191.849\\23\\97.07606\\-193.8021\\23\\97.0545\\-197.7084\\23\\96.54881\\-199.6615\\23\\96.32534\\-201.6146\\23\\95.90651\\-203.5678\\23\\94.70049\\-205.5209\\23\\93.22629\\-209.4271\\23\\93.18081\\-211.3803\\23\\91.90986\\-213.3334\\23\\91.52065\\-213.6799\\23" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "173" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "430" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-95.97935\\-208.6449\\25\\-97.02536\\-207.474\\25\\-98.53221\\-205.5209\\25\\-98.86818\\-203.5678\\25\\-98.90483\\-201.6146\\25\\-99.08659\\-199.6615\\25\\-99.61507\\-197.7084\\25\\-99.62651\\-195.7553\\25\\-100.5418\\-193.8021\\25\\-100.8784\\-191.849\\25\\-100.8784\\-187.9428\\25\\-100.612\\-185.9896\\25\\-99.62651\\-184.0365\\25\\-99.52878\\-182.0834\\25\\-98.98185\\-180.1303\\25\\-98.61858\\-178.1771\\25\\-97.60696\\-176.224\\25\\-96.74167\\-174.2709\\25\\-95.17033\\-172.3178\\25\\-93.95647\\-170.3646\\25\\-92.0731\\-167.6687\\25\\-91.34694\\-166.4584\\25\\-90.53592\\-164.5053\\25\\-90.11997\\-164.0733\\25\\-87.49735\\-160.599\\25\\-86.71944\\-158.6459\\25\\-85.50571\\-156.6928\\25\\-84.78645\\-154.7396\\25\\-83.73865\\-152.7865\\25\\-83.12378\\-150.8334\\25\\-81.79379\\-148.8803\\25\\-81.03082\\-144.974\\25\\-79.89239\\-143.0209\\25\\-79.38979\\-141.0678\\25\\-79.06407\\-139.1146\\25\\-78.08641\\-137.1615\\25\\-76.35336\\-133.2553\\25\\-76.13329\\-131.3021\\25\\-75.16128\\-129.349\\25\\-74.38647\\-127.3959\\25\\-74.29554\\-125.4428\\25\\-73.24798\\-123.4896\\25\\-72.41978\\-121.5365\\25\\-72.28276\\-119.5834\\25\\-71.20634\\-117.6303\\25\\-70.3069\\-115.6771\\25\\-69.83862\\-113.724\\25\\-68.6356\\-111.5455\\25\\-67.87971\\-109.8178\\25\\-66.68247\\-108.2417\\25\\-64.37964\\-105.9115\\25\\-62.77623\\-104.499\\25\\-60.8231\\-106.2284\\25\\-56.91685\\-107.8873\\25\\-55.23426\\-109.8178\\25\\-54.89663\\-113.724\\25\\-55.50195\\-115.6771\\25\\-55.98956\\-117.6303\\25\\-56.92448\\-119.5834\\25\\-57.5383\\-121.5365\\25\\-57.74825\\-123.4896\\25\\-57.6059\\-125.4428\\25\\-55.98423\\-129.349\\25\\-53.0106\\-132.3448\\25\\-51.05748\\-134.0796\\25\\-50.11171\\-135.2084\\25\\-49.10435\\-136.1892\\25\\-47.44781\\-135.2084\\25\\-47.87368\\-133.2553\\25\\-49.6131\\-131.3021\\25\\-50.58663\\-129.349\\25\\-50.86914\\-127.3959\\25\\-50.16837\\-125.4428\\25\\-49.22642\\-123.4896\\25\\-47.85711\\-121.5365\\25\\-45.1981\\-118.8635\\25\\-43.22227\\-117.6303\\25\\-41.29185\\-116.5661\\25\\-39.33873\\-116.472\\25\\-37.3856\\-116.5235\\25\\-35.43248\\-116.7873\\25\\-33.47935\\-118.5254\\25\\-31.52623\\-118.5736\\25\\-29.5731\\-116.6733\\25\\-27.61998\\-116.5396\\25\\-25.66685\\-118.032\\25\\-23.71373\\-118.6351\\25\\-21.7606\\-118.6431\\25\\-19.80748\\-119.8558\\25\\-18.73326\\-121.5365\\25\\-17.85435\\-122.5732\\25\\-15.90123\\-123.9516\\25\\-11.99498\\-124.0967\\25\\-10.04185\\-123.0832\\25\\-8.088726\\-122.3351\\25\\-5.81008\\-123.4896\\25\\-4.182476\\-124.0967\\25\\-2.229351\\-124.1039\\25\\-0.276226\\-124.4214\\25\\1.676899\\-124.5617\\25\\3.630024\\-124.5617\\25\\5.006706\\-125.4428\\25\\5.583149\\-125.9552\\25\\6.699888\\-127.3959\\25\\7.71066\\-131.3021\\25\\8.098207\\-133.2553\\25\\7.882796\\-135.2084\\25\\8.352305\\-137.1615\\25\\7.980166\\-139.1146\\25\\7.074307\\-141.0678\\25\\6.818501\\-143.0209\\25\\5.583149\\-145.0941\\25\\3.630024\\-146.2068\\25\\-0.276226\\-146.2643\\25\\-2.229351\\-147.1674\\25\\-4.182476\\-145.4869\\25\\-4.633673\\-144.974\\25\\-5.469301\\-143.0209\\25\\-5.150434\\-141.0678\\25\\-5.366617\\-139.1146\\25\\-8.088726\\-136.3367\\25\\-11.19356\\-133.2553\\25\\-11.99498\\-131.6524\\25\\-13.58952\\-129.349\\25\\-13.9481\\-129.0389\\25\\-15.90123\\-128.4192\\25\\-17.85435\\-128.3939\\25\\-21.7606\\-128.4805\\25\\-23.71373\\-129.4976\\25\\-27.61998\\-130.9948\\25\\-27.95544\\-131.3021\\25\\-29.5731\\-133.4236\\25\\-30.38182\\-135.2084\\25\\-32.30847\\-137.1615\\25\\-39.33873\\-144.1389\\25\\-41.29185\\-145.278\\25\\-45.1981\\-146.4832\\25\\-47.15123\\-148.1237\\25\\-49.10435\\-149.9433\\25\\-51.05748\\-149.9169\\25\\-53.0106\\-150.0511\\25\\-54.96373\\-151.1039\\25\\-56.91685\\-151.648\\25\\-58.86998\\-152.4935\\25\\-60.8231\\-153.8298\\25\\-62.77623\\-155.7757\\25\\-64.72935\\-157.3818\\25\\-66.02634\\-158.6459\\25\\-66.68247\\-159.8016\\25\\-68.42241\\-162.5521\\25\\-72.54185\\-166.7065\\25\\-73.48734\\-168.4115\\25\\-74.32059\\-170.3646\\25\\-75.47153\\-172.3178\\25\\-75.51299\\-174.2709\\25\\-76.58308\\-176.224\\25\\-77.45192\\-178.1771\\25\\-78.48581\\-180.1303\\25\\-79.41738\\-182.0834\\25\\-79.43034\\-184.0365\\25\\-80.55112\\-185.9896\\25\\-82.30747\\-189.7738\\25\\-83.38085\\-191.849\\25\\-83.4394\\-193.8021\\25\\-84.17983\\-195.7553\\25\\-85.31579\\-197.7084\\25\\-85.40817\\-201.6146\\25\\-85.5852\\-203.5678\\25\\-86.21372\\-204.6323\\25\\-87.22018\\-205.5209\\25\\-88.16685\\-206.051\\25\\-92.0731\\-206.7416\\25\\-94.02622\\-208.4969\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "431" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-216.3667\\25\\-93.13712\\-215.2865\\25\\-92.0731\\-213.6157\\25\\-90.11997\\-212.453\\25\\-88.16685\\-209.8447\\25\\-86.21372\\-209.1123\\25\\-85.89891\\-209.4271\\25\\-85.52468\\-211.3803\\25\\-85.76074\\-213.3334\\25\\-86.89894\\-215.2865\\25\\-88.16685\\-216.4944\\25\\-90.11997\\-217.0158\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "432" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-45.34671\\-111.7709\\25\\-45.93541\\-109.8178\\25\\-45.1981\\-109.0163\\25\\-43.24498\\-107.4479\\25\\-41.29185\\-107.2873\\25\\-38.72631\\-109.8178\\25\\-40.20206\\-111.7709\\25\\-41.29185\\-112.9903\\25\\-43.24498\\-113.601\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "139" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "433" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "3.630024\\-219.6367\\25\\1.676899\\-218.8998\\25\\-0.276226\\-218.0519\\25\\-3.130406\\-215.2865\\25\\-5.052227\\-213.3334\\25\\-5.853774\\-211.3803\\25\\-6.800369\\-209.4271\\25\\-8.088726\\-207.2623\\25\\-10.04185\\-207.107\\25\\-11.99498\\-208.571\\25\\-13.9481\\-207.5443\\25\\-15.90123\\-206.2224\\25\\-17.85435\\-204.6973\\25\\-21.7606\\-204.6144\\25\\-23.71373\\-203.6965\\25\\-25.66685\\-202.6358\\25\\-29.5731\\-202.5958\\25\\-31.52623\\-201.1606\\25\\-33.47935\\-200.67\\25\\-39.33873\\-200.589\\25\\-41.29185\\-199.4258\\25\\-43.24498\\-198.7133\\25\\-45.1981\\-198.6255\\25\\-47.15123\\-197.5214\\25\\-49.10435\\-196.7509\\25\\-51.05748\\-195.5501\\25\\-53.0106\\-192.0725\\25\\-53.20167\\-191.849\\25\\-53.93963\\-189.8959\\25\\-53.9828\\-187.9428\\25\\-54.96373\\-185.9669\\25\\-56.91685\\-186.2896\\25\\-57.22791\\-185.9896\\25\\-57.7966\\-184.0365\\25\\-55.7751\\-180.1303\\25\\-54.96373\\-178.277\\25\\-55.64279\\-176.224\\25\\-55.82451\\-174.2709\\25\\-55.59927\\-172.3178\\25\\-54.79603\\-170.3646\\25\\-53.0106\\-169.3125\\25\\-51.32719\\-170.3646\\25\\-52.02884\\-174.2709\\25\\-53.0106\\-175.7242\\25\\-53.75739\\-176.224\\25\\-53.0106\\-177.0484\\25\\-51.05748\\-177.1635\\25\\-49.10435\\-176.3342\\25\\-46.77709\\-174.2709\\25\\-46.10702\\-172.3178\\25\\-45.62347\\-170.3646\\25\\-44.90317\\-168.4115\\25\\-44.38673\\-166.4584\\25\\-44.13643\\-164.5053\\25\\-43.24498\\-162.7855\\25\\-41.08746\\-160.599\\25\\-39.33873\\-159.6431\\25\\-37.3856\\-160.3858\\25\\-35.43248\\-161.6954\\25\\-33.47935\\-162.4996\\25\\-31.52623\\-163.7104\\25\\-29.78236\\-164.5053\\25\\-27.61998\\-165.6635\\25\\-23.71373\\-165.7025\\25\\-21.7606\\-165.0099\\25\\-19.80748\\-163.8358\\25\\-15.90123\\-165.3208\\25\\-13.9481\\-165.7141\\25\\-11.99498\\-166.8153\\25\\-10.04185\\-168.7441\\25\\-8.813099\\-170.3646\\25\\-7.583412\\-172.3178\\25\\-6.861763\\-174.2709\\25\\-5.986994\\-176.224\\25\\-5.521312\\-178.1771\\25\\-4.928127\\-180.1303\\25\\-3.139792\\-182.0834\\25\\-2.229351\\-182.8927\\25\\-0.276226\\-183.2599\\25\\1.676899\\-184.8577\\25\\3.630024\\-185.6967\\25\\5.583149\\-187.1912\\25\\7.536274\\-187.7942\\25\\9.489399\\-188.9694\\25\\11.44252\\-189.6484\\25\\13.39565\\-189.6484\\25\\17.3019\\-189.8151\\25\\19.25502\\-189.8437\\25\\21.20815\\-190.6821\\25\\23.16127\\-191.0874\\25\\27.06752\\-191.6133\\25\\29.02065\\-191.242\\25\\30.97377\\-190.0598\\25\\33.12919\\-187.9428\\25\\34.32591\\-185.9896\\25\\34.88002\\-185.3574\\25\\36.83315\\-184.0138\\25\\38.78627\\-183.0092\\25\\40.7394\\-182.2055\\25\\44.64565\\-182.2055\\25\\46.59877\\-181.2773\\25\\48.5519\\-181.334\\25\\50.50502\\-182.3072\\25\\52.45815\\-183.1432\\25\\56.3644\\-185.1699\\25\\59.13208\\-187.9428\\25\\60.88494\\-189.8959\\25\\61.31427\\-191.849\\25\\61.63143\\-193.8021\\25\\61.63143\\-195.7553\\25\\61.77079\\-197.7084\\25\\62.22377\\-198.2031\\25\\64.1769\\-199.6868\\25\\66.13003\\-200.9655\\25\\66.73901\\-201.6146\\25\\66.13003\\-202.314\\25\\64.1769\\-202.6311\\25\\62.22377\\-202.4214\\25\\60.93407\\-203.5678\\25\\59.38167\\-205.5209\\25\\59.28124\\-207.474\\25\\58.31752\\-209.275\\25\\56.32684\\-211.3803\\25\\54.41127\\-212.6131\\25\\52.45815\\-212.9564\\25\\50.50502\\-214.1221\\25\\48.5519\\-214.8946\\25\\44.64565\\-214.925\\25\\42.69252\\-215.0009\\25\\38.78627\\-215.929\\25\\32.9269\\-215.929\\25\\27.06752\\-216.0069\\25\\23.16127\\-216.1025\\25\\21.20815\\-216.0538\\25\\19.25502\\-216.6755\\25\\15.34877\\-219.9341\\25\\13.39565\\-220.8076\\25\\11.44252\\-220.8984\\25\\7.536274\\-220.8868\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "434" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "38.78627\\-147.6583\\25\\36.83315\\-146.4832\\25\\34.88002\\-145.8562\\25\\32.9269\\-144.1349\\25\\30.97377\\-142.5679\\25\\29.02065\\-142.0223\\25\\27.06752\\-140.6614\\25\\25.1144\\-139.6887\\25\\24.51863\\-139.1146\\25\\23.59596\\-135.2084\\25\\22.82518\\-133.2553\\25\\22.77433\\-131.3021\\25\\23.16127\\-130.8627\\25\\25.56717\\-129.349\\25\\27.06752\\-128.4983\\25\\29.02065\\-127.8118\\25\\30.97377\\-127.7424\\25\\32.9269\\-126.5105\\25\\33.94437\\-125.4428\\25\\35.71355\\-121.5365\\25\\36.83315\\-120.5972\\25\\38.78627\\-120.8041\\25\\41.48647\\-123.4896\\25\\43.23693\\-125.4428\\25\\43.7944\\-127.3959\\25\\43.92531\\-129.349\\25\\43.55099\\-131.3021\\25\\42.24863\\-133.2553\\25\\41.99709\\-135.2084\\25\\42.46716\\-137.1615\\25\\43.80424\\-139.1146\\25\\44.06078\\-141.0678\\25\\43.73628\\-143.0209\\25\\42.51814\\-144.974\\25\\42.55709\\-146.9271\\25\\40.7394\\-148.4007\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002289" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "106" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "435" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-214.1997\\25\\87.6144\\-212.4747\\25\\86.76804\\-211.3803\\25\\86.3646\\-209.4271\\25\\85.24533\\-207.474\\25\\85.19931\\-205.5209\\25\\86.12544\\-203.5678\\25\\86.22012\\-201.6146\\25\\84.9229\\-199.6615\\25\\84.78152\\-197.7084\\25\\84.23927\\-195.7553\\25\\82.87942\\-193.8021\\25\\82.80972\\-191.849\\25\\80.81381\\-187.9428\\25\\80.75704\\-185.9896\\25\\79.88267\\-184.0365\\25\\78.82534\\-182.0834\\25\\76.86761\\-178.1771\\25\\75.9809\\-176.224\\25\\74.90527\\-174.2709\\25\\74.04409\\-172.3178\\25\\71.9894\\-168.6693\\25\\69.8395\\-166.4584\\25\\66.13003\\-162.7715\\25\\64.02829\\-160.599\\25\\59.91017\\-156.6928\\25\\58.31752\\-155.4942\\25\\56.3644\\-154.2847\\25\\54.41127\\-153.4883\\25\\52.45815\\-153.1226\\25\\50.50502\\-151.9781\\25\\49.07409\\-150.8334\\25\\47.8693\\-148.8803\\25\\48.02387\\-146.9271\\25\\47.78661\\-144.974\\25\\47.68719\\-141.0678\\25\\47.06962\\-139.1146\\25\\46.16812\\-137.1615\\25\\46.26268\\-135.2084\\25\\47.36923\\-133.2553\\25\\47.93761\\-131.3021\\25\\48.15517\\-129.349\\25\\48.13596\\-125.4428\\25\\47.67393\\-123.4896\\25\\45.88434\\-121.5365\\25\\44.88137\\-119.5834\\25\\43.73732\\-117.6303\\25\\42.04324\\-115.6771\\25\\41.6489\\-113.724\\25\\41.65336\\-111.7709\\25\\41.99641\\-109.8178\\25\\45.7437\\-105.9115\\25\\46.15488\\-103.9584\\25\\46.30581\\-102.0053\\25\\46.59877\\-101.6936\\25\\48.5519\\-100.7547\\25\\50.50502\\-100.7663\\25\\52.45815\\-99.79305\\25\\54.41127\\-100.5973\\25\\56.3644\\-102.4154\\25\\58.31752\\-105.1548\\25\\58.93181\\-105.9115\\25\\60.74149\\-109.8178\\25\\61.80783\\-113.724\\25\\63.00407\\-115.6771\\25\\63.69728\\-117.6303\\25\\64.93804\\-119.5834\\25\\65.50858\\-121.5365\\25\\65.62471\\-123.4896\\25\\66.82529\\-125.4428\\25\\67.48341\\-127.3959\\25\\69.30386\\-131.3021\\25\\69.68975\\-133.2553\\25\\70.8164\\-135.2084\\25\\72.71297\\-139.1146\\25\\74.22435\\-141.0678\\25\\75.08031\\-143.0209\\25\\75.63656\\-144.974\\25\\76.63666\\-146.9271\\25\\78.24551\\-148.8803\\25\\78.89945\\-150.8334\\25\\80.33203\\-152.7865\\25\\81.25818\\-156.6928\\25\\82.75162\\-158.6459\\25\\83.70815\\-159.4823\\25\\85.66128\\-160.9373\\25\\87.6144\\-163.56\\25\\89.97183\\-166.4584\\25\\92.76962\\-170.3646\\25\\93.98806\\-172.3178\\25\\94.7216\\-174.2709\\25\\95.97445\\-176.224\\25\\97.07606\\-180.1303\\25\\97.25796\\-182.0834\\25\\97.97562\\-184.0365\\25\\98.2929\\-185.9896\\25\\98.2929\\-197.7084\\25\\97.85368\\-199.6615\\25\\97.0545\\-201.6146\\25\\96.55129\\-203.5678\\25\\95.82613\\-205.5209\\25\\94.6596\\-207.474\\25\\93.87051\\-209.4271\\25\\93.18081\\-211.3803\\25\\92.17365\\-213.3334\\25\\91.52065\\-213.9636\\25" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "187" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "436" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-95.97935\\-209.9414\\27\\-98.49441\\-207.474\\27\\-99.38029\\-203.5678\\27\\-100.4661\\-201.6146\\27\\-100.8827\\-199.6615\\27\\-100.8909\\-195.7553\\27\\-100.9654\\-193.8021\\27\\-101.2614\\-191.849\\27\\-101.2317\\-187.9428\\27\\-100.9199\\-185.9896\\27\\-100.8909\\-182.0834\\27\\-100.5687\\-180.1303\\27\\-98.99978\\-178.1771\\27\\-98.61205\\-176.224\\27\\-97.12412\\-174.2709\\27\\-96.5631\\-172.3178\\27\\-94.78982\\-170.3646\\27\\-93.30006\\-168.4115\\27\\-92.55271\\-166.4584\\27\\-90.89832\\-164.5053\\27\\-89.49519\\-162.5521\\27\\-88.6339\\-160.599\\27\\-87.49077\\-158.6459\\27\\-86.61548\\-156.6928\\27\\-85.46362\\-154.7396\\27\\-84.74596\\-152.7865\\27\\-83.4766\\-150.8334\\27\\-82.89451\\-148.8803\\27\\-81.79379\\-146.9271\\27\\-81.04045\\-143.0209\\27\\-79.90137\\-141.0678\\27\\-79.38979\\-139.1146\\27\\-79.03677\\-137.1615\\27\\-77.5021\\-135.2084\\27\\-77.01776\\-133.2553\\27\\-76.4481\\-131.7016\\27\\-75.20286\\-129.349\\27\\-74.38647\\-127.3959\\27\\-74.29554\\-125.4428\\27\\-73.24798\\-123.4896\\27\\-72.43334\\-121.5365\\27\\-72.38026\\-119.5834\\27\\-71.2346\\-117.6303\\27\\-70.40173\\-115.6771\\27\\-70.31819\\-113.724\\27\\-69.20625\\-111.7709\\27\\-67.21018\\-107.8646\\27\\-65.92293\\-105.9115\\27\\-64.92042\\-103.9584\\27\\-62.77623\\-102.0723\\27\\-60.8231\\-104.0546\\27\\-58.64521\\-105.9115\\27\\-56.91685\\-107.0887\\27\\-56.07735\\-107.8646\\27\\-54.8873\\-109.8178\\27\\-54.02531\\-111.7709\\27\\-53.97745\\-113.724\\27\\-54.96373\\-115.9158\\27\\-55.93593\\-119.5834\\27\\-56.72578\\-121.5365\\27\\-56.92448\\-123.4896\\27\\-56.95441\\-125.4428\\27\\-56.82211\\-127.3959\\27\\-56.03495\\-129.349\\27\\-54.96373\\-130.5026\\27\\-52.16818\\-133.2553\\27\\-51.4369\\-135.2084\\27\\-52.15175\\-137.1615\\27\\-52.09427\\-139.1146\\27\\-51.05748\\-140.4672\\27\\-49.80561\\-139.1146\\27\\-49.10435\\-137.5069\\27\\-47.70345\\-135.2084\\27\\-48.2518\\-133.2553\\27\\-50.16447\\-131.3021\\27\\-50.90887\\-129.349\\27\\-49.39732\\-125.4428\\27\\-48.2108\\-123.4896\\27\\-44.375\\-119.5834\\27\\-42.74813\\-117.6303\\27\\-41.74075\\-115.6771\\27\\-43.33972\\-113.724\\27\\-44.09016\\-111.7709\\27\\-44.08014\\-109.8178\\27\\-43.24498\\-108.7808\\27\\-41.29185\\-108.0341\\27\\-39.33873\\-108.5985\\27\\-38.30845\\-109.8178\\27\\-39.87774\\-111.7709\\27\\-40.55582\\-113.724\\27\\-40.82012\\-115.6771\\27\\-39.33873\\-116.4827\\27\\-37.3856\\-116.4272\\27\\-35.43248\\-116.4932\\27\\-33.47935\\-117.1637\\27\\-31.52623\\-118.3627\\27\\-29.5731\\-117.4938\\27\\-27.61998\\-117.4433\\27\\-25.66685\\-118.4087\\27\\-21.7606\\-118.6282\\27\\-20.70856\\-119.5834\\27\\-17.85435\\-122.7053\\27\\-15.90123\\-124.0416\\27\\-11.99498\\-124.0322\\27\\-10.04185\\-123.3676\\27\\-8.088726\\-122.8335\\27\\-4.182476\\-124.0695\\27\\-2.229351\\-124.0063\\27\\3.630024\\-124.1144\\27\\5.145793\\-125.4428\\27\\6.363338\\-127.3959\\27\\6.777315\\-129.349\\27\\6.50499\\-131.3021\\27\\6.559711\\-137.1615\\27\\6.475886\\-143.0209\\27\\6.623959\\-144.974\\27\\6.171673\\-146.9271\\27\\5.583149\\-147.5157\\27\\3.630024\\-148.2344\\27\\1.676899\\-148.2413\\27\\-0.276226\\-149.345\\27\\-2.229351\\-150.1059\\27\\-3.591113\\-148.8803\\27\\-3.946754\\-146.9271\\27\\-4.68779\\-144.974\\27\\-5.060525\\-143.0209\\27\\-5.269915\\-141.0678\\27\\-5.605467\\-139.1146\\27\\-7.284788\\-137.1615\\27\\-11.15716\\-133.2553\\27\\-11.16417\\-131.3021\\27\\-11.95622\\-129.349\\27\\-13.9481\\-128.1725\\27\\-15.90123\\-127.8398\\27\\-17.85435\\-127.0802\\27\\-19.80748\\-127.1158\\27\\-21.7606\\-127.7926\\27\\-23.71373\\-126.9873\\27\\-25.66685\\-127.6815\\27\\-27.61998\\-129.4156\\27\\-28.93756\\-131.3021\\27\\-29.40795\\-133.2553\\27\\-30.24484\\-135.2084\\27\\-33.47935\\-138.2865\\27\\-37.3856\\-142.2153\\27\\-39.33873\\-143.9161\\27\\-41.29185\\-144.3967\\27\\-43.24498\\-145.3829\\27\\-45.1981\\-146.1779\\27\\-47.15123\\-148.0621\\27\\-49.10435\\-149.5296\\27\\-51.05748\\-150.0136\\27\\-54.96373\\-151.1589\\27\\-56.91685\\-151.8811\\27\\-58.86998\\-152.1088\\27\\-60.8231\\-152.8531\\27\\-62.77623\\-154.8344\\27\\-64.72935\\-155.5697\\27\\-66.36558\\-156.6928\\27\\-67.81065\\-158.6459\\27\\-68.48699\\-160.599\\27\\-72.54185\\-164.5443\\27\\-74.49497\\-167.56\\27\\-76.4481\\-170.4565\\27\\-77.40746\\-172.3178\\27\\-78.00672\\-174.2709\\27\\-78.40122\\-174.6817\\27\\-79.39075\\-176.224\\27\\-79.40337\\-178.1771\\27\\-80.51456\\-180.1303\\27\\-81.43894\\-182.0834\\27\\-81.44376\\-184.0365\\27\\-82.30747\\-185.6834\\27\\-82.58542\\-185.9896\\27\\-83.43187\\-187.9428\\27\\-83.52818\\-189.8959\\27\\-84.81948\\-191.849\\27\\-85.3954\\-193.8021\\27\\-85.73412\\-197.7084\\27\\-86.7556\\-199.6615\\27\\-87.33298\\-201.6146\\27\\-87.3419\\-203.5678\\27\\-87.96741\\-205.5209\\27\\-88.16685\\-205.7261\\27\\-90.11997\\-206.6685\\27\\-92.0731\\-207.107\\27\\-94.02622\\-208.8825\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "437" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-92.0731\\-216.0052\\27\\-92.79181\\-215.2865\\27\\-92.28915\\-213.3334\\27\\-90.11997\\-212.3673\\27\\-88.16685\\-210.7447\\27\\-86.96568\\-211.3803\\27\\-86.8874\\-213.3334\\27\\-87.57451\\-215.2865\\27\\-88.16685\\-216.0044\\27\\-90.11997\\-216.9163\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "122" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "438" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-220.0467\\27\\3.630024\\-219.0573\\27\\1.676899\\-218.9811\\27\\-0.276226\\-218.0959\\27\\-5.096371\\-213.3334\\27\\-6.135601\\-212.1263\\27\\-6.936382\\-211.3803\\27\\-8.088726\\-210.5725\\27\\-11.99498\\-210.5363\\27\\-13.9481\\-209.6182\\27\\-17.85435\\-207.4364\\27\\-19.80748\\-206.6201\\27\\-21.7606\\-206.6201\\27\\-23.71373\\-205.695\\27\\-25.66685\\-204.6\\27\\-29.5731\\-204.6\\27\\-33.47935\\-202.6126\\27\\-41.29185\\-202.5912\\27\\-43.24498\\-201.5332\\27\\-45.1981\\-200.6553\\27\\-47.15123\\-200.6076\\27\\-51.05748\\-198.6716\\27\\-52.66288\\-197.7084\\27\\-53.0106\\-197.358\\27\\-53.93148\\-195.7553\\27\\-53.98309\\-193.8021\\27\\-54.31439\\-191.849\\27\\-54.96373\\-189.728\\27\\-56.91685\\-188.4271\\27\\-57.35487\\-187.9428\\27\\-58.46358\\-185.9896\\27\\-57.75705\\-184.0365\\27\\-54.28764\\-180.1303\\27\\-53.0106\\-179.204\\27\\-51.05748\\-178.8732\\27\\-50.23479\\-178.1771\\27\\-48.62474\\-176.224\\27\\-46.48856\\-174.2709\\27\\-44.93901\\-172.3178\\27\\-44.41184\\-170.3646\\27\\-44.09016\\-168.4115\\27\\-43.24498\\-167.1026\\27\\-40.89425\\-164.5053\\27\\-40.25961\\-162.5521\\27\\-39.33873\\-160.8989\\27\\-37.3856\\-159.7861\\27\\-36.62071\\-160.599\\27\\-36.6995\\-162.5521\\27\\-35.43248\\-163.7013\\27\\-33.96763\\-164.5053\\27\\-33.47935\\-164.9139\\27\\-31.52623\\-165.7105\\27\\-29.5731\\-165.8965\\27\\-27.61998\\-167.2977\\27\\-25.66685\\-167.6937\\27\\-19.80748\\-167.6108\\27\\-13.9481\\-167.6999\\27\\-11.99498\\-168.8659\\27\\-10.04185\\-170.7919\\27\\-8.827892\\-172.3178\\27\\-7.635742\\-174.2709\\27\\-6.899647\\-176.224\\27\\-5.192548\\-180.1303\\27\\-4.182476\\-181.1022\\27\\-2.229351\\-182.3309\\27\\-0.276226\\-183.0805\\27\\3.630024\\-185.0797\\27\\5.583149\\-187.0036\\27\\7.536274\\-187.6837\\27\\9.489399\\-188.9344\\27\\11.44252\\-189.6484\\27\\13.39565\\-189.7215\\27\\15.34877\\-190.6244\\27\\17.3019\\-191.0558\\27\\19.25502\\-191.1011\\27\\21.20815\\-192.2923\\27\\23.16127\\-192.9906\\27\\27.06752\\-193.0484\\27\\29.02065\\-192.4941\\27\\30.97377\\-190.8556\\27\\33.81789\\-187.9428\\27\\35.489\\-185.9896\\27\\38.78627\\-183.0258\\27\\40.7394\\-182.2828\\27\\44.64565\\-182.2055\\27\\46.59877\\-181.4273\\27\\48.5519\\-181.5293\\27\\50.50502\\-182.95\\27\\52.45815\\-183.3439\\27\\54.41127\\-184.0289\\27\\56.3644\\-185.1403\\27\\61.09697\\-189.8959\\27\\61.74416\\-191.849\\27\\61.89825\\-195.7553\\27\\63.02493\\-197.7084\\27\\64.1769\\-198.8832\\27\\66.13003\\-200.3109\\27\\67.3941\\-201.6146\\27\\66.13003\\-203.2529\\27\\64.1769\\-202.8948\\27\\62.22377\\-203.7722\\27\\61.25973\\-205.5209\\27\\60.83258\\-207.474\\27\\59.14384\\-209.4271\\27\\56.3644\\-212.1774\\27\\54.41127\\-212.9367\\27\\52.45815\\-213.8592\\27\\50.50502\\-214.2352\\27\\48.5519\\-214.013\\27\\42.69252\\-213.9861\\27\\36.83315\\-214.045\\27\\34.88002\\-212.9789\\27\\32.9269\\-212.3524\\27\\30.97377\\-212.3186\\27\\25.1144\\-212.3186\\27\\23.16127\\-212.3524\\27\\21.20815\\-213.2607\\27\\19.25502\\-214.7602\\27\\14.73438\\-219.1928\\27\\13.39565\\-220.1837\\27\\11.44252\\-220.8116\\27\\7.536274\\-220.8008\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "439" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "42.69252\\-149.6587\\27\\40.7394\\-148.136\\27\\38.78627\\-147.2737\\27\\36.83315\\-147.0492\\27\\34.88002\\-146.0757\\27\\32.9269\\-144.5676\\27\\30.97377\\-143.9744\\27\\29.02065\\-142.6145\\27\\27.06752\\-142.2424\\27\\25.1144\\-141.7059\\27\\23.16127\\-140.1715\\27\\22.14616\\-139.1146\\27\\22.13092\\-133.2553\\27\\22.16019\\-131.3021\\27\\23.16127\\-129.2934\\27\\25.1144\\-128.3596\\27\\29.02065\\-127.7629\\27\\30.97377\\-126.8455\\27\\32.9269\\-125.2405\\27\\34.25906\\-123.4896\\27\\35.89507\\-121.5365\\27\\36.83315\\-120.6748\\27\\38.78627\\-120.8041\\27\\40.7394\\-122.7513\\27\\42.69252\\-124.3809\\27\\43.77808\\-125.4428\\27\\44.13197\\-127.3959\\27\\44.18368\\-129.349\\27\\43.7094\\-131.3021\\27\\42.43344\\-133.2553\\27\\43.21222\\-135.2084\\27\\43.78954\\-137.1615\\27\\44.16603\\-139.1146\\27\\44.28883\\-141.0678\\27\\45.17676\\-143.0209\\27\\45.78727\\-144.974\\27\\45.89907\\-146.9271\\27\\45.20107\\-148.8803\\27\\44.64565\\-149.3999\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002288" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "116" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "440" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-212.9415\\27\\88.21149\\-211.3803\\27\\86.9318\\-209.4271\\27\\86.80511\\-207.474\\27\\86.79985\\-205.5209\\27\\86.92535\\-201.6146\\27\\86.79985\\-199.6615\\27\\86.19778\\-197.7084\\27\\84.89965\\-195.7553\\27\\84.78323\\-191.849\\27\\82.80103\\-187.9428\\27\\82.40055\\-185.9896\\27\\81.75503\\-185.3095\\27\\80.83318\\-184.0365\\27\\80.76994\\-182.0834\\27\\79.93833\\-180.1303\\27\\78.82094\\-178.1771\\27\\77.96412\\-176.224\\27\\76.85438\\-174.2709\\27\\76.06711\\-172.3178\\27\\75.89565\\-172.1351\\27\\73.94253\\-168.5499\\27\\71.90482\\-166.4584\\27\\66.13003\\-160.8499\\27\\63.91781\\-158.6459\\27\\62.22377\\-157.4131\\27\\58.31752\\-154.2755\\27\\56.3644\\-153.4626\\27\\54.41127\\-153.1226\\27\\50.50502\\-151.4689\\27\\49.61527\\-150.8334\\27\\48.1305\\-148.8803\\27\\47.87936\\-146.9271\\27\\48.09058\\-143.0209\\27\\48.02177\\-141.0678\\27\\47.39045\\-139.1146\\27\\46.59877\\-137.6454\\27\\46.17585\\-137.1615\\27\\46.59877\\-136.6687\\27\\47.38679\\-135.2084\\27\\47.90256\\-133.2553\\27\\48.12653\\-131.3021\\27\\48.15517\\-127.3959\\27\\48.11721\\-125.4428\\27\\47.40922\\-123.4896\\27\\46.59877\\-122.6956\\27\\44.64565\\-121.2585\\27\\43.64478\\-119.5834\\27\\43.06955\\-117.6303\\27\\41.62759\\-115.6771\\27\\40.76211\\-113.724\\27\\40.80598\\-111.7709\\27\\42.8653\\-109.8178\\27\\44.07599\\-107.8646\\27\\44.64565\\-107.2719\\27\\46.59877\\-105.8886\\27\\47.7753\\-103.9584\\27\\47.85294\\-102.0053\\27\\48.5519\\-101.2728\\27\\50.50502\\-100.8364\\27\\52.45815\\-99.40966\\27\\54.41127\\-99.59016\\27\\56.85268\\-102.0053\\27\\58.9634\\-105.9115\\27\\59.84265\\-107.8646\\27\\60.91999\\-109.8178\\27\\61.70182\\-111.7709\\27\\61.81738\\-113.724\\27\\63.00407\\-115.6771\\27\\63.69728\\-117.6303\\27\\64.94558\\-119.5834\\27\\65.56036\\-121.5365\\27\\65.63318\\-123.4896\\27\\66.85982\\-125.4428\\27\\67.54493\\-127.3959\\27\\68.72473\\-129.349\\27\\70.03628\\-132.4367\\27\\71.9894\\-133.777\\27\\72.57315\\-135.2084\\27\\72.36642\\-137.1615\\27\\73.2864\\-139.1146\\27\\74.67123\\-141.0678\\27\\75.89565\\-143.6185\\27\\77.07627\\-146.9271\\27\\78.57015\\-148.8803\\27\\79.43491\\-150.8334\\27\\80.52223\\-152.7865\\27\\80.75146\\-154.7396\\27\\80.76978\\-156.6928\\27\\81.75503\\-157.7191\\27\\83.70815\\-159.1078\\27\\85.66128\\-159.8324\\27\\86.42406\\-160.599\\27\\88.04909\\-162.5521\\27\\89.56753\\-164.6179\\27\\90.81366\\-166.4584\\27\\92.24776\\-168.4115\\27\\93.873\\-170.3646\\27\\94.71533\\-172.3178\\27\\95.92395\\-174.2709\\27\\96.59232\\-176.224\\27\\97.07606\\-178.1771\\27\\97.98635\\-180.1303\\27\\98.31503\\-182.0834\\27\\98.46844\\-184.0365\\27\\98.82784\\-185.9896\\27\\98.91721\\-191.849\\27\\98.91721\\-197.7084\\27\\98.51102\\-199.6615\\27\\98.33077\\-201.6146\\27\\97.88275\\-203.5678\\27\\96.59232\\-205.5209\\27\\95.8333\\-207.474\\27\\94.18742\\-209.4271\\27\\93.125\\-211.3803\\27\\91.52065\\-213.3105\\27" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "176" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "441" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-98.06528\\-209.4271\\29\\-99.01022\\-207.474\\29\\-100.5315\\-205.5209\\29\\-100.8911\\-203.5678\\29\\-100.9654\\-201.6146\\29\\-101.2846\\-199.6615\\29\\-101.3005\\-195.7553\\29\\-102.4122\\-193.8021\\29\\-102.8927\\-191.849\\29\\-102.8927\\-189.8959\\29\\-102.5549\\-187.9428\\29\\-101.3679\\-185.9896\\29\\-101.3005\\-182.0834\\29\\-100.9947\\-180.1303\\29\\-100.5521\\-178.1771\\29\\-99.02999\\-176.224\\29\\-98.56065\\-174.2709\\29\\-97.12024\\-172.3178\\29\\-96.10142\\-170.3646\\29\\-94.58507\\-168.4115\\29\\-92.88775\\-166.4584\\29\\-91.45604\\-164.5053\\29\\-90.57296\\-162.5521\\29\\-89.43689\\-160.599\\29\\-88.57836\\-158.6459\\29\\-87.01461\\-156.6928\\29\\-85.73412\\-154.7396\\29\\-85.05769\\-152.7865\\29\\-83.75529\\-150.8334\\29\\-83.44228\\-148.8803\\29\\-82.88799\\-146.9271\\29\\-81.74554\\-144.974\\29\\-81.03043\\-141.0678\\29\\-79.84904\\-139.1146\\29\\-79.21656\\-137.1615\\29\\-78.09726\\-135.2084\\29\\-76.4481\\-131.4765\\29\\-75.24657\\-129.349\\29\\-74.45741\\-127.3959\\29\\-74.29554\\-125.4428\\29\\-73.24798\\-123.4896\\29\\-72.43334\\-121.5365\\29\\-72.38026\\-119.5834\\29\\-71.2346\\-117.6303\\29\\-70.40173\\-115.6771\\29\\-70.40173\\-113.724\\29\\-69.23433\\-111.7709\\29\\-67.29713\\-107.8646\\29\\-66.19419\\-105.9115\\29\\-65.90813\\-103.9584\\29\\-64.3428\\-102.0053\\29\\-62.77623\\-101.0115\\29\\-60.8231\\-101.0153\\29\\-59.80508\\-102.0053\\29\\-58.90783\\-103.9584\\29\\-56.83471\\-105.9115\\29\\-53.0106\\-107.8198\\29\\-51.05748\\-107.7914\\29\\-49.78956\\-109.8178\\29\\-50.32949\\-111.7709\\29\\-52.20261\\-113.724\\29\\-53.6703\\-115.6771\\29\\-54.01941\\-117.6303\\29\\-55.36045\\-119.5834\\29\\-55.73664\\-121.5365\\29\\-55.98448\\-123.4896\\29\\-56.75526\\-125.4428\\29\\-56.82211\\-127.3959\\29\\-56.35176\\-129.349\\29\\-55.60577\\-131.3021\\29\\-54.96373\\-131.9624\\29\\-53.05163\\-133.2553\\29\\-51.82058\\-135.2084\\29\\-52.9021\\-137.1615\\29\\-52.37871\\-139.1146\\29\\-51.05748\\-142.4381\\29\\-49.10435\\-142.6453\\29\\-48.95574\\-141.0678\\29\\-48.96891\\-139.1146\\29\\-48.88055\\-137.1615\\29\\-48.45504\\-135.2084\\29\\-48.72733\\-133.2553\\29\\-50.24725\\-131.3021\\29\\-50.93541\\-129.349\\29\\-49.88247\\-127.3959\\29\\-47.94403\\-123.4896\\29\\-44.11972\\-119.5834\\29\\-44.05878\\-117.6303\\29\\-43.43331\\-115.6771\\29\\-43.24498\\-115.4574\\29\\-41.29185\\-115.0545\\29\\-40.71562\\-115.6771\\29\\-39.33873\\-116.597\\29\\-37.82037\\-115.6771\\29\\-36.54935\\-113.724\\29\\-35.43248\\-112.7897\\29\\-34.43588\\-113.724\\29\\-33.79102\\-115.6771\\29\\-33.47935\\-115.9701\\29\\-31.52623\\-116.6288\\29\\-29.5731\\-116.6292\\29\\-27.61998\\-117.1996\\29\\-25.66685\\-118.7\\29\\-23.71373\\-118.7148\\29\\-21.76867\\-117.6303\\29\\-20.76968\\-115.6771\\29\\-19.80748\\-114.7243\\29\\-18.12979\\-115.6771\\29\\-17.85435\\-116.5252\\29\\-15.90123\\-117.4094\\29\\-14.7464\\-115.6771\\29\\-13.9481\\-114.9834\\29\\-13.30743\\-115.6771\\29\\-13.9481\\-116.3219\\29\\-15.90123\\-117.7862\\29\\-17.85435\\-117.9508\\29\\-19.80748\\-116.874\\29\\-21.74534\\-117.6303\\29\\-21.18009\\-119.5834\\29\\-21.52188\\-121.5365\\29\\-21.7606\\-121.812\\29\\-23.71373\\-122.6767\\29\\-25.66685\\-123.8427\\29\\-26.79122\\-125.4428\\29\\-27.61998\\-127.29\\29\\-28.86146\\-129.349\\29\\-28.86336\\-131.3021\\29\\-28.30045\\-133.2553\\29\\-28.3326\\-135.2084\\29\\-29.5731\\-136.4422\\29\\-31.31062\\-137.1615\\29\\-33.47935\\-138.3733\\29\\-36.12791\\-141.0678\\29\\-37.3856\\-142.6744\\29\\-39.33873\\-144.285\\29\\-41.29185\\-144.681\\29\\-43.24498\\-145.8589\\29\\-45.1981\\-146.5501\\29\\-47.15123\\-147.6268\\29\\-49.10435\\-148.4155\\29\\-51.05748\\-150.0086\\29\\-53.0106\\-151.0809\\29\\-54.96373\\-151.0572\\29\\-56.91685\\-151.3666\\29\\-58.86998\\-150.6551\\29\\-60.8231\\-150.9842\\29\\-62.77623\\-151.7664\\29\\-63.82753\\-152.7865\\29\\-64.72935\\-154.2006\\29\\-65.2212\\-154.7396\\29\\-66.68247\\-155.858\\29\\-67.51255\\-156.6928\\29\\-69.13657\\-158.6459\\29\\-70.58091\\-160.599\\29\\-74.5892\\-164.5053\\29\\-76.4481\\-166.6093\\29\\-77.40119\\-168.4115\\29\\-77.63255\\-170.3646\\29\\-79.10458\\-172.3178\\29\\-80.35435\\-174.3123\\29\\-81.39873\\-176.224\\29\\-81.44199\\-178.1771\\29\\-82.50278\\-180.1303\\29\\-84.2606\\-184.0259\\29\\-85.31568\\-185.9896\\29\\-85.42952\\-189.8959\\29\\-86.44482\\-191.849\\29\\-87.35055\\-193.8021\\29\\-87.40237\\-197.7084\\29\\-89.19895\\-201.6146\\29\\-88.64307\\-203.5678\\29\\-88.871\\-205.5209\\29\\-90.11997\\-206.635\\29\\-92.0731\\-208.2202\\29\\-94.02622\\-210.2203\\29\\-95.97935\\-210.6406\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "442" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-39.45628\\-103.9584\\29\\-40.4115\\-102.0053\\29\\-40.31529\\-98.09901\\29\\-39.33873\\-97.2343\\29\\-37.3856\\-97.23911\\29\\-35.90212\\-98.09901\\29\\-36.27451\\-100.0521\\29\\-38.02684\\-102.0053\\29\\-39.20509\\-103.9584\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "443" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.182476\\-156.313\\29\\-6.135601\\-154.5255\\29\\-8.088726\\-154.2232\\29\\-10.04185\\-153.3779\\29\\-10.3725\\-152.7865\\29\\-10.04185\\-152.4866\\29\\-8.088726\\-152.0203\\29\\-6.135601\\-151.0921\\29\\-5.900923\\-150.8334\\29\\-4.838685\\-146.9271\\29\\-4.101708\\-144.974\\29\\-4.370813\\-143.0209\\29\\-5.340724\\-141.0678\\29\\-5.923899\\-139.1146\\29\\-7.236725\\-137.1615\\29\\-9.161344\\-135.2084\\29\\-10.53013\\-133.2553\\29\\-10.51269\\-131.3021\\29\\-10.60394\\-129.349\\29\\-11.99498\\-128.0695\\29\\-13.9481\\-127.6998\\29\\-14.58558\\-127.3959\\29\\-14.84412\\-125.4428\\29\\-13.9481\\-124.9374\\29\\-11.99498\\-124.9374\\29\\-10.04185\\-124.533\\29\\-8.088726\\-123.9849\\29\\-6.135601\\-124.7029\\29\\-4.182476\\-126.6696\\29\\-2.229351\\-124.573\\29\\-0.276226\\-124.1054\\29\\1.676899\\-124.1094\\29\\3.630024\\-124.5545\\29\\4.560328\\-125.4428\\29\\4.814246\\-127.3959\\29\\4.620276\\-129.349\\29\\4.800951\\-131.3021\\29\\6.311696\\-135.2084\\29\\6.528639\\-137.1615\\29\\5.635733\\-139.1146\\29\\5.488408\\-141.0678\\29\\6.338421\\-143.0209\\29\\7.536274\\-144.7703\\29\\9.337312\\-146.9271\\29\\7.777244\\-148.8803\\29\\5.583149\\-150.1804\\29\\3.630024\\-151.0153\\29\\2.653461\\-152.7865\\29\\1.676899\\-153.7178\\29\\-0.276226\\-154.3353\\29\\-0.7425126\\-154.7396\\29\\-2.229351\\-155.6129\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "130" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "444" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-219.6274\\29\\3.630024\\-218.9811\\29\\1.676899\\-218.8998\\29\\-0.276226\\-218.0652\\29\\-4.182476\\-214.2235\\29\\-6.135601\\-212.7086\\29\\-8.088726\\-212.4648\\29\\-10.04185\\-212.4409\\29\\-11.99498\\-211.9092\\29\\-13.9481\\-210.7105\\29\\-15.90123\\-210.0208\\29\\-17.85435\\-208.741\\29\\-21.7606\\-208.5649\\29\\-23.82562\\-207.474\\29\\-25.66685\\-206.6283\\29\\-29.5731\\-206.58\\29\\-33.47935\\-204.6079\\29\\-41.29185\\-204.5708\\29\\-43.24498\\-203.8085\\29\\-45.1981\\-202.6226\\29\\-47.15123\\-202.2933\\29\\-49.10435\\-200.9793\\29\\-51.05748\\-200.6337\\29\\-53.0106\\-199.7733\\29\\-54.24656\\-197.7084\\29\\-54.84166\\-195.7553\\29\\-54.91154\\-193.8021\\29\\-56.13018\\-191.849\\29\\-56.91685\\-191.3372\\29\\-58.86998\\-192.4763\\29\\-59.42393\\-191.849\\29\\-59.33194\\-189.8959\\29\\-58.45145\\-187.9428\\29\\-57.89802\\-185.9896\\29\\-56.91685\\-184.729\\29\\-54.40321\\-182.0834\\29\\-52.13946\\-180.1303\\29\\-50.54921\\-178.1771\\29\\-49.67448\\-176.224\\29\\-49.10435\\-175.5877\\29\\-47.15123\\-174.5857\\29\\-45.1981\\-173.2773\\29\\-43.24498\\-170.9235\\29\\-41.29185\\-168.8493\\29\\-39.33873\\-166.8964\\29\\-37.3856\\-165.6782\\29\\-35.43248\\-166.7607\\29\\-31.71646\\-168.4115\\29\\-29.5731\\-169.5582\\29\\-25.66685\\-169.6902\\29\\-15.90123\\-169.6832\\29\\-13.9481\\-170.6878\\29\\-11.99498\\-171.5922\\29\\-10.72161\\-172.3178\\29\\-10.04185\\-172.9909\\29\\-9.340596\\-174.2709\\29\\-8.554068\\-176.224\\29\\-7.40461\\-178.1771\\29\\-5.630934\\-180.1303\\29\\-4.182476\\-181.1435\\29\\-2.229351\\-182.245\\29\\1.676899\\-183.9699\\29\\3.630024\\-185.0433\\29\\5.583149\\-186.9851\\29\\7.536274\\-187.6837\\29\\9.489399\\-188.9344\\29\\11.44252\\-189.6484\\29\\13.39565\\-190.6047\\29\\15.34877\\-191.3189\\29\\17.3019\\-191.6874\\29\\19.25502\\-192.5546\\29\\21.20815\\-194.205\\29\\25.7624\\-197.7084\\29\\27.06752\\-198.4473\\29\\28.56912\\-197.7084\\29\\30.97377\\-195.5671\\29\\31.92147\\-193.8021\\29\\32.11147\\-191.849\\29\\33.31359\\-189.8959\\29\\34.39756\\-187.9428\\29\\35.82171\\-185.9896\\29\\36.83315\\-185.0319\\29\\38.78627\\-183.3976\\29\\40.7394\\-182.9339\\29\\42.69252\\-182.3072\\29\\46.59877\\-182.1781\\29\\48.5519\\-182.2461\\29\\52.45815\\-183.8749\\29\\54.41127\\-184.1595\\29\\56.3644\\-185.1598\\29\\61.1302\\-189.8959\\29\\61.80783\\-191.849\\29\\61.81738\\-193.8021\\29\\62.99829\\-195.7553\\29\\63.38744\\-197.7084\\29\\64.1769\\-198.5883\\29\\68.08315\\-200.9576\\29\\68.69141\\-201.6146\\29\\68.08315\\-202.3538\\29\\65.77386\\-203.5678\\29\\64.1769\\-204.2639\\29\\62.22377\\-206.2518\\29\\61.3325\\-207.474\\29\\60.44629\\-209.4271\\29\\58.31752\\-211.5611\\29\\54.41127\\-213.8791\\29\\52.45815\\-214.6132\\29\\50.50502\\-214.3202\\29\\48.5519\\-213.2386\\29\\46.59877\\-213.0404\\29\\42.69252\\-212.1303\\29\\40.89613\\-211.3803\\29\\38.3362\\-209.4271\\29\\36.83315\\-208.5497\\29\\34.88002\\-207.9587\\29\\34.35236\\-207.474\\29\\32.9269\\-206.5676\\29\\30.97377\\-206.1203\\29\\30.35736\\-205.5209\\29\\29.02065\\-204.6191\\29\\27.06752\\-204.6097\\29\\25.1144\\-204.7079\\29\\24.27508\\-205.5209\\29\\23.32995\\-207.474\\29\\22.21889\\-209.4271\\29\\21.20815\\-210.793\\29\\15.34877\\-216.6865\\29\\13.39565\\-218.6068\\29\\11.44252\\-219.7998\\29\\7.536274\\-219.8489\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002287" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "154" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "445" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "89.56753\\-212.1009\\29\\88.98701\\-211.3803\\29\\88.78332\\-209.4271\\29\\88.73399\\-207.474\\29\\88.69149\\-199.6615\\29\\87.6144\\-197.6298\\29\\86.80704\\-195.7553\\29\\86.77525\\-193.8021\\29\\86.2079\\-191.849\\29\\84.90384\\-189.8959\\29\\84.79904\\-187.9428\\29\\83.99026\\-185.9896\\29\\82.81335\\-184.0365\\29\\82.43365\\-182.0834\\29\\80.89941\\-180.1303\\29\\80.79202\\-178.1771\\29\\79.97738\\-176.224\\29\\78.8299\\-174.2709\\29\\77.84878\\-172.1734\\29\\75.89565\\-168.4384\\29\\71.9894\\-164.4942\\29\\71.10391\\-162.5521\\29\\69.55477\\-160.599\\29\\68.08315\\-158.5843\\29\\66.13003\\-158.8075\\29\\63.96235\\-156.6928\\29\\62.22377\\-155.5337\\29\\60.35203\\-154.7396\\29\\58.31752\\-153.403\\29\\56.3644\\-152.3012\\29\\54.41127\\-151.6751\\29\\52.45815\\-151.4281\\29\\50.50502\\-150.3263\\29\\49.1295\\-148.8803\\29\\48.5519\\-148.1163\\29\\46.59877\\-147.8021\\29\\44.64565\\-149.8187\\29\\42.69252\\-149.9564\\29\\40.7394\\-148.1018\\29\\38.23018\\-146.9271\\29\\36.83315\\-146.3652\\29\\32.9269\\-145.1978\\29\\30.97377\\-144.521\\29\\27.06752\\-143.9601\\29\\25.1144\\-142.6539\\29\\23.16127\\-142.081\\29\\20.09842\\-139.1146\\29\\19.41897\\-137.1615\\29\\20.07665\\-135.2084\\29\\20.40814\\-133.2553\\29\\21.94677\\-129.349\\29\\23.16127\\-127.4195\\29\\25.1144\\-126.5174\\29\\27.06752\\-127.0015\\29\\29.02065\\-126.8099\\29\\30.97377\\-125.2265\\29\\32.9269\\-124.2891\\29\\33.87507\\-123.4896\\29\\35.47274\\-121.5365\\29\\36.83315\\-120.5599\\29\\38.78627\\-120.8475\\29\\40.7394\\-122.7513\\29\\42.69252\\-124.0279\\29\\44.08372\\-125.4428\\29\\44.29913\\-129.349\\29\\44.03136\\-131.3021\\29\\43.03304\\-135.2084\\29\\43.85077\\-137.1615\\29\\44.34169\\-139.1146\\29\\45.27044\\-141.0678\\29\\45.87486\\-143.0209\\29\\46.59877\\-144.2136\\29\\48.28556\\-144.974\\29\\48.66816\\-144.974\\29\\49.11399\\-143.0209\\29\\48.21361\\-141.0678\\29\\47.46101\\-139.1146\\29\\47.39071\\-137.1615\\29\\47.97905\\-135.2084\\29\\48.27007\\-133.2553\\29\\48.29281\\-127.3959\\29\\48.17487\\-125.4428\\29\\47.34556\\-123.4896\\29\\46.59877\\-122.7623\\29\\44.64565\\-122.057\\29\\44.06622\\-121.5365\\29\\42.54391\\-119.5834\\29\\42.38856\\-117.6303\\29\\40.70184\\-113.724\\29\\40.73177\\-111.7709\\29\\42.69252\\-110.4241\\29\\44.64565\\-108.8203\\29\\46.59877\\-107.3913\\29\\48.5519\\-106.2735\\29\\48.90399\\-105.9115\\29\\49.64814\\-103.9584\\29\\51.12592\\-102.0053\\29\\52.45815\\-100.8063\\29\\54.41127\\-100.416\\29\\56.40196\\-102.0053\\29\\57.27121\\-103.9584\\29\\58.47911\\-105.9115\\29\\59.24526\\-107.8646\\29\\60.89162\\-109.8178\\29\\61.70408\\-111.7709\\29\\61.74131\\-113.724\\29\\63.00407\\-115.6771\\29\\63.69728\\-117.6303\\29\\64.25767\\-119.5834\\29\\65.21014\\-121.5365\\29\\65.59989\\-123.4896\\29\\66.85982\\-125.4428\\29\\67.54493\\-127.3959\\29\\68.75489\\-129.349\\29\\70.03628\\-132.0457\\29\\71.9894\\-132.3982\\29\\73.46768\\-133.2553\\29\\72.98076\\-135.2084\\29\\72.64224\\-137.1615\\29\\74.29935\\-139.1146\\29\\75.19232\\-141.0678\\29\\76.38393\\-143.0209\\29\\77.02715\\-144.974\\29\\78.30176\\-146.9271\\29\\79.00636\\-148.8803\\29\\80.37156\\-150.8334\\29\\80.34012\\-152.7865\\29\\78.69684\\-154.7396\\29\\79.8019\\-156.3929\\29\\81.75503\\-157.4601\\29\\83.70815\\-158.047\\29\\85.66128\\-159.7492\\29\\90.3435\\-164.5053\\29\\91.96901\\-166.4584\\29\\92.83525\\-168.4115\\29\\94.28482\\-170.3646\\29\\95.90923\\-172.3178\\29\\96.66123\\-174.2709\\29\\97.16832\\-176.224\\29\\98.00439\\-178.1771\\29\\98.49036\\-180.1303\\29\\98.8363\\-182.0834\\29\\98.90778\\-184.0365\\29\\98.8998\\-187.9428\\29\\99.9402\\-189.8959\\29\\100.2721\\-191.849\\29\\100.2545\\-199.6615\\29\\99.80966\\-201.6146\\29\\98.54147\\-203.5678\\29\\97.9372\\-205.5209\\29\\96.17458\\-207.474\\29\\94.17053\\-209.4271\\29\\92.4761\\-211.3803\\29\\91.52065\\-212.3515\\29" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "182" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "446" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-99.939\\-209.4271\\31\\-100.9209\\-207.474\\31\\-101.031\\-205.5209\\31\\-101.3168\\-203.5678\\31\\-102.4631\\-201.6146\\31\\-102.8894\\-199.6615\\31\\-102.8974\\-195.7553\\31\\-102.9706\\-193.8021\\31\\-103.1425\\-191.849\\31\\-103.1425\\-189.8959\\31\\-102.8974\\-184.0365\\31\\-102.8934\\-182.0834\\31\\-102.5055\\-180.1303\\31\\-101.0257\\-178.1771\\31\\-100.5349\\-176.224\\31\\-99.05963\\-174.2709\\31\\-98.54954\\-172.3178\\31\\-96.79925\\-170.3646\\31\\-95.26492\\-168.4115\\31\\-94.18781\\-166.4584\\31\\-90.96201\\-162.5521\\31\\-89.86089\\-160.599\\31\\-88.9798\\-158.6459\\31\\-87.57451\\-156.6928\\31\\-86.67789\\-154.7396\\31\\-85.50843\\-152.7865\\31\\-84.82445\\-150.8334\\31\\-83.75529\\-148.8803\\31\\-83.14101\\-146.9271\\31\\-81.93045\\-144.974\\31\\-81.72261\\-143.0209\\31\\-81.24808\\-141.0678\\31\\-80.06138\\-139.1146\\31\\-79.45917\\-137.1615\\31\\-79.00828\\-135.2084\\31\\-77.57668\\-133.2553\\31\\-77.00222\\-131.3021\\31\\-75.68746\\-129.349\\31\\-74.29554\\-125.4428\\31\\-73.24798\\-123.4896\\31\\-72.43334\\-121.5365\\31\\-72.38026\\-119.5834\\31\\-71.2346\\-117.6303\\31\\-70.40173\\-115.6771\\31\\-70.40173\\-113.724\\31\\-69.23433\\-111.7709\\31\\-68.6356\\-110.4813\\31\\-66.28574\\-105.9115\\31\\-66.16052\\-103.9584\\31\\-65.31298\\-102.0053\\31\\-62.77623\\-99.80465\\31\\-60.8231\\-99.16049\\31\\-59.63232\\-100.0521\\31\\-58.09483\\-102.0053\\31\\-56.91685\\-103.0524\\31\\-54.96373\\-102.6813\\31\\-53.0106\\-101.3217\\31\\-52.20321\\-102.0053\\31\\-51.91545\\-103.9584\\31\\-51.05748\\-105.4789\\31\\-49.10435\\-105.6185\\31\\-47.9461\\-103.9584\\31\\-47.15123\\-103.2748\\31\\-46.424\\-103.9584\\31\\-45.7574\\-105.9115\\31\\-45.1981\\-106.9723\\31\\-44.508\\-107.8646\\31\\-45.1981\\-108.2628\\31\\-47.15123\\-110.3578\\31\\-48.33175\\-111.7709\\31\\-51.05748\\-114.4731\\31\\-52.13318\\-115.6771\\31\\-53.47257\\-117.6303\\31\\-54.03345\\-119.5834\\31\\-55.61306\\-121.5365\\31\\-56.18196\\-123.4896\\31\\-56.89414\\-125.4428\\31\\-56.98344\\-127.3959\\31\\-56.75526\\-129.349\\31\\-56.32219\\-131.3021\\31\\-54.96373\\-133.3186\\31\\-53.0106\\-134.5743\\31\\-52.50488\\-135.2084\\31\\-53.25687\\-137.1615\\31\\-55.24585\\-139.1146\\31\\-55.80614\\-141.0678\\31\\-56.56081\\-143.0209\\31\\-54.96373\\-144.2377\\31\\-53.0106\\-141.9746\\31\\-51.05748\\-142.2129\\31\\-49.11626\\-141.0678\\31\\-48.90491\\-137.1615\\31\\-48.96891\\-135.2084\\31\\-49.89291\\-133.2553\\31\\-50.64854\\-131.3021\\31\\-50.93541\\-129.349\\31\\-49.88668\\-127.3959\\31\\-48.96891\\-125.4428\\31\\-48.4551\\-123.4896\\31\\-46.90174\\-121.5365\\31\\-45.1981\\-120.5433\\31\\-44.08684\\-119.5834\\31\\-43.63192\\-117.6303\\31\\-43.24498\\-117.1341\\31\\-41.29185\\-116.2842\\31\\-39.33873\\-116.5615\\31\\-38.14766\\-115.6771\\31\\-37.3856\\-114.2123\\31\\-36.99323\\-113.724\\31\\-35.43248\\-112.8412\\31\\-34.50758\\-113.724\\31\\-32.77905\\-115.6771\\31\\-31.52623\\-116.5547\\31\\-29.5731\\-116.7404\\31\\-28.52678\\-117.6303\\31\\-27.39698\\-119.5834\\31\\-28.5902\\-121.5365\\31\\-28.74331\\-123.4896\\31\\-28.76365\\-125.4428\\31\\-28.60562\\-127.3959\\31\\-28.27627\\-129.349\\31\\-27.61998\\-130.9986\\31\\-26.38556\\-133.2553\\31\\-26.40602\\-135.2084\\31\\-27.61998\\-137.119\\31\\-29.5731\\-137.7663\\31\\-31.52623\\-138.1381\\31\\-32.6352\\-139.1146\\31\\-34.13222\\-141.0678\\31\\-33.47935\\-143.0621\\31\\-35.43248\\-144.2152\\31\\-37.3856\\-144.5486\\31\\-39.33873\\-145.0825\\31\\-41.29185\\-145.1857\\31\\-43.24498\\-145.6666\\31\\-45.1981\\-146.2673\\31\\-46.74329\\-146.9271\\31\\-49.10435\\-148.0665\\31\\-51.05748\\-149.9281\\31\\-52.86796\\-150.8334\\31\\-53.20295\\-150.8334\\31\\-54.96373\\-150.1375\\31\\-56.78947\\-148.8803\\31\\-56.50822\\-146.9271\\31\\-55.74334\\-144.974\\31\\-56.91685\\-143.4049\\31\\-57.65966\\-144.974\\31\\-57.397\\-146.9271\\31\\-58.86998\\-148.4001\\31\\-59.54782\\-148.8803\\31\\-62.77623\\-150.3852\\31\\-64.72935\\-152.2416\\31\\-66.68247\\-154.5395\\31\\-70.76534\\-158.6459\\31\\-72.54185\\-159.584\\31\\-73.55115\\-160.599\\31\\-74.71296\\-162.5521\\31\\-76.4481\\-163.6026\\31\\-77.31335\\-164.5053\\31\\-78.56661\\-166.4584\\31\\-80.28403\\-170.3646\\31\\-81.37269\\-172.3178\\31\\-81.59328\\-174.2709\\31\\-82.92838\\-176.224\\31\\-83.44337\\-178.1771\\31\\-83.61127\\-180.1303\\31\\-84.90184\\-182.0834\\31\\-85.61813\\-184.0365\\31\\-86.81422\\-185.9896\\31\\-87.36294\\-187.9428\\31\\-87.38452\\-189.8959\\31\\-88.4389\\-191.849\\31\\-89.26875\\-193.8021\\31\\-89.33121\\-197.7084\\31\\-89.89618\\-201.6146\\31\\-89.57066\\-203.5678\\31\\-89.64913\\-205.5209\\31\\-90.11997\\-206.0664\\31\\-92.0731\\-207.793\\31\\-94.02622\\-209.9918\\31\\-95.97935\\-210.8183\\31\\-97.93247\\-210.6491\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "447" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-51.05748\\-95.15248\\31\\-52.19348\\-94.19276\\31\\-51.05748\\-92.18219\\31\\-49.10435\\-91.85308\\31\\-48.91307\\-92.23963\\31\\-47.15123\\-93.26298\\31\\-45.1981\\-94.2411\\31\\-49.10435\\-96.06137\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "448" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-106.4028\\31\\-42.39048\\-105.9115\\31\\-42.46476\\-102.0053\\31\\-42.43983\\-100.0521\\31\\-41.80928\\-98.09901\\31\\-41.29185\\-97.63367\\31\\-39.33873\\-97.17535\\31\\-37.3856\\-97.73202\\31\\-36.95881\\-98.09901\\31\\-36.25017\\-100.0521\\31\\-37.3856\\-102.0876\\31\\-38.21152\\-103.9584\\31\\-39.33873\\-104.9486\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "449" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-19.80748\\-123.9812\\31\\-20.26812\\-123.4896\\31\\-19.80748\\-122.9665\\31\\-18.03584\\-121.5365\\31\\-18.54401\\-119.5834\\31\\-20.9363\\-117.6303\\31\\-20.81845\\-115.6771\\31\\-19.80748\\-114.6617\\31\\-17.85435\\-114.5554\\31\\-15.90123\\-114.5718\\31\\-13.9481\\-113.0318\\31\\-11.99498\\-111.0812\\31\\-10.4691\\-111.7709\\31\\-10.47921\\-113.724\\31\\-10.81365\\-115.6771\\31\\-11.34936\\-117.6303\\31\\-11.99498\\-118.2831\\31\\-13.9481\\-119.0183\\31\\-17.68056\\-121.5365\\31\\-17.64913\\-123.4896\\31\\-17.85435\\-124.0045\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "450" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.04185\\-159.0163\\31\\-10.46147\\-158.6459\\31\\-11.25394\\-156.6928\\31\\-11.99498\\-155.5779\\31\\-13.9481\\-153.9393\\31\\-15.90123\\-153.7277\\31\\-16.68365\\-152.7865\\31\\-15.90123\\-152.0357\\31\\-13.9481\\-151.9054\\31\\-10.04185\\-151.1482\\31\\-8.088726\\-151.0572\\31\\-6.135601\\-149.2611\\31\\-5.876513\\-148.8803\\31\\-5.048862\\-146.9271\\31\\-4.182476\\-145.1854\\31\\-4.182476\\-144.7749\\31\\-5.046897\\-143.0209\\31\\-5.565939\\-141.0678\\31\\-5.781145\\-139.1146\\31\\-6.486653\\-137.1615\\31\\-7.760537\\-135.2084\\31\\-9.517401\\-133.2553\\31\\-10.13659\\-131.3021\\31\\-8.87474\\-129.349\\31\\-8.088726\\-128.6166\\31\\-6.135601\\-128.7671\\31\\-4.182476\\-128.345\\31\\-2.229351\\-127.3133\\31\\-0.276226\\-126.8128\\31\\1.676899\\-127.9062\\31\\2.795063\\-129.349\\31\\6.083196\\-133.2553\\31\\6.818501\\-135.2084\\31\\6.921985\\-137.1615\\31\\6.449677\\-139.1146\\31\\5.583149\\-140.8893\\31\\5.583149\\-141.2428\\31\\6.666348\\-143.0209\\31\\7.536274\\-143.7777\\31\\9.489399\\-144.8376\\31\\11.73026\\-146.9271\\31\\12.18062\\-148.8803\\31\\11.44252\\-149.3504\\31\\8.416386\\-150.8334\\31\\7.536274\\-151.3818\\31\\5.948298\\-152.7865\\31\\4.74527\\-154.7396\\31\\4.606586\\-156.6928\\31\\3.630024\\-158.6924\\31\\1.676899\\-159.4934\\31\\-2.229351\\-159.5485\\31\\-4.182476\\-159.7421\\31\\-6.135601\\-159.6964\\31\\-8.088726\\-159.4553\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "141" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "451" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.276226\\-217.4987\\31\\-2.229351\\-216.107\\31\\-4.182476\\-214.2235\\31\\-6.135601\\-212.9174\\31\\-10.04185\\-213.0294\\31\\-11.99498\\-212.7312\\31\\-13.9481\\-212.0037\\31\\-15.90123\\-210.7997\\31\\-17.85435\\-210.584\\31\\-19.80748\\-210.4867\\31\\-21.7606\\-210.0188\\31\\-23.71373\\-208.7445\\31\\-25.66685\\-208.5304\\31\\-27.61998\\-208.5077\\31\\-29.5731\\-208.0329\\31\\-31.52623\\-206.7814\\31\\-33.47935\\-206.6391\\31\\-39.33873\\-206.5334\\31\\-41.29185\\-206.1877\\31\\-43.24498\\-204.7752\\31\\-45.1981\\-204.5854\\31\\-47.15123\\-203.8102\\31\\-49.10435\\-202.6308\\31\\-51.05748\\-202.2568\\31\\-53.0106\\-200.9508\\31\\-54.30717\\-199.6615\\31\\-55.7333\\-195.7553\\31\\-56.91685\\-194.0801\\31\\-58.86998\\-194.9754\\31\\-60.05176\\-193.8021\\31\\-59.75159\\-191.849\\31\\-58.63262\\-189.8959\\31\\-57.89341\\-187.9428\\31\\-56.91685\\-186.5951\\31\\-54.43475\\-184.0365\\31\\-53.55992\\-182.0834\\31\\-51.94744\\-180.1303\\31\\-50.82012\\-178.1771\\31\\-49.85342\\-176.224\\31\\-49.10435\\-175.453\\31\\-47.15123\\-174.6092\\31\\-45.1981\\-173.4256\\31\\-43.24498\\-171.9879\\31\\-41.29185\\-170.9517\\31\\-39.33873\\-169.6918\\31\\-37.3856\\-169.5508\\31\\-35.43248\\-169.6383\\31\\-31.52623\\-171.5914\\31\\-27.61998\\-173.3371\\31\\-23.71373\\-173.3964\\31\\-21.7606\\-172.713\\31\\-19.80748\\-171.6921\\31\\-15.90123\\-171.7038\\31\\-13.9481\\-172.8828\\31\\-11.99498\\-174.6282\\31\\-10.58282\\-176.224\\31\\-9.350833\\-178.1771\\31\\-8.088726\\-179.6553\\31\\-6.135601\\-180.9297\\31\\-4.182476\\-181.4845\\31\\-2.564589\\-182.0834\\31\\-0.276226\\-183.0764\\31\\1.676899\\-184.132\\31\\3.630024\\-185.0703\\31\\5.583149\\-186.9851\\31\\7.536274\\-187.8073\\31\\9.489399\\-188.9753\\31\\11.44252\\-189.7605\\31\\13.39565\\-190.9028\\31\\15.34877\\-192.5242\\31\\17.3019\\-193.1383\\31\\19.25502\\-194.2227\\31\\21.20815\\-196.2359\\31\\22.18471\\-197.7084\\31\\23.16127\\-198.6651\\31\\27.06752\\-199.4745\\31\\29.02065\\-199.0337\\31\\30.97377\\-197.9474\\31\\31.22326\\-197.7084\\31\\32.46273\\-195.7553\\31\\32.88934\\-193.8021\\31\\33.51858\\-191.849\\31\\34.3343\\-189.8959\\31\\35.58338\\-187.9428\\31\\37.38654\\-185.9896\\31\\40.7394\\-183.3702\\31\\42.69252\\-182.9379\\31\\44.64565\\-182.3803\\31\\46.59877\\-182.9797\\31\\48.5519\\-183.127\\31\\50.50502\\-183.4368\\31\\52.20274\\-184.0365\\31\\54.41127\\-184.9495\\31\\56.3644\\-185.3754\\31\\58.31752\\-187.0934\\31\\61.1302\\-189.8959\\31\\61.80783\\-191.849\\31\\61.94195\\-193.8021\\31\\63.17334\\-195.7553\\31\\63.7705\\-197.7084\\31\\64.1769\\-198.1628\\31\\66.13003\\-199.5385\\31\\68.08315\\-200.2758\\31\\69.42922\\-201.6146\\31\\68.08315\\-203.2422\\31\\66.13003\\-203.5012\\31\\64.1769\\-204.6756\\31\\63.421\\-205.5209\\31\\62.94248\\-207.474\\31\\61.38222\\-209.4271\\31\\60.35203\\-211.3803\\31\\56.3644\\-213.7891\\31\\54.41127\\-214.6164\\31\\52.45815\\-214.94\\31\\50.50502\\-214.7028\\31\\48.5519\\-213.9898\\31\\46.59877\\-212.9367\\31\\44.64565\\-212.4409\\31\\42.69252\\-211.1933\\31\\40.7394\\-210.4785\\31\\37.60565\\-207.474\\31\\35.85659\\-205.5209\\31\\34.88002\\-203.4963\\31\\32.9269\\-202.6693\\31\\30.97377\\-202.8037\\31\\29.02065\\-203.7294\\31\\27.06752\\-203.817\\31\\25.1144\\-203.7548\\31\\23.16127\\-204.2056\\31\\22.09302\\-205.5209\\31\\21.20815\\-206.7944\\31\\20.56337\\-207.474\\31\\20.05271\\-209.4271\\31\\19.25502\\-210.6572\\31\\18.61928\\-211.3803\\31\\12.78442\\-217.2396\\31\\11.44252\\-218.2759\\31\\9.489399\\-218.9702\\31\\7.536274\\-218.9575\\31\\3.630024\\-218.8086\\31\\1.676899\\-218.291\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "11" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "452" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-118.5064\\31\\4.788743\\-117.6303\\31\\4.485206\\-115.6771\\31\\5.583149\\-114.6805\\31\\7.536274\\-114.6805\\31\\9.489399\\-115.6533\\31\\11.44252\\-116.8203\\31\\12.20327\\-117.6303\\31\\11.44252\\-118.4216\\31\\9.489399\\-119.1025\\31\\7.536274\\-119.1367\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "453" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "42.69252\\-149.4576\\31\\40.7394\\-148.0412\\31\\36.83315\\-146.1334\\31\\34.88002\\-145.3707\\31\\29.02065\\-145.0825\\31\\27.06752\\-144.5676\\31\\25.1144\\-144.2526\\31\\23.16127\\-143.7818\\31\\21.20815\\-142.33\\31\\19.25502\\-141.6602\\31\\18.66258\\-141.0678\\31\\17.77556\\-139.1146\\31\\18.03689\\-135.2084\\31\\18.22933\\-131.3021\\31\\19.36434\\-129.349\\31\\20.23159\\-127.3959\\31\\21.20815\\-126.5029\\31\\25.1144\\-125.8867\\31\\27.06752\\-126.1336\\31\\29.02065\\-125.1172\\31\\30.97377\\-124.2358\\31\\32.9269\\-122.8845\\31\\34.88002\\-120.9495\\31\\36.83315\\-120.6826\\31\\38.78627\\-121.6173\\31\\42.02781\\-123.4896\\31\\42.69252\\-123.9605\\31\\44.15737\\-125.4428\\31\\44.32013\\-127.3959\\31\\45.22245\\-129.349\\31\\45.44958\\-131.3021\\31\\43.72359\\-133.2553\\31\\43.5425\\-135.2084\\31\\45.71244\\-137.1615\\31\\45.49262\\-139.1146\\31\\45.50918\\-141.0678\\31\\47.09301\\-143.0209\\31\\48.10911\\-144.974\\31\\47.8599\\-146.9271\\31\\44.64565\\-149.3885\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002286" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "121" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "454" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "91.52065\\-209.0057\\31\\90.71227\\-207.474\\31\\90.69516\\-205.5209\\31\\90.1547\\-203.5678\\31\\90.05581\\-201.6146\\31\\90.10654\\-199.6615\\31\\88.97285\\-197.7084\\31\\88.75549\\-195.7553\\31\\88.6943\\-193.8021\\31\\87.82418\\-191.849\\31\\86.81999\\-189.8959\\31\\86.73447\\-187.9428\\31\\85.92948\\-185.9896\\31\\84.80615\\-184.0365\\31\\83.97311\\-182.0834\\31\\82.83855\\-180.1303\\31\\82.76414\\-178.1771\\31\\81.92018\\-176.224\\31\\80.80677\\-174.2709\\31\\78.84904\\-170.3646\\31\\77.93904\\-168.4115\\31\\75.89565\\-166.2691\\31\\73.94253\\-162.7825\\31\\71.96597\\-160.599\\31\\70.50476\\-158.6459\\31\\69.22352\\-156.6928\\31\\68.08315\\-155.6884\\31\\66.13003\\-155.6071\\31\\64.1769\\-154.8481\\31\\62.22377\\-153.6391\\31\\60.27065\\-152.8096\\31\\58.31752\\-151.6975\\31\\56.3644\\-151.3809\\31\\54.41127\\-150.3793\\31\\52.45815\\-149.7489\\31\\50.71217\\-148.8803\\31\\49.34955\\-146.9271\\31\\49.29449\\-144.974\\31\\49.81781\\-143.0209\\31\\49.1206\\-141.0678\\31\\47.91\\-139.1146\\31\\47.7235\\-137.1615\\31\\48.5519\\-136.2651\\31\\49.28941\\-135.2084\\31\\49.68959\\-133.2553\\31\\49.66866\\-127.3959\\31\\49.03408\\-125.4428\\31\\47.35773\\-123.4896\\31\\46.59877\\-122.7623\\31\\44.64565\\-122.0248\\31\\44.06402\\-121.5365\\31\\42.44504\\-119.5834\\31\\42.49308\\-117.6303\\31\\41.86379\\-115.6771\\31\\41.76148\\-113.724\\31\\41.83085\\-111.7709\\31\\42.69252\\-110.8139\\31\\44.64565\\-109.0115\\31\\46.08844\\-107.8646\\31\\48.5519\\-105.6391\\31\\49.87313\\-103.9584\\31\\52.45815\\-101.2888\\31\\54.41127\\-101.2354\\31\\55.22417\\-102.0053\\31\\56.53878\\-103.9584\\31\\57.31238\\-105.9115\\31\\58.99084\\-107.8646\\31\\60.45765\\-109.8178\\31\\61.0762\\-111.7709\\31\\61.19153\\-113.724\\31\\62.87305\\-115.6771\\31\\63.62278\\-117.6303\\31\\63.75153\\-119.5834\\31\\65.03313\\-121.5365\\31\\65.58381\\-123.4896\\31\\66.85982\\-125.4428\\31\\67.54493\\-127.3959\\31\\68.75489\\-129.349\\31\\70.03628\\-131.8494\\31\\71.9894\\-132.3097\\31\\73.57092\\-133.2553\\31\\72.99541\\-135.2084\\31\\72.76955\\-137.1615\\31\\74.68003\\-139.1146\\31\\75.89565\\-141.4238\\31\\77.55581\\-144.974\\31\\78.61156\\-146.9271\\31\\80.18884\\-148.8803\\31\\80.61793\\-150.8334\\31\\79.8019\\-151.9717\\31\\78.98183\\-152.7865\\31\\77.64053\\-154.7396\\31\\79.0794\\-156.6928\\31\\79.8019\\-157.2774\\31\\81.75503\\-157.2998\\31\\83.70815\\-157.8814\\31\\86.4715\\-160.599\\31\\87.6144\\-161.5576\\31\\89.44338\\-162.5521\\31\\91.54336\\-164.5053\\31\\94.02386\\-168.4115\\31\\95.66042\\-170.3646\\31\\96.69281\\-172.3178\\31\\97.94212\\-174.2709\\31\\98.37426\\-176.224\\31\\98.63633\\-178.1771\\31\\99.07406\\-180.1303\\31\\99.15876\\-182.0834\\31\\99.08566\\-184.0365\\31\\98.285\\-185.9896\\31\\98.2417\\-187.9428\\31\\99.99599\\-189.8959\\31\\100.5129\\-191.849\\31\\100.7726\\-195.7553\\31\\100.8243\\-199.6615\\31\\100.5041\\-201.6146\\31\\100.3097\\-203.5678\\31\\99.38656\\-205.5209\\31\\97.38003\\-206.6376\\31\\95.4269\\-208.2168\\31\\93.47378\\-209.275\\31" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "121" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "455" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-99.8856\\-210.8042\\33\\-101.0872\\-209.4271\\33\\-102.3793\\-207.474\\33\\-102.8693\\-205.5209\\33\\-102.9706\\-201.6146\\33\\-103.2299\\-199.6615\\33\\-103.4453\\-191.849\\33\\-103.4558\\-189.8959\\33\\-104.4071\\-187.9428\\33\\-104.3767\\-185.9896\\33\\-103.321\\-184.0365\\33\\-103.321\\-182.0834\\33\\-103.0654\\-180.1303\\33\\-102.4916\\-178.1771\\33\\-101.0528\\-176.224\\33\\-100.5313\\-174.2709\\33\\-99.09959\\-172.3178\\33\\-98.11948\\-170.3646\\33\\-96.58833\\-168.4115\\33\\-94.86701\\-166.4584\\33\\-93.38418\\-164.5053\\33\\-92.32078\\-162.5521\\33\\-90.74905\\-160.599\\33\\-89.49519\\-158.6459\\33\\-88.4658\\-156.6928\\33\\-86.95289\\-154.7396\\33\\-85.62997\\-152.7865\\33\\-85.43531\\-150.8334\\33\\-84.76935\\-148.8803\\33\\-83.4747\\-146.9271\\33\\-82.96385\\-144.974\\33\\-81.93045\\-143.0209\\33\\-81.02065\\-139.1146\\33\\-79.84067\\-137.1615\\33\\-79.16237\\-135.2084\\33\\-78.01429\\-133.2553\\33\\-77.1478\\-131.3021\\33\\-75.17806\\-127.3959\\33\\-74.49497\\-125.7881\\33\\-73.24798\\-123.4896\\33\\-72.43334\\-121.5365\\33\\-72.38026\\-119.5834\\33\\-71.2346\\-117.6303\\33\\-70.40173\\-115.6771\\33\\-70.26758\\-113.724\\33\\-69.16882\\-111.7709\\33\\-68.29951\\-109.8178\\33\\-66.28574\\-105.9115\\33\\-66.2571\\-103.9584\\33\\-65.92065\\-102.0053\\33\\-62.77623\\-99.31037\\33\\-60.8231\\-97.88731\\33\\-58.86998\\-96.70277\\33\\-58.13755\\-96.14588\\33\\-56.91685\\-95.50779\\33\\-54.96373\\-94.8697\\33\\-54.52891\\-94.19276\\33\\-51.65278\\-92.23963\\33\\-51.05748\\-91.63184\\33\\-49.10435\\-90.96746\\33\\-47.15123\\-91.3523\\33\\-45.1981\\-92.04717\\33\\-43.24498\\-93.20078\\33\\-42.28824\\-94.19276\\33\\-41.15542\\-96.14588\\33\\-39.33873\\-97.26893\\33\\-38.45224\\-98.09901\\33\\-36.84622\\-100.0521\\33\\-38.18845\\-103.9584\\33\\-41.29185\\-107.1605\\33\\-44.42476\\-109.8178\\33\\-47.15123\\-112.5329\\33\\-49.10435\\-114.0321\\33\\-51.05748\\-115.0242\\33\\-51.69579\\-115.6771\\33\\-53.14604\\-117.6303\\33\\-53.87373\\-119.5834\\33\\-55.71226\\-121.5365\\33\\-56.91685\\-123.8778\\33\\-57.57314\\-125.4428\\33\\-57.76382\\-127.3959\\33\\-57.05229\\-129.349\\33\\-56.34534\\-133.2553\\33\\-55.84806\\-135.2084\\33\\-56.07088\\-137.1615\\33\\-56.74247\\-139.1146\\33\\-57.57669\\-141.0678\\33\\-58.52345\\-144.974\\33\\-59.68378\\-146.9271\\33\\-60.8231\\-147.7634\\33\\-62.77623\\-148.7408\\33\\-64.72935\\-150.5335\\33\\-66.68247\\-152.6434\\33\\-68.6356\\-154.5965\\33\\-70.85934\\-156.6928\\33\\-72.54185\\-157.4773\\33\\-74.49497\\-158.5064\\33\\-76.5407\\-160.599\\33\\-78.40122\\-163.5857\\33\\-80.56872\\-166.4584\\33\\-82.30747\\-170.1651\\33\\-83.39085\\-172.3178\\33\\-83.50668\\-174.2709\\33\\-84.2606\\-175.9827\\33\\-85.36665\\-178.1771\\33\\-85.48661\\-180.1303\\33\\-86.55177\\-182.0834\\33\\-87.43163\\-184.0365\\33\\-88.53853\\-185.9896\\33\\-89.33524\\-187.9428\\33\\-89.36043\\-189.8959\\33\\-89.63765\\-191.849\\33\\-90.68567\\-193.8021\\33\\-91.18009\\-195.7553\\33\\-91.18484\\-197.7084\\33\\-91.33659\\-201.6146\\33\\-91.33513\\-205.5209\\33\\-92.952\\-207.474\\33\\-94.68243\\-209.4271\\33\\-95.97935\\-210.6466\\33\\-97.93247\\-211.0654\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "456" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-53.0106\\-149.6708\\33\\-54.50474\\-148.8803\\33\\-54.96373\\-148.1631\\33\\-55.43457\\-146.9271\\33\\-54.8078\\-144.974\\33\\-51.42147\\-143.0209\\33\\-51.05748\\-142.5326\\33\\-50.37109\\-141.0678\\33\\-49.71542\\-139.1146\\33\\-49.15904\\-137.1615\\33\\-49.92753\\-135.2084\\33\\-50.57212\\-133.2553\\33\\-51.08036\\-131.3021\\33\\-51.19804\\-129.349\\33\\-49.52972\\-125.4428\\33\\-48.77883\\-123.4896\\33\\-46.91522\\-121.5365\\33\\-45.1981\\-120.6166\\33\\-44.04087\\-119.5834\\33\\-42.31067\\-117.6303\\33\\-41.29185\\-116.6884\\33\\-39.33873\\-116.5629\\33\\-37.3856\\-116.1204\\33\\-35.43248\\-115.3425\\33\\-33.47935\\-116.5102\\33\\-31.52623\\-117.2359\\33\\-30.90478\\-117.6303\\33\\-29.62193\\-119.5834\\33\\-30.75311\\-121.5365\\33\\-30.3344\\-123.4896\\33\\-29.3324\\-125.4428\\33\\-28.57422\\-127.3959\\33\\-25.46557\\-131.3021\\33\\-24.50026\\-133.2553\\33\\-24.84634\\-135.2084\\33\\-26.47006\\-137.1615\\33\\-27.61998\\-138.1381\\33\\-29.5731\\-138.5973\\33\\-30.37048\\-139.1146\\33\\-31.52623\\-140.2197\\33\\-32.11574\\-141.0678\\33\\-31.125\\-143.0209\\33\\-31.52623\\-144.2532\\33\\-32.28306\\-144.974\\33\\-33.47935\\-145.293\\33\\-35.43248\\-145.0262\\33\\-37.3856\\-144.9359\\33\\-41.29185\\-145.0262\\33\\-43.24498\\-145.1226\\33\\-45.1981\\-145.6513\\33\\-47.15123\\-146.2888\\33\\-49.10435\\-147.5285\\33\\-51.4542\\-148.8803\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "21" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "457" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-125.6545\\33\\-19.80748\\-124.4554\\33\\-20.6815\\-123.4896\\33\\-20.03932\\-121.5365\\33\\-19.11491\\-119.5834\\33\\-20.51361\\-117.6303\\33\\-20.0893\\-115.6771\\33\\-19.80748\\-115.3814\\33\\-17.85435\\-114.5672\\33\\-15.90123\\-114.5117\\33\\-13.9481\\-112.9645\\33\\-11.99498\\-111.0271\\33\\-9.946788\\-111.7709\\33\\-9.959849\\-113.724\\33\\-10.24129\\-115.6771\\33\\-10.8003\\-117.6303\\33\\-11.99498\\-118.9093\\33\\-13.9481\\-120.6355\\33\\-15.94561\\-121.5365\\33\\-16.85226\\-123.4896\\33\\-17.01342\\-125.4428\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "458" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.088726\\-160.9267\\33\\-10.04185\\-160.1875\\33\\-11.99498\\-159.7657\\33\\-13.9481\\-158.9991\\33\\-16.3379\\-156.6928\\33\\-17.85435\\-155.4656\\33\\-19.80748\\-153.2029\\33\\-21.7606\\-151.1422\\33\\-22.23603\\-150.8334\\33\\-21.7606\\-150.4957\\33\\-17.85435\\-151.3311\\33\\-15.90123\\-151.0328\\33\\-13.9481\\-151.1373\\33\\-11.99498\\-151.0691\\33\\-10.04185\\-150.1684\\33\\-8.088726\\-149.6168\\33\\-6.135601\\-148.0719\\33\\-5.191057\\-146.9271\\33\\-4.337838\\-144.974\\33\\-5.293897\\-143.0209\\33\\-5.190372\\-141.0678\\33\\-4.182476\\-139.629\\33\\-3.656048\\-139.1146\\33\\-3.282644\\-137.1615\\33\\-4.239253\\-135.2084\\33\\-6.135601\\-134.1425\\33\\-8.088726\\-133.8456\\33\\-8.880334\\-133.2553\\33\\-9.758922\\-131.3021\\33\\-8.088726\\-129.9685\\33\\-4.182476\\-130.8753\\33\\-2.229351\\-130.7429\\33\\-0.276226\\-129.8246\\33\\1.676899\\-129.2405\\33\\3.630024\\-130.5118\\33\\4.436973\\-131.3021\\33\\5.744739\\-133.2553\\33\\6.665659\\-135.2084\\33\\7.221461\\-137.1615\\33\\6.706425\\-139.1146\\33\\6.295641\\-141.0678\\33\\7.536274\\-142.5415\\33\\9.489399\\-144.2185\\33\\11.44252\\-145.6938\\33\\13.39565\\-145.9553\\33\\15.47747\\-146.9271\\33\\15.86315\\-148.8803\\33\\15.34877\\-149.415\\33\\12.44381\\-150.8334\\33\\11.44252\\-151.4514\\33\\9.860131\\-152.7865\\33\\7.914582\\-154.7396\\33\\6.844542\\-156.6928\\33\\6.152811\\-158.6459\\33\\4.771381\\-160.599\\33\\3.630024\\-161.6079\\33\\1.676899\\-161.7569\\33\\-0.276226\\-161.7569\\33\\-2.229351\\-161.4559\\33\\-6.135601\\-161.4559\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "144" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "459" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "1.676899\\-217.4987\\33\\-0.276226\\-216.3721\\33\\-2.229351\\-215.4229\\33\\-4.182476\\-214.1472\\33\\-6.135601\\-213.0743\\33\\-8.088726\\-213.975\\33\\-10.04185\\-214.4459\\33\\-11.99498\\-213.9366\\33\\-13.9481\\-212.7651\\33\\-15.90123\\-212.4857\\33\\-17.85435\\-211.9719\\33\\-19.80748\\-211.0547\\33\\-21.7606\\-210.7732\\33\\-23.71373\\-210.0985\\33\\-25.66685\\-209.0703\\33\\-27.61998\\-209.0501\\33\\-29.5731\\-208.7511\\33\\-31.52623\\-208.5606\\33\\-33.47935\\-208.5083\\33\\-35.43248\\-208.097\\33\\-37.3856\\-207.097\\33\\-39.33873\\-207.097\\33\\-41.29185\\-206.7537\\33\\-43.24498\\-206.5722\\33\\-45.1981\\-206.1701\\33\\-47.15123\\-204.7812\\33\\-49.10435\\-204.2241\\33\\-51.05748\\-202.929\\33\\-53.0106\\-202.6423\\33\\-54.30294\\-201.6146\\33\\-55.64784\\-199.6615\\33\\-56.08604\\-197.7084\\33\\-56.91685\\-196.2563\\33\\-58.86998\\-197.041\\33\\-60.15567\\-195.7553\\33\\-59.89627\\-193.8021\\33\\-59.25937\\-191.849\\33\\-56.91685\\-188.5768\\33\\-56.36872\\-187.9428\\33\\-55.48568\\-185.9896\\33\\-53.93316\\-184.0365\\33\\-53.10534\\-182.0834\\33\\-51.94308\\-180.1303\\33\\-49.10435\\-176.838\\33\\-47.15123\\-175.0754\\33\\-45.1981\\-173.974\\33\\-43.24498\\-173.1425\\33\\-41.29185\\-172.0924\\33\\-39.33873\\-171.7294\\33\\-35.43248\\-171.7294\\33\\-33.47935\\-172.7996\\33\\-31.52623\\-173.6061\\33\\-29.5731\\-173.9948\\33\\-27.61998\\-175.0344\\33\\-25.66685\\-176.4309\\33\\-23.71373\\-177.178\\33\\-21.7606\\-176.5996\\33\\-19.80748\\-175.4115\\33\\-15.90123\\-175.4115\\33\\-13.9481\\-176.5671\\33\\-11.99498\\-178.4969\\33\\-10.63784\\-180.1303\\33\\-10.04185\\-180.64\\33\\-8.088726\\-181.2312\\33\\-6.135601\\-181.492\\33\\-4.182476\\-182.2461\\33\\-2.229351\\-182.4368\\33\\-0.276226\\-183.1107\\33\\1.676899\\-184.9011\\33\\3.630024\\-185.476\\33\\7.536274\\-188.692\\33\\9.489399\\-189.4429\\33\\11.44252\\-190.6674\\33\\13.39565\\-191.4922\\33\\17.3019\\-195.0861\\33\\18.51986\\-195.7553\\33\\19.25502\\-196.3555\\33\\20.02707\\-197.7084\\33\\21.20815\\-198.9975\\33\\23.16127\\-199.4745\\33\\27.06752\\-199.9395\\33\\29.02065\\-199.8282\\33\\30.97377\\-198.6356\\33\\32.9269\\-197.1607\\33\\34.08895\\-195.7553\\33\\34.18644\\-193.8021\\33\\34.44667\\-191.849\\33\\35.56251\\-189.8959\\33\\36.83315\\-188.287\\33\\39.17016\\-185.9896\\33\\42.69252\\-183.4262\\33\\44.64565\\-183.1689\\33\\46.59877\\-183.3702\\33\\50.50502\\-184.0594\\33\\52.45815\\-184.9532\\33\\54.41127\\-185.3335\\33\\56.3644\\-185.9521\\33\\58.31752\\-187.1236\\33\\61.1302\\-189.8959\\33\\61.80783\\-191.849\\33\\62.98061\\-193.8021\\33\\63.50082\\-195.7553\\33\\65.00533\\-197.7084\\33\\66.13003\\-198.7905\\33\\68.08315\\-199.6386\\33\\70.03628\\-200.9162\\33\\70.71745\\-201.6146\\33\\70.78553\\-203.5678\\33\\70.03628\\-204.079\\33\\68.08315\\-203.3561\\33\\66.13003\\-204.4137\\33\\65.23177\\-205.5209\\33\\64.34706\\-207.474\\33\\62.93349\\-209.4271\\33\\60.27065\\-212.1991\\33\\58.31752\\-212.8804\\33\\56.3644\\-214.0929\\33\\54.41127\\-214.9297\\33\\50.50502\\-214.961\\33\\48.5519\\-214.3048\\33\\46.59877\\-213.0977\\33\\44.64565\\-212.7197\\33\\42.69252\\-212.08\\33\\40.7394\\-210.4348\\33\\37.76471\\-207.474\\33\\36.62145\\-205.5209\\33\\36.20189\\-203.5678\\33\\34.88002\\-202.2459\\33\\32.9269\\-201.9076\\33\\30.97377\\-202.6159\\33\\29.02065\\-204.3186\\33\\27.06752\\-204.6543\\33\\25.1144\\-204.4203\\33\\23.16127\\-203.6625\\33\\21.20815\\-204.1674\\33\\20.01513\\-205.5209\\33\\18.59306\\-207.474\\33\\17.99717\\-209.4271\\33\\16.63051\\-211.3803\\33\\12.74227\\-215.2865\\33\\11.44252\\-216.5411\\33\\9.489399\\-217.7616\\33\\7.536274\\-217.8467\\33\\3.630024\\-217.8394\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "460" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "5.583149\\-120.3678\\33\\4.834616\\-119.5834\\33\\3.976546\\-117.6303\\33\\3.630024\\-115.668\\33\\5.583149\\-114.4913\\33\\7.536274\\-114.5154\\33\\9.489399\\-114.6775\\33\\11.39853\\-115.6771\\33\\13.00871\\-117.6303\\33\\11.44252\\-119.6065\\33\\9.489399\\-120.6095\\33\\7.536274\\-121.0228\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "461" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-147.5218\\33\\38.78627\\-146.3032\\33\\36.83315\\-145.6838\\33\\34.88002\\-145.278\\33\\30.97377\\-145.267\\33\\29.02065\\-145.3758\\33\\25.1144\\-145.295\\33\\23.16127\\-145.705\\33\\21.20815\\-145.5086\\33\\19.25502\\-143.6739\\33\\16.64494\\-141.0678\\33\\16.00507\\-139.1146\\33\\15.96467\\-137.1615\\33\\16.01284\\-133.2553\\33\\16.09873\\-131.3021\\33\\17.3019\\-129.1511\\33\\18.01554\\-127.3959\\33\\19.18801\\-125.4428\\33\\21.20815\\-124.4413\\33\\23.16127\\-124.8837\\33\\25.1144\\-124.4662\\33\\26.15774\\-123.4896\\33\\27.06752\\-122.8779\\33\\29.02065\\-122.6374\\33\\30.97377\\-122.5692\\33\\32.9269\\-121.3737\\33\\34.88002\\-120.7257\\33\\40.7394\\-122.7942\\33\\42.69252\\-124.0928\\33\\44.05046\\-125.4428\\33\\45.15993\\-127.3959\\33\\45.82979\\-129.349\\33\\45.66939\\-131.3021\\33\\43.9828\\-133.2553\\33\\44.64565\\-134.7428\\33\\46.08509\\-137.1615\\33\\45.70034\\-139.1146\\33\\45.55439\\-141.0678\\33\\47.42936\\-143.0209\\33\\48.10801\\-144.974\\33\\47.32477\\-146.9271\\33\\46.59877\\-147.5368\\33\\44.64565\\-148.185\\33\\42.69252\\-148.371\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002285" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "124" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "462" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "93.47378\\-207.068\\33\\92.6638\\-205.5209\\33\\91.90968\\-203.5678\\33\\91.74827\\-199.6615\\33\\90.77847\\-197.7084\\33\\90.73121\\-195.7553\\33\\90.11892\\-193.8021\\33\\89.01189\\-191.849\\33\\88.77833\\-189.8959\\33\\88.24075\\-187.9428\\33\\87.02303\\-185.9896\\33\\86.80791\\-184.0365\\33\\85.94579\\-182.0834\\33\\84.84574\\-180.1303\\33\\84.33681\\-178.1771\\33\\82.98677\\-176.224\\33\\82.83073\\-174.2709\\33\\80.83676\\-170.3646\\33\\79.95525\\-168.4115\\33\\78.7979\\-166.4584\\33\\77.84878\\-164.5165\\33\\75.89565\\-162.3666\\33\\71.9894\\-158.5023\\33\\70.61201\\-156.6928\\33\\68.08315\\-154.3267\\33\\66.13003\\-153.6321\\33\\64.1769\\-153.3469\\33\\62.22377\\-152.295\\33\\60.27065\\-151.4068\\33\\58.31752\\-150.3225\\33\\56.3644\\-149.6783\\33\\54.41127\\-149.3976\\33\\52.45815\\-148.3768\\33\\50.97153\\-146.9271\\33\\50.50502\\-145.7827\\33\\49.69631\\-144.974\\33\\50.09639\\-143.0209\\33\\49.84199\\-141.0678\\33\\48.5519\\-138.1241\\33\\47.70961\\-137.1615\\33\\48.5519\\-136.6802\\33\\49.59258\\-135.2084\\33\\50.1083\\-133.2553\\33\\50.09863\\-127.3959\\33\\49.80673\\-125.4428\\33\\48.5519\\-124.252\\33\\45.26539\\-121.5365\\33\\43.42763\\-119.5834\\33\\43.59573\\-117.6303\\33\\43.23312\\-115.6771\\33\\42.25784\\-113.724\\33\\42.25784\\-111.7709\\33\\43.84755\\-109.8178\\33\\46.59877\\-107.0315\\33\\50.50502\\-103.3129\\33\\52.45815\\-102.2215\\33\\54.41127\\-102.9194\\33\\57.01718\\-105.9115\\33\\58.92385\\-107.8646\\33\\59.98882\\-109.8178\\33\\60.10789\\-111.7709\\33\\60.36539\\-113.724\\33\\61.26724\\-115.6771\\33\\63.22906\\-117.6303\\33\\63.68005\\-119.5834\\33\\64.97066\\-121.5365\\33\\65.5759\\-123.4896\\33\\66.85982\\-125.4428\\33\\67.54493\\-127.3959\\33\\68.77488\\-129.349\\33\\70.03628\\-130.8005\\33\\71.9894\\-132.0374\\33\\73.1474\\-133.2553\\33\\72.76969\\-135.2084\\33\\73.86115\\-137.1615\\33\\75.19883\\-139.1146\\33\\76.40096\\-141.0678\\33\\77.14178\\-143.0209\\33\\78.1953\\-144.974\\33\\78.82008\\-146.9271\\33\\79.7571\\-148.8803\\33\\79.24687\\-150.8334\\33\\77.30282\\-152.7865\\33\\76.41232\\-154.7396\\33\\76.93081\\-156.6928\\33\\77.84878\\-157.7602\\33\\79.8019\\-159.5268\\33\\80.62527\\-158.6459\\33\\81.75503\\-157.7013\\33\\83.70815\\-158.7754\\33\\84.72935\\-160.599\\33\\83.70815\\-162.6917\\33\\83.44729\\-164.5053\\33\\83.70815\\-164.7793\\33\\85.66128\\-164.6244\\33\\87.6144\\-162.8072\\33\\89.5754\\-162.5521\\33\\91.52065\\-163.7766\\33\\92.31818\\-164.5053\\33\\94.02547\\-166.4584\\33\\95.59578\\-168.4115\\33\\96.72356\\-170.3646\\33\\97.96145\\-172.3178\\33\\98.6356\\-174.2709\\33\\99.89199\\-176.224\\33\\100.2843\\-178.1771\\33\\100.2929\\-182.0834\\33\\100.03\\-184.0365\\33\\99.33315\\-184.7757\\33\\97.27486\\-185.9896\\33\\97.43515\\-187.9428\\33\\98.08286\\-189.8959\\33\\96.33044\\-191.849\\33\\97.38003\\-192.7927\\33\\99.33315\\-193.0011\\33\\99.97004\\-193.8021\\33\\101.8112\\-195.7553\\33\\102.2387\\-197.7084\\33\\102.2375\\-201.6146\\33\\101.8307\\-203.5678\\33\\100.5439\\-205.5209\\33\\99.33315\\-206.7255\\33\\97.38003\\-206.9439\\33\\95.44724\\-207.474\\33" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "126" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "463" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-99.8856\\-212.4602\\35\\-101.8387\\-211.3717\\35\\-102.8603\\-209.4271\\35\\-102.9863\\-207.474\\35\\-103.2456\\-205.5209\\35\\-103.2536\\-203.5678\\35\\-103.1114\\-201.6146\\35\\-104.3006\\-199.6615\\35\\-104.8734\\-197.7084\\35\\-104.8905\\-189.8959\\35\\-105.0066\\-187.9428\\35\\-105.0007\\-185.9896\\35\\-104.8865\\-184.0365\\35\\-104.8825\\-182.0834\\35\\-104.441\\-180.1303\\35\\-103.1704\\-178.1771\\35\\-102.543\\-176.224\\35\\-101.0872\\-174.2709\\35\\-100.5276\\-172.3178\\35\\-98.8046\\-170.3646\\35\\-97.21804\\-168.4115\\35\\-96.30487\\-166.4584\\35\\-94.02622\\-163.5779\\35\\-92.12569\\-160.599\\35\\-90.11997\\-159.1921\\35\\-89.52319\\-158.6459\\35\\-88.0029\\-156.6928\\35\\-86.80685\\-154.7396\\35\\-85.19493\\-152.7865\\35\\-85.35802\\-150.8334\\35\\-85.08215\\-148.8803\\35\\-83.80762\\-146.9271\\35\\-83.46917\\-144.974\\35\\-82.92117\\-143.0209\\35\\-81.73782\\-141.0678\\35\\-81.22581\\-139.1146\\35\\-79.94795\\-137.1615\\35\\-79.19109\\-135.2084\\35\\-78.1194\\-133.2553\\35\\-76.4481\\-129.7111\\35\\-75.20842\\-127.3959\\35\\-74.49497\\-125.7759\\35\\-73.24798\\-123.4896\\35\\-72.43334\\-121.5365\\35\\-72.38026\\-119.5834\\35\\-71.2346\\-117.6303\\35\\-69.63733\\-113.724\\35\\-68.65831\\-111.7709\\35\\-68.29951\\-109.8178\\35\\-66.28574\\-105.9115\\35\\-66.28574\\-103.9584\\35\\-66.16879\\-102.0053\\35\\-65.09129\\-100.0521\\35\\-64.72935\\-99.68243\\35\\-62.59403\\-98.09901\\35\\-60.8231\\-97.13435\\35\\-59.52276\\-96.14588\\35\\-58.86998\\-95.49657\\35\\-56.91685\\-94.993\\35\\-54.96373\\-93.54353\\35\\-53.0106\\-93.05045\\35\\-51.05748\\-91.66899\\35\\-49.10435\\-91.00684\\35\\-45.1981\\-91.14387\\35\\-43.62109\\-92.23963\\35\\-43.24498\\-92.64594\\35\\-42.32361\\-94.19276\\35\\-40.48257\\-96.14588\\35\\-38.88574\\-98.09901\\35\\-38.47017\\-100.0521\\35\\-38.46027\\-102.0053\\35\\-38.55466\\-103.9584\\35\\-40.07115\\-105.9115\\35\\-41.29185\\-107.2261\\35\\-47.90376\\-113.724\\35\\-49.10435\\-114.7006\\35\\-51.05748\\-116.1025\\35\\-53.0106\\-117.1035\\35\\-53.51591\\-117.6303\\35\\-55.01591\\-119.5834\\35\\-56.23273\\-121.5365\\35\\-57.61521\\-123.4896\\35\\-58.17243\\-125.4428\\35\\-58.20343\\-127.3959\\35\\-57.79062\\-129.349\\35\\-57.13309\\-131.3021\\35\\-56.98344\\-133.2553\\35\\-56.63503\\-135.2084\\35\\-56.85027\\-137.1615\\35\\-57.64676\\-139.1146\\35\\-58.16299\\-141.0678\\35\\-58.80339\\-143.0209\\35\\-58.98333\\-144.974\\35\\-60.8231\\-146.2228\\35\\-62.77623\\-146.7833\\35\\-64.72935\\-148.6716\\35\\-68.6356\\-152.5465\\35\\-72.54185\\-154.7649\\35\\-74.49497\\-156.4937\\35\\-76.4481\\-158.3234\\35\\-78.40122\\-160.3006\\35\\-80.5116\\-162.5521\\35\\-81.39562\\-164.5053\\35\\-82.55767\\-166.4584\\35\\-83.48478\\-168.4115\\35\\-83.6833\\-170.3646\\35\\-84.82915\\-172.3178\\35\\-85.4612\\-174.2709\\35\\-85.70004\\-176.224\\35\\-86.80098\\-178.1771\\35\\-87.43443\\-180.1303\\35\\-88.53494\\-182.0834\\35\\-89.38604\\-184.0365\\35\\-90.50387\\-185.9896\\35\\-91.25164\\-187.9428\\35\\-91.35812\\-191.849\\35\\-91.62099\\-193.8021\\35\\-91.99233\\-195.7553\\35\\-92.00652\\-197.7084\\35\\-92.67088\\-199.6615\\35\\-93.19476\\-201.6146\\35\\-93.28799\\-205.5209\\35\\-93.6545\\-207.474\\35\\-94.96928\\-209.4271\\35\\-96.55918\\-211.3803\\35\\-97.93247\\-212.4574\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "464" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-16.06156\\-125.4428\\35\\-16.57899\\-123.4896\\35\\-17.63136\\-121.5365\\35\\-18.9524\\-119.5834\\35\\-19.55933\\-117.6303\\35\\-17.85435\\-115.4227\\35\\-15.90123\\-114.7987\\35\\-14.57286\\-113.724\\35\\-12.68019\\-111.7709\\35\\-11.99498\\-110.683\\35\\-11.17983\\-109.8178\\35\\-10.04185\\-108.9518\\35\\-8.298872\\-109.8178\\35\\-7.571723\\-111.7709\\35\\-8.088726\\-112.3013\\35\\-9.037227\\-113.724\\35\\-9.904408\\-115.6771\\35\\-10.39867\\-117.6303\\35\\-11.21479\\-119.5834\\35\\-13.23312\\-121.5365\\35\\-13.9481\\-122.4534\\35\\-15.11829\\-123.4896\\35\\-15.79988\\-125.4428\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "141" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "465" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.276226\\-215.4362\\35\\-2.229351\\-214.4122\\35\\-4.182476\\-213.509\\35\\-6.135601\\-213.9227\\35\\-8.088726\\-214.6443\\35\\-10.04185\\-214.9095\\35\\-11.99498\\-214.6515\\35\\-13.9481\\-213.8955\\35\\-15.90123\\-212.8714\\35\\-19.80748\\-212.5097\\35\\-21.7606\\-211.9504\\35\\-23.71373\\-210.7042\\35\\-25.66685\\-210.5626\\35\\-27.61998\\-210.5412\\35\\-29.5731\\-210.0491\\35\\-31.52623\\-208.9742\\35\\-35.43248\\-208.6829\\35\\-39.33873\\-208.5869\\35\\-41.29185\\-208.1799\\35\\-43.24498\\-207.0486\\35\\-45.1981\\-206.6955\\35\\-47.15123\\-206.2297\\35\\-49.10435\\-204.8184\\35\\-51.05748\\-204.5787\\35\\-53.0106\\-204.1009\\35\\-55.57801\\-201.6146\\35\\-56.19069\\-199.6615\\35\\-56.91685\\-198.6428\\35\\-58.86998\\-198.5814\\35\\-60.22038\\-197.7084\\35\\-59.93975\\-195.7553\\35\\-59.2494\\-193.8021\\35\\-55.8561\\-189.8959\\35\\-55.47741\\-187.9428\\35\\-54.82628\\-185.9896\\35\\-53.0106\\-182.3204\\35\\-51.80178\\-180.1303\\35\\-47.15123\\-175.4394\\35\\-45.1981\\-174.647\\35\\-43.24498\\-174.0335\\35\\-41.29185\\-173.6686\\35\\-35.43248\\-173.7137\\35\\-33.47935\\-174.0562\\35\\-31.52623\\-175.0789\\35\\-29.5731\\-175.6528\\35\\-27.61998\\-176.8014\\35\\-25.66685\\-178.6556\\35\\-23.71373\\-179.4399\\35\\-21.7606\\-179.4732\\35\\-19.80748\\-179.2718\\35\\-17.85435\\-180.3847\\35\\-15.90123\\-180.8483\\35\\-10.04185\\-181.5278\\35\\-8.088726\\-182.1648\\35\\-6.135601\\-182.3614\\35\\-4.182476\\-182.9816\\35\\-0.276226\\-183.5808\\35\\0.1908256\\-184.0365\\35\\1.676899\\-185.0768\\35\\3.630024\\-186.752\\35\\5.583149\\-187.4632\\35\\8.580186\\-189.8959\\35\\9.489399\\-190.6998\\35\\11.44252\\-191.5235\\35\\13.39565\\-193.0055\\35\\13.94943\\-193.8021\\35\\14.907\\-195.7553\\35\\17.3019\\-197.9144\\35\\19.25502\\-199.027\\35\\21.20815\\-199.77\\35\\23.16127\\-199.9671\\35\\25.1144\\-200.6158\\35\\27.06752\\-201.7901\\35\\29.02065\\-201.6721\\35\\31.2971\\-199.6615\\35\\33.6487\\-197.7084\\35\\35.52545\\-195.7553\\35\\35.98328\\-193.8021\\35\\36.0116\\-191.849\\35\\36.3244\\-189.8959\\35\\37.83625\\-187.9428\\35\\38.78627\\-187.0417\\35\\40.7394\\-185.4123\\35\\42.69252\\-184.8617\\35\\44.64565\\-184.0601\\35\\48.5519\\-184.2807\\35\\50.50502\\-184.9575\\35\\54.41127\\-185.7421\\35\\56.3644\\-186.7913\\35\\58.31752\\-187.3072\\35\\60.27065\\-189.0363\\35\\61.1302\\-189.8959\\35\\61.99998\\-191.849\\35\\63.24991\\-193.8021\\35\\64.96164\\-195.7553\\35\\66.55727\\-197.7084\\35\\68.08315\\-198.8771\\35\\70.03628\\-200.1997\\35\\71.9894\\-201.3509\\35\\72.24749\\-201.6146\\35\\72.9227\\-203.5678\\35\\71.9894\\-204.3125\\35\\70.03628\\-204.0731\\35\\68.08315\\-203.545\\35\\66.13003\\-205.096\\35\\65.7732\\-205.5209\\35\\65.45394\\-207.474\\35\\64.37665\\-209.4271\\35\\62.22377\\-211.6079\\35\\60.27065\\-212.7698\\35\\58.31752\\-213.198\\35\\56.3644\\-214.2066\\35\\54.41127\\-214.9825\\35\\50.50502\\-215.0047\\35\\48.5519\\-214.715\\35\\46.59877\\-214.0041\\35\\44.64565\\-212.908\\35\\42.69252\\-212.3387\\35\\40.7394\\-210.4764\\35\\37.76939\\-207.474\\35\\36.82552\\-205.5209\\35\\36.72464\\-203.5678\\35\\34.88002\\-201.6954\\35\\32.9269\\-202.3638\\35\\30.97377\\-203.9151\\35\\29.02065\\-204.6736\\35\\27.06752\\-206.0179\\35\\25.1144\\-205.8871\\35\\23.16127\\-204.4467\\35\\21.20815\\-203.6898\\35\\19.25502\\-204.1479\\35\\17.95837\\-205.5209\\35\\17.3019\\-206.5951\\35\\16.58041\\-207.474\\35\\15.96406\\-209.4271\\35\\14.64925\\-211.3803\\35\\10.74195\\-215.2865\\35\\9.489399\\-216.3154\\35\\7.536274\\-216.9026\\35\\3.630024\\-216.9026\\35\\1.676899\\-216.3486\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "151" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "466" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "1.676899\\-162.5897\\35\\-0.276226\\-162.3905\\35\\-2.229351\\-161.8619\\35\\-6.135601\\-161.9418\\35\\-10.04185\\-160.903\\35\\-11.99498\\-160.786\\35\\-13.9481\\-160.2071\\35\\-15.90123\\-159.2635\\35\\-17.85435\\-157.9254\\35\\-18.96506\\-156.6928\\35\\-20.472\\-154.7396\\35\\-22.4095\\-152.7865\\35\\-24.66122\\-150.8334\\35\\-27.61998\\-147.6057\\35\\-29.5731\\-146.3699\\35\\-31.52623\\-146.2007\\35\\-33.47935\\-145.7739\\35\\-35.43248\\-144.3247\\35\\-37.3856\\-143.9658\\35\\-43.24498\\-143.9658\\35\\-45.1981\\-144.3506\\35\\-47.15123\\-145.5427\\35\\-49.10435\\-146.258\\35\\-51.05748\\-147.4452\\35\\-53.0106\\-148.248\\35\\-54.85038\\-146.9271\\35\\-54.86607\\-144.974\\35\\-52.01866\\-143.0209\\35\\-51.17192\\-141.0678\\35\\-50.61358\\-139.1146\\35\\-50.42762\\-137.1615\\35\\-51.21284\\-133.2553\\35\\-51.88623\\-131.3021\\35\\-52.09352\\-129.349\\35\\-51.05748\\-128.0654\\35\\-50.3284\\-127.3959\\35\\-48.95872\\-125.4428\\35\\-48.53215\\-123.4896\\35\\-46.26694\\-121.5365\\35\\-45.1981\\-120.8221\\35\\-43.24498\\-118.8993\\35\\-41.29185\\-117.9493\\35\\-39.33873\\-117.1969\\35\\-35.43248\\-117.296\\35\\-33.47935\\-118.7076\\35\\-32.72352\\-119.5834\\35\\-32.26904\\-121.5365\\35\\-29.5731\\-124.6654\\35\\-26.37505\\-127.3959\\35\\-25.38263\\-129.349\\35\\-24.1959\\-131.3021\\35\\-23.42007\\-133.2553\\35\\-23.85117\\-135.2084\\35\\-24.77628\\-137.1615\\35\\-26.82767\\-139.1146\\35\\-27.61998\\-139.9658\\35\\-29.00206\\-141.0678\\35\\-28.71946\\-143.0209\\35\\-25.66685\\-145.4801\\35\\-23.71373\\-146.5003\\35\\-21.7606\\-148.2313\\35\\-19.80748\\-149.38\\35\\-17.85435\\-149.6112\\35\\-15.90123\\-149.5983\\35\\-13.9481\\-150.0993\\35\\-11.99498\\-150.0638\\35\\-10.04185\\-148.547\\35\\-8.088726\\-147.6743\\35\\-6.796815\\-146.9271\\35\\-6.135601\\-146.1337\\35\\-5.605467\\-144.974\\35\\-5.826835\\-143.0209\\35\\-4.182476\\-141.85\\35\\-2.229351\\-141.3933\\35\\-1.921308\\-141.0678\\35\\-1.125197\\-139.1146\\35\\-1.095841\\-135.2084\\35\\-1.215228\\-133.2553\\35\\-0.5638437\\-131.3021\\35\\-0.276226\\-130.9956\\35\\1.676899\\-129.9763\\35\\3.630024\\-130.6981\\35\\4.252001\\-131.3021\\35\\5.221694\\-133.2553\\35\\6.479583\\-135.2084\\35\\7.536274\\-137.0816\\35\\7.536274\\-137.4646\\35\\6.831269\\-141.0678\\35\\7.536274\\-142.2885\\35\\8.224113\\-143.0209\\35\\9.489399\\-143.9081\\35\\11.44252\\-145.0406\\35\\13.39565\\-145.1484\\35\\15.34877\\-145.9445\\35\\17.3019\\-147.5569\\35\\18.94179\\-146.9271\\35\\19.25502\\-146.3547\\35\\19.52556\\-144.974\\35\\17.3019\\-142.8988\\35\\15.61931\\-141.0678\\35\\12.34933\\-137.1615\\35\\13.45078\\-135.2084\\35\\14.73993\\-131.3021\\35\\15.87073\\-129.349\\35\\16.20606\\-125.4428\\35\\17.3019\\-124.5045\\35\\19.25502\\-123.3233\\35\\21.20815\\-122.5933\\35\\23.16127\\-122.6766\\35\\27.06752\\-122.2191\\35\\30.97377\\-122.206\\35\\32.9269\\-120.87\\35\\34.88002\\-120.8872\\35\\36.83315\\-122.1312\\35\\38.78627\\-122.312\\35\\40.65726\\-123.4896\\35\\42.69252\\-124.9631\\35\\44.64565\\-126.6649\\35\\45.34856\\-127.3959\\35\\46.06055\\-129.349\\35\\45.74853\\-131.3021\\35\\44.38656\\-133.2553\\35\\45.4052\\-135.2084\\35\\46.16409\\-137.1615\\35\\45.75094\\-139.1146\\35\\45.77328\\-141.0678\\35\\47.94632\\-143.0209\\35\\48.20538\\-144.974\\35\\46.59877\\-147.0626\\35\\44.64565\\-147.5335\\35\\42.69252\\-147.587\\35\\40.7394\\-146.3865\\35\\36.83315\\-145.2097\\35\\34.88002\\-144.9967\\35\\30.97377\\-145.267\\35\\29.02065\\-145.8605\\35\\27.06752\\-146.3057\\35\\25.1144\\-146.4135\\35\\23.16127\\-146.7785\\35\\21.20815\\-147.6817\\35\\19.51484\\-148.8803\\35\\17.3019\\-151.1037\\35\\15.34877\\-152.2423\\35\\13.39565\\-153.1527\\35\\11.44252\\-154.9995\\35\\9.823486\\-156.6928\\35\\8.745027\\-158.6459\\35\\7.893553\\-160.599\\35\\7.536274\\-160.9245\\35\\5.583149\\-162.0064\\35\\3.630024\\-162.5897\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "467" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "7.536274\\-122.465\\35\\5.583149\\-120.6591\\35\\4.592896\\-119.5834\\35\\3.622395\\-117.6303\\35\\3.2308\\-115.6771\\35\\3.630024\\-114.2345\\35\\7.536274\\-114.7577\\35\\9.489399\\-115.3782\\35\\11.44252\\-116.2776\\35\\13.057\\-117.6303\\35\\12.37818\\-119.5834\\35\\9.489399\\-122.2797\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "66" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "468" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "71.9894\\-155.5356\\35\\68.08315\\-153.3092\\35\\66.13003\\-152.3175\\35\\64.1769\\-151.6379\\35\\62.42873\\-150.8334\\35\\60.27065\\-149.6392\\35\\58.56826\\-148.8803\\35\\56.3644\\-147.7331\\35\\54.41127\\-147.6867\\35\\52.45815\\-147.4476\\35\\51.77913\\-146.9271\\35\\50.50502\\-145.4171\\35\\49.5848\\-144.974\\35\\49.7837\\-143.0209\\35\\50.13568\\-141.0678\\35\\49.29897\\-139.1146\\35\\48.5519\\-137.7312\\35\\47.64714\\-137.1615\\35\\48.5519\\-136.7221\\35\\49.63309\\-135.2084\\35\\50.20106\\-133.2553\\35\\50.20106\\-131.3021\\35\\50.36959\\-129.349\\35\\50.30558\\-127.3959\\35\\50.1083\\-125.4428\\35\\49.05946\\-123.4896\\35\\48.5519\\-123.0134\\35\\46.59877\\-121.6342\\35\\44.63802\\-119.5834\\35\\44.03136\\-117.6303\\35\\43.85619\\-115.6771\\35\\43.24008\\-113.724\\35\\42.367\\-111.7709\\35\\42.69252\\-111.425\\35\\44.64565\\-108.6762\\35\\45.30563\\-107.8646\\35\\46.59877\\-105.8301\\35\\48.5519\\-104.7539\\35\\50.50502\\-104.0531\\35\\52.45815\\-103.0711\\35\\54.41127\\-103.5195\\35\\58.91641\\-107.8646\\35\\59.92413\\-109.8178\\35\\58.98731\\-113.724\\35\\60.09653\\-115.6771\\35\\62.22377\\-116.8057\\35\\63.04832\\-117.6303\\35\\63.67159\\-119.5834\\35\\64.97066\\-121.5365\\35\\65.5759\\-123.4896\\35\\66.85982\\-125.4428\\35\\67.54493\\-127.3959\\35\\68.90154\\-129.349\\35\\71.37978\\-131.3021\\35\\72.34622\\-133.2553\\35\\72.68158\\-135.2084\\35\\74.56992\\-137.1615\\35\\75.89565\\-139.38\\35\\76.66815\\-141.0678\\35\\77.38403\\-143.0209\\35\\76.62257\\-146.9271\\35\\77.2179\\-148.8803\\35\\77.07389\\-150.8334\\35\\75.89565\\-151.6363\\35\\74.6124\\-152.7865\\35\\73.69839\\-154.7396\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "469" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "91.52065\\-193.2114\\35\\90.84364\\-191.849\\35\\90.7975\\-189.8959\\35\\90.58906\\-187.9428\\35\\87.6144\\-181.6506\\35\\84.92509\\-176.224\\35\\84.77486\\-174.2709\\35\\83.83887\\-172.3178\\35\\82.80201\\-170.3646\\35\\81.9239\\-168.4115\\35\\80.91002\\-166.4584\\35\\80.08796\\-164.5053\\35\\78.94665\\-162.5521\\35\\79.8019\\-161.6522\\35\\81.75503\\-161.8279\\35\\82.26329\\-162.5521\\35\\82.65198\\-164.5053\\35\\83.70815\\-165.507\\35\\85.66128\\-165.8159\\35\\87.6144\\-163.9444\\35\\89.56753\\-163.6143\\35\\91.52065\\-163.5874\\35\\93.47378\\-164.2985\\35\\95.58226\\-166.4584\\35\\96.69163\\-168.4115\\35\\98.02905\\-170.3646\\35\\98.74044\\-172.3178\\35\\99.96055\\-174.2709\\35\\100.5354\\-176.224\\35\\100.9092\\-178.1771\\35\\100.9092\\-182.0834\\35\\100.5439\\-184.0365\\35\\99.33315\\-185.2597\\35\\97.38003\\-185.7779\\35\\95.4269\\-187.0185\\35\\94.49152\\-187.9428\\35\\93.90005\\-189.8959\\35\\93.9211\\-191.849\\35\\93.47378\\-193.2357\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002284" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "470" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "99.33315\\-208.2202\\35\\97.38003\\-206.9798\\35\\95.4269\\-206.3255\\35\\94.66085\\-205.5209\\35\\94.54931\\-203.5678\\35\\93.99693\\-201.6146\\35\\92.97672\\-199.6615\\35\\92.73984\\-197.7084\\35\\93.47378\\-195.468\\35\\95.4269\\-194.999\\35\\99.33315\\-195.1062\\35\\101.2863\\-196.6301\\35\\102.0665\\-197.7084\\35\\102.3276\\-199.6615\\35\\102.3742\\-201.6146\\35\\102.2223\\-205.5209\\35\\101.2863\\-207.56\\35" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "115" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "471" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-101.8387\\-212.5492\\37\\-102.8813\\-211.3803\\37\\-103.0462\\-209.4271\\37\\-103.0986\\-207.474\\37\\-103.9139\\-205.5209\\37\\-104.005\\-203.5678\\37\\-102.5001\\-201.6146\\37\\-103.8001\\-199.6615\\37\\-104.9026\\-197.7084\\37\\-105.4302\\-191.849\\37\\-105.4975\\-185.9896\\37\\-105.441\\-182.0834\\37\\-104.9423\\-178.1771\\37\\-103.9546\\-176.224\\37\\-101.1051\\-172.3178\\37\\-100.2156\\-170.3646\\37\\-97.93247\\-167.56\\37\\-97.20776\\-166.4584\\37\\-96.21288\\-164.5053\\37\\-94.64996\\-162.5521\\37\\-92.0731\\-159.831\\37\\-90.11997\\-159.1427\\37\\-88.16685\\-157.6806\\37\\-86.21372\\-155.6071\\37\\-85.26846\\-154.7396\\37\\-83.5024\\-152.7865\\37\\-84.6557\\-150.8334\\37\\-85.18607\\-148.8803\\37\\-84.4753\\-146.9271\\37\\-83.66171\\-144.974\\37\\-83.20998\\-143.0209\\37\\-81.97139\\-141.0678\\37\\-81.25348\\-139.1146\\37\\-79.95762\\-137.1615\\37\\-79.19109\\-135.2084\\37\\-78.1194\\-133.2553\\37\\-76.4481\\-129.4064\\37\\-75.20842\\-127.3959\\37\\-74.49497\\-125.7759\\37\\-73.24798\\-123.4896\\37\\-72.41978\\-121.5365\\37\\-72.17803\\-119.5834\\37\\-71.16157\\-117.6303\\37\\-70.40173\\-115.6771\\37\\-68.21885\\-111.7709\\37\\-68.08182\\-109.8178\\37\\-66.29554\\-105.9115\\37\\-66.53387\\-103.9584\\37\\-66.3895\\-102.0053\\37\\-65.94879\\-100.0521\\37\\-64.35825\\-98.09901\\37\\-62.77623\\-97.13826\\37\\-60.8231\\-97.07842\\37\\-58.86998\\-95.40858\\37\\-56.91685\\-94.04307\\37\\-54.96373\\-93.12862\\37\\-53.0106\\-92.94138\\37\\-51.05748\\-91.54287\\37\\-49.10435\\-91.00684\\37\\-45.1981\\-91.07436\\37\\-43.3568\\-92.23963\\37\\-42.41513\\-94.19276\\37\\-40.50967\\-96.14588\\37\\-39.54102\\-98.09901\\37\\-38.9922\\-100.0521\\37\\-39.02391\\-103.9584\\37\\-40.09556\\-105.9115\\37\\-41.29185\\-107.3025\\37\\-43.24498\\-109.3054\\37\\-45.1981\\-111.1293\\37\\-47.82333\\-113.724\\37\\-49.10435\\-114.8408\\37\\-51.05748\\-116.3057\\37\\-53.0106\\-116.9224\\37\\-55.65336\\-119.5834\\37\\-57.48698\\-121.5365\\37\\-58.86998\\-123.6064\\37\\-59.69814\\-125.4428\\37\\-58.40241\\-129.349\\37\\-58.00449\\-131.3021\\37\\-57.75587\\-133.2553\\37\\-56.91685\\-135.0976\\37\\-58.14641\\-139.1146\\37\\-59.37305\\-141.0678\\37\\-60.14262\\-143.0209\\37\\-60.8231\\-144.3965\\37\\-61.54892\\-144.974\\37\\-62.77623\\-145.5244\\37\\-64.72935\\-146.6727\\37\\-68.6356\\-150.4707\\37\\-69.16457\\-150.8334\\37\\-72.54185\\-152.4736\\37\\-74.49497\\-153.5869\\37\\-76.4481\\-154.8617\\37\\-78.40122\\-156.7863\\37\\-80.35435\\-160.1561\\37\\-82.50111\\-162.5521\\37\\-84.54783\\-166.4584\\37\\-85.48277\\-168.4115\\37\\-85.56085\\-170.3646\\37\\-87.44825\\-174.2709\\37\\-87.53738\\-176.224\\37\\-91.35779\\-184.0365\\37\\-91.71165\\-185.9896\\37\\-92.793\\-187.9428\\37\\-93.29534\\-189.8959\\37\\-93.38517\\-197.7084\\37\\-93.62447\\-199.6615\\37\\-94.72108\\-201.6146\\37\\-95.25442\\-203.5678\\37\\-95.28016\\-207.474\\37\\-95.6283\\-209.4271\\37\\-96.81016\\-211.3803\\37\\-97.93247\\-212.4915\\37\\-99.8856\\-212.8625\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "472" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-15.90123\\-124.4128\\37\\-16.75449\\-123.4896\\37\\-17.46741\\-121.5365\\37\\-18.37102\\-119.5834\\37\\-17.49184\\-117.6303\\37\\-15.90123\\-116.4507\\37\\-13.12664\\-113.724\\37\\-12.372\\-111.7709\\37\\-11.97227\\-109.8178\\37\\-10.2416\\-107.8646\\37\\-7.903179\\-105.9115\\37\\-6.135601\\-104.2749\\37\\-4.182476\\-104.6441\\37\\-2.915023\\-105.9115\\37\\-2.229351\\-106.8067\\37\\-0.276226\\-108.7598\\37\\0.4854928\\-109.8178\\37\\1.676899\\-110.3693\\37\\2.628894\\-111.7709\\37\\4.336596\\-113.724\\37\\5.583149\\-114.8335\\37\\7.021835\\-115.6771\\37\\7.536274\\-116.1136\\37\\9.489399\\-116.8865\\37\\10.67393\\-117.6303\\37\\11.57796\\-119.5834\\37\\10.87567\\-121.5365\\37\\9.634433\\-123.4896\\37\\9.299159\\-123.4896\\37\\7.536274\\-122.7519\\37\\6.41811\\-121.5365\\37\\4.797249\\-119.5834\\37\\3.983385\\-117.6303\\37\\2.532024\\-115.6771\\37\\0.7249041\\-113.724\\37\\-0.276226\\-112.0659\\37\\-2.229351\\-110.1057\\37\\-4.182476\\-110.1229\\37\\-5.196599\\-111.7709\\37\\-6.135601\\-112.5687\\37\\-8.088726\\-114.4564\\37\\-9.159955\\-115.6771\\37\\-10.13659\\-117.6303\\37\\-10.85801\\-119.5834\\37\\-12.73115\\-121.5365\\37\\-13.9481\\-123.0105\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "206" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "473" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-10.04185\\-160.5326\\37\\-11.99498\\-160.5333\\37\\-13.9481\\-160.4134\\37\\-15.90123\\-159.5292\\37\\-17.85435\\-158.9277\\37\\-19.80748\\-157.5743\\37\\-20.63532\\-156.6928\\37\\-21.34466\\-154.7396\\37\\-21.7606\\-154.2684\\37\\-23.82509\\-152.7865\\37\\-25.66685\\-150.4617\\37\\-27.61998\\-148.7317\\37\\-29.5731\\-147.7242\\37\\-31.52623\\-146.2137\\37\\-33.47935\\-145.5654\\37\\-35.43248\\-144.1201\\37\\-37.3856\\-143.3777\\37\\-39.33873\\-143.3777\\37\\-41.29185\\-143.5262\\37\\-43.24498\\-143.5262\\37\\-45.1981\\-143.7934\\37\\-47.15123\\-143.8468\\37\\-49.10435\\-144.7077\\37\\-51.05748\\-145.7995\\37\\-53.0106\\-146.5764\\37\\-54.89109\\-144.974\\37\\-53.78741\\-143.0209\\37\\-52.45701\\-141.0678\\37\\-52.25105\\-137.1615\\37\\-52.21548\\-135.2084\\37\\-52.33496\\-133.2553\\37\\-52.74974\\-131.3021\\37\\-52.1363\\-129.349\\37\\-51.05748\\-128.3136\\37\\-49.28449\\-127.3959\\37\\-47.15123\\-125.8851\\37\\-46.27398\\-125.4428\\37\\-45.27948\\-123.4896\\37\\-45.07603\\-121.5365\\37\\-42.98275\\-119.5834\\37\\-41.29185\\-118.7379\\37\\-39.33873\\-118.4247\\37\\-37.3856\\-118.7839\\37\\-35.43248\\-119.2665\\37\\-33.47935\\-120.6355\\37\\-31.52623\\-122.3321\\37\\-29.5731\\-123.1918\\37\\-27.61998\\-124.2949\\37\\-25.66685\\-124.3848\\37\\-23.71373\\-125.065\\37\\-23.17987\\-125.4428\\37\\-23.43052\\-127.3959\\37\\-23.99178\\-129.349\\37\\-22.96943\\-131.3021\\37\\-22.42819\\-133.2553\\37\\-22.32976\\-135.2084\\37\\-22.43042\\-137.1615\\37\\-23.71373\\-138.5813\\37\\-24.42312\\-139.1146\\37\\-25.66685\\-140.3241\\37\\-26.22202\\-141.0678\\37\\-25.72682\\-143.0209\\37\\-23.71373\\-144.5609\\37\\-21.7606\\-146.4304\\37\\-19.80748\\-147.6046\\37\\-13.9481\\-147.7231\\37\\-11.99498\\-147.6612\\37\\-10.68084\\-146.9271\\37\\-8.299575\\-144.974\\37\\-8.7902\\-141.0678\\37\\-8.088726\\-139.5114\\37\\-6.135601\\-140.5879\\37\\-5.600369\\-141.0678\\37\\-4.182476\\-141.887\\37\\-2.229351\\-141.8309\\37\\-1.509514\\-141.0678\\37\\-0.6630462\\-139.1146\\37\\-0.1677191\\-137.1615\\37\\0.7167954\\-135.2084\\37\\1.064478\\-133.2553\\37\\1.676899\\-132.1603\\37\\3.630024\\-132.3622\\37\\5.583149\\-134.426\\37\\7.536274\\-135.9813\\37\\9.489399\\-136.4172\\37\\11.44252\\-135.1375\\37\\12.86569\\-133.2553\\37\\13.94977\\-131.3021\\37\\14.64317\\-129.349\\37\\14.44775\\-127.3959\\37\\14.07173\\-125.4428\\37\\15.20186\\-123.4896\\37\\17.3019\\-122.5403\\37\\21.20815\\-122.2126\\37\\23.16127\\-122.2126\\37\\27.06752\\-122.1062\\37\\29.02065\\-122.1062\\37\\30.97377\\-122.2066\\37\\32.9269\\-121.7676\\37\\34.88002\\-121.8453\\37\\36.83315\\-122.6316\\37\\38.17222\\-123.4896\\37\\38.78627\\-124.041\\37\\40.7394\\-125.2311\\37\\42.69252\\-125.8856\\37\\44.64565\\-126.8032\\37\\45.25965\\-127.3959\\37\\46.25225\\-129.349\\37\\46.25225\\-131.3021\\37\\45.60063\\-133.2553\\37\\45.53836\\-135.2084\\37\\46.16409\\-137.1615\\37\\45.93592\\-139.1146\\37\\47.16748\\-141.0678\\37\\48.5519\\-142.5668\\37\\50.16389\\-141.0678\\37\\48.5519\\-137.4005\\37\\48.08396\\-137.1615\\37\\48.5519\\-136.9804\\37\\49.69038\\-135.2084\\37\\50.19698\\-133.2553\\37\\50.23681\\-131.3021\\37\\51.24419\\-129.349\\37\\51.127\\-127.3959\\37\\49.9214\\-123.4896\\37\\47.69392\\-121.5365\\37\\46.59877\\-120.4491\\37\\45.94946\\-119.5834\\37\\45.25316\\-117.6303\\37\\44.27866\\-115.6771\\37\\43.4287\\-113.724\\37\\42.70028\\-111.7709\\37\\43.86928\\-109.8178\\37\\45.58966\\-107.8646\\37\\46.35129\\-105.9115\\37\\46.59877\\-105.6588\\37\\48.5519\\-104.6552\\37\\50.50502\\-104.4721\\37\\52.45815\\-104.025\\37\\54.41127\\-104.8115\\37\\56.33623\\-105.9115\\37\\58.31752\\-107.3202\\37\\58.85882\\-107.8646\\37\\59.6626\\-109.8178\\37\\58.95358\\-111.7709\\37\\57.68974\\-113.724\\37\\58.31752\\-114.2733\\37\\60.27065\\-115.2877\\37\\62.22377\\-116.937\\37\\62.91341\\-117.6303\\37\\63.55211\\-119.5834\\37\\64.95912\\-121.5365\\37\\65.5759\\-123.4896\\37\\66.85982\\-125.4428\\37\\67.54493\\-127.3959\\37\\68.81403\\-129.349\\37\\71.0504\\-131.3021\\37\\72.15888\\-133.2553\\37\\72.78889\\-135.2084\\37\\74.63708\\-137.1615\\37\\76.27267\\-139.1146\\37\\76.92937\\-141.0678\\37\\76.85646\\-143.0209\\37\\75.89565\\-144.4281\\37\\75.36636\\-144.974\\37\\74.4581\\-146.9271\\37\\74.46111\\-148.8803\\37\\73.45821\\-150.8334\\37\\71.9894\\-152.6046\\37\\70.03628\\-152.5895\\37\\68.08315\\-151.5387\\37\\66.13003\\-151.2864\\37\\64.1769\\-150.2687\\37\\62.22377\\-148.7649\\37\\58.51284\\-146.9271\\37\\56.3644\\-145.7493\\37\\52.45815\\-145.6963\\37\\50.50502\\-145.1135\\37\\48.5519\\-145.0988\\37\\46.59877\\-146.151\\37\\44.64565\\-146.8729\\37\\42.69252\\-146.2865\\37\\40.7394\\-145.5745\\37\\38.78627\\-145.0262\\37\\36.83315\\-144.3003\\37\\34.88002\\-143.9507\\37\\32.9269\\-144.2287\\37\\31.08792\\-144.974\\37\\27.06752\\-146.9653\\37\\25.1144\\-147.8591\\37\\23.16127\\-148.5032\\37\\21.20815\\-149.8483\\37\\19.25502\\-152.2793\\37\\17.3019\\-153.5819\\37\\15.34877\\-155.0938\\37\\13.39565\\-156.1829\\37\\11.44252\\-157.5172\\37\\10.66895\\-158.6459\\37\\9.626842\\-160.599\\37\\7.536274\\-161.8122\\37\\5.583149\\-162.2418\\37\\1.676899\\-162.2842\\37\\-0.276226\\-161.5396\\37\\-2.229351\\-161.2691\\37\\-4.182476\\-161.6757\\37\\-6.135601\\-161.6747\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "146" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "474" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "3.630024\\-215.6832\\37\\1.676899\\-215.23\\37\\-0.276226\\-214.3318\\37\\-2.229351\\-213.309\\37\\-4.182476\\-212.9027\\37\\-6.135601\\-214.0658\\37\\-8.088726\\-214.8372\\37\\-10.04185\\-214.9935\\37\\-11.99498\\-214.828\\37\\-13.9481\\-214.0777\\37\\-15.90123\\-212.9367\\37\\-19.80748\\-212.8804\\37\\-21.7606\\-212.252\\37\\-23.71373\\-210.892\\37\\-27.61998\\-210.842\\37\\-29.5731\\-210.6723\\37\\-31.52623\\-210.0277\\37\\-33.47935\\-208.9652\\37\\-37.3856\\-208.8423\\37\\-39.33873\\-208.8423\\37\\-41.29185\\-208.6888\\37\\-43.24498\\-208.1716\\37\\-45.1981\\-206.9687\\37\\-47.15123\\-206.7067\\37\\-49.10435\\-206.1594\\37\\-51.05748\\-204.9908\\37\\-53.0106\\-204.3831\\37\\-55.71384\\-201.6146\\37\\-56.4835\\-199.6615\\37\\-56.91685\\-199.1322\\37\\-58.86998\\-199.1044\\37\\-60.39944\\-197.7084\\37\\-59.83285\\-195.7553\\37\\-58.86998\\-194.704\\37\\-55.55843\\-191.849\\37\\-55.13811\\-189.8959\\37\\-55.03031\\-187.9428\\37\\-54.10149\\-185.9896\\37\\-53.29243\\-184.0365\\37\\-52.10488\\-182.0834\\37\\-51.05748\\-180.804\\37\\-49.10435\\-178.7954\\37\\-47.15123\\-176.9445\\37\\-45.1981\\-175.702\\37\\-43.24498\\-175.2834\\37\\-41.29185\\-175.1977\\37\\-39.33873\\-175.6613\\37\\-33.47935\\-175.7044\\37\\-31.52623\\-176.7585\\37\\-29.5731\\-177.54\\37\\-27.61998\\-178.701\\37\\-25.66685\\-179.7135\\37\\-23.71373\\-180.9247\\37\\-21.7606\\-181.3944\\37\\-19.80748\\-181.4882\\37\\-17.85435\\-182.5529\\37\\-15.90123\\-183.2188\\37\\-13.9481\\-183.232\\37\\-11.99498\\-182.9055\\37\\-10.04185\\-182.4222\\37\\-8.088726\\-182.9995\\37\\-4.182476\\-183.554\\37\\-2.229351\\-184.8613\\37\\-0.276226\\-185.3136\\37\\1.676899\\-185.5929\\37\\4.644389\\-187.9428\\37\\6.820574\\-189.8959\\37\\9.489399\\-192.3907\\37\\11.24342\\-193.8021\\37\\12.8497\\-195.7553\\37\\14.13366\\-197.7084\\37\\15.34877\\-198.7095\\37\\17.3019\\-199.0518\\37\\18.99961\\-199.6615\\37\\21.20815\\-200.5754\\37\\25.1144\\-202.8908\\37\\27.06752\\-203.2708\\37\\29.02065\\-203.1609\\37\\30.67278\\-201.6146\\37\\31.99971\\-199.6615\\37\\32.9269\\-198.7343\\37\\34.88002\\-197.2863\\37\\36.23605\\-195.7553\\37\\36.82552\\-193.8021\\37\\36.97371\\-191.849\\37\\37.6661\\-189.8959\\37\\39.37498\\-187.9428\\37\\40.7394\\-186.8559\\37\\42.69252\\-185.4434\\37\\44.64565\\-185.2056\\37\\48.5519\\-185.1297\\37\\50.50502\\-185.2449\\37\\54.41127\\-185.6431\\37\\56.3644\\-186.4837\\37\\58.31752\\-187.1105\\37\\60.27065\\-188.8797\\37\\63.10428\\-191.849\\37\\64.1769\\-193.336\\37\\66.5649\\-195.7553\\37\\67.65778\\-197.7084\\37\\68.08315\\-198.2072\\37\\70.14263\\-199.6615\\37\\71.9894\\-200.6381\\37\\73.00311\\-201.6146\\37\\73.7888\\-203.5678\\37\\71.9894\\-204.4716\\37\\70.03628\\-203.7434\\37\\68.08315\\-204.5881\\37\\67.34453\\-205.5209\\37\\66.77161\\-207.474\\37\\65.49448\\-209.4271\\37\\64.33712\\-211.3803\\37\\62.22377\\-212.8033\\37\\60.27065\\-213.9357\\37\\58.31752\\-214.4459\\37\\54.41127\\-214.9935\\37\\50.50502\\-215.0047\\37\\48.5519\\-214.961\\37\\46.59877\\-214.2557\\37\\44.64565\\-212.9367\\37\\42.69252\\-212.3748\\37\\41.5067\\-211.3803\\37\\39.44912\\-209.4271\\37\\37.76088\\-207.474\\37\\36.82552\\-205.5209\\37\\36.82552\\-203.5678\\37\\34.90642\\-201.6146\\37\\32.9269\\-202.5189\\37\\31.94355\\-203.5678\\37\\30.97377\\-204.3612\\37\\29.02065\\-204.1901\\37\\27.06752\\-204.9854\\37\\26.83695\\-205.5209\\37\\25.1144\\-206.1877\\37\\23.62014\\-205.5209\\37\\23.16127\\-205.1362\\37\\21.20815\\-204.2407\\37\\19.25502\\-203.7164\\37\\17.3019\\-203.967\\37\\15.34877\\-205.0471\\37\\14.88866\\-205.5209\\37\\14.04437\\-207.474\\37\\13.9224\\-209.4271\\37\\12.55085\\-211.3803\\37\\9.489399\\-214.4176\\37\\7.536274\\-215.6635\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "475" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "91.52065\\-186.6905\\37\\90.3086\\-184.0365\\37\\89.16113\\-182.0834\\37\\88.8232\\-180.1303\\37\\87.6144\\-177.8777\\37\\86.88911\\-176.224\\37\\86.21443\\-174.2709\\37\\85.10403\\-172.3178\\37\\84.3086\\-170.3646\\37\\83.10926\\-168.4115\\37\\83.26536\\-166.4584\\37\\83.70815\\-166.0072\\37\\85.66128\\-165.9875\\37\\87.6144\\-167.0735\\37\\89.56753\\-165.49\\37\\90.39384\\-164.5053\\37\\91.52065\\-163.6832\\37\\93.47378\\-163.4403\\37\\95.4269\\-164.3795\\37\\97.38003\\-167.5006\\37\\99.55252\\-170.3646\\37\\100.4243\\-172.3178\\37\\100.7161\\-174.2709\\37\\101.9391\\-176.224\\37\\102.2878\\-178.1771\\37\\102.2878\\-182.0834\\37\\101.9564\\-184.0365\\37\\101.2863\\-184.7442\\37\\99.33315\\-185.6535\\37\\97.38003\\-185.8026\\37\\93.47378\\-187.7855\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002283" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "476" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "99.33315\\-208.446\\37\\98.29829\\-207.474\\37\\96.68248\\-205.5209\\37\\96.69707\\-203.5678\\37\\95.96213\\-201.6146\\37\\95.4269\\-200.8521\\37\\94.84747\\-199.6615\\37\\95.57207\\-197.7084\\37\\97.38003\\-196.7318\\37\\99.33315\\-197.2544\\37\\99.68286\\-197.7084\\37\\99.95629\\-199.6615\\37\\101.2863\\-202.3614\\37\\101.6757\\-203.5678\\37\\102.1098\\-205.5209\\37\\102.4043\\-207.474\\37\\101.2863\\-208.7959\\37" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "130" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "477" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-101.8387\\-212.0023\\39\\-102.373\\-211.3803\\39\\-102.6809\\-209.4271\\39\\-102.6516\\-207.474\\39\\-101.8387\\-206.0882\\39\\-101.1033\\-205.5209\\39\\-100.2775\\-201.6146\\39\\-98.65237\\-199.6615\\39\\-98.78968\\-197.7084\\39\\-99.8856\\-197.0637\\39\\-101.8387\\-197.3134\\39\\-103.7918\\-197.2888\\39\\-105.745\\-194.3969\\39\\-106.2363\\-193.8021\\39\\-106.8483\\-191.849\\39\\-107.0668\\-187.9428\\39\\-107.0742\\-184.0365\\39\\-106.8316\\-180.1303\\39\\-106.3538\\-178.1771\\39\\-105.2741\\-176.224\\39\\-104.0192\\-174.2709\\39\\-102.5129\\-172.3178\\39\\-101.8387\\-171.3033\\39\\-100.1379\\-168.4115\\39\\-97.93247\\-165.5756\\39\\-97.22083\\-164.5053\\39\\-95.97935\\-162.2999\\39\\-94.02622\\-161.0484\\39\\-92.0731\\-159.6891\\39\\-90.11997\\-159.1512\\39\\-88.16685\\-157.9562\\39\\-84.2606\\-155.8272\\39\\-83.14777\\-154.7396\\39\\-82.06065\\-152.7865\\39\\-82.37668\\-150.8334\\39\\-82.3334\\-148.8803\\39\\-82.59944\\-146.9271\\39\\-83.46973\\-144.974\\39\\-83.484\\-143.0209\\39\\-82.90215\\-141.0678\\39\\-81.30949\\-139.1146\\39\\-80.17996\\-137.1615\\39\\-78.40122\\-133.625\\39\\-78.14214\\-133.2553\\39\\-77.65647\\-131.3021\\39\\-77.27909\\-129.349\\39\\-75.32622\\-127.3959\\39\\-73.24798\\-123.4896\\39\\-72.36746\\-121.5365\\39\\-70.73734\\-117.6303\\39\\-70.2044\\-115.6771\\39\\-69.12691\\-113.724\\39\\-67.60387\\-111.7709\\39\\-67.12131\\-109.8178\\39\\-66.50809\\-107.8646\\39\\-66.34639\\-105.9115\\39\\-67.35615\\-103.9584\\39\\-66.9643\\-102.0053\\39\\-66.16879\\-100.0521\\39\\-65.10878\\-98.09901\\39\\-64.72935\\-97.72198\\39\\-62.77623\\-97.12642\\39\\-60.8231\\-97.04828\\39\\-59.67943\\-96.14588\\39\\-56.91685\\-93.59055\\39\\-54.96373\\-93.05045\\39\\-53.16008\\-92.23963\\39\\-51.05748\\-91.06678\\39\\-49.10435\\-90.89356\\39\\-47.15123\\-91.00684\\39\\-45.1981\\-91.30081\\39\\-44.24078\\-92.23963\\39\\-42.51995\\-94.19276\\39\\-41.09241\\-96.14588\\39\\-40.3322\\-98.09901\\39\\-39.30117\\-100.0521\\39\\-39.16434\\-102.0053\\39\\-39.17714\\-103.9584\\39\\-40.09556\\-105.9115\\39\\-41.29185\\-107.6579\\39\\-43.24498\\-109.9532\\39\\-45.1981\\-111.1217\\39\\-47.15123\\-112.9269\\39\\-49.10435\\-114.4443\\39\\-51.05748\\-115.3649\\39\\-53.0106\\-116.8076\\39\\-54.96373\\-118.6777\\39\\-58.12717\\-121.5365\\39\\-59.68614\\-123.4896\\39\\-60.06567\\-125.4428\\39\\-59.96639\\-127.3959\\39\\-59.7262\\-129.349\\39\\-58.50299\\-131.3021\\39\\-57.90258\\-133.2553\\39\\-56.80151\\-135.2084\\39\\-57.81203\\-137.1615\\39\\-59.37975\\-139.1146\\39\\-59.13737\\-141.0678\\39\\-60.8231\\-141.8015\\39\\-62.64753\\-143.0209\\39\\-64.72935\\-144.7299\\39\\-66.68247\\-146.5935\\39\\-68.6356\\-147.7184\\39\\-70.58872\\-148.9965\\39\\-74.49497\\-150.2853\\39\\-76.78733\\-152.7865\\39\\-80.87006\\-156.6928\\39\\-82.30747\\-158.6564\\39\\-83.52818\\-160.599\\39\\-84.2606\\-162.17\\39\\-85.55311\\-164.5053\\39\\-87.46931\\-168.4115\\39\\-87.52561\\-170.3646\\39\\-89.43324\\-174.2709\\39\\-89.99128\\-176.224\\39\\-91.15513\\-178.1771\\39\\-91.40755\\-180.1303\\39\\-92.0731\\-181.602\\39\\-93.32688\\-184.0365\\39\\-93.37315\\-185.9896\\39\\-94.54858\\-187.9428\\39\\-95.28892\\-189.8959\\39\\-95.34746\\-195.7553\\39\\-95.97115\\-197.7084\\39\\-95.72987\\-199.6615\\39\\-97.15891\\-203.5678\\39\\-97.17591\\-209.4271\\39\\-97.43839\\-211.3803\\39\\-97.93247\\-211.9488\\39\\-99.8856\\-212.6519\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "478" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-15.90123\\-124.7675\\39\\-17.03069\\-123.4896\\39\\-17.3407\\-121.5365\\39\\-16.14871\\-117.6303\\39\\-15.90123\\-117.3722\\39\\-13.49675\\-115.6771\\39\\-12.10348\\-113.724\\39\\-11.72098\\-111.7709\\39\\-11.64669\\-109.8178\\39\\-10.58372\\-107.8646\\39\\-8.741628\\-105.9115\\39\\-6.135601\\-101.9824\\39\\-4.182476\\-102.2246\\39\\-2.229351\\-103.555\\39\\-2.085516\\-103.9584\\39\\-0.276226\\-106.091\\39\\0.883442\\-107.8646\\39\\2.364693\\-109.8178\\39\\3.214081\\-111.7709\\39\\3.855385\\-113.724\\39\\4.798697\\-115.6771\\39\\5.583149\\-116.5316\\39\\7.083721\\-117.6303\\39\\9.489399\\-120.2383\\39\\10.19228\\-121.5365\\39\\10.89139\\-123.4896\\39\\9.489399\\-124.3691\\39\\7.536274\\-122.8218\\39\\6.548677\\-121.5365\\39\\5.583149\\-120.5975\\39\\2.897602\\-117.6303\\39\\-0.276226\\-114.5103\\39\\-2.229351\\-113.2878\\39\\-4.182476\\-113.2519\\39\\-6.135601\\-114.0751\\39\\-8.088726\\-115.0168\\39\\-8.756605\\-115.6771\\39\\-10.13659\\-117.6303\\39\\-10.83172\\-119.5834\\39\\-12.42967\\-121.5365\\39\\-13.20327\\-123.4896\\39\\-13.9481\\-124.2387\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "85" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "479" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-13.9481\\-213.4419\\39\\-15.90123\\-212.9367\\39\\-19.80748\\-212.927\\39\\-21.7606\\-212.2813\\39\\-23.71373\\-210.9364\\39\\-29.5731\\-210.6686\\39\\-31.52623\\-210.1487\\39\\-33.47935\\-208.9652\\39\\-39.33873\\-208.9563\\39\\-41.29185\\-208.897\\39\\-43.24498\\-208.368\\39\\-45.1981\\-207.0486\\39\\-47.15123\\-206.9687\\39\\-49.10435\\-206.3884\\39\\-51.05748\\-205.1339\\39\\-53.0106\\-204.4015\\39\\-53.83657\\-203.5678\\39\\-55.39841\\-201.6146\\39\\-55.92579\\-199.6615\\39\\-56.91685\\-198.6023\\39\\-58.97612\\-199.6615\\39\\-60.22068\\-197.7084\\39\\-59.72686\\-195.7553\\39\\-58.86998\\-194.8679\\39\\-57.1203\\-193.8021\\39\\-55.03031\\-191.849\\39\\-54.92617\\-187.9428\\39\\-53.90959\\-185.9896\\39\\-52.18694\\-184.0365\\39\\-51.2932\\-182.0834\\39\\-49.82712\\-180.1303\\39\\-49.10435\\-179.3865\\39\\-47.15123\\-178.081\\39\\-45.1981\\-177.5638\\39\\-43.24498\\-177.397\\39\\-35.43248\\-177.4406\\39\\-33.47935\\-177.5557\\39\\-31.52623\\-178.0002\\39\\-29.5731\\-179.0193\\39\\-27.61998\\-179.7434\\39\\-25.66685\\-180.9779\\39\\-23.71373\\-181.6069\\39\\-21.7606\\-182.9937\\39\\-19.80748\\-183.4991\\39\\-17.85435\\-183.4872\\39\\-15.90123\\-183.789\\39\\-13.9481\\-183.7774\\39\\-11.99498\\-183.4189\\39\\-10.04185\\-183.4049\\39\\-8.088726\\-183.7416\\39\\-6.135601\\-184.2463\\39\\-4.182476\\-184.9398\\39\\-2.229351\\-185.5277\\39\\-0.276226\\-186.8095\\39\\1.676899\\-187.3072\\39\\2.721396\\-187.9428\\39\\4.949112\\-189.8959\\39\\8.850878\\-193.8021\\39\\10.7101\\-195.7553\\39\\11.99967\\-197.7084\\39\\13.39565\\-199.0124\\39\\15.34877\\-199.4999\\39\\17.3019\\-199.8456\\39\\19.25502\\-200.6975\\39\\20.50036\\-201.6146\\39\\20.62831\\-203.5678\\39\\19.25502\\-203.8627\\39\\17.3019\\-202.6623\\39\\15.34877\\-202.5208\\39\\13.1721\\-203.5678\\39\\12.00979\\-205.5209\\39\\11.91203\\-207.474\\39\\11.44252\\-208.8057\\39\\11.01528\\-209.4271\\39\\9.168161\\-211.3803\\39\\7.536274\\-212.9114\\39\\6.838729\\-213.3334\\39\\5.583149\\-213.7408\\39\\1.676899\\-213.7572\\39\\-0.276226\\-212.6305\\39\\-2.229351\\-212.0405\\39\\-4.182476\\-212.4831\\39\\-8.088726\\-214.3522\\39\\-10.04185\\-214.7208\\39\\-11.99498\\-214.3204\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "196" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "480" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-6.135601\\-160.6077\\39\\-7.170757\\-158.6459\\39\\-8.088726\\-157.9994\\39\\-10.04185\\-157.7323\\39\\-11.99498\\-157.8538\\39\\-14.04261\\-158.6459\\39\\-15.90123\\-159.0129\\39\\-17.70176\\-158.6459\\39\\-19.80748\\-158.0462\\39\\-21.7606\\-155.7449\\39\\-23.71373\\-154.1208\\39\\-25.02511\\-152.7865\\39\\-26.47449\\-150.8334\\39\\-27.61998\\-149.7062\\39\\-29.5731\\-147.9753\\39\\-31.52623\\-146.0821\\39\\-35.43248\\-144.0258\\39\\-37.3856\\-142.3413\\39\\-39.33873\\-142.3212\\39\\-41.29185\\-142.9389\\39\\-45.1981\\-143.0584\\39\\-47.15123\\-142.3362\\39\\-49.10435\\-142.9538\\39\\-51.05748\\-144.3551\\39\\-53.0106\\-145.5165\\39\\-54.96373\\-144.8565\\39\\-56.06507\\-143.0209\\39\\-56.87035\\-141.0678\\39\\-54.96373\\-139.4445\\39\\-53.66803\\-137.1615\\39\\-53.24756\\-135.2084\\39\\-53.84229\\-133.2553\\39\\-54.12294\\-131.3021\\39\\-53.29272\\-129.349\\39\\-53.0106\\-129.069\\39\\-51.05748\\-127.9896\\39\\-49.10435\\-127.3881\\39\\-45.1981\\-126.6697\\39\\-43.24498\\-126.7916\\39\\-41.79652\\-125.4428\\39\\-42.69742\\-123.4896\\39\\-44.12568\\-121.5365\\39\\-43.24498\\-120.6221\\39\\-41.29185\\-120.0347\\39\\-39.33873\\-119.3225\\39\\-37.3856\\-120.4758\\39\\-35.43248\\-121.0146\\39\\-33.47935\\-121.266\\39\\-31.52623\\-121.807\\39\\-27.61998\\-122.4144\\39\\-25.66685\\-122.5505\\39\\-23.71373\\-123.0367\\39\\-21.7606\\-124.3982\\39\\-20.67272\\-125.4428\\39\\-21.04674\\-127.3959\\39\\-22.35578\\-129.349\\39\\-22.22192\\-131.3021\\39\\-20.92275\\-133.2553\\39\\-20.35267\\-135.2084\\39\\-20.57097\\-137.1615\\39\\-24.06048\\-141.0678\\39\\-23.71373\\-141.9706\\39\\-22.9512\\-143.0209\\39\\-21.7606\\-143.6507\\39\\-19.80748\\-145.0931\\39\\-17.85435\\-145.5559\\39\\-13.9481\\-145.5369\\39\\-12.10595\\-144.974\\39\\-11.50669\\-143.0209\\39\\-11.5001\\-139.1146\\39\\-11.10997\\-137.1615\\39\\-10.04185\\-136.5042\\39\\-8.088726\\-137.0443\\39\\-6.135601\\-137.9699\\39\\-4.182476\\-139.2347\\39\\-2.229351\\-139.7717\\39\\-0.276226\\-137.9362\\39\\0.3519412\\-137.1615\\39\\1.676899\\-135.8577\\39\\3.630024\\-134.6357\\39\\5.583149\\-135.37\\39\\7.536274\\-135.891\\39\\9.489399\\-135.7625\\39\\11.44252\\-134.2203\\39\\12.3907\\-133.2553\\39\\13.39565\\-131.2064\\39\\13.93387\\-129.349\\39\\13.79238\\-127.3959\\39\\12.56494\\-125.4428\\39\\13.8229\\-123.4896\\39\\15.34877\\-122.4863\\39\\17.3019\\-122.2191\\39\\21.20815\\-122.1062\\39\\29.02065\\-122.1062\\39\\32.9269\\-122.9843\\39\\34.88002\\-123.0014\\39\\36.83315\\-123.3542\\39\\38.78627\\-124.6875\\39\\40.7394\\-125.8297\\39\\42.69252\\-126.424\\39\\44.5471\\-127.3959\\39\\46.59877\\-128.8998\\39\\47.03072\\-129.349\\39\\47.69271\\-131.3021\\39\\47.05406\\-133.2553\\39\\45.89702\\-135.2084\\39\\46.1734\\-137.1615\\39\\46.32824\\-139.1146\\39\\47.52319\\-141.0678\\39\\48.5519\\-142.4712\\39\\50.33269\\-141.0678\\39\\49.46044\\-139.1146\\39\\49.40899\\-137.1615\\39\\49.98307\\-135.2084\\39\\50.27028\\-131.3021\\39\\51.53812\\-129.349\\39\\51.82998\\-127.3959\\39\\51.62757\\-125.4428\\39\\51.10645\\-123.4896\\39\\49.87276\\-121.5365\\39\\47.28934\\-119.5834\\39\\45.97733\\-117.6303\\39\\45.17676\\-115.6771\\39\\43.55789\\-113.724\\39\\43.68278\\-111.7709\\39\\44.05331\\-109.8178\\39\\46.59877\\-106.65\\39\\48.5519\\-104.7918\\39\\50.50502\\-104.2175\\39\\52.45815\\-104.025\\39\\54.41127\\-104.5173\\39\\56.3644\\-105.5144\\39\\58.34024\\-107.8646\\39\\58.27469\\-109.8178\\39\\57.09408\\-111.7709\\39\\57.42031\\-113.724\\39\\58.31752\\-114.4454\\39\\60.27065\\-115.1659\\39\\60.78493\\-115.6771\\39\\62.31852\\-117.6303\\39\\63.19616\\-119.5834\\39\\64.91687\\-121.5365\\39\\65.5759\\-123.4896\\39\\66.85982\\-125.4428\\39\\67.54493\\-127.3959\\39\\68.7588\\-129.349\\39\\70.86864\\-131.3021\\39\\73.39243\\-133.2553\\39\\73.30005\\-135.2084\\39\\74.52847\\-137.1615\\39\\75.55972\\-139.1146\\39\\76.15474\\-141.0678\\39\\75.28612\\-143.0209\\39\\73.57464\\-144.974\\39\\72.68467\\-146.9271\\39\\72.54185\\-148.8803\\39\\71.9894\\-149.9545\\39\\70.03628\\-150.5724\\39\\68.08315\\-149.5968\\39\\66.13003\\-149.5293\\39\\64.57044\\-148.8803\\39\\60.27065\\-146.3625\\39\\58.31752\\-144.8901\\39\\56.3644\\-143.8872\\39\\54.41127\\-143.7252\\39\\50.50502\\-143.6322\\39\\48.5519\\-144.4521\\39\\48.0113\\-144.974\\39\\46.59877\\-145.4505\\39\\44.64565\\-145.7585\\39\\42.69252\\-144.7932\\39\\40.7394\\-143.9493\\39\\38.78627\\-143.927\\39\\36.83315\\-143.7407\\39\\34.88002\\-143.1825\\39\\32.9269\\-143.6068\\39\\30.97377\\-144.1897\\39\\29.70178\\-144.974\\39\\27.06752\\-146.859\\39\\25.58966\\-148.8803\\39\\23.16127\\-151.0075\\39\\21.20815\\-153.3598\\39\\19.44065\\-154.7396\\39\\18.33535\\-156.6928\\39\\17.35824\\-158.6459\\39\\15.34877\\-158.3802\\39\\13.39565\\-157.8362\\39\\11.44252\\-158.2672\\39\\8.534781\\-160.599\\39\\7.536274\\-161.1248\\39\\5.75893\\-160.599\\39\\3.630024\\-159.7159\\39\\1.676899\\-159.5633\\39\\-0.1765768\\-158.6459\\39\\-2.229351\\-157.0183\\39\\-4.182476\\-160.6075\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "481" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-214.2952\\39\\44.64565\\-212.9367\\39\\42.69252\\-212.3704\\39\\40.7394\\-210.5688\\39\\37.856\\-207.474\\39\\37.09224\\-205.5209\\39\\36.84078\\-203.5678\\39\\34.88002\\-201.8504\\39\\34.33749\\-201.6146\\39\\33.35609\\-199.6615\\39\\35.60496\\-197.7084\\39\\37.0876\\-195.7553\\39\\37.63944\\-193.8021\\39\\37.95843\\-191.849\\39\\39.11403\\-189.8959\\39\\41.08053\\-187.9428\\39\\42.69252\\-186.7296\\39\\44.64565\\-185.6431\\39\\46.59877\\-185.4514\\39\\48.5519\\-185.0311\\39\\50.50502\\-184.8303\\39\\52.45815\\-184.8439\\39\\54.41127\\-185.1074\\39\\56.3644\\-185.6003\\39\\58.31752\\-186.4297\\39\\60.27065\\-187.4768\\39\\62.75184\\-189.8959\\39\\64.1769\\-191.4474\\39\\66.52549\\-193.8021\\39\\68.38879\\-195.7553\\39\\69.21416\\-197.7084\\39\\70.03628\\-198.7218\\39\\71.9894\\-200.1584\\39\\73.94253\\-201.2823\\39\\74.26804\\-201.6146\\39\\74.93612\\-203.5678\\39\\73.94253\\-204.3855\\39\\71.9894\\-204.0844\\39\\70.03628\\-204.3501\\39\\68.71644\\-205.5209\\39\\67.65778\\-207.474\\39\\66.85496\\-209.4271\\39\\65.64175\\-211.3803\\39\\64.1769\\-212.7872\\39\\62.22377\\-214.009\\39\\60.27065\\-214.6583\\39\\58.31752\\-214.8996\\39\\54.41127\\-214.9935\\39\\48.5519\\-214.9935\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "482" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "95.4269\\-186.0844\\39\\93.47378\\-185.8164\\39\\92.67988\\-184.0365\\39\\91.48309\\-182.0834\\39\\90.71068\\-180.1303\\39\\89.56753\\-177.8755\\39\\88.88274\\-176.224\\39\\87.6144\\-173.9171\\39\\86.9874\\-172.3178\\39\\86.04532\\-170.3646\\39\\85.66128\\-169.7853\\39\\85.18166\\-168.4115\\39\\85.66128\\-167.7246\\39\\87.6144\\-168.0222\\39\\89.56753\\-168.0886\\39\\90.85509\\-166.4584\\39\\92.07975\\-164.5053\\39\\93.47378\\-163.6057\\39\\95.4269\\-163.4845\\39\\96.80242\\-164.5053\\39\\98.08863\\-166.4584\\39\\99.5235\\-168.4115\\39\\101.9133\\-172.3178\\39\\102.4208\\-174.2709\\39\\102.9033\\-178.1771\\39\\102.8929\\-182.0834\\39\\102.5206\\-184.0365\\39\\101.2863\\-185.2771\\39\\99.33315\\-185.7779\\39\\97.38003\\-185.7902\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002282" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "483" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "101.2863\\-210.1016\\39\\100.564\\-209.4271\\39\\99.01414\\-207.474\\39\\99.27666\\-205.5209\\39\\101.2863\\-206.1831\\39\\103.1524\\-207.474\\39\\103.2788\\-209.4271\\39" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "484" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-196.152\\41\\-105.745\\-194.5909\\41\\-106.5796\\-193.8021\\41\\-107.6034\\-191.849\\41\\-108.2901\\-189.8959\\41\\-108.7401\\-187.9428\\41\\-108.754\\-184.0365\\41\\-108.3589\\-182.0834\\41\\-107.6605\\-180.1303\\41\\-107.3516\\-178.1771\\41\\-106.9363\\-176.224\\41\\-105.9131\\-174.2709\\41\\-103.7918\\-171.9957\\41\\-103.0403\\-170.3646\\41\\-102.0128\\-168.4115\\41\\-99.8856\\-166.1876\\41\\-97.93247\\-163.6044\\41\\-97.21804\\-162.5521\\41\\-95.97935\\-160.4552\\41\\-94.02622\\-159.5682\\41\\-90.11997\\-159.4085\\41\\-86.21372\\-158.8794\\41\\-85.74288\\-160.599\\41\\-86.21372\\-161.8958\\41\\-86.64426\\-162.5521\\41\\-89.32198\\-168.4115\\41\\-89.49474\\-170.3646\\41\\-90.47443\\-172.3178\\41\\-91.27511\\-174.2709\\41\\-91.72658\\-176.224\\41\\-92.74407\\-178.1771\\41\\-93.36893\\-180.1303\\41\\-94.02622\\-181.5745\\41\\-95.30953\\-184.0365\\41\\-95.34273\\-185.9896\\41\\-96.47733\\-187.9428\\41\\-97.1748\\-189.8959\\41\\-97.2916\\-191.849\\41\\-97.29986\\-193.8021\\41\\-97.93247\\-195.4511\\41\\-98.59515\\-195.7553\\41\\-99.8856\\-196.0027\\41\\-101.8387\\-196.2172\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "485" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-15.90123\\-123.9225\\41\\-16.18305\\-123.4896\\41\\-16.11293\\-121.5365\\41\\-14.84476\\-119.5834\\41\\-14.24107\\-117.6303\\41\\-13.9481\\-117.3164\\41\\-11.99498\\-116.2693\\41\\-11.40904\\-115.6771\\41\\-10.64818\\-113.724\\41\\-10.50382\\-111.7709\\41\\-10.49483\\-109.8178\\41\\-10.38236\\-107.8646\\41\\-9.133277\\-105.9115\\41\\-8.051166\\-103.9584\\41\\-7.276693\\-102.0053\\41\\-6.135601\\-101.0884\\41\\-4.182476\\-101.2425\\41\\-2.229351\\-101.1906\\41\\-1.098225\\-102.0053\\41\\-0.9950157\\-103.9584\\41\\0.3730842\\-105.9115\\41\\1.027646\\-107.8646\\41\\2.015706\\-109.8178\\41\\2.749638\\-111.7709\\41\\2.816222\\-113.724\\41\\3.950992\\-115.6771\\41\\4.443826\\-117.6303\\41\\5.583149\\-118.6705\\41\\5.983075\\-119.5834\\41\\5.583149\\-119.922\\41\\3.394302\\-117.6303\\41\\1.119846\\-115.6771\\41\\-0.276226\\-114.7376\\41\\-2.229351\\-114.5507\\41\\-4.182476\\-114.5451\\41\\-6.135601\\-114.7997\\41\\-8.088726\\-116.0027\\41\\-10.04185\\-116.891\\41\\-10.78809\\-117.6303\\41\\-11.32884\\-119.5834\\41\\-12.86395\\-121.5365\\41\\-13.41363\\-123.4896\\41\\-13.9481\\-124.0428\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "76" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "486" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-13.9481\\-212.9766\\41\\-15.90123\\-212.927\\41\\-19.80748\\-212.6989\\41\\-21.7606\\-212.1421\\41\\-23.71373\\-210.8198\\41\\-27.61998\\-210.1012\\41\\-29.5731\\-210.0728\\41\\-31.59598\\-209.4271\\41\\-33.47935\\-208.9563\\41\\-37.3856\\-208.9475\\41\\-41.29185\\-208.7535\\41\\-43.24498\\-208.2837\\41\\-45.1981\\-207.0486\\41\\-47.15123\\-207.0393\\41\\-49.10435\\-206.4065\\41\\-51.05748\\-204.9684\\41\\-53.0106\\-204.1808\\41\\-53.61693\\-203.5678\\41\\-54.52163\\-201.6146\\41\\-55.0451\\-199.6615\\41\\-56.91685\\-198.3332\\41\\-58.86998\\-199.3494\\41\\-59.70338\\-197.7084\\41\\-59.32571\\-195.7553\\41\\-58.86998\\-195.2472\\41\\-56.91685\\-193.7646\\41\\-54.96373\\-192.4317\\41\\-54.51055\\-191.849\\41\\-54.86827\\-187.9428\\41\\-53.68877\\-185.9896\\41\\-51.73843\\-184.0365\\41\\-49.10435\\-181.0065\\41\\-47.15123\\-179.5078\\41\\-43.24498\\-178.6378\\41\\-35.43248\\-178.6378\\41\\-29.5731\\-179.9533\\41\\-27.61998\\-181.1124\\41\\-25.66685\\-181.7753\\41\\-23.71373\\-183.06\\41\\-21.7606\\-184.5441\\41\\-19.80748\\-185.2167\\41\\-15.90123\\-184.481\\41\\-11.99498\\-184.3886\\41\\-10.04185\\-184.9184\\41\\-8.088726\\-185.228\\41\\-6.135601\\-185.4048\\41\\-4.182476\\-185.7421\\41\\-2.229351\\-186.9775\\41\\-0.276226\\-187.6953\\41\\1.676899\\-188.84\\41\\2.956788\\-189.8959\\41\\4.895116\\-191.849\\41\\6.71527\\-193.8021\\41\\7.536274\\-194.8809\\41\\9.425152\\-197.7084\\41\\11.44252\\-199.0575\\41\\13.39565\\-199.6239\\41\\15.34877\\-200.0624\\41\\17.3019\\-201.2533\\41\\17.3019\\-201.8621\\41\\15.34877\\-202.341\\41\\13.39565\\-202.3543\\41\\11.44252\\-202.5963\\41\\10.06087\\-203.5678\\41\\9.489399\\-205.1107\\41\\8.22078\\-207.474\\41\\7.255142\\-209.4271\\41\\5.583149\\-210.9388\\41\\4.938618\\-211.3803\\41\\3.630024\\-211.8079\\41\\1.676899\\-211.8343\\41\\-0.276226\\-211.2101\\41\\-2.229351\\-210.9037\\41\\-4.182476\\-212.1668\\41\\-8.088726\\-213.5078\\41\\-10.04185\\-213.8953\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "202" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "487" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "15.34877\\-158.9277\\41\\13.39565\\-157.5703\\41\\11.44252\\-157.1636\\41\\9.489399\\-157.2747\\41\\7.536274\\-156.9831\\41\\6.385325\\-156.6928\\41\\3.630024\\-155.0808\\41\\1.676899\\-154.7158\\41\\-0.276226\\-153.1557\\41\\-2.229351\\-152.1622\\41\\-4.182476\\-151.2687\\41\\-6.135601\\-151.4895\\41\\-8.066015\\-152.7865\\41\\-10.04185\\-152.9772\\41\\-11.99498\\-153.3753\\41\\-13.5412\\-154.7396\\41\\-17.88225\\-156.6928\\41\\-19.80748\\-157.1087\\41\\-21.7606\\-155.4575\\41\\-23.71373\\-154.5283\\41\\-25.66685\\-152.2736\\41\\-26.71499\\-150.8334\\41\\-29.5731\\-147.7831\\41\\-31.52623\\-145.8327\\41\\-33.47935\\-144.2287\\41\\-35.43248\\-143.6112\\41\\-37.3856\\-142.1005\\41\\-39.33873\\-141.9234\\41\\-41.29185\\-141.9855\\41\\-43.24498\\-141.8681\\41\\-47.15123\\-141.8405\\41\\-49.10435\\-142.1845\\41\\-51.05748\\-143.6068\\41\\-53.0106\\-144.2272\\41\\-54.96373\\-144.2351\\41\\-56.68923\\-143.0209\\41\\-58.57701\\-141.0678\\41\\-57.49926\\-139.1146\\41\\-57.97742\\-137.1615\\41\\-58.86998\\-136.6615\\41\\-59.64575\\-137.1615\\41\\-60.3475\\-139.1146\\41\\-60.8231\\-139.8257\\41\\-61.9861\\-141.0678\\41\\-64.72935\\-142.7337\\41\\-66.68247\\-144.6108\\41\\-67.2532\\-144.974\\41\\-70.58872\\-146.5713\\41\\-72.54185\\-147.6095\\41\\-74.49497\\-148.1671\\41\\-76.4481\\-149.9866\\41\\-78.40122\\-151.4581\\41\\-80.33215\\-150.8334\\41\\-80.28986\\-148.8803\\41\\-79.39215\\-146.9271\\41\\-79.55151\\-144.974\\41\\-80.35435\\-144.1826\\41\\-82.30747\\-144.4269\\41\\-83.5556\\-143.0209\\41\\-83.23904\\-141.0678\\41\\-81.65134\\-139.1146\\41\\-81.00014\\-137.1615\\41\\-79.27692\\-135.2084\\41\\-78.39359\\-133.2553\\41\\-78.0547\\-131.3021\\41\\-78.95197\\-129.349\\41\\-78.40122\\-128.3519\\41\\-76.4481\\-127.2319\\41\\-74.49497\\-125.7574\\41\\-72.54185\\-122.1717\\41\\-72.12774\\-121.5365\\41\\-71.22062\\-119.5834\\41\\-69.65223\\-115.6771\\41\\-68.6356\\-114.0654\\41\\-66.47269\\-111.7709\\41\\-65.57139\\-109.8178\\41\\-66.31549\\-105.9115\\41\\-66.94157\\-103.9584\\41\\-66.60171\\-102.0053\\41\\-66.07767\\-100.0521\\41\\-64.12067\\-98.09901\\41\\-62.77623\\-97.23048\\41\\-60.8231\\-96.896\\41\\-57.5661\\-94.19276\\41\\-56.91685\\-93.54705\\41\\-54.96373\\-93.03987\\41\\-53.68335\\-92.23963\\41\\-51.05748\\-90.32407\\41\\-49.10435\\-89.88671\\41\\-47.15123\\-90.94621\\41\\-45.1981\\-91.78265\\41\\-43.08339\\-94.19276\\41\\-42.27725\\-96.14588\\41\\-40.52088\\-98.09901\\41\\-39.74047\\-100.0521\\41\\-39.43347\\-102.0053\\41\\-39.56409\\-103.9584\\41\\-40.11324\\-105.9115\\41\\-41.29185\\-107.3884\\41\\-43.24498\\-109.5514\\41\\-47.15123\\-112.4535\\41\\-49.10435\\-113.5315\\41\\-53.0106\\-116.5522\\41\\-54.96373\\-117.4109\\41\\-56.91685\\-119.0078\\41\\-59.39495\\-121.5365\\41\\-59.99955\\-123.4896\\41\\-60.39773\\-125.4428\\41\\-60.33482\\-127.3959\\41\\-59.94646\\-129.349\\41\\-59.08317\\-131.3021\\41\\-56.91685\\-134.539\\41\\-55.89206\\-135.2084\\41\\-54.96373\\-136.4616\\41\\-54.47225\\-135.2084\\41\\-54.84075\\-133.2553\\41\\-54.98643\\-131.3021\\41\\-54.2893\\-129.349\\41\\-53.0106\\-128.0265\\41\\-51.05748\\-126.817\\41\\-49.10435\\-126.3995\\41\\-45.1981\\-126.1304\\41\\-43.24498\\-125.5823\\41\\-42.25058\\-123.4896\\41\\-41.29185\\-121.899\\41\\-39.33873\\-121.0228\\41\\-37.3856\\-121.5592\\41\\-35.43248\\-121.7722\\41\\-33.47935\\-120.9302\\41\\-31.52623\\-120.5816\\41\\-29.5731\\-120.586\\41\\-27.61998\\-120.9551\\41\\-25.66685\\-122.1681\\41\\-23.71373\\-122.8403\\41\\-21.7606\\-124.1562\\41\\-20.30453\\-125.4428\\41\\-20.36789\\-127.3959\\41\\-20.83775\\-129.349\\41\\-20.9468\\-131.3021\\41\\-19.66797\\-133.2553\\41\\-18.51739\\-135.2084\\41\\-18.33375\\-137.1615\\41\\-18.47969\\-139.1146\\41\\-18.26345\\-141.0678\\41\\-17.85435\\-141.3534\\41\\-15.90123\\-141.407\\41\\-15.58528\\-141.0678\\41\\-15.08551\\-139.1146\\41\\-13.9481\\-137.6929\\41\\-13.67643\\-137.1615\\41\\-11.99498\\-136.0653\\41\\-10.04185\\-135.9164\\41\\-6.135601\\-136.0958\\41\\-4.182476\\-136.2806\\41\\-2.229351\\-136.6044\\41\\-0.276226\\-136.1623\\41\\3.630024\\-135.7857\\41\\7.536274\\-135.8645\\41\\9.489399\\-134.9575\\41\\11.44252\\-133.1602\\41\\12.6423\\-131.3021\\41\\13.34347\\-129.349\\41\\13.69258\\-127.3959\\41\\13.32804\\-125.4428\\41\\14.62398\\-123.4896\\41\\15.34877\\-122.9341\\41\\17.3019\\-122.3557\\41\\21.20815\\-122.1062\\41\\29.02065\\-122.1062\\41\\30.97377\\-122.7623\\41\\32.9269\\-123.8667\\41\\36.83315\\-123.9605\\41\\38.78627\\-124.725\\41\\40.7394\\-125.8774\\41\\42.69252\\-126.6647\\41\\44.64565\\-127.7527\\41\\46.59877\\-128.685\\41\\47.26665\\-129.349\\41\\48.02994\\-131.3021\\41\\47.63543\\-133.2553\\41\\46.12793\\-135.2084\\41\\46.39933\\-137.1615\\41\\47.3312\\-139.1146\\41\\47.8219\\-141.0678\\41\\47.64636\\-143.0209\\41\\46.59877\\-144.0437\\41\\44.64565\\-144.3658\\41\\40.7394\\-143.1017\\41\\38.78627\\-143.0875\\41\\36.83315\\-142.4229\\41\\34.88002\\-141.9993\\41\\32.9269\\-142.267\\41\\30.97377\\-143.5748\\41\\29.02065\\-144.3003\\41\\28.32078\\-144.974\\41\\26.79699\\-146.9271\\41\\26.10546\\-148.8803\\41\\24.24038\\-150.8334\\41\\21.0442\\-154.7396\\41\\20.34291\\-158.6459\\41\\19.25502\\-159.8321\\41\\17.3019\\-159.6431\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "488" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-214.2952\\41\\44.64565\\-212.9367\\41\\42.69252\\-212.3614\\41\\39.79034\\-209.4271\\41\\38.51204\\-207.474\\41\\37.74236\\-205.5209\\41\\37.22753\\-203.5678\\41\\36.83315\\-202.9762\\41\\34.88002\\-202.4524\\41\\33.66491\\-201.6146\\41\\33.89344\\-199.6615\\41\\34.88002\\-198.6216\\41\\36.83315\\-197.1459\\41\\37.93178\\-195.7553\\41\\38.14048\\-193.8021\\41\\38.78627\\-191.8955\\41\\39.73936\\-189.8959\\41\\42.69252\\-186.9705\\41\\44.64565\\-185.8152\\41\\46.59877\\-185.129\\41\\48.5519\\-184.589\\41\\50.50502\\-184.1981\\41\\52.45815\\-184.1851\\41\\54.41127\\-184.6279\\41\\58.31752\\-185.1293\\41\\60.27065\\-186.4203\\41\\62.22377\\-187.5895\\41\\62.62869\\-187.9428\\41\\68.08315\\-193.3744\\41\\68.46372\\-193.8021\\41\\69.53943\\-195.7553\\41\\70.07565\\-197.7084\\41\\72.16468\\-199.6615\\41\\73.94253\\-200.7228\\41\\74.86742\\-201.6146\\41\\75.82928\\-203.5678\\41\\73.94253\\-204.4592\\41\\71.9894\\-203.8222\\41\\70.03628\\-205.1665\\41\\69.74331\\-205.5209\\41\\69.27498\\-207.474\\41\\68.08315\\-209.608\\41\\67.3276\\-211.3803\\41\\66.13003\\-212.7266\\41\\64.1769\\-214.0095\\41\\62.22377\\-214.6942\\41\\60.27065\\-214.9504\\41\\58.31752\\-215.0047\\41\\48.5519\\-214.9935\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "489" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "66.13003\\-147.5927\\41\\64.54681\\-146.9271\\41\\62.22377\\-145.6477\\41\\60.6584\\-144.974\\41\\57.28056\\-143.0209\\41\\56.3644\\-142.4324\\41\\54.41127\\-141.7246\\41\\52.45815\\-141.7014\\41\\51.54052\\-141.0678\\41\\49.99747\\-139.1146\\41\\49.96373\\-137.1615\\41\\50.45308\\-133.2553\\41\\50.82156\\-131.3021\\41\\51.68437\\-129.349\\41\\52.21066\\-127.3959\\41\\52.15419\\-125.4428\\41\\51.81244\\-123.4896\\41\\50.91396\\-121.5365\\41\\48.5519\\-119.2536\\41\\46.59877\\-117.1791\\41\\45.36922\\-115.6771\\41\\43.90137\\-113.724\\41\\43.8919\\-111.7709\\41\\44.10743\\-109.8178\\41\\45.16609\\-107.8646\\41\\46.39648\\-105.9115\\41\\48.5519\\-103.8345\\41\\50.50502\\-103.0345\\41\\52.45815\\-102.4127\\41\\54.41127\\-102.4825\\41\\56.97808\\-105.9115\\41\\57.59661\\-107.8646\\41\\56.9417\\-109.8178\\41\\56.94815\\-111.7709\\41\\57.96543\\-113.724\\41\\60.27065\\-115.8387\\41\\62.22377\\-118.0532\\41\\63.09523\\-119.5834\\41\\64.89782\\-121.5365\\41\\65.5918\\-123.4896\\41\\66.86636\\-125.4428\\41\\67.54493\\-127.3959\\41\\68.76225\\-129.349\\41\\70.73031\\-131.3021\\41\\72.96028\\-133.2553\\41\\73.33659\\-135.2084\\41\\73.59179\\-137.1615\\41\\73.64391\\-139.1146\\41\\73.57011\\-141.0678\\41\\73.88508\\-143.0209\\41\\72.88416\\-144.974\\41\\71.9894\\-146.5276\\41\\70.03628\\-148.5547\\41\\68.08315\\-147.6265\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002281" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "28" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "490" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "95.4269\\-184.7606\\41\\94.74016\\-184.0365\\41\\93.79929\\-182.0834\\41\\92.37144\\-180.1303\\41\\91.26156\\-178.1771\\41\\90.91822\\-176.224\\41\\89.56753\\-173.7673\\41\\89.01199\\-172.3178\\41\\89.46431\\-170.3646\\41\\91.52065\\-168.7194\\41\\91.78768\\-168.4115\\41\\92.70487\\-166.4584\\41\\93.92633\\-164.5053\\41\\95.4269\\-163.6136\\41\\97.38003\\-163.5382\\41\\98.62683\\-164.5053\\41\\99.55851\\-166.4584\\41\\101.3839\\-168.4115\\41\\102.4208\\-170.3646\\41\\102.7629\\-172.3178\\41\\103.9361\\-174.2709\\41\\104.6002\\-176.224\\41\\104.6152\\-182.0834\\41\\104.0379\\-184.0365\\41\\103.2394\\-184.7823\\41\\101.2863\\-185.6748\\41\\99.33315\\-185.8026\\41\\97.38003\\-185.5729\\41" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "491" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-194.4879\\43\\-107.6981\\-193.2232\\43\\-108.7962\\-191.849\\43\\-109.0088\\-189.8959\\43\\-109.4155\\-187.9428\\43\\-109.7042\\-185.9896\\43\\-109.7474\\-184.0365\\43\\-109.1019\\-180.1303\\43\\-109.0176\\-178.1771\\43\\-108.3513\\-176.224\\43\\-107.3833\\-174.2709\\43\\-106.0396\\-172.3178\\43\\-104.4407\\-170.3646\\43\\-103.3759\\-168.4115\\43\\-102.1309\\-166.4584\\43\\-99.8856\\-164.2321\\43\\-97.21531\\-160.599\\43\\-95.97935\\-159.4581\\43\\-94.02622\\-159.5899\\43\\-90.09472\\-160.599\\43\\-89.49017\\-162.5521\\43\\-89.53288\\-164.5053\\43\\-89.89618\\-166.4584\\43\\-90.87879\\-168.4115\\43\\-91.42809\\-170.3646\\43\\-91.80257\\-172.3178\\43\\-92.80552\\-174.2709\\43\\-93.39327\\-176.224\\43\\-94.43784\\-178.1771\\43\\-95.97935\\-181.5273\\43\\-97.29986\\-184.0365\\43\\-97.32363\\-185.9896\\43\\-97.68328\\-187.9428\\43\\-99.02762\\-189.8959\\43\\-99.29609\\-191.849\\43\\-99.32498\\-193.8021\\43\\-99.8856\\-194.5229\\43\\-101.8387\\-195.2634\\43\\-103.7918\\-195.306\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "80" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "492" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-19.80748\\-211.8939\\43\\-23.71373\\-210.2666\\43\\-25.66685\\-209.262\\43\\-27.61998\\-208.7417\\43\\-31.52623\\-208.7813\\43\\-37.3856\\-208.7405\\43\\-39.33873\\-208.4171\\43\\-41.29185\\-208.2002\\43\\-43.24498\\-207.6734\\43\\-45.1981\\-207.0393\\43\\-47.15123\\-206.8935\\43\\-49.10435\\-206.1161\\43\\-51.05748\\-204.3672\\43\\-52.08218\\-203.5678\\43\\-53.29243\\-201.6146\\43\\-53.51591\\-199.6615\\43\\-54.96373\\-198.2052\\43\\-56.91685\\-198.5667\\43\\-58.86998\\-197.861\\43\\-58.97848\\-197.7084\\43\\-58.46823\\-195.7553\\43\\-56.91685\\-194.0531\\43\\-54.96373\\-193.3862\\43\\-53.53256\\-191.849\\43\\-53.69356\\-189.8959\\43\\-54.08385\\-187.9428\\43\\-53.0106\\-187.0083\\43\\-51.05748\\-185.1115\\43\\-50.16908\\-184.0365\\43\\-48.22615\\-182.0834\\43\\-47.15123\\-181.2045\\43\\-45.1981\\-180.1074\\43\\-43.24498\\-179.6035\\43\\-35.43248\\-179.6035\\43\\-33.47935\\-180.0489\\43\\-31.52623\\-181.152\\43\\-29.5731\\-181.5621\\43\\-27.61998\\-182.6718\\43\\-25.66685\\-183.4087\\43\\-24.56822\\-184.0365\\43\\-23.71373\\-184.7097\\43\\-21.7606\\-185.6967\\43\\-19.80748\\-186.2266\\43\\-17.85435\\-185.51\\43\\-15.90123\\-185.2395\\43\\-13.9481\\-185.2337\\43\\-11.99498\\-185.42\\43\\-8.088726\\-186.2283\\43\\-6.135601\\-186.8537\\43\\-4.182476\\-187.3731\\43\\-2.229351\\-188.5364\\43\\-0.276226\\-189.3186\\43\\0.7382613\\-189.8959\\43\\1.676899\\-190.6228\\43\\2.893958\\-191.849\\43\\5.583149\\-195.8204\\43\\6.241761\\-197.7084\\43\\7.536274\\-198.6907\\43\\9.489399\\-199.1202\\43\\11.44252\\-199.9213\\43\\13.39565\\-200.2444\\43\\15.29627\\-201.6146\\43\\13.39565\\-202.4727\\43\\11.44252\\-202.4935\\43\\9.489399\\-202.2742\\43\\7.536274\\-202.7598\\43\\6.401883\\-203.5678\\43\\6.081674\\-205.5209\\43\\5.583149\\-206.9467\\43\\5.157872\\-207.474\\43\\3.010283\\-209.4271\\43\\1.676899\\-209.8716\\43\\-0.276226\\-209.9154\\43\\-2.229351\\-210.3174\\43\\-4.182476\\-211.2033\\43\\-6.135601\\-212.3464\\43\\-8.088726\\-212.6992\\43\\-10.04185\\-212.7452\\43\\-15.90123\\-212.6695\\43\\-17.85435\\-212.3517\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "493" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-8.088726\\-115.9009\\43\\-8.442864\\-115.6771\\43\\-8.885774\\-113.724\\43\\-8.612305\\-111.7709\\43\\-8.658387\\-109.8178\\43\\-10.60451\\-107.8646\\43\\-10.92204\\-105.9115\\43\\-10.04185\\-105.1382\\43\\-8.134359\\-103.9584\\43\\-6.771652\\-102.0053\\43\\-6.135601\\-101.4399\\43\\-4.182476\\-101.0201\\43\\-2.229351\\-101.0929\\43\\-0.9128458\\-102.0053\\43\\-0.8029779\\-103.9584\\43\\0.471678\\-107.8646\\43\\0.1650356\\-113.724\\43\\-0.276226\\-114.1406\\43\\-2.229351\\-114.946\\43\\-4.182476\\-115.2063\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "194" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "494" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "19.25502\\-159.0523\\43\\18.16453\\-158.6459\\43\\17.3019\\-158.0147\\43\\15.34877\\-156.8684\\43\\13.39565\\-154.7821\\43\\11.44252\\-153.7988\\43\\9.489399\\-153.3184\\43\\8.543839\\-152.7865\\43\\7.536274\\-151.7947\\43\\5.306456\\-150.8334\\43\\3.630024\\-149.6067\\43\\1.098933\\-148.8803\\43\\-0.276226\\-147.9936\\43\\-2.229351\\-147.4407\\43\\-6.135601\\-147.3408\\43\\-8.088726\\-147.4451\\43\\-10.04185\\-147.9037\\43\\-11.3386\\-148.8803\\43\\-11.99498\\-149.1955\\43\\-13.9481\\-150.9651\\43\\-15.90123\\-151.7323\\43\\-17.32851\\-152.7865\\43\\-19.80748\\-153.6308\\43\\-21.7606\\-153.3606\\43\\-23.71373\\-153.2025\\43\\-25.66685\\-151.5565\\43\\-27.89235\\-148.8803\\43\\-29.00289\\-146.9271\\43\\-31.52623\\-144.3546\\43\\-33.47935\\-143.4758\\43\\-35.43248\\-142.3102\\43\\-37.3856\\-141.7478\\43\\-39.33873\\-141.0754\\43\\-41.29185\\-141.0905\\43\\-43.24498\\-140.124\\43\\-45.1981\\-140.2877\\43\\-47.15123\\-141.0905\\43\\-51.05748\\-142.2859\\43\\-53.0106\\-143.4052\\43\\-54.96373\\-143.473\\43\\-56.91685\\-142.2771\\43\\-58.03359\\-141.0678\\43\\-58.0953\\-139.1146\\43\\-58.32066\\-137.1615\\43\\-58.86998\\-136.5457\\43\\-60.8231\\-136.3767\\43\\-61.59843\\-137.1615\\43\\-62.55243\\-139.1146\\43\\-64.72935\\-140.8045\\43\\-66.68247\\-142.6577\\43\\-67.2607\\-143.0209\\43\\-70.58872\\-144.5883\\43\\-71.17717\\-144.974\\43\\-74.49497\\-146.5547\\43\\-76.4481\\-148.3145\\43\\-78.40122\\-147.9037\\43\\-78.61293\\-146.9271\\43\\-79.30737\\-144.974\\43\\-80.35435\\-143.8686\\43\\-82.30747\\-143.5551\\43\\-82.91701\\-143.0209\\43\\-83.42673\\-141.0678\\43\\-82.96777\\-139.1146\\43\\-79.67747\\-135.2084\\43\\-79.02602\\-133.2553\\43\\-78.1655\\-131.3021\\43\\-79.36459\\-129.349\\43\\-79.03571\\-127.3959\\43\\-78.40122\\-126.7888\\43\\-76.4481\\-126.676\\43\\-74.49497\\-125.4195\\43\\-73.22186\\-123.4896\\43\\-71.72642\\-121.5365\\43\\-70.92481\\-119.5834\\43\\-70.40173\\-117.6303\\43\\-69.30265\\-115.6771\\43\\-66.16879\\-111.7709\\43\\-65.45092\\-109.8178\\43\\-65.92403\\-107.8646\\43\\-66.28574\\-105.9115\\43\\-66.17421\\-103.9584\\43\\-66.17716\\-102.0053\\43\\-65.65111\\-100.0521\\43\\-62.77623\\-97.57404\\43\\-60.8231\\-96.50734\\43\\-60.45928\\-96.14588\\43\\-57.59208\\-94.19276\\43\\-56.91685\\-93.54705\\43\\-54.96373\\-93.03987\\43\\-53.0106\\-91.66756\\43\\-51.05748\\-89.79212\\43\\-49.10435\\-89.16714\\43\\-47.39712\\-90.28651\\43\\-46.05853\\-92.23963\\43\\-44.25538\\-94.19276\\43\\-43.24498\\-95.58121\\43\\-41.23967\\-98.09901\\43\\-40.35285\\-100.0521\\43\\-40.04125\\-102.0053\\43\\-40.26556\\-103.9584\\43\\-40.24619\\-105.9115\\43\\-41.29185\\-107.1855\\43\\-43.24498\\-109.2181\\43\\-45.1981\\-110.5679\\43\\-47.15123\\-111.6167\\43\\-49.10435\\-112.9269\\43\\-51.05748\\-114.7668\\43\\-53.0106\\-116.0542\\43\\-54.96373\\-116.425\\43\\-56.80753\\-117.6303\\43\\-58.06003\\-119.5834\\43\\-59.67232\\-121.5365\\43\\-60.50829\\-123.4896\\43\\-61.06724\\-125.4428\\43\\-60.9051\\-127.3959\\43\\-60.16354\\-129.349\\43\\-59.80547\\-131.3021\\43\\-58.86998\\-132.5773\\43\\-56.91685\\-132.9532\\43\\-55.70261\\-131.3021\\43\\-55.00129\\-129.349\\43\\-53.0106\\-127.1368\\43\\-51.05748\\-126.331\\43\\-49.10435\\-125.9481\\43\\-47.15123\\-125.0484\\43\\-45.1981\\-124.4759\\43\\-43.24498\\-124.3167\\43\\-41.29185\\-122.7036\\43\\-39.33873\\-122.0161\\43\\-37.3856\\-122.0585\\43\\-35.43248\\-121.0745\\43\\-33.47935\\-120.5177\\43\\-31.52623\\-120.345\\43\\-29.5731\\-120.3393\\43\\-27.61998\\-120.4579\\43\\-25.88783\\-121.5365\\43\\-23.71373\\-123.6281\\43\\-21.7606\\-124.6626\\43\\-20.96261\\-125.4428\\43\\-19.99717\\-127.3959\\43\\-20.0432\\-129.349\\43\\-20.45335\\-131.3021\\43\\-17.85435\\-134.7543\\43\\-15.90123\\-136.1669\\43\\-13.9481\\-136.0536\\43\\-10.04185\\-136.0001\\43\\-2.229351\\-136.0421\\43\\1.676899\\-135.9577\\43\\3.630024\\-136.0001\\43\\7.536274\\-135.9323\\43\\9.489399\\-135.4675\\43\\9.777928\\-135.2084\\43\\11.14956\\-133.2553\\43\\11.94784\\-131.3021\\43\\12.98346\\-129.349\\43\\14.30322\\-127.3959\\43\\15.32534\\-125.4428\\43\\17.39531\\-123.4896\\43\\19.25502\\-122.5598\\43\\21.20815\\-122.1062\\43\\27.06752\\-122.1062\\43\\29.02065\\-122.2435\\43\\30.97377\\-122.8993\\43\\32.9269\\-123.9692\\43\\34.88002\\-123.9779\\43\\36.83315\\-124.1389\\43\\38.78627\\-124.8324\\43\\40.7394\\-125.8867\\43\\42.69252\\-126.6898\\43\\44.64565\\-127.8023\\43\\46.59877\\-128.6704\\43\\47.2891\\-129.349\\43\\48.09892\\-131.3021\\43\\47.75336\\-133.2553\\43\\46.78514\\-135.2084\\43\\47.88905\\-139.1146\\43\\47.73647\\-141.0678\\43\\46.59877\\-142.4552\\43\\44.64565\\-143.5296\\43\\42.69252\\-142.3822\\43\\40.7394\\-141.8622\\43\\38.78627\\-141.6701\\43\\36.83315\\-141.6185\\43\\34.88002\\-141.2032\\43\\32.9269\\-141.6581\\43\\30.97377\\-142.2426\\43\\29.02065\\-143.9375\\43\\28.17592\\-144.974\\43\\26.90358\\-146.9271\\43\\26.1409\\-148.8803\\43\\24.52206\\-150.8334\\43\\24.05646\\-154.7396\\43\\23.64956\\-156.6928\\43\\23.16127\\-157.181\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "495" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-215.5135\\43\\50.50502\\-215.0047\\43\\48.5519\\-214.9935\\43\\46.59877\\-214.2901\\43\\44.64565\\-212.8251\\43\\42.69252\\-212.1018\\43\\41.96692\\-211.3803\\43\\40.43341\\-209.4271\\43\\39.71168\\-207.474\\43\\38.56248\\-205.5209\\43\\37.94441\\-203.5678\\43\\37.43587\\-201.6146\\43\\36.83315\\-201.1232\\43\\36.27813\\-201.6146\\43\\34.4615\\-203.5678\\43\\32.9269\\-204.5443\\43\\32.00459\\-203.5678\\43\\33.72326\\-201.6146\\43\\34.3773\\-199.6615\\43\\34.88002\\-199.0368\\43\\36.83315\\-197.6276\\43\\38.53879\\-195.7553\\43\\38.92171\\-193.8021\\43\\39.6033\\-191.849\\43\\40.03327\\-189.8959\\43\\41.70704\\-187.9428\\43\\42.69252\\-186.9878\\43\\44.64565\\-185.8152\\43\\46.59877\\-185.0396\\43\\48.5519\\-184.0741\\43\\50.50502\\-183.9699\\43\\52.45815\\-183.6571\\43\\54.41127\\-183.7528\\43\\58.31752\\-184.6961\\43\\60.27065\\-185.1048\\43\\62.22377\\-186.4633\\43\\64.1769\\-187.7021\\43\\68.30907\\-191.849\\43\\70.74702\\-195.7553\\43\\71.19564\\-197.7084\\43\\72.83647\\-199.6615\\43\\73.94253\\-200.6675\\43\\75.27924\\-201.6146\\43\\76.82227\\-203.5678\\43\\75.89565\\-204.3594\\43\\73.94253\\-204.2539\\43\\71.9894\\-204.6426\\43\\71.25441\\-205.5209\\43\\70.70129\\-207.474\\43\\68.72341\\-211.3803\\43\\66.87964\\-213.3334\\43\\66.13003\\-213.9746\\43\\64.1769\\-214.7016\\43\\62.22377\\-215.178\\43\\60.27065\\-215.5135\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "496" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "66.13003\\-145.6189\\43\\64.5525\\-144.974\\43\\60.44298\\-143.0209\\43\\58.31752\\-141.8883\\43\\56.52899\\-141.0678\\43\\54.41127\\-139.6833\\43\\52.45815\\-139.6751\\43\\51.58105\\-139.1146\\43\\50.77876\\-137.1615\\43\\50.79663\\-135.2084\\43\\51.3351\\-133.2553\\43\\52.03278\\-129.349\\43\\52.27115\\-127.3959\\43\\52.25871\\-125.4428\\43\\51.9408\\-123.4896\\43\\51.04129\\-121.5365\\43\\49.24214\\-119.5834\\43\\45.38562\\-115.6771\\43\\44.1488\\-113.724\\43\\43.67801\\-111.7709\\43\\43.88451\\-109.8178\\43\\44.40993\\-107.8646\\43\\45.87786\\-105.9115\\43\\48.5519\\-103.2505\\43\\50.50502\\-102.4761\\43\\52.45815\\-100.8989\\43\\54.41127\\-100.8561\\43\\55.60885\\-102.0053\\43\\57.15471\\-105.9115\\43\\57.498\\-107.8646\\43\\56.82291\\-109.8178\\43\\57.25367\\-111.7709\\43\\60.66503\\-115.6771\\43\\62.22377\\-117.8372\\43\\63.14366\\-119.5834\\43\\64.91827\\-121.5365\\43\\66.13003\\-123.5007\\43\\67.00642\\-125.4428\\43\\67.72633\\-127.3959\\43\\68.99652\\-129.349\\43\\70.87568\\-131.3021\\43\\72.04158\\-133.2553\\43\\72.53561\\-135.2084\\43\\72.58174\\-137.1615\\43\\72.28237\\-139.1146\\43\\72.1764\\-141.0678\\43\\72.5667\\-143.0209\\43\\71.9894\\-145.1525\\43\\70.03628\\-146.5578\\43\\68.08315\\-145.6438\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002280" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "26" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "497" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "97.38003\\-184.7331\\43\\96.71868\\-184.0365\\43\\95.4269\\-181.6607\\43\\94.72458\\-180.1303\\43\\94.38332\\-178.1771\\43\\93.17884\\-176.224\\43\\92.71176\\-174.2709\\43\\91.39858\\-172.3178\\43\\91.97321\\-170.3646\\43\\92.85948\\-168.4115\\43\\95.34613\\-164.5053\\43\\97.38003\\-163.111\\43\\99.33315\\-163.1719\\43\\100.4515\\-164.5053\\43\\101.5116\\-166.4584\\43\\103.8579\\-170.3646\\43\\104.6788\\-172.3178\\43\\105.25\\-174.2709\\43\\106.3926\\-176.224\\43\\106.6155\\-178.1771\\43\\106.6125\\-182.0834\\43\\105.6127\\-184.0365\\43\\105.1925\\-184.5058\\43\\103.2394\\-185.4677\\43\\101.2863\\-185.8026\\43\\99.33315\\-185.559\\43" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "498" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-107.6981\\-193.6405\\45\\-109.2259\\-191.849\\45\\-109.4395\\-189.8959\\45\\-110.4094\\-187.9428\\45\\-110.9665\\-185.9896\\45\\-111.0106\\-184.0365\\45\\-110.9665\\-180.1303\\45\\-110.7768\\-178.1771\\45\\-107.9631\\-172.3178\\45\\-105.745\\-169.9131\\45\\-104.0229\\-166.4584\\45\\-99.8856\\-162.2889\\45\\-98.686\\-160.599\\45\\-97.93247\\-159.8215\\45\\-95.97935\\-158.8816\\45\\-94.02622\\-159.9799\\45\\-93.48493\\-160.599\\45\\-92.18545\\-162.5521\\45\\-91.47792\\-164.5053\\45\\-91.4838\\-166.4584\\45\\-92.63226\\-168.4115\\45\\-93.36121\\-170.3646\\45\\-93.40793\\-172.3178\\45\\-94.5423\\-174.2709\\45\\-95.32631\\-176.224\\45\\-96.41067\\-178.1771\\45\\-97.93247\\-181.5052\\45\\-99.27966\\-184.0365\\45\\-99.28329\\-185.9896\\45\\-99.53455\\-187.9428\\45\\-101.243\\-189.8959\\45\\-101.3129\\-191.849\\45\\-101.8387\\-193.3812\\45\\-102.5363\\-193.8021\\45\\-103.7918\\-194.0951\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "72" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "499" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-15.90123\\-211.7371\\45\\-17.85435\\-211.0866\\45\\-19.80748\\-210.2498\\45\\-21.7606\\-209.9212\\45\\-23.71373\\-208.4107\\45\\-25.66685\\-208.0061\\45\\-27.31254\\-207.474\\45\\-27.61998\\-207.2062\\45\\-29.5731\\-207.4137\\45\\-31.52623\\-208.0051\\45\\-33.47935\\-208.0134\\45\\-37.3856\\-208.2076\\45\\-41.29185\\-207.1485\\45\\-43.24498\\-206.9199\\45\\-45.1981\\-206.8247\\45\\-47.15123\\-206.3143\\45\\-48.10772\\-205.5209\\45\\-50.11579\\-203.5678\\45\\-51.54576\\-201.6146\\45\\-52.08683\\-199.6615\\45\\-53.0106\\-198.6443\\45\\-54.96373\\-198.1109\\45\\-56.91685\\-199.3631\\45\\-58.16658\\-197.7084\\45\\-57.86994\\-195.7553\\45\\-56.91685\\-194.66\\45\\-53.0106\\-192.8196\\45\\-52.14077\\-191.849\\45\\-51.66306\\-189.8959\\45\\-51.05748\\-188.1475\\45\\-50.01292\\-185.9896\\45\\-49.10435\\-184.9418\\45\\-47.15123\\-183.0195\\45\\-45.1981\\-181.5262\\45\\-33.47935\\-181.5262\\45\\-31.52623\\-182.8972\\45\\-29.5731\\-183.5192\\45\\-27.61998\\-183.7641\\45\\-25.66685\\-185.2712\\45\\-23.71373\\-186.6534\\45\\-21.7606\\-187.5268\\45\\-19.80748\\-187.3654\\45\\-15.90123\\-186.2756\\45\\-13.9481\\-186.2534\\45\\-11.99498\\-186.8806\\45\\-10.04185\\-187.3654\\45\\-6.135601\\-187.8207\\45\\-4.182476\\-188.9436\\45\\-2.229351\\-189.7738\\45\\-0.276226\\-191.0724\\45\\0.6721664\\-191.849\\45\\1.676899\\-192.9153\\45\\2.200478\\-193.8021\\45\\2.241\\-195.7553\\45\\3.669086\\-197.7084\\45\\5.583149\\-199.1158\\45\\9.489399\\-199.9518\\45\\11.44252\\-200.6623\\45\\13.00702\\-201.6146\\45\\11.44252\\-202.6576\\45\\9.489399\\-202.6633\\45\\7.536274\\-201.9816\\45\\5.583149\\-202.04\\45\\3.630024\\-202.745\\45\\2.517828\\-203.5678\\45\\2.193171\\-205.5209\\45\\-0.276226\\-207.773\\45\\-2.229351\\-208.6875\\45\\-4.182476\\-210.145\\45\\-7.093383\\-211.3803\\45\\-8.088726\\-211.7164\\45\\-10.04185\\-211.777\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "500" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-4.182476\\-116.1025\\45\\-5.049175\\-115.6771\\45\\-6.135601\\-114.8494\\45\\-6.810824\\-113.724\\45\\-6.791893\\-109.8178\\45\\-8.088726\\-107.8725\\45\\-10.04185\\-108.1004\\45\\-10.38365\\-107.8646\\45\\-11.4759\\-105.9115\\45\\-10.04185\\-104.8911\\45\\-8.088726\\-105.1368\\45\\-6.82617\\-103.9584\\45\\-4.95974\\-102.0053\\45\\-4.182476\\-101.3775\\45\\-2.229351\\-101.5706\\45\\-1.794662\\-102.0053\\45\\-1.444714\\-105.9115\\45\\-0.5883233\\-107.8646\\45\\-1.179212\\-109.8178\\45\\-1.629614\\-111.7709\\45\\-1.65969\\-113.724\\45\\-2.229351\\-114.6235\\45\\-3.467673\\-115.6771\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "204" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "501" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "21.20815\\-156.9285\\45\\19.07551\\-154.7396\\45\\18.4107\\-152.7865\\45\\17.3019\\-151.6891\\45\\16.0049\\-150.8334\\45\\15.34877\\-150.2159\\45\\13.39565\\-149.807\\45\\11.44252\\-149.5044\\45\\10.62066\\-148.8803\\45\\9.489399\\-147.749\\45\\8.286387\\-146.9271\\45\\7.536274\\-146.2277\\45\\5.583149\\-145.5889\\45\\4.344226\\-144.974\\45\\3.630024\\-144.3\\45\\1.676899\\-143.8003\\45\\-2.229351\\-143.5372\\45\\-3.676756\\-143.0209\\45\\-4.182476\\-142.5152\\45\\-6.135601\\-142.3358\\45\\-6.985572\\-143.0209\\45\\-8.088726\\-143.4261\\45\\-11.99498\\-143.7013\\45\\-13.9481\\-145.1392\\45\\-15.90123\\-146.0132\\45\\-16.81519\\-146.9271\\45\\-19.80748\\-149.0157\\45\\-21.7606\\-149.5897\\45\\-23.71373\\-149.6912\\45\\-25.66685\\-149.4817\\45\\-26.41743\\-148.8803\\45\\-28.92963\\-144.974\\45\\-30.9579\\-143.0209\\45\\-31.52623\\-142.5764\\45\\-33.47935\\-141.825\\45\\-35.43248\\-141.5648\\45\\-37.3856\\-140.223\\45\\-39.33873\\-139.5667\\45\\-41.29185\\-138.4059\\45\\-43.24498\\-137.9418\\45\\-47.15123\\-139.6718\\45\\-49.10435\\-139.9965\\45\\-51.05748\\-141.4721\\45\\-53.0106\\-141.6781\\45\\-54.96373\\-141.6781\\45\\-56.91685\\-141.5291\\45\\-57.38978\\-141.0678\\45\\-58.18987\\-139.1146\\45\\-58.40523\\-137.1615\\45\\-58.86998\\-136.3579\\45\\-60.8231\\-134.8791\\45\\-61.07596\\-135.2084\\45\\-64.99965\\-139.1146\\45\\-67.09955\\-141.0678\\45\\-68.6356\\-141.848\\45\\-70.58872\\-142.7021\\45\\-72.54185\\-143.8096\\45\\-74.49497\\-144.6208\\45\\-75.0741\\-144.974\\45\\-76.4481\\-146.144\\45\\-78.40122\\-144.9226\\45\\-79.71039\\-143.0209\\45\\-80.35435\\-142.3906\\45\\-82.30747\\-141.6781\\45\\-82.96478\\-141.0678\\45\\-83.43052\\-139.1146\\45\\-82.30747\\-137.1692\\45\\-80.93367\\-135.2084\\45\\-79.14829\\-133.2553\\45\\-78.1655\\-131.3021\\45\\-79.3591\\-129.349\\45\\-78.62853\\-127.3959\\45\\-78.40122\\-127.2076\\45\\-76.4481\\-127.0682\\45\\-73.23506\\-123.4896\\45\\-71.94047\\-121.5365\\45\\-71.11068\\-119.5834\\45\\-70.40173\\-117.6303\\45\\-69.26653\\-115.6771\\45\\-67.33904\\-113.724\\45\\-66.27608\\-111.7709\\45\\-66.00639\\-109.8178\\45\\-66.23859\\-105.9115\\45\\-65.75264\\-103.9584\\45\\-65.77203\\-102.0053\\45\\-65.2294\\-100.0521\\45\\-64.72935\\-99.55508\\45\\-62.77623\\-98.5429\\45\\-60.8231\\-97.17764\\45\\-58.86998\\-95.21644\\45\\-57.31399\\-94.19276\\45\\-56.91685\\-93.80843\\45\\-54.96373\\-93.09525\\45\\-53.67736\\-92.23963\\45\\-51.05748\\-89.77094\\45\\-49.10435\\-89.01598\\45\\-47.15123\\-90.06866\\45\\-46.95179\\-90.28651\\45\\-46.45971\\-92.23963\\45\\-45.07603\\-94.19276\\45\\-44.13579\\-96.14588\\45\\-42.34317\\-98.09901\\45\\-40.74253\\-100.0521\\45\\-40.36744\\-102.0053\\45\\-40.93503\\-103.9584\\45\\-40.93503\\-105.9115\\45\\-42.21386\\-107.8646\\45\\-43.24498\\-108.9315\\45\\-45.1981\\-110.2974\\45\\-47.15123\\-111.1605\\45\\-47.89968\\-111.7709\\45\\-51.05748\\-113.8325\\45\\-54.96373\\-115.3581\\45\\-56.91685\\-116.8557\\45\\-57.6764\\-117.6303\\45\\-58.51316\\-119.5834\\45\\-59.6921\\-121.5365\\45\\-61.35936\\-123.4896\\45\\-61.94991\\-125.4428\\45\\-61.72136\\-127.3959\\45\\-60.46628\\-129.349\\45\\-59.92792\\-133.2553\\45\\-58.86998\\-134.4258\\45\\-56.91685\\-132.2201\\45\\-56.2034\\-131.3021\\45\\-55.37523\\-129.349\\45\\-54.96373\\-128.9323\\45\\-52.65938\\-127.3959\\45\\-51.05748\\-126.4873\\45\\-49.10435\\-125.6666\\45\\-47.15123\\-124.6281\\45\\-45.1981\\-124.0438\\45\\-43.24498\\-123.9949\\45\\-41.29185\\-122.7247\\45\\-39.33873\\-122.1062\\45\\-37.3856\\-122.1062\\45\\-35.43248\\-120.9516\\45\\-33.47935\\-120.4665\\45\\-29.5731\\-120.266\\45\\-27.61998\\-120.2976\\45\\-25.66685\\-121.2305\\45\\-25.36289\\-121.5365\\45\\-24.57761\\-123.4896\\45\\-21.7606\\-126.0399\\45\\-20.01571\\-127.3959\\45\\-18.88915\\-129.349\\45\\-20.07985\\-131.3021\\45\\-19.71202\\-133.2553\\45\\-18.29298\\-135.2084\\45\\-17.85435\\-135.5445\\45\\-15.90123\\-136.0501\\45\\-11.99498\\-136.502\\45\\-8.088726\\-136.7085\\45\\-2.229351\\-136.7058\\45\\1.676899\\-136.5668\\45\\3.630024\\-136.6968\\45\\5.583149\\-136.6335\\45\\7.536274\\-136.1171\\45\\9.489399\\-135.8369\\45\\10.43471\\-135.2084\\45\\11.52329\\-133.2553\\45\\11.55103\\-131.3021\\45\\15.34877\\-126.8614\\45\\16.43666\\-125.4428\\45\\19.25502\\-122.6506\\45\\21.20815\\-122.1062\\45\\27.06752\\-122.1062\\45\\29.02065\\-122.5087\\45\\30.97377\\-123.1857\\45\\32.9269\\-123.9692\\45\\34.88002\\-123.9865\\45\\36.83315\\-124.3893\\45\\38.78627\\-124.9808\\45\\40.7394\\-125.7246\\45\\42.69252\\-126.8166\\45\\44.64565\\-128.0951\\45\\46.59877\\-128.8546\\45\\47.11578\\-129.349\\45\\48.28136\\-131.3021\\45\\48.49972\\-133.2553\\45\\48.16496\\-135.2084\\45\\48.00258\\-139.1146\\45\\47.0111\\-141.0678\\45\\46.59877\\-141.4269\\45\\44.64565\\-141.6745\\45\\42.69252\\-141.6266\\45\\40.7394\\-140.3492\\45\\38.78627\\-139.6833\\45\\34.88002\\-140.0315\\45\\32.9269\\-140.358\\45\\30.97377\\-141.8556\\45\\29.02065\\-142.5677\\45\\28.5873\\-143.0209\\45\\28.61241\\-144.974\\45\\29.81039\\-146.9271\\45\\29.02065\\-148.493\\45\\27.06752\\-147.6544\\45\\26.09096\\-148.8803\\45\\25.1144\\-149.8248\\45\\24.72746\\-150.8334\\45\\24.4935\\-152.7865\\45\\24.04409\\-154.7396\\45\\23.99256\\-156.6928\\45\\23.16127\\-157.427\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "502" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-215.9207\\45\\50.50502\\-215.0047\\45\\48.5519\\-214.8372\\45\\46.59877\\-214.1221\\45\\43.3231\\-211.3803\\45\\41.68402\\-209.4271\\45\\40.46703\\-207.474\\45\\39.0681\\-203.5678\\45\\38.78627\\-201.5375\\45\\36.83315\\-201.0018\\45\\36.21601\\-201.6146\\45\\35.55959\\-203.5678\\45\\34.88002\\-204.258\\45\\32.9269\\-203.8568\\45\\32.67941\\-203.5678\\45\\33.91328\\-201.6146\\45\\34.88002\\-199.8657\\45\\36.83315\\-198.0005\\45\\38.98571\\-195.7553\\45\\39.61297\\-193.8021\\45\\40.01437\\-191.849\\45\\40.7394\\-190.0319\\45\\41.91025\\-187.9428\\45\\42.69252\\-187.1804\\45\\48.5519\\-183.9843\\45\\50.50502\\-183.6571\\45\\52.45815\\-183.101\\45\\54.41127\\-183.1062\\45\\56.3644\\-183.56\\45\\58.31752\\-183.7217\\45\\60.27065\\-184.6893\\45\\62.22377\\-185.1974\\45\\64.1769\\-186.8732\\45\\68.08315\\-190.7646\\45\\69.07529\\-191.849\\45\\70.60012\\-193.8021\\45\\71.41974\\-195.7553\\45\\71.90863\\-197.7084\\45\\73.03907\\-199.6615\\45\\73.94253\\-200.5797\\45\\75.79136\\-201.6146\\45\\77.7138\\-203.5678\\45\\75.89565\\-204.5486\\45\\73.94253\\-204.4386\\45\\72.70015\\-205.5209\\45\\71.82781\\-207.474\\45\\71.23319\\-209.4271\\45\\70.03628\\-211.2649\\45\\68.08315\\-213.6367\\45\\66.13003\\-214.6722\\45\\64.1769\\-215.1918\\45\\62.22377\\-216.0287\\45\\60.27065\\-216.3782\\45\\54.41127\\-216.3782\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "503" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "64.1769\\-143.5634\\45\\62.22377\\-142.3225\\45\\60.27065\\-141.6537\\45\\59.28469\\-141.0678\\45\\56.3644\\-139.03\\45\\54.41127\\-137.9231\\45\\52.45815\\-137.3732\\45\\52.24645\\-137.1615\\45\\51.73831\\-135.2084\\45\\52.19906\\-131.3021\\45\\52.27115\\-127.3959\\45\\52.22243\\-125.4428\\45\\51.49609\\-123.4896\\45\\50.50502\\-121.546\\45\\49.26167\\-119.5834\\45\\45.38562\\-115.6771\\45\\44.22028\\-113.724\\45\\43.46481\\-111.7709\\45\\43.69739\\-109.8178\\45\\44.19267\\-107.8646\\45\\45.83041\\-105.9115\\45\\47.64286\\-103.9584\\45\\49.8559\\-102.0053\\45\\51.43245\\-100.0521\\45\\52.45815\\-99.13592\\45\\54.41127\\-99.95739\\45\\56.0475\\-102.0053\\45\\56.82637\\-103.9584\\45\\57.35518\\-105.9115\\45\\57.59136\\-107.8646\\45\\57.45612\\-109.8178\\45\\58.23676\\-111.7709\\45\\59.45841\\-113.724\\45\\60.99567\\-115.6771\\45\\62.78886\\-117.6303\\45\\63.48785\\-119.5834\\45\\65.13301\\-121.5365\\45\\67.3111\\-123.4896\\45\\67.3814\\-125.4428\\45\\68.08315\\-126.7986\\45\\69.92776\\-129.349\\45\\71.45118\\-131.3021\\45\\72.01211\\-133.2553\\45\\71.7656\\-135.2084\\45\\71.73031\\-141.0678\\45\\71.59226\\-143.0209\\45\\70.03628\\-144.6645\\45\\68.08315\\-143.8329\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002279" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "29" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "504" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "103.2394\\-186.801\\45\\101.2863\\-185.6641\\45\\99.33315\\-184.7233\\45\\98.68011\\-184.0365\\45\\97.38003\\-181.6087\\45\\96.73096\\-180.1303\\45\\96.69461\\-178.1771\\45\\95.81587\\-176.224\\45\\94.78951\\-174.2709\\45\\94.66057\\-172.3178\\45\\93.94154\\-170.3646\\45\\93.73463\\-168.4115\\45\\94.4656\\-166.4584\\45\\96.58867\\-162.5521\\45\\97.38003\\-161.6638\\45\\99.33315\\-161.1647\\45\\100.6795\\-162.5521\\45\\101.2863\\-163.5195\\45\\103.2394\\-166.2719\\45\\104.6872\\-168.4115\\45\\105.3773\\-170.3646\\45\\106.6488\\-172.3178\\45\\106.7991\\-174.2709\\45\\107.783\\-176.224\\45\\108.3724\\-178.1771\\45\\108.5686\\-180.1303\\45\\108.1032\\-184.0365\\45\\106.852\\-185.9896\\45\\105.1925\\-187.1037\\45" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "505" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-107.6981\\-193.4594\\47\\-109.2771\\-191.849\\47\\-110.3932\\-189.8959\\47\\-111.8693\\-187.9428\\47\\-112.7316\\-185.9896\\47\\-112.9007\\-184.0365\\47\\-112.8809\\-180.1303\\47\\-112.2886\\-178.1771\\47\\-109.402\\-172.3178\\47\\-108.1002\\-170.3646\\47\\-106.6366\\-168.4115\\47\\-104.1508\\-164.5053\\47\\-97.93247\\-158.3658\\47\\-95.97935\\-157.8775\\47\\-95.13842\\-158.6459\\47\\-94.00352\\-160.599\\47\\-93.88979\\-162.5521\\47\\-93.42306\\-164.5053\\47\\-93.40008\\-166.4584\\47\\-94.53714\\-168.4115\\47\\-95.18623\\-170.3646\\47\\-95.32639\\-172.3178\\47\\-96.53851\\-174.2709\\47\\-97.30341\\-176.224\\47\\-97.93247\\-177.4594\\47\\-98.60181\\-178.1771\\47\\-99.2599\\-180.1303\\47\\-101.2749\\-184.0365\\47\\-101.2865\\-185.9896\\47\\-101.8387\\-187.3539\\47\\-103.2745\\-189.8959\\47\\-103.7384\\-191.849\\47\\-105.745\\-193.123\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "506" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-76.4481\\-143.8496\\47\\-78.40122\\-142.6997\\47\\-80.35435\\-140.7509\\47\\-82.30747\\-140.0478\\47\\-83.33669\\-139.1146\\47\\-83.18783\\-137.1615\\47\\-81.35689\\-135.2084\\47\\-79.37778\\-133.2553\\47\\-78.46781\\-131.3021\\47\\-79.30908\\-129.349\\47\\-78.40122\\-128.103\\47\\-76.4481\\-127.3283\\47\\-75.15118\\-125.4428\\47\\-73.39697\\-123.4896\\47\\-72.54185\\-121.5926\\47\\-71.25157\\-119.5834\\47\\-70.58872\\-117.964\\47\\-69.26653\\-115.6771\\47\\-67.30135\\-113.724\\47\\-66.28574\\-111.7709\\47\\-66.2571\\-107.8646\\47\\-66.04043\\-105.9115\\47\\-65.32206\\-103.9584\\47\\-64.99021\\-102.0053\\47\\-64.55496\\-100.0521\\47\\-62.77623\\-98.87749\\47\\-60.8231\\-97.33577\\47\\-58.86998\\-95.40253\\47\\-56.91685\\-94.81421\\47\\-53.59175\\-92.23963\\47\\-51.05748\\-90.05299\\47\\-49.10435\\-89.25027\\47\\-47.43896\\-90.28651\\47\\-46.71654\\-92.23963\\47\\-46.20884\\-94.19276\\47\\-43.24498\\-98.18665\\47\\-42.29395\\-100.0521\\47\\-41.53416\\-102.0053\\47\\-42.42813\\-103.9584\\47\\-42.55833\\-105.9115\\47\\-43.42324\\-107.8646\\47\\-45.44624\\-109.8178\\47\\-49.10435\\-112.2846\\47\\-51.05748\\-112.9269\\47\\-53.0106\\-114.3164\\47\\-54.96373\\-114.9396\\47\\-57.70455\\-117.6303\\47\\-58.59944\\-119.5834\\47\\-59.69734\\-121.5365\\47\\-61.44702\\-123.4896\\47\\-62.08011\\-125.4428\\47\\-61.88967\\-127.3959\\47\\-60.53013\\-129.349\\47\\-60.43616\\-131.3021\\47\\-61.40904\\-133.2553\\47\\-62.77623\\-135.1693\\47\\-65.05196\\-137.1615\\47\\-67.05083\\-139.1146\\47\\-68.6356\\-140.2509\\47\\-70.58872\\-141.5255\\47\\-72.54185\\-142.1964\\47\\-74.49497\\-143.395\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "60" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "507" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-25.66685\\-145.6612\\47\\-26.66442\\-144.974\\47\\-29.5731\\-142.1391\\47\\-31.52623\\-141.5199\\47\\-33.47935\\-140.3341\\47\\-35.43248\\-139.856\\47\\-37.3856\\-138.687\\47\\-39.33873\\-137.9929\\47\\-41.29185\\-137.6411\\47\\-43.24498\\-136.5313\\47\\-45.1981\\-136.9453\\47\\-47.15123\\-137.6873\\47\\-49.10435\\-137.7813\\47\\-51.05748\\-139.4833\\47\\-53.0106\\-139.7098\\47\\-54.96373\\-139.7017\\47\\-56.91685\\-139.1685\\47\\-57.85025\\-137.1615\\47\\-58.34553\\-135.2084\\47\\-56.91685\\-132.4669\\47\\-56.20071\\-131.3021\\47\\-54.4022\\-129.349\\47\\-53.0106\\-128.4512\\47\\-51.05748\\-126.6999\\47\\-49.10435\\-125.1498\\47\\-47.15123\\-124.3034\\47\\-45.1981\\-123.6766\\47\\-43.24498\\-123.9516\\47\\-41.29185\\-122.7247\\47\\-39.33873\\-122.1062\\47\\-37.3856\\-122.1062\\47\\-35.43248\\-121.9726\\47\\-33.47935\\-121.266\\47\\-29.5731\\-120.3599\\47\\-27.61998\\-120.266\\47\\-25.66685\\-120.8768\\47\\-25.0141\\-121.5365\\47\\-24.15652\\-123.4896\\47\\-22.59674\\-125.4428\\47\\-21.7606\\-126.1161\\47\\-19.80748\\-126.8154\\47\\-19.21038\\-127.3959\\47\\-18.71789\\-129.349\\47\\-20.5833\\-131.3021\\47\\-21.27232\\-133.2553\\47\\-20.57225\\-135.2084\\47\\-19.80748\\-135.9216\\47\\-17.85435\\-136.5551\\47\\-15.90123\\-136.8024\\47\\-14.92466\\-137.1615\\47\\-13.9481\\-137.8752\\47\\-11.99498\\-138.3641\\47\\-10.04185\\-139.0508\\47\\-10.04185\\-139.1711\\47\\-11.99498\\-140.1585\\47\\-12.90419\\-141.0678\\47\\-13.9481\\-141.6354\\47\\-17.85435\\-141.6941\\47\\-21.7606\\-145.4753\\47\\-23.71373\\-145.7345\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "73" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "508" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-209.8483\\47\\-19.80748\\-208.3471\\47\\-21.7606\\-208.028\\47\\-23.71373\\-206.3036\\47\\-25.2791\\-205.5209\\47\\-25.66685\\-205.1273\\47\\-27.61998\\-204.0977\\47\\-29.5731\\-204.635\\47\\-31.52623\\-206.083\\47\\-33.47935\\-206.1557\\47\\-37.3856\\-206.8891\\47\\-41.29185\\-206.8213\\47\\-45.1981\\-206.1414\\47\\-46.02387\\-205.5209\\47\\-48.10716\\-203.5678\\47\\-49.80493\\-201.6146\\47\\-50.89785\\-199.6615\\47\\-53.0106\\-198.2965\\47\\-54.96373\\-198.9807\\47\\-55.6643\\-199.6615\\47\\-56.94449\\-201.6146\\47\\-57.78545\\-199.6615\\47\\-57.11629\\-195.7553\\47\\-54.96373\\-194.0666\\47\\-53.0106\\-193.4029\\47\\-51.05748\\-191.9711\\47\\-49.89523\\-189.8959\\47\\-49.41447\\-187.9428\\47\\-47.98944\\-185.9896\\47\\-45.96725\\-184.0365\\47\\-45.1981\\-183.5161\\47\\-33.47935\\-183.5075\\47\\-31.52623\\-184.8562\\47\\-29.5731\\-185.5102\\47\\-27.73353\\-185.9896\\47\\-25.66685\\-187.4757\\47\\-24.79249\\-187.9428\\47\\-23.71373\\-188.8705\\47\\-21.7606\\-189.4721\\47\\-19.80748\\-188.8771\\47\\-17.85435\\-187.719\\47\\-15.90123\\-187.5509\\47\\-13.9481\\-187.5509\\47\\-11.99498\\-187.8762\\47\\-10.04185\\-189.1245\\47\\-8.088726\\-189.4721\\47\\-6.135601\\-189.5321\\47\\-5.456771\\-189.8959\\47\\-4.182476\\-190.8817\\47\\-2.473492\\-191.849\\47\\-2.229351\\-192.1106\\47\\-1.566927\\-193.8021\\47\\-0.1243163\\-195.7553\\47\\0.7170299\\-197.7084\\47\\1.676899\\-198.4059\\47\\3.630024\\-199.1761\\47\\7.536274\\-200.1392\\47\\9.489399\\-200.8574\\47\\10.43933\\-201.6146\\47\\9.489399\\-203.1074\\47\\7.536274\\-202.3037\\47\\5.583149\\-202.0306\\47\\3.630024\\-201.9917\\47\\1.676899\\-202.175\\47\\-0.276226\\-202.5912\\47\\-1.496929\\-203.5678\\47\\-1.790516\\-205.5209\\47\\-2.229351\\-206.3366\\47\\-3.257858\\-207.474\\47\\-6.135601\\-209.0681\\47\\-6.556533\\-209.4271\\47\\-8.088726\\-209.9468\\47\\-15.90123\\-209.9468\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "65" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "509" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "23.16127\\-152.901\\47\\20.96401\\-150.8334\\47\\19.05063\\-148.8803\\47\\18.21407\\-146.9271\\47\\17.3019\\-146.0048\\47\\15.34877\\-145.4073\\47\\13.39565\\-145.6051\\47\\11.44252\\-145.1953\\47\\9.489399\\-143.4354\\47\\7.536274\\-141.8474\\47\\5.583149\\-141.4921\\47\\5.17024\\-141.0678\\47\\5.078031\\-139.1146\\47\\7.536274\\-136.797\\47\\9.489399\\-136.3545\\47\\11.44252\\-135.6573\\47\\11.96275\\-135.2084\\47\\12.22988\\-133.2553\\47\\11.67825\\-131.3021\\47\\12.83855\\-129.349\\47\\15.34877\\-126.7548\\47\\16.47439\\-125.4428\\47\\19.25502\\-122.6758\\47\\21.20815\\-122.2751\\47\\23.16127\\-122.3167\\47\\27.06752\\-122.1062\\47\\29.02065\\-122.3807\\47\\30.97377\\-122.8156\\47\\32.9269\\-123.7254\\47\\38.78627\\-124.4569\\47\\40.7394\\-125.0558\\47\\42.69252\\-127.4543\\47\\44.64565\\-129.11\\47\\46.59877\\-129.7508\\47\\48.5519\\-130.6532\\47\\49.1728\\-131.3021\\47\\49.66733\\-133.2553\\47\\49.50647\\-135.2084\\47\\48.96784\\-137.1615\\47\\47.3033\\-139.1146\\47\\46.59877\\-139.6948\\47\\42.69252\\-139.6819\\47\\41.23519\\-139.1146\\47\\40.7394\\-138.6791\\47\\38.78627\\-137.8648\\47\\36.83315\\-138.3654\\47\\34.88002\\-139.289\\47\\32.9269\\-139.9603\\47\\31.43636\\-141.0678\\47\\30.97377\\-141.7749\\47\\29.02065\\-142.5728\\47\\28.74665\\-143.0209\\47\\29.02065\\-143.3073\\47\\30.97377\\-143.8179\\47\\31.8826\\-144.974\\47\\31.82555\\-146.9271\\47\\30.77292\\-148.8803\\47\\29.02065\\-150.608\\47\\26.429\\-148.8803\\47\\25.89806\\-146.9271\\47\\25.1144\\-146.1133\\47\\24.42444\\-146.9271\\47\\24.19062\\-148.8803\\47\\24.10265\\-150.8334\\47\\23.30924\\-152.7865\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "510" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-216.2108\\47\\50.50502\\-215.0047\\47\\48.5519\\-214.4702\\47\\46.59877\\-213.2095\\47\\44.64565\\-212.1013\\47\\43.93287\\-211.3803\\47\\42.3334\\-209.4271\\47\\41.62048\\-207.474\\47\\40.16655\\-205.5209\\47\\39.59429\\-201.6146\\47\\38.78627\\-200.7634\\47\\36.83315\\-201.7928\\47\\34.88002\\-204.0038\\47\\34.26643\\-203.5678\\47\\34.40636\\-201.6146\\47\\35.65787\\-199.6615\\47\\39.5113\\-195.7553\\47\\40.0397\\-193.8021\\47\\40.46886\\-191.849\\47\\41.5119\\-189.8959\\47\\42.69252\\-188.394\\47\\44.64565\\-186.7758\\47\\46.59877\\-185.0266\\47\\48.5519\\-183.9843\\47\\50.50502\\-183.1549\\47\\52.45815\\-182.6937\\47\\54.41127\\-182.6937\\47\\58.31752\\-183.168\\47\\60.27065\\-184.0741\\47\\62.22377\\-184.6754\\47\\64.1769\\-185.6078\\47\\68.42428\\-189.8959\\47\\69.62734\\-191.849\\47\\71.05507\\-193.8021\\47\\72.76297\\-197.7084\\47\\73.46886\\-199.6615\\47\\73.94253\\-200.2347\\47\\75.90582\\-201.6146\\47\\77.84878\\-202.7451\\47\\78.57467\\-203.5678\\47\\77.84878\\-204.3219\\47\\75.89565\\-204.461\\47\\73.94253\\-204.8491\\47\\73.40123\\-205.5209\\47\\73.08862\\-207.474\\47\\72.60586\\-209.4271\\47\\70.9954\\-211.3803\\47\\69.51961\\-213.3334\\47\\68.08315\\-214.6689\\47\\66.13003\\-215.1644\\47\\64.1769\\-216.0303\\47\\62.22377\\-216.6903\\47\\60.27065\\-216.9467\\47\\54.41127\\-216.9578\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "511" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "70.03628\\-143.473\\47\\68.08315\\-142.2359\\47\\66.13003\\-141.7169\\47\\64.1769\\-141.7014\\47\\62.61153\\-141.0678\\47\\58.62204\\-139.1146\\47\\55.16314\\-137.1615\\47\\54.41127\\-136.5632\\47\\53.12011\\-135.2084\\47\\52.40729\\-133.2553\\47\\52.24551\\-131.3021\\47\\52.27115\\-127.3959\\47\\52.21066\\-125.4428\\47\\51.42149\\-123.4896\\47\\50.50502\\-121.7202\\47\\49.26167\\-119.5834\\47\\47.33366\\-117.6303\\47\\45.52406\\-115.6771\\47\\43.41724\\-111.7709\\47\\42.95518\\-109.8178\\47\\43.70257\\-107.8646\\47\\45.556\\-105.9115\\47\\46.89243\\-103.9584\\47\\49.26977\\-102.0053\\47\\49.97402\\-100.0521\\47\\50.50502\\-99.13857\\47\\52.45815\\-98.405\\47\\54.41127\\-99.36954\\47\\55.14236\\-100.0521\\47\\56.1406\\-102.0053\\47\\56.60012\\-103.9584\\47\\57.27555\\-107.8646\\47\\58.02456\\-109.8178\\47\\59.93456\\-113.724\\47\\61.01999\\-115.6771\\47\\62.99649\\-117.6303\\47\\64.3886\\-119.5834\\47\\65.405\\-121.5365\\47\\67.13726\\-123.4896\\47\\67.55302\\-125.4428\\47\\68.79072\\-127.3959\\47\\70.90366\\-129.349\\47\\72.56421\\-131.3021\\47\\72.79778\\-133.2553\\47\\72.01211\\-135.2084\\47\\71.69643\\-137.1615\\47\\71.69643\\-139.1146\\47\\71.55471\\-141.0678\\47\\70.62694\\-143.0209\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "512" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "103.2394\\-186.8877\\47\\102.2004\\-185.9896\\47\\100.6372\\-184.0365\\47\\98.68015\\-180.1303\\47\\98.65614\\-178.1771\\47\\97.84389\\-176.224\\47\\96.7155\\-174.2709\\47\\96.5698\\-172.3178\\47\\95.89539\\-170.3646\\47\\94.84547\\-168.4115\\47\\95.29047\\-166.4584\\47\\95.79388\\-162.5521\\47\\96.83815\\-160.599\\47\\97.38003\\-160.0571\\47\\99.33315\\-159.2952\\47\\101.2863\\-160.4272\\47\\102.6407\\-162.5521\\47\\103.2394\\-164.0099\\47\\105.1925\\-166.1021\\47\\106.6369\\-168.4115\\47\\107.1457\\-169.9287\\47\\108.5698\\-172.3178\\47\\108.6164\\-174.2709\\47\\108.8379\\-176.224\\47\\109.7439\\-178.1771\\47\\110.1784\\-180.1303\\47\\109.7518\\-182.0834\\47\\109.0322\\-184.0365\\47\\108.8264\\-185.9896\\47\\107.1457\\-187.5836\\47\\105.1925\\-187.4808\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002278" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "513" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "105.1925\\-215.8586\\47\\104.6238\\-215.2865\\47\\103.8021\\-213.3334\\47\\105.1925\\-212.1985\\47\\107.1457\\-213.0497\\47\\107.4638\\-213.3334\\47\\108.4325\\-215.2865\\47\\107.1457\\-216.7147\\47" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "514" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-107.6981\\-192.7657\\49\\-109.6512\\-191.517\\49\\-111.7427\\-189.8959\\49\\-113.3151\\-187.9428\\49\\-114.2883\\-185.9896\\49\\-114.8534\\-184.0365\\49\\-114.8699\\-180.1303\\49\\-114.0833\\-178.1771\\49\\-113.5575\\-177.4836\\49\\-112.1609\\-174.2709\\49\\-111.6043\\-173.4984\\49\\-110.235\\-170.3646\\49\\-109.6512\\-169.6187\\49\\-109.0304\\-168.4115\\49\\-107.5059\\-166.4584\\49\\-106.1647\\-164.5053\\49\\-99.8856\\-158.2404\\49\\-97.93247\\-157.204\\49\\-95.97935\\-157.7282\\49\\-95.07976\\-158.6459\\49\\-94.74091\\-160.599\\49\\-95.0753\\-162.5521\\49\\-95.35411\\-166.4584\\49\\-95.80115\\-168.4115\\49\\-97.03729\\-170.3646\\49\\-97.34274\\-172.3178\\49\\-97.93247\\-173.3738\\49\\-98.7197\\-174.2709\\49\\-99.70734\\-176.224\\49\\-101.2202\\-178.1771\\49\\-101.2921\\-180.1303\\49\\-102.3393\\-182.0834\\49\\-103.2723\\-184.0365\\49\\-103.2941\\-185.9896\\49\\-105.0553\\-189.8959\\49\\-105.4688\\-191.849\\49\\-105.745\\-192.1855\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "515" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-78.40122\\-142.1184\\49\\-80.35435\\-140.2002\\49\\-82.30747\\-139.7907\\49\\-83.06953\\-139.1146\\49\\-83.51861\\-137.1615\\49\\-82.40513\\-135.2084\\49\\-80.35435\\-133.1459\\49\\-79.01884\\-131.3021\\49\\-79.27824\\-129.349\\49\\-78.88211\\-127.3959\\49\\-78.40122\\-126.9941\\49\\-76.4481\\-126.8121\\49\\-75.18461\\-125.4428\\49\\-73.87556\\-123.4896\\49\\-73.0387\\-121.5365\\49\\-71.2617\\-119.5834\\49\\-70.58872\\-117.9598\\49\\-69.26653\\-115.6771\\49\\-67.51719\\-113.724\\49\\-66.45868\\-111.7709\\49\\-66.06252\\-107.8646\\49\\-65.53515\\-105.9115\\49\\-64.63461\\-103.9584\\49\\-64.0873\\-100.0521\\49\\-59.31657\\-96.14588\\49\\-58.86998\\-95.69655\\49\\-56.91685\\-95.10168\\49\\-55.67448\\-94.19276\\49\\-53.0106\\-91.67579\\49\\-51.05748\\-90.84844\\49\\-49.10435\\-90.53241\\49\\-47.32011\\-92.23963\\49\\-46.06306\\-96.14588\\49\\-44.70061\\-98.09901\\49\\-43.94741\\-100.0521\\49\\-42.55888\\-102.0053\\49\\-42.97444\\-103.9584\\49\\-43.85459\\-105.9115\\49\\-44.62002\\-107.8646\\49\\-46.28237\\-109.8178\\49\\-47.15123\\-110.4635\\49\\-49.4586\\-111.7709\\49\\-53.0106\\-113.4139\\49\\-54.96373\\-114.9295\\49\\-57.59642\\-117.6303\\49\\-58.2952\\-119.5834\\49\\-59.56609\\-121.5365\\49\\-60.45928\\-123.4896\\49\\-61.67207\\-125.4428\\49\\-61.75249\\-127.3959\\49\\-60.53013\\-129.349\\49\\-60.78554\\-131.3021\\49\\-61.85934\\-133.2553\\49\\-62.77623\\-134.1983\\49\\-64.72935\\-135.7954\\49\\-66.68247\\-137.0631\\49\\-68.6356\\-138.7416\\49\\-70.58872\\-139.8842\\49\\-72.54185\\-140.7916\\49\\-74.49497\\-141.8921\\49\\-76.4481\\-142.3896\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "516" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-139.5426\\49\\-35.43248\\-138.2376\\49\\-37.3856\\-137.5869\\49\\-39.33873\\-137.3485\\49\\-41.29185\\-136.4411\\49\\-43.24498\\-135.7889\\49\\-45.1981\\-135.5722\\49\\-47.15123\\-135.722\\49\\-49.10435\\-135.7405\\49\\-51.63068\\-137.1615\\49\\-53.0106\\-137.5933\\49\\-54.96373\\-137.5933\\49\\-55.82152\\-137.1615\\49\\-56.91685\\-135.895\\49\\-57.21785\\-135.2084\\49\\-55.58171\\-133.2553\\49\\-54.17079\\-131.3021\\49\\-53.0106\\-129.5161\\49\\-51.05748\\-127.2672\\49\\-47.15123\\-124.2394\\49\\-45.1981\\-123.0457\\49\\-43.24498\\-123.9516\\49\\-41.29185\\-122.6816\\49\\-39.33873\\-121.862\\49\\-37.3856\\-122.2563\\49\\-35.43248\\-122.8481\\49\\-33.47935\\-123.2472\\49\\-31.52623\\-122.7229\\49\\-30.62337\\-121.5365\\49\\-29.5731\\-120.7015\\49\\-27.61998\\-119.9993\\49\\-25.66685\\-120.6642\\49\\-24.90942\\-121.5365\\49\\-21.99189\\-125.4428\\49\\-19.80748\\-126.6269\\49\\-18.94704\\-127.3959\\49\\-18.56223\\-129.349\\49\\-19.80748\\-130.5027\\49\\-21.7606\\-131.9874\\49\\-23.71373\\-132.4356\\49\\-25.62616\\-133.2553\\49\\-26.60585\\-135.2084\\49\\-26.03794\\-137.1615\\49\\-27.61998\\-138.2451\\49\\-28.6118\\-139.1146\\49\\-29.5731\\-139.5573\\49\\-31.52623\\-139.6736\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "73" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "517" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-17.85435\\-207.8735\\49\\-19.80748\\-206.1795\\49\\-21.07555\\-205.5209\\49\\-23.71373\\-202.9727\\49\\-24.61908\\-201.6146\\49\\-25.66685\\-200.891\\49\\-27.61998\\-201.5501\\49\\-29.5731\\-202.4986\\49\\-30.81334\\-203.5678\\49\\-31.52623\\-204.0218\\49\\-33.47935\\-204.3502\\49\\-35.43248\\-205.3678\\49\\-37.3856\\-206.0179\\49\\-41.29185\\-206.0092\\49\\-42.73926\\-205.5209\\49\\-45.1981\\-204.1915\\49\\-45.9654\\-203.5678\\49\\-47.54883\\-201.6146\\49\\-48.61103\\-199.6615\\49\\-49.10435\\-199.266\\49\\-51.05748\\-198.3201\\49\\-53.0106\\-198.7026\\49\\-54.96373\\-200.5094\\49\\-56.92615\\-201.6146\\49\\-57.61212\\-199.6615\\49\\-56.43499\\-197.7084\\49\\-55.74857\\-195.7553\\49\\-54.96373\\-194.9136\\49\\-53.0106\\-194.2235\\49\\-51.05748\\-194.3934\\49\\-49.89862\\-193.8021\\49\\-47.70438\\-189.8959\\49\\-47.15123\\-188.7495\\49\\-45.1981\\-186.4779\\49\\-44.52791\\-185.9896\\49\\-43.24498\\-185.562\\49\\-33.47935\\-185.5521\\49\\-31.52623\\-186.8469\\49\\-29.5731\\-187.5508\\49\\-28.87892\\-187.9428\\49\\-27.61998\\-188.9672\\49\\-26.06708\\-189.8959\\49\\-24.64322\\-191.849\\49\\-23.71373\\-192.7257\\49\\-21.7606\\-191.8407\\49\\-19.80748\\-190.8156\\49\\-17.85435\\-189.5959\\49\\-13.9481\\-189.5704\\49\\-12.67314\\-189.8959\\49\\-10.04185\\-191.385\\49\\-8.088726\\-191.5096\\49\\-6.949403\\-191.849\\49\\-6.135601\\-192.3517\\49\\-4.618173\\-193.8021\\49\\-4.182476\\-194.3801\\49\\-3.704584\\-195.7553\\49\\-2.075633\\-197.7084\\49\\-0.276226\\-198.7646\\49\\1.676899\\-199.2404\\49\\3.630024\\-200.0097\\49\\5.583149\\-200.3442\\49\\7.447495\\-201.6146\\49\\5.583149\\-202.3623\\49\\3.630024\\-202.5238\\49\\1.676899\\-201.9507\\49\\-0.276226\\-201.6522\\49\\-4.182476\\-202.5257\\49\\-5.643147\\-203.5678\\49\\-7.312952\\-205.5209\\49\\-8.088726\\-206.8179\\49\\-8.777122\\-207.474\\49\\-10.04185\\-207.9502\\49\\-15.90123\\-207.9502\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "58" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "518" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "29.02065\\-151.0925\\49\\27.06752\\-149.6321\\49\\26.50701\\-148.8803\\49\\25.81283\\-146.9271\\49\\25.1144\\-145.5303\\49\\23.16127\\-144.795\\49\\21.20815\\-145.5115\\49\\20.72997\\-144.974\\49\\20.54343\\-143.0209\\49\\19.25502\\-141.7325\\49\\17.3019\\-141.5285\\49\\15.34877\\-141.8236\\49\\13.39565\\-141.5998\\49\\12.72479\\-141.0678\\49\\10.79391\\-139.1146\\49\\11.89557\\-137.1615\\49\\13.39565\\-136.0675\\49\\15.23852\\-135.2084\\49\\14.0159\\-133.2553\\49\\13.39565\\-132.9153\\49\\11.87276\\-131.3021\\49\\12.3599\\-129.349\\49\\16.24631\\-125.4428\\49\\19.25502\\-122.8438\\49\\23.16127\\-122.907\\49\\25.1144\\-122.2585\\49\\27.06752\\-122.1062\\49\\29.02065\\-122.1289\\49\\30.97377\\-122.4777\\49\\32.9269\\-123.1431\\49\\34.88002\\-123.9692\\49\\36.83315\\-124.0033\\49\\38.78627\\-124.1872\\49\\40.7394\\-125.0962\\49\\41.09045\\-125.4428\\49\\42.02181\\-127.3959\\49\\43.44625\\-129.349\\49\\44.64565\\-130.2426\\49\\48.5519\\-130.3089\\49\\49.5395\\-131.3021\\49\\49.34536\\-133.2553\\49\\48.5519\\-135.6605\\49\\47.48539\\-137.1615\\49\\46.59877\\-137.6137\\49\\44.64565\\-137.4538\\49\\42.69252\\-136.0774\\49\\40.7394\\-135.8187\\49\\38.78627\\-136.3126\\49\\36.83315\\-137.5285\\49\\34.88002\\-137.8435\\49\\32.9269\\-138.5803\\49\\32.38228\\-139.1146\\49\\31.43105\\-141.0678\\49\\32.34472\\-143.0209\\49\\32.7399\\-144.974\\49\\32.52768\\-146.9271\\49\\31.76458\\-148.8803\\49\\30.97377\\-149.7675\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "519" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-216.0486\\49\\50.50502\\-214.8252\\49\\48.5519\\-214.1224\\49\\46.59877\\-212.5212\\49\\44.64565\\-210.7497\\49\\41.76899\\-207.474\\49\\41.03633\\-205.5209\\49\\40.77696\\-203.5678\\49\\40.06931\\-201.6146\\49\\38.78627\\-200.5473\\49\\36.83315\\-202.3244\\49\\35.26843\\-201.6146\\49\\35.8815\\-199.6615\\49\\36.83315\\-198.6423\\49\\39.72965\\-195.7553\\49\\40.46886\\-193.8021\\49\\40.5277\\-191.849\\49\\41.68372\\-189.8959\\49\\46.59877\\-185.0312\\49\\48.5519\\-183.9699\\49\\50.50502\\-183.1204\\49\\52.45815\\-182.5019\\49\\54.41127\\-182.2704\\49\\56.3644\\-182.3652\\49\\60.27065\\-183.9843\\49\\62.22377\\-184.0441\\49\\64.1769\\-185.0872\\49\\66.13003\\-187.0563\\49\\67.12793\\-187.9428\\49\\69.08541\\-189.8959\\49\\70.6245\\-191.849\\49\\71.62558\\-193.8021\\49\\72.75146\\-195.7553\\49\\73.37891\\-197.7084\\49\\73.71873\\-199.6615\\49\\75.89565\\-201.607\\49\\77.84878\\-202.1121\\49\\79.05422\\-203.5678\\49\\77.84878\\-204.5784\\49\\75.89565\\-204.2341\\49\\73.96542\\-205.5209\\49\\73.35217\\-209.4271\\49\\72.02847\\-211.3803\\49\\70.03628\\-213.7981\\49\\68.08315\\-214.9717\\49\\64.1769\\-216.7003\\49\\62.22377\\-216.9805\\49\\56.3644\\-217.0158\\49\\54.41127\\-216.8379\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "520" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "70.03628\\-141.6766\\49\\68.08315\\-140.7073\\49\\66.13003\\-139.8948\\49\\64.1769\\-139.7151\\49\\62.22377\\-139.6343\\49\\60.27065\\-138.3806\\49\\58.31752\\-137.6228\\49\\56.3644\\-136.4859\\49\\54.41127\\-134.9059\\49\\53.20008\\-133.2553\\49\\52.46578\\-131.3021\\49\\51.9911\\-129.349\\49\\51.88334\\-127.3959\\49\\51.87467\\-125.4428\\49\\51.58384\\-123.4896\\49\\50.79799\\-121.5365\\49\\49.26167\\-119.5834\\49\\47.33366\\-117.6303\\49\\45.89625\\-115.6771\\49\\45.12798\\-113.724\\49\\43.20492\\-111.7709\\49\\41.46468\\-109.8178\\49\\42.12882\\-107.8646\\49\\44.00773\\-105.9115\\49\\45.55392\\-103.9584\\49\\47.64268\\-102.0053\\49\\48.91384\\-100.0521\\49\\50.50502\\-98.80192\\49\\52.45815\\-98.65313\\49\\54.41127\\-99.22073\\49\\55.37761\\-100.0521\\49\\55.90664\\-102.0053\\49\\56.25589\\-103.9584\\49\\56.34169\\-105.9115\\49\\56.95144\\-107.8646\\49\\57.80261\\-109.8178\\49\\58.98432\\-111.7709\\49\\61.01999\\-115.6771\\49\\63.00219\\-117.6303\\49\\64.35129\\-119.5834\\49\\65.24184\\-121.5365\\49\\66.8753\\-123.4896\\49\\67.73663\\-125.4428\\49\\68.08315\\-125.9355\\49\\69.55704\\-127.3959\\49\\71.9894\\-129.3881\\49\\73.31861\\-131.3021\\49\\73.304\\-133.2553\\49\\71.70757\\-137.1615\\49\\71.5428\\-139.1146\\49\\70.75101\\-141.0678\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "7" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "521" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "105.1925\\-216.2336\\49\\104.295\\-215.2865\\49\\104.3399\\-213.3334\\49\\105.1925\\-212.7158\\49\\107.1457\\-213.7725\\49\\108.225\\-215.2865\\49\\107.1457\\-216.6964\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002277" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "31" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "522" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "107.1457\\-188.964\\49\\106.0493\\-187.9428\\49\\103.6543\\-185.9896\\49\\101.7176\\-182.0834\\49\\100.6615\\-180.1303\\49\\100.5017\\-178.1771\\49\\99.75632\\-176.224\\49\\98.68417\\-174.2709\\49\\98.22166\\-172.3178\\49\\97.09241\\-170.3646\\49\\96.61505\\-168.4115\\49\\96.46631\\-166.4584\\49\\96.19187\\-164.5053\\49\\95.76741\\-162.5521\\49\\96.65315\\-160.599\\49\\99.33315\\-157.9074\\49\\101.2863\\-158.1698\\49\\103.2394\\-160.1416\\49\\104.8143\\-162.5521\\49\\106.5421\\-164.5053\\49\\107.1457\\-165.8424\\49\\107.628\\-166.4584\\49\\108.6041\\-168.4115\\49\\109.0988\\-169.686\\49\\109.5698\\-170.3646\\49\\110.5198\\-172.3178\\49\\110.57\\-176.224\\49\\111.1062\\-180.1303\\49\\110.5829\\-184.0365\\49\\110.403\\-187.9428\\49\\109.0988\\-189.6666\\49" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "523" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-190.8619\\51\\-113.5575\\-189.3638\\51\\-114.7913\\-187.9428\\51\\-115.5106\\-186.3195\\51\\-116.6836\\-184.0365\\51\\-116.8613\\-182.0834\\51\\-116.8701\\-180.1303\\51\\-116.7429\\-178.1771\\51\\-115.5106\\-176.1155\\51\\-114.8302\\-174.2709\\51\\-113.5575\\-172.1783\\51\\-112.8577\\-170.3646\\51\\-111.6043\\-168.4234\\51\\-110.1771\\-166.4584\\51\\-108.2433\\-164.5053\\51\\-100.3447\\-156.6928\\51\\-99.8856\\-156.3064\\51\\-97.93247\\-155.9773\\51\\-97.14082\\-156.6928\\51\\-95.44308\\-158.6459\\51\\-95.32306\\-160.599\\51\\-95.91277\\-162.5521\\51\\-96.88402\\-164.5053\\51\\-97.32611\\-166.4584\\51\\-97.93247\\-168.1764\\51\\-99.2468\\-170.3646\\51\\-99.8856\\-172.2527\\51\\-102.4766\\-176.224\\51\\-103.2838\\-178.1771\\51\\-103.3102\\-180.1303\\51\\-104.3714\\-182.0834\\51\\-105.2533\\-184.0365\\51\\-105.277\\-185.9896\\51\\-105.4688\\-187.9428\\51\\-106.4367\\-189.8959\\51\\-107.6981\\-191.3778\\51\\-109.6512\\-191.5785\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "65" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "524" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-78.40122\\-141.9629\\51\\-80.35435\\-140.3427\\51\\-82.30747\\-139.4402\\51\\-82.66579\\-139.1146\\51\\-83.64299\\-137.1615\\51\\-83.20103\\-135.2084\\51\\-82.30747\\-134.2044\\51\\-79.39937\\-131.3021\\51\\-78.98609\\-129.349\\51\\-78.83146\\-127.3959\\51\\-78.40122\\-126.999\\51\\-76.4481\\-126.6309\\51\\-75.36248\\-125.4428\\51\\-74.49497\\-123.5007\\51\\-73.18433\\-121.5365\\51\\-71.2683\\-119.5834\\51\\-70.58872\\-117.9558\\51\\-69.26653\\-115.6771\\51\\-68.01565\\-113.724\\51\\-67.04868\\-111.7709\\51\\-66.23859\\-109.8178\\51\\-65.64047\\-107.8646\\51\\-64.64858\\-105.9115\\51\\-64.31341\\-103.9584\\51\\-64.24974\\-102.0053\\51\\-63.68409\\-100.0521\\51\\-62.77623\\-99.20791\\51\\-60.8231\\-97.62534\\51\\-58.86998\\-96.82636\\51\\-58.10393\\-96.14588\\51\\-55.59822\\-94.19276\\51\\-54.96373\\-93.56536\\51\\-53.0106\\-92.00779\\51\\-51.05748\\-91.24196\\51\\-49.10435\\-91.6915\\51\\-48.50179\\-92.23963\\51\\-47.41214\\-94.19276\\51\\-46.96423\\-96.14588\\51\\-46.1092\\-98.09901\\51\\-44.70693\\-100.0521\\51\\-43.5982\\-102.0053\\51\\-43.93198\\-103.9584\\51\\-44.50056\\-105.9115\\51\\-45.59503\\-107.8646\\51\\-47.36908\\-109.8178\\51\\-49.96792\\-111.7709\\51\\-51.05748\\-112.447\\51\\-53.0106\\-113.1369\\51\\-55.45796\\-115.6771\\51\\-57.16434\\-117.6303\\51\\-57.83623\\-119.5834\\51\\-58.99205\\-121.5365\\51\\-59.81575\\-123.4896\\51\\-60.81547\\-125.4428\\51\\-61.18456\\-127.3959\\51\\-60.50829\\-129.349\\51\\-61.4505\\-131.3021\\51\\-62.77623\\-133.0864\\51\\-65.23798\\-135.2084\\51\\-66.68247\\-136.2697\\51\\-68.6356\\-137.5483\\51\\-70.58872\\-138.3443\\51\\-72.54185\\-139.6119\\51\\-74.49497\\-140.3684\\51\\-76.4481\\-141.5348\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "525" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-203.9258\\51\\-42.17236\\-203.5678\\51\\-43.24498\\-202.7888\\51\\-45.1981\\-200.9876\\51\\-46.17466\\-199.6615\\51\\-47.15123\\-198.9375\\51\\-49.10435\\-198.4316\\51\\-51.05748\\-198.7086\\51\\-53.0106\\-200.2186\\51\\-54.96373\\-200.6512\\51\\-56.07246\\-199.6615\\51\\-55.27762\\-197.7084\\51\\-53.64584\\-195.7553\\51\\-53.0106\\-195.3132\\51\\-49.10435\\-195.309\\51\\-47.15123\\-194.7241\\51\\-45.91911\\-193.8021\\51\\-45.66774\\-191.849\\51\\-45.1981\\-190.6185\\51\\-43.24498\\-188.4981\\51\\-42.33142\\-187.9428\\51\\-41.29185\\-187.6968\\51\\-33.47935\\-187.6968\\51\\-31.52623\\-189.3121\\51\\-29.18056\\-191.849\\51\\-28.65079\\-193.8021\\51\\-27.61998\\-194.7997\\51\\-25.66685\\-195.1943\\51\\-23.71373\\-195.3577\\51\\-21.7606\\-195.1838\\51\\-19.44657\\-193.8021\\51\\-17.85435\\-193.154\\51\\-13.9481\\-193.1367\\51\\-11.99498\\-193.352\\51\\-10.43775\\-193.8021\\51\\-8.088726\\-195.3544\\51\\-7.674748\\-195.7553\\51\\-4.182476\\-197.9924\\51\\-2.229351\\-199.1703\\51\\-1.00125\\-199.6615\\51\\-2.229351\\-201.4236\\51\\-4.182476\\-201.5906\\51\\-6.135601\\-201.1004\\51\\-8.088726\\-201.4134\\51\\-10.04185\\-202.2101\\51\\-11.99498\\-202.4267\\51\\-13.9481\\-202.4913\\51\\-17.85435\\-202.492\\51\\-19.80748\\-202.2874\\51\\-21.7606\\-201.002\\51\\-25.66685\\-200.4509\\51\\-29.5731\\-200.8257\\51\\-33.47935\\-202.5631\\51\\-35.43248\\-203.9235\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "526" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-137.6432\\51\\-35.43248\\-136.6445\\51\\-37.3856\\-135.9191\\51\\-41.29185\\-135.5467\\51\\-43.24498\\-134.5288\\51\\-45.1981\\-133.9877\\51\\-47.15123\\-133.7674\\51\\-51.05748\\-133.5482\\51\\-51.38971\\-133.2553\\51\\-51.77228\\-131.3021\\51\\-51.05748\\-130.2673\\51\\-50.19095\\-129.349\\51\\-49.32408\\-127.3959\\51\\-47.15123\\-125.0415\\51\\-45.1981\\-123.9182\\51\\-43.24498\\-124.2522\\51\\-41.71978\\-123.4896\\51\\-39.33873\\-122.135\\51\\-37.3856\\-123.0014\\51\\-35.43248\\-124.629\\51\\-33.04158\\-125.4428\\51\\-31.52623\\-126.1403\\51\\-30.54966\\-125.4428\\51\\-29.28237\\-121.5365\\51\\-27.98379\\-119.5834\\51\\-27.61998\\-119.2219\\51\\-25.66685\\-119.5947\\51\\-24.87542\\-121.5365\\51\\-21.7606\\-124.9603\\51\\-19.80748\\-126.7711\\51\\-18.94665\\-127.3959\\51\\-17.93762\\-129.349\\51\\-19.80748\\-130.6671\\51\\-21.7606\\-131.799\\51\\-23.71373\\-131.8241\\51\\-25.66685\\-131.584\\51\\-29.5731\\-129.6777\\51\\-30.89299\\-131.3021\\51\\-31.12047\\-133.2553\\51\\-31.00964\\-135.2084\\51\\-31.47928\\-137.1615\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "527" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "29.02065\\-151.3128\\51\\27.06752\\-150.0977\\51\\26.15898\\-148.8803\\51\\25.19578\\-146.9271\\51\\24.76563\\-144.974\\51\\24.6083\\-143.0209\\51\\25.1144\\-141.243\\51\\27.06752\\-141.3085\\51\\27.43904\\-141.0678\\51\\27.84377\\-139.1146\\51\\27.06752\\-138.5609\\51\\25.1144\\-138.2409\\51\\23.16127\\-138.2507\\51\\21.20815\\-137.3344\\51\\20.0338\\-135.2084\\51\\18.01322\\-133.2553\\51\\17.3019\\-132.7628\\51\\15.34877\\-132.1775\\51\\13.39565\\-131.996\\51\\11.44252\\-131.4891\\51\\11.1707\\-131.3021\\51\\11.25842\\-129.349\\51\\15.34877\\-125.2489\\51\\17.3019\\-124.0517\\51\\19.25502\\-123.2902\\51\\21.20815\\-123.9188\\51\\22.1572\\-123.4896\\51\\24.51625\\-121.5365\\51\\25.1144\\-121.1275\\51\\27.06752\\-122.1062\\51\\29.02065\\-122.1062\\51\\30.97377\\-122.5886\\51\\32.9269\\-123.5844\\51\\34.88002\\-124.1353\\51\\36.83315\\-124.2763\\51\\38.78627\\-124.6388\\51\\40.7394\\-126.4073\\51\\41.52541\\-127.3959\\51\\42.69252\\-129.1423\\51\\44.64565\\-130.8588\\51\\46.59877\\-131.0432\\51\\47.35832\\-131.3021\\51\\46.59877\\-133.2664\\51\\44.64565\\-133.8656\\51\\42.69252\\-133.7873\\51\\40.7394\\-133.9745\\51\\38.78627\\-134.6906\\51\\36.83315\\-135.8809\\51\\34.88002\\-136.4091\\51\\32.9269\\-137.7377\\51\\31.69534\\-139.1146\\51\\32.40057\\-141.0678\\51\\32.80483\\-143.0209\\51\\32.83216\\-146.9271\\51\\31.99167\\-148.8803\\51\\30.97377\\-149.9202\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "528" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-214.465\\51\\46.59877\\-212.3618\\51\\43.75744\\-209.4271\\51\\42.45517\\-207.474\\51\\41.83982\\-205.5209\\51\\41.56874\\-203.5678\\51\\40.7394\\-201.4465\\51\\38.78627\\-200.6139\\51\\36.83315\\-202.5436\\51\\35.71297\\-201.6146\\51\\36.34487\\-199.6615\\51\\36.83315\\-199.0566\\51\\38.78627\\-197.2628\\51\\40.11161\\-195.7553\\51\\40.90099\\-191.849\\51\\41.7715\\-189.8959\\51\\44.64565\\-186.9844\\51\\46.59877\\-185.12\\51\\50.50502\\-183.4714\\51\\52.45815\\-183.0011\\51\\54.41127\\-182.6358\\51\\56.3644\\-182.6627\\51\\58.31752\\-183.2001\\51\\60.27065\\-183.9843\\51\\62.22377\\-184.4383\\51\\64.1769\\-185.1797\\51\\66.13003\\-187.0366\\51\\68.08315\\-188.309\\51\\69.43069\\-189.8959\\51\\70.91884\\-191.849\\51\\72.59257\\-193.8021\\51\\73.39999\\-195.7553\\51\\74.08099\\-199.6615\\51\\75.89565\\-201.2613\\51\\77.84878\\-201.9851\\51\\79.23125\\-203.5678\\51\\77.84878\\-204.5923\\51\\75.89565\\-204.4629\\51\\74.61101\\-205.5209\\51\\73.74309\\-207.474\\51\\73.7068\\-209.4271\\51\\72.71908\\-211.3803\\51\\70.03628\\-214.0714\\51\\64.1769\\-216.9921\\51\\58.31752\\-217.0158\\51\\56.3644\\-216.8307\\51\\54.41127\\-216.2962\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "529" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "68.08315\\-139.5453\\51\\66.13003\\-138.4365\\51\\64.1769\\-137.9217\\51\\62.22377\\-137.6948\\51\\58.31752\\-135.9548\\51\\56.3644\\-134.8829\\51\\54.41127\\-133.2162\\51\\52.45815\\-130.741\\51\\51.48159\\-129.349\\51\\51.03603\\-127.3959\\51\\50.98397\\-123.4896\\51\\50.22889\\-121.5365\\51\\49.10753\\-119.5834\\51\\47.33366\\-117.6303\\51\\45.97733\\-115.6771\\51\\44.91576\\-113.724\\51\\44.64565\\-113.4558\\51\\42.69252\\-112.2417\\51\\40.7394\\-110.651\\51\\39.90158\\-109.8178\\51\\40.20229\\-107.8646\\51\\40.7394\\-107.0291\\51\\41.74526\\-105.9115\\51\\43.28883\\-103.9584\\51\\44.64565\\-102.6252\\51\\45.42905\\-102.0053\\51\\46.87672\\-100.0521\\51\\48.5519\\-98.86858\\51\\52.45815\\-98.90456\\51\\54.41127\\-99.61478\\51\\54.86535\\-100.0521\\51\\55.36781\\-102.0053\\51\\56.1527\\-103.9584\\51\\56.25589\\-105.9115\\51\\56.5882\\-107.8646\\51\\57.27684\\-109.8178\\51\\58.97033\\-111.7709\\51\\60.27065\\-114.1326\\51\\61.01999\\-115.6771\\51\\63.00219\\-117.6303\\51\\64.67963\\-119.5834\\51\\65.52035\\-121.5365\\51\\67.01192\\-123.4896\\51\\68.08315\\-125.0222\\51\\71.37652\\-127.3959\\51\\72.81148\\-129.349\\51\\73.68343\\-131.3021\\51\\73.16855\\-133.2553\\51\\72.21476\\-135.2084\\51\\71.71703\\-137.1615\\51\\70.95345\\-139.1146\\51\\70.03628\\-139.873\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002276" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "530" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "109.0988\\-192.4585\\51\\106.9339\\-189.8959\\51\\106.1691\\-187.9428\\51\\104.7836\\-185.9896\\51\\104.6652\\-184.0365\\51\\103.7195\\-182.0834\\51\\102.6676\\-180.1303\\51\\102.3076\\-178.1771\\51\\100.9987\\-176.224\\51\\100.6799\\-174.2709\\51\\99.96597\\-172.3178\\51\\98.73565\\-170.3646\\51\\98.42317\\-168.4115\\51\\97.68967\\-166.4584\\51\\97.21365\\-164.5053\\51\\96.85709\\-162.5521\\51\\98.09389\\-160.599\\51\\98.70157\\-158.6459\\51\\99.33315\\-157.2287\\51\\99.72552\\-156.6928\\51\\99.33315\\-154.7091\\51\\101.2863\\-155.028\\51\\103.2394\\-156.9784\\51\\104.5887\\-158.6459\\51\\105.1925\\-159.7923\\51\\105.818\\-160.599\\51\\107.7248\\-162.5521\\51\\108.9725\\-164.5053\\51\\110.4503\\-166.4584\\51\\111.043\\-168.4115\\51\\112.336\\-170.3646\\51\\112.49\\-172.3178\\51\\112.4802\\-174.2709\\51\\112.8643\\-176.224\\51\\113.005\\-178.2687\\51\\112.5765\\-180.1303\\51\\113.1729\\-182.0834\\51\\113.1445\\-184.0365\\51\\112.5516\\-185.9896\\51\\112.49\\-189.8959\\51\\112.2687\\-191.849\\51\\111.0519\\-193.1161\\51" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "531" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-190.4886\\53\\-114.473\\-189.8959\\53\\-115.5106\\-188.9433\\53\\-116.1599\\-187.9428\\53\\-116.3347\\-185.9896\\53\\-118.0667\\-184.0365\\53\\-118.6573\\-182.0834\\53\\-118.8597\\-180.1303\\53\\-118.6801\\-178.1771\\53\\-118.3375\\-176.224\\53\\-117.5838\\-174.2709\\53\\-115.6501\\-170.3646\\53\\-114.3213\\-168.4115\\53\\-111.6043\\-165.6594\\53\\-108.4182\\-162.5521\\53\\-107.6981\\-161.9725\\53\\-102.384\\-156.6928\\53\\-101.8387\\-156.0182\\53\\-99.8856\\-155.1676\\53\\-97.93247\\-155.7601\\53\\-97.01814\\-156.6928\\53\\-96.35349\\-158.6459\\53\\-96.33041\\-160.599\\53\\-96.80014\\-162.5521\\53\\-98.44296\\-164.5053\\53\\-99.33043\\-166.4584\\53\\-103.1951\\-172.3178\\53\\-103.3417\\-174.2709\\53\\-104.4826\\-176.224\\53\\-105.2709\\-178.1771\\53\\-105.3102\\-180.1303\\53\\-106.3671\\-182.0834\\53\\-107.2314\\-184.0365\\53\\-107.2568\\-187.9428\\53\\-107.5056\\-189.8959\\53\\-107.6981\\-190.1334\\53\\-109.6512\\-191.4333\\53\\-111.6043\\-191.2631\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "532" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-80.35435\\-140.182\\53\\-81.60841\\-139.1146\\53\\-83.44996\\-137.1615\\53\\-83.54903\\-135.2084\\53\\-82.44911\\-133.2553\\53\\-80.35435\\-131.1394\\53\\-78.40122\\-128.5807\\53\\-76.4481\\-126.3066\\53\\-75.81718\\-125.4428\\53\\-75.00029\\-123.4896\\53\\-73.1946\\-121.5365\\53\\-71.2683\\-119.5834\\53\\-70.58872\\-117.9558\\53\\-68.08338\\-113.724\\53\\-67.1172\\-111.7709\\53\\-66.02963\\-109.8178\\53\\-64.30398\\-105.9115\\53\\-63.98759\\-102.0053\\53\\-63.54027\\-100.0521\\53\\-62.77623\\-99.31483\\53\\-60.8231\\-98.60432\\53\\-58.86998\\-97.22952\\53\\-57.63462\\-96.14588\\53\\-54.96373\\-93.56536\\53\\-53.0106\\-92.84669\\53\\-51.05748\\-92.50256\\53\\-49.10435\\-93.87015\\53\\-48.81984\\-94.19276\\53\\-48.25149\\-96.14588\\53\\-46.18935\\-100.0521\\53\\-44.75898\\-102.0053\\53\\-44.5559\\-103.9584\\53\\-45.0111\\-105.9115\\53\\-46.05597\\-107.8646\\53\\-47.76523\\-109.8178\\53\\-49.10435\\-111.141\\53\\-51.05748\\-112.4404\\53\\-53.0106\\-113.3188\\53\\-54.82765\\-115.6771\\53\\-56.91685\\-117.7258\\53\\-58.56601\\-121.5365\\53\\-59.54645\\-123.4896\\53\\-60.0933\\-125.4428\\53\\-60.27378\\-127.3959\\53\\-60.80039\\-129.349\\53\\-61.88794\\-131.3021\\53\\-64.72935\\-134.1519\\53\\-66.68247\\-135.5164\\53\\-68.6356\\-135.9769\\53\\-70.94489\\-137.1615\\53\\-76.4481\\-139.9015\\53\\-78.40122\\-140.7422\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "20" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "533" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-35.43248\\-135.2892\\53\\-37.3856\\-134.2001\\53\\-39.33873\\-133.7614\\53\\-41.29185\\-133.7435\\53\\-43.24498\\-133.459\\53\\-46.83927\\-131.3021\\53\\-47.15123\\-130.7798\\53\\-47.57847\\-129.349\\53\\-47.39723\\-127.3959\\53\\-45.1981\\-125.2897\\53\\-43.24498\\-125.0286\\53\\-39.33873\\-124.8731\\53\\-37.3856\\-125.3629\\53\\-35.43248\\-126.5717\\53\\-34.27037\\-127.3959\\53\\-33.16123\\-129.349\\53\\-33.12489\\-131.3021\\53\\-33.18638\\-133.2553\\53\\-33.47935\\-134.4094\\53\\-34.8671\\-135.2084\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "534" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-33.47935\\-201.6668\\53\\-35.43248\\-201.0522\\53\\-37.3856\\-200.8557\\53\\-41.29185\\-200.8431\\53\\-43.24498\\-200.663\\53\\-45.1981\\-199.6225\\53\\-47.15123\\-199.0582\\53\\-49.10435\\-199.3289\\53\\-51.05748\\-199.9206\\53\\-53.0106\\-200.3055\\53\\-53.956\\-199.6615\\53\\-53.2336\\-197.7084\\53\\-53.0106\\-197.4307\\53\\-51.05748\\-196.0933\\53\\-49.10435\\-195.7325\\53\\-47.15123\\-195.7177\\53\\-45.1981\\-195.3219\\53\\-43.24498\\-194.7787\\53\\-41.29185\\-194.5088\\53\\-39.33873\\-194.0887\\53\\-37.3856\\-194.0326\\53\\-35.43248\\-194.2066\\53\\-31.52623\\-195.1073\\53\\-29.5731\\-196.3493\\53\\-27.61998\\-197.3633\\53\\-25.66685\\-197.4131\\53\\-23.71373\\-197.3513\\53\\-21.7606\\-197.1623\\53\\-17.85435\\-196.6349\\53\\-11.99498\\-196.6349\\53\\-10.04185\\-197.0275\\53\\-8.088726\\-197.7632\\53\\-6.135601\\-198.2031\\53\\-4.182476\\-198.8769\\53\\-2.981218\\-199.6615\\53\\-4.182476\\-200.9794\\53\\-6.135601\\-201.047\\53\\-8.088726\\-200.5554\\53\\-10.04185\\-200.529\\53\\-13.9481\\-200.8506\\53\\-15.90123\\-200.888\\53\\-17.85435\\-201.4627\\53\\-21.7606\\-201.9948\\53\\-23.71373\\-202.6822\\53\\-25.66685\\-202.8279\\53\\-27.61998\\-202.7968\\53\\-29.5731\\-201.9993\\53\\-31.52623\\-201.6676\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "23" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "535" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-21.7606\\-131.5379\\53\\-23.71373\\-131.2313\\53\\-25.66685\\-130.4872\\53\\-27.04218\\-129.349\\53\\-27.34624\\-127.3959\\53\\-28.21202\\-123.4896\\53\\-28.18243\\-121.5365\\53\\-27.61998\\-120.0554\\53\\-27.20954\\-119.5834\\53\\-26.19796\\-117.6303\\53\\-25.66685\\-117.0864\\53\\-23.7218\\-115.6771\\53\\-21.7606\\-116.0745\\53\\-20.70646\\-117.6303\\53\\-21.7606\\-119.289\\53\\-23.71373\\-119.2904\\53\\-24.28444\\-119.5834\\53\\-24.93685\\-121.5365\\53\\-23.24006\\-123.4896\\53\\-21.7606\\-125.4049\\53\\-19.83387\\-127.3959\\53\\-17.70356\\-129.349\\53\\-19.80748\\-131.3969\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "536" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "27.06752\\-151.0933\\53\\25.80406\\-148.8803\\53\\25.22454\\-146.9271\\53\\25.45377\\-144.974\\53\\26.2099\\-143.0209\\53\\28.36358\\-141.0678\\53\\29.02065\\-140.054\\53\\30.97377\\-139.5754\\53\\32.47671\\-141.0678\\53\\32.83216\\-143.0209\\53\\32.84613\\-144.974\\53\\32.62294\\-146.9271\\53\\31.84243\\-148.8803\\53\\29.97998\\-150.8334\\53\\29.02065\\-151.6872\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "537" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "27.06752\\-137.4433\\53\\26.56762\\-137.1615\\53\\24.58261\\-135.2084\\53\\24.10028\\-133.2553\\53\\22.53872\\-131.3021\\53\\21.20815\\-130.004\\53\\17.3019\\-130.8104\\53\\15.34877\\-131.5496\\53\\13.39565\\-131.8074\\53\\11.44252\\-131.799\\53\\10.13543\\-131.3021\\53\\10.52303\\-129.349\\53\\12.77532\\-127.3959\\53\\15.34877\\-124.7821\\53\\17.3019\\-122.9669\\53\\19.25502\\-122.7731\\53\\21.20815\\-123.1454\\53\\22.81702\\-121.5365\\53\\23.16127\\-120.8115\\53\\25.1144\\-120.9408\\53\\25.64628\\-121.5365\\53\\27.06752\\-122.4674\\53\\29.02065\\-122.3832\\53\\30.97377\\-123.1446\\53\\32.9269\\-124.2828\\53\\36.83315\\-125.0484\\53\\38.78627\\-125.7816\\53\\40.7394\\-127.1827\\53\\42.37863\\-129.349\\53\\43.27236\\-131.3021\\53\\42.69252\\-131.7336\\53\\40.7394\\-132.3983\\53\\38.78627\\-133.7082\\53\\36.83315\\-134.4439\\53\\34.88002\\-135.7137\\53\\32.9269\\-136.3792\\53\\31.45188\\-137.1615\\53\\30.97377\\-137.9668\\53\\29.02065\\-137.9938\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "538" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-215.5392\\53\\52.45815\\-215.016\\53\\50.50502\\-214.2944\\53\\48.5519\\-212.8191\\53\\46.59877\\-211.9967\\53\\44.37328\\-209.4271\\53\\43.55283\\-207.474\\53\\42.2958\\-205.5209\\53\\42.00643\\-203.5678\\53\\41.52927\\-201.6146\\53\\40.7394\\-200.771\\53\\38.78627\\-200.9968\\53\\36.83315\\-202.6358\\53\\35.92599\\-201.6146\\53\\36.83315\\-199.9599\\53\\38.78627\\-198.0258\\53\\40.48031\\-195.7553\\53\\40.5277\\-193.8021\\53\\41.48178\\-191.849\\53\\42.04665\\-189.8959\\53\\43.68726\\-187.9428\\53\\44.64565\\-186.9844\\53\\46.59877\\-185.4434\\53\\48.5519\\-184.9422\\53\\50.50502\\-184.2874\\53\\52.45815\\-183.5198\\53\\54.41127\\-183.2857\\53\\56.3644\\-183.2955\\53\\58.31752\\-183.5282\\53\\60.27065\\-184.3663\\53\\62.22377\\-185.0702\\53\\64.1769\\-185.923\\53\\66.13003\\-187.1487\\53\\68.08315\\-188.1729\\53\\70.03628\\-190.612\\53\\70.92928\\-191.849\\53\\72.87094\\-193.8021\\53\\73.71873\\-195.7553\\53\\73.74309\\-197.7084\\53\\74.65324\\-199.6615\\53\\77.84878\\-202.546\\53\\78.784\\-203.5678\\53\\77.84878\\-204.513\\53\\75.89565\\-204.8681\\53\\75.06328\\-205.5209\\53\\73.74309\\-207.474\\53\\73.73082\\-209.4271\\53\\72.74352\\-211.3803\\53\\70.03628\\-214.0782\\53\\67.49992\\-215.2865\\53\\64.1769\\-216.7847\\53\\62.22377\\-217.0158\\53\\58.31752\\-217.0158\\53\\56.3644\\-216.443\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "539" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "66.13003\\-137.5285\\53\\64.1769\\-136.4898\\53\\62.22377\\-135.9482\\53\\60.27065\\-135.5489\\53\\58.31752\\-134.5831\\53\\56.3644\\-133.8174\\53\\54.41127\\-132.3727\\53\\51.05862\\-129.349\\53\\49.88412\\-127.3959\\53\\49.85199\\-123.4896\\53\\49.42422\\-121.5365\\53\\48.5519\\-119.688\\53\\47.33978\\-117.6303\\53\\44.64565\\-114.5544\\53\\43.81531\\-113.724\\53\\41.54138\\-111.7709\\53\\39.51244\\-109.8178\\53\\38.82412\\-107.8646\\53\\37.73531\\-103.9584\\53\\38.78627\\-103.0612\\53\\39.71401\\-102.0053\\53\\40.1707\\-100.0521\\53\\40.7394\\-99.29682\\53\\42.01707\\-98.09901\\53\\44.64565\\-96.15926\\53\\46.59877\\-96.91932\\53\\48.5519\\-97.81528\\53\\50.50502\\-98.90456\\53\\52.45815\\-98.92021\\53\\54.22427\\-100.0521\\53\\54.96852\\-102.0053\\53\\55.84634\\-103.9584\\53\\56.22896\\-105.9115\\53\\56.49984\\-107.8646\\53\\57.21825\\-109.8178\\53\\58.97033\\-111.7709\\53\\60.27065\\-113.7343\\53\\61.14539\\-115.6771\\53\\64.90932\\-119.5834\\53\\66.52441\\-121.5365\\53\\67.35699\\-123.4896\\53\\68.08315\\-124.5308\\53\\69.29906\\-125.4428\\53\\71.9894\\-127.0198\\53\\72.35561\\-127.3959\\53\\73.33852\\-129.349\\53\\73.71873\\-131.3021\\53\\73.03754\\-133.2553\\53\\71.71886\\-135.2084\\53\\71.51729\\-137.1615\\53\\70.03628\\-138.4109\\53\\68.08315\\-137.9053\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "540" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "105.1925\\-214.2475\\53\\104.5782\\-213.3334\\53\\105.1925\\-211.9228\\53\\105.6151\\-211.3803\\53\\107.1457\\-210.2184\\53\\108.5669\\-211.3803\\53\\109.76\\-213.3334\\53\\109.0988\\-214.0387\\53\\107.1457\\-215.2633\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002275" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "541" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "111.0519\\-195.082\\53\\109.0988\\-193.3779\\53\\108.1471\\-191.849\\53\\107.1229\\-189.8959\\53\\106.8487\\-187.9428\\53\\106.4447\\-184.0365\\53\\105.6509\\-182.0834\\53\\104.7009\\-180.1303\\53\\104.3313\\-178.1771\\53\\103.3585\\-176.224\\53\\101.9503\\-172.3178\\53\\100.7482\\-170.3646\\53\\100.6066\\-168.4115\\53\\99.33315\\-166.1016\\53\\98.78343\\-164.5053\\53\\98.59518\\-162.5521\\53\\98.71609\\-160.599\\53\\98.94621\\-158.6459\\53\\98.74384\\-156.6928\\53\\98.00348\\-154.7396\\53\\99.33315\\-153.2212\\53\\101.2863\\-153.1883\\53\\103.2394\\-154.2033\\53\\103.9355\\-154.7396\\53\\105.8825\\-156.6928\\53\\107.1457\\-158.6577\\53\\108.9767\\-160.599\\53\\110.9951\\-162.5521\\53\\112.9052\\-164.5053\\53\\114.1076\\-166.4584\\53\\114.8838\\-168.4115\\53\\115.989\\-170.3646\\53\\114.9582\\-172.9107\\53\\114.651\\-174.2709\\53\\114.9582\\-175.0643\\53\\115.7003\\-176.224\\53\\116.2914\\-178.1771\\53\\116.1159\\-180.1303\\53\\116.299\\-182.0834\\53\\116.2884\\-184.0365\\53\\116.0842\\-185.9896\\53\\115.9964\\-187.9428\\53\\114.9688\\-189.8959\\53\\114.4806\\-191.849\\53\\114.2594\\-193.8021\\53\\113.005\\-195.113\\53" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "542" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-190.5635\\55\\-114.6317\\-189.8959\\55\\-115.5106\\-189.0902\\55\\-116.2167\\-187.9428\\55\\-116.3497\\-185.9896\\55\\-118.3215\\-184.0365\\55\\-119.7737\\-182.0834\\55\\-120.0416\\-180.1303\\55\\-119.4168\\-178.7131\\55\\-118.9902\\-178.1771\\55\\-118.4082\\-176.224\\55\\-118.3131\\-174.2709\\55\\-118.0993\\-172.3178\\55\\-117.0345\\-170.3646\\55\\-116.428\\-168.4115\\55\\-115.5106\\-166.6914\\55\\-113.5575\\-164.4031\\55\\-111.6043\\-162.4095\\55\\-107.6981\\-159.8352\\55\\-105.745\\-158.0406\\55\\-104.3972\\-156.6928\\55\\-103.193\\-154.7396\\55\\-101.8387\\-153.3322\\55\\-99.8856\\-153.7695\\55\\-98.9523\\-154.7396\\55\\-97.35641\\-156.6928\\55\\-97.29106\\-158.6459\\55\\-97.54883\\-160.599\\55\\-97.93247\\-161.5756\\55\\-98.52271\\-162.5521\\55\\-100.2415\\-164.5053\\55\\-102.4575\\-168.4115\\55\\-104.3293\\-170.3646\\55\\-105.2937\\-172.3178\\55\\-105.3529\\-174.2709\\55\\-106.4545\\-176.224\\55\\-107.2583\\-178.1771\\55\\-107.309\\-180.1303\\55\\-108.3675\\-182.0834\\55\\-109.2197\\-184.0365\\55\\-109.2349\\-187.9428\\55\\-109.339\\-189.8959\\55\\-109.6512\\-190.2657\\55\\-111.6043\\-191.1041\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "543" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-80.35435\\-139.9061\\55\\-83.34705\\-137.1615\\55\\-83.74692\\-135.2084\\55\\-83.21464\\-133.2553\\55\\-82.30747\\-132.2341\\55\\-77.46307\\-127.3959\\55\\-76.4481\\-125.4533\\55\\-75.15454\\-123.4896\\55\\-73.20815\\-121.5365\\55\\-71.47791\\-119.5834\\55\\-70.58872\\-117.6636\\55\\-69.26653\\-115.6771\\55\\-67.60625\\-113.724\\55\\-66.52089\\-111.7709\\55\\-65.628\\-109.8178\\55\\-64.56776\\-107.8646\\55\\-63.58387\\-103.9584\\55\\-63.29829\\-102.0053\\55\\-63.54206\\-100.0521\\55\\-62.77623\\-99.31725\\55\\-60.8231\\-98.90456\\55\\-58.86998\\-97.34889\\55\\-56.91685\\-95.45267\\55\\-54.96373\\-93.91471\\55\\-53.0106\\-93.231\\55\\-51.05748\\-93.91694\\55\\-50.77296\\-94.19276\\55\\-49.9264\\-96.14588\\55\\-48.69506\\-98.09901\\55\\-47.96398\\-100.0521\\55\\-46.36602\\-102.0053\\55\\-45.37762\\-103.9584\\55\\-45.67432\\-105.9115\\55\\-46.64463\\-107.8646\\55\\-48.05762\\-109.8178\\55\\-49.10435\\-110.8645\\55\\-51.05748\\-112.2592\\55\\-53.0106\\-113.1754\\55\\-55.34278\\-115.6771\\55\\-56.91685\\-117.747\\55\\-58.55516\\-121.5365\\55\\-59.03274\\-123.4896\\55\\-59.8558\\-127.3959\\55\\-60.8231\\-128.7042\\55\\-62.77623\\-131.0939\\55\\-64.72935\\-132.7635\\55\\-66.68247\\-134.006\\55\\-68.6356\\-134.6212\\55\\-70.58872\\-135.8354\\55\\-72.54185\\-136.572\\55\\-74.49497\\-137.8108\\55\\-76.4481\\-138.4765\\55\\-78.40122\\-139.7283\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "15" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "544" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-41.29185\\-131.7867\\55\\-43.24498\\-130.9932\\55\\-45.1981\\-129.8181\\55\\-45.63711\\-129.349\\55\\-45.62629\\-127.3959\\55\\-45.1981\\-126.9805\\55\\-43.24498\\-126.1073\\55\\-41.29185\\-125.8681\\55\\-39.33873\\-126.3762\\55\\-37.3856\\-127.1845\\55\\-35.43248\\-128.8065\\55\\-35.05155\\-129.349\\55\\-35.43248\\-131.3459\\55\\-37.3856\\-132.3209\\55\\-39.33873\\-131.9978\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "545" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-29.5731\\-204.019\\55\\-31.52623\\-202.7565\\55\\-33.47935\\-202.5971\\55\\-37.3856\\-201.3059\\55\\-43.24498\\-201.2939\\55\\-45.1981\\-201.0812\\55\\-47.15123\\-200.4695\\55\\-49.10435\\-200.251\\55\\-50.42873\\-199.6615\\55\\-50.93961\\-197.7084\\55\\-49.10435\\-196.7136\\55\\-45.1981\\-196.3285\\55\\-43.24498\\-196.2243\\55\\-37.3856\\-196.2243\\55\\-35.43248\\-196.3326\\55\\-31.52623\\-197.5346\\55\\-31.15336\\-197.7084\\55\\-29.5731\\-199.0664\\55\\-29.04413\\-199.6615\\55\\-27.61998\\-200.7186\\55\\-25.66685\\-200.9932\\55\\-23.71373\\-200.5275\\55\\-22.69376\\-199.6615\\55\\-21.7606\\-199.2691\\55\\-19.80748\\-199.023\\55\\-11.99498\\-199.3622\\55\\-11.06724\\-199.6615\\55\\-13.9481\\-200.0672\\55\\-15.90123\\-200.1273\\55\\-17.85435\\-200.934\\55\\-18.68624\\-201.6146\\55\\-21.7606\\-202.18\\55\\-23.71373\\-203.6491\\55\\-25.66685\\-204.4185\\55\\-27.61998\\-204.6762\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "546" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-23.71373\\-130.2042\\55\\-25.19772\\-129.349\\55\\-25.66685\\-128.6844\\55\\-26.25776\\-127.3959\\55\\-27.20457\\-123.4896\\55\\-27.05936\\-121.5365\\55\\-25.66685\\-120.6519\\55\\-25.21387\\-121.5365\\55\\-24.43299\\-123.4896\\55\\-22.75291\\-125.4428\\55\\-21.7606\\-126.7611\\55\\-18.77488\\-129.349\\55\\-19.80748\\-130.7334\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "14" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "547" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "27.06752\\-151.4911\\55\\26.50543\\-150.8334\\55\\25.78228\\-148.8803\\55\\26.0376\\-146.9271\\55\\26.59904\\-144.974\\55\\27.06752\\-144.2364\\55\\29.02065\\-142.199\\55\\30.97377\\-141.2518\\55\\31.99103\\-143.0209\\55\\32.2235\\-144.974\\55\\32.02846\\-146.9271\\55\\31.1005\\-148.8803\\55\\29.81009\\-150.8334\\55\\29.02065\\-151.6089\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "548" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "29.02065\\-135.6301\\55\\27.83631\\-135.2084\\55\\27.06752\\-134.2047\\55\\26.79409\\-133.2553\\55\\25.97906\\-131.3021\\55\\24.96596\\-129.349\\55\\26.24468\\-127.3959\\55\\26.35873\\-125.4428\\55\\25.1144\\-123.8355\\55\\23.16127\\-124.6127\\55\\21.20815\\-124.7134\\55\\20.63768\\-125.4428\\55\\19.73094\\-127.3959\\55\\19.25502\\-128.0921\\55\\17.92422\\-129.349\\55\\17.3019\\-129.7559\\55\\13.39565\\-131.7904\\55\\11.44252\\-131.8074\\55\\10.46596\\-131.3021\\55\\10.76644\\-129.349\\55\\11.44252\\-128.7631\\55\\13.39565\\-127.7011\\55\\15.54265\\-125.4428\\55\\16.88153\\-123.4896\\55\\17.3019\\-123.0801\\55\\19.25502\\-122.1416\\55\\21.20815\\-122.8408\\55\\23.16127\\-122.8417\\55\\25.50048\\-123.4896\\55\\27.06752\\-124.6718\\55\\28.71101\\-123.4896\\55\\29.02065\\-123.3949\\55\\30.97377\\-124.176\\55\\34.88002\\-125.931\\55\\36.83315\\-126.2383\\55\\38.78627\\-126.7222\\55\\39.62443\\-127.3959\\55\\40.86789\\-129.349\\55\\40.01098\\-131.3021\\55\\38.78627\\-132.3255\\55\\36.83315\\-133.6806\\55\\34.88002\\-134.4327\\55\\32.9269\\-135.4441\\55\\30.97377\\-135.6608\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "549" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-216.0773\\55\\54.41127\\-215.0274\\55\\52.45815\\-214.8437\\55\\50.50502\\-214.0772\\55\\48.5519\\-212.5\\55\\46.59877\\-210.735\\55\\43.69069\\-207.474\\55\\42.32553\\-205.5209\\55\\42.3155\\-203.5678\\55\\41.72021\\-201.6146\\55\\40.7394\\-200.603\\55\\36.83315\\-202.245\\55\\36.40249\\-201.6146\\55\\37.64114\\-199.6615\\55\\39.48753\\-197.7084\\55\\40.50368\\-195.7553\\55\\40.9264\\-193.8021\\55\\41.75299\\-191.849\\55\\42.346\\-189.8959\\55\\43.75654\\-187.9428\\55\\44.64565\\-187.0836\\55\\47.02405\\-185.9896\\55\\48.5519\\-185.4514\\55\\50.50502\\-184.9571\\55\\52.45815\\-184.597\\55\\58.31752\\-184.6086\\55\\60.27065\\-185.1044\\55\\64.1769\\-187.1846\\55\\68.08315\\-188.9301\\55\\70.03628\\-190.8837\\55\\72.69096\\-193.8021\\55\\73.48476\\-195.7553\\55\\73.75552\\-197.7084\\55\\74.70563\\-199.6615\\55\\76.72197\\-201.6146\\55\\78.1306\\-203.5678\\55\\77.84878\\-203.8788\\55\\75.36668\\-205.5209\\55\\73.74309\\-207.474\\55\\73.44526\\-209.4271\\55\\72.2915\\-211.3803\\55\\70.03628\\-213.6256\\55\\68.08315\\-214.7629\\55\\66.13003\\-215.3094\\55\\64.1769\\-216.1901\\55\\62.22377\\-216.7783\\55\\60.27065\\-217.0039\\55\\58.31752\\-216.8116\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "550" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "70.03628\\-137.4433\\55\\68.08315\\-136.4672\\55\\64.1769\\-135.5123\\55\\62.22377\\-134.5288\\55\\58.31752\\-133.5333\\55\\56.3644\\-132.6062\\55\\54.41127\\-131.8407\\55\\52.45815\\-130.4264\\55\\50.50502\\-129.1957\\55\\49.20875\\-127.3959\\55\\49.01724\\-125.4428\\55\\48.99399\\-123.4896\\55\\47.9638\\-119.5834\\55\\47.17484\\-117.6303\\55\\45.39569\\-115.6771\\55\\39.46987\\-109.8178\\55\\37.96675\\-107.8646\\55\\37.03483\\-103.9584\\55\\39.66615\\-102.0053\\55\\40.7394\\-99.55751\\55\\42.85529\\-98.09901\\55\\44.64565\\-95.96093\\55\\46.59877\\-96.35818\\55\\49.03204\\-98.09901\\55\\50.50502\\-98.90983\\55\\52.45815\\-98.92021\\55\\54.18748\\-100.0521\\55\\54.58566\\-102.0053\\55\\55.3313\\-103.9584\\55\\56.3644\\-106.3915\\55\\56.87566\\-107.8646\\55\\57.68303\\-109.8178\\55\\58.98432\\-111.7709\\55\\60.79034\\-113.724\\55\\61.65692\\-115.6771\\55\\63.15106\\-117.6303\\55\\64.1769\\-118.8073\\55\\66.99527\\-121.5365\\55\\67.77918\\-123.4896\\55\\68.08315\\-123.9107\\55\\70.28288\\-125.4428\\55\\71.9894\\-126.4729\\55\\72.91237\\-127.3959\\55\\74.23824\\-129.349\\55\\74.0646\\-131.3021\\55\\73.03278\\-133.2553\\55\\71.51647\\-135.2084\\55\\70.41458\\-137.1615\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "551" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "105.1925\\-213.6025\\55\\104.9568\\-213.3334\\55\\105.7279\\-211.3803\\55\\106.6074\\-209.4271\\55\\107.1457\\-208.8276\\55\\109.0988\\-208.3343\\55\\110.5183\\-209.4271\\55\\111.4901\\-211.3803\\55\\112.0987\\-213.3334\\55\\111.0519\\-214.4357\\55\\109.0988\\-214.9825\\55\\107.1457\\-214.828\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002274" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "552" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "111.0519\\-196.0783\\55\\110.7623\\-195.7553\\55\\108.8936\\-191.849\\55\\108.6623\\-189.8959\\55\\108.6327\\-185.9896\\55\\107.9873\\-184.0365\\55\\106.8866\\-182.0834\\55\\106.6865\\-180.1303\\55\\106.0714\\-178.1771\\55\\104.9334\\-176.224\\55\\104.7112\\-174.2709\\55\\103.9503\\-172.3178\\55\\102.7892\\-170.3646\\55\\102.7199\\-168.4115\\55\\101.8105\\-166.4584\\55\\100.7705\\-164.5053\\55\\100.1013\\-162.5521\\55\\99.25238\\-160.599\\55\\98.97633\\-158.6459\\55\\98.32275\\-156.6928\\55\\97.78642\\-154.7396\\55\\99.33315\\-153.2918\\55\\101.2863\\-151.9826\\55\\103.2394\\-152.0591\\55\\105.1925\\-153.3116\\55\\107.1937\\-154.7396\\55\\113.005\\-160.4007\\55\\114.9582\\-161.4085\\55\\115.9928\\-162.5521\\55\\116.2958\\-164.5053\\55\\116.9113\\-165.9701\\55\\118.2341\\-168.4115\\55\\118.449\\-170.3646\\55\\118.8644\\-172.1041\\55\\120.0108\\-174.2709\\55\\120.0018\\-178.1771\\55\\119.4157\\-180.1303\\55\\119.0349\\-182.0834\\55\\118.9865\\-184.0365\\55\\118.4186\\-185.9896\\55\\118.3412\\-187.9428\\55\\117.379\\-189.8959\\55\\117.1274\\-191.849\\55\\117.0198\\-193.8021\\55\\115.9857\\-195.7553\\55\\114.9582\\-196.7388\\55\\113.005\\-197.0159\\55" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "553" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-115.5106\\-188.5081\\57\\-115.9636\\-187.9428\\57\\-116.5651\\-185.9896\\57\\-118.3226\\-184.0365\\57\\-118.7989\\-182.0834\\57\\-118.0063\\-180.1303\\57\\-117.4637\\-179.6124\\57\\-114.8234\\-178.1771\\57\\-113.6915\\-176.224\\57\\-114.8392\\-174.2709\\57\\-115.5106\\-174.1399\\57\\-117.4637\\-172.9258\\57\\-117.6875\\-172.3178\\57\\-117.2593\\-170.3646\\57\\-116.1529\\-166.4584\\57\\-114.8982\\-164.5053\\57\\-113.8936\\-162.5521\\57\\-111.6043\\-159.9762\\57\\-109.6512\\-158.4366\\57\\-107.022\\-156.6928\\57\\-105.745\\-155.3958\\57\\-104.4125\\-152.7865\\57\\-103.7918\\-152.171\\57\\-101.8387\\-150.7169\\57\\-99.8856\\-151.4719\\57\\-98.20301\\-154.7396\\57\\-97.97004\\-156.6928\\57\\-98.77534\\-158.6459\\57\\-100.0611\\-160.599\\57\\-100.9613\\-162.5521\\57\\-103.4512\\-166.4584\\57\\-104.5087\\-168.4115\\57\\-106.2167\\-170.3646\\57\\-107.2906\\-172.3178\\57\\-107.4133\\-174.2709\\57\\-108.6428\\-176.224\\57\\-109.6034\\-178.1771\\57\\-109.6417\\-180.1303\\57\\-110.6386\\-182.0834\\57\\-111.2059\\-184.0365\\57\\-111.0049\\-185.9896\\57\\-111.0239\\-187.9428\\57\\-111.6043\\-189.2198\\57\\-113.5575\\-189.7215\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "554" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-80.35435\\-139.4186\\57\\-82.30747\\-138.1466\\57\\-83.34705\\-137.1615\\57\\-83.75529\\-135.2084\\57\\-83.56164\\-133.2553\\57\\-82.47636\\-131.3021\\57\\-78.40122\\-127.1964\\57\\-76.4481\\-124.9178\\57\\-73.43661\\-121.5365\\57\\-72.12424\\-119.5834\\57\\-71.03262\\-117.6303\\57\\-67.54758\\-113.724\\57\\-65.36326\\-109.8178\\57\\-64.06951\\-107.8646\\57\\-63.54353\\-105.9115\\57\\-62.69546\\-103.9584\\57\\-62.3795\\-102.0053\\57\\-62.48051\\-100.0521\\57\\-59.40808\\-98.09901\\57\\-56.91685\\-96.022\\57\\-54.96373\\-94.98411\\57\\-53.0106\\-94.59828\\57\\-51.463\\-96.14588\\57\\-49.4695\\-100.0521\\57\\-48.18835\\-102.0053\\57\\-46.40561\\-103.9584\\57\\-46.1443\\-105.9115\\57\\-47.15123\\-107.3838\\57\\-49.00197\\-109.8178\\57\\-51.36177\\-111.7709\\57\\-53.0106\\-113.028\\57\\-55.69615\\-115.6771\\57\\-57.09124\\-117.6303\\57\\-58.57701\\-121.5365\\57\\-58.65827\\-125.4428\\57\\-59.72578\\-127.3959\\57\\-61.83315\\-129.349\\57\\-62.77623\\-130.4002\\57\\-64.72935\\-132.3503\\57\\-66.68247\\-133.8494\\57\\-68.6356\\-134.4395\\57\\-70.58872\\-135.6902\\57\\-74.49497\\-136.5317\\57\\-76.4481\\-137.7746\\57\\-78.40122\\-138.4194\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "555" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-37.3856\\-131.3248\\57\\-39.33873\\-130.3488\\57\\-41.29185\\-129.881\\57\\-42.24237\\-129.349\\57\\-43.24498\\-127.8451\\57\\-43.24498\\-127.2055\\57\\-41.29185\\-126.3651\\57\\-39.33873\\-126.9625\\57\\-36.67352\\-129.349\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "19" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "556" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-29.5731\\-204.0744\\57\\-30.52669\\-203.5678\\57\\-31.52623\\-202.4644\\57\\-33.47935\\-202.7599\\57\\-37.3856\\-202.314\\57\\-43.24498\\-202.3007\\57\\-45.1981\\-202.2593\\57\\-46.20456\\-201.6146\\57\\-46.62177\\-199.6615\\57\\-45.1981\\-198.1845\\57\\-44.31238\\-197.7084\\57\\-43.24498\\-197.3553\\57\\-37.3856\\-197.3553\\57\\-35.43248\\-198.185\\57\\-33.47935\\-199.9122\\57\\-31.52623\\-200.8357\\57\\-29.5731\\-201.4465\\57\\-26.13131\\-203.5678\\57\\-27.61998\\-204.6022\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "557" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "11.44252\\-131.3397\\57\\12.1908\\-129.349\\57\\13.39565\\-128.7047\\57\\15.34877\\-126.9433\\57\\17.3019\\-124.66\\57\\19.25502\\-122.7814\\57\\20.12206\\-123.4896\\57\\19.25502\\-124.7782\\57\\18.617\\-125.4428\\57\\18.13994\\-127.3959\\57\\17.3019\\-128.3806\\57\\15.34877\\-130.0535\\57\\13.39565\\-131.3098\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "558" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "27.06752\\-149.785\\57\\26.64613\\-148.8803\\57\\26.94545\\-146.9271\\57\\29.02065\\-144.6688\\57\\29.71819\\-144.974\\57\\30.79987\\-146.9271\\57\\29.87691\\-148.8803\\57\\29.02065\\-150.1111\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "17" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "559" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "30.97377\\-133.8261\\57\\29.17256\\-133.2553\\57\\28.48097\\-131.3021\\57\\28.28303\\-129.349\\57\\28.67812\\-125.4428\\57\\29.02065\\-125.0814\\57\\30.97377\\-124.689\\57\\31.99473\\-125.4428\\57\\32.9269\\-126.4681\\57\\34.88002\\-127.2672\\57\\36.83315\\-127.3433\\57\\38.78627\\-128.943\\57\\39.03376\\-129.349\\57\\37.97247\\-131.3021\\57\\36.83315\\-132.2469\\57\\34.88002\\-133.5592\\57\\32.9269\\-133.8163\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "560" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-215.5027\\57\\52.45815\\-214.4763\\57\\50.4562\\-213.3334\\57\\48.5519\\-212.3467\\57\\43.69069\\-207.474\\57\\42.3357\\-205.5209\\57\\42.3357\\-203.5678\\57\\41.7287\\-201.6146\\57\\40.7394\\-200.5943\\57\\38.78627\\-201.4362\\57\\37.24005\\-201.6146\\57\\36.9971\\-203.5678\\57\\36.65201\\-203.5678\\57\\36.79559\\-201.6146\\57\\37.79396\\-199.6615\\57\\39.61868\\-197.7084\\57\\41.47309\\-193.8021\\57\\42.06436\\-191.849\\57\\42.78798\\-189.8959\\57\\44.64565\\-187.6722\\57\\48.5519\\-185.8026\\57\\52.45815\\-185.1558\\57\\54.41127\\-185.0469\\57\\58.31752\\-185.3266\\57\\60.27065\\-186.5573\\57\\62.22377\\-187.4768\\57\\64.1769\\-188.8362\\57\\66.13003\\-189.6711\\57\\68.08315\\-190.269\\57\\70.29919\\-191.849\\57\\71.9894\\-194.48\\57\\72.7169\\-195.7553\\57\\73.96577\\-199.6615\\57\\76.35094\\-201.6146\\57\\77.60129\\-203.5678\\57\\75.89565\\-205.1145\\57\\73.94253\\-206.6359\\57\\73.30128\\-207.474\\57\\72.61146\\-209.4271\\57\\71.9894\\-210.1423\\57\\68.82684\\-213.3334\\57\\68.08315\\-213.9911\\57\\66.13003\\-214.7923\\57\\64.44138\\-215.2865\\57\\62.22377\\-216.1798\\57\\60.27065\\-216.556\\57\\58.31752\\-216.2631\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "561" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "68.08315\\-135.4789\\57\\66.13003\\-134.5018\\57\\62.22377\\-133.5027\\57\\60.27065\\-132.5711\\57\\56.3644\\-131.5463\\57\\54.41127\\-130.6412\\57\\52.45815\\-130.0234\\57\\50.50502\\-128.9241\\57\\49.03408\\-127.3959\\57\\47.97258\\-125.4428\\57\\48.13596\\-121.5365\\57\\47.59927\\-119.5834\\57\\46.59877\\-117.7109\\57\\45.38562\\-115.6771\\57\\39.4896\\-109.8178\\57\\38.2627\\-107.8646\\57\\38.40263\\-105.9115\\57\\38.78627\\-105.1655\\57\\39.6823\\-103.9584\\57\\40.7394\\-103.1932\\57\\41.90129\\-102.0053\\57\\42.69252\\-100.9213\\57\\43.5794\\-100.0521\\57\\44.64565\\-99.31628\\57\\46.59877\\-98.26917\\57\\48.5519\\-98.72641\\57\\50.50502\\-98.98483\\57\\52.45815\\-99.02254\\57\\53.88921\\-100.0521\\57\\54.26266\\-102.0053\\57\\54.95257\\-103.9584\\57\\55.83226\\-105.9115\\57\\57.0066\\-107.8646\\57\\58.34024\\-109.8178\\57\\59.17631\\-111.7709\\57\\62.76315\\-115.6771\\57\\63.63069\\-117.6303\\57\\65.38686\\-119.5834\\57\\67.53093\\-121.5365\\57\\68.08315\\-122.4201\\57\\69.03488\\-123.4896\\57\\70.03628\\-124.2236\\57\\71.9894\\-125.4195\\57\\73.98128\\-127.3959\\57\\75.22981\\-129.349\\57\\74.94495\\-131.3021\\57\\73.3299\\-133.2553\\57\\71.9894\\-134.5958\\57\\70.03628\\-135.9393\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "562" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "107.1457\\-214.1324\\57\\106.2667\\-213.3334\\57\\106.3846\\-211.3803\\57\\106.9713\\-209.4271\\57\\109.0988\\-207.5978\\57\\111.0519\\-208.5436\\57\\112.4792\\-209.4271\\57\\113.005\\-210.4953\\57\\113.2492\\-211.3803\\57\\112.6754\\-213.3334\\57\\111.0519\\-214.4531\\57\\109.0988\\-214.4628\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002273" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "563" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "113.005\\-197.7898\\57\\111.2648\\-195.7553\\57\\110.8855\\-193.8021\\57\\110.3773\\-189.8959\\57\\110.203\\-187.9428\\57\\110.182\\-185.9896\\57\\109.6272\\-184.0365\\57\\108.7097\\-182.0834\\57\\108.6673\\-180.1303\\57\\107.8044\\-178.1771\\57\\106.7804\\-176.224\\57\\106.7092\\-174.2709\\57\\105.9117\\-172.3178\\57\\104.8381\\-170.3646\\57\\104.7545\\-168.4115\\57\\103.2394\\-165.9939\\57\\101.5462\\-162.5521\\57\\100.1316\\-160.599\\57\\99.69697\\-158.6459\\57\\98.38313\\-156.6928\\57\\98.22852\\-154.7396\\57\\100.1426\\-152.7865\\57\\101.2863\\-151.0477\\57\\103.2394\\-149.8434\\57\\105.1793\\-150.8334\\57\\107.1457\\-152.3463\\57\\109.0988\\-153.2748\\57\\111.1237\\-154.7396\\57\\113.0559\\-156.6928\\57\\114.9582\\-158.5009\\57\\117.3593\\-160.599\\57\\118.4512\\-162.5521\\57\\118.5086\\-164.5053\\57\\119.5811\\-166.4584\\57\\121.0069\\-168.4115\\57\\122.8594\\-172.3178\\57\\123.0053\\-174.2709\\57\\122.5015\\-176.224\\57\\122.4994\\-178.1771\\57\\122.8573\\-180.1303\\57\\122.7788\\-182.0834\\57\\122.2081\\-184.0365\\57\\120.8175\\-186.6976\\57\\120.4373\\-187.9428\\57\\118.8644\\-190.8267\\57\\118.445\\-191.849\\57\\118.2116\\-193.8021\\57\\117.7492\\-195.7553\\57\\116.9113\\-196.651\\57\\114.9582\\-198.1654\\57" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "13" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "564" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-115.5106\\-188.0628\\59\\-116.8093\\-185.9896\\59\\-117.4637\\-185.1758\\59\\-117.9774\\-184.0365\\59\\-117.4637\\-182.991\\59\\-116.2583\\-182.0834\\59\\-115.5106\\-181.7095\\59\\-114.2514\\-182.0834\\59\\-113.5575\\-182.6693\\59\\-113.0878\\-184.0365\\59\\-112.6028\\-185.9896\\59\\-112.6312\\-187.9428\\59\\-113.5575\\-188.7715\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "25" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "565" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.7427\\-172.3178\\59\\-115.4032\\-170.3646\\59\\-115.6592\\-168.4115\\59\\-115.3069\\-166.4584\\59\\-114.1964\\-162.5521\\59\\-111.772\\-158.6459\\59\\-107.9104\\-154.7396\\59\\-106.3934\\-152.7865\\59\\-103.7918\\-150.205\\59\\-101.8387\\-148.9039\\59\\-99.8856\\-148.2484\\59\\-99.29351\\-148.8803\\59\\-98.84556\\-150.8334\\59\\-98.2143\\-152.7865\\59\\-98.02721\\-154.7396\\59\\-98.7999\\-156.6928\\59\\-101.8476\\-160.599\\59\\-102.9691\\-162.5521\\59\\-103.7918\\-163.8111\\59\\-106.001\\-166.4584\\59\\-107.6981\\-169.2029\\59\\-108.2372\\-170.3646\\59\\-109.4961\\-172.3178\\59\\-109.6512\\-172.9107\\59\\-111.6043\\-173.6583\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "566" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-82.30747\\-138.0869\\59\\-83.31659\\-137.1615\\59\\-84.20842\\-135.2084\\59\\-84.0368\\-133.2553\\59\\-83.04121\\-131.3021\\59\\-80.35435\\-128.3569\\59\\-75.47153\\-123.4896\\59\\-74.06451\\-121.5365\\59\\-73.00381\\-119.5834\\59\\-69.51916\\-115.6771\\59\\-68.15342\\-113.724\\59\\-67.02361\\-111.7709\\59\\-64.72935\\-109.0951\\59\\-63.85044\\-107.8646\\59\\-63.01195\\-105.9115\\59\\-62.36983\\-103.9584\\59\\-62.27938\\-102.0053\\59\\-61.48739\\-100.0521\\59\\-60.8231\\-99.43452\\59\\-58.86998\\-98.76606\\59\\-56.91685\\-97.32903\\59\\-54.96373\\-96.42985\\59\\-53.0106\\-96.9811\\59\\-52.39045\\-98.09901\\59\\-51.74002\\-100.0521\\59\\-51.05748\\-100.6625\\59\\-50.01532\\-102.0053\\59\\-48.07536\\-103.9584\\59\\-46.94894\\-105.9115\\59\\-47.82645\\-107.8646\\59\\-49.7305\\-109.8178\\59\\-54.96373\\-114.9295\\59\\-57.53114\\-117.6303\\59\\-58.19268\\-119.5834\\59\\-58.65827\\-121.5365\\59\\-58.69559\\-123.4896\\59\\-59.05698\\-125.4428\\59\\-60.26022\\-127.3959\\59\\-60.8231\\-127.8962\\59\\-62.84711\\-129.349\\59\\-62.95933\\-131.3021\\59\\-62.66486\\-133.2553\\59\\-64.72935\\-133.9227\\59\\-67.17075\\-135.2084\\59\\-68.6356\\-135.8706\\59\\-70.58872\\-136.5042\\59\\-74.49497\\-136.0629\\59\\-76.4481\\-136.4898\\59\\-78.40122\\-137.733\\59\\-80.35435\\-138.3783\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "567" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.31752\\-215.4493\\59\\56.3644\\-214.9825\\59\\54.41127\\-214.8189\\59\\52.45815\\-214.096\\59\\50.50502\\-212.8054\\59\\48.5519\\-212.1182\\59\\46.59877\\-210.4085\\59\\43.69069\\-207.474\\59\\42.3357\\-205.5209\\59\\42.3357\\-203.5678\\59\\41.61116\\-201.6146\\59\\40.7394\\-200.7513\\59\\39.17176\\-201.6146\\59\\38.78627\\-201.969\\59\\37.80488\\-203.5678\\59\\36.83315\\-204.5206\\59\\35.74265\\-203.5678\\59\\36.83315\\-201.5434\\59\\37.74559\\-199.6615\\59\\39.61868\\-197.7084\\59\\40.50368\\-195.7553\\59\\41.63691\\-193.8021\\59\\42.346\\-191.849\\59\\43.45207\\-189.8959\\59\\45.4502\\-187.9428\\59\\46.59877\\-186.9662\\59\\48.5519\\-185.8152\\59\\50.50502\\-185.8026\\59\\52.45815\\-185.1382\\59\\54.41127\\-184.7287\\59\\56.3644\\-185.2207\\59\\58.31752\\-185.8676\\59\\60.27065\\-187.0801\\59\\64.1769\\-190.444\\59\\67.30521\\-191.849\\59\\68.08315\\-192.3425\\59\\70.03628\\-194.2677\\59\\72.29816\\-197.7084\\59\\72.97164\\-199.6615\\59\\73.94253\\-200.6324\\59\\75.89565\\-201.9965\\59\\77.36342\\-203.5678\\59\\75.89565\\-205.6023\\59\\73.94253\\-205.8051\\59\\71.99789\\-207.474\\59\\70.77996\\-209.4271\\59\\68.8995\\-211.3803\\59\\66.13003\\-213.9958\\59\\64.1769\\-214.6074\\59\\62.22377\\-215.0718\\59\\60.27065\\-215.7367\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "568" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "66.13003\\-133.467\\59\\64.1769\\-132.5329\\59\\60.27065\\-131.5044\\59\\58.31752\\-130.5988\\59\\54.41127\\-129.8493\\59\\52.88194\\-129.349\\59\\50.50502\\-128.3725\\59\\49.53407\\-127.3959\\59\\47.87188\\-125.4428\\59\\47.90942\\-123.4896\\59\\48.11721\\-121.5365\\59\\47.36923\\-119.5834\\59\\46.1734\\-117.6303\\59\\45.38562\\-115.6771\\59\\41.45285\\-111.7709\\59\\39.68587\\-109.8178\\59\\39.3745\\-107.8646\\59\\40.0391\\-105.9115\\59\\40.7394\\-105.0863\\59\\45.78243\\-100.0521\\59\\46.59877\\-99.45161\\59\\50.50502\\-99.30975\\59\\52.45815\\-99.6133\\59\\52.97175\\-100.0521\\59\\54.7578\\-103.9584\\59\\55.52236\\-105.9115\\59\\56.99943\\-107.8646\\59\\58.79999\\-109.8178\\59\\59.61066\\-111.7709\\59\\61.02788\\-113.724\\59\\63.14532\\-115.6771\\59\\64.1769\\-117.0504\\59\\66.13003\\-119.1433\\59\\70.03628\\-123.0563\\59\\72.9369\\-125.4428\\59\\74.89597\\-127.3959\\59\\76.60951\\-129.349\\59\\76.44379\\-131.3021\\59\\73.94253\\-133.9996\\59\\71.9894\\-134.942\\59\\70.03628\\-134.5754\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002272" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "57" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "569" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "114.9582\\-198.5635\\59\\113.2231\\-197.7084\\59\\112.2065\\-195.7553\\59\\112.1738\\-191.849\\59\\111.7973\\-189.8959\\59\\111.2761\\-187.9428\\59\\111.2221\\-185.9896\\59\\110.643\\-184.0365\\59\\110.2204\\-182.0834\\59\\110.1995\\-180.1303\\59\\109.6712\\-178.1771\\59\\108.7157\\-176.224\\59\\108.3914\\-174.2709\\59\\107.7212\\-172.3178\\59\\106.8481\\-170.3646\\59\\106.7689\\-168.4115\\59\\105.5425\\-166.4584\\59\\104.0621\\-164.5053\\59\\103.0718\\-162.5521\\59\\101.635\\-160.599\\59\\101.0615\\-158.6459\\59\\99.7663\\-156.6928\\59\\99.44497\\-154.7396\\59\\100.3423\\-152.7865\\59\\100.8424\\-150.8334\\59\\101.2863\\-150.2281\\59\\103.2394\\-148.5173\\59\\105.1925\\-149.038\\59\\107.1457\\-150.4002\\59\\109.0988\\-151.1643\\59\\111.0519\\-152.3877\\59\\113.005\\-153.2965\\59\\114.481\\-154.7396\\59\\114.9582\\-155.5031\\59\\116.1698\\-156.6928\\59\\116.9113\\-157.1426\\59\\118.8644\\-158.8438\\59\\120.2762\\-160.599\\59\\120.5463\\-162.5521\\59\\120.591\\-164.5053\\59\\121.3614\\-166.4584\\59\\123.0233\\-168.4115\\59\\123.8009\\-170.3646\\59\\124.7238\\-175.0196\\59\\125.0712\\-176.224\\59\\125.0493\\-178.1771\\59\\124.7763\\-180.1303\\59\\124.7553\\-182.0834\\59\\124.5499\\-185.9896\\59\\123.2158\\-187.9428\\59\\122.7707\\-188.2339\\59\\120.8175\\-190.4322\\59\\119.7304\\-191.849\\59\\119.2282\\-193.8021\\59\\119.3035\\-195.7553\\59\\118.8644\\-196.444\\59\\117.098\\-197.7084\\59" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "30" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "570" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-113.5575\\-169.5667\\61\\-114.1807\\-168.4115\\61\\-114.4153\\-166.4584\\61\\-114.0014\\-164.5053\\61\\-113.6929\\-162.5521\\61\\-112.9422\\-160.599\\61\\-111.6043\\-158.9096\\61\\-111.2501\\-158.6459\\61\\-109.4649\\-156.6928\\61\\-108.7501\\-154.7396\\61\\-107.6981\\-152.9691\\61\\-106.26\\-150.8334\\61\\-103.7918\\-148.355\\61\\-101.8387\\-147.1837\\61\\-99.8856\\-146.2306\\61\\-97.93247\\-146.0455\\61\\-97.50646\\-146.9271\\61\\-97.68156\\-148.8803\\61\\-98.20301\\-150.8334\\61\\-98.08109\\-152.7865\\61\\-98.82388\\-154.7396\\61\\-99.8856\\-156.189\\61\\-102.3309\\-158.6459\\61\\-103.7918\\-160.2911\\61\\-104.3259\\-160.599\\61\\-105.745\\-162.0879\\61\\-107.6981\\-165.1854\\61\\-108.2639\\-166.4584\\61\\-109.6512\\-168.8607\\61\\-111.5311\\-170.3646\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "571" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-82.30747\\-137.9058\\61\\-83.35047\\-137.1615\\61\\-84.2606\\-136.2871\\61\\-85.67119\\-135.2084\\61\\-85.11585\\-133.2553\\61\\-83.35229\\-131.3021\\61\\-81.84897\\-129.349\\61\\-80.46617\\-127.3959\\61\\-76.4481\\-123.3676\\61\\-73.39755\\-119.5834\\61\\-71.57054\\-117.6303\\61\\-70.12517\\-115.6771\\61\\-69.02495\\-113.724\\61\\-66.68247\\-111.1386\\61\\-65.60365\\-109.8178\\61\\-64.16064\\-107.8646\\61\\-62.33233\\-103.9584\\61\\-62.01391\\-102.0053\\61\\-60.8231\\-100.7299\\61\\-58.86998\\-99.24132\\61\\-54.96373\\-97.25881\\61\\-53.77568\\-98.09901\\61\\-53.53557\\-100.0521\\61\\-51.64204\\-102.0053\\61\\-49.28654\\-103.9584\\61\\-48.18953\\-105.9115\\61\\-48.09219\\-107.8646\\61\\-49.73826\\-109.8178\\61\\-57.71002\\-117.6303\\61\\-58.96472\\-119.5834\\61\\-59.44149\\-121.5365\\61\\-59.45258\\-123.4896\\61\\-59.64269\\-125.4428\\61\\-60.6053\\-127.3959\\61\\-62.48483\\-129.349\\61\\-61.60308\\-131.3021\\61\\-62.64773\\-133.2553\\61\\-66.68247\\-134.6328\\61\\-68.6356\\-135.9103\\61\\-70.58872\\-136.4859\\61\\-72.54185\\-136.8295\\61\\-76.4481\\-135.5449\\61\\-78.40122\\-136.3909\\61\\-80.35435\\-137.6835\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "572" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-212.5179\\61\\48.5519\\-211.3726\\61\\46.59877\\-210.4085\\61\\43.69069\\-207.474\\61\\42.3357\\-205.5209\\61\\42.3357\\-203.5678\\61\\41.19163\\-201.6146\\61\\40.7394\\-201.1961\\61\\38.78627\\-202.8874\\61\\36.83315\\-205.1005\\61\\34.88002\\-205.6029\\61\\34.77573\\-205.5209\\61\\35.20325\\-203.5678\\61\\36.83315\\-201.9263\\61\\37.26398\\-201.6146\\61\\37.83802\\-199.6615\\61\\39.62399\\-197.7084\\61\\40.50368\\-195.7553\\61\\41.63691\\-193.8021\\61\\42.3357\\-191.849\\61\\43.66439\\-189.8959\\61\\46.59877\\-186.9709\\61\\48.5519\\-185.8152\\61\\50.50502\\-185.7902\\61\\52.45815\\-185.1074\\61\\54.41127\\-184.7348\\61\\56.3644\\-185.1835\\61\\58.31752\\-185.8676\\61\\60.27065\\-187.085\\61\\64.1769\\-190.9659\\61\\65.27554\\-191.849\\61\\67.47593\\-193.8021\\61\\69.24829\\-195.7553\\61\\70.80082\\-197.7084\\61\\71.63245\\-199.6615\\61\\71.9894\\-200.069\\61\\73.94253\\-201.1882\\61\\75.89565\\-202.5746\\61\\76.83546\\-203.5678\\61\\76.55699\\-205.5209\\61\\75.89565\\-206.1146\\61\\73.94253\\-205.7462\\61\\71.9894\\-205.7669\\61\\70.03628\\-207.4428\\61\\68.82153\\-209.4271\\61\\66.13003\\-212.1661\\61\\64.1769\\-213.5512\\61\\62.22377\\-214.1983\\61\\60.27065\\-214.5606\\61\\56.3644\\-214.5777\\61\\54.41127\\-214.2772\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "573" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "69.67996\\-133.2553\\61\\68.08315\\-132.5561\\61\\64.1769\\-131.4242\\61\\62.22377\\-130.554\\61\\58.31752\\-129.5285\\61\\54.41127\\-128.6424\\61\\52.45815\\-128.0626\\61\\50.50502\\-126.9843\\61\\49.01284\\-125.4428\\61\\48.25893\\-123.4896\\61\\48.13596\\-121.5365\\61\\47.36923\\-119.5834\\61\\46.1734\\-117.6303\\61\\45.38562\\-115.6771\\61\\41.47802\\-111.7709\\61\\40.18544\\-109.8178\\61\\40.51178\\-107.8646\\61\\41.84772\\-105.9115\\61\\46.59877\\-101.145\\61\\48.5519\\-100.6336\\61\\50.50502\\-100.409\\61\\52.45815\\-101.0347\\61\\53.33276\\-102.0053\\61\\54.72609\\-103.9584\\61\\55.521\\-105.9115\\61\\56.99219\\-107.8646\\61\\58.9491\\-109.8178\\61\\60.29336\\-111.7709\\61\\61.48358\\-113.724\\61\\63.67159\\-115.6771\\61\\65.18204\\-117.6303\\61\\70.03628\\-122.5239\\61\\71.83839\\-123.4896\\61\\73.94253\\-124.9585\\61\\76.38796\\-127.3959\\61\\77.87403\\-129.349\\61\\77.23916\\-131.3021\\61\\75.89565\\-133.2963\\61\\73.94253\\-134.5377\\61\\71.9894\\-134.4384\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002271" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "574" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "114.9582\\-198.0675\\61\\114.4521\\-197.7084\\61\\113.3216\\-195.7553\\61\\112.883\\-193.8021\\61\\112.9074\\-189.8959\\61\\112.3743\\-185.9896\\61\\111.3435\\-182.0834\\61\\111.3082\\-180.1303\\61\\110.9853\\-178.1771\\61\\109.8442\\-174.2709\\61\\109.0761\\-172.3178\\61\\108.4047\\-168.4115\\61\\107.3022\\-166.4584\\61\\105.6228\\-164.5053\\61\\105.0018\\-162.5521\\61\\103.6037\\-160.599\\61\\103.1514\\-158.6459\\61\\101.7364\\-156.6928\\61\\100.7274\\-154.7396\\61\\100.6405\\-152.7865\\61\\100.8333\\-150.8334\\61\\101.4678\\-148.8803\\61\\103.2394\\-147.1394\\61\\105.1925\\-147.2144\\61\\107.1457\\-148.454\\61\\109.0988\\-149.1675\\61\\111.0519\\-150.3967\\61\\113.005\\-151.0921\\61\\114.9582\\-152.2664\\61\\116.7026\\-154.7396\\61\\118.8644\\-157.1878\\61\\120.8268\\-158.6459\\61\\122.7096\\-160.599\\61\\122.7137\\-164.5053\\61\\122.8088\\-166.4584\\61\\124.9275\\-170.3646\\61\\125.493\\-172.3178\\61\\125.7796\\-174.2709\\61\\126.9529\\-176.224\\61\\127.7191\\-178.1771\\61\\127.8705\\-180.1303\\61\\127.8852\\-182.0834\\61\\128.63\\-183.5482\\61\\129.0762\\-185.9896\\61\\128.63\\-187.166\\61\\127.9325\\-187.9428\\61\\126.9821\\-189.8959\\61\\126.6769\\-190.2038\\61\\124.6102\\-189.8959\\61\\122.7707\\-190.4609\\61\\120.8175\\-192.2567\\61\\119.9885\\-193.8021\\61\\119.8828\\-195.7553\\61\\118.8644\\-197.006\\61\\116.9113\\-197.5983\\61" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "9" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "575" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-111.6043\\-168.1959\\63\\-113.16\\-166.4584\\63\\-112.8271\\-164.5053\\63\\-112.8069\\-162.5521\\63\\-111.6043\\-160.4818\\63\\-109.6512\\-160.1921\\63\\-108.6747\\-160.599\\63\\-108.3084\\-162.5521\\63\\-109.6512\\-165.595\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "75" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "576" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-158.4628\\63\\-107.3915\\-156.6928\\63\\-107.8949\\-154.7396\\63\\-107.0042\\-150.8334\\63\\-106.192\\-148.8803\\63\\-103.7918\\-146.4839\\63\\-101.8387\\-145.166\\63\\-99.8856\\-144.3881\\63\\-98.0834\\-143.0209\\63\\-95.97935\\-141.0445\\63\\-94.02622\\-140.5857\\63\\-92.0731\\-138.981\\63\\-88.41099\\-135.2084\\63\\-86.21372\\-133.1399\\63\\-84.2606\\-131.1801\\63\\-83.07928\\-129.349\\63\\-81.3736\\-127.3959\\63\\-78.40122\\-124.654\\63\\-75.50254\\-121.5365\\63\\-74.00977\\-119.5834\\63\\-72.67828\\-117.6303\\63\\-71.04365\\-115.6771\\63\\-69.26582\\-113.724\\63\\-67.31233\\-111.7709\\63\\-65.99836\\-109.8178\\63\\-65.0571\\-107.8646\\63\\-63.48211\\-105.9115\\63\\-62.29661\\-103.9584\\63\\-61.66226\\-102.0053\\63\\-60.8231\\-101.2176\\63\\-58.86998\\-99.68514\\63\\-56.91685\\-98.64154\\63\\-54.96373\\-97.86329\\63\\-54.70081\\-98.09901\\63\\-53.83128\\-100.0521\\63\\-52.39351\\-102.0053\\63\\-50.22296\\-103.9584\\63\\-49.50128\\-105.9115\\63\\-48.92744\\-107.8646\\63\\-49.77958\\-109.8178\\63\\-51.7029\\-111.7709\\63\\-55.71532\\-115.6771\\63\\-57.85272\\-117.6303\\63\\-59.6208\\-119.5834\\63\\-60.08692\\-121.5365\\63\\-60.02025\\-123.4896\\63\\-59.73656\\-125.4428\\63\\-59.97461\\-127.3959\\63\\-61.44081\\-129.349\\63\\-62.02985\\-131.3021\\63\\-62.77623\\-131.9763\\63\\-64.72935\\-132.4932\\63\\-66.68247\\-133.7606\\63\\-68.6356\\-134.4646\\63\\-70.58872\\-135.764\\63\\-72.54185\\-136.4498\\63\\-74.49497\\-136.741\\63\\-75.60588\\-135.2084\\63\\-76.4481\\-134.3289\\63\\-78.40122\\-134.8192\\63\\-80.35435\\-136.3615\\63\\-82.30747\\-137.409\\63\\-84.2606\\-137.3359\\63\\-86.21372\\-137.3956\\63\\-88.16685\\-139.168\\63\\-90.11997\\-139.9716\\63\\-93.18638\\-143.0209\\63\\-94.02622\\-143.4724\\63\\-95.97935\\-145.3858\\63\\-96.6422\\-146.9271\\63\\-97.0855\\-148.8803\\63\\-99.16798\\-152.7865\\63\\-99.8856\\-153.888\\63\\-101.8387\\-155.7923\\63\\-103.7918\\-157.5191\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "577" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-213.4281\\63\\50.50502\\-212.5071\\63\\48.5519\\-211.2718\\63\\46.59877\\-210.4085\\63\\43.69069\\-207.474\\63\\42.3357\\-205.5209\\63\\42.3357\\-203.5678\\63\\40.79733\\-201.6146\\63\\40.67429\\-201.6146\\63\\38.6605\\-203.5678\\63\\37.46844\\-205.5209\\63\\36.83315\\-206.1701\\63\\34.88002\\-206.5412\\63\\33.57233\\-205.5209\\63\\34.59734\\-203.5678\\63\\36.83315\\-202.2277\\63\\37.53158\\-201.6146\\63\\38.02944\\-199.6615\\63\\39.62925\\-197.7084\\63\\40.50368\\-195.7553\\63\\41.63691\\-193.8021\\63\\42.3357\\-191.849\\63\\43.66439\\-189.8959\\63\\46.59877\\-186.9851\\63\\48.5519\\-185.841\\63\\50.50502\\-185.8026\\63\\52.45815\\-185.4843\\63\\54.41127\\-185.3611\\63\\56.3644\\-185.4843\\63\\58.31752\\-185.9089\\63\\60.27065\\-187.0938\\63\\67.05598\\-193.8021\\63\\68.08315\\-195.7083\\63\\70.33286\\-199.6615\\63\\71.9894\\-201.1725\\63\\73.94253\\-202.1061\\63\\75.39468\\-203.5678\\63\\74.84728\\-205.5209\\63\\73.94253\\-205.9103\\63\\71.9894\\-205.2169\\63\\70.03628\\-205.7116\\63\\68.08315\\-207.3245\\63\\66.495\\-209.4271\\63\\64.88036\\-211.3803\\63\\64.1769\\-211.9607\\63\\62.22377\\-212.8451\\63\\60.27065\\-213.5686\\63\\58.31752\\-213.7904\\63\\56.3644\\-213.7904\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "578" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "73.94253\\-133.9639\\63\\71.9894\\-132.8632\\63\\70.03628\\-132.0603\\63\\68.08315\\-131.4242\\63\\66.13003\\-130.4782\\63\\64.1769\\-129.7349\\63\\62.22377\\-129.3717\\63\\60.27065\\-128.5733\\63\\58.31752\\-128.0581\\63\\54.41127\\-127.4656\\63\\52.45815\\-126.558\\63\\50.50502\\-124.9902\\63\\49.3796\\-123.4896\\63\\47.39071\\-119.5834\\63\\46.19238\\-117.6303\\63\\45.38562\\-115.6771\\63\\42.69252\\-112.9273\\63\\41.66576\\-111.7709\\63\\41.38868\\-109.8178\\63\\42.06026\\-107.8646\\63\\42.69252\\-107.0627\\63\\46.59877\\-103.1527\\63\\48.5519\\-101.8055\\63\\50.50502\\-101.087\\63\\52.45815\\-101.6461\\63\\54.6931\\-103.9584\\63\\55.48501\\-105.9115\\63\\56.98487\\-107.8646\\63\\58.94188\\-109.8178\\63\\62.22377\\-113.3223\\63\\64.73916\\-115.6771\\63\\66.13003\\-117.249\\63\\70.03628\\-121.0711\\63\\73.94253\\-123.3935\\63\\77.84878\\-127.2584\\63\\79.91204\\-129.349\\63\\79.38874\\-131.3021\\63\\77.84878\\-132.3941\\63\\77.12567\\-133.2553\\63\\75.89565\\-134.0691\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002270" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "579" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "114.9582\\-195.872\\63\\113.8991\\-193.8021\\63\\113.7558\\-191.849\\63\\114.171\\-189.8959\\63\\114.164\\-187.9428\\63\\113.8335\\-185.9896\\63\\113.0726\\-184.0365\\63\\112.4231\\-180.1303\\63\\112.2156\\-178.1771\\63\\111.8848\\-176.224\\63\\111.1339\\-174.2709\\63\\110.3739\\-170.3646\\63\\109.818\\-168.4115\\63\\108.2551\\-166.4584\\63\\107.2964\\-164.5053\\63\\106.9803\\-162.5521\\63\\105.624\\-160.599\\63\\105.1689\\-158.6459\\63\\103.7277\\-156.6928\\63\\102.1624\\-154.7396\\63\\101.7599\\-152.7865\\63\\101.2341\\-150.8334\\63\\100.8516\\-148.8803\\63\\101.3634\\-146.9271\\63\\100.9608\\-144.974\\63\\101.2863\\-143.7607\\63\\103.2394\\-144.7853\\63\\105.1925\\-145.1676\\63\\107.1457\\-146.4839\\63\\109.0988\\-147.1525\\63\\111.0519\\-148.3958\\63\\113.005\\-149.0872\\63\\114.9582\\-149.2635\\63\\116.4893\\-150.8334\\63\\116.8713\\-152.7865\\63\\117.9087\\-154.7396\\63\\118.8644\\-155.8098\\63\\120.8175\\-157.2834\\63\\123.4347\\-158.6459\\63\\124.7238\\-159.9524\\63\\125.1435\\-160.599\\63\\124.9867\\-162.5521\\63\\124.201\\-164.5053\\63\\123.9286\\-166.4584\\63\\124.7238\\-167.9628\\63\\126.4385\\-170.3646\\63\\126.7862\\-172.3178\\63\\126.9718\\-174.2709\\63\\127.7788\\-176.224\\63\\129.4036\\-178.1771\\63\\129.6958\\-180.1303\\63\\129.7053\\-182.0834\\63\\129.8941\\-184.0365\\63\\129.9236\\-185.9896\\63\\129.1987\\-187.9428\\63\\127.9061\\-189.8959\\63\\126.6769\\-191.2031\\63\\124.7238\\-191.3278\\63\\122.7707\\-192.1153\\63\\120.8714\\-193.8021\\63\\118.8644\\-195.9871\\63\\116.9113\\-196.545\\63" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "71" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "580" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-154.6176\\65\\-106.7688\\-152.7865\\65\\-106.9422\\-150.8334\\65\\-106.914\\-148.8803\\65\\-105.8147\\-146.9271\\65\\-103.7918\\-144.8622\\65\\-101.8387\\-143.5942\\65\\-99.8856\\-142.5844\\65\\-97.93247\\-140.7039\\65\\-95.97935\\-139.7006\\65\\-94.02622\\-138.2869\\65\\-92.66909\\-137.1615\\65\\-90.11997\\-134.6069\\65\\-88.16685\\-133.2476\\65\\-86.21372\\-132.1466\\65\\-85.37422\\-131.3021\\65\\-83.80487\\-129.349\\65\\-82.47636\\-127.3959\\65\\-79.88065\\-125.4428\\65\\-78.06242\\-123.4896\\65\\-75.21043\\-119.5834\\65\\-73.50376\\-117.6303\\65\\-67.67513\\-111.7709\\65\\-66.43499\\-109.8178\\65\\-65.32808\\-107.8646\\65\\-63.69056\\-105.9115\\65\\-62.77623\\-104.3308\\65\\-61.18118\\-102.0053\\65\\-60.8231\\-101.6587\\65\\-58.86998\\-100.8345\\65\\-56.91685\\-100.1553\\65\\-54.96373\\-100.2677\\65\\-53.79014\\-102.0053\\65\\-53.0106\\-102.5471\\65\\-51.57305\\-103.9584\\65\\-50.38139\\-107.8646\\65\\-50.06597\\-109.8178\\65\\-51.71413\\-111.7709\\65\\-53.71648\\-113.724\\65\\-55.82243\\-115.6771\\65\\-56.91685\\-116.5388\\65\\-58.86998\\-117.5769\\65\\-60.0944\\-119.5834\\65\\-60.83073\\-121.5365\\65\\-60.78495\\-123.4896\\65\\-59.35244\\-125.4428\\65\\-59.67282\\-127.3959\\65\\-60.8231\\-128.7553\\65\\-62.77623\\-130.7872\\65\\-64.72935\\-131.9307\\65\\-66.68247\\-132.8478\\65\\-68.6356\\-133.9578\\65\\-70.58872\\-134.4774\\65\\-72.54185\\-135.2008\\65\\-74.49497\\-136.2887\\65\\-76.4481\\-134.5899\\65\\-78.40122\\-134.0505\\65\\-80.35435\\-134.7939\\65\\-82.30747\\-136.3253\\65\\-84.2606\\-137.409\\65\\-86.21372\\-138.1381\\65\\-88.16685\\-139.6\\65\\-90.11997\\-140.8515\\65\\-92.30166\\-143.0209\\65\\-94.02622\\-144.3947\\65\\-96.57402\\-146.9271\\65\\-97.64086\\-148.8803\\65\\-99.22699\\-150.8334\\65\\-99.8856\\-151.5186\\65\\-101.6134\\-152.7865\\65\\-103.7918\\-154.5063\\65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "581" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-212.0713\\65\\46.59877\\-210.4085\\65\\43.69069\\-207.474\\65\\42.3357\\-205.5209\\65\\42.3357\\-203.5678\\65\\40.79733\\-201.6146\\65\\40.67429\\-201.6146\\65\\38.6605\\-203.5678\\65\\37.6721\\-205.5209\\65\\36.83315\\-206.3956\\65\\34.88002\\-206.6246\\65\\33.68754\\-205.5209\\65\\34.88002\\-203.8614\\65\\37.26133\\-201.6146\\65\\37.85279\\-199.6615\\65\\39.62399\\-197.7084\\65\\40.50368\\-195.7553\\65\\41.63691\\-193.8021\\65\\42.3357\\-191.849\\65\\43.66439\\-189.8959\\65\\46.59877\\-187.093\\65\\48.5519\\-186.3279\\65\\50.50502\\-185.841\\65\\56.3644\\-185.8152\\65\\58.31752\\-186.3815\\65\\60.27065\\-187.1496\\65\\63.13189\\-189.8959\\65\\67.05598\\-193.8021\\65\\68.1213\\-197.7084\\65\\69.02174\\-199.6615\\65\\70.03628\\-200.6649\\65\\71.9894\\-202.0585\\65\\73.94253\\-203.3193\\65\\73.94253\\-204.0646\\65\\72.60369\\-205.5209\\65\\71.9894\\-205.78\\65\\70.03628\\-205.2061\\65\\68.08315\\-205.3077\\65\\66.13003\\-207.217\\65\\64.1769\\-209.5698\\65\\62.53269\\-211.3803\\65\\60.27065\\-212.4293\\65\\58.31752\\-212.9174\\65\\52.45815\\-212.9367\\65\\50.50502\\-212.7872\\65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "582" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "75.89565\\-133.7521\\65\\73.94253\\-132.5635\\65\\71.9894\\-131.8375\\65\\70.03628\\-130.657\\65\\68.08315\\-130.0643\\65\\66.13003\\-128.8946\\65\\64.1769\\-128.1438\\65\\60.27065\\-127.4188\\65\\58.31752\\-126.6113\\65\\56.3644\\-126.0691\\65\\54.41127\\-125.7389\\65\\52.45815\\-124.8925\\65\\50.50502\\-123.0895\\65\\48.5519\\-120.9092\\65\\47.58477\\-119.5834\\65\\46.59877\\-117.7109\\65\\45.41793\\-115.6771\\65\\43.65527\\-113.724\\65\\42.33107\\-111.7709\\65\\42.53948\\-109.8178\\65\\43.88784\\-107.8646\\65\\46.59877\\-105.1442\\65\\50.50502\\-102.6649\\65\\52.45815\\-102.6024\\65\\54.41127\\-103.6975\\65\\54.67036\\-103.9584\\65\\55.48405\\-105.9115\\65\\57.01011\\-107.8646\\65\\58.95972\\-109.8178\\65\\61.0113\\-111.7709\\65\\62.22377\\-112.7841\\65\\64.1769\\-114.691\\65\\66.13003\\-116.2986\\65\\68.08315\\-117.6068\\65\\71.9894\\-120.7257\\65\\73.94253\\-122.5237\\65\\77.84878\\-126.3866\\65\\81.15725\\-129.349\\65\\81.75503\\-130.8434\\65\\82.22077\\-131.3021\\65\\82.34862\\-133.2553\\65\\81.75503\\-133.6434\\65\\79.6734\\-133.2553\\65\\77.84878\\-133.6806\\65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002269" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "59" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "583" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "116.9113\\-194.2482\\65\\116.3554\\-193.8021\\65\\115.1841\\-191.849\\65\\115.3645\\-189.8959\\65\\115.3645\\-187.9428\\65\\114.708\\-184.0365\\65\\114.6757\\-182.0834\\65\\113.4304\\-178.1771\\65\\113.1271\\-176.224\\65\\112.3352\\-172.3178\\65\\111.8184\\-170.3646\\65\\111.0746\\-168.4115\\65\\109.7037\\-166.4584\\65\\108.926\\-164.5053\\65\\108.4655\\-162.5521\\65\\107.6023\\-160.599\\65\\107.1457\\-159.8342\\65\\105.6605\\-156.6928\\65\\103.7769\\-154.7396\\65\\102.7094\\-152.7865\\65\\102.0706\\-150.8334\\65\\101.2863\\-148.8137\\65\\100.798\\-146.9271\\65\\100.0774\\-144.974\\65\\99.54241\\-143.0209\\65\\101.2863\\-141.1102\\65\\103.2394\\-142.6732\\65\\105.1925\\-143.5853\\65\\107.1457\\-144.6195\\65\\109.0988\\-145.134\\65\\111.0519\\-146.117\\65\\113.005\\-146.9887\\65\\116.9113\\-147.2856\\65\\118.1226\\-148.8803\\65\\118.0843\\-150.8334\\65\\118.3073\\-152.7865\\65\\119.3298\\-154.7396\\65\\120.8175\\-155.8598\\65\\122.7707\\-157.1181\\65\\124.7238\\-157.8426\\65\\125.5727\\-158.6459\\65\\126.9917\\-160.599\\65\\126.8123\\-162.5521\\65\\125.9716\\-164.5053\\65\\125.4381\\-166.4584\\65\\127.1074\\-168.4115\\65\\127.9494\\-170.3646\\65\\127.7625\\-172.3178\\65\\127.7625\\-174.2709\\65\\128.3825\\-176.224\\65\\129.6413\\-178.1771\\65\\129.761\\-180.1303\\65\\129.7494\\-184.0365\\65\\129.1559\\-185.9896\\65\\128.63\\-186.816\\65\\127.1409\\-189.8959\\65\\126.6769\\-190.3953\\65\\124.6511\\-191.849\\65\\120.8175\\-194.2286\\65" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "66" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "584" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-151.2519\\67\\-106.6428\\-148.8803\\67\\-106.2212\\-146.9271\\67\\-104.7447\\-144.974\\67\\-103.7918\\-143.9463\\67\\-101.8387\\-142.1671\\67\\-97.93247\\-139.1068\\67\\-95.97935\\-138.2699\\67\\-94.57886\\-137.1615\\67\\-92.0731\\-134.6381\\67\\-90.11997\\-132.8018\\67\\-88.16685\\-131.9716\\67\\-86.21372\\-130.5845\\67\\-83.3773\\-127.3959\\67\\-81.26292\\-125.4428\\67\\-78.40122\\-122.566\\67\\-77.4922\\-121.5365\\67\\-74.59043\\-117.6303\\67\\-70.58872\\-113.6843\\67\\-68.58219\\-111.7709\\67\\-65.386\\-107.8646\\67\\-64.72935\\-106.965\\67\\-62.7841\\-103.9584\\67\\-60.8231\\-102.7073\\67\\-58.86998\\-102.348\\67\\-56.91685\\-102.2943\\67\\-54.96373\\-102.8393\\67\\-53.26017\\-103.9584\\67\\-52.70728\\-105.9115\\67\\-52.04046\\-107.8646\\67\\-51.05748\\-109.7802\\67\\-51.8056\\-111.7709\\67\\-53.0106\\-112.8116\\67\\-54.96373\\-114.6601\\67\\-56.91685\\-116.2073\\67\\-58.86998\\-116.8203\\67\\-59.67232\\-117.6303\\67\\-60.38841\\-119.5834\\67\\-61.50722\\-121.5365\\67\\-62.77623\\-123.4349\\67\\-62.77623\\-123.6605\\67\\-60.8231\\-124.7845\\67\\-60.0225\\-125.4428\\67\\-59.98378\\-127.3959\\67\\-62.77623\\-130.2525\\67\\-64.72935\\-131.4507\\67\\-66.68247\\-132.5256\\67\\-68.6356\\-133.7935\\67\\-70.58872\\-133.657\\67\\-72.54185\\-133.9241\\67\\-74.49497\\-134.7404\\67\\-76.4481\\-135.2006\\67\\-78.40122\\-134.3248\\67\\-80.35435\\-134.0356\\67\\-82.30747\\-134.7476\\67\\-84.2606\\-136.3005\\67\\-86.21372\\-137.5989\\67\\-88.16685\\-138.5378\\67\\-88.7757\\-139.1146\\67\\-91.1926\\-141.0678\\67\\-97.06752\\-146.9271\\67\\-97.93247\\-147.8615\\67\\-99.18277\\-148.8803\\67\\-100.8684\\-150.8334\\67\\-101.8387\\-151.6697\\67\\-103.7918\\-152.4929\\67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "585" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-212.3467\\67\\43.69069\\-207.474\\67\\42.3357\\-205.5209\\67\\42.3357\\-203.5678\\67\\40.79733\\-201.6146\\67\\40.67429\\-201.6146\\67\\38.59381\\-203.5678\\67\\37.66188\\-205.5209\\67\\36.83315\\-206.3812\\67\\34.88002\\-206.7894\\67\\33.78938\\-205.5209\\67\\35.60873\\-203.5678\\67\\36.83315\\-201.5231\\67\\37.67612\\-199.6615\\67\\39.61868\\-197.7084\\67\\40.5524\\-195.7553\\67\\41.64687\\-193.8021\\67\\42.3357\\-191.849\\67\\43.67378\\-189.8959\\67\\44.64565\\-188.9287\\67\\46.59877\\-187.4545\\67\\50.50502\\-186.3173\\67\\52.45815\\-185.8026\\67\\56.3644\\-185.841\\67\\58.31752\\-186.8752\\67\\60.27065\\-187.4208\\67\\62.22377\\-189.0148\\67\\67.05598\\-193.8021\\67\\67.60354\\-195.7553\\67\\67.6123\\-197.7084\\67\\68.1216\\-199.6615\\67\\70.56822\\-201.6146\\67\\71.9894\\-202.6251\\67\\72.89543\\-203.5678\\67\\72.78532\\-205.5209\\67\\71.9894\\-206.2381\\67\\70.03628\\-205.8485\\67\\68.08315\\-204.6452\\67\\66.13003\\-205.5125\\67\\65.07094\\-207.474\\67\\62.22377\\-210.6942\\67\\60.27065\\-212.3995\\67\\58.31752\\-212.927\\67\\50.50502\\-212.9367\\67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "41" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "586" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "77.84878\\-132.9847\\67\\75.89565\\-132.4384\\67\\73.86964\\-131.3021\\67\\70.03628\\-129.8524\\67\\68.08315\\-128.5466\\67\\65.91772\\-127.3959\\67\\64.1769\\-126.7211\\67\\62.22377\\-126.2642\\67\\60.27065\\-126.0432\\67\\58.31752\\-125.4815\\67\\56.3644\\-124.5455\\67\\52.45815\\-122.9112\\67\\50.50502\\-121.4962\\67\\48.5519\\-119.2913\\67\\47.44772\\-117.6303\\67\\45.6817\\-115.6771\\67\\44.1231\\-111.7709\\67\\44.47186\\-109.8178\\67\\45.88047\\-107.8646\\67\\47.81746\\-105.9115\\67\\48.5519\\-105.3455\\67\\50.50502\\-104.4284\\67\\52.45815\\-103.2802\\67\\53.70377\\-103.9584\\67\\54.41127\\-104.5362\\67\\55.33328\\-105.9115\\67\\60.27065\\-110.8146\\67\\64.12431\\-113.724\\67\\66.50562\\-115.6771\\67\\69.31638\\-117.6303\\67\\70.03628\\-118.2542\\67\\71.9894\\-119.5308\\67\\74.09338\\-121.5365\\67\\76.42092\\-123.4896\\67\\80.39399\\-127.3959\\67\\81.75503\\-128.4762\\67\\83.70815\\-130.3753\\67\\84.81889\\-131.3021\\67\\84.605\\-133.2553\\67\\83.70815\\-133.9528\\67\\81.75503\\-134.4304\\67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002268" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "59" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "587" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "120.8175\\-192.0474\\67\\119.7596\\-191.849\\67\\118.8644\\-191.3119\\67\\117.1985\\-189.8959\\67\\116.968\\-187.9428\\67\\116.8486\\-185.9896\\67\\116.9381\\-182.0834\\67\\114.7279\\-178.1771\\67\\114.3304\\-176.224\\67\\114.1804\\-174.2709\\67\\113.7829\\-172.3178\\67\\112.3859\\-168.4115\\67\\111.5611\\-166.4584\\67\\110.4485\\-164.5053\\67\\109.2615\\-160.599\\67\\106.7245\\-156.6928\\67\\105.7209\\-154.7396\\67\\104.1575\\-152.7865\\67\\102.8425\\-150.8334\\67\\101.2863\\-146.9633\\67\\100.089\\-144.974\\67\\99.04018\\-143.0209\\67\\99.661\\-141.0678\\67\\99.27932\\-139.1146\\67\\101.2863\\-138.9708\\67\\103.2394\\-140.6639\\67\\107.1457\\-142.9679\\67\\111.0519\\-143.2704\\67\\113.005\\-144.808\\67\\114.9582\\-145.1628\\67\\116.9113\\-145.2081\\67\\118.8644\\-145.6334\\67\\120.8175\\-146.7548\\67\\120.9285\\-146.9271\\67\\119.9234\\-148.8803\\67\\119.3174\\-150.8334\\67\\119.7811\\-152.7865\\67\\120.8175\\-154.1713\\67\\122.7707\\-155.4841\\67\\124.7238\\-156.4668\\67\\126.7456\\-158.6459\\67\\127.7427\\-160.599\\67\\127.7553\\-162.5521\\67\\127.5873\\-164.5053\\67\\127.718\\-166.4584\\67\\128.63\\-167.5619\\67\\129.1418\\-168.4115\\67\\128.7797\\-170.3646\\67\\127.9672\\-172.3178\\67\\127.9672\\-174.2709\\67\\128.1081\\-176.224\\67\\128.3808\\-178.1771\\67\\128.4403\\-182.0834\\67\\128.3548\\-184.0365\\67\\126.9573\\-185.9896\\67\\126.6769\\-187.1225\\67\\126.2667\\-187.9428\\67\\124.7973\\-189.8959\\67\\122.7707\\-191.9051\\67" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "63" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "588" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-150.8094\\69\\-105.415\\-148.8803\\69\\-105.3985\\-146.9271\\69\\-105.0101\\-144.974\\69\\-104.2965\\-143.0209\\69\\-103.7918\\-142.4512\\69\\-99.8856\\-138.608\\69\\-97.93247\\-137.2354\\69\\-95.97935\\-136.5332\\69\\-92.68539\\-133.2553\\69\\-92.0731\\-132.7232\\69\\-90.11997\\-131.7657\\69\\-88.16685\\-130.4532\\69\\-84.2606\\-127.1607\\69\\-80.35435\\-123.1685\\69\\-78.8895\\-121.5365\\69\\-77.28595\\-119.5834\\69\\-74.49497\\-116.6283\\69\\-71.56528\\-113.724\\69\\-69.28867\\-111.7709\\69\\-66.68247\\-109.1441\\69\\-65.65111\\-107.8646\\69\\-64.44753\\-105.9115\\69\\-62.77623\\-104.3453\\69\\-60.8231\\-103.4241\\69\\-58.86998\\-103.1039\\69\\-56.91685\\-103.6902\\69\\-56.42223\\-103.9584\\69\\-54.96373\\-105.4169\\69\\-53.63588\\-107.8646\\69\\-52.44152\\-109.8178\\69\\-52.35732\\-111.7709\\69\\-53.0106\\-112.3314\\69\\-54.96373\\-113.5834\\69\\-56.91685\\-115.3875\\69\\-59.09534\\-117.6303\\69\\-60.30341\\-119.5834\\69\\-62.77623\\-122.0763\\69\\-64.72935\\-123.0977\\69\\-65.94507\\-123.4896\\69\\-64.58984\\-125.4428\\69\\-62.77623\\-126.1481\\69\\-61.47204\\-127.3959\\69\\-63.07733\\-129.349\\69\\-65.98246\\-131.3021\\69\\-66.68247\\-131.8753\\69\\-68.6356\\-132.8114\\69\\-70.58872\\-132.4126\\69\\-72.54185\\-132.5384\\69\\-74.49497\\-133.7702\\69\\-76.4481\\-134.4543\\69\\-78.40122\\-134.9115\\69\\-80.35435\\-134.0636\\69\\-82.30747\\-133.7102\\69\\-84.2606\\-134.6836\\69\\-86.21372\\-136.2743\\69\\-88.16685\\-138.0266\\69\\-90.11997\\-138.9751\\69\\-92.0731\\-140.3745\\69\\-97.93247\\-146.1834\\69\\-99.8856\\-147.4889\\69\\-101.241\\-148.8803\\69\\-101.8387\\-149.6865\\69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "589" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-212.3316\\69\\44.64565\\-208.4686\\69\\43.69069\\-207.474\\69\\42.3357\\-205.5209\\69\\42.28613\\-203.5678\\69\\40.7394\\-201.6373\\69\\38.78627\\-202.9778\\69\\38.27753\\-203.5678\\69\\37.47207\\-205.5209\\69\\36.83315\\-206.1882\\69\\34.88002\\-206.9419\\69\\33.6935\\-205.5209\\69\\35.7007\\-203.5678\\69\\37.67888\\-199.6615\\69\\39.63324\\-197.7084\\69\\41.07769\\-195.7553\\69\\42.3357\\-191.849\\69\\43.76017\\-189.8959\\69\\44.64565\\-189.0622\\69\\47.14131\\-187.9428\\69\\50.50502\\-186.7657\\69\\52.45815\\-185.8026\\69\\56.3644\\-185.841\\69\\58.31752\\-186.9008\\69\\60.27065\\-187.3965\\69\\62.22377\\-188.7997\\69\\64.1769\\-190.6146\\69\\67.07135\\-193.8021\\69\\67.60354\\-195.7553\\69\\67.63926\\-199.6615\\69\\69.52707\\-201.6146\\69\\71.8024\\-203.5678\\69\\72.27136\\-205.5209\\69\\71.9894\\-205.8131\\69\\70.03628\\-206.3669\\69\\68.08315\\-204.6302\\69\\66.13003\\-205.4488\\69\\65.07588\\-207.474\\69\\63.50082\\-209.4271\\69\\62.54031\\-211.3803\\69\\62.22377\\-211.6925\\69\\60.27065\\-212.7278\\69\\58.31752\\-212.9367\\69\\50.50502\\-212.9174\\69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "590" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "81.75503\\-133.7347\\69\\79.8019\\-132.5271\\69\\77.84878\\-131.9388\\69\\75.89565\\-130.8139\\69\\73.94253\\-130.0106\\69\\71.9894\\-129.3725\\69\\70.03628\\-128.5001\\69\\68.08315\\-126.9699\\69\\66.13003\\-126.2547\\69\\64.1769\\-125.9577\\69\\62.22377\\-125.1279\\69\\58.31752\\-124.0661\\69\\56.3644\\-122.9726\\69\\54.41127\\-122.137\\69\\52.45815\\-121.0706\\69\\50.50502\\-119.6439\\69\\48.73141\\-117.6303\\69\\47.12193\\-115.6771\\69\\46.68541\\-113.724\\69\\46.59877\\-111.6081\\69\\46.68755\\-109.8178\\69\\47.94898\\-107.8646\\69\\48.5519\\-107.251\\69\\50.50502\\-105.803\\69\\52.45815\\-105.0298\\69\\54.41127\\-105.783\\69\\56.3644\\-106.6716\\69\\58.31752\\-107.8417\\69\\60.29635\\-109.8178\\69\\62.22377\\-111.0806\\69\\66.13003\\-114.9617\\69\\68.08315\\-116.5199\\69\\70.03628\\-117.2038\\69\\73.94253\\-120.6838\\69\\75.89565\\-122.112\\69\\77.84878\\-123.3676\\69\\79.8019\\-125.3073\\69\\82.40863\\-127.3959\\69\\83.70815\\-128.6654\\69\\85.66128\\-129.7375\\69\\87.41438\\-131.3021\\69\\85.97594\\-133.2553\\69\\85.66128\\-133.4547\\69\\83.70815\\-133.9313\\69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002267" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "54" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "591" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "120.8175\\-186.9662\\69\\119.8681\\-185.9896\\69\\119.9223\\-184.0365\\69\\120.6083\\-182.0834\\69\\118.9218\\-180.1303\\69\\116.9113\\-178.0883\\69\\115.7249\\-174.2709\\69\\114.9702\\-170.3646\\69\\114.3988\\-168.4115\\69\\113.2397\\-166.4584\\69\\111.2998\\-162.5521\\69\\110.9288\\-160.599\\69\\109.7421\\-158.6459\\69\\108.394\\-156.6928\\69\\107.3516\\-154.7396\\69\\105.8563\\-152.7865\\69\\104.192\\-150.8334\\69\\102.8813\\-148.8803\\69\\102.1018\\-146.9271\\69\\100.4224\\-144.974\\69\\99.53259\\-143.0209\\69\\99.00763\\-141.0678\\69\\98.06524\\-139.1146\\69\\97.38003\\-137.3921\\69\\97.38003\\-136.8541\\69\\99.33315\\-136.619\\69\\100.2156\\-137.1615\\69\\103.2394\\-138.6813\\69\\105.1925\\-139.1941\\69\\107.1457\\-140.7851\\69\\111.0519\\-141.6118\\69\\114.9582\\-143.4954\\69\\118.8644\\-144.2248\\69\\120.8175\\-145.5346\\69\\121.7775\\-146.9271\\69\\121.4299\\-148.8803\\69\\120.8175\\-150.9729\\69\\122.5265\\-152.7865\\69\\124.7238\\-154.8578\\69\\126.6769\\-158.1042\\69\\127.113\\-158.6459\\69\\127.7418\\-160.599\\69\\127.7584\\-164.5053\\69\\127.9212\\-166.4584\\69\\128.2731\\-168.4115\\69\\127.9845\\-170.3646\\69\\127.6046\\-174.2709\\69\\126.6769\\-177.1701\\69\\125.9445\\-178.1771\\69\\125.6732\\-180.1303\\69\\125.6732\\-182.0834\\69\\125.1958\\-184.0365\\69\\124.7238\\-184.8457\\69\\122.7707\\-186.8306\\69" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "74" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "592" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-148.7394\\71\\-104.8106\\-146.9271\\71\\-105.0432\\-144.974\\71\\-105.0151\\-143.0209\\71\\-104.3526\\-141.0678\\71\\-103.7918\\-140.4333\\71\\-100.4905\\-137.1615\\71\\-99.8856\\-136.6317\\71\\-97.93247\\-135.8156\\71\\-95.97935\\-134.5204\\71\\-94.02622\\-132.6017\\71\\-92.0731\\-131.2491\\71\\-90.11997\\-130.4113\\71\\-88.16685\\-128.7805\\71\\-86.21372\\-127.8235\\71\\-84.2606\\-126.3809\\71\\-81.40102\\-123.4896\\71\\-79.88142\\-121.5365\\71\\-78.67176\\-119.5834\\71\\-74.49497\\-115.4689\\71\\-72.54185\\-113.6248\\71\\-70.58872\\-112.3833\\71\\-68.6356\\-110.7717\\71\\-67.6871\\-109.8178\\71\\-66.19419\\-107.8646\\71\\-65.07906\\-105.9115\\71\\-64.72935\\-105.5594\\71\\-62.77623\\-104.7745\\71\\-60.8231\\-104.7595\\71\\-58.86998\\-103.5237\\71\\-56.91685\\-103.6841\\71\\-56.64261\\-103.9584\\71\\-56.55664\\-105.9115\\71\\-56.04016\\-107.8646\\71\\-54.96373\\-109.0198\\71\\-54.4045\\-109.8178\\71\\-53.76606\\-111.7709\\71\\-54.96373\\-112.8911\\71\\-57.39647\\-115.6771\\71\\-58.11153\\-117.6303\\71\\-58.86998\\-118.4336\\71\\-60.8231\\-120.1422\\71\\-62.77623\\-120.9495\\71\\-64.72935\\-122.2881\\71\\-66.68247\\-122.4228\\71\\-68.6356\\-123.0107\\71\\-70.58872\\-124.5711\\71\\-71.46632\\-125.4428\\71\\-70.58872\\-127.3813\\71\\-68.6356\\-126.6314\\71\\-66.68247\\-126.1478\\71\\-64.72935\\-125.8681\\71\\-62.77623\\-127.0443\\71\\-62.47728\\-127.3959\\71\\-64.24847\\-129.349\\71\\-64.72935\\-129.7585\\71\\-66.68247\\-130.2685\\71\\-68.6356\\-130.9159\\71\\-70.58872\\-131.6787\\71\\-72.54185\\-131.9762\\71\\-74.49497\\-132.746\\71\\-76.4481\\-133.9877\\71\\-78.40122\\-134.6113\\71\\-80.56187\\-133.2553\\71\\-82.30747\\-132.414\\71\\-84.2606\\-133.6941\\71\\-86.21372\\-134.6328\\71\\-88.16685\\-136.4692\\71\\-90.11997\\-137.6913\\71\\-92.0731\\-138.5405\\71\\-92.79073\\-139.1146\\71\\-98.6854\\-144.974\\71\\-99.8856\\-145.9386\\71\\-101.8387\\-147.8593\\71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "593" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-212.1059\\71\\46.59877\\-210.4085\\71\\43.69069\\-207.474\\71\\42.27658\\-205.5209\\71\\41.98723\\-203.5678\\71\\40.7394\\-202.1229\\71\\38.78627\\-202.5815\\71\\37.82858\\-203.5678\\71\\36.58547\\-205.5209\\71\\34.88002\\-206.7661\\71\\33.06963\\-205.5209\\71\\34.88002\\-204.3015\\71\\35.67554\\-203.5678\\71\\36.11158\\-201.6146\\71\\37.70308\\-199.6615\\71\\38.78627\\-198.733\\71\\41.50004\\-195.7553\\71\\42.08285\\-193.8021\\71\\42.3357\\-191.849\\71\\44.09048\\-189.8959\\71\\44.64565\\-189.4134\\71\\46.59877\\-188.7167\\71\\48.5519\\-187.6837\\71\\50.50502\\-186.9125\\71\\52.45815\\-185.8026\\71\\56.3644\\-185.8152\\71\\58.31752\\-186.3217\\71\\62.22377\\-187.7433\\71\\64.72887\\-189.8959\\71\\65.91532\\-191.849\\71\\67.20473\\-193.8021\\71\\67.60354\\-195.7553\\71\\67.63017\\-199.6615\\71\\69.13205\\-201.6146\\71\\71.1208\\-203.5678\\71\\71.65136\\-205.5209\\71\\70.03628\\-206.5066\\71\\68.08315\\-204.9448\\71\\66.13003\\-206.252\\71\\65.08501\\-207.474\\71\\63.69728\\-209.4271\\71\\63.06151\\-211.3803\\71\\62.22377\\-212.2019\\71\\60.27065\\-212.927\\71\\52.45815\\-212.9367\\71\\50.50502\\-212.7872\\71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002266" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "99" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "594" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "118.8644\\-174.3116\\71\\118.7912\\-168.4115\\71\\117.0403\\-166.4584\\71\\114.9582\\-164.6489\\71\\113.5369\\-162.5521\\71\\112.91\\-160.599\\71\\111.7899\\-158.6459\\71\\111.0519\\-156.8555\\71\\109.5961\\-154.7396\\71\\107.8648\\-152.7865\\71\\105.9173\\-150.8334\\71\\104.4872\\-148.8803\\71\\103.3936\\-146.9271\\71\\101.9858\\-144.974\\71\\100.282\\-143.0209\\71\\99.29559\\-141.0678\\71\\96.91096\\-139.1146\\71\\95.4269\\-137.7684\\71\\93.90974\\-137.1615\\71\\93.47378\\-136.5802\\71\\91.52065\\-134.835\\71\\89.56753\\-133.2934\\71\\85.66128\\-133.8326\\71\\83.70815\\-133.5143\\71\\81.75503\\-132.4864\\71\\79.8019\\-131.7369\\71\\77.84878\\-130.4516\\71\\75.82277\\-129.349\\71\\73.94253\\-128.6208\\71\\71.9894\\-128.0095\\71\\70.03628\\-126.9172\\71\\68.08315\\-126.1066\\71\\66.13003\\-125.5782\\71\\64.1769\\-124.7724\\71\\60.32809\\-123.4896\\71\\56.3644\\-121.9019\\71\\54.41127\\-120.7882\\71\\52.45815\\-120.0209\\71\\50.50502\\-118.5245\\71\\49.62558\\-117.6303\\71\\48.80697\\-115.6771\\71\\48.67167\\-113.724\\71\\48.64696\\-111.7709\\71\\48.78978\\-109.8178\\71\\50.50502\\-108.3945\\71\\52.45815\\-108.1302\\71\\54.41127\\-107.2572\\71\\56.3644\\-106.7092\\71\\58.31752\\-107.2995\\71\\60.27065\\-109.1581\\71\\62.22377\\-110.5413\\71\\63.70693\\-111.7709\\71\\65.20021\\-113.724\\71\\66.13003\\-114.6538\\71\\68.08315\\-116.1118\\71\\70.03628\\-116.7292\\71\\71.9894\\-118.6372\\71\\73.94253\\-120.1874\\71\\75.89565\\-121.1018\\71\\77.84878\\-122.6243\\71\\79.8019\\-124.4226\\71\\81.75503\\-125.7364\\71\\85.66128\\-127.9667\\71\\87.6144\\-128.8277\\71\\88.21712\\-129.349\\71\\89.56753\\-130.9204\\71\\90.67258\\-131.3021\\71\\91.52065\\-132.0346\\71\\93.47378\\-132.9942\\71\\94.52847\\-133.2553\\71\\95.4269\\-133.6712\\71\\97.38003\\-134.0266\\71\\99.33315\\-134.7201\\71\\101.2863\\-136.2915\\71\\103.3391\\-137.1615\\71\\105.1925\\-137.74\\71\\107.1457\\-138.6043\\71\\109.0988\\-139.6514\\71\\111.0519\\-140.2997\\71\\113.005\\-141.4331\\71\\114.9582\\-142.2345\\71\\118.8644\\-143.9742\\71\\119.9467\\-144.974\\71\\121.438\\-146.9271\\71\\121.7983\\-148.8803\\71\\122.6612\\-150.8334\\71\\124.7238\\-154.2706\\71\\125.1106\\-154.7396\\71\\125.7543\\-156.6928\\71\\126.2876\\-160.599\\71\\126.309\\-164.5053\\71\\126.2293\\-166.4584\\71\\125.8631\\-168.4115\\71\\125.7178\\-170.3646\\71\\125.7178\\-172.3178\\71\\125.1563\\-174.2709\\71\\124.7238\\-174.8315\\71\\122.7707\\-176.1264\\71\\120.8175\\-176.1903\\71" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "70" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "595" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-145.9787\\73\\-104.4449\\-144.974\\73\\-105.0432\\-143.0209\\73\\-105.0681\\-141.0678\\73\\-104.5355\\-139.1146\\73\\-103.7918\\-138.1668\\73\\-102.7963\\-137.1615\\73\\-99.8856\\-135.167\\73\\-97.93247\\-134.0804\\73\\-95.97935\\-132.5172\\73\\-94.02622\\-130.6141\\73\\-91.70489\\-129.349\\73\\-90.11997\\-128.6221\\73\\-88.16685\\-127.2866\\73\\-86.21372\\-126.5188\\73\\-84.94346\\-125.4428\\73\\-82.30747\\-122.8545\\73\\-81.23659\\-121.5365\\73\\-79.38722\\-119.5834\\73\\-76.4481\\-116.614\\73\\-74.49497\\-114.7761\\73\\-70.97262\\-111.7709\\73\\-68.6356\\-109.6328\\73\\-67.02596\\-107.8646\\73\\-64.72935\\-105.6953\\73\\-62.77623\\-105.4839\\73\\-60.8231\\-106.4725\\73\\-58.86998\\-105.6452\\73\\-57.16099\\-103.9584\\73\\-56.91685\\-104.1579\\73\\-58.65181\\-105.9115\\73\\-58.30845\\-107.8646\\73\\-56.5944\\-109.8178\\73\\-55.69019\\-111.7709\\73\\-56.35184\\-113.724\\73\\-57.86629\\-115.6771\\73\\-59.12443\\-117.6303\\73\\-61.1987\\-119.5834\\73\\-64.72935\\-121.6851\\73\\-66.68247\\-122.0747\\73\\-68.6356\\-122.2904\\73\\-70.58872\\-122.9359\\73\\-71.30385\\-123.4896\\73\\-73.13935\\-125.4428\\73\\-72.54185\\-126.7042\\73\\-70.58872\\-126.6408\\73\\-68.6356\\-126.2985\\73\\-64.72935\\-125.9793\\73\\-63.46144\\-127.3959\\73\\-64.72935\\-128.8038\\73\\-66.68247\\-129.726\\73\\-68.6356\\-129.9372\\73\\-70.58872\\-130.5288\\73\\-74.49497\\-132.4628\\73\\-76.4481\\-133.8401\\73\\-78.40122\\-134.372\\73\\-79.57007\\-133.2553\\73\\-78.40122\\-131.3754\\73\\-78.40122\\-131.1024\\73\\-80.35435\\-130.304\\73\\-82.30747\\-131.0105\\73\\-84.2606\\-132.4706\\73\\-86.21372\\-133.6674\\73\\-88.16685\\-134.5933\\73\\-90.11997\\-136.2347\\73\\-92.0731\\-137.5809\\73\\-94.02622\\-138.5043\\73\\-94.74329\\-139.1146\\73\\-99.8856\\-144.1855\\73\\-101.8387\\-146.0698\\73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "596" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-212.4763\\73\\48.5519\\-211.2718\\73\\46.59877\\-210.4085\\73\\43.69069\\-207.474\\73\\42.06063\\-205.5209\\73\\41.60586\\-203.5678\\73\\40.7394\\-202.6325\\73\\38.78627\\-202.4974\\73\\34.88002\\-206.478\\73\\33.00904\\-207.474\\73\\32.79373\\-207.474\\73\\32.37532\\-205.5209\\73\\34.88002\\-203.9042\\73\\35.23124\\-203.5678\\73\\35.35562\\-201.6146\\73\\36.83315\\-200.0123\\73\\38.78627\\-199.262\\73\\40.7394\\-197.0551\\73\\41.61001\\-195.7553\\73\\42.32553\\-193.8021\\73\\42.39956\\-191.849\\73\\44.64565\\-189.6964\\73\\46.59877\\-188.8855\\73\\48.5519\\-187.6953\\73\\50.50502\\-186.9171\\73\\52.45815\\-185.8026\\73\\58.31752\\-185.8152\\73\\60.27065\\-186.3108\\73\\62.22377\\-187.1388\\73\\65.09123\\-189.8959\\73\\66.8338\\-191.849\\73\\67.44443\\-193.8021\\73\\67.60354\\-195.7553\\73\\67.63017\\-199.6615\\73\\69.04549\\-201.6146\\73\\70.96611\\-203.5678\\73\\71.65136\\-205.5209\\73\\70.03628\\-206.5113\\73\\68.08315\\-205.1641\\73\\66.13003\\-206.4381\\73\\65.10846\\-207.474\\73\\63.76096\\-209.4271\\73\\63.07109\\-211.3803\\73\\62.22377\\-212.2113\\73\\60.27065\\-212.927\\73\\52.45815\\-212.9367\\73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002265" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "82" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "597" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "120.8175\\-165.5984\\73\\118.8644\\-164.0893\\73\\116.9113\\-163.4792\\73\\116.1152\\-162.5521\\73\\114.9582\\-160.4994\\73\\113.0138\\-156.6928\\73\\111.8256\\-154.7396\\73\\107.9284\\-150.8334\\73\\106.4972\\-148.8803\\73\\105.2933\\-146.9271\\73\\103.6389\\-144.974\\73\\101.2863\\-142.6242\\73\\99.33315\\-140.4396\\73\\97.38003\\-139.7289\\73\\95.4269\\-138.3246\\73\\93.47378\\-137.7312\\73\\91.52065\\-136.3467\\73\\89.56753\\-134.3089\\73\\87.6144\\-133.7854\\73\\85.66128\\-133.5027\\73\\81.75503\\-131.2646\\73\\79.8019\\-130.416\\73\\77.84878\\-128.7883\\73\\75.89565\\-128.1665\\73\\73.94253\\-127.772\\73\\71.9894\\-126.6921\\73\\68.08315\\-125.5375\\73\\66.13003\\-124.7223\\73\\64.1769\\-124.1352\\73\\62.22377\\-122.9123\\73\\58.31752\\-121.8438\\73\\56.3644\\-120.6021\\73\\54.42276\\-119.5834\\73\\52.45815\\-118.3845\\73\\51.52104\\-117.6303\\73\\50.65874\\-115.6771\\73\\51.62921\\-113.724\\73\\51.48159\\-111.7709\\73\\53.73265\\-109.8178\\73\\54.41127\\-109.4328\\73\\56.3644\\-107.5114\\73\\58.31752\\-107.6652\\73\\58.53207\\-107.8646\\73\\61.6153\\-109.8178\\73\\62.22377\\-110.2886\\73\\64.1769\\-111.364\\73\\66.72416\\-113.724\\73\\68.08315\\-114.8877\\73\\70.03628\\-116.2145\\73\\71.9894\\-117.4378\\73\\74.42123\\-119.5834\\73\\77.84878\\-122.0489\\73\\79.8019\\-122.9669\\73\\81.75503\\-124.5565\\73\\83.70815\\-125.7862\\73\\85.66128\\-126.6246\\73\\87.6144\\-127.8033\\73\\89.56753\\-128.7805\\73\\91.52065\\-129.9295\\73\\93.47378\\-130.7281\\73\\95.4269\\-131.8986\\73\\97.38003\\-132.52\\73\\99.33315\\-133.7188\\73\\101.2863\\-134.6126\\73\\103.2394\\-135.7673\\73\\105.1925\\-136.3855\\73\\107.1457\\-137.6003\\73\\109.0988\\-138.3241\\73\\111.0519\\-139.5938\\73\\113.005\\-140.3071\\73\\114.9582\\-141.6064\\73\\116.9113\\-142.5679\\73\\119.4166\\-144.974\\73\\120.1574\\-146.9271\\73\\121.3796\\-148.8803\\73\\122.7707\\-150.8933\\73\\123.7561\\-152.7865\\73\\124.2418\\-156.6928\\73\\124.158\\-158.6459\\73\\123.8098\\-160.599\\73\\123.8098\\-164.5053\\73\\122.7707\\-165.9527\\73" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "67" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "598" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-143.8212\\75\\-104.4489\\-143.0209\\75\\-105.3386\\-141.0678\\75\\-106.5418\\-139.1146\\75\\-105.9015\\-137.1615\\75\\-103.7918\\-135.8778\\75\\-101.8387\\-134.4488\\75\\-99.8856\\-132.7536\\75\\-97.93247\\-132.0173\\75\\-95.97935\\-130.5223\\75\\-94.02622\\-128.7466\\75\\-92.0731\\-127.919\\75\\-90.11997\\-126.6598\\75\\-88.16685\\-125.5055\\75\\-86.21372\\-124.7319\\75\\-84.97148\\-123.4896\\75\\-82.30747\\-121.1832\\75\\-80.73868\\-119.5834\\75\\-76.4481\\-115.3606\\75\\-74.49497\\-114.5081\\75\\-72.54185\\-112.9392\\75\\-70.58872\\-110.7775\\75\\-68.6356\\-108.948\\75\\-66.68247\\-107.6484\\75\\-64.72935\\-106.7789\\75\\-62.77623\\-107.1601\\75\\-60.8231\\-108.2204\\75\\-59.22572\\-109.8178\\75\\-59.13446\\-113.724\\75\\-59.6237\\-115.6771\\75\\-63.23775\\-119.5834\\75\\-64.72935\\-120.7296\\75\\-66.68247\\-121.645\\75\\-68.6356\\-122.0666\\75\\-70.58872\\-122.2803\\75\\-72.54185\\-122.9291\\75\\-73.1452\\-123.4896\\75\\-74.34534\\-125.4428\\75\\-72.54185\\-126.8064\\75\\-70.58872\\-126.0993\\75\\-68.6356\\-126.6182\\75\\-66.68247\\-127.2609\\75\\-64.72935\\-126.9037\\75\\-64.30505\\-127.3959\\75\\-64.72935\\-127.8655\\75\\-66.68247\\-127.7912\\75\\-68.6356\\-128.7361\\75\\-69.68319\\-129.349\\75\\-72.54185\\-130.5108\\75\\-74.49497\\-132.1539\\75\\-76.4481\\-133.5592\\75\\-78.40122\\-134.1967\\75\\-79.21167\\-133.2553\\75\\-77.21936\\-131.3021\\75\\-75.61552\\-129.349\\75\\-76.4481\\-128.063\\75\\-78.40122\\-128.5264\\75\\-82.30747\\-130.3353\\75\\-84.2606\\-131.6409\\75\\-86.21372\\-132.4396\\75\\-88.16685\\-133.6472\\75\\-90.11997\\-134.5553\\75\\-92.0731\\-136.1911\\75\\-94.02622\\-137.561\\75\\-95.97935\\-138.6634\\75\\-98.74043\\-141.0678\\75\\-101.8387\\-144.0776\\75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "599" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-212.3465\\75\\48.5519\\-210.9094\\75\\46.59877\\-210.4085\\75\\44.64565\\-208.4686\\75\\41.78479\\-205.5209\\75\\40.7394\\-203.8259\\75\\38.78627\\-202.6308\\75\\35.66604\\-205.5209\\75\\32.9269\\-208.1598\\75\\30.97377\\-208.0866\\75\\30.39015\\-207.474\\75\\30.97377\\-205.8571\\75\\31.57694\\-205.5209\\75\\32.9269\\-205.2169\\75\\34.84246\\-203.5678\\75\\34.87239\\-201.6146\\75\\36.83315\\-199.6842\\75\\38.78627\\-199.6239\\75\\40.7394\\-197.3743\\75\\41.61414\\-195.7553\\75\\42.3357\\-193.8021\\75\\42.95339\\-191.849\\75\\44.92581\\-189.8959\\75\\48.24041\\-187.9428\\75\\48.5519\\-187.6953\\75\\50.50502\\-186.9171\\75\\52.45815\\-185.8026\\75\\58.31752\\-185.8026\\75\\60.27065\\-185.9521\\75\\62.22377\\-187.0818\\75\\65.09123\\-189.8959\\75\\66.81581\\-191.849\\75\\67.44067\\-193.8021\\75\\67.60354\\-195.7553\\75\\67.63017\\-199.6615\\75\\69.04549\\-201.6146\\75\\70.96611\\-203.5678\\75\\71.65136\\-205.5209\\75\\70.03628\\-206.5113\\75\\68.08315\\-205.1641\\75\\66.13003\\-206.4878\\75\\65.23228\\-207.474\\75\\64.21475\\-209.4271\\75\\63.07109\\-211.3803\\75\\62.22377\\-212.2113\\75\\60.27065\\-212.927\\75\\52.45815\\-212.9367\\75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002264" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "69" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "600" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "116.9113\\-157.5391\\75\\114.9582\\-155.6552\\75\\114.1706\\-154.7396\\75\\113.005\\-153.8861\\75\\109.0988\\-150.0208\\75\\106.3158\\-146.9271\\75\\100.42\\-141.0678\\75\\99.33315\\-140.1405\\75\\97.38003\\-139.2094\\75\\93.47378\\-136.8338\\75\\91.52065\\-136.051\\75\\89.56753\\-134.1364\\75\\87.6144\\-132.9522\\75\\85.66128\\-132.3929\\75\\83.70815\\-130.6449\\75\\81.75503\\-130.0695\\75\\77.84878\\-128.0153\\75\\75.89565\\-127.4481\\75\\73.94253\\-126.6136\\75\\70.03628\\-125.4949\\75\\64.1769\\-123.1027\\75\\62.22377\\-122.5676\\75\\60.29612\\-121.5365\\75\\58.31752\\-120.3773\\75\\55.03035\\-117.6303\\75\\53.40419\\-115.6771\\75\\54.13363\\-113.724\\75\\55.86943\\-111.7709\\75\\56.95516\\-109.8178\\75\\58.31752\\-108.988\\75\\60.27065\\-109.2126\\75\\62.22377\\-110.4667\\75\\64.42927\\-111.7709\\75\\66.13003\\-112.5315\\75\\68.08315\\-113.6537\\75\\70.03628\\-114.942\\75\\71.9894\\-116.6537\\75\\73.94253\\-118.6269\\75\\75.89565\\-120.011\\75\\77.84878\\-120.9903\\75\\79.8019\\-122.2803\\75\\81.75503\\-123.1535\\75\\83.70815\\-124.6544\\75\\85.66128\\-125.362\\75\\87.6144\\-126.5339\\75\\89.56753\\-127.2729\\75\\91.52065\\-128.472\\75\\93.47378\\-129.3109\\75\\95.4269\\-130.4361\\75\\97.38003\\-131.727\\75\\99.33315\\-132.4577\\75\\101.2863\\-133.7583\\75\\103.2394\\-134.3912\\75\\105.1925\\-135.6996\\75\\107.1457\\-136.3486\\75\\109.0988\\-137.6557\\75\\111.0519\\-138.6085\\75\\111.5909\\-139.1146\\75\\113.005\\-140.0615\\75\\114.7322\\-141.0678\\75\\116.9113\\-143.0488\\75\\118.0598\\-144.974\\75\\119.1243\\-146.9271\\75\\119.9677\\-148.8803\\75\\120.957\\-150.8334\\75\\121.8035\\-152.7865\\75\\121.8429\\-156.6928\\75\\120.8175\\-157.9432\\75\\118.8644\\-158.031\\75" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "601" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-142.1921\\77\\-105.745\\-140.6492\\77\\-106.9991\\-139.1146\\77\\-106.7359\\-137.1615\\77\\-105.745\\-136.0629\\77\\-103.7918\\-134.3751\\77\\-101.8387\\-132.8633\\77\\-99.8856\\-131.9035\\77\\-97.93247\\-130.6731\\77\\-95.97935\\-128.7208\\77\\-94.02622\\-127.7282\\77\\-92.0731\\-126.4856\\77\\-90.11997\\-124.8404\\77\\-88.16685\\-123.9917\\77\\-86.21372\\-122.7655\\77\\-84.2606\\-121.3495\\77\\-82.30747\\-120.5109\\77\\-76.4481\\-114.6705\\77\\-74.62067\\-113.724\\77\\-72.54185\\-111.4908\\77\\-70.58872\\-109.6901\\77\\-68.6356\\-108.6084\\77\\-66.68247\\-108.4885\\77\\-64.72935\\-108.5622\\77\\-62.77623\\-108.9076\\77\\-61.67053\\-109.8178\\77\\-61.53257\\-111.7709\\77\\-61.53868\\-113.724\\77\\-61.85479\\-115.6771\\77\\-63.20646\\-117.6303\\77\\-64.72935\\-119.3586\\77\\-66.68247\\-120.5831\\77\\-68.6356\\-121.6312\\77\\-72.54185\\-122.4735\\77\\-73.89266\\-123.4896\\77\\-75.47153\\-125.4428\\77\\-76.4481\\-126.4424\\77\\-78.40122\\-127.6759\\77\\-80.35435\\-128.4965\\77\\-82.30747\\-129.6406\\77\\-84.2606\\-130.449\\77\\-86.21372\\-131.6299\\77\\-88.16685\\-132.4221\\77\\-90.11997\\-133.6264\\77\\-92.0731\\-134.5108\\77\\-94.02622\\-136.1788\\77\\-95.97935\\-137.9586\\77\\-97.93247\\-139.4042\\77\\-99.8856\\-140.3937\\77\\-101.8387\\-142.1592\\77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "12" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "602" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-78.40122\\-134.0403\\77\\-79.04702\\-133.2553\\77\\-75.13329\\-129.349\\77\\-73.56577\\-127.3959\\77\\-72.54185\\-126.5636\\77\\-70.58872\\-126.0648\\77\\-69.23917\\-127.3959\\77\\-70.58872\\-128.5064\\77\\-72.54185\\-129.6878\\77\\-74.49497\\-130.7424\\77\\-76.4481\\-132.3782\\77\\-77.30925\\-133.2553\\77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "603" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-212.3261\\77\\48.5519\\-210.8834\\77\\46.59877\\-210.3845\\77\\41.69962\\-205.5209\\77\\40.7394\\-204.473\\77\\38.78627\\-203.1184\\77\\35.26937\\-205.5209\\77\\32.9269\\-207.633\\77\\30.97377\\-207.7582\\77\\30.70744\\-207.474\\77\\30.97377\\-206.9729\\77\\32.9269\\-207.1078\\77\\34.0962\\-205.5209\\77\\34.85732\\-203.5678\\77\\34.87239\\-201.6146\\77\\36.83315\\-199.6842\\77\\38.78627\\-199.6239\\77\\40.7394\\-197.3743\\77\\41.61414\\-195.7553\\77\\42.3357\\-193.8021\\77\\43.50124\\-191.849\\77\\44.64565\\-190.6926\\77\\46.59877\\-188.8902\\77\\48.5519\\-187.6953\\77\\50.50502\\-186.942\\77\\52.45815\\-185.8811\\77\\56.3644\\-185.8026\\77\\58.31752\\-185.9089\\77\\62.22377\\-187.1926\\77\\65.09123\\-189.8959\\77\\65.91832\\-191.849\\77\\67.1315\\-193.8021\\77\\67.53693\\-195.7553\\77\\67.57784\\-199.6615\\77\\69.04066\\-201.6146\\77\\70.96611\\-203.5678\\77\\71.65136\\-205.5209\\77\\70.03628\\-206.5113\\77\\68.08315\\-205.1641\\77\\66.13003\\-206.7477\\77\\65.50858\\-207.474\\77\\64.8857\\-209.4271\\77\\62.22377\\-212.2113\\77\\60.27065\\-212.927\\77\\52.45815\\-212.9174\\77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002263" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "604" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "113.005\\-151.4307\\77\\109.0988\\-147.7883\\77\\106.2476\\-144.974\\77\\105.1925\\-144.1591\\77\\101.2863\\-140.2594\\77\\99.33315\\-138.9094\\77\\97.38003\\-138.0734\\77\\95.4269\\-136.4845\\77\\93.47378\\-135.6967\\77\\91.52065\\-134.3864\\77\\89.56753\\-132.5692\\77\\87.6144\\-132.014\\77\\85.66128\\-131.0064\\77\\83.70815\\-129.6855\\77\\79.8019\\-128.3676\\77\\77.78696\\-127.3959\\77\\73.94253\\-125.7615\\77\\71.9894\\-125.0364\\77\\70.03628\\-124.65\\77\\68.08315\\-123.8308\\77\\66.13003\\-122.7434\\77\\62.22377\\-121.3352\\77\\60.64107\\-119.5834\\77\\60.27065\\-118.9203\\77\\58.31752\\-117.2782\\77\\56.91247\\-115.6771\\77\\58.35766\\-113.724\\77\\60.27065\\-112.4545\\77\\64.1769\\-112.4168\\77\\66.13003\\-112.4599\\77\\68.08315\\-113.1821\\77\\70.03628\\-114.5471\\77\\71.9894\\-115.5636\\77\\74.2477\\-117.6303\\77\\75.89565\\-118.841\\77\\77.84878\\-120.55\\77\\83.38538\\-123.4896\\77\\83.70815\\-123.7598\\77\\85.66128\\-124.2235\\77\\87.6144\\-124.8771\\77\\89.56753\\-125.9413\\77\\91.52065\\-126.8075\\77\\95.4269\\-129.1172\\77\\97.38003\\-130.5134\\77\\99.33315\\-131.7117\\77\\101.2863\\-132.6932\\77\\103.2394\\-133.9384\\77\\105.1925\\-134.7141\\77\\107.1457\\-135.9811\\77\\109.0988\\-136.7696\\77\\113.8776\\-141.0678\\77\\115.5413\\-143.0209\\77\\116.9113\\-146.8028\\77\\117.8878\\-148.8803\\77\\116.9113\\-150.315\\77\\114.9582\\-151.3217\\77" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "605" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-103.7918\\-141.2574\\79\\-105.745\\-140.2314\\79\\-106.8192\\-139.1146\\79\\-107.4819\\-137.1615\\79\\-106.5275\\-135.2084\\79\\-105.745\\-134.4818\\79\\-103.7918\\-133.6215\\79\\-101.8387\\-132.1686\\79\\-100.3149\\-131.3021\\79\\-97.93247\\-129.4921\\79\\-95.97935\\-127.7054\\79\\-94.02622\\-126.5596\\79\\-92.0731\\-125.0765\\79\\-90.11997\\-124.1567\\79\\-88.16685\\-122.9638\\79\\-84.2606\\-119.448\\79\\-82.30747\\-118.9341\\79\\-80.7711\\-117.6303\\79\\-76.4481\\-113.5445\\79\\-74.49497\\-111.763\\79\\-72.54185\\-110.6211\\79\\-68.6356\\-108.8365\\79\\-66.68247\\-109.4204\\79\\-66.09454\\-109.8178\\79\\-65.08878\\-111.7709\\79\\-65.0863\\-115.6771\\79\\-65.54648\\-117.6303\\79\\-67.52219\\-119.5834\\79\\-68.6356\\-120.5823\\79\\-70.58872\\-121.6031\\79\\-72.54185\\-122.4817\\79\\-74.49497\\-123.482\\79\\-76.93995\\-125.4428\\79\\-78.40122\\-126.5076\\79\\-80.35435\\-127.6383\\79\\-82.30747\\-128.4758\\79\\-84.2606\\-129.6172\\79\\-86.21372\\-130.4129\\79\\-88.16685\\-131.5821\\79\\-90.11997\\-132.4049\\79\\-92.0731\\-133.6026\\79\\-94.02622\\-134.4848\\79\\-94.87212\\-135.2084\\79\\-96.86775\\-137.1615\\79\\-97.93247\\-138.0581\\79\\-99.8856\\-139.3553\\79\\-101.8387\\-140.3561\\79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "606" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-212.0871\\79\\48.5519\\-210.7484\\79\\46.59877\\-210.1787\\79\\44.64565\\-208.4686\\79\\40.7394\\-204.5402\\79\\38.96039\\-203.5678\\79\\38.58021\\-203.5678\\79\\36.83315\\-204.4333\\79\\34.88999\\-203.5678\\79\\34.93221\\-201.6146\\79\\36.83315\\-199.7563\\79\\38.78627\\-199.6239\\79\\40.7394\\-197.4884\\79\\41.63839\\-195.7553\\79\\42.3357\\-193.8021\\79\\43.63098\\-191.849\\79\\46.59877\\-188.9193\\79\\48.5519\\-187.7684\\79\\52.45815\\-186.4203\\79\\54.41127\\-185.9973\\79\\56.3644\\-186.0123\\79\\62.22377\\-187.6067\\79\\64.1769\\-189.0449\\79\\65.06161\\-189.8959\\79\\65.5759\\-191.849\\79\\66.80819\\-193.8021\\79\\67.27015\\-195.7553\\79\\67.32201\\-199.6615\\79\\68.98421\\-201.6146\\79\\70.96611\\-203.5678\\79\\71.65136\\-205.5209\\79\\70.03628\\-206.5113\\79\\68.08315\\-205.1641\\79\\66.13003\\-206.8935\\79\\65.64175\\-207.474\\79\\65.02838\\-209.4271\\79\\62.22377\\-212.2113\\79\\60.27065\\-212.927\\79\\54.41127\\-212.9174\\79\\52.45815\\-212.7304\\79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002262" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "607" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "111.0519\\-145.3466\\79\\107.1457\\-142.4334\\79\\105.1925\\-142.0925\\79\\102.1594\\-139.1146\\79\\101.2863\\-138.3204\\79\\99.33315\\-136.9939\\79\\97.38003\\-136.2254\\79\\95.4269\\-135.0131\\79\\93.47378\\-134.1696\\79\\91.52065\\-132.5167\\79\\89.56753\\-131.5958\\79\\85.66128\\-130.1637\\79\\83.70815\\-128.4675\\79\\81.75503\\-127.785\\79\\77.84878\\-126.5296\\79\\75.89565\\-125.7129\\79\\73.94253\\-124.5975\\79\\70.03628\\-123.7854\\79\\68.08315\\-122.6637\\79\\66.13003\\-122.1639\\79\\64.1769\\-120.7806\\79\\62.90795\\-119.5834\\79\\62.73252\\-117.6303\\79\\62.86425\\-115.6771\\79\\63.74897\\-113.724\\79\\64.1769\\-113.444\\79\\66.13003\\-112.7724\\79\\70.03628\\-114.5825\\79\\71.9894\\-115.5532\\79\\73.94253\\-116.7347\\79\\75.89565\\-118.2759\\79\\77.84878\\-119.2885\\79\\79.8019\\-120.7864\\79\\81.75503\\-121.9877\\79\\83.70815\\-122.7132\\79\\85.66128\\-123.6382\\79\\87.6144\\-124.1842\\79\\89.56753\\-124.9575\\79\\91.52065\\-126.0698\\79\\93.47378\\-126.9381\\79\\95.4269\\-128.7408\\79\\97.38003\\-130.0194\\79\\99.33315\\-130.5658\\79\\101.2863\\-132.2507\\79\\103.2394\\-133.6712\\79\\105.1925\\-134.5884\\79\\105.9484\\-135.2084\\79\\108.8168\\-137.1615\\79\\112.3075\\-141.0678\\79\\113.7095\\-143.0209\\79\\113.7845\\-144.974\\79\\113.005\\-145.8683\\79" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "608" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-139.7152\\81\\-108.4472\\-137.1615\\81\\-108.0392\\-135.2084\\81\\-107.6981\\-134.8601\\81\\-105.745\\-133.7008\\81\\-102.3055\\-131.3021\\81\\-101.8387\\-130.8952\\81\\-99.8856\\-129.7696\\81\\-97.93247\\-128.3511\\81\\-95.97935\\-126.479\\81\\-94.02622\\-125.219\\81\\-90.11997\\-123.9779\\81\\-88.16685\\-122.8333\\81\\-86.92442\\-121.5365\\81\\-85.53764\\-119.5834\\81\\-84.2606\\-118.5357\\81\\-82.30747\\-118.4641\\81\\-80.35435\\-116.8462\\81\\-78.64193\\-115.6771\\81\\-76.4481\\-113.8479\\81\\-74.30623\\-111.7709\\81\\-72.54185\\-110.7898\\81\\-68.6356\\-110.612\\81\\-67.29961\\-111.7709\\81\\-67.10735\\-113.724\\81\\-67.10735\\-115.6771\\81\\-67.54118\\-117.6303\\81\\-69.11729\\-119.5834\\81\\-70.58872\\-120.6777\\81\\-72.54185\\-121.7684\\81\\-74.49497\\-122.6244\\81\\-76.4481\\-124.3078\\81\\-78.40122\\-125.1194\\81\\-82.30747\\-127.5754\\81\\-84.2606\\-128.4142\\81\\-86.21372\\-129.0808\\81\\-88.16685\\-130.2396\\81\\-90.11997\\-131.5463\\81\\-92.0731\\-132.3542\\81\\-94.02622\\-133.5583\\81\\-95.97935\\-134.4374\\81\\-96.87013\\-135.2084\\81\\-98.83344\\-137.1615\\81\\-99.8856\\-138.0576\\81\\-101.8387\\-139.4003\\81\\-103.7918\\-140.171\\81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "609" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-212.2256\\81\\50.50502\\-211.1808\\81\\48.5519\\-210.4784\\81\\46.59877\\-209.2401\\81\\44.64565\\-208.4597\\81\\40.7394\\-204.4183\\81\\39.01444\\-203.5678\\81\\38.56433\\-203.5678\\81\\36.83315\\-204.4333\\81\\34.88002\\-203.6262\\81\\35.29597\\-201.6146\\81\\36.83315\\-200.1668\\81\\38.78627\\-199.6239\\81\\40.7394\\-198.1251\\81\\41.14579\\-197.7084\\81\\42.4107\\-193.8021\\81\\43.66909\\-191.849\\81\\44.64565\\-190.8677\\81\\46.59877\\-189.1175\\81\\48.5519\\-188.3121\\81\\52.45815\\-187.0609\\81\\54.41127\\-186.8156\\81\\56.3644\\-186.8299\\81\\58.31752\\-187.105\\81\\60.27065\\-187.6722\\81\\62.22377\\-188.4455\\81\\64.1769\\-189.5878\\81\\64.49127\\-189.8959\\81\\65.36679\\-191.849\\81\\65.81521\\-193.8021\\81\\66.09246\\-195.7553\\81\\66.10732\\-197.7084\\81\\66.74038\\-199.6615\\81\\68.82858\\-201.6146\\81\\70.03628\\-202.6151\\81\\70.96611\\-203.5678\\81\\71.65136\\-205.5209\\81\\70.03628\\-206.5113\\81\\68.08315\\-205.1641\\81\\66.13003\\-206.8935\\81\\65.64175\\-207.474\\81\\65.02838\\-209.4271\\81\\62.22377\\-212.2113\\81\\60.27065\\-212.927\\81\\56.3644\\-212.9367\\81\\54.41127\\-212.7715\\81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002261" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "610" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "99.33315\\-134.3471\\81\\97.38003\\-133.1978\\81\\93.47378\\-132.0269\\81\\91.52065\\-130.9427\\81\\89.56753\\-130.0586\\81\\85.66128\\-128.1902\\81\\83.70815\\-127.0229\\81\\81.75503\\-126.2105\\81\\79.8019\\-125.1668\\81\\77.84878\\-124.9511\\81\\75.89565\\-124.267\\81\\73.94253\\-122.9648\\81\\71.9894\\-122.7345\\81\\70.03628\\-121.9027\\81\\68.08315\\-120.8322\\81\\66.13003\\-120.3195\\81\\65.30118\\-119.5834\\81\\65.16934\\-117.6303\\81\\66.13003\\-116.6203\\81\\68.08315\\-115.4572\\81\\70.03628\\-116.3343\\81\\71.9894\\-116.5948\\81\\73.94253\\-116.7285\\81\\75.89565\\-118.088\\81\\77.84878\\-119.2686\\81\\79.8019\\-120.6167\\81\\81.75503\\-121.3879\\81\\83.70815\\-122.3321\\81\\85.75681\\-123.4896\\81\\87.6144\\-124.3113\\81\\89.56753\\-124.9034\\81\\91.52065\\-125.9647\\81\\93.47378\\-126.8816\\81\\95.4269\\-129.0963\\81\\97.38003\\-130.4541\\81\\99.33315\\-130.8021\\81\\101.8722\\-133.2553\\81\\101.2863\\-134.2914\\81" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "611" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-105.745\\-138.1594\\83\\-107.5896\\-137.1615\\83\\-108.4571\\-135.2084\\83\\-107.6981\\-134.3841\\83\\-105.745\\-132.8478\\83\\-103.7918\\-131.7579\\83\\-100.4632\\-129.349\\83\\-97.93247\\-127.0704\\83\\-95.69452\\-125.4428\\83\\-94.02622\\-124.5286\\83\\-92.0731\\-124.2031\\83\\-90.11997\\-124.0669\\83\\-88.16685\\-122.9136\\83\\-86.85606\\-121.5365\\83\\-85.62138\\-119.5834\\83\\-84.2606\\-118.4864\\83\\-82.30747\\-118.4864\\83\\-80.35435\\-117.4419\\83\\-78.40122\\-116.5457\\83\\-76.4481\\-116.3053\\83\\-75.44628\\-115.6771\\83\\-74.49497\\-114.7872\\83\\-72.54185\\-114.2353\\83\\-70.40092\\-115.6771\\83\\-70.78119\\-117.6303\\83\\-72.84989\\-119.5834\\83\\-74.49497\\-120.8942\\83\\-75.61757\\-121.5365\\83\\-76.4481\\-122.2474\\83\\-78.40122\\-123.0781\\83\\-80.35435\\-124.4779\\83\\-82.30747\\-126.1491\\83\\-84.2606\\-126.9652\\83\\-86.21372\\-127.135\\83\\-88.16685\\-128.339\\83\\-90.11997\\-130.1557\\83\\-92.0731\\-130.9639\\83\\-94.02622\\-132.1067\\83\\-95.97935\\-132.8463\\83\\-97.93247\\-134.2256\\83\\-100.8807\\-137.1615\\83\\-101.8387\\-138.0119\\83\\-103.7918\\-138.3922\\83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002260" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "612" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-210.9273\\83\\48.5519\\-210.4037\\83\\46.59877\\-208.9135\\83\\44.64565\\-208.3404\\83\\43.84496\\-207.474\\83\\42.91632\\-205.5209\\83\\40.7394\\-203.7042\\83\\38.78627\\-203.3561\\83\\36.83315\\-204.4333\\83\\34.88002\\-204.0261\\83\\34.46408\\-203.5678\\83\\35.5879\\-201.6146\\83\\36.83315\\-200.4886\\83\\38.78627\\-199.7836\\83\\40.7394\\-198.527\\83\\41.55004\\-197.7084\\83\\42.22778\\-195.7553\\83\\43.96153\\-191.849\\83\\44.64565\\-191.1649\\83\\46.8479\\-189.8959\\83\\48.5519\\-189.0306\\83\\50.50502\\-188.7413\\83\\54.41127\\-187.5609\\83\\56.3644\\-187.5836\\83\\58.31752\\-188.3198\\83\\60.27065\\-188.7558\\83\\62.22377\\-189.3513\\83\\64.68073\\-191.849\\83\\65.41582\\-193.8021\\83\\65.63318\\-195.7553\\83\\65.65918\\-197.7084\\83\\66.9896\\-199.6615\\83\\70.96611\\-203.5678\\83\\71.65136\\-205.5209\\83\\70.03628\\-206.5113\\83\\68.08315\\-205.1641\\83\\66.13003\\-206.8935\\83\\65.64175\\-207.474\\83\\65.02838\\-209.4271\\83\\62.22377\\-212.2457\\83\\60.27065\\-212.927\\83\\56.3644\\-212.9367\\83\\54.41127\\-212.6254\\83" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "32" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "613" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-107.6981\\-135.8573\\85\\-108.2729\\-135.2084\\85\\-107.6981\\-134.5552\\85\\-105.745\\-133.3907\\85\\-103.4385\\-131.3021\\85\\-100.3173\\-129.349\\85\\-97.93247\\-127.1602\\85\\-95.97935\\-126.2972\\85\\-94.02622\\-125.2646\\85\\-92.0731\\-124.475\\85\\-90.11997\\-124.4662\\85\\-88.16685\\-123.6972\\85\\-86.10522\\-121.5365\\85\\-85.3921\\-119.5834\\85\\-84.2606\\-118.6109\\85\\-82.30747\\-118.6109\\85\\-80.35435\\-118.9473\\85\\-79.49114\\-119.5834\\85\\-79.18124\\-121.5365\\85\\-80.35435\\-122.6402\\85\\-82.30747\\-123.3152\\85\\-84.2606\\-124.7017\\85\\-86.21372\\-125.2474\\85\\-88.16685\\-126.4402\\85\\-90.11997\\-128.4123\\85\\-92.0731\\-129.2968\\85\\-94.02622\\-130.3451\\85\\-95.97935\\-131.2355\\85\\-97.93247\\-131.2945\\85\\-99.8856\\-132.5468\\85\\-103.7918\\-136.3986\\85\\-105.745\\-136.7746\\85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002259" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "45" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "614" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-212.2513\\85\\50.50502\\-211.0032\\85\\48.5519\\-210.4235\\85\\46.59877\\-208.771\\85\\44.64565\\-207.2848\\85\\43.61606\\-205.5209\\85\\42.69252\\-204.5974\\85\\40.7394\\-203.3808\\85\\38.78627\\-203.4593\\85\\36.83315\\-204.4723\\85\\34.88002\\-204.31\\85\\34.21053\\-203.5678\\85\\35.66702\\-201.6146\\85\\36.83315\\-200.7011\\85\\38.78627\\-200.3757\\85\\40.7394\\-199.0049\\85\\41.76392\\-197.7084\\85\\43.10847\\-195.7553\\85\\43.72024\\-193.8021\\85\\44.64565\\-192.5722\\85\\46.59877\\-190.9681\\85\\48.5519\\-190.0313\\85\\50.50502\\-189.3731\\85\\52.45815\\-189.0175\\85\\54.41127\\-188.7856\\85\\56.3644\\-188.8023\\85\\60.27065\\-189.4018\\85\\62.22377\\-190.7823\\85\\64.1769\\-192.7107\\85\\65.1774\\-193.8021\\85\\65.63318\\-195.7553\\85\\65.65918\\-197.7084\\85\\67.10659\\-199.6615\\85\\71.00823\\-203.5678\\85\\71.65136\\-205.5209\\85\\70.03628\\-206.5352\\85\\68.08315\\-205.1641\\85\\66.13003\\-206.8935\\85\\65.64175\\-207.474\\85\\65.03913\\-209.4271\\85\\62.22377\\-212.4658\\85\\60.27065\\-212.9664\\85\\58.31752\\-213.0404\\85\\56.3644\\-212.9973\\85\\54.41127\\-212.8451\\85" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002258" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "615" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-213.6589\\87\\52.45815\\-212.606\\87\\50.50502\\-211.7672\\87\\48.5519\\-210.6993\\87\\46.59877\\-209.1016\\87\\44.64565\\-206.7765\\87\\43.70262\\-205.5209\\87\\42.69252\\-204.5361\\87\\40.7394\\-203.6763\\87\\36.83315\\-204.8092\\87\\34.88002\\-203.836\\87\\34.70564\\-203.5678\\87\\36.83315\\-201.3538\\87\\38.78627\\-201.0966\\87\\40.7394\\-200.547\\87\\41.6069\\-199.6615\\87\\42.22778\\-197.7084\\87\\43.54941\\-195.7553\\87\\44.09153\\-193.8021\\87\\44.64565\\-193.1075\\87\\46.59877\\-191.4696\\87\\48.5519\\-190.6867\\87\\50.50502\\-189.6368\\87\\54.41127\\-189.264\\87\\56.3644\\-189.3308\\87\\60.27065\\-189.6602\\87\\62.22377\\-190.9657\\87\\65.10995\\-193.8021\\87\\65.63318\\-195.7553\\87\\65.74309\\-197.7084\\87\\67.15726\\-199.6615\\87\\68.08315\\-200.6332\\87\\71.2072\\-203.5678\\87\\71.65136\\-205.5209\\87\\70.03628\\-206.756\\87\\68.08315\\-205.1641\\87\\66.13003\\-206.8935\\87\\65.64175\\-207.474\\87\\65.11277\\-209.4271\\87\\64.1769\\-210.7484\\87\\62.22377\\-212.8538\\87\\60.27065\\-213.5328\\87\\58.31752\\-213.9962\\87" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002257" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "616" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-214.013\\89\\50.50502\\-212.9189\\89\\48.5519\\-212.1711\\89\\46.59877\\-210.8212\\89\\45.55322\\-209.4271\\89\\44.39816\\-207.474\\89\\43.55057\\-205.5209\\89\\42.69252\\-204.7026\\89\\40.7394\\-204.4167\\89\\38.78627\\-204.5746\\89\\36.83315\\-206.1628\\89\\35.32976\\-205.5209\\89\\35.35369\\-203.5678\\89\\36.83315\\-202.2027\\89\\38.78627\\-201.4926\\89\\40.7394\\-201.2429\\89\\42.11646\\-199.6615\\89\\43.1179\\-197.7084\\89\\43.75267\\-195.7553\\89\\44.22028\\-193.8021\\89\\44.64565\\-193.2605\\89\\46.59877\\-191.5342\\89\\48.5519\\-190.7497\\89\\50.50502\\-189.5494\\89\\52.45815\\-189.2198\\89\\54.41127\\-189.0903\\89\\56.3644\\-189.3035\\89\\58.31752\\-189.6368\\89\\60.27065\\-189.8011\\89\\62.22377\\-191.0062\\89\\65.10487\\-193.8021\\89\\65.63318\\-195.7553\\89\\67.31416\\-199.6615\\89\\68.08315\\-200.5219\\89\\70.03628\\-201.8504\\89\\71.56403\\-203.5678\\89\\71.74327\\-205.5209\\89\\72.69408\\-207.474\\89\\71.9894\\-208.3474\\89\\70.03628\\-207.4993\\89\\68.49245\\-205.5209\\89\\68.08315\\-205.1641\\89\\66.13003\\-206.8935\\89\\65.64175\\-207.474\\89\\65.26732\\-209.4271\\89\\64.47382\\-211.3803\\89\\62.22377\\-213.6039\\89\\60.27065\\-214.3768\\89\\58.31752\\-214.8136\\89\\54.41127\\-214.1407\\89" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002256" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "617" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-215.3673\\91\\50.50502\\-214.6918\\91\\48.5519\\-214.2123\\91\\46.59877\\-212.7113\\91\\45.53683\\-211.3803\\91\\44.42185\\-209.4271\\91\\43.85975\\-207.474\\91\\42.69252\\-206.0062\\91\\40.7394\\-204.8444\\91\\38.78627\\-204.9716\\91\\36.83315\\-206.4057\\91\\35.00328\\-205.5209\\91\\35.69382\\-203.5678\\91\\36.83315\\-202.4338\\91\\38.78627\\-201.5339\\91\\40.7394\\-201.3328\\91\\42.17057\\-199.6615\\91\\43.31731\\-197.7084\\91\\43.78473\\-195.7553\\91\\44.14034\\-193.8021\\91\\45.86635\\-191.849\\91\\46.59877\\-191.2567\\91\\48.5519\\-190.5233\\91\\50.50502\\-189.2466\\91\\54.41127\\-188.277\\91\\56.3644\\-189.0869\\91\\58.31752\\-189.6602\\91\\62.22377\\-191.16\\91\\65.10487\\-193.8021\\91\\65.64175\\-195.7553\\91\\66.98203\\-197.7084\\91\\67.53693\\-199.6615\\91\\68.08315\\-200.2934\\91\\70.09786\\-201.6146\\91\\71.69643\\-203.5678\\91\\72.36642\\-205.5209\\91\\73.15639\\-207.474\\91\\71.9894\\-208.6469\\91\\70.42297\\-207.474\\91\\68.08315\\-205.1641\\91\\66.13003\\-206.8935\\91\\65.64175\\-207.474\\91\\65.5015\\-209.4271\\91\\65.01326\\-211.3803\\91\\62.22377\\-214.6144\\91\\60.27065\\-215.9008\\91\\58.31752\\-216.0726\\91\\54.41127\\-215.8626\\91" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002255" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "618" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-217.414\\93\\52.45815\\-216.4077\\93\\50.50502\\-215.7395\\93\\46.59877\\-214.1157\\93\\45.82499\\-213.3334\\93\\44.49704\\-211.3803\\93\\43.90727\\-209.4271\\93\\43.62156\\-207.474\\93\\42.69252\\-206.5109\\93\\40.7394\\-205.1539\\93\\38.78627\\-205.1539\\93\\36.83315\\-206.3771\\93\\35.56087\\-205.5209\\93\\35.96662\\-203.5678\\93\\36.83315\\-202.5963\\93\\38.78627\\-201.5061\\93\\40.7394\\-200.8024\\93\\41.83297\\-199.6615\\93\\42.57045\\-197.7084\\93\\43.47666\\-195.7553\\93\\43.88975\\-193.8021\\93\\45.60663\\-191.849\\93\\46.59877\\-190.921\\93\\48.5519\\-189.8583\\93\\50.50502\\-188.9538\\93\\52.45815\\-187.9505\\93\\54.41127\\-187.92\\93\\56.3644\\-189.0595\\93\\58.31752\\-189.6842\\93\\60.27065\\-190.8632\\93\\62.22377\\-191.4922\\93\\64.1769\\-192.9054\\93\\65.10487\\-193.8021\\93\\65.64175\\-195.7553\\93\\67.06772\\-197.7084\\93\\67.62119\\-199.6615\\93\\68.08315\\-200.201\\93\\70.11546\\-201.6146\\93\\71.9894\\-203.942\\93\\72.80556\\-205.5209\\93\\73.53389\\-207.474\\93\\71.9894\\-208.521\\93\\70.03628\\-206.5921\\93\\68.08315\\-205.2852\\93\\65.87093\\-207.474\\93\\65.71408\\-209.4271\\93\\65.27332\\-211.3803\\93\\64.35381\\-213.3334\\93\\62.94581\\-215.2865\\93\\62.22377\\-216.0202\\93\\60.27065\\-217.1704\\93\\58.31752\\-217.8016\\93\\56.3644\\-217.8093\\93" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002254" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "51" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "619" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-217.646\\95\\50.50502\\-216.4411\\95\\48.5519\\-215.7212\\95\\46.59877\\-214.5225\\95\\45.39724\\-213.3334\\95\\44.23925\\-211.3803\\95\\43.56881\\-207.474\\95\\42.69252\\-206.5258\\95\\40.7394\\-204.9512\\95\\38.78627\\-205.05\\95\\36.83315\\-205.842\\95\\36.48387\\-205.5209\\95\\36.56078\\-203.5678\\95\\38.78627\\-201.3441\\95\\40.7394\\-200.5211\\95\\41.611\\-199.6615\\95\\42.20424\\-197.7084\\95\\42.58402\\-195.7553\\95\\43.68743\\-193.8021\\95\\46.59877\\-190.813\\95\\48.5519\\-189.6602\\95\\50.50502\\-188.8485\\95\\52.45815\\-187.719\\95\\54.41127\\-188.5531\\95\\56.3644\\-189.1781\\95\\58.31752\\-189.6842\\95\\60.27065\\-190.9044\\95\\62.22377\\-191.556\\95\\64.1769\\-192.9054\\95\\65.10487\\-193.8021\\95\\65.753\\-195.7553\\95\\67.13462\\-197.7084\\95\\67.63017\\-199.6615\\95\\68.08315\\-200.1911\\95\\70.11546\\-201.6146\\95\\71.9894\\-203.9042\\95\\72.89687\\-205.5209\\95\\73.66005\\-207.474\\95\\71.9894\\-208.4601\\95\\70.03628\\-206.5207\\95\\68.08315\\-206.0747\\95\\67.04\\-207.474\\95\\66.4788\\-209.4271\\95\\65.5015\\-211.3803\\95\\65.00056\\-213.3334\\95\\63.3252\\-215.2865\\95\\62.22377\\-216.7663\\95\\60.27065\\-218.1887\\95\\58.31752\\-218.6638\\95\\56.3644\\-218.6638\\95\\54.41127\\-218.3071\\95" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002253" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "52" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "620" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-217.6266\\97\\48.5519\\-216.1359\\97\\47.19285\\-215.2865\\97\\44.57906\\-213.3334\\97\\44.22971\\-211.3803\\97\\44.13197\\-209.4271\\97\\43.79665\\-207.474\\97\\42.89627\\-205.5209\\97\\42.69252\\-205.3186\\97\\40.7394\\-204.5403\\97\\38.78627\\-204.6171\\97\\37.15867\\-203.5678\\97\\37.87724\\-201.6146\\97\\38.78627\\-200.7969\\97\\40.7394\\-199.5789\\97\\41.82982\\-197.7084\\97\\42.3357\\-195.7553\\97\\43.60746\\-193.8021\\97\\46.59877\\-190.803\\97\\48.5519\\-189.6484\\97\\50.50502\\-188.843\\97\\52.45815\\-187.707\\97\\54.41127\\-188.6125\\97\\56.3644\\-189.1635\\97\\58.31752\\-189.5919\\97\\60.27065\\-190.5891\\97\\62.22377\\-191.2276\\97\\64.1769\\-192.849\\97\\65.18834\\-193.8021\\97\\66.71706\\-195.7553\\97\\67.32939\\-197.7084\\97\\67.71616\\-199.6615\\97\\68.08315\\-200.0731\\97\\70.24143\\-201.6146\\97\\71.9894\\-203.7729\\97\\72.9614\\-205.5209\\97\\73.67171\\-207.474\\97\\71.9894\\-208.4554\\97\\70.03628\\-206.516\\97\\68.08315\\-206.6835\\97\\67.45836\\-207.474\\97\\66.97606\\-209.4271\\97\\65.70465\\-211.3803\\97\\65.29616\\-213.3334\\97\\64.47382\\-215.2865\\97\\62.92503\\-217.2396\\97\\62.22377\\-217.9157\\97\\60.27065\\-218.7838\\97\\58.31752\\-218.969\\97\\56.3644\\-218.969\\97\\54.41127\\-218.844\\97\\52.45815\\-218.3454\\97" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002252" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "621" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-218.089\\99\\48.5519\\-216.2222\\99\\46.59877\\-214.5592\\99\\45.33344\\-213.3334\\99\\44.22971\\-211.3803\\99\\44.14034\\-207.474\\99\\43.78503\\-205.5209\\99\\42.69252\\-204.3651\\99\\40.7394\\-203.5012\\99\\38.78627\\-202.7359\\99\\38.02944\\-201.6146\\99\\39.70121\\-199.6615\\99\\41.611\\-197.7084\\99\\42.32553\\-195.7553\\99\\43.63622\\-193.8021\\99\\46.59877\\-190.8578\\99\\48.5519\\-189.7215\\99\\50.50502\\-188.843\\99\\52.45815\\-187.6953\\99\\54.41127\\-187.8762\\99\\56.3644\\-188.7211\\99\\60.27065\\-189.7605\\99\\63.46841\\-191.849\\99\\66.13003\\-193.9123\\99\\67.31992\\-195.7553\\99\\67.65778\\-197.7084\\99\\68.67686\\-199.6615\\99\\70.81422\\-201.6146\\99\\72.51953\\-203.5678\\99\\73.24\\-205.5209\\99\\73.68155\\-207.474\\99\\71.9894\\-208.4457\\99\\70.03628\\-206.4928\\99\\68.08315\\-206.8736\\99\\67.60354\\-207.474\\99\\67.30097\\-209.4271\\99\\66.56738\\-211.3803\\99\\65.53029\\-213.3334\\99\\64.93645\\-215.2865\\99\\62.22377\\-218.0049\\99\\60.27065\\-218.957\\99\\54.41127\\-218.9811\\99\\52.45815\\-218.8779\\99" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002251" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "622" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-218.1645\\101\\45.60785\\-213.3334\\101\\44.22971\\-211.3803\\101\\44.22971\\-207.474\\101\\44.1748\\-205.5209\\101\\43.79665\\-203.5678\\101\\42.69252\\-202.4735\\101\\40.7394\\-202.4793\\101\\39.59818\\-201.6146\\101\\39.49428\\-199.6615\\101\\40.42503\\-197.7084\\101\\42.69252\\-195.4962\\101\\43.87835\\-193.8021\\101\\44.64565\\-192.8969\\101\\46.59877\\-191.2276\\101\\48.5519\\-190.4872\\101\\50.50502\\-188.874\\101\\52.45815\\-187.7311\\101\\54.41127\\-187.6953\\101\\56.3644\\-187.848\\101\\58.31752\\-188.6861\\101\\60.27065\\-189.1941\\101\\62.22377\\-190.5102\\101\\64.1769\\-191.2101\\101\\67.02867\\-193.8021\\101\\68.61633\\-195.7553\\101\\69.10834\\-197.7084\\101\\69.3185\\-199.6615\\101\\70.96425\\-201.6146\\101\\72.84786\\-203.5678\\101\\73.6607\\-205.5209\\101\\73.56878\\-207.474\\101\\71.9894\\-208.2355\\101\\70.03628\\-206.2899\\101\\68.08315\\-206.8837\\101\\67.6123\\-207.474\\101\\67.52122\\-209.4271\\101\\66.9123\\-211.3803\\101\\65.63318\\-213.3334\\101\\64.96745\\-215.2865\\101\\62.22377\\-218.0049\\101\\60.27065\\-218.957\\101\\52.45815\\-218.9811\\101" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002250" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "623" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-218.1591\\103\\45.65674\\-213.3334\\103\\44.24892\\-211.3803\\103\\44.22971\\-205.5209\\103\\44.18368\\-203.5678\\103\\43.80669\\-201.6146\\103\\42.69252\\-200.5005\\103\\40.7394\\-200.7848\\103\\38.88469\\-199.6615\\103\\39.70676\\-197.7084\\103\\40.7394\\-196.6758\\103\\42.69252\\-194.9843\\103\\44.64565\\-193.4873\\103\\46.59877\\-192.3801\\103\\47.19628\\-191.849\\103\\50.50502\\-189.2603\\103\\52.45815\\-188.5851\\103\\54.41127\\-187.6953\\103\\56.3644\\-187.6837\\103\\58.31752\\-187.7812\\103\\60.27065\\-188.6324\\103\\62.22377\\-189.2063\\103\\66.13003\\-191.767\\103\\68.13573\\-193.8021\\103\\69.33453\\-195.7553\\103\\69.57431\\-197.7084\\103\\69.65925\\-199.6615\\103\\70.98843\\-201.6146\\103\\72.91042\\-203.5678\\103\\73.7149\\-205.5209\\103\\73.22173\\-207.474\\103\\71.9894\\-207.8752\\103\\70.30196\\-205.5209\\103\\70.03628\\-205.2734\\103\\68.08315\\-206.8837\\103\\67.6123\\-207.474\\103\\67.60354\\-209.4271\\103\\66.94725\\-211.3803\\103\\65.62471\\-213.3334\\103\\64.96127\\-215.2865\\103\\62.22377\\-217.9992\\103\\60.27065\\-218.9453\\103\\58.31752\\-218.9811\\103\\52.45815\\-218.969\\103" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002249" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "624" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-217.5965\\105\\48.5519\\-216.19\\105\\47.65326\\-215.2865\\105\\45.98449\\-213.3334\\105\\45.39418\\-211.3803\\105\\44.28883\\-209.4271\\105\\44.28883\\-203.5678\\105\\44.23925\\-201.6146\\105\\43.82612\\-199.6615\\105\\42.69252\\-198.5222\\105\\41.63937\\-197.7084\\105\\41.37129\\-195.7553\\105\\42.69252\\-194.2207\\105\\44.64565\\-193.6124\\105\\46.59877\\-193.1459\\105\\48.5519\\-191.96\\105\\50.50502\\-189.579\\105\\52.45815\\-188.3492\\105\\54.41127\\-187.6279\\105\\56.3644\\-187.1476\\105\\58.31752\\-186.9783\\105\\60.27065\\-186.9949\\105\\62.22377\\-187.7658\\105\\64.1769\\-188.8767\\105\\66.13003\\-189.8267\\105\\68.13614\\-191.849\\105\\69.32651\\-193.8021\\105\\69.62988\\-195.7553\\105\\70.59989\\-197.7084\\105\\71.08829\\-199.6615\\105\\71.9894\\-201.4159\\105\\73.314\\-203.5678\\105\\73.70034\\-205.5209\\105\\72.99166\\-207.474\\105\\71.9894\\-207.7836\\105\\70.43964\\-205.5209\\105\\70.03628\\-205.1641\\105\\68.08315\\-206.8837\\105\\67.6123\\-207.474\\105\\67.60354\\-209.4271\\105\\66.94725\\-211.3803\\105\\65.27608\\-213.3334\\105\\64.46063\\-215.2865\\105\\62.22377\\-217.5544\\105\\60.27065\\-218.3046\\105\\58.31752\\-218.957\\105\\54.41127\\-218.9453\\105\\52.45815\\-218.3987\\105" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002248" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "625" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-217.6743\\107\\50.50502\\-216.4807\\107\\48.5519\\-214.8474\\107\\47.29865\\-213.3334\\107\\45.90334\\-211.3803\\107\\45.72923\\-209.4271\\107\\45.72923\\-201.6146\\107\\45.69557\\-199.6615\\107\\44.64565\\-197.5903\\107\\42.69252\\-196.9181\\107\\40.76444\\-195.7553\\107\\41.44713\\-193.8021\\107\\42.69252\\-192.623\\107\\44.64565\\-192.6192\\107\\46.59877\\-193.0671\\107\\48.5519\\-192.6116\\107\\49.32316\\-191.849\\107\\50.18387\\-189.8959\\107\\51.52327\\-187.9428\\107\\52.45815\\-187.18\\107\\56.3644\\-186.529\\107\\58.31752\\-185.9669\\107\\60.27065\\-185.9669\\107\\62.22377\\-186.6459\\107\\64.1769\\-186.9399\\107\\66.13003\\-187.7764\\107\\68.23619\\-189.8959\\107\\69.33212\\-191.849\\107\\69.64934\\-193.8021\\107\\70.62898\\-195.7553\\107\\71.31252\\-197.7084\\107\\71.62241\\-199.6615\\107\\72.8451\\-201.6146\\107\\73.67199\\-203.5678\\107\\73.70034\\-205.5209\\107\\71.9894\\-206.7643\\107\\70.03628\\-205.2279\\107\\68.08315\\-206.9447\\107\\67.65778\\-207.474\\107\\67.57784\\-209.4271\\107\\66.88659\\-211.3803\\107\\64.1769\\-214.1886\\107\\62.22377\\-216.3311\\107\\60.27065\\-217.9942\\107\\58.31752\\-218.8585\\107\\56.3644\\-218.8918\\107\\54.41127\\-218.379\\107" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002247" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "626" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-217.5652\\109\\52.45815\\-216.4486\\109\\50.50502\\-215.5456\\109\\48.5519\\-213.9682\\109\\48.03523\\-213.3334\\109\\47.32696\\-211.3803\\109\\46.15488\\-209.4271\\109\\46.06864\\-207.474\\109\\46.06055\\-199.6615\\109\\45.85678\\-197.7084\\109\\44.64565\\-195.5999\\109\\42.69252\\-195.1856\\109\\40.79936\\-193.8021\\109\\41.45866\\-191.849\\109\\42.69252\\-190.6782\\109\\44.64565\\-191.1808\\109\\46.59877\\-192.265\\109\\47.36449\\-191.849\\109\\48.5519\\-190.916\\109\\49.20109\\-189.8959\\109\\49.88992\\-187.9428\\109\\50.50502\\-187.3196\\109\\52.45815\\-186.4417\\109\\54.41127\\-185.1732\\109\\56.3644\\-184.919\\109\\62.22377\\-184.919\\109\\64.1769\\-185.2828\\109\\66.13003\\-186.5833\\109\\68.08315\\-187.7368\\109\\69.3424\\-189.8959\\109\\69.66929\\-191.849\\109\\70.65157\\-193.8021\\109\\71.32261\\-195.7553\\109\\71.65331\\-197.7084\\109\\71.73031\\-199.6615\\109\\72.89927\\-201.6146\\109\\73.73082\\-203.5678\\109\\73.69025\\-205.5209\\109\\71.9894\\-206.5165\\109\\70.03628\\-206.0957\\109\\68.57439\\-207.474\\109\\67.23376\\-209.4271\\109\\66.13003\\-210.7099\\109\\62.22377\\-214.6553\\109\\60.27065\\-216.5198\\109\\58.31752\\-217.7937\\109\\56.3644\\-217.832\\109" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002246" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "627" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-215.8667\\111\\52.45815\\-214.791\\111\\50.74916\\-213.3334\\111\\48.5519\\-210.9471\\111\\47.41623\\-209.4271\\111\\46.30581\\-207.474\\111\\46.1734\\-205.5209\\111\\46.1734\\-201.6146\\111\\45.99319\\-197.7084\\111\\45.4863\\-195.7553\\111\\44.64565\\-194.7845\\111\\42.69252\\-193.1958\\111\\40.91619\\-191.849\\111\\41.36763\\-189.8959\\111\\42.69252\\-188.6935\\111\\44.64565\\-189.491\\111\\46.59877\\-189.3398\\111\\47.27385\\-187.9428\\111\\48.5519\\-185.6589\\111\\49.74935\\-184.0365\\111\\50.50502\\-183.4748\\111\\54.41127\\-182.8848\\111\\56.3644\\-182.8483\\111\\62.22377\\-182.8862\\111\\64.1769\\-183.7564\\111\\64.54188\\-184.0365\\111\\68.08315\\-185.7787\\111\\69.34603\\-187.9428\\111\\69.68975\\-189.8959\\111\\70.67048\\-191.849\\111\\71.32617\\-193.8021\\111\\71.65331\\-195.7553\\111\\71.84079\\-199.6615\\111\\72.95634\\-201.6146\\111\\73.72629\\-203.5678\\111\\73.51614\\-205.5209\\111\\71.9894\\-206.1942\\111\\70.03628\\-205.6526\\111\\68.87722\\-207.474\\111\\67.0244\\-209.4271\\111\\64.1769\\-212.2702\\111\\62.22377\\-214.1504\\111\\60.27065\\-215.3387\\111\\58.31752\\-215.8725\\111" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002245" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "48" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "628" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-213.9825\\113\\52.45815\\-212.8317\\113\\50.50502\\-211.0124\\113\\48.5519\\-209.0323\\113\\47.38932\\-207.474\\113\\46.35129\\-205.5209\\113\\46.08509\\-201.6146\\113\\45.0474\\-195.7553\\113\\43.09776\\-191.849\\113\\42.69252\\-191.4597\\113\\40.7394\\-190.5951\\113\\39.95164\\-189.8959\\113\\40.51404\\-187.9428\\113\\40.7394\\-187.694\\113\\42.69252\\-186.6657\\113\\44.64565\\-185.9588\\113\\46.58839\\-184.0365\\113\\47.77298\\-180.1303\\113\\48.5519\\-176.5495\\113\\48.87742\\-176.224\\113\\50.50502\\-175.8541\\113\\56.3644\\-175.8752\\113\\58.07338\\-178.1771\\113\\58.31752\\-178.2768\\113\\60.39105\\-180.1303\\113\\62.22377\\-180.8164\\113\\64.1769\\-181.7493\\113\\64.60483\\-182.0834\\113\\66.13003\\-182.7831\\113\\68.08315\\-183.9341\\113\\69.35626\\-185.9896\\113\\69.72146\\-187.9428\\113\\70.70034\\-189.8959\\113\\71.32617\\-191.849\\113\\71.64288\\-193.8021\\113\\71.71886\\-197.7084\\113\\73.37286\\-201.6146\\113\\73.71953\\-203.5678\\113\\73.72201\\-205.5209\\113\\71.9894\\-205.9217\\113\\70.03628\\-205.1035\\113\\69.70019\\-205.5209\\113\\68.92368\\-207.474\\113\\66.13003\\-210.2705\\113\\64.1769\\-212.1279\\113\\62.20827\\-213.3334\\113\\60.27065\\-213.9968\\113\\58.31752\\-214.0521\\113" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002244" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "56" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "629" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-211.6679\\115\\50.50502\\-210.2983\\115\\49.65795\\-209.4271\\115\\48.03822\\-207.474\\115\\47.32494\\-205.5209\\115\\46.09346\\-203.5678\\115\\45.71749\\-201.6146\\115\\44.44621\\-197.7084\\115\\44.21096\\-195.7553\\115\\43.74314\\-193.8021\\115\\43.10403\\-191.849\\115\\42.69252\\-191.3256\\115\\40.7394\\-188.323\\115\\38.78627\\-188.7283\\115\\38.39775\\-187.9428\\115\\38.86405\\-185.9896\\115\\40.7394\\-184.6975\\115\\42.69252\\-184.1771\\115\\44.75833\\-182.0834\\115\\45.20456\\-180.1303\\115\\45.27344\\-176.224\\115\\45.66333\\-174.2709\\115\\46.59877\\-172.7387\\115\\48.5519\\-170.5274\\115\\50.50502\\-170.4534\\115\\54.41127\\-170.4623\\115\\56.3644\\-170.9245\\115\\57.77645\\-172.3178\\115\\58.31752\\-172.6659\\115\\59.90865\\-174.2709\\115\\60.9669\\-176.224\\115\\62.22377\\-178.1848\\115\\64.1769\\-178.9726\\115\\66.13003\\-180.3046\\115\\69.0216\\-184.0365\\115\\69.74331\\-185.9896\\115\\70.71876\\-187.9428\\115\\71.33662\\-189.8959\\115\\71.64288\\-191.849\\115\\71.71886\\-197.7084\\115\\72.85578\\-199.6615\\115\\73.6607\\-201.6146\\115\\73.93365\\-203.5678\\115\\74.68025\\-205.5209\\115\\73.94253\\-206.391\\115\\71.9894\\-205.8642\\115\\70.03628\\-204.9014\\115\\69.548\\-205.5209\\115\\68.81814\\-207.474\\115\\66.13003\\-210.1763\\115\\64.13126\\-211.3803\\115\\62.22377\\-212.4111\\115\\60.27065\\-212.9539\\115\\58.31752\\-213.0743\\115\\56.3644\\-212.9743\\115\\54.41127\\-212.5213\\115" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002243" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "62" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "630" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-211.6312\\117\\52.45815\\-210.5455\\117\\50.50502\\-208.9328\\117\\48.5519\\-206.7748\\117\\47.59301\\-205.5209\\117\\45.84288\\-203.5678\\117\\45.25123\\-201.6146\\117\\44.34169\\-199.6615\\117\\44.11552\\-197.7084\\117\\43.73388\\-195.7553\\117\\43.22879\\-193.8021\\117\\42.274\\-191.849\\117\\42.01565\\-189.8959\\117\\41.40594\\-187.9428\\117\\40.7394\\-187.2866\\117\\38.98972\\-187.9428\\117\\37.69968\\-189.8959\\117\\36.83315\\-190.3231\\117\\36.42571\\-189.8959\\117\\36.19626\\-187.9428\\117\\37.53249\\-185.9896\\117\\37.53249\\-184.0365\\117\\38.78627\\-182.7908\\117\\40.7394\\-182.2731\\117\\42.88359\\-180.1303\\117\\43.27962\\-178.1771\\117\\43.32119\\-172.3178\\117\\44.64565\\-170.3451\\117\\45.38934\\-168.4115\\117\\46.59877\\-167.2964\\117\\48.5519\\-167.1627\\117\\52.45815\\-167.1702\\117\\54.41127\\-167.2649\\117\\56.3644\\-167.4742\\117\\57.72345\\-168.4115\\117\\60.27065\\-170.883\\117\\61.43642\\-172.3178\\117\\62.22377\\-173.8541\\117\\64.00251\\-176.224\\117\\66.13003\\-178.2579\\117\\67.50584\\-180.1303\\117\\68.75489\\-182.0834\\117\\69.51961\\-184.0365\\117\\70.72986\\-185.9896\\117\\71.34706\\-187.9428\\117\\71.64288\\-189.8959\\117\\71.69643\\-191.849\\117\\71.73031\\-197.7084\\117\\72.90119\\-199.6615\\117\\73.94253\\-201.9402\\117\\74.59184\\-203.5678\\117\\75.17208\\-205.5209\\117\\73.94253\\-206.7316\\117\\71.87865\\-205.5209\\117\\70.03628\\-204.5335\\117\\69.1893\\-205.5209\\117\\68.08315\\-207.3881\\117\\66.08967\\-209.4271\\117\\62.22377\\-211.5673\\117\\60.27065\\-212.3817\\117\\58.31752\\-212.7251\\117\\56.3644\\-212.4525\\117" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002242" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "59" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "631" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-211.5546\\119\\54.41127\\-210.5174\\119\\52.45815\\-209.6645\\119\\50.50502\\-208.3898\\119\\48.5519\\-206.5021\\119\\45.93592\\-203.5678\\119\\45.46977\\-201.6146\\119\\44.25871\\-199.6615\\119\\43.799\\-197.7084\\119\\43.22055\\-195.7553\\119\\42.274\\-193.8021\\119\\41.75703\\-191.849\\119\\41.51408\\-189.8959\\119\\40.97512\\-187.9428\\119\\38.78627\\-185.7156\\119\\36.83315\\-185.356\\119\\35.88342\\-184.0365\\119\\36.3756\\-182.0834\\119\\36.83315\\-181.6383\\119\\38.78627\\-180.7998\\119\\39.97786\\-180.1303\\119\\40.7394\\-179.2079\\119\\41.27878\\-178.1771\\119\\41.29503\\-172.3178\\119\\41.4354\\-170.3646\\119\\42.83099\\-168.4115\\119\\43.99704\\-166.4584\\119\\44.64565\\-165.8098\\119\\46.59877\\-165.2118\\119\\52.45815\\-165.2233\\119\\54.41127\\-165.6271\\119\\58.31752\\-167.0365\\119\\60.27065\\-168.31\\119\\62.22377\\-170.3723\\119\\63.42678\\-172.3178\\119\\64.1769\\-174.0241\\119\\65.55272\\-176.224\\119\\68.08315\\-179.473\\119\\68.66909\\-180.1303\\119\\69.38694\\-182.0834\\119\\70.62331\\-184.0365\\119\\71.36123\\-185.9896\\119\\71.64288\\-187.9428\\119\\71.69643\\-189.8959\\119\\71.69643\\-193.8021\\119\\71.89466\\-195.7553\\119\\72.19315\\-197.7084\\119\\73.07387\\-199.6615\\119\\74.18154\\-201.6146\\119\\74.88622\\-203.5678\\119\\74.65784\\-205.5209\\119\\73.94253\\-206.1414\\119\\71.9894\\-204.5764\\119\\70.03628\\-204.3145\\119\\67.21873\\-207.474\\119\\66.13003\\-208.5575\\119\\64.1769\\-210.2094\\119\\60.62423\\-211.3803\\119\\58.31752\\-212.0563\\119" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002241" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "632" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-209.6155\\121\\52.45815\\-208.5507\\121\\50.50502\\-207.6857\\121\\48.5519\\-206.2927\\121\\47.80809\\-205.5209\\121\\46.38707\\-203.5678\\121\\45.69422\\-201.6146\\121\\44.56488\\-199.6615\\121\\43.70978\\-197.7084\\121\\42.44504\\-195.7553\\121\\41.85997\\-193.8021\\121\\41.4694\\-191.849\\121\\40.46703\\-189.8959\\121\\39.27456\\-185.9896\\121\\38.78627\\-185.2615\\121\\37.5051\\-184.0365\\121\\36.83315\\-183.567\\121\\35.11874\\-182.0834\\121\\36.83315\\-180.5089\\121\\38.78627\\-178.8793\\121\\39.28312\\-178.1771\\121\\39.54217\\-174.2709\\121\\39.5479\\-172.3178\\121\\39.8055\\-170.3646\\121\\41.04539\\-168.4115\\121\\42.05147\\-166.4584\\121\\42.69252\\-165.7427\\121\\44.64565\\-163.8993\\121\\46.59877\\-163.4794\\121\\52.45815\\-163.4837\\121\\54.41127\\-164.1133\\121\\56.3644\\-165.2917\\121\\58.31752\\-165.69\\121\\59.51885\\-166.4584\\121\\62.22377\\-168.4342\\121\\64.1769\\-171.4135\\121\\64.85506\\-172.3178\\121\\65.51573\\-174.2709\\121\\66.85279\\-176.224\\121\\67.4203\\-178.1771\\121\\68.95491\\-180.1303\\121\\69.6109\\-182.0834\\121\\70.89658\\-184.0365\\121\\71.65331\\-185.9896\\121\\71.69643\\-191.849\\121\\71.90863\\-193.8021\\121\\72.75234\\-195.7553\\121\\73.28606\\-197.7084\\121\\74.33178\\-199.6615\\121\\74.98818\\-201.6146\\121\\75.02121\\-203.5678\\121\\73.94253\\-204.4599\\121\\72.66315\\-203.5678\\121\\71.9894\\-202.9287\\121\\70.03628\\-203.4111\\121\\68.80407\\-205.5209\\121\\66.13003\\-208.2482\\121\\62.22377\\-210.4037\\121\\60.27065\\-210.7603\\121\\58.31752\\-210.8182\\121\\56.3644\\-210.4902\\121" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002240" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "65" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "633" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-209.5365\\123\\54.41127\\-208.5407\\123\\52.45815\\-207.6994\\123\\50.50502\\-206.4865\\123\\49.26149\\-205.5209\\123\\47.51062\\-203.5678\\123\\46.12793\\-201.6146\\123\\45.49636\\-199.6615\\123\\43.91191\\-197.7084\\123\\42.68489\\-195.7553\\123\\41.97475\\-193.8021\\123\\41.5532\\-191.849\\123\\39.86466\\-189.8959\\123\\38.77864\\-185.9896\\123\\38.38453\\-184.0365\\123\\36.83315\\-182.8109\\123\\34.88002\\-183.189\\123\\33.58014\\-182.0834\\123\\34.25682\\-180.1303\\123\\34.88002\\-179.292\\123\\36.83315\\-178.0564\\123\\37.78687\\-176.224\\123\\38.45165\\-174.2709\\123\\38.58398\\-172.3178\\123\\39.30823\\-170.3646\\123\\39.85453\\-168.4115\\123\\41.22187\\-166.4584\\123\\42.24973\\-164.5053\\123\\42.69252\\-164.0706\\123\\44.64565\\-163.2083\\123\\46.59877\\-162.9681\\123\\52.45815\\-162.9681\\123\\54.41127\\-163.287\\123\\56.3644\\-163.713\\123\\58.31752\\-165.0721\\123\\60.27065\\-165.6761\\123\\63.22659\\-168.4115\\123\\64.79939\\-170.3646\\123\\65.37048\\-172.3178\\123\\66.73402\\-174.2709\\123\\67.39059\\-176.224\\123\\67.5863\\-178.1771\\123\\68.97912\\-180.1303\\123\\69.63955\\-182.0834\\123\\70.79638\\-184.0365\\123\\71.54006\\-185.9896\\123\\71.90863\\-187.9428\\123\\72.1676\\-189.8959\\123\\72.18186\\-191.849\\123\\72.77436\\-193.8021\\123\\74.31488\\-195.7553\\123\\74.96537\\-197.7084\\123\\75.25346\\-199.6615\\123\\75.2668\\-201.6146\\123\\73.94253\\-202.78\\123\\72.59787\\-201.6146\\123\\71.9894\\-200.8955\\123\\70.03628\\-201.5083\\123\\69.06983\\-203.5678\\123\\68.08315\\-205.2989\\123\\66.01247\\-207.474\\123\\64.1769\\-208.4506\\123\\62.05222\\-209.4271\\123\\60.27065\\-210.1067\\123\\58.31752\\-210.1261\\123" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002239" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "72" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "634" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-206.5714\\125\\51.08061\\-205.5209\\125\\49.15432\\-203.5678\\125\\47.51313\\-201.6146\\125\\46.13681\\-199.6615\\125\\45.26598\\-197.7084\\125\\43.69781\\-195.7553\\125\\42.59778\\-193.8021\\125\\41.6426\\-191.849\\125\\39.70351\\-189.8959\\125\\38.76357\\-187.9428\\125\\38.42715\\-185.9896\\125\\37.85878\\-184.0365\\125\\36.83315\\-182.2921\\125\\34.88002\\-182.2864\\125\\33.8583\\-184.0365\\125\\32.9269\\-185.402\\125\\30.97377\\-185.5733\\125\\29.89048\\-184.0365\\125\\30.97377\\-182.8565\\125\\31.98848\\-182.0834\\125\\33.06796\\-180.1303\\125\\33.55513\\-178.1771\\125\\34.88002\\-176.7904\\125\\35.74697\\-176.224\\125\\36.83315\\-175.1804\\125\\37.3821\\-174.2709\\125\\37.82954\\-172.3178\\125\\38.51014\\-170.3646\\125\\39.75367\\-168.4115\\125\\40.65863\\-166.4584\\125\\41.76759\\-164.5053\\125\\42.69252\\-163.608\\125\\44.64565\\-162.8987\\125\\46.59877\\-162.4292\\125\\48.5519\\-162.3268\\125\\50.50502\\-162.5146\\125\\52.45815\\-162.8227\\125\\54.41127\\-162.8987\\125\\56.3644\\-163.2683\\125\\58.31752\\-163.7849\\125\\60.27065\\-165.2086\\125\\62.22377\\-166.1654\\125\\64.41931\\-168.4115\\125\\65.35731\\-170.3646\\125\\65.7835\\-172.3178\\125\\67.08142\\-174.2709\\125\\67.5612\\-176.224\\125\\67.62119\\-178.1771\\125\\68.97912\\-180.1303\\125\\69.63955\\-182.0834\\125\\70.13101\\-184.0365\\125\\71.2362\\-185.9896\\125\\72.70218\\-187.9428\\125\\73.1853\\-189.8959\\125\\73.35191\\-191.849\\125\\74.37579\\-193.8021\\125\\75.28259\\-195.7553\\125\\75.57753\\-197.7084\\125\\75.1795\\-199.6615\\125\\73.94253\\-200.8641\\125\\73.1457\\-199.6615\\125\\71.9894\\-198.3152\\125\\70.03628\\-199.515\\125\\69.03374\\-201.6146\\125\\67.93346\\-203.5678\\125\\66.95329\\-205.5209\\125\\66.13003\\-206.3254\\125\\62.22377\\-208.2654\\125\\60.27065\\-208.8196\\125\\58.31752\\-208.831\\125\\56.3644\\-208.3888\\125" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002238" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "69" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "635" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "58.31752\\-207.8685\\127\\56.3644\\-206.5053\\127\\52.45815\\-205.491\\127\\50.36959\\-203.5678\\127\\49.275\\-201.6146\\127\\47.53753\\-199.6615\\127\\46.31695\\-197.7084\\127\\45.3951\\-195.7553\\127\\44.64565\\-195.0058\\127\\43.71027\\-193.8021\\127\\41.9167\\-191.849\\127\\39.78827\\-189.8959\\127\\38.6642\\-187.9428\\127\\37.48928\\-184.0365\\127\\36.83315\\-182.1278\\127\\35.79086\\-180.1303\\127\\34.88002\\-179.396\\127\\34.10989\\-180.1303\\127\\33.24534\\-182.0834\\127\\32.13842\\-184.0365\\127\\30.97377\\-184.935\\127\\29.16657\\-184.0365\\127\\30.01979\\-182.0834\\127\\30.97377\\-180.7081\\127\\31.6041\\-180.1303\\127\\32.05078\\-178.1771\\127\\33.22679\\-176.224\\127\\35.81618\\-174.2709\\127\\37.30399\\-172.3178\\127\\37.93301\\-170.3646\\127\\39.74902\\-168.4115\\127\\40.91378\\-166.4584\\127\\41.94633\\-164.5053\\127\\42.69252\\-163.7777\\127\\44.64565\\-163.0258\\127\\46.59877\\-161.7383\\127\\48.5519\\-161.5114\\127\\50.50502\\-161.7639\\127\\52.45815\\-162.5\\127\\54.41127\\-162.8227\\127\\56.3644\\-162.9292\\127\\58.31752\\-163.6803\\127\\60.27065\\-164.741\\127\\62.22377\\-165.6423\\127\\65.00475\\-168.4115\\127\\65.5759\\-170.3646\\127\\66.68045\\-172.3178\\127\\67.40984\\-174.2709\\127\\67.60354\\-176.224\\127\\67.62119\\-178.1771\\127\\68.97912\\-180.1303\\127\\69.87469\\-182.0834\\127\\70.33755\\-184.0365\\127\\71.9894\\-186.0729\\127\\73.35992\\-187.9428\\127\\74.14196\\-189.8959\\127\\74.51597\\-191.849\\127\\74.86108\\-195.7553\\127\\74.19508\\-197.7084\\127\\73.81943\\-197.7084\\127\\71.9894\\-195.764\\127\\70.03628\\-197.0031\\127\\68.87997\\-199.6615\\127\\67.7148\\-201.6146\\127\\66.82488\\-203.5678\\127\\66.13003\\-204.359\\127\\64.1769\\-205.9971\\127\\62.22377\\-206.3089\\127\\60.27065\\-207.8369\\127" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002237" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "65" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "636" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "54.41127\\-203.9845\\129\\53.28318\\-203.5678\\129\\52.45815\\-202.9912\\129\\51.38025\\-201.6146\\129\\49.46397\\-199.6615\\129\\48.1426\\-197.7084\\129\\47.48111\\-195.7553\\129\\45.56942\\-193.8021\\129\\44.64565\\-193.1093\\129\\42.69252\\-191.3317\\129\\40.61312\\-189.8959\\129\\38.98571\\-187.9428\\129\\38.23064\\-185.9896\\129\\37.5927\\-184.0365\\129\\36.82552\\-182.0834\\129\\36.76656\\-180.1303\\129\\35.86616\\-178.1771\\129\\34.88002\\-177.524\\129\\34.18633\\-178.1771\\129\\33.04897\\-180.1303\\129\\31.74546\\-182.0834\\129\\30.97377\\-183.0514\\129\\30.05418\\-182.0834\\129\\30.26789\\-180.1303\\129\\30.97377\\-178.3009\\129\\32.16615\\-176.224\\129\\32.9269\\-175.3945\\129\\34.88002\\-174.5831\\129\\36.87071\\-172.3178\\129\\37.7999\\-170.3646\\129\\39.75819\\-168.4115\\129\\41.52742\\-166.4584\\129\\43.19317\\-164.5053\\129\\44.64565\\-163.4227\\129\\46.59877\\-161.7144\\129\\48.5519\\-161.2449\\129\\50.50502\\-161.3564\\129\\52.45815\\-161.7559\\129\\54.41127\\-162.4714\\129\\56.3644\\-162.8777\\129\\58.31752\\-163.6714\\129\\62.22377\\-165.627\\129\\65.02587\\-168.4115\\129\\65.62471\\-170.3646\\129\\66.83776\\-172.3178\\129\\67.46218\\-174.2709\\129\\67.60354\\-176.224\\129\\67.89615\\-178.1771\\129\\69.35509\\-180.1303\\129\\70.03628\\-181.2121\\129\\71.9894\\-183.1052\\129\\72.71828\\-184.0365\\129\\73.07937\\-185.9896\\129\\72.99166\\-187.9428\\129\\71.9894\\-189.8471\\129\\70.03628\\-191.6342\\129\\68.57546\\-193.8021\\129\\68.35688\\-195.7553\\129\\68.26001\\-197.7084\\129\\66.13003\\-200.859\\129\\64.1769\\-202.7615\\129\\63.18639\\-203.5678\\129\\62.22377\\-204.056\\129\\60.27065\\-204.2467\\129\\58.31752\\-204.2587\\129" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002236" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "61" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "637" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-201.9023\\131\\55.36459\\-201.6146\\131\\54.41127\\-200.9243\\131\\52.45815\\-199.3047\\131\\51.05124\\-197.7084\\131\\50.50502\\-196.8821\\131\\50.07419\\-195.7553\\131\\48.59768\\-193.8021\\131\\46.59877\\-192.2663\\131\\44.64565\\-191.685\\131\\42.69252\\-190.7992\\131\\40.7394\\-189.1562\\131\\39.52595\\-187.9428\\131\\38.61189\\-185.9896\\131\\37.83748\\-184.0365\\131\\37.29671\\-182.0834\\131\\36.78097\\-178.1771\\131\\34.88002\\-176.7859\\131\\33.0354\\-178.1771\\131\\30.97377\\-180.5392\\131\\30.59993\\-180.1303\\131\\30.2061\\-178.1771\\131\\32.9269\\-175.3152\\131\\34.88002\\-174.119\\131\\36.83315\\-171.9384\\131\\37.79008\\-170.3646\\131\\39.76284\\-168.4115\\131\\44.64565\\-163.7791\\131\\46.59877\\-162.4024\\131\\48.5519\\-161.5756\\131\\50.50502\\-161.2238\\131\\52.45815\\-161.4468\\131\\54.41127\\-161.964\\131\\56.3644\\-162.8777\\131\\58.31752\\-163.6714\\131\\62.22377\\-165.627\\131\\65.02587\\-168.4115\\131\\66.19816\\-172.3178\\131\\67.20473\\-174.2709\\131\\67.89615\\-176.224\\131\\69.37593\\-178.1771\\131\\70.03628\\-178.8313\\131\\71.77925\\-180.1303\\131\\72.79903\\-182.0834\\131\\72.57534\\-184.0365\\131\\71.9894\\-185.0962\\131\\70.2021\\-182.0834\\131\\69.89895\\-182.0834\\131\\68.91209\\-184.0365\\131\\68.9127\\-185.9896\\131\\68.4232\\-187.9428\\131\\66.5257\\-191.849\\131\\66.29409\\-193.8021\\131\\66.265\\-195.7553\\131\\66.13003\\-196.3701\\131\\65.4609\\-197.7084\\131\\64.1769\\-199.0418\\131\\63.35058\\-199.6615\\131\\60.27065\\-200.9444\\131\\59.37119\\-201.6146\\131\\58.31752\\-201.8908\\131" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002235" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "55" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "638" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "56.3644\\-196.4419\\133\\54.41127\\-195.5705\\133\\52.68944\\-193.8021\\133\\50.65151\\-191.849\\133\\48.5519\\-190.7073\\133\\44.64565\\-190.3184\\133\\42.69252\\-189.7475\\133\\40.7394\\-188.7143\\133\\39.96786\\-187.9428\\133\\39.04536\\-185.9896\\133\\38.28355\\-184.0365\\133\\38.03632\\-182.0834\\133\\37.62171\\-180.1303\\133\\37.08234\\-178.1771\\133\\36.83315\\-177.8881\\133\\34.88002\\-176.5388\\133\\32.9269\\-177.1323\\133\\30.97377\\-178.8\\133\\30.45337\\-178.1771\\133\\32.11003\\-176.224\\133\\34.03005\\-174.2709\\133\\36.13807\\-172.3178\\133\\37.89441\\-170.3646\\133\\40.7394\\-167.4795\\133\\42.69252\\-166.0145\\133\\44.64565\\-164.9712\\133\\46.59877\\-163.5038\\133\\48.5519\\-162.4292\\133\\50.50502\\-161.5852\\133\\52.45815\\-161.6467\\133\\56.3644\\-162.8669\\133\\58.31752\\-163.6714\\133\\62.22377\\-165.627\\133\\63.0903\\-166.4584\\133\\64.84795\\-168.4115\\133\\65.50566\\-170.3646\\133\\65.65041\\-172.3178\\133\\67.07884\\-174.2709\\133\\68.08315\\-175.3756\\133\\70.03628\\-176.8601\\133\\71.9894\\-178.8963\\133\\72.79742\\-180.1303\\133\\71.9894\\-181.7381\\133\\70.03628\\-180.8826\\133\\68.08315\\-180.6848\\133\\66.55501\\-182.0834\\133\\66.30972\\-184.0365\\133\\66.26611\\-185.9896\\133\\66.13003\\-186.464\\133\\64.44157\\-189.8959\\133\\64.1769\\-190.622\\133\\63.32241\\-191.849\\133\\62.22377\\-193.7716\\133\\60.27065\\-195.7756\\133\\58.31752\\-196.4614\\133" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002234" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "49" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "639" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-189.8238\\135\\48.5519\\-189.317\\135\\46.59877\\-189.3088\\135\\44.64565\\-188.9407\\135\\42.69252\\-188.3206\\135\\40.7394\\-187.1004\\135\\39.84671\\-185.9896\\135\\39.0681\\-184.0365\\135\\38.19257\\-180.1303\\135\\37.63829\\-178.1771\\135\\36.83315\\-177.2919\\135\\34.88002\\-176.528\\135\\32.9269\\-176.9784\\135\\32.12958\\-176.224\\135\\33.86748\\-174.2709\\135\\34.88002\\-173.2741\\135\\36.83315\\-171.9387\\135\\38.78627\\-169.7906\\135\\39.76284\\-168.4115\\135\\40.7394\\-167.4838\\135\\44.64565\\-165.5353\\135\\46.59877\\-164.0989\\135\\48.5519\\-163.5237\\135\\50.50502\\-162.8091\\135\\52.45815\\-162.8683\\135\\54.41127\\-163.2411\\135\\56.3644\\-163.2726\\135\\58.31752\\-163.7457\\135\\60.27065\\-164.948\\135\\62.22377\\-165.9447\\135\\62.75591\\-166.4584\\135\\63.86885\\-168.4115\\135\\65.10124\\-170.3646\\135\\65.50185\\-172.3178\\135\\66.13003\\-173.1304\\135\\68.08315\\-174.7928\\135\\70.03628\\-175.6217\\135\\70.6729\\-176.224\\135\\72.8146\\-180.1303\\135\\71.9894\\-181.5408\\135\\70.03628\\-180.668\\135\\68.08315\\-179.1102\\135\\66.13003\\-179.704\\135\\65.75443\\-180.1303\\135\\63.66692\\-185.9896\\135\\60.27065\\-189.5621\\135\\58.31752\\-190.8562\\135\\56.3644\\-190.9034\\135\\54.41127\\-190.6992\\135" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002233" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "47" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "640" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.1396\\137\\44.64565\\-187.6828\\137\\42.69252\\-186.8719\\137\\41.54235\\-185.9896\\137\\40.7394\\-185.1926\\137\\39.81995\\-184.0365\\137\\38.99798\\-182.0834\\137\\38.71969\\-180.1303\\137\\38.20485\\-178.1771\\137\\36.83315\\-176.8211\\137\\34.88002\\-176.517\\137\\32.9269\\-176.5937\\137\\32.54633\\-176.224\\137\\33.87246\\-174.2709\\137\\34.88002\\-173.2791\\137\\36.83315\\-172.3985\\137\\38.78627\\-170.284\\137\\39.76284\\-168.4115\\137\\40.7394\\-167.4838\\137\\42.69252\\-166.1119\\137\\46.59877\\-164.6273\\137\\48.5519\\-164.0989\\137\\50.50502\\-163.9279\\137\\52.45815\\-163.9356\\137\\58.31752\\-164.8118\\137\\60.27065\\-165.6638\\137\\62.22377\\-167.4494\\137\\62.98779\\-168.4115\\137\\63.98721\\-170.3646\\137\\65.09692\\-172.3178\\137\\66.13003\\-173.4931\\137\\68.08315\\-174.7294\\137\\70.03628\\-175.7198\\137\\70.53724\\-176.224\\137\\71.52523\\-178.1771\\137\\72.67036\\-180.1303\\137\\71.9894\\-181.429\\137\\70.03628\\-181.1515\\137\\68.08315\\-179.1811\\137\\66.13003\\-178.7428\\137\\64.39308\\-180.1303\\137\\63.79279\\-182.0834\\137\\62.91016\\-184.0365\\137\\62.22377\\-184.9677\\137\\60.27065\\-186.9128\\137\\58.31752\\-188.1095\\137\\56.3644\\-188.1413\\137" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002232" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "641" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "44.64565\\-186.4317\\139\\42.69252\\-185.417\\139\\40.7394\\-183.5299\\139\\39.57048\\-182.0834\\139\\39.05681\\-180.1303\\139\\38.71969\\-178.1771\\139\\36.83315\\-176.528\\139\\34.88002\\-176.5058\\139\\34.31256\\-176.224\\139\\33.87246\\-174.2709\\139\\34.88002\\-173.2791\\139\\36.83315\\-172.3985\\139\\38.78627\\-170.284\\139\\39.75819\\-168.4115\\139\\41.70021\\-166.4584\\139\\42.69252\\-165.333\\139\\44.64565\\-164.3425\\139\\46.59877\\-163.9886\\139\\50.50502\\-163.9886\\139\\52.45815\\-164.2462\\139\\54.41127\\-165.2894\\139\\58.31752\\-166.1654\\139\\60.27065\\-167.4042\\139\\62.22377\\-169.3568\\139\\62.96481\\-170.3646\\139\\64.1769\\-172.5619\\139\\66.42199\\-174.2709\\139\\68.08315\\-175.1372\\139\\69.36257\\-176.224\\139\\70.974\\-178.1771\\139\\71.83749\\-180.1303\\139\\70.03628\\-181.6693\\139\\68.08315\\-180.3347\\139\\66.13003\\-178.7153\\139\\64.1769\\-179.031\\139\\63.11111\\-180.1303\\139\\62.71206\\-182.0834\\139\\61.38417\\-184.0365\\139\\60.27065\\-185.15\\139\\58.31752\\-186.284\\139\\56.3644\\-186.6153\\139\\46.59877\\-186.6073\\139" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002231" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "642" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "42.69252\\-184.5969\\141\\40.08662\\-182.0834\\141\\39.52116\\-180.1303\\141\\38.71969\\-178.1771\\141\\36.83315\\-176.528\\141\\34.88002\\-176.5058\\141\\34.49121\\-176.224\\141\\33.86748\\-174.2709\\141\\34.88002\\-173.2741\\141\\36.83315\\-172.3843\\141\\38.67777\\-170.3646\\141\\40.58971\\-166.4584\\141\\41.93989\\-164.5053\\141\\42.69252\\-163.7847\\141\\44.64565\\-162.9601\\141\\46.59877\\-162.7136\\141\\48.5519\\-162.7136\\141\\50.50502\\-163.0499\\141\\52.45815\\-163.6675\\141\\56.3644\\-165.7396\\141\\60.03712\\-168.4115\\141\\62.22377\\-170.9811\\141\\63.24219\\-172.3178\\141\\64.1769\\-173.3509\\141\\66.13003\\-174.7328\\141\\68.08315\\-175.5382\\141\\68.80121\\-176.224\\141\\70.07413\\-178.1771\\141\\70.95248\\-180.1303\\141\\70.03628\\-181.4562\\141\\68.08315\\-181.0509\\141\\66.13003\\-179.0541\\141\\64.1769\\-178.6854\\141\\62.31923\\-180.1303\\141\\61.49377\\-182.0834\\141\\60.27065\\-183.8737\\141\\58.31752\\-185.0899\\141\\56.3644\\-185.7779\\141\\54.41127\\-185.841\\141\\48.5519\\-185.828\\141\\46.59877\\-185.5457\\141\\44.64565\\-185.1626\\141" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002230" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "643" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-186.3691\\143\\46.59877\\-185.3577\\143\\44.64565\\-184.931\\143\\42.69252\\-184.0741\\143\\40.49191\\-182.0834\\143\\39.69213\\-180.1303\\143\\38.78627\\-178.2593\\143\\36.83315\\-176.528\\143\\34.88002\\-176.528\\143\\34.45504\\-176.224\\143\\33.86748\\-174.2709\\143\\34.88002\\-173.2741\\143\\36.83315\\-172.0039\\143\\38.1081\\-170.3646\\143\\38.76357\\-168.4115\\143\\40.63008\\-164.5053\\143\\42.85215\\-162.5521\\143\\44.64565\\-161.6378\\143\\46.59877\\-161.3931\\143\\48.5519\\-161.3872\\143\\50.50502\\-161.7213\\143\\52.45815\\-162.8302\\143\\54.41127\\-163.6477\\143\\56.3644\\-165.3537\\143\\58.13763\\-166.4584\\143\\60.27065\\-168.05\\143\\60.6321\\-168.4115\\143\\61.55723\\-170.3646\\143\\63.11113\\-172.3178\\143\\64.1769\\-173.4098\\143\\66.13003\\-175.1305\\143\\68.08315\\-176.3916\\143\\69.31644\\-178.1771\\143\\69.80518\\-180.1303\\143\\68.08315\\-181.2307\\143\\66.13003\\-179.363\\143\\64.1769\\-178.5132\\143\\62.22377\\-179.6247\\143\\61.78909\\-180.1303\\143\\61.22652\\-182.0834\\143\\60.27065\\-183.1135\\143\\58.31752\\-184.9638\\143\\56.3644\\-185.8026\\143\\54.41127\\-186.3362\\143\\52.45815\\-186.5789\\143\\50.50502\\-186.5824\\143" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002229" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "644" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-186.3106\\145\\44.64565\\-185.284\\145\\42.69252\\-184.5277\\145\\40.14051\\-182.0834\\145\\39.56079\\-180.1303\\145\\38.71969\\-178.1771\\145\\36.83315\\-176.528\\145\\34.88002\\-176.6949\\145\\34.15432\\-176.224\\145\\33.86748\\-174.2709\\145\\35.9606\\-172.3178\\145\\37.42137\\-170.3646\\145\\37.94288\\-168.4115\\145\\39.15562\\-166.4584\\145\\39.86466\\-164.5053\\145\\42.69252\\-161.7406\\145\\44.64565\\-161.2413\\145\\46.59877\\-161.0244\\145\\48.5519\\-161.0244\\145\\50.50502\\-161.2826\\145\\52.45815\\-161.7061\\145\\53.99778\\-162.5521\\145\\56.3644\\-164.1461\\145\\58.31752\\-165.592\\145\\60.27065\\-167.3023\\145\\61.21121\\-168.4115\\145\\62.31923\\-170.3646\\145\\63.22315\\-172.3178\\145\\66.13003\\-175.3676\\145\\67.0953\\-176.224\\145\\68.48839\\-178.1771\\145\\68.97242\\-180.1303\\145\\68.08315\\-181.1314\\145\\66.13003\\-180.4464\\145\\64.1769\\-178.7468\\145\\62.22377\\-179.6247\\145\\61.78909\\-180.1303\\145\\61.1641\\-182.0834\\145\\58.31752\\-184.9591\\145\\56.3644\\-186.1512\\145\\54.41127\\-186.9257\\145\\52.45815\\-187.2544\\145\\50.50502\\-187.2754\\145\\48.5519\\-186.9969\\145" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002228" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "645" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-187.9953\\147\\44.64565\\-186.688\\147\\42.69252\\-184.9543\\147\\39.79391\\-182.0834\\147\\39.11394\\-180.1303\\147\\38.70551\\-178.1771\\147\\36.83315\\-176.528\\147\\34.88002\\-177.0165\\147\\33.36635\\-176.224\\147\\33.86748\\-174.2709\\147\\35.82098\\-172.3178\\147\\36.85586\\-170.3646\\147\\38.74871\\-166.4584\\147\\39.74516\\-164.5053\\147\\42.69252\\-161.5961\\147\\44.64565\\-161.0244\\147\\50.50502\\-161.0054\\147\\52.45815\\-161.4393\\147\\54.41127\\-161.9949\\147\\56.3644\\-163.6938\\147\\58.31752\\-165.0542\\147\\60.27065\\-166.0592\\147\\60.66987\\-166.4584\\147\\61.5433\\-168.4115\\147\\62.93821\\-170.3646\\147\\63.50359\\-172.3178\\147\\64.88953\\-174.2709\\147\\66.57627\\-176.224\\147\\67.44786\\-178.1771\\147\\67.96667\\-180.1303\\147\\66.13003\\-181.1784\\147\\64.1769\\-179.1908\\147\\62.22377\\-179.6247\\147\\61.78909\\-180.1303\\147\\61.1641\\-182.0834\\147\\58.31752\\-184.9681\\147\\56.3644\\-186.6926\\147\\54.41127\\-187.4117\\147\\52.45815\\-187.719\\147\\50.50502\\-188.1681\\147" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002227" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "646" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.2284\\149\\44.64565\\-187.1605\\149\\42.69252\\-185.3473\\149\\39.69002\\-182.0834\\149\\38.73409\\-180.1303\\149\\38.69153\\-178.1771\\149\\36.83315\\-176.4945\\149\\34.88002\\-177.2596\\149\\32.9269\\-176.3397\\149\\32.9269\\-176.1325\\149\\33.86748\\-174.2709\\149\\35.82098\\-172.3178\\149\\36.84078\\-170.3646\\149\\39.632\\-164.5053\\149\\42.69252\\-161.6001\\149\\44.64565\\-161.061\\149\\46.59877\\-161.0054\\149\\50.50502\\-161.052\\149\\52.45815\\-161.5849\\149\\54.41127\\-162.4035\\149\\56.3644\\-163.6831\\149\\60.27065\\-165.6453\\149\\61.08369\\-166.4584\\149\\61.77988\\-168.4115\\149\\63.09235\\-170.3646\\149\\63.68862\\-172.3178\\149\\64.12472\\-174.2709\\149\\65.39055\\-176.224\\149\\67.01259\\-178.1771\\149\\67.42345\\-180.1303\\149\\66.13003\\-181.7514\\149\\64.1769\\-180.1218\\149\\62.22377\\-179.6247\\149\\61.78909\\-180.1303\\149\\61.16859\\-182.0834\\149\\60.27065\\-183.1022\\149\\58.31752\\-185.0929\\149\\56.3644\\-186.8988\\149\\54.41127\\-187.707\\149\\52.45815\\-188.2054\\149\\50.50502\\-188.856\\149\\48.5519\\-188.9351\\149" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002226" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "46" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "647" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.8056\\151\\44.64565\\-187.4843\\151\\42.69252\\-186.6943\\151\\41.99966\\-185.9896\\151\\40.9511\\-184.0365\\151\\39.68608\\-182.0834\\151\\38.73409\\-180.1303\\151\\38.69153\\-178.1771\\151\\36.83315\\-176.0612\\151\\34.88002\\-177.7081\\151\\32.84552\\-178.1771\\151\\32.88934\\-176.224\\151\\33.88301\\-174.2709\\151\\35.82098\\-172.3178\\151\\36.89973\\-170.3646\\151\\38.78627\\-166.3211\\151\\39.42131\\-164.5053\\151\\42.69252\\-161.7514\\151\\44.64565\\-161.3043\\151\\46.59877\\-161.0959\\151\\48.5519\\-161.0959\\151\\50.50502\\-161.298\\151\\52.45815\\-161.8172\\151\\54.41127\\-162.8669\\151\\56.3644\\-163.6831\\151\\60.27065\\-165.6453\\151\\61.08369\\-166.4584\\151\\61.77988\\-168.4115\\151\\63.09235\\-170.3646\\151\\63.68862\\-172.3178\\151\\63.69728\\-174.2709\\151\\65.08166\\-176.224\\151\\66.05679\\-178.1771\\151\\67.16763\\-180.1303\\151\\66.18947\\-182.0834\\151\\64.1769\\-180.5694\\151\\62.22377\\-179.635\\151\\61.7984\\-180.1303\\151\\61.26863\\-182.0834\\151\\60.27065\\-183.861\\151\\57.7625\\-185.9896\\151\\56.3644\\-186.9285\\151\\54.41127\\-188.0375\\151\\52.45815\\-188.8622\\151\\50.50502\\-189.3958\\151\\48.5519\\-189.4465\\151" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002225" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "53" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "648" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.9873\\153\\44.64565\\-187.6837\\153\\42.69252\\-187.0443\\153\\41.66076\\-185.9896\\153\\40.50368\\-184.0365\\153\\39.6997\\-182.0834\\153\\38.7939\\-180.1303\\153\\38.70551\\-178.1771\\153\\38.1438\\-176.224\\153\\36.83315\\-175.4207\\153\\35.97445\\-176.224\\153\\34.90274\\-178.1771\\153\\32.9269\\-179.8733\\153\\32.07883\\-178.1771\\153\\32.9269\\-176.6278\\153\\33.27977\\-176.224\\153\\34.02617\\-174.2709\\153\\35.83592\\-172.3178\\153\\37.28613\\-170.3646\\153\\37.8903\\-168.4115\\153\\39.77387\\-164.5053\\153\\40.7394\\-163.6465\\153\\42.69252\\-162.934\\153\\44.64565\\-161.6453\\153\\46.59877\\-161.4518\\153\\48.5519\\-161.4518\\153\\50.50502\\-161.6879\\153\\52.45815\\-162.4024\\153\\54.41127\\-162.9292\\153\\56.3644\\-163.7013\\153\\58.31752\\-164.7643\\153\\60.27065\\-165.6652\\153\\61.06382\\-166.4584\\153\\61.72692\\-168.4115\\153\\63.09235\\-170.3646\\153\\63.68862\\-172.3178\\153\\63.69728\\-174.2709\\153\\65.08166\\-176.224\\153\\65.61702\\-178.1771\\153\\67.0467\\-180.1303\\153\\66.13003\\-181.6485\\153\\64.1769\\-180.1219\\153\\62.22377\\-179.721\\153\\61.86695\\-180.1303\\153\\61.59941\\-182.0834\\153\\61.04533\\-184.0365\\153\\60.27065\\-184.8462\\153\\58.31752\\-186.1905\\153\\56.3644\\-187.0805\\153\\54.41127\\-188.4515\\153\\52.45815\\-189.1991\\153\\50.50502\\-189.6368\\153\\48.5519\\-189.6368\\153" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002224" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "50" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "649" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.9674\\155\\44.64565\\-187.6279\\155\\42.69252\\-187.0229\\155\\41.68185\\-185.9896\\155\\40.59079\\-184.0365\\155\\39.80663\\-182.0834\\155\\39.1633\\-180.1303\\155\\38.70551\\-178.1771\\155\\38.54984\\-176.224\\155\\36.83315\\-175.3472\\155\\35.90123\\-176.224\\155\\35.26696\\-178.1771\\155\\32.9269\\-180.342\\155\\32.65169\\-180.1303\\155\\31.93554\\-178.1771\\155\\33.8099\\-176.224\\155\\34.59042\\-174.2709\\155\\36.00683\\-172.3178\\155\\37.78988\\-170.3646\\155\\38.43057\\-168.4115\\155\\39.30902\\-166.4584\\155\\40.7394\\-164.8373\\155\\42.69252\\-163.6661\\155\\44.64565\\-162.934\\155\\46.59877\\-162.3499\\155\\48.5519\\-162.3374\\155\\50.50502\\-162.6043\\155\\54.41127\\-163.2894\\155\\56.3644\\-163.7849\\155\\58.31752\\-165.0923\\155\\60.27065\\-166.0054\\155\\60.72363\\-166.4584\\155\\61.47812\\-168.4115\\155\\63.0695\\-170.3646\\155\\63.64677\\-172.3178\\155\\63.69728\\-174.2709\\155\\65.08166\\-176.224\\155\\65.63579\\-178.1771\\155\\66.98998\\-180.1303\\155\\66.13003\\-181.118\\155\\64.1769\\-179.5366\\155\\62.56933\\-180.1303\\155\\62.22377\\-180.6185\\155\\61.18903\\-184.0365\\155\\60.27065\\-184.9915\\155\\58.31752\\-186.7678\\155\\54.41127\\-188.0389\\155\\52.45815\\-188.9704\\155\\50.50502\\-189.5811\\155\\48.5519\\-189.5919\\155" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002223" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "650" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.7819\\157\\44.64565\\-187.4126\\157\\42.69252\\-186.7559\\157\\41.93791\\-185.9896\\157\\40.26288\\-182.0834\\157\\39.61332\\-180.1303\\157\\38.78627\\-178.1587\\157\\36.83315\\-176.4682\\157\\35.65822\\-178.1771\\157\\34.88002\\-178.9719\\157\\32.9269\\-180.342\\157\\32.65169\\-180.1303\\157\\32.02505\\-178.1771\\157\\34.05252\\-176.224\\157\\34.88002\\-174.8448\\157\\36.97266\\-172.3178\\157\\38.40195\\-170.3646\\157\\39.98687\\-166.4584\\157\\40.7394\\-165.7315\\157\\42.69252\\-164.8947\\157\\44.64565\\-163.6221\\157\\46.59877\\-163.4363\\157\\52.45815\\-163.4403\\157\\54.41127\\-163.6826\\157\\56.3644\\-164.3437\\157\\58.31752\\-165.5295\\157\\60.27065\\-167.3427\\157\\62.92424\\-170.3646\\157\\63.43852\\-172.3178\\157\\63.69728\\-174.2709\\157\\65.08166\\-176.224\\157\\65.69267\\-178.1771\\157\\66.98328\\-180.1303\\157\\66.13003\\-181.0011\\157\\64.1769\\-180.0073\\157\\62.22377\\-181.5219\\157\\61.80783\\-182.0834\\157\\61.18903\\-184.0365\\157\\58.31752\\-186.9195\\157\\56.3644\\-187.6498\\157\\54.41127\\-187.6953\\157\\52.45815\\-188.6593\\157\\50.50502\\-189.3003\\157\\48.5519\\-189.3154\\157" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002222" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "651" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.0529\\159\\44.64565\\-187.1091\\159\\42.69252\\-185.3403\\159\\41.58095\\-184.0365\\159\\40.53996\\-182.0834\\159\\39.8247\\-180.1303\\159\\39.21165\\-178.1771\\159\\38.78627\\-177.6558\\159\\36.83315\\-177.0871\\159\\34.88002\\-178.9657\\159\\32.9269\\-180.342\\159\\32.65169\\-180.1303\\159\\32.78871\\-178.1771\\159\\34.5699\\-176.224\\159\\35.71483\\-174.2709\\159\\37.68164\\-172.3178\\159\\38.80898\\-170.3646\\159\\39.69999\\-168.4115\\159\\40.7394\\-167.2642\\159\\42.69252\\-165.5719\\159\\44.64565\\-164.789\\159\\46.59877\\-164.1692\\159\\50.50502\\-164.0433\\159\\52.45815\\-164.1085\\159\\54.41127\\-164.3183\\159\\56.3644\\-164.6923\\159\\58.31752\\-165.6577\\159\\61.07677\\-168.4115\\159\\63.17709\\-172.3178\\159\\63.69728\\-174.2709\\159\\65.08166\\-176.224\\159\\66.16759\\-178.1771\\159\\67.14043\\-180.1303\\159\\66.13003\\-181.093\\159\\64.1769\\-180.3777\\159\\62.22377\\-181.6187\\159\\61.80783\\-182.0834\\159\\61.18903\\-184.0365\\159\\58.31752\\-186.9195\\159\\56.3644\\-187.6498\\159\\54.41127\\-187.6953\\159\\52.45815\\-187.9958\\159\\50.50502\\-188.7671\\159\\48.5519\\-188.8438\\159" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002221" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "652" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.0667\\161\\46.59877\\-187.6837\\161\\44.64565\\-187.0304\\161\\41.67872\\-184.0365\\161\\40.53996\\-182.0834\\161\\40.20314\\-180.1303\\161\\39.58572\\-178.1771\\161\\38.78627\\-177.3233\\161\\36.83315\\-177.1494\\161\\34.88002\\-178.9271\\161\\32.9269\\-180.342\\161\\32.65169\\-180.1303\\161\\33.37178\\-178.1771\\161\\34.92789\\-176.224\\161\\35.85659\\-174.2709\\161\\37.77519\\-172.3178\\161\\39.28312\\-170.3646\\161\\40.14669\\-168.4115\\161\\40.7394\\-167.8354\\161\\44.64565\\-165.4404\\161\\46.98571\\-164.5053\\161\\48.5519\\-164.017\\161\\50.50502\\-163.8035\\161\\52.45815\\-164.1183\\161\\54.41127\\-164.6273\\161\\56.3644\\-164.6923\\161\\58.31752\\-165.6577\\161\\61.07677\\-168.4115\\161\\61.7984\\-170.3646\\161\\63.09655\\-172.3178\\161\\63.69728\\-174.2709\\161\\65.08611\\-176.224\\161\\66.87432\\-178.1771\\161\\67.41467\\-180.1303\\161\\66.13003\\-181.1203\\161\\64.1769\\-180.3777\\161\\62.22377\\-181.6187\\161\\61.80783\\-182.0834\\161\\61.20208\\-184.0365\\161\\58.31752\\-186.9432\\161\\56.3644\\-187.6498\\161\\52.45815\\-187.862\\161\\50.50502\\-188.0925\\161" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002220" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "43" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "653" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-188.3957\\163\\48.5519\\-187.707\\163\\46.59877\\-187.6837\\163\\44.64565\\-187.0304\\163\\41.67872\\-184.0365\\163\\40.53996\\-182.0834\\163\\39.98197\\-180.1303\\163\\39.53562\\-178.1771\\163\\38.78627\\-177.3633\\163\\36.83315\\-177.1494\\163\\34.88002\\-178.9271\\163\\32.9269\\-180.342\\163\\32.65169\\-180.1303\\163\\33.37178\\-178.1771\\163\\34.88002\\-176.8844\\163\\35.39362\\-176.224\\163\\36.0736\\-174.2709\\163\\39.64198\\-170.3646\\163\\41.33076\\-168.4115\\163\\44.64565\\-165.5443\\163\\46.84004\\-164.5053\\163\\48.5519\\-163.7849\\163\\50.50502\\-163.6029\\163\\52.45815\\-163.8767\\163\\54.41127\\-164.6273\\163\\56.3644\\-164.6923\\163\\58.31752\\-165.6577\\163\\61.07677\\-168.4115\\163\\61.7984\\-170.3646\\163\\63.09655\\-172.3178\\163\\63.69728\\-174.2709\\163\\65.08611\\-176.224\\163\\67.01913\\-178.1771\\163\\67.53146\\-180.1303\\163\\66.13003\\-181.1203\\163\\64.1769\\-180.4558\\163\\62.22377\\-181.7225\\163\\61.89825\\-182.0834\\163\\61.2851\\-184.0365\\163\\60.27065\\-185.2818\\163\\58.31752\\-187.1117\\163\\54.41127\\-188.2357\\163\\52.45815\\-188.7231\\163" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002219" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "44" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "654" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-188.8941\\165\\48.5519\\-187.8073\\165\\46.59877\\-187.6837\\165\\44.64565\\-187.0304\\165\\41.67872\\-184.0365\\165\\40.53996\\-182.0834\\165\\39.03376\\-178.1771\\165\\38.78627\\-177.8949\\165\\36.83315\\-177.0337\\165\\34.88002\\-178.8787\\165\\32.9269\\-180.342\\165\\32.65169\\-180.1303\\165\\33.4093\\-178.1771\\165\\34.88002\\-177.3467\\165\\35.86828\\-176.224\\165\\37.13711\\-174.2709\\165\\37.92709\\-172.3178\\165\\41.45097\\-168.4115\\165\\42.69252\\-167.1573\\165\\44.64565\\-165.5443\\165\\46.59877\\-164.6539\\165\\48.5519\\-164.2695\\165\\50.50502\\-164.0989\\165\\52.45815\\-164.3183\\165\\54.41127\\-164.6407\\165\\56.3644\\-164.7982\\165\\58.31752\\-165.6818\\165\\61.07677\\-168.4115\\165\\61.88768\\-170.3646\\165\\63.13058\\-172.3178\\165\\63.69728\\-174.2709\\165\\65.08611\\-176.224\\165\\67.01913\\-178.1771\\165\\67.53146\\-180.1303\\165\\66.13003\\-181.1483\\165\\64.1769\\-180.7588\\165\\62.6008\\-182.0834\\165\\61.64326\\-184.0365\\165\\60.91993\\-185.9896\\165\\60.27065\\-186.657\\165\\58.31752\\-187.478\\165\\56.3644\\-187.7812\\165\\54.41127\\-188.76\\165\\52.45815\\-189.2979\\165" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002218" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "34" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "655" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.479\\167\\46.59877\\-187.6837\\167\\44.64565\\-187.0487\\167\\41.6661\\-184.0365\\167\\40.53996\\-182.0834\\167\\39.70565\\-180.1303\\167\\38.78627\\-178.2228\\167\\36.47121\\-176.224\\167\\37.64858\\-174.2709\\167\\38.41693\\-172.3178\\167\\39.74862\\-170.3646\\167\\42.69252\\-167.3939\\167\\44.64565\\-165.583\\167\\46.59877\\-164.8823\\167\\50.50502\\-164.5718\\167\\54.41127\\-164.6539\\167\\58.31752\\-165.8441\\167\\61.07677\\-168.4115\\167\\62.63271\\-170.3646\\167\\63.27104\\-172.3178\\167\\63.69728\\-174.2709\\167\\65.08611\\-176.224\\167\\67.01913\\-178.1771\\167\\67.54762\\-180.1303\\167\\66.13003\\-181.3717\\167\\64.1769\\-180.9938\\167\\63.10223\\-182.0834\\167\\61.81738\\-184.0365\\167\\61.17777\\-185.9896\\167\\60.27065\\-186.9259\\167\\56.3644\\-188.3198\\167\\54.41127\\-189.0805\\167\\52.45815\\-189.6029\\167\\50.50502\\-189.166\\167" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002217" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "656" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.8896\\169\\46.59877\\-187.6837\\169\\44.64565\\-187.1897\\169\\42.69252\\-185.5616\\169\\41.5271\\-184.0365\\169\\40.5277\\-182.0834\\169\\39.70097\\-180.1303\\169\\38.78627\\-178.2585\\169\\37.57112\\-176.224\\169\\37.75653\\-174.2709\\169\\39.77679\\-170.3646\\169\\42.69252\\-167.4791\\169\\44.64565\\-165.7046\\169\\48.5519\\-165.2303\\169\\50.50502\\-164.741\\169\\52.45815\\-164.6407\\169\\54.41127\\-164.7982\\169\\58.31752\\-166.3363\\169\\60.27065\\-167.6054\\169\\63.01571\\-170.3646\\169\\63.54501\\-172.3178\\169\\63.69728\\-174.2709\\169\\65.08611\\-176.224\\169\\67.01913\\-178.1771\\169\\67.56357\\-180.1303\\169\\66.62582\\-182.0834\\169\\66.13003\\-182.3221\\169\\64.1769\\-181.0496\\169\\63.20448\\-182.0834\\169\\61.95324\\-184.0365\\169\\61.19153\\-185.9896\\169\\60.27065\\-186.944\\169\\58.31752\\-187.6498\\169\\56.3644\\-188.7574\\169\\54.41127\\-189.4402\\169\\52.45815\\-189.6368\\169\\50.50502\\-189.4895\\169" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002216" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "657" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.9788\\171\\46.59877\\-187.6953\\171\\44.64565\\-187.5364\\171\\42.69252\\-186.8429\\171\\41.85616\\-185.9896\\171\\40.83414\\-184.0365\\171\\40.5277\\-182.0834\\171\\38.86704\\-178.1771\\171\\37.71694\\-176.224\\171\\37.7662\\-174.2709\\171\\39.36358\\-172.3178\\171\\39.86779\\-170.3646\\171\\42.69252\\-167.5145\\171\\44.64565\\-166.3363\\171\\46.59877\\-166.0424\\171\\50.50502\\-165.158\\171\\52.45815\\-164.6407\\171\\54.41127\\-165.2583\\171\\56.3644\\-165.7594\\171\\58.17618\\-166.4584\\171\\60.27065\\-167.6054\\171\\63.08182\\-170.3646\\171\\63.68005\\-172.3178\\171\\63.78996\\-174.2709\\171\\65.1442\\-176.224\\171\\67.01913\\-178.1771\\171\\67.57281\\-180.1303\\171\\68.30695\\-182.0834\\171\\68.08315\\-182.3392\\171\\66.13003\\-182.5048\\171\\65.67429\\-182.0834\\171\\64.1769\\-181.1208\\171\\63.29416\\-182.0834\\171\\62.75391\\-184.0365\\171\\61.19559\\-185.9896\\171\\60.27065\\-186.944\\171\\58.31752\\-187.7433\\171\\56.3644\\-188.8905\\171\\54.41127\\-189.5919\\171\\50.50502\\-189.6368\\171" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002215" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "658" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.9841\\173\\46.59877\\-187.6953\\173\\44.64565\\-187.6722\\173\\42.69252\\-187.0275\\173\\41.68624\\-185.9896\\173\\40.65863\\-184.0365\\173\\40.5277\\-182.0834\\173\\39.8236\\-180.1303\\173\\39.40056\\-178.1771\\173\\37.7267\\-176.224\\173\\37.78027\\-174.2709\\173\\39.62925\\-172.3178\\173\\40.4225\\-170.3646\\173\\41.96815\\-168.4115\\173\\42.69252\\-167.7319\\173\\46.58276\\-166.4584\\173\\48.5519\\-165.7504\\173\\50.50502\\-165.2583\\173\\52.45815\\-164.6539\\173\\54.41127\\-165.5138\\173\\56.3644\\-166.2109\\173\\58.31752\\-166.5531\\173\\60.27065\\-167.5764\\173\\63.11198\\-170.3646\\173\\63.7705\\-172.3178\\173\\64.67099\\-174.2709\\173\\65.3223\\-176.224\\173\\67.07855\\-178.1771\\173\\67.57891\\-180.1303\\173\\68.86916\\-182.0834\\173\\68.08315\\-182.9989\\173\\66.13003\\-181.6697\\173\\64.1769\\-181.4184\\173\\63.58456\\-182.0834\\173\\63.14916\\-184.0365\\173\\60.27065\\-186.944\\173\\58.31752\\-188.4136\\173\\56.3644\\-189.1021\\173\\54.41127\\-189.6254\\173\\50.50502\\-189.6484\\173" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002214" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "39" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "659" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-189.0085\\175\\46.59877\\-187.7812\\175\\44.64565\\-187.6837\\175\\42.69252\\-186.9754\\175\\41.78814\\-185.9896\\175\\41.43483\\-184.0365\\175\\40.5277\\-182.0834\\175\\40.34018\\-180.1303\\175\\39.64363\\-178.1771\\175\\37.73119\\-176.224\\175\\37.79477\\-174.2709\\175\\39.73959\\-172.3178\\175\\40.7394\\-171.0971\\175\\42.69252\\-168.9447\\175\\44.64565\\-167.4166\\175\\48.5519\\-165.5981\\175\\50.50502\\-164.7982\\175\\52.45815\\-164.6539\\175\\54.41127\\-165.4008\\175\\56.3644\\-165.8735\\175\\58.29977\\-166.4584\\175\\60.27065\\-167.3449\\175\\62.22377\\-168.8449\\175\\64.61426\\-172.3178\\175\\65.25068\\-174.2709\\175\\66.39088\\-176.224\\175\\67.27543\\-178.1771\\175\\67.57224\\-180.1303\\175\\68.90835\\-182.0834\\175\\68.08315\\-182.9755\\175\\66.13003\\-181.1823\\175\\64.1769\\-181.5207\\175\\63.68005\\-182.0834\\175\\63.20858\\-184.0365\\175\\60.27065\\-186.944\\175\\58.31752\\-188.7973\\175\\56.3644\\-189.4799\\175\\54.41127\\-189.6368\\175\\50.50502\\-189.6484\\175" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002213" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "660" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.6605\\177\\45.05518\\-187.9428\\177\\42.69252\\-186.5505\\177\\42.20424\\-185.9896\\177\\41.65728\\-184.0365\\177\\40.53996\\-182.0834\\177\\40.5156\\-180.1303\\177\\39.70833\\-178.1771\\177\\37.73573\\-176.224\\177\\38.02807\\-174.2709\\177\\38.78627\\-173.6075\\177\\41.69271\\-170.3646\\177\\44.64565\\-167.4954\\177\\48.5519\\-165.5295\\177\\50.50502\\-164.6407\\177\\52.45815\\-164.6407\\177\\54.41127\\-164.8329\\177\\56.3644\\-165.4645\\177\\58.31752\\-165.8586\\177\\59.82919\\-166.4584\\177\\62.22377\\-167.6556\\177\\63.01386\\-168.4115\\177\\63.62278\\-170.3646\\177\\65.01605\\-172.3178\\177\\65.55272\\-174.2709\\177\\66.94047\\-176.224\\177\\67.50584\\-178.1771\\177\\67.5499\\-180.1303\\177\\68.77602\\-182.0834\\177\\68.08315\\-182.8172\\177\\67.36208\\-182.0834\\177\\66.13003\\-181.1157\\177\\64.1769\\-181.53\\177\\63.68862\\-182.0834\\177\\63.21265\\-184.0365\\177\\58.31752\\-188.8622\\177\\56.3644\\-189.5919\\177\\54.41127\\-189.6484\\177\\50.50502\\-189.6484\\177\\48.5519\\-189.2229\\177" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002212" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "661" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.9624\\179\\42.69252\\-186.4387\\179\\42.30558\\-185.9896\\179\\41.67872\\-184.0365\\179\\40.53996\\-182.0834\\179\\40.5277\\-180.1303\\179\\39.82202\\-178.1771\\179\\38.78627\\-176.9868\\179\\37.88966\\-176.224\\179\\38.78627\\-174.4202\\179\\40.7394\\-171.9647\\179\\41.73465\\-170.3646\\179\\44.64565\\-167.4954\\179\\48.5519\\-165.5249\\179\\50.50502\\-164.6273\\179\\54.41127\\-164.6407\\179\\56.3644\\-164.7871\\179\\58.31752\\-165.4433\\179\\60.27065\\-165.8586\\179\\63.07357\\-168.4115\\179\\64.74974\\-170.3646\\179\\65.31025\\-172.3178\\179\\65.63318\\-174.2709\\179\\66.62119\\-176.224\\179\\67.29369\\-178.1771\\179\\67.16239\\-180.1303\\179\\66.13003\\-180.9552\\179\\64.1769\\-181.53\\179\\63.68862\\-182.0834\\179\\63.21265\\-184.0365\\179\\58.31752\\-188.8622\\179\\56.3644\\-189.5919\\179\\54.41127\\-189.6484\\179\\50.50502\\-189.6484\\179\\48.5519\\-189.5811\\179" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002211" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "33" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "662" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.9873\\181\\44.64565\\-187.1994\\181\\42.69252\\-185.2388\\181\\41.67872\\-184.0365\\181\\40.53996\\-182.0834\\181\\40.5277\\-180.1303\\181\\40.40331\\-178.1771\\181\\37.69566\\-176.224\\181\\38.99721\\-174.2709\\181\\40.7394\\-172.0696\\181\\41.73465\\-170.3646\\181\\44.64565\\-167.4954\\181\\46.59877\\-165.7566\\181\\48.5519\\-165.2664\\181\\50.50502\\-164.6273\\181\\56.3644\\-164.6407\\181\\58.31752\\-164.8201\\181\\60.27065\\-165.6528\\181\\62.22377\\-167.2661\\181\\65.02029\\-170.3646\\181\\65.5759\\-172.3178\\181\\65.72363\\-176.224\\181\\67.06921\\-178.1771\\181\\67.23077\\-180.1303\\181\\68.13698\\-182.0834\\181\\66.13003\\-180.9766\\181\\64.1769\\-181.53\\181\\63.68862\\-182.0834\\181\\63.21265\\-184.0365\\181\\58.31752\\-188.8622\\181\\56.3644\\-189.5919\\181\\54.41127\\-189.6484\\181\\48.5519\\-189.6368\\181" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002210" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "40" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "663" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.6025\\183\\44.64565\\-187.0445\\183\\41.67872\\-184.0365\\183\\40.53996\\-182.0834\\183\\40.5277\\-180.1303\\183\\39.54173\\-178.1771\\183\\36.95704\\-176.224\\183\\38.99721\\-174.2709\\183\\40.7394\\-172.0676\\183\\41.73005\\-170.3646\\183\\46.59877\\-165.5795\\183\\48.5519\\-164.741\\183\\50.50502\\-164.6273\\183\\52.45815\\-163.7728\\183\\54.41127\\-163.5816\\183\\56.3644\\-163.8559\\183\\58.31752\\-164.6539\\183\\60.27065\\-165.3365\\183\\62.22377\\-165.8887\\183\\62.81649\\-166.4584\\183\\63.61497\\-168.4115\\183\\65.0455\\-170.3646\\183\\65.62471\\-172.3178\\183\\65.64175\\-176.224\\183\\67.02962\\-178.1771\\183\\67.51877\\-180.1303\\183\\68.88767\\-182.0834\\183\\69.2713\\-184.0365\\183\\68.08315\\-185.1059\\183\\67.12839\\-184.0365\\183\\67.27444\\-182.0834\\183\\66.13003\\-181.0936\\183\\64.1769\\-181.53\\183\\63.68862\\-182.0834\\183\\63.21265\\-184.0365\\183\\58.31752\\-188.8622\\183\\56.3644\\-189.5919\\183\\54.41127\\-189.6484\\183\\50.50502\\-189.6484\\183\\48.5519\\-189.2264\\183" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002209" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "42" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "664" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-189.014\\185\\46.59877\\-187.8343\\185\\44.64565\\-187.0304\\185\\41.67872\\-184.0365\\185\\40.53996\\-182.0834\\185\\40.5277\\-180.1303\\185\\38.51837\\-178.1771\\185\\36.84078\\-176.224\\185\\38.99721\\-174.2709\\185\\40.5277\\-172.3178\\185\\42.3208\\-168.4115\\185\\42.69252\\-168.0445\\185\\44.64565\\-167.0754\\185\\46.59877\\-165.5192\\185\\48.5519\\-164.6407\\185\\50.50502\\-164.5574\\185\\52.45815\\-163.5745\\185\\54.41127\\-163.0741\\185\\58.31752\\-163.8491\\185\\60.27065\\-164.8201\\185\\62.22377\\-165.6423\\185\\63.07478\\-166.4584\\185\\64.74518\\-168.4115\\185\\65.34056\\-170.3646\\185\\65.63318\\-172.3178\\185\\65.64175\\-176.224\\185\\67.02962\\-178.1771\\185\\67.57891\\-180.1303\\185\\68.88353\\-182.0834\\185\\69.51334\\-184.0365\\185\\68.08315\\-185.6429\\185\\67.02248\\-184.0365\\185\\67.1804\\-182.0834\\185\\66.13003\\-181.2064\\185\\64.1769\\-181.6858\\185\\63.82008\\-182.0834\\185\\63.24261\\-184.0365\\185\\61.20381\\-185.9896\\185\\58.31752\\-188.8622\\185\\56.3644\\-189.5919\\185\\54.41127\\-189.6484\\185\\50.50502\\-189.6484\\185" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002208" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "35" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "665" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-188.9841\\187\\46.59877\\-187.6837\\187\\44.64565\\-187.0304\\187\\41.67872\\-184.0365\\187\\40.53996\\-182.0834\\187\\40.5277\\-180.1303\\187\\38.29012\\-178.1771\\187\\36.92789\\-176.224\\187\\39.07701\\-174.2709\\187\\40.5277\\-172.3178\\187\\40.73177\\-170.3646\\187\\41.80348\\-168.4115\\187\\44.64565\\-165.8091\\187\\48.53754\\-164.5053\\187\\50.50502\\-163.7249\\187\\54.41127\\-162.8227\\187\\56.3644\\-162.996\\187\\58.31752\\-163.6855\\187\\62.22377\\-165.627\\187\\64.99483\\-168.4115\\187\\65.54516\\-170.3646\\187\\65.63318\\-172.3178\\187\\65.64175\\-176.224\\187\\67.02962\\-178.1771\\187\\67.6123\\-180.1303\\187\\67.87144\\-182.0834\\187\\69.21365\\-184.0365\\187\\68.08315\\-185.6757\\187\\66.13003\\-185.2906\\187\\64.1769\\-184.6748\\187\\62.22377\\-185.0801\\187\\58.31752\\-188.8622\\187\\56.3644\\-189.5919\\187\\54.41127\\-189.6484\\187\\50.50502\\-189.6484\\187" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002207" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "666" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-189.0295\\189\\46.59877\\-187.8343\\189\\44.64565\\-187.0304\\189\\41.67872\\-184.0365\\189\\40.53996\\-182.0834\\189\\40.40288\\-180.1303\\189\\37.54788\\-178.1771\\189\\37.53844\\-176.224\\189\\39.51595\\-174.2709\\189\\40.5277\\-172.3178\\189\\40.53996\\-170.3646\\189\\41.74321\\-168.4115\\189\\44.64565\\-165.5888\\189\\46.59877\\-164.7758\\189\\48.5519\\-163.7494\\189\\52.45815\\-162.9489\\189\\54.41127\\-162.8227\\189\\56.3644\\-162.9987\\189\\58.31752\\-163.6907\\189\\62.22377\\-165.627\\189\\65.02587\\-168.4115\\189\\65.61634\\-170.3646\\189\\65.64175\\-176.224\\189\\66.96918\\-178.1771\\189\\67.53693\\-180.1303\\189\\67.60949\\-182.0834\\189\\68.40867\\-184.0365\\189\\68.08315\\-184.4516\\189\\66.13003\\-185.5978\\189\\64.1769\\-185.1851\\189\\62.4352\\-185.9896\\189\\60.27065\\-187.2188\\189\\58.31752\\-188.8721\\189\\56.3644\\-189.5919\\189\\54.41127\\-189.6484\\189\\50.50502\\-189.6484\\189" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002206" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "667" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.6803\\191\\44.64565\\-187.0304\\191\\41.67872\\-184.0365\\191\\40.53996\\-182.0834\\191\\39.50197\\-180.1303\\191\\37.12808\\-178.1771\\191\\37.76254\\-176.224\\191\\39.67188\\-174.2709\\191\\40.5156\\-172.3178\\191\\40.53996\\-170.3646\\191\\41.74321\\-168.4115\\191\\44.64565\\-165.549\\191\\48.5519\\-163.6892\\191\\50.50502\\-163.0688\\191\\52.45815\\-162.8227\\191\\54.41127\\-162.8561\\191\\56.3644\\-163.4799\\191\\58.31752\\-163.9356\\191\\62.22377\\-165.6689\\191\\64.94894\\-168.4115\\191\\65.54193\\-170.3646\\191\\65.63318\\-172.3178\\191\\65.63318\\-176.224\\191\\67.26247\\-180.1303\\191\\67.56757\\-182.0834\\191\\67.59119\\-184.0365\\191\\66.13003\\-185.1283\\191\\64.1769\\-184.8189\\191\\63.19555\\-185.9896\\191\\62.22377\\-186.8949\\191\\60.27065\\-187.546\\191\\58.31752\\-188.8771\\191\\56.3644\\-189.5919\\191\\54.41127\\-189.6484\\191\\50.50502\\-189.6484\\191\\48.5519\\-189.311\\191" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002205" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "38" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "668" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "46.59877\\-188.9528\\193\\42.69252\\-185.2227\\193\\41.61658\\-184.0365\\193\\40.37076\\-182.0834\\193\\37.59769\\-180.1303\\193\\37.61729\\-178.1771\\193\\38.13699\\-176.224\\193\\39.64135\\-174.2709\\193\\40.35997\\-172.3178\\193\\40.53996\\-170.3646\\193\\41.74321\\-168.4115\\193\\44.64565\\-165.549\\193\\46.90486\\-164.5053\\193\\48.5519\\-163.9055\\193\\52.45815\\-162.9707\\193\\54.41127\\-163.0079\\193\\56.3644\\-163.6831\\193\\60.27065\\-165.3951\\193\\62.22377\\-166.1654\\193\\64.21446\\-168.4115\\193\\65.2738\\-170.3646\\193\\65.63318\\-172.3178\\193\\65.63318\\-176.224\\193\\65.74309\\-178.1771\\193\\67.01652\\-180.1303\\193\\67.2901\\-182.0834\\193\\66.47246\\-184.0365\\193\\66.13003\\-184.2544\\193\\64.1769\\-183.6473\\193\\63.83038\\-184.0365\\193\\63.20894\\-185.9896\\193\\62.22377\\-186.9662\\193\\60.27065\\-187.8343\\193\\58.31752\\-188.9428\\193\\56.3644\\-189.6029\\193\\54.41127\\-189.6602\\193\\50.50502\\-189.6484\\193\\48.5519\\-189.5391\\193" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002204" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "669" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "52.45815\\-190.0501\\195\\48.5519\\-189.6368\\195\\46.59877\\-189.0482\\195\\44.64565\\-187.4898\\195\\42.69252\\-186.5756\\195\\42.10992\\-185.9896\\195\\41.19238\\-184.0365\\195\\39.74195\\-182.0834\\195\\37.66954\\-180.1303\\195\\38.04292\\-178.1771\\195\\38.56248\\-176.224\\195\\39.36358\\-174.2709\\195\\39.85867\\-172.3178\\195\\40.53996\\-170.3646\\195\\41.74321\\-168.4115\\195\\44.64565\\-165.549\\195\\46.59877\\-164.6539\\195\\48.5519\\-164.4677\\195\\50.50502\\-163.8982\\195\\52.45815\\-163.4297\\195\\54.41127\\-163.4841\\195\\56.3644\\-163.967\\195\\57.89225\\-164.5053\\195\\60.27065\\-165.6105\\195\\62.22377\\-167.2618\\195\\65.08095\\-170.3646\\195\\65.62471\\-172.3178\\195\\65.63318\\-178.1771\\195\\66.32946\\-180.1303\\195\\65.51115\\-182.0834\\195\\63.89507\\-184.0365\\195\\63.19609\\-185.9896\\195\\62.22377\\-186.9662\\195\\60.27065\\-188.5815\\195\\56.3644\\-189.8011\\195\\54.41127\\-190.0489\\195" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002203" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "670" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-190.6548\\197\\48.5519\\-189.8583\\197\\46.59877\\-189.334\\197\\44.64565\\-188.6403\\197\\42.69252\\-187.0058\\197\\41.69875\\-185.9896\\197\\39.57973\\-182.0834\\197\\38.09084\\-180.1303\\197\\38.56248\\-178.1771\\197\\38.83846\\-174.2709\\197\\39.68302\\-172.3178\\197\\40.35754\\-170.3646\\197\\41.74321\\-168.4115\\197\\44.64565\\-165.549\\197\\46.59877\\-164.6539\\197\\48.5519\\-164.6273\\197\\50.50502\\-164.4677\\197\\52.45815\\-163.5333\\197\\54.41127\\-163.5923\\197\\56.3644\\-164.2815\\197\\58.31752\\-164.6923\\197\\60.27065\\-165.6401\\197\\63.10777\\-168.4115\\197\\64.95087\\-170.3646\\197\\65.54516\\-172.3178\\197\\65.63318\\-174.2709\\197\\65.63318\\-178.1771\\197\\65.69534\\-180.1303\\197\\65.3684\\-182.0834\\197\\64.84344\\-184.0365\\197\\63.23032\\-185.9896\\197\\62.22377\\-187.0877\\197\\60.27065\\-188.91\\197\\58.31752\\-189.5089\\197\\56.3644\\-190.5089\\197\\54.41127\\-191.0488\\197\\52.45815\\-191.065\\197" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002202" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "36" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "671" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "48.5519\\-190.4981\\199\\46.59877\\-189.4705\\199\\44.64565\\-188.861\\199\\41.66076\\-185.9896\\199\\40.50368\\-184.0365\\199\\39.68146\\-182.0834\\199\\38.62468\\-180.1303\\199\\38.69153\\-178.1771\\199\\38.69153\\-174.2709\\199\\39.33249\\-172.3178\\199\\39.85957\\-170.3646\\199\\41.74321\\-168.4115\\199\\44.64565\\-165.597\\199\\46.59877\\-164.8329\\199\\48.5519\\-164.6273\\199\\50.50502\\-164.6273\\199\\52.45815\\-163.6144\\199\\54.41127\\-163.4428\\199\\56.3644\\-163.8292\\199\\57.992\\-164.5053\\199\\60.27065\\-165.6453\\199\\63.00404\\-168.4115\\199\\64.21446\\-170.3646\\199\\65.20064\\-172.3178\\199\\65.48783\\-174.2709\\199\\65.63318\\-178.1771\\199\\65.48069\\-182.0834\\199\\65.15782\\-184.0365\\199\\63.39841\\-185.9896\\199\\62.22377\\-187.7558\\199\\60.27065\\-189.172\\199\\58.31752\\-189.6254\\199\\56.3644\\-190.6761\\199\\54.41127\\-191.2485\\199\\52.45815\\-191.3033\\199\\50.50502\\-191.1115\\199" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002201" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "37" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "672" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "50.50502\\-190.3872\\201\\48.70726\\-189.8959\\201\\46.59877\\-188.8312\\201\\44.64565\\-187.9505\\201\\42.69252\\-186.6921\\201\\42.00614\\-185.9896\\201\\41.1463\\-184.0365\\201\\40.7394\\-183.6093\\201\\40.03379\\-182.0834\\201\\39.332\\-180.1303\\201\\39.23771\\-176.224\\201\\39.13399\\-174.2709\\201\\39.1633\\-172.3178\\201\\39.9486\\-170.3646\\201\\42.69252\\-167.777\\201\\44.64565\\-166.2227\\201\\48.5519\\-165.1889\\201\\50.50502\\-165.1898\\201\\52.45815\\-164.3058\\201\\54.41127\\-163.9916\\201\\56.3644\\-164.4245\\201\\60.27065\\-166.009\\201\\60.71999\\-166.4584\\201\\62.22377\\-168.4833\\201\\63.01346\\-170.3646\\201\\64.1769\\-172.3358\\201\\64.77061\\-174.2709\\201\\65.24287\\-178.1771\\201\\65.01001\\-180.1303\\201\\65.3684\\-184.0365\\201\\64.1769\\-185.6328\\201\\62.22377\\-187.0156\\201\\60.27065\\-188.7301\\201\\58.31752\\-189.1453\\201\\56.3644\\-189.7105\\201\\54.41127\\-190.3962\\201\\52.45815\\-190.4597\\201" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "10" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "673" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "40.7394\\-174.3062\\203\\40.02677\\-172.3178\\203\\40.7394\\-171.1511\\203\\42.69252\\-169.7956\\203\\44.64565\\-169.9335\\203\\45.13897\\-170.3646\\203\\46.46356\\-172.3178\\203\\46.32986\\-174.2709\\203\\44.64565\\-175.534\\203\\42.69252\\-175.4795\\203" - } - }, - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002200" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "CLOSED_PLANAR" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "8" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "674" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "62.22377\\-185.221\\203\\61.20846\\-184.0365\\203\\61.70231\\-182.0834\\203\\62.22377\\-181.5906\\203\\64.1769\\-181.8031\\203\\64.4192\\-182.0834\\203\\65.25975\\-184.0365\\203\\64.1769\\-185.397\\203" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "7" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "255\\255\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002301" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "POINT" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "1" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "-0.4882813\\-206.6055\\1" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "8" - } - }, - { - "3006,002a" : { - "Name" : "ROIDisplayColor", - "Type" : "String", - "Value" : "255\\0\\0" - }, - "3006,0040" : { - "Name" : "ContourSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0016" : { - "Name" : "ContourImageSequence", - "Type" : "Sequence", - "Value" : [ - { - "0008,1150" : { - "Name" : "ReferencedSOPClassUID", - "Type" : "String", - "Value" : "1.2.840.10008.5.1.4.1.1.2" - }, - "0008,1155" : { - "Name" : "ReferencedSOPInstanceUID", - "Type" : "String", - "Value" : "1.3.12.2.1107.5.1.4.66930.30000018062412550879500002318" - } - } - ] - }, - "3006,0042" : { - "Name" : "ContourGeometricType", - "Type" : "String", - "Value" : "POINT" - }, - "3006,0046" : { - "Name" : "NumberOfContourPoints", - "Type" : "String", - "Value" : "1" - }, - "3006,0048" : { - "Name" : "ContourNumber", - "Type" : "String", - "Value" : "0" - }, - "3006,0050" : { - "Name" : "ContourData", - "Type" : "String", - "Value" : "0.6\\-180.9\\-33" - } - } - ] - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "9" - } - } - ] - }, - "3006,0080" : { - "Name" : "RTROIObservationsSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "1" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "External" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "EXTERNAL" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "2" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "CTV" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "CTV" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "3" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "PTV" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "PTV" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "4" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "PTV Eval" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "PTV" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "5" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "Bladder" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "ORGAN" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "6" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "Rectum" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "ORGAN" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "7" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "Air Override" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "NONE" - }, - "3006,00b0" : { - "Name" : "ROIPhysicalPropertiesSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "REL_MASS_DENSITY" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "1" - } - }, - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "REL_ELEC_DENSITY" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "1.000148" - } - }, - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "EFFECTIVE_Z" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "6.600049" - } - }, - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "EFF_Z_PER_A" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "0.5550822" - } - }, - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "MEAN_EXCI_ENERGY" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "75" - } - }, - { - "3006,00b2" : { - "Name" : "ROIPhysicalProperty", - "Type" : "String", - "Value" : "ELEM_FRACTION" - }, - "3006,00b4" : { - "Name" : "ROIPhysicalPropertyValue", - "Type" : "String", - "Value" : "0" - }, - "3006,00b6" : { - "Name" : "ROIElementalCompositionSequence", - "Type" : "Sequence", - "Value" : [ - { - "3006,00b7" : { - "Name" : "ROIElementalCompositionAtomicNumber", - "Type" : "String", - "Value" : "1" - }, - "3006,00b8" : { - "Name" : "ROIElementalCompositionAtomicMassFraction", - "Type" : "String", - "Value" : "0.111893997" - } - }, - { - "3006,00b7" : { - "Name" : "ROIElementalCompositionAtomicNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,00b8" : { - "Name" : "ROIElementalCompositionAtomicMassFraction", - "Type" : "String", - "Value" : "0.888105989" - } - } - ] - } - } - ] - }, - "300a,00e1" : { - "Name" : "MaterialID", - "Type" : "String", - "Value" : "Water" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "8" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "Localization Poi" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "MARKER" - } - }, - { - "3006,0082" : { - "Name" : "ObservationNumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0084" : { - "Name" : "ReferencedROINumber", - "Type" : "String", - "Value" : "9" - }, - "3006,0085" : { - "Name" : "ROIObservationLabel", - "Type" : "String", - "Value" : "Isocenter" - }, - "3006,00a4" : { - "Name" : "RTROIInterpretedType", - "Type" : "String", - "Value" : "ISOCENTER" - } - } - ] - }, - "300e,0002" : { - "Name" : "ApprovalStatus", - "Type" : "String", - "Value" : "APPROVED" - }, - "300e,0004" : { - "Name" : "ReviewDate", - "Type" : "String", - "Value" : "20181204" - }, - "300e,0005" : { - "Name" : "ReviewTime", - "Type" : "String", - "Value" : "115323" - }, - "300e,0008" : { - "Name" : "ReviewerName", - "Type" : "String", - "Value" : "DSNET_marc.blakey" - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/GenericToolboxTests.cpp --- a/UnitTestsSources/GenericToolboxTests.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4251 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../Framework/Toolbox/GenericToolbox.h" - -#include -#include -#include - -#include -#include -#include - -TEST(GenericToolbox, TestLegitDoubleString) -{ - using OrthancStone::GenericToolbox::LegitDoubleString; - - EXPECT_TRUE(LegitDoubleString("12.34")); - EXPECT_TRUE(LegitDoubleString("1234")); - EXPECT_TRUE(LegitDoubleString(".1234")); - EXPECT_TRUE(LegitDoubleString("1234.")); - EXPECT_TRUE(LegitDoubleString("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234")); - EXPECT_TRUE(LegitDoubleString("000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000000011234")); - EXPECT_TRUE(LegitDoubleString("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000112.34")); - EXPECT_TRUE(LegitDoubleString("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234.")); - EXPECT_TRUE(LegitDoubleString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001123456")); - EXPECT_TRUE(LegitDoubleString("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001123456000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000112345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011234565664565623456")); - EXPECT_TRUE(LegitDoubleString("1234.")); - EXPECT_TRUE(LegitDoubleString(".0123")); - EXPECT_TRUE(LegitDoubleString(".123")); - EXPECT_TRUE(LegitDoubleString(".5")); - EXPECT_TRUE(LegitDoubleString(".")); - EXPECT_TRUE(LegitDoubleString("")); - EXPECT_TRUE(LegitDoubleString("0.")); - EXPECT_TRUE(LegitDoubleString(".0")); - - EXPECT_TRUE(LegitDoubleString("1e-15")); - EXPECT_TRUE(LegitDoubleString("1E-15")); - EXPECT_TRUE(LegitDoubleString("0.31E-15")); - EXPECT_TRUE(LegitDoubleString(".0031E-15")); - EXPECT_TRUE(LegitDoubleString("1e-15")); - EXPECT_TRUE(LegitDoubleString("1E015")); - EXPECT_TRUE(LegitDoubleString("0.31E015")); - - - EXPECT_FALSE(LegitDoubleString(".5f")); - EXPECT_FALSE(LegitDoubleString("\n.0031E015")); - EXPECT_FALSE(LegitDoubleString(".05f")); - EXPECT_FALSE(LegitDoubleString(" 1 2 ")); - EXPECT_FALSE(LegitDoubleString(" 0.12\t")); - EXPECT_FALSE(LegitDoubleString(" 0.12")); - EXPECT_FALSE(LegitDoubleString("0.12\t")); - EXPECT_FALSE(LegitDoubleString("12\t")); - EXPECT_FALSE(LegitDoubleString(".01 23")); - EXPECT_FALSE(LegitDoubleString(". 123")); - EXPECT_FALSE(LegitDoubleString(".5 ")); - EXPECT_FALSE(LegitDoubleString(" .")); - EXPECT_FALSE(LegitDoubleString("\n0.")); -} - -TEST(GenericToolbox, TestLegitIntegerString) -{ - using OrthancStone::GenericToolbox::LegitIntegerString; - - EXPECT_TRUE(LegitIntegerString("1234")); - EXPECT_TRUE(LegitIntegerString("234")); - EXPECT_TRUE(LegitIntegerString("01234")); - EXPECT_TRUE(LegitIntegerString("12340")); - EXPECT_TRUE(LegitIntegerString("0000000000000011234")); - EXPECT_TRUE(LegitIntegerString("00000000000000011234")); - EXPECT_TRUE(LegitIntegerString("00000000000011234")); - EXPECT_TRUE(LegitIntegerString("112340000000000010")); - EXPECT_TRUE(LegitIntegerString("0000000000001123456")); - EXPECT_TRUE(LegitIntegerString("000000000000112345604565665623456")); - EXPECT_TRUE(LegitIntegerString("")); - EXPECT_TRUE(LegitIntegerString("0")); - EXPECT_TRUE(LegitIntegerString("00000")); - - EXPECT_FALSE(LegitIntegerString(".5f")); - EXPECT_FALSE(LegitIntegerString("1e-15")); - EXPECT_FALSE(LegitIntegerString("1E-15")); - EXPECT_FALSE(LegitIntegerString("0.31E-15")); - EXPECT_FALSE(LegitIntegerString(".0031E-15")); - EXPECT_FALSE(LegitIntegerString("1e-15")); - EXPECT_FALSE(LegitIntegerString("1E015")); - EXPECT_FALSE(LegitIntegerString("0.31E015")); - EXPECT_FALSE(LegitIntegerString("\n.0031E015")); - EXPECT_FALSE(LegitIntegerString(".05f")); - EXPECT_FALSE(LegitIntegerString(" 1 2 ")); - EXPECT_FALSE(LegitIntegerString(" 0.12\t")); - EXPECT_FALSE(LegitIntegerString(" 0.12")); - EXPECT_FALSE(LegitIntegerString("0.12\t")); - EXPECT_FALSE(LegitIntegerString("12\t")); - EXPECT_FALSE(LegitIntegerString(".01 23")); - EXPECT_FALSE(LegitIntegerString(". 123")); - EXPECT_FALSE(LegitIntegerString(".5 ")); - EXPECT_FALSE(LegitIntegerString(" .")); - EXPECT_FALSE(LegitIntegerString("\n0.")); -} - -TEST(GenericToolbox, TestStringToDouble) -{ - using OrthancStone::GenericToolbox::StringToDouble; - - const double TOLERANCE = 0.00000000000001; - double r = 0.0; - bool ok = StringToDouble(r, "0.0001"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.0001, r, TOLERANCE); - - { - bool ok = StringToDouble(r, "0.0001"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.0001, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.50217817069333900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.50217817069333900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.96770274105399000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.96770274105399000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.49521088758962000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.49521088758962000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.06201839227379000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.06201839227379000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.33360671999703000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.33360671999703000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.07639304839166000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.07639304839166000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.19287806240687400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.19287806240687400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.44207082838626000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.44207082838626000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.84619708036551800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.84619708036551800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.58091726580509000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.58091726580509000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.18073661859763000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.18073661859763000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.33045549786387000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.33045549786387000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.00272400249168000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.00272400249168000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.95337715877137000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.95337715877137000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "8.95930523708542000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(8.95930523708542000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.78847681371515000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.78847681371515000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.23601540702684000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.23601540702684000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.40676557671367000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.40676557671367000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.36110595246212700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.36110595246212700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.10430292945232000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.10430292945232000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.34892053003478100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.34892053003478100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.86871791690589000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.86871791690589000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.23477571361979100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.23477571361979100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.17723077954105000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.17723077954105000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.55533339430731000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.55533339430731000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.39193581722996000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.39193581722996000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.98290538242799000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.98290538242799000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.39701448187652000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.39701448187652000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.97546141973594000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.97546141973594000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.33870401451186000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.33870401451186000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.15061799435527000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.15061799435527000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.78705704115137000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.78705704115137000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.56210637202493000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.56210637202493000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-8.86139731673717000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-8.86139731673717000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.63169336137189000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.63169336137189000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.93978481744645000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.93978481744645000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.49952444717512000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.49952444717512000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.32659301981935000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.32659301981935000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.59514994228045000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.59514994228045000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.66422938111626000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.66422938111626000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.70431239624531000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.70431239624531000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.22698147029468000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.22698147029468000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.90761005965631200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.90761005965631200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.43368952065867000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.43368952065867000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.79510450171595000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.79510450171595000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.94081596072268000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.94081596072268000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.42019476309409300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.42019476309409300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.70663631642677000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.70663631642677000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.06601188243267550000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.06601188243267550000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.79928310771909400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.79928310771909400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.65577800860582000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.65577800860582000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.62187216187698000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.62187216187698000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.95596656702613300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.95596656702613300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.14349841191783000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.14349841191783000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.23732575725115000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.23732575725115000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.02522229405373000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.02522229405373000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.43364697172459700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.43364697172459700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.39612114240613000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.39612114240613000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.87981321512563200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.87981321512563200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.47459557296809400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.47459557296809400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.10534326849558000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.10534326849558000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.48420825457170000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.48420825457170000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.98994851457562000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.98994851457562000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.18550683277018200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.18550683277018200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.79951199056989300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.79951199056989300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.92573951347502000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.92573951347502000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.46138476058529000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.46138476058529000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.34518431607109000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.34518431607109000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.33372656820168000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.33372656820168000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.16931283159188600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.16931283159188600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.97223922802124000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.97223922802124000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.48394627491386000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.48394627491386000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.88861737945960600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.88861737945960600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.85676190081840000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.85676190081840000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.54459170417494000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.54459170417494000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.16447870264995300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.16447870264995300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.35795535411029000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.35795535411029000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.29431172135530300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.29431172135530300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.96558311276619000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.96558311276619000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.81681460880669000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.81681460880669000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.20509941503951000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.20509941503951000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.72765905661257000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.72765905661257000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.48788237089759900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.48788237089759900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.24947907141902000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.24947907141902000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.59005387432649000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.59005387432649000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.30370570926522000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.30370570926522000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.73638792046556000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.73638792046556000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.87789934199453800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.87789934199453800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.51989255137937000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.51989255137937000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.76305470679095000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.76305470679095000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.86920962997342000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.86920962997342000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.91313411328065000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.91313411328065000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.73463683758381000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.73463683758381000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.84273889473222500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.84273889473222500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.87403925546477700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.87403925546477700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.36964126011414000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.36964126011414000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.02726746648694000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.02726746648694000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.50557053097483000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.50557053097483000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.56453106035648000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.56453106035648000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.61890516636808000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.61890516636808000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.37767835277405000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.37767835277405000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.90511255527429100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.90511255527429100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.05929345122920000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.05929345122920000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.21311454144036000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.21311454144036000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-7.79062987304713000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-7.79062987304713000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.21365525338096000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.21365525338096000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.28348152906416000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.28348152906416000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.06610409505261000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.06610409505261000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.35302095923550200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.35302095923550200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.90818370281786000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.90818370281786000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.32125632829404000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.32125632829404000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.19461589112926800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.19461589112926800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.13206147532649300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.13206147532649300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.90445975568758000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.90445975568758000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.09055301456874000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.09055301456874000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.94747584830211900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.94747584830211900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.87479371073786000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.87479371073786000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.77693922561847000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.77693922561847000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.43857452366099000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.43857452366099000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.32571155407419000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.32571155407419000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.02598140411007480000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.02598140411007480000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.63213858956142000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.63213858956142000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.87199046737281000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.87199046737281000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.51485641768478000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.51485641768478000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.64286402800302700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.64286402800302700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.47677130142230000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.47677130142230000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.39498987162520000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.39498987162520000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.97846593865349600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.97846593865349600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.38696988049949000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.38696988049949000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.99716557343840900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.99716557343840900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.26983285318203300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.26983285318203300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.02818282704670500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.02818282704670500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.33995460770471000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.33995460770471000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.90961343273142000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.90961343273142000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.70545858631691000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.70545858631691000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.99837322296447000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.99837322296447000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.52931499785106000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.52931499785106000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.50600351005455000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.50600351005455000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.83191012798055900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.83191012798055900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.58090819604341000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.58090819604341000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.95182376827953000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.95182376827953000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.04199841193785000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.04199841193785000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.17938850513021000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.17938850513021000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.66797071567664000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.66797071567664000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.37221015583147000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.37221015583147000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.75673862000485000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.75673862000485000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.79003986824116500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.79003986824116500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.86020949016507000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.86020949016507000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.14082258481500000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.14082258481500000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.71685664840859000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.71685664840859000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.93998389083824300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.93998389083824300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.77244357996158000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.77244357996158000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.10595524850565900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.10595524850565900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.69799635213612000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.69799635213612000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.57971250175452400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.57971250175452400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.92766866933807100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.92766866933807100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.46991620588858000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.46991620588858000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.94569644123488000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.94569644123488000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.18859094010287000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.18859094010287000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.03213167005865000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.03213167005865000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "8.81754146434609000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(8.81754146434609000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.75897430327076600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.75897430327076600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.80047028975912000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.80047028975912000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.00529573224131364000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.00529573224131364000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.71024073322357000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.71024073322357000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.60642130185119000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.60642130185119000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.09793780927960000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.09793780927960000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.18560965637846000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.18560965637846000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.13078526893487000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.13078526893487000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.19951899215254000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.19951899215254000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.81885534502479000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.81885534502479000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.00480638980341000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.00480638980341000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.35315675289406200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.35315675289406200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.29812812014442000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.29812812014442000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.98878626408816000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.98878626408816000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.34644737073484000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.34644737073484000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.37478492823657000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.37478492823657000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.97205178784195000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.97205178784195000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.65165003646427000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.65165003646427000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.89236175545723000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.89236175545723000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.80366872242454000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.80366872242454000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "7.65465855719486000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(7.65465855719486000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.51455943741659600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.51455943741659600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.14337541345649000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.14337541345649000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.06909574569091000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.06909574569091000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.07698497525470000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.07698497525470000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.04223854975535000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.04223854975535000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.46422724459484000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.46422724459484000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.65888981424971000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.65888981424971000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-7.10193673069906000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-7.10193673069906000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.77638222509466500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.77638222509466500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.15543610545042000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.15543610545042000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.51787760900314000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.51787760900314000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.09022915694655000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.09022915694655000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.41861013154040000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.41861013154040000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.40227565288403000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.40227565288403000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.44321592617247400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.44321592617247400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.34090258417639000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.34090258417639000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.54291265629528700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.54291265629528700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.70700051509186000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.70700051509186000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-6.55072864947955000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-6.55072864947955000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.96741942560520000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.96741942560520000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.55202552301084000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.55202552301084000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.36133250863907300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.36133250863907300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.46513564511238000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.46513564511238000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.97424909475891000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.97424909475891000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.87005014400085000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.87005014400085000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.25552308785543000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.25552308785543000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.43365620710902500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.43365620710902500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.17392137573999000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.17392137573999000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.56870774575795000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.56870774575795000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.07449225479459900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.07449225479459900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.25905472211571000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.25905472211571000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.13708454690765000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.13708454690765000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.08223808231444500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.08223808231444500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.69624060459529000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.69624060459529000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.87232652840742000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.87232652840742000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.20739068103174300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.20739068103174300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.45449313279700600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.45449313279700600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.06604828436047000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.06604828436047000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.16603807756896700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.16603807756896700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "6.56288534361719000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(6.56288534361719000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.28481655900710000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.28481655900710000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.79412040010646300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.79412040010646300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.90088144503330000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.90088144503330000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.65278657648370200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.65278657648370200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.40305895338068000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.40305895338068000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.07193308249503000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.07193308249503000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.83752112822253600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.83752112822253600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.63174453257058400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.63174453257058400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.80163760021425000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.80163760021425000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.57922670044433000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.57922670044433000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "6.80309348037215000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(6.80309348037215000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.03658264005365000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.03658264005365000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "8.57714214650747000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(8.57714214650747000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.25657256359494300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.25657256359494300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.07218601388076000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.07218601388076000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.70300607815345600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.70300607815345600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.06822028770915030000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.06822028770915030000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.52253514473857300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.52253514473857300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.89211508282910000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.89211508282910000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.47331243043688000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.47331243043688000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.77190031720697000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.77190031720697000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.80704979593058400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.80704979593058400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.58398766715845000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.58398766715845000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.59532008540482000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.59532008540482000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.92824570343456000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.92824570343456000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.15232705272560400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.15232705272560400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.13670276871382500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.13670276871382500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.20063314286385000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.20063314286385000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.20390958339690000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.20390958339690000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.01999231401200000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.01999231401200000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.33696129476675000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.33696129476675000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.97472839619216000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.97472839619216000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.25935508044004000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.25935508044004000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.98737992668548000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.98737992668548000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.12647380973595000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.12647380973595000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.04573005673487000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.04573005673487000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.40131707240240000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.40131707240240000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.65350895248975000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.65350895248975000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.94344081509933000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.94344081509933000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.72697189247371000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.72697189247371000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-6.67990308483490000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-6.67990308483490000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.32343310660542000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.32343310660542000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.78517123090950000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.78517123090950000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.25849816293583000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.25849816293583000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.75396267700095000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.75396267700095000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.07647901824168000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.07647901824168000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.38047538070258000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.38047538070258000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.20758597742145100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.20758597742145100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.85537090667122100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.85537090667122100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.76805423797310000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.76805423797310000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.40449492713592000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.40449492713592000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.62167096457336000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.62167096457336000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.74002997550002000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.74002997550002000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.42443064164790400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.42443064164790400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.27951604455776900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.27951604455776900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.51579267322296100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.51579267322296100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.36457251883339000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.36457251883339000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.24583724281163800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.24583724281163800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.89377268220461400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.89377268220461400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.45674815825147000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.45674815825147000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.85885778179785000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.85885778179785000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.46665640857091000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.46665640857091000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.20955012166670000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.20955012166670000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.56901773371710000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.56901773371710000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.28236715260714000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.28236715260714000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.68701183150938000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.68701183150938000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.52491544332882000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.52491544332882000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.35369978756681100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.35369978756681100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.37511760913818000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.37511760913818000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.97143364160106000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.97143364160106000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.24559477959438200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.24559477959438200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.75423032204965000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.75423032204965000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.32370293533555300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.32370293533555300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.91057697616735300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.91057697616735300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.47061739750017000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.47061739750017000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.00584944044255000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.00584944044255000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.50109276836214000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.50109276836214000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.55007311077336000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.55007311077336000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "6.72362848947278000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(6.72362848947278000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.01151577930873910000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.01151577930873910000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.42911860719965600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.42911860719965600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.66111289816664900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.66111289816664900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.86619326895662000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.86619326895662000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.55732089555551800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.55732089555551800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.30341160871063000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.30341160871063000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.56416171751671000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.56416171751671000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.18594183907073900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.18594183907073900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.76842629255481000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.76842629255481000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.51401910241563500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.51401910241563500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.22475819701855600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.22475819701855600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.52647532265208000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.52647532265208000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.36302691626541400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.36302691626541400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.97344494357431000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.97344494357431000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.55983273528683000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.55983273528683000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.11831213859734000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.11831213859734000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.65912510665320000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.65912510665320000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.49382686162217300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.49382686162217300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.82681319206813000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.82681319206813000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.63990018376158400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.63990018376158400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.46190583889476000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.46190583889476000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.33778970852365000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.33778970852365000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.67479071577411000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.67479071577411000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.92524843393689500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.92524843393689500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.25880026429762000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.25880026429762000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.74489327613996700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.74489327613996700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.81221138965657700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.81221138965657700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.63922583575742000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.63922583575742000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.46277795175279000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.46277795175279000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.92701639727950000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.92701639727950000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.00608886511047000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.00608886511047000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.59692755566202000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.59692755566202000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.43660191582482000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.43660191582482000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.81340386111566000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.81340386111566000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.41381029424169000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.41381029424169000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.19067619994638000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.19067619994638000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.41344288416300500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.41344288416300500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.19449050806631000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.19449050806631000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.94346623486537000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.94346623486537000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.15222182306952000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.15222182306952000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.16597270635016000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.16597270635016000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.70800933434033500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.70800933434033500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.01520859362049000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.01520859362049000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.99808924291921000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.99808924291921000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.46413571523617000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.46413571523617000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.23372155013436100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.23372155013436100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.22220872747082200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.22220872747082200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.45231083327185000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.45231083327185000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.18629931302726700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.18629931302726700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.25902351261081000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.25902351261081000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.74979626491734000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.74979626491734000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.96938763187002300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.96938763187002300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.01957662295404000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.01957662295404000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.29052978268713000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.29052978268713000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.72223107008226000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.72223107008226000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.02075269473024000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.02075269473024000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.41254866425811000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.41254866425811000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.79485280000328000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.79485280000328000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.71346724218879000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.71346724218879000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.02769972220451300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.02769972220451300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.30840233811538300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.30840233811538300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.46998368658050000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.46998368658050000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.39027116095637000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.39027116095637000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.76287623175477000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.76287623175477000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.32254147772188000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.32254147772188000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.43476530791568300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.43476530791568300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.15293149279800000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.15293149279800000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.52187680632247000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.52187680632247000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.81464816227136000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.81464816227136000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.45410471462063000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.45410471462063000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.05770661428355000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.05770661428355000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.13365631051443000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.13365631051443000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.78752268413674000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.78752268413674000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.07653691039301000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.07653691039301000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.69590678743817200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.69590678743817200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.16750017237716000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.16750017237716000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.80454059859949500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.80454059859949500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.01080121519000000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.01080121519000000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-6.26823154211325000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-6.26823154211325000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.27168923945051000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.27168923945051000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.95882006177823000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.95882006177823000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.29782169884960000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.29782169884960000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.18868107998160000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.18868107998160000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.42221680213317000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.42221680213317000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.97658929351465000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.97658929351465000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.76786358453912000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.76786358453912000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.63996015852897000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.63996015852897000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.53048948235281000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.53048948235281000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.72713707173900000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.72713707173900000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.67678586641071000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.67678586641071000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.27938145860632000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.27938145860632000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.67198854485259000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.67198854485259000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.08448300379640000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.08448300379640000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.89200760812645600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.89200760812645600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.84610740591283000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.84610740591283000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.33520422865196000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.33520422865196000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.26977509689943300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.26977509689943300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.06556998317024000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.06556998317024000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.10187258099846900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.10187258099846900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.17925123727943000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.17925123727943000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.53744857107300000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.53744857107300000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.79170718052687000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.79170718052687000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.70094405912437000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.70094405912437000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.36090079790873000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.36090079790873000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.24214402582849600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.24214402582849600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.61857148054390100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.61857148054390100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.49681404951875000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.49681404951875000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.62901170744691000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.62901170744691000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.31812686057237000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.31812686057237000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.29232513324991000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.29232513324991000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.30415968616239000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.30415968616239000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.23085063327904200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.23085063327904200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.55328286749515200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.55328286749515200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.85987085857330000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.85987085857330000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.91580898949892000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.91580898949892000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.83451772893723400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.83451772893723400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "8.47663066417390000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(8.47663066417390000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.07750241770625000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.07750241770625000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.79888627452876900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.79888627452876900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.62390154942094000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.62390154942094000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.15344123017231000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.15344123017231000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.29946850732165400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.29946850732165400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.43195118421230900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.43195118421230900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.96541584823575200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.96541584823575200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.31046639376194000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.31046639376194000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.80868720295308000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.80868720295308000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.91875650345864000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.91875650345864000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.16383120358956700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.16383120358956700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.70602187714556100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.70602187714556100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.59908461641224000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.59908461641224000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.75777826959967000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.75777826959967000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "7.51297060665513000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(7.51297060665513000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.26428182282563100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.26428182282563100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.39790664337099000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.39790664337099000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.52727246472497000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.52727246472497000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.15622706860781000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.15622706860781000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.33838258813926000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.33838258813926000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.68209356689853000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.68209356689853000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.12950059731897000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.12950059731897000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.24366467557925000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.24366467557925000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.49620375847259000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.49620375847259000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.04336416841016000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.04336416841016000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.67258592218424000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.67258592218424000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.50983053528049600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.50983053528049600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.91671084717300400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.91671084717300400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-8.44023177630015000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-8.44023177630015000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.74048232685721000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.74048232685721000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.26893036021697000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.26893036021697000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.81851986861265000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.81851986861265000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.15033199581975000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.15033199581975000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.78498201393837000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.78498201393837000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.05287486584367510000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.05287486584367510000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.61135813076181000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.61135813076181000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.28026567889772000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.28026567889772000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.42191037602383000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.42191037602383000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.91926628714024000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.91926628714024000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.13695172353534000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.13695172353534000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.19234124167404000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.19234124167404000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.54749310279860000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.54749310279860000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.79683457995789900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.79683457995789900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.35976469553121900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.35976469553121900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.77036485893720200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.77036485893720200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.05245602278075000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.05245602278075000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.82693752156961000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.82693752156961000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.59176692084240000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.59176692084240000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.59390017044970000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.59390017044970000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.33597209441560000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.33597209441560000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.73223852215944000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.73223852215944000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.36562951036666300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.36562951036666300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.16083819415565000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.16083819415565000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.19457461912900000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.19457461912900000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.48993781857833000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.48993781857833000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.91089514047878000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.91089514047878000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.67713158365996000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.67713158365996000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.14929866451844800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.14929866451844800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.76110653286820000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.76110653286820000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.05937778946509720000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.05937778946509720000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.67737188304973000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.67737188304973000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.58425440578219000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.58425440578219000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.30491550374261000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.30491550374261000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.48379945880357000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.48379945880357000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.62987027701035800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.62987027701035800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.97181285150671000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.97181285150671000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.24881707556359700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.24881707556359700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.83925282156180000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.83925282156180000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.07567311295324000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.07567311295324000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.78919598870022000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.78919598870022000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.51240908161798000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.51240908161798000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.51275535534832000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.51275535534832000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.58920518726789000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.58920518726789000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.81944139206950000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.81944139206950000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.20584689863215000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.20584689863215000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.52387820278697400000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.52387820278697400000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.41030960929320000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.41030960929320000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.92103214885374000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.92103214885374000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.24231540245246000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.24231540245246000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.16908726665941100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.16908726665941100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.44589887686242000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.44589887686242000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.49069006371512000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.49069006371512000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.80650544937931100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.80650544937931100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.97976397104165000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.97976397104165000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.98766812819005000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.98766812819005000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.72989593663204100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.72989593663204100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.61947487048298000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.61947487048298000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.14305085135282200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.14305085135282200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.19625994631193500000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.19625994631193500000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.37918205114016000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.37918205114016000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "6.59599108171267000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(6.59599108171267000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.96455017519345000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.96455017519345000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.54659210340770000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.54659210340770000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.34333955584988000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.34333955584988000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.97945807230247000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.97945807230247000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.16309656911088000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.16309656911088000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.25046325751587000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.25046325751587000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.95513333613538000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.95513333613538000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.44180657712571200000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.44180657712571200000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.62068238736436000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.62068238736436000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.06550714914445000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.06550714914445000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.50821128944561000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.50821128944561000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.15508838007900000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.15508838007900000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.95233817795899000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.95233817795899000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.51496658163574000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.51496658163574000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.78333801715048000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.78333801715048000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.21314186040171000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.21314186040171000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.66527690284710800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.66527690284710800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.15441313415350000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.15441313415350000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.23491685110319000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.23491685110319000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.72724695951577000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.72724695951577000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.24050455306641300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.24050455306641300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.21656863480457000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.21656863480457000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.26488830552906000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.26488830552906000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "3.75588617365038000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(3.75588617365038000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.03323480544193850000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.03323480544193850000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.09120742547457650000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.09120742547457650000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-7.88263056036503000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-7.88263056036503000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.43816026309627000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.43816026309627000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-7.03193105607121000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-7.03193105607121000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.60611554369909000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.60611554369909000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-5.51585989717609000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-5.51585989717609000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.07820571638609000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.07820571638609000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.06101375865811000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.06101375865811000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.20736962161768000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.20736962161768000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.90243061828996000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.90243061828996000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.85299495975262000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.85299495975262000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.12934888152265000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.12934888152265000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.67072919212958000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.67072919212958000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.83114509924264900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.83114509924264900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.30250616100438000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.30250616100438000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.12093048302870000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.12093048302870000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.05552960660102000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.05552960660102000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.49292325032676000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.49292325032676000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.17400757029104000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.17400757029104000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.14267109660887000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.14267109660887000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.10546669054034000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.10546669054034000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.21371952871041700000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.21371952871041700000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "4.78156583044177000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(4.78156583044177000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.50472792044367000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.50472792044367000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.12605755507866600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.12605755507866600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.70371185139311000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.70371185139311000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.10053982101354000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.10053982101354000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.83624586947925000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.83624586947925000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.05046060224221000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.05046060224221000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.28157147555257100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.28157147555257100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.59637285322805000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.59637285322805000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.75470175557419100000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.75470175557419100000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.70838399472621000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.70838399472621000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.45654131621183000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.45654131621183000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.28443945581399000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.28443945581399000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.68823597183684000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.68823597183684000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.29650435341174000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.29650435341174000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.90134290476188000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.90134290476188000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.18487205108194000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.18487205108194000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.14778330708372000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.14778330708372000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.98574838531856000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.98574838531856000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.38116626593387000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.38116626593387000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.18109367323846900000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.18109367323846900000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.54919024558896000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.54919024558896000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-3.01819062231017000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-3.01819062231017000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.86141885135950000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.86141885135950000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.31984756442573800000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.31984756442573800000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.35256585949514000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.35256585949514000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-6.04254591090669000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-6.04254591090669000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.31151799331342300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.31151799331342300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.77556498660193000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.77556498660193000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "5.90371566906766000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(5.90371566906766000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.29825016398122000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.29825016398122000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.01456323654512000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.01456323654512000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-6.19305288625244000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-6.19305288625244000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.99509367627092600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.99509367627092600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.08519786419394440000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.08519786419394440000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.88317752752055000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.88317752752055000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "1.69592260047492000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(1.69592260047492000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.66260089028084000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.66260089028084000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.12882625389413000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.12882625389413000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.79536921500302000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.79536921500302000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-4.51399167357593000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-4.51399167357593000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-0.75817764527332300000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-0.75817764527332300000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-2.12821371262498000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-2.12821371262498000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "-1.08153732327358000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(-1.08153732327358000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "0.71608571781169600000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(0.71608571781169600000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.42004689052701000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.42004689052701000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.84542164846610000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.84542164846610000000, r, TOLERANCE); - } - - { - bool ok = StringToDouble(r, "2.97822513569917000000"); - EXPECT_TRUE(ok); - EXPECT_NEAR(2.97822513569917000000, r, TOLERANCE); - } -} - -TEST(GenericToolbox, TestStringToDoubleHard) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17f", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17f", b); -#endif - double r = 0.0; - bool ok = StringToDouble(r, txt); - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > TOLERANCE) - { - printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b-r), TOLERANCE); - } -#endif - EXPECT_NEAR(b, r, TOLERANCE); - } -} - -TEST(GenericToolbox, TestStringToDoubleHardNeg) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = -1.0*DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17f", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17f", b); -#endif - double r = 0.0; - bool ok = StringToDouble(r, txt); - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > TOLERANCE) - { - printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b - r), TOLERANCE); - } -#endif - EXPECT_NEAR(b, r, TOLERANCE); - } -} - -static const size_t NUM_TIMINGS_CONVS = 1; // set to 2000 if you want to measure perfs; - - -//4444444444444444$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - -TEST(GenericToolbox, TestStringToDoubleHardNeg_lexical_cast_vs_StringToDouble) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - double total_us_StringToDouble = 0.0; - double total_us_lexical_cast = 0.0; - int64_t numConversions = 0; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17f", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17f", b); -#endif - - - double r = 0.0; - - bool ok = true; - - { - boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); - for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) - { - ok = StringToDouble(r, txt); - } - boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); - total_us_StringToDouble += (end - start).total_microseconds(); - } - - { - boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); - for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) - { - try - { - r = boost::lexical_cast(txt); - ok = true; - } - catch (boost::bad_lexical_cast& ) - { - ok = false; - } - } - boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); - total_us_lexical_cast += (end - start).total_microseconds(); - } - numConversions += NUM_TIMINGS_CONVS; - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17f\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17f\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > TOLERANCE) - { - printf("fabs(b (%.17f) - r (%.17f)) ((%.17f)) > TOLERANCE (%.17f)\n", b, r, fabs(b - r), TOLERANCE); - } -#endif - EXPECT_NEAR(b, r, TOLERANCE); - } - std::cout << "Total time (us) for " << numConversions - << " conversions using StringToDouble (with NO scientific notation) = " - << static_cast(total_us_StringToDouble) << std::endl; - - std::cout << "Time per conversion using StringToDouble (ns) = " - << (int64_t)( (total_us_StringToDouble * 1000) /((double)numConversions)) << std::endl; - - std::cout << "Total time (us) for " << numConversions - << " conversions using boost::lexical_cast (with NO scientific notation) = " - << static_cast(total_us_lexical_cast) << std::endl; - - std::cout << "Time per conversion using boost::lexical_cast (ns) = " - << (int64_t)( (total_us_lexical_cast * 1000) / ((double)numConversions)) << std::endl; - - std::cout << "StringToDouble is " << (int)((total_us_lexical_cast / total_us_StringToDouble) + 0.5) << " times faster than boost::lexical_cast" << std::endl; - -} -//4444444444444444$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - -TEST(GenericToolbox, TestStringToDoubleHardScientific) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - - // the tolerance must be adapted depending on the exponent - double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); - double actualTolerance = TOLERANCE * pow(10.0, exponent); - - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17e", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17e", b); -#endif - double r = 0.0; - bool ok = StringToDouble(r, txt); - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > actualTolerance) - { - printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - ok = StringToDouble(r, txt); - } - else - { - printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - } -#endif - EXPECT_NEAR(b, r, actualTolerance); - } -} - -TEST(GenericToolbox, TestStringToDoubleHardNegScientific) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - // the tolerance must be adapted depending on the exponent - double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); - double actualTolerance = TOLERANCE * pow(10.0, exponent); - - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17e", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17e", b); -#endif - double r = 0.0; - bool ok = StringToDouble(r, txt); - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > actualTolerance) - { - printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - ok = StringToDouble(r, txt); - } - else - { - printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - } -#endif - EXPECT_NEAR(b, r, actualTolerance); - } -} - - -TEST(GenericToolbox, TestStringToDoubleHardNegScientific_lexical_cast_vs_StringToDouble) -{ - using OrthancStone::GenericToolbox::StringToDouble; - const double TOLERANCE = 0.00000000000001; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - - double total_us_StringToDouble = 0.0; - double total_us_lexical_cast = 0.0; - int64_t numConversions = 0; - - for (double b = -1.0 * DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - // the tolerance must be adapted depending on the exponent - double exponent = (b == 0) ? 0 : 1.0 + std::floor(std::log10(std::fabs(b))); - double actualTolerance = TOLERANCE * pow(10.0, exponent); - - char txt[1024]; -#if defined(_MSC_VER) - sprintf_s(txt, "%.17e", b); -#else - snprintf(txt, sizeof(txt) - 1, "%.17e", b); -#endif - double r = 0.0; - - bool ok = true; - - { - boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); - for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) - { - ok = StringToDouble(r, txt); - } - boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); - total_us_StringToDouble += (end - start).total_microseconds(); - } - - { - boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); - for (size_t i = 0; i < NUM_TIMINGS_CONVS; ++i) - { - try - { - r = boost::lexical_cast(txt); - ok = true; - } - catch (boost::bad_lexical_cast& ) - { - ok = false; - } - } - boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); - total_us_lexical_cast += (end - start).total_microseconds(); - } - numConversions += NUM_TIMINGS_CONVS; - -#if 0 - if (ok) - { - printf("OK for txt = \"%s\" and r = %.17e\n", txt, r); - } - else - { - printf("Not ok for txt = \"%s\" and r = %.17e\n", txt, r); - ok = StringToDouble(r, txt); - } -#endif - - EXPECT_TRUE(ok); - -#if 0 - if (fabs(b - r) > actualTolerance) - { - printf("NOK fabs(b (%.17f) - r (%.17f)) ((%.17f)) > actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("NOK fabs(b (%.17e) - r (%.17e)) ((%.17e)) > actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - ok = StringToDouble(r, txt); - } - else - { - printf("OK fabs(b (%.17f) - r (%.17f)) ((%.17f)) <= actualTolerance (%.17f)\n", b, r, fabs(b - r), actualTolerance); - printf("OK fabs(b (%.17e) - r (%.17e)) ((%.17e)) <= actualTolerance (%.17e)\n", b, r, fabs(b - r), actualTolerance); - } -#endif - EXPECT_NEAR(b, r, actualTolerance); - } - - std::cout << "Total time (us) for " << numConversions - << " conversions using StringToDouble (WITH scientific notation) = " - << static_cast(total_us_StringToDouble) << std::endl; - - std::cout << "Time per conversion using StringToDouble (ns) = " - << (int64_t)( (total_us_StringToDouble*1000) / ((double)numConversions)) << std::endl; - - std::cout << "Total time (us) for " << numConversions - << " conversions using boost::lexical_cast (WITH scientific notation) = " - << static_cast(total_us_lexical_cast) << std::endl; - - std::cout << "Time per conversion using boost::lexical_cast (ns) = " - << (int64_t)( (total_us_lexical_cast * 1000) / ((double)numConversions)) << std::endl; - - std::cout << "StringToDouble is " << (int)((total_us_lexical_cast / total_us_StringToDouble)+ 0.5) << " times faster than boost::lexical_cast" << std::endl; -} - - -TEST(GenericToolbox, TestStringToIntegerHard) -{ - using OrthancStone::GenericToolbox::StringToInteger; - - size_t i = 0; - const size_t COUNT = 125; - //const double FACTOR = 1.000000000171271211; - const double FACTOR = 1.71271211; - for (double b = DBL_EPSILON; b < DBL_MAX && i < COUNT; ++i, b *= FACTOR) - { - int64_t bi = static_cast(b); - char txt[1024]; -#if defined(_MSC_VER) -# if (_MSC_VER > 1800) - sprintf_s(txt, "%lld", bi); -# else - sprintf_s(txt, "%I64d", bi); -# endif -#else - snprintf(txt, sizeof(txt) - 1, "%ld", bi); -#endif - int64_t r = 0; - bool ok = StringToInteger(r, txt); - EXPECT_TRUE(ok); - EXPECT_EQ(bi, r); -#if 0 - if (ok) - { - printf("OK for b = %.17f bi = %lld txt = \"%s\" and r = %lld\n", b, bi, txt, r); - } - else - { - printf("NOK for b = %.17f bi = %lld txt = \"%s\" and r = %lld\n", b, bi, txt,r); - ok = StringToInteger(r, txt); - } -#endif - } -} - - -TEST(GenericToolbox, TestGetRgbValuesFromString) -{ - using OrthancStone::GenericToolbox::GetRgbValuesFromString; - - uint8_t red = 0; - uint8_t green = 0; - uint8_t blue = 0; - - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, " ")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb() ")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,30 2563) ")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,30 2563,45) ")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,303.23,45)")); - EXPECT_FALSE(GetRgbValuesFromString(red, green, blue, "rgb(12,303,45 ")); - - ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, "rgb(12,255,45)")); - EXPECT_EQ(12, red); - EXPECT_EQ(255, green); - EXPECT_EQ(45, blue); - - ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 72 , 257 , 47 ) ")); - EXPECT_EQ(72, red); - EXPECT_EQ(1, green); //rollover 255 --> 255, 256 --> 0, 257 --> 1,... - EXPECT_EQ(47, blue); - - ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 72 , 247 , 47 ) ")); - EXPECT_EQ(72, red); - EXPECT_EQ(247, green); - EXPECT_EQ(47, blue); - - ASSERT_TRUE(GetRgbValuesFromString(red, green, blue, " rgb ( 000, 0, 000) ")); - EXPECT_EQ(0, red); - EXPECT_EQ(0, green); - EXPECT_EQ(0, blue); -} - - - - - - - diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/ImageToolboxTests.cpp --- a/UnitTestsSources/ImageToolboxTests.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,260 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -#include "../Framework/Toolbox/ImageToolbox.h" - -// #include -// #include - -#include -#include -#include - -#include "stdint.h" - -#include - -#include - - -TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1) -{ - using OrthancStone::HistogramData; - using OrthancStone::DumpHistogramResult; - using OrthancStone::ComputeHistogram; - - const unsigned int W = 16; - const unsigned int H = 16; - - // 256/17 = 15,... - // 256 % 17 = 1 - // 0 will be 16 times - // 1 will be 15 times - // 2 will be 15 times - // ... - // 16 will be 15 times - - size_t pixCounter = 0; - - std::unique_ptr image(new Orthanc::Image( - Orthanc::PixelFormat_Grayscale8, W, H, false)); - - for (unsigned int y = 0; y < H; ++y) - { - uint8_t* buffer = reinterpret_cast(image->GetRow(y)); - for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) - { - *buffer = static_cast(pixCounter % 17); - } - } - - HistogramData hd; - ComputeHistogram(*image, hd, 1); - ASSERT_EQ(-0.5, hd.minValue); - ASSERT_EQ(17u, hd.bins.size()); - ASSERT_EQ(16u, hd.bins[0]); - for (size_t i = 1; i < hd.bins.size(); ++i) - ASSERT_EQ(15u, hd.bins[i]); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1_FormatString) -{ - using OrthancStone::HistogramData; - using OrthancStone::DumpHistogramResult; - using OrthancStone::ComputeHistogram; - - const unsigned int W = 16; - const unsigned int H = 16; - - // 256/17 = 15,... - // 256 % 17 = 1 - // 0 will be 16 times - // 1 will be 15 times - // 2 will be 15 times - // ... - // 16 will be 15 times - - size_t pixCounter = 0; - - std::unique_ptr image(new Orthanc::Image( - Orthanc::PixelFormat_Grayscale8, W, H, false)); - - for (unsigned int y = 0; y < H; ++y) - { - uint8_t* buffer = reinterpret_cast(image->GetRow(y)); - for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) - { - *buffer = static_cast(pixCounter % 17); - } - } - - HistogramData hd; - ComputeHistogram(*image, hd, 1); - - // void DumpHistogramResult(std::string& s, const HistogramData& hd) - std::string s; - DumpHistogramResult(s, hd); - std::cout << s; -} - -template -void SimpleHisto_T_BinSize1_2() -{ - using OrthancStone::HistogramData; - using OrthancStone::DumpHistogramResult; - using OrthancStone::ComputeHistogram; - - const unsigned int W = 16; - const unsigned int H = 16; - - // 256/17 = 15,... - // 256 % 17 = 1 - // 0 will be 16 times - // 1 will be 15 times - // 2 will be 15 times - // ... - // 16 will be 15 times - - size_t pixCounter = 0; - - std::unique_ptr image(new Orthanc::Image( - Format, W, H, false)); - - typedef typename Orthanc::PixelTraits::PixelType PixelType; - - PixelType pixValue = 0; - - for (unsigned int y = 0; y < H; ++y) - { - PixelType* buffer = reinterpret_cast(image->GetRow(y)); - for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) - { - // 0..99 0..99 0..55 - *buffer = pixValue; - pixValue++; - if (pixValue >= 100) - pixValue = 0; - } - } - - HistogramData hd; - ComputeHistogram(*image, hd, 1); - ASSERT_EQ(-0.5, hd.minValue); - ASSERT_EQ(100u, hd.bins.size()); - for (size_t i = 0; i <= 55; ++i) - ASSERT_EQ(3u, hd.bins[i]); - for (size_t i = 56; i <= 99; ++i) - ASSERT_EQ(2u, hd.bins[i]); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize1_2) -{ - SimpleHisto_T_BinSize1_2(); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale16_BinSize1_2) -{ - SimpleHisto_T_BinSize1_2(); -} - -TEST(ImageToolbox, SimpleHisto_SignedGrayscale16_BinSize1_2) -{ - SimpleHisto_T_BinSize1_2(); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale32_BinSize1_2) -{ - SimpleHisto_T_BinSize1_2(); -} - -template -void SimpleHisto_T_BinSize10_2() -{ - using OrthancStone::HistogramData; - using OrthancStone::DumpHistogramResult; - using OrthancStone::ComputeHistogram; - - const unsigned int W = 16; - const unsigned int H = 16; - - // 256/17 = 15,... - // 256 % 17 = 1 - // 0 will be 16 times - // 1 will be 15 times - // 2 will be 15 times - // ... - // 16 will be 15 times - - size_t pixCounter = 0; - - std::unique_ptr image(new Orthanc::Image( - Format, W, H, false)); - - typedef typename Orthanc::PixelTraits::PixelType PixelType; - - PixelType pixValue = 0; - - for (unsigned int y = 0; y < H; ++y) - { - PixelType* buffer = reinterpret_cast(image->GetRow(y)); - for (unsigned int x = 0; x < W; ++x, ++buffer, ++pixCounter) - { - // 0..99 0..99 0..55 - *buffer = pixValue; - pixValue++; - if (pixValue >= 100) - pixValue = 0; - } - } - - HistogramData hd; - ComputeHistogram(*image, hd, 10); - ASSERT_EQ(-0.5, hd.minValue); - ASSERT_EQ(10u, hd.bins.size()); - - for (size_t i = 0; i <= 4; ++i) - ASSERT_EQ(30u, hd.bins[i]); - - ASSERT_EQ(26u, hd.bins[5]); - - for (size_t i = 6; i <= 9; ++i) - ASSERT_EQ(20u, hd.bins[i]); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale8_BinSize10_2) -{ - SimpleHisto_T_BinSize10_2(); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale16_BinSize10_2) -{ - SimpleHisto_T_BinSize10_2(); -} - -TEST(ImageToolbox, SimpleHisto_SignedGrayscale16_BinSize10_2) -{ - SimpleHisto_T_BinSize10_2(); -} - -TEST(ImageToolbox, SimpleHisto_Grayscale32_BinSize10_2) -{ - SimpleHisto_T_BinSize10_2(); -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/PixelTestPatternsTests.cpp --- a/UnitTestsSources/PixelTestPatternsTests.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "../Framework/Toolbox/PixelTestPatterns.h" - -#include -#include - -#include -#include - -#include -#include -#include - - /* Autogenerated from prout.png */ -static const unsigned char bin2c_SimpleRedBlueHGradient_png[391] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\0\200\0\0\0\200\10\6\0\0\0\303>a\313\0\0\1MIDATx\234\355\322\1\15\3000\0\303\260~\3741o\7\342X\12\203|o{wgev\26Z\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p\15\200k\0\\\3\340\32\0\327\0\270\6\3005\0\256\1p?\314\262\201\3760\355r\262\0\0\0\0IEND\256B`\202"; - -TEST(PixelTestPatterns, SimpleRedHGradient) -{ - std::unique_ptr texture; - - texture.reset(new Orthanc::Image( - Orthanc::PixelFormat_RGBA32, - 128, - 128, - /*forceMinimalPitch*/false)); - - Orthanc::ImageAccessor target; - texture->GetWriteableAccessor(target); - - OrthancStone::PixelTestPatterns::fillWithHGradient(target,255,0,0,0,0,255); - - Orthanc::PngWriter writer; -#if 0 - writer.WriteToFile("SimpleRedBlueHGradient.png", *texture); -#else - std::string contents; - writer.WriteToMemory(contents, *texture); - - ASSERT_EQ(1u, sizeof(unsigned char)); - ASSERT_EQ(391u, sizeof(bin2c_SimpleRedBlueHGradient_png)); - ASSERT_EQ(390u, contents.size()); - - char* resultPngBytes = &(contents[0]); - - int result = memcmp(resultPngBytes, bin2c_SimpleRedBlueHGradient_png, 390); - ASSERT_EQ(0, result); -#endif -} - -static const unsigned char bin2c_SimpleRedBlueVGradient_png[400] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\0\200\0\0\0\200\10\6\0\0\0\303>a\313\0\0\1VIDATx\234\355\322A\21\3000\14\300\260t7\376\220\327\301\310\303\22\2?|\356\314\35\262\336o\236\355\6\26\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\14\20g\2008\3\304\31 \316\0q\6\2103@\234\1\342\316\231\357nG\260\347\7\221\255\203\367~A)\36\0\0\0\0IEND\256B`\202"; - - -TEST(PixelTestPatterns, SimpleRedBlueVGradient) -{ - std::unique_ptr texture; - - texture.reset(new Orthanc::Image( - Orthanc::PixelFormat_RGBA32, - 128, - 128, - /*forceMinimalPitch*/false)); - - Orthanc::ImageAccessor target; - texture->GetWriteableAccessor(target); - - OrthancStone::PixelTestPatterns::fillWithVGradient(target, 255, 0, 0, 0, 0, 255); - - Orthanc::PngWriter writer; -#if 0 - writer.WriteToFile("SimpleRedBlueVGradient.png", *texture); -#else - std::string contents; - writer.WriteToMemory(contents, *texture); - - ASSERT_EQ(1u, sizeof(unsigned char)); - ASSERT_EQ(400u, sizeof(bin2c_SimpleRedBlueVGradient_png)); - ASSERT_EQ(399u, contents.size()); - - char* resultPngBytes = &(contents[0]); - - int result = memcmp(resultPngBytes, bin2c_SimpleRedBlueVGradient_png, 399); - ASSERT_EQ(0, result); -#endif -} - - -/* Autogenerated from MultiGradient.png */ -static const unsigned char bin2c_MultiGradient_png[774] = "\211PNG\15\12\32\12\0\0\0\15IHDR\0\0\1\0\0\0\0\200\10\6\0\0\0\344\265\267\12\0\0\2\314IDATx\234\355\325\301\11\3030\24\5\301/\242\376+6(E$ \314\354\30\337\215\364X\2573s\6\266\316\314\226\237\365\271}\5\227\255\331{\273\357s\373\374sY\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\25\0^\13\220\2559\347\354\231Q\337\317\372\303)\276\331Ys\377\26\256.\340\3673|\261}\373\3n{\360?\240>\200\347\351\376i\5\300V\0pz\0t\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0l\5\0W\0lz\0\276!\352\302\35+U\244b\0\0\0\0IEND\256B`\202"; - -TEST(PixelTestPatterns, MultiGradient) -{ - std::unique_ptr texture; - - const int CELLW = 64; - const int CELLH = 64; - const int NHCELLS = 4; - const int NVCELLS = 2; - const int NCELLS = NHCELLS * NVCELLS; - - texture.reset(new Orthanc::Image( - Orthanc::PixelFormat_RGBA32, - NHCELLS * CELLW, - NVCELLS * CELLH, - /*forceMinimalPitch*/false)); - - // H:R->K, V:G->W, H:B->K - - // R G B K C M Y W - uint8_t startR[NCELLS] = {255,000,000,000,000,255,255,255}; - uint8_t startG[NCELLS] = {000,255,000,000,255,000,255,255}; - uint8_t startB[NCELLS] = {000,000,255,000,255,255,000,255}; - - // K W K W W K W K - uint8_t eeendR[NCELLS] = {000,255,000,255,255,000,255,000}; - uint8_t eeendG[NCELLS] = {000,255,000,255,255,000,255,000 }; - uint8_t eeendB[NCELLS] = {000,255,000,255,255,000,255,000 }; - - for(size_t slot = 0; slot < NCELLS; ++slot) - { - int x0 = (slot % 4) * CELLW; - bool vertical = (((slot / NHCELLS) % 2) == 0) ? (slot % 2 == 0) : (slot % 2 == 1); - int y0 = static_cast(slot / NHCELLS) * CELLH; - Orthanc::ImageAccessor target; - texture->GetRegion(target, x0, y0, CELLW, CELLH); - if (vertical) - OrthancStone::PixelTestPatterns::fillWithVGradient(target, startR[slot], startG[slot], startB[slot], eeendR[slot], eeendG[slot], eeendB[slot]); - else - OrthancStone::PixelTestPatterns::fillWithHGradient(target, startR[slot], startG[slot], startB[slot], eeendR[slot], eeendG[slot], eeendB[slot]); - } - - Orthanc::PngWriter writer; -#if 0 - writer.WriteToFile("MultiGradient.png", *texture); -#else - std::string contents; - writer.WriteToMemory(contents, *texture); - - ASSERT_EQ(1u, sizeof(unsigned char)); - ASSERT_EQ(774u, sizeof(bin2c_MultiGradient_png)); - ASSERT_EQ(773u, contents.size()); - - char* resultPngBytes = &(contents[0]); - - int result = memcmp(resultPngBytes, bin2c_MultiGradient_png, 773); - ASSERT_EQ(0, result); -#endif -} - diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/SortedFramesCreateTest.py --- a/UnitTestsSources/SortedFramesCreateTest.py Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -#!/usr/bin/env python - -import pprint -import requests -import sys - -if len(sys.argv) != 2: - print('Usage: %s [Orthanc series ID]' % sys.argv[0]) - print('Example: %s 4d04593b-953ced51-87e93f11-ae4cf03c-25defdcd | xclip -selection c -t text/plain' % sys.argv[0]) - exit(-1) - -SERIES = sys.argv[1] - -r = requests.get('http://localhost:8042/series/%s/study' % SERIES) -r.raise_for_status() -print(' // From patient %s' % r.json() ['PatientMainDicomTags']['PatientName']) - -r = requests.get('http://localhost:8042/series/%s' % SERIES) -r.raise_for_status() - -first = True - -for instance in r.json() ['Instances']: - tags = requests.get('http://localhost:8042/instances/%s/tags?short' % instance) - tags.raise_for_status() - - if first: - print(''' - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "%s", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "%s", false); - OrthancStone::SortedFrames f; -''' % (tags.json() ['0020,000d'], tags.json() ['0020,000e'])) - first = False - - print(' tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "%s", false);' % instance) - - if '0020,0032' in tags.json(): - print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "%s", false);' % - tags.json() ['0020,0032'].replace('\\', '\\\\')) - - if '0020,0037' in tags.json(): - print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "%s", false);' % - tags.json() ['0020,0037'].replace('\\', '\\\\')) - - if '0020,0013' in tags.json(): - print(' tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "%s", false);' % - tags.json() ['0020,0013'].replace('\\', '\\\\')) - - if '0054,1330' in tags.json(): - print(' tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "%s", false);' % - tags.json() ['0054,1330'].replace('\\', '\\\\')) - - print(' f.AddInstance(tags);') - -print(' f.Sort();') - -r = requests.get('http://localhost:8042/series/%s/ordered-slices' % SERIES) -r.raise_for_status() -slices = r.json() ['SlicesShort'] - -print(' ASSERT_EQ(%du, f.GetFramesCount());' % len(slices)) - -for i in range(len(slices)): - print(' ASSERT_EQ(f.GetFrameSopInstanceUid(%d), "%s");' % (i, slices[i][0])) - diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/SortedFramesTests.cpp --- a/UnitTestsSources/SortedFramesTests.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,483 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include - -#include "../Framework/Toolbox/SortedFrames.h" - -#include - - -TEST(SortedFrames, Basic) -{ - OrthancStone::SortedFrames f; - ASSERT_TRUE(f.GetStudyInstanceUid().empty()); - ASSERT_TRUE(f.GetSeriesInstanceUid().empty()); - ASSERT_EQ(0u, f.GetInstancesCount()); - ASSERT_THROW(f.GetInstanceTags(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetSopInstanceUid(0), Orthanc::OrthancException); - ASSERT_TRUE(f.IsSorted()); - ASSERT_EQ(0u, f.GetFramesCount()); - ASSERT_THROW(f.GetFrameTags(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameSopInstanceUid(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameSiblingsCount(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameIndex(0), Orthanc::OrthancException); - - Orthanc::DicomMap tags; - ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); - ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); - ASSERT_THROW(f.AddInstance(tags), Orthanc::OrthancException); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop", false); - f.AddInstance(tags); - - ASSERT_EQ("study", f.GetStudyInstanceUid()); - ASSERT_EQ("series", f.GetSeriesInstanceUid()); - ASSERT_EQ(1u, f.GetInstancesCount()); - std::string s; - ASSERT_TRUE(f.GetInstanceTags(0).LookupStringValue(s, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)); - ASSERT_EQ("sop", s); - ASSERT_EQ("sop", f.GetSopInstanceUid(0)); - ASSERT_FALSE(f.IsSorted()); - ASSERT_THROW(f.GetFramesCount(), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameTags(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameSopInstanceUid(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameSiblingsCount(0), Orthanc::OrthancException); - ASSERT_THROW(f.GetFrameIndex(0), Orthanc::OrthancException); - - f.Sort(); - ASSERT_TRUE(f.IsSorted()); - ASSERT_EQ(1u, f.GetFramesCount()); - ASSERT_TRUE(f.GetFrameTags(0).LookupStringValue(s, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)); - ASSERT_EQ("sop", s); - ASSERT_EQ("sop", f.GetFrameSopInstanceUid(0)); - ASSERT_EQ(1u, f.GetFrameSiblingsCount(0)); - ASSERT_EQ(0u, f.GetFrameIndex(0)); - ASSERT_THROW(f.GetFrameTags(1), Orthanc::OrthancException); -} - - -TEST(SortedFrames, SortSopInstanceUid) -{ - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); - - OrthancStone::SortedFrames f; - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); - tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "1", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); - tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "3", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); - tags.SetValue(Orthanc::DICOM_TAG_NUMBER_OF_FRAMES, "2", false); - f.AddInstance(tags); - - f.Sort(); - ASSERT_EQ(3u, f.GetInstancesCount()); - ASSERT_EQ("sop3", f.GetSopInstanceUid(0)); - ASSERT_EQ("sop1", f.GetSopInstanceUid(1)); - ASSERT_EQ("sop2", f.GetSopInstanceUid(2)); - ASSERT_EQ(6u, f.GetFramesCount()); - ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); - ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(1u, f.GetFrameIndex(1)); - ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(2u, f.GetFrameIndex(2)); - ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); - ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(4)); ASSERT_EQ(1u, f.GetFrameIndex(4)); - ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(5)); ASSERT_EQ(0u, f.GetFrameIndex(5)); -} - - -TEST(SortedFrames, SortInstanceNumber) -{ - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); - - OrthancStone::SortedFrames f; - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "-20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2a", false); - tags.Remove(Orthanc::DICOM_TAG_INSTANCE_NUMBER); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop4", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop5", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); - f.AddInstance(tags); - - f.Sort(); - ASSERT_EQ(6u, f.GetInstancesCount()); - ASSERT_EQ("sop1", f.GetSopInstanceUid(0)); - ASSERT_EQ("sop2", f.GetSopInstanceUid(1)); - ASSERT_EQ("sop2a", f.GetSopInstanceUid(2)); - ASSERT_EQ("sop4", f.GetSopInstanceUid(3)); - ASSERT_EQ("sop3", f.GetSopInstanceUid(4)); - ASSERT_EQ("sop5", f.GetSopInstanceUid(5)); - ASSERT_EQ(6u, f.GetFramesCount()); - ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); - ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(0u, f.GetFrameIndex(1)); - ASSERT_EQ("sop4", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(0u, f.GetFrameIndex(2)); - ASSERT_EQ("sop5", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); - ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(4)); ASSERT_EQ(0u, f.GetFrameIndex(4)); - ASSERT_EQ("sop2a", f.GetFrameSopInstanceUid(5)); ASSERT_EQ(0u, f.GetFrameIndex(5)); -} - - -TEST(SortedFrames, SortInstanceNumberAndImageIndex) -{ - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); - - OrthancStone::SortedFrames f; - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop2", false); - tags.Remove(Orthanc::DICOM_TAG_INSTANCE_NUMBER); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop3", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_INDEX, "30", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop4", false); - tags.Remove(Orthanc::DICOM_TAG_IMAGE_INDEX); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "30", false); - f.AddInstance(tags); - - f.Sort(); - ASSERT_EQ(4u, f.GetInstancesCount()); - ASSERT_EQ("sop1", f.GetSopInstanceUid(0)); - ASSERT_EQ("sop2", f.GetSopInstanceUid(1)); - ASSERT_EQ("sop3", f.GetSopInstanceUid(2)); - ASSERT_EQ("sop4", f.GetSopInstanceUid(3)); - ASSERT_EQ(4u, f.GetFramesCount()); - // First instance number, then image index - ASSERT_EQ("sop1", f.GetFrameSopInstanceUid(0)); ASSERT_EQ(0u, f.GetFrameIndex(0)); - ASSERT_EQ("sop4", f.GetFrameSopInstanceUid(1)); ASSERT_EQ(0u, f.GetFrameIndex(1)); - ASSERT_EQ("sop2", f.GetFrameSopInstanceUid(2)); ASSERT_EQ(0u, f.GetFrameIndex(2)); - ASSERT_EQ("sop3", f.GetFrameSopInstanceUid(3)); ASSERT_EQ(0u, f.GetFrameIndex(3)); -} - - -TEST(SortedFrames, Knix) // Created using "SortedFramesCreateTest.py" -{ - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "1.2.840.113619.2.176.2025.1499492.7391.1171285944.390", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "1.2.840.113619.2.176.2025.1499492.7391.1171285944.392", false); - OrthancStone::SortedFrames f; - - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "67b44a5e-8997f88d-6e527bd6-df342483-dab1674c", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-60.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a8ee83f9-1cc26ad9-ebba3043-8afc47c2-bd784610", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-42.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "6", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "5a2acb03-063f5063-cac452d1-a55992f9-769900fb", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-114.729\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "22", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "23d12f39-e9a4fc21-8da338c4-97feff30-48e95534", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-83.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "15", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "16606f69-83b48518-ab34304a-c8871b7f-a9298d74", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-78.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "14", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "63d595f3-327a306d-1709bb8b-2a72e11c-4f7221fe", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-96.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "18", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8bdecadd-e3477e28-bbbf0297-22b0b680-37b13a7c", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-65.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "11", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b590cc95-55789755-ebd10b76-911e855e-f24e4fe7", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-74.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "13", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "eaa49a94-b9042041-7f45150b-e414f800-d7232874", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-38.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "5", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "6824db93-ed4e2740-07be953f-6d0a8fb3-af0a3a0b", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-105.729\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "e0d82343-9cef01e9-e21df50a-11886a94-1d0216ea", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-51.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "8", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "dc1576ee-25b0b1ef-e038df76-d296fcad-a1456169", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-110.229\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "21", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b9cf5158-06f8e713-7d5111aa-411fd75b-7be2c51e", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-20.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "5faf886f-bd5517cf-1a6ba06e-ac0e6ddb-47bdd8b2", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-101.229\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "19", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "3e8f8ec1-b603f874-825552f1-6fcac7fa-72ca1aa5", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-24.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "2", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "7a7c0120-37f6dd58-c46312e6-2559975d-5af4616f", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-87.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "16", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a0ca6802-56c697c3-0205bab8-42217cfc-84ff0de6", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-33.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "4", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "efce9ff4-3fe07d83-745846f8-fefe5d64-bfea65e6", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-56.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "9", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "fa56f961-d1ae8f6a-989c04f4-7a588e9e-b41b1a13", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-92.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "17", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "f5e889ac-c5afdc37-c5b62074-a8bdeef3-c58d9889", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-69.7285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "12", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "c19fb4b6-ad1224f2-2c3a2b28-0ea233be-38eea0de", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-47.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "7", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "348efc0a-71ee4758-56bd51fa-9703cbff-9b51d4c9", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-29.2285\\-105.586\\73.7768", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "-0\\1\\0\\-0\\-0\\-1", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "3", false); - f.AddInstance(tags); - f.Sort(); - ASSERT_EQ(22u, f.GetFramesCount()); - ASSERT_EQ(f.GetFrameSopInstanceUid(0), "b9cf5158-06f8e713-7d5111aa-411fd75b-7be2c51e"); - ASSERT_EQ(f.GetFrameSopInstanceUid(1), "3e8f8ec1-b603f874-825552f1-6fcac7fa-72ca1aa5"); - ASSERT_EQ(f.GetFrameSopInstanceUid(2), "348efc0a-71ee4758-56bd51fa-9703cbff-9b51d4c9"); - ASSERT_EQ(f.GetFrameSopInstanceUid(3), "a0ca6802-56c697c3-0205bab8-42217cfc-84ff0de6"); - ASSERT_EQ(f.GetFrameSopInstanceUid(4), "eaa49a94-b9042041-7f45150b-e414f800-d7232874"); - ASSERT_EQ(f.GetFrameSopInstanceUid(5), "a8ee83f9-1cc26ad9-ebba3043-8afc47c2-bd784610"); - ASSERT_EQ(f.GetFrameSopInstanceUid(6), "c19fb4b6-ad1224f2-2c3a2b28-0ea233be-38eea0de"); - ASSERT_EQ(f.GetFrameSopInstanceUid(7), "e0d82343-9cef01e9-e21df50a-11886a94-1d0216ea"); - ASSERT_EQ(f.GetFrameSopInstanceUid(8), "efce9ff4-3fe07d83-745846f8-fefe5d64-bfea65e6"); - ASSERT_EQ(f.GetFrameSopInstanceUid(9), "67b44a5e-8997f88d-6e527bd6-df342483-dab1674c"); - ASSERT_EQ(f.GetFrameSopInstanceUid(10), "8bdecadd-e3477e28-bbbf0297-22b0b680-37b13a7c"); - ASSERT_EQ(f.GetFrameSopInstanceUid(11), "f5e889ac-c5afdc37-c5b62074-a8bdeef3-c58d9889"); - ASSERT_EQ(f.GetFrameSopInstanceUid(12), "b590cc95-55789755-ebd10b76-911e855e-f24e4fe7"); - ASSERT_EQ(f.GetFrameSopInstanceUid(13), "16606f69-83b48518-ab34304a-c8871b7f-a9298d74"); - ASSERT_EQ(f.GetFrameSopInstanceUid(14), "23d12f39-e9a4fc21-8da338c4-97feff30-48e95534"); - ASSERT_EQ(f.GetFrameSopInstanceUid(15), "7a7c0120-37f6dd58-c46312e6-2559975d-5af4616f"); - ASSERT_EQ(f.GetFrameSopInstanceUid(16), "fa56f961-d1ae8f6a-989c04f4-7a588e9e-b41b1a13"); - ASSERT_EQ(f.GetFrameSopInstanceUid(17), "63d595f3-327a306d-1709bb8b-2a72e11c-4f7221fe"); - ASSERT_EQ(f.GetFrameSopInstanceUid(18), "5faf886f-bd5517cf-1a6ba06e-ac0e6ddb-47bdd8b2"); - ASSERT_EQ(f.GetFrameSopInstanceUid(19), "6824db93-ed4e2740-07be953f-6d0a8fb3-af0a3a0b"); - ASSERT_EQ(f.GetFrameSopInstanceUid(20), "dc1576ee-25b0b1ef-e038df76-d296fcad-a1456169"); - ASSERT_EQ(f.GetFrameSopInstanceUid(21), "5a2acb03-063f5063-cac452d1-a55992f9-769900fb"); -} - - -TEST(SortedFrames, Cardiac) // Created using "SortedFramesCreateTest.py" -{ - Orthanc::DicomMap tags; - tags.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "1.3.51.0.1.1.192.168.29.133.1681753.1681732", false); - tags.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "1.3.12.2.1107.5.2.33.37097.2012041612474981424569674.0.0.0", false); - OrthancStone::SortedFrames f; - - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "a468da62-a8a6e0b9-f66b86b0-b15fa30b-93077161", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "14", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "1cf40ac9-e823e677-cbd5db4b-9e48b451-cccbf950", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "21", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "d52d5f21-54f1ad99-4015a995-108f7210-ee157944", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "15", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "b348f629-11d59f98-fb22710b-4964b90a-f44436ff", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "12", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "aac4f2ba-e863f124-6af96709-053258a7-3d39db26", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "13", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8fefe14c-c4c34152-2c3d3514-04e75747-eb7f01f0", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "20", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "20b42f52-6d5f784b-cdbc0fbe-4bfc6b0c-5a199c75", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "17", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "931d0c36-8fbb4101-70e6d756-edb15431-aaa9a31b", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "19", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "9e3b97ec-25b86a67-2cbb8f77-94e73268-4509d383", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "10", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "caa62568-fdf894fe-08f830a2-5a468967-681d954b", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "18", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "e734c170-96b0a397-95e3b43e-d7a5ed74-025843c8", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "22", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "efc9f411-9f4294e0-66d292a1-b8b6b421-897f1d80", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "11", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8346a1db-0b08a22b-9045aaad-57098aac-5b2e9159", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "16", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "8c7d1e4d-7936f799-c4b8b56b-32d0d9a6-2b492e98", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "3", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "faec09f9-ca7fe0f0-2b25c370-bb1bfaef-8ccfa560", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "4", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "99c20bcc-115ae447-84d616f2-cb6c5576-9f67aa7a", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "23", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "7906b806-47190031-72c5043c-d42704c1-688a3b23", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "9", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "c9dfc022-7b377063-08bdc5e8-fedcc463-8de22ee6", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "6", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "6570b6c0-7d2f324d-db7cad50-843f62df-d0446352", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "5", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "0be36fe7-6c7a762b-281cf109-fff9d8ea-42e16b7a", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "7", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "ec282396-a8209d00-1c5091f3-f632bf3d-a1bcebba", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "8", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "fda415d4-f1429b07-5d1cd9f0-675059ff-c0ce9e67", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "1", false); - f.AddInstance(tags); - tags.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "f555ef96-6b01a90c-bdc2585a-dd17bb3a-75e89920", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, "-37.318577811371\\-157.20910163001\\232.94204104611", false); - tags.SetValue(Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, "0.73931693068262\\0.61320183243991\\-0.2781977510663\\-0.3521819177853\\-3.9073598e-009\\-0.9359315662938", false); - tags.SetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER, "2", false); - f.AddInstance(tags); - f.Sort(); - ASSERT_EQ(23u, f.GetFramesCount()); - ASSERT_EQ(f.GetFrameSopInstanceUid(0), "fda415d4-f1429b07-5d1cd9f0-675059ff-c0ce9e67"); - ASSERT_EQ(f.GetFrameSopInstanceUid(1), "f555ef96-6b01a90c-bdc2585a-dd17bb3a-75e89920"); - ASSERT_EQ(f.GetFrameSopInstanceUid(2), "8c7d1e4d-7936f799-c4b8b56b-32d0d9a6-2b492e98"); - ASSERT_EQ(f.GetFrameSopInstanceUid(3), "faec09f9-ca7fe0f0-2b25c370-bb1bfaef-8ccfa560"); - ASSERT_EQ(f.GetFrameSopInstanceUid(4), "6570b6c0-7d2f324d-db7cad50-843f62df-d0446352"); - ASSERT_EQ(f.GetFrameSopInstanceUid(5), "c9dfc022-7b377063-08bdc5e8-fedcc463-8de22ee6"); - ASSERT_EQ(f.GetFrameSopInstanceUid(6), "0be36fe7-6c7a762b-281cf109-fff9d8ea-42e16b7a"); - ASSERT_EQ(f.GetFrameSopInstanceUid(7), "ec282396-a8209d00-1c5091f3-f632bf3d-a1bcebba"); - ASSERT_EQ(f.GetFrameSopInstanceUid(8), "7906b806-47190031-72c5043c-d42704c1-688a3b23"); - ASSERT_EQ(f.GetFrameSopInstanceUid(9), "9e3b97ec-25b86a67-2cbb8f77-94e73268-4509d383"); - ASSERT_EQ(f.GetFrameSopInstanceUid(10), "efc9f411-9f4294e0-66d292a1-b8b6b421-897f1d80"); - ASSERT_EQ(f.GetFrameSopInstanceUid(11), "b348f629-11d59f98-fb22710b-4964b90a-f44436ff"); - ASSERT_EQ(f.GetFrameSopInstanceUid(12), "aac4f2ba-e863f124-6af96709-053258a7-3d39db26"); - ASSERT_EQ(f.GetFrameSopInstanceUid(13), "a468da62-a8a6e0b9-f66b86b0-b15fa30b-93077161"); - ASSERT_EQ(f.GetFrameSopInstanceUid(14), "d52d5f21-54f1ad99-4015a995-108f7210-ee157944"); - ASSERT_EQ(f.GetFrameSopInstanceUid(15), "8346a1db-0b08a22b-9045aaad-57098aac-5b2e9159"); - ASSERT_EQ(f.GetFrameSopInstanceUid(16), "20b42f52-6d5f784b-cdbc0fbe-4bfc6b0c-5a199c75"); - ASSERT_EQ(f.GetFrameSopInstanceUid(17), "caa62568-fdf894fe-08f830a2-5a468967-681d954b"); - ASSERT_EQ(f.GetFrameSopInstanceUid(18), "931d0c36-8fbb4101-70e6d756-edb15431-aaa9a31b"); - ASSERT_EQ(f.GetFrameSopInstanceUid(19), "8fefe14c-c4c34152-2c3d3514-04e75747-eb7f01f0"); - ASSERT_EQ(f.GetFrameSopInstanceUid(20), "1cf40ac9-e823e677-cbd5db4b-9e48b451-cccbf950"); - ASSERT_EQ(f.GetFrameSopInstanceUid(21), "e734c170-96b0a397-95e3b43e-d7a5ed74-025843c8"); - ASSERT_EQ(f.GetFrameSopInstanceUid(22), "99c20bcc-115ae447-84d616f2-cb6c5576-9f67aa7a"); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/TestCommands.cpp --- a/UnitTestsSources/TestCommands.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include - -//#include "../Applications/Commands/BaseCommandFactory.h" -//#include "OrthancException.h" - -//class CommandIncrement: public OrthancStone::BaseCommand -//{ -//public: -// static int counter; -// int increment_; -//public: -// CommandIncrement() -// : OrthancStone::BaseCommand("increment"), -// increment_(0) -// {} - -// virtual void Execute() -// { -// counter += increment_; -// } -// virtual void Configure(const Json::Value& arguments) -// { -// increment_ = arguments["increment"].asInt(); -// } -//}; - -//// COMMAND("name", "arg1", "int", "arg2", "string") -//// COMMAND(name, arg1, arg2) - - -//int CommandIncrement::counter = 0; - -//TEST(Commands, CreateNoop) -//{ -// OrthancStone::BaseCommandFactory factory; - -// factory.RegisterCommandClass(); - -// Json::Value cmdJson; -// cmdJson["command"] = "noop"; - -// std::unique_ptr command(factory.CreateFromJson(cmdJson)); - -// ASSERT_TRUE(command.get() != NULL); -// ASSERT_EQ("noop", command->GetName()); -//} - -//TEST(Commands, Execute) -//{ -// OrthancStone::BaseCommandFactory factory; - -// factory.RegisterCommandClass(); -// factory.RegisterCommandClass(); - -// Json::Value cmdJson; -// cmdJson["command"] = "increment"; -// cmdJson["args"]["increment"] = 2; - -// std::unique_ptr command(factory.CreateFromJson(cmdJson)); - -// ASSERT_TRUE(command.get() != NULL); -// CommandIncrement::counter = 0; -// command->Execute(); -// ASSERT_EQ(2, CommandIncrement::counter); -//} - -//TEST(Commands, TryCreateUnknowCommand) -//{ -// OrthancStone::BaseCommandFactory factory; -// factory.RegisterCommandClass(); - -// Json::Value cmdJson; -// cmdJson["command"] = "unknown"; - -// ASSERT_THROW(std::unique_ptr command(factory.CreateFromJson(cmdJson)), Orthanc::OrthancException); -//} - -//TEST(Commands, TryCreateCommandFromInvalidJson) -//{ -// OrthancStone::BaseCommandFactory factory; -// factory.RegisterCommandClass(); - -// Json::Value cmdJson; -// cmdJson["command-name"] = "noop"; - -// ASSERT_THROW(std::unique_ptr command(factory.CreateFromJson(cmdJson)), Orthanc::OrthancException); -//} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/TestMessageBroker.cpp --- a/UnitTestsSources/TestMessageBroker.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include - -#include "../Framework/Messages/IObservable.h" -#include "../Framework/Messages/ObserverBase.h" - - -int testCounter = 0; -namespace { - - using namespace OrthancStone; - - - class MyObservable : public IObservable - { - public: - struct MyCustomMessage : public IMessage - { - ORTHANC_STONE_MESSAGE(__FILE__, __LINE__); - - int payload_; - - MyCustomMessage(int payload) : - payload_(payload) - { - } - }; - }; - - class MyObserver : public ObserverBase - { - public: - void HandleCompletedMessage(const MyObservable::MyCustomMessage& message) - { - testCounter += message.payload_; - } - }; -} - - -TEST(MessageBroker, TestPermanentConnectionSimpleUseCase) -{ - MyObservable observable; - boost::shared_ptr observer(new MyObserver); - - // create a permanent connection between an observable and an observer - observer->Register(observable, &MyObserver::HandleCompletedMessage); - - testCounter = 0; - observable.BroadcastMessage(MyObservable::MyCustomMessage(12)); - ASSERT_EQ(12, testCounter); - - // the connection is permanent; if we emit the same message again, the observer will be notified again - testCounter = 0; - observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); - ASSERT_EQ(20, testCounter); - - // Unregister the observer; make sure it's not called anymore - observer.reset(); - testCounter = 0; - observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); - ASSERT_EQ(0, testCounter); -} - -TEST(MessageBroker, TestPermanentConnectionDeleteObserver) -{ - MyObservable observable; - boost::shared_ptr observer(new MyObserver); - - // create a permanent connection between an observable and an observer - observer->Register(observable, &MyObserver::HandleCompletedMessage); - - testCounter = 0; - observable.BroadcastMessage(MyObservable::MyCustomMessage(12)); - ASSERT_EQ(12, testCounter); - - // delete the observer and check that the callback is not called anymore - observer.reset(); - - // the connection is permanent; if we emit the same message again, the observer will be notified again - testCounter = 0; - observable.BroadcastMessage(MyObservable::MyCustomMessage(20)); - ASSERT_EQ(0, testCounter); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/TestStrategy.cpp --- a/UnitTestsSources/TestStrategy.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,391 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include - -#include "../Framework/Loaders/BasicFetchingStrategy.h" -#include "../Framework/Loaders/BasicFetchingItemsSorter.h" - -#include - - -namespace -{ - class StrategyTester : public boost::noncopyable - { - private: - std::map qualities_; - - public: - bool IsValidCommand(unsigned int item, - unsigned int quality) - { - if (qualities_.find(item) != qualities_.end() && - qualities_[item] >= quality) - { - return false; - } - else - { - qualities_[item] = quality; - return true; - } - } - - bool HasFinished(OrthancStone::BasicFetchingStrategy& strategy) - { - for (unsigned int i = 0; i < strategy.GetItemsCount(); i++) - { - if (qualities_.find(i) == qualities_.end() || - qualities_[i] != strategy.GetMaxQuality()) - { - return false; - } - } - - return true; - } - }; -} - - -TEST(BasicFetchingStrategy, Test1) -{ - ASSERT_THROW(OrthancStone::BasicFetchingStrategy(NULL, 0), Orthanc::OrthancException); - ASSERT_THROW(OrthancStone::BasicFetchingStrategy(new OrthancStone::BasicFetchingItemsSorter(0), 0), Orthanc::OrthancException); - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(1), 0); - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(1), 5); - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(5u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(2), 2); - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(3), 2); - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(1u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(2u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(3), 2); - s.SetBlockSize(1); - s.SetCurrent(0); - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(2u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(1u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(2u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(1u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(2u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(5), 0); - ASSERT_THROW(s.SetCurrent(5), Orthanc::OrthancException); - s.SetCurrent(2); - - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(3u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(4u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } - - { - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(5), 0); - s.SetCurrent(4); - - unsigned int i, q; - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(4u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(3u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(2u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(1u, i); ASSERT_EQ(0u, q); - ASSERT_TRUE(s.GetNext(i, q)); ASSERT_EQ(0u, i); ASSERT_EQ(0u, q); - ASSERT_FALSE(s.GetNext(i, q)); - } -} - - -TEST(BasicFetchingStrategy, Test2) -{ - OrthancStone::BasicFetchingStrategy s(new OrthancStone::BasicFetchingItemsSorter(20), 2); - ASSERT_EQ(20u, s.GetItemsCount()); - ASSERT_EQ(2u, s.GetMaxQuality()); - - StrategyTester t; - - s.SetCurrent(10); - - unsigned int i, q; - while (s.GetNext(i, q)) - { - ASSERT_TRUE(t.IsValidCommand(i, q)); - } - - ASSERT_TRUE(t.HasFinished(s)); -} - - - - -TEST(BasicFetchingItemsSorter, Small) -{ - ASSERT_THROW(OrthancStone::BasicFetchingItemsSorter(0), Orthanc::OrthancException); - std::vector v; - - { - OrthancStone::BasicFetchingItemsSorter s(1); - s.Sort(v, 0); - ASSERT_EQ(1u, v.size()); - ASSERT_EQ(0u, v[0]); - - ASSERT_THROW(s.Sort(v, 1), Orthanc::OrthancException); - } - - { - OrthancStone::BasicFetchingItemsSorter s(2); - s.Sort(v, 0); - ASSERT_EQ(2u, v.size()); - ASSERT_EQ(0u, v[0]); - ASSERT_EQ(1u, v[1]); - - s.Sort(v, 1); - ASSERT_EQ(2u, v.size()); - ASSERT_EQ(1u, v[0]); - ASSERT_EQ(0u, v[1]); - - ASSERT_THROW(s.Sort(v, 2), Orthanc::OrthancException); - } - - { - OrthancStone::BasicFetchingItemsSorter s(3); - s.Sort(v, 0); - ASSERT_EQ(3u, v.size()); - ASSERT_EQ(0u, v[0]); - ASSERT_EQ(1u, v[1]); - ASSERT_EQ(2u, v[2]); - - s.Sort(v, 1); - ASSERT_EQ(3u, v.size()); - ASSERT_EQ(1u, v[0]); - ASSERT_EQ(2u, v[1]); - ASSERT_EQ(0u, v[2]); - - s.Sort(v, 2); - ASSERT_EQ(3u, v.size()); - ASSERT_EQ(2u, v[0]); - ASSERT_EQ(1u, v[1]); - ASSERT_EQ(0u, v[2]); - - ASSERT_THROW(s.Sort(v, 3), Orthanc::OrthancException); - } -} - - -TEST(BasicFetchingItemsSorter, Odd) -{ - OrthancStone::BasicFetchingItemsSorter s(7); - std::vector v; - - ASSERT_THROW(s.Sort(v, 7), Orthanc::OrthancException); - - { - s.Sort(v, 0); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(0u, v[0]); - ASSERT_EQ(1u, v[1]); - ASSERT_EQ(2u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(4u, v[4]); - ASSERT_EQ(5u, v[5]); - ASSERT_EQ(6u, v[6]); - } - - { - s.Sort(v, 1); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(1u, v[0]); - ASSERT_EQ(2u, v[1]); - ASSERT_EQ(0u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(4u, v[4]); - ASSERT_EQ(5u, v[5]); - ASSERT_EQ(6u, v[6]); - } - - { - s.Sort(v, 2); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(2u, v[0]); - ASSERT_EQ(3u, v[1]); - ASSERT_EQ(1u, v[2]); - ASSERT_EQ(4u, v[3]); - ASSERT_EQ(0u, v[4]); - ASSERT_EQ(5u, v[5]); - ASSERT_EQ(6u, v[6]); - } - - { - s.Sort(v, 3); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(3u, v[0]); - ASSERT_EQ(4u, v[1]); - ASSERT_EQ(2u, v[2]); - ASSERT_EQ(5u, v[3]); - ASSERT_EQ(1u, v[4]); - ASSERT_EQ(6u, v[5]); - ASSERT_EQ(0u, v[6]); - } - - { - s.Sort(v, 4); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(4u, v[0]); - ASSERT_EQ(5u, v[1]); - ASSERT_EQ(3u, v[2]); - ASSERT_EQ(6u, v[3]); - ASSERT_EQ(2u, v[4]); - ASSERT_EQ(1u, v[5]); - ASSERT_EQ(0u, v[6]); - } - - { - s.Sort(v, 5); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(5u, v[0]); - ASSERT_EQ(6u, v[1]); - ASSERT_EQ(4u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(2u, v[4]); - ASSERT_EQ(1u, v[5]); - ASSERT_EQ(0u, v[6]); - } - - { - s.Sort(v, 6); - ASSERT_EQ(7u, v.size()); - ASSERT_EQ(6u, v[0]); - ASSERT_EQ(5u, v[1]); - ASSERT_EQ(4u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(2u, v[4]); - ASSERT_EQ(1u, v[5]); - ASSERT_EQ(0u, v[6]); - } -} - - -TEST(BasicFetchingItemsSorter, Even) -{ - OrthancStone::BasicFetchingItemsSorter s(6); - std::vector v; - - { - s.Sort(v, 0); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(0u, v[0]); - ASSERT_EQ(1u, v[1]); - ASSERT_EQ(2u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(4u, v[4]); - ASSERT_EQ(5u, v[5]); - } - - { - s.Sort(v, 1); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(1u, v[0]); - ASSERT_EQ(2u, v[1]); - ASSERT_EQ(0u, v[2]); - ASSERT_EQ(3u, v[3]); - ASSERT_EQ(4u, v[4]); - ASSERT_EQ(5u, v[5]); - } - - { - s.Sort(v, 2); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(2u, v[0]); - ASSERT_EQ(3u, v[1]); - ASSERT_EQ(1u, v[2]); - ASSERT_EQ(4u, v[3]); - ASSERT_EQ(0u, v[4]); - ASSERT_EQ(5u, v[5]); - } - - { - s.Sort(v, 3); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(3u, v[0]); - ASSERT_EQ(4u, v[1]); - ASSERT_EQ(2u, v[2]); - ASSERT_EQ(5u, v[3]); - ASSERT_EQ(1u, v[4]); - ASSERT_EQ(0u, v[5]); - } - - { - s.Sort(v, 4); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(4u, v[0]); - ASSERT_EQ(5u, v[1]); - ASSERT_EQ(3u, v[2]); - ASSERT_EQ(2u, v[3]); - ASSERT_EQ(1u, v[4]); - ASSERT_EQ(0u, v[5]); - } - - { - s.Sort(v, 5); - ASSERT_EQ(6u, v.size()); - ASSERT_EQ(5u, v[0]); - ASSERT_EQ(4u, v[1]); - ASSERT_EQ(3u, v[2]); - ASSERT_EQ(2u, v[3]); - ASSERT_EQ(1u, v[4]); - ASSERT_EQ(0u, v[5]); - } -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/TestStructureSet.cpp --- a/UnitTestsSources/TestStructureSet.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5770 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - -// working around a bug where the Visual C++ compiler would get -// stuck trying to compile this cpp file in release mode -// (versions: https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B) -#ifdef _MSC_VER -# pragma optimize("", off) -// warning C4748: /GS can not protect parameters and local variables from -// local buffer overrun because optimizations are disabled in function -# pragma warning(disable: 4748) -#endif - -#include "../Framework/Loaders/DicomStructureSetLoader.h" -#include "../Framework/Loaders/GenericLoadersContext.h" -#include "../Framework/Loaders/OrthancSeriesVolumeProgressiveLoader.h" -#include "../Framework/Toolbox/DicomStructureSet2.h" -#include "../Framework/Toolbox/DicomStructureSetUtils.h" -#include "../Framework/Toolbox/DisjointDataSet.h" - -#include -#include - -#include - -#include -#include - -using namespace Orthanc; -using namespace OrthancStone; - -/* -The following string is the reply to the following Orthanc request: - -http://localhost:8042/instances/1aa5f84b-c32a03b4-3c1857da-da2e69f3-3ef6e2b3/tags?ignore-length=3006-0050 - -The tag hierarchy can be found here: https://dicom.innolitics.com/ciods/rt-dose -*/ - -const double DELTA_MAX = 10.0 * std::numeric_limits::epsilon(); - -#ifdef _MSC_VER -#pragma region BigJsonString -#endif -// _MSC_VER -const char* k_rtStruct_json00 = -"{\n" -" \"0008,0005\" : {\n" -" \"Name\" : \"SpecificCharacterSet\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ISO_IR 100\"\n" -" },\n" -" \"0008,0012\" : {\n" -" \"Name\" : \"InstanceCreationDate\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20190318\"\n" -" },\n" -" \"0008,0013\" : {\n" -" \"Name\" : \"InstanceCreationTime\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"182529\"\n" -" },\n" -" \"0008,0016\" : {\n" -" \"Name\" : \"SOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.481.3\"\n" -" },\n" -" \"0008,0018\" : {\n" -" \"Name\" : \"SOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3500.4285482120751\"\n" -" },\n" -" \"0008,0020\" : {\n" -" \"Name\" : \"StudyDate\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20190225\"\n" -" },\n" -" \"0008,0030\" : {\n" -" \"Name\" : \"StudyTime\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"135152\"\n" -" },\n" -" \"0008,0050\" : {\n" -" \"Name\" : \"AccessionNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"897154\"\n" -" },\n" -" \"0008,0060\" : {\n" -" \"Name\" : \"Modality\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"RTSTRUCT\"\n" -" },\n" -" \"0008,0070\" : {\n" -" \"Name\" : \"Manufacturer\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"RaySearch Laboratories\"\n" -" },\n" -" \"0008,0090\" : {\n" -" \"Name\" : \"ReferringPhysicianName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" },\n" -" \"0008,1030\" : {\n" -" \"Name\" : \"StudyDescription\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CT ohne KM\"\n" -" },\n" -" \"0008,103e\" : {\n" -" \"Name\" : \"SeriesDescription\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"RS: Approved Structure Set\"\n" -" },\n" -" \"0008,1070\" : {\n" -" \"Name\" : \"OperatorsName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" },\n" -" \"0008,1090\" : {\n" -" \"Name\" : \"ManufacturerModelName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"RayStation\"\n" -" },\n" -" \"0010,0010\" : {\n" -" \"Name\" : \"PatientName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Karamazov^Serge\"\n" -" },\n" -" \"0010,0020\" : {\n" -" \"Name\" : \"PatientID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"66498\"\n" -" },\n" -" \"0010,0030\" : {\n" -" \"Name\" : \"PatientBirthDate\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"19630511\"\n" -" },\n" -" \"0010,0040\" : {\n" -" \"Name\" : \"PatientSex\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"F\"\n" -" },\n" -" \"0018,1020\" : {\n" -" \"Name\" : \"SoftwareVersions\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7.0.0.19 (Dicom Export)\"\n" -" },\n" -" \"0020,000d\" : {\n" -" \"Name\" : \"StudyInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.113854.1977802846882851650617130240362685394\"\n" -" },\n" -" \"0020,000e\" : {\n" -" \"Name\" : \"SeriesInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3582165\"\n" -" },\n" -" \"0020,0010\" : {\n" -" \"Name\" : \"StudyID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"467\"\n" -" },\n" -" \"0020,0011\" : {\n" -" \"Name\" : \"SeriesNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"0020,0052\" : {\n" -" \"Name\" : \"FrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965689415626\"\n" -" },\n" -" \"0020,1040\" : {\n" -" \"Name\" : \"PositionReferenceIndicator\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" },\n" -" \"3006,0002\" : {\n" -" \"Name\" : \"StructureSetLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"RS: Approved\"\n" -" },\n" -" \"3006,0008\" : {\n" -" \"Name\" : \"StructureSetDate\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20190318\"\n" -" },\n" -" \"3006,0009\" : {\n" -" \"Name\" : \"StructureSetTime\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"182529\"\n" -" },\n" -" \"3006,0010\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0020,0052\" : {\n" -" \"Name\" : \"FrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.47019656894156\"\n" -" },\n" -" \"3006,0012\" : {\n" -" \"Name\" : \"RTReferencedStudySequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.3.1.2.3.1\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.113854.1977802846882851650617130240362685\"\n" -" },\n" -" \"3006,0014\" : {\n" -" \"Name\" : \"RTReferencedSeriesSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0020,000e\" : {\n" -" \"Name\" : \"SeriesInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.752.243.1.1.20190318182529549.3582165\"\n" -" },\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" -" }\n" -" },\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" -" }\n" -" }\n" -" ]\n" -" }\n" -" }\n" -" ]\n" -" }\n" -" }\n" -" ]\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0020\" : {\n" -" \"Name\" : \"StructureSetROISequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"LN300\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Cortical Bone\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Adipose\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CB2-50%\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Water\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"External\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0022\" : {\n" -" \"Name\" : \"ROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11\"\n" -" },\n" -" \"3006,0024\" : {\n" -" \"Name\" : \"ReferencedFrameOfReferenceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699677866819900002.4701965682522348054\"\n" -" },\n" -" \"3006,0026\" : {\n" -" \"Name\" : \"ROIName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"PTV\"\n" -" },\n" -" \"3006,0036\" : {\n" -" \"Name\" : \"ROIGenerationAlgorithm\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"SEMIAUTOMATIC\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0039\" : {\n" -" \"Name\" : \"ROIContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"255\\\\0\\\\0\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7.657838\\\\108.2725\\\\304.01\\\\6.826687\\\\107.4413\\\\304.01\\\\6.152492\\\\106.4785\\\\304.01\\\\5.655735\\\\105.4132\\\\304.01\\\\5.351513\\\\104.2778\\\\304.01\\\\5.249068\\\\103.1069\\\\304.01\\\\5.351513\\\\101.9359\\\\304.01\\\\5.655735\\\\100.8005\\\\304.01\\\\6.152492\\\\99.73524\\\\304.01\\\\6.826687\\\\98.77239\\\\304.01\\\\7.657838\\\\97.94124\\\\304.01\\\\8.620689\\\\97.26704\\\\304.01\\\\9.685987\\\\96.77029\\\\304.01\\\\10.82136\\\\96.46606\\\\304.01\\\\11.99231\\\\96.36362\\\\304.01\\\\13.16326\\\\96.46606\\\\304.01\\\\14.29864\\\\96.77029\\\\304.01\\\\15.36393\\\\97.26704\\\\304.01\\\\16.32678\\\\97.94124\\\\304.01\\\\17.15794\\\\98.77239\\\\304.01\\\\17.83213\\\\99.73524\\\\304.01\\\\18.32889\\\\100.8005\\\\304.01\\\\18.63311\\\\101.9359\\\\304.01\\\\18.73555\\\\103.1069\\\\304.01\\\\18.63311\\\\104.2778\\\\304.01\\\\18.32889\\\\105.4132\\\\304.01\\\\17.83213\\\\106.4785\\\\304.01\\\\17.15794\\\\107.4413\\\\304.01\\\\16.32678\\\\108.2725\\\\304.01\\\\15.36393\\\\108.9467\\\\304.01\\\\14.29864\\\\109.4434\\\\304.01\\\\13.16326\\\\109.7477\\\\304.01\\\\11.99231\\\\109.8501\\\\304.01\\\\10.82136\\\\109.7477\\\\304.01\\\\9.685987\\\\109.4434\\\\304.01\\\\8.620689\\\\108.9467\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7.657838\\\\108.2725\\\\307.01\\\\6.826687\\\\107.4413\\\\307.01\\\\6.152492\\\\106.4785\\\\307.01\\\\5.655735\\\\105.4132\\\\307.01\\\\5.351513\\\\104.2778\\\\307.01\\\\5.249068\\\\103.1069\\\\307.01\\\\5.351513\\\\101.9359\\\\307.01\\\\5.655735\\\\100.8005\\\\307.01\\\\6.152492\\\\99.73524\\\\307.01\\\\6.826687\\\\98.77239\\\\307.01\\\\7.657838\\\\97.94124\\\\307.01\\\\8.620689\\\\97.26704\\\\307.01\\\\9.685987\\\\96.77029\\\\307.01\\\\10.82136\\\\96.46606\\\\307.01\\\\11.99231\\\\96.36362\\\\307.01\\\\13.16326\\\\96.46606\\\\307.01\\\\14.29864\\\\96.77029\\\\307.01\\\\15.36393\\\\97.26704\\\\307.01\\\\16.32678\\\\97.94124\\\\307.01\\\\17.15794\\\\98.77239\\\\307.01\\\\17.83213\\\\99.73524\\\\307.01\\\\18.32889\\\\100.8005\\\\307.01\\\\18.63311\\\\101.9359\\\\307.01\\\\18.73555\\\\103.1069\\\\307.01\\\\18.63311\\\\104.2778\\\\307.01\\\\18.32889\\\\105.4132\\\\307.01\\\\17.83213\\\\106.4785\\\\307.01\\\\17.15794\\\\107.4413\\\\307.01\\\\16.32678\\\\108.2725\\\\307.01\\\\15.36393\\\\108.9467\\\\307.01\\\\14.29864\\\\109.4434\\\\307.01\\\\13.16326\\\\109.7477\\\\307.01\\\\11.99231\\\\109.8501\\\\307.01\\\\10.82136\\\\109.7477\\\\307.01\\\\9.685987\\\\109.4434\\\\307.01\\\\8.620689\\\\108.9467\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7.657838\\\\108.2725\\\\310.01\\\\6.826687\\\\107.4413\\\\310.01\\\\6.152492\\\\106.4785\\\\310.01\\\\5.655735\\\\105.4132\\\\310.01\\\\5.351513\\\\104.2778\\\\310.01\\\\5.249068\\\\103.1069\\\\310.01\\\\5.351513\\\\101.9359\\\\310.01\\\\5.655735\\\\100.8005\\\\310.01\\\\6.152492\\\\99.73524\\\\310.01\\\\6.826687\\\\98.77239\\\\310.01\\\\7.657838\\\\97.94124\\\\310.01\\\\8.620689\\\\97.26704\\\\310.01\\\\9.685987\\\\96.77029\\\\310.01\\\\10.82136\\\\96.46606\\\\310.01\\\\11.99231\\\\96.36362\\\\310.01\\\\13.16326\\\\96.46606\\\\310.01\\\\14.29864\\\\96.77029\\\\310.01\\\\15.36393\\\\97.26704\\\\310.01\\\\16.32678\\\\97.94124\\\\310.01\\\\17.15794\\\\98.77239\\\\310.01\\\\17.83213\\\\99.73524\\\\310.01\\\\18.32889\\\\100.8005\\\\310.01\\\\18.63311\\\\101.9359\\\\310.01\\\\18.73555\\\\103.1069\\\\310.01\\\\18.63311\\\\104.2778\\\\310.01\\\\18.32889\\\\105.4132\\\\310.01\\\\17.83213\\\\106.4785\\\\310.01\\\\17.15794\\\\107.4413\\\\310.01\\\\16.32678\\\\108.2725\\\\310.01\\\\15.36393\\\\108.9467\\\\310.01\\\\14.29864\\\\109.4434\\\\310.01\\\\13.16326\\\\109.7477\\\\310.01\\\\11.99231\\\\109.8501\\\\310.01\\\\10.82136\\\\109.7477\\\\310.01\\\\9.685987\\\\109.4434\\\\310.01\\\\8.620689\\\\108.9467\\\\310.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\\\\255\\\\255\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-37.967\\\\161.9664\\\\304.01\\\\-39.10237\\\\161.6622\\\\304.01\\\\-40.16767\\\\161.1655\\\\304.01\\\\-41.13052\\\\160.4913\\\\304.01\\\\-41.96167\\\\159.6601\\\\304.01\\\\-42.63587\\\\158.6973\\\\304.01\\\\-43.13263\\\\157.632\\\\304.01\\\\-43.43685\\\\156.4966\\\\304.01\\\\-43.53929\\\\155.3257\\\\304.01\\\\-43.43685\\\\154.1547\\\\304.01\\\\-43.13263\\\\153.0193\\\\304.01\\\\-42.63587\\\\151.954\\\\304.01\\\\-41.96167\\\\150.9912\\\\304.01\\\\-41.13052\\\\150.16\\\\304.01\\\\-40.16767\\\\149.4858\\\\304.01\\\\-39.10237\\\\148.9891\\\\304.01\\\\-37.967\\\\148.6849\\\\304.01\\\\-36.79605\\\\148.5824\\\\304.01\\\\-35.6251\\\\148.6849\\\\304.01\\\\-34.48972\\\\148.9891\\\\304.01\\\\-33.42443\\\\149.4858\\\\304.01\\\\-32.46157\\\\150.16\\\\304.01\\\\-31.63042\\\\150.9912\\\\304.01\\\\-30.95623\\\\151.954\\\\304.01\\\\-30.45947\\\\153.0193\\\\304.01\\\\-30.15525\\\\154.1547\\\\304.01\\\\-30.0528\\\\155.3257\\\\304.01\\\\-30.15525\\\\156.4966\\\\304.01\\\\-30.45947\\\\157.632\\\\304.01\\\\-30.95623\\\\158.6973\\\\304.01\\\\-31.63042\\\\159.6601\\\\304.01\\\\-32.46157\\\\160.4913\\\\304.01\\\\-33.42443\\\\161.1655\\\\304.01\\\\-34.48972\\\\161.6622\\\\304.01\\\\-35.6251\\\\161.9664\\\\304.01\\\\-36.79605\\\\162.0689\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-37.967\\\\161.9664\\\\307.01\\\\-39.10237\\\\161.6622\\\\307.01\\\\-40.16767\\\\161.1655\\\\307.01\\\\-41.13052\\\\160.4913\\\\307.01\\\\-41.96167\\\\159.6601\\\\307.01\\\\-42.63587\\\\158.6973\\\\307.01\\\\-43.13263\\\\157.632\\\\307.01\\\\-43.43685\\\\156.4966\\\\307.01\\\\-43.53929\\\\155.3257\\\\307.01\\\\-43.43685\\\\154.1547\\\\307.01\\\\-43.13263\\\\153.0193\\\\307.01\\\\-42.63587\\\\151.954\\\\307.01\\\\-41.96167\\\\150.9912\\\\307.01\\\\-41.13052\\\\150.16\\\\307.01\\\\-40.16767\\\\149.4858\\\\307.01\\\\-39.10237\\\\148.9891\\\\307.01\\\\-37.967\\\\148.6849\\\\307.01\\\\-36.79605\\\\148.5824\\\\307.01\\\\-35.6251\\\\148.6849\\\\307.01\\\\-34.48972\\\\148.9891\\\\307.01\\\\-33.42443\\\\149.4858\\\\307.01\\\\-32.46157\\\\150.16\\\\307.01\\\\-31.63042\\\\150.9912\\\\307.01\\\\-30.95623\\\\151.954\\\\307.01\\\\-30.45947\\\\153.0193\\\\307.01\\\\-30.15525\\\\154.1547\\\\307.01\\\\-30.0528\\\\155.3257\\\\307.01\\\\-30.15525\\\\156.4966\\\\307.01\\\\-30.45947\\\\157.632\\\\307.01\\\\-30.95623\\\\158.6973\\\\307.01\\\\-31.63042\\\\159.6601\\\\307.01\\\\-32.46157\\\\160.4913\\\\307.01\\\\-33.42443\\\\161.1655\\\\307.01\\\\-34.48972\\\\161.6622\\\\307.01\\\\-35.6251\\\\161.9664\\\\307.01\\\\-36.79605\\\\162.0689\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-37.967\\\\161.9664\\\\310.01\\\\-39.10237\\\\161.6622\\\\310.01\\\\-40.16767\\\\161.1655\\\\310.01\\\\-41.13052\\\\160.4913\\\\310.01\\\\-41.96167\\\\159.6601\\\\310.01\\\\-42.63587\\\\158.6973\\\\310.01\\\\-43.13263\\\\157.632\\\\310.01\\\\-43.43685\\\\156.4966\\\\310.01\\\\-43.53929\\\\155.3257\\\\310.01\\\\-43.43685\\\\154.1547\\\\310.01\\\\-43.13263\\\\153.0193\\\\310.01\\\\-42.63587\\\\151.954\\\\310.01\\\\-41.96167\\\\150.9912\\\\310.01\\\\-41.13052\\\\150.16\\\\310.01\\\\-40.16767\\\\149.4858\\\\310.01\\\\-39.10237\\\\148.9891\\\\310.01\\\\-37.967\\\\148.6849\\\\310.01\\\\-36.79605\\\\148.5824\\\\310.01\\\\-35.6251\\\\148.6849\\\\310.01\\\\-34.48972\\\\148.9891\\\\310.01\\\\-33.42443\\\\149.4858\\\\310.01\\\\-32.46157\\\\150.16\\\\310.01\\\\-31.63042\\\\150.9912\\\\310.01\\\\-30.95623\\\\151.954\\\\310.01\\\\-30.45947\\\\153.0193\\\\310.01\\\\-30.15525\\\\154.1547\\\\310.01\\\\-30.0528\\\\155.3257\\\\310.01\\\\-30.15525\\\\156.4966\\\\310.01\\\\-30.45947\\\\157.632\\\\310.01\\\\-30.95623\\\\158.6973\\\\310.01\\\\-31.63042\\\\159.6601\\\\310.01\\\\-32.46157\\\\160.4913\\\\310.01\\\\-33.42443\\\\161.1655\\\\310.01\\\\-34.48972\\\\161.6622\\\\310.01\\\\-35.6251\\\\161.9664\\\\310.01\\\\-36.79605\\\\162.0689\\\\310.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"255\\\\0\\\\255\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"69.4042\\\\150.7324\\\\304.01\\\\69.70842\\\\151.8678\\\\304.01\\\\69.81087\\\\153.0387\\\\304.01\\\\69.70842\\\\154.2097\\\\304.01\\\\69.4042\\\\155.345\\\\304.01\\\\68.90745\\\\156.4103\\\\304.01\\\\68.23325\\\\157.3732\\\\304.01\\\\67.4021\\\\158.2043\\\\304.01\\\\66.43925\\\\158.8785\\\\304.01\\\\65.37395\\\\159.3753\\\\304.01\\\\64.23858\\\\159.6795\\\\304.01\\\\63.06762\\\\159.7819\\\\304.01\\\\61.89667\\\\159.6795\\\\304.01\\\\60.7613\\\\159.3753\\\\304.01\\\\59.696\\\\158.8785\\\\304.01\\\\58.73315\\\\158.2043\\\\304.01\\\\57.902\\\\157.3732\\\\304.01\\\\57.22781\\\\156.4103\\\\304.01\\\\56.73105\\\\155.345\\\\304.01\\\\56.42683\\\\154.2097\\\\304.01\\\\56.32438\\\\153.0387\\\\304.01\\\\56.42683\\\\151.8678\\\\304.01\\\\56.73105\\\\150.7324\\\\304.01\\\\57.22781\\\\149.6671\\\\304.01\\\\57.902\\\\148.7042\\\\304.01\\\\58.73315\\\\147.8731\\\\304.01\\\\59.696\\\\147.1989\\\\304.01\\\\60.7613\\\\146.7021\\\\304.01\\\\61.89667\\\\146.3979\\\\304.01\\\\63.06762\\\\146.2955\\\\304.01\\\\64.23858\\\\146.3979\\\\304.01\\\\65.37395\\\\146.7021\\\\304.01\\\\66.43925\\\\147.1989\\\\304.01\\\\67.4021\\\\147.8731\\\\304.01\\\\68.23325\\\\148.7042\\\\304.01\\\\68.90745\\\\149.6671\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"69.4042\\\\150.7324\\\\307.01\\\\69.70842\\\\151.8678\\\\307.01\\\\69.81087\\\\153.0387\\\\307.01\\\\69.70842\\\\154.2097\\\\307.01\\\\69.4042\\\\155.345\\\\307.01\\\\68.90745\\\\156.4103\\\\307.01\\\\68.23325\\\\157.3732\\\\307.01\\\\67.4021\\\\158.2043\\\\307.01\\\\66.43925\\\\158.8785\\\\307.01\\\\65.37395\\\\159.3753\\\\307.01\\\\64.23858\\\\159.6795\\\\307.01\\\\63.06762\\\\159.7819\\\\307.01\\\\61.89667\\\\159.6795\\\\307.01\\\\60.7613\\\\159.3753\\\\307.01\\\\59.696\\\\158.8785\\\\307.01\\\\58.73315\\\\158.2043\\\\307.01\\\\57.902\\\\157.3732\\\\307.01\\\\57.22781\\\\156.4103\\\\307.01\\\\56.73105\\\\155.345\\\\307.01\\\\56.42683\\\\154.2097\\\\307.01\\\\56.32438\\\\153.0387\\\\307.01\\\\56.42683\\\\151.8678\\\\307.01\\\\56.73105\\\\150.7324\\\\307.01\\\\57.22781\\\\149.6671\\\\307.01\\\\57.902\\\\148.7042\\\\307.01\\\\58.73315\\\\147.8731\\\\307.01\\\\59.696\\\\147.1989\\\\307.01\\\\60.7613\\\\146.7021\\\\307.01\\\\61.89667\\\\146.3979\\\\307.01\\\\63.06762\\\\146.2955\\\\307.01\\\\64.23858\\\\146.3979\\\\307.01\\\\65.37395\\\\146.7021\\\\307.01\\\\66.43925\\\\147.1989\\\\307.01\\\\67.4021\\\\147.8731\\\\307.01\\\\68.23325\\\\148.7042\\\\307.01\\\\68.90745\\\\149.6671\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"69.4042\\\\150.7324\\\\310.01\\\\69.70842\\\\151.8678\\\\310.01\\\\69.81087\\\\153.0387\\\\310.01\\\\69.70842\\\\154.2097\\\\310.01\\\\69.4042\\\\155.345\\\\310.01\\\\68.90745\\\\156.4103\\\\310.01\\\\68.23325\\\\157.3732\\\\310.01\\\\67.4021\\\\158.2043\\\\310.01\\\\66.43925\\\\158.8785\\\\310.01\\\\65.37395\\\\159.3753\\\\310.01\\\\64.23858\\\\159.6795\\\\310.01\\\\63.06762\\\\159.7819\\\\310.01\\\\61.89667\\\\159.6795\\\\310.01\\\\60.7613\\\\159.3753\\\\310.01\\\\59.696\\\\158.8785\\\\310.01\\\\58.73315\\\\158.2043\\\\310.01\\\\57.902\\\\157.3732\\\\310.01\\\\57.22781\\\\156.4103\\\\310.01\\\\56.73105\\\\155.345\\\\310.01\\\\56.42683\\\\154.2097\\\\310.01\\\\56.32438\\\\153.0387\\\\310.01\\\\56.42683\\\\151.8678\\\\310.01\\\\56.73105\\\\150.7324\\\\310.01\\\\57.22781\\\\149.6671\\\\310.01\\\\57.902\\\\148.7042\\\\310.01\\\\58.73315\\\\147.8731\\\\310.01\\\\59.696\\\\147.1989\\\\310.01\\\\60.7613\\\\146.7021\\\\310.01\\\\61.89667\\\\146.3979\\\\310.01\\\\63.06762\\\\146.2955\\\\310.01\\\\64.23858\\\\146.3979\\\\310.01\\\\65.37395\\\\146.7021\\\\310.01\\\\66.43925\\\\147.1989\\\\310.01\\\\67.4021\\\\147.8731\\\\310.01\\\\68.23325\\\\148.7042\\\\310.01\\\\68.90745\\\\149.6671\\\\310.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\\\\0\\\\255\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"15.45022\\\\210.3737\\\\304.01\\\\14.27927\\\\210.4761\\\\304.01\\\\13.10831\\\\210.3737\\\\304.01\\\\11.97294\\\\210.0694\\\\304.01\\\\10.90764\\\\209.5727\\\\304.01\\\\9.944793\\\\208.8985\\\\304.01\\\\9.113642\\\\208.0673\\\\304.01\\\\8.439445\\\\207.1045\\\\304.01\\\\7.94269\\\\206.0392\\\\304.01\\\\7.638467\\\\204.9038\\\\304.01\\\\7.536023\\\\203.7328\\\\304.01\\\\7.638467\\\\202.5619\\\\304.01\\\\7.94269\\\\201.4265\\\\304.01\\\\8.439445\\\\200.3612\\\\304.01\\\\9.113642\\\\199.3984\\\\304.01\\\\9.944793\\\\198.5672\\\\304.01\\\\10.90764\\\\197.893\\\\304.01\\\\11.97294\\\\197.3963\\\\304.01\\\\13.10831\\\\197.0921\\\\304.01\\\\14.27927\\\\196.9896\\\\304.01\\\\15.45022\\\\197.0921\\\\304.01\\\\16.58559\\\\197.3963\\\\304.01\\\\17.65089\\\\197.893\\\\304.01\\\\18.61374\\\\198.5672\\\\304.01\\\\19.44489\\\\199.3984\\\\304.01\\\\20.11909\\\\200.3612\\\\304.01\\\\20.61584\\\\201.4265\\\\304.01\\\\20.92006\\\\202.5619\\\\304.01\\\\21.02251\\\\203.7328\\\\304.01\\\\20.92006\\\\204.9038\\\\304.01\\\\20.61584\\\\206.0392\\\\304.01\\\\20.11909\\\\207.1045\\\\304.01\\\\19.44489\\\\208.0673\\\\304.01\\\\18.61374\\\\208.8985\\\\304.01\\\\17.65089\\\\209.5727\\\\304.01\\\\16.58559\\\\210.0694\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"15.45022\\\\210.3737\\\\307.01\\\\14.27927\\\\210.4761\\\\307.01\\\\13.10831\\\\210.3737\\\\307.01\\\\11.97294\\\\210.0694\\\\307.01\\\\10.90764\\\\209.5727\\\\307.01\\\\9.944793\\\\208.8985\\\\307.01\\\\9.113642\\\\208.0673\\\\307.01\\\\8.439445\\\\207.1045\\\\307.01\\\\7.94269\\\\206.0392\\\\307.01\\\\7.638467\\\\204.9038\\\\307.01\\\\7.536023\\\\203.7328\\\\307.01\\\\7.638467\\\\202.5619\\\\307.01\\\\7.94269\\\\201.4265\\\\307.01\\\\8.439445\\\\200.3612\\\\307.01\\\\9.113642\\\\199.3984\\\\307.01\\\\9.944793\\\\198.5672\\\\307.01\\\\10.90764\\\\197.893\\\\307.01\\\\11.97294\\\\197.3963\\\\307.01\\\\13.10831\\\\197.0921\\\\307.01\\\\14.27927\\\\196.9896\\\\307.01\\\\15.45022\\\\197.0921\\\\307.01\\\\16.58559\\\\197.3963\\\\307.01\\\\17.65089\\\\197.893\\\\307.01\\\\18.61374\\\\198.5672\\\\307.01\\\\19.44489\\\\199.3984\\\\307.01\\\\20.11909\\\\200.3612\\\\307.01\\\\20.61584\\\\201.4265\\\\307.01\\\\20.92006\\\\202.5619\\\\307.01\\\\21.02251\\\\203.7328\\\\307.01\\\\20.92006\\\\204.9038\\\\307.01\\\\20.61584\\\\206.0392\\\\307.01\\\\20.11909\\\\207.1045\\\\307.01\\\\19.44489\\\\208.0673\\\\307.01\\\\18.61374\\\\208.8985\\\\307.01\\\\17.65089\\\\209.5727\\\\307.01\\\\16.58559\\\\210.0694\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"15.45022\\\\210.3737\\\\310.01\\\\14.27927\\\\210.4761\\\\310.01\\\\13.10831\\\\210.3737\\\\310.01\\\\11.97294\\\\210.0694\\\\310.01\\\\10.90764\\\\209.5727\\\\310.01\\\\9.944793\\\\208.8985\\\\310.01\\\\9.113642\\\\208.0673\\\\310.01\\\\8.439445\\\\207.1045\\\\310.01\\\\7.94269\\\\206.0392\\\\310.01\\\\7.638467\\\\204.9038\\\\310.01\\\\7.536023\\\\203.7328\\\\310.01\\\\7.638467\\\\202.5619\\\\310.01\\\\7.94269\\\\201.4265\\\\310.01\\\\8.439445\\\\200.3612\\\\310.01\\\\9.113642\\\\199.3984\\\\310.01\\\\9.944793\\\\198.5672\\\\310.01\\\\10.90764\\\\197.893\\\\310.01\\\\11.97294\\\\197.3963\\\\310.01\\\\13.10831\\\\197.0921\\\\310.01\\\\14.27927\\\\196.9896\\\\310.01\\\\15.45022\\\\197.0921\\\\310.01\\\\16.58559\\\\197.3963\\\\310.01\\\\17.65089\\\\197.893\\\\310.01\\\\18.61374\\\\198.5672\\\\310.01\\\\19.44489\\\\199.3984\\\\310.01\\\\20.11909\\\\200.3612\\\\310.01\\\\20.61584\\\\201.4265\\\\310.01\\\\20.92006\\\\202.5619\\\\310.01\\\\21.02251\\\\203.7328\\\\310.01\\\\20.92006\\\\204.9038\\\\310.01\\\\20.61584\\\\206.0392\\\\310.01\\\\20.11909\\\\207.1045\\\\310.01\\\\19.44489\\\\208.0673\\\\310.01\\\\18.61374\\\\208.8985\\\\310.01\\\\17.65089\\\\209.5727\\\\310.01\\\\16.58559\\\\210.0694\\\\310.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\\\\128\\\\255\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.97014\\\\164.0225\\\\295.01\\\\13.79919\\\\164.1249\\\\295.01\\\\12.62824\\\\164.0225\\\\295.01\\\\11.49286\\\\163.7183\\\\295.01\\\\10.42757\\\\163.2215\\\\295.01\\\\9.464716\\\\162.5473\\\\295.01\\\\8.633565\\\\161.7162\\\\295.01\\\\7.95937\\\\160.7533\\\\295.01\\\\7.462614\\\\159.688\\\\295.01\\\\7.158391\\\\158.5526\\\\295.01\\\\7.055946\\\\157.3817\\\\295.01\\\\7.158391\\\\156.2107\\\\295.01\\\\7.462614\\\\155.0753\\\\295.01\\\\7.95937\\\\154.0101\\\\295.01\\\\8.633565\\\\153.0472\\\\295.01\\\\9.464716\\\\152.216\\\\295.01\\\\10.42757\\\\151.5419\\\\295.01\\\\11.49286\\\\151.0451\\\\295.01\\\\12.62824\\\\150.7409\\\\295.01\\\\13.79919\\\\150.6384\\\\295.01\\\\14.97014\\\\150.7409\\\\295.01\\\\16.10551\\\\151.0451\\\\295.01\\\\17.17081\\\\151.5419\\\\295.01\\\\18.13366\\\\152.216\\\\295.01\\\\18.96481\\\\153.0472\\\\295.01\\\\19.63901\\\\154.0101\\\\295.01\\\\20.13577\\\\155.0753\\\\295.01\\\\20.43999\\\\156.2107\\\\295.01\\\\20.54243\\\\157.3817\\\\295.01\\\\20.43999\\\\158.5526\\\\295.01\\\\20.13577\\\\159.688\\\\295.01\\\\19.63901\\\\160.7533\\\\295.01\\\\18.96481\\\\161.7162\\\\295.01\\\\18.13366\\\\162.5473\\\\295.01\\\\17.17081\\\\163.2215\\\\295.01\\\\16.10551\\\\163.7183\\\\295.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n"; -const char* k_rtStruct_json01 = -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.97014\\\\164.0225\\\\298.01\\\\13.79919\\\\164.1249\\\\298.01\\\\12.62824\\\\164.0225\\\\298.01\\\\11.49286\\\\163.7183\\\\298.01\\\\10.42757\\\\163.2215\\\\298.01\\\\9.464716\\\\162.5473\\\\298.01\\\\8.633565\\\\161.7162\\\\298.01\\\\7.95937\\\\160.7533\\\\298.01\\\\7.462614\\\\159.688\\\\298.01\\\\7.158391\\\\158.5526\\\\298.01\\\\7.055946\\\\157.3817\\\\298.01\\\\7.158391\\\\156.2107\\\\298.01\\\\7.462614\\\\155.0753\\\\298.01\\\\7.95937\\\\154.0101\\\\298.01\\\\8.633565\\\\153.0472\\\\298.01\\\\9.464716\\\\152.216\\\\298.01\\\\10.42757\\\\151.5419\\\\298.01\\\\11.49286\\\\151.0451\\\\298.01\\\\12.62824\\\\150.7409\\\\298.01\\\\13.79919\\\\150.6384\\\\298.01\\\\14.97014\\\\150.7409\\\\298.01\\\\16.10551\\\\151.0451\\\\298.01\\\\17.17081\\\\151.5419\\\\298.01\\\\18.13366\\\\152.216\\\\298.01\\\\18.96481\\\\153.0472\\\\298.01\\\\19.63901\\\\154.0101\\\\298.01\\\\20.13577\\\\155.0753\\\\298.01\\\\20.43999\\\\156.2107\\\\298.01\\\\20.54243\\\\157.3817\\\\298.01\\\\20.43999\\\\158.5526\\\\298.01\\\\20.13577\\\\159.688\\\\298.01\\\\19.63901\\\\160.7533\\\\298.01\\\\18.96481\\\\161.7162\\\\298.01\\\\18.13366\\\\162.5473\\\\298.01\\\\17.17081\\\\163.2215\\\\298.01\\\\16.10551\\\\163.7183\\\\298.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.97014\\\\164.0225\\\\301.01\\\\13.79919\\\\164.1249\\\\301.01\\\\12.62824\\\\164.0225\\\\301.01\\\\11.49286\\\\163.7183\\\\301.01\\\\10.42757\\\\163.2215\\\\301.01\\\\9.464716\\\\162.5473\\\\301.01\\\\8.633565\\\\161.7162\\\\301.01\\\\7.95937\\\\160.7533\\\\301.01\\\\7.462614\\\\159.688\\\\301.01\\\\7.158391\\\\158.5526\\\\301.01\\\\7.055946\\\\157.3817\\\\301.01\\\\7.158391\\\\156.2107\\\\301.01\\\\7.462614\\\\155.0753\\\\301.01\\\\7.95937\\\\154.0101\\\\301.01\\\\8.633565\\\\153.0472\\\\301.01\\\\9.464716\\\\152.216\\\\301.01\\\\10.42757\\\\151.5419\\\\301.01\\\\11.49286\\\\151.0451\\\\301.01\\\\12.62824\\\\150.7409\\\\301.01\\\\13.79919\\\\150.6384\\\\301.01\\\\14.97014\\\\150.7409\\\\301.01\\\\16.10551\\\\151.0451\\\\301.01\\\\17.17081\\\\151.5419\\\\301.01\\\\18.13366\\\\152.216\\\\301.01\\\\18.96481\\\\153.0472\\\\301.01\\\\19.63901\\\\154.0101\\\\301.01\\\\20.13577\\\\155.0753\\\\301.01\\\\20.43999\\\\156.2107\\\\301.01\\\\20.54243\\\\157.3817\\\\301.01\\\\20.43999\\\\158.5526\\\\301.01\\\\20.13577\\\\159.688\\\\301.01\\\\19.63901\\\\160.7533\\\\301.01\\\\18.96481\\\\161.7162\\\\301.01\\\\18.13366\\\\162.5473\\\\301.01\\\\17.17081\\\\163.2215\\\\301.01\\\\16.10551\\\\163.7183\\\\301.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\\\\128\\\\0\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"340\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"108.3984\\\\232.7406\\\\274.01\\\\106.0547\\\\231.7948\\\\274.01\\\\103.7109\\\\232.8407\\\\274.01\\\\96.67969\\\\232.8757\\\\274.01\\\\77.92969\\\\232.887\\\\274.01\\\\47.46094\\\\232.8902\\\\274.01\\\\38.08594\\\\232.7537\\\\274.01\\\\37.6668\\\\232.3734\\\\274.01\\\\38.08594\\\\231.9774\\\\274.01\\\\40.42969\\\\231.8475\\\\274.01\\\\41.76413\\\\230.0297\\\\274.01\\\\42.77344\\\\229.1388\\\\274.01\\\\45.11719\\\\228.5069\\\\274.01\\\\47.46094\\\\227.1533\\\\274.01\\\\49.80469\\\\226.3505\\\\274.01\\\\52.14844\\\\224.6564\\\\274.01\\\\54.49219\\\\223.923\\\\274.01\\\\56.83594\\\\222.0692\\\\274.01\\\\59.17969\\\\220.3438\\\\274.01\\\\61.52344\\\\219.3888\\\\274.01\\\\63.86719\\\\217.1287\\\\274.01\\\\65.83488\\\\215.9672\\\\274.01\\\\68.55469\\\\213.2383\\\\274.01\\\\70.89844\\\\211.2328\\\\274.01\\\\72.8125\\\\208.9359\\\\274.01\\\\75.58594\\\\206.3615\\\\274.01\\\\76.91445\\\\204.2484\\\\274.01\\\\78.89509\\\\201.9047\\\\274.01\\\\80.51276\\\\199.5609\\\\274.01\\\\81.51955\\\\197.2172\\\\274.01\\\\83.67448\\\\194.8734\\\\274.01\\\\84.60938\\\\192.5297\\\\274.01\\\\85.86986\\\\190.1859\\\\274.01\\\\86.57623\\\\187.8422\\\\274.01\\\\88.30051\\\\185.4984\\\\274.01\\\\88.94002\\\\183.1547\\\\274.01\\\\89.23261\\\\180.8109\\\\274.01\\\\89.64844\\\\180.3263\\\\274.01\\\\90.71885\\\\178.4672\\\\274.01\\\\90.97656\\\\176.1234\\\\274.01\\\\91.99219\\\\174.4794\\\\274.01\\\\92.56773\\\\173.7797\\\\274.01\\\\92.80016\\\\171.4359\\\\274.01\\\\93.23473\\\\169.0922\\\\274.01\\\\93.37606\\\\166.7484\\\\274.01\\\\93.60748\\\\157.3734\\\\274.01\\\\93.6341\\\\152.6859\\\\274.01\\\\93.35742\\\\140.9672\\\\274.01\\\\92.89317\\\\138.6234\\\\274.01\\\\92.7069\\\\136.2797\\\\274.01\\\\92.03726\\\\133.9359\\\\274.01\\\\90.84009\\\\131.5922\\\\274.01\\\\90.3769\\\\129.2484\\\\274.01\\\\89.09074\\\\126.9047\\\\274.01\\\\88.13225\\\\122.2172\\\\274.01\\\\86.17828\\\\119.8734\\\\274.01\\\\84.96094\\\\117.4163\\\\274.01\\\\83.99619\\\\115.1859\\\\274.01\\\\83.13079\\\\112.8422\\\\274.01\\\\82.61719\\\\112.2984\\\\274.01\\\\80.27344\\\\108.8454\\\\274.01\\\\79.64514\\\\108.1547\\\\274.01\\\\77.21497\\\\105.8109\\\\274.01\\\\76.47787\\\\103.4672\\\\274.01\\\\75.58594\\\\102.6177\\\\274.01\\\\73.24219\\\\100.0077\\\\274.01\\\\69.54492\\\\96.43594\\\\274.01\\\\67.34096\\\\94.09219\\\\274.01\\\\64.66306\\\\91.74844\\\\274.01\\\\63.86719\\\\90.92619\\\\274.01\\\\61.52344\\\\90.20454\\\\274.01\\\\59.17969\\\\87.78574\\\\274.01\\\\56.83594\\\\86.48566\\\\274.01\\\\54.49219\\\\84.31388\\\\274.01\\\\52.14844\\\\83.44438\\\\274.01\\\\49.80469\\\\82.75121\\\\274.01\\\\49.37617\\\\82.37344\\\\274.01\\\\47.46094\\\\81.26244\\\\274.01\\\\45.71391\\\\80.02969\\\\274.01\\\\45.11719\\\\79.45415\\\\274.01\\\\42.77344\\\\79.08185\\\\274.01\\\\40.42969\\\\78.51941\\\\274.01\\\\38.08594\\\\78.27534\\\\274.01\\\\37.36932\\\\77.68594\\\\274.01\\\\35.74219\\\\76.67624\\\\274.01\\\\33.39844\\\\76.49941\\\\274.01\\\\31.05469\\\\76.03495\\\\274.01\\\\28.71094\\\\74.83174\\\\274.01\\\\26.36719\\\\74.62859\\\\274.01\\\\24.02344\\\\74.55463\\\\274.01\\\\21.67969\\\\74.22861\\\\274.01\\\\19.33594\\\\74.05312\\\\274.01\\\\12.30469\\\\73.99397\\\\274.01\\\\5.273438\\\\74.0736\\\\274.01\\\\2.929688\\\\74.55463\\\\274.01\\\\0.5859375\\\\74.68513\\\\274.01\\\\-1.757813\\\\74.914\\\\274.01\\\\-2.319131\\\\75.34219\\\\274.01\\\\-4.101563\\\\76.31516\\\\274.01\\\\-8.789063\\\\76.74514\\\\274.01\\\\-11.13281\\\\78.39038\\\\274.01\\\\-13.47656\\\\78.6124\\\\274.01\\\\-15.82031\\\\79.19784\\\\274.01\\\\-18.16406\\\\81.11024\\\\274.01\\\\-20.50781\\\\82.03296\\\\274.01\\\\-22.85156\\\\83.13991\\\\274.01\\\\-25.19531\\\\83.70732\\\\274.01\\\\-27.53906\\\\85.85863\\\\274.01\\\\-29.88281\\\\87.03368\\\\274.01\\\\-32.22656\\\\88.3274\\\\274.01\\\\-34.57031\\\\90.53674\\\\274.01\\\\-36.91406\\\\92.5602\\\\274.01\\\\-39.25781\\\\93.55952\\\\274.01\\\\-41.60156\\\\95.74537\\\\274.01\\\\-43.94531\\\\98.26609\\\\274.01\\\\-46.28906\\\\100.3701\\\\274.01\\\\-47.02621\\\\101.1234\\\\274.01\\\\-47.86611\\\\103.4672\\\\274.01\\\\-49.83594\\\\105.8109\\\\274.01\\\\-51.98182\\\\108.1547\\\\274.01\\\\-53.06448\\\\110.4984\\\\274.01\\\\-53.32031\\\\110.7675\\\\274.01\\\\-54.53804\\\\112.8422\\\\274.01\\\\-55.66406\\\\114.273\\\\274.01\\\\-56.55722\\\\115.1859\\\\274.01\\\\-57.13953\\\\117.5297\\\\274.01\\\\-58.29264\\\\119.8734\\\\274.01\\\\-59.26869\\\\122.2172\\\\274.01\\\\-60.35156\\\\124.0119\\\\274.01\\\\-60.84229\\\\124.5609\\\\274.01\\\\-61.54484\\\\126.9047\\\\274.01\\\\-61.71691\\\\129.2484\\\\274.01\\\\-63.62281\\\\131.5922\\\\274.01\\\\-63.81256\\\\133.9359\\\\274.01\\\\-64.12511\\\\136.2797\\\\274.01\\\\-64.84515\\\\138.6234\\\\274.01\\\\-65.13599\\\\140.9672\\\\274.01\\\\-65.33604\\\\143.3109\\\\274.01\\\\-65.87358\\\\145.6547\\\\274.01\\\\-66.10577\\\\147.9984\\\\274.01\\\\-66.17618\\\\155.0297\\\\274.01\\\\-66.09933\\\\162.0609\\\\274.01\\\\-65.40382\\\\164.4047\\\\274.01\\\\-65.24833\\\\166.7484\\\\274.01\\\\-64.71442\\\\171.4359\\\\274.01\\\\-63.88171\\\\173.7797\\\\274.01\\\\-63.69299\\\\176.1234\\\\274.01\\\\-61.79081\\\\178.4672\\\\274.01\\\\-61.59269\\\\180.8109\\\\274.01\\\\-61.19405\\\\183.1547\\\\274.01\\\\-60.35156\\\\185.2055\\\\274.01\\\\-59.08288\\\\187.8422\\\\274.01\\\\-58.00781\\\\189.3499\\\\274.01\\\\-57.25858\\\\190.1859\\\\274.01\\\\-56.64558\\\\192.5297\\\\274.01\\\\-55.29191\\\\194.8734\\\\274.01\\\\-54.28698\\\\197.2172\\\\274.01\\\\-52.28595\\\\199.5609\\\\274.01\\\\-51.47569\\\\201.9047\\\\274.01\\\\-48.63281\\\\204.6417\\\\274.01\\\\-47.10181\\\\206.5922\\\\274.01\\\\-44.64154\\\\208.9359\\\\274.01\\\\-42.38504\\\\211.2797\\\\274.01\\\\-39.25781\\\\214.4025\\\\274.01\\\\-37.42723\\\\215.9672\\\\274.01\\\\-34.57031\\\\218.9107\\\\274.01\\\\-32.22656\\\\219.7277\\\\274.01\\\\-29.88281\\\\221.6934\\\\274.01\\\\-27.53906\\\\222.852\\\\274.01\\\\-25.19531\\\\224.5168\\\\274.01\\\\-22.85156\\\\225.9419\\\\274.01\\\\-20.50781\\\\226.7359\\\\274.01\\\\-18.16406\\\\228.3332\\\\274.01\\\\-15.82031\\\\229.065\\\\274.01\\\\-13.47656\\\\229.267\\\\274.01\\\\-12.63854\\\\230.0297\\\\274.01\\\\-11.13281\\\\231.9201\\\\274.01\\\\-10.65505\\\\232.3734\\\\274.01\\\\-11.13281\\\\232.7794\\\\274.01\\\\-15.82031\\\\232.792\\\\274.01\\\\-18.16406\\\\232.8902\\\\274.01\\\\-36.91406\\\\232.9015\\\\274.01\\\\-39.25781\\\\232.8902\\\\274.01\\\\-50.97656\\\\232.9236\\\\274.01\\\\-60.35156\\\\232.9126\\\\274.01\\\\-67.38281\\\\232.8407\\\\274.01\\\\-72.07031\\\\232.8642\\\\274.01\\\\-79.10156\\\\232.8555\\\\274.01\\\\-83.78906\\\\232.8788\\\\274.01\\\\-95.50781\\\\232.8902\\\\274.01\\\\-97.85156\\\\233.4886\\\\274.01\\\\-100.1953\\\\233.647\\\\274.01\\\\-102.5391\\\\232.9858\\\\274.01\\\\-104.8828\\\\233.6969\\\\274.01\\\\-109.5703\\\\233.722\\\\274.01\\\\-125.9766\\\\233.7086\\\\274.01\\\\-128.3203\\\\233.2849\\\\274.01\\\\-130.6641\\\\233.702\\\\274.01\\\\-135.3516\\\\233.727\\\\274.01\\\\-149.4141\\\\233.7135\\\\274.01\\\\-156.4453\\\\233.727\\\\274.01\\\\-163.4766\\\\233.7119\\\\274.01\\\\-168.1641\\\\233.7643\\\\274.01\\\\-191.6016\\\\233.7809\\\\274.01\\\\-210.3516\\\\233.7716\\\\274.01\\\\-224.4141\\\\233.7998\\\\274.01\\\\-233.7891\\\\233.7647\\\\274.01\\\\-243.1641\\\\233.7785\\\\274.01\\\\-247.8516\\\\233.7378\\\\274.01\\\\-254.8828\\\\233.8578\\\\274.01\\\\-257.2266\\\\235.2519\\\\274.01\\\\-259.5703\\\\236.0817\\\\274.01\\\\-260.7617\\\\237.0609\\\\274.01\\\\-261.9141\\\\238.2262\\\\274.01\\\\-262.8989\\\\239.4047\\\\274.01\\\\-262.9743\\\\241.7484\\\\274.01\\\\-262.5977\\\\244.0922\\\\274.01\\\\-260.6675\\\\246.4359\\\\274.01\\\\-259.6161\\\\248.7797\\\\274.01\\\\-257.2266\\\\251.0035\\\\274.01\\\\-255.0361\\\\253.4672\\\\274.01\\\\-252.5391\\\\256.0995\\\\274.01\\\\-251.2277\\\\258.1547\\\\274.01\\\\-246.7444\\\\262.8422\\\\274.01\\\\-243.1641\\\\266.3515\\\\274.01\\\\-239.7411\\\\269.8734\\\\274.01\\\\-238.4766\\\\270.9495\\\\274.01\\\\-237.2269\\\\272.2172\\\\274.01\\\\-236.1328\\\\273.5215\\\\274.01\\\\-235.0934\\\\274.5609\\\\274.01\\\\-233.7891\\\\275.6655\\\\274.01\\\\-232.5319\\\\276.9047\\\\274.01\\\\-231.4453\\\\278.1693\\\\274.01\\\\-227.917\\\\281.5922\\\\274.01\\\\-224.4141\\\\285.1802\\\\274.01\\\\-222.0703\\\\287.4025\\\\274.01\\\\-218.6841\\\\290.9672\\\\274.01\\\\-217.3828\\\\291.9709\\\\274.01\\\\-215.0391\\\\293.1788\\\\274.01\\\\-212.6953\\\\294.5138\\\\274.01\\\\-210.3516\\\\295.2614\\\\274.01\\\\-209.8994\\\\295.6547\\\\274.01\\\\-208.0078\\\\296.7083\\\\274.01\\\\-203.3203\\\\296.9372\\\\274.01\\\\-196.2891\\\\296.9317\\\\274.01\\\\-193.9453\\\\296.8988\\\\274.01\\\\-172.8516\\\\296.8482\\\\274.01\\\\-161.1328\\\\296.843\\\\274.01\\\\-137.6953\\\\296.8542\\\\274.01\\\\-130.6641\\\\296.8378\\\\274.01\\\\-107.2266\\\\296.8379\\\\274.01\\\\-93.16406\\\\296.8208\\\\274.01\\\\-74.41406\\\\296.838\\\\274.01\\\\-65.03906\\\\296.8609\\\\274.01\\\\-50.97656\\\\296.8556\\\\274.01\\\\-46.28906\\\\296.9051\\\\274.01\\\\-41.60156\\\\298.5331\\\\274.01\\\\-39.25781\\\\298.5624\\\\274.01\\\\-36.91406\\\\297.1455\\\\274.01\\\\-34.57031\\\\297.0498\\\\274.01\\\\-32.22656\\\\298.5589\\\\274.01\\\\-25.19531\\\\298.5624\\\\274.01\\\\-22.85156\\\\297.2842\\\\274.01\\\\-20.50781\\\\298.5624\\\\274.01\\\\-1.757813\\\\298.5624\\\\274.01\\\\0.5859375\\\\297.2104\\\\274.01\\\\2.929688\\\\298.5624\\\\274.01\\\\5.273438\\\\297.6946\\\\274.01\\\\7.617188\\\\298.5168\\\\274.01\\\\9.960938\\\\298.5512\\\\274.01\\\\12.30469\\\\296.937\\\\274.01\\\\14.64844\\\\298.5478\\\\274.01\\\\16.99219\\\\298.5478\\\\274.01\\\\19.33594\\\\297.0782\\\\274.01\\\\21.67969\\\\296.844\\\\274.01\\\\23.54531\\\\297.9984\\\\274.01\\\\24.02344\\\\298.4023\\\\274.01\\\\24.50156\\\\297.9984\\\\274.01\\\\26.36719\\\\296.844\\\\274.01\\\\38.08594\\\\296.8381\\\\274.01\\\\52.14844\\\\296.8033\\\\274.01\\\\59.17969\\\\296.8033\\\\274.01\\\\73.24219\\\\296.7682\\\\274.01\\\\99.02344\\\\296.7566\\\\274.01\\\\117.7734\\\\296.7216\\\\274.01\\\\129.4922\\\\296.7152\\\\274.01\\\\131.8359\\\\295.9083\\\\274.01\\\\134.1797\\\\295.5245\\\\274.01\\\\138.8672\\\\295.4763\\\\274.01\\\\155.2734\\\\295.4763\\\\274.01\\\\176.3672\\\\295.3861\\\\274.01\\\\190.4297\\\\295.3718\\\\274.01\\\\197.4609\\\\295.4763\\\\274.01\\\\202.1484\\\\295.4454\\\\274.01\\\\204.4922\\\\295.3438\\\\274.01\\\\206.8359\\\\295.0757\\\\274.01\\\\209.1797\\\\294.4124\\\\274.01\\\\211.5234\\\\292.3133\\\\274.01\\\\213.8672\\\\291.0809\\\\274.01\\\\216.2109\\\\289.6743\\\\274.01\\\\217.3081\\\\288.6234\\\\274.01\\\\219.3558\\\\286.2797\\\\274.01\\\\221.8608\\\\283.9359\\\\274.01\\\\225.5859\\\\280.045\\\\274.01\\\\227.9297\\\\277.8885\\\\274.01\\\\230.2734\\\\275.2857\\\\274.01\\\\232.6172\\\\273.2225\\\\274.01\\\\233.6225\\\\272.2172\\\\274.01\\\\234.9609\\\\270.5822\\\\274.01\\\\238.2254\\\\267.5297\\\\274.01\\\\240.3691\\\\265.1859\\\\274.01\\\\244.3359\\\\261.3326\\\\274.01\\\\246.6797\\\\258.8034\\\\274.01\\\\249.0234\\\\256.7196\\\\274.01\\\\251.3672\\\\254.0746\\\\274.01\\\\254.5313\\\\251.1234\\\\274.01\\\\255.333\\\\248.7797\\\\274.01\\\\257.3723\\\\246.4359\\\\274.01\\\\259.7201\\\\244.0922\\\\274.01\\\\260.106\\\\241.7484\\\\274.01\\\\261.6423\\\\239.4047\\\\274.01\\\\261.0804\\\\237.0609\\\\274.01\\\\259.3552\\\\234.7172\\\\274.01\\\\258.3984\\\\233.7696\\\\274.01\\\\256.0547\\\\232.8757\\\\274.01\\\\253.7109\\\\232.792\\\\274.01\\\\251.3672\\\\232.8161\\\\274.01\\\\246.6797\\\\232.6981\\\\274.01\\\\244.3359\\\\232.725\\\\274.01\\\\239.6484\\\\232.9137\\\\274.01\\\\234.9609\\\\232.8525\\\\274.01\\\\225.5859\\\\232.8757\\\\274.01\\\\209.1797\\\\232.8757\\\\274.01\\\\204.4922\\\\232.7537\\\\274.01\\\\195.1172\\\\232.7794\\\\274.01\\\\171.6797\\\\232.792\\\\274.01\\\\164.6484\\\\232.7666\\\\274.01\\\\152.9297\\\\232.7666\\\\274.01\\\\148.2422\\\\232.792\\\\274.01\\\\138.8672\\\\232.7406\\\\274.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"380\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0671\\\\277.01\\\\-32.22656\\\\233.1221\\\\277.01\\\\-41.60156\\\\233.1397\\\\277.01\\\\-43.94531\\\\233.1221\\\\277.01\\\\-50.97656\\\\233.1818\\\\277.01\\\\-60.35156\\\\233.1568\\\\277.01\\\\-67.38281\\\\232.9942\\\\277.01\\\\-74.41406\\\\233.0537\\\\277.01\\\\-79.10156\\\\233.0283\\\\277.01\\\\-88.47656\\\\233.0859\\\\277.01\\\\-95.50781\\\\233.1042\\\\277.01\\\\-97.85156\\\\234.0105\\\\277.01\\\\-100.1953\\\\234.062\\\\277.01\\\\-102.5391\\\\233.987\\\\277.01\\\\-104.8828\\\\234.0941\\\\277.01\\\\-109.5703\\\\234.1996\\\\277.01\\\\-114.2578\\\\234.1551\\\\277.01\\\\-123.6328\\\\234.1127\\\\277.01\\\\-125.9766\\\\234.1266\\\\277.01\\\\-128.3203\\\\234.0177\\\\277.01\\\\-135.3516\\\\234.1741\\\\277.01\\\\-140.0391\\\\234.1551\\\\277.01\\\\-142.3828\\\\234.1996\\\\277.01\\\\-147.0703\\\\234.1174\\\\277.01\\\\-156.4453\\\\234.1828\\\\277.01\\\\-163.4766\\\\234.1357\\\\277.01\\\\-165.8203\\\\234.1871\\\\277.01\\\\-168.1641\\\\234.3922\\\\277.01\\\\-177.5391\\\\234.4145\\\\277.01\\\\-179.8828\\\\234.3618\\\\277.01\\\\-184.5703\\\\234.3864\\\\277.01\\\\-186.9141\\\\234.4535\\\\277.01\\\\-189.2578\\\\234.4194\\\\277.01\\\\-191.6016\\\\234.471\\\\277.01\\\\-198.6328\\\\234.3891\\\\277.01\\\\-200.9766\\\\234.4386\\\\277.01\\\\-205.6641\\\\234.3731\\\\277.01\\\\-210.3516\\\\234.3731\\\\277.01\\\\-217.3828\\\\234.4242\\\\277.01\\\\-219.7266\\\\234.5104\\\\277.01\\\\-224.4141\\\\234.4944\\\\277.01\\\\-229.1016\\\\234.4218\\\\277.01\\\\-233.7891\\\\234.2678\\\\277.01\\\\-240.8203\\\\234.3296\\\\277.01\\\\-243.1641\\\\234.3917\\\\277.01\\\\-247.8516\\\\234.2029\\\\277.01\\\\-250.1953\\\\234.3235\\\\277.01\\\\-251.4551\\\\234.7172\\\\277.01\\\\-252.5391\\\\236.6024\\\\277.01\\\\-254.8828\\\\235.4008\\\\277.01\\\\-257.2266\\\\235.5063\\\\277.01\\\\-259.5703\\\\236.2655\\\\277.01\\\\-260.5737\\\\237.0609\\\\277.01\\\\-262.332\\\\239.4047\\\\277.01\\\\-262.689\\\\241.7484\\\\277.01\\\\-261.9141\\\\243.7504\\\\277.01\\\\-260.6889\\\\246.4359\\\\277.01\\\\-259.5703\\\\248.4867\\\\277.01\\\\-255.2138\\\\253.4672\\\\277.01\\\\-253.2667\\\\255.8109\\\\277.01\\\\-250.1953\\\\258.8662\\\\277.01\\\\-247.8516\\\\261.4125\\\\277.01\\\\-246.2862\\\\262.8422\\\\277.01\\\\-244.1278\\\\265.1859\\\\277.01\\\\-240.8203\\\\268.3467\\\\277.01\\\\-239.375\\\\269.8734\\\\277.01\\\\-236.9429\\\\272.2172\\\\277.01\\\\-233.7891\\\\275.382\\\\277.01\\\\-231.4453\\\\277.8091\\\\277.01\\\\-229.8568\\\\279.2484\\\\277.01\\\\-227.6842\\\\281.5922\\\\277.01\\\\-225.1387\\\\283.9359\\\\277.01\\\\-222.0703\\\\287.1957\\\\277.01\\\\-220.5108\\\\288.6234\\\\277.01\\\\-218.2596\\\\290.9672\\\\277.01\\\\-217.3828\\\\291.6321\\\\277.01\\\\-215.0391\\\\292.8542\\\\277.01\\\\-214.579\\\\293.3109\\\\277.01\\\\-212.6953\\\\294.5394\\\\277.01\\\\-210.3516\\\\295.0909\\\\277.01\\\\-209.68\\\\295.6547\\\\277.01\\\\-208.0078\\\\296.4548\\\\277.01\\\\-205.6641\\\\296.8658\\\\277.01\\\\-203.3203\\\\297.1639\\\\277.01\\\\-196.2891\\\\297.1488\\\\277.01\\\\-193.9453\\\\297.0495\\\\277.01\\\\-179.8828\\\\296.9703\\\\277.01\\\\-172.8516\\\\296.9012\\\\277.01\\\\-168.1641\\\\296.9407\\\\277.01\\\\-161.1328\\\\296.9063\\\\277.01\\\\-156.4453\\\\296.9453\\\\277.01\\\\-151.7578\\\\296.9222\\\\277.01\\\\-147.0703\\\\296.9559\\\\277.01\\\\-144.7266\\\\296.9085\\\\277.01\\\\-135.3516\\\\296.92\\\\277.01\\\\-121.2891\\\\296.8532\\\\277.01\\\\-107.2266\\\\296.8819\\\\277.01\\\\-93.16406\\\\296.7973\\\\277.01\\\\-90.82031\\\\296.8363\\\\277.01\\\\-83.78906\\\\296.8459\\\\277.01\\\\-81.44531\\\\296.8837\\\\277.01\\\\-74.41406\\\\296.9028\\\\277.01\\\\-65.03906\\\\296.96\\\\277.01\\\\-60.35156\\\\296.9494\\\\277.01\\\\-58.00781\\\\296.9872\\\\277.01\\\\-53.32031\\\\296.9377\\\\277.01\\\\-50.97656\\\\296.9579\\\\277.01\\\\-48.63281\\\\297.1438\\\\277.01\\\\-43.94531\\\\297.2253\\\\277.01\\\\-41.60156\\\\297.048\\\\277.01\\\\-39.25781\\\\297.3759\\\\277.01\\\\-36.91406\\\\296.9644\\\\277.01\\\\-34.57031\\\\297.3341\\\\277.01\\\\-32.22656\\\\297.1747\\\\277.01\\\\-29.88281\\\\297.4229\\\\277.01\\\\-27.53906\\\\297.3652\\\\277.01\\\\-25.19531\\\\297.4334\\\\277.01\\\\-22.85156\\\\297.3652\\\\277.01\\\\-18.16406\\\\297.4229\\\\277.01\\\\-11.13281\\\\297.4334\\\\277.01\\\\-4.101563\\\\297.3235\\\\277.01\\\\-1.757813\\\\297.4229\\\\277.01\\\\2.929688\\\\297.3531\\\\277.01\\\\5.273438\\\\297.2199\\\\277.01\\\\7.617188\\\\297.4055\\\\277.01\\\\9.960938\\\\297.3842\\\\277.01\\\\12.30469\\\\296.9557\\\\277.01\\\\14.64844\\\\297.2621\\\\277.01\\\\16.99219\\\\297.2089\\\\277.01\\\\21.67969\\\\296.916\\\\277.01\\\\24.02344\\\\297.3701\\\\277.01\\\\26.36719\\\\296.9067\\\\277.01\\\\28.71094\\\\296.9467\\\\277.01\\\\33.39844\\\\296.8867\\\\277.01\\\\40.42969\\\\296.8564\\\\277.01\\\\45.11719\\\\296.7865\\\\277.01\\\\56.83594\\\\296.6788\\\\277.01\\\\61.52344\\\\296.6724\\\\277.01\\\\73.24219\\\\296.5521\\\\277.01\\\\87.30469\\\\296.5362\\\\277.01\\\\91.99219\\\\296.4801\\\\277.01\\\\96.67969\\\\296.4873\\\\277.01\\\\101.3672\\\\296.4462\\\\277.01\\\\115.4297\\\\296.3703\\\\277.01\\\\117.7734\\\\296.3846\\\\277.01\\\\134.1797\\\\296.2709\\\\277.01\\\\136.5234\\\\296.2305\\\\277.01\\\\138.8672\\\\295.864\\\\277.01\\\\141.2109\\\\295.9064\\\\277.01\\\\145.8984\\\\295.8486\\\\277.01\\\\148.2422\\\\295.9027\\\\277.01\\\\150.5859\\\\295.833\\\\277.01\\\\155.2734\\\\295.864\\\\277.01\\\\157.6172\\\\295.8012\\\\277.01\\\\164.6484\\\\295.7516\\\\277.01\\\\169.3359\\\\295.6819\\\\277.01\\\\174.0234\\\\295.6819\\\\277.01\\\\176.3672\\\\295.5916\\\\277.01\\\\181.0547\\\\295.557\\\\277.01\\\\185.7422\\\\295.5742\\\\277.01\\\\192.7734\\\\295.5401\\\\277.01\\\\197.4609\\\\295.833\\\\277.01\\\\202.1484\\\\295.7684\\\\277.01\\\\204.4922\\\\295.4594\\\\277.01\\\\206.8359\\\\294.8185\\\\277.01\\\\209.1797\\\\294.347\\\\277.01\\\\211.5234\\\\292.4135\\\\277.01\\\\213.8672\\\\291.0298\\\\277.01\\\\216.2109\\\\289.437\\\\277.01\\\\217.074\\\\288.6234\\\\277.01\\\\218.5547\\\\286.9247\\\\277.01\\\\221.5416\\\\283.9359\\\\277.01\\\\225.5859\\\\279.7662\\\\277.01\\\\227.9297\\\\277.4546\\\\277.01\\\\230.2734\\\\274.9609\\\\277.01\\\\233.0324\\\\272.2172\\\\277.01\\\\234.9609\\\\270.159\\\\277.01\\\\241.9922\\\\262.9747\\\\277.01\\\\244.3264\\\\260.4984\\\\277.01\\\\246.6903\\\\258.1547\\\\277.01\\\\249.0234\\\\255.711\\\\277.01\\\\251.3672\\\\253.4211\\\\277.01\\\\255.433\\\\248.7797\\\\277.01\\\\257.1424\\\\246.4359\\\\277.01\\\\259.4697\\\\244.0922\\\\277.01\\\\261.12\\\\239.4047\\\\277.01\\\\260.5029\\\\237.0609\\\\277.01\\\\259.4318\\\\234.7172\\\\277.01\\\\258.3984\\\\233.723\\\\277.01\\\\256.0547\\\\233.0686\\\\277.01\\\\253.7109\\\\232.8224\\\\277.01\\\\251.3672\\\\233.3211\\\\277.01\\\\249.0234\\\\232.7988\\\\277.01\\\\246.6797\\\\232.5842\\\\277.01\\\\244.3359\\\\232.6886\\\\277.01\\\\239.6484\\\\233.2349\\\\277.01\\\\237.3047\\\\233.3486\\\\277.01\\\\234.9609\\\\233.0207\\\\277.01\\\\227.9297\\\\233.0108\\\\277.01\\\\225.5859\\\\233.0402\\\\277.01\\\\209.1797\\\\233.0726\\\\277.01\\\\206.8359\\\\232.9699\\\\277.01\\\\204.4922\\\\232.7719\\\\277.01\\\\199.8047\\\\232.7719\\\\277.01\\\\195.1172\\\\232.8224\\\\277.01\\\\183.3984\\\\232.8852\\\\277.01\\\\176.3672\\\\232.8253\\\\277.01\\\\171.6797\\\\232.8497\\\\277.01\\\\166.9922\\\\232.81\\\\277.01\\\\157.6172\\\\232.8253\\\\277.01\\\\152.9297\\\\232.8003\\\\277.01\\\\145.8984\\\\232.8497\\\\277.01\\\\138.8672\\\\232.7614\\\\277.01\\\\136.5234\\\\232.7746\\\\277.01\\\\129.4922\\\\232.7186\\\\277.01\\\\127.1484\\\\232.7614\\\\277.01\\\\120.1172\\\\232.7346\\\\277.01\\\\108.3984\\\\232.7481\\\\277.01\\\\106.0547\\\\232.7048\\\\277.01\\\\103.7109\\\\232.9735\\\\277.01\\\\101.3672\\\\232.9629\\\\277.01\\\\96.67969\\\\233.0726\\\\277.01\\\\87.30469\\\\233.091\\\\277.01\\\\75.58594\\\\233.0819\\\\277.01\\\\54.49219\\\\233.1221\\\\277.01\\\\47.46094\\\\233.1132\\\\277.01\\\\45.11719\\\\233.0766\\\\277.01\\\\43.65234\\\\232.3734\\\\277.01\\\\42.77344\\\\231.5049\\\\277.01\\\\42.03585\\\\230.0297\\\\277.01\\\\42.77344\\\\229.2833\\\\277.01\\\\45.11719\\\\228.6392\\\\277.01\\\\47.46094\\\\227.2099\\\\277.01\\\\49.80469\\\\226.1658\\\\277.01\\\\52.14844\\\\224.6817\\\\277.01\\\\54.49219\\\\223.8452\\\\277.01\\\\56.83594\\\\222.0004\\\\277.01\\\\59.17969\\\\220.4439\\\\277.01\\\\61.52344\\\\219.1271\\\\277.01\\\\63.86719\\\\217.0811\\\\277.01\\\\66.21094\\\\215.1756\\\\277.01\\\\67.88793\\\\213.6234\\\\277.01\\\\68.55469\\\\212.8797\\\\277.01\\\\70.89844\\\\210.7867\\\\277.01\\\\72.54482\\\\208.9359\\\\277.01\\\\75.58594\\\\205.6807\\\\277.01\\\\78.63421\\\\201.9047\\\\277.01\\\\80.27344\\\\199.5051\\\\277.01\\\\81.52466\\\\197.2172\\\\277.01\\\\83.37788\\\\194.8734\\\\277.01\\\\84.31507\\\\192.5297\\\\277.01\\\\85.73579\\\\190.1859\\\\277.01\\\\86.63975\\\\187.8422\\\\277.01\\\\88.17874\\\\185.4984\\\\277.01\\\\88.71944\\\\183.1547\\\\277.01\\\\89.50195\\\\180.8109\\\\277.01\\\\90.46938\\\\178.4672\\\\277.01\\\\91.07824\\\\176.1234\\\\277.01\\\\91.79828\\\\173.7797\\\\277.01\\\\92.70757\\\\171.4359\\\\277.01\\\\93.03977\\\\169.0922\\\\277.01\\\\93.52213\\\\162.0609\\\\277.01\\\\93.79673\\\\157.3734\\\\277.01\\\\93.88062\\\\152.6859\\\\277.01\\\\93.4634\\\\145.6547\\\\277.01\\\\92.9856\\\\138.6234\\\\277.01\\\\92.41903\\\\136.2797\\\\277.01\\\\91.40625\\\\133.9359\\\\277.01\\\\90.85396\\\\131.5922\\\\277.01\\\\90.15889\\\\129.2484\\\\277.01\\\\89.05895\\\\126.9047\\\\277.01\\\\88.55738\\\\124.5609\\\\277.01\\\\87.68194\\\\122.2172\\\\277.01\\\\86.25967\\\\119.8734\\\\277.01\\\\85.33871\\\\117.5297\\\\277.01\\\\84.04059\\\\115.1859\\\\277.01\\\\82.57069\\\\112.8422\\\\277.01\\\\81.18974\\\\110.4984\\\\277.01\\\\80.27344\\\\109.1834\\\\277.01\\\\77.70041\\\\105.8109\\\\277.01\\\\76.15247\\\\103.4672\\\\277.01\\\\71.9184\\\\98.77969\\\\277.01\\\\68.55469\\\\95.4427\\\\277.01\\\\63.86719\\\\91.32878\\\\277.01\\\\61.52344\\\\89.91453\\\\277.01\\\\59.17969\\\\88.0407\\\\277.01\\\\56.83594\\\\86.33517\\\\277.01\\\\54.49219\\\\85.22703\\\\277.01\\\\53.90625\\\\84.71719\\\\277.01\\\\52.14844\\\\83.53945\\\\277.01\\\\49.80469\\\\82.68647\\\\277.01\\\\47.46094\\\\81.38185\\\\277.01\\\\45.11719\\\\80.48212\\\\277.01\\\\42.77344\\\\79.08845\\\\277.01\\\\40.42969\\\\78.67566\\\\277.01\\\\38.08594\\\\78.01502\\\\277.01\\\\35.74219\\\\77.02299\\\\277.01\\\\33.39844\\\\76.44418\\\\277.01\\\\31.05469\\\\75.99764\\\\277.01\\\\26.36719\\\\74.59824\\\\277.01\\\\24.02344\\\\74.41319\\\\277.01\\\\16.99219\\\\74.11594\\\\277.01\\\\12.30469\\\\74.05871\\\\277.01\\\\7.617188\\\\74.18881\\\\277.01\\\\2.929688\\\\74.428\\\\277.01\\\\0.5859375\\\\74.75625\\\\277.01\\\\-1.757813\\\\75.58151\\\\277.01\\\\-4.101563\\\\76.20659\\\\277.01\\\\-6.445313\\\\76.63125\\\\277.01\\\\-8.789063\\\\77.37503\\\\277.01\\\\-11.13281\\\\78.3486\\\\277.01\\\\-13.47656\\\\78.8168\\\\277.01\\\\-15.82031\\\\79.47342\\\\277.01\\\\-18.16406\\\\80.87569\\\\277.01\\\\-20.50781\\\\81.76657\\\\277.01\\\\-22.85156\\\\83.13133\\\\277.01\\\\-25.19531\\\\83.96092\\\\277.01\\\\-27.53906\\\\85.77746\\\\277.01\\\\-29.88281\\\\87.03368\\\\277.01\\\\-32.22656\\\\88.52746\\\\277.01\\\\-34.57031\\\\90.49887\\\\277.01\\\\-36.2212\\\\91.74844\\\\277.01\\\\-39.02853\\\\94.09219\\\\277.01\\\\-41.60156\\\\96.38751\\\\277.01\\\\-43.955\\\\98.77969\\\\277.01\\\\-46.28906\\\\101.3187\\\\277.01\\\\-48.63281\\\\104.1332\\\\277.01\\\\-49.87989\\\\105.8109\\\\277.01\\\\-51.93118\\\\108.1547\\\\277.01\\\\-53.12213\\\\110.4984\\\\277.01\\\\-55.66406\\\\114.2724\\\\277.01\\\\-56.35877\\\\115.1859\\\\277.01\\\\-57.13709\\\\117.5297\\\\277.01\\\\-58.55372\\\\119.8734\\\\277.01\\\\-59.49023\\\\122.2172\\\\277.01\\\\-60.81275\\\\124.5609\\\\277.01\\\\-61.92934\\\\129.2484\\\\277.01\\\\-63.00622\\\\131.5922\\\\277.01\\\\-63.77141\\\\133.9359\\\\277.01\\\\-64.50639\\\\138.6234\\\\277.01\\\\-65.16927\\\\140.9672\\\\277.01\\\\-65.6146\\\\143.3109\\\\277.01\\\\-65.7933\\\\145.6547\\\\277.01\\\\-66.06516\\\\150.3422\\\\277.01\\\\-66.13699\\\\155.0297\\\\277.01\\\\-66.09879\\\\157.3734\\\\277.01\\\\-65.89844\\\\162.0609\\\\277.01\\\\-65.71338\\\\164.4047\\\\277.01\\\\-65.41684\\\\166.7484\\\\277.01\\\\-64.78502\\\\169.0922\\\\277.01\\\\-64.27641\\\\171.4359\\\\277.01\\\\-63.9314\\\\173.7797\\\\277.01\\\\-63.32528\\\\176.1234\\\\277.01\\\\-62.18676\\\\178.4672\\\\277.01\\\\-61.52936\\\\180.8109\\\\277.01\\\\-61.08647\\\\183.1547\\\\277.01\\\\-59.75184\\\\185.4984\\\\277.01\\\\-58.89447\\\\187.8422\\\\277.01\\\\-57.47786\\\\190.1859\\\\277.01\\\\-56.72234\\\\192.5297\\\\277.01\\\\-55.0424\\\\194.8734\\\\277.01\\\\-53.77855\\\\197.2172\\\\277.01\\\\-52.24194\\\\199.5609\\\\277.01\\\\-50.4126\\\\201.9047\\\\277.01\\\\-48.63281\\\\204.3003\\\\277.01\\\\-47.03415\\\\206.5922\\\\277.01\\\\-42.56292\\\\211.2797\\\\277.01\\\\-39.25781\\\\214.4452\\\\277.01\\\\-36.91406\\\\216.3386\\\\277.01\\\\-34.26873\\\\218.3109\\\\277.01\\\\-29.88281\\\\221.4518\\\\277.01\\\\-27.53906\\\\223.027\\\\277.01\\\\-25.19531\\\\224.3439\\\\277.01\\\\-23.14453\\\\225.3422\\\\277.01\\\\-20.50781\\\\226.7399\\\\277.01\\\\-18.16406\\\\228.2227\\\\277.01\\\\-15.82031\\\\229.069\\\\277.01\\\\-14.3044\\\\230.0297\\\\277.01\\\\-15.82031\\\\231.8656\\\\277.01\\\\-16.46402\\\\232.3734\\\\277.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"374\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-95.50781\\\\233.1042\\\\280.01\\\\-97.85156\\\\234.0105\\\\280.01\\\\-100.1953\\\\233.4044\\\\280.01\\\\-102.5391\\\\234.062\\\\280.01\\\\-104.8828\\\\233.3561\\\\280.01\\\\-109.5703\\\\234.1651\\\\280.01\\\\-111.9141\\\\234.0722\\\\280.01\\\\-116.6016\\\\234.0411\\\\280.01\\\\-121.2891\\\\234.0855\\\\280.01\\\\-128.3203\\\\234.0672\\\\280.01\\\\-135.3516\\\\234.1266\\\\280.01\\\\-140.0391\\\\234.1078\\\\280.01\\\\-142.3828\\\\234.1741\\\\280.01\\\\-149.4141\\\\234.0642\\\\280.01\\\\-156.4453\\\\234.1132\\\\280.01\\\\-163.4766\\\\234.0613\\\\280.01\\\\-165.8203\\\\234.1313\\\\280.01\\\\-168.1641\\\\234.3108\\\\280.01\\\\-177.5391\\\\234.3173\\\\280.01\\\\-182.2266\\\\234.2721\\\\280.01\\\\-186.9141\\\\234.3703\\\\280.01\\\\-191.6016\\\\234.3837\\\\280.01\\\\-198.6328\\\\234.3084\\\\280.01\\\\-200.9766\\\\234.3389\\\\280.01\\\\-208.0078\\\\234.2822\\\\280.01\\\\-217.3828\\\\234.3296\\\\280.01\\\\-219.7266\\\\234.3758\\\\280.01\\\\-229.1016\\\\234.3389\\\\280.01\\\\-233.7891\\\\234.2125\\\\280.01\\\\-240.8203\\\\234.2537\\\\280.01\\\\-243.1641\\\\234.2967\\\\280.01\\\\-247.8516\\\\234.0375\\\\280.01\\\\-250.1953\\\\234.1916\\\\280.01\\\\-252.181\\\\234.7172\\\\280.01\\\\-252.5391\\\\235.6379\\\\280.01\\\\-254.1504\\\\234.7172\\\\280.01\\\\-254.8828\\\\234.668\\\\280.01\\\\-259.5703\\\\236.2655\\\\280.01\\\\-260.5737\\\\237.0609\\\\280.01\\\\-262.3019\\\\239.4047\\\\280.01\\\\-262.5477\\\\241.7484\\\\280.01\\\\-261.5577\\\\244.0922\\\\280.01\\\\-260.8438\\\\246.4359\\\\280.01\\\\-259.5991\\\\248.7797\\\\280.01\\\\-254.8828\\\\253.9193\\\\280.01\\\\-253.2919\\\\255.8109\\\\280.01\\\\-250.1953\\\\258.8925\\\\280.01\\\\-247.8516\\\\261.4312\\\\280.01\\\\-246.2802\\\\262.8422\\\\280.01\\\\-244.138\\\\265.1859\\\\280.01\\\\-240.8203\\\\268.3534\\\\280.01\\\\-239.3737\\\\269.8734\\\\280.01\\\\-236.938\\\\272.2172\\\\280.01\\\\-233.7891\\\\275.3765\\\\280.01\\\\-231.4453\\\\277.7994\\\\280.01\\\\-229.1016\\\\279.9918\\\\280.01\\\\-226.7578\\\\282.4992\\\\280.01\\\\-225.119\\\\283.9359\\\\280.01\\\\-222.0703\\\\287.169\\\\280.01\\\\-220.4806\\\\288.6234\\\\280.01\\\\-218.2311\\\\290.9672\\\\280.01\\\\-217.3828\\\\291.613\\\\280.01\\\\-215.0391\\\\292.8596\\\\280.01\\\\-214.5047\\\\293.3109\\\\280.01\\\\-212.6953\\\\294.459\\\\280.01\\\\-210.3516\\\\295.1842\\\\280.01\\\\-208.0078\\\\296.4338\\\\280.01\\\\-205.6641\\\\296.8595\\\\280.01\\\\-203.3203\\\\297.1639\\\\280.01\\\\-196.2891\\\\297.1563\\\\280.01\\\\-193.9453\\\\297.0622\\\\280.01\\\\-184.5703\\\\296.9731\\\\280.01\\\\-172.8516\\\\296.8959\\\\280.01\\\\-165.8203\\\\296.9125\\\\280.01\\\\-161.1328\\\\296.8904\\\\280.01\\\\-156.4453\\\\296.9295\\\\280.01\\\\-144.7266\\\\296.9097\\\\280.01\\\\-137.6953\\\\296.9173\\\\280.01\\\\-125.9766\\\\296.8528\\\\280.01\\\\-118.9453\\\\296.8629\\\\280.01\\\\-116.6016\\\\296.8357\\\\280.01\\\\-109.5703\\\\296.8723\\\\280.01\\\\-102.5391\\\\296.8266\\\\280.01\\\\-93.16406\\\\296.7973\\\\280.01\\\\-76.75781\\\\296.8647\\\\280.01\\\\-72.07031\\\\296.9145\\\\280.01\\\\-67.38281\\\\296.9028\\\\280.01\\\\-65.03906\\\\296.9514\\\\280.01\\\\-60.35156\\\\296.9322\\\\280.01\\\\-55.66406\\\\296.9622\\\\280.01\\\\-53.32031\\\\296.925\\\\280.01\\\\-48.63281\\\\296.9622\\\\280.01\\\\-46.28906\\\\296.8973\\\\280.01\\\\-41.60156\\\\296.9067\\\\280.01\\\\-39.25781\\\\297.0439\\\\280.01\\\\-36.91406\\\\296.9267\\\\280.01\\\\-34.57031\\\\297.1128\\\\280.01\\\\-32.22656\\\\296.9926\\\\280.01\\\\-29.88281\\\\297.3952\\\\280.01\\\\-27.53906\\\\297.0591\\\\280.01\\\\-25.19531\\\\297.3984\\\\280.01\\\\-22.85156\\\\297.0809\\\\280.01\\\\-20.50781\\\\297.0809\\\\280.01\\\\-18.16406\\\\297.3798\\\\280.01\\\\-13.47656\\\\297.4022\\\\280.01\\\\-11.13281\\\\297.2922\\\\280.01\\\\-8.789063\\\\297.4125\\\\280.01\\\\-4.101563\\\\297.3691\\\\280.01\\\\-1.757813\\\\297.4334\\\\280.01\\\\0.5859375\\\\297.3911\\\\280.01\\\\2.929688\\\\297.106\\\\280.01\\\\5.273438\\\\297.1626\\\\280.01\\\\7.617188\\\\297.409\\\\280.01\\\\9.960938\\\\297.3879\\\\280.01\\\\12.30469\\\\296.9377\\\\280.01\\\\14.64844\\\\297.0091\\\\280.01\\\\16.99219\\\\296.9358\\\\280.01\\\\19.33594\\\\297.0362\\\\280.01\\\\21.67969\\\\296.8867\\\\280.01\\\\24.02344\\\\297.1195\\\\280.01\\\\26.36719\\\\296.8762\\\\280.01\\\\33.39844\\\\296.8961\\\\280.01\\\\42.77344\\\\296.8163\\\\280.01\\\\56.83594\\\\296.6724\\\\280.01\\\\63.86719\\\\296.6577\\\\280.01\\\\68.55469\\\\296.5859\\\\280.01\\\\70.89844\\\\296.6028\\\\280.01\\\\77.92969\\\\296.5441\\\\280.01\\\\84.96094\\\\296.549\\\\280.01\\\\96.67969\\\\296.5208\\\\280.01\\\\101.3672\\\\296.4462\\\\280.01\\\\103.7109\\\\296.4668\\\\280.01\\\\113.0859\\\\296.4189\\\\280.01\\\\122.4609\\\\296.3348\\\\280.01\\\\136.5234\\\\296.2873\\\\280.01\\\\138.8672\\\\295.8791\\\\280.01\\\\141.2109\\\\296.1963\\\\280.01\\\\145.8984\\\\295.8486\\\\280.01\\\\148.2422\\\\295.9009\\\\280.01\\\\150.5859\\\\295.8172\\\\280.01\\\\155.2734\\\\295.8791\\\\280.01\\\\162.3047\\\\295.7684\\\\280.01\\\\164.6484\\\\295.7684\\\\280.01\\\\183.3984\\\\295.557\\\\280.01\\\\192.7734\\\\295.557\\\\280.01\\\\197.4609\\\\295.8172\\\\280.01\\\\202.1484\\\\295.7516\\\\280.01\\\\204.4922\\\\295.4439\\\\280.01\\\\206.8359\\\\294.8185\\\\280.01\\\\209.1797\\\\294.3583\\\\280.01\\\\211.5234\\\\292.4108\\\\280.01\\\\213.8672\\\\291.0471\\\\280.01\\\\216.2109\\\\289.452\\\\280.01\\\\217.0839\\\\288.6234\\\\280.01\\\\218.5547\\\\286.9506\\\\280.01\\\\221.5668\\\\283.9359\\\\280.01\\\\225.5859\\\\279.7481\\\\280.01\\\\227.9297\\\\277.4546\\\\280.01\\\\230.2734\\\\274.9423\\\\280.01\\\\233.0475\\\\272.2172\\\\280.01\\\\234.9609\\\\270.1762\\\\280.01\\\\237.5903\\\\267.5297\\\\280.01\\\\242.1654\\\\262.8422\\\\280.01\\\\244.3673\\\\260.4984\\\\280.01\\\\246.773\\\\258.1547\\\\280.01\\\\249.0142\\\\255.8109\\\\280.01\\\\251.3672\\\\253.4397\\\\280.01\\\\253.7109\\\\250.8472\\\\280.01\\\\255.4546\\\\248.7797\\\\280.01\\\\257.1065\\\\246.4359\\\\280.01\\\\259.3784\\\\244.0922\\\\280.01\\\\260.9815\\\\239.4047\\\\280.01\\\\260.4452\\\\237.0609\\\\280.01\\\\259.4202\\\\234.7172\\\\280.01\\\\258.3984\\\\233.7341\\\\280.01\\\\256.0547\\\\233.1091\\\\280.01\\\\253.7109\\\\232.7821\\\\280.01\\\\251.3672\\\\232.8781\\\\280.01\\\\249.0234\\\\232.6162\\\\280.01\\\\244.3359\\\\232.7025\\\\280.01\\\\241.9922\\\\232.9379\\\\280.01\\\\237.3047\\\\233.0766\\\\280.01\\\\234.9609\\\\233.0108\\\\280.01\\\\232.6172\\\\233.0402\\\\280.01\\\\227.9297\\\\233.0108\\\\280.01\\\\225.5859\\\\233.0498\\\\280.01\\\\211.5234\\\\233.0819\\\\280.01\\\\206.8359\\\\232.9594\\\\280.01\\\\204.4922\\\\232.7588\\\\280.01\\\\202.1484\\\\232.7848\\\\280.01\\\\183.3984\\\\232.8852\\\\280.01\\\\178.7109\\\\232.8467\\\\280.01\\\\162.3047\\\\232.8003\\\\280.01\\\\159.9609\\\\232.8253\\\\280.01\\\\143.5547\\\\232.8376\\\\280.01\\\\141.2109\\\\232.7746\\\\280.01\\\\136.5234\\\\232.7975\\\\280.01\\\\131.8359\\\\232.7322\\\\280.01\\\\127.1484\\\\232.7614\\\\280.01\\\\124.8047\\\\232.721\\\\280.01\\\\120.1172\\\\232.7481\\\\280.01\\\\113.0859\\\\232.7071\\\\280.01\\\\106.0547\\\\232.721\\\\280.01\\\\103.7109\\\\232.9629\\\\280.01\\\\101.3672\\\\232.9735\\\\280.01\\\\96.67969\\\\233.0819\\\\280.01\\\\82.61719\\\\233.1001\\\\280.01\\\\77.92969\\\\233.0726\\\\280.01\\\\73.24219\\\\233.1132\\\\280.01\\\\63.86719\\\\233.1221\\\\280.01\\\\56.83594\\\\233.0951\\\\280.01\\\\47.46094\\\\233.1221\\\\280.01\\\\45.11719\\\\233.0726\\\\280.01\\\\44.1779\\\\232.3734\\\\280.01\\\\42.77344\\\\230.9901\\\\280.01\\\\42.0716\\\\230.0297\\\\280.01\\\\42.77344\\\\229.2739\\\\280.01\\\\45.11719\\\\228.632\\\\280.01\\\\47.46094\\\\227.1643\\\\280.01\\\\49.80469\\\\226.1565\\\\280.01\\\\52.14844\\\\224.6574\\\\280.01\\\\54.49219\\\\223.8228\\\\280.01\\\\56.83594\\\\221.9803\\\\280.01\\\\59.17969\\\\220.4287\\\\280.01\\\\61.52344\\\\219.0851\\\\280.01\\\\62.3638\\\\218.3109\\\\280.01\\\\66.21094\\\\215.1389\\\\280.01\\\\67.85556\\\\213.6234\\\\280.01\\\\68.55469\\\\212.8447\\\\280.01\\\\70.89844\\\\210.758\\\\280.01\\\\72.51065\\\\208.9359\\\\280.01\\\\75.58594\\\\205.632\\\\280.01\\\\78.58622\\\\201.9047\\\\280.01\\\\80.27344\\\\199.4393\\\\280.01\\\\81.50667\\\\197.2172\\\\280.01\\\\83.34528\\\\194.8734\\\\280.01\\\\84.28662\\\\192.5297\\\\280.01\\\\85.68763\\\\190.1859\\\\280.01\\\\86.60807\\\\187.8422\\\\280.01\\\\88.12763\\\\185.4984\\\\280.01\\\\88.70493\\\\183.1547\\\\280.01\\\\89.40742\\\\180.8109\\\\280.01\\\\90.42329\\\\178.4672\\\\280.01\\\\91.73814\\\\173.7797\\\\280.01\\\\92.66084\\\\171.4359\\\\280.01\\\\93.0161\\\\169.0922\\\\280.01\\\\93.30299\\\\164.4047\\\\280.01\\\\93.50073\\\\162.0609\\\\280.01\\\\93.76065\\\\157.3734\\\\280.01\\\\93.84212\\\\155.0297\\\\280.01\\\\93.83057\\\\152.6859\\\\280.01\\\\93.44278\\\\145.6547\\\\280.01\\\\92.97371\\\\138.6234\\\\280.01\\\\92.3933\\\\136.2797\\\\280.01\\\\91.39597\\\\133.9359\\\\280.01\\\\90.83705\\\\131.5922\\\\280.01\\\\90.15889\\\\129.2484\\\\280.01\\\\89.05895\\\\126.9047\\\\280.01\\\\88.55198\\\\124.5609\\\\280.01\\\\87.66837\\\\122.2172\\\\280.01\\\\86.27174\\\\119.8734\\\\280.01\\\\85.36424\\\\117.5297\\\\280.01\\\\84.03852\\\\115.1859\\\\280.01\\\\81.2221\\\\110.4984\\\\280.01\\\\80.27344\\\\109.1401\\\\280.01\\\\77.76597\\\\105.8109\\\\280.01\\\\76.17959\\\\103.4672\\\\280.01\\\\74.11412\\\\101.1234\\\\280.01\\\\71.95528\\\\98.77969\\\\280.01\\\\68.55469\\\\95.41232\\\\280.01\\\\66.21094\\\\93.31791\\\\280.01\\\\63.86719\\\\91.31586\\\\280.01\\\\61.52344\\\\89.8781\\\\280.01\\\\61.00544\\\\89.40469\\\\280.01\\\\56.83594\\\\86.32603\\\\280.01\\\\54.49219\\\\85.22374\\\\280.01\\\\53.91059\\\\84.71719\\\\280.01\\\\52.14844\\\\83.52773\\\\280.01\\\\49.80469\\\\82.67247\\\\280.01\\\\47.46094\\\\81.38185\\\\280.01\\\\45.11719\\\\80.45787\\\\280.01\\\\42.77344\\\\79.08102\\\\280.01\\\\40.42969\\\\78.68263\\\\280.01\\\\38.08594\\\\78.00113\\\\280.01\\\\35.74219\\\\76.98543\\\\280.01\\\\33.39844\\\\76.44418\\\\280.01\\\\31.05469\\\\75.99764\\\\280.01\\\\28.71094\\\\75.21002\\\\280.01\\\\26.36719\\\\74.59824\\\\280.01\\\\24.02344\\\\74.40105\\\\280.01\\\\14.64844\\\\74.0463\\\\280.01\\\\9.960938\\\\74.09591\\\\280.01\\\\5.273438\\\\74.27516\\\\280.01\\\\2.929688\\\\74.42056\\\\280.01\\\\0.5859375\\\\74.75625\\\\280.01\\\\-1.757813\\\\75.52052\\\\280.01\\\\-4.101563\\\\76.1918\\\\280.01\\\\-6.445313\\\\76.61909\\\\280.01\\\\-8.789063\\\\77.32118\\\\280.01\\\\-11.13281\\\\78.33466\\\\280.01\\\\-13.47656\\\\78.80508\\\\280.01\\\\-15.82031\\\\79.44011\\\\280.01\\\\-18.16406\\\\80.84683\\\\280.01\\\\-20.50781\\\\81.74243\\\\280.01\\\\-22.85156\\\\83.11391\\\\280.01\\\\-25.19531\\\\83.92464\\\\280.01\\\\-27.53906\\\\85.7457\\\\280.01\\\\-29.88281\\\\86.96401\\\\280.01\\\\-32.22656\\\\88.49249\\\\280.01\\\\-34.57031\\\\90.47998\\\\280.01\\\\-36.28038\\\\91.74844\\\\280.01\\\\-39.07948\\\\94.09219\\\\280.01\\\\-41.60156\\\\96.27657\\\\280.01\\\\-44.03106\\\\98.77969\\\\280.01\\\\-46.28906\\\\101.2371\\\\280.01\\\\-48.63281\\\\104.0658\\\\280.01\\\\-49.94405\\\\105.8109\\\\280.01\\\\-51.96513\\\\108.1547\\\\280.01\\\\-53.18715\\\\110.4984\\\\280.01\\\\-54.74057\\\\112.8422\\\\280.01\\\\-56.42476\\\\115.1859\\\\280.01\\\\-57.19754\\\\117.5297\\\\280.01\\\\-58.65653\\\\119.8734\\\\280.01\\\\-59.544\\\\122.2172\\\\280.01\\\\-60.8896\\\\124.5609\\\\280.01\\\\-62.0208\\\\129.2484\\\\280.01\\\\-63.12626\\\\131.5922\\\\280.01\\\\-63.84518\\\\133.9359\\\\280.01\\\\-64.19696\\\\136.2797\\\\280.01\\\\-64.66129\\\\138.6234\\\\280.01\\\\-65.33604\\\\140.9672\\\\280.01\\\\-65.68493\\\\143.3109\\\\280.01\\\\-66.13839\\\\150.3422\\\\280.01\\\\-66.21657\\\\155.0297\\\\280.01\\\\-66.17729\\\\157.3734\\\\280.01\\\\-65.96361\\\\162.0609\\\\280.01\\\\-65.54951\\\\166.7484\\\\280.01\\\\-64.3463\\\\171.4359\\\\280.01\\\\-63.998\\\\173.7797\\\\280.01\\\\-63.46595\\\\176.1234\\\\280.01\\\\-62.32813\\\\178.4672\\\\280.01\\\\-61.61405\\\\180.8109\\\\280.01\\\\-61.15642\\\\183.1547\\\\280.01\\\\-59.86389\\\\185.4984\\\\280.01\\\\-58.95148\\\\187.8422\\\\280.01\\\\-57.52841\\\\190.1859\\\\280.01\\\\-56.74625\\\\192.5297\\\\280.01\\\\-55.1036\\\\194.8734\\\\280.01\\\\-53.84033\\\\197.2172\\\\280.01\\\\-52.26687\\\\199.5609\\\\280.01\\\\-48.63281\\\\204.3615\\\\280.01\\\\-47.1009\\\\206.5922\\\\280.01\\\\-42.59905\\\\211.2797\\\\280.01\\\\-39.25781\\\\214.5093\\\\280.01\\\\-36.91406\\\\216.3794\\\\280.01\\\\-34.31858\\\\218.3109\\\\280.01\\\\-29.88281\\\\221.4737\\\\280.01\\\\-27.53906\\\\223.0821\\\\280.01\\\\-25.19531\\\\224.3511\\\\280.01\\\\-20.50781\\\\226.7643\\\\280.01\\\\-18.16406\\\\228.2682\\\\280.01\\\\-15.82031\\\\229.0908\\\\280.01\\\\-14.92839\\\\230.0297\\\\280.01\\\\-15.82031\\\\231.4137\\\\280.01\\\\-16.95631\\\\232.3734\\\\280.01\\\\-18.16406\\\\233.0537\\\\280.01\\\\-20.50781\\\\233.0951\\\\280.01\\\\-39.25781\\\\233.1397\\\\280.01\\\\-43.94531\\\\233.1221\\\\280.01\\\\-53.32031\\\\233.1736\\\\280.01\\\\-60.35156\\\\233.1736\\\\280.01\\\\-65.03906\\\\232.9735\\\\280.01\\\\-74.41406\\\\233.0441\\\\280.01\\\\-79.10156\\\\233.0145\\\\280.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"354\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0766\\\\283.01\\\\-27.53906\\\\233.1221\\\\283.01\\\\-32.22656\\\\233.1042\\\\283.01\\\\-39.25781\\\\233.1397\\\\283.01\\\\-48.63281\\\\233.131\\\\283.01\\\\-53.32031\\\\233.1652\\\\283.01\\\\-60.35156\\\\233.1652\\\\283.01\\\\-62.69531\\\\233.0576\\\\283.01\\\\-65.03906\\\\232.8497\\\\283.01\\\\-67.38281\\\\232.9304\\\\283.01\\\\-74.41406\\\\233.0245\\\\283.01\\\\-86.13281\\\\232.9942\\\\283.01\\\\-88.47656\\\\233.0479\\\\283.01\\\\-97.85156\\\\233.0992\\\\283.01\\\\-107.2266\\\\233.1132\\\\283.01\\\\-109.5703\\\\233.2337\\\\283.01\\\\-111.9141\\\\233.9859\\\\283.01\\\\-116.6016\\\\233.9503\\\\283.01\\\\-121.2891\\\\234.0035\\\\283.01\\\\-130.6641\\\\234.0088\\\\283.01\\\\-135.3516\\\\234.0855\\\\283.01\\\\-140.0391\\\\234.0722\\\\283.01\\\\-142.3828\\\\234.1266\\\\283.01\\\\-149.4141\\\\234.0211\\\\283.01\\\\-151.7578\\\\234.0591\\\\283.01\\\\-161.1328\\\\234.0243\\\\283.01\\\\-165.8203\\\\234.0691\\\\283.01\\\\-168.1641\\\\234.2175\\\\283.01\\\\-172.8516\\\\234.2252\\\\283.01\\\\-175.1953\\\\234.1797\\\\283.01\\\\-179.8828\\\\234.2112\\\\283.01\\\\-184.5703\\\\234.2869\\\\283.01\\\\-191.6016\\\\234.2721\\\\283.01\\\\-198.6328\\\\234.2187\\\\283.01\\\\-200.9766\\\\234.2902\\\\283.01\\\\-205.6641\\\\234.205\\\\283.01\\\\-210.3516\\\\234.1861\\\\283.01\\\\-212.6953\\\\234.2398\\\\283.01\\\\-219.7266\\\\234.3115\\\\283.01\\\\-229.1016\\\\234.3235\\\\283.01\\\\-233.7891\\\\234.2362\\\\283.01\\\\-236.1328\\\\234.2789\\\\283.01\\\\-243.1641\\\\234.2502\\\\283.01\\\\-247.8516\\\\233.9138\\\\283.01\\\\-250.1953\\\\234.1229\\\\283.01\\\\-254.8828\\\\234.6658\\\\283.01\\\\-257.2266\\\\235.4369\\\\283.01\\\\-259.5703\\\\236.3773\\\\283.01\\\\-260.3961\\\\237.0609\\\\283.01\\\\-262.014\\\\239.4047\\\\283.01\\\\-262.2271\\\\241.7484\\\\283.01\\\\-261.3423\\\\244.0922\\\\283.01\\\\-260.8191\\\\246.4359\\\\283.01\\\\-259.7416\\\\248.7797\\\\283.01\\\\-257.5902\\\\251.1234\\\\283.01\\\\-255.5257\\\\253.4672\\\\283.01\\\\-252.5391\\\\256.6338\\\\283.01\\\\-250.1953\\\\258.856\\\\283.01\\\\-247.8516\\\\261.3733\\\\283.01\\\\-246.2019\\\\262.8422\\\\283.01\\\\-243.1641\\\\266.1315\\\\283.01\\\\-241.6046\\\\267.5297\\\\283.01\\\\-239.419\\\\269.8734\\\\283.01\\\\-236.9491\\\\272.2172\\\\283.01\\\\-233.7891\\\\275.3661\\\\283.01\\\\-231.4453\\\\277.8091\\\\283.01\\\\-229.1016\\\\280.0036\\\\283.01\\\\-226.7578\\\\282.509\\\\283.01\\\\-225.1317\\\\283.9359\\\\283.01\\\\-222.0703\\\\287.1792\\\\283.01\\\\-220.4806\\\\288.6234\\\\283.01\\\\-218.2311\\\\290.9672\\\\283.01\\\\-217.3828\\\\291.613\\\\283.01\\\\-215.0391\\\\292.905\\\\283.01\\\\-212.6953\\\\294.4828\\\\283.01\\\\-210.3516\\\\295.2615\\\\283.01\\\\-208.0078\\\\296.4508\\\\283.01\\\\-205.6641\\\\296.8789\\\\283.01\\\\-203.3203\\\\297.1639\\\\283.01\\\\-196.2891\\\\297.1563\\\\283.01\\\\-191.6016\\\\297.023\\\\283.01\\\\-189.2578\\\\297.0306\\\\283.01\\\\-182.2266\\\\296.948\\\\283.01\\\\-172.8516\\\\296.9022\\\\283.01\\\\-158.7891\\\\296.8988\\\\283.01\\\\-147.0703\\\\296.9323\\\\283.01\\\\-142.3828\\\\296.9074\\\\283.01\\\\-133.0078\\\\296.92\\\\283.01\\\\-123.6328\\\\296.8528\\\\283.01\\\\-116.6016\\\\296.8356\\\\283.01\\\\-111.9141\\\\296.8723\\\\283.01\\\\-100.1953\\\\296.8075\\\\283.01\\\\-74.41406\\\\296.8938\\\\283.01\\\\-67.38281\\\\296.9028\\\\283.01\\\\-62.69531\\\\296.96\\\\283.01\\\\-58.00781\\\\296.9234\\\\283.01\\\\-41.60156\\\\296.9081\\\\283.01\\\\-36.91406\\\\297.0328\\\\283.01\\\\-34.57031\\\\297.3842\\\\283.01\\\\-32.22656\\\\297.1128\\\\283.01\\\\-27.53906\\\\297.3192\\\\283.01\\\\-25.19531\\\\296.9926\\\\283.01\\\\-20.50781\\\\297.1747\\\\283.01\\\\-18.16406\\\\297.3531\\\\283.01\\\\-15.82031\\\\297.4125\\\\283.01\\\\-6.445313\\\\297.4125\\\\283.01\\\\-4.101563\\\\297.257\\\\283.01\\\\-1.757813\\\\297.4229\\\\283.01\\\\9.960938\\\\297.4125\\\\283.01\\\\12.30469\\\\296.9377\\\\283.01\\\\16.99219\\\\296.9467\\\\283.01\\\\21.67969\\\\296.8877\\\\283.01\\\\33.39844\\\\296.8771\\\\283.01\\\\40.42969\\\\296.8369\\\\283.01\\\\45.11719\\\\296.7643\\\\283.01\\\\52.14844\\\\296.7021\\\\283.01\\\\56.83594\\\\296.6906\\\\283.01\\\\68.55469\\\\296.5732\\\\283.01\\\\75.58594\\\\296.5859\\\\283.01\\\\77.92969\\\\296.5441\\\\283.01\\\\84.96094\\\\296.5441\\\\283.01\\\\87.30469\\\\296.4813\\\\283.01\\\\91.99219\\\\296.5154\\\\283.01\\\\110.7422\\\\296.4051\\\\283.01\\\\117.7734\\\\296.3495\\\\283.01\\\\129.4922\\\\296.2929\\\\283.01\\\\131.8359\\\\296.3023\\\\283.01\\\\136.5234\\\\295.8486\\\\283.01\\\\143.5547\\\\295.864\\\\283.01\\\\152.9297\\\\295.8012\\\\283.01\\\\155.2734\\\\295.8486\\\\283.01\\\\164.6484\\\\295.6998\\\\283.01\\\\169.3359\\\\295.7173\\\\283.01\\\\176.3672\\\\295.5916\\\\283.01\\\\188.0859\\\\295.5235\\\\283.01\\\\192.7734\\\\295.5401\\\\283.01\\\\197.4609\\\\295.833\\\\283.01\\\\202.1484\\\\295.7516\\\\283.01\\\\204.4922\\\\295.4439\\\\283.01\\\\206.8359\\\\294.8185\\\\283.01\\\\209.1797\\\\294.3532\\\\283.01\\\\211.5234\\\\292.4178\\\\283.01\\\\213.8672\\\\291.0471\\\\283.01\\\\216.2109\\\\289.437\\\\283.01\\\\217.074\\\\288.6234\\\\283.01\\\\218.5547\\\\286.9377\\\\283.01\\\\221.5668\\\\283.9359\\\\283.01\\\\225.5859\\\\279.7481\\\\283.01\\\\227.9297\\\\277.4225\\\\283.01\\\\230.2734\\\\274.9423\\\\283.01\\\\233.014\\\\272.2172\\\\283.01\\\\234.9609\\\\270.1737\\\\283.01\\\\237.6074\\\\267.5297\\\\283.01\\\\244.4276\\\\260.4984\\\\283.01\\\\246.7938\\\\258.1547\\\\283.01\\\\251.3978\\\\253.4672\\\\283.01\\\\253.7109\\\\250.8942\\\\283.01\\\\255.4174\\\\248.7797\\\\283.01\\\\257.0561\\\\246.4359\\\\283.01\\\\259.226\\\\244.0922\\\\283.01\\\\260.0378\\\\241.7484\\\\283.01\\\\260.5957\\\\239.4047\\\\283.01\\\\260.2749\\\\237.0609\\\\283.01\\\\259.2681\\\\234.7172\\\\283.01\\\\258.3984\\\\233.8742\\\\283.01\\\\256.0547\\\\233.2096\\\\283.01\\\\253.7109\\\\232.7947\\\\283.01\\\\251.3672\\\\232.6745\\\\283.01\\\\246.6797\\\\232.7162\\\\283.01\\\\244.3359\\\\232.6725\\\\283.01\\\\241.9922\\\\232.927\\\\283.01\\\\239.6484\\\\233.0007\\\\283.01\\\\230.2734\\\\233.0007\\\\283.01\\\\216.2109\\\\233.0819\\\\283.01\\\\209.1797\\\\233.0726\\\\283.01\\\\206.8359\\\\232.9839\\\\283.01\\\\204.4922\\\\232.7588\\\\283.01\\\\199.8047\\\\232.7719\\\\283.01\\\\195.1172\\\\232.8346\\\\283.01\\\\185.7422\\\\232.8346\\\\283.01\\\\183.3984\\\\232.8617\\\\283.01\\\\176.3672\\\\232.8224\\\\283.01\\\\174.0234\\\\232.8497\\\\283.01\\\\162.3047\\\\232.8003\\\\283.01\\\\159.9609\\\\232.8376\\\\283.01\\\\155.2734\\\\232.8253\\\\283.01\\\\145.8984\\\\232.8497\\\\283.01\\\\138.8672\\\\232.7588\\\\283.01\\\\136.5234\\\\232.7975\\\\283.01\\\\131.8359\\\\232.7456\\\\283.01\\\\122.4609\\\\232.7746\\\\283.01\\\\117.7734\\\\232.7186\\\\283.01\\\\106.0547\\\\232.721\\\\283.01\\\\103.7109\\\\232.9735\\\\283.01\\\\101.3672\\\\232.9735\\\\283.01\\\\99.02344\\\\233.0766\\\\283.01\\\\89.64844\\\\233.0726\\\\283.01\\\\82.61719\\\\233.1091\\\\283.01\\\\77.92969\\\\233.0766\\\\283.01\\\\75.58594\\\\233.1042\\\\283.01\\\\63.86719\\\\233.131\\\\283.01\\\\56.83594\\\\233.1042\\\\283.01\\\\54.49219\\\\233.131\\\\283.01\\\\45.11719\\\\233.0726\\\\283.01\\\\44.18501\\\\232.3734\\\\283.01\\\\42.77344\\\\230.9932\\\\283.01\\\\42.06263\\\\230.0297\\\\283.01\\\\42.77344\\\\229.2645\\\\283.01\\\\45.11719\\\\228.6247\\\\283.01\\\\47.46094\\\\227.1533\\\\283.01\\\\49.80469\\\\226.1347\\\\283.01\\\\52.14844\\\\224.6675\\\\283.01\\\\54.49219\\\\223.8092\\\\283.01\\\\56.83594\\\\221.9546\\\\283.01\\\\59.17969\\\\220.3699\\\\283.01\\\\61.52344\\\\219.056\\\\283.01\\\\62.3228\\\\218.3109\\\\283.01\\\\66.21094\\\\215.1232\\\\283.01\\\\67.84627\\\\213.6234\\\\283.01\\\\68.55469\\\\212.8298\\\\283.01\\\\70.89844\\\\210.6976\\\\283.01\\\\74.68501\\\\206.5922\\\\283.01\\\\76.71939\\\\204.2484\\\\283.01\\\\78.54079\\\\201.9047\\\\283.01\\\\80.27344\\\\199.3159\\\\283.01\\\\81.47583\\\\197.2172\\\\283.01\\\\83.28172\\\\194.8734\\\\283.01\\\\84.25013\\\\192.5297\\\\283.01\\\\85.65463\\\\190.1859\\\\283.01\\\\86.55134\\\\187.8422\\\\283.01\\\\88.09267\\\\185.4984\\\\283.01\\\\89.37801\\\\180.8109\\\\283.01\\\\90.42329\\\\178.4672\\\\283.01\\\\91.70932\\\\173.7797\\\\283.01\\\\92.6346\\\\171.4359\\\\283.01\\\\93.02129\\\\169.0922\\\\283.01\\\\93.30979\\\\164.4047\\\\283.01\\\\93.6478\\\\159.7172\\\\283.01\\\\93.86867\\\\155.0297\\\\283.01\\\\93.75715\\\\150.3422\\\\283.01\\\\93.46669\\\\145.6547\\\\283.01\\\\93.27223\\\\143.3109\\\\283.01\\\\92.9856\\\\138.6234\\\\283.01\\\\92.43455\\\\136.2797\\\\283.01\\\\91.41665\\\\133.9359\\\\283.01\\\\90.85938\\\\131.5922\\\\283.01\\\\90.19202\\\\129.2484\\\\283.01\\\\89.08047\\\\126.9047\\\\283.01\\\\88.56892\\\\124.5609\\\\283.01\\\\87.69531\\\\122.2172\\\\283.01\\\\86.27174\\\\119.8734\\\\283.01\\\\85.33871\\\\117.5297\\\\283.01\\\\84.03852\\\\115.1859\\\\283.01\\\\81.2221\\\\110.4984\\\\283.01\\\\80.27344\\\\109.1604\\\\283.01\\\\77.73295\\\\105.8109\\\\283.01\\\\76.16416\\\\103.4672\\\\283.01\\\\74.09638\\\\101.1234\\\\283.01\\\\71.9184\\\\98.77969\\\\283.01\\\\68.55469\\\\95.4427\\\\283.01\\\\66.21094\\\\93.35094\\\\283.01\\\\63.86719\\\\91.35781\\\\283.01\\\\61.52344\\\\89.90582\\\\283.01\\\\59.17969\\\\88.0407\\\\283.01\\\\56.83594\\\\86.3728\\\\283.01\\\\54.49219\\\\85.23886\\\\283.01\\\\52.14844\\\\83.56911\\\\283.01\\\\49.80469\\\\82.70029\\\\283.01\\\\47.46094\\\\81.4009\\\\283.01\\\\45.11719\\\\80.45787\\\\283.01\\\\42.77344\\\\79.09343\\\\283.01\\\\40.42969\\\\78.69472\\\\283.01\\\\38.08594\\\\78.00113\\\\283.01\\\\35.74219\\\\77.01344\\\\283.01\\\\33.39844\\\\76.44418\\\\283.01\\\\31.05469\\\\76.01651\\\\283.01\\\\28.71094\\\\75.22678\\\\283.01\\\\26.36719\\\\74.61642\\\\283.01\\\\24.02344\\\\74.40105\\\\283.01\\\\14.64844\\\\74.05312\\\\283.01\\\\9.960938\\\\74.09591\\\\283.01\\\\2.929688\\\\74.41573\\\\283.01\\\\0.5859375\\\\74.74547\\\\283.01\\\\-4.101563\\\\76.1767\\\\283.01\\\\-6.445313\\\\76.62514\\\\283.01\\\\-8.789063\\\\77.27011\\\\283.01\\\\-11.13281\\\\78.3245\\\\283.01\\\\-13.47656\\\\78.80508\\\\283.01\\\\-15.82031\\\\79.42928\\\\283.01\\\\-18.16406\\\\80.84683\\\\283.01\\\\-20.50781\\\\81.73235\\\\283.01\\\\-22.85156\\\\83.10505\\\\283.01\\\\-25.19531\\\\83.8896\\\\283.01\\\\-27.53906\\\\85.73323\\\\283.01\\\\-29.88281\\\\86.93073\\\\283.01\\\\-32.22656\\\\88.45541\\\\283.01\\\\-34.57031\\\\90.46002\\\\283.01\\\\-36.32372\\\\91.74844\\\\283.01\\\\-41.60156\\\\96.22536\\\\283.01\\\\-44.08482\\\\98.77969\\\\283.01\\\\-46.28906\\\\101.1685\\\\283.01\\\\-48.63281\\\\104.0022\\\\283.01\\\\-49.98205\\\\105.8109\\\\283.01\\\\-51.99305\\\\108.1547\\\\283.01\\\\-53.27454\\\\110.4984\\\\283.01\\\\-54.77706\\\\112.8422\\\\283.01\\\\-56.46552\\\\115.1859\\\\283.01\\\\-57.23792\\\\117.5297\\\\283.01\\\\-58.69997\\\\119.8734\\\\283.01\\\\-59.59329\\\\122.2172\\\\283.01\\\\-60.93391\\\\124.5609\\\\283.01\\\\-61.45277\\\\126.9047\\\\283.01\\\\-62.0745\\\\129.2484\\\\283.01\\\\-63.20891\\\\131.5922\\\\283.01\\\\-63.89457\\\\133.9359\\\\283.01\\\\-64.2122\\\\136.2797\\\\283.01\\\\-64.74208\\\\138.6234\\\\283.01\\\\-65.41684\\\\140.9672\\\\283.01\\\\-65.71338\\\\143.3109\\\\283.01\\\\-66.04911\\\\147.9984\\\\283.01\\\\-66.25537\\\\152.6859\\\\283.01\\\\-66.28944\\\\155.0297\\\\283.01\\\\-66.13839\\\\159.7172\\\\283.01\\\\-65.84704\\\\164.4047\\\\283.01\\\\-65.6146\\\\166.7484\\\\283.01\\\\-65.16927\\\\169.0922\\\\283.01\\\\-64.43269\\\\171.4359\\\\283.01\\\\-64.04324\\\\173.7797\\\\283.01\\\\-63.56812\\\\176.1234\\\\283.01\\\\-62.48605\\\\178.4672\\\\283.01\\\\-61.66916\\\\180.8109\\\\283.01\\\\-61.23355\\\\183.1547\\\\283.01\\\\-60\\\\185.4984\\\\283.01\\\\-59.02929\\\\187.8422\\\\283.01\\\\-57.57813\\\\190.1859\\\\283.01\\\\-56.76455\\\\192.5297\\\\283.01\\\\-55.16396\\\\194.8734\\\\283.01\\\\-53.87801\\\\197.2172\\\\283.01\\\\-52.31674\\\\199.5609\\\\283.01\\\\-48.63281\\\\204.4387\\\\283.01\\\\-47.14196\\\\206.5922\\\\283.01\\\\-42.63475\\\\211.2797\\\\283.01\\\\-39.25781\\\\214.554\\\\283.01\\\\-36.91406\\\\216.4344\\\\283.01\\\\-32.22656\\\\219.8671\\\\283.01\\\\-27.53906\\\\223.0999\\\\283.01\\\\-23.31792\\\\225.3422\\\\283.01\\\\-22.85156\\\\225.6686\\\\283.01\\\\-20.50781\\\\226.7934\\\\283.01\\\\-18.16406\\\\228.3114\\\\283.01\\\\-15.82031\\\\229.1045\\\\283.01\\\\-14.9365\\\\230.0297\\\\283.01\\\\-15.82031\\\\231.4054\\\\283.01\\\\-16.93359\\\\232.3734\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"351\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0766\\\\286.01\\\\-60.35156\\\\233.1818\\\\286.01\\\\-62.69531\\\\233.0766\\\\286.01\\\\-65.03906\\\\232.8253\\\\286.01\\\\-69.72656\\\\232.9942\\\\286.01\\\\-83.78906\\\\233.0441\\\\286.01\\\\-95.50781\\\\233.0671\\\\286.01\\\\-97.85156\\\\233.3067\\\\286.01\\\\-100.1953\\\\233.6324\\\\286.01\\\\-102.5391\\\\233.4044\\\\286.01\\\\-107.2266\\\\233.1842\\\\286.01\\\\-109.5703\\\\233.2251\\\\286.01\\\\-111.9141\\\\233.9738\\\\286.01\\\\-114.2578\\\\233.8765\\\\286.01\\\\-116.6016\\\\233.6229\\\\286.01\\\\-118.9453\\\\233.9675\\\\286.01\\\\-130.6641\\\\233.9967\\\\286.01\\\\-133.0078\\\\234.0855\\\\286.01\\\\-137.6953\\\\234.0855\\\\286.01\\\\-142.3828\\\\234.1551\\\\286.01\\\\-144.7266\\\\234.0941\\\\286.01\\\\-154.1016\\\\234.0642\\\\286.01\\\\-158.7891\\\\234.0999\\\\286.01\\\\-165.8203\\\\234.0642\\\\286.01\\\\-168.1641\\\\234.2429\\\\286.01\\\\-175.1953\\\\234.2112\\\\286.01\\\\-182.2266\\\\234.2686\\\\286.01\\\\-184.5703\\\\234.3486\\\\286.01\\\\-196.2891\\\\234.2902\\\\286.01\\\\-198.6328\\\\234.2467\\\\286.01\\\\-203.3203\\\\234.2935\\\\286.01\\\\-210.3516\\\\234.2224\\\\286.01\\\\-217.3828\\\\234.3115\\\\286.01\\\\-226.7578\\\\234.3891\\\\286.01\\\\-233.7891\\\\234.2362\\\\286.01\\\\-236.1328\\\\234.3235\\\\286.01\\\\-238.4766\\\\234.2502\\\\286.01\\\\-243.1641\\\\234.2088\\\\286.01\\\\-247.8516\\\\233.9638\\\\286.01\\\\-252.5391\\\\234.2967\\\\286.01\\\\-254.8828\\\\234.7444\\\\286.01\\\\-257.2266\\\\235.601\\\\286.01\\\\-259.5802\\\\237.0609\\\\286.01\\\\-261.0486\\\\239.4047\\\\286.01\\\\-261.1572\\\\241.7484\\\\286.01\\\\-260.2748\\\\246.4359\\\\286.01\\\\-257.2359\\\\251.1234\\\\286.01\\\\-255.457\\\\253.4672\\\\286.01\\\\-250.6794\\\\258.1547\\\\286.01\\\\-248.6664\\\\260.4984\\\\286.01\\\\-245.5078\\\\263.4952\\\\286.01\\\\-244.041\\\\265.1859\\\\286.01\\\\-241.534\\\\267.5297\\\\286.01\\\\-239.4093\\\\269.8734\\\\286.01\\\\-236.9663\\\\272.2172\\\\286.01\\\\-233.7891\\\\275.371\\\\286.01\\\\-231.4453\\\\277.8091\\\\286.01\\\\-229.8568\\\\279.2484\\\\286.01\\\\-226.7578\\\\282.5186\\\\286.01\\\\-225.1317\\\\283.9359\\\\286.01\\\\-222.0703\\\\287.1792\\\\286.01\\\\-220.4928\\\\288.6234\\\\286.01\\\\-218.2422\\\\290.9672\\\\286.01\\\\-217.3828\\\\291.6227\\\\286.01\\\\-215.0391\\\\292.9462\\\\286.01\\\\-212.6953\\\\294.5394\\\\286.01\\\\-210.3516\\\\295.2875\\\\286.01\\\\-208.0078\\\\296.4592\\\\286.01\\\\-205.6641\\\\296.8852\\\\286.01\\\\-203.3203\\\\297.1639\\\\286.01\\\\-196.2891\\\\297.1563\\\\286.01\\\\-193.9453\\\\297.0926\\\\286.01\\\\-179.8828\\\\296.943\\\\286.01\\\\-165.8203\\\\296.8959\\\\286.01\\\\-156.4453\\\\296.9137\\\\286.01\\\\-151.7578\\\\296.9559\\\\286.01\\\\-149.4141\\\\296.9249\\\\286.01\\\\-137.6953\\\\296.9338\\\\286.01\\\\-125.9766\\\\296.9228\\\\286.01\\\\-114.2578\\\\296.8545\\\\286.01\\\\-111.9141\\\\296.8917\\\\286.01\\\\-100.1953\\\\296.8456\\\\286.01\\\\-93.16406\\\\296.8549\\\\286.01\\\\-83.78906\\\\296.9041\\\\286.01\\\\-81.44531\\\\296.8837\\\\286.01\\\\-74.41406\\\\296.9322\\\\286.01\\\\-67.38281\\\\296.9234\\\\286.01\\\\-65.03906\\\\296.9706\\\\286.01\\\\-50.97656\\\\296.9358\\\\286.01\\\\-48.63281\\\\297.048\\\\286.01\\\\-46.28906\\\\296.9267\\\\286.01\\\\-43.94531\\\\297.0552\\\\286.01\\\\-41.60156\\\\296.9396\\\\286.01\\\\-39.25781\\\\296.9191\\\\286.01\\\\-36.91406\\\\297.4229\\\\286.01\\\\-34.57031\\\\297.3212\\\\286.01\\\\-29.88281\\\\297.409\\\\286.01\\\\-25.19531\\\\297.1687\\\\286.01\\\\-22.85156\\\\297.4125\\\\286.01\\\\-11.13281\\\\297.4441\\\\286.01\\\\-6.445313\\\\297.4125\\\\286.01\\\\0.5859375\\\\297.4229\\\\286.01\\\\2.929688\\\\297.3586\\\\286.01\\\\5.273438\\\\297.4334\\\\286.01\\\\9.960938\\\\297.3911\\\\286.01\\\\12.30469\\\\296.9467\\\\286.01\\\\14.64844\\\\296.9899\\\\286.01\\\\19.33594\\\\296.8973\\\\286.01\\\\33.39844\\\\296.8867\\\\286.01\\\\38.08594\\\\296.8666\\\\286.01\\\\49.80469\\\\296.7436\\\\286.01\\\\52.14844\\\\296.6929\\\\286.01\\\\59.17969\\\\296.6906\\\\286.01\\\\61.52344\\\\296.6365\\\\286.01\\\\66.21094\\\\296.6454\\\\286.01\\\\80.27344\\\\296.5362\\\\286.01\\\\82.61719\\\\296.5521\\\\286.01\\\\87.30469\\\\296.4947\\\\286.01\\\\89.64844\\\\296.5284\\\\286.01\\\\99.02344\\\\296.506\\\\286.01\\\\108.3984\\\\296.3986\\\\286.01\\\\115.4297\\\\296.4117\\\\286.01\\\\117.7734\\\\296.3557\\\\286.01\\\\129.4922\\\\296.3023\\\\286.01\\\\131.8359\\\\296.3139\\\\286.01\\\\136.5234\\\\295.833\\\\286.01\\\\141.2109\\\\295.8172\\\\286.01\\\\143.5547\\\\295.9179\\\\286.01\\\\145.8984\\\\295.864\\\\286.01\\\\152.9297\\\\295.8012\\\\286.01\\\\155.2734\\\\295.8486\\\\286.01\\\\157.6172\\\\295.7516\\\\286.01\\\\162.3047\\\\295.7346\\\\286.01\\\\164.6484\\\\295.6819\\\\286.01\\\\169.3359\\\\295.6998\\\\286.01\\\\181.0547\\\\295.5401\\\\286.01\\\\185.7422\\\\295.5071\\\\286.01\\\\192.7734\\\\295.5401\\\\286.01\\\\197.4609\\\\295.8012\\\\286.01\\\\202.1484\\\\295.7516\\\\286.01\\\\204.4922\\\\295.4287\\\\286.01\\\\206.8359\\\\294.8107\\\\286.01\\\\209.1797\\\\294.347\\\\286.01\\\\211.5234\\\\292.432\\\\286.01\\\\213.8672\\\\291.0641\\\\286.01\\\\216.2109\\\\289.4511\\\\286.01\\\\217.0997\\\\288.6234\\\\286.01\\\\219.2182\\\\286.2797\\\\286.01\\\\221.6202\\\\283.9359\\\\286.01\\\\225.5859\\\\279.7662\\\\286.01\\\\227.9297\\\\277.4504\\\\286.01\\\\230.2734\\\\274.9912\\\\286.01\\\\233.0769\\\\272.2172\\\\286.01\\\\234.9609\\\\270.226\\\\286.01\\\\237.6601\\\\267.5297\\\\286.01\\\\241.9922\\\\263.0508\\\\286.01\\\\246.6797\\\\258.3049\\\\286.01\\\\249.209\\\\255.8109\\\\286.01\\\\251.3672\\\\253.4207\\\\286.01\\\\253.1321\\\\251.1234\\\\286.01\\\\255.0749\\\\248.7797\\\\286.01\\\\256.5535\\\\246.4359\\\\286.01\\\\257.7698\\\\244.0922\\\\286.01\\\\259.3152\\\\241.7484\\\\286.01\\\\259.6588\\\\239.4047\\\\286.01\\\\259.5052\\\\237.0609\\\\286.01\\\\257.4836\\\\234.7172\\\\286.01\\\\256.0547\\\\233.5391\\\\286.01\\\\253.7109\\\\232.9048\\\\286.01\\\\251.3672\\\\232.5688\\\\286.01\\\\249.0234\\\\232.7431\\\\286.01\\\\246.6797\\\\232.7947\\\\286.01\\\\244.3359\\\\232.7162\\\\286.01\\\\239.6484\\\\233.0007\\\\286.01\\\\232.6172\\\\233.0108\\\\286.01\\\\230.2734\\\\232.9699\\\\286.01\\\\220.8984\\\\233.0726\\\\286.01\\\\211.5234\\\\233.091\\\\286.01\\\\206.8359\\\\233.0044\\\\286.01\\\\204.4922\\\\232.7719\\\\286.01\\\\199.8047\\\\232.7456\\\\286.01\\\\195.1172\\\\232.8346\\\\286.01\\\\190.4297\\\\232.8586\\\\286.01\\\\181.0547\\\\232.8224\\\\286.01\\\\171.6797\\\\232.8346\\\\286.01\\\\166.9922\\\\232.81\\\\286.01\\\\159.9609\\\\232.8376\\\\286.01\\\\155.2734\\\\232.8129\\\\286.01\\\\150.5859\\\\232.8376\\\\286.01\\\\143.5547\\\\232.8253\\\\286.01\\\\138.8672\\\\232.7456\\\\286.01\\\\131.8359\\\\232.7048\\\\286.01\\\\127.1484\\\\232.7614\\\\286.01\\\\117.7734\\\\232.7048\\\\286.01\\\\113.0859\\\\232.721\\\\286.01\\\\108.3984\\\\232.6767\\\\286.01\\\\106.0547\\\\232.5873\\\\286.01\\\\103.7109\\\\232.8967\\\\286.01\\\\101.3672\\\\232.9081\\\\286.01\\\\99.02344\\\\233.0951\\\\286.01\\\\89.64844\\\\233.0819\\\\286.01\\\\80.27344\\\\233.1132\\\\286.01\\\\77.92969\\\\233.0819\\\\286.01\\\\73.24219\\\\233.1221\\\\286.01\\\\63.86719\\\\233.1397\\\\286.01\\\\47.46094\\\\233.1042\\\\286.01\\\\45.11719\\\\233.0859\\\\286.01\\\\44.1744\\\\232.3734\\\\286.01\\\\42.77344\\\\230.9829\\\\286.01\\\\42.0716\\\\230.0297\\\\286.01\\\\42.77344\\\\229.2739\\\\286.01\\\\45.11719\\\\228.6098\\\\286.01\\\\47.46094\\\\227.1533\\\\286.01\\\\49.80469\\\\226.1119\\\\286.01\\\\52.14844\\\\224.628\\\\286.01\\\\54.49219\\\\223.8002\\\\286.01\\\\56.83594\\\\221.9418\\\\286.01\\\\59.17969\\\\220.3256\\\\286.01\\\\61.52344\\\\219.017\\\\286.01\\\\62.28633\\\\218.3109\\\\286.01\\\\66.21094\\\\215.1155\\\\286.01\\\\67.83708\\\\213.6234\\\\286.01\\\\68.55469\\\\212.8201\\\\286.01\\\\70.89844\\\\210.637\\\\286.01\\\\73.24219\\\\208.133\\\\286.01\\\\76.6862\\\\204.2484\\\\286.01\\\\78.48246\\\\201.9047\\\\286.01\\\\80.27344\\\\199.2337\\\\286.01\\\\81.43317\\\\197.2172\\\\286.01\\\\83.23588\\\\194.8734\\\\286.01\\\\84.22379\\\\192.5297\\\\286.01\\\\85.618\\\\190.1859\\\\286.01\\\\86.50858\\\\187.8422\\\\286.01\\\\88.05106\\\\185.4984\\\\286.01\\\\89.46748\\\\180.8109\\\\286.01\\\\90.44455\\\\178.4672\\\\286.01\\\\91.72363\\\\173.7797\\\\286.01\\\\92.65485\\\\171.4359\\\\286.01\\\\93.02794\\\\169.0922\\\\286.01\\\\93.30979\\\\164.4047\\\\286.01\\\\93.66728\\\\159.7172\\\\286.01\\\\93.85384\\\\155.0297\\\\286.01\\\\93.76065\\\\150.3422\\\\286.01\\\\93.25375\\\\143.3109\\\\286.01\\\\92.96676\\\\138.6234\\\\286.01\\\\92.39601\\\\136.2797\\\\286.01\\\\91.37577\\\\133.9359\\\\286.01\\\\90.82589\\\\131.5922\\\\286.01\\\\90.13611\\\\129.2484\\\\286.01\\\\89.05535\\\\126.9047\\\\286.01\\\\88.54037\\\\124.5609\\\\286.01\\\\87.64068\\\\122.2172\\\\286.01\\\\86.2421\\\\119.8734\\\\286.01\\\\85.29913\\\\117.5297\\\\286.01\\\\84.01531\\\\115.1859\\\\286.01\\\\81.1849\\\\110.4984\\\\286.01\\\\77.92969\\\\106.097\\\\286.01\\\\76.125\\\\103.4672\\\\286.01\\\\71.88107\\\\98.77969\\\\286.01\\\\68.55469\\\\95.47974\\\\286.01\\\\63.86719\\\\91.39851\\\\286.01\\\\61.52344\\\\89.95306\\\\286.01\\\\59.17969\\\\88.07359\\\\286.01\\\\56.83594\\\\86.40219\\\\286.01\\\\54.49219\\\\85.2847\\\\286.01\\\\52.14844\\\\83.56911\\\\286.01\\\\49.80469\\\\82.75372\\\\286.01\\\\47.46094\\\\81.42015\\\\286.01\\\\45.11719\\\\80.50576\\\\286.01\\\\42.77344\\\\79.10091\\\\286.01\\\\40.42969\\\\78.70156\\\\286.01\\\\38.08594\\\\78.04225\\\\286.01\\\\35.74219\\\\77.04612\\\\286.01\\\\33.39844\\\\76.45493\\\\286.01\\\\31.05469\\\\76.03495\\\\286.01\\\\28.71094\\\\75.26105\\\\286.01\\\\26.36719\\\\74.62567\\\\286.01\\\\24.02344\\\\74.40835\\\\286.01\\\\16.99219\\\\74.11594\\\\286.01\\\\14.64844\\\\74.06655\\\\286.01\\\\9.960938\\\\74.10896\\\\286.01\\\\2.929688\\\\74.40835\\\\286.01\\\\0.5859375\\\\74.73109\\\\286.01\\\\-4.101563\\\\76.15349\\\\286.01\\\\-6.445313\\\\76.61499\\\\286.01\\\\-8.789063\\\\77.28263\\\\286.01\\\\-11.13281\\\\78.30383\\\\286.01\\\\-13.47656\\\\78.80508\\\\286.01\\\\-15.82031\\\\79.40802\\\\286.01\\\\-18.16406\\\\80.83015\\\\286.01\\\\-20.50781\\\\81.71255\\\\286.01\\\\-22.85156\\\\83.07788\\\\286.01\\\\-25.19531\\\\83.8896\\\\286.01\\\\-27.53906\\\\85.7117\\\\286.01\\\\-29.88281\\\\86.86703\\\\286.01\\\\-32.22656\\\\88.43999\\\\286.01\\\\-34.57031\\\\90.43253\\\\286.01\\\\-36.39626\\\\91.74844\\\\286.01\\\\-41.60156\\\\96.15862\\\\286.01\\\\-44.13608\\\\98.77969\\\\286.01\\\\-46.29859\\\\101.1234\\\\286.01\\\\-48.63281\\\\103.9307\\\\286.01\\\\-50.00961\\\\105.8109\\\\286.01\\\\-52.01322\\\\108.1547\\\\286.01\\\\-53.32031\\\\110.4421\\\\286.01\\\\-54.80162\\\\112.8422\\\\286.01\\\\-56.5049\\\\115.1859\\\\286.01\\\\-57.25154\\\\117.5297\\\\286.01\\\\-58.74689\\\\119.8734\\\\286.01\\\\-59.61914\\\\122.2172\\\\286.01\\\\-60.97609\\\\124.5609\\\\286.01\\\\-61.4707\\\\126.9047\\\\286.01\\\\-62.12735\\\\129.2484\\\\286.01\\\\-63.28823\\\\131.5922\\\\286.01\\\\-63.93199\\\\133.9359\\\\286.01\\\\-64.24364\\\\136.2797\\\\286.01\\\\-65.46725\\\\140.9672\\\\286.01\\\\-65.92946\\\\145.6547\\\\286.01\\\\-66.21094\\\\150.3422\\\\286.01\\\\-66.32308\\\\155.0297\\\\286.01\\\\-66.18277\\\\159.7172\\\\286.01\\\\-65.88306\\\\164.4047\\\\286.01\\\\-65.65548\\\\166.7484\\\\286.01\\\\-65.26347\\\\169.0922\\\\286.01\\\\-64.4847\\\\171.4359\\\\286.01\\\\-63.62205\\\\176.1234\\\\286.01\\\\-62.61541\\\\178.4672\\\\286.01\\\\-61.71265\\\\180.8109\\\\286.01\\\\-61.26099\\\\183.1547\\\\286.01\\\\-60.12716\\\\185.4984\\\\286.01\\\\-59.11038\\\\187.8422\\\\286.01\\\\-57.65788\\\\190.1859\\\\286.01\\\\-56.79988\\\\192.5297\\\\286.01\\\\-55.26563\\\\194.8734\\\\286.01\\\\-53.9098\\\\197.2172\\\\286.01\\\\-52.35414\\\\199.5609\\\\286.01\\\\-50.58594\\\\201.9047\\\\286.01\\\\-47.18681\\\\206.5922\\\\286.01\\\\-42.69849\\\\211.2797\\\\286.01\\\\-39.25781\\\\214.6135\\\\286.01\\\\-34.48792\\\\218.3109\\\\286.01\\\\-29.88281\\\\221.5676\\\\286.01\\\\-27.53906\\\\223.1529\\\\286.01\\\\-23.37105\\\\225.3422\\\\286.01\\\\-22.85156\\\\225.6946\\\\286.01\\\\-20.50781\\\\226.8241\\\\286.01\\\\-18.16406\\\\228.3425\\\\286.01\\\\-15.82031\\\\229.1045\\\\286.01\\\\-14.9365\\\\230.0297\\\\286.01\\\\-15.82031\\\\231.4054\\\\286.01\\\\-16.93359\\\\232.3734\\\\286.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n"; -const char* k_rtStruct_json02 = -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"364\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"45.11719\\\\233.0859\\\\289.01\\\\44.16001\\\\232.3734\\\\289.01\\\\42.77344\\\\231.028\\\\289.01\\\\42.04498\\\\230.0297\\\\289.01\\\\42.77344\\\\229.2462\\\\289.01\\\\45.11719\\\\228.6173\\\\289.01\\\\47.46094\\\\227.1104\\\\289.01\\\\49.80469\\\\226.098\\\\289.01\\\\52.14844\\\\224.6141\\\\289.01\\\\54.49219\\\\223.7681\\\\289.01\\\\56.83594\\\\221.9221\\\\289.01\\\\59.17969\\\\220.2719\\\\289.01\\\\61.52344\\\\218.9816\\\\289.01\\\\62.24398\\\\218.3109\\\\289.01\\\\66.21094\\\\215.1002\\\\289.01\\\\67.80134\\\\213.6234\\\\289.01\\\\68.55469\\\\212.7718\\\\289.01\\\\70.89844\\\\210.6111\\\\289.01\\\\74.61816\\\\206.5922\\\\289.01\\\\76.64589\\\\204.2484\\\\289.01\\\\78.44145\\\\201.9047\\\\289.01\\\\80.27344\\\\199.1565\\\\289.01\\\\81.39723\\\\197.2172\\\\289.01\\\\83.19193\\\\194.8734\\\\289.01\\\\84.19829\\\\192.5297\\\\289.01\\\\85.55715\\\\190.1859\\\\289.01\\\\86.47488\\\\187.8422\\\\289.01\\\\87.98352\\\\185.4984\\\\289.01\\\\89.43614\\\\180.8109\\\\289.01\\\\90.43185\\\\178.4672\\\\289.01\\\\91.66755\\\\173.7797\\\\289.01\\\\92.6346\\\\171.4359\\\\289.01\\\\93.0094\\\\169.0922\\\\289.01\\\\93.45066\\\\162.0609\\\\289.01\\\\93.64378\\\\159.7172\\\\289.01\\\\93.74645\\\\157.3734\\\\289.01\\\\93.7934\\\\152.6859\\\\289.01\\\\93.7114\\\\150.3422\\\\289.01\\\\92.93333\\\\138.6234\\\\289.01\\\\92.32584\\\\136.2797\\\\289.01\\\\91.33673\\\\133.9359\\\\289.01\\\\90.79788\\\\131.5922\\\\289.01\\\\90.07662\\\\129.2484\\\\289.01\\\\89.01367\\\\126.9047\\\\289.01\\\\88.51154\\\\124.5609\\\\289.01\\\\87.5829\\\\122.2172\\\\289.01\\\\86.21134\\\\119.8734\\\\289.01\\\\85.2438\\\\117.5297\\\\289.01\\\\83.98051\\\\115.1859\\\\289.01\\\\82.44851\\\\112.8422\\\\289.01\\\\81.15704\\\\110.4984\\\\289.01\\\\77.92969\\\\106.1652\\\\289.01\\\\77.60783\\\\105.8109\\\\289.01\\\\76.08817\\\\103.4672\\\\289.01\\\\71.85195\\\\98.77969\\\\289.01\\\\68.55469\\\\95.5261\\\\289.01\\\\63.86719\\\\91.42658\\\\289.01\\\\61.52344\\\\90.00546\\\\289.01\\\\59.17969\\\\88.09907\\\\289.01\\\\56.83594\\\\86.42617\\\\289.01\\\\54.49219\\\\85.32829\\\\289.01\\\\52.14844\\\\83.5929\\\\289.01\\\\49.80469\\\\82.79196\\\\289.01\\\\47.46094\\\\81.4396\\\\289.01\\\\45.11719\\\\80.55132\\\\289.01\\\\42.77344\\\\79.11613\\\\289.01\\\\40.42969\\\\78.70156\\\\289.01\\\\38.08594\\\\78.06875\\\\289.01\\\\35.74219\\\\77.06593\\\\289.01\\\\33.39844\\\\76.46006\\\\289.01\\\\31.05469\\\\76.05299\\\\289.01\\\\28.71094\\\\75.29677\\\\289.01\\\\26.36719\\\\74.63503\\\\289.01\\\\24.02344\\\\74.42056\\\\289.01\\\\16.99219\\\\74.12224\\\\289.01\\\\12.30469\\\\74.05988\\\\289.01\\\\7.617188\\\\74.17641\\\\289.01\\\\2.929688\\\\74.40835\\\\289.01\\\\0.5859375\\\\74.69978\\\\289.01\\\\-4.101563\\\\76.1376\\\\289.01\\\\-6.445313\\\\76.582\\\\289.01\\\\-8.789063\\\\77.28263\\\\289.01\\\\-11.13281\\\\78.30383\\\\289.01\\\\-13.47656\\\\78.79336\\\\289.01\\\\-15.82031\\\\79.36918\\\\289.01\\\\-18.16406\\\\80.80879\\\\289.01\\\\-20.50781\\\\81.69893\\\\289.01\\\\-22.85156\\\\83.05925\\\\289.01\\\\-25.19531\\\\83.88489\\\\289.01\\\\-27.53906\\\\85.67889\\\\289.01\\\\-29.88281\\\\86.82161\\\\289.01\\\\-32.22656\\\\88.42921\\\\289.01\\\\-34.57031\\\\90.3988\\\\289.01\\\\-36.43259\\\\91.74844\\\\289.01\\\\-41.60156\\\\96.09487\\\\289.01\\\\-46.40716\\\\101.1234\\\\289.01\\\\-48.63281\\\\103.8925\\\\289.01\\\\-50.05581\\\\105.8109\\\\289.01\\\\-52.03897\\\\108.1547\\\\289.01\\\\-54.84508\\\\112.8422\\\\289.01\\\\-56.54788\\\\115.1859\\\\289.01\\\\-57.31724\\\\117.5297\\\\289.01\\\\-58.77809\\\\119.8734\\\\289.01\\\\-59.66415\\\\122.2172\\\\289.01\\\\-61.01031\\\\124.5609\\\\289.01\\\\-61.49414\\\\126.9047\\\\289.01\\\\-62.17529\\\\129.2484\\\\289.01\\\\-63.36781\\\\131.5922\\\\289.01\\\\-63.95774\\\\133.9359\\\\289.01\\\\-64.28482\\\\136.2797\\\\289.01\\\\-65.52673\\\\140.9672\\\\289.01\\\\-65.77621\\\\143.3109\\\\289.01\\\\-66.25\\\\150.3422\\\\289.01\\\\-66.3455\\\\155.0297\\\\289.01\\\\-66.22784\\\\159.7172\\\\289.01\\\\-65.91351\\\\164.4047\\\\289.01\\\\-65.68493\\\\166.7484\\\\289.01\\\\-65.33604\\\\169.0922\\\\289.01\\\\-64.55139\\\\171.4359\\\\289.01\\\\-63.66697\\\\176.1234\\\\289.01\\\\-61.73706\\\\180.8109\\\\289.01\\\\-61.2854\\\\183.1547\\\\289.01\\\\-60.35156\\\\185.3682\\\\289.01\\\\-59.14885\\\\187.8422\\\\289.01\\\\-57.77686\\\\190.1859\\\\289.01\\\\-56.84834\\\\192.5297\\\\289.01\\\\-55.35103\\\\194.8734\\\\289.01\\\\-53.94861\\\\197.2172\\\\289.01\\\\-50.97656\\\\201.5585\\\\289.01\\\\-48.63281\\\\204.6038\\\\289.01\\\\-47.23869\\\\206.5922\\\\289.01\\\\-42.7328\\\\211.2797\\\\289.01\\\\-39.25781\\\\214.6555\\\\289.01\\\\-34.54219\\\\218.3109\\\\289.01\\\\-32.22656\\\\219.8927\\\\289.01\\\\-27.53906\\\\223.2363\\\\289.01\\\\-23.37646\\\\225.3422\\\\289.01\\\\-22.85156\\\\225.6921\\\\289.01\\\\-20.50781\\\\226.8489\\\\289.01\\\\-18.16406\\\\228.3625\\\\289.01\\\\-15.82031\\\\229.1235\\\\289.01\\\\-14.9447\\\\230.0297\\\\289.01\\\\-15.82031\\\\231.385\\\\289.01\\\\-16.95703\\\\232.3734\\\\289.01\\\\-18.16406\\\\233.0632\\\\289.01\\\\-20.50781\\\\233.1042\\\\289.01\\\\-27.53906\\\\233.0951\\\\289.01\\\\-36.91406\\\\233.1132\\\\289.01\\\\-50.97656\\\\233.1652\\\\289.01\\\\-60.35156\\\\233.1652\\\\289.01\\\\-62.69531\\\\233.0671\\\\289.01\\\\-65.03906\\\\232.8376\\\\289.01\\\\-69.72656\\\\232.9839\\\\289.01\\\\-76.75781\\\\233.0245\\\\289.01\\\\-90.82031\\\\233.0382\\\\289.01\\\\-97.85156\\\\233.1345\\\\289.01\\\\-100.1953\\\\233.0992\\\\289.01\\\\-102.5391\\\\233.1524\\\\289.01\\\\-104.8828\\\\233.3934\\\\289.01\\\\-107.2266\\\\233.2115\\\\289.01\\\\-109.5703\\\\233.2027\\\\289.01\\\\-111.9141\\\\233.9046\\\\289.01\\\\-114.2578\\\\233.3123\\\\289.01\\\\-116.6016\\\\233.131\\\\289.01\\\\-118.9453\\\\233.9503\\\\289.01\\\\-123.6328\\\\234.0035\\\\289.01\\\\-130.6641\\\\234.0035\\\\289.01\\\\-135.3516\\\\234.1218\\\\289.01\\\\-137.6953\\\\234.054\\\\289.01\\\\-142.3828\\\\234.1551\\\\289.01\\\\-147.0703\\\\234.0336\\\\289.01\\\\-158.7891\\\\234.0691\\\\289.01\\\\-165.8203\\\\234.0314\\\\289.01\\\\-168.1641\\\\234.2175\\\\289.01\\\\-172.8516\\\\234.2539\\\\289.01\\\\-175.1953\\\\234.1973\\\\289.01\\\\-179.8828\\\\234.2721\\\\289.01\\\\-182.2266\\\\234.2574\\\\289.01\\\\-186.9141\\\\234.3359\\\\289.01\\\\-189.2578\\\\234.2721\\\\289.01\\\\-196.2891\\\\234.2502\\\\289.01\\\\-198.6328\\\\234.205\\\\289.01\\\\-200.9766\\\\234.2644\\\\289.01\\\\-205.6641\\\\234.2088\\\\289.01\\\\-215.0391\\\\234.2398\\\\289.01\\\\-217.3828\\\\234.2822\\\\289.01\\\\-229.1016\\\\234.2967\\\\289.01\\\\-233.7891\\\\234.1692\\\\289.01\\\\-238.4766\\\\234.2088\\\\289.01\\\\-243.1641\\\\234.1652\\\\289.01\\\\-245.5078\\\\234.0396\\\\289.01\\\\-247.8516\\\\234.0172\\\\289.01\\\\-250.1953\\\\234.1313\\\\289.01\\\\-252.5391\\\\234.3629\\\\289.01\\\\-254.8828\\\\235.229\\\\289.01\\\\-257.4503\\\\237.0609\\\\289.01\\\\-258.6989\\\\239.4047\\\\289.01\\\\-258.6135\\\\241.7484\\\\289.01\\\\-258.1335\\\\244.0922\\\\289.01\\\\-257.8311\\\\246.4359\\\\289.01\\\\-256.3118\\\\251.1234\\\\289.01\\\\-254.9679\\\\253.4672\\\\289.01\\\\-252.5391\\\\256.3686\\\\289.01\\\\-250.728\\\\258.1547\\\\289.01\\\\-248.6658\\\\260.4984\\\\289.01\\\\-245.5078\\\\263.5156\\\\289.01\\\\-243.1641\\\\266.0784\\\\289.01\\\\-241.5408\\\\267.5297\\\\289.01\\\\-239.3968\\\\269.8734\\\\289.01\\\\-233.7891\\\\275.3661\\\\289.01\\\\-231.4453\\\\277.8055\\\\289.01\\\\-229.1016\\\\280.0036\\\\289.01\\\\-226.7578\\\\282.5186\\\\289.01\\\\-224.4141\\\\284.6728\\\\289.01\\\\-222.0703\\\\287.1957\\\\289.01\\\\-220.4987\\\\288.6234\\\\289.01\\\\-218.2467\\\\290.9672\\\\289.01\\\\-217.3828\\\\291.6321\\\\289.01\\\\-215.0391\\\\292.9727\\\\289.01\\\\-212.6953\\\\294.534\\\\289.01\\\\-210.3516\\\\295.2615\\\\289.01\\\\-208.0078\\\\296.4424\\\\289.01\\\\-205.6641\\\\296.8658\\\\289.01\\\\-203.3203\\\\297.1563\\\\289.01\\\\-198.6328\\\\297.1793\\\\289.01\\\\-193.9453\\\\297.0673\\\\289.01\\\\-184.5703\\\\296.9514\\\\289.01\\\\-175.1953\\\\296.923\\\\289.01\\\\-165.8203\\\\296.8651\\\\289.01\\\\-154.1016\\\\296.9236\\\\289.01\\\\-149.4141\\\\296.8921\\\\289.01\\\\-144.7266\\\\296.9173\\\\289.01\\\\-137.6953\\\\296.9008\\\\289.01\\\\-135.3516\\\\296.9292\\\\289.01\\\\-128.3203\\\\296.9121\\\\289.01\\\\-116.6016\\\\296.8357\\\\289.01\\\\-111.9141\\\\296.8635\\\\289.01\\\\-102.5391\\\\296.8731\\\\289.01\\\\-88.47656\\\\296.8549\\\\289.01\\\\-81.44531\\\\296.8647\\\\289.01\\\\-79.10156\\\\296.913\\\\289.01\\\\-65.03906\\\\296.9409\\\\289.01\\\\-62.69531\\\\296.9706\\\\289.01\\\\-50.97656\\\\296.9668\\\\289.01\\\\-48.63281\\\\297.2359\\\\289.01\\\\-46.28906\\\\296.9447\\\\289.01\\\\-43.94531\\\\297.1975\\\\289.01\\\\-41.60156\\\\296.9191\\\\289.01\\\\-39.25781\\\\296.9095\\\\289.01\\\\-36.91406\\\\297.267\\\\289.01\\\\-34.57031\\\\297.0362\\\\289.01\\\\-32.22656\\\\297.4055\\\\289.01\\\\-27.53906\\\\297.3806\\\\289.01\\\\-25.19531\\\\297.4229\\\\289.01\\\\-13.47656\\\\297.4441\\\\289.01\\\\-4.101563\\\\297.4229\\\\289.01\\\\-1.757813\\\\297.2719\\\\289.01\\\\0.5859375\\\\297.4334\\\\289.01\\\\2.929688\\\\297.1626\\\\289.01\\\\5.273438\\\\297.4266\\\\289.01\\\\7.617188\\\\297.3879\\\\289.01\\\\9.960938\\\\297.2416\\\\289.01\\\\12.30469\\\\296.9841\\\\289.01\\\\14.64844\\\\297.1018\\\\289.01\\\\16.99219\\\\296.9081\\\\289.01\\\\21.67969\\\\296.9095\\\\289.01\\\\26.36719\\\\296.8673\\\\289.01\\\\28.71094\\\\296.9175\\\\289.01\\\\31.05469\\\\296.8771\\\\289.01\\\\47.46094\\\\296.7858\\\\289.01\\\\49.80469\\\\296.7229\\\\289.01\\\\59.17969\\\\296.6999\\\\289.01\\\\61.52344\\\\296.6331\\\\289.01\\\\68.55469\\\\296.6365\\\\289.01\\\\73.24219\\\\296.5732\\\\289.01\\\\84.96094\\\\296.5362\\\\289.01\\\\91.99219\\\\296.5569\\\\289.01\\\\103.7109\\\\296.4873\\\\289.01\\\\108.3984\\\\296.3976\\\\289.01\\\\113.0859\\\\296.4325\\\\289.01\\\\120.1172\\\\296.3495\\\\289.01\\\\122.4609\\\\296.364\\\\289.01\\\\127.1484\\\\296.3023\\\\289.01\\\\131.8359\\\\296.3259\\\\289.01\\\\134.1797\\\\296.1569\\\\289.01\\\\136.5234\\\\295.8717\\\\289.01\\\\138.8672\\\\295.9832\\\\289.01\\\\141.2109\\\\295.8685\\\\289.01\\\\143.5547\\\\296.085\\\\289.01\\\\145.8984\\\\295.8791\\\\289.01\\\\152.9297\\\\295.833\\\\289.01\\\\155.2734\\\\295.864\\\\289.01\\\\157.6172\\\\295.7849\\\\289.01\\\\164.6484\\\\295.6998\\\\289.01\\\\169.3359\\\\295.7346\\\\289.01\\\\174.0234\\\\295.6454\\\\289.01\\\\178.7109\\\\295.6272\\\\289.01\\\\188.0859\\\\295.5071\\\\289.01\\\\192.7734\\\\295.557\\\\289.01\\\\197.4609\\\\295.7849\\\\289.01\\\\202.1484\\\\295.7173\\\\289.01\\\\204.4922\\\\295.4439\\\\289.01\\\\206.8359\\\\294.8185\\\\289.01\\\\209.1797\\\\294.3595\\\\289.01\\\\211.5234\\\\292.4465\\\\289.01\\\\213.8672\\\\291.0974\\\\289.01\\\\216.2109\\\\289.4896\\\\289.01\\\\217.1345\\\\288.6234\\\\289.01\\\\218.5547\\\\287.023\\\\289.01\\\\221.6488\\\\283.9359\\\\289.01\\\\225.5859\\\\279.7803\\\\289.01\\\\227.9297\\\\277.5081\\\\289.01\\\\230.2734\\\\275.0207\\\\289.01\\\\232.6172\\\\272.7547\\\\289.01\\\\234.9609\\\\270.2734\\\\289.01\\\\237.7078\\\\267.5297\\\\289.01\\\\239.9578\\\\265.1859\\\\289.01\\\\244.3359\\\\260.784\\\\289.01\\\\246.6797\\\\258.2849\\\\289.01\\\\249.093\\\\255.8109\\\\289.01\\\\251.3672\\\\252.927\\\\289.01\\\\253.7109\\\\249.593\\\\289.01\\\\254.3837\\\\248.7797\\\\289.01\\\\255.2195\\\\246.4359\\\\289.01\\\\255.899\\\\244.0922\\\\289.01\\\\256.6528\\\\239.4047\\\\289.01\\\\256.6685\\\\237.0609\\\\289.01\\\\256.0547\\\\236.1658\\\\289.01\\\\255.3861\\\\234.7172\\\\289.01\\\\253.7109\\\\233.2892\\\\289.01\\\\251.3672\\\\232.6603\\\\289.01\\\\246.6797\\\\232.927\\\\289.01\\\\244.3359\\\\232.8224\\\\289.01\\\\239.6484\\\\233.0007\\\\289.01\\\\237.3047\\\\233.0305\\\\289.01\\\\230.2734\\\\232.9699\\\\289.01\\\\220.8984\\\\233.091\\\\289.01\\\\209.1797\\\\233.0819\\\\289.01\\\\206.8359\\\\233.0245\\\\289.01\\\\204.4922\\\\232.7848\\\\289.01\\\\199.8047\\\\232.7588\\\\289.01\\\\197.4609\\\\232.81\\\\289.01\\\\190.4297\\\\232.8467\\\\289.01\\\\183.3984\\\\232.8224\\\\289.01\\\\164.6484\\\\232.81\\\\289.01\\\\155.2734\\\\232.7875\\\\289.01\\\\148.2422\\\\232.8253\\\\289.01\\\\143.5547\\\\232.8003\\\\289.01\\\\138.8672\\\\232.7186\\\\289.01\\\\129.4922\\\\232.6623\\\\289.01\\\\122.4609\\\\232.7048\\\\289.01\\\\117.7734\\\\232.6477\\\\289.01\\\\115.4297\\\\232.6908\\\\289.01\\\\110.7422\\\\232.6477\\\\289.01\\\\108.3984\\\\232.5557\\\\289.01\\\\106.0547\\\\231.9897\\\\289.01\\\\103.7109\\\\232.81\\\\289.01\\\\101.3672\\\\232.8735\\\\289.01\\\\99.02344\\\\233.0819\\\\289.01\\\\82.61719\\\\233.1091\\\\289.01\\\\75.58594\\\\233.1042\\\\289.01\\\\63.86719\\\\233.1397\\\\289.01\\\\61.52344\\\\233.1132\\\\289.01\\\\54.49219\\\\233.131\\\\289.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"352\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"6\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0632\\\\292.01\\\\-34.57031\\\\233.1221\\\\292.01\\\\-46.28906\\\\233.1221\\\\292.01\\\\-53.32031\\\\233.1652\\\\292.01\\\\-60.35156\\\\233.1736\\\\292.01\\\\-62.69531\\\\233.0951\\\\292.01\\\\-65.03906\\\\232.8376\\\\292.01\\\\-69.72656\\\\232.9735\\\\292.01\\\\-83.78906\\\\233.0245\\\\292.01\\\\-86.13281\\\\233.0082\\\\292.01\\\\-95.50781\\\\233.0766\\\\292.01\\\\-109.5703\\\\233.1083\\\\292.01\\\\-111.9141\\\\233.1524\\\\292.01\\\\-114.2578\\\\233.4062\\\\292.01\\\\-116.6016\\\\233.1221\\\\292.01\\\\-118.9453\\\\233.9388\\\\292.01\\\\-123.6328\\\\233.9793\\\\292.01\\\\-130.6641\\\\233.9793\\\\292.01\\\\-135.3516\\\\234.0805\\\\292.01\\\\-137.6953\\\\234.0105\\\\292.01\\\\-142.3828\\\\234.0855\\\\292.01\\\\-149.4141\\\\233.9967\\\\292.01\\\\-154.1016\\\\234.0263\\\\292.01\\\\-161.1328\\\\233.9784\\\\292.01\\\\-165.8203\\\\233.9954\\\\292.01\\\\-168.1641\\\\234.1756\\\\292.01\\\\-172.8516\\\\234.2357\\\\292.01\\\\-175.1953\\\\234.1837\\\\292.01\\\\-179.8828\\\\234.2394\\\\292.01\\\\-186.9141\\\\234.2574\\\\292.01\\\\-189.2578\\\\234.2012\\\\292.01\\\\-193.9453\\\\234.205\\\\292.01\\\\-198.6328\\\\234.1437\\\\292.01\\\\-200.9766\\\\234.2224\\\\292.01\\\\-205.6641\\\\234.1523\\\\292.01\\\\-212.6953\\\\234.2224\\\\292.01\\\\-215.0391\\\\234.2088\\\\292.01\\\\-222.0703\\\\234.2644\\\\292.01\\\\-229.1016\\\\234.2224\\\\292.01\\\\-233.7891\\\\234.0787\\\\292.01\\\\-238.4766\\\\234.1437\\\\292.01\\\\-243.1641\\\\234.1482\\\\292.01\\\\-245.5078\\\\234.0015\\\\292.01\\\\-247.8516\\\\233.9742\\\\292.01\\\\-250.1953\\\\234.1478\\\\292.01\\\\-252.5391\\\\234.7444\\\\292.01\\\\-254.8828\\\\236.1971\\\\292.01\\\\-255.7199\\\\237.0609\\\\292.01\\\\-256.4182\\\\239.4047\\\\292.01\\\\-255.9699\\\\244.0922\\\\292.01\\\\-255.9741\\\\246.4359\\\\292.01\\\\-255.8244\\\\248.7797\\\\292.01\\\\-255.2465\\\\251.1234\\\\292.01\\\\-254.8828\\\\251.716\\\\292.01\\\\-252.9549\\\\255.8109\\\\292.01\\\\-250.1953\\\\258.7278\\\\292.01\\\\-247.8516\\\\261.3344\\\\292.01\\\\-245.5078\\\\263.528\\\\292.01\\\\-243.1641\\\\266.0844\\\\292.01\\\\-241.5582\\\\267.5297\\\\292.01\\\\-239.4252\\\\269.8734\\\\292.01\\\\-233.7891\\\\275.382\\\\292.01\\\\-231.4453\\\\277.8153\\\\292.01\\\\-229.1016\\\\280.0153\\\\292.01\\\\-226.7578\\\\282.5249\\\\292.01\\\\-224.4141\\\\284.6784\\\\292.01\\\\-222.0703\\\\287.1957\\\\292.01\\\\-220.5108\\\\288.6234\\\\292.01\\\\-218.2575\\\\290.9672\\\\292.01\\\\-217.3828\\\\291.6415\\\\292.01\\\\-215.0391\\\\293\\\\292.01\\\\-212.6953\\\\294.5345\\\\292.01\\\\-210.3516\\\\295.3008\\\\292.01\\\\-208.0078\\\\296.4338\\\\292.01\\\\-205.6641\\\\296.8658\\\\292.01\\\\-203.3203\\\\297.1488\\\\292.01\\\\-196.2891\\\\297.1563\\\\292.01\\\\-193.9453\\\\297.0522\\\\292.01\\\\-184.5703\\\\296.9452\\\\292.01\\\\-177.5391\\\\296.9218\\\\292.01\\\\-172.8516\\\\296.8713\\\\292.01\\\\-161.1328\\\\296.8585\\\\292.01\\\\-158.7891\\\\296.882\\\\292.01\\\\-149.4141\\\\296.8672\\\\292.01\\\\-147.0703\\\\296.8921\\\\292.01\\\\-137.6953\\\\296.8852\\\\292.01\\\\-128.3203\\\\296.9041\\\\292.01\\\\-116.6016\\\\296.8174\\\\292.01\\\\-102.5391\\\\296.8641\\\\292.01\\\\-95.50781\\\\296.8456\\\\292.01\\\\-90.82031\\\\296.8738\\\\292.01\\\\-74.41406\\\\296.8938\\\\292.01\\\\-67.38281\\\\296.9218\\\\292.01\\\\-62.69531\\\\296.9731\\\\292.01\\\\-50.97656\\\\296.9447\\\\292.01\\\\-48.63281\\\\297.0809\\\\292.01\\\\-46.28906\\\\296.9447\\\\292.01\\\\-43.94531\\\\297.1128\\\\292.01\\\\-41.60156\\\\296.9191\\\\292.01\\\\-36.91406\\\\297.3879\\\\292.01\\\\-34.57031\\\\297.0362\\\\292.01\\\\-29.88281\\\\297.4229\\\\292.01\\\\-18.16406\\\\297.3836\\\\292.01\\\\-13.47656\\\\297.4229\\\\292.01\\\\-11.13281\\\\297.3192\\\\292.01\\\\-8.789063\\\\297.4125\\\\292.01\\\\-4.101563\\\\297.3947\\\\292.01\\\\-1.757813\\\\297.1564\\\\292.01\\\\0.5859375\\\\297.4125\\\\292.01\\\\5.273438\\\\297.2937\\\\292.01\\\\7.617188\\\\296.9841\\\\292.01\\\\9.960938\\\\297.1865\\\\292.01\\\\12.30469\\\\296.9081\\\\292.01\\\\14.64844\\\\296.9396\\\\292.01\\\\19.33594\\\\296.8985\\\\292.01\\\\28.71094\\\\296.8973\\\\292.01\\\\35.74219\\\\296.8466\\\\292.01\\\\40.42969\\\\296.8673\\\\292.01\\\\61.52344\\\\296.6577\\\\292.01\\\\68.55469\\\\296.6487\\\\292.01\\\\75.58594\\\\296.5943\\\\292.01\\\\87.30469\\\\296.549\\\\292.01\\\\91.99219\\\\296.5862\\\\292.01\\\\106.0547\\\\296.4597\\\\292.01\\\\113.0859\\\\296.4597\\\\292.01\\\\115.4297\\\\296.4117\\\\292.01\\\\127.1484\\\\296.3229\\\\292.01\\\\134.1797\\\\296.3288\\\\292.01\\\\136.5234\\\\296.2406\\\\292.01\\\\143.5547\\\\296.2559\\\\292.01\\\\145.8984\\\\295.894\\\\292.01\\\\148.2422\\\\295.9087\\\\292.01\\\\155.2734\\\\295.864\\\\292.01\\\\162.3047\\\\295.7516\\\\292.01\\\\166.9922\\\\295.7849\\\\292.01\\\\171.6797\\\\295.6998\\\\292.01\\\\183.3984\\\\295.557\\\\292.01\\\\188.0859\\\\295.5916\\\\292.01\\\\192.7734\\\\295.5742\\\\292.01\\\\197.4609\\\\295.8012\\\\292.01\\\\202.1484\\\\295.7173\\\\292.01\\\\204.4922\\\\295.4287\\\\292.01\\\\206.8359\\\\294.8185\\\\292.01\\\\209.1797\\\\294.3768\\\\292.01\\\\211.5234\\\\292.4613\\\\292.01\\\\213.8672\\\\291.1455\\\\292.01\\\\216.2109\\\\289.5482\\\\292.01\\\\217.195\\\\288.6234\\\\292.01\\\\218.5547\\\\287.0752\\\\292.01\\\\221.6824\\\\283.9359\\\\292.01\\\\225.5859\\\\279.8388\\\\292.01\\\\227.9297\\\\277.5633\\\\292.01\\\\230.2734\\\\275.0632\\\\292.01\\\\233.2115\\\\272.2172\\\\292.01\\\\234.9609\\\\270.3186\\\\292.01\\\\237.735\\\\267.5297\\\\292.01\\\\239.9391\\\\265.1859\\\\292.01\\\\244.3359\\\\260.7643\\\\292.01\\\\246.751\\\\258.1547\\\\292.01\\\\249.0234\\\\255.6098\\\\292.01\\\\250.567\\\\253.4672\\\\292.01\\\\252.0319\\\\251.1234\\\\292.01\\\\252.7511\\\\248.7797\\\\292.01\\\\253.3727\\\\246.4359\\\\292.01\\\\253.5807\\\\244.0922\\\\292.01\\\\253.6483\\\\241.7484\\\\292.01\\\\254.3572\\\\239.4047\\\\292.01\\\\254.5918\\\\237.0609\\\\292.01\\\\253.1041\\\\234.7172\\\\292.01\\\\251.3672\\\\232.9906\\\\292.01\\\\249.0234\\\\232.8704\\\\292.01\\\\246.6797\\\\232.9906\\\\292.01\\\\244.3359\\\\232.9594\\\\292.01\\\\239.6484\\\\233.0108\\\\292.01\\\\230.2734\\\\232.9906\\\\292.01\\\\220.8984\\\\233.0819\\\\292.01\\\\211.5234\\\\233.091\\\\292.01\\\\206.8359\\\\233.0245\\\\292.01\\\\204.4922\\\\232.7848\\\\292.01\\\\199.8047\\\\232.7719\\\\292.01\\\\190.4297\\\\232.8346\\\\292.01\\\\181.0547\\\\232.7719\\\\292.01\\\\178.7109\\\\232.7975\\\\292.01\\\\174.0234\\\\232.7588\\\\292.01\\\\166.9922\\\\232.7456\\\\292.01\\\\152.9297\\\\232.8003\\\\292.01\\\\145.8984\\\\232.7875\\\\292.01\\\\141.2109\\\\232.6908\\\\292.01\\\\136.5234\\\\232.6908\\\\292.01\\\\134.1797\\\\232.6477\\\\292.01\\\\127.1484\\\\232.6767\\\\292.01\\\\124.8047\\\\232.6329\\\\292.01\\\\122.4609\\\\232.6767\\\\292.01\\\\117.7734\\\\232.6329\\\\292.01\\\\115.4297\\\\232.6767\\\\292.01\\\\110.7422\\\\232.6329\\\\292.01\\\\108.3984\\\\232.4011\\\\292.01\\\\106.0547\\\\231.7168\\\\292.01\\\\103.7109\\\\232.7346\\\\292.01\\\\99.02344\\\\233.0819\\\\292.01\\\\96.67969\\\\233.1001\\\\292.01\\\\80.27344\\\\233.0859\\\\292.01\\\\77.92969\\\\233.131\\\\292.01\\\\68.55469\\\\233.1042\\\\292.01\\\\63.86719\\\\233.1483\\\\292.01\\\\54.49219\\\\233.1132\\\\292.01\\\\45.11719\\\\233.1042\\\\292.01\\\\44.13916\\\\232.3734\\\\292.01\\\\42.77344\\\\231.028\\\\292.01\\\\42.04498\\\\230.0297\\\\292.01\\\\42.77344\\\\229.2462\\\\292.01\\\\45.11719\\\\228.6098\\\\292.01\\\\47.46094\\\\227.1\\\\292.01\\\\49.80469\\\\226.0746\\\\292.01\\\\52.14844\\\\224.5908\\\\292.01\\\\54.49219\\\\223.7256\\\\292.01\\\\56.83594\\\\221.9043\\\\292.01\\\\59.17969\\\\220.2334\\\\292.01\\\\61.52344\\\\218.9233\\\\292.01\\\\62.17359\\\\218.3109\\\\292.01\\\\65.03114\\\\215.9672\\\\292.01\\\\66.21094\\\\215.0853\\\\292.01\\\\67.77555\\\\213.6234\\\\292.01\\\\68.55469\\\\212.7391\\\\292.01\\\\70.89844\\\\210.5899\\\\292.01\\\\74.60287\\\\206.5922\\\\292.01\\\\76.61049\\\\204.2484\\\\292.01\\\\78.37865\\\\201.9047\\\\292.01\\\\80.27344\\\\199.0659\\\\292.01\\\\81.3732\\\\197.2172\\\\292.01\\\\83.11832\\\\194.8734\\\\292.01\\\\84.16552\\\\192.5297\\\\292.01\\\\85.52934\\\\190.1859\\\\292.01\\\\86.43362\\\\187.8422\\\\292.01\\\\87.9126\\\\185.4984\\\\292.01\\\\89.3596\\\\180.8109\\\\292.01\\\\90.38334\\\\178.4672\\\\292.01\\\\91.58888\\\\173.7797\\\\292.01\\\\92.57813\\\\171.4359\\\\292.01\\\\92.99067\\\\169.0922\\\\292.01\\\\93.58354\\\\159.7172\\\\292.01\\\\93.69106\\\\157.3734\\\\292.01\\\\93.75715\\\\152.6859\\\\292.01\\\\93.66728\\\\150.3422\\\\292.01\\\\93.08162\\\\140.9672\\\\292.01\\\\92.89124\\\\138.6234\\\\292.01\\\\92.23668\\\\136.2797\\\\292.01\\\\91.29035\\\\133.9359\\\\292.01\\\\90.7637\\\\131.5922\\\\292.01\\\\90.01319\\\\129.2484\\\\292.01\\\\88.96999\\\\126.9047\\\\292.01\\\\88.48242\\\\124.5609\\\\292.01\\\\87.50434\\\\122.2172\\\\292.01\\\\86.16302\\\\119.8734\\\\292.01\\\\85.18534\\\\117.5297\\\\292.01\\\\83.93555\\\\115.1859\\\\292.01\\\\82.35394\\\\112.8422\\\\292.01\\\\81.1205\\\\110.4984\\\\292.01\\\\77.92969\\\\106.2493\\\\292.01\\\\77.53906\\\\105.8109\\\\292.01\\\\76.03666\\\\103.4672\\\\292.01\\\\71.81973\\\\98.77969\\\\292.01\\\\68.55469\\\\95.57756\\\\292.01\\\\63.86719\\\\91.47022\\\\292.01\\\\61.52344\\\\90.03793\\\\292.01\\\\59.17969\\\\88.1257\\\\292.01\\\\56.83594\\\\86.46088\\\\292.01\\\\54.49219\\\\85.37372\\\\292.01\\\\52.14844\\\\83.62384\\\\292.01\\\\49.80469\\\\82.8195\\\\292.01\\\\47.46094\\\\81.45925\\\\292.01\\\\45.11719\\\\80.5947\\\\292.01\\\\42.77344\\\\79.13168\\\\292.01\\\\40.42969\\\\78.71358\\\\292.01\\\\38.08594\\\\78.09455\\\\292.01\\\\35.74219\\\\77.09653\\\\292.01\\\\33.39844\\\\76.47086\\\\292.01\\\\31.05469\\\\76.06187\\\\292.01\\\\28.71094\\\\75.29641\\\\292.01\\\\26.36719\\\\74.65405\\\\292.01\\\\24.02344\\\\74.42056\\\\292.01\\\\14.64844\\\\74.05988\\\\292.01\\\\12.30469\\\\74.06546\\\\292.01\\\\7.617188\\\\74.16415\\\\292.01\\\\2.929688\\\\74.40835\\\\292.01\\\\0.5859375\\\\74.66957\\\\292.01\\\\-4.101563\\\\76.10484\\\\292.01\\\\-6.445313\\\\76.55428\\\\292.01\\\\-8.789063\\\\77.2619\\\\292.01\\\\-11.13281\\\\78.29331\\\\292.01\\\\-15.82031\\\\79.33912\\\\292.01\\\\-18.16406\\\\80.80879\\\\292.01\\\\-20.50781\\\\81.67974\\\\292.01\\\\-22.85156\\\\83.04977\\\\292.01\\\\-25.19531\\\\83.8679\\\\292.01\\\\-27.53906\\\\85.67369\\\\292.01\\\\-29.88281\\\\86.77807\\\\292.01\\\\-32.22656\\\\88.40859\\\\292.01\\\\-34.57031\\\\90.3647\\\\292.01\\\\-36.45433\\\\91.74844\\\\292.01\\\\-39.25781\\\\94.04677\\\\292.01\\\\-41.60156\\\\96.05102\\\\292.01\\\\-46.47692\\\\101.1234\\\\292.01\\\\-48.63281\\\\103.8257\\\\292.01\\\\-50.09444\\\\105.8109\\\\292.01\\\\-52.05878\\\\108.1547\\\\292.01\\\\-53.53416\\\\110.4984\\\\292.01\\\\-54.89417\\\\112.8422\\\\292.01\\\\-56.60029\\\\115.1859\\\\292.01\\\\-57.3473\\\\117.5297\\\\292.01\\\\-58.83843\\\\119.8734\\\\292.01\\\\-59.71175\\\\122.2172\\\\292.01\\\\-61.0397\\\\124.5609\\\\292.01\\\\-61.54119\\\\126.9047\\\\292.01\\\\-62.23412\\\\129.2484\\\\292.01\\\\-63.41292\\\\131.5922\\\\292.01\\\\-63.98491\\\\133.9359\\\\292.01\\\\-64.32825\\\\136.2797\\\\292.01\\\\-65.57173\\\\140.9672\\\\292.01\\\\-65.81827\\\\143.3109\\\\292.01\\\\-66.16071\\\\147.9984\\\\292.01\\\\-66.35813\\\\152.6859\\\\292.01\\\\-66.35179\\\\157.3734\\\\292.01\\\\-66.26755\\\\159.7172\\\\292.01\\\\-65.93555\\\\164.4047\\\\292.01\\\\-65.72266\\\\166.7484\\\\292.01\\\\-65.40382\\\\169.0922\\\\292.01\\\\-64.58663\\\\171.4359\\\\292.01\\\\-63.71209\\\\176.1234\\\\292.01\\\\-61.78386\\\\180.8109\\\\292.01\\\\-61.30256\\\\183.1547\\\\292.01\\\\-60.36086\\\\185.4984\\\\292.01\\\\-59.18586\\\\187.8422\\\\292.01\\\\-57.87363\\\\190.1859\\\\292.01\\\\-56.84834\\\\192.5297\\\\292.01\\\\-55.66406\\\\194.5832\\\\292.01\\\\-54.00845\\\\197.2172\\\\292.01\\\\-50.97656\\\\201.6594\\\\292.01\\\\-47.27555\\\\206.5922\\\\292.01\\\\-42.76654\\\\211.2797\\\\292.01\\\\-39.25781\\\\214.6977\\\\292.01\\\\-34.57031\\\\218.3578\\\\292.01\\\\-32.22656\\\\219.9231\\\\292.01\\\\-27.53906\\\\223.3272\\\\292.01\\\\-25.19531\\\\224.3983\\\\292.01\\\\-22.85156\\\\225.7515\\\\292.01\\\\-20.50781\\\\226.8662\\\\292.01\\\\-18.16406\\\\228.3724\\\\292.01\\\\-15.82031\\\\229.1319\\\\292.01\\\\-14.95299\\\\230.0297\\\\292.01\\\\-15.82031\\\\231.3763\\\\292.01\\\\-16.95703\\\\232.3734\\\\292.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"352\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0632\\\\295.01\\\\-39.25781\\\\233.1397\\\\295.01\\\\-41.60156\\\\233.1221\\\\295.01\\\\-53.32031\\\\233.1818\\\\295.01\\\\-60.35156\\\\233.1818\\\\295.01\\\\-62.69531\\\\233.1221\\\\295.01\\\\-65.03906\\\\232.8497\\\\295.01\\\\-69.72656\\\\232.9735\\\\295.01\\\\-74.41406\\\\233.0145\\\\295.01\\\\-83.78906\\\\233.0145\\\\295.01\\\\-93.16406\\\\233.0859\\\\295.01\\\\-109.5703\\\\233.1132\\\\295.01\\\\-111.9141\\\\233.5764\\\\295.01\\\\-114.2578\\\\233.9331\\\\295.01\\\\-125.9766\\\\234.0105\\\\295.01\\\\-130.6641\\\\233.9793\\\\295.01\\\\-135.3516\\\\234.0672\\\\295.01\\\\-137.6953\\\\234.0035\\\\295.01\\\\-142.3828\\\\234.0672\\\\295.01\\\\-151.7578\\\\233.9848\\\\295.01\\\\-154.1016\\\\234.0192\\\\295.01\\\\-163.4766\\\\233.9784\\\\295.01\\\\-165.8203\\\\234.0072\\\\295.01\\\\-168.1641\\\\234.1894\\\\295.01\\\\-172.8516\\\\234.2539\\\\295.01\\\\-175.1953\\\\234.2012\\\\295.01\\\\-186.9141\\\\234.2721\\\\295.01\\\\-189.2578\\\\234.2326\\\\295.01\\\\-193.9453\\\\234.261\\\\295.01\\\\-198.6328\\\\234.1692\\\\295.01\\\\-200.9766\\\\234.2362\\\\295.01\\\\-205.6641\\\\234.1564\\\\295.01\\\\-208.0078\\\\234.1992\\\\295.01\\\\-215.0391\\\\234.2125\\\\295.01\\\\-222.0703\\\\234.2967\\\\295.01\\\\-224.4141\\\\234.226\\\\295.01\\\\-229.1016\\\\234.2224\\\\295.01\\\\-233.7891\\\\234.067\\\\295.01\\\\-240.8203\\\\234.1692\\\\295.01\\\\-243.1641\\\\234.1482\\\\295.01\\\\-247.8516\\\\233.8526\\\\295.01\\\\-250.1953\\\\233.9885\\\\295.01\\\\-252.5391\\\\234.8955\\\\295.01\\\\-254.3724\\\\237.0609\\\\295.01\\\\-255.6279\\\\239.4047\\\\295.01\\\\-254.6435\\\\241.7484\\\\295.01\\\\-254.2969\\\\244.0922\\\\295.01\\\\-254.2467\\\\248.7797\\\\295.01\\\\-253.6501\\\\253.4672\\\\295.01\\\\-252.733\\\\255.8109\\\\295.01\\\\-250.7417\\\\258.1547\\\\295.01\\\\-247.8516\\\\261.34\\\\295.01\\\\-246.2058\\\\262.8422\\\\295.01\\\\-244.0969\\\\265.1859\\\\295.01\\\\-241.6217\\\\267.5297\\\\295.01\\\\-239.489\\\\269.8734\\\\295.01\\\\-233.7891\\\\275.382\\\\295.01\\\\-231.4453\\\\277.8344\\\\295.01\\\\-229.1016\\\\280.0153\\\\295.01\\\\-226.7578\\\\282.5409\\\\295.01\\\\-224.4141\\\\284.6849\\\\295.01\\\\-222.0703\\\\287.2122\\\\295.01\\\\-220.5406\\\\288.6234\\\\295.01\\\\-218.2745\\\\290.9672\\\\295.01\\\\-217.3828\\\\291.6508\\\\295.01\\\\-215.0391\\\\293.0865\\\\295.01\\\\-212.6953\\\\294.6149\\\\295.01\\\\-210.3516\\\\295.3416\\\\295.01\\\\-208.0078\\\\296.4592\\\\295.01\\\\-205.6641\\\\296.8974\\\\295.01\\\\-203.3203\\\\297.1488\\\\295.01\\\\-196.2891\\\\297.1563\\\\295.01\\\\-193.9453\\\\297.0647\\\\295.01\\\\-182.2266\\\\296.9607\\\\295.01\\\\-175.1953\\\\296.9311\\\\295.01\\\\-170.5078\\\\296.8813\\\\295.01\\\\-158.7891\\\\296.8978\\\\295.01\\\\-154.1016\\\\296.9236\\\\295.01\\\\-149.4141\\\\296.8921\\\\295.01\\\\-142.3828\\\\296.9338\\\\295.01\\\\-128.3203\\\\296.942\\\\295.01\\\\-116.6016\\\\296.854\\\\295.01\\\\-111.9141\\\\296.8927\\\\295.01\\\\-109.5703\\\\296.8635\\\\295.01\\\\-102.5391\\\\296.8927\\\\295.01\\\\-97.85156\\\\296.8641\\\\295.01\\\\-88.47656\\\\296.9234\\\\295.01\\\\-81.44531\\\\296.9428\\\\295.01\\\\-74.41406\\\\296.9322\\\\295.01\\\\-67.38281\\\\296.9622\\\\295.01\\\\-65.03906\\\\297.1085\\\\295.01\\\\-62.69531\\\\297.0091\\\\295.01\\\\-60.35156\\\\297.0949\\\\295.01\\\\-58.00781\\\\297.0091\\\\295.01\\\\-53.32031\\\\297.0091\\\\295.01\\\\-50.97656\\\\296.9644\\\\295.01\\\\-46.28906\\\\297.3691\\\\295.01\\\\-43.94531\\\\297.4229\\\\295.01\\\\-39.25781\\\\297.2468\\\\295.01\\\\-36.91406\\\\297.1104\\\\295.01\\\\-34.57031\\\\297.373\\\\295.01\\\\-32.22656\\\\297.22\\\\295.01\\\\-29.88281\\\\297.4441\\\\295.01\\\\-27.53906\\\\297.3984\\\\295.01\\\\-22.85156\\\\297.4334\\\\295.01\\\\-13.47656\\\\297.4125\\\\295.01\\\\-11.13281\\\\297.252\\\\295.01\\\\-8.789063\\\\297.4022\\\\295.01\\\\-6.445313\\\\297.231\\\\295.01\\\\-4.101563\\\\297.3798\\\\295.01\\\\-1.757813\\\\296.9644\\\\295.01\\\\0.5859375\\\\297.252\\\\295.01\\\\2.929688\\\\297.4229\\\\295.01\\\\5.273438\\\\297.1516\\\\295.01\\\\9.960938\\\\296.8998\\\\295.01\\\\12.30469\\\\296.8888\\\\295.01\\\\14.64844\\\\296.9755\\\\295.01\\\\16.99219\\\\296.8888\\\\295.01\\\\28.71094\\\\296.878\\\\295.01\\\\40.42969\\\\296.847\\\\295.01\\\\59.17969\\\\296.7115\\\\295.01\\\\61.52344\\\\296.6365\\\\295.01\\\\66.21094\\\\296.6365\\\\295.01\\\\77.92969\\\\296.5696\\\\295.01\\\\89.64844\\\\296.5616\\\\295.01\\\\101.3672\\\\296.506\\\\295.01\\\\106.0547\\\\296.4528\\\\295.01\\\\115.4297\\\\296.4117\\\\295.01\\\\124.8047\\\\296.308\\\\295.01\\\\129.4922\\\\296.3348\\\\295.01\\\\131.8359\\\\296.1569\\\\295.01\\\\134.1797\\\\296.1766\\\\295.01\\\\136.5234\\\\295.9102\\\\295.01\\\\141.2109\\\\295.8807\\\\295.01\\\\143.5547\\\\295.9983\\\\295.01\\\\145.8984\\\\295.8791\\\\295.01\\\\148.2422\\\\295.8791\\\\295.01\\\\157.6172\\\\295.7684\\\\295.01\\\\166.9922\\\\295.7173\\\\295.01\\\\169.3359\\\\295.6638\\\\295.01\\\\174.0234\\\\295.6638\\\\295.01\\\\176.3672\\\\295.5916\\\\295.01\\\\183.3984\\\\295.5235\\\\295.01\\\\188.0859\\\\295.5742\\\\295.01\\\\192.7734\\\\295.557\\\\295.01\\\\197.4609\\\\295.8012\\\\295.01\\\\202.1484\\\\295.7173\\\\295.01\\\\204.4922\\\\295.4137\\\\295.01\\\\206.8359\\\\294.8107\\\\295.01\\\\209.1797\\\\294.3656\\\\295.01\\\\211.5234\\\\292.4688\\\\295.01\\\\213.8672\\\\291.1611\\\\295.01\\\\216.2109\\\\289.5734\\\\295.01\\\\217.2207\\\\288.6234\\\\295.01\\\\218.5547\\\\287.0638\\\\295.01\\\\221.6933\\\\283.9359\\\\295.01\\\\225.5859\\\\279.8647\\\\295.01\\\\227.9297\\\\277.5633\\\\295.01\\\\230.2734\\\\275.067\\\\295.01\\\\233.2115\\\\272.2172\\\\295.01\\\\234.9609\\\\270.3037\\\\295.01\\\\237.7232\\\\267.5297\\\\295.01\\\\239.9391\\\\265.1859\\\\295.01\\\\244.3359\\\\260.7816\\\\295.01\\\\246.788\\\\258.1547\\\\295.01\\\\249.0234\\\\255.4653\\\\295.01\\\\250.3651\\\\253.4672\\\\295.01\\\\251.5764\\\\251.1234\\\\295.01\\\\252.2446\\\\248.7797\\\\295.01\\\\252.5619\\\\246.4359\\\\295.01\\\\252.6451\\\\241.7484\\\\295.01\\\\252.8992\\\\239.4047\\\\295.01\\\\253.0001\\\\237.0609\\\\295.01\\\\252.33\\\\234.7172\\\\295.01\\\\251.3672\\\\233.4192\\\\295.01\\\\249.0234\\\\232.9487\\\\295.01\\\\241.9922\\\\233.0537\\\\295.01\\\\237.3047\\\\232.9699\\\\295.01\\\\232.6172\\\\232.9487\\\\295.01\\\\227.9297\\\\233.0207\\\\295.01\\\\216.2109\\\\233.0819\\\\295.01\\\\211.5234\\\\233.0632\\\\295.01\\\\206.8359\\\\232.9699\\\\295.01\\\\204.4922\\\\232.7588\\\\295.01\\\\199.8047\\\\232.7322\\\\295.01\\\\190.4297\\\\232.7975\\\\295.01\\\\176.3672\\\\232.7186\\\\295.01\\\\162.3047\\\\232.7322\\\\295.01\\\\152.9297\\\\232.7848\\\\295.01\\\\143.5547\\\\232.7456\\\\295.01\\\\138.8672\\\\232.6623\\\\295.01\\\\136.5234\\\\232.6908\\\\295.01\\\\131.8359\\\\232.6329\\\\295.01\\\\127.1484\\\\232.6623\\\\295.01\\\\124.8047\\\\232.6329\\\\295.01\\\\110.7422\\\\232.6477\\\\295.01\\\\108.3984\\\\232.6179\\\\295.01\\\\106.0547\\\\231.7168\\\\295.01\\\\103.7109\\\\232.6027\\\\295.01\\\\101.3672\\\\232.9735\\\\295.01\\\\99.02344\\\\233.091\\\\295.01\\\\89.64844\\\\233.1091\\\\295.01\\\\80.27344\\\\233.0819\\\\295.01\\\\73.24219\\\\233.131\\\\295.01\\\\66.21094\\\\233.1132\\\\295.01\\\\56.83594\\\\233.1397\\\\295.01\\\\54.49219\\\\233.1042\\\\295.01\\\\45.11719\\\\233.0951\\\\295.01\\\\44.15678\\\\232.3734\\\\295.01\\\\42.77344\\\\231.0106\\\\295.01\\\\42.05375\\\\230.0297\\\\295.01\\\\42.77344\\\\229.2553\\\\295.01\\\\45.11719\\\\228.5743\\\\295.01\\\\47.46094\\\\227.0897\\\\295.01\\\\49.80469\\\\226.0467\\\\295.01\\\\52.14844\\\\224.5908\\\\295.01\\\\54.49219\\\\223.7059\\\\295.01\\\\56.83594\\\\221.8778\\\\295.01\\\\59.17969\\\\220.2334\\\\295.01\\\\61.52344\\\\218.9233\\\\295.01\\\\64.98363\\\\215.9672\\\\295.01\\\\66.21094\\\\215.0635\\\\295.01\\\\67.76714\\\\213.6234\\\\295.01\\\\68.55469\\\\212.7302\\\\295.01\\\\70.89844\\\\210.5392\\\\295.01\\\\74.57118\\\\206.5922\\\\295.01\\\\76.57597\\\\204.2484\\\\295.01\\\\78.3308\\\\201.9047\\\\295.01\\\\80.27344\\\\198.9949\\\\295.01\\\\81.35471\\\\197.2172\\\\295.01\\\\83.0397\\\\194.8734\\\\295.01\\\\84.14964\\\\192.5297\\\\295.01\\\\85.47139\\\\190.1859\\\\295.01\\\\86.37085\\\\187.8422\\\\295.01\\\\87.84957\\\\185.4984\\\\295.01\\\\88.62815\\\\183.1547\\\\295.01\\\\89.2244\\\\180.8109\\\\295.01\\\\90.29716\\\\178.4672\\\\295.01\\\\91.52786\\\\173.7797\\\\295.01\\\\92.50722\\\\171.4359\\\\295.01\\\\92.97176\\\\169.0922\\\\295.01\\\\93.68722\\\\157.3734\\\\295.01\\\\93.72856\\\\152.6859\\\\295.01\\\\93.52158\\\\147.9984\\\\295.01\\\\93.06984\\\\140.9672\\\\295.01\\\\92.83925\\\\138.6234\\\\295.01\\\\92.12536\\\\136.2797\\\\295.01\\\\91.24645\\\\133.9359\\\\295.01\\\\90.72266\\\\131.5922\\\\295.01\\\\89.95934\\\\129.2484\\\\295.01\\\\88.9045\\\\126.9047\\\\295.01\\\\88.46478\\\\124.5609\\\\295.01\\\\87.35082\\\\122.2172\\\\295.01\\\\86.12689\\\\119.8734\\\\295.01\\\\85.13927\\\\117.5297\\\\295.01\\\\83.90684\\\\115.1859\\\\295.01\\\\82.26481\\\\112.8422\\\\295.01\\\\81.10777\\\\110.4984\\\\295.01\\\\77.92969\\\\106.3366\\\\295.01\\\\77.45313\\\\105.8109\\\\295.01\\\\75.98749\\\\103.4672\\\\295.01\\\\71.75832\\\\98.77969\\\\295.01\\\\68.55469\\\\95.61713\\\\295.01\\\\63.86719\\\\91.51749\\\\295.01\\\\61.52344\\\\90.08352\\\\295.01\\\\59.17969\\\\88.14508\\\\295.01\\\\56.83594\\\\86.47145\\\\295.01\\\\54.49219\\\\85.40367\\\\295.01\\\\52.14844\\\\83.63686\\\\295.01\\\\49.80469\\\\82.85554\\\\295.01\\\\47.46094\\\\81.48983\\\\295.01\\\\45.11719\\\\80.5947\\\\295.01\\\\42.77344\\\\79.16859\\\\295.01\\\\40.42969\\\\78.71358\\\\295.01\\\\38.08594\\\\78.12252\\\\295.01\\\\35.74219\\\\77.10697\\\\295.01\\\\33.39844\\\\76.50327\\\\295.01\\\\31.05469\\\\76.07934\\\\295.01\\\\28.71094\\\\75.31472\\\\295.01\\\\26.36719\\\\74.67744\\\\295.01\\\\24.02344\\\\74.42056\\\\295.01\\\\16.99219\\\\74.12224\\\\295.01\\\\12.30469\\\\74.07317\\\\295.01\\\\7.617188\\\\74.17641\\\\295.01\\\\2.929688\\\\74.40835\\\\295.01\\\\0.5859375\\\\74.66957\\\\295.01\\\\-4.101563\\\\76.07934\\\\295.01\\\\-6.445313\\\\76.52584\\\\295.01\\\\-8.789063\\\\77.22805\\\\295.01\\\\-11.13281\\\\78.25741\\\\295.01\\\\-15.82031\\\\79.32516\\\\295.01\\\\-18.16406\\\\80.7914\\\\295.01\\\\-20.50781\\\\81.66099\\\\295.01\\\\-22.85156\\\\83.04977\\\\295.01\\\\-25.19531\\\\83.83018\\\\295.01\\\\-27.53906\\\\85.65853\\\\295.01\\\\-29.88281\\\\86.7363\\\\295.01\\\\-32.22656\\\\88.3882\\\\295.01\\\\-34.57031\\\\90.3647\\\\295.01\\\\-36.52969\\\\91.74844\\\\295.01\\\\-41.60156\\\\95.97882\\\\295.01\\\\-46.52696\\\\101.1234\\\\295.01\\\\-48.63281\\\\103.7908\\\\295.01\\\\-50.13672\\\\105.8109\\\\295.01\\\\-52.07761\\\\108.1547\\\\295.01\\\\-53.5798\\\\110.4984\\\\295.01\\\\-54.92211\\\\112.8422\\\\295.01\\\\-56.62057\\\\115.1859\\\\295.01\\\\-57.39671\\\\117.5297\\\\295.01\\\\-58.88357\\\\119.8734\\\\295.01\\\\-59.73514\\\\122.2172\\\\295.01\\\\-61.08647\\\\124.5609\\\\295.01\\\\-61.55913\\\\126.9047\\\\295.01\\\\-62.3125\\\\129.2484\\\\295.01\\\\-63.44866\\\\131.5922\\\\295.01\\\\-64.00282\\\\133.9359\\\\295.01\\\\-64.36475\\\\136.2797\\\\295.01\\\\-65.6146\\\\140.9672\\\\295.01\\\\-65.84246\\\\143.3109\\\\295.01\\\\-66.18851\\\\147.9984\\\\295.01\\\\-66.41199\\\\152.6859\\\\295.01\\\\-66.39387\\\\157.3734\\\\295.01\\\\-66.14896\\\\162.0609\\\\295.01\\\\-65.75378\\\\166.7484\\\\295.01\\\\-65.45489\\\\169.0922\\\\295.01\\\\-64.61088\\\\171.4359\\\\295.01\\\\-63.74142\\\\176.1234\\\\295.01\\\\-62.87364\\\\178.4672\\\\295.01\\\\-61.83551\\\\180.8109\\\\295.01\\\\-61.31699\\\\183.1547\\\\295.01\\\\-60.39734\\\\185.4984\\\\295.01\\\\-59.19819\\\\187.8422\\\\295.01\\\\-57.87465\\\\190.1859\\\\295.01\\\\-56.84821\\\\192.5297\\\\295.01\\\\-55.66406\\\\194.6634\\\\295.01\\\\-54.06846\\\\197.2172\\\\295.01\\\\-50.97656\\\\201.7629\\\\295.01\\\\-47.3112\\\\206.5922\\\\295.01\\\\-42.79436\\\\211.2797\\\\295.01\\\\-39.25781\\\\214.7107\\\\295.01\\\\-34.57031\\\\218.463\\\\295.01\\\\-32.22656\\\\219.9411\\\\295.01\\\\-27.96936\\\\222.9984\\\\295.01\\\\-27.53906\\\\223.3836\\\\295.01\\\\-25.19531\\\\224.406\\\\295.01\\\\-22.85156\\\\225.8094\\\\295.01\\\\-20.50781\\\\226.8905\\\\295.01\\\\-18.16406\\\\228.4055\\\\295.01\\\\-15.82031\\\\229.1319\\\\295.01\\\\-14.95299\\\\230.0297\\\\295.01\\\\-15.82031\\\\231.3646\\\\295.01\\\\-16.96898\\\\232.3734\\\\295.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"358\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"8\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0632\\\\298.01\\\\-27.53906\\\\233.1042\\\\298.01\\\\-29.88281\\\\233.0819\\\\298.01\\\\-34.57031\\\\233.131\\\\298.01\\\\-43.94531\\\\233.1221\\\\298.01\\\\-50.97656\\\\233.1736\\\\298.01\\\\-62.69531\\\\233.1397\\\\298.01\\\\-65.03906\\\\232.8376\\\\298.01\\\\-69.72656\\\\232.9839\\\\298.01\\\\-79.10156\\\\233.0245\\\\298.01\\\\-90.82031\\\\233.0382\\\\298.01\\\\-93.16406\\\\233.0859\\\\298.01\\\\-109.5703\\\\233.1132\\\\298.01\\\\-111.9141\\\\233.1791\\\\298.01\\\\-114.2578\\\\233.7139\\\\298.01\\\\-118.9453\\\\233.9793\\\\298.01\\\\-128.3203\\\\234.0284\\\\298.01\\\\-130.6641\\\\233.9793\\\\298.01\\\\-135.3516\\\\234.0591\\\\298.01\\\\-137.6953\\\\234.0284\\\\298.01\\\\-142.3828\\\\234.0855\\\\298.01\\\\-144.7266\\\\234.0284\\\\298.01\\\\-151.7578\\\\234.002\\\\298.01\\\\-158.7891\\\\234.0263\\\\298.01\\\\-163.4766\\\\233.9784\\\\298.01\\\\-165.8203\\\\234.0072\\\\298.01\\\\-168.1641\\\\234.1756\\\\298.01\\\\-170.5078\\\\234.2214\\\\298.01\\\\-179.8828\\\\234.1934\\\\298.01\\\\-186.9141\\\\234.2721\\\\298.01\\\\-189.2578\\\\234.2289\\\\298.01\\\\-193.9453\\\\234.2431\\\\298.01\\\\-198.6328\\\\234.1692\\\\298.01\\\\-200.9766\\\\234.2326\\\\298.01\\\\-205.6641\\\\234.1271\\\\298.01\\\\-212.6953\\\\234.2224\\\\298.01\\\\-215.0391\\\\234.1992\\\\298.01\\\\-222.0703\\\\234.3115\\\\298.01\\\\-224.4141\\\\234.2224\\\\298.01\\\\-226.7578\\\\234.2502\\\\298.01\\\\-233.7891\\\\234.0906\\\\298.01\\\\-238.4766\\\\234.0329\\\\298.01\\\\-243.1641\\\\234.0283\\\\298.01\\\\-247.8516\\\\233.7949\\\\298.01\\\\-250.1953\\\\233.8681\\\\298.01\\\\-252.5391\\\\234.7626\\\\298.01\\\\-254.3469\\\\237.0609\\\\298.01\\\\-255.6034\\\\239.4047\\\\298.01\\\\-254.5181\\\\241.7484\\\\298.01\\\\-254.2274\\\\244.0922\\\\298.01\\\\-254.181\\\\248.7797\\\\298.01\\\\-253.9355\\\\251.1234\\\\298.01\\\\-253.5926\\\\253.4672\\\\298.01\\\\-252.7483\\\\255.8109\\\\298.01\\\\-250.8092\\\\258.1547\\\\298.01\\\\-248.713\\\\260.4984\\\\298.01\\\\-246.263\\\\262.8422\\\\298.01\\\\-244.1406\\\\265.1859\\\\298.01\\\\-241.6671\\\\267.5297\\\\298.01\\\\-239.4754\\\\269.8734\\\\298.01\\\\-237.0156\\\\272.2172\\\\298.01\\\\-233.7891\\\\275.382\\\\298.01\\\\-231.4453\\\\277.8249\\\\298.01\\\\-229.1016\\\\279.9981\\\\298.01\\\\-226.7578\\\\282.5281\\\\298.01\\\\-224.4141\\\\284.6784\\\\298.01\\\\-222.0703\\\\287.2355\\\\298.01\\\\-220.5414\\\\288.6234\\\\298.01\\\\-218.2745\\\\290.9672\\\\298.01\\\\-217.3828\\\\291.6508\\\\298.01\\\\-212.6953\\\\294.5949\\\\298.01\\\\-210.3516\\\\295.3142\\\\298.01\\\\-208.0078\\\\296.4674\\\\298.01\\\\-205.6641\\\\296.8852\\\\298.01\\\\-203.3203\\\\297.1563\\\\298.01\\\\-196.2891\\\\297.1488\\\\298.01\\\\-193.9453\\\\297.0597\\\\298.01\\\\-182.2266\\\\296.9529\\\\298.01\\\\-168.1641\\\\296.8576\\\\298.01\\\\-154.1016\\\\296.9249\\\\298.01\\\\-149.4141\\\\296.8921\\\\298.01\\\\-128.3203\\\\296.9228\\\\298.01\\\\-121.2891\\\\296.8623\\\\298.01\\\\-111.9141\\\\296.8549\\\\298.01\\\\-107.2266\\\\296.8266\\\\298.01\\\\-102.5391\\\\296.8731\\\\298.01\\\\-95.50781\\\\296.8453\\\\298.01\\\\-88.47656\\\\296.9218\\\\298.01\\\\-83.78906\\\\296.9016\\\\298.01\\\\-69.72656\\\\296.979\\\\298.01\\\\-67.38281\\\\296.9514\\\\298.01\\\\-65.03906\\\\297.2199\\\\298.01\\\\-62.69531\\\\296.9622\\\\298.01\\\\-55.66406\\\\296.9926\\\\298.01\\\\-50.97656\\\\296.9467\\\\298.01\\\\-48.63281\\\\297.3652\\\\298.01\\\\-46.28906\\\\297.0439\\\\298.01\\\\-43.94531\\\\297.2875\\\\298.01\\\\-39.25781\\\\297.0121\\\\298.01\\\\-34.57031\\\\297.1564\\\\298.01\\\\-32.22656\\\\297.3612\\\\298.01\\\\-29.88281\\\\297.4229\\\\298.01\\\\-27.53906\\\\297.1687\\\\298.01\\\\-25.19531\\\\297.4334\\\\298.01\\\\-18.16406\\\\297.3612\\\\298.01\\\\-15.82031\\\\297.4441\\\\298.01\\\\-13.47656\\\\297.4125\\\\298.01\\\\-11.13281\\\\297.2468\\\\298.01\\\\-8.789063\\\\297.4125\\\\298.01\\\\-6.445313\\\\297.373\\\\298.01\\\\-4.101563\\\\297.4195\\\\298.01\\\\-1.757813\\\\297.077\\\\298.01\\\\0.5859375\\\\297.4229\\\\298.01\\\\2.929688\\\\297.4125\\\\298.01\\\\5.273438\\\\296.9489\\\\298.01\\\\7.617188\\\\297.3168\\\\298.01\\\\9.960938\\\\296.9377\\\\298.01\\\\12.30469\\\\296.8998\\\\298.01\\\\14.64844\\\\297.1975\\\\298.01\\\\16.99219\\\\296.8579\\\\298.01\\\\28.71094\\\\296.878\\\\298.01\\\\40.42969\\\\296.8163\\\\298.01\\\\42.77344\\\\296.8369\\\\298.01\\\\49.80469\\\\296.734\\\\298.01\\\\59.17969\\\\296.6906\\\\298.01\\\\61.52344\\\\296.6365\\\\298.01\\\\68.55469\\\\296.6278\\\\298.01\\\\73.24219\\\\296.5777\\\\298.01\\\\75.58594\\\\296.6191\\\\298.01\\\\84.96094\\\\296.5284\\\\298.01\\\\96.67969\\\\296.5538\\\\298.01\\\\103.7109\\\\296.479\\\\298.01\\\\115.4297\\\\296.4259\\\\298.01\\\\122.4609\\\\296.3434\\\\298.01\\\\129.4922\\\\296.3495\\\\298.01\\\\131.8359\\\\295.9141\\\\298.01\\\\136.5234\\\\296.2256\\\\298.01\\\\138.8672\\\\295.833\\\\298.01\\\\143.5547\\\\295.9857\\\\298.01\\\\145.8984\\\\295.8791\\\\298.01\\\\152.9297\\\\295.833\\\\298.01\\\\164.6484\\\\295.6819\\\\298.01\\\\171.6797\\\\295.6819\\\\298.01\\\\181.0547\\\\295.5401\\\\298.01\\\\185.7422\\\\295.5742\\\\298.01\\\\192.7734\\\\295.557\\\\298.01\\\\197.4609\\\\295.8012\\\\298.01\\\\202.1484\\\\295.6819\\\\298.01\\\\204.4922\\\\295.3698\\\\298.01\\\\206.8359\\\\294.803\\\\298.01\\\\209.1797\\\\294.3656\\\\298.01\\\\211.5234\\\\292.4764\\\\298.01\\\\213.8672\\\\291.1765\\\\298.01\\\\216.2109\\\\289.5873\\\\298.01\\\\217.229\\\\288.6234\\\\298.01\\\\218.5547\\\\287.0752\\\\298.01\\\\221.7097\\\\283.9359\\\\298.01\\\\225.5859\\\\279.8775\\\\298.01\\\\227.9297\\\\277.5633\\\\298.01\\\\230.2734\\\\275.0808\\\\298.01\\\\233.1989\\\\272.2172\\\\298.01\\\\234.9609\\\\270.2887\\\\298.01\\\\237.7384\\\\267.5297\\\\298.01\\\\241.9922\\\\263.0843\\\\298.01\\\\244.3359\\\\260.7643\\\\298.01\\\\246.788\\\\258.1547\\\\298.01\\\\249.0234\\\\255.451\\\\298.01\\\\250.3651\\\\253.4672\\\\298.01\\\\251.5297\\\\251.1234\\\\298.01\\\\252.1947\\\\248.7797\\\\298.01\\\\252.4915\\\\246.4359\\\\298.01\\\\252.5755\\\\241.7484\\\\298.01\\\\252.8592\\\\239.4047\\\\298.01\\\\252.9236\\\\237.0609\\\\298.01\\\\252.2924\\\\234.7172\\\\298.01\\\\251.3672\\\\233.4697\\\\298.01\\\\249.0234\\\\232.882\\\\298.01\\\\244.3359\\\\232.9048\\\\298.01\\\\241.9922\\\\233.0145\\\\298.01\\\\232.6172\\\\232.9048\\\\298.01\\\\227.9297\\\\233.0007\\\\298.01\\\\216.2109\\\\233.0632\\\\298.01\\\\211.5234\\\\233.0537\\\\298.01\\\\206.8359\\\\232.9699\\\\298.01\\\\204.4922\\\\232.7322\\\\298.01\\\\199.8047\\\\232.7186\\\\298.01\\\\190.4297\\\\232.7719\\\\298.01\\\\183.3984\\\\232.7719\\\\298.01\\\\181.0547\\\\232.7322\\\\298.01\\\\174.0234\\\\232.7048\\\\298.01\\\\171.6797\\\\232.7322\\\\298.01\\\\166.9922\\\\232.6908\\\\298.01\\\\157.6172\\\\232.7975\\\\298.01\\\\155.2734\\\\232.7588\\\\298.01\\\\148.2422\\\\232.7875\\\\298.01\\\\143.5547\\\\232.7614\\\\298.01\\\\138.8672\\\\232.6477\\\\298.01\\\\124.8047\\\\232.6179\\\\298.01\\\\122.4609\\\\232.6477\\\\298.01\\\\113.0859\\\\232.6027\\\\298.01\\\\110.7422\\\\232.4552\\\\298.01\\\\108.3984\\\\232.2192\\\\298.01\\\\106.0547\\\\231.6764\\\\298.01\\\\103.7109\\\\231.8559\\\\298.01\\\\102.8237\\\\232.3734\\\\298.01\\\\101.3672\\\\232.9839\\\\298.01\\\\99.02344\\\\233.0951\\\\298.01\\\\87.30469\\\\233.0819\\\\298.01\\\\84.96094\\\\233.1091\\\\298.01\\\\80.27344\\\\233.0726\\\\298.01\\\\77.92969\\\\233.1132\\\\298.01\\\\70.89844\\\\233.1397\\\\298.01\\\\68.55469\\\\233.1132\\\\298.01\\\\52.14844\\\\233.131\\\\298.01\\\\45.11719\\\\233.0859\\\\298.01\\\\44.16726\\\\232.3734\\\\298.01\\\\42.77344\\\\231.0206\\\\298.01\\\\42.04498\\\\230.0297\\\\298.01\\\\42.77344\\\\229.2462\\\\298.01\\\\45.11719\\\\228.5664\\\\298.01\\\\47.46094\\\\227.0695\\\\298.01\\\\49.80469\\\\226.0552\\\\298.01\\\\52.14844\\\\224.5723\\\\298.01\\\\54.49219\\\\223.6857\\\\298.01\\\\56.83594\\\\221.8519\\\\298.01\\\\59.17969\\\\220.2086\\\\298.01\\\\61.52344\\\\218.8854\\\\298.01\\\\64.94469\\\\215.9672\\\\298.01\\\\66.21094\\\\215.0191\\\\298.01\\\\67.72036\\\\213.6234\\\\298.01\\\\68.55469\\\\212.6986\\\\298.01\\\\70.89844\\\\210.5055\\\\298.01\\\\74.53191\\\\206.5922\\\\298.01\\\\76.54903\\\\204.2484\\\\298.01\\\\78.26105\\\\201.9047\\\\298.01\\\\80.27344\\\\198.9262\\\\298.01\\\\82.61719\\\\195.2822\\\\298.01\\\\82.98087\\\\194.8734\\\\298.01\\\\84.96094\\\\190.9255\\\\298.01\\\\85.43701\\\\190.1859\\\\298.01\\\\86.33423\\\\187.8422\\\\298.01\\\\87.78722\\\\185.4984\\\\298.01\\\\88.60233\\\\183.1547\\\\298.01\\\\89.10253\\\\180.8109\\\\298.01\\\\90.17504\\\\178.4672\\\\298.01\\\\90.88959\\\\176.1234\\\\298.01\\\\91.43783\\\\173.7797\\\\298.01\\\\92.39601\\\\171.4359\\\\298.01\\\\92.95762\\\\169.0922\\\\298.01\\\\93.55695\\\\159.7172\\\\298.01\\\\93.65527\\\\157.3734\\\\298.01\\\\93.67542\\\\152.6859\\\\298.01\\\\93.61213\\\\150.3422\\\\298.01\\\\93.22542\\\\143.3109\\\\298.01\\\\93.06345\\\\140.9672\\\\298.01\\\\92.77563\\\\138.6234\\\\298.01\\\\91.21714\\\\133.9359\\\\298.01\\\\90.67235\\\\131.5922\\\\298.01\\\\89.88776\\\\129.2484\\\\298.01\\\\88.8737\\\\126.9047\\\\298.01\\\\88.44087\\\\124.5609\\\\298.01\\\\86.09712\\\\119.8734\\\\298.01\\\\85.05786\\\\117.5297\\\\298.01\\\\83.87151\\\\115.1859\\\\298.01\\\\82.22388\\\\112.8422\\\\298.01\\\\81.09117\\\\110.4984\\\\298.01\\\\77.92969\\\\106.4052\\\\298.01\\\\77.3894\\\\105.8109\\\\298.01\\\\75.94332\\\\103.4672\\\\298.01\\\\71.71799\\\\98.77969\\\\298.01\\\\68.55469\\\\95.65721\\\\298.01\\\\63.86719\\\\91.54878\\\\298.01\\\\61.52344\\\\90.1121\\\\298.01\\\\59.17969\\\\88.15762\\\\298.01\\\\56.83594\\\\86.51503\\\\298.01\\\\54.49219\\\\85.42721\\\\298.01\\\\52.14844\\\\83.64907\\\\298.01\\\\49.80469\\\\82.89023\\\\298.01\\\\47.46094\\\\81.50237\\\\298.01\\\\45.11719\\\\80.62591\\\\298.01\\\\42.77344\\\\79.18153\\\\298.01\\\\40.42969\\\\78.7203\\\\298.01\\\\38.08594\\\\78.1349\\\\298.01\\\\35.74219\\\\77.11755\\\\298.01\\\\33.39844\\\\76.51949\\\\298.01\\\\31.05469\\\\76.07934\\\\298.01\\\\26.36719\\\\74.67744\\\\298.01\\\\24.02344\\\\74.42056\\\\298.01\\\\14.64844\\\\74.07317\\\\298.01\\\\9.960938\\\\74.11538\\\\298.01\\\\2.929688\\\\74.40105\\\\298.01\\\\0.5859375\\\\74.67952\\\\298.01\\\\-1.757813\\\\75.31406\\\\298.01\\\\-4.101563\\\\76.07065\\\\298.01\\\\-6.445313\\\\76.49051\\\\298.01\\\\-8.789063\\\\77.17276\\\\298.01\\\\-11.13281\\\\78.20097\\\\298.01\\\\-15.82031\\\\79.31967\\\\298.01\\\\-18.16406\\\\80.76948\\\\298.01\\\\-20.50781\\\\81.64266\\\\298.01\\\\-22.85156\\\\83.0305\\\\298.01\\\\-25.19531\\\\83.7937\\\\298.01\\\\-27.53906\\\\85.63515\\\\298.01\\\\-29.88281\\\\86.7363\\\\298.01\\\\-32.22656\\\\88.36089\\\\298.01\\\\-34.57031\\\\90.3302\\\\298.01\\\\-36.56719\\\\91.74844\\\\298.01\\\\-41.60156\\\\95.93605\\\\298.01\\\\-46.58845\\\\101.1234\\\\298.01\\\\-50.17995\\\\105.8109\\\\298.01\\\\-52.10386\\\\108.1547\\\\298.01\\\\-53.63992\\\\110.4984\\\\298.01\\\\-54.95532\\\\112.8422\\\\298.01\\\\-56.64794\\\\115.1859\\\\298.01\\\\-57.4403\\\\117.5297\\\\298.01\\\\-58.91927\\\\119.8734\\\\298.01\\\\-59.78655\\\\122.2172\\\\298.01\\\\-61.11754\\\\124.5609\\\\298.01\\\\-61.58921\\\\126.9047\\\\298.01\\\\-62.38012\\\\129.2484\\\\298.01\\\\-63.49118\\\\131.5922\\\\298.01\\\\-64.02599\\\\133.9359\\\\298.01\\\\-64.3932\\\\136.2797\\\\298.01\\\\-65.11897\\\\138.6234\\\\298.01\\\\-65.64544\\\\140.9672\\\\298.01\\\\-66.23938\\\\147.9984\\\\298.01\\\\-66.46289\\\\152.6859\\\\298.01\\\\-66.48911\\\\155.0297\\\\298.01\\\\-66.34437\\\\159.7172\\\\298.01\\\\-65.99894\\\\164.4047\\\\298.01\\\\-65.49149\\\\169.0922\\\\298.01\\\\-64.6875\\\\171.4359\\\\298.01\\\\-63.7739\\\\176.1234\\\\298.01\\\\-62.9398\\\\178.4672\\\\298.01\\\\-61.86011\\\\180.8109\\\\298.01\\\\-61.33423\\\\183.1547\\\\298.01\\\\-60.43332\\\\185.4984\\\\298.01\\\\-58.00781\\\\190.0632\\\\298.01\\\\-56.85406\\\\192.5297\\\\298.01\\\\-55.66406\\\\194.7283\\\\298.01\\\\-54.11692\\\\197.2172\\\\298.01\\\\-50.97656\\\\201.8369\\\\298.01\\\\-47.36435\\\\206.5922\\\\298.01\\\\-45.04395\\\\208.9359\\\\298.01\\\\-42.83026\\\\211.2797\\\\298.01\\\\-39.25781\\\\214.7435\\\\298.01\\\\-34.57031\\\\218.4974\\\\298.01\\\\-32.22656\\\\219.9595\\\\298.01\\\\-28.02053\\\\222.9984\\\\298.01\\\\-27.53906\\\\223.4238\\\\298.01\\\\-25.19531\\\\224.4187\\\\298.01\\\\-22.85156\\\\225.8252\\\\298.01\\\\-20.50781\\\\226.9067\\\\298.01\\\\-18.16406\\\\228.4286\\\\298.01\\\\-15.82031\\\\229.1235\\\\298.01\\\\-14.9447\\\\230.0297\\\\298.01\\\\-15.82031\\\\231.3969\\\\298.01\\\\-16.94484\\\\232.3734\\\\298.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"358\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"9\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-252.9673\\\\255.8109\\\\301.01\\\\-248.7477\\\\260.4984\\\\301.01\\\\-245.5078\\\\263.6263\\\\301.01\\\\-244.1215\\\\265.1859\\\\301.01\\\\-241.6381\\\\267.5297\\\\301.01\\\\-239.4403\\\\269.8734\\\\301.01\\\\-233.7891\\\\275.3765\\\\301.01\\\\-231.4453\\\\277.8215\\\\301.01\\\\-229.1016\\\\280.0093\\\\301.01\\\\-226.7578\\\\282.5186\\\\301.01\\\\-224.4141\\\\284.6481\\\\301.01\\\\-222.0703\\\\287.2057\\\\301.01\\\\-220.5227\\\\288.6234\\\\301.01\\\\-218.2914\\\\290.9672\\\\301.01\\\\-217.3828\\\\291.6599\\\\301.01\\\\-212.6953\\\\294.5939\\\\301.01\\\\-210.3516\\\\295.3008\\\\301.01\\\\-208.0078\\\\296.4424\\\\301.01\\\\-205.6641\\\\296.8595\\\\301.01\\\\-203.3203\\\\297.1563\\\\301.01\\\\-196.2891\\\\297.1563\\\\301.01\\\\-193.9453\\\\297.0746\\\\301.01\\\\-186.9141\\\\297.033\\\\301.01\\\\-177.5391\\\\296.8785\\\\301.01\\\\-165.8203\\\\296.8345\\\\301.01\\\\-151.7578\\\\296.8757\\\\301.01\\\\-149.4141\\\\296.8513\\\\301.01\\\\-140.0391\\\\296.8521\\\\301.01\\\\-137.6953\\\\296.886\\\\301.01\\\\-118.9453\\\\296.8623\\\\301.01\\\\-111.9141\\\\296.8078\\\\301.01\\\\-104.8828\\\\296.8456\\\\301.01\\\\-97.85156\\\\296.836\\\\301.01\\\\-93.16406\\\\296.8927\\\\301.01\\\\-86.13281\\\\296.9203\\\\301.01\\\\-81.44531\\\\296.8927\\\\301.01\\\\-74.41406\\\\296.9514\\\\301.01\\\\-58.00781\\\\296.9428\\\\301.01\\\\-53.32031\\\\296.9579\\\\301.01\\\\-50.97656\\\\296.9175\\\\301.01\\\\-48.63281\\\\297.0362\\\\301.01\\\\-46.28906\\\\296.9267\\\\301.01\\\\-43.94531\\\\297.2032\\\\301.01\\\\-41.60156\\\\297.3168\\\\301.01\\\\-39.25781\\\\296.8998\\\\301.01\\\\-34.57031\\\\297.3691\\\\301.01\\\\-32.22656\\\\297.2089\\\\301.01\\\\-29.88281\\\\297.4229\\\\301.01\\\\-27.53906\\\\297.3299\\\\301.01\\\\-25.19531\\\\297.4125\\\\301.01\\\\-13.47656\\\\297.4125\\\\301.01\\\\-11.13281\\\\297.252\\\\301.01\\\\-8.789063\\\\297.4055\\\\301.01\\\\-6.445313\\\\297.3015\\\\301.01\\\\-4.101563\\\\297.4125\\\\301.01\\\\-1.757813\\\\297.1261\\\\301.01\\\\0.5859375\\\\297.4229\\\\301.01\\\\2.929688\\\\297.4125\\\\301.01\\\\5.273438\\\\297.1687\\\\301.01\\\\7.617188\\\\297.0362\\\\301.01\\\\9.960938\\\\297.1516\\\\301.01\\\\12.30469\\\\296.8579\\\\301.01\\\\14.64844\\\\296.9396\\\\301.01\\\\19.33594\\\\296.8369\\\\301.01\\\\28.71094\\\\296.868\\\\301.01\\\\38.08594\\\\296.7858\\\\301.01\\\\45.11719\\\\296.7858\\\\301.01\\\\49.80469\\\\296.7115\\\\301.01\\\\54.49219\\\\296.7115\\\\301.01\\\\63.86719\\\\296.6154\\\\301.01\\\\66.21094\\\\296.6278\\\\301.01\\\\77.92969\\\\296.5901\\\\301.01\\\\80.27344\\\\296.5362\\\\301.01\\\\91.99219\\\\296.5284\\\\301.01\\\\94.33594\\\\296.5461\\\\301.01\\\\103.7109\\\\296.4917\\\\301.01\\\\106.0547\\\\296.5208\\\\301.01\\\\108.3984\\\\296.4462\\\\301.01\\\\120.1172\\\\296.3831\\\\301.01\\\\129.4922\\\\296.3139\\\\301.01\\\\134.1797\\\\295.9385\\\\301.01\\\\136.5234\\\\296.3023\\\\301.01\\\\138.8672\\\\295.833\\\\301.01\\\\141.2109\\\\295.939\\\\301.01\\\\155.2734\\\\295.7849\\\\301.01\\\\159.9609\\\\295.7849\\\\301.01\\\\169.3359\\\\295.6638\\\\301.01\\\\176.3672\\\\295.6638\\\\301.01\\\\181.0547\\\\295.5742\\\\301.01\\\\185.7422\\\\295.6093\\\\301.01\\\\192.7734\\\\295.5742\\\\301.01\\\\197.4609\\\\295.8172\\\\301.01\\\\202.1484\\\\295.6638\\\\301.01\\\\204.4922\\\\295.3698\\\\301.01\\\\206.8359\\\\294.8185\\\\301.01\\\\209.1797\\\\294.3828\\\\301.01\\\\211.5234\\\\292.4841\\\\301.01\\\\213.8672\\\\291.1916\\\\301.01\\\\216.2109\\\\289.6171\\\\301.01\\\\217.2534\\\\288.6234\\\\301.01\\\\218.5547\\\\287.0864\\\\301.01\\\\221.7097\\\\283.9359\\\\301.01\\\\225.5859\\\\279.9023\\\\301.01\\\\227.9297\\\\277.5431\\\\301.01\\\\230.2734\\\\275.0279\\\\301.01\\\\233.1732\\\\272.2172\\\\301.01\\\\234.9609\\\\270.242\\\\301.01\\\\237.6891\\\\267.5297\\\\301.01\\\\241.9922\\\\263.0863\\\\301.01\\\\244.3359\\\\260.7816\\\\301.01\\\\246.7498\\\\258.1547\\\\301.01\\\\249.0234\\\\255.4868\\\\301.01\\\\250.5381\\\\253.4672\\\\301.01\\\\251.9462\\\\251.1234\\\\301.01\\\\252.6083\\\\248.7797\\\\301.01\\\\253.1286\\\\246.4359\\\\301.01\\\\253.2715\\\\244.0922\\\\301.01\\\\253.323\\\\241.7484\\\\301.01\\\\254.0203\\\\239.4047\\\\301.01\\\\254.2562\\\\237.0609\\\\301.01\\\\253.7109\\\\236.3782\\\\301.01\\\\252.7413\\\\234.7172\\\\301.01\\\\251.3672\\\\233.1433\\\\301.01\\\\249.0234\\\\232.7162\\\\301.01\\\\246.6797\\\\232.5994\\\\301.01\\\\244.3359\\\\232.6145\\\\301.01\\\\241.9922\\\\232.8788\\\\301.01\\\\239.6484\\\\232.9594\\\\301.01\\\\232.6172\\\\232.9487\\\\301.01\\\\223.2422\\\\233.0498\\\\301.01\\\\211.5234\\\\233.0726\\\\301.01\\\\206.8359\\\\233.0007\\\\301.01\\\\204.4922\\\\232.7186\\\\301.01\\\\202.1484\\\\232.7048\\\\301.01\\\\195.1172\\\\232.7719\\\\301.01\\\\192.7734\\\\232.7456\\\\301.01\\\\183.3984\\\\232.7588\\\\301.01\\\\174.0234\\\\232.7322\\\\301.01\\\\164.6484\\\\232.7322\\\\301.01\\\\152.9297\\\\232.8003\\\\301.01\\\\145.8984\\\\232.7875\\\\301.01\\\\141.2109\\\\232.6908\\\\301.01\\\\134.1797\\\\232.6329\\\\301.01\\\\127.1484\\\\232.6329\\\\301.01\\\\124.8047\\\\232.5873\\\\301.01\\\\122.4609\\\\232.0753\\\\301.01\\\\120.1172\\\\232.6027\\\\301.01\\\\113.0859\\\\232.5873\\\\301.01\\\\110.7422\\\\231.8582\\\\301.01\\\\106.0547\\\\231.5762\\\\301.01\\\\103.7109\\\\231.6158\\\\301.01\\\\102.652\\\\232.3734\\\\301.01\\\\101.3672\\\\233.0044\\\\301.01\\\\99.02344\\\\233.091\\\\301.01\\\\89.64844\\\\233.0819\\\\301.01\\\\84.96094\\\\233.1132\\\\301.01\\\\66.21094\\\\233.1132\\\\301.01\\\\61.52344\\\\233.131\\\\301.01\\\\47.46094\\\\233.1132\\\\301.01\\\\45.11719\\\\233.0671\\\\301.01\\\\44.1887\\\\232.3734\\\\301.01\\\\42.77344\\\\231.0305\\\\301.01\\\\42.03629\\\\230.0297\\\\301.01\\\\42.77344\\\\229.2325\\\\301.01\\\\45.11719\\\\228.5376\\\\301.01\\\\47.46094\\\\227.0364\\\\301.01\\\\49.80469\\\\226.0128\\\\301.01\\\\52.14844\\\\224.5587\\\\301.01\\\\54.49219\\\\223.6608\\\\301.01\\\\56.83594\\\\221.833\\\\301.01\\\\59.17969\\\\220.1609\\\\301.01\\\\61.52344\\\\218.8188\\\\301.01\\\\64.90625\\\\215.9672\\\\301.01\\\\66.21094\\\\214.9687\\\\301.01\\\\67.67578\\\\213.6234\\\\301.01\\\\68.55469\\\\212.6704\\\\301.01\\\\70.89844\\\\210.4727\\\\301.01\\\\74.47953\\\\206.5922\\\\301.01\\\\76.50275\\\\204.2484\\\\301.01\\\\78.21651\\\\201.9047\\\\301.01\\\\80.27344\\\\198.8597\\\\301.01\\\\82.61719\\\\195.1853\\\\301.01\\\\82.89342\\\\194.8734\\\\301.01\\\\84.96094\\\\190.8408\\\\301.01\\\\85.38912\\\\190.1859\\\\301.01\\\\86.29591\\\\187.8422\\\\301.01\\\\87.73726\\\\185.4984\\\\301.01\\\\88.56714\\\\183.1547\\\\301.01\\\\89.0239\\\\180.8109\\\\301.01\\\\90.08218\\\\178.4672\\\\301.01\\\\90.826\\\\176.1234\\\\301.01\\\\91.33673\\\\173.7797\\\\301.01\\\\92.27242\\\\171.4359\\\\301.01\\\\92.92352\\\\169.0922\\\\301.01\\\\93.52101\\\\159.7172\\\\301.01\\\\93.68569\\\\155.0297\\\\301.01\\\\93.66122\\\\150.3422\\\\301.01\\\\93.03977\\\\140.9672\\\\301.01\\\\92.73054\\\\138.6234\\\\301.01\\\\91.17617\\\\133.9359\\\\301.01\\\\90.61806\\\\131.5922\\\\301.01\\\\89.82677\\\\129.2484\\\\301.01\\\\88.83517\\\\126.9047\\\\301.01\\\\88.39883\\\\124.5609\\\\301.01\\\\87.14217\\\\122.2172\\\\301.01\\\\83.83617\\\\115.1859\\\\301.01\\\\82.61719\\\\113.3482\\\\301.01\\\\82.16586\\\\112.8422\\\\301.01\\\\81.0612\\\\110.4984\\\\301.01\\\\77.92969\\\\106.4629\\\\301.01\\\\77.33624\\\\105.8109\\\\301.01\\\\75.88316\\\\103.4672\\\\301.01\\\\71.66676\\\\98.77969\\\\301.01\\\\68.55469\\\\95.70351\\\\301.01\\\\63.86719\\\\91.59751\\\\301.01\\\\61.52344\\\\90.16005\\\\301.01\\\\59.17969\\\\88.18321\\\\301.01\\\\56.83594\\\\86.57265\\\\301.01\\\\54.49219\\\\85.45554\\\\301.01\\\\52.14844\\\\83.67484\\\\301.01\\\\49.80469\\\\82.92365\\\\301.01\\\\47.46094\\\\81.52637\\\\301.01\\\\45.11719\\\\80.65604\\\\301.01\\\\42.77344\\\\79.19824\\\\301.01\\\\40.42969\\\\78.73884\\\\301.01\\\\38.08594\\\\78.15919\\\\301.01\\\\35.74219\\\\77.15002\\\\301.01\\\\33.39844\\\\76.53034\\\\301.01\\\\31.05469\\\\76.09643\\\\301.01\\\\26.36719\\\\74.69731\\\\301.01\\\\24.02344\\\\74.428\\\\301.01\\\\16.99219\\\\74.14042\\\\301.01\\\\12.30469\\\\74.06655\\\\301.01\\\\7.617188\\\\74.18246\\\\301.01\\\\2.929688\\\\74.39614\\\\301.01\\\\0.5859375\\\\74.67952\\\\301.01\\\\-4.101563\\\\76.04402\\\\301.01\\\\-6.445313\\\\76.46788\\\\301.01\\\\-8.789063\\\\77.11446\\\\301.01\\\\-11.13281\\\\78.1283\\\\301.01\\\\-15.82031\\\\79.30067\\\\301.01\\\\-18.16406\\\\80.75135\\\\301.01\\\\-20.50781\\\\81.63853\\\\301.01\\\\-22.85156\\\\82.99707\\\\301.01\\\\-25.19531\\\\83.76582\\\\301.01\\\\-27.53906\\\\85.60597\\\\301.01\\\\-29.88281\\\\86.70937\\\\301.01\\\\-32.22656\\\\88.32835\\\\301.01\\\\-34.57031\\\\90.28696\\\\301.01\\\\-36.60469\\\\91.74844\\\\301.01\\\\-41.60156\\\\95.87829\\\\301.01\\\\-46.64644\\\\101.1234\\\\301.01\\\\-50.23326\\\\105.8109\\\\301.01\\\\-52.14844\\\\108.1547\\\\301.01\\\\-53.7083\\\\110.4984\\\\301.01\\\\-54.99341\\\\112.8422\\\\301.01\\\\-56.69257\\\\115.1859\\\\301.01\\\\-57.50126\\\\117.5297\\\\301.01\\\\-58.9611\\\\119.8734\\\\301.01\\\\-59.86389\\\\122.2172\\\\301.01\\\\-61.15642\\\\124.5609\\\\301.01\\\\-61.63161\\\\126.9047\\\\301.01\\\\-62.48454\\\\129.2484\\\\301.01\\\\-63.52435\\\\131.5922\\\\301.01\\\\-64.05602\\\\133.9359\\\\301.01\\\\-64.42265\\\\136.2797\\\\301.01\\\\-65.18555\\\\138.6234\\\\301.01\\\\-65.68493\\\\140.9672\\\\301.01\\\\-66.26755\\\\147.9984\\\\301.01\\\\-66.50095\\\\152.6859\\\\301.01\\\\-66.53545\\\\155.0297\\\\301.01\\\\-66.39441\\\\159.7172\\\\301.01\\\\-66.05307\\\\164.4047\\\\301.01\\\\-65.51514\\\\169.0922\\\\301.01\\\\-64.74208\\\\171.4359\\\\301.01\\\\-64.20454\\\\173.7797\\\\301.01\\\\-63.7793\\\\176.1234\\\\301.01\\\\-62.91559\\\\178.4672\\\\301.01\\\\-61.86849\\\\180.8109\\\\301.01\\\\-61.33743\\\\183.1547\\\\301.01\\\\-60.35156\\\\185.6212\\\\301.01\\\\-57.99851\\\\190.1859\\\\301.01\\\\-56.86614\\\\192.5297\\\\301.01\\\\-55.66406\\\\194.816\\\\301.01\\\\-54.17318\\\\197.2172\\\\301.01\\\\-52.51101\\\\199.5609\\\\301.01\\\\-50.98609\\\\201.9047\\\\301.01\\\\-47.40362\\\\206.5922\\\\301.01\\\\-45.07058\\\\208.9359\\\\301.01\\\\-42.88062\\\\211.2797\\\\301.01\\\\-39.25781\\\\214.7825\\\\301.01\\\\-34.57031\\\\218.5488\\\\301.01\\\\-32.22656\\\\219.9976\\\\301.01\\\\-28.02734\\\\222.9984\\\\301.01\\\\-27.53906\\\\223.4429\\\\301.01\\\\-25.19531\\\\224.4472\\\\301.01\\\\-22.85156\\\\225.8554\\\\301.01\\\\-20.50781\\\\226.9317\\\\301.01\\\\-18.16406\\\\228.4426\\\\301.01\\\\-15.82031\\\\229.1456\\\\301.01\\\\-14.96138\\\\230.0297\\\\301.01\\\\-15.82031\\\\231.3675\\\\301.01\\\\-16.95703\\\\232.3734\\\\301.01\\\\-18.16406\\\\233.0671\\\\301.01\\\\-20.50781\\\\233.0537\\\\301.01\\\\-27.53906\\\\233.1221\\\\301.01\\\\-29.88281\\\\233.1042\\\\301.01\\\\-39.25781\\\\233.1397\\\\301.01\\\\-46.28906\\\\233.1221\\\\301.01\\\\-48.63281\\\\233.1652\\\\301.01\\\\-60.35156\\\\233.1818\\\\301.01\\\\-62.69531\\\\233.1483\\\\301.01\\\\-65.03906\\\\232.8735\\\\301.01\\\\-67.38281\\\\232.8735\\\\301.01\\\\-69.72656\\\\232.9839\\\\301.01\\\\-79.10156\\\\232.9942\\\\301.01\\\\-83.78906\\\\233.0537\\\\301.01\\\\-86.13281\\\\233.0283\\\\301.01\\\\-107.2266\\\\233.1132\\\\301.01\\\\-109.5703\\\\233.6324\\\\301.01\\\\-111.9141\\\\233.2523\\\\301.01\\\\-114.2578\\\\233.855\\\\301.01\\\\-118.9453\\\\233.9675\\\\301.01\\\\-123.6328\\\\234.0359\\\\301.01\\\\-128.3203\\\\234.054\\\\301.01\\\\-130.6641\\\\233.9859\\\\301.01\\\\-133.0078\\\\234.0284\\\\301.01\\\\-137.6953\\\\234.0158\\\\301.01\\\\-142.3828\\\\234.0805\\\\301.01\\\\-149.4141\\\\234.0088\\\\301.01\\\\-154.1016\\\\234.054\\\\301.01\\\\-165.8203\\\\233.9784\\\\301.01\\\\-168.1641\\\\234.1138\\\\301.01\\\\-172.8516\\\\234.1797\\\\301.01\\\\-179.8828\\\\234.1797\\\\301.01\\\\-184.5703\\\\234.2539\\\\301.01\\\\-198.6328\\\\234.1652\\\\301.01\\\\-200.9766\\\\234.2187\\\\301.01\\\\-205.6641\\\\234.1147\\\\301.01\\\\-208.0078\\\\234.1692\\\\301.01\\\\-217.3828\\\\234.2088\\\\301.01\\\\-222.0703\\\\234.2967\\\\301.01\\\\-224.4141\\\\234.2088\\\\301.01\\\\-229.1016\\\\234.2088\\\\301.01\\\\-238.4766\\\\234.0063\\\\301.01\\\\-243.1641\\\\233.9589\\\\301.01\\\\-245.5078\\\\233.8656\\\\301.01\\\\-247.8516\\\\233.8749\\\\301.01\\\\-250.1953\\\\233.9791\\\\301.01\\\\-252.5391\\\\234.4847\\\\301.01\\\\-254.8828\\\\236.4281\\\\301.01\\\\-255.4874\\\\237.0609\\\\301.01\\\\-256.2803\\\\239.4047\\\\301.01\\\\-255.8475\\\\241.7484\\\\301.01\\\\-255.5735\\\\244.0922\\\\301.01\\\\-255.6104\\\\246.4359\\\\301.01\\\\-255.4959\\\\248.7797\\\\301.01\\\\-254.8828\\\\250.669\\\\301.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"361\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n"; -const char* k_rtStruct_json03 = -" \"Value\" : \"-258.4268\\\\239.4047\\\\304.01\\\\-257.2636\\\\244.0922\\\\304.01\\\\-257.1989\\\\246.4359\\\\304.01\\\\-256.6301\\\\248.7797\\\\304.01\\\\-256.215\\\\251.1234\\\\304.01\\\\-254.8828\\\\253.3128\\\\304.01\\\\-253.1956\\\\255.8109\\\\304.01\\\\-252.5391\\\\256.5626\\\\304.01\\\\-250.1953\\\\258.8727\\\\304.01\\\\-247.8516\\\\261.3969\\\\304.01\\\\-245.5078\\\\263.5693\\\\304.01\\\\-244.0789\\\\265.1859\\\\304.01\\\\-241.5988\\\\267.5297\\\\304.01\\\\-239.4249\\\\269.8734\\\\304.01\\\\-233.7891\\\\275.3867\\\\304.01\\\\-231.4453\\\\277.8311\\\\304.01\\\\-229.1016\\\\280.0036\\\\304.01\\\\-226.7578\\\\282.5281\\\\304.01\\\\-224.4141\\\\284.6849\\\\304.01\\\\-222.0703\\\\287.2221\\\\304.01\\\\-220.5406\\\\288.6234\\\\304.01\\\\-218.2914\\\\290.9672\\\\304.01\\\\-217.3828\\\\291.6599\\\\304.01\\\\-214.8704\\\\293.3109\\\\304.01\\\\-212.6953\\\\294.634\\\\304.01\\\\-210.3516\\\\295.3279\\\\304.01\\\\-208.0078\\\\296.4424\\\\304.01\\\\-205.6641\\\\296.8732\\\\304.01\\\\-203.3203\\\\297.1639\\\\304.01\\\\-196.2891\\\\297.1639\\\\304.01\\\\-189.2578\\\\297.0197\\\\304.01\\\\-184.5703\\\\297.0141\\\\304.01\\\\-177.5391\\\\296.8785\\\\304.01\\\\-161.1328\\\\296.851\\\\304.01\\\\-149.4141\\\\296.8598\\\\304.01\\\\-128.3203\\\\296.895\\\\304.01\\\\-118.9453\\\\296.8887\\\\304.01\\\\-114.2578\\\\296.8266\\\\304.01\\\\-107.2266\\\\296.817\\\\304.01\\\\-104.8828\\\\296.8459\\\\304.01\\\\-97.85156\\\\296.8456\\\\304.01\\\\-93.16406\\\\296.9116\\\\304.01\\\\-90.82031\\\\296.8828\\\\304.01\\\\-81.44531\\\\296.9305\\\\304.01\\\\-79.10156\\\\296.9116\\\\304.01\\\\-72.07031\\\\296.979\\\\304.01\\\\-69.72656\\\\296.96\\\\304.01\\\\-58.00781\\\\296.9557\\\\304.01\\\\-53.32031\\\\297.4055\\\\304.01\\\\-50.97656\\\\297.1979\\\\304.01\\\\-48.63281\\\\297.1858\\\\304.01\\\\-46.28906\\\\297.4229\\\\304.01\\\\-41.60156\\\\297.3806\\\\304.01\\\\-39.25781\\\\297.0362\\\\304.01\\\\-36.91406\\\\297.4125\\\\304.01\\\\-34.57031\\\\297.4229\\\\304.01\\\\-32.22656\\\\297.1747\\\\304.01\\\\-29.88281\\\\297.4334\\\\304.01\\\\-25.19531\\\\297.4125\\\\304.01\\\\-18.16406\\\\297.4334\\\\304.01\\\\-8.789063\\\\297.4195\\\\304.01\\\\-6.445313\\\\297.3383\\\\304.01\\\\-4.101563\\\\297.4125\\\\304.01\\\\0.5859375\\\\297.4195\\\\304.01\\\\2.929688\\\\297.0439\\\\304.01\\\\5.273438\\\\297.273\\\\304.01\\\\7.617188\\\\296.9841\\\\304.01\\\\12.30469\\\\296.8673\\\\304.01\\\\26.36719\\\\296.8574\\\\304.01\\\\35.74219\\\\296.8163\\\\304.01\\\\38.08594\\\\296.7654\\\\304.01\\\\45.11719\\\\296.7761\\\\304.01\\\\52.14844\\\\296.6929\\\\304.01\\\\54.49219\\\\296.7115\\\\304.01\\\\61.52344\\\\296.6724\\\\304.01\\\\63.86719\\\\296.6241\\\\304.01\\\\91.99219\\\\296.4947\\\\304.01\\\\94.33594\\\\296.5412\\\\304.01\\\\103.7109\\\\296.466\\\\304.01\\\\106.0547\\\\296.4801\\\\304.01\\\\115.4297\\\\296.391\\\\304.01\\\\117.7734\\\\296.4051\\\\304.01\\\\124.8047\\\\296.3288\\\\304.01\\\\131.8359\\\\296.2987\\\\304.01\\\\134.1797\\\\295.9161\\\\304.01\\\\136.5234\\\\295.8172\\\\304.01\\\\143.5547\\\\295.8791\\\\304.01\\\\148.2422\\\\295.8791\\\\304.01\\\\155.2734\\\\295.7849\\\\304.01\\\\159.9609\\\\295.7684\\\\304.01\\\\169.3359\\\\295.6454\\\\304.01\\\\171.6797\\\\295.6819\\\\304.01\\\\178.7109\\\\295.6454\\\\304.01\\\\181.0547\\\\295.5742\\\\304.01\\\\185.7422\\\\295.5916\\\\304.01\\\\192.7734\\\\295.557\\\\304.01\\\\197.4609\\\\295.8172\\\\304.01\\\\202.1484\\\\295.6819\\\\304.01\\\\204.4922\\\\295.3842\\\\304.01\\\\206.8359\\\\294.8185\\\\304.01\\\\209.1797\\\\294.3828\\\\304.01\\\\211.5234\\\\292.4841\\\\304.01\\\\213.8672\\\\291.1765\\\\304.01\\\\216.2109\\\\289.5873\\\\304.01\\\\217.229\\\\288.6234\\\\304.01\\\\218.5547\\\\287.0752\\\\304.01\\\\221.7204\\\\283.9359\\\\304.01\\\\225.5859\\\\279.9071\\\\304.01\\\\227.9297\\\\277.5303\\\\304.01\\\\230.2734\\\\275.0172\\\\304.01\\\\233.1467\\\\272.2172\\\\304.01\\\\234.9609\\\\270.242\\\\304.01\\\\237.7046\\\\267.5297\\\\304.01\\\\239.6484\\\\265.4887\\\\304.01\\\\244.3359\\\\260.7987\\\\304.01\\\\249.0234\\\\255.6807\\\\304.01\\\\251.3672\\\\252.8391\\\\304.01\\\\252.5586\\\\251.1234\\\\304.01\\\\254.0274\\\\248.7797\\\\304.01\\\\254.9669\\\\246.4359\\\\304.01\\\\255.696\\\\241.7484\\\\304.01\\\\255.9729\\\\239.4047\\\\304.01\\\\255.8408\\\\237.0609\\\\304.01\\\\254.6498\\\\234.7172\\\\304.01\\\\253.7109\\\\233.7838\\\\304.01\\\\251.3672\\\\232.8072\\\\304.01\\\\249.0234\\\\232.5688\\\\304.01\\\\246.6797\\\\232.4189\\\\304.01\\\\244.3359\\\\232.4365\\\\304.01\\\\241.9922\\\\232.8195\\\\304.01\\\\239.6484\\\\232.9699\\\\304.01\\\\234.9609\\\\232.9906\\\\304.01\\\\230.2734\\\\232.9594\\\\304.01\\\\225.5859\\\\233.0305\\\\304.01\\\\211.5234\\\\233.0632\\\\304.01\\\\206.8359\\\\232.9906\\\\304.01\\\\204.4922\\\\232.7048\\\\304.01\\\\199.8047\\\\232.6908\\\\304.01\\\\195.1172\\\\232.7456\\\\304.01\\\\190.4297\\\\232.7186\\\\304.01\\\\183.3984\\\\232.7588\\\\304.01\\\\174.0234\\\\232.7322\\\\304.01\\\\164.6484\\\\232.7322\\\\304.01\\\\157.6172\\\\232.7848\\\\304.01\\\\143.5547\\\\232.7746\\\\304.01\\\\138.8672\\\\232.6477\\\\304.01\\\\131.8359\\\\232.6623\\\\304.01\\\\127.1484\\\\232.6179\\\\304.01\\\\124.8047\\\\232.2817\\\\304.01\\\\122.4609\\\\231.7518\\\\304.01\\\\120.1172\\\\232.5557\\\\304.01\\\\113.0859\\\\232.5396\\\\304.01\\\\110.7422\\\\232.0028\\\\304.01\\\\108.3984\\\\231.6882\\\\304.01\\\\106.0547\\\\231.5762\\\\304.01\\\\103.7109\\\\231.6396\\\\304.01\\\\102.8085\\\\232.3734\\\\304.01\\\\101.3672\\\\233.0819\\\\304.01\\\\99.02344\\\\233.1221\\\\304.01\\\\91.99219\\\\233.091\\\\304.01\\\\84.96094\\\\233.131\\\\304.01\\\\80.27344\\\\233.1132\\\\304.01\\\\70.89844\\\\233.1483\\\\304.01\\\\59.17969\\\\233.1221\\\\304.01\\\\54.49219\\\\233.1483\\\\304.01\\\\47.46094\\\\233.1397\\\\304.01\\\\45.11719\\\\233.0951\\\\304.01\\\\44.15678\\\\232.3734\\\\304.01\\\\42.77344\\\\231.0402\\\\304.01\\\\42.0277\\\\230.0297\\\\304.01\\\\42.77344\\\\229.2236\\\\304.01\\\\45.11719\\\\228.5376\\\\304.01\\\\47.46094\\\\227.0172\\\\304.01\\\\49.80469\\\\226.0045\\\\304.01\\\\52.14844\\\\224.5497\\\\304.01\\\\54.49219\\\\223.6396\\\\304.01\\\\56.83594\\\\221.8073\\\\304.01\\\\59.17969\\\\220.1493\\\\304.01\\\\61.52344\\\\218.7845\\\\304.01\\\\64.88177\\\\215.9672\\\\304.01\\\\66.21094\\\\214.941\\\\304.01\\\\68.55469\\\\212.6457\\\\304.01\\\\70.89844\\\\210.4545\\\\304.01\\\\74.44025\\\\206.5922\\\\304.01\\\\76.45425\\\\204.2484\\\\304.01\\\\78.18552\\\\201.9047\\\\304.01\\\\80.27344\\\\198.8021\\\\304.01\\\\82.61719\\\\195.0944\\\\304.01\\\\82.81684\\\\194.8734\\\\304.01\\\\85.33871\\\\190.1859\\\\304.01\\\\86.25837\\\\187.8422\\\\304.01\\\\87.69531\\\\185.4984\\\\304.01\\\\88.53373\\\\183.1547\\\\304.01\\\\88.98369\\\\180.8109\\\\304.01\\\\90.01319\\\\178.4672\\\\304.01\\\\90.75238\\\\176.1234\\\\304.01\\\\91.26373\\\\173.7797\\\\304.01\\\\92.16087\\\\171.4359\\\\304.01\\\\92.84856\\\\169.0922\\\\304.01\\\\93.08162\\\\166.7484\\\\304.01\\\\93.46188\\\\159.7172\\\\304.01\\\\93.63705\\\\157.3734\\\\304.01\\\\93.71725\\\\155.0297\\\\304.01\\\\94.1173\\\\152.6859\\\\304.01\\\\95.2567\\\\150.3422\\\\304.01\\\\94.33594\\\\149.3719\\\\304.01\\\\93.55707\\\\147.9984\\\\304.01\\\\93.31775\\\\145.6547\\\\304.01\\\\93.0161\\\\140.9672\\\\304.01\\\\92.68435\\\\138.6234\\\\304.01\\\\91.79828\\\\136.2797\\\\304.01\\\\91.12964\\\\133.9359\\\\304.01\\\\90.57047\\\\131.5922\\\\304.01\\\\89.74536\\\\129.2484\\\\304.01\\\\88.82685\\\\126.9047\\\\304.01\\\\88.37492\\\\124.5609\\\\304.01\\\\87.09542\\\\122.2172\\\\304.01\\\\83.81286\\\\115.1859\\\\304.01\\\\82.08039\\\\112.8422\\\\304.01\\\\81.03055\\\\110.4984\\\\304.01\\\\77.92969\\\\106.5352\\\\304.01\\\\77.27783\\\\105.8109\\\\304.01\\\\75.79013\\\\103.4672\\\\304.01\\\\71.63571\\\\98.77969\\\\304.01\\\\68.55469\\\\95.73435\\\\304.01\\\\63.86719\\\\91.66604\\\\304.01\\\\61.52344\\\\90.20212\\\\304.01\\\\59.17969\\\\88.20197\\\\304.01\\\\56.83594\\\\86.62436\\\\304.01\\\\54.49219\\\\85.48727\\\\304.01\\\\52.14844\\\\83.70115\\\\304.01\\\\49.80469\\\\82.94526\\\\304.01\\\\47.46094\\\\81.53912\\\\304.01\\\\45.11719\\\\80.67555\\\\304.01\\\\42.77344\\\\79.20674\\\\304.01\\\\38.08594\\\\78.20923\\\\304.01\\\\35.74219\\\\77.17549\\\\304.01\\\\33.39844\\\\76.53049\\\\304.01\\\\31.05469\\\\76.11316\\\\304.01\\\\26.36719\\\\74.72801\\\\304.01\\\\24.02344\\\\74.428\\\\304.01\\\\16.99219\\\\74.14042\\\\304.01\\\\12.30469\\\\74.08618\\\\304.01\\\\7.617188\\\\74.18843\\\\304.01\\\\2.929688\\\\74.3889\\\\304.01\\\\0.5859375\\\\74.66957\\\\304.01\\\\-4.101563\\\\76.00713\\\\304.01\\\\-6.445313\\\\76.45148\\\\304.01\\\\-8.789063\\\\77.1\\\\304.01\\\\-11.13281\\\\78.06062\\\\304.01\\\\-15.82031\\\\79.2827\\\\304.01\\\\-18.16406\\\\80.74213\\\\304.01\\\\-20.50781\\\\81.62949\\\\304.01\\\\-22.85156\\\\82.96635\\\\304.01\\\\-25.19531\\\\83.75838\\\\304.01\\\\-27.53906\\\\85.57612\\\\304.01\\\\-29.88281\\\\86.67031\\\\304.01\\\\-32.22656\\\\88.3215\\\\304.01\\\\-34.57031\\\\90.27851\\\\304.01\\\\-36.65471\\\\91.74844\\\\304.01\\\\-39.25781\\\\93.84944\\\\304.01\\\\-41.60156\\\\95.82625\\\\304.01\\\\-46.73052\\\\101.1234\\\\304.01\\\\-50.25593\\\\105.8109\\\\304.01\\\\-52.17377\\\\108.1547\\\\304.01\\\\-53.74715\\\\110.4984\\\\304.01\\\\-55.05993\\\\112.8422\\\\304.01\\\\-56.70641\\\\115.1859\\\\304.01\\\\-57.55294\\\\117.5297\\\\304.01\\\\-59.00451\\\\119.8734\\\\304.01\\\\-59.93574\\\\122.2172\\\\304.01\\\\-61.16483\\\\124.5609\\\\304.01\\\\-61.67763\\\\126.9047\\\\304.01\\\\-62.54883\\\\129.2484\\\\304.01\\\\-63.58032\\\\131.5922\\\\304.01\\\\-64.08025\\\\133.9359\\\\304.01\\\\-64.47405\\\\136.2797\\\\304.01\\\\-65.29311\\\\138.6234\\\\304.01\\\\-65.704\\\\140.9672\\\\304.01\\\\-66.11191\\\\145.6547\\\\304.01\\\\-66.44185\\\\150.3422\\\\304.01\\\\-66.55173\\\\155.0297\\\\304.01\\\\-66.54406\\\\157.3734\\\\304.01\\\\-66.41875\\\\159.7172\\\\304.01\\\\-66.08267\\\\164.4047\\\\304.01\\\\-65.54951\\\\169.0922\\\\304.01\\\\-64.81466\\\\171.4359\\\\304.01\\\\-64.22777\\\\173.7797\\\\304.01\\\\-63.82658\\\\176.1234\\\\304.01\\\\-63.00951\\\\178.4672\\\\304.01\\\\-61.88151\\\\180.8109\\\\304.01\\\\-61.35514\\\\183.1547\\\\304.01\\\\-60.35156\\\\185.6658\\\\304.01\\\\-58.00781\\\\190.247\\\\304.01\\\\-55.71056\\\\194.8734\\\\304.01\\\\-54.20731\\\\197.2172\\\\304.01\\\\-52.52815\\\\199.5609\\\\304.01\\\\-51.09558\\\\201.9047\\\\304.01\\\\-48.63281\\\\204.9516\\\\304.01\\\\-47.4356\\\\206.5922\\\\304.01\\\\-45.0904\\\\208.9359\\\\304.01\\\\-42.90285\\\\211.2797\\\\304.01\\\\-39.25781\\\\214.8017\\\\304.01\\\\-34.92887\\\\218.3109\\\\304.01\\\\-34.57031\\\\218.6566\\\\304.01\\\\-32.22656\\\\220.0173\\\\304.01\\\\-31.40713\\\\220.6547\\\\304.01\\\\-28.07253\\\\222.9984\\\\304.01\\\\-27.53906\\\\223.4814\\\\304.01\\\\-25.19531\\\\224.4633\\\\304.01\\\\-22.85156\\\\225.8906\\\\304.01\\\\-20.50781\\\\226.9488\\\\304.01\\\\-18.16406\\\\228.4606\\\\304.01\\\\-15.82031\\\\229.1542\\\\304.01\\\\-14.96987\\\\230.0297\\\\304.01\\\\-15.82031\\\\231.3705\\\\304.01\\\\-16.94484\\\\232.3734\\\\304.01\\\\-18.16406\\\\233.0671\\\\304.01\\\\-25.19531\\\\233.091\\\\304.01\\\\-27.53906\\\\233.131\\\\304.01\\\\-43.94531\\\\233.1397\\\\304.01\\\\-46.28906\\\\233.1221\\\\304.01\\\\-55.66406\\\\233.19\\\\304.01\\\\-62.69531\\\\233.1652\\\\304.01\\\\-65.03906\\\\232.8767\\\\304.01\\\\-67.38281\\\\232.8735\\\\304.01\\\\-72.07031\\\\233.0044\\\\304.01\\\\-79.10156\\\\232.9735\\\\304.01\\\\-83.78906\\\\233.0441\\\\304.01\\\\-102.5391\\\\233.0951\\\\304.01\\\\-104.8828\\\\233.1525\\\\304.01\\\\-107.2266\\\\233.3238\\\\304.01\\\\-109.5703\\\\234.0489\\\\304.01\\\\-116.6016\\\\233.9967\\\\304.01\\\\-123.6328\\\\234.0805\\\\304.01\\\\-128.3203\\\\234.0855\\\\304.01\\\\-130.6641\\\\234.0088\\\\304.01\\\\-135.3516\\\\234.0722\\\\304.01\\\\-137.6953\\\\234.0591\\\\304.01\\\\-142.3828\\\\234.1266\\\\304.01\\\\-149.4141\\\\234.0722\\\\304.01\\\\-158.7891\\\\234.0772\\\\304.01\\\\-165.8203\\\\233.9901\\\\304.01\\\\-168.1641\\\\234.1182\\\\304.01\\\\-172.8516\\\\234.1837\\\\304.01\\\\-177.5391\\\\234.1837\\\\304.01\\\\-184.5703\\\\234.2574\\\\304.01\\\\-193.9453\\\\234.1916\\\\304.01\\\\-200.9766\\\\234.2224\\\\304.01\\\\-205.6641\\\\234.1652\\\\304.01\\\\-212.6953\\\\234.2362\\\\304.01\\\\-217.3828\\\\234.2502\\\\304.01\\\\-222.0703\\\\234.3418\\\\304.01\\\\-233.7891\\\\234.1026\\\\304.01\\\\-238.4766\\\\234.0555\\\\304.01\\\\-243.1641\\\\234.0626\\\\304.01\\\\-245.5078\\\\233.9906\\\\304.01\\\\-247.8516\\\\234.0236\\\\304.01\\\\-252.5391\\\\234.2887\\\\304.01\\\\-254.8828\\\\235.3755\\\\304.01\\\\-256.6911\\\\237.0609\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"361\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0859\\\\307.01\\\\-27.53906\\\\233.1221\\\\307.01\\\\-46.28906\\\\233.131\\\\307.01\\\\-58.00781\\\\233.19\\\\307.01\\\\-62.69531\\\\233.1736\\\\307.01\\\\-65.03906\\\\232.5396\\\\307.01\\\\-67.38281\\\\232.8735\\\\307.01\\\\-72.07031\\\\233.0145\\\\307.01\\\\-79.10156\\\\232.9839\\\\307.01\\\\-83.78906\\\\233.0441\\\\307.01\\\\-95.50781\\\\233.0859\\\\307.01\\\\-97.85156\\\\233.1345\\\\307.01\\\\-100.1953\\\\233.09\\\\307.01\\\\-102.5391\\\\233.2952\\\\307.01\\\\-104.8828\\\\234.0051\\\\307.01\\\\-107.2266\\\\233.8864\\\\307.01\\\\-109.5703\\\\234.0891\\\\307.01\\\\-116.6016\\\\233.9967\\\\307.01\\\\-123.6328\\\\234.0941\\\\307.01\\\\-128.3203\\\\234.1127\\\\307.01\\\\-130.6641\\\\234.0463\\\\307.01\\\\-133.0078\\\\234.099\\\\307.01\\\\-140.0391\\\\234.099\\\\307.01\\\\-142.3828\\\\234.1453\\\\307.01\\\\-149.4141\\\\234.099\\\\307.01\\\\-151.7578\\\\234.1313\\\\307.01\\\\-165.8203\\\\233.9901\\\\307.01\\\\-168.1641\\\\234.1182\\\\307.01\\\\-172.8516\\\\234.1973\\\\307.01\\\\-175.1953\\\\234.1934\\\\307.01\\\\-186.9141\\\\234.302\\\\307.01\\\\-189.2578\\\\234.2431\\\\307.01\\\\-191.6016\\\\234.2721\\\\307.01\\\\-198.6328\\\\234.2187\\\\307.01\\\\-200.9766\\\\234.2326\\\\307.01\\\\-205.6641\\\\234.1523\\\\307.01\\\\-208.0078\\\\234.2088\\\\307.01\\\\-217.3828\\\\234.2644\\\\307.01\\\\-222.0703\\\\234.3731\\\\307.01\\\\-226.7578\\\\234.3084\\\\307.01\\\\-233.7891\\\\234.1271\\\\307.01\\\\-243.1641\\\\234.1783\\\\307.01\\\\-247.8516\\\\233.9385\\\\307.01\\\\-252.5391\\\\234.1396\\\\307.01\\\\-254.8828\\\\234.6465\\\\307.01\\\\-257.2266\\\\235.5375\\\\307.01\\\\-259.5389\\\\237.0609\\\\307.01\\\\-261.1549\\\\239.4047\\\\307.01\\\\-261.1453\\\\241.7484\\\\307.01\\\\-260.4097\\\\244.0922\\\\307.01\\\\-258.4325\\\\248.7797\\\\307.01\\\\-257.2266\\\\250.7551\\\\307.01\\\\-255.4608\\\\253.4672\\\\307.01\\\\-252.5391\\\\256.6329\\\\307.01\\\\-250.1953\\\\258.8892\\\\307.01\\\\-247.8516\\\\261.4029\\\\307.01\\\\-245.5078\\\\263.58\\\\307.01\\\\-244.0815\\\\265.1859\\\\307.01\\\\-241.6044\\\\267.5297\\\\307.01\\\\-239.4249\\\\269.8734\\\\307.01\\\\-236.9699\\\\272.2172\\\\307.01\\\\-233.7891\\\\275.3877\\\\307.01\\\\-231.4453\\\\277.8249\\\\307.01\\\\-229.1016\\\\280.0036\\\\307.01\\\\-226.7578\\\\282.5186\\\\307.01\\\\-225.1687\\\\283.9359\\\\307.01\\\\-222.0703\\\\287.2188\\\\307.01\\\\-220.5469\\\\288.6234\\\\307.01\\\\-218.3018\\\\290.9672\\\\307.01\\\\-217.3828\\\\291.669\\\\307.01\\\\-212.6953\\\\294.6293\\\\307.01\\\\-210.3516\\\\295.3142\\\\307.01\\\\-208.0078\\\\296.4338\\\\307.01\\\\-205.6641\\\\296.8865\\\\307.01\\\\-203.3203\\\\297.1639\\\\307.01\\\\-196.2891\\\\297.1639\\\\307.01\\\\-191.6016\\\\297.0361\\\\307.01\\\\-186.9141\\\\297.0219\\\\307.01\\\\-179.8828\\\\296.9526\\\\307.01\\\\-175.1953\\\\296.8713\\\\307.01\\\\-161.1328\\\\296.8585\\\\307.01\\\\-158.7891\\\\296.8764\\\\307.01\\\\-149.4141\\\\296.8598\\\\307.01\\\\-147.0703\\\\296.8931\\\\307.01\\\\-140.0391\\\\296.8779\\\\307.01\\\\-128.3203\\\\296.9292\\\\307.01\\\\-118.9453\\\\296.9053\\\\307.01\\\\-114.2578\\\\296.845\\\\307.01\\\\-97.85156\\\\296.8459\\\\307.01\\\\-90.82031\\\\296.9116\\\\307.01\\\\-79.10156\\\\296.9116\\\\307.01\\\\-72.07031\\\\296.979\\\\307.01\\\\-69.72656\\\\296.9409\\\\307.01\\\\-65.03906\\\\296.9644\\\\307.01\\\\-58.00781\\\\296.9377\\\\307.01\\\\-55.66406\\\\297.3491\\\\307.01\\\\-53.32031\\\\297.1261\\\\307.01\\\\-50.97656\\\\297.3612\\\\307.01\\\\-48.63281\\\\296.9285\\\\307.01\\\\-46.28906\\\\297.4229\\\\307.01\\\\-41.60156\\\\297.416\\\\307.01\\\\-39.25781\\\\297.3425\\\\307.01\\\\-34.57031\\\\297.4229\\\\307.01\\\\-29.88281\\\\297.2875\\\\307.01\\\\-27.53906\\\\297.3947\\\\307.01\\\\-22.85156\\\\297.3077\\\\307.01\\\\-20.50781\\\\297.4125\\\\307.01\\\\-15.82031\\\\297.3768\\\\307.01\\\\-13.47656\\\\297.4125\\\\307.01\\\\-11.13281\\\\297.2579\\\\307.01\\\\-8.789063\\\\297.4229\\\\307.01\\\\-4.101563\\\\297.4055\\\\307.01\\\\0.5859375\\\\297.3148\\\\307.01\\\\2.929688\\\\296.9267\\\\307.01\\\\5.273438\\\\297.2621\\\\307.01\\\\7.617188\\\\297.257\\\\307.01\\\\9.960938\\\\296.9447\\\\307.01\\\\12.30469\\\\296.868\\\\307.01\\\\24.02344\\\\296.8266\\\\307.01\\\\26.36719\\\\296.878\\\\307.01\\\\33.39844\\\\296.7761\\\\307.01\\\\47.46094\\\\296.7546\\\\307.01\\\\52.14844\\\\296.6839\\\\307.01\\\\61.52344\\\\296.6635\\\\307.01\\\\68.55469\\\\296.6028\\\\307.01\\\\77.92969\\\\296.5859\\\\307.01\\\\80.27344\\\\296.5309\\\\307.01\\\\84.96094\\\\296.5362\\\\307.01\\\\91.99219\\\\296.4947\\\\307.01\\\\96.67969\\\\296.5208\\\\307.01\\\\108.3984\\\\296.4194\\\\307.01\\\\117.7734\\\\296.3986\\\\307.01\\\\120.1172\\\\296.3578\\\\307.01\\\\131.8359\\\\296.2929\\\\307.01\\\\134.1797\\\\295.8184\\\\307.01\\\\138.8672\\\\295.9218\\\\307.01\\\\141.2109\\\\296.2507\\\\307.01\\\\143.5547\\\\295.8486\\\\307.01\\\\150.5859\\\\295.8791\\\\307.01\\\\155.2734\\\\295.8012\\\\307.01\\\\159.9609\\\\295.7684\\\\307.01\\\\169.3359\\\\295.6454\\\\307.01\\\\171.6797\\\\295.7173\\\\307.01\\\\181.0547\\\\295.5742\\\\307.01\\\\183.3984\\\\295.6272\\\\307.01\\\\190.4297\\\\295.557\\\\307.01\\\\192.7734\\\\295.5742\\\\307.01\\\\197.4609\\\\295.8172\\\\307.01\\\\199.8047\\\\295.8012\\\\307.01\\\\202.1484\\\\295.6998\\\\307.01\\\\204.4922\\\\295.3989\\\\307.01\\\\206.8359\\\\294.8185\\\\307.01\\\\209.1797\\\\294.3828\\\\307.01\\\\211.5234\\\\292.4841\\\\307.01\\\\213.8672\\\\291.1765\\\\307.01\\\\216.2109\\\\289.6034\\\\307.01\\\\217.2454\\\\288.6234\\\\307.01\\\\218.5547\\\\287.0864\\\\307.01\\\\221.7204\\\\283.9359\\\\307.01\\\\225.5859\\\\279.8821\\\\307.01\\\\228.5326\\\\276.9047\\\\307.01\\\\230.2734\\\\275.0424\\\\307.01\\\\233.137\\\\272.2172\\\\307.01\\\\234.9609\\\\270.245\\\\307.01\\\\237.6922\\\\267.5297\\\\307.01\\\\246.856\\\\258.1547\\\\307.01\\\\251.3768\\\\253.4672\\\\307.01\\\\253.166\\\\251.1234\\\\307.01\\\\255.1239\\\\248.7797\\\\307.01\\\\256.5218\\\\246.4359\\\\307.01\\\\257.6041\\\\244.0922\\\\307.01\\\\258.817\\\\241.7484\\\\307.01\\\\259.2578\\\\239.4047\\\\307.01\\\\258.9535\\\\237.0609\\\\307.01\\\\256.0547\\\\234.1196\\\\307.01\\\\253.7109\\\\233.131\\\\307.01\\\\251.3672\\\\232.5372\\\\307.01\\\\244.3359\\\\232.7139\\\\307.01\\\\241.9922\\\\232.9015\\\\307.01\\\\239.6484\\\\232.9906\\\\307.01\\\\234.9609\\\\232.9803\\\\307.01\\\\225.5859\\\\233.0305\\\\307.01\\\\211.5234\\\\233.0632\\\\307.01\\\\206.8359\\\\233.0007\\\\307.01\\\\204.4922\\\\232.7186\\\\307.01\\\\199.8047\\\\232.6767\\\\307.01\\\\195.1172\\\\232.7588\\\\307.01\\\\190.4297\\\\232.7186\\\\307.01\\\\183.3984\\\\232.7588\\\\307.01\\\\169.3359\\\\232.7456\\\\307.01\\\\166.9922\\\\232.7186\\\\307.01\\\\157.6172\\\\232.7848\\\\307.01\\\\152.9297\\\\232.7588\\\\307.01\\\\143.5547\\\\232.7875\\\\307.01\\\\138.8672\\\\232.6477\\\\307.01\\\\131.8359\\\\232.6179\\\\307.01\\\\127.1484\\\\232.4192\\\\307.01\\\\124.8047\\\\231.7722\\\\307.01\\\\122.4609\\\\231.7224\\\\307.01\\\\120.1172\\\\231.7625\\\\307.01\\\\117.7734\\\\232.2817\\\\307.01\\\\115.4297\\\\232.5232\\\\307.01\\\\113.0859\\\\232.4546\\\\307.01\\\\110.7422\\\\232.4888\\\\307.01\\\\108.3984\\\\231.7722\\\\307.01\\\\106.0547\\\\231.6215\\\\307.01\\\\103.7109\\\\231.648\\\\307.01\\\\102.8453\\\\232.3734\\\\307.01\\\\101.3672\\\\233.1042\\\\307.01\\\\94.33594\\\\233.0951\\\\307.01\\\\89.64844\\\\233.1221\\\\307.01\\\\77.92969\\\\233.1221\\\\307.01\\\\59.17969\\\\233.1483\\\\307.01\\\\47.46094\\\\233.131\\\\307.01\\\\45.11719\\\\233.0951\\\\307.01\\\\44.1495\\\\232.3734\\\\307.01\\\\42.77344\\\\231.0667\\\\307.01\\\\42.01079\\\\230.0297\\\\307.01\\\\42.77344\\\\229.206\\\\307.01\\\\45.11719\\\\228.5128\\\\307.01\\\\47.46094\\\\226.9947\\\\307.01\\\\49.80469\\\\225.986\\\\307.01\\\\52.14844\\\\224.5319\\\\307.01\\\\54.49219\\\\223.5919\\\\307.01\\\\55.18826\\\\222.9984\\\\307.01\\\\59.17969\\\\220.1266\\\\307.01\\\\61.52344\\\\218.7716\\\\307.01\\\\64.83179\\\\215.9672\\\\307.01\\\\66.21094\\\\214.9167\\\\307.01\\\\70.89844\\\\210.4059\\\\307.01\\\\74.42065\\\\206.5922\\\\307.01\\\\76.41272\\\\204.2484\\\\307.01\\\\78.09221\\\\201.9047\\\\307.01\\\\80.27344\\\\198.7387\\\\307.01\\\\82.73348\\\\194.8734\\\\307.01\\\\84.0608\\\\192.5297\\\\307.01\\\\85.28558\\\\190.1859\\\\307.01\\\\86.21609\\\\187.8422\\\\307.01\\\\87.62429\\\\185.4984\\\\307.01\\\\88.50529\\\\183.1547\\\\307.01\\\\88.94127\\\\180.8109\\\\307.01\\\\89.95934\\\\178.4672\\\\307.01\\\\90.70085\\\\176.1234\\\\307.01\\\\91.22121\\\\173.7797\\\\307.01\\\\92.07523\\\\171.4359\\\\307.01\\\\92.80196\\\\169.0922\\\\307.01\\\\93.06984\\\\166.7484\\\\307.01\\\\93.43011\\\\159.7172\\\\307.01\\\\93.78402\\\\155.0297\\\\307.01\\\\95.35853\\\\152.6859\\\\307.01\\\\97.21561\\\\150.3422\\\\307.01\\\\96.67969\\\\149.7189\\\\307.01\\\\94.33594\\\\148.4892\\\\307.01\\\\93.77909\\\\147.9984\\\\307.01\\\\93.3065\\\\145.6547\\\\307.01\\\\92.98377\\\\140.9672\\\\307.01\\\\92.62429\\\\138.6234\\\\307.01\\\\91.70932\\\\136.2797\\\\307.01\\\\90.52432\\\\131.5922\\\\307.01\\\\88.79446\\\\126.9047\\\\307.01\\\\88.35513\\\\124.5609\\\\307.01\\\\86.99378\\\\122.2172\\\\307.01\\\\85.96972\\\\119.8734\\\\307.01\\\\84.78261\\\\117.5297\\\\307.01\\\\83.77131\\\\115.1859\\\\307.01\\\\82.02393\\\\112.8422\\\\307.01\\\\80.98469\\\\110.4984\\\\307.01\\\\77.92969\\\\106.5841\\\\307.01\\\\77.24248\\\\105.8109\\\\307.01\\\\75.73918\\\\103.4672\\\\307.01\\\\71.58269\\\\98.77969\\\\307.01\\\\68.55469\\\\95.79888\\\\307.01\\\\63.86719\\\\91.72031\\\\307.01\\\\61.52344\\\\90.225\\\\307.01\\\\59.17969\\\\88.22054\\\\307.01\\\\56.83594\\\\86.64962\\\\307.01\\\\54.49219\\\\85.5138\\\\307.01\\\\52.14844\\\\83.72078\\\\307.01\\\\49.80469\\\\82.97671\\\\307.01\\\\47.46094\\\\81.57265\\\\307.01\\\\45.11719\\\\80.68514\\\\307.01\\\\42.77344\\\\79.22858\\\\307.01\\\\38.08594\\\\78.2206\\\\307.01\\\\35.74219\\\\77.19827\\\\307.01\\\\33.39844\\\\76.55239\\\\307.01\\\\31.05469\\\\76.12139\\\\307.01\\\\26.36719\\\\74.72801\\\\307.01\\\\24.02344\\\\74.43276\\\\307.01\\\\16.99219\\\\74.13425\\\\307.01\\\\14.64844\\\\74.0982\\\\307.01\\\\7.617188\\\\74.18246\\\\307.01\\\\2.929688\\\\74.39614\\\\307.01\\\\0.5859375\\\\74.65002\\\\307.01\\\\-4.101563\\\\75.99764\\\\307.01\\\\-6.445313\\\\76.44152\\\\307.01\\\\-8.789063\\\\77.05959\\\\307.01\\\\-11.13281\\\\78.04713\\\\307.01\\\\-15.82031\\\\79.25529\\\\307.01\\\\-18.16406\\\\80.70029\\\\307.01\\\\-20.50781\\\\81.59003\\\\307.01\\\\-22.85156\\\\82.96635\\\\307.01\\\\-25.19531\\\\83.75323\\\\307.01\\\\-27.53906\\\\85.54559\\\\307.01\\\\-29.88281\\\\86.62055\\\\307.01\\\\-32.22656\\\\88.30287\\\\307.01\\\\-34.57031\\\\90.24761\\\\307.01\\\\-36.72696\\\\91.74844\\\\307.01\\\\-39.25781\\\\93.79108\\\\307.01\\\\-41.60156\\\\95.80312\\\\307.01\\\\-46.76263\\\\101.1234\\\\307.01\\\\-50.32931\\\\105.8109\\\\307.01\\\\-52.19967\\\\108.1547\\\\307.01\\\\-53.78753\\\\110.4984\\\\307.01\\\\-55.12727\\\\112.8422\\\\307.01\\\\-56.73218\\\\115.1859\\\\307.01\\\\-57.60399\\\\117.5297\\\\307.01\\\\-59.0554\\\\119.8734\\\\307.01\\\\-59.9868\\\\122.2172\\\\307.01\\\\-61.19757\\\\124.5609\\\\307.01\\\\-61.69523\\\\126.9047\\\\307.01\\\\-63.64114\\\\131.5922\\\\307.01\\\\-64.53993\\\\136.2797\\\\307.01\\\\-65.34997\\\\138.6234\\\\307.01\\\\-65.7409\\\\140.9672\\\\307.01\\\\-66.1507\\\\145.6547\\\\307.01\\\\-66.472\\\\150.3422\\\\307.01\\\\-66.58739\\\\155.0297\\\\307.01\\\\-66.57152\\\\157.3734\\\\307.01\\\\-66.46494\\\\159.7172\\\\307.01\\\\-66.11516\\\\164.4047\\\\307.01\\\\-65.59342\\\\169.0922\\\\307.01\\\\-64.28482\\\\173.7797\\\\307.01\\\\-63.89509\\\\176.1234\\\\307.01\\\\-63.1595\\\\178.4672\\\\307.01\\\\-61.99355\\\\180.8109\\\\307.01\\\\-61.42098\\\\183.1547\\\\307.01\\\\-60.5483\\\\185.4984\\\\307.01\\\\-60.35156\\\\185.7601\\\\307.01\\\\-56.91528\\\\192.5297\\\\307.01\\\\-55.83274\\\\194.8734\\\\307.01\\\\-54.25148\\\\197.2172\\\\307.01\\\\-52.56362\\\\199.5609\\\\307.01\\\\-51.16442\\\\201.9047\\\\307.01\\\\-48.63281\\\\205.0156\\\\307.01\\\\-47.47334\\\\206.5922\\\\307.01\\\\-45.13073\\\\208.9359\\\\307.01\\\\-42.93779\\\\211.2797\\\\307.01\\\\-39.25781\\\\214.8144\\\\307.01\\\\-34.97234\\\\218.3109\\\\307.01\\\\-34.57031\\\\218.6988\\\\307.01\\\\-32.22656\\\\220.0478\\\\307.01\\\\-28.16808\\\\222.9984\\\\307.01\\\\-27.53906\\\\223.5539\\\\307.01\\\\-25.19531\\\\224.4929\\\\307.01\\\\-22.85156\\\\225.9097\\\\307.01\\\\-20.50781\\\\226.9751\\\\307.01\\\\-18.16406\\\\228.4825\\\\307.01\\\\-15.82031\\\\229.1508\\\\307.01\\\\-14.96138\\\\230.0297\\\\307.01\\\\-15.82031\\\\231.3794\\\\307.01\\\\-16.92257\\\\232.3734\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"376\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"12\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.0951\\\\310.01\\\\-29.88281\\\\233.1132\\\\310.01\\\\-32.22656\\\\233.1483\\\\310.01\\\\-36.91406\\\\233.1221\\\\310.01\\\\-46.28906\\\\233.1397\\\\310.01\\\\-50.97656\\\\233.1736\\\\310.01\\\\-60.35156\\\\233.19\\\\310.01\\\\-62.69531\\\\233.1652\\\\310.01\\\\-65.03906\\\\232.5396\\\\310.01\\\\-67.38281\\\\232.8852\\\\310.01\\\\-72.07031\\\\232.9942\\\\310.01\\\\-86.13281\\\\233.0183\\\\310.01\\\\-88.47656\\\\233.0671\\\\310.01\\\\-95.50781\\\\233.0859\\\\310.01\\\\-97.85156\\\\233.3123\\\\310.01\\\\-102.5391\\\\233.9389\\\\310.01\\\\-104.8828\\\\234.062\\\\310.01\\\\-107.2266\\\\233.5222\\\\310.01\\\\-109.5703\\\\234.0754\\\\310.01\\\\-116.6016\\\\234.0158\\\\310.01\\\\-133.0078\\\\234.1313\\\\310.01\\\\-137.6953\\\\234.1127\\\\310.01\\\\-142.3828\\\\234.1741\\\\310.01\\\\-147.0703\\\\234.0855\\\\310.01\\\\-151.7578\\\\234.1127\\\\310.01\\\\-165.8203\\\\234.0141\\\\310.01\\\\-168.1641\\\\234.1313\\\\310.01\\\\-182.2266\\\\234.2252\\\\310.01\\\\-186.9141\\\\234.2721\\\\310.01\\\\-189.2578\\\\234.2252\\\\310.01\\\\-198.6328\\\\234.2187\\\\310.01\\\\-200.9766\\\\234.261\\\\310.01\\\\-205.6641\\\\234.1564\\\\310.01\\\\-208.0078\\\\234.2088\\\\310.01\\\\-215.0391\\\\234.2678\\\\310.01\\\\-222.0703\\\\234.3601\\\\310.01\\\\-226.7578\\\\234.3296\\\\310.01\\\\-233.7891\\\\234.1478\\\\310.01\\\\-238.4766\\\\234.1954\\\\310.01\\\\-243.1641\\\\234.1652\\\\310.01\\\\-245.5078\\\\233.9895\\\\310.01\\\\-247.8516\\\\233.9042\\\\310.01\\\\-252.5391\\\\234.0772\\\\310.01\\\\-254.8828\\\\234.2605\\\\310.01\\\\-257.2266\\\\234.9111\\\\310.01\\\\-259.5703\\\\236.1157\\\\310.01\\\\-260.7422\\\\237.0609\\\\310.01\\\\-262.3813\\\\239.4047\\\\310.01\\\\-262.5138\\\\241.7484\\\\310.01\\\\-261.5641\\\\244.0922\\\\310.01\\\\-260.7806\\\\246.4359\\\\310.01\\\\-259.5703\\\\248.5863\\\\310.01\\\\-257.6038\\\\251.1234\\\\310.01\\\\-255.672\\\\253.4672\\\\310.01\\\\-252.5391\\\\256.6564\\\\310.01\\\\-250.1953\\\\258.9219\\\\310.01\\\\-247.8516\\\\261.4344\\\\310.01\\\\-245.5078\\\\263.6147\\\\310.01\\\\-244.1124\\\\265.1859\\\\310.01\\\\-241.6101\\\\267.5297\\\\310.01\\\\-239.4375\\\\269.8734\\\\310.01\\\\-236.9858\\\\272.2172\\\\310.01\\\\-233.7891\\\\275.3877\\\\310.01\\\\-231.4453\\\\277.8215\\\\310.01\\\\-229.1016\\\\280.0036\\\\310.01\\\\-226.7578\\\\282.5409\\\\310.01\\\\-225.1803\\\\283.9359\\\\310.01\\\\-222.0703\\\\287.2221\\\\310.01\\\\-220.5288\\\\288.6234\\\\310.01\\\\-218.3186\\\\290.9672\\\\310.01\\\\-217.3828\\\\291.678\\\\310.01\\\\-212.6953\\\\294.6293\\\\310.01\\\\-210.3516\\\\295.3008\\\\310.01\\\\-208.0078\\\\296.4508\\\\310.01\\\\-205.6641\\\\296.8858\\\\310.01\\\\-203.3203\\\\297.1639\\\\310.01\\\\-196.2891\\\\297.1446\\\\310.01\\\\-191.6016\\\\297.0175\\\\310.01\\\\-179.8828\\\\296.9378\\\\310.01\\\\-177.5391\\\\296.8855\\\\310.01\\\\-165.8203\\\\296.8345\\\\310.01\\\\-158.7891\\\\296.8672\\\\310.01\\\\-154.1016\\\\296.851\\\\310.01\\\\-135.3516\\\\296.8786\\\\310.01\\\\-128.3203\\\\296.9134\\\\310.01\\\\-121.2891\\\\296.8971\\\\310.01\\\\-111.9141\\\\296.8359\\\\310.01\\\\-97.85156\\\\296.8453\\\\310.01\\\\-88.47656\\\\296.9028\\\\310.01\\\\-86.13281\\\\296.8927\\\\310.01\\\\-69.72656\\\\296.9622\\\\310.01\\\\-65.03906\\\\296.934\\\\310.01\\\\-58.00781\\\\296.9358\\\\310.01\\\\-55.66406\\\\297.3383\\\\310.01\\\\-53.32031\\\\296.9926\\\\310.01\\\\-50.97656\\\\297.0405\\\\310.01\\\\-48.63281\\\\296.9267\\\\310.01\\\\-46.28906\\\\297.409\\\\310.01\\\\-43.94531\\\\297.3148\\\\310.01\\\\-41.60156\\\\297.373\\\\310.01\\\\-39.25781\\\\297.0516\\\\310.01\\\\-36.91406\\\\297.1798\\\\310.01\\\\-34.57031\\\\297.1975\\\\310.01\\\\-32.22656\\\\297.3947\\\\310.01\\\\-29.88281\\\\297.2767\\\\310.01\\\\-27.53906\\\\297.2779\\\\310.01\\\\-25.19531\\\\297.3806\\\\310.01\\\\-22.85156\\\\297.106\\\\310.01\\\\-20.50781\\\\297.4055\\\\310.01\\\\-18.16406\\\\297.1577\\\\310.01\\\\-15.82031\\\\297.2089\\\\310.01\\\\-13.47656\\\\297.4229\\\\310.01\\\\-11.13281\\\\297.2307\\\\310.01\\\\-8.789063\\\\297.1626\\\\310.01\\\\-6.445313\\\\297.4229\\\\310.01\\\\-4.101563\\\\297.3546\\\\310.01\\\\-1.757813\\\\297.0439\\\\310.01\\\\0.5859375\\\\297.0849\\\\310.01\\\\2.929688\\\\296.8985\\\\310.01\\\\5.273438\\\\297.2462\\\\310.01\\\\7.617188\\\\296.8985\\\\310.01\\\\9.960938\\\\297.1152\\\\310.01\\\\12.30469\\\\296.8477\\\\310.01\\\\19.33594\\\\296.8579\\\\310.01\\\\24.02344\\\\296.8161\\\\310.01\\\\26.36719\\\\296.8473\\\\310.01\\\\33.39844\\\\296.7643\\\\310.01\\\\42.77344\\\\296.7533\\\\310.01\\\\45.11719\\\\296.7115\\\\310.01\\\\59.17969\\\\296.6814\\\\310.01\\\\68.55469\\\\296.5984\\\\310.01\\\\75.58594\\\\296.6107\\\\310.01\\\\80.27344\\\\296.5362\\\\310.01\\\\84.96094\\\\296.5616\\\\310.01\\\\87.30469\\\\296.5098\\\\310.01\\\\99.02344\\\\296.5005\\\\310.01\\\\101.3672\\\\296.466\\\\310.01\\\\110.7422\\\\296.4189\\\\310.01\\\\113.0859\\\\296.3782\\\\310.01\\\\117.7734\\\\296.3976\\\\310.01\\\\120.1172\\\\296.3578\\\\310.01\\\\127.1484\\\\296.3288\\\\310.01\\\\129.4922\\\\296.2873\\\\310.01\\\\131.8359\\\\296.3348\\\\310.01\\\\134.1797\\\\295.9141\\\\310.01\\\\136.5234\\\\296.1612\\\\310.01\\\\138.8672\\\\296.033\\\\310.01\\\\141.2109\\\\296.2967\\\\310.01\\\\143.5547\\\\295.9477\\\\310.01\\\\145.8984\\\\295.864\\\\310.01\\\\150.5859\\\\295.894\\\\310.01\\\\152.9297\\\\295.833\\\\310.01\\\\162.3047\\\\295.7516\\\\310.01\\\\166.9922\\\\295.6638\\\\310.01\\\\171.6797\\\\295.7173\\\\310.01\\\\181.0547\\\\295.6093\\\\310.01\\\\185.7422\\\\295.6272\\\\310.01\\\\188.0859\\\\295.557\\\\310.01\\\\192.7734\\\\295.5742\\\\310.01\\\\197.4609\\\\295.8012\\\\310.01\\\\199.8047\\\\295.8012\\\\310.01\\\\202.1484\\\\295.6819\\\\310.01\\\\204.4922\\\\295.4287\\\\310.01\\\\206.8359\\\\294.8307\\\\310.01\\\\209.1797\\\\294.3828\\\\310.01\\\\211.5234\\\\292.4764\\\\310.01\\\\213.8672\\\\291.1765\\\\310.01\\\\216.2109\\\\289.625\\\\310.01\\\\217.2743\\\\288.6234\\\\310.01\\\\218.5547\\\\287.0983\\\\310.01\\\\221.7204\\\\283.9359\\\\310.01\\\\225.5859\\\\279.8821\\\\310.01\\\\227.9297\\\\277.5431\\\\310.01\\\\230.2734\\\\275.0606\\\\310.01\\\\233.113\\\\272.2172\\\\310.01\\\\235.3208\\\\269.8734\\\\310.01\\\\237.7111\\\\267.5297\\\\310.01\\\\239.9438\\\\265.1859\\\\310.01\\\\246.8767\\\\258.1547\\\\310.01\\\\249.1396\\\\255.8109\\\\310.01\\\\251.4974\\\\253.4672\\\\310.01\\\\255.4942\\\\248.7797\\\\310.01\\\\257.2692\\\\246.4359\\\\310.01\\\\259.2847\\\\244.0922\\\\310.01\\\\260.0775\\\\241.7484\\\\310.01\\\\260.576\\\\239.4047\\\\310.01\\\\260.1205\\\\237.0609\\\\310.01\\\\258.8931\\\\234.7172\\\\310.01\\\\258.3984\\\\234.2411\\\\310.01\\\\256.0547\\\\233.35\\\\310.01\\\\253.7109\\\\232.9379\\\\310.01\\\\251.3672\\\\232.7162\\\\310.01\\\\249.0234\\\\232.8224\\\\310.01\\\\244.3359\\\\232.8437\\\\310.01\\\\239.6484\\\\233.0108\\\\310.01\\\\237.3047\\\\233.0007\\\\310.01\\\\232.6172\\\\233.0726\\\\310.01\\\\227.9297\\\\233.0305\\\\310.01\\\\211.5234\\\\233.0726\\\\310.01\\\\206.8359\\\\233.0245\\\\310.01\\\\204.4922\\\\232.7456\\\\310.01\\\\202.1484\\\\232.6886\\\\310.01\\\\195.1172\\\\232.7848\\\\310.01\\\\190.4297\\\\232.7186\\\\310.01\\\\176.3672\\\\232.7719\\\\310.01\\\\166.9922\\\\232.7456\\\\310.01\\\\159.9609\\\\232.7975\\\\310.01\\\\150.5859\\\\232.7746\\\\310.01\\\\145.8984\\\\232.8003\\\\310.01\\\\138.8672\\\\232.6623\\\\310.01\\\\134.1797\\\\232.6623\\\\310.01\\\\131.8359\\\\232.4897\\\\310.01\\\\129.4922\\\\231.8945\\\\310.01\\\\124.8047\\\\231.6823\\\\310.01\\\\120.1172\\\\231.737\\\\310.01\\\\117.7734\\\\232.3211\\\\310.01\\\\115.4297\\\\232.6329\\\\310.01\\\\110.7422\\\\232.6623\\\\310.01\\\\108.3984\\\\231.9109\\\\310.01\\\\106.0547\\\\231.602\\\\310.01\\\\103.7109\\\\231.6193\\\\310.01\\\\102.8551\\\\232.3734\\\\310.01\\\\101.3672\\\\233.1132\\\\310.01\\\\94.33594\\\\233.0951\\\\310.01\\\\87.30469\\\\233.1397\\\\310.01\\\\82.61719\\\\233.1132\\\\310.01\\\\75.58594\\\\233.1483\\\\310.01\\\\70.89844\\\\233.1221\\\\310.01\\\\59.17969\\\\233.1568\\\\310.01\\\\52.14844\\\\233.1221\\\\310.01\\\\47.46094\\\\233.131\\\\310.01\\\\45.11719\\\\233.0859\\\\310.01\\\\44.16726\\\\232.3734\\\\310.01\\\\42.77344\\\\231.0498\\\\310.01\\\\42.0192\\\\230.0297\\\\310.01\\\\42.77344\\\\229.2101\\\\310.01\\\\45.11719\\\\228.4825\\\\310.01\\\\47.46094\\\\226.9683\\\\310.01\\\\49.80469\\\\225.9571\\\\310.01\\\\52.14844\\\\224.5099\\\\310.01\\\\54.49219\\\\223.5692\\\\310.01\\\\55.14323\\\\222.9984\\\\310.01\\\\59.17969\\\\220.1045\\\\310.01\\\\61.52344\\\\218.7182\\\\310.01\\\\64.78396\\\\215.9672\\\\310.01\\\\66.21094\\\\214.8859\\\\310.01\\\\70.89844\\\\210.3839\\\\310.01\\\\74.36692\\\\206.5922\\\\310.01\\\\76.38396\\\\204.2484\\\\310.01\\\\81.22672\\\\197.2172\\\\310.01\\\\84.03577\\\\192.5297\\\\310.01\\\\85.25792\\\\190.1859\\\\310.01\\\\86.1923\\\\187.8422\\\\310.01\\\\87.47085\\\\185.4984\\\\310.01\\\\88.48811\\\\183.1547\\\\310.01\\\\88.90029\\\\180.8109\\\\310.01\\\\89.90248\\\\178.4672\\\\310.01\\\\90.64713\\\\176.1234\\\\310.01\\\\91.18042\\\\173.7797\\\\310.01\\\\92.74409\\\\169.0922\\\\310.01\\\\93.04629\\\\166.7484\\\\310.01\\\\93.38223\\\\159.7172\\\\310.01\\\\93.66732\\\\155.0297\\\\310.01\\\\94.19643\\\\152.6859\\\\310.01\\\\95.64145\\\\150.3422\\\\310.01\\\\94.33594\\\\149.1322\\\\310.01\\\\93.50089\\\\147.9984\\\\310.01\\\\93.25756\\\\145.6547\\\\310.01\\\\92.96472\\\\140.9672\\\\310.01\\\\92.55265\\\\138.6234\\\\310.01\\\\91.62743\\\\136.2797\\\\310.01\\\\90.46875\\\\131.5922\\\\310.01\\\\88.75411\\\\126.9047\\\\310.01\\\\88.33083\\\\124.5609\\\\310.01\\\\86.91406\\\\122.2172\\\\310.01\\\\85.93851\\\\119.8734\\\\310.01\\\\84.69238\\\\117.5297\\\\310.01\\\\83.74721\\\\115.1859\\\\310.01\\\\81.96295\\\\112.8422\\\\310.01\\\\80.91831\\\\110.4984\\\\310.01\\\\79.14664\\\\108.1547\\\\310.01\\\\77.20256\\\\105.8109\\\\310.01\\\\75.65157\\\\103.4672\\\\310.01\\\\71.53253\\\\98.77969\\\\310.01\\\\68.55469\\\\95.82625\\\\310.01\\\\66.21094\\\\93.7748\\\\310.01\\\\63.79395\\\\91.74844\\\\310.01\\\\61.52344\\\\90.26997\\\\310.01\\\\59.17969\\\\88.23898\\\\310.01\\\\56.83594\\\\86.67812\\\\310.01\\\\54.49219\\\\85.52697\\\\310.01\\\\52.14844\\\\83.74062\\\\310.01\\\\49.80469\\\\82.99707\\\\310.01\\\\47.46094\\\\81.59437\\\\310.01\\\\45.11719\\\\80.70401\\\\310.01\\\\42.77344\\\\79.24621\\\\310.01\\\\38.08594\\\\78.23525\\\\310.01\\\\35.74219\\\\77.20986\\\\310.01\\\\33.39844\\\\76.56908\\\\310.01\\\\31.05469\\\\76.1376\\\\310.01\\\\28.71094\\\\75.50471\\\\310.01\\\\26.36719\\\\74.72801\\\\310.01\\\\24.02344\\\\74.43276\\\\310.01\\\\16.99219\\\\74.15237\\\\310.01\\\\12.30469\\\\74.10455\\\\310.01\\\\7.617188\\\\74.19435\\\\310.01\\\\2.929688\\\\74.40105\\\\310.01\\\\0.5859375\\\\74.6557\\\\310.01\\\\-4.101563\\\\75.97835\\\\310.01\\\\-6.445313\\\\76.43703\\\\310.01\\\\-8.789063\\\\77.04008\\\\310.01\\\\-11.13281\\\\78.03346\\\\310.01\\\\-15.82031\\\\79.22787\\\\310.01\\\\-18.16406\\\\80.65422\\\\310.01\\\\-20.50781\\\\81.57233\\\\310.01\\\\-22.85156\\\\82.94526\\\\310.01\\\\-25.19531\\\\83.73331\\\\310.01\\\\-27.53906\\\\85.52371\\\\310.01\\\\-29.88281\\\\86.58486\\\\310.01\\\\-32.22656\\\\88.25871\\\\310.01\\\\-34.57031\\\\90.22985\\\\310.01\\\\-36.76382\\\\91.74844\\\\310.01\\\\-39.25781\\\\93.74467\\\\310.01\\\\-41.60156\\\\95.77628\\\\310.01\\\\-46.83174\\\\101.1234\\\\310.01\\\\-50.36664\\\\105.8109\\\\310.01\\\\-52.22528\\\\108.1547\\\\310.01\\\\-53.85835\\\\110.4984\\\\310.01\\\\-55.16944\\\\112.8422\\\\310.01\\\\-56.75659\\\\115.1859\\\\310.01\\\\-57.66267\\\\117.5297\\\\310.01\\\\-59.07907\\\\119.8734\\\\310.01\\\\-60.05458\\\\122.2172\\\\310.01\\\\-61.23355\\\\124.5609\\\\310.01\\\\-61.71977\\\\126.9047\\\\310.01\\\\-63.70555\\\\131.5922\\\\310.01\\\\-64.61088\\\\136.2797\\\\310.01\\\\-65.42969\\\\138.6234\\\\310.01\\\\-65.75874\\\\140.9672\\\\310.01\\\\-66.18872\\\\145.6547\\\\310.01\\\\-66.50977\\\\150.3422\\\\310.01\\\\-66.63708\\\\155.0297\\\\310.01\\\\-66.4952\\\\159.7172\\\\310.01\\\\-66.1377\\\\164.4047\\\\310.01\\\\-65.63528\\\\169.0922\\\\310.01\\\\-65.06631\\\\171.4359\\\\310.01\\\\-64.31938\\\\173.7797\\\\310.01\\\\-63.93199\\\\176.1234\\\\310.01\\\\-63.24552\\\\178.4672\\\\310.01\\\\-62.07078\\\\180.8109\\\\310.01\\\\-61.44824\\\\183.1547\\\\310.01\\\\-60.69909\\\\185.4984\\\\310.01\\\\-59.32978\\\\187.8422\\\\310.01\\\\-58.20172\\\\190.1859\\\\310.01\\\\-56.94638\\\\192.5297\\\\310.01\\\\-55.91395\\\\194.8734\\\\310.01\\\\-52.60492\\\\199.5609\\\\310.01\\\\-51.24368\\\\201.9047\\\\310.01\\\\-48.63281\\\\205.082\\\\310.01\\\\-47.51002\\\\206.5922\\\\310.01\\\\-45.16488\\\\208.9359\\\\310.01\\\\-42.98322\\\\211.2797\\\\310.01\\\\-39.25781\\\\214.8471\\\\310.01\\\\-34.57031\\\\218.7393\\\\310.01\\\\-32.22656\\\\220.0723\\\\310.01\\\\-31.49524\\\\220.6547\\\\310.01\\\\-28.1901\\\\222.9984\\\\310.01\\\\-27.53906\\\\223.5692\\\\310.01\\\\-25.19531\\\\224.5146\\\\310.01\\\\-22.85156\\\\225.9463\\\\310.01\\\\-20.50781\\\\226.9932\\\\310.01\\\\-18.16406\\\\228.5043\\\\310.01\\\\-15.82031\\\\229.1644\\\\310.01\\\\-14.9747\\\\230.0297\\\\310.01\\\\-15.82031\\\\231.3705\\\\310.01\\\\-16.91176\\\\232.3734\\\\310.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"369\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"13\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"45.11719\\\\233.1042\\\\313.01\\\\44.14645\\\\232.3734\\\\313.01\\\\42.77344\\\\231.0593\\\\313.01\\\\42.01079\\\\230.0297\\\\313.01\\\\42.77344\\\\229.2013\\\\313.01\\\\45.11719\\\\228.4738\\\\313.01\\\\47.46094\\\\226.9815\\\\313.01\\\\49.80469\\\\225.902\\\\313.01\\\\52.14844\\\\224.4881\\\\313.01\\\\54.49219\\\\223.5423\\\\313.01\\\\55.12733\\\\222.9984\\\\313.01\\\\59.17969\\\\220.0829\\\\313.01\\\\61.52344\\\\218.6617\\\\313.01\\\\64.74609\\\\215.9672\\\\313.01\\\\66.21094\\\\214.8439\\\\313.01\\\\70.89844\\\\210.3514\\\\313.01\\\\72.25302\\\\208.9359\\\\313.01\\\\76.36958\\\\204.2484\\\\313.01\\\\77.92969\\\\201.9154\\\\313.01\\\\80.27344\\\\198.618\\\\313.01\\\\81.20244\\\\197.2172\\\\313.01\\\\82.5531\\\\194.8734\\\\313.01\\\\84.01786\\\\192.5297\\\\313.01\\\\85.20026\\\\190.1859\\\\313.01\\\\86.15661\\\\187.8422\\\\313.01\\\\87.38582\\\\185.4984\\\\313.01\\\\88.4649\\\\183.1547\\\\313.01\\\\88.8737\\\\180.8109\\\\313.01\\\\89.82677\\\\178.4672\\\\313.01\\\\90.60566\\\\176.1234\\\\313.01\\\\91.14483\\\\173.7797\\\\313.01\\\\91.8785\\\\171.4359\\\\313.01\\\\92.70221\\\\169.0922\\\\313.01\\\\93.03451\\\\166.7484\\\\313.01\\\\93.47005\\\\157.3734\\\\313.01\\\\93.61861\\\\152.6859\\\\313.01\\\\93.64014\\\\150.3422\\\\313.01\\\\93.34677\\\\147.9984\\\\313.01\\\\92.94547\\\\140.9672\\\\313.01\\\\92.48362\\\\138.6234\\\\313.01\\\\91.57636\\\\136.2797\\\\313.01\\\\90.42757\\\\131.5922\\\\313.01\\\\89.48472\\\\129.2484\\\\313.01\\\\88.73901\\\\126.9047\\\\313.01\\\\88.29956\\\\124.5609\\\\313.01\\\\86.86148\\\\122.2172\\\\313.01\\\\85.9046\\\\119.8734\\\\313.01\\\\84.65003\\\\117.5297\\\\313.01\\\\83.69191\\\\115.1859\\\\313.01\\\\81.91267\\\\112.8422\\\\313.01\\\\80.87713\\\\110.4984\\\\313.01\\\\79.10793\\\\108.1547\\\\313.01\\\\77.14613\\\\105.8109\\\\313.01\\\\75.58594\\\\103.498\\\\313.01\\\\73.56179\\\\101.1234\\\\313.01\\\\71.46389\\\\98.77969\\\\313.01\\\\68.55469\\\\95.89069\\\\313.01\\\\66.21094\\\\93.83636\\\\313.01\\\\63.71433\\\\91.74844\\\\313.01\\\\61.52344\\\\90.29206\\\\313.01\\\\59.17969\\\\88.26962\\\\313.01\\\\56.83594\\\\86.74574\\\\313.01\\\\54.49219\\\\85.57699\\\\313.01\\\\52.14844\\\\83.78355\\\\313.01\\\\49.80469\\\\83.01695\\\\313.01\\\\47.46094\\\\81.62056\\\\313.01\\\\45.11719\\\\80.73152\\\\313.01\\\\42.77344\\\\79.27779\\\\313.01\\\\38.08594\\\\78.27902\\\\313.01\\\\35.74219\\\\77.23351\\\\313.01\\\\33.39844\\\\76.57487\\\\313.01\\\\31.05469\\\\76.15349\\\\313.01\\\\28.71094\\\\75.56659\\\\313.01\\\\26.36719\\\\74.72801\\\\313.01\\\\24.02344\\\\74.44027\\\\313.01\\\\14.64844\\\\74.0982\\\\313.01\\\\7.617188\\\\74.19435\\\\313.01\\\\2.929688\\\\74.39614\\\\313.01\\\\0.5859375\\\\74.6557\\\\313.01\\\\-1.757813\\\\75.2781\\\\313.01\\\\-4.101563\\\\75.98805\\\\313.01\\\\-6.445313\\\\76.43114\\\\313.01\\\\-8.789063\\\\77.04008\\\\313.01\\\\-11.13281\\\\78.03108\\\\313.01\\\\-13.47656\\\\78.68081\\\\313.01\\\\-15.82031\\\\79.16585\\\\313.01\\\\-18.16406\\\\80.60848\\\\313.01\\\\-20.50781\\\\81.54504\\\\313.01\\\\-22.85156\\\\82.93452\\\\313.01\\\\-25.19531\\\\83.69951\\\\313.01\\\\-27.53906\\\\85.48667\\\\313.01\\\\-29.88281\\\\86.58486\\\\313.01\\\\-32.22656\\\\88.2459\\\\313.01\\\\-34.57031\\\\90.18356\\\\313.01\\\\-36.84147\\\\91.74844\\\\313.01\\\\-39.25781\\\\93.7097\\\\313.01\\\\-41.60156\\\\95.73894\\\\313.01\\\\-46.90146\\\\101.1234\\\\313.01\\\\-48.62366\\\\103.4672\\\\313.01\\\\-52.24294\\\\108.1547\\\\313.01\\\\-53.89533\\\\110.4984\\\\313.01\\\\-55.24722\\\\112.8422\\\\313.01\\\\-56.79365\\\\115.1859\\\\313.01\\\\-57.7046\\\\117.5297\\\\313.01\\\\-59.10275\\\\119.8734\\\\313.01\\\\-60.1423\\\\122.2172\\\\313.01\\\\-61.27319\\\\124.5609\\\\313.01\\\\-61.73931\\\\126.9047\\\\313.01\\\\-62.82649\\\\129.2484\\\\313.01\\\\-63.74772\\\\131.5922\\\\313.01\\\\-64.64844\\\\136.2797\\\\313.01\\\\-65.49149\\\\138.6234\\\\313.01\\\\-66.03151\\\\143.3109\\\\313.01\\\\-66.55173\\\\150.3422\\\\313.01\\\\-66.7085\\\\155.0297\\\\313.01\\\\-66.5332\\\\159.7172\\\\313.01\\\\-66.37591\\\\162.0609\\\\313.01\\\\-65.93555\\\\166.7484\\\\313.01\\\\-65.66541\\\\169.0922\\\\313.01\\\\-65.13599\\\\171.4359\\\\313.01\\\\-64.35547\\\\173.7797\\\\313.01\\\\-63.97324\\\\176.1234\\\\313.01\\\\-63.31245\\\\178.4672\\\\313.01\\\\-62.13423\\\\180.8109\\\\313.01\\\\-60.7784\\\\185.4984\\\\313.01\\\\-59.36625\\\\187.8422\\\\313.01\\\\-58.29068\\\\190.1859\\\\313.01\\\\-56.97235\\\\192.5297\\\\313.01\\\\-55.9882\\\\194.8734\\\\313.01\\\\-55.66406\\\\195.2305\\\\313.01\\\\-53.32031\\\\198.6979\\\\313.01\\\\-52.65765\\\\199.5609\\\\313.01\\\\-51.33394\\\\201.9047\\\\313.01\\\\-48.63281\\\\205.1581\\\\313.01\\\\-47.54197\\\\206.5922\\\\313.01\\\\-45.18493\\\\208.9359\\\\313.01\\\\-43.00636\\\\211.2797\\\\313.01\\\\-39.25781\\\\214.8799\\\\313.01\\\\-34.57031\\\\218.8154\\\\313.01\\\\-32.22656\\\\220.1045\\\\313.01\\\\-31.54811\\\\220.6547\\\\313.01\\\\-28.24903\\\\222.9984\\\\313.01\\\\-27.53906\\\\223.618\\\\313.01\\\\-25.19531\\\\224.5319\\\\313.01\\\\-22.85156\\\\226.0067\\\\313.01\\\\-20.50781\\\\227.0116\\\\313.01\\\\-18.16406\\\\228.5043\\\\313.01\\\\-15.82031\\\\229.173\\\\313.01\\\\-14.98326\\\\230.0297\\\\313.01\\\\-15.82031\\\\231.3494\\\\313.01\\\\-16.91331\\\\232.3734\\\\313.01\\\\-18.16406\\\\233.1042\\\\313.01\\\\-22.85156\\\\233.131\\\\313.01\\\\-29.88281\\\\233.1132\\\\313.01\\\\-36.91406\\\\233.1483\\\\313.01\\\\-46.28906\\\\233.1397\\\\313.01\\\\-50.97656\\\\233.1818\\\\313.01\\\\-62.69531\\\\233.1652\\\\313.01\\\\-65.03906\\\\232.5396\\\\313.01\\\\-67.38281\\\\232.8735\\\\313.01\\\\-72.07031\\\\232.9942\\\\313.01\\\\-81.44531\\\\233.0343\\\\313.01\\\\-86.13281\\\\233.0283\\\\313.01\\\\-95.50781\\\\233.0951\\\\313.01\\\\-97.85156\\\\233.3584\\\\313.01\\\\-100.1953\\\\233.9981\\\\313.01\\\\-102.5391\\\\234.0754\\\\313.01\\\\-107.2266\\\\233.9926\\\\313.01\\\\-109.5703\\\\234.0754\\\\313.01\\\\-114.2578\\\\234.0284\\\\313.01\\\\-123.6328\\\\234.0805\\\\313.01\\\\-130.6641\\\\234.0855\\\\313.01\\\\-135.3516\\\\234.1407\\\\313.01\\\\-137.6953\\\\234.1127\\\\313.01\\\\-142.3828\\\\234.1889\\\\313.01\\\\-147.0703\\\\234.1038\\\\313.01\\\\-154.1016\\\\234.0513\\\\313.01\\\\-158.7891\\\\234.0691\\\\313.01\\\\-165.8203\\\\234.0211\\\\313.01\\\\-168.1641\\\\234.1579\\\\313.01\\\\-172.8516\\\\234.2175\\\\313.01\\\\-175.1953\\\\234.1894\\\\313.01\\\\-184.5703\\\\234.2686\\\\313.01\\\\-189.2578\\\\234.2252\\\\313.01\\\\-193.9453\\\\234.2289\\\\313.01\\\\-200.9766\\\\234.2902\\\\313.01\\\\-205.6641\\\\234.1783\\\\313.01\\\\-210.3516\\\\234.2822\\\\313.01\\\\-215.0391\\\\234.3418\\\\313.01\\\\-222.0703\\\\234.3731\\\\313.01\\\\-226.7578\\\\234.3601\\\\313.01\\\\-233.7891\\\\234.1731\\\\313.01\\\\-238.4766\\\\234.2088\\\\313.01\\\\-243.1641\\\\234.1523\\\\313.01\\\\-247.8516\\\\233.8669\\\\313.01\\\\-250.1953\\\\233.9436\\\\313.01\\\\-254.8828\\\\234.2296\\\\313.01\\\\-257.2266\\\\234.63\\\\313.01\\\\-259.5703\\\\235.982\\\\313.01\\\\-260.9235\\\\237.0609\\\\313.01\\\\-262.7961\\\\239.4047\\\\313.01\\\\-262.9268\\\\241.7484\\\\313.01\\\\-262.2656\\\\244.0922\\\\313.01\\\\-261.032\\\\246.4359\\\\313.01\\\\-259.6734\\\\248.7797\\\\313.01\\\\-257.5789\\\\251.1234\\\\313.01\\\\-255.7048\\\\253.4672\\\\313.01\\\\-252.5391\\\\256.6491\\\\313.01\\\\-250.1953\\\\258.9388\\\\313.01\\\\-247.8516\\\\261.453\\\\313.01\\\\-245.5078\\\\263.6436\\\\313.01\\\\-244.1278\\\\265.1859\\\\313.01\\\\-241.655\\\\267.5297\\\\313.01\\\\-239.4557\\\\269.8734\\\\313.01\\\\-233.7891\\\\275.4082\\\\313.01\\\\-231.4453\\\\277.8406\\\\313.01\\\\-229.1016\\\\280.0036\\\\313.01\\\\-226.7578\\\\282.5503\\\\313.01\\\\-225.1923\\\\283.9359\\\\313.01\\\\-222.0703\\\\287.2287\\\\313.01\\\\-220.5585\\\\288.6234\\\\313.01\\\\-218.3552\\\\290.9672\\\\313.01\\\\-217.3828\\\\291.7043\\\\313.01\\\\-214.921\\\\293.3109\\\\313.01\\\\-212.6953\\\\294.6401\\\\313.01\\\\-210.3516\\\\295.3416\\\\313.01\\\\-208.0078\\\\296.4592\\\\313.01\\\\-205.6641\\\\296.8858\\\\313.01\\\\-203.3203\\\\297.1639\\\\313.01\\\\-196.2891\\\\297.1254\\\\313.01\\\\-193.9453\\\\297.0099\\\\313.01\\\\-177.5391\\\\296.8925\\\\313.01\\\\-165.8203\\\\296.8423\\\\313.01\\\\-154.1016\\\\296.851\\\\313.01\\\\-147.0703\\\\296.8843\\\\313.01\\\\-144.7266\\\\296.8517\\\\313.01\\\\-137.6953\\\\296.894\\\\313.01\\\\-125.9766\\\\296.9214\\\\313.01\\\\-116.6016\\\\296.8896\\\\313.01\\\\-111.9141\\\\296.8447\\\\313.01\\\\-95.50781\\\\296.8738\\\\313.01\\\\-93.16406\\\\296.9016\\\\313.01\\\\-83.78906\\\\296.9028\\\\313.01\\\\-74.41406\\\\296.9514\\\\313.01\\\\-65.03906\\\\296.9644\\\\313.01\\\\-60.35156\\\\296.916\\\\313.01\\\\-58.00781\\\\296.9377\\\\313.01\\\\-55.66406\\\\297.3491\\\\313.01\\\\-53.32031\\\\296.9377\\\\313.01\\\\-50.97656\\\\296.9285\\\\313.01\\\\-48.63281\\\\297.1917\\\\313.01\\\\-46.28906\\\\297.1807\\\\313.01\\\\-43.94531\\\\297.2621\\\\313.01\\\\-41.60156\\\\297.2199\\\\313.01\\\\-39.25781\\\\297.3984\\\\313.01\\\\-36.91406\\\\297.402\\\\313.01\\\\-34.57031\\\\297.0362\\\\313.01\\\\-32.22656\\\\297.4125\\\\313.01\\\\-29.88281\\\\297.4125\\\\313.01\\\\-27.53906\\\\297.2416\\\\313.01\\\\-25.19531\\\\297.4125\\\\313.01\\\\-22.85156\\\\297.3879\\\\313.01\\\\-20.50781\\\\297.0121\\\\313.01\\\\-18.16406\\\\297.3299\\\\313.01\\\\-15.82031\\\\297.1454\\\\313.01\\\\-11.13281\\\\297.2468\\\\313.01\\\\-8.789063\\\\296.9557\\\\313.01\\\\-6.445313\\\\297.4125\\\\313.01\\\\-4.101563\\\\296.9731\\\\313.01\\\\2.929688\\\\296.9191\\\\313.01\\\\5.273438\\\\297.0809\\\\313.01\\\\7.617188\\\\296.8877\\\\313.01\\\\12.30469\\\\296.8055\\\\313.01\\\\16.99219\\\\296.837\\\\313.01\\\\21.67969\\\\296.8058\\\\313.01\\\\31.05469\\\\296.8159\\\\313.01\\\\35.74219\\\\296.7436\\\\313.01\\\\40.42969\\\\296.7743\\\\313.01\\\\47.46094\\\\296.734\\\\313.01\\\\52.14844\\\\296.6724\\\\313.01\\\\61.52344\\\\296.6635\\\\313.01\\\\66.21094\\\\296.5942\\\\313.01\\\\73.24219\\\\296.5901\\\\313.01\\\\80.27344\\\\296.5284\\\\313.01\\\\82.61719\\\\296.5569\\\\313.01\\\\87.30469\\\\296.4947\\\\313.01\\\\91.99219\\\\296.5134\\\\313.01\\\\96.67969\\\\296.473\\\\313.01\\\\115.4297\\\\296.3986\\\\313.01\\\\134.1797\\\\296.2873\\\\313.01\\\\136.5234\\\\295.9046\\\\313.01\\\\138.8672\\\\295.9102\\\\313.01\\\\141.2109\\\\296.0271\\\\313.01\\\\143.5547\\\\295.8654\\\\313.01\\\\148.2422\\\\295.864\\\\313.01\\\\159.9609\\\\295.7849\\\\313.01\\\\164.6484\\\\295.6819\\\\313.01\\\\169.3359\\\\295.6998\\\\313.01\\\\178.7109\\\\295.6638\\\\313.01\\\\188.0859\\\\295.5742\\\\313.01\\\\192.7734\\\\295.5916\\\\313.01\\\\197.4609\\\\295.8172\\\\313.01\\\\199.8047\\\\295.8012\\\\313.01\\\\202.1484\\\\295.6998\\\\313.01\\\\204.4922\\\\295.4287\\\\313.01\\\\206.8359\\\\294.8307\\\\313.01\\\\209.1797\\\\294.3768\\\\313.01\\\\211.5234\\\\292.4688\\\\313.01\\\\213.8672\\\\291.1765\\\\313.01\\\\216.2109\\\\289.627\\\\313.01\\\\217.2822\\\\288.6234\\\\313.01\\\\219.371\\\\286.2797\\\\313.01\\\\221.7773\\\\283.9359\\\\313.01\\\\225.5859\\\\279.9482\\\\313.01\\\\228.6426\\\\276.9047\\\\313.01\\\\230.2734\\\\275.138\\\\313.01\\\\233.135\\\\272.2172\\\\313.01\\\\235.3423\\\\269.8734\\\\313.01\\\\237.73\\\\267.5297\\\\313.01\\\\239.6484\\\\265.4964\\\\313.01\\\\246.9323\\\\258.1547\\\\313.01\\\\251.4581\\\\253.4672\\\\313.01\\\\256.0547\\\\248.1981\\\\313.01\\\\257.454\\\\246.4359\\\\313.01\\\\259.6265\\\\244.0922\\\\313.01\\\\261.2413\\\\239.4047\\\\313.01\\\\260.4736\\\\237.0609\\\\313.01\\\\259.4369\\\\234.7172\\\\313.01\\\\258.3984\\\\233.723\\\\313.01\\\\256.0547\\\\233.1051\\\\313.01\\\\253.7109\\\\232.7947\\\\313.01\\\\249.0234\\\\232.8704\\\\313.01\\\\244.3359\\\\232.8072\\\\313.01\\\\239.6484\\\\233.0207\\\\313.01\\\\237.3047\\\\233.0007\\\\313.01\\\\232.6172\\\\233.0726\\\\313.01\\\\227.9297\\\\233.0305\\\\313.01\\\\216.2109\\\\233.0632\\\\313.01\\\\206.8359\\\\233.0207\\\\313.01\\\\204.4922\\\\232.7456\\\\313.01\\\\202.1484\\\\232.6745\\\\313.01\\\\197.4609\\\\232.7322\\\\313.01\\\\192.7734\\\\232.7456\\\\313.01\\\\188.0859\\\\232.7048\\\\313.01\\\\178.7109\\\\232.7588\\\\313.01\\\\174.0234\\\\232.7322\\\\313.01\\\\166.9922\\\\232.7456\\\\313.01\\\\162.3047\\\\232.7848\\\\313.01\\\\157.6172\\\\232.7746\\\\313.01\\\\148.2422\\\\232.8003\\\\313.01\\\\143.5547\\\\232.7746\\\\313.01\\\\141.2109\\\\232.6908\\\\313.01\\\\134.1797\\\\232.6329\\\\313.01\\\\131.8359\\\\232.0401\\\\313.01\\\\129.4922\\\\231.6858\\\\313.01\\\\127.1484\\\\231.6664\\\\313.01\\\\120.1172\\\\231.7875\\\\313.01\\\\117.7734\\\\232.6329\\\\313.01\\\\110.7422\\\\232.6623\\\\313.01\\\\108.3984\\\\231.8903\\\\313.01\\\\106.0547\\\\231.6022\\\\313.01\\\\103.7109\\\\231.5567\\\\313.01\\\\102.832\\\\232.3734\\\\313.01\\\\101.3672\\\\233.1221\\\\313.01\\\\94.33594\\\\233.1042\\\\313.01\\\\87.30469\\\\233.1397\\\\313.01\\\\82.61719\\\\233.1132\\\\313.01\\\\77.92969\\\\233.1397\\\\313.01\\\\59.17969\\\\233.1568\\\\313.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"374\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.1132\\\\316.01\\\\-34.57031\\\\233.1132\\\\316.01\\\\-39.25781\\\\233.1568\\\\316.01\\\\-41.60156\\\\233.131\\\\316.01\\\\-50.97656\\\\233.1818\\\\316.01\\\\-55.66406\\\\233.1652\\\\316.01\\\\-60.35156\\\\233.2393\\\\316.01\\\\-62.69531\\\\233.1818\\\\316.01\\\\-65.03906\\\\232.7048\\\\316.01\\\\-67.38281\\\\232.8967\\\\316.01\\\\-72.07031\\\\233.0145\\\\316.01\\\\-81.44531\\\\233.0479\\\\316.01\\\\-86.13281\\\\233.0382\\\\316.01\\\\-95.50781\\\\233.0951\\\\316.01\\\\-97.85156\\\\233.3265\\\\316.01\\\\-100.1953\\\\233.9981\\\\316.01\\\\-102.5391\\\\234.0805\\\\316.01\\\\-107.2266\\\\234.0231\\\\316.01\\\\-111.9141\\\\234.0891\\\\316.01\\\\-114.2578\\\\234.0411\\\\316.01\\\\-121.2891\\\\234.054\\\\316.01\\\\-123.6328\\\\234.1127\\\\316.01\\\\-130.6641\\\\234.0672\\\\316.01\\\\-133.0078\\\\234.1127\\\\316.01\\\\-142.3828\\\\234.1741\\\\316.01\\\\-147.0703\\\\234.1174\\\\316.01\\\\-151.7578\\\\234.1127\\\\316.01\\\\-161.1328\\\\234.0263\\\\316.01\\\\-165.8203\\\\234.0387\\\\316.01\\\\-168.1641\\\\234.1894\\\\316.01\\\\-170.5078\\\\234.2503\\\\316.01\\\\-175.1953\\\\234.2073\\\\316.01\\\\-186.9141\\\\234.2539\\\\316.01\\\\-189.2578\\\\234.2112\\\\316.01\\\\-193.9453\\\\234.2289\\\\316.01\\\\-200.9766\\\\234.3204\\\\316.01\\\\-205.6641\\\\234.1916\\\\316.01\\\\-212.6953\\\\234.3573\\\\316.01\\\\-222.0703\\\\234.4053\\\\316.01\\\\-226.7578\\\\234.3731\\\\316.01\\\\-233.7891\\\\234.2125\\\\316.01\\\\-238.4766\\\\234.226\\\\316.01\\\\-243.1641\\\\234.1068\\\\316.01\\\\-247.8516\\\\233.8141\\\\316.01\\\\-250.1953\\\\233.8749\\\\316.01\\\\-254.8828\\\\234.2268\\\\316.01\\\\-257.2266\\\\234.5565\\\\316.01\\\\-259.5703\\\\235.9516\\\\316.01\\\\-260.9418\\\\237.0609\\\\316.01\\\\-262.8647\\\\239.4047\\\\316.01\\\\-263.0318\\\\241.7484\\\\316.01\\\\-262.4791\\\\244.0922\\\\316.01\\\\-261.0516\\\\246.4359\\\\316.01\\\\-259.5703\\\\248.5972\\\\316.01\\\\-257.2266\\\\251.3685\\\\316.01\\\\-255.6122\\\\253.4672\\\\316.01\\\\-252.5391\\\\256.6377\\\\316.01\\\\-250.1953\\\\258.9164\\\\316.01\\\\-247.8516\\\\261.4313\\\\316.01\\\\-245.5078\\\\263.6035\\\\316.01\\\\-244.1\\\\265.1859\\\\316.01\\\\-241.649\\\\267.5297\\\\316.01\\\\-239.4557\\\\269.8734\\\\316.01\\\\-233.7891\\\\275.4139\\\\316.01\\\\-231.4453\\\\277.8628\\\\316.01\\\\-229.1016\\\\280.0036\\\\316.01\\\\-226.7578\\\\282.5439\\\\316.01\\\\-225.1864\\\\283.9359\\\\316.01\\\\-222.0703\\\\287.2355\\\\316.01\\\\-220.5764\\\\288.6234\\\\316.01\\\\-218.3692\\\\290.9672\\\\316.01\\\\-214.9922\\\\293.3109\\\\316.01\\\\-212.6953\\\\294.6526\\\\316.01\\\\-210.3516\\\\295.3416\\\\316.01\\\\-208.0078\\\\296.4756\\\\316.01\\\\-205.6641\\\\296.892\\\\316.01\\\\-203.3203\\\\297.1563\\\\316.01\\\\-196.2891\\\\297.1297\\\\316.01\\\\-193.9453\\\\297.0023\\\\316.01\\\\-184.5703\\\\296.9636\\\\316.01\\\\-177.5391\\\\296.8925\\\\316.01\\\\-172.8516\\\\296.9032\\\\316.01\\\\-168.1641\\\\296.8568\\\\316.01\\\\-163.4766\\\\296.8895\\\\316.01\\\\-156.4453\\\\296.8506\\\\316.01\\\\-147.0703\\\\296.8921\\\\316.01\\\\-144.7266\\\\296.8517\\\\316.01\\\\-125.9766\\\\296.9402\\\\316.01\\\\-121.2891\\\\296.8887\\\\316.01\\\\-118.9453\\\\296.9077\\\\316.01\\\\-111.9141\\\\296.8723\\\\316.01\\\\-102.5391\\\\296.9016\\\\316.01\\\\-95.50781\\\\296.8837\\\\316.01\\\\-88.47656\\\\296.9322\\\\316.01\\\\-83.78906\\\\296.9234\\\\316.01\\\\-67.38281\\\\296.9841\\\\316.01\\\\-65.03906\\\\297.1698\\\\316.01\\\\-62.69531\\\\296.9377\\\\316.01\\\\-58.00781\\\\296.9377\\\\316.01\\\\-55.66406\\\\297.2922\\\\316.01\\\\-53.32031\\\\297.2468\\\\316.01\\\\-50.97656\\\\296.9396\\\\316.01\\\\-48.63281\\\\297.1798\\\\316.01\\\\-46.28906\\\\296.9579\\\\316.01\\\\-43.94531\\\\297.1687\\\\316.01\\\\-41.60156\\\\296.9285\\\\316.01\\\\-39.25781\\\\297.2089\\\\316.01\\\\-36.91406\\\\296.9303\\\\316.01\\\\-34.57031\\\\296.9396\\\\316.01\\\\-32.22656\\\\297.1373\\\\316.01\\\\-29.88281\\\\297.4229\\\\316.01\\\\-27.53906\\\\296.9396\\\\316.01\\\\-25.19531\\\\296.9954\\\\316.01\\\\-22.85156\\\\297.3383\\\\316.01\\\\-20.50781\\\\296.9358\\\\316.01\\\\-18.16406\\\\296.9467\\\\316.01\\\\-15.82031\\\\297.1454\\\\316.01\\\\-13.47656\\\\297.0061\\\\316.01\\\\-11.13281\\\\297.2089\\\\316.01\\\\-8.789063\\\\296.9067\\\\316.01\\\\-6.445313\\\\297.1687\\\\316.01\\\\-4.101563\\\\296.9358\\\\316.01\\\\-1.757813\\\\297.2875\\\\316.01\\\\0.5859375\\\\296.9081\\\\316.01\\\\7.617188\\\\296.8985\\\\316.01\\\\12.30469\\\\296.8161\\\\316.01\\\\14.64844\\\\296.8372\\\\316.01\\\\19.33594\\\\296.7743\\\\316.01\\\\21.67969\\\\296.8055\\\\316.01\\\\31.05469\\\\296.7843\\\\316.01\\\\35.74219\\\\296.7247\\\\316.01\\\\40.42969\\\\296.7743\\\\316.01\\\\42.77344\\\\296.7154\\\\316.01\\\\45.11719\\\\296.7546\\\\316.01\\\\49.80469\\\\296.6839\\\\316.01\\\\63.86719\\\\296.6346\\\\316.01\\\\66.21094\\\\296.5862\\\\316.01\\\\75.58594\\\\296.5696\\\\316.01\\\\77.92969\\\\296.5208\\\\316.01\\\\82.61719\\\\296.549\\\\316.01\\\\89.64844\\\\296.4947\\\\316.01\\\\94.33594\\\\296.5005\\\\316.01\\\\96.67969\\\\296.4597\\\\316.01\\\\108.3984\\\\296.4393\\\\316.01\\\\113.0859\\\\296.3846\\\\316.01\\\\120.1172\\\\296.3782\\\\316.01\\\\127.1484\\\\296.308\\\\316.01\\\\134.1797\\\\296.2929\\\\316.01\\\\136.5234\\\\295.9009\\\\316.01\\\\138.8672\\\\295.9433\\\\316.01\\\\148.2422\\\\295.833\\\\316.01\\\\150.5859\\\\295.864\\\\316.01\\\\152.9297\\\\295.8012\\\\316.01\\\\157.6172\\\\295.8012\\\\316.01\\\\166.9922\\\\295.6638\\\\316.01\\\\174.0234\\\\295.6998\\\\316.01\\\\183.3984\\\\295.6093\\\\316.01\\\\192.7734\\\\295.6093\\\\316.01\\\\197.4609\\\\295.8012\\\\316.01\\\\202.1484\\\\295.6998\\\\316.01\\\\204.4922\\\\295.4137\\\\316.01\\\\206.8359\\\\294.8185\\\\316.01\\\\209.1797\\\\294.3768\\\\316.01\\\\211.5234\\\\292.4764\\\\316.01\\\\213.8672\\\\291.1916\\\\316.01\\\\216.2109\\\\289.6328\\\\316.01\\\\217.2822\\\\288.6234\\\\316.01\\\\219.3814\\\\286.2797\\\\316.01\\\\221.8029\\\\283.9359\\\\316.01\\\\225.5859\\\\279.9599\\\\316.01\\\\227.9297\\\\277.6382\\\\316.01\\\\230.2734\\\\275.1772\\\\316.01\\\\233.2298\\\\272.2172\\\\316.01\\\\234.9609\\\\270.3593\\\\316.01\\\\239.6484\\\\265.57\\\\316.01\\\\246.9653\\\\258.1547\\\\316.01\\\\251.4385\\\\253.4672\\\\316.01\\\\256.0547\\\\248.2196\\\\316.01\\\\257.4986\\\\246.4359\\\\316.01\\\\259.7266\\\\244.0922\\\\316.01\\\\260.7422\\\\241.4555\\\\316.01\\\\261.4258\\\\239.4047\\\\316.01\\\\260.7422\\\\237.3192\\\\316.01\\\\259.477\\\\234.7172\\\\316.01\\\\258.3984\\\\233.6994\\\\316.01\\\\256.0547\\\\233.0592\\\\316.01\\\\253.7109\\\\232.7025\\\\316.01\\\\251.3672\\\\232.81\\\\316.01\\\\246.6797\\\\232.7563\\\\316.01\\\\241.9922\\\\232.9906\\\\316.01\\\\237.3047\\\\233.0007\\\\316.01\\\\232.6172\\\\233.0632\\\\316.01\\\\227.9297\\\\233.0305\\\\316.01\\\\211.5234\\\\233.0537\\\\316.01\\\\206.8359\\\\233.0245\\\\316.01\\\\204.4922\\\\232.7588\\\\316.01\\\\202.1484\\\\232.6623\\\\316.01\\\\195.1172\\\\232.7186\\\\316.01\\\\188.0859\\\\232.7186\\\\316.01\\\\183.3984\\\\232.7719\\\\316.01\\\\181.0547\\\\232.7322\\\\316.01\\\\169.3359\\\\232.7588\\\\316.01\\\\166.9922\\\\232.7322\\\\316.01\\\\157.6172\\\\232.7875\\\\316.01\\\\152.9297\\\\232.7456\\\\316.01\\\\145.8984\\\\232.7875\\\\316.01\\\\141.2109\\\\232.6623\\\\316.01\\\\136.5234\\\\232.6329\\\\316.01\\\\134.1797\\\\232.0805\\\\316.01\\\\131.8359\\\\231.7245\\\\316.01\\\\127.1484\\\\231.6801\\\\316.01\\\\122.4609\\\\231.7572\\\\316.01\\\\120.1172\\\\232.5873\\\\316.01\\\\115.4297\\\\232.6908\\\\316.01\\\\110.7422\\\\232.6623\\\\316.01\\\\108.3984\\\\231.8903\\\\316.01\\\\106.0547\\\\231.6087\\\\316.01\\\\103.7109\\\\231.5483\\\\316.01\\\\102.8224\\\\232.3734\\\\316.01\\\\101.3672\\\\233.1132\\\\316.01\\\\99.02344\\\\233.1397\\\\316.01\\\\80.27344\\\\233.1132\\\\316.01\\\\68.55469\\\\233.1568\\\\316.01\\\\52.14844\\\\233.1483\\\\316.01\\\\45.11719\\\\233.1132\\\\316.01\\\\44.13628\\\\232.3734\\\\316.01\\\\42.77344\\\\231.0686\\\\316.01\\\\42.00247\\\\230.0297\\\\316.01\\\\42.77344\\\\229.1926\\\\316.01\\\\45.11719\\\\228.465\\\\316.01\\\\47.46094\\\\226.9633\\\\316.01\\\\49.80469\\\\225.8906\\\\316.01\\\\52.14844\\\\224.4715\\\\316.01\\\\54.49219\\\\223.5304\\\\316.01\\\\55.10944\\\\222.9984\\\\316.01\\\\59.17969\\\\220.0478\\\\316.01\\\\61.52344\\\\218.6274\\\\316.01\\\\64.72018\\\\215.9672\\\\316.01\\\\66.21094\\\\214.8258\\\\316.01\\\\70.89844\\\\210.3064\\\\316.01\\\\72.20967\\\\208.9359\\\\316.01\\\\76.32568\\\\204.2484\\\\316.01\\\\77.88355\\\\201.9047\\\\316.01\\\\81.18286\\\\197.2172\\\\316.01\\\\82.483\\\\194.8734\\\\316.01\\\\83.97971\\\\192.5297\\\\316.01\\\\85.15485\\\\190.1859\\\\316.01\\\\86.11506\\\\187.8422\\\\316.01\\\\88.44123\\\\183.1547\\\\316.01\\\\88.85645\\\\180.8109\\\\316.01\\\\90.57047\\\\176.1234\\\\316.01\\\\91.12964\\\\173.7797\\\\316.01\\\\91.82967\\\\171.4359\\\\316.01\\\\92.67867\\\\169.0922\\\\316.01\\\\93.02273\\\\166.7484\\\\316.01\\\\93.23618\\\\162.0609\\\\316.01\\\\93.4022\\\\157.3734\\\\316.01\\\\93.45381\\\\152.6859\\\\316.01\\\\93.30592\\\\147.9984\\\\316.01\\\\93.08162\\\\143.3109\\\\316.01\\\\92.91119\\\\140.9672\\\\316.01\\\\92.40625\\\\138.6234\\\\316.01\\\\91.51611\\\\136.2797\\\\316.01\\\\90.39767\\\\131.5922\\\\316.01\\\\89.42243\\\\129.2484\\\\316.01\\\\88.71695\\\\126.9047\\\\316.01\\\\88.25335\\\\124.5609\\\\316.01\\\\86.80245\\\\122.2172\\\\316.01\\\\85.8848\\\\119.8734\\\\316.01\\\\84.58316\\\\117.5297\\\\316.01\\\\83.66635\\\\115.1859\\\\316.01\\\\81.8702\\\\112.8422\\\\316.01\\\\80.80811\\\\110.4984\\\\316.01\\\\79.08266\\\\108.1547\\\\316.01\\\\77.10529\\\\105.8109\\\\316.01\\\\75.58594\\\\103.5963\\\\316.01\\\\73.49802\\\\101.1234\\\\316.01\\\\71.40904\\\\98.77969\\\\316.01\\\\68.55469\\\\95.92896\\\\316.01\\\\63.67357\\\\91.74844\\\\316.01\\\\61.52344\\\\90.32737\\\\316.01\\\\59.17969\\\\88.27599\\\\316.01\\\\56.83594\\\\86.7886\\\\316.01\\\\54.49219\\\\85.58972\\\\316.01\\\\52.14844\\\\83.79642\\\\316.01\\\\49.80469\\\\83.02673\\\\316.01\\\\47.46094\\\\81.63853\\\\316.01\\\\45.11719\\\\80.76684\\\\316.01\\\\42.77344\\\\79.30589\\\\316.01\\\\38.08594\\\\78.27902\\\\316.01\\\\35.74219\\\\77.25775\\\\316.01\\\\33.39844\\\\76.59698\\\\316.01\\\\31.05469\\\\76.1613\\\\316.01\\\\28.71094\\\\75.56659\\\\316.01\\\\26.36719\\\\74.74911\\\\316.01\\\\24.02344\\\\74.44027\\\\316.01\\\\14.64844\\\\74.10455\\\\316.01\\\\9.960938\\\\74.14651\\\\316.01\\\\5.273438\\\\74.273\\\\316.01\\\\2.929688\\\\74.39614\\\\316.01\\\\0.5859375\\\\74.68565\\\\316.01\\\\-1.757813\\\\75.2776\\\\316.01\\\\-4.101563\\\\75.97835\\\\316.01\\\\-6.445313\\\\76.42603\\\\316.01\\\\-8.789063\\\\77.04977\\\\316.01\\\\-11.13281\\\\78.0173\\\\316.01\\\\-13.47656\\\\78.67566\\\\316.01\\\\-15.82031\\\\79.13776\\\\316.01\\\\-18.16406\\\\80.56435\\\\316.01\\\\-20.50781\\\\81.50463\\\\316.01\\\\-22.85156\\\\82.9015\\\\316.01\\\\-25.19531\\\\83.68569\\\\316.01\\\\-27.53906\\\\85.50075\\\\316.01\\\\-29.88281\\\\86.57327\\\\316.01\\\\-32.22656\\\\88.24621\\\\316.01\\\\-34.57031\\\\90.17396\\\\316.01\\\\-36.86175\\\\91.74844\\\\316.01\\\\-39.25781\\\\93.66087\\\\316.01\\\\-41.60156\\\\95.69225\\\\316.01\\\\-46.92759\\\\101.1234\\\\316.01\\\\-50.43298\\\\105.8109\\\\316.01\\\\-52.27513\\\\108.1547\\\\316.01\\\\-53.92769\\\\110.4984\\\\316.01\\\\-55.28938\\\\112.8422\\\\316.01\\\\-56.8119\\\\115.1859\\\\316.01\\\\-57.76507\\\\117.5297\\\\316.01\\\\-59.14436\\\\119.8734\\\\316.01\\\\-61.2854\\\\124.5609\\\\316.01\\\\-61.77901\\\\126.9047\\\\316.01\\\\-62.87364\\\\129.2484\\\\316.01\\\\-63.78268\\\\131.5922\\\\316.01\\\\-64.18945\\\\133.9359\\\\316.01\\\\-64.71442\\\\136.2797\\\\316.01\\\\-65.51514\\\\138.6234\\\\316.01\\\\-65.81827\\\\140.9672\\\\316.01\\\\-66.45339\\\\147.9984\\\\316.01\\\\-66.7085\\\\152.6859\\\\316.01\\\\-66.75646\\\\155.0297\\\\316.01\\\\-66.5637\\\\159.7172\\\\316.01\\\\-66.21094\\\\164.4047\\\\316.01\\\\-65.704\\\\169.0922\\\\316.01\\\\-65.23297\\\\171.4359\\\\316.01\\\\-64.38361\\\\173.7797\\\\316.01\\\\-64.01566\\\\176.1234\\\\316.01\\\\-63.38504\\\\178.4672\\\\316.01\\\\-62.17049\\\\180.8109\\\\316.01\\\\-60.82787\\\\185.4984\\\\316.01\\\\-59.41992\\\\187.8422\\\\316.01\\\\-58.36174\\\\190.1859\\\\316.01\\\\-56.99887\\\\192.5297\\\\316.01\\\\-56.07342\\\\194.8734\\\\316.01\\\\-55.66406\\\\195.3297\\\\316.01\\\\-53.32031\\\\198.7587\\\\316.01\\\\-52.68821\\\\199.5609\\\\316.01\\\\-51.4049\\\\201.9047\\\\316.01\\\\-50.97656\\\\202.358\\\\316.01\\\\-47.5612\\\\206.5922\\\\316.01\\\\-45.21313\\\\208.9359\\\\316.01\\\\-43.05138\\\\211.2797\\\\316.01\\\\-39.25781\\\\214.893\\\\316.01\\\\-35.15625\\\\218.3109\\\\316.01\\\\-34.57031\\\\218.8701\\\\316.01\\\\-32.22656\\\\220.1266\\\\316.01\\\\-31.58335\\\\220.6547\\\\316.01\\\\-28.28872\\\\222.9984\\\\316.01\\\\-27.53906\\\\223.6396\\\\316.01\\\\-25.19531\\\\224.5407\\\\316.01\\\\-22.85156\\\\226.027\\\\316.01\\\\-20.50781\\\\227.0401\\\\316.01\\\\-18.16406\\\\228.5211\\\\316.01\\\\-15.82031\\\\229.1818\\\\316.01\\\\-14.99192\\\\230.0297\\\\316.01\\\\-15.82031\\\\231.3521\\\\316.01\\\\-16.89078\\\\232.3734\\\\316.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"371\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"15\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n"; -const char* k_rtStruct_json04 = -" \"Value\" : \"-18.16406\\\\233.1221\\\\319.01\\\\-32.22656\\\\233.131\\\\319.01\\\\-39.25781\\\\233.1568\\\\319.01\\\\-43.94531\\\\233.1397\\\\319.01\\\\-53.32031\\\\233.19\\\\319.01\\\\-58.00781\\\\233.1818\\\\319.01\\\\-60.35156\\\\233.5756\\\\319.01\\\\-62.69531\\\\233.19\\\\319.01\\\\-65.03906\\\\232.9081\\\\319.01\\\\-67.38281\\\\232.8852\\\\319.01\\\\-72.07031\\\\233.0044\\\\319.01\\\\-76.75781\\\\233.0343\\\\319.01\\\\-83.78906\\\\233.0343\\\\319.01\\\\-88.47656\\\\233.0859\\\\319.01\\\\-93.16406\\\\233.0859\\\\319.01\\\\-97.85156\\\\233.1569\\\\319.01\\\\-100.1953\\\\233.8986\\\\319.01\\\\-102.5391\\\\234.0359\\\\319.01\\\\-107.2266\\\\234.0231\\\\319.01\\\\-109.5703\\\\234.0754\\\\319.01\\\\-118.9453\\\\234.0411\\\\319.01\\\\-128.3203\\\\234.1127\\\\319.01\\\\-130.6641\\\\234.054\\\\319.01\\\\-142.3828\\\\234.1407\\\\319.01\\\\-147.0703\\\\234.0855\\\\319.01\\\\-151.7578\\\\234.1127\\\\319.01\\\\-158.7891\\\\234.0387\\\\319.01\\\\-165.8203\\\\234.0513\\\\319.01\\\\-170.5078\\\\234.2214\\\\319.01\\\\-175.1953\\\\234.1797\\\\319.01\\\\-186.9141\\\\234.2012\\\\319.01\\\\-189.2578\\\\234.1743\\\\319.01\\\\-191.6016\\\\234.2431\\\\319.01\\\\-198.6328\\\\234.2326\\\\319.01\\\\-200.9766\\\\234.2902\\\\319.01\\\\-205.6641\\\\234.1916\\\\319.01\\\\-212.6953\\\\234.3084\\\\319.01\\\\-215.0391\\\\234.2967\\\\319.01\\\\-222.0703\\\\234.3891\\\\319.01\\\\-224.4141\\\\234.3115\\\\319.01\\\\-229.1016\\\\234.3573\\\\319.01\\\\-233.7891\\\\234.2125\\\\319.01\\\\-238.4766\\\\234.1954\\\\319.01\\\\-243.1641\\\\234.0555\\\\319.01\\\\-247.8516\\\\233.7286\\\\319.01\\\\-250.1953\\\\233.7565\\\\319.01\\\\-252.5391\\\\233.9759\\\\319.01\\\\-257.2266\\\\234.7266\\\\319.01\\\\-259.5703\\\\235.9456\\\\319.01\\\\-260.9676\\\\237.0609\\\\319.01\\\\-262.9079\\\\239.4047\\\\319.01\\\\-263.0764\\\\241.7484\\\\319.01\\\\-262.579\\\\244.0922\\\\319.01\\\\-261.0551\\\\246.4359\\\\319.01\\\\-259.5703\\\\248.578\\\\319.01\\\\-257.2266\\\\251.3205\\\\319.01\\\\-255.5183\\\\253.4672\\\\319.01\\\\-252.5391\\\\256.6434\\\\319.01\\\\-250.1953\\\\258.9331\\\\319.01\\\\-247.8516\\\\261.4281\\\\319.01\\\\-245.5078\\\\263.6319\\\\319.01\\\\-244.1062\\\\265.1859\\\\319.01\\\\-241.6212\\\\267.5297\\\\319.01\\\\-239.4403\\\\269.8734\\\\319.01\\\\-233.7891\\\\275.424\\\\319.01\\\\-231.4453\\\\277.8534\\\\319.01\\\\-229.1016\\\\280.0498\\\\319.01\\\\-226.7578\\\\282.5503\\\\319.01\\\\-225.1923\\\\283.9359\\\\319.01\\\\-222.0703\\\\287.2521\\\\319.01\\\\-220.5829\\\\288.6234\\\\319.01\\\\-218.3594\\\\290.9672\\\\319.01\\\\-214.9922\\\\293.3109\\\\319.01\\\\-212.6953\\\\294.6526\\\\319.01\\\\-210.3516\\\\295.3282\\\\319.01\\\\-208.0078\\\\296.4917\\\\319.01\\\\-205.6641\\\\296.899\\\\319.01\\\\-203.3203\\\\297.1488\\\\319.01\\\\-196.2891\\\\297.1047\\\\319.01\\\\-193.9453\\\\296.9722\\\\319.01\\\\-184.5703\\\\296.9529\\\\319.01\\\\-177.5391\\\\296.8713\\\\319.01\\\\-163.4766\\\\296.8895\\\\319.01\\\\-144.7266\\\\296.8434\\\\319.01\\\\-135.3516\\\\296.8869\\\\319.01\\\\-133.0078\\\\296.8697\\\\319.01\\\\-116.6016\\\\296.916\\\\319.01\\\\-111.9141\\\\296.8811\\\\319.01\\\\-102.5391\\\\296.8641\\\\319.01\\\\-93.16406\\\\296.8746\\\\319.01\\\\-88.47656\\\\296.913\\\\319.01\\\\-81.44531\\\\296.8949\\\\319.01\\\\-79.10156\\\\296.9358\\\\319.01\\\\-67.38281\\\\296.9535\\\\319.01\\\\-65.03906\\\\296.9872\\\\319.01\\\\-62.69531\\\\296.9267\\\\319.01\\\\-58.00781\\\\296.9175\\\\319.01\\\\-55.66406\\\\297.0091\\\\319.01\\\\-50.97656\\\\296.9267\\\\319.01\\\\-46.28906\\\\296.9447\\\\319.01\\\\-43.94531\\\\297.0627\\\\319.01\\\\-41.60156\\\\296.8867\\\\319.01\\\\-36.91406\\\\296.8877\\\\319.01\\\\-32.22656\\\\296.9557\\\\319.01\\\\-29.88281\\\\297.2089\\\\319.01\\\\-27.53906\\\\296.9067\\\\319.01\\\\-22.85156\\\\296.998\\\\319.01\\\\-20.50781\\\\296.916\\\\319.01\\\\-15.82031\\\\297.0405\\\\319.01\\\\-13.47656\\\\296.9622\\\\319.01\\\\-11.13281\\\\296.9926\\\\319.01\\\\-8.789063\\\\296.9081\\\\319.01\\\\-4.101563\\\\296.9447\\\\319.01\\\\-1.757813\\\\297.0516\\\\319.01\\\\0.5859375\\\\296.8877\\\\319.01\\\\7.617188\\\\296.8888\\\\319.01\\\\16.99219\\\\296.8369\\\\319.01\\\\19.33594\\\\296.7851\\\\319.01\\\\28.71094\\\\296.7743\\\\319.01\\\\35.74219\\\\296.7043\\\\319.01\\\\45.11719\\\\296.7229\\\\319.01\\\\56.83594\\\\296.6313\\\\319.01\\\\63.86719\\\\296.6228\\\\319.01\\\\73.24219\\\\296.5616\\\\319.01\\\\75.58594\\\\296.5859\\\\319.01\\\\77.92969\\\\296.5154\\\\319.01\\\\91.99219\\\\296.5208\\\\319.01\\\\96.67969\\\\296.4597\\\\319.01\\\\101.3672\\\\296.4668\\\\319.01\\\\106.0547\\\\296.4124\\\\319.01\\\\108.3984\\\\296.4393\\\\319.01\\\\117.7734\\\\296.3922\\\\319.01\\\\122.4609\\\\296.391\\\\319.01\\\\127.1484\\\\296.3229\\\\319.01\\\\134.1797\\\\296.2817\\\\319.01\\\\136.5234\\\\295.884\\\\319.01\\\\138.8672\\\\296.2261\\\\319.01\\\\141.2109\\\\296.1486\\\\319.01\\\\145.8984\\\\295.864\\\\319.01\\\\152.9297\\\\295.833\\\\319.01\\\\155.2734\\\\295.7849\\\\319.01\\\\162.3047\\\\295.7849\\\\319.01\\\\164.6484\\\\295.7346\\\\319.01\\\\176.3672\\\\295.6638\\\\319.01\\\\183.3984\\\\295.6454\\\\319.01\\\\188.0859\\\\295.5916\\\\319.01\\\\192.7734\\\\295.6093\\\\319.01\\\\197.4609\\\\295.8172\\\\319.01\\\\202.1484\\\\295.7173\\\\319.01\\\\204.4922\\\\295.3989\\\\319.01\\\\206.8359\\\\294.803\\\\319.01\\\\209.1797\\\\294.3707\\\\319.01\\\\211.5234\\\\292.4764\\\\319.01\\\\213.8672\\\\291.2065\\\\319.01\\\\216.2109\\\\289.6522\\\\319.01\\\\217.2899\\\\288.6234\\\\319.01\\\\218.5547\\\\287.1418\\\\319.01\\\\221.8375\\\\283.9359\\\\319.01\\\\225.5859\\\\279.9363\\\\319.01\\\\227.9297\\\\277.6265\\\\319.01\\\\230.2734\\\\275.1683\\\\319.01\\\\233.3338\\\\272.2172\\\\319.01\\\\234.9609\\\\270.4222\\\\319.01\\\\244.3359\\\\260.8793\\\\319.01\\\\249.0234\\\\255.926\\\\319.01\\\\251.398\\\\253.4672\\\\319.01\\\\256.0547\\\\248.2237\\\\319.01\\\\257.5125\\\\246.4359\\\\319.01\\\\259.786\\\\244.0922\\\\319.01\\\\260.7422\\\\241.626\\\\319.01\\\\261.5214\\\\239.4047\\\\319.01\\\\260.7422\\\\237.1834\\\\319.01\\\\259.4941\\\\234.7172\\\\319.01\\\\258.3984\\\\233.6884\\\\319.01\\\\256.0547\\\\233.0498\\\\319.01\\\\253.7109\\\\232.7848\\\\319.01\\\\251.3672\\\\233.0989\\\\319.01\\\\249.0234\\\\232.8375\\\\319.01\\\\246.6797\\\\232.7692\\\\319.01\\\\241.9922\\\\233.0207\\\\319.01\\\\237.3047\\\\233.0108\\\\319.01\\\\232.6172\\\\233.0819\\\\319.01\\\\227.9297\\\\233.0402\\\\319.01\\\\211.5234\\\\233.0819\\\\319.01\\\\206.8359\\\\233.0245\\\\319.01\\\\204.4922\\\\232.7975\\\\319.01\\\\202.1484\\\\232.6767\\\\319.01\\\\199.8047\\\\232.6623\\\\319.01\\\\190.4297\\\\232.7588\\\\319.01\\\\185.7422\\\\232.7848\\\\319.01\\\\181.0547\\\\232.7588\\\\319.01\\\\169.3359\\\\232.7588\\\\319.01\\\\166.9922\\\\232.7048\\\\319.01\\\\159.9609\\\\232.7719\\\\319.01\\\\152.9297\\\\232.7346\\\\319.01\\\\148.2422\\\\232.7875\\\\319.01\\\\143.5547\\\\232.7481\\\\319.01\\\\138.8672\\\\232.5056\\\\319.01\\\\136.5234\\\\232.5056\\\\319.01\\\\134.1797\\\\232.0429\\\\319.01\\\\131.8359\\\\231.7224\\\\319.01\\\\129.4922\\\\231.6882\\\\319.01\\\\122.4609\\\\231.7224\\\\319.01\\\\120.1172\\\\232.6179\\\\319.01\\\\117.7734\\\\232.6767\\\\319.01\\\\113.0859\\\\232.6767\\\\319.01\\\\110.7422\\\\232.5557\\\\319.01\\\\108.3984\\\\231.8031\\\\319.01\\\\106.0547\\\\231.589\\\\319.01\\\\103.7109\\\\231.5244\\\\319.01\\\\102.7966\\\\232.3734\\\\319.01\\\\101.3672\\\\233.1042\\\\319.01\\\\96.67969\\\\233.131\\\\319.01\\\\89.64844\\\\233.1221\\\\319.01\\\\75.58594\\\\233.1483\\\\319.01\\\\70.89844\\\\233.1042\\\\319.01\\\\66.21094\\\\233.1652\\\\319.01\\\\56.83594\\\\233.131\\\\319.01\\\\52.14844\\\\233.1397\\\\319.01\\\\45.11719\\\\233.1042\\\\319.01\\\\44.14645\\\\232.3734\\\\319.01\\\\42.77344\\\\231.0593\\\\319.01\\\\42.01079\\\\230.0297\\\\319.01\\\\42.77344\\\\229.2013\\\\319.01\\\\45.11719\\\\228.447\\\\319.01\\\\47.46094\\\\226.9284\\\\319.01\\\\49.80469\\\\225.886\\\\319.01\\\\52.14844\\\\224.4503\\\\319.01\\\\54.49219\\\\223.4528\\\\319.01\\\\55.01404\\\\222.9984\\\\319.01\\\\59.17969\\\\220.0237\\\\319.01\\\\61.52344\\\\218.6082\\\\319.01\\\\64.67848\\\\215.9672\\\\319.01\\\\66.21094\\\\214.8015\\\\319.01\\\\70.89844\\\\210.2358\\\\319.01\\\\72.148\\\\208.9359\\\\319.01\\\\76.26517\\\\204.2484\\\\319.01\\\\77.81339\\\\201.9047\\\\319.01\\\\81.15081\\\\197.2172\\\\319.01\\\\82.41605\\\\194.8734\\\\319.01\\\\83.95089\\\\192.5297\\\\319.01\\\\85.09115\\\\190.1859\\\\319.01\\\\86.09138\\\\187.8422\\\\319.01\\\\88.39328\\\\183.1547\\\\319.01\\\\88.81863\\\\180.8109\\\\319.01\\\\90.54276\\\\176.1234\\\\319.01\\\\91.10133\\\\173.7797\\\\319.01\\\\91.76778\\\\171.4359\\\\319.01\\\\92.65485\\\\169.0922\\\\319.01\\\\92.99918\\\\166.7484\\\\319.01\\\\93.21165\\\\162.0609\\\\319.01\\\\93.36247\\\\157.3734\\\\319.01\\\\93.37488\\\\152.6859\\\\319.01\\\\93.27335\\\\147.9984\\\\319.01\\\\93.05807\\\\143.3109\\\\319.01\\\\92.86326\\\\140.9672\\\\319.01\\\\92.33733\\\\138.6234\\\\319.01\\\\91.43783\\\\136.2797\\\\319.01\\\\90.94626\\\\133.9359\\\\319.01\\\\90.36204\\\\131.5922\\\\319.01\\\\89.36162\\\\129.2484\\\\319.01\\\\88.68583\\\\126.9047\\\\319.01\\\\88.21825\\\\124.5609\\\\319.01\\\\86.72572\\\\122.2172\\\\319.01\\\\85.8493\\\\119.8734\\\\319.01\\\\84.53275\\\\117.5297\\\\319.01\\\\83.62613\\\\115.1859\\\\319.01\\\\81.8292\\\\112.8422\\\\319.01\\\\80.77354\\\\110.4984\\\\319.01\\\\79.05143\\\\108.1547\\\\319.01\\\\77.04742\\\\105.8109\\\\319.01\\\\75.58594\\\\103.674\\\\319.01\\\\73.4361\\\\101.1234\\\\319.01\\\\71.3485\\\\98.77969\\\\319.01\\\\68.55469\\\\95.97556\\\\319.01\\\\63.59904\\\\91.74844\\\\319.01\\\\61.52344\\\\90.34084\\\\319.01\\\\59.17969\\\\88.31962\\\\319.01\\\\56.83594\\\\86.83331\\\\319.01\\\\54.49219\\\\85.63074\\\\319.01\\\\52.14844\\\\83.82526\\\\319.01\\\\49.80469\\\\83.06862\\\\319.01\\\\47.46094\\\\81.65692\\\\319.01\\\\45.11719\\\\80.79234\\\\319.01\\\\42.77344\\\\79.31967\\\\319.01\\\\38.08594\\\\78.27902\\\\319.01\\\\35.74219\\\\77.28263\\\\319.01\\\\33.39844\\\\76.61404\\\\319.01\\\\31.05469\\\\76.1767\\\\319.01\\\\28.71094\\\\75.56659\\\\319.01\\\\26.36719\\\\74.77422\\\\319.01\\\\24.02344\\\\74.45255\\\\319.01\\\\14.64844\\\\74.10455\\\\319.01\\\\12.30469\\\\74.10455\\\\319.01\\\\5.273438\\\\74.26746\\\\319.01\\\\2.929688\\\\74.40346\\\\319.01\\\\0.5859375\\\\74.73805\\\\319.01\\\\-4.101563\\\\75.99764\\\\319.01\\\\-6.445313\\\\76.4192\\\\319.01\\\\-8.789063\\\\77.021\\\\319.01\\\\-11.13281\\\\78.0173\\\\319.01\\\\-13.47656\\\\78.67566\\\\319.01\\\\-15.82031\\\\79.11396\\\\319.01\\\\-18.16406\\\\80.51486\\\\319.01\\\\-20.50781\\\\81.46942\\\\319.01\\\\-22.85156\\\\82.85554\\\\319.01\\\\-25.19531\\\\83.66675\\\\319.01\\\\-27.53906\\\\85.46803\\\\319.01\\\\-29.88281\\\\86.52827\\\\319.01\\\\-32.22656\\\\88.23955\\\\319.01\\\\-34.57031\\\\90.13984\\\\319.01\\\\-36.9035\\\\91.74844\\\\319.01\\\\-41.60156\\\\95.65716\\\\319.01\\\\-46.9745\\\\101.1234\\\\319.01\\\\-50.48889\\\\105.8109\\\\319.01\\\\-52.30941\\\\108.1547\\\\319.01\\\\-53.97684\\\\110.4984\\\\319.01\\\\-55.34668\\\\112.8422\\\\319.01\\\\-56.83594\\\\115.1859\\\\319.01\\\\-57.84288\\\\117.5297\\\\319.01\\\\-59.17969\\\\119.8734\\\\319.01\\\\-60.35156\\\\122.2895\\\\319.01\\\\-61.30981\\\\124.5609\\\\319.01\\\\-61.83551\\\\126.9047\\\\319.01\\\\-62.94936\\\\129.2484\\\\319.01\\\\-63.81696\\\\131.5922\\\\319.01\\\\-64.21995\\\\133.9359\\\\319.01\\\\-64.78502\\\\136.2797\\\\319.01\\\\-65.56069\\\\138.6234\\\\319.01\\\\-65.84246\\\\140.9672\\\\319.01\\\\-66.49079\\\\147.9984\\\\319.01\\\\-66.73695\\\\152.6859\\\\319.01\\\\-66.80727\\\\155.0297\\\\319.01\\\\-66.62016\\\\159.7172\\\\319.01\\\\-66.24458\\\\164.4047\\\\319.01\\\\-65.7409\\\\169.0922\\\\319.01\\\\-65.32193\\\\171.4359\\\\319.01\\\\-64.43269\\\\173.7797\\\\319.01\\\\-64.03687\\\\176.1234\\\\319.01\\\\-63.43099\\\\178.4672\\\\319.01\\\\-62.2521\\\\180.8109\\\\319.01\\\\-61.52967\\\\183.1547\\\\319.01\\\\-60.90088\\\\185.4984\\\\319.01\\\\-59.4697\\\\187.8422\\\\319.01\\\\-58.42364\\\\190.1859\\\\319.01\\\\-57.02597\\\\192.5297\\\\319.01\\\\-56.12809\\\\194.8734\\\\319.01\\\\-55.66406\\\\195.3972\\\\319.01\\\\-53.32031\\\\198.8418\\\\319.01\\\\-52.73438\\\\199.5609\\\\319.01\\\\-51.45956\\\\201.9047\\\\319.01\\\\-48.63281\\\\205.2587\\\\319.01\\\\-47.59325\\\\206.5922\\\\319.01\\\\-45.25587\\\\208.9359\\\\319.01\\\\-43.11045\\\\211.2797\\\\319.01\\\\-41.60156\\\\212.6377\\\\319.01\\\\-39.25781\\\\214.941\\\\319.01\\\\-35.2231\\\\218.3109\\\\319.01\\\\-34.57031\\\\218.9344\\\\319.01\\\\-32.22656\\\\220.1609\\\\319.01\\\\-31.63622\\\\220.6547\\\\319.01\\\\-28.34042\\\\222.9984\\\\319.01\\\\-27.53906\\\\223.6754\\\\319.01\\\\-25.19531\\\\224.5542\\\\319.01\\\\-22.85156\\\\226.0607\\\\319.01\\\\-20.50781\\\\227.0596\\\\319.01\\\\-18.16406\\\\228.5294\\\\319.01\\\\-15.82031\\\\229.1996\\\\319.01\\\\-15.00954\\\\230.0297\\\\319.01\\\\-15.82031\\\\231.333\\\\319.01\\\\-16.88058\\\\232.3734\\\\319.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"359\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"16\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"101.3672\\\\233.1221\\\\322.01\\\\80.27344\\\\233.131\\\\322.01\\\\75.58594\\\\233.1568\\\\322.01\\\\70.89844\\\\233.131\\\\322.01\\\\61.52344\\\\233.1652\\\\322.01\\\\45.11719\\\\233.1132\\\\322.01\\\\44.12896\\\\232.3734\\\\322.01\\\\42.77344\\\\231.076\\\\322.01\\\\42.00247\\\\230.0297\\\\322.01\\\\42.77344\\\\229.1926\\\\322.01\\\\45.11719\\\\228.4243\\\\322.01\\\\47.46094\\\\226.9242\\\\322.01\\\\49.80469\\\\225.8587\\\\322.01\\\\52.14844\\\\224.4422\\\\322.01\\\\54.49219\\\\223.4268\\\\322.01\\\\54.97742\\\\222.9984\\\\322.01\\\\59.17969\\\\220.0136\\\\322.01\\\\61.52344\\\\218.5471\\\\322.01\\\\64.65119\\\\215.9672\\\\322.01\\\\66.21094\\\\214.7764\\\\322.01\\\\70.89844\\\\210.1964\\\\322.01\\\\72.1096\\\\208.9359\\\\322.01\\\\76.2437\\\\204.2484\\\\322.01\\\\77.92969\\\\201.7078\\\\322.01\\\\81.11842\\\\197.2172\\\\322.01\\\\82.30748\\\\194.8734\\\\322.01\\\\82.61719\\\\194.5523\\\\322.01\\\\83.92992\\\\192.5297\\\\322.01\\\\85.04084\\\\190.1859\\\\322.01\\\\87.1582\\\\185.4984\\\\322.01\\\\88.36839\\\\183.1547\\\\322.01\\\\88.7899\\\\180.8109\\\\322.01\\\\89.56792\\\\178.4672\\\\322.01\\\\90.50697\\\\176.1234\\\\322.01\\\\91.68128\\\\171.4359\\\\322.01\\\\92.59956\\\\169.0922\\\\322.01\\\\92.97371\\\\166.7484\\\\322.01\\\\93.0934\\\\164.4047\\\\322.01\\\\93.33585\\\\157.3734\\\\322.01\\\\93.34813\\\\152.6859\\\\322.01\\\\93.22983\\\\147.9984\\\\322.01\\\\93.04629\\\\143.3109\\\\322.01\\\\92.83467\\\\140.9672\\\\322.01\\\\92.2954\\\\138.6234\\\\322.01\\\\91.39597\\\\136.2797\\\\322.01\\\\90.90752\\\\133.9359\\\\322.01\\\\90.32093\\\\131.5922\\\\322.01\\\\89.30564\\\\129.2484\\\\322.01\\\\88.67188\\\\126.9047\\\\322.01\\\\88.16579\\\\124.5609\\\\322.01\\\\86.67472\\\\122.2172\\\\322.01\\\\85.81149\\\\119.8734\\\\322.01\\\\84.49661\\\\117.5297\\\\322.01\\\\83.58636\\\\115.1859\\\\322.01\\\\81.76791\\\\112.8422\\\\322.01\\\\80.71002\\\\110.4984\\\\322.01\\\\79.01383\\\\108.1547\\\\322.01\\\\77.02567\\\\105.8109\\\\322.01\\\\75.58594\\\\103.7458\\\\322.01\\\\73.38867\\\\101.1234\\\\322.01\\\\71.30643\\\\98.77969\\\\322.01\\\\68.55469\\\\96.01372\\\\322.01\\\\63.52539\\\\91.74844\\\\322.01\\\\61.52344\\\\90.35172\\\\322.01\\\\59.17969\\\\88.35252\\\\322.01\\\\56.83594\\\\86.87999\\\\322.01\\\\54.49219\\\\85.66346\\\\322.01\\\\52.14844\\\\83.84647\\\\322.01\\\\49.80469\\\\83.09609\\\\322.01\\\\47.46094\\\\81.6853\\\\322.01\\\\45.11719\\\\80.80066\\\\322.01\\\\42.77344\\\\79.34901\\\\322.01\\\\38.08594\\\\78.30383\\\\322.01\\\\35.74219\\\\77.32118\\\\322.01\\\\33.39844\\\\76.64365\\\\322.01\\\\31.05469\\\\76.1918\\\\322.01\\\\28.71094\\\\75.59623\\\\322.01\\\\26.36719\\\\74.80752\\\\322.01\\\\24.02344\\\\74.45255\\\\322.01\\\\14.64844\\\\74.12846\\\\322.01\\\\12.30469\\\\74.11021\\\\322.01\\\\5.273438\\\\74.2905\\\\322.01\\\\2.929688\\\\74.40346\\\\322.01\\\\0.5859375\\\\74.73805\\\\322.01\\\\-4.101563\\\\76.01651\\\\322.01\\\\-6.445313\\\\76.43631\\\\322.01\\\\-8.789063\\\\77.04008\\\\322.01\\\\-11.13281\\\\78.04468\\\\322.01\\\\-13.47656\\\\78.69472\\\\322.01\\\\-15.82031\\\\79.13468\\\\322.01\\\\-18.16406\\\\80.51486\\\\322.01\\\\-20.50781\\\\81.47456\\\\322.01\\\\-22.85156\\\\82.85554\\\\322.01\\\\-25.19531\\\\83.68029\\\\322.01\\\\-27.53906\\\\85.48688\\\\322.01\\\\-29.88281\\\\86.53931\\\\322.01\\\\-32.22656\\\\88.25278\\\\322.01\\\\-34.57031\\\\90.1353\\\\322.01\\\\-36.86266\\\\91.74844\\\\322.01\\\\-39.25781\\\\93.66832\\\\322.01\\\\-41.60156\\\\95.6376\\\\322.01\\\\-47.00521\\\\101.1234\\\\322.01\\\\-50.52413\\\\105.8109\\\\322.01\\\\-50.97656\\\\106.3405\\\\322.01\\\\-54.00098\\\\110.4984\\\\322.01\\\\-56.85406\\\\115.1859\\\\322.01\\\\-57.8924\\\\117.5297\\\\322.01\\\\-59.20324\\\\119.8734\\\\322.01\\\\-60.36086\\\\122.2172\\\\322.01\\\\-61.32914\\\\124.5609\\\\322.01\\\\-61.85643\\\\126.9047\\\\322.01\\\\-63.04688\\\\129.2484\\\\322.01\\\\-63.83418\\\\131.5922\\\\322.01\\\\-64.24364\\\\133.9359\\\\322.01\\\\-65.59342\\\\138.6234\\\\322.01\\\\-65.87014\\\\140.9672\\\\322.01\\\\-66.32201\\\\145.6547\\\\322.01\\\\-66.68098\\\\150.3422\\\\322.01\\\\-66.85014\\\\155.0297\\\\322.01\\\\-66.7664\\\\157.3734\\\\322.01\\\\-66.48803\\\\162.0609\\\\322.01\\\\-65.75874\\\\169.0922\\\\322.01\\\\-65.3637\\\\171.4359\\\\322.01\\\\-64.4847\\\\173.7797\\\\322.01\\\\-64.05982\\\\176.1234\\\\322.01\\\\-63.44819\\\\178.4672\\\\322.01\\\\-62.28937\\\\180.8109\\\\322.01\\\\-61.54255\\\\183.1547\\\\322.01\\\\-60.94105\\\\185.4984\\\\322.01\\\\-59.49768\\\\187.8422\\\\322.01\\\\-58.49549\\\\190.1859\\\\322.01\\\\-57.04611\\\\192.5297\\\\322.01\\\\-56.17723\\\\194.8734\\\\322.01\\\\-55.66406\\\\195.4638\\\\322.01\\\\-53.32031\\\\198.8875\\\\322.01\\\\-52.75635\\\\199.5609\\\\322.01\\\\-51.52395\\\\201.9047\\\\322.01\\\\-50.97656\\\\202.4906\\\\322.01\\\\-47.61296\\\\206.5922\\\\322.01\\\\-45.29157\\\\208.9359\\\\322.01\\\\-43.14595\\\\211.2797\\\\322.01\\\\-41.60156\\\\212.6678\\\\322.01\\\\-39.25781\\\\214.9694\\\\322.01\\\\-35.26563\\\\218.3109\\\\322.01\\\\-34.57031\\\\218.971\\\\322.01\\\\-32.22656\\\\220.1965\\\\322.01\\\\-31.68909\\\\220.6547\\\\322.01\\\\-28.39057\\\\222.9984\\\\322.01\\\\-27.53906\\\\223.7158\\\\322.01\\\\-25.19531\\\\224.5815\\\\322.01\\\\-22.85156\\\\226.0936\\\\322.01\\\\-20.50781\\\\227.1104\\\\322.01\\\\-18.16406\\\\228.5341\\\\322.01\\\\-15.82031\\\\229.2136\\\\322.01\\\\-15.0185\\\\230.0297\\\\322.01\\\\-15.82031\\\\231.3232\\\\322.01\\\\-16.88058\\\\232.3734\\\\322.01\\\\-18.16406\\\\233.1221\\\\322.01\\\\-22.85156\\\\233.1483\\\\322.01\\\\-32.22656\\\\233.131\\\\322.01\\\\-34.57031\\\\233.1652\\\\322.01\\\\-41.60156\\\\233.131\\\\322.01\\\\-58.00781\\\\233.1981\\\\322.01\\\\-60.35156\\\\233.6712\\\\322.01\\\\-65.03906\\\\232.6477\\\\322.01\\\\-67.38281\\\\232.8735\\\\322.01\\\\-69.72656\\\\232.9735\\\\322.01\\\\-74.41406\\\\233.0245\\\\322.01\\\\-86.13281\\\\233.0479\\\\322.01\\\\-88.47656\\\\233.0859\\\\322.01\\\\-95.50781\\\\233.0951\\\\322.01\\\\-97.85156\\\\233.2679\\\\322.01\\\\-100.1953\\\\233.9446\\\\322.01\\\\-102.5391\\\\233.6928\\\\322.01\\\\-104.8828\\\\234.0489\\\\322.01\\\\-107.2266\\\\233.6082\\\\322.01\\\\-109.5703\\\\234.062\\\\322.01\\\\-114.2578\\\\234.0672\\\\322.01\\\\-118.9453\\\\234.0158\\\\322.01\\\\-125.9766\\\\234.1221\\\\322.01\\\\-130.6641\\\\234.0591\\\\322.01\\\\-137.6953\\\\234.1038\\\\322.01\\\\-142.3828\\\\234.1741\\\\322.01\\\\-147.0703\\\\234.1078\\\\322.01\\\\-151.7578\\\\234.1127\\\\322.01\\\\-154.1016\\\\234.0722\\\\322.01\\\\-161.1328\\\\234.0513\\\\322.01\\\\-165.8203\\\\234.0722\\\\322.01\\\\-168.1641\\\\234.1994\\\\322.01\\\\-177.5391\\\\234.2214\\\\322.01\\\\-189.2578\\\\234.1743\\\\322.01\\\\-191.6016\\\\234.2721\\\\322.01\\\\-198.6328\\\\234.2326\\\\322.01\\\\-200.9766\\\\234.2902\\\\322.01\\\\-203.3203\\\\234.205\\\\322.01\\\\-215.0391\\\\234.2967\\\\322.01\\\\-217.3828\\\\234.3573\\\\322.01\\\\-222.0703\\\\234.3917\\\\322.01\\\\-224.4141\\\\234.3447\\\\322.01\\\\-229.1016\\\\234.4078\\\\322.01\\\\-233.7891\\\\234.2125\\\\322.01\\\\-238.4766\\\\234.2088\\\\322.01\\\\-243.1641\\\\234.0441\\\\322.01\\\\-247.8516\\\\233.665\\\\322.01\\\\-250.1953\\\\233.6877\\\\322.01\\\\-252.5391\\\\233.9291\\\\322.01\\\\-257.2266\\\\234.8983\\\\322.01\\\\-259.5703\\\\235.9345\\\\322.01\\\\-260.9983\\\\237.0609\\\\322.01\\\\-262.9464\\\\239.4047\\\\322.01\\\\-263.0954\\\\241.7484\\\\322.01\\\\-262.6598\\\\244.0922\\\\322.01\\\\-261.9141\\\\245.2447\\\\322.01\\\\-259.5703\\\\248.5569\\\\322.01\\\\-257.2266\\\\251.3205\\\\322.01\\\\-255.5536\\\\253.4672\\\\322.01\\\\-252.5391\\\\256.6377\\\\322.01\\\\-250.1953\\\\258.905\\\\322.01\\\\-247.8516\\\\261.4186\\\\322.01\\\\-245.5078\\\\263.615\\\\322.01\\\\-244.0908\\\\265.1859\\\\322.01\\\\-241.6044\\\\267.5297\\\\322.01\\\\-239.4094\\\\269.8734\\\\322.01\\\\-233.7891\\\\275.4182\\\\322.01\\\\-231.4453\\\\277.8469\\\\322.01\\\\-229.1016\\\\280.0557\\\\322.01\\\\-226.7578\\\\282.5473\\\\322.01\\\\-224.4141\\\\284.7202\\\\322.01\\\\-222.0703\\\\287.2521\\\\322.01\\\\-220.5943\\\\288.6234\\\\322.01\\\\-218.3764\\\\290.9672\\\\322.01\\\\-215.0295\\\\293.3109\\\\322.01\\\\-212.6953\\\\294.6526\\\\322.01\\\\-210.3516\\\\295.2914\\\\322.01\\\\-209.9242\\\\295.6547\\\\322.01\\\\-208.0078\\\\296.5075\\\\322.01\\\\-205.6641\\\\296.899\\\\322.01\\\\-203.3203\\\\297.134\\\\322.01\\\\-198.6328\\\\297.1414\\\\322.01\\\\-193.9453\\\\296.9471\\\\322.01\\\\-189.2578\\\\296.9713\\\\322.01\\\\-182.2266\\\\296.9337\\\\322.01\\\\-177.5391\\\\296.8792\\\\322.01\\\\-163.4766\\\\296.8978\\\\322.01\\\\-149.4141\\\\296.8432\\\\322.01\\\\-142.3828\\\\296.886\\\\322.01\\\\-133.0078\\\\296.8703\\\\322.01\\\\-130.6641\\\\296.896\\\\322.01\\\\-121.2891\\\\296.8971\\\\322.01\\\\-114.2578\\\\296.9339\\\\322.01\\\\-111.9141\\\\296.9077\\\\322.01\\\\-95.50781\\\\296.8847\\\\322.01\\\\-90.82031\\\\296.9145\\\\322.01\\\\-81.44531\\\\296.8949\\\\322.01\\\\-74.41406\\\\296.9447\\\\322.01\\\\-65.03906\\\\296.9557\\\\322.01\\\\-60.35156\\\\296.916\\\\322.01\\\\-50.97656\\\\296.9067\\\\322.01\\\\-46.28906\\\\296.9267\\\\322.01\\\\-43.94531\\\\297.0141\\\\322.01\\\\-41.60156\\\\296.8673\\\\322.01\\\\-34.57031\\\\296.9285\\\\322.01\\\\-27.53906\\\\296.9067\\\\322.01\\\\-22.85156\\\\296.9377\\\\322.01\\\\-11.13281\\\\296.9377\\\\322.01\\\\-8.789063\\\\296.9067\\\\322.01\\\\7.617188\\\\296.8877\\\\322.01\\\\14.64844\\\\296.8266\\\\322.01\\\\16.99219\\\\296.847\\\\322.01\\\\24.02344\\\\296.7643\\\\322.01\\\\31.05469\\\\296.7229\\\\322.01\\\\45.11719\\\\296.7229\\\\322.01\\\\49.80469\\\\296.6724\\\\322.01\\\\52.14844\\\\296.6929\\\\322.01\\\\61.52344\\\\296.6191\\\\322.01\\\\73.24219\\\\296.5777\\\\322.01\\\\84.96094\\\\296.5079\\\\322.01\\\\91.99219\\\\296.5208\\\\322.01\\\\96.67969\\\\296.4597\\\\322.01\\\\101.3672\\\\296.4604\\\\322.01\\\\115.4297\\\\296.3846\\\\322.01\\\\122.4609\\\\296.3766\\\\322.01\\\\124.8047\\\\296.3139\\\\322.01\\\\131.8359\\\\296.2987\\\\322.01\\\\134.1797\\\\296.1332\\\\322.01\\\\136.5234\\\\295.85\\\\322.01\\\\138.8672\\\\295.9433\\\\322.01\\\\143.5547\\\\295.8543\\\\322.01\\\\148.2422\\\\295.8486\\\\322.01\\\\157.6172\\\\295.7849\\\\322.01\\\\164.6484\\\\295.6998\\\\322.01\\\\174.0234\\\\295.6454\\\\322.01\\\\183.3984\\\\295.6638\\\\322.01\\\\188.0859\\\\295.5742\\\\322.01\\\\192.7734\\\\295.5916\\\\322.01\\\\197.4609\\\\295.833\\\\322.01\\\\202.1484\\\\295.7346\\\\322.01\\\\204.4922\\\\295.3842\\\\322.01\\\\206.8359\\\\294.8107\\\\322.01\\\\209.1797\\\\294.3828\\\\322.01\\\\211.5234\\\\292.4996\\\\322.01\\\\213.8672\\\\291.1916\\\\322.01\\\\216.2109\\\\289.625\\\\322.01\\\\217.2743\\\\288.6234\\\\322.01\\\\219.3824\\\\286.2797\\\\322.01\\\\221.8496\\\\283.9359\\\\322.01\\\\223.2422\\\\282.3931\\\\322.01\\\\225.5859\\\\279.9482\\\\322.01\\\\227.9297\\\\277.6329\\\\322.01\\\\230.2734\\\\275.1512\\\\322.01\\\\233.3577\\\\272.2172\\\\322.01\\\\234.9609\\\\270.4549\\\\322.01\\\\237.8726\\\\267.5297\\\\322.01\\\\244.3359\\\\260.9081\\\\322.01\\\\246.6797\\\\258.3968\\\\322.01\\\\251.3775\\\\253.4672\\\\322.01\\\\256.0547\\\\248.2237\\\\322.01\\\\257.5039\\\\246.4359\\\\322.01\\\\259.7775\\\\244.0922\\\\322.01\\\\260.7422\\\\241.7324\\\\322.01\\\\261.5918\\\\239.4047\\\\322.01\\\\260.8048\\\\237.0609\\\\322.01\\\\259.4941\\\\234.7172\\\\322.01\\\\258.3984\\\\233.6932\\\\322.01\\\\256.0547\\\\233.0686\\\\322.01\\\\253.7109\\\\232.8224\\\\322.01\\\\251.3672\\\\233.8731\\\\322.01\\\\249.0234\\\\233.2281\\\\322.01\\\\246.6797\\\\232.7947\\\\322.01\\\\241.9922\\\\233.0207\\\\322.01\\\\237.3047\\\\233.0207\\\\322.01\\\\232.6172\\\\233.0726\\\\322.01\\\\227.9297\\\\233.0305\\\\322.01\\\\218.5547\\\\233.0498\\\\322.01\\\\211.5234\\\\233.091\\\\322.01\\\\206.8359\\\\233.0245\\\\322.01\\\\202.1484\\\\232.6623\\\\322.01\\\\190.4297\\\\232.7588\\\\322.01\\\\174.0234\\\\232.7588\\\\322.01\\\\171.6797\\\\232.7719\\\\322.01\\\\164.6484\\\\232.7048\\\\322.01\\\\159.9609\\\\232.7588\\\\322.01\\\\152.9297\\\\232.7481\\\\322.01\\\\148.2422\\\\232.7875\\\\322.01\\\\143.5547\\\\232.7614\\\\322.01\\\\141.2109\\\\232.6329\\\\322.01\\\\138.8672\\\\231.8626\\\\322.01\\\\136.5234\\\\231.9556\\\\322.01\\\\134.1797\\\\232.4196\\\\322.01\\\\131.8359\\\\231.7424\\\\322.01\\\\124.8047\\\\231.7024\\\\322.01\\\\122.4609\\\\232.0168\\\\322.01\\\\120.1172\\\\232.6329\\\\322.01\\\\115.4297\\\\232.7071\\\\322.01\\\\110.7422\\\\232.6027\\\\322.01\\\\108.3984\\\\231.8445\\\\322.01\\\\106.0547\\\\231.5827\\\\322.01\\\\103.7109\\\\231.4945\\\\322.01\\\\102.7858\\\\232.3734\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"368\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"17\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-18.16406\\\\233.1132\\\\325.01\\\\-34.57031\\\\233.1568\\\\325.01\\\\-43.94531\\\\233.1397\\\\325.01\\\\-53.32031\\\\233.1652\\\\325.01\\\\-62.69531\\\\233.2507\\\\325.01\\\\-65.03906\\\\232.6027\\\\325.01\\\\-67.38281\\\\232.8617\\\\325.01\\\\-69.72656\\\\232.9735\\\\325.01\\\\-74.41406\\\\233.0343\\\\325.01\\\\-83.78906\\\\233.0245\\\\325.01\\\\-88.47656\\\\233.0951\\\\325.01\\\\-95.50781\\\\233.0859\\\\325.01\\\\-97.85156\\\\233.4143\\\\325.01\\\\-100.1953\\\\234.0359\\\\325.01\\\\-102.5391\\\\234.1029\\\\325.01\\\\-104.8828\\\\233.4395\\\\325.01\\\\-109.5703\\\\234.0489\\\\325.01\\\\-111.9141\\\\234.0805\\\\325.01\\\\-116.6016\\\\234.054\\\\325.01\\\\-128.3203\\\\234.1174\\\\325.01\\\\-130.6641\\\\234.0591\\\\325.01\\\\-137.6953\\\\234.1221\\\\325.01\\\\-142.3828\\\\234.2191\\\\325.01\\\\-147.0703\\\\234.1029\\\\325.01\\\\-151.7578\\\\234.1127\\\\325.01\\\\-156.4453\\\\234.0772\\\\325.01\\\\-158.7891\\\\234.1085\\\\325.01\\\\-163.4766\\\\234.0463\\\\325.01\\\\-165.8203\\\\234.0722\\\\325.01\\\\-168.1641\\\\234.1994\\\\325.01\\\\-177.5391\\\\234.2357\\\\325.01\\\\-179.8828\\\\234.1837\\\\325.01\\\\-184.5703\\\\234.2574\\\\325.01\\\\-189.2578\\\\234.2012\\\\325.01\\\\-191.6016\\\\234.2721\\\\325.01\\\\-196.2891\\\\234.2574\\\\325.01\\\\-200.9766\\\\234.3204\\\\325.01\\\\-205.6641\\\\234.2187\\\\325.01\\\\-215.0391\\\\234.3146\\\\325.01\\\\-217.3828\\\\234.3917\\\\325.01\\\\-222.0703\\\\234.4409\\\\325.01\\\\-224.4141\\\\234.3917\\\\325.01\\\\-229.1016\\\\234.4578\\\\325.01\\\\-233.7891\\\\234.2398\\\\325.01\\\\-238.4766\\\\234.2644\\\\325.01\\\\-243.1641\\\\234.0329\\\\325.01\\\\-247.8516\\\\233.6513\\\\325.01\\\\-250.1953\\\\233.6663\\\\325.01\\\\-252.5391\\\\234.2918\\\\325.01\\\\-254.8828\\\\234.4928\\\\325.01\\\\-257.2266\\\\234.9479\\\\325.01\\\\-259.5703\\\\235.9244\\\\325.01\\\\-261.0111\\\\237.0609\\\\325.01\\\\-262.9464\\\\239.4047\\\\325.01\\\\-263.1001\\\\241.7484\\\\325.01\\\\-262.7014\\\\244.0922\\\\325.01\\\\-261.9141\\\\245.3016\\\\325.01\\\\-259.5703\\\\248.4308\\\\325.01\\\\-259.1987\\\\248.7797\\\\325.01\\\\-257.2266\\\\251.1994\\\\325.01\\\\-255.4771\\\\253.4672\\\\325.01\\\\-252.5391\\\\256.632\\\\325.01\\\\-250.1953\\\\258.8544\\\\325.01\\\\-247.8516\\\\261.3872\\\\325.01\\\\-245.5078\\\\263.5746\\\\325.01\\\\-244.0755\\\\265.1859\\\\325.01\\\\-241.6044\\\\267.5297\\\\325.01\\\\-239.3906\\\\269.8734\\\\325.01\\\\-236.1328\\\\273.1332\\\\325.01\\\\-233.7891\\\\275.4082\\\\325.01\\\\-231.4453\\\\277.8406\\\\325.01\\\\-229.8915\\\\279.2484\\\\325.01\\\\-226.7578\\\\282.5634\\\\325.01\\\\-224.4141\\\\284.7142\\\\325.01\\\\-222.0703\\\\287.2492\\\\325.01\\\\-220.6122\\\\288.6234\\\\325.01\\\\-218.3665\\\\290.9672\\\\325.01\\\\-215.0391\\\\293.3202\\\\325.01\\\\-212.6953\\\\294.6589\\\\325.01\\\\-210.3516\\\\295.3953\\\\325.01\\\\-208.0078\\\\296.5198\\\\325.01\\\\-205.6641\\\\296.899\\\\325.01\\\\-203.3203\\\\297.134\\\\325.01\\\\-198.6328\\\\297.134\\\\325.01\\\\-193.9453\\\\296.9855\\\\325.01\\\\-189.2578\\\\296.9891\\\\325.01\\\\-179.8828\\\\296.8863\\\\325.01\\\\-168.1641\\\\296.9185\\\\325.01\\\\-161.1328\\\\296.8737\\\\325.01\\\\-156.4453\\\\296.8978\\\\325.01\\\\-149.4141\\\\296.8678\\\\325.01\\\\-144.7266\\\\296.9186\\\\325.01\\\\-140.0391\\\\296.886\\\\325.01\\\\-128.3203\\\\296.8794\\\\325.01\\\\-125.9766\\\\296.916\\\\325.01\\\\-116.6016\\\\296.916\\\\325.01\\\\-114.2578\\\\296.9518\\\\325.01\\\\-100.1953\\\\296.9218\\\\325.01\\\\-95.50781\\\\296.8847\\\\325.01\\\\-88.47656\\\\296.934\\\\325.01\\\\-81.44531\\\\296.925\\\\325.01\\\\-76.75781\\\\296.9557\\\\325.01\\\\-72.07031\\\\296.9428\\\\325.01\\\\-69.72656\\\\297.0516\\\\325.01\\\\-67.38281\\\\296.9622\\\\325.01\\\\-53.32031\\\\296.9053\\\\325.01\\\\-41.60156\\\\296.8985\\\\325.01\\\\-22.85156\\\\296.9081\\\\325.01\\\\-20.50781\\\\296.9841\\\\325.01\\\\-18.16406\\\\297.3277\\\\325.01\\\\-15.82031\\\\296.9175\\\\325.01\\\\-13.47656\\\\296.9175\\\\325.01\\\\-11.13281\\\\297.3806\\\\325.01\\\\-8.789063\\\\296.9067\\\\325.01\\\\-6.445313\\\\296.9285\\\\325.01\\\\0.5859375\\\\296.878\\\\325.01\\\\2.929688\\\\296.9095\\\\325.01\\\\9.960938\\\\296.837\\\\325.01\\\\21.67969\\\\296.8055\\\\325.01\\\\33.39844\\\\296.7135\\\\325.01\\\\38.08594\\\\296.7324\\\\325.01\\\\42.77344\\\\296.7021\\\\325.01\\\\52.14844\\\\296.6929\\\\325.01\\\\59.17969\\\\296.6635\\\\325.01\\\\66.21094\\\\296.5984\\\\325.01\\\\77.92969\\\\296.582\\\\325.01\\\\80.27344\\\\296.5336\\\\325.01\\\\91.99219\\\\296.5079\\\\325.01\\\\94.33594\\\\296.473\\\\325.01\\\\101.3672\\\\296.474\\\\325.01\\\\106.0547\\\\296.4051\\\\325.01\\\\115.4297\\\\296.3986\\\\325.01\\\\122.4609\\\\296.3557\\\\325.01\\\\124.8047\\\\296.308\\\\325.01\\\\129.4922\\\\296.3139\\\\325.01\\\\134.1797\\\\296.1332\\\\325.01\\\\136.5234\\\\295.833\\\\325.01\\\\143.5547\\\\295.8172\\\\325.01\\\\148.2422\\\\295.864\\\\325.01\\\\152.9297\\\\295.7516\\\\325.01\\\\157.6172\\\\295.7849\\\\325.01\\\\169.3359\\\\295.6454\\\\325.01\\\\176.3672\\\\295.6093\\\\325.01\\\\183.3984\\\\295.6638\\\\325.01\\\\188.0859\\\\295.5742\\\\325.01\\\\192.7734\\\\295.5742\\\\325.01\\\\197.4609\\\\295.8172\\\\325.01\\\\202.1484\\\\295.7346\\\\325.01\\\\204.4922\\\\295.4287\\\\325.01\\\\206.8359\\\\294.8107\\\\325.01\\\\209.1797\\\\294.3828\\\\325.01\\\\211.5234\\\\292.5155\\\\325.01\\\\213.8672\\\\291.2065\\\\325.01\\\\216.2109\\\\289.625\\\\325.01\\\\217.2743\\\\288.6234\\\\325.01\\\\218.5547\\\\287.1312\\\\325.01\\\\221.8125\\\\283.9359\\\\325.01\\\\225.5859\\\\279.9313\\\\325.01\\\\227.9297\\\\277.6329\\\\325.01\\\\230.2734\\\\275.1294\\\\325.01\\\\233.3415\\\\272.2172\\\\325.01\\\\234.9609\\\\270.437\\\\325.01\\\\237.8862\\\\267.5297\\\\325.01\\\\244.7266\\\\260.4984\\\\325.01\\\\246.6797\\\\258.4162\\\\325.01\\\\251.4181\\\\253.4672\\\\325.01\\\\256.0547\\\\248.2155\\\\325.01\\\\257.5107\\\\246.4359\\\\325.01\\\\259.7775\\\\244.0922\\\\325.01\\\\260.7694\\\\241.7484\\\\325.01\\\\261.6139\\\\239.4047\\\\325.01\\\\260.8724\\\\237.0609\\\\325.01\\\\259.4996\\\\234.7172\\\\325.01\\\\258.3984\\\\233.6932\\\\325.01\\\\256.0547\\\\233.0686\\\\325.01\\\\253.7109\\\\232.8467\\\\325.01\\\\251.3672\\\\233.6969\\\\325.01\\\\249.0234\\\\232.8344\\\\325.01\\\\246.6797\\\\232.8072\\\\325.01\\\\241.9922\\\\233.0305\\\\325.01\\\\237.3047\\\\233.0207\\\\325.01\\\\232.6172\\\\233.0592\\\\325.01\\\\227.9297\\\\233.0305\\\\325.01\\\\220.8984\\\\233.0402\\\\325.01\\\\211.5234\\\\233.0819\\\\325.01\\\\206.8359\\\\233.0207\\\\325.01\\\\202.1484\\\\232.6477\\\\325.01\\\\197.4609\\\\232.7322\\\\325.01\\\\185.7422\\\\232.7322\\\\325.01\\\\171.6797\\\\232.7848\\\\325.01\\\\164.6484\\\\232.7186\\\\325.01\\\\159.9609\\\\232.7588\\\\325.01\\\\152.9297\\\\232.7456\\\\325.01\\\\143.5547\\\\232.7614\\\\325.01\\\\141.2109\\\\232.6477\\\\325.01\\\\138.8672\\\\231.7333\\\\325.01\\\\136.5234\\\\231.9353\\\\325.01\\\\134.1797\\\\232.6179\\\\325.01\\\\131.8359\\\\232.4552\\\\325.01\\\\129.4922\\\\231.9931\\\\325.01\\\\127.1484\\\\231.7424\\\\325.01\\\\124.8047\\\\231.7224\\\\325.01\\\\121.8516\\\\232.3734\\\\325.01\\\\120.1172\\\\232.6767\\\\325.01\\\\115.4297\\\\232.7346\\\\325.01\\\\108.3984\\\\232.6788\\\\325.01\\\\106.0547\\\\231.6083\\\\325.01\\\\103.7109\\\\231.4658\\\\325.01\\\\102.7466\\\\232.3734\\\\325.01\\\\101.3672\\\\233.1132\\\\325.01\\\\99.02344\\\\233.1397\\\\325.01\\\\89.64844\\\\233.1221\\\\325.01\\\\84.96094\\\\233.1483\\\\325.01\\\\77.92969\\\\233.131\\\\325.01\\\\70.89844\\\\233.1483\\\\325.01\\\\68.55469\\\\233.1221\\\\325.01\\\\63.86719\\\\233.1652\\\\325.01\\\\47.46094\\\\233.131\\\\325.01\\\\45.11719\\\\233.1042\\\\325.01\\\\44.13916\\\\232.3734\\\\325.01\\\\42.77344\\\\231.0852\\\\325.01\\\\41.99423\\\\230.0297\\\\325.01\\\\42.77344\\\\229.1792\\\\325.01\\\\45.11719\\\\228.4149\\\\325.01\\\\47.46094\\\\226.9069\\\\325.01\\\\49.80469\\\\225.8247\\\\325.01\\\\52.14844\\\\224.4343\\\\325.01\\\\54.49219\\\\223.4268\\\\325.01\\\\54.98124\\\\222.9984\\\\325.01\\\\59.17969\\\\219.9802\\\\325.01\\\\61.52344\\\\218.4654\\\\325.01\\\\66.21094\\\\214.7512\\\\325.01\\\\67.41649\\\\213.6234\\\\325.01\\\\72.08356\\\\208.9359\\\\325.01\\\\76.20634\\\\204.2484\\\\325.01\\\\77.92969\\\\201.635\\\\325.01\\\\81.10609\\\\197.2172\\\\325.01\\\\82.23734\\\\194.8734\\\\325.01\\\\82.61719\\\\194.4684\\\\325.01\\\\83.89715\\\\192.5297\\\\325.01\\\\87.08028\\\\185.4984\\\\325.01\\\\88.34971\\\\183.1547\\\\325.01\\\\88.75122\\\\180.8109\\\\325.01\\\\89.51726\\\\178.4672\\\\325.01\\\\90.45728\\\\176.1234\\\\325.01\\\\91.58888\\\\171.4359\\\\325.01\\\\92.52214\\\\169.0922\\\\325.01\\\\92.92603\\\\166.7484\\\\325.01\\\\93.08162\\\\164.4047\\\\325.01\\\\93.24734\\\\159.7172\\\\325.01\\\\93.34813\\\\155.0297\\\\325.01\\\\93.33585\\\\152.6859\\\\325.01\\\\93.21733\\\\147.9984\\\\325.01\\\\93.03451\\\\143.3109\\\\325.01\\\\92.80149\\\\140.9672\\\\325.01\\\\92.20603\\\\138.6234\\\\325.01\\\\91.35603\\\\136.2797\\\\325.01\\\\90.86391\\\\133.9359\\\\325.01\\\\90.26195\\\\131.5922\\\\325.01\\\\89.23982\\\\129.2484\\\\325.01\\\\88.11904\\\\124.5609\\\\325.01\\\\86.61727\\\\122.2172\\\\325.01\\\\85.77421\\\\119.8734\\\\325.01\\\\84.43931\\\\117.5297\\\\325.01\\\\83.54303\\\\115.1859\\\\325.01\\\\81.72218\\\\112.8422\\\\325.01\\\\80.63217\\\\110.4984\\\\325.01\\\\78.97623\\\\108.1547\\\\325.01\\\\76.99889\\\\105.8109\\\\325.01\\\\75.58594\\\\103.8485\\\\325.01\\\\71.2717\\\\98.77969\\\\325.01\\\\68.55469\\\\96.10746\\\\325.01\\\\63.40781\\\\91.74844\\\\325.01\\\\61.52344\\\\90.39472\\\\325.01\\\\59.17969\\\\88.40859\\\\325.01\\\\56.83594\\\\86.96328\\\\325.01\\\\54.49219\\\\85.72954\\\\325.01\\\\52.14844\\\\83.90226\\\\325.01\\\\49.80469\\\\83.13991\\\\325.01\\\\47.46094\\\\81.75262\\\\325.01\\\\45.11719\\\\80.8488\\\\325.01\\\\42.77344\\\\79.45107\\\\325.01\\\\40.42969\\\\78.81117\\\\325.01\\\\38.08594\\\\78.3781\\\\325.01\\\\35.74219\\\\77.40307\\\\325.01\\\\33.39844\\\\76.69214\\\\325.01\\\\28.71094\\\\75.71996\\\\325.01\\\\26.36719\\\\74.93087\\\\325.01\\\\24.02344\\\\74.48033\\\\325.01\\\\14.64844\\\\74.16439\\\\325.01\\\\12.30469\\\\74.15256\\\\325.01\\\\5.273438\\\\74.32497\\\\325.01\\\\2.929688\\\\74.428\\\\325.01\\\\0.5859375\\\\74.75261\\\\325.01\\\\-4.101563\\\\76.07065\\\\325.01\\\\-6.445313\\\\76.48616\\\\325.01\\\\-8.789063\\\\77.12093\\\\325.01\\\\-11.13281\\\\78.12252\\\\325.01\\\\-13.47656\\\\78.72694\\\\325.01\\\\-15.82031\\\\79.19357\\\\325.01\\\\-18.16406\\\\80.59765\\\\325.01\\\\-20.50781\\\\81.5181\\\\325.01\\\\-22.85156\\\\82.87881\\\\325.01\\\\-25.19531\\\\83.74062\\\\325.01\\\\-27.53906\\\\85.55424\\\\325.01\\\\-29.88281\\\\86.58486\\\\325.01\\\\-32.22656\\\\88.27789\\\\325.01\\\\-34.57031\\\\90.20212\\\\325.01\\\\-36.80389\\\\91.74844\\\\325.01\\\\-39.25781\\\\93.7097\\\\325.01\\\\-41.60156\\\\95.68683\\\\325.01\\\\-46.93845\\\\101.1234\\\\325.01\\\\-48.63281\\\\103.3971\\\\325.01\\\\-52.29492\\\\108.1547\\\\325.01\\\\-53.96273\\\\110.4984\\\\325.01\\\\-55.34668\\\\112.8422\\\\325.01\\\\-56.84198\\\\115.1859\\\\325.01\\\\-57.82686\\\\117.5297\\\\325.01\\\\-59.19159\\\\119.8734\\\\325.01\\\\-60.36086\\\\122.2172\\\\325.01\\\\-61.3241\\\\124.5609\\\\325.01\\\\-61.87306\\\\126.9047\\\\325.01\\\\-63.0335\\\\129.2484\\\\325.01\\\\-63.83386\\\\131.5922\\\\325.01\\\\-64.24364\\\\133.9359\\\\325.01\\\\-65.60407\\\\138.6234\\\\325.01\\\\-65.90472\\\\140.9672\\\\325.01\\\\-66.56733\\\\147.9984\\\\325.01\\\\-66.85014\\\\152.6859\\\\325.01\\\\-66.89514\\\\155.0297\\\\325.01\\\\-66.80727\\\\157.3734\\\\325.01\\\\-66.51716\\\\162.0609\\\\325.01\\\\-66.30065\\\\164.4047\\\\325.01\\\\-65.77621\\\\169.0922\\\\325.01\\\\-65.44237\\\\171.4359\\\\325.01\\\\-64.52861\\\\173.7797\\\\325.01\\\\-64.08521\\\\176.1234\\\\325.01\\\\-63.46983\\\\178.4672\\\\325.01\\\\-62.2521\\\\180.8109\\\\325.01\\\\-61.54234\\\\183.1547\\\\325.01\\\\-60.97238\\\\185.4984\\\\325.01\\\\-59.53244\\\\187.8422\\\\325.01\\\\-58.54048\\\\190.1859\\\\325.01\\\\-57.08706\\\\192.5297\\\\325.01\\\\-56.2388\\\\194.8734\\\\325.01\\\\-55.66406\\\\195.557\\\\325.01\\\\-53.32031\\\\198.94\\\\325.01\\\\-52.79036\\\\199.5609\\\\325.01\\\\-51.59609\\\\201.9047\\\\325.01\\\\-48.63281\\\\205.3395\\\\325.01\\\\-47.64024\\\\206.5922\\\\325.01\\\\-45.34446\\\\208.9359\\\\325.01\\\\-43.1875\\\\211.2797\\\\325.01\\\\-41.60156\\\\212.7042\\\\325.01\\\\-39.25781\\\\215.0065\\\\325.01\\\\-36.91406\\\\216.9296\\\\325.01\\\\-34.57031\\\\219.0371\\\\325.01\\\\-32.22656\\\\220.2086\\\\325.01\\\\-29.88281\\\\221.9258\\\\325.01\\\\-27.53906\\\\223.7543\\\\325.01\\\\-25.19531\\\\224.6046\\\\325.01\\\\-22.85156\\\\226.1349\\\\325.01\\\\-20.50781\\\\227.1316\\\\325.01\\\\-18.16406\\\\228.5423\\\\325.01\\\\-15.82031\\\\229.2136\\\\325.01\\\\-15.0185\\\\230.0297\\\\325.01\\\\-15.82031\\\\231.2992\\\\325.01\\\\-16.9148\\\\232.3734\\\\325.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"368\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"18\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-95.50781\\\\233.1042\\\\328.01\\\\-97.85156\\\\233.9217\\\\328.01\\\\-100.1953\\\\234.0411\\\\328.01\\\\-104.8828\\\\234.1505\\\\328.01\\\\-107.2266\\\\234.0891\\\\328.01\\\\-114.2578\\\\234.0855\\\\328.01\\\\-123.6328\\\\234.1407\\\\328.01\\\\-125.9766\\\\234.099\\\\328.01\\\\-135.3516\\\\234.0642\\\\328.01\\\\-142.3828\\\\234.1453\\\\328.01\\\\-147.0703\\\\234.0672\\\\328.01\\\\-158.7891\\\\234.0691\\\\328.01\\\\-165.8203\\\\234.0513\\\\328.01\\\\-170.5078\\\\234.2214\\\\328.01\\\\-177.5391\\\\234.2214\\\\328.01\\\\-179.8828\\\\234.1662\\\\328.01\\\\-186.9141\\\\234.2431\\\\328.01\\\\-189.2578\\\\234.1743\\\\328.01\\\\-191.6016\\\\234.2289\\\\328.01\\\\-196.2891\\\\234.2012\\\\328.01\\\\-200.9766\\\\234.3052\\\\328.01\\\\-203.3203\\\\234.2326\\\\328.01\\\\-208.0078\\\\234.2187\\\\328.01\\\\-212.6953\\\\234.3266\\\\328.01\\\\-215.0391\\\\234.3146\\\\328.01\\\\-222.0703\\\\234.4926\\\\328.01\\\\-224.4141\\\\234.4242\\\\328.01\\\\-229.1016\\\\234.4409\\\\328.01\\\\-233.7891\\\\234.2678\\\\328.01\\\\-236.1328\\\\234.2789\\\\328.01\\\\-240.8203\\\\234.1822\\\\328.01\\\\-243.1641\\\\234.0396\\\\328.01\\\\-247.8516\\\\233.6445\\\\328.01\\\\-250.1953\\\\233.6456\\\\328.01\\\\-252.0338\\\\234.7172\\\\328.01\\\\-252.5391\\\\236.7571\\\\328.01\\\\-254.5061\\\\234.7172\\\\328.01\\\\-254.8828\\\\234.6373\\\\328.01\\\\-257.2266\\\\235.072\\\\328.01\\\\-259.5703\\\\235.9195\\\\328.01\\\\-261.0352\\\\237.0609\\\\328.01\\\\-262.9576\\\\239.4047\\\\328.01\\\\-263.0812\\\\241.7484\\\\328.01\\\\-262.6933\\\\244.0922\\\\328.01\\\\-261.0624\\\\246.4359\\\\328.01\\\\-259.5703\\\\248.3512\\\\328.01\\\\-259.053\\\\248.7797\\\\328.01\\\\-255.4084\\\\253.4672\\\\328.01\\\\-252.5391\\\\256.6272\\\\328.01\\\\-250.1953\\\\258.8713\\\\328.01\\\\-247.8516\\\\261.3969\\\\328.01\\\\-245.5078\\\\263.5681\\\\328.01\\\\-244.0815\\\\265.1859\\\\328.01\\\\-241.6044\\\\267.5297\\\\328.01\\\\-239.4063\\\\269.8734\\\\328.01\\\\-233.7891\\\\275.4299\\\\328.01\\\\-231.4453\\\\277.8564\\\\328.01\\\\-229.8974\\\\279.2484\\\\328.01\\\\-226.7578\\\\282.5634\\\\328.01\\\\-224.4141\\\\284.7263\\\\328.01\\\\-222.0703\\\\287.2521\\\\328.01\\\\-220.5943\\\\288.6234\\\\328.01\\\\-218.3665\\\\290.9672\\\\328.01\\\\-215.0107\\\\293.3109\\\\328.01\\\\-212.6953\\\\294.6589\\\\328.01\\\\-210.3516\\\\295.2445\\\\328.01\\\\-209.8801\\\\295.6547\\\\328.01\\\\-208.0078\\\\296.512\\\\328.01\\\\-205.6641\\\\296.8998\\\\328.01\\\\-203.3203\\\\297.1414\\\\328.01\\\\-198.6328\\\\297.1488\\\\328.01\\\\-193.9453\\\\296.9968\\\\328.01\\\\-184.5703\\\\296.9452\\\\328.01\\\\-177.5391\\\\296.8713\\\\328.01\\\\-170.5078\\\\296.8886\\\\328.01\\\\-154.1016\\\\296.8744\\\\328.01\\\\-149.4141\\\\296.8513\\\\328.01\\\\-144.7266\\\\296.9097\\\\328.01\\\\-140.0391\\\\296.8603\\\\328.01\\\\-130.6641\\\\296.8439\\\\328.01\\\\-121.2891\\\\296.9065\\\\328.01\\\\-109.5703\\\\296.9339\\\\328.01\\\\-97.85156\\\\296.8641\\\\328.01\\\\-83.78906\\\\296.9234\\\\328.01\\\\-74.41406\\\\296.9234\\\\328.01\\\\-69.72656\\\\296.9706\\\\328.01\\\\-67.38281\\\\296.9428\\\\328.01\\\\-60.35156\\\\296.9447\\\\328.01\\\\-53.32031\\\\296.9145\\\\328.01\\\\-39.25781\\\\296.9377\\\\328.01\\\\-36.91406\\\\296.8789\\\\328.01\\\\-29.88281\\\\296.9095\\\\328.01\\\\-22.85156\\\\296.8973\\\\328.01\\\\-18.16406\\\\296.9841\\\\328.01\\\\-15.82031\\\\297.088\\\\328.01\\\\-13.47656\\\\296.9175\\\\328.01\\\\-11.13281\\\\296.9731\\\\328.01\\\\-8.789063\\\\296.9175\\\\328.01\\\\-1.757813\\\\296.9191\\\\328.01\\\\19.33594\\\\296.7952\\\\328.01\\\\21.67969\\\\296.8159\\\\328.01\\\\26.36719\\\\296.7533\\\\328.01\\\\31.05469\\\\296.7733\\\\328.01\\\\33.39844\\\\296.7229\\\\328.01\\\\38.08594\\\\296.7421\\\\328.01\\\\47.46094\\\\296.7324\\\\328.01\\\\49.80469\\\\296.6724\\\\328.01\\\\59.17969\\\\296.675\\\\328.01\\\\66.21094\\\\296.6107\\\\328.01\\\\68.55469\\\\296.6228\\\\328.01\\\\75.58594\\\\296.5696\\\\328.01\\\\77.92969\\\\296.5901\\\\328.01\\\\80.27344\\\\296.5208\\\\328.01\\\\82.61719\\\\296.5616\\\\328.01\\\\87.30469\\\\296.5079\\\\328.01\\\\103.7109\\\\296.4597\\\\328.01\\\\113.0859\\\\296.3846\\\\328.01\\\\117.7734\\\\296.3986\\\\328.01\\\\124.8047\\\\296.3288\\\\328.01\\\\129.4922\\\\296.3288\\\\328.01\\\\131.8359\\\\295.9477\\\\328.01\\\\134.1797\\\\296.1527\\\\328.01\\\\138.8672\\\\295.8486\\\\328.01\\\\143.5547\\\\295.9433\\\\328.01\\\\145.8984\\\\295.864\\\\328.01\\\\148.2422\\\\295.8791\\\\328.01\\\\152.9297\\\\295.8012\\\\328.01\\\\159.9609\\\\295.8012\\\\328.01\\\\164.6484\\\\295.7346\\\\328.01\\\\171.6797\\\\295.6998\\\\328.01\\\\176.3672\\\\295.6272\\\\328.01\\\\183.3984\\\\295.7173\\\\328.01\\\\188.0859\\\\295.5742\\\\328.01\\\\192.7734\\\\295.6093\\\\328.01\\\\197.4609\\\\295.8486\\\\328.01\\\\202.1484\\\\295.7516\\\\328.01\\\\204.4922\\\\295.4287\\\\328.01\\\\206.8359\\\\294.803\\\\328.01\\\\209.1797\\\\294.3828\\\\328.01\\\\211.5234\\\\292.5075\\\\328.01\\\\213.8672\\\\291.2212\\\\328.01\\\\216.2109\\\\289.6308\\\\328.01\\\\217.2743\\\\288.6234\\\\328.01\\\\218.5547\\\\287.1312\\\\328.01\\\\221.809\\\\283.9359\\\\328.01\\\\225.5859\\\\279.9599\\\\328.01\\\\227.9297\\\\277.6776\\\\328.01\\\\230.2734\\\\275.1425\\\\328.01\\\\233.3301\\\\272.2172\\\\328.01\\\\234.9609\\\\270.437\\\\328.01\\\\237.8817\\\\267.5297\\\\328.01\\\\246.9583\\\\258.1547\\\\328.01\\\\251.4177\\\\253.4672\\\\328.01\\\\256.0547\\\\248.1981\\\\328.01\\\\257.4792\\\\246.4359\\\\328.01\\\\259.8178\\\\244.0922\\\\328.01\\\\261.6764\\\\239.4047\\\\328.01\\\\260.9047\\\\237.0609\\\\328.01\\\\259.4996\\\\234.7172\\\\328.01\\\\258.3984\\\\233.6884\\\\328.01\\\\256.0547\\\\233.0779\\\\328.01\\\\253.7109\\\\232.916\\\\328.01\\\\251.3672\\\\233.9331\\\\328.01\\\\249.0234\\\\233.1868\\\\328.01\\\\246.6797\\\\232.8317\\\\328.01\\\\241.9922\\\\233.0305\\\\328.01\\\\237.3047\\\\233.0305\\\\328.01\\\\232.6172\\\\233.0819\\\\328.01\\\\227.9297\\\\233.0498\\\\328.01\\\\223.2422\\\\233.091\\\\328.01\\\\220.8984\\\\233.0632\\\\328.01\\\\211.5234\\\\233.0819\\\\328.01\\\\206.8359\\\\233.0537\\\\328.01\\\\202.1484\\\\232.6477\\\\328.01\\\\197.4609\\\\232.7456\\\\328.01\\\\188.0859\\\\232.7322\\\\328.01\\\\178.7109\\\\232.7975\\\\328.01\\\\174.0234\\\\232.7588\\\\328.01\\\\166.9922\\\\232.7588\\\\328.01\\\\162.3047\\\\232.7186\\\\328.01\\\\152.9297\\\\232.7588\\\\328.01\\\\143.5547\\\\232.8253\\\\328.01\\\\141.2109\\\\232.721\\\\328.01\\\\138.8672\\\\232.1391\\\\328.01\\\\136.5234\\\\232.6027\\\\328.01\\\\134.1797\\\\232.6477\\\\328.01\\\\131.8359\\\\232.5716\\\\328.01\\\\129.4922\\\\231.8784\\\\328.01\\\\127.1484\\\\231.7224\\\\328.01\\\\124.8047\\\\231.7315\\\\328.01\\\\122.4609\\\\232.6623\\\\328.01\\\\115.4297\\\\232.7875\\\\328.01\\\\108.3984\\\\232.7071\\\\328.01\\\\106.0547\\\\231.641\\\\328.01\\\\103.7109\\\\231.4558\\\\328.01\\\\102.6978\\\\232.3734\\\\328.01\\\\101.3672\\\\233.0951\\\\328.01\\\\99.02344\\\\233.1483\\\\328.01\\\\94.33594\\\\233.1221\\\\328.01\\\\89.64844\\\\233.1397\\\\328.01\\\\77.92969\\\\233.1221\\\\328.01\\\\70.89844\\\\233.1568\\\\328.01\\\\47.46094\\\\233.1483\\\\328.01\\\\45.11719\\\\233.1221\\\\328.01\\\\44.12626\\\\232.3734\\\\328.01\\\\42.77344\\\\231.0868\\\\328.01\\\\41.98608\\\\230.0297\\\\328.01\\\\42.77344\\\\229.1708\\\\328.01\\\\45.11719\\\\228.3863\\\\328.01\\\\47.46094\\\\226.8852\\\\328.01\\\\49.80469\\\\225.7875\\\\328.01\\\\52.14844\\\\224.4137\\\\328.01\\\\54.49219\\\\223.3972\\\\328.01\\\\54.94433\\\\222.9984\\\\328.01\\\\59.17969\\\\219.9666\\\\328.01\\\\61.52344\\\\218.3946\\\\328.01\\\\63.86719\\\\216.6084\\\\328.01\\\\66.21094\\\\214.7201\\\\328.01\\\\72.05011\\\\208.9359\\\\328.01\\\\76.14435\\\\204.2484\\\\328.01\\\\77.59603\\\\201.9047\\\\328.01\\\\77.92969\\\\201.5351\\\\328.01\\\\81.09001\\\\197.2172\\\\328.01\\\\82.18169\\\\194.8734\\\\328.01\\\\82.61719\\\\194.396\\\\328.01\\\\83.85225\\\\192.5297\\\\328.01\\\\85.99004\\\\187.8422\\\\328.01\\\\87.00566\\\\185.4984\\\\328.01\\\\88.31177\\\\183.1547\\\\328.01\\\\88.73158\\\\180.8109\\\\328.01\\\\89.43767\\\\178.4672\\\\328.01\\\\90.393\\\\176.1234\\\\328.01\\\\91.51611\\\\171.4359\\\\328.01\\\\92.42188\\\\169.0922\\\\328.01\\\\92.89885\\\\166.7484\\\\328.01\\\\93.06984\\\\164.4047\\\\328.01\\\\93.28426\\\\157.3734\\\\328.01\\\\93.30979\\\\152.6859\\\\328.01\\\\93.18761\\\\147.9984\\\\328.01\\\\93.02273\\\\143.3109\\\\328.01\\\\92.74458\\\\140.9672\\\\328.01\\\\92.09059\\\\138.6234\\\\328.01\\\\91.29035\\\\136.2797\\\\328.01\\\\90.7983\\\\133.9359\\\\328.01\\\\90.19531\\\\131.5922\\\\328.01\\\\89.1515\\\\129.2484\\\\328.01\\\\88.04228\\\\124.5609\\\\328.01\\\\86.57227\\\\122.2172\\\\328.01\\\\85.71805\\\\119.8734\\\\328.01\\\\84.35456\\\\117.5297\\\\328.01\\\\83.45424\\\\115.1859\\\\328.01\\\\81.67584\\\\112.8422\\\\328.01\\\\80.51793\\\\110.4984\\\\328.01\\\\78.89664\\\\108.1547\\\\328.01\\\\76.93359\\\\105.8109\\\\328.01\\\\75.58594\\\\104.0007\\\\328.01\\\\71.0907\\\\98.77969\\\\328.01\\\\68.55469\\\\96.27782\\\\328.01\\\\66.21094\\\\94.34207\\\\328.01\\\\63.23686\\\\91.74844\\\\328.01\\\\61.52344\\\\90.49887\\\\328.01\\\\59.17969\\\\88.51089\\\\328.01\\\\54.49219\\\\85.80405\\\\328.01\\\\52.14844\\\\84.03836\\\\328.01\\\\49.80469\\\\83.19375\\\\328.01\\\\47.46094\\\\81.85665\\\\328.01\\\\45.11719\\\\80.92008\\\\328.01\\\\43.41961\\\\80.02969\\\\328.01\\\\42.77344\\\\79.5718\\\\328.01\\\\40.42969\\\\78.83472\\\\328.01\\\\38.08594\\\\78.42924\\\\328.01\\\\35.74219\\\\77.53945\\\\328.01\\\\33.39844\\\\76.75893\\\\328.01\\\\28.71094\\\\75.81826\\\\328.01\\\\26.36719\\\\75.0248\\\\328.01\\\\24.02344\\\\74.52504\\\\328.01\\\\21.67969\\\\74.40105\\\\328.01\\\\14.64844\\\\74.17623\\\\328.01\\\\12.30469\\\\74.17031\\\\328.01\\\\7.617188\\\\74.25909\\\\328.01\\\\2.929688\\\\74.428\\\\328.01\\\\0.5859375\\\\74.71389\\\\328.01\\\\-4.101563\\\\76.07934\\\\328.01\\\\-6.445313\\\\76.51406\\\\328.01\\\\-8.789063\\\\77.13158\\\\328.01\\\\-11.13281\\\\78.13784\\\\328.01\\\\-13.47656\\\\78.72694\\\\328.01\\\\-15.82031\\\\79.21071\\\\328.01\\\\-18.16406\\\\80.62277\\\\328.01\\\\-20.50781\\\\81.54421\\\\328.01\\\\-22.85156\\\\82.91264\\\\328.01\\\\-25.19531\\\\83.73855\\\\328.01\\\\-27.53906\\\\85.55424\\\\328.01\\\\-29.88281\\\\86.58486\\\\328.01\\\\-32.22656\\\\88.27042\\\\328.01\\\\-34.57031\\\\90.21121\\\\328.01\\\\-36.82314\\\\91.74844\\\\328.01\\\\-39.25781\\\\93.68283\\\\328.01\\\\-41.60156\\\\95.69698\\\\328.01\\\\-43.94531\\\\98.10894\\\\328.01\\\\-46.95976\\\\101.1234\\\\328.01\\\\-50.47743\\\\105.8109\\\\328.01\\\\-52.28932\\\\108.1547\\\\328.01\\\\-53.96273\\\\110.4984\\\\328.01\\\\-56.82392\\\\115.1859\\\\328.01\\\\-57.82686\\\\117.5297\\\\328.01\\\\-59.17969\\\\119.8734\\\\328.01\\\\-60.35156\\\\122.2886\\\\328.01\\\\-61.31202\\\\124.5609\\\\328.01\\\\-61.84362\\\\126.9047\\\\328.01\\\\-62.97818\\\\129.2484\\\\328.01\\\\-63.81696\\\\131.5922\\\\328.01\\\\-64.22777\\\\133.9359\\\\328.01\\\\-65.57173\\\\138.6234\\\\328.01\\\\-65.88971\\\\140.9672\\\\328.01\\\\-66.54406\\\\147.9984\\\\328.01\\\\-66.83923\\\\152.6859\\\\328.01\\\\-66.87236\\\\155.0297\\\\328.01\\\\-66.8178\\\\157.3734\\\\328.01\\\\-66.51716\\\\162.0609\\\\328.01\\\\-66.31799\\\\164.4047\\\\328.01\\\\-65.7848\\\\169.0922\\\\328.01\\\\-65.44237\\\\171.4359\\\\328.01\\\\-64.53993\\\\173.7797\\\\328.01\\\\-64.09171\\\\176.1234\\\\328.01\\\\-63.46994\\\\178.4672\\\\328.01\\\\-62.26713\\\\180.8109\\\\328.01\\\\-61.52344\\\\183.1547\\\\328.01\\\\-61.02607\\\\185.4984\\\\328.01\\\\-59.56421\\\\187.8422\\\\328.01\\\\-58.60754\\\\190.1859\\\\328.01\\\\-57.1322\\\\192.5297\\\\328.01\\\\-56.30392\\\\194.8734\\\\328.01\\\\-55.66406\\\\195.646\\\\328.01\\\\-53.32031\\\\199.0141\\\\328.01\\\\-52.84091\\\\199.5609\\\\328.01\\\\-51.67393\\\\201.9047\\\\328.01\\\\-48.63281\\\\205.3802\\\\328.01\\\\-47.66054\\\\206.5922\\\\328.01\\\\-45.38484\\\\208.9359\\\\328.01\\\\-43.23581\\\\211.2797\\\\328.01\\\\-41.60156\\\\212.7535\\\\328.01\\\\-39.25781\\\\215.0201\\\\328.01\\\\-36.91406\\\\216.9578\\\\328.01\\\\-34.57031\\\\219.0567\\\\328.01\\\\-32.22656\\\\220.2589\\\\328.01\\\\-31.7772\\\\220.6547\\\\328.01\\\\-28.47822\\\\222.9984\\\\328.01\\\\-27.53906\\\\223.7774\\\\328.01\\\\-25.19531\\\\224.6141\\\\328.01\\\\-22.85156\\\\226.1618\\\\328.01\\\\-20.50781\\\\227.1643\\\\328.01\\\\-18.16406\\\\228.5648\\\\328.01\\\\-15.82031\\\\229.3696\\\\328.01\\\\-15.16846\\\\230.0297\\\\328.01\\\\-15.82031\\\\231.0044\\\\328.01\\\\-17.12821\\\\232.3734\\\\328.01\\\\-18.16406\\\\233.0441\\\\328.01\\\\-20.50781\\\\233.1397\\\\328.01\\\\-34.57031\\\\233.1568\\\\328.01\\\\-43.94531\\\\233.1397\\\\328.01\\\\-48.63281\\\\233.1736\\\\328.01\\\\-58.00781\\\\233.19\\\\328.01\\\\-60.35156\\\\233.3635\\\\328.01\\\\-62.69531\\\\233.7748\\\\328.01\\\\-65.03906\\\\232.6767\\\\328.01\\\\-69.72656\\\\232.9839\\\\328.01\\\\-81.44531\\\\233.0537\\\\328.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"562\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"19\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-15.82031\\\\230.0018\\\\331.01\\\\-18.16406\\\\232.6603\\\\331.01\\\\-20.50781\\\\233.131\\\\331.01\\\\-29.88281\\\\233.131\\\\331.01\\\\-43.94531\\\\233.1568\\\\331.01\\\\-53.32031\\\\233.1981\\\\331.01\\\\-58.00781\\\\233.19\\\\331.01\\\\-62.69531\\\\233.3017\\\\331.01\\\\-65.03906\\\\232.9665\\\\331.01\\\\-67.38281\\\\232.9081\\\\331.01\\\\-72.07031\\\\233.0441\\\\331.01\\\\-76.75781\\\\233.0382\\\\331.01\\\\-81.44531\\\\233.0859\\\\331.01\\\\-86.13281\\\\233.0671\\\\331.01\\\\-88.47656\\\\233.1042\\\\331.01\\\\-95.50781\\\\233.1132\\\\331.01\\\\-97.85156\\\\234.054\\\\331.01\\\\-104.8828\\\\234.2191\\\\331.01\\\\-107.2266\\\\234.1551\\\\331.01\\\\-111.9141\\\\234.2039\\\\331.01\\\\-114.2578\\\\234.1596\\\\331.01\\\\-123.6328\\\\234.2233\\\\331.01\\\\-125.9766\\\\234.1641\\\\331.01\\\\-135.3516\\\\234.1174\\\\331.01\\\\-142.3828\\\\234.1785\\\\331.01\\\\-147.0703\\\\234.0904\\\\331.01\\\\-158.7891\\\\234.1085\\\\331.01\\\\-165.8203\\\\234.0952\\\\331.01\\\\-168.1641\\\\234.2214\\\\331.01\\\\-177.5391\\\\234.2835\\\\331.01\\\\-182.2266\\\\234.2539\\\\331.01\\\\-186.9141\\\\234.2902\\\\331.01\\\\-189.2578\\\\234.2431\\\\331.01\\\\-191.6016\\\\234.2902\\\\331.01\\\\-198.6328\\\\234.3084\\\\331.01\\\\-200.9766\\\\234.3864\\\\331.01\\\\-203.3203\\\\234.3235\\\\331.01\\\\-208.0078\\\\234.3115\\\\331.01\\\\-212.6953\\\\234.4578\\\\331.01\\\\-215.0391\\\\234.4266\\\\331.01\\\\-219.7266\\\\234.5859\\\\331.01\\\\-222.0703\\\\234.6051\\\\331.01\\\\-224.4141\\\\234.5285\\\\331.01\\\\-229.1016\\\\234.5121\\\\331.01\\\\-233.7891\\\\234.3601\\\\331.01\\\\-238.4766\\\\234.2935\\\\331.01\\\\-243.1641\\\\234.1026\\\\331.01\\\\-245.5078\\\\233.8227\\\\331.01\\\\-247.8516\\\\233.6637\\\\331.01\\\\-250.1953\\\\233.665\\\\331.01\\\\-252.0243\\\\234.7172\\\\331.01\\\\-252.5391\\\\236.7571\\\\331.01\\\\-253.125\\\\237.0609\\\\331.01\\\\-252.5391\\\\237.1236\\\\331.01\\\\-250.1953\\\\237.9965\\\\331.01\\\\-247.8516\\\\238.0423\\\\331.01\\\\-236.1328\\\\238.0359\\\\331.01\\\\-229.1016\\\\238.0082\\\\331.01\\\\-226.7578\\\\238.0391\\\\331.01\\\\-219.7266\\\\238.0207\\\\331.01\\\\-215.0391\\\\238.0838\\\\331.01\\\\-210.3516\\\\238.0525\\\\331.01\\\\-208.0078\\\\238.1037\\\\331.01\\\\-198.6328\\\\238.1236\\\\331.01\\\\-196.2891\\\\238.1015\\\\331.01\\\\-191.6016\\\\238.1621\\\\331.01\\\\-186.9141\\\\238.0992\\\\331.01\\\\-182.2266\\\\238.1527\\\\331.01\\\\-172.8516\\\\238.1823\\\\331.01\\\\-163.4766\\\\238.1513\\\\331.01\\\\-156.4453\\\\238.192\\\\331.01\\\\-154.1016\\\\238.1706\\\\331.01\\\\-144.7266\\\\238.192\\\\331.01\\\\-142.3828\\\\238.2227\\\\331.01\\\\-137.6953\\\\238.1717\\\\331.01\\\\-133.0078\\\\238.2124\\\\331.01\\\\-128.3203\\\\238.1483\\\\331.01\\\\-125.9766\\\\238.2014\\\\331.01\\\\-116.6016\\\\238.1596\\\\331.01\\\\-100.1953\\\\238.1906\\\\331.01\\\\-93.16406\\\\238.1906\\\\331.01\\\\-88.47656\\\\238.1483\\\\331.01\\\\-79.10156\\\\238.2014\\\\331.01\\\\-74.41406\\\\238.1513\\\\331.01\\\\-69.72656\\\\238.1717\\\\331.01\\\\-62.69531\\\\238.1498\\\\331.01\\\\-58.00781\\\\238.1717\\\\331.01\\\\-48.63281\\\\238.1197\\\\331.01\\\\-43.94531\\\\238.1609\\\\331.01\\\\-41.60156\\\\238.1309\\\\331.01\\\\-29.88281\\\\238.1498\\\\331.01\\\\-25.19531\\\\238.1156\\\\331.01\\\\-15.82031\\\\238.1582\\\\331.01\\\\-8.789063\\\\238.1156\\\\331.01\\\\-6.445313\\\\238.1582\\\\331.01\\\\0.5859375\\\\238.1596\\\\331.01\\\\5.273438\\\\238.1272\\\\331.01\\\\12.30469\\\\238.1796\\\\331.01\\\\16.99219\\\\238.1695\\\\331.01\\\\24.02344\\\\238.0968\\\\331.01\\\\26.36719\\\\238.1061\\\\331.01\\\\31.05469\\\\238.0254\\\\331.01\\\\45.11719\\\\238.0254\\\\331.01\\\\49.80469\\\\237.9679\\\\331.01\\\\52.14844\\\\237.9883\\\\331.01\\\\59.17969\\\\237.9553\\\\331.01\\\\63.86719\\\\237.9632\\\\331.01\\\\66.21094\\\\237.9217\\\\331.01\\\\77.92969\\\\237.9347\\\\331.01\\\\80.27344\\\\237.8105\\\\331.01\\\\82.61719\\\\237.9372\\\\331.01\\\\84.96094\\\\237.4751\\\\331.01\\\\87.30469\\\\237.8936\\\\331.01\\\\89.64844\\\\237.9217\\\\331.01\\\\91.99219\\\\237.7291\\\\331.01\\\\94.33594\\\\237.2086\\\\331.01\\\\99.02344\\\\237.2496\\\\331.01\\\\101.3672\\\\236.9089\\\\331.01\\\\106.0547\\\\236.8813\\\\331.01\\\\110.7422\\\\236.9438\\\\331.01\\\\117.7734\\\\236.8147\\\\331.01\\\\124.8047\\\\236.8069\\\\331.01\\\\131.8359\\\\236.8627\\\\331.01\\\\134.1797\\\\236.7867\\\\331.01\\\\141.2109\\\\236.7996\\\\331.01\\\\150.5859\\\\236.7134\\\\331.01\\\\152.9297\\\\236.7413\\\\331.01\\\\157.6172\\\\236.6997\\\\331.01\\\\162.3047\\\\236.7022\\\\331.01\\\\171.6797\\\\236.6496\\\\331.01\\\\181.0547\\\\236.6756\\\\331.01\\\\185.7422\\\\236.5877\\\\331.01\\\\190.4297\\\\236.5877\\\\331.01\\\\195.1172\\\\236.5409\\\\331.01\\\\199.8047\\\\236.5758\\\\331.01\\\\206.8359\\\\236.515\\\\331.01\\\\225.5859\\\\236.4299\\\\331.01\\\\227.9297\\\\236.4541\\\\331.01\\\\239.6484\\\\236.4137\\\\331.01\\\\246.6797\\\\236.4174\\\\331.01\\\\249.0234\\\\236.3047\\\\331.01\\\\251.3672\\\\235.5069\\\\331.01\\\\253.7109\\\\236.5074\\\\331.01\\\\254.3945\\\\237.0609\\\\331.01\\\\255.8271\\\\239.4047\\\\331.01\\\\255.6086\\\\241.7484\\\\331.01\\\\254.6224\\\\244.0922\\\\331.01\\\\253.7109\\\\245.1008\\\\331.01\\\\252.7054\\\\246.4359\\\\331.01\\\\251.3672\\\\248.4433\\\\331.01\\\\248.6766\\\\251.1234\\\\331.01\\\\246.6797\\\\253.313\\\\331.01\\\\244.3359\\\\255.5254\\\\331.01\\\\239.5975\\\\260.4984\\\\331.01\\\\232.5846\\\\267.5297\\\\331.01\\\\230.2734\\\\269.8828\\\\331.01\\\\227.9297\\\\272.1213\\\\331.01\\\\225.5859\\\\274.5504\\\\331.01\\\\218.4426\\\\281.5922\\\\331.01\\\\215.9517\\\\283.9359\\\\331.01\\\\213.5485\\\\286.2797\\\\331.01\\\\211.5234\\\\288.0286\\\\331.01\\\\209.1797\\\\289.5822\\\\331.01\\\\206.8359\\\\290.8047\\\\331.01\\\\199.8047\\\\290.6986\\\\331.01\\\\197.4609\\\\290.7428\\\\331.01\\\\195.1172\\\\290.1895\\\\331.01\\\\190.4297\\\\290.0456\\\\331.01\\\\185.7422\\\\289.9906\\\\331.01\\\\169.3359\\\\290.0001\\\\331.01\\\\166.9922\\\\289.9612\\\\331.01\\\\159.9609\\\\289.9643\\\\331.01\\\\152.9297\\\\289.9091\\\\331.01\\\\134.1797\\\\289.9193\\\\331.01\\\\129.4922\\\\289.8967\\\\331.01\\\\120.1172\\\\289.9292\\\\331.01\\\\113.0859\\\\289.8948\\\\331.01\\\\108.3984\\\\289.9267\\\\331.01\\\\96.67969\\\\289.8987\\\\331.01\\\\94.33594\\\\289.9418\\\\331.01\\\\87.30469\\\\289.9091\\\\331.01\\\\84.96094\\\\289.9418\\\\331.01\\\\77.92969\\\\289.9091\\\\331.01\\\\68.55469\\\\289.9418\\\\331.01\\\\63.86719\\\\289.8967\\\\331.01\\\\56.83594\\\\289.9418\\\\331.01\\\\52.14844\\\\289.9069\\\\331.01\\\\47.46094\\\\289.9418\\\\331.01\\\\42.77344\\\\289.8967\\\\331.01\\\\35.74219\\\\289.9292\\\\331.01\\\\16.99219\\\\289.9319\\\\331.01\\\\5.273438\\\\289.8967\\\\331.01\\\\2.929688\\\\289.9418\\\\331.01\\\\-1.757813\\\\289.9193\\\\331.01\\\\-11.13281\\\\289.9739\\\\331.01\\\\-22.85156\\\\289.9643\\\\331.01\\\\-32.22656\\\\290.0094\\\\331.01\\\\-36.91406\\\\290.0001\\\\331.01\\\\-43.94531\\\\290.0409\\\\331.01\\\\-53.32031\\\\290.0094\\\\331.01\\\\-62.69531\\\\290.0409\\\\331.01\\\\-72.07031\\\\290.032\\\\331.01\\\\-74.41406\\\\290.0545\\\\331.01\\\\-76.75781\\\\290.5839\\\\331.01\\\\-79.10156\\\\290.2641\\\\331.01\\\\-81.44531\\\\290.7153\\\\331.01\\\\-83.78906\\\\290.9129\\\\331.01\\\\-86.13281\\\\290.1897\\\\331.01\\\\-88.47656\\\\290.5401\\\\331.01\\\\-90.82031\\\\291.2065\\\\331.01\\\\-93.16406\\\\291.1611\\\\331.01\\\\-95.50781\\\\291.3054\\\\331.01\\\\-97.85156\\\\291.2781\\\\331.01\\\\-104.8828\\\\291.3188\\\\331.01\\\\-107.2266\\\\291.2918\\\\331.01\\\\-111.9141\\\\291.3319\\\\331.01\\\\-114.2578\\\\291.3054\\\\331.01\\\\-121.2891\\\\291.3578\\\\331.01\\\\-125.9766\\\\291.3319\\\\331.01\\\\-133.0078\\\\291.3954\\\\331.01\\\\-175.1953\\\\291.5322\\\\331.01\\\\-182.2266\\\\291.5427\\\\331.01\\\\-191.6016\\\\291.6034\\\\331.01\\\\-200.9766\\\\291.5935\\\\331.01\\\\-205.6641\\\\292.3098\\\\331.01\\\\-208.0078\\\\292.3435\\\\331.01\\\\-210.3516\\\\292.0615\\\\331.01\\\\-211.9404\\\\290.9672\\\\331.01\\\\-212.6953\\\\290.2194\\\\331.01\\\\-215.0391\\\\288.6748\\\\331.01\\\\-219.7266\\\\284.4174\\\\331.01\\\\-229.1016\\\\275.1351\\\\331.01\\\\-231.4453\\\\272.9203\\\\331.01\\\\-232.0349\\\\272.2172\\\\331.01\\\\-233.7891\\\\270.4738\\\\331.01\\\\-236.1328\\\\268.2849\\\\331.01\\\\-238.4766\\\\265.8145\\\\331.01\\\\-240.8203\\\\263.537\\\\331.01\\\\-243.7982\\\\260.4984\\\\331.01\\\\-247.8516\\\\256.5038\\\\331.01\\\\-250.1953\\\\254.0828\\\\331.01\\\\-252.5391\\\\251.896\\\\331.01\\\\-254.8828\\\\249.3695\\\\331.01\\\\-255.6047\\\\248.7797\\\\331.01\\\\-257.5359\\\\246.4359\\\\331.01\\\\-258.3608\\\\244.0922\\\\331.01\\\\-258.3411\\\\241.7484\\\\331.01\\\\-257.8627\\\\239.4047\\\\331.01\\\\-257.2266\\\\238.6151\\\\331.01\\\\-255.1194\\\\237.0609\\\\331.01\\\\-257.2266\\\\235.0688\\\\331.01\\\\-259.5703\\\\235.9095\\\\331.01\\\\-261.0516\\\\237.0609\\\\331.01\\\\-261.9141\\\\238.0086\\\\331.01\\\\-262.9709\\\\239.4047\\\\331.01\\\\-263.0859\\\\241.7484\\\\331.01\\\\-262.7175\\\\244.0922\\\\331.01\\\\-261.9141\\\\245.282\\\\331.01\\\\-259.5703\\\\248.3058\\\\331.01\\\\-259.0049\\\\248.7797\\\\331.01\\\\-255.4084\\\\253.4672\\\\331.01\\\\-252.5391\\\\256.6166\\\\331.01\\\\-250.1953\\\\258.8892\\\\331.01\\\\-247.8516\\\\261.3909\\\\331.01\\\\-246.2402\\\\262.8422\\\\331.01\\\\-244.0969\\\\265.1859\\\\331.01\\\\-241.6044\\\\267.5297\\\\331.01\\\\-239.4219\\\\269.8734\\\\331.01\\\\-237.0058\\\\272.2172\\\\331.01\\\\-231.4453\\\\277.8564\\\\331.01\\\\-229.8974\\\\279.2484\\\\331.01\\\\-226.7578\\\\282.5503\\\\331.01\\\\-225.2042\\\\283.9359\\\\331.01\\\\-222.0703\\\\287.2617\\\\331.01\\\\-220.5943\\\\288.6234\\\\331.01\\\\-218.3789\\\\290.9672\\\\331.01\\\\-215.0295\\\\293.3109\\\\331.01\\\\-212.6953\\\\294.6589\\\\331.01\\\\-210.3516\\\\295.2362\\\\331.01\\\\-209.869\\\\295.6547\\\\331.01\\\\-208.0078\\\\296.4917\\\\331.01\\\\-205.6641\\\\296.8928\\\\331.01\\\\-203.3203\\\\297.1297\\\\331.01\\\\-196.2891\\\\297.0883\\\\331.01\\\\-193.9453\\\\296.959\\\\331.01\\\\-182.2266\\\\296.9206\\\\331.01\\\\-177.5391\\\\296.8568\\\\331.01\\\\-165.8203\\\\296.85\\\\331.01\\\\-158.7891\\\\296.8757\\\\331.01\\\\-151.7578\\\\296.8266\\\\331.01\\\\-144.7266\\\\296.8852\\\\331.01\\\\-140.0391\\\\296.8437\\\\331.01\\\\-135.3516\\\\296.8618\\\\331.01\\\\-130.6641\\\\296.8089\\\\331.01\\\\-109.5703\\\\296.9242\\\\331.01\\\\-97.85156\\\\296.8545\\\\331.01\\\\-90.82031\\\\296.8927\\\\331.01\\\\-83.78906\\\\296.8837\\\\331.01\\\\-76.75781\\\\296.9409\\\\331.01\\\\-55.66406\\\\296.934\\\\331.01\\\\-50.97656\\\\296.9053\\\\331.01\\\\-43.94531\\\\296.9191\\\\331.01\\\\-39.25781\\\\297.0516\\\\331.01\\\\-36.91406\\\\296.8688\\\\331.01\\\\-32.22656\\\\296.9207\\\\331.01\\\\-27.53906\\\\296.8888\\\\331.01\\\\-25.19531\\\\297.2621\\\\331.01\\\\-22.85156\\\\296.8985\\\\331.01\\\\-18.16406\\\\296.9489\\\\331.01\\\\-15.82031\\\\297.2814\\\\331.01\\\\-13.47656\\\\296.9067\\\\331.01\\\\-8.789063\\\\296.9285\\\\331.01\\\\7.617188\\\\296.8574\\\\331.01\\\\12.30469\\\\296.8579\\\\331.01\\\\21.67969\\\\296.7843\\\\331.01\\\\38.08594\\\\296.734\\\\331.01\\\\54.49219\\\\296.7043\\\\331.01\\\\59.17969\\\\296.6518\\\\331.01\\\\70.89844\\\\296.6068\\\\331.01\\\\80.27344\\\\296.549\\\\331.01\\\\87.30469\\\\296.5412\\\\331.01\\\\94.33594\\\\296.5005\\\\331.01\\\\101.3672\\\\296.4257\\\\331.01\\\\103.7109\\\\296.4801\\\\331.01\\\\115.4297\\\\296.3782\\\\331.01\\\\124.8047\\\\296.3703\\\\331.01\\\\129.4922\\\\296.3288\\\\331.01\\\\131.8359\\\\295.9433\\\\331.01\\\\134.1797\\\\295.9857\\\\331.01\\\\138.8672\\\\295.864\\\\331.01\\\\143.5547\\\\295.939\\\\331.01\\\\145.8984\\\\295.864\\\\331.01\\\\152.9297\\\\295.8172\\\\331.01\\\\159.9609\\\\295.8172\\\\331.01\\\\164.6484\\\\295.7516\\\\331.01\\\\171.6797\\\\295.7173\\\\331.01\\\\176.3672\\\\295.6454\\\\331.01\\\\183.3984\\\\295.6998\\\\331.01\\\\188.0859\\\\295.5742\\\\331.01\\\\192.7734\\\\295.6093\\\\331.01\\\\197.4609\\\\295.8486\\\\331.01\\\\202.1484\\\\295.7849\\\\331.01\\\\204.4922\\\\295.4439\\\\331.01\\\\206.8359\\\\294.8185\\\\331.01\\\\209.1797\\\\294.3828\\\\331.01\\\\211.5234\\\\292.5155\\\\331.01\\\\213.8672\\\\291.2065\\\\331.01\\\\216.2109\\\\289.6192\\\\331.01\\\\217.2678\\\\288.6234\\\\331.01\\\\218.5547\\\\287.1143\\\\331.01\\\\221.8249\\\\283.9359\\\\331.01\\\\225.5859\\\\279.9988\\\\331.01\\\\227.9297\\\\277.6831\\\\331.01\\\\230.2734\\\\275.1513\\\\331.01\\\\233.3252\\\\272.2172\\\\331.01\\\\234.9609\\\\270.4053\\\\331.01\\\\237.8731\\\\267.5297\\\\331.01\\\\240.1012\\\\265.1859\\\\331.01\\\\242.4443\\\\262.8422\\\\331.01\\\\251.4558\\\\253.4672\\\\331.01\\\\253.4477\\\\251.1234\\\\331.01\\\\256.0547\\\\248.2287\\\\331.01\\\\257.4762\\\\246.4359\\\\331.01\\\\259.8178\\\\244.0922\\\\331.01\\\\261.7753\\\\239.4047\\\\331.01\\\\261.0251\\\\237.0609\\\\331.01\\\\259.4941\\\\234.7172\\\\331.01\\\\258.3984\\\\233.6932\\\\331.01\\\\256.0547\\\\233.0961\\\\331.01\\\\253.7109\\\\232.9379\\\\331.01\\\\251.3672\\\\233.7695\\\\331.01\\\\249.0234\\\\232.8723\\\\331.01\\\\246.6797\\\\232.8195\\\\331.01\\\\241.9922\\\\233.0305\\\\331.01\\\\237.3047\\\\233.0305\\\\331.01\\\\232.6172\\\\233.1001\\\\331.01\\\\227.9297\\\\233.0686\\\\331.01\\\\225.5859\\\\233.1001\\\\331.01\\\\220.8984\\\\233.0726\\\\331.01\\\\211.5234\\\\233.0726\\\\331.01\\\\206.8359\\\\233.0441\\\\331.01\\\\202.1484\\\\232.6179\\\\331.01\\\\195.1172\\\\232.7456\\\\331.01\\\\178.7109\\\\232.7719\\\\331.01\\\\174.0234\\\\232.7456\\\\331.01\\\\162.3047\\\\232.7322\\\\331.01\\\\157.6172\\\\232.7875\\\\331.01\\\\150.5859\\\\232.8253\\\\331.01\\\\143.5547\\\\232.8253\\\\331.01\\\\138.8672\\\\232.6643\\\\331.01\\\\131.8359\\\\232.6477\\\\331.01\\\\129.4922\\\\231.969\\\\331.01\\\\127.1484\\\\231.7258\\\\331.01\\\\124.8047\\\\231.7518\\\\331.01\\\\122.4609\\\\232.4013\\\\331.01\\\\120.1172\\\\232.6788\\\\331.01\\\\113.0859\\\\232.7875\\\\331.01\\\\108.3984\\\\232.7481\\\\331.01\\\\103.7109\\\\231.505\\\\331.01\\\\102.6762\\\\232.3734\\\\331.01\\\\101.3672\\\\233.0766\\\\331.01\\\\99.02344\\\\233.1483\\\\331.01\\\\96.67969\\\\233.1221\\\\331.01\\\\89.64844\\\\233.1483\\\\331.01\\\\84.96094\\\\233.1221\\\\331.01\\\\80.27344\\\\233.1483\\\\331.01\\\\75.58594\\\\233.131\\\\331.01\\\\61.52344\\\\233.1397\\\\331.01\\\\59.17969\\\\233.1736\\\\331.01\\\\54.49219\\\\233.131\\\\331.01\\\\47.46094\\\\233.1397\\\\331.01\\\\45.11719\\\\233.1132\\\\331.01\\\\44.1435\\\\232.3734\\\\331.01\\\\42.77344\\\\231.0613\\\\331.01\\\\42.00247\\\\230.0297\\\\331.01\\\\42.77344\\\\229.1878\\\\331.01\\\\45.11719\\\\228.3765\\\\331.01\\\\47.46094\\\\226.8637\\\\331.01\\\\49.80469\\\\225.7647\\\\331.01\\\\52.14844\\\\224.4265\\\\331.01\\\\54.49219\\\\223.3249\\\\331.01\\\\59.17969\\\\219.9393\\\\331.01\\\\61.52344\\\\218.3393\\\\331.01\\\\63.86719\\\\216.5828\\\\331.01\\\\66.21094\\\\214.673\\\\331.01\\\\67.32799\\\\213.6234\\\\331.01\\\\72.01612\\\\208.9359\\\\331.01\\\\74.09509\\\\206.5922\\\\331.01\\\\76.07555\\\\204.2484\\\\331.01\\\\77.53638\\\\201.9047\\\\331.01\\\\77.92969\\\\201.4729\\\\331.01\\\\81.07359\\\\197.2172\\\\331.01\\\\82.12826\\\\194.8734\\\\331.01\\\\82.61719\\\\194.3306\\\\331.01\\\\83.8237\\\\192.5297\\\\331.01\\\\84.79842\\\\190.1859\\\\331.01\\\\85.95763\\\\187.8422\\\\331.01\\\\86.92441\\\\185.4984\\\\331.01\\\\88.28735\\\\183.1547\\\\331.01\\\\88.71695\\\\180.8109\\\\331.01\\\\89.3761\\\\178.4672\\\\331.01\\\\90.33585\\\\176.1234\\\\331.01\\\\90.93139\\\\173.7797\\\\331.01\\\\91.42718\\\\171.4359\\\\331.01\\\\92.2997\\\\169.0922\\\\331.01\\\\92.84734\\\\166.7484\\\\331.01\\\\93.04629\\\\164.4047\\\\331.01\\\\93.26022\\\\157.3734\\\\331.01\\\\93.2657\\\\152.6859\\\\331.01\\\\93.16406\\\\147.9984\\\\331.01\\\\92.9856\\\\143.3109\\\\331.01\\\\92.63075\\\\140.9672\\\\331.01\\\\91.86198\\\\138.6234\\\\331.01\\\\91.20483\\\\136.2797\\\\331.01\\\\90.71938\\\\133.9359\\\\331.01\\\\90.07662\\\\131.5922\\\\331.01\\\\89.03426\\\\129.2484\\\\331.01\\\\88.59089\\\\126.9047\\\\331.01\\\\87.9126\\\\124.5609\\\\331.01\\\\86.48499\\\\122.2172\\\\331.01\\\\85.62569\\\\119.8734\\\\331.01\\\\84.24227\\\\117.5297\\\\331.01\\\\83.30611\\\\115.1859\\\\331.01\\\\81.58318\\\\112.8422\\\\331.01\\\\80.28274\\\\110.4984\\\\331.01\\\\78.78014\\\\108.1547\\\\331.01\\\\76.8465\\\\105.8109\\\\331.01\\\\75.58594\\\\104.1452\\\\331.01\\\\70.89844\\\\98.8085\\\\331.01\\\\68.55469\\\\96.42617\\\\331.01\\\\66.21094\\\\94.49095\\\\331.01\\\\63.14011\\\\91.74844\\\\331.01\\\\61.52344\\\\90.55122\\\\331.01\\\\59.17969\\\\88.55907\\\\331.01\\\\56.83594\\\\87.2702\\\\331.01\\\\54.49219\\\\85.83469\\\\331.01\\\\52.14844\\\\84.10928\\\\331.01\\\\49.80469\\\\83.22182\\\\331.01\\\\47.46094\\\\81.90617\\\\331.01\\\\45.11719\\\\80.96379\\\\331.01\\\\43.32682\\\\80.02969\\\\331.01\\\\42.77344\\\\79.62586\\\\331.01\\\\40.42969\\\\78.84627\\\\331.01\\\\38.08594\\\\78.46938\\\\331.01\\\\33.39844\\\\76.78945\\\\331.01\\\\28.71094\\\\75.85264\\\\331.01\\\\26.36719\\\\75.06985\\\\331.01\\\\24.02344\\\\74.54173\\\\331.01\\\\21.67969\\\\74.41319\\\\331.01\\\\14.64844\\\\74.19387\\\\331.01\\\\12.30469\\\\74.18209\\\\331.01\\\\7.617188\\\\74.26453\\\\331.01\\\\2.929688\\\\74.44027\\\\331.01\\\\0.5859375\\\\74.71766\\\\331.01\\\\-4.101563\\\\76.07934\\\\331.01\\\\-6.445313\\\\76.52496\\\\331.01\\\\-8.789063\\\\77.12093\\\\331.01\\\\-11.13281\\\\78.13784\\\\331.01\\\\-15.82031\\\\79.21476\\\\331.01\\\\-18.16406\\\\80.64018\\\\331.01\\\\-20.50781\\\\81.58089\\\\331.01\\\\-22.85156\\\\82.93452\\\\331.01\\\\-25.19531\\\\83.7171\\\\331.01\\\\-27.53906\\\\85.53682\\\\331.01\\\\-29.88281\\\\86.56181\\\\331.01\\\\-32.22656\\\\88.24535\\\\331.01\\\\-34.57031\\\\90.17438\\\\331.01\\\\-36.86355\\\\91.74844\\\\331.01\\\\-39.25781\\\\93.65373\\\\331.01\\\\-41.60156\\\\95.64732\\\\331.01\\\\-43.94531\\\\98.08269\\\\331.01\\\\-46.99951\\\\101.1234\\\\331.01\\\\-50.52413\\\\105.8109\\\\331.01\\\\-50.97656\\\\106.3405\\\\331.01\\\\-53.99293\\\\110.4984\\\\331.01\\\\-56.84198\\\\115.1859\\\\331.01\\\\-57.84288\\\\117.5297\\\\331.01\\\\-59.19744\\\\119.8734\\\\331.01\\\\-60.39734\\\\122.2172\\\\331.01\\\\-61.32914\\\\124.5609\\\\331.01\\\\-61.87757\\\\126.9047\\\\331.01\\\\-63.0335\\\\129.2484\\\\331.01\\\\-63.83955\\\\131.5922\\\\331.01\\\\-64.25171\\\\133.9359\\\\331.01\\\\-65.59342\\\\138.6234\\\\331.01\\\\-66.13319\\\\143.3109\\\\331.01\\\\-66.54406\\\\147.9984\\\\331.01\\\\-66.85014\\\\152.6859\\\\331.01\\\\-66.87236\\\\155.0297\\\\331.01\\\\-66.69005\\\\159.7172\\\\331.01\\\\-66.30065\\\\164.4047\\\\331.01\\\\-65.77621\\\\169.0922\\\\331.01\\\\-65.40382\\\\171.4359\\\\331.01\\\\-64.53993\\\\173.7797\\\\331.01\\\\-64.07877\\\\176.1234\\\\331.01\\\\-63.49142\\\\178.4672\\\\331.01\\\\-62.30469\\\\180.8109\\\\331.01\\\\-61.53546\\\\183.1547\\\\331.01\\\\-61.04526\\\\185.4984\\\\331.01\\\\-59.60582\\\\187.8422\\\\331.01\\\\-58.66488\\\\190.1859\\\\331.01\\\\-57.16698\\\\192.5297\\\\331.01\\\\-56.36295\\\\194.8734\\\\331.01\\\\-55.66406\\\\195.7081\\\\331.01\\\\-53.32031\\\\199.0835\\\\331.01\\\\-52.89063\\\\199.5609\\\\331.01\\\\-51.73193\\\\201.9047\\\\331.01\\\\-49.63058\\\\204.2484\\\\331.01\\\\-47.6863\\\\206.5922\\\\331.01\\\\-45.43213\\\\208.9359\\\\331.01\\\\-43.27911\\\\211.2797\\\\331.01\\\\-41.60156\\\\212.8009\\\\331.01\\\\-39.25781\\\\215.0557\\\\331.01\\\\-36.91406\\\\216.9837\\\\331.01\\\\-34.57031\\\\219.0804\\\\331.01\\\\-32.22656\\\\220.3119\\\\331.01\\\\-29.88281\\\\221.9844\\\\331.01\\\\-27.53906\\\\223.8002\\\\331.01\\\\-25.19531\\\\224.6377\\\\331.01\\\\-22.85156\\\\226.1792\\\\331.01\\\\-20.50781\\\\227.1868\\\\331.01\\\\-18.16406\\\\228.6441\\\\331.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n"; -const char* k_rtStruct_json05 = -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"567\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-15.98772\\\\230.0297\\\\334.01\\\\-18.16406\\\\232.5688\\\\334.01\\\\-20.50781\\\\233.1397\\\\334.01\\\\-34.57031\\\\233.1397\\\\334.01\\\\-41.60156\\\\233.1981\\\\334.01\\\\-46.28906\\\\233.1652\\\\334.01\\\\-50.97656\\\\233.2061\\\\334.01\\\\-62.69531\\\\233.1981\\\\334.01\\\\-67.38281\\\\232.9839\\\\334.01\\\\-72.07031\\\\233.0766\\\\334.01\\\\-81.44531\\\\233.1042\\\\334.01\\\\-86.13281\\\\233.0766\\\\334.01\\\\-90.82031\\\\233.131\\\\334.01\\\\-93.16406\\\\233.4871\\\\334.01\\\\-95.50781\\\\233.1884\\\\334.01\\\\-97.85156\\\\234.1127\\\\334.01\\\\-104.8828\\\\234.2828\\\\334.01\\\\-107.2266\\\\234.215\\\\334.01\\\\-109.5703\\\\234.2828\\\\334.01\\\\-116.6016\\\\234.2703\\\\334.01\\\\-121.2891\\\\234.303\\\\334.01\\\\-130.6641\\\\234.2081\\\\334.01\\\\-133.0078\\\\234.2426\\\\334.01\\\\-137.6953\\\\234.2081\\\\334.01\\\\-142.3828\\\\234.3198\\\\334.01\\\\-147.0703\\\\234.2191\\\\334.01\\\\-156.4453\\\\234.1685\\\\334.01\\\\-158.7891\\\\234.2273\\\\334.01\\\\-161.1328\\\\234.1641\\\\334.01\\\\-165.8203\\\\234.1641\\\\334.01\\\\-168.1641\\\\234.3426\\\\334.01\\\\-175.1953\\\\234.3328\\\\334.01\\\\-177.5391\\\\234.381\\\\334.01\\\\-179.8828\\\\234.3426\\\\334.01\\\\-186.9141\\\\234.3837\\\\334.01\\\\-189.2578\\\\234.3359\\\\334.01\\\\-193.9453\\\\234.4194\\\\334.01\\\\-198.6328\\\\234.4053\\\\334.01\\\\-200.9766\\\\234.4535\\\\334.01\\\\-203.3203\\\\234.4053\\\\334.01\\\\-208.0078\\\\234.4078\\\\334.01\\\\-212.6953\\\\234.5484\\\\334.01\\\\-215.0391\\\\234.5301\\\\334.01\\\\-219.7266\\\\234.6855\\\\334.01\\\\-224.4141\\\\234.6051\\\\334.01\\\\-231.4453\\\\234.5285\\\\334.01\\\\-243.1641\\\\234.1437\\\\334.01\\\\-247.8516\\\\233.6847\\\\334.01\\\\-250.1953\\\\233.672\\\\334.01\\\\-252.0368\\\\234.7172\\\\334.01\\\\-252.5391\\\\236.6006\\\\334.01\\\\-253.2552\\\\237.0609\\\\334.01\\\\-252.5391\\\\237.1579\\\\334.01\\\\-250.1953\\\\238.0169\\\\334.01\\\\-247.8516\\\\238.0779\\\\334.01\\\\-243.1641\\\\238.0359\\\\334.01\\\\-222.0703\\\\238.0611\\\\334.01\\\\-215.0391\\\\238.1343\\\\334.01\\\\-210.3516\\\\238.1037\\\\334.01\\\\-203.3203\\\\238.1419\\\\334.01\\\\-193.9453\\\\238.1633\\\\334.01\\\\-186.9141\\\\238.0901\\\\334.01\\\\-175.1953\\\\238.2427\\\\334.01\\\\-163.4766\\\\238.1727\\\\334.01\\\\-156.4453\\\\238.2124\\\\334.01\\\\-144.7266\\\\238.192\\\\334.01\\\\-142.3828\\\\238.2328\\\\334.01\\\\-137.6953\\\\238.1927\\\\334.01\\\\-114.2578\\\\238.2009\\\\334.01\\\\-109.5703\\\\238.1609\\\\334.01\\\\-102.5391\\\\238.202\\\\334.01\\\\-97.85156\\\\238.1609\\\\334.01\\\\-93.16406\\\\238.1906\\\\334.01\\\\-88.47656\\\\238.1369\\\\334.01\\\\-86.13281\\\\238.1695\\\\334.01\\\\-81.44531\\\\238.1483\\\\334.01\\\\-76.75781\\\\238.1913\\\\334.01\\\\-67.38281\\\\238.1386\\\\334.01\\\\-65.03906\\\\238.1596\\\\334.01\\\\-53.32031\\\\238.1197\\\\334.01\\\\-43.94531\\\\238.1498\\\\334.01\\\\-32.22656\\\\238.1197\\\\334.01\\\\-25.19531\\\\238.1483\\\\334.01\\\\-22.85156\\\\238.1084\\\\334.01\\\\-18.16406\\\\238.1483\\\\334.01\\\\-8.789063\\\\238.1156\\\\334.01\\\\-1.757813\\\\238.1483\\\\334.01\\\\2.929688\\\\238.1177\\\\334.01\\\\14.64844\\\\238.1369\\\\334.01\\\\28.71094\\\\238.073\\\\334.01\\\\42.77344\\\\237.9922\\\\334.01\\\\47.46094\\\\238.0047\\\\334.01\\\\54.49219\\\\237.9503\\\\334.01\\\\61.52344\\\\237.9583\\\\334.01\\\\66.21094\\\\237.9084\\\\334.01\\\\70.89844\\\\237.9294\\\\334.01\\\\77.92969\\\\237.9084\\\\334.01\\\\82.61719\\\\237.9318\\\\334.01\\\\84.96094\\\\237.4483\\\\334.01\\\\87.30469\\\\237.4347\\\\334.01\\\\89.64844\\\\237.735\\\\334.01\\\\91.99219\\\\236.9602\\\\334.01\\\\96.67969\\\\236.8598\\\\334.01\\\\99.02344\\\\236.9089\\\\334.01\\\\103.7109\\\\236.9145\\\\334.01\\\\108.3984\\\\236.8773\\\\334.01\\\\113.0859\\\\236.9438\\\\334.01\\\\117.7734\\\\236.8147\\\\334.01\\\\127.1484\\\\236.8051\\\\334.01\\\\131.8359\\\\236.88\\\\334.01\\\\136.5234\\\\236.7721\\\\334.01\\\\141.2109\\\\236.7996\\\\334.01\\\\143.5547\\\\236.7556\\\\334.01\\\\152.9297\\\\236.7134\\\\334.01\\\\155.2734\\\\236.673\\\\334.01\\\\159.9609\\\\236.7413\\\\334.01\\\\174.0234\\\\236.612\\\\334.01\\\\176.3672\\\\236.6756\\\\334.01\\\\181.0547\\\\236.6625\\\\334.01\\\\185.7422\\\\236.564\\\\334.01\\\\190.4297\\\\236.5997\\\\334.01\\\\197.4609\\\\236.5524\\\\334.01\\\\199.8047\\\\236.5758\\\\334.01\\\\206.8359\\\\236.493\\\\334.01\\\\225.5859\\\\236.4299\\\\334.01\\\\244.3359\\\\236.4273\\\\334.01\\\\249.0234\\\\236.379\\\\334.01\\\\251.3672\\\\235.5749\\\\334.01\\\\253.7109\\\\236.4964\\\\334.01\\\\254.4123\\\\237.0609\\\\334.01\\\\255.858\\\\239.4047\\\\334.01\\\\255.6086\\\\241.7484\\\\334.01\\\\254.6009\\\\244.0922\\\\334.01\\\\253.7109\\\\245.0623\\\\334.01\\\\252.6891\\\\246.4359\\\\334.01\\\\251.3672\\\\248.4433\\\\334.01\\\\248.6766\\\\251.1234\\\\334.01\\\\246.6797\\\\253.2569\\\\334.01\\\\244.3359\\\\255.5082\\\\334.01\\\\241.9922\\\\258.0435\\\\334.01\\\\239.6484\\\\260.3833\\\\334.01\\\\237.3047\\\\262.8111\\\\334.01\\\\234.9609\\\\265.1107\\\\334.01\\\\232.6172\\\\267.5191\\\\334.01\\\\225.5957\\\\274.5609\\\\334.01\\\\220.7587\\\\279.2484\\\\334.01\\\\218.4622\\\\281.5922\\\\334.01\\\\215.9334\\\\283.9359\\\\334.01\\\\213.5136\\\\286.2797\\\\334.01\\\\211.5234\\\\288.0286\\\\334.01\\\\209.1797\\\\289.5707\\\\334.01\\\\206.8359\\\\290.8047\\\\334.01\\\\204.4922\\\\290.8047\\\\334.01\\\\199.8047\\\\290.7131\\\\334.01\\\\197.4609\\\\290.7579\\\\334.01\\\\195.1172\\\\290.4285\\\\334.01\\\\192.7734\\\\290.6412\\\\334.01\\\\190.4297\\\\290.0366\\\\334.01\\\\183.3984\\\\289.9869\\\\334.01\\\\176.3672\\\\290.0042\\\\334.01\\\\169.3359\\\\289.9643\\\\334.01\\\\159.9609\\\\289.9643\\\\334.01\\\\155.2734\\\\289.9193\\\\334.01\\\\150.5859\\\\289.9418\\\\334.01\\\\145.8984\\\\289.8967\\\\334.01\\\\136.5234\\\\289.9516\\\\334.01\\\\131.8359\\\\289.9091\\\\334.01\\\\124.8047\\\\289.939\\\\334.01\\\\110.7422\\\\289.9091\\\\334.01\\\\96.67969\\\\289.9193\\\\334.01\\\\91.99219\\\\289.9418\\\\334.01\\\\77.92969\\\\289.9217\\\\334.01\\\\63.86719\\\\289.9193\\\\334.01\\\\54.49219\\\\289.9418\\\\334.01\\\\52.14844\\\\289.9169\\\\334.01\\\\45.11719\\\\289.9292\\\\334.01\\\\33.39844\\\\289.8967\\\\334.01\\\\28.71094\\\\289.939\\\\334.01\\\\19.33594\\\\289.9319\\\\334.01\\\\16.99219\\\\289.9546\\\\334.01\\\\7.617188\\\\289.9193\\\\334.01\\\\2.929688\\\\289.9447\\\\334.01\\\\-1.757813\\\\289.9193\\\\334.01\\\\-11.13281\\\\289.9643\\\\334.01\\\\-15.82031\\\\289.9418\\\\334.01\\\\-20.50781\\\\289.9832\\\\334.01\\\\-32.22656\\\\289.9925\\\\334.01\\\\-34.57031\\\\289.9739\\\\334.01\\\\-41.60156\\\\290.0363\\\\334.01\\\\-46.28906\\\\290.0001\\\\334.01\\\\-55.66406\\\\290.0275\\\\334.01\\\\-60.35156\\\\290.0094\\\\334.01\\\\-67.38281\\\\290.0366\\\\334.01\\\\-69.72656\\\\290.8044\\\\334.01\\\\-72.07031\\\\290.032\\\\334.01\\\\-74.41406\\\\290.0632\\\\334.01\\\\-76.75781\\\\291.0641\\\\334.01\\\\-79.10156\\\\290.6554\\\\334.01\\\\-81.44531\\\\291.2212\\\\334.01\\\\-86.13281\\\\291.2357\\\\334.01\\\\-88.47656\\\\290.1748\\\\334.01\\\\-90.82031\\\\291.2501\\\\334.01\\\\-102.5391\\\\291.2918\\\\334.01\\\\-104.8828\\\\291.2642\\\\334.01\\\\-107.4707\\\\290.9672\\\\334.01\\\\-109.5703\\\\291.3054\\\\334.01\\\\-114.2578\\\\291.3054\\\\334.01\\\\-118.9453\\\\291.3578\\\\334.01\\\\-125.9766\\\\291.345\\\\334.01\\\\-130.6641\\\\291.3954\\\\334.01\\\\-140.0391\\\\291.3954\\\\334.01\\\\-151.7578\\\\291.4549\\\\334.01\\\\-163.4766\\\\291.4776\\\\334.01\\\\-168.1641\\\\291.5108\\\\334.01\\\\-184.5703\\\\291.5531\\\\334.01\\\\-189.2578\\\\291.5836\\\\334.01\\\\-196.2891\\\\291.5836\\\\334.01\\\\-198.6328\\\\291.8617\\\\334.01\\\\-200.9766\\\\291.6205\\\\334.01\\\\-203.3203\\\\292.0964\\\\334.01\\\\-205.6641\\\\292.3344\\\\334.01\\\\-208.0078\\\\292.3654\\\\334.01\\\\-210.3516\\\\292.0912\\\\334.01\\\\-212.1875\\\\290.9672\\\\334.01\\\\-215.0391\\\\288.6954\\\\334.01\\\\-217.3828\\\\286.5314\\\\334.01\\\\-219.7266\\\\284.4869\\\\334.01\\\\-222.0703\\\\282.1065\\\\334.01\\\\-225.0175\\\\279.2484\\\\334.01\\\\-227.3079\\\\276.9047\\\\334.01\\\\-229.8221\\\\274.5609\\\\334.01\\\\-231.4453\\\\272.9496\\\\334.01\\\\-232.0564\\\\272.2172\\\\334.01\\\\-233.7891\\\\270.4845\\\\334.01\\\\-236.1328\\\\268.3081\\\\334.01\\\\-238.4766\\\\265.837\\\\334.01\\\\-240.8203\\\\263.5652\\\\334.01\\\\-243.8257\\\\260.4984\\\\334.01\\\\-246.2413\\\\258.1547\\\\334.01\\\\-248.4672\\\\255.8109\\\\334.01\\\\-250.9794\\\\253.4672\\\\334.01\\\\-252.5391\\\\251.9189\\\\334.01\\\\-254.8828\\\\249.4032\\\\334.01\\\\-255.6368\\\\248.7797\\\\334.01\\\\-257.6019\\\\246.4359\\\\334.01\\\\-258.3731\\\\244.0922\\\\334.01\\\\-258.3472\\\\241.7484\\\\334.01\\\\-257.8529\\\\239.4047\\\\334.01\\\\-257.2266\\\\238.6262\\\\334.01\\\\-255.1592\\\\237.0609\\\\334.01\\\\-257.2266\\\\235.0319\\\\334.01\\\\-259.5703\\\\235.8942\\\\334.01\\\\-261.0516\\\\237.0609\\\\334.01\\\\-261.9141\\\\237.997\\\\334.01\\\\-262.9828\\\\239.4047\\\\334.01\\\\-263.0954\\\\241.7484\\\\334.01\\\\-262.7562\\\\244.0922\\\\334.01\\\\-261.9141\\\\245.3244\\\\334.01\\\\-259.5703\\\\248.3447\\\\334.01\\\\-259.0576\\\\248.7797\\\\334.01\\\\-255.4217\\\\253.4672\\\\334.01\\\\-252.5391\\\\256.6166\\\\334.01\\\\-250.1953\\\\258.8944\\\\334.01\\\\-247.8516\\\\261.3969\\\\334.01\\\\-245.5078\\\\263.5919\\\\334.01\\\\-244.0908\\\\265.1859\\\\334.01\\\\-241.5988\\\\267.5297\\\\334.01\\\\-239.4375\\\\269.8734\\\\334.01\\\\-237\\\\272.2172\\\\334.01\\\\-231.4453\\\\277.8564\\\\334.01\\\\-229.8857\\\\279.2484\\\\334.01\\\\-227.7252\\\\281.5922\\\\334.01\\\\-225.2042\\\\283.9359\\\\334.01\\\\-222.0703\\\\287.2521\\\\334.01\\\\-220.5943\\\\288.6234\\\\334.01\\\\-218.3814\\\\290.9672\\\\334.01\\\\-215.0391\\\\293.3202\\\\334.01\\\\-212.6953\\\\294.6652\\\\334.01\\\\-210.3516\\\\295.2812\\\\334.01\\\\-209.947\\\\295.6547\\\\334.01\\\\-208.0078\\\\296.5075\\\\334.01\\\\-205.6641\\\\296.8852\\\\334.01\\\\-203.3203\\\\297.1267\\\\334.01\\\\-196.2891\\\\297.0739\\\\334.01\\\\-193.9453\\\\296.9265\\\\334.01\\\\-182.2266\\\\296.9128\\\\334.01\\\\-179.8828\\\\296.8785\\\\334.01\\\\-170.5078\\\\296.8576\\\\334.01\\\\-156.4453\\\\296.8931\\\\334.01\\\\-151.7578\\\\296.8432\\\\334.01\\\\-147.0703\\\\296.894\\\\334.01\\\\-140.0391\\\\296.8608\\\\334.01\\\\-135.3516\\\\296.8709\\\\334.01\\\\-130.6641\\\\296.8266\\\\334.01\\\\-118.9453\\\\296.8981\\\\334.01\\\\-114.2578\\\\296.8981\\\\334.01\\\\-109.5703\\\\296.942\\\\334.01\\\\-97.85156\\\\296.8828\\\\334.01\\\\-86.13281\\\\296.9218\\\\334.01\\\\-79.10156\\\\296.913\\\\334.01\\\\-76.75781\\\\296.9514\\\\334.01\\\\-67.38281\\\\296.9953\\\\334.01\\\\-58.00781\\\\296.934\\\\334.01\\\\-55.66406\\\\297.1698\\\\334.01\\\\-53.32031\\\\297.1516\\\\334.01\\\\-50.97656\\\\296.9358\\\\334.01\\\\-43.94531\\\\296.9285\\\\334.01\\\\-39.25781\\\\296.9899\\\\334.01\\\\-36.91406\\\\296.8888\\\\334.01\\\\-34.57031\\\\296.8998\\\\334.01\\\\-32.22656\\\\297.252\\\\334.01\\\\-29.88281\\\\296.9011\\\\334.01\\\\-27.53906\\\\296.8789\\\\334.01\\\\-25.19531\\\\297.3806\\\\334.01\\\\-22.85156\\\\297.2719\\\\334.01\\\\-20.50781\\\\297.0591\\\\334.01\\\\-18.16406\\\\297.0665\\\\334.01\\\\-15.82031\\\\296.9285\\\\334.01\\\\-13.47656\\\\296.9377\\\\334.01\\\\-11.13281\\\\297.0627\\\\334.01\\\\-8.789063\\\\296.9095\\\\334.01\\\\-1.757813\\\\296.9095\\\\334.01\\\\7.617188\\\\296.8473\\\\334.01\\\\24.02344\\\\296.8058\\\\334.01\\\\28.71094\\\\296.7421\\\\334.01\\\\31.05469\\\\296.7743\\\\334.01\\\\40.42969\\\\296.7229\\\\334.01\\\\47.46094\\\\296.7229\\\\334.01\\\\61.52344\\\\296.6346\\\\334.01\\\\63.86719\\\\296.6518\\\\334.01\\\\68.55469\\\\296.5942\\\\334.01\\\\75.58594\\\\296.582\\\\334.01\\\\80.27344\\\\296.5412\\\\334.01\\\\87.30469\\\\296.5412\\\\334.01\\\\94.33594\\\\296.4668\\\\334.01\\\\101.3672\\\\296.4257\\\\334.01\\\\103.7109\\\\296.4597\\\\334.01\\\\108.3984\\\\296.4051\\\\334.01\\\\113.0859\\\\296.4393\\\\334.01\\\\122.4609\\\\296.3578\\\\334.01\\\\129.4922\\\\296.3288\\\\334.01\\\\131.8359\\\\295.9278\\\\334.01\\\\134.1797\\\\296.1292\\\\334.01\\\\136.5234\\\\296.0546\\\\334.01\\\\138.8672\\\\295.8486\\\\334.01\\\\143.5547\\\\295.8172\\\\334.01\\\\155.2734\\\\295.833\\\\334.01\\\\166.9922\\\\295.7684\\\\334.01\\\\174.0234\\\\295.6454\\\\334.01\\\\178.7109\\\\295.6819\\\\334.01\\\\183.3984\\\\295.6638\\\\334.01\\\\188.0859\\\\295.5916\\\\334.01\\\\192.7734\\\\295.6093\\\\334.01\\\\197.4609\\\\295.833\\\\334.01\\\\202.1484\\\\295.8172\\\\334.01\\\\204.4922\\\\295.4439\\\\334.01\\\\206.8359\\\\294.803\\\\334.01\\\\209.1797\\\\294.3717\\\\334.01\\\\211.5234\\\\292.5155\\\\334.01\\\\213.8672\\\\291.1916\\\\334.01\\\\216.2109\\\\289.5954\\\\334.01\\\\217.2437\\\\288.6234\\\\334.01\\\\218.5547\\\\287.1034\\\\334.01\\\\221.7932\\\\283.9359\\\\334.01\\\\225.5859\\\\279.9242\\\\334.01\\\\227.9297\\\\277.6213\\\\334.01\\\\230.2734\\\\275.1202\\\\334.01\\\\233.3138\\\\272.2172\\\\334.01\\\\234.9609\\\\270.3912\\\\334.01\\\\237.8462\\\\267.5297\\\\334.01\\\\240.0901\\\\265.1859\\\\334.01\\\\242.4443\\\\262.8422\\\\334.01\\\\246.6797\\\\258.431\\\\334.01\\\\249.248\\\\255.8109\\\\334.01\\\\251.4581\\\\253.4672\\\\334.01\\\\253.4629\\\\251.1234\\\\334.01\\\\256.0547\\\\248.2519\\\\334.01\\\\257.4878\\\\246.4359\\\\334.01\\\\259.8235\\\\244.0922\\\\334.01\\\\260.8724\\\\241.7484\\\\334.01\\\\261.781\\\\239.4047\\\\334.01\\\\261.0668\\\\237.0609\\\\334.01\\\\259.4941\\\\234.7172\\\\334.01\\\\258.3984\\\\233.6932\\\\334.01\\\\256.0547\\\\233.1227\\\\334.01\\\\253.7109\\\\232.9594\\\\334.01\\\\251.3672\\\\233.6412\\\\334.01\\\\249.0234\\\\232.7692\\\\334.01\\\\246.6797\\\\232.7821\\\\334.01\\\\241.9922\\\\233.0207\\\\334.01\\\\237.3047\\\\233.0207\\\\334.01\\\\232.6172\\\\233.091\\\\334.01\\\\230.2734\\\\233.0592\\\\334.01\\\\225.5859\\\\233.0819\\\\334.01\\\\216.2109\\\\233.0726\\\\334.01\\\\206.8359\\\\233.0245\\\\334.01\\\\204.4922\\\\232.8704\\\\334.01\\\\202.1484\\\\232.6027\\\\334.01\\\\199.8047\\\\232.6623\\\\334.01\\\\192.7734\\\\232.7456\\\\334.01\\\\183.3984\\\\232.7719\\\\334.01\\\\181.0547\\\\232.7456\\\\334.01\\\\169.3359\\\\232.7186\\\\334.01\\\\164.6484\\\\232.7588\\\\334.01\\\\150.5859\\\\232.8129\\\\334.01\\\\141.2109\\\\232.7746\\\\334.01\\\\138.8672\\\\232.6788\\\\334.01\\\\134.1797\\\\232.6477\\\\334.01\\\\129.4922\\\\231.8537\\\\334.01\\\\127.1484\\\\231.9275\\\\334.01\\\\124.8047\\\\231.7976\\\\334.01\\\\120.1172\\\\232.7071\\\\334.01\\\\113.0859\\\\232.8253\\\\334.01\\\\108.3984\\\\232.8003\\\\334.01\\\\106.0547\\\\232.6477\\\\334.01\\\\103.7109\\\\231.6597\\\\334.01\\\\102.765\\\\232.3734\\\\334.01\\\\101.3672\\\\233.0479\\\\334.01\\\\99.02344\\\\233.1568\\\\334.01\\\\91.99219\\\\233.131\\\\334.01\\\\82.61719\\\\233.1483\\\\334.01\\\\66.21094\\\\233.131\\\\334.01\\\\61.52344\\\\233.1568\\\\334.01\\\\45.11719\\\\233.1132\\\\334.01\\\\44.13628\\\\232.3734\\\\334.01\\\\42.77344\\\\231.0868\\\\334.01\\\\41.98608\\\\230.0297\\\\334.01\\\\42.77344\\\\229.1708\\\\334.01\\\\45.11719\\\\228.3666\\\\334.01\\\\47.46094\\\\226.8342\\\\334.01\\\\49.80469\\\\225.7806\\\\334.01\\\\52.14844\\\\224.4214\\\\334.01\\\\54.49219\\\\223.3104\\\\334.01\\\\59.17969\\\\219.9071\\\\334.01\\\\61.51359\\\\218.3109\\\\334.01\\\\63.86719\\\\216.5456\\\\334.01\\\\66.21094\\\\214.6382\\\\334.01\\\\67.29213\\\\213.6234\\\\334.01\\\\71.99537\\\\208.9359\\\\334.01\\\\76.04661\\\\204.2484\\\\334.01\\\\77.48438\\\\201.9047\\\\334.01\\\\77.92969\\\\201.4099\\\\334.01\\\\81.04408\\\\197.2172\\\\334.01\\\\82.10064\\\\194.8734\\\\334.01\\\\82.61719\\\\194.2786\\\\334.01\\\\83.77148\\\\192.5297\\\\334.01\\\\84.75167\\\\190.1859\\\\334.01\\\\85.91919\\\\187.8422\\\\334.01\\\\86.84645\\\\185.4984\\\\334.01\\\\88.24593\\\\183.1547\\\\334.01\\\\88.69778\\\\180.8109\\\\334.01\\\\89.31935\\\\178.4672\\\\334.01\\\\90.28825\\\\176.1234\\\\334.01\\\\90.88572\\\\173.7797\\\\334.01\\\\91.32725\\\\171.4359\\\\334.01\\\\92.09135\\\\169.0922\\\\334.01\\\\92.73549\\\\166.7484\\\\334.01\\\\93.00426\\\\164.4047\\\\334.01\\\\93.15228\\\\159.7172\\\\334.01\\\\93.21165\\\\155.0297\\\\334.01\\\\93.16998\\\\150.3422\\\\334.01\\\\93.04629\\\\145.6547\\\\334.01\\\\92.89885\\\\143.3109\\\\334.01\\\\92.4685\\\\140.9672\\\\334.01\\\\91.65399\\\\138.6234\\\\334.01\\\\90.63558\\\\133.9359\\\\334.01\\\\89.94542\\\\131.5922\\\\334.01\\\\88.9603\\\\129.2484\\\\334.01\\\\88.56628\\\\126.9047\\\\334.01\\\\87.77809\\\\124.5609\\\\334.01\\\\86.38477\\\\122.2172\\\\334.01\\\\85.54688\\\\119.8734\\\\334.01\\\\84.18599\\\\117.5297\\\\334.01\\\\83.21418\\\\115.1859\\\\334.01\\\\81.51971\\\\112.8422\\\\334.01\\\\80.27344\\\\110.6408\\\\334.01\\\\78.70409\\\\108.1547\\\\334.01\\\\77.92969\\\\107.2539\\\\334.01\\\\75.58594\\\\104.2182\\\\334.01\\\\70.89844\\\\98.90157\\\\334.01\\\\68.45073\\\\96.43594\\\\334.01\\\\66.21094\\\\94.55936\\\\334.01\\\\63.09443\\\\91.74844\\\\334.01\\\\61.52344\\\\90.59526\\\\334.01\\\\59.17969\\\\88.5986\\\\334.01\\\\56.83594\\\\87.31498\\\\334.01\\\\54.49219\\\\85.86478\\\\334.01\\\\52.14844\\\\84.14245\\\\334.01\\\\49.80469\\\\83.22958\\\\334.01\\\\47.46094\\\\81.94525\\\\334.01\\\\45.11719\\\\80.9931\\\\334.01\\\\43.27874\\\\80.02969\\\\334.01\\\\42.77344\\\\79.65244\\\\334.01\\\\40.42969\\\\78.85207\\\\334.01\\\\38.08594\\\\78.4912\\\\334.01\\\\35.74219\\\\77.58901\\\\334.01\\\\33.39844\\\\76.8085\\\\334.01\\\\28.71094\\\\75.86382\\\\334.01\\\\26.36719\\\\75.08454\\\\334.01\\\\24.02344\\\\74.55878\\\\334.01\\\\21.67969\\\\74.41319\\\\334.01\\\\14.64844\\\\74.18806\\\\334.01\\\\7.617188\\\\74.26453\\\\334.01\\\\2.929688\\\\74.44027\\\\334.01\\\\0.5859375\\\\74.70742\\\\334.01\\\\-4.101563\\\\76.08793\\\\334.01\\\\-6.445313\\\\76.51406\\\\334.01\\\\-8.789063\\\\77.1104\\\\334.01\\\\-11.13281\\\\78.11278\\\\334.01\\\\-15.82031\\\\79.19739\\\\334.01\\\\-18.16406\\\\80.65051\\\\334.01\\\\-20.50781\\\\81.58109\\\\334.01\\\\-22.85156\\\\82.92365\\\\334.01\\\\-25.19531\\\\83.7171\\\\334.01\\\\-27.53906\\\\85.51434\\\\334.01\\\\-29.88281\\\\86.55049\\\\334.01\\\\-32.22656\\\\88.22651\\\\334.01\\\\-34.57031\\\\90.14594\\\\334.01\\\\-36.91406\\\\91.72009\\\\334.01\\\\-41.60156\\\\95.61852\\\\334.01\\\\-47.01968\\\\101.1234\\\\334.01\\\\-50.97656\\\\106.2919\\\\334.01\\\\-54.02066\\\\110.4984\\\\334.01\\\\-55.66406\\\\113.0483\\\\334.01\\\\-56.86023\\\\115.1859\\\\334.01\\\\-57.96204\\\\117.5297\\\\334.01\\\\-60.48373\\\\122.2172\\\\334.01\\\\-61.34826\\\\124.5609\\\\334.01\\\\-61.9119\\\\126.9047\\\\334.01\\\\-63.09862\\\\129.2484\\\\334.01\\\\-63.86719\\\\131.5922\\\\334.01\\\\-64.28482\\\\133.9359\\\\334.01\\\\-65.63528\\\\138.6234\\\\334.01\\\\-66.16119\\\\143.3109\\\\334.01\\\\-66.7664\\\\150.3422\\\\334.01\\\\-66.95463\\\\155.0297\\\\334.01\\\\-66.72736\\\\159.7172\\\\334.01\\\\-66.31696\\\\164.4047\\\\334.01\\\\-65.80171\\\\169.0922\\\\334.01\\\\-65.46725\\\\171.4359\\\\334.01\\\\-64.59868\\\\173.7797\\\\334.01\\\\-63.56812\\\\178.4672\\\\334.01\\\\-62.35712\\\\180.8109\\\\334.01\\\\-61.55333\\\\183.1547\\\\334.01\\\\-61.07733\\\\185.4984\\\\334.01\\\\-59.6588\\\\187.8422\\\\334.01\\\\-58.72026\\\\190.1859\\\\334.01\\\\-57.18415\\\\192.5297\\\\334.01\\\\-56.40602\\\\194.8734\\\\334.01\\\\-55.66406\\\\195.7821\\\\334.01\\\\-53.32031\\\\199.1387\\\\334.01\\\\-52.92969\\\\199.5609\\\\334.01\\\\-51.7693\\\\201.9047\\\\334.01\\\\-49.67076\\\\204.2484\\\\334.01\\\\-47.72281\\\\206.5922\\\\334.01\\\\-45.48062\\\\208.9359\\\\334.01\\\\-43.33069\\\\211.2797\\\\334.01\\\\-41.60156\\\\212.8348\\\\334.01\\\\-39.25781\\\\215.1041\\\\334.01\\\\-36.91406\\\\217.014\\\\334.01\\\\-34.57031\\\\219.1361\\\\334.01\\\\-32.22656\\\\220.3536\\\\334.01\\\\-29.88281\\\\222.028\\\\334.01\\\\-27.53906\\\\223.8316\\\\334.01\\\\-25.19531\\\\224.6377\\\\334.01\\\\-22.85156\\\\226.2194\\\\334.01\\\\-20.50781\\\\227.2216\\\\334.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"543\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"21\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-16.05469\\\\230.0297\\\\337.01\\\\-18.16406\\\\232.5531\\\\337.01\\\\-20.50781\\\\233.1221\\\\337.01\\\\-36.91406\\\\233.1483\\\\337.01\\\\-41.60156\\\\233.19\\\\337.01\\\\-43.94531\\\\233.1652\\\\337.01\\\\-58.00781\\\\233.2061\\\\337.01\\\\-62.69531\\\\233.1981\\\\337.01\\\\-65.03906\\\\233.0382\\\\337.01\\\\-67.38281\\\\232.9942\\\\337.01\\\\-69.72656\\\\233.0671\\\\337.01\\\\-74.41406\\\\233.0859\\\\337.01\\\\-86.13281\\\\233.0859\\\\337.01\\\\-90.82031\\\\233.131\\\\337.01\\\\-93.16406\\\\233.6525\\\\337.01\\\\-95.50781\\\\233.9503\\\\337.01\\\\-97.85156\\\\234.099\\\\337.01\\\\-102.5391\\\\234.2346\\\\337.01\\\\-107.2266\\\\234.2191\\\\337.01\\\\-111.9141\\\\234.2994\\\\337.01\\\\-114.2578\\\\234.2346\\\\337.01\\\\-123.6328\\\\234.2703\\\\337.01\\\\-125.9766\\\\234.2122\\\\337.01\\\\-130.6641\\\\234.1932\\\\337.01\\\\-133.0078\\\\234.2387\\\\337.01\\\\-137.6953\\\\234.1641\\\\337.01\\\\-142.3828\\\\234.2994\\\\337.01\\\\-147.0703\\\\234.1641\\\\337.01\\\\-149.4141\\\\234.2081\\\\337.01\\\\-156.4453\\\\234.1404\\\\337.01\\\\-158.7891\\\\234.1785\\\\337.01\\\\-163.4766\\\\234.1453\\\\337.01\\\\-165.8203\\\\234.1785\\\\337.01\\\\-168.1641\\\\234.3108\\\\337.01\\\\-184.5703\\\\234.3328\\\\337.01\\\\-189.2578\\\\234.3204\\\\337.01\\\\-193.9453\\\\234.4002\\\\337.01\\\\-200.9766\\\\234.471\\\\337.01\\\\-208.0078\\\\234.4053\\\\337.01\\\\-212.6953\\\\234.5285\\\\337.01\\\\-215.0391\\\\234.5285\\\\337.01\\\\-217.3828\\\\234.6247\\\\337.01\\\\-222.0703\\\\234.6649\\\\337.01\\\\-224.4141\\\\234.5484\\\\337.01\\\\-229.1016\\\\234.5121\\\\337.01\\\\-236.1328\\\\234.3573\\\\337.01\\\\-238.4766\\\\234.2224\\\\337.01\\\\-243.1641\\\\234.119\\\\337.01\\\\-247.8516\\\\233.6502\\\\337.01\\\\-250.1953\\\\233.6581\\\\337.01\\\\-252.28\\\\234.7172\\\\337.01\\\\-252.5391\\\\235.7872\\\\337.01\\\\-253.8707\\\\237.0609\\\\337.01\\\\-252.5391\\\\237.3071\\\\337.01\\\\-250.1953\\\\238.1959\\\\337.01\\\\-243.1641\\\\238.1697\\\\337.01\\\\-226.7578\\\\238.1965\\\\337.01\\\\-215.0391\\\\238.2418\\\\337.01\\\\-210.3516\\\\238.2328\\\\337.01\\\\-200.9766\\\\238.2793\\\\337.01\\\\-186.9141\\\\238.2513\\\\337.01\\\\-182.2266\\\\238.3066\\\\337.01\\\\-172.8516\\\\238.3418\\\\337.01\\\\-158.7891\\\\238.3078\\\\337.01\\\\-151.7578\\\\238.3537\\\\337.01\\\\-147.0703\\\\238.3165\\\\337.01\\\\-142.3828\\\\238.3368\\\\337.01\\\\-128.3203\\\\238.3351\\\\337.01\\\\-123.6328\\\\238.3078\\\\337.01\\\\-111.9141\\\\238.3297\\\\337.01\\\\-107.2266\\\\238.2891\\\\337.01\\\\-102.5391\\\\238.3193\\\\337.01\\\\-97.85156\\\\238.2891\\\\337.01\\\\-93.16406\\\\238.3297\\\\337.01\\\\-88.47656\\\\238.2715\\\\337.01\\\\-81.44531\\\\238.2709\\\\337.01\\\\-76.75781\\\\238.3193\\\\337.01\\\\-67.38281\\\\238.2801\\\\337.01\\\\-65.03906\\\\238.309\\\\337.01\\\\-53.32031\\\\238.2607\\\\337.01\\\\-39.25781\\\\238.2801\\\\337.01\\\\-34.57031\\\\238.309\\\\337.01\\\\-32.22656\\\\238.2793\\\\337.01\\\\-11.13281\\\\238.2516\\\\337.01\\\\-1.757813\\\\238.3179\\\\337.01\\\\2.929688\\\\238.2612\\\\337.01\\\\7.617188\\\\238.2801\\\\337.01\\\\9.960938\\\\238.2423\\\\337.01\\\\16.99219\\\\238.2423\\\\337.01\\\\31.05469\\\\238.1953\\\\337.01\\\\33.39844\\\\238.2234\\\\337.01\\\\42.77344\\\\238.1566\\\\337.01\\\\45.11719\\\\238.1953\\\\337.01\\\\54.49219\\\\238.1478\\\\337.01\\\\66.21094\\\\238.1119\\\\337.01\\\\75.58594\\\\238.1016\\\\337.01\\\\82.61719\\\\238.1289\\\\337.01\\\\84.96094\\\\237.6617\\\\337.01\\\\87.30469\\\\238.1036\\\\337.01\\\\89.64844\\\\238.0933\\\\337.01\\\\91.99219\\\\237.956\\\\337.01\\\\94.33594\\\\237.1551\\\\337.01\\\\96.67969\\\\237.0326\\\\337.01\\\\101.3672\\\\236.9958\\\\337.01\\\\103.7109\\\\237.0335\\\\337.01\\\\106.0547\\\\237.7065\\\\337.01\\\\108.3984\\\\237.0328\\\\337.01\\\\113.0859\\\\237.0932\\\\337.01\\\\117.7734\\\\236.961\\\\337.01\\\\120.1172\\\\237.0144\\\\337.01\\\\124.8047\\\\236.9785\\\\337.01\\\\127.1484\\\\236.9111\\\\337.01\\\\129.4922\\\\237.0144\\\\337.01\\\\134.1797\\\\236.9964\\\\337.01\\\\138.8672\\\\236.8935\\\\337.01\\\\150.5859\\\\236.8935\\\\337.01\\\\152.9297\\\\236.8455\\\\337.01\\\\164.6484\\\\236.8786\\\\337.01\\\\171.6797\\\\236.7721\\\\337.01\\\\181.0547\\\\236.8165\\\\337.01\\\\183.3984\\\\236.7296\\\\337.01\\\\190.4297\\\\236.7577\\\\337.01\\\\199.8047\\\\236.7158\\\\337.01\\\\202.1484\\\\236.6625\\\\337.01\\\\211.5234\\\\236.6215\\\\337.01\\\\216.2109\\\\236.6341\\\\337.01\\\\223.2422\\\\236.5608\\\\337.01\\\\230.2734\\\\236.612\\\\337.01\\\\237.3047\\\\236.564\\\\337.01\\\\246.6797\\\\236.5556\\\\337.01\\\\249.0234\\\\236.5217\\\\337.01\\\\251.3672\\\\235.8337\\\\337.01\\\\253.7109\\\\236.673\\\\337.01\\\\254.1778\\\\237.0609\\\\337.01\\\\255.7377\\\\239.4047\\\\337.01\\\\255.5197\\\\241.7484\\\\337.01\\\\254.5064\\\\244.0922\\\\337.01\\\\252.6128\\\\246.4359\\\\337.01\\\\251.3672\\\\248.2697\\\\337.01\\\\248.4421\\\\251.1234\\\\337.01\\\\246.6797\\\\253.0868\\\\337.01\\\\244.3359\\\\255.2826\\\\337.01\\\\241.9922\\\\257.8041\\\\337.01\\\\239.3325\\\\260.4984\\\\337.01\\\\236.9309\\\\262.8422\\\\337.01\\\\234.6654\\\\265.1859\\\\337.01\\\\232.2605\\\\267.5297\\\\337.01\\\\230.2734\\\\269.6653\\\\337.01\\\\227.9297\\\\271.8957\\\\337.01\\\\225.5859\\\\274.3181\\\\337.01\\\\223.2422\\\\276.5594\\\\337.01\\\\218.2125\\\\281.5922\\\\337.01\\\\215.6647\\\\283.9359\\\\337.01\\\\213.3404\\\\286.2797\\\\337.01\\\\211.5234\\\\287.78\\\\337.01\\\\209.1797\\\\289.4079\\\\337.01\\\\206.8359\\\\290.6449\\\\337.01\\\\202.1484\\\\290.6449\\\\337.01\\\\199.8047\\\\290.5828\\\\337.01\\\\197.4609\\\\290.6118\\\\337.01\\\\195.1172\\\\290.5487\\\\337.01\\\\192.7734\\\\290.6282\\\\337.01\\\\190.4297\\\\289.8361\\\\337.01\\\\183.3984\\\\289.8157\\\\337.01\\\\176.3672\\\\289.8256\\\\337.01\\\\169.3359\\\\289.7852\\\\337.01\\\\159.9609\\\\289.7852\\\\337.01\\\\155.2734\\\\289.7545\\\\337.01\\\\150.5859\\\\289.785\\\\337.01\\\\145.8984\\\\289.7439\\\\337.01\\\\129.4922\\\\289.765\\\\337.01\\\\122.4609\\\\289.7234\\\\337.01\\\\113.0859\\\\289.7246\\\\337.01\\\\108.3984\\\\289.7552\\\\337.01\\\\106.0547\\\\289.7246\\\\337.01\\\\91.99219\\\\289.7448\\\\337.01\\\\80.27344\\\\289.7234\\\\337.01\\\\73.24219\\\\289.7545\\\\337.01\\\\66.21094\\\\289.7545\\\\337.01\\\\56.83594\\\\289.7234\\\\337.01\\\\42.77344\\\\289.7246\\\\337.01\\\\40.42969\\\\289.765\\\\337.01\\\\31.05469\\\\289.7352\\\\337.01\\\\12.30469\\\\289.7852\\\\337.01\\\\2.929688\\\\289.765\\\\337.01\\\\-8.789063\\\\289.7854\\\\337.01\\\\-25.19531\\\\289.7753\\\\337.01\\\\-29.88281\\\\289.8052\\\\337.01\\\\-34.57031\\\\289.7854\\\\337.01\\\\-53.32031\\\\289.8354\\\\337.01\\\\-67.38281\\\\289.8354\\\\337.01\\\\-74.41406\\\\289.8648\\\\337.01\\\\-76.75781\\\\290.7283\\\\337.01\\\\-79.10156\\\\289.8554\\\\337.01\\\\-81.44531\\\\290.3386\\\\337.01\\\\-83.78906\\\\291.0974\\\\337.01\\\\-86.13281\\\\291.0974\\\\337.01\\\\-88.47656\\\\289.9266\\\\337.01\\\\-90.82031\\\\290.9763\\\\337.01\\\\-93.16406\\\\291.1297\\\\337.01\\\\-97.85156\\\\291.1137\\\\337.01\\\\-104.8828\\\\291.1611\\\\337.01\\\\-128.3203\\\\291.2212\\\\337.01\\\\-135.3516\\\\291.2642\\\\337.01\\\\-140.0391\\\\291.2501\\\\337.01\\\\-149.4141\\\\291.3054\\\\337.01\\\\-154.1016\\\\291.3054\\\\337.01\\\\-168.1641\\\\291.3705\\\\337.01\\\\-172.8516\\\\291.3705\\\\337.01\\\\-189.2578\\\\291.4549\\\\337.01\\\\-196.2891\\\\291.4549\\\\337.01\\\\-198.6328\\\\292.0931\\\\337.01\\\\-200.9766\\\\291.6703\\\\337.01\\\\-203.3203\\\\292.0439\\\\337.01\\\\-208.0078\\\\292.155\\\\337.01\\\\-210.3516\\\\291.8999\\\\337.01\\\\-211.6451\\\\290.9672\\\\337.01\\\\-212.6953\\\\290.0075\\\\337.01\\\\-215.0391\\\\288.4995\\\\337.01\\\\-219.7266\\\\284.2614\\\\337.01\\\\-226.7578\\\\277.3752\\\\337.01\\\\-229.1016\\\\275.0117\\\\337.01\\\\-231.4453\\\\272.749\\\\337.01\\\\-231.9032\\\\272.2172\\\\337.01\\\\-234.3526\\\\269.8734\\\\337.01\\\\-236.6545\\\\267.5297\\\\337.01\\\\-239.0497\\\\265.1859\\\\337.01\\\\-247.8516\\\\256.3387\\\\337.01\\\\-248.3156\\\\255.8109\\\\337.01\\\\-250.7947\\\\253.4672\\\\337.01\\\\-254.8828\\\\249.2404\\\\337.01\\\\-255.4349\\\\248.7797\\\\337.01\\\\-257.3968\\\\246.4359\\\\337.01\\\\-258.2731\\\\244.0922\\\\337.01\\\\-258.2375\\\\241.7484\\\\337.01\\\\-257.667\\\\239.4047\\\\337.01\\\\-257.2266\\\\238.8687\\\\337.01\\\\-255.0871\\\\237.0609\\\\337.01\\\\-257.2266\\\\235.0331\\\\337.01\\\\-259.5703\\\\235.8786\\\\337.01\\\\-261.0648\\\\237.0609\\\\337.01\\\\-261.9141\\\\237.9827\\\\337.01\\\\-262.9937\\\\239.4047\\\\337.01\\\\-263.0859\\\\241.7484\\\\337.01\\\\-262.7562\\\\244.0922\\\\337.01\\\\-261.9141\\\\245.3154\\\\337.01\\\\-259.5703\\\\248.3479\\\\337.01\\\\-259.0795\\\\248.7797\\\\337.01\\\\-255.473\\\\253.4672\\\\337.01\\\\-252.5391\\\\256.6491\\\\337.01\\\\-250.1953\\\\258.8997\\\\337.01\\\\-247.8516\\\\261.422\\\\337.01\\\\-245.5078\\\\263.5974\\\\337.01\\\\-244.0876\\\\265.1859\\\\337.01\\\\-241.5988\\\\267.5297\\\\337.01\\\\-239.4282\\\\269.8734\\\\337.01\\\\-236.9844\\\\272.2172\\\\337.01\\\\-233.7891\\\\275.424\\\\337.01\\\\-231.4453\\\\277.8406\\\\337.01\\\\-229.8799\\\\279.2484\\\\337.01\\\\-226.7578\\\\282.5503\\\\337.01\\\\-225.2042\\\\283.9359\\\\337.01\\\\-222.0703\\\\287.2521\\\\337.01\\\\-220.5943\\\\288.6234\\\\337.01\\\\-218.3718\\\\290.9672\\\\337.01\\\\-217.3828\\\\291.7129\\\\337.01\\\\-214.9922\\\\293.3109\\\\337.01\\\\-212.6953\\\\294.6589\\\\337.01\\\\-210.3516\\\\295.2864\\\\337.01\\\\-209.9019\\\\295.6547\\\\337.01\\\\-208.0078\\\\296.512\\\\337.01\\\\-205.6641\\\\296.899\\\\337.01\\\\-203.3203\\\\297.1108\\\\337.01\\\\-198.6328\\\\297.0992\\\\337.01\\\\-193.9453\\\\296.9203\\\\337.01\\\\-191.6016\\\\296.8886\\\\337.01\\\\-182.2266\\\\296.9061\\\\337.01\\\\-175.1953\\\\296.8497\\\\337.01\\\\-163.4766\\\\296.882\\\\337.01\\\\-154.1016\\\\296.8757\\\\337.01\\\\-151.7578\\\\296.8513\\\\337.01\\\\-142.3828\\\\296.8771\\\\337.01\\\\-140.0391\\\\296.8521\\\\337.01\\\\-128.3203\\\\296.8175\\\\337.01\\\\-109.5703\\\\296.916\\\\337.01\\\\-90.82031\\\\296.8938\\\\337.01\\\\-86.13281\\\\296.9322\\\\337.01\\\\-81.44531\\\\296.9041\\\\337.01\\\\-74.41406\\\\296.9622\\\\337.01\\\\-67.38281\\\\296.979\\\\337.01\\\\-58.00781\\\\296.9535\\\\337.01\\\\-55.66406\\\\297.2359\\\\337.01\\\\-53.32031\\\\297.1979\\\\337.01\\\\-50.97656\\\\296.9267\\\\337.01\\\\-43.94531\\\\296.9377\\\\337.01\\\\-39.25781\\\\296.878\\\\337.01\\\\-34.57031\\\\296.8985\\\\337.01\\\\-32.22656\\\\297.1454\\\\337.01\\\\-29.88281\\\\296.9011\\\\337.01\\\\-27.53906\\\\296.8899\\\\337.01\\\\-25.19531\\\\297.257\\\\337.01\\\\-22.85156\\\\297.2363\\\\337.01\\\\-20.50781\\\\296.8985\\\\337.01\\\\-8.789063\\\\296.9396\\\\337.01\\\\-6.445313\\\\297.0519\\\\337.01\\\\-4.101563\\\\296.8888\\\\337.01\\\\12.30469\\\\296.8163\\\\337.01\\\\16.99219\\\\296.8369\\\\337.01\\\\24.02344\\\\296.8163\\\\337.01\\\\28.71094\\\\296.7643\\\\337.01\\\\35.74219\\\\296.7743\\\\337.01\\\\45.11719\\\\296.7021\\\\337.01\\\\56.83594\\\\296.6839\\\\337.01\\\\61.52344\\\\296.6346\\\\337.01\\\\63.86719\\\\296.6548\\\\337.01\\\\70.89844\\\\296.582\\\\337.01\\\\87.30469\\\\296.5412\\\\337.01\\\\94.33594\\\\296.4801\\\\337.01\\\\103.7109\\\\296.4597\\\\337.01\\\\110.7422\\\\296.4059\\\\337.01\\\\113.0859\\\\296.4326\\\\337.01\\\\127.1484\\\\296.3578\\\\337.01\\\\134.1797\\\\296.2355\\\\337.01\\\\136.5234\\\\295.8685\\\\337.01\\\\138.8672\\\\296.0063\\\\337.01\\\\141.2109\\\\295.8486\\\\337.01\\\\143.5547\\\\295.8172\\\\337.01\\\\150.5859\\\\295.833\\\\337.01\\\\159.9609\\\\295.7849\\\\337.01\\\\164.6484\\\\295.8012\\\\337.01\\\\176.3672\\\\295.6638\\\\337.01\\\\178.7109\\\\295.6998\\\\337.01\\\\192.7734\\\\295.6093\\\\337.01\\\\195.1172\\\\295.7849\\\\337.01\\\\197.4609\\\\295.8486\\\\337.01\\\\202.1484\\\\295.7849\\\\337.01\\\\204.4922\\\\295.3989\\\\337.01\\\\206.8359\\\\294.7878\\\\337.01\\\\209.1797\\\\294.3606\\\\337.01\\\\211.5234\\\\292.5075\\\\337.01\\\\213.8672\\\\291.1916\\\\337.01\\\\216.2109\\\\289.5791\\\\337.01\\\\217.2271\\\\288.6234\\\\337.01\\\\218.5547\\\\287.1251\\\\337.01\\\\221.7773\\\\283.9359\\\\337.01\\\\225.5859\\\\279.9242\\\\337.01\\\\228.6029\\\\276.9047\\\\337.01\\\\230.8462\\\\274.5609\\\\337.01\\\\233.2856\\\\272.2172\\\\337.01\\\\234.9609\\\\270.3731\\\\337.01\\\\237.8504\\\\267.5297\\\\337.01\\\\240.0754\\\\265.1859\\\\337.01\\\\242.4628\\\\262.8422\\\\337.01\\\\246.6797\\\\258.4333\\\\337.01\\\\249.248\\\\255.8109\\\\337.01\\\\251.4573\\\\253.4672\\\\337.01\\\\256.0547\\\\248.2478\\\\337.01\\\\257.4822\\\\246.4359\\\\337.01\\\\259.856\\\\244.0922\\\\337.01\\\\260.9205\\\\241.7484\\\\337.01\\\\261.7867\\\\239.4047\\\\337.01\\\\261.0251\\\\237.0609\\\\337.01\\\\259.4996\\\\234.7172\\\\337.01\\\\258.3984\\\\233.6932\\\\337.01\\\\256.0547\\\\233.1313\\\\337.01\\\\253.7109\\\\233.0145\\\\337.01\\\\251.3672\\\\233.5155\\\\337.01\\\\249.0234\\\\232.7431\\\\337.01\\\\244.3359\\\\232.8555\\\\337.01\\\\241.9922\\\\233.0207\\\\337.01\\\\234.9609\\\\233.0537\\\\337.01\\\\227.9297\\\\233.0305\\\\337.01\\\\223.2422\\\\233.0632\\\\337.01\\\\206.8359\\\\233.0145\\\\337.01\\\\204.4922\\\\232.882\\\\337.01\\\\202.1484\\\\232.6027\\\\337.01\\\\195.1172\\\\232.7456\\\\337.01\\\\192.7734\\\\232.7186\\\\337.01\\\\183.3984\\\\232.7588\\\\337.01\\\\174.0234\\\\232.7186\\\\337.01\\\\157.6172\\\\232.7614\\\\337.01\\\\143.5547\\\\232.8253\\\\337.01\\\\136.5234\\\\232.6767\\\\337.01\\\\129.4922\\\\232.693\\\\337.01\\\\127.0996\\\\232.3734\\\\337.01\\\\124.8047\\\\232.7481\\\\337.01\\\\120.1172\\\\232.7614\\\\337.01\\\\113.0859\\\\232.8617\\\\337.01\\\\110.7422\\\\232.8253\\\\337.01\\\\106.0547\\\\232.8617\\\\337.01\\\\103.7109\\\\232.1634\\\\337.01\\\\101.3672\\\\232.998\\\\337.01\\\\99.02344\\\\233.1221\\\\337.01\\\\89.64844\\\\233.1483\\\\337.01\\\\84.96094\\\\233.1221\\\\337.01\\\\70.89844\\\\233.1568\\\\337.01\\\\68.55469\\\\233.131\\\\337.01\\\\54.49219\\\\233.1397\\\\337.01\\\\45.11719\\\\233.0951\\\\337.01\\\\44.15678\\\\232.3734\\\\337.01\\\\42.77344\\\\231.0868\\\\337.01\\\\41.98608\\\\230.0297\\\\337.01\\\\42.77344\\\\229.1708\\\\337.01\\\\45.11719\\\\228.3666\\\\337.01\\\\47.46094\\\\226.8342\\\\337.01\\\\49.80469\\\\225.7676\\\\337.01\\\\52.14844\\\\224.4137\\\\337.01\\\\54.49219\\\\223.2807\\\\337.01\\\\59.17969\\\\219.898\\\\337.01\\\\61.47501\\\\218.3109\\\\337.01\\\\63.86719\\\\216.4922\\\\337.01\\\\66.21094\\\\214.6099\\\\337.01\\\\70.89844\\\\210.0019\\\\337.01\\\\71.93934\\\\208.9359\\\\337.01\\\\76.00388\\\\204.2484\\\\337.01\\\\77.40801\\\\201.9047\\\\337.01\\\\77.92969\\\\201.3145\\\\337.01\\\\81.018\\\\197.2172\\\\337.01\\\\82.01642\\\\194.8734\\\\337.01\\\\83.7233\\\\192.5297\\\\337.01\\\\84.67807\\\\190.1859\\\\337.01\\\\85.88257\\\\187.8422\\\\337.01\\\\86.77662\\\\185.4984\\\\337.01\\\\88.21052\\\\183.1547\\\\337.01\\\\88.67678\\\\180.8109\\\\337.01\\\\89.25264\\\\178.4672\\\\337.01\\\\90.24816\\\\176.1234\\\\337.01\\\\90.83131\\\\173.7797\\\\337.01\\\\91.26373\\\\171.4359\\\\337.01\\\\92.6648\\\\166.7484\\\\337.01\\\\92.97371\\\\164.4047\\\\337.01\\\\93.12873\\\\159.7172\\\\337.01\\\\93.17584\\\\152.6859\\\\337.01\\\\93.0293\\\\145.6547\\\\337.01\\\\92.85534\\\\143.3109\\\\337.01\\\\92.3933\\\\140.9672\\\\337.01\\\\91.5518\\\\138.6234\\\\337.01\\\\90.58476\\\\133.9359\\\\337.01\\\\89.87284\\\\131.5922\\\\337.01\\\\88.92268\\\\129.2484\\\\337.01\\\\88.54911\\\\126.9047\\\\337.01\\\\87.68194\\\\124.5609\\\\337.01\\\\86.33789\\\\122.2172\\\\337.01\\\\85.47454\\\\119.8734\\\\337.01\\\\84.15683\\\\117.5297\\\\337.01\\\\83.14225\\\\115.1859\\\\337.01\\\\81.47615\\\\112.8422\\\\337.01\\\\80.27344\\\\110.7263\\\\337.01\\\\78.65778\\\\108.1547\\\\337.01\\\\77.92969\\\\107.3061\\\\337.01\\\\75.58594\\\\104.2673\\\\337.01\\\\70.89844\\\\98.97046\\\\337.01\\\\68.38074\\\\96.43594\\\\337.01\\\\66.21094\\\\94.59663\\\\337.01\\\\63.03367\\\\91.74844\\\\337.01\\\\61.52344\\\\90.60773\\\\337.01\\\\59.17969\\\\88.63029\\\\337.01\\\\56.83594\\\\87.3438\\\\337.01\\\\54.49219\\\\85.87691\\\\337.01\\\\52.14844\\\\84.18039\\\\337.01\\\\49.80469\\\\83.24171\\\\337.01\\\\47.46094\\\\81.97013\\\\337.01\\\\45.11719\\\\81.00246\\\\337.01\\\\42.77344\\\\79.69603\\\\337.01\\\\40.42969\\\\78.85781\\\\337.01\\\\38.08594\\\\78.49974\\\\337.01\\\\35.74219\\\\77.60603\\\\337.01\\\\33.39844\\\\76.81591\\\\337.01\\\\28.71094\\\\75.88577\\\\337.01\\\\26.36719\\\\75.09944\\\\337.01\\\\24.02344\\\\74.58508\\\\337.01\\\\21.67969\\\\74.41319\\\\337.01\\\\14.64844\\\\74.19961\\\\337.01\\\\7.617188\\\\74.26453\\\\337.01\\\\2.929688\\\\74.44027\\\\337.01\\\\0.5859375\\\\74.69731\\\\337.01\\\\-4.101563\\\\76.08793\\\\337.01\\\\-6.445313\\\\76.49226\\\\337.01\\\\-8.789063\\\\77.12093\\\\337.01\\\\-11.13281\\\\78.06062\\\\337.01\\\\-13.47656\\\\78.67705\\\\337.01\\\\-15.82031\\\\79.20602\\\\337.01\\\\-18.16406\\\\80.67077\\\\337.01\\\\-20.50781\\\\81.56818\\\\337.01\\\\-22.85156\\\\82.93452\\\\337.01\\\\-25.19531\\\\83.69257\\\\337.01\\\\-27.53906\\\\85.49158\\\\337.01\\\\-29.88281\\\\86.50658\\\\337.01\\\\-32.22656\\\\88.21391\\\\337.01\\\\-34.57031\\\\90.13181\\\\337.01\\\\-36.91406\\\\91.68333\\\\337.01\\\\-39.25781\\\\93.56712\\\\337.01\\\\-41.60156\\\\95.59077\\\\337.01\\\\-47.06793\\\\101.1234\\\\337.01\\\\-50.97656\\\\106.257\\\\337.01\\\\-54.06295\\\\110.4984\\\\337.01\\\\-55.66406\\\\112.9218\\\\337.01\\\\-56.87866\\\\115.1859\\\\337.01\\\\-58.00781\\\\117.468\\\\337.01\\\\-60.35156\\\\121.8745\\\\337.01\\\\-60.61105\\\\122.2172\\\\337.01\\\\-61.37396\\\\124.5609\\\\337.01\\\\-61.96955\\\\126.9047\\\\337.01\\\\-63.18912\\\\129.2484\\\\337.01\\\\-63.92686\\\\131.5922\\\\337.01\\\\-64.32825\\\\133.9359\\\\337.01\\\\-65.08414\\\\136.2797\\\\337.01\\\\-65.66541\\\\138.6234\\\\337.01\\\\-65.95693\\\\140.9672\\\\337.01\\\\-66.45103\\\\145.6547\\\\337.01\\\\-66.83923\\\\150.3422\\\\337.01\\\\-67.00504\\\\155.0297\\\\337.01\\\\-66.91849\\\\157.3734\\\\337.01\\\\-66.59546\\\\162.0609\\\\337.01\\\\-65.85083\\\\169.0922\\\\337.01\\\\-65.52673\\\\171.4359\\\\337.01\\\\-64.66129\\\\173.7797\\\\337.01\\\\-63.60744\\\\178.4672\\\\337.01\\\\-62.44127\\\\180.8109\\\\337.01\\\\-61.60844\\\\183.1547\\\\337.01\\\\-61.10444\\\\185.4984\\\\337.01\\\\-59.69611\\\\187.8422\\\\337.01\\\\-58.78688\\\\190.1859\\\\337.01\\\\-57.22429\\\\192.5297\\\\337.01\\\\-56.42923\\\\194.8734\\\\337.01\\\\-55.66406\\\\195.816\\\\337.01\\\\-53.32031\\\\199.2024\\\\337.01\\\\-52.98665\\\\199.5609\\\\337.01\\\\-51.81459\\\\201.9047\\\\337.01\\\\-49.69277\\\\204.2484\\\\337.01\\\\-47.77253\\\\206.5922\\\\337.01\\\\-45.4857\\\\208.9359\\\\337.01\\\\-43.94531\\\\210.7107\\\\337.01\\\\-39.25781\\\\215.1271\\\\337.01\\\\-36.91406\\\\217.0729\\\\337.01\\\\-34.57031\\\\219.1932\\\\337.01\\\\-32.22656\\\\220.397\\\\337.01\\\\-31.95135\\\\220.6547\\\\337.01\\\\-28.60054\\\\222.9984\\\\337.01\\\\-27.53906\\\\223.8551\\\\337.01\\\\-25.19531\\\\224.6817\\\\337.01\\\\-22.85156\\\\226.2544\\\\337.01\\\\-20.50781\\\\227.2455\\\\337.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"344\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"22\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"45.11719\\\\233.0951\\\\340.01\\\\43.64898\\\\232.3734\\\\340.01\\\\42.77344\\\\231.5882\\\\340.01\\\\41.51367\\\\230.0297\\\\340.01\\\\42.77344\\\\229.1609\\\\340.01\\\\45.11719\\\\228.3465\\\\340.01\\\\47.46094\\\\226.8296\\\\340.01\\\\49.80469\\\\225.7274\\\\340.01\\\\50.36671\\\\225.3422\\\\340.01\\\\54.49219\\\\223.2026\\\\340.01\\\\56.83594\\\\221.5721\\\\340.01\\\\61.40058\\\\218.3109\\\\340.01\\\\63.86719\\\\216.4497\\\\340.01\\\\66.21094\\\\214.5379\\\\340.01\\\\67.18151\\\\213.6234\\\\340.01\\\\71.87971\\\\208.9359\\\\340.01\\\\75.93159\\\\204.2484\\\\340.01\\\\77.34375\\\\201.9047\\\\340.01\\\\77.92969\\\\201.2338\\\\340.01\\\\81.00505\\\\197.2172\\\\340.01\\\\81.93835\\\\194.8734\\\\340.01\\\\83.70493\\\\192.5297\\\\340.01\\\\84.59618\\\\190.1859\\\\340.01\\\\85.85058\\\\187.8422\\\\340.01\\\\86.71875\\\\185.4984\\\\340.01\\\\88.16106\\\\183.1547\\\\340.01\\\\89.19947\\\\178.4672\\\\340.01\\\\90.19531\\\\176.1234\\\\340.01\\\\90.79267\\\\173.7797\\\\340.01\\\\91.21298\\\\171.4359\\\\340.01\\\\91.82967\\\\169.0922\\\\340.01\\\\92.58527\\\\166.7484\\\\340.01\\\\92.92848\\\\164.4047\\\\340.01\\\\93.04102\\\\162.0609\\\\340.01\\\\93.14051\\\\157.3734\\\\340.01\\\\93.15228\\\\152.6859\\\\340.01\\\\93.01096\\\\145.6547\\\\340.01\\\\92.82652\\\\143.3109\\\\340.01\\\\92.30957\\\\140.9672\\\\340.01\\\\91.49306\\\\138.6234\\\\340.01\\\\90.54668\\\\133.9359\\\\340.01\\\\89.79492\\\\131.5922\\\\340.01\\\\88.89133\\\\129.2484\\\\340.01\\\\88.5321\\\\126.9047\\\\340.01\\\\87.59558\\\\124.5609\\\\340.01\\\\86.30105\\\\122.2172\\\\340.01\\\\85.44\\\\119.8734\\\\340.01\\\\84.1048\\\\117.5297\\\\340.01\\\\83.04976\\\\115.1859\\\\340.01\\\\81.44531\\\\112.8422\\\\340.01\\\\78.61036\\\\108.1547\\\\340.01\\\\77.92969\\\\107.3653\\\\340.01\\\\75.58594\\\\104.3202\\\\340.01\\\\70.89844\\\\99.03911\\\\340.01\\\\68.31129\\\\96.43594\\\\340.01\\\\66.21094\\\\94.65131\\\\340.01\\\\63.00066\\\\91.74844\\\\340.01\\\\59.99457\\\\89.40469\\\\340.01\\\\59.17969\\\\88.66788\\\\340.01\\\\56.83594\\\\87.38558\\\\340.01\\\\52.7524\\\\84.71719\\\\340.01\\\\52.14844\\\\84.20734\\\\340.01\\\\49.80469\\\\83.25685\\\\340.01\\\\47.46094\\\\81.99566\\\\340.01\\\\45.11719\\\\81.03172\\\\340.01\\\\42.77344\\\\79.72434\\\\340.01\\\\40.42969\\\\78.86356\\\\340.01\\\\38.08594\\\\78.50819\\\\340.01\\\\33.39844\\\\76.83095\\\\340.01\\\\28.71094\\\\75.9072\\\\340.01\\\\26.36719\\\\75.12989\\\\340.01\\\\24.02344\\\\74.57621\\\\340.01\\\\21.67969\\\\74.42056\\\\340.01\\\\14.64844\\\\74.21133\\\\340.01\\\\9.960938\\\\74.21133\\\\340.01\\\\5.273438\\\\74.33174\\\\340.01\\\\2.929688\\\\74.44027\\\\340.01\\\\0.5859375\\\\74.68344\\\\340.01\\\\-4.101563\\\\76.06187\\\\340.01\\\\-6.445313\\\\76.48074\\\\340.01\\\\-8.789063\\\\77.09653\\\\340.01\\\\-11.13281\\\\78.03346\\\\340.01\\\\-13.47656\\\\78.66458\\\\340.01\\\\-15.82031\\\\79.18885\\\\340.01\\\\-18.16406\\\\80.65698\\\\340.01\\\\-20.50781\\\\81.53359\\\\340.01\\\\-22.85156\\\\82.9015\\\\340.01\\\\-25.19531\\\\83.66675\\\\340.01\\\\-27.53906\\\\85.45914\\\\340.01\\\\-29.88281\\\\86.475\\\\340.01\\\\-32.22656\\\\88.17611\\\\340.01\\\\-34.57031\\\\90.08352\\\\340.01\\\\-36.91406\\\\91.61217\\\\340.01\\\\-39.25781\\\\93.50252\\\\340.01\\\\-41.60156\\\\95.54475\\\\340.01\\\\-47.14196\\\\101.1234\\\\340.01\\\\-50.67958\\\\105.8109\\\\340.01\\\\-50.97656\\\\106.1445\\\\340.01\\\\-54.1083\\\\110.4984\\\\340.01\\\\-55.67351\\\\112.8422\\\\340.01\\\\-59.33949\\\\119.8734\\\\340.01\\\\-60.7103\\\\122.2172\\\\340.01\\\\-61.41526\\\\124.5609\\\\340.01\\\\-62.03443\\\\126.9047\\\\340.01\\\\-63.2848\\\\129.2484\\\\340.01\\\\-63.97519\\\\131.5922\\\\340.01\\\\-64.37412\\\\133.9359\\\\340.01\\\\-65.20158\\\\136.2797\\\\340.01\\\\-65.72266\\\\138.6234\\\\340.01\\\\-66.51716\\\\145.6547\\\\340.01\\\\-66.90674\\\\150.3422\\\\340.01\\\\-67.05817\\\\152.6859\\\\340.01\\\\-67.07191\\\\155.0297\\\\340.01\\\\-66.80727\\\\159.7172\\\\340.01\\\\-66.38559\\\\164.4047\\\\340.01\\\\-65.8744\\\\169.0922\\\\340.01\\\\-65.56069\\\\171.4359\\\\340.01\\\\-64.72816\\\\173.7797\\\\340.01\\\\-64.14594\\\\176.1234\\\\340.01\\\\-63.66697\\\\178.4672\\\\340.01\\\\-62.54883\\\\180.8109\\\\340.01\\\\-61.63273\\\\183.1547\\\\340.01\\\\-61.1263\\\\185.4984\\\\340.01\\\\-59.74519\\\\187.8422\\\\340.01\\\\-58.81712\\\\190.1859\\\\340.01\\\\-57.25644\\\\192.5297\\\\340.01\\\\-56.44758\\\\194.8734\\\\340.01\\\\-55.66406\\\\195.85\\\\340.01\\\\-53.32031\\\\199.2374\\\\340.01\\\\-53.01497\\\\199.5609\\\\340.01\\\\-51.82329\\\\201.9047\\\\340.01\\\\-49.72613\\\\204.2484\\\\340.01\\\\-47.79478\\\\206.5922\\\\340.01\\\\-45.51518\\\\208.9359\\\\340.01\\\\-43.94531\\\\210.7713\\\\340.01\\\\-41.60156\\\\212.8845\\\\340.01\\\\-39.25781\\\\215.1362\\\\340.01\\\\-36.91406\\\\217.0861\\\\340.01\\\\-34.57031\\\\219.2098\\\\340.01\\\\-32.22656\\\\220.4119\\\\340.01\\\\-29.88281\\\\222.0768\\\\340.01\\\\-27.53906\\\\223.8773\\\\340.01\\\\-25.19531\\\\224.7128\\\\340.01\\\\-22.85156\\\\226.2625\\\\340.01\\\\-20.50781\\\\227.2578\\\\340.01\\\\-18.16406\\\\228.6914\\\\340.01\\\\-15.82031\\\\229.7006\\\\340.01\\\\-15.45354\\\\230.0297\\\\340.01\\\\-15.82031\\\\230.6879\\\\340.01\\\\-17.62983\\\\232.3734\\\\340.01\\\\-18.16406\\\\232.6311\\\\340.01\\\\-20.50781\\\\233.1132\\\\340.01\\\\-34.57031\\\\233.131\\\\340.01\\\\-41.60156\\\\233.1818\\\\340.01\\\\-46.28906\\\\233.1652\\\\340.01\\\\-55.66406\\\\233.1981\\\\340.01\\\\-60.35156\\\\233.19\\\\340.01\\\\-62.69531\\\\233.246\\\\340.01\\\\-65.03906\\\\233.0382\\\\340.01\\\\-69.72656\\\\233.0671\\\\340.01\\\\-83.78906\\\\233.0766\\\\340.01\\\\-90.82031\\\\233.1132\\\\340.01\\\\-93.16406\\\\233.1964\\\\340.01\\\\-95.50781\\\\233.8279\\\\340.01\\\\-97.85156\\\\234.0941\\\\340.01\\\\-102.5391\\\\234.2306\\\\340.01\\\\-109.5703\\\\234.279\\\\340.01\\\\-116.6016\\\\234.2191\\\\340.01\\\\-121.2891\\\\234.2543\\\\340.01\\\\-130.6641\\\\234.1741\\\\340.01\\\\-133.0078\\\\234.2081\\\\340.01\\\\-137.6953\\\\234.1499\\\\340.01\\\\-142.3828\\\\234.2703\\\\340.01\\\\-147.0703\\\\234.1641\\\\340.01\\\\-151.7578\\\\234.1932\\\\340.01\\\\-156.4453\\\\234.1267\\\\340.01\\\\-158.7891\\\\234.1543\\\\340.01\\\\-163.4766\\\\234.1221\\\\340.01\\\\-168.1641\\\\234.2766\\\\340.01\\\\-175.1953\\\\234.2686\\\\340.01\\\\-177.5391\\\\234.2987\\\\340.01\\\\-184.5703\\\\234.2835\\\\340.01\\\\-186.9141\\\\234.3328\\\\340.01\\\\-189.2578\\\\234.2902\\\\340.01\\\\-193.9453\\\\234.4002\\\\340.01\\\\-196.2891\\\\234.3837\\\\340.01\\\\-200.9766\\\\234.4888\\\\340.01\\\\-203.3203\\\\234.3837\\\\340.01\\\\-208.0078\\\\234.3864\\\\340.01\\\\-212.6953\\\\234.5069\\\\340.01\\\\-215.0391\\\\234.4907\\\\340.01\\\\-222.0703\\\\234.6239\\\\340.01\\\\-224.4141\\\\234.4731\\\\340.01\\\\-231.4453\\\\234.4218\\\\340.01\\\\-233.7891\\\\234.3266\\\\340.01\\\\-243.1641\\\\234.0949\\\\340.01\\\\-247.8516\\\\233.6378\\\\340.01\\\\-250.1953\\\\233.6378\\\\340.01\\\\-252.5391\\\\234.0867\\\\340.01\\\\-254.6143\\\\234.7172\\\\340.01\\\\-254.8828\\\\234.9516\\\\340.01\\\\-257.2266\\\\234.9974\\\\340.01\\\\-259.5703\\\\235.8786\\\\340.01\\\\-261.108\\\\237.0609\\\\340.01\\\\-261.9141\\\\237.891\\\\340.01\\\\-263.0544\\\\239.4047\\\\340.01\\\\-263.1094\\\\241.7484\\\\340.01\\\\-262.7858\\\\244.0922\\\\340.01\\\\-261.9141\\\\245.3383\\\\340.01\\\\-259.5703\\\\248.3687\\\\340.01\\\\-259.1593\\\\248.7797\\\\340.01\\\\-255.7086\\\\253.4672\\\\340.01\\\\-252.5391\\\\256.7179\\\\340.01\\\\-250.1953\\\\258.9929\\\\340.01\\\\-247.8516\\\\261.4776\\\\340.01\\\\-245.5078\\\\263.6263\\\\340.01\\\\-244.1031\\\\265.1859\\\\340.01\\\\-241.5987\\\\267.5297\\\\340.01\\\\-239.4125\\\\269.8734\\\\340.01\\\\-236.9858\\\\272.2172\\\\340.01\\\\-233.7891\\\\275.424\\\\340.01\\\\-231.4453\\\\277.8469\\\\340.01\\\\-229.1016\\\\280.0326\\\\340.01\\\\-226.7578\\\\282.5503\\\\340.01\\\\-225.1803\\\\283.9359\\\\340.01\\\\-222.0703\\\\287.259\\\\340.01\\\\-220.6122\\\\288.6234\\\\340.01\\\\-218.3861\\\\290.9672\\\\340.01\\\\-214.9922\\\\293.3109\\\\340.01\\\\-212.6953\\\\294.6589\\\\340.01\\\\-210.3516\\\\295.3856\\\\340.01\\\\-208.0078\\\\296.5275\\\\340.01\\\\-205.6641\\\\296.892\\\\340.01\\\\-203.3203\\\\297.0948\\\\340.01\\\\-198.6328\\\\297.0876\\\\340.01\\\\-193.9453\\\\296.9006\\\\340.01\\\\-170.5078\\\\296.8421\\\\340.01\\\\-168.1641\\\\296.8731\\\\340.01\\\\-158.7891\\\\296.8427\\\\340.01\\\\-156.4453\\\\296.8667\\\\340.01\\\\-144.7266\\\\296.8678\\\\340.01\\\\-130.6641\\\\296.8089\\\\340.01\\\\-121.2891\\\\296.7995\\\\340.01\\\\-114.2578\\\\296.8629\\\\340.01\\\\-102.5391\\\\296.9188\\\\340.01\\\\-100.1953\\\\296.9004\\\\340.01\\\\-79.10156\\\\296.9041\\\\340.01\\\\-76.75781\\\\296.9428\\\\340.01\\\\-69.72656\\\\296.9622\\\\340.01\\\\-53.32031\\\\296.9428\\\\340.01\\\\-50.97656\\\\297.0061\\\\340.01\\\\-41.60156\\\\296.9731\\\\340.01\\\\-39.25781\\\\296.8877\\\\340.01\\\\-36.91406\\\\296.9467\\\\340.01\\\\-32.22656\\\\296.9731\\\\340.01\\\\-29.88281\\\\296.8888\\\\340.01\\\\-25.19531\\\\296.8798\\\\340.01\\\\-22.85156\\\\297.0362\\\\340.01\\\\-20.50781\\\\296.8789\\\\340.01\\\\-15.82031\\\\296.9535\\\\340.01\\\\-4.101563\\\\296.8673\\\\340.01\\\\-1.757813\\\\296.9081\\\\340.01\\\\19.33594\\\\296.7952\\\\340.01\\\\21.67969\\\\296.8163\\\\340.01\\\\33.39844\\\\296.734\\\\340.01\\\\42.77344\\\\296.7324\\\\340.01\\\\49.80469\\\\296.6724\\\\340.01\\\\66.21094\\\\296.6346\\\\340.01\\\\87.30469\\\\296.5154\\\\340.01\\\\96.67969\\\\296.5208\\\\340.01\\\\99.02344\\\\296.473\\\\340.01\\\\108.3984\\\\296.466\\\\340.01\\\\110.7422\\\\296.4326\\\\340.01\\\\117.7734\\\\296.446\\\\340.01\\\\131.8359\\\\296.308\\\\340.01\\\\134.1797\\\\296.1372\\\\340.01\\\\136.5234\\\\295.8701\\\\340.01\\\\152.9297\\\\295.8012\\\\340.01\\\\157.6172\\\\295.833\\\\340.01\\\\159.9609\\\\295.7849\\\\340.01\\\\164.6484\\\\295.8172\\\\340.01\\\\171.6797\\\\295.7684\\\\340.01\\\\176.3672\\\\295.6638\\\\340.01\\\\183.3984\\\\295.6819\\\\340.01\\\\190.4297\\\\295.6093\\\\340.01\\\\192.7734\\\\295.6272\\\\340.01\\\\197.4609\\\\295.833\\\\340.01\\\\202.1484\\\\295.7173\\\\340.01\\\\204.4922\\\\295.3679\\\\340.01\\\\206.8359\\\\294.7878\\\\340.01\\\\209.1797\\\\294.3717\\\\340.01\\\\211.5234\\\\292.5075\\\\340.01\\\\213.8672\\\\291.2065\\\\340.01\\\\216.2109\\\\289.6012\\\\340.01\\\\217.2437\\\\288.6234\\\\340.01\\\\218.5547\\\\287.1462\\\\340.01\\\\221.7714\\\\283.9359\\\\340.01\\\\225.5859\\\\279.9119\\\\340.01\\\\227.9297\\\\277.6044\\\\340.01\\\\230.2734\\\\275.1119\\\\340.01\\\\233.2526\\\\272.2172\\\\340.01\\\\234.9609\\\\270.3654\\\\340.01\\\\237.8731\\\\267.5297\\\\340.01\\\\240.1082\\\\265.1859\\\\340.01\\\\242.4774\\\\262.8422\\\\340.01\\\\246.6797\\\\258.4333\\\\340.01\\\\249.248\\\\255.8109\\\\340.01\\\\251.4573\\\\253.4672\\\\340.01\\\\256.0547\\\\248.2246\\\\340.01\\\\257.4792\\\\246.4359\\\\340.01\\\\259.8469\\\\244.0922\\\\340.01\\\\260.9666\\\\241.7484\\\\340.01\\\\261.8304\\\\239.4047\\\\340.01\\\\261.0668\\\\237.0609\\\\340.01\\\\259.4996\\\\234.7172\\\\340.01\\\\258.3984\\\\233.6932\\\\340.01\\\\256.0547\\\\233.1526\\\\340.01\\\\253.7109\\\\233.0245\\\\340.01\\\\251.3672\\\\233.382\\\\340.01\\\\249.0234\\\\232.6886\\\\340.01\\\\244.3359\\\\232.8195\\\\340.01\\\\241.9922\\\\233.0007\\\\340.01\\\\232.6172\\\\233.0305\\\\340.01\\\\227.9297\\\\233.0007\\\\340.01\\\\223.2422\\\\233.0441\\\\340.01\\\\209.1797\\\\233.0108\\\\340.01\\\\206.8359\\\\233.0343\\\\340.01\\\\204.4922\\\\232.916\\\\340.01\\\\202.1484\\\\232.6179\\\\340.01\\\\195.1172\\\\232.7322\\\\340.01\\\\181.0547\\\\232.7719\\\\340.01\\\\174.0234\\\\232.7456\\\\340.01\\\\166.9922\\\\232.7614\\\\340.01\\\\148.2422\\\\232.8497\\\\340.01\\\\141.2109\\\\232.8253\\\\340.01\\\\136.5234\\\\232.721\\\\340.01\\\\134.1797\\\\232.7614\\\\340.01\\\\129.4922\\\\232.7481\\\\340.01\\\\113.0859\\\\232.8617\\\\340.01\\\\106.0547\\\\232.8735\\\\340.01\\\\103.7109\\\\232.8253\\\\340.01\\\\101.3672\\\\232.9942\\\\340.01\\\\96.67969\\\\233.1397\\\\340.01\\\\68.55469\\\\233.1483\\\\340.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"342\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"23\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-13.47656\\\\296.8499\\\\343.01\\\\14.64844\\\\296.8324\\\\343.01\\\\33.39844\\\\296.8033\\\\343.01\\\\63.86719\\\\296.7919\\\\343.01\\\\87.30469\\\\296.7566\\\\343.01\\\\117.7734\\\\296.7458\\\\343.01\\\\131.8359\\\\296.7216\\\\343.01\\\\136.5234\\\\296.6649\\\\343.01\\\\138.8672\\\\295.4763\\\\343.01\\\\157.6172\\\\295.4763\\\\343.01\\\\159.9609\\\\295.4454\\\\343.01\\\\164.6484\\\\295.4763\\\\343.01\\\\166.9922\\\\295.4454\\\\343.01\\\\176.3672\\\\295.4154\\\\343.01\\\\192.7734\\\\295.4006\\\\343.01\\\\197.4609\\\\295.4763\\\\343.01\\\\202.1484\\\\295.4303\\\\343.01\\\\204.4922\\\\295.3165\\\\343.01\\\\206.8359\\\\295.0653\\\\343.01\\\\209.1797\\\\294.4177\\\\343.01\\\\211.5234\\\\292.3443\\\\343.01\\\\213.8672\\\\291.6227\\\\343.01\\\\214.5661\\\\290.9672\\\\343.01\\\\216.2109\\\\289.7204\\\\343.01\\\\217.3604\\\\288.6234\\\\343.01\\\\219.4239\\\\286.2797\\\\343.01\\\\221.9183\\\\283.9359\\\\343.01\\\\225.5859\\\\280.0836\\\\343.01\\\\227.9297\\\\277.9224\\\\343.01\\\\230.2734\\\\275.331\\\\343.01\\\\231.0524\\\\274.5609\\\\343.01\\\\232.6172\\\\273.2719\\\\343.01\\\\233.6719\\\\272.2172\\\\343.01\\\\235.7042\\\\269.8734\\\\343.01\\\\238.2833\\\\267.5297\\\\343.01\\\\240.4319\\\\265.1859\\\\343.01\\\\244.3359\\\\261.4106\\\\343.01\\\\246.6797\\\\258.8701\\\\343.01\\\\249.0234\\\\256.7692\\\\343.01\\\\249.948\\\\255.8109\\\\343.01\\\\251.3672\\\\254.1198\\\\343.01\\\\254.5945\\\\251.1234\\\\343.01\\\\255.6744\\\\248.7797\\\\343.01\\\\257.489\\\\246.4359\\\\343.01\\\\259.8584\\\\244.0922\\\\343.01\\\\260.9205\\\\241.7484\\\\343.01\\\\261.8858\\\\239.4047\\\\343.01\\\\261.2413\\\\237.0609\\\\343.01\\\\259.3759\\\\234.7172\\\\343.01\\\\258.3984\\\\233.7629\\\\343.01\\\\256.0547\\\\232.9203\\\\343.01\\\\251.3672\\\\232.8406\\\\343.01\\\\249.0234\\\\232.6981\\\\343.01\\\\241.9922\\\\232.8407\\\\343.01\\\\234.9609\\\\232.8642\\\\343.01\\\\227.9297\\\\232.8407\\\\343.01\\\\218.5547\\\\232.8757\\\\343.01\\\\213.8672\\\\232.8525\\\\343.01\\\\206.8359\\\\232.8642\\\\343.01\\\\202.1484\\\\232.7003\\\\343.01\\\\197.4609\\\\232.7406\\\\343.01\\\\190.4297\\\\232.7537\\\\343.01\\\\174.0234\\\\232.7537\\\\343.01\\\\157.6172\\\\232.7666\\\\343.01\\\\155.2734\\\\232.792\\\\343.01\\\\141.2109\\\\232.7794\\\\343.01\\\\136.5234\\\\232.7406\\\\343.01\\\\124.8047\\\\232.7537\\\\343.01\\\\122.4609\\\\232.7794\\\\343.01\\\\103.7109\\\\232.7794\\\\343.01\\\\96.67969\\\\232.9126\\\\343.01\\\\54.49219\\\\232.9126\\\\343.01\\\\45.11719\\\\232.8902\\\\343.01\\\\42.77344\\\\232.8044\\\\343.01\\\\38.08594\\\\232.7794\\\\343.01\\\\36.64153\\\\232.3734\\\\343.01\\\\38.08594\\\\231.9234\\\\343.01\\\\40.42969\\\\229.497\\\\343.01\\\\42.77344\\\\229.0768\\\\343.01\\\\45.11719\\\\228.3851\\\\343.01\\\\47.46094\\\\226.9828\\\\343.01\\\\49.80469\\\\226.2342\\\\343.01\\\\52.14844\\\\224.5333\\\\343.01\\\\54.49219\\\\223.435\\\\343.01\\\\54.94049\\\\222.9984\\\\343.01\\\\56.83594\\\\221.7432\\\\343.01\\\\58.32031\\\\220.6547\\\\343.01\\\\59.17969\\\\219.8756\\\\343.01\\\\61.52344\\\\219.154\\\\343.01\\\\64.5971\\\\215.9672\\\\343.01\\\\66.21094\\\\214.6717\\\\343.01\\\\67.30957\\\\213.6234\\\\343.01\\\\69.44305\\\\211.2797\\\\343.01\\\\71.93533\\\\208.9359\\\\343.01\\\\75.58594\\\\204.9751\\\\343.01\\\\76.34663\\\\204.2484\\\\343.01\\\\77.07796\\\\201.9047\\\\343.01\\\\79.4009\\\\199.5609\\\\343.01\\\\80.80936\\\\197.2172\\\\343.01\\\\82.61719\\\\194.8027\\\\343.01\\\\83.81027\\\\192.5297\\\\343.01\\\\84.70689\\\\190.1859\\\\343.01\\\\86.036\\\\187.8422\\\\343.01\\\\87.30469\\\\185.8838\\\\343.01\\\\87.68246\\\\185.4984\\\\343.01\\\\88.88221\\\\180.8109\\\\343.01\\\\89.11252\\\\178.4672\\\\343.01\\\\89.64844\\\\177.7911\\\\343.01\\\\90.63388\\\\176.1234\\\\343.01\\\\90.79569\\\\173.7797\\\\343.01\\\\91.10613\\\\171.4359\\\\343.01\\\\92.53577\\\\169.0922\\\\343.01\\\\92.74599\\\\166.7484\\\\343.01\\\\92.91211\\\\162.0609\\\\343.01\\\\93.33398\\\\159.7172\\\\343.01\\\\93.3525\\\\150.3422\\\\343.01\\\\92.9874\\\\147.9984\\\\343.01\\\\92.81616\\\\143.3109\\\\343.01\\\\92.65137\\\\140.9672\\\\343.01\\\\92.28917\\\\138.6234\\\\343.01\\\\91.99219\\\\138.295\\\\343.01\\\\90.88379\\\\136.2797\\\\343.01\\\\90.72434\\\\133.9359\\\\343.01\\\\89.63928\\\\131.5922\\\\343.01\\\\89.00118\\\\129.2484\\\\343.01\\\\88.44993\\\\126.9047\\\\343.01\\\\88.13577\\\\124.5609\\\\343.01\\\\87.30469\\\\123.6708\\\\343.01\\\\86.17751\\\\122.2172\\\\343.01\\\\85.52595\\\\119.8734\\\\343.01\\\\84.34743\\\\117.5297\\\\343.01\\\\83.591\\\\115.1859\\\\343.01\\\\81.36161\\\\112.8422\\\\343.01\\\\80.40365\\\\110.4984\\\\343.01\\\\77.92969\\\\107.4057\\\\343.01\\\\76.88994\\\\105.8109\\\\343.01\\\\75.58594\\\\104.1483\\\\343.01\\\\72.53094\\\\101.1234\\\\343.01\\\\70.89844\\\\99.3583\\\\343.01\\\\68.03966\\\\96.43594\\\\343.01\\\\66.21094\\\\94.85841\\\\343.01\\\\63.2178\\\\91.74844\\\\343.01\\\\59.9375\\\\89.40469\\\\343.01\\\\56.83594\\\\86.85168\\\\343.01\\\\54.49219\\\\85.89411\\\\343.01\\\\52.14844\\\\83.75636\\\\343.01\\\\49.80469\\\\83.0305\\\\343.01\\\\47.46094\\\\81.82986\\\\343.01\\\\45.11719\\\\81.13115\\\\343.01\\\\43.61636\\\\80.02969\\\\343.01\\\\42.77344\\\\79.26299\\\\343.01\\\\40.42969\\\\78.94232\\\\343.01\\\\38.08594\\\\78.44798\\\\343.01\\\\35.74219\\\\77.71319\\\\343.01\\\\33.39844\\\\76.62014\\\\343.01\\\\31.05469\\\\76.45058\\\\343.01\\\\28.99255\\\\75.34219\\\\343.01\\\\28.71094\\\\75.08814\\\\343.01\\\\26.36719\\\\74.78448\\\\343.01\\\\24.02344\\\\74.61057\\\\343.01\\\\21.67969\\\\74.54632\\\\343.01\\\\19.33594\\\\74.09106\\\\343.01\\\\9.960938\\\\74.04196\\\\343.01\\\\5.273438\\\\74.09106\\\\343.01\\\\2.929688\\\\74.55463\\\\343.01\\\\0.5859375\\\\74.63775\\\\343.01\\\\-4.101563\\\\75.10286\\\\343.01\\\\-6.445313\\\\76.49429\\\\343.01\\\\-8.789063\\\\76.67171\\\\343.01\\\\-10.42799\\\\77.68594\\\\343.01\\\\-11.13281\\\\78.2649\\\\343.01\\\\-13.47656\\\\78.54448\\\\343.01\\\\-15.82031\\\\79.10727\\\\343.01\\\\-18.16406\\\\79.86597\\\\343.01\\\\-18.33274\\\\80.02969\\\\343.01\\\\-22.37745\\\\82.37344\\\\343.01\\\\-22.85156\\\\82.77675\\\\343.01\\\\-25.19531\\\\83.57171\\\\343.01\\\\-27.22969\\\\84.71719\\\\343.01\\\\-27.53906\\\\84.99342\\\\343.01\\\\-29.88281\\\\86.06935\\\\343.01\\\\-32.22656\\\\87.99243\\\\343.01\\\\-34.57031\\\\90.32504\\\\343.01\\\\-36.91406\\\\91.11633\\\\343.01\\\\-37.53859\\\\91.74844\\\\343.01\\\\-41.60156\\\\95.4947\\\\343.01\\\\-44.75509\\\\98.77969\\\\343.01\\\\-46.28906\\\\100.0988\\\\343.01\\\\-47.29911\\\\101.1234\\\\343.01\\\\-48.63281\\\\102.8523\\\\343.01\\\\-51.72631\\\\105.8109\\\\343.01\\\\-52.41647\\\\108.1547\\\\343.01\\\\-53.32031\\\\109.1202\\\\343.01\\\\-54.39367\\\\110.4984\\\\343.01\\\\-55.85938\\\\112.8422\\\\343.01\\\\-57.07632\\\\115.1859\\\\343.01\\\\-58.80323\\\\117.5297\\\\343.01\\\\-59.511\\\\119.8734\\\\343.01\\\\-60.86516\\\\122.2172\\\\343.01\\\\-61.57744\\\\124.5609\\\\343.01\\\\-61.88775\\\\126.9047\\\\343.01\\\\-63.71547\\\\129.2484\\\\343.01\\\\-64.02027\\\\131.5922\\\\343.01\\\\-64.8298\\\\133.9359\\\\343.01\\\\-65.21739\\\\136.2797\\\\343.01\\\\-66.03065\\\\138.6234\\\\343.01\\\\-66.32159\\\\145.6547\\\\343.01\\\\-66.52577\\\\147.9984\\\\343.01\\\\-68.15379\\\\150.3422\\\\343.01\\\\-68.19411\\\\152.6859\\\\343.01\\\\-68.12855\\\\159.7172\\\\343.01\\\\-67.38281\\\\160.578\\\\343.01\\\\-66.33832\\\\162.0609\\\\343.01\\\\-66.11034\\\\169.0922\\\\343.01\\\\-65.01181\\\\173.7797\\\\343.01\\\\-64.67431\\\\176.1234\\\\343.01\\\\-63.80735\\\\178.4672\\\\343.01\\\\-63.54492\\\\180.8109\\\\343.01\\\\-61.65305\\\\183.1547\\\\343.01\\\\-61.42054\\\\185.4984\\\\343.01\\\\-60.49805\\\\187.8422\\\\343.01\\\\-58.00781\\\\191.825\\\\343.01\\\\-57.387\\\\192.5297\\\\343.01\\\\-56.74913\\\\194.8734\\\\343.01\\\\-55.66406\\\\195.936\\\\343.01\\\\-54.58899\\\\197.2172\\\\343.01\\\\-53.60318\\\\199.5609\\\\343.01\\\\-50.97656\\\\203.258\\\\343.01\\\\-48.00071\\\\206.5922\\\\343.01\\\\-45.5013\\\\208.9359\\\\343.01\\\\-43.50982\\\\211.2797\\\\343.01\\\\-41.60156\\\\212.84\\\\343.01\\\\-39.25781\\\\215.3739\\\\343.01\\\\-35.93977\\\\218.3109\\\\343.01\\\\-34.57031\\\\219.3768\\\\343.01\\\\-32.52378\\\\220.6547\\\\343.01\\\\-32.22656\\\\220.9395\\\\343.01\\\\-29.88281\\\\221.9077\\\\343.01\\\\-28.61672\\\\222.9984\\\\343.01\\\\-27.53906\\\\224.1391\\\\343.01\\\\-25.19531\\\\224.7669\\\\343.01\\\\-24.54516\\\\225.3422\\\\343.01\\\\-20.89297\\\\227.6859\\\\343.01\\\\-20.50781\\\\228.0531\\\\343.01\\\\-18.16406\\\\228.8638\\\\343.01\\\\-15.82031\\\\229.1627\\\\343.01\\\\-14.73801\\\\230.0297\\\\343.01\\\\-13.47656\\\\231.7823\\\\343.01\\\\-11.13281\\\\231.9774\\\\343.01\\\\-10.70429\\\\232.3734\\\\343.01\\\\-11.13281\\\\232.7537\\\\343.01\\\\-15.82031\\\\232.8044\\\\343.01\\\\-20.50781\\\\232.9015\\\\343.01\\\\-34.57031\\\\232.9126\\\\343.01\\\\-41.60156\\\\232.9345\\\\343.01\\\\-58.00781\\\\232.9453\\\\343.01\\\\-60.35156\\\\232.9345\\\\343.01\\\\-62.69531\\\\233.5567\\\\343.01\\\\-65.03906\\\\232.8672\\\\343.01\\\\-83.78906\\\\232.8788\\\\343.01\\\\-93.16406\\\\232.9126\\\\343.01\\\\-95.50781\\\\233.5393\\\\343.01\\\\-97.85156\\\\233.7035\\\\343.01\\\\-102.5391\\\\233.7288\\\\343.01\\\\-121.2891\\\\233.7406\\\\343.01\\\\-137.6953\\\\233.7202\\\\343.01\\\\-142.3828\\\\233.7337\\\\343.01\\\\-163.4766\\\\233.7135\\\\343.01\\\\-168.1641\\\\233.7435\\\\343.01\\\\-189.2578\\\\233.76\\\\343.01\\\\-200.9766\\\\233.788\\\\343.01\\\\-208.0078\\\\233.7738\\\\343.01\\\\-222.0703\\\\233.8144\\\\343.01\\\\-243.1641\\\\233.72\\\\343.01\\\\-247.8516\\\\233.5974\\\\343.01\\\\-250.1953\\\\233.592\\\\343.01\\\\-252.5391\\\\233.6761\\\\343.01\\\\-254.8828\\\\233.8458\\\\343.01\\\\-257.2266\\\\233.8853\\\\343.01\\\\-258.0715\\\\234.7172\\\\343.01\\\\-260.9406\\\\237.0609\\\\343.01\\\\-261.9141\\\\237.9809\\\\343.01\\\\-263.0811\\\\239.4047\\\\343.01\\\\-263.0952\\\\241.7484\\\\343.01\\\\-262.8482\\\\244.0922\\\\343.01\\\\-261.1393\\\\246.4359\\\\343.01\\\\-259.5703\\\\248.77\\\\343.01\\\\-257.2359\\\\251.1234\\\\343.01\\\\-256.1725\\\\253.4672\\\\343.01\\\\-254.8828\\\\254.541\\\\343.01\\\\-253.6187\\\\255.8109\\\\343.01\\\\-252.5391\\\\257.1211\\\\343.01\\\\-248.9935\\\\260.4984\\\\343.01\\\\-246.7643\\\\262.8422\\\\343.01\\\\-243.1641\\\\266.3453\\\\343.01\\\\-239.7483\\\\269.8734\\\\343.01\\\\-238.4766\\\\270.9653\\\\343.01\\\\-237.2486\\\\272.2172\\\\343.01\\\\-236.1328\\\\273.5273\\\\343.01\\\\-235.0992\\\\274.5609\\\\343.01\\\\-233.7891\\\\275.6767\\\\343.01\\\\-232.5432\\\\276.9047\\\\343.01\\\\-231.4453\\\\278.1825\\\\343.01\\\\-227.9297\\\\281.5922\\\\343.01\\\\-224.4141\\\\285.1934\\\\343.01\\\\-222.0703\\\\287.4207\\\\343.01\\\\-218.7154\\\\290.9672\\\\343.01\\\\-217.3828\\\\291.9945\\\\343.01\\\\-215.0391\\\\293.3382\\\\343.01\\\\-212.6953\\\\294.5551\\\\343.01\\\\-210.3516\\\\295.3438\\\\343.01\\\\-209.9888\\\\295.6547\\\\343.01\\\\-208.0078\\\\296.7353\\\\343.01\\\\-203.3203\\\\296.9163\\\\343.01\\\\-198.6328\\\\296.9163\\\\343.01\\\\-193.9453\\\\296.8423\\\\343.01\\\\-179.8828\\\\296.8319\\\\343.01\\\\-168.1641\\\\296.8428\\\\343.01\\\\-161.1328\\\\296.8266\\\\343.01\\\\-147.0703\\\\296.8376\\\\343.01\\\\-121.2891\\\\296.8209\\\\343.01\\\\-111.9141\\\\296.8435\\\\343.01\\\\-97.85156\\\\296.855\\\\343.01\\\\-90.82031\\\\296.838\\\\343.01\\\\-65.03906\\\\296.8668\\\\343.01\\\\-53.32031\\\\296.8553\\\\343.01\\\\-51.43964\\\\297.9984\\\\343.01\\\\-50.97656\\\\298.3864\\\\343.01\\\\-48.63281\\\\297.5516\\\\343.01\\\\-46.28906\\\\298.5331\\\\343.01\\\\-43.94531\\\\298.5331\\\\343.01\\\\-41.60156\\\\298.2598\\\\343.01\\\\-39.25781\\\\296.8499\\\\343.01\\\\-36.91406\\\\297.9681\\\\343.01\\\\-32.22656\\\\298.5331\\\\343.01\\\\-29.88281\\\\296.8741\\\\343.01\\\\-27.53906\\\\296.8383\\\\343.01\\\\-25.19531\\\\296.9201\\\\343.01\\\\-22.85156\\\\298.5331\\\\343.01\\\\-20.50781\\\\296.8441\\\\343.01\\\\-18.16406\\\\298.1147\\\\343.01\\\\-15.82031\\\\297.8174\\\\343.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,002a\" : {\n" -" \"Name\" : \"ROIDisplayColor\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"255\\\\0\\\\255\"\n" -" },\n" -" \"3006,0040\" : {\n" -" \"Name\" : \"ContourSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699844642358900001.492074456493\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"0\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"13.63579\\\\147.5839\\\\274.01\\\\11.63579\\\\147.882\\\\274.01\\\\10.13579\\\\148.3365\\\\274.01\\\\9.135789\\\\148.7989\\\\274.01\\\\7.635788\\\\149.7859\\\\274.01\\\\6.037574\\\\151.4199\\\\274.01\\\\5.095466\\\\152.9199\\\\274.01\\\\4.507\\\\154.4199\\\\274.01\\\\4.299851\\\\155.4199\\\\274.01\\\\4.099024\\\\157.4199\\\\274.01\\\\4.240627\\\\158.9199\\\\274.01\\\\4.522152\\\\160.4199\\\\274.01\\\\5.437513\\\\162.4199\\\\274.01\\\\6.109003\\\\163.4199\\\\274.01\\\\7.635788\\\\164.9824\\\\274.01\\\\9.135789\\\\165.9763\\\\274.01\\\\10.63579\\\\166.5941\\\\274.01\\\\12.13579\\\\166.9426\\\\274.01\\\\13.63579\\\\167.0941\\\\274.01\\\\15.13579\\\\166.988\\\\274.01\\\\17.13579\\\\166.537\\\\274.01\\\\19.13579\\\\165.5782\\\\274.01\\\\20.63579\\\\164.3655\\\\274.01\\\\22.19224\\\\162.4199\\\\274.01\\\\22.7061\\\\161.4199\\\\274.01\\\\23.21912\\\\159.9199\\\\274.01\\\\23.42485\\\\158.9199\\\\274.01\\\\23.5186\\\\156.9199\\\\274.01\\\\23.23427\\\\154.9199\\\\274.01\\\\22.72173\\\\153.4199\\\\274.01\\\\22.22746\\\\152.4199\\\\274.01\\\\21.13579\\\\150.9318\\\\274.01\\\\20.09829\\\\149.9199\\\\274.01\\\\18.63579\\\\148.8949\\\\274.01\\\\17.13579\\\\148.2402\\\\274.01\\\\15.63579\\\\147.8214\\\\274.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845076383700001.470610289105\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"47\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-2.854718\\\\157.4199\\\\277.01\\\\-2.472545\\\\160.9199\\\\277.01\\\\-1.487775\\\\163.9199\\\\277.01\\\\-0.4315192\\\\165.9199\\\\277.01\\\\0.9787372\\\\167.9199\\\\277.01\\\\2.406915\\\\169.4199\\\\277.01\\\\3.635788\\\\170.4986\\\\277.01\\\\5.135788\\\\171.5571\\\\277.01\\\\6.135788\\\\172.111\\\\277.01\\\\8.135789\\\\173.0158\\\\277.01\\\\10.13579\\\\173.6004\\\\277.01\\\\12.63579\\\\174.0313\\\\277.01\\\\15.13579\\\\174.0013\\\\277.01\\\\17.63579\\\\173.571\\\\277.01\\\\19.13579\\\\173.1137\\\\277.01\\\\21.63579\\\\172.0419\\\\277.01\\\\23.13579\\\\171.1081\\\\277.01\\\\24.63579\\\\169.9456\\\\277.01\\\\26.19738\\\\168.4199\\\\277.01\\\\27.74516\\\\166.4199\\\\277.01\\\\28.32924\\\\165.4199\\\\277.01\\\\29.29383\\\\163.4199\\\\277.01\\\\29.81079\\\\161.9199\\\\277.01\\\\30.28139\\\\159.9199\\\\277.01\\\\30.45172\\\\157.4199\\\\277.01\\\\30.29068\\\\154.9199\\\\277.01\\\\29.82399\\\\152.9199\\\\277.01\\\\28.86814\\\\150.4199\\\\277.01\\\\27.79128\\\\148.4199\\\\277.01\\\\26.27724\\\\146.4199\\\\277.01\\\\24.63579\\\\144.8084\\\\277.01\\\\22.63579\\\\143.3281\\\\277.01\\\\21.63579\\\\142.7463\\\\277.01\\\\19.63579\\\\141.8135\\\\277.01\\\\18.13579\\\\141.3103\\\\277.01\\\\15.63579\\\\140.7907\\\\277.01\\\\13.63579\\\\140.6754\\\\277.01\\\\12.13579\\\\140.7704\\\\277.01\\\\9.635789\\\\141.2671\\\\277.01\\\\8.135789\\\\141.7522\\\\277.01\\\\5.135788\\\\143.2278\\\\277.01\\\\3.635788\\\\144.2585\\\\277.01\\\\2.350577\\\\145.4199\\\\277.01\\\\0.5107885\\\\147.4199\\\\277.01\\\\-0.5040925\\\\148.9199\\\\277.01\\\\-1.520461\\\\150.9199\\\\277.01\\\\-2.489212\\\\153.9199\\\\277.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699845095384800001.485181436634\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"52\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n"; -const char* k_rtStruct_json06 = -" \"Value\" : \"-5.041041\\\\149.9199\\\\280.01\\\\-6.018211\\\\152.9199\\\\280.01\\\\-6.511849\\\\155.9199\\\\280.01\\\\-6.502212\\\\158.9199\\\\280.01\\\\-5.99526\\\\161.9199\\\\280.01\\\\-5.006773\\\\164.9199\\\\280.01\\\\-4.038581\\\\166.9199\\\\280.01\\\\-3.442042\\\\167.9199\\\\280.01\\\\-2.039212\\\\169.9199\\\\280.01\\\\-1.135438\\\\170.9199\\\\280.01\\\\1.135789\\\\173.1176\\\\280.01\\\\3.135788\\\\174.5681\\\\280.01\\\\6.135788\\\\176.1244\\\\280.01\\\\8.635789\\\\177.0288\\\\280.01\\\\11.13579\\\\177.5844\\\\280.01\\\\13.63579\\\\177.7594\\\\280.01\\\\16.63579\\\\177.5678\\\\280.01\\\\18.63579\\\\177.1104\\\\280.01\\\\21.63579\\\\176.0678\\\\280.01\\\\23.63579\\\\175.0686\\\\280.01\\\\25.13579\\\\174.1177\\\\280.01\\\\27.63579\\\\172.1109\\\\280.01\\\\29.24222\\\\170.4199\\\\280.01\\\\30.74459\\\\168.4199\\\\280.01\\\\31.88371\\\\166.4199\\\\280.01\\\\32.81119\\\\164.4199\\\\280.01\\\\33.32179\\\\162.9199\\\\280.01\\\\33.82031\\\\160.9199\\\\280.01\\\\34.18623\\\\157.4199\\\\280.01\\\\34.07163\\\\155.9199\\\\280.01\\\\33.74713\\\\153.4199\\\\280.01\\\\32.83294\\\\150.4199\\\\280.01\\\\32.18903\\\\148.9199\\\\280.01\\\\30.80605\\\\146.4199\\\\280.01\\\\29.31239\\\\144.4199\\\\280.01\\\\28.13579\\\\143.1796\\\\280.01\\\\26.63579\\\\141.776\\\\280.01\\\\24.63579\\\\140.3194\\\\280.01\\\\23.63579\\\\139.7211\\\\280.01\\\\21.63579\\\\138.7252\\\\280.01\\\\19.13579\\\\137.8053\\\\280.01\\\\16.63579\\\\137.2421\\\\280.01\\\\13.63579\\\\137.0479\\\\280.01\\\\10.63579\\\\137.2928\\\\280.01\\\\8.635789\\\\137.7512\\\\280.01\\\\7.135788\\\\138.2404\\\\280.01\\\\4.635788\\\\139.3442\\\\280.01\\\\3.135788\\\\140.2151\\\\280.01\\\\1.635789\\\\141.2464\\\\280.01\\\\-0.8642115\\\\143.5646\\\\280.01\\\\-2.084666\\\\144.9199\\\\280.01\\\\-3.518559\\\\146.9199\\\\280.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846442461900001.533642576430\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"35\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-36.86421\\\\165.9127\\\\283.01\\\\-33.86421\\\\165.5801\\\\283.01\\\\-32.36421\\\\165.0618\\\\283.01\\\\-31.36421\\\\164.5518\\\\283.01\\\\-29.86421\\\\163.5032\\\\283.01\\\\-28.76573\\\\162.4199\\\\283.01\\\\-27.6906\\\\160.9199\\\\283.01\\\\-26.75524\\\\158.9199\\\\283.01\\\\-26.24242\\\\156.9199\\\\283.01\\\\-26.08132\\\\155.4199\\\\283.01\\\\-26.27046\\\\153.4199\\\\283.01\\\\-26.69974\\\\151.9199\\\\283.01\\\\-27.3034\\\\150.4199\\\\283.01\\\\-28.22451\\\\148.9199\\\\283.01\\\\-29.07254\\\\147.9199\\\\283.01\\\\-30.86421\\\\146.4123\\\\283.01\\\\-32.86421\\\\145.387\\\\283.01\\\\-34.86421\\\\144.8136\\\\283.01\\\\-36.36421\\\\144.637\\\\283.01\\\\-38.86421\\\\144.8261\\\\283.01\\\\-40.36421\\\\145.2685\\\\283.01\\\\-41.86421\\\\145.9129\\\\283.01\\\\-43.36421\\\\146.839\\\\283.01\\\\-45.00815\\\\148.4199\\\\283.01\\\\-46.03782\\\\149.9199\\\\283.01\\\\-46.92191\\\\151.9199\\\\283.01\\\\-47.13395\\\\152.9199\\\\283.01\\\\-47.39546\\\\155.4199\\\\283.01\\\\-47.01165\\\\158.4199\\\\283.01\\\\-46.47908\\\\159.9199\\\\283.01\\\\-45.95449\\\\160.9199\\\\283.01\\\\-44.36421\\\\162.8921\\\\283.01\\\\-42.36421\\\\164.4824\\\\283.01\\\\-41.36421\\\\165.0054\\\\283.01\\\\-39.86421\\\\165.5288\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846477463900001.467218939844\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"6.135788\\\\112.0556\\\\283.01\\\\8.135789\\\\113.058\\\\283.01\\\\9.635789\\\\113.5261\\\\283.01\\\\11.13579\\\\113.7211\\\\283.01\\\\13.13579\\\\113.7083\\\\283.01\\\\14.63579\\\\113.4775\\\\283.01\\\\17.13579\\\\112.4942\\\\283.01\\\\18.63579\\\\111.5302\\\\283.01\\\\20.27973\\\\109.9199\\\\283.01\\\\21.29551\\\\108.4199\\\\283.01\\\\22.15553\\\\106.4199\\\\283.01\\\\22.49763\\\\104.4199\\\\283.01\\\\22.56146\\\\102.9199\\\\283.01\\\\22.45816\\\\101.4199\\\\283.01\\\\22.20454\\\\99.91986\\\\283.01\\\\21.35107\\\\97.91986\\\\283.01\\\\20.75722\\\\96.91986\\\\283.01\\\\19.13579\\\\95.12147\\\\283.01\\\\18.13579\\\\94.30956\\\\283.01\\\\17.13579\\\\93.71847\\\\283.01\\\\15.13579\\\\92.88696\\\\283.01\\\\13.63579\\\\92.61065\\\\283.01\\\\11.63579\\\\92.5317\\\\283.01\\\\9.135789\\\\92.82371\\\\283.01\\\\7.635788\\\\93.33433\\\\283.01\\\\6.635788\\\\93.82958\\\\283.01\\\\5.135788\\\\94.8808\\\\283.01\\\\4.049851\\\\95.91986\\\\283.01\\\\2.948288\\\\97.41986\\\\283.01\\\\1.984473\\\\99.41986\\\\283.01\\\\1.529539\\\\100.9199\\\\283.01\\\\1.326578\\\\103.4199\\\\283.01\\\\1.542039\\\\105.4199\\\\283.01\\\\2.010788\\\\106.9199\\\\283.01\\\\3.000074\\\\108.9199\\\\283.01\\\\4.135788\\\\110.3525\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846504465400001.571321740640\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"60\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"9.635789\\\\134.821\\\\283.01\\\\6.635788\\\\135.7311\\\\283.01\\\\5.135788\\\\136.3564\\\\283.01\\\\3.135788\\\\137.3443\\\\283.01\\\\1.635789\\\\138.235\\\\283.01\\\\0.1357885\\\\139.3028\\\\283.01\\\\-1.698245\\\\140.9199\\\\283.01\\\\-4.057226\\\\143.4199\\\\283.01\\\\-5.492074\\\\145.4199\\\\283.01\\\\-6.94348\\\\147.9199\\\\283.01\\\\-8.519453\\\\151.4199\\\\283.01\\\\-9.020194\\\\152.9199\\\\283.01\\\\-9.438021\\\\154.9199\\\\283.01\\\\-9.607633\\\\157.4199\\\\283.01\\\\-9.515528\\\\158.9199\\\\283.01\\\\-8.990245\\\\161.4199\\\\283.01\\\\-7.952794\\\\164.4199\\\\283.01\\\\-7.072832\\\\166.4199\\\\283.01\\\\-6.031465\\\\168.4199\\\\283.01\\\\-5.07724\\\\169.9199\\\\283.01\\\\-3.571932\\\\171.9199\\\\283.01\\\\-2.141343\\\\173.4199\\\\283.01\\\\-0.3642115\\\\175.0795\\\\283.01\\\\1.635789\\\\176.5706\\\\283.01\\\\3.135788\\\\177.5459\\\\283.01\\\\5.635788\\\\178.9883\\\\283.01\\\\7.635788\\\\180.0143\\\\283.01\\\\9.135789\\\\180.633\\\\283.01\\\\12.13579\\\\181.4936\\\\283.01\\\\13.63579\\\\181.6266\\\\283.01\\\\15.13579\\\\181.5587\\\\283.01\\\\17.63579\\\\181.0121\\\\283.01\\\\20.13579\\\\179.997\\\\283.01\\\\23.63579\\\\178.0965\\\\283.01\\\\26.63579\\\\176.1115\\\\283.01\\\\28.63579\\\\174.5219\\\\283.01\\\\30.30579\\\\172.9199\\\\283.01\\\\32.35387\\\\170.4199\\\\283.01\\\\33.34441\\\\168.9199\\\\283.01\\\\34.6741\\\\166.4199\\\\283.01\\\\35.77129\\\\163.9199\\\\283.01\\\\36.76814\\\\160.9199\\\\283.01\\\\37.28946\\\\158.4199\\\\283.01\\\\37.36674\\\\156.4199\\\\283.01\\\\37.27414\\\\154.9199\\\\283.01\\\\36.83626\\\\152.9199\\\\283.01\\\\36.33173\\\\151.4199\\\\283.01\\\\35.21079\\\\148.9199\\\\283.01\\\\33.79925\\\\146.4199\\\\283.01\\\\32.80308\\\\144.9199\\\\283.01\\\\30.83086\\\\142.4199\\\\283.01\\\\29.13579\\\\140.7037\\\\283.01\\\\26.63579\\\\138.7033\\\\283.01\\\\25.13579\\\\137.7264\\\\283.01\\\\23.13579\\\\136.6915\\\\283.01\\\\21.13579\\\\135.8365\\\\283.01\\\\19.63579\\\\135.3254\\\\283.01\\\\17.63579\\\\134.7876\\\\283.01\\\\14.63579\\\\134.3352\\\\283.01\\\\12.63579\\\\134.3453\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699846528466800001.465226999207\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"35\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"6\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11.63579\\\\193.3493\\\\283.01\\\\9.135789\\\\194.3455\\\\283.01\\\\7.635788\\\\195.3096\\\\283.01\\\\5.991849\\\\196.9199\\\\283.01\\\\4.976066\\\\198.4199\\\\283.01\\\\4.116052\\\\200.4199\\\\283.01\\\\3.773946\\\\202.4199\\\\283.01\\\\3.710113\\\\203.9199\\\\283.01\\\\3.81342\\\\205.4199\\\\283.01\\\\4.067039\\\\206.9199\\\\283.01\\\\4.920511\\\\208.9199\\\\283.01\\\\5.51436\\\\209.9199\\\\283.01\\\\7.135788\\\\211.7182\\\\283.01\\\\8.135789\\\\212.5302\\\\283.01\\\\9.135789\\\\213.1212\\\\283.01\\\\11.13579\\\\213.9528\\\\283.01\\\\12.63579\\\\214.2291\\\\283.01\\\\14.63579\\\\214.308\\\\283.01\\\\17.13579\\\\214.016\\\\283.01\\\\18.63579\\\\213.5054\\\\283.01\\\\19.63579\\\\213.0101\\\\283.01\\\\21.13579\\\\211.9589\\\\283.01\\\\22.22173\\\\210.9199\\\\283.01\\\\23.32329\\\\209.4199\\\\283.01\\\\24.2871\\\\207.4199\\\\283.01\\\\24.74204\\\\205.9199\\\\283.01\\\\24.945\\\\203.4199\\\\283.01\\\\24.72954\\\\201.4199\\\\283.01\\\\24.26079\\\\199.9199\\\\283.01\\\\23.2715\\\\197.9199\\\\283.01\\\\22.13579\\\\196.4872\\\\283.01\\\\20.13579\\\\194.774\\\\283.01\\\\18.13579\\\\193.7817\\\\283.01\\\\16.63579\\\\193.3109\\\\283.01\\\\14.13579\\\\193.0843\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848817597700001.509440095881\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"39\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"73.62865\\\\152.4199\\\\283.01\\\\73.25758\\\\149.9199\\\\283.01\\\\72.72131\\\\148.4199\\\\283.01\\\\72.19829\\\\147.4199\\\\283.01\\\\70.63579\\\\145.5002\\\\283.01\\\\69.13579\\\\144.2413\\\\283.01\\\\67.63579\\\\143.3861\\\\283.01\\\\66.13579\\\\142.8237\\\\283.01\\\\64.63579\\\\142.5712\\\\283.01\\\\63.13579\\\\142.4671\\\\283.01\\\\60.13579\\\\142.7724\\\\283.01\\\\58.63579\\\\143.2817\\\\283.01\\\\57.63579\\\\143.7984\\\\283.01\\\\56.13579\\\\144.8652\\\\283.01\\\\55.05246\\\\145.9199\\\\283.01\\\\53.9715\\\\147.4199\\\\283.01\\\\53.02681\\\\149.4199\\\\283.01\\\\52.51399\\\\151.4199\\\\283.01\\\\52.35289\\\\152.9199\\\\283.01\\\\52.53963\\\\154.9199\\\\283.01\\\\52.945\\\\156.4199\\\\283.01\\\\53.53444\\\\157.9199\\\\283.01\\\\54.11373\\\\158.9199\\\\283.01\\\\55.13579\\\\160.2145\\\\283.01\\\\56.13579\\\\161.186\\\\283.01\\\\57.13579\\\\161.9566\\\\283.01\\\\59.13579\\\\163.0032\\\\283.01\\\\60.63579\\\\163.4761\\\\283.01\\\\62.13579\\\\163.6955\\\\283.01\\\\64.13579\\\\163.6699\\\\283.01\\\\65.13579\\\\163.5261\\\\283.01\\\\66.63579\\\\163.0843\\\\283.01\\\\68.13579\\\\162.4546\\\\283.01\\\\69.63579\\\\161.5154\\\\283.01\\\\70.63579\\\\160.6282\\\\283.01\\\\71.68726\\\\159.4199\\\\283.01\\\\72.3094\\\\158.4199\\\\283.01\\\\73.20454\\\\156.4199\\\\283.01\\\\73.48447\\\\154.9199\\\\283.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848849599600001.538291679804\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"46\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"8\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-17.14754\\\\156.4199\\\\286.01\\\\-17.54129\\\\154.9199\\\\286.01\\\\-18.18997\\\\153.4199\\\\286.01\\\\-19.27567\\\\151.4199\\\\286.01\\\\-22.23767\\\\146.4199\\\\286.01\\\\-23.71109\\\\144.4199\\\\286.01\\\\-25.86421\\\\142.2542\\\\286.01\\\\-27.86421\\\\140.7934\\\\286.01\\\\-29.86421\\\\139.7504\\\\286.01\\\\-32.36421\\\\138.8496\\\\286.01\\\\-34.86421\\\\138.3014\\\\286.01\\\\-37.86421\\\\138.2204\\\\286.01\\\\-38.86421\\\\138.315\\\\286.01\\\\-40.86421\\\\138.7523\\\\286.01\\\\-42.36421\\\\139.2324\\\\286.01\\\\-44.86421\\\\140.3181\\\\286.01\\\\-46.36421\\\\141.2324\\\\286.01\\\\-48.36421\\\\142.7916\\\\286.01\\\\-49.47421\\\\143.9199\\\\286.01\\\\-51.016\\\\145.9199\\\\286.01\\\\-51.87383\\\\147.4199\\\\286.01\\\\-52.97685\\\\149.9199\\\\286.01\\\\-53.49453\\\\151.9199\\\\286.01\\\\-53.73249\\\\155.4199\\\\286.01\\\\-53.47443\\\\158.9199\\\\286.01\\\\-52.93605\\\\160.9199\\\\286.01\\\\-52.55032\\\\161.9199\\\\286.01\\\\-51.54154\\\\163.9199\\\\286.01\\\\-50.53799\\\\165.4199\\\\286.01\\\\-49.36421\\\\166.7567\\\\286.01\\\\-46.86421\\\\169.0795\\\\286.01\\\\-45.36421\\\\170.0664\\\\286.01\\\\-43.36421\\\\171.06\\\\286.01\\\\-41.86421\\\\171.5856\\\\286.01\\\\-39.86421\\\\172.0751\\\\286.01\\\\-36.86421\\\\172.2774\\\\286.01\\\\-33.36421\\\\172.0395\\\\286.01\\\\-31.36421\\\\171.5115\\\\286.01\\\\-30.36421\\\\171.1171\\\\286.01\\\\-28.36421\\\\170.1204\\\\286.01\\\\-26.86421\\\\169.1277\\\\286.01\\\\-25.43843\\\\167.9199\\\\286.01\\\\-24.36421\\\\166.8613\\\\286.01\\\\-22.68564\\\\164.9199\\\\286.01\\\\-20.18366\\\\161.4199\\\\286.01\\\\-18.24384\\\\158.4199\\\\286.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848866600500001.541849142008\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"143\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"9\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-14.57135\\\\153.4199\\\\286.01\\\\-15.49516\\\\155.4199\\\\286.01\\\\-15.75707\\\\156.4199\\\\286.01\\\\-15.78467\\\\157.4199\\\\286.01\\\\-15.0439\\\\158.9199\\\\286.01\\\\-14.02238\\\\160.4199\\\\286.01\\\\-11.75342\\\\163.4199\\\\286.01\\\\-10.05119\\\\165.9199\\\\286.01\\\\-9.266294\\\\166.9199\\\\286.01\\\\-6.534666\\\\170.9199\\\\286.01\\\\-4.989212\\\\172.9199\\\\286.01\\\\-2.364212\\\\175.6552\\\\286.01\\\\0.6357885\\\\178.3645\\\\286.01\\\\3.162897\\\\180.9199\\\\286.01\\\\4.831301\\\\182.9199\\\\286.01\\\\5.793481\\\\184.4199\\\\286.01\\\\6.209064\\\\185.4199\\\\286.01\\\\6.251529\\\\186.4199\\\\286.01\\\\5.84561\\\\187.4199\\\\286.01\\\\5.229538\\\\188.4199\\\\286.01\\\\3.904728\\\\189.9199\\\\286.01\\\\1.509165\\\\192.4199\\\\286.01\\\\-0.01421149\\\\194.4199\\\\286.01\\\\-1.566989\\\\197.4199\\\\286.01\\\\-1.955878\\\\198.4199\\\\286.01\\\\-2.473254\\\\200.4199\\\\286.01\\\\-2.691339\\\\203.4199\\\\286.01\\\\-2.664743\\\\204.9199\\\\286.01\\\\-2.487896\\\\206.9199\\\\286.01\\\\-1.985179\\\\208.9199\\\\286.01\\\\-0.9445686\\\\211.4199\\\\286.01\\\\-0.07303502\\\\212.9199\\\\286.01\\\\0.9783811\\\\214.4199\\\\286.01\\\\1.885789\\\\215.4199\\\\286.01\\\\3.635788\\\\217.0773\\\\286.01\\\\5.135788\\\\218.1228\\\\286.01\\\\6.635788\\\\218.9891\\\\286.01\\\\9.135789\\\\220.027\\\\286.01\\\\11.13579\\\\220.5289\\\\286.01\\\\14.13579\\\\220.731\\\\286.01\\\\17.13579\\\\220.5555\\\\286.01\\\\19.13579\\\\220.0785\\\\286.01\\\\20.63579\\\\219.56\\\\286.01\\\\22.63579\\\\218.5779\\\\286.01\\\\24.13579\\\\217.5997\\\\286.01\\\\26.63579\\\\215.3391\\\\286.01\\\\28.25469\\\\213.4199\\\\286.01\\\\29.69829\\\\210.9199\\\\286.01\\\\30.32329\\\\209.4199\\\\286.01\\\\30.81052\\\\207.9199\\\\286.01\\\\31.25947\\\\205.9199\\\\286.01\\\\31.36474\\\\202.9199\\\\286.01\\\\31.25015\\\\201.4199\\\\286.01\\\\30.79802\\\\199.4199\\\\286.01\\\\30.30698\\\\197.9199\\\\286.01\\\\29.65141\\\\196.4199\\\\286.01\\\\28.84218\\\\194.9199\\\\286.01\\\\27.82176\\\\193.4199\\\\286.01\\\\26.13579\\\\191.552\\\\286.01\\\\23.59412\\\\188.9199\\\\286.01\\\\22.45183\\\\187.4199\\\\286.01\\\\21.87136\\\\185.9199\\\\286.01\\\\22.07775\\\\184.9199\\\\286.01\\\\22.51447\\\\183.9199\\\\286.01\\\\23.47013\\\\182.4199\\\\286.01\\\\25.57\\\\179.9199\\\\286.01\\\\27.5517\\\\177.9199\\\\286.01\\\\30.13579\\\\175.5383\\\\286.01\\\\32.1768\\\\173.4199\\\\286.01\\\\33.78976\\\\171.4199\\\\286.01\\\\35.44261\\\\168.9199\\\\286.01\\\\37.52156\\\\165.9199\\\\286.01\\\\40.48853\\\\161.9199\\\\286.01\\\\42.13579\\\\160.0113\\\\286.01\\\\43.13579\\\\159.0058\\\\286.01\\\\44.13579\\\\158.355\\\\286.01\\\\45.63579\\\\159.3214\\\\286.01\\\\47.13579\\\\160.8254\\\\286.01\\\\48.51277\\\\162.4199\\\\286.01\\\\50.37894\\\\164.4199\\\\286.01\\\\52.63579\\\\166.5075\\\\286.01\\\\54.13579\\\\167.5623\\\\286.01\\\\57.13579\\\\169.0584\\\\286.01\\\\58.63579\\\\169.5623\\\\286.01\\\\60.63579\\\\170.0095\\\\286.01\\\\62.13579\\\\170.1383\\\\286.01\\\\65.13579\\\\170.0383\\\\286.01\\\\67.13579\\\\169.5946\\\\286.01\\\\68.63579\\\\169.1182\\\\286.01\\\\71.13579\\\\168.0377\\\\286.01\\\\72.63579\\\\167.1193\\\\286.01\\\\74.63579\\\\165.5595\\\\286.01\\\\75.7575\\\\164.4199\\\\286.01\\\\77.29167\\\\162.4199\\\\286.01\\\\78.15794\\\\160.9199\\\\286.01\\\\79.25264\\\\158.4199\\\\286.01\\\\79.77\\\\156.4199\\\\286.01\\\\80.00407\\\\152.9199\\\\286.01\\\\79.79632\\\\149.9199\\\\286.01\\\\79.30515\\\\147.9199\\\\286.01\\\\78.7759\\\\146.4199\\\\286.01\\\\77.78234\\\\144.4199\\\\286.01\\\\76.78518\\\\142.9199\\\\286.01\\\\75.44829\\\\141.4199\\\\286.01\\\\73.63579\\\\139.7192\\\\286.01\\\\71.63579\\\\138.3489\\\\286.01\\\\69.63579\\\\137.3365\\\\286.01\\\\68.13579\\\\136.7758\\\\286.01\\\\66.13579\\\\136.2751\\\\286.01\\\\62.63579\\\\136.0838\\\\286.01\\\\59.63579\\\\136.315\\\\286.01\\\\57.63579\\\\136.8432\\\\286.01\\\\56.63579\\\\137.2282\\\\286.01\\\\54.63579\\\\138.2251\\\\286.01\\\\53.13579\\\\139.2217\\\\286.01\\\\51.73048\\\\140.4199\\\\286.01\\\\50.63579\\\\141.5006\\\\286.01\\\\49.01391\\\\143.4199\\\\286.01\\\\45.63579\\\\148.6563\\\\286.01\\\\44.13579\\\\150.5612\\\\286.01\\\\43.13579\\\\151.2219\\\\286.01\\\\42.63579\\\\151.0217\\\\286.01\\\\40.13579\\\\149.1523\\\\286.01\\\\35.63579\\\\144.8964\\\\286.01\\\\31.34298\\\\140.4199\\\\286.01\\\\29.63579\\\\138.8365\\\\286.01\\\\27.63579\\\\137.2758\\\\286.01\\\\26.13579\\\\136.2875\\\\286.01\\\\21.63579\\\\133.7337\\\\286.01\\\\18.63579\\\\132.2451\\\\286.01\\\\16.13579\\\\131.3449\\\\286.01\\\\14.13579\\\\130.8667\\\\286.01\\\\12.63579\\\\130.8597\\\\286.01\\\\10.63579\\\\131.2148\\\\286.01\\\\9.135789\\\\131.787\\\\286.01\\\\7.135788\\\\132.7495\\\\286.01\\\\3.635788\\\\134.8391\\\\286.01\\\\0.6357885\\\\136.7923\\\\286.01\\\\-1.364211\\\\138.2802\\\\286.01\\\\-3.166659\\\\139.9199\\\\286.01\\\\-5.078728\\\\141.9199\\\\286.01\\\\-8.743597\\\\146.4199\\\\286.01\\\\-10.50432\\\\148.4199\\\\286.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848890601900001.533619501923\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"50\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"26.28579\\\\112.4199\\\\286.01\\\\27.83857\\\\109.4199\\\\286.01\\\\28.22746\\\\108.4199\\\\286.01\\\\28.74483\\\\106.4199\\\\286.01\\\\28.96292\\\\103.4199\\\\286.01\\\\28.93632\\\\101.9199\\\\286.01\\\\28.75947\\\\99.91986\\\\286.01\\\\28.25676\\\\97.91986\\\\286.01\\\\27.21615\\\\95.41986\\\\286.01\\\\26.34461\\\\93.91986\\\\286.01\\\\25.2932\\\\92.41986\\\\286.01\\\\24.38579\\\\91.41986\\\\286.01\\\\22.63579\\\\89.76245\\\\286.01\\\\21.13579\\\\88.71692\\\\286.01\\\\19.63579\\\\87.85058\\\\286.01\\\\17.13579\\\\86.81271\\\\286.01\\\\15.13579\\\\86.31081\\\\286.01\\\\12.13579\\\\86.10869\\\\286.01\\\\9.135789\\\\86.28422\\\\286.01\\\\7.135788\\\\86.76125\\\\286.01\\\\5.635788\\\\87.27975\\\\286.01\\\\3.635788\\\\88.26181\\\\286.01\\\\2.135788\\\\89.23998\\\\286.01\\\\-0.3642115\\\\91.50063\\\\286.01\\\\-1.983114\\\\93.41986\\\\286.01\\\\-3.426712\\\\95.91986\\\\286.01\\\\-4.051712\\\\97.41986\\\\286.01\\\\-4.538943\\\\98.91986\\\\286.01\\\\-4.987895\\\\100.9199\\\\286.01\\\\-5.093159\\\\103.9199\\\\286.01\\\\-4.978573\\\\105.4199\\\\286.01\\\\-4.526445\\\\107.4199\\\\286.01\\\\-4.035407\\\\108.9199\\\\286.01\\\\-3.379837\\\\110.4199\\\\286.01\\\\-2.570607\\\\111.9199\\\\286.01\\\\-1.120541\\\\113.9199\\\\286.01\\\\-0.1875448\\\\114.9199\\\\286.01\\\\1.635789\\\\116.6058\\\\286.01\\\\3.135788\\\\117.6287\\\\286.01\\\\4.635788\\\\118.4723\\\\286.01\\\\7.135788\\\\119.5478\\\\286.01\\\\8.635789\\\\120.032\\\\286.01\\\\11.13579\\\\120.4815\\\\286.01\\\\13.63579\\\\120.4539\\\\286.01\\\\15.63579\\\\120.0365\\\\286.01\\\\17.13579\\\\119.5128\\\\286.01\\\\20.13579\\\\118.0816\\\\286.01\\\\21.63579\\\\117.1312\\\\286.01\\\\23.63579\\\\115.5595\\\\286.01\\\\24.74579\\\\114.4199\\\\286.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848911603100001.549938975401\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"245\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-24.36421\\\\171.6106\\\\289.01\\\\-19.86421\\\\167.7245\\\\289.01\\\\-18.36421\\\\166.7742\\\\289.01\\\\-16.86421\\\\166.2171\\\\289.01\\\\-15.86421\\\\166.136\\\\289.01\\\\-14.86421\\\\166.3039\\\\289.01\\\\-12.86421\\\\167.2141\\\\289.01\\\\-11.36421\\\\168.2115\\\\289.01\\\\-8.864211\\\\170.4133\\\\289.01\\\\-7.364212\\\\172.015\\\\289.01\\\\-3.364212\\\\176.4838\\\\289.01\\\\-1.698104\\\\178.4199\\\\289.01\\\\-0.6444128\\\\179.9199\\\\289.01\\\\0.2081026\\\\181.4199\\\\289.01\\\\0.8369604\\\\182.9199\\\\289.01\\\\1.181462\\\\184.4199\\\\289.01\\\\1.159226\\\\185.4199\\\\289.01\\\\0.7715028\\\\186.9199\\\\289.01\\\\0.3016764\\\\187.9199\\\\289.01\\\\-0.6509087\\\\189.4199\\\\289.01\\\\-2.53016\\\\191.9199\\\\289.01\\\\-3.495677\\\\193.4199\\\\289.01\\\\-4.539615\\\\195.4199\\\\289.01\\\\-5.487195\\\\197.9199\\\\289.01\\\\-6.045509\\\\200.4199\\\\289.01\\\\-6.221633\\\\203.9199\\\\289.01\\\\-5.981275\\\\207.4199\\\\289.01\\\\-5.507912\\\\209.4199\\\\289.01\\\\-4.566212\\\\211.9199\\\\289.01\\\\-3.55636\\\\213.9199\\\\289.01\\\\-2.941314\\\\214.9199\\\\289.01\\\\-1.4598\\\\216.9199\\\\289.01\\\\0.1357885\\\\218.6212\\\\289.01\\\\1.135789\\\\219.5154\\\\289.01\\\\3.135788\\\\220.9883\\\\289.01\\\\4.135788\\\\221.6079\\\\289.01\\\\6.135788\\\\222.6179\\\\289.01\\\\8.635789\\\\223.5528\\\\289.01\\\\11.13579\\\\224.0987\\\\289.01\\\\14.13579\\\\224.2564\\\\289.01\\\\17.63579\\\\224.0546\\\\289.01\\\\19.63579\\\\223.5962\\\\289.01\\\\21.13579\\\\223.1108\\\\289.01\\\\23.63579\\\\222.0024\\\\289.01\\\\25.13579\\\\221.1236\\\\289.01\\\\26.63579\\\\220.0783\\\\289.01\\\\29.13579\\\\217.7342\\\\289.01\\\\30.33269\\\\216.4199\\\\289.01\\\\31.75305\\\\214.4199\\\\289.01\\\\33.30979\\\\211.4199\\\\289.01\\\\34.3199\\\\208.4199\\\\289.01\\\\34.75285\\\\206.4199\\\\289.01\\\\34.88579\\\\204.9199\\\\289.01\\\\34.88197\\\\202.4199\\\\289.01\\\\34.74179\\\\200.9199\\\\289.01\\\\34.31215\\\\198.9199\\\\289.01\\\\33.2965\\\\195.9199\\\\289.01\\\\32.31141\\\\193.9199\\\\289.01\\\\30.31499\\\\190.9199\\\\289.01\\\\29.46377\\\\189.9199\\\\289.01\\\\28.09009\\\\187.9199\\\\289.01\\\\27.5465\\\\186.9199\\\\289.01\\\\27.02657\\\\185.4199\\\\289.01\\\\26.95302\\\\183.9199\\\\289.01\\\\27.49712\\\\181.9199\\\\289.01\\\\28.4963\\\\179.9199\\\\289.01\\\\29.48924\\\\178.4199\\\\289.01\\\\31.52524\\\\175.9199\\\\289.01\\\\33.74527\\\\173.4199\\\\289.01\\\\35.40354\\\\171.4199\\\\289.01\\\\37.13579\\\\169.6051\\\\289.01\\\\39.13579\\\\167.7864\\\\289.01\\\\40.63579\\\\166.7655\\\\289.01\\\\41.63579\\\\166.2524\\\\289.01\\\\43.13579\\\\165.754\\\\289.01\\\\44.63579\\\\165.7558\\\\289.01\\\\46.13579\\\\166.2658\\\\289.01\\\\47.13579\\\\166.7949\\\\289.01\\\\48.63579\\\\167.8024\\\\289.01\\\\51.63579\\\\170.0929\\\\289.01\\\\53.13579\\\\171.0158\\\\289.01\\\\55.13579\\\\172.0168\\\\289.01\\\\58.13579\\\\173.0807\\\\289.01\\\\60.13579\\\\173.508\\\\289.01\\\\63.13579\\\\173.6928\\\\289.01\\\\65.63579\\\\173.5299\\\\289.01\\\\67.63579\\\\173.1064\\\\289.01\\\\69.63579\\\\172.491\\\\289.01\\\\71.63579\\\\171.6557\\\\289.01\\\\73.63579\\\\170.6136\\\\289.01\\\\75.13579\\\\169.622\\\\289.01\\\\77.13579\\\\167.9501\\\\289.01\\\\78.14953\\\\166.9199\\\\289.01\\\\79.80318\\\\164.9199\\\\289.01\\\\80.78197\\\\163.4199\\\\289.01\\\\81.81926\\\\161.4199\\\\289.01\\\\82.77949\\\\158.9199\\\\289.01\\\\83.26665\\\\156.9199\\\\289.01\\\\83.42233\\\\155.4199\\\\289.01\\\\83.54694\\\\152.9199\\\\289.01\\\\83.298\\\\149.4199\\\\289.01\\\\82.82378\\\\147.4199\\\\289.01\\\\82.33067\\\\145.9199\\\\289.01\\\\81.20625\\\\143.4199\\\\289.01\\\\80.32435\\\\141.9199\\\\289.01\\\\78.83173\\\\139.9199\\\\289.01\\\\77.63579\\\\138.6628\\\\289.01\\\\76.13579\\\\137.254\\\\289.01\\\\74.13579\\\\135.7893\\\\289.01\\\\73.13579\\\\135.2029\\\\289.01\\\\70.13579\\\\133.7565\\\\289.01\\\\68.63579\\\\133.2538\\\\289.01\\\\66.63579\\\\132.7745\\\\289.01\\\\63.13579\\\\132.5449\\\\289.01\\\\59.63579\\\\132.7386\\\\289.01\\\\57.13579\\\\133.3031\\\\289.01\\\\55.63579\\\\133.8401\\\\289.01\\\\53.63579\\\\134.7649\\\\289.01\\\\50.63579\\\\136.7378\\\\289.01\\\\48.79829\\\\138.4199\\\\289.01\\\\45.63579\\\\141.6464\\\\289.01\\\\44.63579\\\\142.51\\\\289.01\\\\42.63579\\\\143.6619\\\\289.01\\\\41.13579\\\\144.0638\\\\289.01\\\\40.13579\\\\143.9958\\\\289.01\\\\38.63579\\\\143.6008\\\\289.01\\\\35.63579\\\\142.1031\\\\289.01\\\\34.13579\\\\141.0644\\\\289.01\\\\29.63579\\\\137.31\\\\289.01\\\\26.63579\\\\135.0555\\\\289.01\\\\23.55246\\\\132.4199\\\\289.01\\\\22.0726\\\\130.9199\\\\289.01\\\\20.46226\\\\128.9199\\\\289.01\\\\19.39348\\\\126.9199\\\\289.01\\\\19.14968\\\\125.9199\\\\289.01\\\\19.44511\\\\124.9199\\\\289.01\\\\19.99907\\\\123.9199\\\\289.01\\\\20.82414\\\\122.9199\\\\289.01\\\\22.27133\\\\121.4199\\\\289.01\\\\26.13579\\\\117.9661\\\\289.01\\\\27.14412\\\\116.9199\\\\289.01\\\\28.79449\\\\114.9199\\\\289.01\\\\29.76725\\\\113.4199\\\\289.01\\\\30.81119\\\\111.4199\\\\289.01\\\\31.75877\\\\108.9199\\\\289.01\\\\32.31709\\\\106.4199\\\\289.01\\\\32.49321\\\\102.9199\\\\289.01\\\\32.25285\\\\99.41986\\\\289.01\\\\31.77949\\\\97.41986\\\\289.01\\\\30.83779\\\\94.91986\\\\289.01\\\\29.82794\\\\92.91986\\\\289.01\\\\29.21289\\\\91.91986\\\\289.01\\\\27.73138\\\\89.91986\\\\289.01\\\\26.13579\\\\88.21847\\\\289.01\\\\25.13579\\\\87.32427\\\\289.01\\\\23.13579\\\\85.85146\\\\289.01\\\\22.13579\\\\85.23184\\\\289.01\\\\20.13579\\\\84.22186\\\\289.01\\\\17.63579\\\\83.28586\\\\289.01\\\\15.63579\\\\82.81703\\\\289.01\\\\14.13579\\\\82.65841\\\\289.01\\\\12.13579\\\\82.58332\\\\289.01\\\\8.635789\\\\82.78226\\\\289.01\\\\6.635788\\\\83.2435\\\\289.01\\\\5.135788\\\\83.72891\\\\289.01\\\\2.635788\\\\84.83727\\\\289.01\\\\1.135789\\\\85.71608\\\\289.01\\\\-0.3642115\\\\86.76138\\\\289.01\\\\-2.864212\\\\89.1055\\\\289.01\\\\-4.061114\\\\90.41986\\\\289.01\\\\-5.481468\\\\92.41986\\\\289.01\\\\-7.038211\\\\95.41986\\\\289.01\\\\-8.04832\\\\98.41986\\\\289.01\\\\-8.481275\\\\100.4199\\\\289.01\\\\-8.614211\\\\101.9199\\\\289.01\\\\-8.610394\\\\104.4199\\\\289.01\\\\-8.470211\\\\105.9199\\\\289.01\\\\-8.040568\\\\107.9199\\\\289.01\\\\-7.024926\\\\110.9199\\\\289.01\\\\-6.039831\\\\112.9199\\\\289.01\\\\-5.436641\\\\113.9199\\\\289.01\\\\-4.016484\\\\115.9199\\\\289.01\\\\-2.364212\\\\117.6864\\\\289.01\\\\-0.8642115\\\\119.0858\\\\289.01\\\\2.635788\\\\121.7363\\\\289.01\\\\4.936513\\\\123.9199\\\\289.01\\\\5.739955\\\\124.9199\\\\289.01\\\\6.243547\\\\125.9199\\\\289.01\\\\6.389576\\\\126.9199\\\\289.01\\\\5.898776\\\\128.4199\\\\289.01\\\\5.36544\\\\129.4199\\\\289.01\\\\4.344122\\\\130.9199\\\\289.01\\\\2.635788\\\\132.901\\\\289.01\\\\0.6357885\\\\134.9343\\\\289.01\\\\-3.291989\\\\138.4199\\\\289.01\\\\-6.454596\\\\141.4199\\\\289.01\\\\-8.364211\\\\143.1276\\\\289.01\\\\-10.36421\\\\144.5659\\\\289.01\\\\-12.36421\\\\145.6168\\\\289.01\\\\-13.86421\\\\146.1154\\\\289.01\\\\-14.86421\\\\146.2075\\\\289.01\\\\-15.86421\\\\146.0664\\\\289.01\\\\-17.86421\\\\145.0818\\\\289.01\\\\-19.36421\\\\143.7907\\\\289.01\\\\-22.36421\\\\140.7383\\\\289.01\\\\-23.36421\\\\139.8224\\\\289.01\\\\-25.36421\\\\138.2655\\\\289.01\\\\-27.86421\\\\136.8177\\\\289.01\\\\-30.36421\\\\135.775\\\\289.01\\\\-31.86421\\\\135.3379\\\\289.01\\\\-34.36421\\\\134.8099\\\\289.01\\\\-36.36421\\\\134.6622\\\\289.01\\\\-39.36421\\\\134.8203\\\\289.01\\\\-41.36421\\\\135.2396\\\\289.01\\\\-44.36421\\\\136.2353\\\\289.01\\\\-47.36421\\\\137.7303\\\\289.01\\\\-48.86421\\\\138.7237\\\\289.01\\\\-50.31903\\\\139.9199\\\\289.01\\\\-51.86699\\\\141.4199\\\\289.01\\\\-53.52726\\\\143.4199\\\\289.01\\\\-54.5031\\\\144.9199\\\\289.01\\\\-55.54621\\\\146.9199\\\\289.01\\\\-56.50508\\\\149.4199\\\\289.01\\\\-56.99216\\\\151.4199\\\\289.01\\\\-57.2638\\\\154.9199\\\\289.01\\\\-57.13921\\\\157.9199\\\\289.01\\\\-56.96703\\\\159.4199\\\\289.01\\\\-56.47692\\\\161.4199\\\\289.01\\\\-55.93595\\\\162.9199\\\\289.01\\\\-55.00497\\\\164.9199\\\\289.01\\\\-54.08002\\\\166.4199\\\\289.01\\\\-53.01329\\\\167.9199\\\\289.01\\\\-51.64692\\\\169.4199\\\\289.01\\\\-49.36421\\\\171.5437\\\\289.01\\\\-47.86421\\\\172.6127\\\\289.01\\\\-46.36421\\\\173.4903\\\\289.01\\\\-43.86421\\\\174.6123\\\\289.01\\\\-42.36421\\\\175.104\\\\289.01\\\\-40.36421\\\\175.5783\\\\289.01\\\\-36.86421\\\\175.813\\\\289.01\\\\-34.36421\\\\175.6949\\\\289.01\\\\-32.86421\\\\175.5299\\\\289.01\\\\-30.86421\\\\175.0428\\\\289.01\\\\-29.36421\\\\174.5075\\\\289.01\\\\-27.36421\\\\173.5845\\\\289.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848933604400001.474954755728\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"237\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"12\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-50.86421\\\\137.2415\\\\292.01\\\\-53.36421\\\\139.566\\\\292.01\\\\-54.99971\\\\141.4199\\\\292.01\\\\-56.06249\\\\142.9199\\\\292.01\\\\-57.48386\\\\145.4199\\\\292.01\\\\-58.5421\\\\147.9199\\\\292.01\\\\-59.00731\\\\149.4199\\\\292.01\\\\-59.52402\\\\151.9199\\\\292.01\\\\-59.68875\\\\155.4199\\\\292.01\\\\-59.50454\\\\158.9199\\\\292.01\\\\-58.98414\\\\161.4199\\\\292.01\\\\-58.51487\\\\162.9199\\\\292.01\\\\-57.42337\\\\165.4199\\\\292.01\\\\-55.9553\\\\167.9199\\\\292.01\\\\-54.43354\\\\169.9199\\\\292.01\\\\-53.06614\\\\171.4199\\\\292.01\\\\-51.36421\\\\172.969\\\\292.01\\\\-49.86421\\\\174.1299\\\\292.01\\\\-48.36421\\\\175.1141\\\\292.01\\\\-45.36421\\\\176.6118\\\\292.01\\\\-42.36421\\\\177.607\\\\292.01\\\\-39.86421\\\\178.0984\\\\292.01\\\\-36.86421\\\\178.2351\\\\292.01\\\\-33.36421\\\\178.0634\\\\292.01\\\\-30.86421\\\\177.5482\\\\292.01\\\\-29.36421\\\\177.0816\\\\292.01\\\\-26.86421\\\\176.0001\\\\292.01\\\\-24.36421\\\\174.5449\\\\292.01\\\\-22.36421\\\\173.0784\\\\292.01\\\\-21.36421\\\\172.2305\\\\292.01\\\\-19.36421\\\\170.8463\\\\292.01\\\\-18.36421\\\\170.289\\\\292.01\\\\-16.86421\\\\169.7166\\\\292.01\\\\-15.36421\\\\169.4899\\\\292.01\\\\-13.36421\\\\169.7316\\\\292.01\\\\-10.86421\\\\170.7901\\\\292.01\\\\-9.364211\\\\171.7313\\\\292.01\\\\-7.874132\\\\172.9199\\\\292.01\\\\-5.819569\\\\174.9199\\\\292.01\\\\-4.197077\\\\176.9199\\\\292.01\\\\-3.215368\\\\178.4199\\\\292.01\\\\-2.222842\\\\180.4199\\\\292.01\\\\-1.726866\\\\181.9199\\\\292.01\\\\-1.545029\\\\183.9199\\\\292.01\\\\-1.7261\\\\185.4199\\\\292.01\\\\-2.267621\\\\186.9199\\\\292.01\\\\-3.670156\\\\189.4199\\\\292.01\\\\-5.063191\\\\191.4199\\\\292.01\\\\-6.47314\\\\193.9199\\\\292.01\\\\-7.528172\\\\196.4199\\\\292.01\\\\-7.99005\\\\197.9199\\\\292.01\\\\-8.496565\\\\200.4199\\\\292.01\\\\-8.660795\\\\203.9199\\\\292.01\\\\-8.561417\\\\206.4199\\\\292.01\\\\-8.006369\\\\209.4199\\\\292.01\\\\-6.968822\\\\212.4199\\\\292.01\\\\-6.01766\\\\214.4199\\\\292.01\\\\-4.087803\\\\217.4199\\\\292.01\\\\-1.925022\\\\219.9199\\\\292.01\\\\0.6357885\\\\222.1419\\\\292.01\\\\3.635788\\\\224.0674\\\\292.01\\\\5.635788\\\\225.0181\\\\292.01\\\\8.635789\\\\226.0507\\\\292.01\\\\11.63579\\\\226.6077\\\\292.01\\\\14.13579\\\\226.7023\\\\292.01\\\\17.13579\\\\226.5765\\\\292.01\\\\19.63579\\\\226.0975\\\\292.01\\\\21.63579\\\\225.4732\\\\292.01\\\\23.63579\\\\224.6535\\\\292.01\\\\25.63579\\\\223.6229\\\\292.01\\\\26.63579\\\\222.9888\\\\292.01\\\\28.63579\\\\221.508\\\\292.01\\\\30.13579\\\\220.1511\\\\292.01\\\\31.76374\\\\218.4199\\\\292.01\\\\33.28978\\\\216.4199\\\\292.01\\\\34.22413\\\\214.9199\\\\292.01\\\\35.26341\\\\212.9199\\\\292.01\\\\36.23893\\\\210.4199\\\\292.01\\\\36.81548\\\\208.4199\\\\292.01\\\\37.31635\\\\205.4199\\\\292.01\\\\37.31125\\\\201.9199\\\\292.01\\\\36.80509\\\\198.9199\\\\292.01\\\\36.21972\\\\196.9199\\\\292.01\\\\35.23758\\\\194.4199\\\\292.01\\\\34.185\\\\192.4199\\\\292.01\\\\33.25797\\\\190.9199\\\\292.01\\\\31.47586\\\\188.4199\\\\292.01\\\\30.39613\\\\186.4199\\\\292.01\\\\29.98475\\\\185.4199\\\\292.01\\\\29.70282\\\\183.9199\\\\292.01\\\\29.65647\\\\182.9199\\\\292.01\\\\30.01312\\\\180.9199\\\\292.01\\\\30.59115\\\\179.4199\\\\292.01\\\\31.96314\\\\176.9199\\\\292.01\\\\33.04444\\\\175.4199\\\\292.01\\\\34.63579\\\\173.6154\\\\292.01\\\\36.13579\\\\172.1795\\\\292.01\\\\37.13579\\\\171.3688\\\\292.01\\\\39.63579\\\\169.8149\\\\292.01\\\\41.13579\\\\169.2102\\\\292.01\\\\42.63579\\\\168.8687\\\\292.01\\\\43.63579\\\\168.8372\\\\292.01\\\\45.63579\\\\169.3281\\\\292.01\\\\47.63579\\\\170.2854\\\\292.01\\\\51.13579\\\\172.6065\\\\292.01\\\\53.63579\\\\173.9453\\\\292.01\\\\55.13579\\\\174.6138\\\\292.01\\\\58.13579\\\\175.5708\\\\292.01\\\\61.13579\\\\176.0839\\\\292.01\\\\64.63579\\\\176.0973\\\\292.01\\\\67.63579\\\\175.5995\\\\292.01\\\\69.63579\\\\175.0346\\\\292.01\\\\72.13579\\\\174.0871\\\\292.01\\\\74.13579\\\\173.0916\\\\292.01\\\\77.13579\\\\171.1028\\\\292.01\\\\79.63579\\\\168.7767\\\\292.01\\\\81.27783\\\\166.9199\\\\292.01\\\\82.33613\\\\165.4199\\\\292.01\\\\83.23394\\\\163.9199\\\\292.01\\\\84.21426\\\\161.9199\\\\292.01\\\\84.81573\\\\160.4199\\\\292.01\\\\85.28121\\\\158.9199\\\\292.01\\\\85.79774\\\\156.4199\\\\292.01\\\\85.96235\\\\152.9199\\\\292.01\\\\85.82057\\\\149.9199\\\\292.01\\\\85.32604\\\\147.4199\\\\292.01\\\\84.3297\\\\144.4199\\\\292.01\\\\82.82874\\\\141.4199\\\\292.01\\\\81.84238\\\\139.9199\\\\292.01\\\\79.77893\\\\137.4199\\\\292.01\\\\78.13579\\\\135.8536\\\\292.01\\\\76.13579\\\\134.271\\\\292.01\\\\73.63579\\\\132.7315\\\\292.01\\\\71.63579\\\\131.7812\\\\292.01\\\\68.63579\\\\130.7527\\\\292.01\\\\66.13579\\\\130.2516\\\\292.01\\\\63.13579\\\\130.112\\\\292.01\\\\59.63579\\\\130.2875\\\\292.01\\\\57.13579\\\\130.7999\\\\292.01\\\\55.63579\\\\131.2636\\\\292.01\\\\53.13579\\\\132.3465\\\\292.01\\\\50.63579\\\\133.8043\\\\292.01\\\\48.63579\\\\135.3059\\\\292.01\\\\45.13579\\\\138.5364\\\\292.01\\\\43.63579\\\\139.6493\\\\292.01\\\\42.13579\\\\140.4601\\\\292.01\\\\40.13579\\\\141.0791\\\\292.01\\\\38.63579\\\\141.1097\\\\292.01\\\\36.63579\\\\140.6416\\\\292.01\\\\35.13579\\\\140.0553\\\\292.01\\\\32.63579\\\\138.6373\\\\292.01\\\\31.13579\\\\137.5738\\\\292.01\\\\29.72654\\\\136.4199\\\\292.01\\\\28.07417\\\\134.9199\\\\292.01\\\\25.91139\\\\132.4199\\\\292.01\\\\24.93418\\\\130.9199\\\\292.01\\\\24.00985\\\\128.9199\\\\292.01\\\\23.59784\\\\126.9199\\\\292.01\\\\24.00117\\\\124.9199\\\\292.01\\\\24.45341\\\\123.9199\\\\292.01\\\\25.412\\\\122.4199\\\\292.01\\\\27.1188\\\\120.4199\\\\292.01\\\\30.26747\\\\116.9199\\\\292.01\\\\31.33271\\\\115.4199\\\\292.01\\\\32.74472\\\\112.9199\\\\292.01\\\\33.80082\\\\110.4199\\\\292.01\\\\34.26079\\\\108.9199\\\\292.01\\\\34.76814\\\\106.4199\\\\292.01\\\\34.93237\\\\102.9199\\\\292.01\\\\34.83299\\\\100.4199\\\\292.01\\\\34.27795\\\\97.41986\\\\292.01\\\\33.2404\\\\94.41986\\\\292.01\\\\32.28924\\\\92.41986\\\\292.01\\\\30.35938\\\\89.41986\\\\292.01\\\\28.13579\\\\86.85905\\\\292.01\\\\25.63579\\\\84.69783\\\\292.01\\\\22.63579\\\\82.77126\\\\292.01\\\\20.63579\\\\81.82164\\\\292.01\\\\17.63579\\\\80.78906\\\\292.01\\\\14.63579\\\\80.23197\\\\292.01\\\\12.13579\\\\80.13745\\\\292.01\\\\9.135789\\\\80.26321\\\\292.01\\\\6.635788\\\\80.74219\\\\292.01\\\\4.635788\\\\81.36616\\\\292.01\\\\2.635788\\\\82.1862\\\\292.01\\\\0.6357885\\\\83.21684\\\\292.01\\\\-0.3642115\\\\83.85096\\\\292.01\\\\-2.364212\\\\85.33102\\\\292.01\\\\-3.864212\\\\86.68865\\\\292.01\\\\-5.492164\\\\88.41986\\\\292.01\\\\-7.018197\\\\90.41986\\\\292.01\\\\-7.953227\\\\91.91986\\\\292.01\\\\-8.991834\\\\93.91986\\\\292.01\\\\-9.966642\\\\96.41986\\\\292.01\\\\-10.5439\\\\98.41986\\\\292.01\\\\-11.04477\\\\101.4199\\\\292.01\\\\-11.03968\\\\104.9199\\\\292.01\\\\-10.53351\\\\107.9199\\\\292.01\\\\-9.947545\\\\109.9199\\\\292.01\\\\-8.965997\\\\112.4199\\\\292.01\\\\-7.913424\\\\114.4199\\\\292.01\\\\-6.97299\\\\115.9199\\\\292.01\\\\-5.421904\\\\117.9199\\\\292.01\\\\-3.864212\\\\119.5885\\\\292.01\\\\-1.366711\\\\121.9199\\\\292.01\\\\-0.3642115\\\\123.0152\\\\292.01\\\\0.7380612\\\\124.4199\\\\292.01\\\\1.307276\\\\125.4199\\\\292.01\\\\1.837008\\\\126.9199\\\\292.01\\\\1.945404\\\\127.9199\\\\292.01\\\\1.824169\\\\129.4199\\\\292.01\\\\1.341957\\\\130.9199\\\\292.01\\\\0.3438723\\\\132.9199\\\\292.01\\\\-0.6656821\\\\134.4199\\\\292.01\\\\-2.354596\\\\136.4199\\\\292.01\\\\-3.364212\\\\137.4545\\\\292.01\\\\-6.364212\\\\140.0493\\\\292.01\\\\-7.864212\\\\141.0763\\\\292.01\\\\-9.864211\\\\142.1287\\\\292.01\\\\-11.36421\\\\142.6533\\\\292.01\\\\-12.86421\\\\142.9596\\\\292.01\\\\-13.86421\\\\142.9695\\\\292.01\\\\-15.36421\\\\142.6443\\\\292.01\\\\-16.86421\\\\142.0094\\\\292.01\\\\-18.36421\\\\141.0572\\\\292.01\\\\-20.86421\\\\138.869\\\\292.01\\\\-23.36421\\\\136.7725\\\\292.01\\\\-25.86421\\\\135.1882\\\\292.01\\\\-28.86421\\\\133.7659\\\\292.01\\\\-30.36421\\\\133.2484\\\\292.01\\\\-32.36421\\\\132.7296\\\\292.01\\\\-35.36421\\\\132.2475\\\\292.01\\\\-38.36421\\\\132.2506\\\\292.01\\\\-41.36421\\\\132.7474\\\\292.01\\\\-43.36421\\\\133.3174\\\\292.01\\\\-45.86421\\\\134.2638\\\\292.01\\\\-47.86421\\\\135.2561\\\\292.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848957605700001.539833993627\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"247\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"13\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.13579\\\\228.4295\\\\295.01\\\\18.13579\\\\228.1286\\\\295.01\\\\20.63579\\\\227.5699\\\\295.01\\\\23.63579\\\\226.5032\\\\295.01\\\\25.63579\\\\225.5385\\\\295.01\\\\27.13579\\\\224.6467\\\\295.01\\\\28.63579\\\\223.6208\\\\295.01\\\\30.63579\\\\221.9606\\\\295.01\\\\32.63579\\\\219.9176\\\\295.01\\\\34.26079\\\\217.9199\\\\295.01\\\\35.85596\\\\215.4199\\\\295.01\\\\36.86065\\\\213.4199\\\\295.01\\\\37.84481\\\\210.9199\\\\295.01\\\\38.30011\\\\209.4199\\\\295.01\\\\38.83393\\\\206.9199\\\\295.01\\\\39.02689\\\\203.9199\\\\295.01\\\\38.82799\\\\200.4199\\\\295.01\\\\38.28665\\\\197.9199\\\\295.01\\\\37.83388\\\\196.4199\\\\295.01\\\\36.84829\\\\193.9199\\\\295.01\\\\35.83665\\\\191.9199\\\\295.01\\\\34.2616\\\\189.4199\\\\295.01\\\\32.91469\\\\187.4199\\\\295.01\\\\31.91341\\\\185.4199\\\\295.01\\\\31.41753\\\\183.9199\\\\295.01\\\\31.21638\\\\182.4199\\\\295.01\\\\31.22183\\\\181.4199\\\\295.01\\\\31.4365\\\\179.9199\\\\295.01\\\\31.9365\\\\178.4199\\\\295.01\\\\32.96956\\\\176.4199\\\\295.01\\\\33.63579\\\\175.5072\\\\295.01\\\\35.13579\\\\173.8535\\\\295.01\\\\37.13579\\\\172.3393\\\\295.01\\\\39.13579\\\\171.3338\\\\295.01\\\\41.13579\\\\170.7382\\\\295.01\\\\42.13579\\\\170.6482\\\\295.01\\\\43.63579\\\\170.7407\\\\295.01\\\\45.63579\\\\171.3626\\\\295.01\\\\47.63579\\\\172.3561\\\\295.01\\\\51.13579\\\\174.5457\\\\295.01\\\\53.13579\\\\175.5831\\\\295.01\\\\55.63579\\\\176.5908\\\\295.01\\\\57.13579\\\\177.05\\\\295.01\\\\60.13579\\\\177.6526\\\\295.01\\\\63.13579\\\\177.7993\\\\295.01\\\\66.13579\\\\177.6153\\\\295.01\\\\68.63579\\\\177.0842\\\\295.01\\\\71.63579\\\\176.1077\\\\295.01\\\\73.13579\\\\175.4511\\\\295.01\\\\75.63579\\\\174.1397\\\\295.01\\\\76.63579\\\\173.5072\\\\295.01\\\\78.63579\\\\172.0237\\\\295.01\\\\79.63579\\\\171.1478\\\\295.01\\\\81.34893\\\\169.4199\\\\295.01\\\\83.33125\\\\166.9199\\\\295.01\\\\84.85596\\\\164.4199\\\\295.01\\\\85.83382\\\\162.4199\\\\295.01\\\\86.74227\\\\159.9199\\\\295.01\\\\87.34301\\\\157.4199\\\\295.01\\\\87.67046\\\\154.4199\\\\295.01\\\\87.69308\\\\151.9199\\\\295.01\\\\87.28692\\\\148.4199\\\\295.01\\\\86.80479\\\\146.4199\\\\295.01\\\\85.72182\\\\143.4199\\\\295.01\\\\84.74316\\\\141.4199\\\\295.01\\\\83.8507\\\\139.9199\\\\295.01\\\\82.79869\\\\138.4199\\\\295.01\\\\81.13579\\\\136.4793\\\\295.01\\\\80.09653\\\\135.4199\\\\295.01\\\\78.13579\\\\133.6971\\\\295.01\\\\76.13579\\\\132.2705\\\\295.01\\\\73.63579\\\\130.872\\\\295.01\\\\71.13579\\\\129.7844\\\\295.01\\\\69.63579\\\\129.2868\\\\295.01\\\\67.13579\\\\128.7073\\\\295.01\\\\64.13579\\\\128.4028\\\\295.01\\\\62.13579\\\\128.3921\\\\295.01\\\\58.63579\\\\128.7287\\\\295.01\\\\56.13579\\\\129.3365\\\\295.01\\\\53.63579\\\\130.2527\\\\295.01\\\\50.63579\\\\131.8282\\\\295.01\\\\48.63579\\\\133.1938\\\\295.01\\\\46.13579\\\\135.2852\\\\295.01\\\\44.13579\\\\137.0396\\\\295.01\\\\42.63579\\\\138.0648\\\\295.01\\\\40.63579\\\\138.9977\\\\295.01\\\\38.63579\\\\139.4802\\\\295.01\\\\37.13579\\\\139.5112\\\\295.01\\\\35.13579\\\\139.0861\\\\295.01\\\\32.63579\\\\138.0112\\\\295.01\\\\31.13579\\\\137.0381\\\\295.01\\\\29.3328\\\\135.4199\\\\295.01\\\\28.06653\\\\133.9199\\\\295.01\\\\27.42027\\\\132.9199\\\\295.01\\\\26.43855\\\\130.9199\\\\295.01\\\\25.97402\\\\129.4199\\\\295.01\\\\25.83393\\\\127.9199\\\\295.01\\\\25.95701\\\\126.4199\\\\295.01\\\\26.43787\\\\124.9199\\\\295.01\\\\27.49988\\\\122.9199\\\\295.01\\\\28.62579\\\\121.4199\\\\295.01\\\\31.1932\\\\118.4199\\\\295.01\\\\32.32444\\\\116.9199\\\\295.01\\\\33.85028\\\\114.4199\\\\295.01\\\\34.81903\\\\112.4199\\\\295.01\\\\35.7245\\\\109.9199\\\\295.01\\\\36.32799\\\\107.4199\\\\295.01\\\\36.61153\\\\104.4199\\\\295.01\\\\36.68043\\\\102.9199\\\\295.01\\\\36.33499\\\\98.91986\\\\295.01\\\\35.74227\\\\96.41986\\\\295.01\\\\34.84829\\\\93.91986\\\\295.01\\\\33.88437\\\\91.91986\\\\295.01\\\\32.7434\\\\89.91986\\\\295.01\\\\31.31367\\\\87.91986\\\\295.01\\\\29.63579\\\\86.04859\\\\295.01\\\\27.13579\\\\83.74197\\\\295.01\\\\25.13579\\\\82.31819\\\\295.01\\\\23.13579\\\\81.17551\\\\295.01\\\\21.13579\\\\80.21014\\\\295.01\\\\18.63579\\\\79.3208\\\\295.01\\\\16.13579\\\\78.72765\\\\295.01\\\\12.13579\\\\78.41024\\\\295.01\\\\8.135789\\\\78.70996\\\\295.01\\\\5.635788\\\\79.269\\\\295.01\\\\2.635788\\\\80.33652\\\\295.01\\\\0.6357885\\\\81.29802\\\\295.01\\\\-2.364212\\\\83.21894\\\\295.01\\\\-4.364212\\\\84.87916\\\\295.01\\\\-6.364212\\\\86.92207\\\\295.01\\\\-7.991695\\\\88.91986\\\\295.01\\\\-9.58564\\\\91.41986\\\\295.01\\\\-10.58907\\\\93.41986\\\\295.01\\\\-11.57323\\\\95.91986\\\\295.01\\\\-12.02854\\\\97.41986\\\\295.01\\\\-12.56235\\\\99.91986\\\\295.01\\\\-12.75532\\\\102.9199\\\\295.01\\\\-12.55642\\\\106.4199\\\\295.01\\\\-12.01507\\\\108.9199\\\\295.01\\\\-11.5623\\\\110.4199\\\\295.01\\\\-10.57671\\\\112.9199\\\\295.01\\\\-8.962544\\\\115.9199\\\\295.01\\\\-7.569458\\\\117.9199\\\\295.01\\\\-5.366278\\\\120.4199\\\\295.01\\\\-3.364212\\\\122.4839\\\\295.01\\\\-2.140774\\\\123.9199\\\\295.01\\\\-1.179429\\\\125.4199\\\\295.01\\\\-0.712649\\\\126.4199\\\\295.01\\\\-0.2422979\\\\127.9199\\\\295.01\\\\-0.09468023\\\\129.4199\\\\295.01\\\\-0.234851\\\\130.9199\\\\295.01\\\\-0.6829615\\\\132.4199\\\\295.01\\\\-1.630643\\\\134.4199\\\\295.01\\\\-2.241431\\\\135.4199\\\\295.01\\\\-3.364212\\\\136.8065\\\\295.01\\\\-4.479952\\\\137.9199\\\\295.01\\\\-5.864212\\\\139.0335\\\\295.01\\\\-6.864212\\\\139.6417\\\\295.01\\\\-8.864211\\\\140.5979\\\\295.01\\\\-10.36421\\\\141.0637\\\\295.01\\\\-11.86421\\\\141.2292\\\\295.01\\\\-13.86421\\\\141.0486\\\\295.01\\\\-15.36421\\\\140.5495\\\\295.01\\\\-16.36421\\\\140.0745\\\\295.01\\\\-17.86421\\\\139.1365\\\\295.01\\\\-21.36421\\\\136.2233\\\\295.01\\\\-23.36421\\\\134.7404\\\\295.01\\\\-24.86421\\\\133.8202\\\\295.01\\\\-26.86421\\\\132.7895\\\\295.01\\\\-29.36421\\\\131.8086\\\\295.01\\\\-31.36421\\\\131.2283\\\\295.01\\\\-33.86421\\\\130.726\\\\295.01\\\\-35.86421\\\\130.5824\\\\295.01\\\\-37.86421\\\\130.5851\\\\295.01\\\\-39.86421\\\\130.732\\\\295.01\\\\-42.36421\\\\131.2641\\\\295.01\\\\-45.36421\\\\132.2405\\\\295.01\\\\-46.86421\\\\132.9028\\\\295.01\\\\-49.36421\\\\134.2029\\\\295.01\\\\-50.36421\\\\134.8394\\\\295.01\\\\-52.36421\\\\136.3216\\\\295.01\\\\-53.36421\\\\137.1936\\\\295.01\\\\-55.51793\\\\139.4199\\\\295.01\\\\-57.05593\\\\141.4199\\\\295.01\\\\-58.58438\\\\143.9199\\\\295.01\\\\-59.55771\\\\145.9199\\\\295.01\\\\-60.46825\\\\148.4199\\\\295.01\\\\-61.06986\\\\150.9199\\\\295.01\\\\-61.39546\\\\153.9199\\\\295.01\\\\-61.46327\\\\155.4199\\\\295.01\\\\-61.38126\\\\156.9199\\\\295.01\\\\-61.0591\\\\159.9199\\\\295.01\\\\-60.44754\\\\162.4199\\\\295.01\\\\-59.52451\\\\164.9199\\\\295.01\\\\-58.53138\\\\166.9199\\\\295.01\\\\-56.56637\\\\169.9199\\\\295.01\\\\-54.86625\\\\171.9199\\\\295.01\\\\-53.86421\\\\172.9499\\\\295.01\\\\-51.36421\\\\175.0986\\\\295.01\\\\-49.86421\\\\176.1393\\\\295.01\\\\-48.36421\\\\177.0304\\\\295.01\\\\-46.36421\\\\178.0032\\\\295.01\\\\-43.36421\\\\179.0823\\\\295.01\\\\-40.86421\\\\179.6404\\\\295.01\\\\-37.86421\\\\179.9579\\\\295.01\\\\-35.86421\\\\179.9677\\\\295.01\\\\-32.36421\\\\179.618\\\\295.01\\\\-29.86421\\\\179.0112\\\\295.01\\\\-27.36421\\\\178.0918\\\\295.01\\\\-25.36421\\\\177.1055\\\\295.01\\\\-22.86421\\\\175.5296\\\\295.01\\\\-19.86421\\\\173.325\\\\295.01\\\\-18.86421\\\\172.7049\\\\295.01\\\\-16.86421\\\\171.7768\\\\295.01\\\\-14.86421\\\\171.2971\\\\295.01\\\\-13.36421\\\\171.3134\\\\295.01\\\\-11.36421\\\\171.8039\\\\295.01\\\\-9.364211\\\\172.7201\\\\295.01\\\\-8.364211\\\\173.3311\\\\295.01\\\\-7.018403\\\\174.4199\\\\295.01\\\\-5.208806\\\\176.4199\\\\295.01\\\\-4.272865\\\\177.9199\\\\295.01\\\\-3.310016\\\\180.4199\\\\295.01\\\\-3.060024\\\\182.4199\\\\295.01\\\\-3.162389\\\\183.9199\\\\295.01\\\\-3.778172\\\\185.9199\\\\295.01\\\\-4.226866\\\\186.9199\\\\295.01\\\\-5.705407\\\\189.4199\\\\295.01\\\\-7.020076\\\\191.4199\\\\295.01\\\\-8.54745\\\\194.4199\\\\295.01\\\\-9.452921\\\\196.9199\\\\295.01\\\\-10.05642\\\\199.4199\\\\295.01\\\\-10.37757\\\\202.9199\\\\295.01\\\\-10.35085\\\\204.9199\\\\295.01\\\\-10.06341\\\\207.9199\\\\295.01\\\\-9.470693\\\\210.4199\\\\295.01\\\\-8.575538\\\\212.9199\\\\295.01\\\\-7.082783\\\\215.9199\\\\295.01\\\\-6.471828\\\\216.9199\\\\295.01\\\\-5.042096\\\\218.9199\\\\295.01\\\\-3.364212\\\\220.7911\\\\295.01\\\\-0.8642115\\\\223.0957\\\\295.01\\\\1.135789\\\\224.5215\\\\295.01\\\\3.135788\\\\225.6642\\\\295.01\\\\5.135788\\\\226.6284\\\\295.01\\\\7.635788\\\\227.5189\\\\295.01\\\\10.13579\\\\228.111\\\\295.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699848978606900001.507522632828\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"254\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-17.36421\\\\138.0734\\\\298.01\\\\-21.36421\\\\134.8208\\\\298.01\\\\-22.86421\\\\133.7527\\\\298.01\\\\-25.36421\\\\132.2841\\\\298.01\\\\-27.36421\\\\131.3688\\\\298.01\\\\-30.36421\\\\130.3311\\\\298.01\\\\-32.86421\\\\129.7536\\\\298.01\\\\-35.86421\\\\129.4102\\\\298.01\\\\-37.86421\\\\129.4179\\\\298.01\\\\-40.86421\\\\129.7645\\\\298.01\\\\-42.86421\\\\130.2402\\\\298.01\\\\-45.86421\\\\131.2459\\\\298.01\\\\-48.36421\\\\132.3956\\\\298.01\\\\-50.86421\\\\133.8477\\\\298.01\\\\-52.86421\\\\135.3082\\\\298.01\\\\-55.36421\\\\137.6335\\\\298.01\\\\-56.93636\\\\139.4199\\\\298.01\\\\-58.04616\\\\140.9199\\\\298.01\\\\-59.57426\\\\143.4199\\\\298.01\\\\-60.54849\\\\145.4199\\\\298.01\\\\-61.49141\\\\147.9199\\\\298.01\\\\-62.02512\\\\149.9199\\\\298.01\\\\-62.42456\\\\152.4199\\\\298.01\\\\-62.59074\\\\155.4199\\\\298.01\\\\-62.47311\\\\157.9199\\\\298.01\\\\-62.01004\\\\160.9199\\\\298.01\\\\-61.47311\\\\162.9199\\\\298.01\\\\-60.51775\\\\165.4199\\\\298.01\\\\-58.92757\\\\168.4199\\\\298.01\\\\-57.56282\\\\170.4199\\\\298.01\\\\-55.90886\\\\172.4199\\\\298.01\\\\-53.86421\\\\174.4545\\\\298.01\\\\-51.86421\\\\176.0956\\\\298.01\\\\-50.36421\\\\177.126\\\\298.01\\\\-48.86421\\\\178.0214\\\\298.01\\\\-46.86421\\\\179.0059\\\\298.01\\\\-43.86421\\\\180.1004\\\\298.01\\\\-41.86421\\\\180.6074\\\\298.01\\\\-39.36421\\\\181.0032\\\\298.01\\\\-36.86421\\\\181.1393\\\\298.01\\\\-34.86421\\\\181.0696\\\\298.01\\\\-31.36421\\\\180.5696\\\\298.01\\\\-29.36421\\\\180.0358\\\\298.01\\\\-26.86421\\\\179.0826\\\\298.01\\\\-24.86421\\\\178.0915\\\\298.01\\\\-22.36421\\\\176.5441\\\\298.01\\\\-19.86421\\\\174.7606\\\\298.01\\\\-17.36421\\\\173.3134\\\\298.01\\\\-15.86421\\\\172.7165\\\\298.01\\\\-14.36421\\\\172.3535\\\\298.01\\\\-12.86421\\\\172.2821\\\\298.01\\\\-10.86421\\\\172.8134\\\\298.01\\\\-9.864211\\\\173.2612\\\\298.01\\\\-8.364211\\\\174.2009\\\\298.01\\\\-6.864212\\\\175.5768\\\\298.01\\\\-5.747024\\\\176.9199\\\\298.01\\\\-4.668733\\\\178.9199\\\\298.01\\\\-4.188285\\\\180.4199\\\\298.01\\\\-4.035754\\\\181.9199\\\\298.01\\\\-4.183949\\\\183.4199\\\\298.01\\\\-4.643007\\\\184.9199\\\\298.01\\\\-5.294955\\\\186.4199\\\\298.01\\\\-6.132928\\\\187.9199\\\\298.01\\\\-8.012517\\\\190.9199\\\\298.01\\\\-9.077596\\\\192.9199\\\\298.01\\\\-9.952921\\\\194.9199\\\\298.01\\\\-10.47785\\\\196.4199\\\\298.01\\\\-11.01005\\\\198.4199\\\\298.01\\\\-11.45025\\\\201.4199\\\\298.01\\\\-11.55772\\\\203.9199\\\\298.01\\\\-11.46073\\\\205.9199\\\\298.01\\\\-11.01962\\\\208.9199\\\\298.01\\\\-10.49571\\\\210.9199\\\\298.01\\\\-9.571923\\\\213.4199\\\\298.01\\\\-8.606749\\\\215.4199\\\\298.01\\\\-7.463268\\\\217.4199\\\\298.01\\\\-6.421503\\\\218.9199\\\\298.01\\\\-5.364212\\\\220.2352\\\\298.01\\\\-3.29047\\\\222.4199\\\\298.01\\\\-0.8642115\\\\224.4741\\\\298.01\\\\1.635789\\\\226.1212\\\\298.01\\\\4.635788\\\\227.6221\\\\298.01\\\\7.135788\\\\228.5449\\\\298.01\\\\9.135789\\\\229.0657\\\\298.01\\\\12.13579\\\\229.4949\\\\298.01\\\\14.13579\\\\229.5963\\\\298.01\\\\16.13579\\\\229.5164\\\\298.01\\\\19.13579\\\\229.0929\\\\298.01\\\\21.13579\\\\228.5912\\\\298.01\\\\24.13579\\\\227.5032\\\\298.01\\\\26.13579\\\\226.5287\\\\298.01\\\\29.13579\\\\224.6157\\\\298.01\\\\31.13579\\\\222.9954\\\\298.01\\\\32.76643\\\\221.4199\\\\298.01\\\\33.67046\\\\220.4199\\\\298.01\\\\35.25476\\\\218.4199\\\\298.01\\\\36.84434\\\\215.9199\\\\298.01\\\\37.8587\\\\213.9199\\\\298.01\\\\38.85302\\\\211.4199\\\\298.01\\\\39.31954\\\\209.9199\\\\298.01\\\\39.80026\\\\207.9199\\\\298.01\\\\40.16704\\\\204.9199\\\\298.01\\\\40.16004\\\\202.4199\\\\298.01\\\\39.79305\\\\199.4199\\\\298.01\\\\39.31053\\\\197.4199\\\\298.01\\\\38.84\\\\195.9199\\\\298.01\\\\37.8401\\\\193.4199\\\\298.01\\\\36.82063\\\\191.4199\\\\298.01\\\\35.26744\\\\188.9199\\\\298.01\\\\33.94211\\\\186.9199\\\\298.01\\\\32.91801\\\\184.9199\\\\298.01\\\\32.53175\\\\183.9199\\\\298.01\\\\32.02689\\\\181.4199\\\\298.01\\\\32.4123\\\\179.4199\\\\298.01\\\\32.97419\\\\177.9199\\\\298.01\\\\33.5138\\\\176.9199\\\\298.01\\\\34.61511\\\\175.4199\\\\298.01\\\\35.63579\\\\174.3649\\\\298.01\\\\37.13579\\\\173.2065\\\\298.01\\\\39.13579\\\\172.2018\\\\298.01\\\\40.63579\\\\171.7608\\\\298.01\\\\42.63579\\\\171.7324\\\\298.01\\\\44.63579\\\\172.2536\\\\298.01\\\\47.63579\\\\173.7016\\\\298.01\\\\50.63579\\\\175.5381\\\\298.01\\\\52.63579\\\\176.5734\\\\298.01\\\\55.13579\\\\177.5946\\\\298.01\\\\56.63579\\\\178.0771\\\\298.01\\\\58.63579\\\\178.5676\\\\298.01\\\\61.63579\\\\178.9218\\\\298.01\\\\64.13579\\\\178.9405\\\\298.01\\\\67.13579\\\\178.5826\\\\298.01\\\\69.13579\\\\178.1077\\\\298.01\\\\72.13579\\\\177.1048\\\\298.01\\\\73.63579\\\\176.4441\\\\298.01\\\\76.13579\\\\175.128\\\\298.01\\\\77.13579\\\\174.5032\\\\298.01\\\\79.13579\\\\173.037\\\\298.01\\\\80.41171\\\\171.9199\\\\298.01\\\\82.80591\\\\169.4199\\\\298.01\\\\84.32225\\\\167.4199\\\\298.01\\\\85.84733\\\\164.9199\\\\298.01\\\\86.82425\\\\162.9199\\\\298.01\\\\87.76729\\\\160.4199\\\\298.01\\\\88.29848\\\\158.4199\\\\298.01\\\\88.69914\\\\155.9199\\\\298.01\\\\88.86338\\\\152.9199\\\\298.01\\\\88.73231\\\\150.4199\\\\298.01\\\\88.32969\\\\147.9199\\\\298.01\\\\87.82111\\\\145.9199\\\\298.01\\\\86.72449\\\\142.9199\\\\298.01\\\\85.73485\\\\140.9199\\\\298.01\\\\84.83606\\\\139.4199\\\\298.01\\\\83.80003\\\\137.9199\\\\298.01\\\\81.67046\\\\135.4199\\\\298.01\\\\80.63579\\\\134.4028\\\\298.01\\\\78.13579\\\\132.3134\\\\298.01\\\\76.63579\\\\131.2847\\\\298.01\\\\74.18953\\\\129.9199\\\\298.01\\\\71.63579\\\\128.778\\\\298.01\\\\70.13579\\\\128.2663\\\\298.01\\\\68.13579\\\\127.7468\\\\298.01\\\\65.63579\\\\127.3565\\\\298.01\\\\64.13579\\\\127.2386\\\\298.01\\\\60.63579\\\\127.3285\\\\298.01\\\\57.63579\\\\127.776\\\\298.01\\\\55.63579\\\\128.311\\\\298.01\\\\53.13579\\\\129.2608\\\\298.01\\\\51.13579\\\\130.2564\\\\298.01\\\\48.63579\\\\131.8259\\\\298.01\\\\46.63579\\\\133.3886\\\\298.01\\\\43.63579\\\\135.9802\\\\298.01\\\\42.13579\\\\137.0449\\\\298.01\\\\40.13579\\\\138.0715\\\\298.01\\\\38.63579\\\\138.5637\\\\298.01\\\\36.63579\\\\138.7519\\\\298.01\\\\35.13579\\\\138.5808\\\\298.01\\\\33.63579\\\\138.0696\\\\298.01\\\\31.63579\\\\136.9511\\\\298.01\\\\29.8448\\\\135.4199\\\\298.01\\\\28.96778\\\\134.4199\\\\298.01\\\\27.9767\\\\132.9199\\\\298.01\\\\27.488\\\\131.9199\\\\298.01\\\\26.98038\\\\130.4199\\\\298.01\\\\26.80886\\\\128.9199\\\\298.01\\\\26.93039\\\\127.4199\\\\298.01\\\\27.55797\\\\125.4199\\\\298.01\\\\28.02931\\\\124.4199\\\\298.01\\\\28.95004\\\\122.9199\\\\298.01\\\\30.51157\\\\120.9199\\\\298.01\\\\31.80976\\\\119.4199\\\\298.01\\\\33.31496\\\\117.4199\\\\298.01\\\\34.83657\\\\114.9199\\\\298.01\\\\35.81157\\\\112.9199\\\\298.01\\\\36.74942\\\\110.4199\\\\298.01\\\\37.28162\\\\108.4199\\\\298.01\\\\37.72183\\\\105.4199\\\\298.01\\\\37.8293\\\\102.9199\\\\298.01\\\\37.73231\\\\100.9199\\\\298.01\\\\37.29119\\\\97.91986\\\\298.01\\\\36.76729\\\\95.91986\\\\298.01\\\\35.8435\\\\93.41986\\\\298.01\\\\34.34129\\\\90.41986\\\\298.01\\\\32.69308\\\\87.91986\\\\298.01\\\\31.63579\\\\86.6045\\\\298.01\\\\30.08003\\\\84.91986\\\\298.01\\\\27.63579\\\\82.74211\\\\298.01\\\\25.63579\\\\81.32591\\\\298.01\\\\23.63579\\\\80.17981\\\\298.01\\\\21.63579\\\\79.2176\\\\298.01\\\\19.13579\\\\78.29486\\\\298.01\\\\17.13579\\\\77.77402\\\\298.01\\\\14.13579\\\\77.34486\\\\298.01\\\\12.13579\\\\77.24346\\\\298.01\\\\10.13579\\\\77.32334\\\\298.01\\\\7.135788\\\\77.74678\\\\298.01\\\\5.135788\\\\78.24847\\\\298.01\\\\2.135788\\\\79.33382\\\\298.01\\\\0.1357885\\\\80.31096\\\\298.01\\\\-2.864212\\\\82.22402\\\\298.01\\\\-4.864212\\\\83.84435\\\\298.01\\\\-6.494857\\\\85.41986\\\\298.01\\\\-7.398883\\\\86.41986\\\\298.01\\\\-8.986199\\\\88.41986\\\\298.01\\\\-10.57276\\\\90.91986\\\\298.01\\\\-11.58712\\\\92.91986\\\\298.01\\\\-12.58144\\\\95.41986\\\\298.01\\\\-13.04796\\\\96.91986\\\\298.01\\\\-13.52869\\\\98.91986\\\\298.01\\\\-13.89546\\\\101.9199\\\\298.01\\\\-13.88846\\\\104.4199\\\\298.01\\\\-13.52147\\\\107.4199\\\\298.01\\\\-13.03896\\\\109.4199\\\\298.01\\\\-12.56842\\\\110.9199\\\\298.01\\\\-11.56853\\\\113.4199\\\\298.01\\\\-10.54737\\\\115.4199\\\\298.01\\\\-8.942026\\\\117.9199\\\\298.01\\\\-6.441266\\\\120.9199\\\\298.01\\\\-4.864212\\\\122.5615\\\\298.01\\\\-3.257069\\\\124.4199\\\\298.01\\\\-2.292064\\\\125.9199\\\\298.01\\\\-1.797885\\\\126.9199\\\\298.01\\\\-1.141081\\\\128.9199\\\\298.01\\\\-0.9914045\\\\130.4199\\\\298.01\\\\-1.169235\\\\131.9199\\\\298.01\\\\-1.678251\\\\133.4199\\\\298.01\\\\-2.778172\\\\135.4199\\\\298.01\\\\-3.864212\\\\136.7395\\\\298.01\\\\-5.864212\\\\138.492\\\\298.01\\\\-7.864212\\\\139.5963\\\\298.01\\\\-9.364211\\\\140.1104\\\\298.01\\\\-11.36421\\\\140.3688\\\\298.01\\\\-13.36421\\\\140.0734\\\\298.01\\\\-14.86421\\\\139.5239\\\\298.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851016723500001.512636853846\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"246\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"15\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n"; -const char* k_rtStruct_json07 = -" \"Value\" : \"41.63579\\\\136.0798\\\\301.01\\\\39.63579\\\\137.1339\\\\301.01\\\\38.13579\\\\137.6336\\\\301.01\\\\36.63579\\\\137.8285\\\\301.01\\\\35.13579\\\\137.6244\\\\301.01\\\\33.63579\\\\137.0851\\\\301.01\\\\32.63579\\\\136.5518\\\\301.01\\\\31.13579\\\\135.4333\\\\301.01\\\\30.12233\\\\134.4199\\\\301.01\\\\29.0038\\\\132.9199\\\\301.01\\\\28.47056\\\\131.9199\\\\301.01\\\\27.93124\\\\130.4199\\\\301.01\\\\27.72713\\\\128.9199\\\\301.01\\\\27.9259\\\\127.4199\\\\301.01\\\\28.43386\\\\125.9199\\\\301.01\\\\29.51482\\\\123.9199\\\\301.01\\\\31.77887\\\\120.9199\\\\301.01\\\\33.79488\\\\117.9199\\\\301.01\\\\35.27357\\\\115.4199\\\\301.01\\\\36.26941\\\\113.4199\\\\301.01\\\\37.23983\\\\110.9199\\\\301.01\\\\37.80718\\\\108.9199\\\\301.01\\\\38.26298\\\\106.4199\\\\301.01\\\\38.42556\\\\102.9199\\\\301.01\\\\38.32632\\\\100.4199\\\\301.01\\\\37.81704\\\\97.41986\\\\301.01\\\\37.26298\\\\95.41986\\\\301.01\\\\36.30376\\\\92.91986\\\\301.01\\\\35.31862\\\\90.91986\\\\301.01\\\\33.79669\\\\88.41986\\\\301.01\\\\32.69613\\\\86.91986\\\\301.01\\\\31.40617\\\\85.41986\\\\301.01\\\\30.13579\\\\84.11847\\\\301.01\\\\28.13579\\\\82.36256\\\\301.01\\\\26.63579\\\\81.26077\\\\301.01\\\\24.13579\\\\79.73861\\\\301.01\\\\22.13579\\\\78.75716\\\\301.01\\\\19.63579\\\\77.80389\\\\301.01\\\\17.63579\\\\77.24678\\\\301.01\\\\15.13579\\\\76.79932\\\\301.01\\\\12.13579\\\\76.64858\\\\301.01\\\\9.635789\\\\76.72783\\\\301.01\\\\6.635788\\\\77.21915\\\\301.01\\\\4.635788\\\\77.74511\\\\301.01\\\\3.135788\\\\78.25896\\\\301.01\\\\0.5678061\\\\79.41986\\\\301.01\\\\-1.864211\\\\80.78835\\\\301.01\\\\-3.364212\\\\81.83115\\\\301.01\\\\-4.710485\\\\82.91986\\\\301.01\\\\-6.864212\\\\84.94054\\\\301.01\\\\-9.004042\\\\87.41986\\\\301.01\\\\-11.00404\\\\90.41986\\\\301.01\\\\-12.04224\\\\92.41986\\\\301.01\\\\-13.0635\\\\94.91986\\\\301.01\\\\-13.55475\\\\96.41986\\\\301.01\\\\-14.05919\\\\98.41986\\\\301.01\\\\-14.46577\\\\100.9199\\\\301.01\\\\-14.56064\\\\103.9199\\\\301.01\\\\-14.45556\\\\105.4199\\\\301.01\\\\-14.05171\\\\107.9199\\\\301.01\\\\-13.54386\\\\109.9199\\\\301.01\\\\-12.47311\\\\112.9199\\\\301.01\\\\-11.52147\\\\114.9199\\\\301.01\\\\-10.0356\\\\117.4199\\\\301.01\\\\-7.977848\\\\120.4199\\\\301.01\\\\-6.493406\\\\122.4199\\\\301.01\\\\-4.729596\\\\124.4199\\\\301.01\\\\-3.644515\\\\125.9199\\\\301.01\\\\-2.642783\\\\127.9199\\\\301.01\\\\-2.184044\\\\129.4199\\\\301.01\\\\-2.190483\\\\131.4199\\\\301.01\\\\-2.659926\\\\132.9199\\\\301.01\\\\-3.746865\\\\134.9199\\\\301.01\\\\-4.864212\\\\136.2112\\\\301.01\\\\-5.864212\\\\137.1478\\\\301.01\\\\-7.364212\\\\138.139\\\\301.01\\\\-8.364211\\\\138.6184\\\\301.01\\\\-9.864211\\\\139.0841\\\\301.01\\\\-10.86421\\\\139.1837\\\\301.01\\\\-12.36421\\\\139.0851\\\\301.01\\\\-13.86421\\\\138.6368\\\\301.01\\\\-15.36421\\\\137.9369\\\\301.01\\\\-16.86421\\\\137.0216\\\\301.01\\\\-19.36421\\\\135.1894\\\\301.01\\\\-22.36421\\\\133.2626\\\\301.01\\\\-25.86421\\\\131.3565\\\\301.01\\\\-28.36421\\\\130.3086\\\\301.01\\\\-29.86421\\\\129.8259\\\\301.01\\\\-32.36421\\\\129.2191\\\\301.01\\\\-34.86421\\\\128.8338\\\\301.01\\\\-37.86421\\\\128.7519\\\\301.01\\\\-41.36421\\\\129.2324\\\\301.01\\\\-43.36421\\\\129.7339\\\\301.01\\\\-46.36421\\\\130.7721\\\\301.01\\\\-49.36421\\\\132.2284\\\\301.01\\\\-51.86421\\\\133.7884\\\\301.01\\\\-53.86421\\\\135.3506\\\\301.01\\\\-56.47069\\\\137.9199\\\\301.01\\\\-58.44481\\\\140.4199\\\\301.01\\\\-60.00607\\\\142.9199\\\\301.01\\\\-61.00807\\\\144.9199\\\\301.01\\\\-61.98475\\\\147.4199\\\\301.01\\\\-62.55171\\\\149.4199\\\\301.01\\\\-62.94481\\\\151.4199\\\\301.01\\\\-63.10673\\\\152.9199\\\\301.01\\\\-63.19798\\\\155.4199\\\\301.01\\\\-63.00807\\\\158.9199\\\\301.01\\\\-62.53729\\\\161.4199\\\\301.01\\\\-61.96073\\\\163.4199\\\\301.01\\\\-60.97069\\\\165.9199\\\\301.01\\\\-60.48248\\\\166.9199\\\\301.01\\\\-59.01394\\\\169.4199\\\\301.01\\\\-57.95292\\\\170.9199\\\\301.01\\\\-56.86421\\\\172.2435\\\\301.01\\\\-55.29496\\\\173.9199\\\\301.01\\\\-53.67131\\\\175.4199\\\\301.01\\\\-52.36421\\\\176.4802\\\\301.01\\\\-49.86421\\\\178.1377\\\\301.01\\\\-47.36421\\\\179.4369\\\\301.01\\\\-45.86421\\\\180.0861\\\\301.01\\\\-42.86421\\\\181.0311\\\\301.01\\\\-40.36421\\\\181.5311\\\\301.01\\\\-36.86421\\\\181.7386\\\\301.01\\\\-33.36421\\\\181.5637\\\\301.01\\\\-30.86421\\\\181.0963\\\\301.01\\\\-28.86421\\\\180.5239\\\\301.01\\\\-26.36421\\\\179.5404\\\\301.01\\\\-24.36421\\\\178.5404\\\\301.01\\\\-20.36421\\\\176.3956\\\\301.01\\\\-17.86421\\\\175.2373\\\\301.01\\\\-14.86421\\\\174.2269\\\\301.01\\\\-13.36421\\\\174.0709\\\\301.01\\\\-11.86421\\\\174.2958\\\\301.01\\\\-9.864211\\\\175.2389\\\\301.01\\\\-8.441711\\\\176.4199\\\\301.01\\\\-7.16156\\\\177.9199\\\\301.01\\\\-6.177148\\\\179.9199\\\\301.01\\\\-5.842727\\\\181.4199\\\\301.01\\\\-5.813838\\\\182.4199\\\\301.01\\\\-6.169591\\\\184.4199\\\\301.01\\\\-7.196132\\\\187.4199\\\\301.01\\\\-8.770263\\\\190.9199\\\\301.01\\\\-10.00404\\\\193.4199\\\\301.01\\\\-10.97069\\\\195.9199\\\\301.01\\\\-11.5356\\\\197.9199\\\\301.01\\\\-12.04705\\\\200.9199\\\\301.01\\\\-12.15398\\\\203.9199\\\\301.01\\\\-12.05475\\\\206.4199\\\\301.01\\\\-11.54546\\\\209.4199\\\\301.01\\\\-10.9914\\\\211.4199\\\\301.01\\\\-10.03218\\\\213.9199\\\\301.01\\\\-9.047048\\\\215.9199\\\\301.01\\\\-7.525116\\\\218.4199\\\\301.01\\\\-6.424556\\\\219.9199\\\\301.01\\\\-5.133131\\\\221.4199\\\\301.01\\\\-3.864212\\\\222.7213\\\\301.01\\\\-1.864211\\\\224.4771\\\\301.01\\\\-0.3642115\\\\225.5771\\\\301.01\\\\2.135788\\\\227.0995\\\\301.01\\\\4.135788\\\\228.0826\\\\301.01\\\\6.635788\\\\229.0358\\\\301.01\\\\8.635789\\\\229.5929\\\\301.01\\\\11.13579\\\\230.0381\\\\301.01\\\\14.13579\\\\230.1911\\\\301.01\\\\16.63579\\\\230.1119\\\\301.01\\\\19.63579\\\\229.6206\\\\301.01\\\\21.63579\\\\229.0929\\\\301.01\\\\23.13579\\\\228.5808\\\\301.01\\\\25.70377\\\\227.4199\\\\301.01\\\\28.13579\\\\226.0514\\\\301.01\\\\29.63579\\\\225.0086\\\\301.01\\\\30.98206\\\\223.9199\\\\301.01\\\\33.13579\\\\221.8956\\\\301.01\\\\35.27562\\\\219.4199\\\\301.01\\\\37.27562\\\\216.4199\\\\301.01\\\\38.31382\\\\214.4199\\\\301.01\\\\39.33508\\\\211.9199\\\\301.01\\\\39.82632\\\\210.4199\\\\301.01\\\\40.33076\\\\208.4199\\\\301.01\\\\40.73735\\\\205.9199\\\\301.01\\\\40.83222\\\\202.9199\\\\301.01\\\\40.72713\\\\201.4199\\\\301.01\\\\40.32329\\\\198.9199\\\\301.01\\\\39.81544\\\\196.9199\\\\301.01\\\\39.32329\\\\195.4199\\\\301.01\\\\38.29488\\\\192.9199\\\\301.01\\\\35.95219\\\\188.4199\\\\301.01\\\\34.43608\\\\184.9199\\\\301.01\\\\33.9686\\\\183.4199\\\\301.01\\\\33.73262\\\\181.4199\\\\301.01\\\\33.94788\\\\179.9199\\\\301.01\\\\34.52448\\\\178.4199\\\\301.01\\\\35.44645\\\\176.9199\\\\301.01\\\\36.36579\\\\175.9199\\\\301.01\\\\37.63579\\\\174.8116\\\\301.01\\\\39.63579\\\\173.747\\\\301.01\\\\41.13579\\\\173.3669\\\\301.01\\\\42.13579\\\\173.3279\\\\301.01\\\\44.13579\\\\173.7036\\\\301.01\\\\46.13579\\\\174.3009\\\\301.01\\\\48.63579\\\\175.2884\\\\301.01\\\\51.13579\\\\176.5471\\\\301.01\\\\54.63579\\\\178.0789\\\\301.01\\\\56.13579\\\\178.5789\\\\301.01\\\\58.13579\\\\179.0963\\\\301.01\\\\60.63579\\\\179.4977\\\\301.01\\\\62.13579\\\\179.6058\\\\301.01\\\\65.13579\\\\179.5138\\\\301.01\\\\67.63579\\\\179.1134\\\\301.01\\\\69.63579\\\\178.6148\\\\301.01\\\\72.63579\\\\177.5771\\\\301.01\\\\75.63579\\\\176.1191\\\\301.01\\\\78.13579\\\\174.5576\\\\301.01\\\\80.13579\\\\172.992\\\\301.01\\\\81.80482\\\\171.4199\\\\301.01\\\\83.17384\\\\169.9199\\\\301.01\\\\84.72182\\\\167.9199\\\\301.01\\\\86.27964\\\\165.4199\\\\301.01\\\\87.28358\\\\163.4199\\\\301.01\\\\88.26079\\\\160.9199\\\\301.01\\\\88.82632\\\\158.9199\\\\301.01\\\\89.22182\\\\156.9199\\\\301.01\\\\89.3794\\\\155.4199\\\\301.01\\\\89.46956\\\\152.9199\\\\301.01\\\\89.26079\\\\149.4199\\\\301.01\\\\88.75857\\\\146.9199\\\\301.01\\\\87.80548\\\\143.9199\\\\301.01\\\\87.16004\\\\142.4199\\\\301.01\\\\85.85093\\\\139.9199\\\\301.01\\\\84.18044\\\\137.4199\\\\301.01\\\\82.63579\\\\135.578\\\\301.01\\\\80.45245\\\\133.4199\\\\301.01\\\\79.13579\\\\132.3039\\\\301.01\\\\76.13579\\\\130.259\\\\301.01\\\\73.13579\\\\128.7278\\\\301.01\\\\70.63579\\\\127.7663\\\\301.01\\\\68.63579\\\\127.2192\\\\301.01\\\\66.63579\\\\126.8285\\\\301.01\\\\63.13579\\\\126.6148\\\\301.01\\\\59.63579\\\\126.7884\\\\301.01\\\\57.13579\\\\127.2502\\\\301.01\\\\55.13579\\\\127.8208\\\\301.01\\\\52.63579\\\\128.8062\\\\301.01\\\\51.63579\\\\129.2905\\\\301.01\\\\49.13579\\\\130.7368\\\\301.01\\\\46.13579\\\\132.7185\\\\301.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851035724600001.533642609670\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"234\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"16\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-7.002701\\\\124.9199\\\\304.01\\\\-5.332349\\\\127.4199\\\\304.01\\\\-4.657244\\\\128.9199\\\\304.01\\\\-4.339658\\\\130.4199\\\\304.01\\\\-4.672063\\\\131.9199\\\\304.01\\\\-5.731034\\\\133.9199\\\\304.01\\\\-7.364212\\\\135.553\\\\304.01\\\\-9.364211\\\\136.612\\\\304.01\\\\-10.86421\\\\136.9399\\\\304.01\\\\-12.86421\\\\136.6037\\\\304.01\\\\-14.36421\\\\135.9559\\\\304.01\\\\-16.36421\\\\134.8809\\\\304.01\\\\-19.36421\\\\134.0734\\\\304.01\\\\-20.86421\\\\133.5753\\\\304.01\\\\-23.36421\\\\132.4405\\\\304.01\\\\-26.86421\\\\130.722\\\\304.01\\\\-29.36421\\\\129.7841\\\\304.01\\\\-31.36421\\\\129.2435\\\\304.01\\\\-33.86421\\\\128.7862\\\\304.01\\\\-36.86421\\\\128.6288\\\\304.01\\\\-39.86421\\\\128.8016\\\\304.01\\\\-42.36421\\\\129.274\\\\304.01\\\\-44.36421\\\\129.8477\\\\304.01\\\\-46.86421\\\\130.78\\\\304.01\\\\-48.86421\\\\131.7485\\\\304.01\\\\-51.36421\\\\133.2519\\\\304.01\\\\-52.86421\\\\134.3259\\\\304.01\\\\-54.71862\\\\135.9199\\\\304.01\\\\-56.66553\\\\137.9199\\\\304.01\\\\-57.90558\\\\139.4199\\\\304.01\\\\-58.98475\\\\140.9199\\\\304.01\\\\-59.89888\\\\142.4199\\\\304.01\\\\-60.96327\\\\144.4199\\\\304.01\\\\-62.00404\\\\146.9199\\\\304.01\\\\-62.49141\\\\148.4199\\\\304.01\\\\-62.99141\\\\150.4199\\\\304.01\\\\-63.42456\\\\153.4199\\\\304.01\\\\-63.54705\\\\155.4199\\\\304.01\\\\-63.39888\\\\157.4199\\\\304.01\\\\-63.05474\\\\159.9199\\\\304.01\\\\-62.44481\\\\162.4199\\\\304.01\\\\-61.95556\\\\163.9199\\\\304.01\\\\-60.87383\\\\166.4199\\\\304.01\\\\-59.51394\\\\168.9199\\\\304.01\\\\-58.50607\\\\170.4199\\\\304.01\\\\-56.92757\\\\172.4199\\\\304.01\\\\-55.52116\\\\173.9199\\\\304.01\\\\-53.86421\\\\175.4709\\\\304.01\\\\-51.86421\\\\177.0449\\\\304.01\\\\-49.36421\\\\178.6177\\\\304.01\\\\-46.36421\\\\180.0843\\\\304.01\\\\-43.36421\\\\181.1058\\\\304.01\\\\-41.36421\\\\181.5843\\\\304.01\\\\-38.36421\\\\181.9891\\\\304.01\\\\-35.86421\\\\182.0426\\\\304.01\\\\-32.36421\\\\181.6119\\\\304.01\\\\-29.86421\\\\181.0164\\\\304.01\\\\-28.36421\\\\180.5311\\\\304.01\\\\-25.86421\\\\179.4802\\\\304.01\\\\-23.36421\\\\178.2136\\\\304.01\\\\-21.36421\\\\177.3016\\\\304.01\\\\-19.86421\\\\176.7993\\\\304.01\\\\-17.36421\\\\176.4579\\\\304.01\\\\-15.36421\\\\176.7158\\\\304.01\\\\-13.36421\\\\177.2203\\\\304.01\\\\-11.36421\\\\178.2083\\\\304.01\\\\-9.70184\\\\179.9199\\\\304.01\\\\-8.743179\\\\181.9199\\\\304.01\\\\-8.174695\\\\183.9199\\\\304.01\\\\-7.905579\\\\185.9199\\\\304.01\\\\-8.208806\\\\188.4199\\\\304.01\\\\-9.245948\\\\191.4199\\\\304.01\\\\-9.968248\\\\192.9199\\\\304.01\\\\-10.97069\\\\195.4199\\\\304.01\\\\-11.4448\\\\196.9199\\\\304.01\\\\-12.03729\\\\199.4199\\\\304.01\\\\-12.38126\\\\202.4199\\\\304.01\\\\-12.46825\\\\203.9199\\\\304.01\\\\-12.05171\\\\207.9199\\\\304.01\\\\-11.47785\\\\210.4199\\\\304.01\\\\-10.41841\\\\213.4199\\\\304.01\\\\-9.501996\\\\215.4199\\\\304.01\\\\-8.038957\\\\217.9199\\\\304.01\\\\-6.995714\\\\219.4199\\\\304.01\\\\-5.364212\\\\221.372\\\\304.01\\\\-4.364212\\\\222.4369\\\\304.01\\\\-2.749882\\\\223.9199\\\\304.01\\\\-1.364211\\\\225.0471\\\\304.01\\\\0.1357885\\\\226.0878\\\\304.01\\\\2.635788\\\\227.5471\\\\304.01\\\\3.635788\\\\228.0311\\\\304.01\\\\6.135788\\\\229.0404\\\\304.01\\\\7.635788\\\\229.5059\\\\304.01\\\\10.13579\\\\230.0826\\\\304.01\\\\13.63579\\\\230.4369\\\\304.01\\\\15.13579\\\\230.4102\\\\304.01\\\\18.13579\\\\230.1177\\\\304.01\\\\20.63579\\\\229.5789\\\\304.01\\\\23.63579\\\\228.5771\\\\304.01\\\\25.63579\\\\227.6478\\\\304.01\\\\27.63579\\\\226.5696\\\\304.01\\\\29.13579\\\\225.5808\\\\304.01\\\\30.63579\\\\224.4476\\\\304.01\\\\32.13579\\\\223.1389\\\\304.01\\\\34.72183\\\\220.4199\\\\304.01\\\\36.23735\\\\218.4199\\\\304.01\\\\37.77357\\\\215.9199\\\\304.01\\\\38.76079\\\\213.9199\\\\304.01\\\\39.71638\\\\211.4199\\\\304.01\\\\40.29669\\\\209.4199\\\\304.01\\\\40.83928\\\\206.4199\\\\304.01\\\\40.95776\\\\203.9199\\\\304.01\\\\40.76941\\\\200.4199\\\\304.01\\\\40.27357\\\\197.9199\\\\304.01\\\\39.32481\\\\194.9199\\\\304.01\\\\38.71079\\\\193.4199\\\\304.01\\\\37.00217\\\\189.9199\\\\304.01\\\\35.97488\\\\186.9199\\\\304.01\\\\35.81218\\\\184.9199\\\\304.01\\\\36.02215\\\\182.9199\\\\304.01\\\\36.53948\\\\180.9199\\\\304.01\\\\36.95037\\\\179.9199\\\\304.01\\\\37.94024\\\\178.4199\\\\304.01\\\\39.13579\\\\177.2874\\\\304.01\\\\40.13579\\\\176.6719\\\\304.01\\\\42.13579\\\\175.8343\\\\304.01\\\\44.13579\\\\175.2645\\\\304.01\\\\45.63579\\\\175.1192\\\\304.01\\\\47.13579\\\\175.259\\\\304.01\\\\49.13579\\\\175.872\\\\304.01\\\\54.13579\\\\178.0657\\\\304.01\\\\57.13579\\\\179.0164\\\\304.01\\\\59.63579\\\\179.5214\\\\304.01\\\\63.13579\\\\179.7263\\\\304.01\\\\66.13579\\\\179.5597\\\\304.01\\\\68.63579\\\\179.0826\\\\304.01\\\\70.63579\\\\178.5164\\\\304.01\\\\73.13579\\\\177.5753\\\\304.01\\\\75.13579\\\\176.6043\\\\304.01\\\\77.63579\\\\175.0995\\\\304.01\\\\79.13579\\\\174.0263\\\\304.01\\\\81.00275\\\\172.4199\\\\304.01\\\\82.94763\\\\170.4199\\\\304.01\\\\84.19308\\\\168.9199\\\\304.01\\\\85.26515\\\\167.4199\\\\304.01\\\\86.74468\\\\164.9199\\\\304.01\\\\87.67715\\\\162.9199\\\\304.01\\\\88.76941\\\\159.9199\\\\304.01\\\\89.26729\\\\157.9199\\\\304.01\\\\89.69914\\\\154.9199\\\\304.01\\\\89.77764\\\\151.9199\\\\304.01\\\\89.31544\\\\148.4199\\\\304.01\\\\88.83076\\\\146.4199\\\\304.01\\\\88.18044\\\\144.4199\\\\304.01\\\\87.34991\\\\142.4199\\\\304.01\\\\86.33366\\\\140.4199\\\\304.01\\\\84.75405\\\\137.9199\\\\304.01\\\\83.16004\\\\135.9199\\\\304.01\\\\80.63579\\\\133.3449\\\\304.01\\\\78.13579\\\\131.3449\\\\304.01\\\\75.63579\\\\129.7572\\\\304.01\\\\73.63579\\\\128.7402\\\\304.01\\\\71.13579\\\\127.7324\\\\304.01\\\\69.63579\\\\127.2572\\\\304.01\\\\67.63579\\\\126.778\\\\304.01\\\\64.13579\\\\126.3338\\\\304.01\\\\61.63579\\\\126.3752\\\\304.01\\\\58.63579\\\\126.7435\\\\304.01\\\\56.13579\\\\127.3449\\\\304.01\\\\53.63579\\\\128.2206\\\\304.01\\\\51.13579\\\\129.3886\\\\304.01\\\\48.13579\\\\131.1148\\\\304.01\\\\45.13579\\\\132.5771\\\\304.01\\\\42.63579\\\\133.274\\\\304.01\\\\41.63579\\\\133.6847\\\\304.01\\\\40.13579\\\\134.6251\\\\304.01\\\\38.13579\\\\135.5657\\\\304.01\\\\36.63579\\\\135.7968\\\\304.01\\\\35.13579\\\\135.5526\\\\304.01\\\\33.13579\\\\134.5317\\\\304.01\\\\32.13579\\\\133.6744\\\\304.01\\\\31.02395\\\\132.4199\\\\304.01\\\\30.0031\\\\130.4199\\\\304.01\\\\29.75883\\\\128.9199\\\\304.01\\\\29.99374\\\\127.4199\\\\304.01\\\\30.93457\\\\125.4199\\\\304.01\\\\31.87468\\\\123.9199\\\\304.01\\\\32.28358\\\\122.9199\\\\304.01\\\\32.97309\\\\120.4199\\\\304.01\\\\34.10454\\\\117.9199\\\\304.01\\\\36.20794\\\\113.9199\\\\304.01\\\\37.24227\\\\111.4199\\\\304.01\\\\37.71638\\\\109.9199\\\\304.01\\\\38.30886\\\\107.4199\\\\304.01\\\\38.70211\\\\103.9199\\\\304.01\\\\38.67046\\\\101.9199\\\\304.01\\\\38.32329\\\\98.91986\\\\304.01\\\\37.74942\\\\96.41986\\\\304.01\\\\36.68998\\\\93.41986\\\\304.01\\\\35.77357\\\\91.41986\\\\304.01\\\\34.31053\\\\88.91986\\\\304.01\\\\33.26729\\\\87.41986\\\\304.01\\\\32.13579\\\\86.02943\\\\304.01\\\\30.13383\\\\83.91986\\\\304.01\\\\27.63579\\\\81.79266\\\\304.01\\\\26.13579\\\\80.75189\\\\304.01\\\\23.63579\\\\79.29266\\\\304.01\\\\20.13579\\\\77.79707\\\\304.01\\\\18.63579\\\\77.33382\\\\304.01\\\\16.13579\\\\76.75716\\\\304.01\\\\12.63579\\\\76.39918\\\\304.01\\\\11.13579\\\\76.42567\\\\304.01\\\\8.135789\\\\76.72199\\\\304.01\\\\5.635788\\\\77.25896\\\\304.01\\\\2.635788\\\\78.2626\\\\304.01\\\\0.6357885\\\\79.19189\\\\304.01\\\\-1.364211\\\\80.27013\\\\304.01\\\\-2.864212\\\\81.25896\\\\304.01\\\\-4.364212\\\\82.39208\\\\304.01\\\\-6.864212\\\\84.67407\\\\304.01\\\\-8.452921\\\\86.41986\\\\304.01\\\\-9.968248\\\\88.41986\\\\304.01\\\\-11.50404\\\\90.91986\\\\304.01\\\\-12.48921\\\\92.91986\\\\304.01\\\\-13.4448\\\\95.41986\\\\304.01\\\\-14.02512\\\\97.41986\\\\304.01\\\\-14.56907\\\\100.4199\\\\304.01\\\\-14.68618\\\\102.9199\\\\304.01\\\\-14.49783\\\\106.4199\\\\304.01\\\\-14.002\\\\108.9199\\\\304.01\\\\-13.05324\\\\111.9199\\\\304.01\\\\-11.97069\\\\114.4199\\\\304.01\\\\-8.813155\\\\119.9199\\\\304.01\\\\-7.750575\\\\122.4199\\\\304.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851068726500001.546012551665\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"248\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"17\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.13579\\\\230.4862\\\\307.01\\\\18.13579\\\\230.1234\\\\307.01\\\\20.63579\\\\229.5843\\\\307.01\\\\23.63579\\\\228.5826\\\\307.01\\\\25.63579\\\\227.6544\\\\307.01\\\\27.63579\\\\226.5734\\\\307.01\\\\29.13579\\\\225.5843\\\\307.01\\\\30.63579\\\\224.4545\\\\307.01\\\\32.13579\\\\223.1497\\\\307.01\\\\34.73231\\\\220.4199\\\\307.01\\\\36.24707\\\\218.4199\\\\307.01\\\\37.78162\\\\215.9199\\\\307.01\\\\38.76729\\\\213.9199\\\\307.01\\\\39.7245\\\\211.4199\\\\307.01\\\\40.30202\\\\209.4199\\\\307.01\\\\40.84336\\\\206.4199\\\\307.01\\\\40.96271\\\\203.9199\\\\307.01\\\\40.77357\\\\200.4199\\\\307.01\\\\40.27764\\\\197.9199\\\\307.01\\\\39.3293\\\\194.9199\\\\307.01\\\\38.71912\\\\193.4199\\\\307.01\\\\37.00643\\\\189.9199\\\\307.01\\\\36.42688\\\\188.4199\\\\307.01\\\\35.98225\\\\186.9199\\\\307.01\\\\35.84065\\\\184.9199\\\\307.01\\\\36.01079\\\\183.4199\\\\307.01\\\\36.51752\\\\181.9199\\\\307.01\\\\37.00217\\\\180.9199\\\\307.01\\\\37.99393\\\\179.4199\\\\307.01\\\\39.13579\\\\178.1658\\\\307.01\\\\40.13579\\\\177.278\\\\307.01\\\\41.63579\\\\176.2862\\\\307.01\\\\42.63579\\\\175.8016\\\\307.01\\\\44.13579\\\\175.2949\\\\307.01\\\\45.63579\\\\175.1247\\\\307.01\\\\47.13579\\\\175.2645\\\\307.01\\\\48.63579\\\\175.7045\\\\307.01\\\\54.13579\\\\178.0715\\\\307.01\\\\57.13579\\\\179.0214\\\\307.01\\\\59.63579\\\\179.5239\\\\307.01\\\\63.13579\\\\179.7308\\\\307.01\\\\65.63579\\\\179.6192\\\\307.01\\\\68.63579\\\\179.0896\\\\307.01\\\\70.63579\\\\178.5263\\\\307.01\\\\72.13579\\\\177.9862\\\\307.01\\\\74.13579\\\\177.1148\\\\307.01\\\\76.13579\\\\176.0637\\\\307.01\\\\79.13579\\\\174.0311\\\\307.01\\\\81.0086\\\\172.4199\\\\307.01\\\\82.9529\\\\170.4199\\\\307.01\\\\84.19914\\\\168.9199\\\\307.01\\\\85.26941\\\\167.4199\\\\307.01\\\\86.75175\\\\164.9199\\\\307.01\\\\87.68684\\\\162.9199\\\\307.01\\\\88.77357\\\\159.9199\\\\307.01\\\\89.27562\\\\157.9199\\\\307.01\\\\89.71638\\\\154.9199\\\\307.01\\\\89.82782\\\\152.9199\\\\307.01\\\\89.68684\\\\150.9199\\\\307.01\\\\89.32175\\\\148.4199\\\\307.01\\\\88.83649\\\\146.4199\\\\307.01\\\\88.18999\\\\144.4199\\\\307.01\\\\87.35246\\\\142.4199\\\\307.01\\\\86.33649\\\\140.4199\\\\307.01\\\\84.75857\\\\137.9199\\\\307.01\\\\83.16704\\\\135.9199\\\\307.01\\\\80.63579\\\\133.3393\\\\307.01\\\\79.13579\\\\132.1011\\\\307.01\\\\76.63579\\\\130.3393\\\\307.01\\\\73.63579\\\\128.7339\\\\307.01\\\\71.13579\\\\127.7278\\\\307.01\\\\69.63579\\\\127.2502\\\\307.01\\\\67.63579\\\\126.7701\\\\307.01\\\\64.63579\\\\126.372\\\\307.01\\\\63.13579\\\\126.2701\\\\307.01\\\\61.63579\\\\126.3565\\\\307.01\\\\58.63579\\\\126.7386\\\\307.01\\\\56.13579\\\\127.3393\\\\307.01\\\\54.63579\\\\127.8233\\\\307.01\\\\52.13579\\\\128.8818\\\\307.01\\\\46.13579\\\\132.1365\\\\307.01\\\\45.13579\\\\132.5696\\\\307.01\\\\43.13579\\\\133.1104\\\\307.01\\\\41.13579\\\\133.1027\\\\307.01\\\\39.13579\\\\132.5188\\\\307.01\\\\38.63579\\\\132.4971\\\\307.01\\\\37.13579\\\\134.4706\\\\307.01\\\\35.63579\\\\135.5464\\\\307.01\\\\34.13579\\\\136.0158\\\\307.01\\\\32.63579\\\\135.5587\\\\307.01\\\\31.13579\\\\134.5006\\\\307.01\\\\30.00924\\\\132.9199\\\\307.01\\\\29.57402\\\\131.4199\\\\307.01\\\\30.02434\\\\129.9199\\\\307.01\\\\31.13579\\\\128.4078\\\\307.01\\\\33.07329\\\\126.9199\\\\307.01\\\\33.03827\\\\126.4199\\\\307.01\\\\32.45295\\\\124.4199\\\\307.01\\\\32.44526\\\\122.4199\\\\307.01\\\\32.98225\\\\120.4199\\\\307.01\\\\34.13579\\\\117.8923\\\\307.01\\\\36.2136\\\\113.9199\\\\307.01\\\\37.24707\\\\111.4199\\\\307.01\\\\37.72183\\\\109.9199\\\\307.01\\\\38.31382\\\\107.4199\\\\307.01\\\\38.67046\\\\104.4199\\\\307.01\\\\38.75405\\\\102.9199\\\\307.01\\\\38.3293\\\\98.91986\\\\307.01\\\\37.75405\\\\96.41986\\\\307.01\\\\36.69613\\\\93.41986\\\\307.01\\\\35.77964\\\\91.41986\\\\307.01\\\\34.31382\\\\88.91986\\\\307.01\\\\33.2715\\\\87.41986\\\\307.01\\\\32.13579\\\\86.02634\\\\307.01\\\\30.13579\\\\83.91791\\\\307.01\\\\27.63579\\\\81.7905\\\\307.01\\\\26.13579\\\\80.74847\\\\307.01\\\\23.63579\\\\79.28835\\\\307.01\\\\20.13579\\\\77.79486\\\\307.01\\\\18.63579\\\\77.32851\\\\307.01\\\\16.13579\\\\76.75017\\\\307.01\\\\12.13579\\\\76.35353\\\\307.01\\\\8.135789\\\\76.71637\\\\307.01\\\\5.635788\\\\77.25362\\\\307.01\\\\2.635788\\\\78.25716\\\\307.01\\\\0.6357885\\\\79.18528\\\\307.01\\\\-1.364211\\\\80.26633\\\\307.01\\\\-2.864212\\\\81.25539\\\\307.01\\\\-4.364212\\\\82.38519\\\\307.01\\\\-5.864212\\\\83.69002\\\\307.01\\\\-8.460731\\\\86.41986\\\\307.01\\\\-9.975492\\\\88.41986\\\\307.01\\\\-11.51005\\\\90.91986\\\\307.01\\\\-12.49571\\\\92.91986\\\\307.01\\\\-13.45292\\\\95.41986\\\\307.01\\\\-14.03044\\\\97.41986\\\\307.01\\\\-14.57178\\\\100.4199\\\\307.01\\\\-14.69113\\\\102.9199\\\\307.01\\\\-14.502\\\\106.4199\\\\307.01\\\\-14.00607\\\\108.9199\\\\307.01\\\\-13.05772\\\\111.9199\\\\307.01\\\\-11.97785\\\\114.4199\\\\307.01\\\\-8.843534\\\\119.9199\\\\307.01\\\\-8.178251\\\\121.4199\\\\307.01\\\\-7.722358\\\\122.9199\\\\307.01\\\\-7.57178\\\\124.4199\\\\307.01\\\\-7.64881\\\\125.4199\\\\307.01\\\\-7.944804\\\\126.4199\\\\307.01\\\\-7.864212\\\\127.2299\\\\307.01\\\\-5.864212\\\\128.2935\\\\307.01\\\\-4.207962\\\\129.9199\\\\307.01\\\\-3.203497\\\\131.9199\\\\307.01\\\\-3.045334\\\\132.9199\\\\307.01\\\\-3.208599\\\\133.9199\\\\307.01\\\\-4.270838\\\\135.9199\\\\307.01\\\\-5.364212\\\\137.0193\\\\307.01\\\\-7.364212\\\\138.0806\\\\307.01\\\\-8.364211\\\\138.2472\\\\307.01\\\\-9.364211\\\\138.0891\\\\307.01\\\\-11.36421\\\\137.0818\\\\307.01\\\\-12.99477\\\\135.4199\\\\307.01\\\\-13.86421\\\\133.7608\\\\307.01\\\\-14.36421\\\\133.5952\\\\307.01\\\\-15.86421\\\\134.0404\\\\307.01\\\\-17.36421\\\\134.2123\\\\307.01\\\\-18.86421\\\\134.0696\\\\307.01\\\\-21.86421\\\\133.1043\\\\307.01\\\\-26.86421\\\\130.7191\\\\307.01\\\\-29.36421\\\\129.78\\\\307.01\\\\-31.36421\\\\129.2402\\\\307.01\\\\-34.36421\\\\128.7263\\\\307.01\\\\-36.86421\\\\128.6261\\\\307.01\\\\-39.86421\\\\128.7971\\\\307.01\\\\-42.36421\\\\129.2701\\\\307.01\\\\-44.36421\\\\129.8393\\\\307.01\\\\-46.86421\\\\130.776\\\\307.01\\\\-48.86421\\\\131.7451\\\\307.01\\\\-51.36421\\\\133.2485\\\\307.01\\\\-52.86421\\\\134.3233\\\\307.01\\\\-54.72322\\\\135.9199\\\\307.01\\\\-56.66919\\\\137.9199\\\\307.01\\\\-57.91208\\\\139.4199\\\\307.01\\\\-58.98921\\\\140.9199\\\\307.01\\\\-59.90558\\\\142.4199\\\\307.01\\\\-60.96825\\\\144.4199\\\\307.01\\\\-62.00807\\\\146.9199\\\\307.01\\\\-62.49783\\\\148.4199\\\\307.01\\\\-62.99993\\\\150.4199\\\\307.01\\\\-63.44202\\\\153.4199\\\\307.01\\\\-63.55772\\\\155.4199\\\\307.01\\\\-63.41841\\\\157.4199\\\\307.01\\\\-63.06064\\\\159.9199\\\\307.01\\\\-62.45292\\\\162.4199\\\\307.01\\\\-61.96073\\\\163.9199\\\\307.01\\\\-60.87757\\\\166.4199\\\\307.01\\\\-59.51585\\\\168.9199\\\\307.01\\\\-58.50807\\\\170.4199\\\\307.01\\\\-56.93054\\\\172.4199\\\\307.01\\\\-55.36421\\\\174.0796\\\\307.01\\\\-53.86421\\\\175.4771\\\\307.01\\\\-51.86421\\\\177.0492\\\\307.01\\\\-49.36421\\\\178.6206\\\\307.01\\\\-47.36421\\\\179.634\\\\307.01\\\\-45.36421\\\\180.4612\\\\307.01\\\\-43.36421\\\\181.1119\\\\307.01\\\\-41.36421\\\\181.5929\\\\307.01\\\\-38.36421\\\\182.0059\\\\307.01\\\\-35.86421\\\\182.0576\\\\307.01\\\\-32.36421\\\\181.6177\\\\307.01\\\\-29.86421\\\\181.0239\\\\307.01\\\\-28.36421\\\\180.5358\\\\307.01\\\\-25.86421\\\\179.4891\\\\307.01\\\\-23.36421\\\\178.2178\\\\307.01\\\\-21.36421\\\\177.3183\\\\307.01\\\\-19.36421\\\\176.722\\\\307.01\\\\-17.86421\\\\176.5826\\\\307.01\\\\-16.36421\\\\176.7435\\\\307.01\\\\-14.86421\\\\177.2485\\\\307.01\\\\-12.86421\\\\178.3477\\\\307.01\\\\-11.86421\\\\179.138\\\\307.01\\\\-10.58232\\\\180.4199\\\\307.01\\\\-9.792064\\\\181.4199\\\\307.01\\\\-8.69282\\\\183.4199\\\\307.01\\\\-8.187816\\\\184.9199\\\\307.01\\\\-8.02691\\\\186.4199\\\\307.01\\\\-8.145048\\\\187.9199\\\\307.01\\\\-8.676711\\\\189.9199\\\\307.01\\\\-9.252931\\\\191.4199\\\\307.01\\\\-9.970693\\\\192.9199\\\\307.01\\\\-10.97549\\\\195.4199\\\\307.01\\\\-11.45025\\\\196.9199\\\\307.01\\\\-12.04224\\\\199.4199\\\\307.01\\\\-12.39888\\\\202.4199\\\\307.01\\\\-12.48248\\\\203.9199\\\\307.01\\\\-12.05772\\\\207.9199\\\\307.01\\\\-11.48475\\\\210.4199\\\\307.01\\\\-10.42456\\\\213.4199\\\\307.01\\\\-9.508066\\\\215.4199\\\\307.01\\\\-8.042242\\\\217.9199\\\\307.01\\\\-6.999926\\\\219.4199\\\\307.01\\\\-4.870026\\\\221.9199\\\\307.01\\\\-2.752931\\\\223.9199\\\\307.01\\\\-1.364211\\\\225.0492\\\\307.01\\\\0.1357885\\\\226.0912\\\\307.01\\\\2.635788\\\\227.5514\\\\307.01\\\\6.135788\\\\229.0449\\\\307.01\\\\7.635788\\\\229.5112\\\\307.01\\\\10.13579\\\\230.0896\\\\307.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851092727900001.507332422180\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"270\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"18\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.13579\\\\230.4862\\\\310.01\\\\18.13579\\\\230.1234\\\\310.01\\\\20.63579\\\\229.5843\\\\310.01\\\\23.63579\\\\228.5826\\\\310.01\\\\25.63579\\\\227.6544\\\\310.01\\\\27.63579\\\\226.5734\\\\310.01\\\\29.13579\\\\225.5843\\\\310.01\\\\30.63579\\\\224.4545\\\\310.01\\\\32.13579\\\\223.1497\\\\310.01\\\\34.73231\\\\220.4199\\\\310.01\\\\36.24707\\\\218.4199\\\\310.01\\\\37.78162\\\\215.9199\\\\310.01\\\\38.76729\\\\213.9199\\\\310.01\\\\39.7245\\\\211.4199\\\\310.01\\\\40.30202\\\\209.4199\\\\310.01\\\\40.84336\\\\206.4199\\\\310.01\\\\40.96271\\\\203.9199\\\\310.01\\\\40.77357\\\\200.4199\\\\310.01\\\\40.27764\\\\197.9199\\\\310.01\\\\39.3293\\\\194.9199\\\\310.01\\\\38.71912\\\\193.4199\\\\310.01\\\\37.00643\\\\189.9199\\\\310.01\\\\36.42688\\\\188.4199\\\\310.01\\\\35.98225\\\\186.9199\\\\310.01\\\\35.83789\\\\184.9199\\\\310.01\\\\35.988\\\\183.4199\\\\310.01\\\\36.26941\\\\182.4199\\\\310.01\\\\36.26491\\\\181.4199\\\\310.01\\\\34.99829\\\\179.9199\\\\310.01\\\\34.38188\\\\178.9199\\\\310.01\\\\33.88579\\\\177.4199\\\\310.01\\\\34.07719\\\\176.4199\\\\310.01\\\\34.63116\\\\175.4199\\\\310.01\\\\35.63579\\\\174.4152\\\\310.01\\\\36.63579\\\\173.8545\\\\310.01\\\\37.63579\\\\173.6662\\\\310.01\\\\39.13579\\\\174.166\\\\310.01\\\\40.13579\\\\174.7764\\\\310.01\\\\41.13579\\\\175.6614\\\\310.01\\\\42.13579\\\\175.9128\\\\310.01\\\\44.13579\\\\175.2927\\\\310.01\\\\45.63579\\\\175.1247\\\\310.01\\\\47.13579\\\\175.2645\\\\310.01\\\\48.63579\\\\175.7045\\\\310.01\\\\54.13579\\\\178.0715\\\\310.01\\\\57.13579\\\\179.0214\\\\310.01\\\\59.63579\\\\179.5239\\\\310.01\\\\63.13579\\\\179.7308\\\\310.01\\\\65.63579\\\\179.6192\\\\310.01\\\\68.63579\\\\179.0896\\\\310.01\\\\70.63579\\\\178.5263\\\\310.01\\\\72.13579\\\\177.9862\\\\310.01\\\\74.13579\\\\177.1148\\\\310.01\\\\76.13579\\\\176.0637\\\\310.01\\\\79.13579\\\\174.0311\\\\310.01\\\\81.0086\\\\172.4199\\\\310.01\\\\82.9529\\\\170.4199\\\\310.01\\\\84.19914\\\\168.9199\\\\310.01\\\\85.26941\\\\167.4199\\\\310.01\\\\86.75175\\\\164.9199\\\\310.01\\\\87.68684\\\\162.9199\\\\310.01\\\\88.77357\\\\159.9199\\\\310.01\\\\89.27562\\\\157.9199\\\\310.01\\\\89.71638\\\\154.9199\\\\310.01\\\\89.82782\\\\152.9199\\\\310.01\\\\89.68684\\\\150.9199\\\\310.01\\\\89.32175\\\\148.4199\\\\310.01\\\\88.83649\\\\146.4199\\\\310.01\\\\88.18999\\\\144.4199\\\\310.01\\\\87.35246\\\\142.4199\\\\310.01\\\\86.33649\\\\140.4199\\\\310.01\\\\84.75857\\\\137.9199\\\\310.01\\\\83.16704\\\\135.9199\\\\310.01\\\\80.63579\\\\133.3393\\\\310.01\\\\79.13579\\\\132.1011\\\\310.01\\\\76.63579\\\\130.3393\\\\310.01\\\\73.63579\\\\128.7339\\\\310.01\\\\71.13579\\\\127.7278\\\\310.01\\\\69.63579\\\\127.2502\\\\310.01\\\\67.63579\\\\126.7701\\\\310.01\\\\64.63579\\\\126.372\\\\310.01\\\\63.13579\\\\126.2701\\\\310.01\\\\61.63579\\\\126.3565\\\\310.01\\\\58.63579\\\\126.7386\\\\310.01\\\\56.13579\\\\127.3393\\\\310.01\\\\54.63579\\\\127.8233\\\\310.01\\\\52.13579\\\\128.8818\\\\310.01\\\\46.13579\\\\132.1365\\\\310.01\\\\45.13579\\\\132.5696\\\\310.01\\\\42.13579\\\\133.3956\\\\310.01\\\\41.55696\\\\133.9199\\\\310.01\\\\40.21622\\\\135.9199\\\\310.01\\\\38.63579\\\\137.4791\\\\310.01\\\\37.13579\\\\138.4632\\\\310.01\\\\35.63579\\\\139.1069\\\\310.01\\\\34.13579\\\\139.3742\\\\310.01\\\\32.13579\\\\139.0896\\\\310.01\\\\30.13579\\\\138.1211\\\\310.01\\\\28.68742\\\\136.9199\\\\310.01\\\\27.43292\\\\135.4199\\\\310.01\\\\26.47601\\\\133.4199\\\\310.01\\\\26.25527\\\\131.4199\\\\310.01\\\\26.50186\\\\129.9199\\\\310.01\\\\27.44195\\\\127.9199\\\\310.01\\\\28.58762\\\\126.4199\\\\310.01\\\\29.65523\\\\125.4199\\\\310.01\\\\31.63579\\\\124.0459\\\\310.01\\\\32.17715\\\\123.4199\\\\310.01\\\\32.98225\\\\120.4199\\\\310.01\\\\34.13579\\\\117.8923\\\\310.01\\\\36.2136\\\\113.9199\\\\310.01\\\\37.24707\\\\111.4199\\\\310.01\\\\37.72183\\\\109.9199\\\\310.01\\\\38.31382\\\\107.4199\\\\310.01\\\\38.67046\\\\104.4199\\\\310.01\\\\38.75405\\\\102.9199\\\\310.01\\\\38.3293\\\\98.91986\\\\310.01\\\\37.75405\\\\96.41986\\\\310.01\\\\36.69613\\\\93.41986\\\\310.01\\\\35.77964\\\\91.41986\\\\310.01\\\\34.31382\\\\88.91986\\\\310.01\\\\33.2715\\\\87.41986\\\\310.01\\\\32.13579\\\\86.02634\\\\310.01\\\\30.13579\\\\83.91791\\\\310.01\\\\27.63579\\\\81.7905\\\\310.01\\\\26.13579\\\\80.74847\\\\310.01\\\\23.63579\\\\79.28835\\\\310.01\\\\20.13579\\\\77.79486\\\\310.01\\\\18.63579\\\\77.32851\\\\310.01\\\\16.13579\\\\76.75017\\\\310.01\\\\12.13579\\\\76.35353\\\\310.01\\\\8.135789\\\\76.71637\\\\310.01\\\\5.635788\\\\77.25362\\\\310.01\\\\2.635788\\\\78.25716\\\\310.01\\\\0.6357885\\\\79.18528\\\\310.01\\\\-1.364211\\\\80.26633\\\\310.01\\\\-2.864212\\\\81.25539\\\\310.01\\\\-4.364212\\\\82.38519\\\\310.01\\\\-5.864212\\\\83.69002\\\\310.01\\\\-8.460731\\\\86.41986\\\\310.01\\\\-9.975492\\\\88.41986\\\\310.01\\\\-11.51005\\\\90.91986\\\\310.01\\\\-12.49571\\\\92.91986\\\\310.01\\\\-13.45292\\\\95.41986\\\\310.01\\\\-14.03044\\\\97.41986\\\\310.01\\\\-14.57178\\\\100.4199\\\\310.01\\\\-14.69113\\\\102.9199\\\\310.01\\\\-14.502\\\\106.4199\\\\310.01\\\\-14.00607\\\\108.9199\\\\310.01\\\\-13.05772\\\\111.9199\\\\310.01\\\\-11.97785\\\\114.4199\\\\310.01\\\\-8.843534\\\\119.9199\\\\310.01\\\\-8.175187\\\\121.4199\\\\310.01\\\\-7.470693\\\\123.9199\\\\310.01\\\\-6.864212\\\\124.6244\\\\310.01\\\\-5.364212\\\\125.3065\\\\310.01\\\\-3.864212\\\\126.3094\\\\310.01\\\\-2.211956\\\\127.9199\\\\310.01\\\\-1.176711\\\\129.4199\\\\310.01\\\\-0.6816457\\\\130.4199\\\\310.01\\\\-0.188405\\\\131.9199\\\\310.01\\\\-0.08336733\\\\132.9199\\\\310.01\\\\-0.247305\\\\134.4199\\\\310.01\\\\-0.8017115\\\\135.9199\\\\310.01\\\\-1.679097\\\\137.4199\\\\310.01\\\\-2.581154\\\\138.4199\\\\310.01\\\\-3.864212\\\\139.5973\\\\310.01\\\\-5.364212\\\\140.4625\\\\310.01\\\\-6.864212\\\\141.0252\\\\310.01\\\\-8.364211\\\\141.2053\\\\310.01\\\\-9.364211\\\\141.101\\\\310.01\\\\-10.86421\\\\140.6143\\\\310.01\\\\-11.86421\\\\140.1195\\\\310.01\\\\-13.36421\\\\139.0945\\\\310.01\\\\-15.00626\\\\137.4199\\\\310.01\\\\-16.86421\\\\134.6526\\\\310.01\\\\-17.36421\\\\134.3886\\\\310.01\\\\-18.86421\\\\134.0912\\\\310.01\\\\-21.86421\\\\133.1043\\\\310.01\\\\-26.86421\\\\130.7191\\\\310.01\\\\-29.36421\\\\129.78\\\\310.01\\\\-31.36421\\\\129.2402\\\\310.01\\\\-34.36421\\\\128.7263\\\\310.01\\\\-36.86421\\\\128.6261\\\\310.01\\\\-39.86421\\\\128.7971\\\\310.01\\\\-42.36421\\\\129.2701\\\\310.01\\\\-44.36421\\\\129.8393\\\\310.01\\\\-46.86421\\\\130.776\\\\310.01\\\\-48.86421\\\\131.7451\\\\310.01\\\\-51.36421\\\\133.2485\\\\310.01\\\\-52.86421\\\\134.3233\\\\310.01\\\\-54.72322\\\\135.9199\\\\310.01\\\\-56.66919\\\\137.9199\\\\310.01\\\\-57.91208\\\\139.4199\\\\310.01\\\\-58.98921\\\\140.9199\\\\310.01\\\\-59.90558\\\\142.4199\\\\310.01\\\\-60.96825\\\\144.4199\\\\310.01\\\\-62.00807\\\\146.9199\\\\310.01\\\\-62.49783\\\\148.4199\\\\310.01\\\\-62.99993\\\\150.4199\\\\310.01\\\\-63.44202\\\\153.4199\\\\310.01\\\\-63.55772\\\\155.4199\\\\310.01\\\\-63.41841\\\\157.4199\\\\310.01\\\\-63.06064\\\\159.9199\\\\310.01\\\\-62.45292\\\\162.4199\\\\310.01\\\\-61.96073\\\\163.9199\\\\310.01\\\\-60.87757\\\\166.4199\\\\310.01\\\\-59.51585\\\\168.9199\\\\310.01\\\\-58.50807\\\\170.4199\\\\310.01\\\\-56.93054\\\\172.4199\\\\310.01\\\\-55.36421\\\\174.0796\\\\310.01\\\\-53.86421\\\\175.4771\\\\310.01\\\\-51.86421\\\\177.0492\\\\310.01\\\\-49.36421\\\\178.6206\\\\310.01\\\\-47.36421\\\\179.634\\\\310.01\\\\-45.36421\\\\180.4612\\\\310.01\\\\-43.36421\\\\181.1119\\\\310.01\\\\-41.36421\\\\181.5929\\\\310.01\\\\-38.36421\\\\182.0059\\\\310.01\\\\-35.86421\\\\182.0576\\\\310.01\\\\-32.36421\\\\181.6177\\\\310.01\\\\-29.86421\\\\181.0239\\\\310.01\\\\-28.36421\\\\180.5358\\\\310.01\\\\-25.86421\\\\179.4891\\\\310.01\\\\-23.36421\\\\178.2178\\\\310.01\\\\-21.36421\\\\177.3183\\\\310.01\\\\-19.36421\\\\176.722\\\\310.01\\\\-17.86421\\\\176.5789\\\\310.01\\\\-15.86421\\\\176.8016\\\\310.01\\\\-14.86421\\\\177.0947\\\\310.01\\\\-13.86421\\\\177.1754\\\\310.01\\\\-13.38972\\\\176.9199\\\\310.01\\\\-12.40512\\\\175.4199\\\\310.01\\\\-10.86421\\\\174.216\\\\310.01\\\\-9.864211\\\\173.802\\\\310.01\\\\-8.864211\\\\173.8091\\\\310.01\\\\-7.864212\\\\174.2572\\\\310.01\\\\-6.864212\\\\175.0914\\\\310.01\\\\-6.193576\\\\175.9199\\\\310.01\\\\-5.746355\\\\176.9199\\\\310.01\\\\-5.739212\\\\177.9199\\\\310.01\\\\-6.144981\\\\178.9199\\\\310.01\\\\-7.364212\\\\180.5032\\\\310.01\\\\-8.680878\\\\181.4199\\\\310.01\\\\-8.937325\\\\181.9199\\\\310.01\\\\-8.250575\\\\184.4199\\\\310.01\\\\-8.025116\\\\186.4199\\\\310.01\\\\-8.145048\\\\187.9199\\\\310.01\\\\-8.676711\\\\189.9199\\\\310.01\\\\-9.252931\\\\191.4199\\\\310.01\\\\-9.970693\\\\192.9199\\\\310.01\\\\-10.97549\\\\195.4199\\\\310.01\\\\-11.45025\\\\196.9199\\\\310.01\\\\-12.04224\\\\199.4199\\\\310.01\\\\-12.39888\\\\202.4199\\\\310.01\\\\-12.48248\\\\203.9199\\\\310.01\\\\-12.05772\\\\207.9199\\\\310.01\\\\-11.48475\\\\210.4199\\\\310.01\\\\-10.42456\\\\213.4199\\\\310.01\\\\-9.508066\\\\215.4199\\\\310.01\\\\-8.042242\\\\217.9199\\\\310.01\\\\-6.999926\\\\219.4199\\\\310.01\\\\-4.870026\\\\221.9199\\\\310.01\\\\-2.752931\\\\223.9199\\\\310.01\\\\-1.364211\\\\225.0492\\\\310.01\\\\0.1357885\\\\226.0912\\\\310.01\\\\2.635788\\\\227.5514\\\\310.01\\\\6.135788\\\\229.0449\\\\310.01\\\\7.635788\\\\229.5112\\\\310.01\\\\10.13579\\\\230.0896\\\\310.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851113729100001.470312254320\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"272\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"19\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"45.13579\\\\174.0365\\\\313.01\\\\49.63579\\\\175.8393\\\\313.01\\\\53.13579\\\\177.5358\\\\313.01\\\\56.13579\\\\178.6134\\\\313.01\\\\57.63579\\\\179.0189\\\\313.01\\\\60.63579\\\\179.5311\\\\313.01\\\\62.13579\\\\179.634\\\\313.01\\\\64.13579\\\\179.6288\\\\313.01\\\\65.63579\\\\179.4949\\\\313.01\\\\68.13579\\\\179.0826\\\\313.01\\\\70.13579\\\\178.5597\\\\313.01\\\\71.63579\\\\178.0576\\\\313.01\\\\74.13579\\\\176.992\\\\313.01\\\\76.63579\\\\175.6117\\\\313.01\\\\77.63579\\\\174.9709\\\\313.01\\\\79.63579\\\\173.4802\\\\313.01\\\\81.13579\\\\172.141\\\\313.01\\\\83.24468\\\\169.9199\\\\313.01\\\\84.78358\\\\167.9199\\\\313.01\\\\86.33118\\\\165.4199\\\\313.01\\\\87.33508\\\\163.4199\\\\313.01\\\\88.32481\\\\160.9199\\\\313.01\\\\88.79119\\\\159.4199\\\\313.01\\\\89.33366\\\\156.9199\\\\313.01\\\\89.63774\\\\153.9199\\\\313.01\\\\89.66704\\\\152.4199\\\\313.01\\\\89.30026\\\\148.9199\\\\313.01\\\\88.71638\\\\146.4199\\\\313.01\\\\88.25405\\\\144.9199\\\\313.01\\\\87.24943\\\\142.4199\\\\313.01\\\\86.76299\\\\141.4199\\\\313.01\\\\85.29488\\\\138.9199\\\\313.01\\\\84.24227\\\\137.4199\\\\313.01\\\\83.13579\\\\136.0748\\\\313.01\\\\81.58791\\\\134.4199\\\\313.01\\\\79.95832\\\\132.9199\\\\313.01\\\\78.63579\\\\131.8477\\\\313.01\\\\77.13579\\\\130.7949\\\\313.01\\\\75.63579\\\\129.9028\\\\313.01\\\\73.63579\\\\128.8657\\\\313.01\\\\71.13579\\\\127.8535\\\\313.01\\\\69.13579\\\\127.2418\\\\313.01\\\\66.63579\\\\126.722\\\\313.01\\\\63.63579\\\\126.4741\\\\313.01\\\\62.63579\\\\126.4677\\\\313.01\\\\59.13579\\\\126.7663\\\\313.01\\\\56.63579\\\\127.3183\\\\313.01\\\\55.13579\\\\127.7721\\\\313.01\\\\52.63579\\\\128.7645\\\\313.01\\\\50.63579\\\\129.776\\\\313.01\\\\48.13579\\\\131.2884\\\\313.01\\\\45.13579\\\\133.2862\\\\313.01\\\\43.81487\\\\134.4199\\\\313.01\\\\42.44948\\\\135.9199\\\\313.01\\\\40.76783\\\\137.9199\\\\313.01\\\\39.63579\\\\138.9596\\\\313.01\\\\38.13579\\\\140.0828\\\\313.01\\\\36.13579\\\\141.1221\\\\313.01\\\\34.63579\\\\141.6103\\\\313.01\\\\33.13579\\\\141.7315\\\\313.01\\\\32.13579\\\\141.6267\\\\313.01\\\\30.63579\\\\141.1365\\\\313.01\\\\28.63579\\\\140.0659\\\\313.01\\\\27.2121\\\\138.9199\\\\313.01\\\\26.13579\\\\137.8833\\\\313.01\\\\24.93796\\\\136.4199\\\\313.01\\\\23.94562\\\\134.4199\\\\313.01\\\\23.68623\\\\132.9199\\\\313.01\\\\23.94523\\\\130.9199\\\\313.01\\\\24.50558\\\\129.4199\\\\313.01\\\\25.96752\\\\126.9199\\\\313.01\\\\27.13579\\\\125.5354\\\\313.01\\\\28.23917\\\\124.4199\\\\313.01\\\\30.50511\\\\122.4199\\\\313.01\\\\32.27399\\\\120.4199\\\\313.01\\\\33.26515\\\\118.9199\\\\313.01\\\\34.76941\\\\116.4199\\\\313.01\\\\35.8293\\\\114.4199\\\\313.01\\\\36.74227\\\\112.4199\\\\313.01\\\\37.74227\\\\109.4199\\\\313.01\\\\38.34469\\\\106.4199\\\\313.01\\\\38.54975\\\\103.4199\\\\313.01\\\\38.35495\\\\99.91986\\\\313.01\\\\37.76941\\\\96.91986\\\\313.01\\\\36.78162\\\\93.91986\\\\313.01\\\\35.36021\\\\90.91986\\\\313.01\\\\33.83302\\\\88.41986\\\\313.01\\\\32.73983\\\\86.91986\\\\313.01\\\\31.13579\\\\85.08799\\\\313.01\\\\29.96766\\\\83.91986\\\\313.01\\\\28.13579\\\\82.3208\\\\313.01\\\\25.13579\\\\80.25896\\\\313.01\\\\22.13579\\\\78.72199\\\\313.01\\\\19.63579\\\\77.75362\\\\313.01\\\\18.13579\\\\77.31338\\\\313.01\\\\15.63579\\\\76.78624\\\\313.01\\\\12.13579\\\\76.54264\\\\313.01\\\\9.135789\\\\76.69946\\\\313.01\\\\6.135788\\\\77.24847\\\\313.01\\\\4.135788\\\\77.83652\\\\313.01\\\\1.635789\\\\78.81096\\\\313.01\\\\0.6357885\\\\79.28624\\\\313.01\\\\-1.864211\\\\80.72861\\\\313.01\\\\-3.364212\\\\81.75896\\\\313.01\\\\-5.864212\\\\83.83652\\\\313.01\\\\-7.433468\\\\85.41986\\\\313.01\\\\-9.477848\\\\87.91986\\\\313.01\\\\-11.07731\\\\90.41986\\\\313.01\\\\-12.56631\\\\93.41986\\\\313.01\\\\-13.49357\\\\95.91986\\\\313.01\\\\-14.02512\\\\97.91986\\\\313.01\\\\-14.45556\\\\100.4199\\\\313.01\\\\-14.60266\\\\102.4199\\\\313.01\\\\-14.50807\\\\105.4199\\\\313.01\\\\-14.00404\\\\108.4199\\\\313.01\\\\-13.45556\\\\110.4199\\\\313.01\\\\-12.93347\\\\111.9199\\\\313.01\\\\-12.06961\\\\113.9199\\\\313.01\\\\-11.03044\\\\115.9199\\\\313.01\\\\-9.447545\\\\118.4199\\\\313.01\\\\-7.028274\\\\121.9199\\\\313.01\\\\-5.864212\\\\123.1258\\\\313.01\\\\-3.364212\\\\124.8657\\\\313.01\\\\-1.605229\\\\126.4199\\\\313.01\\\\-0.2548365\\\\127.9199\\\\313.01\\\\0.7884731\\\\129.4199\\\\313.01\\\\1.803042\\\\131.4199\\\\313.01\\\\2.263741\\\\132.9199\\\\313.01\\\\2.37004\\\\133.9199\\\\313.01\\\\2.269263\\\\134.9199\\\\313.01\\\\1.749628\\\\136.4199\\\\313.01\\\\0.8712052\\\\137.9199\\\\313.01\\\\-0.3263327\\\\139.4199\\\\313.01\\\\-1.364211\\\\140.4421\\\\313.01\\\\-2.864212\\\\141.6427\\\\313.01\\\\-4.364212\\\\142.5469\\\\313.01\\\\-5.864212\\\\143.1195\\\\313.01\\\\-7.364212\\\\143.3308\\\\313.01\\\\-9.364211\\\\143.0816\\\\313.01\\\\-11.86421\\\\142.0038\\\\313.01\\\\-13.86421\\\\140.6465\\\\313.01\\\\-15.36421\\\\139.234\\\\313.01\\\\-16.5498\\\\137.9199\\\\313.01\\\\-17.74925\\\\136.4199\\\\313.01\\\\-18.36421\\\\135.8188\\\\313.01\\\\-19.86421\\\\134.709\\\\313.01\\\\-23.86421\\\\132.3233\\\\313.01\\\\-26.86421\\\\130.8365\\\\313.01\\\\-29.86421\\\\129.7536\\\\313.01\\\\-31.86421\\\\129.2502\\\\313.01\\\\-34.36421\\\\128.8535\\\\313.01\\\\-36.86421\\\\128.6958\\\\313.01\\\\-38.86421\\\\128.7993\\\\313.01\\\\-41.86421\\\\129.278\\\\313.01\\\\-43.86421\\\\129.8016\\\\313.01\\\\-45.36421\\\\130.3039\\\\313.01\\\\-47.86421\\\\131.3785\\\\313.01\\\\-50.36421\\\\132.7435\\\\313.01\\\\-51.86421\\\\133.7382\\\\313.01\\\\-53.36421\\\\134.8785\\\\313.01\\\\-55.58069\\\\136.9199\\\\313.01\\\\-56.96327\\\\138.4199\\\\313.01\\\\-58.502\\\\140.4199\\\\313.01\\\\-60.05171\\\\142.9199\\\\313.01\\\\-61.05772\\\\144.9199\\\\313.01\\\\-62.04862\\\\147.4199\\\\313.01\\\\-62.51394\\\\148.9199\\\\313.01\\\\-63.05919\\\\151.4199\\\\313.01\\\\-63.42757\\\\155.4199\\\\313.01\\\\-63.03729\\\\159.4199\\\\313.01\\\\-62.47549\\\\161.9199\\\\313.01\\\\-61.44202\\\\164.9199\\\\313.01\\\\-60.51775\\\\166.9199\\\\313.01\\\\-59.04568\\\\169.4199\\\\313.01\\\\-57.99572\\\\170.9199\\\\313.01\\\\-56.36421\\\\172.8595\\\\313.01\\\\-55.36421\\\\173.9179\\\\313.01\\\\-53.73056\\\\175.4199\\\\313.01\\\\-52.36421\\\\176.5381\\\\313.01\\\\-50.86421\\\\177.5843\\\\313.01\\\\-48.36421\\\\179.0449\\\\313.01\\\\-47.36421\\\\179.5287\\\\313.01\\\\-44.86421\\\\180.5263\\\\313.01\\\\-42.86421\\\\181.1177\\\\313.01\\\\-40.86421\\\\181.5676\\\\313.01\\\\-37.36421\\\\181.9065\\\\313.01\\\\-36.36421\\\\181.914\\\\313.01\\\\-33.36421\\\\181.6486\\\\313.01\\\\-30.36421\\\\181.0404\\\\313.01\\\\-28.86421\\\\180.5826\\\\313.01\\\\-26.36421\\\\179.5878\\\\313.01\\\\-24.36421\\\\178.5929\\\\313.01\\\\-20.86421\\\\176.7294\\\\313.01\\\\-18.36421\\\\175.6257\\\\313.01\\\\-17.36421\\\\175.0934\\\\313.01\\\\-16.58718\\\\174.4199\\\\313.01\\\\-13.86421\\\\171.7129\\\\313.01\\\\-12.36421\\\\170.7226\\\\313.01\\\\-11.36421\\\\170.2449\\\\313.01\\\\-9.864211\\\\169.8028\\\\313.01\\\\-8.364211\\\\169.7928\\\\313.01\\\\-6.864212\\\\170.2438\\\\313.01\\\\-5.864212\\\\170.7449\\\\313.01\\\\-4.364212\\\\171.9052\\\\313.01\\\\-2.711557\\\\173.9199\\\\313.01\\\\-2.21085\\\\174.9199\\\\313.01\\\\-1.762128\\\\176.4199\\\\313.01\\\\-1.727673\\\\177.9199\\\\313.01\\\\-2.167647\\\\179.4199\\\\313.01\\\\-3.207707\\\\181.4199\\\\313.01\\\\-5.876966\\\\184.4199\\\\313.01\\\\-6.53835\\\\185.4199\\\\313.01\\\\-7.7156\\\\188.4199\\\\313.01\\\\-10.04546\\\\193.4199\\\\313.01\\\\-11.02147\\\\195.9199\\\\313.01\\\\-11.47069\\\\197.4199\\\\313.01\\\\-12.012\\\\199.9199\\\\313.01\\\\-12.28921\\\\203.9199\\\\313.01\\\\-12.08461\\\\206.9199\\\\313.01\\\\-11.49571\\\\209.9199\\\\313.01\\\\-10.51005\\\\212.9199\\\\313.01\\\\-9.600636\\\\214.9199\\\\313.01\\\\-8.53218\\\\216.9199\\\\313.01\\\\-6.468249\\\\219.9199\\\\313.01\\\\-4.864212\\\\221.7517\\\\313.01\\\\-3.695094\\\\222.9199\\\\313.01\\\\-1.864211\\\\224.5189\\\\313.01\\\\1.135789\\\\226.5789\\\\313.01\\\\4.135788\\\\228.1177\\\\313.01\\\\6.635788\\\\229.0843\\\\313.01\\\\8.135789\\\\229.5239\\\\313.01\\\\10.63579\\\\230.0514\\\\313.01\\\\14.13579\\\\230.2971\\\\313.01\\\\17.13579\\\\230.1403\\\\313.01\\\\20.13579\\\\229.5878\\\\313.01\\\\22.13579\\\\229.0004\\\\313.01\\\\24.63579\\\\228.0287\\\\313.01\\\\25.63579\\\\227.5514\\\\313.01\\\\28.13579\\\\226.1111\\\\313.01\\\\29.63579\\\\225.0808\\\\313.01\\\\32.13579\\\\223.0032\\\\313.01\\\\33.70211\\\\221.4199\\\\313.01\\\\35.74942\\\\218.9199\\\\313.01\\\\37.34888\\\\216.4199\\\\313.01\\\\38.83649\\\\213.4199\\\\313.01\\\\39.76298\\\\210.9199\\\\313.01\\\\40.29488\\\\208.9199\\\\313.01\\\\40.7245\\\\206.4199\\\\313.01\\\\40.87313\\\\204.4199\\\\313.01\\\\40.84863\\\\202.4199\\\\313.01\\\\40.70794\\\\200.9199\\\\313.01\\\\40.27562\\\\198.4199\\\\313.01\\\\39.72713\\\\196.4199\\\\313.01\\\\39.20504\\\\194.9199\\\\313.01\\\\38.34256\\\\192.9199\\\\313.01\\\\36.03673\\\\188.4199\\\\313.01\\\\35.18366\\\\186.4199\\\\313.01\\\\34.37849\\\\184.9199\\\\313.01\\\\31.46317\\\\181.4199\\\\313.01\\\\30.60703\\\\179.9199\\\\313.01\\\\29.99819\\\\178.4199\\\\313.01\\\\29.80047\\\\176.9199\\\\313.01\\\\29.96704\\\\175.4199\\\\313.01\\\\30.57026\\\\173.9199\\\\313.01\\\\31.56785\\\\172.4199\\\\313.01\\\\32.63579\\\\171.3258\\\\313.01\\\\34.13579\\\\170.2914\\\\313.01\\\\35.63579\\\\169.7194\\\\313.01\\\\36.63579\\\\169.5831\\\\313.01\\\\38.63579\\\\169.7668\\\\313.01\\\\40.13579\\\\170.3782\\\\313.01\\\\41.63579\\\\171.2379\\\\313.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851133730200001.543478973601\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"277\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"25.13579\\\\125.7391\\\\316.01\\\\29.49653\\\\121.9199\\\\316.01\\\\31.13579\\\\120.2483\\\\316.01\\\\32.28399\\\\118.9199\\\\316.01\\\\33.71638\\\\116.9199\\\\316.01\\\\35.1454\\\\114.4199\\\\316.01\\\\36.28551\\\\111.9199\\\\316.01\\\\37.23983\\\\108.9199\\\\316.01\\\\37.85425\\\\105.4199\\\\316.01\\\\37.94677\\\\102.9199\\\\316.01\\\\37.75405\\\\99.91986\\\\316.01\\\\37.26729\\\\97.41986\\\\316.01\\\\36.3198\\\\94.41986\\\\316.01\\\\35.22183\\\\91.91986\\\\316.01\\\\33.79257\\\\89.41986\\\\316.01\\\\32.75317\\\\87.91986\\\\316.01\\\\31.13579\\\\85.97396\\\\316.01\\\\30.13579\\\\84.91024\\\\316.01\\\\28.50211\\\\83.41986\\\\316.01\\\\27.13579\\\\82.31029\\\\316.01\\\\25.63579\\\\81.27071\\\\316.01\\\\23.13579\\\\79.8506\\\\316.01\\\\20.63579\\\\78.75362\\\\316.01\\\\17.63579\\\\77.8183\\\\316.01\\\\15.13579\\\\77.34204\\\\316.01\\\\12.13579\\\\77.14066\\\\316.01\\\\9.135789\\\\77.29932\\\\316.01\\\\6.635788\\\\77.75716\\\\316.01\\\\4.635788\\\\78.30858\\\\316.01\\\\2.135788\\\\79.25539\\\\316.01\\\\0.1357885\\\\80.2317\\\\316.01\\\\-2.364212\\\\81.76813\\\\316.01\\\\-4.364212\\\\83.29879\\\\316.01\\\\-6.115665\\\\84.91986\\\\316.01\\\\-7.947545\\\\86.91986\\\\316.01\\\\-9.447545\\\\88.91986\\\\316.01\\\\-10.96327\\\\91.41986\\\\316.01\\\\-11.91527\\\\93.41986\\\\316.01\\\\-13.00807\\\\96.41986\\\\316.01\\\\-13.50807\\\\98.41986\\\\316.01\\\\-13.93921\\\\101.4199\\\\316.01\\\\-14.03218\\\\102.9199\\\\316.01\\\\-13.97549\\\\104.4199\\\\316.01\\\\-13.48699\\\\107.9199\\\\316.01\\\\-12.97549\\\\109.9199\\\\316.01\\\\-12.48018\\\\111.4199\\\\316.01\\\\-11.40558\\\\113.9199\\\\316.01\\\\-10.02949\\\\116.4199\\\\316.01\\\\-9.019734\\\\117.9199\\\\316.01\\\\-7.430538\\\\119.9199\\\\316.01\\\\-5.864212\\\\121.586\\\\316.01\\\\-4.864212\\\\122.5021\\\\316.01\\\\-2.864212\\\\124.1116\\\\316.01\\\\-1.364211\\\\125.2054\\\\316.01\\\\1.135789\\\\127.2049\\\\316.01\\\\2.936209\\\\128.9199\\\\316.01\\\\4.82263\\\\130.9199\\\\316.01\\\\6.264465\\\\132.9199\\\\316.01\\\\6.784093\\\\133.9199\\\\316.01\\\\7.031243\\\\134.9199\\\\316.01\\\\6.765253\\\\135.9199\\\\316.01\\\\5.798487\\\\137.4199\\\\316.01\\\\4.889261\\\\138.4199\\\\316.01\\\\2.635788\\\\140.5555\\\\316.01\\\\1.135789\\\\141.7674\\\\316.01\\\\-1.364211\\\\144.0751\\\\316.01\\\\-3.364212\\\\145.6282\\\\316.01\\\\-5.364212\\\\146.6321\\\\316.01\\\\-6.364212\\\\146.802\\\\316.01\\\\-7.864212\\\\146.5771\\\\316.01\\\\-9.864211\\\\145.615\\\\316.01\\\\-11.36421\\\\144.6044\\\\316.01\\\\-13.36421\\\\142.8379\\\\316.01\\\\-15.36421\\\\140.7688\\\\316.01\\\\-17.86421\\\\137.9523\\\\316.01\\\\-18.86421\\\\136.9179\\\\316.01\\\\-21.36421\\\\134.7479\\\\316.01\\\\-24.36421\\\\132.7573\\\\316.01\\\\-26.36421\\\\131.7247\\\\316.01\\\\-28.86421\\\\130.7191\\\\316.01\\\\-30.36421\\\\130.2485\\\\316.01\\\\-32.36421\\\\129.7721\\\\316.01\\\\-35.86421\\\\129.3365\\\\316.01\\\\-37.86421\\\\129.3449\\\\316.01\\\\-41.36421\\\\129.7971\\\\316.01\\\\-43.36421\\\\130.2884\\\\316.01\\\\-46.36421\\\\131.3565\\\\316.01\\\\-48.36421\\\\132.2884\\\\316.01\\\\-50.86421\\\\133.767\\\\316.01\\\\-52.86421\\\\135.2392\\\\316.01\\\\-54.72205\\\\136.9199\\\\316.01\\\\-57.00942\\\\139.4199\\\\316.01\\\\-58.45816\\\\141.4199\\\\316.01\\\\-59.07794\\\\142.4199\\\\316.01\\\\-60.38489\\\\144.9199\\\\316.01\\\\-61.03985\\\\146.4199\\\\316.01\\\\-62.01394\\\\149.4199\\\\316.01\\\\-62.58369\\\\152.4199\\\\316.01\\\\-62.75058\\\\155.4199\\\\316.01\\\\-62.49993\\\\158.9199\\\\316.01\\\\-61.97785\\\\161.4199\\\\316.01\\\\-61.53218\\\\162.9199\\\\316.01\\\\-60.56345\\\\165.4199\\\\316.01\\\\-59.56343\\\\167.4199\\\\316.01\\\\-57.98846\\\\169.9199\\\\316.01\\\\-56.41841\\\\171.9199\\\\316.01\\\\-54.86421\\\\173.5871\\\\316.01\\\\-53.36421\\\\174.9645\\\\316.01\\\\-51.36421\\\\176.5263\\\\316.01\\\\-48.86421\\\\178.0915\\\\316.01\\\\-46.86421\\\\179.087\\\\316.01\\\\-44.36421\\\\180.0535\\\\316.01\\\\-42.36421\\\\180.6162\\\\316.01\\\\-39.36421\\\\181.1487\\\\316.01\\\\-36.86421\\\\181.28\\\\316.01\\\\-33.36421\\\\181.0535\\\\316.01\\\\-30.86421\\\\180.5426\\\\316.01\\\\-29.36421\\\\180.1004\\\\316.01\\\\-26.86421\\\\179.1441\\\\316.01\\\\-24.86421\\\\178.1536\\\\316.01\\\\-22.36421\\\\176.6336\\\\316.01\\\\-20.86421\\\\175.584\\\\316.01\\\\-18.86421\\\\173.9379\\\\316.01\\\\-15.36421\\\\170.4052\\\\316.01\\\\-13.36421\\\\168.7274\\\\316.01\\\\-11.86421\\\\167.7328\\\\316.01\\\\-9.864211\\\\166.7353\\\\316.01\\\\-8.364211\\\\166.2789\\\\316.01\\\\-7.364212\\\\166.2522\\\\316.01\\\\-5.864212\\\\166.7301\\\\316.01\\\\-4.864212\\\\167.2843\\\\316.01\\\\-3.864212\\\\168.1102\\\\316.01\\\\-2.364212\\\\169.5607\\\\316.01\\\\-0.7082709\\\\171.4199\\\\316.01\\\\0.3049062\\\\172.9199\\\\316.01\\\\0.8081186\\\\173.9199\\\\316.01\\\\1.284373\\\\175.4199\\\\316.01\\\\1.291771\\\\176.9199\\\\316.01\\\\0.8586567\\\\178.4199\\\\316.01\\\\0.1957059\\\\179.9199\\\\316.01\\\\-0.6775677\\\\181.4199\\\\316.01\\\\-2.661191\\\\183.9199\\\\316.01\\\\-5.007315\\\\186.4199\\\\316.01\\\\-6.500715\\\\188.4199\\\\316.01\\\\-8.073847\\\\190.9199\\\\316.01\\\\-8.87757\\\\192.4199\\\\316.01\\\\-10.01585\\\\194.9199\\\\316.01\\\\-10.96825\\\\197.9199\\\\316.01\\\\-11.58267\\\\201.4199\\\\316.01\\\\-11.67519\\\\203.9199\\\\316.01\\\\-11.48248\\\\206.9199\\\\316.01\\\\-10.99571\\\\209.4199\\\\316.01\\\\-10.04661\\\\212.4199\\\\316.01\\\\-8.950251\\\\214.9199\\\\316.01\\\\-7.520991\\\\217.4199\\\\316.01\\\\-6.481589\\\\218.9199\\\\316.01\\\\-4.364212\\\\221.414\\\\316.01\\\\-3.354596\\\\222.4199\\\\316.01\\\\-0.8642115\\\\224.5294\\\\316.01\\\\0.6357885\\\\225.569\\\\316.01\\\\3.135788\\\\226.9891\\\\316.01\\\\5.635788\\\\228.0878\\\\316.01\\\\8.635789\\\\229.0214\\\\316.01\\\\11.13579\\\\229.4977\\\\316.01\\\\14.13579\\\\229.6991\\\\316.01\\\\17.13579\\\\229.5404\\\\316.01\\\\19.63579\\\\229.0808\\\\316.01\\\\21.63579\\\\228.5287\\\\316.01\\\\24.13579\\\\227.5826\\\\316.01\\\\26.13579\\\\226.6064\\\\316.01\\\\28.63579\\\\225.0716\\\\316.01\\\\30.63579\\\\223.5409\\\\316.01\\\\32.38724\\\\221.9199\\\\316.01\\\\34.21912\\\\219.9199\\\\316.01\\\\35.71912\\\\217.9199\\\\316.01\\\\37.23231\\\\215.4199\\\\316.01\\\\37.74227\\\\214.4199\\\\316.01\\\\38.78743\\\\211.9199\\\\316.01\\\\39.27964\\\\210.4199\\\\316.01\\\\39.77964\\\\208.4199\\\\316.01\\\\40.21079\\\\205.4199\\\\316.01\\\\40.30376\\\\203.9199\\\\316.01\\\\40.24707\\\\202.4199\\\\316.01\\\\39.75857\\\\198.9199\\\\316.01\\\\39.24707\\\\196.9199\\\\316.01\\\\38.75175\\\\195.4199\\\\316.01\\\\37.67715\\\\192.9199\\\\316.01\\\\36.30844\\\\190.4199\\\\316.01\\\\35.32992\\\\188.9199\\\\316.01\\\\33.83548\\\\186.9199\\\\316.01\\\\30.59809\\\\183.4199\\\\316.01\\\\28.97444\\\\181.4199\\\\316.01\\\\27.49209\\\\178.9199\\\\316.01\\\\26.92882\\\\177.4199\\\\316.01\\\\26.67292\\\\175.9199\\\\316.01\\\\27.0272\\\\173.9199\\\\316.01\\\\27.47647\\\\172.9199\\\\316.01\\\\28.42746\\\\171.4199\\\\316.01\\\\30.0573\\\\169.4199\\\\316.01\\\\31.13579\\\\168.3365\\\\316.01\\\\32.63579\\\\167.1923\\\\316.01\\\\34.63579\\\\166.3017\\\\316.01\\\\36.13579\\\\166.2524\\\\316.01\\\\38.13579\\\\166.8033\\\\316.01\\\\40.13579\\\\167.7816\\\\316.01\\\\41.63579\\\\168.748\\\\316.01\\\\43.63579\\\\170.3422\\\\316.01\\\\46.63579\\\\172.9895\\\\316.01\\\\48.13579\\\\174.0761\\\\316.01\\\\50.63579\\\\175.6084\\\\316.01\\\\52.63579\\\\176.6375\\\\316.01\\\\55.13579\\\\177.647\\\\316.01\\\\56.63579\\\\178.1235\\\\316.01\\\\58.63579\\\\178.6027\\\\316.01\\\\61.13579\\\\178.9332\\\\316.01\\\\63.13579\\\\179.0715\\\\316.01\\\\64.63579\\\\178.9771\\\\316.01\\\\67.63579\\\\178.5617\\\\316.01\\\\69.63579\\\\178.0715\\\\316.01\\\\72.63579\\\\177.0086\\\\316.01\\\\74.63579\\\\176.0676\\\\316.01\\\\77.13579\\\\174.5898\\\\316.01\\\\78.63579\\\\173.5138\\\\316.01\\\\81.01079\\\\171.4199\\\\316.01\\\\82.63579\\\\169.6953\\\\316.01\\\\83.67384\\\\168.4199\\\\316.01\\\\85.35615\\\\165.9199\\\\316.01\\\\86.67046\\\\163.4199\\\\316.01\\\\87.31818\\\\161.9199\\\\316.01\\\\88.28932\\\\158.9199\\\\316.01\\\\88.85658\\\\155.9199\\\\316.01\\\\89.01982\\\\152.9199\\\\316.01\\\\88.76299\\\\149.4199\\\\316.01\\\\88.34512\\\\147.4199\\\\316.01\\\\87.78162\\\\145.4199\\\\316.01\\\\87.23485\\\\143.9199\\\\316.01\\\\85.80917\\\\140.9199\\\\316.01\\\\84.23231\\\\138.4199\\\\316.01\\\\82.65283\\\\136.4199\\\\316.01\\\\81.26814\\\\134.9199\\\\316.01\\\\79.62587\\\\133.4199\\\\316.01\\\\78.13579\\\\132.2224\\\\316.01\\\\75.13579\\\\130.2905\\\\316.01\\\\73.13579\\\\129.2905\\\\316.01\\\\70.63579\\\\128.3183\\\\316.01\\\\68.63579\\\\127.7468\\\\316.01\\\\65.63579\\\\127.2051\\\\316.01\\\\63.13579\\\\127.0843\\\\316.01\\\\59.63579\\\\127.3134\\\\316.01\\\\57.13579\\\\127.8183\\\\316.01\\\\55.63579\\\\128.2519\\\\316.01\\\\53.13579\\\\129.2097\\\\316.01\\\\51.13579\\\\130.2003\\\\316.01\\\\48.63579\\\\131.7489\\\\316.01\\\\47.13579\\\\132.8785\\\\316.01\\\\45.13579\\\\134.6568\\\\316.01\\\\43.91469\\\\135.9199\\\\316.01\\\\42.24456\\\\137.9199\\\\316.01\\\\40.13579\\\\140.2911\\\\316.01\\\\39.13579\\\\141.291\\\\316.01\\\\37.13579\\\\143.0427\\\\316.01\\\\35.63579\\\\144.0175\\\\316.01\\\\34.63579\\\\144.5213\\\\316.01\\\\33.13579\\\\144.9878\\\\316.01\\\\32.13579\\\\145.0095\\\\316.01\\\\30.63579\\\\144.5631\\\\316.01\\\\29.63579\\\\144.0704\\\\316.01\\\\28.13579\\\\143.0939\\\\316.01\\\\25.13579\\\\140.7603\\\\316.01\\\\24.13579\\\\140.097\\\\316.01\\\\22.13579\\\\138.5449\\\\316.01\\\\20.45722\\\\136.9199\\\\316.01\\\\19.40894\\\\135.4199\\\\316.01\\\\19.02304\\\\134.4199\\\\316.01\\\\19.41152\\\\132.9199\\\\316.01\\\\20.52696\\\\130.9199\\\\316.01\\\\22.4984\\\\128.4199\\\\316.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851156731500001.532752123275\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"62\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"21\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-12.89888\\\\102.9199\\\\319.01\\\\-12.55271\\\\106.9199\\\\319.01\\\\-11.97069\\\\109.4199\\\\319.01\\\\-11.4907\\\\110.9199\\\\319.01\\\\-10.43921\\\\113.4199\\\\319.01\\\\-9.063915\\\\115.9199\\\\319.01\\\\-8.047024\\\\117.4199\\\\319.01\\\\-6.419136\\\\119.4199\\\\319.01\\\\-4.864212\\\\121.0275\\\\319.01\\\\-2.364212\\\\123.1128\\\\319.01\\\\-0.8642115\\\\124.1393\\\\319.01\\\\1.635789\\\\125.6274\\\\319.01\\\\6.135788\\\\128.0177\\\\319.01\\\\8.635789\\\\129.0637\\\\319.01\\\\10.63579\\\\129.5962\\\\319.01\\\\12.63579\\\\129.8757\\\\319.01\\\\14.63579\\\\129.5984\\\\319.01\\\\16.13579\\\\129.1345\\\\319.01\\\\18.63579\\\\127.9669\\\\319.01\\\\21.13579\\\\126.5592\\\\319.01\\\\25.13579\\\\123.9956\\\\319.01\\\\27.13579\\\\122.544\\\\319.01\\\\28.96026\\\\120.9199\\\\319.01\\\\30.87045\\\\118.9199\\\\319.01\\\\32.74672\\\\116.4199\\\\319.01\\\\34.18366\\\\113.9199\\\\319.01\\\\35.30482\\\\111.4199\\\\319.01\\\\35.81496\\\\109.9199\\\\319.01\\\\36.33659\\\\107.9199\\\\319.01\\\\36.74227\\\\105.4199\\\\319.01\\\\36.87132\\\\102.9199\\\\319.01\\\\36.75857\\\\100.9199\\\\319.01\\\\36.24469\\\\97.91986\\\\319.01\\\\35.34095\\\\94.91986\\\\319.01\\\\34.72183\\\\93.41986\\\\319.01\\\\33.72296\\\\91.41986\\\\319.01\\\\32.8289\\\\89.91986\\\\319.01\\\\31.77888\\\\88.41986\\\\319.01\\\\30.13579\\\\86.49043\\\\319.01\\\\29.10066\\\\85.41986\\\\319.01\\\\26.63579\\\\83.28575\\\\319.01\\\\25.13579\\\\82.23956\\\\319.01\\\\22.63579\\\\80.81954\\\\319.01\\\\20.13579\\\\79.73236\\\\319.01\\\\18.63579\\\\79.23167\\\\319.01\\\\16.63579\\\\78.72334\\\\319.01\\\\14.13579\\\\78.33926\\\\319.01\\\\12.13579\\\\78.20802\\\\319.01\\\\10.13579\\\\78.30858\\\\319.01\\\\7.135788\\\\78.77843\\\\319.01\\\\5.135788\\\\79.30858\\\\319.01\\\\2.635788\\\\80.22572\\\\319.01\\\\0.6357885\\\\81.20093\\\\319.01\\\\-1.864211\\\\82.73734\\\\319.01\\\\-3.864212\\\\84.28801\\\\319.01\\\\-5.595103\\\\85.91986\\\\319.01\\\\-6.961729\\\\87.41986\\\\319.01\\\\-8.481761\\\\89.41986\\\\319.01\\\\-9.996199\\\\91.91986\\\\319.01\\\\-10.94203\\\\93.91986\\\\319.01\\\\-12.00149\\\\96.91986\\\\319.01\\\\-12.56767\\\\99.41986\\\\319.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851179732800001.515857303411\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"61\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"22\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-7.780878\\\\157.9199\\\\319.01\\\\-7.557069\\\\155.9199\\\\319.01\\\\-7.641239\\\\155.4199\\\\319.01\\\\-8.680249\\\\152.9199\\\\319.01\\\\-10.14019\\\\150.4199\\\\319.01\\\\-11.96758\\\\147.9199\\\\319.01\\\\-14.06594\\\\144.9199\\\\319.01\\\\-15.72495\\\\142.4199\\\\319.01\\\\-17.18427\\\\140.4199\\\\319.01\\\\-19.36421\\\\137.9739\\\\319.01\\\\-21.86421\\\\135.7308\\\\319.01\\\\-24.86421\\\\133.7219\\\\319.01\\\\-26.86421\\\\132.7002\\\\319.01\\\\-29.36421\\\\131.7077\\\\319.01\\\\-30.86421\\\\131.2518\\\\319.01\\\\-33.36421\\\\130.7201\\\\319.01\\\\-36.86421\\\\130.4545\\\\319.01\\\\-40.36421\\\\130.7374\\\\319.01\\\\-42.86421\\\\131.2971\\\\319.01\\\\-44.36421\\\\131.7584\\\\319.01\\\\-46.86421\\\\132.7666\\\\319.01\\\\-48.86421\\\\133.8061\\\\319.01\\\\-50.36421\\\\134.7354\\\\319.01\\\\-52.36421\\\\136.2252\\\\319.01\\\\-54.36421\\\\138.0987\\\\319.01\\\\-55.60049\\\\139.4199\\\\319.01\\\\-57.48921\\\\141.9199\\\\319.01\\\\-58.94202\\\\144.4199\\\\319.01\\\\-60.06339\\\\146.9199\\\\319.01\\\\-60.99572\\\\149.9199\\\\319.01\\\\-61.47311\\\\152.4199\\\\319.01\\\\-61.65237\\\\155.4199\\\\319.01\\\\-61.57079\\\\157.4199\\\\319.01\\\\-61.0741\\\\160.4199\\\\319.01\\\\-60.5406\\\\162.4199\\\\319.01\\\\-59.58504\\\\164.9199\\\\319.01\\\\-58.59007\\\\166.9199\\\\319.01\\\\-57.01646\\\\169.4199\\\\319.01\\\\-55.41872\\\\171.4199\\\\319.01\\\\-53.86421\\\\173.0574\\\\319.01\\\\-52.86421\\\\173.9672\\\\319.01\\\\-50.86421\\\\175.5555\\\\319.01\\\\-48.36421\\\\177.127\\\\319.01\\\\-46.36421\\\\178.1151\\\\319.01\\\\-43.86421\\\\179.0579\\\\319.01\\\\-41.86421\\\\179.606\\\\319.01\\\\-38.86421\\\\180.1074\\\\319.01\\\\-36.86421\\\\180.191\\\\319.01\\\\-34.86421\\\\180.1185\\\\319.01\\\\-31.36421\\\\179.5214\\\\319.01\\\\-28.36421\\\\178.5899\\\\319.01\\\\-25.86421\\\\177.4476\\\\319.01\\\\-24.36421\\\\176.6231\\\\319.01\\\\-22.86421\\\\175.6373\\\\319.01\\\\-21.36421\\\\174.4941\\\\319.01\\\\-19.86421\\\\173.1573\\\\319.01\\\\-17.74542\\\\170.9199\\\\319.01\\\\-15.68287\\\\168.4199\\\\319.01\\\\-14.53537\\\\166.9199\\\\319.01\\\\-11.19653\\\\162.9199\\\\319.01\\\\-9.668378\\\\160.9199\\\\319.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.3.46.670589.33.1.63686699851194733700001.468081152243\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"156\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"23\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"33.13579\\\\158.2413\\\\319.01\\\\35.63579\\\\160.3188\\\\319.01\\\\37.63579\\\\162.1973\\\\319.01\\\\41.63579\\\\166.1942\\\\319.01\\\\45.15037\\\\169.9199\\\\319.01\\\\46.17537\\\\170.9199\\\\319.01\\\\48.13579\\\\172.6269\\\\319.01\\\\50.13579\\\\174.0326\\\\319.01\\\\53.13579\\\\175.6531\\\\319.01\\\\55.13579\\\\176.4862\\\\319.01\\\\57.13579\\\\177.1228\\\\319.01\\\\59.13579\\\\177.5749\\\\319.01\\\\63.13579\\\\177.9218\\\\319.01\\\\66.63579\\\\177.6196\\\\319.01\\\\69.13579\\\\177.067\\\\319.01\\\\72.13579\\\\176.0294\\\\319.01\\\\74.13579\\\\175.1044\\\\319.01\\\\76.63579\\\\173.6219\\\\319.01\\\\78.13579\\\\172.5346\\\\319.01\\\\79.96026\\\\170.9199\\\\319.01\\\\82.30837\\\\168.4199\\\\319.01\\\\83.772\\\\166.4199\\\\319.01\\\\84.67715\\\\164.9199\\\\319.01\\\\85.70212\\\\162.9199\\\\319.01\\\\86.34207\\\\161.4199\\\\319.01\\\\87.27515\\\\158.4199\\\\319.01\\\\87.74707\\\\155.9199\\\\319.01\\\\87.92132\\\\152.9199\\\\319.01\\\\87.83974\\\\150.9199\\\\319.01\\\\87.33659\\\\147.9199\\\\319.01\\\\86.78665\\\\145.9199\\\\319.01\\\\85.83718\\\\143.4199\\\\319.01\\\\84.84293\\\\141.4199\\\\319.01\\\\83.26244\\\\138.9199\\\\319.01\\\\81.65337\\\\136.9199\\\\319.01\\\\80.13579\\\\135.3188\\\\319.01\\\\77.63579\\\\133.1981\\\\319.01\\\\74.63579\\\\131.2557\\\\319.01\\\\72.63579\\\\130.2625\\\\319.01\\\\70.13579\\\\129.3158\\\\319.01\\\\68.13579\\\\128.7592\\\\319.01\\\\65.63579\\\\128.3183\\\\319.01\\\\63.13579\\\\128.1659\\\\319.01\\\\60.63579\\\\128.3016\\\\319.01\\\\58.13579\\\\128.7191\\\\319.01\\\\56.13579\\\\129.2453\\\\319.01\\\\53.63579\\\\130.192\\\\319.01\\\\50.63579\\\\131.7338\\\\319.01\\\\49.13579\\\\132.7196\\\\319.01\\\\47.13579\\\\134.2836\\\\319.01\\\\45.41303\\\\135.9199\\\\319.01\\\\44.05789\\\\137.4199\\\\319.01\\\\42.53205\\\\139.4199\\\\319.01\\\\40.22859\\\\142.9199\\\\319.01\\\\37.76569\\\\146.4199\\\\319.01\\\\34.63579\\\\150.5317\\\\319.01\\\\33.63579\\\\151.6949\\\\319.01\\\\32.63579\\\\152.5969\\\\319.01\\\\32.13579\\\\152.8053\\\\319.01\\\\31.63579\\\\152.5761\\\\319.01\\\\30.63579\\\\151.7115\\\\319.01\\\\29.63579\\\\150.6442\\\\319.01\\\\27.79562\\\\148.4199\\\\319.01\\\\25.45295\\\\145.9199\\\\319.01\\\\24.13579\\\\144.7099\\\\319.01\\\\22.13579\\\\143.3042\\\\319.01\\\\20.13579\\\\142.2827\\\\319.01\\\\17.13579\\\\141.2436\\\\319.01\\\\14.13579\\\\140.6942\\\\319.01\\\\12.13579\\\\140.8091\\\\319.01\\\\10.13579\\\\141.2746\\\\319.01\\\\8.635789\\\\141.7564\\\\319.01\\\\6.635788\\\\142.6667\\\\319.01\\\\4.635788\\\\143.8113\\\\319.01\\\\2.690873\\\\145.4199\\\\319.01\\\\1.635789\\\\146.4907\\\\319.01\\\\0.0003718426\\\\148.4199\\\\319.01\\\\-1.019515\\\\149.9199\\\\319.01\\\\-2.529212\\\\152.4199\\\\319.01\\\\-3.476054\\\\154.4199\\\\319.01\\\\-4.022545\\\\155.9199\\\\319.01\\\\-3.918899\\\\158.4199\\\\319.01\\\\-3.595462\\\\159.4199\\\\319.01\\\\-1.940824\\\\162.9199\\\\319.01\\\\-0.5122378\\\\165.4199\\\\319.01\\\\0.4943411\\\\166.9199\\\\319.01\\\\2.635788\\\\169.3352\\\\319.01\\\\5.151413\\\\171.9199\\\\319.01\\\\6.24749\\\\173.4199\\\\319.01\\\\6.578497\\\\174.4199\\\\319.01\\\\6.298288\\\\175.9199\\\\319.01\\\\5.779171\\\\176.9199\\\\319.01\\\\4.722327\\\\178.4199\\\\319.01\\\\3.883184\\\\179.4199\\\\319.01\\\\1.506402\\\\181.9199\\\\319.01\\\\-2.864212\\\\186.0801\\\\319.01\\\\-5.025976\\\\188.4199\\\\319.01\\\\-6.477698\\\\190.4199\\\\319.01\\\\-7.915268\\\\192.9199\\\\319.01\\\\-9.033246\\\\195.4199\\\\319.01\\\\-9.545151\\\\196.9199\\\\319.01\\\\-10.06501\\\\198.9199\\\\319.01\\\\-10.47069\\\\201.4199\\\\319.01\\\\-10.59974\\\\203.9199\\\\319.01\\\\-10.48699\\\\205.9199\\\\319.01\\\\-9.975492\\\\208.9199\\\\319.01\\\\-9.069374\\\\211.9199\\\\319.01\\\\-8.450251\\\\213.4199\\\\319.01\\\\-7.448093\\\\215.4199\\\\319.01\\\\-6.554331\\\\216.9199\\\\319.01\\\\-5.50494\\\\218.4199\\\\319.01\\\\-3.364212\\\\220.8809\\\\319.01\\\\-2.289615\\\\221.9199\\\\319.01\\\\-0.3642115\\\\223.5549\\\\319.01\\\\1.135789\\\\224.6032\\\\319.01\\\\2.635788\\\\225.492\\\\319.01\\\\4.635788\\\\226.4862\\\\319.01\\\\7.635788\\\\227.608\\\\319.01\\\\9.635789\\\\228.1153\\\\319.01\\\\12.13579\\\\228.5004\\\\319.01\\\\14.13579\\\\228.6302\\\\319.01\\\\16.13579\\\\228.5311\\\\319.01\\\\19.13579\\\\228.0613\\\\319.01\\\\21.13579\\\\227.5287\\\\319.01\\\\23.63579\\\\226.6123\\\\319.01\\\\25.63579\\\\225.6388\\\\319.01\\\\28.13579\\\\224.1024\\\\319.01\\\\30.13579\\\\222.5501\\\\319.01\\\\31.86496\\\\220.9199\\\\319.01\\\\33.23043\\\\219.4199\\\\319.01\\\\34.75003\\\\217.4199\\\\319.01\\\\36.26778\\\\214.9199\\\\319.01\\\\37.2136\\\\212.9199\\\\319.01\\\\38.27096\\\\209.9199\\\\319.01\\\\38.83924\\\\207.4199\\\\319.01\\\\39.17046\\\\203.9199\\\\319.01\\\\38.82429\\\\199.9199\\\\319.01\\\\38.24227\\\\197.4199\\\\319.01\\\\37.76228\\\\195.9199\\\\319.01\\\\36.7136\\\\193.4199\\\\319.01\\\\35.33726\\\\190.9199\\\\319.01\\\\34.32057\\\\189.4199\\\\319.01\\\\32.69406\\\\187.4199\\\\319.01\\\\30.13579\\\\184.8861\\\\319.01\\\\28.13579\\\\183.1373\\\\319.01\\\\26.33371\\\\181.4199\\\\319.01\\\\23.47009\\\\178.4199\\\\319.01\\\\22.04972\\\\176.4199\\\\319.01\\\\21.53857\\\\175.4199\\\\319.01\\\\21.30416\\\\174.4199\\\\319.01\\\\21.59775\\\\173.4199\\\\319.01\\\\22.58987\\\\171.9199\\\\319.01\\\\26.76079\\\\167.4199\\\\319.01\\\\28.76607\\\\164.4199\\\\319.01\\\\30.52865\\\\161.4199\\\\319.01\\\\32.13579\\\\159.0449\\\\319.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n"; -const char* k_rtStruct_json08 = -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"61\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"24\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-22.86421\\\\173.6167\\\\322.01\\\\-20.36421\\\\171.3328\\\\322.01\\\\-18.64568\\\\169.4199\\\\322.01\\\\-17.21133\\\\167.4199\\\\322.01\\\\-15.76229\\\\164.9199\\\\322.01\\\\-14.17866\\\\161.4199\\\\322.01\\\\-13.68593\\\\159.9199\\\\322.01\\\\-13.19968\\\\157.9199\\\\322.01\\\\-13.03158\\\\155.4199\\\\322.01\\\\-13.19686\\\\153.4199\\\\322.01\\\\-13.74929\\\\150.9199\\\\322.01\\\\-14.23635\\\\149.4199\\\\322.01\\\\-15.71317\\\\145.9199\\\\322.01\\\\-16.80026\\\\143.9199\\\\322.01\\\\-17.74579\\\\142.4199\\\\322.01\\\\-19.29129\\\\140.4199\\\\322.01\\\\-20.86421\\\\138.7435\\\\322.01\\\\-21.86421\\\\137.8386\\\\322.01\\\\-23.86421\\\\136.282\\\\322.01\\\\-26.36421\\\\134.764\\\\322.01\\\\-28.36421\\\\133.8425\\\\322.01\\\\-29.86421\\\\133.2735\\\\322.01\\\\-31.86421\\\\132.7164\\\\322.01\\\\-34.36421\\\\132.2486\\\\322.01\\\\-36.86421\\\\132.13\\\\322.01\\\\-39.36421\\\\132.2642\\\\322.01\\\\-41.86421\\\\132.7382\\\\322.01\\\\-43.86421\\\\133.3401\\\\322.01\\\\-46.36421\\\\134.3583\\\\322.01\\\\-48.86421\\\\135.7135\\\\322.01\\\\-50.36421\\\\136.728\\\\322.01\\\\-52.36421\\\\138.4039\\\\322.01\\\\-53.86421\\\\139.9274\\\\322.01\\\\-55.50681\\\\141.9199\\\\322.01\\\\-56.51492\\\\143.4199\\\\322.01\\\\-58.07415\\\\146.4199\\\\322.01\\\\-59.00964\\\\148.9199\\\\322.01\\\\-59.5293\\\\150.9199\\\\322.01\\\\-59.89546\\\\153.4199\\\\322.01\\\\-60.03242\\\\154.9199\\\\322.01\\\\-59.93835\\\\156.9199\\\\322.01\\\\-59.49086\\\\159.9199\\\\322.01\\\\-58.95904\\\\161.9199\\\\322.01\\\\-58.02025\\\\164.4199\\\\322.01\\\\-57.0033\\\\166.4199\\\\322.01\\\\-56.06999\\\\167.9199\\\\322.01\\\\-54.56957\\\\169.9199\\\\322.01\\\\-52.65075\\\\171.9199\\\\322.01\\\\-51.36421\\\\173.1195\\\\322.01\\\\-49.36421\\\\174.6134\\\\322.01\\\\-47.86421\\\\175.5312\\\\322.01\\\\-45.86421\\\\176.5396\\\\322.01\\\\-42.86421\\\\177.6258\\\\322.01\\\\-40.86421\\\\178.1171\\\\322.01\\\\-38.36421\\\\178.4579\\\\322.01\\\\-36.86421\\\\178.5724\\\\322.01\\\\-35.36421\\\\178.4741\\\\322.01\\\\-32.36421\\\\178.0522\\\\322.01\\\\-30.36421\\\\177.5304\\\\322.01\\\\-27.86421\\\\176.6086\\\\322.01\\\\-25.86421\\\\175.6103\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"57\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"25\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"12.13579\\\\79.89561\\\\322.01\\\\8.135789\\\\80.26321\\\\322.01\\\\6.135788\\\\80.73197\\\\322.01\\\\3.135788\\\\81.80273\\\\322.01\\\\1.135789\\\\82.78688\\\\322.01\\\\-0.3642115\\\\83.70047\\\\322.01\\\\-1.864211\\\\84.7538\\\\322.01\\\\-4.364212\\\\87.02203\\\\322.01\\\\-6.084282\\\\88.91986\\\\322.01\\\\-7.526799\\\\90.91986\\\\322.01\\\\-8.904288\\\\93.41986\\\\322.01\\\\-9.95048\\\\95.91986\\\\322.01\\\\-10.55831\\\\97.91986\\\\322.01\\\\-11.04673\\\\100.4199\\\\322.01\\\\-11.16636\\\\102.4199\\\\322.01\\\\-11.03347\\\\105.9199\\\\322.01\\\\-10.53559\\\\108.4199\\\\322.01\\\\-9.545301\\\\111.4199\\\\322.01\\\\-8.064543\\\\114.4199\\\\322.01\\\\-5.994056\\\\117.4199\\\\322.01\\\\-4.364212\\\\119.1962\\\\322.01\\\\-2.364212\\\\121.063\\\\322.01\\\\-0.3642115\\\\122.5134\\\\322.01\\\\1.635789\\\\123.6633\\\\322.01\\\\3.635788\\\\124.6195\\\\322.01\\\\6.135788\\\\125.5152\\\\322.01\\\\8.135789\\\\126.0422\\\\322.01\\\\11.13579\\\\126.4622\\\\322.01\\\\13.13579\\\\126.4859\\\\322.01\\\\16.13579\\\\126.0393\\\\322.01\\\\19.13579\\\\125.1215\\\\322.01\\\\20.63579\\\\124.5159\\\\322.01\\\\22.63579\\\\123.5519\\\\322.01\\\\25.63579\\\\121.6349\\\\322.01\\\\28.13579\\\\119.4801\\\\322.01\\\\29.13579\\\\118.4173\\\\322.01\\\\30.76925\\\\116.4199\\\\322.01\\\\32.34138\\\\113.9199\\\\322.01\\\\33.32649\\\\111.9199\\\\322.01\\\\34.23682\\\\109.4199\\\\322.01\\\\34.83486\\\\106.9199\\\\322.01\\\\35.12617\\\\104.4199\\\\322.01\\\\35.21572\\\\102.9199\\\\322.01\\\\34.76814\\\\98.91986\\\\322.01\\\\34.2723\\\\96.91986\\\\322.01\\\\33.77169\\\\95.41986\\\\322.01\\\\32.64571\\\\92.91986\\\\322.01\\\\31.84079\\\\91.41986\\\\322.01\\\\30.85131\\\\89.91986\\\\322.01\\\\28.81709\\\\87.41986\\\\322.01\\\\27.13579\\\\85.78797\\\\322.01\\\\25.13579\\\\84.21124\\\\322.01\\\\23.63579\\\\83.22486\\\\322.01\\\\21.63579\\\\82.17953\\\\322.01\\\\19.63579\\\\81.30779\\\\322.01\\\\18.13579\\\\80.81271\\\\322.01\\\\15.63579\\\\80.22696\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"30\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"26\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.13579\\\\148.5344\\\\322.01\\\\11.63579\\\\148.8526\\\\322.01\\\\10.13579\\\\149.3299\\\\322.01\\\\9.135789\\\\149.8438\\\\322.01\\\\7.635788\\\\151.0171\\\\322.01\\\\6.442606\\\\152.4199\\\\322.01\\\\5.485788\\\\154.4199\\\\322.01\\\\5.087712\\\\156.4199\\\\322.01\\\\5.087712\\\\158.4199\\\\322.01\\\\5.505788\\\\160.4199\\\\322.01\\\\6.510788\\\\162.4199\\\\322.01\\\\7.333157\\\\163.4199\\\\322.01\\\\8.635789\\\\164.5903\\\\322.01\\\\10.63579\\\\165.6099\\\\322.01\\\\12.13579\\\\165.9872\\\\322.01\\\\13.63579\\\\166.1299\\\\322.01\\\\15.63579\\\\165.9679\\\\322.01\\\\17.13579\\\\165.5553\\\\322.01\\\\19.13579\\\\164.4994\\\\322.01\\\\20.74293\\\\162.9199\\\\322.01\\\\21.68787\\\\161.4199\\\\322.01\\\\22.26579\\\\159.9199\\\\322.01\\\\22.5597\\\\158.4199\\\\322.01\\\\22.58144\\\\156.9199\\\\322.01\\\\22.26579\\\\154.9199\\\\322.01\\\\21.72579\\\\153.4199\\\\322.01\\\\20.79055\\\\151.9199\\\\322.01\\\\19.13579\\\\150.2949\\\\322.01\\\\17.13579\\\\149.2219\\\\322.01\\\\16.13579\\\\148.9099\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"58\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"27\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"14.13579\\\\226.9441\\\\322.01\\\\18.13579\\\\226.5733\\\\322.01\\\\20.13579\\\\226.1058\\\\322.01\\\\23.13579\\\\225.037\\\\322.01\\\\25.13579\\\\224.0554\\\\322.01\\\\26.63579\\\\223.1393\\\\322.01\\\\28.13579\\\\222.0859\\\\322.01\\\\30.02057\\\\220.4199\\\\322.01\\\\32.35234\\\\217.9199\\\\322.01\\\\33.796\\\\215.9199\\\\322.01\\\\35.17205\\\\213.4199\\\\322.01\\\\36.22206\\\\210.9199\\\\322.01\\\\36.82989\\\\208.9199\\\\322.01\\\\37.3183\\\\206.4199\\\\322.01\\\\37.43793\\\\204.4199\\\\322.01\\\\37.30504\\\\200.9199\\\\322.01\\\\36.80717\\\\198.4199\\\\322.01\\\\35.81688\\\\195.4199\\\\322.01\\\\34.33746\\\\192.4199\\\\322.01\\\\33.71524\\\\191.4199\\\\322.01\\\\32.26848\\\\189.4199\\\\322.01\\\\30.63579\\\\187.6435\\\\322.01\\\\28.63579\\\\185.7795\\\\322.01\\\\26.63579\\\\184.2958\\\\322.01\\\\25.13579\\\\183.3219\\\\322.01\\\\21.63579\\\\181.3373\\\\322.01\\\\19.13579\\\\180.2194\\\\322.01\\\\17.63579\\\\179.7097\\\\322.01\\\\16.13579\\\\179.3674\\\\322.01\\\\14.13579\\\\179.1844\\\\322.01\\\\12.63579\\\\179.2658\\\\322.01\\\\10.63579\\\\179.7215\\\\322.01\\\\9.135789\\\\180.2507\\\\322.01\\\\6.135788\\\\181.6909\\\\322.01\\\\2.635788\\\\183.7795\\\\322.01\\\\0.6357885\\\\185.1998\\\\322.01\\\\-1.864211\\\\187.3557\\\\322.01\\\\-2.866484\\\\188.4199\\\\322.01\\\\-4.500405\\\\190.4199\\\\322.01\\\\-6.073093\\\\192.9199\\\\322.01\\\\-7.054916\\\\194.9199\\\\322.01\\\\-7.965239\\\\197.4199\\\\322.01\\\\-8.563286\\\\199.9199\\\\322.01\\\\-8.854596\\\\202.4199\\\\322.01\\\\-8.944143\\\\203.9199\\\\322.01\\\\-8.496565\\\\207.9199\\\\322.01\\\\-8.000725\\\\209.9199\\\\322.01\\\\-7.083763\\\\212.4199\\\\322.01\\\\-5.565878\\\\215.4199\\\\322.01\\\\-4.578253\\\\216.9199\\\\322.01\\\\-2.545509\\\\219.4199\\\\322.01\\\\-0.8642115\\\\221.0499\\\\322.01\\\\1.135789\\\\222.6285\\\\322.01\\\\2.635788\\\\223.6162\\\\322.01\\\\4.635788\\\\224.66\\\\322.01\\\\6.635788\\\\225.5312\\\\322.01\\\\8.135789\\\\226.0243\\\\322.01\\\\10.63579\\\\226.6116\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"59\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"28\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"49.13579\\\\134.7441\\\\322.01\\\\46.63579\\\\137.0307\\\\322.01\\\\44.92775\\\\138.9199\\\\322.01\\\\43.50623\\\\140.9199\\\\322.01\\\\42.38579\\\\142.9199\\\\322.01\\\\40.97799\\\\145.9199\\\\322.01\\\\39.93071\\\\148.9199\\\\322.01\\\\39.43028\\\\150.9199\\\\322.01\\\\39.09673\\\\153.4199\\\\322.01\\\\39.41588\\\\156.4199\\\\322.01\\\\39.95945\\\\158.4199\\\\322.01\\\\40.52195\\\\159.9199\\\\322.01\\\\41.48458\\\\161.9199\\\\322.01\\\\42.9492\\\\164.4199\\\\322.01\\\\43.96608\\\\165.9199\\\\322.01\\\\45.53619\\\\167.9199\\\\322.01\\\\46.44071\\\\168.9199\\\\322.01\\\\48.13579\\\\170.5235\\\\322.01\\\\50.13579\\\\172.0799\\\\322.01\\\\51.63579\\\\173.0376\\\\322.01\\\\53.63579\\\\174.1012\\\\322.01\\\\56.13579\\\\175.1018\\\\322.01\\\\57.63579\\\\175.5449\\\\322.01\\\\60.13579\\\\176.0546\\\\322.01\\\\63.13579\\\\176.222\\\\322.01\\\\65.63579\\\\176.0973\\\\322.01\\\\68.13579\\\\175.614\\\\322.01\\\\70.13579\\\\175.0277\\\\322.01\\\\72.63579\\\\174.0123\\\\322.01\\\\75.13579\\\\172.6378\\\\322.01\\\\76.63579\\\\171.6285\\\\322.01\\\\78.63579\\\\169.9578\\\\322.01\\\\80.14716\\\\168.4199\\\\322.01\\\\81.7909\\\\166.4199\\\\322.01\\\\82.79488\\\\164.9199\\\\322.01\\\\84.34893\\\\161.9199\\\\322.01\\\\85.28902\\\\159.4199\\\\322.01\\\\85.8061\\\\157.4199\\\\322.01\\\\86.23142\\\\154.4199\\\\322.01\\\\86.31414\\\\152.9199\\\\322.01\\\\86.13579\\\\150.9318\\\\322.01\\\\85.74485\\\\148.4199\\\\322.01\\\\85.19829\\\\146.4199\\\\322.01\\\\84.26165\\\\143.9199\\\\322.01\\\\83.2471\\\\141.9199\\\\322.01\\\\82.32372\\\\140.4199\\\\322.01\\\\80.81777\\\\138.4199\\\\322.01\\\\78.13579\\\\135.695\\\\322.01\\\\75.63579\\\\133.7706\\\\322.01\\\\74.13579\\\\132.8641\\\\322.01\\\\72.13579\\\\131.8482\\\\322.01\\\\69.13579\\\\130.7308\\\\322.01\\\\67.13579\\\\130.2393\\\\322.01\\\\63.13579\\\\129.7981\\\\322.01\\\\61.63579\\\\129.9028\\\\322.01\\\\58.63579\\\\130.3108\\\\322.01\\\\56.63579\\\\130.8307\\\\322.01\\\\54.13579\\\\131.7483\\\\322.01\\\\52.13579\\\\132.7481\\\\322.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"55\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"29\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-36.86421\\\\134.5039\\\\325.01\\\\-40.36421\\\\134.8251\\\\325.01\\\\-42.36421\\\\135.3162\\\\325.01\\\\-44.86421\\\\136.2328\\\\325.01\\\\-46.86421\\\\137.2308\\\\325.01\\\\-47.86421\\\\137.8358\\\\325.01\\\\-49.86421\\\\139.2767\\\\325.01\\\\-50.86421\\\\140.1812\\\\325.01\\\\-52.55669\\\\141.9199\\\\325.01\\\\-54.06213\\\\143.9199\\\\325.01\\\\-54.98921\\\\145.4199\\\\325.01\\\\-55.96295\\\\147.4199\\\\325.01\\\\-56.98823\\\\150.4199\\\\325.01\\\\-57.53526\\\\153.4199\\\\325.01\\\\-57.62727\\\\155.4199\\\\325.01\\\\-57.52279\\\\157.4199\\\\325.01\\\\-57.06078\\\\159.9199\\\\325.01\\\\-56.49021\\\\161.9199\\\\325.01\\\\-55.41194\\\\164.4199\\\\325.01\\\\-54.57702\\\\165.9199\\\\325.01\\\\-53.57396\\\\167.4199\\\\325.01\\\\-51.89916\\\\169.4199\\\\325.01\\\\-50.86421\\\\170.4544\\\\325.01\\\\-48.86421\\\\172.1211\\\\325.01\\\\-47.36421\\\\173.1227\\\\325.01\\\\-45.86421\\\\173.9317\\\\325.01\\\\-43.36421\\\\175.006\\\\325.01\\\\-41.36421\\\\175.596\\\\325.01\\\\-38.86421\\\\176.0515\\\\325.01\\\\-36.86421\\\\176.1623\\\\325.01\\\\-34.86421\\\\176.0684\\\\325.01\\\\-32.36421\\\\175.6225\\\\325.01\\\\-30.36421\\\\175.073\\\\325.01\\\\-27.86421\\\\174.0279\\\\325.01\\\\-25.36421\\\\172.5758\\\\325.01\\\\-23.36421\\\\171.0328\\\\325.01\\\\-21.68302\\\\169.4199\\\\325.01\\\\-19.67303\\\\166.9199\\\\325.01\\\\-18.72346\\\\165.4199\\\\325.01\\\\-17.71021\\\\163.4199\\\\325.01\\\\-16.66229\\\\160.4199\\\\325.01\\\\-16.19818\\\\158.4199\\\\325.01\\\\-15.96381\\\\155.4199\\\\325.01\\\\-16.25821\\\\151.9199\\\\325.01\\\\-16.73232\\\\149.9199\\\\325.01\\\\-17.64964\\\\147.4199\\\\325.01\\\\-19.19963\\\\144.4199\\\\325.01\\\\-20.24376\\\\142.9199\\\\325.01\\\\-21.86421\\\\141.089\\\\325.01\\\\-24.36421\\\\138.787\\\\325.01\\\\-25.86421\\\\137.7401\\\\325.01\\\\-27.36421\\\\136.9034\\\\325.01\\\\-29.86421\\\\135.7551\\\\325.01\\\\-31.36421\\\\135.2615\\\\325.01\\\\-33.36421\\\\134.7939\\\\325.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"55\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"30\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10.13579\\\\183.3021\\\\325.01\\\\7.135788\\\\184.2407\\\\325.01\\\\5.135788\\\\185.1719\\\\325.01\\\\3.135788\\\\186.2872\\\\325.01\\\\1.135789\\\\187.7495\\\\325.01\\\\-1.559387\\\\190.4199\\\\325.01\\\\-3.057961\\\\192.4199\\\\325.01\\\\-4.487128\\\\194.9199\\\\325.01\\\\-5.510696\\\\197.4199\\\\325.01\\\\-6.051712\\\\199.4199\\\\325.01\\\\-6.519062\\\\202.4199\\\\325.01\\\\-6.565339\\\\203.9199\\\\325.01\\\\-6.408329\\\\205.9199\\\\325.01\\\\-5.967034\\\\208.4199\\\\325.01\\\\-4.985113\\\\211.4199\\\\325.01\\\\-4.035583\\\\213.4199\\\\325.01\\\\-3.447545\\\\214.4199\\\\325.01\\\\-2.060332\\\\216.4199\\\\325.01\\\\-0.8642115\\\\217.754\\\\325.01\\\\1.635789\\\\220.1117\\\\325.01\\\\3.635788\\\\221.491\\\\325.01\\\\4.635788\\\\222.0804\\\\325.01\\\\6.635788\\\\223.0186\\\\325.01\\\\8.135789\\\\223.5795\\\\325.01\\\\10.13579\\\\224.1074\\\\325.01\\\\12.63579\\\\224.4875\\\\325.01\\\\14.13579\\\\224.5909\\\\325.01\\\\16.13579\\\\224.4519\\\\325.01\\\\18.63579\\\\224.0641\\\\325.01\\\\20.63579\\\\223.4818\\\\325.01\\\\23.13579\\\\222.4497\\\\325.01\\\\25.63579\\\\221.0292\\\\325.01\\\\27.63579\\\\219.5015\\\\325.01\\\\29.76198\\\\217.4199\\\\325.01\\\\31.33117\\\\215.4199\\\\325.01\\\\32.29767\\\\213.9199\\\\325.01\\\\33.31492\\\\211.9199\\\\325.01\\\\34.25379\\\\209.4199\\\\325.01\\\\34.83692\\\\206.9199\\\\325.01\\\\35.10346\\\\203.9199\\\\325.01\\\\34.88203\\\\200.9199\\\\325.01\\\\34.73055\\\\199.9199\\\\325.01\\\\34.20932\\\\197.9199\\\\325.01\\\\33.27197\\\\195.4199\\\\325.01\\\\32.22284\\\\193.4199\\\\325.01\\\\31.25856\\\\191.9199\\\\325.01\\\\29.63579\\\\189.9463\\\\325.01\\\\28.11496\\\\188.4199\\\\325.01\\\\26.13579\\\\186.7882\\\\325.01\\\\23.63579\\\\185.2499\\\\325.01\\\\21.63579\\\\184.3438\\\\325.01\\\\20.13579\\\\183.7888\\\\325.01\\\\18.13579\\\\183.2512\\\\325.01\\\\15.13579\\\\182.8438\\\\325.01\\\\13.13579\\\\182.8685\\\\325.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"54\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"31\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"12.13579\\\\123.9516\\\\325.01\\\\15.63579\\\\123.596\\\\325.01\\\\17.63579\\\\123.0987\\\\325.01\\\\19.13579\\\\122.5923\\\\325.01\\\\21.13579\\\\121.6678\\\\325.01\\\\23.13579\\\\120.5568\\\\325.01\\\\25.13579\\\\119.0902\\\\325.01\\\\26.89038\\\\117.4199\\\\325.01\\\\28.2372\\\\115.9199\\\\325.01\\\\29.32537\\\\114.4199\\\\325.01\\\\30.75554\\\\111.9199\\\\325.01\\\\31.77949\\\\109.4199\\\\325.01\\\\32.32329\\\\107.4199\\\\325.01\\\\32.79064\\\\104.4199\\\\325.01\\\\32.83692\\\\102.9199\\\\325.01\\\\32.6799\\\\100.9199\\\\325.01\\\\32.23861\\\\98.41986\\\\325.01\\\\31.25669\\\\95.41986\\\\325.01\\\\30.30979\\\\93.41986\\\\325.01\\\\29.72363\\\\92.41986\\\\325.01\\\\28.33361\\\\90.41986\\\\325.01\\\\25.96829\\\\87.91986\\\\325.01\\\\24.63579\\\\86.72805\\\\325.01\\\\21.63579\\\\84.76335\\\\325.01\\\\19.63579\\\\83.82532\\\\325.01\\\\18.13579\\\\83.26024\\\\325.01\\\\16.13579\\\\82.73236\\\\325.01\\\\13.63579\\\\82.35223\\\\325.01\\\\11.13579\\\\82.27512\\\\325.01\\\\7.635788\\\\82.77291\\\\325.01\\\\5.635788\\\\83.35789\\\\325.01\\\\3.135788\\\\84.39439\\\\325.01\\\\0.6357885\\\\85.814\\\\325.01\\\\-1.364211\\\\87.34236\\\\325.01\\\\-3.033193\\\\88.91986\\\\325.01\\\\-5.063791\\\\91.41986\\\\325.01\\\\-6.030195\\\\92.91986\\\\325.01\\\\-7.047282\\\\94.91986\\\\325.01\\\\-7.982212\\\\97.41986\\\\325.01\\\\-8.565339\\\\99.91986\\\\325.01\\\\-8.831883\\\\102.9199\\\\325.01\\\\-8.610452\\\\105.9199\\\\325.01\\\\-8.458969\\\\106.9199\\\\325.01\\\\-7.937741\\\\108.9199\\\\325.01\\\\-6.997408\\\\111.4199\\\\325.01\\\\-5.947545\\\\113.4199\\\\325.01\\\\-4.983581\\\\114.9199\\\\325.01\\\\-3.364212\\\\116.8934\\\\325.01\\\\-1.843378\\\\118.4199\\\\325.01\\\\0.1357885\\\\120.0548\\\\325.01\\\\1.635789\\\\121.0273\\\\325.01\\\\3.635788\\\\122.0806\\\\325.01\\\\6.135788\\\\123.0276\\\\325.01\\\\8.135789\\\\123.5526\\\\325.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"54\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"32\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"63.13579\\\\173.8627\\\\325.01\\\\66.63579\\\\173.5429\\\\325.01\\\\68.63579\\\\173.0517\\\\325.01\\\\71.13579\\\\172.1226\\\\325.01\\\\74.13579\\\\170.5327\\\\325.01\\\\76.13579\\\\169.0828\\\\325.01\\\\77.39513\\\\167.9199\\\\325.01\\\\79.25494\\\\165.9199\\\\325.01\\\\80.34204\\\\164.4199\\\\325.01\\\\81.26814\\\\162.9199\\\\325.01\\\\82.24203\\\\160.9199\\\\325.01\\\\83.26665\\\\157.9199\\\\325.01\\\\83.75102\\\\155.4199\\\\325.01\\\\83.89706\\\\152.9199\\\\325.01\\\\83.7918\\\\150.9199\\\\325.01\\\\83.32329\\\\148.4199\\\\325.01\\\\82.73289\\\\146.4199\\\\325.01\\\\81.65215\\\\143.9199\\\\325.01\\\\80.83456\\\\142.4199\\\\325.01\\\\79.83023\\\\140.9199\\\\325.01\\\\78.13579\\\\138.9287\\\\325.01\\\\77.1152\\\\137.9199\\\\325.01\\\\75.13579\\\\136.2468\\\\325.01\\\\73.63579\\\\135.2457\\\\325.01\\\\70.63579\\\\133.7382\\\\325.01\\\\67.63579\\\\132.7589\\\\325.01\\\\64.63579\\\\132.2613\\\\325.01\\\\63.13579\\\\132.1962\\\\325.01\\\\61.13579\\\\132.3016\\\\325.01\\\\58.63579\\\\132.7324\\\\325.01\\\\56.63579\\\\133.2899\\\\325.01\\\\54.13579\\\\134.3387\\\\325.01\\\\51.63579\\\\135.7905\\\\325.01\\\\49.63579\\\\137.3374\\\\325.01\\\\47.52657\\\\139.4199\\\\325.01\\\\45.95454\\\\141.4199\\\\325.01\\\\45.00655\\\\142.9199\\\\325.01\\\\43.99264\\\\144.9199\\\\325.01\\\\42.93922\\\\147.9199\\\\325.01\\\\42.47358\\\\149.9199\\\\325.01\\\\42.22876\\\\152.9199\\\\325.01\\\\42.5039\\\\156.4199\\\\325.01\\\\42.97881\\\\158.4199\\\\325.01\\\\43.47368\\\\159.9199\\\\325.01\\\\44.61928\\\\162.4199\\\\325.01\\\\45.45341\\\\163.9199\\\\325.01\\\\46.4907\\\\165.4199\\\\325.01\\\\48.77973\\\\167.9199\\\\325.01\\\\50.63579\\\\169.5769\\\\325.01\\\\52.13579\\\\170.6161\\\\325.01\\\\53.63579\\\\171.4762\\\\325.01\\\\56.13579\\\\172.604\\\\325.01\\\\57.63579\\\\173.1012\\\\325.01\\\\59.63579\\\\173.5834\\\\325.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"44\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"33\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-36.86421\\\\137.8837\\\\328.01\\\\-40.36421\\\\138.2949\\\\328.01\\\\-43.36421\\\\139.2683\\\\328.01\\\\-45.36421\\\\140.256\\\\328.01\\\\-46.86421\\\\141.2251\\\\328.01\\\\-49.36421\\\\143.4318\\\\328.01\\\\-51.02226\\\\145.4199\\\\328.01\\\\-52.4865\\\\147.9199\\\\328.01\\\\-53.44845\\\\150.4199\\\\328.01\\\\-54.01472\\\\152.9199\\\\328.01\\\\-54.17799\\\\155.4199\\\\328.01\\\\-53.99431\\\\157.9199\\\\328.01\\\\-53.53869\\\\159.9199\\\\328.01\\\\-53.04579\\\\161.4199\\\\328.01\\\\-51.54679\\\\164.4199\\\\328.01\\\\-50.51004\\\\165.9199\\\\328.01\\\\-48.86421\\\\167.6923\\\\328.01\\\\-47.36421\\\\169.0581\\\\328.01\\\\-45.86421\\\\170.0912\\\\328.01\\\\-42.86421\\\\171.5804\\\\328.01\\\\-41.36421\\\\172.0771\\\\328.01\\\\-39.36421\\\\172.5214\\\\328.01\\\\-36.86421\\\\172.7081\\\\328.01\\\\-34.36421\\\\172.5449\\\\328.01\\\\-32.36421\\\\172.1048\\\\328.01\\\\-30.86421\\\\171.6225\\\\328.01\\\\-29.36421\\\\170.9925\\\\328.01\\\\-26.86421\\\\169.5144\\\\328.01\\\\-24.36421\\\\167.2983\\\\328.01\\\\-22.72177\\\\165.4199\\\\328.01\\\\-21.74773\\\\163.9199\\\\328.01\\\\-20.7528\\\\161.9199\\\\328.01\\\\-20.20369\\\\160.4199\\\\328.01\\\\-19.68638\\\\158.4199\\\\328.01\\\\-19.35579\\\\155.4199\\\\328.01\\\\-19.73277\\\\151.9199\\\\328.01\\\\-20.68263\\\\148.9199\\\\328.01\\\\-22.23921\\\\145.9199\\\\328.01\\\\-23.76356\\\\143.9199\\\\328.01\\\\-25.36421\\\\142.3077\\\\328.01\\\\-27.36421\\\\140.775\\\\328.01\\\\-29.36421\\\\139.6808\\\\328.01\\\\-31.36421\\\\138.8302\\\\328.01\\\\-33.36421\\\\138.2729\\\\328.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"48\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"34\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"19.13579\\\\87.28422\\\\328.01\\\\16.13579\\\\86.24017\\\\328.01\\\\13.63579\\\\85.78097\\\\328.01\\\\12.13579\\\\85.70812\\\\328.01\\\\10.13579\\\\85.80904\\\\328.01\\\\7.635788\\\\86.28326\\\\328.01\\\\6.135788\\\\86.7646\\\\328.01\\\\3.135788\\\\88.22263\\\\328.01\\\\1.635789\\\\89.22868\\\\328.01\\\\0.2878155\\\\90.41986\\\\328.01\\\\-2.01651\\\\92.91986\\\\328.01\\\\-3.005878\\\\94.41986\\\\328.01\\\\-4.015807\\\\96.41986\\\\328.01\\\\-5.004518\\\\99.41986\\\\328.01\\\\-5.367085\\\\101.9199\\\\328.01\\\\-5.40542\\\\103.9199\\\\328.01\\\\-4.976191\\\\106.9199\\\\328.01\\\\-4.533483\\\\108.4199\\\\328.01\\\\-3.493332\\\\110.9199\\\\328.01\\\\-2.909943\\\\111.9199\\\\328.01\\\\-1.527902\\\\113.9199\\\\328.01\\\\-0.3642115\\\\115.1828\\\\328.01\\\\1.135789\\\\116.5895\\\\328.01\\\\3.135788\\\\117.9891\\\\328.01\\\\5.135788\\\\119.0462\\\\328.01\\\\8.135789\\\\120.0565\\\\328.01\\\\10.63579\\\\120.4504\\\\328.01\\\\13.13579\\\\120.4817\\\\328.01\\\\15.63579\\\\120.0977\\\\328.01\\\\17.63579\\\\119.5301\\\\328.01\\\\20.63579\\\\118.1171\\\\328.01\\\\22.13579\\\\117.1346\\\\328.01\\\\23.61563\\\\115.9199\\\\328.01\\\\24.63579\\\\114.9158\\\\328.01\\\\26.28404\\\\112.9199\\\\328.01\\\\27.71817\\\\110.4199\\\\328.01\\\\28.33316\\\\108.9199\\\\328.01\\\\28.81362\\\\107.4199\\\\328.01\\\\29.22263\\\\105.4199\\\\328.01\\\\29.37814\\\\102.9199\\\\328.01\\\\29.24661\\\\100.9199\\\\328.01\\\\28.70996\\\\98.41986\\\\328.01\\\\28.19545\\\\96.91986\\\\328.01\\\\27.28689\\\\94.91986\\\\328.01\\\\26.34556\\\\93.41986\\\\328.01\\\\25.22345\\\\91.91986\\\\328.01\\\\23.63579\\\\90.26862\\\\328.01\\\\21.63579\\\\88.71584\\\\328.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"47\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"35\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"31.24777\\\\199.9199\\\\328.01\\\\30.23194\\\\196.9199\\\\328.01\\\\29.18762\\\\194.9199\\\\328.01\\\\27.80543\\\\192.9199\\\\328.01\\\\25.8825\\\\190.9199\\\\328.01\\\\25.13579\\\\190.2482\\\\328.01\\\\23.13579\\\\188.8506\\\\328.01\\\\21.13579\\\\187.7935\\\\328.01\\\\18.13579\\\\186.7796\\\\328.01\\\\15.63579\\\\186.3893\\\\328.01\\\\13.13579\\\\186.358\\\\328.01\\\\10.63579\\\\186.7369\\\\328.01\\\\8.635789\\\\187.3055\\\\328.01\\\\5.635788\\\\188.7204\\\\328.01\\\\4.135788\\\\189.7018\\\\328.01\\\\2.65595\\\\190.9199\\\\328.01\\\\1.632165\\\\191.9199\\\\328.01\\\\-0.01651034\\\\193.9199\\\\328.01\\\\-1.45228\\\\196.4199\\\\328.01\\\\-2.066843\\\\197.9199\\\\328.01\\\\-2.542047\\\\199.4199\\\\328.01\\\\-2.951977\\\\201.4199\\\\328.01\\\\-3.091252\\\\204.4199\\\\328.01\\\\-2.975036\\\\205.9199\\\\328.01\\\\-2.438387\\\\208.4199\\\\328.01\\\\-1.923871\\\\209.9199\\\\328.01\\\\-1.013668\\\\211.9199\\\\328.01\\\\-0.07398161\\\\213.4199\\\\328.01\\\\1.482664\\\\215.4199\\\\328.01\\\\2.635788\\\\216.573\\\\328.01\\\\4.635788\\\\218.1181\\\\328.01\\\\7.135788\\\\219.5555\\\\328.01\\\\10.13579\\\\220.5977\\\\328.01\\\\12.63579\\\\221.0551\\\\328.01\\\\14.13579\\\\221.1316\\\\328.01\\\\16.13579\\\\221.0307\\\\328.01\\\\18.63579\\\\220.5513\\\\328.01\\\\20.13579\\\\220.0735\\\\328.01\\\\23.13579\\\\218.6193\\\\328.01\\\\24.63579\\\\217.6051\\\\328.01\\\\26.63579\\\\215.7863\\\\328.01\\\\28.28404\\\\213.9199\\\\328.01\\\\29.27745\\\\212.4199\\\\328.01\\\\30.28206\\\\210.4199\\\\328.01\\\\31.27239\\\\207.4199\\\\328.01\\\\31.63863\\\\204.9199\\\\328.01\\\\31.677\\\\202.9199\\\\328.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"47\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"36\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"45.63295\\\\152.9199\\\\328.01\\\\45.99919\\\\156.4199\\\\328.01\\\\46.56079\\\\158.4199\\\\328.01\\\\46.94164\\\\159.4199\\\\328.01\\\\48.4909\\\\162.4199\\\\328.01\\\\50.01237\\\\164.4199\\\\328.01\\\\51.63579\\\\166.0496\\\\328.01\\\\53.63579\\\\167.5761\\\\328.01\\\\55.13579\\\\168.4353\\\\328.01\\\\57.63579\\\\169.5475\\\\328.01\\\\59.63579\\\\170.0908\\\\328.01\\\\62.13579\\\\170.4227\\\\328.01\\\\64.13579\\\\170.4052\\\\328.01\\\\66.63579\\\\170.0602\\\\328.01\\\\69.63579\\\\169.0909\\\\328.01\\\\71.63579\\\\168.1004\\\\328.01\\\\73.13579\\\\167.1263\\\\328.01\\\\75.13579\\\\165.4452\\\\328.01\\\\77.29958\\\\162.9199\\\\328.01\\\\78.76894\\\\160.4199\\\\328.01\\\\79.72987\\\\157.9199\\\\328.01\\\\80.2863\\\\155.4199\\\\328.01\\\\80.43733\\\\153.4199\\\\328.01\\\\80.26079\\\\150.4199\\\\328.01\\\\79.80331\\\\148.4199\\\\328.01\\\\79.30334\\\\146.9199\\\\328.01\\\\77.80714\\\\143.9199\\\\328.01\\\\76.75469\\\\142.4199\\\\328.01\\\\75.63579\\\\141.1699\\\\328.01\\\\73.63579\\\\139.3292\\\\328.01\\\\72.13579\\\\138.2726\\\\328.01\\\\69.13579\\\\136.7804\\\\328.01\\\\67.63579\\\\136.2818\\\\328.01\\\\65.13579\\\\135.7744\\\\328.01\\\\63.13579\\\\135.652\\\\328.01\\\\60.63579\\\\135.8225\\\\328.01\\\\58.63579\\\\136.2454\\\\328.01\\\\57.13579\\\\136.731\\\\328.01\\\\55.63579\\\\137.3752\\\\328.01\\\\54.13579\\\\138.2036\\\\328.01\\\\52.63579\\\\139.2228\\\\328.01\\\\51.28782\\\\140.4199\\\\328.01\\\\49.00781\\\\142.9199\\\\328.01\\\\48.03405\\\\144.4199\\\\328.01\\\\47.02981\\\\146.4199\\\\328.01\\\\46.48053\\\\147.9199\\\\328.01\\\\45.95977\\\\149.9199\\\\328.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"39\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"37\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"-35.86421\\\\143.7896\\\\331.01\\\\-38.36421\\\\143.8818\\\\331.01\\\\-40.36421\\\\144.3699\\\\331.01\\\\-42.36421\\\\145.2396\\\\331.01\\\\-43.36421\\\\145.8187\\\\331.01\\\\-44.67136\\\\146.9199\\\\331.01\\\\-46.04104\\\\148.4199\\\\331.01\\\\-46.98353\\\\149.9199\\\\331.01\\\\-47.44573\\\\150.9199\\\\331.01\\\\-47.93336\\\\152.4199\\\\331.01\\\\-48.16312\\\\153.9199\\\\331.01\\\\-48.25866\\\\155.4199\\\\331.01\\\\-48.0823\\\\157.4199\\\\331.01\\\\-47.55443\\\\159.4199\\\\331.01\\\\-46.57254\\\\161.4199\\\\331.01\\\\-45.48601\\\\162.9199\\\\331.01\\\\-44.36421\\\\164.0417\\\\331.01\\\\-42.86421\\\\165.1163\\\\331.01\\\\-40.86421\\\\166.0921\\\\331.01\\\\-39.36421\\\\166.5422\\\\331.01\\\\-36.86421\\\\166.784\\\\331.01\\\\-35.36421\\\\166.6911\\\\331.01\\\\-33.86421\\\\166.4476\\\\331.01\\\\-31.36421\\\\165.5051\\\\331.01\\\\-29.86421\\\\164.5511\\\\331.01\\\\-28.86421\\\\163.6834\\\\331.01\\\\-27.69546\\\\162.4199\\\\331.01\\\\-26.71886\\\\160.9199\\\\331.01\\\\-25.70996\\\\158.4199\\\\331.01\\\\-25.27567\\\\156.4199\\\\331.01\\\\-25.21317\\\\155.4199\\\\331.01\\\\-25.32698\\\\153.9199\\\\331.01\\\\-25.78442\\\\151.9199\\\\331.01\\\\-26.63747\\\\149.9199\\\\331.01\\\\-27.21177\\\\148.9199\\\\331.01\\\\-28.36421\\\\147.5032\\\\331.01\\\\-30.36421\\\\145.7552\\\\331.01\\\\-31.36421\\\\145.1815\\\\331.01\\\\-33.36421\\\\144.3188\\\\331.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"38\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"38\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4.534598\\\\209.9199\\\\331.01\\\\6.188819\\\\211.9199\\\\331.01\\\\8.135789\\\\213.5071\\\\331.01\\\\10.13579\\\\214.5014\\\\331.01\\\\12.13579\\\\215.0422\\\\331.01\\\\14.13579\\\\215.197\\\\331.01\\\\16.63579\\\\215.0084\\\\331.01\\\\18.13579\\\\214.5883\\\\331.01\\\\19.63579\\\\213.9377\\\\331.01\\\\21.13579\\\\213.0235\\\\331.01\\\\22.13579\\\\212.1699\\\\331.01\\\\23.30454\\\\210.9199\\\\331.01\\\\24.30439\\\\209.4199\\\\331.01\\\\25.19557\\\\207.4199\\\\331.01\\\\25.71232\\\\205.4199\\\\331.01\\\\25.81808\\\\203.9199\\\\331.01\\\\25.67383\\\\201.9199\\\\331.01\\\\25.30427\\\\200.4199\\\\331.01\\\\24.75245\\\\198.9199\\\\331.01\\\\24.23462\\\\197.9199\\\\331.01\\\\23.19348\\\\196.4199\\\\331.01\\\\21.63579\\\\194.8493\\\\331.01\\\\20.13579\\\\193.8005\\\\331.01\\\\18.13579\\\\192.881\\\\331.01\\\\16.13579\\\\192.3417\\\\331.01\\\\14.63579\\\\192.2231\\\\331.01\\\\12.63579\\\\192.3105\\\\331.01\\\\10.63579\\\\192.7975\\\\331.01\\\\8.635789\\\\193.6931\\\\331.01\\\\7.635788\\\\194.2918\\\\331.01\\\\5.818221\\\\195.9199\\\\331.01\\\\4.971154\\\\196.9199\\\\331.01\\\\4.039197\\\\198.4199\\\\331.01\\\\3.596016\\\\199.4199\\\\331.01\\\\3.00558\\\\201.4199\\\\331.01\\\\2.826006\\\\203.9199\\\\331.01\\\\3.086875\\\\206.4199\\\\331.01\\\\3.532528\\\\207.9199\\\\331.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"39\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"39\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"21.73698\\\\96.91986\\\\331.01\\\\20.08276\\\\94.91986\\\\331.01\\\\18.13579\\\\93.33265\\\\331.01\\\\16.13579\\\\92.33833\\\\331.01\\\\14.13579\\\\91.79752\\\\331.01\\\\12.13579\\\\91.64268\\\\331.01\\\\9.635789\\\\91.83131\\\\331.01\\\\8.135789\\\\92.25138\\\\331.01\\\\6.635788\\\\92.902\\\\331.01\\\\5.135788\\\\93.8162\\\\331.01\\\\4.135788\\\\94.66986\\\\331.01\\\\2.967038\\\\95.91986\\\\331.01\\\\1.967184\\\\97.41986\\\\331.01\\\\1.076006\\\\99.41986\\\\331.01\\\\0.5592579\\\\101.4199\\\\331.01\\\\0.4534968\\\\102.9199\\\\331.01\\\\0.597745\\\\104.9199\\\\331.01\\\\0.9673102\\\\106.4199\\\\331.01\\\\1.519122\\\\107.9199\\\\331.01\\\\2.036951\\\\108.9199\\\\331.01\\\\3.078096\\\\110.4199\\\\331.01\\\\4.635788\\\\111.9904\\\\331.01\\\\6.135788\\\\113.0392\\\\331.01\\\\8.135789\\\\113.9587\\\\331.01\\\\10.13579\\\\114.498\\\\331.01\\\\11.63579\\\\114.6167\\\\331.01\\\\13.63579\\\\114.5292\\\\331.01\\\\15.63579\\\\114.0422\\\\331.01\\\\17.63579\\\\113.1466\\\\331.01\\\\18.63579\\\\112.5479\\\\331.01\\\\20.45336\\\\110.9199\\\\331.01\\\\21.30042\\\\109.9199\\\\331.01\\\\22.23238\\\\108.4199\\\\331.01\\\\22.67556\\\\107.4199\\\\331.01\\\\23.266\\\\105.4199\\\\331.01\\\\23.41296\\\\103.9199\\\\331.01\\\\23.39122\\\\101.9199\\\\331.01\\\\23.1847\\\\100.4199\\\\331.01\\\\22.73905\\\\98.91986\\\\331.01\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0016\" : {\n" -" \"Name\" : \"ContourImageSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"0008,1150\" : {\n" -" \"Name\" : \"ReferencedSOPClassUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1.2.840.10008.5.1.4.1.1.2\"\n" -" },\n" -" \"0008,1155\" : {\n" -" \"Name\" : \"ReferencedSOPInstanceUID\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0042\" : {\n" -" \"Name\" : \"ContourGeometricType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CLOSED_PLANAR\"\n" -" },\n" -" \"3006,0046\" : {\n" -" \"Name\" : \"NumberOfContourPoints\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"37\"\n" -" },\n" -" \"3006,0048\" : {\n" -" \"Name\" : \"ContourNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"40\"\n" -" },\n" -" \"3006,0050\" : {\n" -" \"Name\" : \"ContourData\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"74.53024\\\\152.9199\\\\331.01\\\\74.26877\\\\150.4199\\\\331.01\\\\73.81514\\\\148.9199\\\\331.01\\\\72.83221\\\\146.9199\\\\331.01\\\\71.73194\\\\145.4199\\\\331.01\\\\70.63579\\\\144.3343\\\\331.01\\\\69.13579\\\\143.2472\\\\331.01\\\\67.13579\\\\142.2623\\\\331.01\\\\65.63579\\\\141.8188\\\\331.01\\\\63.13579\\\\141.581\\\\331.01\\\\60.63579\\\\141.7975\\\\331.01\\\\59.13579\\\\142.2188\\\\331.01\\\\57.63579\\\\142.8559\\\\331.01\\\\56.13579\\\\143.804\\\\331.01\\\\55.40785\\\\144.4199\\\\331.01\\\\53.99204\\\\145.9199\\\\331.01\\\\53.00511\\\\147.4199\\\\331.01\\\\51.98905\\\\149.9199\\\\331.01\\\\51.54905\\\\151.9199\\\\331.01\\\\51.52641\\\\153.9199\\\\331.01\\\\52.04536\\\\156.4199\\\\331.01\\\\52.89742\\\\158.4199\\\\331.01\\\\53.47115\\\\159.4199\\\\331.01\\\\54.63579\\\\160.8652\\\\331.01\\\\56.63579\\\\162.6044\\\\331.01\\\\58.13579\\\\163.4489\\\\331.01\\\\59.63579\\\\164.0449\\\\331.01\\\\61.63579\\\\164.5168\\\\331.01\\\\63.13579\\\\164.5917\\\\331.01\\\\64.63579\\\\164.4964\\\\331.01\\\\66.63579\\\\164.0014\\\\331.01\\\\68.63579\\\\163.1234\\\\331.01\\\\70.40923\\\\161.9199\\\\331.01\\\\71.63579\\\\160.736\\\\331.01\\\\72.67847\\\\159.4199\\\\331.01\\\\73.72818\\\\157.4199\\\\331.01\\\\74.21391\\\\155.9199\\\\331.01\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"3006,0080\" : {\n" -" \"Name\" : \"RTROIObservationsSequence\",\n" -" \"Type\" : \"Sequence\",\n" -" \"Value\" : [\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"1\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"LN300\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ORGAN\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"2\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Cortical Bone\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ORGAN\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"3\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Adipose\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ORGAN\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"4\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"CB2-50%\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ORGAN\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"5\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"Water\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ORGAN\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"6\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"10\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"External\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"EXTERNAL\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" },\n" -" {\n" -" \"3006,0082\" : {\n" -" \"Name\" : \"ObservationNumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"7\"\n" -" },\n" -" \"3006,0084\" : {\n" -" \"Name\" : \"ReferencedROINumber\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"11\"\n" -" },\n" -" \"3006,0085\" : {\n" -" \"Name\" : \"ROIObservationLabel\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"PTV\"\n" -" },\n" -" \"3006,00a4\" : {\n" -" \"Name\" : \"RTROIInterpretedType\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"PTV\"\n" -" },\n" -" \"3006,00a6\" : {\n" -" \"Name\" : \"ROIInterpreter\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"\"\n" -" }\n" -" }\n" -" ]\n" -" },\n" -" \"300e,0002\" : {\n" -" \"Name\" : \"ApprovalStatus\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"APPROVED\"\n" -" },\n" -" \"300e,0004\" : {\n" -" \"Name\" : \"ReviewDate\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"20190318\"\n" -" },\n" -" \"300e,0005\" : {\n" -" \"Name\" : \"ReviewTime\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"182558\"\n" -" },\n" -" \"300e,0008\" : {\n" -" \"Name\" : \"ReviewerName\",\n" -" \"Type\" : \"String\",\n" -" \"Value\" : \"ONC_jwulff2\"\n" -" }\n" -"}\n" -""; - -#ifdef _MSC_VER -#pragma endregion -#endif -// _MSC_VER - -/* -these tests are single-threaded... no worries for old buggy compilers -(I'm talking to YOU, cl.exe v100! And to your ancestors!) -*/ -static std::string& GetTestJson() -{ - static const char* resultRaw = NULL; - static std::string result; - if (resultRaw == NULL) - { - std::stringstream sst; - - sst << k_rtStruct_json00 - << k_rtStruct_json01 - << k_rtStruct_json02 - << k_rtStruct_json03 - << k_rtStruct_json04 - << k_rtStruct_json05 - << k_rtStruct_json06 - << k_rtStruct_json07 - << k_rtStruct_json08; - - std::string wholeBody = sst.str(); - result.swap(wholeBody); - resultRaw = result.c_str(); - } - return result; -} - -#define STONE_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -static void CheckGroundTruth( - const std::vector& structures, - const size_t structureIndex, - const size_t sliceIndex, - std::vector groundTruth) -{ - const std::vector& polygonsForThisStruct = structures.at(structureIndex).GetPolygons(); - const DicomStructurePolygon2& polygon = polygonsForThisStruct.at(sliceIndex); - - //double groundTruth[] = { 7.657838, 108.2725, 304.01, 6.826687, 107.4413, 304.01, 6.152492, 106.4785, 304.01, 5.655735, 105.4132, 304.01, 5.351513, 104.2778, 304.01, 5.249068, 103.1069, 304.01, 5.351513, 101.9359, 304.01, 5.655735, 100.8005, 304.01, 6.152492, 99.73524, 304.01, 6.826687, 98.77239, 304.01, 7.657838, 97.94124, 304.01, 8.620689, 97.26704, 304.01, 9.685987, 96.77029, 304.01, 10.82136, 96.46606, 304.01, 11.99231, 96.36362, 304.01, 13.16326, 96.46606, 304.01, 14.29864, 96.77029, 304.01, 15.36393, 97.26704, 304.01, 16.32678, 97.94124, 304.01, 17.15794, 98.77239, 304.01, 17.83213, 99.73524, 304.01, 18.32889, 100.8005, 304.01, 18.63311, 101.9359, 304.01, 18.73555, 103.1069, 304.01, 18.63311, 104.2778, 304.01, 18.32889, 105.4132, 304.01, 17.83213, 106.4785, 304.01, 17.15794, 107.4413, 304.01, 16.32678, 108.2725, 304.01, 15.36393, 108.9467, 304.01, 14.29864, 109.4434, 304.01, 13.16326, 109.7477, 304.01, 11.99231, 109.8501, 304.01, 10.82136, 109.7477, 304.01, 9.685987, 109.4434, 304.01, 8.620689, 108.9467, 304.01 }; - size_t groundTruthItems = groundTruth.size(); - - size_t pointCount = 3 * polygon.GetPointCount(); - - EXPECT_EQ(groundTruthItems, pointCount); - - for (size_t i = 0; i < polygon.GetPointCount(); ++i) - { - const Point3D& point = polygon.GetPoint(i); - - // loop over X, Y then Z. - for (size_t j = 0; j < 3; ++j) - { - size_t index = 3 * i + j; - ASSERT_LT(index, groundTruthItems); - bool isNear = LinearAlgebra::IsNear(groundTruth[index], point[j]); - EXPECT_TRUE(isNear); - } - } -} - - -TEST(StructureSet, ReadFromJsonThatsAll) -{ - DicomStructureSet2 structureSet; - - OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); - //loader.content_.reset(new DicomStructureSet(dicom)); - structureSet.Clear(); - - structureSet.FillStructuresFromDataset(dicom); - structureSet.ComputeDependentProperties(); - - const std::vector& structures = structureSet.structures_; - - /* - - β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— - β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•”β•β•β•β•β• - β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— - β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•— β•šβ•β•β•β•β–ˆβ–ˆβ•‘ - β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ - β•šβ•β•β•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• - http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=BASIC%20CHECKS - */ - - // (0x3006, 0x0080) seq. size - EXPECT_EQ(7, structures.size()); - - // (0x3006, 0x0080)[i]/(0x3006, 0x00a4) - for (size_t i = 0; i < 5; ++i) - { - EXPECT_EQ(std::string("ORGAN"), structures[i].interpretation_); - } - EXPECT_EQ(std::string("EXTERNAL"), structures[5].interpretation_); - EXPECT_EQ(std::string("PTV"), structures[6].interpretation_); - - // (0x3006, 0x0020)[i]/(0x3006, 0x0026) - EXPECT_EQ(std::string("LN300"), structures[0].name_); - EXPECT_EQ(std::string("Cortical Bone"), structures[1].name_); - EXPECT_EQ(std::string("Adipose"), structures[2].name_); - EXPECT_EQ(std::string("CB2-50%"), structures[3].name_); - EXPECT_EQ(std::string("Water"), structures[4].name_); - EXPECT_EQ(std::string("External"), structures[5].name_); - EXPECT_EQ(std::string("PTV"), structures[6].name_); - - // (0x3006, 0x0039)[i]/(0x3006, 0x002a) - EXPECT_EQ(0xff, structures[0].red_); - EXPECT_EQ(0x00, structures[0].green_); - EXPECT_EQ(0x00, structures[0].blue_); - - EXPECT_EQ(0x00, structures[1].red_); - EXPECT_EQ(0xff, structures[1].green_); - EXPECT_EQ(0xff, structures[1].blue_); - - // ... - - EXPECT_EQ(0x00, structures[5].red_); - EXPECT_EQ(0x80, structures[5].green_); - EXPECT_EQ(0x00, structures[5].blue_); - - EXPECT_EQ(0xff, structures[6].red_); - EXPECT_EQ(0x00, structures[6].green_); - EXPECT_EQ(0xff, structures[6].blue_); - - /* - - β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•— β–ˆβ–ˆβ•— - β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β• - β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β–ˆβ–ˆβ–ˆβ–ˆβ•”β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• - β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•— β•šβ–ˆβ–ˆβ•”β• - β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β•šβ•β• β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ - β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• - http://patorjk.com/software/taag/#p=display&f=ANSI%20Shadow&t=BASIC%20CHECKS - */ - - - { - double groundTruthRaw[] = { 7.657838, 108.2725, 304.01, 6.826687, 107.4413, 304.01, 6.152492, 106.4785, 304.01, 5.655735, 105.4132, 304.01, 5.351513, 104.2778, 304.01, 5.249068, 103.1069, 304.01, 5.351513, 101.9359, 304.01, 5.655735, 100.8005, 304.01, 6.152492, 99.73524, 304.01, 6.826687, 98.77239, 304.01, 7.657838, 97.94124, 304.01, 8.620689, 97.26704, 304.01, 9.685987, 96.77029, 304.01, 10.82136, 96.46606, 304.01, 11.99231, 96.36362, 304.01, 13.16326, 96.46606, 304.01, 14.29864, 96.77029, 304.01, 15.36393, 97.26704, 304.01, 16.32678, 97.94124, 304.01, 17.15794, 98.77239, 304.01, 17.83213, 99.73524, 304.01, 18.32889, 100.8005, 304.01, 18.63311, 101.9359, 304.01, 18.73555, 103.1069, 304.01, 18.63311, 104.2778, 304.01, 18.32889, 105.4132, 304.01, 17.83213, 106.4785, 304.01, 17.15794, 107.4413, 304.01, 16.32678, 108.2725, 304.01, 15.36393, 108.9467, 304.01, 14.29864, 109.4434, 304.01, 13.16326, 109.7477, 304.01, 11.99231, 109.8501, 304.01, 10.82136, 109.7477, 304.01, 9.685987, 109.4434, 304.01, 8.620689, 108.9467, 304.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - CheckGroundTruth(structures, 0, 0, groundTruth); - } - { - double groundTruthRaw[] = { 7.657838, 108.2725, 310.01, 6.826687, 107.4413, 310.01, 6.152492, 106.4785, 310.01, 5.655735, 105.4132, 310.01, 5.351513, 104.2778, 310.01, 5.249068, 103.1069, 310.01, 5.351513, 101.9359, 310.01, 5.655735, 100.8005, 310.01, 6.152492, 99.73524, 310.01, 6.826687, 98.77239, 310.01, 7.657838, 97.94124, 310.01, 8.620689, 97.26704, 310.01, 9.685987, 96.77029, 310.01, 10.82136, 96.46606, 310.01, 11.99231, 96.36362, 310.01, 13.16326, 96.46606, 310.01, 14.29864, 96.77029, 310.01, 15.36393, 97.26704, 310.01, 16.32678, 97.94124, 310.01, 17.15794, 98.77239, 310.01, 17.83213, 99.73524, 310.01, 18.32889, 100.8005, 310.01, 18.63311, 101.9359, 310.01, 18.73555, 103.1069, 310.01, 18.63311, 104.2778, 310.01, 18.32889, 105.4132, 310.01, 17.83213, 106.4785, 310.01, 17.15794, 107.4413, 310.01, 16.32678, 108.2725, 310.01, 15.36393, 108.9467, 310.01, 14.29864, 109.4434, 310.01, 13.16326, 109.7477, 310.01, 11.99231, 109.8501, 310.01, 10.82136, 109.7477, 310.01, 9.685987, 109.4434, 310.01, 8.620689, 108.9467, 310.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - CheckGroundTruth(structures, 0, 2, groundTruth); - } - { - double groundTruthRaw[] = { -37.967, 161.9664, 304.01, -39.10237, 161.6622, 304.01, -40.16767, 161.1655, 304.01, -41.13052, 160.4913, 304.01, -41.96167, 159.6601, 304.01, -42.63587, 158.6973, 304.01, -43.13263, 157.632, 304.01, -43.43685, 156.4966, 304.01, -43.53929, 155.3257, 304.01, -43.43685, 154.1547, 304.01, -43.13263, 153.0193, 304.01, -42.63587, 151.954, 304.01, -41.96167, 150.9912, 304.01, -41.13052, 150.16, 304.01, -40.16767, 149.4858, 304.01, -39.10237, 148.9891, 304.01, -37.967, 148.6849, 304.01, -36.79605, 148.5824, 304.01, -35.6251, 148.6849, 304.01, -34.48972, 148.9891, 304.01, -33.42443, 149.4858, 304.01, -32.46157, 150.16, 304.01, -31.63042, 150.9912, 304.01, -30.95623, 151.954, 304.01, -30.45947, 153.0193, 304.01, -30.15525, 154.1547, 304.01, -30.0528, 155.3257, 304.01, -30.15525, 156.4966, 304.01, -30.45947, 157.632, 304.01, -30.95623, 158.6973, 304.01, -31.63042, 159.6601, 304.01, -32.46157, 160.4913, 304.01, -33.42443, 161.1655, 304.01, -34.48972, 161.6622, 304.01, -35.6251, 161.9664, 304.01, -36.79605, 162.0689, 304.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - CheckGroundTruth(structures, 1, 0, groundTruth); - } - { - double groundTruthRaw[] = { 69.4042, 150.7324, 307.01, 69.70842, 151.8678, 307.01, 69.81087, 153.0387, 307.01, 69.70842, 154.2097, 307.01, 69.4042, 155.345, 307.01, 68.90745, 156.4103, 307.01, 68.23325, 157.3732, 307.01, 67.4021, 158.2043, 307.01, 66.43925, 158.8785, 307.01, 65.37395, 159.3753, 307.01, 64.23858, 159.6795, 307.01, 63.06762, 159.7819, 307.01, 61.89667, 159.6795, 307.01, 60.7613, 159.3753, 307.01, 59.696, 158.8785, 307.01, 58.73315, 158.2043, 307.01, 57.902, 157.3732, 307.01, 57.22781, 156.4103, 307.01, 56.73105, 155.345, 307.01, 56.42683, 154.2097, 307.01, 56.32438, 153.0387, 307.01, 56.42683, 151.8678, 307.01, 56.73105, 150.7324, 307.01, 57.22781, 149.6671, 307.01, 57.902, 148.7042, 307.01, 58.73315, 147.8731, 307.01, 59.696, 147.1989, 307.01, 60.7613, 146.7021, 307.01, 61.89667, 146.3979, 307.01, 63.06762, 146.2955, 307.01, 64.23858, 146.3979, 307.01, 65.37395, 146.7021, 307.01, 66.43925, 147.1989, 307.01, 67.4021, 147.8731, 307.01, 68.23325, 148.7042, 307.01, 68.90745, 149.6671, 307.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - CheckGroundTruth(structures, 2, 1, groundTruth); - } - - { - double groundTruthRaw[] = { 108.3984, 232.7406, 274.01, 106.0547, 231.7948, 274.01, 103.7109, 232.8407, 274.01, 96.67969, 232.8757, 274.01, 77.92969, 232.887, 274.01, 47.46094, 232.8902, 274.01, 38.08594, 232.7537, 274.01, 37.6668, 232.3734, 274.01, 38.08594, 231.9774, 274.01, 40.42969, 231.8475, 274.01, 41.76413, 230.0297, 274.01, 42.77344, 229.1388, 274.01, 45.11719, 228.5069, 274.01, 47.46094, 227.1533, 274.01, 49.80469, 226.3505, 274.01, 52.14844, 224.6564, 274.01, 54.49219, 223.923, 274.01, 56.83594, 222.0692, 274.01, 59.17969, 220.3438, 274.01, 61.52344, 219.3888, 274.01, 63.86719, 217.1287, 274.01, 65.83488, 215.9672, 274.01, 68.55469, 213.2383, 274.01, 70.89844, 211.2328, 274.01, 72.8125, 208.9359, 274.01, 75.58594, 206.3615, 274.01, 76.91445, 204.2484, 274.01, 78.89509, 201.9047, 274.01, 80.51276, 199.5609, 274.01, 81.51955, 197.2172, 274.01, 83.67448, 194.8734, 274.01, 84.60938, 192.5297, 274.01, 85.86986, 190.1859, 274.01, 86.57623, 187.8422, 274.01, 88.30051, 185.4984, 274.01, 88.94002, 183.1547, 274.01, 89.23261, 180.8109, 274.01, 89.64844, 180.3263, 274.01, 90.71885, 178.4672, 274.01, 90.97656, 176.1234, 274.01, 91.99219, 174.4794, 274.01, 92.56773, 173.7797, 274.01, 92.80016, 171.4359, 274.01, 93.23473, 169.0922, 274.01, 93.37606, 166.7484, 274.01, 93.60748, 157.3734, 274.01, 93.6341, 152.6859, 274.01, 93.35742, 140.9672, 274.01, 92.89317, 138.6234, 274.01, 92.7069, 136.2797, 274.01, 92.03726, 133.9359, 274.01, 90.84009, 131.5922, 274.01, 90.3769, 129.2484, 274.01, 89.09074, 126.9047, 274.01, 88.13225, 122.2172, 274.01, 86.17828, 119.8734, 274.01, 84.96094, 117.4163, 274.01, 83.99619, 115.1859, 274.01, 83.13079, 112.8422, 274.01, 82.61719, 112.2984, 274.01, 80.27344, 108.8454, 274.01, 79.64514, 108.1547, 274.01, 77.21497, 105.8109, 274.01, 76.47787, 103.4672, 274.01, 75.58594, 102.6177, 274.01, 73.24219, 100.0077, 274.01, 69.54492, 96.43594, 274.01, 67.34096, 94.09219, 274.01, 64.66306, 91.74844, 274.01, 63.86719, 90.92619, 274.01, 61.52344, 90.20454, 274.01, 59.17969, 87.78574, 274.01, 56.83594, 86.48566, 274.01, 54.49219, 84.31388, 274.01, 52.14844, 83.44438, 274.01, 49.80469, 82.75121, 274.01, 49.37617, 82.37344, 274.01, 47.46094, 81.26244, 274.01, 45.71391, 80.02969, 274.01, 45.11719, 79.45415, 274.01, 42.77344, 79.08185, 274.01, 40.42969, 78.51941, 274.01, 38.08594, 78.27534, 274.01, 37.36932, 77.68594, 274.01, 35.74219, 76.67624, 274.01, 33.39844, 76.49941, 274.01, 31.05469, 76.03495, 274.01, 28.71094, 74.83174, 274.01, 26.36719, 74.62859, 274.01, 24.02344, 74.55463, 274.01, 21.67969, 74.22861, 274.01, 19.33594, 74.05312, 274.01, 12.30469, 73.99397, 274.01, 5.273438, 74.0736, 274.01, 2.929688, 74.55463, 274.01, 0.5859375, 74.68513, 274.01, -1.757813, 74.914, 274.01, -2.319131, 75.34219, 274.01, -4.101563, 76.31516, 274.01, -8.789063, 76.74514, 274.01, -11.13281, 78.39038, 274.01, -13.47656, 78.6124, 274.01, -15.82031, 79.19784, 274.01, -18.16406, 81.11024, 274.01, -20.50781, 82.03296, 274.01, -22.85156, 83.13991, 274.01, -25.19531, 83.70732, 274.01, -27.53906, 85.85863, 274.01, -29.88281, 87.03368, 274.01, -32.22656, 88.3274, 274.01, -34.57031, 90.53674, 274.01, -36.91406, 92.5602, 274.01, -39.25781, 93.55952, 274.01, -41.60156, 95.74537, 274.01, -43.94531, 98.26609, 274.01, -46.28906, 100.3701, 274.01, -47.02621, 101.1234, 274.01, -47.86611, 103.4672, 274.01, -49.83594, 105.8109, 274.01, -51.98182, 108.1547, 274.01, -53.06448, 110.4984, 274.01, -53.32031, 110.7675, 274.01, -54.53804, 112.8422, 274.01, -55.66406, 114.273, 274.01, -56.55722, 115.1859, 274.01, -57.13953, 117.5297, 274.01, -58.29264, 119.8734, 274.01, -59.26869, 122.2172, 274.01, -60.35156, 124.0119, 274.01, -60.84229, 124.5609, 274.01, -61.54484, 126.9047, 274.01, -61.71691, 129.2484, 274.01, -63.62281, 131.5922, 274.01, -63.81256, 133.9359, 274.01, -64.12511, 136.2797, 274.01, -64.84515, 138.6234, 274.01, -65.13599, 140.9672, 274.01, -65.33604, 143.3109, 274.01, -65.87358, 145.6547, 274.01, -66.10577, 147.9984, 274.01, -66.17618, 155.0297, 274.01, -66.09933, 162.0609, 274.01, -65.40382, 164.4047, 274.01, -65.24833, 166.7484, 274.01, -64.71442, 171.4359, 274.01, -63.88171, 173.7797, 274.01, -63.69299, 176.1234, 274.01, -61.79081, 178.4672, 274.01, -61.59269, 180.8109, 274.01, -61.19405, 183.1547, 274.01, -60.35156, 185.2055, 274.01, -59.08288, 187.8422, 274.01, -58.00781, 189.3499, 274.01, -57.25858, 190.1859, 274.01, -56.64558, 192.5297, 274.01, -55.29191, 194.8734, 274.01, -54.28698, 197.2172, 274.01, -52.28595, 199.5609, 274.01, -51.47569, 201.9047, 274.01, -48.63281, 204.6417, 274.01, -47.10181, 206.5922, 274.01, -44.64154, 208.9359, 274.01, -42.38504, 211.2797, 274.01, -39.25781, 214.4025, 274.01, -37.42723, 215.9672, 274.01, -34.57031, 218.9107, 274.01, -32.22656, 219.7277, 274.01, -29.88281, 221.6934, 274.01, -27.53906, 222.852, 274.01, -25.19531, 224.5168, 274.01, -22.85156, 225.9419, 274.01, -20.50781, 226.7359, 274.01, -18.16406, 228.3332, 274.01, -15.82031, 229.065, 274.01, -13.47656, 229.267, 274.01, -12.63854, 230.0297, 274.01, -11.13281, 231.9201, 274.01, -10.65505, 232.3734, 274.01, -11.13281, 232.7794, 274.01, -15.82031, 232.792, 274.01, -18.16406, 232.8902, 274.01, -36.91406, 232.9015, 274.01, -39.25781, 232.8902, 274.01, -50.97656, 232.9236, 274.01, -60.35156, 232.9126, 274.01, -67.38281, 232.8407, 274.01, -72.07031, 232.8642, 274.01, -79.10156, 232.8555, 274.01, -83.78906, 232.8788, 274.01, -95.50781, 232.8902, 274.01, -97.85156, 233.4886, 274.01, -100.1953, 233.647, 274.01, -102.5391, 232.9858, 274.01, -104.8828, 233.6969, 274.01, -109.5703, 233.722, 274.01, -125.9766, 233.7086, 274.01, -128.3203, 233.2849, 274.01, -130.6641, 233.702, 274.01, -135.3516, 233.727, 274.01, -149.4141, 233.7135, 274.01, -156.4453, 233.727, 274.01, -163.4766, 233.7119, 274.01, -168.1641, 233.7643, 274.01, -191.6016, 233.7809, 274.01, -210.3516, 233.7716, 274.01, -224.4141, 233.7998, 274.01, -233.7891, 233.7647, 274.01, -243.1641, 233.7785, 274.01, -247.8516, 233.7378, 274.01, -254.8828, 233.8578, 274.01, -257.2266, 235.2519, 274.01, -259.5703, 236.0817, 274.01, -260.7617, 237.0609, 274.01, -261.9141, 238.2262, 274.01, -262.8989, 239.4047, 274.01, -262.9743, 241.7484, 274.01, -262.5977, 244.0922, 274.01, -260.6675, 246.4359, 274.01, -259.6161, 248.7797, 274.01, -257.2266, 251.0035, 274.01, -255.0361, 253.4672, 274.01, -252.5391, 256.0995, 274.01, -251.2277, 258.1547, 274.01, -246.7444, 262.8422, 274.01, -243.1641, 266.3515, 274.01, -239.7411, 269.8734, 274.01, -238.4766, 270.9495, 274.01, -237.2269, 272.2172, 274.01, -236.1328, 273.5215, 274.01, -235.0934, 274.5609, 274.01, -233.7891, 275.6655, 274.01, -232.5319, 276.9047, 274.01, -231.4453, 278.1693, 274.01, -227.917, 281.5922, 274.01, -224.4141, 285.1802, 274.01, -222.0703, 287.4025, 274.01, -218.6841, 290.9672, 274.01, -217.3828, 291.9709, 274.01, -215.0391, 293.1788, 274.01, -212.6953, 294.5138, 274.01, -210.3516, 295.2614, 274.01, -209.8994, 295.6547, 274.01, -208.0078, 296.7083, 274.01, -203.3203, 296.9372, 274.01, -196.2891, 296.9317, 274.01, -193.9453, 296.8988, 274.01, -172.8516, 296.8482, 274.01, -161.1328, 296.843, 274.01, -137.6953, 296.8542, 274.01, -130.6641, 296.8378, 274.01, -107.2266, 296.8379, 274.01, -93.16406, 296.8208, 274.01, -74.41406, 296.838, 274.01, -65.03906, 296.8609, 274.01, -50.97656, 296.8556, 274.01, -46.28906, 296.9051, 274.01, -41.60156, 298.5331, 274.01, -39.25781, 298.5624, 274.01, -36.91406, 297.1455, 274.01, -34.57031, 297.0498, 274.01, -32.22656, 298.5589, 274.01, -25.19531, 298.5624, 274.01, -22.85156, 297.2842, 274.01, -20.50781, 298.5624, 274.01, -1.757813, 298.5624, 274.01, 0.5859375, 297.2104, 274.01, 2.929688, 298.5624, 274.01, 5.273438, 297.6946, 274.01, 7.617188, 298.5168, 274.01, 9.960938, 298.5512, 274.01, 12.30469, 296.937, 274.01, 14.64844, 298.5478, 274.01, 16.99219, 298.5478, 274.01, 19.33594, 297.0782, 274.01, 21.67969, 296.844, 274.01, 23.54531, 297.9984, 274.01, 24.02344, 298.4023, 274.01, 24.50156, 297.9984, 274.01, 26.36719, 296.844, 274.01, 38.08594, 296.8381, 274.01, 52.14844, 296.8033, 274.01, 59.17969, 296.8033, 274.01, 73.24219, 296.7682, 274.01, 99.02344, 296.7566, 274.01, 117.7734, 296.7216, 274.01, 129.4922, 296.7152, 274.01, 131.8359, 295.9083, 274.01, 134.1797, 295.5245, 274.01, 138.8672, 295.4763, 274.01, 155.2734, 295.4763, 274.01, 176.3672, 295.3861, 274.01, 190.4297, 295.3718, 274.01, 197.4609, 295.4763, 274.01, 202.1484, 295.4454, 274.01, 204.4922, 295.3438, 274.01, 206.8359, 295.0757, 274.01, 209.1797, 294.4124, 274.01, 211.5234, 292.3133, 274.01, 213.8672, 291.0809, 274.01, 216.2109, 289.6743, 274.01, 217.3081, 288.6234, 274.01, 219.3558, 286.2797, 274.01, 221.8608, 283.9359, 274.01, 225.5859, 280.045, 274.01, 227.9297, 277.8885, 274.01, 230.2734, 275.2857, 274.01, 232.6172, 273.2225, 274.01, 233.6225, 272.2172, 274.01, 234.9609, 270.5822, 274.01, 238.2254, 267.5297, 274.01, 240.3691, 265.1859, 274.01, 244.3359, 261.3326, 274.01, 246.6797, 258.8034, 274.01, 249.0234, 256.7196, 274.01, 251.3672, 254.0746, 274.01, 254.5313, 251.1234, 274.01, 255.333, 248.7797, 274.01, 257.3723, 246.4359, 274.01, 259.7201, 244.0922, 274.01, 260.106, 241.7484, 274.01, 261.6423, 239.4047, 274.01, 261.0804, 237.0609, 274.01, 259.3552, 234.7172, 274.01, 258.3984, 233.7696, 274.01, 256.0547, 232.8757, 274.01, 253.7109, 232.792, 274.01, 251.3672, 232.8161, 274.01, 246.6797, 232.6981, 274.01, 244.3359, 232.725, 274.01, 239.6484, 232.9137, 274.01, 234.9609, 232.8525, 274.01, 225.5859, 232.8757, 274.01, 209.1797, 232.8757, 274.01, 204.4922, 232.7537, 274.01, 195.1172, 232.7794, 274.01, 171.6797, 232.792, 274.01, 164.6484, 232.7666, 274.01, 152.9297, 232.7666, 274.01, 148.2422, 232.792, 274.01, 138.8672, 232.7406, 274.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - EXPECT_EQ(340u * 3, groundTruth.size()); - CheckGroundTruth(structures, 5, 0, groundTruth); - } - - { - double groundTruthRaw[] = { -18.16406, 233.0632, 298.01, -27.53906, 233.1042, 298.01, -29.88281, 233.0819, 298.01, -34.57031, 233.131, 298.01, -43.94531, 233.1221, 298.01, -50.97656, 233.1736, 298.01, -62.69531, 233.1397, 298.01, -65.03906, 232.8376, 298.01, -69.72656, 232.9839, 298.01, -79.10156, 233.0245, 298.01, -90.82031, 233.0382, 298.01, -93.16406, 233.0859, 298.01, -109.5703, 233.1132, 298.01, -111.9141, 233.1791, 298.01, -114.2578, 233.7139, 298.01, -118.9453, 233.9793, 298.01, -128.3203, 234.0284, 298.01, -130.6641, 233.9793, 298.01, -135.3516, 234.0591, 298.01, -137.6953, 234.0284, 298.01, -142.3828, 234.0855, 298.01, -144.7266, 234.0284, 298.01, -151.7578, 234.002, 298.01, -158.7891, 234.0263, 298.01, -163.4766, 233.9784, 298.01, -165.8203, 234.0072, 298.01, -168.1641, 234.1756, 298.01, -170.5078, 234.2214, 298.01, -179.8828, 234.1934, 298.01, -186.9141, 234.2721, 298.01, -189.2578, 234.2289, 298.01, -193.9453, 234.2431, 298.01, -198.6328, 234.1692, 298.01, -200.9766, 234.2326, 298.01, -205.6641, 234.1271, 298.01, -212.6953, 234.2224, 298.01, -215.0391, 234.1992, 298.01, -222.0703, 234.3115, 298.01, -224.4141, 234.2224, 298.01, -226.7578, 234.2502, 298.01, -233.7891, 234.0906, 298.01, -238.4766, 234.0329, 298.01, -243.1641, 234.0283, 298.01, -247.8516, 233.7949, 298.01, -250.1953, 233.8681, 298.01, -252.5391, 234.7626, 298.01, -254.3469, 237.0609, 298.01, -255.6034, 239.4047, 298.01, -254.5181, 241.7484, 298.01, -254.2274, 244.0922, 298.01, -254.181, 248.7797, 298.01, -253.9355, 251.1234, 298.01, -253.5926, 253.4672, 298.01, -252.7483, 255.8109, 298.01, -250.8092, 258.1547, 298.01, -248.713, 260.4984, 298.01, -246.263, 262.8422, 298.01, -244.1406, 265.1859, 298.01, -241.6671, 267.5297, 298.01, -239.4754, 269.8734, 298.01, -237.0156, 272.2172, 298.01, -233.7891, 275.382, 298.01, -231.4453, 277.8249, 298.01, -229.1016, 279.9981, 298.01, -226.7578, 282.5281, 298.01, -224.4141, 284.6784, 298.01, -222.0703, 287.2355, 298.01, -220.5414, 288.6234, 298.01, -218.2745, 290.9672, 298.01, -217.3828, 291.6508, 298.01, -212.6953, 294.5949, 298.01, -210.3516, 295.3142, 298.01, -208.0078, 296.4674, 298.01, -205.6641, 296.8852, 298.01, -203.3203, 297.1563, 298.01, -196.2891, 297.1488, 298.01, -193.9453, 297.0597, 298.01, -182.2266, 296.9529, 298.01, -168.1641, 296.8576, 298.01, -154.1016, 296.9249, 298.01, -149.4141, 296.8921, 298.01, -128.3203, 296.9228, 298.01, -121.2891, 296.8623, 298.01, -111.9141, 296.8549, 298.01, -107.2266, 296.8266, 298.01, -102.5391, 296.8731, 298.01, -95.50781, 296.8453, 298.01, -88.47656, 296.9218, 298.01, -83.78906, 296.9016, 298.01, -69.72656, 296.979, 298.01, -67.38281, 296.9514, 298.01, -65.03906, 297.2199, 298.01, -62.69531, 296.9622, 298.01, -55.66406, 296.9926, 298.01, -50.97656, 296.9467, 298.01, -48.63281, 297.3652, 298.01, -46.28906, 297.0439, 298.01, -43.94531, 297.2875, 298.01, -39.25781, 297.0121, 298.01, -34.57031, 297.1564, 298.01, -32.22656, 297.3612, 298.01, -29.88281, 297.4229, 298.01, -27.53906, 297.1687, 298.01, -25.19531, 297.4334, 298.01, -18.16406, 297.3612, 298.01, -15.82031, 297.4441, 298.01, -13.47656, 297.4125, 298.01, -11.13281, 297.2468, 298.01, -8.789063, 297.4125, 298.01, -6.445313, 297.373, 298.01, -4.101563, 297.4195, 298.01, -1.757813, 297.077, 298.01, 0.5859375, 297.4229, 298.01, 2.929688, 297.4125, 298.01, 5.273438, 296.9489, 298.01, 7.617188, 297.3168, 298.01, 9.960938, 296.9377, 298.01, 12.30469, 296.8998, 298.01, 14.64844, 297.1975, 298.01, 16.99219, 296.8579, 298.01, 28.71094, 296.878, 298.01, 40.42969, 296.8163, 298.01, 42.77344, 296.8369, 298.01, 49.80469, 296.734, 298.01, 59.17969, 296.6906, 298.01, 61.52344, 296.6365, 298.01, 68.55469, 296.6278, 298.01, 73.24219, 296.5777, 298.01, 75.58594, 296.6191, 298.01, 84.96094, 296.5284, 298.01, 96.67969, 296.5538, 298.01, 103.7109, 296.479, 298.01, 115.4297, 296.4259, 298.01, 122.4609, 296.3434, 298.01, 129.4922, 296.3495, 298.01, 131.8359, 295.9141, 298.01, 136.5234, 296.2256, 298.01, 138.8672, 295.833, 298.01, 143.5547, 295.9857, 298.01, 145.8984, 295.8791, 298.01, 152.9297, 295.833, 298.01, 164.6484, 295.6819, 298.01, 171.6797, 295.6819, 298.01, 181.0547, 295.5401, 298.01, 185.7422, 295.5742, 298.01, 192.7734, 295.557, 298.01, 197.4609, 295.8012, 298.01, 202.1484, 295.6819, 298.01, 204.4922, 295.3698, 298.01, 206.8359, 294.803, 298.01, 209.1797, 294.3656, 298.01, 211.5234, 292.4764, 298.01, 213.8672, 291.1765, 298.01, 216.2109, 289.5873, 298.01, 217.229, 288.6234, 298.01, 218.5547, 287.0752, 298.01, 221.7097, 283.9359, 298.01, 225.5859, 279.8775, 298.01, 227.9297, 277.5633, 298.01, 230.2734, 275.0808, 298.01, 233.1989, 272.2172, 298.01, 234.9609, 270.2887, 298.01, 237.7384, 267.5297, 298.01, 241.9922, 263.0843, 298.01, 244.3359, 260.7643, 298.01, 246.788, 258.1547, 298.01, 249.0234, 255.451, 298.01, 250.3651, 253.4672, 298.01, 251.5297, 251.1234, 298.01, 252.1947, 248.7797, 298.01, 252.4915, 246.4359, 298.01, 252.5755, 241.7484, 298.01, 252.8592, 239.4047, 298.01, 252.9236, 237.0609, 298.01, 252.2924, 234.7172, 298.01, 251.3672, 233.4697, 298.01, 249.0234, 232.882, 298.01, 244.3359, 232.9048, 298.01, 241.9922, 233.0145, 298.01, 232.6172, 232.9048, 298.01, 227.9297, 233.0007, 298.01, 216.2109, 233.0632, 298.01, 211.5234, 233.0537, 298.01, 206.8359, 232.9699, 298.01, 204.4922, 232.7322, 298.01, 199.8047, 232.7186, 298.01, 190.4297, 232.7719, 298.01, 183.3984, 232.7719, 298.01, 181.0547, 232.7322, 298.01, 174.0234, 232.7048, 298.01, 171.6797, 232.7322, 298.01, 166.9922, 232.6908, 298.01, 157.6172, 232.7975, 298.01, 155.2734, 232.7588, 298.01, 148.2422, 232.7875, 298.01, 143.5547, 232.7614, 298.01, 138.8672, 232.6477, 298.01, 124.8047, 232.6179, 298.01, 122.4609, 232.6477, 298.01, 113.0859, 232.6027, 298.01, 110.7422, 232.4552, 298.01, 108.3984, 232.2192, 298.01, 106.0547, 231.6764, 298.01, 103.7109, 231.8559, 298.01, 102.8237, 232.3734, 298.01, 101.3672, 232.9839, 298.01, 99.02344, 233.0951, 298.01, 87.30469, 233.0819, 298.01, 84.96094, 233.1091, 298.01, 80.27344, 233.0726, 298.01, 77.92969, 233.1132, 298.01, 70.89844, 233.1397, 298.01, 68.55469, 233.1132, 298.01, 52.14844, 233.131, 298.01, 45.11719, 233.0859, 298.01, 44.16726, 232.3734, 298.01, 42.77344, 231.0206, 298.01, 42.04498, 230.0297, 298.01, 42.77344, 229.2462, 298.01, 45.11719, 228.5664, 298.01, 47.46094, 227.0695, 298.01, 49.80469, 226.0552, 298.01, 52.14844, 224.5723, 298.01, 54.49219, 223.6857, 298.01, 56.83594, 221.8519, 298.01, 59.17969, 220.2086, 298.01, 61.52344, 218.8854, 298.01, 64.94469, 215.9672, 298.01, 66.21094, 215.0191, 298.01, 67.72036, 213.6234, 298.01, 68.55469, 212.6986, 298.01, 70.89844, 210.5055, 298.01, 74.53191, 206.5922, 298.01, 76.54903, 204.2484, 298.01, 78.26105, 201.9047, 298.01, 80.27344, 198.9262, 298.01, 82.61719, 195.2822, 298.01, 82.98087, 194.8734, 298.01, 84.96094, 190.9255, 298.01, 85.43701, 190.1859, 298.01, 86.33423, 187.8422, 298.01, 87.78722, 185.4984, 298.01, 88.60233, 183.1547, 298.01, 89.10253, 180.8109, 298.01, 90.17504, 178.4672, 298.01, 90.88959, 176.1234, 298.01, 91.43783, 173.7797, 298.01, 92.39601, 171.4359, 298.01, 92.95762, 169.0922, 298.01, 93.55695, 159.7172, 298.01, 93.65527, 157.3734, 298.01, 93.67542, 152.6859, 298.01, 93.61213, 150.3422, 298.01, 93.22542, 143.3109, 298.01, 93.06345, 140.9672, 298.01, 92.77563, 138.6234, 298.01, 91.21714, 133.9359, 298.01, 90.67235, 131.5922, 298.01, 89.88776, 129.2484, 298.01, 88.8737, 126.9047, 298.01, 88.44087, 124.5609, 298.01, 86.09712, 119.8734, 298.01, 85.05786, 117.5297, 298.01, 83.87151, 115.1859, 298.01, 82.22388, 112.8422, 298.01, 81.09117, 110.4984, 298.01, 77.92969, 106.4052, 298.01, 77.3894, 105.8109, 298.01, 75.94332, 103.4672, 298.01, 71.71799, 98.77969, 298.01, 68.55469, 95.65721, 298.01, 63.86719, 91.54878, 298.01, 61.52344, 90.1121, 298.01, 59.17969, 88.15762, 298.01, 56.83594, 86.51503, 298.01, 54.49219, 85.42721, 298.01, 52.14844, 83.64907, 298.01, 49.80469, 82.89023, 298.01, 47.46094, 81.50237, 298.01, 45.11719, 80.62591, 298.01, 42.77344, 79.18153, 298.01, 40.42969, 78.7203, 298.01, 38.08594, 78.1349, 298.01, 35.74219, 77.11755, 298.01, 33.39844, 76.51949, 298.01, 31.05469, 76.07934, 298.01, 26.36719, 74.67744, 298.01, 24.02344, 74.42056, 298.01, 14.64844, 74.07317, 298.01, 9.960938, 74.11538, 298.01, 2.929688, 74.40105, 298.01, 0.5859375, 74.67952, 298.01, -1.757813, 75.31406, 298.01, -4.101563, 76.07065, 298.01, -6.445313, 76.49051, 298.01, -8.789063, 77.17276, 298.01, -11.13281, 78.20097, 298.01, -15.82031, 79.31967, 298.01, -18.16406, 80.76948, 298.01, -20.50781, 81.64266, 298.01, -22.85156, 83.0305, 298.01, -25.19531, 83.7937, 298.01, -27.53906, 85.63515, 298.01, -29.88281, 86.7363, 298.01, -32.22656, 88.36089, 298.01, -34.57031, 90.3302, 298.01, -36.56719, 91.74844, 298.01, -41.60156, 95.93605, 298.01, -46.58845, 101.1234, 298.01, -50.17995, 105.8109, 298.01, -52.10386, 108.1547, 298.01, -53.63992, 110.4984, 298.01, -54.95532, 112.8422, 298.01, -56.64794, 115.1859, 298.01, -57.4403, 117.5297, 298.01, -58.91927, 119.8734, 298.01, -59.78655, 122.2172, 298.01, -61.11754, 124.5609, 298.01, -61.58921, 126.9047, 298.01, -62.38012, 129.2484, 298.01, -63.49118, 131.5922, 298.01, -64.02599, 133.9359, 298.01, -64.3932, 136.2797, 298.01, -65.11897, 138.6234, 298.01, -65.64544, 140.9672, 298.01, -66.23938, 147.9984, 298.01, -66.46289, 152.6859, 298.01, -66.48911, 155.0297, 298.01, -66.34437, 159.7172, 298.01, -65.99894, 164.4047, 298.01, -65.49149, 169.0922, 298.01, -64.6875, 171.4359, 298.01, -63.7739, 176.1234, 298.01, -62.9398, 178.4672, 298.01, -61.86011, 180.8109, 298.01, -61.33423, 183.1547, 298.01, -60.43332, 185.4984, 298.01, -58.00781, 190.0632, 298.01, -56.85406, 192.5297, 298.01, -55.66406, 194.7283, 298.01, -54.11692, 197.2172, 298.01, -50.97656, 201.8369, 298.01, -47.36435, 206.5922, 298.01, -45.04395, 208.9359, 298.01, -42.83026, 211.2797, 298.01, -39.25781, 214.7435, 298.01, -34.57031, 218.4974, 298.01, -32.22656, 219.9595, 298.01, -28.02053, 222.9984, 298.01, -27.53906, 223.4238, 298.01, -25.19531, 224.4187, 298.01, -22.85156, 225.8252, 298.01, -20.50781, 226.9067, 298.01, -18.16406, 228.4286, 298.01, -15.82031, 229.1235, 298.01, -14.9447, 230.0297, 298.01, -15.82031, 231.3969, 298.01, -16.94484, 232.3734, 298.01 }; - size_t n = sizeof(groundTruthRaw) / sizeof(groundTruthRaw[0]); - std::vector groundTruth(groundTruthRaw, groundTruthRaw+n); - EXPECT_EQ(358u * 3, groundTruth.size()); - CheckGroundTruth(structures, 5, 8, groundTruth); - } -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -#if 0 - -TEST(StructureSet, ReadFromJsonAndCompute1) -{ - DicomStructureSet2 structureSet; - - OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); - //loader.content_.reset(new DicomStructureSet(dicom)); - structureSet.Clear(); - - structureSet.FillStructuresFromDataset(dicom); - - structureSet.ComputeDependentProperties(); -} - -TEST(StructureSet, ReadFromJsonAndCompute2) -{ - DicomStructureSet2 structureSet; - - OrthancPlugins::FullOrthancDataset dicom(GetTestJson()); - //loader.content_.reset(new DicomStructureSet(dicom)); - structureSet.Clear(); - - structureSet.SetContents(dicom); -} -#endif - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -static bool CutStructureWithPlane( - std::vector< std::pair >& segments, - const DicomStructure2& structure, - const double originX, const double originY, const double originZ, - const double axisX_X, const double axisX_Y, const double axisX_Z, - const double axisY_X, const double axisY_Y, const double axisY_Z -) -{ - // create an AXIAL cutting plane, too far away from the volume - // (> sliceThickness/2) - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, originX, originY, originZ); - LinearAlgebra::AssignVector(axisX, axisX_X, axisX_Y, axisX_Z); - LinearAlgebra::AssignVector(axisY, axisY_X, axisY_Y, axisY_Z); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - // compute intersection - bool ok = structure.Project(segments, cuttingPlane); - return ok; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -static double pointsCoord1[] = { 2, 2, 3, 3, 6, 8, 8, 7, 8, 8, 6 }; -static double pointsCoord2[] = { 2, 6, 8, 10, 12, 10, 8, 6, 4, 2, 4 }; -static const size_t pointsCoord1Count = STONE_ARRAY_SIZE(pointsCoord1); -static const size_t pointsCoord2Count = STONE_ARRAY_SIZE(pointsCoord2); -const size_t POLYGON_POINT_COUNT = pointsCoord1Count; - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -static void CreateBasicStructure(DicomStructure2& structure) -{ - // see https://www.dropbox.com/s/1o1vg53hsbvx4cc/test-rtstruct-polygons.jpg?dl=0 - EXPECT_EQ(pointsCoord1Count, pointsCoord2Count); - EXPECT_EQ(11, pointsCoord2Count); - - for (size_t slice = 0; slice < 3; ++slice) - { - DicomStructurePolygon2 polygon("Oblomptu", "CLOSED_PLANAR"); - for (size_t ip = 0; ip < pointsCoord1Count; ++ip) - { - Point3D pt; - double pt0 = pointsCoord1[ip]; - double pt1 = pointsCoord2[ip]; - double pt2 = 4 * (static_cast(slice) - 1); // -4, 0, 4 - LinearAlgebra::AssignVector(pt, pt0, pt1, pt2); - polygon.AddPoint(pt); - } - structure.AddPolygon(polygon); - } - structure.ComputeDependentProperties(); -} - - -TEST(StructureSet, CutAxialOutsideTop) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an AXIAL cutting plane, too far away from the volume - // (> sliceThickness/2) - bool ok = CutStructureWithPlane(segments, structure, - 0, 0, 7, - 1, 0, 0, - 0, 1, 0); - EXPECT_FALSE(ok); -} - - -TEST(StructureSet, CutAxialOutsideBottom) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an AXIAL cutting plane, too far away from the volume - // (> sliceThickness/2) - bool ok = CutStructureWithPlane(segments, structure, - 0, 0, -6.66, - 1, 0, 0, - 0, 1, 0); - EXPECT_FALSE(ok); -} - -TEST(StructureSet, CutAxialInsideClose) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an AXIAL cutting plane in the volume - bool ok = CutStructureWithPlane(segments, structure, - 0, 0, 1.1, - 1, 0, 0, - 0, 1, 0); - EXPECT_TRUE(ok); - EXPECT_EQ(POLYGON_POINT_COUNT, segments.size()); - - for (size_t i = 0; i < segments.size(); ++i) - { - EXPECT_LT(i, POLYGON_POINT_COUNT); - EXPECT_LT(i, POLYGON_POINT_COUNT); - - const Point2D& pt = segments[i].first; - - // ...should be at the same location as the 3D coords since the plane - // is rooted at 0,0,0 with normal 0,0,1 - EXPECT_NEAR(pt.x, pointsCoord1[i], DELTA_MAX); - EXPECT_NEAR(pt.y, pointsCoord2[i], DELTA_MAX); - } -} - - -TEST(StructureSet, CutAxialInsideFar) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an AXIAL cutting plane - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, 0, 0, 0); - LinearAlgebra::AssignVector(axisX, 1, 0, 0); - LinearAlgebra::AssignVector(axisY, 0, 1, 0); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - // compute intersection - bool ok = structure.Project(segments, cuttingPlane); - EXPECT_TRUE(ok); - - EXPECT_EQ(11, segments.size()); - for (size_t i = 0; i < segments.size(); ++i) - { - EXPECT_LT(i, pointsCoord1Count); - EXPECT_LT(i, pointsCoord2Count); - - // the 2D points of the projected polygon - const Point2D& pt = segments[i].first; - - // ...should be at the same location as the 3D coords since the plane - // is rooted at 0,0,0 with normal 0,0,1 - EXPECT_NEAR(pt.x, pointsCoord1[i], DELTA_MAX); - EXPECT_NEAR(pt.y, pointsCoord2[i], DELTA_MAX); - } -} - -TEST(StructureSet, CutCoronalOutsideClose) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an X,Z cutting plane, outside of the volume - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, 0, 0, 0); - LinearAlgebra::AssignVector(axisX, 1, 0, 0); - LinearAlgebra::AssignVector(axisY, 0, 0, 1); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - // compute intersection - bool ok = structure.Project(segments, cuttingPlane); - EXPECT_FALSE(ok); -} - -TEST(StructureSet, CutCoronalInsideClose1DTest) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - - // create an X,Z cutting plane, outside of the volume - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, 0, 3, 0); - LinearAlgebra::AssignVector(axisX, 1, 0, 0); - LinearAlgebra::AssignVector(axisY, 0, 0, 1); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - ASSERT_EQ(3u, structure.GetPolygons().size()); - - for (int i = 0; i < 3; ++i) - { - double polygonZ = static_cast(i - 1) * 4.0; - - const DicomStructurePolygon2& topSlab = structure.GetPolygons()[i]; - - // let's compute the intersection between the polygon and the plane - // intersections are in plane coords - std::vector intersects; - topSlab.ProjectOnConstantPlane(intersects, cuttingPlane); - - ASSERT_EQ(4u, intersects.size()); - - EXPECT_NEAR(2, intersects[0].x, DELTA_MAX); - EXPECT_NEAR(4, intersects[1].x, DELTA_MAX); - EXPECT_NEAR(7, intersects[2].x, DELTA_MAX); - EXPECT_NEAR(8, intersects[3].x, DELTA_MAX); - - for (size_t i = 0; i < 4u; ++i) - { - EXPECT_NEAR(polygonZ, intersects[i].y, DELTA_MAX); - } - } -} - -TEST(StructureSet, CutCoronalInsideClose) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an X,Z cutting plane, outside of the volume - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, 0, 3, 0); - LinearAlgebra::AssignVector(axisX, 1, 0, 0); - LinearAlgebra::AssignVector(axisY, 0, 0, 1); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - // compute intersection - ASSERT_TRUE(structure.Project(segments, cuttingPlane)); - EXPECT_EQ(24, segments.size()); - - size_t numberOfVeryShortSegments = 0; - for (size_t iSegment = 0; iSegment < segments.size(); ++iSegment) - { - // count the NON vertical very short segments - if (LinearAlgebra::IsNear(segments[iSegment].first.x, segments[iSegment].second.x)) - { - if (LinearAlgebra::IsNear(segments[iSegment].first.y, segments[iSegment].second.y)) - { - numberOfVeryShortSegments++; - } - } - } - EXPECT_EQ(8, numberOfVeryShortSegments); -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - -TEST(DisjointDataSet, BasicTest) -{ - const size_t ITEM_COUNT = 10; - DisjointDataSet ds(ITEM_COUNT); - - for (size_t i = 0; i < ITEM_COUNT; ++i) - { - EXPECT_EQ(i, ds.Find(i)); - } - - ds.Union(0, 4); - EXPECT_EQ(0u, ds.Find(0)); - EXPECT_EQ(0u, ds.Find(4)); - - ds.Union(4, 6); - ds.Union(8, 9); - ds.Union(0, 8); - - for (size_t i = 0; i < ITEM_COUNT; ++i) - { - size_t parent = ds.Find(i); - EXPECT_TRUE(0 == parent || 1 == parent || 2 == parent || 3 == parent || 5 == parent || 7 == parent); - } - - ds.Union(1, 2); - ds.Union(1, 7); - for (size_t i = 0; i < ITEM_COUNT; ++i) - { - size_t parent = ds.Find(i); - EXPECT_TRUE(0 == parent || 1 == parent || 3 == parent || 5 == parent); - } - - ds.Union(3, 5); - for (size_t i = 0; i < ITEM_COUNT; ++i) - { - size_t parent = ds.Find(i); - EXPECT_TRUE(0 == parent || 1 == parent || 3 == parent); - } - - EXPECT_EQ(ds.Find(0), ds.Find(0)); - EXPECT_EQ(ds.Find(0), ds.Find(4)); - EXPECT_EQ(ds.Find(0), ds.Find(6)); - EXPECT_EQ(ds.Find(0), ds.Find(8)); - EXPECT_EQ(ds.Find(0), ds.Find(8)); - - EXPECT_EQ(ds.Find(1), ds.Find(7)); - EXPECT_EQ(ds.Find(2), ds.Find(1)); - EXPECT_EQ(ds.Find(7), ds.Find(2)); - - EXPECT_EQ(ds.Find(3), ds.Find(5)); - EXPECT_EQ(ds.Find(5), ds.Find(3)); - - ds.Union(0, 1); - ds.Union(3, 1); - for (size_t i = 0; i < ITEM_COUNT; ++i) - { - EXPECT_EQ(ds.Find(0), ds.Find(i)); - } -} - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -TEST(StructureSet, CutSagittalInsideClose) -{ - DicomStructure2 structure; - CreateBasicStructure(structure); - std::vector< std::pair > segments; - - // create an X,Z cutting plane, inside of the volume - Point3D origin, axisX, axisY; - LinearAlgebra::AssignVector(origin, 0, 3, 0); - LinearAlgebra::AssignVector(axisX, 1, 0, 0); - LinearAlgebra::AssignVector(axisY, 0, 0, 1); - CoordinateSystem3D cuttingPlane(origin, axisX, axisY); - - // compute intersection - bool ok = structure.Project(segments, cuttingPlane); - EXPECT_TRUE(ok); -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - - -static size_t ConvertListOfSlabsToSegments_Add(RtStructRectanglesInSlab& rectangles, int row, double xmin, double xmax) -{ - double ymin = static_cast(row) * 5.0; - double ymax = static_cast(row + 1) * 5.0; - - RtStructRectangleInSlab rectangle; - rectangle.xmin = xmin; - rectangle.xmax = xmax; - rectangle.ymin = ymin; - rectangle.ymax = ymax; - - rectangles.push_back(rectangle); - - return 1u; -} - -static size_t FillTestRectangleList(std::vector< RtStructRectanglesInSlab >& rectanglesForEachSlab) -{ - // ConvertListOfSlabsToSegments - size_t rectCount = 0; - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 0, 5, 31); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 0, 36, 50); - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 1, 20, 45); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 1, 52, 70); - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 0, 32); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 35, 44); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 2, 60, 75); - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 3, 10, 41); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 3, 46, 80); - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 4, 34, 42); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 4, 90, 96); - - rectanglesForEachSlab.push_back(RtStructRectanglesInSlab()); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 1, 33); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 40, 43); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 51, 61); - rectCount += ConvertListOfSlabsToSegments_Add(rectanglesForEachSlab.back(), 5, 76, 95); - - return rectCount; -} - -/* -void AddSlabBoundaries( - std::vector >& boundaries, - const std::vector& slabCuts, size_t iSlab) -*/ - - -/* -void ProcessBoundaryList( - std::vector< std::pair >& segments, - const std::vector >& boundaries, - double y) -*/ - - -TEST(StructureSet, ProcessBoundaryList_Empty) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - - boundaries.clear(); - EXPECT_NO_THROW(AddSlabBoundaries(boundaries, slabCuts, 0)); - ASSERT_EQ(0u, boundaries.size()); -} - -TEST(StructureSet, ProcessBoundaryListTopRow) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - FillTestRectangleList(slabCuts); - - boundaries.clear(); - AddSlabBoundaries(boundaries, slabCuts, 0); - - { - size_t i = 0; - ASSERT_EQ(4u, boundaries.size()); - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(5, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(31, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(36, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(50, boundaries[i].first, DELTA_MAX); - i++; - } -} - -TEST(StructureSet, ProcessBoundaryListRows_0_and_1) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - FillTestRectangleList(slabCuts); - - boundaries.clear(); - AddSlabBoundaries(boundaries, slabCuts, 0); - AddSlabBoundaries(boundaries, slabCuts, 1); - - ASSERT_EQ(8u, boundaries.size()); - - { - size_t i = 0; - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(5, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(20, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(31, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(36, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(45, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(50, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_Start, boundaries[i].second); - ASSERT_NEAR(52, boundaries[i].first, DELTA_MAX); - i++; - - ASSERT_EQ(RectangleBoundaryKind_End, boundaries[i].second); - ASSERT_NEAR(70, boundaries[i].first, DELTA_MAX); - i++; - } -} - -TEST(StructureSet, ConvertListOfSlabsToSegments_EmptyBoundaries) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - FillTestRectangleList(slabCuts); - boundaries.clear(); - std::vector< std::pair > segments; - ASSERT_NO_THROW(ProcessBoundaryList(segments, boundaries, 42.0)); - ASSERT_EQ(0u, segments.size()); -} - -TEST(StructureSet, ConvertListOfSlabsToSegments_TopRow_Horizontal) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - FillTestRectangleList(slabCuts); - - // top row - { - std::vector< std::pair > segments; - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, 0); - ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); - - ASSERT_EQ(2u, segments.size()); - - ASSERT_NEAR( 5.0, segments[0].first.x, DELTA_MAX); - ASSERT_NEAR(31.0, segments[0].second.x, DELTA_MAX); - ASSERT_NEAR( 0.0, segments[0].first.y, DELTA_MAX); - ASSERT_NEAR( 0.0, segments[0].second.y, DELTA_MAX); - - ASSERT_NEAR(36.0, segments[1].first.x, DELTA_MAX); - ASSERT_NEAR(50.0, segments[1].second.x, DELTA_MAX); - ASSERT_NEAR( 0.0, segments[1].first.y, DELTA_MAX); - ASSERT_NEAR( 0.0, segments[1].second.y, DELTA_MAX); - } -} - -TEST(StructureSet, ConvertListOfSlabsToSegments_All_Horizontal) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - FillTestRectangleList(slabCuts); - - // top row - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, 0); - std::vector< std::pair > segments; - ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymin); - } - - // mids - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, 0); - AddSlabBoundaries(boundaries, slabCuts, 1); - std::vector< std::pair > segments; - ProcessBoundaryList(segments, boundaries, slabCuts[0][0].ymax); - - ASSERT_EQ(4u, segments.size()); - - ASSERT_NEAR(05.0, segments[0].first.x, DELTA_MAX); - ASSERT_NEAR(20.0, segments[0].second.x, DELTA_MAX); - ASSERT_NEAR(05.0, segments[0].first.y, DELTA_MAX); - ASSERT_NEAR(05.0, segments[0].second.y, DELTA_MAX); - - ASSERT_NEAR(31.0, segments[1].first.x, DELTA_MAX); - ASSERT_NEAR(36.0, segments[1].second.x, DELTA_MAX); - ASSERT_NEAR(05.0, segments[1].first.y, DELTA_MAX); - ASSERT_NEAR(05.0, segments[1].second.y, DELTA_MAX); - - ASSERT_NEAR(45.0, segments[2].first.x, DELTA_MAX); - ASSERT_NEAR(50.0, segments[2].second.x, DELTA_MAX); - ASSERT_NEAR(05.0, segments[2].first.y, DELTA_MAX); - ASSERT_NEAR(05.0, segments[2].second.y, DELTA_MAX); - - ASSERT_NEAR(52.0, segments[3].first.x, DELTA_MAX); - ASSERT_NEAR(70.0, segments[3].second.x, DELTA_MAX); - ASSERT_NEAR(05.0, segments[3].first.y, DELTA_MAX); - ASSERT_NEAR(05.0, segments[3].second.y, DELTA_MAX); - } - - // bottom row - { - std::vector > boundaries; - AddSlabBoundaries(boundaries, slabCuts, 1); - std::vector< std::pair > segments; - ProcessBoundaryList(segments, boundaries, slabCuts[1][0].ymax); - - ASSERT_EQ(2u, segments.size()); - - ASSERT_NEAR(20.0, segments[0].first.x, DELTA_MAX); - ASSERT_NEAR(45.0, segments[0].second.x, DELTA_MAX); - ASSERT_NEAR(10.0, segments[0].first.y, DELTA_MAX); - ASSERT_NEAR(10.0, segments[0].second.y, DELTA_MAX); - - ASSERT_NEAR(52.0, segments[1].first.x, DELTA_MAX); - ASSERT_NEAR(70.0, segments[1].second.x, DELTA_MAX); - ASSERT_NEAR(10.0, segments[1].first.y, DELTA_MAX); - ASSERT_NEAR(10.0, segments[1].second.y, DELTA_MAX); - } - -} - -TEST(StructureSet, ConvertListOfSlabsToSegments_Complete_Empty) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - - std::vector< std::pair > segments; - - ASSERT_NO_THROW(ConvertListOfSlabsToSegments(segments, slabCuts, 0)); - ASSERT_EQ(0u, segments.size()); -} - -TEST(StructureSet, ConvertListOfSlabsToSegments_Complete_Regular) -{ - std::vector< RtStructRectanglesInSlab > slabCuts; - std::vector > boundaries; - size_t totalRectCount = FillTestRectangleList(slabCuts); - - std::vector< std::pair > segments; - - ASSERT_NO_THROW(ConvertListOfSlabsToSegments(segments, slabCuts, totalRectCount)); - ASSERT_EQ(60u, segments.size()); - - size_t i = 0; - - ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 31.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 31.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 36.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 36.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 50.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 45.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 45.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 52.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 70.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 70.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 32.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 35.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 44.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 44.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 60.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 75.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 75.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 41.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 46.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 80.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 34.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 34.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 42.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 42.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 90.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 90.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 96.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 1.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 33.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 40.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 40.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 43.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 51.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 61.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 76.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 95.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 95.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 31.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 0.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 36.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 0.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 31.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 36.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 45.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 50.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 5.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 70.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 5.0000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 44.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 45.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 52.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 70.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 75.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 10.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 0.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 32.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 35.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 44.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 60.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 75.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 15.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 15.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 10.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 34.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 41.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 42.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 46.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 80.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 90.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 20.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 20.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 34.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 40.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 42.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 90.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 95.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 25.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 96.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 25.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 1.0000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 33.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 40.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 43.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 51.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 61.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); - i++; - ASSERT_NEAR(segments[i].first.x, 76.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].first.y, 30.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.x, 95.000000000000000, DELTA_MAX); - ASSERT_NEAR(segments[i].second.y, 30.000000000000000, DELTA_MAX); -} - -#ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -TEST(StructureSet, ReadFromJsonPart2) -{ - DicomStructureSet2 structureSet; - std::string jsonText; - - SystemToolbox::ReadFile(jsonText, "72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661.json"); - - OrthancPlugins::FullOrthancDataset dicom(jsonText); - //loader.content_.reset(new DicomStructureSet(dicom)); - structureSet.Clear(); - - structureSet.FillStructuresFromDataset(dicom); - structureSet.ComputeDependentProperties(); - - const std::vector& structures = structureSet.structures_; -} - -#endif -// BGO_ENABLE_DICOMSTRUCTURESETLOADER2 - -namespace -{ - void Initialize(const char* orthancApiUrl, OrthancStone::ILoadersContext& loadersContext) - { - Orthanc::WebServiceParameters p; - - OrthancStone::GenericLoadersContext& typedLoadersContext = - dynamic_cast(loadersContext); - // Default is http://localhost:8042 - // Here's how you may change it - p.SetUrl(orthancApiUrl); - p.SetCredentials("orthanc", "orthanc"); - typedLoadersContext.SetOrthancParameters(p); - - typedLoadersContext.StartOracle(); - } - - void Exitialize(OrthancStone::ILoadersContext& loadersContext) - { - OrthancStone::GenericLoadersContext& typedLoadersContext = - dynamic_cast(loadersContext); - - typedLoadersContext.StopOracle(); - } - - -#if 0 - class TestObserver : public ObserverBase - { - public: - TestObserver() {}; - - virtual void Handle - - }; -#endif - -} - -TEST(StructureSet, DISABLED_StructureSetLoader_injection_feature_2020_05_10) -{ - namespace pt = boost::posix_time; - - std::unique_ptr loadersContext(new OrthancStone::GenericLoadersContext(1,4,1)); - Initialize("http://localhost:8042/", *loadersContext); - - boost::shared_ptr loader = DicomStructureSetLoader::Create(*loadersContext); - - // replace with Orthanc ID of an uploaded RTSTRUCT instance! - loader->LoadInstanceFullVisibility("72c773ac-5059f2c4-2e6a9120-4fd4bca1-45701661"); - - bool bContinue(true); - - pt::ptime initialTime = pt::second_clock::local_time(); - - while (bContinue) - { - bContinue = !loader->AreStructuresReady(); - boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); - - { - pt::ptime nowTime = pt::second_clock::local_time(); - pt::time_duration diff = nowTime - initialTime; - double seconds = static_cast(diff.total_milliseconds()) * 0.001; - std::cout << seconds << " seconds elapsed...\n"; - if (seconds > 30) - { - std::cout << "More than 30 seconds elapsed... Aborting test :(\n"; - //GTEST_FATAL_FAILURE_("More than 30 seconds elapsed... Aborting test :("); - //bContinue = false; - } - } - } -} - -class SliceProcessor : - public OrthancStone::OrthancSeriesVolumeProgressiveLoader::ISlicePostProcessor, - public OrthancStone::DicomStructureSetLoader::IInstanceLookupHandler -{ -public: - SliceProcessor(OrthancStone::DicomStructureSetLoader& structLoader) : structLoader_(structLoader) - { - } - - virtual void ProcessCTDicomSlice(const Orthanc::DicomMap& instance) ORTHANC_OVERRIDE - { - std::string sopInstanceUid; - if (!instance.LookupStringValue(sopInstanceUid, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Missing SOPInstanceUID in a DICOM instance"); - } - slicesDicom_[sopInstanceUid] = boost::shared_ptr(instance.Clone()); - } - - virtual void RetrieveReferencedSlices(const std::set& nonEmptyInstances) ORTHANC_OVERRIDE - { - for (std::set::const_iterator it = nonEmptyInstances.begin(); - it != nonEmptyInstances.end(); - ++it) - { - const std::string nonEmptyInstance = *it; - if (slicesDicom_.find(nonEmptyInstance) == slicesDicom_.end()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat, "Referenced SOPInstanceUID not found in CT"); - } - boost::shared_ptr instance = slicesDicom_[nonEmptyInstance]; - structLoader_.AddReferencedSlice(*instance); - } - } - - OrthancStone::DicomStructureSetLoader& structLoader_; - std::map > slicesDicom_; -}; - -void LoadCtSeriesBlocking(boost::shared_ptr ctLoader, std::string seriesId) -{ - namespace pt = boost::posix_time; - - // Load the CT - ctLoader->LoadSeries(seriesId); - - // Wait for CT to be loaded - pt::ptime initialTime = pt::second_clock::local_time(); - { - bool bContinue(true); - while (bContinue) - { - bContinue = !ctLoader->IsVolumeImageReadyInHighQuality(); - boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); - - { - pt::ptime nowTime = pt::second_clock::local_time(); - pt::time_duration diff = nowTime - initialTime; - double seconds = static_cast(diff.total_milliseconds()) * 0.001; - std::cout << seconds << " seconds elapsed...\n"; - if (seconds > 30) - { - const char* msg = "More than 30 seconds elapsed when waiting for CT... Aborting test :(\n"; - GTEST_FATAL_FAILURE_(msg); - bContinue = false; - } - } - } - } -} - - -/** -Will fill planes -*/ -void GetCTPlanes(std::vector& planes, - OrthancStone::VolumeProjection projection, - boost::shared_ptr ctLoader) -{ - planes.clear(); // inefficient : we don't care - - const VolumeImageGeometry& geometry = ctLoader->GetImageGeometry(); - const unsigned int depth = geometry.GetProjectionDepth(projection); - - planes.resize(depth); - - for (unsigned int z = 0; z < depth; z++) - { - planes[z] = geometry.GetProjectionSlice(projection, z); - } -} - -void LoadRtStructBlocking(boost::shared_ptr structLoader, std::string instanceId) -{ - namespace pt = boost::posix_time; - - // Load RTSTRUCT - structLoader->LoadInstanceFullVisibility(instanceId); - - pt::ptime initialTime = pt::second_clock::local_time(); - - // Wait for the loading process to complete - { - bool bContinue(true); - while (bContinue) - { - bContinue = !structLoader->AreStructuresReady(); - boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); - - { - pt::ptime nowTime = pt::second_clock::local_time(); - pt::time_duration diff = nowTime - initialTime; - double seconds = static_cast(diff.total_milliseconds()) * 0.001; - std::cout << seconds << " seconds elapsed...\n"; - if (seconds > 30) - { - const char* msg = "More than 30 seconds elapsed when waiting for RTSTRUCT... Aborting test :(\n"; - GTEST_FATAL_FAILURE_(msg); - bContinue = false; - } - } - } - } -} - -TEST(StructureSet, DISABLED_Integration_Compound_CT_Struct_Loading) -{ - const double TOLERANCE = 0.0000001; - - // create loaders context - std::unique_ptr loadersContext(new OrthancStone::GenericLoadersContext(1,4,1)); - Initialize("http://localhost:8042/", *loadersContext); - - const char* ctSeriesId = "a04ecf01-79b2fc33-58239f7e-ad9db983-28e81afa"; - const char* rtStructInstanceId = "54460695-ba3885ee-ddf61ac0-f028e31d-a6e474d9"; - - // we'll compare normal loading and optimized loading with SliceProcessor to store the dicom - - boost::shared_ptr normalStructLoader; - boost::shared_ptr optimizedStructLoader; - - { - // Create the CT volume - boost::shared_ptr volume = boost::make_shared(); - - // Create CT loader - boost::shared_ptr ctLoader = - OrthancStone::OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext, volume); - - // Create struct loader - normalStructLoader = OrthancStone::DicomStructureSetLoader::Create(*loadersContext); - - // Load the CT - LoadCtSeriesBlocking(ctLoader, ctSeriesId); - - const OrthancStone::VolumeImageGeometry& imageGeometry = ctLoader->GetImageGeometry(); - unsigned int width = imageGeometry.GetWidth(); - EXPECT_EQ(512u, width); - unsigned int height = imageGeometry.GetHeight(); - EXPECT_EQ(512u, height); - unsigned int depth = imageGeometry.GetDepth(); - EXPECT_EQ(109u, depth); - - // Load the RTStruct - LoadRtStructBlocking(normalStructLoader, rtStructInstanceId); - } - - std::vector axialPlanes; - std::vector coronalPlanes; - std::vector sagittalPlanes; - - { - // Create the CT volume - boost::shared_ptr volume = boost::make_shared(); - - // Create CT loader - boost::shared_ptr ctLoader = - OrthancStone::OrthancSeriesVolumeProgressiveLoader::Create(*loadersContext, volume); - - // Create struct loader - optimizedStructLoader = OrthancStone::DicomStructureSetLoader::Create(*loadersContext); - - // create the slice processor / instance lookup - boost::shared_ptr sliceProcessor(new SliceProcessor(*optimizedStructLoader)); - - // Inject it into CT loader - ctLoader->SetDicomSlicePostProcessor(sliceProcessor); - - // Inject it into RTSTRUCT loader - optimizedStructLoader->SetInstanceLookupHandler(sliceProcessor); - - // Load the CT - LoadCtSeriesBlocking(ctLoader, ctSeriesId); - - // now, the slices are collected. let's do some checks - EXPECT_EQ(109u, sliceProcessor->slicesDicom_.size()); - - // Load the RTStruct - LoadRtStructBlocking(optimizedStructLoader, rtStructInstanceId); - - GetCTPlanes(axialPlanes, VolumeProjection_Axial, ctLoader); - GetCTPlanes(coronalPlanes, VolumeProjection_Coronal, ctLoader); - GetCTPlanes(sagittalPlanes, VolumeProjection_Sagittal, ctLoader); - } - - // DO NOT DELETE THOSE! - OrthancStone::DicomStructureSet* normalContent = normalStructLoader->GetContent(); - OrthancStone::DicomStructureSet* optimizedContent = optimizedStructLoader->GetContent(); - - EXPECT_EQ(normalContent->GetStructuresCount(), optimizedContent->GetStructuresCount()); - - /*void GetCTPlanes(std::vector& planes, - OrthancStone::VolumeProjection projection, - boost::shared_ptr ctLoader)*/ - - - std::vector allPlanes; - - // let's gather all the possible cutting planes in a single struct - for (size_t i = 0; i < axialPlanes.size(); ++i) - allPlanes.push_back(axialPlanes[i]); - - for (size_t i = 0; i < coronalPlanes.size(); ++i) - allPlanes.push_back(coronalPlanes[i]); - - for (size_t i = 0; i < sagittalPlanes.size(); ++i) - allPlanes.push_back(sagittalPlanes[i]); - - for (size_t i = 0; i < normalContent->GetStructuresCount(); ++i) - { - std::cout << "Testing structure (" << i << "/" << normalContent->GetStructuresCount() << ")\n"; - Vector structureCenter1 = normalContent->GetStructureCenter(i); - const std::string& structureName1 = normalContent->GetStructureName(i); - const std::string& structureInterpretation1 = normalContent->GetStructureInterpretation(i); - Color structureColor1 = normalContent->GetStructureColor(i); - - Vector structureCenter2 = optimizedContent->GetStructureCenter(i); - const std::string& structureName2 = optimizedContent->GetStructureName(i); - const std::string& structureInterpretation2 = optimizedContent->GetStructureInterpretation(i); - Color structureColor2 = optimizedContent->GetStructureColor(i); - - EXPECT_NEAR(structureCenter1[0], structureCenter2[0], TOLERANCE); - EXPECT_NEAR(structureCenter1[1], structureCenter2[1], TOLERANCE); - EXPECT_NEAR(structureCenter1[2], structureCenter2[2], TOLERANCE); - - EXPECT_EQ(structureName1, structureName2); - EXPECT_EQ(structureInterpretation1, structureInterpretation2); - EXPECT_EQ(structureColor1.GetRed(), structureColor2.GetRed()); - EXPECT_EQ(structureColor1.GetGreen(), structureColor2.GetGreen()); - EXPECT_EQ(structureColor1.GetBlue(), structureColor2.GetBlue()); - - // "random" walk through the planes. Processing them all takes too long (~ 1 min) - for (size_t j = 0; j < allPlanes.size(); j += 37) - { - const OrthancStone::CoordinateSystem3D& plane = allPlanes[j]; - - std::vector< std::pair > segments1; - std::vector< std::pair > segments2; - - bool ok1 = normalContent->ProjectStructure(segments1, i, plane); - bool ok2 = optimizedContent->ProjectStructure(segments2, i, plane); - - // checks here - EXPECT_EQ(ok1, ok2); - EXPECT_EQ(segments1.size(), segments2.size()); - - for (size_t k = 0; k < segments1.size(); ++k) - { - EXPECT_NEAR(segments1[k].first.x, segments2[k].first.x, TOLERANCE); - EXPECT_NEAR(segments1[k].first.y, segments2[k].first.y, TOLERANCE); - EXPECT_NEAR(segments1[k].second.x, segments2[k].second.x, TOLERANCE); - EXPECT_NEAR(segments1[k].second.y, segments2[k].second.y, TOLERANCE); - } - } - } - - Exitialize(*loadersContext); -} diff -r 9dfeee74c1e6 -r 244ad1e4e76a UnitTestsSources/UnitTestsMain.cpp --- a/UnitTestsSources/UnitTestsMain.cpp Tue Jul 07 10:02:59 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,894 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2020 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include - -#include "../Framework/StoneInitialization.h" -#include "../Framework/Toolbox/FiniteProjectiveCamera.h" -#include "../Framework/Toolbox/GeometryToolbox.h" -#include "../Framework/Volumes/ImageBuffer3D.h" -#include "../Framework/Loaders/LoaderCache.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - - -TEST(GeometryToolbox, Interpolation) -{ - using namespace OrthancStone::GeometryToolbox; - - // https://en.wikipedia.org/wiki/Bilinear_interpolation#Application_in_image_processing - ASSERT_FLOAT_EQ(146.1f, ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 91, 210, 162, 95)); - - ASSERT_FLOAT_EQ(91, ComputeBilinearInterpolationUnitSquare(0, 0, 91, 210, 162, 95)); - ASSERT_FLOAT_EQ(210, ComputeBilinearInterpolationUnitSquare(1, 0, 91, 210, 162, 95)); - ASSERT_FLOAT_EQ(162, ComputeBilinearInterpolationUnitSquare(0, 1, 91, 210, 162, 95)); - ASSERT_FLOAT_EQ(95, ComputeBilinearInterpolationUnitSquare(1, 1, 91, 210, 162, 95)); - - ASSERT_FLOAT_EQ(123.35f, ComputeTrilinearInterpolationUnitSquare - (0.5f, 0.2f, 0.7f, - 91, 210, 162, 95, - 51, 190, 80, 92)); - - ASSERT_FLOAT_EQ(ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 91, 210, 162, 95), - ComputeTrilinearInterpolationUnitSquare(0.5f, 0.2f, 0, - 91, 210, 162, 95, - 51, 190, 80, 92)); - - ASSERT_FLOAT_EQ(ComputeBilinearInterpolationUnitSquare(0.5f, 0.2f, 51, 190, 80, 92), - ComputeTrilinearInterpolationUnitSquare(0.5f, 0.2f, 1, - 91, 210, 162, 95, - 51, 190, 80, 92)); -} - - -static bool CompareMatrix(const OrthancStone::Matrix& a, - const OrthancStone::Matrix& b, - double threshold = 0.00000001) -{ - if (a.size1() != b.size1() || - a.size2() != b.size2()) - { - return false; - } - - for (size_t i = 0; i < a.size1(); i++) - { - for (size_t j = 0; j < a.size2(); j++) - { - if (fabs(a(i, j) - b(i, j)) > threshold) - { - LOG(ERROR) << "Too large difference in component (" - << i << "," << j << "): " << a(i,j) << " != " << b(i,j); - return false; - } - } - } - - return true; -} - - -static bool CompareVector(const OrthancStone::Vector& a, - const OrthancStone::Vector& b, - double threshold = 0.00000001) -{ - if (a.size() != b.size()) - { - return false; - } - - for (size_t i = 0; i < a.size(); i++) - { - if (fabs(a(i) - b(i)) > threshold) - { - LOG(ERROR) << "Too large difference in component " - << i << ": " << a(i) << " != " << b(i); - return false; - } - } - - return true; -} - - - -TEST(FiniteProjectiveCamera, Decomposition1) -{ - // Example 6.2 of "Multiple View Geometry in Computer Vision - 2nd - // edition" (page 163) - const double p[12] = { - 3.53553e+2, 3.39645e+2, 2.77744e+2, -1.44946e+6, - -1.03528e+2, 2.33212e+1, 4.59607e+2, -6.32525e+5, - 7.07107e-1, -3.53553e-1, 6.12372e-1, -9.18559e+2 - }; - - OrthancStone::FiniteProjectiveCamera camera(p); - ASSERT_EQ(3u, camera.GetMatrix().size1()); - ASSERT_EQ(4u, camera.GetMatrix().size2()); - ASSERT_EQ(3u, camera.GetIntrinsicParameters().size1()); - ASSERT_EQ(3u, camera.GetIntrinsicParameters().size2()); - ASSERT_EQ(3u, camera.GetRotation().size1()); - ASSERT_EQ(3u, camera.GetRotation().size2()); - ASSERT_EQ(3u, camera.GetCenter().size()); - - ASSERT_NEAR(1000.0, camera.GetCenter()[0], 0.01); - ASSERT_NEAR(2000.0, camera.GetCenter()[1], 0.01); - ASSERT_NEAR(1500.0, camera.GetCenter()[2], 0.01); - - ASSERT_NEAR(468.2, camera.GetIntrinsicParameters() (0, 0), 0.1); - ASSERT_NEAR(91.2, camera.GetIntrinsicParameters() (0, 1), 0.1); - ASSERT_NEAR(300.0, camera.GetIntrinsicParameters() (0, 2), 0.1); - ASSERT_NEAR(427.2, camera.GetIntrinsicParameters() (1, 1), 0.1); - ASSERT_NEAR(200.0, camera.GetIntrinsicParameters() (1, 2), 0.1); - ASSERT_NEAR(1.0, camera.GetIntrinsicParameters() (2, 2), 0.1); - - ASSERT_NEAR(0, camera.GetIntrinsicParameters() (1, 0), 0.0000001); - ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 0), 0.0000001); - ASSERT_NEAR(0, camera.GetIntrinsicParameters() (2, 1), 0.0000001); - - ASSERT_NEAR(0.41380, camera.GetRotation() (0, 0), 0.00001); - ASSERT_NEAR(0.90915, camera.GetRotation() (0, 1), 0.00001); - ASSERT_NEAR(0.04708, camera.GetRotation() (0, 2), 0.00001); - ASSERT_NEAR(-0.57338, camera.GetRotation() (1, 0), 0.00001); - ASSERT_NEAR(0.22011, camera.GetRotation() (1, 1), 0.00001); - ASSERT_NEAR(0.78917, camera.GetRotation() (1, 2), 0.00001); - ASSERT_NEAR(0.70711, camera.GetRotation() (2, 0), 0.00001); - ASSERT_NEAR(-0.35355, camera.GetRotation() (2, 1), 0.00001); - ASSERT_NEAR(0.61237, camera.GetRotation() (2, 2), 0.00001); - - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); - - OrthancStone::FiniteProjectiveCamera camera2(camera.GetIntrinsicParameters(), - camera.GetRotation(), - camera.GetCenter()); - - ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix())); - ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters())); - ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation())); - ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter())); -} - - -TEST(FiniteProjectiveCamera, Decomposition2) -{ - const double p[] = { 1188.111986, 580.205341, -808.445330, 128000.000000, -366.466264, 1446.510501, 418.499736, 128000.000000, -0.487118, 0.291726, -0.823172, 500.000000 }; - const double k[] = { -1528.494743, 0.000000, 256.000000, 0.000000, 1528.494743, 256.000000, 0.000000, 0.000000, 1.000000 }; - const double r[] = { -0.858893, -0.330733, 0.391047, -0.158171, 0.897503, 0.411668, -0.487118, 0.291726, -0.823172 }; - const double c[] = { 243.558936, -145.863085, 411.585964 }; - - OrthancStone::FiniteProjectiveCamera camera(p); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); - - OrthancStone::FiniteProjectiveCamera camera2(k, r, c); - ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix(), 1)); - ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters(), 0.001)); - ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation(), 0.000001)); - ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter(), 0.0001)); -} - - -TEST(FiniteProjectiveCamera, Decomposition3) -{ - const double p[] = { 10, 0, 0, 0, - 0, 20, 0, 0, - 0, 0, 30, 0 }; - - OrthancStone::FiniteProjectiveCamera camera(p); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); - ASSERT_DOUBLE_EQ(10, camera.GetIntrinsicParameters() (0, 0)); - ASSERT_DOUBLE_EQ(20, camera.GetIntrinsicParameters() (1, 1)); - ASSERT_DOUBLE_EQ(30, camera.GetIntrinsicParameters() (2, 2)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (0, 0)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 2)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (0)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (1)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (2)); -} - - -TEST(FiniteProjectiveCamera, Decomposition4) -{ - const double p[] = { 1, 0, 0, 10, - 0, 1, 0, 20, - 0, 0, 1, 30 }; - - OrthancStone::FiniteProjectiveCamera camera(p); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); - ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (0, 0)); - ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (1, 1)); - ASSERT_DOUBLE_EQ(1, camera.GetIntrinsicParameters() (2, 2)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (0, 0)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 2)); - ASSERT_DOUBLE_EQ(-10, camera.GetCenter() (0)); - ASSERT_DOUBLE_EQ(-20, camera.GetCenter() (1)); - ASSERT_DOUBLE_EQ(-30, camera.GetCenter() (2)); -} - - -TEST(FiniteProjectiveCamera, Decomposition5) -{ - const double p[] = { 0, 0, 10, 0, - 0, 20, 0, 0, - 30, 0, 0, 0 }; - - OrthancStone::FiniteProjectiveCamera camera(p); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(camera.GetRotation())); - ASSERT_DOUBLE_EQ(-10, camera.GetIntrinsicParameters() (0, 0)); - ASSERT_DOUBLE_EQ(20, camera.GetIntrinsicParameters() (1, 1)); - ASSERT_DOUBLE_EQ(30, camera.GetIntrinsicParameters() (2, 2)); - ASSERT_DOUBLE_EQ(-1, camera.GetRotation() (0, 2)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (1, 1)); - ASSERT_DOUBLE_EQ(1, camera.GetRotation() (2, 0)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (0)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (1)); - ASSERT_DOUBLE_EQ(0, camera.GetCenter() (2)); - - OrthancStone::FiniteProjectiveCamera camera2(camera.GetIntrinsicParameters(), - camera.GetRotation(), - camera.GetCenter()); - ASSERT_TRUE(CompareMatrix(camera.GetMatrix(), camera2.GetMatrix())); - ASSERT_TRUE(CompareMatrix(camera.GetIntrinsicParameters(), camera2.GetIntrinsicParameters())); - ASSERT_TRUE(CompareMatrix(camera.GetRotation(), camera2.GetRotation())); - ASSERT_TRUE(CompareVector(camera.GetCenter(), camera2.GetCenter())); -} - - -static double GetCosAngle(const OrthancStone::Vector& a, - const OrthancStone::Vector& b) -{ - // Returns the cosine of the angle between two vectors - // https://en.wikipedia.org/wiki/Dot_product#Geometric_definition - return boost::numeric::ublas::inner_prod(a, b) / - (boost::numeric::ublas::norm_2(a) * boost::numeric::ublas::norm_2(b)); -} - - -TEST(FiniteProjectiveCamera, Ray) -{ - const double pp[] = { -1499.650894, 2954.618773, -259.737419, 637891.819097, - -2951.517707, -1501.019129, -285.785281, 637891.819097, - 0.008528, 0.003067, -0.999959, 2491.764918 }; - - const OrthancStone::FiniteProjectiveCamera camera(pp); - - ASSERT_NEAR(-21.2492, camera.GetCenter() (0), 0.0001); - ASSERT_NEAR(-7.64234, camera.GetCenter() (1), 0.00001); - ASSERT_NEAR(2491.66, camera.GetCenter() (2), 0.01); - - // Image plane that led to these parameters, with principal point at - // (256,256). The image has dimensions 512x512. - OrthancStone::Vector o = - OrthancStone::LinearAlgebra::CreateVector(7.009620, 2.521030, -821.942000); - OrthancStone::Vector ax = - OrthancStone::LinearAlgebra::CreateVector(-0.453219, 0.891399, -0.001131); - OrthancStone::Vector ay = - OrthancStone::LinearAlgebra::CreateVector(-0.891359, -0.453210, -0.008992); - - OrthancStone::CoordinateSystem3D imagePlane(o, ax, ay); - - // Back-projection of the principal point - { - OrthancStone::Vector ray = camera.GetRayDirection(256, 256); - - // The principal axis vector is orthogonal to the image plane - // (i.e. parallel to the plane normal), in the opposite direction - // ("-1" corresponds to "cos(pi)"). - ASSERT_NEAR(-1, GetCosAngle(ray, imagePlane.GetNormal()), 0.0000001); - - // Forward projection of principal axis, resulting in the principal point - double x, y; - camera.ApplyFinite(x, y, camera.GetCenter() - ray); - - ASSERT_NEAR(256, x, 0.00001); - ASSERT_NEAR(256, y, 0.00001); - } - - // Back-projection of the 4 corners of the image - std::vector cx, cy; - cx.push_back(0); - cy.push_back(0); - cx.push_back(512); - cy.push_back(0); - cx.push_back(512); - cy.push_back(512); - cx.push_back(0); - cy.push_back(512); - - bool first = true; - double angle; - - for (size_t i = 0; i < cx.size(); i++) - { - OrthancStone::Vector ray = camera.GetRayDirection(cx[i], cy[i]); - - // Check that the angle wrt. principal axis is the same for all - // the 4 corners - double a = GetCosAngle(ray, imagePlane.GetNormal()); - if (first) - { - first = false; - angle = a; - } - else - { - ASSERT_NEAR(angle, a, 0.000001); - } - - // Forward projection of the ray, going back to the original point - double x, y; - camera.ApplyFinite(x, y, camera.GetCenter() - ray); - - ASSERT_NEAR(cx[i], x, 0.00001); - ASSERT_NEAR(cy[i], y, 0.00001); - - // Alternative construction, by computing the intersection of the - // ray with the image plane - OrthancStone::Vector p; - ASSERT_TRUE(imagePlane.IntersectLine(p, camera.GetCenter(), -ray)); - imagePlane.ProjectPoint(x, y, p); - ASSERT_NEAR(cx[i], x + 256, 0.01); - ASSERT_NEAR(cy[i], y + 256, 0.01); - } -} - - -TEST(Matrix, Inverse1) -{ - OrthancStone::Matrix a, b; - - a.resize(0, 0); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(0u, b.size1()); - ASSERT_EQ(0u, b.size2()); - - a.resize(2, 3); - ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException); - - a.resize(1, 1); - a(0, 0) = 45.0; - - ASSERT_DOUBLE_EQ(45, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(1u, b.size1()); - ASSERT_EQ(1u, b.size2()); - ASSERT_DOUBLE_EQ(1.0 / 45.0, b(0, 0)); - - a(0, 0) = 0; - ASSERT_DOUBLE_EQ(0, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException); -} - - -TEST(Matrix, Inverse2) -{ - OrthancStone::Matrix a, b; - a.resize(2, 2); - a(0, 0) = 4; - a(0, 1) = 3; - a(1, 0) = 3; - a(1, 1) = 2; - - ASSERT_DOUBLE_EQ(-1, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(2u, b.size1()); - ASSERT_EQ(2u, b.size2()); - - ASSERT_DOUBLE_EQ(-2, b(0, 0)); - ASSERT_DOUBLE_EQ(3, b(0, 1)); - ASSERT_DOUBLE_EQ(3, b(1, 0)); - ASSERT_DOUBLE_EQ(-4, b(1, 1)); - - a(0, 0) = 1; - a(0, 1) = 2; - a(1, 0) = 3; - a(1, 1) = 4; - - ASSERT_DOUBLE_EQ(-2, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - - ASSERT_DOUBLE_EQ(-2, b(0, 0)); - ASSERT_DOUBLE_EQ(1, b(0, 1)); - ASSERT_DOUBLE_EQ(1.5, b(1, 0)); - ASSERT_DOUBLE_EQ(-0.5, b(1, 1)); -} - - -TEST(Matrix, Inverse3) -{ - OrthancStone::Matrix a, b; - a.resize(3, 3); - a(0, 0) = 7; - a(0, 1) = 2; - a(0, 2) = 1; - a(1, 0) = 0; - a(1, 1) = 3; - a(1, 2) = -1; - a(2, 0) = -3; - a(2, 1) = 4; - a(2, 2) = -2; - - ASSERT_DOUBLE_EQ(1, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(3u, b.size1()); - ASSERT_EQ(3u, b.size2()); - - ASSERT_DOUBLE_EQ(-2, b(0, 0)); - ASSERT_DOUBLE_EQ(8, b(0, 1)); - ASSERT_DOUBLE_EQ(-5, b(0, 2)); - ASSERT_DOUBLE_EQ(3, b(1, 0)); - ASSERT_DOUBLE_EQ(-11, b(1, 1)); - ASSERT_DOUBLE_EQ(7, b(1, 2)); - ASSERT_DOUBLE_EQ(9, b(2, 0)); - ASSERT_DOUBLE_EQ(-34, b(2, 1)); - ASSERT_DOUBLE_EQ(21, b(2, 2)); - - - a(0, 0) = 1; - a(0, 1) = 2; - a(0, 2) = 2; - a(1, 0) = 1; - a(1, 1) = 0; - a(1, 2) = 1; - a(2, 0) = 1; - a(2, 1) = 2; - a(2, 2) = 1; - - ASSERT_DOUBLE_EQ(2, OrthancStone::LinearAlgebra::ComputeDeterminant(a)); - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(3u, b.size1()); - ASSERT_EQ(3u, b.size2()); - - ASSERT_DOUBLE_EQ(-1, b(0, 0)); - ASSERT_DOUBLE_EQ(1, b(0, 1)); - ASSERT_DOUBLE_EQ(1, b(0, 2)); - ASSERT_DOUBLE_EQ(0, b(1, 0)); - ASSERT_DOUBLE_EQ(-0.5, b(1, 1)); - ASSERT_DOUBLE_EQ(0.5, b(1, 2)); - ASSERT_DOUBLE_EQ(1, b(2, 0)); - ASSERT_DOUBLE_EQ(0, b(2, 1)); - ASSERT_DOUBLE_EQ(-1, b(2, 2)); -} - - -TEST(Matrix, Inverse4) -{ - OrthancStone::Matrix a, b; - a.resize(4, 4); - a(0, 0) = 2; - a(0, 1) = 1; - a(0, 2) = 2; - a(0, 3) = -3; - a(1, 0) = -2; - a(1, 1) = 2; - a(1, 2) = -1; - a(1, 3) = -1; - a(2, 0) = 2; - a(2, 1) = 2; - a(2, 2) = -3; - a(2, 3) = -1; - a(3, 0) = 3; - a(3, 1) = -2; - a(3, 2) = -3; - a(3, 3) = -1; - - OrthancStone::LinearAlgebra::InvertMatrix(b, a); - ASSERT_EQ(4u, b.size1()); - ASSERT_EQ(4u, b.size2()); - - b *= 134.0; // This is the determinant - - ASSERT_DOUBLE_EQ(8, b(0, 0)); - ASSERT_DOUBLE_EQ(-44, b(0, 1)); - ASSERT_DOUBLE_EQ(30, b(0, 2)); - ASSERT_DOUBLE_EQ(-10, b(0, 3)); - ASSERT_DOUBLE_EQ(2, b(1, 0)); - ASSERT_DOUBLE_EQ(-11, b(1, 1)); - ASSERT_DOUBLE_EQ(41, b(1, 2)); - ASSERT_DOUBLE_EQ(-36, b(1, 3)); - ASSERT_DOUBLE_EQ(16, b(2, 0)); - ASSERT_DOUBLE_EQ(-21, b(2, 1)); - ASSERT_DOUBLE_EQ(-7, b(2, 2)); - ASSERT_DOUBLE_EQ(-20, b(2, 3)); - ASSERT_DOUBLE_EQ(-28, b(3, 0)); - ASSERT_DOUBLE_EQ(-47, b(3, 1)); - ASSERT_DOUBLE_EQ(29, b(3, 2)); - ASSERT_DOUBLE_EQ(-32, b(3, 3)); -} - - -TEST(FiniteProjectiveCamera, Calibration) -{ - unsigned int volumeWidth = 512; - unsigned int volumeHeight = 512; - unsigned int volumeDepth = 110; - - OrthancStone::Vector camera = OrthancStone::LinearAlgebra::CreateVector - (-1000, -5000, -static_cast(volumeDepth) * 32); - - OrthancStone::Vector principalPoint = OrthancStone::LinearAlgebra::CreateVector - (volumeWidth/2, volumeHeight/2, volumeDepth * 2); - - OrthancStone::FiniteProjectiveCamera c(camera, principalPoint, 0, 512, 512, 1, 1); - - double swapv[9] = { 1, 0, 0, - 0, -1, 512, - 0, 0, 1 }; - OrthancStone::Matrix swap; - OrthancStone::LinearAlgebra::FillMatrix(swap, 3, 3, swapv); - - OrthancStone::Matrix p = OrthancStone::LinearAlgebra::Product(swap, c.GetMatrix()); - p /= p(2,3); - - ASSERT_NEAR( 1.04437, p(0,0), 0.00001); - ASSERT_NEAR(-0.0703111, p(0,1), 0.00000001); - ASSERT_NEAR(-0.179283, p(0,2), 0.000001); - ASSERT_NEAR( 61.7431, p(0,3), 0.0001); - ASSERT_NEAR( 0.11127, p(1,0), 0.000001); - ASSERT_NEAR(-0.595541, p(1,1), 0.000001); - ASSERT_NEAR( 0.872211, p(1,2), 0.000001); - ASSERT_NEAR( 203.748, p(1,3), 0.001); - ASSERT_NEAR( 3.08593e-05, p(2,0), 0.0000000001); - ASSERT_NEAR( 0.000129138, p(2,1), 0.000000001); - ASSERT_NEAR( 9.18901e-05, p(2,2), 0.0000000001); - ASSERT_NEAR( 1, p(2,3), 0.0000001); -} - - -static bool IsEqualRotationVector(OrthancStone::Vector a, - OrthancStone::Vector b) -{ - if (a.size() != b.size() || - a.size() != 3) - { - return false; - } - else - { - OrthancStone::LinearAlgebra::NormalizeVector(a); - OrthancStone::LinearAlgebra::NormalizeVector(b); - return OrthancStone::LinearAlgebra::IsCloseToZero(boost::numeric::ublas::norm_2(a - b)); - } -} - - -TEST(GeometryToolbox, AlignVectorsWithRotation) -{ - OrthancStone::Vector a, b; - OrthancStone::Matrix r; - - OrthancStone::LinearAlgebra::AssignVector(a, -200, 200, -846.63); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); - ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); - - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, b, a); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); - ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, b), a)); - - OrthancStone::LinearAlgebra::AssignVector(a, 1, 0, 0); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); - ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); - - OrthancStone::LinearAlgebra::AssignVector(a, 0, 1, 0); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); - ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); - - OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, 1); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); - ASSERT_TRUE(OrthancStone::LinearAlgebra::IsRotationMatrix(r)); - ASSERT_TRUE(IsEqualRotationVector(OrthancStone::LinearAlgebra::Product(r, a), b)); - - OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, 0); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - ASSERT_THROW(OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b), Orthanc::OrthancException); - - // TODO: Deal with opposite vectors - - /* - OrthancStone::LinearAlgebra::AssignVector(a, 0, 0, -1); - OrthancStone::LinearAlgebra::AssignVector(b, 0, 0, 1); - OrthancStone::GeometryToolbox::AlignVectorsWithRotation(r, a, b); - OrthancStone::LinearAlgebra::Print(r); - OrthancStone::LinearAlgebra::Print(boost::numeric::ublas::prod(r, a)); - */ -} - - -static bool IsEqualVectorL1(OrthancStone::Vector a, - OrthancStone::Vector b) -{ - if (a.size() != b.size()) - { - return false; - } - else - { - for (size_t i = 0; i < a.size(); i++) - { - if (!OrthancStone::LinearAlgebra::IsNear(a[i], b[i], 0.0001)) - { - return false; - } - } - - return true; - } -} - - -TEST(VolumeImageGeometry, Basic) -{ - using namespace OrthancStone; - - VolumeImageGeometry g; - g.SetSizeInVoxels(10, 20, 30); - g.SetVoxelDimensions(1, 2, 3); - - Vector p = g.GetCoordinates(0, 0, 0); - ASSERT_EQ(3u, p.size()); - ASSERT_DOUBLE_EQ(-1.0 / 2.0, p[0]); - ASSERT_DOUBLE_EQ(-2.0 / 2.0, p[1]); - ASSERT_DOUBLE_EQ(-3.0 / 2.0, p[2]); - - p = g.GetCoordinates(1, 1, 1); - ASSERT_DOUBLE_EQ(-1.0 / 2.0 + 10.0 * 1.0, p[0]); - ASSERT_DOUBLE_EQ(-2.0 / 2.0 + 20.0 * 2.0, p[1]); - ASSERT_DOUBLE_EQ(-3.0 / 2.0 + 30.0 * 3.0, p[2]); - - VolumeProjection proj; - ASSERT_TRUE(g.DetectProjection(proj, g.GetAxialGeometry().GetNormal())); - ASSERT_EQ(VolumeProjection_Axial, proj); - ASSERT_TRUE(g.DetectProjection(proj, g.GetCoronalGeometry().GetNormal())); - ASSERT_EQ(VolumeProjection_Coronal, proj); - ASSERT_TRUE(g.DetectProjection(proj, g.GetSagittalGeometry().GetNormal())); - ASSERT_EQ(VolumeProjection_Sagittal, proj); - - ASSERT_EQ(10u, g.GetProjectionWidth(VolumeProjection_Axial)); - ASSERT_EQ(20u, g.GetProjectionHeight(VolumeProjection_Axial)); - ASSERT_EQ(30u, g.GetProjectionDepth(VolumeProjection_Axial)); - ASSERT_EQ(10u, g.GetProjectionWidth(VolumeProjection_Coronal)); - ASSERT_EQ(30u, g.GetProjectionHeight(VolumeProjection_Coronal)); - ASSERT_EQ(20u, g.GetProjectionDepth(VolumeProjection_Coronal)); - ASSERT_EQ(20u, g.GetProjectionWidth(VolumeProjection_Sagittal)); - ASSERT_EQ(30u, g.GetProjectionHeight(VolumeProjection_Sagittal)); - ASSERT_EQ(10u, g.GetProjectionDepth(VolumeProjection_Sagittal)); - - p = g.GetVoxelDimensions(VolumeProjection_Axial); - ASSERT_EQ(3u, p.size()); - ASSERT_DOUBLE_EQ(1, p[0]); - ASSERT_DOUBLE_EQ(2, p[1]); - ASSERT_DOUBLE_EQ(3, p[2]); - p = g.GetVoxelDimensions(VolumeProjection_Coronal); - ASSERT_EQ(3u, p.size()); - ASSERT_DOUBLE_EQ(1, p[0]); - ASSERT_DOUBLE_EQ(3, p[1]); - ASSERT_DOUBLE_EQ(2, p[2]); - p = g.GetVoxelDimensions(VolumeProjection_Sagittal); - ASSERT_EQ(3u, p.size()); - ASSERT_DOUBLE_EQ(2, p[0]); - ASSERT_DOUBLE_EQ(3, p[1]); - ASSERT_DOUBLE_EQ(1, p[2]); - - // Loop over all the voxels of the volume - for (unsigned int z = 0; z < g.GetDepth(); z++) - { - const float zz = (0.5f + static_cast(z)) / static_cast(g.GetDepth()); // Z-center of the voxel - - for (unsigned int y = 0; y < g.GetHeight(); y++) - { - const float yy = (0.5f + static_cast(y)) / static_cast(g.GetHeight()); // Y-center of the voxel - - for (unsigned int x = 0; x < g.GetWidth(); x++) - { - const float xx = (0.5f + static_cast(x)) / static_cast(g.GetWidth()); // X-center of the voxel - - const float sx = 1.0f; - const float sy = 2.0f; - const float sz = 3.0f; - - Vector p = g.GetCoordinates(xx, yy, zz); - - Vector q = (g.GetAxialGeometry().MapSliceToWorldCoordinates( - static_cast(x) * sx, - static_cast(y) * sy) + - z * sz * g.GetAxialGeometry().GetNormal()); - ASSERT_TRUE(IsEqualVectorL1(p, q)); - - q = (g.GetCoronalGeometry().MapSliceToWorldCoordinates( - static_cast(x) * sx, - static_cast(g.GetDepth() - 1 - z) * sz) + - y * sy * g.GetCoronalGeometry().GetNormal()); - ASSERT_TRUE(IsEqualVectorL1(p, q)); - - /** - * WARNING: In sagittal geometry, the normal points to - * REDUCING X-axis in the 3D world. This is necessary to keep - * the right-hand coordinate system. Hence the "-". - **/ - q = (g.GetSagittalGeometry().MapSliceToWorldCoordinates( - static_cast(y) * sy, - static_cast(g.GetDepth() - 1 - z) * sz) + - x * sx * (-g.GetSagittalGeometry().GetNormal())); - ASSERT_TRUE(IsEqualVectorL1(p, q)); - } - } - } - - ASSERT_EQ(0, (int) VolumeProjection_Axial); - ASSERT_EQ(1, (int) VolumeProjection_Coronal); - ASSERT_EQ(2, (int) VolumeProjection_Sagittal); - - for (int p = 0; p < 3; p++) - { - VolumeProjection projection = (VolumeProjection) p; - const CoordinateSystem3D& s = g.GetProjectionGeometry(projection); - - ASSERT_THROW(g.GetProjectionSlice(projection, g.GetProjectionDepth(projection)), Orthanc::OrthancException); - - for (unsigned int i = 0; i < g.GetProjectionDepth(projection); i++) - { - CoordinateSystem3D plane = g.GetProjectionSlice(projection, i); - - if (projection == VolumeProjection_Sagittal) - { - ASSERT_TRUE(IsEqualVectorL1(plane.GetOrigin(), s.GetOrigin() + static_cast(i) * - (-s.GetNormal()) * g.GetVoxelDimensions(projection)[2])); - } - else - { - ASSERT_TRUE(IsEqualVectorL1(plane.GetOrigin(), s.GetOrigin() + static_cast(i) * - s.GetNormal() * g.GetVoxelDimensions(projection)[2])); - } - - ASSERT_TRUE(IsEqualVectorL1(plane.GetAxisX(), s.GetAxisX())); - ASSERT_TRUE(IsEqualVectorL1(plane.GetAxisY(), s.GetAxisY())); - - unsigned int slice; - VolumeProjection q; - ASSERT_TRUE(g.DetectSlice(q, slice, plane)); - ASSERT_EQ(projection, q); - ASSERT_EQ(i, slice); - } - } -} - - -TEST(LinearAlgebra, ParseVectorLocale) -{ - OrthancStone::Vector v; - - ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "1.2")); - ASSERT_EQ(1u, v.size()); - ASSERT_DOUBLE_EQ(1.2, v[0]); - - ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "-1.2e+2")); - ASSERT_EQ(1u, v.size()); - ASSERT_DOUBLE_EQ(-120.0, v[0]); - - ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "-1e-2\\2")); - ASSERT_EQ(2u, v.size()); - ASSERT_DOUBLE_EQ(-0.01, v[0]); - ASSERT_DOUBLE_EQ(2.0, v[1]); - - ASSERT_TRUE(OrthancStone::LinearAlgebra::ParseVector(v, "1.3671875\\1.3671875")); - ASSERT_EQ(2u, v.size()); - ASSERT_DOUBLE_EQ(1.3671875, v[0]); - ASSERT_DOUBLE_EQ(1.3671875, v[1]); -} - -TEST(LoaderCache, NormalizeUuid) -{ - std::string ref("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); - - { - std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space left - { - std::string u(" 44ca5051-14ef-4d2f-8bd7-db20bfb61fbb"); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space right - { - std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fbb "); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space l & r - { - std::string u(" 44ca5051-14ef-4d2f-8bd7-db20bfb61fbb "); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space left + case - { - std::string u(" 44CA5051-14ef-4d2f-8bd7-dB20bfb61fbb"); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space right + case - { - std::string u("44ca5051-14EF-4D2f-8bd7-db20bfb61fbB "); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // space l & r + case - { - std::string u(" 44cA5051-14Ef-4d2f-8bD7-db20bfb61fbb "); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_EQ(ref, u); - } - - // no - { - std::string u(" 44ca5051-14ef-4d2f-8bd7- db20bfb61fbb"); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_NE(ref, u); - } - - // no - { - std::string u("44ca5051-14ef-4d2f-8bd7-db20bfb61fb"); - OrthancStone::LoaderCache::NormalizeUuid(u); - ASSERT_NE(ref, u); - } -} - - -int main(int argc, char **argv) -{ - Orthanc::Logging::Initialize(); - Orthanc::Logging::EnableInfoLevel(true); - - ::testing::InitGoogleTest(&argc, argv); - int result = RUN_ALL_TESTS(); - - Orthanc::Logging::Finalize(); - - return result; -}